Cleaner column editing in MyTreeWidget
Also enables arbitrary columns to be edited, but nothing uses that yet.
This commit is contained in:
@@ -62,7 +62,7 @@ class HistoryWidget(MyTreeWidget):
|
|||||||
v_str = self.parent.format_amount(value, True, whitespaces=True)
|
v_str = self.parent.format_amount(value, True, whitespaces=True)
|
||||||
balance_str = self.parent.format_amount(balance, whitespaces=True)
|
balance_str = self.parent.format_amount(balance, whitespaces=True)
|
||||||
label, is_default_label = self.wallet.get_label(tx_hash)
|
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.setIcon(0, icon)
|
||||||
item.setFont(3, QFont(MONOSPACE_FONT))
|
item.setFont(3, QFont(MONOSPACE_FONT))
|
||||||
item.setFont(4, 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(_("Edit description"), lambda: self.edit_label(item))
|
||||||
menu.addAction(_("View on block explorer"), lambda: webbrowser.open(tx_URL))
|
menu.addAction(_("View on block explorer"), lambda: webbrowser.open(tx_URL))
|
||||||
menu.exec_(self.viewport().mapToGlobal(position))
|
menu.exec_(self.viewport().mapToGlobal(position))
|
||||||
|
|
||||||
|
|||||||
@@ -951,7 +951,7 @@ class ElectrumWindow(QMainWindow):
|
|||||||
requestor = req.get('name', '')
|
requestor = req.get('name', '')
|
||||||
amount_str = self.format_amount(amount) if amount else ""
|
amount_str = self.format_amount(amount) if amount else ""
|
||||||
account = ''
|
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:
|
if signature is not None:
|
||||||
item.setIcon(3, QIcon(":icons/seal.png"))
|
item.setIcon(3, QIcon(":icons/seal.png"))
|
||||||
item.setToolTip(3, 'signed by '+ requestor)
|
item.setToolTip(3, 'signed by '+ requestor)
|
||||||
@@ -1521,7 +1521,7 @@ class ElectrumWindow(QMainWindow):
|
|||||||
requestor = pr.get_requestor()
|
requestor = pr.get_requestor()
|
||||||
exp = pr.get_expiration_date()
|
exp = pr.get_expiration_date()
|
||||||
date_str = util.format_time(exp) if exp else _('Never')
|
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.setIcon(4, QIcon(pr_icons.get(status)))
|
||||||
item.setData(0, Qt.UserRole, key)
|
item.setData(0, Qt.UserRole, key)
|
||||||
item.setFont(1, QFont(MONOSPACE_FONT))
|
item.setFont(1, QFont(MONOSPACE_FONT))
|
||||||
@@ -1772,7 +1772,7 @@ class ElectrumWindow(QMainWindow):
|
|||||||
label = self.wallet.labels.get(address,'')
|
label = self.wallet.labels.get(address,'')
|
||||||
c, u, x = self.wallet.get_addr_balance(address)
|
c, u, x = self.wallet.get_addr_balance(address)
|
||||||
balance = self.format_amount(c + u + x)
|
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.setFont(0, QFont(MONOSPACE_FONT))
|
||||||
item.setData(0, Qt.UserRole, address)
|
item.setData(0, Qt.UserRole, address)
|
||||||
item.setData(0, Qt.UserRole+1, True) # label can be edited
|
item.setData(0, Qt.UserRole+1, True) # label can be edited
|
||||||
@@ -1798,7 +1798,7 @@ class ElectrumWindow(QMainWindow):
|
|||||||
l.clear()
|
l.clear()
|
||||||
for key in sorted(self.contacts.keys()):
|
for key in sorted(self.contacts.keys()):
|
||||||
_type, value = self.contacts[key]
|
_type, value = self.contacts[key]
|
||||||
item = QTreeWidgetItem([key, value, _type])
|
item = EditableItem([key, value, _type])
|
||||||
item.setData(0, Qt.UserRole, key)
|
item.setData(0, Qt.UserRole, key)
|
||||||
l.addTopLevelItem(item)
|
l.addTopLevelItem(item)
|
||||||
if key == current_key:
|
if key == current_key:
|
||||||
|
|||||||
@@ -283,11 +283,25 @@ def filename_field(parent, config, defaultname, select_msg):
|
|||||||
|
|
||||||
return vbox, filename_e, b1
|
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):
|
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)
|
QTreeWidget.__init__(self, parent)
|
||||||
self.parent = parent
|
self.parent = parent
|
||||||
self.setColumnCount(len(headers))
|
self.setColumnCount(len(headers))
|
||||||
@@ -299,11 +313,15 @@ class MyTreeWidget(QTreeWidget):
|
|||||||
# extend the syntax for consistency
|
# extend the syntax for consistency
|
||||||
self.addChild = self.addTopLevelItem
|
self.addChild = self.addTopLevelItem
|
||||||
self.insertChild = self.insertTopLevelItem
|
self.insertChild = self.insertTopLevelItem
|
||||||
# editable column
|
|
||||||
self.is_edit = False
|
# Control which columns are editable
|
||||||
self.edit_column = stretch_column
|
if editable_columns is None:
|
||||||
self.itemDoubleClicked.connect(self.edit_label)
|
editable_columns = [stretch_column]
|
||||||
self.itemChanged.connect(self.label_changed)
|
self.setEditTriggers(QAbstractItemView.DoubleClicked |
|
||||||
|
QAbstractItemView.EditKeyPressed)
|
||||||
|
self.setItemDelegate(EditableItemDelegate(self, editable_columns))
|
||||||
|
self.itemChanged.connect(self.item_edited)
|
||||||
|
|
||||||
# stretch
|
# stretch
|
||||||
for i in range(len(headers)):
|
for i in range(len(headers)):
|
||||||
self.header().setResizeMode(i, QHeaderView.Stretch if i == stretch_column else QHeaderView.ResizeToContents)
|
self.header().setResizeMode(i, QHeaderView.Stretch if i == stretch_column else QHeaderView.ResizeToContents)
|
||||||
@@ -322,35 +340,19 @@ class MyTreeWidget(QTreeWidget):
|
|||||||
break
|
break
|
||||||
self.emit(SIGNAL('customContextMenuRequested(const QPoint&)'), QPoint(50, i*5 + j - 1))
|
self.emit(SIGNAL('customContextMenuRequested(const QPoint&)'), QPoint(50, i*5 + j - 1))
|
||||||
|
|
||||||
def edit_label(self, item, column=None):
|
def item_edited(self, item, column, prior):
|
||||||
if column is None:
|
'''Called only when the text actually changes'''
|
||||||
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
|
|
||||||
key = str(item.data(0, Qt.UserRole).toString())
|
key = str(item.data(0, Qt.UserRole).toString())
|
||||||
text = unicode(item.text(self.edit_column))
|
text = unicode(item.text(column))
|
||||||
changed = self.parent.wallet.set_label(key, text)
|
self.parent.wallet.set_label(key, text)
|
||||||
if text:
|
if text:
|
||||||
item.setForeground(self.edit_column, QBrush(QColor('black')))
|
item.setForeground(column, QBrush(QColor('black')))
|
||||||
else:
|
else:
|
||||||
text = self.parent.wallet.get_default_label(key)
|
text = self.parent.wallet.get_default_label(key)
|
||||||
item.setText(self.edit_column, text)
|
item.setText(column, text)
|
||||||
item.setForeground(self.edit_column, QBrush(QColor('gray')))
|
item.setForeground(column, QBrush(QColor('gray')))
|
||||||
self.is_edit = False
|
self.parent.update_history_tab()
|
||||||
if changed:
|
self.parent.update_completions()
|
||||||
self.parent.update_history_tab()
|
|
||||||
self.parent.update_completions()
|
|
||||||
|
|
||||||
def get_leaves(self, root):
|
def get_leaves(self, root):
|
||||||
child_count = root.childCount()
|
child_count = root.childCount()
|
||||||
|
|||||||
Reference in New Issue
Block a user