diff --git a/res/ui/currency_tab.ui b/res/ui/currency_tab.ui index dd51aee30806ad8d6936c2287e48bcc87e4d0644..d56ceb510acec4ea49fce7866c330b6d3a3a2885 100644 --- a/res/ui/currency_tab.ui +++ b/res/ui/currency_tab.ui @@ -33,66 +33,8 @@ <bool>false</bool> </property> <property name="currentIndex"> - <number>0</number> + <number>-1</number> </property> - <widget class="QWidget" name="tab_transactions"> - <attribute name="icon"> - <iconset resource="../icons/icons.qrc"> - <normaloff>:/icons/tx_icon</normaloff>:/icons/tx_icon</iconset> - </attribute> - <attribute name="title"> - <string>Transactions</string> - </attribute> - <layout class="QHBoxLayout" name="horizontalLayout_3"> - <item> - <layout class="QVBoxLayout" name="verticalLayout_3"> - <item> - <layout class="QHBoxLayout" name="horizontalLayout_2"> - <property name="topMargin"> - <number>5</number> - </property> - <item> - <widget class="QDateTimeEdit" name="date_from"> - <property name="displayFormat"> - <string>dd/MM/yyyy</string> - </property> - <property name="calendarPopup"> - <bool>true</bool> - </property> - </widget> - </item> - <item> - <widget class="QDateTimeEdit" name="date_to"> - <property name="displayFormat"> - <string>dd/MM/yyyy</string> - </property> - <property name="calendarPopup"> - <bool>true</bool> - </property> - </widget> - </item> - </layout> - </item> - <item> - <widget class="QTableView" name="table_history"> - <property name="contextMenuPolicy"> - <enum>Qt::CustomContextMenu</enum> - </property> - <attribute name="horizontalHeaderShowSortIndicator" stdset="0"> - <bool>true</bool> - </attribute> - <attribute name="horizontalHeaderStretchLastSection"> - <bool>true</bool> - </attribute> - <attribute name="verticalHeaderVisible"> - <bool>false</bool> - </attribute> - </widget> - </item> - </layout> - </item> - </layout> - </widget> </widget> </item> </layout> @@ -103,56 +45,7 @@ <resources> <include location="../icons/icons.qrc"/> </resources> - <connections> - <connection> - <sender>date_from</sender> - <signal>dateTimeChanged(QDateTime)</signal> - <receiver>CurrencyTabWidget</receiver> - <slot>dates_changed(QDateTime)</slot> - <hints> - <hint type="sourcelabel"> - <x>114</x> - <y>73</y> - </hint> - <hint type="destinationlabel"> - <x>199</x> - <y>149</y> - </hint> - </hints> - </connection> - <connection> - <sender>date_to</sender> - <signal>dateTimeChanged(QDateTime)</signal> - <receiver>CurrencyTabWidget</receiver> - <slot>dates_changed(QDateTime)</slot> - <hints> - <hint type="sourcelabel"> - <x>285</x> - <y>73</y> - </hint> - <hint type="destinationlabel"> - <x>199</x> - <y>149</y> - </hint> - </hints> - </connection> - <connection> - <sender>table_history</sender> - <signal>customContextMenuRequested(QPoint)</signal> - <receiver>CurrencyTabWidget</receiver> - <slot>history_context_menu(QPoint)</slot> - <hints> - <hint type="sourcelabel"> - <x>199</x> - <y>180</y> - </hint> - <hint type="destinationlabel"> - <x>199</x> - <y>149</y> - </hint> - </hints> - </connection> - </connections> + <connections/> <slots> <slot>refresh_wallet_content(QModelIndex)</slot> <slot>wallet_context_menu(QPoint)</slot> diff --git a/res/ui/transactions_tab.ui b/res/ui/transactions_tab.ui new file mode 100644 index 0000000000000000000000000000000000000000..5cd0f97af00db657bf62772918b8c02d236dad2c --- /dev/null +++ b/res/ui/transactions_tab.ui @@ -0,0 +1,90 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>transactionsTabWidget</class> + <widget class="QWidget" name="transactionsTabWidget"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>400</width> + <height>300</height> + </rect> + </property> + <property name="windowTitle"> + <string>Form</string> + </property> + <layout class="QVBoxLayout" name="verticalLayout"> + <item> + <layout class="QVBoxLayout" name="verticalLayout_3"> + <item> + <layout class="QHBoxLayout" name="horizontalLayout_2"> + <property name="topMargin"> + <number>5</number> + </property> + <item> + <widget class="QDateTimeEdit" name="date_from"> + <property name="displayFormat"> + <string>dd/MM/yyyy</string> + </property> + <property name="calendarPopup"> + <bool>true</bool> + </property> + </widget> + </item> + <item> + <widget class="QDateTimeEdit" name="date_to"> + <property name="displayFormat"> + <string>dd/MM/yyyy</string> + </property> + <property name="calendarPopup"> + <bool>true</bool> + </property> + </widget> + </item> + </layout> + </item> + <item> + <widget class="QTableView" name="table_history"> + <property name="contextMenuPolicy"> + <enum>Qt::CustomContextMenu</enum> + </property> + <attribute name="horizontalHeaderShowSortIndicator" stdset="0"> + <bool>true</bool> + </attribute> + <attribute name="horizontalHeaderStretchLastSection"> + <bool>true</bool> + </attribute> + <attribute name="verticalHeaderVisible"> + <bool>false</bool> + </attribute> + </widget> + </item> + </layout> + </item> + </layout> + </widget> + <resources> + <include location="../icons/icons.qrc"/> + </resources> + <connections> + <connection> + <sender>table_history</sender> + <signal>customContextMenuRequested(QPoint)</signal> + <receiver>transactionsTabWidget</receiver> + <slot>history_context_menu()</slot> + <hints> + <hint type="sourcelabel"> + <x>273</x> + <y>183</y> + </hint> + <hint type="destinationlabel"> + <x>830</x> + <y>802</y> + </hint> + </hints> + </connection> + </connections> + <slots> + <slot>history_context_menu()</slot> + </slots> +</ui> diff --git a/res/ui/wallets_tab.ui b/res/ui/wallets_tab.ui index 0bb91ecf4c3ba4fe73afca102b788dc2964f6649..d7bca00f034417ce1ada008a8082a01c9827b5bd 100644 --- a/res/ui/wallets_tab.ui +++ b/res/ui/wallets_tab.ui @@ -6,8 +6,8 @@ <rect> <x>0</x> <y>0</y> - <width>400</width> - <height>452</height> + <width>924</width> + <height>920</height> </rect> </property> <property name="windowTitle"> @@ -27,8 +27,8 @@ QGroupBox::title { font-weight: bold; }</string> </property> - <layout class="QVBoxLayout" name="verticalLayout"> - <item> + <layout class="QGridLayout" name="gridLayout"> + <item row="0" column="0"> <widget class="QGroupBox" name="groupBox"> <property name="sizePolicy"> <sizepolicy hsizetype="Preferred" vsizetype="Preferred"> @@ -45,8 +45,8 @@ QGroupBox::title { <property name="flat"> <bool>true</bool> </property> - <layout class="QVBoxLayout" name="verticalLayout_2"> - <item> + <layout class="QGridLayout" name="gridLayout_2"> + <item row="0" column="0"> <widget class="QLabel" name="label_general"> <property name="text"> <string>label_general</string> @@ -62,7 +62,7 @@ QGroupBox::title { </layout> </widget> </item> - <item> + <item row="1" column="0"> <widget class="QGroupBox" name="groupBox_2"> <property name="title"> <string>Balance</string> @@ -81,12 +81,12 @@ QGroupBox::title { </layout> </widget> </item> - <item> + <item row="2" column="0"> <widget class="QTableView" name="table_wallets"> <property name="sizePolicy"> - <sizepolicy hsizetype="Expanding" vsizetype="Maximum"> + <sizepolicy hsizetype="Expanding" vsizetype="Preferred"> <horstretch>0</horstretch> - <verstretch>0</verstretch> + <verstretch>1</verstretch> </sizepolicy> </property> <property name="contextMenuPolicy"> diff --git a/src/cutecoin/gui/currency_tab.py b/src/cutecoin/gui/currency_tab.py index 4a976992087281f67cc787e6b1c89137c8b1198a..56b130b866485cb64877cc6161d4ce50e7a1a357 100644 --- a/src/cutecoin/gui/currency_tab.py +++ b/src/cutecoin/gui/currency_tab.py @@ -6,24 +6,18 @@ Created on 2 févr. 2014 import time import logging -from PyQt5.QtWidgets import QWidget, QMenu, QAction, QApplication, \ - QMessageBox, QDialog, QAbstractItemView, QHeaderView -from PyQt5.QtCore import QModelIndex, Qt, pyqtSlot, \ - QThread, QDateTime -from PyQt5.QtGui import QIcon, QCursor +from PyQt5.QtWidgets import QWidget, QMessageBox +from PyQt5.QtCore import QModelIndex, pyqtSlot, QDateTime +from PyQt5.QtGui import QIcon from ..gen_resources.currency_tab_uic import Ui_CurrencyTabWidget + from .community_tab import CommunityTabWidget -from .transfer import TransferMoneyDialog from .wallets_tab import WalletsTabWidget +from .transactions_tab import TransactionsTabWidget from .network_tab import NetworkTabWidget -from ..models.txhistory import HistoryTableModel, TxFilterProxyModel from .informations_tab import InformationsTabWidget from ..tools.exceptions import MembershipNotFoundError -from ..core.wallet import Wallet from ..core.person import Person -from ..core.transfer import Transfer -from cutecoin.core.watching.blockchain import BlockchainWatcher -from cutecoin.core.watching.persons import PersonsWatcher class CurrencyTabWidget(QWidget, Ui_CurrencyTabWidget): @@ -51,10 +45,10 @@ class CurrencyTabWidget(QWidget, Ui_CurrencyTabWidget): self.app.current_account, self.community, self.password_asker) - + logging.debug("Net") self.tab_network = NetworkTabWidget(self.community) - + logging.debug("Connect") self.community.new_block_mined.connect(self.refresh_block) persons_watcher = self.app.monitor.persons_watcher(self.community) @@ -73,7 +67,7 @@ class CurrencyTabWidget(QWidget, Ui_CurrencyTabWidget): sig_validity = self.community.parameters['sigValidity'] warning_expiration_time = int(sig_validity / 3) will_expire_soon = (current_time > expiration_date - warning_expiration_time) - + logging.debug("Try") if will_expire_soon: days = QDateTime().currentDateTime().daysTo(QDateTime.fromTime_t(expiration_date)) @@ -92,31 +86,23 @@ class CurrencyTabWidget(QWidget, Ui_CurrencyTabWidget): self.tabs_account.setEnabled(False) else: self.tabs_account.setEnabled(True) - blockchain_init = QDateTime() - blockchain_init.setTime_t(self.community.get_block(1).mediantime) - - self.date_from.setMinimumDateTime(blockchain_init) - self.date_from.setDateTime(blockchain_init) - self.date_from.setMaximumDateTime(QDateTime().currentDateTime()) - self.date_to.setMinimumDateTime(blockchain_init) - tomorrow_datetime = QDateTime().currentDateTime().addDays(1) - self.date_to.setDateTime(tomorrow_datetime) - self.date_to.setMaximumDateTime(tomorrow_datetime) - - ts_from = self.date_from.dateTime().toTime_t() - ts_to = self.date_to.dateTime().toTime_t() + self.tab_wallets = WalletsTabWidget(self.app, + self.app.current_account, + self.community, + self.password_asker) + self.tabs_account.addTab(self.tab_wallets, + QIcon(':/icons/wallet_icon'), + "Wallets") - model = HistoryTableModel(self.app.current_account, self.community) - proxy = TxFilterProxyModel(ts_from, ts_to) - proxy.setSourceModel(model) - proxy.setDynamicSortFilter(True) - proxy.setSortRole(Qt.DisplayRole) + self.tab_history = TransactionsTabWidget(self.app, + self.community, + self.password_asker, + self) + self.tabs_account.addTab(self.tab_history, + QIcon(':/icons/tx_icon'), + "Transactions") - 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) @@ -124,14 +110,6 @@ class CurrencyTabWidget(QWidget, Ui_CurrencyTabWidget): QIcon(':/icons/community_icon'), "Community") - self.tab_wallets = WalletsTabWidget(self.app, - self.app.current_account, - self.community, - self.password_asker) - self.tabs_account.addTab(self.tab_wallets, - QIcon(':/icons/wallet_icon'), - "Wallets") - self.tab_informations = InformationsTabWidget(self.app.current_account, self.community) self.tabs_account.addTab(self.tab_informations, @@ -167,8 +145,8 @@ class CurrencyTabWidget(QWidget, Ui_CurrencyTabWidget): if self.tab_wallets: self.tab_wallets.refresh() - if self.table_history.model(): - self.table_history.model().dataChanged.emit( + if self.tab_history.table_history.model(): + self.tab_history.table_history.model().dataChanged.emit( QModelIndex(), QModelIndex(), []) @@ -181,114 +159,15 @@ class CurrencyTabWidget(QWidget, Ui_CurrencyTabWidget): if self.app.current_account: self.tab_wallets.refresh() - def wallet_context_menu(self, point): - index = self.list_wallets.indexAt(point) - model = self.list_wallets.model() - if index.row() < model.rowCount(QModelIndex()): - wallet = model.wallets[index.row()] - menu = QMenu(model.data(index, Qt.DisplayRole), self) - - rename = QAction("Rename", self) - rename.triggered.connect(self.rename_wallet) - rename.setData(index) - - copy_pubkey = QAction("Copy pubkey to clipboard", self) - copy_pubkey.triggered.connect(self.copy_pubkey_to_clipboard) - copy_pubkey.setData(wallet) - - menu.addAction(rename) - menu.addAction(copy_pubkey) - # Show the context menu. - menu.exec_(QCursor.pos()) - - def history_context_menu(self, point): - index = self.table_history.indexAt(point) - model = self.table_history.model() - if index.row() < model.rowCount(QModelIndex()): - menu = QMenu("Actions", self) - source_index = model.mapToSource(index) - state_col = model.sourceModel().column_types.index('state') - state_index = model.sourceModel().index(source_index.row(), - state_col) - state_data = model.sourceModel().data(state_index, Qt.DisplayRole) - - pubkey_col = model.sourceModel().column_types.index('uid') - person_index = model.sourceModel().index(source_index.row(), - pubkey_col) - person = model.sourceModel().data(person_index, Qt.DisplayRole) - transfer = model.sourceModel().transfers[source_index.row()] - if state_data == Transfer.REFUSED or state_data == Transfer.TO_SEND: - send_back = QAction("Send again", self) - send_back.triggered.connect(self.send_again) - send_back.setData(transfer) - menu.addAction(send_back) - - cancel = QAction("Cancel", self) - cancel.triggered.connect(self.cancel_transfer) - cancel.setData(transfer) - menu.addAction(cancel) - - copy_pubkey = QAction("Copy pubkey to clipboard", self) - copy_pubkey.triggered.connect(self.copy_pubkey_to_clipboard) - copy_pubkey.setData(person) - menu.addAction(copy_pubkey) - # Show the context menu. - menu.exec_(QCursor.pos()) - - def copy_pubkey_to_clipboard(self): - data = self.sender().data() - clipboard = QApplication.clipboard() - if data.__class__ is Wallet: - clipboard.setText(data.pubkey) - elif data.__class__ is Person: - clipboard.setText(data.pubkey) - elif data.__class__ is str: - clipboard.setText(data) - - def send_again(self): - transfer = self.sender().data() - dialog = TransferMoneyDialog(self.app.current_account, - self.password_asker) - dialog.accepted.connect(self.refresh_wallets) - sender = transfer.metadata['issuer'] - wallet_index = [w.pubkey for w in self.app.current_account.wallets].index(sender) - dialog.combo_wallets.setCurrentIndex(wallet_index) - dialog.edit_pubkey.setText(transfer.metadata['receiver']) - dialog.combo_community.setCurrentText(self.community.name) - dialog.spinbox_amount.setValue(transfer.metadata['amount']) - dialog.radio_pubkey.setChecked(True) - dialog.edit_message.setText(transfer.metadata['comment']) - result = dialog.exec_() - if result == QDialog.Accepted: - transfer.drop() - self.table_history.model().invalidate() - - def cancel_transfer(self): - reply = QMessageBox.warning(self, "Warning", - """Are you sure ? -This money transfer will be removed and not sent.""", -QMessageBox.Ok | QMessageBox.Cancel) - if reply == QMessageBox.Ok: - transfer = self.sender().data() - transfer.drop() - self.table_history.model().invalidate() - def showEvent(self, event): blockid = self.community.current_blockid() block_number = blockid['number'] self.status_label.setText("Connected : Block {0}" .format(block_number)) - def dates_changed(self, datetime): - ts_from = self.date_from.dateTime().toTime_t() - ts_to = self.date_to.dateTime().toTime_t() - if self.table_history.model(): - self.table_history.model().set_period(ts_from, ts_to) - self.table_history.model().invalidate() - def referential_changed(self): - if self.table_history.model(): - self.table_history.model().dataChanged.emit( + if self.tab_history.table_history.model(): + self.tab_history.table_history.model().dataChanged.emit( QModelIndex(), QModelIndex(), []) diff --git a/src/cutecoin/gui/transactions_tab.py b/src/cutecoin/gui/transactions_tab.py new file mode 100644 index 0000000000000000000000000000000000000000..f367d562dc4d3504d31d00da9f1ca456850d22c7 --- /dev/null +++ b/src/cutecoin/gui/transactions_tab.py @@ -0,0 +1,127 @@ +from PyQt5.QtWidgets import QWidget, QAbstractItemView, QHeaderView, QDialog, \ + QMenu, QAction, QApplication, QMessageBox +from PyQt5.QtCore import Qt, QDateTime, QModelIndex +from PyQt5.QtGui import QCursor +from ..gen_resources.transactions_tab_uic import Ui_transactionsTabWidget +from ..models.txhistory import HistoryTableModel, TxFilterProxyModel +from ..core.transfer import Transfer +from ..core.wallet import Wallet +from ..core.person import Person +from .transfer import TransferMoneyDialog + + +class TransactionsTabWidget(QWidget, Ui_transactionsTabWidget): + """ + classdocs + """ + + def __init__(self, app, community, password_asker, currency_tab): + """ + Constructor + """ + super().__init__() + self.setupUi(self) + self.app = app + self.community = community + self.password_asker = password_asker + self.currency_tab = currency_tab + self.refresh() + + def refresh(self): + blockchain_init = QDateTime() + blockchain_init.setTime_t(self.community.get_block(1).mediantime) + + self.date_from.setMinimumDateTime(blockchain_init) + self.date_from.setDateTime(blockchain_init) + self.date_from.setMaximumDateTime(QDateTime().currentDateTime()) + + self.date_to.setMinimumDateTime(blockchain_init) + tomorrow_datetime = QDateTime().currentDateTime().addDays(1) + self.date_to.setDateTime(tomorrow_datetime) + self.date_to.setMaximumDateTime(tomorrow_datetime) + + ts_from = self.date_from.dateTime().toTime_t() + ts_to = self.date_to.dateTime().toTime_t() + + model = HistoryTableModel(self.app.current_account, self.community) + proxy = TxFilterProxyModel(ts_from, ts_to) + proxy.setSourceModel(model) + proxy.setDynamicSortFilter(True) + proxy.setSortRole(Qt.DisplayRole) + + self.table_history.setModel(proxy) + self.table_history.setSelectionBehavior(QAbstractItemView.SelectRows) + self.table_history.setSortingEnabled(True) + self.table_history.horizontalHeader().setSectionResizeMode(QHeaderView.ResizeToContents) + + def history_context_menu(self, point): + index = self.table_history.indexAt(point) + model = self.table_history.model() + if index.row() < model.rowCount(QModelIndex()): + menu = QMenu("Actions", self) + source_index = model.mapToSource(index) + state_col = model.sourceModel().column_types.index('state') + state_index = model.sourceModel().index(source_index.row(), + state_col) + state_data = model.sourceModel().data(state_index, Qt.DisplayRole) + + pubkey_col = model.sourceModel().column_types.index('uid') + person_index = model.sourceModel().index(source_index.row(), + pubkey_col) + person = model.sourceModel().data(person_index, Qt.DisplayRole) + transfer = model.sourceModel().transfers[source_index.row()] + if state_data == Transfer.REFUSED or state_data == Transfer.TO_SEND: + send_back = QAction("Send again", self) + send_back.triggered.connect(self.send_again) + send_back.setData(transfer) + menu.addAction(send_back) + + cancel = QAction("Cancel", self) + cancel.triggered.connect(self.cancel_transfer) + cancel.setData(transfer) + menu.addAction(cancel) + + copy_pubkey = QAction("Copy pubkey to clipboard", self) + copy_pubkey.triggered.connect(self.copy_pubkey_to_clipboard) + copy_pubkey.setData(person) + menu.addAction(copy_pubkey) + # Show the context menu. + menu.exec_(QCursor.pos()) + + def copy_pubkey_to_clipboard(self): + data = self.sender().data() + clipboard = QApplication.clipboard() + if data.__class__ is Wallet: + clipboard.setText(data.pubkey) + elif data.__class__ is Person: + clipboard.setText(data.pubkey) + elif data.__class__ is str: + clipboard.setText(data) + + def send_again(self): + transfer = self.sender().data() + dialog = TransferMoneyDialog(self.app.current_account, + self.password_asker) + dialog.accepted.connect(self.currency_tab.refresh_wallets) + sender = transfer.metadata['issuer'] + wallet_index = [w.pubkey for w in self.app.current_account.wallets].index(sender) + dialog.combo_wallets.setCurrentIndex(wallet_index) + dialog.edit_pubkey.setText(transfer.metadata['receiver']) + dialog.combo_community.setCurrentText(self.community.name) + dialog.spinbox_amount.setValue(transfer.metadata['amount']) + dialog.radio_pubkey.setChecked(True) + dialog.edit_message.setText(transfer.metadata['comment']) + result = dialog.exec_() + if result == QDialog.Accepted: + transfer.drop() + self.table_history.model().invalidate() + + def cancel_transfer(self): + reply = QMessageBox.warning(self, "Warning", + """Are you sure ? +This money transfer will be removed and not sent.""", +QMessageBox.Ok | QMessageBox.Cancel) + if reply == QMessageBox.Ok: + transfer = self.sender().data() + transfer.drop() + self.table_history.model().invalidate()