3 changed files with 159 additions and 90 deletions
@ -0,0 +1,100 @@ |
|||
#!/usr/bin/env python |
|||
# |
|||
# Electrum - lightweight Bitcoin client |
|||
# Copyright (C) 2015 Thomas Voegtlin |
|||
# |
|||
# This program is free software: you can redistribute it and/or modify |
|||
# it under the terms of the GNU General Public License as published by |
|||
# the Free Software Foundation, either version 3 of the License, or |
|||
# (at your option) any later version. |
|||
# |
|||
# This program is distributed in the hope that it will be useful, |
|||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
# GNU General Public License for more details. |
|||
# |
|||
# You should have received a copy of the GNU General Public License |
|||
# along with this program. If not, see <http://www.gnu.org/licenses/>. |
|||
|
|||
|
|||
import webbrowser |
|||
|
|||
from util import * |
|||
from electrum.i18n import _ |
|||
from electrum.util import format_satoshis, format_time |
|||
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]) |
|||
self.config = self.parent.config |
|||
|
|||
def update(self, h): |
|||
self.wallet = self.parent.wallet |
|||
item = self.currentItem() |
|||
current_tx = item.data(0, Qt.UserRole).toString() if item else None |
|||
self.clear() |
|||
for item in h: |
|||
tx_hash, conf, value, timestamp, balance = item |
|||
time_str = _("unknown") |
|||
if conf is None and timestamp is None: |
|||
continue # skip history in offline mode |
|||
if conf > 0: |
|||
time_str = format_time(timestamp) |
|||
if conf == -1: |
|||
time_str = 'unverified' |
|||
icon = QIcon(":icons/unconfirmed.png") |
|||
elif conf == 0: |
|||
time_str = 'pending' |
|||
icon = QIcon(":icons/unconfirmed.png") |
|||
elif conf < 6: |
|||
icon = QIcon(":icons/clock%d.png"%conf) |
|||
else: |
|||
icon = QIcon(":icons/confirmed.png") |
|||
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( [ '', time_str, label, v_str, balance_str] ) |
|||
item.setFont(2, QFont(MONOSPACE_FONT)) |
|||
item.setFont(3, QFont(MONOSPACE_FONT)) |
|||
item.setFont(4, QFont(MONOSPACE_FONT)) |
|||
if value < 0: |
|||
item.setForeground(3, QBrush(QColor("#BC1E1E"))) |
|||
if tx_hash: |
|||
item.setData(0, Qt.UserRole, tx_hash) |
|||
if is_default_label: |
|||
item.setForeground(2, QBrush(QColor('grey'))) |
|||
item.setIcon(0, icon) |
|||
self.insertTopLevelItem(0, item) |
|||
if current_tx == tx_hash: |
|||
self.setCurrentItem(item) |
|||
|
|||
run_hook('history_tab_update') |
|||
|
|||
|
|||
def create_menu(self, position): |
|||
self.selectedIndexes() |
|||
item = self.currentItem() |
|||
be = self.config.get('block_explorer', 'Blockchain.info') |
|||
if be == 'Blockchain.info': |
|||
block_explorer = 'https://blockchain.info/tx/' |
|||
elif be == 'Blockr.io': |
|||
block_explorer = 'https://blockr.io/tx/info/' |
|||
elif be == 'Insight.is': |
|||
block_explorer = 'http://live.insight.is/tx/' |
|||
elif be == "Blocktrail.com": |
|||
block_explorer = 'https://www.blocktrail.com/BTC/tx/' |
|||
if not item: |
|||
return |
|||
tx_hash = str(item.data(0, Qt.UserRole).toString()) |
|||
if not tx_hash: |
|||
return |
|||
menu = QMenu() |
|||
menu.addAction(_("Copy ID to Clipboard"), lambda: self.parent.app.clipboard().setText(tx_hash)) |
|||
menu.addAction(_("Details"), lambda: self.parent.show_transaction(self.wallet.transactions.get(tx_hash))) |
|||
menu.addAction(_("Edit description"), lambda: self.edit_label(item, 2)) |
|||
menu.addAction(_("View on block explorer"), lambda: webbrowser.open(block_explorer + tx_hash)) |
|||
menu.exec_(self.viewport().mapToGlobal(position)) |
|||
|
Loading…
Reference in new issue