From f2df4cc60d96c25cb885e17d097c9a76a692a1a0 Mon Sep 17 00:00:00 2001
From: Inso <insomniak.fr@gmail.com>
Date: Thu, 22 May 2014 10:08:27 +0200
Subject: [PATCH] Better UI and bug fix

---
 res/ui/transferDialog.ui                | 106 +++++++++++-------------
 src/cutecoin/core/config.py             |  14 ++--
 src/cutecoin/gui/mainWindow.py          |  30 ++++---
 src/cutecoin/gui/transferMoneyDialog.py |  33 +++-----
 src/cutecoin/models/coin/listModel.py   |  54 ++++++++++--
 5 files changed, 135 insertions(+), 102 deletions(-)

diff --git a/res/ui/transferDialog.ui b/res/ui/transferDialog.ui
index 90127cd5..9fdd70af 100644
--- a/res/ui/transferDialog.ui
+++ b/res/ui/transferDialog.ui
@@ -20,6 +20,27 @@
       <string>Transfer money to</string>
      </property>
      <layout class="QVBoxLayout" name="verticalLayout_2">
+      <item>
+       <layout class="QHBoxLayout" name="horizontalLayout_2">
+        <item>
+         <widget class="QRadioButton" name="radio_contact">
+          <property name="text">
+           <string>Contact</string>
+          </property>
+          <property name="checked">
+           <bool>true</bool>
+          </property>
+         </widget>
+        </item>
+        <item>
+         <widget class="QComboBox" name="combo_contact">
+          <property name="enabled">
+           <bool>true</bool>
+          </property>
+         </widget>
+        </item>
+       </layout>
+      </item>
       <item>
        <layout class="QHBoxLayout" name="horizontalLayout">
         <item>
@@ -28,12 +49,15 @@
            <string>Recipient fingerprint</string>
           </property>
           <property name="checked">
-           <bool>true</bool>
+           <bool>false</bool>
           </property>
          </widget>
         </item>
         <item>
          <widget class="QLineEdit" name="edit_key_fingerprint">
+          <property name="enabled">
+           <bool>false</bool>
+          </property>
           <property name="inputMask">
            <string/>
           </property>
@@ -47,33 +71,36 @@
         </item>
        </layout>
       </item>
+     </layout>
+    </widget>
+   </item>
+   <item>
+    <widget class="QGroupBox" name="groupBox_2">
+     <property name="title">
+      <string>Transfer using node</string>
+     </property>
+     <layout class="QVBoxLayout" name="verticalLayout_3">
       <item>
-       <layout class="QHBoxLayout" name="horizontalLayout_2">
+       <layout class="QHBoxLayout" name="horizontalLayout_4">
         <item>
-         <widget class="QRadioButton" name="radio_contact">
+         <widget class="QRadioButton" name="radio_trusted_node">
           <property name="text">
-           <string>Contact</string>
+           <string>Trusted node</string>
+          </property>
+          <property name="checked">
+           <bool>true</bool>
           </property>
          </widget>
         </item>
         <item>
-         <widget class="QComboBox" name="combo_contact">
+         <widget class="QComboBox" name="combo_trusted_node">
           <property name="enabled">
-           <bool>false</bool>
+           <bool>true</bool>
           </property>
          </widget>
         </item>
        </layout>
       </item>
-     </layout>
-    </widget>
-   </item>
-   <item>
-    <widget class="QGroupBox" name="groupBox_2">
-     <property name="title">
-      <string>Transfer using node</string>
-     </property>
-     <layout class="QVBoxLayout" name="verticalLayout_3">
       <item>
        <layout class="QHBoxLayout" name="horizontalLayout_3">
         <item>
@@ -82,12 +109,15 @@
            <string>Node</string>
           </property>
           <property name="checked">
-           <bool>true</bool>
+           <bool>false</bool>
           </property>
          </widget>
         </item>
         <item>
          <widget class="QLineEdit" name="edit_node_address">
+          <property name="enabled">
+           <bool>false</bool>
+          </property>
           <property name="inputMask">
            <string/>
           </property>
@@ -105,6 +135,9 @@
         </item>
         <item>
          <widget class="QSpinBox" name="spinbox_port">
+          <property name="enabled">
+           <bool>false</bool>
+          </property>
           <property name="maximum">
            <number>99999</number>
           </property>
@@ -115,24 +148,6 @@
         </item>
        </layout>
       </item>
-      <item>
-       <layout class="QHBoxLayout" name="horizontalLayout_4">
-        <item>
-         <widget class="QRadioButton" name="radio_trusted_node">
-          <property name="text">
-           <string>Trusted node</string>
-          </property>
-         </widget>
-        </item>
-        <item>
-         <widget class="QComboBox" name="combo_trusted_node">
-          <property name="enabled">
-           <bool>false</bool>
-          </property>
-         </widget>
-        </item>
-       </layout>
-      </item>
      </layout>
     </widget>
    </item>
@@ -165,13 +180,6 @@
           <property name="rightMargin">
            <number>0</number>
           </property>
-          <item>
-           <widget class="QPushButton" name="button_manage_coins">
-            <property name="text">
-             <string>Manage wallet coins</string>
-            </property>
-           </widget>
-          </item>
           <item>
            <widget class="QPushButton" name="button_add">
             <property name="text">
@@ -325,22 +333,6 @@
     </hint>
    </hints>
   </connection>
-  <connection>
-   <sender>button_manage_coins</sender>
-   <signal>clicked()</signal>
-   <receiver>TransferMoneyDialog</receiver>
-   <slot>open_manage_wallet_coins()</slot>
-   <hints>
-    <hint type="sourcelabel">
-     <x>201</x>
-     <y>281</y>
-    </hint>
-    <hint type="destinationlabel">
-     <x>199</x>
-     <y>244</y>
-    </hint>
-   </hints>
-  </connection>
   <connection>
    <sender>combo_wallets</sender>
    <signal>currentIndexChanged(int)</signal>
diff --git a/src/cutecoin/core/config.py b/src/cutecoin/core/config.py
index e2b90517..11031a01 100644
--- a/src/cutecoin/core/config.py
+++ b/src/cutecoin/core/config.py
@@ -6,15 +6,19 @@ Created on 7 févr. 2014
 
 import logging
 from optparse import OptionParser
-import os.path
-import gnupg
+from os import environ
 import ucoin
+import gnupg
+
 
+if "XDG_CONFIG_HOME" in environ:
+    config_path = environ["XDG_CONFIG_HOME"]
+else:
+    config_path = environ["HOME"] + "/.config"
 
-home = os.path.expanduser("~")
 
-parameters = {'home': home + '/.config/cutecoin/',
-              'data': home + '/.config/cutecoin/' 'data'}
+parameters = {'home': config_path + '/cutecoin/',
+              'data': config_path + '/cutecoin/' 'data'}
 
 
 def parse_arguments(argv):
diff --git a/src/cutecoin/gui/mainWindow.py b/src/cutecoin/gui/mainWindow.py
index 84ae40b4..6875c92d 100644
--- a/src/cutecoin/gui/mainWindow.py
+++ b/src/cutecoin/gui/mainWindow.py
@@ -4,14 +4,14 @@ Created on 1 févr. 2014
 @author: inso
 '''
 from cutecoin.gen_resources.mainwindow_uic import Ui_MainWindow
-from PyQt5.QtWidgets import QMainWindow, QAction, QErrorMessage, QDialogButtonBox
-from PyQt5.QtCore import QSignalMapper
+from PyQt5.QtWidgets import QMainWindow, QAction
+from PyQt5.QtCore import QSignalMapper, QModelIndex
 from cutecoin.gui.processConfigureAccount import ProcessConfigureAccount
 from cutecoin.gui.transferMoneyDialog import TransferMoneyDialog
 from cutecoin.gui.communityTabWidget import CommunityTabWidget
 from cutecoin.gui.addContactDialog import AddContactDialog
 from cutecoin.models.account.wallets.listModel import WalletsListModel
-from cutecoin.models.wallet.listModel import WalletListModel
+from cutecoin.models.coin.listModel import CoinsListModel
 from cutecoin.models.transaction.sentListModel import SentListModel
 from cutecoin.models.transaction.receivedListModel import ReceivedListModel
 
@@ -48,14 +48,16 @@ class MainWindow(QMainWindow, Ui_MainWindow):
         self.refresh()
 
     def open_transfer_money_dialog(self):
-        TransferMoneyDialog(self.core.current_account).exec_()
+        dialog = TransferMoneyDialog(self.core.current_account)
+        dialog.accepted.connect(self.refresh_wallets)
+        dialog.exec_()
 
     def open_add_contact_dialog(self):
         AddContactDialog(self.core.current_account, self).exec_()
 
     def open_configure_account_dialog(self):
         dialog = ProcessConfigureAccount(self.core, self.core.current_account)
-        dialog.accepted.connect(self.refresh)
+        dialog.accepted.connect(self.refresh_wallets)
         dialog.exec_()
 
     '''
@@ -83,11 +85,7 @@ class MainWindow(QMainWindow, Ui_MainWindow):
                 "Current account : " +
                 self.core.current_account.name)
 
-            for wallet in self.core.current_account.wallets:
-                wallet.refresh_coins()
-
-            wallets_list_model = WalletsListModel(self.core.current_account)
-            self.list_wallets.setModel(wallets_list_model)
+            self.refresh_wallets()
 
             self.tabs_communities.clear()
             for community in self.core.current_account.communities:
@@ -109,9 +107,17 @@ class MainWindow(QMainWindow, Ui_MainWindow):
                 ReceivedListModel(
                     self.core.current_account))
 
+    def refresh_wallets(self):
+        for wallet in self.core.current_account.wallets:
+            wallet.refresh_coins()
+
+        wallets_list_model = WalletsListModel(self.core.current_account)
+        self.list_wallets.setModel(wallets_list_model)
+        self.refresh_wallet_content(QModelIndex())
+
     def refresh_wallet_content(self, index):
         if index.isValid():
             current_wallet = self.core.current_account.wallets[index.row()]
-            self.list_wallet_content.setModel(WalletListModel(current_wallet))
+            self.list_wallet_content.setModel(CoinsListModel(current_wallet, current_wallet.coins))
         else:
-            self.list_wallet_content.setModel(WalletListModel([]))
+            self.list_wallet_content.setModel(CoinsListModel(None, []))
diff --git a/src/cutecoin/gui/transferMoneyDialog.py b/src/cutecoin/gui/transferMoneyDialog.py
index ba856a7a..4b89558d 100644
--- a/src/cutecoin/gui/transferMoneyDialog.py
+++ b/src/cutecoin/gui/transferMoneyDialog.py
@@ -40,31 +40,19 @@ class TransferMoneyDialog(QDialog, Ui_TransferMoneyDialog):
 
     def remove_coins_from_transfer(self):
         selection = self.list_coins_sent.selectedIndexes()
-        wallet_coins = self.list_wallet.model().coins
-        sent_coins = self.list_coins_sent.model().coins
-        new_wallet = sent_coins
-        for selected in selection:
-            coin = sent_coins[selected.row()]
-            sent_coins.remove(coin)
-            wallet_coins.append(coin)
-        self.list_wallet.setModel(CoinsListModel(self.wallet, wallet_coins))
-        self.list_coins_sent.setModel(CoinsListModel(self.wallet, new_wallet))
+        for select in selection:
+            coins = self.list_coins_sent.model().remove_coins(select, 1)
+            self.list_wallet.model().add_coins(coins)
+        self.label_total.setText("Total : %d" %
+                                 self.list_coins_sent.model().total())
 
     def add_coins_to_transfer(self):
         selection = self.list_wallet.selectedIndexes()
-        wallet_coins = self.list_wallet.model().coins
-        sent_coins = self.list_coins_sent.model().coins
-        new_wallet_coins = wallet_coins
-        for selected in selection:
-            coin = wallet_coins[selected.row()]
-            new_wallet_coins.remove(coin)
-            sent_coins.append(coin)
-        self.list_wallet.setModel(CoinsListModel(self.wallet,
-                                                 new_wallet_coins))
-        self.list_coins_sent.setModel(CoinsListModel(self.wallet, sent_coins))
-
-    def open_manage_wallet_coins(self):
-        pass
+        for select in selection:
+            coins = self.list_wallet.model().remove_coins(select, 1)
+            self.list_coins_sent.model().add_coins(coins)
+        self.label_total.setText("Total : %d"
+                                 % self.list_coins_sent.model().total())
 
     def accept(self):
         sent_coins = self.list_coins_sent.model().to_list()
@@ -90,6 +78,7 @@ class TransferMoneyDialog(QDialog, Ui_TransferMoneyDialog):
         if error:
             QErrorMessage(self).showMessage("Cannot transfer coins " + error)
         else:
+            self.accepted.emit()
             self.close()
 
     def change_displayed_wallet(self, index):
diff --git a/src/cutecoin/models/coin/listModel.py b/src/cutecoin/models/coin/listModel.py
index 51d620a9..a7a0820b 100644
--- a/src/cutecoin/models/coin/listModel.py
+++ b/src/cutecoin/models/coin/listModel.py
@@ -18,23 +18,65 @@ class CoinsListModel(QAbstractListModel):
         Constructor
         '''
         super(CoinsListModel, self).__init__(parent)
-        self.coins = coins
+        self.sorted_coins = {}
+        self.coin_values = set()
+        for c in coins:
+            value = c.value(wallet)
+
+            if value not in self.sorted_coins:
+                self.sorted_coins[value] = []
+
+            self.sorted_coins[value] += [c]
+            self.coin_values.update([value])
+
+        self.ordered_values = list(self.coin_values)
+        self.ordered_values.sort()
         self.wallet = wallet
 
     def rowCount(self, parent):
-        return len(self.coins)
+        return len(self.ordered_values)
 
     def data(self, index, role):
         if role == Qt.DisplayRole:
             row = index.row()
-            value = str(self.coins[row].value(self.wallet))
-            return value
+            coins_list = self.sorted_coins[self.ordered_values[row]]
+
+            text = """%d coins of %d""" % (len(coins_list),
+                                           self.ordered_values[row])
+            return text
 
     def flags(self, index):
         return Qt.ItemIsSelectable | Qt.ItemIsEnabled
 
+    def remove_coins(self, index, number):
+        removed = []
+        value = self.ordered_values[index.row()]
+        removed += self.sorted_coins[value][-number:]
+        self.sorted_coins[value] = self.sorted_coins[value][:-number]
+        self.dataChanged.emit(index, index, [Qt.DisplayRole])
+        return removed
+
+    def add_coins(self, coins):
+        for c in coins:
+            value = c.value(self.wallet)
+            if value not in self.sorted_coins:
+                self.sorted_coins[value] = []
+            self.sorted_coins[value] += [c]
+            self.coin_values.update([value])
+            self.ordered_values = list(self.coin_values)
+            self.ordered_values.sort()
+        self.layoutChanged.emit()
+
     def to_list(self):
         coins_list = []
-        for c in self.coins:
-            coins_list.append(c.get_id())
+        for value in self.coin_values:
+            for coin in self.sorted_coins[value]:
+                coins_list.append(coin.get_id())
         return coins_list
+
+    def total(self):
+        total = 0
+        for value in self.coin_values:
+            for coin in self.sorted_coins[value]:
+                total += coin.value(self.wallet)
+        return total
-- 
GitLab