Browse Source

Un-xibless-ified MainMenu

master
Virgil Dupras 4 years ago
parent
commit
8495402a3b
13 changed files with 455 additions and 141 deletions
  1. +0
    -1
      build.py
  2. +12
    -13
      cocoa/AppDelegate.h
  3. +14
    -23
      cocoa/AppDelegate.m
  4. +362
    -0
      cocoa/Base.lproj/MainMenu.xib
  5. +4
    -4
      cocoa/Base.lproj/ResultWindow.xib
  6. +2
    -2
      cocoa/DirectoryPanel.m
  7. +2
    -0
      cocoa/InfoTemplate.plist
  8. +2
    -0
      cocoa/ResultWindow.h
  9. +12
    -2
      cocoa/ResultWindow.m
  10. +2
    -12
      cocoa/main.m
  11. +1
    -1
      cocoa/ui/directory_panel.py
  12. +0
    -77
      cocoa/ui/main_menu.py
  13. +42
    -6
      dupeGuru.xcodeproj/project.pbxproj

+ 0
- 1
build.py View File

@@ -84,7 +84,6 @@ def build_xibless(dest='cocoa/autogen'):
('problem_dialog.py', 'ProblemDialog_UI'),
('directory_panel.py', 'DirectoryPanel_UI'),
('prioritize_dialog.py', 'PrioritizeDialog_UI'),
('main_menu.py', 'MainMenu_UI'),
('details_panel.py', 'DetailsPanel_UI'),
('details_panel_picture.py', 'DetailsPanelPicture_UI'),
]


+ 12
- 13
cocoa/AppDelegate.h View File

@@ -21,8 +21,8 @@ http://www.gnu.org/licenses/gpl-3.0.html

@interface AppDelegate : NSObject <NSFileManagerDelegate>
{
NSMenu *recentResultsMenu;
NSMenu *columnsMenu;
IBOutlet NSMenu *recentResultsMenu;
IBOutlet NSMenu *columnsMenu;
PyDupeGuru *model;
ResultWindow *_resultWindow;
@@ -47,7 +47,6 @@ http://www.gnu.org/licenses/gpl-3.0.html
- (void)setScanOptions;

/* Public */
- (void)finalizeInit;
- (ResultWindow *)resultWindow;
- (DirectoryPanel *)directoryPanel;
- (DetailsPanel *)detailsPanel;
@@ -63,16 +62,16 @@ http://www.gnu.org/licenses/gpl-3.0.html
- (void)recentFileClicked:(NSString *)path;

/* Actions */
- (void)clearPictureCache;
- (void)loadResults;
- (void)openWebsite;
- (void)openHelp;
- (void)showAboutBox;
- (void)showDirectoryWindow;
- (void)showPreferencesPanel;
- (void)showResultWindow;
- (void)showIgnoreList;
- (void)startScanning;
- (IBAction)clearPictureCache:(id)sender;
- (IBAction)loadResults:(id)sender;
- (IBAction)openWebsite:(id)sender;
- (IBAction)openHelp:(id)sender;
- (IBAction)showAboutBox:(id)sender;
- (IBAction)showDirectoryWindow:(id)sender;
- (IBAction)showPreferencesPanel:(id)sender;
- (IBAction)showResultWindow:(id)sender;
- (IBAction)showIgnoreList:(id)sender;
- (IBAction)startScanning:(id)sender;

/* model --> view */
- (void)showMessage:(NSString *)msg;


+ 14
- 23
cocoa/AppDelegate.m View File

@@ -64,9 +64,8 @@ http://www.gnu.org/licenses/gpl-3.0.html
[[NSUserDefaults standardUserDefaults] registerDefaults:d];
}

- (id)init
- (void)awakeFromNib
{
self = [super init];
model = [[PyDupeGuru alloc] init];
[model bindCallback:createCallback(@"DupeGuruView", self)];
NSMutableIndexSet *contentsIndexes = [NSMutableIndexSet indexSet];
@@ -82,14 +81,6 @@ http://www.gnu.org/licenses/gpl-3.0.html
[NSValueTransformer setValueTransformer:vtScanTypeIsNotContent forName:@"vtScanTypeMusicIsNotContent"];
VTIsIntIn *vtScanTypeIsTag = [[[VTIsIntIn alloc] initWithValues:[NSIndexSet indexSetWithIndex:3] reverse:NO] autorelease];
[NSValueTransformer setValueTransformer:vtScanTypeIsTag forName:@"vtScanTypeIsTag"];
return self;
}

- (void)finalizeInit
{
// We can only finalize initialization once the main menu has been created, which cannot happen
// before AppDelegate is created.
NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];
_recentResults = [[HSRecentFiles alloc] initWithName:@"recentResults" menu:recentResultsMenu];
[_recentResults setDelegate:self];
_directoryPanel = [[DirectoryPanel alloc] initWithParentApp:self];
@@ -144,8 +135,8 @@ http://www.gnu.org/licenses/gpl-3.0.html
[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
NSInteger smallFileThreshold = [ud integerForKey:@"smallFileThreshold"]; // In KB
NSInteger sizeThreshold = [ud boolForKey:@"ignoreSmallFiles"] ? smallFileThreshold * 1024 : 0; // The py side wants bytes
[model setSizeThreshold:sizeThreshold];
[model enable:n2b([ud objectForKey:@"scanTagTrack"]) scanForTag:@"track"];
[model enable:n2b([ud objectForKey:@"scanTagArtist"]) scanForTag:@"artist"];
@@ -192,7 +183,7 @@ http://www.gnu.org/licenses/gpl-3.0.html
}

/* Actions */
- (void)clearPictureCache
- (IBAction)clearPictureCache:(id)sender
{
NSString *msg = NSLocalizedString(@"Do you really want to remove all your cached picture analysis?", @"");
if ([Dialogs askYesNo:msg] == NSAlertSecondButtonReturn) // NO
@@ -200,7 +191,7 @@ http://www.gnu.org/licenses/gpl-3.0.html
[model clearPictureCache];
}

- (void)loadResults
- (IBAction)loadResults:(id)sender
{
NSOpenPanel *op = [NSOpenPanel openPanel];
[op setCanChooseFiles:YES];
@@ -216,12 +207,12 @@ http://www.gnu.org/licenses/gpl-3.0.html
}
}

- (void)openWebsite
- (IBAction)openWebsite:(id)sender
{
[[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:@"http://www.hardcoded.net/dupeguru/"]];
[[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:@"https://www.hardcoded.net/dupeguru/"]];
}

- (void)openHelp
- (IBAction)openHelp:(id)sender
{
NSBundle *b = [NSBundle mainBundle];
NSString *p = [b pathForResource:@"index" ofType:@"html" inDirectory:@"help"];
@@ -229,7 +220,7 @@ http://www.gnu.org/licenses/gpl-3.0.html
[[NSWorkspace sharedWorkspace] openURL:u];
}

- (void)showAboutBox
- (IBAction)showAboutBox:(id)sender
{
if (_aboutBox == nil) {
_aboutBox = [[HSAboutBox alloc] initWithApp:model];
@@ -237,12 +228,12 @@ http://www.gnu.org/licenses/gpl-3.0.html
[[_aboutBox window] makeKeyAndOrderFront:nil];
}

- (void)showDirectoryWindow
- (IBAction)showDirectoryWindow:(id)sender
{
[[[self directoryPanel] window] makeKeyAndOrderFront:nil];
}

- (void)showPreferencesPanel
- (IBAction)showPreferencesPanel:(id)sender
{
if (_preferencesPanel == nil) {
NSWindow *window;
@@ -261,17 +252,17 @@ http://www.gnu.org/licenses/gpl-3.0.html
[_preferencesPanel showWindow:nil];
}

- (void)showResultWindow
- (IBAction)showResultWindow:(id)sender
{
[[[self resultWindow] window] makeKeyAndOrderFront:nil];
}

- (void)showIgnoreList
- (IBAction)showIgnoreList:(id)sender
{
[model showIgnoreList];
}

- (void)startScanning
- (IBAction)startScanning:(id)sender
{
[[self directoryPanel] startDuplicateScan];
}


+ 362
- 0
cocoa/Base.lproj/MainMenu.xib View File

@@ -0,0 +1,362 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="12118" systemVersion="16E195" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none">
<dependencies>
<deployment identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="12118"/>
</dependencies>
<objects>
<customObject id="-2" userLabel="File's Owner" customClass="NSApplication">
<connections>
<outlet property="delegate" destination="206" id="207"/>
</connections>
</customObject>
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
<customObject id="-3" userLabel="Application"/>
<menu title="MainMenu" systemMenu="main" id="29" userLabel="MainMenu">
<items>
<menuItem title="dupeGuru" id="56">
<menu key="submenu" title="dupeGuru" systemMenu="apple" id="57">
<items>
<menuItem title="About dupeGuru" id="58">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="showAboutBox:" target="206" id="1232"/>
</connections>
</menuItem>
<menuItem title="Check for update..." id="950"/>
<menuItem isSeparatorItem="YES" id="144">
<modifierMask key="keyEquivalentModifierMask" command="YES"/>
</menuItem>
<menuItem title="Preferences..." keyEquivalent="," id="541">
<connections>
<action selector="showPreferencesPanel:" target="206" id="1270"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="542">
<modifierMask key="keyEquivalentModifierMask" command="YES"/>
</menuItem>
<menuItem title="Hide dupeGuru" keyEquivalent="h" id="134">
<connections>
<action selector="hide:" target="-2" id="152"/>
</connections>
</menuItem>
<menuItem title="Hide Others" keyEquivalent="h" id="145">
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
<connections>
<action selector="hideOtherApplications:" target="-2" id="146"/>
</connections>
</menuItem>
<menuItem title="Show All" id="150">
<connections>
<action selector="unhideAllApplications:" target="-2" id="153"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="149">
<modifierMask key="keyEquivalentModifierMask" command="YES"/>
</menuItem>
<menuItem title="Quit dupeGuru" keyEquivalent="q" id="136">
<connections>
<action selector="terminate:" target="-2" id="139"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="File" id="1203">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="File" id="1204">
<items>
<menuItem title="Load Results..." keyEquivalent="o" id="1205">
<connections>
<action selector="loadResults:" target="-1" id="1250"/>
</connections>
</menuItem>
<menuItem title="Load Recent Results" id="1239">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Load Recent Results" id="1240"/>
</menuItem>
<menuItem title="Save Results..." keyEquivalent="s" id="1206">
<connections>
<action selector="saveResults:" target="-1" id="1263"/>
</connections>
</menuItem>
<menuItem title="Export Results to XHTML" keyEquivalent="E" id="947">
<connections>
<action selector="exportToXHTML:" target="-1" id="1246"/>
</connections>
</menuItem>
<menuItem title="Export Results to CSV" id="B9L-71-D4W">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="exportToCSV:" target="-1" id="F0h-4p-YK5"/>
</connections>
</menuItem>
<menuItem title="Clear Picture Cache" keyEquivalent="P" id="Fdk-Tj-cSw">
<connections>
<action selector="clearPictureCache:" target="-1" id="beF-fH-ymG"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Edit" id="965">
<menu key="submenu" title="Edit" id="966">
<items>
<menuItem title="Mark All" keyEquivalent="a" id="1011">
<connections>
<action selector="markAll:" target="-1" id="1251"/>
</connections>
</menuItem>
<menuItem title="Mark None" keyEquivalent="A" id="1012">
<connections>
<action selector="markNone:" target="-1" id="1252"/>
</connections>
</menuItem>
<menuItem title="Invert Marking" keyEquivalent="a" id="1013">
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
<connections>
<action selector="markInvert:" target="-1" id="1253"/>
</connections>
</menuItem>
<menuItem title="Mark Selected" keyEquivalent="a" id="1014">
<modifierMask key="keyEquivalentModifierMask" control="YES" command="YES"/>
<connections>
<action selector="markSelected:" target="-1" id="1254"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="1018">
<modifierMask key="keyEquivalentModifierMask" command="YES"/>
</menuItem>
<menuItem title="Cut" keyEquivalent="x" id="985">
<connections>
<action selector="cut:" target="-1" id="996"/>
</connections>
</menuItem>
<menuItem title="Copy" keyEquivalent="c" id="986">
<connections>
<action selector="copy:" target="-1" id="998"/>
</connections>
</menuItem>
<menuItem title="Paste" keyEquivalent="v" id="991">
<connections>
<action selector="paste:" target="-1" id="1005"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="1287">
<modifierMask key="keyEquivalentModifierMask" command="YES"/>
</menuItem>
<menuItem title="Filter Results..." keyEquivalent="f" id="1288">
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
<connections>
<action selector="focusOnFilterField:" target="-1" id="1289"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Actions" id="597">
<menu key="submenu" title="Actions" id="598">
<items>
<menuItem title="Start Duplicate Scan" keyEquivalent="d" id="926">
<connections>
<action selector="startScanning:" target="206" id="1271"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="928">
<modifierMask key="keyEquivalentModifierMask" command="YES"/>
</menuItem>
<menuItem title="Send Marked to Trash..." keyEquivalent="t" id="599">
<connections>
<action selector="trashMarked:" target="-1" id="1286"/>
</connections>
</menuItem>
<menuItem title="Move Marked to..." keyEquivalent="m" id="600">
<connections>
<action selector="moveMarked:" target="-1" id="1255"/>
</connections>
</menuItem>
<menuItem title="Copy Marked to..." keyEquivalent="m" id="601">
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
<connections>
<action selector="copyMarked:" target="-1" id="1244"/>
</connections>
</menuItem>
<menuItem title="Remove Marked from Results" keyEquivalent="r" id="603">
<connections>
<action selector="removeMarked:" target="-1" id="1279"/>
</connections>
</menuItem>
<menuItem title="Re-Prioritize Results..." id="1276">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="reprioritizeResults:" target="-1" id="1278"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="604">
<modifierMask key="keyEquivalentModifierMask" command="YES"/>
</menuItem>
<menuItem title="Remove Selected from Results" id="605">
<string key="keyEquivalent" base64-UTF8="YES">
CA
</string>
<connections>
<action selector="removeSelected:" target="-1" id="1258"/>
</connections>
</menuItem>
<menuItem title="Add Selected to Ignore List" keyEquivalent="g" id="922">
<connections>
<action selector="ignoreSelected:" target="-1" id="1248"/>
</connections>
</menuItem>
<menuItem title="Make Selected into Reference" keyEquivalent="" id="602">
<connections>
<action selector="switchSelected:" target="-1" id="1260"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="707">
<modifierMask key="keyEquivalentModifierMask" command="YES"/>
</menuItem>
<menuItem title="Open Selected with Default Application" id="708">
<string key="keyEquivalent" base64-UTF8="YES">
DQ
</string>
<connections>
<action selector="openSelected:" target="-1" id="1256"/>
</connections>
</menuItem>
<menuItem title="Reveal Selected in Finder" id="710">
<string key="keyEquivalent" base64-UTF8="YES">
DQ
</string>
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
<connections>
<action selector="revealSelected:" target="-1" id="1261"/>
</connections>
</menuItem>
<menuItem title="Invoke Custom Command" keyEquivalent="C" id="1177">
<modifierMask key="keyEquivalentModifierMask" control="YES"/>
<connections>
<action selector="invokeCustomCommand:" target="-1" id="1249"/>
</connections>
</menuItem>
<menuItem title="Rename Selected" id="933">
<string key="keyEquivalent" base64-UTF8="YES">
Aw
</string>
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="renameSelected:" target="-1" id="1262"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Columns" id="618">
<menu key="submenu" title="Columns" id="619"/>
</menuItem>
<menuItem title="Mode" id="959">
<menu key="submenu" title="Mode" id="960">
<items>
<menuItem title="Show Dupes Only" keyEquivalent="1" id="961">
<connections>
<action selector="togglePowerMarker:" target="-1" id="1265"/>
</connections>
</menuItem>
<menuItem title="Show Delta Values" keyEquivalent="2" id="962">
<connections>
<action selector="toggleDelta:" target="-1" id="1266"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Window" id="19">
<menu key="submenu" title="Window" systemMenu="window" id="24">
<items>
<menuItem title="Results Window" id="1272">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="showResultWindow:" target="206" id="1274"/>
</connections>
</menuItem>
<menuItem title="Folder Selection Window" id="579">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="showDirectoryWindow:" target="206" id="1273"/>
</connections>
</menuItem>
<menuItem title="Ignore List" id="1283">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="showIgnoreList:" target="206" id="1285"/>
</connections>
</menuItem>
<menuItem title="Details Panel" keyEquivalent="i" id="398">
<connections>
<action selector="toggleDetailsPanel:" target="-1" id="1264"/>
</connections>
</menuItem>
<menuItem title="Quick Look" keyEquivalent="l" id="1280">
<connections>
<action selector="toggleQuicklookPanel:" target="-1" id="1282"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="399">
<modifierMask key="keyEquivalentModifierMask" command="YES"/>
</menuItem>
<menuItem title="Minimize" id="23">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="performMiniaturize:" target="-1" id="37"/>
</connections>
</menuItem>
<menuItem title="Zoom" id="197">
<connections>
<action selector="performZoom:" target="-1" id="198"/>
</connections>
</menuItem>
<menuItem title="Close Window" keyEquivalent="w" id="924">
<connections>
<action selector="performClose:" target="-1" id="925"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="92">
<modifierMask key="keyEquivalentModifierMask" command="YES"/>
</menuItem>
<menuItem title="Bring All to Front" id="5">
<connections>
<action selector="arrangeInFront:" target="-1" id="39"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Help" id="103">
<menu key="submenu" title="Help" id="106">
<items>
<menuItem title="dupeGuru Help" keyEquivalent="?" id="111">
<connections>
<action selector="openHelp:" target="206" id="1233"/>
</connections>
</menuItem>
<menuItem title="dupeGuru Website" id="1023">
<connections>
<action selector="openWebsite:" target="206" id="1024"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
</items>
<connections>
<outlet property="delegate" destination="206" id="208"/>
</connections>
</menu>
<customObject id="206" userLabel="AppDelegate" customClass="AppDelegate">
<connections>
<outlet property="columnsMenu" destination="619" id="1269"/>
<outlet property="recentResultsMenu" destination="1240" id="1242"/>
</connections>
</customObject>
</objects>
</document>

+ 4
- 4
cocoa/Base.lproj/ResultWindow.xib View File

@@ -17,7 +17,7 @@
</connections>
</customObject>
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
<customObject id="-3" userLabel="Application"/>
<customObject id="-3" userLabel="Application" customClass="NSObject"/>
<menu title="Menu" id="67" userLabel="matches_context">
<items>
<menuItem title="Remove Selected from Results" id="71">
@@ -30,7 +30,7 @@
<action selector="ignoreSelected:" target="-2" id="77"/>
</connections>
</menuItem>
<menuItem title="Make Selected Reference" id="72">
<menuItem title="Make Selected into Reference" id="72">
<connections>
<action selector="switchSelected:" target="-2" id="78"/>
</connections>
@@ -103,7 +103,7 @@
<rect key="frame" x="1" y="119" width="223" height="15"/>
<autoresizingMask key="autoresizingMask"/>
</scroller>
<scroller key="verticalScroller" hidden="YES" verticalHuggingPriority="750" doubleValue="37" horizontal="NO" id="10">
<scroller key="verticalScroller" hidden="YES" verticalHuggingPriority="750" doubleValue="1" horizontal="NO" id="10">
<rect key="frame" x="224" y="17" width="15" height="102"/>
<autoresizingMask key="autoresizingMask"/>
</scroller>
@@ -127,7 +127,7 @@
<autoresizingMask key="autoresizingMask"/>
<popUpButtonCell key="cell" type="roundTextured" title=" " bezelStyle="texturedRounded" alignment="center" lineBreakMode="truncatingTail" state="on" borderStyle="borderAndBezel" inset="2" pullsDown="YES" preferredEdge="maxY" selectedItem="28" id="25">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/>
<font key="font" metaFont="menu"/>
<menu key="menu" title="OtherViews" id="26">
<items>
<menuItem title=" " state="on" image="NSActionTemplate" hidden="YES" id="28"/>


+ 2
- 2
cocoa/DirectoryPanel.m View File

@@ -156,7 +156,7 @@ http://www.gnu.org/licenses/gpl-3.0.html
while ([m numberOfItems] > 0) {
[m removeItemAtIndex:0];
}
NSMenuItem *mi = [m addItemWithTitle:NSLocalizedString(@"Load from file...", @"") action:@selector(loadResults) keyEquivalent:@""];
NSMenuItem *mi = [m addItemWithTitle:NSLocalizedString(@"Load from file...", @"") action:@selector(loadResults:) keyEquivalent:@""];
[mi setTarget:_app];
[m addItem:[NSMenuItem separatorItem]];
[[_app recentResults] fillMenu:m];
@@ -164,7 +164,7 @@ http://www.gnu.org/licenses/gpl-3.0.html
[[loadRecentButtonPopUp cell] performClickWithFrame:[sender frame] inView:[sender superview]];
}
else {
[_app loadResults];
[_app loadResults:sender];
}
}



+ 2
- 0
cocoa/InfoTemplate.plist View File

@@ -28,6 +28,8 @@
<string>{version}</string>
<key>NSPrincipalClass</key>
<string>NSApplication</string>
<key>NSMainNibFile</key>
<string>MainMenu</string>
<key>NSHumanReadableCopyright</key>
<string>© Hardcoded Software, 2016</string>
<key>SUFeedURL</key>


+ 2
- 0
cocoa/ResultWindow.h View File

@@ -49,6 +49,8 @@ http://www.gnu.org/licenses/gpl-3.0.html
- (IBAction)changeOptions:(id)sender;
- (IBAction)copyMarked:(id)sender;
- (IBAction)trashMarked:(id)sender;
- (IBAction)exportToXHTML:(id)sender;
- (IBAction)exportToCSV:(id)sender;
- (IBAction)filter:(id)sender;
- (IBAction)focusOnFilterField:(id)sender;
- (IBAction)ignoreSelected:(id)sender;


+ 12
- 2
cocoa/ResultWindow.m View File

@@ -36,7 +36,7 @@ http://www.gnu.org/licenses/gpl-3.0.html
[[table columns] setColumnsAsReadOnly];
[self fillColumnsMenu];
[matches setTarget:self];
[matches setDoubleAction:@selector(openClicked)];
[matches setDoubleAction:@selector(openClicked:)];
[self adjustUIToLocalization];
return self;
}
@@ -64,7 +64,7 @@ http://www.gnu.org/licenses/gpl-3.0.html
}
[[app columnsMenu] addItem:[NSMenuItem separatorItem]];
NSMenuItem *mi = [[app columnsMenu] addItemWithTitle:NSLocalizedString(@"Reset to Default", @"")
action:@selector(resetColumnsToDefault) keyEquivalent:@""];
action:@selector(resetColumnsToDefault:) keyEquivalent:@""];
[mi setTarget:self];
}

@@ -210,6 +210,16 @@ http://www.gnu.org/licenses/gpl-3.0.html
[model deleteMarked];
}

- (IBAction)exportToXHTML:(id)sender
{
[model exportToXHTML];
}

- (IBAction)exportToCSV:(id)sender
{
[model exportToCSV];
}

- (IBAction)filter:(id)sender
{
NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];


+ 2
- 12
cocoa/main.m View File

@@ -10,12 +10,9 @@ http://www.gnu.org/licenses/gpl-3.0.html
#import <Python.h>
#import <wchar.h>
#import <locale.h>
#import "AppDelegate.h"
#import "MainMenu_UI.h"

int main(int argc, char *argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
/* We have to set the locate to UTF8 for mbstowcs() to correctly convert non-ascii chars in paths */
setlocale(LC_ALL, "en_US.UTF-8");
NSString *respath = [[NSBundle mainBundle] resourcePath];
@@ -36,14 +33,7 @@ int main(int argc, char *argv[])
PyThreadState_Swap(NULL);
PyEval_ReleaseLock();
}
[NSApplication sharedApplication];
AppDelegate *appDelegate = [[AppDelegate alloc] init];
[NSApp setDelegate:appDelegate];
[NSApp setMainMenu:createMainMenu_UI(appDelegate)];
[appDelegate finalizeInit];
[pool release];
[NSApp run];
int result = NSApplicationMain(argc, (const char **) argv);
Py_Finalize();
return 0;
return result;
}

+ 1
- 1
cocoa/ui/directory_panel.py View File

@@ -40,7 +40,7 @@ appModeSelector.action = Action(owner, 'changeAppMode:')
addButton.action = Action(owner, 'popupAddDirectoryMenu:')
removeButton.action = Action(owner, 'removeSelectedDirectory')
loadResultsButton.action = Action(owner, 'popupLoadRecentMenu:')
scanButton.action = Action(None, 'startScanning')
scanButton.action = Action(None, 'startScanning:')

directoryOutline.font = Font(FontFamily.System, FontSize.SmallSystem)
col = directoryOutline.addColumn('name', "Name", 100)


+ 0
- 77
cocoa/ui/main_menu.py View File

@@ -1,77 +0,0 @@
ownerclass = 'AppDelegate'
ownerimport = 'AppDelegate.h'

result = Menu("")
appMenu = result.addMenu("dupeGuru")
fileMenu = result.addMenu("File")
editMenu = result.addMenu("Edit")
actionMenu = result.addMenu("Actions")
owner.columnsMenu = result.addMenu("Columns")
modeMenu = result.addMenu("Mode")
windowMenu = result.addMenu("Window")
helpMenu = result.addMenu("Help")

appMenu.addItem("About dupeGuru", Action(owner, 'showAboutBox'))
appMenu.addSeparator()
appMenu.addItem("Preferences...", Action(owner, 'showPreferencesPanel'), 'cmd+,')
appMenu.addSeparator()
NSApp.servicesMenu = appMenu.addMenu("Services")
appMenu.addSeparator()
appMenu.addItem("Hide dupeGuru", Action(NSApp, 'hide:'), 'cmd+h')
appMenu.addItem("Hide Others", Action(NSApp, 'hideOtherApplications:'), 'cmd+alt+h')
appMenu.addItem("Show All", Action(NSApp, 'unhideAllApplications:'))
appMenu.addSeparator()
appMenu.addItem("Quit dupeGuru", Action(NSApp, 'terminate:'), 'cmd+q')

fileMenu.addItem("Load Results...", Action(None, 'loadResults'), 'cmd+o')
owner.recentResultsMenu = fileMenu.addMenu("Load Recent Results")
fileMenu.addItem("Save Results...", Action(None, 'saveResults:'), 'cmd+s')
fileMenu.addItem("Export Results to XHTML", Action(owner.model, 'exportToXHTML'), 'cmd+shift+e')
fileMenu.addItem("Export Results to CSV", Action(owner.model, 'exportToCSV'))
fileMenu.addItem("Clear Picture Cache", Action(owner, 'clearPictureCache'), 'cmd+shift+p')

editMenu.addItem("Mark All", Action(None, 'markAll'), 'cmd+a')
editMenu.addItem("Mark None", Action(None, 'markNone'), 'cmd+shift+a')
editMenu.addItem("Invert Marking", Action(None, 'markInvert'), 'cmd+alt+a')
editMenu.addItem("Mark Selected", Action(None, 'markSelected'), 'ctrl+cmd+a')
editMenu.addSeparator()
editMenu.addItem("Cut", Action(None, 'cut:'), 'cmd+x')
editMenu.addItem("Copy", Action(None, 'copy:'), 'cmd+c')
editMenu.addItem("Paste", Action(None, 'paste:'), 'cmd+v')
editMenu.addSeparator()
editMenu.addItem("Filter Results...", Action(None, 'focusOnFilterField:'), 'cmd+alt+f')

actionMenu.addItem("Start Duplicate Scan", Action(owner, 'startScanning'), 'cmd+d')
actionMenu.addSeparator()
actionMenu.addItem("Send Marked to Trash...", Action(None, 'trashMarked:'), 'cmd+t')
actionMenu.addItem("Move Marked to...", Action(None, 'moveMarked:'), 'cmd+m')
actionMenu.addItem("Copy Marked to...", Action(None, 'copyMarked:'), 'cmd+alt+m')
actionMenu.addItem("Remove Marked from Results", Action(None, 'removeMarked:'), 'cmd+r')
actionMenu.addItem("Re-Prioritize Results...", Action(None, 'reprioritizeResults:'))
actionMenu.addSeparator()
actionMenu.addItem("Remove Selected from Results", Action(None, 'removeSelected:'), 'cmd+backspace')
actionMenu.addItem("Add Selected to Ignore List", Action(None, 'ignoreSelected:'), 'cmd+g')
actionMenu.addItem("Make Selected into Reference", Action(None, 'switchSelected:'), 'cmd+arrowup')
actionMenu.addSeparator()
actionMenu.addItem("Open Selected with Default Application", Action(None, 'openSelected:'), 'cmd+return')
actionMenu.addItem("Reveal Selected in Finder", Action(None, 'revealSelected:'), 'cmd+alt+return')
actionMenu.addItem("Invoke Custom Command", Action(None, 'invokeCustomCommand:'), 'cmd+shift+c')
actionMenu.addItem("Rename Selected", Action(None, 'renameSelected:'), 'enter')

modeMenu.addItem("Show Dupes Only", Action(None, 'togglePowerMarker:'), 'cmd+1')
modeMenu.addItem("Show Delta Values", Action(None, 'toggleDelta:'), 'cmd+2')

windowMenu.addItem("Results Window", Action(owner, 'showResultWindow'))
windowMenu.addItem("Folder Selection Window", Action(owner, 'showDirectoryWindow'))
windowMenu.addItem("Ignore List", Action(owner, 'showIgnoreList'))
windowMenu.addItem("Details Panel", Action(None, 'toggleDetailsPanel:'), 'cmd+i')
windowMenu.addItem("Quick Look", Action(None, 'toggleQuicklookPanel:'), 'cmd+l')
windowMenu.addSeparator()
windowMenu.addItem("Minimize", Action(None, 'performMiniaturize:'))
windowMenu.addItem("Zoom", Action(None, 'performZoom:'))
windowMenu.addItem("Close Window", Action(None, 'performClose:'), 'cmd+w')
windowMenu.addSeparator()
windowMenu.addItem("Bring All to Front", Action(None, 'arrangeInFront:'))

helpMenu.addItem("dupeGuru Help", Action(owner, 'openHelp'), 'cmd+?')
helpMenu.addItem("dupeGuru Website", Action(owner, 'openWebsite'))

+ 42
- 6
dupeGuru.xcodeproj/project.pbxproj View File

@@ -57,7 +57,6 @@
CE97213E1E74E41D00A598C9 /* DetailsPanel_UI.m in Sources */ = {isa = PBXBuildFile; fileRef = CE9720FA1E74E41C00A598C9 /* DetailsPanel_UI.m */; };
CE97213F1E74E41D00A598C9 /* DetailsPanelPicture_UI.m in Sources */ = {isa = PBXBuildFile; fileRef = CE9720FC1E74E41C00A598C9 /* DetailsPanelPicture_UI.m */; };
CE9721401E74E41D00A598C9 /* DirectoryPanel_UI.m in Sources */ = {isa = PBXBuildFile; fileRef = CE9720FE1E74E41C00A598C9 /* DirectoryPanel_UI.m */; };
CE9721441E74E41D00A598C9 /* MainMenu_UI.m in Sources */ = {isa = PBXBuildFile; fileRef = CE9721061E74E41C00A598C9 /* MainMenu_UI.m */; };
CE9721451E74E41D00A598C9 /* ObjP.m in Sources */ = {isa = PBXBuildFile; fileRef = CE9721081E74E41C00A598C9 /* ObjP.m */; };
CE9721461E74E41D00A598C9 /* PreferencesPanelMusic_UI.m in Sources */ = {isa = PBXBuildFile; fileRef = CE97210A1E74E41C00A598C9 /* PreferencesPanelMusic_UI.m */; };
CE9721471E74E41D00A598C9 /* PreferencesPanelPicture_UI.m in Sources */ = {isa = PBXBuildFile; fileRef = CE97210C1E74E41C00A598C9 /* PreferencesPanelPicture_UI.m */; };
@@ -83,6 +82,7 @@
CE97215C1E74E41D00A598C9 /* PyTable.m in Sources */ = {isa = PBXBuildFile; fileRef = CE9721361E74E41D00A598C9 /* PyTable.m */; };
CE97215D1E74E41D00A598C9 /* PyTextField.m in Sources */ = {isa = PBXBuildFile; fileRef = CE9721381E74E41D00A598C9 /* PyTextField.m */; };
CE97215F1E74E41D00A598C9 /* XiblessSupport.m in Sources */ = {isa = PBXBuildFile; fileRef = CE97213C1E74E41D00A598C9 /* XiblessSupport.m */; };
CE9EF6DF1E9345100089CA20 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = CE9EF6DD1E9345100089CA20 /* MainMenu.xib */; };
CED88C1F1E763F2700C9B98C /* py in Resources */ = {isa = PBXBuildFile; fileRef = CED88C1E1E763F2700C9B98C /* py */; };
CEFC8A251E74F23000965F37 /* dg_cocoa.py in Resources */ = {isa = PBXBuildFile; fileRef = CEFC8A231E74F23000965F37 /* dg_cocoa.py */; };
CEFC8A261E74F23000965F37 /* dupeguru.icns in Resources */ = {isa = PBXBuildFile; fileRef = CEFC8A241E74F23000965F37 /* dupeguru.icns */; };
@@ -303,8 +303,6 @@
CE9720FC1E74E41C00A598C9 /* DetailsPanelPicture_UI.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = DetailsPanelPicture_UI.m; path = cocoa/autogen/DetailsPanelPicture_UI.m; sourceTree = "<group>"; };
CE9720FD1E74E41C00A598C9 /* DirectoryPanel_UI.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DirectoryPanel_UI.h; path = cocoa/autogen/DirectoryPanel_UI.h; sourceTree = "<group>"; };
CE9720FE1E74E41C00A598C9 /* DirectoryPanel_UI.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = DirectoryPanel_UI.m; path = cocoa/autogen/DirectoryPanel_UI.m; sourceTree = "<group>"; };
CE9721051E74E41C00A598C9 /* MainMenu_UI.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MainMenu_UI.h; path = cocoa/autogen/MainMenu_UI.h; sourceTree = "<group>"; };
CE9721061E74E41C00A598C9 /* MainMenu_UI.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MainMenu_UI.m; path = cocoa/autogen/MainMenu_UI.m; sourceTree = "<group>"; };
CE9721071E74E41C00A598C9 /* ObjP.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ObjP.h; path = cocoa/autogen/ObjP.h; sourceTree = "<group>"; };
CE9721081E74E41C00A598C9 /* ObjP.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = ObjP.m; path = cocoa/autogen/ObjP.m; sourceTree = "<group>"; };
CE9721091E74E41C00A598C9 /* PreferencesPanelMusic_UI.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PreferencesPanelMusic_UI.h; path = cocoa/autogen/PreferencesPanelMusic_UI.h; sourceTree = "<group>"; };
@@ -356,6 +354,22 @@
CE97213B1E74E41D00A598C9 /* XiblessSupport.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = XiblessSupport.h; path = cocoa/autogen/XiblessSupport.h; sourceTree = "<group>"; };
CE97213C1E74E41D00A598C9 /* XiblessSupport.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = XiblessSupport.m; path = cocoa/autogen/XiblessSupport.m; sourceTree = "<group>"; };
CE9C2E9D1E74E1640099B9FB /* dupeGuru.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = dupeGuru.app; sourceTree = BUILT_PRODUCTS_DIR; };
CE9EF6DE1E9345100089CA20 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = cocoa/Base.lproj/MainMenu.xib; sourceTree = "<group>"; };
CE9EF6E11E9345490089CA20 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = cocoa/fr.lproj/MainMenu.strings; sourceTree = "<group>"; };
CE9EF6E31E93454A0089CA20 /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = cocoa/de.lproj/MainMenu.strings; sourceTree = "<group>"; };
CE9EF6E51E93454C0089CA20 /* cs */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = cs; path = cocoa/cs.lproj/MainMenu.strings; sourceTree = "<group>"; };
CE9EF6E71E93454D0089CA20 /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = cocoa/es.lproj/MainMenu.strings; sourceTree = "<group>"; };
CE9EF6E91E93454E0089CA20 /* el */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = el; path = cocoa/el.lproj/MainMenu.strings; sourceTree = "<group>"; };
CE9EF6EB1E9345500089CA20 /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = cocoa/it.lproj/MainMenu.strings; sourceTree = "<group>"; };
CE9EF6ED1E9345510089CA20 /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = cocoa/nl.lproj/MainMenu.strings; sourceTree = "<group>"; };
CE9EF6EF1E9345520089CA20 /* pl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pl; path = cocoa/pl.lproj/MainMenu.strings; sourceTree = "<group>"; };
CE9EF6F11E9345530089CA20 /* ko */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ko; path = cocoa/ko.lproj/MainMenu.strings; sourceTree = "<group>"; };
CE9EF6F31E9345550089CA20 /* hy */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hy; path = cocoa/hy.lproj/MainMenu.strings; sourceTree = "<group>"; };
CE9EF6F51E9345570089CA20 /* pt-BR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pt-BR"; path = "cocoa/pt-BR.lproj/MainMenu.strings"; sourceTree = "<group>"; };
CE9EF6F71E9345580089CA20 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = cocoa/ru.lproj/MainMenu.strings; sourceTree = "<group>"; };
CE9EF6F91E93455B0089CA20 /* uk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = uk; path = cocoa/uk.lproj/MainMenu.strings; sourceTree = "<group>"; };
CE9EF6FB1E93455C0089CA20 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "cocoa/zh-Hans.lproj/MainMenu.strings"; sourceTree = "<group>"; };
CE9EF6FD1E93455D0089CA20 /* vi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = vi; path = cocoa/vi.lproj/MainMenu.strings; sourceTree = "<group>"; };
CED88C1E1E763F2700C9B98C /* py */ = {isa = PBXFileReference; lastKnownFileType = folder; name = py; path = build/py; sourceTree = "<group>"; };
CEFC8A231E74F23000965F37 /* dg_cocoa.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; name = dg_cocoa.py; path = cocoa/dg_cocoa.py; sourceTree = "<group>"; };
CEFC8A241E74F23000965F37 /* dupeguru.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; name = dupeguru.icns; path = cocoa/dupeguru.icns; sourceTree = "<group>"; };
@@ -377,6 +391,7 @@
CE1891011E75D5A6008CE1AE /* xib */ = {
isa = PBXGroup;
children = (
CE9EF6DD1E9345100089CA20 /* MainMenu.xib */,
CE549CDA1E933C7600C75A05 /* ResultWindow.xib */,
CE0559851E762105008EB4F8 /* IgnoreListDialog.xib */,
);
@@ -520,8 +535,6 @@
CE9720FC1E74E41C00A598C9 /* DetailsPanelPicture_UI.m */,
CE9720FD1E74E41C00A598C9 /* DirectoryPanel_UI.h */,
CE9720FE1E74E41C00A598C9 /* DirectoryPanel_UI.m */,
CE9721051E74E41C00A598C9 /* MainMenu_UI.h */,
CE9721061E74E41C00A598C9 /* MainMenu_UI.m */,
CE9721071E74E41C00A598C9 /* ObjP.h */,
CE9721081E74E41C00A598C9 /* ObjP.m */,
CE9721091E74E41C00A598C9 /* PreferencesPanelMusic_UI.h */,
@@ -695,6 +708,7 @@
CE0559871E762105008EB4F8 /* IgnoreListDialog.xib in Resources */,
CEFC8A261E74F23000965F37 /* dupeguru.icns in Resources */,
CE65D0CC1E7781640092126E /* progress.xib in Resources */,
CE9EF6DF1E9345100089CA20 /* MainMenu.xib in Resources */,
CEFC8A281E74F28100965F37 /* help in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
@@ -713,7 +727,6 @@
CE6F7E081E74EA12004C0518 /* HSProgressWindow.m in Sources */,
CE97215F1E74E41D00A598C9 /* XiblessSupport.m in Sources */,
CE9721511E74E41D00A598C9 /* PyDupeGuru.m in Sources */,
CE9721441E74E41D00A598C9 /* MainMenu_UI.m in Sources */,
CE9721401E74E41D00A598C9 /* DirectoryPanel_UI.m in Sources */,
CE9720EC1E74E40300A598C9 /* DirectoryOutline.m in Sources */,
CE97213D1E74E41D00A598C9 /* DeletionOptions_UI.m in Sources */,
@@ -940,6 +953,29 @@
name = cocoalib.strings;
sourceTree = "<group>";
};
CE9EF6DD1E9345100089CA20 /* MainMenu.xib */ = {
isa = PBXVariantGroup;
children = (
CE9EF6DE1E9345100089CA20 /* Base */,
CE9EF6E11E9345490089CA20 /* fr */,
CE9EF6E31E93454A0089CA20 /* de */,
CE9EF6E51E93454C0089CA20 /* cs */,
CE9EF6E71E93454D0089CA20 /* es */,
CE9EF6E91E93454E0089CA20 /* el */,
CE9EF6EB1E9345500089CA20 /* it */,
CE9EF6ED1E9345510089CA20 /* nl */,
CE9EF6EF1E9345520089CA20 /* pl */,
CE9EF6F11E9345530089CA20 /* ko */,
CE9EF6F31E9345550089CA20 /* hy */,
CE9EF6F51E9345570089CA20 /* pt-BR */,
CE9EF6F71E9345580089CA20 /* ru */,
CE9EF6F91E93455B0089CA20 /* uk */,
CE9EF6FB1E93455C0089CA20 /* zh-Hans */,
CE9EF6FD1E93455D0089CA20 /* vi */,
);
name = MainMenu.xib;
sourceTree = "<group>";
};
/* End PBXVariantGroup section */

/* Begin XCBuildConfiguration section */


Loading…
Cancel
Save