commit a3790372d859add85de119aa7dc2d8a49880bb66
parent ee49d14b55d5c342272aea344d7b3b77ad076cfd
Author: ThomasV <thomasv@gitorious>
Date: Sun, 31 Aug 2014 11:42:40 +0200
@hook decorator for plugins
Diffstat:
8 files changed, 46 insertions(+), 23 deletions(-)
diff --git a/lib/plugins.py b/lib/plugins.py
@@ -29,29 +29,28 @@ def init_plugins(self):
traceback.print_exc(file=sys.stdout)
+hook_names = set()
+hooks = {}
-def run_hook(name, *args):
-
- global plugins
+def hook(func):
+ n = func.func_name
+ if n not in hook_names:
+ hook_names.add(n)
+ return func
- results = []
-
- for p in plugins:
+def run_hook(name, *args):
+ results = []
+ f_list = hooks.get(name,[])
+ for p, f in f_list:
if not p.is_enabled():
continue
-
- f = getattr(p, name, None)
- if not callable(f):
- continue
-
try:
r = f(*args)
except Exception:
print_error("Plugin error")
traceback.print_exc(file=sys.stdout)
r = False
-
if r:
results.append(r)
@@ -60,13 +59,18 @@ def run_hook(name, *args):
return results[0]
-
class BasePlugin:
def __init__(self, gui, name):
self.gui = gui
self.name = name
self.config = gui.config
+ # add self to hooks
+ for k in dir(self):
+ if k in hook_names:
+ l = hooks.get(k, [])
+ l.append((self, getattr(self, k)))
+ hooks[k] = l
def fullname(self):
return self.name
@@ -86,7 +90,6 @@ class BasePlugin:
self.init()
return self.is_enabled()
-
def enable(self):
self.set_enabled(True)
@@ -111,3 +114,4 @@ class BasePlugin:
def settings_dialog(self):
pass
+
diff --git a/plugins/btchipwallet.py b/plugins/btchipwallet.py
@@ -12,7 +12,7 @@ from electrum_gui.qt.util import ok_cancel_buttons
from electrum.account import BIP32_Account
from electrum.bitcoin import EncodeBase58Check, DecodeBase58Check, public_key_to_bc_address, bc_address_to_hash_160
from electrum.i18n import _
-from electrum.plugins import BasePlugin
+from electrum.plugins import BasePlugin, hook
from electrum.transaction import deserialize
from electrum.wallet import NewWallet
@@ -76,12 +76,15 @@ class Plugin(BasePlugin):
def enable(self):
return BasePlugin.enable(self)
+ @hook
def load_wallet(self, wallet):
self.wallet = wallet
+ @hook
def add_wallet_types(self, wallet_types):
wallet_types.append(('btchip', _("BTChip wallet"), BTChipWallet))
+ @hook
def installwizard_restore(self, wizard, storage):
wallet = BTChipWallet(storage)
try:
@@ -91,6 +94,7 @@ class Plugin(BasePlugin):
return
return wallet
+ @hook
def send_tx(self, tx):
try:
self.wallet.sign_transaction(tx, None, None)
diff --git a/plugins/coinbase_buyback.py b/plugins/coinbase_buyback.py
@@ -22,7 +22,7 @@ try:
except ImportError as e:
loaded_qweb = False
-from electrum import BasePlugin
+from electrum.plugins import BasePlugin, hook
from electrum.i18n import _, set_language
from electrum.util import user_dir
from electrum.util import appdata_dir
@@ -58,6 +58,7 @@ class Plugin(BasePlugin):
def enable(self):
return BasePlugin.enable(self)
+ @hook
def receive_tx(self, tx, wallet):
domain = wallet.get_account_addresses(None)
is_relevant, is_send, v, fee = tx.get_value(domain, wallet.prevout_values)
diff --git a/plugins/cosigner_pool.py b/plugins/cosigner_pool.py
@@ -26,7 +26,7 @@ from PyQt4.QtCore import *
from electrum import bitcoin, util
from electrum import transaction
-from electrum.plugins import BasePlugin
+from electrum.plugins import BasePlugin, hook
from electrum.i18n import _
import sys
@@ -89,6 +89,7 @@ class Plugin(BasePlugin):
def description(self):
return description
+ @hook
def init(self):
self.win = self.gui.main_window
self.win.connect(self.win, SIGNAL('cosigner:receive'), self.on_receive)
@@ -108,6 +109,7 @@ class Plugin(BasePlugin):
return True
return self.wallet.wallet_type in ['2of2', '2of3']
+ @hook
def load_wallet(self, wallet):
self.wallet = wallet
if not self.is_available():
@@ -123,12 +125,14 @@ class Plugin(BasePlugin):
else:
self.cosigner_list.append((xpub, K, _hash))
+ @hook
def transaction_dialog(self, d):
self.send_button = b = QPushButton(_("Send to cosigner"))
b.clicked.connect(lambda: self.do_send(d.tx))
d.buttons.insertWidget(2, b)
self.transaction_dialog_update(d)
+ @hook
def transaction_dialog_update(self, d):
if d.tx.is_complete():
self.send_button.hide()
diff --git a/plugins/exchange_rate.py b/plugins/exchange_rate.py
@@ -9,7 +9,7 @@ import threading
import time
import re
from decimal import Decimal
-from electrum.plugins import BasePlugin
+from electrum.plugins import BasePlugin, hook
from electrum.i18n import _
from electrum_gui.qt.util import *
from electrum_gui.qt.amountedit import AmountEdit
@@ -338,6 +338,7 @@ class Plugin(BasePlugin):
self.currencies = [self.fiat_unit()]
self.exchanges = [self.config.get('use_exchange', "Blockchain")]
+ @hook
def init(self):
self.win = self.gui.main_window
self.win.connect(self.win, SIGNAL("refresh_currencies()"), self.win.update_status)
@@ -353,6 +354,7 @@ class Plugin(BasePlugin):
self.win.emit(SIGNAL("refresh_currencies()"))
self.win.emit(SIGNAL("refresh_currencies_combo()"))
+ @hook
def get_fiat_balance_text(self, btc_balance, r):
# return balance as: 1.23 USD
r[0] = self.create_fiat_balance_text(Decimal(btc_balance) / 100000000)
@@ -364,6 +366,7 @@ class Plugin(BasePlugin):
if quote:
r[0] = "%s"%quote
+ @hook
def get_fiat_status_text(self, btc_balance, r2):
# return status as: (1.23 USD) 1 BTC~123.45 USD
text = ""
@@ -391,6 +394,7 @@ class Plugin(BasePlugin):
quote_text = "%.2f %s" % (quote_balance, quote_currency)
return quote_text
+ @hook
def load_wallet(self, wallet):
self.wallet = wallet
tx_list = {}
diff --git a/plugins/labels.py b/plugins/labels.py
@@ -16,7 +16,7 @@ import PyQt4.QtCore as QtCore
import PyQt4.QtGui as QtGui
import aes
import base64
-from electrum.plugins import BasePlugin
+from electrum.plugins import BasePlugin, hook
from electrum.i18n import _
from electrum_gui.qt import HelpButton, EnterButton
@@ -43,11 +43,12 @@ class Plugin(BasePlugin):
return decoded_message
-
+ @hook
def init(self):
self.target_host = 'labelectrum.herokuapp.com'
self.window = self.gui.main_window
+ @hook
def load_wallet(self, wallet):
self.wallet = wallet
if self.wallet.get_master_public_key():
@@ -77,6 +78,7 @@ class Plugin(BasePlugin):
def requires_settings(self):
return True
+ @hook
def set_label(self, item,label, changed):
if not changed:
return
diff --git a/plugins/trezor.py b/plugins/trezor.py
@@ -11,7 +11,7 @@ from electrum_gui.qt.util import ok_cancel_buttons, EnterButton
from electrum.account import BIP32_Account
from electrum.bitcoin import EncodeBase58Check, public_key_to_bc_address, bc_address_to_hash_160
from electrum.i18n import _
-from electrum.plugins import BasePlugin
+from electrum.plugins import BasePlugin, hook
from electrum.transaction import deserialize
from electrum.wallet import NewWallet
@@ -74,12 +74,15 @@ class Plugin(BasePlugin):
def enable(self):
return BasePlugin.enable(self)
+ @hook
def load_wallet(self, wallet):
self.wallet = wallet
+ @hook
def add_wallet_types(self, wallet_types):
wallet_types.append(('trezor', _("Trezor wallet"), TrezorWallet))
+ @hook
def installwizard_restore(self, wizard, storage):
if storage.get('wallet_type') != 'trezor':
return
@@ -91,6 +94,7 @@ class Plugin(BasePlugin):
return
return wallet
+ @hook
def send_tx(self, tx):
try:
self.wallet.sign_transaction(tx, None, None)
diff --git a/plugins/virtualkeyboard.py b/plugins/virtualkeyboard.py
@@ -1,5 +1,5 @@
from PyQt4.QtGui import *
-from electrum import BasePlugin
+from electrum.plugins import BasePlugin, hook
from electrum.i18n import _
class Plugin(BasePlugin):
@@ -15,7 +15,7 @@ class Plugin(BasePlugin):
self.vkb = None
self.vkb_index = 0
-
+ @hook
def password_dialog(self, pw, grid, pos):
vkb_button = QPushButton(_("+"))
vkb_button.setFixedWidth(20)