diff --git a/cocoa/base/xib/DetailsPanel.xib b/cocoa/base/xib/DetailsPanel.xib index fc225067..e47c9727 100644 --- a/cocoa/base/xib/DetailsPanel.xib +++ b/cocoa/base/xib/DetailsPanel.xib @@ -284,6 +284,7 @@ {{0, 0}, {1024, 746}} {451, 162} {1.79769e+308, 1.79769e+308} + DetailsPanel diff --git a/cocoa/base/xib/DirectoryPanel.xib b/cocoa/base/xib/DirectoryPanel.xib index fdbc980e..1622ec9b 100644 --- a/cocoa/base/xib/DirectoryPanel.xib +++ b/cocoa/base/xib/DirectoryPanel.xib @@ -2,13 +2,13 @@ 1050 - 10C540 - 740 - 1038.25 - 458.00 + 10F569 + 788 + 1038.29 + 461.00 com.apple.InterfaceBuilder.CocoaPlugin - 740 + 788 YES @@ -428,6 +428,7 @@ {{0, 0}, {1440, 878}} {369, 291} {1.79769e+308, 1.79769e+308} + DirectoryPanel @@ -869,6 +870,35 @@ id + + YES + + YES + askForDirectory: + popupAddDirectoryMenu: + removeSelectedDirectory: + toggleVisible: + + + YES + + askForDirectory: + id + + + popupAddDirectoryMenu: + id + + + removeSelectedDirectory: + id + + + toggleVisible: + id + + + YES @@ -884,6 +914,30 @@ NSButton + + YES + + YES + addButtonPopUp + outlineView + removeButton + + + YES + + addButtonPopUp + NSPopUpButton + + + outlineView + HSOutlineView + + + removeButton + NSButton + + + IBProjectSource ../base/DirectoryPanel.h @@ -1437,6 +1491,13 @@ showWindow: id + + showWindow: + + showWindow: + id + + IBFrameworkSource AppKit.framework/Headers/NSWindowController.h @@ -1445,6 +1506,7 @@ 0 + IBCocoaFramework com.apple.InterfaceBuilder.CocoaPlugin.macosx @@ -1460,5 +1522,18 @@ YES ../../se/dupeguru.xcodeproj 3 + + YES + + YES + NSMenuCheckmark + NSMenuMixedState + + + YES + {9, 8} + {7, 2} + + diff --git a/cocoa/pe/xib/DetailsPanel.xib b/cocoa/pe/xib/DetailsPanel.xib index 7c36b052..91765e58 100644 --- a/cocoa/pe/xib/DetailsPanel.xib +++ b/cocoa/pe/xib/DetailsPanel.xib @@ -2,13 +2,13 @@ 1050 - 10C540 - 740 - 1038.25 - 458.00 + 10F569 + 788 + 1038.29 + 461.00 com.apple.InterfaceBuilder.CocoaPlugin - 740 + 788 YES @@ -434,6 +434,7 @@ {{0, 0}, {1440, 878}} {451, 177} {1.79769e+308, 1.79769e+308} + DetailsPanel @@ -866,6 +867,13 @@ detailsTable NSTableView + + detailsTable + + detailsTable + NSTableView + + IBProjectSource ../base/DetailsPanel.h @@ -891,6 +899,35 @@ NSProgressIndicator + + YES + + YES + dupeImage + dupeProgressIndicator + refImage + refProgressIndicator + + + YES + + dupeImage + NSImageView + + + dupeProgressIndicator + NSProgressIndicator + + + refImage + NSImageView + + + refProgressIndicator + NSProgressIndicator + + + IBProjectSource DetailsPanel.h @@ -903,6 +940,13 @@ detailsTable NSTableView + + detailsTable + + detailsTable + NSTableView + + IBUserSource @@ -1423,6 +1467,13 @@ showWindow: id + + showWindow: + + showWindow: + id + + IBFrameworkSource AppKit.framework/Headers/NSWindowController.h @@ -1431,6 +1482,7 @@ 0 + IBCocoaFramework com.apple.InterfaceBuilder.CocoaPlugin.macosx @@ -1446,5 +1498,9 @@ YES 3 + + NSApplicationIcon + {128, 128} + diff --git a/qt/base/app.py b/qt/base/app.py index 899c3c05..e5ca785f 100644 --- a/qt/base/app.py +++ b/qt/base/app.py @@ -12,7 +12,7 @@ import logging import os import os.path as op -from PyQt4.QtCore import QTimer, QObject, QCoreApplication, QUrl, SIGNAL +from PyQt4.QtCore import QTimer, QObject, QCoreApplication, QUrl, SIGNAL, pyqtSignal from PyQt4.QtGui import QDesktopServices, QFileDialog, QDialog, QMessageBox from hscommon import job @@ -86,7 +86,10 @@ class DupeGuru(DupeGuruBase, QObject): self._nagTimer = QTimer() self.connect(self._nagTimer, SIGNAL('timeout()'), self.mustShowNag) self._nagTimer.start(0) - self.main_window.show() + if self.prefs.mainWindowIsMaximized: + self.main_window.showMaximized() + else: + self.main_window.show() self.load() self.connect(QCoreApplication.instance(), SIGNAL('aboutToQuit()'), self.application_will_terminate) @@ -205,8 +208,13 @@ class DupeGuru(DupeGuruBase, QObject): self.prefs.save() self._update_options() + #--- Signals + willSavePrefs = pyqtSignal() + #--- Events def application_will_terminate(self): + self.willSavePrefs.emit() + self.prefs.save() self.save() self.save_ignore_list() diff --git a/qt/base/details_dialog.py b/qt/base/details_dialog.py index 00c36c68..ce10d10f 100644 --- a/qt/base/details_dialog.py +++ b/qt/base/details_dialog.py @@ -20,15 +20,23 @@ class DetailsDialog(QDialog): self.app = app self.model = DetailsPanel(self, app) self._setupUi() + if self.app.prefs.detailsWindowRect is not None: + self.setGeometry(self.app.prefs.detailsWindowRect) self.tableModel = DetailsModel(self.model) # tableView is defined in subclasses self.tableView.setModel(self.tableModel) self.model.connect() + + self.app.willSavePrefs.connect(self.appWillSavePrefs) def _setupUi(self): # Virtual pass - # model --> view + #--- Events + def appWillSavePrefs(self): + self.app.prefs.detailsWindowRect = self.geometry() + + #--- model --> view def refresh(self): self.tableModel.reset() diff --git a/qt/base/directories_dialog.py b/qt/base/directories_dialog.py index 13295ed7..93dffd41 100644 --- a/qt/base/directories_dialog.py +++ b/qt/base/directories_dialog.py @@ -26,6 +26,7 @@ class DirectoriesDialog(QDialog, Ui_DirectoriesDialog): self.connect(self.addButton, SIGNAL('clicked()'), self.addButtonClicked) self.connect(self.removeButton, SIGNAL('clicked()'), self.removeButtonClicked) self.connect(self.treeView.selectionModel(), SIGNAL('selectionChanged(QItemSelection,QItemSelection)'), self.selectionChanged) + self.app.willSavePrefs.connect(self.appWillSavePrefs) def _setupUi(self): self.setupUi(self) @@ -40,6 +41,9 @@ class DirectoriesDialog(QDialog, Ui_DirectoriesDialog): header.setResizeMode(0, QHeaderView.Stretch) header.setResizeMode(1, QHeaderView.Fixed) header.resizeSection(1, 100) + + if self.app.prefs.directoriesWindowRect is not None: + self.setGeometry(self.app.prefs.directoriesWindowRect) def _updateRemoveButton(self): indexes = self.treeView.selectedIndexes() @@ -51,6 +55,7 @@ class DirectoriesDialog(QDialog, Ui_DirectoriesDialog): node = index.internalPointer() # label = 'Remove' if node.parent is None else 'Exclude' + #--- Events def addButtonClicked(self): title = "Select a directory to add to the scanning list" flags = QFileDialog.ShowDirsOnly @@ -60,6 +65,9 @@ class DirectoriesDialog(QDialog, Ui_DirectoriesDialog): self.lastAddedFolder = dirpath self.app.add_directory(dirpath) + def appWillSavePrefs(self): + self.app.prefs.directoriesWindowRect = self.geometry() + def doneButtonClicked(self): self.hide() diff --git a/qt/base/main_window.py b/qt/base/main_window.py index 8382a857..5399d2bb 100644 --- a/qt/base/main_window.py +++ b/qt/base/main_window.py @@ -34,9 +34,9 @@ class MainWindow(QMainWindow, Ui_MainWindow): self.connect(self.actionQuit, SIGNAL('triggered()'), QCoreApplication.instance().quit) self.connect(self.menuColumns, SIGNAL('triggered(QAction*)'), self.columnToggled) - self.connect(QCoreApplication.instance(), SIGNAL('aboutToQuit()'), self.application_will_terminate) self.connect(self.resultsView, SIGNAL('doubleClicked()'), self.resultsDoubleClicked) self.connect(self.resultsView, SIGNAL('spacePressed()'), self.resultsSpacePressed) + self.app.willSavePrefs.connect(self.appWillSavePrefs) # Actions (the vast majority of them are connected in the UI file, but I'm trying to # phase away from those, and these connections are harder to maintain than through simple @@ -96,6 +96,9 @@ class MainWindow(QMainWindow, Ui_MainWindow): self.statusLabel = QLabel(self) self.statusbar.addPermanentWidget(self.statusLabel, 1) + if self.app.prefs.mainWindowRect is not None and not self.app.prefs.mainWindowIsMaximized: + self.setGeometry(self.app.prefs.mainWindowRect) + # Linux setup if sys.platform == 'linux2': self.actionCheckForUpdate.setVisible(False) # This only works on Windows @@ -116,18 +119,6 @@ class MainWindow(QMainWindow, Ui_MainWindow): h.setSectionHidden(index, not visible) h.setResizeMode(0, QHeaderView.Stretch) - def _save_columns(self): - h = self.resultsView.header() - widths = [] - visible = [] - for i in range(len(self.app.data.COLUMNS)): - widths.append(h.sectionSize(i)) - visible.append(not h.isSectionHidden(i)) - prefs = self.app.prefs - prefs.columns_width = widths - prefs.columns_visible = visible - prefs.save() - def _update_column_actions_status(self): h = self.resultsView.header() for action in self._column_actions: @@ -288,8 +279,18 @@ class MainWindow(QMainWindow, Ui_MainWindow): self.app.show_help() #--- Events - def application_will_terminate(self): - self._save_columns() + def appWillSavePrefs(self): + prefs = self.app.prefs + h = self.resultsView.header() + widths = [] + visible = [] + for i in range(len(self.app.data.COLUMNS)): + widths.append(h.sectionSize(i)) + visible.append(not h.isSectionHidden(i)) + prefs.columns_width = widths + prefs.columns_visible = visible + prefs.mainWindowIsMaximized = self.isMaximized() + prefs.mainWindowRect = self.geometry() def columnToggled(self, action): colid = action.column_index diff --git a/qt/base/preferences.py b/qt/base/preferences.py index ab2d3280..f1768a6a 100644 --- a/qt/base/preferences.py +++ b/qt/base/preferences.py @@ -16,11 +16,12 @@ class Preferences(PreferencesBase): PreferencesBase.__init__(self) self.reset_columns() - def _load_specific(self, settings, get): + def _load_specific(self, settings): # load prefs specific to the dg edition pass - def _load_values(self, settings, get): + def _load_values(self, settings): + get = self.get_value self.filter_hardness = get('FilterHardness', self.filter_hardness) self.mix_file_kind = get('MixFileKind', self.mix_file_kind) self.use_regexp = get('UseRegexp', self.use_regexp) @@ -33,9 +34,15 @@ class Preferences(PreferencesBase): if width > 0: self.columns_width[index] = width self.columns_visible = get('ColumnsVisible', self.columns_visible) + + self.mainWindowIsMaximized = get('MainWindowIsMaximized', self.mainWindowIsMaximized) + self.mainWindowRect = self.get_rect('MainWindowRect', self.mainWindowRect) + self.detailsWindowRect = self.get_rect('DetailsWindowRect', self.detailsWindowRect) + self.directoriesWindowRect = self.get_rect('DirectoriesWindowRect', self.directoriesWindowRect) + self.registration_code = get('RegistrationCode', self.registration_code) self.registration_email = get('RegistrationEmail', self.registration_email) - self._load_specific(settings, get) + self._load_specific(settings) def _reset_specific(self): # reset prefs specific to the dg edition @@ -48,6 +55,12 @@ class Preferences(PreferencesBase): self.remove_empty_folders = False self.destination_type = 1 self.custom_command = '' + + self.mainWindowIsMaximized = False + self.mainWindowRect = None + self.detailsWindowRect = None + self.directoriesWindowRect = None + self.registration_code = '' self.registration_email = '' self._reset_specific() @@ -56,11 +69,12 @@ class Preferences(PreferencesBase): self.columns_width = [width for width, _ in self.COLUMNS_DEFAULT_ATTRS] self.columns_visible = [visible for _, visible in self.COLUMNS_DEFAULT_ATTRS] - def _save_specific(self, settings, set_): + def _save_specific(self, settings): # save prefs specific to the dg edition pass - def _save_values(self, settings, set_): + def _save_values(self, settings): + set_ = self.set_value set_('FilterHardness', self.filter_hardness) set_('MixFileKind', self.mix_file_kind) set_('UseRegexp', self.use_regexp) @@ -69,7 +83,13 @@ class Preferences(PreferencesBase): set_('CustomCommand', self.custom_command) set_('ColumnsWidth', self.columns_width) set_('ColumnsVisible', self.columns_visible) + + set_('MainWindowIsMaximized', self.mainWindowIsMaximized) + self.set_rect('MainWindowRect', self.mainWindowRect) + self.set_rect('DetailsWindowRect', self.detailsWindowRect) + self.set_rect('DirectoriesWindowRect', self.directoriesWindowRect) + set_('RegistrationCode', self.registration_code) set_('RegistrationEmail', self.registration_email) - self._save_specific(settings, set_) + self._save_specific(settings) diff --git a/qt/me/preferences.py b/qt/me/preferences.py index a57e90a0..d0a8ac91 100644 --- a/qt/me/preferences.py +++ b/qt/me/preferences.py @@ -33,7 +33,8 @@ class Preferences(PreferencesBase): (80, False), # dupe count ] - def _load_specific(self, settings, get): + def _load_specific(self, settings): + get = self.get_value self.scan_type = get('ScanType', self.scan_type) self.word_weighting = get('WordWeighting', self.word_weighting) self.match_similar = get('MatchSimilar', self.match_similar) @@ -56,7 +57,8 @@ class Preferences(PreferencesBase): self.scan_tag_genre = False self.scan_tag_year = False - def _save_specific(self, settings, set_): + def _save_specific(self, settings): + set_ = self.set_value set_('ScanType', self.scan_type) set_('WordWeighting', self.word_weighting) set_('MatchSimilar', self.match_similar) diff --git a/qt/pe/preferences.py b/qt/pe/preferences.py index b9c4249c..db185587 100644 --- a/qt/pe/preferences.py +++ b/qt/pe/preferences.py @@ -23,13 +23,13 @@ class Preferences(PreferencesBase): (80, False), # dupe count ] - def _load_specific(self, settings, get): - self.match_scaled = get('MatchScaled', self.match_scaled) + def _load_specific(self, settings): + self.match_scaled = self.get_value('MatchScaled', self.match_scaled) def _reset_specific(self): self.filter_hardness = 95 self.match_scaled = False - def _save_specific(self, settings, set_): - set_('MatchScaled', self.match_scaled) + def _save_specific(self, settings): + self.set_value('MatchScaled', self.match_scaled) diff --git a/qt/se/preferences.py b/qt/se/preferences.py index 8a7e9bbe..8f76c44d 100644 --- a/qt/se/preferences.py +++ b/qt/se/preferences.py @@ -23,7 +23,8 @@ class Preferences(PreferencesBase): (80, False), # dupe count ] - def _load_specific(self, settings, get): + def _load_specific(self, settings): + get = self.get_value self.scan_type = get('ScanType', self.scan_type) self.word_weighting = get('WordWeighting', self.word_weighting) self.match_similar = get('MatchSimilar', self.match_similar) @@ -38,7 +39,8 @@ class Preferences(PreferencesBase): self.ignore_small_files = True self.small_file_threshold = 10 # KB - def _save_specific(self, settings, set_): + def _save_specific(self, settings): + set_ = self.set_value set_('ScanType', self.scan_type) set_('WordWeighting', self.word_weighting) set_('MatchSimilar', self.match_similar)