[#138] Added drag & drop criteria re-ordering capabilities to the re-prioritization panel.

This commit is contained in:
Virgil Dupras 2011-09-09 18:24:17 -04:00
parent b65c9b8c9a
commit 3ec2a3ef81
4 changed files with 71 additions and 4 deletions

View File

@ -18,6 +18,19 @@ class CriterionCategoryList(GUISelectableList):
def _update_selection(self): def _update_selection(self):
self.dialog.select_category(self.dialog.categories[self.selected_index]) self.dialog.select_category(self.dialog.categories[self.selected_index])
class PrioritizationList(GUISelectableList):
def __init__(self, dialog):
self.dialog = dialog
GUISelectableList.__init__(self)
def move_indexes(self, indexes, dest_index):
indexes.sort()
prilist = self.dialog.prioritizations
selected = [prilist[i] for i in indexes]
for i in reversed(indexes):
del prilist[i]
prilist[dest_index:dest_index] = selected
self[:] = [crit.display for crit in prilist]
class PrioritizeDialog: class PrioritizeDialog:
def __init__(self, view, app): def __init__(self, view, app):
@ -27,7 +40,7 @@ class PrioritizeDialog:
self.criteria = [] self.criteria = []
self.criteria_list = GUISelectableList() self.criteria_list = GUISelectableList()
self.prioritizations = [] self.prioritizations = []
self.prioritization_list = GUISelectableList() self.prioritization_list = PrioritizationList(self)
#--- Private #--- Private
def _sort_key(self, dupe): def _sort_key(self, dupe):

View File

@ -101,3 +101,8 @@ class TestApp(TestAppBase):
# maintainable. # maintainable.
index = self.pdialog.category_list.index(name) index = self.pdialog.category_list.index(name)
self.pdialog.category_list.select(index) self.pdialog.category_list.select(index)
def add_pri_criterion(self, name, index):
self.select_pri_criterion("Kind")
self.pdialog.criteria_list.select([index])
self.pdialog.add_selected()

View File

@ -98,3 +98,14 @@ def test_size_reprioritization(app):
app.pdialog.add_selected() app.pdialog.add_selected()
app.pdialog.perform_reprioritization() app.pdialog.perform_reprioritization()
eq_(app.rtable[0].data[0], 'foo2.ext2') eq_(app.rtable[0].data[0], 'foo2.ext2')
@with_app(app_normal_results)
def test_reorder_prioritizations(app):
app.add_pri_criterion("Kind", 0) # ext1
app.add_pri_criterion("Kind", 1) # ext2
app.pdialog.prioritization_list.move_indexes([1], 0)
expected = [
"Kind (ext2)",
"Kind (ext1)",
]
eq_(app.pdialog.prioritization_list[:], expected)

View File

@ -6,14 +6,48 @@
# 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/bsd_license # http://www.hardcoded.net/licenses/bsd_license
from PyQt4.QtCore import Qt from PyQt4.QtCore import Qt, QMimeData, QByteArray
from PyQt4.QtGui import (QDialog, QVBoxLayout, QHBoxLayout, QPushButton, QComboBox, QListView, from PyQt4.QtGui import (QDialog, QVBoxLayout, QHBoxLayout, QPushButton, QComboBox, QListView,
QDialogButtonBox) QDialogButtonBox, QAbstractItemView)
from hscommon.trans import tr from hscommon.trans import tr
from qtlib.selectable_list import ComboboxModel, ListviewModel from qtlib.selectable_list import ComboboxModel, ListviewModel
from core.gui.prioritize_dialog import PrioritizeDialog as PrioritizeDialogModel from core.gui.prioritize_dialog import PrioritizeDialog as PrioritizeDialogModel
MIME_INDEXES = 'application/dupeguru.rowindexes'
class PrioritizationList(ListviewModel):
def flags(self, index):
if not index.isValid():
return Qt.ItemIsEnabled | Qt.ItemIsDropEnabled
return Qt.ItemIsEnabled | Qt.ItemIsSelectable | Qt.ItemIsDragEnabled
#--- Drag & Drop
def dropMimeData(self, mimeData, action, row, column, parentIndex):
if not mimeData.hasFormat(MIME_INDEXES):
return False
# Since we only drop in between items, parentIndex must be invalid, and we use the row arg
# to know where the drop took place.
if parentIndex.isValid():
return False
strMimeData = bytes(mimeData.data(MIME_INDEXES)).decode()
indexes = list(map(int, strMimeData.split(',')))
self.model.move_indexes(indexes, row)
return True
def mimeData(self, indexes):
rows = {str(index.row()) for index in indexes}
data = ','.join(rows)
mimeData = QMimeData()
mimeData.setData(MIME_INDEXES, QByteArray(data.encode()))
return mimeData
def mimeTypes(self):
return [MIME_INDEXES]
def supportedDropActions(self):
return Qt.MoveAction
class PrioritizeDialog(QDialog): class PrioritizeDialog(QDialog):
def __init__(self, parent, app): def __init__(self, parent, app):
flags = Qt.CustomizeWindowHint | Qt.WindowTitleHint | Qt.WindowSystemMenuHint flags = Qt.CustomizeWindowHint | Qt.WindowTitleHint | Qt.WindowSystemMenuHint
@ -23,7 +57,7 @@ class PrioritizeDialog(QDialog):
self.model = PrioritizeDialogModel(view=self, app=app) self.model = PrioritizeDialogModel(view=self, app=app)
self.categoryList = ComboboxModel(model=self.model.category_list, view=self.categoryCombobox) self.categoryList = ComboboxModel(model=self.model.category_list, view=self.categoryCombobox)
self.criteriaList = ListviewModel(model=self.model.criteria_list, view=self.criteriaListView) self.criteriaList = ListviewModel(model=self.model.criteria_list, view=self.criteriaListView)
self.prioritizationList = ListviewModel(model=self.model.prioritization_list, view=self.prioritizationListView) self.prioritizationList = PrioritizationList(model=self.model.prioritization_list, view=self.prioritizationListView)
self.addCriteriaButton.clicked.connect(self.model.add_selected) self.addCriteriaButton.clicked.connect(self.model.add_selected)
self.buttonBox.accepted.connect(self.accept) self.buttonBox.accepted.connect(self.accept)
@ -38,6 +72,10 @@ class PrioritizeDialog(QDialog):
self.criteriaListView = QListView() self.criteriaListView = QListView()
self.addCriteriaButton = QPushButton("-->") self.addCriteriaButton = QPushButton("-->")
self.prioritizationListView = QListView() self.prioritizationListView = QListView()
self.prioritizationListView.setAcceptDrops(True)
self.prioritizationListView.setDragEnabled(True)
self.prioritizationListView.setDragDropMode(QAbstractItemView.InternalMove)
self.prioritizationListView.setSelectionBehavior(QAbstractItemView.SelectRows)
self.buttonBox = QDialogButtonBox() self.buttonBox = QDialogButtonBox()
self.buttonBox.setStandardButtons(QDialogButtonBox.Cancel|QDialogButtonBox.Ok) self.buttonBox.setStandardButtons(QDialogButtonBox.Cancel|QDialogButtonBox.Ok)