From deae28809e4369352588ddc10df426ae0c8f66e6 Mon Sep 17 00:00:00 2001 From: Maran Date: Sun, 12 Aug 2012 21:28:39 +0200 Subject: [PATCH 1/8] Updated setup script --- setup.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/setup.py b/setup.py index 770c59af..1a92365d 100644 --- a/setup.py +++ b/setup.py @@ -29,10 +29,7 @@ if platform.system() != 'Windows' and platform.system() != 'Darwin': data_files += [ (util.appdata_dir(), ["data/background.png", "data/style.css"]), (os.path.join(util.appdata_dir(), "icons"), [ - "data/icons/accounts.png", "data/icons/confirmed.png", - "data/icons/expand.png", - "data/icons/interact.png", "data/icons/unconfirmed.png" ]) ] @@ -62,7 +59,7 @@ setup(name = "Electrum", author = "thomasv", author_email = "thomasv@gitorious", license = "GNU GPLv3", - url = "http://ecdsa/electrum", + url = "http://electrum-desktop.com", long_description = """Lightweight Bitcoin Wallet""" ) From 1a26fa87d31e0556c9852bf8217ba365b713b088 Mon Sep 17 00:00:00 2001 From: Amir Taaki Date: Sun, 12 Aug 2012 20:25:31 +0100 Subject: [PATCH 2/8] Rename main menu to 'Bitcoin' from 'Electrum'. --- lib/gui_lite.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/lib/gui_lite.py b/lib/gui_lite.py index 6f3ebce2..f86c53a7 100644 --- a/lib/gui_lite.py +++ b/lib/gui_lite.py @@ -175,20 +175,20 @@ class MiniWindow(QDialog): main_layout.addWidget(self.send_button, 2, 1) menubar = QMenuBar() - electrum_menu = menubar.addMenu(_("&Electrum")) - #electrum_menu.addMenu(_("&Servers")) - #electrum_menu.addSeparator() + electrum_menu = menubar.addMenu(_("&Bitcoin")) + electrum_menu.addMenu(_("&Servers")) + electrum_menu.addSeparator() electrum_menu.addAction(_("&Quit")) view_menu = menubar.addMenu(_("&View")) expert_gui = view_menu.addAction(_("&Pro Mode")) self.connect(expert_gui, SIGNAL("triggered()"), expand_callback) - #view_menu.addMenu(_("&Themes")) - #view_menu.addSeparator() - #view_menu.addAction(_("Show History")) + view_menu.addMenu(_("&Themes")) + view_menu.addSeparator() + view_menu.addAction(_("Show History")) - #settings_menu = menubar.addMenu(_("&Settings")) - #settings_menu.addAction(_("&Configure Electrum")) + settings_menu = menubar.addMenu(_("&Settings")) + settings_menu.addAction(_("&Configure Electrum")) help_menu = menubar.addMenu(_("&Help")) help_menu.addAction(_("&Contents")) From b952a96b4115310fe0012e50e91f14fc0e12f087 Mon Sep 17 00:00:00 2001 From: Amir Taaki Date: Sun, 12 Aug 2012 21:17:43 +0100 Subject: [PATCH 3/8] Added history to lite view. --- lib/gui_lite.py | 26 +++++++++++++++++++++++++- lib/history_widget.py | 19 +++++++++++++++++++ lib/wallet.py | 3 +++ 3 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 lib/history_widget.py diff --git a/lib/gui_lite.py b/lib/gui_lite.py index f86c53a7..cc2b657a 100644 --- a/lib/gui_lite.py +++ b/lib/gui_lite.py @@ -12,6 +12,7 @@ import sys import time import wallet import webbrowser +import history_widget try: import lib.gui_qt as gui_qt @@ -174,6 +175,10 @@ class MiniWindow(QDialog): main_layout.addWidget(self.amount_input, 2, 0) main_layout.addWidget(self.send_button, 2, 1) + self.history_list = history_widget.HistoryWidget() + self.history_list.hide() + main_layout.addWidget(self.history_list, 3, 0, 1, -1) + menubar = QMenuBar() electrum_menu = menubar.addMenu(_("&Bitcoin")) electrum_menu.addMenu(_("&Servers")) @@ -185,7 +190,9 @@ class MiniWindow(QDialog): self.connect(expert_gui, SIGNAL("triggered()"), expand_callback) view_menu.addMenu(_("&Themes")) view_menu.addSeparator() - view_menu.addAction(_("Show History")) + show_history = view_menu.addAction(_("Show History")) + show_history.setCheckable(True) + self.connect(show_history, SIGNAL("toggled(bool)"), self.show_history) settings_menu = menubar.addMenu(_("&Settings")) settings_menu.addAction(_("&Configure Electrum")) @@ -320,6 +327,12 @@ class MiniWindow(QDialog): def update_completions(self, completions): self.address_completions.setStringList(completions) + def update_history(self, tx_history): + for tx in tx_history[-10:]: + address = tx["dest_address"] + amount = D(tx["value"]) / 10**8 + self.history_list.append(address, amount) + def acceptbit(self): self.actuator.acceptbit(self.quote_currencies[0]) @@ -331,6 +344,12 @@ class MiniWindow(QDialog): QMessageBox.information(self, "Electrum - " + _("Reporting Bugs"), _("Email bug reports to %s") % "genjix" + "@" + "riseup.net") + def show_history(self, toggle_state): + if toggle_state: + self.history_list.show() + else: + self.history_list.hide() + class BalanceLabel(QLabel): SHOW_CONNECTING = 1 @@ -576,6 +595,7 @@ class MiniDriver(QObject): if self.wallet.up_to_date: self.update_balance() self.update_completions() + self.update_history() def initializing(self): if self.state == self.INITIALIZING: @@ -614,6 +634,10 @@ class MiniDriver(QObject): completions = completions + self.wallet.aliases.keys() self.window.update_completions(completions) + def update_history(self): + tx_history = self.wallet.get_tx_history() + self.window.update_history(tx_history) + if __name__ == "__main__": app = QApplication(sys.argv) with open(rsrc("style.css")) as style_file: diff --git a/lib/history_widget.py b/lib/history_widget.py new file mode 100644 index 00000000..946490cc --- /dev/null +++ b/lib/history_widget.py @@ -0,0 +1,19 @@ +from PyQt4.QtGui import * +from i18n import _ + +class HistoryWidget(QTreeWidget): + + def __init__(self, parent=None): + QTreeWidget.__init__(self, parent) + self.setColumnCount(2) + self.setHeaderLabels([_("Amount"), _("To / From")]) + self.setIndentation(0) + + def append(self, address, amount): + if amount >= 0: + display_amount = "+%s" % amount + else: + display_amount = "-%s" % (-amount) + item = QTreeWidgetItem([display_amount, address]) + self.insertTopLevelItem(0, item) + diff --git a/lib/wallet.py b/lib/wallet.py index d5b487ed..9c51df16 100644 --- a/lib/wallet.py +++ b/lib/wallet.py @@ -897,6 +897,7 @@ class Wallet: default_label = 'to: ' + dest_label else: default_label = 'to: ' + o_addr + dest_address = o_addr else: for o_addr in tx['outputs']: if self.is_mine(o_addr) and not self.is_change(o_addr): @@ -914,8 +915,10 @@ class Wallet: default_label = 'at: ' + dest_label else: default_label = 'at: ' + o_addr + dest_address = o_addr tx['default_label'] = default_label + tx['dest_address'] = dest_address def mktx(self, to_address, amount, label, password, fee=None, change_addr=None, from_addr= None): if not self.is_valid(to_address): From 5c43cee3f3e091779f7b11818c28effcb4bdd05f Mon Sep 17 00:00:00 2001 From: Amir Taaki Date: Sun, 12 Aug 2012 21:23:26 +0100 Subject: [PATCH 4/8] Add CSS styling to history view to make text lighter coloured. --- data/style.css | 6 ++++++ lib/gui_lite.py | 1 + 2 files changed, 7 insertions(+) diff --git a/data/style.css b/data/style.css index bb7e1bbd..ffc9bb49 100644 --- a/data/style.css +++ b/data/style.css @@ -77,3 +77,9 @@ MiniWindow QPushButton { { color: #333; } + +#history::item +{ + color: #888; +} + diff --git a/lib/gui_lite.py b/lib/gui_lite.py index cc2b657a..8834fa1a 100644 --- a/lib/gui_lite.py +++ b/lib/gui_lite.py @@ -176,6 +176,7 @@ class MiniWindow(QDialog): main_layout.addWidget(self.send_button, 2, 1) self.history_list = history_widget.HistoryWidget() + self.history_list.setObjectName("history") self.history_list.hide() main_layout.addWidget(self.history_list, 3, 0, 1, -1) From 46419a0457eb69e37749ccda3dc9afe75a21a3c4 Mon Sep 17 00:00:00 2001 From: Amir Taaki Date: Sun, 12 Aug 2012 21:28:26 +0100 Subject: [PATCH 5/8] alternating row colours for history. --- lib/gui_lite.py | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/gui_lite.py b/lib/gui_lite.py index 8834fa1a..617ad67f 100644 --- a/lib/gui_lite.py +++ b/lib/gui_lite.py @@ -178,6 +178,7 @@ class MiniWindow(QDialog): self.history_list = history_widget.HistoryWidget() self.history_list.setObjectName("history") self.history_list.hide() + self.history_list.setAlternatingRowColors(True) main_layout.addWidget(self.history_list, 3, 0, 1, -1) menubar = QMenuBar() From 5ff2c45a563e07d995d69642bdda2941621306a2 Mon Sep 17 00:00:00 2001 From: Amir Taaki Date: Sun, 12 Aug 2012 21:31:04 +0100 Subject: [PATCH 6/8] Added report_bug and show_about hooks for menu. --- lib/gui_lite.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/gui_lite.py b/lib/gui_lite.py index 617ad67f..5532d7a2 100644 --- a/lib/gui_lite.py +++ b/lib/gui_lite.py @@ -202,8 +202,10 @@ class MiniWindow(QDialog): help_menu = menubar.addMenu(_("&Help")) help_menu.addAction(_("&Contents")) help_menu.addSeparator() - help_menu.addAction(_("&Report Bug")) - help_menu.addAction(_("&About")) + report_bug = help_menu.addAction(_("&Report Bug")) + self.connect(report_bug, SIGNAL("triggered()"), self.show_report_bug) + show_about = help_menu.addAction(_("&About")) + self.connect(show_about, SIGNAL("triggered()"), self.show_about) main_layout.setMenuBar(menubar) quit_shortcut = QShortcut(QKeySequence("Ctrl+Q"), self) From a61d1ad44bea6b9b109da243bdab5490d992cdbc Mon Sep 17 00:00:00 2001 From: Amir Taaki Date: Sun, 12 Aug 2012 21:48:51 +0100 Subject: [PATCH 7/8] open electrum-desktop.com website instead of manual. --- lib/gui_lite.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/gui_lite.py b/lib/gui_lite.py index 5532d7a2..22106ffb 100644 --- a/lib/gui_lite.py +++ b/lib/gui_lite.py @@ -200,7 +200,8 @@ class MiniWindow(QDialog): settings_menu.addAction(_("&Configure Electrum")) help_menu = menubar.addMenu(_("&Help")) - help_menu.addAction(_("&Contents")) + the_website = help_menu.addAction(_("&Website")) + self.connect(the_website, SIGNAL("triggered()"), self.the_website) help_menu.addSeparator() report_bug = help_menu.addAction(_("&Report Bug")) self.connect(report_bug, SIGNAL("triggered()"), self.show_report_bug) @@ -340,6 +341,9 @@ class MiniWindow(QDialog): def acceptbit(self): self.actuator.acceptbit(self.quote_currencies[0]) + def the_website(self): + webbrowser.open("http://electrum-desktop.com") + def show_about(self): QMessageBox.about(self, "Electrum", _("Electrum's focus is speed, with low resource usage and simplifying Bitcoin. You do not need to perform regular backups, because your wallet can be recovered from a secret phrase that you can memorize or write on paper. Startup times are instant because it operates in conjuction with high-performance servers that handle the most complicated parts of the Bitcoin system.")) From c506139e686c9fd7845b3bcec3e23810aaad22d8 Mon Sep 17 00:00:00 2001 From: Amir Taaki Date: Sun, 12 Aug 2012 21:52:28 +0100 Subject: [PATCH 8/8] use labels for to/from in lite history where available. --- lib/gui_lite.py | 2 +- lib/gui_qt.py | 2 +- lib/wallet.py | 20 ++++++++------------ 3 files changed, 10 insertions(+), 14 deletions(-) diff --git a/lib/gui_lite.py b/lib/gui_lite.py index 22106ffb..67ccdc8e 100644 --- a/lib/gui_lite.py +++ b/lib/gui_lite.py @@ -334,7 +334,7 @@ class MiniWindow(QDialog): def update_history(self, tx_history): for tx in tx_history[-10:]: - address = tx["dest_address"] + address = tx["default_label"] amount = D(tx["value"]) / 10**8 self.history_list.append(address, amount) diff --git a/lib/gui_qt.py b/lib/gui_qt.py index 4b6214d2..d8f26fc5 100644 --- a/lib/gui_qt.py +++ b/lib/gui_qt.py @@ -291,7 +291,7 @@ class ElectrumWindow(QMainWindow): l.setColumnWidth(2, 350) l.setColumnWidth(3, 140) l.setColumnWidth(4, 140) - l.setHeaderLabels( [ '', _( 'Date' ), _( 'Description' ) , _('Amount'), _('Balance')] ) + l.setHeaderLabels( [ '', _( 'Date' ), _( 'To / From' ) , _('Amount'), _('Balance')] ) self.connect(l, SIGNAL('itemDoubleClicked(QTreeWidgetItem*, int)'), self.tx_label_clicked) self.connect(l, SIGNAL('itemChanged(QTreeWidgetItem*, int)'), self.tx_label_changed) l.setContextMenuPolicy(Qt.CustomContextMenu) diff --git a/lib/wallet.py b/lib/wallet.py index 9c51df16..fcc846e8 100644 --- a/lib/wallet.py +++ b/lib/wallet.py @@ -892,12 +892,10 @@ class Wallet: if tx['value']<0: for o_addr in tx['outputs']: if not self.is_mine(o_addr): - dest_label = self.labels.get(o_addr) - if dest_label: - default_label = 'to: ' + dest_label - else: - default_label = 'to: ' + o_addr - dest_address = o_addr + try: + default_label = self.labels[o_addr] + except KeyError: + default_label = o_addr else: for o_addr in tx['outputs']: if self.is_mine(o_addr) and not self.is_change(o_addr): @@ -911,14 +909,12 @@ class Wallet: if o_addr: dest_label = self.labels.get(o_addr) - if dest_label: - default_label = 'at: ' + dest_label - else: - default_label = 'at: ' + o_addr - dest_address = o_addr + try: + default_label = self.labels[o_addr] + except KeyError: + default_label = o_addr tx['default_label'] = default_label - tx['dest_address'] = dest_address def mktx(self, to_address, amount, label, password, fee=None, change_addr=None, from_addr= None): if not self.is_valid(to_address):