Profiles: can now disable some profiles, they still appears in the list, but they are marked as disabled

mesh_tab
Dylan Jeannin 2026-08-21 16:35:40 +02:00
parent 5b778af745
commit deb84ca331
8 changed files with 146 additions and 13 deletions

View File

@ -58,7 +58,8 @@ class ProfileXYZ(Profile, SQLSubModel):
num=0,
nb_point: int = 0,
code1: int = 0, code2: int = 0,
status=None, owner_scenario=-1):
status=None, owner_scenario=-1,
enabled=True):
"""ProfileXYZ constructor
Args:
@ -90,6 +91,7 @@ class ProfileXYZ(Profile, SQLSubModel):
self.time_l = 0.0
self._station = []
self.station_up_to_date = False
self._enabled = bool(enabled)
self._get_water_limits_cache = {}
self._get_water_limits_ac_cache = {}
@ -108,6 +110,7 @@ class ProfileXYZ(Profile, SQLSubModel):
code1 INTEGER NOT NULL,
code2 INTEGER NOT NULL,
sl INTEGER,
enabled BOOLEAN NOT NULL DEFAULT TRUE,
{Scenario.create_db_add_scenario()},
{Scenario.create_db_add_scenario_fk()},
FOREIGN KEY(reach) REFERENCES river_reach(pamhyr_id),
@ -152,6 +155,13 @@ class ProfileXYZ(Profile, SQLSubModel):
"ADD COLUMN deleted BOOLEAN NOT NULL DEFAULT FALSE"
)
if major == "0" and int(minor) <=2:
if int(release) < 9:
execute(
"ALTER TABLE geometry_profileXYZ " +
"ADD COLUMN enabled BOOLEAN NOT NULL DEFAULT TRUE"
)
return cls._update_submodel(execute, version, data)
@classmethod
@ -237,7 +247,7 @@ class ProfileXYZ(Profile, SQLSubModel):
table = execute(
"SELECT pamhyr_id, ind, deleted, name, rk, num, " +
"code1, code2, sl, scenario " +
"code1, code2, sl, scenario, enabled " +
"FROM geometry_profileXYZ " +
f"WHERE reach = {reach.id} " +
f"AND scenario = {scenario.id} " +
@ -258,6 +268,7 @@ class ProfileXYZ(Profile, SQLSubModel):
code2 = next(it)
sl = next(it)
owner_scenario = next(it)
enabled = (next(it) == 1)
profile = cls(
id=pid, ind=ind, num=num,
@ -265,7 +276,8 @@ class ProfileXYZ(Profile, SQLSubModel):
code1=code1, code2=code2,
reach=reach,
status=status,
owner_scenario=owner_scenario
owner_scenario=owner_scenario,
enabled=enabled
)
if deleted:
profile.set_as_deleted()
@ -318,12 +330,12 @@ class ProfileXYZ(Profile, SQLSubModel):
execute(
"INSERT OR REPLACE INTO " +
"geometry_profileXYZ(pamhyr_id, deleted, ind, name, reach, " +
"rk, num, code1, code2, sl, scenario) " +
"rk, num, code1, code2, sl, scenario, enabled) " +
"VALUES (" +
f"{self.pamhyr_id}, {self._db_format(self.is_deleted())}, " +
f"{ind}, '{self._db_format(self._name)}', " +
f"{self.reach.pamhyr_id}, {self.rk}, {self.num}, " +
f"{self.code1}, {self.code1}, {sl}, {self._status.scenario_id}" +
f"{self.code1}, {self.code1}, {sl}, {self._status.scenario_id}, {self._db_format(self._enabled)}" +
")"
)
@ -390,7 +402,8 @@ class ProfileXYZ(Profile, SQLSubModel):
name=self.name,
rk=self.rk,
reach=self.reach,
status=self._status
status=self._status,
enabled=self.is_enabled
)
if self.is_deleted():
new_p.set_as_deleted()
@ -410,7 +423,8 @@ class ProfileXYZ(Profile, SQLSubModel):
name=self.name,
rk=self.rk,
reach=new_reach,
status=self._status
status=self._status,
enabled=self.is_enabled
)
if self.is_deleted():
new_p.set_as_deleted()
@ -1131,7 +1145,8 @@ class ProfileXYZ(Profile, SQLSubModel):
p = ProfileXYZ(name=self.name,
rk=self.rk,
reach=self.reach,
status=self._status)
status=self._status,
enabled=self.is_enabled)
for i, k in enumerate(self.points):
p.insert_point(i, k.copy())
@ -1165,3 +1180,16 @@ class ProfileXYZ(Profile, SQLSubModel):
break
self._points = points
self.modified()
@property
def is_enabled(self):
return self._enabled
@property
def enabled(self):
return self._enabled
@enabled.setter
def enabled(self, value):
self._enabled = bool(value)
self.modified()

View File

@ -157,6 +157,14 @@ class Reach(SQLSubModel):
def profiles(self, profiles):
self._profiles = profiles
@property
def enabled_profiles(self):
return list(filter(lambda p: p.is_enabled, self.profiles))
@property
def number_enabled_profiles(self):
return len(self.enabled_profiles)
def get_profiles_from_rk(self, rk):
return list(
filter(

View File

@ -46,7 +46,7 @@ logger = logging.getLogger()
class Study(SQLModel):
_version = "0.2.7"
_version = "0.2.9"
_sub_classes = [
Scenario,

View File

@ -64,15 +64,20 @@ class GeometryReachTableModel(PamhyrTableModel):
if not index.isValid():
return QVariant()
profile = self._data.profile(index.row())
if role == Qt.BackgroundRole and not profile.is_enabled:
return QColor(190, 190, 190)
if role == Qt.DisplayRole and index.column() == 0:
return self._data.profile(index.row()).name
return profile.name
if role == Qt.DisplayRole and index.column() == 1:
rk = self._data.profile(index.row()).rk
rk = profile.rk
return f"{rk:.4f}"
if role == Qt.DisplayRole and index.column() == 2:
return str(self._data.profile(index.row()).nb_points)
return str(profile.nb_points)
if role == Qt.TextAlignmentRole:
return Qt.AlignHCenter | Qt.AlignVCenter
@ -155,6 +160,14 @@ class GeometryReachTableModel(PamhyrTableModel):
self.endRemoveRows()
self.layoutChanged.emit()
def enabled(self, rows, enabled):
self._undo.push(
SetEnabledCommand(
self._data, rows, enabled
)
)
self.layoutChanged.emit()
def sort_profiles(self, _reverse):
self.layoutAboutToBeChanged.emit()

View File

@ -44,6 +44,9 @@ class GeometryTranslate(MainTranslate):
self._dict["cross_sections"] = _translate("Geometry", "cross-sections")
self._dict["profile"] = _translate("Geometry", "cross-section")
self._dict["profiles"] = _translate("Geometry", "cross-sections")
self._dict["cross_section_enabled_count"] = _translate(
"Geometry", "Cross-section enabled ({count} disabled)"
)
self._dict["transverse_abscissa"] = _translate(
"Geometry", "Transverse abscissa (m)"

View File

@ -68,6 +68,27 @@ class SetRKCommand(SetDataCommand):
self._reach.profile(self._index).rk = self._new
class SetEnabledCommand(QUndoCommand):
def __init__(self, reach, rows, enabled):
QUndoCommand.__init__(self)
self._profiles = [reach.profile(row) for row in rows]
self._old = [profile.is_enabled for profile in self._profiles]
self._new = bool(enabled)
@staticmethod
def _set_enabled(profile, enabled):
profile.enabled = enabled
def undo(self):
for profile, enabled in zip(self._profiles, self._old):
self._set_enabled(profile, enabled)
def redo(self):
for profile in self._profiles:
self._set_enabled(profile, self._new)
class AddCommand(QUndoCommand):
def __init__(self, reach, index):
QUndoCommand.__init__(self)

View File

@ -99,6 +99,7 @@ class GeometryWindow(PamhyrWindow):
self._profile_window = []
self.setup_table()
self.setup_checkbox()
self.setup_plots()
self.setup_statusbar()
self.setup_connections()
@ -124,6 +125,10 @@ class GeometryWindow(PamhyrWindow):
table.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
table.setAlternatingRowColors(True)
def setup_checkbox(self):
self._checkbox = self.find(QCheckBox, "checkBox_enabled")
self._set_checkbox_state()
def setup_plots(self):
self.setup_plots_xy()
self.setup_plots_rkc()
@ -223,6 +228,9 @@ class GeometryWindow(PamhyrWindow):
.selectionChanged\
.connect(self.select_current_profile)
if not self._study.is_read_only():
self._checkbox.clicked.connect(self._set_profiles_state)
self._table.layoutChanged.connect(self.update_redraw)
def update(self):
@ -525,6 +533,48 @@ class GeometryWindow(PamhyrWindow):
self._plot_ac.draw()
self.tableView.model().blockSignals(False)
self._set_checkbox_state()
def index_selected_rows(self):
return [
index.row()
for index in self.tableView.selectionModel().selectedRows()
]
def _set_checkbox_state(self):
rows = self.index_selected_rows()
editable = not self._study.is_read_only()
disabled_count = self._reach.number_profiles - self._reach.number_enabled_profiles
self._checkbox.setText(
self._trad["cross_section_enabled_count"].format(
count=disabled_count
)
)
self._checkbox.setEnabled(editable and len(rows) > 0)
if len(rows) == 0:
self._checkbox.setTristate(False)
self._checkbox.setChecked(False)
return
states = {
self._reach.profile(row).is_enabled
for row in rows
}
if len(states) == 1:
self._checkbox.setTristate(False)
self._checkbox.setChecked(states.pop())
else:
self._checkbox.setTristate(True)
self._checkbox.setCheckState(Qt.PartiallyChecked)
def _set_profiles_state(self, enabled):
rows = self.index_selected_rows()
if len(rows) == 0:
return
self._checkbox.setTristate(False)
self._table.enabled(rows, enabled)
def add(self):
if len(self.tableView.selectedIndexes()) == 0:

View File

@ -24,10 +24,20 @@
<enum>Qt::Horizontal</enum>
</property>
<widget class="QWidget" name="horizontalLayoutWidget">
<layout class="QHBoxLayout" name="horizontalLayout">
<layout class="QVBoxLayout" name="horizontalLayout">
<item>
<widget class="QTableView" name="tableView"/>
</item>
<item>
<widget class="QCheckBox" name="checkBox_enabled">
<property name="text">
<string>Cross-section enabled (0 disabled)</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</widget>
<widget class="QSplitter" name="splitter_2">