From 989026051c0ed0948d526577529a56dbed9fa4db Mon Sep 17 00:00:00 2001 From: Virgil Dupras Date: Mon, 9 Jan 2012 11:15:20 -0500 Subject: [PATCH 01/26] Converted PyStatsLabel to a core instance mode. --HG-- branch : objp --- cocoa/base/PyDupeGuru.h | 2 ++ cocoa/base/ResultWindow.m | 2 +- cocoa/base/StatsLabel.h | 8 +++----- cocoa/base/StatsLabel.m | 13 ++++++++----- cocoa/inter/app.py | 2 ++ cocoa/inter/stats_label.py | 4 ---- core/app.py | 2 ++ 7 files changed, 18 insertions(+), 15 deletions(-) diff --git a/cocoa/base/PyDupeGuru.h b/cocoa/base/PyDupeGuru.h index fb8dcf1e..afbac3af 100644 --- a/cocoa/base/PyDupeGuru.h +++ b/cocoa/base/PyDupeGuru.h @@ -8,11 +8,13 @@ http://www.hardcoded.net/licenses/bsd_license #import #import "PyResultTable.h" +#import "PyStatsLabel.h" #import "PyApp.h" @interface PyDupeGuruBase : PyApp - (void)bindCocoa:(id)cocoa; - (PyResultTable *)resultTable; +- (PyStatsLabel *)statsLabel; //Actions - (NSNumber *)addDirectory:(NSString *)name; - (void)loadResultsFrom:(NSString *)filename; diff --git a/cocoa/base/ResultWindow.m b/cocoa/base/ResultWindow.m index 2c3caee6..7fcb339a 100644 --- a/cocoa/base/ResultWindow.m +++ b/cocoa/base/ResultWindow.m @@ -25,7 +25,7 @@ http://www.hardcoded.net/licenses/bsd_license /* Put a cute iTunes-like bottom bar */ [[self window] setContentBorderThickness:28 forEdge:NSMinYEdge]; table = [[ResultTable alloc] initWithPy:[py resultTable] view:matches]; - statsLabel = [[StatsLabel alloc] initWithPyParent:py labelView:stats]; + statsLabel = [[StatsLabel alloc] initWithPy:[py statsLabel] labelView:stats]; problemDialog = [[ProblemDialog alloc] initWithPy:py]; [self initResultColumns]; [self fillColumnsMenu]; diff --git a/cocoa/base/StatsLabel.h b/cocoa/base/StatsLabel.h index d8fd53bc..1fcfac70 100644 --- a/cocoa/base/StatsLabel.h +++ b/cocoa/base/StatsLabel.h @@ -10,10 +10,8 @@ http://www.hardcoded.net/licenses/bsd_license #import "HSGUIController.h" #import "PyStatsLabel.h" -@interface StatsLabel : HSGUIController -{ - NSTextField *labelView; -} -- (id)initWithPyParent:(id)aPyParent labelView:(NSTextField *)aLabelView; +@interface StatsLabel : HSGUIController {} +- (id)initWithPy:(id)aPy labelView:(NSTextField *)aLabelView; - (PyStatsLabel *)py; +- (NSTextField *)labelView; @end \ No newline at end of file diff --git a/cocoa/base/StatsLabel.m b/cocoa/base/StatsLabel.m index b2f15789..295d4be3 100644 --- a/cocoa/base/StatsLabel.m +++ b/cocoa/base/StatsLabel.m @@ -10,10 +10,9 @@ http://www.hardcoded.net/licenses/bsd_license #import "Utils.h" @implementation StatsLabel -- (id)initWithPyParent:(id)aPyParent labelView:(NSTextField *)aLabelView +- (id)initWithPy:(id)aPy labelView:(NSTextField *)aLabelView { - self = [super initWithPyClassName:@"PyStatsLabel" pyParent:aPyParent]; - labelView = [aLabelView retain]; + self = [super initWithPy:aPy view:aLabelView]; [self connect]; return self; } @@ -21,7 +20,6 @@ http://www.hardcoded.net/licenses/bsd_license - (void)dealloc { [self disconnect]; - [labelView release]; [super dealloc]; } @@ -30,9 +28,14 @@ http://www.hardcoded.net/licenses/bsd_license return (PyStatsLabel *)py; } +- (NSTextField *)labelView +{ + return (NSTextField *)[self view]; +} + /* Python --> Cocoa */ - (void)refresh { - [labelView setStringValue:[[self py] display]]; + [[self labelView] setStringValue:[[self py] display]]; } @end diff --git a/cocoa/inter/app.py b/cocoa/inter/app.py index f7472bc6..b1237570 100644 --- a/cocoa/inter/app.py +++ b/cocoa/inter/app.py @@ -8,6 +8,7 @@ from hscommon.trans import trget from core.app import JobType from .result_table import PyResultTable +from .stats_label import PyStatsLabel tr = trget('ui') @@ -31,6 +32,7 @@ class PyDupeGuruBase(PyFairware): self.cocoa = cocoa resultTable = subproxy('resultTable', 'result_table', PyResultTable) + statsLabel = subproxy('statsLabel', 'stats_label', PyStatsLabel) #---Directories def addDirectory_(self, directory): diff --git a/cocoa/inter/stats_label.py b/cocoa/inter/stats_label.py index e9fc6905..70203373 100644 --- a/cocoa/inter/stats_label.py +++ b/cocoa/inter/stats_label.py @@ -1,9 +1,5 @@ from cocoa.inter import PyGUIObject -from core.gui.stats_label import StatsLabel - class PyStatsLabel(PyGUIObject): - py_class = StatsLabel - def display(self): return self.py.display diff --git a/core/app.py b/core/app.py index cfd605c1..b01d1d9c 100644 --- a/core/app.py +++ b/core/app.py @@ -24,6 +24,7 @@ from hscommon.util import (delete_if_empty, first, escape, nonone, format_time_d from hscommon.trans import tr from . import directories, results, scanner, export, fs +from .gui.stats_label import StatsLabel HAD_FIRST_LAUNCH_PREFERENCE = 'HadFirstLaunch' DEBUG_MODE_PREFERENCE = 'DebugMode' @@ -100,6 +101,7 @@ class DupeGuru(RegistrableApplication, Broadcaster): 'ignore_hardlink_matches': False, } self.selected_dupes = [] + self.stats_label = StatsLabel(None, self) # subclasses must create self.result_table #--- Virtual From a7eeb7db893638ea04bb2e8dadb198581eac43cd Mon Sep 17 00:00:00 2001 From: Virgil Dupras Date: Wed, 11 Jan 2012 12:18:03 -0500 Subject: [PATCH 02/26] Directly embed python rather than going through a plugin. --HG-- branch : objp --- build.py | 22 ++++++++------- cocoa/se/dupeguru.xcodeproj/project.pbxproj | 26 +++++++++++------ cocoa/se/main.m | 31 +++++++++++++++------ 3 files changed, 53 insertions(+), 26 deletions(-) diff --git a/build.py b/build.py index 908bd2fa..1ae901d9 100644 --- a/build.py +++ b/build.py @@ -6,6 +6,7 @@ # which should be included with this package. The terms are also available at # http://www.hardcoded.net/licenses/bsd_license +import sys import os import os.path as op from optparse import OptionParser @@ -16,7 +17,7 @@ from setuptools import setup, Extension from hscommon import sphinxgen from hscommon.build import (add_to_pythonpath, print_and_do, copy_packages, filereplace, - get_module_version, build_all_cocoa_locs, move_all) + get_module_version, build_all_cocoa_locs, move_all, copy_sysconfig_files_for_embed) from hscommon import loc def parse_args(): @@ -36,7 +37,6 @@ def parse_args(): return options def build_cocoa(edition, dev): - from pluginbuilder import build_plugin build_cocoa_proxy_module() print("Building dg_cocoa.plugin") specific_packages = { @@ -48,14 +48,16 @@ def build_cocoa(edition, dev): copy_packages(tocopy, 'build', create_links=dev) cocoa_project_path = 'cocoa/{0}'.format(edition) shutil.copy(op.join(cocoa_project_path, 'dg_cocoa.py'), 'build') - os.chdir('build') - # We have to exclude PyQt4 specifically because it's conditionally imported in hscommon.trans - build_plugin('dg_cocoa.py', excludes=['PyQt4'], alias=dev) - 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) + from pluginbuilder import copy_embeddable_python_dylib, get_python_header_folder, collect_dependencies + copy_embeddable_python_dylib('build') + if not op.exists('build/PythonHeaders'): + os.symlink(get_python_header_folder(), 'build/PythonHeaders') + if not op.exists('build/py'): + os.mkdir('build/py') + sys.path.insert(0, 'build') + collect_dependencies('build/dg_cocoa.py', 'build/py', excludes=['PyQt4']) + del sys.path[0] + copy_sysconfig_files_for_embed('build/py') os.chdir(cocoa_project_path) print('Generating Info.plist') app_version = get_module_version('core_{}'.format(edition)) diff --git a/cocoa/se/dupeguru.xcodeproj/project.pbxproj b/cocoa/se/dupeguru.xcodeproj/project.pbxproj index d377af31..3a4ba9db 100644 --- a/cocoa/se/dupeguru.xcodeproj/project.pbxproj +++ b/cocoa/se/dupeguru.xcodeproj/project.pbxproj @@ -10,13 +10,15 @@ 8D11072D0486CEB800E47090 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B97316FDCFA39411CA2CEA /* main.m */; settings = {ATTRIBUTES = (); }; }; 8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; }; CE073F6309CAE1A3005C1D2F /* help in Resources */ = {isa = PBXBuildFile; fileRef = CE073F5409CAE1A3005C1D2F /* help */; }; + CE18004D14BDD837001B6329 /* Python in Frameworks */ = {isa = PBXBuildFile; fileRef = CE18004C14BDD837001B6329 /* Python */; }; + CE18004F14BDD854001B6329 /* Python in CopyFiles */ = {isa = PBXBuildFile; fileRef = CE18004C14BDD837001B6329 /* Python */; }; + CE18005114BDD87B001B6329 /* py in Resources */ = {isa = PBXBuildFile; fileRef = CE18005014BDD87B001B6329 /* py */; }; CE19BC6411199231007CCEB0 /* progress.xib in Resources */ = {isa = PBXBuildFile; fileRef = CE19BC6111199231007CCEB0 /* progress.xib */; }; CE27D3C412CCA43800859E67 /* HSAboutBox.m in Sources */ = {isa = PBXBuildFile; fileRef = CE27D3C312CCA43800859E67 /* HSAboutBox.m */; }; CE31819D13D85D9B00B6D649 /* about.xib in Resources */ = {isa = PBXBuildFile; fileRef = CE31819913D85D9B00B6D649 /* about.xib */; }; CE31819E13D85D9B00B6D649 /* ErrorReportWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = CE31819B13D85D9B00B6D649 /* ErrorReportWindow.xib */; }; CE381C9609914ACE003581CE /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = CE381C9409914ACE003581CE /* AppDelegate.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 */; }; CE41672D141FE1E5004F3F0B /* HSSelectableList.m in Sources */ = {isa = PBXBuildFile; fileRef = CE41672B141FE1E5004F3F0B /* HSSelectableList.m */; }; CE45579B0AE3BC2B005A9546 /* Sparkle.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CE45579A0AE3BC2B005A9546 /* Sparkle.framework */; }; CE4557B40AE3BC50005A9546 /* Sparkle.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = CE45579A0AE3BC2B005A9546 /* Sparkle.framework */; }; @@ -52,6 +54,7 @@ CE9777D1141F8CB400C13FB5 /* PrioritizeDialog.xib in Resources */ = {isa = PBXBuildFile; fileRef = CE9777CF141F8CB400C13FB5 /* PrioritizeDialog.xib */; }; CE9777D5141F9D7600C13FB5 /* HSPopUpList.m in Sources */ = {isa = PBXBuildFile; fileRef = CE9777D4141F9D7600C13FB5 /* HSPopUpList.m */; }; CEA175CA1461E8E600776591 /* locale in Resources */ = {isa = PBXBuildFile; fileRef = CEA175C91461E8E600776591 /* locale */; }; + CEA450B814BDDFD7002DAAF2 /* dg_cocoa.py in Resources */ = {isa = PBXBuildFile; fileRef = CEA450B714BDDFD7002DAAF2 /* dg_cocoa.py */; }; CEBE4D74111F0EE1009AAC6D /* HSWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = CEBE4D73111F0EE1009AAC6D /* HSWindowController.m */; }; CEE7EA130FE675C80004E467 /* DetailsPanel.m in Sources */ = {isa = PBXBuildFile; fileRef = CEE7EA120FE675C80004E467 /* DetailsPanel.m */; }; CEEB135209C837A2004D2330 /* dupeguru.icns in Resources */ = {isa = PBXBuildFile; fileRef = CEEB135109C837A2004D2330 /* dupeguru.icns */; }; @@ -75,6 +78,7 @@ dstSubfolderSpec = 10; files = ( CE4557B40AE3BC50005A9546 /* Sparkle.framework in CopyFiles */, + CE18004F14BDD854001B6329 /* Python in CopyFiles */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -116,6 +120,8 @@ CE112F5F145EF28D009C9E3E /* cs */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = cs; path = ../cs.lproj/about.xib; sourceTree = ""; }; CE112F60145EF28D009C9E3E /* cs */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = cs; path = ../cs.lproj/ErrorReportWindow.xib; sourceTree = ""; }; CE112F61145EF28D009C9E3E /* cs */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = cs; path = ../cs.lproj/FairwareReminder.xib; sourceTree = ""; }; + CE18004C14BDD837001B6329 /* Python */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = Python; path = ../../build/Python; sourceTree = ""; }; + CE18005014BDD87B001B6329 /* py */ = {isa = PBXFileReference; lastKnownFileType = folder; name = py; path = ../../build/py; sourceTree = ""; }; CE19BC6111199231007CCEB0 /* progress.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = progress.xib; sourceTree = ""; }; CE27D3C212CCA43800859E67 /* HSAboutBox.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = HSAboutBox.h; path = ../../cocoalib/HSAboutBox.h; sourceTree = SOURCE_ROOT; }; CE27D3C312CCA43800859E67 /* HSAboutBox.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = HSAboutBox.m; path = ../../cocoalib/HSAboutBox.m; sourceTree = SOURCE_ROOT; }; @@ -130,7 +136,6 @@ 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; }; 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; path = dg_cocoa.plugin; sourceTree = SOURCE_ROOT; }; CE41672A141FE1E5004F3F0B /* HSSelectableList.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HSSelectableList.h; sourceTree = ""; }; CE41672B141FE1E5004F3F0B /* HSSelectableList.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HSSelectableList.m; sourceTree = ""; }; CE41672C141FE1E5004F3F0B /* HSTable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HSTable.h; sourceTree = ""; }; @@ -219,6 +224,7 @@ CE9777D3141F9D7600C13FB5 /* HSPopUpList.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HSPopUpList.h; sourceTree = ""; }; CE9777D4141F9D7600C13FB5 /* HSPopUpList.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HSPopUpList.m; sourceTree = ""; }; CEA175C91461E8E600776591 /* locale */ = {isa = PBXFileReference; lastKnownFileType = folder; name = locale; path = ../../build/locale; sourceTree = ""; }; + CEA450B714BDDFD7002DAAF2 /* dg_cocoa.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; name = dg_cocoa.py; path = ../../build/dg_cocoa.py; sourceTree = ""; }; CEB57990146ADC5100EDF7D7 /* HSConsts.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = HSConsts.h; path = ../../cocoalib/HSConsts.h; sourceTree = ""; }; CEBE4D72111F0EE1009AAC6D /* HSWindowController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HSWindowController.h; sourceTree = ""; }; CEBE4D73111F0EE1009AAC6D /* HSWindowController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HSWindowController.m; sourceTree = ""; }; @@ -275,6 +281,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + CE18004D14BDD837001B6329 /* Python in Frameworks */, CE533603142BC034008E5374 /* Quartz.framework in Frameworks */, 8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */, CE45579B0AE3BC2B005A9546 /* Sparkle.framework in Frameworks */, @@ -300,6 +307,7 @@ 1058C7A0FEA54F0111CA2CBB /* Linked Frameworks */ = { isa = PBXGroup; children = ( + CE18004C14BDD837001B6329 /* Python */, CE45579A0AE3BC2B005A9546 /* Sparkle.framework */, 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */, CE533602142BC034008E5374 /* Quartz.framework */, @@ -341,9 +349,10 @@ 29B97317FDCFA39411CA2CEA /* Resources */ = { isa = PBXGroup; children = ( + CEA450B714BDDFD7002DAAF2 /* dg_cocoa.py */, + CE18005014BDD87B001B6329 /* py */, CEA175C91461E8E600776591 /* locale */, CE073F5409CAE1A3005C1D2F /* help */, - CE381CF509915304003581CE /* dg_cocoa.plugin */, CEFC294309C89E0000D9F998 /* images */, CEEFC0CA10943849001F3A39 /* xib */, CEEB135109C837A2004D2330 /* dupeguru.icns */, @@ -584,7 +593,6 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - CE381D0509915304003581CE /* dg_cocoa.plugin in Resources */, CE073F6309CAE1A3005C1D2F /* help in Resources */, CEEB135209C837A2004D2330 /* dupeguru.icns in Resources */, CEFC294609C89E3D00D9F998 /* folder32.png in Resources */, @@ -603,6 +611,8 @@ CE31819E13D85D9B00B6D649 /* ErrorReportWindow.xib in Resources */, CE9777D1141F8CB400C13FB5 /* PrioritizeDialog.xib in Resources */, CEA175CA1461E8E600776591 /* locale in Resources */, + CE18005114BDD87B001B6329 /* py in Resources */, + CEA450B814BDDFD7002DAAF2 /* dg_cocoa.py in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -845,8 +855,8 @@ buildSettings = { ARCHS = "$(ARCHS_STANDARD_32_64_BIT)"; GCC_C_LANGUAGE_STANDARD = c99; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = "\"$(SRCROOT)/../../build/PythonHeaders\""; + LD_RUNPATH_SEARCH_PATHS = "@executable_path/../Frameworks"; MACOSX_DEPLOYMENT_TARGET = 10.6; SDKROOT = macosx10.6; }; @@ -857,8 +867,8 @@ buildSettings = { ARCHS = "$(NATIVE_ARCH_ACTUAL)"; GCC_C_LANGUAGE_STANDARD = c99; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = "\"$(SRCROOT)/../../build/PythonHeaders\""; + LD_RUNPATH_SEARCH_PATHS = "@executable_path/../Frameworks"; MACOSX_DEPLOYMENT_TARGET = 10.6; SDKROOT = macosx10.6; }; diff --git a/cocoa/se/main.m b/cocoa/se/main.m index 7fedbb8e..163a7b58 100644 --- a/cocoa/se/main.m +++ b/cocoa/se/main.m @@ -7,17 +7,32 @@ http://www.hardcoded.net/licenses/bsd_license */ #import -#import "Utils.h" +#import +#import int main(int argc, char *argv[]) { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - [Utils setPluginName:@"dg_cocoa"]; - NSString *pluginPath = [[NSBundle mainBundle] - pathForResource:@"dg_cocoa" - ofType:@"plugin"]; - NSBundle *pluginBundle = [NSBundle bundleWithPath:pluginPath]; - [pluginBundle load]; + NSString *respath = [[NSBundle mainBundle] resourcePath]; + NSString *mainpy = [respath stringByAppendingPathComponent:@"dg_cocoa.py"]; + wchar_t wPythonPath[PATH_MAX+1]; + NSString *pypath = [respath stringByAppendingPathComponent:@"py"]; + mbstowcs(wPythonPath, [pypath fileSystemRepresentation], PATH_MAX+1); + Py_SetPath(wPythonPath); + Py_SetPythonHome(wPythonPath); + Py_Initialize(); + PyEval_InitThreads(); + PyGILState_STATE gilState = PyGILState_Ensure(); + FILE* fp = fopen([mainpy UTF8String], "r"); + PyRun_SimpleFile(fp, [mainpy UTF8String]); + fclose(fp); + PyGILState_Release(gilState); + if (gilState == PyGILState_LOCKED) { + PyThreadState_Swap(NULL); + PyEval_ReleaseLock(); + } + int result = NSApplicationMain(argc, (const char **) argv); + Py_Finalize(); [pool release]; - return NSApplicationMain(argc, (const char **) argv); + return result; } From 0c7d73854d37b4bc908545332a58b04493fc5036 Mon Sep 17 00:00:00 2001 From: Virgil Dupras Date: Wed, 11 Jan 2012 15:14:59 -0500 Subject: [PATCH 03/26] Converted stats_label to objp. --HG-- branch : objp --- .hgignore | 1 + build.py | 24 ++++++++++++++++++++- cocoa/base/PyStatsLabel.h | 14 ------------ cocoa/base/ResultWindow.m | 2 +- cocoa/base/StatsLabel.h | 8 ++++--- cocoa/base/StatsLabel.m | 23 ++++++++++++++------ cocoa/base/bridge/StatsLabelView.h | 5 +++++ cocoa/inter/stats_label.py | 7 +++--- cocoa/se/dg_cocoa.py | 5 +++++ cocoa/se/dupeguru.xcodeproj/project.pbxproj | 23 ++++++++++++++++++-- 10 files changed, 82 insertions(+), 30 deletions(-) delete mode 100644 cocoa/base/PyStatsLabel.h create mode 100644 cocoa/base/bridge/StatsLabelView.h diff --git a/.hgignore b/.hgignore index 1569a994..95f274c4 100644 --- a/.hgignore +++ b/.hgignore @@ -14,6 +14,7 @@ build dist install installer_tmp-cache +cocoa/autogen cocoa/*/Info.plist cocoa/*/build cocoa/*/*.app diff --git a/build.py b/build.py index 1ae901d9..766aa0c4 100644 --- a/build.py +++ b/build.py @@ -17,7 +17,7 @@ from setuptools import setup, Extension from hscommon import sphinxgen from hscommon.build import (add_to_pythonpath, print_and_do, copy_packages, filereplace, - get_module_version, build_all_cocoa_locs, move_all, copy_sysconfig_files_for_embed) + get_module_version, build_all_cocoa_locs, move_all, copy_sysconfig_files_for_embed, copy_all) from hscommon import loc def parse_args(): @@ -38,6 +38,7 @@ def parse_args(): def build_cocoa(edition, dev): build_cocoa_proxy_module() + build_cocoa_bridging_interfaces() print("Building dg_cocoa.plugin") specific_packages = { 'se': ['core_se'], @@ -56,6 +57,8 @@ def build_cocoa(edition, dev): os.mkdir('build/py') sys.path.insert(0, 'build') collect_dependencies('build/dg_cocoa.py', 'build/py', excludes=['PyQt4']) + # Views are not referenced by python code, so they're not found by the collector. + copy_all('build/inter/*.so', 'build/py/inter') del sys.path[0] copy_sysconfig_files_for_embed('build/py') os.chdir(cocoa_project_path) @@ -170,6 +173,25 @@ def build_cocoa_proxy_module(): ) move_all('CocoaProxy*', 'cocoalib/cocoa') +def build_cocoa_bridging_interfaces(): + print("Building Cocoa Bridging Interfaces") + import objp.o2p + import objp.p2o + add_to_pythonpath('cocoa') + add_to_pythonpath('cocoalib') + from inter.stats_label import PyStatsLabel + objp.o2p.generate_objc_code(PyStatsLabel, 'cocoa/autogen') + objp.p2o.generate_python_proxy_code('cocoa/base/bridge/StatsLabelView.h', 'build/StatsLabelView.m') + exts = [ + Extension("StatsLabelView", ['build/StatsLabelView.m', 'build/ObjP.m'], + extra_link_args=["-framework", "Foundation"]), + ] + setup( + script_args = ['build_ext', '--inplace'], + ext_modules = exts, + ) + move_all('StatsLabelView*', 'cocoa/inter') + def build_pe_modules(ui): print("Building PE Modules") exts = [ diff --git a/cocoa/base/PyStatsLabel.h b/cocoa/base/PyStatsLabel.h deleted file mode 100644 index f9c50526..00000000 --- a/cocoa/base/PyStatsLabel.h +++ /dev/null @@ -1,14 +0,0 @@ -/* -Copyright 2011 Hardcoded Software (http://www.hardcoded.net) - -This software is licensed under the "BSD" License as described in the "LICENSE" file, -which should be included with this package. The terms are also available at -http://www.hardcoded.net/licenses/bsd_license -*/ - -#import -#import "PyGUI.h" - -@interface PyStatsLabel : PyGUI -- (NSString *)display; -@end \ No newline at end of file diff --git a/cocoa/base/ResultWindow.m b/cocoa/base/ResultWindow.m index 7fcb339a..3a4e53ec 100644 --- a/cocoa/base/ResultWindow.m +++ b/cocoa/base/ResultWindow.m @@ -25,7 +25,7 @@ http://www.hardcoded.net/licenses/bsd_license /* Put a cute iTunes-like bottom bar */ [[self window] setContentBorderThickness:28 forEdge:NSMinYEdge]; table = [[ResultTable alloc] initWithPy:[py resultTable] view:matches]; - statsLabel = [[StatsLabel alloc] initWithPy:[py statsLabel] labelView:stats]; + statsLabel = [[StatsLabel alloc] initWithLabelView:stats]; problemDialog = [[ProblemDialog alloc] initWithPy:py]; [self initResultColumns]; [self fillColumnsMenu]; diff --git a/cocoa/base/StatsLabel.h b/cocoa/base/StatsLabel.h index 1fcfac70..7fbc677d 100644 --- a/cocoa/base/StatsLabel.h +++ b/cocoa/base/StatsLabel.h @@ -7,11 +7,13 @@ http://www.hardcoded.net/licenses/bsd_license */ #import -#import "HSGUIController.h" #import "PyStatsLabel.h" -@interface StatsLabel : HSGUIController {} -- (id)initWithPy:(id)aPy labelView:(NSTextField *)aLabelView; +@interface StatsLabel : NSObject { + PyStatsLabel *py; + NSTextField *view; +} +- (id)initWithLabelView:(NSTextField *)aLabelView; - (PyStatsLabel *)py; - (NSTextField *)labelView; @end \ No newline at end of file diff --git a/cocoa/base/StatsLabel.m b/cocoa/base/StatsLabel.m index 295d4be3..b2ea972b 100644 --- a/cocoa/base/StatsLabel.m +++ b/cocoa/base/StatsLabel.m @@ -6,20 +6,31 @@ which should be included with this package. The terms are also available at http://www.hardcoded.net/licenses/bsd_license */ +#import #import "StatsLabel.h" -#import "Utils.h" +#import "ObjP.h" @implementation StatsLabel -- (id)initWithPy:(id)aPy labelView:(NSTextField *)aLabelView +- (id)initWithLabelView:(NSTextField *)aLabelView { - self = [super initWithPy:aPy view:aLabelView]; - [self connect]; + self = [self init]; + view = [aLabelView retain]; + PyGILState_STATE gilState = PyGILState_Ensure(); + PyObject *pModule = PyImport_AddModule("__main__"); + PyObject *pAppInstance = PyObject_GetAttrString(pModule, "APP_INSTANCE"); + PyObject *pStatsLabel = PyObject_GetAttrString(pAppInstance, "stats_label"); + PyObject *pCallback = ObjP_classInstanceWithRef(@"StatsLabelView", @"inter.StatsLabelView", self); + py = [[PyStatsLabel alloc] initWithModel:pStatsLabel Callback:pCallback]; + PyGILState_Release(gilState); + [[self py] connect]; return self; } - (void)dealloc { - [self disconnect]; + [[self py] disconnect]; + [py release]; + [view release]; [super dealloc]; } @@ -30,7 +41,7 @@ http://www.hardcoded.net/licenses/bsd_license - (NSTextField *)labelView { - return (NSTextField *)[self view]; + return (NSTextField *)view; } /* Python --> Cocoa */ diff --git a/cocoa/base/bridge/StatsLabelView.h b/cocoa/base/bridge/StatsLabelView.h new file mode 100644 index 00000000..5bd6ba6b --- /dev/null +++ b/cocoa/base/bridge/StatsLabelView.h @@ -0,0 +1,5 @@ +#import + +@protocol StatsLabelView +- (void)refresh; +@end \ No newline at end of file diff --git a/cocoa/inter/stats_label.py b/cocoa/inter/stats_label.py index 70203373..16788fde 100644 --- a/cocoa/inter/stats_label.py +++ b/cocoa/inter/stats_label.py @@ -1,5 +1,6 @@ -from cocoa.inter import PyGUIObject +from cocoa.inter2 import PyGUIObject class PyStatsLabel(PyGUIObject): - def display(self): - return self.py.display + + def display(self) -> str: + return self.model.display diff --git a/cocoa/se/dg_cocoa.py b/cocoa/se/dg_cocoa.py index 3f71c71a..7ff792cd 100644 --- a/cocoa/se/dg_cocoa.py +++ b/cocoa/se/dg_cocoa.py @@ -22,10 +22,15 @@ from inter.result_table import PyResultTable from inter.stats_label import PyStatsLabel from inter.app_se import DupeGuru +# XXX temporary hack +APP_INSTANCE = None + class PyDupeGuru(PyDupeGuruBase): def init(self): self = super(PyDupeGuru,self).init() self._init(DupeGuru) + global APP_INSTANCE + APP_INSTANCE = self.py return self #---Properties diff --git a/cocoa/se/dupeguru.xcodeproj/project.pbxproj b/cocoa/se/dupeguru.xcodeproj/project.pbxproj index 3a4ba9db..4447a6a2 100644 --- a/cocoa/se/dupeguru.xcodeproj/project.pbxproj +++ b/cocoa/se/dupeguru.xcodeproj/project.pbxproj @@ -14,6 +14,8 @@ CE18004F14BDD854001B6329 /* Python in CopyFiles */ = {isa = PBXBuildFile; fileRef = CE18004C14BDD837001B6329 /* Python */; }; CE18005114BDD87B001B6329 /* py in Resources */ = {isa = PBXBuildFile; fileRef = CE18005014BDD87B001B6329 /* py */; }; CE19BC6411199231007CCEB0 /* progress.xib in Resources */ = {isa = PBXBuildFile; fileRef = CE19BC6111199231007CCEB0 /* progress.xib */; }; + CE1D091814BE0C6400CA6B8C /* ObjP.m in Sources */ = {isa = PBXBuildFile; fileRef = CE1D091514BE0C6400CA6B8C /* ObjP.m */; }; + CE1D091914BE0C6400CA6B8C /* PyStatsLabel.m in Sources */ = {isa = PBXBuildFile; fileRef = CE1D091714BE0C6400CA6B8C /* PyStatsLabel.m */; }; CE27D3C412CCA43800859E67 /* HSAboutBox.m in Sources */ = {isa = PBXBuildFile; fileRef = CE27D3C312CCA43800859E67 /* HSAboutBox.m */; }; CE31819D13D85D9B00B6D649 /* about.xib in Resources */ = {isa = PBXBuildFile; fileRef = CE31819913D85D9B00B6D649 /* about.xib */; }; CE31819E13D85D9B00B6D649 /* ErrorReportWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = CE31819B13D85D9B00B6D649 /* ErrorReportWindow.xib */; }; @@ -123,6 +125,10 @@ CE18004C14BDD837001B6329 /* Python */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = Python; path = ../../build/Python; sourceTree = ""; }; CE18005014BDD87B001B6329 /* py */ = {isa = PBXFileReference; lastKnownFileType = folder; name = py; path = ../../build/py; sourceTree = ""; }; CE19BC6111199231007CCEB0 /* progress.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = progress.xib; sourceTree = ""; }; + CE1D091414BE0C6400CA6B8C /* ObjP.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ObjP.h; sourceTree = ""; }; + CE1D091514BE0C6400CA6B8C /* ObjP.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ObjP.m; sourceTree = ""; }; + CE1D091614BE0C6400CA6B8C /* PyStatsLabel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PyStatsLabel.h; sourceTree = ""; }; + CE1D091714BE0C6400CA6B8C /* PyStatsLabel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PyStatsLabel.m; sourceTree = ""; }; CE27D3C212CCA43800859E67 /* HSAboutBox.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = HSAboutBox.h; path = ../../cocoalib/HSAboutBox.h; sourceTree = SOURCE_ROOT; }; CE27D3C312CCA43800859E67 /* HSAboutBox.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = HSAboutBox.m; path = ../../cocoalib/HSAboutBox.m; sourceTree = SOURCE_ROOT; }; CE31819A13D85D9B00B6D649 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = ../en.lproj/about.xib; sourceTree = ""; }; @@ -214,7 +220,6 @@ CE89240914239CC30024CE4E /* PyPrioritizeList.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PyPrioritizeList.h; path = ../base/PyPrioritizeList.h; sourceTree = ""; }; CE8C53B61173248F0011B41F /* PyTable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PyTable.h; sourceTree = ""; }; CE8C53BB117324CE0011B41F /* HSTable.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HSTable.m; sourceTree = ""; }; - CE91F210113BC22D0010360B /* PyStatsLabel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PyStatsLabel.h; path = ../base/PyStatsLabel.h; sourceTree = SOURCE_ROOT; }; CE91F213113BC22D0010360B /* StatsLabel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = StatsLabel.h; path = ../base/StatsLabel.h; sourceTree = SOURCE_ROOT; }; CE91F214113BC22D0010360B /* StatsLabel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = StatsLabel.m; path = ../base/StatsLabel.m; sourceTree = SOURCE_ROOT; }; CE9777CB141F8C2500C13FB5 /* PrioritizeDialog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PrioritizeDialog.h; path = ../base/PrioritizeDialog.h; sourceTree = ""; }; @@ -384,6 +389,18 @@ path = ../../cocoalib/xib; sourceTree = SOURCE_ROOT; }; + CE1D091314BE0C6400CA6B8C /* autogen */ = { + isa = PBXGroup; + children = ( + CE1D091414BE0C6400CA6B8C /* ObjP.h */, + CE1D091514BE0C6400CA6B8C /* ObjP.m */, + CE1D091614BE0C6400CA6B8C /* PyStatsLabel.h */, + CE1D091714BE0C6400CA6B8C /* PyStatsLabel.m */, + ); + name = autogen; + path = ../autogen; + sourceTree = ""; + }; CE76FDBD111EE37C006618EA /* views */ = { isa = PBXGroup; children = ( @@ -495,10 +512,10 @@ CEFC7FB00FC9518F00CD5728 /* dgbase */ = { isa = PBXGroup; children = ( + CE1D091314BE0C6400CA6B8C /* autogen */, CE6DD4E4124CA3070089A48D /* PyResultTable.h */, CE6DD4E5124CA3070089A48D /* ResultTable.h */, CE6DD4E6124CA3070089A48D /* ResultTable.m */, - CE91F210113BC22D0010360B /* PyStatsLabel.h */, CE91F213113BC22D0010360B /* StatsLabel.h */, CE91F214113BC22D0010360B /* StatsLabel.m */, CE76FDD1111EE3A7006618EA /* DirectoryOutline.h */, @@ -658,6 +675,8 @@ CE89240A14239CC30024CE4E /* PrioritizeList.m in Sources */, CE5335FC142BBFAF008E5374 /* HSQuicklook.m in Sources */, CE54A87E148046F9008EEA77 /* HSColumns.m in Sources */, + CE1D091814BE0C6400CA6B8C /* ObjP.m in Sources */, + CE1D091914BE0C6400CA6B8C /* PyStatsLabel.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; From 12467c9493f71c77bd6ef01ce9124abd18856f8f Mon Sep 17 00:00:00 2001 From: Virgil Dupras Date: Wed, 11 Jan 2012 15:55:25 -0500 Subject: [PATCH 04/26] Converted extra_fairware_reminder to objp. --HG-- branch : objp --- build.py | 28 +++++++++++-------- cocoa/base/AppDelegate.m | 3 +- cocoa/base/ExtraFairwareReminder.h | 5 ++-- cocoa/base/ExtraFairwareReminder.m | 14 ++++++++-- cocoa/base/PyExtraFairwareReminder.h | 15 ---------- cocoa/base/bridge/ExtraFairwareReminderView.h | 8 ++++++ cocoa/inter/extra_fairware_reminder.py | 18 +++++------- cocoa/se/dupeguru.xcodeproj/project.pbxproj | 8 ++++-- core/app.py | 2 ++ 9 files changed, 57 insertions(+), 44 deletions(-) delete mode 100644 cocoa/base/PyExtraFairwareReminder.h create mode 100644 cocoa/base/bridge/ExtraFairwareReminderView.h diff --git a/build.py b/build.py index 766aa0c4..50cf8e01 100644 --- a/build.py +++ b/build.py @@ -180,17 +180,23 @@ def build_cocoa_bridging_interfaces(): add_to_pythonpath('cocoa') add_to_pythonpath('cocoalib') from inter.stats_label import PyStatsLabel - objp.o2p.generate_objc_code(PyStatsLabel, 'cocoa/autogen') - objp.p2o.generate_python_proxy_code('cocoa/base/bridge/StatsLabelView.h', 'build/StatsLabelView.m') - exts = [ - Extension("StatsLabelView", ['build/StatsLabelView.m', 'build/ObjP.m'], - extra_link_args=["-framework", "Foundation"]), - ] - setup( - script_args = ['build_ext', '--inplace'], - ext_modules = exts, - ) - move_all('StatsLabelView*', 'cocoa/inter') + from inter.extra_fairware_reminder import PyExtraFairwareReminder + for class_ in [PyStatsLabel, PyExtraFairwareReminder]: + objp.o2p.generate_objc_code(class_, 'cocoa/autogen') + for fn in os.listdir('cocoa/base/bridge'): + basename = fn[:-2] + header_path = op.join('cocoa/base/bridge', fn) + extmodule_path = op.join('build', basename + '.m') + objp.p2o.generate_python_proxy_code(header_path, extmodule_path) + exts = [ + Extension(basename, [extmodule_path, 'build/ObjP.m'], + extra_link_args=["-framework", "Foundation"]), + ] + setup( + script_args = ['build_ext', '--inplace'], + ext_modules = exts, + ) + move_all('*.so', 'cocoa/inter') def build_pe_modules(ui): print("Building PE Modules") diff --git a/cocoa/base/AppDelegate.m b/cocoa/base/AppDelegate.m index 6cdda0b8..7e8c7309 100644 --- a/cocoa/base/AppDelegate.m +++ b/cocoa/base/AppDelegate.m @@ -207,9 +207,10 @@ http://www.hardcoded.net/licenses/bsd_license /* model --> view */ - (void)showExtraFairwareReminder { - ExtraFairwareReminder *dialog = [[ExtraFairwareReminder alloc] initWithPy:py]; + ExtraFairwareReminder *dialog = [[ExtraFairwareReminder alloc] init]; [dialog start]; [NSApp runModalForWindow:[dialog window]]; + [dialog close]; [dialog release]; } diff --git a/cocoa/base/ExtraFairwareReminder.h b/cocoa/base/ExtraFairwareReminder.h index 35ef746a..808a2699 100644 --- a/cocoa/base/ExtraFairwareReminder.h +++ b/cocoa/base/ExtraFairwareReminder.h @@ -11,13 +11,14 @@ http://www.hardcoded.net/licenses/bsd_license #import "HSWindowController.h" #import "PyApp.h" -@interface ExtraFairwareReminder : HSWindowController +@interface ExtraFairwareReminder : NSWindowController { IBOutlet NSButton *continueButton; + PyExtraFairwareReminder *py; NSTimer *timer; } -- (id)initWithPy:(PyApp *)aPy; +- (id)init; - (PyExtraFairwareReminder *)py; - (void)start; diff --git a/cocoa/base/ExtraFairwareReminder.m b/cocoa/base/ExtraFairwareReminder.m index 98dbbb07..b6351fab 100644 --- a/cocoa/base/ExtraFairwareReminder.m +++ b/cocoa/base/ExtraFairwareReminder.m @@ -6,19 +6,29 @@ which should be included with this package. The terms are also available at http://www.hardcoded.net/licenses/bsd_license */ +#import #import "ExtraFairwareReminder.h" +#import "ObjP.h" @implementation ExtraFairwareReminder -- (id)initWithPy:(PyApp *)aPy +- (id)init { - self = [super initWithNibName:@"ExtraFairwareReminder" pyClassName:@"PyExtraFairwareReminder" pyParent:aPy]; + self = [super initWithWindowNibName:@"ExtraFairwareReminder"]; [self window]; [continueButton setEnabled:NO]; + PyGILState_STATE gilState = PyGILState_Ensure(); + PyObject *pModule = PyImport_AddModule("__main__"); + PyObject *pAppInstance = PyObject_GetAttrString(pModule, "APP_INSTANCE"); + PyObject *pStatsLabel = PyObject_GetAttrString(pAppInstance, "extra_fairware_reminder"); + PyObject *pCallback = ObjP_classInstanceWithRef(@"ExtraFairwareReminderView", @"inter.ExtraFairwareReminderView", self); + py = [[PyExtraFairwareReminder alloc] initWithModel:pStatsLabel Callback:pCallback]; + PyGILState_Release(gilState); return self; } - (void)dealloc { + [py release]; [timer release]; [super dealloc]; } diff --git a/cocoa/base/PyExtraFairwareReminder.h b/cocoa/base/PyExtraFairwareReminder.h deleted file mode 100644 index ebfecfac..00000000 --- a/cocoa/base/PyExtraFairwareReminder.h +++ /dev/null @@ -1,15 +0,0 @@ -/* -Copyright 2011 Hardcoded Software (http://www.hardcoded.net) - -This software is licensed under the "BSD" License as described in the "LICENSE" file, -which should be included with this package. The terms are also available at -http://www.hardcoded.net/licenses/bsd_license -*/ - -#import -#import "PyGUI.h" - -@interface PyExtraFairwareReminder : PyGUI -- (void)start; -- (void)updateButton; -@end diff --git a/cocoa/base/bridge/ExtraFairwareReminderView.h b/cocoa/base/bridge/ExtraFairwareReminderView.h new file mode 100644 index 00000000..a7806194 --- /dev/null +++ b/cocoa/base/bridge/ExtraFairwareReminderView.h @@ -0,0 +1,8 @@ +#import + +@protocol ExtraFairwareReminderView +- (void)startTimer; +- (void)stopTimer; +- (void)setButtonText:(NSString *)text; +- (void)enableButton; +@end \ No newline at end of file diff --git a/cocoa/inter/extra_fairware_reminder.py b/cocoa/inter/extra_fairware_reminder.py index 97904b1d..2ec99bd6 100644 --- a/cocoa/inter/extra_fairware_reminder.py +++ b/cocoa/inter/extra_fairware_reminder.py @@ -1,25 +1,21 @@ -from cocoa.inter import PyGUIObject - -from core.gui.extra_fairware_reminder import ExtraFairwareReminder +from cocoa.inter2 import PyGUIObject class PyExtraFairwareReminder(PyGUIObject): - py_class = ExtraFairwareReminder - def start(self): - self.py.start() + self.model.start() def updateButton(self): - self.py.update_button() + self.model.update_button() # model --> view def start_timer(self): - self.cocoa.startTimer() + self.callback.startTimer() def stop_timer(self): - self.cocoa.stopTimer() + self.callback.stopTimer() def enable_button(self): - self.cocoa.enableButton() + self.callback.enableButton() def set_button_text(self, text): - self.cocoa.setButtonText_(text) \ No newline at end of file + self.callback.setButtonText_(text) diff --git a/cocoa/se/dupeguru.xcodeproj/project.pbxproj b/cocoa/se/dupeguru.xcodeproj/project.pbxproj index 4447a6a2..0b92ffb4 100644 --- a/cocoa/se/dupeguru.xcodeproj/project.pbxproj +++ b/cocoa/se/dupeguru.xcodeproj/project.pbxproj @@ -55,6 +55,7 @@ CE9777CD141F8C2500C13FB5 /* PrioritizeDialog.m in Sources */ = {isa = PBXBuildFile; fileRef = CE9777CC141F8C2500C13FB5 /* PrioritizeDialog.m */; }; CE9777D1141F8CB400C13FB5 /* PrioritizeDialog.xib in Resources */ = {isa = PBXBuildFile; fileRef = CE9777CF141F8CB400C13FB5 /* PrioritizeDialog.xib */; }; CE9777D5141F9D7600C13FB5 /* HSPopUpList.m in Sources */ = {isa = PBXBuildFile; fileRef = CE9777D4141F9D7600C13FB5 /* HSPopUpList.m */; }; + CE9D842A14BE2AE900184165 /* PyExtraFairwareReminder.m in Sources */ = {isa = PBXBuildFile; fileRef = CE9D842914BE2AE900184165 /* PyExtraFairwareReminder.m */; }; CEA175CA1461E8E600776591 /* locale in Resources */ = {isa = PBXBuildFile; fileRef = CEA175C91461E8E600776591 /* locale */; }; CEA450B814BDDFD7002DAAF2 /* dg_cocoa.py in Resources */ = {isa = PBXBuildFile; fileRef = CEA450B714BDDFD7002DAAF2 /* dg_cocoa.py */; }; CEBE4D74111F0EE1009AAC6D /* HSWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = CEBE4D73111F0EE1009AAC6D /* HSWindowController.m */; }; @@ -157,7 +158,6 @@ CE647E561173024A006D28BA /* PyProblemDialog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PyProblemDialog.h; path = ../base/PyProblemDialog.h; sourceTree = SOURCE_ROOT; }; CE665B2D13225ADD003F5CFB /* ExtraFairwareReminder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ExtraFairwareReminder.h; path = ../base/ExtraFairwareReminder.h; sourceTree = SOURCE_ROOT; }; CE665B2E13225ADD003F5CFB /* ExtraFairwareReminder.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = ExtraFairwareReminder.m; path = ../base/ExtraFairwareReminder.m; sourceTree = SOURCE_ROOT; }; - CE665B2F13225ADD003F5CFB /* PyExtraFairwareReminder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PyExtraFairwareReminder.h; path = ../base/PyExtraFairwareReminder.h; sourceTree = SOURCE_ROOT; }; CE665B3213225AF8003F5CFB /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = ../base/en.lproj/ExtraFairwareReminder.xib; sourceTree = SOURCE_ROOT; }; CE665B3413225B07003F5CFB /* fr */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = fr; path = ../base/fr.lproj/ExtraFairwareReminder.xib; sourceTree = SOURCE_ROOT; }; CE6DD4E4124CA3070089A48D /* PyResultTable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PyResultTable.h; path = ../base/PyResultTable.h; sourceTree = SOURCE_ROOT; }; @@ -228,6 +228,8 @@ CE9777D2141F9D6500C13FB5 /* PySelectableList.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PySelectableList.h; sourceTree = ""; }; CE9777D3141F9D7600C13FB5 /* HSPopUpList.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HSPopUpList.h; sourceTree = ""; }; CE9777D4141F9D7600C13FB5 /* HSPopUpList.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HSPopUpList.m; sourceTree = ""; }; + CE9D842814BE2AE900184165 /* PyExtraFairwareReminder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PyExtraFairwareReminder.h; sourceTree = ""; }; + CE9D842914BE2AE900184165 /* PyExtraFairwareReminder.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PyExtraFairwareReminder.m; sourceTree = ""; }; CEA175C91461E8E600776591 /* locale */ = {isa = PBXFileReference; lastKnownFileType = folder; name = locale; path = ../../build/locale; sourceTree = ""; }; CEA450B714BDDFD7002DAAF2 /* dg_cocoa.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; name = dg_cocoa.py; path = ../../build/dg_cocoa.py; sourceTree = ""; }; CEB57990146ADC5100EDF7D7 /* HSConsts.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = HSConsts.h; path = ../../cocoalib/HSConsts.h; sourceTree = ""; }; @@ -396,6 +398,8 @@ CE1D091514BE0C6400CA6B8C /* ObjP.m */, CE1D091614BE0C6400CA6B8C /* PyStatsLabel.h */, CE1D091714BE0C6400CA6B8C /* PyStatsLabel.m */, + CE9D842814BE2AE900184165 /* PyExtraFairwareReminder.h */, + CE9D842914BE2AE900184165 /* PyExtraFairwareReminder.m */, ); name = autogen; path = ../autogen; @@ -537,7 +541,6 @@ CE647E541173024A006D28BA /* ProblemDialog.h */, CE647E551173024A006D28BA /* ProblemDialog.m */, CE647E561173024A006D28BA /* PyProblemDialog.h */, - CE665B2F13225ADD003F5CFB /* PyExtraFairwareReminder.h */, CE9777CB141F8C2500C13FB5 /* PrioritizeDialog.h */, CE9777CC141F8C2500C13FB5 /* PrioritizeDialog.m */, CE89240814239CC30024CE4E /* PyPrioritizeDialog.h */, @@ -677,6 +680,7 @@ CE54A87E148046F9008EEA77 /* HSColumns.m in Sources */, CE1D091814BE0C6400CA6B8C /* ObjP.m in Sources */, CE1D091914BE0C6400CA6B8C /* PyStatsLabel.m in Sources */, + CE9D842A14BE2AE900184165 /* PyExtraFairwareReminder.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/core/app.py b/core/app.py index b01d1d9c..81cec4d4 100644 --- a/core/app.py +++ b/core/app.py @@ -25,6 +25,7 @@ from hscommon.trans import tr from . import directories, results, scanner, export, fs from .gui.stats_label import StatsLabel +from .gui.extra_fairware_reminder import ExtraFairwareReminder HAD_FIRST_LAUNCH_PREFERENCE = 'HadFirstLaunch' DEBUG_MODE_PREFERENCE = 'DebugMode' @@ -102,6 +103,7 @@ class DupeGuru(RegistrableApplication, Broadcaster): } self.selected_dupes = [] self.stats_label = StatsLabel(None, self) + self.extra_fairware_reminder = ExtraFairwareReminder(None, self) # subclasses must create self.result_table #--- Virtual From e6819781f6131ce017c8bfeb8b78734db43f66c5 Mon Sep 17 00:00:00 2001 From: Virgil Dupras Date: Thu, 12 Jan 2012 09:41:03 -0500 Subject: [PATCH 05/26] Converted details_panel to objp. --HG-- branch : objp --- build.py | 5 +++-- cocoa/base/AppDelegate.m | 2 +- cocoa/base/DetailsPanel.h | 6 ++++-- cocoa/base/DetailsPanel.m | 19 ++++++++++++++----- cocoa/base/ExtraFairwareReminder.m | 4 ++-- cocoa/base/PyDetailsPanel.h | 15 --------------- cocoa/base/bridge/DetailsPanelView.h | 5 +++++ cocoa/inter/details_panel.py | 15 +++++---------- cocoa/se/dupeguru.xcodeproj/project.pbxproj | 12 ++++++++---- core/app.py | 6 ++++-- 10 files changed, 46 insertions(+), 43 deletions(-) delete mode 100644 cocoa/base/PyDetailsPanel.h create mode 100644 cocoa/base/bridge/DetailsPanelView.h diff --git a/build.py b/build.py index 50cf8e01..36c788a5 100644 --- a/build.py +++ b/build.py @@ -179,9 +179,10 @@ def build_cocoa_bridging_interfaces(): import objp.p2o add_to_pythonpath('cocoa') add_to_pythonpath('cocoalib') - from inter.stats_label import PyStatsLabel + from inter.details_panel import PyDetailsPanel from inter.extra_fairware_reminder import PyExtraFairwareReminder - for class_ in [PyStatsLabel, PyExtraFairwareReminder]: + from inter.stats_label import PyStatsLabel + for class_ in [PyDetailsPanel, PyExtraFairwareReminder, PyStatsLabel]: objp.o2p.generate_objc_code(class_, 'cocoa/autogen') for fn in os.listdir('cocoa/base/bridge'): basename = fn[:-2] diff --git a/cocoa/base/AppDelegate.m b/cocoa/base/AppDelegate.m index 7e8c7309..b3afbfc9 100644 --- a/cocoa/base/AppDelegate.m +++ b/cocoa/base/AppDelegate.m @@ -59,7 +59,7 @@ http://www.hardcoded.net/licenses/bsd_license - (DetailsPanel *)createDetailsPanel { - return [[DetailsPanel alloc] initWithPy:py]; + return [[DetailsPanel alloc] init]; } - (NSString *)homepageURL diff --git a/cocoa/base/DetailsPanel.h b/cocoa/base/DetailsPanel.h index 0fc9d9b1..b9dc867d 100644 --- a/cocoa/base/DetailsPanel.h +++ b/cocoa/base/DetailsPanel.h @@ -11,11 +11,13 @@ http://www.hardcoded.net/licenses/bsd_license #import "PyApp.h" #import "PyDetailsPanel.h" -@interface DetailsPanel : HSWindowController +@interface DetailsPanel : NSWindowController { IBOutlet NSTableView *detailsTable; + + PyDetailsPanel *py; } -- (id)initWithPy:(PyApp *)aPy; +- (id)init; - (PyDetailsPanel *)py; - (BOOL)isVisible; diff --git a/cocoa/base/DetailsPanel.m b/cocoa/base/DetailsPanel.m index a46c4821..0ea4931a 100644 --- a/cocoa/base/DetailsPanel.m +++ b/cocoa/base/DetailsPanel.m @@ -6,21 +6,30 @@ which should be included with this package. The terms are also available at http://www.hardcoded.net/licenses/bsd_license */ +#import #import "DetailsPanel.h" -#import "Utils.h" +#import "ObjP.h" @implementation DetailsPanel -- (id)initWithPy:(PyApp *)aPy +- (id)init { - self = [super initWithNibName:@"DetailsPanel" pyClassName:@"PyDetailsPanel" pyParent:aPy]; + self = [super initWithWindowNibName:@"DetailsPanel"]; [self window]; //So the detailsTable is initialized. - [self connect]; + PyGILState_STATE gilState = PyGILState_Ensure(); + PyObject *pModule = PyImport_AddModule("__main__"); + PyObject *pAppInstance = PyObject_GetAttrString(pModule, "APP_INSTANCE"); + PyObject *pDetailsPanel = PyObject_GetAttrString(pAppInstance, "details_panel"); + PyObject *pCallback = ObjP_classInstanceWithRef(@"DetailsPanelView", @"inter.DetailsPanelView", self); + py = [[PyDetailsPanel alloc] initWithModel:pDetailsPanel Callback:pCallback]; + PyGILState_Release(gilState); + [py connect]; return self; } - (void)dealloc { - [self disconnect]; + [py disconnect]; + [py release]; [super dealloc]; } diff --git a/cocoa/base/ExtraFairwareReminder.m b/cocoa/base/ExtraFairwareReminder.m index b6351fab..89bac3de 100644 --- a/cocoa/base/ExtraFairwareReminder.m +++ b/cocoa/base/ExtraFairwareReminder.m @@ -19,9 +19,9 @@ http://www.hardcoded.net/licenses/bsd_license PyGILState_STATE gilState = PyGILState_Ensure(); PyObject *pModule = PyImport_AddModule("__main__"); PyObject *pAppInstance = PyObject_GetAttrString(pModule, "APP_INSTANCE"); - PyObject *pStatsLabel = PyObject_GetAttrString(pAppInstance, "extra_fairware_reminder"); + PyObject *pExtraFairwareReminder = PyObject_GetAttrString(pAppInstance, "extra_fairware_reminder"); PyObject *pCallback = ObjP_classInstanceWithRef(@"ExtraFairwareReminderView", @"inter.ExtraFairwareReminderView", self); - py = [[PyExtraFairwareReminder alloc] initWithModel:pStatsLabel Callback:pCallback]; + py = [[PyExtraFairwareReminder alloc] initWithModel:pExtraFairwareReminder Callback:pCallback]; PyGILState_Release(gilState); return self; } diff --git a/cocoa/base/PyDetailsPanel.h b/cocoa/base/PyDetailsPanel.h deleted file mode 100644 index 7dca4d4e..00000000 --- a/cocoa/base/PyDetailsPanel.h +++ /dev/null @@ -1,15 +0,0 @@ -/* -Copyright 2011 Hardcoded Software (http://www.hardcoded.net) - -This software is licensed under the "BSD" License as described in the "LICENSE" file, -which should be included with this package. The terms are also available at -http://www.hardcoded.net/licenses/bsd_license -*/ - -#import -#import "PyGUI.h" - -@interface PyDetailsPanel : PyGUI -- (NSInteger)numberOfRows; -- (id)valueForColumn:(NSString *)column row:(NSInteger)row; -@end \ No newline at end of file diff --git a/cocoa/base/bridge/DetailsPanelView.h b/cocoa/base/bridge/DetailsPanelView.h new file mode 100644 index 00000000..8d9abf22 --- /dev/null +++ b/cocoa/base/bridge/DetailsPanelView.h @@ -0,0 +1,5 @@ +#import + +@protocol DetailsPanelView +- (void)refresh; +@end \ No newline at end of file diff --git a/cocoa/inter/details_panel.py b/cocoa/inter/details_panel.py index 1afe4f92..3c98c6da 100644 --- a/cocoa/inter/details_panel.py +++ b/cocoa/inter/details_panel.py @@ -1,13 +1,8 @@ -from cocoa.inter import signature, PyGUIObject - -from core.gui.details_panel import DetailsPanel +from cocoa.inter2 import PyGUIObject class PyDetailsPanel(PyGUIObject): - py_class = DetailsPanel - @signature('i@:') - def numberOfRows(self): - return self.py.row_count() + def numberOfRows(self) -> int: + return self.model.row_count() - @signature('@@:@i') - def valueForColumn_row_(self, column, row): - return self.py.row(row)[int(column)] + def valueForColumn_row_(self, column: str, row: int) -> object: + return self.model.row(row)[int(column)] diff --git a/cocoa/se/dupeguru.xcodeproj/project.pbxproj b/cocoa/se/dupeguru.xcodeproj/project.pbxproj index 0b92ffb4..f1c140b2 100644 --- a/cocoa/se/dupeguru.xcodeproj/project.pbxproj +++ b/cocoa/se/dupeguru.xcodeproj/project.pbxproj @@ -21,6 +21,7 @@ CE31819E13D85D9B00B6D649 /* ErrorReportWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = CE31819B13D85D9B00B6D649 /* ErrorReportWindow.xib */; }; CE381C9609914ACE003581CE /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = CE381C9409914ACE003581CE /* AppDelegate.m */; }; CE381C9C09914ADF003581CE /* ResultWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = CE381C9A09914ADF003581CE /* ResultWindow.m */; }; + CE3A3B4914BF19B8007898AB /* PyDetailsPanel.m in Sources */ = {isa = PBXBuildFile; fileRef = CE3A3B4814BF19B8007898AB /* PyDetailsPanel.m */; }; CE41672D141FE1E5004F3F0B /* HSSelectableList.m in Sources */ = {isa = PBXBuildFile; fileRef = CE41672B141FE1E5004F3F0B /* HSSelectableList.m */; }; CE45579B0AE3BC2B005A9546 /* Sparkle.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CE45579A0AE3BC2B005A9546 /* Sparkle.framework */; }; CE4557B40AE3BC50005A9546 /* Sparkle.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = CE45579A0AE3BC2B005A9546 /* Sparkle.framework */; }; @@ -143,6 +144,8 @@ 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; }; CE381C9B09914ADF003581CE /* ResultWindow.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = ResultWindow.h; sourceTree = SOURCE_ROOT; }; + CE3A3B4714BF19B8007898AB /* PyDetailsPanel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PyDetailsPanel.h; sourceTree = ""; }; + CE3A3B4814BF19B8007898AB /* PyDetailsPanel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PyDetailsPanel.m; sourceTree = ""; }; CE41672A141FE1E5004F3F0B /* HSSelectableList.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HSSelectableList.h; sourceTree = ""; }; CE41672B141FE1E5004F3F0B /* HSSelectableList.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HSSelectableList.m; sourceTree = ""; }; CE41672C141FE1E5004F3F0B /* HSTable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HSTable.h; sourceTree = ""; }; @@ -166,7 +169,6 @@ CE6DD545124CAF1F0089A48D /* HSTableView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = HSTableView.h; path = ../../cocoalib/views/HSTableView.h; sourceTree = SOURCE_ROOT; }; CE6DD546124CAF1F0089A48D /* HSTableView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = HSTableView.m; path = ../../cocoalib/views/HSTableView.m; sourceTree = SOURCE_ROOT; }; CE6E0DFD1054E9EF008D9390 /* dsa_pub.pem */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = dsa_pub.pem; path = ../base/dsa_pub.pem; sourceTree = ""; }; - CE6E7407111C997500C350E3 /* PyDetailsPanel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PyDetailsPanel.h; path = ../base/PyDetailsPanel.h; sourceTree = SOURCE_ROOT; }; CE76FDBE111EE37C006618EA /* HSOutlineView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HSOutlineView.h; sourceTree = ""; }; CE76FDBF111EE37C006618EA /* HSOutlineView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HSOutlineView.m; sourceTree = ""; }; CE76FDC0111EE37C006618EA /* NSIndexPathAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSIndexPathAdditions.h; sourceTree = ""; }; @@ -396,10 +398,12 @@ children = ( CE1D091414BE0C6400CA6B8C /* ObjP.h */, CE1D091514BE0C6400CA6B8C /* ObjP.m */, - CE1D091614BE0C6400CA6B8C /* PyStatsLabel.h */, - CE1D091714BE0C6400CA6B8C /* PyStatsLabel.m */, + CE3A3B4714BF19B8007898AB /* PyDetailsPanel.h */, + CE3A3B4814BF19B8007898AB /* PyDetailsPanel.m */, CE9D842814BE2AE900184165 /* PyExtraFairwareReminder.h */, CE9D842914BE2AE900184165 /* PyExtraFairwareReminder.m */, + CE1D091614BE0C6400CA6B8C /* PyStatsLabel.h */, + CE1D091714BE0C6400CA6B8C /* PyStatsLabel.m */, ); name = autogen; path = ../autogen; @@ -535,7 +539,6 @@ CE665B2D13225ADD003F5CFB /* ExtraFairwareReminder.h */, CE665B2E13225ADD003F5CFB /* ExtraFairwareReminder.m */, CEFC7FB60FC951A700CD5728 /* PyDupeGuru.h */, - CE6E7407111C997500C350E3 /* PyDetailsPanel.h */, CEFC7FB70FC951A700CD5728 /* ResultWindow.h */, CEFC7FB80FC951A700CD5728 /* ResultWindow.m */, CE647E541173024A006D28BA /* ProblemDialog.h */, @@ -681,6 +684,7 @@ CE1D091814BE0C6400CA6B8C /* ObjP.m in Sources */, CE1D091914BE0C6400CA6B8C /* PyStatsLabel.m in Sources */, CE9D842A14BE2AE900184165 /* PyExtraFairwareReminder.m in Sources */, + CE3A3B4914BF19B8007898AB /* PyDetailsPanel.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/core/app.py b/core/app.py index 81cec4d4..2e10d08e 100644 --- a/core/app.py +++ b/core/app.py @@ -24,8 +24,9 @@ from hscommon.util import (delete_if_empty, first, escape, nonone, format_time_d from hscommon.trans import tr from . import directories, results, scanner, export, fs -from .gui.stats_label import StatsLabel +from .gui.details_panel import DetailsPanel from .gui.extra_fairware_reminder import ExtraFairwareReminder +from .gui.stats_label import StatsLabel HAD_FIRST_LAUNCH_PREFERENCE = 'HadFirstLaunch' DEBUG_MODE_PREFERENCE = 'DebugMode' @@ -102,8 +103,9 @@ class DupeGuru(RegistrableApplication, Broadcaster): 'ignore_hardlink_matches': False, } self.selected_dupes = [] - self.stats_label = StatsLabel(None, self) + self.details_panel = DetailsPanel(None, self) self.extra_fairware_reminder = ExtraFairwareReminder(None, self) + self.stats_label = StatsLabel(None, self) # subclasses must create self.result_table #--- Virtual From f6dd1a6a42e6507cb4200c2915e6ffde1a19b6a6 Mon Sep 17 00:00:00 2001 From: Virgil Dupras Date: Thu, 12 Jan 2012 10:23:31 -0500 Subject: [PATCH 06/26] Pushed common py wrapper creation code to cocoalib. --HG-- branch : objp --- cocoa/base/DetailsPanel.m | 11 ++--------- cocoa/base/ExtraFairwareReminder.m | 11 ++--------- cocoa/base/StatsLabel.m | 11 ++--------- cocoa/se/dupeguru.xcodeproj/project.pbxproj | 2 ++ 4 files changed, 8 insertions(+), 27 deletions(-) diff --git a/cocoa/base/DetailsPanel.m b/cocoa/base/DetailsPanel.m index 0ea4931a..31d67dc3 100644 --- a/cocoa/base/DetailsPanel.m +++ b/cocoa/base/DetailsPanel.m @@ -6,22 +6,15 @@ which should be included with this package. The terms are also available at http://www.hardcoded.net/licenses/bsd_license */ -#import #import "DetailsPanel.h" -#import "ObjP.h" +#import "Utils.h" @implementation DetailsPanel - (id)init { self = [super initWithWindowNibName:@"DetailsPanel"]; [self window]; //So the detailsTable is initialized. - PyGILState_STATE gilState = PyGILState_Ensure(); - PyObject *pModule = PyImport_AddModule("__main__"); - PyObject *pAppInstance = PyObject_GetAttrString(pModule, "APP_INSTANCE"); - PyObject *pDetailsPanel = PyObject_GetAttrString(pAppInstance, "details_panel"); - PyObject *pCallback = ObjP_classInstanceWithRef(@"DetailsPanelView", @"inter.DetailsPanelView", self); - py = [[PyDetailsPanel alloc] initWithModel:pDetailsPanel Callback:pCallback]; - PyGILState_Release(gilState); + py = createPyWrapper(@"PyDetailsPanel", @"details_panel", @"DetailsPanelView", self); [py connect]; return self; } diff --git a/cocoa/base/ExtraFairwareReminder.m b/cocoa/base/ExtraFairwareReminder.m index 89bac3de..ef70b6fa 100644 --- a/cocoa/base/ExtraFairwareReminder.m +++ b/cocoa/base/ExtraFairwareReminder.m @@ -6,9 +6,8 @@ which should be included with this package. The terms are also available at http://www.hardcoded.net/licenses/bsd_license */ -#import #import "ExtraFairwareReminder.h" -#import "ObjP.h" +#import "Utils.h" @implementation ExtraFairwareReminder - (id)init @@ -16,13 +15,7 @@ http://www.hardcoded.net/licenses/bsd_license self = [super initWithWindowNibName:@"ExtraFairwareReminder"]; [self window]; [continueButton setEnabled:NO]; - PyGILState_STATE gilState = PyGILState_Ensure(); - PyObject *pModule = PyImport_AddModule("__main__"); - PyObject *pAppInstance = PyObject_GetAttrString(pModule, "APP_INSTANCE"); - PyObject *pExtraFairwareReminder = PyObject_GetAttrString(pAppInstance, "extra_fairware_reminder"); - PyObject *pCallback = ObjP_classInstanceWithRef(@"ExtraFairwareReminderView", @"inter.ExtraFairwareReminderView", self); - py = [[PyExtraFairwareReminder alloc] initWithModel:pExtraFairwareReminder Callback:pCallback]; - PyGILState_Release(gilState); + py = createPyWrapper(@"PyExtraFairwareReminder", @"extra_fairware_reminder", @"ExtraFairwareReminderView", self); return self; } diff --git a/cocoa/base/StatsLabel.m b/cocoa/base/StatsLabel.m index b2ea972b..ab282219 100644 --- a/cocoa/base/StatsLabel.m +++ b/cocoa/base/StatsLabel.m @@ -6,22 +6,15 @@ which should be included with this package. The terms are also available at http://www.hardcoded.net/licenses/bsd_license */ -#import #import "StatsLabel.h" -#import "ObjP.h" +#import "Utils.h" @implementation StatsLabel - (id)initWithLabelView:(NSTextField *)aLabelView { self = [self init]; view = [aLabelView retain]; - PyGILState_STATE gilState = PyGILState_Ensure(); - PyObject *pModule = PyImport_AddModule("__main__"); - PyObject *pAppInstance = PyObject_GetAttrString(pModule, "APP_INSTANCE"); - PyObject *pStatsLabel = PyObject_GetAttrString(pAppInstance, "stats_label"); - PyObject *pCallback = ObjP_classInstanceWithRef(@"StatsLabelView", @"inter.StatsLabelView", self); - py = [[PyStatsLabel alloc] initWithModel:pStatsLabel Callback:pCallback]; - PyGILState_Release(gilState); + py = createPyWrapper(@"PyStatsLabel", @"stats_label", @"StatsLabelView", self); [[self py] connect]; return self; } diff --git a/cocoa/se/dupeguru.xcodeproj/project.pbxproj b/cocoa/se/dupeguru.xcodeproj/project.pbxproj index f1c140b2..66dc9416 100644 --- a/cocoa/se/dupeguru.xcodeproj/project.pbxproj +++ b/cocoa/se/dupeguru.xcodeproj/project.pbxproj @@ -244,6 +244,7 @@ CECFFF2013CDF8D0003A4518 /* de */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = de; path = ../base/de.lproj/ProblemDialog.xib; sourceTree = SOURCE_ROOT; }; CECFFF2113CDF8D0003A4518 /* de */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = de; path = ../base/de.lproj/ResultWindow.xib; sourceTree = SOURCE_ROOT; }; CECFFF2413CDF8E5003A4518 /* de */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = de; path = de.lproj/Preferences.xib; sourceTree = ""; }; + CED569C614BF312900C6AC25 /* PyGUI2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PyGUI2.h; sourceTree = ""; }; CED64CEB145EF06000572B00 /* cs */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = cs; path = ../base/cs.lproj/Localizable.strings; sourceTree = ""; }; CED64CF8145EF07700572B00 /* cs */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = cs; path = ../base/cs.lproj/DetailsPanel.xib; sourceTree = ""; }; CED64CF9145EF07700572B00 /* cs */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = cs; path = ../base/cs.lproj/DirectoryPanel.xib; sourceTree = ""; }; @@ -452,6 +453,7 @@ children = ( CE54A87A14804687008EEA77 /* PyColumns.h */, CE76FDCD111EE38E006618EA /* PyGUI.h */, + CED569C614BF312900C6AC25 /* PyGUI2.h */, CE76FDCE111EE38E006618EA /* PyOutline.h */, CE8C53B61173248F0011B41F /* PyTable.h */, CE9777D2141F9D6500C13FB5 /* PySelectableList.h */, From a699a2ef4500129914491fde2981c5dc5212df1b Mon Sep 17 00:00:00 2001 From: Virgil Dupras Date: Thu, 12 Jan 2012 12:34:20 -0500 Subject: [PATCH 07/26] Converted .h view objp bridge interfaces to python ones. It simplifies them and allows for subclassing. --HG-- branch : objp --- build.py | 18 +++++++++--------- cocoa/base/bridge/DetailsPanelView.h | 5 ----- cocoa/base/bridge/ExtraFairwareReminderView.h | 8 -------- cocoa/base/bridge/StatsLabelView.h | 5 ----- cocoa/inter/details_panel.py | 5 ++++- cocoa/inter/extra_fairware_reminder.py | 11 +++++++++++ cocoa/inter/stats_label.py | 5 ++++- 7 files changed, 28 insertions(+), 29 deletions(-) delete mode 100644 cocoa/base/bridge/DetailsPanelView.h delete mode 100644 cocoa/base/bridge/ExtraFairwareReminderView.h delete mode 100644 cocoa/base/bridge/StatsLabelView.h diff --git a/build.py b/build.py index 36c788a5..f8ffbbaf 100644 --- a/build.py +++ b/build.py @@ -179,18 +179,18 @@ def build_cocoa_bridging_interfaces(): import objp.p2o add_to_pythonpath('cocoa') add_to_pythonpath('cocoalib') - from inter.details_panel import PyDetailsPanel - from inter.extra_fairware_reminder import PyExtraFairwareReminder - from inter.stats_label import PyStatsLabel + from inter.details_panel import PyDetailsPanel, DetailsPanelView + from inter.extra_fairware_reminder import PyExtraFairwareReminder, ExtraFairwareReminderView + from inter.stats_label import PyStatsLabel, StatsLabelView for class_ in [PyDetailsPanel, PyExtraFairwareReminder, PyStatsLabel]: objp.o2p.generate_objc_code(class_, 'cocoa/autogen') - for fn in os.listdir('cocoa/base/bridge'): - basename = fn[:-2] - header_path = op.join('cocoa/base/bridge', fn) - extmodule_path = op.join('build', basename + '.m') - objp.p2o.generate_python_proxy_code(header_path, extmodule_path) + for class_ in [DetailsPanelView, ExtraFairwareReminderView, StatsLabelView]: + clsspec = objp.o2p.spec_from_python_class(class_) + clsname = class_.__name__ + extmodule_path = op.join('build', clsname + '.m') + objp.p2o.generate_python_proxy_code_from_clsspec(clsspec, extmodule_path) exts = [ - Extension(basename, [extmodule_path, 'build/ObjP.m'], + Extension(clsname, [extmodule_path, 'build/ObjP.m'], extra_link_args=["-framework", "Foundation"]), ] setup( diff --git a/cocoa/base/bridge/DetailsPanelView.h b/cocoa/base/bridge/DetailsPanelView.h deleted file mode 100644 index 8d9abf22..00000000 --- a/cocoa/base/bridge/DetailsPanelView.h +++ /dev/null @@ -1,5 +0,0 @@ -#import - -@protocol DetailsPanelView -- (void)refresh; -@end \ No newline at end of file diff --git a/cocoa/base/bridge/ExtraFairwareReminderView.h b/cocoa/base/bridge/ExtraFairwareReminderView.h deleted file mode 100644 index a7806194..00000000 --- a/cocoa/base/bridge/ExtraFairwareReminderView.h +++ /dev/null @@ -1,8 +0,0 @@ -#import - -@protocol ExtraFairwareReminderView -- (void)startTimer; -- (void)stopTimer; -- (void)setButtonText:(NSString *)text; -- (void)enableButton; -@end \ No newline at end of file diff --git a/cocoa/base/bridge/StatsLabelView.h b/cocoa/base/bridge/StatsLabelView.h deleted file mode 100644 index 5bd6ba6b..00000000 --- a/cocoa/base/bridge/StatsLabelView.h +++ /dev/null @@ -1,5 +0,0 @@ -#import - -@protocol StatsLabelView -- (void)refresh; -@end \ No newline at end of file diff --git a/cocoa/inter/details_panel.py b/cocoa/inter/details_panel.py index 3c98c6da..4ac39d9a 100644 --- a/cocoa/inter/details_panel.py +++ b/cocoa/inter/details_panel.py @@ -1,4 +1,7 @@ -from cocoa.inter2 import PyGUIObject +from cocoa.inter2 import PyGUIObject, GUIObjectView + +class DetailsPanelView(GUIObjectView): + pass class PyDetailsPanel(PyGUIObject): def numberOfRows(self) -> int: diff --git a/cocoa/inter/extra_fairware_reminder.py b/cocoa/inter/extra_fairware_reminder.py index 2ec99bd6..47b9871c 100644 --- a/cocoa/inter/extra_fairware_reminder.py +++ b/cocoa/inter/extra_fairware_reminder.py @@ -1,5 +1,12 @@ +from objp.util import dontwrap from cocoa.inter2 import PyGUIObject +class ExtraFairwareReminderView: + def startTimer(self): pass + def stopTimer(self): pass + def setButtonText_(self, text: str): pass; + def enableButton(self): pass + class PyExtraFairwareReminder(PyGUIObject): def start(self): self.model.start() @@ -8,14 +15,18 @@ class PyExtraFairwareReminder(PyGUIObject): self.model.update_button() # model --> view + @dontwrap def start_timer(self): self.callback.startTimer() + @dontwrap def stop_timer(self): self.callback.stopTimer() + @dontwrap def enable_button(self): self.callback.enableButton() + @dontwrap def set_button_text(self, text): self.callback.setButtonText_(text) diff --git a/cocoa/inter/stats_label.py b/cocoa/inter/stats_label.py index 16788fde..b36fbcb0 100644 --- a/cocoa/inter/stats_label.py +++ b/cocoa/inter/stats_label.py @@ -1,4 +1,7 @@ -from cocoa.inter2 import PyGUIObject +from cocoa.inter2 import PyGUIObject, GUIObjectView + +class StatsLabelView(GUIObjectView): + pass class PyStatsLabel(PyGUIObject): From 45d4915d88edab2f9bbef555154a842fc826030b Mon Sep 17 00:00:00 2001 From: Virgil Dupras Date: Thu, 12 Jan 2012 14:23:10 -0500 Subject: [PATCH 08/26] Converted objp code to 2-steps instantiation. --HG-- branch : objp --- cocoa/base/DetailsPanel.m | 3 ++- cocoa/base/ExtraFairwareReminder.m | 3 ++- cocoa/base/StatsLabel.m | 3 ++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/cocoa/base/DetailsPanel.m b/cocoa/base/DetailsPanel.m index 31d67dc3..ce49743c 100644 --- a/cocoa/base/DetailsPanel.m +++ b/cocoa/base/DetailsPanel.m @@ -14,7 +14,8 @@ http://www.hardcoded.net/licenses/bsd_license { self = [super initWithWindowNibName:@"DetailsPanel"]; [self window]; //So the detailsTable is initialized. - py = createPyWrapper(@"PyDetailsPanel", @"details_panel", @"DetailsPanelView", self); + py = [[PyDetailsPanel alloc] initWithModel:findHackishModel(@"details_panel")]; + [py bindCallback:createCallback(@"DetailsPanelView", self)]; [py connect]; return self; } diff --git a/cocoa/base/ExtraFairwareReminder.m b/cocoa/base/ExtraFairwareReminder.m index ef70b6fa..ff044198 100644 --- a/cocoa/base/ExtraFairwareReminder.m +++ b/cocoa/base/ExtraFairwareReminder.m @@ -15,7 +15,8 @@ http://www.hardcoded.net/licenses/bsd_license self = [super initWithWindowNibName:@"ExtraFairwareReminder"]; [self window]; [continueButton setEnabled:NO]; - py = createPyWrapper(@"PyExtraFairwareReminder", @"extra_fairware_reminder", @"ExtraFairwareReminderView", self); + py = [[PyExtraFairwareReminder alloc] initWithModel:findHackishModel(@"extra_fairware_reminder")]; + [py bindCallback:createCallback(@"ExtraFairwareReminderView", self)]; return self; } diff --git a/cocoa/base/StatsLabel.m b/cocoa/base/StatsLabel.m index ab282219..8cca04ed 100644 --- a/cocoa/base/StatsLabel.m +++ b/cocoa/base/StatsLabel.m @@ -14,7 +14,8 @@ http://www.hardcoded.net/licenses/bsd_license { self = [self init]; view = [aLabelView retain]; - py = createPyWrapper(@"PyStatsLabel", @"stats_label", @"StatsLabelView", self); + py = [[PyStatsLabel alloc] initWithModel:findHackishModel(@"stats_label")]; + [py bindCallback:createCallback(@"StatsLabelView", self)]; [[self py] connect]; return self; } From 0d782015487982395f361643d24d180867e40bd5 Mon Sep 17 00:00:00 2001 From: Virgil Dupras Date: Thu, 12 Jan 2012 15:19:40 -0500 Subject: [PATCH 09/26] Comverted DirectoryOutline to objp. I converted HSColumns and I realized at the end that I didn't need to do it yet, but well, it will be done for ResultsTable. --HG-- branch : objp --- build.py | 6 ++-- cocoa/base/DirectoryOutline.h | 6 ++-- cocoa/base/DirectoryOutline.m | 12 +++++--- cocoa/base/DirectoryPanel.m | 2 +- cocoa/base/PyDirectoryOutline.h | 15 ---------- cocoa/inter/directory_outline.py | 17 ++++++----- cocoa/se/dupeguru.xcodeproj/project.pbxproj | 32 ++++++++++++++++++--- core/app.py | 2 ++ 8 files changed, 56 insertions(+), 36 deletions(-) delete mode 100644 cocoa/base/PyDirectoryOutline.h diff --git a/build.py b/build.py index f8ffbbaf..3cc606f2 100644 --- a/build.py +++ b/build.py @@ -179,12 +179,14 @@ def build_cocoa_bridging_interfaces(): import objp.p2o add_to_pythonpath('cocoa') add_to_pythonpath('cocoalib') + from cocoa.inter2 import PyColumns2, ColumnsView from inter.details_panel import PyDetailsPanel, DetailsPanelView + from inter.directory_outline import PyDirectoryOutline, DirectoryOutlineView from inter.extra_fairware_reminder import PyExtraFairwareReminder, ExtraFairwareReminderView from inter.stats_label import PyStatsLabel, StatsLabelView - for class_ in [PyDetailsPanel, PyExtraFairwareReminder, PyStatsLabel]: + for class_ in [PyColumns2, PyDetailsPanel, PyDirectoryOutline, PyExtraFairwareReminder, PyStatsLabel]: objp.o2p.generate_objc_code(class_, 'cocoa/autogen') - for class_ in [DetailsPanelView, ExtraFairwareReminderView, StatsLabelView]: + for class_ in [ColumnsView, DetailsPanelView, DirectoryOutlineView, ExtraFairwareReminderView, StatsLabelView]: clsspec = objp.o2p.spec_from_python_class(class_) clsname = class_.__name__ extmodule_path = op.join('build', clsname + '.m') diff --git a/cocoa/base/DirectoryOutline.h b/cocoa/base/DirectoryOutline.h index df855069..d50f1d3a 100644 --- a/cocoa/base/DirectoryOutline.h +++ b/cocoa/base/DirectoryOutline.h @@ -7,12 +7,12 @@ http://www.hardcoded.net/licenses/bsd_license */ #import -#import "HSOutline.h" +#import "HSOutline2.h" #import "PyDirectoryOutline.h" #define DGAddedFoldersNotification @"DGAddedFoldersNotification" -@interface DirectoryOutline : HSOutline {} -- (id)initWithPyParent:(id)aPyParent view:(HSOutlineView *)aOutlineView; +@interface DirectoryOutline : HSOutline2 {} +- (id)initWithOutlineView:(HSOutlineView *)aOutlineView; - (PyDirectoryOutline *)py; @end; \ No newline at end of file diff --git a/cocoa/base/DirectoryOutline.m b/cocoa/base/DirectoryOutline.m index 89d2142c..086fe5d6 100644 --- a/cocoa/base/DirectoryOutline.m +++ b/cocoa/base/DirectoryOutline.m @@ -7,19 +7,23 @@ http://www.hardcoded.net/licenses/bsd_license */ #import "DirectoryOutline.h" +#import "Utils.h" @implementation DirectoryOutline -- (id)initWithPyParent:(id)aPyParent view:(HSOutlineView *)aOutlineView +- (id)initWithOutlineView:(HSOutlineView *)aOutlineView { - self = [super initWithPyClassName:@"PyDirectoryOutline" pyParent:aPyParent view:aOutlineView]; + PyDirectoryOutline *model = [[PyDirectoryOutline alloc] initWithModel:findHackishModel(@"directory_tree")]; + self = [super initWithPy:model view:aOutlineView]; + [model bindCallback:createCallback(@"DirectoryOutlineView", self)]; + [model release]; [outlineView registerForDraggedTypes:[NSArray arrayWithObject:NSFilenamesPboardType]]; - [self connect]; + [[self py] connect]; return self; } - (void)dealloc { - [self disconnect]; + [[self py] disconnect]; [super dealloc]; } diff --git a/cocoa/base/DirectoryPanel.m b/cocoa/base/DirectoryPanel.m index f2f3aeaf..18334bb7 100644 --- a/cocoa/base/DirectoryPanel.m +++ b/cocoa/base/DirectoryPanel.m @@ -24,7 +24,7 @@ http://www.hardcoded.net/licenses/bsd_license [self fillPopUpMenu]; _recentDirectories = [[HSRecentFiles alloc] initWithName:@"recentDirectories" menu:[addButtonPopUp menu]]; [_recentDirectories setDelegate:self]; - outline = [[DirectoryOutline alloc] initWithPyParent:_py view:outlineView]; + outline = [[DirectoryOutline alloc] initWithOutlineView:outlineView]; [self refreshRemoveButtonText]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(directorySelectionChanged:) name:NSOutlineViewSelectionDidChangeNotification object:outlineView]; diff --git a/cocoa/base/PyDirectoryOutline.h b/cocoa/base/PyDirectoryOutline.h deleted file mode 100644 index 6c1f27fa..00000000 --- a/cocoa/base/PyDirectoryOutline.h +++ /dev/null @@ -1,15 +0,0 @@ -/* -Copyright 2011 Hardcoded Software (http://www.hardcoded.net) - -This software is licensed under the "BSD" License as described in the "LICENSE" file, -which should be included with this package. The terms are also available at -http://www.hardcoded.net/licenses/bsd_license -*/ - -#import -#import "PyOutline.h" - -@interface PyDirectoryOutline : PyOutline -- (void)addDirectory:(NSString *)directoryPath; -- (void)removeSelectedDirectory; -@end \ No newline at end of file diff --git a/cocoa/inter/directory_outline.py b/cocoa/inter/directory_outline.py index bdac6a5a..d88f98ac 100644 --- a/cocoa/inter/directory_outline.py +++ b/cocoa/inter/directory_outline.py @@ -1,17 +1,20 @@ -from cocoa.inter import PyOutline +from objp.util import dontwrap +from cocoa.inter2 import PyOutline, GUIObjectView -from core.gui.directory_tree import DirectoryTree +class DirectoryOutlineView(GUIObjectView): + pass class PyDirectoryOutline(PyOutline): - py_class = DirectoryTree + FOLLOW_PROTOCOLS = ['PyOutline2'] - def addDirectory_(self, path): - self.py.add_directory(path) + def addDirectory_(self, path: str): + self.model.add_directory(path) def removeSelectedDirectory(self): - self.py.remove_selected() + self.model.remove_selected() # python --> cocoa + @dontwrap def refresh_states(self): # Under cocoa, both refresh() and refresh_states() do the same thing. - self.cocoa.refresh() \ No newline at end of file + self.callback.refresh() \ No newline at end of file diff --git a/cocoa/se/dupeguru.xcodeproj/project.pbxproj b/cocoa/se/dupeguru.xcodeproj/project.pbxproj index 66dc9416..a2cbaea0 100644 --- a/cocoa/se/dupeguru.xcodeproj/project.pbxproj +++ b/cocoa/se/dupeguru.xcodeproj/project.pbxproj @@ -16,6 +16,10 @@ CE19BC6411199231007CCEB0 /* progress.xib in Resources */ = {isa = PBXBuildFile; fileRef = CE19BC6111199231007CCEB0 /* progress.xib */; }; CE1D091814BE0C6400CA6B8C /* ObjP.m in Sources */ = {isa = PBXBuildFile; fileRef = CE1D091514BE0C6400CA6B8C /* ObjP.m */; }; CE1D091914BE0C6400CA6B8C /* PyStatsLabel.m in Sources */ = {isa = PBXBuildFile; fileRef = CE1D091714BE0C6400CA6B8C /* PyStatsLabel.m */; }; + CE275C5014BF6C5600265960 /* HSColumns2.m in Sources */ = {isa = PBXBuildFile; fileRef = CE275C4D14BF6C5600265960 /* HSColumns2.m */; }; + CE275C5114BF6C5600265960 /* HSOutline2.m in Sources */ = {isa = PBXBuildFile; fileRef = CE275C4F14BF6C5600265960 /* HSOutline2.m */; }; + CE275C5714BF712B00265960 /* PyDirectoryOutline.m in Sources */ = {isa = PBXBuildFile; fileRef = CE275C5514BF712B00265960 /* PyDirectoryOutline.m */; }; + CE275C5A14BF71DF00265960 /* PyColumns2.m in Sources */ = {isa = PBXBuildFile; fileRef = CE275C5914BF71DF00265960 /* PyColumns2.m */; }; CE27D3C412CCA43800859E67 /* HSAboutBox.m in Sources */ = {isa = PBXBuildFile; fileRef = CE27D3C312CCA43800859E67 /* HSAboutBox.m */; }; CE31819D13D85D9B00B6D649 /* about.xib in Resources */ = {isa = PBXBuildFile; fileRef = CE31819913D85D9B00B6D649 /* about.xib */; }; CE31819E13D85D9B00B6D649 /* ErrorReportWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = CE31819B13D85D9B00B6D649 /* ErrorReportWindow.xib */; }; @@ -131,6 +135,16 @@ CE1D091514BE0C6400CA6B8C /* ObjP.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ObjP.m; sourceTree = ""; }; CE1D091614BE0C6400CA6B8C /* PyStatsLabel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PyStatsLabel.h; sourceTree = ""; }; CE1D091714BE0C6400CA6B8C /* PyStatsLabel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PyStatsLabel.m; sourceTree = ""; }; + CE275C4A14BF6C3700265960 /* PyOutline2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PyOutline2.h; sourceTree = ""; }; + CE275C4C14BF6C5600265960 /* HSColumns2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HSColumns2.h; sourceTree = ""; }; + CE275C4D14BF6C5600265960 /* HSColumns2.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HSColumns2.m; sourceTree = ""; }; + CE275C4E14BF6C5600265960 /* HSOutline2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HSOutline2.h; sourceTree = ""; }; + CE275C4F14BF6C5600265960 /* HSOutline2.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HSOutline2.m; sourceTree = ""; }; + CE275C5414BF712B00265960 /* PyDirectoryOutline.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PyDirectoryOutline.h; sourceTree = ""; }; + CE275C5514BF712B00265960 /* PyDirectoryOutline.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PyDirectoryOutline.m; sourceTree = ""; }; + CE275C5814BF71DF00265960 /* PyColumns2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PyColumns2.h; sourceTree = ""; }; + CE275C5914BF71DF00265960 /* PyColumns2.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PyColumns2.m; sourceTree = ""; }; + CE275C5B14BF71FE00265960 /* PyColumns.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PyColumns.h; sourceTree = ""; }; CE27D3C212CCA43800859E67 /* HSAboutBox.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = HSAboutBox.h; path = ../../cocoalib/HSAboutBox.h; sourceTree = SOURCE_ROOT; }; CE27D3C312CCA43800859E67 /* HSAboutBox.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = HSAboutBox.m; path = ../../cocoalib/HSAboutBox.m; sourceTree = SOURCE_ROOT; }; CE31819A13D85D9B00B6D649 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = ../en.lproj/about.xib; sourceTree = ""; }; @@ -153,7 +167,6 @@ CE5335FA142BBFAF008E5374 /* HSQuicklook.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = HSQuicklook.h; path = ../../cocoalib/HSQuicklook.h; sourceTree = ""; }; CE5335FB142BBFAF008E5374 /* HSQuicklook.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = HSQuicklook.m; path = ../../cocoalib/HSQuicklook.m; sourceTree = ""; }; CE533602142BC034008E5374 /* Quartz.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Quartz.framework; path = System/Library/Frameworks/Quartz.framework; sourceTree = SDKROOT; }; - CE54A87A14804687008EEA77 /* PyColumns.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PyColumns.h; sourceTree = ""; }; CE54A87C148046F9008EEA77 /* HSColumns.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HSColumns.h; sourceTree = ""; }; CE54A87D148046F9008EEA77 /* HSColumns.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HSColumns.m; sourceTree = ""; }; CE647E541173024A006D28BA /* ProblemDialog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ProblemDialog.h; path = ../base/ProblemDialog.h; sourceTree = SOURCE_ROOT; }; @@ -181,7 +194,6 @@ CE76FDCE111EE38E006618EA /* PyOutline.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PyOutline.h; sourceTree = ""; }; CE76FDD1111EE3A7006618EA /* DirectoryOutline.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DirectoryOutline.h; path = ../base/DirectoryOutline.h; sourceTree = SOURCE_ROOT; }; CE76FDD2111EE3A7006618EA /* DirectoryOutline.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = DirectoryOutline.m; path = ../base/DirectoryOutline.m; sourceTree = SOURCE_ROOT; }; - CE76FDD3111EE3A7006618EA /* PyDirectoryOutline.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PyDirectoryOutline.h; path = ../base/PyDirectoryOutline.h; sourceTree = SOURCE_ROOT; }; CE76FDDD111EE42F006618EA /* HSOutline.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HSOutline.h; sourceTree = ""; }; CE76FDDE111EE42F006618EA /* HSOutline.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HSOutline.m; sourceTree = ""; }; CE76FDF5111EE561006618EA /* NSEventAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = NSEventAdditions.h; path = ../../cocoalib/NSEventAdditions.h; sourceTree = SOURCE_ROOT; }; @@ -405,6 +417,10 @@ CE9D842914BE2AE900184165 /* PyExtraFairwareReminder.m */, CE1D091614BE0C6400CA6B8C /* PyStatsLabel.h */, CE1D091714BE0C6400CA6B8C /* PyStatsLabel.m */, + CE275C5814BF71DF00265960 /* PyColumns2.h */, + CE275C5914BF71DF00265960 /* PyColumns2.m */, + CE275C5414BF712B00265960 /* PyDirectoryOutline.h */, + CE275C5514BF712B00265960 /* PyDirectoryOutline.m */, ); name = autogen; path = ../autogen; @@ -431,10 +447,14 @@ children = ( CE54A87C148046F9008EEA77 /* HSColumns.h */, CE54A87D148046F9008EEA77 /* HSColumns.m */, + CE275C4C14BF6C5600265960 /* HSColumns2.h */, + CE275C4D14BF6C5600265960 /* HSColumns2.m */, CEBE4D72111F0EE1009AAC6D /* HSWindowController.h */, CEBE4D73111F0EE1009AAC6D /* HSWindowController.m */, CE76FDDD111EE42F006618EA /* HSOutline.h */, CE76FDDE111EE42F006618EA /* HSOutline.m */, + CE275C4E14BF6C5600265960 /* HSOutline2.h */, + CE275C4F14BF6C5600265960 /* HSOutline2.m */, CE76FDC8111EE38E006618EA /* HSGUIController.h */, CE76FDC9111EE38E006618EA /* HSGUIController.m */, CE41672C141FE1E5004F3F0B /* HSTable.h */, @@ -451,10 +471,11 @@ CE76FDCC111EE38E006618EA /* proxies */ = { isa = PBXGroup; children = ( - CE54A87A14804687008EEA77 /* PyColumns.h */, + CE275C5B14BF71FE00265960 /* PyColumns.h */, CE76FDCD111EE38E006618EA /* PyGUI.h */, CED569C614BF312900C6AC25 /* PyGUI2.h */, CE76FDCE111EE38E006618EA /* PyOutline.h */, + CE275C4A14BF6C3700265960 /* PyOutline2.h */, CE8C53B61173248F0011B41F /* PyTable.h */, CE9777D2141F9D6500C13FB5 /* PySelectableList.h */, ); @@ -530,7 +551,6 @@ CE91F214113BC22D0010360B /* StatsLabel.m */, CE76FDD1111EE3A7006618EA /* DirectoryOutline.h */, CE76FDD2111EE3A7006618EA /* DirectoryOutline.m */, - CE76FDD3111EE3A7006618EA /* PyDirectoryOutline.h */, CEFC7FB10FC951A700CD5728 /* AppDelegate.h */, CEFC7FB20FC951A700CD5728 /* AppDelegate.m */, CEFC7FB30FC951A700CD5728 /* Consts.h */, @@ -687,6 +707,10 @@ CE1D091914BE0C6400CA6B8C /* PyStatsLabel.m in Sources */, CE9D842A14BE2AE900184165 /* PyExtraFairwareReminder.m in Sources */, CE3A3B4914BF19B8007898AB /* PyDetailsPanel.m in Sources */, + CE275C5014BF6C5600265960 /* HSColumns2.m in Sources */, + CE275C5114BF6C5600265960 /* HSOutline2.m in Sources */, + CE275C5714BF712B00265960 /* PyDirectoryOutline.m in Sources */, + CE275C5A14BF71DF00265960 /* PyColumns2.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/core/app.py b/core/app.py index 2e10d08e..f8560c1f 100644 --- a/core/app.py +++ b/core/app.py @@ -25,6 +25,7 @@ from hscommon.trans import tr from . import directories, results, scanner, export, fs from .gui.details_panel import DetailsPanel +from .gui.directory_tree import DirectoryTree from .gui.extra_fairware_reminder import ExtraFairwareReminder from .gui.stats_label import StatsLabel @@ -104,6 +105,7 @@ class DupeGuru(RegistrableApplication, Broadcaster): } self.selected_dupes = [] self.details_panel = DetailsPanel(None, self) + self.directory_tree = DirectoryTree(None, self) self.extra_fairware_reminder = ExtraFairwareReminder(None, self) self.stats_label = StatsLabel(None, self) # subclasses must create self.result_table From 4c8ce4b52d8db3361037ac5072224cdb6d3e4995 Mon Sep 17 00:00:00 2001 From: Virgil Dupras Date: Thu, 12 Jan 2012 17:40:23 -0500 Subject: [PATCH 10/26] Converted the prioritize dialog to objp. A bit hackish though. Refactorings required before going further. --HG-- branch : objp --- build.py | 10 ++++- cocoa/base/PrioritizeDialog.h | 15 +++---- cocoa/base/PrioritizeDialog.m | 19 +++++---- cocoa/base/PrioritizeList.h | 5 ++- cocoa/base/PrioritizeList.m | 9 +++++ cocoa/base/PyPrioritizeDialog.h | 20 ---------- cocoa/base/PyPrioritizeList.h | 14 ------- cocoa/base/ResultWindow.m | 2 +- cocoa/inter/prioritize_dialog.py | 33 ++++++---------- cocoa/inter/prioritize_list.py | 15 ++++--- cocoa/se/dg_cocoa.py | 1 + cocoa/se/dupeguru.xcodeproj/project.pbxproj | 44 ++++++++++++--------- core/app.py | 2 + 13 files changed, 92 insertions(+), 97 deletions(-) delete mode 100644 cocoa/base/PyPrioritizeDialog.h delete mode 100644 cocoa/base/PyPrioritizeList.h diff --git a/build.py b/build.py index 3cc606f2..c79e704a 100644 --- a/build.py +++ b/build.py @@ -183,10 +183,16 @@ def build_cocoa_bridging_interfaces(): from inter.details_panel import PyDetailsPanel, DetailsPanelView from inter.directory_outline import PyDirectoryOutline, DirectoryOutlineView from inter.extra_fairware_reminder import PyExtraFairwareReminder, ExtraFairwareReminderView + from inter.prioritize_dialog import PyPrioritizeDialog, PrioritizeDialogView + from inter.prioritize_list import PyPrioritizeList, PrioritizeListView from inter.stats_label import PyStatsLabel, StatsLabelView - for class_ in [PyColumns2, PyDetailsPanel, PyDirectoryOutline, PyExtraFairwareReminder, PyStatsLabel]: + allclasses = [PyColumns2, PyDetailsPanel, PyDirectoryOutline, PyExtraFairwareReminder, + PyPrioritizeDialog, PyPrioritizeList, PyStatsLabel] + for class_ in allclasses: objp.o2p.generate_objc_code(class_, 'cocoa/autogen') - for class_ in [ColumnsView, DetailsPanelView, DirectoryOutlineView, ExtraFairwareReminderView, StatsLabelView]: + allclasses = [ColumnsView, DetailsPanelView, DirectoryOutlineView, ExtraFairwareReminderView, + PrioritizeDialogView, PrioritizeListView, StatsLabelView] + for class_ in allclasses: clsspec = objp.o2p.spec_from_python_class(class_) clsname = class_.__name__ extmodule_path = op.join('build', clsname + '.m') diff --git a/cocoa/base/PrioritizeDialog.h b/cocoa/base/PrioritizeDialog.h index 369c2a29..0e85b827 100644 --- a/cocoa/base/PrioritizeDialog.h +++ b/cocoa/base/PrioritizeDialog.h @@ -7,24 +7,25 @@ http://www.hardcoded.net/licenses/bsd_license */ #import -#import "HSWindowController.h" #import "PyApp.h" #import "PyPrioritizeDialog.h" -#import "HSPopUpList.h" -#import "HSSelectableList.h" +#import "HSPopUpList2.h" +#import "HSSelectableList2.h" #import "PrioritizeList.h" -@interface PrioritizeDialog : HSWindowController +@interface PrioritizeDialog : NSWindowController { IBOutlet NSPopUpButton *categoryPopUpView; IBOutlet NSTableView *criteriaTableView; IBOutlet NSTableView *prioritizationTableView; - HSPopUpList *categoryPopUp; - HSSelectableList *criteriaList; + PyPrioritizeDialog *py; + HSPopUpList2 *categoryPopUp; + // XXX Just to make it work temporarily, fix this asap (support to be HSSelectableList) + PrioritizeList *criteriaList; PrioritizeList *prioritizationList; } -- (id)initWithPy:(PyApp *)aPy; +- (id)init; - (PyPrioritizeDialog *)py; - (IBAction)addSelected:(id)sender; diff --git a/cocoa/base/PrioritizeDialog.m b/cocoa/base/PrioritizeDialog.m index 1419ffd7..6f2c8668 100644 --- a/cocoa/base/PrioritizeDialog.m +++ b/cocoa/base/PrioritizeDialog.m @@ -7,22 +7,25 @@ http://www.hardcoded.net/licenses/bsd_license */ #import "PrioritizeDialog.h" +#import "Utils.h" @implementation PrioritizeDialog -- (id)initWithPy:(PyApp *)aPy +- (id)init { - self = [super initWithNibName:@"PrioritizeDialog" pyClassName:@"PyPrioritizeDialog" pyParent:aPy]; + self = [super initWithWindowNibName:@"PrioritizeDialog"]; [self window]; - categoryPopUp = [[HSPopUpList alloc] initWithPy:[[self py] categoryList] view:categoryPopUpView]; - criteriaList = [[HSSelectableList alloc] initWithPy:[[self py] criteriaList] view:criteriaTableView]; - prioritizationList = [[PrioritizeList alloc] initWithPy:[[self py] prioritizationList] view:prioritizationTableView]; - [self connect]; + py = [[PyPrioritizeDialog alloc] initWithModel:findHackishModel(@"prioritize_dialog")]; + [py bindCallback:createCallback(@"PrioritizeDialogView", self)]; + categoryPopUp = [[HSPopUpList2 alloc] initWithPyRef:[[self py] categoryList] popupView:categoryPopUpView]; + criteriaList = [[PrioritizeList alloc] initWithPyRef:[[self py] criteriaList] tableView:criteriaTableView]; + prioritizationList = [[PrioritizeList alloc] initWithPyRef:[[self py] prioritizationList] tableView:prioritizationTableView]; + [py connect]; return self; } - (void)dealloc { - [self disconnect]; + [py disconnect]; [categoryPopUp release]; [criteriaList release]; [prioritizationList release]; @@ -47,10 +50,12 @@ http://www.hardcoded.net/licenses/bsd_license - (IBAction)ok:(id)sender { [NSApp stopModal]; + [self close]; } - (IBAction)cancel:(id)sender { [NSApp abortModal]; + [self close]; } @end \ No newline at end of file diff --git a/cocoa/base/PrioritizeList.h b/cocoa/base/PrioritizeList.h index 52014dd3..c1571376 100644 --- a/cocoa/base/PrioritizeList.h +++ b/cocoa/base/PrioritizeList.h @@ -7,9 +7,10 @@ http://www.hardcoded.net/licenses/bsd_license */ #import -#import "HSSelectableList.h" +#import "HSSelectableList2.h" #import "PyPrioritizeList.h" -@interface PrioritizeList : HSSelectableList {} +@interface PrioritizeList : HSSelectableList2 {} +- (id)initWithPyRef:(PyObject *)aPyRef tableView:(NSTableView *)aTableView; - (PyPrioritizeList *)py; @end \ No newline at end of file diff --git a/cocoa/base/PrioritizeList.m b/cocoa/base/PrioritizeList.m index bd13a327..f1c902b1 100644 --- a/cocoa/base/PrioritizeList.m +++ b/cocoa/base/PrioritizeList.m @@ -11,6 +11,15 @@ http://www.hardcoded.net/licenses/bsd_license #import "Consts.h" @implementation PrioritizeList +- (id)initWithPyRef:(PyObject *)aPyRef tableView:(NSTableView *)aTableView +{ + PyPrioritizeList *model = [[PyPrioritizeList alloc] initWithModel:aPyRef]; + self = [super initWithPy:model tableView:aTableView]; + [model bindCallback:createCallback(@"PrioritizeListView", self)]; + [model release]; + return self; +} + - (PyPrioritizeList *)py { return (PyPrioritizeList *)py; diff --git a/cocoa/base/PyPrioritizeDialog.h b/cocoa/base/PyPrioritizeDialog.h deleted file mode 100644 index d461018a..00000000 --- a/cocoa/base/PyPrioritizeDialog.h +++ /dev/null @@ -1,20 +0,0 @@ -/* -Copyright 2011 Hardcoded Software (http://www.hardcoded.net) - -This software is licensed under the "BSD" License as described in the "LICENSE" file, -which should be included with this package. The terms are also available at -http://www.hardcoded.net/licenses/bsd_license -*/ - -#import -#import "PyGUI.h" -#import "PySelectableList.h" - -@interface PyPrioritizeDialog : PyGUI -- (PySelectableList *)categoryList; -- (PySelectableList *)criteriaList; -- (PySelectableList *)prioritizationList; -- (void)addSelected; -- (void)removeSelected; -- (void)performReprioritization; -@end \ No newline at end of file diff --git a/cocoa/base/PyPrioritizeList.h b/cocoa/base/PyPrioritizeList.h deleted file mode 100644 index 7e5c70bb..00000000 --- a/cocoa/base/PyPrioritizeList.h +++ /dev/null @@ -1,14 +0,0 @@ -/* -Copyright 2011 Hardcoded Software (http://www.hardcoded.net) - -This software is licensed under the "BSD" License as described in the "LICENSE" file, -which should be included with this package. The terms are also available at -http://www.hardcoded.net/licenses/bsd_license -*/ - -#import -#import "PySelectableList.h" - -@interface PyPrioritizeList : PySelectableList -- (void)moveIndexes:(NSArray *)indexes toIndex:(NSInteger)destIndex; -@end \ No newline at end of file diff --git a/cocoa/base/ResultWindow.m b/cocoa/base/ResultWindow.m index 3a4e53ec..5d44e71b 100644 --- a/cocoa/base/ResultWindow.m +++ b/cocoa/base/ResultWindow.m @@ -272,7 +272,7 @@ http://www.hardcoded.net/licenses/bsd_license - (IBAction)reprioritizeResults:(id)sender { - PrioritizeDialog *dlg = [[PrioritizeDialog alloc] initWithPy:py]; + PrioritizeDialog *dlg = [[PrioritizeDialog alloc] init]; NSInteger result = [NSApp runModalForWindow:[dlg window]]; if (result == NSRunStoppedResponse) { [[dlg py] performReprioritization]; diff --git a/cocoa/inter/prioritize_dialog.py b/cocoa/inter/prioritize_dialog.py index 76d140a5..63da1de2 100644 --- a/cocoa/inter/prioritize_dialog.py +++ b/cocoa/inter/prioritize_dialog.py @@ -1,31 +1,24 @@ -from cocoa.inter import PyGUIObject, PySelectableList +from objp.util import pyref +from cocoa.inter2 import PyGUIObject, GUIObjectView -from core.gui.prioritize_dialog import PrioritizeDialog -from .prioritize_list import PyPrioritizeList +class PrioritizeDialogView(GUIObjectView): + pass class PyPrioritizeDialog(PyGUIObject): - py_class = PrioritizeDialog + def categoryList(self) -> pyref: + return self.model.category_list - def categoryList(self): - if not hasattr(self, '_categoryList'): - self._categoryList = PySelectableList.alloc().initWithPy_(self.py.category_list) - return self._categoryList + def criteriaList(self) -> pyref: + return self.model.criteria_list - def criteriaList(self): - if not hasattr(self, '_criteriaList'): - self._criteriaList = PySelectableList.alloc().initWithPy_(self.py.criteria_list) - return self._criteriaList - - def prioritizationList(self): - if not hasattr(self, '_prioritizationList'): - self._prioritizationList = PyPrioritizeList.alloc().initWithPy_(self.py.prioritization_list) - return self._prioritizationList + def prioritizationList(self) -> pyref: + return self.model.prioritization_list def addSelected(self): - self.py.add_selected() + self.model.add_selected() def removeSelected(self): - self.py.remove_selected() + self.model.remove_selected() def performReprioritization(self): - self.py.perform_reprioritization() \ No newline at end of file + self.model.perform_reprioritization() diff --git a/cocoa/inter/prioritize_list.py b/cocoa/inter/prioritize_list.py index fd728ad0..47ff752e 100644 --- a/cocoa/inter/prioritize_list.py +++ b/cocoa/inter/prioritize_list.py @@ -1,7 +1,10 @@ -from cocoa.inter import signature, PySelectableList +from cocoa.inter2 import PySelectableList2, SelectableListView -class PyPrioritizeList(PySelectableList): - @signature('v@:@i') - def moveIndexes_toIndex_(self, indexes, dest_index): - self.py.move_indexes(indexes, dest_index) - \ No newline at end of file +class PrioritizeListView(SelectableListView): + pass + +class PyPrioritizeList(PySelectableList2): + FOLLOW_PROTOCOLS = ['PySelectableList2'] + + def moveIndexes_toIndex_(self, indexes: list, dest_index: int): + self.model.move_indexes(indexes, dest_index) diff --git a/cocoa/se/dg_cocoa.py b/cocoa/se/dg_cocoa.py index 7ff792cd..42329cbb 100644 --- a/cocoa/se/dg_cocoa.py +++ b/cocoa/se/dg_cocoa.py @@ -16,6 +16,7 @@ from inter.details_panel import PyDetailsPanel from inter.directory_outline import PyDirectoryOutline from inter.extra_fairware_reminder import PyExtraFairwareReminder from inter.prioritize_dialog import PyPrioritizeDialog +from inter.prioritize_list import PyPrioritizeList from inter.problem_dialog import PyProblemDialog from inter.problem_table import PyProblemTable from inter.result_table import PyResultTable diff --git a/cocoa/se/dupeguru.xcodeproj/project.pbxproj b/cocoa/se/dupeguru.xcodeproj/project.pbxproj index a2cbaea0..3c7e220e 100644 --- a/cocoa/se/dupeguru.xcodeproj/project.pbxproj +++ b/cocoa/se/dupeguru.xcodeproj/project.pbxproj @@ -26,11 +26,14 @@ CE381C9609914ACE003581CE /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = CE381C9409914ACE003581CE /* AppDelegate.m */; }; CE381C9C09914ADF003581CE /* ResultWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = CE381C9A09914ADF003581CE /* ResultWindow.m */; }; CE3A3B4914BF19B8007898AB /* PyDetailsPanel.m in Sources */ = {isa = PBXBuildFile; fileRef = CE3A3B4814BF19B8007898AB /* PyDetailsPanel.m */; }; - CE41672D141FE1E5004F3F0B /* HSSelectableList.m in Sources */ = {isa = PBXBuildFile; fileRef = CE41672B141FE1E5004F3F0B /* HSSelectableList.m */; }; CE45579B0AE3BC2B005A9546 /* Sparkle.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CE45579A0AE3BC2B005A9546 /* Sparkle.framework */; }; CE4557B40AE3BC50005A9546 /* Sparkle.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = CE45579A0AE3BC2B005A9546 /* Sparkle.framework */; }; CE5335FC142BBFAF008E5374 /* HSQuicklook.m in Sources */ = {isa = PBXBuildFile; fileRef = CE5335FB142BBFAF008E5374 /* HSQuicklook.m */; }; CE533603142BC034008E5374 /* Quartz.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CE533602142BC034008E5374 /* Quartz.framework */; }; + CE548CC014BF902000D180CB /* HSPopUpList2.m in Sources */ = {isa = PBXBuildFile; fileRef = CE548CBD14BF902000D180CB /* HSPopUpList2.m */; }; + CE548CC114BF902000D180CB /* HSSelectableList2.m in Sources */ = {isa = PBXBuildFile; fileRef = CE548CBF14BF902000D180CB /* HSSelectableList2.m */; }; + CE548CC614BF903D00D180CB /* PyPrioritizeDialog.m in Sources */ = {isa = PBXBuildFile; fileRef = CE548CC314BF903D00D180CB /* PyPrioritizeDialog.m */; }; + CE548CC714BF903D00D180CB /* PyPrioritizeList.m in Sources */ = {isa = PBXBuildFile; fileRef = CE548CC514BF903D00D180CB /* PyPrioritizeList.m */; }; CE54A87E148046F9008EEA77 /* HSColumns.m in Sources */ = {isa = PBXBuildFile; fileRef = CE54A87D148046F9008EEA77 /* HSColumns.m */; }; CE647E571173024A006D28BA /* ProblemDialog.m in Sources */ = {isa = PBXBuildFile; fileRef = CE647E551173024A006D28BA /* ProblemDialog.m */; }; CE665B3013225ADD003F5CFB /* ExtraFairwareReminder.m in Sources */ = {isa = PBXBuildFile; fileRef = CE665B2E13225ADD003F5CFB /* ExtraFairwareReminder.m */; }; @@ -59,7 +62,6 @@ CE91F216113BC22D0010360B /* StatsLabel.m in Sources */ = {isa = PBXBuildFile; fileRef = CE91F214113BC22D0010360B /* StatsLabel.m */; }; CE9777CD141F8C2500C13FB5 /* PrioritizeDialog.m in Sources */ = {isa = PBXBuildFile; fileRef = CE9777CC141F8C2500C13FB5 /* PrioritizeDialog.m */; }; CE9777D1141F8CB400C13FB5 /* PrioritizeDialog.xib in Resources */ = {isa = PBXBuildFile; fileRef = CE9777CF141F8CB400C13FB5 /* PrioritizeDialog.xib */; }; - CE9777D5141F9D7600C13FB5 /* HSPopUpList.m in Sources */ = {isa = PBXBuildFile; fileRef = CE9777D4141F9D7600C13FB5 /* HSPopUpList.m */; }; CE9D842A14BE2AE900184165 /* PyExtraFairwareReminder.m in Sources */ = {isa = PBXBuildFile; fileRef = CE9D842914BE2AE900184165 /* PyExtraFairwareReminder.m */; }; CEA175CA1461E8E600776591 /* locale in Resources */ = {isa = PBXBuildFile; fileRef = CEA175C91461E8E600776591 /* locale */; }; CEA450B814BDDFD7002DAAF2 /* dg_cocoa.py in Resources */ = {isa = PBXBuildFile; fileRef = CEA450B714BDDFD7002DAAF2 /* dg_cocoa.py */; }; @@ -160,13 +162,20 @@ CE381C9B09914ADF003581CE /* ResultWindow.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = ResultWindow.h; sourceTree = SOURCE_ROOT; }; CE3A3B4714BF19B8007898AB /* PyDetailsPanel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PyDetailsPanel.h; sourceTree = ""; }; CE3A3B4814BF19B8007898AB /* PyDetailsPanel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PyDetailsPanel.m; sourceTree = ""; }; - CE41672A141FE1E5004F3F0B /* HSSelectableList.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HSSelectableList.h; sourceTree = ""; }; - CE41672B141FE1E5004F3F0B /* HSSelectableList.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HSSelectableList.m; sourceTree = ""; }; CE41672C141FE1E5004F3F0B /* HSTable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HSTable.h; sourceTree = ""; }; CE45579A0AE3BC2B005A9546 /* Sparkle.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Sparkle.framework; path = /Library/Frameworks/Sparkle.framework; sourceTree = ""; }; CE5335FA142BBFAF008E5374 /* HSQuicklook.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = HSQuicklook.h; path = ../../cocoalib/HSQuicklook.h; sourceTree = ""; }; CE5335FB142BBFAF008E5374 /* HSQuicklook.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = HSQuicklook.m; path = ../../cocoalib/HSQuicklook.m; sourceTree = ""; }; CE533602142BC034008E5374 /* Quartz.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Quartz.framework; path = System/Library/Frameworks/Quartz.framework; sourceTree = SDKROOT; }; + CE548CBB14BF8FFE00D180CB /* PySelectableList2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PySelectableList2.h; sourceTree = ""; }; + CE548CBC14BF902000D180CB /* HSPopUpList2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HSPopUpList2.h; sourceTree = ""; }; + CE548CBD14BF902000D180CB /* HSPopUpList2.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HSPopUpList2.m; sourceTree = ""; }; + CE548CBE14BF902000D180CB /* HSSelectableList2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HSSelectableList2.h; sourceTree = ""; }; + CE548CBF14BF902000D180CB /* HSSelectableList2.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HSSelectableList2.m; sourceTree = ""; }; + CE548CC214BF903D00D180CB /* PyPrioritizeDialog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PyPrioritizeDialog.h; sourceTree = ""; }; + CE548CC314BF903D00D180CB /* PyPrioritizeDialog.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PyPrioritizeDialog.m; sourceTree = ""; }; + CE548CC414BF903D00D180CB /* PyPrioritizeList.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PyPrioritizeList.h; sourceTree = ""; }; + CE548CC514BF903D00D180CB /* PyPrioritizeList.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PyPrioritizeList.m; sourceTree = ""; }; CE54A87C148046F9008EEA77 /* HSColumns.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HSColumns.h; sourceTree = ""; }; CE54A87D148046F9008EEA77 /* HSColumns.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HSColumns.m; sourceTree = ""; }; CE647E541173024A006D28BA /* ProblemDialog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ProblemDialog.h; path = ../base/ProblemDialog.h; sourceTree = SOURCE_ROOT; }; @@ -230,8 +239,6 @@ CE8113EC12E5CEA800A36C80 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = ../base/fr.lproj/Localizable.strings; sourceTree = SOURCE_ROOT; }; CE89240614239CC30024CE4E /* PrioritizeList.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PrioritizeList.h; path = ../base/PrioritizeList.h; sourceTree = ""; }; CE89240714239CC30024CE4E /* PrioritizeList.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = PrioritizeList.m; path = ../base/PrioritizeList.m; sourceTree = ""; }; - CE89240814239CC30024CE4E /* PyPrioritizeDialog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PyPrioritizeDialog.h; path = ../base/PyPrioritizeDialog.h; sourceTree = ""; }; - CE89240914239CC30024CE4E /* PyPrioritizeList.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PyPrioritizeList.h; path = ../base/PyPrioritizeList.h; sourceTree = ""; }; CE8C53B61173248F0011B41F /* PyTable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PyTable.h; sourceTree = ""; }; CE8C53BB117324CE0011B41F /* HSTable.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HSTable.m; sourceTree = ""; }; CE91F213113BC22D0010360B /* StatsLabel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = StatsLabel.h; path = ../base/StatsLabel.h; sourceTree = SOURCE_ROOT; }; @@ -239,9 +246,6 @@ CE9777CB141F8C2500C13FB5 /* PrioritizeDialog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PrioritizeDialog.h; path = ../base/PrioritizeDialog.h; sourceTree = ""; }; CE9777CC141F8C2500C13FB5 /* PrioritizeDialog.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = PrioritizeDialog.m; path = ../base/PrioritizeDialog.m; sourceTree = ""; }; CE9777D0141F8CB400C13FB5 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = ../base/en.lproj/PrioritizeDialog.xib; sourceTree = ""; }; - CE9777D2141F9D6500C13FB5 /* PySelectableList.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PySelectableList.h; sourceTree = ""; }; - CE9777D3141F9D7600C13FB5 /* HSPopUpList.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HSPopUpList.h; sourceTree = ""; }; - CE9777D4141F9D7600C13FB5 /* HSPopUpList.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HSPopUpList.m; sourceTree = ""; }; CE9D842814BE2AE900184165 /* PyExtraFairwareReminder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PyExtraFairwareReminder.h; sourceTree = ""; }; CE9D842914BE2AE900184165 /* PyExtraFairwareReminder.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PyExtraFairwareReminder.m; sourceTree = ""; }; CEA175C91461E8E600776591 /* locale */ = {isa = PBXFileReference; lastKnownFileType = folder; name = locale; path = ../../build/locale; sourceTree = ""; }; @@ -421,6 +425,10 @@ CE275C5914BF71DF00265960 /* PyColumns2.m */, CE275C5414BF712B00265960 /* PyDirectoryOutline.h */, CE275C5514BF712B00265960 /* PyDirectoryOutline.m */, + CE548CC214BF903D00D180CB /* PyPrioritizeDialog.h */, + CE548CC314BF903D00D180CB /* PyPrioritizeDialog.m */, + CE548CC414BF903D00D180CB /* PyPrioritizeList.h */, + CE548CC514BF903D00D180CB /* PyPrioritizeList.m */, ); name = autogen; path = ../autogen; @@ -459,10 +467,10 @@ CE76FDC9111EE38E006618EA /* HSGUIController.m */, CE41672C141FE1E5004F3F0B /* HSTable.h */, CE8C53BB117324CE0011B41F /* HSTable.m */, - CE9777D3141F9D7600C13FB5 /* HSPopUpList.h */, - CE9777D4141F9D7600C13FB5 /* HSPopUpList.m */, - CE41672A141FE1E5004F3F0B /* HSSelectableList.h */, - CE41672B141FE1E5004F3F0B /* HSSelectableList.m */, + CE548CBC14BF902000D180CB /* HSPopUpList2.h */, + CE548CBD14BF902000D180CB /* HSPopUpList2.m */, + CE548CBE14BF902000D180CB /* HSSelectableList2.h */, + CE548CBF14BF902000D180CB /* HSSelectableList2.m */, ); name = controllers; path = ../../cocoalib/controllers; @@ -476,8 +484,8 @@ CED569C614BF312900C6AC25 /* PyGUI2.h */, CE76FDCE111EE38E006618EA /* PyOutline.h */, CE275C4A14BF6C3700265960 /* PyOutline2.h */, + CE548CBB14BF8FFE00D180CB /* PySelectableList2.h */, CE8C53B61173248F0011B41F /* PyTable.h */, - CE9777D2141F9D6500C13FB5 /* PySelectableList.h */, ); name = proxies; path = ../../cocoalib/proxies; @@ -568,10 +576,8 @@ CE647E561173024A006D28BA /* PyProblemDialog.h */, CE9777CB141F8C2500C13FB5 /* PrioritizeDialog.h */, CE9777CC141F8C2500C13FB5 /* PrioritizeDialog.m */, - CE89240814239CC30024CE4E /* PyPrioritizeDialog.h */, CE89240614239CC30024CE4E /* PrioritizeList.h */, CE89240714239CC30024CE4E /* PrioritizeList.m */, - CE89240914239CC30024CE4E /* PyPrioritizeList.h */, ); name = dgbase; sourceTree = ""; @@ -698,8 +704,6 @@ CEF0ACCE12DF3C2000B32F7E /* HSRecentFiles.m in Sources */, CE665B3013225ADD003F5CFB /* ExtraFairwareReminder.m in Sources */, CE9777CD141F8C2500C13FB5 /* PrioritizeDialog.m in Sources */, - CE9777D5141F9D7600C13FB5 /* HSPopUpList.m in Sources */, - CE41672D141FE1E5004F3F0B /* HSSelectableList.m in Sources */, CE89240A14239CC30024CE4E /* PrioritizeList.m in Sources */, CE5335FC142BBFAF008E5374 /* HSQuicklook.m in Sources */, CE54A87E148046F9008EEA77 /* HSColumns.m in Sources */, @@ -711,6 +715,10 @@ CE275C5114BF6C5600265960 /* HSOutline2.m in Sources */, CE275C5714BF712B00265960 /* PyDirectoryOutline.m in Sources */, CE275C5A14BF71DF00265960 /* PyColumns2.m in Sources */, + CE548CC014BF902000D180CB /* HSPopUpList2.m in Sources */, + CE548CC114BF902000D180CB /* HSSelectableList2.m in Sources */, + CE548CC614BF903D00D180CB /* PyPrioritizeDialog.m in Sources */, + CE548CC714BF903D00D180CB /* PyPrioritizeList.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/core/app.py b/core/app.py index f8560c1f..c3439d68 100644 --- a/core/app.py +++ b/core/app.py @@ -27,6 +27,7 @@ from . import directories, results, scanner, export, fs from .gui.details_panel import DetailsPanel from .gui.directory_tree import DirectoryTree from .gui.extra_fairware_reminder import ExtraFairwareReminder +from .gui.prioritize_dialog import PrioritizeDialog from .gui.stats_label import StatsLabel HAD_FIRST_LAUNCH_PREFERENCE = 'HadFirstLaunch' @@ -107,6 +108,7 @@ class DupeGuru(RegistrableApplication, Broadcaster): self.details_panel = DetailsPanel(None, self) self.directory_tree = DirectoryTree(None, self) self.extra_fairware_reminder = ExtraFairwareReminder(None, self) + self.prioritize_dialog = PrioritizeDialog(None, self) self.stats_label = StatsLabel(None, self) # subclasses must create self.result_table From f9ced08e6dd9ad192197dab9ade30fc5bcd43ea5 Mon Sep 17 00:00:00 2001 From: Virgil Dupras Date: Fri, 13 Jan 2012 10:20:46 -0500 Subject: [PATCH 11/26] Fixed the mess I had to introduce earlier to make selectable list work by using objp's new inheritance capabilities. --HG-- branch : objp --- build.py | 14 ++++---- cocoa/base/PrioritizeDialog.h | 3 +- cocoa/base/PrioritizeDialog.m | 2 +- cocoa/base/PrioritizeList.h | 2 +- cocoa/base/PrioritizeList.m | 14 ++++---- cocoa/inter/details_panel.py | 4 +-- cocoa/inter/directory_outline.py | 6 ++-- cocoa/inter/extra_fairware_reminder.py | 4 +-- cocoa/inter/prioritize_dialog.py | 4 +-- cocoa/inter/prioritize_list.py | 2 -- cocoa/inter/stats_label.py | 4 +-- cocoa/se/dg_cocoa.py | 1 + cocoa/se/dupeguru.xcodeproj/project.pbxproj | 36 ++++++++++++--------- 13 files changed, 49 insertions(+), 47 deletions(-) diff --git a/build.py b/build.py index c79e704a..f3513172 100644 --- a/build.py +++ b/build.py @@ -179,19 +179,21 @@ def build_cocoa_bridging_interfaces(): import objp.p2o add_to_pythonpath('cocoa') add_to_pythonpath('cocoalib') - from cocoa.inter2 import PyColumns2, ColumnsView + from cocoa.inter2 import (PyGUIObject2, PyColumns2, ColumnsView, PyOutline2, OutlineView, + PySelectableList2, SelectableListView) from inter.details_panel import PyDetailsPanel, DetailsPanelView from inter.directory_outline import PyDirectoryOutline, DirectoryOutlineView from inter.extra_fairware_reminder import PyExtraFairwareReminder, ExtraFairwareReminderView from inter.prioritize_dialog import PyPrioritizeDialog, PrioritizeDialogView from inter.prioritize_list import PyPrioritizeList, PrioritizeListView from inter.stats_label import PyStatsLabel, StatsLabelView - allclasses = [PyColumns2, PyDetailsPanel, PyDirectoryOutline, PyExtraFairwareReminder, - PyPrioritizeDialog, PyPrioritizeList, PyStatsLabel] + allclasses = [PyGUIObject2, PyColumns2, PyOutline2, PySelectableList2, PyDetailsPanel, + PyDirectoryOutline, PyExtraFairwareReminder, PyPrioritizeDialog, PyPrioritizeList, + PyStatsLabel] for class_ in allclasses: - objp.o2p.generate_objc_code(class_, 'cocoa/autogen') - allclasses = [ColumnsView, DetailsPanelView, DirectoryOutlineView, ExtraFairwareReminderView, - PrioritizeDialogView, PrioritizeListView, StatsLabelView] + objp.o2p.generate_objc_code(class_, 'cocoa/autogen', inherit=True) + allclasses = [ColumnsView, OutlineView, SelectableListView, DetailsPanelView, DirectoryOutlineView, + ExtraFairwareReminderView, PrioritizeDialogView, PrioritizeListView, StatsLabelView] for class_ in allclasses: clsspec = objp.o2p.spec_from_python_class(class_) clsname = class_.__name__ diff --git a/cocoa/base/PrioritizeDialog.h b/cocoa/base/PrioritizeDialog.h index 0e85b827..3003da72 100644 --- a/cocoa/base/PrioritizeDialog.h +++ b/cocoa/base/PrioritizeDialog.h @@ -21,8 +21,7 @@ http://www.hardcoded.net/licenses/bsd_license PyPrioritizeDialog *py; HSPopUpList2 *categoryPopUp; - // XXX Just to make it work temporarily, fix this asap (support to be HSSelectableList) - PrioritizeList *criteriaList; + HSSelectableList2 *criteriaList; PrioritizeList *prioritizationList; } - (id)init; diff --git a/cocoa/base/PrioritizeDialog.m b/cocoa/base/PrioritizeDialog.m index 6f2c8668..2e32af1b 100644 --- a/cocoa/base/PrioritizeDialog.m +++ b/cocoa/base/PrioritizeDialog.m @@ -17,7 +17,7 @@ http://www.hardcoded.net/licenses/bsd_license py = [[PyPrioritizeDialog alloc] initWithModel:findHackishModel(@"prioritize_dialog")]; [py bindCallback:createCallback(@"PrioritizeDialogView", self)]; categoryPopUp = [[HSPopUpList2 alloc] initWithPyRef:[[self py] categoryList] popupView:categoryPopUpView]; - criteriaList = [[PrioritizeList alloc] initWithPyRef:[[self py] criteriaList] tableView:criteriaTableView]; + criteriaList = [[HSSelectableList2 alloc] initWithPyRef:[[self py] criteriaList] tableView:criteriaTableView]; prioritizationList = [[PrioritizeList alloc] initWithPyRef:[[self py] prioritizationList] tableView:prioritizationTableView]; [py connect]; return self; diff --git a/cocoa/base/PrioritizeList.h b/cocoa/base/PrioritizeList.h index c1571376..bc3c1eee 100644 --- a/cocoa/base/PrioritizeList.h +++ b/cocoa/base/PrioritizeList.h @@ -12,5 +12,5 @@ http://www.hardcoded.net/licenses/bsd_license @interface PrioritizeList : HSSelectableList2 {} - (id)initWithPyRef:(PyObject *)aPyRef tableView:(NSTableView *)aTableView; -- (PyPrioritizeList *)py; +- (PyPrioritizeList *)model; @end \ No newline at end of file diff --git a/cocoa/base/PrioritizeList.m b/cocoa/base/PrioritizeList.m index f1c902b1..47452278 100644 --- a/cocoa/base/PrioritizeList.m +++ b/cocoa/base/PrioritizeList.m @@ -13,16 +13,16 @@ http://www.hardcoded.net/licenses/bsd_license @implementation PrioritizeList - (id)initWithPyRef:(PyObject *)aPyRef tableView:(NSTableView *)aTableView { - PyPrioritizeList *model = [[PyPrioritizeList alloc] initWithModel:aPyRef]; - self = [super initWithPy:model tableView:aTableView]; - [model bindCallback:createCallback(@"PrioritizeListView", self)]; - [model release]; + PyPrioritizeList *m = [[PyPrioritizeList alloc] initWithModel:aPyRef]; + self = [super initWithModel:m tableView:aTableView]; + [m bindCallback:createCallback(@"PrioritizeListView", self)]; + [m release]; return self; } -- (PyPrioritizeList *)py +- (PyPrioritizeList *)model { - return (PyPrioritizeList *)py; + return (PyPrioritizeList *)model; } - (void)setView:(NSTableView *)aTableView @@ -54,7 +54,7 @@ http://www.hardcoded.net/licenses/bsd_license NSPasteboard* pboard = [info draggingPasteboard]; NSData* rowData = [pboard dataForType:DGPrioritizeIndexPasteboardType]; NSIndexSet* rowIndexes = [NSKeyedUnarchiver unarchiveObjectWithData:rowData]; - [[self py] moveIndexes:[Utils indexSet2Array:rowIndexes] toIndex:row]; + [[self model] moveIndexes:[Utils indexSet2Array:rowIndexes] toIndex:row]; return YES; } @end \ No newline at end of file diff --git a/cocoa/inter/details_panel.py b/cocoa/inter/details_panel.py index 4ac39d9a..b2d17851 100644 --- a/cocoa/inter/details_panel.py +++ b/cocoa/inter/details_panel.py @@ -1,9 +1,9 @@ -from cocoa.inter2 import PyGUIObject, GUIObjectView +from cocoa.inter2 import PyGUIObject2, GUIObjectView class DetailsPanelView(GUIObjectView): pass -class PyDetailsPanel(PyGUIObject): +class PyDetailsPanel(PyGUIObject2): def numberOfRows(self) -> int: return self.model.row_count() diff --git a/cocoa/inter/directory_outline.py b/cocoa/inter/directory_outline.py index d88f98ac..57832b25 100644 --- a/cocoa/inter/directory_outline.py +++ b/cocoa/inter/directory_outline.py @@ -1,12 +1,10 @@ from objp.util import dontwrap -from cocoa.inter2 import PyOutline, GUIObjectView +from cocoa.inter2 import PyOutline2, GUIObjectView class DirectoryOutlineView(GUIObjectView): pass -class PyDirectoryOutline(PyOutline): - FOLLOW_PROTOCOLS = ['PyOutline2'] - +class PyDirectoryOutline(PyOutline2): def addDirectory_(self, path: str): self.model.add_directory(path) diff --git a/cocoa/inter/extra_fairware_reminder.py b/cocoa/inter/extra_fairware_reminder.py index 47b9871c..af87e557 100644 --- a/cocoa/inter/extra_fairware_reminder.py +++ b/cocoa/inter/extra_fairware_reminder.py @@ -1,5 +1,5 @@ from objp.util import dontwrap -from cocoa.inter2 import PyGUIObject +from cocoa.inter2 import PyGUIObject2 class ExtraFairwareReminderView: def startTimer(self): pass @@ -7,7 +7,7 @@ class ExtraFairwareReminderView: def setButtonText_(self, text: str): pass; def enableButton(self): pass -class PyExtraFairwareReminder(PyGUIObject): +class PyExtraFairwareReminder(PyGUIObject2): def start(self): self.model.start() diff --git a/cocoa/inter/prioritize_dialog.py b/cocoa/inter/prioritize_dialog.py index 63da1de2..769bc026 100644 --- a/cocoa/inter/prioritize_dialog.py +++ b/cocoa/inter/prioritize_dialog.py @@ -1,10 +1,10 @@ from objp.util import pyref -from cocoa.inter2 import PyGUIObject, GUIObjectView +from cocoa.inter2 import PyGUIObject2, GUIObjectView class PrioritizeDialogView(GUIObjectView): pass -class PyPrioritizeDialog(PyGUIObject): +class PyPrioritizeDialog(PyGUIObject2): def categoryList(self) -> pyref: return self.model.category_list diff --git a/cocoa/inter/prioritize_list.py b/cocoa/inter/prioritize_list.py index 47ff752e..5d525bc9 100644 --- a/cocoa/inter/prioritize_list.py +++ b/cocoa/inter/prioritize_list.py @@ -4,7 +4,5 @@ class PrioritizeListView(SelectableListView): pass class PyPrioritizeList(PySelectableList2): - FOLLOW_PROTOCOLS = ['PySelectableList2'] - def moveIndexes_toIndex_(self, indexes: list, dest_index: int): self.model.move_indexes(indexes, dest_index) diff --git a/cocoa/inter/stats_label.py b/cocoa/inter/stats_label.py index b36fbcb0..f484d7be 100644 --- a/cocoa/inter/stats_label.py +++ b/cocoa/inter/stats_label.py @@ -1,9 +1,9 @@ -from cocoa.inter2 import PyGUIObject, GUIObjectView +from cocoa.inter2 import PyGUIObject2, GUIObjectView class StatsLabelView(GUIObjectView): pass -class PyStatsLabel(PyGUIObject): +class PyStatsLabel(PyGUIObject2): def display(self) -> str: return self.model.display diff --git a/cocoa/se/dg_cocoa.py b/cocoa/se/dg_cocoa.py index 42329cbb..0985dbf8 100644 --- a/cocoa/se/dg_cocoa.py +++ b/cocoa/se/dg_cocoa.py @@ -8,6 +8,7 @@ from hscommon.trans import install_gettext_trans_under_cocoa install_gettext_trans_under_cocoa() from cocoa.inter import signature +from cocoa.inter2 import PySelectableList2 from core.scanner import ScanType diff --git a/cocoa/se/dupeguru.xcodeproj/project.pbxproj b/cocoa/se/dupeguru.xcodeproj/project.pbxproj index 3c7e220e..3d633d17 100644 --- a/cocoa/se/dupeguru.xcodeproj/project.pbxproj +++ b/cocoa/se/dupeguru.xcodeproj/project.pbxproj @@ -35,6 +35,8 @@ CE548CC614BF903D00D180CB /* PyPrioritizeDialog.m in Sources */ = {isa = PBXBuildFile; fileRef = CE548CC314BF903D00D180CB /* PyPrioritizeDialog.m */; }; CE548CC714BF903D00D180CB /* PyPrioritizeList.m in Sources */ = {isa = PBXBuildFile; fileRef = CE548CC514BF903D00D180CB /* PyPrioritizeList.m */; }; CE54A87E148046F9008EEA77 /* HSColumns.m in Sources */ = {isa = PBXBuildFile; fileRef = CE54A87D148046F9008EEA77 /* HSColumns.m */; }; + CE587E9A14C07BCF004CA031 /* PyOutline2.m in Sources */ = {isa = PBXBuildFile; fileRef = CE587E9814C07BCF004CA031 /* PyOutline2.m */; }; + CE587E9E14C0801F004CA031 /* PySelectableList2.m in Sources */ = {isa = PBXBuildFile; fileRef = CE587E9D14C0801F004CA031 /* PySelectableList2.m */; }; CE647E571173024A006D28BA /* ProblemDialog.m in Sources */ = {isa = PBXBuildFile; fileRef = CE647E551173024A006D28BA /* ProblemDialog.m */; }; CE665B3013225ADD003F5CFB /* ExtraFairwareReminder.m in Sources */ = {isa = PBXBuildFile; fileRef = CE665B2E13225ADD003F5CFB /* ExtraFairwareReminder.m */; }; CE665B3313225AF8003F5CFB /* ExtraFairwareReminder.xib in Resources */ = {isa = PBXBuildFile; fileRef = CE665B3113225AF8003F5CFB /* ExtraFairwareReminder.xib */; }; @@ -46,7 +48,6 @@ CE76FDC6111EE37C006618EA /* NSTableViewAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = CE76FDC3111EE37C006618EA /* NSTableViewAdditions.m */; }; CE76FDCF111EE38E006618EA /* HSGUIController.m in Sources */ = {isa = PBXBuildFile; fileRef = CE76FDC9111EE38E006618EA /* HSGUIController.m */; }; CE76FDD4111EE3A7006618EA /* DirectoryOutline.m in Sources */ = {isa = PBXBuildFile; fileRef = CE76FDD2111EE3A7006618EA /* DirectoryOutline.m */; }; - CE76FDDF111EE42F006618EA /* HSOutline.m in Sources */ = {isa = PBXBuildFile; fileRef = CE76FDDE111EE42F006618EA /* HSOutline.m */; }; CE76FDF7111EE561006618EA /* NSEventAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = CE76FDF6111EE561006618EA /* NSEventAdditions.m */; }; CE79638612536C94008D405B /* FairwareReminder.xib in Resources */ = {isa = PBXBuildFile; fileRef = CE79638412536C94008D405B /* FairwareReminder.xib */; }; CE79638C12536F4E008D405B /* HSFairwareReminder.m in Sources */ = {isa = PBXBuildFile; fileRef = CE79638B12536F4E008D405B /* HSFairwareReminder.m */; }; @@ -63,6 +64,7 @@ CE9777CD141F8C2500C13FB5 /* PrioritizeDialog.m in Sources */ = {isa = PBXBuildFile; fileRef = CE9777CC141F8C2500C13FB5 /* PrioritizeDialog.m */; }; CE9777D1141F8CB400C13FB5 /* PrioritizeDialog.xib in Resources */ = {isa = PBXBuildFile; fileRef = CE9777CF141F8CB400C13FB5 /* PrioritizeDialog.xib */; }; CE9D842A14BE2AE900184165 /* PyExtraFairwareReminder.m in Sources */ = {isa = PBXBuildFile; fileRef = CE9D842914BE2AE900184165 /* PyExtraFairwareReminder.m */; }; + CE9FC22D14C080CF005C31FD /* PyGUIObject2.m in Sources */ = {isa = PBXBuildFile; fileRef = CE9FC22C14C080CF005C31FD /* PyGUIObject2.m */; }; CEA175CA1461E8E600776591 /* locale in Resources */ = {isa = PBXBuildFile; fileRef = CEA175C91461E8E600776591 /* locale */; }; CEA450B814BDDFD7002DAAF2 /* dg_cocoa.py in Resources */ = {isa = PBXBuildFile; fileRef = CEA450B714BDDFD7002DAAF2 /* dg_cocoa.py */; }; CEBE4D74111F0EE1009AAC6D /* HSWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = CEBE4D73111F0EE1009AAC6D /* HSWindowController.m */; }; @@ -137,7 +139,6 @@ CE1D091514BE0C6400CA6B8C /* ObjP.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ObjP.m; sourceTree = ""; }; CE1D091614BE0C6400CA6B8C /* PyStatsLabel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PyStatsLabel.h; sourceTree = ""; }; CE1D091714BE0C6400CA6B8C /* PyStatsLabel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PyStatsLabel.m; sourceTree = ""; }; - CE275C4A14BF6C3700265960 /* PyOutline2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PyOutline2.h; sourceTree = ""; }; CE275C4C14BF6C5600265960 /* HSColumns2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HSColumns2.h; sourceTree = ""; }; CE275C4D14BF6C5600265960 /* HSColumns2.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HSColumns2.m; sourceTree = ""; }; CE275C4E14BF6C5600265960 /* HSOutline2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HSOutline2.h; sourceTree = ""; }; @@ -167,7 +168,6 @@ CE5335FA142BBFAF008E5374 /* HSQuicklook.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = HSQuicklook.h; path = ../../cocoalib/HSQuicklook.h; sourceTree = ""; }; CE5335FB142BBFAF008E5374 /* HSQuicklook.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = HSQuicklook.m; path = ../../cocoalib/HSQuicklook.m; sourceTree = ""; }; CE533602142BC034008E5374 /* Quartz.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Quartz.framework; path = System/Library/Frameworks/Quartz.framework; sourceTree = SDKROOT; }; - CE548CBB14BF8FFE00D180CB /* PySelectableList2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PySelectableList2.h; sourceTree = ""; }; CE548CBC14BF902000D180CB /* HSPopUpList2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HSPopUpList2.h; sourceTree = ""; }; CE548CBD14BF902000D180CB /* HSPopUpList2.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HSPopUpList2.m; sourceTree = ""; }; CE548CBE14BF902000D180CB /* HSSelectableList2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HSSelectableList2.h; sourceTree = ""; }; @@ -178,6 +178,10 @@ CE548CC514BF903D00D180CB /* PyPrioritizeList.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PyPrioritizeList.m; sourceTree = ""; }; CE54A87C148046F9008EEA77 /* HSColumns.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HSColumns.h; sourceTree = ""; }; CE54A87D148046F9008EEA77 /* HSColumns.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HSColumns.m; sourceTree = ""; }; + CE587E9714C07BCF004CA031 /* PyOutline2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PyOutline2.h; sourceTree = ""; }; + CE587E9814C07BCF004CA031 /* PyOutline2.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PyOutline2.m; sourceTree = ""; }; + CE587E9C14C0801F004CA031 /* PySelectableList2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PySelectableList2.h; sourceTree = ""; }; + CE587E9D14C0801F004CA031 /* PySelectableList2.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PySelectableList2.m; sourceTree = ""; }; CE647E541173024A006D28BA /* ProblemDialog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ProblemDialog.h; path = ../base/ProblemDialog.h; sourceTree = SOURCE_ROOT; }; CE647E551173024A006D28BA /* ProblemDialog.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = ProblemDialog.m; path = ../base/ProblemDialog.m; sourceTree = SOURCE_ROOT; }; CE647E561173024A006D28BA /* PyProblemDialog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PyProblemDialog.h; path = ../base/PyProblemDialog.h; sourceTree = SOURCE_ROOT; }; @@ -200,11 +204,8 @@ CE76FDC8111EE38E006618EA /* HSGUIController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HSGUIController.h; sourceTree = ""; }; CE76FDC9111EE38E006618EA /* HSGUIController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HSGUIController.m; sourceTree = ""; }; CE76FDCD111EE38E006618EA /* PyGUI.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PyGUI.h; sourceTree = ""; }; - CE76FDCE111EE38E006618EA /* PyOutline.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PyOutline.h; sourceTree = ""; }; CE76FDD1111EE3A7006618EA /* DirectoryOutline.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DirectoryOutline.h; path = ../base/DirectoryOutline.h; sourceTree = SOURCE_ROOT; }; CE76FDD2111EE3A7006618EA /* DirectoryOutline.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = DirectoryOutline.m; path = ../base/DirectoryOutline.m; sourceTree = SOURCE_ROOT; }; - CE76FDDD111EE42F006618EA /* HSOutline.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HSOutline.h; sourceTree = ""; }; - CE76FDDE111EE42F006618EA /* HSOutline.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HSOutline.m; sourceTree = ""; }; CE76FDF5111EE561006618EA /* NSEventAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = NSEventAdditions.h; path = ../../cocoalib/NSEventAdditions.h; sourceTree = SOURCE_ROOT; }; CE76FDF6111EE561006618EA /* NSEventAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = NSEventAdditions.m; path = ../../cocoalib/NSEventAdditions.m; sourceTree = SOURCE_ROOT; }; CE79638212536C6E008D405B /* PyFairware.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PyFairware.h; path = ../../cocoalib/PyFairware.h; sourceTree = SOURCE_ROOT; }; @@ -248,6 +249,8 @@ CE9777D0141F8CB400C13FB5 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = ../base/en.lproj/PrioritizeDialog.xib; sourceTree = ""; }; CE9D842814BE2AE900184165 /* PyExtraFairwareReminder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PyExtraFairwareReminder.h; sourceTree = ""; }; CE9D842914BE2AE900184165 /* PyExtraFairwareReminder.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PyExtraFairwareReminder.m; sourceTree = ""; }; + CE9FC22B14C080CF005C31FD /* PyGUIObject2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PyGUIObject2.h; sourceTree = ""; }; + CE9FC22C14C080CF005C31FD /* PyGUIObject2.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PyGUIObject2.m; sourceTree = ""; }; CEA175C91461E8E600776591 /* locale */ = {isa = PBXFileReference; lastKnownFileType = folder; name = locale; path = ../../build/locale; sourceTree = ""; }; CEA450B714BDDFD7002DAAF2 /* dg_cocoa.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; name = dg_cocoa.py; path = ../../build/dg_cocoa.py; sourceTree = ""; }; CEB57990146ADC5100EDF7D7 /* HSConsts.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = HSConsts.h; path = ../../cocoalib/HSConsts.h; sourceTree = ""; }; @@ -260,7 +263,6 @@ CECFFF2013CDF8D0003A4518 /* de */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = de; path = ../base/de.lproj/ProblemDialog.xib; sourceTree = SOURCE_ROOT; }; CECFFF2113CDF8D0003A4518 /* de */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = de; path = ../base/de.lproj/ResultWindow.xib; sourceTree = SOURCE_ROOT; }; CECFFF2413CDF8E5003A4518 /* de */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = de; path = de.lproj/Preferences.xib; sourceTree = ""; }; - CED569C614BF312900C6AC25 /* PyGUI2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PyGUI2.h; sourceTree = ""; }; CED64CEB145EF06000572B00 /* cs */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = cs; path = ../base/cs.lproj/Localizable.strings; sourceTree = ""; }; CED64CF8145EF07700572B00 /* cs */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = cs; path = ../base/cs.lproj/DetailsPanel.xib; sourceTree = ""; }; CED64CF9145EF07700572B00 /* cs */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = cs; path = ../base/cs.lproj/DirectoryPanel.xib; sourceTree = ""; }; @@ -413,8 +415,12 @@ CE1D091314BE0C6400CA6B8C /* autogen */ = { isa = PBXGroup; children = ( - CE1D091414BE0C6400CA6B8C /* ObjP.h */, - CE1D091514BE0C6400CA6B8C /* ObjP.m */, + CE9FC22B14C080CF005C31FD /* PyGUIObject2.h */, + CE9FC22C14C080CF005C31FD /* PyGUIObject2.m */, + CE587E9714C07BCF004CA031 /* PyOutline2.h */, + CE587E9814C07BCF004CA031 /* PyOutline2.m */, + CE587E9C14C0801F004CA031 /* PySelectableList2.h */, + CE587E9D14C0801F004CA031 /* PySelectableList2.m */, CE3A3B4714BF19B8007898AB /* PyDetailsPanel.h */, CE3A3B4814BF19B8007898AB /* PyDetailsPanel.m */, CE9D842814BE2AE900184165 /* PyExtraFairwareReminder.h */, @@ -429,6 +435,8 @@ CE548CC314BF903D00D180CB /* PyPrioritizeDialog.m */, CE548CC414BF903D00D180CB /* PyPrioritizeList.h */, CE548CC514BF903D00D180CB /* PyPrioritizeList.m */, + CE1D091414BE0C6400CA6B8C /* ObjP.h */, + CE1D091514BE0C6400CA6B8C /* ObjP.m */, ); name = autogen; path = ../autogen; @@ -459,8 +467,6 @@ CE275C4D14BF6C5600265960 /* HSColumns2.m */, CEBE4D72111F0EE1009AAC6D /* HSWindowController.h */, CEBE4D73111F0EE1009AAC6D /* HSWindowController.m */, - CE76FDDD111EE42F006618EA /* HSOutline.h */, - CE76FDDE111EE42F006618EA /* HSOutline.m */, CE275C4E14BF6C5600265960 /* HSOutline2.h */, CE275C4F14BF6C5600265960 /* HSOutline2.m */, CE76FDC8111EE38E006618EA /* HSGUIController.h */, @@ -481,10 +487,6 @@ children = ( CE275C5B14BF71FE00265960 /* PyColumns.h */, CE76FDCD111EE38E006618EA /* PyGUI.h */, - CED569C614BF312900C6AC25 /* PyGUI2.h */, - CE76FDCE111EE38E006618EA /* PyOutline.h */, - CE275C4A14BF6C3700265960 /* PyOutline2.h */, - CE548CBB14BF8FFE00D180CB /* PySelectableList2.h */, CE8C53B61173248F0011B41F /* PyTable.h */, ); name = proxies; @@ -691,7 +693,6 @@ CE76FDC6111EE37C006618EA /* NSTableViewAdditions.m in Sources */, CE76FDCF111EE38E006618EA /* HSGUIController.m in Sources */, CE76FDD4111EE3A7006618EA /* DirectoryOutline.m in Sources */, - CE76FDDF111EE42F006618EA /* HSOutline.m in Sources */, CE76FDF7111EE561006618EA /* NSEventAdditions.m in Sources */, CEBE4D74111F0EE1009AAC6D /* HSWindowController.m in Sources */, CE91F216113BC22D0010360B /* StatsLabel.m in Sources */, @@ -719,6 +720,9 @@ CE548CC114BF902000D180CB /* HSSelectableList2.m in Sources */, CE548CC614BF903D00D180CB /* PyPrioritizeDialog.m in Sources */, CE548CC714BF903D00D180CB /* PyPrioritizeList.m in Sources */, + CE587E9A14C07BCF004CA031 /* PyOutline2.m in Sources */, + CE587E9E14C0801F004CA031 /* PySelectableList2.m in Sources */, + CE9FC22D14C080CF005C31FD /* PyGUIObject2.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; From 7bce70c12857b03bcd3975cf28456cafbd9d2892 Mon Sep 17 00:00:00 2001 From: Virgil Dupras Date: Fri, 13 Jan 2012 11:49:34 -0500 Subject: [PATCH 12/26] Converted ResultsTable to objp. --HG-- branch : objp --- build.py | 12 ++-- cocoa/base/PyResultTable.h | 26 --------- cocoa/base/ResultTable.h | 8 +-- cocoa/base/ResultTable.m | 63 ++++++++++---------- cocoa/base/ResultWindow.m | 10 ++-- cocoa/inter/result_table.py | 64 ++++++++++----------- cocoa/se/dg_cocoa.py | 2 +- cocoa/se/dupeguru.xcodeproj/project.pbxproj | 34 +++++++++-- 8 files changed, 108 insertions(+), 111 deletions(-) delete mode 100644 cocoa/base/PyResultTable.h diff --git a/build.py b/build.py index f3513172..b30d916d 100644 --- a/build.py +++ b/build.py @@ -180,20 +180,22 @@ def build_cocoa_bridging_interfaces(): add_to_pythonpath('cocoa') add_to_pythonpath('cocoalib') from cocoa.inter2 import (PyGUIObject2, PyColumns2, ColumnsView, PyOutline2, OutlineView, - PySelectableList2, SelectableListView) + PySelectableList2, SelectableListView, PyTable2, TableView) from inter.details_panel import PyDetailsPanel, DetailsPanelView from inter.directory_outline import PyDirectoryOutline, DirectoryOutlineView from inter.extra_fairware_reminder import PyExtraFairwareReminder, ExtraFairwareReminderView from inter.prioritize_dialog import PyPrioritizeDialog, PrioritizeDialogView from inter.prioritize_list import PyPrioritizeList, PrioritizeListView + from inter.result_table import PyResultTable, ResultTableView from inter.stats_label import PyStatsLabel, StatsLabelView - allclasses = [PyGUIObject2, PyColumns2, PyOutline2, PySelectableList2, PyDetailsPanel, + allclasses = [PyGUIObject2, PyColumns2, PyOutline2, PySelectableList2, PyTable2, PyDetailsPanel, PyDirectoryOutline, PyExtraFairwareReminder, PyPrioritizeDialog, PyPrioritizeList, - PyStatsLabel] + PyResultTable, PyStatsLabel] for class_ in allclasses: objp.o2p.generate_objc_code(class_, 'cocoa/autogen', inherit=True) - allclasses = [ColumnsView, OutlineView, SelectableListView, DetailsPanelView, DirectoryOutlineView, - ExtraFairwareReminderView, PrioritizeDialogView, PrioritizeListView, StatsLabelView] + allclasses = [ColumnsView, OutlineView, SelectableListView, TableView, DetailsPanelView, + DirectoryOutlineView, ExtraFairwareReminderView, PrioritizeDialogView, PrioritizeListView, + ResultTableView, StatsLabelView] for class_ in allclasses: clsspec = objp.o2p.spec_from_python_class(class_) clsname = class_.__name__ diff --git a/cocoa/base/PyResultTable.h b/cocoa/base/PyResultTable.h deleted file mode 100644 index 76abfc3b..00000000 --- a/cocoa/base/PyResultTable.h +++ /dev/null @@ -1,26 +0,0 @@ -/* -Copyright 2011 Hardcoded Software (http://www.hardcoded.net) - -This software is licensed under the "BSD" License as described in the "LICENSE" file, -which should be included with this package. The terms are also available at -http://www.hardcoded.net/licenses/bsd_license -*/ - -#import -#import "PyTable.h" - -@interface PyResultTable : PyTable -- (BOOL)powerMarkerMode; -- (void)setPowerMarkerMode:(BOOL)aPowerMarkerMode; -- (BOOL)deltaValuesMode; -- (void)setDeltaValuesMode:(BOOL)aDeltaValuesMode; -- (NSArray *)deltaColumns; - -- (NSString *)valueForRow:(NSInteger)rowIndex column:(NSString *)aColumn; -- (BOOL)renameSelected:(NSString *)aNewName; -- (void)sortBy:(NSString *)aIdentifier ascending:(BOOL)aAscending; -- (void)markSelected; -- (void)removeSelected; -- (NSInteger)selectedDupeCount; -- (NSString *)pathAtIndex:(NSInteger)index; -@end \ No newline at end of file diff --git a/cocoa/base/ResultTable.h b/cocoa/base/ResultTable.h index 9106dd00..e60b2da8 100644 --- a/cocoa/base/ResultTable.h +++ b/cocoa/base/ResultTable.h @@ -8,15 +8,15 @@ http://www.hardcoded.net/licenses/bsd_license #import #import -#import "HSTable.h" +#import "HSTable2.h" #import "PyResultTable.h" -@interface ResultTable : HSTable +@interface ResultTable : HSTable2 { NSSet *_deltaColumns; } -- (id)initWithPy:(id)aPy view:(NSTableView *)aTableView; -- (PyResultTable *)py; +- (id)initWithView:(NSTableView *)aTableView; +- (PyResultTable *)model; - (BOOL)powerMarkerMode; - (void)setPowerMarkerMode:(BOOL)aPowerMarkerMode; - (BOOL)deltaValuesMode; diff --git a/cocoa/base/ResultTable.m b/cocoa/base/ResultTable.m index 9bee8d13..d35531ee 100644 --- a/cocoa/base/ResultTable.m +++ b/cocoa/base/ResultTable.m @@ -12,30 +12,33 @@ http://www.hardcoded.net/licenses/bsd_license #import "Consts.h" #import "HSQuicklook.h" -@interface HSTable (private) +@interface HSTable2 (private) - (void)setPySelection; - (void)setViewSelection; @end @implementation ResultTable -- (id)initWithPy:(id)aPy view:(NSTableView *)aTableView +- (id)initWithView:(NSTableView *)aTableView; { - self = [super initWithPy:aPy view:aTableView]; - _deltaColumns = [[NSSet setWithArray:[[self py] deltaColumns]] retain]; - [self connect]; + PyResultTable *m = [[PyResultTable alloc] initWithModel:findHackishModel(@"result_table")]; + self = [super initWithModel:m tableView:aTableView]; + [m bindCallback:createCallback(@"ResultTableView", self)]; + [m release]; + _deltaColumns = [[NSSet setWithArray:[[self model] deltaColumns]] retain]; + [model connect]; return self; } - (void)dealloc { - [self disconnect]; + [model disconnect]; [_deltaColumns release]; [super dealloc]; } -- (PyResultTable *)py +- (PyResultTable *)model { - return (PyResultTable *)py; + return (PyResultTable *)model; } /* Private */ @@ -61,27 +64,27 @@ http://www.hardcoded.net/licenses/bsd_license /* Public */ - (BOOL)powerMarkerMode { - return [[self py] powerMarkerMode]; + return [[self model] powerMarkerMode]; } - (void)setPowerMarkerMode:(BOOL)aPowerMarkerMode { - [[self py] setPowerMarkerMode:aPowerMarkerMode]; + [[self model] setPowerMarkerMode:aPowerMarkerMode]; } - (BOOL)deltaValuesMode { - return [[self py] deltaValuesMode]; + return [[self model] deltaValuesMode]; } - (void)setDeltaValuesMode:(BOOL)aDeltaValuesMode { - [[self py] setDeltaValuesMode:aDeltaValuesMode]; + [[self model] setDeltaValuesMode:aDeltaValuesMode]; } - (NSInteger)selectedDupeCount { - return [[self py] selectedDupeCount]; + return [[self model] selectedDupeCount]; } - (void)removeSelected @@ -93,7 +96,7 @@ http://www.hardcoded.net/licenses/bsd_license NSString *msg = [NSString stringWithFormat:msgFmt,selectedDupeCount]; if ([Dialogs askYesNo:msg] == NSAlertSecondButtonReturn) // NO return; - [[self py] removeSelected]; + [[self model] removeSelected]; } /* Datasource */ @@ -101,27 +104,27 @@ http://www.hardcoded.net/licenses/bsd_license { NSString *identifier = [column identifier]; if ([identifier isEqual:@"marked"]) { - return [[self py] valueForColumn:@"marked" row:row]; + return [[self model] valueForColumn:@"marked" row:row]; } - return [[self py] valueForRow:row column:identifier]; + return [[self model] valueForRow:row column:identifier]; } - (void)tableView:(NSTableView *)aTableView setObjectValue:(id)object forTableColumn:(NSTableColumn *)column row:(NSInteger)row { NSString *identifier = [column identifier]; if ([identifier isEqual:@"marked"]) { - [[self py] setValue:object forColumn:identifier row:row]; + [[self model] setValue:object forColumn:identifier row:row]; } else if ([identifier isEqual:@"name"]) { - NSString *oldName = [[self py] valueForRow:row column:identifier]; + NSString *oldName = [[self model] valueForRow:row column:identifier]; NSString *newName = object; if (![newName isEqual:oldName]) { - BOOL renamed = [[self py] renameSelected:newName]; + BOOL renamed = [[self model] renameSelected:newName]; if (!renamed) { [Dialogs showMessage:[NSString stringWithFormat:TR(@"The name '%@' already exists."), newName]]; } else { - [tableView setNeedsDisplay:YES]; + [[self view] setNeedsDisplay:YES]; } } } @@ -130,16 +133,16 @@ http://www.hardcoded.net/licenses/bsd_license /* Delegate */ - (void)tableView:(NSTableView *)aTableView didClickTableColumn:(NSTableColumn *)tableColumn { - if ([[tableView sortDescriptors] count] < 1) + if ([[[self view] sortDescriptors] count] < 1) return; - NSSortDescriptor *sd = [[tableView sortDescriptors] objectAtIndex:0]; - [[self py] sortBy:[sd key] ascending:[sd ascending]]; + NSSortDescriptor *sd = [[[self view] sortDescriptors] objectAtIndex:0]; + [[self model] sortBy:[sd key] ascending:[sd ascending]]; } - (void)tableView:(NSTableView *)aTableView willDisplayCell:(id)cell forTableColumn:(NSTableColumn *)column row:(NSInteger)row { - BOOL isSelected = [tableView isRowSelected:row]; - BOOL isMarkable = n2b([[self py] valueForColumn:@"markable" row:row]); + BOOL isSelected = [[self view] isRowSelected:row]; + BOOL isMarkable = n2b([[self model] valueForColumn:@"markable" row:row]); if ([[column identifier] isEqual:@"marked"]) { [cell setEnabled:isMarkable]; // Low-tech solution, for indentation, but it works... @@ -173,21 +176,21 @@ http://www.hardcoded.net/licenses/bsd_license - (BOOL)tableViewHadSpacePressed:(NSTableView *)tableView { - [[self py] markSelected]; + [[self model] markSelected]; return YES; } /* Quicklook */ - (NSInteger)numberOfPreviewItemsInPreviewPanel:(QLPreviewPanel *)panel { - return [[[self py] selectedRows] count]; + return [[[self model] selectedRows] count]; } - (id )previewPanel:(QLPreviewPanel *)panel previewItemAtIndex:(NSInteger)index { - NSArray *selectedRows = [[self py] selectedRows]; + NSArray *selectedRows = [[self model] selectedRows]; NSInteger absIndex = n2i([selectedRows objectAtIndex:index]); - NSString *path = [[self py] pathAtIndex:absIndex]; + NSString *path = [[self model] pathAtIndex:absIndex]; return [[HSQLPreviewItem alloc] initWithUrl:[NSURL fileURLWithPath:path] title:path]; } @@ -204,6 +207,6 @@ http://www.hardcoded.net/licenses/bsd_license /* Python --> Cocoa */ - (void)invalidateMarkings { - [tableView setNeedsDisplay:YES]; + [[self view] setNeedsDisplay:YES]; } @end \ No newline at end of file diff --git a/cocoa/base/ResultWindow.m b/cocoa/base/ResultWindow.m index 5d44e71b..712a095d 100644 --- a/cocoa/base/ResultWindow.m +++ b/cocoa/base/ResultWindow.m @@ -24,7 +24,7 @@ http://www.hardcoded.net/licenses/bsd_license columnsMenu = [app columnsMenu]; /* Put a cute iTunes-like bottom bar */ [[self window] setContentBorderThickness:28 forEdge:NSMinYEdge]; - table = [[ResultTable alloc] initWithPy:[py resultTable] view:matches]; + table = [[ResultTable alloc] initWithView:matches]; statsLabel = [[StatsLabel alloc] initWithLabelView:stats]; problemDialog = [[ProblemDialog alloc] initWithPy:py]; [self initResultColumns]; @@ -58,7 +58,7 @@ http://www.hardcoded.net/licenses/bsd_license /* Helpers */ - (void)fillColumnsMenu { - NSArray *menuItems = [[[table columns] py] menuItems]; + NSArray *menuItems = [[[table columns] model] menuItems]; for (NSInteger i=0; i < [menuItems count]; i++) { NSArray *pair = [menuItems objectAtIndex:i]; NSString *display = [pair objectAtIndex:0]; @@ -283,7 +283,7 @@ http://www.hardcoded.net/licenses/bsd_license - (IBAction)resetColumnsToDefault:(id)sender { - [[[table columns] py] resetToDefaults]; + [[[table columns] model] resetToDefaults]; } - (IBAction)revealSelected:(id)sender @@ -321,7 +321,7 @@ http://www.hardcoded.net/licenses/bsd_license - (IBAction)toggleColumn:(id)sender { NSMenuItem *mi = sender; - BOOL checked = [[[table columns] py] toggleMenuItem:[mi tag]]; + BOOL checked = [[[table columns] model] toggleMenuItem:[mi tag]]; [mi setState:checked ? NSOnState : NSOffState]; } @@ -406,7 +406,7 @@ http://www.hardcoded.net/licenses/bsd_license } } else if ([lastAction isEqualTo:jobScan]) { - NSInteger rowCount = [[table py] numberOfRows]; + NSInteger rowCount = [[table model] numberOfRows]; if (rowCount == 0) { [Dialogs showMessage:TR(@"No duplicates found.")]; } diff --git a/cocoa/inter/result_table.py b/cocoa/inter/result_table.py index ece69101..5ae424a9 100644 --- a/cocoa/inter/result_table.py +++ b/cocoa/inter/result_table.py @@ -1,53 +1,49 @@ -from cocoa.inter import signature, PyTable +from objp.util import dontwrap +from cocoa.inter2 import PyTable2, TableView -class PyResultTable(PyTable): - @signature('c@:') - def powerMarkerMode(self): - return self.py.power_marker +class ResultTableView(TableView): + def invalidateMarkings(self): pass + +class PyResultTable(PyTable2): + def powerMarkerMode(self) -> bool: + return self.model.power_marker - @signature('v@:c') - def setPowerMarkerMode_(self, value): - self.py.power_marker = value + def setPowerMarkerMode_(self, value: bool): + self.model.power_marker = value - @signature('c@:') - def deltaValuesMode(self): - return self.py.delta_values + def deltaValuesMode(self) -> bool: + return self.model.delta_values - @signature('v@:c') - def setDeltaValuesMode_(self, value): - self.py.delta_values = value + def setDeltaValuesMode_(self, value: bool): + self.model.delta_values = value - def deltaColumns(self): - return list(self.py.DELTA_COLUMNS) + def deltaColumns(self) -> list: + return list(self.model.DELTA_COLUMNS) - @signature('@@:i@') - def valueForRow_column_(self, row_index, column): - return self.py.get_row_value(row_index, column) + def valueForRow_column_(self, row_index: int, column: str) -> object: + return self.model.get_row_value(row_index, column) - @signature('c@:@') - def renameSelected_(self, newname): - return self.py.rename_selected(newname) + def renameSelected_(self, newname: str) -> bool: + return self.model.rename_selected(newname) - @signature('v@:@c') - def sortBy_ascending_(self, key, asc): - self.py.sort(key, asc) + def sortBy_ascending_(self, key: str, asc: bool): + self.model.sort(key, asc) def markSelected(self): - self.py.app.toggle_selected_mark_state() + self.model.app.toggle_selected_mark_state() def removeSelected(self): - self.py.app.remove_selected() + self.model.app.remove_selected() - @signature('i@:') - def selectedDupeCount(self): - return self.py.selected_dupe_count + def selectedDupeCount(self) -> int: + return self.model.selected_dupe_count - @signature('@@:i') - def pathAtIndex_(self, index): - row = self.py[index] + def pathAtIndex_(self, index: int) -> str: + row = self.model[index] return str(row._dupe.path) # python --> cocoa + @dontwrap def invalidate_markings(self): - self.cocoa.invalidateMarkings() + self.callback.invalidateMarkings() \ No newline at end of file diff --git a/cocoa/se/dg_cocoa.py b/cocoa/se/dg_cocoa.py index 0985dbf8..38c046a1 100644 --- a/cocoa/se/dg_cocoa.py +++ b/cocoa/se/dg_cocoa.py @@ -8,7 +8,7 @@ from hscommon.trans import install_gettext_trans_under_cocoa install_gettext_trans_under_cocoa() from cocoa.inter import signature -from cocoa.inter2 import PySelectableList2 +from cocoa.inter2 import PySelectableList2, PyColumns2 from core.scanner import ScanType diff --git a/cocoa/se/dupeguru.xcodeproj/project.pbxproj b/cocoa/se/dupeguru.xcodeproj/project.pbxproj index 3d633d17..9733e232 100644 --- a/cocoa/se/dupeguru.xcodeproj/project.pbxproj +++ b/cocoa/se/dupeguru.xcodeproj/project.pbxproj @@ -65,6 +65,10 @@ CE9777D1141F8CB400C13FB5 /* PrioritizeDialog.xib in Resources */ = {isa = PBXBuildFile; fileRef = CE9777CF141F8CB400C13FB5 /* PrioritizeDialog.xib */; }; CE9D842A14BE2AE900184165 /* PyExtraFairwareReminder.m in Sources */ = {isa = PBXBuildFile; fileRef = CE9D842914BE2AE900184165 /* PyExtraFairwareReminder.m */; }; CE9FC22D14C080CF005C31FD /* PyGUIObject2.m in Sources */ = {isa = PBXBuildFile; fileRef = CE9FC22C14C080CF005C31FD /* PyGUIObject2.m */; }; + CE9FC23014C08622005C31FD /* PyTable2.m in Sources */ = {isa = PBXBuildFile; fileRef = CE9FC22F14C08622005C31FD /* PyTable2.m */; }; + CE9FC23314C0866F005C31FD /* PyResultTable.m in Sources */ = {isa = PBXBuildFile; fileRef = CE9FC23214C0866F005C31FD /* PyResultTable.m */; }; + CE9FC23614C08A7E005C31FD /* HSTable2.m in Sources */ = {isa = PBXBuildFile; fileRef = CE9FC23514C08A7E005C31FD /* HSTable2.m */; }; + CE9FC23914C08A92005C31FD /* HSGUIController2.m in Sources */ = {isa = PBXBuildFile; fileRef = CE9FC23814C08A92005C31FD /* HSGUIController2.m */; }; CEA175CA1461E8E600776591 /* locale in Resources */ = {isa = PBXBuildFile; fileRef = CEA175C91461E8E600776591 /* locale */; }; CEA450B814BDDFD7002DAAF2 /* dg_cocoa.py in Resources */ = {isa = PBXBuildFile; fileRef = CEA450B714BDDFD7002DAAF2 /* dg_cocoa.py */; }; CEBE4D74111F0EE1009AAC6D /* HSWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = CEBE4D73111F0EE1009AAC6D /* HSWindowController.m */; }; @@ -189,7 +193,6 @@ CE665B2E13225ADD003F5CFB /* ExtraFairwareReminder.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = ExtraFairwareReminder.m; path = ../base/ExtraFairwareReminder.m; sourceTree = SOURCE_ROOT; }; CE665B3213225AF8003F5CFB /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = ../base/en.lproj/ExtraFairwareReminder.xib; sourceTree = SOURCE_ROOT; }; CE665B3413225B07003F5CFB /* fr */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = fr; path = ../base/fr.lproj/ExtraFairwareReminder.xib; sourceTree = SOURCE_ROOT; }; - CE6DD4E4124CA3070089A48D /* PyResultTable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PyResultTable.h; path = ../base/PyResultTable.h; sourceTree = SOURCE_ROOT; }; CE6DD4E5124CA3070089A48D /* ResultTable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ResultTable.h; path = ../base/ResultTable.h; sourceTree = SOURCE_ROOT; }; CE6DD4E6124CA3070089A48D /* ResultTable.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = ResultTable.m; path = ../base/ResultTable.m; sourceTree = SOURCE_ROOT; }; CE6DD545124CAF1F0089A48D /* HSTableView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = HSTableView.h; path = ../../cocoalib/views/HSTableView.h; sourceTree = SOURCE_ROOT; }; @@ -251,6 +254,14 @@ CE9D842914BE2AE900184165 /* PyExtraFairwareReminder.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PyExtraFairwareReminder.m; sourceTree = ""; }; CE9FC22B14C080CF005C31FD /* PyGUIObject2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PyGUIObject2.h; sourceTree = ""; }; CE9FC22C14C080CF005C31FD /* PyGUIObject2.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PyGUIObject2.m; sourceTree = ""; }; + CE9FC22E14C08622005C31FD /* PyTable2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PyTable2.h; sourceTree = ""; }; + CE9FC22F14C08622005C31FD /* PyTable2.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PyTable2.m; sourceTree = ""; }; + CE9FC23114C0866F005C31FD /* PyResultTable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PyResultTable.h; sourceTree = ""; }; + CE9FC23214C0866F005C31FD /* PyResultTable.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PyResultTable.m; sourceTree = ""; }; + CE9FC23414C08A73005C31FD /* HSTable2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HSTable2.h; sourceTree = ""; }; + CE9FC23514C08A7E005C31FD /* HSTable2.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HSTable2.m; sourceTree = ""; }; + CE9FC23714C08A92005C31FD /* HSGUIController2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HSGUIController2.h; sourceTree = ""; }; + CE9FC23814C08A92005C31FD /* HSGUIController2.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HSGUIController2.m; sourceTree = ""; }; CEA175C91461E8E600776591 /* locale */ = {isa = PBXFileReference; lastKnownFileType = folder; name = locale; path = ../../build/locale; sourceTree = ""; }; CEA450B714BDDFD7002DAAF2 /* dg_cocoa.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; name = dg_cocoa.py; path = ../../build/dg_cocoa.py; sourceTree = ""; }; CEB57990146ADC5100EDF7D7 /* HSConsts.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = HSConsts.h; path = ../../cocoalib/HSConsts.h; sourceTree = ""; }; @@ -417,24 +428,28 @@ children = ( CE9FC22B14C080CF005C31FD /* PyGUIObject2.h */, CE9FC22C14C080CF005C31FD /* PyGUIObject2.m */, + CE275C5814BF71DF00265960 /* PyColumns2.h */, + CE275C5914BF71DF00265960 /* PyColumns2.m */, CE587E9714C07BCF004CA031 /* PyOutline2.h */, CE587E9814C07BCF004CA031 /* PyOutline2.m */, CE587E9C14C0801F004CA031 /* PySelectableList2.h */, CE587E9D14C0801F004CA031 /* PySelectableList2.m */, + CE9FC22E14C08622005C31FD /* PyTable2.h */, + CE9FC22F14C08622005C31FD /* PyTable2.m */, CE3A3B4714BF19B8007898AB /* PyDetailsPanel.h */, CE3A3B4814BF19B8007898AB /* PyDetailsPanel.m */, CE9D842814BE2AE900184165 /* PyExtraFairwareReminder.h */, CE9D842914BE2AE900184165 /* PyExtraFairwareReminder.m */, - CE1D091614BE0C6400CA6B8C /* PyStatsLabel.h */, - CE1D091714BE0C6400CA6B8C /* PyStatsLabel.m */, - CE275C5814BF71DF00265960 /* PyColumns2.h */, - CE275C5914BF71DF00265960 /* PyColumns2.m */, CE275C5414BF712B00265960 /* PyDirectoryOutline.h */, CE275C5514BF712B00265960 /* PyDirectoryOutline.m */, CE548CC214BF903D00D180CB /* PyPrioritizeDialog.h */, CE548CC314BF903D00D180CB /* PyPrioritizeDialog.m */, CE548CC414BF903D00D180CB /* PyPrioritizeList.h */, CE548CC514BF903D00D180CB /* PyPrioritizeList.m */, + CE9FC23114C0866F005C31FD /* PyResultTable.h */, + CE9FC23214C0866F005C31FD /* PyResultTable.m */, + CE1D091614BE0C6400CA6B8C /* PyStatsLabel.h */, + CE1D091714BE0C6400CA6B8C /* PyStatsLabel.m */, CE1D091414BE0C6400CA6B8C /* ObjP.h */, CE1D091514BE0C6400CA6B8C /* ObjP.m */, ); @@ -471,8 +486,12 @@ CE275C4F14BF6C5600265960 /* HSOutline2.m */, CE76FDC8111EE38E006618EA /* HSGUIController.h */, CE76FDC9111EE38E006618EA /* HSGUIController.m */, + CE9FC23714C08A92005C31FD /* HSGUIController2.h */, + CE9FC23814C08A92005C31FD /* HSGUIController2.m */, CE41672C141FE1E5004F3F0B /* HSTable.h */, CE8C53BB117324CE0011B41F /* HSTable.m */, + CE9FC23414C08A73005C31FD /* HSTable2.h */, + CE9FC23514C08A7E005C31FD /* HSTable2.m */, CE548CBC14BF902000D180CB /* HSPopUpList2.h */, CE548CBD14BF902000D180CB /* HSPopUpList2.m */, CE548CBE14BF902000D180CB /* HSSelectableList2.h */, @@ -554,7 +573,6 @@ isa = PBXGroup; children = ( CE1D091314BE0C6400CA6B8C /* autogen */, - CE6DD4E4124CA3070089A48D /* PyResultTable.h */, CE6DD4E5124CA3070089A48D /* ResultTable.h */, CE6DD4E6124CA3070089A48D /* ResultTable.m */, CE91F213113BC22D0010360B /* StatsLabel.h */, @@ -723,6 +741,10 @@ CE587E9A14C07BCF004CA031 /* PyOutline2.m in Sources */, CE587E9E14C0801F004CA031 /* PySelectableList2.m in Sources */, CE9FC22D14C080CF005C31FD /* PyGUIObject2.m in Sources */, + CE9FC23014C08622005C31FD /* PyTable2.m in Sources */, + CE9FC23314C0866F005C31FD /* PyResultTable.m in Sources */, + CE9FC23614C08A7E005C31FD /* HSTable2.m in Sources */, + CE9FC23914C08A92005C31FD /* HSGUIController2.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; From 937ea73c87db7c7d5f7ce62a587010163a91c1e4 Mon Sep 17 00:00:00 2001 From: Virgil Dupras Date: Fri, 13 Jan 2012 12:19:23 -0500 Subject: [PATCH 13/26] Converted ProblemDialog to objp. --HG-- branch : objp --- build.py | 13 ++--- cocoa/base/ProblemDialog.h | 12 ++--- cocoa/base/ProblemDialog.m | 23 ++++----- cocoa/base/PyProblemDialog.h | 14 ------ cocoa/base/ResultWindow.m | 2 +- cocoa/inter/problem_dialog.py | 13 +++-- cocoa/inter/problem_table.py | 6 --- cocoa/se/dg_cocoa.py | 3 +- cocoa/se/dupeguru.xcodeproj/project.pbxproj | 54 ++++++++------------- core/app.py | 2 + core/gui/problem_dialog.py | 2 + 11 files changed, 53 insertions(+), 91 deletions(-) delete mode 100644 cocoa/base/PyProblemDialog.h delete mode 100644 cocoa/inter/problem_table.py diff --git a/build.py b/build.py index b30d916d..ee4f00a3 100644 --- a/build.py +++ b/build.py @@ -179,23 +179,24 @@ def build_cocoa_bridging_interfaces(): import objp.p2o add_to_pythonpath('cocoa') add_to_pythonpath('cocoalib') - from cocoa.inter2 import (PyGUIObject2, PyColumns2, ColumnsView, PyOutline2, OutlineView, - PySelectableList2, SelectableListView, PyTable2, TableView) + from cocoa.inter2 import (PyGUIObject2, GUIObjectView, PyColumns2, ColumnsView, PyOutline2, + OutlineView, PySelectableList2, SelectableListView, PyTable2, TableView) from inter.details_panel import PyDetailsPanel, DetailsPanelView from inter.directory_outline import PyDirectoryOutline, DirectoryOutlineView from inter.extra_fairware_reminder import PyExtraFairwareReminder, ExtraFairwareReminderView from inter.prioritize_dialog import PyPrioritizeDialog, PrioritizeDialogView from inter.prioritize_list import PyPrioritizeList, PrioritizeListView + from inter.problem_dialog import PyProblemDialog from inter.result_table import PyResultTable, ResultTableView from inter.stats_label import PyStatsLabel, StatsLabelView allclasses = [PyGUIObject2, PyColumns2, PyOutline2, PySelectableList2, PyTable2, PyDetailsPanel, PyDirectoryOutline, PyExtraFairwareReminder, PyPrioritizeDialog, PyPrioritizeList, - PyResultTable, PyStatsLabel] + PyProblemDialog, PyResultTable, PyStatsLabel] for class_ in allclasses: objp.o2p.generate_objc_code(class_, 'cocoa/autogen', inherit=True) - allclasses = [ColumnsView, OutlineView, SelectableListView, TableView, DetailsPanelView, - DirectoryOutlineView, ExtraFairwareReminderView, PrioritizeDialogView, PrioritizeListView, - ResultTableView, StatsLabelView] + allclasses = [GUIObjectView, ColumnsView, OutlineView, SelectableListView, TableView, + DetailsPanelView, DirectoryOutlineView, ExtraFairwareReminderView, PrioritizeDialogView, + PrioritizeListView, ResultTableView, StatsLabelView] for class_ in allclasses: clsspec = objp.o2p.spec_from_python_class(class_) clsname = class_.__name__ diff --git a/cocoa/base/ProblemDialog.h b/cocoa/base/ProblemDialog.h index c558dbeb..7ca11712 100644 --- a/cocoa/base/ProblemDialog.h +++ b/cocoa/base/ProblemDialog.h @@ -7,19 +7,17 @@ http://www.hardcoded.net/licenses/bsd_license */ #import -#import "HSWindowController.h" -#import "PyApp.h" #import "PyProblemDialog.h" -#import "HSTable.h" +#import "HSTable2.h" -@interface ProblemDialog : HSWindowController +@interface ProblemDialog : NSWindowController { IBOutlet NSTableView *problemTableView; - HSTable *problemTable; + PyProblemDialog *model; + HSTable2 *problemTable; } -- (id)initWithPy:(PyApp *)aPy; -- (PyProblemDialog *)py; +- (id)init; - (void)initializeColumns; - (IBAction)revealSelected:(id)sender; diff --git a/cocoa/base/ProblemDialog.m b/cocoa/base/ProblemDialog.m index e66c30d9..2cd79e62 100644 --- a/cocoa/base/ProblemDialog.m +++ b/cocoa/base/ProblemDialog.m @@ -10,30 +10,27 @@ http://www.hardcoded.net/licenses/bsd_license #import "Utils.h" @implementation ProblemDialog -- (id)initWithPy:(PyApp *)aPy +- (id)init { - self = [super initWithNibName:@"ProblemDialog" pyClassName:@"PyProblemDialog" pyParent:aPy]; + self = [super initWithWindowNibName:@"ProblemDialog"]; [self window]; //So the detailsTable is initialized. - problemTable = [[HSTable alloc] initWithPyClassName:@"PyProblemTable" pyParent:[self py] view:problemTableView]; + model = [[PyProblemDialog alloc] initWithModel:findHackishModel(@"problem_dialog")]; + problemTable = [[HSTable2 alloc] initWithPyRef:[model problemTable] tableView:problemTableView]; [self initializeColumns]; - [self connect]; - [problemTable connect]; + [model connect]; + [[problemTable model] connect]; return self; } - (void)dealloc { - [problemTable disconnect]; - [self disconnect]; + [[problemTable model] disconnect]; + [model disconnect]; [problemTable release]; + [model release]; [super dealloc]; } -- (PyProblemDialog *)py -{ - return (PyProblemDialog *)py; -} - - (void)initializeColumns { HSColumnDef defs[] = { @@ -46,6 +43,6 @@ http://www.hardcoded.net/licenses/bsd_license - (IBAction)revealSelected:(id)sender { - [[self py] revealSelected]; + [model revealSelected]; } @end \ No newline at end of file diff --git a/cocoa/base/PyProblemDialog.h b/cocoa/base/PyProblemDialog.h deleted file mode 100644 index 4077adbc..00000000 --- a/cocoa/base/PyProblemDialog.h +++ /dev/null @@ -1,14 +0,0 @@ -/* -Copyright 2011 Hardcoded Software (http://www.hardcoded.net) - -This software is licensed under the "BSD" License as described in the "LICENSE" file, -which should be included with this package. The terms are also available at -http://www.hardcoded.net/licenses/bsd_license -*/ - -#import -#import "PyGUI.h" - -@interface PyProblemDialog : PyGUI -- (void)revealSelected; -@end \ No newline at end of file diff --git a/cocoa/base/ResultWindow.m b/cocoa/base/ResultWindow.m index 712a095d..b934ab6d 100644 --- a/cocoa/base/ResultWindow.m +++ b/cocoa/base/ResultWindow.m @@ -26,7 +26,7 @@ http://www.hardcoded.net/licenses/bsd_license [[self window] setContentBorderThickness:28 forEdge:NSMinYEdge]; table = [[ResultTable alloc] initWithView:matches]; statsLabel = [[StatsLabel alloc] initWithLabelView:stats]; - problemDialog = [[ProblemDialog alloc] initWithPy:py]; + problemDialog = [[ProblemDialog alloc] init]; [self initResultColumns]; [self fillColumnsMenu]; [matches setTarget:self]; diff --git a/cocoa/inter/problem_dialog.py b/cocoa/inter/problem_dialog.py index 5eb62364..7d9374ad 100644 --- a/cocoa/inter/problem_dialog.py +++ b/cocoa/inter/problem_dialog.py @@ -1,10 +1,9 @@ -from cocoa.inter import PyGUIObject +from objp.util import pyref +from cocoa.inter2 import PyGUIObject2 -from core.gui.problem_dialog import ProblemDialog - -class PyProblemDialog(PyGUIObject): - py_class = ProblemDialog +class PyProblemDialog(PyGUIObject2): + def problemTable(self) -> pyref: + return self.model.problem_table def revealSelected(self): - self.py.reveal_selected_dupe() - \ No newline at end of file + self.model.reveal_selected_dupe() diff --git a/cocoa/inter/problem_table.py b/cocoa/inter/problem_table.py deleted file mode 100644 index 965e1a75..00000000 --- a/cocoa/inter/problem_table.py +++ /dev/null @@ -1,6 +0,0 @@ -from cocoa.inter import PyTable - -from core.gui.problem_table import ProblemTable - -class PyProblemTable(PyTable): - py_class = ProblemTable \ No newline at end of file diff --git a/cocoa/se/dg_cocoa.py b/cocoa/se/dg_cocoa.py index 38c046a1..dfb8dd63 100644 --- a/cocoa/se/dg_cocoa.py +++ b/cocoa/se/dg_cocoa.py @@ -8,7 +8,7 @@ from hscommon.trans import install_gettext_trans_under_cocoa install_gettext_trans_under_cocoa() from cocoa.inter import signature -from cocoa.inter2 import PySelectableList2, PyColumns2 +from cocoa.inter2 import PySelectableList2, PyColumns2, PyTable2 from core.scanner import ScanType @@ -19,7 +19,6 @@ from inter.extra_fairware_reminder import PyExtraFairwareReminder from inter.prioritize_dialog import PyPrioritizeDialog from inter.prioritize_list import PyPrioritizeList from inter.problem_dialog import PyProblemDialog -from inter.problem_table import PyProblemTable from inter.result_table import PyResultTable from inter.stats_label import PyStatsLabel from inter.app_se import DupeGuru diff --git a/cocoa/se/dupeguru.xcodeproj/project.pbxproj b/cocoa/se/dupeguru.xcodeproj/project.pbxproj index 9733e232..5e1d6710 100644 --- a/cocoa/se/dupeguru.xcodeproj/project.pbxproj +++ b/cocoa/se/dupeguru.xcodeproj/project.pbxproj @@ -28,13 +28,13 @@ CE3A3B4914BF19B8007898AB /* PyDetailsPanel.m in Sources */ = {isa = PBXBuildFile; fileRef = CE3A3B4814BF19B8007898AB /* PyDetailsPanel.m */; }; CE45579B0AE3BC2B005A9546 /* Sparkle.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CE45579A0AE3BC2B005A9546 /* Sparkle.framework */; }; CE4557B40AE3BC50005A9546 /* Sparkle.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = CE45579A0AE3BC2B005A9546 /* Sparkle.framework */; }; + CE4746D314C09C12001A66DE /* PyProblemDialog.m in Sources */ = {isa = PBXBuildFile; fileRef = CE4746D214C09C12001A66DE /* PyProblemDialog.m */; }; CE5335FC142BBFAF008E5374 /* HSQuicklook.m in Sources */ = {isa = PBXBuildFile; fileRef = CE5335FB142BBFAF008E5374 /* HSQuicklook.m */; }; CE533603142BC034008E5374 /* Quartz.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CE533602142BC034008E5374 /* Quartz.framework */; }; CE548CC014BF902000D180CB /* HSPopUpList2.m in Sources */ = {isa = PBXBuildFile; fileRef = CE548CBD14BF902000D180CB /* HSPopUpList2.m */; }; CE548CC114BF902000D180CB /* HSSelectableList2.m in Sources */ = {isa = PBXBuildFile; fileRef = CE548CBF14BF902000D180CB /* HSSelectableList2.m */; }; CE548CC614BF903D00D180CB /* PyPrioritizeDialog.m in Sources */ = {isa = PBXBuildFile; fileRef = CE548CC314BF903D00D180CB /* PyPrioritizeDialog.m */; }; CE548CC714BF903D00D180CB /* PyPrioritizeList.m in Sources */ = {isa = PBXBuildFile; fileRef = CE548CC514BF903D00D180CB /* PyPrioritizeList.m */; }; - CE54A87E148046F9008EEA77 /* HSColumns.m in Sources */ = {isa = PBXBuildFile; fileRef = CE54A87D148046F9008EEA77 /* HSColumns.m */; }; CE587E9A14C07BCF004CA031 /* PyOutline2.m in Sources */ = {isa = PBXBuildFile; fileRef = CE587E9814C07BCF004CA031 /* PyOutline2.m */; }; CE587E9E14C0801F004CA031 /* PySelectableList2.m in Sources */ = {isa = PBXBuildFile; fileRef = CE587E9D14C0801F004CA031 /* PySelectableList2.m */; }; CE647E571173024A006D28BA /* ProblemDialog.m in Sources */ = {isa = PBXBuildFile; fileRef = CE647E551173024A006D28BA /* ProblemDialog.m */; }; @@ -46,7 +46,6 @@ CE76FDC4111EE37C006618EA /* HSOutlineView.m in Sources */ = {isa = PBXBuildFile; fileRef = CE76FDBF111EE37C006618EA /* HSOutlineView.m */; }; CE76FDC5111EE37C006618EA /* NSIndexPathAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = CE76FDC1111EE37C006618EA /* NSIndexPathAdditions.m */; }; CE76FDC6111EE37C006618EA /* NSTableViewAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = CE76FDC3111EE37C006618EA /* NSTableViewAdditions.m */; }; - CE76FDCF111EE38E006618EA /* HSGUIController.m in Sources */ = {isa = PBXBuildFile; fileRef = CE76FDC9111EE38E006618EA /* HSGUIController.m */; }; CE76FDD4111EE3A7006618EA /* DirectoryOutline.m in Sources */ = {isa = PBXBuildFile; fileRef = CE76FDD2111EE3A7006618EA /* DirectoryOutline.m */; }; CE76FDF7111EE561006618EA /* NSEventAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = CE76FDF6111EE561006618EA /* NSEventAdditions.m */; }; CE79638612536C94008D405B /* FairwareReminder.xib in Resources */ = {isa = PBXBuildFile; fileRef = CE79638412536C94008D405B /* FairwareReminder.xib */; }; @@ -59,7 +58,6 @@ CE81135812E5CE6D00A36C80 /* Preferences.xib in Resources */ = {isa = PBXBuildFile; fileRef = CE81135612E5CE6D00A36C80 /* Preferences.xib */; }; CE8113EB12E5CE9A00A36C80 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = CE8113E912E5CE9A00A36C80 /* Localizable.strings */; }; CE89240A14239CC30024CE4E /* PrioritizeList.m in Sources */ = {isa = PBXBuildFile; fileRef = CE89240714239CC30024CE4E /* PrioritizeList.m */; }; - CE8C53BC117324CE0011B41F /* HSTable.m in Sources */ = {isa = PBXBuildFile; fileRef = CE8C53BB117324CE0011B41F /* HSTable.m */; }; CE91F216113BC22D0010360B /* StatsLabel.m in Sources */ = {isa = PBXBuildFile; fileRef = CE91F214113BC22D0010360B /* StatsLabel.m */; }; CE9777CD141F8C2500C13FB5 /* PrioritizeDialog.m in Sources */ = {isa = PBXBuildFile; fileRef = CE9777CC141F8C2500C13FB5 /* PrioritizeDialog.m */; }; CE9777D1141F8CB400C13FB5 /* PrioritizeDialog.xib in Resources */ = {isa = PBXBuildFile; fileRef = CE9777CF141F8CB400C13FB5 /* PrioritizeDialog.xib */; }; @@ -71,7 +69,6 @@ CE9FC23914C08A92005C31FD /* HSGUIController2.m in Sources */ = {isa = PBXBuildFile; fileRef = CE9FC23814C08A92005C31FD /* HSGUIController2.m */; }; CEA175CA1461E8E600776591 /* locale in Resources */ = {isa = PBXBuildFile; fileRef = CEA175C91461E8E600776591 /* locale */; }; CEA450B814BDDFD7002DAAF2 /* dg_cocoa.py in Resources */ = {isa = PBXBuildFile; fileRef = CEA450B714BDDFD7002DAAF2 /* dg_cocoa.py */; }; - CEBE4D74111F0EE1009AAC6D /* HSWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = CEBE4D73111F0EE1009AAC6D /* HSWindowController.m */; }; CEE7EA130FE675C80004E467 /* DetailsPanel.m in Sources */ = {isa = PBXBuildFile; fileRef = CEE7EA120FE675C80004E467 /* DetailsPanel.m */; }; CEEB135209C837A2004D2330 /* dupeguru.icns in Resources */ = {isa = PBXBuildFile; fileRef = CEEB135109C837A2004D2330 /* dupeguru.icns */; }; CEF0ACCE12DF3C2000B32F7E /* HSRecentFiles.m in Sources */ = {isa = PBXBuildFile; fileRef = CEF0ACCD12DF3C2000B32F7E /* HSRecentFiles.m */; }; @@ -151,7 +148,6 @@ CE275C5514BF712B00265960 /* PyDirectoryOutline.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PyDirectoryOutline.m; sourceTree = ""; }; CE275C5814BF71DF00265960 /* PyColumns2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PyColumns2.h; sourceTree = ""; }; CE275C5914BF71DF00265960 /* PyColumns2.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PyColumns2.m; sourceTree = ""; }; - CE275C5B14BF71FE00265960 /* PyColumns.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PyColumns.h; sourceTree = ""; }; CE27D3C212CCA43800859E67 /* HSAboutBox.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = HSAboutBox.h; path = ../../cocoalib/HSAboutBox.h; sourceTree = SOURCE_ROOT; }; CE27D3C312CCA43800859E67 /* HSAboutBox.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = HSAboutBox.m; path = ../../cocoalib/HSAboutBox.m; sourceTree = SOURCE_ROOT; }; CE31819A13D85D9B00B6D649 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = ../en.lproj/about.xib; sourceTree = ""; }; @@ -167,8 +163,9 @@ CE381C9B09914ADF003581CE /* ResultWindow.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = ResultWindow.h; sourceTree = SOURCE_ROOT; }; CE3A3B4714BF19B8007898AB /* PyDetailsPanel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PyDetailsPanel.h; sourceTree = ""; }; CE3A3B4814BF19B8007898AB /* PyDetailsPanel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PyDetailsPanel.m; sourceTree = ""; }; - CE41672C141FE1E5004F3F0B /* HSTable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HSTable.h; sourceTree = ""; }; CE45579A0AE3BC2B005A9546 /* Sparkle.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Sparkle.framework; path = /Library/Frameworks/Sparkle.framework; sourceTree = ""; }; + CE4746D114C09C12001A66DE /* PyProblemDialog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PyProblemDialog.h; sourceTree = ""; }; + CE4746D214C09C12001A66DE /* PyProblemDialog.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PyProblemDialog.m; sourceTree = ""; }; CE5335FA142BBFAF008E5374 /* HSQuicklook.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = HSQuicklook.h; path = ../../cocoalib/HSQuicklook.h; sourceTree = ""; }; CE5335FB142BBFAF008E5374 /* HSQuicklook.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = HSQuicklook.m; path = ../../cocoalib/HSQuicklook.m; sourceTree = ""; }; CE533602142BC034008E5374 /* Quartz.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Quartz.framework; path = System/Library/Frameworks/Quartz.framework; sourceTree = SDKROOT; }; @@ -180,15 +177,12 @@ CE548CC314BF903D00D180CB /* PyPrioritizeDialog.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PyPrioritizeDialog.m; sourceTree = ""; }; CE548CC414BF903D00D180CB /* PyPrioritizeList.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PyPrioritizeList.h; sourceTree = ""; }; CE548CC514BF903D00D180CB /* PyPrioritizeList.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PyPrioritizeList.m; sourceTree = ""; }; - CE54A87C148046F9008EEA77 /* HSColumns.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HSColumns.h; sourceTree = ""; }; - CE54A87D148046F9008EEA77 /* HSColumns.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HSColumns.m; sourceTree = ""; }; CE587E9714C07BCF004CA031 /* PyOutline2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PyOutline2.h; sourceTree = ""; }; CE587E9814C07BCF004CA031 /* PyOutline2.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PyOutline2.m; sourceTree = ""; }; CE587E9C14C0801F004CA031 /* PySelectableList2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PySelectableList2.h; sourceTree = ""; }; CE587E9D14C0801F004CA031 /* PySelectableList2.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PySelectableList2.m; sourceTree = ""; }; CE647E541173024A006D28BA /* ProblemDialog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ProblemDialog.h; path = ../base/ProblemDialog.h; sourceTree = SOURCE_ROOT; }; CE647E551173024A006D28BA /* ProblemDialog.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = ProblemDialog.m; path = ../base/ProblemDialog.m; sourceTree = SOURCE_ROOT; }; - CE647E561173024A006D28BA /* PyProblemDialog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PyProblemDialog.h; path = ../base/PyProblemDialog.h; sourceTree = SOURCE_ROOT; }; CE665B2D13225ADD003F5CFB /* ExtraFairwareReminder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ExtraFairwareReminder.h; path = ../base/ExtraFairwareReminder.h; sourceTree = SOURCE_ROOT; }; CE665B2E13225ADD003F5CFB /* ExtraFairwareReminder.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = ExtraFairwareReminder.m; path = ../base/ExtraFairwareReminder.m; sourceTree = SOURCE_ROOT; }; CE665B3213225AF8003F5CFB /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = ../base/en.lproj/ExtraFairwareReminder.xib; sourceTree = SOURCE_ROOT; }; @@ -204,9 +198,6 @@ CE76FDC1111EE37C006618EA /* NSIndexPathAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSIndexPathAdditions.m; sourceTree = ""; }; CE76FDC2111EE37C006618EA /* NSTableViewAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSTableViewAdditions.h; sourceTree = ""; }; CE76FDC3111EE37C006618EA /* NSTableViewAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSTableViewAdditions.m; sourceTree = ""; }; - CE76FDC8111EE38E006618EA /* HSGUIController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HSGUIController.h; sourceTree = ""; }; - CE76FDC9111EE38E006618EA /* HSGUIController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HSGUIController.m; sourceTree = ""; }; - CE76FDCD111EE38E006618EA /* PyGUI.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PyGUI.h; sourceTree = ""; }; CE76FDD1111EE3A7006618EA /* DirectoryOutline.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DirectoryOutline.h; path = ../base/DirectoryOutline.h; sourceTree = SOURCE_ROOT; }; CE76FDD2111EE3A7006618EA /* DirectoryOutline.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = DirectoryOutline.m; path = ../base/DirectoryOutline.m; sourceTree = SOURCE_ROOT; }; CE76FDF5111EE561006618EA /* NSEventAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = NSEventAdditions.h; path = ../../cocoalib/NSEventAdditions.h; sourceTree = SOURCE_ROOT; }; @@ -243,8 +234,6 @@ CE8113EC12E5CEA800A36C80 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = ../base/fr.lproj/Localizable.strings; sourceTree = SOURCE_ROOT; }; CE89240614239CC30024CE4E /* PrioritizeList.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PrioritizeList.h; path = ../base/PrioritizeList.h; sourceTree = ""; }; CE89240714239CC30024CE4E /* PrioritizeList.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = PrioritizeList.m; path = ../base/PrioritizeList.m; sourceTree = ""; }; - CE8C53B61173248F0011B41F /* PyTable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PyTable.h; sourceTree = ""; }; - CE8C53BB117324CE0011B41F /* HSTable.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HSTable.m; sourceTree = ""; }; CE91F213113BC22D0010360B /* StatsLabel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = StatsLabel.h; path = ../base/StatsLabel.h; sourceTree = SOURCE_ROOT; }; CE91F214113BC22D0010360B /* StatsLabel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = StatsLabel.m; path = ../base/StatsLabel.m; sourceTree = SOURCE_ROOT; }; CE9777CB141F8C2500C13FB5 /* PrioritizeDialog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PrioritizeDialog.h; path = ../base/PrioritizeDialog.h; sourceTree = ""; }; @@ -265,8 +254,6 @@ CEA175C91461E8E600776591 /* locale */ = {isa = PBXFileReference; lastKnownFileType = folder; name = locale; path = ../../build/locale; sourceTree = ""; }; CEA450B714BDDFD7002DAAF2 /* dg_cocoa.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; name = dg_cocoa.py; path = ../../build/dg_cocoa.py; sourceTree = ""; }; CEB57990146ADC5100EDF7D7 /* HSConsts.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = HSConsts.h; path = ../../cocoalib/HSConsts.h; sourceTree = ""; }; - CEBE4D72111F0EE1009AAC6D /* HSWindowController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HSWindowController.h; sourceTree = ""; }; - CEBE4D73111F0EE1009AAC6D /* HSWindowController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HSWindowController.m; sourceTree = ""; }; CECFFF1C13CDF8D0003A4518 /* de */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = de; path = ../base/de.lproj/DetailsPanel.xib; sourceTree = SOURCE_ROOT; }; CECFFF1D13CDF8D0003A4518 /* de */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = de; path = ../base/de.lproj/DirectoryPanel.xib; sourceTree = SOURCE_ROOT; }; CECFFF1E13CDF8D0003A4518 /* de */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = de; path = ../base/de.lproj/ExtraFairwareReminder.xib; sourceTree = SOURCE_ROOT; }; @@ -287,6 +274,11 @@ CEE7EA110FE675C80004E467 /* DetailsPanel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DetailsPanel.h; path = ../base/DetailsPanel.h; sourceTree = SOURCE_ROOT; }; CEE7EA120FE675C80004E467 /* DetailsPanel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = DetailsPanel.m; path = ../base/DetailsPanel.m; sourceTree = SOURCE_ROOT; }; CEEB135109C837A2004D2330 /* dupeguru.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = dupeguru.icns; sourceTree = ""; }; + CEEF2A1114C09EDF0082545A /* PyColumns.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PyColumns.h; sourceTree = ""; }; + CEEF2A1214C09EDF0082545A /* PyGUI.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PyGUI.h; sourceTree = ""; }; + CEEF2A1314C09EDF0082545A /* PyOutline.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PyOutline.h; sourceTree = ""; }; + CEEF2A1414C09EDF0082545A /* PySelectableList.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PySelectableList.h; sourceTree = ""; }; + CEEF2A1514C09EDF0082545A /* PyTable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PyTable.h; sourceTree = ""; }; CEF0ACCC12DF3C2000B32F7E /* HSRecentFiles.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = HSRecentFiles.h; path = ../../cocoalib/HSRecentFiles.h; sourceTree = SOURCE_ROOT; }; CEF0ACCD12DF3C2000B32F7E /* HSRecentFiles.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = HSRecentFiles.m; path = ../../cocoalib/HSRecentFiles.m; sourceTree = SOURCE_ROOT; }; CEF27A9C1423EAD90048ADFA /* de */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = de; path = ../base/de.lproj/PrioritizeDialog.xib; sourceTree = ""; }; @@ -446,6 +438,8 @@ CE548CC314BF903D00D180CB /* PyPrioritizeDialog.m */, CE548CC414BF903D00D180CB /* PyPrioritizeList.h */, CE548CC514BF903D00D180CB /* PyPrioritizeList.m */, + CE4746D114C09C12001A66DE /* PyProblemDialog.h */, + CE4746D214C09C12001A66DE /* PyProblemDialog.m */, CE9FC23114C0866F005C31FD /* PyResultTable.h */, CE9FC23214C0866F005C31FD /* PyResultTable.m */, CE1D091614BE0C6400CA6B8C /* PyStatsLabel.h */, @@ -476,20 +470,12 @@ CE76FDC7111EE38E006618EA /* controllers */ = { isa = PBXGroup; children = ( - CE54A87C148046F9008EEA77 /* HSColumns.h */, - CE54A87D148046F9008EEA77 /* HSColumns.m */, CE275C4C14BF6C5600265960 /* HSColumns2.h */, CE275C4D14BF6C5600265960 /* HSColumns2.m */, - CEBE4D72111F0EE1009AAC6D /* HSWindowController.h */, - CEBE4D73111F0EE1009AAC6D /* HSWindowController.m */, CE275C4E14BF6C5600265960 /* HSOutline2.h */, CE275C4F14BF6C5600265960 /* HSOutline2.m */, - CE76FDC8111EE38E006618EA /* HSGUIController.h */, - CE76FDC9111EE38E006618EA /* HSGUIController.m */, CE9FC23714C08A92005C31FD /* HSGUIController2.h */, CE9FC23814C08A92005C31FD /* HSGUIController2.m */, - CE41672C141FE1E5004F3F0B /* HSTable.h */, - CE8C53BB117324CE0011B41F /* HSTable.m */, CE9FC23414C08A73005C31FD /* HSTable2.h */, CE9FC23514C08A7E005C31FD /* HSTable2.m */, CE548CBC14BF902000D180CB /* HSPopUpList2.h */, @@ -501,16 +487,18 @@ path = ../../cocoalib/controllers; sourceTree = SOURCE_ROOT; }; - CE76FDCC111EE38E006618EA /* proxies */ = { + CEEF2A1014C09EDF0082545A /* proxies */ = { isa = PBXGroup; children = ( - CE275C5B14BF71FE00265960 /* PyColumns.h */, - CE76FDCD111EE38E006618EA /* PyGUI.h */, - CE8C53B61173248F0011B41F /* PyTable.h */, + CEEF2A1114C09EDF0082545A /* PyColumns.h */, + CEEF2A1214C09EDF0082545A /* PyGUI.h */, + CEEF2A1314C09EDF0082545A /* PyOutline.h */, + CEEF2A1414C09EDF0082545A /* PySelectableList.h */, + CEEF2A1514C09EDF0082545A /* PyTable.h */, ); name = proxies; path = ../../cocoalib/proxies; - sourceTree = SOURCE_ROOT; + sourceTree = ""; }; CEEFC0CA10943849001F3A39 /* xib */ = { isa = PBXGroup; @@ -538,10 +526,10 @@ CEFC7F890FC9513600CD5728 /* cocoalib */ = { isa = PBXGroup; children = ( + CEEF2A1014C09EDF0082545A /* proxies */, CE76FDF5111EE561006618EA /* NSEventAdditions.h */, CE76FDF6111EE561006618EA /* NSEventAdditions.m */, CE76FDC7111EE38E006618EA /* controllers */, - CE76FDCC111EE38E006618EA /* proxies */, CE76FDBD111EE37C006618EA /* views */, CE19BC5F11199231007CCEB0 /* xib */, CEB57990146ADC5100EDF7D7 /* HSConsts.h */, @@ -593,7 +581,6 @@ CEFC7FB80FC951A700CD5728 /* ResultWindow.m */, CE647E541173024A006D28BA /* ProblemDialog.h */, CE647E551173024A006D28BA /* ProblemDialog.m */, - CE647E561173024A006D28BA /* PyProblemDialog.h */, CE9777CB141F8C2500C13FB5 /* PrioritizeDialog.h */, CE9777CC141F8C2500C13FB5 /* PrioritizeDialog.m */, CE89240614239CC30024CE4E /* PrioritizeList.h */, @@ -709,13 +696,10 @@ CE76FDC4111EE37C006618EA /* HSOutlineView.m in Sources */, CE76FDC5111EE37C006618EA /* NSIndexPathAdditions.m in Sources */, CE76FDC6111EE37C006618EA /* NSTableViewAdditions.m in Sources */, - CE76FDCF111EE38E006618EA /* HSGUIController.m in Sources */, CE76FDD4111EE3A7006618EA /* DirectoryOutline.m in Sources */, CE76FDF7111EE561006618EA /* NSEventAdditions.m in Sources */, - CEBE4D74111F0EE1009AAC6D /* HSWindowController.m in Sources */, CE91F216113BC22D0010360B /* StatsLabel.m in Sources */, CE647E571173024A006D28BA /* ProblemDialog.m in Sources */, - CE8C53BC117324CE0011B41F /* HSTable.m in Sources */, CE6DD4E7124CA3070089A48D /* ResultTable.m in Sources */, CE6DD547124CAF1F0089A48D /* HSTableView.m in Sources */, CE79638C12536F4E008D405B /* HSFairwareReminder.m in Sources */, @@ -725,7 +709,6 @@ CE9777CD141F8C2500C13FB5 /* PrioritizeDialog.m in Sources */, CE89240A14239CC30024CE4E /* PrioritizeList.m in Sources */, CE5335FC142BBFAF008E5374 /* HSQuicklook.m in Sources */, - CE54A87E148046F9008EEA77 /* HSColumns.m in Sources */, CE1D091814BE0C6400CA6B8C /* ObjP.m in Sources */, CE1D091914BE0C6400CA6B8C /* PyStatsLabel.m in Sources */, CE9D842A14BE2AE900184165 /* PyExtraFairwareReminder.m in Sources */, @@ -745,6 +728,7 @@ CE9FC23314C0866F005C31FD /* PyResultTable.m in Sources */, CE9FC23614C08A7E005C31FD /* HSTable2.m in Sources */, CE9FC23914C08A92005C31FD /* HSGUIController2.m in Sources */, + CE4746D314C09C12001A66DE /* PyProblemDialog.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/core/app.py b/core/app.py index c3439d68..bbbc20ce 100644 --- a/core/app.py +++ b/core/app.py @@ -28,6 +28,7 @@ from .gui.details_panel import DetailsPanel from .gui.directory_tree import DirectoryTree from .gui.extra_fairware_reminder import ExtraFairwareReminder from .gui.prioritize_dialog import PrioritizeDialog +from .gui.problem_dialog import ProblemDialog from .gui.stats_label import StatsLabel HAD_FIRST_LAUNCH_PREFERENCE = 'HadFirstLaunch' @@ -109,6 +110,7 @@ class DupeGuru(RegistrableApplication, Broadcaster): self.directory_tree = DirectoryTree(None, self) self.extra_fairware_reminder = ExtraFairwareReminder(None, self) self.prioritize_dialog = PrioritizeDialog(None, self) + self.problem_dialog = ProblemDialog(None, self) self.stats_label = StatsLabel(None, self) # subclasses must create self.result_table diff --git a/core/gui/problem_dialog.py b/core/gui/problem_dialog.py index 2b13f4d3..628b3bf6 100644 --- a/core/gui/problem_dialog.py +++ b/core/gui/problem_dialog.py @@ -9,12 +9,14 @@ from hscommon.notify import Broadcaster from .base import GUIObject +from .problem_table import ProblemTable class ProblemDialog(GUIObject, Broadcaster): def __init__(self, view, app): GUIObject.__init__(self, view, app) Broadcaster.__init__(self) self._selected_dupe = None + self.problem_table = ProblemTable(None, self) def reveal_selected_dupe(self): if self._selected_dupe is not None: From 950cd0c341dc10874c70af82e49c67364666730b Mon Sep 17 00:00:00 2001 From: Virgil Dupras Date: Fri, 13 Jan 2012 14:43:43 -0500 Subject: [PATCH 14/26] Completed the conversion wo objp with the conversion of PyDupeGuru. I had to temporarily disable error handling though. --HG-- branch : objp --- build.py | 14 +- cocoa/base/AppDelegate.h | 4 +- cocoa/base/AppDelegate.m | 29 +- cocoa/base/DetailsPanel.h | 2 - cocoa/base/DirectoryOutline.h | 4 +- cocoa/base/DirectoryPanel.h | 2 +- cocoa/base/DirectoryPanel.m | 6 +- cocoa/base/ExtraFairwareReminder.h | 2 - cocoa/base/PrioritizeDialog.h | 9 +- cocoa/base/PrioritizeDialog.m | 4 +- cocoa/base/PrioritizeList.h | 4 +- cocoa/base/ProblemDialog.h | 4 +- cocoa/base/ProblemDialog.m | 2 +- cocoa/base/PyDupeGuru.h | 61 ----- cocoa/base/ResultTable.h | 4 +- cocoa/base/ResultTable.m | 2 +- cocoa/base/ResultWindow.h | 2 +- cocoa/base/ResultWindow.m | 68 ++--- cocoa/base/en.lproj/MainMenu.xib | 280 +++++++++----------- cocoa/inter/app.py | 149 ++++++----- cocoa/inter/app_se.py | 32 +++ cocoa/inter/details_panel.py | 4 +- cocoa/inter/directory_outline.py | 4 +- cocoa/inter/extra_fairware_reminder.py | 4 +- cocoa/inter/prioritize_dialog.py | 4 +- cocoa/inter/prioritize_list.py | 4 +- cocoa/inter/problem_dialog.py | 4 +- cocoa/inter/result_table.py | 4 +- cocoa/inter/stats_label.py | 4 +- cocoa/se/AppDelegate.h | 1 - cocoa/se/AppDelegate.m | 2 - cocoa/se/PyDupeGuru.h | 16 -- cocoa/se/ResultWindow.m | 15 +- cocoa/se/dg_cocoa.py | 44 +-- cocoa/se/dupeguru.xcodeproj/project.pbxproj | 179 ++++++------- 35 files changed, 425 insertions(+), 548 deletions(-) delete mode 100644 cocoa/base/PyDupeGuru.h delete mode 100644 cocoa/se/PyDupeGuru.h diff --git a/build.py b/build.py index ee4f00a3..5da7bcc2 100644 --- a/build.py +++ b/build.py @@ -179,8 +179,8 @@ def build_cocoa_bridging_interfaces(): import objp.p2o add_to_pythonpath('cocoa') add_to_pythonpath('cocoalib') - from cocoa.inter2 import (PyGUIObject2, GUIObjectView, PyColumns2, ColumnsView, PyOutline2, - OutlineView, PySelectableList2, SelectableListView, PyTable2, TableView) + from cocoa.inter2 import (PyGUIObject, GUIObjectView, PyColumns, ColumnsView, PyOutline, + OutlineView, PySelectableList, SelectableListView, PyTable, TableView, PyFairware) from inter.details_panel import PyDetailsPanel, DetailsPanelView from inter.directory_outline import PyDirectoryOutline, DirectoryOutlineView from inter.extra_fairware_reminder import PyExtraFairwareReminder, ExtraFairwareReminderView @@ -189,14 +189,16 @@ def build_cocoa_bridging_interfaces(): from inter.problem_dialog import PyProblemDialog from inter.result_table import PyResultTable, ResultTableView from inter.stats_label import PyStatsLabel, StatsLabelView - allclasses = [PyGUIObject2, PyColumns2, PyOutline2, PySelectableList2, PyTable2, PyDetailsPanel, - PyDirectoryOutline, PyExtraFairwareReminder, PyPrioritizeDialog, PyPrioritizeList, - PyProblemDialog, PyResultTable, PyStatsLabel] + from inter.app import PyDupeGuruBase, DupeGuruView + from inter.app_se import PyDupeGuru + allclasses = [PyGUIObject, PyColumns, PyOutline, PySelectableList, PyTable, PyFairware, + PyDetailsPanel, PyDirectoryOutline, PyExtraFairwareReminder, PyPrioritizeDialog, + PyPrioritizeList, PyProblemDialog, PyResultTable, PyStatsLabel, PyDupeGuruBase, PyDupeGuru] for class_ in allclasses: objp.o2p.generate_objc_code(class_, 'cocoa/autogen', inherit=True) allclasses = [GUIObjectView, ColumnsView, OutlineView, SelectableListView, TableView, DetailsPanelView, DirectoryOutlineView, ExtraFairwareReminderView, PrioritizeDialogView, - PrioritizeListView, ResultTableView, StatsLabelView] + PrioritizeListView, ResultTableView, StatsLabelView, DupeGuruView] for class_ in allclasses: clsspec = objp.o2p.spec_from_python_class(class_) clsname = class_.__name__ diff --git a/cocoa/base/AppDelegate.h b/cocoa/base/AppDelegate.h index 9fc2a93d..9501a4fb 100644 --- a/cocoa/base/AppDelegate.h +++ b/cocoa/base/AppDelegate.h @@ -16,11 +16,11 @@ http://www.hardcoded.net/licenses/bsd_license @interface AppDelegateBase : NSObject { - IBOutlet PyDupeGuruBase *py; IBOutlet NSMenu *recentResultsMenu; IBOutlet NSMenu *actionsMenu; IBOutlet NSMenu *columnsMenu; + PyDupeGuru *model; ResultWindowBase *_resultWindow; DirectoryPanel *_directoryPanel; DetailsPanel *_detailsPanel; @@ -30,7 +30,7 @@ http://www.hardcoded.net/licenses/bsd_license } /* Virtual */ -- (PyDupeGuruBase *)py; +- (PyDupeGuru *)model; - (ResultWindowBase *)createResultWindow; - (DirectoryPanel *)createDirectoryPanel; - (DetailsPanel *)createDetailsPanel; diff --git a/cocoa/base/AppDelegate.m b/cocoa/base/AppDelegate.m index b3afbfc9..a96f7d39 100644 --- a/cocoa/base/AppDelegate.m +++ b/cocoa/base/AppDelegate.m @@ -25,7 +25,7 @@ http://www.hardcoded.net/licenses/bsd_license - (void)awakeFromNib { - [py bindCocoa:self]; + model = [[PyDupeGuru alloc] init]; NSUserDefaults *ud = [NSUserDefaults standardUserDefaults]; /* Because the pref pane is lazily loaded, we have to manually do the update check if the preference is set. @@ -45,7 +45,10 @@ http://www.hardcoded.net/licenses/bsd_license /* Virtual */ -- (PyDupeGuruBase *)py { return py; } +- (PyDupeGuru *)model +{ + return model; +} - (ResultWindowBase *)createResultWindow { @@ -104,7 +107,7 @@ http://www.hardcoded.net/licenses/bsd_license [op setTitle:TR(@"Select a results file to load")]; if ([op runModal] == NSOKButton) { NSString *filename = [[op filenames] objectAtIndex:0]; - [py loadResultsFrom:filename]; + [model loadResultsFrom:filename]; [[self recentResults] addFile:filename]; } } @@ -125,7 +128,7 @@ http://www.hardcoded.net/licenses/bsd_license - (IBAction)showAboutBox:(id)sender { if (_aboutBox == nil) { - _aboutBox = [[HSAboutBox alloc] initWithApp:py]; + _aboutBox = [[HSAboutBox alloc] initWithApp:model]; } [[_aboutBox window] makeKeyAndOrderFront:sender]; } @@ -157,9 +160,9 @@ http://www.hardcoded.net/licenses/bsd_license /* Delegate */ - (void)applicationDidFinishLaunching:(NSNotification *)aNotification { - [[ProgressController mainProgressController] setWorker:py]; - [py initialRegistrationSetup]; - [py loadSession]; + [[ProgressController mainProgressController] setWorker:model]; + [model initialRegistrationSetup]; + [model loadSession]; } - (void)applicationWillBecomeActive:(NSNotification *)aNotification @@ -171,7 +174,7 @@ http://www.hardcoded.net/licenses/bsd_license - (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender { - if ([py resultsAreModified]) { + if ([model resultsAreModified]) { NSString *msg = TR(@"You have unsaved results, do you really want to quit?"); if ([Dialogs askYesNo:msg] == NSAlertSecondButtonReturn) { // NO return NSTerminateCancel; @@ -186,10 +189,10 @@ http://www.hardcoded.net/licenses/bsd_license NSInteger sc = [ud integerForKey:@"sessionCountSinceLastIgnorePurge"]; if (sc >= 10) { sc = -1; - [py purgeIgnoreList]; + [model purgeIgnoreList]; } sc++; - [py saveSession]; + [model saveSession]; [ud setInteger:sc forKey:@"sessionCountSinceLastIgnorePurge"]; // NSApplication does not release nib instances objects, we must do it manually // Well, it isn't needed because the memory is freed anyway (we are quitting the application @@ -200,7 +203,7 @@ http://www.hardcoded.net/licenses/bsd_license - (void)recentFileClicked:(NSString *)path { - [py loadResultsFrom:path]; + [model loadResultsFrom:path]; } @@ -226,11 +229,11 @@ http://www.hardcoded.net/licenses/bsd_license - (void)showFairwareNagWithPrompt:(NSString *)prompt { - [HSFairwareReminder showFairwareNagWithApp:[self py] prompt:prompt]; + [HSFairwareReminder showFairwareNagWithApp:[self model] prompt:prompt]; } - (void)showDemoNagWithPrompt:(NSString *)prompt { - [HSFairwareReminder showDemoNagWithApp:[self py] prompt:prompt]; + [HSFairwareReminder showDemoNagWithApp:[self model] prompt:prompt]; } @end diff --git a/cocoa/base/DetailsPanel.h b/cocoa/base/DetailsPanel.h index b9dc867d..b2e8f292 100644 --- a/cocoa/base/DetailsPanel.h +++ b/cocoa/base/DetailsPanel.h @@ -7,8 +7,6 @@ http://www.hardcoded.net/licenses/bsd_license */ #import -#import "HSWindowController.h" -#import "PyApp.h" #import "PyDetailsPanel.h" @interface DetailsPanel : NSWindowController diff --git a/cocoa/base/DirectoryOutline.h b/cocoa/base/DirectoryOutline.h index d50f1d3a..d1552a02 100644 --- a/cocoa/base/DirectoryOutline.h +++ b/cocoa/base/DirectoryOutline.h @@ -7,12 +7,12 @@ http://www.hardcoded.net/licenses/bsd_license */ #import -#import "HSOutline2.h" +#import "HSOutline.h" #import "PyDirectoryOutline.h" #define DGAddedFoldersNotification @"DGAddedFoldersNotification" -@interface DirectoryOutline : HSOutline2 {} +@interface DirectoryOutline : HSOutline {} - (id)initWithOutlineView:(HSOutlineView *)aOutlineView; - (PyDirectoryOutline *)py; @end; \ No newline at end of file diff --git a/cocoa/base/DirectoryPanel.h b/cocoa/base/DirectoryPanel.h index c67542f5..6729ef2a 100644 --- a/cocoa/base/DirectoryPanel.h +++ b/cocoa/base/DirectoryPanel.h @@ -22,7 +22,7 @@ http://www.hardcoded.net/licenses/bsd_license IBOutlet NSButton *removeButton; AppDelegateBase *_app; - PyDupeGuruBase *_py; + PyDupeGuru *model; HSRecentFiles *_recentDirectories; DirectoryOutline *outline; BOOL _alwaysShowPopUp; diff --git a/cocoa/base/DirectoryPanel.m b/cocoa/base/DirectoryPanel.m index 18334bb7..28187046 100644 --- a/cocoa/base/DirectoryPanel.m +++ b/cocoa/base/DirectoryPanel.m @@ -18,8 +18,8 @@ http://www.hardcoded.net/licenses/bsd_license self = [super initWithWindowNibName:@"DirectoryPanel"]; [self window]; _app = aParentApp; - _py = [_app py]; - [[self window] setTitle:[_py appName]]; + model = [_app model]; + [[self window] setTitle:[model appName]]; _alwaysShowPopUp = NO; [self fillPopUpMenu]; _recentDirectories = [[HSRecentFiles alloc] initWithName:@"recentDirectories" menu:[addButtonPopUp menu]]; @@ -107,7 +107,7 @@ http://www.hardcoded.net/licenses/bsd_license /* Public */ - (void)addDirectory:(NSString *)directory { - NSInteger r = [[_py addDirectory:directory] intValue]; + NSInteger r = [model addDirectory:directory]; if (r) { NSString *m = @""; if (r == 1) { diff --git a/cocoa/base/ExtraFairwareReminder.h b/cocoa/base/ExtraFairwareReminder.h index 808a2699..90b27209 100644 --- a/cocoa/base/ExtraFairwareReminder.h +++ b/cocoa/base/ExtraFairwareReminder.h @@ -8,8 +8,6 @@ http://www.hardcoded.net/licenses/bsd_license #import #import "PyExtraFairwareReminder.h" -#import "HSWindowController.h" -#import "PyApp.h" @interface ExtraFairwareReminder : NSWindowController { diff --git a/cocoa/base/PrioritizeDialog.h b/cocoa/base/PrioritizeDialog.h index 3003da72..7c3ca852 100644 --- a/cocoa/base/PrioritizeDialog.h +++ b/cocoa/base/PrioritizeDialog.h @@ -7,10 +7,9 @@ http://www.hardcoded.net/licenses/bsd_license */ #import -#import "PyApp.h" #import "PyPrioritizeDialog.h" -#import "HSPopUpList2.h" -#import "HSSelectableList2.h" +#import "HSPopUpList.h" +#import "HSSelectableList.h" #import "PrioritizeList.h" @interface PrioritizeDialog : NSWindowController @@ -20,8 +19,8 @@ http://www.hardcoded.net/licenses/bsd_license IBOutlet NSTableView *prioritizationTableView; PyPrioritizeDialog *py; - HSPopUpList2 *categoryPopUp; - HSSelectableList2 *criteriaList; + HSPopUpList *categoryPopUp; + HSSelectableList *criteriaList; PrioritizeList *prioritizationList; } - (id)init; diff --git a/cocoa/base/PrioritizeDialog.m b/cocoa/base/PrioritizeDialog.m index 2e32af1b..9f06b24e 100644 --- a/cocoa/base/PrioritizeDialog.m +++ b/cocoa/base/PrioritizeDialog.m @@ -16,8 +16,8 @@ http://www.hardcoded.net/licenses/bsd_license [self window]; py = [[PyPrioritizeDialog alloc] initWithModel:findHackishModel(@"prioritize_dialog")]; [py bindCallback:createCallback(@"PrioritizeDialogView", self)]; - categoryPopUp = [[HSPopUpList2 alloc] initWithPyRef:[[self py] categoryList] popupView:categoryPopUpView]; - criteriaList = [[HSSelectableList2 alloc] initWithPyRef:[[self py] criteriaList] tableView:criteriaTableView]; + categoryPopUp = [[HSPopUpList alloc] initWithPyRef:[[self py] categoryList] popupView:categoryPopUpView]; + criteriaList = [[HSSelectableList alloc] initWithPyRef:[[self py] criteriaList] tableView:criteriaTableView]; prioritizationList = [[PrioritizeList alloc] initWithPyRef:[[self py] prioritizationList] tableView:prioritizationTableView]; [py connect]; return self; diff --git a/cocoa/base/PrioritizeList.h b/cocoa/base/PrioritizeList.h index bc3c1eee..24f5ac59 100644 --- a/cocoa/base/PrioritizeList.h +++ b/cocoa/base/PrioritizeList.h @@ -7,10 +7,10 @@ http://www.hardcoded.net/licenses/bsd_license */ #import -#import "HSSelectableList2.h" +#import "HSSelectableList.h" #import "PyPrioritizeList.h" -@interface PrioritizeList : HSSelectableList2 {} +@interface PrioritizeList : HSSelectableList {} - (id)initWithPyRef:(PyObject *)aPyRef tableView:(NSTableView *)aTableView; - (PyPrioritizeList *)model; @end \ No newline at end of file diff --git a/cocoa/base/ProblemDialog.h b/cocoa/base/ProblemDialog.h index 7ca11712..4359081e 100644 --- a/cocoa/base/ProblemDialog.h +++ b/cocoa/base/ProblemDialog.h @@ -8,14 +8,14 @@ http://www.hardcoded.net/licenses/bsd_license #import #import "PyProblemDialog.h" -#import "HSTable2.h" +#import "HSTable.h" @interface ProblemDialog : NSWindowController { IBOutlet NSTableView *problemTableView; PyProblemDialog *model; - HSTable2 *problemTable; + HSTable *problemTable; } - (id)init; diff --git a/cocoa/base/ProblemDialog.m b/cocoa/base/ProblemDialog.m index 2cd79e62..d356a404 100644 --- a/cocoa/base/ProblemDialog.m +++ b/cocoa/base/ProblemDialog.m @@ -15,7 +15,7 @@ http://www.hardcoded.net/licenses/bsd_license self = [super initWithWindowNibName:@"ProblemDialog"]; [self window]; //So the detailsTable is initialized. model = [[PyProblemDialog alloc] initWithModel:findHackishModel(@"problem_dialog")]; - problemTable = [[HSTable2 alloc] initWithPyRef:[model problemTable] tableView:problemTableView]; + problemTable = [[HSTable alloc] initWithPyRef:[model problemTable] tableView:problemTableView]; [self initializeColumns]; [model connect]; [[problemTable model] connect]; diff --git a/cocoa/base/PyDupeGuru.h b/cocoa/base/PyDupeGuru.h deleted file mode 100644 index afbac3af..00000000 --- a/cocoa/base/PyDupeGuru.h +++ /dev/null @@ -1,61 +0,0 @@ -/* -Copyright 2011 Hardcoded Software (http://www.hardcoded.net) - -This software is licensed under the "BSD" License as described in the "LICENSE" file, -which should be included with this package. The terms are also available at -http://www.hardcoded.net/licenses/bsd_license -*/ - -#import -#import "PyResultTable.h" -#import "PyStatsLabel.h" -#import "PyApp.h" - -@interface PyDupeGuruBase : PyApp -- (void)bindCocoa:(id)cocoa; -- (PyResultTable *)resultTable; -- (PyStatsLabel *)statsLabel; -//Actions -- (NSNumber *)addDirectory:(NSString *)name; -- (void)loadResultsFrom:(NSString *)filename; -- (void)saveResultsAs:(NSString *)filename; -- (void)loadSession; -- (void)saveSession; -- (void)clearIgnoreList; -- (void)purgeIgnoreList; -- (NSString *)exportToXHTML; -- (void)invokeCommand:(NSString *)cmd; - -- (void)doScan; - -- (void)toggleSelectedMark; -- (void)markAll; -- (void)markInvert; -- (void)markNone; - -- (void)addSelectedToIgnoreList; -- (void)openSelected; -- (void)revealSelected; -- (void)makeSelectedReference; -- (void)applyFilter:(NSString *)filter; - -- (void)copyOrMove:(NSNumber *)aCopy markedTo:(NSString *)destination recreatePath:(NSNumber *)aRecreateType; -- (void)deleteMarked; -- (void)hardlinkMarked; -- (void)removeMarked; - -//Data -- (NSNumber *)getIgnoreListCount; -- (NSNumber *)getMarkCount; -- (BOOL)scanWasProblematic; -- (BOOL)resultsAreModified; - -//Scanning options -- (void)setScanType:(NSNumber *)scan_type; -- (void)setMinMatchPercentage:(NSNumber *)percentage; -- (void)setMixFileKind:(BOOL)mix_file_kind; -- (void)setEscapeFilterRegexp:(BOOL)escape_filter_regexp; -- (void)setRemoveEmptyFolders:(BOOL)remove_empty_folders; -- (void)setIgnoreHardlinkMatches:(BOOL)ignore_hardlink_matches; -- (void)setSizeThreshold:(NSInteger)size_threshold; -@end diff --git a/cocoa/base/ResultTable.h b/cocoa/base/ResultTable.h index e60b2da8..3b6fd43c 100644 --- a/cocoa/base/ResultTable.h +++ b/cocoa/base/ResultTable.h @@ -8,10 +8,10 @@ http://www.hardcoded.net/licenses/bsd_license #import #import -#import "HSTable2.h" +#import "HSTable.h" #import "PyResultTable.h" -@interface ResultTable : HSTable2 +@interface ResultTable : HSTable { NSSet *_deltaColumns; } diff --git a/cocoa/base/ResultTable.m b/cocoa/base/ResultTable.m index d35531ee..095ba859 100644 --- a/cocoa/base/ResultTable.m +++ b/cocoa/base/ResultTable.m @@ -12,7 +12,7 @@ http://www.hardcoded.net/licenses/bsd_license #import "Consts.h" #import "HSQuicklook.h" -@interface HSTable2 (private) +@interface HSTable (private) - (void)setPySelection; - (void)setViewSelection; @end diff --git a/cocoa/base/ResultWindow.h b/cocoa/base/ResultWindow.h index de7215c9..4e0f4455 100644 --- a/cocoa/base/ResultWindow.h +++ b/cocoa/base/ResultWindow.h @@ -25,7 +25,7 @@ http://www.hardcoded.net/licenses/bsd_license IBOutlet NSSearchField *filterField; AppDelegateBase *app; - PyDupeGuruBase *py; + PyDupeGuru *model; NSMenu *columnsMenu; ResultTable *table; StatsLabel *statsLabel; diff --git a/cocoa/base/ResultWindow.m b/cocoa/base/ResultWindow.m index b934ab6d..f9e6431f 100644 --- a/cocoa/base/ResultWindow.m +++ b/cocoa/base/ResultWindow.m @@ -19,8 +19,8 @@ http://www.hardcoded.net/licenses/bsd_license { self = [super initWithWindowNibName:@"ResultWindow"]; app = aApp; - py = [app py]; - [[self window] setTitle:fmt(@"%@ Results", [py appName])]; + model = [app model]; + [[self window] setTitle:fmt(@"%@ Results", [model appName])]; columnsMenu = [app columnsMenu]; /* Put a cute iTunes-like bottom bar */ [[self window] setContentBorderThickness:28 forEdge:NSMinYEdge]; @@ -76,7 +76,7 @@ http://www.hardcoded.net/licenses/bsd_license - (void)sendMarkedToTrash:(BOOL)hardlinkDeleted { - NSInteger mark_count = [[py getMarkCount] intValue]; + NSInteger mark_count = [model getMarkCount]; if (!mark_count) { return; } @@ -88,12 +88,12 @@ http://www.hardcoded.net/licenses/bsd_license return; } NSUserDefaults *ud = [NSUserDefaults standardUserDefaults]; - [py setRemoveEmptyFolders:n2b([ud objectForKey:@"removeEmptyFolders"])]; + [model setRemoveEmptyFolders:n2b([ud objectForKey:@"removeEmptyFolders"])]; if (hardlinkDeleted) { - [py hardlinkMarked]; + [model hardlinkMarked]; } else { - [py deleteMarked]; + [model deleteMarked]; } } @@ -107,13 +107,13 @@ http://www.hardcoded.net/licenses/bsd_license /* Actions */ - (IBAction)clearIgnoreList:(id)sender { - NSInteger i = n2i([py getIgnoreListCount]); + NSInteger i = [model getIgnoreListCount]; if (!i) return; NSString *msg = [NSString stringWithFormat:TR(@"Do you really want to remove all %d items from the ignore list?"),i]; if ([Dialogs askYesNo:msg] == NSAlertSecondButtonReturn) // NO return; - [py clearIgnoreList]; + [model clearIgnoreList]; } - (IBAction)changeOptions:(id)sender @@ -132,7 +132,7 @@ http://www.hardcoded.net/licenses/bsd_license - (IBAction)copyMarked:(id)sender { - NSInteger mark_count = [[py getMarkCount] intValue]; + NSInteger mark_count = [model getMarkCount]; if (!mark_count) return; NSOpenPanel *op = [NSOpenPanel openPanel]; @@ -144,7 +144,7 @@ http://www.hardcoded.net/licenses/bsd_license if ([op runModal] == NSOKButton) { NSString *directory = [[op filenames] objectAtIndex:0]; NSUserDefaults *ud = [NSUserDefaults standardUserDefaults]; - [py copyOrMove:b2n(YES) markedTo:directory recreatePath:[ud objectForKey:@"recreatePathType"]]; + [model copyOrMove:YES markedTo:directory recreatePath:n2b([ud objectForKey:@"recreatePathType"])]; } } @@ -160,15 +160,15 @@ http://www.hardcoded.net/licenses/bsd_license - (IBAction)exportToXHTML:(id)sender { - NSString *exported = [py exportToXHTML]; + NSString *exported = [model exportToXHTML]; [[NSWorkspace sharedWorkspace] openFile:exported]; } - (IBAction)filter:(id)sender { NSUserDefaults *ud = [NSUserDefaults standardUserDefaults]; - [py setEscapeFilterRegexp:!n2b([ud objectForKey:@"useRegexpFilter"])]; - [py applyFilter:[filterField stringValue]]; + [model setEscapeFilterRegexp:!n2b([ud objectForKey:@"useRegexpFilter"])]; + [model applyFilter:[filterField stringValue]]; } - (IBAction)ignoreSelected:(id)sender @@ -179,7 +179,7 @@ http://www.hardcoded.net/licenses/bsd_license NSString *msg = [NSString stringWithFormat:TR(@"All selected %d matches are going to be ignored in all subsequent scans. Continue?"),selectedDupeCount]; if ([Dialogs askYesNo:msg] == NSAlertSecondButtonReturn) // NO return; - [py addSelectedToIgnoreList]; + [model addSelectedToIgnoreList]; } - (IBAction)invokeCustomCommand:(id)sender @@ -187,7 +187,7 @@ http://www.hardcoded.net/licenses/bsd_license NSUserDefaults *ud = [NSUserDefaults standardUserDefaults]; NSString *cmd = [ud stringForKey:@"CustomCommand"]; if ((cmd != nil) && ([cmd length] > 0)) { - [py invokeCommand:cmd]; + [model invokeCommand:cmd]; } else { [Dialogs showMessage:TR(@"You have no custom command set up. Set it up in your preferences.")]; @@ -196,27 +196,27 @@ http://www.hardcoded.net/licenses/bsd_license - (IBAction)markAll:(id)sender { - [py markAll]; + [model markAll]; } - (IBAction)markInvert:(id)sender { - [py markInvert]; + [model markInvert]; } - (IBAction)markNone:(id)sender { - [py markNone]; + [model markNone]; } - (IBAction)markSelected:(id)sender { - [py toggleSelectedMark]; + [model toggleSelectedMark]; } - (IBAction)moveMarked:(id)sender { - NSInteger mark_count = [[py getMarkCount] intValue]; + NSInteger mark_count = [model getMarkCount]; if (!mark_count) return; NSOpenPanel *op = [NSOpenPanel openPanel]; @@ -228,8 +228,8 @@ http://www.hardcoded.net/licenses/bsd_license if ([op runModal] == NSOKButton) { NSString *directory = [[op filenames] objectAtIndex:0]; NSUserDefaults *ud = [NSUserDefaults standardUserDefaults]; - [py setRemoveEmptyFolders:n2b([ud objectForKey:@"removeEmptyFolders"])]; - [py copyOrMove:b2n(NO) markedTo:directory recreatePath:[ud objectForKey:@"recreatePathType"]]; + [model setRemoveEmptyFolders:n2b([ud objectForKey:@"removeEmptyFolders"])]; + [model copyOrMove:NO markedTo:directory recreatePath:n2b([ud objectForKey:@"recreatePathType"])]; } } @@ -239,23 +239,23 @@ http://www.hardcoded.net/licenses/bsd_license return; } [matches selectRowIndexes:[NSIndexSet indexSetWithIndex:[matches clickedRow]] byExtendingSelection:NO]; - [py openSelected]; + [model openSelected]; } - (IBAction)openSelected:(id)sender { - [py openSelected]; + [model openSelected]; } - (IBAction)removeMarked:(id)sender { - int mark_count = [[py getMarkCount] intValue]; + int mark_count = [model getMarkCount]; if (!mark_count) return; NSString *msg = [NSString stringWithFormat:@"You are about to remove %d files from results. Continue?",mark_count]; if ([Dialogs askYesNo:msg] == NSAlertSecondButtonReturn) // NO return; - [py removeMarked]; + [model removeMarked]; } - (IBAction)removeSelected:(id)sender @@ -288,7 +288,7 @@ http://www.hardcoded.net/licenses/bsd_license - (IBAction)revealSelected:(id)sender { - [py revealSelected]; + [model revealSelected]; } - (IBAction)saveResults:(id)sender @@ -298,24 +298,24 @@ http://www.hardcoded.net/licenses/bsd_license [sp setAllowedFileTypes:[NSArray arrayWithObject:@"dupeguru"]]; [sp setTitle:TR(@"Select a file to save your results to")]; if ([sp runModal] == NSOKButton) { - [py saveResultsAs:[sp filename]]; + [model saveResultsAs:[sp filename]]; [[app recentResults] addFile:[sp filename]]; } } - (IBAction)startDuplicateScan:(id)sender { - if ([py resultsAreModified]) { + if ([model resultsAreModified]) { if ([Dialogs askYesNo:TR(@"You have unsaved results, do you really want to continue?")] == NSAlertSecondButtonReturn) // NO return; } [self setScanOptions]; - [py doScan]; + [model doScan]; } - (IBAction)switchSelected:(id)sender { - [py makeSelectedReference]; + [model makeSelectedReference]; } - (IBAction)toggleColumn:(id)sender @@ -382,7 +382,7 @@ http://www.hardcoded.net/licenses/bsd_license { id lastAction = [[ProgressController mainProgressController] jobId]; if ([lastAction isEqualTo:jobCopy]) { - if ([py scanWasProblematic]) { + if ([model scanWasProblematic]) { [problemDialog showWindow:self]; } else { @@ -390,7 +390,7 @@ http://www.hardcoded.net/licenses/bsd_license } } else if ([lastAction isEqualTo:jobMove]) { - if ([py scanWasProblematic]) { + if ([model scanWasProblematic]) { [problemDialog showWindow:self]; } else { @@ -398,7 +398,7 @@ http://www.hardcoded.net/licenses/bsd_license } } else if ([lastAction isEqualTo:jobDelete]) { - if ([py scanWasProblematic]) { + if ([model scanWasProblematic]) { [problemDialog showWindow:self]; } else { diff --git a/cocoa/base/en.lproj/MainMenu.xib b/cocoa/base/en.lproj/MainMenu.xib index bcea99c8..0640310c 100644 --- a/cocoa/base/en.lproj/MainMenu.xib +++ b/cocoa/base/en.lproj/MainMenu.xib @@ -2,13 +2,13 @@ 1060 - 11B26 - 1617 - 1138 - 566.00 + 11C74 + 1938 + 1138.23 + 567.00 com.apple.InterfaceBuilder.CocoaPlugin - 1617 + 1938 NSMenu @@ -18,7 +18,10 @@ com.apple.InterfaceBuilder.CocoaPlugin - + + PluginDependencyRecalculationVersion + + NSApplication @@ -668,31 +671,12 @@ AppDelegate - - PyDupeGuru - SUUpdater - - - performMiniaturize: - - - - 37 - - - - arrangeInFront: - - - - 39 - terminate: @@ -725,14 +709,6 @@ 153 - - - performZoom: - - - - 198 - delegate @@ -742,20 +718,28 @@ 207 - - delegate - - + + performMiniaturize: + + - 208 + 37 - - py - - + + arrangeInFront: + + - 614 + 39 + + + + performZoom: + + + + 198 @@ -765,14 +749,6 @@ 925 - - - checkForUpdates: - - - - 951 - cut: @@ -797,46 +773,6 @@ 1005 - - - openWebsite: - - - - 1024 - - - - delegate - - - - 1175 - - - - showAboutBox: - - - - 1232 - - - - openHelp: - - - - 1233 - - - - recentResultsMenu - - - - 1242 - clearIgnoreList: @@ -1013,6 +949,70 @@ 1266 + + + reprioritizeResults: + + + + 1278 + + + + removeMarked: + + + + 1279 + + + + toggleQuicklookPanel: + + + + 1282 + + + + delegate + + + + 208 + + + + openWebsite: + + + + 1024 + + + + showAboutBox: + + + + 1232 + + + + openHelp: + + + + 1233 + + + + recentResultsMenu + + + + 1242 + columnsMenu @@ -1063,27 +1063,19 @@ - reprioritizeResults: - - + checkForUpdates: + + - 1278 + 951 - - removeMarked: - - + + delegate + + - 1279 - - - - toggleQuicklookPanel: - - - - 1282 + 1175 @@ -1508,12 +1500,6 @@ AppDelegate - - 613 - - - PyDupeGuru - 949 @@ -1654,7 +1640,6 @@ com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin @@ -1772,6 +1757,25 @@ ./Classes/AppDelegateBase.h + + HSOutlineView + NSOutlineView + + copy: + id + + + copy: + + copy: + id + + + + IBProjectSource + ./Classes/HSOutlineView.h + + HSTableView NSTableView @@ -1780,17 +1784,9 @@ ./Classes/HSTableView.h - - HSWindowController - NSWindowController - - IBProjectSource - ./Classes/HSWindowController.h - - PrioritizeDialog - HSWindowController + NSWindowController id id @@ -1841,7 +1837,7 @@ ProblemDialog - HSWindowController + NSWindowController revealSelected: id @@ -1869,38 +1865,6 @@ ./Classes/ProblemDialog.h - - PyApp - PyFairware - - IBProjectSource - ./Classes/PyApp.h - - - - PyDupeGuru - PyDupeGuruBase - - IBProjectSource - ./Classes/PyDupeGuru.h - - - - PyDupeGuruBase - PyApp - - IBProjectSource - ./Classes/PyDupeGuruBase.h - - - - PyFairware - NSObject - - IBProjectSource - ./Classes/PyFairware.h - - ResultWindowBase NSWindowController @@ -2127,7 +2091,7 @@ com.apple.InterfaceBuilder.CocoaPlugin.macosx - + com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3 diff --git a/cocoa/inter/app.py b/cocoa/inter/app.py index b1237570..97893301 100644 --- a/cocoa/inter/app.py +++ b/cocoa/inter/app.py @@ -1,14 +1,13 @@ import logging +from objp.util import pyref, dontwrap from jobprogress import job import cocoa from cocoa import install_exception_hook, proxy -from cocoa.inter import signature, subproxy, PyFairware +from cocoa.inter2 import PyFairware, FairwareView from hscommon.trans import trget from core.app import JobType -from .result_table import PyResultTable -from .stats_label import PyStatsLabel tr = trget('ui') @@ -20,129 +19,138 @@ JOBID2TITLE = { JobType.Delete: tr("Sending to Trash"), } +class DupeGuruView(FairwareView): + def showExtraFairwareReminder(self): pass + class PyDupeGuruBase(PyFairware): + FOLLOW_PROTOCOLS = ['Worker'] + def _init(self, modelclass): logging.basicConfig(level=logging.WARNING, format='%(levelname)s %(message)s') install_exception_hook() appdata = proxy.getAppdataPath() - self.py = modelclass(self, appdata) + self.model = modelclass(self, appdata) self.progress = cocoa.ThreadedJobPerformer() - def bindCocoa_(self, cocoa): - self.cocoa = cocoa + #---Sub-proxies + def detailsPanel(self) -> pyref: + return self.model.details_panel - resultTable = subproxy('resultTable', 'result_table', PyResultTable) - statsLabel = subproxy('statsLabel', 'stats_label', PyStatsLabel) + def directoryTree(self) -> pyref: + return self.model.directory_tree + + def extraFairwareReminder(self) -> pyref: + return self.model.extra_fairware_reminder + + def prioritizeDialog(self) -> pyref: + return self.model.prioritize_dialog + + def statsLabel(self) -> pyref: + return self.model.stats_label + + def resultTable(self) -> pyref: + return self.model.result_table #---Directories - def addDirectory_(self, directory): - return self.py.add_directory(directory) + def addDirectory_(self, directory: str) -> int: + return self.model.add_directory(directory) #---Results def clearIgnoreList(self): - self.py.scanner.ignore_list.Clear() + self.model.scanner.ignore_list.Clear() def doScan(self): - self.py.start_scanning() + self.model.start_scanning() - def exportToXHTML(self): - return self.py.export_to_xhtml() + def exportToXHTML(self) -> str: + return self.model.export_to_xhtml() def loadSession(self): - self.py.load() + self.model.load() - def loadResultsFrom_(self, filename): - self.py.load_from(filename) + def loadResultsFrom_(self, filename: str): + self.model.load_from(filename) def markAll(self): - self.py.mark_all() + self.model.mark_all() def markNone(self): - self.py.mark_none() + self.model.mark_none() def markInvert(self): - self.py.mark_invert() + self.model.mark_invert() def purgeIgnoreList(self): - self.py.purge_ignore_list() + self.model.purge_ignore_list() def toggleSelectedMark(self): - self.py.toggle_selected_mark_state() + self.model.toggle_selected_mark_state() def saveSession(self): - self.py.save() + self.model.save() - def saveResultsAs_(self, filename): - self.py.save_as(filename) + def saveResultsAs_(self, filename: str): + self.model.save_as(filename) #---Actions def addSelectedToIgnoreList(self): - self.py.add_selected_to_ignore_list() + self.model.add_selected_to_ignore_list() def deleteMarked(self): - self.py.delete_marked() + self.model.delete_marked() def hardlinkMarked(self): - self.py.delete_marked(replace_with_hardlinks=True) + self.model.delete_marked(replace_with_hardlinks=True) - def applyFilter_(self, filter): - self.py.apply_filter(filter) + def applyFilter_(self, filter: str): + self.model.apply_filter(filter) def makeSelectedReference(self): - self.py.make_selected_reference() + self.model.make_selected_reference() - def copyOrMove_markedTo_recreatePath_(self, copy, destination, recreate_path): - self.py.copy_or_move_marked(copy, destination, recreate_path) + def copyOrMove_markedTo_recreatePath_(self, copy: bool, destination: str, recreate_path: bool): + self.model.copy_or_move_marked(copy, destination, recreate_path) def openSelected(self): - self.py.open_selected() + self.model.open_selected() def removeMarked(self): - self.py.remove_marked() - - def renameSelected_(self,newname): - return self.py.rename_selected(newname) + self.model.remove_marked() def revealSelected(self): - self.py.reveal_selected() + self.model.reveal_selected() - def invokeCommand_(self, cmd): - self.py.invoke_command(cmd) + def invokeCommand_(self, cmd: str): + self.model.invoke_command(cmd) #---Information - def getIgnoreListCount(self): - return len(self.py.scanner.ignore_list) + def getIgnoreListCount(self) -> int: + return len(self.model.scanner.ignore_list) - def getMarkCount(self): - return self.py.results.mark_count + def getMarkCount(self) -> int: + return self.model.results.mark_count - @signature('i@:') - def scanWasProblematic(self): - return bool(self.py.results.problems) + def scanWasProblematic(self) -> bool: + return bool(self.model.results.problems) - @signature('i@:') - def resultsAreModified(self): - return self.py.results.is_modified + def resultsAreModified(self) -> bool: + return self.model.results.is_modified #---Properties - @signature('v@:c') - def setMixFileKind_(self, mix_file_kind): - self.py.scanner.mix_file_kind = mix_file_kind + def setMixFileKind_(self, mix_file_kind: bool): + self.model.scanner.mix_file_kind = mix_file_kind - @signature('v@:c') - def setEscapeFilterRegexp_(self, escape_filter_regexp): - self.py.options['escape_filter_regexp'] = escape_filter_regexp + def setEscapeFilterRegexp_(self, escape_filter_regexp: bool): + self.model.options['escape_filter_regexp'] = escape_filter_regexp - @signature('v@:c') - def setRemoveEmptyFolders_(self, remove_empty_folders): - self.py.options['clean_empty_dirs'] = remove_empty_folders + def setRemoveEmptyFolders_(self, remove_empty_folders: bool): + self.model.options['clean_empty_dirs'] = remove_empty_folders - @signature('v@:c') - def setIgnoreHardlinkMatches_(self, ignore_hardlink_matches): - self.py.options['ignore_hardlink_matches'] = ignore_hardlink_matches + def setIgnoreHardlinkMatches_(self, ignore_hardlink_matches: bool): + self.model.options['ignore_hardlink_matches'] = ignore_hardlink_matches #---Worker - def getJobProgress(self): + def getJobProgress(self) -> object: # NSNumber try: return self.progress.last_progress except AttributeError: @@ -151,7 +159,7 @@ class PyDupeGuruBase(PyFairware): # is sent), but it happens anyway, so there we go. ref: #106 return -1 - def getJobDesc(self): + def getJobDesc(self) -> str: try: return self.progress.last_desc except AttributeError: @@ -161,16 +169,19 @@ class PyDupeGuruBase(PyFairware): def cancelJob(self): self.progress.job_cancelled = True - def jobCompleted_(self, jobid): - self.py._job_completed(jobid) + def jobCompleted_(self, jobid: str): + self.model._job_completed(jobid) #--- model --> view + @dontwrap def open_path(self, path): proxy.openPath_(str(path)) + @dontwrap def reveal_path(self, path): proxy.revealPath_(str(path)) + @dontwrap def start_job(self, jobid, func, args=()): try: j = self.progress.create_job() @@ -182,9 +193,7 @@ class PyDupeGuruBase(PyFairware): ud = {'desc': JOBID2TITLE[jobid], 'jobid':jobid} proxy.postNotification_userInfo_('JobStarted', ud) + @dontwrap def show_extra_fairware_reminder(self): self.cocoa.showExtraFairwareReminder() - def show_message(self, msg): - self.cocoa.showMessage_(msg) - diff --git a/cocoa/inter/app_se.py b/cocoa/inter/app_se.py index c5779c2c..3ac3de6d 100644 --- a/cocoa/inter/app_se.py +++ b/cocoa/inter/app_se.py @@ -13,9 +13,11 @@ from hscommon import io from hscommon.path import Path from cocoa import proxy +from core.scanner import ScanType from core import fs from core.directories import Directories as DirectoriesBase, DirectoryState from core_se.app import DupeGuru as DupeGuruBase +from .app import PyDupeGuruBase def is_bundle(str_path): uti = proxy.getUTI_(str_path) @@ -70,3 +72,33 @@ class DupeGuru(DupeGuruBase): DupeGuruBase.__init__(self, view, appdata) self.directories = Directories() + +class PyDupeGuru(PyDupeGuruBase): + def __init__(self): + self._init(DupeGuru) + import __main__ + __main__.APP_INSTANCE = self.model + + #---Properties + def setMinMatchPercentage_(self, percentage: int): + self.model.scanner.min_match_percentage = int(percentage) + + def setScanType_(self, scan_type: int): + try: + self.model.scanner.scan_type = [ + ScanType.Filename, + ScanType.Contents, + ScanType.Folders, + ][scan_type] + except IndexError: + pass + + def setWordWeighting_(self, words_are_weighted: bool): + self.model.scanner.word_weighting = words_are_weighted + + def setMatchSimilarWords_(self, match_similar_words: bool): + self.model.scanner.match_similar_words = match_similar_words + + def setSizeThreshold_(self, size_threshold: int): + self.model.scanner.size_threshold = size_threshold + diff --git a/cocoa/inter/details_panel.py b/cocoa/inter/details_panel.py index b2d17851..4ac39d9a 100644 --- a/cocoa/inter/details_panel.py +++ b/cocoa/inter/details_panel.py @@ -1,9 +1,9 @@ -from cocoa.inter2 import PyGUIObject2, GUIObjectView +from cocoa.inter2 import PyGUIObject, GUIObjectView class DetailsPanelView(GUIObjectView): pass -class PyDetailsPanel(PyGUIObject2): +class PyDetailsPanel(PyGUIObject): def numberOfRows(self) -> int: return self.model.row_count() diff --git a/cocoa/inter/directory_outline.py b/cocoa/inter/directory_outline.py index 57832b25..127f6640 100644 --- a/cocoa/inter/directory_outline.py +++ b/cocoa/inter/directory_outline.py @@ -1,10 +1,10 @@ from objp.util import dontwrap -from cocoa.inter2 import PyOutline2, GUIObjectView +from cocoa.inter2 import PyOutline, GUIObjectView class DirectoryOutlineView(GUIObjectView): pass -class PyDirectoryOutline(PyOutline2): +class PyDirectoryOutline(PyOutline): def addDirectory_(self, path: str): self.model.add_directory(path) diff --git a/cocoa/inter/extra_fairware_reminder.py b/cocoa/inter/extra_fairware_reminder.py index af87e557..47b9871c 100644 --- a/cocoa/inter/extra_fairware_reminder.py +++ b/cocoa/inter/extra_fairware_reminder.py @@ -1,5 +1,5 @@ from objp.util import dontwrap -from cocoa.inter2 import PyGUIObject2 +from cocoa.inter2 import PyGUIObject class ExtraFairwareReminderView: def startTimer(self): pass @@ -7,7 +7,7 @@ class ExtraFairwareReminderView: def setButtonText_(self, text: str): pass; def enableButton(self): pass -class PyExtraFairwareReminder(PyGUIObject2): +class PyExtraFairwareReminder(PyGUIObject): def start(self): self.model.start() diff --git a/cocoa/inter/prioritize_dialog.py b/cocoa/inter/prioritize_dialog.py index 769bc026..63da1de2 100644 --- a/cocoa/inter/prioritize_dialog.py +++ b/cocoa/inter/prioritize_dialog.py @@ -1,10 +1,10 @@ from objp.util import pyref -from cocoa.inter2 import PyGUIObject2, GUIObjectView +from cocoa.inter2 import PyGUIObject, GUIObjectView class PrioritizeDialogView(GUIObjectView): pass -class PyPrioritizeDialog(PyGUIObject2): +class PyPrioritizeDialog(PyGUIObject): def categoryList(self) -> pyref: return self.model.category_list diff --git a/cocoa/inter/prioritize_list.py b/cocoa/inter/prioritize_list.py index 5d525bc9..171c2a23 100644 --- a/cocoa/inter/prioritize_list.py +++ b/cocoa/inter/prioritize_list.py @@ -1,8 +1,8 @@ -from cocoa.inter2 import PySelectableList2, SelectableListView +from cocoa.inter2 import PySelectableList, SelectableListView class PrioritizeListView(SelectableListView): pass -class PyPrioritizeList(PySelectableList2): +class PyPrioritizeList(PySelectableList): def moveIndexes_toIndex_(self, indexes: list, dest_index: int): self.model.move_indexes(indexes, dest_index) diff --git a/cocoa/inter/problem_dialog.py b/cocoa/inter/problem_dialog.py index 7d9374ad..b5fabaa5 100644 --- a/cocoa/inter/problem_dialog.py +++ b/cocoa/inter/problem_dialog.py @@ -1,7 +1,7 @@ from objp.util import pyref -from cocoa.inter2 import PyGUIObject2 +from cocoa.inter2 import PyGUIObject -class PyProblemDialog(PyGUIObject2): +class PyProblemDialog(PyGUIObject): def problemTable(self) -> pyref: return self.model.problem_table diff --git a/cocoa/inter/result_table.py b/cocoa/inter/result_table.py index 5ae424a9..2b8701ed 100644 --- a/cocoa/inter/result_table.py +++ b/cocoa/inter/result_table.py @@ -1,10 +1,10 @@ from objp.util import dontwrap -from cocoa.inter2 import PyTable2, TableView +from cocoa.inter2 import PyTable, TableView class ResultTableView(TableView): def invalidateMarkings(self): pass -class PyResultTable(PyTable2): +class PyResultTable(PyTable): def powerMarkerMode(self) -> bool: return self.model.power_marker diff --git a/cocoa/inter/stats_label.py b/cocoa/inter/stats_label.py index f484d7be..b36fbcb0 100644 --- a/cocoa/inter/stats_label.py +++ b/cocoa/inter/stats_label.py @@ -1,9 +1,9 @@ -from cocoa.inter2 import PyGUIObject2, GUIObjectView +from cocoa.inter2 import PyGUIObject, GUIObjectView class StatsLabelView(GUIObjectView): pass -class PyStatsLabel(PyGUIObject2): +class PyStatsLabel(PyGUIObject): def display(self) -> str: return self.model.display diff --git a/cocoa/se/AppDelegate.h b/cocoa/se/AppDelegate.h index 669b49e2..7d95cf6d 100644 --- a/cocoa/se/AppDelegate.h +++ b/cocoa/se/AppDelegate.h @@ -11,5 +11,4 @@ http://www.hardcoded.net/licenses/bsd_license #import "PyDupeGuru.h" @interface AppDelegate : AppDelegateBase {} -- (PyDupeGuru *)py; @end diff --git a/cocoa/se/AppDelegate.m b/cocoa/se/AppDelegate.m index aac9482c..47c0589b 100644 --- a/cocoa/se/AppDelegate.m +++ b/cocoa/se/AppDelegate.m @@ -62,6 +62,4 @@ http://www.hardcoded.net/licenses/bsd_license { return [[ResultWindow alloc] initWithParentApp:self]; } - -- (PyDupeGuru *)py { return (PyDupeGuru *)py; } @end diff --git a/cocoa/se/PyDupeGuru.h b/cocoa/se/PyDupeGuru.h deleted file mode 100644 index 17e8a826..00000000 --- a/cocoa/se/PyDupeGuru.h +++ /dev/null @@ -1,16 +0,0 @@ -/* -Copyright 2011 Hardcoded Software (http://www.hardcoded.net) - -This software is licensed under the "BSD" License as described in the "LICENSE" file, -which should be included with this package. The terms are also available at -http://www.hardcoded.net/licenses/bsd_license -*/ - -#import -#import "../base/PyDupeGuru.h" - -@interface PyDupeGuru : PyDupeGuruBase -//Scanning options -- (void)setWordWeighting:(NSNumber *)words_are_weighted; -- (void)setMatchSimilarWords:(NSNumber *)match_similar_words; -@end diff --git a/cocoa/se/ResultWindow.m b/cocoa/se/ResultWindow.m index 43cc3e40..ac767a0f 100644 --- a/cocoa/se/ResultWindow.m +++ b/cocoa/se/ResultWindow.m @@ -39,15 +39,14 @@ http://www.hardcoded.net/licenses/bsd_license - (void)setScanOptions { NSUserDefaults *ud = [NSUserDefaults standardUserDefaults]; - PyDupeGuru *_py = (PyDupeGuru *)py; - [_py setScanType:[ud objectForKey:@"scanType"]]; - [_py setMinMatchPercentage:[ud objectForKey:@"minMatchPercentage"]]; - [_py setWordWeighting:[ud objectForKey:@"wordWeighting"]]; - [_py setMixFileKind:n2b([ud objectForKey:@"mixFileKind"])]; - [_py setIgnoreHardlinkMatches:n2b([ud objectForKey:@"ignoreHardlinkMatches"])]; - [_py setMatchSimilarWords:[ud objectForKey:@"matchSimilarWords"]]; + [model setScanType:n2b([ud objectForKey:@"scanType"])]; + [model setMinMatchPercentage:n2i([ud objectForKey:@"minMatchPercentage"])]; + [model setWordWeighting:n2b([ud objectForKey:@"wordWeighting"])]; + [model setMixFileKind:n2b([ud objectForKey:@"mixFileKind"])]; + [model setIgnoreHardlinkMatches:n2b([ud objectForKey:@"ignoreHardlinkMatches"])]; + [model setMatchSimilarWords:n2b([ud objectForKey:@"matchSimilarWords"])]; int smallFileThreshold = [ud integerForKey:@"smallFileThreshold"]; // In KB int sizeThreshold = [ud boolForKey:@"ignoreSmallFiles"] ? smallFileThreshold * 1024 : 0; // The py side wants bytes - [_py setSizeThreshold:sizeThreshold]; + [model setSizeThreshold:sizeThreshold]; } @end diff --git a/cocoa/se/dg_cocoa.py b/cocoa/se/dg_cocoa.py index dfb8dd63..a40ecf16 100644 --- a/cocoa/se/dg_cocoa.py +++ b/cocoa/se/dg_cocoa.py @@ -7,12 +7,8 @@ from hscommon.trans import install_gettext_trans_under_cocoa install_gettext_trans_under_cocoa() -from cocoa.inter import signature -from cocoa.inter2 import PySelectableList2, PyColumns2, PyTable2 +from cocoa.inter2 import PySelectableList, PyColumns, PyTable -from core.scanner import ScanType - -from inter.app import PyDupeGuruBase from inter.details_panel import PyDetailsPanel from inter.directory_outline import PyDirectoryOutline from inter.extra_fairware_reminder import PyExtraFairwareReminder @@ -21,40 +17,4 @@ from inter.prioritize_list import PyPrioritizeList from inter.problem_dialog import PyProblemDialog from inter.result_table import PyResultTable from inter.stats_label import PyStatsLabel -from inter.app_se import DupeGuru - -# XXX temporary hack -APP_INSTANCE = None - -class PyDupeGuru(PyDupeGuruBase): - def init(self): - self = super(PyDupeGuru,self).init() - self._init(DupeGuru) - global APP_INSTANCE - APP_INSTANCE = self.py - return self - - #---Properties - def setMinMatchPercentage_(self,percentage): - self.py.scanner.min_match_percentage = int(percentage) - - def setScanType_(self,scan_type): - try: - self.py.scanner.scan_type = [ - ScanType.Filename, - ScanType.Contents, - ScanType.Folders, - ][scan_type] - except IndexError: - pass - - def setWordWeighting_(self,words_are_weighted): - self.py.scanner.word_weighting = words_are_weighted - - def setMatchSimilarWords_(self,match_similar_words): - self.py.scanner.match_similar_words = match_similar_words - - @signature('v@:i') - def setSizeThreshold_(self, size_threshold): - self.py.scanner.size_threshold = size_threshold - +from inter.app_se import PyDupeGuru \ No newline at end of file diff --git a/cocoa/se/dupeguru.xcodeproj/project.pbxproj b/cocoa/se/dupeguru.xcodeproj/project.pbxproj index 5e1d6710..f1d549c5 100644 --- a/cocoa/se/dupeguru.xcodeproj/project.pbxproj +++ b/cocoa/se/dupeguru.xcodeproj/project.pbxproj @@ -16,10 +16,8 @@ CE19BC6411199231007CCEB0 /* progress.xib in Resources */ = {isa = PBXBuildFile; fileRef = CE19BC6111199231007CCEB0 /* progress.xib */; }; CE1D091814BE0C6400CA6B8C /* ObjP.m in Sources */ = {isa = PBXBuildFile; fileRef = CE1D091514BE0C6400CA6B8C /* ObjP.m */; }; CE1D091914BE0C6400CA6B8C /* PyStatsLabel.m in Sources */ = {isa = PBXBuildFile; fileRef = CE1D091714BE0C6400CA6B8C /* PyStatsLabel.m */; }; - CE275C5014BF6C5600265960 /* HSColumns2.m in Sources */ = {isa = PBXBuildFile; fileRef = CE275C4D14BF6C5600265960 /* HSColumns2.m */; }; - CE275C5114BF6C5600265960 /* HSOutline2.m in Sources */ = {isa = PBXBuildFile; fileRef = CE275C4F14BF6C5600265960 /* HSOutline2.m */; }; CE275C5714BF712B00265960 /* PyDirectoryOutline.m in Sources */ = {isa = PBXBuildFile; fileRef = CE275C5514BF712B00265960 /* PyDirectoryOutline.m */; }; - CE275C5A14BF71DF00265960 /* PyColumns2.m in Sources */ = {isa = PBXBuildFile; fileRef = CE275C5914BF71DF00265960 /* PyColumns2.m */; }; + CE275C5A14BF71DF00265960 /* PyColumns.m in Sources */ = {isa = PBXBuildFile; fileRef = CE275C5914BF71DF00265960 /* PyColumns.m */; }; CE27D3C412CCA43800859E67 /* HSAboutBox.m in Sources */ = {isa = PBXBuildFile; fileRef = CE27D3C312CCA43800859E67 /* HSAboutBox.m */; }; CE31819D13D85D9B00B6D649 /* about.xib in Resources */ = {isa = PBXBuildFile; fileRef = CE31819913D85D9B00B6D649 /* about.xib */; }; CE31819E13D85D9B00B6D649 /* ErrorReportWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = CE31819B13D85D9B00B6D649 /* ErrorReportWindow.xib */; }; @@ -31,12 +29,10 @@ CE4746D314C09C12001A66DE /* PyProblemDialog.m in Sources */ = {isa = PBXBuildFile; fileRef = CE4746D214C09C12001A66DE /* PyProblemDialog.m */; }; CE5335FC142BBFAF008E5374 /* HSQuicklook.m in Sources */ = {isa = PBXBuildFile; fileRef = CE5335FB142BBFAF008E5374 /* HSQuicklook.m */; }; CE533603142BC034008E5374 /* Quartz.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CE533602142BC034008E5374 /* Quartz.framework */; }; - CE548CC014BF902000D180CB /* HSPopUpList2.m in Sources */ = {isa = PBXBuildFile; fileRef = CE548CBD14BF902000D180CB /* HSPopUpList2.m */; }; - CE548CC114BF902000D180CB /* HSSelectableList2.m in Sources */ = {isa = PBXBuildFile; fileRef = CE548CBF14BF902000D180CB /* HSSelectableList2.m */; }; CE548CC614BF903D00D180CB /* PyPrioritizeDialog.m in Sources */ = {isa = PBXBuildFile; fileRef = CE548CC314BF903D00D180CB /* PyPrioritizeDialog.m */; }; CE548CC714BF903D00D180CB /* PyPrioritizeList.m in Sources */ = {isa = PBXBuildFile; fileRef = CE548CC514BF903D00D180CB /* PyPrioritizeList.m */; }; - CE587E9A14C07BCF004CA031 /* PyOutline2.m in Sources */ = {isa = PBXBuildFile; fileRef = CE587E9814C07BCF004CA031 /* PyOutline2.m */; }; - CE587E9E14C0801F004CA031 /* PySelectableList2.m in Sources */ = {isa = PBXBuildFile; fileRef = CE587E9D14C0801F004CA031 /* PySelectableList2.m */; }; + CE587E9A14C07BCF004CA031 /* PyOutline.m in Sources */ = {isa = PBXBuildFile; fileRef = CE587E9814C07BCF004CA031 /* PyOutline.m */; }; + CE587E9E14C0801F004CA031 /* PySelectableList.m in Sources */ = {isa = PBXBuildFile; fileRef = CE587E9D14C0801F004CA031 /* PySelectableList.m */; }; CE647E571173024A006D28BA /* ProblemDialog.m in Sources */ = {isa = PBXBuildFile; fileRef = CE647E551173024A006D28BA /* ProblemDialog.m */; }; CE665B3013225ADD003F5CFB /* ExtraFairwareReminder.m in Sources */ = {isa = PBXBuildFile; fileRef = CE665B2E13225ADD003F5CFB /* ExtraFairwareReminder.m */; }; CE665B3313225AF8003F5CFB /* ExtraFairwareReminder.xib in Resources */ = {isa = PBXBuildFile; fileRef = CE665B3113225AF8003F5CFB /* ExtraFairwareReminder.xib */; }; @@ -62,15 +58,22 @@ CE9777CD141F8C2500C13FB5 /* PrioritizeDialog.m in Sources */ = {isa = PBXBuildFile; fileRef = CE9777CC141F8C2500C13FB5 /* PrioritizeDialog.m */; }; CE9777D1141F8CB400C13FB5 /* PrioritizeDialog.xib in Resources */ = {isa = PBXBuildFile; fileRef = CE9777CF141F8CB400C13FB5 /* PrioritizeDialog.xib */; }; CE9D842A14BE2AE900184165 /* PyExtraFairwareReminder.m in Sources */ = {isa = PBXBuildFile; fileRef = CE9D842914BE2AE900184165 /* PyExtraFairwareReminder.m */; }; - CE9FC22D14C080CF005C31FD /* PyGUIObject2.m in Sources */ = {isa = PBXBuildFile; fileRef = CE9FC22C14C080CF005C31FD /* PyGUIObject2.m */; }; - CE9FC23014C08622005C31FD /* PyTable2.m in Sources */ = {isa = PBXBuildFile; fileRef = CE9FC22F14C08622005C31FD /* PyTable2.m */; }; + CE9FC22D14C080CF005C31FD /* PyGUIObject.m in Sources */ = {isa = PBXBuildFile; fileRef = CE9FC22C14C080CF005C31FD /* PyGUIObject.m */; }; + CE9FC23014C08622005C31FD /* PyTable.m in Sources */ = {isa = PBXBuildFile; fileRef = CE9FC22F14C08622005C31FD /* PyTable.m */; }; CE9FC23314C0866F005C31FD /* PyResultTable.m in Sources */ = {isa = PBXBuildFile; fileRef = CE9FC23214C0866F005C31FD /* PyResultTable.m */; }; - CE9FC23614C08A7E005C31FD /* HSTable2.m in Sources */ = {isa = PBXBuildFile; fileRef = CE9FC23514C08A7E005C31FD /* HSTable2.m */; }; - CE9FC23914C08A92005C31FD /* HSGUIController2.m in Sources */ = {isa = PBXBuildFile; fileRef = CE9FC23814C08A92005C31FD /* HSGUIController2.m */; }; CEA175CA1461E8E600776591 /* locale in Resources */ = {isa = PBXBuildFile; fileRef = CEA175C91461E8E600776591 /* locale */; }; CEA450B814BDDFD7002DAAF2 /* dg_cocoa.py in Resources */ = {isa = PBXBuildFile; fileRef = CEA450B714BDDFD7002DAAF2 /* dg_cocoa.py */; }; CEE7EA130FE675C80004E467 /* DetailsPanel.m in Sources */ = {isa = PBXBuildFile; fileRef = CEE7EA120FE675C80004E467 /* DetailsPanel.m */; }; CEEB135209C837A2004D2330 /* dupeguru.icns in Resources */ = {isa = PBXBuildFile; fileRef = CEEB135109C837A2004D2330 /* dupeguru.icns */; }; + CEEF2A1814C0A5A60082545A /* PyDupeGuru.m in Sources */ = {isa = PBXBuildFile; fileRef = CEEF2A1714C0A5A60082545A /* PyDupeGuru.m */; }; + CEEF2A1D14C0A8480082545A /* PyDupeGuruBase.m in Sources */ = {isa = PBXBuildFile; fileRef = CEEF2A1A14C0A8480082545A /* PyDupeGuruBase.m */; }; + CEEF2A1E14C0A8480082545A /* PyFairware.m in Sources */ = {isa = PBXBuildFile; fileRef = CEEF2A1C14C0A8480082545A /* PyFairware.m */; }; + CEEF2A3C14C0B9050082545A /* HSColumns.m in Sources */ = {isa = PBXBuildFile; fileRef = CEEF2A3114C0B9050082545A /* HSColumns.m */; }; + CEEF2A3D14C0B9050082545A /* HSGUIController.m in Sources */ = {isa = PBXBuildFile; fileRef = CEEF2A3314C0B9050082545A /* HSGUIController.m */; }; + CEEF2A3E14C0B9050082545A /* HSOutline.m in Sources */ = {isa = PBXBuildFile; fileRef = CEEF2A3514C0B9050082545A /* HSOutline.m */; }; + CEEF2A3F14C0B9050082545A /* HSPopUpList.m in Sources */ = {isa = PBXBuildFile; fileRef = CEEF2A3714C0B9050082545A /* HSPopUpList.m */; }; + CEEF2A4014C0B9050082545A /* HSSelectableList.m in Sources */ = {isa = PBXBuildFile; fileRef = CEEF2A3914C0B9050082545A /* HSSelectableList.m */; }; + CEEF2A4114C0B9050082545A /* HSTable.m in Sources */ = {isa = PBXBuildFile; fileRef = CEEF2A3B14C0B9050082545A /* HSTable.m */; }; CEF0ACCE12DF3C2000B32F7E /* HSRecentFiles.m in Sources */ = {isa = PBXBuildFile; fileRef = CEF0ACCD12DF3C2000B32F7E /* HSRecentFiles.m */; }; CEFC294609C89E3D00D9F998 /* folder32.png in Resources */ = {isa = PBXBuildFile; fileRef = CEFC294509C89E3D00D9F998 /* folder32.png */; }; CEFC7F9E0FC9517500CD5728 /* Dialogs.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFC7F8B0FC9517500CD5728 /* Dialogs.m */; }; @@ -140,14 +143,10 @@ CE1D091514BE0C6400CA6B8C /* ObjP.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ObjP.m; sourceTree = ""; }; CE1D091614BE0C6400CA6B8C /* PyStatsLabel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PyStatsLabel.h; sourceTree = ""; }; CE1D091714BE0C6400CA6B8C /* PyStatsLabel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PyStatsLabel.m; sourceTree = ""; }; - CE275C4C14BF6C5600265960 /* HSColumns2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HSColumns2.h; sourceTree = ""; }; - CE275C4D14BF6C5600265960 /* HSColumns2.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HSColumns2.m; sourceTree = ""; }; - CE275C4E14BF6C5600265960 /* HSOutline2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HSOutline2.h; sourceTree = ""; }; - CE275C4F14BF6C5600265960 /* HSOutline2.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HSOutline2.m; sourceTree = ""; }; CE275C5414BF712B00265960 /* PyDirectoryOutline.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PyDirectoryOutline.h; sourceTree = ""; }; CE275C5514BF712B00265960 /* PyDirectoryOutline.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PyDirectoryOutline.m; sourceTree = ""; }; - CE275C5814BF71DF00265960 /* PyColumns2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PyColumns2.h; sourceTree = ""; }; - CE275C5914BF71DF00265960 /* PyColumns2.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PyColumns2.m; sourceTree = ""; }; + CE275C5814BF71DF00265960 /* PyColumns.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PyColumns.h; sourceTree = ""; }; + CE275C5914BF71DF00265960 /* PyColumns.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PyColumns.m; sourceTree = ""; }; CE27D3C212CCA43800859E67 /* HSAboutBox.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = HSAboutBox.h; path = ../../cocoalib/HSAboutBox.h; sourceTree = SOURCE_ROOT; }; CE27D3C312CCA43800859E67 /* HSAboutBox.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = HSAboutBox.m; path = ../../cocoalib/HSAboutBox.m; sourceTree = SOURCE_ROOT; }; CE31819A13D85D9B00B6D649 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = ../en.lproj/about.xib; sourceTree = ""; }; @@ -169,18 +168,14 @@ CE5335FA142BBFAF008E5374 /* HSQuicklook.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = HSQuicklook.h; path = ../../cocoalib/HSQuicklook.h; sourceTree = ""; }; CE5335FB142BBFAF008E5374 /* HSQuicklook.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = HSQuicklook.m; path = ../../cocoalib/HSQuicklook.m; sourceTree = ""; }; CE533602142BC034008E5374 /* Quartz.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Quartz.framework; path = System/Library/Frameworks/Quartz.framework; sourceTree = SDKROOT; }; - CE548CBC14BF902000D180CB /* HSPopUpList2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HSPopUpList2.h; sourceTree = ""; }; - CE548CBD14BF902000D180CB /* HSPopUpList2.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HSPopUpList2.m; sourceTree = ""; }; - CE548CBE14BF902000D180CB /* HSSelectableList2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HSSelectableList2.h; sourceTree = ""; }; - CE548CBF14BF902000D180CB /* HSSelectableList2.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HSSelectableList2.m; sourceTree = ""; }; CE548CC214BF903D00D180CB /* PyPrioritizeDialog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PyPrioritizeDialog.h; sourceTree = ""; }; CE548CC314BF903D00D180CB /* PyPrioritizeDialog.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PyPrioritizeDialog.m; sourceTree = ""; }; CE548CC414BF903D00D180CB /* PyPrioritizeList.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PyPrioritizeList.h; sourceTree = ""; }; CE548CC514BF903D00D180CB /* PyPrioritizeList.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PyPrioritizeList.m; sourceTree = ""; }; - CE587E9714C07BCF004CA031 /* PyOutline2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PyOutline2.h; sourceTree = ""; }; - CE587E9814C07BCF004CA031 /* PyOutline2.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PyOutline2.m; sourceTree = ""; }; - CE587E9C14C0801F004CA031 /* PySelectableList2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PySelectableList2.h; sourceTree = ""; }; - CE587E9D14C0801F004CA031 /* PySelectableList2.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PySelectableList2.m; sourceTree = ""; }; + CE587E9714C07BCF004CA031 /* PyOutline.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PyOutline.h; sourceTree = ""; }; + CE587E9814C07BCF004CA031 /* PyOutline.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PyOutline.m; sourceTree = ""; }; + CE587E9C14C0801F004CA031 /* PySelectableList.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PySelectableList.h; sourceTree = ""; }; + CE587E9D14C0801F004CA031 /* PySelectableList.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PySelectableList.m; sourceTree = ""; }; CE647E541173024A006D28BA /* ProblemDialog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ProblemDialog.h; path = ../base/ProblemDialog.h; sourceTree = SOURCE_ROOT; }; CE647E551173024A006D28BA /* ProblemDialog.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = ProblemDialog.m; path = ../base/ProblemDialog.m; sourceTree = SOURCE_ROOT; }; CE665B2D13225ADD003F5CFB /* ExtraFairwareReminder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ExtraFairwareReminder.h; path = ../base/ExtraFairwareReminder.h; sourceTree = SOURCE_ROOT; }; @@ -202,7 +197,6 @@ CE76FDD2111EE3A7006618EA /* DirectoryOutline.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = DirectoryOutline.m; path = ../base/DirectoryOutline.m; sourceTree = SOURCE_ROOT; }; CE76FDF5111EE561006618EA /* NSEventAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = NSEventAdditions.h; path = ../../cocoalib/NSEventAdditions.h; sourceTree = SOURCE_ROOT; }; CE76FDF6111EE561006618EA /* NSEventAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = NSEventAdditions.m; path = ../../cocoalib/NSEventAdditions.m; sourceTree = SOURCE_ROOT; }; - CE79638212536C6E008D405B /* PyFairware.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PyFairware.h; path = ../../cocoalib/PyFairware.h; sourceTree = SOURCE_ROOT; }; CE79638512536C94008D405B /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = ../../cocoalib/en.lproj/FairwareReminder.xib; sourceTree = SOURCE_ROOT; }; CE79638A12536F4E008D405B /* HSFairwareReminder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = HSFairwareReminder.h; path = ../../cocoalib/HSFairwareReminder.h; sourceTree = SOURCE_ROOT; }; CE79638B12536F4E008D405B /* HSFairwareReminder.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = HSFairwareReminder.m; path = ../../cocoalib/HSFairwareReminder.m; sourceTree = SOURCE_ROOT; }; @@ -241,16 +235,12 @@ CE9777D0141F8CB400C13FB5 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = ../base/en.lproj/PrioritizeDialog.xib; sourceTree = ""; }; CE9D842814BE2AE900184165 /* PyExtraFairwareReminder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PyExtraFairwareReminder.h; sourceTree = ""; }; CE9D842914BE2AE900184165 /* PyExtraFairwareReminder.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PyExtraFairwareReminder.m; sourceTree = ""; }; - CE9FC22B14C080CF005C31FD /* PyGUIObject2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PyGUIObject2.h; sourceTree = ""; }; - CE9FC22C14C080CF005C31FD /* PyGUIObject2.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PyGUIObject2.m; sourceTree = ""; }; - CE9FC22E14C08622005C31FD /* PyTable2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PyTable2.h; sourceTree = ""; }; - CE9FC22F14C08622005C31FD /* PyTable2.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PyTable2.m; sourceTree = ""; }; + CE9FC22B14C080CF005C31FD /* PyGUIObject.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PyGUIObject.h; sourceTree = ""; }; + CE9FC22C14C080CF005C31FD /* PyGUIObject.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PyGUIObject.m; sourceTree = ""; }; + CE9FC22E14C08622005C31FD /* PyTable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PyTable.h; sourceTree = ""; }; + CE9FC22F14C08622005C31FD /* PyTable.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PyTable.m; sourceTree = ""; }; CE9FC23114C0866F005C31FD /* PyResultTable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PyResultTable.h; sourceTree = ""; }; CE9FC23214C0866F005C31FD /* PyResultTable.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PyResultTable.m; sourceTree = ""; }; - CE9FC23414C08A73005C31FD /* HSTable2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HSTable2.h; sourceTree = ""; }; - CE9FC23514C08A7E005C31FD /* HSTable2.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HSTable2.m; sourceTree = ""; }; - CE9FC23714C08A92005C31FD /* HSGUIController2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HSGUIController2.h; sourceTree = ""; }; - CE9FC23814C08A92005C31FD /* HSGUIController2.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HSGUIController2.m; sourceTree = ""; }; CEA175C91461E8E600776591 /* locale */ = {isa = PBXFileReference; lastKnownFileType = folder; name = locale; path = ../../build/locale; sourceTree = ""; }; CEA450B714BDDFD7002DAAF2 /* dg_cocoa.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; name = dg_cocoa.py; path = ../../build/dg_cocoa.py; sourceTree = ""; }; CEB57990146ADC5100EDF7D7 /* HSConsts.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = HSConsts.h; path = ../../cocoalib/HSConsts.h; sourceTree = ""; }; @@ -274,11 +264,25 @@ CEE7EA110FE675C80004E467 /* DetailsPanel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DetailsPanel.h; path = ../base/DetailsPanel.h; sourceTree = SOURCE_ROOT; }; CEE7EA120FE675C80004E467 /* DetailsPanel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = DetailsPanel.m; path = ../base/DetailsPanel.m; sourceTree = SOURCE_ROOT; }; CEEB135109C837A2004D2330 /* dupeguru.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = dupeguru.icns; sourceTree = ""; }; - CEEF2A1114C09EDF0082545A /* PyColumns.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PyColumns.h; sourceTree = ""; }; - CEEF2A1214C09EDF0082545A /* PyGUI.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PyGUI.h; sourceTree = ""; }; - CEEF2A1314C09EDF0082545A /* PyOutline.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PyOutline.h; sourceTree = ""; }; - CEEF2A1414C09EDF0082545A /* PySelectableList.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PySelectableList.h; sourceTree = ""; }; - CEEF2A1514C09EDF0082545A /* PyTable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PyTable.h; sourceTree = ""; }; + CEEF2A1614C0A5A60082545A /* PyDupeGuru.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PyDupeGuru.h; sourceTree = ""; }; + CEEF2A1714C0A5A60082545A /* PyDupeGuru.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PyDupeGuru.m; sourceTree = ""; }; + CEEF2A1914C0A8480082545A /* PyDupeGuruBase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PyDupeGuruBase.h; sourceTree = ""; }; + CEEF2A1A14C0A8480082545A /* PyDupeGuruBase.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PyDupeGuruBase.m; sourceTree = ""; }; + CEEF2A1B14C0A8480082545A /* PyFairware.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PyFairware.h; sourceTree = ""; }; + CEEF2A1C14C0A8480082545A /* PyFairware.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PyFairware.m; sourceTree = ""; }; + CEEF2A3014C0B9050082545A /* HSColumns.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HSColumns.h; sourceTree = ""; }; + CEEF2A3114C0B9050082545A /* HSColumns.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HSColumns.m; sourceTree = ""; }; + CEEF2A3214C0B9050082545A /* HSGUIController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HSGUIController.h; sourceTree = ""; }; + CEEF2A3314C0B9050082545A /* HSGUIController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HSGUIController.m; sourceTree = ""; }; + CEEF2A3414C0B9050082545A /* HSOutline.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HSOutline.h; sourceTree = ""; }; + CEEF2A3514C0B9050082545A /* HSOutline.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HSOutline.m; sourceTree = ""; }; + CEEF2A3614C0B9050082545A /* HSPopUpList.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HSPopUpList.h; sourceTree = ""; }; + CEEF2A3714C0B9050082545A /* HSPopUpList.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HSPopUpList.m; sourceTree = ""; }; + CEEF2A3814C0B9050082545A /* HSSelectableList.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HSSelectableList.h; sourceTree = ""; }; + CEEF2A3914C0B9050082545A /* HSSelectableList.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HSSelectableList.m; sourceTree = ""; }; + CEEF2A3A14C0B9050082545A /* HSTable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HSTable.h; sourceTree = ""; }; + CEEF2A3B14C0B9050082545A /* HSTable.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HSTable.m; sourceTree = ""; }; + CEEF2A4214C0BB430082545A /* Worker.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Worker.h; path = ../../cocoalib/Worker.h; sourceTree = ""; }; CEF0ACCC12DF3C2000B32F7E /* HSRecentFiles.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = HSRecentFiles.h; path = ../../cocoalib/HSRecentFiles.h; sourceTree = SOURCE_ROOT; }; CEF0ACCD12DF3C2000B32F7E /* HSRecentFiles.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = HSRecentFiles.m; path = ../../cocoalib/HSRecentFiles.m; sourceTree = SOURCE_ROOT; }; CEF27A9C1423EAD90048ADFA /* de */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = de; path = ../base/de.lproj/PrioritizeDialog.xib; sourceTree = ""; }; @@ -291,7 +295,6 @@ CEFC7F8D0FC9517500CD5728 /* HSErrorReportWindow.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = HSErrorReportWindow.m; path = ../../cocoalib/HSErrorReportWindow.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; }; 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; }; CEFC7F9A0FC9517500CD5728 /* Utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Utils.h; path = ../../cocoalib/Utils.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; }; CEFC7F9C0FC9517500CD5728 /* ValueTransformers.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ValueTransformers.h; path = ../../cocoalib/ValueTransformers.h; sourceTree = SOURCE_ROOT; }; @@ -301,10 +304,8 @@ CEFC7FB30FC951A700CD5728 /* Consts.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Consts.h; path = ../base/Consts.h; sourceTree = SOURCE_ROOT; }; CEFC7FB40FC951A700CD5728 /* DirectoryPanel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DirectoryPanel.h; path = ../base/DirectoryPanel.h; sourceTree = SOURCE_ROOT; }; CEFC7FB50FC951A700CD5728 /* DirectoryPanel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = DirectoryPanel.m; path = ../base/DirectoryPanel.m; sourceTree = SOURCE_ROOT; }; - CEFC7FB60FC951A700CD5728 /* PyDupeGuru.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PyDupeGuru.h; path = ../base/PyDupeGuru.h; sourceTree = SOURCE_ROOT; }; CEFC7FB70FC951A700CD5728 /* ResultWindow.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ResultWindow.h; path = ../base/ResultWindow.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; }; - CEFF18A009A4D387005E6321 /* PyDupeGuru.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = PyDupeGuru.h; sourceTree = SOURCE_ROOT; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -327,7 +328,6 @@ children = ( CE381C9509914ACE003581CE /* AppDelegate.h */, CE381C9409914ACE003581CE /* AppDelegate.m */, - CEFF18A009A4D387005E6321 /* PyDupeGuru.h */, CE381C9B09914ADF003581CE /* ResultWindow.h */, CE381C9A09914ADF003581CE /* ResultWindow.m */, 29B97316FDCFA39411CA2CEA /* main.m */, @@ -418,16 +418,16 @@ CE1D091314BE0C6400CA6B8C /* autogen */ = { isa = PBXGroup; children = ( - CE9FC22B14C080CF005C31FD /* PyGUIObject2.h */, - CE9FC22C14C080CF005C31FD /* PyGUIObject2.m */, - CE275C5814BF71DF00265960 /* PyColumns2.h */, - CE275C5914BF71DF00265960 /* PyColumns2.m */, - CE587E9714C07BCF004CA031 /* PyOutline2.h */, - CE587E9814C07BCF004CA031 /* PyOutline2.m */, - CE587E9C14C0801F004CA031 /* PySelectableList2.h */, - CE587E9D14C0801F004CA031 /* PySelectableList2.m */, - CE9FC22E14C08622005C31FD /* PyTable2.h */, - CE9FC22F14C08622005C31FD /* PyTable2.m */, + CE9FC22B14C080CF005C31FD /* PyGUIObject.h */, + CE9FC22C14C080CF005C31FD /* PyGUIObject.m */, + CE275C5814BF71DF00265960 /* PyColumns.h */, + CE275C5914BF71DF00265960 /* PyColumns.m */, + CE587E9714C07BCF004CA031 /* PyOutline.h */, + CE587E9814C07BCF004CA031 /* PyOutline.m */, + CE587E9C14C0801F004CA031 /* PySelectableList.h */, + CE587E9D14C0801F004CA031 /* PySelectableList.m */, + CE9FC22E14C08622005C31FD /* PyTable.h */, + CE9FC22F14C08622005C31FD /* PyTable.m */, CE3A3B4714BF19B8007898AB /* PyDetailsPanel.h */, CE3A3B4814BF19B8007898AB /* PyDetailsPanel.m */, CE9D842814BE2AE900184165 /* PyExtraFairwareReminder.h */, @@ -446,6 +446,12 @@ CE1D091714BE0C6400CA6B8C /* PyStatsLabel.m */, CE1D091414BE0C6400CA6B8C /* ObjP.h */, CE1D091514BE0C6400CA6B8C /* ObjP.m */, + CEEF2A1614C0A5A60082545A /* PyDupeGuru.h */, + CEEF2A1714C0A5A60082545A /* PyDupeGuru.m */, + CEEF2A1914C0A8480082545A /* PyDupeGuruBase.h */, + CEEF2A1A14C0A8480082545A /* PyDupeGuruBase.m */, + CEEF2A1B14C0A8480082545A /* PyFairware.h */, + CEEF2A1C14C0A8480082545A /* PyFairware.m */, ); name = autogen; path = ../autogen; @@ -470,36 +476,23 @@ CE76FDC7111EE38E006618EA /* controllers */ = { isa = PBXGroup; children = ( - CE275C4C14BF6C5600265960 /* HSColumns2.h */, - CE275C4D14BF6C5600265960 /* HSColumns2.m */, - CE275C4E14BF6C5600265960 /* HSOutline2.h */, - CE275C4F14BF6C5600265960 /* HSOutline2.m */, - CE9FC23714C08A92005C31FD /* HSGUIController2.h */, - CE9FC23814C08A92005C31FD /* HSGUIController2.m */, - CE9FC23414C08A73005C31FD /* HSTable2.h */, - CE9FC23514C08A7E005C31FD /* HSTable2.m */, - CE548CBC14BF902000D180CB /* HSPopUpList2.h */, - CE548CBD14BF902000D180CB /* HSPopUpList2.m */, - CE548CBE14BF902000D180CB /* HSSelectableList2.h */, - CE548CBF14BF902000D180CB /* HSSelectableList2.m */, + CEEF2A3014C0B9050082545A /* HSColumns.h */, + CEEF2A3114C0B9050082545A /* HSColumns.m */, + CEEF2A3214C0B9050082545A /* HSGUIController.h */, + CEEF2A3314C0B9050082545A /* HSGUIController.m */, + CEEF2A3414C0B9050082545A /* HSOutline.h */, + CEEF2A3514C0B9050082545A /* HSOutline.m */, + CEEF2A3614C0B9050082545A /* HSPopUpList.h */, + CEEF2A3714C0B9050082545A /* HSPopUpList.m */, + CEEF2A3814C0B9050082545A /* HSSelectableList.h */, + CEEF2A3914C0B9050082545A /* HSSelectableList.m */, + CEEF2A3A14C0B9050082545A /* HSTable.h */, + CEEF2A3B14C0B9050082545A /* HSTable.m */, ); name = controllers; path = ../../cocoalib/controllers; sourceTree = SOURCE_ROOT; }; - CEEF2A1014C09EDF0082545A /* proxies */ = { - isa = PBXGroup; - children = ( - CEEF2A1114C09EDF0082545A /* PyColumns.h */, - CEEF2A1214C09EDF0082545A /* PyGUI.h */, - CEEF2A1314C09EDF0082545A /* PyOutline.h */, - CEEF2A1414C09EDF0082545A /* PySelectableList.h */, - CEEF2A1514C09EDF0082545A /* PyTable.h */, - ); - name = proxies; - path = ../../cocoalib/proxies; - sourceTree = ""; - }; CEEFC0CA10943849001F3A39 /* xib */ = { isa = PBXGroup; children = ( @@ -526,7 +519,6 @@ CEFC7F890FC9513600CD5728 /* cocoalib */ = { isa = PBXGroup; children = ( - CEEF2A1014C09EDF0082545A /* proxies */, CE76FDF5111EE561006618EA /* NSEventAdditions.h */, CE76FDF6111EE561006618EA /* NSEventAdditions.m */, CE76FDC7111EE38E006618EA /* controllers */, @@ -539,16 +531,15 @@ CEFC7F8D0FC9517500CD5728 /* HSErrorReportWindow.m */, CE79638A12536F4E008D405B /* HSFairwareReminder.h */, CE79638B12536F4E008D405B /* HSFairwareReminder.m */, - CE79638212536C6E008D405B /* PyFairware.h */, CE27D3C212CCA43800859E67 /* HSAboutBox.h */, CE27D3C312CCA43800859E67 /* HSAboutBox.m */, CEF0ACCC12DF3C2000B32F7E /* HSRecentFiles.h */, CEF0ACCD12DF3C2000B32F7E /* HSRecentFiles.m */, CE5335FA142BBFAF008E5374 /* HSQuicklook.h */, CE5335FB142BBFAF008E5374 /* HSQuicklook.m */, + CEEF2A4214C0BB430082545A /* Worker.h */, CEFC7F900FC9517500CD5728 /* ProgressController.h */, CEFC7F910FC9517500CD5728 /* ProgressController.m */, - CEFC7F920FC9517500CD5728 /* PyApp.h */, CEFC7F9A0FC9517500CD5728 /* Utils.h */, CEFC7F9B0FC9517500CD5728 /* Utils.m */, CEFC7F9C0FC9517500CD5728 /* ValueTransformers.h */, @@ -576,7 +567,6 @@ CEFC7FB50FC951A700CD5728 /* DirectoryPanel.m */, CE665B2D13225ADD003F5CFB /* ExtraFairwareReminder.h */, CE665B2E13225ADD003F5CFB /* ExtraFairwareReminder.m */, - CEFC7FB60FC951A700CD5728 /* PyDupeGuru.h */, CEFC7FB70FC951A700CD5728 /* ResultWindow.h */, CEFC7FB80FC951A700CD5728 /* ResultWindow.m */, CE647E541173024A006D28BA /* ProblemDialog.h */, @@ -713,22 +703,25 @@ CE1D091914BE0C6400CA6B8C /* PyStatsLabel.m in Sources */, CE9D842A14BE2AE900184165 /* PyExtraFairwareReminder.m in Sources */, CE3A3B4914BF19B8007898AB /* PyDetailsPanel.m in Sources */, - CE275C5014BF6C5600265960 /* HSColumns2.m in Sources */, - CE275C5114BF6C5600265960 /* HSOutline2.m in Sources */, CE275C5714BF712B00265960 /* PyDirectoryOutline.m in Sources */, - CE275C5A14BF71DF00265960 /* PyColumns2.m in Sources */, - CE548CC014BF902000D180CB /* HSPopUpList2.m in Sources */, - CE548CC114BF902000D180CB /* HSSelectableList2.m in Sources */, + CE275C5A14BF71DF00265960 /* PyColumns.m in Sources */, CE548CC614BF903D00D180CB /* PyPrioritizeDialog.m in Sources */, CE548CC714BF903D00D180CB /* PyPrioritizeList.m in Sources */, - CE587E9A14C07BCF004CA031 /* PyOutline2.m in Sources */, - CE587E9E14C0801F004CA031 /* PySelectableList2.m in Sources */, - CE9FC22D14C080CF005C31FD /* PyGUIObject2.m in Sources */, - CE9FC23014C08622005C31FD /* PyTable2.m in Sources */, + CE587E9A14C07BCF004CA031 /* PyOutline.m in Sources */, + CE587E9E14C0801F004CA031 /* PySelectableList.m in Sources */, + CE9FC22D14C080CF005C31FD /* PyGUIObject.m in Sources */, + CE9FC23014C08622005C31FD /* PyTable.m in Sources */, CE9FC23314C0866F005C31FD /* PyResultTable.m in Sources */, - CE9FC23614C08A7E005C31FD /* HSTable2.m in Sources */, - CE9FC23914C08A92005C31FD /* HSGUIController2.m in Sources */, CE4746D314C09C12001A66DE /* PyProblemDialog.m in Sources */, + CEEF2A1814C0A5A60082545A /* PyDupeGuru.m in Sources */, + CEEF2A1D14C0A8480082545A /* PyDupeGuruBase.m in Sources */, + CEEF2A1E14C0A8480082545A /* PyFairware.m in Sources */, + CEEF2A3C14C0B9050082545A /* HSColumns.m in Sources */, + CEEF2A3D14C0B9050082545A /* HSGUIController.m in Sources */, + CEEF2A3E14C0B9050082545A /* HSOutline.m in Sources */, + CEEF2A3F14C0B9050082545A /* HSPopUpList.m in Sources */, + CEEF2A4014C0B9050082545A /* HSSelectableList.m in Sources */, + CEEF2A4114C0B9050082545A /* HSTable.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; From 55db21f3e083ff1ff380c2644c608225c0d37f1e Mon Sep 17 00:00:00 2001 From: Virgil Dupras Date: Fri, 13 Jan 2012 15:25:34 -0500 Subject: [PATCH 15/26] Removed temporary objp conversion hacks. --HG-- branch : objp --- build.py | 2 +- cocoa/base/AppDelegate.m | 4 ++-- cocoa/base/DetailsPanel.h | 7 ++++--- cocoa/base/DetailsPanel.m | 20 ++++++++++---------- cocoa/base/DirectoryOutline.h | 3 ++- cocoa/base/DirectoryOutline.m | 4 ++-- cocoa/base/DirectoryPanel.m | 2 +- cocoa/base/ExtraFairwareReminder.h | 6 +++--- cocoa/base/ExtraFairwareReminder.m | 16 ++++++++-------- cocoa/base/PrioritizeDialog.h | 6 +++--- cocoa/base/PrioritizeDialog.m | 25 +++++++++++++------------ cocoa/base/ProblemDialog.h | 2 +- cocoa/base/ProblemDialog.m | 4 ++-- cocoa/base/ResultTable.h | 2 +- cocoa/base/ResultTable.m | 4 ++-- cocoa/base/ResultWindow.m | 10 +++++----- cocoa/base/StatsLabel.h | 10 ++++------ cocoa/base/StatsLabel.m | 22 +++++++++++----------- cocoa/inter/app.py | 5 ++++- cocoa/inter/app_se.py | 2 -- cocoa/inter/details_panel.py | 2 +- cocoa/inter/directory_outline.py | 2 +- cocoa/inter/extra_fairware_reminder.py | 2 +- cocoa/inter/prioritize_dialog.py | 2 +- cocoa/inter/prioritize_list.py | 2 +- cocoa/inter/problem_dialog.py | 2 +- cocoa/inter/result_table.py | 2 +- cocoa/inter/stats_label.py | 2 +- cocoa/se/dg_cocoa.py | 2 +- 29 files changed, 88 insertions(+), 86 deletions(-) diff --git a/build.py b/build.py index 5da7bcc2..9a86657c 100644 --- a/build.py +++ b/build.py @@ -179,7 +179,7 @@ def build_cocoa_bridging_interfaces(): import objp.p2o add_to_pythonpath('cocoa') add_to_pythonpath('cocoalib') - from cocoa.inter2 import (PyGUIObject, GUIObjectView, PyColumns, ColumnsView, PyOutline, + from cocoa.inter import (PyGUIObject, GUIObjectView, PyColumns, ColumnsView, PyOutline, OutlineView, PySelectableList, SelectableListView, PyTable, TableView, PyFairware) from inter.details_panel import PyDetailsPanel, DetailsPanelView from inter.directory_outline import PyDirectoryOutline, DirectoryOutlineView diff --git a/cocoa/base/AppDelegate.m b/cocoa/base/AppDelegate.m index a96f7d39..bfeb789e 100644 --- a/cocoa/base/AppDelegate.m +++ b/cocoa/base/AppDelegate.m @@ -62,7 +62,7 @@ http://www.hardcoded.net/licenses/bsd_license - (DetailsPanel *)createDetailsPanel { - return [[DetailsPanel alloc] init]; + return [[DetailsPanel alloc] initWithPyRef:[model detailsPanel]]; } - (NSString *)homepageURL @@ -210,7 +210,7 @@ http://www.hardcoded.net/licenses/bsd_license /* model --> view */ - (void)showExtraFairwareReminder { - ExtraFairwareReminder *dialog = [[ExtraFairwareReminder alloc] init]; + ExtraFairwareReminder *dialog = [[ExtraFairwareReminder alloc] initWithPyRef:[model extraFairwareReminder]]; [dialog start]; [NSApp runModalForWindow:[dialog window]]; [dialog close]; diff --git a/cocoa/base/DetailsPanel.h b/cocoa/base/DetailsPanel.h index b2e8f292..221be96f 100644 --- a/cocoa/base/DetailsPanel.h +++ b/cocoa/base/DetailsPanel.h @@ -7,16 +7,17 @@ http://www.hardcoded.net/licenses/bsd_license */ #import +#import #import "PyDetailsPanel.h" @interface DetailsPanel : NSWindowController { IBOutlet NSTableView *detailsTable; - PyDetailsPanel *py; + PyDetailsPanel *model; } -- (id)init; -- (PyDetailsPanel *)py; +- (id)initWithPyRef:(PyObject *)aPyRef; +- (PyDetailsPanel *)model; - (BOOL)isVisible; - (void)toggleVisibility; diff --git a/cocoa/base/DetailsPanel.m b/cocoa/base/DetailsPanel.m index ce49743c..d3dd50e8 100644 --- a/cocoa/base/DetailsPanel.m +++ b/cocoa/base/DetailsPanel.m @@ -10,26 +10,26 @@ http://www.hardcoded.net/licenses/bsd_license #import "Utils.h" @implementation DetailsPanel -- (id)init +- (id)initWithPyRef:(PyObject *)aPyRef { self = [super initWithWindowNibName:@"DetailsPanel"]; [self window]; //So the detailsTable is initialized. - py = [[PyDetailsPanel alloc] initWithModel:findHackishModel(@"details_panel")]; - [py bindCallback:createCallback(@"DetailsPanelView", self)]; - [py connect]; + model = [[PyDetailsPanel alloc] initWithModel:aPyRef]; + [model bindCallback:createCallback(@"DetailsPanelView", self)]; + [model connect]; return self; } - (void)dealloc { - [py disconnect]; - [py release]; + [model disconnect]; + [model release]; [super dealloc]; } -- (PyDetailsPanel *)py +- (PyDetailsPanel *)model { - return (PyDetailsPanel *)py; + return (PyDetailsPanel *)model; } - (void)refreshDetails @@ -56,12 +56,12 @@ http://www.hardcoded.net/licenses/bsd_license /* NSTableView Delegate */ - (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView { - return [[self py] numberOfRows]; + return [[self model] numberOfRows]; } - (id)tableView:(NSTableView *)tableView objectValueForTableColumn:(NSTableColumn *)column row:(NSInteger)row { - return [[self py] valueForColumn:[column identifier] row:row]; + return [[self model] valueForColumn:[column identifier] row:row]; } /* Python --> Cocoa */ diff --git a/cocoa/base/DirectoryOutline.h b/cocoa/base/DirectoryOutline.h index d1552a02..05a5e739 100644 --- a/cocoa/base/DirectoryOutline.h +++ b/cocoa/base/DirectoryOutline.h @@ -7,12 +7,13 @@ http://www.hardcoded.net/licenses/bsd_license */ #import +#import #import "HSOutline.h" #import "PyDirectoryOutline.h" #define DGAddedFoldersNotification @"DGAddedFoldersNotification" @interface DirectoryOutline : HSOutline {} -- (id)initWithOutlineView:(HSOutlineView *)aOutlineView; +- (id)initWithPyRef:(PyObject *)aPyRef outlineView:(HSOutlineView *)aOutlineView; - (PyDirectoryOutline *)py; @end; \ No newline at end of file diff --git a/cocoa/base/DirectoryOutline.m b/cocoa/base/DirectoryOutline.m index 086fe5d6..b38646d8 100644 --- a/cocoa/base/DirectoryOutline.m +++ b/cocoa/base/DirectoryOutline.m @@ -10,9 +10,9 @@ http://www.hardcoded.net/licenses/bsd_license #import "Utils.h" @implementation DirectoryOutline -- (id)initWithOutlineView:(HSOutlineView *)aOutlineView +- (id)initWithPyRef:(PyObject *)aPyRef outlineView:(HSOutlineView *)aOutlineView { - PyDirectoryOutline *model = [[PyDirectoryOutline alloc] initWithModel:findHackishModel(@"directory_tree")]; + PyDirectoryOutline *model = [[PyDirectoryOutline alloc] initWithModel:aPyRef]; self = [super initWithPy:model view:aOutlineView]; [model bindCallback:createCallback(@"DirectoryOutlineView", self)]; [model release]; diff --git a/cocoa/base/DirectoryPanel.m b/cocoa/base/DirectoryPanel.m index 28187046..33dc4f4e 100644 --- a/cocoa/base/DirectoryPanel.m +++ b/cocoa/base/DirectoryPanel.m @@ -24,7 +24,7 @@ http://www.hardcoded.net/licenses/bsd_license [self fillPopUpMenu]; _recentDirectories = [[HSRecentFiles alloc] initWithName:@"recentDirectories" menu:[addButtonPopUp menu]]; [_recentDirectories setDelegate:self]; - outline = [[DirectoryOutline alloc] initWithOutlineView:outlineView]; + outline = [[DirectoryOutline alloc] initWithPyRef:[model directoryTree] outlineView:outlineView]; [self refreshRemoveButtonText]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(directorySelectionChanged:) name:NSOutlineViewSelectionDidChangeNotification object:outlineView]; diff --git a/cocoa/base/ExtraFairwareReminder.h b/cocoa/base/ExtraFairwareReminder.h index 90b27209..ff2ea08a 100644 --- a/cocoa/base/ExtraFairwareReminder.h +++ b/cocoa/base/ExtraFairwareReminder.h @@ -13,11 +13,11 @@ http://www.hardcoded.net/licenses/bsd_license { IBOutlet NSButton *continueButton; - PyExtraFairwareReminder *py; + PyExtraFairwareReminder *model; NSTimer *timer; } -- (id)init; -- (PyExtraFairwareReminder *)py; +- (id)initWithPyRef:(PyObject *)aPyRef; +- (PyExtraFairwareReminder *)model; - (void)start; - (void)updateButton; diff --git a/cocoa/base/ExtraFairwareReminder.m b/cocoa/base/ExtraFairwareReminder.m index ff044198..8643dfd4 100644 --- a/cocoa/base/ExtraFairwareReminder.m +++ b/cocoa/base/ExtraFairwareReminder.m @@ -10,36 +10,36 @@ http://www.hardcoded.net/licenses/bsd_license #import "Utils.h" @implementation ExtraFairwareReminder -- (id)init +- (id)initWithPyRef:(PyObject *)aPyRef { self = [super initWithWindowNibName:@"ExtraFairwareReminder"]; [self window]; [continueButton setEnabled:NO]; - py = [[PyExtraFairwareReminder alloc] initWithModel:findHackishModel(@"extra_fairware_reminder")]; - [py bindCallback:createCallback(@"ExtraFairwareReminderView", self)]; + model = [[PyExtraFairwareReminder alloc] initWithModel:aPyRef]; + [model bindCallback:createCallback(@"ExtraFairwareReminderView", self)]; return self; } - (void)dealloc { - [py release]; + [model release]; [timer release]; [super dealloc]; } -- (PyExtraFairwareReminder *)py +- (PyExtraFairwareReminder *)model { - return (PyExtraFairwareReminder *)py; + return (PyExtraFairwareReminder *)model; } - (void)start { - [[self py] start]; + [[self model] start]; } - (void)updateButton { - [[self py] updateButton]; + [[self model] updateButton]; } - (IBAction)continue:(id)sender diff --git a/cocoa/base/PrioritizeDialog.h b/cocoa/base/PrioritizeDialog.h index 7c3ca852..e425ccd4 100644 --- a/cocoa/base/PrioritizeDialog.h +++ b/cocoa/base/PrioritizeDialog.h @@ -18,13 +18,13 @@ http://www.hardcoded.net/licenses/bsd_license IBOutlet NSTableView *criteriaTableView; IBOutlet NSTableView *prioritizationTableView; - PyPrioritizeDialog *py; + PyPrioritizeDialog *model; HSPopUpList *categoryPopUp; HSSelectableList *criteriaList; PrioritizeList *prioritizationList; } -- (id)init; -- (PyPrioritizeDialog *)py; +- (id)initWithPyRef:(PyObject *)aPyRef; +- (PyPrioritizeDialog *)model; - (IBAction)addSelected:(id)sender; - (IBAction)removeSelected:(id)sender; diff --git a/cocoa/base/PrioritizeDialog.m b/cocoa/base/PrioritizeDialog.m index 9f06b24e..51a4428b 100644 --- a/cocoa/base/PrioritizeDialog.m +++ b/cocoa/base/PrioritizeDialog.m @@ -10,41 +10,42 @@ http://www.hardcoded.net/licenses/bsd_license #import "Utils.h" @implementation PrioritizeDialog -- (id)init +- (id)initWithPyRef:(PyObject *)aPyRef { self = [super initWithWindowNibName:@"PrioritizeDialog"]; [self window]; - py = [[PyPrioritizeDialog alloc] initWithModel:findHackishModel(@"prioritize_dialog")]; - [py bindCallback:createCallback(@"PrioritizeDialogView", self)]; - categoryPopUp = [[HSPopUpList alloc] initWithPyRef:[[self py] categoryList] popupView:categoryPopUpView]; - criteriaList = [[HSSelectableList alloc] initWithPyRef:[[self py] criteriaList] tableView:criteriaTableView]; - prioritizationList = [[PrioritizeList alloc] initWithPyRef:[[self py] prioritizationList] tableView:prioritizationTableView]; - [py connect]; + model = [[PyPrioritizeDialog alloc] initWithModel:aPyRef]; + [model bindCallback:createCallback(@"PrioritizeDialogView", self)]; + categoryPopUp = [[HSPopUpList alloc] initWithPyRef:[[self model] categoryList] popupView:categoryPopUpView]; + criteriaList = [[HSSelectableList alloc] initWithPyRef:[[self model] criteriaList] tableView:criteriaTableView]; + prioritizationList = [[PrioritizeList alloc] initWithPyRef:[[self model] prioritizationList] tableView:prioritizationTableView]; + [model connect]; return self; } - (void)dealloc { - [py disconnect]; + [model disconnect]; [categoryPopUp release]; [criteriaList release]; [prioritizationList release]; + [model release]; [super dealloc]; } -- (PyPrioritizeDialog *)py +- (PyPrioritizeDialog *)model { - return (PyPrioritizeDialog *)py; + return (PyPrioritizeDialog *)model; } - (IBAction)addSelected:(id)sender { - [[self py] addSelected]; + [[self model] addSelected]; } - (IBAction)removeSelected:(id)sender { - [[self py] removeSelected]; + [[self model] removeSelected]; } - (IBAction)ok:(id)sender diff --git a/cocoa/base/ProblemDialog.h b/cocoa/base/ProblemDialog.h index 4359081e..4c1bbd06 100644 --- a/cocoa/base/ProblemDialog.h +++ b/cocoa/base/ProblemDialog.h @@ -17,7 +17,7 @@ http://www.hardcoded.net/licenses/bsd_license PyProblemDialog *model; HSTable *problemTable; } -- (id)init; +- (id)initWithPyRef:(PyObject *)aPyRef; - (void)initializeColumns; - (IBAction)revealSelected:(id)sender; diff --git a/cocoa/base/ProblemDialog.m b/cocoa/base/ProblemDialog.m index d356a404..37af4e80 100644 --- a/cocoa/base/ProblemDialog.m +++ b/cocoa/base/ProblemDialog.m @@ -10,11 +10,11 @@ http://www.hardcoded.net/licenses/bsd_license #import "Utils.h" @implementation ProblemDialog -- (id)init +- (id)initWithPyRef:(PyObject *)aPyRef { self = [super initWithWindowNibName:@"ProblemDialog"]; [self window]; //So the detailsTable is initialized. - model = [[PyProblemDialog alloc] initWithModel:findHackishModel(@"problem_dialog")]; + model = [[PyProblemDialog alloc] initWithModel:aPyRef]; problemTable = [[HSTable alloc] initWithPyRef:[model problemTable] tableView:problemTableView]; [self initializeColumns]; [model connect]; diff --git a/cocoa/base/ResultTable.h b/cocoa/base/ResultTable.h index 3b6fd43c..071f9a0c 100644 --- a/cocoa/base/ResultTable.h +++ b/cocoa/base/ResultTable.h @@ -15,7 +15,7 @@ http://www.hardcoded.net/licenses/bsd_license { NSSet *_deltaColumns; } -- (id)initWithView:(NSTableView *)aTableView; +- (id)initWithPyRef:(PyObject *)aPyRef view:(NSTableView *)aTableView; - (PyResultTable *)model; - (BOOL)powerMarkerMode; - (void)setPowerMarkerMode:(BOOL)aPowerMarkerMode; diff --git a/cocoa/base/ResultTable.m b/cocoa/base/ResultTable.m index 095ba859..19b57b50 100644 --- a/cocoa/base/ResultTable.m +++ b/cocoa/base/ResultTable.m @@ -18,9 +18,9 @@ http://www.hardcoded.net/licenses/bsd_license @end @implementation ResultTable -- (id)initWithView:(NSTableView *)aTableView; +- (id)initWithPyRef:(PyObject *)aPyRef view:(NSTableView *)aTableView { - PyResultTable *m = [[PyResultTable alloc] initWithModel:findHackishModel(@"result_table")]; + PyResultTable *m = [[PyResultTable alloc] initWithModel:aPyRef]; self = [super initWithModel:m tableView:aTableView]; [m bindCallback:createCallback(@"ResultTableView", self)]; [m release]; diff --git a/cocoa/base/ResultWindow.m b/cocoa/base/ResultWindow.m index f9e6431f..868a3d51 100644 --- a/cocoa/base/ResultWindow.m +++ b/cocoa/base/ResultWindow.m @@ -24,9 +24,9 @@ http://www.hardcoded.net/licenses/bsd_license columnsMenu = [app columnsMenu]; /* Put a cute iTunes-like bottom bar */ [[self window] setContentBorderThickness:28 forEdge:NSMinYEdge]; - table = [[ResultTable alloc] initWithView:matches]; - statsLabel = [[StatsLabel alloc] initWithLabelView:stats]; - problemDialog = [[ProblemDialog alloc] init]; + table = [[ResultTable alloc] initWithPyRef:[model resultTable] view:matches]; + statsLabel = [[StatsLabel alloc] initWithPyRef:[model statsLabel] view:stats]; + problemDialog = [[ProblemDialog alloc] initWithPyRef:[model problemDialog]]; [self initResultColumns]; [self fillColumnsMenu]; [matches setTarget:self]; @@ -272,10 +272,10 @@ http://www.hardcoded.net/licenses/bsd_license - (IBAction)reprioritizeResults:(id)sender { - PrioritizeDialog *dlg = [[PrioritizeDialog alloc] init]; + PrioritizeDialog *dlg = [[PrioritizeDialog alloc] initWithPyRef:[model prioritizeDialog]]; NSInteger result = [NSApp runModalForWindow:[dlg window]]; if (result == NSRunStoppedResponse) { - [[dlg py] performReprioritization]; + [[dlg model] performReprioritization]; } [dlg release]; [[self window] makeKeyAndOrderFront:nil]; diff --git a/cocoa/base/StatsLabel.h b/cocoa/base/StatsLabel.h index 7fbc677d..00c040f4 100644 --- a/cocoa/base/StatsLabel.h +++ b/cocoa/base/StatsLabel.h @@ -7,13 +7,11 @@ http://www.hardcoded.net/licenses/bsd_license */ #import +#import "HSGUIController.h" #import "PyStatsLabel.h" -@interface StatsLabel : NSObject { - PyStatsLabel *py; - NSTextField *view; -} -- (id)initWithLabelView:(NSTextField *)aLabelView; -- (PyStatsLabel *)py; +@interface StatsLabel : HSGUIController {} +- (id)initWithPyRef:(PyObject *)aPyRef view:(NSTextField *)aLabelView; +- (PyStatsLabel *)model; - (NSTextField *)labelView; @end \ No newline at end of file diff --git a/cocoa/base/StatsLabel.m b/cocoa/base/StatsLabel.m index 8cca04ed..15881688 100644 --- a/cocoa/base/StatsLabel.m +++ b/cocoa/base/StatsLabel.m @@ -10,27 +10,27 @@ http://www.hardcoded.net/licenses/bsd_license #import "Utils.h" @implementation StatsLabel -- (id)initWithLabelView:(NSTextField *)aLabelView +- (id)initWithPyRef:(PyObject *)aPyRef view:(NSTextField *)aLabelView { - self = [self init]; - view = [aLabelView retain]; - py = [[PyStatsLabel alloc] initWithModel:findHackishModel(@"stats_label")]; - [py bindCallback:createCallback(@"StatsLabelView", self)]; - [[self py] connect]; + PyStatsLabel *m = [[PyStatsLabel alloc] initWithModel:aPyRef]; + self = [self initWithModel:m view:aLabelView]; + [m bindCallback:createCallback(@"StatsLabelView", self)]; + [m connect]; + [m release]; return self; } - (void)dealloc { - [[self py] disconnect]; - [py release]; + [[self model] disconnect]; + [model release]; [view release]; [super dealloc]; } -- (PyStatsLabel *)py +- (PyStatsLabel *)model { - return (PyStatsLabel *)py; + return (PyStatsLabel *)model; } - (NSTextField *)labelView @@ -41,6 +41,6 @@ http://www.hardcoded.net/licenses/bsd_license /* Python --> Cocoa */ - (void)refresh { - [[self labelView] setStringValue:[[self py] display]]; + [[self labelView] setStringValue:[[self model] display]]; } @end diff --git a/cocoa/inter/app.py b/cocoa/inter/app.py index 97893301..371fe11b 100644 --- a/cocoa/inter/app.py +++ b/cocoa/inter/app.py @@ -4,7 +4,7 @@ from objp.util import pyref, dontwrap from jobprogress import job import cocoa from cocoa import install_exception_hook, proxy -from cocoa.inter2 import PyFairware, FairwareView +from cocoa.inter import PyFairware, FairwareView from hscommon.trans import trget from core.app import JobType @@ -45,6 +45,9 @@ class PyDupeGuruBase(PyFairware): def prioritizeDialog(self) -> pyref: return self.model.prioritize_dialog + def problemDialog(self) -> pyref: + return self.model.problem_dialog + def statsLabel(self) -> pyref: return self.model.stats_label diff --git a/cocoa/inter/app_se.py b/cocoa/inter/app_se.py index 3ac3de6d..4663baa7 100644 --- a/cocoa/inter/app_se.py +++ b/cocoa/inter/app_se.py @@ -76,8 +76,6 @@ class DupeGuru(DupeGuruBase): class PyDupeGuru(PyDupeGuruBase): def __init__(self): self._init(DupeGuru) - import __main__ - __main__.APP_INSTANCE = self.model #---Properties def setMinMatchPercentage_(self, percentage: int): diff --git a/cocoa/inter/details_panel.py b/cocoa/inter/details_panel.py index 4ac39d9a..b68f8d01 100644 --- a/cocoa/inter/details_panel.py +++ b/cocoa/inter/details_panel.py @@ -1,4 +1,4 @@ -from cocoa.inter2 import PyGUIObject, GUIObjectView +from cocoa.inter import PyGUIObject, GUIObjectView class DetailsPanelView(GUIObjectView): pass diff --git a/cocoa/inter/directory_outline.py b/cocoa/inter/directory_outline.py index 127f6640..0b83692d 100644 --- a/cocoa/inter/directory_outline.py +++ b/cocoa/inter/directory_outline.py @@ -1,5 +1,5 @@ from objp.util import dontwrap -from cocoa.inter2 import PyOutline, GUIObjectView +from cocoa.inter import PyOutline, GUIObjectView class DirectoryOutlineView(GUIObjectView): pass diff --git a/cocoa/inter/extra_fairware_reminder.py b/cocoa/inter/extra_fairware_reminder.py index 47b9871c..895482ff 100644 --- a/cocoa/inter/extra_fairware_reminder.py +++ b/cocoa/inter/extra_fairware_reminder.py @@ -1,5 +1,5 @@ from objp.util import dontwrap -from cocoa.inter2 import PyGUIObject +from cocoa.inter import PyGUIObject class ExtraFairwareReminderView: def startTimer(self): pass diff --git a/cocoa/inter/prioritize_dialog.py b/cocoa/inter/prioritize_dialog.py index 63da1de2..8f9d43f8 100644 --- a/cocoa/inter/prioritize_dialog.py +++ b/cocoa/inter/prioritize_dialog.py @@ -1,5 +1,5 @@ from objp.util import pyref -from cocoa.inter2 import PyGUIObject, GUIObjectView +from cocoa.inter import PyGUIObject, GUIObjectView class PrioritizeDialogView(GUIObjectView): pass diff --git a/cocoa/inter/prioritize_list.py b/cocoa/inter/prioritize_list.py index 171c2a23..d9e86a0e 100644 --- a/cocoa/inter/prioritize_list.py +++ b/cocoa/inter/prioritize_list.py @@ -1,4 +1,4 @@ -from cocoa.inter2 import PySelectableList, SelectableListView +from cocoa.inter import PySelectableList, SelectableListView class PrioritizeListView(SelectableListView): pass diff --git a/cocoa/inter/problem_dialog.py b/cocoa/inter/problem_dialog.py index b5fabaa5..f65f6145 100644 --- a/cocoa/inter/problem_dialog.py +++ b/cocoa/inter/problem_dialog.py @@ -1,5 +1,5 @@ from objp.util import pyref -from cocoa.inter2 import PyGUIObject +from cocoa.inter import PyGUIObject class PyProblemDialog(PyGUIObject): def problemTable(self) -> pyref: diff --git a/cocoa/inter/result_table.py b/cocoa/inter/result_table.py index 2b8701ed..91d36e9f 100644 --- a/cocoa/inter/result_table.py +++ b/cocoa/inter/result_table.py @@ -1,5 +1,5 @@ from objp.util import dontwrap -from cocoa.inter2 import PyTable, TableView +from cocoa.inter import PyTable, TableView class ResultTableView(TableView): def invalidateMarkings(self): pass diff --git a/cocoa/inter/stats_label.py b/cocoa/inter/stats_label.py index b36fbcb0..dafbe516 100644 --- a/cocoa/inter/stats_label.py +++ b/cocoa/inter/stats_label.py @@ -1,4 +1,4 @@ -from cocoa.inter2 import PyGUIObject, GUIObjectView +from cocoa.inter import PyGUIObject, GUIObjectView class StatsLabelView(GUIObjectView): pass diff --git a/cocoa/se/dg_cocoa.py b/cocoa/se/dg_cocoa.py index a40ecf16..6c9cf09c 100644 --- a/cocoa/se/dg_cocoa.py +++ b/cocoa/se/dg_cocoa.py @@ -7,7 +7,7 @@ from hscommon.trans import install_gettext_trans_under_cocoa install_gettext_trans_under_cocoa() -from cocoa.inter2 import PySelectableList, PyColumns, PyTable +from cocoa.inter import PySelectableList, PyColumns, PyTable from inter.details_panel import PyDetailsPanel from inter.directory_outline import PyDirectoryOutline From 58347bc36ffef2accc9ef078b3e7b04fdef02120 Mon Sep 17 00:00:00 2001 From: Virgil Dupras Date: Fri, 13 Jan 2012 16:14:06 -0500 Subject: [PATCH 16/26] Removed view arguments from core.gui classes's init methods. --HG-- branch : objp --- core/app.py | 12 ++++++------ core/gui/base.py | 7 +++---- core/gui/details_panel.py | 4 ++-- core/gui/directory_tree.py | 4 ++-- core/gui/prioritize_dialog.py | 2 +- core/gui/problem_dialog.py | 6 +++--- core/gui/problem_table.py | 4 ++-- core/gui/result_table.py | 2 +- core/gui/stats_label.py | 1 - 9 files changed, 20 insertions(+), 22 deletions(-) diff --git a/core/app.py b/core/app.py index bbbc20ce..92cf8042 100644 --- a/core/app.py +++ b/core/app.py @@ -106,12 +106,12 @@ class DupeGuru(RegistrableApplication, Broadcaster): 'ignore_hardlink_matches': False, } self.selected_dupes = [] - self.details_panel = DetailsPanel(None, self) - self.directory_tree = DirectoryTree(None, self) - self.extra_fairware_reminder = ExtraFairwareReminder(None, self) - self.prioritize_dialog = PrioritizeDialog(None, self) - self.problem_dialog = ProblemDialog(None, self) - self.stats_label = StatsLabel(None, self) + self.details_panel = DetailsPanel(self) + self.directory_tree = DirectoryTree(self) + self.extra_fairware_reminder = ExtraFairwareReminder(self) + self.prioritize_dialog = PrioritizeDialog(self) + self.problem_dialog = ProblemDialog(self) + self.stats_label = StatsLabel(self) # subclasses must create self.result_table #--- Virtual diff --git a/core/gui/base.py b/core/gui/base.py index d7a4d592..e78ac60d 100644 --- a/core/gui/base.py +++ b/core/gui/base.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- # Created By: Virgil Dupras # Created On: 2010-02-06 # Copyright 2011 Hardcoded Software (http://www.hardcoded.net) @@ -8,12 +7,12 @@ # http://www.hardcoded.net/licenses/bsd_license from hscommon.notify import Listener +from hscommon.gui.base import NoopGUI class GUIObject(Listener): - def __init__(self, view, app): + def __init__(self, app): Listener.__init__(self, app) - if view is not None: - self.view = view + self.view = NoopGUI() self.app = app def directories_changed(self): diff --git a/core/gui/details_panel.py b/core/gui/details_panel.py index 3f418aa6..e1e76d0c 100644 --- a/core/gui/details_panel.py +++ b/core/gui/details_panel.py @@ -9,8 +9,8 @@ from .base import GUIObject class DetailsPanel(GUIObject): - def __init__(self, view, app): - GUIObject.__init__(self, view, app) + def __init__(self, app): + GUIObject.__init__(self, app) self._table = [] def connect(self): diff --git a/core/gui/directory_tree.py b/core/gui/directory_tree.py index 6bba4fd6..7c323feb 100644 --- a/core/gui/directory_tree.py +++ b/core/gui/directory_tree.py @@ -59,8 +59,8 @@ class DirectoryTree(GUIObject, Tree): # refresh() # refresh_states() # when only states label need to be refreshed # - def __init__(self, view, app): - GUIObject.__init__(self, view, app) + def __init__(self, app): + GUIObject.__init__(self, app) Tree.__init__(self) def connect(self): diff --git a/core/gui/prioritize_dialog.py b/core/gui/prioritize_dialog.py index d458f6cb..b7a9b3a1 100644 --- a/core/gui/prioritize_dialog.py +++ b/core/gui/prioritize_dialog.py @@ -40,7 +40,7 @@ class PrioritizationList(GUISelectableList): self._refresh_contents() class PrioritizeDialog: - def __init__(self, view, app): + def __init__(self, app): self.app = app self.categories = [cat(app.results) for cat in app._prioritization_categories()] self.category_list = CriterionCategoryList(self) diff --git a/core/gui/problem_dialog.py b/core/gui/problem_dialog.py index 628b3bf6..b636c4f3 100644 --- a/core/gui/problem_dialog.py +++ b/core/gui/problem_dialog.py @@ -12,11 +12,11 @@ from .base import GUIObject from .problem_table import ProblemTable class ProblemDialog(GUIObject, Broadcaster): - def __init__(self, view, app): - GUIObject.__init__(self, view, app) + def __init__(self, app): + GUIObject.__init__(self, app) Broadcaster.__init__(self) self._selected_dupe = None - self.problem_table = ProblemTable(None, self) + self.problem_table = ProblemTable(self) def reveal_selected_dupe(self): if self._selected_dupe is not None: diff --git a/core/gui/problem_table.py b/core/gui/problem_table.py index 62b04721..3c830b72 100644 --- a/core/gui/problem_table.py +++ b/core/gui/problem_table.py @@ -19,11 +19,11 @@ class ProblemTable(GUITable, Listener): Column('msg', coltr("Error Message")), ] - def __init__(self, view, problem_dialog): + def __init__(self, problem_dialog): GUITable.__init__(self) Listener.__init__(self, problem_dialog) self.columns = Columns(self) - self.view = view + self.view = None self.dialog = problem_dialog #--- Override diff --git a/core/gui/result_table.py b/core/gui/result_table.py index 5c4a8286..7cc7ad62 100644 --- a/core/gui/result_table.py +++ b/core/gui/result_table.py @@ -53,7 +53,7 @@ class DupeRow(Row): class ResultTable(GUIObject, GUITable): def __init__(self, app): - GUIObject.__init__(self, None, app) + GUIObject.__init__(self, app) GUITable.__init__(self) self.columns = Columns(self, prefaccess=app, savename='ResultTable') self._power_marker = False diff --git a/core/gui/stats_label.py b/core/gui/stats_label.py index 2f9d22ba..54c22ac1 100644 --- a/core/gui/stats_label.py +++ b/core/gui/stats_label.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- # Created By: Virgil Dupras # Created On: 2010-02-11 # Copyright 2011 Hardcoded Software (http://www.hardcoded.net) From 9392f818ccf6f5aa52b4d6278805eadbb117fbb9 Mon Sep 17 00:00:00 2001 From: Virgil Dupras Date: Fri, 13 Jan 2012 16:34:21 -0500 Subject: [PATCH 17/26] Pushed connect() calls in objc into the core. --HG-- branch : objp --- cocoa/base/DetailsPanel.m | 2 -- cocoa/base/DirectoryOutline.m | 7 ------- cocoa/base/PrioritizeDialog.m | 2 -- cocoa/base/ProblemDialog.m | 4 ---- cocoa/base/ResultTable.m | 2 -- cocoa/base/StatsLabel.m | 9 --------- core/app.py | 10 +++++++++- core/gui/problem_dialog.py | 1 + core_se/app.py | 7 +++---- 9 files changed, 13 insertions(+), 31 deletions(-) diff --git a/cocoa/base/DetailsPanel.m b/cocoa/base/DetailsPanel.m index d3dd50e8..bb02ff57 100644 --- a/cocoa/base/DetailsPanel.m +++ b/cocoa/base/DetailsPanel.m @@ -16,13 +16,11 @@ http://www.hardcoded.net/licenses/bsd_license [self window]; //So the detailsTable is initialized. model = [[PyDetailsPanel alloc] initWithModel:aPyRef]; [model bindCallback:createCallback(@"DetailsPanelView", self)]; - [model connect]; return self; } - (void)dealloc { - [model disconnect]; [model release]; [super dealloc]; } diff --git a/cocoa/base/DirectoryOutline.m b/cocoa/base/DirectoryOutline.m index b38646d8..caef39c2 100644 --- a/cocoa/base/DirectoryOutline.m +++ b/cocoa/base/DirectoryOutline.m @@ -17,16 +17,9 @@ http://www.hardcoded.net/licenses/bsd_license [model bindCallback:createCallback(@"DirectoryOutlineView", self)]; [model release]; [outlineView registerForDraggedTypes:[NSArray arrayWithObject:NSFilenamesPboardType]]; - [[self py] connect]; return self; } -- (void)dealloc -{ - [[self py] disconnect]; - [super dealloc]; -} - - (PyDirectoryOutline *)py { return (PyDirectoryOutline *)py; diff --git a/cocoa/base/PrioritizeDialog.m b/cocoa/base/PrioritizeDialog.m index 51a4428b..9ef6127b 100644 --- a/cocoa/base/PrioritizeDialog.m +++ b/cocoa/base/PrioritizeDialog.m @@ -19,13 +19,11 @@ http://www.hardcoded.net/licenses/bsd_license categoryPopUp = [[HSPopUpList alloc] initWithPyRef:[[self model] categoryList] popupView:categoryPopUpView]; criteriaList = [[HSSelectableList alloc] initWithPyRef:[[self model] criteriaList] tableView:criteriaTableView]; prioritizationList = [[PrioritizeList alloc] initWithPyRef:[[self model] prioritizationList] tableView:prioritizationTableView]; - [model connect]; return self; } - (void)dealloc { - [model disconnect]; [categoryPopUp release]; [criteriaList release]; [prioritizationList release]; diff --git a/cocoa/base/ProblemDialog.m b/cocoa/base/ProblemDialog.m index 37af4e80..22d7e364 100644 --- a/cocoa/base/ProblemDialog.m +++ b/cocoa/base/ProblemDialog.m @@ -17,15 +17,11 @@ http://www.hardcoded.net/licenses/bsd_license model = [[PyProblemDialog alloc] initWithModel:aPyRef]; problemTable = [[HSTable alloc] initWithPyRef:[model problemTable] tableView:problemTableView]; [self initializeColumns]; - [model connect]; - [[problemTable model] connect]; return self; } - (void)dealloc { - [[problemTable model] disconnect]; - [model disconnect]; [problemTable release]; [model release]; [super dealloc]; diff --git a/cocoa/base/ResultTable.m b/cocoa/base/ResultTable.m index 19b57b50..2c5c1847 100644 --- a/cocoa/base/ResultTable.m +++ b/cocoa/base/ResultTable.m @@ -25,13 +25,11 @@ http://www.hardcoded.net/licenses/bsd_license [m bindCallback:createCallback(@"ResultTableView", self)]; [m release]; _deltaColumns = [[NSSet setWithArray:[[self model] deltaColumns]] retain]; - [model connect]; return self; } - (void)dealloc { - [model disconnect]; [_deltaColumns release]; [super dealloc]; } diff --git a/cocoa/base/StatsLabel.m b/cocoa/base/StatsLabel.m index 15881688..08f94814 100644 --- a/cocoa/base/StatsLabel.m +++ b/cocoa/base/StatsLabel.m @@ -15,19 +15,10 @@ http://www.hardcoded.net/licenses/bsd_license PyStatsLabel *m = [[PyStatsLabel alloc] initWithModel:aPyRef]; self = [self initWithModel:m view:aLabelView]; [m bindCallback:createCallback(@"StatsLabelView", self)]; - [m connect]; [m release]; return self; } -- (void)dealloc -{ - [[self model] disconnect]; - [model release]; - [view release]; - [super dealloc]; -} - - (PyStatsLabel *)model { return (PyStatsLabel *)model; diff --git a/core/app.py b/core/app.py index 92cf8042..36c0d950 100644 --- a/core/app.py +++ b/core/app.py @@ -112,7 +112,12 @@ class DupeGuru(RegistrableApplication, Broadcaster): self.prioritize_dialog = PrioritizeDialog(self) self.problem_dialog = ProblemDialog(self) self.stats_label = StatsLabel(self) - # subclasses must create self.result_table + self.result_table = self._create_result_table() + children = [self.result_table, self.directory_tree, self.problem_dialog, self.stats_label, + self.details_panel] + for child in children: + child.connect() + # subclasses must create and connect self.result_table #--- Virtual def _get_display_info(self, dupe, group, delta): @@ -127,6 +132,9 @@ class DupeGuru(RegistrableApplication, Broadcaster): def _prioritization_categories(self): raise NotImplementedError() + def _create_result_table(self): + raise NotImplementedError() + #--- Private def _do_delete(self, j, replace_with_hardlinks): def op(dupe): diff --git a/core/gui/problem_dialog.py b/core/gui/problem_dialog.py index b636c4f3..a28e75c5 100644 --- a/core/gui/problem_dialog.py +++ b/core/gui/problem_dialog.py @@ -17,6 +17,7 @@ class ProblemDialog(GUIObject, Broadcaster): Broadcaster.__init__(self) self._selected_dupe = None self.problem_table = ProblemTable(self) + self.problem_table.connect() def reveal_selected_dupe(self): if self._selected_dupe is not None: diff --git a/core_se/app.py b/core_se/app.py index 36c9c19e..040bf3f3 100644 --- a/core_se/app.py +++ b/core_se/app.py @@ -17,10 +17,6 @@ class DupeGuru(DupeGuruBase): NAME = __appname__ METADATA_TO_READ = ['size', 'mtime'] - def __init__(self, view, appdata): - DupeGuruBase.__init__(self, view, appdata) - self.result_table = ResultTable(self) - def _get_display_info(self, dupe, group, delta): size = dupe.size mtime = dupe.mtime @@ -67,3 +63,6 @@ class DupeGuru(DupeGuruBase): def _prioritization_categories(self): return prioritize.all_categories() + def _create_result_table(self): + return ResultTable(self) + From 475f2c7238e61f2fb05852aa0b490af60e13f570 Mon Sep 17 00:00:00 2001 From: Virgil Dupras Date: Fri, 13 Jan 2012 17:02:41 -0500 Subject: [PATCH 18/26] Fixed PyDupeGuru which didn't have its callback set. --HG-- branch : objp --- cocoa/base/AppDelegate.m | 1 + 1 file changed, 1 insertion(+) diff --git a/cocoa/base/AppDelegate.m b/cocoa/base/AppDelegate.m index bfeb789e..c31abf10 100644 --- a/cocoa/base/AppDelegate.m +++ b/cocoa/base/AppDelegate.m @@ -26,6 +26,7 @@ http://www.hardcoded.net/licenses/bsd_license - (void)awakeFromNib { model = [[PyDupeGuru alloc] init]; + [model bindCallback:createCallback(@"DupeGuruView", self)]; NSUserDefaults *ud = [NSUserDefaults standardUserDefaults]; /* Because the pref pane is lazily loaded, we have to manually do the update check if the preference is set. From 7a167208d0f546f84a9e5a888d1d90c91c137411 Mon Sep 17 00:00:00 2001 From: Virgil Dupras Date: Fri, 13 Jan 2012 17:03:00 -0500 Subject: [PATCH 19/26] Allow cocoa dev builds again. --HG-- branch : objp --- build.py | 63 ++++++++++++++++++++++++++++---------------------------- 1 file changed, 32 insertions(+), 31 deletions(-) diff --git a/build.py b/build.py index 9a86657c..748a73cb 100644 --- a/build.py +++ b/build.py @@ -17,7 +17,8 @@ from setuptools import setup, Extension from hscommon import sphinxgen from hscommon.build import (add_to_pythonpath, print_and_do, copy_packages, filereplace, - get_module_version, build_all_cocoa_locs, move_all, copy_sysconfig_files_for_embed, copy_all) + get_module_version, build_all_cocoa_locs, move_all, copy_sysconfig_files_for_embed, copy_all, + move) from hscommon import loc def parse_args(): @@ -40,26 +41,31 @@ def build_cocoa(edition, dev): build_cocoa_proxy_module() build_cocoa_bridging_interfaces() print("Building dg_cocoa.plugin") - specific_packages = { - 'se': ['core_se'], - 'me': ['core_me'], - 'pe': ['core_pe'], - }[edition] - tocopy = ['core', 'hscommon', 'cocoa/inter', 'cocoalib/cocoa'] + specific_packages - copy_packages(tocopy, 'build', create_links=dev) - cocoa_project_path = 'cocoa/{0}'.format(edition) - shutil.copy(op.join(cocoa_project_path, 'dg_cocoa.py'), 'build') from pluginbuilder import copy_embeddable_python_dylib, get_python_header_folder, collect_dependencies copy_embeddable_python_dylib('build') if not op.exists('build/PythonHeaders'): os.symlink(get_python_header_folder(), 'build/PythonHeaders') if not op.exists('build/py'): os.mkdir('build/py') - sys.path.insert(0, 'build') - collect_dependencies('build/dg_cocoa.py', 'build/py', excludes=['PyQt4']) + cocoa_project_path = 'cocoa/{0}'.format(edition) + shutil.copy(op.join(cocoa_project_path, 'dg_cocoa.py'), 'build') + specific_packages = { + 'se': ['core_se'], + 'me': ['core_me'], + 'pe': ['core_pe'], + }[edition] + tocopy = ['core', 'hscommon', 'cocoa/inter', 'cocoalib/cocoa'] + specific_packages + if dev: + # collect dependencies, then override our own pckages with symlinks + collect_dependencies('build/dg_cocoa.py', 'build/py', excludes=['PyQt4']) + copy_packages(tocopy, 'build/py', create_links=True) + else: + copy_packages(tocopy, 'build') + sys.path.insert(0, 'build') + collect_dependencies('build/dg_cocoa.py', 'build/py', excludes=['PyQt4']) + del sys.path[0] # Views are not referenced by python code, so they're not found by the collector. copy_all('build/inter/*.so', 'build/py/inter') - del sys.path[0] copy_sysconfig_files_for_embed('build/py') os.chdir(cocoa_project_path) print('Generating Info.plist') @@ -159,19 +165,22 @@ def build_mergepot(): loc.merge_pots_into_pos('locale') loc.merge_pots_into_pos(op.join('hscommon', 'locale')) +def build_cocoa_ext(extname, dest, source_files, extra_frameworks=()): + extra_link_args = ["-framework", "CoreFoundation", "-framework", "Foundation"] + for extra in extra_frameworks: + extra_link_args += ['-framework', extra] + ext = Extension(extname, source_files, extra_link_args=extra_link_args) + setup(script_args=['build_ext', '--inplace'], ext_modules=[ext]) + fn = extname + '.so' + assert op.exists(fn) + move(fn, op.join(dest, fn)) + def build_cocoa_proxy_module(): print("Building Cocoa Proxy") import objp.p2o objp.p2o.generate_python_proxy_code('cocoalib/cocoa/CocoaProxy.h', 'build/CocoaProxy.m') - exts = [ - Extension("CocoaProxy", ['cocoalib/cocoa/CocoaProxy.m', 'build/CocoaProxy.m', 'build/ObjP.m'], - extra_link_args=["-framework", "CoreFoundation", "-framework", "Foundation", "-framework", "AppKit"]), - ] - setup( - script_args = ['build_ext', '--inplace'], - ext_modules = exts, - ) - move_all('CocoaProxy*', 'cocoalib/cocoa') + build_cocoa_ext("CocoaProxy", 'cocoalib/cocoa', + ['cocoalib/cocoa/CocoaProxy.m', 'build/CocoaProxy.m', 'build/ObjP.m'], ['AppKit']) def build_cocoa_bridging_interfaces(): print("Building Cocoa Bridging Interfaces") @@ -204,15 +213,7 @@ def build_cocoa_bridging_interfaces(): clsname = class_.__name__ extmodule_path = op.join('build', clsname + '.m') objp.p2o.generate_python_proxy_code_from_clsspec(clsspec, extmodule_path) - exts = [ - Extension(clsname, [extmodule_path, 'build/ObjP.m'], - extra_link_args=["-framework", "Foundation"]), - ] - setup( - script_args = ['build_ext', '--inplace'], - ext_modules = exts, - ) - move_all('*.so', 'cocoa/inter') + build_cocoa_ext(clsname, 'cocoa/inter', [extmodule_path, 'build/ObjP.m']) def build_pe_modules(ui): print("Building PE Modules") From 017e483b5a8f873877d0fba1642fdf91103f487f Mon Sep 17 00:00:00 2001 From: Virgil Dupras Date: Sun, 15 Jan 2012 11:00:34 -0500 Subject: [PATCH 20/26] Re-added error handling. --HG-- branch : objp --- build.py | 13 ++++++++++--- cocoa/inter/app.py | 1 + cocoa/se/dupeguru.xcodeproj/project.pbxproj | 6 ------ 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/build.py b/build.py index 748a73cb..9b3f85e5 100644 --- a/build.py +++ b/build.py @@ -30,6 +30,8 @@ def parse_args(): help="Build only the help file") parser.add_option('--loc', action='store_true', dest='loc', help="Build only localization") + parser.add_option('--cocoamod', action='store_true', dest='cocoamod', + help="Build only Cocoa modules") parser.add_option('--updatepot', action='store_true', dest='updatepot', help="Generate .pot files from source code.") parser.add_option('--mergepot', action='store_true', dest='mergepot', @@ -165,11 +167,11 @@ def build_mergepot(): loc.merge_pots_into_pos('locale') loc.merge_pots_into_pos(op.join('hscommon', 'locale')) -def build_cocoa_ext(extname, dest, source_files, extra_frameworks=()): +def build_cocoa_ext(extname, dest, source_files, extra_frameworks=(), extra_includes=()): extra_link_args = ["-framework", "CoreFoundation", "-framework", "Foundation"] for extra in extra_frameworks: extra_link_args += ['-framework', extra] - ext = Extension(extname, source_files, extra_link_args=extra_link_args) + ext = Extension(extname, source_files, extra_link_args=extra_link_args, include_dirs=extra_includes) setup(script_args=['build_ext', '--inplace'], ext_modules=[ext]) fn = extname + '.so' assert op.exists(fn) @@ -180,7 +182,9 @@ def build_cocoa_proxy_module(): import objp.p2o objp.p2o.generate_python_proxy_code('cocoalib/cocoa/CocoaProxy.h', 'build/CocoaProxy.m') build_cocoa_ext("CocoaProxy", 'cocoalib/cocoa', - ['cocoalib/cocoa/CocoaProxy.m', 'build/CocoaProxy.m', 'build/ObjP.m'], ['AppKit']) + ['cocoalib/cocoa/CocoaProxy.m', 'build/CocoaProxy.m', 'build/ObjP.m', 'cocoalib/HSErrorReportWindow.m'], + ['AppKit', 'CoreServices'], + ['cocoalib']) def build_cocoa_bridging_interfaces(): print("Building Cocoa Bridging Interfaces") @@ -273,6 +277,9 @@ def main(): build_updatepot() elif options.mergepot: build_mergepot() + elif options.cocoamod: + build_cocoa_proxy_module() + build_cocoa_bridging_interfaces() else: build_normal(edition, ui, dev) diff --git a/cocoa/inter/app.py b/cocoa/inter/app.py index 371fe11b..a82de240 100644 --- a/cocoa/inter/app.py +++ b/cocoa/inter/app.py @@ -25,6 +25,7 @@ class DupeGuruView(FairwareView): class PyDupeGuruBase(PyFairware): FOLLOW_PROTOCOLS = ['Worker'] + @dontwrap def _init(self, modelclass): logging.basicConfig(level=logging.WARNING, format='%(levelname)s %(message)s') install_exception_hook() diff --git a/cocoa/se/dupeguru.xcodeproj/project.pbxproj b/cocoa/se/dupeguru.xcodeproj/project.pbxproj index f1d549c5..0587e7d3 100644 --- a/cocoa/se/dupeguru.xcodeproj/project.pbxproj +++ b/cocoa/se/dupeguru.xcodeproj/project.pbxproj @@ -77,7 +77,6 @@ CEF0ACCE12DF3C2000B32F7E /* HSRecentFiles.m in Sources */ = {isa = PBXBuildFile; fileRef = CEF0ACCD12DF3C2000B32F7E /* HSRecentFiles.m */; }; CEFC294609C89E3D00D9F998 /* folder32.png in Resources */ = {isa = PBXBuildFile; fileRef = CEFC294509C89E3D00D9F998 /* folder32.png */; }; CEFC7F9E0FC9517500CD5728 /* Dialogs.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFC7F8B0FC9517500CD5728 /* Dialogs.m */; }; - CEFC7F9F0FC9517500CD5728 /* HSErrorReportWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFC7F8D0FC9517500CD5728 /* HSErrorReportWindow.m */; }; CEFC7FA10FC9517500CD5728 /* ProgressController.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFC7F910FC9517500CD5728 /* ProgressController.m */; }; CEFC7FA50FC9517500CD5728 /* Utils.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFC7F9B0FC9517500CD5728 /* Utils.m */; }; CEFC7FA60FC9517500CD5728 /* ValueTransformers.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFC7F9D0FC9517500CD5728 /* ValueTransformers.m */; }; @@ -291,8 +290,6 @@ CEFC294509C89E3D00D9F998 /* folder32.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = folder32.png; path = ../../images/folder32.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; }; 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; }; - CEFC7F8D0FC9517500CD5728 /* HSErrorReportWindow.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = HSErrorReportWindow.m; path = ../../cocoalib/HSErrorReportWindow.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; }; CEFC7F910FC9517500CD5728 /* ProgressController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = ProgressController.m; path = ../../cocoalib/ProgressController.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; }; @@ -527,8 +524,6 @@ CEB57990146ADC5100EDF7D7 /* HSConsts.h */, CEFC7F8A0FC9517500CD5728 /* Dialogs.h */, CEFC7F8B0FC9517500CD5728 /* Dialogs.m */, - CEFC7F8C0FC9517500CD5728 /* HSErrorReportWindow.h */, - CEFC7F8D0FC9517500CD5728 /* HSErrorReportWindow.m */, CE79638A12536F4E008D405B /* HSFairwareReminder.h */, CE79638B12536F4E008D405B /* HSFairwareReminder.m */, CE27D3C212CCA43800859E67 /* HSAboutBox.h */, @@ -675,7 +670,6 @@ CE381C9609914ACE003581CE /* AppDelegate.m in Sources */, CE381C9C09914ADF003581CE /* ResultWindow.m in Sources */, CEFC7F9E0FC9517500CD5728 /* Dialogs.m in Sources */, - CEFC7F9F0FC9517500CD5728 /* HSErrorReportWindow.m in Sources */, CEFC7FA10FC9517500CD5728 /* ProgressController.m in Sources */, CEFC7FA50FC9517500CD5728 /* Utils.m in Sources */, CEFC7FA60FC9517500CD5728 /* ValueTransformers.m in Sources */, From 29796e87b7347e5769da69fe206d7456254456d3 Mon Sep 17 00:00:00 2001 From: Virgil Dupras Date: Sun, 15 Jan 2012 11:49:04 -0500 Subject: [PATCH 21/26] Put all cocoa callback views in the same extension module. --HG-- branch : objp --- build.py | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/build.py b/build.py index 9b3f85e5..aa879b5c 100644 --- a/build.py +++ b/build.py @@ -212,12 +212,9 @@ def build_cocoa_bridging_interfaces(): allclasses = [GUIObjectView, ColumnsView, OutlineView, SelectableListView, TableView, DetailsPanelView, DirectoryOutlineView, ExtraFairwareReminderView, PrioritizeDialogView, PrioritizeListView, ResultTableView, StatsLabelView, DupeGuruView] - for class_ in allclasses: - clsspec = objp.o2p.spec_from_python_class(class_) - clsname = class_.__name__ - extmodule_path = op.join('build', clsname + '.m') - objp.p2o.generate_python_proxy_code_from_clsspec(clsspec, extmodule_path) - build_cocoa_ext(clsname, 'cocoa/inter', [extmodule_path, 'build/ObjP.m']) + clsspecs = [objp.o2p.spec_from_python_class(class_) for class_ in allclasses] + objp.p2o.generate_python_proxy_code_from_clsspec(clsspecs, 'build/CocoaViews.m') + build_cocoa_ext('CocoaViews', 'cocoa/inter', ['build/CocoaViews.m', 'build/ObjP.m']) def build_pe_modules(ui): print("Building PE Modules") From baa21774395f320898c29380d5671977e0be04b0 Mon Sep 17 00:00:00 2001 From: Virgil Dupras Date: Sun, 15 Jan 2012 17:24:30 -0500 Subject: [PATCH 22/26] Fixed a bug where re-prioritization criteria list would initially be empty. That was because the dialog was created on launch time rather than on-the-fly. --HG-- branch : objp --- cocoa/base/PrioritizeDialog.h | 3 ++- cocoa/base/PrioritizeDialog.m | 4 ++-- cocoa/base/ResultWindow.m | 2 +- cocoa/inter/app.py | 3 --- cocoa/inter/prioritize_dialog.py | 5 +++++ core/app.py | 2 -- 6 files changed, 10 insertions(+), 9 deletions(-) diff --git a/cocoa/base/PrioritizeDialog.h b/cocoa/base/PrioritizeDialog.h index e425ccd4..406755d7 100644 --- a/cocoa/base/PrioritizeDialog.h +++ b/cocoa/base/PrioritizeDialog.h @@ -11,6 +11,7 @@ http://www.hardcoded.net/licenses/bsd_license #import "HSPopUpList.h" #import "HSSelectableList.h" #import "PrioritizeList.h" +#import "PyDupeGuru.h" @interface PrioritizeDialog : NSWindowController { @@ -23,7 +24,7 @@ http://www.hardcoded.net/licenses/bsd_license HSSelectableList *criteriaList; PrioritizeList *prioritizationList; } -- (id)initWithPyRef:(PyObject *)aPyRef; +- (id)initWithApp:(PyDupeGuru *)aApp; - (PyPrioritizeDialog *)model; - (IBAction)addSelected:(id)sender; diff --git a/cocoa/base/PrioritizeDialog.m b/cocoa/base/PrioritizeDialog.m index 9ef6127b..4a90c1fb 100644 --- a/cocoa/base/PrioritizeDialog.m +++ b/cocoa/base/PrioritizeDialog.m @@ -10,11 +10,11 @@ http://www.hardcoded.net/licenses/bsd_license #import "Utils.h" @implementation PrioritizeDialog -- (id)initWithPyRef:(PyObject *)aPyRef +- (id)initWithApp:(PyDupeGuru *)aApp { self = [super initWithWindowNibName:@"PrioritizeDialog"]; [self window]; - model = [[PyPrioritizeDialog alloc] initWithModel:aPyRef]; + model = [[PyPrioritizeDialog alloc] initWithApp:[aApp pyRef]]; [model bindCallback:createCallback(@"PrioritizeDialogView", self)]; categoryPopUp = [[HSPopUpList alloc] initWithPyRef:[[self model] categoryList] popupView:categoryPopUpView]; criteriaList = [[HSSelectableList alloc] initWithPyRef:[[self model] criteriaList] tableView:criteriaTableView]; diff --git a/cocoa/base/ResultWindow.m b/cocoa/base/ResultWindow.m index 868a3d51..984b7da1 100644 --- a/cocoa/base/ResultWindow.m +++ b/cocoa/base/ResultWindow.m @@ -272,7 +272,7 @@ http://www.hardcoded.net/licenses/bsd_license - (IBAction)reprioritizeResults:(id)sender { - PrioritizeDialog *dlg = [[PrioritizeDialog alloc] initWithPyRef:[model prioritizeDialog]]; + PrioritizeDialog *dlg = [[PrioritizeDialog alloc] initWithApp:model]; NSInteger result = [NSApp runModalForWindow:[dlg window]]; if (result == NSRunStoppedResponse) { [[dlg model] performReprioritization]; diff --git a/cocoa/inter/app.py b/cocoa/inter/app.py index a82de240..9b9c0c31 100644 --- a/cocoa/inter/app.py +++ b/cocoa/inter/app.py @@ -43,9 +43,6 @@ class PyDupeGuruBase(PyFairware): def extraFairwareReminder(self) -> pyref: return self.model.extra_fairware_reminder - def prioritizeDialog(self) -> pyref: - return self.model.prioritize_dialog - def problemDialog(self) -> pyref: return self.model.problem_dialog diff --git a/cocoa/inter/prioritize_dialog.py b/cocoa/inter/prioritize_dialog.py index 8f9d43f8..95a5e086 100644 --- a/cocoa/inter/prioritize_dialog.py +++ b/cocoa/inter/prioritize_dialog.py @@ -1,10 +1,15 @@ from objp.util import pyref from cocoa.inter import PyGUIObject, GUIObjectView +from core.gui.prioritize_dialog import PrioritizeDialog class PrioritizeDialogView(GUIObjectView): pass class PyPrioritizeDialog(PyGUIObject): + def __init__(self, app: pyref): + model = PrioritizeDialog(app.model) + PyGUIObject.__init__(self, model) + def categoryList(self) -> pyref: return self.model.category_list diff --git a/core/app.py b/core/app.py index 36c0d950..29a5a805 100644 --- a/core/app.py +++ b/core/app.py @@ -27,7 +27,6 @@ from . import directories, results, scanner, export, fs from .gui.details_panel import DetailsPanel from .gui.directory_tree import DirectoryTree from .gui.extra_fairware_reminder import ExtraFairwareReminder -from .gui.prioritize_dialog import PrioritizeDialog from .gui.problem_dialog import ProblemDialog from .gui.stats_label import StatsLabel @@ -109,7 +108,6 @@ class DupeGuru(RegistrableApplication, Broadcaster): self.details_panel = DetailsPanel(self) self.directory_tree = DirectoryTree(self) self.extra_fairware_reminder = ExtraFairwareReminder(self) - self.prioritize_dialog = PrioritizeDialog(self) self.problem_dialog = ProblemDialog(self) self.stats_label = StatsLabel(self) self.result_table = self._create_result_table() From 1b571f6fd2773436312ade6a67900bf4c5c11f27 Mon Sep 17 00:00:00 2001 From: Virgil Dupras Date: Sun, 15 Jan 2012 17:31:15 -0500 Subject: [PATCH 23/26] Create the extra fairware reminder on-the-fly rather than on launch time. --HG-- branch : objp --- cocoa/base/AppDelegate.m | 2 +- cocoa/base/ExtraFairwareReminder.h | 3 ++- cocoa/base/ExtraFairwareReminder.m | 4 ++-- cocoa/inter/app.py | 3 --- cocoa/inter/extra_fairware_reminder.py | 7 ++++++- core/app.py | 2 -- 6 files changed, 11 insertions(+), 10 deletions(-) diff --git a/cocoa/base/AppDelegate.m b/cocoa/base/AppDelegate.m index c31abf10..d8660183 100644 --- a/cocoa/base/AppDelegate.m +++ b/cocoa/base/AppDelegate.m @@ -211,7 +211,7 @@ http://www.hardcoded.net/licenses/bsd_license /* model --> view */ - (void)showExtraFairwareReminder { - ExtraFairwareReminder *dialog = [[ExtraFairwareReminder alloc] initWithPyRef:[model extraFairwareReminder]]; + ExtraFairwareReminder *dialog = [[ExtraFairwareReminder alloc] initWithApp:model]; [dialog start]; [NSApp runModalForWindow:[dialog window]]; [dialog close]; diff --git a/cocoa/base/ExtraFairwareReminder.h b/cocoa/base/ExtraFairwareReminder.h index ff2ea08a..cd828417 100644 --- a/cocoa/base/ExtraFairwareReminder.h +++ b/cocoa/base/ExtraFairwareReminder.h @@ -8,6 +8,7 @@ http://www.hardcoded.net/licenses/bsd_license #import #import "PyExtraFairwareReminder.h" +#import "PyDupeGuru.h" @interface ExtraFairwareReminder : NSWindowController { @@ -16,7 +17,7 @@ http://www.hardcoded.net/licenses/bsd_license PyExtraFairwareReminder *model; NSTimer *timer; } -- (id)initWithPyRef:(PyObject *)aPyRef; +- (id)initWithApp:(PyDupeGuru *)aApp; - (PyExtraFairwareReminder *)model; - (void)start; diff --git a/cocoa/base/ExtraFairwareReminder.m b/cocoa/base/ExtraFairwareReminder.m index 8643dfd4..e518585b 100644 --- a/cocoa/base/ExtraFairwareReminder.m +++ b/cocoa/base/ExtraFairwareReminder.m @@ -10,12 +10,12 @@ http://www.hardcoded.net/licenses/bsd_license #import "Utils.h" @implementation ExtraFairwareReminder -- (id)initWithPyRef:(PyObject *)aPyRef +- (id)initWithApp:(PyDupeGuru *)aApp { self = [super initWithWindowNibName:@"ExtraFairwareReminder"]; [self window]; [continueButton setEnabled:NO]; - model = [[PyExtraFairwareReminder alloc] initWithModel:aPyRef]; + model = [[PyExtraFairwareReminder alloc] initWithApp:[aApp pyRef]]; [model bindCallback:createCallback(@"ExtraFairwareReminderView", self)]; return self; } diff --git a/cocoa/inter/app.py b/cocoa/inter/app.py index 9b9c0c31..a4abca3d 100644 --- a/cocoa/inter/app.py +++ b/cocoa/inter/app.py @@ -40,9 +40,6 @@ class PyDupeGuruBase(PyFairware): def directoryTree(self) -> pyref: return self.model.directory_tree - def extraFairwareReminder(self) -> pyref: - return self.model.extra_fairware_reminder - def problemDialog(self) -> pyref: return self.model.problem_dialog diff --git a/cocoa/inter/extra_fairware_reminder.py b/cocoa/inter/extra_fairware_reminder.py index 895482ff..c956a9d3 100644 --- a/cocoa/inter/extra_fairware_reminder.py +++ b/cocoa/inter/extra_fairware_reminder.py @@ -1,5 +1,6 @@ -from objp.util import dontwrap +from objp.util import pyref, dontwrap from cocoa.inter import PyGUIObject +from core.gui.extra_fairware_reminder import ExtraFairwareReminder class ExtraFairwareReminderView: def startTimer(self): pass @@ -8,6 +9,10 @@ class ExtraFairwareReminderView: def enableButton(self): pass class PyExtraFairwareReminder(PyGUIObject): + def __init__(self, app: pyref): + model = ExtraFairwareReminder(app.model) + PyGUIObject.__init__(self, model) + def start(self): self.model.start() diff --git a/core/app.py b/core/app.py index 29a5a805..116706a9 100644 --- a/core/app.py +++ b/core/app.py @@ -26,7 +26,6 @@ from hscommon.trans import tr from . import directories, results, scanner, export, fs from .gui.details_panel import DetailsPanel from .gui.directory_tree import DirectoryTree -from .gui.extra_fairware_reminder import ExtraFairwareReminder from .gui.problem_dialog import ProblemDialog from .gui.stats_label import StatsLabel @@ -107,7 +106,6 @@ class DupeGuru(RegistrableApplication, Broadcaster): self.selected_dupes = [] self.details_panel = DetailsPanel(self) self.directory_tree = DirectoryTree(self) - self.extra_fairware_reminder = ExtraFairwareReminder(self) self.problem_dialog = ProblemDialog(self) self.stats_label = StatsLabel(self) self.result_table = self._create_result_table() From 302050b2d685bbd9ae160b2df88ec0ed17fe98ed Mon Sep 17 00:00:00 2001 From: Virgil Dupras Date: Sun, 15 Jan 2012 18:07:32 -0500 Subject: [PATCH 24/26] Delegate model instantiation to HSGUIController where possible. --HG-- branch : objp --- cocoa/base/DirectoryOutline.h | 2 +- cocoa/base/DirectoryOutline.m | 17 +++++++---------- cocoa/base/DirectoryPanel.m | 2 +- cocoa/base/PrioritizeList.m | 6 ++---- cocoa/base/ResultTable.m | 5 +---- cocoa/base/StatsLabel.m | 7 ++----- 6 files changed, 14 insertions(+), 25 deletions(-) diff --git a/cocoa/base/DirectoryOutline.h b/cocoa/base/DirectoryOutline.h index 05a5e739..572dcd74 100644 --- a/cocoa/base/DirectoryOutline.h +++ b/cocoa/base/DirectoryOutline.h @@ -15,5 +15,5 @@ http://www.hardcoded.net/licenses/bsd_license @interface DirectoryOutline : HSOutline {} - (id)initWithPyRef:(PyObject *)aPyRef outlineView:(HSOutlineView *)aOutlineView; -- (PyDirectoryOutline *)py; +- (PyDirectoryOutline *)model; @end; \ No newline at end of file diff --git a/cocoa/base/DirectoryOutline.m b/cocoa/base/DirectoryOutline.m index caef39c2..342aacef 100644 --- a/cocoa/base/DirectoryOutline.m +++ b/cocoa/base/DirectoryOutline.m @@ -7,22 +7,19 @@ http://www.hardcoded.net/licenses/bsd_license */ #import "DirectoryOutline.h" -#import "Utils.h" @implementation DirectoryOutline - (id)initWithPyRef:(PyObject *)aPyRef outlineView:(HSOutlineView *)aOutlineView { - PyDirectoryOutline *model = [[PyDirectoryOutline alloc] initWithModel:aPyRef]; - self = [super initWithPy:model view:aOutlineView]; - [model bindCallback:createCallback(@"DirectoryOutlineView", self)]; - [model release]; - [outlineView registerForDraggedTypes:[NSArray arrayWithObject:NSFilenamesPboardType]]; + self = [super initWithPyRef:aPyRef wrapperClass:[PyDirectoryOutline class] + callbackClassName:@"DirectoryOutlineView" view:aOutlineView]; + [[self view] registerForDraggedTypes:[NSArray arrayWithObject:NSFilenamesPboardType]]; return self; } -- (PyDirectoryOutline *)py +- (PyDirectoryOutline *)model { - return (PyDirectoryOutline *)py; + return (PyDirectoryOutline *)model; } /* Delegate */ @@ -50,7 +47,7 @@ http://www.hardcoded.net/licenses/bsd_license if (!(sourceDragMask & NSDragOperationLink)) return NO; for (NSString *foldername in foldernames) { - [[self py] addDirectory:foldername]; + [[self model] addDirectory:foldername]; } NSDictionary *userInfo = [NSDictionary dictionaryWithObject:foldernames forKey:@"foldernames"]; [[NSNotificationCenter defaultCenter] postNotificationName:DGAddedFoldersNotification @@ -64,7 +61,7 @@ http://www.hardcoded.net/licenses/bsd_license if ([cell isKindOfClass:[NSTextFieldCell class]]) { NSTextFieldCell *textCell = cell; NSIndexPath *path = item; - BOOL selected = [path isEqualTo:[outlineView selectedPath]]; + BOOL selected = [path isEqualTo:[[self view] selectedPath]]; if (selected) { [textCell setTextColor:[NSColor blackColor]]; return; diff --git a/cocoa/base/DirectoryPanel.m b/cocoa/base/DirectoryPanel.m index 33dc4f4e..1d982c64 100644 --- a/cocoa/base/DirectoryPanel.m +++ b/cocoa/base/DirectoryPanel.m @@ -100,7 +100,7 @@ http://www.hardcoded.net/licenses/bsd_license - (IBAction)removeSelectedDirectory:(id)sender { [[self window] makeKeyAndOrderFront:nil]; - [[outline py] removeSelectedDirectory]; + [[outline model] removeSelectedDirectory]; [self refreshRemoveButtonText]; } diff --git a/cocoa/base/PrioritizeList.m b/cocoa/base/PrioritizeList.m index 47452278..af1f4019 100644 --- a/cocoa/base/PrioritizeList.m +++ b/cocoa/base/PrioritizeList.m @@ -13,10 +13,8 @@ http://www.hardcoded.net/licenses/bsd_license @implementation PrioritizeList - (id)initWithPyRef:(PyObject *)aPyRef tableView:(NSTableView *)aTableView { - PyPrioritizeList *m = [[PyPrioritizeList alloc] initWithModel:aPyRef]; - self = [super initWithModel:m tableView:aTableView]; - [m bindCallback:createCallback(@"PrioritizeListView", self)]; - [m release]; + self = [super initWithPyRef:aPyRef wrapperClass:[PyPrioritizeList class] + callbackClassName:@"PrioritizeListView" view:aTableView]; return self; } diff --git a/cocoa/base/ResultTable.m b/cocoa/base/ResultTable.m index 2c5c1847..00703496 100644 --- a/cocoa/base/ResultTable.m +++ b/cocoa/base/ResultTable.m @@ -20,10 +20,7 @@ http://www.hardcoded.net/licenses/bsd_license @implementation ResultTable - (id)initWithPyRef:(PyObject *)aPyRef view:(NSTableView *)aTableView { - PyResultTable *m = [[PyResultTable alloc] initWithModel:aPyRef]; - self = [super initWithModel:m tableView:aTableView]; - [m bindCallback:createCallback(@"ResultTableView", self)]; - [m release]; + self = [super initWithPyRef:aPyRef wrapperClass:[PyResultTable class] callbackClassName:@"ResultTableView" view:aTableView]; _deltaColumns = [[NSSet setWithArray:[[self model] deltaColumns]] retain]; return self; } diff --git a/cocoa/base/StatsLabel.m b/cocoa/base/StatsLabel.m index 08f94814..834db89a 100644 --- a/cocoa/base/StatsLabel.m +++ b/cocoa/base/StatsLabel.m @@ -12,11 +12,8 @@ http://www.hardcoded.net/licenses/bsd_license @implementation StatsLabel - (id)initWithPyRef:(PyObject *)aPyRef view:(NSTextField *)aLabelView { - PyStatsLabel *m = [[PyStatsLabel alloc] initWithModel:aPyRef]; - self = [self initWithModel:m view:aLabelView]; - [m bindCallback:createCallback(@"StatsLabelView", self)]; - [m release]; - return self; + return [super initWithPyRef:aPyRef wrapperClass:[PyStatsLabel class] + callbackClassName:@"StatsLabelView" view:aLabelView]; } - (PyStatsLabel *)model From 4aaff8ffb176d8733a895e556a83cbfc89e68c2a Mon Sep 17 00:00:00 2001 From: Virgil Dupras Date: Mon, 16 Jan 2012 09:29:57 -0500 Subject: [PATCH 25/26] Adapted qt layer to recent changes to the core (core initialization and core connection). --HG-- branch : objp --- qt/base/app.py | 2 +- qt/base/details_dialog.py | 7 ++----- qt/base/directories_dialog.py | 2 +- qt/base/directories_model.py | 8 +++----- qt/base/prioritize_dialog.py | 4 ++-- qt/base/problem_dialog.py | 11 ++++------- qt/base/problem_table.py | 4 +--- qt/base/result_window.py | 2 +- qt/base/results_model.py | 1 - qt/base/stats_label.py | 10 ++++------ 10 files changed, 19 insertions(+), 32 deletions(-) diff --git a/qt/base/app.py b/qt/base/app.py index d33d531a..5177263a 100644 --- a/qt/base/app.py +++ b/qt/base/app.py @@ -87,7 +87,7 @@ class DupeGuru(QObject): self._progress = Progress(self.resultWindow) self.directories_dialog = DirectoriesDialog(self.resultWindow, self) self.details_dialog = self.DETAILS_DIALOG_CLASS(self.resultWindow, self) - self.problemDialog = ProblemDialog(parent=self.resultWindow, app=self) + self.problemDialog = ProblemDialog(parent=self.resultWindow, model=self.model.problem_dialog) self.preferences_dialog = self.PREFERENCES_DIALOG_CLASS(self.resultWindow, self) self.about_box = AboutBox(self.resultWindow, self) diff --git a/qt/base/details_dialog.py b/qt/base/details_dialog.py index 8d3b0092..5f6cef74 100644 --- a/qt/base/details_dialog.py +++ b/qt/base/details_dialog.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- # Created By: Virgil Dupras # Created On: 2010-02-05 # Copyright 2011 Hardcoded Software (http://www.hardcoded.net) @@ -10,22 +9,20 @@ from PyQt4.QtCore import Qt from PyQt4.QtGui import QDialog -from core.gui.details_panel import DetailsPanel - from .details_table import DetailsModel class DetailsDialog(QDialog): def __init__(self, parent, app): QDialog.__init__(self, parent, Qt.Tool) self.app = app - self.model = DetailsPanel(self, app.model) + self.model = app.model.details_panel + self.model.view = self self._setupUi() if self.app.prefs.detailsWindowRect is not None: self.setGeometry(self.app.prefs.detailsWindowRect) self.tableModel = DetailsModel(self.model) # tableView is defined in subclasses self.tableView.setModel(self.tableModel) - self.model.connect() self.app.willSavePrefs.connect(self.appWillSavePrefs) diff --git a/qt/base/directories_dialog.py b/qt/base/directories_dialog.py index 605b7dc0..0554195e 100644 --- a/qt/base/directories_dialog.py +++ b/qt/base/directories_dialog.py @@ -28,7 +28,7 @@ class DirectoriesDialog(QMainWindow): self.lastAddedFolder = platform.INITIAL_FOLDER_IN_DIALOGS self.recentFolders = Recent(self.app, 'recentFolders') self._setupUi() - self.directoriesModel = DirectoriesModel(self.app, view=self.treeView) + self.directoriesModel = DirectoriesModel(self.app.model.directory_tree, view=self.treeView) self.directoriesDelegate = DirectoriesDelegate() self.treeView.setItemDelegate(self.directoriesDelegate) self._setupColumns() diff --git a/qt/base/directories_model.py b/qt/base/directories_model.py index 161b24c0..35e6d872 100644 --- a/qt/base/directories_model.py +++ b/qt/base/directories_model.py @@ -15,8 +15,6 @@ from PyQt4.QtGui import (QComboBox, QStyledItemDelegate, QApplication, QBrush, Q from hscommon.trans import trget from qtlib.tree_model import RefNode, TreeModel -from core.gui.directory_tree import DirectoryTree - tr = trget('ui') HEADERS = [tr("Name"), tr("State")] @@ -60,12 +58,12 @@ class DirectoriesDelegate(QStyledItemDelegate): class DirectoriesModel(TreeModel): - def __init__(self, app, view): + def __init__(self, model, view): TreeModel.__init__(self) - self.model = DirectoryTree(self, app.model) + self.model = model + self.model.view = self self.view = view self.view.setModel(self) - self.model.connect() self.view.selectionModel().selectionChanged[(QItemSelection, QItemSelection)].connect(self.selectionChanged) diff --git a/qt/base/prioritize_dialog.py b/qt/base/prioritize_dialog.py index 1b1c9fd7..23bc7515 100644 --- a/qt/base/prioritize_dialog.py +++ b/qt/base/prioritize_dialog.py @@ -55,9 +55,9 @@ class PrioritizeDialog(QDialog): def __init__(self, parent, app): flags = Qt.CustomizeWindowHint | Qt.WindowTitleHint | Qt.WindowSystemMenuHint QDialog.__init__(self, parent, flags) - self.app = app self._setupUi() - self.model = PrioritizeDialogModel(view=self, app=app.model) + self.model = PrioritizeDialogModel(app=app.model) + self.model.view = self self.categoryList = ComboboxModel(model=self.model.category_list, view=self.categoryCombobox) self.criteriaList = ListviewModel(model=self.model.criteria_list, view=self.criteriaListView) self.prioritizationList = PrioritizationList(model=self.model.prioritization_list, view=self.prioritizationListView) diff --git a/qt/base/problem_dialog.py b/qt/base/problem_dialog.py index d88bbf89..46762bcd 100644 --- a/qt/base/problem_dialog.py +++ b/qt/base/problem_dialog.py @@ -11,21 +11,18 @@ from PyQt4.QtGui import (QDialog, QVBoxLayout, QHBoxLayout, QPushButton, QSpacer QLabel, QTableView, QAbstractItemView, QApplication) from hscommon.trans import trget -from core.gui.problem_dialog import ProblemDialog as ProblemDialogModel from .problem_table import ProblemTable tr = trget('ui') class ProblemDialog(QDialog): - def __init__(self, parent, app): + def __init__(self, parent, model): flags = Qt.CustomizeWindowHint | Qt.WindowTitleHint | Qt.WindowSystemMenuHint QDialog.__init__(self, parent, flags) - self.app = app self._setupUi() - self.model = ProblemDialogModel(view=self, app=app.model) - self.table = ProblemTable(problem_dialog=self, view=self.tableView) - self.model.connect() - self.table.model.connect() + self.model = model + self.model.view = self + self.table = ProblemTable(self.model.problem_table, view=self.tableView) self.revealButton.clicked.connect(self.model.reveal_selected_dupe) self.closeButton.clicked.connect(self.accept) diff --git a/qt/base/problem_table.py b/qt/base/problem_table.py index 96444afc..67840b2a 100644 --- a/qt/base/problem_table.py +++ b/qt/base/problem_table.py @@ -8,7 +8,6 @@ from qtlib.column import Column from qtlib.table import Table -from core.gui.problem_table import ProblemTable as ProblemTableModel class ProblemTable(Table): COLUMNS = [ @@ -16,8 +15,7 @@ class ProblemTable(Table): Column('msg', defaultWidth=150), ] - def __init__(self, problem_dialog, view): - model = ProblemTableModel(view=self, problem_dialog=problem_dialog.model) + def __init__(self, model, view): Table.__init__(self, model, view) # we have to prevent Return from initiating editing. # self.view.editSelected = lambda: None diff --git a/qt/base/result_window.py b/qt/base/result_window.py index d0de8b25..2f4281f8 100644 --- a/qt/base/result_window.py +++ b/qt/base/result_window.py @@ -30,7 +30,7 @@ class ResultWindow(QMainWindow): self._last_filter = None self._setupUi() self.resultsModel = app.RESULT_MODEL_CLASS(self.app, self.resultsView) - self.stats = StatsLabel(app, self.statusLabel) + self.stats = StatsLabel(app.model.stats_label, self.statusLabel) self._update_column_actions_status() self.connect(self.menuColumns, SIGNAL('triggered(QAction*)'), self.columnToggled) diff --git a/qt/base/results_model.py b/qt/base/results_model.py index 28f80dd5..6bf4bef2 100644 --- a/qt/base/results_model.py +++ b/qt/base/results_model.py @@ -17,7 +17,6 @@ class ResultsModel(Table): def __init__(self, app, view): model = app.model.result_table Table.__init__(self, model, view) - self.model.connect() app.prefsChanged.connect(self.appPrefsChanged) app.willSavePrefs.connect(self.appWillSavePrefs) diff --git a/qt/base/stats_label.py b/qt/base/stats_label.py index f6b2e8b0..77c13740 100644 --- a/qt/base/stats_label.py +++ b/qt/base/stats_label.py @@ -6,13 +6,11 @@ # which should be included with this package. The terms are also available at # http://www.hardcoded.net/licenses/bsd_license -from core.gui.stats_label import StatsLabel as StatsLabelModel - -class StatsLabel(object): - def __init__(self, app, view): +class StatsLabel: + def __init__(self, model, view): self.view = view - self.model = StatsLabelModel(self, app.model) - self.model.connect() + self.model = model + self.model.view = self def refresh(self): self.view.setText(self.model.display) From a487e83f3c31d1035e85cecf395cd9a4d07df333 Mon Sep 17 00:00:00 2001 From: Virgil Dupras Date: Mon, 16 Jan 2012 10:30:45 -0500 Subject: [PATCH 26/26] Converted ME and PE cocoa projects to objp. --HG-- branch : objp rename : cocoa/se/main.m => cocoa/base/main.m --- build.py | 14 +- cocoa/{se => base}/main.m | 0 cocoa/inter/app_me.py | 45 ++++- cocoa/inter/app_pe.py | 31 +++ cocoa/me/AppDelegate.h | 1 - cocoa/me/AppDelegate.m | 2 - cocoa/me/PyDupeGuru.h | 22 -- cocoa/me/ResultWindow.m | 32 +-- cocoa/me/dg_cocoa.py | 56 +----- cocoa/me/dupeguru.xcodeproj/project.pbxproj | 210 ++++++++++++------- cocoa/me/main.m | 23 --- cocoa/pe/AppDelegate.h | 2 - cocoa/pe/AppDelegate.m | 4 +- cocoa/pe/DetailsPanel.h | 5 +- cocoa/pe/DetailsPanel.m | 10 +- cocoa/pe/PyDupeGuru.h | 17 -- cocoa/pe/ResultWindow.m | 13 +- cocoa/pe/dg_cocoa.py | 39 +--- cocoa/pe/dupeguru.xcodeproj/project.pbxproj | 212 +++++++++++++------- cocoa/pe/main.m | 23 --- core_me/app.py | 3 +- core_pe/app.py | 3 +- 22 files changed, 407 insertions(+), 360 deletions(-) rename cocoa/{se => base}/main.m (100%) delete mode 100644 cocoa/me/PyDupeGuru.h delete mode 100644 cocoa/me/main.m delete mode 100644 cocoa/pe/PyDupeGuru.h delete mode 100644 cocoa/pe/main.m diff --git a/build.py b/build.py index aa879b5c..fb4d1eda 100644 --- a/build.py +++ b/build.py @@ -12,6 +12,7 @@ import os.path as op from optparse import OptionParser import shutil import json +import importlib from setuptools import setup, Extension @@ -41,8 +42,8 @@ def parse_args(): def build_cocoa(edition, dev): build_cocoa_proxy_module() - build_cocoa_bridging_interfaces() - print("Building dg_cocoa.plugin") + build_cocoa_bridging_interfaces(edition) + print("Building the cocoa layer") from pluginbuilder import copy_embeddable_python_dylib, get_python_header_folder, collect_dependencies copy_embeddable_python_dylib('build') if not op.exists('build/PythonHeaders'): @@ -186,7 +187,7 @@ def build_cocoa_proxy_module(): ['AppKit', 'CoreServices'], ['cocoalib']) -def build_cocoa_bridging_interfaces(): +def build_cocoa_bridging_interfaces(edition): print("Building Cocoa Bridging Interfaces") import objp.o2p import objp.p2o @@ -203,10 +204,11 @@ def build_cocoa_bridging_interfaces(): from inter.result_table import PyResultTable, ResultTableView from inter.stats_label import PyStatsLabel, StatsLabelView from inter.app import PyDupeGuruBase, DupeGuruView - from inter.app_se import PyDupeGuru + appmod = importlib.import_module('inter.app_{}'.format(edition)) allclasses = [PyGUIObject, PyColumns, PyOutline, PySelectableList, PyTable, PyFairware, PyDetailsPanel, PyDirectoryOutline, PyExtraFairwareReminder, PyPrioritizeDialog, - PyPrioritizeList, PyProblemDialog, PyResultTable, PyStatsLabel, PyDupeGuruBase, PyDupeGuru] + PyPrioritizeList, PyProblemDialog, PyResultTable, PyStatsLabel, PyDupeGuruBase, + appmod.PyDupeGuru] for class_ in allclasses: objp.o2p.generate_objc_code(class_, 'cocoa/autogen', inherit=True) allclasses = [GUIObjectView, ColumnsView, OutlineView, SelectableListView, TableView, @@ -276,7 +278,7 @@ def main(): build_mergepot() elif options.cocoamod: build_cocoa_proxy_module() - build_cocoa_bridging_interfaces() + build_cocoa_bridging_interfaces(edition) else: build_normal(edition, ui, dev) diff --git a/cocoa/se/main.m b/cocoa/base/main.m similarity index 100% rename from cocoa/se/main.m rename to cocoa/base/main.m diff --git a/cocoa/inter/app_me.py b/cocoa/inter/app_me.py index f22affb7..c7d1413a 100644 --- a/cocoa/inter/app_me.py +++ b/cocoa/inter/app_me.py @@ -15,8 +15,9 @@ from cocoa import as_fetch from hscommon.trans import tr from core.app import JobType +from core.scanner import ScanType from core_me.app import DupeGuru as DupeGuruBase -from .app import JOBID2TITLE +from .app import JOBID2TITLE, PyDupeGuruBase JobType.RemoveDeadTracks = 'jobRemoveDeadTracks' JobType.ScanDeadTracks = 'jobScanDeadTracks' @@ -67,3 +68,45 @@ class DupeGuruME(DupeGuruBase): self.view.start_job(JobType.ScanDeadTracks, do) +class PyDupeGuru(PyDupeGuruBase): + def __init__(self): + self._init(DupeGuruME) + + def removeDeadTracks(self): + self.model.remove_dead_tracks() + + def scanDeadTracks(self): + self.model.scan_dead_tracks() + + #---Information + def deadTrackCount(self) -> int: + return len(self.model.dead_tracks) + + #---Properties + def setMinMatchPercentage_(self, percentage: int): + self.model.scanner.min_match_percentage = percentage + + def setScanType_(self, scan_type: int): + try: + self.model.scanner.scan_type = [ + ScanType.Filename, + ScanType.Fields, + ScanType.FieldsNoOrder, + ScanType.Tag, + ScanType.Contents, + ScanType.ContentsAudio, + ][scan_type] + except IndexError: + pass + + def setWordWeighting_(self, words_are_weighted: bool): + self.model.scanner.word_weighting = words_are_weighted + + def setMatchSimilarWords_(self, match_similar_words: bool): + self.model.scanner.match_similar_words = match_similar_words + + def enable_scanForTag_(self, enable: bool, scan_tag: str): + if enable: + self.model.scanner.scanned_tags.add(scan_tag) + else: + self.model.scanner.scanned_tags.discard(scan_tag) diff --git a/cocoa/inter/app_pe.py b/cocoa/inter/app_pe.py index 51ce2c58..fff54332 100644 --- a/cocoa/inter/app_pe.py +++ b/cocoa/inter/app_pe.py @@ -19,10 +19,12 @@ from hscommon.path import Path from hscommon.trans import tr from cocoa import proxy +from core.scanner import ScanType from core import directories from core_pe import _block_osx from core_pe.photo import Photo as PhotoBase from core_pe.app import DupeGuru as DupeGuruBase +from .app import PyDupeGuruBase IPHOTO_PATH = Path('iPhoto Library') @@ -194,3 +196,32 @@ class DupeGuruPE(DupeGuruBase): return DupeGuruBase.start_scanning(self) +class PyDupeGuru(PyDupeGuruBase): + def __init__(self): + self._init(DupeGuruPE) + + def clearPictureCache(self): + self.model.scanner.clear_picture_cache() + + #---Information + def getSelectedDupePath(self) -> str: + return str(self.model.selected_dupe_path()) + + def getSelectedDupeRefPath(self) -> str: + return str(self.model.selected_dupe_ref_path()) + + #---Properties + def setScanType_(self, scan_type: int): + try: + self.model.scanner.scan_type = [ + ScanType.FuzzyBlock, + ScanType.ExifTimestamp, + ][scan_type] + except IndexError: + pass + + def setMatchScaled_(self, match_scaled: bool): + self.model.scanner.match_scaled = match_scaled + + def setMinMatchPercentage_(self, percentage: int): + self.model.scanner.threshold = percentage diff --git a/cocoa/me/AppDelegate.h b/cocoa/me/AppDelegate.h index 99829296..865224e7 100644 --- a/cocoa/me/AppDelegate.h +++ b/cocoa/me/AppDelegate.h @@ -12,5 +12,4 @@ http://www.hardcoded.net/licenses/bsd_license #import "PyDupeGuru.h" @interface AppDelegate : AppDelegateBase {} -- (PyDupeGuru *)py; @end diff --git a/cocoa/me/AppDelegate.m b/cocoa/me/AppDelegate.m index 3ec85031..beae0ee0 100644 --- a/cocoa/me/AppDelegate.m +++ b/cocoa/me/AppDelegate.m @@ -74,8 +74,6 @@ http://www.hardcoded.net/licenses/bsd_license return [[DirectoryPanelME alloc] initWithParentApp:self]; } -- (PyDupeGuru *)py { return (PyDupeGuru *)py; } - //Delegate - (void)applicationDidFinishLaunching:(NSNotification *)aNotification { diff --git a/cocoa/me/PyDupeGuru.h b/cocoa/me/PyDupeGuru.h deleted file mode 100644 index 17680731..00000000 --- a/cocoa/me/PyDupeGuru.h +++ /dev/null @@ -1,22 +0,0 @@ -/* -Copyright 2011 Hardcoded Software (http://www.hardcoded.net) - -This software is licensed under the "BSD" License as described in the "LICENSE" file, -which should be included with this package. The terms are also available at -http://www.hardcoded.net/licenses/bsd_license -*/ - -#import -#import "../base/PyDupeGuru.h" - -@interface PyDupeGuru : PyDupeGuruBase -//Scanning options -- (void)setMinWordCount:(NSNumber *)word_count; -- (void)setMinWordLength:(NSNumber *)word_length; -- (void)setWordWeighting:(NSNumber *)words_are_weighted; -- (void)setMatchSimilarWords:(NSNumber *)match_similar_words; -- (void)enable:(NSNumber *)enable scanForTag:(NSString *)tag; -- (void)scanDeadTracks; -- (void)removeDeadTracks; -- (NSInteger)deadTrackCount; -@end diff --git a/cocoa/me/ResultWindow.m b/cocoa/me/ResultWindow.m index f2f8724e..715091f4 100644 --- a/cocoa/me/ResultWindow.m +++ b/cocoa/me/ResultWindow.m @@ -11,25 +11,25 @@ http://www.hardcoded.net/licenses/bsd_license #import "Utils.h" #import "PyDupeGuru.h" #import "Consts.h" +#import "ProgressController.h" @implementation ResultWindow /* Override */ - (void)setScanOptions { NSUserDefaults *ud = [NSUserDefaults standardUserDefaults]; - PyDupeGuru *_py = (PyDupeGuru *)py; - [_py setScanType:[ud objectForKey:@"scanType"]]; - [_py enable:[ud objectForKey:@"scanTagTrack"] scanForTag:@"track"]; - [_py enable:[ud objectForKey:@"scanTagArtist"] scanForTag:@"artist"]; - [_py enable:[ud objectForKey:@"scanTagAlbum"] scanForTag:@"album"]; - [_py enable:[ud objectForKey:@"scanTagTitle"] scanForTag:@"title"]; - [_py enable:[ud objectForKey:@"scanTagGenre"] scanForTag:@"genre"]; - [_py enable:[ud objectForKey:@"scanTagYear"] scanForTag:@"year"]; - [_py setMinMatchPercentage:[ud objectForKey:@"minMatchPercentage"]]; - [_py setWordWeighting:[ud objectForKey:@"wordWeighting"]]; - [_py setMixFileKind:n2b([ud objectForKey:@"mixFileKind"])]; - [_py setIgnoreHardlinkMatches:n2b([ud objectForKey:@"ignoreHardlinkMatches"])]; - [_py setMatchSimilarWords:[ud objectForKey:@"matchSimilarWords"]]; + [model setScanType:n2i([ud objectForKey:@"scanType"])]; + [model enable:n2b([ud objectForKey:@"scanTagTrack"]) scanForTag:@"track"]; + [model enable:n2b([ud objectForKey:@"scanTagArtist"]) scanForTag:@"artist"]; + [model enable:n2b([ud objectForKey:@"scanTagAlbum"]) scanForTag:@"album"]; + [model enable:n2b([ud objectForKey:@"scanTagTitle"]) scanForTag:@"title"]; + [model enable:n2b([ud objectForKey:@"scanTagGenre"]) scanForTag:@"genre"]; + [model enable:n2b([ud objectForKey:@"scanTagYear"]) scanForTag:@"year"]; + [model setMinMatchPercentage:n2i([ud objectForKey:@"minMatchPercentage"])]; + [model setWordWeighting:n2b([ud objectForKey:@"wordWeighting"])]; + [model setMixFileKind:n2b([ud objectForKey:@"mixFileKind"])]; + [model setIgnoreHardlinkMatches:n2b([ud objectForKey:@"ignoreHardlinkMatches"])]; + [model setMatchSimilarWords:n2b([ud objectForKey:@"matchSimilarWords"])]; } - (void)initResultColumns @@ -72,7 +72,7 @@ http://www.hardcoded.net/licenses/bsd_license /* Actions */ - (IBAction)removeDeadTracks:(id)sender { - [(PyDupeGuru *)py scanDeadTracks]; + [model scanDeadTracks]; } /* Notifications */ @@ -81,11 +81,11 @@ http://www.hardcoded.net/licenses/bsd_license [super jobCompleted:aNotification]; id lastAction = [[ProgressController mainProgressController] jobId]; if ([lastAction isEqualTo:jobScanDeadTracks]) { - NSInteger deadTrackCount = [(PyDupeGuru *)py deadTrackCount]; + NSInteger deadTrackCount = [model deadTrackCount]; if (deadTrackCount > 0) { NSString *msg = TR(@"Your iTunes Library contains %d dead tracks ready to be removed. Continue?"); if ([Dialogs askYesNo:[NSString stringWithFormat:msg,deadTrackCount]] == NSAlertFirstButtonReturn) - [(PyDupeGuru *)py removeDeadTracks]; + [model removeDeadTracks]; } else { [Dialogs showMessage:TR(@"You have no dead tracks in your iTunes Library")]; diff --git a/cocoa/me/dg_cocoa.py b/cocoa/me/dg_cocoa.py index 200d5312..d3db3672 100644 --- a/cocoa/me/dg_cocoa.py +++ b/cocoa/me/dg_cocoa.py @@ -7,64 +7,14 @@ from hscommon.trans import install_gettext_trans_under_cocoa install_gettext_trans_under_cocoa() -from cocoa.inter import signature +from cocoa.inter import PySelectableList, PyColumns, PyTable -from core.scanner import ScanType - -from inter.app import PyDupeGuruBase from inter.details_panel import PyDetailsPanel from inter.directory_outline import PyDirectoryOutline from inter.extra_fairware_reminder import PyExtraFairwareReminder from inter.prioritize_dialog import PyPrioritizeDialog +from inter.prioritize_list import PyPrioritizeList from inter.problem_dialog import PyProblemDialog -from inter.problem_table import PyProblemTable from inter.result_table import PyResultTable from inter.stats_label import PyStatsLabel -from inter.app_me import DupeGuruME - -class PyDupeGuru(PyDupeGuruBase): - def init(self): - self = super(PyDupeGuru,self).init() - self._init(DupeGuruME) - return self - - def removeDeadTracks(self): - self.py.remove_dead_tracks() - - def scanDeadTracks(self): - self.py.scan_dead_tracks() - - #---Information - @signature('i@:') - def deadTrackCount(self): - return len(self.py.dead_tracks) - - #---Properties - def setMinMatchPercentage_(self, percentage): - self.py.scanner.min_match_percentage = int(percentage) - - def setScanType_(self, scan_type): - try: - self.py.scanner.scan_type = [ - ScanType.Filename, - ScanType.Fields, - ScanType.FieldsNoOrder, - ScanType.Tag, - ScanType.Contents, - ScanType.ContentsAudio, - ][scan_type] - except IndexError: - pass - - def setWordWeighting_(self, words_are_weighted): - self.py.scanner.word_weighting = words_are_weighted - - def setMatchSimilarWords_(self, match_similar_words): - self.py.scanner.match_similar_words = match_similar_words - - def enable_scanForTag_(self, enable, scan_tag): - if enable: - self.py.scanner.scanned_tags.add(scan_tag) - else: - self.py.scanner.scanned_tags.discard(scan_tag) - +from inter.app_me import PyDupeGuru diff --git a/cocoa/me/dupeguru.xcodeproj/project.pbxproj b/cocoa/me/dupeguru.xcodeproj/project.pbxproj index 19ba352e..7aaf6b8c 100644 --- a/cocoa/me/dupeguru.xcodeproj/project.pbxproj +++ b/cocoa/me/dupeguru.xcodeproj/project.pbxproj @@ -19,11 +19,9 @@ /* End PBXAppleScriptBuildPhase section */ /* Begin PBXBuildFile section */ - 8D11072D0486CEB800E47090 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B97316FDCFA39411CA2CEA /* main.m */; settings = {ATTRIBUTES = (); }; }; 8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; }; CE003CC611242D00004B0AA7 /* HSGUIController.m in Sources */ = {isa = PBXBuildFile; fileRef = CE003CB411242D00004B0AA7 /* HSGUIController.m */; }; CE003CC711242D00004B0AA7 /* HSOutline.m in Sources */ = {isa = PBXBuildFile; fileRef = CE003CB611242D00004B0AA7 /* HSOutline.m */; }; - CE003CC811242D00004B0AA7 /* HSWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = CE003CB811242D00004B0AA7 /* HSWindowController.m */; }; CE003CC911242D00004B0AA7 /* NSEventAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = CE003CBA11242D00004B0AA7 /* NSEventAdditions.m */; }; CE003CCA11242D00004B0AA7 /* HSOutlineView.m in Sources */ = {isa = PBXBuildFile; fileRef = CE003CC111242D00004B0AA7 /* HSOutlineView.m */; }; CE003CCB11242D00004B0AA7 /* NSIndexPathAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = CE003CC311242D00004B0AA7 /* NSIndexPathAdditions.m */; }; @@ -47,11 +45,9 @@ CE2E87FD142BC92C00519A68 /* HSQuicklook.m in Sources */ = {isa = PBXBuildFile; fileRef = CE2E87FC142BC92C00519A68 /* HSQuicklook.m */; }; CE381C9609914ACE003581CE /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = CE381C9409914ACE003581CE /* AppDelegate.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 */; }; CE4B59C91119919700C06C9E /* progress.xib in Resources */ = {isa = PBXBuildFile; fileRef = CE4B59C61119919700C06C9E /* progress.xib */; }; CE4F934912CCA96C0067A3AE /* HSAboutBox.m in Sources */ = {isa = PBXBuildFile; fileRef = CE4F934812CCA96C0067A3AE /* HSAboutBox.m */; }; CE515DF30FC6C12E00EC695D /* Dialogs.m in Sources */ = {isa = PBXBuildFile; fileRef = CE515DE10FC6C12E00EC695D /* Dialogs.m */; }; - CE515DF40FC6C12E00EC695D /* HSErrorReportWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = CE515DE30FC6C12E00EC695D /* HSErrorReportWindow.m */; }; CE515DF60FC6C12E00EC695D /* ProgressController.m in Sources */ = {isa = PBXBuildFile; fileRef = CE515DE70FC6C12E00EC695D /* ProgressController.m */; }; CE515DFA0FC6C12E00EC695D /* Utils.m in Sources */ = {isa = PBXBuildFile; fileRef = CE515DF00FC6C12E00EC695D /* Utils.m */; }; CE515DFB0FC6C12E00EC695D /* ValueTransformers.m in Sources */ = {isa = PBXBuildFile; fileRef = CE515DF20FC6C12E00EC695D /* ValueTransformers.m */; }; @@ -64,12 +60,33 @@ CE6E0E9F1054EB97008D9390 /* dsa_pub.pem in Resources */ = {isa = PBXBuildFile; fileRef = CE6E0E9E1054EB97008D9390 /* dsa_pub.pem */; }; CE74A12412537F06008A8DF0 /* HSFairwareReminder.m in Sources */ = {isa = PBXBuildFile; fileRef = CE74A12212537F06008A8DF0 /* HSFairwareReminder.m */; }; CE74A12712537F2E008A8DF0 /* FairwareReminder.xib in Resources */ = {isa = PBXBuildFile; fileRef = CE74A12512537F2E008A8DF0 /* FairwareReminder.xib */; }; - CE848A1909DD85810004CB44 /* Consts.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = CE848A1809DD85810004CB44 /* Consts.h */; }; CE84C9B21423ADFB0050A6AD /* PrioritizeDialog.m in Sources */ = {isa = PBXBuildFile; fileRef = CE84C9AD1423ADFB0050A6AD /* PrioritizeDialog.m */; }; CE84C9B31423ADFB0050A6AD /* PrioritizeList.m in Sources */ = {isa = PBXBuildFile; fileRef = CE84C9AF1423ADFB0050A6AD /* PrioritizeList.m */; }; CE84C9B91423AE410050A6AD /* HSPopUpList.m in Sources */ = {isa = PBXBuildFile; fileRef = CE84C9B61423AE410050A6AD /* HSPopUpList.m */; }; CE84C9BA1423AE410050A6AD /* HSSelectableList.m in Sources */ = {isa = PBXBuildFile; fileRef = CE84C9B81423AE410050A6AD /* HSSelectableList.m */; }; CE84C9BD1423AF200050A6AD /* PrioritizeDialog.xib in Resources */ = {isa = PBXBuildFile; fileRef = CE84C9BB1423AF200050A6AD /* PrioritizeDialog.xib */; }; + CE9705E614C46E7D007A28F6 /* ObjP.m in Sources */ = {isa = PBXBuildFile; fileRef = CE9705C514C46E7D007A28F6 /* ObjP.m */; }; + CE9705E714C46E7D007A28F6 /* PyColumns.m in Sources */ = {isa = PBXBuildFile; fileRef = CE9705C714C46E7D007A28F6 /* PyColumns.m */; }; + CE9705E814C46E7D007A28F6 /* PyDetailsPanel.m in Sources */ = {isa = PBXBuildFile; fileRef = CE9705C914C46E7D007A28F6 /* PyDetailsPanel.m */; }; + CE9705E914C46E7D007A28F6 /* PyDirectoryOutline.m in Sources */ = {isa = PBXBuildFile; fileRef = CE9705CB14C46E7D007A28F6 /* PyDirectoryOutline.m */; }; + CE9705EA14C46E7D007A28F6 /* PyDupeGuru.m in Sources */ = {isa = PBXBuildFile; fileRef = CE9705CD14C46E7D007A28F6 /* PyDupeGuru.m */; }; + CE9705EB14C46E7D007A28F6 /* PyDupeGuruBase.m in Sources */ = {isa = PBXBuildFile; fileRef = CE9705CF14C46E7D007A28F6 /* PyDupeGuruBase.m */; }; + CE9705EC14C46E7D007A28F6 /* PyExtraFairwareReminder.m in Sources */ = {isa = PBXBuildFile; fileRef = CE9705D114C46E7D007A28F6 /* PyExtraFairwareReminder.m */; }; + CE9705ED14C46E7D007A28F6 /* PyFairware.m in Sources */ = {isa = PBXBuildFile; fileRef = CE9705D314C46E7D007A28F6 /* PyFairware.m */; }; + CE9705EE14C46E7D007A28F6 /* PyGUIObject.m in Sources */ = {isa = PBXBuildFile; fileRef = CE9705D514C46E7D007A28F6 /* PyGUIObject.m */; }; + CE9705EF14C46E7D007A28F6 /* PyOutline.m in Sources */ = {isa = PBXBuildFile; fileRef = CE9705D714C46E7D007A28F6 /* PyOutline.m */; }; + CE9705F014C46E7D007A28F6 /* PyPrioritizeDialog.m in Sources */ = {isa = PBXBuildFile; fileRef = CE9705D914C46E7D007A28F6 /* PyPrioritizeDialog.m */; }; + CE9705F114C46E7D007A28F6 /* PyPrioritizeList.m in Sources */ = {isa = PBXBuildFile; fileRef = CE9705DB14C46E7D007A28F6 /* PyPrioritizeList.m */; }; + CE9705F214C46E7D007A28F6 /* PyProblemDialog.m in Sources */ = {isa = PBXBuildFile; fileRef = CE9705DD14C46E7D007A28F6 /* PyProblemDialog.m */; }; + CE9705F314C46E7D007A28F6 /* PyResultTable.m in Sources */ = {isa = PBXBuildFile; fileRef = CE9705DF14C46E7D007A28F6 /* PyResultTable.m */; }; + CE9705F414C46E7D007A28F6 /* PySelectableList.m in Sources */ = {isa = PBXBuildFile; fileRef = CE9705E114C46E7D007A28F6 /* PySelectableList.m */; }; + CE9705F514C46E7D007A28F6 /* PyStatsLabel.m in Sources */ = {isa = PBXBuildFile; fileRef = CE9705E314C46E7D007A28F6 /* PyStatsLabel.m */; }; + CE9705F614C46E7D007A28F6 /* PyTable.m in Sources */ = {isa = PBXBuildFile; fileRef = CE9705E514C46E7D007A28F6 /* PyTable.m */; }; + CE9705F814C46EA3007A28F6 /* Python in Frameworks */ = {isa = PBXBuildFile; fileRef = CE9705F714C46EA3007A28F6 /* Python */; }; + CE9705F914C46EC3007A28F6 /* Python in CopyFiles */ = {isa = PBXBuildFile; fileRef = CE9705F714C46EA3007A28F6 /* Python */; }; + CE9705FF14C46F60007A28F6 /* py in Resources */ = {isa = PBXBuildFile; fileRef = CE9705FE14C46F60007A28F6 /* py */; }; + CE97060114C46F70007A28F6 /* dg_cocoa.py in Resources */ = {isa = PBXBuildFile; fileRef = CE97060014C46F70007A28F6 /* dg_cocoa.py */; }; + CE97060314C471F2007A28F6 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = CE97060214C471F2007A28F6 /* main.m */; }; CEA14F431461ED63007F01A5 /* locale in Resources */ = {isa = PBXBuildFile; fileRef = CEA14F421461ED63007F01A5 /* locale */; }; CEB14D29124DFC2800FA7481 /* ResultTable.m in Sources */ = {isa = PBXBuildFile; fileRef = CEB14D28124DFC2800FA7481 /* ResultTable.m */; }; CEB5E07813225C89009F521D /* ExtraFairwareReminder.m in Sources */ = {isa = PBXBuildFile; fileRef = CEB5E07613225C89009F521D /* ExtraFairwareReminder.m */; }; @@ -89,7 +106,7 @@ dstSubfolderSpec = 10; files = ( CE14259F0AFB719300BD5167 /* Sparkle.framework in CopyFiles */, - CE848A1909DD85810004CB44 /* Consts.h in CopyFiles */, + CE9705F914C46EC3007A28F6 /* Python in CopyFiles */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -98,7 +115,6 @@ /* Begin PBXFileReference section */ 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = /System/Library/Frameworks/Cocoa.framework; sourceTree = ""; }; 13E42FB307B3F0F600E4EEF1 /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = /System/Library/Frameworks/CoreData.framework; sourceTree = ""; }; - 29B97316FDCFA39411CA2CEA /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 29B97324FDCFA39411CA2CEA /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = /System/Library/Frameworks/AppKit.framework; sourceTree = ""; }; 29B97325FDCFA39411CA2CEA /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = /System/Library/Frameworks/Foundation.framework; sourceTree = ""; }; 8D1107310486CEB800E47090 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = SOURCE_ROOT; }; @@ -107,12 +123,8 @@ CE003CB411242D00004B0AA7 /* HSGUIController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HSGUIController.m; sourceTree = ""; }; CE003CB511242D00004B0AA7 /* HSOutline.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HSOutline.h; sourceTree = ""; }; CE003CB611242D00004B0AA7 /* HSOutline.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HSOutline.m; sourceTree = ""; }; - CE003CB711242D00004B0AA7 /* HSWindowController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HSWindowController.h; sourceTree = ""; }; - CE003CB811242D00004B0AA7 /* HSWindowController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HSWindowController.m; sourceTree = ""; }; CE003CB911242D00004B0AA7 /* NSEventAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = NSEventAdditions.h; path = ../../cocoalib/NSEventAdditions.h; sourceTree = SOURCE_ROOT; }; CE003CBA11242D00004B0AA7 /* NSEventAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = NSEventAdditions.m; path = ../../cocoalib/NSEventAdditions.m; sourceTree = SOURCE_ROOT; }; - CE003CBC11242D00004B0AA7 /* PyGUI.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PyGUI.h; sourceTree = ""; }; - CE003CBD11242D00004B0AA7 /* PyOutline.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PyOutline.h; sourceTree = ""; }; CE003CC011242D00004B0AA7 /* HSOutlineView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HSOutlineView.h; sourceTree = ""; }; CE003CC111242D00004B0AA7 /* HSOutlineView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HSOutlineView.m; sourceTree = ""; }; CE003CC211242D00004B0AA7 /* NSIndexPathAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSIndexPathAdditions.h; sourceTree = ""; }; @@ -121,7 +133,6 @@ CE003CC511242D00004B0AA7 /* NSTableViewAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSTableViewAdditions.m; sourceTree = ""; }; CE003CCD11242D2C004B0AA7 /* DirectoryOutline.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DirectoryOutline.h; path = ../base/DirectoryOutline.h; sourceTree = SOURCE_ROOT; }; CE003CCE11242D2C004B0AA7 /* DirectoryOutline.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = DirectoryOutline.m; path = ../base/DirectoryOutline.m; sourceTree = SOURCE_ROOT; }; - CE003CCF11242D2C004B0AA7 /* PyDirectoryOutline.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PyDirectoryOutline.h; path = ../base/PyDirectoryOutline.h; sourceTree = SOURCE_ROOT; }; CE05330E12E5D3ED0029EF25 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = ../base/en.lproj/DetailsPanel.xib; sourceTree = SOURCE_ROOT; }; CE05331012E5D3ED0029EF25 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = ../base/en.lproj/DirectoryPanel.xib; sourceTree = SOURCE_ROOT; }; CE05331212E5D3ED0029EF25 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = ../base/en.lproj/MainMenu.xib; sourceTree = SOURCE_ROOT; }; @@ -142,12 +153,9 @@ CE0A0BFF1175A1C000DCA3C6 /* HSTable.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HSTable.m; sourceTree = ""; }; CE0A0C011175A1DE00DCA3C6 /* ProblemDialog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ProblemDialog.h; path = ../base/ProblemDialog.h; sourceTree = SOURCE_ROOT; }; CE0A0C021175A1DE00DCA3C6 /* ProblemDialog.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = ProblemDialog.m; path = ../base/ProblemDialog.m; sourceTree = SOURCE_ROOT; }; - CE0A0C031175A1DE00DCA3C6 /* PyProblemDialog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PyProblemDialog.h; path = ../base/PyProblemDialog.h; sourceTree = SOURCE_ROOT; }; - CE0A0C131175A28100DCA3C6 /* PyTable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PyTable.h; sourceTree = ""; }; CE1425880AFB718500BD5167 /* Sparkle.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Sparkle.framework; path = /Library/Frameworks/Sparkle.framework; sourceTree = ""; }; CE1EAA0812DF3E81009BA949 /* HSRecentFiles.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = HSRecentFiles.h; path = ../../cocoalib/HSRecentFiles.h; sourceTree = SOURCE_ROOT; }; CE1EAA0912DF3E81009BA949 /* HSRecentFiles.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = HSRecentFiles.m; path = ../../cocoalib/HSRecentFiles.m; sourceTree = SOURCE_ROOT; }; - CE22399E148FFE4F00B3DC99 /* PyColumns.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PyColumns.h; sourceTree = ""; }; CE2239A0148FFE6600B3DC99 /* HSColumns.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HSColumns.h; sourceTree = ""; }; CE2239A1148FFE6600B3DC99 /* HSColumns.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HSColumns.m; sourceTree = ""; }; CE2B2B5A1406ABDA0038D15A /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = ../base/de.lproj/Localizable.strings; sourceTree = ""; }; @@ -158,17 +166,13 @@ 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; }; 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; path = dg_cocoa.plugin; sourceTree = SOURCE_ROOT; }; CE4B59C61119919700C06C9E /* progress.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = progress.xib; sourceTree = ""; }; CE4F934712CCA96C0067A3AE /* HSAboutBox.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = HSAboutBox.h; path = ../../cocoalib/HSAboutBox.h; sourceTree = SOURCE_ROOT; }; CE4F934812CCA96C0067A3AE /* HSAboutBox.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = HSAboutBox.m; path = ../../cocoalib/HSAboutBox.m; sourceTree = SOURCE_ROOT; }; CE515DE00FC6C12E00EC695D /* Dialogs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Dialogs.h; path = ../../cocoalib/Dialogs.h; sourceTree = SOURCE_ROOT; }; CE515DE10FC6C12E00EC695D /* Dialogs.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Dialogs.m; path = ../../cocoalib/Dialogs.m; sourceTree = SOURCE_ROOT; }; - CE515DE20FC6C12E00EC695D /* HSErrorReportWindow.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = HSErrorReportWindow.h; path = ../../cocoalib/HSErrorReportWindow.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; }; CE515DE60FC6C12E00EC695D /* ProgressController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ProgressController.h; path = ../../cocoalib/ProgressController.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; }; - CE515DE80FC6C12E00EC695D /* PyApp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PyApp.h; path = ../../cocoalib/PyApp.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; }; CE515DF10FC6C12E00EC695D /* ValueTransformers.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ValueTransformers.h; path = ../../cocoalib/ValueTransformers.h; sourceTree = SOURCE_ROOT; }; @@ -178,7 +182,6 @@ CE515E170FC6C19300EC695D /* Consts.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Consts.h; path = ../base/Consts.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; }; CE515E190FC6C19300EC695D /* DirectoryPanel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = DirectoryPanel.m; path = ../base/DirectoryPanel.m; sourceTree = SOURCE_ROOT; }; - CE515E1A0FC6C19300EC695D /* PyDupeGuru.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PyDupeGuru.h; path = ../base/PyDupeGuru.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; }; CE515E1C0FC6C19300EC695D /* ResultWindow.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = ResultWindow.m; path = ../base/ResultWindow.m; sourceTree = SOURCE_ROOT; }; CE578301124DFC660004769C /* HSTableView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = HSTableView.h; path = ../../cocoalib/views/HSTableView.h; sourceTree = SOURCE_ROOT; }; @@ -202,7 +205,6 @@ CE74255F1460318D002F8E3E /* cs */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = cs; path = cs.lproj/Preferences.xib; sourceTree = ""; }; CE74A12112537F06008A8DF0 /* HSFairwareReminder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = HSFairwareReminder.h; path = ../../cocoalib/HSFairwareReminder.h; sourceTree = SOURCE_ROOT; }; CE74A12212537F06008A8DF0 /* HSFairwareReminder.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = HSFairwareReminder.m; path = ../../cocoalib/HSFairwareReminder.m; sourceTree = SOURCE_ROOT; }; - CE74A12312537F06008A8DF0 /* PyFairware.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PyFairware.h; path = ../../cocoalib/PyFairware.h; sourceTree = SOURCE_ROOT; }; CE74A12612537F2E008A8DF0 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = ../../cocoalib/en.lproj/FairwareReminder.xib; sourceTree = SOURCE_ROOT; }; CE7A6992146442F80007D927 /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = ../base/it.lproj/Localizable.strings; sourceTree = ""; }; CE7A6998146443090007D927 /* it */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = it; path = ../base/it.lproj/DetailsPanel.xib; sourceTree = ""; }; @@ -221,21 +223,54 @@ CE84C9AD1423ADFB0050A6AD /* PrioritizeDialog.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = PrioritizeDialog.m; path = ../base/PrioritizeDialog.m; sourceTree = ""; }; CE84C9AE1423ADFB0050A6AD /* PrioritizeList.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PrioritizeList.h; path = ../base/PrioritizeList.h; sourceTree = ""; }; CE84C9AF1423ADFB0050A6AD /* PrioritizeList.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = PrioritizeList.m; path = ../base/PrioritizeList.m; sourceTree = ""; }; - CE84C9B01423ADFB0050A6AD /* PyPrioritizeDialog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PyPrioritizeDialog.h; path = ../base/PyPrioritizeDialog.h; sourceTree = ""; }; - CE84C9B11423ADFB0050A6AD /* PyPrioritizeList.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PyPrioritizeList.h; path = ../base/PyPrioritizeList.h; sourceTree = ""; }; - CE84C9B41423AE2A0050A6AD /* PySelectableList.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PySelectableList.h; sourceTree = ""; }; CE84C9B51423AE410050A6AD /* HSPopUpList.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HSPopUpList.h; sourceTree = ""; }; CE84C9B61423AE410050A6AD /* HSPopUpList.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HSPopUpList.m; sourceTree = ""; }; CE84C9B71423AE410050A6AD /* HSSelectableList.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HSSelectableList.h; sourceTree = ""; }; CE84C9B81423AE410050A6AD /* HSSelectableList.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HSSelectableList.m; sourceTree = ""; }; CE84C9BC1423AF200050A6AD /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = ../base/en.lproj/PrioritizeDialog.xib; sourceTree = ""; }; + CE9705C414C46E7D007A28F6 /* ObjP.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ObjP.h; sourceTree = ""; }; + CE9705C514C46E7D007A28F6 /* ObjP.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ObjP.m; sourceTree = ""; }; + CE9705C614C46E7D007A28F6 /* PyColumns.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PyColumns.h; sourceTree = ""; }; + CE9705C714C46E7D007A28F6 /* PyColumns.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PyColumns.m; sourceTree = ""; }; + CE9705C814C46E7D007A28F6 /* PyDetailsPanel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PyDetailsPanel.h; sourceTree = ""; }; + CE9705C914C46E7D007A28F6 /* PyDetailsPanel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PyDetailsPanel.m; sourceTree = ""; }; + CE9705CA14C46E7D007A28F6 /* PyDirectoryOutline.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PyDirectoryOutline.h; sourceTree = ""; }; + CE9705CB14C46E7D007A28F6 /* PyDirectoryOutline.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PyDirectoryOutline.m; sourceTree = ""; }; + CE9705CC14C46E7D007A28F6 /* PyDupeGuru.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PyDupeGuru.h; sourceTree = ""; }; + CE9705CD14C46E7D007A28F6 /* PyDupeGuru.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PyDupeGuru.m; sourceTree = ""; }; + CE9705CE14C46E7D007A28F6 /* PyDupeGuruBase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PyDupeGuruBase.h; sourceTree = ""; }; + CE9705CF14C46E7D007A28F6 /* PyDupeGuruBase.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PyDupeGuruBase.m; sourceTree = ""; }; + CE9705D014C46E7D007A28F6 /* PyExtraFairwareReminder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PyExtraFairwareReminder.h; sourceTree = ""; }; + CE9705D114C46E7D007A28F6 /* PyExtraFairwareReminder.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PyExtraFairwareReminder.m; sourceTree = ""; }; + CE9705D214C46E7D007A28F6 /* PyFairware.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PyFairware.h; sourceTree = ""; }; + CE9705D314C46E7D007A28F6 /* PyFairware.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PyFairware.m; sourceTree = ""; }; + CE9705D414C46E7D007A28F6 /* PyGUIObject.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PyGUIObject.h; sourceTree = ""; }; + CE9705D514C46E7D007A28F6 /* PyGUIObject.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PyGUIObject.m; sourceTree = ""; }; + CE9705D614C46E7D007A28F6 /* PyOutline.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PyOutline.h; sourceTree = ""; }; + CE9705D714C46E7D007A28F6 /* PyOutline.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PyOutline.m; sourceTree = ""; }; + CE9705D814C46E7D007A28F6 /* PyPrioritizeDialog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PyPrioritizeDialog.h; sourceTree = ""; }; + CE9705D914C46E7D007A28F6 /* PyPrioritizeDialog.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PyPrioritizeDialog.m; sourceTree = ""; }; + CE9705DA14C46E7D007A28F6 /* PyPrioritizeList.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PyPrioritizeList.h; sourceTree = ""; }; + CE9705DB14C46E7D007A28F6 /* PyPrioritizeList.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PyPrioritizeList.m; sourceTree = ""; }; + CE9705DC14C46E7D007A28F6 /* PyProblemDialog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PyProblemDialog.h; sourceTree = ""; }; + CE9705DD14C46E7D007A28F6 /* PyProblemDialog.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PyProblemDialog.m; sourceTree = ""; }; + CE9705DE14C46E7D007A28F6 /* PyResultTable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PyResultTable.h; sourceTree = ""; }; + CE9705DF14C46E7D007A28F6 /* PyResultTable.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PyResultTable.m; sourceTree = ""; }; + CE9705E014C46E7D007A28F6 /* PySelectableList.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PySelectableList.h; sourceTree = ""; }; + CE9705E114C46E7D007A28F6 /* PySelectableList.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PySelectableList.m; sourceTree = ""; }; + CE9705E214C46E7D007A28F6 /* PyStatsLabel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PyStatsLabel.h; sourceTree = ""; }; + CE9705E314C46E7D007A28F6 /* PyStatsLabel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PyStatsLabel.m; sourceTree = ""; }; + CE9705E414C46E7D007A28F6 /* PyTable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PyTable.h; sourceTree = ""; }; + CE9705E514C46E7D007A28F6 /* PyTable.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PyTable.m; sourceTree = ""; }; + CE9705F714C46EA3007A28F6 /* Python */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = Python; path = ../../build/Python; sourceTree = ""; }; + CE9705FE14C46F60007A28F6 /* py */ = {isa = PBXFileReference; lastKnownFileType = folder; name = py; path = ../../build/py; sourceTree = ""; }; + CE97060014C46F70007A28F6 /* dg_cocoa.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; name = dg_cocoa.py; path = ../../build/dg_cocoa.py; sourceTree = ""; }; + CE97060214C471F2007A28F6 /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = ../base/main.m; sourceTree = ""; }; CEA14F421461ED63007F01A5 /* locale */ = {isa = PBXFileReference; lastKnownFileType = folder; name = locale; path = ../../build/locale; sourceTree = ""; }; - CEB14D26124DFC2800FA7481 /* PyResultTable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PyResultTable.h; path = ../base/PyResultTable.h; sourceTree = SOURCE_ROOT; }; CEB14D27124DFC2800FA7481 /* ResultTable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ResultTable.h; path = ../base/ResultTable.h; sourceTree = SOURCE_ROOT; }; CEB14D28124DFC2800FA7481 /* ResultTable.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = ResultTable.m; path = ../base/ResultTable.m; sourceTree = SOURCE_ROOT; }; CEB5E07513225C89009F521D /* ExtraFairwareReminder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ExtraFairwareReminder.h; path = ../base/ExtraFairwareReminder.h; sourceTree = SOURCE_ROOT; }; CEB5E07613225C89009F521D /* ExtraFairwareReminder.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = ExtraFairwareReminder.m; path = ../base/ExtraFairwareReminder.m; sourceTree = SOURCE_ROOT; }; - CEB5E07713225C89009F521D /* PyExtraFairwareReminder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PyExtraFairwareReminder.h; path = ../base/PyExtraFairwareReminder.h; sourceTree = SOURCE_ROOT; }; CEB5E07C13225CA2009F521D /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = ../base/en.lproj/ExtraFairwareReminder.xib; sourceTree = SOURCE_ROOT; }; CEB5E07E13225CB8009F521D /* fr */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = fr; path = ../base/fr.lproj/ExtraFairwareReminder.xib; sourceTree = SOURCE_ROOT; }; CEC3D37C14911253006B1A91 /* hy */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = hy; path = ../base/hy.lproj/DetailsPanel.xib; sourceTree = ""; }; @@ -264,8 +299,6 @@ CECE37A31423EA980005187F /* de */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = de; path = ../base/de.lproj/PrioritizeDialog.xib; sourceTree = ""; }; CECE37A41423EA980005187F /* fr */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = fr; path = ../base/fr.lproj/PrioritizeDialog.xib; sourceTree = ""; }; CECE37A51423EA980005187F /* zh_CN */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = zh_CN; path = ../base/zh_CN.lproj/PrioritizeDialog.xib; sourceTree = ""; }; - CED0A591111C9FD10020AD7D /* PyDetailsPanel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PyDetailsPanel.h; path = ../base/PyDetailsPanel.h; sourceTree = SOURCE_ROOT; }; - CEDF07A0112493B200EE5BC0 /* PyStatsLabel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PyStatsLabel.h; path = ../base/PyStatsLabel.h; sourceTree = SOURCE_ROOT; }; CEDF07A1112493B200EE5BC0 /* StatsLabel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = StatsLabel.h; path = ../base/StatsLabel.h; sourceTree = SOURCE_ROOT; }; CEDF07A2112493B200EE5BC0 /* StatsLabel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = StatsLabel.m; path = ../base/StatsLabel.m; sourceTree = SOURCE_ROOT; }; CEEB135109C837A2004D2330 /* dupeguru.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = dupeguru.icns; sourceTree = ""; }; @@ -284,7 +317,6 @@ CEF5770C13CDFB250083CB30 /* de */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = de; path = ../base/de.lproj/ResultWindow.xib; sourceTree = SOURCE_ROOT; }; CEF5770D13CDFB310083CB30 /* de */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = de; path = de.lproj/Preferences.xib; sourceTree = ""; }; CEFC294509C89E3D00D9F998 /* folder32.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = folder32.png; path = ../../images/folder32.png; sourceTree = SOURCE_ROOT; }; - CEFF18A009A4D387005E6321 /* PyDupeGuru.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = PyDupeGuru.h; sourceTree = SOURCE_ROOT; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -295,6 +327,7 @@ CE2E87F9142BC90A00519A68 /* Quartz.framework in Frameworks */, 8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */, CE1425890AFB718500BD5167 /* Sparkle.framework in Frameworks */, + CE9705F814C46EA3007A28F6 /* Python in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -304,13 +337,11 @@ 080E96DDFE201D6D7F000001 /* DGME */ = { isa = PBXGroup; children = ( - 29B97316FDCFA39411CA2CEA /* main.m */, CE381C9509914ACE003581CE /* AppDelegate.h */, CE381C9409914ACE003581CE /* AppDelegate.m */, CE848A1809DD85810004CB44 /* Consts.h */, CE68EE6509ABC48000971085 /* DirectoryPanel.h */, CE68EE6609ABC48000971085 /* DirectoryPanel.m */, - CEFF18A009A4D387005E6321 /* PyDupeGuru.h */, CE381C9B09914ADF003581CE /* ResultWindow.h */, CE381C9A09914ADF003581CE /* ResultWindow.m */, ); @@ -320,6 +351,7 @@ 1058C7A0FEA54F0111CA2CBB /* Linked Frameworks */ = { isa = PBXGroup; children = ( + CE9705F714C46EA3007A28F6 /* Python */, CE1425880AFB718500BD5167 /* Sparkle.framework */, 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */, CE2E87F8142BC90A00519A68 /* Quartz.framework */, @@ -350,6 +382,7 @@ children = ( 080E96DDFE201D6D7F000001 /* DGME */, CE515E140FC6C17900EC695D /* dgbase */, + CE9705C314C46E7D007A28F6 /* autogen */, CE515DDD0FC6C09400EC695D /* cocoalib */, 29B97317FDCFA39411CA2CEA /* Resources */, 29B97323FDCFA39411CA2CEA /* Frameworks */, @@ -361,9 +394,10 @@ 29B97317FDCFA39411CA2CEA /* Resources */ = { isa = PBXGroup; children = ( + CE97060014C46F70007A28F6 /* dg_cocoa.py */, + CE9705FE14C46F60007A28F6 /* py */, CEA14F421461ED63007F01A5 /* locale */, CE073F5409CAE1A3005C1D2F /* help */, - CE381CF509915304003581CE /* dg_cocoa.plugin */, CEFC294309C89E0000D9F998 /* images */, CE05330C12E5D3D70029EF25 /* xib */, CEEB135109C837A2004D2330 /* dupeguru.icns */, @@ -394,8 +428,6 @@ CE003CB611242D00004B0AA7 /* HSOutline.m */, CE0A0BFE1175A1C000DCA3C6 /* HSTable.h */, CE0A0BFF1175A1C000DCA3C6 /* HSTable.m */, - CE003CB711242D00004B0AA7 /* HSWindowController.h */, - CE003CB811242D00004B0AA7 /* HSWindowController.m */, CE84C9B51423AE410050A6AD /* HSPopUpList.h */, CE84C9B61423AE410050A6AD /* HSPopUpList.m */, CE84C9B71423AE410050A6AD /* HSSelectableList.h */, @@ -405,19 +437,6 @@ path = ../../cocoalib/controllers; sourceTree = SOURCE_ROOT; }; - CE003CBB11242D00004B0AA7 /* proxies */ = { - isa = PBXGroup; - children = ( - CE22399E148FFE4F00B3DC99 /* PyColumns.h */, - CE003CBC11242D00004B0AA7 /* PyGUI.h */, - CE003CBD11242D00004B0AA7 /* PyOutline.h */, - CE0A0C131175A28100DCA3C6 /* PyTable.h */, - CE84C9B41423AE2A0050A6AD /* PySelectableList.h */, - ); - name = proxies; - path = ../../cocoalib/proxies; - sourceTree = SOURCE_ROOT; - }; CE003CBF11242D00004B0AA7 /* views */ = { isa = PBXGroup; children = ( @@ -465,16 +484,12 @@ isa = PBXGroup; children = ( CE003CB211242D00004B0AA7 /* controllers */, - CE003CBB11242D00004B0AA7 /* proxies */, CE003CBF11242D00004B0AA7 /* views */, CE4B59C41119919700C06C9E /* xib */, CE515DE00FC6C12E00EC695D /* Dialogs.h */, CE515DE10FC6C12E00EC695D /* Dialogs.m */, - CE515DE20FC6C12E00EC695D /* HSErrorReportWindow.h */, - CE515DE30FC6C12E00EC695D /* HSErrorReportWindow.m */, CE74A12112537F06008A8DF0 /* HSFairwareReminder.h */, CE74A12212537F06008A8DF0 /* HSFairwareReminder.m */, - CE74A12312537F06008A8DF0 /* PyFairware.h */, CE4F934712CCA96C0067A3AE /* HSAboutBox.h */, CE4F934812CCA96C0067A3AE /* HSAboutBox.m */, CE1EAA0812DF3E81009BA949 /* HSRecentFiles.h */, @@ -485,7 +500,6 @@ CE003CBA11242D00004B0AA7 /* NSEventAdditions.m */, CE515DE60FC6C12E00EC695D /* ProgressController.h */, CE515DE70FC6C12E00EC695D /* ProgressController.m */, - CE515DE80FC6C12E00EC695D /* PyApp.h */, CE515DEF0FC6C12E00EC695D /* Utils.h */, CE515DF00FC6C12E00EC695D /* Utils.m */, CE515DF10FC6C12E00EC695D /* ValueTransformers.h */, @@ -499,40 +513,74 @@ children = ( CEB14D27124DFC2800FA7481 /* ResultTable.h */, CEB14D28124DFC2800FA7481 /* ResultTable.m */, - CEB14D26124DFC2800FA7481 /* PyResultTable.h */, CE003CCD11242D2C004B0AA7 /* DirectoryOutline.h */, CE003CCE11242D2C004B0AA7 /* DirectoryOutline.m */, - CE003CCF11242D2C004B0AA7 /* PyDirectoryOutline.h */, CE515E150FC6C19300EC695D /* AppDelegate.h */, CE515E160FC6C19300EC695D /* AppDelegate.m */, - CE515E1A0FC6C19300EC695D /* PyDupeGuru.h */, CE515E170FC6C19300EC695D /* Consts.h */, CE6032BE0FE6784C007E33FF /* DetailsPanel.h */, CE6032BF0FE6784C007E33FF /* DetailsPanel.m */, - CED0A591111C9FD10020AD7D /* PyDetailsPanel.h */, CE515E180FC6C19300EC695D /* DirectoryPanel.h */, CE515E190FC6C19300EC695D /* DirectoryPanel.m */, CE0A0C011175A1DE00DCA3C6 /* ProblemDialog.h */, CE0A0C021175A1DE00DCA3C6 /* ProblemDialog.m */, - CE0A0C031175A1DE00DCA3C6 /* PyProblemDialog.h */, CE515E1B0FC6C19300EC695D /* ResultWindow.h */, CE515E1C0FC6C19300EC695D /* ResultWindow.m */, CEDF07A1112493B200EE5BC0 /* StatsLabel.h */, CEDF07A2112493B200EE5BC0 /* StatsLabel.m */, - CEDF07A0112493B200EE5BC0 /* PyStatsLabel.h */, CEB5E07513225C89009F521D /* ExtraFairwareReminder.h */, CEB5E07613225C89009F521D /* ExtraFairwareReminder.m */, - CEB5E07713225C89009F521D /* PyExtraFairwareReminder.h */, CE84C9AC1423ADFB0050A6AD /* PrioritizeDialog.h */, CE84C9AD1423ADFB0050A6AD /* PrioritizeDialog.m */, - CE84C9B01423ADFB0050A6AD /* PyPrioritizeDialog.h */, CE84C9AE1423ADFB0050A6AD /* PrioritizeList.h */, CE84C9AF1423ADFB0050A6AD /* PrioritizeList.m */, - CE84C9B11423ADFB0050A6AD /* PyPrioritizeList.h */, + CE97060214C471F2007A28F6 /* main.m */, ); name = dgbase; sourceTree = ""; }; + CE9705C314C46E7D007A28F6 /* autogen */ = { + isa = PBXGroup; + children = ( + CE9705C414C46E7D007A28F6 /* ObjP.h */, + CE9705C514C46E7D007A28F6 /* ObjP.m */, + CE9705C614C46E7D007A28F6 /* PyColumns.h */, + CE9705C714C46E7D007A28F6 /* PyColumns.m */, + CE9705C814C46E7D007A28F6 /* PyDetailsPanel.h */, + CE9705C914C46E7D007A28F6 /* PyDetailsPanel.m */, + CE9705CA14C46E7D007A28F6 /* PyDirectoryOutline.h */, + CE9705CB14C46E7D007A28F6 /* PyDirectoryOutline.m */, + CE9705CC14C46E7D007A28F6 /* PyDupeGuru.h */, + CE9705CD14C46E7D007A28F6 /* PyDupeGuru.m */, + CE9705CE14C46E7D007A28F6 /* PyDupeGuruBase.h */, + CE9705CF14C46E7D007A28F6 /* PyDupeGuruBase.m */, + CE9705D014C46E7D007A28F6 /* PyExtraFairwareReminder.h */, + CE9705D114C46E7D007A28F6 /* PyExtraFairwareReminder.m */, + CE9705D214C46E7D007A28F6 /* PyFairware.h */, + CE9705D314C46E7D007A28F6 /* PyFairware.m */, + CE9705D414C46E7D007A28F6 /* PyGUIObject.h */, + CE9705D514C46E7D007A28F6 /* PyGUIObject.m */, + CE9705D614C46E7D007A28F6 /* PyOutline.h */, + CE9705D714C46E7D007A28F6 /* PyOutline.m */, + CE9705D814C46E7D007A28F6 /* PyPrioritizeDialog.h */, + CE9705D914C46E7D007A28F6 /* PyPrioritizeDialog.m */, + CE9705DA14C46E7D007A28F6 /* PyPrioritizeList.h */, + CE9705DB14C46E7D007A28F6 /* PyPrioritizeList.m */, + CE9705DC14C46E7D007A28F6 /* PyProblemDialog.h */, + CE9705DD14C46E7D007A28F6 /* PyProblemDialog.m */, + CE9705DE14C46E7D007A28F6 /* PyResultTable.h */, + CE9705DF14C46E7D007A28F6 /* PyResultTable.m */, + CE9705E014C46E7D007A28F6 /* PySelectableList.h */, + CE9705E114C46E7D007A28F6 /* PySelectableList.m */, + CE9705E214C46E7D007A28F6 /* PyStatsLabel.h */, + CE9705E314C46E7D007A28F6 /* PyStatsLabel.m */, + CE9705E414C46E7D007A28F6 /* PyTable.h */, + CE9705E514C46E7D007A28F6 /* PyTable.m */, + ); + name = autogen; + path = ../autogen; + sourceTree = ""; + }; CEFC294309C89E0000D9F998 /* images */ = { isa = PBXGroup; children = ( @@ -603,7 +651,6 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - CE381D0509915304003581CE /* dg_cocoa.plugin in Resources */, CE073F6309CAE1A3005C1D2F /* help in Resources */, CEEB135209C837A2004D2330 /* dupeguru.icns in Resources */, CEFC294609C89E3D00D9F998 /* folder32.png in Resources */, @@ -622,6 +669,8 @@ CEF3185A13D8660000B8CDCA /* ErrorReportWindow.xib in Resources */, CE84C9BD1423AF200050A6AD /* PrioritizeDialog.xib in Resources */, CEA14F431461ED63007F01A5 /* locale in Resources */, + CE9705FF14C46F60007A28F6 /* py in Resources */, + CE97060114C46F70007A28F6 /* dg_cocoa.py in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -632,12 +681,10 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 8D11072D0486CEB800E47090 /* main.m in Sources */, CE381C9609914ACE003581CE /* AppDelegate.m in Sources */, CE381C9C09914ADF003581CE /* ResultWindow.m in Sources */, CE68EE6809ABC48000971085 /* DirectoryPanel.m in Sources */, CE515DF30FC6C12E00EC695D /* Dialogs.m in Sources */, - CE515DF40FC6C12E00EC695D /* HSErrorReportWindow.m in Sources */, CE515DF60FC6C12E00EC695D /* ProgressController.m in Sources */, CE515DFA0FC6C12E00EC695D /* Utils.m in Sources */, CE515DFB0FC6C12E00EC695D /* ValueTransformers.m in Sources */, @@ -647,7 +694,6 @@ CE6032C00FE6784C007E33FF /* DetailsPanel.m in Sources */, CE003CC611242D00004B0AA7 /* HSGUIController.m in Sources */, CE003CC711242D00004B0AA7 /* HSOutline.m in Sources */, - CE003CC811242D00004B0AA7 /* HSWindowController.m in Sources */, CE003CC911242D00004B0AA7 /* NSEventAdditions.m in Sources */, CE003CCA11242D00004B0AA7 /* HSOutlineView.m in Sources */, CE003CCB11242D00004B0AA7 /* NSIndexPathAdditions.m in Sources */, @@ -668,6 +714,24 @@ CE84C9BA1423AE410050A6AD /* HSSelectableList.m in Sources */, CE2E87FD142BC92C00519A68 /* HSQuicklook.m in Sources */, CE2239A2148FFE6600B3DC99 /* HSColumns.m in Sources */, + CE9705E614C46E7D007A28F6 /* ObjP.m in Sources */, + CE9705E714C46E7D007A28F6 /* PyColumns.m in Sources */, + CE9705E814C46E7D007A28F6 /* PyDetailsPanel.m in Sources */, + CE9705E914C46E7D007A28F6 /* PyDirectoryOutline.m in Sources */, + CE9705EA14C46E7D007A28F6 /* PyDupeGuru.m in Sources */, + CE9705EB14C46E7D007A28F6 /* PyDupeGuruBase.m in Sources */, + CE9705EC14C46E7D007A28F6 /* PyExtraFairwareReminder.m in Sources */, + CE9705ED14C46E7D007A28F6 /* PyFairware.m in Sources */, + CE9705EE14C46E7D007A28F6 /* PyGUIObject.m in Sources */, + CE9705EF14C46E7D007A28F6 /* PyOutline.m in Sources */, + CE9705F014C46E7D007A28F6 /* PyPrioritizeDialog.m in Sources */, + CE9705F114C46E7D007A28F6 /* PyPrioritizeList.m in Sources */, + CE9705F214C46E7D007A28F6 /* PyProblemDialog.m in Sources */, + CE9705F314C46E7D007A28F6 /* PyResultTable.m in Sources */, + CE9705F414C46E7D007A28F6 /* PySelectableList.m in Sources */, + CE9705F514C46E7D007A28F6 /* PyStatsLabel.m in Sources */, + CE9705F614C46E7D007A28F6 /* PyTable.m in Sources */, + CE97060314C471F2007A28F6 /* main.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -855,6 +919,10 @@ GCC_GENERATE_DEBUGGING_SYMBOLS = NO; INFOPLIST_FILE = Info.plist; INSTALL_PATH = "$(PROJECT_DIR)"; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "\"$(SRCROOT)/../../build\"", + ); PRODUCT_NAME = "dupeGuru ME"; WRAPPER_EXTENSION = app; }; @@ -865,8 +933,8 @@ buildSettings = { ARCHS = "$(ARCHS_STANDARD_32_64_BIT)"; GCC_C_LANGUAGE_STANDARD = c99; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = "\"$(SRCROOT)/../../build/PythonHeaders\""; + LD_RUNPATH_SEARCH_PATHS = "@executable_path/../Frameworks"; MACOSX_DEPLOYMENT_TARGET = 10.6; SDKROOT = macosx10.6; }; @@ -877,8 +945,8 @@ buildSettings = { ARCHS = "$(NATIVE_ARCH_ACTUAL)"; GCC_C_LANGUAGE_STANDARD = c99; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = "\"$(SRCROOT)/../../build/PythonHeaders\""; + LD_RUNPATH_SEARCH_PATHS = "@executable_path/../Frameworks"; MACOSX_DEPLOYMENT_TARGET = 10.6; SDKROOT = macosx10.6; }; @@ -892,6 +960,10 @@ DSTROOT = /; INFOPLIST_FILE = Info.plist; INSTALL_PATH = "$(PROJECT_DIR)"; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "\"$(SRCROOT)/../../build\"", + ); PRODUCT_NAME = "dupeGuru ME"; WRAPPER_EXTENSION = app; }; diff --git a/cocoa/me/main.m b/cocoa/me/main.m deleted file mode 100644 index 7fedbb8e..00000000 --- a/cocoa/me/main.m +++ /dev/null @@ -1,23 +0,0 @@ -/* -Copyright 2011 Hardcoded Software (http://www.hardcoded.net) - -This software is licensed under the "BSD" License as described in the "LICENSE" file, -which should be included with this package. The terms are also available at -http://www.hardcoded.net/licenses/bsd_license -*/ - -#import -#import "Utils.h" - -int main(int argc, char *argv[]) -{ - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - [Utils setPluginName:@"dg_cocoa"]; - NSString *pluginPath = [[NSBundle mainBundle] - pathForResource:@"dg_cocoa" - ofType:@"plugin"]; - NSBundle *pluginBundle = [NSBundle bundleWithPath:pluginPath]; - [pluginBundle load]; - [pool release]; - return NSApplicationMain(argc, (const char **) argv); -} diff --git a/cocoa/pe/AppDelegate.h b/cocoa/pe/AppDelegate.h index 669b49e2..f6eaa271 100644 --- a/cocoa/pe/AppDelegate.h +++ b/cocoa/pe/AppDelegate.h @@ -8,8 +8,6 @@ http://www.hardcoded.net/licenses/bsd_license #import #import "../base/AppDelegate.h" -#import "PyDupeGuru.h" @interface AppDelegate : AppDelegateBase {} -- (PyDupeGuru *)py; @end diff --git a/cocoa/pe/AppDelegate.m b/cocoa/pe/AppDelegate.m index 8c7afbfa..c6cc1670 100644 --- a/cocoa/pe/AppDelegate.m +++ b/cocoa/pe/AppDelegate.m @@ -64,11 +64,9 @@ http://www.hardcoded.net/licenses/bsd_license - (DetailsPanel *)createDetailsPanel { - return [[DetailsPanelPE alloc] initWithPy:py]; + return [[DetailsPanelPE alloc] initWithApp:model]; } -- (PyDupeGuru *)py { return (PyDupeGuru *)py; } - //Delegate - (void)applicationDidFinishLaunching:(NSNotification *)aNotification { diff --git a/cocoa/pe/DetailsPanel.h b/cocoa/pe/DetailsPanel.h index 146eb5d2..3fe530fa 100644 --- a/cocoa/pe/DetailsPanel.h +++ b/cocoa/pe/DetailsPanel.h @@ -8,6 +8,7 @@ http://www.hardcoded.net/licenses/bsd_license #import #import "../base/DetailsPanel.h" +#import "PyDupeGuru.h" @interface DetailsPanelPE : DetailsPanel { @@ -16,9 +17,11 @@ http://www.hardcoded.net/licenses/bsd_license IBOutlet NSImageView *refImage; IBOutlet NSProgressIndicator *refProgressIndicator; - PyApp *pyApp; + PyDupeGuru *pyApp; BOOL _needsRefresh; NSString *_dupePath; NSString *_refPath; } + +- (id)initWithApp:(PyDupeGuru *)aApp; @end \ No newline at end of file diff --git a/cocoa/pe/DetailsPanel.m b/cocoa/pe/DetailsPanel.m index 692c2591..f94f823c 100644 --- a/cocoa/pe/DetailsPanel.m +++ b/cocoa/pe/DetailsPanel.m @@ -14,10 +14,10 @@ http://www.hardcoded.net/licenses/bsd_license #import "Consts.h" @implementation DetailsPanelPE -- (id)initWithPy:(PyApp *)aPy +- (id)initWithApp:(PyDupeGuru *)aApp { - self = [super initWithPy:aPy]; - pyApp = aPy; + self = [super initWithPyRef:[aApp detailsPanel]]; + pyApp = aApp; _needsRefresh = YES; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(imageLoaded:) name:ImageLoadedNotification object:self]; return self; @@ -42,12 +42,12 @@ http://www.hardcoded.net/licenses/bsd_license return; [detailsTable reloadData]; - NSString *refPath = [(PyDupeGuru *)pyApp getSelectedDupeRefPath]; + NSString *refPath = [pyApp getSelectedDupeRefPath]; if (_refPath != nil) [_refPath autorelease]; _refPath = [refPath retain]; [NSThread detachNewThreadSelector:@selector(loadImageAsync:) toTarget:self withObject:refPath]; - NSString *dupePath = [(PyDupeGuru *)pyApp getSelectedDupePath]; + NSString *dupePath = [pyApp getSelectedDupePath]; if (_dupePath != nil) [_dupePath autorelease]; _dupePath = [dupePath retain]; diff --git a/cocoa/pe/PyDupeGuru.h b/cocoa/pe/PyDupeGuru.h deleted file mode 100644 index 8270124b..00000000 --- a/cocoa/pe/PyDupeGuru.h +++ /dev/null @@ -1,17 +0,0 @@ -/* -Copyright 2011 Hardcoded Software (http://www.hardcoded.net) - -This software is licensed under the "BSD" License as described in the "LICENSE" file, -which should be included with this package. The terms are also available at -http://www.hardcoded.net/licenses/bsd_license -*/ - -#import -#import "../base/PyDupeGuru.h" - -@interface PyDupeGuru : PyDupeGuruBase -- (void)clearPictureCache; -- (NSString *)getSelectedDupePath; -- (NSString *)getSelectedDupeRefPath; -- (void)setMatchScaled:(NSNumber *)match_scaled; -@end diff --git a/cocoa/pe/ResultWindow.m b/cocoa/pe/ResultWindow.m index 23df283d..e6b304b8 100644 --- a/cocoa/pe/ResultWindow.m +++ b/cocoa/pe/ResultWindow.m @@ -40,12 +40,11 @@ http://www.hardcoded.net/licenses/bsd_license - (void)setScanOptions { NSUserDefaults *ud = [NSUserDefaults standardUserDefaults]; - PyDupeGuru *_py = (PyDupeGuru *)py; - [_py setScanType:[ud objectForKey:@"scanType"]]; - [_py setMinMatchPercentage:[ud objectForKey:@"minMatchPercentage"]]; - [_py setMixFileKind:n2b([ud objectForKey:@"mixFileKind"])]; - [_py setIgnoreHardlinkMatches:n2b([ud objectForKey:@"ignoreHardlinkMatches"])]; - [_py setMatchScaled:[ud objectForKey:@"matchScaled"]]; + [model setScanType:n2i([ud objectForKey:@"scanType"])]; + [model setMinMatchPercentage:n2i([ud objectForKey:@"minMatchPercentage"])]; + [model setMixFileKind:n2b([ud objectForKey:@"mixFileKind"])]; + [model setIgnoreHardlinkMatches:n2b([ud objectForKey:@"ignoreHardlinkMatches"])]; + [model setMatchScaled:n2b([ud objectForKey:@"matchScaled"])]; } /* Actions */ @@ -54,6 +53,6 @@ http://www.hardcoded.net/licenses/bsd_license NSString *msg = TR(@"Do you really want to remove all your cached picture analysis?"); if ([Dialogs askYesNo:msg] == NSAlertSecondButtonReturn) // NO return; - [(PyDupeGuru *)py clearPictureCache]; + [model clearPictureCache]; } @end \ No newline at end of file diff --git a/cocoa/pe/dg_cocoa.py b/cocoa/pe/dg_cocoa.py index abbf8d4d..0e1572c2 100644 --- a/cocoa/pe/dg_cocoa.py +++ b/cocoa/pe/dg_cocoa.py @@ -7,48 +7,15 @@ from hscommon.trans import install_gettext_trans_under_cocoa install_gettext_trans_under_cocoa() -from core.scanner import ScanType +from cocoa.inter import PySelectableList, PyColumns, PyTable -from inter.app import PyDupeGuruBase from inter.details_panel import PyDetailsPanel from inter.directory_outline import PyDirectoryOutline from inter.extra_fairware_reminder import PyExtraFairwareReminder from inter.prioritize_dialog import PyPrioritizeDialog +from inter.prioritize_list import PyPrioritizeList from inter.problem_dialog import PyProblemDialog -from inter.problem_table import PyProblemTable from inter.result_table import PyResultTable from inter.stats_label import PyStatsLabel -from inter.app_pe import DupeGuruPE - -class PyDupeGuru(PyDupeGuruBase): - def init(self): - self = super(PyDupeGuru, self).init() - self._init(DupeGuruPE) - return self - - def clearPictureCache(self): - self.py.scanner.clear_picture_cache() - - #---Information - def getSelectedDupePath(self): - return str(self.py.selected_dupe_path()) - - def getSelectedDupeRefPath(self): - return str(self.py.selected_dupe_ref_path()) - - #---Properties - def setScanType_(self, scan_type): - try: - self.py.scanner.scan_type = [ - ScanType.FuzzyBlock, - ScanType.ExifTimestamp, - ][scan_type] - except IndexError: - pass - - def setMatchScaled_(self,match_scaled): - self.py.scanner.match_scaled = match_scaled - - def setMinMatchPercentage_(self,percentage): - self.py.scanner.threshold = int(percentage) +from inter.app_pe import PyDupeGuru diff --git a/cocoa/pe/dupeguru.xcodeproj/project.pbxproj b/cocoa/pe/dupeguru.xcodeproj/project.pbxproj index af7c6817..8fd64abf 100644 --- a/cocoa/pe/dupeguru.xcodeproj/project.pbxproj +++ b/cocoa/pe/dupeguru.xcodeproj/project.pbxproj @@ -7,7 +7,6 @@ objects = { /* Begin PBXBuildFile section */ - 8D11072D0486CEB800E47090 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B97316FDCFA39411CA2CEA /* main.m */; settings = {ATTRIBUTES = (); }; }; 8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; }; CE05339B12E5DA350029EF25 /* DirectoryPanel.xib in Resources */ = {isa = PBXBuildFile; fileRef = CE05339312E5DA350029EF25 /* DirectoryPanel.xib */; }; CE05339C12E5DA350029EF25 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = CE05339512E5DA350029EF25 /* MainMenu.xib */; }; @@ -27,12 +26,33 @@ CE2A29F713213BFB005899AC /* ExtraFairwareReminder.xib in Resources */ = {isa = PBXBuildFile; fileRef = CE2A29F513213BFB005899AC /* ExtraFairwareReminder.xib */; }; CE381C9609914ACE003581CE /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = CE381C9409914ACE003581CE /* AppDelegate.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 */; }; CE60180812DF3EA900236FDC /* HSRecentFiles.m in Sources */ = {isa = PBXBuildFile; fileRef = CE60180712DF3EA900236FDC /* HSRecentFiles.m */; }; CE6044EC0FE6796200B71262 /* DetailsPanel.m in Sources */ = {isa = PBXBuildFile; fileRef = CE6044EB0FE6796200B71262 /* DetailsPanel.m */; }; CE63D9D31461EDC000A8CADD /* locale in Resources */ = {isa = PBXBuildFile; fileRef = CE63D9D21461EDC000A8CADD /* locale */; }; CE68EE6809ABC48000971085 /* DirectoryPanel.m in Sources */ = {isa = PBXBuildFile; fileRef = CE68EE6609ABC48000971085 /* DirectoryPanel.m */; }; CE6E0F3D1054EC62008D9390 /* dsa_pub.pem in Resources */ = {isa = PBXBuildFile; fileRef = CE6E0F3C1054EC62008D9390 /* dsa_pub.pem */; }; + CE75017314C4770500E2A349 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = CE75017214C4770500E2A349 /* main.m */; }; + CE75017514C4771800E2A349 /* py in Resources */ = {isa = PBXBuildFile; fileRef = CE75017414C4771800E2A349 /* py */; }; + CE75017714C4772100E2A349 /* dg_cocoa.py in Resources */ = {isa = PBXBuildFile; fileRef = CE75017614C4772100E2A349 /* dg_cocoa.py */; }; + CE75017914C4774900E2A349 /* Python in Frameworks */ = {isa = PBXBuildFile; fileRef = CE75017814C4774900E2A349 /* Python */; }; + CE75017A14C4775B00E2A349 /* Python in CopyFiles */ = {isa = PBXBuildFile; fileRef = CE75017814C4774900E2A349 /* Python */; }; + CE75019E14C477B100E2A349 /* ObjP.m in Sources */ = {isa = PBXBuildFile; fileRef = CE75017D14C477B100E2A349 /* ObjP.m */; }; + CE75019F14C477B100E2A349 /* PyColumns.m in Sources */ = {isa = PBXBuildFile; fileRef = CE75017F14C477B100E2A349 /* PyColumns.m */; }; + CE7501A014C477B100E2A349 /* PyDetailsPanel.m in Sources */ = {isa = PBXBuildFile; fileRef = CE75018114C477B100E2A349 /* PyDetailsPanel.m */; }; + CE7501A114C477B100E2A349 /* PyDirectoryOutline.m in Sources */ = {isa = PBXBuildFile; fileRef = CE75018314C477B100E2A349 /* PyDirectoryOutline.m */; }; + CE7501A214C477B100E2A349 /* PyDupeGuru.m in Sources */ = {isa = PBXBuildFile; fileRef = CE75018514C477B100E2A349 /* PyDupeGuru.m */; }; + CE7501A314C477B100E2A349 /* PyDupeGuruBase.m in Sources */ = {isa = PBXBuildFile; fileRef = CE75018714C477B100E2A349 /* PyDupeGuruBase.m */; }; + CE7501A414C477B100E2A349 /* PyExtraFairwareReminder.m in Sources */ = {isa = PBXBuildFile; fileRef = CE75018914C477B100E2A349 /* PyExtraFairwareReminder.m */; }; + CE7501A514C477B100E2A349 /* PyFairware.m in Sources */ = {isa = PBXBuildFile; fileRef = CE75018B14C477B100E2A349 /* PyFairware.m */; }; + CE7501A614C477B100E2A349 /* PyGUIObject.m in Sources */ = {isa = PBXBuildFile; fileRef = CE75018D14C477B100E2A349 /* PyGUIObject.m */; }; + CE7501A714C477B100E2A349 /* PyOutline.m in Sources */ = {isa = PBXBuildFile; fileRef = CE75018F14C477B100E2A349 /* PyOutline.m */; }; + CE7501A814C477B100E2A349 /* PyPrioritizeDialog.m in Sources */ = {isa = PBXBuildFile; fileRef = CE75019114C477B100E2A349 /* PyPrioritizeDialog.m */; }; + CE7501A914C477B100E2A349 /* PyPrioritizeList.m in Sources */ = {isa = PBXBuildFile; fileRef = CE75019314C477B100E2A349 /* PyPrioritizeList.m */; }; + CE7501AA14C477B100E2A349 /* PyProblemDialog.m in Sources */ = {isa = PBXBuildFile; fileRef = CE75019514C477B100E2A349 /* PyProblemDialog.m */; }; + CE7501AB14C477B100E2A349 /* PyResultTable.m in Sources */ = {isa = PBXBuildFile; fileRef = CE75019714C477B100E2A349 /* PyResultTable.m */; }; + CE7501AC14C477B100E2A349 /* PySelectableList.m in Sources */ = {isa = PBXBuildFile; fileRef = CE75019914C477B100E2A349 /* PySelectableList.m */; }; + CE7501AD14C477B100E2A349 /* PyStatsLabel.m in Sources */ = {isa = PBXBuildFile; fileRef = CE75019B14C477B100E2A349 /* PyStatsLabel.m */; }; + CE7501AE14C477B100E2A349 /* PyTable.m in Sources */ = {isa = PBXBuildFile; fileRef = CE75019D14C477B100E2A349 /* PyTable.m */; }; CE7AC9191119911200D02F6C /* progress.xib in Resources */ = {isa = PBXBuildFile; fileRef = CE7AC9161119911200D02F6C /* progress.xib */; }; CE7D249D1423B0BD002E2297 /* HSPopUpList.m in Sources */ = {isa = PBXBuildFile; fileRef = CE7D249A1423B0BD002E2297 /* HSPopUpList.m */; }; CE7D249E1423B0BD002E2297 /* HSSelectableList.m in Sources */ = {isa = PBXBuildFile; fileRef = CE7D249C1423B0BD002E2297 /* HSSelectableList.m */; }; @@ -40,7 +60,6 @@ CE7D24A61423B106002E2297 /* PrioritizeList.m in Sources */ = {isa = PBXBuildFile; fileRef = CE7D24A21423B106002E2297 /* PrioritizeList.m */; }; CE7D24A91423B123002E2297 /* PrioritizeDialog.xib in Resources */ = {isa = PBXBuildFile; fileRef = CE7D24A71423B123002E2297 /* PrioritizeDialog.xib */; }; CE80DB2E0FC192D60086DCA6 /* Dialogs.m in Sources */ = {isa = PBXBuildFile; fileRef = CE80DB1C0FC192D60086DCA6 /* Dialogs.m */; }; - CE80DB2F0FC192D60086DCA6 /* HSErrorReportWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = CE80DB1E0FC192D60086DCA6 /* HSErrorReportWindow.m */; }; CE80DB310FC192D60086DCA6 /* ProgressController.m in Sources */ = {isa = PBXBuildFile; fileRef = CE80DB220FC192D60086DCA6 /* ProgressController.m */; }; CE80DB350FC192D60086DCA6 /* Utils.m in Sources */ = {isa = PBXBuildFile; fileRef = CE80DB2B0FC192D60086DCA6 /* Utils.m */; }; CE80DB360FC192D60086DCA6 /* ValueTransformers.m in Sources */ = {isa = PBXBuildFile; fileRef = CE80DB2D0FC192D60086DCA6 /* ValueTransformers.m */; }; @@ -49,11 +68,9 @@ CE80DB8A0FC1951C0086DCA6 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = CE80DB830FC1951C0086DCA6 /* AppDelegate.m */; }; CE80DB8B0FC1951C0086DCA6 /* DirectoryPanel.m in Sources */ = {isa = PBXBuildFile; fileRef = CE80DB860FC1951C0086DCA6 /* DirectoryPanel.m */; }; CE80DB8C0FC1951C0086DCA6 /* ResultWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = CE80DB890FC1951C0086DCA6 /* ResultWindow.m */; }; - CE848A1909DD85810004CB44 /* Consts.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = CE848A1809DD85810004CB44 /* Consts.h */; }; CE95865F112C516400F95FD2 /* StatsLabel.m in Sources */ = {isa = PBXBuildFile; fileRef = CE95865D112C516400F95FD2 /* StatsLabel.m */; }; CE9EA7561122C96C008CD2BC /* HSGUIController.m in Sources */ = {isa = PBXBuildFile; fileRef = CE9EA7441122C96C008CD2BC /* HSGUIController.m */; }; CE9EA7571122C96C008CD2BC /* HSOutline.m in Sources */ = {isa = PBXBuildFile; fileRef = CE9EA7461122C96C008CD2BC /* HSOutline.m */; }; - CE9EA7581122C96C008CD2BC /* HSWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = CE9EA7481122C96C008CD2BC /* HSWindowController.m */; }; CE9EA7591122C96C008CD2BC /* NSEventAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = CE9EA74A1122C96C008CD2BC /* NSEventAdditions.m */; }; CE9EA75A1122C96C008CD2BC /* HSOutlineView.m in Sources */ = {isa = PBXBuildFile; fileRef = CE9EA7511122C96C008CD2BC /* HSOutlineView.m */; }; CE9EA75B1122C96C008CD2BC /* NSIndexPathAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = CE9EA7531122C96C008CD2BC /* NSIndexPathAdditions.m */; }; @@ -62,7 +79,6 @@ CEA8F336142BC9AB00A6DFAC /* Quartz.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEA8F335142BC9AB00A6DFAC /* Quartz.framework */; }; CEA8F33A142BC9D400A6DFAC /* HSQuicklook.m in Sources */ = {isa = PBXBuildFile; fileRef = CEA8F339142BC9D400A6DFAC /* HSQuicklook.m */; }; CEC9DB4C12CCAA7D003102F0 /* HSAboutBox.m in Sources */ = {isa = PBXBuildFile; fileRef = CEC9DB4B12CCAA7D003102F0 /* HSAboutBox.m */; }; - CECA899C09DB132E00A3D774 /* DetailsPanel.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = CECA899A09DB132E00A3D774 /* DetailsPanel.h */; }; CECA899D09DB132E00A3D774 /* DetailsPanel.m in Sources */ = {isa = PBXBuildFile; fileRef = CECA899B09DB132E00A3D774 /* DetailsPanel.m */; }; CECB2AC513D867AD0081E295 /* about.xib in Resources */ = {isa = PBXBuildFile; fileRef = CECB2AC113D867AD0081E295 /* about.xib */; }; CECB2AC613D867AD0081E295 /* ErrorReportWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = CECB2AC313D867AD0081E295 /* ErrorReportWindow.xib */; }; @@ -81,8 +97,7 @@ dstSubfolderSpec = 10; files = ( CE15C8C00ADEB8D40061D4A5 /* Sparkle.framework in CopyFiles */, - CECA899C09DB132E00A3D774 /* DetailsPanel.h in CopyFiles */, - CE848A1909DD85810004CB44 /* Consts.h in CopyFiles */, + CE75017A14C4775B00E2A349 /* Python in CopyFiles */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -91,7 +106,6 @@ /* Begin PBXFileReference section */ 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = /System/Library/Frameworks/Cocoa.framework; sourceTree = ""; }; 13E42FB307B3F0F600E4EEF1 /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = /System/Library/Frameworks/CoreData.framework; sourceTree = ""; }; - 29B97316FDCFA39411CA2CEA /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 29B97324FDCFA39411CA2CEA /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = /System/Library/Frameworks/AppKit.framework; sourceTree = ""; }; 29B97325FDCFA39411CA2CEA /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = /System/Library/Frameworks/Foundation.framework; sourceTree = ""; }; 8D1107310486CEB800E47090 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = SOURCE_ROOT; }; @@ -112,17 +126,13 @@ CE0533AE12E5DAAD0029EF25 /* fr */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = fr; path = fr.lproj/Preferences.xib; sourceTree = ""; }; CE0533B712E5DC040029EF25 /* fr */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = fr; path = ../../cocoalib/fr.lproj/FairwareReminder.xib; sourceTree = SOURCE_ROOT; }; CE073F5409CAE1A3005C1D2F /* help */ = {isa = PBXFileReference; lastKnownFileType = folder; name = help; path = ../../build/help; sourceTree = SOURCE_ROOT; }; - CE0C2AAA117700E700BC749F /* PyTable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PyTable.h; sourceTree = ""; }; CE0C2AB41177011000BC749F /* HSTable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HSTable.h; sourceTree = ""; }; CE0C2AB51177011000BC749F /* HSTable.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HSTable.m; sourceTree = ""; }; CE0C2ABA1177014200BC749F /* ProblemDialog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ProblemDialog.h; path = ../base/ProblemDialog.h; sourceTree = SOURCE_ROOT; }; CE0C2ABB1177014200BC749F /* ProblemDialog.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = ProblemDialog.m; path = ../base/ProblemDialog.m; sourceTree = SOURCE_ROOT; }; - CE0C2ABC1177014200BC749F /* PyProblemDialog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PyProblemDialog.h; path = ../base/PyProblemDialog.h; sourceTree = SOURCE_ROOT; }; CE15C8A70ADEB8B50061D4A5 /* Sparkle.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Sparkle.framework; path = /Library/Frameworks/Sparkle.framework; sourceTree = ""; }; - CE18126F111C9D5100E49FCE /* PyDetailsPanel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PyDetailsPanel.h; path = ../base/PyDetailsPanel.h; sourceTree = SOURCE_ROOT; }; CE1EB5FB12537F9D0034AABB /* HSFairwareReminder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = HSFairwareReminder.h; path = ../../cocoalib/HSFairwareReminder.h; sourceTree = SOURCE_ROOT; }; CE1EB5FC12537F9D0034AABB /* HSFairwareReminder.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = HSFairwareReminder.m; path = ../../cocoalib/HSFairwareReminder.m; sourceTree = SOURCE_ROOT; }; - CE1EB5FD12537F9D0034AABB /* PyFairware.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PyFairware.h; path = ../../cocoalib/PyFairware.h; sourceTree = SOURCE_ROOT; }; CE1EB60012537FB90034AABB /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = ../../cocoalib/en.lproj/FairwareReminder.xib; sourceTree = SOURCE_ROOT; }; CE21AFB61423EA6E00DE35BF /* de */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = de; path = ../base/de.lproj/PrioritizeDialog.xib; sourceTree = ""; }; CE21AFB71423EA6E00DE35BF /* fr */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = fr; path = ../base/fr.lproj/PrioritizeDialog.xib; sourceTree = ""; }; @@ -130,12 +140,10 @@ CE2A29F213213BE3005899AC /* ExtraFairwareReminder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ExtraFairwareReminder.h; path = ../base/ExtraFairwareReminder.h; sourceTree = SOURCE_ROOT; }; CE2A29F313213BE3005899AC /* ExtraFairwareReminder.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = ExtraFairwareReminder.m; path = ../base/ExtraFairwareReminder.m; sourceTree = SOURCE_ROOT; }; CE2A29F613213BFB005899AC /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = ../base/en.lproj/ExtraFairwareReminder.xib; sourceTree = SOURCE_ROOT; }; - CE2A29FF13213C31005899AC /* PyExtraFairwareReminder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PyExtraFairwareReminder.h; path = ../base/PyExtraFairwareReminder.h; 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; }; 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; }; - CE381CF509915304003581CE /* dg_cocoa.plugin */ = {isa = PBXFileReference; lastKnownFileType = folder; path = dg_cocoa.plugin; sourceTree = SOURCE_ROOT; }; CE60180612DF3EA900236FDC /* HSRecentFiles.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = HSRecentFiles.h; path = ../../cocoalib/HSRecentFiles.h; sourceTree = SOURCE_ROOT; }; CE60180712DF3EA900236FDC /* HSRecentFiles.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = HSRecentFiles.m; path = ../../cocoalib/HSRecentFiles.m; sourceTree = SOURCE_ROOT; }; CE6044EA0FE6796200B71262 /* DetailsPanel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DetailsPanel.h; path = ../base/DetailsPanel.h; sourceTree = SOURCE_ROOT; }; @@ -156,6 +164,44 @@ 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 = ../base/dsa_pub.pem; sourceTree = ""; }; CE7358071406ABF700F3F6DA /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = ../base/de.lproj/Localizable.strings; sourceTree = ""; }; + CE75017214C4770500E2A349 /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = ../base/main.m; sourceTree = ""; }; + CE75017414C4771800E2A349 /* py */ = {isa = PBXFileReference; lastKnownFileType = folder; name = py; path = ../../build/py; sourceTree = ""; }; + CE75017614C4772100E2A349 /* dg_cocoa.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; name = dg_cocoa.py; path = ../../build/dg_cocoa.py; sourceTree = ""; }; + CE75017814C4774900E2A349 /* Python */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = Python; path = ../../build/Python; sourceTree = ""; }; + CE75017C14C477B100E2A349 /* ObjP.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ObjP.h; sourceTree = ""; }; + CE75017D14C477B100E2A349 /* ObjP.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ObjP.m; sourceTree = ""; }; + CE75017E14C477B100E2A349 /* PyColumns.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PyColumns.h; sourceTree = ""; }; + CE75017F14C477B100E2A349 /* PyColumns.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PyColumns.m; sourceTree = ""; }; + CE75018014C477B100E2A349 /* PyDetailsPanel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PyDetailsPanel.h; sourceTree = ""; }; + CE75018114C477B100E2A349 /* PyDetailsPanel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PyDetailsPanel.m; sourceTree = ""; }; + CE75018214C477B100E2A349 /* PyDirectoryOutline.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PyDirectoryOutline.h; sourceTree = ""; }; + CE75018314C477B100E2A349 /* PyDirectoryOutline.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PyDirectoryOutline.m; sourceTree = ""; }; + CE75018414C477B100E2A349 /* PyDupeGuru.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PyDupeGuru.h; sourceTree = ""; }; + CE75018514C477B100E2A349 /* PyDupeGuru.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PyDupeGuru.m; sourceTree = ""; }; + CE75018614C477B100E2A349 /* PyDupeGuruBase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PyDupeGuruBase.h; sourceTree = ""; }; + CE75018714C477B100E2A349 /* PyDupeGuruBase.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PyDupeGuruBase.m; sourceTree = ""; }; + CE75018814C477B100E2A349 /* PyExtraFairwareReminder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PyExtraFairwareReminder.h; sourceTree = ""; }; + CE75018914C477B100E2A349 /* PyExtraFairwareReminder.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PyExtraFairwareReminder.m; sourceTree = ""; }; + CE75018A14C477B100E2A349 /* PyFairware.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PyFairware.h; sourceTree = ""; }; + CE75018B14C477B100E2A349 /* PyFairware.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PyFairware.m; sourceTree = ""; }; + CE75018C14C477B100E2A349 /* PyGUIObject.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PyGUIObject.h; sourceTree = ""; }; + CE75018D14C477B100E2A349 /* PyGUIObject.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PyGUIObject.m; sourceTree = ""; }; + CE75018E14C477B100E2A349 /* PyOutline.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PyOutline.h; sourceTree = ""; }; + CE75018F14C477B100E2A349 /* PyOutline.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PyOutline.m; sourceTree = ""; }; + CE75019014C477B100E2A349 /* PyPrioritizeDialog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PyPrioritizeDialog.h; sourceTree = ""; }; + CE75019114C477B100E2A349 /* PyPrioritizeDialog.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PyPrioritizeDialog.m; sourceTree = ""; }; + CE75019214C477B100E2A349 /* PyPrioritizeList.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PyPrioritizeList.h; sourceTree = ""; }; + CE75019314C477B100E2A349 /* PyPrioritizeList.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PyPrioritizeList.m; sourceTree = ""; }; + CE75019414C477B100E2A349 /* PyProblemDialog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PyProblemDialog.h; sourceTree = ""; }; + CE75019514C477B100E2A349 /* PyProblemDialog.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PyProblemDialog.m; sourceTree = ""; }; + CE75019614C477B100E2A349 /* PyResultTable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PyResultTable.h; sourceTree = ""; }; + CE75019714C477B100E2A349 /* PyResultTable.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PyResultTable.m; sourceTree = ""; }; + CE75019814C477B100E2A349 /* PySelectableList.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PySelectableList.h; sourceTree = ""; }; + CE75019914C477B100E2A349 /* PySelectableList.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PySelectableList.m; sourceTree = ""; }; + CE75019A14C477B100E2A349 /* PyStatsLabel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PyStatsLabel.h; sourceTree = ""; }; + CE75019B14C477B100E2A349 /* PyStatsLabel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PyStatsLabel.m; sourceTree = ""; }; + CE75019C14C477B100E2A349 /* PyTable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PyTable.h; sourceTree = ""; }; + CE75019D14C477B100E2A349 /* PyTable.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PyTable.m; sourceTree = ""; }; CE78759D13CDFA7100F23771 /* de */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = de; path = ../base/de.lproj/DirectoryPanel.xib; sourceTree = SOURCE_ROOT; }; CE78759E13CDFA7100F23771 /* de */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = de; path = ../base/de.lproj/ExtraFairwareReminder.xib; sourceTree = SOURCE_ROOT; }; CE78759F13CDFA7100F23771 /* de */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = de; path = ../base/de.lproj/MainMenu.xib; sourceTree = SOURCE_ROOT; }; @@ -176,7 +222,6 @@ CE7A69CA146443CB0007D927 /* it */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = it; path = ../it.lproj/ErrorReportWindow.xib; sourceTree = ""; }; CE7A69CB146443CB0007D927 /* it */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = it; path = ../it.lproj/FairwareReminder.xib; sourceTree = ""; }; CE7AC9161119911200D02F6C /* progress.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = progress.xib; sourceTree = ""; }; - CE7D24971423B0A7002E2297 /* PySelectableList.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PySelectableList.h; sourceTree = ""; }; CE7D24991423B0BD002E2297 /* HSPopUpList.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HSPopUpList.h; sourceTree = ""; }; CE7D249A1423B0BD002E2297 /* HSPopUpList.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HSPopUpList.m; sourceTree = ""; }; CE7D249B1423B0BD002E2297 /* HSSelectableList.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HSSelectableList.h; sourceTree = ""; }; @@ -185,16 +230,11 @@ CE7D24A01423B106002E2297 /* PrioritizeDialog.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = PrioritizeDialog.m; path = ../base/PrioritizeDialog.m; sourceTree = ""; }; CE7D24A11423B106002E2297 /* PrioritizeList.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PrioritizeList.h; path = ../base/PrioritizeList.h; sourceTree = ""; }; CE7D24A21423B106002E2297 /* PrioritizeList.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = PrioritizeList.m; path = ../base/PrioritizeList.m; sourceTree = ""; }; - CE7D24A31423B106002E2297 /* PyPrioritizeDialog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PyPrioritizeDialog.h; path = ../base/PyPrioritizeDialog.h; sourceTree = ""; }; - CE7D24A41423B106002E2297 /* PyPrioritizeList.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PyPrioritizeList.h; path = ../base/PyPrioritizeList.h; sourceTree = ""; }; CE7D24A81423B123002E2297 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = ../base/en.lproj/PrioritizeDialog.xib; sourceTree = ""; }; CE80DB1B0FC192D60086DCA6 /* Dialogs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Dialogs.h; path = ../../cocoalib/Dialogs.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; }; - CE80DB1D0FC192D60086DCA6 /* HSErrorReportWindow.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = HSErrorReportWindow.h; path = ../../cocoalib/HSErrorReportWindow.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; }; CE80DB210FC192D60086DCA6 /* ProgressController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ProgressController.h; path = ../../cocoalib/ProgressController.h; sourceTree = SOURCE_ROOT; }; CE80DB220FC192D60086DCA6 /* ProgressController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = ProgressController.m; path = ../../cocoalib/ProgressController.m; sourceTree = SOURCE_ROOT; }; - CE80DB230FC192D60086DCA6 /* PyApp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PyApp.h; path = ../../cocoalib/PyApp.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; }; CE80DB2B0FC192D60086DCA6 /* Utils.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Utils.m; path = ../../cocoalib/Utils.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; }; @@ -208,23 +248,17 @@ 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 = ../base/DirectoryPanel.h; 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 = ../base/PyDupeGuru.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 = ../base/ResultWindow.m; sourceTree = SOURCE_ROOT; }; CE848A1809DD85810004CB44 /* Consts.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Consts.h; sourceTree = ""; }; - CE958659112C516400F95FD2 /* PyStatsLabel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PyStatsLabel.h; path = ../base/PyStatsLabel.h; sourceTree = SOURCE_ROOT; }; CE95865C112C516400F95FD2 /* StatsLabel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = StatsLabel.h; path = ../base/StatsLabel.h; sourceTree = SOURCE_ROOT; }; CE95865D112C516400F95FD2 /* StatsLabel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = StatsLabel.m; path = ../base/StatsLabel.m; sourceTree = SOURCE_ROOT; }; CE9EA7431122C96C008CD2BC /* HSGUIController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HSGUIController.h; sourceTree = ""; }; CE9EA7441122C96C008CD2BC /* HSGUIController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HSGUIController.m; sourceTree = ""; }; CE9EA7451122C96C008CD2BC /* HSOutline.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HSOutline.h; sourceTree = ""; }; CE9EA7461122C96C008CD2BC /* HSOutline.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HSOutline.m; sourceTree = ""; }; - CE9EA7471122C96C008CD2BC /* HSWindowController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HSWindowController.h; sourceTree = ""; }; - CE9EA7481122C96C008CD2BC /* HSWindowController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HSWindowController.m; sourceTree = ""; }; CE9EA7491122C96C008CD2BC /* NSEventAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = NSEventAdditions.h; path = ../../cocoalib/NSEventAdditions.h; sourceTree = SOURCE_ROOT; }; CE9EA74A1122C96C008CD2BC /* NSEventAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = NSEventAdditions.m; path = ../../cocoalib/NSEventAdditions.m; sourceTree = SOURCE_ROOT; }; - CE9EA74C1122C96C008CD2BC /* PyGUI.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PyGUI.h; sourceTree = ""; }; - CE9EA74D1122C96C008CD2BC /* PyOutline.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PyOutline.h; sourceTree = ""; }; CE9EA7501122C96C008CD2BC /* HSOutlineView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HSOutlineView.h; sourceTree = ""; }; CE9EA7511122C96C008CD2BC /* HSOutlineView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HSOutlineView.m; sourceTree = ""; }; CE9EA7521122C96C008CD2BC /* NSIndexPathAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSIndexPathAdditions.h; sourceTree = ""; }; @@ -233,7 +267,6 @@ CE9EA7551122C96C008CD2BC /* NSTableViewAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSTableViewAdditions.m; sourceTree = ""; }; CE9EA76F1122CA0B008CD2BC /* DirectoryOutline.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DirectoryOutline.h; path = ../base/DirectoryOutline.h; sourceTree = SOURCE_ROOT; }; CE9EA7701122CA0B008CD2BC /* DirectoryOutline.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = DirectoryOutline.m; path = ../base/DirectoryOutline.m; sourceTree = SOURCE_ROOT; }; - CE9EA7711122CA0B008CD2BC /* PyDirectoryOutline.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PyDirectoryOutline.h; path = ../base/PyDirectoryOutline.h; sourceTree = SOURCE_ROOT; }; CEA8F335142BC9AB00A6DFAC /* Quartz.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Quartz.framework; path = System/Library/Frameworks/Quartz.framework; sourceTree = SDKROOT; }; CEA8F338142BC9D400A6DFAC /* HSQuicklook.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = HSQuicklook.h; path = ../../cocoalib/HSQuicklook.h; sourceTree = ""; }; CEA8F339142BC9D400A6DFAC /* HSQuicklook.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = HSQuicklook.m; path = ../../cocoalib/HSQuicklook.m; sourceTree = ""; }; @@ -261,7 +294,6 @@ CEE6D559149113320087CDFC /* hy */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = hy; path = ../hy.lproj/about.xib; sourceTree = ""; }; CEE6D55A149113320087CDFC /* hy */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = hy; path = ../hy.lproj/ErrorReportWindow.xib; sourceTree = ""; }; CEE6D55B149113320087CDFC /* hy */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = hy; path = ../hy.lproj/FairwareReminder.xib; sourceTree = ""; }; - CEE6D55F1491134E0087CDFC /* PyColumns.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PyColumns.h; sourceTree = ""; }; CEE6D560149113570087CDFC /* HSColumns.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HSColumns.h; sourceTree = ""; }; CEE6D561149113570087CDFC /* HSColumns.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HSColumns.m; sourceTree = ""; }; CEEB135109C837A2004D2330 /* dupeguru.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = dupeguru.icns; sourceTree = ""; }; @@ -279,11 +311,9 @@ CEEE15911460329000783E91 /* cs */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = cs; path = cs.lproj/Preferences.xib; sourceTree = ""; }; CEF12A7C124DFD400087B51D /* HSTableView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = HSTableView.h; path = ../../cocoalib/views/HSTableView.h; sourceTree = SOURCE_ROOT; }; CEF12A7D124DFD400087B51D /* HSTableView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = HSTableView.m; path = ../../cocoalib/views/HSTableView.m; sourceTree = SOURCE_ROOT; }; - CEF12A81124DFD620087B51D /* PyResultTable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PyResultTable.h; path = ../base/PyResultTable.h; sourceTree = SOURCE_ROOT; }; CEF12A82124DFD620087B51D /* ResultTable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ResultTable.h; path = ../base/ResultTable.h; sourceTree = SOURCE_ROOT; }; CEF12A83124DFD620087B51D /* ResultTable.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = ResultTable.m; path = ../base/ResultTable.m; sourceTree = SOURCE_ROOT; }; CEFC294509C89E3D00D9F998 /* folder32.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = folder32.png; path = ../../images/folder32.png; sourceTree = SOURCE_ROOT; }; - CEFF18A009A4D387005E6321 /* PyDupeGuru.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = PyDupeGuru.h; sourceTree = SOURCE_ROOT; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -294,6 +324,7 @@ CEA8F336142BC9AB00A6DFAC /* Quartz.framework in Frameworks */, 8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */, CE15C8A80ADEB8B50061D4A5 /* Sparkle.framework in Frameworks */, + CE75017914C4774900E2A349 /* Python in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -303,7 +334,6 @@ 080E96DDFE201D6D7F000001 /* DGPE */ = { isa = PBXGroup; children = ( - 29B97316FDCFA39411CA2CEA /* main.m */, CE381C9509914ACE003581CE /* AppDelegate.h */, CE381C9409914ACE003581CE /* AppDelegate.m */, CE848A1809DD85810004CB44 /* Consts.h */, @@ -311,7 +341,6 @@ CECA899B09DB132E00A3D774 /* DetailsPanel.m */, CE68EE6509ABC48000971085 /* DirectoryPanel.h */, CE68EE6609ABC48000971085 /* DirectoryPanel.m */, - CEFF18A009A4D387005E6321 /* PyDupeGuru.h */, CE381C9B09914ADF003581CE /* ResultWindow.h */, CE381C9A09914ADF003581CE /* ResultWindow.m */, ); @@ -321,6 +350,7 @@ 1058C7A0FEA54F0111CA2CBB /* Linked Frameworks */ = { isa = PBXGroup; children = ( + CE75017814C4774900E2A349 /* Python */, CEA8F335142BC9AB00A6DFAC /* Quartz.framework */, CE15C8A70ADEB8B50061D4A5 /* Sparkle.framework */, 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */, @@ -352,6 +382,7 @@ 080E96DDFE201D6D7F000001 /* DGPE */, CE80DB1A0FC192AB0086DCA6 /* cocoalib */, CE80DB810FC194BD0086DCA6 /* dgbase */, + CE75017B14C477B100E2A349 /* autogen */, 29B97317FDCFA39411CA2CEA /* Resources */, 29B97323FDCFA39411CA2CEA /* Frameworks */, 19C28FACFE9D520D11CA2CBB /* Products */, @@ -362,9 +393,10 @@ 29B97317FDCFA39411CA2CEA /* Resources */ = { isa = PBXGroup; children = ( + CE75017614C4772100E2A349 /* dg_cocoa.py */, + CE75017414C4771800E2A349 /* py */, CE63D9D21461EDC000A8CADD /* locale */, CE073F5409CAE1A3005C1D2F /* help */, - CE381CF509915304003581CE /* dg_cocoa.plugin */, CEFC294309C89E0000D9F998 /* images */, CE05339212E5DA1D0029EF25 /* xib */, CEEB135109C837A2004D2330 /* dupeguru.icns */, @@ -399,6 +431,48 @@ name = xib; sourceTree = ""; }; + CE75017B14C477B100E2A349 /* autogen */ = { + isa = PBXGroup; + children = ( + CE75017C14C477B100E2A349 /* ObjP.h */, + CE75017D14C477B100E2A349 /* ObjP.m */, + CE75017E14C477B100E2A349 /* PyColumns.h */, + CE75017F14C477B100E2A349 /* PyColumns.m */, + CE75018014C477B100E2A349 /* PyDetailsPanel.h */, + CE75018114C477B100E2A349 /* PyDetailsPanel.m */, + CE75018214C477B100E2A349 /* PyDirectoryOutline.h */, + CE75018314C477B100E2A349 /* PyDirectoryOutline.m */, + CE75018414C477B100E2A349 /* PyDupeGuru.h */, + CE75018514C477B100E2A349 /* PyDupeGuru.m */, + CE75018614C477B100E2A349 /* PyDupeGuruBase.h */, + CE75018714C477B100E2A349 /* PyDupeGuruBase.m */, + CE75018814C477B100E2A349 /* PyExtraFairwareReminder.h */, + CE75018914C477B100E2A349 /* PyExtraFairwareReminder.m */, + CE75018A14C477B100E2A349 /* PyFairware.h */, + CE75018B14C477B100E2A349 /* PyFairware.m */, + CE75018C14C477B100E2A349 /* PyGUIObject.h */, + CE75018D14C477B100E2A349 /* PyGUIObject.m */, + CE75018E14C477B100E2A349 /* PyOutline.h */, + CE75018F14C477B100E2A349 /* PyOutline.m */, + CE75019014C477B100E2A349 /* PyPrioritizeDialog.h */, + CE75019114C477B100E2A349 /* PyPrioritizeDialog.m */, + CE75019214C477B100E2A349 /* PyPrioritizeList.h */, + CE75019314C477B100E2A349 /* PyPrioritizeList.m */, + CE75019414C477B100E2A349 /* PyProblemDialog.h */, + CE75019514C477B100E2A349 /* PyProblemDialog.m */, + CE75019614C477B100E2A349 /* PyResultTable.h */, + CE75019714C477B100E2A349 /* PyResultTable.m */, + CE75019814C477B100E2A349 /* PySelectableList.h */, + CE75019914C477B100E2A349 /* PySelectableList.m */, + CE75019A14C477B100E2A349 /* PyStatsLabel.h */, + CE75019B14C477B100E2A349 /* PyStatsLabel.m */, + CE75019C14C477B100E2A349 /* PyTable.h */, + CE75019D14C477B100E2A349 /* PyTable.m */, + ); + name = autogen; + path = ../autogen; + sourceTree = ""; + }; CE7AC9141119911200D02F6C /* xib */ = { isa = PBXGroup; children = ( @@ -415,7 +489,6 @@ isa = PBXGroup; children = ( CE9EA7421122C96C008CD2BC /* controllers */, - CE9EA74B1122C96C008CD2BC /* proxies */, CE9EA74F1122C96C008CD2BC /* views */, CE7AC9141119911200D02F6C /* xib */, CE80DB480FC193770086DCA6 /* NSImageAdditions.h */, @@ -426,11 +499,8 @@ CE9EA74A1122C96C008CD2BC /* NSEventAdditions.m */, CE80DB1B0FC192D60086DCA6 /* Dialogs.h */, CE80DB1C0FC192D60086DCA6 /* Dialogs.m */, - CE80DB1D0FC192D60086DCA6 /* HSErrorReportWindow.h */, - CE80DB1E0FC192D60086DCA6 /* HSErrorReportWindow.m */, CE1EB5FB12537F9D0034AABB /* HSFairwareReminder.h */, CE1EB5FC12537F9D0034AABB /* HSFairwareReminder.m */, - CE1EB5FD12537F9D0034AABB /* PyFairware.h */, CEC9DB4A12CCAA7D003102F0 /* HSAboutBox.h */, CEC9DB4B12CCAA7D003102F0 /* HSAboutBox.m */, CE60180612DF3EA900236FDC /* HSRecentFiles.h */, @@ -439,7 +509,6 @@ CEA8F339142BC9D400A6DFAC /* HSQuicklook.m */, CE80DB210FC192D60086DCA6 /* ProgressController.h */, CE80DB220FC192D60086DCA6 /* ProgressController.m */, - CE80DB230FC192D60086DCA6 /* PyApp.h */, CE80DB2A0FC192D60086DCA6 /* Utils.h */, CE80DB2B0FC192D60086DCA6 /* Utils.m */, CE80DB2C0FC192D60086DCA6 /* ValueTransformers.h */, @@ -453,36 +522,28 @@ children = ( CEF12A82124DFD620087B51D /* ResultTable.h */, CEF12A83124DFD620087B51D /* ResultTable.m */, - CEF12A81124DFD620087B51D /* PyResultTable.h */, CE80DB820FC1951C0086DCA6 /* AppDelegate.h */, CE80DB830FC1951C0086DCA6 /* AppDelegate.m */, - CE80DB870FC1951C0086DCA6 /* PyDupeGuru.h */, CE80DB840FC1951C0086DCA6 /* Consts.h */, CE6044EA0FE6796200B71262 /* DetailsPanel.h */, CE6044EB0FE6796200B71262 /* DetailsPanel.m */, - CE18126F111C9D5100E49FCE /* PyDetailsPanel.h */, CE80DB850FC1951C0086DCA6 /* DirectoryPanel.h */, CE80DB860FC1951C0086DCA6 /* DirectoryPanel.m */, CE9EA76F1122CA0B008CD2BC /* DirectoryOutline.h */, CE9EA7701122CA0B008CD2BC /* DirectoryOutline.m */, - CE9EA7711122CA0B008CD2BC /* PyDirectoryOutline.h */, CE0C2ABA1177014200BC749F /* ProblemDialog.h */, CE0C2ABB1177014200BC749F /* ProblemDialog.m */, - CE0C2ABC1177014200BC749F /* PyProblemDialog.h */, CE80DB880FC1951C0086DCA6 /* ResultWindow.h */, CE80DB890FC1951C0086DCA6 /* ResultWindow.m */, CE95865C112C516400F95FD2 /* StatsLabel.h */, CE95865D112C516400F95FD2 /* StatsLabel.m */, - CE958659112C516400F95FD2 /* PyStatsLabel.h */, CE2A29F213213BE3005899AC /* ExtraFairwareReminder.h */, CE2A29F313213BE3005899AC /* ExtraFairwareReminder.m */, - CE2A29FF13213C31005899AC /* PyExtraFairwareReminder.h */, CE7D249F1423B106002E2297 /* PrioritizeDialog.h */, CE7D24A01423B106002E2297 /* PrioritizeDialog.m */, - CE7D24A31423B106002E2297 /* PyPrioritizeDialog.h */, CE7D24A11423B106002E2297 /* PrioritizeList.h */, CE7D24A21423B106002E2297 /* PrioritizeList.m */, - CE7D24A41423B106002E2297 /* PyPrioritizeList.h */, + CE75017214C4770500E2A349 /* main.m */, ); name = dgbase; sourceTree = ""; @@ -498,8 +559,6 @@ CE9EA7461122C96C008CD2BC /* HSOutline.m */, CE0C2AB41177011000BC749F /* HSTable.h */, CE0C2AB51177011000BC749F /* HSTable.m */, - CE9EA7471122C96C008CD2BC /* HSWindowController.h */, - CE9EA7481122C96C008CD2BC /* HSWindowController.m */, CE7D24991423B0BD002E2297 /* HSPopUpList.h */, CE7D249A1423B0BD002E2297 /* HSPopUpList.m */, CE7D249B1423B0BD002E2297 /* HSSelectableList.h */, @@ -509,19 +568,6 @@ path = ../../cocoalib/controllers; sourceTree = SOURCE_ROOT; }; - CE9EA74B1122C96C008CD2BC /* proxies */ = { - isa = PBXGroup; - children = ( - CEE6D55F1491134E0087CDFC /* PyColumns.h */, - CE9EA74C1122C96C008CD2BC /* PyGUI.h */, - CE9EA74D1122C96C008CD2BC /* PyOutline.h */, - CE0C2AAA117700E700BC749F /* PyTable.h */, - CE7D24971423B0A7002E2297 /* PySelectableList.h */, - ); - name = proxies; - path = ../../cocoalib/proxies; - sourceTree = SOURCE_ROOT; - }; CE9EA74F1122C96C008CD2BC /* views */ = { isa = PBXGroup; children = ( @@ -607,7 +653,6 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - CE381D0509915304003581CE /* dg_cocoa.plugin in Resources */, CE073F6309CAE1A3005C1D2F /* help in Resources */, CEEB135209C837A2004D2330 /* dupeguru.icns in Resources */, CEFC294609C89E3D00D9F998 /* folder32.png in Resources */, @@ -626,6 +671,8 @@ CECB2AC613D867AD0081E295 /* ErrorReportWindow.xib in Resources */, CE7D24A91423B123002E2297 /* PrioritizeDialog.xib in Resources */, CE63D9D31461EDC000A8CADD /* locale in Resources */, + CE75017514C4771800E2A349 /* py in Resources */, + CE75017714C4772100E2A349 /* dg_cocoa.py in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -636,13 +683,11 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 8D11072D0486CEB800E47090 /* main.m in Sources */, CE381C9609914ACE003581CE /* AppDelegate.m in Sources */, CE381C9C09914ADF003581CE /* ResultWindow.m in Sources */, CE68EE6809ABC48000971085 /* DirectoryPanel.m in Sources */, CECA899D09DB132E00A3D774 /* DetailsPanel.m in Sources */, CE80DB2E0FC192D60086DCA6 /* Dialogs.m in Sources */, - CE80DB2F0FC192D60086DCA6 /* HSErrorReportWindow.m in Sources */, CE80DB310FC192D60086DCA6 /* ProgressController.m in Sources */, CE80DB350FC192D60086DCA6 /* Utils.m in Sources */, CE80DB360FC192D60086DCA6 /* ValueTransformers.m in Sources */, @@ -654,7 +699,6 @@ CE6044EC0FE6796200B71262 /* DetailsPanel.m in Sources */, CE9EA7561122C96C008CD2BC /* HSGUIController.m in Sources */, CE9EA7571122C96C008CD2BC /* HSOutline.m in Sources */, - CE9EA7581122C96C008CD2BC /* HSWindowController.m in Sources */, CE9EA7591122C96C008CD2BC /* NSEventAdditions.m in Sources */, CE9EA75A1122C96C008CD2BC /* HSOutlineView.m in Sources */, CE9EA75B1122C96C008CD2BC /* NSIndexPathAdditions.m in Sources */, @@ -675,6 +719,24 @@ CE7D24A61423B106002E2297 /* PrioritizeList.m in Sources */, CEA8F33A142BC9D400A6DFAC /* HSQuicklook.m in Sources */, CEE6D562149113570087CDFC /* HSColumns.m in Sources */, + CE75017314C4770500E2A349 /* main.m in Sources */, + CE75019E14C477B100E2A349 /* ObjP.m in Sources */, + CE75019F14C477B100E2A349 /* PyColumns.m in Sources */, + CE7501A014C477B100E2A349 /* PyDetailsPanel.m in Sources */, + CE7501A114C477B100E2A349 /* PyDirectoryOutline.m in Sources */, + CE7501A214C477B100E2A349 /* PyDupeGuru.m in Sources */, + CE7501A314C477B100E2A349 /* PyDupeGuruBase.m in Sources */, + CE7501A414C477B100E2A349 /* PyExtraFairwareReminder.m in Sources */, + CE7501A514C477B100E2A349 /* PyFairware.m in Sources */, + CE7501A614C477B100E2A349 /* PyGUIObject.m in Sources */, + CE7501A714C477B100E2A349 /* PyOutline.m in Sources */, + CE7501A814C477B100E2A349 /* PyPrioritizeDialog.m in Sources */, + CE7501A914C477B100E2A349 /* PyPrioritizeList.m in Sources */, + CE7501AA14C477B100E2A349 /* PyProblemDialog.m in Sources */, + CE7501AB14C477B100E2A349 /* PyResultTable.m in Sources */, + CE7501AC14C477B100E2A349 /* PySelectableList.m in Sources */, + CE7501AD14C477B100E2A349 /* PyStatsLabel.m in Sources */, + CE7501AE14C477B100E2A349 /* PyTable.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -862,6 +924,10 @@ GCC_GENERATE_DEBUGGING_SYMBOLS = NO; INFOPLIST_FILE = Info.plist; INSTALL_PATH = "$(PROJECT_DIR)"; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "\"$(SRCROOT)/../../build\"", + ); PRODUCT_NAME = "dupeGuru PE"; WRAPPER_EXTENSION = app; }; @@ -872,8 +938,8 @@ buildSettings = { ARCHS = "$(ARCHS_STANDARD_32_64_BIT)"; GCC_C_LANGUAGE_STANDARD = c99; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = "\"$(SRCROOT)/../../build/PythonHeaders\""; + LD_RUNPATH_SEARCH_PATHS = "@executable_path/../Frameworks"; MACOSX_DEPLOYMENT_TARGET = 10.6; SDKROOT = macosx10.6; }; @@ -884,8 +950,8 @@ buildSettings = { ARCHS = "$(NATIVE_ARCH_ACTUAL)"; GCC_C_LANGUAGE_STANDARD = c99; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = "\"$(SRCROOT)/../../build/PythonHeaders\""; + LD_RUNPATH_SEARCH_PATHS = "@executable_path/../Frameworks"; MACOSX_DEPLOYMENT_TARGET = 10.6; SDKROOT = macosx10.6; }; @@ -899,6 +965,10 @@ DSTROOT = /; INFOPLIST_FILE = Info.plist; INSTALL_PATH = "$(PROJECT_DIR)"; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "\"$(SRCROOT)/../../build\"", + ); PRODUCT_NAME = "dupeGuru PE"; WRAPPER_EXTENSION = app; }; diff --git a/cocoa/pe/main.m b/cocoa/pe/main.m deleted file mode 100644 index 7fedbb8e..00000000 --- a/cocoa/pe/main.m +++ /dev/null @@ -1,23 +0,0 @@ -/* -Copyright 2011 Hardcoded Software (http://www.hardcoded.net) - -This software is licensed under the "BSD" License as described in the "LICENSE" file, -which should be included with this package. The terms are also available at -http://www.hardcoded.net/licenses/bsd_license -*/ - -#import -#import "Utils.h" - -int main(int argc, char *argv[]) -{ - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - [Utils setPluginName:@"dg_cocoa"]; - NSString *pluginPath = [[NSBundle mainBundle] - pathForResource:@"dg_cocoa" - ofType:@"plugin"]; - NSBundle *pluginBundle = [NSBundle bundleWithPath:pluginPath]; - [pluginBundle load]; - [pool release]; - return NSApplicationMain(argc, (const char **) argv); -} diff --git a/core_me/app.py b/core_me/app.py index 2189554b..73b9a4dd 100644 --- a/core_me/app.py +++ b/core_me/app.py @@ -23,7 +23,6 @@ class DupeGuru(DupeGuruBase): DupeGuruBase.__init__(self, view, appdata) self.scanner = scanner.ScannerME() self.directories.fileclasses = [fs.MusicFile] - self.result_table = ResultTable(self) def _get_display_info(self, dupe, group, delta): size = dupe.size @@ -87,3 +86,5 @@ class DupeGuru(DupeGuruBase): def _prioritization_categories(self): return prioritize.all_categories() + def _create_result_table(self): + return ResultTable(self) diff --git a/core_pe/app.py b/core_pe/app.py index efee86d9..3a56745b 100644 --- a/core_pe/app.py +++ b/core_pe/app.py @@ -30,7 +30,6 @@ class DupeGuru(DupeGuruBase): DupeGuruBase.__init__(self, view, appdata) self.scanner = ScannerPE() self.scanner.cache_path = op.join(self.appdata, 'cached_pictures.db') - self.result_table = ResultTable(self) def _get_display_info(self, dupe, group, delta): size = dupe.size @@ -91,3 +90,5 @@ class DupeGuru(DupeGuruBase): def _prioritization_categories(self): return prioritize.all_categories() + def _create_result_table(self): + return ResultTable(self)