diff --git a/cocoa/base/DirectoryPanel.m b/cocoa/base/DirectoryPanel.m index 9d12f00d..dbe7c45f 100644 --- a/cocoa/base/DirectoryPanel.m +++ b/cocoa/base/DirectoryPanel.m @@ -130,8 +130,10 @@ http://www.hardcoded.net/licenses/bsd_license return; } [removeButton setEnabled:YES]; - NSInteger state = [outline intProperty:@"state" valueAtPath:[outline selectedIndexPath]]; - NSString *imgName = state == 2 ? @"NSGoLeftTemplate" : @"NSRemoveTemplate"; + NSIndexPath *path = [outline selectedIndexPath]; + NSInteger state = [outline intProperty:@"state" valueAtPath:path]; + BOOL shouldDisplayArrow = ([path length] > 1) && (state == 2); + NSString *imgName = shouldDisplayArrow ? @"NSGoLeftTemplate" : @"NSRemoveTemplate"; [removeButton setImage:[NSImage imageNamed:imgName]]; } diff --git a/cocoa/base/en.lproj/DirectoryPanel.xib b/cocoa/base/en.lproj/DirectoryPanel.xib index 44abf14b..8e919204 100644 --- a/cocoa/base/en.lproj/DirectoryPanel.xib +++ b/cocoa/base/en.lproj/DirectoryPanel.xib @@ -2,13 +2,13 @@ 1060 - 11B26 - 1617 - 1138 - 566.00 + 11C74 + 1938 + 1138.23 + 567.00 com.apple.InterfaceBuilder.CocoaPlugin - 1617 + 1938 NSTextField @@ -31,7 +31,10 @@ com.apple.InterfaceBuilder.CocoaPlugin - + + PluginDependencyRecalculationVersion + + DirectoryPanel @@ -233,7 +236,7 @@ 14 - 1379958784 + 1514176512 1 @@ -510,14 +513,6 @@ - - - initialFirstResponder - - - - 19 - window @@ -542,14 +537,6 @@ 54 - - - startScanning: - - - - 60 - removeSelectedDirectory: @@ -590,6 +577,22 @@ 78 + + + startScanning: + + + + 60 + + + + initialFirstResponder + + + + 19 + @@ -1025,6 +1028,17 @@ HSOutlineView NSOutlineView + + copy: + id + + + copy: + + copy: + id + + IBProjectSource ./Classes/HSOutlineView.h @@ -1064,7 +1078,7 @@ com.apple.InterfaceBuilder.CocoaPlugin.macosx - + com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3 diff --git a/core/app.py b/core/app.py index 6e117106..cfd605c1 100644 --- a/core/app.py +++ b/core/app.py @@ -368,9 +368,11 @@ class DupeGuru(RegistrableApplication, Broadcaster): def purge_ignore_list(self): self.scanner.ignore_list.Filter(lambda f,s:op.exists(f) and op.exists(s)) - def remove_directory(self,index): + def remove_directories(self, indexes): try: - del self.directories[index] + indexes = sorted(indexes, reverse=True) + for index in indexes: + del self.directories[index] self.notify('directories_changed') except IndexError: pass diff --git a/core/gui/directory_tree.py b/core/gui/directory_tree.py index ea9bdfb8..6bba4fd6 100644 --- a/core/gui/directory_tree.py +++ b/core/gui/directory_tree.py @@ -77,15 +77,20 @@ class DirectoryTree(GUIObject, Tree): self.app.add_directory(path) def remove_selected(self): - selected_node = self.selected_node - if selected_node is None: + selected_paths = self.selected_paths + if not selected_paths: return - if selected_node.parent is self and selected_node.state != DirectoryState.Excluded: - root_index = self.selected_path[0] - self.app.remove_directory(root_index) + to_delete = [path[0] for path in selected_paths if len(path) == 1] + if to_delete: + self.app.remove_directories(to_delete) else: - newstate = DirectoryState.Normal if selected_node.state == DirectoryState.Excluded else DirectoryState.Excluded - selected_node.state = newstate + # All selected nodes or on second-or-more level, exclude them. + nodes = self.selected_nodes + newstate = DirectoryState.Excluded + if all(node.state == DirectoryState.Excluded for node in nodes): + newstate = DirectoryState.Normal + for node in nodes: + node.state = newstate def update_all_states(self): for node in self: diff --git a/qt/base/directories_dialog.py b/qt/base/directories_dialog.py index 1612fa0b..605b7dc0 100644 --- a/qt/base/directories_dialog.py +++ b/qt/base/directories_dialog.py @@ -108,6 +108,8 @@ class DirectoriesDialog(QMainWindow): self.promptLabel = QLabel(tr("Select folders to scan and press \"Scan\"."), self.centralwidget) self.verticalLayout.addWidget(self.promptLabel) self.treeView = QTreeView(self.centralwidget) + self.treeView.setSelectionMode(QAbstractItemView.ExtendedSelection) + self.treeView.setSelectionBehavior(QAbstractItemView.SelectRows) self.treeView.setAcceptDrops(True) triggers = QAbstractItemView.DoubleClicked|QAbstractItemView.EditKeyPressed\ |QAbstractItemView.SelectedClicked