diff --git a/res/ui/community_cfg.ui b/res/ui/community_cfg.ui index 2908765829329949d9523aa57373d6ccec16b3e2..9c17e89ff35b30851b3d74b4c1aa6d76966ed9eb 100644 --- a/res/ui/community_cfg.ui +++ b/res/ui/community_cfg.ui @@ -261,5 +261,6 @@ <slot>next()</slot> <slot>previous()</slot> <slot>current_wallet_changed(int)</slot> + <slot>remove_node()</slot> </slots> </ui> diff --git a/src/cutecoin/core/community.py b/src/cutecoin/core/community.py index a930916abdb8eea45e827d35e6a42142d53eb68a..7a7d3fd69898e9f99f27bc216d5e66c743aa255b 100644 --- a/src/cutecoin/core/community.py +++ b/src/cutecoin/core/community.py @@ -308,14 +308,21 @@ class Community(QObject): ''' return time.time() - certtime > self.parameters['sigValidity'] - @property - def add_peer(self, peer): + def add_node(self, node): ''' Add a peer to the community. :param peer: The new peer as a ucoinpy Peer object. ''' - self._network.add_node(Node.from_peer(peer)) + self._network.add_root_node(node) + + def remove_node(self, index): + ''' + Remove a node from the community. + + :param index: The index of the removed node. + ''' + self._network.remove_root_node(index) def get_block(self, number=None): ''' @@ -470,7 +477,7 @@ class Community(QObject): ''' nodes_data = [] - for node in self._network.online_nodes: + for node in self._network.root_nodes: nodes_data.append(node.jsonify()) data = {'currency': self.currency, diff --git a/src/cutecoin/core/net/network.py b/src/cutecoin/core/net/network.py index dfe01ce6ea129d3ceceb50cd629c84ab37e07cdc..89c7c3c86d8bc9a2835133935f7eaaf0a7ce2d83 100644 --- a/src/cutecoin/core/net/network.py +++ b/src/cutecoin/core/net/network.py @@ -29,13 +29,14 @@ class Network(Watcher): :param list nodes: The nodes of the network ''' super().__init__() + self._root_nodes = nodes self._nodes = [] self._mutex = QMutex() self.currency = currency self.nodes = nodes self._must_crawl = False self._is_perpetual = False - self._block_found = 0 + self._block_found = self.latest_block @classmethod def create(cls, node): @@ -48,12 +49,6 @@ class Network(Watcher): ''' nodes = [node] network = cls(node.currency, nodes) - nodes = network.crawling() - block_max = max([n.block for n in nodes]) - for node in nodes: - node.check_sync(block_max) - network.nodes = nodes - network._block_found = network.latest_block return network def merge_with_json(self, json_data): @@ -73,7 +68,6 @@ class Network(Watcher): n.changed.disconnect() except TypeError: pass - self.nodes = self.crawling() @classmethod def from_json(cls, currency, json_data): @@ -87,11 +81,7 @@ class Network(Watcher): for data in json_data: node = Node.from_json(currency, data) nodes.append(node) - block_max = max([n.block for n in nodes]) - for node in nodes: - node.check_sync(block_max) network = cls(currency, nodes) - network._block_found = network.latest_block return network def jsonify(self): @@ -138,6 +128,13 @@ class Network(Watcher): ''' return self._nodes + @property + def root_nodes(self): + ''' + Get root nodes. + ''' + return self._root_nodes + @nodes.setter def nodes(self, new_nodes): ''' @@ -172,6 +169,18 @@ class Network(Watcher): node.changed.connect(self.handle_change) logging.debug("{:} connected".format(node.pubkey)) + def add_root_node(self, node): + ''' + Add a node to the root nodes list + ''' + self._root_nodes.append(node) + + def remove_root_node(self, index): + ''' + Remove a node from the root nodes list + ''' + self._root_nodes.pop(index) + def moveToThread(self, thread): for n in self.nodes: n.moveToThread(thread) diff --git a/src/cutecoin/core/net/node.py b/src/cutecoin/core/net/node.py index 6d131a7524c4daa1c1aeb83be97110c102e7db28..165aba984700b5efa773143fd51ce603196ee0ae 100644 --- a/src/cutecoin/core/net/node.py +++ b/src/cutecoin/core/net/node.py @@ -239,7 +239,6 @@ class Node(QObject): node_currency = informations["currency"] node_uid = self._request_uid() - logging.debug("Continuing...") #If the nodes goes back online... if self.state in (Node.OFFLINE, Node.CORRUPTED): self.state = Node.ONLINE diff --git a/src/cutecoin/gui/process_cfg_community.py b/src/cutecoin/gui/process_cfg_community.py index 531b691c5df3f8d722037436535378178a6cc7e0..14fcd58ecd240b3f4c9769e9a082b17c55af7109 100644 --- a/src/cutecoin/gui/process_cfg_community.py +++ b/src/cutecoin/gui/process_cfg_community.py @@ -12,6 +12,7 @@ from ucoinpy.api.bma import ConnectionHandler from ucoinpy.documents.peer import Peer from PyQt5.QtWidgets import QDialog, QMenu, QMessageBox +from PyQt5.QtGui import QCursor from ..gen_resources.community_cfg_uic import Ui_CommunityConfigurationDialog from ..models.peering import PeeringTreeModel @@ -77,7 +78,7 @@ class StepPageAddpeers(Step): def display_page(self): # We add already known peers to the displayed list - self.config_dialog.nodes = self.config_dialog.community.network.nodes + self.config_dialog.nodes = self.config_dialog.community.network.root_nodes try: tree_model = PeeringTreeModel(self.config_dialog.community) except requests.exceptions.RequestException: @@ -151,8 +152,8 @@ class ProcessConfigureCommunity(QDialog, Ui_CommunityConfigurationDialog): ''' Add node slot ''' - server = self.lineedit_server.text() - port = self.spinbox_port.value() + server = self.lineedit_add_address.text() + port = self.spinbox_add_port.value() try: node = Node.from_address(self.community.currency, server, port) @@ -162,14 +163,34 @@ class ProcessConfigureCommunity(QDialog, Ui_CommunityConfigurationDialog): str(e)) self.tree_peers.setModel(PeeringTreeModel(self.community)) + def remove_node(self): + ''' + Remove node slot + ''' + logging.debug("Remove node") + index = self.sender().data() + self.community.remove_node(index) + self.tree_peers.setModel(PeeringTreeModel(self.community)) + + @property + def nb_steps(self): + s = self.step + nb_steps = 1 + while s.next_step != None: + s = s.next_step + nb_steps = nb_steps + 1 + return nb_steps + def showContextMenu(self, point): - if self.stacked_pages.currentIndex() == 1: + if self.stacked_pages.currentIndex() == self.nb_steps - 1: menu = QMenu() - action = menu.addAction("Delete", self.removeNode) + index = self.tree_peers.indexAt(point) + action = menu.addAction("Delete", self.remove_node) + action.setData(index.row()) if self.community is not None: if len(self.nodes) == 1: action.setEnabled(False) - menu.exec_(self.mapToGlobal(point)) + menu.exec_(QCursor.pos()) def accept(self): try: diff --git a/src/cutecoin/models/peering.py b/src/cutecoin/models/peering.py index e3a35969b800192d97794f2890f5d386b95417c4..313c3c581210e52e426e33ede66d582b0629561a 100644 --- a/src/cutecoin/models/peering.py +++ b/src/cutecoin/models/peering.py @@ -96,7 +96,7 @@ class PeeringTreeModel(QAbstractItemModel): Constructor ''' super().__init__(None) - self.nodes = community._network.online_nodes + self.nodes = community._network.root_nodes self.root_item = RootItem(community.currency) self.refresh_tree()