Merged history from master
This commit is contained in:
commit
0363f21c32
|
@ -77,3 +77,9 @@ MiniWindow QPushButton {
|
||||||
{
|
{
|
||||||
color: #333;
|
color: #333;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#history::item
|
||||||
|
{
|
||||||
|
color: #888;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -12,6 +12,7 @@ import sys
|
||||||
import time
|
import time
|
||||||
import wallet
|
import wallet
|
||||||
import webbrowser
|
import webbrowser
|
||||||
|
import history_widget
|
||||||
|
|
||||||
try:
|
try:
|
||||||
import lib.gui_qt as gui_qt
|
import lib.gui_qt as gui_qt
|
||||||
|
@ -174,16 +175,33 @@ class MiniWindow(QDialog):
|
||||||
main_layout.addWidget(self.amount_input, 2, 0)
|
main_layout.addWidget(self.amount_input, 2, 0)
|
||||||
main_layout.addWidget(self.send_button, 2, 1)
|
main_layout.addWidget(self.send_button, 2, 1)
|
||||||
|
|
||||||
|
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()
|
menubar = QMenuBar()
|
||||||
electrum_menu = menubar.addMenu(_("&Bitcoin"))
|
electrum_menu = menubar.addMenu(_("&Bitcoin"))
|
||||||
#electrum_menu.addMenu(_("&Servers"))
|
|
||||||
#electrum_menu.addSeparator()
|
|
||||||
electrum_menu.addAction(_("&Quit"))
|
electrum_menu.addAction(_("&Quit"))
|
||||||
|
|
||||||
view_menu = menubar.addMenu(_("&View"))
|
view_menu = menubar.addMenu(_("&View"))
|
||||||
expert_gui = view_menu.addAction(_("&Pro Mode"))
|
expert_gui = view_menu.addAction(_("&Pro Mode"))
|
||||||
self.connect(expert_gui, SIGNAL("triggered()"), expand_callback)
|
self.connect(expert_gui, SIGNAL("triggered()"), expand_callback)
|
||||||
|
|
||||||
|
show_history = view_menu.addAction(_("Show History"))
|
||||||
|
show_history.setCheckable(True)
|
||||||
|
self.connect(show_history, SIGNAL("toggled(bool)"), self.show_history)
|
||||||
|
|
||||||
|
help_menu = menubar.addMenu(_("&Help"))
|
||||||
|
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)
|
||||||
|
show_about = help_menu.addAction(_("&About"))
|
||||||
|
self.connect(show_about, SIGNAL("triggered()"), self.show_about)
|
||||||
|
|
||||||
main_layout.setMenuBar(menubar)
|
main_layout.setMenuBar(menubar)
|
||||||
|
|
||||||
quit_shortcut = QShortcut(QKeySequence("Ctrl+Q"), self)
|
quit_shortcut = QShortcut(QKeySequence("Ctrl+Q"), self)
|
||||||
|
@ -309,9 +327,18 @@ class MiniWindow(QDialog):
|
||||||
def update_completions(self, completions):
|
def update_completions(self, completions):
|
||||||
self.address_completions.setStringList(completions)
|
self.address_completions.setStringList(completions)
|
||||||
|
|
||||||
|
def update_history(self, tx_history):
|
||||||
|
for tx in tx_history[-10:]:
|
||||||
|
address = tx["default_label"]
|
||||||
|
amount = D(tx["value"]) / 10**8
|
||||||
|
self.history_list.append(address, amount)
|
||||||
|
|
||||||
def acceptbit(self):
|
def acceptbit(self):
|
||||||
self.actuator.acceptbit(self.quote_currencies[0])
|
self.actuator.acceptbit(self.quote_currencies[0])
|
||||||
|
|
||||||
|
def the_website(self):
|
||||||
|
webbrowser.open("http://electrum-desktop.com")
|
||||||
|
|
||||||
def show_about(self):
|
def show_about(self):
|
||||||
QMessageBox.about(self, "Electrum",
|
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."))
|
_("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."))
|
||||||
|
@ -320,6 +347,12 @@ class MiniWindow(QDialog):
|
||||||
QMessageBox.information(self, "Electrum - " + _("Reporting Bugs"),
|
QMessageBox.information(self, "Electrum - " + _("Reporting Bugs"),
|
||||||
_("Email bug reports to %s") % "genjix" + "@" + "riseup.net")
|
_("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):
|
class BalanceLabel(QLabel):
|
||||||
|
|
||||||
SHOW_CONNECTING = 1
|
SHOW_CONNECTING = 1
|
||||||
|
@ -565,6 +598,7 @@ class MiniDriver(QObject):
|
||||||
if self.wallet.up_to_date:
|
if self.wallet.up_to_date:
|
||||||
self.update_balance()
|
self.update_balance()
|
||||||
self.update_completions()
|
self.update_completions()
|
||||||
|
self.update_history()
|
||||||
|
|
||||||
def initializing(self):
|
def initializing(self):
|
||||||
if self.state == self.INITIALIZING:
|
if self.state == self.INITIALIZING:
|
||||||
|
@ -603,6 +637,10 @@ class MiniDriver(QObject):
|
||||||
completions = completions + self.wallet.aliases.keys()
|
completions = completions + self.wallet.aliases.keys()
|
||||||
self.window.update_completions(completions)
|
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__":
|
if __name__ == "__main__":
|
||||||
app = QApplication(sys.argv)
|
app = QApplication(sys.argv)
|
||||||
with open(rsrc("style.css")) as style_file:
|
with open(rsrc("style.css")) as style_file:
|
||||||
|
|
|
@ -291,7 +291,7 @@ class ElectrumWindow(QMainWindow):
|
||||||
l.setColumnWidth(2, 350)
|
l.setColumnWidth(2, 350)
|
||||||
l.setColumnWidth(3, 140)
|
l.setColumnWidth(3, 140)
|
||||||
l.setColumnWidth(4, 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('itemDoubleClicked(QTreeWidgetItem*, int)'), self.tx_label_clicked)
|
||||||
self.connect(l, SIGNAL('itemChanged(QTreeWidgetItem*, int)'), self.tx_label_changed)
|
self.connect(l, SIGNAL('itemChanged(QTreeWidgetItem*, int)'), self.tx_label_changed)
|
||||||
l.setContextMenuPolicy(Qt.CustomContextMenu)
|
l.setContextMenuPolicy(Qt.CustomContextMenu)
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -892,11 +892,10 @@ class Wallet:
|
||||||
if tx['value']<0:
|
if tx['value']<0:
|
||||||
for o_addr in tx['outputs']:
|
for o_addr in tx['outputs']:
|
||||||
if not self.is_mine(o_addr):
|
if not self.is_mine(o_addr):
|
||||||
dest_label = self.labels.get(o_addr)
|
try:
|
||||||
if dest_label:
|
default_label = self.labels[o_addr]
|
||||||
default_label = 'to: ' + dest_label
|
except KeyError:
|
||||||
else:
|
default_label = o_addr
|
||||||
default_label = 'to: ' + o_addr
|
|
||||||
else:
|
else:
|
||||||
for o_addr in tx['outputs']:
|
for o_addr in tx['outputs']:
|
||||||
if self.is_mine(o_addr) and not self.is_change(o_addr):
|
if self.is_mine(o_addr) and not self.is_change(o_addr):
|
||||||
|
@ -910,10 +909,10 @@ class Wallet:
|
||||||
|
|
||||||
if o_addr:
|
if o_addr:
|
||||||
dest_label = self.labels.get(o_addr)
|
dest_label = self.labels.get(o_addr)
|
||||||
if dest_label:
|
try:
|
||||||
default_label = 'at: ' + dest_label
|
default_label = self.labels[o_addr]
|
||||||
else:
|
except KeyError:
|
||||||
default_label = 'at: ' + o_addr
|
default_label = o_addr
|
||||||
|
|
||||||
tx['default_label'] = default_label
|
tx['default_label'] = default_label
|
||||||
|
|
||||||
|
|
5
setup.py
5
setup.py
|
@ -29,10 +29,7 @@ if platform.system() != 'Windows' and platform.system() != 'Darwin':
|
||||||
data_files += [
|
data_files += [
|
||||||
(util.appdata_dir(), ["data/background.png", "data/style.css"]),
|
(util.appdata_dir(), ["data/background.png", "data/style.css"]),
|
||||||
(os.path.join(util.appdata_dir(), "icons"), [
|
(os.path.join(util.appdata_dir(), "icons"), [
|
||||||
"data/icons/accounts.png",
|
|
||||||
"data/icons/confirmed.png",
|
"data/icons/confirmed.png",
|
||||||
"data/icons/expand.png",
|
|
||||||
"data/icons/interact.png",
|
|
||||||
"data/icons/unconfirmed.png"
|
"data/icons/unconfirmed.png"
|
||||||
])
|
])
|
||||||
]
|
]
|
||||||
|
@ -62,7 +59,7 @@ setup(name = "Electrum",
|
||||||
author = "thomasv",
|
author = "thomasv",
|
||||||
author_email = "thomasv@gitorious",
|
author_email = "thomasv@gitorious",
|
||||||
license = "GNU GPLv3",
|
license = "GNU GPLv3",
|
||||||
url = "http://ecdsa/electrum",
|
url = "http://electrum-desktop.com",
|
||||||
long_description = """Lightweight Bitcoin Wallet"""
|
long_description = """Lightweight Bitcoin Wallet"""
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue