# MainWindowTabGraph.py -- Pamhyr # Copyright (C) 2026 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. # -*- coding: utf-8 -*- from View.Tools.Plot.PamhyrCanvas import MplCanvas from View.Tools.Plot.PamhyrToolbar import PamhyrPlotToolbar from View.PlotXY import PlotXY from View.Network.GraphWidget import GraphWidget from PyQt5.QtCore import Qt from PyQt5.QtWidgets import ( QWidget, QGroupBox, QLabel, QHBoxLayout, QVBoxLayout, QSplitter, ) class WidgetGraph(QWidget): """Read-only network graph displayed in the main window.""" def __init__(self, study=None, trad=None, parent=None): super(WidgetGraph, self).__init__(parent) self._study = study self._trad = trad self._plot_river = None layout = QHBoxLayout(self) self._splitter = QSplitter(Qt.Horizontal, self) self._splitter.setChildrenCollapsible(False) layout.addWidget(self._splitter) self._graph_widget = None self._graph_group = QGroupBox( self._trad["graph_network_title"], self ) self._graph_layout = QVBoxLayout(self._graph_group) self._graph_title = QLabel(self._graph_group) self._graph_title.setTextFormat(Qt.PlainText) self._graph_title.setAlignment(Qt.AlignLeft | Qt.AlignVCenter) self._graph_title.setWordWrap(True) self._graph_layout.addWidget(self._graph_title) self._update_graph_title() self._splitter.addWidget(self._graph_group) self.canvas = MplCanvas(width=5, height=4, dpi=100) self.canvas.setObjectName("canvas_graph") self.toolbar = PamhyrPlotToolbar( self.canvas, self, items=["home", "zoom", "save", "iso", "back/forward", "move"] ) self._plot_group = QGroupBox( self._trad["graph_geographic_title"], self ) self._plot_layout = QVBoxLayout(self._plot_group) self._plot_layout.addWidget(self.toolbar) self._plot_layout.addWidget(self.canvas, 1) self._splitter.addWidget(self._plot_group) self._splitter.setStretchFactor(0, 1) self._splitter.setStretchFactor(1, 1) self._splitter.setSizes([1000, 1000]) self.plot = PlotXY( canvas=self.canvas, data=None, trad=self._trad, toolbar=self.toolbar, parent=self ) @property def study(self): return self._study @study.setter def study(self, study): self._study = study self._update_graph_title() def _update_graph_title(self): self._graph_title.setText( self._study.name if self._study is not None else "" ) def update(self): river = self._study.river if self._study is not None else None view = None if river is not None and river is self._plot_river: axes = self.canvas.axes if axes.has_data(): view = (axes.get_xlim(), axes.get_ylim(), axes.get_aspect(), axes.get_adjustable()) self._update_graph_title() if (self._graph_widget is not None and (self._study is None or self._graph_widget.graph is not self._study.river)): self._graph_layout.removeWidget(self._graph_widget) self._graph_widget.deleteLater() self._graph_widget = None if self._study is not None and self._graph_widget is None: self._graph_widget = GraphWidget( self._study.river, parent=self, only_display=True, trad=self._trad, ) self._graph_layout.addWidget(self._graph_widget, 1) elif self._graph_widget is not None: self._graph_widget.display_update() data = None geotiff = None if self._study is not None: data = self._study.river.enable_edges() geotiff = self._study.river.geotiff self.plot = PlotXY( canvas=self.canvas, data=data, geotiff=geotiff, trad=self._trad, toolbar=self.toolbar, parent=self ) self.plot.update() self._plot_river = river if view is not None: x_limits, y_limits, aspect, adjustable = view self.canvas.axes.set_aspect(aspect, adjustable=adjustable) self.canvas.axes.set_xlim(x_limits) self.canvas.axes.set_ylim(y_limits) self.canvas.draw_idle()