Browse Source

Un-xibless-ified DirectoryPanel

This was a tricky one because the XIB couldn't be read by a modern
Xcode. I had to go back to 10.8's Xcode to read it properly, save it,
and then read it on 10.12. And even then, there we tons of little weird
values here and there.
master
Virgil Dupras 4 years ago
parent
commit
4c0a66379b
8 changed files with 295 additions and 115 deletions
  1. +0
    -9
      build.py
  2. +1
    -1
      cocoa/AppDelegate.m
  3. +1
    -2
      cocoa/Base.lproj/DeletionOptions.xib
  4. +230
    -0
      cocoa/Base.lproj/DirectoryPanel.xib
  5. +13
    -12
      cocoa/DirectoryPanel.h
  6. +8
    -9
      cocoa/DirectoryPanel.m
  7. +0
    -76
      cocoa/ui/directory_panel.py
  8. +42
    -6
      dupeGuru.xcodeproj/project.pbxproj

+ 0
- 9
build.py View File

@@ -79,15 +79,6 @@ def cocoa_app():
def build_xibless(dest='cocoa/autogen'):
import xibless
ensure_folder(dest)
FNPAIRS = [
('problem_dialog.py', 'ProblemDialog_UI'),
('directory_panel.py', 'DirectoryPanel_UI'),
]
for srcname, dstname in FNPAIRS:
xibless.generate(
op.join('cocoa', 'ui', srcname), op.join(dest, dstname),
localizationTable='Localizable'
)
for appmode in ('standard', 'music', 'picture'):
xibless.generate(
op.join('cocoa', 'ui', 'preferences_panel.py'),


+ 1
- 1
cocoa/AppDelegate.m View File

@@ -264,7 +264,7 @@ http://www.gnu.org/licenses/gpl-3.0.html

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




+ 1
- 2
cocoa/Base.lproj/DeletionOptions.xib View File

@@ -9,7 +9,6 @@
<customObject id="-2" userLabel="File's Owner" customClass="DeletionOptions">
<connections>
<outlet property="directButton" destination="35" id="47"/>
<outlet property="hardlinkButton" destination="3" id="46"/>
<outlet property="linkButton" destination="3" id="dBw-fr-16j"/>
<outlet property="linkTypeRadio" destination="WGF-jA-3aM" id="Wz8-lZ-4Rx"/>
<outlet property="messageTextField" destination="43" id="45"/>
@@ -17,7 +16,7 @@
</connections>
</customObject>
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
<customObject id="-3" userLabel="Application"/>
<customObject id="-3" userLabel="Application" customClass="NSObject"/>
<window title="Deletion Options" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" restorable="NO" oneShot="NO" releasedWhenClosed="NO" visibleAtLaunch="NO" animationBehavior="default" id="1">
<windowStyleMask key="styleMask" titled="YES" closable="YES"/>
<rect key="contentRect" x="196" y="240" width="449" height="244"/>


+ 230
- 0
cocoa/Base.lproj/DirectoryPanel.xib View File

@@ -0,0 +1,230 @@
<?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"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<objects>
<customObject id="-2" userLabel="File's Owner" customClass="DirectoryPanel">
<connections>
<outlet property="addButtonPopUp" destination="7" id="26"/>
<outlet property="appModeSelector" destination="pOT-yD-Vzf" id="gVz-b0-daQ"/>
<outlet property="loadRecentButtonPopUp" destination="74" id="77"/>
<outlet property="loadResultsButton" destination="72" id="79"/>
<outlet property="outlineView" destination="11" id="54"/>
<outlet property="removeButton" destination="65" id="69"/>
<outlet property="scanTypePopup" destination="nID-iJ-c06" id="3Jt-dt-g8l"/>
<outlet property="window" destination="5" id="25"/>
</connections>
</customObject>
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
<customObject id="-3" userLabel="Application" customClass="NSObject"/>
<window title="dupeGuru" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" releasedWhenClosed="NO" showsToolbarButton="NO" visibleAtLaunch="NO" frameAutosaveName="DirectoryPanel" animationBehavior="default" id="5" userLabel="directories">
<windowStyleMask key="styleMask" titled="YES" closable="YES" resizable="YES"/>
<windowPositionMask key="initialPositionMask" leftStrut="YES" rightStrut="YES" topStrut="YES" bottomStrut="YES"/>
<rect key="contentRect" x="387" y="265" width="402" height="294"/>
<rect key="screenRect" x="0.0" y="0.0" width="1440" height="878"/>
<value key="minSize" type="size" width="369" height="269"/>
<view key="contentView" misplaced="YES" id="6">
<rect key="frame" x="0.0" y="0.0" width="402" height="294"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<scrollView misplaced="YES" autohidesScrollers="YES" horizontalLineScroll="16" horizontalPageScroll="10" verticalLineScroll="16" verticalPageScroll="10" usesPredominantAxisScrolling="NO" id="10">
<rect key="frame" x="18" y="47" width="364" height="144"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<clipView key="contentView" id="oS9-pA-kFS">
<rect key="frame" x="1" y="0.0" width="362" height="143"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<outlineView verticalHuggingPriority="750" allowsExpansionToolTips="YES" columnReordering="NO" autosaveColumns="NO" rowHeight="14" headerView="53" indentationPerLevel="16" autoresizesOutlineColumn="YES" outlineTableColumn="15" id="11" customClass="HSOutlineView">
<rect key="frame" x="0.0" y="0.0" width="362" height="126"/>
<autoresizingMask key="autoresizingMask"/>
<size key="intercellSpacing" width="3" height="2"/>
<color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
<color key="gridColor" name="gridColor" catalog="System" colorSpace="catalog"/>
<tableColumns>
<tableColumn identifier="name" editable="NO" width="271" minWidth="16" maxWidth="1000" id="15">
<tableHeaderCell key="headerCell" lineBreakMode="truncatingTail" borderStyle="border" alignment="left" title="Name">
<font key="font" metaFont="smallSystem"/>
<color key="textColor" name="headerTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" white="0.33333299" alpha="1" colorSpace="calibratedWhite"/>
</tableHeaderCell>
<textFieldCell key="dataCell" lineBreakMode="truncatingTail" selectable="YES" editable="YES" alignment="left" title="Text Cell" id="49">
<font key="font" metaFont="smallSystem"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
<tableColumnResizingMask key="resizingMask" resizeWithTable="YES" userResizable="YES"/>
</tableColumn>
<tableColumn identifier="state" width="85.35595703125" minWidth="30.35595703125" maxWidth="1000" id="13">
<tableHeaderCell key="headerCell" lineBreakMode="truncatingTail" borderStyle="border" alignment="left" title="State">
<font key="font" metaFont="smallSystem"/>
<color key="textColor" name="headerTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="headerColor" catalog="System" colorSpace="catalog"/>
</tableHeaderCell>
<popUpButtonCell key="dataCell" type="bevel" title="Normal" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" state="on" borderStyle="bezel" inset="2" arrowPosition="arrowAtCenter" preferredEdge="maxY" autoenablesItems="NO" selectedItem="55" id="14">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="smallSystem"/>
<menu key="menu" title="Normal" showsStateColumn="NO" autoenablesItems="NO" id="50">
<items>
<menuItem title="Normal" state="on" id="55">
<modifierMask key="keyEquivalentModifierMask"/>
</menuItem>
<menuItem title="Reference" id="56">
<modifierMask key="keyEquivalentModifierMask"/>
</menuItem>
<menuItem title="Excluded" id="57">
<modifierMask key="keyEquivalentModifierMask"/>
</menuItem>
</items>
</menu>
</popUpButtonCell>
<tableColumnResizingMask key="resizingMask" userResizable="YES"/>
</tableColumn>
</tableColumns>
</outlineView>
</subviews>
</clipView>
<scroller key="horizontalScroller" hidden="YES" verticalHuggingPriority="750" horizontal="YES" id="52">
<rect key="frame" x="1" y="-30" width="312" height="15"/>
<autoresizingMask key="autoresizingMask"/>
</scroller>
<scroller key="verticalScroller" hidden="YES" verticalHuggingPriority="750" horizontal="NO" id="51">
<rect key="frame" x="-30" y="17" width="15" height="150"/>
<autoresizingMask key="autoresizingMask"/>
</scroller>
<tableHeaderView key="headerView" id="53">
<rect key="frame" x="0.0" y="0.0" width="362" height="17"/>
<autoresizingMask key="autoresizingMask"/>
</tableHeaderView>
</scrollView>
<popUpButton hidden="YES" verticalHuggingPriority="750" id="7">
<rect key="frame" x="89" y="16" width="46" height="26"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<popUpButtonCell key="cell" type="push" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" borderStyle="borderAndBezel" inset="2" arrowPosition="arrowAtCenter" preferredEdge="maxY" id="45">
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="menu"/>
<menu key="menu" title="OtherViews" id="8"/>
</popUpButtonCell>
</popUpButton>
<popUpButton hidden="YES" verticalHuggingPriority="750" id="74">
<rect key="frame" x="89" y="6" width="46" height="26"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<popUpButtonCell key="cell" type="push" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" borderStyle="borderAndBezel" inset="2" arrowPosition="arrowAtCenter" preferredEdge="maxY" id="75">
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="menu"/>
<menu key="menu" title="OtherViews" id="76"/>
</popUpButtonCell>
</popUpButton>
<button verticalHuggingPriority="750" misplaced="YES" id="31">
<rect key="frame" x="258" y="13" width="130" height="32"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxY="YES"/>
<buttonCell key="cell" type="push" title="Scan" bezelStyle="rounded" alignment="center" borderStyle="border" inset="2" id="48">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/>
<string key="keyEquivalent" base64-UTF8="YES">
DQ
</string>
</buttonCell>
<connections>
<action selector="startDuplicateScan:" target="-2" id="35y-8d-7O8"/>
</connections>
</button>
<button verticalHuggingPriority="750" id="63">
<rect key="frame" x="20" y="16" width="28" height="25"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<buttonCell key="cell" type="roundTextured" bezelStyle="texturedRounded" image="NSAddTemplate" imagePosition="only" alignment="center" state="on" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="64">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<action selector="popupAddDirectoryMenu:" target="-2" id="68"/>
</connections>
</button>
<button verticalHuggingPriority="750" id="65">
<rect key="frame" x="56" y="16" width="28" height="25"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<buttonCell key="cell" type="roundTextured" bezelStyle="texturedRounded" image="NSRemoveTemplate" imagePosition="only" alignment="center" state="on" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="66">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<action selector="removeSelectedDirectory:" target="-2" id="67"/>
</connections>
</button>
<textField verticalHuggingPriority="750" misplaced="YES" allowsCharacterPickerTouchBarItem="NO" id="70">
<rect key="frame" x="16" y="199" width="368" height="17"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Select folders to scan and press &quot;Scan&quot;." id="71">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" misplaced="YES" allowsCharacterPickerTouchBarItem="NO" id="RqV-hA-fY8">
<rect key="frame" x="16" y="257" width="114" height="17"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Application Mode:" id="jRV-fW-ws7">
<font key="font" metaFont="system"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" misplaced="YES" allowsCharacterPickerTouchBarItem="NO" id="qne-J2-F4p">
<rect key="frame" x="57" y="226" width="71" height="17"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Scan Type:" id="jf9-eU-jVS">
<font key="font" metaFont="system"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<segmentedControl verticalHuggingPriority="750" misplaced="YES" id="pOT-yD-Vzf">
<rect key="frame" x="134" y="250" width="248" height="25"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<segmentedCell key="cell" borderStyle="border" alignment="left" style="automatic" trackingMode="selectOne" id="Fiz-IE-RGK">
<font key="font" metaFont="system"/>
<segments>
<segment label="Standard" width="80" selected="YES"/>
<segment label="Music" width="80" tag="1"/>
<segment label="Picture" width="80"/>
</segments>
</segmentedCell>
<connections>
<action selector="changeAppMode:" target="-2" id="oOb-Nj-TQ0"/>
</connections>
</segmentedControl>
<popUpButton verticalHuggingPriority="750" misplaced="YES" id="nID-iJ-c06">
<rect key="frame" x="132" y="221" width="253" height="26"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<popUpButtonCell key="cell" type="push" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" borderStyle="borderAndBezel" imageScaling="proportionallyDown" inset="2" id="3M9-dD-gs7">
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="menu"/>
<menu key="menu" id="Xhs-UR-nlf"/>
</popUpButtonCell>
</popUpButton>
<button verticalHuggingPriority="750" misplaced="YES" id="72">
<rect key="frame" x="128" y="13" width="130" height="32"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxY="YES"/>
<buttonCell key="cell" type="push" title="Load Results" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="73">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<action selector="popupLoadRecentMenu:" target="-2" id="78"/>
</connections>
</button>
</subviews>
</view>
<connections>
<outlet property="initialFirstResponder" destination="11" id="19"/>
</connections>
<point key="canvasLocation" x="122" y="161"/>
</window>
</objects>
<resources>
<image name="NSAddTemplate" width="11" height="11"/>
<image name="NSRemoveTemplate" width="11" height="11"/>
</resources>
</document>

+ 13
- 12
cocoa/DirectoryPanel.h View File

@@ -1,5 +1,5 @@
/*
Copyright 2015 Hardcoded Software (http://www.hardcoded.net)
Copyright 2017 Virgil Dupras

This software is licensed under the "GPLv3" License as described in the "LICENSE" file,
which should be included with this package. The terms are also available at
@@ -21,13 +21,13 @@ http://www.gnu.org/licenses/gpl-3.0.html
HSRecentFiles *_recentDirectories;
DirectoryOutline *outline;
BOOL _alwaysShowPopUp;
NSSegmentedControl *appModeSelector;
NSPopUpButton *scanTypePopup;
NSPopUpButton *addButtonPopUp;
NSPopUpButton *loadRecentButtonPopUp;
HSOutlineView *outlineView;
NSButton *removeButton;
NSButton *loadResultsButton;
IBOutlet NSSegmentedControl *appModeSelector;
IBOutlet NSPopUpButton *scanTypePopup;
IBOutlet NSPopUpButton *addButtonPopUp;
IBOutlet NSPopUpButton *loadRecentButtonPopUp;
IBOutlet HSOutlineView *outlineView;
IBOutlet NSButton *removeButton;
IBOutlet NSButton *loadResultsButton;
}

@property (readwrite, retain) NSSegmentedControl *appModeSelector;
@@ -45,10 +45,11 @@ http://www.gnu.org/licenses/gpl-3.0.html
- (void)adjustUIToLocalization;

- (void)askForDirectory;
- (void)popupAddDirectoryMenu:(id)sender;
- (void)popupLoadRecentMenu:(id)sender;
- (void)removeSelectedDirectory;
- (void)startDuplicateScan;
- (IBAction)changeAppMode:(id)sender;
- (IBAction)popupAddDirectoryMenu:(id)sender;
- (IBAction)popupLoadRecentMenu:(id)sender;
- (IBAction)removeSelectedDirectory:(id)sender;
- (IBAction)startDuplicateScan:(id)sender;

- (void)addDirectory:(NSString *)directory;
- (void)refreshRemoveButtonText;


+ 8
- 9
cocoa/DirectoryPanel.m View File

@@ -1,5 +1,5 @@
/*
Copyright 2015 Hardcoded Software (http://www.hardcoded.net)
Copyright 2017 Virgil Dupras

This software is licensed under the "GPLv3" License as described in the "LICENSE" file,
which should be included with this package. The terms are also available at
@@ -7,7 +7,6 @@ http://www.gnu.org/licenses/gpl-3.0.html
*/

#import "DirectoryPanel.h"
#import "DirectoryPanel_UI.h"
#import "Dialogs.h"
#import "Utils.h"
#import "AppDelegate.h"
@@ -25,8 +24,8 @@ http://www.gnu.org/licenses/gpl-3.0.html

- (id)initWithParentApp:(AppDelegate *)aParentApp
{
self = [super initWithWindow:nil];
[self setWindow:createDirectoryPanel_UI(self)];
self = [super initWithWindowNibName:@"DirectoryPanel"];
[self window];
_app = aParentApp;
model = [_app model];
[[self window] setTitle:[model appName]];
@@ -121,7 +120,7 @@ http://www.gnu.org/licenses/gpl-3.0.html
}
}

- (void)changeAppMode:(id)sender
- (IBAction)changeAppMode:(id)sender
{
NSInteger appMode;
NSUInteger selectedSegment = self.appModeSelector.selectedSegment;
@@ -138,7 +137,7 @@ http://www.gnu.org/licenses/gpl-3.0.html
[self fillScanTypeMenu];
}

- (void)popupAddDirectoryMenu:(id)sender
- (IBAction)popupAddDirectoryMenu:(id)sender
{
if ((!_alwaysShowPopUp) && ([[_recentDirectories filepaths] count] == 0)) {
[self askForDirectory];
@@ -149,7 +148,7 @@ http://www.gnu.org/licenses/gpl-3.0.html
}
}

- (void)popupLoadRecentMenu:(id)sender
- (IBAction)popupLoadRecentMenu:(id)sender
{
if ([[[_app recentResults] filepaths] count] > 0) {
NSMenu *m = [loadRecentButtonPopUp menu];
@@ -168,14 +167,14 @@ http://www.gnu.org/licenses/gpl-3.0.html
}
}

- (void)removeSelectedDirectory
- (IBAction)removeSelectedDirectory:(id)sender
{
[[self window] makeKeyAndOrderFront:nil];
[[outline model] removeSelectedDirectory];
[self refreshRemoveButtonText];
}

- (void)startDuplicateScan
- (IBAction)startDuplicateScan:(id)sender
{
if ([model resultsAreModified]) {
if ([Dialogs askYesNo:NSLocalizedString(@"You have unsaved results, do you really want to continue?", @"")] == NSAlertSecondButtonReturn) // NO


+ 0
- 76
cocoa/ui/directory_panel.py View File

@@ -1,76 +0,0 @@
ownerclass = 'DirectoryPanel'
ownerimport = 'DirectoryPanel.h'

result = Window(425, 300, "dupeGuru")
promptLabel = Label(result, "Select folders to scan and press \"Scan\".")
directoryOutline = OutlineView(result)
directoryOutline.OBJC_CLASS = 'HSOutlineView'
appModeSelector = SegmentedControl(result)
appModeLabel = Label(result, "Application Mode:")
scanTypePopup = Popup(result)
scanTypeLabel = Label(result, "Scan Type:")
addButton = Button(result, "")
removeButton = Button(result, "")
loadResultsButton = Button(result, "Load Results")
scanButton = Button(result, "Scan")
addPopup = Popup(None)
loadRecentPopup = Popup(None)

owner.outlineView = directoryOutline
owner.appModeSelector = appModeSelector
owner.scanTypePopup = scanTypePopup
owner.removeButton = removeButton
owner.loadResultsButton = loadResultsButton
owner.addButtonPopUp = addPopup
owner.loadRecentButtonPopUp = loadRecentPopup

result.autosaveName = 'DirectoryPanel'
result.canMinimize = False
result.minSize = Size(400, 270)
for label in ["Standard", "Music", "Picture"]:
appModeSelector.addSegment(label, 80)
addButton.bezelStyle = removeButton.bezelStyle = const.NSTexturedRoundedBezelStyle
addButton.image = 'NSAddTemplate'
removeButton.image = 'NSRemoveTemplate'
for button in (addButton, removeButton):
button.style = const.NSTexturedRoundedBezelStyle
button.imagePosition = const.NSImageOnly
scanButton.keyEquivalent = '\\r'
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:')

directoryOutline.font = Font(FontFamily.System, FontSize.SmallSystem)
col = directoryOutline.addColumn('name', "Name", 100)
col.editable = False
col.autoResizable = True
col = directoryOutline.addColumn('state', "State", 85)
col.editable = True
col.autoResizable = False
col.dataCell = Popup(None, ["Normal", "Reference", "Excluded"])
col.dataCell.controlSize = const.NSSmallControlSize
directoryOutline.allowsColumnReordering = False
directoryOutline.allowsColumnSelection = False
directoryOutline.allowsMultipleSelection = True

appModeLabel.width = scanTypeLabel.width = 110
scanTypePopup.width = 248
appModeLayout = HLayout([appModeLabel, appModeSelector])
scanTypeLayout = HLayout([scanTypeLabel, scanTypePopup])

for button in (addButton, removeButton):
button.width = 28
for button in (loadResultsButton, scanButton):
button.width = 118

buttonLayout = HLayout([addButton, removeButton, None, loadResultsButton, scanButton])
mainLayout = VLayout([appModeLayout, scanTypeLayout, promptLabel, directoryOutline, buttonLayout], filler=directoryOutline)
mainLayout.packToCorner(Pack.UpperLeft)
mainLayout.fill(Pack.LowerRight)
directoryOutline.packRelativeTo(promptLabel, Pack.Below)

promptLabel.setAnchor(Pack.UpperLeft, growX=True)
directoryOutline.setAnchor(Pack.UpperLeft, growX=True, growY=True)
buttonLayout.setAnchor(Pack.Below)

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

@@ -11,6 +11,7 @@
CE05598E1E76217C008EB4F8 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = CE05598C1E76217C008EB4F8 /* Localizable.strings */; };
CE0559921E7626E7008EB4F8 /* locale in Resources */ = {isa = PBXBuildFile; fileRef = CE0559911E7626E7008EB4F8 /* locale */; };
CE549CDC1E933C7600C75A05 /* ResultWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = CE549CDA1E933C7600C75A05 /* ResultWindow.xib */; };
CE54FEBE1E9487D600BE559F /* DirectoryPanel.xib in Resources */ = {isa = PBXBuildFile; fileRef = CE54FEBC1E9487D600BE559F /* DirectoryPanel.xib */; };
CE65D0CC1E7781640092126E /* progress.xib in Resources */ = {isa = PBXBuildFile; fileRef = CE65D0CA1E7781640092126E /* progress.xib */; };
CE65D0ED1E7783C40092126E /* ErrorReportWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = CE65D0EB1E7783C40092126E /* ErrorReportWindow.xib */; };
CE6F7D8D1E74E71C004C0518 /* Python in Frameworks */ = {isa = PBXBuildFile; fileRef = CE6F7D8C1E74E71C004C0518 /* Python */; settings = {ATTRIBUTES = (Required, ); }; };
@@ -53,7 +54,6 @@
CE9720F31E74E40300A598C9 /* ResultTable.m in Sources */ = {isa = PBXBuildFile; fileRef = CE9720E31E74E40300A598C9 /* ResultTable.m */; };
CE9720F41E74E40300A598C9 /* ResultWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = CE9720E51E74E40300A598C9 /* ResultWindow.m */; };
CE9720F51E74E40300A598C9 /* StatsLabel.m in Sources */ = {isa = PBXBuildFile; fileRef = CE9720E71E74E40300A598C9 /* StatsLabel.m */; };
CE9721401E74E41D00A598C9 /* DirectoryPanel_UI.m in Sources */ = {isa = PBXBuildFile; fileRef = CE9720FE1E74E41C00A598C9 /* DirectoryPanel_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 */; };
@@ -153,6 +153,22 @@
CE549CF61E933D5D00C75A05 /* uk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = uk; path = cocoa/uk.lproj/ResultWindow.strings; sourceTree = "<group>"; };
CE549CF81E933D5F00C75A05 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "cocoa/zh-Hans.lproj/ResultWindow.strings"; sourceTree = "<group>"; };
CE549CFA1E933D6000C75A05 /* vi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = vi; path = cocoa/vi.lproj/ResultWindow.strings; sourceTree = "<group>"; };
CE54FEBD1E9487D600BE559F /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = cocoa/Base.lproj/DirectoryPanel.xib; sourceTree = "<group>"; };
CE54FEC01E948DC700BE559F /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = cocoa/fr.lproj/DirectoryPanel.strings; sourceTree = "<group>"; };
CE54FEC21E948DC900BE559F /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = cocoa/de.lproj/DirectoryPanel.strings; sourceTree = "<group>"; };
CE54FEC41E948DCC00BE559F /* cs */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = cs; path = cocoa/cs.lproj/DirectoryPanel.strings; sourceTree = "<group>"; };
CE54FEC61E948DCF00BE559F /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = cocoa/es.lproj/DirectoryPanel.strings; sourceTree = "<group>"; };
CE54FEC81E948DD100BE559F /* el */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = el; path = cocoa/el.lproj/DirectoryPanel.strings; sourceTree = "<group>"; };
CE54FECA1E948DD400BE559F /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = cocoa/it.lproj/DirectoryPanel.strings; sourceTree = "<group>"; };
CE54FECC1E948DD600BE559F /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = cocoa/nl.lproj/DirectoryPanel.strings; sourceTree = "<group>"; };
CE54FECE1E948DD900BE559F /* pl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pl; path = cocoa/pl.lproj/DirectoryPanel.strings; sourceTree = "<group>"; };
CE54FED01E948DDD00BE559F /* ko */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ko; path = cocoa/ko.lproj/DirectoryPanel.strings; sourceTree = "<group>"; };
CE54FED21E948DE000BE559F /* hy */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hy; path = cocoa/hy.lproj/DirectoryPanel.strings; sourceTree = "<group>"; };
CE54FED41E948DE300BE559F /* pt-BR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pt-BR"; path = "cocoa/pt-BR.lproj/DirectoryPanel.strings"; sourceTree = "<group>"; };
CE54FED61E948DE600BE559F /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = cocoa/ru.lproj/DirectoryPanel.strings; sourceTree = "<group>"; };
CE54FED81E948DEA00BE559F /* uk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = uk; path = cocoa/uk.lproj/DirectoryPanel.strings; sourceTree = "<group>"; };
CE54FEDA1E948DEC00BE559F /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "cocoa/zh-Hans.lproj/DirectoryPanel.strings"; sourceTree = "<group>"; };
CE54FEDC1E948DEF00BE559F /* vi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = vi; path = cocoa/vi.lproj/DirectoryPanel.strings; sourceTree = "<group>"; };
CE65D0CB1E7781640092126E /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = cocoalib/Base.lproj/progress.xib; sourceTree = "<group>"; };
CE65D0CE1E7781730092126E /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = cocoalib/fr.lproj/progress.strings; sourceTree = "<group>"; };
CE65D0D01E7781740092126E /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = cocoalib/de.lproj/progress.strings; sourceTree = "<group>"; };
@@ -295,8 +311,6 @@
CE9720E51E74E40300A598C9 /* ResultWindow.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = ResultWindow.m; path = cocoa/ResultWindow.m; sourceTree = "<group>"; };
CE9720E61E74E40300A598C9 /* StatsLabel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = StatsLabel.h; path = cocoa/StatsLabel.h; sourceTree = "<group>"; };
CE9720E71E74E40300A598C9 /* StatsLabel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = StatsLabel.m; path = cocoa/StatsLabel.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>"; };
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>"; };
@@ -462,6 +476,7 @@
isa = PBXGroup;
children = (
CE9EF6DD1E9345100089CA20 /* MainMenu.xib */,
CE54FEBC1E9487D600BE559F /* DirectoryPanel.xib */,
CE549CDA1E933C7600C75A05 /* ResultWindow.xib */,
CE0559851E762105008EB4F8 /* IgnoreListDialog.xib */,
CEF093DC1E9474F700CD0BF3 /* DeletionOptions.xib */,
@@ -602,8 +617,6 @@
CE9720F61E74E40E00A598C9 /* autogen */ = {
isa = PBXGroup;
children = (
CE9720FD1E74E41C00A598C9 /* DirectoryPanel_UI.h */,
CE9720FE1E74E41C00A598C9 /* DirectoryPanel_UI.m */,
CE9721071E74E41C00A598C9 /* ObjP.h */,
CE9721081E74E41C00A598C9 /* ObjP.m */,
CE9721091E74E41C00A598C9 /* PreferencesPanelMusic_UI.h */,
@@ -771,6 +784,7 @@
CEFC8A251E74F23000965F37 /* dg_cocoa.py in Resources */,
CEF093DE1E9474F700CD0BF3 /* DeletionOptions.xib in Resources */,
CE7CA6061E76337700874874 /* about.xib in Resources */,
CE54FEBE1E9487D600BE559F /* DirectoryPanel.xib in Resources */,
CE7CA6071E76337700874874 /* cocoalib.strings in Resources */,
CE0559871E762105008EB4F8 /* IgnoreListDialog.xib in Resources */,
CEF094621E94828600CD0BF3 /* ProblemDialog.xib in Resources */,
@@ -796,7 +810,6 @@
CE6F7E081E74EA12004C0518 /* HSProgressWindow.m in Sources */,
CE97215F1E74E41D00A598C9 /* XiblessSupport.m in Sources */,
CE9721511E74E41D00A598C9 /* PyDupeGuru.m in Sources */,
CE9721401E74E41D00A598C9 /* DirectoryPanel_UI.m in Sources */,
CE9720EC1E74E40300A598C9 /* DirectoryOutline.m in Sources */,
CE9720EE1E74E40300A598C9 /* IgnoreListDialog.m in Sources */,
CE9721501E74E41D00A598C9 /* PyDirectoryOutline.m in Sources */,
@@ -926,6 +939,29 @@
name = ResultWindow.xib;
sourceTree = "<group>";
};
CE54FEBC1E9487D600BE559F /* DirectoryPanel.xib */ = {
isa = PBXVariantGroup;
children = (
CE54FEBD1E9487D600BE559F /* Base */,
CE54FEC01E948DC700BE559F /* fr */,
CE54FEC21E948DC900BE559F /* de */,
CE54FEC41E948DCC00BE559F /* cs */,
CE54FEC61E948DCF00BE559F /* es */,
CE54FEC81E948DD100BE559F /* el */,
CE54FECA1E948DD400BE559F /* it */,
CE54FECC1E948DD600BE559F /* nl */,
CE54FECE1E948DD900BE559F /* pl */,
CE54FED01E948DDD00BE559F /* ko */,
CE54FED21E948DE000BE559F /* hy */,
CE54FED41E948DE300BE559F /* pt-BR */,
CE54FED61E948DE600BE559F /* ru */,
CE54FED81E948DEA00BE559F /* uk */,
CE54FEDA1E948DEC00BE559F /* zh-Hans */,
CE54FEDC1E948DEF00BE559F /* vi */,
);
name = DirectoryPanel.xib;
sourceTree = "<group>";
};
CE65D0CA1E7781640092126E /* progress.xib */ = {
isa = PBXVariantGroup;
children = (


Loading…
Cancel
Save