mirror of https://gitlab.com/pamhyr/pamhyr2
Compare commits
6 Commits
fefc6ebc4f
...
48e9c14525
| Author | SHA1 | Date |
|---|---|---|
|
|
48e9c14525 | |
|
|
db62af6f71 | |
|
|
b468a1eb70 | |
|
|
b9ab202e3f | |
|
|
129dde1c57 | |
|
|
ff2d3926b1 |
|
|
@ -60,9 +60,12 @@ class StricklersList(PamhyrModelList):
|
||||||
return self.lst
|
return self.lst
|
||||||
|
|
||||||
def new(self, index):
|
def new(self, index):
|
||||||
|
owner_scenario = (
|
||||||
|
self._status.scenario_id if self._status is not None else -1
|
||||||
|
)
|
||||||
s = Stricklers(
|
s = Stricklers(
|
||||||
status=self._status,
|
status=self._status,
|
||||||
owner_scenario=self._status.scenario_id
|
owner_scenario=owner_scenario
|
||||||
)
|
)
|
||||||
self.insert(index, s)
|
self.insert(index, s)
|
||||||
self.modified()
|
self.modified()
|
||||||
|
|
|
||||||
|
|
@ -120,7 +120,9 @@ class ConfigureWindow(PamhyrDialog):
|
||||||
editable_headers=["name", "comment", "minor", "medium"],
|
editable_headers=["name", "comment", "minor", "medium"],
|
||||||
data=self._stricklers,
|
data=self._stricklers,
|
||||||
undo=self._undo_stack,
|
undo=self._undo_stack,
|
||||||
|
trad=self._trad_stricklers,
|
||||||
display_manning=self._config.display_manning,
|
display_manning=self._config.display_manning,
|
||||||
|
unique_names=True,
|
||||||
)
|
)
|
||||||
|
|
||||||
def setup_data(self):
|
def setup_data(self):
|
||||||
|
|
|
||||||
|
|
@ -52,27 +52,58 @@ _translate = QCoreApplication.translate
|
||||||
|
|
||||||
|
|
||||||
class ComboBoxDelegate(QItemDelegate):
|
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,
|
mode="stricklers", trad=None, display_manning=True,
|
||||||
parent=None):
|
parent=None):
|
||||||
super(ComboBoxDelegate, self).__init__(parent)
|
super(ComboBoxDelegate, self).__init__(parent)
|
||||||
|
|
||||||
self._data = data
|
self._data = data
|
||||||
self._study = study
|
self._study = study
|
||||||
|
self._application_stricklers = application_stricklers or []
|
||||||
self._trad = trad
|
self._trad = trad
|
||||||
self._mode = mode
|
self._mode = mode
|
||||||
self._display_manning = display_manning
|
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):
|
def createEditor(self, parent, option, index):
|
||||||
self.editor = QComboBox(parent)
|
self.editor = QComboBox(parent)
|
||||||
|
|
||||||
if self._mode == "stricklers":
|
if self._mode == "stricklers":
|
||||||
self.editor.addItem(self._trad["not_defined"], None)
|
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(
|
self.editor.addItem(
|
||||||
display_strickler(strickler, self._display_manning),
|
display_strickler(strickler, self._display_manning),
|
||||||
strickler
|
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":
|
elif self._mode == "rk":
|
||||||
self.editor.addItems(
|
self.editor.addItems(
|
||||||
list(map(str, self._data.reach.get_rk()))
|
list(map(str, self._data.reach.get_rk()))
|
||||||
|
|
@ -113,6 +144,25 @@ class FrictionTableModel(PamhyrTableModel):
|
||||||
self._lst = self._data.frictions
|
self._lst = self._data.frictions
|
||||||
self._study = self._opt_data
|
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):
|
def data(self, index, role):
|
||||||
if role != Qt.ItemDataRole.DisplayRole:
|
if role != Qt.ItemDataRole.DisplayRole:
|
||||||
return QVariant()
|
return QVariant()
|
||||||
|
|
@ -171,6 +221,7 @@ class FrictionTableModel(PamhyrTableModel):
|
||||||
elif self._headers[column] == "begin_strickler":
|
elif self._headers[column] == "begin_strickler":
|
||||||
strickler = value if hasattr(value, "minor") else \
|
strickler = value if hasattr(value, "minor") else \
|
||||||
self._study.river.strickler(value)
|
self._study.river.strickler(value)
|
||||||
|
strickler = self.study_strickler(strickler)
|
||||||
self._undo.push(
|
self._undo.push(
|
||||||
SetBeginStricklerCommand(
|
SetBeginStricklerCommand(
|
||||||
self._lst, row, strickler
|
self._lst, row, strickler
|
||||||
|
|
@ -179,6 +230,7 @@ class FrictionTableModel(PamhyrTableModel):
|
||||||
elif self._headers[column] == "end_strickler":
|
elif self._headers[column] == "end_strickler":
|
||||||
strickler = value if hasattr(value, "minor") else \
|
strickler = value if hasattr(value, "minor") else \
|
||||||
self._study.river.strickler(value)
|
self._study.river.strickler(value)
|
||||||
|
strickler = self.study_strickler(strickler)
|
||||||
self._undo.push(
|
self._undo.push(
|
||||||
SetEndStricklerCommand(
|
SetEndStricklerCommand(
|
||||||
self._lst, row, strickler
|
self._lst, row, strickler
|
||||||
|
|
|
||||||
|
|
@ -104,6 +104,10 @@ class FrictionsWindow(PamhyrWindow):
|
||||||
self._delegate_stricklers = ComboBoxDelegate(
|
self._delegate_stricklers = ComboBoxDelegate(
|
||||||
data=self._reach,
|
data=self._reach,
|
||||||
study=self._study,
|
study=self._study,
|
||||||
|
application_stricklers=(
|
||||||
|
self._config.stricklers.stricklers
|
||||||
|
if self._config is not None else []
|
||||||
|
),
|
||||||
mode="stricklers",
|
mode="stricklers",
|
||||||
trad=self._trad,
|
trad=self._trad,
|
||||||
display_manning=getattr(self._config, "display_manning", False),
|
display_manning=getattr(self._config, "display_manning", False),
|
||||||
|
|
|
||||||
|
|
@ -31,7 +31,7 @@ from PyQt5.QtWidgets import (
|
||||||
QDialogButtonBox, QPushButton, QLineEdit,
|
QDialogButtonBox, QPushButton, QLineEdit,
|
||||||
QFileDialog, QTableView, QAbstractItemView,
|
QFileDialog, QTableView, QAbstractItemView,
|
||||||
QUndoStack, QShortcut, QAction, QItemDelegate,
|
QUndoStack, QShortcut, QAction, QItemDelegate,
|
||||||
QComboBox,
|
QComboBox, QMessageBox,
|
||||||
)
|
)
|
||||||
|
|
||||||
from View.Tools.PamhyrTable import PamhyrTableModel
|
from View.Tools.PamhyrTable import PamhyrTableModel
|
||||||
|
|
@ -51,12 +51,55 @@ _translate = QCoreApplication.translate
|
||||||
|
|
||||||
|
|
||||||
class TableModel(PamhyrTableModel):
|
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.display_manning = display_manning
|
||||||
|
self.unique_names = unique_names
|
||||||
|
self.hidden_stricklers = hidden_stricklers or []
|
||||||
super(TableModel, self).__init__(*args, **kwargs)
|
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):
|
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(
|
return next(
|
||||||
map(
|
map(
|
||||||
|
|
@ -74,18 +117,19 @@ class TableModel(PamhyrTableModel):
|
||||||
|
|
||||||
row = index.row()
|
row = index.row()
|
||||||
column = index.column()
|
column = index.column()
|
||||||
|
strickler = self.get_visible(row)
|
||||||
|
|
||||||
if self._headers[column] == "name":
|
if self._headers[column] == "name":
|
||||||
return self._data.get(row).name
|
return strickler.name
|
||||||
elif self._headers[column] == "comment":
|
elif self._headers[column] == "comment":
|
||||||
return self._data.get(row).comment
|
return strickler.comment
|
||||||
elif self._headers[column] == "minor":
|
elif self._headers[column] == "minor":
|
||||||
return display_coefficient(
|
return display_coefficient(
|
||||||
self._data.get(row).minor, self.display_manning
|
strickler.minor, self.display_manning
|
||||||
)
|
)
|
||||||
elif self._headers[column] == "medium":
|
elif self._headers[column] == "medium":
|
||||||
return display_coefficient(
|
return display_coefficient(
|
||||||
self._data.get(row).medium, self.display_manning
|
strickler.medium, self.display_manning
|
||||||
)
|
)
|
||||||
|
|
||||||
return QVariant()
|
return QVariant()
|
||||||
|
|
@ -101,6 +145,20 @@ class TableModel(PamhyrTableModel):
|
||||||
row = index.row()
|
row = index.row()
|
||||||
column = index.column()
|
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:
|
try:
|
||||||
if self._headers[column] == "name":
|
if self._headers[column] == "name":
|
||||||
self._undo.push(
|
self._undo.push(
|
||||||
|
|
@ -156,7 +214,7 @@ class TableModel(PamhyrTableModel):
|
||||||
DelCommand(
|
DelCommand(
|
||||||
self._data, list(
|
self._data, list(
|
||||||
map(
|
map(
|
||||||
lambda r: self._data.get(r),
|
lambda r: self.get_visible(r),
|
||||||
rows
|
rows
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -91,17 +91,18 @@ class StricklersWindow(PamhyrWindow):
|
||||||
def setup_table(self):
|
def setup_table(self):
|
||||||
self._table = {}
|
self._table = {}
|
||||||
|
|
||||||
if self._study.is_editable():
|
|
||||||
editable_headers = ["name", "comment", "minor", "medium"]
|
|
||||||
else:
|
|
||||||
editable_headers = []
|
|
||||||
|
|
||||||
for t in ["app", "study"]:
|
for t in ["app", "study"]:
|
||||||
table = self.find(QTableView, f"tableView_{t}")
|
table = self.find(QTableView, f"tableView_{t}")
|
||||||
if t == "study":
|
if t == "study":
|
||||||
data = self._study.river.stricklers
|
data = self._study.river.stricklers
|
||||||
|
hidden_stricklers = self._config.stricklers.stricklers
|
||||||
else:
|
else:
|
||||||
data = self._config.stricklers
|
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(
|
self._table[t] = TableModel(
|
||||||
table_view=table,
|
table_view=table,
|
||||||
|
|
@ -112,6 +113,7 @@ class StricklersWindow(PamhyrWindow):
|
||||||
display_manning=getattr(
|
display_manning=getattr(
|
||||||
self._config, "display_manning", False
|
self._config, "display_manning", False
|
||||||
),
|
),
|
||||||
|
hidden_stricklers=hidden_stricklers,
|
||||||
)
|
)
|
||||||
|
|
||||||
table.setModel(self._table[t])
|
table.setModel(self._table[t])
|
||||||
|
|
|
||||||
|
|
@ -45,6 +45,13 @@ class StricklersTranslate(MainTranslate):
|
||||||
self._dict["application_mannings"] = _translate(
|
self._dict["application_mannings"] = _translate(
|
||||||
"Stricklers", "Manning coefficients of the application"
|
"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"] = {
|
self._sub_dict["table_headers"] = {
|
||||||
"name": self._dict["name"],
|
"name": self._dict["name"],
|
||||||
|
|
|
||||||
|
|
@ -325,7 +325,7 @@
|
||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</item>
|
</item>
|
||||||
<item row="1" column="0">
|
<item row="2" column="0">
|
||||||
<widget class="QTableView" name="tableView_stricklers"/>
|
<widget class="QTableView" name="tableView_stricklers"/>
|
||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
|
|
|
||||||
|
|
@ -339,10 +339,10 @@ class Config(SQL):
|
||||||
for stricklers in self.stricklers.stricklers:
|
for stricklers in self.stricklers.stricklers:
|
||||||
self.execute(f"""
|
self.execute(f"""
|
||||||
INSERT INTO stricklers VALUES (
|
INSERT INTO stricklers VALUES (
|
||||||
'{self._db_format(stricklers._name)}',
|
'{self._db_format(stricklers.name)}',
|
||||||
'{self._db_format(stricklers._comment)}',
|
'{self._db_format(stricklers.comment)}',
|
||||||
'{stricklers._minor}',
|
'{stricklers.minor}',
|
||||||
'{stricklers._medium}'
|
'{stricklers.medium}'
|
||||||
)
|
)
|
||||||
""")
|
""")
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue