Cleaner column editing in MyTreeWidget

Also enables arbitrary columns to be edited, but nothing
uses that yet.
This commit is contained in:
Neil Booth 2015-08-29 20:58:08 +09:00
parent f32cb71ed5
commit 851db130ea
3 changed files with 38 additions and 37 deletions

View File

@ -62,7 +62,7 @@ class HistoryWidget(MyTreeWidget):
v_str = self.parent.format_amount(value, True, whitespaces=True)
balance_str = self.parent.format_amount(balance, whitespaces=True)
label, is_default_label = self.wallet.get_label(tx_hash)
item = QTreeWidgetItem(['', tx_hash, time_str, label, v_str, balance_str])
item = EditableItem(['', tx_hash, time_str, label, v_str, balance_str])
item.setIcon(0, icon)
item.setFont(3, QFont(MONOSPACE_FONT))
item.setFont(4, QFont(MONOSPACE_FONT))
@ -103,4 +103,3 @@ class HistoryWidget(MyTreeWidget):
menu.addAction(_("Edit description"), lambda: self.edit_label(item))
menu.addAction(_("View on block explorer"), lambda: webbrowser.open(tx_URL))
menu.exec_(self.viewport().mapToGlobal(position))

View File

@ -951,7 +951,7 @@ class ElectrumWindow(QMainWindow):
requestor = req.get('name', '')
amount_str = self.format_amount(amount) if amount else ""
account = ''
item = QTreeWidgetItem([date, account, address, '', message, amount_str, pr_tooltips.get(status,'')])
item = EditableItem([date, account, address, '', message, amount_str, pr_tooltips.get(status,'')])
if signature is not None:
item.setIcon(3, QIcon(":icons/seal.png"))
item.setToolTip(3, 'signed by '+ requestor)
@ -1521,7 +1521,7 @@ class ElectrumWindow(QMainWindow):
requestor = pr.get_requestor()
exp = pr.get_expiration_date()
date_str = util.format_time(exp) if exp else _('Never')
item = QTreeWidgetItem( [ date_str, requestor, pr.memo, self.format_amount(pr.get_amount(), whitespaces=True), pr_tooltips.get(status,'')] )
item = EditableItem([date_str, requestor, pr.memo, self.format_amount(pr.get_amount(), whitespaces=True), pr_tooltips.get(status,'')])
item.setIcon(4, QIcon(pr_icons.get(status)))
item.setData(0, Qt.UserRole, key)
item.setFont(1, QFont(MONOSPACE_FONT))
@ -1772,7 +1772,7 @@ class ElectrumWindow(QMainWindow):
label = self.wallet.labels.get(address,'')
c, u, x = self.wallet.get_addr_balance(address)
balance = self.format_amount(c + u + x)
item = QTreeWidgetItem( [ address, label, balance, "%d"%num] )
item = EditableItem( [ address, label, balance, "%d"%num] )
item.setFont(0, QFont(MONOSPACE_FONT))
item.setData(0, Qt.UserRole, address)
item.setData(0, Qt.UserRole+1, True) # label can be edited
@ -1798,7 +1798,7 @@ class ElectrumWindow(QMainWindow):
l.clear()
for key in sorted(self.contacts.keys()):
_type, value = self.contacts[key]
item = QTreeWidgetItem([key, value, _type])
item = EditableItem([key, value, _type])
item.setData(0, Qt.UserRole, key)
l.addTopLevelItem(item)
if key == current_key:

View File

@ -283,11 +283,25 @@ def filename_field(parent, config, defaultname, select_msg):
return vbox, filename_e, b1
class EditableItem(QTreeWidgetItem):
def __init__(self, columns):
QTreeWidgetItem.__init__(self, columns)
self.setFlags(self.flags() | Qt.ItemIsEditable)
class EditableItemDelegate(QStyledItemDelegate):
def __init__(self, parent, editable_columns):
QStyledItemDelegate.__init__(self, parent)
self.editable_columns = editable_columns
def createEditor(self, parent, option, index):
if index.column() not in self.editable_columns:
return None
return QStyledItemDelegate.createEditor(self, parent, option, index)
class MyTreeWidget(QTreeWidget):
def __init__(self, parent, create_menu, headers, stretch_column=None):
def __init__(self, parent, create_menu, headers, stretch_column=None,
editable_columns=None):
QTreeWidget.__init__(self, parent)
self.parent = parent
self.setColumnCount(len(headers))
@ -299,11 +313,15 @@ class MyTreeWidget(QTreeWidget):
# extend the syntax for consistency
self.addChild = self.addTopLevelItem
self.insertChild = self.insertTopLevelItem
# editable column
self.is_edit = False
self.edit_column = stretch_column
self.itemDoubleClicked.connect(self.edit_label)
self.itemChanged.connect(self.label_changed)
# Control which columns are editable
if editable_columns is None:
editable_columns = [stretch_column]
self.setEditTriggers(QAbstractItemView.DoubleClicked |
QAbstractItemView.EditKeyPressed)
self.setItemDelegate(EditableItemDelegate(self, editable_columns))
self.itemChanged.connect(self.item_edited)
# stretch
for i in range(len(headers)):
self.header().setResizeMode(i, QHeaderView.Stretch if i == stretch_column else QHeaderView.ResizeToContents)
@ -322,35 +340,19 @@ class MyTreeWidget(QTreeWidget):
break
self.emit(SIGNAL('customContextMenuRequested(const QPoint&)'), QPoint(50, i*5 + j - 1))
def edit_label(self, item, column=None):
if column is None:
column = self.edit_column
if column==self.edit_column and item.isSelected():
self.is_edit = True
item.setFlags(item.flags() | Qt.ItemIsEditable)
self.editItem(item, column)
item.setFlags(item.flags() & ~Qt.ItemIsEditable)
self.is_edit = False
def label_changed(self, item, column):
if column != self.edit_column:
return
if self.is_edit:
return
self.is_edit = True
def item_edited(self, item, column, prior):
'''Called only when the text actually changes'''
key = str(item.data(0, Qt.UserRole).toString())
text = unicode(item.text(self.edit_column))
changed = self.parent.wallet.set_label(key, text)
text = unicode(item.text(column))
self.parent.wallet.set_label(key, text)
if text:
item.setForeground(self.edit_column, QBrush(QColor('black')))
item.setForeground(column, QBrush(QColor('black')))
else:
text = self.parent.wallet.get_default_label(key)
item.setText(self.edit_column, text)
item.setForeground(self.edit_column, QBrush(QColor('gray')))
self.is_edit = False
if changed:
self.parent.update_history_tab()
self.parent.update_completions()
item.setText(column, text)
item.setForeground(column, QBrush(QColor('gray')))
self.parent.update_history_tab()
self.parent.update_completions()
def get_leaves(self, root):
child_count = root.childCount()