1
0
mirror of https://github.com/arsenetar/dupeguru-cocoa.git synced 2024-10-29 23:15:56 +00:00

Un-xibless-ified ResultWindow

This commit is contained in:
Virgil Dupras 2017-04-03 23:04:01 -04:00
parent c8c3f127ab
commit b0dcf86e05
8 changed files with 397 additions and 216 deletions

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'),
('result_window.py', 'ResultWindow_UI'),
('main_menu.py', 'MainMenu_UI'),
('details_panel.py', 'DetailsPanel_UI'),
('details_panel_picture.py', 'DetailsPanelPicture_UI'),

View File

@ -0,0 +1,275 @@
<?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="ResultWindow">
<connections>
<outlet property="filterField" destination="41" id="61"/>
<outlet property="matches" destination="8" id="66"/>
<outlet property="optionsSwitch" destination="43" id="64"/>
<outlet property="optionsToolbarItem" destination="15" id="92"/>
<outlet property="stats" destination="5" id="65"/>
<outlet property="window" destination="1" id="46"/>
</connections>
</customObject>
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
<customObject id="-3" userLabel="Application"/>
<menu title="Menu" id="67" userLabel="matches_context">
<items>
<menuItem title="Remove Selected from Results" id="71">
<connections>
<action selector="removeSelected:" target="-2" id="76"/>
</connections>
</menuItem>
<menuItem title="Add Selected to Ignore List" id="68">
<connections>
<action selector="ignoreSelected:" target="-2" id="77"/>
</connections>
</menuItem>
<menuItem title="Make Selected Reference" id="72">
<connections>
<action selector="switchSelected:" target="-2" id="78"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="69">
<modifierMask key="keyEquivalentModifierMask" command="YES"/>
</menuItem>
<menuItem title="Open Selected with Default Application" id="74">
<connections>
<action selector="openSelected:" target="-2" id="79"/>
</connections>
</menuItem>
<menuItem title="Reveal Selected in Finder" id="73">
<connections>
<action selector="revealSelected:" target="-2" id="80"/>
</connections>
</menuItem>
<menuItem title="Rename Selected" id="70">
<connections>
<action selector="renameSelected:" target="-2" id="81"/>
</connections>
</menuItem>
</items>
</menu>
<window title="dupeGuru Results" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" oneShot="NO" releasedWhenClosed="NO" visibleAtLaunch="NO" frameAutosaveName="MainWindow" animationBehavior="default" id="1" userLabel="Window">
<windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES" resizable="YES"/>
<windowPositionMask key="initialPositionMask" leftStrut="YES" rightStrut="YES" topStrut="YES" bottomStrut="YES"/>
<rect key="contentRect" x="47" y="310" width="557" height="400"/>
<rect key="screenRect" x="0.0" y="0.0" width="1920" height="1058"/>
<value key="minSize" type="size" width="340" height="340"/>
<view key="contentView" id="3">
<rect key="frame" x="0.0" y="0.0" width="557" height="400"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<textField verticalHuggingPriority="750" allowsCharacterPickerTouchBarItem="NO" id="5">
<rect key="frame" x="17" y="6" width="523" height="17"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMaxY="YES"/>
<textFieldCell key="cell" sendsActionOnEndEditing="YES" alignment="center" title="Marked: 0 files, 0 B. Total: 0 files, 0 B." id="6">
<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>
<scrollView autohidesScrollers="YES" horizontalLineScroll="16" horizontalPageScroll="10" verticalLineScroll="16" verticalPageScroll="10" usesPredominantAxisScrolling="NO" id="4">
<rect key="frame" x="0.0" y="28" width="559" height="373"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<clipView key="contentView" id="F1z-AN-Fbf">
<rect key="frame" x="1" y="0.0" width="557" height="372"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<tableView verticalHuggingPriority="750" allowsExpansionToolTips="YES" columnAutoresizingStyle="lastColumnOnly" alternatingRowBackgroundColors="YES" emptySelection="NO" autosaveColumns="NO" rowHeight="14" headerView="7" id="8" customClass="HSTableView">
<rect key="frame" x="0.0" y="0.0" width="557" height="349"/>
<autoresizingMask key="autoresizingMask"/>
<size key="intercellSpacing" width="3" height="2"/>
<color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
<tableViewGridLines key="gridStyleMask" horizontal="YES"/>
<color key="gridColor" name="gridColor" catalog="System" colorSpace="catalog"/>
<connections>
<binding destination="88" name="rowHeight" keyPath="values.TableFontSize" id="90">
<dictionary key="options">
<string key="NSValueTransformerName">vtRowHeightOffset</string>
</dictionary>
</binding>
<outlet property="menu" destination="67" id="83"/>
</connections>
</tableView>
</subviews>
</clipView>
<scroller key="horizontalScroller" hidden="YES" verticalHuggingPriority="750" horizontal="YES" id="9">
<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">
<rect key="frame" x="224" y="17" width="15" height="102"/>
<autoresizingMask key="autoresizingMask"/>
</scroller>
<tableHeaderView key="headerView" id="7">
<rect key="frame" x="0.0" y="0.0" width="557" height="23"/>
<autoresizingMask key="autoresizingMask"/>
</tableHeaderView>
</scrollView>
</subviews>
</view>
<toolbar key="toolbar" implicitIdentifier="184FCE08-7704-43E1-B7CA-394621354414" displayMode="iconOnly" sizeMode="regular" id="2">
<allowedToolbarItems>
<toolbarItem implicitItemIdentifier="NSToolbarSpaceItem" id="22"/>
<toolbarItem implicitItemIdentifier="NSToolbarFlexibleSpaceItem" id="21"/>
<toolbarItem implicitItemIdentifier="F37510C7-955F-4141-9D09-AC2881ADCCFA" label="Action" paletteLabel="Action" image="NSActionTemplate" id="17">
<nil key="toolTip"/>
<size key="minSize" width="30" height="25"/>
<size key="maxSize" width="40" height="26"/>
<popUpButton key="view" verticalHuggingPriority="750" misplaced="YES" imageHugsTitle="YES" id="24">
<rect key="frame" x="0.0" y="14" width="42" height="25"/>
<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"/>
<menu key="menu" title="OtherViews" id="26">
<items>
<menuItem title=" " state="on" image="NSActionTemplate" hidden="YES" id="28"/>
<menuItem title="Send Marked to Trash..." id="29">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="trashMarked:" target="-1" id="93"/>
</connections>
</menuItem>
<menuItem title="Move Marked to..." id="30">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="moveMarked:" target="-2" id="52"/>
</connections>
</menuItem>
<menuItem title="Copy Marked to..." id="31">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="copyMarked:" target="-2" id="53"/>
</connections>
</menuItem>
<menuItem title="Remove Marked from Results" id="32">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="removeMarked:" target="-2" id="54"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="33">
<modifierMask key="keyEquivalentModifierMask" command="YES"/>
</menuItem>
<menuItem title="Remove Selected from Results" id="34">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="removeSelected:" target="-2" id="55"/>
</connections>
</menuItem>
<menuItem title="Add Selected to Ignore List" id="35">
<connections>
<action selector="ignoreSelected:" target="-2" id="56"/>
</connections>
</menuItem>
<menuItem title="Make Selected Reference" id="36">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="switchSelected:" target="-2" id="57"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="37">
<modifierMask key="keyEquivalentModifierMask" command="YES"/>
</menuItem>
<menuItem title="Open Selected with Default Application" id="38">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="openSelected:" target="-2" id="58"/>
</connections>
</menuItem>
<menuItem title="Reveal Selected in Finder" id="39">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="revealSelected:" target="-2" id="59"/>
</connections>
</menuItem>
<menuItem title="Rename Selected" id="40">
<connections>
<action selector="renameSelected:" target="-2" id="60"/>
</connections>
</menuItem>
</items>
</menu>
</popUpButtonCell>
</popUpButton>
</toolbarItem>
<toolbarItem implicitItemIdentifier="8E5ADD0F-24AD-452A-BE68-464FE9E5E240" label="Filter" paletteLabel="Filter" id="16">
<nil key="toolTip"/>
<size key="minSize" width="81" height="22"/>
<size key="maxSize" width="300" height="22"/>
<searchField key="view" wantsLayer="YES" verticalHuggingPriority="750" allowsCharacterPickerTouchBarItem="NO" textCompletion="NO" id="41">
<rect key="frame" x="0.0" y="14" width="81" height="22"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES"/>
<searchFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" borderStyle="bezel" placeholderString="Filter" bezelStyle="round" sendsWholeSearchString="YES" maximumRecents="10" id="42">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</searchFieldCell>
<connections>
<action selector="filter:" target="-2" id="62"/>
</connections>
</searchField>
</toolbarItem>
<toolbarItem implicitItemIdentifier="4BD1D94E-8A70-48E1-AF8A-CEDC80CD0A5E" label="Options" paletteLabel="Options" id="15">
<nil key="toolTip"/>
<size key="minSize" width="195" height="20"/>
<size key="maxSize" width="195" height="25"/>
<segmentedControl key="view" verticalHuggingPriority="750" id="43">
<rect key="frame" x="0.0" y="14" width="195" height="25"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<segmentedCell key="cell" borderStyle="border" alignment="left" style="automatic" trackingMode="selectAny" id="44">
<font key="font" metaFont="system"/>
<segments>
<segment label="Details" width="57"/>
<segment label="Dupes Only" width="82" tag="1"/>
<segment label="Delta" width="48"/>
</segments>
</segmentedCell>
<connections>
<action selector="changeOptions:" target="-2" id="63"/>
</connections>
</segmentedControl>
</toolbarItem>
<toolbarItem implicitItemIdentifier="A85CDEA8-333B-47CF-960E-DDC65B0C56BC" label="Quick Look" paletteLabel="Quick Look" image="NSQuickLookTemplate" id="86">
<nil key="toolTip"/>
<size key="minSize" width="30" height="25"/>
<size key="maxSize" width="44" height="32"/>
<button key="view" verticalHuggingPriority="750" imageHugsTitle="YES" id="84">
<rect key="frame" x="11" y="14" width="44" height="25"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<buttonCell key="cell" type="roundTextured" bezelStyle="texturedRounded" image="NSQuickLookTemplate" imagePosition="only" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="85">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
</button>
<connections>
<action selector="toggleQuicklookPanel:" target="-2" id="87"/>
</connections>
</toolbarItem>
</allowedToolbarItems>
<defaultToolbarItems>
<toolbarItem reference="17"/>
<toolbarItem reference="15"/>
<toolbarItem reference="86"/>
<toolbarItem reference="21"/>
<toolbarItem reference="16"/>
</defaultToolbarItems>
</toolbar>
<connections>
<outlet property="delegate" destination="-2" id="45"/>
</connections>
</window>
<userDefaultsController representsSharedInstance="YES" id="88"/>
</objects>
<resources>
<image name="NSActionTemplate" width="14" height="14"/>
<image name="NSQuickLookTemplate" width="19" height="12"/>
</resources>
</document>

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
@ -46,31 +46,31 @@ http://www.gnu.org/licenses/gpl-3.0.html
- (void)initResultColumns:(ResultTable *)aTable;
/* Actions */
- (void)changeOptions;
- (void)copyMarked;
- (void)trashMarked;
- (void)filter;
- (void)focusOnFilterField;
- (void)ignoreSelected;
- (void)invokeCustomCommand;
- (void)markAll;
- (void)markInvert;
- (void)markNone;
- (void)markSelected;
- (void)moveMarked;
- (void)openClicked;
- (void)openSelected;
- (void)removeMarked;
- (void)removeSelected;
- (void)renameSelected;
- (void)reprioritizeResults;
- (void)resetColumnsToDefault;
- (void)revealSelected;
- (void)saveResults;
- (void)switchSelected;
- (void)toggleColumn:(id)sender;
- (void)toggleDelta;
- (void)toggleDetailsPanel;
- (void)togglePowerMarker;
- (void)toggleQuicklookPanel;
- (IBAction)changeOptions:(id)sender;
- (IBAction)copyMarked:(id)sender;
- (IBAction)trashMarked:(id)sender;
- (IBAction)filter:(id)sender;
- (IBAction)focusOnFilterField:(id)sender;
- (IBAction)ignoreSelected:(id)sender;
- (IBAction)invokeCustomCommand:(id)sender;
- (IBAction)markAll:(id)sender;
- (IBAction)markInvert:(id)sender;
- (IBAction)markNone:(id)sender;
- (IBAction)markSelected:(id)sender;
- (IBAction)moveMarked:(id)sender;
- (IBAction)openClicked:(id)sender;
- (IBAction)openSelected:(id)sender;
- (IBAction)removeMarked:(id)sender;
- (IBAction)removeSelected:(id)sender;
- (IBAction)renameSelected:(id)sender;
- (IBAction)reprioritizeResults:(id)sender;
- (IBAction)resetColumnsToDefault:(id)sender;
- (IBAction)revealSelected:(id)sender;
- (IBAction)saveResults:(id)sender;
- (IBAction)switchSelected:(id)sender;
- (IBAction)toggleColumn:(id)sender;
- (IBAction)toggleDelta:(id)sender;
- (IBAction)toggleDetailsPanel:(id)sender;
- (IBAction)togglePowerMarker:(id)sender;
- (IBAction)toggleQuicklookPanel:(id)sender;
@end

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 "ResultWindow.h"
#import "ResultWindow_UI.h"
#import "Dialogs.h"
#import "ProgressController.h"
#import "Utils.h"
@ -25,11 +24,10 @@ http://www.gnu.org/licenses/gpl-3.0.html
- (id)initWithParentApp:(AppDelegate *)aApp;
{
self = [super initWithWindow:nil];
self = [super initWithWindowNibName:@"ResultWindow"];
[self window];
app = aApp;
model = [app model];
[self setWindow:createResultWindow_UI(self)];
[[self window] setTitle:fmt(NSLocalizedString(@"%@ Results", @""), [model appName])];
/* Put a cute iTunes-like bottom bar */
[[self window] setContentBorderThickness:28 forEdge:NSMinYEdge];
table = [[ResultTable alloc] initWithPyRef:[model resultTable] view:matches];
@ -183,21 +181,21 @@ http://www.gnu.org/licenses/gpl-3.0.html
}
/* Actions */
- (void)changeOptions
- (IBAction)changeOptions:(id)sender
{
NSInteger seg = [optionsSwitch selectedSegment];
if (seg == 0) {
[self toggleDetailsPanel];
[self toggleDetailsPanel:sender];
}
else if (seg == 1) {
[self togglePowerMarker];
[self togglePowerMarker:sender];
}
else if (seg == 2) {
[self toggleDelta];
[self toggleDelta:sender];
}
}
- (void)copyMarked
- (IBAction)copyMarked:(id)sender
{
NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];
[model setRemoveEmptyFolders:n2b([ud objectForKey:@"removeEmptyFolders"])];
@ -205,56 +203,56 @@ http://www.gnu.org/licenses/gpl-3.0.html
[model copyMarked];
}
- (void)trashMarked
- (IBAction)trashMarked:(id)sender
{
NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];
[model setRemoveEmptyFolders:n2b([ud objectForKey:@"removeEmptyFolders"])];
[model deleteMarked];
}
- (void)filter
- (IBAction)filter:(id)sender
{
NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];
[model setEscapeFilterRegexp:!n2b([ud objectForKey:@"useRegexpFilter"])];
[model applyFilter:[filterField stringValue]];
}
- (void)focusOnFilterField
- (IBAction)focusOnFilterField:(id)sender
{
[[self window] makeFirstResponder:filterField];
}
- (void)ignoreSelected
- (IBAction)ignoreSelected:(id)sender
{
[model addSelectedToIgnoreList];
}
- (void)invokeCustomCommand
- (IBAction)invokeCustomCommand:(id)sender
{
[model invokeCustomCommand];
}
- (void)markAll
- (IBAction)markAll:(id)sender
{
[model markAll];
}
- (void)markInvert
- (IBAction)markInvert:(id)sender
{
[model markInvert];
}
- (void)markNone
- (IBAction)markNone:(id)sender
{
[model markNone];
}
- (void)markSelected
- (IBAction)markSelected:(id)sender
{
[model toggleSelectedMark];
}
- (void)moveMarked
- (IBAction)moveMarked:(id)sender
{
NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];
[model setRemoveEmptyFolders:n2b([ud objectForKey:@"removeEmptyFolders"])];
@ -262,7 +260,7 @@ http://www.gnu.org/licenses/gpl-3.0.html
[model moveMarked];
}
- (void)openClicked
- (IBAction)openClicked:(id)sender
{
if ([matches clickedRow] < 0) {
return;
@ -271,29 +269,29 @@ http://www.gnu.org/licenses/gpl-3.0.html
[model openSelected];
}
- (void)openSelected
- (IBAction)openSelected:(id)sender
{
[model openSelected];
}
- (void)removeMarked
- (IBAction)removeMarked:(id)sender
{
[model removeMarked];
}
- (void)removeSelected
- (IBAction)removeSelected:(id)sender
{
[model removeSelected];
}
- (void)renameSelected
- (IBAction)renameSelected:(id)sender
{
NSInteger col = [matches columnWithIdentifier:@"name"];
NSInteger row = [matches selectedRow];
[matches editColumn:col row:row withEvent:[NSApp currentEvent] select:YES];
}
- (void)reprioritizeResults
- (IBAction)reprioritizeResults:(id)sender
{
PrioritizeDialog *dlg = [[PrioritizeDialog alloc] initWithApp:model];
NSInteger result = [NSApp runModalForWindow:[dlg window]];
@ -304,18 +302,18 @@ http://www.gnu.org/licenses/gpl-3.0.html
[[self window] makeKeyAndOrderFront:nil];
}
- (void)resetColumnsToDefault
- (IBAction)resetColumnsToDefault:(id)sender
{
[[[table columns] model] resetToDefaults];
[self fillColumnsMenu];
}
- (void)revealSelected
- (IBAction)revealSelected:(id)sender
{
[model revealSelected];
}
- (void)saveResults
- (IBAction)saveResults:(id)sender
{
NSSavePanel *sp = [NSSavePanel savePanel];
[sp setCanCreateDirectories:YES];
@ -327,37 +325,37 @@ http://www.gnu.org/licenses/gpl-3.0.html
}
}
- (void)switchSelected
- (IBAction)switchSelected:(id)sender
{
[model makeSelectedReference];
}
- (void)toggleColumn:(id)sender
- (IBAction)toggleColumn:(id)sender
{
NSMenuItem *mi = sender;
BOOL checked = [[[table columns] model] toggleMenuItem:[mi tag]];
[mi setState:checked ? NSOnState : NSOffState];
}
- (void)toggleDetailsPanel
- (IBAction)toggleDetailsPanel:(id)sender
{
[[app detailsPanel] toggleVisibility];
[self updateOptionSegments];
}
- (void)toggleDelta
- (IBAction)toggleDelta:(id)sender
{
[table setDeltaValuesMode:![table deltaValuesMode]];
[self updateOptionSegments];
}
- (void)togglePowerMarker
- (IBAction)togglePowerMarker:(id)sender
{
[table setPowerMarkerMode:![table powerMarkerMode]];
[self updateOptionSegments];
}
- (void)toggleQuicklookPanel
- (IBAction)toggleQuicklookPanel:(id)sender
{
if ([QLPreviewPanel sharedPreviewPanelExists] && [[QLPreviewPanel sharedPreviewPanel] isVisible]) {
[[QLPreviewPanel sharedPreviewPanel] orderOut:nil];

View File

@ -1,30 +0,0 @@
ownerclass = 'IgnoreListDialog'
ownerimport = 'IgnoreListDialog.h'
result = Window(550, 350, "Ignore List")
table = TableView(result)
removeSelectedButton = Button(result, "Remove Selected")
clearButton = Button(result, "Clear")
closeButton = Button(result, "Close")
owner.ignoreListTableView = table
result.canMinimize = False
removeSelectedButton.action = Action(owner.model, 'removeSelected')
clearButton.action = Action(owner.model, 'clear')
closeButton.action = Action(result, 'performClose:')
closeButton.keyEquivalent = '\\r'
table.allowsColumnReordering = False
table.allowsColumnSelection = False
table.allowsMultipleSelection = True
removeSelectedButton.width = 142
clearButton.width = 142
closeButton.width = 84
buttonLayout = HLayout([removeSelectedButton, clearButton, None, closeButton])
buttonLayout.packToCorner(Pack.LowerLeft)
buttonLayout.fill(Pack.Right)
buttonLayout.setAnchor(Pack.Below)
table.packRelativeTo(buttonLayout, Pack.Above)
table.fill(Pack.UpperRight)
table.setAnchor(Pack.UpperLeft, growX=True, growY=True)

View File

@ -25,7 +25,7 @@ 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("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')
@ -39,35 +39,35 @@ 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')
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.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.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')
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')
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.addItem("Details Panel", Action(None, 'toggleDetailsPanel:'), 'cmd+i')
windowMenu.addItem("Quick Look", Action(None, 'toggleQuicklookPanel:'), 'cmd+l')
windowMenu.addSeparator()
windowMenu.addItem("Minimize", Action(None, 'performMinimize:'))
windowMenu.addItem("Minimize", Action(None, 'performMiniaturize:'))
windowMenu.addItem("Zoom", Action(None, 'performZoom:'))
windowMenu.addItem("Close Window", Action(None, 'performClose:'), 'cmd+w')
windowMenu.addSeparator()

View File

@ -1,97 +0,0 @@
ownerclass = 'ResultWindow'
ownerimport = 'ResultWindow.h'
result = Window(557, 400, "dupeGuru Results")
toolbar = result.createToolbar('ResultsToolbar')
table = TableView(result)
table.OBJC_CLASS = 'HSTableView'
statsLabel = Label(result, "")
contextMenu = Menu("")
#Setup toolbar items
toolbar.displayMode = const.NSToolbarDisplayModeIconOnly
directoriesToolItem = toolbar.addItem('Directories', "Directories", image='folder32')
actionToolItem = toolbar.addItem('Action', "Action")
filterToolItem = toolbar.addItem('Filter', "Filter")
optionsToolItem = toolbar.addItem('Options', "Options")
quicklookToolItem = toolbar.addItem('QuickLook', "Quick Look")
toolbar.defaultItems = [actionToolItem, optionsToolItem, quicklookToolItem, directoriesToolItem,
toolbar.flexibleSpace(), filterToolItem]
actionPopup = Popup(None)
actionPopup.pullsdown = True
actionPopup.bezelStyle = const.NSTexturedRoundedBezelStyle
actionPopup.arrowPosition = const.NSPopUpArrowAtBottom
item = actionPopup.menu.addItem("") # First item is invisible
item.hidden = True
item.image = 'NSActionTemplate'
actionPopup.width = 44
actionToolItem.view = actionPopup
filterField = SearchField(None, "Filter")
filterField.action = Action(owner, 'filter')
filterField.sendsWholeSearchString = True
filterToolItem.view = filterField
filterToolItem.minSize = Size(80, 22)
filterToolItem.maxSize = Size(300, 22)
quickLookButton = Button(None, "")
quickLookButton.bezelStyle = const.NSTexturedRoundedBezelStyle
quickLookButton.image = 'NSQuickLookTemplate'
quickLookButton.width = 44
quickLookButton.action = Action(owner, 'toggleQuicklookPanel')
quicklookToolItem.view = quickLookButton
optionsSegments = SegmentedControl(None)
optionsSegments.segmentStyle = const.NSSegmentStyleCapsule
optionsSegments.trackingMode = const.NSSegmentSwitchTrackingSelectAny
optionsSegments.font = Font(FontFamily.System, 11)
optionsSegments.addSegment("Details", 57)
optionsSegments.addSegment("Dupes Only", 82)
optionsSegments.addSegment("Delta", 48)
optionsSegments.action = Action(owner, 'changeOptions')
optionsToolItem.view = optionsSegments
# Popuplate menus
actionPopup.menu.addItem("Send Marked to Trash...", action=Action(owner, 'trashMarked'))
actionPopup.menu.addItem("Move Marked to...", action=Action(owner, 'moveMarked'))
actionPopup.menu.addItem("Copy Marked to...", action=Action(owner, 'copyMarked'))
actionPopup.menu.addItem("Remove Marked from Results", action=Action(owner, 'removeMarked'))
actionPopup.menu.addSeparator()
for menu in (actionPopup.menu, contextMenu):
menu.addItem("Remove Selected from Results", action=Action(owner, 'removeSelected'))
menu.addItem("Add Selected to Ignore List", action=Action(owner, 'ignoreSelected'))
menu.addItem("Make Selected into Reference", action=Action(owner, 'switchSelected'))
menu.addSeparator()
menu.addItem("Open Selected with Default Application", action=Action(owner, 'openSelected'))
menu.addItem("Reveal Selected in Finder", action=Action(owner, 'revealSelected'))
menu.addItem("Rename Selected", action=Action(owner, 'renameSelected'))
# Doing connections
owner.filterField = filterField
owner.matches = table
owner.optionsSwitch = optionsSegments
owner.optionsToolbarItem = optionsToolItem
owner.stats = statsLabel
table.bind('rowHeight', defaults, 'values.TableFontSize', valueTransformer='vtRowHeightOffset')
# Rest of the setup
result.minSize = Size(340, 340)
result.autosaveName = 'MainWindow'
statsLabel.alignment = TextAlignment.Center
table.alternatingRows = True
table.menu = contextMenu
table.allowsColumnReordering = True
table.allowsColumnResizing = True
table.allowsColumnSelection = False
table.allowsEmptySelection = False
table.allowsMultipleSelection = True
table.allowsTypeSelect = True
table.gridStyleMask = const.NSTableViewSolidHorizontalGridLineMask
table.setAnchor(Pack.UpperLeft, growX=True, growY=True)
statsLabel.setAnchor(Pack.LowerLeft, growX=True)
# Layout
# It's a little weird to pack with a margin of -1, but if I don't do that, I get too thick of a
# border on the upper side of the table.
table.packToCorner(Pack.UpperLeft, margin=-1)
table.fill(Pack.Right, margin=0)
statsLabel.packRelativeTo(table, Pack.Below, margin=6)
statsLabel.fill(Pack.Right, margin=0)
table.fill(Pack.Below, margin=5)

View File

@ -10,6 +10,7 @@
CE0559871E762105008EB4F8 /* IgnoreListDialog.xib in Resources */ = {isa = PBXBuildFile; fileRef = CE0559851E762105008EB4F8 /* IgnoreListDialog.xib */; };
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 */; };
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, ); }; };
@ -81,7 +82,6 @@
CE97215B1E74E41D00A598C9 /* PyStatsLabel.m in Sources */ = {isa = PBXBuildFile; fileRef = CE9721341E74E41D00A598C9 /* PyStatsLabel.m */; };
CE97215C1E74E41D00A598C9 /* PyTable.m in Sources */ = {isa = PBXBuildFile; fileRef = CE9721361E74E41D00A598C9 /* PyTable.m */; };
CE97215D1E74E41D00A598C9 /* PyTextField.m in Sources */ = {isa = PBXBuildFile; fileRef = CE9721381E74E41D00A598C9 /* PyTextField.m */; };
CE97215E1E74E41D00A598C9 /* ResultWindow_UI.m in Sources */ = {isa = PBXBuildFile; fileRef = CE97213A1E74E41D00A598C9 /* ResultWindow_UI.m */; };
CE97215F1E74E41D00A598C9 /* XiblessSupport.m in Sources */ = {isa = PBXBuildFile; fileRef = CE97213C1E74E41D00A598C9 /* XiblessSupport.m */; };
CED88C1F1E763F2700C9B98C /* py in Resources */ = {isa = PBXBuildFile; fileRef = CED88C1E1E763F2700C9B98C /* py */; };
CEFC8A251E74F23000965F37 /* dg_cocoa.py in Resources */ = {isa = PBXBuildFile; fileRef = CEFC8A231E74F23000965F37 /* dg_cocoa.py */; };
@ -137,6 +137,22 @@
CE0559CD1E762A94008EB4F8 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "cocoa/zh-Hans.lproj/Localizable.strings"; sourceTree = "<group>"; };
CE0559CE1E762A9A008EB4F8 /* vi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = vi; path = cocoa/vi.lproj/IgnoreListDialog.strings; sourceTree = "<group>"; };
CE0559D01E762A9A008EB4F8 /* vi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = vi; path = cocoa/vi.lproj/Localizable.strings; sourceTree = "<group>"; };
CE549CDB1E933C7600C75A05 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = cocoa/Base.lproj/ResultWindow.xib; sourceTree = "<group>"; };
CE549CDE1E933D4A00C75A05 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = cocoa/fr.lproj/ResultWindow.strings; sourceTree = "<group>"; };
CE549CE01E933D4C00C75A05 /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = cocoa/de.lproj/ResultWindow.strings; sourceTree = "<group>"; };
CE549CE21E933D4D00C75A05 /* cs */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = cs; path = cocoa/cs.lproj/ResultWindow.strings; sourceTree = "<group>"; };
CE549CE41E933D4F00C75A05 /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = cocoa/es.lproj/ResultWindow.strings; sourceTree = "<group>"; };
CE549CE61E933D5000C75A05 /* el */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = el; path = cocoa/el.lproj/ResultWindow.strings; sourceTree = "<group>"; };
CE549CE81E933D5100C75A05 /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = cocoa/it.lproj/ResultWindow.strings; sourceTree = "<group>"; };
CE549CEA1E933D5300C75A05 /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = cocoa/nl.lproj/ResultWindow.strings; sourceTree = "<group>"; };
CE549CEC1E933D5500C75A05 /* pl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pl; path = cocoa/pl.lproj/ResultWindow.strings; sourceTree = "<group>"; };
CE549CEE1E933D5700C75A05 /* ko */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ko; path = cocoa/ko.lproj/ResultWindow.strings; sourceTree = "<group>"; };
CE549CF01E933D5A00C75A05 /* hy */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hy; path = cocoa/hy.lproj/ResultWindow.strings; sourceTree = "<group>"; };
CE549CF21E933D5B00C75A05 /* pt-BR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pt-BR"; path = "cocoa/pt-BR.lproj/ResultWindow.strings"; sourceTree = "<group>"; };
CE549CF41E933D5C00C75A05 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = cocoa/ru.lproj/ResultWindow.strings; sourceTree = "<group>"; };
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>"; };
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>"; };
@ -337,8 +353,6 @@
CE9721361E74E41D00A598C9 /* PyTable.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = PyTable.m; path = cocoa/autogen/PyTable.m; sourceTree = "<group>"; };
CE9721371E74E41D00A598C9 /* PyTextField.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PyTextField.h; path = cocoa/autogen/PyTextField.h; sourceTree = "<group>"; };
CE9721381E74E41D00A598C9 /* PyTextField.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = PyTextField.m; path = cocoa/autogen/PyTextField.m; sourceTree = "<group>"; };
CE9721391E74E41D00A598C9 /* ResultWindow_UI.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ResultWindow_UI.h; path = cocoa/autogen/ResultWindow_UI.h; sourceTree = "<group>"; };
CE97213A1E74E41D00A598C9 /* ResultWindow_UI.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = ResultWindow_UI.m; path = cocoa/autogen/ResultWindow_UI.m; sourceTree = "<group>"; };
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; };
@ -363,6 +377,7 @@
CE1891011E75D5A6008CE1AE /* xib */ = {
isa = PBXGroup;
children = (
CE549CDA1E933C7600C75A05 /* ResultWindow.xib */,
CE0559851E762105008EB4F8 /* IgnoreListDialog.xib */,
);
name = xib;
@ -555,8 +570,6 @@
CE9721361E74E41D00A598C9 /* PyTable.m */,
CE9721371E74E41D00A598C9 /* PyTextField.h */,
CE9721381E74E41D00A598C9 /* PyTextField.m */,
CE9721391E74E41D00A598C9 /* ResultWindow_UI.h */,
CE97213A1E74E41D00A598C9 /* ResultWindow_UI.m */,
CE97213B1E74E41D00A598C9 /* XiblessSupport.h */,
CE97213C1E74E41D00A598C9 /* XiblessSupport.m */,
);
@ -675,6 +688,7 @@
CED88C1F1E763F2700C9B98C /* py in Resources */,
CE05598E1E76217C008EB4F8 /* Localizable.strings in Resources */,
CE65D0ED1E7783C40092126E /* ErrorReportWindow.xib in Resources */,
CE549CDC1E933C7600C75A05 /* ResultWindow.xib in Resources */,
CEFC8A251E74F23000965F37 /* dg_cocoa.py in Resources */,
CE7CA6061E76337700874874 /* about.xib in Resources */,
CE7CA6071E76337700874874 /* cocoalib.strings in Resources */,
@ -692,7 +706,6 @@
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
CE97215E1E74E41D00A598C9 /* ResultWindow_UI.m in Sources */,
CE97213F1E74E41D00A598C9 /* DetailsPanelPicture_UI.m in Sources */,
CE6F7E041E74EA12004C0518 /* HSColumns.m in Sources */,
CE9720ED1E74E40300A598C9 /* DirectoryPanel.m in Sources */,
@ -812,6 +825,29 @@
name = Localizable.strings;
sourceTree = "<group>";
};
CE549CDA1E933C7600C75A05 /* ResultWindow.xib */ = {
isa = PBXVariantGroup;
children = (
CE549CDB1E933C7600C75A05 /* Base */,
CE549CDE1E933D4A00C75A05 /* fr */,
CE549CE01E933D4C00C75A05 /* de */,
CE549CE21E933D4D00C75A05 /* cs */,
CE549CE41E933D4F00C75A05 /* es */,
CE549CE61E933D5000C75A05 /* el */,
CE549CE81E933D5100C75A05 /* it */,
CE549CEA1E933D5300C75A05 /* nl */,
CE549CEC1E933D5500C75A05 /* pl */,
CE549CEE1E933D5700C75A05 /* ko */,
CE549CF01E933D5A00C75A05 /* hy */,
CE549CF21E933D5B00C75A05 /* pt-BR */,
CE549CF41E933D5C00C75A05 /* ru */,
CE549CF61E933D5D00C75A05 /* uk */,
CE549CF81E933D5F00C75A05 /* zh-Hans */,
CE549CFA1E933D6000C75A05 /* vi */,
);
name = ResultWindow.xib;
sourceTree = "<group>";
};
CE65D0CA1E7781640092126E /* progress.xib */ = {
isa = PBXVariantGroup;
children = (