diff --git a/src/Model/Network/Graph.py b/src/Model/Network/Graph.py index c92c5095a398181fb74ed085d7942fbfc6917591..4b15484084c998ebc724e1edf995618440770189 100644 --- a/src/Model/Network/Graph.py +++ b/src/Model/Network/Graph.py @@ -67,6 +67,13 @@ class Graph(object): def edges_counts(self): return len(self._edges) + def enable_nodes_counts(self): + return reduce( + lambda acc, n: acc + 1 if self.is_enable_node(n) else acc, + self._nodes, + 0 + ) + def enable_edges_counts(self): return reduce( lambda acc, e: acc + 1 if e.is_enable() else acc, diff --git a/src/View/MainWindow.py b/src/View/MainWindow.py index 93baaaf40a747ab112e67117f470996079ccc9a1..f8763814838e0b15b8f0a19efb2303e1746e9dfb 100644 --- a/src/View/MainWindow.py +++ b/src/View/MainWindow.py @@ -34,7 +34,7 @@ from PyQt5.QtCore import ( from PyQt5.QtWidgets import ( QMainWindow, QApplication, QAction, QFileDialog, QShortcut, QMenu, QToolBar, - QMessageBox, QProgressDialog, + QMessageBox, QProgressDialog, QTabWidget, ) from PyQt5.uic import loadUi @@ -44,6 +44,8 @@ from View.DummyWindow import DummyWindow from View.Translate import MainTranslate +from View.MainWindowTabInfo import WidgetInfo + from View.Configure.Window import ConfigureWindow from View.Study.Window import NewStudyWindow from View.About.Window import AboutWindow @@ -143,6 +145,7 @@ class ApplicationWindow(QMainWindow, ListedSubWindow, WindowToolKit): self ) + self.setup_tab() self.setup_sc() self.setup_connection() self.default_style() @@ -167,6 +170,21 @@ class ApplicationWindow(QMainWindow, ListedSubWindow, WindowToolKit): title += "Pamhyr2" self.setWindowTitle(title) + def setup_tab(self): + self.setup_tab_info() + + def setup_tab_info(self): + tab_widget = self.findChild(QTabWidget, "tabWidget") + + self._tab_widget_info = WidgetInfo( + study=self._study, parent=self + ) + + tab_widget.addTab( + self._tab_widget_info, + self._trad["tab_info_name"] + ) + def enable_actions(self, action: str, enable: bool): """Enable of disable an action componant @@ -348,6 +366,8 @@ class ApplicationWindow(QMainWindow, ListedSubWindow, WindowToolKit): logger.debug(f"Propagation keys: {self._propagation_keys}") def _do_propagate_update(self): + self.update() + keys = self._propagation_keys.copy() self._init_propagation_keys() @@ -361,6 +381,12 @@ class ApplicationWindow(QMainWindow, ListedSubWindow, WindowToolKit): for _, window in self.sub_win_list: window._propagated_update(key=key) + def update(self): + self.set_title() + + self._tab_widget_info.study = self._study + self._tab_widget_info.update() + ######### # MODEL # ######### @@ -372,14 +398,15 @@ class ApplicationWindow(QMainWindow, ListedSubWindow, WindowToolKit): self._study = model self.update_enable_action() self.conf.set_last_study(self._study.filename) - self.set_title() + + self.update() def close_model(self): self._study = None self.update_enable_action() self.conf.set_close_correctly() - self.set_title() + self.update() self._close_sub_window() def update_enable_action(self): diff --git a/src/View/MainWindowTabInfo.py b/src/View/MainWindowTabInfo.py new file mode 100644 index 0000000000000000000000000000000000000000..bdfb7e635358bdcbec2855561118fc41e8f21ad8 --- /dev/null +++ b/src/View/MainWindowTabInfo.py @@ -0,0 +1,117 @@ +# MainWindowTabInfo.py -- Pamhyr +# Copyright (C) 2024 INRAE +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <https://www.gnu.org/licenses/>. + +# -*- coding: utf-8 -*- + +import logging + +from tools import timer, trace + +from View.Tools.PamhyrWidget import PamhyrWidget + +logger = logging.getLogger() + + +class WidgetInfo(PamhyrWidget): + _pamhyr_ui = "MainWindowTabInfo" + + color_grey = "<font color='grey'>" + color_end = "</font>" + + def __init__(self, study=None, parent=None): + self._study = study + + super(WidgetInfo, self).__init__( + parent=parent + ) + + self.set_initial_values() + + @property + def study(self): + return self._study + + @study.setter + def study(self, study): + self._study = study + + def set_initial_values(self): + self.set_label_text("label_study_name", "") + self.set_text_edit_text("textBrowser_study", "") + + self.set_label_text("label_current_reach", "None") + self.set_label_text("label_nodes", "0") + self.set_label_text("label_edges", "0") + + self.set_label_text("label_cs", "0") + self.set_label_text("label_points", "0") + + def update(self): + if self._study is None: + self.set_initial_values() + return + + self.set_label_text("label_study_name", self._study.name) + self.set_text_edit_text("textBrowser_study", self._study.description) + + self.set_network_values() + self.set_geometry_values() + + def set_network_values(self): + n_nodes = self._study.river.enable_nodes_counts() + n_d_nodes = self._study.river.nodes_counts() - n_nodes + n_edges = self._study.river.enable_edges_counts() + n_d_edges = self._study.river.edges_counts() - n_edges + + self.set_label_text( + "label_nodes", + f"{n_nodes} {self.color_grey}({n_d_nodes}){self.color_end}" + ) + self.set_label_text( + "label_edges", + f"{n_edges} {self.color_grey}({n_d_edges}){self.color_end}" + ) + + current = self._study.river.current_reach() + if current is not None: + name = current.reach.name + else: + name = "None" + self.set_label_text("label_current_reach", name) + + def set_geometry_values(self): + n_cs = 0 + n_d_cs = 0 + n_points = 0 + n_d_points = 0 + + for edge in self._study.river.edges(): + for profile in edge.reach.profiles: + if edge.is_enable(): + n_points += len(profile) + n_cs += 1 + else: + n_d_points += len(profile) + n_d_cs += 1 + + self.set_label_text( + "label_cs", + f"{n_cs} {self.color_grey}({n_d_cs}){self.color_end}" + ) + self.set_label_text( + "label_points", + f"{n_points} {self.color_grey}({n_d_points}){self.color_end}" + ) diff --git a/src/View/Translate.py b/src/View/Translate.py index 6ca09d6a67b8e7c9b3e88541a8e5f5670bb4b6f3..bbebaf5f439e9f8db12b35f40256909380b9c5e2 100644 --- a/src/View/Translate.py +++ b/src/View/Translate.py @@ -75,6 +75,10 @@ class MainTranslate(UnitTranslate): def __init__(self): super(MainTranslate, self).__init__() + self._dict["tab_info_name"] = _translate( + "MainWindow", "Info" + ) + self._dict["open_debug"] = _translate( "MainWindow", "Open debug window" ) diff --git a/src/View/ui/MainWindow.ui b/src/View/ui/MainWindow.ui index 2458faa28e7c6aeb0926c2a0e345ebf4001faee5..bb9f0ad759cd4c53fdee0a775d87b2573edfa01b 100644 --- a/src/View/ui/MainWindow.ui +++ b/src/View/ui/MainWindow.ui @@ -59,6 +59,22 @@ <property name="contextMenuPolicy"> <enum>Qt::NoContextMenu</enum> </property> + <layout class="QGridLayout" name="gridLayout"> + <item row="0" column="0"> + <widget class="QTabWidget" name="tabWidget"> + <property name="font"> + <font> + <family>Ubuntu</family> + <weight>50</weight> + <bold>false</bold> + </font> + </property> + <property name="currentIndex"> + <number>-1</number> + </property> + </widget> + </item> + </layout> </widget> <widget class="QMenuBar" name="menubar"> <property name="geometry"> diff --git a/src/View/ui/Widgets/MainWindowTabInfo.ui b/src/View/ui/Widgets/MainWindowTabInfo.ui new file mode 100644 index 0000000000000000000000000000000000000000..c037b248e5089a3c37f82f66d0b93f1d35f380b3 --- /dev/null +++ b/src/View/ui/Widgets/MainWindowTabInfo.ui @@ -0,0 +1,229 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>Form</class> + <widget class="QWidget" name="Form"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>897</width> + <height>480</height> + </rect> + </property> + <property name="windowTitle"> + <string>Form</string> + </property> + <property name="locale"> + <locale language="English" country="Europe"/> + </property> + <layout class="QGridLayout" name="gridLayout_4"> + <item row="0" column="0"> + <widget class="QScrollArea" name="scrollArea"> + <property name="verticalScrollBarPolicy"> + <enum>Qt::ScrollBarAlwaysOn</enum> + </property> + <property name="widgetResizable"> + <bool>true</bool> + </property> + <widget class="QWidget" name="scrollAreaWidgetContents"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>864</width> + <height>460</height> + </rect> + </property> + <layout class="QGridLayout" name="gridLayout_5"> + <item row="0" column="0"> + <widget class="QSplitter" name="splitter"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <widget class="QWidget" name=""> + <layout class="QVBoxLayout" name="verticalLayout_2"> + <item> + <widget class="QGroupBox" name="groupBox_3"> + <property name="title"> + <string>Study</string> + </property> + <layout class="QGridLayout" name="gridLayout_3"> + <item row="1" column="0"> + <widget class="QLabel" name="label_3"> + <property name="text"> + <string>Description:</string> + </property> + </widget> + </item> + <item row="1" column="1"> + <widget class="QTextBrowser" name="textBrowser_study"> + <property name="whatsThis"> + <string notr="true"/> + </property> + </widget> + </item> + <item row="0" column="0"> + <widget class="QLabel" name="label"> + <property name="text"> + <string>Name:</string> + </property> + </widget> + </item> + <item row="0" column="1"> + <widget class="QLabel" name="label_study_name"> + <property name="whatsThis"> + <string notr="true"/> + </property> + <property name="text"> + <string>@study_name</string> + </property> + </widget> + </item> + </layout> + </widget> + </item> + <item> + <widget class="QGroupBox" name="groupBox"> + <property name="title"> + <string>River network</string> + </property> + <layout class="QGridLayout" name="gridLayout"> + <item row="2" column="0"> + <widget class="QLabel" name="label_7"> + <property name="text"> + <string>Reach:</string> + </property> + </widget> + </item> + <item row="1" column="2"> + <spacer name="horizontalSpacer"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + <item row="1" column="0"> + <widget class="QLabel" name="label_5"> + <property name="text"> + <string>Node:</string> + </property> + </widget> + </item> + <item row="1" column="1"> + <widget class="QLabel" name="label_nodes"> + <property name="whatsThis"> + <string notr="true"/> + </property> + <property name="text"> + <string>@nb_nodes</string> + </property> + </widget> + </item> + <item row="2" column="1"> + <widget class="QLabel" name="label_edges"> + <property name="whatsThis"> + <string notr="true"/> + </property> + <property name="text"> + <string>@nb_edges</string> + </property> + </widget> + </item> + <item row="0" column="0"> + <widget class="QLabel" name="label_2"> + <property name="text"> + <string>Current reach:</string> + </property> + </widget> + </item> + <item row="0" column="1"> + <widget class="QLabel" name="label_current_reach"> + <property name="whatsThis"> + <string notr="true"/> + </property> + <property name="text"> + <string>@current_reach</string> + </property> + </widget> + </item> + </layout> + </widget> + </item> + <item> + <widget class="QGroupBox" name="groupBox_2"> + <property name="title"> + <string>Geometry</string> + </property> + <layout class="QGridLayout" name="gridLayout_2"> + <item row="1" column="1"> + <widget class="QLabel" name="label_points"> + <property name="whatsThis"> + <string notr="true"/> + </property> + <property name="text"> + <string>@nb_points</string> + </property> + </widget> + </item> + <item row="0" column="0"> + <widget class="QLabel" name="label_10"> + <property name="text"> + <string>Cross-sections:</string> + </property> + </widget> + </item> + <item row="1" column="0"> + <widget class="QLabel" name="label_12"> + <property name="text"> + <string>Points:</string> + </property> + </widget> + </item> + <item row="0" column="1"> + <widget class="QLabel" name="label_cs"> + <property name="whatsThis"> + <string notr="true"/> + </property> + <property name="text"> + <string>@nb_cs</string> + </property> + </widget> + </item> + <item row="0" column="2"> + <spacer name="horizontalSpacer_2"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + </layout> + </widget> + </item> + </layout> + </widget> + <widget class="QWidget" name=""> + <layout class="QVBoxLayout" name="verticalLayout"/> + </widget> + </widget> + </item> + </layout> + </widget> + </widget> + </item> + </layout> + </widget> + <resources/> + <connections/> +</ui>