Enhancement #1907919: Rules editor: Convert/duplicate rule to advanced rule.

Enhancement #1907918: Add "Duplicate rule" button
Also fixed moving multiple selected items up and down
This commit is contained in:
Charles Haley 2020-12-13 13:17:52 +00:00
parent 8160a8d9c8
commit 52e93d5cae

View File

@ -880,6 +880,19 @@ class RulesModel(QAbstractListModel): # {{{
# }}} # }}}
class RulesView(QListView): # {{{
def __init__(self, parent, enable_convert_buttons_function):
QListView.__init__(self, parent)
self.enable_convert_buttons_function = enable_convert_buttons_function
def currentChanged(self, new, prev):
if self.model() and new.isValid():
_, _, rule = self.model().data(new, Qt.ItemDataRole.UserRole)
self.enable_convert_buttons_function(isinstance(rule, Rule))
# }}}
class EditRules(QWidget): # {{{ class EditRules(QWidget): # {{{
changed = pyqtSignal() changed = pyqtSignal()
@ -909,7 +922,7 @@ class EditRules(QWidget): # {{{
l.addWidget(self.remove_button, l.rowCount() - 1, 1) l.addWidget(self.remove_button, l.rowCount() - 1, 1)
self.g = g = QGridLayout() self.g = g = QGridLayout()
self.rules_view = QListView(self) self.rules_view = RulesView(self, self.do_enable_convert_buttons)
self.rules_view.doubleClicked.connect(self.edit_rule) self.rules_view.doubleClicked.connect(self.edit_rule)
self.rules_view.setSelectionMode(QAbstractItemView.SelectionMode.ExtendedSelection) self.rules_view.setSelectionMode(QAbstractItemView.SelectionMode.ExtendedSelection)
self.rules_view.setAlternatingRowColors(True) self.rules_view.setAlternatingRowColors(True)
@ -937,6 +950,16 @@ class EditRules(QWidget): # {{{
self.hb = hb = QHBoxLayout() self.hb = hb = QHBoxLayout()
l.addLayout(hb, l.rowCount(), 0, 1, 2) l.addLayout(hb, l.rowCount(), 0, 1, 2)
hb.addWidget(b) hb.addWidget(b)
self.duplicate_rule_button = b = QPushButton(QIcon(I('edit-copy.png')),
_('Du&plicate rule'), self)
b.clicked.connect(self.duplicate_rule)
b.setEnabled(False)
hb.addWidget(b)
self.convert_to_advanced_button = b = QPushButton(QIcon(I('modified.png')),
_('Convert to advanced r&ule'), self)
b.clicked.connect(self.convert_to_advanced)
b.setEnabled(False)
hb.addWidget(b)
hb.addStretch(10) hb.addStretch(10)
self.export_button = b = QPushButton(_('E&xport'), self) self.export_button = b = QPushButton(_('E&xport'), self)
b.clicked.connect(self.export_rules) b.clicked.connect(self.export_rules)
@ -989,6 +1012,48 @@ class EditRules(QWidget): # {{{
for x in ('add_advanced_button', 'rules_view', 'up_button', 'down_button', 'add_button', 'remove_button'): for x in ('add_advanced_button', 'rules_view', 'up_button', 'down_button', 'add_button', 'remove_button'):
getattr(self, x).setEnabled(enabled) getattr(self, x).setEnabled(enabled)
def do_enable_convert_buttons(self, to_what):
self.convert_to_advanced_button.setEnabled(to_what)
self.duplicate_rule_button.setEnabled(True)
def convert_to_advanced(self):
sm = self.rules_view.selectionModel()
rows = list(sm.selectedRows())
if not rows or len(rows) != 1:
error_dialog(self, _('Select one rule'),
_('You must select only one rule.'), show=True)
return
idx = self.rules_view.currentIndex()
if idx.isValid():
kind, col, rule = self.model.data(idx, Qt.ItemDataRole.UserRole)
if isinstance(rule, Rule):
template = '\n'.join(
[l for l in rule.template.splitlines() if not l.startswith(Rule.SIGNATURE)])
orig_row = idx.row()
self.model.remove_rule(idx)
new_idx = self.model.add_rule(kind, col, template)
self.rules_view.setCurrentIndex(new_idx)
while self.rules_view.currentIndex().row() > orig_row:
self.move_up()
self.changed.emit()
def duplicate_rule(self):
sm = self.rules_view.selectionModel()
rows = list(sm.selectedRows())
if not rows or len(rows) != 1:
error_dialog(self, _('Select one rule'),
_('You must select only one rule.'), show=True)
return
idx = self.rules_view.currentIndex()
if idx.isValid():
kind, col, rule = self.model.data(idx, Qt.ItemDataRole.UserRole)
orig_row = idx.row()
new_idx = self.model.add_rule(kind, col, rule)
self.rules_view.setCurrentIndex(new_idx)
while self.rules_view.currentIndex().row() > orig_row:
self.move_up()
self.changed.emit()
def add_rule(self): def add_rule(self):
d = RuleEditor(self.model.fm, self.pref_name) d = RuleEditor(self.model.fm, self.pref_name)
d.add_blank_condition() d.add_blank_condition()
@ -1062,24 +1127,32 @@ class EditRules(QWidget): # {{{
self.changed.emit() self.changed.emit()
def move_up(self): def move_up(self):
idx = self.rules_view.currentIndex() sm = self.rules_view.selectionModel()
if idx.isValid(): rows = sorted(list(sm.selectedRows()))
idx = self.model.move(idx, -1) if rows:
if idx is not None: if rows[0].row() == 0:
sm = self.rules_view.selectionModel() return
sm.select(idx, sm.ClearAndSelect) sm.clear()
self.rules_view.setCurrentIndex(idx) for idx in rows:
self.changed.emit() if idx.isValid():
idx = self.model.move(idx, -1)
if idx is not None:
sm.select(idx, sm.Toggle)
self.changed.emit()
def move_down(self): def move_down(self):
idx = self.rules_view.currentIndex() sm = self.rules_view.selectionModel()
if idx.isValid(): rows = sorted(list(sm.selectedRows()))
idx = self.model.move(idx, 1) if rows:
if idx is not None: if rows[-1].row() == self.model.rowCount() - 1:
sm = self.rules_view.selectionModel() return
sm.select(idx, sm.ClearAndSelect) sm.clear()
self.rules_view.setCurrentIndex(idx) for idx in rows:
self.changed.emit() if idx.isValid():
idx = self.model.move(idx, 1)
if idx is not None:
sm.select(idx, sm.Toggle)
self.changed.emit()
def clear(self): def clear(self):
self.model.clear() self.model.clear()