Newer
Older
'''
Created on 1 févr. 2014
@author: inso
'''
from cutecoin.gen_resources.mainwindow_uic import Ui_MainWindow
from PyQt5.QtWidgets import QMainWindow, QAction, QFileDialog, QProgressBar, \
QMessageBox, QLabel, QComboBox
from PyQt5.QtCore import QSignalMapper, QModelIndex, QObject, QThread, pyqtSlot, pyqtSignal
from .process_cfg_account import ProcessConfigureAccount
from .transfer import TransferMoneyDialog
from .currency_tab import CurrencyTabWidget
from .add_contact import AddContactDialog
from .import_account import ImportAccountDialog
from .certification import CertificationDialog
from .password_asker import PasswordAskerDialog
from ..tools.exceptions import NoPeerAvailable
class Loader(QObject):
def __init__(self, app):
super().__init__()
self.app = app
self.account_name = ""
loaded = pyqtSignal()
def set_account_name(self, name):
self.account_name = name
@pyqtSlot()
def load(self):
if self.account_name != "":
try:
self.app.change_current_account(self.app.get_account(self.account_name))
except requests.exceptions.RequestException as e:
self.connection_error.emit(str(e))
self.loaded.emit()
def __init__(self, app):
'''
Constructor
'''
# Set up the user interface from Designer.
self.initialized = False
self.busybar = QProgressBar(self.statusbar)
self.busybar.setMinimum(0)
self.busybar.setMaximum(0)
self.busybar.setValue(-1)
self.statusbar.addWidget(self.busybar)
self.busybar.hide()
self.combo_referential = QComboBox(self)
self.combo_referential.setEnabled(False)
self.combo_referential.currentIndexChanged.connect(self.referential_changed)
self.combo_referential.addItems(("Units", "UD",
"Units to zero", "UD to zero"))
self.status_label = QLabel("", self.statusbar)
self.statusbar.addPermanentWidget(self.status_label)
self.statusbar.addPermanentWidget(self.combo_referential)
self.loader_thread = QThread()
self.loader = Loader(self.app)
self.loader.moveToThread(self.loader_thread)
self.loader.loaded.connect(self.loader_finished)
self.loader.loaded.connect(self.loader_thread.quit)
self.loader.connection_error.connect(self.display_error)
self.setWindowTitle("CuteCoin {0}".format(__version__))
dialog = ProcessConfigureAccount(self.app, None)
dialog.accepted.connect(self.refresh)
@pyqtSlot(str)
def display_error(self, error):
QMessageBox.critical(self, ":(",
error,
QMessageBox.Ok)
@pyqtSlot(int)
def referential_changed(self, index):
if self.app.current_account:
self.app.current_account.set_display_referential(index)
self.currencies_tabwidget.currentWidget().referential_changed()
def action_change_account(self, account_name):
self.busybar.show()
self.status_label.setText("Loading account {0}".format(account_name))
self.loader.set_account_name(account_name)
self.loader_thread.start(QThread.LowPriority)
def open_transfer_money_dialog(self):
dialog = TransferMoneyDialog(self.app.current_account,
self.password_asker)
dialog.accepted.connect(self.refresh_wallets)
dialog.exec_()
currency_tab = self.currencies_tabwidget.currentWidget()
currency_tab.table_history.model().dataChanged.emit(
QModelIndex(),
QModelIndex(), ())
def open_certification_dialog(self):
dialog = CertificationDialog(self.app.current_account,
self.password_asker)
dialog.exec_()
AddContactDialog(self.app.current_account, self).exec_()
def open_configure_account_dialog(self):
dialog = ProcessConfigureAccount(self.app, self.app.current_account)
dialog.accepted.connect(self.refresh_communities)
def refresh_wallets(self):
currency_tab = self.currencies_tabwidget.currentWidget()
if currency_tab:
currency_tab.refresh_wallets()
def refresh_communities(self):
self.currencies_tabwidget.clear()
for community in self.app.current_account.communities:
tab_currency = CurrencyTabWidget(self.app, community,
self.password_asker,
self.status_label)
tab_currency.refresh()
self.currencies_tabwidget.addTab(tab_currency,
QIcon(":/icons/currency_icon"),
community.name())
def set_as_default_account(self):
self.app.default_account = self.app.current_account.name
logging.debug(self.app.current_account)
self.app.save(self.app.current_account)
self.action_set_as_default.setEnabled(False)
'''
Refresh main window
When the selected account changes, all the widgets
in the window have to be refreshed
'''
def refresh(self):
self.menu_change_account.clear()
signal_mapper = QSignalMapper(self)
for account_name in sorted(self.app.accounts.keys()):
self.menu_change_account.addAction(action)
action.triggered.connect(signal_mapper.map)
signal_mapper.mapped[str].connect(self.action_change_account)
if self.app.current_account is None:
self.menu_contacts.setEnabled(False)
self.menu_actions.setEnabled(False)
self.action_configure_parameters.setEnabled(False)
self.action_set_as_default.setEnabled(self.app.current_account.name
!= self.app.default_account)
self.password_asker = PasswordAskerDialog(self.app.current_account)
self.action_configure_parameters.setEnabled(True)
self.setWindowTitle("CuteCoin {0} - Account : {1}".format(__version__,
for community in self.app.current_account.communities:
try:
tab_currency = CurrencyTabWidget(self.app, community,
self.password_asker,
self.status_label)
tab_currency.refresh()
self.currencies_tabwidget.addTab(tab_currency,
QIcon(":/icons/currency_icon"),
community.name())
except NoPeerAvailable as e:
QMessageBox.critical(self, "Could not join {0}".format(community.currency),
str(e),
QMessageBox.Ok)
continue
except requests.exceptions.RequestException as e:
QMessageBox.critical(self, ":(",
str(e),
QMessageBox.Ok)
for contact in self.app.current_account.contacts:
self.menu_contacts_list.addAction(contact.name)
dialog = ImportAccountDialog(self.app, self)
dialog.accepted.connect(self.refresh)
dialog.exec_()
def export_account(self):
selected_file = QFileDialog.getSaveFileName(self,
"Export an account",
"",
"All account files (*.acc)")
path = ""
if selected_file[0][-4:] == ".acc":
path = selected_file[0]
else:
path = selected_file[0] + ".acc"
self.app.export_account(path, self.app.current_account)
def closeEvent(self, event):
if self.app.current_account:
self.app.save_cache(self.app.current_account)
self.loader.deleteLater()
self.loader_thread.deleteLater()
super().closeEvent(event)