diff --git a/src/Model/HydraulicStructures/Basic/HydraulicStructures.py b/src/Model/HydraulicStructures/Basic/HydraulicStructures.py index b98d81dedf6d25f5dbe8a869dd39db69bf0d8313..4bbbfba3e75fff0c54e341140adcab32eab9311a 100644 --- a/src/Model/HydraulicStructures/Basic/HydraulicStructures.py +++ b/src/Model/HydraulicStructures/Basic/HydraulicStructures.py @@ -80,11 +80,15 @@ class BasicHS(SQLSubModel): @classmethod def _get_ctor_from_type(cls, t): - from Model.HydraulicStructure.Basic.Types import ( - NotDefined, + from Model.HydraulicStructures.Basic.Types import ( + NotDefined, Dummy, ) res = NotDefined + + if t == "DU": + res = Dummy + return res @classmethod @@ -93,7 +97,8 @@ class BasicHS(SQLSubModel): table = execute( "SELECT id, name, type, enabled, hs " + - "FROM hydraulic_structures " + "FROM hydraulic_structures_basic " + + f"WHERE hs = {data['hs_id']} " ) for row in table: @@ -113,7 +118,7 @@ class BasicHS(SQLSubModel): bhs.enabled = enabled data['bhs_id'] = bhs_id - bhs._data = BasicHSValue._db_load( + bhs._data = BHSValue._db_load( execute, data ) @@ -144,7 +149,7 @@ class BasicHS(SQLSubModel): data['bhs_id'] = self.id execute( "DELETE FROM hydraulic_structures_basic_value " + - f"WHERE bhs = {bhs_id}" + f"WHERE bhs = {self.id}" ) for values in self._data: @@ -183,8 +188,8 @@ class BasicHS(SQLSubModel): self._status.modified() @property - def lst(self): - return self._data.copy() + def parameters(self): + return self._data def convert(self, new_type): return new_type(id=self.id, name=self.name, status=self._status) diff --git a/src/Model/HydraulicStructures/Basic/Types.py b/src/Model/HydraulicStructures/Basic/Types.py index bcceb49a2837d022430dec2775ef3cecd10dbf6a..137b272fa1cc8f33b99f1d9fd5dd57a0098f055a 100644 --- a/src/Model/HydraulicStructures/Basic/Types.py +++ b/src/Model/HydraulicStructures/Basic/Types.py @@ -35,9 +35,9 @@ class NotDefined(BasicHS): self._type = "ND" self._data = [ - BHSValue("foo", float, 0.0), - BHSValue("bar", float, 42.0), - BHSValue("baz", int, 13), + BHSValue("foo", float, 0.0, status=status), + BHSValue("bar", float, 42.0, status=status), + BHSValue("baz", int, 13, status=status), ] diff --git a/src/Model/HydraulicStructures/HydraulicStructures.py b/src/Model/HydraulicStructures/HydraulicStructures.py index ede447638c10c4d1af47347e22954f71da4ed6de..5d9a747284d2541538a3d3f435112065f1af464c 100644 --- a/src/Model/HydraulicStructures/HydraulicStructures.py +++ b/src/Model/HydraulicStructures/HydraulicStructures.py @@ -17,6 +17,7 @@ # -*- coding: utf-8 -*- import logging +from functools import reduce from tools import trace, timer, old_pamhyr_date_to_timestamp @@ -117,15 +118,15 @@ class HydraulicStructure(SQLSubModel): ) hs.enabled = enabled - hs.input_kp = input_kp - hs.output_kp = output_kp + hs.input_kp = input_kp if input_kp != -1 else None + hs.output_kp = output_kp if output_kp != -1 else None hs.input_reach, hs.output_reach = reduce( lambda acc, n: ( n if n.id == input_reach_id else acc[0], n if n.id == output_reach_id else acc[1] ), - data["reachs"], + data["edges"], [None, None] ) diff --git a/src/Model/Study.py b/src/Model/Study.py index d29910bba1564282de30dc8d2eeb1a086aa18e37..cb28978db93350da0b35a2d5942d0e877c9d9edc 100644 --- a/src/Model/Study.py +++ b/src/Model/Study.py @@ -86,7 +86,7 @@ class Study(SQLModel): def is_saved(self): return self.status.is_saved() - def save(self): + def save(self, progress=None): # Save a copy of database fdir, fname = os.path.split(self.filename) @@ -110,7 +110,7 @@ class Study(SQLModel): # Save self.last_save_date = datetime.now() - self._save() + self._save(progress=progress) self.status.save() @property @@ -266,38 +266,54 @@ class Study(SQLModel): return new - def _save(self): + def _save(self, progress=None): + progress = progress if progress is not None else lambda: None + self.execute( f"UPDATE info SET " + f"value='{self._db_format(self.name)}' WHERE key='name'" ) + progress() self.execute( f"UPDATE info SET " + f"value='{self._db_format(self.description)}' " + "WHERE key='description'" ) + progress() self.execute( f"UPDATE info SET " + f"value='{self._time_system}' WHERE key='time_system'" ) + progress() self.execute( f"UPDATE info SET " + f"value='{timestamp(self._date)}' WHERE key='date'" ) + progress() self.execute( f"UPDATE info SET " + f"value='{timestamp(self.creation_date)}' " + "WHERE key='creation_date'" ) + progress() self.execute( f"UPDATE info SET " + f"value='{timestamp(self.last_save_date)}' " + "WHERE key='last_save_date'" ) + progress() - self._save_submodel([self._river]) + self._save_submodel([self._river], data=progress) self.commit() + def sql_save_request_count(self): + return self._count() + + def _count(self): + cnt = self._save_count([self._river]) + logger.debug(cnt) + return cnt + 6 + def close(self): """Close db connection diff --git a/src/Model/Tools/PamhyrDB.py b/src/Model/Tools/PamhyrDB.py index 8ee134fc97f7c725e0cbe1ebdc6fedb94ecb942f..44065709db86ccabe2aaa1e340e3ec673259be46 100644 --- a/src/Model/Tools/PamhyrDB.py +++ b/src/Model/Tools/PamhyrDB.py @@ -21,6 +21,7 @@ import sqlite3 import logging from pathlib import Path +from functools import reduce from tools import SQL from Model.Except import NotImplementedMethodeError @@ -87,11 +88,16 @@ class SQLModel(SQL): raise NotImplementedMethodeError(self, self._update) def _save_submodel(self, objs, data=None): - def fn(sql): return self.execute( - sql, - fetch_one=False, - commit=False - ) + progress = data if data is not None else lambda: None + + def fn(sql): + res = self.execute( + sql, + fetch_one=False, + commit=False + ) + progress() + return res ok = True for obj in objs: @@ -100,9 +106,43 @@ class SQLModel(SQL): self.commit() return ok - def _save(self): + def _save(self, progress=None): raise NotImplementedMethodeError(self, self._save) + def _count(self): + raise NotImplementedMethodeError(self, self._count) + + def _save_count(self, objs, data=None): + counter = { + "insert": 0, + "update": 0, + "delete": 0, + "other": 0, + } + + def fn(sql): + if "insert" in sql.lower(): + counter["insert"] = counter["insert"] + 1 + elif "update" in sql.lower(): + counter["update"] = counter["update"] + 1 + elif "delete" in sql.lower(): + counter["delete"] = counter["delete"] + 1 + else: + counter["other"] = counter["other"] + 1 + return [] + + ok = True + for obj in objs: + ok &= obj._db_save(fn) + + logger.debug(counter) + + return reduce( + lambda acc, k: acc + counter[k], + counter, + 0 + ) + @classmethod def _load(cls, filename=None): raise NotImplementedMethodeError(cls, cls._load) diff --git a/src/View/HydraulicStructures/BasicHydraulicStructures/Table.py b/src/View/HydraulicStructures/BasicHydraulicStructures/Table.py index f6d22a77e0c736145f95e9834f28ebc78a4ee3a3..ed81c13166ed87864d90f72026efbea6f0833789 100644 --- a/src/View/HydraulicStructures/BasicHydraulicStructures/Table.py +++ b/src/View/HydraulicStructures/BasicHydraulicStructures/Table.py @@ -31,14 +31,15 @@ from PyQt5.QtWidgets import ( QDialogButtonBox, QPushButton, QLineEdit, QFileDialog, QTableView, QAbstractItemView, QUndoStack, QShortcut, QAction, QItemDelegate, - QComboBox, + QComboBox, QMessageBox, ) from View.Tools.PamhyrTable import PamhyrTableModel from View.HydraulicStructures.BasicHydraulicStructures.UndoCommand import ( SetNameCommand, SetTypeCommand, - AddCommand, DelCommand, + SetEnabledCommand, AddCommand, DelCommand, + SetValueCommand, ) from Model.HydraulicStructures.Basic.Types import BHS_types @@ -61,15 +62,13 @@ class ComboBoxDelegate(QItemDelegate): def createEditor(self, parent, option, index): self.editor = QComboBox(parent) - lst = list( map( - lambda k: self._long_types[k], BHS_types.keys() + lambda k: self._long_types[k], + BHS_types.keys() ) ) - self.editor.addItems( - lst - ) + self.editor.addItems(lst) self.editor.setCurrentText(index.data(Qt.DisplayRole)) return self.editor @@ -137,20 +136,35 @@ class TableModel(PamhyrTableModel): ) ) elif self._headers[column] == "type": - key = next(k for k, v in self._long_types.items() - if v == value) - self._undo.push( - SetTypeCommand( - self._data, row, BHS_types[key] + if self._question_set_type(): + key = next( + k for k, v in self._long_types.items() + if v == value + ) + + self._undo.push( + SetTypeCommand( + self._data, row, BHS_types[key] + ) ) - ) except Exception as e: - logger.info(e) + logger.error(e) logger.debug(traceback.format_exc()) self.dataChanged.emit(index, index) return True + def _question_set_type(self): + question = QMessageBox(self._parent) + + question.setWindowTitle(self._trad['msg_type_change_title']) + question.setText(self._trad['msg_type_change_text']) + question.setStandardButtons(QMessageBox.Cancel | QMessageBox.Ok) + question.setIcon(QMessageBox.Question) + + res = question.exec() + return res == QMessageBox.Ok + def add(self, row, parent=QModelIndex()): self.beginInsertRows(parent, row, row - 1) @@ -175,6 +189,14 @@ class TableModel(PamhyrTableModel): self.endRemoveRows() self.layoutChanged.emit() + def enabled(self, row, enabled, parent=QModelIndex()): + self._undo.push( + SetEnabledCommand( + self._lst, row, enabled + ) + ) + self.layoutChanged.emit() + def undo(self): self._undo.undo() self.layoutChanged.emit() @@ -182,3 +204,72 @@ class TableModel(PamhyrTableModel): def redo(self): self._undo.redo() self.layoutChanged.emit() + + +class ParametersTableModel(PamhyrTableModel): + def __init__(self, trad=None, **kwargs): + self._trad = trad + self._long_types = {} + + if self._trad is not None: + self._long_types = self._trad.get_dict("long_types") + + self._hs_index = None + + super(ParametersTableModel, self).__init__(trad=trad, **kwargs) + + def rowCount(self, parent): + if self._hs_index is None: + return 0 + + return len( + self._data.basic_structure(self._hs_index) + ) + + def data(self, index, role): + if role != Qt.ItemDataRole.DisplayRole: + return QVariant() + + if self._hs_index is None: + return QVariant() + + row = index.row() + column = index.column() + + hs = self._data.basic_structure(self._hs_index) + + if self._headers[column] == "name": + return hs.parameters[row].name + elif self._headers[column] == "value": + return str(hs.parameters[row].value) + + return QVariant() + + def setData(self, index, value, role=Qt.EditRole): + if not index.isValid() or role != Qt.EditRole: + return False + + if self._hs_index is None: + return QVariant() + + row = index.row() + column = index.column() + + try: + if self._headers[column] == "value": + self._undo.push( + SetValueCommand( + self._data.basic_structure(self._hs_index), + row, value + ) + ) + except Exception as e: + logger.error(e) + logger.debug(traceback.format_exc()) + + self.dataChanged.emit(index, index) + return True + + def update_hs_index(self, index): + self._hs_index = index + self.layoutChanged.emit() diff --git a/src/View/HydraulicStructures/BasicHydraulicStructures/Translate.py b/src/View/HydraulicStructures/BasicHydraulicStructures/Translate.py index c29d79c89358f3ba875eab093c7b3d0eaa7e500d..1a845d4b70d53fbc4f69206135d5899098378529 100644 --- a/src/View/HydraulicStructures/BasicHydraulicStructures/Translate.py +++ b/src/View/HydraulicStructures/BasicHydraulicStructures/Translate.py @@ -27,6 +27,17 @@ class BasicHydraulicStructuresTranslate(PamhyrTranslate): def __init__(self): super(BasicHydraulicStructuresTranslate, self).__init__() + self._dict['msg_type_change_title'] = _translate( + "BasicHydraulicStructures", + "Change hydraulic structure type" + ) + + self._dict['msg_type_change_text'] = _translate( + "BasicHydraulicStructures", + "Do you want to change the hydraulic structure type and reset \ +hydraulic structure values?" + ) + self._sub_dict["long_types"] = { "ND": _translate("BasicHydraulicStructures", "Not defined"), "S1": _translate("BasicHydraulicStructures", "Seuil déversoir"), @@ -45,3 +56,8 @@ class BasicHydraulicStructuresTranslate(PamhyrTranslate): "name": _translate("BasicHydraulicStructures", "Name"), "type": _translate("BasicHydraulicStructures", "Type"), } + + self._sub_dict["table_headers_parameters"] = { + "name": _translate("BasicHydraulicStructures", "Name"), + "value": _translate("BasicHydraulicStructures", "Value"), + } diff --git a/src/View/HydraulicStructures/BasicHydraulicStructures/UndoCommand.py b/src/View/HydraulicStructures/BasicHydraulicStructures/UndoCommand.py index ec7f0eaf23eae48122089f1263b2782efa596bc7..124a446ca9c548498a43acfb0efb57b5d0ceaf3d 100644 --- a/src/View/HydraulicStructures/BasicHydraulicStructures/UndoCommand.py +++ b/src/View/HydraulicStructures/BasicHydraulicStructures/UndoCommand.py @@ -60,6 +60,22 @@ class SetTypeCommand(QUndoCommand): self._hs.insert(self._index, self._new) +class SetEnabledCommand(QUndoCommand): + def __init__(self, hs, index, enabled): + QUndoCommand.__init__(self) + + self._hs = hs + self._index = index + self._old = not enabled + self._new = enabled + + def undo(self): + self._hs.basic_structure(self._index).enabled = self._old + + def redo(self): + self._hs.basic_structure(self._index).enabled = self._new + + class AddCommand(QUndoCommand): def __init__(self, hs, index): QUndoCommand.__init__(self) @@ -96,7 +112,7 @@ class DelCommand(QUndoCommand): self._hs.insert(row, el) def redo(self): - self._hs.delete_i([self._rows]) + self._hs.delete_i(self._rows) class PasteCommand(QUndoCommand): @@ -110,9 +126,28 @@ class PasteCommand(QUndoCommand): self._bhs.reverse() def undo(self): - self._hs.delete_i(range(self._row, self._row + len(self._bhs)) - ) + self._hs.delete_i(range(self._row, self._row + len(self._bhs))) def redo(self): for r in self._bhs: self._hs.insert(self._row, r) + +#################################### +# Basic hydraulic structure values # +#################################### + + +class SetValueCommand(QUndoCommand): + def __init__(self, bhs, index, value): + QUndoCommand.__init__(self) + + self._bhs = bhs + self._index = index + self._old = self._bhs.parameters[self._index].value + self._new = self._bhs.parameters[self._index].type(value) + + def undo(self): + self._bhs.parameters[self._index].value = self._old + + def redo(self): + self._bhs.parameters[self._index].value = self._new diff --git a/src/View/HydraulicStructures/BasicHydraulicStructures/Window.py b/src/View/HydraulicStructures/BasicHydraulicStructures/Window.py index 58af27ed7f5ff3665d8f18fd11d1f3783e84e8a5..f83099c44d5a75208107e237645e82f20e7cce2d 100644 --- a/src/View/HydraulicStructures/BasicHydraulicStructures/Window.py +++ b/src/View/HydraulicStructures/BasicHydraulicStructures/Window.py @@ -41,11 +41,13 @@ from View.Tools.Plot.PamhyrToolbar import PamhyrPlotToolbar from View.HydraulicStructures.PlotAC import PlotAC from View.HydraulicStructures.BasicHydraulicStructures.Table import ( - TableModel, ComboBoxDelegate + ComboBoxDelegate, TableModel, ParametersTableModel, ) from View.Network.GraphWidget import GraphWidget -from View.HydraulicStructures.BasicHydraulicStructures.Translate import BasicHydraulicStructuresTranslate +from View.HydraulicStructures.BasicHydraulicStructures.Translate import ( + BasicHydraulicStructuresTranslate +) _translate = QCoreApplication.translate @@ -77,6 +79,10 @@ class BasicHydraulicStructuresWindow(PamhyrWindow): self.setup_connections() def setup_table(self): + self.setup_table_bhs() + self.setup_table_bhs_parameters() + + def setup_table_bhs(self): self._table = None self._delegate_type = ComboBoxDelegate( @@ -95,6 +101,7 @@ class BasicHydraulicStructuresWindow(PamhyrWindow): trad=self._trad, data=self._hs, undo=self._undo_stack, + parent=self, ) selectionModel = table.selectionModel() @@ -108,6 +115,21 @@ class BasicHydraulicStructuresWindow(PamhyrWindow): ) table.scrollTo(index) + def setup_table_bhs_parameters(self): + self._table_parameters = None + + table = self.find(QTableView, f"tableView_2") + self._table_parameters = ParametersTableModel( + table_view=table, + table_headers=self._trad.get_dict("table_headers_parameters"), + editable_headers=["value"], + delegates={}, + trad=self._trad, + data=self._hs, + undo=self._undo_stack, + parent=self, + ) + def setup_checkbox(self): self._checkbox = self.find(QCheckBox, f"checkBox") self._set_checkbox_state() @@ -145,27 +167,29 @@ class BasicHydraulicStructuresWindow(PamhyrWindow): def setup_connections(self): self.find(QAction, "action_add").triggered.connect(self.add) self.find(QAction, "action_delete").triggered.connect(self.delete) - self._checkbox.stateChanged.connect(self._set_basic_structure_state) + self._checkbox.clicked.connect(self._set_basic_structure_state) table = self.find(QTableView, "tableView") table.selectionModel()\ - .selectionChanged\ - .connect(self.update) + .selectionChanged\ + .connect(self.update) + + self._table.layoutChanged.connect(self.update) def index_selected(self): table = self.find(QTableView, "tableView") - r = table.selectionModel()\ - .selectedRows() - if len(r)>0: + r = table.selectionModel().selectedRows() + + if len(r) > 0: return r[0] else: return None def index_selected_row(self): table = self.find(QTableView, "tableView") - r = table.selectionModel()\ - .selectedRows() - if len(r)>0: + r = table.selectionModel().selectedRows() + + if len(r) > 0: return r[0].row() else: return None @@ -184,6 +208,7 @@ class BasicHydraulicStructuresWindow(PamhyrWindow): def add(self): rows = self.index_selected_rows() + if len(self._hs) == 0 or len(rows) == 0: self._table.add(0) else: @@ -191,6 +216,7 @@ class BasicHydraulicStructuresWindow(PamhyrWindow): def delete(self): rows = self.index_selected_rows() + if len(rows) == 0: return @@ -210,6 +236,7 @@ class BasicHydraulicStructuresWindow(PamhyrWindow): def _set_checkbox_state(self): row = self.index_selected_row() + if row is None: self._checkbox.setEnabled(False) self._checkbox.setChecked(True) @@ -219,14 +246,17 @@ class BasicHydraulicStructuresWindow(PamhyrWindow): def _set_basic_structure_state(self): row = self.index_selected_row() - if row is None: - self._checkbox.setEnabled(False) - else: - self._hs.basic_structure(row).enabled = self._checkbox.isChecked() + + if row is not None: + self._table.enabled( + row, + self._checkbox.isChecked() + ) def update(self): self._set_checkbox_state() - self._update_clear_plot() + self._update_parameters_table() - def _update_clear_plot(self): - rows = self.index_selected_rows() + def _update_parameters_table(self): + row = self.index_selected_row() + self._table_parameters.update_hs_index(row) diff --git a/src/View/HydraulicStructures/PlotAC.py b/src/View/HydraulicStructures/PlotAC.py index 028d65730f8fb626b50c7e32b8a0fbcd16a0a2f7..9964686afe28b5fdb6120eb1123d7345366077a0 100644 --- a/src/View/HydraulicStructures/PlotAC.py +++ b/src/View/HydraulicStructures/PlotAC.py @@ -106,13 +106,13 @@ class PlotAC(PamhyrPlot): self.update() def update(self): - if self.line_kp is None: self.draw() else: if self._current_reach is None or self._current_profile is None: self.clear() return + profile = self._current_profile x = profile.get_station() z = profile.z() diff --git a/src/View/HydraulicStructures/Table.py b/src/View/HydraulicStructures/Table.py index 58e086848c2f5d0fc62acfdb11ed0ec584b6653e..210cf1e8ec7d6d0d9c4de8bc8170e8d637167cf5 100644 --- a/src/View/HydraulicStructures/Table.py +++ b/src/View/HydraulicStructures/Table.py @@ -80,7 +80,7 @@ class ComboBoxDelegate(QItemDelegate): val ) - self.editor.setCurrentText(index.data(Qt.DisplayRole)) + self.editor.setCurrentText(str(index.data(Qt.DisplayRole))) return self.editor def setEditorData(self, editor, index): diff --git a/src/View/HydraulicStructures/UndoCommand.py b/src/View/HydraulicStructures/UndoCommand.py index 826cd268a4370d32ebef7b8fd47f3397a2294c09..9c47ccf12256fb436862ef1316db9814ddfd52a2 100644 --- a/src/View/HydraulicStructures/UndoCommand.py +++ b/src/View/HydraulicStructures/UndoCommand.py @@ -92,11 +92,9 @@ class SetEnabledCommand(QUndoCommand): self._new = enabled def undo(self): - logger.info(f"Undo {self._new} -> {self._old}") self._h_s_lst.get(self._index).enabled = self._old def redo(self): - logger.info(f"Undo {self._old} -> {self._new}") self._h_s_lst.get(self._index).enabled = self._new diff --git a/src/View/HydraulicStructures/Window.py b/src/View/HydraulicStructures/Window.py index 7c139dd3906f016ab859a6a8852b4e65cb39b63b..2a0719067d513f58eb419bfa172ebc6842a8973e 100644 --- a/src/View/HydraulicStructures/Window.py +++ b/src/View/HydraulicStructures/Window.py @@ -48,7 +48,9 @@ from View.HydraulicStructures.Table import ( from View.Network.GraphWidget import GraphWidget from View.HydraulicStructures.Translate import HydraulicStructuresTranslate -from View.HydraulicStructures.BasicHydraulicStructures.Window import BasicHydraulicStructuresWindow +from View.HydraulicStructures.BasicHydraulicStructures.Window import ( + BasicHydraulicStructuresWindow +) _translate = QCoreApplication.translate diff --git a/src/View/MainWindow.py b/src/View/MainWindow.py index 89df56f38c4f315ab16667a667182313ddfeedde..4ce865db72b513fb371b577034cf67677894c8c2 100644 --- a/src/View/MainWindow.py +++ b/src/View/MainWindow.py @@ -28,12 +28,12 @@ from PyQt5.QtGui import ( ) from PyQt5.QtCore import ( - QTranslator, QEvent, QUrl, + Qt, QTranslator, QEvent, QUrl, ) from PyQt5.QtWidgets import ( QMainWindow, QApplication, QAction, QFileDialog, QShortcut, QMenu, QToolBar, - QMessageBox, + QMessageBox, QProgressDialog, ) from PyQt5.uic import loadUi @@ -406,8 +406,20 @@ class ApplicationWindow(QMainWindow, ListedSubWindow, WindowToolKit): if self._study.is_saved: return + sql_request_count = self._study.sql_save_request_count() + progress = QProgressDialog( + "Saving...", None, + 0, sql_request_count, + parent=self + ) + progress.setWindowModality(Qt.WindowModal) + progress.setValue(0) + logger.info("Save...") - self._study.save() + self._study.save( + progress=lambda: progress.setValue(progress.value() + 1) + ) + logger.info("Done") def save_as_study(self): """Save current study as new file @@ -428,7 +440,20 @@ class ApplicationWindow(QMainWindow, ListedSubWindow, WindowToolKit): else: self._study.filename = file_name + ".pamhyr" - self._study.save() + sql_request_count = self._study.sql_save_request_count() + progress = QProgressDialog( + "Saving...", None, + 0, sql_request_count, + parent=self + ) + progress.setWindowModality(Qt.WindowModal) + progress.setValue(0) + + logger.info("Save...") + self._study.save( + progress=lambda: progress.setValue(progress.value() + 1) + ) + logger.info("Done") ################## # MSG AND DIALOG # diff --git a/src/View/Network/GraphWidget.py b/src/View/Network/GraphWidget.py index ade0eaffd326c3c07dc0ecfbe63afa2bacc871e7..a045a1fa60ab1cf46fc2d6ff51961c411c297371 100644 --- a/src/View/Network/GraphWidget.py +++ b/src/View/Network/GraphWidget.py @@ -178,12 +178,15 @@ class EdgeItem(QGraphicsItem): if self.graph.selected_item() == self: color = Qt.red elif self.graph.current_edge() == self: - color = Qt.black + color = Qt.blue elif not self.graph.graph.is_enable_edge(self.edge): color = Qt.darkGray - painter.setPen(QPen(color, 2, Qt.SolidLine, Qt.RoundCap, - Qt.RoundJoin)) + painter.setPen( + QPen( + color, 2, Qt.SolidLine, Qt.RoundCap, Qt.RoundJoin + ) + ) # Draw the line painter.drawLine(line) diff --git a/src/View/Tools/PamhyrTable.py b/src/View/Tools/PamhyrTable.py index 6ce66a428a1345a5d18dae51287dc31df36d65b8..803e58421fd97a95bf68a03183df2e4e5281b9c8 100644 --- a/src/View/Tools/PamhyrTable.py +++ b/src/View/Tools/PamhyrTable.py @@ -83,7 +83,8 @@ class PamhyrTableModel(QAbstractTableModel): trad=None, data=None, undo=None, - opt_data=None): + opt_data=None, + parent=None): super(PamhyrTableModel, self).__init__() self._table_view = table_view @@ -93,6 +94,7 @@ class PamhyrTableModel(QAbstractTableModel): self._editable_headers = editable_headers self._delegates = delegates self._trad = trad + self._parent = parent self._data = data self._opt_data = opt_data