Compare commits

..

6 Commits

9 changed files with 149 additions and 21 deletions

View File

@ -60,9 +60,12 @@ class StricklersList(PamhyrModelList):
return self.lst
def new(self, index):
owner_scenario = (
self._status.scenario_id if self._status is not None else -1
)
s = Stricklers(
status=self._status,
owner_scenario=self._status.scenario_id
owner_scenario=owner_scenario
)
self.insert(index, s)
self.modified()

View File

@ -120,7 +120,9 @@ class ConfigureWindow(PamhyrDialog):
editable_headers=["name", "comment", "minor", "medium"],
data=self._stricklers,
undo=self._undo_stack,
trad=self._trad_stricklers,
display_manning=self._config.display_manning,
unique_names=True,
)
def setup_data(self):

View File

@ -52,27 +52,58 @@ _translate = QCoreApplication.translate
class ComboBoxDelegate(QItemDelegate):
def __init__(self, data=None, study=None,
def __init__(self, data=None, study=None, application_stricklers=None,
mode="stricklers", trad=None, display_manning=True,
parent=None):
super(ComboBoxDelegate, self).__init__(parent)
self._data = data
self._study = study
self._application_stricklers = application_stricklers or []
self._trad = trad
self._mode = mode
self._display_manning = display_manning
@staticmethod
def same_strickler(first, second):
return (
first.name == second.name
and first.comment == second.comment
and first.minor == second.minor
and first.medium == second.medium
)
def createEditor(self, parent, option, index):
self.editor = QComboBox(parent)
if self._mode == "stricklers":
self.editor.addItem(self._trad["not_defined"], None)
for strickler in self._study.river.stricklers.stricklers:
study_stricklers = self._study.river.stricklers.stricklers
for strickler in study_stricklers:
self.editor.addItem(
display_strickler(strickler, self._display_manning),
strickler
)
application_stricklers = [
application_strickler
for application_strickler in self._application_stricklers
if not any(
self.same_strickler(
application_strickler, study_strickler
)
for study_strickler in study_stricklers
)
]
if application_stricklers:
self.editor.insertSeparator(self.editor.count())
for strickler in application_stricklers:
self.editor.addItem(
display_strickler(
strickler, self._display_manning
),
strickler
)
elif self._mode == "rk":
self.editor.addItems(
list(map(str, self._data.reach.get_rk()))
@ -113,6 +144,25 @@ class FrictionTableModel(PamhyrTableModel):
self._lst = self._data.frictions
self._study = self._opt_data
def study_strickler(self, strickler):
if strickler is None:
return None
study_stricklers = self._study.river.stricklers
if any(s is strickler for s in study_stricklers.stricklers):
return strickler
for current in study_stricklers.stricklers:
if ComboBoxDelegate.same_strickler(current, strickler):
return current
copied = study_stricklers.new(len(study_stricklers))
copied.name = strickler.name
copied.comment = strickler.comment
copied.minor = strickler.minor
copied.medium = strickler.medium
return copied
def data(self, index, role):
if role != Qt.ItemDataRole.DisplayRole:
return QVariant()
@ -171,6 +221,7 @@ class FrictionTableModel(PamhyrTableModel):
elif self._headers[column] == "begin_strickler":
strickler = value if hasattr(value, "minor") else \
self._study.river.strickler(value)
strickler = self.study_strickler(strickler)
self._undo.push(
SetBeginStricklerCommand(
self._lst, row, strickler
@ -179,6 +230,7 @@ class FrictionTableModel(PamhyrTableModel):
elif self._headers[column] == "end_strickler":
strickler = value if hasattr(value, "minor") else \
self._study.river.strickler(value)
strickler = self.study_strickler(strickler)
self._undo.push(
SetEndStricklerCommand(
self._lst, row, strickler

View File

@ -104,6 +104,10 @@ class FrictionsWindow(PamhyrWindow):
self._delegate_stricklers = ComboBoxDelegate(
data=self._reach,
study=self._study,
application_stricklers=(
self._config.stricklers.stricklers
if self._config is not None else []
),
mode="stricklers",
trad=self._trad,
display_manning=getattr(self._config, "display_manning", False),

View File

@ -31,7 +31,7 @@ from PyQt5.QtWidgets import (
QDialogButtonBox, QPushButton, QLineEdit,
QFileDialog, QTableView, QAbstractItemView,
QUndoStack, QShortcut, QAction, QItemDelegate,
QComboBox,
QComboBox, QMessageBox,
)
from View.Tools.PamhyrTable import PamhyrTableModel
@ -51,12 +51,55 @@ _translate = QCoreApplication.translate
class TableModel(PamhyrTableModel):
def __init__(self, *args, display_manning=False, **kwargs):
def __init__(self, *args, display_manning=False, unique_names=False,
hidden_stricklers=None, **kwargs):
self.display_manning = display_manning
self.unique_names = unique_names
self.hidden_stricklers = hidden_stricklers or []
super(TableModel, self).__init__(*args, **kwargs)
@staticmethod
def same_strickler(first, second):
return (
first.name == second.name
and first.comment == second.comment
and first.minor == second.minor
and first.medium == second.medium
)
@property
def visible_stricklers(self):
return [
strickler
for strickler in self._data.stricklers
if not any(
self.same_strickler(strickler, hidden)
for hidden in self.hidden_stricklers
)
]
def rowCount(self, parent=QModelIndex()):
return len(self.visible_stricklers)
def get_visible(self, row):
return self.visible_stricklers[row]
def get_data_row(self, row):
return self._data.stricklers.index(self.get_visible(row))
def name_is_already_used(self, row, name):
current = self.get_visible(row)
return any(
strickler is not current and strickler.name == name
for strickler in self._data.stricklers
)
def get_true_data_row(self, row):
el = self._data.get(row)
visible = self.visible_stricklers
if row >= len(visible):
return len(self._data._lst)
el = visible[row]
return next(
map(
@ -74,18 +117,19 @@ class TableModel(PamhyrTableModel):
row = index.row()
column = index.column()
strickler = self.get_visible(row)
if self._headers[column] == "name":
return self._data.get(row).name
return strickler.name
elif self._headers[column] == "comment":
return self._data.get(row).comment
return strickler.comment
elif self._headers[column] == "minor":
return display_coefficient(
self._data.get(row).minor, self.display_manning
strickler.minor, self.display_manning
)
elif self._headers[column] == "medium":
return display_coefficient(
self._data.get(row).medium, self.display_manning
strickler.medium, self.display_manning
)
return QVariant()
@ -101,6 +145,20 @@ class TableModel(PamhyrTableModel):
row = index.row()
column = index.column()
if (
self._headers[column] == "name"
and self.unique_names
and self.name_is_already_used(row, str(value))
):
QMessageBox.warning(
self._table_view,
self._trad["duplicate_name_title"],
self._trad["duplicate_name_message"]
)
return False
row = self.get_data_row(row)
try:
if self._headers[column] == "name":
self._undo.push(
@ -156,7 +214,7 @@ class TableModel(PamhyrTableModel):
DelCommand(
self._data, list(
map(
lambda r: self._data.get(r),
lambda r: self.get_visible(r),
rows
)
)

View File

@ -91,17 +91,18 @@ class StricklersWindow(PamhyrWindow):
def setup_table(self):
self._table = {}
if self._study.is_editable():
editable_headers = ["name", "comment", "minor", "medium"]
else:
editable_headers = []
for t in ["app", "study"]:
table = self.find(QTableView, f"tableView_{t}")
if t == "study":
data = self._study.river.stricklers
hidden_stricklers = self._config.stricklers.stricklers
else:
data = self._config.stricklers
hidden_stricklers = []
editable_headers = []
if t == "study" and self._study.is_editable():
editable_headers = ["name", "comment", "minor", "medium"]
self._table[t] = TableModel(
table_view=table,
@ -112,6 +113,7 @@ class StricklersWindow(PamhyrWindow):
display_manning=getattr(
self._config, "display_manning", False
),
hidden_stricklers=hidden_stricklers,
)
table.setModel(self._table[t])

View File

@ -45,6 +45,13 @@ class StricklersTranslate(MainTranslate):
self._dict["application_mannings"] = _translate(
"Stricklers", "Manning coefficients of the application"
)
self._dict["duplicate_name_title"] = _translate(
"Stricklers", "Name already used"
)
self._dict["duplicate_name_message"] = _translate(
"Stricklers",
"This name is already used by another coefficient."
)
self._sub_dict["table_headers"] = {
"name": self._dict["name"],

View File

@ -325,7 +325,7 @@
</item>
</layout>
</item>
<item row="1" column="0">
<item row="2" column="0">
<widget class="QTableView" name="tableView_stricklers"/>
</item>
</layout>

View File

@ -339,10 +339,10 @@ class Config(SQL):
for stricklers in self.stricklers.stricklers:
self.execute(f"""
INSERT INTO stricklers VALUES (
'{self._db_format(stricklers._name)}',
'{self._db_format(stricklers._comment)}',
'{stricklers._minor}',
'{stricklers._medium}'
'{self._db_format(stricklers.name)}',
'{self._db_format(stricklers.comment)}',
'{stricklers.minor}',
'{stricklers.medium}'
)
""")