]> granicus.if.org Git - handbrake/commitdiff
MacGui: change the title selection sheet to use a view-based table view.
authorDamiano Galassi <damiog@gmail.com>
Sun, 25 Oct 2015 06:03:36 +0000 (07:03 +0100)
committerDamiano Galassi <damiog@gmail.com>
Sun, 25 Oct 2015 06:03:36 +0000 (07:03 +0100)
macosx/English.lproj/HBTitleSelection.xib
macosx/HBTitleSelectionController.h
macosx/HBTitleSelectionController.m

index 4a6040c1cd937886735c7f179614041ad69694fb..f0134e6b39cca2842a362bb7e27dbe78d069a4c8 100644 (file)
@@ -1,9 +1,9 @@
 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="8164.2" systemVersion="15A225f" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none">
+<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="9059" systemVersion="15B42" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none">
     <dependencies>
         <deployment identifier="macosx"/>
         <development version="6300" identifier="xcode"/>
-        <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="8164.2"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="9059"/>
     </dependencies>
     <objects>
         <customObject id="-2" userLabel="File's Owner" customClass="HBTitleSelectionController">
                 <outlet property="window" destination="F0z-JX-Cv5" id="gIp-Ho-8D9"/>
             </connections>
         </customObject>
+        <arrayController id="Btd-Nt-z41" userLabel="Titles Array Controller">
+            <connections>
+                <binding destination="-2" name="contentArray" keyPath="self.titles" id="ujR-MW-HYh"/>
+            </connections>
+        </arrayController>
         <customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
         <customObject id="-3" userLabel="Application" customClass="NSObject"/>
         <window title="Window" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" restorable="NO" oneShot="NO" releasedWhenClosed="NO" visibleAtLaunch="NO" animationBehavior="default" id="F0z-JX-Cv5">
                 <rect key="frame" x="0.0" y="0.0" width="504" height="250"/>
                 <autoresizingMask key="autoresizingMask"/>
                 <subviews>
+                    <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" id="5Jw-On-iU3">
+                        <rect key="frame" x="18" y="216" width="263" height="14"/>
+                        <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
+                        <animations/>
+                        <textFieldCell key="cell" controlSize="small" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Select the titles to add to the queue:" id="5tD-fg-g4t">
+                            <font key="font" metaFont="smallSystemBold"/>
+                            <color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
+                            <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
+                        </textFieldCell>
+                    </textField>
+                    <button verticalHuggingPriority="750" id="TFh-c7-W2w">
+                        <rect key="frame" x="425" y="14" width="64" height="28"/>
+                        <autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxY="YES"/>
+                        <animations/>
+                        <buttonCell key="cell" type="push" title="Add" bezelStyle="rounded" alignment="center" controlSize="small" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="mOe-XL-tl1">
+                            <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
+                            <font key="font" metaFont="smallSystem"/>
+                            <string key="keyEquivalent" base64-UTF8="YES">
+DQ
+</string>
+                        </buttonCell>
+                        <connections>
+                            <action selector="add:" target="-2" id="3wk-rU-eSZ"/>
+                        </connections>
+                    </button>
+                    <button verticalHuggingPriority="750" id="t5w-9e-K60">
+                        <rect key="frame" x="342" y="14" width="81" height="28"/>
+                        <autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxY="YES"/>
+                        <animations/>
+                        <buttonCell key="cell" type="push" title="Cancel" bezelStyle="rounded" alignment="center" controlSize="small" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="jHg-nh-9NJ">
+                            <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
+                            <font key="font" metaFont="smallSystem"/>
+                            <string key="keyEquivalent" base64-UTF8="YES">
+Gw
+</string>
+                        </buttonCell>
+                        <connections>
+                            <action selector="cancel:" target="-2" id="DP7-vq-pVX"/>
+                        </connections>
+                    </button>
                     <scrollView autohidesScrollers="YES" horizontalLineScroll="18" horizontalPageScroll="10" verticalLineScroll="18" verticalPageScroll="10" usesPredominantAxisScrolling="NO" id="a1K-L9-fU9">
                         <rect key="frame" x="20" y="57" width="464" height="151"/>
                         <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
@@ -30,8 +75,8 @@
                             <rect key="frame" x="1" y="0.0" width="238" height="134"/>
                             <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
                             <subviews>
-                                <tableView verticalHuggingPriority="750" allowsExpansionToolTips="YES" alternatingRowBackgroundColors="YES" columnReordering="NO" columnSelection="YES" columnResizing="NO" multipleSelection="NO" autosaveColumns="NO" rowHeight="14" id="wM9-Ln-dr0">
-                                    <rect key="frame" x="0.0" y="0.0" width="462" height="18"/>
+                                <tableView verticalHuggingPriority="750" allowsExpansionToolTips="YES" alternatingRowBackgroundColors="YES" columnReordering="NO" columnSelection="YES" columnResizing="NO" multipleSelection="NO" autosaveColumns="NO" rowHeight="14" viewBased="YES" id="wM9-Ln-dr0">
+                                    <rect key="frame" x="0.0" y="0.0" width="462" height="0.0"/>
                                     <autoresizingMask key="autoresizingMask"/>
                                     <animations/>
                                     <size key="intercellSpacing" width="3" height="4"/>
                                                 <color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
                                             </textFieldCell>
                                             <tableColumnResizingMask key="resizingMask" resizeWithTable="YES" userResizable="YES"/>
+                                            <prototypeCellViews>
+                                                <tableCellView id="6H6-2e-RPZ">
+                                                    <rect key="frame" x="1" y="2" width="30" height="15"/>
+                                                    <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+                                                    <subviews>
+                                                        <textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" id="gLJ-VQ-3cg">
+                                                            <rect key="frame" x="0.0" y="1" width="29" height="14"/>
+                                                            <autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
+                                                            <animations/>
+                                                            <textFieldCell key="cell" controlSize="small" lineBreakMode="truncatingTail" sendsActionOnEndEditing="YES" alignment="right" title="0" id="hQc-RA-phB">
+                                                                <font key="font" metaFont="smallSystem"/>
+                                                                <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
+                                                                <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
+                                                            </textFieldCell>
+                                                            <connections>
+                                                                <binding destination="6H6-2e-RPZ" name="value" keyPath="objectValue.title.index" id="bD2-qX-18u"/>
+                                                            </connections>
+                                                        </textField>
+                                                    </subviews>
+                                                    <animations/>
+                                                    <connections>
+                                                        <outlet property="textField" destination="gLJ-VQ-3cg" id="0FP-jj-mZ3"/>
+                                                    </connections>
+                                                </tableCellView>
+                                            </prototypeCellViews>
                                         </tableColumn>
                                         <tableColumn identifier="title" width="333" minWidth="40" maxWidth="2000" id="FQY-Ye-g0f">
                                             <tableHeaderCell key="headerCell" lineBreakMode="truncatingTail" borderStyle="border" alignment="left">
                                                 <font key="font" metaFont="smallSystem"/>
                                             </buttonCell>
                                             <tableColumnResizingMask key="resizingMask" resizeWithTable="YES" userResizable="YES"/>
+                                            <prototypeCellViews>
+                                                <tableCellView id="Sil-eA-Flj">
+                                                    <rect key="frame" x="34" y="2" width="333" height="15"/>
+                                                    <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+                                                    <subviews>
+                                                        <button id="LSj-el-4SZ">
+                                                            <rect key="frame" x="0.0" y="-2" width="332" height="20"/>
+                                                            <autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
+                                                            <animations/>
+                                                            <buttonCell key="cell" type="check" title="Check" bezelStyle="regularSquare" imagePosition="left" controlSize="small" state="on" inset="2" id="JqJ-5C-Yhw">
+                                                                <behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
+                                                                <font key="font" metaFont="smallSystem"/>
+                                                            </buttonCell>
+                                                            <connections>
+                                                                <binding destination="Sil-eA-Flj" name="value" keyPath="objectValue.selected" id="DB2-Lb-KSc"/>
+                                                                <binding destination="Sil-eA-Flj" name="title" keyPath="objectValue.title.name" id="Iph-ut-pMv"/>
+                                                            </connections>
+                                                        </button>
+                                                    </subviews>
+                                                    <animations/>
+                                                </tableCellView>
+                                            </prototypeCellViews>
                                         </tableColumn>
                                         <tableColumn identifier="duration" width="90" minWidth="90" maxWidth="90" id="a6r-ky-REh">
                                             <tableHeaderCell key="headerCell" lineBreakMode="truncatingTail" borderStyle="border" alignment="left">
                                                 <color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
                                             </textFieldCell>
                                             <tableColumnResizingMask key="resizingMask" resizeWithTable="YES" userResizable="YES"/>
+                                            <prototypeCellViews>
+                                                <tableCellView id="eNN-Bb-hW0">
+                                                    <rect key="frame" x="370" y="2" width="90" height="15"/>
+                                                    <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+                                                    <subviews>
+                                                        <textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" id="dTs-ND-Vgf">
+                                                            <rect key="frame" x="0.0" y="1" width="90" height="14"/>
+                                                            <autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
+                                                            <animations/>
+                                                            <textFieldCell key="cell" controlSize="small" lineBreakMode="truncatingTail" sendsActionOnEndEditing="YES" title="Table View Cell" id="dsG-Ho-vsT">
+                                                                <font key="font" metaFont="smallSystem"/>
+                                                                <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
+                                                                <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
+                                                            </textFieldCell>
+                                                            <connections>
+                                                                <binding destination="eNN-Bb-hW0" name="value" keyPath="objectValue.title.timeCode" id="rtf-VT-Ibw"/>
+                                                            </connections>
+                                                        </textField>
+                                                    </subviews>
+                                                    <animations/>
+                                                    <connections>
+                                                        <outlet property="textField" destination="dTs-ND-Vgf" id="XHC-5X-yGo"/>
+                                                    </connections>
+                                                </tableCellView>
+                                            </prototypeCellViews>
                                         </tableColumn>
                                     </tableColumns>
                                     <connections>
-                                        <outlet property="dataSource" destination="-2" id="bFm-Ca-P9Y"/>
-                                        <outlet property="delegate" destination="-2" id="jJ2-f7-lui"/>
+                                        <binding destination="Btd-Nt-z41" name="content" keyPath="arrangedObjects" id="Yyh-f8-EYR"/>
+                                        <outlet property="menu" destination="vdO-DI-vks" id="Iux-VV-EDo"/>
                                     </connections>
                                 </tableView>
                             </subviews>
                             <color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
                         </clipView>
                         <animations/>
-                        <scroller key="horizontalScroller" hidden="YES" wantsLayer="YES" verticalHuggingPriority="750" horizontal="YES" id="KUp-wz-bHB">
+                        <scroller key="horizontalScroller" hidden="YES" verticalHuggingPriority="750" horizontal="YES" id="KUp-wz-bHB">
                             <rect key="frame" x="1" y="119" width="223" height="15"/>
                             <autoresizingMask key="autoresizingMask"/>
                             <animations/>
                         </scroller>
-                        <scroller key="verticalScroller" hidden="YES" wantsLayer="YES" verticalHuggingPriority="750" doubleValue="1" horizontal="NO" id="iFv-s2-21F">
+                        <scroller key="verticalScroller" hidden="YES" verticalHuggingPriority="750" doubleValue="1" horizontal="NO" id="iFv-s2-21F">
                             <rect key="frame" x="224" y="17" width="15" height="102"/>
                             <autoresizingMask key="autoresizingMask"/>
                             <animations/>
                         </scroller>
                     </scrollView>
-                    <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" id="5Jw-On-iU3">
-                        <rect key="frame" x="18" y="216" width="263" height="14"/>
-                        <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
-                        <animations/>
-                        <textFieldCell key="cell" controlSize="small" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Select the titles to add to the queue:" id="5tD-fg-g4t">
-                            <font key="font" metaFont="smallSystemBold"/>
-                            <color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
-                            <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
-                        </textFieldCell>
-                    </textField>
-                    <button verticalHuggingPriority="750" id="TFh-c7-W2w">
-                        <rect key="frame" x="425" y="14" width="64" height="28"/>
-                        <autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxY="YES"/>
-                        <animations/>
-                        <buttonCell key="cell" type="push" title="Add" bezelStyle="rounded" alignment="center" controlSize="small" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="mOe-XL-tl1">
-                            <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
-                            <font key="font" metaFont="smallSystem"/>
-                            <string key="keyEquivalent" base64-UTF8="YES">
-DQ
-</string>
-                        </buttonCell>
-                        <connections>
-                            <action selector="add:" target="-2" id="3wk-rU-eSZ"/>
-                        </connections>
-                    </button>
-                    <button verticalHuggingPriority="750" id="t5w-9e-K60">
-                        <rect key="frame" x="342" y="14" width="81" height="28"/>
-                        <autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxY="YES"/>
-                        <animations/>
-                        <buttonCell key="cell" type="push" title="Cancel" bezelStyle="rounded" alignment="center" controlSize="small" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="jHg-nh-9NJ">
-                            <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
-                            <font key="font" metaFont="smallSystem"/>
-                            <string key="keyEquivalent" base64-UTF8="YES">
-Gw
-</string>
-                        </buttonCell>
-                        <connections>
-                            <action selector="cancel:" target="-2" id="DP7-vq-pVX"/>
-                        </connections>
-                    </button>
                 </subviews>
                 <animations/>
             </view>
@@ -147,5 +224,15 @@ Gw
             </connections>
             <point key="canvasLocation" x="501" y="-14"/>
         </window>
+        <menu id="vdO-DI-vks">
+            <items>
+                <menuItem title="Deselect All" id="PXF-7D-BKR">
+                    <modifierMask key="keyEquivalentModifierMask"/>
+                    <connections>
+                        <action selector="deselectAll:" target="-2" id="Sxn-Dj-lrs"/>
+                    </connections>
+                </menuItem>
+            </items>
+        </menu>
     </objects>
 </document>
index 2263403475cd96ba9535925357f9d5d5d727d3f2..8aa7e33ebd19373108af1cdea863f2efa4d86136 100644 (file)
@@ -8,6 +8,8 @@
 
 NS_ASSUME_NONNULL_BEGIN
 
+@class HBTitle;
+
 @protocol HBTitleSelectionDelegate <NSObject>
 
 - (void)didSelectIndexes:(NSIndexSet *)indexes;
@@ -16,7 +18,7 @@ NS_ASSUME_NONNULL_BEGIN
 
 @interface HBTitleSelectionController : NSWindowController
 
-- (instancetype)initWithTitles:(NSArray *)titles delegate:(id<HBTitleSelectionDelegate>)delegate;
+- (instancetype)initWithTitles:(NSArray<HBTitle *> *)titles delegate:(id<HBTitleSelectionDelegate>)delegate;
 
 @end
 
index 7575eb74a1548580db8e43b1d503c055ccb45541..7e9ea0af0aedfa0175afe98efe80312834ae1652 100644 (file)
@@ -7,11 +7,37 @@
 #import "HBTitleSelectionController.h"
 #import "HBTitle.h"
 
-@interface HBTitleSelectionController () <NSTableViewDataSource, NSTableViewDelegate>
+@interface HBTitleSelection : NSObject
+@property (nonatomic, readonly) HBTitle *title;
+@property (nonatomic, readonly) BOOL selected;
+@property (nonatomic, readonly, assign) NSUndoManager *undo;
+@end
+
+@implementation HBTitleSelection
+- (instancetype)initWithTitle:(HBTitle *)title undo:(NSUndoManager *)undo
+{
+    if (self = [super init])
+    {
+        _title = title;
+        _selected = YES;
+        _undo = undo;
+    }
+    return self;
+}
+
+- (void)setSelected:(BOOL)selected
+{
+    if (selected != _selected)
+    {
+        [[self.undo prepareWithInvocationTarget:self] setSelected:_selected];
+    }
+    _selected = selected;
+}
+@end
 
-@property (nonatomic, readonly) NSArray *titles;
-@property (nonatomic, readonly) NSMutableArray *selection;
+@interface HBTitleSelectionController () <NSTableViewDataSource, NSTableViewDelegate>
 
+@property (nonatomic, readwrite) NSArray<HBTitleSelection *> *titles;
 @property (nonatomic, readonly, assign) id<HBTitleSelectionDelegate> delegate;
 
 @end
     self = [super initWithWindowNibName:@"HBTitleSelection"];
     if (self)
     {
-        _titles = titles;
-        _selection = [[NSMutableArray alloc] initWithCapacity:titles.count];
         _delegate = delegate;
 
-        for (NSUInteger i = 0; i < titles.count; i++)
+        NSMutableArray<HBTitleSelection *> *array = [[NSMutableArray alloc] init];
+        for (HBTitle *title in titles)
         {
-            _selection[i] = @YES;
+            [array addObject:[[HBTitleSelection alloc] initWithTitle:title undo:self.window.undoManager]];
         }
+        self.titles = [array copy];
     }
 
     return self;
 }
 
-- (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView
-{
-    return self.titles.count;
-}
-
-- (id)tableView:(NSTableView *)tableView objectValueForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row
+- (IBAction)deselectAll:(id)sender
 {
-    HBTitle *title = self.titles[row];
-
-    if ([tableColumn.identifier isEqualTo:@"index"])
-    {
-        return @(title.index);
-    }
-    else if ([tableColumn.identifier isEqualTo:@"title"])
-    {
-        return self.selection[row];
-    }
-    else if ([tableColumn.identifier isEqualTo:@"duration"])
+    for (HBTitleSelection *title in self.titles)
     {
-        return title.timeCode;
-    }
-
-    return nil;
-}
-
-- (void)tableView:(NSTableView *)tableView setObjectValue:(id)object forTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row;
-{
-    if ([tableColumn.identifier isEqualTo:@"title"])
-    {
-        self.selection[row] = object;
-    }
-}
-
-- (void)tableView:(NSTableView *)aTableView willDisplayCell:(id)aCell forTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row
-{
-    if ([tableColumn.identifier isEqualTo:@"title"])
-    {
-        HBTitle *title = self.titles[row];
-        [aCell setTitle:title.name];
+        title.selected = NO;
     }
 }
 
 {
     NSMutableIndexSet *indexes = [NSMutableIndexSet indexSet];
 
-    [self.selection enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
-        if ([obj boolValue])
+    [self.titles enumerateObjectsUsingBlock:^(HBTitleSelection *obj, NSUInteger idx, BOOL *stop) {
+        if (obj.selected)
         {
-            HBTitle *title = self.titles[idx];
-            [indexes addIndex:title.index];
+            [indexes addIndex:obj.title.index];
         }
-
     }];
     [self.delegate didSelectIndexes:indexes];
 }