1
0
mirror of https://github.com/arsenetar/dupeguru.git synced 2026-01-24 23:51:38 +00:00

Compare commits

..

45 Commits

Author SHA1 Message Date
Virgil Dupras
526bcf2566 pe v2.2.1 2011-06-15 14:20:34 -04:00
Virgil Dupras
56207f4dbb [#161 state:fixed] Fixed folder sorting. 2011-06-15 11:58:33 -04:00
Virgil Dupras
cd9fd3a10b [#162 state:fixed] Apply the 'Match scaled pictures' option to exif timestamp scan type. 2011-06-15 10:13:03 -04:00
Virgil Dupras
4399fe9d17 Fixed a bug where corrupt exif tags would make the analysis process stall. 2011-06-14 15:05:33 -04:00
Virgil Dupras
2a6f524a5b [#159 state:fixed] Added 'orf' to the list of supported extensions under cocoa (they work fine, I tried em). 2011-06-14 13:54:50 -04:00
Virgil Dupras
caee5e37f0 [#164 state:fixed] When I added the scan type combobox in pe's pref panel under cocoa, I forgot the little label next to the hardness slider, so it ended up under the newly added combobox. fixed it. 2011-06-14 13:44:59 -04:00
Virgil Dupras
bbd9d68dfd Added a --loc option to the build script for times when you only want to refresh localizations. 2011-06-14 13:43:29 -04:00
Virgil Dupras
16b1b00906 Added tag pe2.2.0 for changeset e44d5127ed60 2011-06-02 14:21:49 -04:00
Virgil Dupras
7183408535 Oops, fixed release date in changelog. 2011-06-02 10:53:02 -04:00
Virgil Dupras
591b4c7c6a pe v2.2.0 2011-06-02 10:32:48 -04:00
Virgil Dupras
8b1170a82b When an exif tag can't be read, log the event as 'info' rather than 'warning'. We don't want to fill the user's console with these messages, which will be very common. 2011-06-02 10:14:08 -04:00
Virgil Dupras
1f26fbeacc [#154 state:fixed] Added exif orientation support. 2011-05-31 10:05:12 -04:00
Virgil Dupras
cc7ccff48e [#154] Created the cross-platform unit core_pe.photo in prep for rotation support. 2011-05-29 10:18:03 -04:00
Virgil Dupras
a0809333c1 [#157 state:fixed] Straightened up extension glitches during result load/save under Qt 2011-05-29 09:12:24 -04:00
Virgil Dupras
8975f78a5f updated jobprogress version in README 2011-05-29 08:51:19 -04:00
Virgil Dupras
56bc1c1373 Added gotchas section to README 2011-05-28 16:44:23 -04:00
Virgil Dupras
417233a47f [#155 state:fixed] Added dg edition name in results window. 2011-04-22 11:37:53 +02:00
Virgil Dupras
59eaf5305a [#156 state:fixed] Fixed a visual glitch in Cocoa's result window colors when a row is selected. 2011-04-22 11:07:54 +02:00
Virgil Dupras
275c6be108 Added the EXIF Timestamp scan type in dgpe.
--HG--
rename : core_pe/matchbase.py => core_pe/matchblock.py
2011-04-21 17:17:19 +02:00
Virgil Dupras
a0e2b11663 Added core_pe.exif to read exif data from pictures 2011-04-20 15:19:12 +02:00
Virgil Dupras
de23ce90d8 Deduplicated scan type combobox creation code between SE and ME (soon to be shared by PE) (Qt). 2011-04-20 15:18:21 +02:00
Virgil Dupras
9d5f3029d0 Added tag se3.1.0 for changeset 97893f37d7d0 2011-04-16 15:48:50 +02:00
Virgil Dupras
33ee220933 Updated cocoalib subrepo. 2011-04-16 15:15:59 +02:00
Virgil Dupras
23d36b58c8 UI tweaks for linux. 2011-04-16 04:06:08 -07:00
Virgil Dupras
39b895f01b UI tweaks for windows. 2011-04-16 11:46:24 +01:00
Virgil Dupras
5f4252cddc Updated a couple of remaning copyright years (in about boxes) from 2010 to 2011. 2011-04-16 03:27:10 -07:00
Virgil Dupras
fc54a1ea39 se v3.1.0 2011-04-16 12:20:46 +02:00
Virgil Dupras
285f338dce Added an option to register the contributor's OS on openhs when registering an app. 2011-04-15 14:42:14 +02:00
Virgil Dupras
379e420577 Fixed exclusion bug during folders scan. 2011-04-14 15:37:12 +02:00
Virgil Dupras
0b20b35ffb Fixed copying operations for folders which didn't work. 2011-04-14 12:55:50 +02:00
Virgil Dupras
d887cd118c Update cocoalib subrepo. 2011-04-14 11:51:29 +02:00
Virgil Dupras
54ffcfab79 [#149 state:fixed] Fixed crash on result saving. 2011-04-13 16:59:02 +02:00
Virgil Dupras
f28ffc680a [#140 state:fixed] Fixed a crash on dupe renaming. 2011-04-13 16:23:22 +02:00
Virgil Dupras
f33f30eabf Merged heads 2011-04-12 13:29:27 +02:00
Virgil Dupras
279d44b7f3 [#89 state:fixed] Added a Folders scan type in dgse.
--HG--
rename : core_se/tests/fs_test.py => core/tests/fs_test.py
2011-04-12 13:22:29 +02:00
Virgil Dupras
0fea59007c Updated copyright year to 2011. 2011-04-12 10:04:01 +02:00
Virgil Dupras
54720b15ca Added tkinter to cx_freeze explicit excludes because v4.2.3 started to falsely include it. 2011-03-20 11:28:53 +00:00
Virgil Dupras
39fc7a91d7 me v6.0.1 2011-03-18 09:11:11 +01:00
Virgil Dupras
7f9c322d48 Added tag se3.0.2 for changeset 77e169f75719 2011-03-16 15:30:07 +01:00
Virgil Dupras
b2ff02c773 Added missing entry in 3.0.2 changelog. 2011-03-16 14:38:17 +01:00
Virgil Dupras
2c242aedfd se v3.0.2 2011-03-16 14:36:46 +01:00
Virgil Dupras
70e4e6f5af Depend specifically on python 3.1 in deb packages instead of depending on python3 because PyQt modules are not binary compatiable with python 3.2 2011-03-16 04:07:22 -07:00
Virgil Dupras
ebeb068042 Removed an old workaround in the Qt version that doesn't seem to be needed with the current version of Qt. 2011-03-16 08:41:29 +00:00
Virgil Dupras
731e68f164 [#153 state:fixed] Fixed a refresh bug in directory panel. 2011-03-16 09:31:16 +01:00
Virgil Dupras
fa0c3aeb78 Added tag pe2.1.0 for changeset d274bcb98f2d 2011-03-07 15:59:13 +01:00
172 changed files with 1900 additions and 580 deletions

View File

@@ -45,3 +45,7 @@ ca93352ce35184853ad9fcb881935a43a8b1e249 me5.10.3
f1d40b556c01f32c58f9ef9f9acac5b78e01ba7a pe2.0.0
2fd901a516f8cb6b4438491f63f2ebfd52a57c13 me6.0.0
ff43c6d9feb388f103b7857eaa6f7809185f78ec before-pluginbuilder
d274bcb98f2d02b86470a04cd62e718eff33b74f pe2.1.0
77e169f757195c11e9c1c5febeb2db8eb3589510 se3.0.2
97893f37d7d0767b5aedf1b4b40de57ee36d426b se3.1.0
e44d5127ed605daa7a17a01eee65d0a157de20c0 pe2.2.0

View File

@@ -1,4 +1,4 @@
Copyright 2010 Hardcoded Software Inc. (http://www.hardcoded.net)
Copyright 2011 Hardcoded Software Inc. (http://www.hardcoded.net)
All rights reserved.
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

41
README
View File

@@ -29,7 +29,7 @@ General dependencies
- Python 3.1 (3.2 on Mac OS X) (http://www.python.org)
- Send2Trash3k (http://hg.hardcoded.net/send2trash)
- hsaudiotag3k 1.1.0 (for ME) (http://hg.hardcoded.net/hsaudiotag)
- jobprogress (http://hg.hardcoded.net/jobprogress)
- jobprogress 1.0.1 (http://hg.hardcoded.net/jobprogress)
- Sphinx 1.0.6 (http://sphinx.pocoo.org/)
- pytest 2.0.0, to run unit tests. (http://pytest.org/)
@@ -54,6 +54,45 @@ Windows prerequisites
- cx_Freeze, if you want to build a exe. You don't need it if you just want to run dupeGuru. (http://cx-freeze.sourceforge.net/)
- Advanced Installer, if you want to build the installer file. (http://www.advancedinstaller.com/)
Linux prerequisites
-------------------
- PyQt 4.7.5 (http://www.riverbankcomputing.co.uk/news)
Prerequisite gotchas
--------------------
Correctly installing the prerequisites is tricky. Make sure you have at least the version number
required for each prerequisite.
If you didn't use mercurial to download this source, you probably have an incomplete source folder!
External projects (hscommon, qtlib, cocoalib) need to be at the root of the dupeGuru project folder.
You'll have to download those separately. Or use mercurial, it's much easier.
As far as I can tell, you don't *have* to compile/install everything manually and you can normally
use `easy_install` to install python dependencies. However, be aware that compiling/installing
manually from the repositories of each project is what I personally do, so if you hit a snag
somewhere, you might want to try the manual way.
PyObjC's website is badly outdated. Also, as far as I can tell, the package installable with
`easy_install` has good chances of not working. Your best bet is to download the latest tagged
version from the repository and compile it from source.
Also, on OS X, don't try to use the built-in python 2.x to install Sphinx on (the only pre-requisite
that doesn't run on python 3 yet). There's some weird error popping up when dupeGuru tries to build
its help file. Install your own framework version of python 2.7, and then install Sphinx on that.
When Sphinx supports Python 3, things will be easier because you'll be able to install sphinx on the
same Python version you build dupeGuru with.
Another one on OS X: I wouldn't use macports/fink/whatever. Whenever I tried using those, I always
ended up with problems.
Also, I don't know yet if it's possible to compile dupeGuru with XCode 4, I haven't tried it yet.
It's safer to use XCode 3.x. However, I don't see why it wouldn't work, so it very well might work.
Whenever you have a problem, always double-check that you're running the correct python version.
You'll probably have to tweak your $PATH.
Building dupeGuru
=================

View File

@@ -1,6 +1,6 @@
# Created By: Virgil Dupras
# Created On: 2009-12-30
# Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
# Copyright 2011 Hardcoded Software (http://www.hardcoded.net)
#
# This software is licensed under the "BSD" License as described in the "LICENSE" file,
# which should be included with this package. The terms are also available at
@@ -24,17 +24,15 @@ def parse_args():
parser = OptionParser(usage=usage)
parser.add_option('--clean', action='store_true', dest='clean',
help="Clean build folder before building")
parser.add_option('--only-help', action='store_true', dest='only_help',
help="Build only help file")
parser.add_option('--doc', action='store_true', dest='doc',
help="Build only the help file")
parser.add_option('--loc', action='store_true', dest='loc',
help="Build only localization")
(options, args) = parser.parse_args()
return options
def build_cocoa(edition, dev):
from pluginbuilder import build_plugin
build_all_cocoa_locs('cocoalib')
build_all_cocoa_locs(op.join('cocoa', 'base'))
build_all_cocoa_locs(op.join('cocoa', edition))
print("Building dg_cocoa.plugin")
if not dev:
specific_packages = {
@@ -83,8 +81,6 @@ def build_cocoa(edition, dev):
open('run.py', 'wt').write(run_contents)
def build_qt(edition, dev):
print("Building .ts files")
build_all_qt_locs(op.join('qt', 'lang'), extradirs=[op.join('qtlib', 'lang')])
print("Building Qt stuff")
print_and_do("pyrcc4 -py3 {0} > {1}".format(op.join('qt', 'base', 'dg.qrc'), op.join('qt', 'base', 'dg_rc.py')))
print("Creating the run.py file")
@@ -104,6 +100,16 @@ def build_help(edition):
confrepl = {'edition': edition, 'appname': appname, 'homepage': homepage}
sphinxgen.gen(help_basepath, help_destpath, changelog_path, tixurl, confrepl)
def build_localizations(ui, edition):
print("Building localizations")
if ui == 'cocoa':
build_all_cocoa_locs('cocoalib')
build_all_cocoa_locs(op.join('cocoa', 'base'))
build_all_cocoa_locs(op.join('cocoa', edition))
elif ui == 'qt':
print("Building .ts files")
build_all_qt_locs(op.join('qt', 'lang'), extradirs=[op.join('qtlib', 'lang')])
def build_pe_modules(ui):
def move(src, dst):
if not op.exists(src):
@@ -144,6 +150,7 @@ def build_normal(edition, ui, dev):
print("Building dupeGuru {0} with UI {1}".format(edition.upper(), ui))
add_to_pythonpath('.')
build_help(edition)
build_localizations(ui, edition)
print("Building dupeGuru")
if edition == 'pe':
build_pe_modules(ui)
@@ -165,8 +172,10 @@ def main():
shutil.rmtree('build')
if not op.exists('build'):
os.mkdir('build')
if options.only_help:
if options.doc:
build_help(edition)
elif options.loc:
build_localizations(ui, edition)
else:
build_normal(edition, ui, dev)

View File

@@ -1,5 +1,5 @@
/*
Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
Copyright 2011 Hardcoded Software (http://www.hardcoded.net)
This software is licensed under the "BSD" License as described in the "LICENSE" file,
which should be included with this package. The terms are also available at

View File

@@ -1,5 +1,5 @@
/*
Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
Copyright 2011 Hardcoded Software (http://www.hardcoded.net)
This software is licensed under the "BSD" License as described in the "LICENSE" file,
which should be included with this package. The terms are also available at

View File

@@ -1,5 +1,5 @@
/*
Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
Copyright 2011 Hardcoded Software (http://www.hardcoded.net)
This software is licensed under the "BSD" License as described in the "LICENSE" file,
which should be included with this package. The terms are also available at

View File

@@ -1,5 +1,5 @@
/*
Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
Copyright 2011 Hardcoded Software (http://www.hardcoded.net)
This software is licensed under the "BSD" License as described in the "LICENSE" file,
which should be included with this package. The terms are also available at

View File

@@ -1,5 +1,5 @@
/*
Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
Copyright 2011 Hardcoded Software (http://www.hardcoded.net)
This software is licensed under the "BSD" License as described in the "LICENSE" file,
which should be included with this package. The terms are also available at

View File

@@ -1,5 +1,5 @@
/*
Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
Copyright 2011 Hardcoded Software (http://www.hardcoded.net)
This software is licensed under the "BSD" License as described in the "LICENSE" file,
which should be included with this package. The terms are also available at

View File

@@ -1,5 +1,5 @@
/*
Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
Copyright 2011 Hardcoded Software (http://www.hardcoded.net)
This software is licensed under the "BSD" License as described in the "LICENSE" file,
which should be included with this package. The terms are also available at

View File

@@ -1,5 +1,5 @@
/*
Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
Copyright 2011 Hardcoded Software (http://www.hardcoded.net)
This software is licensed under the "BSD" License as described in the "LICENSE" file,
which should be included with this package. The terms are also available at

View File

@@ -1,5 +1,5 @@
/*
Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
Copyright 2011 Hardcoded Software (http://www.hardcoded.net)
This software is licensed under the "BSD" License as described in the "LICENSE" file,
which should be included with this package. The terms are also available at
@@ -19,6 +19,7 @@ http://www.hardcoded.net/licenses/bsd_license
[self window];
_app = aParentApp;
_py = [_app py];
[[self window] setTitle:[_py appName]];
_alwaysShowPopUp = NO;
[self fillPopUpMenu];
_recentDirectories = [[HSRecentFiles alloc] initWithName:@"recentDirectories" menu:[addButtonPopUp menu]];

View File

@@ -1,5 +1,5 @@
/*
Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
Copyright 2011 Hardcoded Software (http://www.hardcoded.net)
This software is licensed under the "BSD" License as described in the "LICENSE" file,
which should be included with this package. The terms are also available at

View File

@@ -1,5 +1,5 @@
/*
Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
Copyright 2011 Hardcoded Software (http://www.hardcoded.net)
This software is licensed under the "BSD" License as described in the "LICENSE" file,
which should be included with this package. The terms are also available at

View File

@@ -1,5 +1,5 @@
/*
Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
Copyright 2011 Hardcoded Software (http://www.hardcoded.net)
This software is licensed under the "BSD" License as described in the "LICENSE" file,
which should be included with this package. The terms are also available at

View File

@@ -1,5 +1,5 @@
/*
Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
Copyright 2011 Hardcoded Software (http://www.hardcoded.net)
This software is licensed under the "BSD" License as described in the "LICENSE" file,
which should be included with this package. The terms are also available at

View File

@@ -1,5 +1,5 @@
/*
Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
Copyright 2011 Hardcoded Software (http://www.hardcoded.net)
This software is licensed under the "BSD" License as described in the "LICENSE" file,
which should be included with this package. The terms are also available at

View File

@@ -1,5 +1,5 @@
/*
Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
Copyright 2011 Hardcoded Software (http://www.hardcoded.net)
This software is licensed under the "BSD" License as described in the "LICENSE" file,
which should be included with this package. The terms are also available at

View File

@@ -1,5 +1,5 @@
/*
Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
Copyright 2011 Hardcoded Software (http://www.hardcoded.net)
This software is licensed under the "BSD" License as described in the "LICENSE" file,
which should be included with this package. The terms are also available at
@@ -48,6 +48,7 @@ http://www.hardcoded.net/licenses/bsd_license
- (NSArray *)deltaColumns;
//Scanning options
- (void)setScanType:(NSNumber *)scan_type;
- (void)setMinMatchPercentage:(NSNumber *)percentage;
- (void)setMixFileKind:(BOOL)mix_file_kind;
- (void)setEscapeFilterRegexp:(BOOL)escape_filter_regexp;

View File

@@ -1,5 +1,5 @@
/*
Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
Copyright 2011 Hardcoded Software (http://www.hardcoded.net)
This software is licensed under the "BSD" License as described in the "LICENSE" file,
which should be included with this package. The terms are also available at

View File

@@ -1,5 +1,5 @@
/*
Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
Copyright 2011 Hardcoded Software (http://www.hardcoded.net)
This software is licensed under the "BSD" License as described in the "LICENSE" file,
which should be included with this package. The terms are also available at

View File

@@ -1,5 +1,5 @@
/*
Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
Copyright 2011 Hardcoded Software (http://www.hardcoded.net)
This software is licensed under the "BSD" License as described in the "LICENSE" file,
which should be included with this package. The terms are also available at

View File

@@ -1,5 +1,5 @@
/*
Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
Copyright 2011 Hardcoded Software (http://www.hardcoded.net)
This software is licensed under the "BSD" License as described in the "LICENSE" file,
which should be included with this package. The terms are also available at

View File

@@ -1,5 +1,5 @@
/*
Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
Copyright 2011 Hardcoded Software (http://www.hardcoded.net)
This software is licensed under the "BSD" License as described in the "LICENSE" file,
which should be included with this package. The terms are also available at

View File

@@ -1,5 +1,5 @@
/*
Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
Copyright 2011 Hardcoded Software (http://www.hardcoded.net)
This software is licensed under the "BSD" License as described in the "LICENSE" file,
which should be included with this package. The terms are also available at
@@ -117,7 +117,8 @@ http://www.hardcoded.net/licenses/bsd_license
}
- (void)tableView:(NSTableView *)aTableView willDisplayCell:(id)cell forTableColumn:(NSTableColumn *)column row:(NSInteger)row
{
{
BOOL isSelected = [tableView isRowSelected:row];
BOOL isMarkable = n2b([[self py] valueForColumn:@"markable" row:row]);
if ([[column identifier] isEqual:@"marked"]) {
[cell setEnabled:isMarkable];
@@ -126,20 +127,22 @@ http://www.hardcoded.net/licenses/bsd_license
[cell setImagePosition:pos];
}
if ([cell isKindOfClass:[NSTextFieldCell class]]) {
// Determine if the text color will be blue due to directory being reference.
NSTextFieldCell *textCell = cell;
if (isMarkable) {
[textCell setTextColor:[NSColor blackColor]];
NSColor *color = [NSColor textColor];
if (isSelected) {
color = [NSColor selectedTextColor];
}
else if (isMarkable) {
if ([self deltaValuesMode]) {
NSInteger i = [[column identifier] integerValue];
if ([_deltaColumns containsIndex:i]) {
[textCell setTextColor:[NSColor orangeColor]];
color = [NSColor orangeColor];
}
}
}
else {
[textCell setTextColor:[NSColor blueColor]];
color = [NSColor blueColor];
}
[(NSTextFieldCell *)cell setTextColor:color];
}
}

View File

@@ -1,5 +1,5 @@
/*
Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
Copyright 2011 Hardcoded Software (http://www.hardcoded.net)
This software is licensed under the "BSD" License as described in the "LICENSE" file,
which should be included with this package. The terms are also available at

View File

@@ -1,5 +1,5 @@
/*
Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
Copyright 2011 Hardcoded Software (http://www.hardcoded.net)
This software is licensed under the "BSD" License as described in the "LICENSE" file,
which should be included with this package. The terms are also available at
@@ -19,6 +19,7 @@ http://www.hardcoded.net/licenses/bsd_license
self = [super initWithWindowNibName:@"ResultWindow"];
app = aApp;
py = [app py];
[[self window] setTitle:fmt(@"%@ Results", [py appName])];
columnsMenu = [app columnsMenu];
/* Put a cute iTunes-like bottom bar */
[[self window] setContentBorderThickness:28 forEdge:NSMinYEdge];

View File

@@ -1,5 +1,5 @@
/*
Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
Copyright 2011 Hardcoded Software (http://www.hardcoded.net)
This software is licensed under the "BSD" License as described in the "LICENSE" file,
which should be included with this package. The terms are also available at

View File

@@ -1,5 +1,5 @@
/*
Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
Copyright 2011 Hardcoded Software (http://www.hardcoded.net)
This software is licensed under the "BSD" License as described in the "LICENSE" file,
which should be included with this package. The terms are also available at

View File

@@ -1,5 +1,5 @@
/*
Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
Copyright 2011 Hardcoded Software (http://www.hardcoded.net)
This software is licensed under the "BSD" License as described in the "LICENSE" file,
which should be included with this package. The terms are also available at

View File

@@ -1,5 +1,5 @@
/*
Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
Copyright 2011 Hardcoded Software (http://www.hardcoded.net)
This software is licensed under the "BSD" License as described in the "LICENSE" file,
which should be included with this package. The terms are also available at

View File

@@ -1,5 +1,5 @@
/*
Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
Copyright 2011 Hardcoded Software (http://www.hardcoded.net)
This software is licensed under the "BSD" License as described in the "LICENSE" file,
which should be included with this package. The terms are also available at

View File

@@ -1,5 +1,5 @@
/*
Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
Copyright 2011 Hardcoded Software (http://www.hardcoded.net)
This software is licensed under the "BSD" License as described in the "LICENSE" file,
which should be included with this package. The terms are also available at

View File

@@ -1,5 +1,5 @@
/*
Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
Copyright 2011 Hardcoded Software (http://www.hardcoded.net)
This software is licensed under the "BSD" License as described in the "LICENSE" file,
which should be included with this package. The terms are also available at
@@ -13,7 +13,6 @@ http://www.hardcoded.net/licenses/bsd_license
- (id)initWithParentApp:(id)aParentApp
{
self = [super initWithParentApp:aParentApp];
[[self window] setTitle:@"dupeGuru Music Edition"];
_alwaysShowPopUp = YES;
return self;
}

View File

@@ -29,7 +29,7 @@
<key>NSPrincipalClass</key>
<string>NSApplication</string>
<key>NSHumanReadableCopyright</key>
<string>© Hardcoded Software, 2010</string>
<string>© Hardcoded Software, 2011</string>
<key>SUFeedURL</key>
<string>http://www.hardcoded.net/updates/dupeguru_me.appcast</string>
<key>SUPublicDSAKeyFile</key>

View File

@@ -1,5 +1,5 @@
/*
Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
Copyright 2011 Hardcoded Software (http://www.hardcoded.net)
This software is licensed under the "BSD" License as described in the "LICENSE" file,
which should be included with this package. The terms are also available at
@@ -11,7 +11,6 @@ http://www.hardcoded.net/licenses/bsd_license
@interface PyDupeGuru : PyDupeGuruBase
//Scanning options
- (void)setScanType:(NSNumber *)scan_type;
- (void)setMinWordCount:(NSNumber *)word_count;
- (void)setMinWordLength:(NSNumber *)word_length;
- (void)setWordWeighting:(NSNumber *)words_are_weighted;

View File

@@ -1,5 +1,5 @@
/*
Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
Copyright 2011 Hardcoded Software (http://www.hardcoded.net)
This software is licensed under the "BSD" License as described in the "LICENSE" file,
which should be included with this package. The terms are also available at

View File

@@ -1,5 +1,5 @@
/*
Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
Copyright 2011 Hardcoded Software (http://www.hardcoded.net)
This software is licensed under the "BSD" License as described in the "LICENSE" file,
which should be included with this package. The terms are also available at

View File

@@ -1,4 +1,4 @@
# Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
# Copyright 2011 Hardcoded Software (http://www.hardcoded.net)
#
# This software is licensed under the "BSD" License as described in the "LICENSE" file,
# which should be included with this package. The terms are also available at

View File

@@ -1,5 +1,5 @@
/*
Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
Copyright 2011 Hardcoded Software (http://www.hardcoded.net)
This software is licensed under the "BSD" License as described in the "LICENSE" file,
which should be included with this package. The terms are also available at

View File

@@ -1,5 +1,5 @@
/*
Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
Copyright 2011 Hardcoded Software (http://www.hardcoded.net)
This software is licensed under the "BSD" License as described in the "LICENSE" file,
which should be included with this package. The terms are also available at

View File

@@ -1,5 +1,5 @@
/*
Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
Copyright 2011 Hardcoded Software (http://www.hardcoded.net)
This software is licensed under the "BSD" License as described in the "LICENSE" file,
which should be included with this package. The terms are also available at
@@ -20,14 +20,15 @@ http://www.hardcoded.net/licenses/bsd_license
{
NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];
NSMutableDictionary *d = [NSMutableDictionary dictionaryWithCapacity:10];
[d setObject:[NSNumber numberWithInt:95] forKey:@"minMatchPercentage"];
[d setObject:[NSNumber numberWithInt:1] forKey:@"recreatePathType"];
[d setObject:[NSNumber numberWithBool:NO] forKey:@"matchScaled"];
[d setObject:[NSNumber numberWithBool:YES] forKey:@"mixFileKind"];
[d setObject:[NSNumber numberWithBool:NO] forKey:@"useRegexpFilter"];
[d setObject:[NSNumber numberWithBool:NO] forKey:@"ignoreHardlinkMatches"];
[d setObject:[NSNumber numberWithBool:NO] forKey:@"removeEmptyFolders"];
[d setObject:[NSNumber numberWithBool:NO] forKey:@"debug"];
[d setObject:i2n(0) forKey:@"scanType"];
[d setObject:i2n(95) forKey:@"minMatchPercentage"];
[d setObject:i2n(1) forKey:@"recreatePathType"];
[d setObject:b2n(NO) forKey:@"matchScaled"];
[d setObject:b2n(YES) forKey:@"mixFileKind"];
[d setObject:b2n(NO) forKey:@"useRegexpFilter"];
[d setObject:b2n(NO) forKey:@"ignoreHardlinkMatches"];
[d setObject:b2n(NO) forKey:@"removeEmptyFolders"];
[d setObject:b2n(NO) forKey:@"debug"];
[d setObject:[NSArray array] forKey:@"recentDirectories"];
[d setObject:[NSArray array] forKey:@"columnsOrder"];
[d setObject:[NSDictionary dictionary] forKey:@"columnsWidth"];
@@ -35,6 +36,15 @@ http://www.hardcoded.net/licenses/bsd_license
[ud registerDefaults:d];
}
- (id)init
{
self = [super init];
NSMutableIndexSet *i = [NSMutableIndexSet indexSetWithIndex:0];
VTIsIntIn *vtScanTypeIsFuzzy = [[[VTIsIntIn alloc] initWithValues:i reverse:NO] autorelease];
[NSValueTransformer setValueTransformer:vtScanTypeIsFuzzy forName:@"vtScanTypeIsFuzzy"];
return self;
}
- (NSString *)homepageURL
{
return @"http://www.hardcoded.net/dupeguru_pe/";

View File

@@ -1,5 +1,5 @@
/*
Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
Copyright 2011 Hardcoded Software (http://www.hardcoded.net)
This software is licensed under the "BSD" License as described in the "LICENSE" file,
which should be included with this package. The terms are also available at

View File

@@ -1,5 +1,5 @@
/*
Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
Copyright 2011 Hardcoded Software (http://www.hardcoded.net)
This software is licensed under the "BSD" License as described in the "LICENSE" file,
which should be included with this package. The terms are also available at

View File

@@ -1,5 +1,5 @@
/*
Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
Copyright 2011 Hardcoded Software (http://www.hardcoded.net)
This software is licensed under the "BSD" License as described in the "LICENSE" file,
which should be included with this package. The terms are also available at

View File

@@ -1,5 +1,5 @@
/*
Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
Copyright 2011 Hardcoded Software (http://www.hardcoded.net)
This software is licensed under the "BSD" License as described in the "LICENSE" file,
which should be included with this package. The terms are also available at

View File

@@ -1,5 +1,5 @@
/*
Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
Copyright 2011 Hardcoded Software (http://www.hardcoded.net)
This software is licensed under the "BSD" License as described in the "LICENSE" file,
which should be included with this package. The terms are also available at
@@ -13,7 +13,6 @@ http://www.hardcoded.net/licenses/bsd_license
- (id)initWithParentApp:(id)aParentApp
{
self = [super initWithParentApp:aParentApp];
[[self window] setTitle:@"dupeGuru Picture Edition"];
_alwaysShowPopUp = YES;
return self;
}

View File

@@ -29,7 +29,7 @@
<key>NSPrincipalClass</key>
<string>NSApplication</string>
<key>NSHumanReadableCopyright</key>
<string>© Hardcoded Software, 2010</string>
<string>© Hardcoded Software, 2011</string>
<key>SUFeedURL</key>
<string>http://www.hardcoded.net/updates/dupeguru_pe.appcast</string>
<key>SUPublicDSAKeyFile</key>

View File

@@ -1,5 +1,5 @@
/*
Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
Copyright 2011 Hardcoded Software (http://www.hardcoded.net)
This software is licensed under the "BSD" License as described in the "LICENSE" file,
which should be included with this package. The terms are also available at

View File

@@ -1,5 +1,5 @@
/*
Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
Copyright 2011 Hardcoded Software (http://www.hardcoded.net)
This software is licensed under the "BSD" License as described in the "LICENSE" file,
which should be included with this package. The terms are also available at

View File

@@ -1,5 +1,5 @@
/*
Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
Copyright 2011 Hardcoded Software (http://www.hardcoded.net)
This software is licensed under the "BSD" License as described in the "LICENSE" file,
which should be included with this package. The terms are also available at
@@ -34,6 +34,7 @@ http://www.hardcoded.net/licenses/bsd_license
{
NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];
PyDupeGuru *_py = (PyDupeGuru *)py;
[_py setScanType:[ud objectForKey:@"scanType"]];
[_py setMinMatchPercentage:[ud objectForKey:@"minMatchPercentage"]];
[_py setMixFileKind:n2b([ud objectForKey:@"mixFileKind"])];
[_py setIgnoreHardlinkMatches:n2b([ud objectForKey:@"ignoreHardlinkMatches"])];

View File

@@ -1,4 +1,4 @@
# Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
# Copyright 2011 Hardcoded Software (http://www.hardcoded.net)
#
# This software is licensed under the "BSD" License as described in the "LICENSE" file,
# which should be included with this package. The terms are also available at
@@ -9,6 +9,7 @@ install_cocoa_trans()
from core.app_cocoa_inter import PyDupeGuruBase, PyDetailsPanel
from core_pe import app_cocoa as app_pe_cocoa, __appname__
from core.scanner import ScanType
class PyDupeGuru(PyDupeGuruBase):
def init(self):
@@ -27,6 +28,15 @@ class PyDupeGuru(PyDupeGuruBase):
return str(self.py.selected_dupe_ref_path())
#---Properties
def setScanType_(self, scan_type):
try:
self.py.scanner.scan_type = [
ScanType.FuzzyBlock,
ScanType.ExifTimestamp,
][scan_type]
except IndexError:
pass
def setMatchScaled_(self,match_scaled):
self.py.scanner.match_scaled = match_scaled

View File

@@ -2,17 +2,17 @@
<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="7.10">
<data>
<int key="IBDocument.SystemTarget">1050</int>
<string key="IBDocument.SystemVersion">10J567</string>
<string key="IBDocument.InterfaceBuilderVersion">823</string>
<string key="IBDocument.SystemVersion">10J4138</string>
<string key="IBDocument.InterfaceBuilderVersion">851</string>
<string key="IBDocument.AppKitVersion">1038.35</string>
<string key="IBDocument.HIToolboxVersion">462.00</string>
<string key="IBDocument.HIToolboxVersion">461.00</string>
<object class="NSMutableDictionary" key="IBDocument.PluginVersions">
<string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="NS.object.0">823</string>
<string key="NS.object.0">851</string>
</object>
<object class="NSMutableArray" key="IBDocument.EditedObjectIDs">
<bool key="EncodedWithXMLCoder">YES</bool>
<integer value="3"/>
<integer value="63"/>
</object>
<object class="NSArray" key="IBDocument.PluginDependencies">
<bool key="EncodedWithXMLCoder">YES</bool>
@@ -34,10 +34,6 @@
<string key="NSClassName">NSApplication</string>
</object>
<object class="NSUserDefaultsController" id="455472712">
<object class="NSMutableArray" key="NSDeclaredKeys">
<bool key="EncodedWithXMLCoder">YES</bool>
<string>DebugMode</string>
</object>
<bool key="NSSharedInstance">YES</bool>
</object>
<object class="NSWindowTemplate" id="809668081">
@@ -103,7 +99,7 @@
<object class="NSSlider" id="266372855">
<reference key="NSNextResponder" ref="1073354031"/>
<int key="NSvFlags">292</int>
<string key="NSFrame">{{117, 140}, {181, 21}}</string>
<string key="NSFrame">{{117, 107}, {181, 21}}</string>
<reference key="NSSuperview" ref="1073354031"/>
<bool key="NSEnabled">YES</bool>
<object class="NSSliderCell" key="NSCell" id="453640282">
@@ -131,7 +127,7 @@
<object class="NSTextField" id="869007847">
<reference key="NSNextResponder" ref="1073354031"/>
<int key="NSvFlags">292</int>
<string key="NSFrame">{{119, 123}, {80, 13}}</string>
<string key="NSFrame">{{119, 90}, {80, 13}}</string>
<reference key="NSSuperview" ref="1073354031"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="106025161">
@@ -167,7 +163,7 @@
<object class="NSTextField" id="171701149">
<reference key="NSNextResponder" ref="1073354031"/>
<int key="NSvFlags">289</int>
<string key="NSFrame">{{216, 123}, {80, 13}}</string>
<string key="NSFrame">{{216, 90}, {80, 13}}</string>
<reference key="NSSuperview" ref="1073354031"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="397705219">
@@ -183,7 +179,7 @@
<object class="NSTextField" id="638371207">
<reference key="NSNextResponder" ref="1073354031"/>
<int key="NSvFlags">292</int>
<string key="NSFrame">{{14, 145}, {100, 14}}</string>
<string key="NSFrame">{{14, 112}, {100, 14}}</string>
<reference key="NSSuperview" ref="1073354031"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="812365472">
@@ -203,7 +199,7 @@
<object class="NSButton" id="488256664">
<reference key="NSNextResponder" ref="1073354031"/>
<int key="NSvFlags">256</int>
<string key="NSFrame">{{15, 79}, {316, 18}}</string>
<string key="NSFrame">{{15, 46}, {316, 18}}</string>
<reference key="NSSuperview" ref="1073354031"/>
<bool key="NSEnabled">YES</bool>
<object class="NSButtonCell" key="NSCell" id="401283671">
@@ -226,13 +222,13 @@
<object class="NSButton" id="722670516">
<reference key="NSNextResponder" ref="1073354031"/>
<int key="NSvFlags">256</int>
<string key="NSFrame">{{15, 99}, {316, 18}}</string>
<string key="NSFrame">{{15, 66}, {316, 18}}</string>
<reference key="NSSuperview" ref="1073354031"/>
<bool key="NSEnabled">YES</bool>
<object class="NSButtonCell" key="NSCell" id="911281323">
<int key="NSCellFlags">67239424</int>
<int key="NSCellFlags2">0</int>
<string key="NSContents">Match scaled pictures together</string>
<string key="NSContents">Match pictures of different dimensions</string>
<reference key="NSSupport" ref="26"/>
<reference key="NSControlView" ref="722670516"/>
<int key="NSButtonFlags">1211912703</int>
@@ -247,7 +243,7 @@
<object class="NSButton" id="472028782">
<reference key="NSNextResponder" ref="1073354031"/>
<int key="NSvFlags">256</int>
<string key="NSFrame">{{15, 39}, {316, 18}}</string>
<string key="NSFrame">{{15, 6}, {316, 18}}</string>
<reference key="NSSuperview" ref="1073354031"/>
<bool key="NSEnabled">YES</bool>
<object class="NSButtonCell" key="NSCell" id="2297113">
@@ -268,7 +264,7 @@
<object class="NSButton" id="279087998">
<reference key="NSNextResponder" ref="1073354031"/>
<int key="NSvFlags">256</int>
<string key="NSFrame">{{15, 59}, {316, 18}}</string>
<string key="NSFrame">{{15, 26}, {316, 18}}</string>
<reference key="NSSuperview" ref="1073354031"/>
<bool key="NSEnabled">YES</bool>
<object class="NSButtonCell" key="NSCell" id="287383961">
@@ -289,7 +285,7 @@
<object class="NSTextField" id="403531548">
<reference key="NSNextResponder" ref="1073354031"/>
<int key="NSvFlags">256</int>
<string key="NSFrame">{{301, 145}, {31, 14}}</string>
<string key="NSFrame">{{301, 112}, {31, 14}}</string>
<reference key="NSSuperview" ref="1073354031"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="983190380">
@@ -367,6 +363,87 @@
<reference key="NSTextColor" ref="538152464"/>
</object>
</object>
<object class="NSTextField" id="536472926">
<reference key="NSNextResponder" ref="1073354031"/>
<int key="NSvFlags">292</int>
<string key="NSFrame">{{14, 145}, {85, 13}}</string>
<reference key="NSSuperview" ref="1073354031"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="359086043">
<int key="NSCellFlags">67239424</int>
<int key="NSCellFlags2">272629760</int>
<string key="NSContents">Scan type:</string>
<reference key="NSSupport" ref="649492068"/>
<reference key="NSControlView" ref="536472926"/>
<reference key="NSBackgroundColor" ref="71910056"/>
<reference key="NSTextColor" ref="538152464"/>
</object>
</object>
<object class="NSPopUpButton" id="337614813">
<reference key="NSNextResponder" ref="1073354031"/>
<int key="NSvFlags">292</int>
<string key="NSFrame">{{113, 135}, {219, 26}}</string>
<reference key="NSSuperview" ref="1073354031"/>
<bool key="NSEnabled">YES</bool>
<object class="NSPopUpButtonCell" key="NSCell" id="697629846">
<int key="NSCellFlags">-2076049856</int>
<int key="NSCellFlags2">2048</int>
<reference key="NSSupport" ref="882799568"/>
<reference key="NSControlView" ref="337614813"/>
<int key="NSButtonFlags">109199615</int>
<int key="NSButtonFlags2">1</int>
<reference key="NSAlternateImage" ref="882799568"/>
<string key="NSAlternateContents"/>
<object class="NSMutableString" key="NSKeyEquivalent">
<characters key="NS.bytes"/>
</object>
<int key="NSPeriodicDelay">400</int>
<int key="NSPeriodicInterval">75</int>
<object class="NSMenuItem" key="NSMenuItem" id="1038855957">
<reference key="NSMenu" ref="958971008"/>
<string key="NSTitle">Contents</string>
<string key="NSKeyEquiv"/>
<int key="NSKeyEquivModMask">1048576</int>
<int key="NSMnemonicLoc">2147483647</int>
<int key="NSState">1</int>
<object class="NSCustomResource" key="NSOnImage" id="875822430">
<string key="NSClassName">NSImage</string>
<string key="NSResourceName">NSMenuCheckmark</string>
</object>
<object class="NSCustomResource" key="NSMixedImage" id="731403416">
<string key="NSClassName">NSImage</string>
<string key="NSResourceName">NSMenuMixedState</string>
</object>
<string key="NSAction">_popUpItemAction:</string>
<reference key="NSTarget" ref="697629846"/>
</object>
<bool key="NSMenuItemRespectAlignment">YES</bool>
<object class="NSMenu" key="NSMenu" id="958971008">
<object class="NSMutableString" key="NSTitle">
<characters key="NS.bytes">OtherViews</characters>
</object>
<object class="NSMutableArray" key="NSMenuItems">
<bool key="EncodedWithXMLCoder">YES</bool>
<reference ref="1038855957"/>
<object class="NSMenuItem" id="820923003">
<reference key="NSMenu" ref="958971008"/>
<string key="NSTitle">EXIF Timestamp</string>
<string key="NSKeyEquiv"/>
<int key="NSKeyEquivModMask">1048576</int>
<int key="NSMnemonicLoc">2147483647</int>
<reference key="NSOnImage" ref="875822430"/>
<reference key="NSMixedImage" ref="731403416"/>
<string key="NSAction">_popUpItemAction:</string>
<reference key="NSTarget" ref="697629846"/>
</object>
</object>
</object>
<int key="NSPreferredEdge">3</int>
<bool key="NSUsesItemFromMenu">YES</bool>
<bool key="NSAltersState">YES</bool>
<int key="NSArrowPosition">1</int>
</object>
</object>
</object>
<string key="NSFrame">{{10, 33}, {346, 162}}</string>
<reference key="NSSuperview" ref="211771207"/>
@@ -504,14 +581,8 @@
<int key="NSKeyEquivModMask">1048576</int>
<int key="NSMnemonicLoc">2147483647</int>
<int key="NSState">1</int>
<object class="NSCustomResource" key="NSOnImage" id="867788054">
<string key="NSClassName">NSImage</string>
<string key="NSResourceName">NSMenuCheckmark</string>
</object>
<object class="NSCustomResource" key="NSMixedImage" id="554538570">
<string key="NSClassName">NSImage</string>
<string key="NSResourceName">NSMenuMixedState</string>
</object>
<reference key="NSOnImage" ref="875822430"/>
<reference key="NSMixedImage" ref="731403416"/>
<string key="NSAction">_popUpItemAction:</string>
<reference key="NSTarget" ref="601288025"/>
</object>
@@ -529,8 +600,8 @@
<string key="NSKeyEquiv"/>
<int key="NSKeyEquivModMask">1048576</int>
<int key="NSMnemonicLoc">2147483647</int>
<reference key="NSOnImage" ref="867788054"/>
<reference key="NSMixedImage" ref="554538570"/>
<reference key="NSOnImage" ref="875822430"/>
<reference key="NSMixedImage" ref="731403416"/>
<string key="NSAction">_popUpItemAction:</string>
<reference key="NSTarget" ref="601288025"/>
</object>
@@ -540,8 +611,8 @@
<string key="NSKeyEquiv"/>
<int key="NSKeyEquivModMask">1048576</int>
<int key="NSMnemonicLoc">2147483647</int>
<reference key="NSOnImage" ref="867788054"/>
<reference key="NSMixedImage" ref="554538570"/>
<reference key="NSOnImage" ref="875822430"/>
<reference key="NSMixedImage" ref="731403416"/>
<string key="NSAction">_popUpItemAction:</string>
<reference key="NSTarget" ref="601288025"/>
</object>
@@ -877,6 +948,42 @@
</object>
<int key="connectionID">78</int>
</object>
<object class="IBConnectionRecord">
<object class="IBBindingConnection" key="connection">
<string key="label">selectedIndex: values.scanType</string>
<reference key="source" ref="337614813"/>
<reference key="destination" ref="455472712"/>
<object class="NSNibBindingConnector" key="connector">
<reference key="NSSource" ref="337614813"/>
<reference key="NSDestination" ref="455472712"/>
<string key="NSLabel">selectedIndex: values.scanType</string>
<string key="NSBinding">selectedIndex</string>
<string key="NSKeyPath">values.scanType</string>
<int key="NSNibBindingConnectorVersion">2</int>
</object>
</object>
<int key="connectionID">96</int>
</object>
<object class="IBConnectionRecord">
<object class="IBBindingConnection" key="connection">
<string key="label">enabled: values.scanType</string>
<reference key="source" ref="266372855"/>
<reference key="destination" ref="455472712"/>
<object class="NSNibBindingConnector" key="connector">
<reference key="NSSource" ref="266372855"/>
<reference key="NSDestination" ref="455472712"/>
<string key="NSLabel">enabled: values.scanType</string>
<string key="NSBinding">enabled</string>
<string key="NSKeyPath">values.scanType</string>
<object class="NSDictionary" key="NSOptions">
<string key="NS.key.0">NSValueTransformerName</string>
<string key="NS.object.0">vtScanTypeIsFuzzy</string>
</object>
<int key="NSNibBindingConnectorVersion">2</int>
</object>
</object>
<int key="connectionID">98</int>
</object>
</object>
<object class="IBMutableOrderedSet" key="objectRecords">
<object class="NSArray" key="orderedObjects">
@@ -993,15 +1100,17 @@
<reference key="object" ref="1073354031"/>
<object class="NSMutableArray" key="children">
<bool key="EncodedWithXMLCoder">YES</bool>
<reference ref="722670516"/>
<reference ref="488256664"/>
<reference ref="638371207"/>
<reference ref="171701149"/>
<reference ref="869007847"/>
<reference ref="266372855"/>
<reference ref="869007847"/>
<reference ref="171701149"/>
<reference ref="638371207"/>
<reference ref="488256664"/>
<reference ref="722670516"/>
<reference ref="279087998"/>
<reference ref="403531548"/>
<reference ref="472028782"/>
<reference ref="337614813"/>
<reference ref="536472926"/>
<reference ref="403531548"/>
</object>
<reference key="parent" ref="700068878"/>
</object>
@@ -1268,6 +1377,58 @@
<reference key="object" ref="100803310"/>
<reference key="parent" ref="606836304"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">87</int>
<reference key="object" ref="536472926"/>
<object class="NSMutableArray" key="children">
<bool key="EncodedWithXMLCoder">YES</bool>
<reference ref="359086043"/>
</object>
<reference key="parent" ref="1073354031"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">88</int>
<reference key="object" ref="337614813"/>
<object class="NSMutableArray" key="children">
<bool key="EncodedWithXMLCoder">YES</bool>
<reference ref="697629846"/>
</object>
<reference key="parent" ref="1073354031"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">89</int>
<reference key="object" ref="697629846"/>
<object class="NSMutableArray" key="children">
<bool key="EncodedWithXMLCoder">YES</bool>
<reference ref="958971008"/>
</object>
<reference key="parent" ref="337614813"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">90</int>
<reference key="object" ref="958971008"/>
<object class="NSMutableArray" key="children">
<bool key="EncodedWithXMLCoder">YES</bool>
<reference ref="820923003"/>
<reference ref="1038855957"/>
</object>
<reference key="parent" ref="697629846"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">92</int>
<reference key="object" ref="820923003"/>
<reference key="parent" ref="958971008"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">93</int>
<reference key="object" ref="1038855957"/>
<reference key="parent" ref="958971008"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">94</int>
<reference key="object" ref="359086043"/>
<reference key="parent" ref="536472926"/>
</object>
</object>
</object>
<object class="NSMutableDictionary" key="flattenedProperties">
@@ -1281,16 +1442,22 @@
<string>10.IBViewBoundsToFrameTransform</string>
<string>10.ImportedFromIB2</string>
<string>11.IBPluginDependency</string>
<string>11.IBViewBoundsToFrameTransform</string>
<string>11.ImportedFromIB2</string>
<string>12.IBPluginDependency</string>
<string>12.IBViewBoundsToFrameTransform</string>
<string>12.ImportedFromIB2</string>
<string>13.IBPluginDependency</string>
<string>13.IBViewBoundsToFrameTransform</string>
<string>13.ImportedFromIB2</string>
<string>14.IBPluginDependency</string>
<string>14.IBViewBoundsToFrameTransform</string>
<string>14.ImportedFromIB2</string>
<string>15.IBPluginDependency</string>
<string>15.IBViewBoundsToFrameTransform</string>
<string>15.ImportedFromIB2</string>
<string>16.IBPluginDependency</string>
<string>16.IBViewBoundsToFrameTransform</string>
<string>16.ImportedFromIB2</string>
<string>17.IBPluginDependency</string>
<string>18.IBPluginDependency</string>
@@ -1326,6 +1493,7 @@
<string>4.IBPluginDependency</string>
<string>4.ImportedFromIB2</string>
<string>5.IBPluginDependency</string>
<string>5.IBViewBoundsToFrameTransform</string>
<string>5.ImportedFromIB2</string>
<string>59.IBPluginDependency</string>
<string>6.IBPluginDependency</string>
@@ -1346,6 +1514,7 @@
<string>69.IBViewBoundsToFrameTransform</string>
<string>69.ImportedFromIB2</string>
<string>7.IBPluginDependency</string>
<string>7.IBViewBoundsToFrameTransform</string>
<string>7.ImportedFromIB2</string>
<string>70.IBPluginDependency</string>
<string>74.IBPluginDependency</string>
@@ -1355,9 +1524,24 @@
<string>8.IBPluginDependency</string>
<string>8.IBViewBoundsToFrameTransform</string>
<string>8.ImportedFromIB2</string>
<string>87.IBPluginDependency</string>
<string>87.IBViewBoundsToFrameTransform</string>
<string>87.ImportedFromIB2</string>
<string>88.IBPluginDependency</string>
<string>88.IBViewBoundsToFrameTransform</string>
<string>88.ImportedFromIB2</string>
<string>89.IBPluginDependency</string>
<string>9.IBPluginDependency</string>
<string>9.IBViewBoundsToFrameTransform</string>
<string>9.ImportedFromIB2</string>
<string>90.IBEditorWindowLastContentRect</string>
<string>90.IBPluginDependency</string>
<string>90.ImportedFromIB2</string>
<string>92.IBPluginDependency</string>
<string>92.ImportedFromIB2</string>
<string>93.IBPluginDependency</string>
<string>93.ImportedFromIB2</string>
<string>94.IBPluginDependency</string>
</object>
<object class="NSMutableArray" key="dict.values">
<bool key="EncodedWithXMLCoder">YES</bool>
@@ -1370,23 +1554,41 @@
</object>
<boolean value="YES"/>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<object class="NSAffineTransform">
<bytes key="NSTransformStruct">P4AAAL+AAABDloAAwxAAAA</bytes>
</object>
<boolean value="YES"/>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<object class="NSAffineTransform">
<bytes key="NSTransformStruct">P4AAAL+AAABBcAAAwr4AAA</bytes>
</object>
<boolean value="YES"/>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<object class="NSAffineTransform">
<bytes key="NSTransformStruct">P4AAAL+AAABBYAAAwx0AAA</bytes>
</object>
<boolean value="YES"/>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<object class="NSAffineTransform">
<bytes key="NSTransformStruct">P4AAAL+AAABDWAAAwwYAAA</bytes>
</object>
<boolean value="YES"/>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<object class="NSAffineTransform">
<bytes key="NSTransformStruct">P4AAAL+AAABC7gAAwwYAAA</bytes>
</object>
<boolean value="YES"/>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<object class="NSAffineTransform">
<bytes key="NSTransformStruct">P4AAAL+AAABC6gAAwx8AAA</bytes>
</object>
<boolean value="YES"/>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>{{88, 591}, {392, 254}}</string>
<string>{{413, 591}, {392, 254}}</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>{{88, 591}, {392, 254}}</string>
<string>{{413, 591}, {392, 254}}</string>
<boolean value="YES"/>
<boolean value="YES"/>
<string>{213, 107}</string>
@@ -1415,11 +1617,14 @@
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<boolean value="YES"/>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<object class="NSAffineTransform">
<bytes key="NSTransformStruct">P4AAAL+AAABBcAAAwpYAAA</bytes>
</object>
<boolean value="YES"/>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<object class="NSAffineTransform">
<bytes key="NSTransformStruct">P4AAAL+AAABBcAAAwfAAAA</bytes>
<bytes key="NSTransformStruct">P4AAAL+AAABBcAAAwlwAAA</bytes>
</object>
<boolean value="YES"/>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
@@ -1443,6 +1648,9 @@
</object>
<boolean value="YES"/>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<object class="NSAffineTransform">
<bytes key="NSTransformStruct">P4AAAL+AAABBcAAAwuYAAA</bytes>
</object>
<boolean value="YES"/>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
@@ -1457,10 +1665,29 @@
</object>
<boolean value="YES"/>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<object class="NSAffineTransform">
<bytes key="NSTransformStruct">P4AAAL+AAABBYAAAwx0AAA</bytes>
</object>
<boolean value="YES"/>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<object class="NSAffineTransform">
<bytes key="NSTransformStruct">P4AAAL+AAABCbAAAwx8AAA</bytes>
</object>
<boolean value="YES"/>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<object class="NSAffineTransform">
<bytes key="NSTransformStruct">P4AAAL+AAABBYAAAwjwAAA</bytes>
</object>
<boolean value="YES"/>
<string>{{213, 762}, {216, 43}}</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<boolean value="YES"/>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<boolean value="YES"/>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<boolean value="YES"/>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
</object>
</object>
<object class="NSMutableDictionary" key="unlocalizedProperties">
@@ -1479,7 +1706,7 @@
</object>
</object>
<nil key="sourceID"/>
<int key="maxID">78</int>
<int key="maxID">100</int>
</object>
<object class="IBClassDescriber" key="IBDocument.Classes">
<object class="NSMutableArray" key="referencedPartialClassDescriptions">

View File

@@ -29,7 +29,7 @@
/* Class = "NSMenuItem"; title = "Right in destination"; ObjectID = "30"; */
"30.title" = "Directement à la destination";
/* Class = "NSButtonCell"; title = "Match scaled pictures together"; ObjectID = "31"; */
/* Class = "NSButtonCell"; title = "Match pictures of different dimensions"; ObjectID = "31"; */
"31.title" = "Comparer les images de tailles différentes";
/* Class = "NSButtonCell"; title = "Automatically check for updates"; ObjectID = "32"; */

View File

@@ -2,13 +2,13 @@
<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="7.10">
<data>
<int key="IBDocument.SystemTarget">1050</int>
<string key="IBDocument.SystemVersion">10J567</string>
<string key="IBDocument.InterfaceBuilderVersion">823</string>
<string key="IBDocument.SystemVersion">10J4138</string>
<string key="IBDocument.InterfaceBuilderVersion">851</string>
<string key="IBDocument.AppKitVersion">1038.35</string>
<string key="IBDocument.HIToolboxVersion">462.00</string>
<string key="IBDocument.HIToolboxVersion">461.00</string>
<object class="NSMutableDictionary" key="IBDocument.PluginVersions">
<string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="NS.object.0">823</string>
<string key="NS.object.0">851</string>
</object>
<object class="NSMutableArray" key="IBDocument.EditedObjectIDs">
<bool key="EncodedWithXMLCoder">YES</bool>
@@ -98,7 +98,7 @@
<object class="NSSlider" id="266372855">
<reference key="NSNextResponder" ref="1073354031"/>
<int key="NSvFlags">292</int>
<string key="NSFrame">{{117, 140}, {181, 21}}</string>
<string key="NSFrame">{{117, 107}, {181, 21}}</string>
<reference key="NSSuperview" ref="1073354031"/>
<bool key="NSEnabled">YES</bool>
<object class="NSSliderCell" key="NSCell" id="453640282">
@@ -126,7 +126,7 @@
<object class="NSTextField" id="869007847">
<reference key="NSNextResponder" ref="1073354031"/>
<int key="NSvFlags">292</int>
<string key="NSFrame">{{119, 123}, {80, 13}}</string>
<string key="NSFrame">{{119, 90}, {80, 13}}</string>
<reference key="NSSuperview" ref="1073354031"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="106025161">
@@ -162,7 +162,7 @@
<object class="NSTextField" id="171701149">
<reference key="NSNextResponder" ref="1073354031"/>
<int key="NSvFlags">289</int>
<string key="NSFrame">{{216, 123}, {80, 13}}</string>
<string key="NSFrame">{{216, 90}, {80, 13}}</string>
<reference key="NSSuperview" ref="1073354031"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="397705219">
@@ -178,7 +178,7 @@
<object class="NSTextField" id="638371207">
<reference key="NSNextResponder" ref="1073354031"/>
<int key="NSvFlags">292</int>
<string key="NSFrame">{{14, 145}, {100, 14}}</string>
<string key="NSFrame">{{14, 112}, {100, 14}}</string>
<reference key="NSSuperview" ref="1073354031"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="812365472">
@@ -198,7 +198,7 @@
<object class="NSButton" id="488256664">
<reference key="NSNextResponder" ref="1073354031"/>
<int key="NSvFlags">256</int>
<string key="NSFrame">{{15, 79}, {316, 18}}</string>
<string key="NSFrame">{{15, 46}, {316, 18}}</string>
<reference key="NSSuperview" ref="1073354031"/>
<bool key="NSEnabled">YES</bool>
<object class="NSButtonCell" key="NSCell" id="401283671">
@@ -209,7 +209,7 @@
<reference key="NSControlView" ref="488256664"/>
<int key="NSButtonFlags">1211912703</int>
<int key="NSButtonFlags2">2</int>
<object class="NSCustomResource" key="NSNormalImage" id="283442644">
<object class="NSCustomResource" key="NSNormalImage" id="949163782">
<string key="NSClassName">NSImage</string>
<string key="NSResourceName">NSSwitch</string>
</object>
@@ -225,7 +225,7 @@
<object class="NSButton" id="722670516">
<reference key="NSNextResponder" ref="1073354031"/>
<int key="NSvFlags">256</int>
<string key="NSFrame">{{15, 99}, {316, 18}}</string>
<string key="NSFrame">{{15, 66}, {316, 18}}</string>
<reference key="NSSuperview" ref="1073354031"/>
<bool key="NSEnabled">YES</bool>
<object class="NSButtonCell" key="NSCell" id="911281323">
@@ -236,7 +236,7 @@
<reference key="NSControlView" ref="722670516"/>
<int key="NSButtonFlags">1211912703</int>
<int key="NSButtonFlags2">2</int>
<reference key="NSNormalImage" ref="283442644"/>
<reference key="NSNormalImage" ref="949163782"/>
<reference key="NSAlternateImage" ref="990345653"/>
<string key="NSAlternateContents"/>
<string key="NSKeyEquivalent"/>
@@ -247,7 +247,7 @@
<object class="NSButton" id="472028782">
<reference key="NSNextResponder" ref="1073354031"/>
<int key="NSvFlags">256</int>
<string key="NSFrame">{{15, 39}, {316, 18}}</string>
<string key="NSFrame">{{15, 6}, {316, 18}}</string>
<reference key="NSSuperview" ref="1073354031"/>
<bool key="NSEnabled">YES</bool>
<object class="NSButtonCell" key="NSCell" id="2297113">
@@ -258,7 +258,7 @@
<reference key="NSControlView" ref="472028782"/>
<int key="NSButtonFlags">1211912703</int>
<int key="NSButtonFlags2">2</int>
<reference key="NSNormalImage" ref="283442644"/>
<reference key="NSNormalImage" ref="949163782"/>
<reference key="NSAlternateImage" ref="990345653"/>
<string key="NSAlternateContents"/>
<string key="NSKeyEquivalent"/>
@@ -269,7 +269,7 @@
<object class="NSButton" id="279087998">
<reference key="NSNextResponder" ref="1073354031"/>
<int key="NSvFlags">256</int>
<string key="NSFrame">{{15, 59}, {316, 18}}</string>
<string key="NSFrame">{{15, 26}, {316, 18}}</string>
<reference key="NSSuperview" ref="1073354031"/>
<bool key="NSEnabled">YES</bool>
<object class="NSButtonCell" key="NSCell" id="287383961">
@@ -280,7 +280,7 @@
<reference key="NSControlView" ref="279087998"/>
<int key="NSButtonFlags">1211912703</int>
<int key="NSButtonFlags2">2</int>
<reference key="NSNormalImage" ref="283442644"/>
<reference key="NSNormalImage" ref="949163782"/>
<reference key="NSAlternateImage" ref="990345653"/>
<string key="NSAlternateContents"/>
<string key="NSKeyEquivalent"/>
@@ -291,7 +291,7 @@
<object class="NSTextField" id="403531548">
<reference key="NSNextResponder" ref="1073354031"/>
<int key="NSvFlags">256</int>
<string key="NSFrame">{{301, 145}, {31, 14}}</string>
<string key="NSFrame">{{301, 112}, {31, 14}}</string>
<reference key="NSSuperview" ref="1073354031"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="983190380">
@@ -369,6 +369,87 @@
<reference key="NSTextColor" ref="538152464"/>
</object>
</object>
<object class="NSTextField" id="536472926">
<reference key="NSNextResponder" ref="1073354031"/>
<int key="NSvFlags">292</int>
<string key="NSFrame">{{14, 145}, {85, 13}}</string>
<reference key="NSSuperview" ref="1073354031"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="359086043">
<int key="NSCellFlags">67239424</int>
<int key="NSCellFlags2">272629760</int>
<string key="NSContents">Scan type:</string>
<reference key="NSSupport" ref="649492068"/>
<reference key="NSControlView" ref="536472926"/>
<reference key="NSBackgroundColor" ref="71910056"/>
<reference key="NSTextColor" ref="538152464"/>
</object>
</object>
<object class="NSPopUpButton" id="337614813">
<reference key="NSNextResponder" ref="1073354031"/>
<int key="NSvFlags">292</int>
<string key="NSFrame">{{113, 135}, {219, 26}}</string>
<reference key="NSSuperview" ref="1073354031"/>
<bool key="NSEnabled">YES</bool>
<object class="NSPopUpButtonCell" key="NSCell" id="697629846">
<int key="NSCellFlags">-2076049856</int>
<int key="NSCellFlags2">2048</int>
<reference key="NSSupport" ref="882799568"/>
<reference key="NSControlView" ref="337614813"/>
<int key="NSButtonFlags">109199615</int>
<int key="NSButtonFlags2">1</int>
<reference key="NSAlternateImage" ref="882799568"/>
<string key="NSAlternateContents"/>
<object class="NSMutableString" key="NSKeyEquivalent">
<characters key="NS.bytes"/>
</object>
<int key="NSPeriodicDelay">400</int>
<int key="NSPeriodicInterval">75</int>
<object class="NSMenuItem" key="NSMenuItem" id="1038855957">
<reference key="NSMenu" ref="958971008"/>
<string key="NSTitle">Contents</string>
<string key="NSKeyEquiv"/>
<int key="NSKeyEquivModMask">1048576</int>
<int key="NSMnemonicLoc">2147483647</int>
<int key="NSState">1</int>
<object class="NSCustomResource" key="NSOnImage" id="875822430">
<string key="NSClassName">NSImage</string>
<string key="NSResourceName">NSMenuCheckmark</string>
</object>
<object class="NSCustomResource" key="NSMixedImage" id="731403416">
<string key="NSClassName">NSImage</string>
<string key="NSResourceName">NSMenuMixedState</string>
</object>
<string key="NSAction">_popUpItemAction:</string>
<reference key="NSTarget" ref="697629846"/>
</object>
<bool key="NSMenuItemRespectAlignment">YES</bool>
<object class="NSMenu" key="NSMenu" id="958971008">
<object class="NSMutableString" key="NSTitle">
<characters key="NS.bytes">OtherViews</characters>
</object>
<object class="NSMutableArray" key="NSMenuItems">
<bool key="EncodedWithXMLCoder">YES</bool>
<reference ref="1038855957"/>
<object class="NSMenuItem" id="820923003">
<reference key="NSMenu" ref="958971008"/>
<string key="NSTitle">EXIF Timestamp</string>
<string key="NSKeyEquiv"/>
<int key="NSKeyEquivModMask">1048576</int>
<int key="NSMnemonicLoc">2147483647</int>
<reference key="NSOnImage" ref="875822430"/>
<reference key="NSMixedImage" ref="731403416"/>
<string key="NSAction">_popUpItemAction:</string>
<reference key="NSTarget" ref="697629846"/>
</object>
</object>
</object>
<int key="NSPreferredEdge">3</int>
<bool key="NSUsesItemFromMenu">YES</bool>
<bool key="NSAltersState">YES</bool>
<int key="NSArrowPosition">1</int>
</object>
</object>
</object>
<string key="NSFrame">{{10, 33}, {346, 162}}</string>
<reference key="NSSuperview" ref="211771207"/>
@@ -398,7 +479,7 @@
<reference key="NSControlView" ref="1018598123"/>
<int key="NSButtonFlags">1211912703</int>
<int key="NSButtonFlags2">2</int>
<reference key="NSNormalImage" ref="283442644"/>
<reference key="NSNormalImage" ref="949163782"/>
<reference key="NSAlternateImage" ref="990345653"/>
<string key="NSAlternateContents"/>
<string key="NSKeyEquivalent"/>
@@ -420,7 +501,7 @@
<reference key="NSControlView" ref="519470955"/>
<int key="NSButtonFlags">1211912703</int>
<int key="NSButtonFlags2">2</int>
<reference key="NSNormalImage" ref="283442644"/>
<reference key="NSNormalImage" ref="949163782"/>
<reference key="NSAlternateImage" ref="990345653"/>
<string key="NSAlternateContents"/>
<string key="NSKeyEquivalent"/>
@@ -442,7 +523,7 @@
<reference key="NSControlView" ref="606836304"/>
<int key="NSButtonFlags">1211912703</int>
<int key="NSButtonFlags2">2</int>
<reference key="NSNormalImage" ref="283442644"/>
<reference key="NSNormalImage" ref="949163782"/>
<reference key="NSAlternateImage" ref="990345653"/>
<string key="NSAlternateContents"/>
<string key="NSKeyEquivalent"/>
@@ -509,14 +590,8 @@
<int key="NSKeyEquivModMask">1048576</int>
<int key="NSMnemonicLoc">2147483647</int>
<int key="NSState">1</int>
<object class="NSCustomResource" key="NSOnImage" id="867788054">
<string key="NSClassName">NSImage</string>
<string key="NSResourceName">NSMenuCheckmark</string>
</object>
<object class="NSCustomResource" key="NSMixedImage" id="554538570">
<string key="NSClassName">NSImage</string>
<string key="NSResourceName">NSMenuMixedState</string>
</object>
<reference key="NSOnImage" ref="875822430"/>
<reference key="NSMixedImage" ref="731403416"/>
<string key="NSAction">_popUpItemAction:</string>
<reference key="NSTarget" ref="601288025"/>
</object>
@@ -534,8 +609,8 @@
<string key="NSKeyEquiv"/>
<int key="NSKeyEquivModMask">1048576</int>
<int key="NSMnemonicLoc">2147483647</int>
<reference key="NSOnImage" ref="867788054"/>
<reference key="NSMixedImage" ref="554538570"/>
<reference key="NSOnImage" ref="875822430"/>
<reference key="NSMixedImage" ref="731403416"/>
<string key="NSAction">_popUpItemAction:</string>
<reference key="NSTarget" ref="601288025"/>
</object>
@@ -545,8 +620,8 @@
<string key="NSKeyEquiv"/>
<int key="NSKeyEquivModMask">1048576</int>
<int key="NSMnemonicLoc">2147483647</int>
<reference key="NSOnImage" ref="867788054"/>
<reference key="NSMixedImage" ref="554538570"/>
<reference key="NSOnImage" ref="875822430"/>
<reference key="NSMixedImage" ref="731403416"/>
<string key="NSAction">_popUpItemAction:</string>
<reference key="NSTarget" ref="601288025"/>
</object>
@@ -881,6 +956,42 @@
</object>
<int key="connectionID">78</int>
</object>
<object class="IBConnectionRecord">
<object class="IBBindingConnection" key="connection">
<string key="label">selectedIndex: values.scanType</string>
<reference key="source" ref="337614813"/>
<reference key="destination" ref="455472712"/>
<object class="NSNibBindingConnector" key="connector">
<reference key="NSSource" ref="337614813"/>
<reference key="NSDestination" ref="455472712"/>
<string key="NSLabel">selectedIndex: values.scanType</string>
<string key="NSBinding">selectedIndex</string>
<string key="NSKeyPath">values.scanType</string>
<int key="NSNibBindingConnectorVersion">2</int>
</object>
</object>
<int key="connectionID">96</int>
</object>
<object class="IBConnectionRecord">
<object class="IBBindingConnection" key="connection">
<string key="label">enabled: values.scanType</string>
<reference key="source" ref="266372855"/>
<reference key="destination" ref="455472712"/>
<object class="NSNibBindingConnector" key="connector">
<reference key="NSSource" ref="266372855"/>
<reference key="NSDestination" ref="455472712"/>
<string key="NSLabel">enabled: values.scanType</string>
<string key="NSBinding">enabled</string>
<string key="NSKeyPath">values.scanType</string>
<object class="NSDictionary" key="NSOptions">
<string key="NS.key.0">NSValueTransformerName</string>
<string key="NS.object.0">vtScanTypeIsFuzzy</string>
</object>
<int key="NSNibBindingConnectorVersion">2</int>
</object>
</object>
<int key="connectionID">98</int>
</object>
</object>
<object class="IBMutableOrderedSet" key="objectRecords">
<object class="NSArray" key="orderedObjects">
@@ -997,15 +1108,17 @@
<reference key="object" ref="1073354031"/>
<object class="NSMutableArray" key="children">
<bool key="EncodedWithXMLCoder">YES</bool>
<reference ref="722670516"/>
<reference ref="488256664"/>
<reference ref="638371207"/>
<reference ref="171701149"/>
<reference ref="869007847"/>
<reference ref="266372855"/>
<reference ref="869007847"/>
<reference ref="171701149"/>
<reference ref="638371207"/>
<reference ref="488256664"/>
<reference ref="722670516"/>
<reference ref="279087998"/>
<reference ref="403531548"/>
<reference ref="472028782"/>
<reference ref="337614813"/>
<reference ref="536472926"/>
<reference ref="403531548"/>
</object>
<reference key="parent" ref="700068878"/>
</object>
@@ -1272,6 +1385,58 @@
<reference key="object" ref="100803310"/>
<reference key="parent" ref="606836304"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">87</int>
<reference key="object" ref="536472926"/>
<object class="NSMutableArray" key="children">
<bool key="EncodedWithXMLCoder">YES</bool>
<reference ref="359086043"/>
</object>
<reference key="parent" ref="1073354031"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">88</int>
<reference key="object" ref="337614813"/>
<object class="NSMutableArray" key="children">
<bool key="EncodedWithXMLCoder">YES</bool>
<reference ref="697629846"/>
</object>
<reference key="parent" ref="1073354031"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">89</int>
<reference key="object" ref="697629846"/>
<object class="NSMutableArray" key="children">
<bool key="EncodedWithXMLCoder">YES</bool>
<reference ref="958971008"/>
</object>
<reference key="parent" ref="337614813"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">90</int>
<reference key="object" ref="958971008"/>
<object class="NSMutableArray" key="children">
<bool key="EncodedWithXMLCoder">YES</bool>
<reference ref="820923003"/>
<reference ref="1038855957"/>
</object>
<reference key="parent" ref="697629846"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">92</int>
<reference key="object" ref="820923003"/>
<reference key="parent" ref="958971008"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">93</int>
<reference key="object" ref="1038855957"/>
<reference key="parent" ref="958971008"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">94</int>
<reference key="object" ref="359086043"/>
<reference key="parent" ref="536472926"/>
</object>
</object>
</object>
<object class="NSMutableDictionary" key="flattenedProperties">
@@ -1285,16 +1450,22 @@
<string>10.IBViewBoundsToFrameTransform</string>
<string>10.ImportedFromIB2</string>
<string>11.IBPluginDependency</string>
<string>11.IBViewBoundsToFrameTransform</string>
<string>11.ImportedFromIB2</string>
<string>12.IBPluginDependency</string>
<string>12.IBViewBoundsToFrameTransform</string>
<string>12.ImportedFromIB2</string>
<string>13.IBPluginDependency</string>
<string>13.IBViewBoundsToFrameTransform</string>
<string>13.ImportedFromIB2</string>
<string>14.IBPluginDependency</string>
<string>14.IBViewBoundsToFrameTransform</string>
<string>14.ImportedFromIB2</string>
<string>15.IBPluginDependency</string>
<string>15.IBViewBoundsToFrameTransform</string>
<string>15.ImportedFromIB2</string>
<string>16.IBPluginDependency</string>
<string>16.IBViewBoundsToFrameTransform</string>
<string>16.ImportedFromIB2</string>
<string>17.IBPluginDependency</string>
<string>18.IBPluginDependency</string>
@@ -1331,6 +1502,7 @@
<string>4.IBPluginDependency</string>
<string>4.ImportedFromIB2</string>
<string>5.IBPluginDependency</string>
<string>5.IBViewBoundsToFrameTransform</string>
<string>5.ImportedFromIB2</string>
<string>59.IBPluginDependency</string>
<string>6.IBPluginDependency</string>
@@ -1351,6 +1523,7 @@
<string>69.IBViewBoundsToFrameTransform</string>
<string>69.ImportedFromIB2</string>
<string>7.IBPluginDependency</string>
<string>7.IBViewBoundsToFrameTransform</string>
<string>7.ImportedFromIB2</string>
<string>70.IBPluginDependency</string>
<string>74.IBPluginDependency</string>
@@ -1360,9 +1533,24 @@
<string>8.IBPluginDependency</string>
<string>8.IBViewBoundsToFrameTransform</string>
<string>8.ImportedFromIB2</string>
<string>87.IBPluginDependency</string>
<string>87.IBViewBoundsToFrameTransform</string>
<string>87.ImportedFromIB2</string>
<string>88.IBPluginDependency</string>
<string>88.IBViewBoundsToFrameTransform</string>
<string>88.ImportedFromIB2</string>
<string>89.IBPluginDependency</string>
<string>9.IBPluginDependency</string>
<string>9.IBViewBoundsToFrameTransform</string>
<string>9.ImportedFromIB2</string>
<string>90.IBEditorWindowLastContentRect</string>
<string>90.IBPluginDependency</string>
<string>90.ImportedFromIB2</string>
<string>92.IBPluginDependency</string>
<string>92.ImportedFromIB2</string>
<string>93.IBPluginDependency</string>
<string>93.ImportedFromIB2</string>
<string>94.IBPluginDependency</string>
</object>
<object class="NSMutableArray" key="dict.values">
<bool key="EncodedWithXMLCoder">YES</bool>
@@ -1375,23 +1563,41 @@
</object>
<boolean value="YES"/>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<object class="NSAffineTransform">
<bytes key="NSTransformStruct">P4AAAL+AAABDloAAwxAAAA</bytes>
</object>
<boolean value="YES"/>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<object class="NSAffineTransform">
<bytes key="NSTransformStruct">P4AAAL+AAABBcAAAwr4AAA</bytes>
</object>
<boolean value="YES"/>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<object class="NSAffineTransform">
<bytes key="NSTransformStruct">P4AAAL+AAABBYAAAwx0AAA</bytes>
</object>
<boolean value="YES"/>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<object class="NSAffineTransform">
<bytes key="NSTransformStruct">P4AAAL+AAABDWAAAwwYAAA</bytes>
</object>
<boolean value="YES"/>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<object class="NSAffineTransform">
<bytes key="NSTransformStruct">P4AAAL+AAABC7gAAwwYAAA</bytes>
</object>
<boolean value="YES"/>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<object class="NSAffineTransform">
<bytes key="NSTransformStruct">P4AAAL+AAABC6gAAwx8AAA</bytes>
</object>
<boolean value="YES"/>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>{{88, 591}, {392, 254}}</string>
<string>{{413, 591}, {392, 254}}</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>{{88, 591}, {392, 254}}</string>
<string>{{413, 591}, {392, 254}}</string>
<boolean value="YES"/>
<boolean value="YES"/>
<string>{1.79769e+308, 1.79769e+308}</string>
@@ -1421,11 +1627,14 @@
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<boolean value="YES"/>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<object class="NSAffineTransform">
<bytes key="NSTransformStruct">P4AAAL+AAABBcAAAwpYAAA</bytes>
</object>
<boolean value="YES"/>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<object class="NSAffineTransform">
<bytes key="NSTransformStruct">P4AAAL+AAABBcAAAwfAAAA</bytes>
<bytes key="NSTransformStruct">P4AAAL+AAABBcAAAwlwAAA</bytes>
</object>
<boolean value="YES"/>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
@@ -1449,6 +1658,9 @@
</object>
<boolean value="YES"/>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<object class="NSAffineTransform">
<bytes key="NSTransformStruct">P4AAAL+AAABBcAAAwuYAAA</bytes>
</object>
<boolean value="YES"/>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
@@ -1463,10 +1675,29 @@
</object>
<boolean value="YES"/>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<object class="NSAffineTransform">
<bytes key="NSTransformStruct">P4AAAL+AAABBYAAAwx0AAA</bytes>
</object>
<boolean value="YES"/>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<object class="NSAffineTransform">
<bytes key="NSTransformStruct">P4AAAL+AAABCbAAAwx8AAA</bytes>
</object>
<boolean value="YES"/>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<object class="NSAffineTransform">
<bytes key="NSTransformStruct">P4AAAL+AAABBYAAAwjwAAA</bytes>
</object>
<boolean value="YES"/>
<string>{{213, 762}, {216, 43}}</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<boolean value="YES"/>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<boolean value="YES"/>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<boolean value="YES"/>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
</object>
</object>
<object class="NSMutableDictionary" key="unlocalizedProperties">
@@ -1485,7 +1716,7 @@
</object>
</object>
<nil key="sourceID"/>
<int key="maxID">78</int>
<int key="maxID">100</int>
</object>
<object class="IBClassDescriber" key="IBDocument.Classes">
<object class="NSMutableArray" key="referencedPartialClassDescriptions">

View File

@@ -1,5 +1,5 @@
/*
Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
Copyright 2011 Hardcoded Software (http://www.hardcoded.net)
This software is licensed under the "BSD" License as described in the "LICENSE" file,
which should be included with this package. The terms are also available at

View File

@@ -1,5 +1,5 @@
/*
Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
Copyright 2011 Hardcoded Software (http://www.hardcoded.net)
This software is licensed under the "BSD" License as described in the "LICENSE" file,
which should be included with this package. The terms are also available at

View File

@@ -1,5 +1,5 @@
/*
Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
Copyright 2011 Hardcoded Software (http://www.hardcoded.net)
This software is licensed under the "BSD" License as described in the "LICENSE" file,
which should be included with this package. The terms are also available at
@@ -42,7 +42,10 @@ http://www.hardcoded.net/licenses/bsd_license
- (id)init
{
self = [super init];
VTIsIntIn *vt = [[[VTIsIntIn alloc] initWithValues:[NSIndexSet indexSetWithIndex:1] reverse:YES] autorelease];
NSMutableIndexSet *contentsIndexes = [NSMutableIndexSet indexSet];
[contentsIndexes addIndex:1];
[contentsIndexes addIndex:2];
VTIsIntIn *vt = [[[VTIsIntIn alloc] initWithValues:contentsIndexes reverse:YES] autorelease];
[NSValueTransformer setValueTransformer:vt forName:@"vtScanTypeIsNotContent"];
_directoryPanel = nil;
return self;

View File

@@ -29,7 +29,7 @@
<key>NSPrincipalClass</key>
<string>NSApplication</string>
<key>NSHumanReadableCopyright</key>
<string>© Hardcoded Software, 2010</string>
<string>© Hardcoded Software, 2011</string>
<key>SUFeedURL</key>
<string>http://www.hardcoded.net/updates/dupeguru.appcast</string>
<key>SUPublicDSAKeyFile</key>

View File

@@ -1,5 +1,5 @@
/*
Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
Copyright 2011 Hardcoded Software (http://www.hardcoded.net)
This software is licensed under the "BSD" License as described in the "LICENSE" file,
which should be included with this package. The terms are also available at
@@ -11,7 +11,6 @@ http://www.hardcoded.net/licenses/bsd_license
@interface PyDupeGuru : PyDupeGuruBase
//Scanning options
- (void)setScanType:(NSNumber *)scan_type;
- (void)setWordWeighting:(NSNumber *)words_are_weighted;
- (void)setMatchSimilarWords:(NSNumber *)match_similar_words;
@end

View File

@@ -1,5 +1,5 @@
/*
Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
Copyright 2011 Hardcoded Software (http://www.hardcoded.net)
This software is licensed under the "BSD" License as described in the "LICENSE" file,
which should be included with this package. The terms are also available at

View File

@@ -1,5 +1,5 @@
/*
Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
Copyright 2011 Hardcoded Software (http://www.hardcoded.net)
This software is licensed under the "BSD" License as described in the "LICENSE" file,
which should be included with this package. The terms are also available at

View File

@@ -1,4 +1,4 @@
# Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
# Copyright 2011 Hardcoded Software (http://www.hardcoded.net)
#
# This software is licensed under the "BSD" License as described in the "LICENSE" file,
# which should be included with this package. The terms are also available at
@@ -29,6 +29,7 @@ class PyDupeGuru(PyDupeGuruBase):
self.py.scanner.scan_type = [
ScanType.Filename,
ScanType.Contents,
ScanType.Folders,
][scan_type]
except IndexError:
pass

View File

@@ -457,7 +457,6 @@
};
buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "dupeguru" */;
compatibilityVersion = "Xcode 3.0";
developmentRegion = English;
hasScannedForEncodings = 1;
knownRegions = (
English,

View File

@@ -2,13 +2,13 @@
<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="7.10">
<data>
<int key="IBDocument.SystemTarget">1050</int>
<string key="IBDocument.SystemVersion">10J567</string>
<string key="IBDocument.InterfaceBuilderVersion">823</string>
<string key="IBDocument.SystemVersion">10J869</string>
<string key="IBDocument.InterfaceBuilderVersion">851</string>
<string key="IBDocument.AppKitVersion">1038.35</string>
<string key="IBDocument.HIToolboxVersion">462.00</string>
<string key="IBDocument.HIToolboxVersion">461.00</string>
<object class="NSMutableDictionary" key="IBDocument.PluginVersions">
<string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="NS.object.0">823</string>
<string key="NS.object.0">851</string>
</object>
<object class="NSMutableArray" key="IBDocument.EditedObjectIDs">
<bool key="EncodedWithXMLCoder">YES</bool>
@@ -34,10 +34,6 @@
<string key="NSClassName">NSApplication</string>
</object>
<object class="NSUserDefaultsController" id="75941798">
<object class="NSMutableArray" key="NSDeclaredKeys">
<bool key="EncodedWithXMLCoder">YES</bool>
<string>DebugMode</string>
</object>
<bool key="NSSharedInstance">YES</bool>
</object>
<object class="NSWindowTemplate" id="489014306">
@@ -273,6 +269,16 @@
<string key="NSAction">_popUpItemAction:</string>
<reference key="NSTarget" ref="63752222"/>
</object>
<object class="NSMenuItem" id="510059249">
<reference key="NSMenu" ref="38553798"/>
<string key="NSTitle">Folders</string>
<string key="NSKeyEquiv"/>
<int key="NSMnemonicLoc">2147483647</int>
<reference key="NSOnImage" ref="1002480020"/>
<reference key="NSMixedImage" ref="394002035"/>
<string key="NSAction">_popUpItemAction:</string>
<reference key="NSTarget" ref="63752222"/>
</object>
</object>
</object>
<int key="NSPreferredEdge">3</int>
@@ -1372,6 +1378,7 @@
<bool key="EncodedWithXMLCoder">YES</bool>
<reference ref="101272617"/>
<reference ref="352817522"/>
<reference ref="510059249"/>
</object>
<reference key="parent" ref="63752222"/>
</object>
@@ -1657,6 +1664,11 @@
<reference key="object" ref="236967908"/>
<reference key="parent" ref="727223254"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">149</int>
<reference key="object" ref="510059249"/>
<reference key="parent" ref="38553798"/>
</object>
</object>
</object>
<object class="NSMutableDictionary" key="flattenedProperties">
@@ -1688,6 +1700,7 @@
<string>145.IBViewBoundsToFrameTransform</string>
<string>145.ImportedFromIB2</string>
<string>146.IBPluginDependency</string>
<string>149.IBPluginDependency</string>
<string>51.IBPluginDependency</string>
<string>51.ImportedFromIB2</string>
<string>52.IBEditorWindowLastContentRect</string>
@@ -1747,6 +1760,7 @@
<string>76.IBPluginDependency</string>
<string>77.IBPluginDependency</string>
<string>78.IBPluginDependency</string>
<string>79.IBEditorWindowLastContentRect</string>
<string>79.IBPluginDependency</string>
<string>79.ImportedFromIB2</string>
<string>80.IBPluginDependency</string>
@@ -1815,6 +1829,7 @@
<boolean value="YES"/>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<boolean value="YES"/>
<string>{{88, 520}, {389, 325}}</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
@@ -1887,6 +1902,7 @@
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>{{216, 742}, {216, 63}}</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<boolean value="YES"/>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
@@ -1936,7 +1952,7 @@
</object>
</object>
<nil key="sourceID"/>
<int key="maxID">148</int>
<int key="maxID">149</int>
</object>
<object class="IBClassDescriber" key="IBDocument.Classes">
<object class="NSMutableArray" key="referencedPartialClassDescriptions">

View File

@@ -72,4 +72,7 @@
"142.title" = "Ignorer doublons avec hardlink vers le même fichier";
/* Class = "NSButtonCell"; title = "Debug mode (restart required)"; ObjectID = "146"; */
"146.title" = "Mode de déboguage (redémarrage requis)";
"146.title" = "Mode de déboguage (redémarrage requis)";
/* Class = "NSMenuItem"; title = "Folders"; ObjectID = "149"; */
"149.title" = "Dossiers";

View File

@@ -2,13 +2,13 @@
<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="7.10">
<data>
<int key="IBDocument.SystemTarget">1050</int>
<string key="IBDocument.SystemVersion">10J567</string>
<string key="IBDocument.InterfaceBuilderVersion">823</string>
<string key="IBDocument.SystemVersion">10J869</string>
<string key="IBDocument.InterfaceBuilderVersion">851</string>
<string key="IBDocument.AppKitVersion">1038.35</string>
<string key="IBDocument.HIToolboxVersion">462.00</string>
<string key="IBDocument.HIToolboxVersion">461.00</string>
<object class="NSMutableDictionary" key="IBDocument.PluginVersions">
<string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="NS.object.0">823</string>
<string key="NS.object.0">851</string>
</object>
<object class="NSMutableArray" key="IBDocument.EditedObjectIDs">
<bool key="EncodedWithXMLCoder">YES</bool>
@@ -268,6 +268,16 @@
<string key="NSAction">_popUpItemAction:</string>
<reference key="NSTarget" ref="63752222"/>
</object>
<object class="NSMenuItem" id="510059249">
<reference key="NSMenu" ref="38553798"/>
<string key="NSTitle">Dossiers</string>
<string key="NSKeyEquiv"/>
<int key="NSMnemonicLoc">2147483647</int>
<reference key="NSOnImage" ref="1002480020"/>
<reference key="NSMixedImage" ref="394002035"/>
<string key="NSAction">_popUpItemAction:</string>
<reference key="NSTarget" ref="63752222"/>
</object>
</object>
</object>
<int key="NSPreferredEdge">3</int>
@@ -290,7 +300,7 @@
<reference key="NSControlView" ref="637819333"/>
<int key="NSButtonFlags">1211912703</int>
<int key="NSButtonFlags2">2</int>
<object class="NSCustomResource" key="NSNormalImage" id="587167894">
<object class="NSCustomResource" key="NSNormalImage" id="266862978">
<string key="NSClassName">NSImage</string>
<string key="NSResourceName">NSSwitch</string>
</object>
@@ -317,7 +327,7 @@
<reference key="NSControlView" ref="1067721243"/>
<int key="NSButtonFlags">1211912703</int>
<int key="NSButtonFlags2">2</int>
<reference key="NSNormalImage" ref="587167894"/>
<reference key="NSNormalImage" ref="266862978"/>
<reference key="NSAlternateImage" ref="589920880"/>
<string key="NSAlternateContents"/>
<string key="NSKeyEquivalent"/>
@@ -339,7 +349,7 @@
<reference key="NSControlView" ref="290008886"/>
<int key="NSButtonFlags">1211912703</int>
<int key="NSButtonFlags2">2</int>
<reference key="NSNormalImage" ref="587167894"/>
<reference key="NSNormalImage" ref="266862978"/>
<reference key="NSAlternateImage" ref="589920880"/>
<string key="NSAlternateContents"/>
<string key="NSKeyEquivalent"/>
@@ -361,7 +371,7 @@
<reference key="NSControlView" ref="551239185"/>
<int key="NSButtonFlags">1211912703</int>
<int key="NSButtonFlags2">2</int>
<reference key="NSNormalImage" ref="587167894"/>
<reference key="NSNormalImage" ref="266862978"/>
<reference key="NSAlternateImage" ref="589920880"/>
<string key="NSAlternateContents"/>
<string key="NSKeyEquivalent"/>
@@ -383,7 +393,7 @@
<reference key="NSControlView" ref="208488736"/>
<int key="NSButtonFlags">1211912703</int>
<int key="NSButtonFlags2">2</int>
<reference key="NSNormalImage" ref="587167894"/>
<reference key="NSNormalImage" ref="266862978"/>
<reference key="NSAlternateImage" ref="589920880"/>
<string key="NSAlternateContents"/>
<string key="NSKeyEquivalent"/>
@@ -405,7 +415,7 @@
<reference key="NSControlView" ref="427690895"/>
<int key="NSButtonFlags">1211912703</int>
<int key="NSButtonFlags2">2</int>
<reference key="NSNormalImage" ref="587167894"/>
<reference key="NSNormalImage" ref="266862978"/>
<reference key="NSAlternateImage" ref="589920880"/>
<string key="NSAlternateContents"/>
<string key="NSKeyEquivalent"/>
@@ -621,7 +631,7 @@
<reference key="NSControlView" ref="724127338"/>
<int key="NSButtonFlags">1211912703</int>
<int key="NSButtonFlags2">2</int>
<reference key="NSNormalImage" ref="587167894"/>
<reference key="NSNormalImage" ref="266862978"/>
<reference key="NSAlternateImage" ref="589920880"/>
<string key="NSAlternateContents"/>
<string key="NSKeyEquivalent"/>
@@ -643,7 +653,7 @@
<reference key="NSControlView" ref="647216699"/>
<int key="NSButtonFlags">1211912703</int>
<int key="NSButtonFlags2">2</int>
<reference key="NSNormalImage" ref="587167894"/>
<reference key="NSNormalImage" ref="266862978"/>
<reference key="NSAlternateImage" ref="589920880"/>
<string key="NSAlternateContents"/>
<string key="NSKeyEquivalent"/>
@@ -665,7 +675,7 @@
<reference key="NSControlView" ref="727223254"/>
<int key="NSButtonFlags">1211912703</int>
<int key="NSButtonFlags2">2</int>
<reference key="NSNormalImage" ref="587167894"/>
<reference key="NSNormalImage" ref="266862978"/>
<reference key="NSAlternateImage" ref="589920880"/>
<string key="NSAlternateContents"/>
<string key="NSKeyEquivalent"/>
@@ -1378,6 +1388,7 @@
<bool key="EncodedWithXMLCoder">YES</bool>
<reference ref="101272617"/>
<reference ref="352817522"/>
<reference ref="510059249"/>
</object>
<reference key="parent" ref="63752222"/>
</object>
@@ -1663,6 +1674,11 @@
<reference key="object" ref="236967908"/>
<reference key="parent" ref="727223254"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">149</int>
<reference key="object" ref="510059249"/>
<reference key="parent" ref="38553798"/>
</object>
</object>
</object>
<object class="NSMutableDictionary" key="flattenedProperties">
@@ -1694,6 +1710,7 @@
<string>145.IBViewBoundsToFrameTransform</string>
<string>145.ImportedFromIB2</string>
<string>146.IBPluginDependency</string>
<string>149.IBPluginDependency</string>
<string>51.IBPluginDependency</string>
<string>51.ImportedFromIB2</string>
<string>52.IBEditorWindowLastContentRect</string>
@@ -1754,6 +1771,7 @@
<string>76.IBPluginDependency</string>
<string>77.IBPluginDependency</string>
<string>78.IBPluginDependency</string>
<string>79.IBEditorWindowLastContentRect</string>
<string>79.IBPluginDependency</string>
<string>79.ImportedFromIB2</string>
<string>80.IBPluginDependency</string>
@@ -1822,6 +1840,7 @@
<boolean value="YES"/>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<boolean value="YES"/>
<string>{{88, 520}, {389, 325}}</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
@@ -1895,6 +1914,7 @@
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>{{216, 742}, {216, 63}}</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<boolean value="YES"/>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
@@ -1944,7 +1964,7 @@
</object>
</object>
<nil key="sourceID"/>
<int key="maxID">148</int>
<int key="maxID">149</int>
</object>
<object class="IBClassDescriber" key="IBDocument.Classes">
<object class="NSMutableArray" key="referencedPartialClassDescriptions">

View File

@@ -1,5 +1,5 @@
/*
Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
Copyright 2011 Hardcoded Software (http://www.hardcoded.net)
This software is licensed under the "BSD" License as described in the "LICENSE" file,
which should be included with this package. The terms are also available at

View File

@@ -1,7 +1,7 @@
# -*- coding: utf-8 -*-
# Created By: Virgil Dupras
# Created On: 2009-12-30
# Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
# Copyright 2011 Hardcoded Software (http://www.hardcoded.net)
#
# This software is licensed under the "BSD" License as described in the "LICENSE" file,
# which should be included with this package. The terms are also available at

View File

@@ -1,6 +1,6 @@
# Created By: Virgil Dupras
# Created On: 2006/11/11
# Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
# Copyright 2011 Hardcoded Software (http://www.hardcoded.net)
#
# This software is licensed under the "BSD" License as described in the "LICENSE" file,
# which should be included with this package. The terms are also available at
@@ -92,9 +92,13 @@ class DupeGuru(RegistrableApplication, Broadcaster):
logging.warning("Exception on GetDisplayInfo for %s: %s", str(dupe.path), str(e))
return ['---'] * len(self.data.COLUMNS)
def _create_file(self, path):
# We add fs.Folder to fileclasses in case the file we're loading contains folder paths.
return fs.get_file(path, self.directories.fileclasses + [fs.Folder])
def _get_file(self, str_path):
path = Path(str_path)
f = fs.get_file(path, self.directories.fileclasses)
f = self._create_file(path)
if f is None:
return None
try:
@@ -197,12 +201,7 @@ class DupeGuru(RegistrableApplication, Broadcaster):
while delete_if_empty(path, ['.DS_Store']):
path = path[:-1]
def copy_or_move(self, dupe, copy, destination, dest_type):
"""
copy: True = Copy False = Move
destination: string.
dest_type: DestType constants
"""
def copy_or_move(self, dupe, copy: bool, destination: str, dest_type: DestType):
source_path = dupe.path
location_path = first(p for p in self.directories if dupe.path in p)
dest_path = Path(destination)
@@ -214,6 +213,9 @@ class DupeGuru(RegistrableApplication, Broadcaster):
dest_path = dest_path + source_base
if not io.exists(dest_path):
io.makedirs(dest_path)
# Add filename to dest_path. For file move/copy, it's not required, but for folders, yes.
dest_path = dest_path + source_path[-1]
logging.debug("Copy/Move operation from '%s' to '%s'", source_path, dest_path)
# Raises an EnvironmentError if there's a problem
if copy:
smart_copy(source_path, dest_path)
@@ -368,7 +370,10 @@ class DupeGuru(RegistrableApplication, Broadcaster):
def start_scanning(self):
def do(j):
j.set_progress(0, tr("Collecting files to scan"))
files = list(self.directories.get_files())
if self.scanner.scan_type == scanner.ScanType.Folders:
files = list(self.directories.get_folders())
else:
files = list(self.directories.get_files())
if self.options['ignore_hardlink_matches']:
files = self._remove_hardlink_dupes(files)
logging.info('Scanning %d files' % len(files))

View File

@@ -1,6 +1,6 @@
# Created By: Virgil Dupras
# Created On: 2006/11/11
# Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
# Copyright 2011 Hardcoded Software (http://www.hardcoded.net)
#
# This software is licensed under the "BSD" License as described in the "LICENSE" file,
# which should be included with this package. The terms are also available at

View File

@@ -1,6 +1,6 @@
# Created By: Virgil Dupras
# Created On: 2010-02-02
# Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
# Copyright 2011 Hardcoded Software (http://www.hardcoded.net)
#
# This software is licensed under the "BSD" License as described in the "LICENSE" file,
# which should be included with this package. The terms are also available at

View File

@@ -1,6 +1,6 @@
# Created By: Virgil Dupras
# Created On: 2006/03/15
# Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
# Copyright 2011 Hardcoded Software (http://www.hardcoded.net)
#
# This software is licensed under the "BSD" License as described in the "LICENSE" file,
# which should be included with this package. The terms are also available at
@@ -14,9 +14,6 @@ import time
Column = namedtuple('Column', 'attr display')
def format_path(p):
return str(p[:-1])
def format_timestamp(t, delta):
if delta:
return format_time_decimal(t)

View File

@@ -1,6 +1,6 @@
# Created By: Virgil Dupras
# Created On: 2006/02/27
# Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
# Copyright 2011 Hardcoded Software (http://www.hardcoded.net)
#
# This software is licensed under the "BSD" License as described in the "LICENSE" file,
# which should be included with this package. The terms are also available at
@@ -15,9 +15,10 @@ from hscommon.util import FileOrPath
from . import fs
(STATE_NORMAL,
STATE_REFERENCE,
STATE_EXCLUDED) = range(3)
class DirectoryState:
Normal = 0
Reference = 1
Excluded = 2
class AlreadyThereError(Exception):
"""The path being added is already in the directory list"""
@@ -51,11 +52,11 @@ class Directories:
def _default_state_for_path(self, path):
# Override this in subclasses to specify the state of some special folders.
if path[-1].startswith('.'): # hidden
return STATE_EXCLUDED
return DirectoryState.Excluded
def _get_files(self, from_path):
state = self.get_state(from_path)
if state == STATE_EXCLUDED:
if state == DirectoryState.Excluded:
# Recursively get files from folders with lots of subfolder is expensive. However, there
# might be a subfolder in this path that is not excluded. What we want to do is to skim
# through self.states and see if we must continue, or we can stop right here to save time
@@ -63,11 +64,11 @@ class Directories:
return
try:
filepaths = set()
if state != STATE_EXCLUDED:
if state != DirectoryState.Excluded:
found_files = fs.get_files(from_path, fileclasses=self.fileclasses)
logging.debug("Collected {} files in folder {}".format(len(found_files), str(from_path)))
logging.debug("Collected %d files in folder %s", len(found_files), str(from_path))
for file in found_files:
file.is_ref = state == STATE_REFERENCE
file.is_ref = state == DirectoryState.Reference
filepaths.add(file.path)
yield file
subpaths = [from_path + name for name in io.listdir(from_path)]
@@ -79,6 +80,19 @@ class Directories:
except (EnvironmentError, fs.InvalidPath):
pass
def _get_folders(self, from_folder):
try:
for subfolder in from_folder.subfolders:
for folder in self._get_folders(subfolder):
yield folder
state = self.get_state(from_folder.path)
if state != DirectoryState.Excluded:
from_folder.is_ref = state == DirectoryState.Reference
logging.debug("Yielding Folder %r state: %d", from_folder, state)
yield from_folder
except (EnvironmentError, fs.InvalidPath):
pass
#---Public
def add_path(self, path):
"""Adds 'path' to self, if not already there.
@@ -113,6 +127,16 @@ class Directories:
for file in self._get_files(path):
yield file
def get_folders(self):
"""Returns a list of all folders that are not excluded.
Returned folders also have their 'is_ref' attr set.
"""
for path in self._dirs:
from_folder = fs.Folder(path)
for folder in self._get_folders(from_folder):
yield folder
def get_state(self, path):
"""Returns the state of 'path' (One of the STATE_* const.)
"""
@@ -125,7 +149,7 @@ class Directories:
if parent in self:
return self.get_state(parent)
else:
return STATE_NORMAL
return DirectoryState.Normal
def has_any_file(self):
try:

View File

@@ -1,6 +1,6 @@
# Created By: Virgil Dupras
# Created On: 2006/01/29
# Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
# Copyright 2011 Hardcoded Software (http://www.hardcoded.net)
#
# This software is licensed under the "BSD" License as described in the "LICENSE" file,
# which should be included with this package. The terms are also available at

View File

@@ -1,6 +1,6 @@
# Created By: Virgil Dupras
# Created On: 2006/09/16
# Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
# Copyright 2011 Hardcoded Software (http://www.hardcoded.net)
#
# This software is licensed under the "BSD" License as described in the "LICENSE" file,
# which should be included with this package. The terms are also available at

View File

@@ -1,6 +1,6 @@
# Created By: Virgil Dupras
# Created On: 2009-10-22
# Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
# Copyright 2011 Hardcoded Software (http://www.hardcoded.net)
#
# This software is licensed under the "BSD" License as described in the "LICENSE" file,
# which should be included with this package. The terms are also available at
@@ -63,6 +63,9 @@ class File:
self._md5partial_offset = 0x4000 #16Kb
self._md5partial_size = 0x4000 #16Kb
def __repr__(self):
return "<{} {}>".format(self.__class__.__name__, str(self.path))
def __getattr__(self, attrname):
# Only called when attr is not there
if attrname in self.INITIAL_INFO:
@@ -146,6 +149,57 @@ class File:
def name(self):
return self.path[-1]
@property
def folder_path(self):
return self.path[:-1]
class Folder(File):
"""A wrapper around a folder path.
It has the size/md5 info of a File, but it's value are the sum of its subitems.
"""
def __init__(self, path):
File.__init__(self, path)
self._subfolders = None
def _all_items(self):
folders = self.subfolders
files = get_files(self.path)
return folders + files
def _read_info(self, field):
if field in {'size', 'mtime'}:
size = sum((f.size for f in self._all_items()), 0)
self.size = size
stats = io.stat(self.path)
self.mtime = nonone(stats.st_mtime, 0)
elif field in {'md5', 'md5partial'}:
# What's sensitive here is that we must make sure that subfiles'
# md5 are always added up in the same order, but we also want a
# different md5 if a file gets moved in a different subdirectory.
def get_dir_md5_concat():
items = self._all_items()
items.sort(key=lambda f:f.path)
md5s = [getattr(f, field) for f in items]
return b''.join(md5s)
md5 = hashlib.md5(get_dir_md5_concat())
digest = md5.digest()
setattr(self, field, digest)
@property
def subfolders(self):
if self._subfolders is None:
subpaths = [self.path + name for name in io.listdir(self.path)]
subfolders = [p for p in subpaths if not io.islink(p) and io.isdir(p)]
self._subfolders = [Folder(p) for p in subfolders]
return self._subfolders
@classmethod
def can_handle(cls, path):
return not io.islink(path) and io.isdir(path)
def get_file(path, fileclasses=[File]):
for fileclass in fileclasses:
@@ -172,12 +226,3 @@ def get_files(path, fileclasses=[File]):
return result
except EnvironmentError:
raise InvalidPath(path)
def get_all_files(path, fileclasses=[File]):
files = get_files(path, fileclasses=fileclasses)
filepaths = set(f.path for f in files)
subpaths = [path + name for name in io.listdir(path)]
# it's possible that a folder (bundle) gets into the file list. in that case, we don't want to recurse into it
subfolders = [p for p in subpaths if not io.islink(p) and io.isdir(p) and p not in filepaths]
subfiles = flatten(get_all_files(subpath, fileclasses=fileclasses) for subpath in subfolders)
return subfiles + files

View File

@@ -1,7 +1,7 @@
# -*- coding: utf-8 -*-
# Created By: Virgil Dupras
# Created On: 2010-02-06
# Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
# Copyright 2011 Hardcoded Software (http://www.hardcoded.net)
#
# This software is licensed under the "BSD" License as described in the "LICENSE" file,
# which should be included with this package. The terms are also available at

View File

@@ -1,7 +1,7 @@
# -*- coding: utf-8 -*-
# Created By: Virgil Dupras
# Created On: 2010-02-05
# Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
# Copyright 2011 Hardcoded Software (http://www.hardcoded.net)
#
# This software is licensed under the "BSD" License as described in the "LICENSE" file,
# which should be included with this package. The terms are also available at

View File

@@ -1,7 +1,6 @@
# -*- coding: utf-8 -*-
# Created By: Virgil Dupras
# Created On: 2010-02-06
# Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
# Copyright 2011 Hardcoded Software (http://www.hardcoded.net)
#
# This software is licensed under the "BSD" License as described in the "LICENSE" file,
# which should be included with this package. The terms are also available at
@@ -9,19 +8,19 @@
from hscommon.gui.tree import Tree, Node
from ..directories import STATE_NORMAL, STATE_REFERENCE, STATE_EXCLUDED
from ..directories import DirectoryState
from .base import GUIObject
STATE_ORDER = [STATE_NORMAL, STATE_REFERENCE, STATE_EXCLUDED]
STATE_ORDER = [DirectoryState.Normal, DirectoryState.Reference, DirectoryState.Excluded]
# Lazily loads children
class DirectoryNode(Node):
def __init__(self, app, path, name):
def __init__(self, tree, path, name):
Node.__init__(self, name)
self._app = app
self._tree = tree
self._directory_path = path
self._loaded = False
self._state = STATE_ORDER.index(self._app.directories.get_state(path))
self._state = STATE_ORDER.index(self._tree.app.directories.get_state(path))
def __len__(self):
if not self._loaded:
@@ -30,9 +29,9 @@ class DirectoryNode(Node):
def _load(self):
self.clear()
subpaths = self._app.directories.get_subfolders(self._directory_path)
subpaths = self._tree.app.directories.get_subfolders(self._directory_path)
for path in subpaths:
self.append(DirectoryNode(self._app, path, path[-1]))
self.append(DirectoryNode(self._tree, path, path[-1]))
self._loaded = True
# The state propery is an index to the combobox
@@ -46,7 +45,9 @@ class DirectoryNode(Node):
return
self._state = value
state = STATE_ORDER[value]
self._app.directories.set_state(self._directory_path, state)
self._tree.app.directories.set_state(self._directory_path, state)
self._tree._refresh()
self._tree.view.refresh()
class DirectoryTree(GUIObject, Tree):
@@ -62,7 +63,7 @@ class DirectoryTree(GUIObject, Tree):
def _refresh(self):
self.clear()
for path in self.app.directories:
self.append(DirectoryNode(self.app, path, str(path)))
self.append(DirectoryNode(self, path, str(path)))
def add_directory(self, path):
self.app.add_directory(path)

View File

@@ -1,7 +1,7 @@
# -*- coding: utf-8 -*-
# Created By: Virgil Dupras
# Created On: 2010-04-12
# Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
# Copyright 2011 Hardcoded Software (http://www.hardcoded.net)
#
# This software is licensed under the "BSD" License as described in the "LICENSE" file,
# which should be included with this package. The terms are also available at

View File

@@ -1,7 +1,7 @@
# -*- coding: utf-8 -*-
# Created By: Virgil Dupras
# Created On: 2010-04-12
# Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
# Copyright 2011 Hardcoded Software (http://www.hardcoded.net)
#
# This software is licensed under the "BSD" License as described in the "LICENSE" file,
# which should be included with this package. The terms are also available at

View File

@@ -1,7 +1,7 @@
# -*- coding: utf-8 -*-
# Created By: Virgil Dupras
# Created On: 2010-02-11
# Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
# Copyright 2011 Hardcoded Software (http://www.hardcoded.net)
#
# This software is licensed under the "BSD" License as described in the "LICENSE" file,
# which should be included with this package. The terms are also available at
@@ -102,6 +102,10 @@ class ResultTable(GUIObject, GUITable):
def rename_selected(self, newname):
row = self.selected_row
if row is None:
# There's all kinds of way the current row can be swept off during rename. When it
# happens, selected_row will be None.
return False
row._data = None
row._data_delta = None
return self.app.rename_selected(newname)

View File

@@ -1,7 +1,7 @@
# -*- coding: utf-8 -*-
# Created By: Virgil Dupras
# Created On: 2010-02-11
# Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
# Copyright 2011 Hardcoded Software (http://www.hardcoded.net)
#
# This software is licensed under the "BSD" License as described in the "LICENSE" file,
# which should be included with this package. The terms are also available at

View File

@@ -1,6 +1,6 @@
# Created By: Virgil Dupras
# Created On: 2006/05/02
# Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
# Copyright 2011 Hardcoded Software (http://www.hardcoded.net)
#
# This software is licensed under the "BSD" License as described in the "LICENSE" file,
# which should be included with this package. The terms are also available at

View File

@@ -1,6 +1,6 @@
# Created By: Virgil Dupras
# Created On: 2006/02/23
# Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
# Copyright 2011 Hardcoded Software (http://www.hardcoded.net)
#
# This software is licensed under the "BSD" License as described in the "LICENSE" file,
# which should be included with this package. The terms are also available at
@@ -8,10 +8,13 @@
import logging
import re
import os
import os.path as op
from xml.etree import ElementTree as ET
from . import engine
from jobprogress.job import nulljob
from hscommon.conflict import get_conflicted_name
from hscommon.markable import Markable
from hscommon.util import flatten, nonone, FileOrPath, format_size
from hscommon.trans import tr
@@ -304,22 +307,34 @@ class Results(Markable):
match_elem.set('second', str(dupe2index[match.second]))
match_elem.set('percentage', str(int(match.percentage)))
tree = ET.ElementTree(root)
with FileOrPath(outfile, 'wb') as fp:
tree.write(fp, encoding='utf-8')
def do_write(outfile):
with FileOrPath(outfile, 'wb') as fp:
tree.write(fp, encoding='utf-8')
try:
do_write(outfile)
except IOError as e:
if e.errno == 21: # outfile is a directory
p = str(outfile)
dirname, basename = op.split(p)
otherfiles = os.listdir(dirname)
newname = get_conflicted_name(otherfiles, basename)
do_write(op.join(dirname, newname))
else:
raise
self.is_modified = False
def sort_dupes(self, key, asc=True, delta=False):
if not self.__dupes:
self.__get_dupe_list()
self.__dupes.sort(key=lambda d: self.data.GetDupeSortKey(d, lambda: self.get_group_of_duplicate(d), key, delta))
if not asc:
self.__dupes.reverse()
keyfunc = lambda d: self.data.GetDupeSortKey(d, lambda: self.get_group_of_duplicate(d), key, delta)
self.__dupes.sort(key=keyfunc, reverse=not asc)
self.__dupes_sort_descriptor = (key,asc,delta)
def sort_groups(self,key,asc=True):
self.groups.sort(key=lambda g: self.data.GetGroupSortKey(g, key))
if not asc:
self.groups.reverse()
keyfunc = lambda g: self.data.GetGroupSortKey(g, key)
self.groups.sort(key=keyfunc, reverse=not asc)
self.__groups_sort_descriptor = (key,asc)
#---Properties

View File

@@ -1,6 +1,6 @@
# Created By: Virgil Dupras
# Created On: 2006/03/03
# Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
# Copyright 2011 Hardcoded Software (http://www.hardcoded.net)
#
# This software is licensed under the "BSD" License as described in the "LICENSE" file,
# which should be included with this package. The terms are also available at
@@ -17,14 +17,22 @@ from hscommon.trans import tr
from . import engine
from .ignore import IgnoreList
# It's quite ugly to have scan types from all editions all put in the same class, but because there's
# there will be some nasty bugs popping up (ScanType is used in core when in should exclusively be
# used in core_*). One day I'll clean this up.
class ScanType:
Filename = 0
Fields = 1
FieldsNoOrder = 2
Tag = 3
# number 4 is obsolete
Folders = 4
Contents = 5
ContentsAudio = 6
#PE
FuzzyBlock = 10
ExifTimestamp = 11
SCANNABLE_TAGS = ['track', 'artist', 'album', 'title', 'genre', 'year']
@@ -48,8 +56,8 @@ class Scanner:
for f in j.iter_with_progress(files, tr("Read size of %d/%d files")):
f.size # pre-read, makes a smoother progress if read here (especially for bundles)
files = [f for f in files if f.size >= self.size_threshold]
if self.scan_type in (ScanType.Contents, ScanType.ContentsAudio):
sizeattr = 'size' if self.scan_type == ScanType.Contents else 'audiosize'
if self.scan_type in {ScanType.Contents, ScanType.ContentsAudio, ScanType.Folders}:
sizeattr = 'audiosize' if self.scan_type == ScanType.ContentsAudio else 'size'
return engine.getmatches_by_contents(files, sizeattr, partial=self.scan_type==ScanType.ContentsAudio, j=j)
else:
j = j.start_subjob([2, 8])
@@ -92,10 +100,22 @@ class Scanner:
j = j.start_subjob([8, 2])
for f in [f for f in files if not hasattr(f, 'is_ref')]:
f.is_ref = False
logging.info('Getting matches')
logging.info("Getting matches. Scan type: %d", self.scan_type)
matches = self._getmatches(files, j)
logging.info('Found %d matches' % len(matches))
j.set_progress(100, tr("Removing false matches"))
if self.scan_type == ScanType.Folders and matches:
allpath = {m.first.path for m in matches}
allpath |= {m.second.path for m in matches}
sortedpaths = sorted(allpath)
toremove = set()
last_parent_path = sortedpaths[0]
for p in sortedpaths[1:]:
if p in last_parent_path:
toremove.add(p)
else:
last_parent_path = p
matches = [m for m in matches if m.first.path not in toremove or m.second.path not in toremove]
if not self.mix_file_kind:
matches = [m for m in matches if get_file_ext(m.first.name) == get_file_ext(m.second.name)]
matches = [m for m in matches if io.exists(m.first.path) and io.exists(m.second.path)]

View File

@@ -1,6 +1,6 @@
# Created By: Virgil Dupras
# Created On: 2007-06-23
# Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
# Copyright 2011 Hardcoded Software (http://www.hardcoded.net)
#
# This software is licensed under the "BSD" License as described in the "LICENSE" file,
# which should be included with this package. The terms are also available at
@@ -91,8 +91,8 @@ class TestCaseDupeGuru:
dgapp.copy_or_move(f, True, 'some_destination', 0)
eq_(1, len(hscommon.conflict.smart_copy.calls))
call = hscommon.conflict.smart_copy.calls[0]
eq_('some_destination', call['dest_path'])
eq_(f.path, call['source_path'])
eq_(call['dest_path'], op.join('some_destination', 'foo'))
eq_(call['source_path'], f.path)
def test_copy_or_move_clean_empty_dirs(self, tmpdir, monkeypatch):
tmppath = Path(str(tmpdir))
@@ -136,6 +136,14 @@ class TestCaseDupeGuru:
app.start_scanning()
eq_(len(app.results.groups), 0)
def test_rename_when_nothing_is_selected(self):
# Issue #140
# It's possible that rename operation has its selected row swept off from under it, thus
# making the selected row None. Don't crash when it happens.
dgapp = DupeGuru()
rtable = ResultTable(CallLogger(), dgapp)
# selected_row is None because there's no result.
assert not rtable.rename_selected('foo') # no crash
class TestCaseDupeGuru_clean_empty_dirs:
def pytest_funcarg__do_setup(self, request):
@@ -462,3 +470,31 @@ class TestCaseDupeGuru_renameSelected:
assert 'foo bar 2' in names
eq_(g.dupes[0].name, 'foo bar 2')
class TestAppWithDirectoriesInTree:
def pytest_funcarg__do_setup(self, request):
tmpdir = request.getfuncargvalue('tmpdir')
p = Path(str(tmpdir))
io.mkdir(p + 'sub1')
io.mkdir(p + 'sub2')
io.mkdir(p + 'sub3')
self.app = DupeGuru()
self.dtree_gui = CallLogger()
self.dtree = DirectoryTree(self.dtree_gui, self.app)
self.dtree.connect()
self.dtree.add_directory(p)
self.dtree_gui.clear_calls()
def test_set_root_as_ref_makes_subfolders_ref_as_well(self, do_setup):
# Setting a node state to something also affect subnodes. These subnodes must be correctly
# refreshed.
node = self.dtree[0]
eq_(len(node), 3) # a len() call is required for subnodes to be loaded
subnode = node[0]
node.state = 1 # the state property is a state index
node = self.dtree[0]
eq_(len(node), 3)
subnode = node[0]
eq_(subnode.state, 1)
self.dtree_gui.check_gui_calls(['refresh'])

View File

@@ -1,6 +1,6 @@
# Created By: Virgil Dupras
# Created On: 2009-10-23
# Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
# Copyright 2011 Hardcoded Software (http://www.hardcoded.net)
#
# This software is licensed under the "BSD" License as described in the "LICENSE" file,
# which should be included with this package. The terms are also available at
@@ -9,11 +9,11 @@
# data module for tests
from hscommon.util import format_size
from ..data import format_path, cmp_value, Column
from ..data import cmp_value, Column
COLUMNS = [
Column('name', 'Filename'),
Column('path', 'Directory'),
Column('folder_path', 'Directory'),
Column('size', 'Size (KB)'),
Column('extension', 'Kind'),
]
@@ -29,7 +29,7 @@ def GetDisplayInfo(dupe, group, delta):
size -= r.size
return [
dupe.name,
format_path(dupe.path),
str(dupe.folder_path),
format_size(size, 0, 1, False),
dupe.extension if hasattr(dupe, 'extension') else '---',
]

View File

@@ -1,6 +1,6 @@
# Created By: Virgil Dupras
# Created On: 2006/02/27
# Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
# Copyright 2011 Hardcoded Software (http://www.hardcoded.net)
#
# This software is licensed under the "BSD" License as described in the "LICENSE" file,
# which should be included with this package. The terms are also available at
@@ -122,52 +122,52 @@ def test_states():
d = Directories()
p = testpath + 'onefile'
d.add_path(p)
eq_(STATE_NORMAL,d.get_state(p))
d.set_state(p,STATE_REFERENCE)
eq_(STATE_REFERENCE,d.get_state(p))
eq_(STATE_REFERENCE,d.get_state(p + 'dir1'))
eq_(DirectoryState.Normal ,d.get_state(p))
d.set_state(p, DirectoryState.Reference)
eq_(DirectoryState.Reference ,d.get_state(p))
eq_(DirectoryState.Reference ,d.get_state(p + 'dir1'))
eq_(1,len(d.states))
eq_(p,list(d.states.keys())[0])
eq_(STATE_REFERENCE,d.states[p])
eq_(DirectoryState.Reference ,d.states[p])
def test_get_state_with_path_not_there():
# When the path's not there, just return STATE_NORMAL
# When the path's not there, just return DirectoryState.Normal
d = Directories()
d.add_path(testpath + 'onefile')
eq_(d.get_state(testpath), STATE_NORMAL)
eq_(d.get_state(testpath), DirectoryState.Normal)
def test_states_remain_when_larger_directory_eat_smaller_ones():
d = Directories()
p = testpath + 'onefile'
d.add_path(p)
d.set_state(p,STATE_EXCLUDED)
d.set_state(p, DirectoryState.Excluded)
d.add_path(testpath)
d.set_state(testpath,STATE_REFERENCE)
eq_(STATE_EXCLUDED,d.get_state(p))
eq_(STATE_EXCLUDED,d.get_state(p + 'dir1'))
eq_(STATE_REFERENCE,d.get_state(testpath))
d.set_state(testpath, DirectoryState.Reference)
eq_(DirectoryState.Excluded ,d.get_state(p))
eq_(DirectoryState.Excluded ,d.get_state(p + 'dir1'))
eq_(DirectoryState.Reference ,d.get_state(testpath))
def test_set_state_keep_state_dict_size_to_minimum():
d = Directories()
p = testpath + 'fs'
d.add_path(p)
d.set_state(p,STATE_REFERENCE)
d.set_state(p + 'dir1',STATE_REFERENCE)
d.set_state(p, DirectoryState.Reference)
d.set_state(p + 'dir1', DirectoryState.Reference)
eq_(1,len(d.states))
eq_(STATE_REFERENCE,d.get_state(p + 'dir1'))
d.set_state(p + 'dir1',STATE_NORMAL)
eq_(DirectoryState.Reference ,d.get_state(p + 'dir1'))
d.set_state(p + 'dir1', DirectoryState.Normal)
eq_(2,len(d.states))
eq_(STATE_NORMAL,d.get_state(p + 'dir1'))
d.set_state(p + 'dir1',STATE_REFERENCE)
eq_(DirectoryState.Normal ,d.get_state(p + 'dir1'))
d.set_state(p + 'dir1', DirectoryState.Reference)
eq_(1,len(d.states))
eq_(STATE_REFERENCE,d.get_state(p + 'dir1'))
eq_(DirectoryState.Reference ,d.get_state(p + 'dir1'))
def test_get_files():
d = Directories()
p = testpath + 'fs'
d.add_path(p)
d.set_state(p + 'dir1',STATE_REFERENCE)
d.set_state(p + 'dir2',STATE_EXCLUDED)
d.set_state(p + 'dir1', DirectoryState.Reference)
d.set_state(p + 'dir2', DirectoryState.Excluded)
files = list(d.get_files())
eq_(5, len(files))
for f in files:
@@ -176,11 +176,26 @@ def test_get_files():
else:
assert not f.is_ref
def test_get_folders():
d = Directories()
p = testpath + 'fs'
d.add_path(p)
d.set_state(p + 'dir1', DirectoryState.Reference)
d.set_state(p + 'dir2', DirectoryState.Excluded)
folders = list(d.get_folders())
eq_(len(folders), 3)
ref = [f for f in folders if f.is_ref]
not_ref = [f for f in folders if not f.is_ref]
eq_(len(ref), 1)
eq_(ref[0].path, p + 'dir1')
eq_(len(not_ref), 2)
eq_(ref[0].size, 1)
def test_get_files_with_inherited_exclusion():
d = Directories()
p = testpath + 'onefile'
d.add_path(p)
d.set_state(p,STATE_EXCLUDED)
d.set_state(p, DirectoryState.Excluded)
eq_([], list(d.get_files()))
def test_save_and_load(tmpdir):
@@ -192,14 +207,14 @@ def test_save_and_load(tmpdir):
io.mkdir(p2)
d1.add_path(p1)
d1.add_path(p2)
d1.set_state(p1, STATE_REFERENCE)
d1.set_state(p1 + 'dir1',STATE_EXCLUDED)
d1.set_state(p1, DirectoryState.Reference)
d1.set_state(p1 + 'dir1', DirectoryState.Excluded)
tmpxml = str(tmpdir.join('directories_testunit.xml'))
d1.save_to_file(tmpxml)
d2.load_from_file(tmpxml)
eq_(2, len(d2))
eq_(STATE_REFERENCE,d2.get_state(p1))
eq_(STATE_EXCLUDED,d2.get_state(p1 + 'dir1'))
eq_(DirectoryState.Reference ,d2.get_state(p1))
eq_(DirectoryState.Excluded ,d2.get_state(p1 + 'dir1'))
def test_invalid_path():
d = Directories()
@@ -211,7 +226,7 @@ def test_invalid_path():
def test_set_state_on_invalid_path():
d = Directories()
try:
d.set_state(Path('foobar',),STATE_NORMAL)
d.set_state(Path('foobar',), DirectoryState.Normal)
except LookupError:
assert False
@@ -237,7 +252,7 @@ def test_unicode_save(tmpdir):
io.mkdir(p1)
io.mkdir(p1 + 'foo\xe9')
d.add_path(p1)
d.set_state(p1 + 'foo\xe9', STATE_EXCLUDED)
d.set_state(p1 + 'foo\xe9', DirectoryState.Excluded)
tmpxml = str(tmpdir.join('directories_testunit.xml'))
try:
d.save_to_file(tmpxml)
@@ -268,17 +283,17 @@ def test_get_state_returns_excluded_by_default_for_hidden_directories(tmpdir):
hidden_dir_path = p + '.foo'
io.mkdir(p + '.foo')
d.add_path(p)
eq_(d.get_state(hidden_dir_path), STATE_EXCLUDED)
eq_(d.get_state(hidden_dir_path), DirectoryState.Excluded)
# But it can be overriden
d.set_state(hidden_dir_path, STATE_NORMAL)
eq_(d.get_state(hidden_dir_path), STATE_NORMAL)
d.set_state(hidden_dir_path, DirectoryState.Normal)
eq_(d.get_state(hidden_dir_path), DirectoryState.Normal)
def test_default_path_state_override(tmpdir):
# It's possible for a subclass to override the default state of a path
class MyDirectories(Directories):
def _default_state_for_path(self, path):
if 'foobar' in path:
return STATE_EXCLUDED
return DirectoryState.Excluded
d = MyDirectories()
p1 = Path(str(tmpdir))
@@ -287,11 +302,11 @@ def test_default_path_state_override(tmpdir):
io.mkdir(p1 + 'foobaz')
io.open(p1 + 'foobaz/somefile', 'w').close()
d.add_path(p1)
eq_(d.get_state(p1 + 'foobaz'), STATE_NORMAL)
eq_(d.get_state(p1 + 'foobar'), STATE_EXCLUDED)
eq_(d.get_state(p1 + 'foobaz'), DirectoryState.Normal)
eq_(d.get_state(p1 + 'foobar'), DirectoryState.Excluded)
eq_(len(list(d.get_files())), 1) # only the 'foobaz' file is there
# However, the default state can be changed
d.set_state(p1 + 'foobar', STATE_NORMAL)
eq_(d.get_state(p1 + 'foobar'), STATE_NORMAL)
d.set_state(p1 + 'foobar', DirectoryState.Normal)
eq_(d.get_state(p1 + 'foobar'), DirectoryState.Normal)
eq_(len(list(d.get_files())), 2)

View File

@@ -1,6 +1,6 @@
# Created By: Virgil Dupras
# Created On: 2006/01/29
# Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
# Copyright 2011 Hardcoded Software (http://www.hardcoded.net)
#
# This software is licensed under the "BSD" License as described in the "LICENSE" file,
# which should be included with this package. The terms are also available at

View File

@@ -1,7 +1,6 @@
# -*- coding: utf-8 -*-
# Created By: Virgil Dupras
# Created On: 2009-10-23
# Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
# Copyright 2011 Hardcoded Software (http://www.hardcoded.net)
#
# This software is licensed under the "BSD" License as described in the "LICENSE" file,
# which should be included with this package. The terms are also available at
@@ -11,14 +10,13 @@ import hashlib
from hscommon.path import Path
from hscommon.testutil import eq_
from core.fs import File
from core.tests.directories_test import create_fake_fs
from .. import fs
def test_size_aggregates_subfiles(tmpdir):
p = create_fake_fs(Path(str(tmpdir)))
b = fs.Bundle(p)
b = fs.Folder(p)
eq_(b.size, 12)
def test_md5_aggregate_subfiles_sorted(tmpdir):
@@ -26,18 +24,22 @@ def test_md5_aggregate_subfiles_sorted(tmpdir):
#all files' md5 it contains, but it must make sure that it does so in the
#same order everytime.
p = create_fake_fs(Path(str(tmpdir)))
b = fs.Bundle(p)
md5s = File(p + ('dir1', 'file1.test')).md5
md5s += File(p + ('dir2', 'file2.test')).md5
md5s += File(p + ('dir3', 'file3.test')).md5
md5s += File(p + 'file1.test').md5
md5s += File(p + 'file2.test').md5
md5s += File(p + 'file3.test').md5
md5 = hashlib.md5(md5s)
b = fs.Folder(p)
md51 = fs.File(p + ('dir1', 'file1.test')).md5
md52 = fs.File(p + ('dir2', 'file2.test')).md5
md53 = fs.File(p + ('dir3', 'file3.test')).md5
md54 = fs.File(p + 'file1.test').md5
md55 = fs.File(p + 'file2.test').md5
md56 = fs.File(p + 'file3.test').md5
# The expected md5 is the md5 of md5s for folders and the direct md5 for files
folder_md51 = hashlib.md5(md51).digest()
folder_md52 = hashlib.md5(md52).digest()
folder_md53 = hashlib.md5(md53).digest()
md5 = hashlib.md5(folder_md51+folder_md52+folder_md53+md54+md55+md56)
eq_(b.md5, md5.digest())
def test_has_file_attrs(tmpdir):
#a Bundle must behave like a file, so it must have mtime attributes
b = fs.Bundle(Path(str(tmpdir)))
#a Folder must behave like a file, so it must have mtime attributes
b = fs.Folder(Path(str(tmpdir)))
assert b.mtime > 0
eq_(b.extension, '')

View File

@@ -1,6 +1,6 @@
# Created By: Virgil Dupras
# Created On: 2006/05/02
# Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
# Copyright 2011 Hardcoded Software (http://www.hardcoded.net)
#
# This software is licensed under the "BSD" License as described in the "LICENSE" file,
# which should be included with this package. The terms are also available at

View File

@@ -1,7 +1,7 @@
# Created By: Virgil Dupras
# Created On: 2006/02/23
# $Id$
# Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
# Copyright 2011 Hardcoded Software (http://www.hardcoded.net)
#
# This software is licensed under the "BSD" License as described in the "LICENSE" file,
# which should be included with this package. The terms are also available at
@@ -26,6 +26,11 @@ class NamedObject(engine_test.NamedObject):
def __bool__(self):
return False #Make sure that operations are made correctly when the bool value of files is false.
@property
def folder_path(self):
return self.path[:-1]
# Returns a group set that looks like that:
# "foo bar" (1)
@@ -77,6 +82,18 @@ class TestCaseResultsEmpty:
self.results.groups = []
assert not self.results.is_modified
def test_save_to_same_name_as_folder(self, tmpdir):
# Issue #149
# When saving to a filename that already exists, the file is overwritten. However, when
# the name exists but that it's a folder, then there used to be a crash. The proper fix
# would have been some kind of feedback to the user, but the work involved for something
# that simply never happens (I never received a report of this crash, I experienced it
# while fooling around) is too much. Instead, use standard name conflict resolution.
folderpath = tmpdir.join('foo')
folderpath.mkdir()
self.results.save_to_xml(str(folderpath)) # no crash
assert tmpdir.join('[000] foo').check()
class TestCaseResultsWithSomeGroups:
def setup_method(self, method):

View File

@@ -1,6 +1,6 @@
# Created By: Virgil Dupras
# Created On: 2006/03/03
# Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
# Copyright 2011 Hardcoded Software (http://www.hardcoded.net)
#
# This software is licensed under the "BSD" License as described in the "LICENSE" file,
# which should be included with this package. The terms are also available at
@@ -471,3 +471,27 @@ def test_dont_group_files_that_dont_exist(tmpdir):
s._getmatches = getmatches
assert not s.GetDupeGroups([file1, file2])
def test_folder_scan_exclude_subfolder_matches(fake_fileexists):
# when doing a Folders scan type, don't include matches for folders whose parent folder already
# match.
s = Scanner()
s.scan_type = ScanType.Folders
topf1 = no("top folder 1", size=42)
topf1.md5 = topf1.md5partial = b"some_md5_1"
topf1.path = Path('/topf1')
topf2 = no("top folder 2", size=42)
topf2.md5 = topf2.md5partial = b"some_md5_1"
topf2.path = Path('/topf2')
subf1 = no("sub folder 1", size=41)
subf1.md5 = subf1.md5partial = b"some_md5_2"
subf1.path = Path('/topf1/sub')
subf2 = no("sub folder 2", size=41)
subf2.md5 = subf2.md5partial = b"some_md5_2"
subf2.path = Path('/topf2/sub')
eq_(len(s.GetDupeGroups([topf1, topf2, subf1, subf2])), 1) # only top folders
# however, if another folder matches a subfolder, keep in in the matches
otherf = no("other folder", size=41)
otherf.md5 = otherf.md5partial = b"some_md5_2"
otherf.path = Path('/otherfolder')
eq_(len(s.GetDupeGroups([topf1, topf2, subf1, subf2, otherf])), 2)

View File

@@ -1,2 +1,2 @@
__version__ = '6.0.0'
__version__ = '6.0.1'
__appname__ = 'dupeGuru Music Edition'

View File

@@ -1,6 +1,6 @@
# Created By: Virgil Dupras
# Created On: 2006/11/16
# Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
# Copyright 2011 Hardcoded Software (http://www.hardcoded.net)
#
# This software is licensed under the "BSD" License as described in the "LICENSE" file,
# which should be included with this package. The terms are also available at

Some files were not shown because too many files have changed in this diff Show More