From 92970489c56eac0a905fac938ab744058798fb32 Mon Sep 17 00:00:00 2001 From: Virgil Dupras Date: Mon, 17 Jan 2011 17:15:16 +0100 Subject: [PATCH] Straightened out actions pictures and keybindings, added a Recent Folders menu and a link to Recent Results menu in a dialog button. --- qt/base/app.py | 6 +-- qt/base/dg.qrc | 6 --- qt/base/directories_dialog.py | 89 ++++++++++++++++++++++------------- qt/base/preferences.py | 3 ++ qt/base/result_window.py | 10 ++-- qt/testapp.py | 4 ++ 6 files changed, 72 insertions(+), 46 deletions(-) diff --git a/qt/base/app.py b/qt/base/app.py index 92e5f3b2..4ca60aae 100644 --- a/qt/base/app.py +++ b/qt/base/app.py @@ -57,6 +57,8 @@ class DupeGuru(DupeGuruBase, QObject): self.prefs = self._create_preferences() self.prefs.load() self._update_options() + self.recentResults = Recent(self, 'recentResults') + self.recentResults.mustOpenItem.connect(self.load_from) self.resultWindow = self._create_result_window() self._progress = Progress(self.resultWindow) self.directories_dialog = DirectoriesDialog(self.resultWindow, self) @@ -65,8 +67,6 @@ class DupeGuru(DupeGuruBase, QObject): self.preferences_dialog = self._create_preferences_dialog(self.resultWindow) self.about_box = AboutBox(self.resultWindow, self) - self.recentResults = Recent(self, self.directories_dialog.menuLoadRecent, 'recentResults') - self.recentResults.mustOpenItem.connect(self.load_from) self.reg = Registration(self) self.set_registration(self.prefs.registration_code, self.prefs.registration_email) @@ -87,7 +87,7 @@ class DupeGuru(DupeGuruBase, QObject): # (name, shortcut, icon, desc, func) ACTIONS = [ ('actionQuit', 'Ctrl+Q', '', "Quit", self.quitTriggered), - ('actionPreferences', 'Ctrl+5', 'preferences', "Preferences", self.preferencesTriggered), + ('actionPreferences', 'Ctrl+P', '', "Preferences", self.preferencesTriggered), ('actionShowHelp', 'F1', '', "dupeGuru Help", self.showHelpTriggered), ('actionAbout', '', '', "About dupeGuru", self.showAboutBoxTriggered), ('actionRegister', '', '', "Register dupeGuru", self.registerTriggered), diff --git a/qt/base/dg.qrc b/qt/base/dg.qrc index 5c689656..52a56271 100644 --- a/qt/base/dg.qrc +++ b/qt/base/dg.qrc @@ -1,16 +1,10 @@ - ../../images/details32.png ../../images/dgpe_logo_32.png ../../images/dgpe_logo_128.png ../../images/dgme_logo_32.png ../../images/dgme_logo_128.png ../../images/dgse_logo_32.png ../../images/dgse_logo_128.png - ../../images/folderwin32.png - ../../images/preferences32.png - ../../images/actions32.png - ../../images/delta32.png - ../../images/power_marker32.png \ No newline at end of file diff --git a/qt/base/directories_dialog.py b/qt/base/directories_dialog.py index 07c65e89..fb5157cf 100644 --- a/qt/base/directories_dialog.py +++ b/qt/base/directories_dialog.py @@ -11,6 +11,7 @@ from PyQt4.QtGui import (QWidget, QFileDialog, QHeaderView, QVBoxLayout, QHBoxLa QAbstractItemView, QSpacerItem, QSizePolicy, QPushButton, QApplication, QMessageBox, QMainWindow, QMenuBar, QMenu) +from qtlib.recent import Recent from core.app import NoScannableFileError from . import platform @@ -22,22 +23,35 @@ class DirectoriesDialog(QMainWindow): QMainWindow.__init__(self, None) self.app = app self.lastAddedFolder = platform.INITIAL_FOLDER_IN_DIALOGS + self.recentFolders = Recent(self.app, 'recentFolders') self.directoriesModel = DirectoriesModel(self.app) self.directoriesDelegate = DirectoriesDelegate() self._setupUi() + self.app.recentResults.addMenu(self.menuLoadRecent) + self.app.recentResults.addMenu(self.menuRecentResults) + self.recentFolders.addMenu(self.menuRecentFolders) + self._updateAddButton() self._updateRemoveButton() - - self.scanButton.clicked.connect(self.scanButtonClicked) - self.addButton.clicked.connect(self.addButtonClicked) - self.removeButton.clicked.connect(self.removeButtonClicked) - self.treeView.selectionModel().selectionChanged.connect(self.selectionChanged) - self.app.willSavePrefs.connect(self.appWillSavePrefs) + self._updateLoadResultsButton() + self._setupBindings() + def _setupBindings(self): + self.scanButton.clicked.connect(self.scanButtonClicked) + self.loadResultsButton.clicked.connect(self.actionLoadResults.trigger) + self.addFolderButton.clicked.connect(self.actionAddFolder.trigger) + self.removeFolderButton.clicked.connect(self.removeFolderButtonClicked) + self.treeView.selectionModel().selectionChanged.connect(self.selectionChanged) + self.app.recentResults.itemsChanged.connect(self._updateLoadResultsButton) + self.recentFolders.itemsChanged.connect(self._updateAddButton) + self.recentFolders.mustOpenItem.connect(self.app.add_directory) + self.app.willSavePrefs.connect(self.appWillSavePrefs) + def _setupActions(self): # (name, shortcut, icon, desc, func) ACTIONS = [ ('actionLoadResults', 'Ctrl+L', '', "Load Results...", self.loadResultsTriggered), ('actionShowResultsWindow', '', '', "Results Window", self.app.showResultsWindow), + ('actionAddFolder', '', '', "Add Folder...", self.addFolderTriggered), ] createActions(ACTIONS, self) @@ -69,6 +83,16 @@ class DirectoriesDialog(QMainWindow): self.menubar.addAction(self.menuFile.menuAction()) self.menubar.addAction(self.menuView.menuAction()) self.menubar.addAction(self.menuHelp.menuAction()) + + # Recent folders menu + self.menuRecentFolders = QMenu() + self.menuRecentFolders.addAction(self.actionAddFolder) + self.menuRecentFolders.addSeparator() + + # Recent results menu + self.menuRecentResults = QMenu() + self.menuRecentResults.addAction(self.actionLoadResults) + self.menuRecentResults.addSeparator() def _setupUi(self): self.setWindowTitle(self.app.NAME) @@ -92,30 +116,18 @@ class DirectoriesDialog(QMainWindow): header.resizeSection(1, 100) self.verticalLayout.addWidget(self.treeView) self.horizontalLayout = QHBoxLayout() - spacerItem = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum) - self.horizontalLayout.addItem(spacerItem) - self.removeButton = QPushButton(self.centralwidget) - self.removeButton.setText("Remove") - self.removeButton.setShortcut("Del") - self.removeButton.setMinimumSize(QSize(91, 0)) - self.removeButton.setMaximumSize(QSize(16777215, 32)) - self.horizontalLayout.addWidget(self.removeButton) - self.addButton = QPushButton(self.centralwidget) - self.addButton.setText("Add") - self.addButton.setMinimumSize(QSize(91, 0)) - self.addButton.setMaximumSize(QSize(16777215, 32)) - self.horizontalLayout.addWidget(self.addButton) - spacerItem1 = QSpacerItem(40, 20, QSizePolicy.Fixed, QSizePolicy.Minimum) + self.removeFolderButton = QPushButton("Remove", self.centralwidget) + self.removeFolderButton.setShortcut("Del") + self.horizontalLayout.addWidget(self.removeFolderButton) + self.addFolderButton = QPushButton("Add", self.centralwidget) + self.horizontalLayout.addWidget(self.addFolderButton) + spacerItem1 = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum) self.horizontalLayout.addItem(spacerItem1) + self.loadResultsButton = QPushButton(self.centralwidget) + self.loadResultsButton.setText("Load Results") + self.horizontalLayout.addWidget(self.loadResultsButton) self.scanButton = QPushButton(self.centralwidget) self.scanButton.setText("Scan") - sizePolicy = QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed) - sizePolicy.setHorizontalStretch(0) - sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.scanButton.sizePolicy().hasHeightForWidth()) - self.scanButton.setSizePolicy(sizePolicy) - self.scanButton.setMinimumSize(QSize(91, 0)) - self.scanButton.setMaximumSize(QSize(16777215, 32)) self.scanButton.setDefault(True) self.horizontalLayout.addWidget(self.scanButton) self.verticalLayout.addLayout(self.horizontalLayout) @@ -123,20 +135,32 @@ class DirectoriesDialog(QMainWindow): self._setupActions() self._setupMenu() - + if self.app.prefs.directoriesWindowRect is not None: self.setGeometry(self.app.prefs.directoriesWindowRect) + def _updateAddButton(self): + if self.recentFolders.isEmpty(): + self.addFolderButton.setMenu(None) + else: + self.addFolderButton.setMenu(self.menuRecentFolders) + def _updateRemoveButton(self): indexes = self.treeView.selectedIndexes() if not indexes: - self.removeButton.setEnabled(False) + self.removeFolderButton.setEnabled(False) return - self.removeButton.setEnabled(True) + self.removeFolderButton.setEnabled(True) index = indexes[0] node = index.internalPointer() # label = 'Remove' if node.parent is None else 'Exclude' + def _updateLoadResultsButton(self): + if self.app.recentResults.isEmpty(): + self.loadResultsButton.setMenu(None) + else: + self.loadResultsButton.setMenu(self.menuRecentResults) + #--- QWidget overrides def closeEvent(self, event): event.accept() @@ -149,7 +173,7 @@ class DirectoriesDialog(QMainWindow): QApplication.quit() #--- Events - def addButtonClicked(self): + def addFolderTriggered(self): title = "Select a directory to add to the scanning list" flags = QFileDialog.ShowDirsOnly dirpath = str(QFileDialog.getExistingDirectory(self, title, self.lastAddedFolder, flags)) @@ -157,6 +181,7 @@ class DirectoriesDialog(QMainWindow): return self.lastAddedFolder = dirpath self.app.add_directory(dirpath) + self.recentFolders.insertItem(dirpath) def appWillSavePrefs(self): self.app.prefs.directoriesWindowRect = self.geometry() @@ -169,7 +194,7 @@ class DirectoriesDialog(QMainWindow): self.app.load_from(destination) self.app.recentResults.insertItem(destination) - def removeButtonClicked(self): + def removeFolderButtonClicked(self): indexes = self.treeView.selectedIndexes() if not indexes: return diff --git a/qt/base/preferences.py b/qt/base/preferences.py index 9fd4f8f3..2fecf619 100644 --- a/qt/base/preferences.py +++ b/qt/base/preferences.py @@ -41,6 +41,7 @@ class Preferences(PreferencesBase): self.detailsWindowRect = self.get_rect('DetailsWindowRect', self.detailsWindowRect) self.directoriesWindowRect = self.get_rect('DirectoriesWindowRect', self.directoriesWindowRect) self.recentResults = get('RecentResults', self.recentResults) + self.recentFolders = get('RecentFolders', self.recentFolders) self.registration_code = get('RegistrationCode', self.registration_code) self.registration_email = get('RegistrationEmail', self.registration_email) @@ -64,6 +65,7 @@ class Preferences(PreferencesBase): self.detailsWindowRect = None self.directoriesWindowRect = None self.recentResults = [] + self.recentFolders = [] self.registration_code = '' self.registration_email = '' @@ -94,6 +96,7 @@ class Preferences(PreferencesBase): self.set_rect('DetailsWindowRect', self.detailsWindowRect) self.set_rect('DirectoriesWindowRect', self.directoriesWindowRect) set_('RecentResults', self.recentResults) + set_('RecentFolders', self.recentFolders) set_('RegistrationCode', self.registration_code) set_('RegistrationEmail', self.registration_email) diff --git a/qt/base/result_window.py b/qt/base/result_window.py index b982cda2..d9bff036 100644 --- a/qt/base/result_window.py +++ b/qt/base/result_window.py @@ -38,10 +38,10 @@ class ResultWindow(QMainWindow): def _setupActions(self): # (name, shortcut, icon, desc, func) ACTIONS = [ - ('actionDetails', 'Ctrl+3', 'details', "Details", self.detailsTriggered), - ('actionActions', '', 'actions', "Actions", self.actionsTriggered), - ('actionDelta', 'Ctrl+2', 'delta', "Delta Values", self.deltaTriggered), - ('actionPowerMarker', 'Ctrl+1', 'power_marker', "Power Marker", self.powerMarkerTriggered), + ('actionDetails', 'Ctrl+I', '', "Details", self.detailsTriggered), + ('actionActions', '', '', "Actions", self.actionsTriggered), + ('actionDelta', 'Ctrl+2', '', "Delta Values", self.deltaTriggered), + ('actionPowerMarker', 'Ctrl+1', '', "Power Marker", self.powerMarkerTriggered), ('actionDeleteMarked', 'Ctrl+D', '', "Send Marked to Recycle Bin", self.deleteTriggered), ('actionHardlinkMarked', 'Ctrl+Shift+D', '', "Delete Marked and Replace with Hardlinks", self.hardlinkTriggered), ('actionMoveMarked', 'Ctrl+M', '', "Move Marked to...", self.moveTriggered), @@ -62,7 +62,7 @@ class ResultWindow(QMainWindow): ('actionCancelFilter', 'Ctrl+Shift+F', '', "Cancel Filter", self.cancelFilterTriggered), ('actionExport', '', '', "Export To HTML", self.exportTriggered), ('actionSaveResults', 'Ctrl+S', '', "Save Results...", self.saveResultsTriggered), - ('actionInvokeCustomCommand', 'Ctrl+I', '', "Invoke Custom Command", self.app.invokeCustomCommand), + ('actionInvokeCustomCommand', 'Ctrl+Alt+I', '', "Invoke Custom Command", self.app.invokeCustomCommand), ] createActions(ACTIONS, self) self.actionDelta.setCheckable(True) diff --git a/qt/testapp.py b/qt/testapp.py index 722beb06..61112d71 100644 --- a/qt/testapp.py +++ b/qt/testapp.py @@ -7,6 +7,8 @@ # which should be included with this package. The terms are also available at # http://www.hardcoded.net/licenses/hs_license +from qtlib.recent import Recent + from .se.app import DupeGuru class TestApp(DupeGuru): @@ -17,4 +19,6 @@ class TestApp(DupeGuru): def _setup(self): self.prefs = self._create_preferences() self.prefs.load() + self.recentResults = Recent(self, 'recentResults') + self._setupActions()