mirror of
https://github.com/arsenetar/dupeguru.git
synced 2026-01-25 08:01:39 +00:00
Compare commits
146 Commits
before-tig
...
pe1.8.2
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7957b73b4a | ||
|
|
69838c44af | ||
|
|
8e2953aef6 | ||
|
|
8dda616502 | ||
|
|
484512e35b | ||
|
|
c8cd05c07d | ||
|
|
7ffefe6259 | ||
|
|
cd9b7f2f11 | ||
|
|
b372974437 | ||
|
|
7464e0f799 | ||
|
|
25e12f1775 | ||
|
|
6416469f78 | ||
|
|
922ce5ae36 | ||
|
|
9ca8a199c0 | ||
|
|
a570406ac8 | ||
|
|
719edb6b6e | ||
|
|
d075218621 | ||
|
|
7509943938 | ||
|
|
774da9d2f8 | ||
|
|
978fd383e8 | ||
|
|
8551fc23fe | ||
|
|
fb711edeeb | ||
|
|
352a21acaa | ||
|
|
0b9d936317 | ||
|
|
dc500243e9 | ||
|
|
21203b8341 | ||
|
|
5b03447640 | ||
|
|
d34158db2c | ||
|
|
65a17390c7 | ||
|
|
0e96f0917c | ||
|
|
3d62a7e64a | ||
|
|
962805936e | ||
|
|
967aeecf5b | ||
|
|
348b039fa3 | ||
|
|
6e9b1f4fa3 | ||
|
|
f1d447d1aa | ||
|
|
a7c6f47dbe | ||
|
|
0446e89bfe | ||
|
|
e41457913f | ||
|
|
cea1ec7641 | ||
|
|
cc362deb87 | ||
|
|
7ec64e8a3d | ||
|
|
ff2461df9d | ||
|
|
192cd2733c | ||
|
|
ecef95469d | ||
|
|
55d30d5e4b | ||
|
|
2d5502cc2f | ||
|
|
5cda4a1eb4 | ||
|
|
812b914b70 | ||
|
|
9b870ad863 | ||
|
|
0f250ac92d | ||
|
|
552e6b7836 | ||
|
|
28f70b281b | ||
|
|
32d9b573c0 | ||
|
|
fc76a843d5 | ||
|
|
06607aabb2 | ||
|
|
a1edc0e4f1 | ||
|
|
787c5d2189 | ||
|
|
492c577184 | ||
|
|
f5d0e22dc7 | ||
|
|
dc5ba01f1e | ||
|
|
a31f6e68aa | ||
|
|
c95b356a99 | ||
|
|
b5e645cb10 | ||
|
|
627e638251 | ||
|
|
d2e2f337f6 | ||
|
|
e6d4d44f15 | ||
|
|
55f4df19a9 | ||
|
|
9f006ec08a | ||
|
|
d62ff40bed | ||
|
|
da194007fb | ||
|
|
d06ce0c748 | ||
|
|
c14fecb415 | ||
|
|
99f7308a67 | ||
|
|
99ee45ba2d | ||
|
|
615f3f77a6 | ||
|
|
12e4c00c5d | ||
|
|
d954cb468f | ||
|
|
e0fadc7af5 | ||
|
|
c5e9fd99b8 | ||
|
|
7efbbb2153 | ||
|
|
4eb505e24a | ||
|
|
b6b08cccd7 | ||
|
|
70af8541da | ||
|
|
838f8ae352 | ||
|
|
5645515d90 | ||
|
|
d114ffb2c4 | ||
|
|
a9f9534ce6 | ||
|
|
7dee2c67c6 | ||
|
|
e18f8ba6d4 | ||
|
|
4d44753f6e | ||
|
|
f5accbfaed | ||
|
|
6eba99eba1 | ||
|
|
1e18a08998 | ||
|
|
2526380184 | ||
|
|
74dba7cb6c | ||
|
|
63aad8ca84 | ||
|
|
b8bb40de62 | ||
|
|
67dff7fbf2 | ||
|
|
6e226f32fd | ||
|
|
cf819dc0a8 | ||
|
|
4f6af6e4dc | ||
|
|
a6d2a9b7b3 | ||
|
|
cf34164191 | ||
|
|
9a7bb30df4 | ||
|
|
5dc78809b6 | ||
|
|
2b53a6e7d6 | ||
|
|
eb82a35e5b | ||
|
|
51b14435e0 | ||
|
|
59de033523 | ||
|
|
c9b0a278ca | ||
|
|
b487189742 | ||
|
|
d5a60b1580 | ||
|
|
e2665610e9 | ||
|
|
3262ee9938 | ||
|
|
2f153003b3 | ||
|
|
6724e710d8 | ||
|
|
9729e05fe8 | ||
|
|
686c60b83b | ||
|
|
5fe11f3b3a | ||
|
|
30d29c6b34 | ||
|
|
fbfb16e77a | ||
|
|
7aea384f86 | ||
|
|
78bef5c3c6 | ||
|
|
5c8d90a57c | ||
|
|
13dc9ff76d | ||
|
|
eb3645d493 | ||
|
|
0a06e52d65 | ||
|
|
e004c0c2d4 | ||
|
|
6d5f6a0c3c | ||
|
|
024e3c380f | ||
|
|
06859fe9cd | ||
|
|
6392d08584 | ||
|
|
80a5290bc8 | ||
|
|
6b30c88fba | ||
|
|
6adce9bf03 | ||
|
|
3c90ad81a7 | ||
|
|
484529add0 | ||
|
|
600c7906a4 | ||
|
|
f070e90347 | ||
|
|
88127d8b8d | ||
|
|
607ab86188 | ||
|
|
c936f9ccc6 | ||
|
|
d4d8917956 | ||
|
|
89bce95c27 | ||
|
|
f0a38a2b3f |
25
.hgignore
Normal file
25
.hgignore
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
syntax: glob
|
||||||
|
|
||||||
|
.DS_Store
|
||||||
|
*.pyc
|
||||||
|
*.so
|
||||||
|
*.mode1v3
|
||||||
|
*.pbxuser
|
||||||
|
*.tm_build_errors
|
||||||
|
*.pyd
|
||||||
|
conf.yaml
|
||||||
|
build
|
||||||
|
cocoa/*/Info.plist
|
||||||
|
cocoa/*/build
|
||||||
|
cocoa/*/dg_cocoa.plugin
|
||||||
|
qt/base/*_rc.py
|
||||||
|
qt/base/*_ui.py
|
||||||
|
qt/*/*_ui.py
|
||||||
|
qt/*/build
|
||||||
|
qt/*/dist
|
||||||
|
qt/*/install
|
||||||
|
qt/*/logdict*.log
|
||||||
|
qt/*/warn*.txt
|
||||||
|
help_se/dupeguru_help
|
||||||
|
help_me/dupeguru_me_help
|
||||||
|
help_pe/dupeguru_pe_help
|
||||||
10
.hgtags
Normal file
10
.hgtags
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
0ef0ca83b49ad009c896f55824189acc932bcf22 se2.8.2
|
||||||
|
0ef0ca83b49ad009c896f55824189acc932bcf22 me5.6.6
|
||||||
|
0ef0ca83b49ad009c896f55824189acc932bcf22 pe1.7.8
|
||||||
|
a8f232f880b6f9ada565d472996a627ebf69b6e9 before-tiger-drop
|
||||||
|
321d15e818cf9a3f1fc037543090bb2fca2cccd7 me5.7.0
|
||||||
|
adc73ccd14b1386cb04dee773c53a2d126800e31 se2.9.0
|
||||||
|
cbcf9c80fee4c908ef2efbf1c143c9e47676c9b2 pe1.8.0
|
||||||
|
61c4101851bdea3cb37dfb76f0d404c78c7c594c se2.9.1
|
||||||
|
0e923897a3389331d4ab3debbc40b8dd616199d9 pe1.8.1
|
||||||
|
2c454eca9ebe93b6cf34916068f828a6a39e3eaf me5.7.1
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
Copyright 2009 Hardcoded Software Inc. (http://www.hardcoded.net)
|
Copyright 2010 Hardcoded Software Inc. (http://www.hardcoded.net)
|
||||||
All rights reserved.
|
All rights reserved.
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
|
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
|
||||||
72
README
Normal file
72
README
Normal file
@@ -0,0 +1,72 @@
|
|||||||
|
Contents
|
||||||
|
=====
|
||||||
|
|
||||||
|
This package contains the source for dupeGuru. To learns how to build it, refer to the "Build dupeGuru" section. Below is the description of the various subfolders:
|
||||||
|
|
||||||
|
- core: Contains the core logic code for dupeGuru. It's Python code written in TDD style.
|
||||||
|
- core_*: Edition-specific-cross-toolkit code written in Python.
|
||||||
|
- cocoa: UI code for the Cocoa toolkit. It's Objective-C code.
|
||||||
|
- qt: UI code for the Qt toolkit. It's written in Python and uses PyQt. Before redistributing changes in this part of the code, read the "qt/WARNING" file.
|
||||||
|
- images: Images used by the different UI codebases.
|
||||||
|
|
||||||
|
There are also other sub-folder that comes from external repositories (automatically checked out
|
||||||
|
with svn:externals):
|
||||||
|
|
||||||
|
- hsutil: A collection of helpers used across HS applications.
|
||||||
|
- hsdocgen: An ad-hoc document generation used across HS project (used for help files)
|
||||||
|
- hsmedia: A library to read audio file metadata, used in dupeGuru ME.
|
||||||
|
- cocoalib: A collection of helpers used across Cocoa UI codebases of HS applications.
|
||||||
|
- qtlib: A collection of helpers used across Qt UI codebases of HS applications.
|
||||||
|
|
||||||
|
dupeGuru Dependencies
|
||||||
|
=====
|
||||||
|
|
||||||
|
Before being able to build dupeGuru, a few dependencies have to be installed:
|
||||||
|
|
||||||
|
General dependencies
|
||||||
|
-----
|
||||||
|
|
||||||
|
- Python 2.6 (http://www.python.org)
|
||||||
|
- Mako, to generate help files. (http://www.makotemplates.org/)
|
||||||
|
- PyYaml, for help files and the build system. (http://pyyaml.org/)
|
||||||
|
- Nose, to run unit tests. (http://somethingaboutorange.com/mrl/projects/nose/)
|
||||||
|
|
||||||
|
OS X prerequisites
|
||||||
|
-----
|
||||||
|
|
||||||
|
- XCode 3.1 (http://developer.apple.com/TOOLS/xcode/)
|
||||||
|
- Sparkle (http://sparkle.andymatuschak.org/)
|
||||||
|
- PyObjC 2.2. (http://pyobjc.sourceforge.net/)
|
||||||
|
- py2app (http://svn.pythonmac.org/py2app/py2app/trunk/doc/index.html)
|
||||||
|
|
||||||
|
Windows prerequisites
|
||||||
|
---
|
||||||
|
|
||||||
|
- Visual Studio 2008 (Express is enough) is needed to build C extensions. (http://www.microsoft.com/Express/)
|
||||||
|
- PyQt 4.6 (http://www.riverbankcomputing.co.uk/news)
|
||||||
|
- Python Imaging Library for dupeGuru PE. (http://www.pythonware.com/products/pil/)
|
||||||
|
- PyInstaller, if you want to build a exe. You don't need it if you just want to run dupeGuru. (http://www.pyinstaller.org/)
|
||||||
|
- Advanced Installer, if you want to build the installer file. (http://www.advancedinstaller.com/)
|
||||||
|
|
||||||
|
Building dupeGuru
|
||||||
|
=====
|
||||||
|
|
||||||
|
First, make sure you meet the dependencies listed in the section above. Then you need to configure your build with:
|
||||||
|
|
||||||
|
python configure.py
|
||||||
|
|
||||||
|
If you want, you can specify a UI to use with the `--ui` option. So, if you want to build dupeGuru with Qt on OS X, then you have to type `python configure.py --ui=qt`. You can also use the `--dev` flag to indicate a dev build (it will build `dg_cocoa.plugin` in alias mode and use the "dev" config in XCode).
|
||||||
|
|
||||||
|
Then, just build the thing and then run it with:
|
||||||
|
|
||||||
|
python build.py
|
||||||
|
python run.py
|
||||||
|
|
||||||
|
If you want to create ready-to-upload package, run:
|
||||||
|
|
||||||
|
python package.py
|
||||||
|
|
||||||
|
64-bit on OS X
|
||||||
|
---
|
||||||
|
|
||||||
|
The "release" configuration of dupeGuru's XCode project build with archs "i386 x86_64 ppc". However there are currently problems with py2app and 64 bit. If you want to correctly build 64-bit apps, refer to http://www.hardcoded.net/articles/building-64-bit-pyobjc-applications-with-py2app.htm .
|
||||||
@@ -1,38 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright 2009 Hardcoded Software (http://www.hardcoded.net)
|
|
||||||
|
|
||||||
This software is licensed under the "HS" License as described in the "LICENSE" file,
|
|
||||||
which should be included with this package. The terms are also available at
|
|
||||||
http://www.hardcoded.net/licenses/hs_license
|
|
||||||
*/
|
|
||||||
|
|
||||||
#import "AppDelegate.h"
|
|
||||||
#import "ProgressController.h"
|
|
||||||
#import "RegistrationInterface.h"
|
|
||||||
#import "Utils.h"
|
|
||||||
#import "Consts.h"
|
|
||||||
|
|
||||||
@implementation AppDelegateBase
|
|
||||||
- (id)init
|
|
||||||
{
|
|
||||||
self = [super init];
|
|
||||||
_appName = @"";
|
|
||||||
return self;
|
|
||||||
}
|
|
||||||
|
|
||||||
- (IBAction)unlockApp:(id)sender
|
|
||||||
{
|
|
||||||
if ([[self py] isRegistered])
|
|
||||||
return;
|
|
||||||
RegistrationInterface *ri = [[RegistrationInterface alloc] initWithApp:[self py] name:_appName limitDescription:LIMIT_DESC];
|
|
||||||
if ([ri enterCode] == NSOKButton)
|
|
||||||
{
|
|
||||||
NSString *menuTitle = [NSString stringWithFormat:@"Thanks for buying %@",_appName];
|
|
||||||
[unlockMenuItem setTitle:menuTitle];
|
|
||||||
}
|
|
||||||
[ri release];
|
|
||||||
}
|
|
||||||
|
|
||||||
- (PyDupeGuruBase *)py { return py; }
|
|
||||||
- (RecentDirectories *)recentDirectories { return recentDirectories; }
|
|
||||||
@end
|
|
||||||
@@ -1,33 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright 2009 Hardcoded Software (http://www.hardcoded.net)
|
|
||||||
|
|
||||||
This software is licensed under the "HS" License as described in the "LICENSE" file,
|
|
||||||
which should be included with this package. The terms are also available at
|
|
||||||
http://www.hardcoded.net/licenses/hs_license
|
|
||||||
*/
|
|
||||||
|
|
||||||
#import "DetailsPanel.h"
|
|
||||||
#import "Consts.h"
|
|
||||||
|
|
||||||
@implementation DetailsPanelBase
|
|
||||||
- (id)initWithPy:(PyApp *)aPy
|
|
||||||
{
|
|
||||||
self = [super initWithWindowNibName:@"Details"];
|
|
||||||
[self window]; //So the detailsTable is initialized.
|
|
||||||
[detailsTable setPy:aPy];
|
|
||||||
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(duplicateSelectionChanged:) name:DuplicateSelectionChangedNotification object:nil];
|
|
||||||
return self;
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void)refresh
|
|
||||||
{
|
|
||||||
[detailsTable reloadData];
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Notifications */
|
|
||||||
- (void)duplicateSelectionChanged:(NSNotification *)aNotification
|
|
||||||
{
|
|
||||||
if ([[self window] isVisible])
|
|
||||||
[self refresh];
|
|
||||||
}
|
|
||||||
@end
|
|
||||||
@@ -1,438 +0,0 @@
|
|||||||
# Created By: Virgil Dupras
|
|
||||||
# Created On: 2006/03/03
|
|
||||||
# $Id$
|
|
||||||
# Copyright 2009 Hardcoded Software (http://www.hardcoded.net)
|
|
||||||
#
|
|
||||||
# This software is licensed under the "HS" License as described in the "LICENSE" file,
|
|
||||||
# which should be included with this package. The terms are also available at
|
|
||||||
# http://www.hardcoded.net/licenses/hs_license
|
|
||||||
|
|
||||||
from nose.tools import eq_
|
|
||||||
|
|
||||||
from hsutil import job
|
|
||||||
from hsutil.path import Path
|
|
||||||
|
|
||||||
from ..engine import getwords, Match
|
|
||||||
from ..ignore import IgnoreList
|
|
||||||
from ..scanner import *
|
|
||||||
|
|
||||||
class NamedObject(object):
|
|
||||||
def __init__(self, name="foobar", size=1):
|
|
||||||
self.name = name
|
|
||||||
self.size = size
|
|
||||||
self.path = Path('')
|
|
||||||
self.words = getwords(name)
|
|
||||||
|
|
||||||
|
|
||||||
no = NamedObject
|
|
||||||
|
|
||||||
#--- Scanner
|
|
||||||
def test_empty():
|
|
||||||
s = Scanner()
|
|
||||||
r = s.GetDupeGroups([])
|
|
||||||
eq_(r, [])
|
|
||||||
|
|
||||||
def test_default_settings():
|
|
||||||
s = Scanner()
|
|
||||||
eq_(s.min_match_percentage, 80)
|
|
||||||
eq_(s.scan_type, SCAN_TYPE_FILENAME)
|
|
||||||
eq_(s.mix_file_kind, True)
|
|
||||||
eq_(s.word_weighting, False)
|
|
||||||
eq_(s.match_similar_words, False)
|
|
||||||
assert isinstance(s.ignore_list, IgnoreList)
|
|
||||||
|
|
||||||
def test_simple_with_default_settings():
|
|
||||||
s = Scanner()
|
|
||||||
f = [no('foo bar'), no('foo bar'), no('foo bleh')]
|
|
||||||
r = s.GetDupeGroups(f)
|
|
||||||
eq_(len(r), 1)
|
|
||||||
g = r[0]
|
|
||||||
#'foo bleh' cannot be in the group because the default min match % is 80
|
|
||||||
eq_(len(g), 2)
|
|
||||||
assert g.ref in f[:2]
|
|
||||||
assert g.dupes[0] in f[:2]
|
|
||||||
|
|
||||||
def test_simple_with_lower_min_match():
|
|
||||||
s = Scanner()
|
|
||||||
s.min_match_percentage = 50
|
|
||||||
f = [no('foo bar'), no('foo bar'), no('foo bleh')]
|
|
||||||
r = s.GetDupeGroups(f)
|
|
||||||
eq_(len(r), 1)
|
|
||||||
g = r[0]
|
|
||||||
eq_(len(g), 3)
|
|
||||||
|
|
||||||
def test_trim_all_ref_groups():
|
|
||||||
# When all files of a group are ref, don't include that group in the results, but also don't
|
|
||||||
# count the files from that group as discarded.
|
|
||||||
s = Scanner()
|
|
||||||
f = [no('foo'), no('foo'), no('bar'), no('bar')]
|
|
||||||
f[2].is_ref = True
|
|
||||||
f[3].is_ref = True
|
|
||||||
r = s.GetDupeGroups(f)
|
|
||||||
eq_(len(r), 1)
|
|
||||||
eq_(s.discarded_file_count, 0)
|
|
||||||
|
|
||||||
def test_priorize():
|
|
||||||
s = Scanner()
|
|
||||||
f = [no('foo'), no('foo'), no('bar'), no('bar')]
|
|
||||||
f[1].size = 2
|
|
||||||
f[2].size = 3
|
|
||||||
f[3].is_ref = True
|
|
||||||
r = s.GetDupeGroups(f)
|
|
||||||
g1, g2 = r
|
|
||||||
assert f[1] in (g1.ref,g2.ref)
|
|
||||||
assert f[0] in (g1.dupes[0],g2.dupes[0])
|
|
||||||
assert f[3] in (g1.ref,g2.ref)
|
|
||||||
assert f[2] in (g1.dupes[0],g2.dupes[0])
|
|
||||||
|
|
||||||
def test_content_scan():
|
|
||||||
s = Scanner()
|
|
||||||
s.scan_type = SCAN_TYPE_CONTENT
|
|
||||||
f = [no('foo'), no('bar'), no('bleh')]
|
|
||||||
f[0].md5 = f[0].md5partial = 'foobar'
|
|
||||||
f[1].md5 = f[1].md5partial = 'foobar'
|
|
||||||
f[2].md5 = f[2].md5partial = 'bleh'
|
|
||||||
r = s.GetDupeGroups(f)
|
|
||||||
eq_(len(r), 1)
|
|
||||||
eq_(len(r[0]), 2)
|
|
||||||
eq_(s.discarded_file_count, 0) # don't count the different md5 as discarded!
|
|
||||||
|
|
||||||
def test_content_scan_compare_sizes_first():
|
|
||||||
class MyFile(no):
|
|
||||||
@property
|
|
||||||
def md5(file):
|
|
||||||
raise AssertionError()
|
|
||||||
|
|
||||||
s = Scanner()
|
|
||||||
s.scan_type = SCAN_TYPE_CONTENT
|
|
||||||
f = [MyFile('foo', 1), MyFile('bar', 2)]
|
|
||||||
eq_(len(s.GetDupeGroups(f)), 0)
|
|
||||||
|
|
||||||
def test_min_match_perc_doesnt_matter_for_content_scan():
|
|
||||||
s = Scanner()
|
|
||||||
s.scan_type = SCAN_TYPE_CONTENT
|
|
||||||
f = [no('foo'), no('bar'), no('bleh')]
|
|
||||||
f[0].md5 = f[0].md5partial = 'foobar'
|
|
||||||
f[1].md5 = f[1].md5partial = 'foobar'
|
|
||||||
f[2].md5 = f[2].md5partial = 'bleh'
|
|
||||||
s.min_match_percentage = 101
|
|
||||||
r = s.GetDupeGroups(f)
|
|
||||||
eq_(len(r), 1)
|
|
||||||
eq_(len(r[0]), 2)
|
|
||||||
s.min_match_percentage = 0
|
|
||||||
r = s.GetDupeGroups(f)
|
|
||||||
eq_(len(r), 1)
|
|
||||||
eq_(len(r[0]), 2)
|
|
||||||
|
|
||||||
def test_content_scan_doesnt_put_md5_in_words_at_the_end():
|
|
||||||
s = Scanner()
|
|
||||||
s.scan_type = SCAN_TYPE_CONTENT
|
|
||||||
f = [no('foo'),no('bar')]
|
|
||||||
f[0].md5 = f[0].md5partial = '\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f'
|
|
||||||
f[1].md5 = f[1].md5partial = '\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f'
|
|
||||||
r = s.GetDupeGroups(f)
|
|
||||||
g = r[0]
|
|
||||||
|
|
||||||
def test_extension_is_not_counted_in_filename_scan():
|
|
||||||
s = Scanner()
|
|
||||||
s.min_match_percentage = 100
|
|
||||||
f = [no('foo.bar'), no('foo.bleh')]
|
|
||||||
r = s.GetDupeGroups(f)
|
|
||||||
eq_(len(r), 1)
|
|
||||||
eq_(len(r[0]), 2)
|
|
||||||
|
|
||||||
def test_job():
|
|
||||||
def do_progress(progress, desc=''):
|
|
||||||
log.append(progress)
|
|
||||||
return True
|
|
||||||
|
|
||||||
s = Scanner()
|
|
||||||
log = []
|
|
||||||
f = [no('foo bar'), no('foo bar'), no('foo bleh')]
|
|
||||||
r = s.GetDupeGroups(f, job.Job(1, do_progress))
|
|
||||||
eq_(log[0], 0)
|
|
||||||
eq_(log[-1], 100)
|
|
||||||
|
|
||||||
def test_mix_file_kind():
|
|
||||||
s = Scanner()
|
|
||||||
s.mix_file_kind = False
|
|
||||||
f = [no('foo.1'), no('foo.2')]
|
|
||||||
r = s.GetDupeGroups(f)
|
|
||||||
eq_(len(r), 0)
|
|
||||||
|
|
||||||
def test_word_weighting():
|
|
||||||
s = Scanner()
|
|
||||||
s.min_match_percentage = 75
|
|
||||||
s.word_weighting = True
|
|
||||||
f = [no('foo bar'), no('foo bar bleh')]
|
|
||||||
r = s.GetDupeGroups(f)
|
|
||||||
eq_(len(r), 1)
|
|
||||||
g = r[0]
|
|
||||||
m = g.get_match_of(g.dupes[0])
|
|
||||||
eq_(m.percentage, 75) # 16 letters, 12 matching
|
|
||||||
|
|
||||||
def test_similar_words():
|
|
||||||
s = Scanner()
|
|
||||||
s.match_similar_words = True
|
|
||||||
f = [no('The White Stripes'), no('The Whites Stripe'), no('Limp Bizkit'), no('Limp Bizkitt')]
|
|
||||||
r = s.GetDupeGroups(f)
|
|
||||||
eq_(len(r), 2)
|
|
||||||
|
|
||||||
def test_fields():
|
|
||||||
s = Scanner()
|
|
||||||
s.scan_type = SCAN_TYPE_FIELDS
|
|
||||||
f = [no('The White Stripes - Little Ghost'), no('The White Stripes - Little Acorn')]
|
|
||||||
r = s.GetDupeGroups(f)
|
|
||||||
eq_(len(r), 0)
|
|
||||||
|
|
||||||
def test_fields_no_order():
|
|
||||||
s = Scanner()
|
|
||||||
s.scan_type = SCAN_TYPE_FIELDS_NO_ORDER
|
|
||||||
f = [no('The White Stripes - Little Ghost'), no('Little Ghost - The White Stripes')]
|
|
||||||
r = s.GetDupeGroups(f)
|
|
||||||
eq_(len(r), 1)
|
|
||||||
|
|
||||||
def test_tag_scan():
|
|
||||||
s = Scanner()
|
|
||||||
s.scan_type = SCAN_TYPE_TAG
|
|
||||||
o1 = no('foo')
|
|
||||||
o2 = no('bar')
|
|
||||||
o1.artist = 'The White Stripes'
|
|
||||||
o1.title = 'The Air Near My Fingers'
|
|
||||||
o2.artist = 'The White Stripes'
|
|
||||||
o2.title = 'The Air Near My Fingers'
|
|
||||||
r = s.GetDupeGroups([o1,o2])
|
|
||||||
eq_(len(r), 1)
|
|
||||||
|
|
||||||
def test_tag_with_album_scan():
|
|
||||||
s = Scanner()
|
|
||||||
s.scan_type = SCAN_TYPE_TAG
|
|
||||||
s.scanned_tags = set(['artist', 'album', 'title'])
|
|
||||||
o1 = no('foo')
|
|
||||||
o2 = no('bar')
|
|
||||||
o3 = no('bleh')
|
|
||||||
o1.artist = 'The White Stripes'
|
|
||||||
o1.title = 'The Air Near My Fingers'
|
|
||||||
o1.album = 'Elephant'
|
|
||||||
o2.artist = 'The White Stripes'
|
|
||||||
o2.title = 'The Air Near My Fingers'
|
|
||||||
o2.album = 'Elephant'
|
|
||||||
o3.artist = 'The White Stripes'
|
|
||||||
o3.title = 'The Air Near My Fingers'
|
|
||||||
o3.album = 'foobar'
|
|
||||||
r = s.GetDupeGroups([o1,o2,o3])
|
|
||||||
eq_(len(r), 1)
|
|
||||||
|
|
||||||
def test_that_dash_in_tags_dont_create_new_fields():
|
|
||||||
s = Scanner()
|
|
||||||
s.scan_type = SCAN_TYPE_TAG
|
|
||||||
s.scanned_tags = set(['artist', 'album', 'title'])
|
|
||||||
s.min_match_percentage = 50
|
|
||||||
o1 = no('foo')
|
|
||||||
o2 = no('bar')
|
|
||||||
o1.artist = 'The White Stripes - a'
|
|
||||||
o1.title = 'The Air Near My Fingers - a'
|
|
||||||
o1.album = 'Elephant - a'
|
|
||||||
o2.artist = 'The White Stripes - b'
|
|
||||||
o2.title = 'The Air Near My Fingers - b'
|
|
||||||
o2.album = 'Elephant - b'
|
|
||||||
r = s.GetDupeGroups([o1,o2])
|
|
||||||
eq_(len(r), 1)
|
|
||||||
|
|
||||||
def test_tag_scan_with_different_scanned():
|
|
||||||
s = Scanner()
|
|
||||||
s.scan_type = SCAN_TYPE_TAG
|
|
||||||
s.scanned_tags = set(['track', 'year'])
|
|
||||||
o1 = no('foo')
|
|
||||||
o2 = no('bar')
|
|
||||||
o1.artist = 'The White Stripes'
|
|
||||||
o1.title = 'some title'
|
|
||||||
o1.track = 'foo'
|
|
||||||
o1.year = 'bar'
|
|
||||||
o2.artist = 'The White Stripes'
|
|
||||||
o2.title = 'another title'
|
|
||||||
o2.track = 'foo'
|
|
||||||
o2.year = 'bar'
|
|
||||||
r = s.GetDupeGroups([o1, o2])
|
|
||||||
eq_(len(r), 1)
|
|
||||||
|
|
||||||
def test_tag_scan_only_scans_existing_tags():
|
|
||||||
s = Scanner()
|
|
||||||
s.scan_type = SCAN_TYPE_TAG
|
|
||||||
s.scanned_tags = set(['artist', 'foo'])
|
|
||||||
o1 = no('foo')
|
|
||||||
o2 = no('bar')
|
|
||||||
o1.artist = 'The White Stripes'
|
|
||||||
o1.foo = 'foo'
|
|
||||||
o2.artist = 'The White Stripes'
|
|
||||||
o2.foo = 'bar'
|
|
||||||
r = s.GetDupeGroups([o1, o2])
|
|
||||||
eq_(len(r), 1) # Because 'foo' is not scanned, they match
|
|
||||||
|
|
||||||
def test_tag_scan_converts_to_str():
|
|
||||||
s = Scanner()
|
|
||||||
s.scan_type = SCAN_TYPE_TAG
|
|
||||||
s.scanned_tags = set(['track'])
|
|
||||||
o1 = no('foo')
|
|
||||||
o2 = no('bar')
|
|
||||||
o1.track = 42
|
|
||||||
o2.track = 42
|
|
||||||
try:
|
|
||||||
r = s.GetDupeGroups([o1, o2])
|
|
||||||
except TypeError:
|
|
||||||
raise AssertionError()
|
|
||||||
eq_(len(r), 1)
|
|
||||||
|
|
||||||
def test_tag_scan_non_ascii():
|
|
||||||
s = Scanner()
|
|
||||||
s.scan_type = SCAN_TYPE_TAG
|
|
||||||
s.scanned_tags = set(['title'])
|
|
||||||
o1 = no('foo')
|
|
||||||
o2 = no('bar')
|
|
||||||
o1.title = u'foobar\u00e9'
|
|
||||||
o2.title = u'foobar\u00e9'
|
|
||||||
try:
|
|
||||||
r = s.GetDupeGroups([o1, o2])
|
|
||||||
except UnicodeEncodeError:
|
|
||||||
raise AssertionError()
|
|
||||||
eq_(len(r), 1)
|
|
||||||
|
|
||||||
def test_audio_content_scan():
|
|
||||||
s = Scanner()
|
|
||||||
s.scan_type = SCAN_TYPE_CONTENT_AUDIO
|
|
||||||
f = [no('foo'), no('bar'), no('bleh')]
|
|
||||||
f[0].md5 = 'foo'
|
|
||||||
f[1].md5 = 'bar'
|
|
||||||
f[2].md5 = 'bleh'
|
|
||||||
f[0].md5partial = 'foo'
|
|
||||||
f[1].md5partial = 'foo'
|
|
||||||
f[2].md5partial = 'bleh'
|
|
||||||
f[0].audiosize = 1
|
|
||||||
f[1].audiosize = 1
|
|
||||||
f[2].audiosize = 1
|
|
||||||
r = s.GetDupeGroups(f)
|
|
||||||
eq_(len(r), 1)
|
|
||||||
eq_(len(r[0]), 2)
|
|
||||||
|
|
||||||
def test_audio_content_scan_compare_sizes_first():
|
|
||||||
class MyFile(no):
|
|
||||||
@property
|
|
||||||
def md5partial(file):
|
|
||||||
raise AssertionError()
|
|
||||||
|
|
||||||
s = Scanner()
|
|
||||||
s.scan_type = SCAN_TYPE_CONTENT_AUDIO
|
|
||||||
f = [MyFile('foo'), MyFile('bar')]
|
|
||||||
f[0].audiosize = 1
|
|
||||||
f[1].audiosize = 2
|
|
||||||
eq_(len(s.GetDupeGroups(f)), 0)
|
|
||||||
|
|
||||||
def test_ignore_list():
|
|
||||||
s = Scanner()
|
|
||||||
f1 = no('foobar')
|
|
||||||
f2 = no('foobar')
|
|
||||||
f3 = no('foobar')
|
|
||||||
f1.path = Path('dir1/foobar')
|
|
||||||
f2.path = Path('dir2/foobar')
|
|
||||||
f3.path = Path('dir3/foobar')
|
|
||||||
s.ignore_list.Ignore(str(f1.path),str(f2.path))
|
|
||||||
s.ignore_list.Ignore(str(f1.path),str(f3.path))
|
|
||||||
r = s.GetDupeGroups([f1,f2,f3])
|
|
||||||
eq_(len(r), 1)
|
|
||||||
g = r[0]
|
|
||||||
eq_(len(g.dupes), 1)
|
|
||||||
assert f1 not in g
|
|
||||||
assert f2 in g
|
|
||||||
assert f3 in g
|
|
||||||
# Ignored matches are not counted as discarded
|
|
||||||
eq_(s.discarded_file_count, 0)
|
|
||||||
|
|
||||||
def test_ignore_list_checks_for_unicode():
|
|
||||||
#scanner was calling path_str for ignore list checks. Since the Path changes, it must
|
|
||||||
#be unicode(path)
|
|
||||||
s = Scanner()
|
|
||||||
f1 = no('foobar')
|
|
||||||
f2 = no('foobar')
|
|
||||||
f3 = no('foobar')
|
|
||||||
f1.path = Path(u'foo1\u00e9')
|
|
||||||
f2.path = Path(u'foo2\u00e9')
|
|
||||||
f3.path = Path(u'foo3\u00e9')
|
|
||||||
s.ignore_list.Ignore(unicode(f1.path),unicode(f2.path))
|
|
||||||
s.ignore_list.Ignore(unicode(f1.path),unicode(f3.path))
|
|
||||||
r = s.GetDupeGroups([f1,f2,f3])
|
|
||||||
eq_(len(r), 1)
|
|
||||||
g = r[0]
|
|
||||||
eq_(len(g.dupes), 1)
|
|
||||||
assert f1 not in g
|
|
||||||
assert f2 in g
|
|
||||||
assert f3 in g
|
|
||||||
|
|
||||||
def test_file_evaluates_to_false():
|
|
||||||
# A very wrong way to use any() was added at some point, causing resulting group list
|
|
||||||
# to be empty.
|
|
||||||
class FalseNamedObject(NamedObject):
|
|
||||||
def __nonzero__(self):
|
|
||||||
return False
|
|
||||||
|
|
||||||
|
|
||||||
s = Scanner()
|
|
||||||
f1 = FalseNamedObject('foobar')
|
|
||||||
f2 = FalseNamedObject('foobar')
|
|
||||||
r = s.GetDupeGroups([f1, f2])
|
|
||||||
eq_(len(r), 1)
|
|
||||||
|
|
||||||
def test_size_threshold():
|
|
||||||
# Only file equal or higher than the size_threshold in size are scanned
|
|
||||||
s = Scanner()
|
|
||||||
f1 = no('foo', 1)
|
|
||||||
f2 = no('foo', 2)
|
|
||||||
f3 = no('foo', 3)
|
|
||||||
s.size_threshold = 2
|
|
||||||
groups = s.GetDupeGroups([f1,f2,f3])
|
|
||||||
eq_(len(groups), 1)
|
|
||||||
[group] = groups
|
|
||||||
eq_(len(group), 2)
|
|
||||||
assert f1 not in group
|
|
||||||
assert f2 in group
|
|
||||||
assert f3 in group
|
|
||||||
|
|
||||||
def test_tie_breaker_path_deepness():
|
|
||||||
# If there is a tie in prioritization, path deepness is used as a tie breaker
|
|
||||||
s = Scanner()
|
|
||||||
o1, o2 = no('foo'), no('foo')
|
|
||||||
o1.path = Path('foo')
|
|
||||||
o2.path = Path('foo/bar')
|
|
||||||
[group] = s.GetDupeGroups([o1, o2])
|
|
||||||
assert group.ref is o2
|
|
||||||
|
|
||||||
def test_tie_breaker_copy():
|
|
||||||
# if copy is in the words used (even if it has a deeper path), it becomes a dupe
|
|
||||||
s = Scanner()
|
|
||||||
o1, o2 = no('foo bar Copy'), no('foo bar')
|
|
||||||
o1.path = Path('deeper/path')
|
|
||||||
o2.path = Path('foo')
|
|
||||||
[group] = s.GetDupeGroups([o1, o2])
|
|
||||||
assert group.ref is o2
|
|
||||||
|
|
||||||
def test_tie_breaker_same_name_plus_digit():
|
|
||||||
# if ref has the same words as dupe, but has some just one extra word which is a digit, it
|
|
||||||
# becomes a dupe
|
|
||||||
s = Scanner()
|
|
||||||
o1, o2 = no('foo bar 42'), no('foo bar')
|
|
||||||
o1.path = Path('deeper/path')
|
|
||||||
o2.path = Path('foo')
|
|
||||||
[group] = s.GetDupeGroups([o1, o2])
|
|
||||||
assert group.ref is o2
|
|
||||||
|
|
||||||
def test_partial_group_match():
|
|
||||||
# Count the number od discarded matches (when a file doesn't match all other dupes of the
|
|
||||||
# group) in Scanner.discarded_file_count
|
|
||||||
s = Scanner()
|
|
||||||
o1, o2, o3 = no('a b'), no('a'), no('b')
|
|
||||||
s.min_match_percentage = 50
|
|
||||||
[group] = s.GetDupeGroups([o1, o2, o3])
|
|
||||||
eq_(len(group), 2)
|
|
||||||
assert o1 in group
|
|
||||||
assert o2 in group
|
|
||||||
assert o3 not in group
|
|
||||||
eq_(s.discarded_file_count, 1)
|
|
||||||
@@ -1,37 +0,0 @@
|
|||||||
# Created By: Virgil Dupras
|
|
||||||
# Created On: 2009-05-09
|
|
||||||
# $Id$
|
|
||||||
# Copyright 2009 Hardcoded Software (http://www.hardcoded.net)
|
|
||||||
#
|
|
||||||
# This software is licensed under the "HS" License as described in the "LICENSE" file,
|
|
||||||
# which should be included with this package. The terms are also available at
|
|
||||||
# http://www.hardcoded.net/licenses/hs_license
|
|
||||||
|
|
||||||
from PyQt4.QtCore import Qt, QCoreApplication, SIGNAL
|
|
||||||
from PyQt4.QtGui import QDialog, QDialogButtonBox, QPixmap
|
|
||||||
|
|
||||||
from about_box_ui import Ui_AboutBox
|
|
||||||
|
|
||||||
class AboutBox(QDialog, Ui_AboutBox):
|
|
||||||
def __init__(self, parent, app):
|
|
||||||
flags = Qt.CustomizeWindowHint | Qt.WindowTitleHint | Qt.WindowSystemMenuHint | Qt.MSWindowsFixedSizeDialogHint
|
|
||||||
QDialog.__init__(self, parent, flags)
|
|
||||||
self.app = app
|
|
||||||
self._setupUi()
|
|
||||||
|
|
||||||
self.connect(self.buttonBox, SIGNAL('clicked(QAbstractButton*)'), self.buttonClicked)
|
|
||||||
|
|
||||||
def _setupUi(self):
|
|
||||||
self.setupUi(self)
|
|
||||||
# Stuff that can't be done in the Designer
|
|
||||||
self.setWindowTitle(u"About %s" % QCoreApplication.instance().applicationName())
|
|
||||||
self.nameLabel.setText(QCoreApplication.instance().applicationName())
|
|
||||||
self.versionLabel.setText('Version ' + QCoreApplication.instance().applicationVersion())
|
|
||||||
self.logoLabel.setPixmap(QPixmap(':/%s_big' % self.app.LOGO_NAME))
|
|
||||||
self.registerButton = self.buttonBox.addButton("Register", QDialogButtonBox.ActionRole)
|
|
||||||
|
|
||||||
#--- Events
|
|
||||||
def buttonClicked(self, button):
|
|
||||||
if button is self.registerButton:
|
|
||||||
self.app.ask_for_reg_code()
|
|
||||||
|
|
||||||
@@ -1,133 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<ui version="4.0">
|
|
||||||
<class>AboutBox</class>
|
|
||||||
<widget class="QDialog" name="AboutBox">
|
|
||||||
<property name="geometry">
|
|
||||||
<rect>
|
|
||||||
<x>0</x>
|
|
||||||
<y>0</y>
|
|
||||||
<width>400</width>
|
|
||||||
<height>190</height>
|
|
||||||
</rect>
|
|
||||||
</property>
|
|
||||||
<property name="sizePolicy">
|
|
||||||
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
|
|
||||||
<horstretch>0</horstretch>
|
|
||||||
<verstretch>0</verstretch>
|
|
||||||
</sizepolicy>
|
|
||||||
</property>
|
|
||||||
<property name="windowTitle">
|
|
||||||
<string>About dupeGuru</string>
|
|
||||||
</property>
|
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout">
|
|
||||||
<item>
|
|
||||||
<widget class="QLabel" name="logoLabel">
|
|
||||||
<property name="text">
|
|
||||||
<string/>
|
|
||||||
</property>
|
|
||||||
<property name="pixmap">
|
|
||||||
<pixmap resource="dg.qrc">:/logo_me_big</pixmap>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<layout class="QVBoxLayout" name="verticalLayout">
|
|
||||||
<item>
|
|
||||||
<widget class="QLabel" name="nameLabel">
|
|
||||||
<property name="font">
|
|
||||||
<font>
|
|
||||||
<weight>75</weight>
|
|
||||||
<bold>true</bold>
|
|
||||||
</font>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>dupeGuru</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QLabel" name="versionLabel">
|
|
||||||
<property name="text">
|
|
||||||
<string>Version</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QLabel" name="label_3">
|
|
||||||
<property name="text">
|
|
||||||
<string>Copyright Hardcoded Software 2009</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QLabel" name="label">
|
|
||||||
<property name="font">
|
|
||||||
<font>
|
|
||||||
<weight>75</weight>
|
|
||||||
<bold>true</bold>
|
|
||||||
</font>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Registered To:</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QLabel" name="registeredEmailLabel">
|
|
||||||
<property name="text">
|
|
||||||
<string>UNREGISTERED</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QDialogButtonBox" name="buttonBox">
|
|
||||||
<property name="orientation">
|
|
||||||
<enum>Qt::Horizontal</enum>
|
|
||||||
</property>
|
|
||||||
<property name="standardButtons">
|
|
||||||
<set>QDialogButtonBox::Ok</set>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</widget>
|
|
||||||
<resources>
|
|
||||||
<include location="dg.qrc"/>
|
|
||||||
</resources>
|
|
||||||
<connections>
|
|
||||||
<connection>
|
|
||||||
<sender>buttonBox</sender>
|
|
||||||
<signal>accepted()</signal>
|
|
||||||
<receiver>AboutBox</receiver>
|
|
||||||
<slot>accept()</slot>
|
|
||||||
<hints>
|
|
||||||
<hint type="sourcelabel">
|
|
||||||
<x>248</x>
|
|
||||||
<y>254</y>
|
|
||||||
</hint>
|
|
||||||
<hint type="destinationlabel">
|
|
||||||
<x>157</x>
|
|
||||||
<y>274</y>
|
|
||||||
</hint>
|
|
||||||
</hints>
|
|
||||||
</connection>
|
|
||||||
<connection>
|
|
||||||
<sender>buttonBox</sender>
|
|
||||||
<signal>rejected()</signal>
|
|
||||||
<receiver>AboutBox</receiver>
|
|
||||||
<slot>reject()</slot>
|
|
||||||
<hints>
|
|
||||||
<hint type="sourcelabel">
|
|
||||||
<x>316</x>
|
|
||||||
<y>260</y>
|
|
||||||
</hint>
|
|
||||||
<hint type="destinationlabel">
|
|
||||||
<x>286</x>
|
|
||||||
<y>274</y>
|
|
||||||
</hint>
|
|
||||||
</hints>
|
|
||||||
</connection>
|
|
||||||
</connections>
|
|
||||||
</ui>
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
<!DOCTYPE RCC><RCC version="1.0">
|
|
||||||
<qresource>
|
|
||||||
<file alias="details">images/details32.png</file>
|
|
||||||
<file alias="logo_pe">images/dgpe_logo_32.png</file>
|
|
||||||
<file alias="logo_pe_big">images/dgpe_logo_128.png</file>
|
|
||||||
<file alias="logo_me">images/dgme_logo_32.png</file>
|
|
||||||
<file alias="logo_me_big">images/dgme_logo_128.png</file>
|
|
||||||
<file alias="logo_se">images/dgse_logo_32.png</file>
|
|
||||||
<file alias="logo_se_big">images/dgse_logo_128.png</file>
|
|
||||||
<file alias="folder">images/folderwin32.png</file>
|
|
||||||
<file alias="gear">images/gear.png</file>
|
|
||||||
<file alias="preferences">images/preferences32.png</file>
|
|
||||||
<file alias="actions">images/actions32.png</file>
|
|
||||||
<file alias="delta">images/delta32.png</file>
|
|
||||||
<file alias="power_marker">images/power_marker32.png</file>
|
|
||||||
</qresource>
|
|
||||||
</RCC>
|
|
||||||
@@ -1,36 +0,0 @@
|
|||||||
# Created By: Virgil Dupras
|
|
||||||
# Created On: 2009-05-09
|
|
||||||
# $Id$
|
|
||||||
# Copyright 2009 Hardcoded Software (http://www.hardcoded.net)
|
|
||||||
#
|
|
||||||
# This software is licensed under the "HS" License as described in the "LICENSE" file,
|
|
||||||
# which should be included with this package. The terms are also available at
|
|
||||||
# http://www.hardcoded.net/licenses/hs_license
|
|
||||||
|
|
||||||
from hashlib import md5
|
|
||||||
|
|
||||||
from PyQt4.QtGui import QDialog
|
|
||||||
|
|
||||||
from reg_submit_dialog import RegSubmitDialog
|
|
||||||
from reg_demo_dialog import RegDemoDialog
|
|
||||||
|
|
||||||
class Registration(object):
|
|
||||||
def __init__(self, app):
|
|
||||||
self.app = app
|
|
||||||
|
|
||||||
def ask_for_code(self):
|
|
||||||
dialog = RegSubmitDialog(self.app.main_window, self.app.is_code_valid)
|
|
||||||
result = dialog.exec_()
|
|
||||||
code = unicode(dialog.codeEdit.text())
|
|
||||||
email = unicode(dialog.emailEdit.text())
|
|
||||||
dialog.setParent(None) # free it
|
|
||||||
if result == QDialog.Accepted and self.app.is_code_valid(code, email):
|
|
||||||
self.app.set_registration(code, email)
|
|
||||||
return True
|
|
||||||
return False
|
|
||||||
|
|
||||||
def show_nag(self):
|
|
||||||
dialog = RegDemoDialog(self.app.main_window, self)
|
|
||||||
dialog.exec_()
|
|
||||||
dialog.setParent(None) # free it
|
|
||||||
|
|
||||||
@@ -1,47 +0,0 @@
|
|||||||
# Created By: Virgil Dupras
|
|
||||||
# Created On: 2009-05-10
|
|
||||||
# $Id$
|
|
||||||
# Copyright 2009 Hardcoded Software (http://www.hardcoded.net)
|
|
||||||
#
|
|
||||||
# This software is licensed under the "HS" License as described in the "LICENSE" file,
|
|
||||||
# which should be included with this package. The terms are also available at
|
|
||||||
# http://www.hardcoded.net/licenses/hs_license
|
|
||||||
|
|
||||||
from PyQt4.QtCore import SIGNAL, Qt, QUrl, QCoreApplication
|
|
||||||
from PyQt4.QtGui import QDialog, QMessageBox, QDesktopServices
|
|
||||||
|
|
||||||
from reg_demo_dialog_ui import Ui_RegDemoDialog
|
|
||||||
|
|
||||||
class RegDemoDialog(QDialog, Ui_RegDemoDialog):
|
|
||||||
def __init__(self, parent, reg):
|
|
||||||
flags = Qt.CustomizeWindowHint | Qt.WindowTitleHint | Qt.WindowSystemMenuHint
|
|
||||||
QDialog.__init__(self, parent, flags)
|
|
||||||
self.reg = reg
|
|
||||||
self._setupUi()
|
|
||||||
|
|
||||||
self.connect(self.enterCodeButton, SIGNAL('clicked()'), self.enterCodeClicked)
|
|
||||||
self.connect(self.purchaseButton, SIGNAL('clicked()'), self.purchaseClicked)
|
|
||||||
|
|
||||||
def _setupUi(self):
|
|
||||||
self.setupUi(self)
|
|
||||||
# Stuff that can't be setup in the Designer
|
|
||||||
appname = QCoreApplication.instance().applicationName()
|
|
||||||
title = self.windowTitle()
|
|
||||||
title = title.replace('$appname', appname)
|
|
||||||
self.setWindowTitle(title)
|
|
||||||
title = self.titleLabel.text()
|
|
||||||
title = title.replace('$appname', appname)
|
|
||||||
self.titleLabel.setText(title)
|
|
||||||
desc = self.demoDescLabel.text()
|
|
||||||
desc = desc.replace('$appname', appname)
|
|
||||||
self.demoDescLabel.setText(desc)
|
|
||||||
|
|
||||||
#--- Events
|
|
||||||
def enterCodeClicked(self):
|
|
||||||
if self.reg.ask_for_code():
|
|
||||||
self.accept()
|
|
||||||
|
|
||||||
def purchaseClicked(self):
|
|
||||||
url = QUrl('http://www.hardcoded.net/purchase.htm')
|
|
||||||
QDesktopServices.openUrl(url)
|
|
||||||
|
|
||||||
@@ -1,140 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<ui version="4.0">
|
|
||||||
<class>RegDemoDialog</class>
|
|
||||||
<widget class="QDialog" name="RegDemoDialog">
|
|
||||||
<property name="geometry">
|
|
||||||
<rect>
|
|
||||||
<x>0</x>
|
|
||||||
<y>0</y>
|
|
||||||
<width>387</width>
|
|
||||||
<height>161</height>
|
|
||||||
</rect>
|
|
||||||
</property>
|
|
||||||
<property name="windowTitle">
|
|
||||||
<string>$appname Demo Version</string>
|
|
||||||
</property>
|
|
||||||
<layout class="QVBoxLayout" name="verticalLayout">
|
|
||||||
<item>
|
|
||||||
<widget class="QLabel" name="titleLabel">
|
|
||||||
<property name="font">
|
|
||||||
<font>
|
|
||||||
<weight>75</weight>
|
|
||||||
<bold>true</bold>
|
|
||||||
</font>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>$appname Demo Version</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QLabel" name="demoDescLabel">
|
|
||||||
<property name="text">
|
|
||||||
<string>You are currently running a demo version of $appname. This version has limited functionalities, and you need to buy it to have access to these functionalities.</string>
|
|
||||||
</property>
|
|
||||||
<property name="wordWrap">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QLabel" name="label_3">
|
|
||||||
<property name="text">
|
|
||||||
<string>In the demo version, only 10 duplicates per session can be sent to the recycle bin, moved or copied.</string>
|
|
||||||
</property>
|
|
||||||
<property name="wordWrap">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<spacer name="verticalSpacer">
|
|
||||||
<property name="orientation">
|
|
||||||
<enum>Qt::Vertical</enum>
|
|
||||||
</property>
|
|
||||||
<property name="sizeHint" stdset="0">
|
|
||||||
<size>
|
|
||||||
<width>20</width>
|
|
||||||
<height>40</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
</spacer>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout">
|
|
||||||
<item>
|
|
||||||
<spacer name="horizontalSpacer">
|
|
||||||
<property name="orientation">
|
|
||||||
<enum>Qt::Horizontal</enum>
|
|
||||||
</property>
|
|
||||||
<property name="sizeHint" stdset="0">
|
|
||||||
<size>
|
|
||||||
<width>40</width>
|
|
||||||
<height>20</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
</spacer>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QPushButton" name="tryButton">
|
|
||||||
<property name="minimumSize">
|
|
||||||
<size>
|
|
||||||
<width>110</width>
|
|
||||||
<height>0</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Try Demo</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QPushButton" name="enterCodeButton">
|
|
||||||
<property name="minimumSize">
|
|
||||||
<size>
|
|
||||||
<width>110</width>
|
|
||||||
<height>0</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Enter Code</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QPushButton" name="purchaseButton">
|
|
||||||
<property name="minimumSize">
|
|
||||||
<size>
|
|
||||||
<width>110</width>
|
|
||||||
<height>0</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Purchase</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</widget>
|
|
||||||
<resources/>
|
|
||||||
<connections>
|
|
||||||
<connection>
|
|
||||||
<sender>tryButton</sender>
|
|
||||||
<signal>clicked()</signal>
|
|
||||||
<receiver>RegDemoDialog</receiver>
|
|
||||||
<slot>accept()</slot>
|
|
||||||
<hints>
|
|
||||||
<hint type="sourcelabel">
|
|
||||||
<x>112</x>
|
|
||||||
<y>161</y>
|
|
||||||
</hint>
|
|
||||||
<hint type="destinationlabel">
|
|
||||||
<x>201</x>
|
|
||||||
<y>94</y>
|
|
||||||
</hint>
|
|
||||||
</hints>
|
|
||||||
</connection>
|
|
||||||
</connections>
|
|
||||||
</ui>
|
|
||||||
@@ -1,49 +0,0 @@
|
|||||||
# Created By: Virgil Dupras
|
|
||||||
# Created On: 2009-05-09
|
|
||||||
# $Id$
|
|
||||||
# Copyright 2009 Hardcoded Software (http://www.hardcoded.net)
|
|
||||||
#
|
|
||||||
# This software is licensed under the "HS" License as described in the "LICENSE" file,
|
|
||||||
# which should be included with this package. The terms are also available at
|
|
||||||
# http://www.hardcoded.net/licenses/hs_license
|
|
||||||
|
|
||||||
from PyQt4.QtCore import SIGNAL, Qt, QUrl, QCoreApplication
|
|
||||||
from PyQt4.QtGui import QDialog, QMessageBox, QDesktopServices
|
|
||||||
|
|
||||||
from reg_submit_dialog_ui import Ui_RegSubmitDialog
|
|
||||||
|
|
||||||
class RegSubmitDialog(QDialog, Ui_RegSubmitDialog):
|
|
||||||
def __init__(self, parent, is_valid_func):
|
|
||||||
flags = Qt.CustomizeWindowHint | Qt.WindowTitleHint | Qt.WindowSystemMenuHint
|
|
||||||
QDialog.__init__(self, parent, flags)
|
|
||||||
self._setupUi()
|
|
||||||
self.is_valid_func = is_valid_func
|
|
||||||
|
|
||||||
self.connect(self.submitButton, SIGNAL('clicked()'), self.submitClicked)
|
|
||||||
self.connect(self.purchaseButton, SIGNAL('clicked()'), self.purchaseClicked)
|
|
||||||
|
|
||||||
def _setupUi(self):
|
|
||||||
self.setupUi(self)
|
|
||||||
# Stuff that can't be setup in the Designer
|
|
||||||
appname = QCoreApplication.instance().applicationName()
|
|
||||||
prompt = self.promptLabel.text()
|
|
||||||
prompt = prompt.replace('$appname', appname)
|
|
||||||
self.promptLabel.setText(prompt)
|
|
||||||
|
|
||||||
#--- Events
|
|
||||||
def purchaseClicked(self):
|
|
||||||
url = QUrl('http://www.hardcoded.net/purchase.htm')
|
|
||||||
QDesktopServices.openUrl(url)
|
|
||||||
|
|
||||||
def submitClicked(self):
|
|
||||||
code = unicode(self.codeEdit.text())
|
|
||||||
email = unicode(self.emailEdit.text())
|
|
||||||
title = "Registration"
|
|
||||||
if self.is_valid_func(code, email):
|
|
||||||
msg = "This code is valid. Thanks!"
|
|
||||||
QMessageBox.information(self, title, msg)
|
|
||||||
self.accept()
|
|
||||||
else:
|
|
||||||
msg = "This code is invalid"
|
|
||||||
QMessageBox.warning(self, title, msg)
|
|
||||||
|
|
||||||
@@ -1,149 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<ui version="4.0">
|
|
||||||
<class>RegSubmitDialog</class>
|
|
||||||
<widget class="QDialog" name="RegSubmitDialog">
|
|
||||||
<property name="geometry">
|
|
||||||
<rect>
|
|
||||||
<x>0</x>
|
|
||||||
<y>0</y>
|
|
||||||
<width>365</width>
|
|
||||||
<height>134</height>
|
|
||||||
</rect>
|
|
||||||
</property>
|
|
||||||
<property name="windowTitle">
|
|
||||||
<string>Enter your registration code</string>
|
|
||||||
</property>
|
|
||||||
<layout class="QVBoxLayout" name="verticalLayout">
|
|
||||||
<item>
|
|
||||||
<widget class="QLabel" name="promptLabel">
|
|
||||||
<property name="text">
|
|
||||||
<string>Please enter your $appname registration code and registered e-mail (the e-mail you used for the purchase), then press "Submit".</string>
|
|
||||||
</property>
|
|
||||||
<property name="alignment">
|
|
||||||
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
|
|
||||||
</property>
|
|
||||||
<property name="wordWrap">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<layout class="QFormLayout" name="formLayout">
|
|
||||||
<property name="sizeConstraint">
|
|
||||||
<enum>QLayout::SetNoConstraint</enum>
|
|
||||||
</property>
|
|
||||||
<property name="fieldGrowthPolicy">
|
|
||||||
<enum>QFormLayout::ExpandingFieldsGrow</enum>
|
|
||||||
</property>
|
|
||||||
<property name="labelAlignment">
|
|
||||||
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
|
||||||
</property>
|
|
||||||
<property name="formAlignment">
|
|
||||||
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
|
|
||||||
</property>
|
|
||||||
<item row="0" column="0">
|
|
||||||
<widget class="QLabel" name="label_2">
|
|
||||||
<property name="text">
|
|
||||||
<string>Registration code:</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="1" column="0">
|
|
||||||
<widget class="QLabel" name="label_3">
|
|
||||||
<property name="text">
|
|
||||||
<string>Registered e-mail:</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="0" column="1">
|
|
||||||
<widget class="QLineEdit" name="codeEdit"/>
|
|
||||||
</item>
|
|
||||||
<item row="1" column="1">
|
|
||||||
<widget class="QLineEdit" name="emailEdit"/>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout">
|
|
||||||
<item>
|
|
||||||
<widget class="QPushButton" name="purchaseButton">
|
|
||||||
<property name="text">
|
|
||||||
<string>Purchase</string>
|
|
||||||
</property>
|
|
||||||
<property name="autoDefault">
|
|
||||||
<bool>false</bool>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<spacer name="horizontalSpacer">
|
|
||||||
<property name="orientation">
|
|
||||||
<enum>Qt::Horizontal</enum>
|
|
||||||
</property>
|
|
||||||
<property name="sizeHint" stdset="0">
|
|
||||||
<size>
|
|
||||||
<width>40</width>
|
|
||||||
<height>20</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
</spacer>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QPushButton" name="cancelButton">
|
|
||||||
<property name="sizePolicy">
|
|
||||||
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
|
|
||||||
<horstretch>0</horstretch>
|
|
||||||
<verstretch>0</verstretch>
|
|
||||||
</sizepolicy>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Cancel</string>
|
|
||||||
</property>
|
|
||||||
<property name="autoDefault">
|
|
||||||
<bool>false</bool>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QPushButton" name="submitButton">
|
|
||||||
<property name="sizePolicy">
|
|
||||||
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
|
|
||||||
<horstretch>0</horstretch>
|
|
||||||
<verstretch>0</verstretch>
|
|
||||||
</sizepolicy>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Submit</string>
|
|
||||||
</property>
|
|
||||||
<property name="autoDefault">
|
|
||||||
<bool>false</bool>
|
|
||||||
</property>
|
|
||||||
<property name="default">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</widget>
|
|
||||||
<resources/>
|
|
||||||
<connections>
|
|
||||||
<connection>
|
|
||||||
<sender>cancelButton</sender>
|
|
||||||
<signal>clicked()</signal>
|
|
||||||
<receiver>RegSubmitDialog</receiver>
|
|
||||||
<slot>reject()</slot>
|
|
||||||
<hints>
|
|
||||||
<hint type="sourcelabel">
|
|
||||||
<x>260</x>
|
|
||||||
<y>159</y>
|
|
||||||
</hint>
|
|
||||||
<hint type="destinationlabel">
|
|
||||||
<x>198</x>
|
|
||||||
<y>97</y>
|
|
||||||
</hint>
|
|
||||||
</hints>
|
|
||||||
</connection>
|
|
||||||
</connections>
|
|
||||||
</ui>
|
|
||||||
95
build.py
Normal file
95
build.py
Normal file
@@ -0,0 +1,95 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Created By: Virgil Dupras
|
||||||
|
# Created On: 2009-12-30
|
||||||
|
# Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
|
||||||
|
#
|
||||||
|
# This software is licensed under the "HS" License as described in the "LICENSE" file,
|
||||||
|
# which should be included with this package. The terms are also available at
|
||||||
|
# http://www.hardcoded.net/licenses/hs_license
|
||||||
|
|
||||||
|
import sys
|
||||||
|
import os
|
||||||
|
import os.path as op
|
||||||
|
import shutil
|
||||||
|
|
||||||
|
from setuptools import setup
|
||||||
|
import yaml
|
||||||
|
|
||||||
|
from hsdocgen import generate_help, filters
|
||||||
|
from hsutil.build import add_to_pythonpath, print_and_do, build_all_qt_ui, copy_packages
|
||||||
|
|
||||||
|
def main():
|
||||||
|
conf = yaml.load(open('conf.yaml'))
|
||||||
|
edition = conf['edition']
|
||||||
|
ui = conf['ui']
|
||||||
|
dev = conf['dev']
|
||||||
|
print "Building dupeGuru {0} with UI {1}".format(edition.upper(), ui)
|
||||||
|
if dev:
|
||||||
|
print "Building in Dev mode"
|
||||||
|
add_to_pythonpath('.')
|
||||||
|
print "Generating Help"
|
||||||
|
windows = sys.platform == 'win32'
|
||||||
|
tix = filters.tixgen("https://hardcoded.lighthouseapp.com/projects/31699-dupeguru/tickets/{0}")
|
||||||
|
help_dir = 'help_{0}'.format(edition)
|
||||||
|
dest_dir = 'dupeguru_{0}_help'.format(edition) if edition != 'se' else 'dupeguru_help'
|
||||||
|
help_basepath = op.abspath(help_dir)
|
||||||
|
help_destpath = op.abspath(op.join(help_dir, dest_dir))
|
||||||
|
generate_help.main(help_basepath, help_destpath, force_render=not dev, tix=tix, windows=windows)
|
||||||
|
|
||||||
|
print "Building dupeGuru"
|
||||||
|
if edition == 'pe':
|
||||||
|
os.chdir('core_pe')
|
||||||
|
os.system('python gen.py')
|
||||||
|
os.chdir('..')
|
||||||
|
if ui == 'cocoa':
|
||||||
|
if not dev:
|
||||||
|
print "Building help index"
|
||||||
|
os.system('open -a /Developer/Applications/Utilities/Help\\ Indexer.app {0}'.format(help_destpath))
|
||||||
|
|
||||||
|
print "Building dg_cocoa.plugin"
|
||||||
|
if op.exists('build'):
|
||||||
|
shutil.rmtree('build')
|
||||||
|
os.mkdir('build')
|
||||||
|
if not dev:
|
||||||
|
specific_packages = {
|
||||||
|
'se': ['core_se'],
|
||||||
|
'me': ['core_me', 'hsmedia'],
|
||||||
|
'pe': ['core_pe'],
|
||||||
|
}[edition]
|
||||||
|
copy_packages(['core', 'hsutil'] + specific_packages, 'build')
|
||||||
|
cocoa_project_path = 'cocoa/{0}'.format(edition)
|
||||||
|
shutil.copy(op.join(cocoa_project_path, 'dg_cocoa.py'), 'build')
|
||||||
|
os.chdir('build')
|
||||||
|
script_args = ['py2app', '-A'] if dev else ['py2app']
|
||||||
|
setup(
|
||||||
|
script_args = script_args,
|
||||||
|
plugin = ['dg_cocoa.py'],
|
||||||
|
setup_requires = ['py2app'],
|
||||||
|
)
|
||||||
|
os.chdir('..')
|
||||||
|
pluginpath = op.join(cocoa_project_path, 'dg_cocoa.plugin')
|
||||||
|
if op.exists(pluginpath):
|
||||||
|
shutil.rmtree(pluginpath)
|
||||||
|
shutil.move('build/dist/dg_cocoa.plugin', pluginpath)
|
||||||
|
if dev:
|
||||||
|
# In alias mode, the tweakings we do to the pythonpath aren't counted in. We have to
|
||||||
|
# manually put a .pth in the plugin
|
||||||
|
pthpath = op.join(pluginpath, 'Contents/Resources/dev.pth')
|
||||||
|
open(pthpath, 'w').write(op.abspath('.'))
|
||||||
|
os.chdir(cocoa_project_path)
|
||||||
|
print "Building the XCode project"
|
||||||
|
args = []
|
||||||
|
if dev:
|
||||||
|
args.append('-configuration dev')
|
||||||
|
else:
|
||||||
|
args.append('-configuration release')
|
||||||
|
args = ' '.join(args)
|
||||||
|
os.system('xcodebuild {0}'.format(args))
|
||||||
|
os.chdir('..')
|
||||||
|
elif ui == 'qt':
|
||||||
|
os.chdir(op.join('qt', edition))
|
||||||
|
os.system('python gen.py')
|
||||||
|
os.chdir(op.join('..', '..'))
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
main()
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
Copyright 2009 Hardcoded Software (http://www.hardcoded.net)
|
Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
|
||||||
|
|
||||||
This software is licensed under the "HS" License as described in the "LICENSE" file,
|
This software is licensed under the "HS" License as described in the "LICENSE" file,
|
||||||
which should be included with this package. The terms are also available at
|
which should be included with this package. The terms are also available at
|
||||||
@@ -9,17 +9,26 @@ http://www.hardcoded.net/licenses/hs_license
|
|||||||
#import <Cocoa/Cocoa.h>
|
#import <Cocoa/Cocoa.h>
|
||||||
#import "RecentDirectories.h"
|
#import "RecentDirectories.h"
|
||||||
#import "PyDupeGuru.h"
|
#import "PyDupeGuru.h"
|
||||||
|
#import "ResultWindow.h"
|
||||||
|
#import "DetailsPanel.h"
|
||||||
|
#import "DirectoryPanel.h"
|
||||||
|
|
||||||
@interface AppDelegateBase : NSObject
|
@interface AppDelegateBase : NSObject
|
||||||
{
|
{
|
||||||
IBOutlet PyDupeGuruBase *py;
|
IBOutlet PyDupeGuruBase *py;
|
||||||
IBOutlet RecentDirectories *recentDirectories;
|
IBOutlet RecentDirectories *recentDirectories;
|
||||||
IBOutlet NSMenuItem *unlockMenuItem;
|
IBOutlet NSMenuItem *unlockMenuItem;
|
||||||
|
IBOutlet ResultWindowBase *result;
|
||||||
|
|
||||||
NSString *_appName;
|
DirectoryPanel *_directoryPanel;
|
||||||
|
DetailsPanel *_detailsPanel;
|
||||||
|
BOOL _savedResults;
|
||||||
}
|
}
|
||||||
- (IBAction)unlockApp:(id)sender;
|
- (IBAction)unlockApp:(id)sender;
|
||||||
|
|
||||||
- (PyDupeGuruBase *)py;
|
- (PyDupeGuruBase *)py;
|
||||||
- (RecentDirectories *)recentDirectories;
|
- (RecentDirectories *)recentDirectories;
|
||||||
|
- (DirectoryPanel *)directoryPanel;
|
||||||
|
- (DetailsPanel *)detailsPanel;
|
||||||
|
- (void)saveResults;
|
||||||
@end
|
@end
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
Copyright 2009 Hardcoded Software (http://www.hardcoded.net)
|
Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
|
||||||
|
|
||||||
This software is licensed under the "HS" License as described in the "LICENSE" file,
|
This software is licensed under the "HS" License as described in the "LICENSE" file,
|
||||||
which should be included with this package. The terms are also available at
|
which should be included with this package. The terms are also available at
|
||||||
@@ -10,69 +10,50 @@ http://www.hardcoded.net/licenses/hs_license
|
|||||||
#import "ProgressController.h"
|
#import "ProgressController.h"
|
||||||
#import "RegistrationInterface.h"
|
#import "RegistrationInterface.h"
|
||||||
#import "Utils.h"
|
#import "Utils.h"
|
||||||
#import "ValueTransformers.h"
|
|
||||||
#import "Consts.h"
|
#import "Consts.h"
|
||||||
|
#import <Sparkle/SUUpdater.h>
|
||||||
|
|
||||||
@implementation AppDelegate
|
@implementation AppDelegateBase
|
||||||
+ (void)initialize
|
- (IBAction)unlockApp:(id)sender
|
||||||
{
|
{
|
||||||
NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];
|
if ([[self py] isRegistered])
|
||||||
NSMutableDictionary *d = [NSMutableDictionary dictionaryWithCapacity:10];
|
return;
|
||||||
[d setObject:[NSNumber numberWithInt:95] forKey:@"minMatchPercentage"];
|
RegistrationInterface *ri = [[RegistrationInterface alloc] initWithApp:[self py]];
|
||||||
[d setObject:[NSNumber numberWithInt:1] forKey:@"recreatePathType"];
|
if ([ri enterCode] == NSOKButton)
|
||||||
[d setObject:[NSNumber numberWithBool:NO] forKey:@"matchScaled"];
|
{
|
||||||
[d setObject:[NSNumber numberWithBool:YES] forKey:@"mixFileKind"];
|
NSString *menuTitle = [NSString stringWithFormat:@"Thanks for buying %@!",[py appName]];
|
||||||
[d setObject:[NSNumber numberWithBool:NO] forKey:@"useRegexpFilter"];
|
[unlockMenuItem setTitle:menuTitle];
|
||||||
[d setObject:[NSNumber numberWithBool:NO] forKey:@"removeEmptyFolders"];
|
}
|
||||||
[d setObject:[NSNumber numberWithBool:NO] forKey:@"debug"];
|
[ri release];
|
||||||
[d setObject:[NSArray array] forKey:@"recentDirectories"];
|
|
||||||
[d setObject:[NSArray array] forKey:@"columnsOrder"];
|
|
||||||
[d setObject:[NSDictionary dictionary] forKey:@"columnsWidth"];
|
|
||||||
[[NSUserDefaultsController sharedUserDefaultsController] setInitialValues:d];
|
|
||||||
[ud registerDefaults:d];
|
|
||||||
}
|
|
||||||
|
|
||||||
- (id)init
|
|
||||||
{
|
|
||||||
self = [super init];
|
|
||||||
_directoryPanel = nil;
|
|
||||||
_detailsPanel = nil;
|
|
||||||
_appName = APPNAME;
|
|
||||||
return self;
|
|
||||||
}
|
|
||||||
|
|
||||||
- (IBAction)openWebsite:(id)sender
|
|
||||||
{
|
|
||||||
[[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:@"http://www.hardcoded.net/dupeguru_pe"]];
|
|
||||||
}
|
|
||||||
|
|
||||||
- (IBAction)toggleDetailsPanel:(id)sender
|
|
||||||
{
|
|
||||||
if (!_detailsPanel)
|
|
||||||
_detailsPanel = [[DetailsPanel alloc] initWithPy:py];
|
|
||||||
if ([[_detailsPanel window] isVisible])
|
|
||||||
[[_detailsPanel window] close];
|
|
||||||
else
|
|
||||||
{
|
|
||||||
[[_detailsPanel window] orderFront:nil];
|
|
||||||
[_detailsPanel refresh];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
- (IBAction)toggleDirectories:(id)sender
|
|
||||||
{
|
|
||||||
[[self directoryPanel] toggleVisible:sender];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (PyDupeGuruBase *)py { return py; }
|
||||||
|
- (RecentDirectories *)recentDirectories { return recentDirectories; }
|
||||||
- (DirectoryPanel *)directoryPanel
|
- (DirectoryPanel *)directoryPanel
|
||||||
{
|
{
|
||||||
if (!_directoryPanel)
|
if (!_directoryPanel)
|
||||||
_directoryPanel = [[DirectoryPanel alloc] initWithParentApp:self];
|
_directoryPanel = [[DirectoryPanel alloc] initWithParentApp:self];
|
||||||
return _directoryPanel;
|
return _directoryPanel;
|
||||||
}
|
}
|
||||||
- (PyDupeGuru *)py { return (PyDupeGuru *)py; }
|
|
||||||
|
|
||||||
//Delegate
|
- (DetailsPanel *)detailsPanel
|
||||||
|
{
|
||||||
|
if (!_detailsPanel)
|
||||||
|
_detailsPanel = [[DetailsPanel alloc] initWithPy:py];
|
||||||
|
return _detailsPanel;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)saveResults
|
||||||
|
{
|
||||||
|
if (_savedResults) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
[py saveIgnoreList];
|
||||||
|
[py saveResults];
|
||||||
|
_savedResults = YES;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Delegate */
|
||||||
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
|
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
|
||||||
{
|
{
|
||||||
[[ProgressController mainProgressController] setWorker:py];
|
[[ProgressController mainProgressController] setWorker:py];
|
||||||
@@ -82,12 +63,15 @@ http://www.hardcoded.net/licenses/hs_license
|
|||||||
NSDictionary *columnsWidth = [ud dictionaryForKey:@"columnsWidth"];
|
NSDictionary *columnsWidth = [ud dictionaryForKey:@"columnsWidth"];
|
||||||
if ([columnsOrder count])
|
if ([columnsOrder count])
|
||||||
[result restoreColumnsPosition:columnsOrder widths:columnsWidth];
|
[result restoreColumnsPosition:columnsOrder widths:columnsWidth];
|
||||||
|
else
|
||||||
|
[result resetColumnsToDefault:nil];
|
||||||
//Reg stuff
|
//Reg stuff
|
||||||
if ([RegistrationInterface showNagWithApp:[self py] name:APPNAME limitDescription:LIMIT_DESC])
|
if ([RegistrationInterface showNagWithApp:[self py]])
|
||||||
[unlockMenuItem setTitle:@"Thanks for buying dupeGuru Picture Edition!"];
|
[unlockMenuItem setTitle:[NSString stringWithFormat:@"Thanks for buying %@!",[py appName]]];
|
||||||
//Restore results
|
//Restore results
|
||||||
[py loadIgnoreList];
|
[py loadIgnoreList];
|
||||||
[py loadResults];
|
[py loadResults];
|
||||||
|
_savedResults = NO;
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)applicationWillBecomeActive:(NSNotification *)aNotification
|
- (void)applicationWillBecomeActive:(NSNotification *)aNotification
|
||||||
@@ -101,9 +85,8 @@ http://www.hardcoded.net/licenses/hs_license
|
|||||||
NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];
|
NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];
|
||||||
[ud setObject: [result getColumnsOrder] forKey:@"columnsOrder"];
|
[ud setObject: [result getColumnsOrder] forKey:@"columnsOrder"];
|
||||||
[ud setObject: [result getColumnsWidth] forKey:@"columnsWidth"];
|
[ud setObject: [result getColumnsWidth] forKey:@"columnsWidth"];
|
||||||
[py saveIgnoreList];
|
[self saveResults];
|
||||||
[py saveResults];
|
NSInteger sc = [ud integerForKey:@"sessionCountSinceLastIgnorePurge"];
|
||||||
int sc = [ud integerForKey:@"sessionCountSinceLastIgnorePurge"];
|
|
||||||
if (sc >= 10)
|
if (sc >= 10)
|
||||||
{
|
{
|
||||||
sc = -1;
|
sc = -1;
|
||||||
@@ -121,4 +104,14 @@ http://www.hardcoded.net/licenses/hs_license
|
|||||||
{
|
{
|
||||||
[[self directoryPanel] addDirectory:directory];
|
[[self directoryPanel] addDirectory:directory];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* SUUpdater delegate */
|
||||||
|
|
||||||
|
- (BOOL)updater:(SUUpdater *)updater shouldPostponeRelaunchForUpdate:(SUAppcastItem *)update untilInvoking:(NSInvocation *)invocation;
|
||||||
|
{
|
||||||
|
/* If results aren't saved now, we might get a weird utf-8 lookup error when saving later.
|
||||||
|
**/
|
||||||
|
[self saveResults];
|
||||||
|
return NO;
|
||||||
|
}
|
||||||
@end
|
@end
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
Copyright 2009 Hardcoded Software (http://www.hardcoded.net)
|
Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
|
||||||
|
|
||||||
This software is licensed under the "HS" License as described in the "LICENSE" file,
|
This software is licensed under the "HS" License as described in the "LICENSE" file,
|
||||||
which should be included with this package. The terms are also available at
|
which should be included with this package. The terms are also available at
|
||||||
@@ -8,7 +8,6 @@ http://www.hardcoded.net/licenses/hs_license
|
|||||||
|
|
||||||
#import <Cocoa/Cocoa.h>
|
#import <Cocoa/Cocoa.h>
|
||||||
|
|
||||||
#define DuplicateSelectionChangedNotification @"DuplicateSelectionChangedNotification"
|
|
||||||
/* ResultsChangedNotification happens on major changes, which requires a complete reload of the data*/
|
/* ResultsChangedNotification happens on major changes, which requires a complete reload of the data*/
|
||||||
#define ResultsChangedNotification @"ResultsChangedNotification"
|
#define ResultsChangedNotification @"ResultsChangedNotification"
|
||||||
/* ResultsChangedNotification happens on minor changes, which requires buffer flush*/
|
/* ResultsChangedNotification happens on minor changes, which requires buffer flush*/
|
||||||
@@ -25,4 +24,3 @@ http://www.hardcoded.net/licenses/hs_license
|
|||||||
#define jobDelete @"job_delete"
|
#define jobDelete @"job_delete"
|
||||||
|
|
||||||
#define DEMO_MAX_ACTION_COUNT 10
|
#define DEMO_MAX_ACTION_COUNT 10
|
||||||
#define LIMIT_DESC @"In the demo version, only 10 duplicates per session can be sent to Trash, moved or copied."
|
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
Copyright 2009 Hardcoded Software (http://www.hardcoded.net)
|
Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
|
||||||
|
|
||||||
This software is licensed under the "HS" License as described in the "LICENSE" file,
|
This software is licensed under the "HS" License as described in the "LICENSE" file,
|
||||||
which should be included with this package. The terms are also available at
|
which should be included with this package. The terms are also available at
|
||||||
@@ -8,17 +8,18 @@ http://www.hardcoded.net/licenses/hs_license
|
|||||||
|
|
||||||
#import <Cocoa/Cocoa.h>
|
#import <Cocoa/Cocoa.h>
|
||||||
#import "PyApp.h"
|
#import "PyApp.h"
|
||||||
#import "Table.h"
|
#import "PyDetailsPanel.h"
|
||||||
|
|
||||||
|
@interface DetailsPanel : NSWindowController
|
||||||
@interface DetailsPanelBase : NSWindowController
|
|
||||||
{
|
{
|
||||||
IBOutlet TableView *detailsTable;
|
IBOutlet NSTableView *detailsTable;
|
||||||
|
|
||||||
|
PyDetailsPanel *py;
|
||||||
}
|
}
|
||||||
- (id)initWithPy:(PyApp *)aPy;
|
- (id)initWithPy:(PyApp *)aPy;
|
||||||
|
|
||||||
- (void)refresh;
|
- (void)toggleVisibility;
|
||||||
|
|
||||||
/* Notifications */
|
/* Python --> Cocoa */
|
||||||
- (void)duplicateSelectionChanged:(NSNotification *)aNotification;
|
- (void)refresh;
|
||||||
@end
|
@end
|
||||||
62
cocoa/base/DetailsPanel.m
Normal file
62
cocoa/base/DetailsPanel.m
Normal file
@@ -0,0 +1,62 @@
|
|||||||
|
/*
|
||||||
|
Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
|
||||||
|
|
||||||
|
This software is licensed under the "HS" License as described in the "LICENSE" file,
|
||||||
|
which should be included with this package. The terms are also available at
|
||||||
|
http://www.hardcoded.net/licenses/hs_license
|
||||||
|
*/
|
||||||
|
|
||||||
|
#import "DetailsPanel.h"
|
||||||
|
#import "Utils.h"
|
||||||
|
|
||||||
|
@implementation DetailsPanel
|
||||||
|
- (id)initWithPy:(PyApp *)aPy
|
||||||
|
{
|
||||||
|
self = [super initWithWindowNibName:@"DetailsPanel"];
|
||||||
|
[self window]; //So the detailsTable is initialized.
|
||||||
|
Class pyClass = [Utils classNamed:@"PyDetailsPanel"];
|
||||||
|
py = [[pyClass alloc] initWithCocoa:self pyParent:aPy];
|
||||||
|
return self;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)dealloc
|
||||||
|
{
|
||||||
|
[py release];
|
||||||
|
[super dealloc];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)refreshDetails
|
||||||
|
{
|
||||||
|
[detailsTable reloadData];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)toggleVisibility
|
||||||
|
{
|
||||||
|
if ([[self window] isVisible]) {
|
||||||
|
[[self window] close];
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
[self refreshDetails]; // selection might have changed since last time
|
||||||
|
[[self window] orderFront:nil];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* NSTableView Delegate */
|
||||||
|
- (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView
|
||||||
|
{
|
||||||
|
return [py numberOfRows];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (id)tableView:(NSTableView *)tableView objectValueForTableColumn:(NSTableColumn *)column row:(NSInteger)row
|
||||||
|
{
|
||||||
|
return [py valueForColumn:[column identifier] row:row];
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Python --> Cocoa */
|
||||||
|
- (void)refresh
|
||||||
|
{
|
||||||
|
if ([[self window] isVisible]) {
|
||||||
|
[self refreshDetails];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@end
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
Copyright 2009 Hardcoded Software (http://www.hardcoded.net)
|
Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
|
||||||
|
|
||||||
This software is licensed under the "HS" License as described in the "LICENSE" file,
|
This software is licensed under the "HS" License as described in the "LICENSE" file,
|
||||||
which should be included with this package. The terms are also available at
|
which should be included with this package. The terms are also available at
|
||||||
@@ -11,10 +11,19 @@ http://www.hardcoded.net/licenses/hs_license
|
|||||||
#import "Outline.h"
|
#import "Outline.h"
|
||||||
#import "PyDupeGuru.h"
|
#import "PyDupeGuru.h"
|
||||||
|
|
||||||
@interface DirectoryPanelBase : NSWindowController
|
@interface DirectoryOutline : OutlineView
|
||||||
|
{
|
||||||
|
}
|
||||||
|
@end
|
||||||
|
|
||||||
|
@protocol DirectoryOutlineDelegate
|
||||||
|
- (void)outlineView:(NSOutlineView *)outlineView addDirectory:(NSString *)directory;
|
||||||
|
@end
|
||||||
|
|
||||||
|
@interface DirectoryPanel : NSWindowController
|
||||||
{
|
{
|
||||||
IBOutlet NSPopUpButton *addButtonPopUp;
|
IBOutlet NSPopUpButton *addButtonPopUp;
|
||||||
IBOutlet OutlineView *directories;
|
IBOutlet DirectoryOutline *directories;
|
||||||
IBOutlet NSButton *removeButton;
|
IBOutlet NSButton *removeButton;
|
||||||
|
|
||||||
PyDupeGuruBase *_py;
|
PyDupeGuruBase *_py;
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
Copyright 2009 Hardcoded Software (http://www.hardcoded.net)
|
Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
|
||||||
|
|
||||||
This software is licensed under the "HS" License as described in the "LICENSE" file,
|
This software is licensed under the "HS" License as described in the "LICENSE" file,
|
||||||
which should be included with this package. The terms are also available at
|
which should be included with this package. The terms are also available at
|
||||||
@@ -11,10 +11,52 @@ http://www.hardcoded.net/licenses/hs_license
|
|||||||
#import "Utils.h"
|
#import "Utils.h"
|
||||||
#import "AppDelegate.h"
|
#import "AppDelegate.h"
|
||||||
|
|
||||||
@implementation DirectoryPanelBase
|
@implementation DirectoryOutline
|
||||||
|
- (void)doInit
|
||||||
|
{
|
||||||
|
[super doInit];
|
||||||
|
[self registerForDraggedTypes:[NSArray arrayWithObject:NSFilenamesPboardType]];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (NSDragOperation)outlineView:(NSOutlineView *)outlineView validateDrop:(id < NSDraggingInfo >)info proposedItem:(id)item proposedChildIndex:(NSInteger)index
|
||||||
|
{
|
||||||
|
NSPasteboard *pboard;
|
||||||
|
NSDragOperation sourceDragMask;
|
||||||
|
sourceDragMask = [info draggingSourceOperationMask];
|
||||||
|
pboard = [info draggingPasteboard];
|
||||||
|
if ([[pboard types] containsObject:NSFilenamesPboardType])
|
||||||
|
{
|
||||||
|
if (sourceDragMask & NSDragOperationLink)
|
||||||
|
return NSDragOperationLink;
|
||||||
|
}
|
||||||
|
return NSDragOperationNone;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (BOOL)outlineView:(NSOutlineView *)outlineView acceptDrop:(id < NSDraggingInfo >)info item:(id)item childIndex:(NSInteger)index
|
||||||
|
{
|
||||||
|
NSPasteboard *pboard;
|
||||||
|
NSDragOperation sourceDragMask;
|
||||||
|
sourceDragMask = [info draggingSourceOperationMask];
|
||||||
|
pboard = [info draggingPasteboard];
|
||||||
|
if ( [[pboard types] containsObject:NSFilenamesPboardType] )
|
||||||
|
{
|
||||||
|
NSArray *filenames = [pboard propertyListForType:NSFilenamesPboardType];
|
||||||
|
if (!(sourceDragMask & NSDragOperationLink))
|
||||||
|
return NO;
|
||||||
|
if (([self delegate] == nil) || (![[self delegate] respondsToSelector:@selector(outlineView:addDirectory:)]))
|
||||||
|
return NO;
|
||||||
|
for (NSString *filename in filenames)
|
||||||
|
[[self delegate] outlineView:self addDirectory:filename];
|
||||||
|
}
|
||||||
|
return YES;
|
||||||
|
}
|
||||||
|
|
||||||
|
@end
|
||||||
|
|
||||||
|
@implementation DirectoryPanel
|
||||||
- (id)initWithParentApp:(id)aParentApp
|
- (id)initWithParentApp:(id)aParentApp
|
||||||
{
|
{
|
||||||
self = [super initWithWindowNibName:@"Directories"];
|
self = [super initWithWindowNibName:@"DirectoryPanel"];
|
||||||
[self window];
|
[self window];
|
||||||
AppDelegateBase *app = aParentApp;
|
AppDelegateBase *app = aParentApp;
|
||||||
_py = [app py];
|
_py = [app py];
|
||||||
@@ -24,7 +66,7 @@ http://www.hardcoded.net/licenses/hs_license
|
|||||||
[cell addItemWithTitle:@"Normal"];
|
[cell addItemWithTitle:@"Normal"];
|
||||||
[cell addItemWithTitle:@"Reference"];
|
[cell addItemWithTitle:@"Reference"];
|
||||||
[cell addItemWithTitle:@"Excluded"];
|
[cell addItemWithTitle:@"Excluded"];
|
||||||
for (int i=0;i<[[cell itemArray] count];i++)
|
for (NSInteger i=0;i<[[cell itemArray] count];i++)
|
||||||
{
|
{
|
||||||
NSMenuItem *mi = [[cell itemArray] objectAtIndex:i];
|
NSMenuItem *mi = [[cell itemArray] objectAtIndex:i];
|
||||||
[mi setTarget:self];
|
[mi setTarget:self];
|
||||||
@@ -93,8 +135,8 @@ http://www.hardcoded.net/licenses/hs_license
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
int state = n2i([[node buffer] objectAtIndex:1]);
|
NSInteger state = n2i([[node buffer] objectAtIndex:1]);
|
||||||
int newState = state == 2 ? 0 : 2; // If excluded, put it back
|
NSInteger newState = state == 2 ? 0 : 2; // If excluded, put it back
|
||||||
[_py setDirectory:p2a([node indexPath]) state:i2n(newState)];
|
[_py setDirectory:p2a([node indexPath]) state:i2n(newState)];
|
||||||
[node resetAllBuffers];
|
[node resetAllBuffers];
|
||||||
[directories display];
|
[directories display];
|
||||||
@@ -104,9 +146,6 @@ http://www.hardcoded.net/licenses/hs_license
|
|||||||
|
|
||||||
- (IBAction)toggleVisible:(id)sender
|
- (IBAction)toggleVisible:(id)sender
|
||||||
{
|
{
|
||||||
if ([[self window] isVisible])
|
|
||||||
[[self window] close];
|
|
||||||
else
|
|
||||||
[[self window] makeKeyAndOrderFront:nil];
|
[[self window] makeKeyAndOrderFront:nil];
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -114,7 +153,7 @@ http://www.hardcoded.net/licenses/hs_license
|
|||||||
|
|
||||||
- (void)addDirectory:(NSString *)directory
|
- (void)addDirectory:(NSString *)directory
|
||||||
{
|
{
|
||||||
int r = [[_py addDirectory:directory] intValue];
|
NSInteger r = [[_py addDirectory:directory] intValue];
|
||||||
if (r)
|
if (r)
|
||||||
{
|
{
|
||||||
NSString *m;
|
NSString *m;
|
||||||
@@ -147,17 +186,22 @@ http://www.hardcoded.net/licenses/hs_license
|
|||||||
}
|
}
|
||||||
[removeButton setEnabled:YES];
|
[removeButton setEnabled:YES];
|
||||||
OVNode *node = [directories itemAtRow:[directories selectedRow]];
|
OVNode *node = [directories itemAtRow:[directories selectedRow]];
|
||||||
int state = n2i([[node buffer] objectAtIndex:1]);
|
NSInteger state = n2i([[node buffer] objectAtIndex:1]);
|
||||||
NSString *buttonText = state == 2 ? @"Put Back" : @"Remove";
|
NSString *buttonText = state == 2 ? @"Put Back" : @"Remove";
|
||||||
[removeButton setTitle:buttonText];
|
[removeButton setTitle:buttonText];
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Delegate */
|
/* Delegate */
|
||||||
|
|
||||||
|
- (void)outlineView:(NSOutlineView *)outlineView addDirectory:(NSString *)directory
|
||||||
|
{
|
||||||
|
[self addDirectory:directory];
|
||||||
|
}
|
||||||
|
|
||||||
- (void)outlineView:(NSOutlineView *)outlineView willDisplayCell:(id)cell forTableColumn:(NSTableColumn *)tableColumn item:(id)item
|
- (void)outlineView:(NSOutlineView *)outlineView willDisplayCell:(id)cell forTableColumn:(NSTableColumn *)tableColumn item:(id)item
|
||||||
{
|
{
|
||||||
OVNode *node = item;
|
OVNode *node = item;
|
||||||
int state = n2i([[node buffer] objectAtIndex:1]);
|
NSInteger state = n2i([[node buffer] objectAtIndex:1]);
|
||||||
if ([cell isKindOfClass:[NSTextFieldCell class]])
|
if ([cell isKindOfClass:[NSTextFieldCell class]])
|
||||||
{
|
{
|
||||||
NSTextFieldCell *textCell = cell;
|
NSTextFieldCell *textCell = cell;
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
Copyright 2009 Hardcoded Software (http://www.hardcoded.net)
|
Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
|
||||||
|
|
||||||
This software is licensed under the "HS" License as described in the "LICENSE" file,
|
This software is licensed under the "HS" License as described in the "LICENSE" file,
|
||||||
which should be included with this package. The terms are also available at
|
which should be included with this package. The terms are also available at
|
||||||
@@ -7,8 +7,9 @@ http://www.hardcoded.net/licenses/hs_license
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#import <Cocoa/Cocoa.h>
|
#import <Cocoa/Cocoa.h>
|
||||||
#import "dgbase/DetailsPanel.h"
|
|
||||||
|
|
||||||
|
@interface PyDetailsPanel : NSObject
|
||||||
@interface DetailsPanel : DetailsPanelBase
|
- (id)initWithCocoa:(id)cocoa pyParent:(id)pyParent;
|
||||||
|
- (NSInteger)numberOfRows;
|
||||||
|
- (id)valueForColumn:(NSString *)column row:(NSInteger)row;
|
||||||
@end
|
@end
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
Copyright 2009 Hardcoded Software (http://www.hardcoded.net)
|
Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
|
||||||
|
|
||||||
This software is licensed under the "HS" License as described in the "LICENSE" file,
|
This software is licensed under the "HS" License as described in the "LICENSE" file,
|
||||||
which should be included with this package. The terms are also available at
|
which should be included with this package. The terms are also available at
|
||||||
@@ -35,7 +35,6 @@ http://www.hardcoded.net/licenses/hs_license
|
|||||||
- (void)markNone;
|
- (void)markNone;
|
||||||
|
|
||||||
- (void)addSelectedToIgnoreList;
|
- (void)addSelectedToIgnoreList;
|
||||||
- (void)refreshDetailsWithSelected;
|
|
||||||
- (void)removeSelected;
|
- (void)removeSelected;
|
||||||
- (void)openSelected;
|
- (void)openSelected;
|
||||||
- (NSNumber *)renameSelected:(NSString *)aNewName;
|
- (NSNumber *)renameSelected:(NSString *)aNewName;
|
||||||
@@ -62,5 +61,5 @@ http://www.hardcoded.net/licenses/hs_license
|
|||||||
- (void)setDisplayDeltaValues:(NSNumber *)display_delta_values;
|
- (void)setDisplayDeltaValues:(NSNumber *)display_delta_values;
|
||||||
- (void)setEscapeFilterRegexp:(NSNumber *)escape_filter_regexp;
|
- (void)setEscapeFilterRegexp:(NSNumber *)escape_filter_regexp;
|
||||||
- (void)setRemoveEmptyFolders:(NSNumber *)remove_empty_folders;
|
- (void)setRemoveEmptyFolders:(NSNumber *)remove_empty_folders;
|
||||||
- (void)setSizeThreshold:(int)size_threshold;
|
- (void)setSizeThreshold:(NSInteger)size_threshold;
|
||||||
@end
|
@end
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
Copyright 2009 Hardcoded Software (http://www.hardcoded.net)
|
Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
|
||||||
|
|
||||||
This software is licensed under the "HS" License as described in the "LICENSE" file,
|
This software is licensed under the "HS" License as described in the "LICENSE" file,
|
||||||
which should be included with this package. The terms are also available at
|
which should be included with this package. The terms are also available at
|
||||||
@@ -8,7 +8,6 @@ http://www.hardcoded.net/licenses/hs_license
|
|||||||
|
|
||||||
#import <Cocoa/Cocoa.h>
|
#import <Cocoa/Cocoa.h>
|
||||||
#import "Outline.h"
|
#import "Outline.h"
|
||||||
#import "DirectoryPanel.h"
|
|
||||||
#import "PyDupeGuru.h"
|
#import "PyDupeGuru.h"
|
||||||
|
|
||||||
@interface MatchesView : OutlineView
|
@interface MatchesView : OutlineView
|
||||||
@@ -20,29 +19,29 @@ http://www.hardcoded.net/licenses/hs_license
|
|||||||
@protected
|
@protected
|
||||||
IBOutlet PyDupeGuruBase *py;
|
IBOutlet PyDupeGuruBase *py;
|
||||||
IBOutlet id app;
|
IBOutlet id app;
|
||||||
IBOutlet NSView *actionMenuView;
|
|
||||||
IBOutlet NSSegmentedControl *deltaSwitch;
|
IBOutlet NSSegmentedControl *deltaSwitch;
|
||||||
IBOutlet NSView *deltaSwitchView;
|
|
||||||
IBOutlet NSView *filterFieldView;
|
|
||||||
IBOutlet MatchesView *matches;
|
IBOutlet MatchesView *matches;
|
||||||
IBOutlet NSSegmentedControl *pmSwitch;
|
IBOutlet NSSegmentedControl *pmSwitch;
|
||||||
IBOutlet NSView *pmSwitchView;
|
|
||||||
IBOutlet NSTextField *stats;
|
IBOutlet NSTextField *stats;
|
||||||
|
IBOutlet NSMenu *columnsMenu;
|
||||||
|
|
||||||
BOOL _powerMode;
|
BOOL _powerMode;
|
||||||
BOOL _displayDelta;
|
BOOL _displayDelta;
|
||||||
|
NSMutableArray *_resultColumns;
|
||||||
|
NSWindowController *preferencesPanel;
|
||||||
}
|
}
|
||||||
/* Override */
|
|
||||||
- (NSString *)logoImageName;
|
|
||||||
|
|
||||||
/* Helpers */
|
/* Helpers */
|
||||||
|
- (void)fillColumnsMenu;
|
||||||
|
- (NSTableColumn *)getColumnForIdentifier:(NSInteger)aIdentifier title:(NSString *)aTitle width:(NSInteger)aWidth refCol:(NSTableColumn *)aColumn;
|
||||||
- (NSArray *)getColumnsOrder;
|
- (NSArray *)getColumnsOrder;
|
||||||
- (NSDictionary *)getColumnsWidth;
|
- (NSDictionary *)getColumnsWidth;
|
||||||
- (NSArray *)getSelected:(BOOL)aDupesOnly;
|
- (NSArray *)getSelected:(BOOL)aDupesOnly;
|
||||||
- (NSArray *)getSelectedPaths:(BOOL)aDupesOnly;
|
- (NSArray *)getSelectedPaths:(BOOL)aDupesOnly;
|
||||||
|
- (void)initResultColumns;
|
||||||
- (void)updatePySelection;
|
- (void)updatePySelection;
|
||||||
- (void)performPySelection:(NSArray *)aIndexPaths;
|
- (void)performPySelection:(NSArray *)aIndexPaths;
|
||||||
- (void)refreshStats;
|
- (void)refreshStats;
|
||||||
|
- (void)restoreColumnsPosition:(NSArray *)aColumnsOrder widths:(NSDictionary *)aColumnsWidth;
|
||||||
|
|
||||||
/* Actions */
|
/* Actions */
|
||||||
- (IBAction)changeDelta:(id)sender;
|
- (IBAction)changeDelta:(id)sender;
|
||||||
@@ -52,7 +51,11 @@ http://www.hardcoded.net/licenses/hs_license
|
|||||||
- (IBAction)expandAll:(id)sender;
|
- (IBAction)expandAll:(id)sender;
|
||||||
- (IBAction)exportToXHTML:(id)sender;
|
- (IBAction)exportToXHTML:(id)sender;
|
||||||
- (IBAction)moveMarked:(id)sender;
|
- (IBAction)moveMarked:(id)sender;
|
||||||
|
- (IBAction)resetColumnsToDefault:(id)sender;
|
||||||
|
- (IBAction)showPreferencesPanel:(id)sender;
|
||||||
- (IBAction)switchSelected:(id)sender;
|
- (IBAction)switchSelected:(id)sender;
|
||||||
|
- (IBAction)toggleColumn:(id)sender;
|
||||||
|
- (IBAction)toggleDetailsPanel:(id)sender;
|
||||||
- (IBAction)togglePowerMarker:(id)sender;
|
- (IBAction)togglePowerMarker:(id)sender;
|
||||||
|
|
||||||
/* Notifications */
|
/* Notifications */
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
Copyright 2009 Hardcoded Software (http://www.hardcoded.net)
|
Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
|
||||||
|
|
||||||
This software is licensed under the "HS" License as described in the "LICENSE" file,
|
This software is licensed under the "HS" License as described in the "LICENSE" file,
|
||||||
which should be included with this package. The terms are also available at
|
which should be included with this package. The terms are also available at
|
||||||
@@ -14,21 +14,12 @@ http://www.hardcoded.net/licenses/hs_license
|
|||||||
#import "AppDelegate.h"
|
#import "AppDelegate.h"
|
||||||
#import "Consts.h"
|
#import "Consts.h"
|
||||||
|
|
||||||
#define tbbDirectories @"tbbDirectories"
|
|
||||||
#define tbbDetails @"tbbDetail"
|
|
||||||
#define tbbPreferences @"tbbPreferences"
|
|
||||||
#define tbbPowerMarker @"tbbPowerMarker"
|
|
||||||
#define tbbScan @"tbbScan"
|
|
||||||
#define tbbAction @"tbbAction"
|
|
||||||
#define tbbDelta @"tbbDelta"
|
|
||||||
#define tbbFilter @"tbbFilter"
|
|
||||||
|
|
||||||
@implementation MatchesView
|
@implementation MatchesView
|
||||||
- (void)keyDown:(NSEvent *)theEvent
|
- (void)keyDown:(NSEvent *)theEvent
|
||||||
{
|
{
|
||||||
unichar key = [[theEvent charactersIgnoringModifiers] characterAtIndex:0];
|
unichar key = [[theEvent charactersIgnoringModifiers] characterAtIndex:0];
|
||||||
// get flags and strip the lower 16 (device dependant) bits
|
// get flags and strip the lower 16 (device dependant) bits
|
||||||
unsigned int flags = ( [theEvent modifierFlags] & 0x00FF );
|
NSUInteger flags = ( [theEvent modifierFlags] & 0x00FF );
|
||||||
if (((key == NSDeleteFunctionKey) || (key == NSDeleteCharacter)) && (flags == 0))
|
if (((key == NSDeleteFunctionKey) || (key == NSDeleteCharacter)) && (flags == 0))
|
||||||
[self sendAction:@selector(removeSelected:) to:[self delegate]];
|
[self sendAction:@selector(removeSelected:) to:[self delegate]];
|
||||||
else
|
else
|
||||||
@@ -60,6 +51,9 @@ http://www.hardcoded.net/licenses/hs_license
|
|||||||
- (void)awakeFromNib
|
- (void)awakeFromNib
|
||||||
{
|
{
|
||||||
[self window];
|
[self window];
|
||||||
|
preferencesPanel = [[NSWindowController alloc] initWithWindowNibName:@"Preferences"];
|
||||||
|
[self initResultColumns];
|
||||||
|
[self fillColumnsMenu];
|
||||||
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(registrationRequired:) name:RegistrationRequired object:nil];
|
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(registrationRequired:) name:RegistrationRequired object:nil];
|
||||||
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(jobCompleted:) name:JobCompletedNotification object:nil];
|
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(jobCompleted:) name:JobCompletedNotification object:nil];
|
||||||
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(jobStarted:) name:JobStarted object:nil];
|
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(jobStarted:) name:JobStarted object:nil];
|
||||||
@@ -68,13 +62,42 @@ http://www.hardcoded.net/licenses/hs_license
|
|||||||
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(resultsUpdated:) name:ResultsUpdatedNotification object:nil];
|
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(resultsUpdated:) name:ResultsUpdatedNotification object:nil];
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Virtual */
|
- (void)dealloc
|
||||||
- (NSString *)logoImageName
|
|
||||||
{
|
{
|
||||||
return @"dg_logo32";
|
[preferencesPanel release];
|
||||||
|
[super dealloc];
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Helpers */
|
/* Helpers */
|
||||||
|
- (void)fillColumnsMenu
|
||||||
|
{
|
||||||
|
// The columns menu is supposed to be empty and initResultColumns must have been called
|
||||||
|
for (NSTableColumn *col in _resultColumns)
|
||||||
|
{
|
||||||
|
NSMenuItem *mi = [columnsMenu addItemWithTitle:[[col headerCell] stringValue] action:@selector(toggleColumn:) keyEquivalent:@""];
|
||||||
|
[mi setTag:[[col identifier] integerValue]];
|
||||||
|
[mi setTarget:self];
|
||||||
|
if ([[matches tableColumns] containsObject:col])
|
||||||
|
[mi setState:NSOnState];
|
||||||
|
}
|
||||||
|
[columnsMenu addItem:[NSMenuItem separatorItem]];
|
||||||
|
NSMenuItem *mi = [columnsMenu addItemWithTitle:@"Reset to Default" action:@selector(resetColumnsToDefault:) keyEquivalent:@""];
|
||||||
|
[mi setTarget:self];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (NSTableColumn *)getColumnForIdentifier:(NSInteger)aIdentifier title:(NSString *)aTitle width:(NSInteger)aWidth refCol:(NSTableColumn *)aColumn
|
||||||
|
{
|
||||||
|
NSNumber *n = [NSNumber numberWithInteger:aIdentifier];
|
||||||
|
NSTableColumn *col = [[NSTableColumn alloc] initWithIdentifier:[n stringValue]];
|
||||||
|
[col setWidth:aWidth];
|
||||||
|
[col setEditable:NO];
|
||||||
|
[[col dataCell] setFont:[[aColumn dataCell] font]];
|
||||||
|
[[col headerCell] setStringValue:aTitle];
|
||||||
|
[col setResizingMask:NSTableColumnUserResizingMask];
|
||||||
|
[col setSortDescriptorPrototype:[[NSSortDescriptor alloc] initWithKey:[n stringValue] ascending:YES]];
|
||||||
|
return col;
|
||||||
|
}
|
||||||
|
|
||||||
//Returns an array of identifiers, in order.
|
//Returns an array of identifiers, in order.
|
||||||
- (NSArray *)getColumnsOrder
|
- (NSArray *)getColumnsOrder
|
||||||
{
|
{
|
||||||
@@ -100,7 +123,7 @@ http://www.hardcoded.net/licenses/hs_license
|
|||||||
while (col = [e nextObject])
|
while (col = [e nextObject])
|
||||||
{
|
{
|
||||||
colId = [col identifier];
|
colId = [col identifier];
|
||||||
width = [NSNumber numberWithFloat:[col width]];
|
width = [NSNumber numberWithDouble:[col width]];
|
||||||
[result setObject:width forKey:colId];
|
[result setObject:width forKey:colId];
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
@@ -113,7 +136,7 @@ http://www.hardcoded.net/licenses/hs_license
|
|||||||
NSIndexSet *indexes = [matches selectedRowIndexes];
|
NSIndexSet *indexes = [matches selectedRowIndexes];
|
||||||
NSMutableArray *nodeList = [NSMutableArray array];
|
NSMutableArray *nodeList = [NSMutableArray array];
|
||||||
OVNode *node;
|
OVNode *node;
|
||||||
int i = [indexes firstIndex];
|
NSInteger i = [indexes firstIndex];
|
||||||
while (i != NSNotFound)
|
while (i != NSNotFound)
|
||||||
{
|
{
|
||||||
node = [matches itemAtRow:i];
|
node = [matches itemAtRow:i];
|
||||||
@@ -135,6 +158,40 @@ http://www.hardcoded.net/licenses/hs_license
|
|||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (void)initResultColumns
|
||||||
|
{
|
||||||
|
// Virtual
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)restoreColumnsPosition:(NSArray *)aColumnsOrder widths:(NSDictionary *)aColumnsWidth
|
||||||
|
{
|
||||||
|
NSTableColumn *col;
|
||||||
|
NSString *colId;
|
||||||
|
NSNumber *width;
|
||||||
|
NSMenuItem *mi;
|
||||||
|
//Remove all columns
|
||||||
|
NSEnumerator *e = [[columnsMenu itemArray] objectEnumerator];
|
||||||
|
while (mi = [e nextObject])
|
||||||
|
{
|
||||||
|
if ([mi state] == NSOnState)
|
||||||
|
[self toggleColumn:mi];
|
||||||
|
}
|
||||||
|
//Add columns and set widths
|
||||||
|
e = [aColumnsOrder objectEnumerator];
|
||||||
|
while (colId = [e nextObject])
|
||||||
|
{
|
||||||
|
if (![colId isEqual:@"mark"])
|
||||||
|
{
|
||||||
|
col = [_resultColumns objectAtIndex:[colId intValue]];
|
||||||
|
width = [aColumnsWidth objectForKey:[col identifier]];
|
||||||
|
mi = [columnsMenu itemWithTag:[colId intValue]];
|
||||||
|
if (width)
|
||||||
|
[col setWidth:[width floatValue]];
|
||||||
|
[self toggleColumn:mi];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
- (void)updatePySelection
|
- (void)updatePySelection
|
||||||
{
|
{
|
||||||
NSArray *selection;
|
NSArray *selection;
|
||||||
@@ -181,7 +238,7 @@ http://www.hardcoded.net/licenses/hs_license
|
|||||||
|
|
||||||
- (IBAction)copyMarked:(id)sender
|
- (IBAction)copyMarked:(id)sender
|
||||||
{
|
{
|
||||||
int mark_count = [[py getMarkCount] intValue];
|
NSInteger mark_count = [[py getMarkCount] intValue];
|
||||||
if (!mark_count)
|
if (!mark_count)
|
||||||
return;
|
return;
|
||||||
NSOpenPanel *op = [NSOpenPanel openPanel];
|
NSOpenPanel *op = [NSOpenPanel openPanel];
|
||||||
@@ -200,7 +257,7 @@ http://www.hardcoded.net/licenses/hs_license
|
|||||||
|
|
||||||
- (IBAction)deleteMarked:(id)sender
|
- (IBAction)deleteMarked:(id)sender
|
||||||
{
|
{
|
||||||
int mark_count = [[py getMarkCount] intValue];
|
NSInteger mark_count = [[py getMarkCount] intValue];
|
||||||
if (!mark_count)
|
if (!mark_count)
|
||||||
return;
|
return;
|
||||||
if ([Dialogs askYesNo:[NSString stringWithFormat:@"You are about to send %d files to Trash. Continue?",mark_count]] == NSAlertSecondButtonReturn) // NO
|
if ([Dialogs askYesNo:[NSString stringWithFormat:@"You are about to send %d files to Trash. Continue?",mark_count]] == NSAlertSecondButtonReturn) // NO
|
||||||
@@ -212,7 +269,7 @@ http://www.hardcoded.net/licenses/hs_license
|
|||||||
|
|
||||||
- (IBAction)expandAll:(id)sender
|
- (IBAction)expandAll:(id)sender
|
||||||
{
|
{
|
||||||
for (int i=0;i < [matches numberOfRows];i++)
|
for (NSInteger i=0;i < [matches numberOfRows];i++)
|
||||||
[matches expandItem:[matches itemAtRow:i]];
|
[matches expandItem:[matches itemAtRow:i]];
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -224,7 +281,7 @@ http://www.hardcoded.net/licenses/hs_license
|
|||||||
|
|
||||||
- (IBAction)moveMarked:(id)sender
|
- (IBAction)moveMarked:(id)sender
|
||||||
{
|
{
|
||||||
int mark_count = [[py getMarkCount] intValue];
|
NSInteger mark_count = [[py getMarkCount] intValue];
|
||||||
if (!mark_count)
|
if (!mark_count)
|
||||||
return;
|
return;
|
||||||
NSOpenPanel *op = [NSOpenPanel openPanel];
|
NSOpenPanel *op = [NSOpenPanel openPanel];
|
||||||
@@ -242,14 +299,25 @@ http://www.hardcoded.net/licenses/hs_license
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (IBAction)resetColumnsToDefault:(id)sender
|
||||||
|
{
|
||||||
|
// Virtual
|
||||||
|
}
|
||||||
|
|
||||||
|
- (IBAction)showPreferencesPanel:(id)sender
|
||||||
|
{
|
||||||
|
[preferencesPanel showWindow:sender];
|
||||||
|
}
|
||||||
|
|
||||||
- (IBAction)switchSelected:(id)sender
|
- (IBAction)switchSelected:(id)sender
|
||||||
{
|
{
|
||||||
// It might look like a complicated way to get the length of the current dupe list on the py side
|
// It might look like a complicated way to get the length of the current dupe list on the py side
|
||||||
// but after a lot of fussing around, believe it or not, it actually is.
|
// but after a lot of fussing around, believe it or not, it actually is.
|
||||||
int matchesTag = _powerMode ? 2 : 0;
|
NSInteger matchesTag = _powerMode ? 2 : 0;
|
||||||
int startLen = [[py getOutlineView:matchesTag childCountsForPath:[NSArray array]] count];
|
NSInteger startLen = [[py getOutlineView:matchesTag childCountsForPath:[NSArray array]] count];
|
||||||
[self performPySelection:[self getSelectedPaths:YES]];
|
[self performPySelection:[self getSelectedPaths:YES]];
|
||||||
[py makeSelectedReference];
|
[py makeSelectedReference];
|
||||||
|
[self performPySelection:[self getSelectedPaths:NO]];
|
||||||
// In some cases (when in a filtered view in Power Marker mode, it's possible that the demoted
|
// In some cases (when in a filtered view in Power Marker mode, it's possible that the demoted
|
||||||
// ref is not a part of the filter, making the table smaller. In those cases, we want to do a
|
// ref is not a part of the filter, making the table smaller. In those cases, we want to do a
|
||||||
// complete reload of the table to avoid a crash.
|
// complete reload of the table to avoid a crash.
|
||||||
@@ -259,6 +327,31 @@ http://www.hardcoded.net/licenses/hs_license
|
|||||||
[[NSNotificationCenter defaultCenter] postNotificationName:ResultsChangedNotification object:self];
|
[[NSNotificationCenter defaultCenter] postNotificationName:ResultsChangedNotification object:self];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (IBAction)toggleColumn:(id)sender
|
||||||
|
{
|
||||||
|
NSMenuItem *mi = sender;
|
||||||
|
NSString *colId = [NSString stringWithFormat:@"%d",[mi tag]];
|
||||||
|
NSTableColumn *col = [matches tableColumnWithIdentifier:colId];
|
||||||
|
if (col == nil)
|
||||||
|
{
|
||||||
|
//Add Column
|
||||||
|
col = [_resultColumns objectAtIndex:[mi tag]];
|
||||||
|
[matches addTableColumn:col];
|
||||||
|
[mi setState:NSOnState];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//Remove column
|
||||||
|
[matches removeTableColumn:col];
|
||||||
|
[mi setState:NSOffState];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
- (IBAction)toggleDetailsPanel:(id)sender
|
||||||
|
{
|
||||||
|
[[(AppDelegateBase *)app detailsPanel] toggleVisibility];
|
||||||
|
}
|
||||||
|
|
||||||
- (IBAction)togglePowerMarker:(id)sender
|
- (IBAction)togglePowerMarker:(id)sender
|
||||||
{
|
{
|
||||||
if ([pmSwitch selectedSegment] == 1)
|
if ([pmSwitch selectedSegment] == 1)
|
||||||
@@ -292,29 +385,35 @@ http://www.hardcoded.net/licenses/hs_license
|
|||||||
- (void)jobCompleted:(NSNotification *)aNotification
|
- (void)jobCompleted:(NSNotification *)aNotification
|
||||||
{
|
{
|
||||||
[[NSNotificationCenter defaultCenter] postNotificationName:ResultsChangedNotification object:self];
|
[[NSNotificationCenter defaultCenter] postNotificationName:ResultsChangedNotification object:self];
|
||||||
int r = n2i([py getOperationalErrorCount]);
|
NSInteger r = n2i([py getOperationalErrorCount]);
|
||||||
id lastAction = [[ProgressController mainProgressController] jobId];
|
id lastAction = [[ProgressController mainProgressController] jobId];
|
||||||
if ([lastAction isEqualTo:jobCopy])
|
if ([lastAction isEqualTo:jobCopy]) {
|
||||||
{
|
|
||||||
if (r > 0)
|
if (r > 0)
|
||||||
[Dialogs showMessage:[NSString stringWithFormat:@"%d file(s) couldn't be copied.",r]];
|
[Dialogs showMessage:[NSString stringWithFormat:@"%d file(s) couldn't be copied.",r]];
|
||||||
else
|
else
|
||||||
[Dialogs showMessage:@"All marked files were copied sucessfully."];
|
[Dialogs showMessage:@"All marked files were copied sucessfully."];
|
||||||
}
|
}
|
||||||
if ([lastAction isEqualTo:jobMove])
|
else if ([lastAction isEqualTo:jobMove]) {
|
||||||
{
|
|
||||||
if (r > 0)
|
if (r > 0)
|
||||||
[Dialogs showMessage:[NSString stringWithFormat:@"%d file(s) couldn't be moved. They were kept in the results, and still are marked.",r]];
|
[Dialogs showMessage:[NSString stringWithFormat:@"%d file(s) couldn't be moved. They were kept in the results, and still are marked.",r]];
|
||||||
else
|
else
|
||||||
[Dialogs showMessage:@"All marked files were moved sucessfully."];
|
[Dialogs showMessage:@"All marked files were moved sucessfully."];
|
||||||
}
|
}
|
||||||
if ([lastAction isEqualTo:jobDelete])
|
else if ([lastAction isEqualTo:jobDelete]) {
|
||||||
{
|
if (r > 0) {
|
||||||
if (r > 0)
|
NSString *msg = @"%d file(s) couldn't be sent to Trash. They were kept in the results, "\
|
||||||
[Dialogs showMessage:[NSString stringWithFormat:@"%d file(s) couldn't be sent to Trash. They were kept in the results, and still are marked.",r]];
|
"and still are marked. See the F.A.Q. section in the help file for details.";
|
||||||
|
[Dialogs showMessage:[NSString stringWithFormat:msg,r]];
|
||||||
|
}
|
||||||
else
|
else
|
||||||
[Dialogs showMessage:@"All marked files were sucessfully sent to Trash."];
|
[Dialogs showMessage:@"All marked files were sucessfully sent to Trash."];
|
||||||
}
|
}
|
||||||
|
else if ([lastAction isEqualTo:jobScan]) {
|
||||||
|
NSInteger groupCount = [[py getOutlineView:0 childCountsForPath:[NSArray array]] count];
|
||||||
|
if (groupCount == 0)
|
||||||
|
[Dialogs showMessage:@"No duplicates found."];
|
||||||
|
}
|
||||||
|
|
||||||
// Re-activate toolbar items right after the progress bar stops showing instead of waiting until
|
// Re-activate toolbar items right after the progress bar stops showing instead of waiting until
|
||||||
// a mouse-over is performed
|
// a mouse-over is performed
|
||||||
[[[self window] toolbar] validateVisibleItems];
|
[[[self window] toolbar] validateVisibleItems];
|
||||||
@@ -342,6 +441,11 @@ http://www.hardcoded.net/licenses/hs_license
|
|||||||
[Dialogs showMessage:msg];
|
[Dialogs showMessage:msg];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (void)outlineViewSelectionDidChange:(NSNotification *)notification
|
||||||
|
{
|
||||||
|
[self performPySelection:[self getSelectedPaths:NO]];
|
||||||
|
}
|
||||||
|
|
||||||
- (void)resultsChanged:(NSNotification *)aNotification
|
- (void)resultsChanged:(NSNotification *)aNotification
|
||||||
{
|
{
|
||||||
[matches reloadData];
|
[matches reloadData];
|
||||||
@@ -350,110 +454,16 @@ http://www.hardcoded.net/licenses/hs_license
|
|||||||
[self refreshStats];
|
[self refreshStats];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (void)resultsMarkingChanged:(NSNotification *)aNotification
|
||||||
|
{
|
||||||
|
[matches invalidateMarkings];
|
||||||
|
[self refreshStats];
|
||||||
|
}
|
||||||
|
|
||||||
- (void)resultsUpdated:(NSNotification *)aNotification
|
- (void)resultsUpdated:(NSNotification *)aNotification
|
||||||
{
|
{
|
||||||
[matches invalidateBuffers];
|
[matches invalidateBuffers];
|
||||||
}
|
[matches invalidateMarkings];
|
||||||
|
|
||||||
/* Toolbar */
|
|
||||||
- (NSToolbarItem *)toolbar:(NSToolbar *)toolbar itemForItemIdentifier:(NSString *)itemIdentifier willBeInsertedIntoToolbar:(BOOL)flag
|
|
||||||
{
|
|
||||||
NSToolbarItem *tbi = [[[NSToolbarItem alloc] initWithItemIdentifier:itemIdentifier] autorelease];
|
|
||||||
if ([itemIdentifier isEqualTo:tbbDirectories])
|
|
||||||
{
|
|
||||||
[tbi setLabel: @"Directories"];
|
|
||||||
[tbi setToolTip: @"Show/Hide the directories panel."];
|
|
||||||
[tbi setImage: [NSImage imageNamed: @"folder32"]];
|
|
||||||
[tbi setTarget: app];
|
|
||||||
[tbi setAction: @selector(toggleDirectories:)];
|
|
||||||
}
|
|
||||||
else if ([itemIdentifier isEqualTo:tbbDetails])
|
|
||||||
{
|
|
||||||
[tbi setLabel: @"Details"];
|
|
||||||
[tbi setToolTip: @"Show/Hide the details panel."];
|
|
||||||
[tbi setImage: [NSImage imageNamed: @"details32"]];
|
|
||||||
[tbi setTarget: self];
|
|
||||||
[tbi setAction: @selector(toggleDetailsPanel:)];
|
|
||||||
}
|
|
||||||
else if ([itemIdentifier isEqualTo:tbbPreferences])
|
|
||||||
{
|
|
||||||
[tbi setLabel: @"Preferences"];
|
|
||||||
[tbi setToolTip: @"Show the preferences panel."];
|
|
||||||
[tbi setImage: [NSImage imageNamed: @"preferences32"]];
|
|
||||||
[tbi setTarget: self];
|
|
||||||
[tbi setAction: @selector(showPreferencesPanel:)];
|
|
||||||
}
|
|
||||||
else if ([itemIdentifier isEqualTo:tbbPowerMarker])
|
|
||||||
{
|
|
||||||
[tbi setLabel: @"Power Marker"];
|
|
||||||
[tbi setToolTip: @"When enabled, only the duplicates are shown, not the references."];
|
|
||||||
[tbi setView:pmSwitchView];
|
|
||||||
[tbi setMinSize:[pmSwitchView frame].size];
|
|
||||||
[tbi setMaxSize:[pmSwitchView frame].size];
|
|
||||||
}
|
|
||||||
else if ([itemIdentifier isEqualTo:tbbScan])
|
|
||||||
{
|
|
||||||
[tbi setLabel: @"Start Scanning"];
|
|
||||||
[tbi setToolTip: @"Start scanning for duplicates in the selected directories."];
|
|
||||||
[tbi setImage: [NSImage imageNamed:[self logoImageName]]];
|
|
||||||
[tbi setTarget: self];
|
|
||||||
[tbi setAction: @selector(startDuplicateScan:)];
|
|
||||||
}
|
|
||||||
else if ([itemIdentifier isEqualTo:tbbAction])
|
|
||||||
{
|
|
||||||
[tbi setLabel: @"Action"];
|
|
||||||
[tbi setView:actionMenuView];
|
|
||||||
[tbi setMinSize:[actionMenuView frame].size];
|
|
||||||
[tbi setMaxSize:[actionMenuView frame].size];
|
|
||||||
}
|
|
||||||
else if ([itemIdentifier isEqualTo:tbbDelta])
|
|
||||||
{
|
|
||||||
[tbi setLabel: @"Delta Values"];
|
|
||||||
[tbi setToolTip: @"When enabled, this option makes dupeGuru display, where applicable, delta values instead of absolute values."];
|
|
||||||
[tbi setView:deltaSwitchView];
|
|
||||||
[tbi setMinSize:[deltaSwitchView frame].size];
|
|
||||||
[tbi setMaxSize:[deltaSwitchView frame].size];
|
|
||||||
}
|
|
||||||
else if ([itemIdentifier isEqualTo:tbbFilter])
|
|
||||||
{
|
|
||||||
[tbi setLabel: @"Filter"];
|
|
||||||
[tbi setToolTip: @"Filters the results using regular expression."];
|
|
||||||
[tbi setView:filterFieldView];
|
|
||||||
[tbi setMinSize:[filterFieldView frame].size];
|
|
||||||
[tbi setMaxSize:NSMakeSize(1000, [filterFieldView frame].size.height)];
|
|
||||||
}
|
|
||||||
[tbi setPaletteLabel: [tbi label]];
|
|
||||||
return tbi;
|
|
||||||
}
|
|
||||||
|
|
||||||
- (NSArray *)toolbarAllowedItemIdentifiers:(NSToolbar *)toolbar
|
|
||||||
{
|
|
||||||
return [NSArray arrayWithObjects:
|
|
||||||
tbbDirectories,
|
|
||||||
tbbDetails,
|
|
||||||
tbbPreferences,
|
|
||||||
tbbPowerMarker,
|
|
||||||
tbbScan,
|
|
||||||
tbbAction,
|
|
||||||
tbbDelta,
|
|
||||||
tbbFilter,
|
|
||||||
NSToolbarSeparatorItemIdentifier,
|
|
||||||
NSToolbarSpaceItemIdentifier,
|
|
||||||
NSToolbarFlexibleSpaceItemIdentifier,
|
|
||||||
nil];
|
|
||||||
}
|
|
||||||
|
|
||||||
- (NSArray *)toolbarDefaultItemIdentifiers:(NSToolbar *)toolbar
|
|
||||||
{
|
|
||||||
return [NSArray arrayWithObjects:
|
|
||||||
tbbScan,
|
|
||||||
tbbAction,
|
|
||||||
tbbDirectories,
|
|
||||||
tbbDetails,
|
|
||||||
tbbPowerMarker,
|
|
||||||
tbbDelta,
|
|
||||||
tbbFilter,
|
|
||||||
nil];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
- (BOOL)validateToolbarItem:(NSToolbarItem *)theItem
|
- (BOOL)validateToolbarItem:(NSToolbarItem *)theItem
|
||||||
1056
cocoa/base/xib/DetailsPanel.xib
Normal file
1056
cocoa/base/xib/DetailsPanel.xib
Normal file
File diff suppressed because it is too large
Load Diff
1503
cocoa/base/xib/DirectoryPanel.xib
Normal file
1503
cocoa/base/xib/DirectoryPanel.xib
Normal file
File diff suppressed because it is too large
Load Diff
4618
cocoa/base/xib/MainMenu.xib
Normal file
4618
cocoa/base/xib/MainMenu.xib
Normal file
File diff suppressed because it is too large
Load Diff
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
Copyright 2009 Hardcoded Software (http://www.hardcoded.net)
|
Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
|
||||||
|
|
||||||
This software is licensed under the "HS" License as described in the "LICENSE" file,
|
This software is licensed under the "HS" License as described in the "LICENSE" file,
|
||||||
which should be included with this package. The terms are also available at
|
which should be included with this package. The terms are also available at
|
||||||
@@ -7,20 +7,13 @@ http://www.hardcoded.net/licenses/hs_license
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#import <Cocoa/Cocoa.h>
|
#import <Cocoa/Cocoa.h>
|
||||||
#import "dgbase/AppDelegate.h"
|
#import "../base/AppDelegate.h"
|
||||||
#import "ResultWindow.h"
|
#import "ResultWindow.h"
|
||||||
#import "DirectoryPanel.h"
|
|
||||||
#import "PyDupeGuru.h"
|
#import "PyDupeGuru.h"
|
||||||
|
|
||||||
@interface AppDelegate : AppDelegateBase
|
@interface AppDelegate : AppDelegateBase {}
|
||||||
{
|
|
||||||
IBOutlet ResultWindow *result;
|
|
||||||
|
|
||||||
DirectoryPanel *_directoryPanel;
|
|
||||||
}
|
|
||||||
- (IBAction)openWebsite:(id)sender;
|
- (IBAction)openWebsite:(id)sender;
|
||||||
- (IBAction)toggleDirectories:(id)sender;
|
- (IBAction)toggleDirectories:(id)sender;
|
||||||
|
|
||||||
- (DirectoryPanel *)directoryPanel;
|
|
||||||
- (PyDupeGuru *)py;
|
- (PyDupeGuru *)py;
|
||||||
@end
|
@end
|
||||||
87
cocoa/me/AppDelegate.m
Normal file
87
cocoa/me/AppDelegate.m
Normal file
@@ -0,0 +1,87 @@
|
|||||||
|
/*
|
||||||
|
Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
|
||||||
|
|
||||||
|
This software is licensed under the "HS" License as described in the "LICENSE" file,
|
||||||
|
which should be included with this package. The terms are also available at
|
||||||
|
http://www.hardcoded.net/licenses/hs_license
|
||||||
|
*/
|
||||||
|
|
||||||
|
#import "AppDelegate.h"
|
||||||
|
#import "../../cocoalib/ProgressController.h"
|
||||||
|
#import "../../cocoalib/RegistrationInterface.h"
|
||||||
|
#import "../../cocoalib/Utils.h"
|
||||||
|
#import "../../cocoalib/ValueTransformers.h"
|
||||||
|
#import "../../cocoalib/Dialogs.h"
|
||||||
|
#import "DetailsPanel.h"
|
||||||
|
#import "DirectoryPanel.h"
|
||||||
|
#import "Consts.h"
|
||||||
|
|
||||||
|
@implementation AppDelegate
|
||||||
|
+ (void)initialize
|
||||||
|
{
|
||||||
|
NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];
|
||||||
|
NSMutableDictionary *d = [NSMutableDictionary dictionaryWithCapacity:10];
|
||||||
|
[d setObject:i2n(3) forKey:@"scanType"];
|
||||||
|
[d setObject:i2n(80) forKey:@"minMatchPercentage"];
|
||||||
|
[d setObject:i2n(1) forKey:@"recreatePathType"];
|
||||||
|
[d setObject:b2n(NO) forKey:@"wordWeighting"];
|
||||||
|
[d setObject:b2n(NO) forKey:@"matchSimilarWords"];
|
||||||
|
[d setObject:b2n(YES) forKey:@"mixFileKind"];
|
||||||
|
[d setObject:b2n(NO) forKey:@"useRegexpFilter"];
|
||||||
|
[d setObject:b2n(NO) forKey:@"removeEmptyFolders"];
|
||||||
|
[d setObject:b2n(NO) forKey:@"debug"];
|
||||||
|
[d setObject:b2n(NO) forKey:@"scanTagTrack"];
|
||||||
|
[d setObject:b2n(YES) forKey:@"scanTagArtist"];
|
||||||
|
[d setObject:b2n(YES) forKey:@"scanTagAlbum"];
|
||||||
|
[d setObject:b2n(YES) forKey:@"scanTagTitle"];
|
||||||
|
[d setObject:b2n(NO) forKey:@"scanTagGenre"];
|
||||||
|
[d setObject:b2n(NO) forKey:@"scanTagYear"];
|
||||||
|
[d setObject:[NSArray array] forKey:@"recentDirectories"];
|
||||||
|
[d setObject:[NSArray array] forKey:@"columnsOrder"];
|
||||||
|
[d setObject:[NSDictionary dictionary] forKey:@"columnsWidth"];
|
||||||
|
[[NSUserDefaultsController sharedUserDefaultsController] setInitialValues:d];
|
||||||
|
[ud registerDefaults:d];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (id)init
|
||||||
|
{
|
||||||
|
self = [super init];
|
||||||
|
NSMutableIndexSet *i = [NSMutableIndexSet indexSetWithIndex:4];
|
||||||
|
[i addIndex:5];
|
||||||
|
VTIsIntIn *vtScanTypeIsNotContent = [[[VTIsIntIn alloc] initWithValues:i reverse:YES] autorelease];
|
||||||
|
[NSValueTransformer setValueTransformer:vtScanTypeIsNotContent forName:@"vtScanTypeIsNotContent"];
|
||||||
|
VTIsIntIn *vtScanTypeIsTag = [[[VTIsIntIn alloc] initWithValues:[NSIndexSet indexSetWithIndex:3] reverse:NO] autorelease];
|
||||||
|
[NSValueTransformer setValueTransformer:vtScanTypeIsTag forName:@"vtScanTypeIsTag"];
|
||||||
|
_directoryPanel = nil;
|
||||||
|
return self;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (IBAction)openWebsite:(id)sender
|
||||||
|
{
|
||||||
|
[[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:@"http://www.hardcoded.net/dupeguru_me"]];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (IBAction)toggleDirectories:(id)sender
|
||||||
|
{
|
||||||
|
[[self directoryPanel] toggleVisible:sender];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (DirectoryPanel *)directoryPanel
|
||||||
|
{
|
||||||
|
if (!_directoryPanel)
|
||||||
|
_directoryPanel = [[DirectoryPanelME alloc] initWithParentApp:self];
|
||||||
|
return _directoryPanel;
|
||||||
|
}
|
||||||
|
- (PyDupeGuru *)py { return (PyDupeGuru *)py; }
|
||||||
|
|
||||||
|
//Delegate
|
||||||
|
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
|
||||||
|
{
|
||||||
|
NSMenu *actionsMenu = [[[NSApp mainMenu] itemWithTitle:@"Actions"] submenu];
|
||||||
|
// index 3 is just after "Export Results to XHTML"
|
||||||
|
NSMenuItem *mi = [actionsMenu insertItemWithTitle:@"Remove Dead Tracks in iTunes"
|
||||||
|
action:@selector(removeDeadTracks:) keyEquivalent:@"" atIndex:3];
|
||||||
|
[mi setTarget:result];
|
||||||
|
[super applicationDidFinishLaunching:aNotification];
|
||||||
|
}
|
||||||
|
@end
|
||||||
@@ -1,13 +1,11 @@
|
|||||||
/*
|
/*
|
||||||
Copyright 2009 Hardcoded Software (http://www.hardcoded.net)
|
Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
|
||||||
|
|
||||||
This software is licensed under the "HS" License as described in the "LICENSE" file,
|
This software is licensed under the "HS" License as described in the "LICENSE" file,
|
||||||
which should be included with this package. The terms are also available at
|
which should be included with this package. The terms are also available at
|
||||||
http://www.hardcoded.net/licenses/hs_license
|
http://www.hardcoded.net/licenses/hs_license
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#import "dgbase/Consts.h"
|
#import "../base/Consts.h"
|
||||||
|
|
||||||
#define APPNAME @"dupeGuru ME"
|
|
||||||
|
|
||||||
#define jobScanDeadTracks @"jobScanDeadTracks"
|
#define jobScanDeadTracks @"jobScanDeadTracks"
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
Copyright 2009 Hardcoded Software (http://www.hardcoded.net)
|
Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
|
||||||
|
|
||||||
This software is licensed under the "HS" License as described in the "LICENSE" file,
|
This software is licensed under the "HS" License as described in the "LICENSE" file,
|
||||||
which should be included with this package. The terms are also available at
|
which should be included with this package. The terms are also available at
|
||||||
@@ -7,9 +7,9 @@ http://www.hardcoded.net/licenses/hs_license
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#import <Cocoa/Cocoa.h>
|
#import <Cocoa/Cocoa.h>
|
||||||
#import "dgbase/DirectoryPanel.h"
|
#import "../base/DirectoryPanel.h"
|
||||||
|
|
||||||
@interface DirectoryPanel : DirectoryPanelBase
|
@interface DirectoryPanelME : DirectoryPanel
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
- (IBAction)addiTunes:(id)sender;
|
- (IBAction)addiTunes:(id)sender;
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
Copyright 2009 Hardcoded Software (http://www.hardcoded.net)
|
Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
|
||||||
|
|
||||||
This software is licensed under the "HS" License as described in the "LICENSE" file,
|
This software is licensed under the "HS" License as described in the "LICENSE" file,
|
||||||
which should be included with this package. The terms are also available at
|
which should be included with this package. The terms are also available at
|
||||||
@@ -8,7 +8,7 @@ http://www.hardcoded.net/licenses/hs_license
|
|||||||
|
|
||||||
#import "DirectoryPanel.h"
|
#import "DirectoryPanel.h"
|
||||||
|
|
||||||
@implementation DirectoryPanel
|
@implementation DirectoryPanelME
|
||||||
- (IBAction)addiTunes:(id)sender
|
- (IBAction)addiTunes:(id)sender
|
||||||
{
|
{
|
||||||
[self addDirectory:[@"~/Music/iTunes/iTunes Music" stringByExpandingTildeInPath]];
|
[self addDirectory:[@"~/Music/iTunes/iTunes Music" stringByExpandingTildeInPath]];
|
||||||
@@ -23,11 +23,13 @@
|
|||||||
<key>CFBundleSignature</key>
|
<key>CFBundleSignature</key>
|
||||||
<string>hsft</string>
|
<string>hsft</string>
|
||||||
<key>CFBundleVersion</key>
|
<key>CFBundleVersion</key>
|
||||||
<string>5.6.6</string>
|
<string>5.7.1</string>
|
||||||
<key>NSMainNibFile</key>
|
<key>NSMainNibFile</key>
|
||||||
<string>MainMenu</string>
|
<string>MainMenu</string>
|
||||||
<key>NSPrincipalClass</key>
|
<key>NSPrincipalClass</key>
|
||||||
<string>NSApplication</string>
|
<string>NSApplication</string>
|
||||||
|
<key>NSHumanReadableCopyright</key>
|
||||||
|
<string>© Hardcoded Software, 2010</string>
|
||||||
<key>SUFeedURL</key>
|
<key>SUFeedURL</key>
|
||||||
<string>http://www.hardcoded.net/updates/dupeguru_me.appcast</string>
|
<string>http://www.hardcoded.net/updates/dupeguru_me.appcast</string>
|
||||||
<key>SUPublicDSAKeyFile</key>
|
<key>SUPublicDSAKeyFile</key>
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
Copyright 2009 Hardcoded Software (http://www.hardcoded.net)
|
Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
|
||||||
|
|
||||||
This software is licensed under the "HS" License as described in the "LICENSE" file,
|
This software is licensed under the "HS" License as described in the "LICENSE" file,
|
||||||
which should be included with this package. The terms are also available at
|
which should be included with this package. The terms are also available at
|
||||||
@@ -7,7 +7,7 @@ http://www.hardcoded.net/licenses/hs_license
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#import <Cocoa/Cocoa.h>
|
#import <Cocoa/Cocoa.h>
|
||||||
#import "dgbase/PyDupeGuru.h"
|
#import "../base/PyDupeGuru.h"
|
||||||
|
|
||||||
@interface PyDupeGuru : PyDupeGuruBase
|
@interface PyDupeGuru : PyDupeGuruBase
|
||||||
//Scanning options
|
//Scanning options
|
||||||
@@ -19,5 +19,5 @@ http://www.hardcoded.net/licenses/hs_license
|
|||||||
- (void)enable:(NSNumber *)enable scanForTag:(NSString *)tag;
|
- (void)enable:(NSNumber *)enable scanForTag:(NSString *)tag;
|
||||||
- (void)scanDeadTracks;
|
- (void)scanDeadTracks;
|
||||||
- (void)removeDeadTracks;
|
- (void)removeDeadTracks;
|
||||||
- (int)deadTrackCount;
|
- (NSInteger)deadTrackCount;
|
||||||
@end
|
@end
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
Copyright 2009 Hardcoded Software (http://www.hardcoded.net)
|
Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
|
||||||
|
|
||||||
This software is licensed under the "HS" License as described in the "LICENSE" file,
|
This software is licensed under the "HS" License as described in the "LICENSE" file,
|
||||||
which should be included with this package. The terms are also available at
|
which should be included with this package. The terms are also available at
|
||||||
@@ -7,21 +7,15 @@ http://www.hardcoded.net/licenses/hs_license
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#import <Cocoa/Cocoa.h>
|
#import <Cocoa/Cocoa.h>
|
||||||
#import "cocoalib/Outline.h"
|
#import "../../cocoalib/Outline.h"
|
||||||
#import "dgbase/ResultWindow.h"
|
#import "../base/ResultWindow.h"
|
||||||
#import "DetailsPanel.h"
|
|
||||||
#import "DirectoryPanel.h"
|
#import "DirectoryPanel.h"
|
||||||
|
|
||||||
@interface ResultWindow : ResultWindowBase
|
@interface ResultWindow : ResultWindowBase
|
||||||
{
|
{
|
||||||
IBOutlet NSPopUpButton *actionMenu;
|
|
||||||
IBOutlet NSMenu *columnsMenu;
|
|
||||||
IBOutlet NSSearchField *filterField;
|
IBOutlet NSSearchField *filterField;
|
||||||
IBOutlet NSWindow *preferencesPanel;
|
|
||||||
|
|
||||||
NSString *_lastAction;
|
NSString *_lastAction;
|
||||||
DetailsPanel *_detailsPanel;
|
|
||||||
NSMutableArray *_resultColumns;
|
|
||||||
NSMutableIndexSet *_deltaColumns;
|
NSMutableIndexSet *_deltaColumns;
|
||||||
}
|
}
|
||||||
- (IBAction)clearIgnoreList:(id)sender;
|
- (IBAction)clearIgnoreList:(id)sender;
|
||||||
@@ -38,15 +32,7 @@ http://www.hardcoded.net/licenses/hs_license
|
|||||||
- (IBAction)removeMarked:(id)sender;
|
- (IBAction)removeMarked:(id)sender;
|
||||||
- (IBAction)removeSelected:(id)sender;
|
- (IBAction)removeSelected:(id)sender;
|
||||||
- (IBAction)renameSelected:(id)sender;
|
- (IBAction)renameSelected:(id)sender;
|
||||||
- (IBAction)resetColumnsToDefault:(id)sender;
|
|
||||||
- (IBAction)revealSelected:(id)sender;
|
- (IBAction)revealSelected:(id)sender;
|
||||||
- (IBAction)showPreferencesPanel:(id)sender;
|
|
||||||
- (IBAction)startDuplicateScan:(id)sender;
|
- (IBAction)startDuplicateScan:(id)sender;
|
||||||
- (IBAction)toggleColumn:(id)sender;
|
|
||||||
- (IBAction)toggleDelta:(id)sender;
|
- (IBAction)toggleDelta:(id)sender;
|
||||||
- (IBAction)toggleDetailsPanel:(id)sender;
|
|
||||||
|
|
||||||
- (NSTableColumn *)getColumnForIdentifier:(int)aIdentifier title:(NSString *)aTitle width:(int)aWidth refCol:(NSTableColumn *)aColumn;
|
|
||||||
- (void)initResultColumns;
|
|
||||||
- (void)restoreColumnsPosition:(NSArray *)aColumnsOrder widths:(NSDictionary *)aColumnsWidth;
|
|
||||||
@end
|
@end
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
Copyright 2009 Hardcoded Software (http://www.hardcoded.net)
|
Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
|
||||||
|
|
||||||
This software is licensed under the "HS" License as described in the "LICENSE" file,
|
This software is licensed under the "HS" License as described in the "LICENSE" file,
|
||||||
which should be included with this package. The terms are also available at
|
which should be included with this package. The terms are also available at
|
||||||
@@ -7,10 +7,10 @@ http://www.hardcoded.net/licenses/hs_license
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#import "ResultWindow.h"
|
#import "ResultWindow.h"
|
||||||
#import "cocoalib/Dialogs.h"
|
#import "../../cocoalib/Dialogs.h"
|
||||||
#import "cocoalib/ProgressController.h"
|
#import "../../cocoalib/ProgressController.h"
|
||||||
#import "cocoalib/RegistrationInterface.h"
|
#import "../../cocoalib/RegistrationInterface.h"
|
||||||
#import "cocoalib/Utils.h"
|
#import "../../cocoalib/Utils.h"
|
||||||
#import "AppDelegate.h"
|
#import "AppDelegate.h"
|
||||||
#import "Consts.h"
|
#import "Consts.h"
|
||||||
|
|
||||||
@@ -19,7 +19,7 @@ http://www.hardcoded.net/licenses/hs_license
|
|||||||
- (void)awakeFromNib
|
- (void)awakeFromNib
|
||||||
{
|
{
|
||||||
[super awakeFromNib];
|
[super awakeFromNib];
|
||||||
_detailsPanel = nil;
|
[[self window] setTitle:@"dupeGuru Music Edition"];
|
||||||
_displayDelta = NO;
|
_displayDelta = NO;
|
||||||
_powerMode = NO;
|
_powerMode = NO;
|
||||||
_deltaColumns = [[NSMutableIndexSet indexSetWithIndexesInRange:NSMakeRange(2,7)] retain];
|
_deltaColumns = [[NSMutableIndexSet indexSetWithIndexesInRange:NSMakeRange(2,7)] retain];
|
||||||
@@ -29,29 +29,14 @@ http://www.hardcoded.net/licenses/hs_license
|
|||||||
[py setDisplayDeltaValues:b2n(_displayDelta)];
|
[py setDisplayDeltaValues:b2n(_displayDelta)];
|
||||||
[matches setTarget:self];
|
[matches setTarget:self];
|
||||||
[matches setDoubleAction:@selector(openSelected:)];
|
[matches setDoubleAction:@selector(openSelected:)];
|
||||||
[[actionMenu itemAtIndex:0] setImage:[NSImage imageNamed: @"gear"]];
|
|
||||||
[self initResultColumns];
|
|
||||||
[self refreshStats];
|
[self refreshStats];
|
||||||
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(resultsMarkingChanged:) name:ResultsMarkingChangedNotification object:nil];
|
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(resultsMarkingChanged:) name:ResultsMarkingChangedNotification object:nil];
|
||||||
|
|
||||||
NSToolbar *t = [[[NSToolbar alloc] initWithIdentifier:@"ResultWindowToolbar"] autorelease];
|
|
||||||
[t setAllowsUserCustomization:YES];
|
|
||||||
[t setAutosavesConfiguration:YES];
|
|
||||||
[t setDisplayMode:NSToolbarDisplayModeIconAndLabel];
|
|
||||||
[t setDelegate:self];
|
|
||||||
[[self window] setToolbar:t];
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Overrides */
|
|
||||||
- (NSString *)logoImageName
|
|
||||||
{
|
|
||||||
return @"dgme_logo_32";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Actions */
|
/* Actions */
|
||||||
- (IBAction)clearIgnoreList:(id)sender
|
- (IBAction)clearIgnoreList:(id)sender
|
||||||
{
|
{
|
||||||
int i = n2i([py getIgnoreListCount]);
|
NSInteger i = n2i([py getIgnoreListCount]);
|
||||||
if (!i)
|
if (!i)
|
||||||
return;
|
return;
|
||||||
if ([Dialogs askYesNo:[NSString stringWithFormat:@"Do you really want to remove all %d items from the ignore list?",i]] == NSAlertSecondButtonReturn) // NO
|
if ([Dialogs askYesNo:[NSString stringWithFormat:@"Do you really want to remove all %d items from the ignore list?",i]] == NSAlertSecondButtonReturn) // NO
|
||||||
@@ -154,8 +139,8 @@ http://www.hardcoded.net/licenses/hs_license
|
|||||||
|
|
||||||
- (IBAction)renameSelected:(id)sender
|
- (IBAction)renameSelected:(id)sender
|
||||||
{
|
{
|
||||||
int col = [matches columnWithIdentifier:@"0"];
|
NSInteger col = [matches columnWithIdentifier:@"0"];
|
||||||
int row = [matches selectedRow];
|
NSInteger row = [matches selectedRow];
|
||||||
[matches editColumn:col row:row withEvent:[NSApp currentEvent] select:YES];
|
[matches editColumn:col row:row withEvent:[NSApp currentEvent] select:YES];
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -182,11 +167,6 @@ http://www.hardcoded.net/licenses/hs_license
|
|||||||
[py revealSelected];
|
[py revealSelected];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (IBAction)showPreferencesPanel:(id)sender
|
|
||||||
{
|
|
||||||
[preferencesPanel makeKeyAndOrderFront:sender];
|
|
||||||
}
|
|
||||||
|
|
||||||
- (IBAction)startDuplicateScan:(id)sender
|
- (IBAction)startDuplicateScan:(id)sender
|
||||||
{
|
{
|
||||||
if ([matches numberOfRows] > 0)
|
if ([matches numberOfRows] > 0)
|
||||||
@@ -207,7 +187,7 @@ http://www.hardcoded.net/licenses/hs_license
|
|||||||
[_py setWordWeighting:[ud objectForKey:@"wordWeighting"]];
|
[_py setWordWeighting:[ud objectForKey:@"wordWeighting"]];
|
||||||
[_py setMixFileKind:[ud objectForKey:@"mixFileKind"]];
|
[_py setMixFileKind:[ud objectForKey:@"mixFileKind"]];
|
||||||
[_py setMatchSimilarWords:[ud objectForKey:@"matchSimilarWords"]];
|
[_py setMatchSimilarWords:[ud objectForKey:@"matchSimilarWords"]];
|
||||||
int r = n2i([py doScan]);
|
NSInteger r = n2i([py doScan]);
|
||||||
[matches reloadData];
|
[matches reloadData];
|
||||||
[self refreshStats];
|
[self refreshStats];
|
||||||
if (r == 1)
|
if (r == 1)
|
||||||
@@ -219,26 +199,6 @@ http://www.hardcoded.net/licenses/hs_license
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
- (IBAction)toggleColumn:(id)sender
|
|
||||||
{
|
|
||||||
NSMenuItem *mi = sender;
|
|
||||||
NSString *colId = [NSString stringWithFormat:@"%d",[mi tag]];
|
|
||||||
NSTableColumn *col = [matches tableColumnWithIdentifier:colId];
|
|
||||||
if (col == nil)
|
|
||||||
{
|
|
||||||
//Add Column
|
|
||||||
col = [_resultColumns objectAtIndex:[mi tag]];
|
|
||||||
[matches addTableColumn:col];
|
|
||||||
[mi setState:NSOnState];
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
//Remove column
|
|
||||||
[matches removeTableColumn:col];
|
|
||||||
[mi setState:NSOffState];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
- (IBAction)toggleDelta:(id)sender
|
- (IBAction)toggleDelta:(id)sender
|
||||||
{
|
{
|
||||||
if ([deltaSwitch selectedSegment] == 1)
|
if ([deltaSwitch selectedSegment] == 1)
|
||||||
@@ -248,39 +208,22 @@ http://www.hardcoded.net/licenses/hs_license
|
|||||||
[self changeDelta:sender];
|
[self changeDelta:sender];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (IBAction)toggleDetailsPanel:(id)sender
|
|
||||||
{
|
|
||||||
if (!_detailsPanel)
|
|
||||||
_detailsPanel = [[DetailsPanel alloc] initWithPy:py];
|
|
||||||
if ([[_detailsPanel window] isVisible])
|
|
||||||
[[_detailsPanel window] close];
|
|
||||||
else
|
|
||||||
[[_detailsPanel window] orderFront:nil];
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Public */
|
/* Public */
|
||||||
- (NSTableColumn *)getColumnForIdentifier:(int)aIdentifier title:(NSString *)aTitle width:(int)aWidth refCol:(NSTableColumn *)aColumn
|
|
||||||
{
|
|
||||||
NSNumber *n = [NSNumber numberWithInt:aIdentifier];
|
|
||||||
NSTableColumn *col = [[NSTableColumn alloc] initWithIdentifier:[n stringValue]];
|
|
||||||
[col setWidth:aWidth];
|
|
||||||
[col setEditable:NO];
|
|
||||||
[[col dataCell] setFont:[[aColumn dataCell] font]];
|
|
||||||
[[col headerCell] setStringValue:aTitle];
|
|
||||||
[col setResizingMask:NSTableColumnUserResizingMask];
|
|
||||||
[col setSortDescriptorPrototype:[[NSSortDescriptor alloc] initWithKey:[n stringValue] ascending:YES]];
|
|
||||||
return col;
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void)initResultColumns
|
- (void)initResultColumns
|
||||||
{
|
{
|
||||||
NSTableColumn *refCol = [matches tableColumnWithIdentifier:@"0"];
|
NSTableColumn *refCol = [matches tableColumnWithIdentifier:@"0"];
|
||||||
_resultColumns = [[NSMutableArray alloc] init];
|
_resultColumns = [[NSMutableArray alloc] init];
|
||||||
[_resultColumns addObject:[matches tableColumnWithIdentifier:@"0"]]; // File Name
|
[_resultColumns addObject:[matches tableColumnWithIdentifier:@"0"]]; // File Name
|
||||||
[_resultColumns addObject:[self getColumnForIdentifier:1 title:@"Directory" width:120 refCol:refCol]];
|
[_resultColumns addObject:[self getColumnForIdentifier:1 title:@"Directory" width:120 refCol:refCol]];
|
||||||
[_resultColumns addObject:[matches tableColumnWithIdentifier:@"2"]]; // Size
|
NSTableColumn *sizeCol = [self getColumnForIdentifier:2 title:@"Size (MB)" width:63 refCol:refCol];
|
||||||
[_resultColumns addObject:[matches tableColumnWithIdentifier:@"3"]]; // Time
|
[[sizeCol dataCell] setAlignment:NSRightTextAlignment];
|
||||||
[_resultColumns addObject:[matches tableColumnWithIdentifier:@"4"]]; // Bitrate
|
[_resultColumns addObject:sizeCol];
|
||||||
|
NSTableColumn *timeCol = [self getColumnForIdentifier:3 title:@"Time" width:50 refCol:refCol];
|
||||||
|
[[timeCol dataCell] setAlignment:NSRightTextAlignment];
|
||||||
|
[_resultColumns addObject:timeCol];
|
||||||
|
NSTableColumn *brCol = [self getColumnForIdentifier:4 title:@"Bitrate" width:50 refCol:refCol];
|
||||||
|
[[brCol dataCell] setAlignment:NSRightTextAlignment];
|
||||||
|
[_resultColumns addObject:brCol];
|
||||||
[_resultColumns addObject:[self getColumnForIdentifier:5 title:@"Sample Rate" width:60 refCol:refCol]];
|
[_resultColumns addObject:[self getColumnForIdentifier:5 title:@"Sample Rate" width:60 refCol:refCol]];
|
||||||
[_resultColumns addObject:[self getColumnForIdentifier:6 title:@"Kind" width:40 refCol:refCol]];
|
[_resultColumns addObject:[self getColumnForIdentifier:6 title:@"Kind" width:40 refCol:refCol]];
|
||||||
[_resultColumns addObject:[self getColumnForIdentifier:7 title:@"Creation" width:120 refCol:refCol]];
|
[_resultColumns addObject:[self getColumnForIdentifier:7 title:@"Creation" width:120 refCol:refCol]];
|
||||||
@@ -292,40 +235,11 @@ http://www.hardcoded.net/licenses/hs_license
|
|||||||
[_resultColumns addObject:[self getColumnForIdentifier:13 title:@"Year" width:40 refCol:refCol]];
|
[_resultColumns addObject:[self getColumnForIdentifier:13 title:@"Year" width:40 refCol:refCol]];
|
||||||
[_resultColumns addObject:[self getColumnForIdentifier:14 title:@"Track Number" width:40 refCol:refCol]];
|
[_resultColumns addObject:[self getColumnForIdentifier:14 title:@"Track Number" width:40 refCol:refCol]];
|
||||||
[_resultColumns addObject:[self getColumnForIdentifier:15 title:@"Comment" width:120 refCol:refCol]];
|
[_resultColumns addObject:[self getColumnForIdentifier:15 title:@"Comment" width:120 refCol:refCol]];
|
||||||
[_resultColumns addObject:[matches tableColumnWithIdentifier:@"16"]]; // Match %
|
[_resultColumns addObject:[self getColumnForIdentifier:16 title:@"Match %" width:57 refCol:refCol]];
|
||||||
[_resultColumns addObject:[self getColumnForIdentifier:17 title:@"Words Used" width:120 refCol:refCol]];
|
[_resultColumns addObject:[self getColumnForIdentifier:17 title:@"Words Used" width:120 refCol:refCol]];
|
||||||
[_resultColumns addObject:[self getColumnForIdentifier:18 title:@"Dupe Count" width:80 refCol:refCol]];
|
[_resultColumns addObject:[self getColumnForIdentifier:18 title:@"Dupe Count" width:80 refCol:refCol]];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)restoreColumnsPosition:(NSArray *)aColumnsOrder widths:(NSDictionary *)aColumnsWidth
|
|
||||||
{
|
|
||||||
NSTableColumn *col;
|
|
||||||
NSString *colId;
|
|
||||||
NSNumber *width;
|
|
||||||
NSMenuItem *mi;
|
|
||||||
//Remove all columns
|
|
||||||
NSEnumerator *e = [[columnsMenu itemArray] objectEnumerator];
|
|
||||||
while (mi = [e nextObject])
|
|
||||||
{
|
|
||||||
if ([mi state] == NSOnState)
|
|
||||||
[self toggleColumn:mi];
|
|
||||||
}
|
|
||||||
//Add columns and set widths
|
|
||||||
e = [aColumnsOrder objectEnumerator];
|
|
||||||
while (colId = [e nextObject])
|
|
||||||
{
|
|
||||||
if (![colId isEqual:@"mark"])
|
|
||||||
{
|
|
||||||
col = [_resultColumns objectAtIndex:[colId intValue]];
|
|
||||||
width = [aColumnsWidth objectForKey:[col identifier]];
|
|
||||||
mi = [columnsMenu itemWithTag:[colId intValue]];
|
|
||||||
if (width)
|
|
||||||
[col setWidth:[width floatValue]];
|
|
||||||
[self toggleColumn:mi];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Delegate */
|
/* Delegate */
|
||||||
- (void)outlineView:(NSOutlineView *)outlineView willDisplayCell:(id)cell forTableColumn:(NSTableColumn *)tableColumn item:(id)item
|
- (void)outlineView:(NSOutlineView *)outlineView willDisplayCell:(id)cell forTableColumn:(NSTableColumn *)tableColumn item:(id)item
|
||||||
{
|
{
|
||||||
@@ -358,7 +272,7 @@ http://www.hardcoded.net/licenses/hs_license
|
|||||||
id lastAction = [[ProgressController mainProgressController] jobId];
|
id lastAction = [[ProgressController mainProgressController] jobId];
|
||||||
if ([lastAction isEqualTo:jobScanDeadTracks])
|
if ([lastAction isEqualTo:jobScanDeadTracks])
|
||||||
{
|
{
|
||||||
int deadTrackCount = [(PyDupeGuru *)py deadTrackCount];
|
NSInteger deadTrackCount = [(PyDupeGuru *)py deadTrackCount];
|
||||||
if (deadTrackCount > 0)
|
if (deadTrackCount > 0)
|
||||||
{
|
{
|
||||||
NSString *msg = @"Your iTunes Library contains %d dead tracks ready to be removed. Continue?";
|
NSString *msg = @"Your iTunes Library contains %d dead tracks ready to be removed. Continue?";
|
||||||
@@ -371,17 +285,4 @@ http://www.hardcoded.net/licenses/hs_license
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)outlineViewSelectionDidChange:(NSNotification *)notification
|
|
||||||
{
|
|
||||||
[self performPySelection:[self getSelectedPaths:NO]];
|
|
||||||
[py refreshDetailsWithSelected];
|
|
||||||
[[NSNotificationCenter defaultCenter] postNotificationName:DuplicateSelectionChangedNotification object:self];
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void)resultsMarkingChanged:(NSNotification *)aNotification
|
|
||||||
{
|
|
||||||
[matches invalidateMarkings];
|
|
||||||
[self refreshStats];
|
|
||||||
}
|
|
||||||
@end
|
@end
|
||||||
67
cocoa/me/dg_cocoa.py
Normal file
67
cocoa/me/dg_cocoa.py
Normal file
@@ -0,0 +1,67 @@
|
|||||||
|
# Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
|
||||||
|
#
|
||||||
|
# This software is licensed under the "HS" License as described in the "LICENSE" file,
|
||||||
|
# which should be included with this package. The terms are also available at
|
||||||
|
# http://www.hardcoded.net/licenses/hs_license
|
||||||
|
|
||||||
|
from hsutil.cocoa import signature
|
||||||
|
|
||||||
|
from core.app_cocoa_inter import PyDupeGuruBase, PyDetailsPanel
|
||||||
|
from core_me.app_cocoa import DupeGuruME
|
||||||
|
from core.scanner import (SCAN_TYPE_FILENAME, SCAN_TYPE_FIELDS, SCAN_TYPE_FIELDS_NO_ORDER,
|
||||||
|
SCAN_TYPE_TAG, SCAN_TYPE_CONTENT, SCAN_TYPE_CONTENT_AUDIO)
|
||||||
|
|
||||||
|
# Fix py2app imports which chokes on relative imports
|
||||||
|
from core_me import app_cocoa, data, fs, scanner
|
||||||
|
from hsmedia import aiff, flac, genres, id3v1, id3v2, mp4, mpeg, ogg, wma
|
||||||
|
|
||||||
|
class PyDupeGuru(PyDupeGuruBase):
|
||||||
|
def init(self):
|
||||||
|
self = super(PyDupeGuru,self).init()
|
||||||
|
self.app = DupeGuruME()
|
||||||
|
return self
|
||||||
|
|
||||||
|
def removeDeadTracks(self):
|
||||||
|
self.app.remove_dead_tracks()
|
||||||
|
|
||||||
|
def scanDeadTracks(self):
|
||||||
|
self.app.scan_dead_tracks()
|
||||||
|
|
||||||
|
#---Information
|
||||||
|
@signature('i@:')
|
||||||
|
def deadTrackCount(self):
|
||||||
|
return len(self.app.dead_tracks)
|
||||||
|
|
||||||
|
#---Properties
|
||||||
|
def setMinMatchPercentage_(self, percentage):
|
||||||
|
self.app.scanner.min_match_percentage = int(percentage)
|
||||||
|
|
||||||
|
def setScanType_(self, scan_type):
|
||||||
|
try:
|
||||||
|
self.app.scanner.scan_type = [
|
||||||
|
SCAN_TYPE_FILENAME,
|
||||||
|
SCAN_TYPE_FIELDS,
|
||||||
|
SCAN_TYPE_FIELDS_NO_ORDER,
|
||||||
|
SCAN_TYPE_TAG,
|
||||||
|
SCAN_TYPE_CONTENT,
|
||||||
|
SCAN_TYPE_CONTENT_AUDIO
|
||||||
|
][scan_type]
|
||||||
|
except IndexError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
def setWordWeighting_(self, words_are_weighted):
|
||||||
|
self.app.scanner.word_weighting = words_are_weighted
|
||||||
|
|
||||||
|
def setMatchSimilarWords_(self, match_similar_words):
|
||||||
|
self.app.scanner.match_similar_words = match_similar_words
|
||||||
|
|
||||||
|
def enable_scanForTag_(self, enable, scan_tag):
|
||||||
|
if enable:
|
||||||
|
self.app.scanner.scanned_tags.add(scan_tag)
|
||||||
|
else:
|
||||||
|
self.app.scanner.scanned_tags.discard(scan_tag)
|
||||||
|
|
||||||
|
#---Registration
|
||||||
|
def appName(self):
|
||||||
|
return "dupeGuru Music Edition"
|
||||||
|
|
||||||
@@ -19,8 +19,6 @@
|
|||||||
/* End PBXAppleScriptBuildPhase section */
|
/* End PBXAppleScriptBuildPhase section */
|
||||||
|
|
||||||
/* Begin PBXBuildFile section */
|
/* Begin PBXBuildFile section */
|
||||||
8D11072A0486CEB800E47090 /* MainMenu.nib in Resources */ = {isa = PBXBuildFile; fileRef = 29B97318FDCFA39411CA2CEA /* MainMenu.nib */; };
|
|
||||||
8D11072B0486CEB800E47090 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */; };
|
|
||||||
8D11072D0486CEB800E47090 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B97316FDCFA39411CA2CEA /* main.m */; settings = {ATTRIBUTES = (); }; };
|
8D11072D0486CEB800E47090 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B97316FDCFA39411CA2CEA /* main.m */; settings = {ATTRIBUTES = (); }; };
|
||||||
8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
|
8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
|
||||||
CE073F6309CAE1A3005C1D2F /* dupeguru_me_help in Resources */ = {isa = PBXBuildFile; fileRef = CE073F5409CAE1A3005C1D2F /* dupeguru_me_help */; };
|
CE073F6309CAE1A3005C1D2F /* dupeguru_me_help in Resources */ = {isa = PBXBuildFile; fileRef = CE073F5409CAE1A3005C1D2F /* dupeguru_me_help */; };
|
||||||
@@ -29,21 +27,20 @@
|
|||||||
CE381C9609914ACE003581CE /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = CE381C9409914ACE003581CE /* AppDelegate.m */; };
|
CE381C9609914ACE003581CE /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = CE381C9409914ACE003581CE /* AppDelegate.m */; };
|
||||||
CE381C9C09914ADF003581CE /* ResultWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = CE381C9A09914ADF003581CE /* ResultWindow.m */; };
|
CE381C9C09914ADF003581CE /* ResultWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = CE381C9A09914ADF003581CE /* ResultWindow.m */; };
|
||||||
CE381D0509915304003581CE /* dg_cocoa.plugin in Resources */ = {isa = PBXBuildFile; fileRef = CE381CF509915304003581CE /* dg_cocoa.plugin */; };
|
CE381D0509915304003581CE /* dg_cocoa.plugin in Resources */ = {isa = PBXBuildFile; fileRef = CE381CF509915304003581CE /* dg_cocoa.plugin */; };
|
||||||
CE3AA46709DB207900DB3A21 /* Directories.nib in Resources */ = {isa = PBXBuildFile; fileRef = CE3AA46509DB207900DB3A21 /* Directories.nib */; };
|
CE3FBDD31094637800B72D77 /* DetailsPanel.xib in Resources */ = {isa = PBXBuildFile; fileRef = CE3FBDD11094637800B72D77 /* DetailsPanel.xib */; };
|
||||||
|
CE3FBDD41094637800B72D77 /* DirectoryPanel.xib in Resources */ = {isa = PBXBuildFile; fileRef = CE3FBDD21094637800B72D77 /* DirectoryPanel.xib */; };
|
||||||
CE49DEF60FDFEB810098617B /* BRSingleLineFormatter.m in Sources */ = {isa = PBXBuildFile; fileRef = CE49DEF30FDFEB810098617B /* BRSingleLineFormatter.m */; };
|
CE49DEF60FDFEB810098617B /* BRSingleLineFormatter.m in Sources */ = {isa = PBXBuildFile; fileRef = CE49DEF30FDFEB810098617B /* BRSingleLineFormatter.m */; };
|
||||||
CE49DEF70FDFEB810098617B /* NSCharacterSet_Extensions.m in Sources */ = {isa = PBXBuildFile; fileRef = CE49DEF50FDFEB810098617B /* NSCharacterSet_Extensions.m */; };
|
CE4B59C81119919700C06C9E /* ErrorReportWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = CE4B59C51119919700C06C9E /* ErrorReportWindow.xib */; };
|
||||||
|
CE4B59C91119919700C06C9E /* progress.xib in Resources */ = {isa = PBXBuildFile; fileRef = CE4B59C61119919700C06C9E /* progress.xib */; };
|
||||||
|
CE4B59CA1119919700C06C9E /* registration.xib in Resources */ = {isa = PBXBuildFile; fileRef = CE4B59C71119919700C06C9E /* registration.xib */; };
|
||||||
CE515DF30FC6C12E00EC695D /* Dialogs.m in Sources */ = {isa = PBXBuildFile; fileRef = CE515DE10FC6C12E00EC695D /* Dialogs.m */; };
|
CE515DF30FC6C12E00EC695D /* Dialogs.m in Sources */ = {isa = PBXBuildFile; fileRef = CE515DE10FC6C12E00EC695D /* Dialogs.m */; };
|
||||||
CE515DF40FC6C12E00EC695D /* HSErrorReportWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = CE515DE30FC6C12E00EC695D /* HSErrorReportWindow.m */; };
|
CE515DF40FC6C12E00EC695D /* HSErrorReportWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = CE515DE30FC6C12E00EC695D /* HSErrorReportWindow.m */; };
|
||||||
CE515DF50FC6C12E00EC695D /* Outline.m in Sources */ = {isa = PBXBuildFile; fileRef = CE515DE50FC6C12E00EC695D /* Outline.m */; };
|
CE515DF50FC6C12E00EC695D /* Outline.m in Sources */ = {isa = PBXBuildFile; fileRef = CE515DE50FC6C12E00EC695D /* Outline.m */; };
|
||||||
CE515DF60FC6C12E00EC695D /* ProgressController.m in Sources */ = {isa = PBXBuildFile; fileRef = CE515DE70FC6C12E00EC695D /* ProgressController.m */; };
|
CE515DF60FC6C12E00EC695D /* ProgressController.m in Sources */ = {isa = PBXBuildFile; fileRef = CE515DE70FC6C12E00EC695D /* ProgressController.m */; };
|
||||||
CE515DF70FC6C12E00EC695D /* RecentDirectories.m in Sources */ = {isa = PBXBuildFile; fileRef = CE515DEA0FC6C12E00EC695D /* RecentDirectories.m */; };
|
CE515DF70FC6C12E00EC695D /* RecentDirectories.m in Sources */ = {isa = PBXBuildFile; fileRef = CE515DEA0FC6C12E00EC695D /* RecentDirectories.m */; };
|
||||||
CE515DF80FC6C12E00EC695D /* RegistrationInterface.m in Sources */ = {isa = PBXBuildFile; fileRef = CE515DEC0FC6C12E00EC695D /* RegistrationInterface.m */; };
|
CE515DF80FC6C12E00EC695D /* RegistrationInterface.m in Sources */ = {isa = PBXBuildFile; fileRef = CE515DEC0FC6C12E00EC695D /* RegistrationInterface.m */; };
|
||||||
CE515DF90FC6C12E00EC695D /* Table.m in Sources */ = {isa = PBXBuildFile; fileRef = CE515DEE0FC6C12E00EC695D /* Table.m */; };
|
|
||||||
CE515DFA0FC6C12E00EC695D /* Utils.m in Sources */ = {isa = PBXBuildFile; fileRef = CE515DF00FC6C12E00EC695D /* Utils.m */; };
|
CE515DFA0FC6C12E00EC695D /* Utils.m in Sources */ = {isa = PBXBuildFile; fileRef = CE515DF00FC6C12E00EC695D /* Utils.m */; };
|
||||||
CE515DFB0FC6C12E00EC695D /* ValueTransformers.m in Sources */ = {isa = PBXBuildFile; fileRef = CE515DF20FC6C12E00EC695D /* ValueTransformers.m */; };
|
CE515DFB0FC6C12E00EC695D /* ValueTransformers.m in Sources */ = {isa = PBXBuildFile; fileRef = CE515DF20FC6C12E00EC695D /* ValueTransformers.m */; };
|
||||||
CE515E020FC6C13E00EC695D /* ErrorReportWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = CE515DFC0FC6C13E00EC695D /* ErrorReportWindow.xib */; };
|
|
||||||
CE515E030FC6C13E00EC695D /* progress.nib in Resources */ = {isa = PBXBuildFile; fileRef = CE515DFE0FC6C13E00EC695D /* progress.nib */; };
|
|
||||||
CE515E040FC6C13E00EC695D /* registration.nib in Resources */ = {isa = PBXBuildFile; fileRef = CE515E000FC6C13E00EC695D /* registration.nib */; };
|
|
||||||
CE515E1D0FC6C19300EC695D /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = CE515E160FC6C19300EC695D /* AppDelegate.m */; };
|
CE515E1D0FC6C19300EC695D /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = CE515E160FC6C19300EC695D /* AppDelegate.m */; };
|
||||||
CE515E1E0FC6C19300EC695D /* DirectoryPanel.m in Sources */ = {isa = PBXBuildFile; fileRef = CE515E190FC6C19300EC695D /* DirectoryPanel.m */; };
|
CE515E1E0FC6C19300EC695D /* DirectoryPanel.m in Sources */ = {isa = PBXBuildFile; fileRef = CE515E190FC6C19300EC695D /* DirectoryPanel.m */; };
|
||||||
CE515E1F0FC6C19300EC695D /* ResultWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = CE515E1C0FC6C19300EC695D /* ResultWindow.m */; };
|
CE515E1F0FC6C19300EC695D /* ResultWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = CE515E1C0FC6C19300EC695D /* ResultWindow.m */; };
|
||||||
@@ -51,13 +48,9 @@
|
|||||||
CE68EE6809ABC48000971085 /* DirectoryPanel.m in Sources */ = {isa = PBXBuildFile; fileRef = CE68EE6609ABC48000971085 /* DirectoryPanel.m */; };
|
CE68EE6809ABC48000971085 /* DirectoryPanel.m in Sources */ = {isa = PBXBuildFile; fileRef = CE68EE6609ABC48000971085 /* DirectoryPanel.m */; };
|
||||||
CE6E0E9F1054EB97008D9390 /* dsa_pub.pem in Resources */ = {isa = PBXBuildFile; fileRef = CE6E0E9E1054EB97008D9390 /* dsa_pub.pem */; };
|
CE6E0E9F1054EB97008D9390 /* dsa_pub.pem in Resources */ = {isa = PBXBuildFile; fileRef = CE6E0E9E1054EB97008D9390 /* dsa_pub.pem */; };
|
||||||
CE848A1909DD85810004CB44 /* Consts.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = CE848A1809DD85810004CB44 /* Consts.h */; };
|
CE848A1909DD85810004CB44 /* Consts.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = CE848A1809DD85810004CB44 /* Consts.h */; };
|
||||||
CEA7D2C50FDFED340037CD8C /* dgme_logo_32.png in Resources */ = {isa = PBXBuildFile; fileRef = CEA7D2C40FDFED340037CD8C /* dgme_logo_32.png */; };
|
CE900AD2109B238600754048 /* Preferences.xib in Resources */ = {isa = PBXBuildFile; fileRef = CE900AD1109B238600754048 /* Preferences.xib */; };
|
||||||
CECA899909DB12CA00A3D774 /* Details.nib in Resources */ = {isa = PBXBuildFile; fileRef = CECA899709DB12CA00A3D774 /* Details.nib */; };
|
CE900AD7109B2A9B00754048 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = CE900AD6109B2A9B00754048 /* MainMenu.xib */; };
|
||||||
CECA899C09DB132E00A3D774 /* DetailsPanel.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = CECA899A09DB132E00A3D774 /* DetailsPanel.h */; };
|
|
||||||
CECA899D09DB132E00A3D774 /* DetailsPanel.m in Sources */ = {isa = PBXBuildFile; fileRef = CECA899B09DB132E00A3D774 /* DetailsPanel.m */; };
|
|
||||||
CED2A6880A05102700AC4C3F /* power_marker32.png in Resources */ = {isa = PBXBuildFile; fileRef = CED2A6870A05102600AC4C3F /* power_marker32.png */; };
|
|
||||||
CEEB135209C837A2004D2330 /* dupeguru.icns in Resources */ = {isa = PBXBuildFile; fileRef = CEEB135109C837A2004D2330 /* dupeguru.icns */; };
|
CEEB135209C837A2004D2330 /* dupeguru.icns in Resources */ = {isa = PBXBuildFile; fileRef = CEEB135109C837A2004D2330 /* dupeguru.icns */; };
|
||||||
CEF7823809C8AA0200EF38FF /* gear.png in Resources */ = {isa = PBXBuildFile; fileRef = CEF7823709C8AA0200EF38FF /* gear.png */; };
|
|
||||||
CEFC294609C89E3D00D9F998 /* folder32.png in Resources */ = {isa = PBXBuildFile; fileRef = CEFC294509C89E3D00D9F998 /* folder32.png */; };
|
CEFC294609C89E3D00D9F998 /* folder32.png in Resources */ = {isa = PBXBuildFile; fileRef = CEFC294509C89E3D00D9F998 /* folder32.png */; };
|
||||||
CEFC295509C89FF200D9F998 /* details32.png in Resources */ = {isa = PBXBuildFile; fileRef = CEFC295309C89FF200D9F998 /* details32.png */; };
|
CEFC295509C89FF200D9F998 /* details32.png in Resources */ = {isa = PBXBuildFile; fileRef = CEFC295309C89FF200D9F998 /* details32.png */; };
|
||||||
CEFC295609C89FF200D9F998 /* preferences32.png in Resources */ = {isa = PBXBuildFile; fileRef = CEFC295409C89FF200D9F998 /* preferences32.png */; };
|
CEFC295609C89FF200D9F998 /* preferences32.png in Resources */ = {isa = PBXBuildFile; fileRef = CEFC295409C89FF200D9F998 /* preferences32.png */; };
|
||||||
@@ -71,7 +64,6 @@
|
|||||||
dstSubfolderSpec = 10;
|
dstSubfolderSpec = 10;
|
||||||
files = (
|
files = (
|
||||||
CE14259F0AFB719300BD5167 /* Sparkle.framework in CopyFiles */,
|
CE14259F0AFB719300BD5167 /* Sparkle.framework in CopyFiles */,
|
||||||
CECA899C09DB132E00A3D774 /* DetailsPanel.h in CopyFiles */,
|
|
||||||
CE848A1909DD85810004CB44 /* Consts.h in CopyFiles */,
|
CE848A1909DD85810004CB44 /* Consts.h in CopyFiles */,
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
@@ -79,73 +71,67 @@
|
|||||||
/* End PBXCopyFilesBuildPhase section */
|
/* End PBXCopyFilesBuildPhase section */
|
||||||
|
|
||||||
/* Begin PBXFileReference section */
|
/* Begin PBXFileReference section */
|
||||||
089C165DFE840E0CC02AAC07 /* English */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/InfoPlist.strings; sourceTree = "<group>"; };
|
|
||||||
1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = /System/Library/Frameworks/Cocoa.framework; sourceTree = "<absolute>"; };
|
1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = /System/Library/Frameworks/Cocoa.framework; sourceTree = "<absolute>"; };
|
||||||
13E42FB307B3F0F600E4EEF1 /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = /System/Library/Frameworks/CoreData.framework; sourceTree = "<absolute>"; };
|
13E42FB307B3F0F600E4EEF1 /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = /System/Library/Frameworks/CoreData.framework; sourceTree = "<absolute>"; };
|
||||||
29B97316FDCFA39411CA2CEA /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = SOURCE_ROOT; };
|
29B97316FDCFA39411CA2CEA /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = SOURCE_ROOT; };
|
||||||
29B97319FDCFA39411CA2CEA /* English */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = English; path = English.lproj/MainMenu.nib; sourceTree = "<group>"; };
|
|
||||||
29B97324FDCFA39411CA2CEA /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = /System/Library/Frameworks/AppKit.framework; sourceTree = "<absolute>"; };
|
29B97324FDCFA39411CA2CEA /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = /System/Library/Frameworks/AppKit.framework; sourceTree = "<absolute>"; };
|
||||||
29B97325FDCFA39411CA2CEA /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = /System/Library/Frameworks/Foundation.framework; sourceTree = "<absolute>"; };
|
29B97325FDCFA39411CA2CEA /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = /System/Library/Frameworks/Foundation.framework; sourceTree = "<absolute>"; };
|
||||||
8D1107310486CEB800E47090 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = SOURCE_ROOT; };
|
8D1107310486CEB800E47090 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = SOURCE_ROOT; };
|
||||||
8D1107320486CEB800E47090 /* dupeGuru ME.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "dupeGuru ME.app"; sourceTree = BUILT_PRODUCTS_DIR; };
|
8D1107320486CEB800E47090 /* dupeGuru ME.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "dupeGuru ME.app"; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
CE073F5409CAE1A3005C1D2F /* dupeguru_me_help */ = {isa = PBXFileReference; lastKnownFileType = folder; name = dupeguru_me_help; path = help/dupeguru_me_help; sourceTree = "<group>"; };
|
CE073F5409CAE1A3005C1D2F /* dupeguru_me_help */ = {isa = PBXFileReference; lastKnownFileType = folder; name = dupeguru_me_help; path = ../../help_me/dupeguru_me_help; sourceTree = "<group>"; };
|
||||||
CE1425880AFB718500BD5167 /* Sparkle.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Sparkle.framework; path = /Library/Frameworks/Sparkle.framework; sourceTree = "<absolute>"; };
|
CE1425880AFB718500BD5167 /* Sparkle.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Sparkle.framework; path = /Library/Frameworks/Sparkle.framework; sourceTree = "<absolute>"; };
|
||||||
CE381C9409914ACE003581CE /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = SOURCE_ROOT; };
|
CE381C9409914ACE003581CE /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = SOURCE_ROOT; };
|
||||||
CE381C9509914ACE003581CE /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = SOURCE_ROOT; };
|
CE381C9509914ACE003581CE /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = SOURCE_ROOT; };
|
||||||
CE381C9A09914ADF003581CE /* ResultWindow.m */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.objc; path = ResultWindow.m; sourceTree = SOURCE_ROOT; };
|
CE381C9A09914ADF003581CE /* ResultWindow.m */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.objc; path = ResultWindow.m; sourceTree = SOURCE_ROOT; };
|
||||||
CE381C9B09914ADF003581CE /* ResultWindow.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = ResultWindow.h; sourceTree = SOURCE_ROOT; };
|
CE381C9B09914ADF003581CE /* ResultWindow.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = ResultWindow.h; sourceTree = SOURCE_ROOT; };
|
||||||
CE381CF509915304003581CE /* dg_cocoa.plugin */ = {isa = PBXFileReference; lastKnownFileType = folder; name = dg_cocoa.plugin; path = py/dist/dg_cocoa.plugin; sourceTree = SOURCE_ROOT; };
|
CE381CF509915304003581CE /* dg_cocoa.plugin */ = {isa = PBXFileReference; lastKnownFileType = folder; path = dg_cocoa.plugin; sourceTree = SOURCE_ROOT; };
|
||||||
CE3AA46609DB207900DB3A21 /* English */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = English; path = English.lproj/Directories.nib; sourceTree = "<group>"; };
|
CE3FBDD11094637800B72D77 /* DetailsPanel.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = DetailsPanel.xib; path = ../../base/xib/DetailsPanel.xib; sourceTree = "<group>"; };
|
||||||
CE49DEF20FDFEB810098617B /* BRSingleLineFormatter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = BRSingleLineFormatter.h; path = cocoalib/brsinglelineformatter/BRSingleLineFormatter.h; sourceTree = SOURCE_ROOT; };
|
CE3FBDD21094637800B72D77 /* DirectoryPanel.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = DirectoryPanel.xib; path = ../../base/xib/DirectoryPanel.xib; sourceTree = "<group>"; };
|
||||||
CE49DEF30FDFEB810098617B /* BRSingleLineFormatter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = BRSingleLineFormatter.m; path = cocoalib/brsinglelineformatter/BRSingleLineFormatter.m; sourceTree = SOURCE_ROOT; };
|
CE49DEF20FDFEB810098617B /* BRSingleLineFormatter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = BRSingleLineFormatter.h; path = ../../cocoalib/brsinglelineformatter/BRSingleLineFormatter.h; sourceTree = SOURCE_ROOT; };
|
||||||
CE49DEF40FDFEB810098617B /* NSCharacterSet_Extensions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = NSCharacterSet_Extensions.h; path = cocoalib/brsinglelineformatter/NSCharacterSet_Extensions.h; sourceTree = SOURCE_ROOT; };
|
CE49DEF30FDFEB810098617B /* BRSingleLineFormatter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = BRSingleLineFormatter.m; path = ../../cocoalib/brsinglelineformatter/BRSingleLineFormatter.m; sourceTree = SOURCE_ROOT; };
|
||||||
CE49DEF50FDFEB810098617B /* NSCharacterSet_Extensions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = NSCharacterSet_Extensions.m; path = cocoalib/brsinglelineformatter/NSCharacterSet_Extensions.m; sourceTree = SOURCE_ROOT; };
|
CE4B59C51119919700C06C9E /* ErrorReportWindow.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = ErrorReportWindow.xib; sourceTree = "<group>"; };
|
||||||
CE515DE00FC6C12E00EC695D /* Dialogs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Dialogs.h; path = cocoalib/Dialogs.h; sourceTree = SOURCE_ROOT; };
|
CE4B59C61119919700C06C9E /* progress.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = progress.xib; sourceTree = "<group>"; };
|
||||||
CE515DE10FC6C12E00EC695D /* Dialogs.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Dialogs.m; path = cocoalib/Dialogs.m; sourceTree = SOURCE_ROOT; };
|
CE4B59C71119919700C06C9E /* registration.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = registration.xib; sourceTree = "<group>"; };
|
||||||
CE515DE20FC6C12E00EC695D /* HSErrorReportWindow.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = HSErrorReportWindow.h; path = cocoalib/HSErrorReportWindow.h; sourceTree = SOURCE_ROOT; };
|
CE515DE00FC6C12E00EC695D /* Dialogs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Dialogs.h; path = ../../cocoalib/Dialogs.h; sourceTree = SOURCE_ROOT; };
|
||||||
CE515DE30FC6C12E00EC695D /* HSErrorReportWindow.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = HSErrorReportWindow.m; path = cocoalib/HSErrorReportWindow.m; sourceTree = SOURCE_ROOT; };
|
CE515DE10FC6C12E00EC695D /* Dialogs.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Dialogs.m; path = ../../cocoalib/Dialogs.m; sourceTree = SOURCE_ROOT; };
|
||||||
CE515DE40FC6C12E00EC695D /* Outline.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Outline.h; path = cocoalib/Outline.h; sourceTree = SOURCE_ROOT; };
|
CE515DE20FC6C12E00EC695D /* HSErrorReportWindow.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = HSErrorReportWindow.h; path = ../../cocoalib/HSErrorReportWindow.h; sourceTree = SOURCE_ROOT; };
|
||||||
CE515DE50FC6C12E00EC695D /* Outline.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Outline.m; path = cocoalib/Outline.m; sourceTree = SOURCE_ROOT; };
|
CE515DE30FC6C12E00EC695D /* HSErrorReportWindow.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = HSErrorReportWindow.m; path = ../../cocoalib/HSErrorReportWindow.m; sourceTree = SOURCE_ROOT; };
|
||||||
CE515DE60FC6C12E00EC695D /* ProgressController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ProgressController.h; path = cocoalib/ProgressController.h; sourceTree = SOURCE_ROOT; };
|
CE515DE40FC6C12E00EC695D /* Outline.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Outline.h; path = ../../cocoalib/Outline.h; sourceTree = SOURCE_ROOT; };
|
||||||
CE515DE70FC6C12E00EC695D /* ProgressController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = ProgressController.m; path = cocoalib/ProgressController.m; sourceTree = SOURCE_ROOT; };
|
CE515DE50FC6C12E00EC695D /* Outline.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Outline.m; path = ../../cocoalib/Outline.m; sourceTree = SOURCE_ROOT; };
|
||||||
CE515DE80FC6C12E00EC695D /* PyApp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PyApp.h; path = cocoalib/PyApp.h; sourceTree = SOURCE_ROOT; };
|
CE515DE60FC6C12E00EC695D /* ProgressController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ProgressController.h; path = ../../cocoalib/ProgressController.h; sourceTree = SOURCE_ROOT; };
|
||||||
CE515DE90FC6C12E00EC695D /* RecentDirectories.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RecentDirectories.h; path = cocoalib/RecentDirectories.h; sourceTree = SOURCE_ROOT; };
|
CE515DE70FC6C12E00EC695D /* ProgressController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = ProgressController.m; path = ../../cocoalib/ProgressController.m; sourceTree = SOURCE_ROOT; };
|
||||||
CE515DEA0FC6C12E00EC695D /* RecentDirectories.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RecentDirectories.m; path = cocoalib/RecentDirectories.m; sourceTree = SOURCE_ROOT; };
|
CE515DE80FC6C12E00EC695D /* PyApp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PyApp.h; path = ../../cocoalib/PyApp.h; sourceTree = SOURCE_ROOT; };
|
||||||
CE515DEB0FC6C12E00EC695D /* RegistrationInterface.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RegistrationInterface.h; path = cocoalib/RegistrationInterface.h; sourceTree = SOURCE_ROOT; };
|
CE515DE90FC6C12E00EC695D /* RecentDirectories.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RecentDirectories.h; path = ../../cocoalib/RecentDirectories.h; sourceTree = SOURCE_ROOT; };
|
||||||
CE515DEC0FC6C12E00EC695D /* RegistrationInterface.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RegistrationInterface.m; path = cocoalib/RegistrationInterface.m; sourceTree = SOURCE_ROOT; };
|
CE515DEA0FC6C12E00EC695D /* RecentDirectories.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RecentDirectories.m; path = ../../cocoalib/RecentDirectories.m; sourceTree = SOURCE_ROOT; };
|
||||||
CE515DED0FC6C12E00EC695D /* Table.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Table.h; path = cocoalib/Table.h; sourceTree = SOURCE_ROOT; };
|
CE515DEB0FC6C12E00EC695D /* RegistrationInterface.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RegistrationInterface.h; path = ../../cocoalib/RegistrationInterface.h; sourceTree = SOURCE_ROOT; };
|
||||||
CE515DEE0FC6C12E00EC695D /* Table.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Table.m; path = cocoalib/Table.m; sourceTree = SOURCE_ROOT; };
|
CE515DEC0FC6C12E00EC695D /* RegistrationInterface.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RegistrationInterface.m; path = ../../cocoalib/RegistrationInterface.m; sourceTree = SOURCE_ROOT; };
|
||||||
CE515DEF0FC6C12E00EC695D /* Utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Utils.h; path = cocoalib/Utils.h; sourceTree = SOURCE_ROOT; };
|
CE515DEF0FC6C12E00EC695D /* Utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Utils.h; path = ../../cocoalib/Utils.h; sourceTree = SOURCE_ROOT; };
|
||||||
CE515DF00FC6C12E00EC695D /* Utils.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Utils.m; path = cocoalib/Utils.m; sourceTree = SOURCE_ROOT; };
|
CE515DF00FC6C12E00EC695D /* Utils.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Utils.m; path = ../../cocoalib/Utils.m; sourceTree = SOURCE_ROOT; };
|
||||||
CE515DF10FC6C12E00EC695D /* ValueTransformers.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ValueTransformers.h; path = cocoalib/ValueTransformers.h; sourceTree = SOURCE_ROOT; };
|
CE515DF10FC6C12E00EC695D /* ValueTransformers.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ValueTransformers.h; path = ../../cocoalib/ValueTransformers.h; sourceTree = SOURCE_ROOT; };
|
||||||
CE515DF20FC6C12E00EC695D /* ValueTransformers.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = ValueTransformers.m; path = cocoalib/ValueTransformers.m; sourceTree = SOURCE_ROOT; };
|
CE515DF20FC6C12E00EC695D /* ValueTransformers.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = ValueTransformers.m; path = ../../cocoalib/ValueTransformers.m; sourceTree = SOURCE_ROOT; };
|
||||||
CE515DFD0FC6C13E00EC695D /* English */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = English; path = cocoalib/English.lproj/ErrorReportWindow.xib; sourceTree = "<group>"; };
|
CE515E150FC6C19300EC695D /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = ../base/AppDelegate.h; sourceTree = SOURCE_ROOT; };
|
||||||
CE515DFF0FC6C13E00EC695D /* English */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = English; path = cocoalib/English.lproj/progress.nib; sourceTree = "<group>"; };
|
CE515E160FC6C19300EC695D /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AppDelegate.m; path = ../base/AppDelegate.m; sourceTree = SOURCE_ROOT; };
|
||||||
CE515E010FC6C13E00EC695D /* English */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = English; path = cocoalib/English.lproj/registration.nib; sourceTree = "<group>"; };
|
CE515E170FC6C19300EC695D /* Consts.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Consts.h; path = ../base/Consts.h; sourceTree = SOURCE_ROOT; };
|
||||||
CE515E150FC6C19300EC695D /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = dgbase/AppDelegate.h; sourceTree = SOURCE_ROOT; };
|
CE515E180FC6C19300EC695D /* DirectoryPanel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DirectoryPanel.h; path = ../base/DirectoryPanel.h; sourceTree = SOURCE_ROOT; };
|
||||||
CE515E160FC6C19300EC695D /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AppDelegate.m; path = dgbase/AppDelegate.m; sourceTree = SOURCE_ROOT; };
|
CE515E190FC6C19300EC695D /* DirectoryPanel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = DirectoryPanel.m; path = ../base/DirectoryPanel.m; sourceTree = SOURCE_ROOT; };
|
||||||
CE515E170FC6C19300EC695D /* Consts.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Consts.h; path = dgbase/Consts.h; sourceTree = SOURCE_ROOT; };
|
CE515E1A0FC6C19300EC695D /* PyDupeGuru.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PyDupeGuru.h; path = ../base/PyDupeGuru.h; sourceTree = SOURCE_ROOT; };
|
||||||
CE515E180FC6C19300EC695D /* DirectoryPanel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DirectoryPanel.h; path = dgbase/DirectoryPanel.h; sourceTree = SOURCE_ROOT; };
|
CE515E1B0FC6C19300EC695D /* ResultWindow.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ResultWindow.h; path = ../base/ResultWindow.h; sourceTree = SOURCE_ROOT; };
|
||||||
CE515E190FC6C19300EC695D /* DirectoryPanel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = DirectoryPanel.m; path = dgbase/DirectoryPanel.m; sourceTree = SOURCE_ROOT; };
|
CE515E1C0FC6C19300EC695D /* ResultWindow.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = ResultWindow.m; path = ../base/ResultWindow.m; sourceTree = SOURCE_ROOT; };
|
||||||
CE515E1A0FC6C19300EC695D /* PyDupeGuru.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PyDupeGuru.h; path = dgbase/PyDupeGuru.h; sourceTree = SOURCE_ROOT; };
|
CE6032BE0FE6784C007E33FF /* DetailsPanel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DetailsPanel.h; path = ../base/DetailsPanel.h; sourceTree = SOURCE_ROOT; };
|
||||||
CE515E1B0FC6C19300EC695D /* ResultWindow.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ResultWindow.h; path = dgbase/ResultWindow.h; sourceTree = SOURCE_ROOT; };
|
CE6032BF0FE6784C007E33FF /* DetailsPanel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = DetailsPanel.m; path = ../base/DetailsPanel.m; sourceTree = SOURCE_ROOT; };
|
||||||
CE515E1C0FC6C19300EC695D /* ResultWindow.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = ResultWindow.m; path = dgbase/ResultWindow.m; sourceTree = SOURCE_ROOT; };
|
|
||||||
CE6032BE0FE6784C007E33FF /* DetailsPanel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DetailsPanel.h; path = dgbase/DetailsPanel.h; sourceTree = SOURCE_ROOT; };
|
|
||||||
CE6032BF0FE6784C007E33FF /* DetailsPanel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = DetailsPanel.m; path = dgbase/DetailsPanel.m; sourceTree = SOURCE_ROOT; };
|
|
||||||
CE68EE6509ABC48000971085 /* DirectoryPanel.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = DirectoryPanel.h; sourceTree = SOURCE_ROOT; };
|
CE68EE6509ABC48000971085 /* DirectoryPanel.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = DirectoryPanel.h; sourceTree = SOURCE_ROOT; };
|
||||||
CE68EE6609ABC48000971085 /* DirectoryPanel.m */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.objc; path = DirectoryPanel.m; sourceTree = SOURCE_ROOT; };
|
CE68EE6609ABC48000971085 /* DirectoryPanel.m */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.objc; path = DirectoryPanel.m; sourceTree = SOURCE_ROOT; };
|
||||||
CE6E0E9E1054EB97008D9390 /* dsa_pub.pem */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = dsa_pub.pem; path = dgbase/dsa_pub.pem; sourceTree = "<group>"; };
|
CE6E0E9E1054EB97008D9390 /* dsa_pub.pem */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = dsa_pub.pem; path = ../base/dsa_pub.pem; sourceTree = "<group>"; };
|
||||||
CE848A1809DD85810004CB44 /* Consts.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Consts.h; sourceTree = "<group>"; };
|
CE848A1809DD85810004CB44 /* Consts.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Consts.h; sourceTree = "<group>"; };
|
||||||
CEA7D2C40FDFED340037CD8C /* dgme_logo_32.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = dgme_logo_32.png; path = images/dgme_logo_32.png; sourceTree = SOURCE_ROOT; };
|
CE900AD1109B238600754048 /* Preferences.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = Preferences.xib; sourceTree = "<group>"; };
|
||||||
CECA899809DB12CA00A3D774 /* English */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = English; path = English.lproj/Details.nib; sourceTree = "<group>"; };
|
CE900AD6109B2A9B00754048 /* MainMenu.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = MainMenu.xib; path = ../../base/xib/MainMenu.xib; sourceTree = "<group>"; };
|
||||||
CECA899A09DB132E00A3D774 /* DetailsPanel.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = DetailsPanel.h; sourceTree = "<group>"; };
|
CECA899A09DB132E00A3D774 /* DetailsPanel.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = DetailsPanel.h; sourceTree = "<group>"; };
|
||||||
CECA899B09DB132E00A3D774 /* DetailsPanel.m */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.objc; path = DetailsPanel.m; sourceTree = "<group>"; };
|
CECA899B09DB132E00A3D774 /* DetailsPanel.m */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.objc; path = DetailsPanel.m; sourceTree = "<group>"; };
|
||||||
CED2A6870A05102600AC4C3F /* power_marker32.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = power_marker32.png; path = images/power_marker32.png; sourceTree = SOURCE_ROOT; };
|
CED0A591111C9FD10020AD7D /* PyDetailsPanel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PyDetailsPanel.h; path = ../base/PyDetailsPanel.h; sourceTree = SOURCE_ROOT; };
|
||||||
CEEB135109C837A2004D2330 /* dupeguru.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = dupeguru.icns; sourceTree = "<group>"; };
|
CEEB135109C837A2004D2330 /* dupeguru.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = dupeguru.icns; sourceTree = "<group>"; };
|
||||||
CEF7823709C8AA0200EF38FF /* gear.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = gear.png; path = images/gear.png; sourceTree = "<group>"; };
|
CEFC294509C89E3D00D9F998 /* folder32.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = folder32.png; path = ../../images/folder32.png; sourceTree = SOURCE_ROOT; };
|
||||||
CEFC294509C89E3D00D9F998 /* folder32.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = folder32.png; path = images/folder32.png; sourceTree = SOURCE_ROOT; };
|
CEFC295309C89FF200D9F998 /* details32.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = details32.png; path = ../../images/details32.png; sourceTree = SOURCE_ROOT; };
|
||||||
CEFC295309C89FF200D9F998 /* details32.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = details32.png; path = images/details32.png; sourceTree = SOURCE_ROOT; };
|
CEFC295409C89FF200D9F998 /* preferences32.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = preferences32.png; path = ../../images/preferences32.png; sourceTree = SOURCE_ROOT; };
|
||||||
CEFC295409C89FF200D9F998 /* preferences32.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = preferences32.png; path = images/preferences32.png; sourceTree = SOURCE_ROOT; };
|
|
||||||
CEFF18A009A4D387005E6321 /* PyDupeGuru.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = PyDupeGuru.h; sourceTree = SOURCE_ROOT; };
|
CEFF18A009A4D387005E6321 /* PyDupeGuru.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = PyDupeGuru.h; sourceTree = SOURCE_ROOT; };
|
||||||
/* End PBXFileReference section */
|
/* End PBXFileReference section */
|
||||||
|
|
||||||
@@ -231,16 +217,13 @@
|
|||||||
29B97317FDCFA39411CA2CEA /* Resources */ = {
|
29B97317FDCFA39411CA2CEA /* Resources */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
|
CE3FBDD01094637800B72D77 /* xib */,
|
||||||
CE073F5409CAE1A3005C1D2F /* dupeguru_me_help */,
|
CE073F5409CAE1A3005C1D2F /* dupeguru_me_help */,
|
||||||
CE381CF509915304003581CE /* dg_cocoa.plugin */,
|
CE381CF509915304003581CE /* dg_cocoa.plugin */,
|
||||||
CEFC294309C89E0000D9F998 /* images */,
|
CEFC294309C89E0000D9F998 /* images */,
|
||||||
CEEB135109C837A2004D2330 /* dupeguru.icns */,
|
CEEB135109C837A2004D2330 /* dupeguru.icns */,
|
||||||
8D1107310486CEB800E47090 /* Info.plist */,
|
8D1107310486CEB800E47090 /* Info.plist */,
|
||||||
089C165CFE840E0CC02AAC07 /* InfoPlist.strings */,
|
|
||||||
CE6E0E9E1054EB97008D9390 /* dsa_pub.pem */,
|
CE6E0E9E1054EB97008D9390 /* dsa_pub.pem */,
|
||||||
CECA899709DB12CA00A3D774 /* Details.nib */,
|
|
||||||
CE3AA46509DB207900DB3A21 /* Directories.nib */,
|
|
||||||
29B97318FDCFA39411CA2CEA /* MainMenu.nib */,
|
|
||||||
);
|
);
|
||||||
name = Resources;
|
name = Resources;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
@@ -254,25 +237,43 @@
|
|||||||
name = Frameworks;
|
name = Frameworks;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
};
|
};
|
||||||
|
CE3FBDD01094637800B72D77 /* xib */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
CE900AD6109B2A9B00754048 /* MainMenu.xib */,
|
||||||
|
CE3FBDD11094637800B72D77 /* DetailsPanel.xib */,
|
||||||
|
CE3FBDD21094637800B72D77 /* DirectoryPanel.xib */,
|
||||||
|
CE900AD1109B238600754048 /* Preferences.xib */,
|
||||||
|
);
|
||||||
|
path = xib;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
CE49DEF10FDFEB810098617B /* brsinglelineformatter */ = {
|
CE49DEF10FDFEB810098617B /* brsinglelineformatter */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
CE49DEF20FDFEB810098617B /* BRSingleLineFormatter.h */,
|
CE49DEF20FDFEB810098617B /* BRSingleLineFormatter.h */,
|
||||||
CE49DEF30FDFEB810098617B /* BRSingleLineFormatter.m */,
|
CE49DEF30FDFEB810098617B /* BRSingleLineFormatter.m */,
|
||||||
CE49DEF40FDFEB810098617B /* NSCharacterSet_Extensions.h */,
|
|
||||||
CE49DEF50FDFEB810098617B /* NSCharacterSet_Extensions.m */,
|
|
||||||
);
|
);
|
||||||
name = brsinglelineformatter;
|
name = brsinglelineformatter;
|
||||||
path = cocoalib/brsinglelineformatter;
|
path = ../../cocoalib/brsinglelineformatter;
|
||||||
|
sourceTree = SOURCE_ROOT;
|
||||||
|
};
|
||||||
|
CE4B59C41119919700C06C9E /* xib */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
CE4B59C51119919700C06C9E /* ErrorReportWindow.xib */,
|
||||||
|
CE4B59C61119919700C06C9E /* progress.xib */,
|
||||||
|
CE4B59C71119919700C06C9E /* registration.xib */,
|
||||||
|
);
|
||||||
|
name = xib;
|
||||||
|
path = ../../cocoalib/xib;
|
||||||
sourceTree = SOURCE_ROOT;
|
sourceTree = SOURCE_ROOT;
|
||||||
};
|
};
|
||||||
CE515DDD0FC6C09400EC695D /* cocoalib */ = {
|
CE515DDD0FC6C09400EC695D /* cocoalib */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
|
CE4B59C41119919700C06C9E /* xib */,
|
||||||
CE49DEF10FDFEB810098617B /* brsinglelineformatter */,
|
CE49DEF10FDFEB810098617B /* brsinglelineformatter */,
|
||||||
CE515DFC0FC6C13E00EC695D /* ErrorReportWindow.xib */,
|
|
||||||
CE515DFE0FC6C13E00EC695D /* progress.nib */,
|
|
||||||
CE515E000FC6C13E00EC695D /* registration.nib */,
|
|
||||||
CE515DE00FC6C12E00EC695D /* Dialogs.h */,
|
CE515DE00FC6C12E00EC695D /* Dialogs.h */,
|
||||||
CE515DE10FC6C12E00EC695D /* Dialogs.m */,
|
CE515DE10FC6C12E00EC695D /* Dialogs.m */,
|
||||||
CE515DE20FC6C12E00EC695D /* HSErrorReportWindow.h */,
|
CE515DE20FC6C12E00EC695D /* HSErrorReportWindow.h */,
|
||||||
@@ -286,8 +287,6 @@
|
|||||||
CE515DEA0FC6C12E00EC695D /* RecentDirectories.m */,
|
CE515DEA0FC6C12E00EC695D /* RecentDirectories.m */,
|
||||||
CE515DEB0FC6C12E00EC695D /* RegistrationInterface.h */,
|
CE515DEB0FC6C12E00EC695D /* RegistrationInterface.h */,
|
||||||
CE515DEC0FC6C12E00EC695D /* RegistrationInterface.m */,
|
CE515DEC0FC6C12E00EC695D /* RegistrationInterface.m */,
|
||||||
CE515DED0FC6C12E00EC695D /* Table.h */,
|
|
||||||
CE515DEE0FC6C12E00EC695D /* Table.m */,
|
|
||||||
CE515DEF0FC6C12E00EC695D /* Utils.h */,
|
CE515DEF0FC6C12E00EC695D /* Utils.h */,
|
||||||
CE515DF00FC6C12E00EC695D /* Utils.m */,
|
CE515DF00FC6C12E00EC695D /* Utils.m */,
|
||||||
CE515DF10FC6C12E00EC695D /* ValueTransformers.h */,
|
CE515DF10FC6C12E00EC695D /* ValueTransformers.h */,
|
||||||
@@ -307,6 +306,7 @@
|
|||||||
CE515E180FC6C19300EC695D /* DirectoryPanel.h */,
|
CE515E180FC6C19300EC695D /* DirectoryPanel.h */,
|
||||||
CE515E190FC6C19300EC695D /* DirectoryPanel.m */,
|
CE515E190FC6C19300EC695D /* DirectoryPanel.m */,
|
||||||
CE515E1A0FC6C19300EC695D /* PyDupeGuru.h */,
|
CE515E1A0FC6C19300EC695D /* PyDupeGuru.h */,
|
||||||
|
CED0A591111C9FD10020AD7D /* PyDetailsPanel.h */,
|
||||||
CE515E1B0FC6C19300EC695D /* ResultWindow.h */,
|
CE515E1B0FC6C19300EC695D /* ResultWindow.h */,
|
||||||
CE515E1C0FC6C19300EC695D /* ResultWindow.m */,
|
CE515E1C0FC6C19300EC695D /* ResultWindow.m */,
|
||||||
);
|
);
|
||||||
@@ -316,9 +316,6 @@
|
|||||||
CEFC294309C89E0000D9F998 /* images */ = {
|
CEFC294309C89E0000D9F998 /* images */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
CEA7D2C40FDFED340037CD8C /* dgme_logo_32.png */,
|
|
||||||
CED2A6870A05102600AC4C3F /* power_marker32.png */,
|
|
||||||
CEF7823709C8AA0200EF38FF /* gear.png */,
|
|
||||||
CEFC295309C89FF200D9F998 /* details32.png */,
|
CEFC295309C89FF200D9F998 /* details32.png */,
|
||||||
CEFC295409C89FF200D9F998 /* preferences32.png */,
|
CEFC295409C89FF200D9F998 /* preferences32.png */,
|
||||||
CEFC294509C89E3D00D9F998 /* folder32.png */,
|
CEFC294509C89E3D00D9F998 /* folder32.png */,
|
||||||
@@ -371,23 +368,20 @@
|
|||||||
isa = PBXResourcesBuildPhase;
|
isa = PBXResourcesBuildPhase;
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
files = (
|
files = (
|
||||||
8D11072A0486CEB800E47090 /* MainMenu.nib in Resources */,
|
|
||||||
8D11072B0486CEB800E47090 /* InfoPlist.strings in Resources */,
|
|
||||||
CE381D0509915304003581CE /* dg_cocoa.plugin in Resources */,
|
CE381D0509915304003581CE /* dg_cocoa.plugin in Resources */,
|
||||||
CE073F6309CAE1A3005C1D2F /* dupeguru_me_help in Resources */,
|
CE073F6309CAE1A3005C1D2F /* dupeguru_me_help in Resources */,
|
||||||
CEEB135209C837A2004D2330 /* dupeguru.icns in Resources */,
|
CEEB135209C837A2004D2330 /* dupeguru.icns in Resources */,
|
||||||
CEFC294609C89E3D00D9F998 /* folder32.png in Resources */,
|
CEFC294609C89E3D00D9F998 /* folder32.png in Resources */,
|
||||||
CEFC295509C89FF200D9F998 /* details32.png in Resources */,
|
CEFC295509C89FF200D9F998 /* details32.png in Resources */,
|
||||||
CEFC295609C89FF200D9F998 /* preferences32.png in Resources */,
|
CEFC295609C89FF200D9F998 /* preferences32.png in Resources */,
|
||||||
CEF7823809C8AA0200EF38FF /* gear.png in Resources */,
|
|
||||||
CECA899909DB12CA00A3D774 /* Details.nib in Resources */,
|
|
||||||
CE3AA46709DB207900DB3A21 /* Directories.nib in Resources */,
|
|
||||||
CED2A6880A05102700AC4C3F /* power_marker32.png in Resources */,
|
|
||||||
CE515E020FC6C13E00EC695D /* ErrorReportWindow.xib in Resources */,
|
|
||||||
CE515E030FC6C13E00EC695D /* progress.nib in Resources */,
|
|
||||||
CE515E040FC6C13E00EC695D /* registration.nib in Resources */,
|
|
||||||
CEA7D2C50FDFED340037CD8C /* dgme_logo_32.png in Resources */,
|
|
||||||
CE6E0E9F1054EB97008D9390 /* dsa_pub.pem in Resources */,
|
CE6E0E9F1054EB97008D9390 /* dsa_pub.pem in Resources */,
|
||||||
|
CE3FBDD31094637800B72D77 /* DetailsPanel.xib in Resources */,
|
||||||
|
CE3FBDD41094637800B72D77 /* DirectoryPanel.xib in Resources */,
|
||||||
|
CE900AD2109B238600754048 /* Preferences.xib in Resources */,
|
||||||
|
CE900AD7109B2A9B00754048 /* MainMenu.xib in Resources */,
|
||||||
|
CE4B59C81119919700C06C9E /* ErrorReportWindow.xib in Resources */,
|
||||||
|
CE4B59C91119919700C06C9E /* progress.xib in Resources */,
|
||||||
|
CE4B59CA1119919700C06C9E /* registration.xib in Resources */,
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
@@ -402,153 +396,73 @@
|
|||||||
CE381C9609914ACE003581CE /* AppDelegate.m in Sources */,
|
CE381C9609914ACE003581CE /* AppDelegate.m in Sources */,
|
||||||
CE381C9C09914ADF003581CE /* ResultWindow.m in Sources */,
|
CE381C9C09914ADF003581CE /* ResultWindow.m in Sources */,
|
||||||
CE68EE6809ABC48000971085 /* DirectoryPanel.m in Sources */,
|
CE68EE6809ABC48000971085 /* DirectoryPanel.m in Sources */,
|
||||||
CECA899D09DB132E00A3D774 /* DetailsPanel.m in Sources */,
|
|
||||||
CE515DF30FC6C12E00EC695D /* Dialogs.m in Sources */,
|
CE515DF30FC6C12E00EC695D /* Dialogs.m in Sources */,
|
||||||
CE515DF40FC6C12E00EC695D /* HSErrorReportWindow.m in Sources */,
|
CE515DF40FC6C12E00EC695D /* HSErrorReportWindow.m in Sources */,
|
||||||
CE515DF50FC6C12E00EC695D /* Outline.m in Sources */,
|
CE515DF50FC6C12E00EC695D /* Outline.m in Sources */,
|
||||||
CE515DF60FC6C12E00EC695D /* ProgressController.m in Sources */,
|
CE515DF60FC6C12E00EC695D /* ProgressController.m in Sources */,
|
||||||
CE515DF70FC6C12E00EC695D /* RecentDirectories.m in Sources */,
|
CE515DF70FC6C12E00EC695D /* RecentDirectories.m in Sources */,
|
||||||
CE515DF80FC6C12E00EC695D /* RegistrationInterface.m in Sources */,
|
CE515DF80FC6C12E00EC695D /* RegistrationInterface.m in Sources */,
|
||||||
CE515DF90FC6C12E00EC695D /* Table.m in Sources */,
|
|
||||||
CE515DFA0FC6C12E00EC695D /* Utils.m in Sources */,
|
CE515DFA0FC6C12E00EC695D /* Utils.m in Sources */,
|
||||||
CE515DFB0FC6C12E00EC695D /* ValueTransformers.m in Sources */,
|
CE515DFB0FC6C12E00EC695D /* ValueTransformers.m in Sources */,
|
||||||
CE515E1D0FC6C19300EC695D /* AppDelegate.m in Sources */,
|
CE515E1D0FC6C19300EC695D /* AppDelegate.m in Sources */,
|
||||||
CE515E1E0FC6C19300EC695D /* DirectoryPanel.m in Sources */,
|
CE515E1E0FC6C19300EC695D /* DirectoryPanel.m in Sources */,
|
||||||
CE515E1F0FC6C19300EC695D /* ResultWindow.m in Sources */,
|
CE515E1F0FC6C19300EC695D /* ResultWindow.m in Sources */,
|
||||||
CE49DEF60FDFEB810098617B /* BRSingleLineFormatter.m in Sources */,
|
CE49DEF60FDFEB810098617B /* BRSingleLineFormatter.m in Sources */,
|
||||||
CE49DEF70FDFEB810098617B /* NSCharacterSet_Extensions.m in Sources */,
|
|
||||||
CE6032C00FE6784C007E33FF /* DetailsPanel.m in Sources */,
|
CE6032C00FE6784C007E33FF /* DetailsPanel.m in Sources */,
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
/* End PBXSourcesBuildPhase section */
|
/* End PBXSourcesBuildPhase section */
|
||||||
|
|
||||||
/* Begin PBXVariantGroup section */
|
|
||||||
089C165CFE840E0CC02AAC07 /* InfoPlist.strings */ = {
|
|
||||||
isa = PBXVariantGroup;
|
|
||||||
children = (
|
|
||||||
089C165DFE840E0CC02AAC07 /* English */,
|
|
||||||
);
|
|
||||||
name = InfoPlist.strings;
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
29B97318FDCFA39411CA2CEA /* MainMenu.nib */ = {
|
|
||||||
isa = PBXVariantGroup;
|
|
||||||
children = (
|
|
||||||
29B97319FDCFA39411CA2CEA /* English */,
|
|
||||||
);
|
|
||||||
name = MainMenu.nib;
|
|
||||||
sourceTree = SOURCE_ROOT;
|
|
||||||
};
|
|
||||||
CE3AA46509DB207900DB3A21 /* Directories.nib */ = {
|
|
||||||
isa = PBXVariantGroup;
|
|
||||||
children = (
|
|
||||||
CE3AA46609DB207900DB3A21 /* English */,
|
|
||||||
);
|
|
||||||
name = Directories.nib;
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
CE515DFC0FC6C13E00EC695D /* ErrorReportWindow.xib */ = {
|
|
||||||
isa = PBXVariantGroup;
|
|
||||||
children = (
|
|
||||||
CE515DFD0FC6C13E00EC695D /* English */,
|
|
||||||
);
|
|
||||||
name = ErrorReportWindow.xib;
|
|
||||||
sourceTree = SOURCE_ROOT;
|
|
||||||
};
|
|
||||||
CE515DFE0FC6C13E00EC695D /* progress.nib */ = {
|
|
||||||
isa = PBXVariantGroup;
|
|
||||||
children = (
|
|
||||||
CE515DFF0FC6C13E00EC695D /* English */,
|
|
||||||
);
|
|
||||||
name = progress.nib;
|
|
||||||
sourceTree = SOURCE_ROOT;
|
|
||||||
};
|
|
||||||
CE515E000FC6C13E00EC695D /* registration.nib */ = {
|
|
||||||
isa = PBXVariantGroup;
|
|
||||||
children = (
|
|
||||||
CE515E010FC6C13E00EC695D /* English */,
|
|
||||||
);
|
|
||||||
name = registration.nib;
|
|
||||||
sourceTree = SOURCE_ROOT;
|
|
||||||
};
|
|
||||||
CECA899709DB12CA00A3D774 /* Details.nib */ = {
|
|
||||||
isa = PBXVariantGroup;
|
|
||||||
children = (
|
|
||||||
CECA899809DB12CA00A3D774 /* English */,
|
|
||||||
);
|
|
||||||
name = Details.nib;
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
/* End PBXVariantGroup section */
|
|
||||||
|
|
||||||
/* Begin XCBuildConfiguration section */
|
/* Begin XCBuildConfiguration section */
|
||||||
C01FCF4B08A954540054247B /* Debug */ = {
|
C01FCF4C08A954540054247B /* release */ = {
|
||||||
isa = XCBuildConfiguration;
|
isa = XCBuildConfiguration;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
COPY_PHASE_STRIP = NO;
|
|
||||||
FRAMEWORK_SEARCH_PATHS = (
|
|
||||||
"$(FRAMEWORK_SEARCH_PATHS)",
|
|
||||||
"$(SRCROOT)/../../../cocoalib/build/Release",
|
|
||||||
"\"$(SRCROOT)/../../base/cocoa/build/Release\"",
|
|
||||||
);
|
|
||||||
GCC_DYNAMIC_NO_PIC = NO;
|
|
||||||
GCC_ENABLE_FIX_AND_CONTINUE = YES;
|
|
||||||
GCC_MODEL_TUNING = G5;
|
|
||||||
GCC_OPTIMIZATION_LEVEL = 0;
|
|
||||||
INFOPLIST_FILE = Info.plist;
|
|
||||||
INSTALL_PATH = "$(HOME)/Applications";
|
|
||||||
PRODUCT_NAME = dupeGuru;
|
|
||||||
WRAPPER_EXTENSION = app;
|
|
||||||
ZERO_LINK = YES;
|
|
||||||
};
|
|
||||||
name = Debug;
|
|
||||||
};
|
|
||||||
C01FCF4C08A954540054247B /* Release */ = {
|
|
||||||
isa = XCBuildConfiguration;
|
|
||||||
buildSettings = {
|
|
||||||
FRAMEWORK_SEARCH_PATHS = (
|
|
||||||
"$(FRAMEWORK_SEARCH_PATHS)",
|
|
||||||
"$(SRCROOT)/../../../cocoalib/build/Release",
|
|
||||||
"\"$(SRCROOT)/../../base/cocoa/build/Release\"",
|
|
||||||
);
|
|
||||||
GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
|
GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
|
||||||
GCC_MODEL_TUNING = G5;
|
|
||||||
INFOPLIST_FILE = Info.plist;
|
INFOPLIST_FILE = Info.plist;
|
||||||
INSTALL_PATH = "$(HOME)/Applications";
|
INSTALL_PATH = "$(HOME)/Applications";
|
||||||
PRODUCT_NAME = "dupeGuru ME";
|
PRODUCT_NAME = "dupeGuru ME";
|
||||||
WRAPPER_EXTENSION = app;
|
WRAPPER_EXTENSION = app;
|
||||||
};
|
};
|
||||||
name = Release;
|
name = release;
|
||||||
};
|
};
|
||||||
C01FCF4F08A954540054247B /* Debug */ = {
|
C01FCF5008A954540054247B /* release */ = {
|
||||||
isa = XCBuildConfiguration;
|
isa = XCBuildConfiguration;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
|
ARCHS = (
|
||||||
|
i386,
|
||||||
|
x86_64,
|
||||||
|
ppc,
|
||||||
|
);
|
||||||
GCC_C_LANGUAGE_STANDARD = c99;
|
GCC_C_LANGUAGE_STANDARD = c99;
|
||||||
GCC_WARN_ABOUT_RETURN_TYPE = YES;
|
GCC_WARN_ABOUT_RETURN_TYPE = YES;
|
||||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||||
MACOSX_DEPLOYMENT_TARGET = 10.4;
|
MACOSX_DEPLOYMENT_TARGET = 10.5;
|
||||||
PREBINDING = NO;
|
SDKROOT = "$(DEVELOPER_SDK_DIR)/MacOSX10.5.sdk";
|
||||||
SDKROOT = "$(DEVELOPER_SDK_DIR)/MacOSX10.4u.sdk";
|
|
||||||
};
|
};
|
||||||
name = Debug;
|
name = release;
|
||||||
};
|
};
|
||||||
C01FCF5008A954540054247B /* Release */ = {
|
CED596C5111AF56D00C0CF2B /* dev */ = {
|
||||||
isa = XCBuildConfiguration;
|
isa = XCBuildConfiguration;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
ARCHS = "$(ARCHS_STANDARD_32_BIT_PRE_XCODE_3_1)";
|
ARCHS = "$(NATIVE_ARCH_ACTUAL)";
|
||||||
ARCHS_STANDARD_32_BIT_PRE_XCODE_3_1 = "ppc i386";
|
|
||||||
COPY_PHASE_STRIP = NO;
|
|
||||||
GCC_C_LANGUAGE_STANDARD = c99;
|
GCC_C_LANGUAGE_STANDARD = c99;
|
||||||
GCC_VERSION = 4.0;
|
|
||||||
GCC_WARN_ABOUT_RETURN_TYPE = YES;
|
GCC_WARN_ABOUT_RETURN_TYPE = YES;
|
||||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||||
MACOSX_DEPLOYMENT_TARGET = 10.4;
|
MACOSX_DEPLOYMENT_TARGET = 10.5;
|
||||||
PREBINDING = NO;
|
SDKROOT = "$(DEVELOPER_SDK_DIR)/MacOSX10.5.sdk";
|
||||||
SDKROOT = "$(DEVELOPER_SDK_DIR)/MacOSX10.4u.sdk";
|
|
||||||
STRIP_INSTALLED_PRODUCT = NO;
|
|
||||||
};
|
};
|
||||||
name = Release;
|
name = dev;
|
||||||
|
};
|
||||||
|
CED596C6111AF56D00C0CF2B /* dev */ = {
|
||||||
|
isa = XCBuildConfiguration;
|
||||||
|
buildSettings = {
|
||||||
|
INFOPLIST_FILE = Info.plist;
|
||||||
|
INSTALL_PATH = "$(HOME)/Applications";
|
||||||
|
PRODUCT_NAME = "dupeGuru ME";
|
||||||
|
WRAPPER_EXTENSION = app;
|
||||||
|
};
|
||||||
|
name = dev;
|
||||||
};
|
};
|
||||||
/* End XCBuildConfiguration section */
|
/* End XCBuildConfiguration section */
|
||||||
|
|
||||||
@@ -556,20 +470,20 @@
|
|||||||
C01FCF4A08A954540054247B /* Build configuration list for PBXNativeTarget "dupeguru" */ = {
|
C01FCF4A08A954540054247B /* Build configuration list for PBXNativeTarget "dupeguru" */ = {
|
||||||
isa = XCConfigurationList;
|
isa = XCConfigurationList;
|
||||||
buildConfigurations = (
|
buildConfigurations = (
|
||||||
C01FCF4B08A954540054247B /* Debug */,
|
C01FCF4C08A954540054247B /* release */,
|
||||||
C01FCF4C08A954540054247B /* Release */,
|
CED596C6111AF56D00C0CF2B /* dev */,
|
||||||
);
|
);
|
||||||
defaultConfigurationIsVisible = 0;
|
defaultConfigurationIsVisible = 0;
|
||||||
defaultConfigurationName = Release;
|
defaultConfigurationName = release;
|
||||||
};
|
};
|
||||||
C01FCF4E08A954540054247B /* Build configuration list for PBXProject "dupeguru" */ = {
|
C01FCF4E08A954540054247B /* Build configuration list for PBXProject "dupeguru" */ = {
|
||||||
isa = XCConfigurationList;
|
isa = XCConfigurationList;
|
||||||
buildConfigurations = (
|
buildConfigurations = (
|
||||||
C01FCF4F08A954540054247B /* Debug */,
|
C01FCF5008A954540054247B /* release */,
|
||||||
C01FCF5008A954540054247B /* Release */,
|
CED596C5111AF56D00C0CF2B /* dev */,
|
||||||
);
|
);
|
||||||
defaultConfigurationIsVisible = 0;
|
defaultConfigurationIsVisible = 0;
|
||||||
defaultConfigurationName = Release;
|
defaultConfigurationName = release;
|
||||||
};
|
};
|
||||||
/* End XCConfigurationList section */
|
/* End XCConfigurationList section */
|
||||||
};
|
};
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
Copyright 2009 Hardcoded Software (http://www.hardcoded.net)
|
Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
|
||||||
|
|
||||||
This software is licensed under the "HS" License as described in the "LICENSE" file,
|
This software is licensed under the "HS" License as described in the "LICENSE" file,
|
||||||
which should be included with this package. The terms are also available at
|
which should be included with this package. The terms are also available at
|
||||||
@@ -7,10 +7,12 @@ http://www.hardcoded.net/licenses/hs_license
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#import <Cocoa/Cocoa.h>
|
#import <Cocoa/Cocoa.h>
|
||||||
|
#import "Utils.h"
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
|
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
|
||||||
|
[Utils setPluginName:@"dg_cocoa"];
|
||||||
NSString *pluginPath = [[NSBundle mainBundle]
|
NSString *pluginPath = [[NSBundle mainBundle]
|
||||||
pathForResource:@"dg_cocoa"
|
pathForResource:@"dg_cocoa"
|
||||||
ofType:@"plugin"];
|
ofType:@"plugin"];
|
||||||
2611
cocoa/me/xib/Preferences.xib
Normal file
2611
cocoa/me/xib/Preferences.xib
Normal file
File diff suppressed because it is too large
Load Diff
18
cocoa/pe/AppDelegate.h
Normal file
18
cocoa/pe/AppDelegate.h
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
/*
|
||||||
|
Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
|
||||||
|
|
||||||
|
This software is licensed under the "HS" License as described in the "LICENSE" file,
|
||||||
|
which should be included with this package. The terms are also available at
|
||||||
|
http://www.hardcoded.net/licenses/hs_license
|
||||||
|
*/
|
||||||
|
|
||||||
|
#import <Cocoa/Cocoa.h>
|
||||||
|
#import "../base/AppDelegate.h"
|
||||||
|
#import "PyDupeGuru.h"
|
||||||
|
|
||||||
|
@interface AppDelegate : AppDelegateBase {}
|
||||||
|
- (IBAction)openWebsite:(id)sender;
|
||||||
|
- (IBAction)toggleDirectories:(id)sender;
|
||||||
|
|
||||||
|
- (PyDupeGuru *)py;
|
||||||
|
@end
|
||||||
79
cocoa/pe/AppDelegate.m
Normal file
79
cocoa/pe/AppDelegate.m
Normal file
@@ -0,0 +1,79 @@
|
|||||||
|
/*
|
||||||
|
Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
|
||||||
|
|
||||||
|
This software is licensed under the "HS" License as described in the "LICENSE" file,
|
||||||
|
which should be included with this package. The terms are also available at
|
||||||
|
http://www.hardcoded.net/licenses/hs_license
|
||||||
|
*/
|
||||||
|
|
||||||
|
#import "AppDelegate.h"
|
||||||
|
#import "ProgressController.h"
|
||||||
|
#import "RegistrationInterface.h"
|
||||||
|
#import "Utils.h"
|
||||||
|
#import "ValueTransformers.h"
|
||||||
|
#import "Consts.h"
|
||||||
|
#import "DetailsPanel.h"
|
||||||
|
#import "DirectoryPanel.h"
|
||||||
|
|
||||||
|
@implementation AppDelegate
|
||||||
|
+ (void)initialize
|
||||||
|
{
|
||||||
|
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:@"removeEmptyFolders"];
|
||||||
|
[d setObject:[NSNumber numberWithBool:NO] forKey:@"debug"];
|
||||||
|
[d setObject:[NSArray array] forKey:@"recentDirectories"];
|
||||||
|
[d setObject:[NSArray array] forKey:@"columnsOrder"];
|
||||||
|
[d setObject:[NSDictionary dictionary] forKey:@"columnsWidth"];
|
||||||
|
[[NSUserDefaultsController sharedUserDefaultsController] setInitialValues:d];
|
||||||
|
[ud registerDefaults:d];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (id)init
|
||||||
|
{
|
||||||
|
self = [super init];
|
||||||
|
_directoryPanel = nil;
|
||||||
|
return self;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (DetailsPanel *)detailsPanel
|
||||||
|
{
|
||||||
|
if (!_detailsPanel)
|
||||||
|
_detailsPanel = [[DetailsPanelPE alloc] initWithPy:py];
|
||||||
|
return _detailsPanel;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (IBAction)openWebsite:(id)sender
|
||||||
|
{
|
||||||
|
[[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:@"http://www.hardcoded.net/dupeguru_pe"]];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (IBAction)toggleDirectories:(id)sender
|
||||||
|
{
|
||||||
|
[[self directoryPanel] toggleVisible:sender];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (DirectoryPanel *)directoryPanel
|
||||||
|
{
|
||||||
|
if (!_directoryPanel)
|
||||||
|
_directoryPanel = [[DirectoryPanelPE alloc] initWithParentApp:self];
|
||||||
|
return _directoryPanel;
|
||||||
|
}
|
||||||
|
- (PyDupeGuru *)py { return (PyDupeGuru *)py; }
|
||||||
|
|
||||||
|
//Delegate
|
||||||
|
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
|
||||||
|
{
|
||||||
|
NSMenu *actionsMenu = [[[NSApp mainMenu] itemWithTitle:@"Actions"] submenu];
|
||||||
|
// index 2 is just after "Clear Ingore List"
|
||||||
|
NSMenuItem *mi = [actionsMenu insertItemWithTitle:@"Clear Picture Cache" action:@selector(clearPictureCache:) keyEquivalent:@"P" atIndex:2];
|
||||||
|
[mi setTarget:result];
|
||||||
|
[mi setKeyEquivalentModifierMask:NSCommandKeyMask|NSShiftKeyMask];
|
||||||
|
[super applicationDidFinishLaunching:aNotification];
|
||||||
|
}
|
||||||
|
@end
|
||||||
@@ -1,12 +1,11 @@
|
|||||||
/*
|
/*
|
||||||
Copyright 2009 Hardcoded Software (http://www.hardcoded.net)
|
Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
|
||||||
|
|
||||||
This software is licensed under the "HS" License as described in the "LICENSE" file,
|
This software is licensed under the "HS" License as described in the "LICENSE" file,
|
||||||
which should be included with this package. The terms are also available at
|
which should be included with this package. The terms are also available at
|
||||||
http://www.hardcoded.net/licenses/hs_license
|
http://www.hardcoded.net/licenses/hs_license
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#import "dgbase/Consts.h"
|
#import "../base/Consts.h"
|
||||||
|
|
||||||
#define APPNAME @"dupeGuru PE"
|
|
||||||
#define ImageLoadedNotification @"ImageLoadedNotification"
|
#define ImageLoadedNotification @"ImageLoadedNotification"
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
Copyright 2009 Hardcoded Software (http://www.hardcoded.net)
|
Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
|
||||||
|
|
||||||
This software is licensed under the "HS" License as described in the "LICENSE" file,
|
This software is licensed under the "HS" License as described in the "LICENSE" file,
|
||||||
which should be included with this package. The terms are also available at
|
which should be included with this package. The terms are also available at
|
||||||
@@ -7,16 +7,16 @@ http://www.hardcoded.net/licenses/hs_license
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#import <Cocoa/Cocoa.h>
|
#import <Cocoa/Cocoa.h>
|
||||||
#import "dgbase/DetailsPanel.h"
|
#import "../base/DetailsPanel.h"
|
||||||
|
|
||||||
@interface DetailsPanel : DetailsPanelBase
|
@interface DetailsPanelPE : DetailsPanel
|
||||||
{
|
{
|
||||||
IBOutlet NSImageView *dupeImage;
|
IBOutlet NSImageView *dupeImage;
|
||||||
IBOutlet NSProgressIndicator *dupeProgressIndicator;
|
IBOutlet NSProgressIndicator *dupeProgressIndicator;
|
||||||
IBOutlet NSImageView *refImage;
|
IBOutlet NSImageView *refImage;
|
||||||
IBOutlet NSProgressIndicator *refProgressIndicator;
|
IBOutlet NSProgressIndicator *refProgressIndicator;
|
||||||
|
|
||||||
PyApp *py;
|
PyApp *pyApp;
|
||||||
BOOL _needsRefresh;
|
BOOL _needsRefresh;
|
||||||
NSString *_dupePath;
|
NSString *_dupePath;
|
||||||
NSString *_refPath;
|
NSString *_refPath;
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
Copyright 2009 Hardcoded Software (http://www.hardcoded.net)
|
Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
|
||||||
|
|
||||||
This software is licensed under the "HS" License as described in the "LICENSE" file,
|
This software is licensed under the "HS" License as described in the "LICENSE" file,
|
||||||
which should be included with this package. The terms are also available at
|
which should be included with this package. The terms are also available at
|
||||||
@@ -13,11 +13,11 @@ http://www.hardcoded.net/licenses/hs_license
|
|||||||
#import "DetailsPanel.h"
|
#import "DetailsPanel.h"
|
||||||
#import "Consts.h"
|
#import "Consts.h"
|
||||||
|
|
||||||
@implementation DetailsPanel
|
@implementation DetailsPanelPE
|
||||||
- (id)initWithPy:(PyApp *)aPy
|
- (id)initWithPy:(PyApp *)aPy
|
||||||
{
|
{
|
||||||
self = [super initWithPy:aPy];
|
self = [super initWithPy:aPy];
|
||||||
py = aPy;
|
pyApp = aPy;
|
||||||
_needsRefresh = YES;
|
_needsRefresh = YES;
|
||||||
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(imageLoaded:) name:ImageLoadedNotification object:self];
|
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(imageLoaded:) name:ImageLoadedNotification object:self];
|
||||||
return self;
|
return self;
|
||||||
@@ -36,18 +36,18 @@ http://www.hardcoded.net/licenses/hs_license
|
|||||||
[pool release];
|
[pool release];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)refresh
|
- (void)refreshDetails
|
||||||
{
|
{
|
||||||
if (!_needsRefresh)
|
if (!_needsRefresh)
|
||||||
return;
|
return;
|
||||||
[detailsTable reloadData];
|
[detailsTable reloadData];
|
||||||
|
|
||||||
NSString *refPath = [(PyDupeGuru *)py getSelectedDupeRefPath];
|
NSString *refPath = [(PyDupeGuru *)pyApp getSelectedDupeRefPath];
|
||||||
if (_refPath != nil)
|
if (_refPath != nil)
|
||||||
[_refPath autorelease];
|
[_refPath autorelease];
|
||||||
_refPath = [refPath retain];
|
_refPath = [refPath retain];
|
||||||
[NSThread detachNewThreadSelector:@selector(loadImageAsync:) toTarget:self withObject:refPath];
|
[NSThread detachNewThreadSelector:@selector(loadImageAsync:) toTarget:self withObject:refPath];
|
||||||
NSString *dupePath = [(PyDupeGuru *)py getSelectedDupePath];
|
NSString *dupePath = [(PyDupeGuru *)pyApp getSelectedDupePath];
|
||||||
if (_dupePath != nil)
|
if (_dupePath != nil)
|
||||||
[_dupePath autorelease];
|
[_dupePath autorelease];
|
||||||
_dupePath = [dupePath retain];
|
_dupePath = [dupePath retain];
|
||||||
@@ -59,12 +59,6 @@ http://www.hardcoded.net/licenses/hs_license
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Notifications */
|
/* Notifications */
|
||||||
- (void)duplicateSelectionChanged:(NSNotification *)aNotification
|
|
||||||
{
|
|
||||||
_needsRefresh = YES;
|
|
||||||
[super duplicateSelectionChanged:aNotification];
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void)imageLoaded:(NSNotification *)aNotification
|
- (void)imageLoaded:(NSNotification *)aNotification
|
||||||
{
|
{
|
||||||
NSString *imagePath = [[aNotification userInfo] valueForKey:@"imagePath"];
|
NSString *imagePath = [[aNotification userInfo] valueForKey:@"imagePath"];
|
||||||
@@ -80,4 +74,11 @@ http://www.hardcoded.net/licenses/hs_license
|
|||||||
[dupeProgressIndicator stopAnimation:nil];
|
[dupeProgressIndicator stopAnimation:nil];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Python --> Cocoa */
|
||||||
|
- (void)refresh
|
||||||
|
{
|
||||||
|
_needsRefresh = YES;
|
||||||
|
[super refresh];
|
||||||
|
}
|
||||||
@end
|
@end
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
Copyright 2009 Hardcoded Software (http://www.hardcoded.net)
|
Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
|
||||||
|
|
||||||
This software is licensed under the "HS" License as described in the "LICENSE" file,
|
This software is licensed under the "HS" License as described in the "LICENSE" file,
|
||||||
which should be included with this package. The terms are also available at
|
which should be included with this package. The terms are also available at
|
||||||
@@ -7,9 +7,9 @@ http://www.hardcoded.net/licenses/hs_license
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#import <Cocoa/Cocoa.h>
|
#import <Cocoa/Cocoa.h>
|
||||||
#import "dgbase/DirectoryPanel.h"
|
#import "../base/DirectoryPanel.h"
|
||||||
|
|
||||||
@interface DirectoryPanel : DirectoryPanelBase
|
@interface DirectoryPanelPE : DirectoryPanel
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
- (IBAction)addiPhoto:(id)sender;
|
- (IBAction)addiPhoto:(id)sender;
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
Copyright 2009 Hardcoded Software (http://www.hardcoded.net)
|
Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
|
||||||
|
|
||||||
This software is licensed under the "HS" License as described in the "LICENSE" file,
|
This software is licensed under the "HS" License as described in the "LICENSE" file,
|
||||||
which should be included with this package. The terms are also available at
|
which should be included with this package. The terms are also available at
|
||||||
@@ -11,7 +11,7 @@ http://www.hardcoded.net/licenses/hs_license
|
|||||||
|
|
||||||
static NSString* jobAddIPhoto = @"jobAddIPhoto";
|
static NSString* jobAddIPhoto = @"jobAddIPhoto";
|
||||||
|
|
||||||
@implementation DirectoryPanel
|
@implementation DirectoryPanelPE
|
||||||
- (id)initWithParentApp:(id)aParentApp
|
- (id)initWithParentApp:(id)aParentApp
|
||||||
{
|
{
|
||||||
self = [super initWithParentApp:aParentApp];
|
self = [super initWithParentApp:aParentApp];
|
||||||
@@ -23,11 +23,13 @@
|
|||||||
<key>CFBundleSignature</key>
|
<key>CFBundleSignature</key>
|
||||||
<string>hsft</string>
|
<string>hsft</string>
|
||||||
<key>CFBundleVersion</key>
|
<key>CFBundleVersion</key>
|
||||||
<string>1.7.7</string>
|
<string>1.8.2</string>
|
||||||
<key>NSMainNibFile</key>
|
<key>NSMainNibFile</key>
|
||||||
<string>MainMenu</string>
|
<string>MainMenu</string>
|
||||||
<key>NSPrincipalClass</key>
|
<key>NSPrincipalClass</key>
|
||||||
<string>NSApplication</string>
|
<string>NSApplication</string>
|
||||||
|
<key>NSHumanReadableCopyright</key>
|
||||||
|
<string>© Hardcoded Software, 2010</string>
|
||||||
<key>SUFeedURL</key>
|
<key>SUFeedURL</key>
|
||||||
<string>http://www.hardcoded.net/updates/dupeguru_pe.appcast</string>
|
<string>http://www.hardcoded.net/updates/dupeguru_pe.appcast</string>
|
||||||
<key>SUPublicDSAKeyFile</key>
|
<key>SUPublicDSAKeyFile</key>
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
Copyright 2009 Hardcoded Software (http://www.hardcoded.net)
|
Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
|
||||||
|
|
||||||
This software is licensed under the "HS" License as described in the "LICENSE" file,
|
This software is licensed under the "HS" License as described in the "LICENSE" file,
|
||||||
which should be included with this package. The terms are also available at
|
which should be included with this package. The terms are also available at
|
||||||
@@ -7,7 +7,7 @@ http://www.hardcoded.net/licenses/hs_license
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#import <Cocoa/Cocoa.h>
|
#import <Cocoa/Cocoa.h>
|
||||||
#import "dgbase/PyDupeGuru.h"
|
#import "../base/PyDupeGuru.h"
|
||||||
|
|
||||||
@interface PyDupeGuru : PyDupeGuruBase
|
@interface PyDupeGuru : PyDupeGuruBase
|
||||||
- (void)clearPictureCache;
|
- (void)clearPictureCache;
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
Copyright 2009 Hardcoded Software (http://www.hardcoded.net)
|
Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
|
||||||
|
|
||||||
This software is licensed under the "HS" License as described in the "LICENSE" file,
|
This software is licensed under the "HS" License as described in the "LICENSE" file,
|
||||||
which should be included with this package. The terms are also available at
|
which should be included with this package. The terms are also available at
|
||||||
@@ -8,17 +8,12 @@ http://www.hardcoded.net/licenses/hs_license
|
|||||||
|
|
||||||
#import <Cocoa/Cocoa.h>
|
#import <Cocoa/Cocoa.h>
|
||||||
#import "Outline.h"
|
#import "Outline.h"
|
||||||
#import "dgbase/ResultWindow.h"
|
#import "../base/ResultWindow.h"
|
||||||
#import "DirectoryPanel.h"
|
|
||||||
|
|
||||||
@interface ResultWindow : ResultWindowBase
|
@interface ResultWindow : ResultWindowBase
|
||||||
{
|
{
|
||||||
IBOutlet NSPopUpButton *actionMenu;
|
|
||||||
IBOutlet NSMenu *columnsMenu;
|
|
||||||
IBOutlet NSSearchField *filterField;
|
IBOutlet NSSearchField *filterField;
|
||||||
IBOutlet NSWindow *preferencesPanel;
|
|
||||||
|
|
||||||
NSMutableArray *_resultColumns;
|
|
||||||
NSMutableIndexSet *_deltaColumns;
|
NSMutableIndexSet *_deltaColumns;
|
||||||
}
|
}
|
||||||
- (IBAction)clearIgnoreList:(id)sender;
|
- (IBAction)clearIgnoreList:(id)sender;
|
||||||
@@ -35,16 +30,8 @@ http://www.hardcoded.net/licenses/hs_license
|
|||||||
- (IBAction)removeMarked:(id)sender;
|
- (IBAction)removeMarked:(id)sender;
|
||||||
- (IBAction)removeSelected:(id)sender;
|
- (IBAction)removeSelected:(id)sender;
|
||||||
- (IBAction)renameSelected:(id)sender;
|
- (IBAction)renameSelected:(id)sender;
|
||||||
- (IBAction)resetColumnsToDefault:(id)sender;
|
|
||||||
- (IBAction)revealSelected:(id)sender;
|
- (IBAction)revealSelected:(id)sender;
|
||||||
- (IBAction)showPreferencesPanel:(id)sender;
|
|
||||||
- (IBAction)startDuplicateScan:(id)sender;
|
- (IBAction)startDuplicateScan:(id)sender;
|
||||||
- (IBAction)toggleColumn:(id)sender;
|
|
||||||
- (IBAction)toggleDelta:(id)sender;
|
- (IBAction)toggleDelta:(id)sender;
|
||||||
- (IBAction)toggleDetailsPanel:(id)sender;
|
|
||||||
- (IBAction)toggleDirectories:(id)sender;
|
- (IBAction)toggleDirectories:(id)sender;
|
||||||
|
|
||||||
- (NSTableColumn *)getColumnForIdentifier:(int)aIdentifier title:(NSString *)aTitle width:(int)aWidth refCol:(NSTableColumn *)aColumn;
|
|
||||||
- (void)initResultColumns;
|
|
||||||
- (void)restoreColumnsPosition:(NSArray *)aColumnsOrder widths:(NSDictionary *)aColumnsWidth;
|
|
||||||
@end
|
@end
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
Copyright 2009 Hardcoded Software (http://www.hardcoded.net)
|
Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
|
||||||
|
|
||||||
This software is licensed under the "HS" License as described in the "LICENSE" file,
|
This software is licensed under the "HS" License as described in the "LICENSE" file,
|
||||||
which should be included with this package. The terms are also available at
|
which should be included with this package. The terms are also available at
|
||||||
@@ -19,6 +19,7 @@ http://www.hardcoded.net/licenses/hs_license
|
|||||||
- (void)awakeFromNib
|
- (void)awakeFromNib
|
||||||
{
|
{
|
||||||
[super awakeFromNib];
|
[super awakeFromNib];
|
||||||
|
[[self window] setTitle:@"dupeGuru Picture Edition"];
|
||||||
_displayDelta = NO;
|
_displayDelta = NO;
|
||||||
_powerMode = NO;
|
_powerMode = NO;
|
||||||
_deltaColumns = [[NSMutableIndexSet indexSetWithIndexesInRange:NSMakeRange(2,5)] retain];
|
_deltaColumns = [[NSMutableIndexSet indexSetWithIndexesInRange:NSMakeRange(2,5)] retain];
|
||||||
@@ -29,23 +30,8 @@ http://www.hardcoded.net/licenses/hs_license
|
|||||||
[py setDisplayDeltaValues:b2n(_displayDelta)];
|
[py setDisplayDeltaValues:b2n(_displayDelta)];
|
||||||
[matches setTarget:self];
|
[matches setTarget:self];
|
||||||
[matches setDoubleAction:@selector(openSelected:)];
|
[matches setDoubleAction:@selector(openSelected:)];
|
||||||
[[actionMenu itemAtIndex:0] setImage:[NSImage imageNamed: @"gear"]];
|
|
||||||
[self initResultColumns];
|
|
||||||
[self refreshStats];
|
[self refreshStats];
|
||||||
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(resultsMarkingChanged:) name:ResultsMarkingChangedNotification object:nil];
|
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(resultsMarkingChanged:) name:ResultsMarkingChangedNotification object:nil];
|
||||||
|
|
||||||
NSToolbar *t = [[[NSToolbar alloc] initWithIdentifier:@"ResultWindowToolbar"] autorelease];
|
|
||||||
[t setAllowsUserCustomization:YES];
|
|
||||||
[t setAutosavesConfiguration:YES];
|
|
||||||
[t setDisplayMode:NSToolbarDisplayModeIconAndLabel];
|
|
||||||
[t setDelegate:self];
|
|
||||||
[[self window] setToolbar:t];
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Overrides */
|
|
||||||
- (NSString *)logoImageName
|
|
||||||
{
|
|
||||||
return @"dgpe_logo_32";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Actions */
|
/* Actions */
|
||||||
@@ -170,7 +156,7 @@ http://www.hardcoded.net/licenses/hs_license
|
|||||||
[columnsOrder addObject:@"4"];
|
[columnsOrder addObject:@"4"];
|
||||||
[columnsOrder addObject:@"7"];
|
[columnsOrder addObject:@"7"];
|
||||||
NSMutableDictionary *columnsWidth = [NSMutableDictionary dictionary];
|
NSMutableDictionary *columnsWidth = [NSMutableDictionary dictionary];
|
||||||
[columnsWidth setObject:i2n(125) forKey:@"0"];
|
[columnsWidth setObject:i2n(121) forKey:@"0"];
|
||||||
[columnsWidth setObject:i2n(120) forKey:@"1"];
|
[columnsWidth setObject:i2n(120) forKey:@"1"];
|
||||||
[columnsWidth setObject:i2n(63) forKey:@"2"];
|
[columnsWidth setObject:i2n(63) forKey:@"2"];
|
||||||
[columnsWidth setObject:i2n(73) forKey:@"4"];
|
[columnsWidth setObject:i2n(73) forKey:@"4"];
|
||||||
@@ -184,11 +170,6 @@ http://www.hardcoded.net/licenses/hs_license
|
|||||||
[py revealSelected];
|
[py revealSelected];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (IBAction)showPreferencesPanel:(id)sender
|
|
||||||
{
|
|
||||||
[preferencesPanel makeKeyAndOrderFront:sender];
|
|
||||||
}
|
|
||||||
|
|
||||||
- (IBAction)startDuplicateScan:(id)sender
|
- (IBAction)startDuplicateScan:(id)sender
|
||||||
{
|
{
|
||||||
if ([matches numberOfRows] > 0)
|
if ([matches numberOfRows] > 0)
|
||||||
@@ -215,26 +196,6 @@ http://www.hardcoded.net/licenses/hs_license
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
- (IBAction)toggleColumn:(id)sender
|
|
||||||
{
|
|
||||||
NSMenuItem *mi = sender;
|
|
||||||
NSString *colId = [NSString stringWithFormat:@"%d",[mi tag]];
|
|
||||||
NSTableColumn *col = [matches tableColumnWithIdentifier:colId];
|
|
||||||
if (col == nil)
|
|
||||||
{
|
|
||||||
//Add Column
|
|
||||||
col = [_resultColumns objectAtIndex:[mi tag]];
|
|
||||||
[matches addTableColumn:col];
|
|
||||||
[mi setState:NSOnState];
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
//Remove column
|
|
||||||
[matches removeTableColumn:col];
|
|
||||||
[mi setState:NSOffState];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
- (IBAction)toggleDelta:(id)sender
|
- (IBAction)toggleDelta:(id)sender
|
||||||
{
|
{
|
||||||
if ([deltaSwitch selectedSegment] == 1)
|
if ([deltaSwitch selectedSegment] == 1)
|
||||||
@@ -244,75 +205,29 @@ http://www.hardcoded.net/licenses/hs_license
|
|||||||
[self changeDelta:sender];
|
[self changeDelta:sender];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
- (IBAction)toggleDetailsPanel:(id)sender
|
|
||||||
{
|
|
||||||
[(AppDelegate *)app toggleDetailsPanel:sender];
|
|
||||||
}
|
|
||||||
|
|
||||||
- (IBAction)toggleDirectories:(id)sender
|
- (IBAction)toggleDirectories:(id)sender
|
||||||
{
|
{
|
||||||
[(AppDelegate *)app toggleDirectories:sender];
|
[(AppDelegate *)app toggleDirectories:sender];
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Public */
|
/* Public */
|
||||||
- (NSTableColumn *)getColumnForIdentifier:(int)aIdentifier title:(NSString *)aTitle width:(int)aWidth refCol:(NSTableColumn *)aColumn
|
|
||||||
{
|
|
||||||
NSNumber *n = [NSNumber numberWithInt:aIdentifier];
|
|
||||||
NSTableColumn *col = [[NSTableColumn alloc] initWithIdentifier:[n stringValue]];
|
|
||||||
[col setWidth:aWidth];
|
|
||||||
[col setEditable:NO];
|
|
||||||
[[col dataCell] setFont:[[aColumn dataCell] font]];
|
|
||||||
[[col headerCell] setStringValue:aTitle];
|
|
||||||
[col setResizingMask:NSTableColumnUserResizingMask];
|
|
||||||
[col setSortDescriptorPrototype:[[NSSortDescriptor alloc] initWithKey:[n stringValue] ascending:YES]];
|
|
||||||
return col;
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void)initResultColumns
|
- (void)initResultColumns
|
||||||
{
|
{
|
||||||
NSTableColumn *refCol = [matches tableColumnWithIdentifier:@"0"];
|
NSTableColumn *refCol = [matches tableColumnWithIdentifier:@"0"];
|
||||||
_resultColumns = [[NSMutableArray alloc] init];
|
_resultColumns = [[NSMutableArray alloc] init];
|
||||||
[_resultColumns addObject:[matches tableColumnWithIdentifier:@"0"]]; // File Name
|
[_resultColumns addObject:[matches tableColumnWithIdentifier:@"0"]]; // File Name
|
||||||
[_resultColumns addObject:[matches tableColumnWithIdentifier:@"1"]]; // Directory
|
[_resultColumns addObject:[self getColumnForIdentifier:1 title:@"Directory" width:120 refCol:refCol]];
|
||||||
[_resultColumns addObject:[matches tableColumnWithIdentifier:@"2"]]; // Size
|
NSTableColumn *sizeCol = [self getColumnForIdentifier:2 title:@"Size (KB)" width:63 refCol:refCol];
|
||||||
|
[[sizeCol dataCell] setAlignment:NSRightTextAlignment];
|
||||||
|
[_resultColumns addObject:sizeCol];
|
||||||
[_resultColumns addObject:[self getColumnForIdentifier:3 title:@"Kind" width:40 refCol:refCol]];
|
[_resultColumns addObject:[self getColumnForIdentifier:3 title:@"Kind" width:40 refCol:refCol]];
|
||||||
[_resultColumns addObject:[self getColumnForIdentifier:4 title:@"Dimensions" width:80 refCol:refCol]];
|
[_resultColumns addObject:[self getColumnForIdentifier:4 title:@"Dimensions" width:80 refCol:refCol]];
|
||||||
[_resultColumns addObject:[self getColumnForIdentifier:5 title:@"Creation" width:120 refCol:refCol]];
|
[_resultColumns addObject:[self getColumnForIdentifier:5 title:@"Creation" width:120 refCol:refCol]];
|
||||||
[_resultColumns addObject:[self getColumnForIdentifier:6 title:@"Modification" width:120 refCol:refCol]];
|
[_resultColumns addObject:[self getColumnForIdentifier:6 title:@"Modification" width:120 refCol:refCol]];
|
||||||
[_resultColumns addObject:[matches tableColumnWithIdentifier:@"7"]]; // Match %
|
[_resultColumns addObject:[self getColumnForIdentifier:7 title:@"Match %" width:58 refCol:refCol]];
|
||||||
[_resultColumns addObject:[self getColumnForIdentifier:8 title:@"Dupe Count" width:80 refCol:refCol]];
|
[_resultColumns addObject:[self getColumnForIdentifier:8 title:@"Dupe Count" width:80 refCol:refCol]];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)restoreColumnsPosition:(NSArray *)aColumnsOrder widths:(NSDictionary *)aColumnsWidth
|
|
||||||
{
|
|
||||||
NSTableColumn *col;
|
|
||||||
NSString *colId;
|
|
||||||
NSNumber *width;
|
|
||||||
NSMenuItem *mi;
|
|
||||||
//Remove all columns
|
|
||||||
NSEnumerator *e = [[columnsMenu itemArray] objectEnumerator];
|
|
||||||
while (mi = [e nextObject])
|
|
||||||
{
|
|
||||||
if ([mi state] == NSOnState)
|
|
||||||
[self toggleColumn:mi];
|
|
||||||
}
|
|
||||||
//Add columns and set widths
|
|
||||||
e = [aColumnsOrder objectEnumerator];
|
|
||||||
while (colId = [e nextObject])
|
|
||||||
{
|
|
||||||
if (![colId isEqual:@"mark"])
|
|
||||||
{
|
|
||||||
col = [_resultColumns objectAtIndex:[colId intValue]];
|
|
||||||
width = [aColumnsWidth objectForKey:[col identifier]];
|
|
||||||
mi = [columnsMenu itemWithTag:[colId intValue]];
|
|
||||||
if (width)
|
|
||||||
[col setWidth:[width floatValue]];
|
|
||||||
[self toggleColumn:mi];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Delegate */
|
/* Delegate */
|
||||||
- (void)outlineView:(NSOutlineView *)outlineView willDisplayCell:(id)cell forTableColumn:(NSTableColumn *)tableColumn item:(id)item
|
- (void)outlineView:(NSOutlineView *)outlineView willDisplayCell:(id)cell forTableColumn:(NSTableColumn *)tableColumn item:(id)item
|
||||||
{
|
{
|
||||||
@@ -337,18 +252,4 @@ http://www.hardcoded.net/licenses/hs_license
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)outlineViewSelectionDidChange:(NSNotification *)notification
|
|
||||||
{
|
|
||||||
[self performPySelection:[self getSelectedPaths:NO]];
|
|
||||||
[py refreshDetailsWithSelected];
|
|
||||||
[[NSNotificationCenter defaultCenter] postNotificationName:DuplicateSelectionChangedNotification object:self];
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void)resultsMarkingChanged:(NSNotification *)aNotification
|
|
||||||
{
|
|
||||||
[matches invalidateMarkings];
|
|
||||||
[self refreshStats];
|
|
||||||
}
|
|
||||||
|
|
||||||
@end
|
@end
|
||||||
39
cocoa/pe/dg_cocoa.py
Normal file
39
cocoa/pe/dg_cocoa.py
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
# Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
|
||||||
|
#
|
||||||
|
# This software is licensed under the "HS" License as described in the "LICENSE" file,
|
||||||
|
# which should be included with this package. The terms are also available at
|
||||||
|
# http://www.hardcoded.net/licenses/hs_license
|
||||||
|
|
||||||
|
from core.app_cocoa_inter import PyDupeGuruBase, PyDetailsPanel
|
||||||
|
from core_pe import app_cocoa as app_pe_cocoa
|
||||||
|
|
||||||
|
# Fix py2app imports which chokes on relative imports
|
||||||
|
from core_pe import block, cache, matchbase, data, _block_osx
|
||||||
|
|
||||||
|
class PyDupeGuru(PyDupeGuruBase):
|
||||||
|
def init(self):
|
||||||
|
self = super(PyDupeGuru, self).init()
|
||||||
|
self.app = app_pe_cocoa.DupeGuruPE()
|
||||||
|
return self
|
||||||
|
|
||||||
|
def clearPictureCache(self):
|
||||||
|
self.app.scanner.clear_picture_cache()
|
||||||
|
|
||||||
|
#---Information
|
||||||
|
def getSelectedDupePath(self):
|
||||||
|
return unicode(self.app.selected_dupe_path())
|
||||||
|
|
||||||
|
def getSelectedDupeRefPath(self):
|
||||||
|
return unicode(self.app.selected_dupe_ref_path())
|
||||||
|
|
||||||
|
#---Properties
|
||||||
|
def setMatchScaled_(self,match_scaled):
|
||||||
|
self.app.scanner.match_scaled = match_scaled
|
||||||
|
|
||||||
|
def setMinMatchPercentage_(self,percentage):
|
||||||
|
self.app.scanner.threshold = int(percentage)
|
||||||
|
|
||||||
|
#---Registration
|
||||||
|
def appName(self):
|
||||||
|
return "dupeGuru Picture Edition"
|
||||||
|
|
||||||
@@ -3,50 +3,46 @@
|
|||||||
archiveVersion = 1;
|
archiveVersion = 1;
|
||||||
classes = {
|
classes = {
|
||||||
};
|
};
|
||||||
objectVersion = 42;
|
objectVersion = 44;
|
||||||
objects = {
|
objects = {
|
||||||
|
|
||||||
/* Begin PBXBuildFile section */
|
/* Begin PBXBuildFile section */
|
||||||
8D11072A0486CEB800E47090 /* MainMenu.nib in Resources */ = {isa = PBXBuildFile; fileRef = 29B97318FDCFA39411CA2CEA /* MainMenu.nib */; };
|
|
||||||
8D11072B0486CEB800E47090 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */; };
|
|
||||||
8D11072D0486CEB800E47090 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B97316FDCFA39411CA2CEA /* main.m */; settings = {ATTRIBUTES = (); }; };
|
8D11072D0486CEB800E47090 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B97316FDCFA39411CA2CEA /* main.m */; settings = {ATTRIBUTES = (); }; };
|
||||||
8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
|
8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
|
||||||
|
CE031751109B340A00517EE6 /* Preferences.xib in Resources */ = {isa = PBXBuildFile; fileRef = CE031750109B340A00517EE6 /* Preferences.xib */; };
|
||||||
|
CE031754109B345200517EE6 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = CE031753109B345200517EE6 /* MainMenu.xib */; };
|
||||||
CE073F6309CAE1A3005C1D2F /* dupeguru_pe_help in Resources */ = {isa = PBXBuildFile; fileRef = CE073F5409CAE1A3005C1D2F /* dupeguru_pe_help */; };
|
CE073F6309CAE1A3005C1D2F /* dupeguru_pe_help in Resources */ = {isa = PBXBuildFile; fileRef = CE073F5409CAE1A3005C1D2F /* dupeguru_pe_help */; };
|
||||||
CE0C46AA0FA0647E000BE99B /* PictureBlocks.m in Sources */ = {isa = PBXBuildFile; fileRef = CE0C46A90FA0647E000BE99B /* PictureBlocks.m */; };
|
|
||||||
CE15C8A80ADEB8B50061D4A5 /* Sparkle.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CE15C8A70ADEB8B50061D4A5 /* Sparkle.framework */; };
|
CE15C8A80ADEB8B50061D4A5 /* Sparkle.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CE15C8A70ADEB8B50061D4A5 /* Sparkle.framework */; };
|
||||||
CE15C8C00ADEB8D40061D4A5 /* Sparkle.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = CE15C8A70ADEB8B50061D4A5 /* Sparkle.framework */; };
|
CE15C8C00ADEB8D40061D4A5 /* Sparkle.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = CE15C8A70ADEB8B50061D4A5 /* Sparkle.framework */; };
|
||||||
CE381C9609914ACE003581CE /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = CE381C9409914ACE003581CE /* AppDelegate.m */; };
|
CE381C9609914ACE003581CE /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = CE381C9409914ACE003581CE /* AppDelegate.m */; };
|
||||||
CE381C9C09914ADF003581CE /* ResultWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = CE381C9A09914ADF003581CE /* ResultWindow.m */; };
|
CE381C9C09914ADF003581CE /* ResultWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = CE381C9A09914ADF003581CE /* ResultWindow.m */; };
|
||||||
CE381D0509915304003581CE /* dg_cocoa.plugin in Resources */ = {isa = PBXBuildFile; fileRef = CE381CF509915304003581CE /* dg_cocoa.plugin */; };
|
CE381D0509915304003581CE /* dg_cocoa.plugin in Resources */ = {isa = PBXBuildFile; fileRef = CE381CF509915304003581CE /* dg_cocoa.plugin */; };
|
||||||
CE3AA46709DB207900DB3A21 /* Directories.nib in Resources */ = {isa = PBXBuildFile; fileRef = CE3AA46509DB207900DB3A21 /* Directories.nib */; };
|
|
||||||
CE6044EC0FE6796200B71262 /* DetailsPanel.m in Sources */ = {isa = PBXBuildFile; fileRef = CE6044EB0FE6796200B71262 /* DetailsPanel.m */; };
|
CE6044EC0FE6796200B71262 /* DetailsPanel.m in Sources */ = {isa = PBXBuildFile; fileRef = CE6044EB0FE6796200B71262 /* DetailsPanel.m */; };
|
||||||
CE68EE6809ABC48000971085 /* DirectoryPanel.m in Sources */ = {isa = PBXBuildFile; fileRef = CE68EE6609ABC48000971085 /* DirectoryPanel.m */; };
|
CE68EE6809ABC48000971085 /* DirectoryPanel.m in Sources */ = {isa = PBXBuildFile; fileRef = CE68EE6609ABC48000971085 /* DirectoryPanel.m */; };
|
||||||
CE6E0F3D1054EC62008D9390 /* dsa_pub.pem in Resources */ = {isa = PBXBuildFile; fileRef = CE6E0F3C1054EC62008D9390 /* dsa_pub.pem */; };
|
CE6E0F3D1054EC62008D9390 /* dsa_pub.pem in Resources */ = {isa = PBXBuildFile; fileRef = CE6E0F3C1054EC62008D9390 /* dsa_pub.pem */; };
|
||||||
|
CE77C89E10946C6D0078B0DB /* DirectoryPanel.xib in Resources */ = {isa = PBXBuildFile; fileRef = CE77C89C10946C6D0078B0DB /* DirectoryPanel.xib */; };
|
||||||
|
CE77C8A810946CE20078B0DB /* DetailsPanel.xib in Resources */ = {isa = PBXBuildFile; fileRef = CE77C8A710946CE20078B0DB /* DetailsPanel.xib */; };
|
||||||
|
CE7AC9181119911200D02F6C /* ErrorReportWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = CE7AC9151119911200D02F6C /* ErrorReportWindow.xib */; };
|
||||||
|
CE7AC9191119911200D02F6C /* progress.xib in Resources */ = {isa = PBXBuildFile; fileRef = CE7AC9161119911200D02F6C /* progress.xib */; };
|
||||||
|
CE7AC91A1119911200D02F6C /* registration.xib in Resources */ = {isa = PBXBuildFile; fileRef = CE7AC9171119911200D02F6C /* registration.xib */; };
|
||||||
CE80DB2E0FC192D60086DCA6 /* Dialogs.m in Sources */ = {isa = PBXBuildFile; fileRef = CE80DB1C0FC192D60086DCA6 /* Dialogs.m */; };
|
CE80DB2E0FC192D60086DCA6 /* Dialogs.m in Sources */ = {isa = PBXBuildFile; fileRef = CE80DB1C0FC192D60086DCA6 /* Dialogs.m */; };
|
||||||
CE80DB2F0FC192D60086DCA6 /* HSErrorReportWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = CE80DB1E0FC192D60086DCA6 /* HSErrorReportWindow.m */; };
|
CE80DB2F0FC192D60086DCA6 /* HSErrorReportWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = CE80DB1E0FC192D60086DCA6 /* HSErrorReportWindow.m */; };
|
||||||
CE80DB300FC192D60086DCA6 /* Outline.m in Sources */ = {isa = PBXBuildFile; fileRef = CE80DB200FC192D60086DCA6 /* Outline.m */; };
|
CE80DB300FC192D60086DCA6 /* Outline.m in Sources */ = {isa = PBXBuildFile; fileRef = CE80DB200FC192D60086DCA6 /* Outline.m */; };
|
||||||
CE80DB310FC192D60086DCA6 /* ProgressController.m in Sources */ = {isa = PBXBuildFile; fileRef = CE80DB220FC192D60086DCA6 /* ProgressController.m */; };
|
CE80DB310FC192D60086DCA6 /* ProgressController.m in Sources */ = {isa = PBXBuildFile; fileRef = CE80DB220FC192D60086DCA6 /* ProgressController.m */; };
|
||||||
CE80DB320FC192D60086DCA6 /* RecentDirectories.m in Sources */ = {isa = PBXBuildFile; fileRef = CE80DB250FC192D60086DCA6 /* RecentDirectories.m */; };
|
CE80DB320FC192D60086DCA6 /* RecentDirectories.m in Sources */ = {isa = PBXBuildFile; fileRef = CE80DB250FC192D60086DCA6 /* RecentDirectories.m */; };
|
||||||
CE80DB330FC192D60086DCA6 /* RegistrationInterface.m in Sources */ = {isa = PBXBuildFile; fileRef = CE80DB270FC192D60086DCA6 /* RegistrationInterface.m */; };
|
CE80DB330FC192D60086DCA6 /* RegistrationInterface.m in Sources */ = {isa = PBXBuildFile; fileRef = CE80DB270FC192D60086DCA6 /* RegistrationInterface.m */; };
|
||||||
CE80DB340FC192D60086DCA6 /* Table.m in Sources */ = {isa = PBXBuildFile; fileRef = CE80DB290FC192D60086DCA6 /* Table.m */; };
|
|
||||||
CE80DB350FC192D60086DCA6 /* Utils.m in Sources */ = {isa = PBXBuildFile; fileRef = CE80DB2B0FC192D60086DCA6 /* Utils.m */; };
|
CE80DB350FC192D60086DCA6 /* Utils.m in Sources */ = {isa = PBXBuildFile; fileRef = CE80DB2B0FC192D60086DCA6 /* Utils.m */; };
|
||||||
CE80DB360FC192D60086DCA6 /* ValueTransformers.m in Sources */ = {isa = PBXBuildFile; fileRef = CE80DB2D0FC192D60086DCA6 /* ValueTransformers.m */; };
|
CE80DB360FC192D60086DCA6 /* ValueTransformers.m in Sources */ = {isa = PBXBuildFile; fileRef = CE80DB2D0FC192D60086DCA6 /* ValueTransformers.m */; };
|
||||||
CE80DB470FC193650086DCA6 /* NSNotificationAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = CE80DB460FC193650086DCA6 /* NSNotificationAdditions.m */; };
|
CE80DB470FC193650086DCA6 /* NSNotificationAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = CE80DB460FC193650086DCA6 /* NSNotificationAdditions.m */; };
|
||||||
CE80DB4A0FC193770086DCA6 /* NSImageAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = CE80DB490FC193770086DCA6 /* NSImageAdditions.m */; };
|
CE80DB4A0FC193770086DCA6 /* NSImageAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = CE80DB490FC193770086DCA6 /* NSImageAdditions.m */; };
|
||||||
CE80DB760FC194760086DCA6 /* ErrorReportWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = CE80DB700FC194760086DCA6 /* ErrorReportWindow.xib */; };
|
|
||||||
CE80DB770FC194760086DCA6 /* progress.nib in Resources */ = {isa = PBXBuildFile; fileRef = CE80DB720FC194760086DCA6 /* progress.nib */; };
|
|
||||||
CE80DB780FC194760086DCA6 /* registration.nib in Resources */ = {isa = PBXBuildFile; fileRef = CE80DB740FC194760086DCA6 /* registration.nib */; };
|
|
||||||
CE80DB8A0FC1951C0086DCA6 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = CE80DB830FC1951C0086DCA6 /* AppDelegate.m */; };
|
CE80DB8A0FC1951C0086DCA6 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = CE80DB830FC1951C0086DCA6 /* AppDelegate.m */; };
|
||||||
CE80DB8B0FC1951C0086DCA6 /* DirectoryPanel.m in Sources */ = {isa = PBXBuildFile; fileRef = CE80DB860FC1951C0086DCA6 /* DirectoryPanel.m */; };
|
CE80DB8B0FC1951C0086DCA6 /* DirectoryPanel.m in Sources */ = {isa = PBXBuildFile; fileRef = CE80DB860FC1951C0086DCA6 /* DirectoryPanel.m */; };
|
||||||
CE80DB8C0FC1951C0086DCA6 /* ResultWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = CE80DB890FC1951C0086DCA6 /* ResultWindow.m */; };
|
CE80DB8C0FC1951C0086DCA6 /* ResultWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = CE80DB890FC1951C0086DCA6 /* ResultWindow.m */; };
|
||||||
CE848A1909DD85810004CB44 /* Consts.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = CE848A1809DD85810004CB44 /* Consts.h */; };
|
CE848A1909DD85810004CB44 /* Consts.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = CE848A1809DD85810004CB44 /* Consts.h */; };
|
||||||
CEBAE4270FDA97E000B7887D /* BRSingleLineFormatter.m in Sources */ = {isa = PBXBuildFile; fileRef = CEBAE4240FDA97E000B7887D /* BRSingleLineFormatter.m */; };
|
CEBAE4270FDA97E000B7887D /* BRSingleLineFormatter.m in Sources */ = {isa = PBXBuildFile; fileRef = CEBAE4240FDA97E000B7887D /* BRSingleLineFormatter.m */; };
|
||||||
CEBAE4280FDA97E000B7887D /* NSCharacterSet_Extensions.m in Sources */ = {isa = PBXBuildFile; fileRef = CEBAE4260FDA97E000B7887D /* NSCharacterSet_Extensions.m */; };
|
|
||||||
CECA899909DB12CA00A3D774 /* Details.nib in Resources */ = {isa = PBXBuildFile; fileRef = CECA899709DB12CA00A3D774 /* Details.nib */; };
|
|
||||||
CECA899C09DB132E00A3D774 /* DetailsPanel.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = CECA899A09DB132E00A3D774 /* DetailsPanel.h */; };
|
CECA899C09DB132E00A3D774 /* DetailsPanel.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = CECA899A09DB132E00A3D774 /* DetailsPanel.h */; };
|
||||||
CECA899D09DB132E00A3D774 /* DetailsPanel.m in Sources */ = {isa = PBXBuildFile; fileRef = CECA899B09DB132E00A3D774 /* DetailsPanel.m */; };
|
CECA899D09DB132E00A3D774 /* DetailsPanel.m in Sources */ = {isa = PBXBuildFile; fileRef = CECA899B09DB132E00A3D774 /* DetailsPanel.m */; };
|
||||||
CEEB135209C837A2004D2330 /* dupeguru.icns in Resources */ = {isa = PBXBuildFile; fileRef = CEEB135109C837A2004D2330 /* dupeguru.icns */; };
|
CEEB135209C837A2004D2330 /* dupeguru.icns in Resources */ = {isa = PBXBuildFile; fileRef = CEEB135109C837A2004D2330 /* dupeguru.icns */; };
|
||||||
CEF7823809C8AA0200EF38FF /* gear.png in Resources */ = {isa = PBXBuildFile; fileRef = CEF7823709C8AA0200EF38FF /* gear.png */; };
|
|
||||||
CEFC294609C89E3D00D9F998 /* folder32.png in Resources */ = {isa = PBXBuildFile; fileRef = CEFC294509C89E3D00D9F998 /* folder32.png */; };
|
CEFC294609C89E3D00D9F998 /* folder32.png in Resources */ = {isa = PBXBuildFile; fileRef = CEFC294509C89E3D00D9F998 /* folder32.png */; };
|
||||||
CEFC295509C89FF200D9F998 /* details32.png in Resources */ = {isa = PBXBuildFile; fileRef = CEFC295309C89FF200D9F998 /* details32.png */; };
|
CEFC295509C89FF200D9F998 /* details32.png in Resources */ = {isa = PBXBuildFile; fileRef = CEFC295309C89FF200D9F998 /* details32.png */; };
|
||||||
CEFC295609C89FF200D9F998 /* preferences32.png in Resources */ = {isa = PBXBuildFile; fileRef = CEFC295409C89FF200D9F998 /* preferences32.png */; };
|
CEFC295609C89FF200D9F998 /* preferences32.png in Resources */ = {isa = PBXBuildFile; fileRef = CEFC295409C89FF200D9F998 /* preferences32.png */; };
|
||||||
@@ -69,78 +65,72 @@
|
|||||||
/* End PBXCopyFilesBuildPhase section */
|
/* End PBXCopyFilesBuildPhase section */
|
||||||
|
|
||||||
/* Begin PBXFileReference section */
|
/* Begin PBXFileReference section */
|
||||||
089C165DFE840E0CC02AAC07 /* English */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/InfoPlist.strings; sourceTree = "<group>"; };
|
|
||||||
1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = /System/Library/Frameworks/Cocoa.framework; sourceTree = "<absolute>"; };
|
1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = /System/Library/Frameworks/Cocoa.framework; sourceTree = "<absolute>"; };
|
||||||
13E42FB307B3F0F600E4EEF1 /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = /System/Library/Frameworks/CoreData.framework; sourceTree = "<absolute>"; };
|
13E42FB307B3F0F600E4EEF1 /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = /System/Library/Frameworks/CoreData.framework; sourceTree = "<absolute>"; };
|
||||||
29B97316FDCFA39411CA2CEA /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = SOURCE_ROOT; };
|
29B97316FDCFA39411CA2CEA /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = SOURCE_ROOT; };
|
||||||
29B97319FDCFA39411CA2CEA /* English */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = English; path = English.lproj/MainMenu.nib; sourceTree = "<group>"; };
|
|
||||||
29B97324FDCFA39411CA2CEA /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = /System/Library/Frameworks/AppKit.framework; sourceTree = "<absolute>"; };
|
29B97324FDCFA39411CA2CEA /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = /System/Library/Frameworks/AppKit.framework; sourceTree = "<absolute>"; };
|
||||||
29B97325FDCFA39411CA2CEA /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = /System/Library/Frameworks/Foundation.framework; sourceTree = "<absolute>"; };
|
29B97325FDCFA39411CA2CEA /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = /System/Library/Frameworks/Foundation.framework; sourceTree = "<absolute>"; };
|
||||||
8D1107310486CEB800E47090 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = SOURCE_ROOT; };
|
8D1107310486CEB800E47090 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = SOURCE_ROOT; };
|
||||||
8D1107320486CEB800E47090 /* dupeGuru PE.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "dupeGuru PE.app"; sourceTree = BUILT_PRODUCTS_DIR; };
|
8D1107320486CEB800E47090 /* dupeGuru PE.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "dupeGuru PE.app"; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
CE073F5409CAE1A3005C1D2F /* dupeguru_pe_help */ = {isa = PBXFileReference; lastKnownFileType = folder; name = dupeguru_pe_help; path = help/dupeguru_pe_help; sourceTree = SOURCE_ROOT; };
|
CE031750109B340A00517EE6 /* Preferences.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = Preferences.xib; sourceTree = "<group>"; };
|
||||||
CE0C46A80FA0647E000BE99B /* PictureBlocks.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PictureBlocks.h; sourceTree = "<group>"; };
|
CE031753109B345200517EE6 /* MainMenu.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = MainMenu.xib; path = ../../base/xib/MainMenu.xib; sourceTree = "<group>"; };
|
||||||
CE0C46A90FA0647E000BE99B /* PictureBlocks.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PictureBlocks.m; sourceTree = "<group>"; };
|
CE073F5409CAE1A3005C1D2F /* dupeguru_pe_help */ = {isa = PBXFileReference; lastKnownFileType = folder; name = dupeguru_pe_help; path = ../../help_pe/dupeguru_pe_help; sourceTree = SOURCE_ROOT; };
|
||||||
CE15C8A70ADEB8B50061D4A5 /* Sparkle.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Sparkle.framework; path = /Library/Frameworks/Sparkle.framework; sourceTree = "<absolute>"; };
|
CE15C8A70ADEB8B50061D4A5 /* Sparkle.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Sparkle.framework; path = /Library/Frameworks/Sparkle.framework; sourceTree = "<absolute>"; };
|
||||||
|
CE18126F111C9D5100E49FCE /* PyDetailsPanel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PyDetailsPanel.h; path = ../base/PyDetailsPanel.h; sourceTree = SOURCE_ROOT; };
|
||||||
CE381C9409914ACE003581CE /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = SOURCE_ROOT; };
|
CE381C9409914ACE003581CE /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = SOURCE_ROOT; };
|
||||||
CE381C9509914ACE003581CE /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = SOURCE_ROOT; };
|
CE381C9509914ACE003581CE /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = SOURCE_ROOT; };
|
||||||
CE381C9A09914ADF003581CE /* ResultWindow.m */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.objc; path = ResultWindow.m; sourceTree = SOURCE_ROOT; };
|
CE381C9A09914ADF003581CE /* ResultWindow.m */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.objc; path = ResultWindow.m; sourceTree = SOURCE_ROOT; };
|
||||||
CE381C9B09914ADF003581CE /* ResultWindow.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = ResultWindow.h; sourceTree = SOURCE_ROOT; };
|
CE381C9B09914ADF003581CE /* ResultWindow.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = ResultWindow.h; sourceTree = SOURCE_ROOT; };
|
||||||
CE381CF509915304003581CE /* dg_cocoa.plugin */ = {isa = PBXFileReference; lastKnownFileType = folder; name = dg_cocoa.plugin; path = py/dist/dg_cocoa.plugin; sourceTree = SOURCE_ROOT; };
|
CE381CF509915304003581CE /* dg_cocoa.plugin */ = {isa = PBXFileReference; lastKnownFileType = folder; path = dg_cocoa.plugin; sourceTree = SOURCE_ROOT; };
|
||||||
CE3AA46609DB207900DB3A21 /* English */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = English; path = English.lproj/Directories.nib; sourceTree = "<group>"; };
|
CE6044EA0FE6796200B71262 /* DetailsPanel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DetailsPanel.h; path = ../base/DetailsPanel.h; sourceTree = SOURCE_ROOT; };
|
||||||
CE6044EA0FE6796200B71262 /* DetailsPanel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DetailsPanel.h; path = dgbase/DetailsPanel.h; sourceTree = SOURCE_ROOT; };
|
CE6044EB0FE6796200B71262 /* DetailsPanel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = DetailsPanel.m; path = ../base/DetailsPanel.m; sourceTree = SOURCE_ROOT; };
|
||||||
CE6044EB0FE6796200B71262 /* DetailsPanel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = DetailsPanel.m; path = dgbase/DetailsPanel.m; sourceTree = SOURCE_ROOT; };
|
|
||||||
CE68EE6509ABC48000971085 /* DirectoryPanel.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = DirectoryPanel.h; sourceTree = SOURCE_ROOT; };
|
CE68EE6509ABC48000971085 /* DirectoryPanel.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = DirectoryPanel.h; sourceTree = SOURCE_ROOT; };
|
||||||
CE68EE6609ABC48000971085 /* DirectoryPanel.m */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.objc; path = DirectoryPanel.m; sourceTree = SOURCE_ROOT; };
|
CE68EE6609ABC48000971085 /* DirectoryPanel.m */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.objc; path = DirectoryPanel.m; sourceTree = SOURCE_ROOT; };
|
||||||
CE6E0F3C1054EC62008D9390 /* dsa_pub.pem */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = dsa_pub.pem; path = dgbase/dsa_pub.pem; sourceTree = "<group>"; };
|
CE6E0F3C1054EC62008D9390 /* dsa_pub.pem */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = dsa_pub.pem; path = ../base/dsa_pub.pem; sourceTree = "<group>"; };
|
||||||
CE80DB1B0FC192D60086DCA6 /* Dialogs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Dialogs.h; path = cocoalib/Dialogs.h; sourceTree = SOURCE_ROOT; };
|
CE77C89C10946C6D0078B0DB /* DirectoryPanel.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = DirectoryPanel.xib; path = ../../base/xib/DirectoryPanel.xib; sourceTree = "<group>"; };
|
||||||
CE80DB1C0FC192D60086DCA6 /* Dialogs.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Dialogs.m; path = cocoalib/Dialogs.m; sourceTree = SOURCE_ROOT; };
|
CE77C8A710946CE20078B0DB /* DetailsPanel.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = DetailsPanel.xib; sourceTree = "<group>"; };
|
||||||
CE80DB1D0FC192D60086DCA6 /* HSErrorReportWindow.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = HSErrorReportWindow.h; path = cocoalib/HSErrorReportWindow.h; sourceTree = SOURCE_ROOT; };
|
CE7AC9151119911200D02F6C /* ErrorReportWindow.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = ErrorReportWindow.xib; sourceTree = "<group>"; };
|
||||||
CE80DB1E0FC192D60086DCA6 /* HSErrorReportWindow.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = HSErrorReportWindow.m; path = cocoalib/HSErrorReportWindow.m; sourceTree = SOURCE_ROOT; };
|
CE7AC9161119911200D02F6C /* progress.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = progress.xib; sourceTree = "<group>"; };
|
||||||
CE80DB1F0FC192D60086DCA6 /* Outline.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Outline.h; path = cocoalib/Outline.h; sourceTree = SOURCE_ROOT; };
|
CE7AC9171119911200D02F6C /* registration.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = registration.xib; sourceTree = "<group>"; };
|
||||||
CE80DB200FC192D60086DCA6 /* Outline.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Outline.m; path = cocoalib/Outline.m; sourceTree = SOURCE_ROOT; };
|
CE80DB1B0FC192D60086DCA6 /* Dialogs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Dialogs.h; path = ../../cocoalib/Dialogs.h; sourceTree = SOURCE_ROOT; };
|
||||||
CE80DB210FC192D60086DCA6 /* ProgressController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ProgressController.h; path = cocoalib/ProgressController.h; sourceTree = SOURCE_ROOT; };
|
CE80DB1C0FC192D60086DCA6 /* Dialogs.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Dialogs.m; path = ../../cocoalib/Dialogs.m; sourceTree = SOURCE_ROOT; };
|
||||||
CE80DB220FC192D60086DCA6 /* ProgressController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = ProgressController.m; path = cocoalib/ProgressController.m; sourceTree = SOURCE_ROOT; };
|
CE80DB1D0FC192D60086DCA6 /* HSErrorReportWindow.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = HSErrorReportWindow.h; path = ../../cocoalib/HSErrorReportWindow.h; sourceTree = SOURCE_ROOT; };
|
||||||
CE80DB230FC192D60086DCA6 /* PyApp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PyApp.h; path = cocoalib/PyApp.h; sourceTree = SOURCE_ROOT; };
|
CE80DB1E0FC192D60086DCA6 /* HSErrorReportWindow.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = HSErrorReportWindow.m; path = ../../cocoalib/HSErrorReportWindow.m; sourceTree = SOURCE_ROOT; };
|
||||||
CE80DB240FC192D60086DCA6 /* RecentDirectories.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RecentDirectories.h; path = cocoalib/RecentDirectories.h; sourceTree = SOURCE_ROOT; };
|
CE80DB1F0FC192D60086DCA6 /* Outline.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Outline.h; path = ../../cocoalib/Outline.h; sourceTree = SOURCE_ROOT; };
|
||||||
CE80DB250FC192D60086DCA6 /* RecentDirectories.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RecentDirectories.m; path = cocoalib/RecentDirectories.m; sourceTree = SOURCE_ROOT; };
|
CE80DB200FC192D60086DCA6 /* Outline.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Outline.m; path = ../../cocoalib/Outline.m; sourceTree = SOURCE_ROOT; };
|
||||||
CE80DB260FC192D60086DCA6 /* RegistrationInterface.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RegistrationInterface.h; path = cocoalib/RegistrationInterface.h; sourceTree = SOURCE_ROOT; };
|
CE80DB210FC192D60086DCA6 /* ProgressController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ProgressController.h; path = ../../cocoalib/ProgressController.h; sourceTree = SOURCE_ROOT; };
|
||||||
CE80DB270FC192D60086DCA6 /* RegistrationInterface.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RegistrationInterface.m; path = cocoalib/RegistrationInterface.m; sourceTree = SOURCE_ROOT; };
|
CE80DB220FC192D60086DCA6 /* ProgressController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = ProgressController.m; path = ../../cocoalib/ProgressController.m; sourceTree = SOURCE_ROOT; };
|
||||||
CE80DB280FC192D60086DCA6 /* Table.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Table.h; path = cocoalib/Table.h; sourceTree = SOURCE_ROOT; };
|
CE80DB230FC192D60086DCA6 /* PyApp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PyApp.h; path = ../../cocoalib/PyApp.h; sourceTree = SOURCE_ROOT; };
|
||||||
CE80DB290FC192D60086DCA6 /* Table.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Table.m; path = cocoalib/Table.m; sourceTree = SOURCE_ROOT; };
|
CE80DB240FC192D60086DCA6 /* RecentDirectories.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RecentDirectories.h; path = ../../cocoalib/RecentDirectories.h; sourceTree = SOURCE_ROOT; };
|
||||||
CE80DB2A0FC192D60086DCA6 /* Utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Utils.h; path = cocoalib/Utils.h; sourceTree = SOURCE_ROOT; };
|
CE80DB250FC192D60086DCA6 /* RecentDirectories.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RecentDirectories.m; path = ../../cocoalib/RecentDirectories.m; sourceTree = SOURCE_ROOT; };
|
||||||
CE80DB2B0FC192D60086DCA6 /* Utils.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Utils.m; path = cocoalib/Utils.m; sourceTree = SOURCE_ROOT; };
|
CE80DB260FC192D60086DCA6 /* RegistrationInterface.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RegistrationInterface.h; path = ../../cocoalib/RegistrationInterface.h; sourceTree = SOURCE_ROOT; };
|
||||||
CE80DB2C0FC192D60086DCA6 /* ValueTransformers.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ValueTransformers.h; path = cocoalib/ValueTransformers.h; sourceTree = SOURCE_ROOT; };
|
CE80DB270FC192D60086DCA6 /* RegistrationInterface.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RegistrationInterface.m; path = ../../cocoalib/RegistrationInterface.m; sourceTree = SOURCE_ROOT; };
|
||||||
CE80DB2D0FC192D60086DCA6 /* ValueTransformers.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = ValueTransformers.m; path = cocoalib/ValueTransformers.m; sourceTree = SOURCE_ROOT; };
|
CE80DB2A0FC192D60086DCA6 /* Utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Utils.h; path = ../../cocoalib/Utils.h; sourceTree = SOURCE_ROOT; };
|
||||||
CE80DB450FC193650086DCA6 /* NSNotificationAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = NSNotificationAdditions.h; path = cocoalib/NSNotificationAdditions.h; sourceTree = SOURCE_ROOT; };
|
CE80DB2B0FC192D60086DCA6 /* Utils.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Utils.m; path = ../../cocoalib/Utils.m; sourceTree = SOURCE_ROOT; };
|
||||||
CE80DB460FC193650086DCA6 /* NSNotificationAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = NSNotificationAdditions.m; path = cocoalib/NSNotificationAdditions.m; sourceTree = SOURCE_ROOT; };
|
CE80DB2C0FC192D60086DCA6 /* ValueTransformers.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ValueTransformers.h; path = ../../cocoalib/ValueTransformers.h; sourceTree = SOURCE_ROOT; };
|
||||||
CE80DB480FC193770086DCA6 /* NSImageAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = NSImageAdditions.h; path = cocoalib/NSImageAdditions.h; sourceTree = SOURCE_ROOT; };
|
CE80DB2D0FC192D60086DCA6 /* ValueTransformers.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = ValueTransformers.m; path = ../../cocoalib/ValueTransformers.m; sourceTree = SOURCE_ROOT; };
|
||||||
CE80DB490FC193770086DCA6 /* NSImageAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = NSImageAdditions.m; path = cocoalib/NSImageAdditions.m; sourceTree = SOURCE_ROOT; };
|
CE80DB450FC193650086DCA6 /* NSNotificationAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = NSNotificationAdditions.h; path = ../../cocoalib/NSNotificationAdditions.h; sourceTree = SOURCE_ROOT; };
|
||||||
CE80DB710FC194760086DCA6 /* English */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = English; path = cocoalib/English.lproj/ErrorReportWindow.xib; sourceTree = SOURCE_ROOT; };
|
CE80DB460FC193650086DCA6 /* NSNotificationAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = NSNotificationAdditions.m; path = ../../cocoalib/NSNotificationAdditions.m; sourceTree = SOURCE_ROOT; };
|
||||||
CE80DB730FC194760086DCA6 /* English */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = English; path = cocoalib/English.lproj/progress.nib; sourceTree = SOURCE_ROOT; };
|
CE80DB480FC193770086DCA6 /* NSImageAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = NSImageAdditions.h; path = ../../cocoalib/NSImageAdditions.h; sourceTree = SOURCE_ROOT; };
|
||||||
CE80DB750FC194760086DCA6 /* English */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = English; path = cocoalib/English.lproj/registration.nib; sourceTree = SOURCE_ROOT; };
|
CE80DB490FC193770086DCA6 /* NSImageAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = NSImageAdditions.m; path = ../../cocoalib/NSImageAdditions.m; sourceTree = SOURCE_ROOT; };
|
||||||
CE80DB820FC1951C0086DCA6 /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = dgbase/AppDelegate.h; sourceTree = SOURCE_ROOT; };
|
CE80DB820FC1951C0086DCA6 /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = ../base/AppDelegate.h; sourceTree = SOURCE_ROOT; };
|
||||||
CE80DB830FC1951C0086DCA6 /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AppDelegate.m; path = dgbase/AppDelegate.m; sourceTree = SOURCE_ROOT; };
|
CE80DB830FC1951C0086DCA6 /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AppDelegate.m; path = ../base/AppDelegate.m; sourceTree = SOURCE_ROOT; };
|
||||||
CE80DB840FC1951C0086DCA6 /* Consts.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Consts.h; path = dgbase/Consts.h; sourceTree = SOURCE_ROOT; };
|
CE80DB840FC1951C0086DCA6 /* Consts.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Consts.h; path = ../base/Consts.h; sourceTree = SOURCE_ROOT; };
|
||||||
CE80DB850FC1951C0086DCA6 /* DirectoryPanel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DirectoryPanel.h; path = dgbase/DirectoryPanel.h; sourceTree = SOURCE_ROOT; };
|
CE80DB850FC1951C0086DCA6 /* DirectoryPanel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DirectoryPanel.h; path = ../base/DirectoryPanel.h; sourceTree = SOURCE_ROOT; };
|
||||||
CE80DB860FC1951C0086DCA6 /* DirectoryPanel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = DirectoryPanel.m; path = dgbase/DirectoryPanel.m; sourceTree = SOURCE_ROOT; };
|
CE80DB860FC1951C0086DCA6 /* DirectoryPanel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = DirectoryPanel.m; path = ../base/DirectoryPanel.m; sourceTree = SOURCE_ROOT; };
|
||||||
CE80DB870FC1951C0086DCA6 /* PyDupeGuru.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PyDupeGuru.h; path = dgbase/PyDupeGuru.h; sourceTree = SOURCE_ROOT; };
|
CE80DB870FC1951C0086DCA6 /* PyDupeGuru.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PyDupeGuru.h; path = ../base/PyDupeGuru.h; sourceTree = SOURCE_ROOT; };
|
||||||
CE80DB880FC1951C0086DCA6 /* ResultWindow.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ResultWindow.h; path = dgbase/ResultWindow.h; sourceTree = SOURCE_ROOT; };
|
CE80DB880FC1951C0086DCA6 /* ResultWindow.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ResultWindow.h; path = ../base/ResultWindow.h; sourceTree = SOURCE_ROOT; };
|
||||||
CE80DB890FC1951C0086DCA6 /* ResultWindow.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = ResultWindow.m; path = dgbase/ResultWindow.m; sourceTree = SOURCE_ROOT; };
|
CE80DB890FC1951C0086DCA6 /* ResultWindow.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = ResultWindow.m; path = ../base/ResultWindow.m; sourceTree = SOURCE_ROOT; };
|
||||||
CE848A1809DD85810004CB44 /* Consts.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Consts.h; sourceTree = "<group>"; };
|
CE848A1809DD85810004CB44 /* Consts.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Consts.h; sourceTree = "<group>"; };
|
||||||
CEBAE4230FDA97E000B7887D /* BRSingleLineFormatter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = BRSingleLineFormatter.h; path = cocoalib/brsinglelineformatter/BRSingleLineFormatter.h; sourceTree = SOURCE_ROOT; };
|
CEBAE4230FDA97E000B7887D /* BRSingleLineFormatter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = BRSingleLineFormatter.h; path = ../../cocoalib/brsinglelineformatter/BRSingleLineFormatter.h; sourceTree = SOURCE_ROOT; };
|
||||||
CEBAE4240FDA97E000B7887D /* BRSingleLineFormatter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = BRSingleLineFormatter.m; path = cocoalib/brsinglelineformatter/BRSingleLineFormatter.m; sourceTree = SOURCE_ROOT; };
|
CEBAE4240FDA97E000B7887D /* BRSingleLineFormatter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = BRSingleLineFormatter.m; path = ../../cocoalib/brsinglelineformatter/BRSingleLineFormatter.m; sourceTree = SOURCE_ROOT; };
|
||||||
CEBAE4250FDA97E000B7887D /* NSCharacterSet_Extensions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = NSCharacterSet_Extensions.h; path = cocoalib/brsinglelineformatter/NSCharacterSet_Extensions.h; sourceTree = SOURCE_ROOT; };
|
|
||||||
CEBAE4260FDA97E000B7887D /* NSCharacterSet_Extensions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = NSCharacterSet_Extensions.m; path = cocoalib/brsinglelineformatter/NSCharacterSet_Extensions.m; sourceTree = SOURCE_ROOT; };
|
|
||||||
CECA899809DB12CA00A3D774 /* English */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = English; path = English.lproj/Details.nib; sourceTree = "<group>"; };
|
|
||||||
CECA899A09DB132E00A3D774 /* DetailsPanel.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = DetailsPanel.h; sourceTree = "<group>"; };
|
CECA899A09DB132E00A3D774 /* DetailsPanel.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = DetailsPanel.h; sourceTree = "<group>"; };
|
||||||
CECA899B09DB132E00A3D774 /* DetailsPanel.m */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.objc; path = DetailsPanel.m; sourceTree = "<group>"; };
|
CECA899B09DB132E00A3D774 /* DetailsPanel.m */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.objc; path = DetailsPanel.m; sourceTree = "<group>"; };
|
||||||
CEEB135109C837A2004D2330 /* dupeguru.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = dupeguru.icns; sourceTree = "<group>"; };
|
CEEB135109C837A2004D2330 /* dupeguru.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = dupeguru.icns; sourceTree = "<group>"; };
|
||||||
CEF7823709C8AA0200EF38FF /* gear.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = gear.png; path = images/gear.png; sourceTree = "<group>"; };
|
CEFC294509C89E3D00D9F998 /* folder32.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = folder32.png; path = ../../images/folder32.png; sourceTree = SOURCE_ROOT; };
|
||||||
CEFC294509C89E3D00D9F998 /* folder32.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = folder32.png; path = images/folder32.png; sourceTree = SOURCE_ROOT; };
|
CEFC295309C89FF200D9F998 /* details32.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = details32.png; path = ../../images/details32.png; sourceTree = SOURCE_ROOT; };
|
||||||
CEFC295309C89FF200D9F998 /* details32.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = details32.png; path = images/details32.png; sourceTree = SOURCE_ROOT; };
|
CEFC295409C89FF200D9F998 /* preferences32.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = preferences32.png; path = ../../images/preferences32.png; sourceTree = SOURCE_ROOT; };
|
||||||
CEFC295409C89FF200D9F998 /* preferences32.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = preferences32.png; path = images/preferences32.png; sourceTree = SOURCE_ROOT; };
|
CEFCDE2C0AB0418600C33A93 /* dgpe_logo_32.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = dgpe_logo_32.png; path = ../../images/dgpe_logo_32.png; sourceTree = SOURCE_ROOT; };
|
||||||
CEFCDE2C0AB0418600C33A93 /* dgpe_logo_32.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = dgpe_logo_32.png; path = images/dgpe_logo_32.png; sourceTree = SOURCE_ROOT; };
|
|
||||||
CEFF18A009A4D387005E6321 /* PyDupeGuru.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = PyDupeGuru.h; sourceTree = SOURCE_ROOT; };
|
CEFF18A009A4D387005E6321 /* PyDupeGuru.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = PyDupeGuru.h; sourceTree = SOURCE_ROOT; };
|
||||||
/* End PBXFileReference section */
|
/* End PBXFileReference section */
|
||||||
|
|
||||||
@@ -160,8 +150,6 @@
|
|||||||
080E96DDFE201D6D7F000001 /* Classes */ = {
|
080E96DDFE201D6D7F000001 /* Classes */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
CE0C46A80FA0647E000BE99B /* PictureBlocks.h */,
|
|
||||||
CE0C46A90FA0647E000BE99B /* PictureBlocks.m */,
|
|
||||||
CE381C9509914ACE003581CE /* AppDelegate.h */,
|
CE381C9509914ACE003581CE /* AppDelegate.h */,
|
||||||
CE381C9409914ACE003581CE /* AppDelegate.m */,
|
CE381C9409914ACE003581CE /* AppDelegate.m */,
|
||||||
CE848A1809DD85810004CB44 /* Consts.h */,
|
CE848A1809DD85810004CB44 /* Consts.h */,
|
||||||
@@ -228,16 +216,13 @@
|
|||||||
29B97317FDCFA39411CA2CEA /* Resources */ = {
|
29B97317FDCFA39411CA2CEA /* Resources */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
|
CE77C89A10946C6D0078B0DB /* xib */,
|
||||||
CE073F5409CAE1A3005C1D2F /* dupeguru_pe_help */,
|
CE073F5409CAE1A3005C1D2F /* dupeguru_pe_help */,
|
||||||
CE381CF509915304003581CE /* dg_cocoa.plugin */,
|
CE381CF509915304003581CE /* dg_cocoa.plugin */,
|
||||||
CEFC294309C89E0000D9F998 /* images */,
|
CEFC294309C89E0000D9F998 /* images */,
|
||||||
CEEB135109C837A2004D2330 /* dupeguru.icns */,
|
CEEB135109C837A2004D2330 /* dupeguru.icns */,
|
||||||
8D1107310486CEB800E47090 /* Info.plist */,
|
8D1107310486CEB800E47090 /* Info.plist */,
|
||||||
089C165CFE840E0CC02AAC07 /* InfoPlist.strings */,
|
|
||||||
CE6E0F3C1054EC62008D9390 /* dsa_pub.pem */,
|
CE6E0F3C1054EC62008D9390 /* dsa_pub.pem */,
|
||||||
CECA899709DB12CA00A3D774 /* Details.nib */,
|
|
||||||
CE3AA46509DB207900DB3A21 /* Directories.nib */,
|
|
||||||
29B97318FDCFA39411CA2CEA /* MainMenu.nib */,
|
|
||||||
);
|
);
|
||||||
name = Resources;
|
name = Resources;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
@@ -251,13 +236,33 @@
|
|||||||
name = Frameworks;
|
name = Frameworks;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
};
|
};
|
||||||
|
CE77C89A10946C6D0078B0DB /* xib */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
CE031753109B345200517EE6 /* MainMenu.xib */,
|
||||||
|
CE77C8A710946CE20078B0DB /* DetailsPanel.xib */,
|
||||||
|
CE77C89C10946C6D0078B0DB /* DirectoryPanel.xib */,
|
||||||
|
CE031750109B340A00517EE6 /* Preferences.xib */,
|
||||||
|
);
|
||||||
|
path = xib;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
CE7AC9141119911200D02F6C /* xib */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
CE7AC9151119911200D02F6C /* ErrorReportWindow.xib */,
|
||||||
|
CE7AC9161119911200D02F6C /* progress.xib */,
|
||||||
|
CE7AC9171119911200D02F6C /* registration.xib */,
|
||||||
|
);
|
||||||
|
name = xib;
|
||||||
|
path = ../../cocoalib/xib;
|
||||||
|
sourceTree = SOURCE_ROOT;
|
||||||
|
};
|
||||||
CE80DB1A0FC192AB0086DCA6 /* cocoalib */ = {
|
CE80DB1A0FC192AB0086DCA6 /* cocoalib */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
|
CE7AC9141119911200D02F6C /* xib */,
|
||||||
CEBAE4220FDA97E000B7887D /* brsinglelineformatter */,
|
CEBAE4220FDA97E000B7887D /* brsinglelineformatter */,
|
||||||
CE80DB700FC194760086DCA6 /* ErrorReportWindow.xib */,
|
|
||||||
CE80DB720FC194760086DCA6 /* progress.nib */,
|
|
||||||
CE80DB740FC194760086DCA6 /* registration.nib */,
|
|
||||||
CE80DB480FC193770086DCA6 /* NSImageAdditions.h */,
|
CE80DB480FC193770086DCA6 /* NSImageAdditions.h */,
|
||||||
CE80DB490FC193770086DCA6 /* NSImageAdditions.m */,
|
CE80DB490FC193770086DCA6 /* NSImageAdditions.m */,
|
||||||
CE80DB450FC193650086DCA6 /* NSNotificationAdditions.h */,
|
CE80DB450FC193650086DCA6 /* NSNotificationAdditions.h */,
|
||||||
@@ -275,8 +280,6 @@
|
|||||||
CE80DB250FC192D60086DCA6 /* RecentDirectories.m */,
|
CE80DB250FC192D60086DCA6 /* RecentDirectories.m */,
|
||||||
CE80DB260FC192D60086DCA6 /* RegistrationInterface.h */,
|
CE80DB260FC192D60086DCA6 /* RegistrationInterface.h */,
|
||||||
CE80DB270FC192D60086DCA6 /* RegistrationInterface.m */,
|
CE80DB270FC192D60086DCA6 /* RegistrationInterface.m */,
|
||||||
CE80DB280FC192D60086DCA6 /* Table.h */,
|
|
||||||
CE80DB290FC192D60086DCA6 /* Table.m */,
|
|
||||||
CE80DB2A0FC192D60086DCA6 /* Utils.h */,
|
CE80DB2A0FC192D60086DCA6 /* Utils.h */,
|
||||||
CE80DB2B0FC192D60086DCA6 /* Utils.m */,
|
CE80DB2B0FC192D60086DCA6 /* Utils.m */,
|
||||||
CE80DB2C0FC192D60086DCA6 /* ValueTransformers.h */,
|
CE80DB2C0FC192D60086DCA6 /* ValueTransformers.h */,
|
||||||
@@ -296,6 +299,7 @@
|
|||||||
CE80DB850FC1951C0086DCA6 /* DirectoryPanel.h */,
|
CE80DB850FC1951C0086DCA6 /* DirectoryPanel.h */,
|
||||||
CE80DB860FC1951C0086DCA6 /* DirectoryPanel.m */,
|
CE80DB860FC1951C0086DCA6 /* DirectoryPanel.m */,
|
||||||
CE80DB870FC1951C0086DCA6 /* PyDupeGuru.h */,
|
CE80DB870FC1951C0086DCA6 /* PyDupeGuru.h */,
|
||||||
|
CE18126F111C9D5100E49FCE /* PyDetailsPanel.h */,
|
||||||
CE80DB880FC1951C0086DCA6 /* ResultWindow.h */,
|
CE80DB880FC1951C0086DCA6 /* ResultWindow.h */,
|
||||||
CE80DB890FC1951C0086DCA6 /* ResultWindow.m */,
|
CE80DB890FC1951C0086DCA6 /* ResultWindow.m */,
|
||||||
);
|
);
|
||||||
@@ -307,18 +311,15 @@
|
|||||||
children = (
|
children = (
|
||||||
CEBAE4230FDA97E000B7887D /* BRSingleLineFormatter.h */,
|
CEBAE4230FDA97E000B7887D /* BRSingleLineFormatter.h */,
|
||||||
CEBAE4240FDA97E000B7887D /* BRSingleLineFormatter.m */,
|
CEBAE4240FDA97E000B7887D /* BRSingleLineFormatter.m */,
|
||||||
CEBAE4250FDA97E000B7887D /* NSCharacterSet_Extensions.h */,
|
|
||||||
CEBAE4260FDA97E000B7887D /* NSCharacterSet_Extensions.m */,
|
|
||||||
);
|
);
|
||||||
name = brsinglelineformatter;
|
name = brsinglelineformatter;
|
||||||
path = cocoalib/brsinglelineformatter;
|
path = ../../cocoalib/brsinglelineformatter;
|
||||||
sourceTree = SOURCE_ROOT;
|
sourceTree = SOURCE_ROOT;
|
||||||
};
|
};
|
||||||
CEFC294309C89E0000D9F998 /* images */ = {
|
CEFC294309C89E0000D9F998 /* images */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
CEFCDE2C0AB0418600C33A93 /* dgpe_logo_32.png */,
|
CEFCDE2C0AB0418600C33A93 /* dgpe_logo_32.png */,
|
||||||
CEF7823709C8AA0200EF38FF /* gear.png */,
|
|
||||||
CEFC295309C89FF200D9F998 /* details32.png */,
|
CEFC295309C89FF200D9F998 /* details32.png */,
|
||||||
CEFC295409C89FF200D9F998 /* preferences32.png */,
|
CEFC295409C89FF200D9F998 /* preferences32.png */,
|
||||||
CEFC294509C89E3D00D9F998 /* folder32.png */,
|
CEFC294509C89E3D00D9F998 /* folder32.png */,
|
||||||
@@ -354,7 +355,7 @@
|
|||||||
29B97313FDCFA39411CA2CEA /* Project object */ = {
|
29B97313FDCFA39411CA2CEA /* Project object */ = {
|
||||||
isa = PBXProject;
|
isa = PBXProject;
|
||||||
buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "dupeguru" */;
|
buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "dupeguru" */;
|
||||||
compatibilityVersion = "Xcode 2.4";
|
compatibilityVersion = "Xcode 3.0";
|
||||||
hasScannedForEncodings = 1;
|
hasScannedForEncodings = 1;
|
||||||
mainGroup = 29B97314FDCFA39411CA2CEA /* dupeguru */;
|
mainGroup = 29B97314FDCFA39411CA2CEA /* dupeguru */;
|
||||||
projectDirPath = "";
|
projectDirPath = "";
|
||||||
@@ -370,22 +371,21 @@
|
|||||||
isa = PBXResourcesBuildPhase;
|
isa = PBXResourcesBuildPhase;
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
files = (
|
files = (
|
||||||
8D11072A0486CEB800E47090 /* MainMenu.nib in Resources */,
|
|
||||||
8D11072B0486CEB800E47090 /* InfoPlist.strings in Resources */,
|
|
||||||
CE381D0509915304003581CE /* dg_cocoa.plugin in Resources */,
|
CE381D0509915304003581CE /* dg_cocoa.plugin in Resources */,
|
||||||
CE073F6309CAE1A3005C1D2F /* dupeguru_pe_help in Resources */,
|
CE073F6309CAE1A3005C1D2F /* dupeguru_pe_help in Resources */,
|
||||||
CEEB135209C837A2004D2330 /* dupeguru.icns in Resources */,
|
CEEB135209C837A2004D2330 /* dupeguru.icns in Resources */,
|
||||||
CEFC294609C89E3D00D9F998 /* folder32.png in Resources */,
|
CEFC294609C89E3D00D9F998 /* folder32.png in Resources */,
|
||||||
CEFC295509C89FF200D9F998 /* details32.png in Resources */,
|
CEFC295509C89FF200D9F998 /* details32.png in Resources */,
|
||||||
CEFC295609C89FF200D9F998 /* preferences32.png in Resources */,
|
CEFC295609C89FF200D9F998 /* preferences32.png in Resources */,
|
||||||
CEF7823809C8AA0200EF38FF /* gear.png in Resources */,
|
|
||||||
CECA899909DB12CA00A3D774 /* Details.nib in Resources */,
|
|
||||||
CE3AA46709DB207900DB3A21 /* Directories.nib in Resources */,
|
|
||||||
CEFCDE2D0AB0418600C33A93 /* dgpe_logo_32.png in Resources */,
|
CEFCDE2D0AB0418600C33A93 /* dgpe_logo_32.png in Resources */,
|
||||||
CE80DB760FC194760086DCA6 /* ErrorReportWindow.xib in Resources */,
|
|
||||||
CE80DB770FC194760086DCA6 /* progress.nib in Resources */,
|
|
||||||
CE80DB780FC194760086DCA6 /* registration.nib in Resources */,
|
|
||||||
CE6E0F3D1054EC62008D9390 /* dsa_pub.pem in Resources */,
|
CE6E0F3D1054EC62008D9390 /* dsa_pub.pem in Resources */,
|
||||||
|
CE77C89E10946C6D0078B0DB /* DirectoryPanel.xib in Resources */,
|
||||||
|
CE77C8A810946CE20078B0DB /* DetailsPanel.xib in Resources */,
|
||||||
|
CE031751109B340A00517EE6 /* Preferences.xib in Resources */,
|
||||||
|
CE031754109B345200517EE6 /* MainMenu.xib in Resources */,
|
||||||
|
CE7AC9181119911200D02F6C /* ErrorReportWindow.xib in Resources */,
|
||||||
|
CE7AC9191119911200D02F6C /* progress.xib in Resources */,
|
||||||
|
CE7AC91A1119911200D02F6C /* registration.xib in Resources */,
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
@@ -401,14 +401,12 @@
|
|||||||
CE381C9C09914ADF003581CE /* ResultWindow.m in Sources */,
|
CE381C9C09914ADF003581CE /* ResultWindow.m in Sources */,
|
||||||
CE68EE6809ABC48000971085 /* DirectoryPanel.m in Sources */,
|
CE68EE6809ABC48000971085 /* DirectoryPanel.m in Sources */,
|
||||||
CECA899D09DB132E00A3D774 /* DetailsPanel.m in Sources */,
|
CECA899D09DB132E00A3D774 /* DetailsPanel.m in Sources */,
|
||||||
CE0C46AA0FA0647E000BE99B /* PictureBlocks.m in Sources */,
|
|
||||||
CE80DB2E0FC192D60086DCA6 /* Dialogs.m in Sources */,
|
CE80DB2E0FC192D60086DCA6 /* Dialogs.m in Sources */,
|
||||||
CE80DB2F0FC192D60086DCA6 /* HSErrorReportWindow.m in Sources */,
|
CE80DB2F0FC192D60086DCA6 /* HSErrorReportWindow.m in Sources */,
|
||||||
CE80DB300FC192D60086DCA6 /* Outline.m in Sources */,
|
CE80DB300FC192D60086DCA6 /* Outline.m in Sources */,
|
||||||
CE80DB310FC192D60086DCA6 /* ProgressController.m in Sources */,
|
CE80DB310FC192D60086DCA6 /* ProgressController.m in Sources */,
|
||||||
CE80DB320FC192D60086DCA6 /* RecentDirectories.m in Sources */,
|
CE80DB320FC192D60086DCA6 /* RecentDirectories.m in Sources */,
|
||||||
CE80DB330FC192D60086DCA6 /* RegistrationInterface.m in Sources */,
|
CE80DB330FC192D60086DCA6 /* RegistrationInterface.m in Sources */,
|
||||||
CE80DB340FC192D60086DCA6 /* Table.m in Sources */,
|
|
||||||
CE80DB350FC192D60086DCA6 /* Utils.m in Sources */,
|
CE80DB350FC192D60086DCA6 /* Utils.m in Sources */,
|
||||||
CE80DB360FC192D60086DCA6 /* ValueTransformers.m in Sources */,
|
CE80DB360FC192D60086DCA6 /* ValueTransformers.m in Sources */,
|
||||||
CE80DB470FC193650086DCA6 /* NSNotificationAdditions.m in Sources */,
|
CE80DB470FC193650086DCA6 /* NSNotificationAdditions.m in Sources */,
|
||||||
@@ -417,142 +415,61 @@
|
|||||||
CE80DB8B0FC1951C0086DCA6 /* DirectoryPanel.m in Sources */,
|
CE80DB8B0FC1951C0086DCA6 /* DirectoryPanel.m in Sources */,
|
||||||
CE80DB8C0FC1951C0086DCA6 /* ResultWindow.m in Sources */,
|
CE80DB8C0FC1951C0086DCA6 /* ResultWindow.m in Sources */,
|
||||||
CEBAE4270FDA97E000B7887D /* BRSingleLineFormatter.m in Sources */,
|
CEBAE4270FDA97E000B7887D /* BRSingleLineFormatter.m in Sources */,
|
||||||
CEBAE4280FDA97E000B7887D /* NSCharacterSet_Extensions.m in Sources */,
|
|
||||||
CE6044EC0FE6796200B71262 /* DetailsPanel.m in Sources */,
|
CE6044EC0FE6796200B71262 /* DetailsPanel.m in Sources */,
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
/* End PBXSourcesBuildPhase section */
|
/* End PBXSourcesBuildPhase section */
|
||||||
|
|
||||||
/* Begin PBXVariantGroup section */
|
|
||||||
089C165CFE840E0CC02AAC07 /* InfoPlist.strings */ = {
|
|
||||||
isa = PBXVariantGroup;
|
|
||||||
children = (
|
|
||||||
089C165DFE840E0CC02AAC07 /* English */,
|
|
||||||
);
|
|
||||||
name = InfoPlist.strings;
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
29B97318FDCFA39411CA2CEA /* MainMenu.nib */ = {
|
|
||||||
isa = PBXVariantGroup;
|
|
||||||
children = (
|
|
||||||
29B97319FDCFA39411CA2CEA /* English */,
|
|
||||||
);
|
|
||||||
name = MainMenu.nib;
|
|
||||||
sourceTree = SOURCE_ROOT;
|
|
||||||
};
|
|
||||||
CE3AA46509DB207900DB3A21 /* Directories.nib */ = {
|
|
||||||
isa = PBXVariantGroup;
|
|
||||||
children = (
|
|
||||||
CE3AA46609DB207900DB3A21 /* English */,
|
|
||||||
);
|
|
||||||
name = Directories.nib;
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
CE80DB700FC194760086DCA6 /* ErrorReportWindow.xib */ = {
|
|
||||||
isa = PBXVariantGroup;
|
|
||||||
children = (
|
|
||||||
CE80DB710FC194760086DCA6 /* English */,
|
|
||||||
);
|
|
||||||
name = ErrorReportWindow.xib;
|
|
||||||
sourceTree = SOURCE_ROOT;
|
|
||||||
};
|
|
||||||
CE80DB720FC194760086DCA6 /* progress.nib */ = {
|
|
||||||
isa = PBXVariantGroup;
|
|
||||||
children = (
|
|
||||||
CE80DB730FC194760086DCA6 /* English */,
|
|
||||||
);
|
|
||||||
name = progress.nib;
|
|
||||||
sourceTree = SOURCE_ROOT;
|
|
||||||
};
|
|
||||||
CE80DB740FC194760086DCA6 /* registration.nib */ = {
|
|
||||||
isa = PBXVariantGroup;
|
|
||||||
children = (
|
|
||||||
CE80DB750FC194760086DCA6 /* English */,
|
|
||||||
);
|
|
||||||
name = registration.nib;
|
|
||||||
sourceTree = SOURCE_ROOT;
|
|
||||||
};
|
|
||||||
CECA899709DB12CA00A3D774 /* Details.nib */ = {
|
|
||||||
isa = PBXVariantGroup;
|
|
||||||
children = (
|
|
||||||
CECA899809DB12CA00A3D774 /* English */,
|
|
||||||
);
|
|
||||||
name = Details.nib;
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
/* End PBXVariantGroup section */
|
|
||||||
|
|
||||||
/* Begin XCBuildConfiguration section */
|
/* Begin XCBuildConfiguration section */
|
||||||
C01FCF4B08A954540054247B /* Debug */ = {
|
C01FCF4C08A954540054247B /* release */ = {
|
||||||
isa = XCBuildConfiguration;
|
isa = XCBuildConfiguration;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
COPY_PHASE_STRIP = NO;
|
|
||||||
FRAMEWORK_SEARCH_PATHS = (
|
|
||||||
"$(FRAMEWORK_SEARCH_PATHS)",
|
|
||||||
"$(SRCROOT)/cocoalib/build/Release",
|
|
||||||
"$(FRAMEWORK_SEARCH_PATHS_QUOTED_FOR_TARGET_1)",
|
|
||||||
);
|
|
||||||
FRAMEWORK_SEARCH_PATHS_QUOTED_FOR_TARGET_1 = "\"$(SRCROOT)/dgbase/build/Release\"";
|
|
||||||
GCC_DYNAMIC_NO_PIC = NO;
|
|
||||||
GCC_ENABLE_FIX_AND_CONTINUE = YES;
|
|
||||||
GCC_MODEL_TUNING = G5;
|
|
||||||
GCC_OPTIMIZATION_LEVEL = 0;
|
|
||||||
INFOPLIST_FILE = Info.plist;
|
|
||||||
INSTALL_PATH = "$(HOME)/Applications";
|
|
||||||
PRODUCT_NAME = dupeGuru;
|
|
||||||
WRAPPER_EXTENSION = app;
|
|
||||||
ZERO_LINK = YES;
|
|
||||||
};
|
|
||||||
name = Debug;
|
|
||||||
};
|
|
||||||
C01FCF4C08A954540054247B /* Release */ = {
|
|
||||||
isa = XCBuildConfiguration;
|
|
||||||
buildSettings = {
|
|
||||||
ARCHS = (
|
|
||||||
ppc,
|
|
||||||
i386,
|
|
||||||
);
|
|
||||||
FRAMEWORK_SEARCH_PATHS = (
|
|
||||||
"$(FRAMEWORK_SEARCH_PATHS)",
|
|
||||||
"$(FRAMEWORK_SEARCH_PATHS_QUOTED_FOR_TARGET_1)",
|
|
||||||
);
|
|
||||||
GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
|
GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
|
||||||
GCC_MODEL_TUNING = G5;
|
|
||||||
INFOPLIST_FILE = Info.plist;
|
INFOPLIST_FILE = Info.plist;
|
||||||
INSTALL_PATH = "$(HOME)/Applications";
|
INSTALL_PATH = "$(HOME)/Applications";
|
||||||
PRODUCT_NAME = "dupeGuru PE";
|
PRODUCT_NAME = "dupeGuru PE";
|
||||||
WRAPPER_EXTENSION = app;
|
WRAPPER_EXTENSION = app;
|
||||||
};
|
};
|
||||||
name = Release;
|
name = release;
|
||||||
};
|
};
|
||||||
C01FCF4F08A954540054247B /* Debug */ = {
|
C01FCF5008A954540054247B /* release */ = {
|
||||||
isa = XCBuildConfiguration;
|
isa = XCBuildConfiguration;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
|
ARCHS = (
|
||||||
|
i386,
|
||||||
|
x86_64,
|
||||||
|
ppc,
|
||||||
|
);
|
||||||
GCC_C_LANGUAGE_STANDARD = c99;
|
GCC_C_LANGUAGE_STANDARD = c99;
|
||||||
GCC_WARN_ABOUT_RETURN_TYPE = YES;
|
GCC_WARN_ABOUT_RETURN_TYPE = YES;
|
||||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||||
MACOSX_DEPLOYMENT_TARGET = 10.4;
|
MACOSX_DEPLOYMENT_TARGET = 10.5;
|
||||||
PREBINDING = NO;
|
SDKROOT = "$(DEVELOPER_SDK_DIR)/MacOSX10.5.sdk";
|
||||||
SDKROOT = /Developer/SDKs/MacOSX10.4u.sdk;
|
|
||||||
};
|
};
|
||||||
name = Debug;
|
name = release;
|
||||||
};
|
};
|
||||||
C01FCF5008A954540054247B /* Release */ = {
|
CEE00FF0111AF37400BC1A77 /* dev */ = {
|
||||||
isa = XCBuildConfiguration;
|
isa = XCBuildConfiguration;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
ARCHS = "$(ARCHS_STANDARD_32_BIT_PRE_XCODE_3_1)";
|
ARCHS = "$(NATIVE_ARCH_ACTUAL)";
|
||||||
ARCHS_STANDARD_32_BIT_PRE_XCODE_3_1 = "ppc i386";
|
|
||||||
FRAMEWORK_SEARCH_PATHS = "";
|
|
||||||
GCC_C_LANGUAGE_STANDARD = c99;
|
GCC_C_LANGUAGE_STANDARD = c99;
|
||||||
GCC_VERSION = 4.0;
|
|
||||||
GCC_WARN_ABOUT_RETURN_TYPE = YES;
|
GCC_WARN_ABOUT_RETURN_TYPE = YES;
|
||||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||||
MACOSX_DEPLOYMENT_TARGET = 10.4;
|
MACOSX_DEPLOYMENT_TARGET = 10.5;
|
||||||
PREBINDING = NO;
|
SDKROOT = "$(DEVELOPER_SDK_DIR)/MacOSX10.5.sdk";
|
||||||
SDKROOT = /Developer/SDKs/MacOSX10.4u.sdk;
|
|
||||||
};
|
};
|
||||||
name = Release;
|
name = dev;
|
||||||
|
};
|
||||||
|
CEE00FF1111AF37400BC1A77 /* dev */ = {
|
||||||
|
isa = XCBuildConfiguration;
|
||||||
|
buildSettings = {
|
||||||
|
INFOPLIST_FILE = Info.plist;
|
||||||
|
INSTALL_PATH = "$(HOME)/Applications";
|
||||||
|
PRODUCT_NAME = "dupeGuru PE";
|
||||||
|
WRAPPER_EXTENSION = app;
|
||||||
|
};
|
||||||
|
name = dev;
|
||||||
};
|
};
|
||||||
/* End XCBuildConfiguration section */
|
/* End XCBuildConfiguration section */
|
||||||
|
|
||||||
@@ -560,20 +477,20 @@
|
|||||||
C01FCF4A08A954540054247B /* Build configuration list for PBXNativeTarget "dupeguru" */ = {
|
C01FCF4A08A954540054247B /* Build configuration list for PBXNativeTarget "dupeguru" */ = {
|
||||||
isa = XCConfigurationList;
|
isa = XCConfigurationList;
|
||||||
buildConfigurations = (
|
buildConfigurations = (
|
||||||
C01FCF4B08A954540054247B /* Debug */,
|
C01FCF4C08A954540054247B /* release */,
|
||||||
C01FCF4C08A954540054247B /* Release */,
|
CEE00FF1111AF37400BC1A77 /* dev */,
|
||||||
);
|
);
|
||||||
defaultConfigurationIsVisible = 0;
|
defaultConfigurationIsVisible = 0;
|
||||||
defaultConfigurationName = Release;
|
defaultConfigurationName = release;
|
||||||
};
|
};
|
||||||
C01FCF4E08A954540054247B /* Build configuration list for PBXProject "dupeguru" */ = {
|
C01FCF4E08A954540054247B /* Build configuration list for PBXProject "dupeguru" */ = {
|
||||||
isa = XCConfigurationList;
|
isa = XCConfigurationList;
|
||||||
buildConfigurations = (
|
buildConfigurations = (
|
||||||
C01FCF4F08A954540054247B /* Debug */,
|
C01FCF5008A954540054247B /* release */,
|
||||||
C01FCF5008A954540054247B /* Release */,
|
CEE00FF0111AF37400BC1A77 /* dev */,
|
||||||
);
|
);
|
||||||
defaultConfigurationIsVisible = 0;
|
defaultConfigurationIsVisible = 0;
|
||||||
defaultConfigurationName = Release;
|
defaultConfigurationName = release;
|
||||||
};
|
};
|
||||||
/* End XCConfigurationList section */
|
/* End XCConfigurationList section */
|
||||||
};
|
};
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
Copyright 2009 Hardcoded Software (http://www.hardcoded.net)
|
Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
|
||||||
|
|
||||||
This software is licensed under the "HS" License as described in the "LICENSE" file,
|
This software is licensed under the "HS" License as described in the "LICENSE" file,
|
||||||
which should be included with this package. The terms are also available at
|
which should be included with this package. The terms are also available at
|
||||||
@@ -7,10 +7,12 @@ http://www.hardcoded.net/licenses/hs_license
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#import <Cocoa/Cocoa.h>
|
#import <Cocoa/Cocoa.h>
|
||||||
|
#import "Utils.h"
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
|
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
|
||||||
|
[Utils setPluginName:@"dg_cocoa"];
|
||||||
NSString *pluginPath = [[NSBundle mainBundle]
|
NSString *pluginPath = [[NSBundle mainBundle]
|
||||||
pathForResource:@"dg_cocoa"
|
pathForResource:@"dg_cocoa"
|
||||||
ofType:@"plugin"];
|
ofType:@"plugin"];
|
||||||
1450
cocoa/pe/xib/DetailsPanel.xib
Normal file
1450
cocoa/pe/xib/DetailsPanel.xib
Normal file
File diff suppressed because it is too large
Load Diff
1650
cocoa/pe/xib/Preferences.xib
Normal file
1650
cocoa/pe/xib/Preferences.xib
Normal file
File diff suppressed because it is too large
Load Diff
18
cocoa/se/AppDelegate.h
Normal file
18
cocoa/se/AppDelegate.h
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
/*
|
||||||
|
Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
|
||||||
|
|
||||||
|
This software is licensed under the "HS" License as described in the "LICENSE" file,
|
||||||
|
which should be included with this package. The terms are also available at
|
||||||
|
http://www.hardcoded.net/licenses/hs_license
|
||||||
|
*/
|
||||||
|
|
||||||
|
#import <Cocoa/Cocoa.h>
|
||||||
|
#import "../base/AppDelegate.h"
|
||||||
|
#import "PyDupeGuru.h"
|
||||||
|
|
||||||
|
@interface AppDelegate : AppDelegateBase {}
|
||||||
|
- (IBAction)openWebsite:(id)sender;
|
||||||
|
- (IBAction)toggleDirectories:(id)sender;
|
||||||
|
|
||||||
|
- (PyDupeGuru *)py;
|
||||||
|
@end
|
||||||
61
cocoa/se/AppDelegate.m
Normal file
61
cocoa/se/AppDelegate.m
Normal file
@@ -0,0 +1,61 @@
|
|||||||
|
/*
|
||||||
|
Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
|
||||||
|
|
||||||
|
This software is licensed under the "HS" License as described in the "LICENSE" file,
|
||||||
|
which should be included with this package. The terms are also available at
|
||||||
|
http://www.hardcoded.net/licenses/hs_license
|
||||||
|
*/
|
||||||
|
|
||||||
|
#import "AppDelegate.h"
|
||||||
|
#import "../../cocoalib/ProgressController.h"
|
||||||
|
#import "../../cocoalib/RegistrationInterface.h"
|
||||||
|
#import "../../cocoalib/Utils.h"
|
||||||
|
#import "../../cocoalib/ValueTransformers.h"
|
||||||
|
#import "DetailsPanel.h"
|
||||||
|
#import "DirectoryPanel.h"
|
||||||
|
#import "Consts.h"
|
||||||
|
|
||||||
|
@implementation AppDelegate
|
||||||
|
+ (void)initialize
|
||||||
|
{
|
||||||
|
NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];
|
||||||
|
NSMutableDictionary *d = [NSMutableDictionary dictionary];
|
||||||
|
[d setObject:i2n(1) forKey:@"scanType"];
|
||||||
|
[d setObject:i2n(80) forKey:@"minMatchPercentage"];
|
||||||
|
[d setObject:i2n(30) forKey:@"smallFileThreshold"];
|
||||||
|
[d setObject:i2n(1) forKey:@"recreatePathType"];
|
||||||
|
[d setObject:b2n(YES) forKey:@"wordWeighting"];
|
||||||
|
[d setObject:b2n(NO) forKey:@"matchSimilarWords"];
|
||||||
|
[d setObject:b2n(YES) forKey:@"mixFileKind"];
|
||||||
|
[d setObject:b2n(NO) forKey:@"useRegexpFilter"];
|
||||||
|
[d setObject:b2n(NO) forKey:@"removeEmptyFolders"];
|
||||||
|
[d setObject:b2n(YES) forKey:@"ignoreSmallFiles"];
|
||||||
|
[d setObject:b2n(NO) forKey:@"debug"];
|
||||||
|
[d setObject:[NSArray array] forKey:@"recentDirectories"];
|
||||||
|
[d setObject:[NSArray array] forKey:@"columnsOrder"];
|
||||||
|
[d setObject:[NSDictionary dictionary] forKey:@"columnsWidth"];
|
||||||
|
[[NSUserDefaultsController sharedUserDefaultsController] setInitialValues:d];
|
||||||
|
[ud registerDefaults:d];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (id)init
|
||||||
|
{
|
||||||
|
self = [super init];
|
||||||
|
VTIsIntIn *vt = [[[VTIsIntIn alloc] initWithValues:[NSIndexSet indexSetWithIndex:1] reverse:YES] autorelease];
|
||||||
|
[NSValueTransformer setValueTransformer:vt forName:@"vtScanTypeIsNotContent"];
|
||||||
|
_directoryPanel = nil;
|
||||||
|
return self;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (IBAction)openWebsite:(id)sender
|
||||||
|
{
|
||||||
|
[[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:@"http://www.hardcoded.net/dupeguru"]];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (IBAction)toggleDirectories:(id)sender
|
||||||
|
{
|
||||||
|
[[self directoryPanel] toggleVisible:sender];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (PyDupeGuru *)py { return (PyDupeGuru *)py; }
|
||||||
|
@end
|
||||||
@@ -23,11 +23,13 @@
|
|||||||
<key>CFBundleSignature</key>
|
<key>CFBundleSignature</key>
|
||||||
<string>hsft</string>
|
<string>hsft</string>
|
||||||
<key>CFBundleVersion</key>
|
<key>CFBundleVersion</key>
|
||||||
<string>2.8.2</string>
|
<string>2.9.1</string>
|
||||||
<key>NSMainNibFile</key>
|
<key>NSMainNibFile</key>
|
||||||
<string>MainMenu</string>
|
<string>MainMenu</string>
|
||||||
<key>NSPrincipalClass</key>
|
<key>NSPrincipalClass</key>
|
||||||
<string>NSApplication</string>
|
<string>NSApplication</string>
|
||||||
|
<key>NSHumanReadableCopyright</key>
|
||||||
|
<string>© Hardcoded Software, 2010</string>
|
||||||
<key>SUFeedURL</key>
|
<key>SUFeedURL</key>
|
||||||
<string>http://www.hardcoded.net/updates/dupeguru.appcast</string>
|
<string>http://www.hardcoded.net/updates/dupeguru.appcast</string>
|
||||||
<key>SUPublicDSAKeyFile</key>
|
<key>SUPublicDSAKeyFile</key>
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
Copyright 2009 Hardcoded Software (http://www.hardcoded.net)
|
Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
|
||||||
|
|
||||||
This software is licensed under the "HS" License as described in the "LICENSE" file,
|
This software is licensed under the "HS" License as described in the "LICENSE" file,
|
||||||
which should be included with this package. The terms are also available at
|
which should be included with this package. The terms are also available at
|
||||||
@@ -7,7 +7,7 @@ http://www.hardcoded.net/licenses/hs_license
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#import <Cocoa/Cocoa.h>
|
#import <Cocoa/Cocoa.h>
|
||||||
#import "dgbase/PyDupeGuru.h"
|
#import "../base/PyDupeGuru.h"
|
||||||
|
|
||||||
@interface PyDupeGuru : PyDupeGuruBase
|
@interface PyDupeGuru : PyDupeGuruBase
|
||||||
//Scanning options
|
//Scanning options
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
Copyright 2009 Hardcoded Software (http://www.hardcoded.net)
|
Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
|
||||||
|
|
||||||
This software is licensed under the "HS" License as described in the "LICENSE" file,
|
This software is licensed under the "HS" License as described in the "LICENSE" file,
|
||||||
which should be included with this package. The terms are also available at
|
which should be included with this package. The terms are also available at
|
||||||
@@ -7,21 +7,15 @@ http://www.hardcoded.net/licenses/hs_license
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#import <Cocoa/Cocoa.h>
|
#import <Cocoa/Cocoa.h>
|
||||||
#import "cocoalib/Outline.h"
|
#import "../../cocoalib/Outline.h"
|
||||||
#import "dgbase/ResultWindow.h"
|
#import "../base/ResultWindow.h"
|
||||||
#import "DetailsPanel.h"
|
|
||||||
#import "DirectoryPanel.h"
|
#import "DirectoryPanel.h"
|
||||||
|
|
||||||
@interface ResultWindow : ResultWindowBase
|
@interface ResultWindow : ResultWindowBase
|
||||||
{
|
{
|
||||||
IBOutlet NSPopUpButton *actionMenu;
|
|
||||||
IBOutlet NSMenu *columnsMenu;
|
|
||||||
IBOutlet NSSearchField *filterField;
|
IBOutlet NSSearchField *filterField;
|
||||||
IBOutlet NSWindow *preferencesPanel;
|
|
||||||
|
|
||||||
NSString *_lastAction;
|
NSString *_lastAction;
|
||||||
DetailsPanel *_detailsPanel;
|
|
||||||
NSMutableArray *_resultColumns;
|
|
||||||
NSMutableIndexSet *_deltaColumns;
|
NSMutableIndexSet *_deltaColumns;
|
||||||
}
|
}
|
||||||
- (IBAction)clearIgnoreList:(id)sender;
|
- (IBAction)clearIgnoreList:(id)sender;
|
||||||
@@ -39,13 +33,6 @@ http://www.hardcoded.net/licenses/hs_license
|
|||||||
- (IBAction)renameSelected:(id)sender;
|
- (IBAction)renameSelected:(id)sender;
|
||||||
- (IBAction)resetColumnsToDefault:(id)sender;
|
- (IBAction)resetColumnsToDefault:(id)sender;
|
||||||
- (IBAction)revealSelected:(id)sender;
|
- (IBAction)revealSelected:(id)sender;
|
||||||
- (IBAction)showPreferencesPanel:(id)sender;
|
|
||||||
- (IBAction)startDuplicateScan:(id)sender;
|
- (IBAction)startDuplicateScan:(id)sender;
|
||||||
- (IBAction)toggleColumn:(id)sender;
|
|
||||||
- (IBAction)toggleDelta:(id)sender;
|
- (IBAction)toggleDelta:(id)sender;
|
||||||
- (IBAction)toggleDetailsPanel:(id)sender;
|
|
||||||
|
|
||||||
- (NSTableColumn *)getColumnForIdentifier:(int)aIdentifier title:(NSString *)aTitle width:(int)aWidth refCol:(NSTableColumn *)aColumn;
|
|
||||||
- (void)initResultColumns;
|
|
||||||
- (void)restoreColumnsPosition:(NSArray *)aColumnsOrder widths:(NSDictionary *)aColumnsWidth;
|
|
||||||
@end
|
@end
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
Copyright 2009 Hardcoded Software (http://www.hardcoded.net)
|
Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
|
||||||
|
|
||||||
This software is licensed under the "HS" License as described in the "LICENSE" file,
|
This software is licensed under the "HS" License as described in the "LICENSE" file,
|
||||||
which should be included with this package. The terms are also available at
|
which should be included with this package. The terms are also available at
|
||||||
@@ -7,9 +7,9 @@ http://www.hardcoded.net/licenses/hs_license
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#import "ResultWindow.h"
|
#import "ResultWindow.h"
|
||||||
#import "cocoalib/Dialogs.h"
|
#import "../../cocoalib/Dialogs.h"
|
||||||
#import "cocoalib/ProgressController.h"
|
#import "../../cocoalib/ProgressController.h"
|
||||||
#import "cocoalib/Utils.h"
|
#import "../../cocoalib/Utils.h"
|
||||||
#import "AppDelegate.h"
|
#import "AppDelegate.h"
|
||||||
#import "Consts.h"
|
#import "Consts.h"
|
||||||
|
|
||||||
@@ -18,7 +18,6 @@ http://www.hardcoded.net/licenses/hs_license
|
|||||||
- (void)awakeFromNib
|
- (void)awakeFromNib
|
||||||
{
|
{
|
||||||
[super awakeFromNib];
|
[super awakeFromNib];
|
||||||
_detailsPanel = nil;
|
|
||||||
_displayDelta = NO;
|
_displayDelta = NO;
|
||||||
_powerMode = NO;
|
_powerMode = NO;
|
||||||
_deltaColumns = [[NSMutableIndexSet indexSetWithIndexesInRange:NSMakeRange(2,4)] retain];
|
_deltaColumns = [[NSMutableIndexSet indexSetWithIndexesInRange:NSMakeRange(2,4)] retain];
|
||||||
@@ -28,23 +27,8 @@ http://www.hardcoded.net/licenses/hs_license
|
|||||||
[py setDisplayDeltaValues:b2n(_displayDelta)];
|
[py setDisplayDeltaValues:b2n(_displayDelta)];
|
||||||
[matches setTarget:self];
|
[matches setTarget:self];
|
||||||
[matches setDoubleAction:@selector(openSelected:)];
|
[matches setDoubleAction:@selector(openSelected:)];
|
||||||
[[actionMenu itemAtIndex:0] setImage:[NSImage imageNamed: @"gear"]];
|
|
||||||
[self initResultColumns];
|
|
||||||
[self refreshStats];
|
[self refreshStats];
|
||||||
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(resultsMarkingChanged:) name:ResultsMarkingChangedNotification object:nil];
|
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(resultsMarkingChanged:) name:ResultsMarkingChangedNotification object:nil];
|
||||||
|
|
||||||
NSToolbar *t = [[[NSToolbar alloc] initWithIdentifier:@"ResultWindowToolbar"] autorelease];
|
|
||||||
[t setAllowsUserCustomization:YES];
|
|
||||||
[t setAutosavesConfiguration:YES];
|
|
||||||
[t setDisplayMode:NSToolbarDisplayModeIconAndLabel];
|
|
||||||
[t setDelegate:self];
|
|
||||||
[[self window] setToolbar:t];
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Override */
|
|
||||||
- (NSString *)logoImageName
|
|
||||||
{
|
|
||||||
return @"dgse_logo_32";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Actions */
|
/* Actions */
|
||||||
@@ -174,11 +158,6 @@ http://www.hardcoded.net/licenses/hs_license
|
|||||||
[py revealSelected];
|
[py revealSelected];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (IBAction)showPreferencesPanel:(id)sender
|
|
||||||
{
|
|
||||||
[preferencesPanel makeKeyAndOrderFront:sender];
|
|
||||||
}
|
|
||||||
|
|
||||||
- (IBAction)startDuplicateScan:(id)sender
|
- (IBAction)startDuplicateScan:(id)sender
|
||||||
{
|
{
|
||||||
if ([matches numberOfRows] > 0)
|
if ([matches numberOfRows] > 0)
|
||||||
@@ -211,26 +190,6 @@ http://www.hardcoded.net/licenses/hs_license
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
- (IBAction)toggleColumn:(id)sender
|
|
||||||
{
|
|
||||||
NSMenuItem *mi = sender;
|
|
||||||
NSString *colId = [NSString stringWithFormat:@"%d",[mi tag]];
|
|
||||||
NSTableColumn *col = [matches tableColumnWithIdentifier:colId];
|
|
||||||
if (col == nil)
|
|
||||||
{
|
|
||||||
//Add Column
|
|
||||||
col = [_resultColumns objectAtIndex:[mi tag]];
|
|
||||||
[matches addTableColumn:col];
|
|
||||||
[mi setState:NSOnState];
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
//Remove column
|
|
||||||
[matches removeTableColumn:col];
|
|
||||||
[mi setState:NSOffState];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
- (IBAction)toggleDelta:(id)sender
|
- (IBAction)toggleDelta:(id)sender
|
||||||
{
|
{
|
||||||
if ([deltaSwitch selectedSegment] == 1)
|
if ([deltaSwitch selectedSegment] == 1)
|
||||||
@@ -240,74 +199,24 @@ http://www.hardcoded.net/licenses/hs_license
|
|||||||
[self changeDelta:sender];
|
[self changeDelta:sender];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (IBAction)toggleDetailsPanel:(id)sender
|
|
||||||
{
|
|
||||||
if (!_detailsPanel)
|
|
||||||
_detailsPanel = [[DetailsPanel alloc] initWithPy:py];
|
|
||||||
if ([[_detailsPanel window] isVisible])
|
|
||||||
[[_detailsPanel window] close];
|
|
||||||
else
|
|
||||||
[[_detailsPanel window] orderFront:nil];
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Public */
|
/* Public */
|
||||||
- (NSTableColumn *)getColumnForIdentifier:(int)aIdentifier title:(NSString *)aTitle width:(int)aWidth refCol:(NSTableColumn *)aColumn
|
|
||||||
{
|
|
||||||
NSNumber *n = [NSNumber numberWithInt:aIdentifier];
|
|
||||||
NSTableColumn *col = [[NSTableColumn alloc] initWithIdentifier:[n stringValue]];
|
|
||||||
[col setWidth:aWidth];
|
|
||||||
[col setEditable:NO];
|
|
||||||
[[col dataCell] setFont:[[aColumn dataCell] font]];
|
|
||||||
[[col headerCell] setStringValue:aTitle];
|
|
||||||
[col setResizingMask:NSTableColumnUserResizingMask];
|
|
||||||
[col setSortDescriptorPrototype:[[NSSortDescriptor alloc] initWithKey:[n stringValue] ascending:YES]];
|
|
||||||
return col;
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void)initResultColumns
|
- (void)initResultColumns
|
||||||
{
|
{
|
||||||
NSTableColumn *refCol = [matches tableColumnWithIdentifier:@"0"];
|
NSTableColumn *refCol = [matches tableColumnWithIdentifier:@"0"];
|
||||||
_resultColumns = [[NSMutableArray alloc] init];
|
_resultColumns = [[NSMutableArray alloc] init];
|
||||||
[_resultColumns addObject:[matches tableColumnWithIdentifier:@"0"]]; // File Name
|
[_resultColumns addObject:[matches tableColumnWithIdentifier:@"0"]]; // File Name
|
||||||
[_resultColumns addObject:[matches tableColumnWithIdentifier:@"1"]]; // Directory
|
[_resultColumns addObject:[self getColumnForIdentifier:1 title:@"Directory" width:120 refCol:refCol]];
|
||||||
[_resultColumns addObject:[matches tableColumnWithIdentifier:@"2"]]; // Size
|
NSTableColumn *sizeCol = [self getColumnForIdentifier:2 title:@"Size (KB)" width:63 refCol:refCol];
|
||||||
|
[[sizeCol dataCell] setAlignment:NSRightTextAlignment];
|
||||||
|
[_resultColumns addObject:sizeCol];
|
||||||
[_resultColumns addObject:[self getColumnForIdentifier:3 title:@"Kind" width:40 refCol:refCol]];
|
[_resultColumns addObject:[self getColumnForIdentifier:3 title:@"Kind" width:40 refCol:refCol]];
|
||||||
[_resultColumns addObject:[self getColumnForIdentifier:4 title:@"Creation" width:120 refCol:refCol]];
|
[_resultColumns addObject:[self getColumnForIdentifier:4 title:@"Creation" width:120 refCol:refCol]];
|
||||||
[_resultColumns addObject:[self getColumnForIdentifier:5 title:@"Modification" width:120 refCol:refCol]];
|
[_resultColumns addObject:[self getColumnForIdentifier:5 title:@"Modification" width:120 refCol:refCol]];
|
||||||
[_resultColumns addObject:[matches tableColumnWithIdentifier:@"6"]]; // Match %
|
[_resultColumns addObject:[self getColumnForIdentifier:6 title:@"Match %" width:60 refCol:refCol]];
|
||||||
[_resultColumns addObject:[self getColumnForIdentifier:7 title:@"Words Used" width:120 refCol:refCol]];
|
[_resultColumns addObject:[self getColumnForIdentifier:7 title:@"Words Used" width:120 refCol:refCol]];
|
||||||
[_resultColumns addObject:[self getColumnForIdentifier:8 title:@"Dupe Count" width:80 refCol:refCol]];
|
[_resultColumns addObject:[self getColumnForIdentifier:8 title:@"Dupe Count" width:80 refCol:refCol]];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)restoreColumnsPosition:(NSArray *)aColumnsOrder widths:(NSDictionary *)aColumnsWidth
|
|
||||||
{
|
|
||||||
NSTableColumn *col;
|
|
||||||
NSString *colId;
|
|
||||||
NSNumber *width;
|
|
||||||
NSMenuItem *mi;
|
|
||||||
//Remove all columns
|
|
||||||
NSEnumerator *e = [[columnsMenu itemArray] objectEnumerator];
|
|
||||||
while (mi = [e nextObject])
|
|
||||||
{
|
|
||||||
if ([mi state] == NSOnState)
|
|
||||||
[self toggleColumn:mi];
|
|
||||||
}
|
|
||||||
//Add columns and set widths
|
|
||||||
e = [aColumnsOrder objectEnumerator];
|
|
||||||
while (colId = [e nextObject])
|
|
||||||
{
|
|
||||||
if (![colId isEqual:@"mark"])
|
|
||||||
{
|
|
||||||
col = [_resultColumns objectAtIndex:[colId intValue]];
|
|
||||||
width = [aColumnsWidth objectForKey:[col identifier]];
|
|
||||||
mi = [columnsMenu itemWithTag:[colId intValue]];
|
|
||||||
if (width)
|
|
||||||
[col setWidth:[width floatValue]];
|
|
||||||
[self toggleColumn:mi];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Delegate */
|
/* Delegate */
|
||||||
- (void)outlineView:(NSOutlineView *)outlineView willDisplayCell:(id)cell forTableColumn:(NSTableColumn *)tableColumn item:(id)item
|
- (void)outlineView:(NSOutlineView *)outlineView willDisplayCell:(id)cell forTableColumn:(NSTableColumn *)tableColumn item:(id)item
|
||||||
{
|
{
|
||||||
@@ -332,18 +241,4 @@ http://www.hardcoded.net/licenses/hs_license
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Notifications */
|
|
||||||
- (void)outlineViewSelectionDidChange:(NSNotification *)notification
|
|
||||||
{
|
|
||||||
[self performPySelection:[self getSelectedPaths:NO]];
|
|
||||||
[py refreshDetailsWithSelected];
|
|
||||||
[[NSNotificationCenter defaultCenter] postNotificationName:DuplicateSelectionChangedNotification object:self];
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void)resultsMarkingChanged:(NSNotification *)aNotification
|
|
||||||
{
|
|
||||||
[matches invalidateMarkings];
|
|
||||||
[self refreshStats];
|
|
||||||
}
|
|
||||||
@end
|
@end
|
||||||
48
cocoa/se/dg_cocoa.py
Normal file
48
cocoa/se/dg_cocoa.py
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
# Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
|
||||||
|
#
|
||||||
|
# This software is licensed under the "HS" License as described in the "LICENSE" file,
|
||||||
|
# which should be included with this package. The terms are also available at
|
||||||
|
# http://www.hardcoded.net/licenses/hs_license
|
||||||
|
|
||||||
|
from hsutil.cocoa import signature
|
||||||
|
|
||||||
|
from core import scanner
|
||||||
|
from core.app_cocoa_inter import PyDupeGuruBase, PyDetailsPanel
|
||||||
|
from core_se.app_cocoa import DupeGuru
|
||||||
|
|
||||||
|
# Fix py2app imports with chokes on relative imports
|
||||||
|
from core_se import fs, data
|
||||||
|
|
||||||
|
class PyDupeGuru(PyDupeGuruBase):
|
||||||
|
def init(self):
|
||||||
|
self = super(PyDupeGuru,self).init()
|
||||||
|
self.app = DupeGuru()
|
||||||
|
return self
|
||||||
|
|
||||||
|
#---Properties
|
||||||
|
def setMinMatchPercentage_(self,percentage):
|
||||||
|
self.app.scanner.min_match_percentage = int(percentage)
|
||||||
|
|
||||||
|
def setScanType_(self,scan_type):
|
||||||
|
try:
|
||||||
|
self.app.scanner.scan_type = [
|
||||||
|
scanner.SCAN_TYPE_FILENAME,
|
||||||
|
scanner.SCAN_TYPE_CONTENT
|
||||||
|
][scan_type]
|
||||||
|
except IndexError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
def setWordWeighting_(self,words_are_weighted):
|
||||||
|
self.app.scanner.word_weighting = words_are_weighted
|
||||||
|
|
||||||
|
def setMatchSimilarWords_(self,match_similar_words):
|
||||||
|
self.app.scanner.match_similar_words = match_similar_words
|
||||||
|
|
||||||
|
@signature('v@:i')
|
||||||
|
def setSizeThreshold_(self, size_threshold):
|
||||||
|
self.app.scanner.size_threshold = size_threshold
|
||||||
|
|
||||||
|
#---Registration
|
||||||
|
def appName(self):
|
||||||
|
return "dupeGuru"
|
||||||
|
|
||||||
@@ -7,44 +7,36 @@
|
|||||||
objects = {
|
objects = {
|
||||||
|
|
||||||
/* Begin PBXBuildFile section */
|
/* Begin PBXBuildFile section */
|
||||||
8D11072A0486CEB800E47090 /* MainMenu.nib in Resources */ = {isa = PBXBuildFile; fileRef = 29B97318FDCFA39411CA2CEA /* MainMenu.nib */; };
|
|
||||||
8D11072B0486CEB800E47090 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */; };
|
|
||||||
8D11072D0486CEB800E47090 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B97316FDCFA39411CA2CEA /* main.m */; settings = {ATTRIBUTES = (); }; };
|
8D11072D0486CEB800E47090 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B97316FDCFA39411CA2CEA /* main.m */; settings = {ATTRIBUTES = (); }; };
|
||||||
8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
|
8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
|
||||||
CE073F6309CAE1A3005C1D2F /* dupeguru_help in Resources */ = {isa = PBXBuildFile; fileRef = CE073F5409CAE1A3005C1D2F /* dupeguru_help */; };
|
CE073F6309CAE1A3005C1D2F /* dupeguru_help in Resources */ = {isa = PBXBuildFile; fileRef = CE073F5409CAE1A3005C1D2F /* dupeguru_help */; };
|
||||||
|
CE19BC6311199231007CCEB0 /* ErrorReportWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = CE19BC6011199231007CCEB0 /* ErrorReportWindow.xib */; };
|
||||||
|
CE19BC6411199231007CCEB0 /* progress.xib in Resources */ = {isa = PBXBuildFile; fileRef = CE19BC6111199231007CCEB0 /* progress.xib */; };
|
||||||
|
CE19BC6511199231007CCEB0 /* registration.xib in Resources */ = {isa = PBXBuildFile; fileRef = CE19BC6211199231007CCEB0 /* registration.xib */; };
|
||||||
CE381C9609914ACE003581CE /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = CE381C9409914ACE003581CE /* AppDelegate.m */; };
|
CE381C9609914ACE003581CE /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = CE381C9409914ACE003581CE /* AppDelegate.m */; };
|
||||||
CE381C9C09914ADF003581CE /* ResultWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = CE381C9A09914ADF003581CE /* ResultWindow.m */; };
|
CE381C9C09914ADF003581CE /* ResultWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = CE381C9A09914ADF003581CE /* ResultWindow.m */; };
|
||||||
CE381D0509915304003581CE /* dg_cocoa.plugin in Resources */ = {isa = PBXBuildFile; fileRef = CE381CF509915304003581CE /* dg_cocoa.plugin */; };
|
CE381D0509915304003581CE /* dg_cocoa.plugin in Resources */ = {isa = PBXBuildFile; fileRef = CE381CF509915304003581CE /* dg_cocoa.plugin */; };
|
||||||
CE3AA46709DB207900DB3A21 /* Directories.nib in Resources */ = {isa = PBXBuildFile; fileRef = CE3AA46509DB207900DB3A21 /* Directories.nib */; };
|
CE3A46FA109B212E002ABFD5 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = CE3A46F9109B212E002ABFD5 /* MainMenu.xib */; };
|
||||||
CE45579B0AE3BC2B005A9546 /* Sparkle.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CE45579A0AE3BC2B005A9546 /* Sparkle.framework */; };
|
CE45579B0AE3BC2B005A9546 /* Sparkle.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CE45579A0AE3BC2B005A9546 /* Sparkle.framework */; };
|
||||||
CE4557B40AE3BC50005A9546 /* Sparkle.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = CE45579A0AE3BC2B005A9546 /* Sparkle.framework */; };
|
CE4557B40AE3BC50005A9546 /* Sparkle.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = CE45579A0AE3BC2B005A9546 /* Sparkle.framework */; };
|
||||||
CE68EE6809ABC48000971085 /* DirectoryPanel.m in Sources */ = {isa = PBXBuildFile; fileRef = CE68EE6609ABC48000971085 /* DirectoryPanel.m */; };
|
|
||||||
CE6E0DFE1054E9EF008D9390 /* dsa_pub.pem in Resources */ = {isa = PBXBuildFile; fileRef = CE6E0DFD1054E9EF008D9390 /* dsa_pub.pem */; };
|
CE6E0DFE1054E9EF008D9390 /* dsa_pub.pem in Resources */ = {isa = PBXBuildFile; fileRef = CE6E0DFD1054E9EF008D9390 /* dsa_pub.pem */; };
|
||||||
CE848A1909DD85810004CB44 /* Consts.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = CE848A1809DD85810004CB44 /* Consts.h */; };
|
CEAC6811109B0B7E00B43C85 /* Preferences.xib in Resources */ = {isa = PBXBuildFile; fileRef = CEAC6810109B0B7E00B43C85 /* Preferences.xib */; };
|
||||||
CECA899909DB12CA00A3D774 /* Details.nib in Resources */ = {isa = PBXBuildFile; fileRef = CECA899709DB12CA00A3D774 /* Details.nib */; };
|
|
||||||
CECA899C09DB132E00A3D774 /* DetailsPanel.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = CECA899A09DB132E00A3D774 /* DetailsPanel.h */; };
|
|
||||||
CECA899D09DB132E00A3D774 /* DetailsPanel.m in Sources */ = {isa = PBXBuildFile; fileRef = CECA899B09DB132E00A3D774 /* DetailsPanel.m */; };
|
|
||||||
CEDD92DA0FDD01640031C7B7 /* BRSingleLineFormatter.m in Sources */ = {isa = PBXBuildFile; fileRef = CEDD92D70FDD01640031C7B7 /* BRSingleLineFormatter.m */; };
|
CEDD92DA0FDD01640031C7B7 /* BRSingleLineFormatter.m in Sources */ = {isa = PBXBuildFile; fileRef = CEDD92D70FDD01640031C7B7 /* BRSingleLineFormatter.m */; };
|
||||||
CEDD92DB0FDD01640031C7B7 /* NSCharacterSet_Extensions.m in Sources */ = {isa = PBXBuildFile; fileRef = CEDD92D90FDD01640031C7B7 /* NSCharacterSet_Extensions.m */; };
|
|
||||||
CEE7EA130FE675C80004E467 /* DetailsPanel.m in Sources */ = {isa = PBXBuildFile; fileRef = CEE7EA120FE675C80004E467 /* DetailsPanel.m */; };
|
CEE7EA130FE675C80004E467 /* DetailsPanel.m in Sources */ = {isa = PBXBuildFile; fileRef = CEE7EA120FE675C80004E467 /* DetailsPanel.m */; };
|
||||||
CEEB135209C837A2004D2330 /* dupeguru.icns in Resources */ = {isa = PBXBuildFile; fileRef = CEEB135109C837A2004D2330 /* dupeguru.icns */; };
|
CEEB135209C837A2004D2330 /* dupeguru.icns in Resources */ = {isa = PBXBuildFile; fileRef = CEEB135109C837A2004D2330 /* dupeguru.icns */; };
|
||||||
CEF7823809C8AA0200EF38FF /* gear.png in Resources */ = {isa = PBXBuildFile; fileRef = CEF7823709C8AA0200EF38FF /* gear.png */; };
|
CEEFC0F810945D9F001F3A39 /* DirectoryPanel.xib in Resources */ = {isa = PBXBuildFile; fileRef = CEEFC0F710945D9F001F3A39 /* DirectoryPanel.xib */; };
|
||||||
|
CEEFC0FB10945E37001F3A39 /* DetailsPanel.xib in Resources */ = {isa = PBXBuildFile; fileRef = CEEFC0FA10945E37001F3A39 /* DetailsPanel.xib */; };
|
||||||
CEFC294609C89E3D00D9F998 /* folder32.png in Resources */ = {isa = PBXBuildFile; fileRef = CEFC294509C89E3D00D9F998 /* folder32.png */; };
|
CEFC294609C89E3D00D9F998 /* folder32.png in Resources */ = {isa = PBXBuildFile; fileRef = CEFC294509C89E3D00D9F998 /* folder32.png */; };
|
||||||
CEFC295509C89FF200D9F998 /* details32.png in Resources */ = {isa = PBXBuildFile; fileRef = CEFC295309C89FF200D9F998 /* details32.png */; };
|
CEFC295509C89FF200D9F998 /* details32.png in Resources */ = {isa = PBXBuildFile; fileRef = CEFC295309C89FF200D9F998 /* details32.png */; };
|
||||||
CEFC295609C89FF200D9F998 /* preferences32.png in Resources */ = {isa = PBXBuildFile; fileRef = CEFC295409C89FF200D9F998 /* preferences32.png */; };
|
CEFC295609C89FF200D9F998 /* preferences32.png in Resources */ = {isa = PBXBuildFile; fileRef = CEFC295409C89FF200D9F998 /* preferences32.png */; };
|
||||||
CEFC295E09C8A0B000D9F998 /* dgse_logo_32.png in Resources */ = {isa = PBXBuildFile; fileRef = CEFC295D09C8A0B000D9F998 /* dgse_logo_32.png */; };
|
|
||||||
CEFC7F9E0FC9517500CD5728 /* Dialogs.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFC7F8B0FC9517500CD5728 /* Dialogs.m */; };
|
CEFC7F9E0FC9517500CD5728 /* Dialogs.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFC7F8B0FC9517500CD5728 /* Dialogs.m */; };
|
||||||
CEFC7F9F0FC9517500CD5728 /* HSErrorReportWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFC7F8D0FC9517500CD5728 /* HSErrorReportWindow.m */; };
|
CEFC7F9F0FC9517500CD5728 /* HSErrorReportWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFC7F8D0FC9517500CD5728 /* HSErrorReportWindow.m */; };
|
||||||
CEFC7FA00FC9517500CD5728 /* Outline.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFC7F8F0FC9517500CD5728 /* Outline.m */; };
|
CEFC7FA00FC9517500CD5728 /* Outline.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFC7F8F0FC9517500CD5728 /* Outline.m */; };
|
||||||
CEFC7FA10FC9517500CD5728 /* ProgressController.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFC7F910FC9517500CD5728 /* ProgressController.m */; };
|
CEFC7FA10FC9517500CD5728 /* ProgressController.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFC7F910FC9517500CD5728 /* ProgressController.m */; };
|
||||||
CEFC7FA20FC9517500CD5728 /* RecentDirectories.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFC7F950FC9517500CD5728 /* RecentDirectories.m */; };
|
CEFC7FA20FC9517500CD5728 /* RecentDirectories.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFC7F950FC9517500CD5728 /* RecentDirectories.m */; };
|
||||||
CEFC7FA30FC9517500CD5728 /* RegistrationInterface.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFC7F970FC9517500CD5728 /* RegistrationInterface.m */; };
|
CEFC7FA30FC9517500CD5728 /* RegistrationInterface.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFC7F970FC9517500CD5728 /* RegistrationInterface.m */; };
|
||||||
CEFC7FA40FC9517500CD5728 /* Table.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFC7F990FC9517500CD5728 /* Table.m */; };
|
|
||||||
CEFC7FA50FC9517500CD5728 /* Utils.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFC7F9B0FC9517500CD5728 /* Utils.m */; };
|
CEFC7FA50FC9517500CD5728 /* Utils.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFC7F9B0FC9517500CD5728 /* Utils.m */; };
|
||||||
CEFC7FA60FC9517500CD5728 /* ValueTransformers.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFC7F9D0FC9517500CD5728 /* ValueTransformers.m */; };
|
CEFC7FA60FC9517500CD5728 /* ValueTransformers.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFC7F9D0FC9517500CD5728 /* ValueTransformers.m */; };
|
||||||
CEFC7FAD0FC9518A00CD5728 /* ErrorReportWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = CEFC7FA70FC9518A00CD5728 /* ErrorReportWindow.xib */; };
|
|
||||||
CEFC7FAE0FC9518A00CD5728 /* progress.nib in Resources */ = {isa = PBXBuildFile; fileRef = CEFC7FA90FC9518A00CD5728 /* progress.nib */; };
|
|
||||||
CEFC7FAF0FC9518A00CD5728 /* registration.nib in Resources */ = {isa = PBXBuildFile; fileRef = CEFC7FAB0FC9518A00CD5728 /* registration.nib */; };
|
|
||||||
CEFC7FB90FC951A700CD5728 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFC7FB20FC951A700CD5728 /* AppDelegate.m */; };
|
CEFC7FB90FC951A700CD5728 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFC7FB20FC951A700CD5728 /* AppDelegate.m */; };
|
||||||
CEFC7FBA0FC951A700CD5728 /* DirectoryPanel.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFC7FB50FC951A700CD5728 /* DirectoryPanel.m */; };
|
CEFC7FBA0FC951A700CD5728 /* DirectoryPanel.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFC7FB50FC951A700CD5728 /* DirectoryPanel.m */; };
|
||||||
CEFC7FBB0FC951A700CD5728 /* ResultWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFC7FB80FC951A700CD5728 /* ResultWindow.m */; };
|
CEFC7FBB0FC951A700CD5728 /* ResultWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFC7FB80FC951A700CD5728 /* ResultWindow.m */; };
|
||||||
@@ -58,81 +50,69 @@
|
|||||||
dstSubfolderSpec = 10;
|
dstSubfolderSpec = 10;
|
||||||
files = (
|
files = (
|
||||||
CE4557B40AE3BC50005A9546 /* Sparkle.framework in CopyFiles */,
|
CE4557B40AE3BC50005A9546 /* Sparkle.framework in CopyFiles */,
|
||||||
CECA899C09DB132E00A3D774 /* DetailsPanel.h in CopyFiles */,
|
|
||||||
CE848A1909DD85810004CB44 /* Consts.h in CopyFiles */,
|
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
/* End PBXCopyFilesBuildPhase section */
|
/* End PBXCopyFilesBuildPhase section */
|
||||||
|
|
||||||
/* Begin PBXFileReference section */
|
/* Begin PBXFileReference section */
|
||||||
089C165DFE840E0CC02AAC07 /* English */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/InfoPlist.strings; sourceTree = "<group>"; };
|
|
||||||
1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = /System/Library/Frameworks/Cocoa.framework; sourceTree = "<absolute>"; };
|
1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = /System/Library/Frameworks/Cocoa.framework; sourceTree = "<absolute>"; };
|
||||||
13E42FB307B3F0F600E4EEF1 /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = /System/Library/Frameworks/CoreData.framework; sourceTree = "<absolute>"; };
|
13E42FB307B3F0F600E4EEF1 /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = /System/Library/Frameworks/CoreData.framework; sourceTree = "<absolute>"; };
|
||||||
29B97316FDCFA39411CA2CEA /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
|
29B97316FDCFA39411CA2CEA /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
|
||||||
29B97319FDCFA39411CA2CEA /* English */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = English; path = English.lproj/MainMenu.nib; sourceTree = "<group>"; };
|
|
||||||
29B97324FDCFA39411CA2CEA /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = /System/Library/Frameworks/AppKit.framework; sourceTree = "<absolute>"; };
|
29B97324FDCFA39411CA2CEA /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = /System/Library/Frameworks/AppKit.framework; sourceTree = "<absolute>"; };
|
||||||
29B97325FDCFA39411CA2CEA /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = /System/Library/Frameworks/Foundation.framework; sourceTree = "<absolute>"; };
|
29B97325FDCFA39411CA2CEA /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = /System/Library/Frameworks/Foundation.framework; sourceTree = "<absolute>"; };
|
||||||
8D1107310486CEB800E47090 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = SOURCE_ROOT; };
|
8D1107310486CEB800E47090 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = SOURCE_ROOT; };
|
||||||
8D1107320486CEB800E47090 /* dupeGuru.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = dupeGuru.app; sourceTree = BUILT_PRODUCTS_DIR; };
|
8D1107320486CEB800E47090 /* dupeGuru.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = dupeGuru.app; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
CE073F5409CAE1A3005C1D2F /* dupeguru_help */ = {isa = PBXFileReference; lastKnownFileType = folder; name = dupeguru_help; path = help/dupeguru_help; sourceTree = "<group>"; };
|
CE073F5409CAE1A3005C1D2F /* dupeguru_help */ = {isa = PBXFileReference; lastKnownFileType = folder; name = dupeguru_help; path = ../../help_se/dupeguru_help; sourceTree = "<group>"; };
|
||||||
|
CE19BC6011199231007CCEB0 /* ErrorReportWindow.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = ErrorReportWindow.xib; sourceTree = "<group>"; };
|
||||||
|
CE19BC6111199231007CCEB0 /* progress.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = progress.xib; sourceTree = "<group>"; };
|
||||||
|
CE19BC6211199231007CCEB0 /* registration.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = registration.xib; sourceTree = "<group>"; };
|
||||||
CE381C9409914ACE003581CE /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = SOURCE_ROOT; };
|
CE381C9409914ACE003581CE /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = SOURCE_ROOT; };
|
||||||
CE381C9509914ACE003581CE /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = SOURCE_ROOT; };
|
CE381C9509914ACE003581CE /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = SOURCE_ROOT; };
|
||||||
CE381C9A09914ADF003581CE /* ResultWindow.m */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.objc; path = ResultWindow.m; sourceTree = SOURCE_ROOT; };
|
CE381C9A09914ADF003581CE /* ResultWindow.m */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.objc; path = ResultWindow.m; sourceTree = SOURCE_ROOT; };
|
||||||
CE381C9B09914ADF003581CE /* ResultWindow.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = ResultWindow.h; sourceTree = SOURCE_ROOT; };
|
CE381C9B09914ADF003581CE /* ResultWindow.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = ResultWindow.h; sourceTree = SOURCE_ROOT; };
|
||||||
CE381CF509915304003581CE /* dg_cocoa.plugin */ = {isa = PBXFileReference; lastKnownFileType = folder; name = dg_cocoa.plugin; path = py/dist/dg_cocoa.plugin; sourceTree = SOURCE_ROOT; };
|
CE381CF509915304003581CE /* dg_cocoa.plugin */ = {isa = PBXFileReference; lastKnownFileType = folder; path = dg_cocoa.plugin; sourceTree = SOURCE_ROOT; };
|
||||||
CE3AA46609DB207900DB3A21 /* English */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = English; path = English.lproj/Directories.nib; sourceTree = "<group>"; };
|
CE3A46F9109B212E002ABFD5 /* MainMenu.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = MainMenu.xib; path = ../base/xib/MainMenu.xib; sourceTree = "<group>"; };
|
||||||
CE45579A0AE3BC2B005A9546 /* Sparkle.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Sparkle.framework; path = /Library/Frameworks/Sparkle.framework; sourceTree = "<absolute>"; };
|
CE45579A0AE3BC2B005A9546 /* Sparkle.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Sparkle.framework; path = /Library/Frameworks/Sparkle.framework; sourceTree = "<absolute>"; };
|
||||||
CE68EE6509ABC48000971085 /* DirectoryPanel.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = DirectoryPanel.h; sourceTree = SOURCE_ROOT; };
|
CE6E0DFD1054E9EF008D9390 /* dsa_pub.pem */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = dsa_pub.pem; path = ../base/dsa_pub.pem; sourceTree = "<group>"; };
|
||||||
CE68EE6609ABC48000971085 /* DirectoryPanel.m */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.objc; path = DirectoryPanel.m; sourceTree = SOURCE_ROOT; };
|
CE6E7407111C997500C350E3 /* PyDetailsPanel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PyDetailsPanel.h; path = ../base/PyDetailsPanel.h; sourceTree = SOURCE_ROOT; };
|
||||||
CE6E0DFD1054E9EF008D9390 /* dsa_pub.pem */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = dsa_pub.pem; path = dgbase/dsa_pub.pem; sourceTree = "<group>"; };
|
CEAC6810109B0B7E00B43C85 /* Preferences.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Preferences.xib; path = xib/Preferences.xib; sourceTree = "<group>"; };
|
||||||
CE848A1809DD85810004CB44 /* Consts.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Consts.h; sourceTree = "<group>"; };
|
CEDD92D60FDD01640031C7B7 /* BRSingleLineFormatter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = BRSingleLineFormatter.h; path = ../../cocoalib/brsinglelineformatter/BRSingleLineFormatter.h; sourceTree = SOURCE_ROOT; };
|
||||||
CECA899809DB12CA00A3D774 /* English */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = English; path = English.lproj/Details.nib; sourceTree = "<group>"; };
|
CEDD92D70FDD01640031C7B7 /* BRSingleLineFormatter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = BRSingleLineFormatter.m; path = ../../cocoalib/brsinglelineformatter/BRSingleLineFormatter.m; sourceTree = SOURCE_ROOT; };
|
||||||
CECA899A09DB132E00A3D774 /* DetailsPanel.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = DetailsPanel.h; sourceTree = "<group>"; };
|
CEE7EA110FE675C80004E467 /* DetailsPanel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DetailsPanel.h; path = ../base/DetailsPanel.h; sourceTree = SOURCE_ROOT; };
|
||||||
CECA899B09DB132E00A3D774 /* DetailsPanel.m */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.objc; path = DetailsPanel.m; sourceTree = "<group>"; };
|
CEE7EA120FE675C80004E467 /* DetailsPanel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = DetailsPanel.m; path = ../base/DetailsPanel.m; sourceTree = SOURCE_ROOT; };
|
||||||
CEDD92D60FDD01640031C7B7 /* BRSingleLineFormatter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = BRSingleLineFormatter.h; path = cocoalib/brsinglelineformatter/BRSingleLineFormatter.h; sourceTree = SOURCE_ROOT; };
|
|
||||||
CEDD92D70FDD01640031C7B7 /* BRSingleLineFormatter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = BRSingleLineFormatter.m; path = cocoalib/brsinglelineformatter/BRSingleLineFormatter.m; sourceTree = SOURCE_ROOT; };
|
|
||||||
CEDD92D80FDD01640031C7B7 /* NSCharacterSet_Extensions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = NSCharacterSet_Extensions.h; path = cocoalib/brsinglelineformatter/NSCharacterSet_Extensions.h; sourceTree = SOURCE_ROOT; };
|
|
||||||
CEDD92D90FDD01640031C7B7 /* NSCharacterSet_Extensions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = NSCharacterSet_Extensions.m; path = cocoalib/brsinglelineformatter/NSCharacterSet_Extensions.m; sourceTree = SOURCE_ROOT; };
|
|
||||||
CEE7EA110FE675C80004E467 /* DetailsPanel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DetailsPanel.h; path = dgbase/DetailsPanel.h; sourceTree = SOURCE_ROOT; };
|
|
||||||
CEE7EA120FE675C80004E467 /* DetailsPanel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = DetailsPanel.m; path = dgbase/DetailsPanel.m; sourceTree = SOURCE_ROOT; };
|
|
||||||
CEEB135109C837A2004D2330 /* dupeguru.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = dupeguru.icns; sourceTree = "<group>"; };
|
CEEB135109C837A2004D2330 /* dupeguru.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = dupeguru.icns; sourceTree = "<group>"; };
|
||||||
CEF7823709C8AA0200EF38FF /* gear.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = gear.png; path = images/gear.png; sourceTree = "<group>"; };
|
CEEFC0F710945D9F001F3A39 /* DirectoryPanel.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = DirectoryPanel.xib; path = ../base/xib/DirectoryPanel.xib; sourceTree = "<group>"; };
|
||||||
CEFC294509C89E3D00D9F998 /* folder32.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = folder32.png; path = images/folder32.png; sourceTree = SOURCE_ROOT; };
|
CEEFC0FA10945E37001F3A39 /* DetailsPanel.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = DetailsPanel.xib; path = ../base/xib/DetailsPanel.xib; sourceTree = "<group>"; };
|
||||||
CEFC295309C89FF200D9F998 /* details32.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = details32.png; path = images/details32.png; sourceTree = SOURCE_ROOT; };
|
CEFC294509C89E3D00D9F998 /* folder32.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = folder32.png; path = ../../images/folder32.png; sourceTree = SOURCE_ROOT; };
|
||||||
CEFC295409C89FF200D9F998 /* preferences32.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = preferences32.png; path = images/preferences32.png; sourceTree = SOURCE_ROOT; };
|
CEFC295309C89FF200D9F998 /* details32.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = details32.png; path = ../../images/details32.png; sourceTree = SOURCE_ROOT; };
|
||||||
CEFC295D09C8A0B000D9F998 /* dgse_logo_32.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = dgse_logo_32.png; path = images/dgse_logo_32.png; sourceTree = "<group>"; };
|
CEFC295409C89FF200D9F998 /* preferences32.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = preferences32.png; path = ../../images/preferences32.png; sourceTree = SOURCE_ROOT; };
|
||||||
CEFC7F8A0FC9517500CD5728 /* Dialogs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Dialogs.h; path = cocoalib/Dialogs.h; sourceTree = SOURCE_ROOT; };
|
CEFC7F8A0FC9517500CD5728 /* Dialogs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Dialogs.h; path = ../../cocoalib/Dialogs.h; sourceTree = SOURCE_ROOT; };
|
||||||
CEFC7F8B0FC9517500CD5728 /* Dialogs.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Dialogs.m; path = cocoalib/Dialogs.m; sourceTree = SOURCE_ROOT; };
|
CEFC7F8B0FC9517500CD5728 /* Dialogs.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Dialogs.m; path = ../../cocoalib/Dialogs.m; sourceTree = SOURCE_ROOT; };
|
||||||
CEFC7F8C0FC9517500CD5728 /* HSErrorReportWindow.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = HSErrorReportWindow.h; path = cocoalib/HSErrorReportWindow.h; sourceTree = SOURCE_ROOT; };
|
CEFC7F8C0FC9517500CD5728 /* HSErrorReportWindow.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = HSErrorReportWindow.h; path = ../../cocoalib/HSErrorReportWindow.h; sourceTree = SOURCE_ROOT; };
|
||||||
CEFC7F8D0FC9517500CD5728 /* HSErrorReportWindow.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = HSErrorReportWindow.m; path = cocoalib/HSErrorReportWindow.m; sourceTree = SOURCE_ROOT; };
|
CEFC7F8D0FC9517500CD5728 /* HSErrorReportWindow.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = HSErrorReportWindow.m; path = ../../cocoalib/HSErrorReportWindow.m; sourceTree = SOURCE_ROOT; };
|
||||||
CEFC7F8E0FC9517500CD5728 /* Outline.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Outline.h; path = cocoalib/Outline.h; sourceTree = SOURCE_ROOT; };
|
CEFC7F8E0FC9517500CD5728 /* Outline.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Outline.h; path = ../../cocoalib/Outline.h; sourceTree = SOURCE_ROOT; };
|
||||||
CEFC7F8F0FC9517500CD5728 /* Outline.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Outline.m; path = cocoalib/Outline.m; sourceTree = SOURCE_ROOT; };
|
CEFC7F8F0FC9517500CD5728 /* Outline.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Outline.m; path = ../../cocoalib/Outline.m; sourceTree = SOURCE_ROOT; };
|
||||||
CEFC7F900FC9517500CD5728 /* ProgressController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ProgressController.h; path = cocoalib/ProgressController.h; sourceTree = SOURCE_ROOT; };
|
CEFC7F900FC9517500CD5728 /* ProgressController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ProgressController.h; path = ../../cocoalib/ProgressController.h; sourceTree = SOURCE_ROOT; };
|
||||||
CEFC7F910FC9517500CD5728 /* ProgressController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = ProgressController.m; path = cocoalib/ProgressController.m; sourceTree = SOURCE_ROOT; };
|
CEFC7F910FC9517500CD5728 /* ProgressController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = ProgressController.m; path = ../../cocoalib/ProgressController.m; sourceTree = SOURCE_ROOT; };
|
||||||
CEFC7F920FC9517500CD5728 /* PyApp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PyApp.h; path = cocoalib/PyApp.h; sourceTree = SOURCE_ROOT; };
|
CEFC7F920FC9517500CD5728 /* PyApp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PyApp.h; path = ../../cocoalib/PyApp.h; sourceTree = SOURCE_ROOT; };
|
||||||
CEFC7F930FC9517500CD5728 /* PyRegistrable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PyRegistrable.h; path = cocoalib/PyRegistrable.h; sourceTree = SOURCE_ROOT; };
|
CEFC7F930FC9517500CD5728 /* PyRegistrable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PyRegistrable.h; path = ../../cocoalib/PyRegistrable.h; sourceTree = SOURCE_ROOT; };
|
||||||
CEFC7F940FC9517500CD5728 /* RecentDirectories.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RecentDirectories.h; path = cocoalib/RecentDirectories.h; sourceTree = SOURCE_ROOT; };
|
CEFC7F940FC9517500CD5728 /* RecentDirectories.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RecentDirectories.h; path = ../../cocoalib/RecentDirectories.h; sourceTree = SOURCE_ROOT; };
|
||||||
CEFC7F950FC9517500CD5728 /* RecentDirectories.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RecentDirectories.m; path = cocoalib/RecentDirectories.m; sourceTree = SOURCE_ROOT; };
|
CEFC7F950FC9517500CD5728 /* RecentDirectories.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RecentDirectories.m; path = ../../cocoalib/RecentDirectories.m; sourceTree = SOURCE_ROOT; };
|
||||||
CEFC7F960FC9517500CD5728 /* RegistrationInterface.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RegistrationInterface.h; path = cocoalib/RegistrationInterface.h; sourceTree = SOURCE_ROOT; };
|
CEFC7F960FC9517500CD5728 /* RegistrationInterface.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RegistrationInterface.h; path = ../../cocoalib/RegistrationInterface.h; sourceTree = SOURCE_ROOT; };
|
||||||
CEFC7F970FC9517500CD5728 /* RegistrationInterface.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RegistrationInterface.m; path = cocoalib/RegistrationInterface.m; sourceTree = SOURCE_ROOT; };
|
CEFC7F970FC9517500CD5728 /* RegistrationInterface.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RegistrationInterface.m; path = ../../cocoalib/RegistrationInterface.m; sourceTree = SOURCE_ROOT; };
|
||||||
CEFC7F980FC9517500CD5728 /* Table.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Table.h; path = cocoalib/Table.h; sourceTree = SOURCE_ROOT; };
|
CEFC7F9A0FC9517500CD5728 /* Utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Utils.h; path = ../../cocoalib/Utils.h; sourceTree = SOURCE_ROOT; };
|
||||||
CEFC7F990FC9517500CD5728 /* Table.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Table.m; path = cocoalib/Table.m; sourceTree = SOURCE_ROOT; };
|
CEFC7F9B0FC9517500CD5728 /* Utils.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Utils.m; path = ../../cocoalib/Utils.m; sourceTree = SOURCE_ROOT; };
|
||||||
CEFC7F9A0FC9517500CD5728 /* Utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Utils.h; path = cocoalib/Utils.h; sourceTree = SOURCE_ROOT; };
|
CEFC7F9C0FC9517500CD5728 /* ValueTransformers.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ValueTransformers.h; path = ../../cocoalib/ValueTransformers.h; sourceTree = SOURCE_ROOT; };
|
||||||
CEFC7F9B0FC9517500CD5728 /* Utils.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Utils.m; path = cocoalib/Utils.m; sourceTree = SOURCE_ROOT; };
|
CEFC7F9D0FC9517500CD5728 /* ValueTransformers.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = ValueTransformers.m; path = ../../cocoalib/ValueTransformers.m; sourceTree = SOURCE_ROOT; };
|
||||||
CEFC7F9C0FC9517500CD5728 /* ValueTransformers.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ValueTransformers.h; path = cocoalib/ValueTransformers.h; sourceTree = SOURCE_ROOT; };
|
CEFC7FB10FC951A700CD5728 /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = ../base/AppDelegate.h; sourceTree = SOURCE_ROOT; };
|
||||||
CEFC7F9D0FC9517500CD5728 /* ValueTransformers.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = ValueTransformers.m; path = cocoalib/ValueTransformers.m; sourceTree = SOURCE_ROOT; };
|
CEFC7FB20FC951A700CD5728 /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AppDelegate.m; path = ../base/AppDelegate.m; sourceTree = SOURCE_ROOT; };
|
||||||
CEFC7FA80FC9518A00CD5728 /* English */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = English; path = cocoalib/English.lproj/ErrorReportWindow.xib; sourceTree = "<group>"; };
|
CEFC7FB30FC951A700CD5728 /* Consts.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Consts.h; path = ../base/Consts.h; sourceTree = SOURCE_ROOT; };
|
||||||
CEFC7FAA0FC9518A00CD5728 /* English */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = English; path = cocoalib/English.lproj/progress.nib; sourceTree = "<group>"; };
|
CEFC7FB40FC951A700CD5728 /* DirectoryPanel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DirectoryPanel.h; path = ../base/DirectoryPanel.h; sourceTree = SOURCE_ROOT; };
|
||||||
CEFC7FAC0FC9518A00CD5728 /* English */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = English; path = cocoalib/English.lproj/registration.nib; sourceTree = "<group>"; };
|
CEFC7FB50FC951A700CD5728 /* DirectoryPanel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = DirectoryPanel.m; path = ../base/DirectoryPanel.m; sourceTree = SOURCE_ROOT; };
|
||||||
CEFC7FB10FC951A700CD5728 /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = dgbase/AppDelegate.h; sourceTree = SOURCE_ROOT; };
|
CEFC7FB60FC951A700CD5728 /* PyDupeGuru.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PyDupeGuru.h; path = ../base/PyDupeGuru.h; sourceTree = SOURCE_ROOT; };
|
||||||
CEFC7FB20FC951A700CD5728 /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AppDelegate.m; path = dgbase/AppDelegate.m; sourceTree = SOURCE_ROOT; };
|
CEFC7FB70FC951A700CD5728 /* ResultWindow.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ResultWindow.h; path = ../base/ResultWindow.h; sourceTree = SOURCE_ROOT; };
|
||||||
CEFC7FB30FC951A700CD5728 /* Consts.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Consts.h; path = dgbase/Consts.h; sourceTree = SOURCE_ROOT; };
|
CEFC7FB80FC951A700CD5728 /* ResultWindow.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = ResultWindow.m; path = ../base/ResultWindow.m; sourceTree = SOURCE_ROOT; };
|
||||||
CEFC7FB40FC951A700CD5728 /* DirectoryPanel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DirectoryPanel.h; path = dgbase/DirectoryPanel.h; sourceTree = SOURCE_ROOT; };
|
|
||||||
CEFC7FB50FC951A700CD5728 /* DirectoryPanel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = DirectoryPanel.m; path = dgbase/DirectoryPanel.m; sourceTree = SOURCE_ROOT; };
|
|
||||||
CEFC7FB60FC951A700CD5728 /* PyDupeGuru.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PyDupeGuru.h; path = dgbase/PyDupeGuru.h; sourceTree = SOURCE_ROOT; };
|
|
||||||
CEFC7FB70FC951A700CD5728 /* ResultWindow.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ResultWindow.h; path = dgbase/ResultWindow.h; sourceTree = SOURCE_ROOT; };
|
|
||||||
CEFC7FB80FC951A700CD5728 /* ResultWindow.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = ResultWindow.m; path = dgbase/ResultWindow.m; sourceTree = SOURCE_ROOT; };
|
|
||||||
CEFF18A009A4D387005E6321 /* PyDupeGuru.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = PyDupeGuru.h; sourceTree = SOURCE_ROOT; };
|
CEFF18A009A4D387005E6321 /* PyDupeGuru.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = PyDupeGuru.h; sourceTree = SOURCE_ROOT; };
|
||||||
/* End PBXFileReference section */
|
/* End PBXFileReference section */
|
||||||
|
|
||||||
@@ -154,11 +134,6 @@
|
|||||||
children = (
|
children = (
|
||||||
CE381C9509914ACE003581CE /* AppDelegate.h */,
|
CE381C9509914ACE003581CE /* AppDelegate.h */,
|
||||||
CE381C9409914ACE003581CE /* AppDelegate.m */,
|
CE381C9409914ACE003581CE /* AppDelegate.m */,
|
||||||
CE848A1809DD85810004CB44 /* Consts.h */,
|
|
||||||
CECA899A09DB132E00A3D774 /* DetailsPanel.h */,
|
|
||||||
CECA899B09DB132E00A3D774 /* DetailsPanel.m */,
|
|
||||||
CE68EE6509ABC48000971085 /* DirectoryPanel.h */,
|
|
||||||
CE68EE6609ABC48000971085 /* DirectoryPanel.m */,
|
|
||||||
CEFF18A009A4D387005E6321 /* PyDupeGuru.h */,
|
CEFF18A009A4D387005E6321 /* PyDupeGuru.h */,
|
||||||
CE381C9B09914ADF003581CE /* ResultWindow.h */,
|
CE381C9B09914ADF003581CE /* ResultWindow.h */,
|
||||||
CE381C9A09914ADF003581CE /* ResultWindow.m */,
|
CE381C9A09914ADF003581CE /* ResultWindow.m */,
|
||||||
@@ -213,13 +188,10 @@
|
|||||||
CE073F5409CAE1A3005C1D2F /* dupeguru_help */,
|
CE073F5409CAE1A3005C1D2F /* dupeguru_help */,
|
||||||
CE381CF509915304003581CE /* dg_cocoa.plugin */,
|
CE381CF509915304003581CE /* dg_cocoa.plugin */,
|
||||||
CEFC294309C89E0000D9F998 /* images */,
|
CEFC294309C89E0000D9F998 /* images */,
|
||||||
|
CEEFC0CA10943849001F3A39 /* xib */,
|
||||||
CEEB135109C837A2004D2330 /* dupeguru.icns */,
|
CEEB135109C837A2004D2330 /* dupeguru.icns */,
|
||||||
8D1107310486CEB800E47090 /* Info.plist */,
|
8D1107310486CEB800E47090 /* Info.plist */,
|
||||||
089C165CFE840E0CC02AAC07 /* InfoPlist.strings */,
|
|
||||||
CE6E0DFD1054E9EF008D9390 /* dsa_pub.pem */,
|
CE6E0DFD1054E9EF008D9390 /* dsa_pub.pem */,
|
||||||
CECA899709DB12CA00A3D774 /* Details.nib */,
|
|
||||||
CE3AA46509DB207900DB3A21 /* Directories.nib */,
|
|
||||||
29B97318FDCFA39411CA2CEA /* MainMenu.nib */,
|
|
||||||
);
|
);
|
||||||
name = Resources;
|
name = Resources;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
@@ -233,23 +205,41 @@
|
|||||||
name = Frameworks;
|
name = Frameworks;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
};
|
};
|
||||||
|
CE19BC5F11199231007CCEB0 /* xib */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
CE19BC6011199231007CCEB0 /* ErrorReportWindow.xib */,
|
||||||
|
CE19BC6111199231007CCEB0 /* progress.xib */,
|
||||||
|
CE19BC6211199231007CCEB0 /* registration.xib */,
|
||||||
|
);
|
||||||
|
name = xib;
|
||||||
|
path = ../../cocoalib/xib;
|
||||||
|
sourceTree = SOURCE_ROOT;
|
||||||
|
};
|
||||||
CEDD92D50FDD01640031C7B7 /* brsinglelineformatter */ = {
|
CEDD92D50FDD01640031C7B7 /* brsinglelineformatter */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
CEDD92D60FDD01640031C7B7 /* BRSingleLineFormatter.h */,
|
CEDD92D60FDD01640031C7B7 /* BRSingleLineFormatter.h */,
|
||||||
CEDD92D70FDD01640031C7B7 /* BRSingleLineFormatter.m */,
|
CEDD92D70FDD01640031C7B7 /* BRSingleLineFormatter.m */,
|
||||||
CEDD92D80FDD01640031C7B7 /* NSCharacterSet_Extensions.h */,
|
|
||||||
CEDD92D90FDD01640031C7B7 /* NSCharacterSet_Extensions.m */,
|
|
||||||
);
|
);
|
||||||
name = brsinglelineformatter;
|
name = brsinglelineformatter;
|
||||||
path = cocoalib/brsinglelineformatter;
|
path = ../../cocoalib/brsinglelineformatter;
|
||||||
sourceTree = SOURCE_ROOT;
|
sourceTree = SOURCE_ROOT;
|
||||||
};
|
};
|
||||||
|
CEEFC0CA10943849001F3A39 /* xib */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
CE3A46F9109B212E002ABFD5 /* MainMenu.xib */,
|
||||||
|
CEAC6810109B0B7E00B43C85 /* Preferences.xib */,
|
||||||
|
CEEFC0F710945D9F001F3A39 /* DirectoryPanel.xib */,
|
||||||
|
CEEFC0FA10945E37001F3A39 /* DetailsPanel.xib */,
|
||||||
|
);
|
||||||
|
name = xib;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
CEFC294309C89E0000D9F998 /* images */ = {
|
CEFC294309C89E0000D9F998 /* images */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
CEF7823709C8AA0200EF38FF /* gear.png */,
|
|
||||||
CEFC295D09C8A0B000D9F998 /* dgse_logo_32.png */,
|
|
||||||
CEFC295309C89FF200D9F998 /* details32.png */,
|
CEFC295309C89FF200D9F998 /* details32.png */,
|
||||||
CEFC295409C89FF200D9F998 /* preferences32.png */,
|
CEFC295409C89FF200D9F998 /* preferences32.png */,
|
||||||
CEFC294509C89E3D00D9F998 /* folder32.png */,
|
CEFC294509C89E3D00D9F998 /* folder32.png */,
|
||||||
@@ -260,10 +250,8 @@
|
|||||||
CEFC7F890FC9513600CD5728 /* cocoalib */ = {
|
CEFC7F890FC9513600CD5728 /* cocoalib */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
|
CE19BC5F11199231007CCEB0 /* xib */,
|
||||||
CEDD92D50FDD01640031C7B7 /* brsinglelineformatter */,
|
CEDD92D50FDD01640031C7B7 /* brsinglelineformatter */,
|
||||||
CEFC7FA70FC9518A00CD5728 /* ErrorReportWindow.xib */,
|
|
||||||
CEFC7FA90FC9518A00CD5728 /* progress.nib */,
|
|
||||||
CEFC7FAB0FC9518A00CD5728 /* registration.nib */,
|
|
||||||
CEFC7F8A0FC9517500CD5728 /* Dialogs.h */,
|
CEFC7F8A0FC9517500CD5728 /* Dialogs.h */,
|
||||||
CEFC7F8B0FC9517500CD5728 /* Dialogs.m */,
|
CEFC7F8B0FC9517500CD5728 /* Dialogs.m */,
|
||||||
CEFC7F8C0FC9517500CD5728 /* HSErrorReportWindow.h */,
|
CEFC7F8C0FC9517500CD5728 /* HSErrorReportWindow.h */,
|
||||||
@@ -278,8 +266,6 @@
|
|||||||
CEFC7F950FC9517500CD5728 /* RecentDirectories.m */,
|
CEFC7F950FC9517500CD5728 /* RecentDirectories.m */,
|
||||||
CEFC7F960FC9517500CD5728 /* RegistrationInterface.h */,
|
CEFC7F960FC9517500CD5728 /* RegistrationInterface.h */,
|
||||||
CEFC7F970FC9517500CD5728 /* RegistrationInterface.m */,
|
CEFC7F970FC9517500CD5728 /* RegistrationInterface.m */,
|
||||||
CEFC7F980FC9517500CD5728 /* Table.h */,
|
|
||||||
CEFC7F990FC9517500CD5728 /* Table.m */,
|
|
||||||
CEFC7F9A0FC9517500CD5728 /* Utils.h */,
|
CEFC7F9A0FC9517500CD5728 /* Utils.h */,
|
||||||
CEFC7F9B0FC9517500CD5728 /* Utils.m */,
|
CEFC7F9B0FC9517500CD5728 /* Utils.m */,
|
||||||
CEFC7F9C0FC9517500CD5728 /* ValueTransformers.h */,
|
CEFC7F9C0FC9517500CD5728 /* ValueTransformers.h */,
|
||||||
@@ -299,6 +285,7 @@
|
|||||||
CEFC7FB40FC951A700CD5728 /* DirectoryPanel.h */,
|
CEFC7FB40FC951A700CD5728 /* DirectoryPanel.h */,
|
||||||
CEFC7FB50FC951A700CD5728 /* DirectoryPanel.m */,
|
CEFC7FB50FC951A700CD5728 /* DirectoryPanel.m */,
|
||||||
CEFC7FB60FC951A700CD5728 /* PyDupeGuru.h */,
|
CEFC7FB60FC951A700CD5728 /* PyDupeGuru.h */,
|
||||||
|
CE6E7407111C997500C350E3 /* PyDetailsPanel.h */,
|
||||||
CEFC7FB70FC951A700CD5728 /* ResultWindow.h */,
|
CEFC7FB70FC951A700CD5728 /* ResultWindow.h */,
|
||||||
CEFC7FB80FC951A700CD5728 /* ResultWindow.m */,
|
CEFC7FB80FC951A700CD5728 /* ResultWindow.m */,
|
||||||
);
|
);
|
||||||
@@ -352,22 +339,20 @@
|
|||||||
isa = PBXResourcesBuildPhase;
|
isa = PBXResourcesBuildPhase;
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
files = (
|
files = (
|
||||||
8D11072A0486CEB800E47090 /* MainMenu.nib in Resources */,
|
|
||||||
8D11072B0486CEB800E47090 /* InfoPlist.strings in Resources */,
|
|
||||||
CE381D0509915304003581CE /* dg_cocoa.plugin in Resources */,
|
CE381D0509915304003581CE /* dg_cocoa.plugin in Resources */,
|
||||||
CE073F6309CAE1A3005C1D2F /* dupeguru_help in Resources */,
|
CE073F6309CAE1A3005C1D2F /* dupeguru_help in Resources */,
|
||||||
CEEB135209C837A2004D2330 /* dupeguru.icns in Resources */,
|
CEEB135209C837A2004D2330 /* dupeguru.icns in Resources */,
|
||||||
CEFC294609C89E3D00D9F998 /* folder32.png in Resources */,
|
CEFC294609C89E3D00D9F998 /* folder32.png in Resources */,
|
||||||
CEFC295509C89FF200D9F998 /* details32.png in Resources */,
|
CEFC295509C89FF200D9F998 /* details32.png in Resources */,
|
||||||
CEFC295609C89FF200D9F998 /* preferences32.png in Resources */,
|
CEFC295609C89FF200D9F998 /* preferences32.png in Resources */,
|
||||||
CEFC295E09C8A0B000D9F998 /* dgse_logo_32.png in Resources */,
|
|
||||||
CEF7823809C8AA0200EF38FF /* gear.png in Resources */,
|
|
||||||
CECA899909DB12CA00A3D774 /* Details.nib in Resources */,
|
|
||||||
CE3AA46709DB207900DB3A21 /* Directories.nib in Resources */,
|
|
||||||
CEFC7FAD0FC9518A00CD5728 /* ErrorReportWindow.xib in Resources */,
|
|
||||||
CEFC7FAE0FC9518A00CD5728 /* progress.nib in Resources */,
|
|
||||||
CEFC7FAF0FC9518A00CD5728 /* registration.nib in Resources */,
|
|
||||||
CE6E0DFE1054E9EF008D9390 /* dsa_pub.pem in Resources */,
|
CE6E0DFE1054E9EF008D9390 /* dsa_pub.pem in Resources */,
|
||||||
|
CEEFC0F810945D9F001F3A39 /* DirectoryPanel.xib in Resources */,
|
||||||
|
CEEFC0FB10945E37001F3A39 /* DetailsPanel.xib in Resources */,
|
||||||
|
CEAC6811109B0B7E00B43C85 /* Preferences.xib in Resources */,
|
||||||
|
CE3A46FA109B212E002ABFD5 /* MainMenu.xib in Resources */,
|
||||||
|
CE19BC6311199231007CCEB0 /* ErrorReportWindow.xib in Resources */,
|
||||||
|
CE19BC6411199231007CCEB0 /* progress.xib in Resources */,
|
||||||
|
CE19BC6511199231007CCEB0 /* registration.xib in Resources */,
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
@@ -381,159 +366,73 @@
|
|||||||
8D11072D0486CEB800E47090 /* main.m in Sources */,
|
8D11072D0486CEB800E47090 /* main.m in Sources */,
|
||||||
CE381C9609914ACE003581CE /* AppDelegate.m in Sources */,
|
CE381C9609914ACE003581CE /* AppDelegate.m in Sources */,
|
||||||
CE381C9C09914ADF003581CE /* ResultWindow.m in Sources */,
|
CE381C9C09914ADF003581CE /* ResultWindow.m in Sources */,
|
||||||
CE68EE6809ABC48000971085 /* DirectoryPanel.m in Sources */,
|
|
||||||
CECA899D09DB132E00A3D774 /* DetailsPanel.m in Sources */,
|
|
||||||
CEFC7F9E0FC9517500CD5728 /* Dialogs.m in Sources */,
|
CEFC7F9E0FC9517500CD5728 /* Dialogs.m in Sources */,
|
||||||
CEFC7F9F0FC9517500CD5728 /* HSErrorReportWindow.m in Sources */,
|
CEFC7F9F0FC9517500CD5728 /* HSErrorReportWindow.m in Sources */,
|
||||||
CEFC7FA00FC9517500CD5728 /* Outline.m in Sources */,
|
CEFC7FA00FC9517500CD5728 /* Outline.m in Sources */,
|
||||||
CEFC7FA10FC9517500CD5728 /* ProgressController.m in Sources */,
|
CEFC7FA10FC9517500CD5728 /* ProgressController.m in Sources */,
|
||||||
CEFC7FA20FC9517500CD5728 /* RecentDirectories.m in Sources */,
|
CEFC7FA20FC9517500CD5728 /* RecentDirectories.m in Sources */,
|
||||||
CEFC7FA30FC9517500CD5728 /* RegistrationInterface.m in Sources */,
|
CEFC7FA30FC9517500CD5728 /* RegistrationInterface.m in Sources */,
|
||||||
CEFC7FA40FC9517500CD5728 /* Table.m in Sources */,
|
|
||||||
CEFC7FA50FC9517500CD5728 /* Utils.m in Sources */,
|
CEFC7FA50FC9517500CD5728 /* Utils.m in Sources */,
|
||||||
CEFC7FA60FC9517500CD5728 /* ValueTransformers.m in Sources */,
|
CEFC7FA60FC9517500CD5728 /* ValueTransformers.m in Sources */,
|
||||||
CEFC7FB90FC951A700CD5728 /* AppDelegate.m in Sources */,
|
CEFC7FB90FC951A700CD5728 /* AppDelegate.m in Sources */,
|
||||||
CEFC7FBA0FC951A700CD5728 /* DirectoryPanel.m in Sources */,
|
CEFC7FBA0FC951A700CD5728 /* DirectoryPanel.m in Sources */,
|
||||||
CEFC7FBB0FC951A700CD5728 /* ResultWindow.m in Sources */,
|
CEFC7FBB0FC951A700CD5728 /* ResultWindow.m in Sources */,
|
||||||
CEDD92DA0FDD01640031C7B7 /* BRSingleLineFormatter.m in Sources */,
|
CEDD92DA0FDD01640031C7B7 /* BRSingleLineFormatter.m in Sources */,
|
||||||
CEDD92DB0FDD01640031C7B7 /* NSCharacterSet_Extensions.m in Sources */,
|
|
||||||
CEE7EA130FE675C80004E467 /* DetailsPanel.m in Sources */,
|
CEE7EA130FE675C80004E467 /* DetailsPanel.m in Sources */,
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
/* End PBXSourcesBuildPhase section */
|
/* End PBXSourcesBuildPhase section */
|
||||||
|
|
||||||
/* Begin PBXVariantGroup section */
|
|
||||||
089C165CFE840E0CC02AAC07 /* InfoPlist.strings */ = {
|
|
||||||
isa = PBXVariantGroup;
|
|
||||||
children = (
|
|
||||||
089C165DFE840E0CC02AAC07 /* English */,
|
|
||||||
);
|
|
||||||
name = InfoPlist.strings;
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
29B97318FDCFA39411CA2CEA /* MainMenu.nib */ = {
|
|
||||||
isa = PBXVariantGroup;
|
|
||||||
children = (
|
|
||||||
29B97319FDCFA39411CA2CEA /* English */,
|
|
||||||
);
|
|
||||||
name = MainMenu.nib;
|
|
||||||
sourceTree = SOURCE_ROOT;
|
|
||||||
};
|
|
||||||
CE3AA46509DB207900DB3A21 /* Directories.nib */ = {
|
|
||||||
isa = PBXVariantGroup;
|
|
||||||
children = (
|
|
||||||
CE3AA46609DB207900DB3A21 /* English */,
|
|
||||||
);
|
|
||||||
name = Directories.nib;
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
CECA899709DB12CA00A3D774 /* Details.nib */ = {
|
|
||||||
isa = PBXVariantGroup;
|
|
||||||
children = (
|
|
||||||
CECA899809DB12CA00A3D774 /* English */,
|
|
||||||
);
|
|
||||||
name = Details.nib;
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
CEFC7FA70FC9518A00CD5728 /* ErrorReportWindow.xib */ = {
|
|
||||||
isa = PBXVariantGroup;
|
|
||||||
children = (
|
|
||||||
CEFC7FA80FC9518A00CD5728 /* English */,
|
|
||||||
);
|
|
||||||
name = ErrorReportWindow.xib;
|
|
||||||
sourceTree = SOURCE_ROOT;
|
|
||||||
};
|
|
||||||
CEFC7FA90FC9518A00CD5728 /* progress.nib */ = {
|
|
||||||
isa = PBXVariantGroup;
|
|
||||||
children = (
|
|
||||||
CEFC7FAA0FC9518A00CD5728 /* English */,
|
|
||||||
);
|
|
||||||
name = progress.nib;
|
|
||||||
sourceTree = SOURCE_ROOT;
|
|
||||||
};
|
|
||||||
CEFC7FAB0FC9518A00CD5728 /* registration.nib */ = {
|
|
||||||
isa = PBXVariantGroup;
|
|
||||||
children = (
|
|
||||||
CEFC7FAC0FC9518A00CD5728 /* English */,
|
|
||||||
);
|
|
||||||
name = registration.nib;
|
|
||||||
sourceTree = SOURCE_ROOT;
|
|
||||||
};
|
|
||||||
/* End PBXVariantGroup section */
|
|
||||||
|
|
||||||
/* Begin XCBuildConfiguration section */
|
/* Begin XCBuildConfiguration section */
|
||||||
C01FCF4B08A954540054247B /* Debug */ = {
|
C01FCF4C08A954540054247B /* release */ = {
|
||||||
isa = XCBuildConfiguration;
|
isa = XCBuildConfiguration;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
COPY_PHASE_STRIP = NO;
|
GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
|
||||||
FRAMEWORK_SEARCH_PATHS = (
|
|
||||||
"$(FRAMEWORK_SEARCH_PATHS)",
|
|
||||||
"$(SRCROOT)/../../../cocoalib/build/Release",
|
|
||||||
"$(FRAMEWORK_SEARCH_PATHS_QUOTED_FOR_TARGET_1)",
|
|
||||||
);
|
|
||||||
FRAMEWORK_SEARCH_PATHS_QUOTED_FOR_TARGET_1 = "\"$(SRCROOT)/../../base/cocoa/build/Release\"";
|
|
||||||
GCC_DYNAMIC_NO_PIC = NO;
|
|
||||||
GCC_ENABLE_FIX_AND_CONTINUE = YES;
|
|
||||||
GCC_MODEL_TUNING = G5;
|
|
||||||
GCC_OPTIMIZATION_LEVEL = 0;
|
|
||||||
INFOPLIST_FILE = Info.plist;
|
INFOPLIST_FILE = Info.plist;
|
||||||
INSTALL_PATH = "$(HOME)/Applications";
|
INSTALL_PATH = "$(HOME)/Applications";
|
||||||
PRODUCT_NAME = dupeGuru;
|
PRODUCT_NAME = dupeGuru;
|
||||||
WRAPPER_EXTENSION = app;
|
WRAPPER_EXTENSION = app;
|
||||||
ZERO_LINK = YES;
|
|
||||||
};
|
};
|
||||||
name = Debug;
|
name = release;
|
||||||
};
|
};
|
||||||
C01FCF4C08A954540054247B /* Release */ = {
|
C01FCF5008A954540054247B /* release */ = {
|
||||||
isa = XCBuildConfiguration;
|
isa = XCBuildConfiguration;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
ARCHS = (
|
ARCHS = (
|
||||||
ppc,
|
|
||||||
i386,
|
i386,
|
||||||
|
x86_64,
|
||||||
|
ppc,
|
||||||
);
|
);
|
||||||
FRAMEWORK_SEARCH_PATHS = (
|
GCC_C_LANGUAGE_STANDARD = c99;
|
||||||
"$(FRAMEWORK_SEARCH_PATHS)",
|
GCC_WARN_ABOUT_RETURN_TYPE = YES;
|
||||||
"$(SRCROOT)/../../../cocoalib/build/Release",
|
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||||
"$(FRAMEWORK_SEARCH_PATHS_QUOTED_FOR_TARGET_1)",
|
MACOSX_DEPLOYMENT_TARGET = 10.5;
|
||||||
);
|
SDKROOT = "$(DEVELOPER_SDK_DIR)/MacOSX10.5.sdk";
|
||||||
FRAMEWORK_SEARCH_PATHS_QUOTED_FOR_TARGET_1 = "\"$(SRCROOT)/../../base/cocoa/build/Release\"";
|
};
|
||||||
GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
|
name = release;
|
||||||
GCC_MODEL_TUNING = G5;
|
};
|
||||||
|
CE85E84F111AF63D00187B0D /* dev */ = {
|
||||||
|
isa = XCBuildConfiguration;
|
||||||
|
buildSettings = {
|
||||||
|
ARCHS = "$(NATIVE_ARCH_ACTUAL)";
|
||||||
|
GCC_C_LANGUAGE_STANDARD = c99;
|
||||||
|
GCC_WARN_ABOUT_RETURN_TYPE = YES;
|
||||||
|
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||||
|
MACOSX_DEPLOYMENT_TARGET = 10.5;
|
||||||
|
SDKROOT = "$(DEVELOPER_SDK_DIR)/MacOSX10.5.sdk";
|
||||||
|
};
|
||||||
|
name = dev;
|
||||||
|
};
|
||||||
|
CE85E850111AF63D00187B0D /* dev */ = {
|
||||||
|
isa = XCBuildConfiguration;
|
||||||
|
buildSettings = {
|
||||||
INFOPLIST_FILE = Info.plist;
|
INFOPLIST_FILE = Info.plist;
|
||||||
INSTALL_PATH = "$(HOME)/Applications";
|
INSTALL_PATH = "$(HOME)/Applications";
|
||||||
PRODUCT_NAME = dupeGuru;
|
PRODUCT_NAME = dupeGuru;
|
||||||
WRAPPER_EXTENSION = app;
|
WRAPPER_EXTENSION = app;
|
||||||
};
|
};
|
||||||
name = Release;
|
name = dev;
|
||||||
};
|
|
||||||
C01FCF4F08A954540054247B /* Debug */ = {
|
|
||||||
isa = XCBuildConfiguration;
|
|
||||||
buildSettings = {
|
|
||||||
GCC_C_LANGUAGE_STANDARD = c99;
|
|
||||||
GCC_WARN_ABOUT_RETURN_TYPE = YES;
|
|
||||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
|
||||||
MACOSX_DEPLOYMENT_TARGET = 10.4;
|
|
||||||
PREBINDING = NO;
|
|
||||||
SDKROOT = "$(DEVELOPER_SDK_DIR)/MacOSX10.4u.sdk";
|
|
||||||
};
|
|
||||||
name = Debug;
|
|
||||||
};
|
|
||||||
C01FCF5008A954540054247B /* Release */ = {
|
|
||||||
isa = XCBuildConfiguration;
|
|
||||||
buildSettings = {
|
|
||||||
ARCHS = "$(ARCHS_STANDARD_32_BIT_PRE_XCODE_3_1)";
|
|
||||||
ARCHS_STANDARD_32_BIT_PRE_XCODE_3_1 = "ppc i386";
|
|
||||||
FRAMEWORK_SEARCH_PATHS = "@executable_path/../Frameworks";
|
|
||||||
GCC_C_LANGUAGE_STANDARD = c99;
|
|
||||||
GCC_VERSION = 4.0;
|
|
||||||
GCC_WARN_ABOUT_RETURN_TYPE = YES;
|
|
||||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
|
||||||
MACOSX_DEPLOYMENT_TARGET = 10.4;
|
|
||||||
PREBINDING = NO;
|
|
||||||
SDKROOT = "$(DEVELOPER_SDK_DIR)/MacOSX10.4u.sdk";
|
|
||||||
};
|
|
||||||
name = Release;
|
|
||||||
};
|
};
|
||||||
/* End XCBuildConfiguration section */
|
/* End XCBuildConfiguration section */
|
||||||
|
|
||||||
@@ -541,20 +440,20 @@
|
|||||||
C01FCF4A08A954540054247B /* Build configuration list for PBXNativeTarget "dupeguru" */ = {
|
C01FCF4A08A954540054247B /* Build configuration list for PBXNativeTarget "dupeguru" */ = {
|
||||||
isa = XCConfigurationList;
|
isa = XCConfigurationList;
|
||||||
buildConfigurations = (
|
buildConfigurations = (
|
||||||
C01FCF4B08A954540054247B /* Debug */,
|
C01FCF4C08A954540054247B /* release */,
|
||||||
C01FCF4C08A954540054247B /* Release */,
|
CE85E850111AF63D00187B0D /* dev */,
|
||||||
);
|
);
|
||||||
defaultConfigurationIsVisible = 0;
|
defaultConfigurationIsVisible = 0;
|
||||||
defaultConfigurationName = Release;
|
defaultConfigurationName = release;
|
||||||
};
|
};
|
||||||
C01FCF4E08A954540054247B /* Build configuration list for PBXProject "dupeguru" */ = {
|
C01FCF4E08A954540054247B /* Build configuration list for PBXProject "dupeguru" */ = {
|
||||||
isa = XCConfigurationList;
|
isa = XCConfigurationList;
|
||||||
buildConfigurations = (
|
buildConfigurations = (
|
||||||
C01FCF4F08A954540054247B /* Debug */,
|
C01FCF5008A954540054247B /* release */,
|
||||||
C01FCF5008A954540054247B /* Release */,
|
CE85E84F111AF63D00187B0D /* dev */,
|
||||||
);
|
);
|
||||||
defaultConfigurationIsVisible = 0;
|
defaultConfigurationIsVisible = 0;
|
||||||
defaultConfigurationName = Release;
|
defaultConfigurationName = release;
|
||||||
};
|
};
|
||||||
/* End XCConfigurationList section */
|
/* End XCConfigurationList section */
|
||||||
};
|
};
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
Copyright 2009 Hardcoded Software (http://www.hardcoded.net)
|
Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
|
||||||
|
|
||||||
This software is licensed under the "HS" License as described in the "LICENSE" file,
|
This software is licensed under the "HS" License as described in the "LICENSE" file,
|
||||||
which should be included with this package. The terms are also available at
|
which should be included with this package. The terms are also available at
|
||||||
@@ -7,10 +7,12 @@ http://www.hardcoded.net/licenses/hs_license
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#import <Cocoa/Cocoa.h>
|
#import <Cocoa/Cocoa.h>
|
||||||
|
#import "Utils.h"
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
|
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
|
||||||
|
[Utils setPluginName:@"dg_cocoa"];
|
||||||
NSString *pluginPath = [[NSBundle mainBundle]
|
NSString *pluginPath = [[NSBundle mainBundle]
|
||||||
pathForResource:@"dg_cocoa"
|
pathForResource:@"dg_cocoa"
|
||||||
ofType:@"plugin"];
|
ofType:@"plugin"];
|
||||||
2122
cocoa/se/xib/Preferences.xib
Normal file
2122
cocoa/se/xib/Preferences.xib
Normal file
File diff suppressed because it is too large
Load Diff
39
configure.py
Normal file
39
configure.py
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Created By: Virgil Dupras
|
||||||
|
# Created On: 2009-12-30
|
||||||
|
# Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
|
||||||
|
#
|
||||||
|
# This software is licensed under the "HS" License as described in the "LICENSE" file,
|
||||||
|
# which should be included with this package. The terms are also available at
|
||||||
|
# http://www.hardcoded.net/licenses/hs_license
|
||||||
|
|
||||||
|
import sys
|
||||||
|
from optparse import OptionParser
|
||||||
|
|
||||||
|
import yaml
|
||||||
|
|
||||||
|
def main(edition, ui, dev):
|
||||||
|
if edition not in ('se', 'me', 'pe'):
|
||||||
|
edition = 'se'
|
||||||
|
if ui not in ('cocoa', 'qt'):
|
||||||
|
ui = 'cocoa' if sys.platform == 'darwin' else 'qt'
|
||||||
|
build_type = 'Dev' if dev else 'Release'
|
||||||
|
print "Configuring dupeGuru {0} for UI {1} ({2})".format(edition.upper(), ui, build_type)
|
||||||
|
conf = {
|
||||||
|
'edition': edition,
|
||||||
|
'ui': ui,
|
||||||
|
'dev': dev,
|
||||||
|
}
|
||||||
|
yaml.dump(conf, open('conf.yaml', 'w'))
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
usage = "usage: %prog [options]"
|
||||||
|
parser = OptionParser(usage=usage)
|
||||||
|
parser.add_option('--edition', dest='edition',
|
||||||
|
help="dupeGuru edition to build (se, me or pe). Default is se.")
|
||||||
|
parser.add_option('--ui', dest='ui',
|
||||||
|
help="Type of UI to build. 'qt' or 'cocoa'. Default is determined by your system.")
|
||||||
|
parser.add_option('--dev', action='store_true', dest='dev', default=False,
|
||||||
|
help="If this flag is set, will configure for dev builds.")
|
||||||
|
(options, args) = parser.parse_args()
|
||||||
|
main(options.edition, options.ui, options.dev)
|
||||||
@@ -1,8 +1,7 @@
|
|||||||
#!/usr/bin/env python
|
#!/usr/bin/env python
|
||||||
# Created By: Virgil Dupras
|
# Created By: Virgil Dupras
|
||||||
# Created On: 2006/11/11
|
# Created On: 2006/11/11
|
||||||
# $Id$
|
# Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
|
||||||
# Copyright 2009 Hardcoded Software (http://www.hardcoded.net)
|
|
||||||
#
|
#
|
||||||
# This software is licensed under the "HS" License as described in the "LICENSE" file,
|
# This software is licensed under the "HS" License as described in the "LICENSE" file,
|
||||||
# which should be included with this package. The terms are also available at
|
# which should be included with this package. The terms are also available at
|
||||||
@@ -18,6 +17,7 @@ from hsutil import io, files
|
|||||||
from hsutil.path import Path
|
from hsutil.path import Path
|
||||||
from hsutil.reg import RegistrableApplication, RegistrationRequired
|
from hsutil.reg import RegistrableApplication, RegistrationRequired
|
||||||
from hsutil.misc import flatten, first
|
from hsutil.misc import flatten, first
|
||||||
|
from hsutil.notify import Broadcaster
|
||||||
from hsutil.str import escape
|
from hsutil.str import escape
|
||||||
|
|
||||||
from . import directories, results, scanner, export, fs
|
from . import directories, results, scanner, export, fs
|
||||||
@@ -34,9 +34,12 @@ class NoScannableFileError(Exception):
|
|||||||
class AllFilesAreRefError(Exception):
|
class AllFilesAreRefError(Exception):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
class DupeGuru(RegistrableApplication):
|
class DupeGuru(RegistrableApplication, Broadcaster):
|
||||||
|
DEMO_LIMIT_DESC = "In the demo version, only 10 duplicates per session can be sent to the recycle bin, moved or copied."
|
||||||
|
|
||||||
def __init__(self, data_module, appdata, appid):
|
def __init__(self, data_module, appdata, appid):
|
||||||
RegistrableApplication.__init__(self, appid)
|
RegistrableApplication.__init__(self, appid)
|
||||||
|
Broadcaster.__init__(self)
|
||||||
self.appdata = appdata
|
self.appdata = appdata
|
||||||
if not op.exists(self.appdata):
|
if not op.exists(self.appdata):
|
||||||
os.makedirs(self.appdata)
|
os.makedirs(self.appdata)
|
||||||
@@ -50,6 +53,7 @@ class DupeGuru(RegistrableApplication):
|
|||||||
'escape_filter_regexp': True,
|
'escape_filter_regexp': True,
|
||||||
'clean_empty_dirs': False,
|
'clean_empty_dirs': False,
|
||||||
}
|
}
|
||||||
|
self.selected_dupes = []
|
||||||
|
|
||||||
def _demo_check(self):
|
def _demo_check(self):
|
||||||
if self.registered:
|
if self.registered:
|
||||||
@@ -70,12 +74,10 @@ class DupeGuru(RegistrableApplication):
|
|||||||
|
|
||||||
def _do_delete_dupe(self, dupe):
|
def _do_delete_dupe(self, dupe):
|
||||||
if not io.exists(dupe.path):
|
if not io.exists(dupe.path):
|
||||||
dupe.parent = None
|
|
||||||
return True
|
return True
|
||||||
self._recycle_dupe(dupe)
|
self._recycle_dupe(dupe)
|
||||||
self.clean_empty_dirs(dupe.path[:-1])
|
self.clean_empty_dirs(dupe.path[:-1])
|
||||||
if not io.exists(dupe.path):
|
if not io.exists(dupe.path):
|
||||||
dupe.parent = None
|
|
||||||
return True
|
return True
|
||||||
logging.warning("Could not send {0} to trash.".format(unicode(dupe.path)))
|
logging.warning("Could not send {0} to trash.".format(unicode(dupe.path)))
|
||||||
return False
|
return False
|
||||||
@@ -105,6 +107,12 @@ class DupeGuru(RegistrableApplication):
|
|||||||
def _recycle_dupe(dupe):
|
def _recycle_dupe(dupe):
|
||||||
raise NotImplementedError()
|
raise NotImplementedError()
|
||||||
|
|
||||||
|
def _select_dupes(self, dupes):
|
||||||
|
if dupes == self.selected_dupes:
|
||||||
|
return
|
||||||
|
self.selected_dupes = dupes
|
||||||
|
self.notify('dupes_selected')
|
||||||
|
|
||||||
def _start_job(self, jobid, func):
|
def _start_job(self, jobid, func):
|
||||||
# func(j)
|
# func(j)
|
||||||
raise NotImplementedError()
|
raise NotImplementedError()
|
||||||
@@ -213,15 +221,14 @@ class DupeGuru(RegistrableApplication):
|
|||||||
changed_groups.add(g)
|
changed_groups.add(g)
|
||||||
|
|
||||||
def save(self):
|
def save(self):
|
||||||
try:
|
if not op.exists(self.appdata):
|
||||||
|
os.makedirs(self.appdata)
|
||||||
self.directories.save_to_file(op.join(self.appdata, 'last_directories.xml'))
|
self.directories.save_to_file(op.join(self.appdata, 'last_directories.xml'))
|
||||||
self.results.save_to_xml(op.join(self.appdata, 'last_results.xml'))
|
self.results.save_to_xml(op.join(self.appdata, 'last_results.xml'))
|
||||||
except LookupError:
|
|
||||||
# This is that weird issue from #39 that sometimes happens when auto-updating with
|
|
||||||
# Sparkle. Just ignore it.
|
|
||||||
pass
|
|
||||||
|
|
||||||
def save_ignore_list(self):
|
def save_ignore_list(self):
|
||||||
|
if not op.exists(self.appdata):
|
||||||
|
os.makedirs(self.appdata)
|
||||||
p = op.join(self.appdata, 'ignore_list.xml')
|
p = op.join(self.appdata, 'ignore_list.xml')
|
||||||
self.scanner.ignore_list.save_to_xml(p)
|
self.scanner.ignore_list.save_to_xml(p)
|
||||||
|
|
||||||
@@ -1,19 +1,19 @@
|
|||||||
# Created By: Virgil Dupras
|
# Created By: Virgil Dupras
|
||||||
# Created On: 2006/11/11
|
# Created On: 2006/11/11
|
||||||
# $Id$
|
# Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
|
||||||
# Copyright 2009 Hardcoded Software (http://www.hardcoded.net)
|
|
||||||
#
|
#
|
||||||
# This software is licensed under the "HS" License as described in the "LICENSE" file,
|
# This software is licensed under the "HS" License as described in the "LICENSE" file,
|
||||||
# which should be included with this package. The terms are also available at
|
# which should be included with this package. The terms are also available at
|
||||||
# http://www.hardcoded.net/licenses/hs_license
|
# http://www.hardcoded.net/licenses/hs_license
|
||||||
|
|
||||||
from Foundation import *
|
|
||||||
from AppKit import *
|
|
||||||
import logging
|
import logging
|
||||||
import os.path as op
|
import os.path as op
|
||||||
|
|
||||||
from hsutil import io, cocoa, job
|
from hsutil import cocoa, job
|
||||||
from hsutil.cocoa import install_exception_hook
|
from hsutil.cocoa import install_exception_hook
|
||||||
|
from hsutil.cocoa.objcmin import (NSNotificationCenter, NSUserDefaults,
|
||||||
|
NSSearchPathForDirectoriesInDomains, NSApplicationSupportDirectory, NSUserDomainMask,
|
||||||
|
NSWorkspace, NSWorkspaceRecycleOperation)
|
||||||
from hsutil.misc import stripnone
|
from hsutil.misc import stripnone
|
||||||
from hsutil.reg import RegistrationRequired
|
from hsutil.reg import RegistrationRequired
|
||||||
|
|
||||||
@@ -47,24 +47,15 @@ class DupeGuru(app.DupeGuru):
|
|||||||
app.DupeGuru.__init__(self, data_module, appdata, appid)
|
app.DupeGuru.__init__(self, data_module, appdata, appid)
|
||||||
self.progress = cocoa.ThreadedJobPerformer()
|
self.progress = cocoa.ThreadedJobPerformer()
|
||||||
self.display_delta_values = False
|
self.display_delta_values = False
|
||||||
self.selected_dupes = []
|
|
||||||
self.RefreshDetailsTable(None,None)
|
|
||||||
|
|
||||||
#--- Override
|
#--- Override
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def _recycle_dupe(dupe):
|
def _recycle_dupe(dupe):
|
||||||
if not io.exists(dupe.path):
|
# local import because first appkit import takes a lot of memory. we want to avoid it.
|
||||||
dupe.parent = None
|
directory = unicode(dupe.path[:-1])
|
||||||
return True
|
|
||||||
directory = unicode(dupe.parent.path)
|
|
||||||
filename = dupe.name
|
filename = dupe.name
|
||||||
result, tag = NSWorkspace.sharedWorkspace().performFileOperation_source_destination_files_tag_(
|
result, tag = NSWorkspace.sharedWorkspace().performFileOperation_source_destination_files_tag_(
|
||||||
NSWorkspaceRecycleOperation, directory, '', [filename])
|
NSWorkspaceRecycleOperation, directory, '', [filename], None)
|
||||||
if not io.exists(dupe.path):
|
|
||||||
dupe.parent = None
|
|
||||||
return True
|
|
||||||
logging.warning('Could not send %s to trash. tag: %d' % (unicode(dupe.path), tag))
|
|
||||||
return False
|
|
||||||
|
|
||||||
def _start_job(self, jobid, func):
|
def _start_job(self, jobid, func):
|
||||||
try:
|
try:
|
||||||
@@ -98,14 +89,6 @@ class DupeGuru(app.DupeGuru):
|
|||||||
curr_path = self.directories.get_subfolders(curr_path)[current_index]
|
curr_path = self.directories.get_subfolders(curr_path)[current_index]
|
||||||
return self.get_folder_path(node_path[1:], curr_path)
|
return self.get_folder_path(node_path[1:], curr_path)
|
||||||
|
|
||||||
def RefreshDetailsTable(self,dupe,group):
|
|
||||||
l1 = self._get_display_info(dupe, group, False)
|
|
||||||
# we don't want the two sides of the table to display the stats for the same file
|
|
||||||
ref = group.ref if group is not None and group.ref is not dupe else None
|
|
||||||
l2 = self._get_display_info(ref, group, False)
|
|
||||||
names = [c['display'] for c in self.data.COLUMNS]
|
|
||||||
self.details_table = zip(names,l1,l2)
|
|
||||||
|
|
||||||
#---Public
|
#---Public
|
||||||
def AddSelectedToIgnoreList(self):
|
def AddSelectedToIgnoreList(self):
|
||||||
for dupe in self.selected_dupes:
|
for dupe in self.selected_dupes:
|
||||||
@@ -118,6 +101,7 @@ class DupeGuru(app.DupeGuru):
|
|||||||
self.make_reference(self.selected_dupes)
|
self.make_reference(self.selected_dupes)
|
||||||
|
|
||||||
def OpenSelected(self):
|
def OpenSelected(self):
|
||||||
|
# local import because first appkit import takes a lot of memory. we want to avoid it.
|
||||||
if self.selected_dupes:
|
if self.selected_dupes:
|
||||||
path = unicode(self.selected_dupes[0].path)
|
path = unicode(self.selected_dupes[0].path)
|
||||||
NSWorkspace.sharedWorkspace().openFile_(path)
|
NSWorkspace.sharedWorkspace().openFile_(path)
|
||||||
@@ -125,15 +109,6 @@ class DupeGuru(app.DupeGuru):
|
|||||||
def PurgeIgnoreList(self):
|
def PurgeIgnoreList(self):
|
||||||
self.scanner.ignore_list.Filter(lambda f,s:op.exists(f) and op.exists(s))
|
self.scanner.ignore_list.Filter(lambda f,s:op.exists(f) and op.exists(s))
|
||||||
|
|
||||||
def RefreshDetailsWithSelected(self):
|
|
||||||
if self.selected_dupes:
|
|
||||||
self.RefreshDetailsTable(
|
|
||||||
self.selected_dupes[0],
|
|
||||||
self.results.get_group_of_duplicate(self.selected_dupes[0])
|
|
||||||
)
|
|
||||||
else:
|
|
||||||
self.RefreshDetailsTable(None,None)
|
|
||||||
|
|
||||||
def RemoveDirectory(self,index):
|
def RemoveDirectory(self,index):
|
||||||
try:
|
try:
|
||||||
del self.directories[index]
|
del self.directories[index]
|
||||||
@@ -153,12 +128,13 @@ class DupeGuru(app.DupeGuru):
|
|||||||
return False
|
return False
|
||||||
|
|
||||||
def RevealSelected(self):
|
def RevealSelected(self):
|
||||||
|
# local import because first appkit import takes a lot of memory. we want to avoid it.
|
||||||
if self.selected_dupes:
|
if self.selected_dupes:
|
||||||
path = unicode(self.selected_dupes[0].path)
|
path = unicode(self.selected_dupes[0].path)
|
||||||
NSWorkspace.sharedWorkspace().selectFile_inFileViewerRootedAtPath_(path,'')
|
NSWorkspace.sharedWorkspace().selectFile_inFileViewerRootedAtPath_(path,'')
|
||||||
|
|
||||||
def start_scanning(self):
|
def start_scanning(self):
|
||||||
self.RefreshDetailsTable(None, None)
|
self._select_dupes([])
|
||||||
try:
|
try:
|
||||||
app.DupeGuru.start_scanning(self)
|
app.DupeGuru.start_scanning(self)
|
||||||
return 0
|
return 0
|
||||||
@@ -203,13 +179,12 @@ class DupeGuru(app.DupeGuru):
|
|||||||
return g.ref
|
return g.ref
|
||||||
|
|
||||||
selected = [extract_dupe(self.GetObjects(p)) for p in node_paths]
|
selected = [extract_dupe(self.GetObjects(p)) for p in node_paths]
|
||||||
self.selected_dupes = [dupe for dupe in selected if dupe is not None]
|
self._select_dupes([dupe for dupe in selected if dupe is not None])
|
||||||
|
|
||||||
def SelectPowerMarkerNodePaths(self,node_paths):
|
def SelectPowerMarkerNodePaths(self,node_paths):
|
||||||
rows = [p[0] for p in node_paths]
|
rows = [p[0] for p in node_paths]
|
||||||
self.selected_dupes = [
|
dupes = [self.results.dupes[row] for row in rows if row in xrange(len(self.results.dupes))]
|
||||||
self.results.dupes[row] for row in rows if row in xrange(len(self.results.dupes))
|
self._select_dupes(dupes)
|
||||||
]
|
|
||||||
|
|
||||||
def SetDirectoryState(self, node_path, state):
|
def SetDirectoryState(self, node_path, state):
|
||||||
p = self.get_folder_path(node_path)
|
p = self.get_folder_path(node_path)
|
||||||
@@ -262,7 +237,7 @@ class DupeGuru(app.DupeGuru):
|
|||||||
if tag in (0,2): #Normal results / Power Marker
|
if tag in (0,2): #Normal results / Power Marker
|
||||||
if tag == 0:
|
if tag == 0:
|
||||||
g, d = self.GetObjects(node_path)
|
g, d = self.GetObjects(node_path)
|
||||||
if d is None:
|
if (d is None) and (g is not None):
|
||||||
d = g.ref
|
d = g.ref
|
||||||
else:
|
else:
|
||||||
d = self.results.dupes[node_path[0]]
|
d = self.results.dupes[node_path[0]]
|
||||||
@@ -296,15 +271,3 @@ class DupeGuru(app.DupeGuru):
|
|||||||
else:
|
else:
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
def GetTableViewCount(self, tag):
|
|
||||||
if self.progress._job_running:
|
|
||||||
return 0
|
|
||||||
return len(self.details_table)
|
|
||||||
|
|
||||||
def GetTableViewMarkedIndexes(self,tag):
|
|
||||||
return []
|
|
||||||
|
|
||||||
def GetTableViewValues(self,tag,row):
|
|
||||||
return self.details_table[row]
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,28 +1,29 @@
|
|||||||
# Copyright 2009 Hardcoded Software (http://www.hardcoded.net)
|
# -*- coding: utf-8 -*-
|
||||||
|
# Created By: Virgil Dupras
|
||||||
|
# Created On: 2010-02-02
|
||||||
|
# Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
|
||||||
#
|
#
|
||||||
# This software is licensed under the "HS" License as described in the "LICENSE" file,
|
# This software is licensed under the "HS" License as described in the "LICENSE" file,
|
||||||
# which should be included with this package. The terms are also available at
|
# which should be included with this package. The terms are also available at
|
||||||
# http://www.hardcoded.net/licenses/hs_license
|
# http://www.hardcoded.net/licenses/hs_license
|
||||||
|
|
||||||
import objc
|
# Common interface for all editions' dg_cocoa unit.
|
||||||
from AppKit import *
|
|
||||||
|
|
||||||
from dupeguru_pe import app_cocoa as app_pe_cocoa
|
from hsutil.cocoa.objcmin import NSObject
|
||||||
|
|
||||||
# Fix py2app imports which chokes on relative imports
|
from hsutil.cocoa import signature
|
||||||
from dupeguru import app, app_cocoa, data, directories, engine, export, ignore, results, scanner
|
from hsutil.reg import InvalidCodeError
|
||||||
from dupeguru_pe import block, cache, matchbase, data
|
|
||||||
|
from .gui.details_panel import DetailsPanel
|
||||||
|
|
||||||
|
# Fix py2app's problems on relative imports
|
||||||
|
from core import app, app_cocoa, data, directories, engine, export, ignore, results, fs, scanner
|
||||||
from hsutil import conflict
|
from hsutil import conflict
|
||||||
|
|
||||||
class PyApp(NSObject):
|
class PyApp(NSObject):
|
||||||
pass #fake class
|
pass #fake class
|
||||||
|
|
||||||
class PyDupeGuru(PyApp):
|
class PyDupeGuruBase(PyApp):
|
||||||
def init(self):
|
|
||||||
self = super(PyDupeGuru,self).init()
|
|
||||||
self.app = app_pe_cocoa.DupeGuruPE()
|
|
||||||
return self
|
|
||||||
|
|
||||||
#---Directories
|
#---Directories
|
||||||
def addDirectory_(self, directory):
|
def addDirectory_(self, directory):
|
||||||
return self.app.add_directory(directory)
|
return self.app.add_directory(directory)
|
||||||
@@ -37,9 +38,6 @@ class PyDupeGuru(PyApp):
|
|||||||
def clearIgnoreList(self):
|
def clearIgnoreList(self):
|
||||||
self.app.scanner.ignore_list.Clear()
|
self.app.scanner.ignore_list.Clear()
|
||||||
|
|
||||||
def clearPictureCache(self):
|
|
||||||
self.app.scanner.cached_blocks.clear()
|
|
||||||
|
|
||||||
def doScan(self):
|
def doScan(self):
|
||||||
return self.app.start_scanning()
|
return self.app.start_scanning()
|
||||||
|
|
||||||
@@ -73,9 +71,6 @@ class PyDupeGuru(PyApp):
|
|||||||
def saveResults(self):
|
def saveResults(self):
|
||||||
self.app.save()
|
self.app.save()
|
||||||
|
|
||||||
def refreshDetailsWithSelected(self):
|
|
||||||
self.app.RefreshDetailsWithSelected()
|
|
||||||
|
|
||||||
def selectedResultNodePaths(self):
|
def selectedResultNodePaths(self):
|
||||||
return self.app.selected_result_node_paths()
|
return self.app.selected_result_node_paths()
|
||||||
|
|
||||||
@@ -139,18 +134,12 @@ class PyDupeGuru(PyApp):
|
|||||||
def getOperationalErrorCount(self):
|
def getOperationalErrorCount(self):
|
||||||
return self.app.last_op_error_count
|
return self.app.last_op_error_count
|
||||||
|
|
||||||
def getSelectedDupePath(self):
|
|
||||||
return unicode(self.app.selected_dupe_path())
|
|
||||||
|
|
||||||
def getSelectedDupeRefPath(self):
|
|
||||||
return unicode(self.app.selected_dupe_ref_path())
|
|
||||||
|
|
||||||
#---Data
|
#---Data
|
||||||
@objc.signature('i@:i')
|
@signature('i@:i')
|
||||||
def getOutlineViewMaxLevel_(self, tag):
|
def getOutlineViewMaxLevel_(self, tag):
|
||||||
return self.app.GetOutlineViewMaxLevel(tag)
|
return self.app.GetOutlineViewMaxLevel(tag)
|
||||||
|
|
||||||
@objc.signature('@@:i@')
|
@signature('@@:i@')
|
||||||
def getOutlineView_childCountsForPath_(self, tag, node_path):
|
def getOutlineView_childCountsForPath_(self, tag, node_path):
|
||||||
return self.app.GetOutlineViewChildCounts(tag, node_path)
|
return self.app.GetOutlineViewChildCounts(tag, node_path)
|
||||||
|
|
||||||
@@ -170,12 +159,6 @@ class PyDupeGuru(PyApp):
|
|||||||
return self.app.GetTableViewValues(tag, row)
|
return self.app.GetTableViewValues(tag, row)
|
||||||
|
|
||||||
#---Properties
|
#---Properties
|
||||||
def setMatchScaled_(self,match_scaled):
|
|
||||||
self.app.scanner.match_scaled = match_scaled
|
|
||||||
|
|
||||||
def setMinMatchPercentage_(self,percentage):
|
|
||||||
self.app.scanner.threshold = int(percentage)
|
|
||||||
|
|
||||||
def setMixFileKind_(self, mix_file_kind):
|
def setMixFileKind_(self, mix_file_kind):
|
||||||
self.app.scanner.mix_file_kind = mix_file_kind
|
self.app.scanner.mix_file_kind = mix_file_kind
|
||||||
|
|
||||||
@@ -199,14 +182,40 @@ class PyDupeGuru(PyApp):
|
|||||||
self.app.progress.job_cancelled = True
|
self.app.progress.job_cancelled = True
|
||||||
|
|
||||||
#---Registration
|
#---Registration
|
||||||
@objc.signature('i@:')
|
def demoLimitDescription(self):
|
||||||
|
return self.app.DEMO_LIMIT_DESC
|
||||||
|
|
||||||
|
@signature('i@:')
|
||||||
def isRegistered(self):
|
def isRegistered(self):
|
||||||
return self.app.registered
|
return self.app.registered
|
||||||
|
|
||||||
@objc.signature('i@:@@')
|
|
||||||
def isCodeValid_withEmail_(self, code, email):
|
def isCodeValid_withEmail_(self, code, email):
|
||||||
return self.app.is_code_valid(code, email)
|
try:
|
||||||
|
self.app.validate_code(code, email)
|
||||||
|
return None
|
||||||
|
except InvalidCodeError as e:
|
||||||
|
return unicode(e)
|
||||||
|
|
||||||
def setRegisteredCode_andEmail_(self, code, email):
|
def setRegisteredCode_andEmail_(self, code, email):
|
||||||
self.app.set_registration(code, email)
|
self.app.set_registration(code, email)
|
||||||
|
|
||||||
|
|
||||||
|
class PyDetailsPanel(NSObject):
|
||||||
|
def initWithCocoa_pyParent_(self, cocoa, pyparent):
|
||||||
|
super(PyDetailsPanel, self).init()
|
||||||
|
self.cocoa = cocoa
|
||||||
|
self.py = DetailsPanel(self, pyparent.app)
|
||||||
|
return self
|
||||||
|
|
||||||
|
@signature('i@:')
|
||||||
|
def numberOfRows(self):
|
||||||
|
return self.py.row_count()
|
||||||
|
|
||||||
|
@signature('@@:@i')
|
||||||
|
def valueForColumn_row_(self, column, row):
|
||||||
|
return self.py.row(row)[int(column)]
|
||||||
|
|
||||||
|
# python --> cocoa
|
||||||
|
def refresh(self):
|
||||||
|
self.cocoa.refresh()
|
||||||
|
|
||||||
@@ -1,7 +1,6 @@
|
|||||||
# Created By: Virgil Dupras
|
# Created By: Virgil Dupras
|
||||||
# Created On: 2006/03/15
|
# Created On: 2006/03/15
|
||||||
# $Id$
|
# Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
|
||||||
# Copyright 2009 Hardcoded Software (http://www.hardcoded.net)
|
|
||||||
#
|
#
|
||||||
# This software is licensed under the "HS" License as described in the "LICENSE" file,
|
# This software is licensed under the "HS" License as described in the "LICENSE" file,
|
||||||
# which should be included with this package. The terms are also available at
|
# which should be included with this package. The terms are also available at
|
||||||
@@ -1,7 +1,6 @@
|
|||||||
# Created By: Virgil Dupras
|
# Created By: Virgil Dupras
|
||||||
# Created On: 2006/02/27
|
# Created On: 2006/02/27
|
||||||
# $Id$
|
# Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
|
||||||
# Copyright 2009 Hardcoded Software (http://www.hardcoded.net)
|
|
||||||
#
|
#
|
||||||
# This software is licensed under the "HS" License as described in the "LICENSE" file,
|
# This software is licensed under the "HS" License as described in the "LICENSE" file,
|
||||||
# which should be included with this package. The terms are also available at
|
# which should be included with this package. The terms are also available at
|
||||||
@@ -1,7 +1,6 @@
|
|||||||
# Created By: Virgil Dupras
|
# Created By: Virgil Dupras
|
||||||
# Created On: 2006/01/29
|
# Created On: 2006/01/29
|
||||||
# $Id$
|
# Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
|
||||||
# Copyright 2009 Hardcoded Software (http://www.hardcoded.net)
|
|
||||||
#
|
#
|
||||||
# This software is licensed under the "HS" License as described in the "LICENSE" file,
|
# This software is licensed under the "HS" License as described in the "LICENSE" file,
|
||||||
# which should be included with this package. The terms are also available at
|
# which should be included with this package. The terms are also available at
|
||||||
@@ -208,13 +207,17 @@ def getmatches_by_contents(files, sizeattr='size', partial=False, j=job.nulljob)
|
|||||||
j = j.start_subjob([2, 8])
|
j = j.start_subjob([2, 8])
|
||||||
size2files = defaultdict(set)
|
size2files = defaultdict(set)
|
||||||
for file in j.iter_with_progress(files, 'Read size of %d/%d files'):
|
for file in j.iter_with_progress(files, 'Read size of %d/%d files'):
|
||||||
size2files[getattr(file, sizeattr)].add(file)
|
filesize = getattr(file, sizeattr)
|
||||||
|
if filesize:
|
||||||
|
size2files[filesize].add(file)
|
||||||
possible_matches = [files for files in size2files.values() if len(files) > 1]
|
possible_matches = [files for files in size2files.values() if len(files) > 1]
|
||||||
del size2files
|
del size2files
|
||||||
result = []
|
result = []
|
||||||
j.start_job(len(possible_matches), '0 matches found')
|
j.start_job(len(possible_matches), '0 matches found')
|
||||||
for group in possible_matches:
|
for group in possible_matches:
|
||||||
for first, second in itertools.combinations(group, 2):
|
for first, second in itertools.combinations(group, 2):
|
||||||
|
if first.is_ref and second.is_ref:
|
||||||
|
continue # Don't spend time comparing two ref pics together.
|
||||||
if first.md5partial == second.md5partial:
|
if first.md5partial == second.md5partial:
|
||||||
if partial or first.md5 == second.md5:
|
if partial or first.md5 == second.md5:
|
||||||
result.append(Match(first, second, 100))
|
result.append(Match(first, second, 100))
|
||||||
@@ -1,7 +1,6 @@
|
|||||||
# Created By: Virgil Dupras
|
# Created By: Virgil Dupras
|
||||||
# Created On: 2006/09/16
|
# Created On: 2006/09/16
|
||||||
# $Id$
|
# Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
|
||||||
# Copyright 2009 Hardcoded Software (http://www.hardcoded.net)
|
|
||||||
#
|
#
|
||||||
# This software is licensed under the "HS" License as described in the "LICENSE" file,
|
# This software is licensed under the "HS" License as described in the "LICENSE" file,
|
||||||
# which should be included with this package. The terms are also available at
|
# which should be included with this package. The terms are also available at
|
||||||
@@ -1,8 +1,7 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
# Created By: Virgil Dupras
|
# Created By: Virgil Dupras
|
||||||
# Created On: 2009-10-22
|
# Created On: 2009-10-22
|
||||||
# $Id$
|
# Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
|
||||||
# Copyright 2009 Hardcoded Software (http://www.hardcoded.net)
|
|
||||||
#
|
#
|
||||||
# This software is licensed under the "HS" License as described in the "LICENSE" file,
|
# This software is licensed under the "HS" License as described in the "LICENSE" file,
|
||||||
# which should be included with this package. The terms are also available at
|
# which should be included with this package. The terms are also available at
|
||||||
@@ -103,8 +102,12 @@ class File(object):
|
|||||||
elif field == 'md5':
|
elif field == 'md5':
|
||||||
try:
|
try:
|
||||||
fp = io.open(self.path, 'rb')
|
fp = io.open(self.path, 'rb')
|
||||||
filedata = fp.read()
|
md5 = hashlib.md5()
|
||||||
md5 = hashlib.md5(filedata)
|
CHUNK_SIZE = 8192
|
||||||
|
filedata = fp.read(CHUNK_SIZE)
|
||||||
|
while filedata:
|
||||||
|
md5.update(filedata)
|
||||||
|
filedata = fp.read(CHUNK_SIZE)
|
||||||
self.md5 = md5.digest()
|
self.md5 = md5.digest()
|
||||||
fp.close()
|
fp.close()
|
||||||
except Exception:
|
except Exception:
|
||||||
@@ -157,8 +160,16 @@ def get_file(path, fileclasses=[File]):
|
|||||||
|
|
||||||
def get_files(path, fileclasses=[File]):
|
def get_files(path, fileclasses=[File]):
|
||||||
assert all(issubclass(fileclass, File) for fileclass in fileclasses)
|
assert all(issubclass(fileclass, File) for fileclass in fileclasses)
|
||||||
|
def combine_paths(p1, p2):
|
||||||
try:
|
try:
|
||||||
paths = [path + name for name in io.listdir(path)]
|
return p1 + p2
|
||||||
|
except Exception:
|
||||||
|
# This is temporary debug logging for #84.
|
||||||
|
logging.warning("Failed to combine %r and %r.", p1, p2)
|
||||||
|
raise
|
||||||
|
|
||||||
|
try:
|
||||||
|
paths = [combine_paths(path, name) for name in io.listdir(path)]
|
||||||
result = []
|
result = []
|
||||||
for path in paths:
|
for path in paths:
|
||||||
file = get_file(path, fileclasses=fileclasses)
|
file = get_file(path, fileclasses=fileclasses)
|
||||||
47
core/gui/details_panel.py
Normal file
47
core/gui/details_panel.py
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Created By: Virgil Dupras
|
||||||
|
# Created On: 2010-02-05
|
||||||
|
# Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
|
||||||
|
#
|
||||||
|
# This software is licensed under the "HS" License as described in the "LICENSE" file,
|
||||||
|
# which should be included with this package. The terms are also available at
|
||||||
|
# http://www.hardcoded.net/licenses/hs_license
|
||||||
|
|
||||||
|
from hsutil.notify import Listener
|
||||||
|
|
||||||
|
class DetailsPanel(Listener):
|
||||||
|
def __init__(self, view, app):
|
||||||
|
Listener.__init__(self, app)
|
||||||
|
self.app = app
|
||||||
|
self.view = view
|
||||||
|
self._table = []
|
||||||
|
self._refresh()
|
||||||
|
self.connect()
|
||||||
|
|
||||||
|
#--- Private
|
||||||
|
def _refresh(self):
|
||||||
|
if self.app.selected_dupes:
|
||||||
|
dupe = self.app.selected_dupes[0]
|
||||||
|
group = self.app.results.get_group_of_duplicate(dupe)
|
||||||
|
else:
|
||||||
|
dupe = None
|
||||||
|
group = None
|
||||||
|
l1 = self.app._get_display_info(dupe, group, False)
|
||||||
|
# we don't want the two sides of the table to display the stats for the same file
|
||||||
|
ref = group.ref if group is not None and group.ref is not dupe else None
|
||||||
|
l2 = self.app._get_display_info(ref, group, False)
|
||||||
|
names = [c['display'] for c in self.app.data.COLUMNS]
|
||||||
|
self._table = zip(names, l1, l2)
|
||||||
|
|
||||||
|
#--- Public
|
||||||
|
def row_count(self):
|
||||||
|
return len(self._table)
|
||||||
|
|
||||||
|
def row(self, row_index):
|
||||||
|
return self._table[row_index]
|
||||||
|
|
||||||
|
#--- Event Handlers
|
||||||
|
def dupes_selected(self):
|
||||||
|
self._refresh()
|
||||||
|
self.view.refresh()
|
||||||
|
|
||||||
@@ -1,7 +1,6 @@
|
|||||||
# Created By: Virgil Dupras
|
# Created By: Virgil Dupras
|
||||||
# Created On: 2006/05/02
|
# Created On: 2006/05/02
|
||||||
# $Id$
|
# Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
|
||||||
# Copyright 2009 Hardcoded Software (http://www.hardcoded.net)
|
|
||||||
#
|
#
|
||||||
# This software is licensed under the "HS" License as described in the "LICENSE" file,
|
# This software is licensed under the "HS" License as described in the "LICENSE" file,
|
||||||
# which should be included with this package. The terms are also available at
|
# which should be included with this package. The terms are also available at
|
||||||
@@ -1,7 +1,6 @@
|
|||||||
# Created By: Virgil Dupras
|
# Created By: Virgil Dupras
|
||||||
# Created On: 2006/02/23
|
# Created On: 2006/02/23
|
||||||
# $Id$
|
# Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
|
||||||
# Copyright 2009 Hardcoded Software (http://www.hardcoded.net)
|
|
||||||
#
|
#
|
||||||
# This software is licensed under the "HS" License as described in the "LICENSE" file,
|
# This software is licensed under the "HS" License as described in the "LICENSE" file,
|
||||||
# which should be included with this package. The terms are also available at
|
# which should be included with this package. The terms are also available at
|
||||||
@@ -1,7 +1,6 @@
|
|||||||
# Created By: Virgil Dupras
|
# Created By: Virgil Dupras
|
||||||
# Created On: 2006/03/03
|
# Created On: 2006/03/03
|
||||||
# $Id$
|
# Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
|
||||||
# Copyright 2009 Hardcoded Software (http://www.hardcoded.net)
|
|
||||||
#
|
#
|
||||||
# This software is licensed under the "HS" License as described in the "LICENSE" file,
|
# This software is licensed under the "HS" License as described in the "LICENSE" file,
|
||||||
# which should be included with this package. The terms are also available at
|
# which should be included with this package. The terms are also available at
|
||||||
@@ -10,7 +9,7 @@
|
|||||||
import logging
|
import logging
|
||||||
|
|
||||||
|
|
||||||
from hsutil import job
|
from hsutil import job, io
|
||||||
from hsutil.misc import dedupe
|
from hsutil.misc import dedupe
|
||||||
from hsutil.str import get_file_ext, rem_file_ext
|
from hsutil.str import get_file_ext, rem_file_ext
|
||||||
|
|
||||||
@@ -80,9 +79,10 @@ class Scanner(object):
|
|||||||
logging.info('Getting matches')
|
logging.info('Getting matches')
|
||||||
matches = self._getmatches(files, j)
|
matches = self._getmatches(files, j)
|
||||||
logging.info('Found %d matches' % len(matches))
|
logging.info('Found %d matches' % len(matches))
|
||||||
if not self.mix_file_kind:
|
|
||||||
j.set_progress(100, 'Removing false matches')
|
j.set_progress(100, 'Removing false matches')
|
||||||
|
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 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)]
|
||||||
if self.ignore_list:
|
if self.ignore_list:
|
||||||
j = j.start_subjob(2)
|
j = j.start_subjob(2)
|
||||||
iter_matches = j.iter_with_progress(matches, 'Processed %d/%d matches against the ignore list')
|
iter_matches = j.iter_with_progress(matches, 'Processed %d/%d matches against the ignore list')
|
||||||
@@ -1,7 +1,6 @@
|
|||||||
# Created By: Virgil Dupras
|
# Created By: Virgil Dupras
|
||||||
# Created On: 2006/11/11
|
# Created On: 2006/11/11
|
||||||
# $Id$
|
# Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
|
||||||
# Copyright 2009 Hardcoded Software (http://www.hardcoded.net)
|
|
||||||
#
|
#
|
||||||
# This software is licensed under the "HS" License as described in the "LICENSE" file,
|
# This software is licensed under the "HS" License as described in the "LICENSE" file,
|
||||||
# which should be included with this package. The terms are also available at
|
# which should be included with this package. The terms are also available at
|
||||||
@@ -27,6 +26,7 @@ try:
|
|||||||
except ImportError:
|
except ImportError:
|
||||||
from nose.plugins.skip import SkipTest
|
from nose.plugins.skip import SkipTest
|
||||||
raise SkipTest("These tests can only be run on OS X")
|
raise SkipTest("These tests can only be run on OS X")
|
||||||
|
from ..gui.details_panel import DetailsPanel
|
||||||
|
|
||||||
class DupeGuru(DupeGuruBase):
|
class DupeGuru(DupeGuruBase):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
@@ -39,9 +39,28 @@ def r2np(rows):
|
|||||||
#Transforms a list of rows [1,2,3] into a list of node paths [[1],[2],[3]]
|
#Transforms a list of rows [1,2,3] into a list of node paths [[1],[2],[3]]
|
||||||
return [[i] for i in rows]
|
return [[i] for i in rows]
|
||||||
|
|
||||||
|
class CallLogger(object):
|
||||||
|
"""This is a dummy object that logs all calls made to it.
|
||||||
|
|
||||||
|
It is used to simulate the GUI layer.
|
||||||
|
"""
|
||||||
|
def __init__(self):
|
||||||
|
self.calls = []
|
||||||
|
|
||||||
|
def __getattr__(self, func_name):
|
||||||
|
def func(*args, **kw):
|
||||||
|
self.calls.append(func_name)
|
||||||
|
return func
|
||||||
|
|
||||||
|
def clear_calls(self):
|
||||||
|
del self.calls[:]
|
||||||
|
|
||||||
|
|
||||||
class TCDupeGuru(TestCase):
|
class TCDupeGuru(TestCase):
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
self.app = DupeGuru()
|
self.app = DupeGuru()
|
||||||
|
self.dpanel_gui = CallLogger()
|
||||||
|
self.dpanel = DetailsPanel(self.dpanel_gui, self.app)
|
||||||
self.objects,self.matches,self.groups = GetTestGroups()
|
self.objects,self.matches,self.groups = GetTestGroups()
|
||||||
self.app.results.groups = self.groups
|
self.app.results.groups = self.groups
|
||||||
tmppath = self.tmppath()
|
tmppath = self.tmppath()
|
||||||
@@ -49,6 +68,44 @@ class TCDupeGuru(TestCase):
|
|||||||
io.mkdir(tmppath + 'bar')
|
io.mkdir(tmppath + 'bar')
|
||||||
self.app.directories.add_path(tmppath)
|
self.app.directories.add_path(tmppath)
|
||||||
|
|
||||||
|
def check_gui_calls(self, gui, expected, verify_order=False):
|
||||||
|
"""Checks that the expected calls have been made to 'gui', then clears the log.
|
||||||
|
|
||||||
|
`expected` is an iterable of strings representing method names.
|
||||||
|
If `verify_order` is True, the order of the calls matters.
|
||||||
|
"""
|
||||||
|
if verify_order:
|
||||||
|
eq_(gui.calls, expected)
|
||||||
|
else:
|
||||||
|
eq_(set(gui.calls), set(expected))
|
||||||
|
gui.clear_calls()
|
||||||
|
|
||||||
|
def check_gui_calls_partial(self, gui, expected=None, not_expected=None):
|
||||||
|
"""Checks that the expected calls have been made to 'gui', then clears the log.
|
||||||
|
|
||||||
|
`expected` is an iterable of strings representing method names. Order doesn't matter.
|
||||||
|
Moreover, if calls have been made that are not in expected, no failure occur.
|
||||||
|
`not_expected` can be used for a more explicit check (rather than calling `check_gui_calls`
|
||||||
|
with an empty `expected`) to assert that calls have *not* been made.
|
||||||
|
"""
|
||||||
|
calls = set(gui.calls)
|
||||||
|
if expected is not None:
|
||||||
|
expected = set(expected)
|
||||||
|
not_called = expected - calls
|
||||||
|
assert not not_called, u"These calls haven't been made: {0}".format(not_called)
|
||||||
|
if not_expected is not None:
|
||||||
|
not_expected = set(not_expected)
|
||||||
|
called = not_expected & calls
|
||||||
|
assert not called, u"These calls shouldn't have been made: {0}".format(called)
|
||||||
|
gui.clear_calls()
|
||||||
|
|
||||||
|
def clear_gui_calls(self):
|
||||||
|
for attr in dir(self):
|
||||||
|
if attr.endswith('_gui'):
|
||||||
|
gui = getattr(self, attr)
|
||||||
|
if hasattr(gui, 'calls'): # We might have test methods ending with '_gui'
|
||||||
|
gui.clear_calls()
|
||||||
|
|
||||||
def test_GetObjects(self):
|
def test_GetObjects(self):
|
||||||
app = self.app
|
app = self.app
|
||||||
objects = self.objects
|
objects = self.objects
|
||||||
@@ -195,24 +252,12 @@ class TCDupeGuru(TestCase):
|
|||||||
self.assert_(app.results.is_marked(objects[4]))
|
self.assert_(app.results.is_marked(objects[4]))
|
||||||
|
|
||||||
def test_refreshDetailsWithSelected(self):
|
def test_refreshDetailsWithSelected(self):
|
||||||
def mock_refresh(dupe,group):
|
|
||||||
self.called = True
|
|
||||||
if self.app.selected_dupes:
|
|
||||||
self.assert_(dupe is self.app.selected_dupes[0])
|
|
||||||
self.assert_(group is self.app.results.get_group_of_duplicate(dupe))
|
|
||||||
else:
|
|
||||||
self.assert_(dupe is None)
|
|
||||||
self.assert_(group is None)
|
|
||||||
|
|
||||||
self.app.RefreshDetailsTable = mock_refresh
|
|
||||||
self.called = False
|
|
||||||
self.app.SelectPowerMarkerNodePaths(r2np([0,2]))
|
self.app.SelectPowerMarkerNodePaths(r2np([0,2]))
|
||||||
self.app.RefreshDetailsWithSelected()
|
eq_(self.dpanel.row(0), ('Filename', 'bar bleh', 'foo bar'))
|
||||||
self.assert_(self.called)
|
self.check_gui_calls(self.dpanel_gui, ['refresh'])
|
||||||
self.called = False
|
|
||||||
self.app.SelectPowerMarkerNodePaths([])
|
self.app.SelectPowerMarkerNodePaths([])
|
||||||
self.app.RefreshDetailsWithSelected()
|
eq_(self.dpanel.row(0), ('Filename', '---', '---'))
|
||||||
self.assert_(self.called)
|
self.check_gui_calls(self.dpanel_gui, ['refresh'])
|
||||||
|
|
||||||
def test_makeSelectedReference(self):
|
def test_makeSelectedReference(self):
|
||||||
app = self.app
|
app = self.app
|
||||||
@@ -304,7 +349,10 @@ class TCDupeGuru(TestCase):
|
|||||||
# Out of range requests don't crash and return an empty value
|
# Out of range requests don't crash and return an empty value
|
||||||
app = self.app
|
app = self.app
|
||||||
# [0, 2] is out of range
|
# [0, 2] is out of range
|
||||||
|
# Directories
|
||||||
eq_(app.GetOutlineViewValues(1, [0, 2]), []) # no crash
|
eq_(app.GetOutlineViewValues(1, [0, 2]), []) # no crash
|
||||||
|
# Normal results
|
||||||
|
app.GetOutlineViewValues(0, [42, 0]) # no crash
|
||||||
|
|
||||||
|
|
||||||
class TCDupeGuru_renameSelected(TestCase):
|
class TCDupeGuru_renameSelected(TestCase):
|
||||||
@@ -1,7 +1,6 @@
|
|||||||
# Created By: Virgil Dupras
|
# Created By: Virgil Dupras
|
||||||
# Created On: 2007-06-23
|
# Created On: 2007-06-23
|
||||||
# $Id$
|
# Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
|
||||||
# Copyright 2009 Hardcoded Software (http://www.hardcoded.net)
|
|
||||||
#
|
#
|
||||||
# This software is licensed under the "HS" License as described in the "LICENSE" file,
|
# This software is licensed under the "HS" License as described in the "LICENSE" file,
|
||||||
# which should be included with this package. The terms are also available at
|
# which should be included with this package. The terms are also available at
|
||||||
@@ -1,8 +1,7 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
# Created By: Virgil Dupras
|
# Created By: Virgil Dupras
|
||||||
# Created On: 2009-10-23
|
# Created On: 2009-10-23
|
||||||
# $Id$
|
# Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
|
||||||
# Copyright 2009 Hardcoded Software (http://www.hardcoded.net)
|
|
||||||
#
|
#
|
||||||
# This software is licensed under the "HS" License as described in the "LICENSE" file,
|
# This software is licensed under the "HS" License as described in the "LICENSE" file,
|
||||||
# which should be included with this package. The terms are also available at
|
# which should be included with this package. The terms are also available at
|
||||||
@@ -11,7 +10,7 @@
|
|||||||
# data module for tests
|
# data module for tests
|
||||||
|
|
||||||
from hsutil.str import format_size
|
from hsutil.str import format_size
|
||||||
from dupeguru.data import format_path, cmp_value
|
from ..data import format_path, cmp_value
|
||||||
|
|
||||||
COLUMNS = [
|
COLUMNS = [
|
||||||
{'attr':'name','display':'Filename'},
|
{'attr':'name','display':'Filename'},
|
||||||
@@ -32,7 +31,7 @@ def GetDisplayInfo(dupe, group, delta):
|
|||||||
dupe.name,
|
dupe.name,
|
||||||
format_path(dupe.path),
|
format_path(dupe.path),
|
||||||
format_size(size, 0, 1, False),
|
format_size(size, 0, 1, False),
|
||||||
dupe.extension,
|
dupe.extension if hasattr(dupe, 'extension') else '---',
|
||||||
]
|
]
|
||||||
|
|
||||||
def GetDupeSortKey(dupe, get_group, key, delta):
|
def GetDupeSortKey(dupe, get_group, key, delta):
|
||||||
@@ -1,7 +1,6 @@
|
|||||||
# Created By: Virgil Dupras
|
# Created By: Virgil Dupras
|
||||||
# Created On: 2006/02/27
|
# Created On: 2006/02/27
|
||||||
# $Id$
|
# Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
|
||||||
# Copyright 2009 Hardcoded Software (http://www.hardcoded.net)
|
|
||||||
#
|
#
|
||||||
# This software is licensed under the "HS" License as described in the "LICENSE" file,
|
# This software is licensed under the "HS" License as described in the "LICENSE" file,
|
||||||
# which should be included with this package. The terms are also available at
|
# which should be included with this package. The terms are also available at
|
||||||
@@ -154,13 +153,13 @@ class TCDirectories(TestCase):
|
|||||||
d.add_path(p)
|
d.add_path(p)
|
||||||
d.set_state(p + 'dir1',STATE_REFERENCE)
|
d.set_state(p + 'dir1',STATE_REFERENCE)
|
||||||
d.set_state(p + 'dir2',STATE_EXCLUDED)
|
d.set_state(p + 'dir2',STATE_EXCLUDED)
|
||||||
files = d.get_files()
|
files = list(d.get_files())
|
||||||
self.assertEqual(5, len(list(files)))
|
self.assertEqual(5, len(files))
|
||||||
for f in files:
|
for f in files:
|
||||||
if f.parent.path == p + 'dir1':
|
if f.path[:-1] == p + 'dir1':
|
||||||
self.assert_(f.is_ref)
|
assert f.is_ref
|
||||||
else:
|
else:
|
||||||
self.assert_(not f.is_ref)
|
assert not f.is_ref
|
||||||
|
|
||||||
def test_get_files_with_inherited_exclusion(self):
|
def test_get_files_with_inherited_exclusion(self):
|
||||||
d = Directories()
|
d = Directories()
|
||||||
@@ -1,7 +1,6 @@
|
|||||||
# Created By: Virgil Dupras
|
# Created By: Virgil Dupras
|
||||||
# Created On: 2006/01/29
|
# Created On: 2006/01/29
|
||||||
# $Id$
|
# Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
|
||||||
# Copyright 2009 Hardcoded Software (http://www.hardcoded.net)
|
|
||||||
#
|
#
|
||||||
# This software is licensed under the "HS" License as described in the "LICENSE" file,
|
# This software is licensed under the "HS" License as described in the "LICENSE" file,
|
||||||
# which should be included with this package. The terms are also available at
|
# which should be included with this package. The terms are also available at
|
||||||
@@ -15,16 +14,21 @@ from hsutil import job
|
|||||||
from hsutil.decorators import log_calls
|
from hsutil.decorators import log_calls
|
||||||
from hsutil.testcase import TestCase
|
from hsutil.testcase import TestCase
|
||||||
|
|
||||||
from .. import engine
|
from .. import engine, fs
|
||||||
from ..engine import *
|
from ..engine import *
|
||||||
|
|
||||||
class NamedObject(object):
|
class NamedObject(object):
|
||||||
def __init__(self, name="foobar", with_words=False):
|
def __init__(self, name="foobar", with_words=False, size=1):
|
||||||
self.name = name
|
self.name = name
|
||||||
|
self.size = size
|
||||||
|
self.md5partial = name
|
||||||
|
self.md5 = name
|
||||||
if with_words:
|
if with_words:
|
||||||
self.words = getwords(name)
|
self.words = getwords(name)
|
||||||
|
|
||||||
|
|
||||||
|
no = NamedObject
|
||||||
|
|
||||||
def get_match_triangle():
|
def get_match_triangle():
|
||||||
o1 = NamedObject(with_words=True)
|
o1 = NamedObject(with_words=True)
|
||||||
o2 = NamedObject(with_words=True)
|
o2 = NamedObject(with_words=True)
|
||||||
@@ -486,6 +490,12 @@ class GetMatches(TestCase):
|
|||||||
self.assertEqual(42, len(r))
|
self.assertEqual(42, len(r))
|
||||||
|
|
||||||
|
|
||||||
|
class GetMatchesByContents(TestCase):
|
||||||
|
def test_dont_compare_empty_files(self):
|
||||||
|
o1, o2 = no(size=0), no(size=0)
|
||||||
|
assert not getmatches_by_contents([o1, o2])
|
||||||
|
|
||||||
|
|
||||||
class TCGroup(TestCase):
|
class TCGroup(TestCase):
|
||||||
def test_empy(self):
|
def test_empy(self):
|
||||||
g = Group()
|
g = Group()
|
||||||
@@ -1,7 +1,6 @@
|
|||||||
# Created By: Virgil Dupras
|
# Created By: Virgil Dupras
|
||||||
# Created On: 2006/05/02
|
# Created On: 2006/05/02
|
||||||
# $Id$
|
# Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
|
||||||
# Copyright 2009 Hardcoded Software (http://www.hardcoded.net)
|
|
||||||
#
|
#
|
||||||
# This software is licensed under the "HS" License as described in the "LICENSE" file,
|
# This software is licensed under the "HS" License as described in the "LICENSE" file,
|
||||||
# which should be included with this package. The terms are also available at
|
# which should be included with this package. The terms are also available at
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
# Created By: Virgil Dupras
|
# Created By: Virgil Dupras
|
||||||
# Created On: 2006/02/23
|
# Created On: 2006/02/23
|
||||||
# $Id$
|
# $Id$
|
||||||
# Copyright 2009 Hardcoded Software (http://www.hardcoded.net)
|
# Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
|
||||||
#
|
#
|
||||||
# This software is licensed under the "HS" License as described in the "LICENSE" file,
|
# This software is licensed under the "HS" License as described in the "LICENSE" file,
|
||||||
# which should be included with this package. The terms are also available at
|
# which should be included with this package. The terms are also available at
|
||||||
@@ -21,7 +21,6 @@ from .. import engine
|
|||||||
from ..results import *
|
from ..results import *
|
||||||
|
|
||||||
class NamedObject(engine_test.NamedObject):
|
class NamedObject(engine_test.NamedObject):
|
||||||
size = 1
|
|
||||||
path = property(lambda x:Path('basepath') + x.name)
|
path = property(lambda x:Path('basepath') + x.name)
|
||||||
is_ref = False
|
is_ref = False
|
||||||
|
|
||||||
466
core/tests/scanner_test.py
Normal file
466
core/tests/scanner_test.py
Normal file
@@ -0,0 +1,466 @@
|
|||||||
|
# Created By: Virgil Dupras
|
||||||
|
# Created On: 2006/03/03
|
||||||
|
# Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
|
||||||
|
#
|
||||||
|
# This software is licensed under the "HS" License as described in the "LICENSE" file,
|
||||||
|
# which should be included with this package. The terms are also available at
|
||||||
|
# http://www.hardcoded.net/licenses/hs_license
|
||||||
|
|
||||||
|
from nose.tools import eq_
|
||||||
|
|
||||||
|
from hsutil import job, io
|
||||||
|
from hsutil.path import Path
|
||||||
|
from hsutil.testcase import TestCase
|
||||||
|
|
||||||
|
from .. import fs
|
||||||
|
from ..engine import getwords, Match
|
||||||
|
from ..ignore import IgnoreList
|
||||||
|
from ..scanner import *
|
||||||
|
|
||||||
|
class NamedObject(object):
|
||||||
|
def __init__(self, name="foobar", size=1):
|
||||||
|
self.name = name
|
||||||
|
self.size = size
|
||||||
|
self.path = Path('')
|
||||||
|
self.words = getwords(name)
|
||||||
|
|
||||||
|
|
||||||
|
no = NamedObject
|
||||||
|
|
||||||
|
#--- Scanner
|
||||||
|
class ScannerTestFakeFiles(TestCase):
|
||||||
|
def setUp(self):
|
||||||
|
# This is a hack to avoid invalidating all previous tests since the scanner started to test
|
||||||
|
# for file existence before doing the match grouping.
|
||||||
|
self.mock(io, 'exists', lambda _: True)
|
||||||
|
|
||||||
|
def test_empty(self):
|
||||||
|
s = Scanner()
|
||||||
|
r = s.GetDupeGroups([])
|
||||||
|
eq_(r, [])
|
||||||
|
|
||||||
|
def test_default_settings(self):
|
||||||
|
s = Scanner()
|
||||||
|
eq_(s.min_match_percentage, 80)
|
||||||
|
eq_(s.scan_type, SCAN_TYPE_FILENAME)
|
||||||
|
eq_(s.mix_file_kind, True)
|
||||||
|
eq_(s.word_weighting, False)
|
||||||
|
eq_(s.match_similar_words, False)
|
||||||
|
assert isinstance(s.ignore_list, IgnoreList)
|
||||||
|
|
||||||
|
def test_simple_with_default_settings(self):
|
||||||
|
s = Scanner()
|
||||||
|
f = [no('foo bar'), no('foo bar'), no('foo bleh')]
|
||||||
|
r = s.GetDupeGroups(f)
|
||||||
|
eq_(len(r), 1)
|
||||||
|
g = r[0]
|
||||||
|
#'foo bleh' cannot be in the group because the default min match % is 80
|
||||||
|
eq_(len(g), 2)
|
||||||
|
assert g.ref in f[:2]
|
||||||
|
assert g.dupes[0] in f[:2]
|
||||||
|
|
||||||
|
def test_simple_with_lower_min_match(self):
|
||||||
|
s = Scanner()
|
||||||
|
s.min_match_percentage = 50
|
||||||
|
f = [no('foo bar'), no('foo bar'), no('foo bleh')]
|
||||||
|
r = s.GetDupeGroups(f)
|
||||||
|
eq_(len(r), 1)
|
||||||
|
g = r[0]
|
||||||
|
eq_(len(g), 3)
|
||||||
|
|
||||||
|
def test_trim_all_ref_groups(self):
|
||||||
|
# When all files of a group are ref, don't include that group in the results, but also don't
|
||||||
|
# count the files from that group as discarded.
|
||||||
|
s = Scanner()
|
||||||
|
f = [no('foo'), no('foo'), no('bar'), no('bar')]
|
||||||
|
f[2].is_ref = True
|
||||||
|
f[3].is_ref = True
|
||||||
|
r = s.GetDupeGroups(f)
|
||||||
|
eq_(len(r), 1)
|
||||||
|
eq_(s.discarded_file_count, 0)
|
||||||
|
|
||||||
|
def test_priorize(self):
|
||||||
|
s = Scanner()
|
||||||
|
f = [no('foo'), no('foo'), no('bar'), no('bar')]
|
||||||
|
f[1].size = 2
|
||||||
|
f[2].size = 3
|
||||||
|
f[3].is_ref = True
|
||||||
|
r = s.GetDupeGroups(f)
|
||||||
|
g1, g2 = r
|
||||||
|
assert f[1] in (g1.ref,g2.ref)
|
||||||
|
assert f[0] in (g1.dupes[0],g2.dupes[0])
|
||||||
|
assert f[3] in (g1.ref,g2.ref)
|
||||||
|
assert f[2] in (g1.dupes[0],g2.dupes[0])
|
||||||
|
|
||||||
|
def test_content_scan(self):
|
||||||
|
s = Scanner()
|
||||||
|
s.scan_type = SCAN_TYPE_CONTENT
|
||||||
|
f = [no('foo'), no('bar'), no('bleh')]
|
||||||
|
f[0].md5 = f[0].md5partial = 'foobar'
|
||||||
|
f[1].md5 = f[1].md5partial = 'foobar'
|
||||||
|
f[2].md5 = f[2].md5partial = 'bleh'
|
||||||
|
r = s.GetDupeGroups(f)
|
||||||
|
eq_(len(r), 1)
|
||||||
|
eq_(len(r[0]), 2)
|
||||||
|
eq_(s.discarded_file_count, 0) # don't count the different md5 as discarded!
|
||||||
|
|
||||||
|
def test_content_scan_compare_sizes_first(self):
|
||||||
|
class MyFile(no):
|
||||||
|
@property
|
||||||
|
def md5(file):
|
||||||
|
raise AssertionError()
|
||||||
|
|
||||||
|
s = Scanner()
|
||||||
|
s.scan_type = SCAN_TYPE_CONTENT
|
||||||
|
f = [MyFile('foo', 1), MyFile('bar', 2)]
|
||||||
|
eq_(len(s.GetDupeGroups(f)), 0)
|
||||||
|
|
||||||
|
def test_min_match_perc_doesnt_matter_for_content_scan(self):
|
||||||
|
s = Scanner()
|
||||||
|
s.scan_type = SCAN_TYPE_CONTENT
|
||||||
|
f = [no('foo'), no('bar'), no('bleh')]
|
||||||
|
f[0].md5 = f[0].md5partial = 'foobar'
|
||||||
|
f[1].md5 = f[1].md5partial = 'foobar'
|
||||||
|
f[2].md5 = f[2].md5partial = 'bleh'
|
||||||
|
s.min_match_percentage = 101
|
||||||
|
r = s.GetDupeGroups(f)
|
||||||
|
eq_(len(r), 1)
|
||||||
|
eq_(len(r[0]), 2)
|
||||||
|
s.min_match_percentage = 0
|
||||||
|
r = s.GetDupeGroups(f)
|
||||||
|
eq_(len(r), 1)
|
||||||
|
eq_(len(r[0]), 2)
|
||||||
|
|
||||||
|
def test_content_scan_doesnt_put_md5_in_words_at_the_end(self):
|
||||||
|
s = Scanner()
|
||||||
|
s.scan_type = SCAN_TYPE_CONTENT
|
||||||
|
f = [no('foo'),no('bar')]
|
||||||
|
f[0].md5 = f[0].md5partial = '\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f'
|
||||||
|
f[1].md5 = f[1].md5partial = '\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f'
|
||||||
|
r = s.GetDupeGroups(f)
|
||||||
|
g = r[0]
|
||||||
|
|
||||||
|
def test_extension_is_not_counted_in_filename_scan(self):
|
||||||
|
s = Scanner()
|
||||||
|
s.min_match_percentage = 100
|
||||||
|
f = [no('foo.bar'), no('foo.bleh')]
|
||||||
|
r = s.GetDupeGroups(f)
|
||||||
|
eq_(len(r), 1)
|
||||||
|
eq_(len(r[0]), 2)
|
||||||
|
|
||||||
|
def test_job(self):
|
||||||
|
def do_progress(progress, desc=''):
|
||||||
|
log.append(progress)
|
||||||
|
return True
|
||||||
|
|
||||||
|
s = Scanner()
|
||||||
|
log = []
|
||||||
|
f = [no('foo bar'), no('foo bar'), no('foo bleh')]
|
||||||
|
r = s.GetDupeGroups(f, job.Job(1, do_progress))
|
||||||
|
eq_(log[0], 0)
|
||||||
|
eq_(log[-1], 100)
|
||||||
|
|
||||||
|
def test_mix_file_kind(self):
|
||||||
|
s = Scanner()
|
||||||
|
s.mix_file_kind = False
|
||||||
|
f = [no('foo.1'), no('foo.2')]
|
||||||
|
r = s.GetDupeGroups(f)
|
||||||
|
eq_(len(r), 0)
|
||||||
|
|
||||||
|
def test_word_weighting(self):
|
||||||
|
s = Scanner()
|
||||||
|
s.min_match_percentage = 75
|
||||||
|
s.word_weighting = True
|
||||||
|
f = [no('foo bar'), no('foo bar bleh')]
|
||||||
|
r = s.GetDupeGroups(f)
|
||||||
|
eq_(len(r), 1)
|
||||||
|
g = r[0]
|
||||||
|
m = g.get_match_of(g.dupes[0])
|
||||||
|
eq_(m.percentage, 75) # 16 letters, 12 matching
|
||||||
|
|
||||||
|
def test_similar_words(self):
|
||||||
|
s = Scanner()
|
||||||
|
s.match_similar_words = True
|
||||||
|
f = [no('The White Stripes'), no('The Whites Stripe'), no('Limp Bizkit'), no('Limp Bizkitt')]
|
||||||
|
r = s.GetDupeGroups(f)
|
||||||
|
eq_(len(r), 2)
|
||||||
|
|
||||||
|
def test_fields(self):
|
||||||
|
s = Scanner()
|
||||||
|
s.scan_type = SCAN_TYPE_FIELDS
|
||||||
|
f = [no('The White Stripes - Little Ghost'), no('The White Stripes - Little Acorn')]
|
||||||
|
r = s.GetDupeGroups(f)
|
||||||
|
eq_(len(r), 0)
|
||||||
|
|
||||||
|
def test_fields_no_order(self):
|
||||||
|
s = Scanner()
|
||||||
|
s.scan_type = SCAN_TYPE_FIELDS_NO_ORDER
|
||||||
|
f = [no('The White Stripes - Little Ghost'), no('Little Ghost - The White Stripes')]
|
||||||
|
r = s.GetDupeGroups(f)
|
||||||
|
eq_(len(r), 1)
|
||||||
|
|
||||||
|
def test_tag_scan(self):
|
||||||
|
s = Scanner()
|
||||||
|
s.scan_type = SCAN_TYPE_TAG
|
||||||
|
o1 = no('foo')
|
||||||
|
o2 = no('bar')
|
||||||
|
o1.artist = 'The White Stripes'
|
||||||
|
o1.title = 'The Air Near My Fingers'
|
||||||
|
o2.artist = 'The White Stripes'
|
||||||
|
o2.title = 'The Air Near My Fingers'
|
||||||
|
r = s.GetDupeGroups([o1,o2])
|
||||||
|
eq_(len(r), 1)
|
||||||
|
|
||||||
|
def test_tag_with_album_scan(self):
|
||||||
|
s = Scanner()
|
||||||
|
s.scan_type = SCAN_TYPE_TAG
|
||||||
|
s.scanned_tags = set(['artist', 'album', 'title'])
|
||||||
|
o1 = no('foo')
|
||||||
|
o2 = no('bar')
|
||||||
|
o3 = no('bleh')
|
||||||
|
o1.artist = 'The White Stripes'
|
||||||
|
o1.title = 'The Air Near My Fingers'
|
||||||
|
o1.album = 'Elephant'
|
||||||
|
o2.artist = 'The White Stripes'
|
||||||
|
o2.title = 'The Air Near My Fingers'
|
||||||
|
o2.album = 'Elephant'
|
||||||
|
o3.artist = 'The White Stripes'
|
||||||
|
o3.title = 'The Air Near My Fingers'
|
||||||
|
o3.album = 'foobar'
|
||||||
|
r = s.GetDupeGroups([o1,o2,o3])
|
||||||
|
eq_(len(r), 1)
|
||||||
|
|
||||||
|
def test_that_dash_in_tags_dont_create_new_fields(self):
|
||||||
|
s = Scanner()
|
||||||
|
s.scan_type = SCAN_TYPE_TAG
|
||||||
|
s.scanned_tags = set(['artist', 'album', 'title'])
|
||||||
|
s.min_match_percentage = 50
|
||||||
|
o1 = no('foo')
|
||||||
|
o2 = no('bar')
|
||||||
|
o1.artist = 'The White Stripes - a'
|
||||||
|
o1.title = 'The Air Near My Fingers - a'
|
||||||
|
o1.album = 'Elephant - a'
|
||||||
|
o2.artist = 'The White Stripes - b'
|
||||||
|
o2.title = 'The Air Near My Fingers - b'
|
||||||
|
o2.album = 'Elephant - b'
|
||||||
|
r = s.GetDupeGroups([o1,o2])
|
||||||
|
eq_(len(r), 1)
|
||||||
|
|
||||||
|
def test_tag_scan_with_different_scanned(self):
|
||||||
|
s = Scanner()
|
||||||
|
s.scan_type = SCAN_TYPE_TAG
|
||||||
|
s.scanned_tags = set(['track', 'year'])
|
||||||
|
o1 = no('foo')
|
||||||
|
o2 = no('bar')
|
||||||
|
o1.artist = 'The White Stripes'
|
||||||
|
o1.title = 'some title'
|
||||||
|
o1.track = 'foo'
|
||||||
|
o1.year = 'bar'
|
||||||
|
o2.artist = 'The White Stripes'
|
||||||
|
o2.title = 'another title'
|
||||||
|
o2.track = 'foo'
|
||||||
|
o2.year = 'bar'
|
||||||
|
r = s.GetDupeGroups([o1, o2])
|
||||||
|
eq_(len(r), 1)
|
||||||
|
|
||||||
|
def test_tag_scan_only_scans_existing_tags(self):
|
||||||
|
s = Scanner()
|
||||||
|
s.scan_type = SCAN_TYPE_TAG
|
||||||
|
s.scanned_tags = set(['artist', 'foo'])
|
||||||
|
o1 = no('foo')
|
||||||
|
o2 = no('bar')
|
||||||
|
o1.artist = 'The White Stripes'
|
||||||
|
o1.foo = 'foo'
|
||||||
|
o2.artist = 'The White Stripes'
|
||||||
|
o2.foo = 'bar'
|
||||||
|
r = s.GetDupeGroups([o1, o2])
|
||||||
|
eq_(len(r), 1) # Because 'foo' is not scanned, they match
|
||||||
|
|
||||||
|
def test_tag_scan_converts_to_str(self):
|
||||||
|
s = Scanner()
|
||||||
|
s.scan_type = SCAN_TYPE_TAG
|
||||||
|
s.scanned_tags = set(['track'])
|
||||||
|
o1 = no('foo')
|
||||||
|
o2 = no('bar')
|
||||||
|
o1.track = 42
|
||||||
|
o2.track = 42
|
||||||
|
try:
|
||||||
|
r = s.GetDupeGroups([o1, o2])
|
||||||
|
except TypeError:
|
||||||
|
raise AssertionError()
|
||||||
|
eq_(len(r), 1)
|
||||||
|
|
||||||
|
def test_tag_scan_non_ascii(self):
|
||||||
|
s = Scanner()
|
||||||
|
s.scan_type = SCAN_TYPE_TAG
|
||||||
|
s.scanned_tags = set(['title'])
|
||||||
|
o1 = no('foo')
|
||||||
|
o2 = no('bar')
|
||||||
|
o1.title = u'foobar\u00e9'
|
||||||
|
o2.title = u'foobar\u00e9'
|
||||||
|
try:
|
||||||
|
r = s.GetDupeGroups([o1, o2])
|
||||||
|
except UnicodeEncodeError:
|
||||||
|
raise AssertionError()
|
||||||
|
eq_(len(r), 1)
|
||||||
|
|
||||||
|
def test_audio_content_scan(self):
|
||||||
|
s = Scanner()
|
||||||
|
s.scan_type = SCAN_TYPE_CONTENT_AUDIO
|
||||||
|
f = [no('foo'), no('bar'), no('bleh')]
|
||||||
|
f[0].md5 = 'foo'
|
||||||
|
f[1].md5 = 'bar'
|
||||||
|
f[2].md5 = 'bleh'
|
||||||
|
f[0].md5partial = 'foo'
|
||||||
|
f[1].md5partial = 'foo'
|
||||||
|
f[2].md5partial = 'bleh'
|
||||||
|
f[0].audiosize = 1
|
||||||
|
f[1].audiosize = 1
|
||||||
|
f[2].audiosize = 1
|
||||||
|
r = s.GetDupeGroups(f)
|
||||||
|
eq_(len(r), 1)
|
||||||
|
eq_(len(r[0]), 2)
|
||||||
|
|
||||||
|
def test_audio_content_scan_compare_sizes_first(self):
|
||||||
|
class MyFile(no):
|
||||||
|
@property
|
||||||
|
def md5partial(file):
|
||||||
|
raise AssertionError()
|
||||||
|
|
||||||
|
s = Scanner()
|
||||||
|
s.scan_type = SCAN_TYPE_CONTENT_AUDIO
|
||||||
|
f = [MyFile('foo'), MyFile('bar')]
|
||||||
|
f[0].audiosize = 1
|
||||||
|
f[1].audiosize = 2
|
||||||
|
eq_(len(s.GetDupeGroups(f)), 0)
|
||||||
|
|
||||||
|
def test_ignore_list(self):
|
||||||
|
s = Scanner()
|
||||||
|
f1 = no('foobar')
|
||||||
|
f2 = no('foobar')
|
||||||
|
f3 = no('foobar')
|
||||||
|
f1.path = Path('dir1/foobar')
|
||||||
|
f2.path = Path('dir2/foobar')
|
||||||
|
f3.path = Path('dir3/foobar')
|
||||||
|
s.ignore_list.Ignore(str(f1.path),str(f2.path))
|
||||||
|
s.ignore_list.Ignore(str(f1.path),str(f3.path))
|
||||||
|
r = s.GetDupeGroups([f1,f2,f3])
|
||||||
|
eq_(len(r), 1)
|
||||||
|
g = r[0]
|
||||||
|
eq_(len(g.dupes), 1)
|
||||||
|
assert f1 not in g
|
||||||
|
assert f2 in g
|
||||||
|
assert f3 in g
|
||||||
|
# Ignored matches are not counted as discarded
|
||||||
|
eq_(s.discarded_file_count, 0)
|
||||||
|
|
||||||
|
def test_ignore_list_checks_for_unicode(self):
|
||||||
|
#scanner was calling path_str for ignore list checks. Since the Path changes, it must
|
||||||
|
#be unicode(path)
|
||||||
|
s = Scanner()
|
||||||
|
f1 = no('foobar')
|
||||||
|
f2 = no('foobar')
|
||||||
|
f3 = no('foobar')
|
||||||
|
f1.path = Path(u'foo1\u00e9')
|
||||||
|
f2.path = Path(u'foo2\u00e9')
|
||||||
|
f3.path = Path(u'foo3\u00e9')
|
||||||
|
s.ignore_list.Ignore(unicode(f1.path),unicode(f2.path))
|
||||||
|
s.ignore_list.Ignore(unicode(f1.path),unicode(f3.path))
|
||||||
|
r = s.GetDupeGroups([f1,f2,f3])
|
||||||
|
eq_(len(r), 1)
|
||||||
|
g = r[0]
|
||||||
|
eq_(len(g.dupes), 1)
|
||||||
|
assert f1 not in g
|
||||||
|
assert f2 in g
|
||||||
|
assert f3 in g
|
||||||
|
|
||||||
|
def test_file_evaluates_to_false(self):
|
||||||
|
# A very wrong way to use any() was added at some point, causing resulting group list
|
||||||
|
# to be empty.
|
||||||
|
class FalseNamedObject(NamedObject):
|
||||||
|
def __nonzero__(self):
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
s = Scanner()
|
||||||
|
f1 = FalseNamedObject('foobar')
|
||||||
|
f2 = FalseNamedObject('foobar')
|
||||||
|
r = s.GetDupeGroups([f1, f2])
|
||||||
|
eq_(len(r), 1)
|
||||||
|
|
||||||
|
def test_size_threshold(self):
|
||||||
|
# Only file equal or higher than the size_threshold in size are scanned
|
||||||
|
s = Scanner()
|
||||||
|
f1 = no('foo', 1)
|
||||||
|
f2 = no('foo', 2)
|
||||||
|
f3 = no('foo', 3)
|
||||||
|
s.size_threshold = 2
|
||||||
|
groups = s.GetDupeGroups([f1,f2,f3])
|
||||||
|
eq_(len(groups), 1)
|
||||||
|
[group] = groups
|
||||||
|
eq_(len(group), 2)
|
||||||
|
assert f1 not in group
|
||||||
|
assert f2 in group
|
||||||
|
assert f3 in group
|
||||||
|
|
||||||
|
def test_tie_breaker_path_deepness(self):
|
||||||
|
# If there is a tie in prioritization, path deepness is used as a tie breaker
|
||||||
|
s = Scanner()
|
||||||
|
o1, o2 = no('foo'), no('foo')
|
||||||
|
o1.path = Path('foo')
|
||||||
|
o2.path = Path('foo/bar')
|
||||||
|
[group] = s.GetDupeGroups([o1, o2])
|
||||||
|
assert group.ref is o2
|
||||||
|
|
||||||
|
def test_tie_breaker_copy(self):
|
||||||
|
# if copy is in the words used (even if it has a deeper path), it becomes a dupe
|
||||||
|
s = Scanner()
|
||||||
|
o1, o2 = no('foo bar Copy'), no('foo bar')
|
||||||
|
o1.path = Path('deeper/path')
|
||||||
|
o2.path = Path('foo')
|
||||||
|
[group] = s.GetDupeGroups([o1, o2])
|
||||||
|
assert group.ref is o2
|
||||||
|
|
||||||
|
def test_tie_breaker_same_name_plus_digit(self):
|
||||||
|
# if ref has the same words as dupe, but has some just one extra word which is a digit, it
|
||||||
|
# becomes a dupe
|
||||||
|
s = Scanner()
|
||||||
|
o1, o2 = no('foo bar 42'), no('foo bar')
|
||||||
|
o1.path = Path('deeper/path')
|
||||||
|
o2.path = Path('foo')
|
||||||
|
[group] = s.GetDupeGroups([o1, o2])
|
||||||
|
assert group.ref is o2
|
||||||
|
|
||||||
|
def test_partial_group_match(self):
|
||||||
|
# Count the number od discarded matches (when a file doesn't match all other dupes of the
|
||||||
|
# group) in Scanner.discarded_file_count
|
||||||
|
s = Scanner()
|
||||||
|
o1, o2, o3 = no('a b'), no('a'), no('b')
|
||||||
|
s.min_match_percentage = 50
|
||||||
|
[group] = s.GetDupeGroups([o1, o2, o3])
|
||||||
|
eq_(len(group), 2)
|
||||||
|
assert o1 in group
|
||||||
|
assert o2 in group
|
||||||
|
assert o3 not in group
|
||||||
|
eq_(s.discarded_file_count, 1)
|
||||||
|
|
||||||
|
|
||||||
|
class ScannerTest(TestCase):
|
||||||
|
def test_dont_group_files_that_dont_exist(self):
|
||||||
|
# when creating groups, check that files exist first. It's possible that these files have
|
||||||
|
# been moved during the scan by the user.
|
||||||
|
# In this test, we have to delete one of the files between the get_matches() part and the
|
||||||
|
# get_groups() part.
|
||||||
|
s = Scanner()
|
||||||
|
s.scan_type = SCAN_TYPE_CONTENT
|
||||||
|
p = self.tmppath()
|
||||||
|
io.open(p + 'file1', 'w').write('foo')
|
||||||
|
io.open(p + 'file2', 'w').write('foo')
|
||||||
|
file1, file2 = fs.get_files(p)
|
||||||
|
def getmatches(*args, **kw):
|
||||||
|
io.remove(file2.path)
|
||||||
|
return [Match(file1, file2, 100)]
|
||||||
|
s._getmatches = getmatches
|
||||||
|
|
||||||
|
assert not s.GetDupeGroups([file1, file2])
|
||||||
|
|
||||||
@@ -1,7 +1,6 @@
|
|||||||
# Created By: Virgil Dupras
|
# Created By: Virgil Dupras
|
||||||
# Created On: 2006/11/16
|
# Created On: 2006/11/16
|
||||||
# $Id$
|
# Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
|
||||||
# Copyright 2009 Hardcoded Software (http://www.hardcoded.net)
|
|
||||||
#
|
#
|
||||||
# This software is licensed under the "HS" License as described in the "LICENSE" file,
|
# This software is licensed under the "HS" License as described in the "LICENSE" file,
|
||||||
# which should be included with this package. The terms are also available at
|
# which should be included with this package. The terms are also available at
|
||||||
@@ -13,7 +12,7 @@ import time
|
|||||||
|
|
||||||
from hsutil.cocoa import as_fetch
|
from hsutil.cocoa import as_fetch
|
||||||
|
|
||||||
from dupeguru.app_cocoa import JOBID2TITLE, DupeGuru as DupeGuruBase
|
from core.app_cocoa import JOBID2TITLE, DupeGuru as DupeGuruBase
|
||||||
|
|
||||||
from . import data, scanner, fs
|
from . import data, scanner, fs
|
||||||
|
|
||||||
@@ -1,14 +1,13 @@
|
|||||||
# Created By: Virgil Dupras
|
# Created By: Virgil Dupras
|
||||||
# Created On: 2006/03/15
|
# Created On: 2006/03/15
|
||||||
# $Id$
|
# Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
|
||||||
# Copyright 2009 Hardcoded Software (http://www.hardcoded.net)
|
|
||||||
#
|
#
|
||||||
# This software is licensed under the "HS" License as described in the "LICENSE" file,
|
# This software is licensed under the "HS" License as described in the "LICENSE" file,
|
||||||
# which should be included with this package. The terms are also available at
|
# which should be included with this package. The terms are also available at
|
||||||
# http://www.hardcoded.net/licenses/hs_license
|
# http://www.hardcoded.net/licenses/hs_license
|
||||||
|
|
||||||
from hsutil.str import format_time, FT_MINUTES, format_size
|
from hsutil.str import format_time, FT_MINUTES, format_size
|
||||||
from dupeguru.data import (format_path, format_timestamp, format_words, format_perc,
|
from core.data import (format_path, format_timestamp, format_words, format_perc,
|
||||||
format_dupe_count, cmp_value)
|
format_dupe_count, cmp_value)
|
||||||
|
|
||||||
COLUMNS = [
|
COLUMNS = [
|
||||||
@@ -86,9 +85,9 @@ def GetDupeSortKey(dupe, get_group, key, delta):
|
|||||||
return m.percentage
|
return m.percentage
|
||||||
if key == 18:
|
if key == 18:
|
||||||
return 0
|
return 0
|
||||||
r = cmp_value(getattr(dupe, COLUMNS[key]['attr']))
|
r = cmp_value(getattr(dupe, COLUMNS[key]['attr'], ''))
|
||||||
if delta and (key in (2, 3, 4, 7, 8)):
|
if delta and (key in (2, 3, 4, 7, 8)):
|
||||||
r -= cmp_value(getattr(get_group().ref, COLUMNS[key]['attr']))
|
r -= cmp_value(getattr(get_group().ref, COLUMNS[key]['attr'], ''))
|
||||||
return r
|
return r
|
||||||
|
|
||||||
def GetGroupSortKey(group, key):
|
def GetGroupSortKey(group, key):
|
||||||
@@ -96,4 +95,4 @@ def GetGroupSortKey(group, key):
|
|||||||
return group.percentage
|
return group.percentage
|
||||||
if key == 18:
|
if key == 18:
|
||||||
return len(group)
|
return len(group)
|
||||||
return cmp_value(getattr(group.ref, COLUMNS[key]['attr']))
|
return cmp_value(getattr(group.ref, COLUMNS[key]['attr'], ''))
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user