From 83e05b1183d3857060a015f3207bf55aff7665b2 Mon Sep 17 00:00:00 2001 From: Neil Booth Date: Wed, 29 Apr 2015 10:13:41 +0900 Subject: [PATCH 1/4] Modify format_satoshis to display amounts according to locale. In particular, thousands and decimal point separators are taken from locale. --- gui/qt/history_widget_lite.py | 2 +- lib/util.py | 37 +++++++++++++++-------------------- 2 files changed, 17 insertions(+), 22 deletions(-) diff --git a/gui/qt/history_widget_lite.py b/gui/qt/history_widget_lite.py index a08f8d1c..d202ff7f 100644 --- a/gui/qt/history_widget_lite.py +++ b/gui/qt/history_widget_lite.py @@ -20,6 +20,6 @@ class HistoryWidget(QTreeWidget): if date is None: date = _("Unknown") item = QTreeWidgetItem([amount, address, date]) - if float(amount) < 0: + if amount.find('-') != -1: item.setForeground(0, QBrush(QColor("#BC1E1E"))) self.insertTopLevelItem(0, item) diff --git a/lib/util.py b/lib/util.py index 62fec50a..51472844 100644 --- a/lib/util.py +++ b/lib/util.py @@ -108,28 +108,23 @@ def user_dir(): def format_satoshis(x, is_diff=False, num_zeros = 0, decimal_point = 8, whitespaces=False): - from decimal import Decimal - if x is None: - return 'unknown' - s = Decimal(x) - sign, digits, exp = s.as_tuple() - digits = map(str, digits) - while len(digits) < decimal_point + 1: - digits.insert(0,'0') - digits.insert(-decimal_point,'.') - s = ''.join(digits).rstrip('0') - if sign: - s = '-' + s - elif is_diff: - s = "+" + s - - p = s.find('.') - s += "0"*( 1 + num_zeros - ( len(s) - p )) + from locale import localeconv + if is_diff: + fmt = "{:+n}" + else: + fmt = "{:n}" + scale_factor = pow (10, decimal_point) + integer_part = fmt.format(int(x / float(scale_factor))) + dp = localeconv()['decimal_point'] + fract_part = ("{:0" + str(decimal_point) + "}").format(abs(x) % scale_factor) + fract_part = fract_part.rstrip('0') + if len(fract_part) < num_zeros: + fract_part += "0" * (num_zeros - len(fract_part)) + result = integer_part + dp + fract_part if whitespaces: - s += " "*( 1 + decimal_point - ( len(s) - p )) - s = " "*( 13 - decimal_point - ( p )) + s - return s - + result += " " * (decimal_point - len(fract_part)) + result = " " * (17 - len(result)) + result + return result def format_time(timestamp): import datetime From 0d35dd66d232cf0c0703572b91645c367a151582 Mon Sep 17 00:00:00 2001 From: Neil Booth Date: Wed, 29 Apr 2015 14:48:55 +0900 Subject: [PATCH 2/4] The lite GUI passes a decimal type --- lib/util.py | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/util.py b/lib/util.py index 51472844..3744d8fd 100644 --- a/lib/util.py +++ b/lib/util.py @@ -109,6 +109,7 @@ def user_dir(): def format_satoshis(x, is_diff=False, num_zeros = 0, decimal_point = 8, whitespaces=False): from locale import localeconv + x = int(x) # Some callers pass Decimal if is_diff: fmt = "{:+n}" else: From 4f45e0a083fef225afccf23ededa19775f315352 Mon Sep 17 00:00:00 2001 From: Neil Booth Date: Wed, 29 Apr 2015 15:09:55 +0900 Subject: [PATCH 3/4] Prior lost minus sign for fractional negative numbers --- lib/util.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/util.py b/lib/util.py index 3744d8fd..3de3e0cf 100644 --- a/lib/util.py +++ b/lib/util.py @@ -110,12 +110,12 @@ def user_dir(): def format_satoshis(x, is_diff=False, num_zeros = 0, decimal_point = 8, whitespaces=False): from locale import localeconv x = int(x) # Some callers pass Decimal - if is_diff: - fmt = "{:+n}" - else: - fmt = "{:n}" scale_factor = pow (10, decimal_point) - integer_part = fmt.format(int(x / float(scale_factor))) + integer_part = "{:n}".format(int(abs(x) / float(scale_factor))) + if x < 0: + integer_part = '-' + integer_part + elif is_diff: + integer_part = '+' + integer_part dp = localeconv()['decimal_point'] fract_part = ("{:0" + str(decimal_point) + "}").format(abs(x) % scale_factor) fract_part = fract_part.rstrip('0') From 953674aac7c949676f10bf9e83dcb34905cb1d05 Mon Sep 17 00:00:00 2001 From: ThomasV Date: Wed, 29 Apr 2015 09:26:22 +0200 Subject: [PATCH 4/4] resize columns to content by default --- gui/qt/history_widget.py | 2 +- gui/qt/main_window.py | 19 +++++++++---------- gui/qt/util.py | 12 ++++-------- lib/util.py | 2 +- 4 files changed, 15 insertions(+), 20 deletions(-) diff --git a/gui/qt/history_widget.py b/gui/qt/history_widget.py index 6449cc65..94acd43e 100644 --- a/gui/qt/history_widget.py +++ b/gui/qt/history_widget.py @@ -28,7 +28,7 @@ from electrum.plugins import run_hook class HistoryWidget(MyTreeWidget): def __init__(self, parent=None): - MyTreeWidget.__init__(self, parent, self.create_menu, [ '', _('Date'), _('Description') , _('Amount'), _('Balance')], [40, 140, None, 140, 140]) + MyTreeWidget.__init__(self, parent, self.create_menu, [ '', _('Date'), _('Description') , _('Amount'), _('Balance')], 2) self.config = self.parent.config self.setSortingEnabled(False) diff --git a/gui/qt/main_window.py b/gui/qt/main_window.py index 4ad87ced..c65d19b8 100644 --- a/gui/qt/main_window.py +++ b/gui/qt/main_window.py @@ -629,7 +629,7 @@ class ElectrumWindow(QMainWindow): buttons.addWidget(self.new_request_button) self.receive_requests_label = QLabel(_('My Requests')) - self.receive_list = MyTreeWidget(self, self.receive_list_menu, [_('Date'), _('Account'), _('Address'), _('Description'), _('Amount'), _('Status')], []) + self.receive_list = MyTreeWidget(self, self.receive_list_menu, [_('Date'), _('Account'), _('Address'), _('Description'), _('Amount'), _('Status')], 3) self.receive_list.currentItemChanged.connect(self.receive_item_changed) self.receive_list.itemClicked.connect(self.receive_item_changed) self.receive_list.setSortingEnabled(True) @@ -901,7 +901,7 @@ class ElectrumWindow(QMainWindow): self.from_label = QLabel(_('From')) grid.addWidget(self.from_label, 3, 0) - self.from_list = MyTreeWidget(self, self.from_list_menu, ['',''], [350, 50]) + self.from_list = MyTreeWidget(self, self.from_list_menu, ['','']) self.from_list.setHeaderHidden(True) self.from_list.setMaximumHeight(80) grid.addWidget(self.from_list, 3, 1, 1, 3) @@ -968,12 +968,11 @@ class ElectrumWindow(QMainWindow): self.fee_e.textChanged.connect(entry_changed) self.invoices_label = QLabel(_('Invoices')) - self.invoices_list = MyTreeWidget( - self, - self.create_invoice_menu, - [_('Date'), _('Requestor'), _('Description'), _('Amount'), _('Status')], - [150, 150, None, 150, 100] - ) + self.invoices_list = MyTreeWidget(self, self.create_invoice_menu, + [_('Date'), _('Requestor'), _('Description'), _('Amount'), _('Status')], 2) + self.invoices_list.header().setResizeMode(1, QHeaderView.Interactive) + self.invoices_list.setColumnWidth(1, 200) + vbox0 = QVBoxLayout() vbox0.addLayout(grid) vbox0.addLayout(buttons) @@ -1309,14 +1308,14 @@ class ElectrumWindow(QMainWindow): return w def create_addresses_tab(self): - l = MyTreeWidget(self, self.create_receive_menu, [ _('Address'), _('Label'), _('Balance'), _('Tx')], [370, None, 130]) + l = MyTreeWidget(self, self.create_receive_menu, [ _('Address'), _('Label'), _('Balance'), _('Tx')], 1) l.setSelectionMode(QAbstractItemView.ExtendedSelection) l.setSortingEnabled(False) self.address_list = l return self.create_list_tab(l) def create_contacts_tab(self): - l = MyTreeWidget(self, self.create_contact_menu, [_('Key'), _('Value'), _('Type')], [250, None, 130]) + l = MyTreeWidget(self, self.create_contact_menu, [_('Key'), _('Value'), _('Type')], 1) self.contacts_list = l return self.create_list_tab(l) diff --git a/gui/qt/util.py b/gui/qt/util.py index 2a3ff28e..0babb0e2 100644 --- a/gui/qt/util.py +++ b/gui/qt/util.py @@ -260,7 +260,7 @@ def filename_field(parent, config, defaultname, select_msg): class MyTreeWidget(QTreeWidget): - def __init__(self, parent, create_menu, headers, column_width): + def __init__(self, parent, create_menu, headers, stretch_column=0): QTreeWidget.__init__(self, parent) self.parent = parent self.setColumnCount(len(headers)) @@ -277,13 +277,9 @@ class MyTreeWidget(QTreeWidget): self.edit_column = None self.itemDoubleClicked.connect(self.edit_label) self.itemChanged.connect(self.label_changed) - # set column width - for i, width in enumerate(column_width): - if width is None: - self.header().setResizeMode(i, QHeaderView.Stretch) - self.edit_column = i - else: - self.setColumnWidth(i, width) + # stretch + for i in range(len(headers)): + self.header().setResizeMode(i, QHeaderView.Stretch if i == stretch_column else QHeaderView.ResizeToContents) self.setSortingEnabled(True) def on_activated(self, item): diff --git a/lib/util.py b/lib/util.py index 3de3e0cf..72685fff 100644 --- a/lib/util.py +++ b/lib/util.py @@ -124,7 +124,7 @@ def format_satoshis(x, is_diff=False, num_zeros = 0, decimal_point = 8, whitespa result = integer_part + dp + fract_part if whitespaces: result += " " * (decimal_point - len(fract_part)) - result = " " * (17 - len(result)) + result + result = " " * (15 - len(result)) + result return result def format_time(timestamp):