diff --git a/res/ui/informations_tab.ui b/res/ui/informations_tab.ui index bacf3de57d0b1825f0daf2e6f96fa158a9557d1d..95281ec61ec9124cd8efd5d8ef546cf2f5b2cac6 100644 --- a/res/ui/informations_tab.ui +++ b/res/ui/informations_tab.ui @@ -91,15 +91,15 @@ QGroupBox::title { </widget> </item> <item> - <widget class="QGroupBox" name="group_wot"> + <widget class="QGroupBox" name="group_rules"> <property name="title"> - <string>WoT</string> + <string>Rules</string> </property> - <layout class="QVBoxLayout" name="verticalLayout_4"> + <layout class="QVBoxLayout" name="verticalLayout_6"> <item> - <widget class="QLabel" name="label_wot"> + <widget class="QLabel" name="label_rules"> <property name="text"> - <string>label_wot</string> + <string>label_rules</string> </property> <property name="alignment"> <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set> @@ -110,15 +110,15 @@ QGroupBox::title { </widget> </item> <item> - <widget class="QGroupBox" name="group_rules"> + <widget class="QGroupBox" name="group_wot"> <property name="title"> - <string>Rules</string> + <string>WoT</string> </property> - <layout class="QVBoxLayout" name="verticalLayout_6"> + <layout class="QVBoxLayout" name="verticalLayout_4"> <item> - <widget class="QLabel" name="label_rules"> + <widget class="QLabel" name="label_wot"> <property name="text"> - <string>label_rules</string> + <string>label_wot</string> </property> <property name="alignment"> <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set> diff --git a/src/cutecoin/core/transfer.py b/src/cutecoin/core/transfer.py index 0eebedf50665b1c68e20624868cd0fdced1a2578..abd3b1ffeb1cce1846a38ae0e834d7edef028c33 100644 --- a/src/cutecoin/core/transfer.py +++ b/src/cutecoin/core/transfer.py @@ -79,18 +79,14 @@ class Transfer(object): self._metadata['time'] = community.get_block().mediantime def check_registered(self, tx, block, time): - logging.debug("REGISTERED : BEFORE : {0}".format(self._metadata)) if tx.signed_raw() == self.txdoc.signed_raw(): self.state = Transfer.VALIDATED self._metadata['block'] = block self._metadata['time'] = time - logging.debug("REGISTERED : AFTER : {0}".format(self._metadata)) def check_refused(self, block): - logging.debug("REFUSED : BEFORE : {0}".format(self._metadata)) if block > self._metadata['block'] + 15: self.state = Transfer.REFUSED - logging.debug("REFUSED : AFTER : {0}".format(self._metadata)) def drop(self): self.state = Transfer.DROPPED diff --git a/src/cutecoin/gui/currency_tab.py b/src/cutecoin/gui/currency_tab.py index 6e719290c68423703a5aeabe566d3f45ac9b0b3a..ef3e74bc950eab7b29a2163b60fe36cf00ecc7ba 100644 --- a/src/cutecoin/gui/currency_tab.py +++ b/src/cutecoin/gui/currency_tab.py @@ -10,7 +10,7 @@ import requests from ucoinpy.api import bma from PyQt5.QtWidgets import QWidget, QMenu, QAction, QApplication, \ - QMessageBox, QDialog, QAbstractItemView + QMessageBox, QDialog, QAbstractItemView, QHeaderView from PyQt5.QtCore import QModelIndex, Qt, pyqtSlot, QObject, \ QThread, pyqtSignal, QDateTime from PyQt5.QtGui import QIcon @@ -92,6 +92,25 @@ class CurrencyTabWidget(QWidget, Ui_CurrencyTabWidget): self.watcher_thread.start() + person = Person.lookup(self.app.current_account.pubkey, self.community) + join_block = person.membership(self.community).block_number + join_date = self.community.get_block(join_block).mediantime + parameters = self.community.get_parameters() + expiration_date = join_date + parameters['sigValidity'] + current_time = time.time() + sig_validity = self.community.get_parameters()['sigValidity'] + warning_expiration_time = int(sig_validity / 3) + will_expire_soon = (current_time > expiration_date - warning_expiration_time) + + if will_expire_soon: + days = QDateTime().currentDateTime().daysTo(QDateTime.fromTime_t(expiration_date)) + QMessageBox.warning( + self, + "Membership expiration", + "Warning : Membership expiration in {0} days".format(days), + QMessageBox.Ok + ) + def refresh(self): if self.app.current_account is None: self.tabs_account.setEnabled(False) @@ -122,7 +141,7 @@ class CurrencyTabWidget(QWidget, Ui_CurrencyTabWidget): self.table_history.setModel(proxy) self.table_history.setSelectionBehavior(QAbstractItemView.SelectRows) self.table_history.setSortingEnabled(True) - + self.table_history.horizontalHeader().setSectionResizeMode(QHeaderView.ResizeToContents) self.tab_community = CommunityTabWidget(self.app.current_account, self.community, self.password_asker) @@ -171,20 +190,7 @@ class CurrencyTabWidget(QWidget, Ui_CurrencyTabWidget): QModelIndex(), []) - person = Person.lookup(self.app.current_account.pubkey, self.community) - join_block = person.membership(self.community).block_number - join_date = self.community.get_block(join_block).mediantime - parameters = self.community.get_parameters() - expiration_date = join_date + parameters['sigValidity'] - current_time = QDateTime().currentDateTime().toTime_t() - sig_validity = self.community.get_parameters()['sigValidity'] - warning_expiration_time = int(sig_validity / 3) - will_expire_soon = (current_time > expiration_date*1000 - warning_expiration_time*1000) - text = "Connected : Block {0}".format(block_number) - if will_expire_soon: - days = QDateTime().currentDateTime().daysTo(QDateTime(expiration_date*1000)) - text += " - Warning : Membership expiration in {0}".format(days) self.status_label.setText(text) def refresh_wallets(self): diff --git a/src/cutecoin/gui/informations_tab.py b/src/cutecoin/gui/informations_tab.py index 500b7f847fcc8ca6e6fecb7256db104ba2662a6f..e1002d646518df4b1eb3e6d66f8ad4c22b78880e 100644 --- a/src/cutecoin/gui/informations_tab.py +++ b/src/cutecoin/gui/informations_tab.py @@ -48,7 +48,7 @@ class InformationsTabWidget(QWidget, Ui_InformationsTabWidget): <tr><td align="right"><b>{:.2f}</b></td><td>{:} {:}</td></tr> <tr><td align="right"><b>{:}</b></td><td>{:}</td></tr> <tr><td align="right"><b>{:.2f}</b></td><td>{:} {:}</td></tr> - <tr><td align="right"><b>{:2.2%}</b></td><td>{:}</td></tr> + <tr><td align="right"><b>{:2.2%} / {:} days</b></td><td>{:}</td></tr> </table> """.format( self.get_referential_value(block['dividend']), @@ -62,9 +62,9 @@ class InformationsTabWidget(QWidget, Ui_InformationsTabWidget): self.get_referential_value(block['monetaryMass'] / block['membersCount']), 'Monetary Mass per member M(t)/N(t) in', self.get_referential_name(), - block['dividend'] / (block['monetaryMass'] - (block['membersCount'] * block['dividend'])) / block[ - 'membersCount'], - 'Actual % Growth c = UD(t)/[M(t-1)/N(t)]' + block['dividend'] / (block['monetaryMass'] / block['membersCount']), + params['dt'] / 86400, + 'Actual growth c = UD(t)/[M(t-1)/N(t)]' ) ) @@ -72,7 +72,7 @@ class InformationsTabWidget(QWidget, Ui_InformationsTabWidget): self.label_money.setText( """ <table cellpadding="5"> - <tr><td align="right"><b>{:2.0%}</b></td><td>{:}</td></tr> + <tr><td align="right"><b>{:2.0%} / {:} days</b></td><td>{:}</td></tr> <tr><td align="right"><b>{:}</b></td><td>{:} {:}</td></tr> <tr><td align="right"><b>{:}</b></td><td>{:}</td></tr> <tr><td align="right"><b>{:}</b></td><td>{:}</td></tr> @@ -83,12 +83,13 @@ class InformationsTabWidget(QWidget, Ui_InformationsTabWidget): </table> """.format( params['c'], - 'Growth parameter c', + params['dt'] / 86400, + 'Fundamental growth (c)', params['ud0'], - 'Initial Universal Dividend in', + 'Initial Universal Dividend UD(0) in', self.community.short_currency, params['dt'] / 86400, - 'Time period in days between two UD', + 'Time period (dt) in days (86400 seconds) between two UD', params['medianTimeBlocks'], 'Number of blocks used for calculating median time', params['avgGenTime'], @@ -102,6 +103,31 @@ class InformationsTabWidget(QWidget, Ui_InformationsTabWidget): ) ) + # set infos in label + self.label_rules.setText( + """ + <table cellpadding="5"> + <tr><td align="right"><b>{:}</b></td><td>{:}</td></tr> + <tr><td align="right"><b>{:}</b></td><td>{:}</td></tr> + <tr><td align="right"><b>{:}</b></td><td>{:}</td></tr> + </table> + """.format( + '{:2.0%} / {:} days'.format(params['c'], params['dt'] / 86400), + 'Fundamental growth (c) / Delta time (dt)', + 'UD(t+1) = MAX { UD(t) ; c * M(t) / N(t) }', + 'Universal Dividend (formula)', + 'UD(t+1) = MAX {{ {:.2f} {:} ; {:2.0%} * {:.2f} {:} / {:} }}'.format( + self.get_referential_value(block['dividend']), + self.get_referential_name(), + params['c'], + self.get_referential_value(block['monetaryMass']), + self.get_referential_name(), + block['membersCount'] + ), + 'Universal Dividend (computed)' + ) + ) + # set infos in label self.label_wot.setText( """ @@ -129,30 +155,6 @@ class InformationsTabWidget(QWidget, Ui_InformationsTabWidget): ) ) - # set infos in label - self.label_rules.setText( - """ - <table cellpadding="5"> - <tr><td align="right"><b>{:}</b></td><td>{:}</td></tr> - <tr><td align="right"><b>{:}</b></td><td>{:}</td></tr> - <tr><td align="right"><b>{:}</b></td><td>{:}</td></tr> - </table> - """.format( - "{:2.0%} / {:} days".format(params['c'], params['dt'] / 86400), - 'Growth percent (c)', - "UD t+1 = MAX ( UD t ; c * Mt / Nt+1 )", - 'Universal Dividend (formula)', - "UD t+1 = MAX ( {:.2f} {:} ; {:2.0%} * {:.2f} {:} / Nt+1 )".format( - self.get_referential_value(params['ud0']), - self.get_referential_name(), - params['c'], - self.get_referential_value(block['monetaryMass']), - self.get_referential_name() - ), - 'Universal Dividend (computed)' - ) - ) - def get_referential_value(self, value): return self.account.units_to_ref(value, self.community) diff --git a/src/cutecoin/gui/mainwindow.py b/src/cutecoin/gui/mainwindow.py index 10bf7bc0de1b2a9c58e798abd7c8bdda8d67b2ab..bb7d1c9a63a69acd9bfd62b09d4b7f8d83b53a5a 100644 --- a/src/cutecoin/gui/mainwindow.py +++ b/src/cutecoin/gui/mainwindow.py @@ -80,7 +80,7 @@ class MainWindow(QMainWindow, Ui_MainWindow): self.label_time = QLabel("", self) - self.statusbar.addPermanentWidget(self.status_label) + self.statusbar.addPermanentWidget(self.status_label, 1) self.statusbar.addPermanentWidget(self.label_time) self.statusbar.addPermanentWidget(self.combo_referential) self.update_time() @@ -121,7 +121,7 @@ class MainWindow(QMainWindow, Ui_MainWindow): @pyqtSlot() def update_time(self): date = QDate.currentDate() - self.label_time.setText("- {0} -".format(date.toString("dd/MM/yyyy"))) + self.label_time.setText("{0}".format(date.toString("dd/MM/yyyy"))) next_day = date.addDays(1) current_time = QDateTime().currentDateTime().toMSecsSinceEpoch() next_time = QDateTime(next_day).toMSecsSinceEpoch() diff --git a/src/cutecoin/models/txhistory.py b/src/cutecoin/models/txhistory.py index 969edad4ecf26af1f79899aa2f11703b919c2284..e91eea080cf5c22d1639a89271a04a17a6dda27e 100644 --- a/src/cutecoin/models/txhistory.py +++ b/src/cutecoin/models/txhistory.py @@ -32,7 +32,7 @@ class TxFilterProxyModel(QSortFilterProxyModel): def filterAcceptsRow(self, sourceRow, sourceParent): def in_period(date_ts): return (date_ts in range(self.ts_from, self.ts_to)) - date_col = self.sourceModel().columns.index('Date') + date_col = self.sourceModel().column_types.index('date') source_index = self.sourceModel().index(sourceRow, date_col) date = self.sourceModel().data(source_index, Qt.DisplayRole) return in_period(date) @@ -60,22 +60,22 @@ class TxFilterProxyModel(QSortFilterProxyModel): def data(self, index, role): source_index = self.mapToSource(index) source_data = self.sourceModel().data(source_index, role) - state_col = self.sourceModel().columns.index('State') + state_col = self.sourceModel().column_types.index('state') state_index = self.sourceModel().index(source_index.row(), state_col) state_data = self.sourceModel().data(state_index, Qt.DisplayRole) if role == Qt.DisplayRole: - if source_index.column() == self.sourceModel().columns.index('UID/Public key'): + if source_index.column() == self.sourceModel().column_types.index('uid'): if source_data.__class__ == Person: tx_person = source_data.name else: tx_person = "pub:{0}".format(source_data[:5]) source_data = tx_person return source_data - if source_index.column() == self.sourceModel().columns.index('Date'): + if source_index.column() == self.sourceModel().column_types.index('date'): date = QDateTime.fromTime_t(source_data) return date.date() - if source_index.column() == self.sourceModel().columns.index('Payment') or \ - source_index.column() == self.sourceModel().columns.index('Deposit'): + if source_index.column() == self.sourceModel().column_types.index('payment') or \ + source_index.column() == self.sourceModel().column_types.index('deposit'): if source_data is not "": amount_ref = self.account.units_to_diff_ref(source_data, self.community) @@ -105,6 +105,12 @@ class TxFilterProxyModel(QSortFilterProxyModel): return QColor(Qt.red) elif state_data == Transfer.TO_SEND: return QColor(Qt.blue) + + if role == Qt.TextAlignmentRole: + if source_index.column() == self.sourceModel().column_types.index('deposit') or source_index.column() == self.sourceModel().column_types.index('payment'): + return Qt.AlignRight | Qt.AlignVCenter + if source_index.column() == self.sourceModel().column_types.index('date'): + return Qt.AlignCenter return source_data @@ -121,8 +127,25 @@ class HistoryTableModel(QAbstractTableModel): super().__init__(parent) self.account = account self.community = community - self.columns = ('Date', 'UID/Public key', 'Payment', - 'Deposit', 'Comment', 'State') + self.account.referential + + self.column_types = ( + 'date', + 'uid', + 'payment', + 'deposit', + 'comment', + 'state' + ) + + self.column_headers = ( + 'Date', + 'UID/Public key', + 'Payment', + 'Deposit', + 'Comment', + 'State' + ) @property def transfers(self): @@ -132,11 +155,17 @@ class HistoryTableModel(QAbstractTableModel): return len(self.transfers) def columnCount(self, parent): - return len(self.columns) + return len(self.column_types) def headerData(self, section, orientation, role): if role == Qt.DisplayRole: - return self.columns[section] + if self.column_types[section] == 'payment' or self.column_types[section] == 'deposit': + return '{:}\n({:})'.format( + self.column_headers[section], + self.account.diff_ref_name(self.community.short_currency) + ) + + return self.column_headers[section] def data_received(self, transfer): amount = transfer.metadata['amount'] @@ -190,3 +219,4 @@ class HistoryTableModel(QAbstractTableModel): def flags(self, index): return Qt.ItemIsSelectable | Qt.ItemIsEnabled +