mirror of
https://github.com/arsenetar/dupeguru.git
synced 2025-03-10 13:44:37 +00:00
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:
parent
d51f5184d7
commit
92970489c5
@ -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),
|
||||||
|
@ -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>
|
@ -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,15 +23,27 @@ 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._setupBindings()
|
||||||
|
|
||||||
|
def _setupBindings(self):
|
||||||
self.scanButton.clicked.connect(self.scanButtonClicked)
|
self.scanButton.clicked.connect(self.scanButtonClicked)
|
||||||
self.addButton.clicked.connect(self.addButtonClicked)
|
self.loadResultsButton.clicked.connect(self.actionLoadResults.trigger)
|
||||||
self.removeButton.clicked.connect(self.removeButtonClicked)
|
self.addFolderButton.clicked.connect(self.actionAddFolder.trigger)
|
||||||
|
self.removeFolderButton.clicked.connect(self.removeFolderButtonClicked)
|
||||||
self.treeView.selectionModel().selectionChanged.connect(self.selectionChanged)
|
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)
|
self.app.willSavePrefs.connect(self.appWillSavePrefs)
|
||||||
|
|
||||||
def _setupActions(self):
|
def _setupActions(self):
|
||||||
@ -38,6 +51,7 @@ class DirectoriesDialog(QMainWindow):
|
|||||||
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)
|
||||||
|
|
||||||
@ -70,6 +84,16 @@ class DirectoriesDialog(QMainWindow):
|
|||||||
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)
|
||||||
self.resize(420, 338)
|
self.resize(420, 338)
|
||||||
@ -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)
|
||||||
@ -127,16 +139,28 @@ class DirectoriesDialog(QMainWindow):
|
|||||||
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
|
||||||
|
@ -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)
|
||||||
|
@ -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)
|
||||||
|
@ -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()
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user