From b65c9b8c9ac441cd96c3a7a092719709619e0018 Mon Sep 17 00:00:00 2001 From: Virgil Dupras Date: Fri, 9 Sep 2011 12:01:15 -0400 Subject: [PATCH] [#138] Added a crude-but-functional reprioritization dialog in Qt. --- core/gui/prioritize_dialog.py | 10 +++---- core/prioritize.py | 2 +- core/tests/prioritize_test.py | 4 +++ qt/base/prioritize_dialog.py | 54 +++++++++++++++++++++++++++++++++++ qt/base/result_window.py | 11 ++++++- 5 files changed, 74 insertions(+), 7 deletions(-) create mode 100644 qt/base/prioritize_dialog.py diff --git a/core/gui/prioritize_dialog.py b/core/gui/prioritize_dialog.py index d459396d..70f6ddf4 100644 --- a/core/gui/prioritize_dialog.py +++ b/core/gui/prioritize_dialog.py @@ -6,14 +6,14 @@ # which should be included with this package. The terms are also available at # http://www.hardcoded.net/licenses/bsd_license -from hscommon.gui.selectable_list import SelectableList +from hscommon.gui.selectable_list import GUISelectableList from ..prioritize import all_categories -class CriterionCategoryList(SelectableList): +class CriterionCategoryList(GUISelectableList): def __init__(self, dialog): self.dialog = dialog - SelectableList.__init__(self, [c.NAME for c in dialog.categories]) + GUISelectableList.__init__(self, [c.NAME for c in dialog.categories]) def _update_selection(self): self.dialog.select_category(self.dialog.categories[self.selected_index]) @@ -25,9 +25,9 @@ class PrioritizeDialog: self.categories = [cat(app.results) for cat in all_categories()] self.category_list = CriterionCategoryList(self) self.criteria = [] - self.criteria_list = SelectableList() + self.criteria_list = GUISelectableList() self.prioritizations = [] - self.prioritization_list = SelectableList() + self.prioritization_list = GUISelectableList() #--- Private def _sort_key(self, dupe): diff --git a/core/prioritize.py b/core/prioritize.py index 66e2e295..db0ce43c 100644 --- a/core/prioritize.py +++ b/core/prioritize.py @@ -46,7 +46,7 @@ class Criterion: @property def display(self): - return "{} ({})".format(self.category.NAME, self.value) + return "{} ({})".format(self.category.NAME, self.display_value) class KindCategory(CriterionCategory): diff --git a/core/tests/prioritize_test.py b/core/tests/prioritize_test.py index ae8cc94e..7ec84dee 100644 --- a/core/tests/prioritize_test.py +++ b/core/tests/prioritize_test.py @@ -76,9 +76,13 @@ def test_prilist_display(app): app.select_pri_criterion("Folder") app.pdialog.criteria_list.select([1]) # folder2 app.pdialog.add_selected() + app.select_pri_criterion("Size") + app.pdialog.criteria_list.select([1]) # Lowest + app.pdialog.add_selected() expected = [ "Kind (ext2)", "Folder (folder2)", + "Size (Lowest)", ] eq_(app.pdialog.prioritization_list[:], expected) diff --git a/qt/base/prioritize_dialog.py b/qt/base/prioritize_dialog.py new file mode 100644 index 00000000..580e3976 --- /dev/null +++ b/qt/base/prioritize_dialog.py @@ -0,0 +1,54 @@ +# Created By: Virgil Dupras +# Created On: 2011-09-06 +# Copyright 2011 Hardcoded Software (http://www.hardcoded.net) +# +# This software is licensed under the "BSD" License as described in the "LICENSE" file, +# which should be included with this package. The terms are also available at +# http://www.hardcoded.net/licenses/bsd_license + +from PyQt4.QtCore import Qt +from PyQt4.QtGui import (QDialog, QVBoxLayout, QHBoxLayout, QPushButton, QComboBox, QListView, + QDialogButtonBox) + +from hscommon.trans import tr +from qtlib.selectable_list import ComboboxModel, ListviewModel +from core.gui.prioritize_dialog import PrioritizeDialog as PrioritizeDialogModel + +class PrioritizeDialog(QDialog): + def __init__(self, parent, app): + flags = Qt.CustomizeWindowHint | Qt.WindowTitleHint | Qt.WindowSystemMenuHint + QDialog.__init__(self, parent, flags) + self.app = app + self._setupUi() + self.model = PrioritizeDialogModel(view=self, app=app) + self.categoryList = ComboboxModel(model=self.model.category_list, view=self.categoryCombobox) + self.criteriaList = ListviewModel(model=self.model.criteria_list, view=self.criteriaListView) + self.prioritizationList = ListviewModel(model=self.model.prioritization_list, view=self.prioritizationListView) + + self.addCriteriaButton.clicked.connect(self.model.add_selected) + self.buttonBox.accepted.connect(self.accept) + self.buttonBox.rejected.connect(self.reject) + + def _setupUi(self): + self.setWindowTitle(tr("Re-prioritize duplicates")) + self.resize(413, 323) + + #widgets + self.categoryCombobox = QComboBox() + self.criteriaListView = QListView() + self.addCriteriaButton = QPushButton("-->") + self.prioritizationListView = QListView() + self.buttonBox = QDialogButtonBox() + self.buttonBox.setStandardButtons(QDialogButtonBox.Cancel|QDialogButtonBox.Ok) + + # layout + self.mainLayout = QVBoxLayout(self) + self.widgetsLayout = QHBoxLayout() + self.leftWidgetsLayout = QVBoxLayout() + self.leftWidgetsLayout.addWidget(self.categoryCombobox) + self.leftWidgetsLayout.addWidget(self.criteriaListView) + self.widgetsLayout.addLayout(self.leftWidgetsLayout) + self.widgetsLayout.addWidget(self.addCriteriaButton) + self.widgetsLayout.addWidget(self.prioritizationListView) + self.mainLayout.addLayout(self.widgetsLayout) + self.mainLayout.addWidget(self.buttonBox) diff --git a/qt/base/result_window.py b/qt/base/result_window.py index 7f650ee1..c65230f1 100644 --- a/qt/base/result_window.py +++ b/qt/base/result_window.py @@ -11,7 +11,7 @@ import sys from PyQt4.QtCore import Qt, SIGNAL, QUrl, QRect from PyQt4.QtGui import (QMainWindow, QMenu, QLabel, QHeaderView, QMessageBox, QInputDialog, QLineEdit, QDesktopServices, QFileDialog, QMenuBar, QWidget, QVBoxLayout, QAbstractItemView, - QStatusBar) + QStatusBar, QDialog) from hscommon.trans import tr, trmsg from hscommon.util import nonone @@ -20,6 +20,7 @@ from qtlib.util import moveToScreenCenter from .results_model import ResultsModel, ResultsView from .stats_label import StatsLabel from .util import createActions +from .prioritize_dialog import PrioritizeDialog class ResultWindow(QMainWindow): def __init__(self, app): @@ -49,6 +50,7 @@ class ResultWindow(QMainWindow): ('actionMoveMarked', 'Ctrl+M', '', tr("Move Marked to..."), self.moveTriggered), ('actionCopyMarked', 'Ctrl+Shift+M', '', tr("Copy Marked to..."), self.copyTriggered), ('actionRemoveMarked', 'Ctrl+R', '', tr("Remove Marked from Results"), self.removeMarkedTriggered), + ('actionReprioritize', '', '', tr("Re-Prioritize..."), self.reprioritizeTriggered), ('actionRemoveSelected', 'Ctrl+Del', '', tr("Remove Selected from Results"), self.removeSelectedTriggered), ('actionIgnoreSelected', 'Ctrl+Shift+Del', '', tr("Add Selected to Ignore List"), self.addToIgnoreListTriggered), ('actionMakeSelectedReference', 'Ctrl+Space', '', tr("Make Selected Reference"), self.makeReferenceTriggered), @@ -95,6 +97,7 @@ class ResultWindow(QMainWindow): self.menuActions.addAction(self.actionMoveMarked) self.menuActions.addAction(self.actionCopyMarked) self.menuActions.addAction(self.actionRemoveMarked) + self.menuActions.addAction(self.actionReprioritize) self.menuActions.addSeparator() self.menuActions.addAction(self.actionRemoveSelected) self.menuActions.addAction(self.actionIgnoreSelected) @@ -327,6 +330,12 @@ class ResultWindow(QMainWindow): def renameTriggered(self): self.resultsView.edit(self.resultsView.selectionModel().currentIndex()) + def reprioritizeTriggered(self): + dlg = PrioritizeDialog(self, self.app) + result = dlg.exec() + if result == QDialog.Accepted: + dlg.model.perform_reprioritization() + def revealTriggered(self): self.app.reveal_selected()