diff --git a/src/cutecoin/core/account.py b/src/cutecoin/core/account.py index 051596b6eec2be78e45c0cca2db66c982652f3a6..8bb903d0a39736d685d43143dc3fd754c405b09e 100644 --- a/src/cutecoin/core/account.py +++ b/src/cutecoin/core/account.py @@ -15,6 +15,8 @@ from ucoinpy.key import SigningKey import logging import time +from PyQt5.QtCore import QObject, pyqtSignal, Qt + from .wallet import Wallet from .community import Community from .person import Person @@ -44,7 +46,7 @@ def relative_zerosum(units, community): return relative_value - relative_median -class Account(object): +class Account(QObject): ''' An account is specific to a key. @@ -59,11 +61,14 @@ class Account(object): relative, 'ud {0}') } + loading_progressed = pyqtSignal(int, int) + def __init__(self, salt, pubkey, name, communities, wallets, contacts, dead_communities): ''' Constructor ''' + super().__init__() self.salt = salt self.pubkey = pubkey self.name = name @@ -134,9 +139,18 @@ class Account(object): return community def refresh_cache(self): + loaded_wallets = 0 + + def progressing(value, maximum): + account_value = maximum * len(self.communities) * loaded_wallets + value + account_max = maximum * len(self.communities) * len(self.wallets) + self.loading_progressed.emit(account_value, account_max) + for w in self.wallets: + w.refresh_progressed.connect(progressing, type=Qt.DirectConnection) for c in self.communities: w.refresh_cache(c) + loaded_wallets = loaded_wallets + 1 def set_display_referential(self, index): self.referential = index diff --git a/src/cutecoin/core/app.py b/src/cutecoin/core/app.py index 47ef017f32351683bc40f4e108f1e7e9c037cb9a..33e853dbcb9db345f25d8f97f03735da3a805e43 100644 --- a/src/cutecoin/core/app.py +++ b/src/cutecoin/core/app.py @@ -10,23 +10,28 @@ import json import tarfile import shutil +from PyQt5.QtCore import QObject, pyqtSignal + from . import config -from ..tools.exceptions import NameAlreadyExists, BadAccountFile, KeyAlreadyUsed +from ..tools.exceptions import NameAlreadyExists, BadAccountFile from .account import Account from .. import __version__ -class Application(object): +class Application(QObject): ''' Managing core application datas : Accounts list and general configuration ''' + loading_progressed = pyqtSignal(int, int) + def __init__(self, argv): ''' Constructor ''' + super().__init__() self.accounts = {} self.default_account = "" self.current_account = None @@ -61,9 +66,12 @@ class Application(object): self.current_account = None def change_current_account(self, account): + def progressing(value, maximum): + self.loading_progressed.emit(value, maximum) + if self.current_account is not None: self.save_cache(self.current_account) - + account.loading_progressed.connect(progressing) account.refresh_cache() self.current_account = account @@ -110,8 +118,6 @@ class Application(object): wallet.load_caches(data) else: os.remove(wallet_path) - for community in account.communities: - wallet.refresh_cache(community) def save(self, account): with open(config.parameters['data'], 'w') as outfile: diff --git a/src/cutecoin/core/wallet.py b/src/cutecoin/core/wallet.py index dcdbbc36cc23e757a39b2f558b0386f4e4f40400..037b72cc9680eecc85fbe360c48cb738f2f0fe4d 100644 --- a/src/cutecoin/core/wallet.py +++ b/src/cutecoin/core/wallet.py @@ -9,8 +9,12 @@ from ucoinpy.api import bma from ucoinpy.documents.block import Block from ucoinpy.documents.transaction import InputSource, OutputSource, Transaction from ucoinpy.key import SigningKey + from ..tools.exceptions import NotEnoughMoneyError, NoPeerAvailable -from cutecoin.core.transfer import Transfer, Received +from .transfer import Transfer, Received + +from PyQt5.QtCore import QObject, pyqtSignal + import logging @@ -74,6 +78,7 @@ class Cache(): current_block + 1)) parsed_blocks = [n for n in parsed_blocks if n in with_tx['result']['blocks']] + self.wallet.refresh_progressed.emit(self.latest_block, current_block) for block_number in parsed_blocks: block = community.request(bma.blockchain.Block, @@ -124,6 +129,9 @@ class Cache(): metadata['amount'] = amount self._transfers.append(Received(tx, metadata.copy())) + logging.debug("Receivers : {0}".format(self.wallet.receivers(self.wallet.refresh_progressed))) + self.wallet.refresh_progressed.emit(current_block - block_number, + current_block - self.latest_block) if current_block > self.latest_block: self.available_sources = self.wallet.sources(community) @@ -136,15 +144,18 @@ class Cache(): self.latest_block = current_block -class Wallet(object): +class Wallet(QObject): ''' A wallet is used to manage money with a unique key. ''' + refresh_progressed = pyqtSignal(int, int) + def __init__(self, walletid, pubkey, name): ''' Constructor ''' + super().__init__() self.coins = [] self.walletid = walletid self.pubkey = pubkey diff --git a/src/cutecoin/gui/mainwindow.py b/src/cutecoin/gui/mainwindow.py index e2d776610600a9cce4320ba8e2e0455dd562749d..90d7c29db88cc8dfa782437527ec428aca9dbec9 100644 --- a/src/cutecoin/gui/mainwindow.py +++ b/src/cutecoin/gui/mainwindow.py @@ -41,7 +41,8 @@ class Loader(QObject): def load(self): if self.account_name != "": try: - self.app.change_current_account(self.app.get_account(self.account_name)) + account = self.app.get_account(self.account_name) + self.app.change_current_account(account) except requests.exceptions.RequestException as e: self.connection_error.emit(str(e)) self.loaded.emit() @@ -65,6 +66,7 @@ class MainWindow(QMainWindow, Ui_MainWindow): self.app = app self.password_asker = None self.initialized = False + self.busybar = QProgressBar(self.statusbar) self.busybar.setMinimum(0) self.busybar.setMaximum(0) @@ -104,6 +106,7 @@ class MainWindow(QMainWindow, Ui_MainWindow): def loader_finished(self): self.refresh() self.busybar.hide() + self.app.disconnect() @pyqtSlot(str) def display_error(self, error): @@ -144,6 +147,11 @@ class MainWindow(QMainWindow, Ui_MainWindow): self.window().refresh_contacts() def action_change_account(self, account_name): + def loading_progressed(value, maximum): + logging.debug("Busybar : {:} : {:}".format(value, maximum)) + self.busybar.setValue(value) + self.busybar.setMaximum(maximum) + self.app.loading_progressed.connect(loading_progressed) self.busybar.show() self.status_label.setText("Loading account {0}".format(account_name)) self.loader.set_account_name(account_name)