commit 851db130ea0ce779680d09c95967e6c55ac390a6
parent f32cb71ed544026569b516031e8df152240cf399
Author: Neil Booth <kyuupichan@gmail.com>
Date: Sat, 29 Aug 2015 20:58:08 +0900
Cleaner column editing in MyTreeWidget
Also enables arbitrary columns to be edited, but nothing
uses that yet.
Diffstat:
3 files changed, 38 insertions(+), 37 deletions(-)
diff --git a/gui/qt/history_widget.py b/gui/qt/history_widget.py
@@ -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))
-
diff --git a/gui/qt/main_window.py b/gui/qt/main_window.py
@@ -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:
diff --git a/gui/qt/util.py b/gui/qt/util.py
@@ -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()