Straightened out actions pictures and keybindings, added a Recent Folders menu and a link to Recent Results menu in a dialog button.

This commit is contained in:
Virgil Dupras 2011-01-17 17:15:16 +01:00
parent d51f5184d7
commit 92970489c5
6 changed files with 72 additions and 46 deletions

View File

@ -57,6 +57,8 @@ class DupeGuru(DupeGuruBase, QObject):
self.prefs = self._create_preferences() self.prefs = self._create_preferences()
self.prefs.load() self.prefs.load()
self._update_options() self._update_options()
self.recentResults = Recent(self, 'recentResults')
self.recentResults.mustOpenItem.connect(self.load_from)
self.resultWindow = self._create_result_window() self.resultWindow = self._create_result_window()
self._progress = Progress(self.resultWindow) self._progress = Progress(self.resultWindow)
self.directories_dialog = DirectoriesDialog(self.resultWindow, self) 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.preferences_dialog = self._create_preferences_dialog(self.resultWindow)
self.about_box = AboutBox(self.resultWindow, self) 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.reg = Registration(self)
self.set_registration(self.prefs.registration_code, self.prefs.registration_email) self.set_registration(self.prefs.registration_code, self.prefs.registration_email)
@ -87,7 +87,7 @@ class DupeGuru(DupeGuruBase, QObject):
# (name, shortcut, icon, desc, func) # (name, shortcut, icon, desc, func)
ACTIONS = [ ACTIONS = [
('actionQuit', 'Ctrl+Q', '', "Quit", self.quitTriggered), ('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), ('actionShowHelp', 'F1', '', "dupeGuru Help", self.showHelpTriggered),
('actionAbout', '', '', "About dupeGuru", self.showAboutBoxTriggered), ('actionAbout', '', '', "About dupeGuru", self.showAboutBoxTriggered),
('actionRegister', '', '', "Register dupeGuru", self.registerTriggered), ('actionRegister', '', '', "Register dupeGuru", self.registerTriggered),

View File

@ -1,16 +1,10 @@
<!DOCTYPE RCC><RCC version="1.0"> <!DOCTYPE RCC><RCC version="1.0">
<qresource> <qresource>
<file alias="details">../../images/details32.png</file>
<file alias="logo_pe">../../images/dgpe_logo_32.png</file> <file alias="logo_pe">../../images/dgpe_logo_32.png</file>
<file alias="logo_pe_big">../../images/dgpe_logo_128.png</file> <file alias="logo_pe_big">../../images/dgpe_logo_128.png</file>
<file alias="logo_me">../../images/dgme_logo_32.png</file> <file alias="logo_me">../../images/dgme_logo_32.png</file>
<file alias="logo_me_big">../../images/dgme_logo_128.png</file> <file alias="logo_me_big">../../images/dgme_logo_128.png</file>
<file alias="logo_se">../../images/dgse_logo_32.png</file> <file alias="logo_se">../../images/dgse_logo_32.png</file>
<file alias="logo_se_big">../../images/dgse_logo_128.png</file> <file alias="logo_se_big">../../images/dgse_logo_128.png</file>
<file alias="folder">../../images/folderwin32.png</file>
<file alias="preferences">../../images/preferences32.png</file>
<file alias="actions">../../images/actions32.png</file>
<file alias="delta">../../images/delta32.png</file>
<file alias="power_marker">../../images/power_marker32.png</file>
</qresource> </qresource>
</RCC> </RCC>

View File

@ -11,6 +11,7 @@ from PyQt4.QtGui import (QWidget, QFileDialog, QHeaderView, QVBoxLayout, QHBoxLa
QAbstractItemView, QSpacerItem, QSizePolicy, QPushButton, QApplication, QMessageBox, QMainWindow, QAbstractItemView, QSpacerItem, QSizePolicy, QPushButton, QApplication, QMessageBox, QMainWindow,
QMenuBar, QMenu) QMenuBar, QMenu)
from qtlib.recent import Recent
from core.app import NoScannableFileError from core.app import NoScannableFileError
from . import platform from . import platform
@ -22,22 +23,35 @@ class DirectoriesDialog(QMainWindow):
QMainWindow.__init__(self, None) QMainWindow.__init__(self, None)
self.app = app self.app = app
self.lastAddedFolder = platform.INITIAL_FOLDER_IN_DIALOGS self.lastAddedFolder = platform.INITIAL_FOLDER_IN_DIALOGS
self.recentFolders = Recent(self.app, 'recentFolders')
self.directoriesModel = DirectoriesModel(self.app) self.directoriesModel = DirectoriesModel(self.app)
self.directoriesDelegate = DirectoriesDelegate() self.directoriesDelegate = DirectoriesDelegate()
self._setupUi() self._setupUi()
self.app.recentResults.addMenu(self.menuLoadRecent)
self.app.recentResults.addMenu(self.menuRecentResults)
self.recentFolders.addMenu(self.menuRecentFolders)
self._updateAddButton()
self._updateRemoveButton() self._updateRemoveButton()
self._updateLoadResultsButton()
self.scanButton.clicked.connect(self.scanButtonClicked) self._setupBindings()
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)
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): def _setupActions(self):
# (name, shortcut, icon, desc, func) # (name, shortcut, icon, desc, func)
ACTIONS = [ ACTIONS = [
('actionLoadResults', 'Ctrl+L', '', "Load Results...", self.loadResultsTriggered), ('actionLoadResults', 'Ctrl+L', '', "Load Results...", self.loadResultsTriggered),
('actionShowResultsWindow', '', '', "Results Window", self.app.showResultsWindow), ('actionShowResultsWindow', '', '', "Results Window", self.app.showResultsWindow),
('actionAddFolder', '', '', "Add Folder...", self.addFolderTriggered),
] ]
createActions(ACTIONS, self) createActions(ACTIONS, self)
@ -69,6 +83,16 @@ class DirectoriesDialog(QMainWindow):
self.menubar.addAction(self.menuFile.menuAction()) self.menubar.addAction(self.menuFile.menuAction())
self.menubar.addAction(self.menuView.menuAction()) self.menubar.addAction(self.menuView.menuAction())
self.menubar.addAction(self.menuHelp.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): def _setupUi(self):
self.setWindowTitle(self.app.NAME) self.setWindowTitle(self.app.NAME)
@ -92,30 +116,18 @@ class DirectoriesDialog(QMainWindow):
header.resizeSection(1, 100) header.resizeSection(1, 100)
self.verticalLayout.addWidget(self.treeView) self.verticalLayout.addWidget(self.treeView)
self.horizontalLayout = QHBoxLayout() self.horizontalLayout = QHBoxLayout()
spacerItem = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum) self.removeFolderButton = QPushButton("Remove", self.centralwidget)
self.horizontalLayout.addItem(spacerItem) self.removeFolderButton.setShortcut("Del")
self.removeButton = QPushButton(self.centralwidget) self.horizontalLayout.addWidget(self.removeFolderButton)
self.removeButton.setText("Remove") self.addFolderButton = QPushButton("Add", self.centralwidget)
self.removeButton.setShortcut("Del") self.horizontalLayout.addWidget(self.addFolderButton)
self.removeButton.setMinimumSize(QSize(91, 0)) spacerItem1 = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum)
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.horizontalLayout.addItem(spacerItem1) 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 = QPushButton(self.centralwidget)
self.scanButton.setText("Scan") 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.scanButton.setDefault(True)
self.horizontalLayout.addWidget(self.scanButton) self.horizontalLayout.addWidget(self.scanButton)
self.verticalLayout.addLayout(self.horizontalLayout) self.verticalLayout.addLayout(self.horizontalLayout)
@ -123,20 +135,32 @@ class DirectoriesDialog(QMainWindow):
self._setupActions() self._setupActions()
self._setupMenu() self._setupMenu()
if self.app.prefs.directoriesWindowRect is not None: if self.app.prefs.directoriesWindowRect is not None:
self.setGeometry(self.app.prefs.directoriesWindowRect) 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): def _updateRemoveButton(self):
indexes = self.treeView.selectedIndexes() indexes = self.treeView.selectedIndexes()
if not indexes: if not indexes:
self.removeButton.setEnabled(False) self.removeFolderButton.setEnabled(False)
return return
self.removeButton.setEnabled(True) self.removeFolderButton.setEnabled(True)
index = indexes[0] index = indexes[0]
node = index.internalPointer() node = index.internalPointer()
# label = 'Remove' if node.parent is None else 'Exclude' # 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 #--- QWidget overrides
def closeEvent(self, event): def closeEvent(self, event):
event.accept() event.accept()
@ -149,7 +173,7 @@ class DirectoriesDialog(QMainWindow):
QApplication.quit() QApplication.quit()
#--- Events #--- Events
def addButtonClicked(self): def addFolderTriggered(self):
title = "Select a directory to add to the scanning list" title = "Select a directory to add to the scanning list"
flags = QFileDialog.ShowDirsOnly flags = QFileDialog.ShowDirsOnly
dirpath = str(QFileDialog.getExistingDirectory(self, title, self.lastAddedFolder, flags)) dirpath = str(QFileDialog.getExistingDirectory(self, title, self.lastAddedFolder, flags))
@ -157,6 +181,7 @@ class DirectoriesDialog(QMainWindow):
return return
self.lastAddedFolder = dirpath self.lastAddedFolder = dirpath
self.app.add_directory(dirpath) self.app.add_directory(dirpath)
self.recentFolders.insertItem(dirpath)
def appWillSavePrefs(self): def appWillSavePrefs(self):
self.app.prefs.directoriesWindowRect = self.geometry() self.app.prefs.directoriesWindowRect = self.geometry()
@ -169,7 +194,7 @@ class DirectoriesDialog(QMainWindow):
self.app.load_from(destination) self.app.load_from(destination)
self.app.recentResults.insertItem(destination) self.app.recentResults.insertItem(destination)
def removeButtonClicked(self): def removeFolderButtonClicked(self):
indexes = self.treeView.selectedIndexes() indexes = self.treeView.selectedIndexes()
if not indexes: if not indexes:
return return

View File

@ -41,6 +41,7 @@ class Preferences(PreferencesBase):
self.detailsWindowRect = self.get_rect('DetailsWindowRect', self.detailsWindowRect) self.detailsWindowRect = self.get_rect('DetailsWindowRect', self.detailsWindowRect)
self.directoriesWindowRect = self.get_rect('DirectoriesWindowRect', self.directoriesWindowRect) self.directoriesWindowRect = self.get_rect('DirectoriesWindowRect', self.directoriesWindowRect)
self.recentResults = get('RecentResults', self.recentResults) self.recentResults = get('RecentResults', self.recentResults)
self.recentFolders = get('RecentFolders', self.recentFolders)
self.registration_code = get('RegistrationCode', self.registration_code) self.registration_code = get('RegistrationCode', self.registration_code)
self.registration_email = get('RegistrationEmail', self.registration_email) self.registration_email = get('RegistrationEmail', self.registration_email)
@ -64,6 +65,7 @@ class Preferences(PreferencesBase):
self.detailsWindowRect = None self.detailsWindowRect = None
self.directoriesWindowRect = None self.directoriesWindowRect = None
self.recentResults = [] self.recentResults = []
self.recentFolders = []
self.registration_code = '' self.registration_code = ''
self.registration_email = '' self.registration_email = ''
@ -94,6 +96,7 @@ class Preferences(PreferencesBase):
self.set_rect('DetailsWindowRect', self.detailsWindowRect) self.set_rect('DetailsWindowRect', self.detailsWindowRect)
self.set_rect('DirectoriesWindowRect', self.directoriesWindowRect) self.set_rect('DirectoriesWindowRect', self.directoriesWindowRect)
set_('RecentResults', self.recentResults) set_('RecentResults', self.recentResults)
set_('RecentFolders', self.recentFolders)
set_('RegistrationCode', self.registration_code) set_('RegistrationCode', self.registration_code)
set_('RegistrationEmail', self.registration_email) set_('RegistrationEmail', self.registration_email)

View File

@ -38,10 +38,10 @@ class ResultWindow(QMainWindow):
def _setupActions(self): def _setupActions(self):
# (name, shortcut, icon, desc, func) # (name, shortcut, icon, desc, func)
ACTIONS = [ ACTIONS = [
('actionDetails', 'Ctrl+3', 'details', "Details", self.detailsTriggered), ('actionDetails', 'Ctrl+I', '', "Details", self.detailsTriggered),
('actionActions', '', 'actions', "Actions", self.actionsTriggered), ('actionActions', '', '', "Actions", self.actionsTriggered),
('actionDelta', 'Ctrl+2', 'delta', "Delta Values", self.deltaTriggered), ('actionDelta', 'Ctrl+2', '', "Delta Values", self.deltaTriggered),
('actionPowerMarker', 'Ctrl+1', 'power_marker', "Power Marker", self.powerMarkerTriggered), ('actionPowerMarker', 'Ctrl+1', '', "Power Marker", self.powerMarkerTriggered),
('actionDeleteMarked', 'Ctrl+D', '', "Send Marked to Recycle Bin", self.deleteTriggered), ('actionDeleteMarked', 'Ctrl+D', '', "Send Marked to Recycle Bin", self.deleteTriggered),
('actionHardlinkMarked', 'Ctrl+Shift+D', '', "Delete Marked and Replace with Hardlinks", self.hardlinkTriggered), ('actionHardlinkMarked', 'Ctrl+Shift+D', '', "Delete Marked and Replace with Hardlinks", self.hardlinkTriggered),
('actionMoveMarked', 'Ctrl+M', '', "Move Marked to...", self.moveTriggered), ('actionMoveMarked', 'Ctrl+M', '', "Move Marked to...", self.moveTriggered),
@ -62,7 +62,7 @@ class ResultWindow(QMainWindow):
('actionCancelFilter', 'Ctrl+Shift+F', '', "Cancel Filter", self.cancelFilterTriggered), ('actionCancelFilter', 'Ctrl+Shift+F', '', "Cancel Filter", self.cancelFilterTriggered),
('actionExport', '', '', "Export To HTML", self.exportTriggered), ('actionExport', '', '', "Export To HTML", self.exportTriggered),
('actionSaveResults', 'Ctrl+S', '', "Save Results...", self.saveResultsTriggered), ('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) createActions(ACTIONS, self)
self.actionDelta.setCheckable(True) self.actionDelta.setCheckable(True)

View File

@ -7,6 +7,8 @@
# which should be included with this package. The terms are also available at # which should be included with this package. The terms are also available at
# http://www.hardcoded.net/licenses/hs_license # http://www.hardcoded.net/licenses/hs_license
from qtlib.recent import Recent
from .se.app import DupeGuru from .se.app import DupeGuru
class TestApp(DupeGuru): class TestApp(DupeGuru):
@ -17,4 +19,6 @@ class TestApp(DupeGuru):
def _setup(self): def _setup(self):
self.prefs = self._create_preferences() self.prefs = self._create_preferences()
self.prefs.load() self.prefs.load()
self.recentResults = Recent(self, 'recentResults')
self._setupActions()