Compare commits

..

3 Commits

Author SHA1 Message Date
57bfbaa5b2 RELEASE 2025-09-29 21:25:36 +02:00
0edaace3ec ui components snake_case 2025-09-29 21:18:56 +02:00
7a86b34c17 icon in toolbar FIX 2025-09-29 16:39:49 +02:00
10 changed files with 207 additions and 205 deletions

View File

@ -6,10 +6,10 @@ Congratulations! You just built a plugin for QGIS!<br/><br />
<div id='help' style='font-size:.9em;'>
Your plugin <b>Pegelonline</b> was created in:<br>
&nbsp;&nbsp;<b>~/PycharmProjects/pegelonline</b>
&nbsp;&nbsp;<b>/home/katrin/PycharmProjects/pegelonline</b>
<p>
Your QGIS plugin directory is located at:<br>
&nbsp;&nbsp;<b>~/.local/share/QGIS/QGIS3/profiles/default/python/plugins</b>
&nbsp;&nbsp;<b>/home/katrin/.local/share/QGIS/QGIS3/profiles/default/python/plugins</b>
<p>
<h3>What's Next</h3>
<ol>

View File

@ -1,10 +1,10 @@
Plugin Builder Results
Your plugin Pegelonline was created in:
~/PycharmProjects/pegelonline
/home/katrin/PycharmProjects/pegelonline
Your QGIS plugin directory is located at:
~/.local/share/QGIS/QGIS3/profiles/default/python/plugins
/home/katrin/.local/share/QGIS/QGIS3/profiles/default/python/plugins
What's Next:

View File

@ -23,6 +23,11 @@
This script initializes the plugin, making it known to QGIS.
"""
from . import resources
# Sonst wird das Icon in der Toolbar nicht angezeigt
print(resources.__doc__)
# noinspection PyPep8Naming
def classFactory(iface): # pylint: disable=invalid-name

BIN
icon.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@ -44,7 +44,7 @@ name: pegelonline
# Full path to where you want your plugin directory copied. If empty,
# the QGIS default path will be used. Don't include the plugin name in
# the path.
plugin_path:/home/patrick/.local/share/QGIS/QGIS3/profiles/default/python/plugins
plugin_path:/home/katrin/.local/share/QGIS/QGIS3/profiles/default/python/plugins
[files]
# Python files that should be deployed with the plugin

View File

@ -64,7 +64,7 @@ class Pegelonline:
# Declare instance attributes
self.actions = []
self.menu = self.tr(u'&Pegelonline')
# TODO: We are going to let the user set this up in a future iteration
self.toolbar = self.iface.addToolBar(u'Pegelonline')
self.toolbar.setObjectName(u'Pegelonline')

View File

@ -61,7 +61,7 @@
<number>5</number>
</property>
<item>
<widget class="QCheckBox" name="cbStationsVisible">
<widget class="QCheckBox" name="cb_stations_visible">
<property name="text">
<string>Anzeigen (Download von Pegelonline)</string>
</property>
@ -100,21 +100,21 @@
<number>0</number>
</property>
<item>
<widget class="QCheckBox" name="cbStationsNumber">
<widget class="QCheckBox" name="cb_stations_number">
<property name="text">
<string>Nummer</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="cbStationsName">
<widget class="QCheckBox" name="cb_stations_name">
<property name="text">
<string>Name</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="cbStationsAgency">
<widget class="QCheckBox" name="cb_stations_agency">
<property name="text">
<string>Behörde</string>
</property>
@ -141,14 +141,14 @@
<number>0</number>
</property>
<item>
<widget class="QCheckBox" name="cbStationsWater">
<widget class="QCheckBox" name="cb_stations_water">
<property name="text">
<string>Gewässername</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="cbStationsKm">
<widget class="QCheckBox" name="cb_stations_km">
<property name="text">
<string>Flusskilometer</string>
</property>
@ -193,7 +193,7 @@
<item>
<layout class="QVBoxLayout" name="verticalLayout_11">
<item>
<widget class="QRadioButton" name="rbStationsStylePreset">
<widget class="QRadioButton" name="rb_stations_style_preset">
<property name="text">
<string>Vorgabe</string>
</property>
@ -201,7 +201,7 @@
<bool>true</bool>
</property>
<attribute name="buttonGroup">
<string notr="true">bgStationsStyle</string>
<string notr="true">cb_stations_style</string>
</attribute>
</widget>
</item>
@ -210,7 +210,7 @@
<item>
<layout class="QVBoxLayout" name="verticalLayout_12">
<item>
<widget class="QRadioButton" name="rbStationsStyleAgency">
<widget class="QRadioButton" name="rb_stations_style_agency">
<property name="text">
<string>Behörde</string>
</property>
@ -218,7 +218,7 @@
<bool>false</bool>
</property>
<attribute name="buttonGroup">
<string notr="true">bgStationsStyle</string>
<string notr="true">cb_stations_style</string>
</attribute>
</widget>
</item>
@ -227,7 +227,7 @@
<item>
<layout class="QVBoxLayout" name="verticalLayout_13">
<item>
<widget class="QRadioButton" name="rbStationsStyleWater">
<widget class="QRadioButton" name="rb_stations_style_water">
<property name="text">
<string>Gewässer</string>
</property>
@ -235,7 +235,7 @@
<bool>false</bool>
</property>
<attribute name="buttonGroup">
<string notr="true">bgStationsStyle</string>
<string notr="true">cb_stations_style</string>
</attribute>
</widget>
</item>
@ -272,21 +272,21 @@
<number>5</number>
</property>
<item>
<widget class="QToolButton" name="btnSelectRectangle">
<widget class="QToolButton" name="btn_select_rectangle">
<property name="text">
<string>...</string>
</property>
</widget>
</item>
<item>
<widget class="QToolButton" name="btnUnselectLayer">
<widget class="QToolButton" name="btn_unselect_layer">
<property name="text">
<string>...</string>
</property>
</widget>
</item>
<item>
<widget class="QToolButton" name="btnUnselectAll">
<widget class="QToolButton" name="btn_unselect_all">
<property name="text">
<string>...</string>
</property>
@ -300,21 +300,21 @@
</widget>
</item>
<item>
<widget class="QToolButton" name="btnZoomFullExtent">
<widget class="QToolButton" name="btn_zoom_full_extent">
<property name="text">
<string>...</string>
</property>
</widget>
</item>
<item>
<widget class="QToolButton" name="btnZoomToLayer">
<widget class="QToolButton" name="btn_zoom_to_layer">
<property name="text">
<string>...</string>
</property>
</widget>
</item>
<item>
<widget class="QToolButton" name="btnZoomToSelected">
<widget class="QToolButton" name="btn_zoom_to_selected">
<property name="text">
<string>...</string>
</property>
@ -328,7 +328,7 @@
</widget>
</item>
<item>
<widget class="QToolButton" name="btnMapTips">
<widget class="QToolButton" name="btn_map_tips">
<property name="text">
<string>...</string>
</property>
@ -393,7 +393,7 @@
</widget>
</item>
<item>
<widget class="QComboBox" name="slGraphStation">
<widget class="QComboBox" name="sl_graph_station">
<property name="enabled">
<bool>false</bool>
</property>
@ -406,7 +406,7 @@
</widget>
</item>
<item>
<widget class="QPushButton" name="btnGraphStationsRefresh">
<widget class="QPushButton" name="btn_graph_stations_refresh">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
<horstretch>0</horstretch>
@ -448,7 +448,7 @@
</widget>
</item>
<item>
<widget class="QSpinBox" name="numGraphDays">
<widget class="QSpinBox" name="num_graph_days">
<property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
<horstretch>0</horstretch>
@ -473,7 +473,7 @@
</widget>
</item>
<item>
<widget class="QPushButton" name="btnGraphLoad">
<widget class="QPushButton" name="btn_graph_load">
<property name="enabled">
<bool>false</bool>
</property>
@ -534,7 +534,7 @@
<number>5</number>
</property>
<item>
<widget class="QCheckBox" name="cbWaterlevelsVisible">
<widget class="QCheckBox" name="cb_waterlevels_visible">
<property name="text">
<string>Anzeigen (Download von Pegelonline)</string>
</property>
@ -567,28 +567,28 @@
<number>0</number>
</property>
<item>
<widget class="QCheckBox" name="cbWaterlevelsNumber">
<widget class="QCheckBox" name="cb_waterlevels_number">
<property name="text">
<string>Nummer</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="cbWaterlevelsName">
<widget class="QCheckBox" name="cb_waterlevels_name">
<property name="text">
<string>Name</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="cbWaterlevelsAgency">
<widget class="QCheckBox" name="cb_waterlevels_agency">
<property name="text">
<string>Behörde</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="cbWaterlevelsWater">
<widget class="QCheckBox" name="cb_waterlevels_water">
<property name="text">
<string>Gewässername</string>
</property>
@ -602,28 +602,28 @@
<number>0</number>
</property>
<item>
<widget class="QCheckBox" name="cbWaterlevelsTimestamp">
<widget class="QCheckBox" name="cb_waterlevels_timestamp">
<property name="text">
<string>Zeitstempel</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="cbWaterlevelsValue">
<widget class="QCheckBox" name="cb_waterlevels_value">
<property name="text">
<string>Aktueller Pegel</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="cbWaterlevelsMean">
<widget class="QCheckBox" name="cb_waterlevels_mean">
<property name="text">
<string>MNW, MHW</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="cbWaterlevelsAbsolute">
<widget class="QCheckBox" name="cb_waterlevels_absolute">
<property name="text">
<string>NSW, HSW</string>
</property>
@ -673,7 +673,7 @@
<number>0</number>
</property>
<item>
<widget class="QRadioButton" name="rbWaterlevelsStylePreset">
<widget class="QRadioButton" name="rb_waterlevels_style_preset">
<property name="text">
<string>Vorgabe</string>
</property>
@ -681,7 +681,7 @@
<bool>true</bool>
</property>
<attribute name="buttonGroup">
<string notr="true">bgWaterlevelsStyle</string>
<string notr="true">cb_waterlevels_style</string>
</attribute>
</widget>
</item>
@ -718,17 +718,17 @@
<number>0</number>
</property>
<item>
<widget class="QRadioButton" name="rbWaterlevelsStyleAgency">
<widget class="QRadioButton" name="rb_waterlevels_style_agency">
<property name="text">
<string>Behörde</string>
</property>
<attribute name="buttonGroup">
<string notr="true">bgWaterlevelsStyle</string>
<string notr="true">cb_waterlevels_style</string>
</attribute>
</widget>
</item>
<item>
<widget class="QRadioButton" name="rbWaterlevelsStyleWater">
<widget class="QRadioButton" name="rb_waterlevels_style_water">
<property name="text">
<string>Gewässer</string>
</property>
@ -736,7 +736,7 @@
<bool>false</bool>
</property>
<attribute name="buttonGroup">
<string notr="true">bgWaterlevelsStyle</string>
<string notr="true">cb_waterlevels_style</string>
</attribute>
</widget>
</item>
@ -761,22 +761,22 @@
<number>0</number>
</property>
<item>
<widget class="QRadioButton" name="rbWaterlevelsStyleMean">
<widget class="QRadioButton" name="rb_waterlevels_style_mean">
<property name="text">
<string>MNW, MHW</string>
</property>
<attribute name="buttonGroup">
<string notr="true">bgWaterlevelsStyle</string>
<string notr="true">cb_waterlevels_style</string>
</attribute>
</widget>
</item>
<item>
<widget class="QRadioButton" name="rbWaterlevelsStyleAbsolute">
<widget class="QRadioButton" name="rb_waterlevels_style_absolute">
<property name="text">
<string>NSW, HSW</string>
</property>
<attribute name="buttonGroup">
<string notr="true">bgWaterlevelsStyle</string>
<string notr="true">cb_waterlevels_style</string>
</attribute>
</widget>
</item>
@ -823,14 +823,14 @@
<number>5</number>
</property>
<item>
<widget class="QCheckBox" name="cbBasemapLines">
<widget class="QCheckBox" name="cb_basemap_lines">
<property name="text">
<string>Flüsse</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="cbBasemapAreas">
<widget class="QCheckBox" name="cb_basemap_areas">
<property name="text">
<string>Flächen</string>
</property>
@ -845,7 +845,7 @@
<resources/>
<connections/>
<buttongroups>
<buttongroup name="bgWaterlevelsStyle"/>
<buttongroup name="bgStationsStyle"/>
<buttongroup name="cb_waterlevels_style"/>
<buttongroup name="cb_stations_style"/>
</buttongroups>
</ui>

View File

@ -53,20 +53,20 @@ class PegelonlineDockWidgetGraph(QtWidgets.QDockWidget, FORM_CLASS):
"""
print("PegelonlineDockWidgetGraph::load: station=%s days=%s" % (station, days))
self.lbGraph.clear()
self.lb_graph.clear()
self.setWindowTitle("%s / %d Tag(e)" % (station, days))
self.show()
if station == '' or station is None:
# Keine Station ausgewählt → Abbruch
print("PegelonlineDockWidgetGraph::load: Fehler: Ungültige Station: %s" % (station,))
self.lbGraph.setText("Bitte Station wählen...")
self.lb_graph.setText("Bitte Station wählen...")
return
if days is None or days < 1 or days > 30:
# Ungültige Anzahl an Tagen ausgewählt → Abbruch
print("PegelonlineDockWidgetGraph::load: Fehler: Ungültige Anzahl von Tagen: %s" % (days,))
self.lbGraph.setText("Bitte Tage [1, 30] wählen...")
self.lb_graph.setText("Bitte Tage [1, 30] wählen...")
return
graph = PoGraphReader(station, days)
@ -75,12 +75,12 @@ class PegelonlineDockWidgetGraph(QtWidgets.QDockWidget, FORM_CLASS):
if image_data is None or len(image_data) == 0:
# Keine Bild-Daten beim Herunterladen erhalten → Abbruch
print("PegelonlineDockWidgetGraph::load: Fehler: Keine Daten erhalten")
self.lbGraph.setText("Fehler beim Download!")
self.lb_graph.setText("Fehler beim Download!")
return
pixmap = QtGui.QPixmap()
pixmap.loadFromData(image_data)
self.lbGraph.setPixmap(pixmap)
self.lbGraph.resize(pixmap.width(), pixmap.height())
self.lb_graph.setPixmap(pixmap)
self.lb_graph.resize(pixmap.width(), pixmap.height())
print("PegelonlineDockWidgetGraph::load: Bild erfolgreich geladen")

View File

@ -16,7 +16,7 @@
<widget class="QWidget" name="dockWidgetContents">
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QLabel" name="lbGraph">
<widget class="QLabel" name="lb_graph">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>

View File

@ -40,9 +40,6 @@ class PoRunner(object):
self.local_dir = os.path.dirname(os.path.realpath(__file__))
# während dem Aktualisieren der Stationsliste treten change-signale auf, die werden so abgefangen
self._graph_stations_lock = True
# Layer
self.stations = None
self.waterlevels = None
@ -50,13 +47,13 @@ class PoRunner(object):
self.areas = None
# Standard Aktionen verbinden
self.ui.btnZoomFullExtent.setDefaultAction(iface.actionZoomFullExtent())
self.ui.btnZoomToLayer.setDefaultAction(iface.actionZoomToLayer())
self.ui.btnZoomToSelected.setDefaultAction(iface.actionZoomToSelected())
self.ui.btnSelectRectangle.setDefaultAction(iface.actionSelectRectangle())
self.ui.btnUnselectAll.setDefaultAction(iface.mainWindow().findChild(QAction, "mActionDeselectAll"))
self.ui.btnUnselectLayer.setDefaultAction(iface.mainWindow().findChild(QAction, "mActionDeselectActiveLayer"))
self.ui.btnMapTips.setDefaultAction(iface.actionMapTips())
self.ui.btn_zoom_full_extent.setDefaultAction(iface.actionZoomFullExtent())
self.ui.btn_zoom_to_layer.setDefaultAction(iface.actionZoomToLayer())
self.ui.btn_zoom_to_selected.setDefaultAction(iface.actionZoomToSelected())
self.ui.btn_select_rectangle.setDefaultAction(iface.actionSelectRectangle())
self.ui.btn_unselect_all.setDefaultAction(iface.mainWindow().findChild(QAction, "mActionDeselectAll"))
self.ui.btn_unselect_layer.setDefaultAction(iface.mainWindow().findChild(QAction, "mActionDeselectActiveLayer"))
self.ui.btn_map_tips.setDefaultAction(iface.actionMapTips())
# Signale verbinden
self._basemap_connect_signals()
@ -111,15 +108,15 @@ class PoRunner(object):
Verbindet alle Basemap-Signale mit der UI
"""
print("_connect_basemap_signals")
self.ui.cbBasemapLines.toggled.connect(self._cbBasemapLines_toggled)
self.ui.cbBasemapAreas.toggled.connect(self._cbBasemapAreas_toggled)
self.ui.cb_basemap_lines.toggled.connect(self._cb_basemap_lines_toggled)
self.ui.cb_basemap_areas.toggled.connect(self._cb_basemap_areas_toggled)
def _cbBasemapLines_toggled(self):
def _cb_basemap_lines_toggled(self):
"""
Behandelt die Sichbarkeitsänderung der Flüsse durch die UI-Checkbox
"""
checked = self.ui.cbBasemapLines.isChecked()
print("_cbBasemapLines_toggled: %s" % (checked,))
checked = self.ui.cb_basemap_lines.isChecked()
print("_cb_basemap_lines_toggled: %s" % (checked,))
if self.lines is None and checked:
# Flüsse sind noch nicht als Layer geladen → Laden
@ -128,7 +125,7 @@ class PoRunner(object):
"Flüsse",
self._basemap_disconnect_lines,
BASEMAP_MAP_TIPS,
self.ui.cbBasemapLines,
self.ui.cb_basemap_lines,
)
if self.lines is not None:
@ -136,12 +133,12 @@ class PoRunner(object):
self._layer_set_visible(self.lines, checked)
self._layer_refresh(self.lines)
def _cbBasemapAreas_toggled(self):
def _cb_basemap_areas_toggled(self):
"""
Behandelt die Sichtbarkeitsänderung der Flächen durch die UI-Checkbox
"""
checked = self.ui.cbBasemapAreas.isChecked()
print("_cbBasemapAreas_toggled: %s" % (checked,))
checked = self.ui.cb_basemap_areas.isChecked()
print("_cb_basemap_areas_toggled: %s" % (checked,))
if self.areas is None and checked:
# Flächen sind noch nicht als Layer geladen → Laden
@ -150,7 +147,7 @@ class PoRunner(object):
"Flächen",
self._basemap_disconnect_areas,
BASEMAP_MAP_TIPS,
self.ui.cbBasemapAreas,
self.ui.cb_basemap_areas,
)
if self.areas is not None:
@ -164,7 +161,7 @@ class PoRunner(object):
"""
print("_basemap_disconnect_lines")
self.lines = None
self.ui.cbBasemapLines.setChecked(False)
self.ui.cb_basemap_lines.setChecked(False)
def _basemap_disconnect_areas(self):
"""
@ -172,7 +169,7 @@ class PoRunner(object):
"""
print("_basemap_disconnect_areas")
self.areas = None
self.ui.cbBasemapAreas.setChecked(False)
self.ui.cb_basemap_areas.setChecked(False)
# stations ----------------------------------------------------------------
@ -181,48 +178,48 @@ class PoRunner(object):
Verbindet alle Stations-Signale mit der UI
"""
print("_connect_stations_signals")
self.ui.cbStationsVisible.toggled.connect(self._cbStationsVisible_toggled)
self.ui.cbStationsName.toggled.connect(self._cbStationsName_toggled)
self.ui.cbStationsNumber.toggled.connect(self._cbStationsNumber_toggled)
self.ui.cbStationsAgency.toggled.connect(self._cbStationsAgency_toggled)
self.ui.cbStationsKm.toggled.connect(self._cbStationsKm_toggled)
self.ui.cbStationsWater.toggled.connect(self._cbStationsWater_toggled)
self.ui.bgStationsStyle.buttonClicked.connect(self._bgStationsStyle_clicked)
self.ui.cb_stations_visible.toggled.connect(self._cb_stations_visible_toggled)
self.ui.cb_stations_name.toggled.connect(self._cb_stations_name_toggled)
self.ui.cb_stations_number.toggled.connect(self._cb_stations_number_toggled)
self.ui.cb_stations_agency.toggled.connect(self._cb_stations_agency_toggled)
self.ui.cb_stations_km.toggled.connect(self._cb_stations_km_toggled)
self.ui.cb_stations_water.toggled.connect(self._cb_stations_water_toggled)
self.ui.cb_stations_style.buttonClicked.connect(self._cb_stations_style_clicked)
def _stations_apply_style(self):
"""
Wendet eingestellte Styles auf den Stations-Layer an
"""
button = self.ui.bgStationsStyle.checkedButton()
self._bgStationsStyle_clicked(button)
button = self.ui.cb_stations_style.checkedButton()
self._cb_stations_style_clicked(button)
def _bgStationsStyle_clicked(self, button):
def _cb_stations_style_clicked(self, button):
"""
Behandlung eines Klicks auf einen der Stations-Style-Radio-Buttons
Wendet Styles auf Stations-Layer an
:param button: geklickter Radio-Button
:type button: QRadioButton
"""
print("_bgStationsStyle_clicked: %s" % (button.objectName(),))
print("_cb_stations_style_clicked: %s" % (button.objectName(),))
if self.stations is None:
# Stations-Layer nicht geladen → Keine Änderung
return
if self.ui.rbStationsStylePreset == button:
if self.ui.rb_stations_style_preset == button:
# Vorgabe ausgewählt → lade aus Datei
self._layer_apply_style_from_file(self.stations, STATIONS_QML)
return
if self.ui.rbStationsStyleAgency == button:
if self.ui.rb_stations_style_agency == button:
# Behörde ausgewählt
field = "agency"
elif self.ui.rbStationsStyleWater == button:
elif self.ui.rb_stations_style_water == button:
# Gewässer ausgewählt
field = "water"
else:
# Programmierfehler: Unbekannter Button
print("_bgStationsStyle_clicked: Style nicht implementiert: %s" % (button.objectName(),))
print("_cb_stations_style_clicked: Style nicht implementiert: %s" % (button.objectName(),))
self._layer_apply_style_from_file(self.stations, STATIONS_QML)
return
@ -230,19 +227,19 @@ class PoRunner(object):
self.stations.setMapTipTemplate(STATIONS_MAP_TIPS)
self._layer_apply_style_per_category(self.stations, field, STATIONS_QML)
def _cbStationsVisible_toggled(self):
def _cb_stations_visible_toggled(self):
"""
Schaltet Sichtbarkeit des Stations-Layers um (und erstellt ihn, falls nötig)
"""
visible = self.ui.cbStationsVisible.isChecked()
print("_cbStationsVisible_toggled: %s" % (visible,))
visible = self.ui.cb_stations_visible.isChecked()
print("_cb_stations_visible_toggled: %s" % (visible,))
if self.stations is None and visible:
# Stationen sind noch nicht als Layer geladen → Laden
reader = PoStationReaderQgs()
features = reader.get_features()
self.stations = self._layer_create_from_features(reader.fields, reader.crs, features, "Stationen")
self._layer_add_to_instance(self.stations, self._stations_disconnect, self.ui.cbStationsVisible)
self._layer_add_to_instance(self.stations, self._stations_disconnect, self.ui.cb_stations_visible)
if self.stations is not None:
# Stationen sind (bereits) angelegt → setze Sichtbarkeit wie gefordert
@ -250,44 +247,44 @@ class PoRunner(object):
if visible:
self._stations_apply_style()
def _cbStationsName_toggled(self):
def _cb_stations_name_toggled(self):
"""
Sichtbarkeit des Stations-Attributs 'Name' umschalten und Labels updaten
"""
checked = self.ui.cbStationsName.isChecked()
print("_cbStationsName_toggled: %s" % (checked,))
checked = self.ui.cb_stations_name.isChecked()
print("_cb_stations_name_toggled: %s" % (checked,))
self._stations_update_labels()
def _cbStationsNumber_toggled(self):
def _cb_stations_number_toggled(self):
"""
Sichtbarkeit des Stations-Attributs 'Number' umschalten und Labels updaten
"""
checked = self.ui.cbStationsNumber.isChecked()
print("_cbStationsNumber_toggled: %s" % (checked,))
checked = self.ui.cb_stations_number.isChecked()
print("_cb_stations_number_toggled: %s" % (checked,))
self._stations_update_labels()
def _cbStationsAgency_toggled(self):
def _cb_stations_agency_toggled(self):
"""
Sichtbarkeit des Stations-Attributs 'Agency' umschalten und Labels updaten
"""
checked = self.ui.cbStationsAgency.isChecked()
print("_cbStationsAgency_toggled: %s" % (checked,))
checked = self.ui.cb_stations_agency.isChecked()
print("_cb_stations_agency_toggled: %s" % (checked,))
self._stations_update_labels()
def _cbStationsKm_toggled(self):
def _cb_stations_km_toggled(self):
"""
Sichtbarkeit des Stations-Attributs 'Km' umschalten und Labels updaten
"""
checked = self.ui.cbStationsKm.isChecked()
print("_cbStationsKm_toggled: %s" % (checked,))
checked = self.ui.cb_stations_km.isChecked()
print("_cb_stations_km_toggled: %s" % (checked,))
self._stations_update_labels()
def _cbStationsWater_toggled(self):
def _cb_stations_water_toggled(self):
"""
Sichtbarkeit des Stations-Attributs 'Water' umschalten und Labels updaten
"""
checked = self.ui.cbStationsWater.isChecked()
print("_cbStationsWater_toggled: %s" % (checked,))
checked = self.ui.cb_stations_water.isChecked()
print("_cb_stations_water_toggled: %s" % (checked,))
self._stations_update_labels()
def _stations_disconnect(self):
@ -296,7 +293,7 @@ class PoRunner(object):
"""
print("_stations_disconnect")
self.stations = None
self.ui.cbStationsVisible.setChecked(False)
self.ui.cb_stations_visible.setChecked(False)
def _stations_update_labels(self):
"""
@ -307,19 +304,19 @@ class PoRunner(object):
return
fields = []
if self.ui.cbStationsNumber.isChecked():
if self.ui.cb_stations_number.isChecked():
# Attribut 'number' ausgewählt
fields.append('\'#\', "number"')
if self.ui.cbStationsName.isChecked():
if self.ui.cb_stations_name.isChecked():
# Attribut 'shortname' ausgewählt
fields.append('"shortname"')
if self.ui.cbStationsAgency.isChecked():
if self.ui.cb_stations_agency.isChecked():
# Attribut 'agency' ausgewählt
fields.append('"agency"')
if self.ui.cbStationsWater.isChecked():
if self.ui.cb_stations_water.isChecked():
# Attribut 'water' ausgewählt
fields.append('"water"')
if self.ui.cbStationsKm.isChecked():
if self.ui.cb_stations_km.isChecked():
# Attribut 'km' ausgewählt
fields.append('"km", \' km\'') # 2 Teile anhängen: km, " km"
@ -332,57 +329,57 @@ class PoRunner(object):
Verbindet alle Pegelstand-Signale mit der UI
"""
print("_waterlevels_connect_signals")
self.ui.cbWaterlevelsVisible.toggled.connect(self._cbWaterlevelsVisible_toggled)
self.ui.cbWaterlevelsName.toggled.connect(self._cbWaterlevelsName_toggled)
self.ui.cbWaterlevelsNumber.toggled.connect(self._cbWaterlevelsNumber_toggled)
self.ui.cbWaterlevelsAgency.toggled.connect(self._cbWaterlevelsAgency_toggled)
self.ui.cbWaterlevelsTimestamp.toggled.connect(self._cbWaterlevelsTimestamp_toggled)
self.ui.cbWaterlevelsValue.toggled.connect(self._cbWaterlevelsValue_toggled)
self.ui.cbWaterlevelsMean.toggled.connect(self._cbWaterlevelsMean_toggled)
self.ui.cbWaterlevelsAbsolute.toggled.connect(self._cbWaterlevelsAbsolute_toggled)
self.ui.cbWaterlevelsWater.toggled.connect(self._cbWaterlevelsWater_toggled)
self.ui.bgWaterlevelsStyle.buttonClicked.connect(self._bgWaterlevelsStyle_clicked)
self.ui.cb_waterlevels_visible.toggled.connect(self._cb_waterlevels_visible_toggled)
self.ui.cb_waterlevels_name.toggled.connect(self._cb_waterlevels_name_toggled)
self.ui.cb_waterlevels_number.toggled.connect(self._cb_waterlevels_number_toggled)
self.ui.cb_waterlevels_agency.toggled.connect(self._cb_waterlevels_agency_toggled)
self.ui.cb_waterlevels_timestamp.toggled.connect(self._cb_waterlevels_timestamp_toggled)
self.ui.cb_waterlevels_value.toggled.connect(self._cb_waterlevels_value_toggled)
self.ui.cb_waterlevels_mean.toggled.connect(self._cb_waterlevels_mean_toggled)
self.ui.cb_waterlevels_absolute.toggled.connect(self._cb_waterlevels_absolute_toggled)
self.ui.cb_waterlevels_water.toggled.connect(self._cb_waterlevels_water_toggled)
self.ui.cb_waterlevels_style.buttonClicked.connect(self._cb_waterlevels_style_clicked)
def _waterlevels_apply_style(self):
"""
Wendet eingestellte Styles auf den Pegelstand-Layer an
"""
button = self.ui.bgWaterlevelsStyle.checkedButton()
self._bgWaterlevelsStyle_clicked(button)
button = self.ui.cb_waterlevels_style.checkedButton()
self._cb_waterlevels_style_clicked(button)
def _bgWaterlevelsStyle_clicked(self, button):
def _cb_waterlevels_style_clicked(self, button):
"""
Behandlung eines Klicks auf einen der Pegelstand-Style-Radio-Buttons
Wendet Styles auf Pegelstand-Layer an
:param button: geklickter Radio-Button
:type button: QRadioButton
"""
print("_bgWaterlevelsStyle_clicked: %s" % (button.objectName(),))
print("_cb_waterlevels_style_clicked: %s" % (button.objectName(),))
if self.waterlevels is None:
# Pegelstand-Layer nicht geladen → Keine Änderung
return
if self.ui.rbWaterlevelsStylePreset == button:
if self.ui.rb_waterlevels_style_preset == button:
# Vorgabe ausgewählt → lade aus Datei
self._layer_apply_style_from_file(self.waterlevels, WATERLEVELS_QML)
return
if self.ui.rbWaterlevelsStyleAgency == button:
if self.ui.rb_waterlevels_style_agency == button:
# Behörde ausgewählt
field = "agency"
elif self.ui.rbWaterlevelsStyleWater == button:
elif self.ui.rb_waterlevels_style_water == button:
# Gewässer ausgewählt
field = "water"
elif self.ui.rbWaterlevelsStyleMean == button:
elif self.ui.rb_waterlevels_style_mean == button:
# MNW, MHW ausgewählt
field = "mean"
elif self.ui.rbWaterlevelsStyleAbsolute == button:
elif self.ui.rb_waterlevels_style_absolute == button:
# NSW, HSW ausgewählt
field = "absolute"
else:
# Programmierfehler: Unbekannter Button
print("_bgWaterlevelsStyle_clicked: Style nicht implementiert: %s" % (button.objectName(),))
print("_cb_waterlevels_style_clicked: Style nicht implementiert: %s" % (button.objectName(),))
self._layer_apply_style_from_file(self.waterlevels, WATERLEVELS_QML)
return
@ -390,19 +387,19 @@ class PoRunner(object):
self.waterlevels.setMapTipTemplate(WATERLEVELS_MAP_TIPS)
self._layer_apply_style_per_category(self.waterlevels, field, WATERLEVELS_QML)
def _cbWaterlevelsVisible_toggled(self):
def _cb_waterlevels_visible_toggled(self):
"""
Schaltet Sichtbarkeit des Pegelstand-Layers um (und erstellt ihn, falls nötig)
"""
visible = self.ui.cbWaterlevelsVisible.isChecked()
print("_cbWaterlevelsVisible_toggled: %s" % (visible,))
visible = self.ui.cb_waterlevels_visible.isChecked()
print("_cb_waterlevels_visible_toggled: %s" % (visible,))
if self.waterlevels is None and visible:
# Pegelstände sind noch nicht als Layer geladen → Laden
reader = PoWaterlevelReaderQgs()
features = reader.get_features()
self.waterlevels = self._layer_create_from_features(reader.fields, reader.crs, features, "Pegelstände")
self._layer_add_to_instance(self.waterlevels, self.waterlevels_disconnect, self.ui.cbWaterlevelsVisible)
self._layer_add_to_instance(self.waterlevels, self._waterlevels_disconnect, self.ui.cb_waterlevels_visible)
if self.waterlevels is not None:
# Pegelstände sind (bereits) angelegt → setze Sichtbarkeit wie gefordert
@ -410,77 +407,77 @@ class PoRunner(object):
if visible:
self._waterlevels_apply_style()
def _cbWaterlevelsName_toggled(self):
def _cb_waterlevels_name_toggled(self):
"""
Sichtbarkeit des Pegelstand-Attributs 'Name' umschalten und Labels updaten
"""
checked = self.ui.cbWaterlevelsName.isChecked()
print("_cbWaterlevelsName_toggled: %s" % (checked,))
checked = self.ui.cb_waterlevels_name.isChecked()
print("_cb_waterlevels_name_toggled: %s" % (checked,))
self._waterlevels_update_labels()
def _cbWaterlevelsNumber_toggled(self):
def _cb_waterlevels_number_toggled(self):
"""
Sichtbarkeit des Pegelstand-Attributs 'Number' umschalten und Labels updaten
"""
checked = self.ui.cbWaterlevelsNumber.isChecked()
print("_cbWaterlevelsNumber_toggled: %s" % (checked,))
checked = self.ui.cb_waterlevels_number.isChecked()
print("_cb_waterlevels_number_toggled: %s" % (checked,))
self._waterlevels_update_labels()
def _cbWaterlevelsAgency_toggled(self):
def _cb_waterlevels_agency_toggled(self):
"""
Sichtbarkeit des Pegelstand-Attributs 'Agency' umschalten und Labels updaten
"""
checked = self.ui.cbWaterlevelsAgency.isChecked()
print("_cbWaterlevelsAgency_toggled: %s" % (checked,))
checked = self.ui.cb_waterlevels_agency.isChecked()
print("_cb_waterlevels_agency_toggled: %s" % (checked,))
self._waterlevels_update_labels()
def _cbWaterlevelsTimestamp_toggled(self):
def _cb_waterlevels_timestamp_toggled(self):
"""
Sichtbarkeit des Pegelstand-Attributs 'Timestamp' umschalten und Labels updaten
"""
checked = self.ui.cbWaterlevelsTimestamp.isChecked()
print("_cbWaterlevelsTimestamp_toggled: %s" % (checked,))
checked = self.ui.cb_waterlevels_timestamp.isChecked()
print("_cb_waterlevels_timestamp_toggled: %s" % (checked,))
self._waterlevels_update_labels()
def _cbWaterlevelsValue_toggled(self):
def _cb_waterlevels_value_toggled(self):
"""
Sichtbarkeit des Pegelstand-Attributs 'Value' umschalten und Labels updaten
"""
checked = self.ui.cbWaterlevelsValue.isChecked()
print("_cbWaterlevelsValue_toggled: %s" % (checked,))
checked = self.ui.cb_waterlevels_value.isChecked()
print("_cb_waterlevels_value_toggled: %s" % (checked,))
self._waterlevels_update_labels()
def _cbWaterlevelsMean_toggled(self):
def _cb_waterlevels_mean_toggled(self):
"""
Sichtbarkeit des Pegelstand-Attributs 'Mean' umschalten und Labels updaten
"""
checked = self.ui.cbWaterlevelsMean.isChecked()
print("_cbWaterlevelsMean_toggled: %s" % (checked,))
checked = self.ui.cb_waterlevels_mean.isChecked()
print("_cb_waterlevels_mean_toggled: %s" % (checked,))
self._waterlevels_update_labels()
def _cbWaterlevelsAbsolute_toggled(self):
def _cb_waterlevels_absolute_toggled(self):
"""
Sichtbarkeit des Pegelstand-Attributs 'Absolute' umschalten und Labels updaten
"""
checked = self.ui.cbWaterlevelsAbsolute.isChecked()
print("_cbWaterlevelsAbsolute_toggled: %s" % (checked,))
checked = self.ui.cb_waterlevels_absolute.isChecked()
print("_cb_waterlevels_absolute_toggled: %s" % (checked,))
self._waterlevels_update_labels()
def _cbWaterlevelsWater_toggled(self):
def _cb_waterlevels_water_toggled(self):
"""
Sichtbarkeit des Pegelstand-Attributs 'Water' umschalten und Labels updaten
"""
checked = self.ui.cbWaterlevelsWater.isChecked()
print("_cbWaterlevelsWater_toggled: %s" % (checked,))
checked = self.ui.cb_waterlevels_water.isChecked()
print("_cb_waterlevels_water_toggled: %s" % (checked,))
self._waterlevels_update_labels()
def waterlevels_disconnect(self):
def _waterlevels_disconnect(self):
"""
Löscht die Pegelstand-Layer-Referenz, nachdem der Layer aus QGIS gelöscht wurde und passt die Checkbox an
"""
print("waterlevels_disconnect")
self.waterlevels = None
self.ui.cbWaterlevelsVisible.setChecked(False)
self.ui.cb_waterlevels_visible.setChecked(False)
def _waterlevels_update_labels(self):
"""
@ -491,28 +488,28 @@ class PoRunner(object):
return
fields = []
if self.ui.cbWaterlevelsNumber.isChecked():
if self.ui.cb_waterlevels_number.isChecked():
# Attribut 'number' ausgewählt
fields.append('\'#\', "number"')
if self.ui.cbWaterlevelsName.isChecked():
if self.ui.cb_waterlevels_name.isChecked():
# Attribut 'shortname' ausgewählt
fields.append('"shortname"')
if self.ui.cbWaterlevelsAgency.isChecked():
if self.ui.cb_waterlevels_agency.isChecked():
# Attribut 'agency' ausgewählt
fields.append('"agency"')
if self.ui.cbWaterlevelsWater.isChecked():
if self.ui.cb_waterlevels_water.isChecked():
# Attribut 'water' ausgewählt
fields.append('"water"')
if self.ui.cbWaterlevelsTimestamp.isChecked():
if self.ui.cb_waterlevels_timestamp.isChecked():
# Attribut 'timestamp' ausgewählt
fields.append('"timestamp"')
if self.ui.cbWaterlevelsValue.isChecked():
if self.ui.cb_waterlevels_value.isChecked():
# Attribut 'value' ausgewählt
fields.append('"value", \' \', "unit"') # 3 Teile anhängen: value, leerzeichen, unit
if self.ui.cbWaterlevelsMean.isChecked():
if self.ui.cb_waterlevels_mean.isChecked():
# Attribut 'mean' ausgewählt
fields.append('\'MnwMhw=\', "mean"')
if self.ui.cbWaterlevelsAbsolute.isChecked():
if self.ui.cb_waterlevels_absolute.isChecked():
# Attribut 'absolute' ausgewählt
fields.append('\'NswHsw=\', "absolute"')
@ -691,7 +688,7 @@ class PoRunner(object):
if len(selected) == 1:
# Juhu, nur ein Pegelstand ausgewählt → Graph laden
if self.ui.slGraphStation.count() == 0:
if self.ui.sl_graph_station.count() == 0:
# Wir haben aber noch keine Stationen geladen → machen wir zuerst
self._graph_load_stations()
@ -769,31 +766,31 @@ class PoRunner(object):
Verbindet alle GrafWidget-Signale mit der UI
"""
print("_graph_connect_signals")
self.ui.slGraphStation.currentTextChanged.connect(self._slGraphStation_changed)
self.ui.btnGraphStationsRefresh.clicked.connect(self._btnGraphStationsRefresh_clicked)
self.ui.numGraphDays.valueChanged.connect(self._numGraphDays_changed)
self.ui.btnGraphLoad.clicked.connect(self._graph_load_graph)
self.ui.sl_graph_station.currentTextChanged.connect(self._sl_graph_station_changed)
self.ui.btn_graph_stations_refresh.clicked.connect(self._btn_graph_stations_refresh_clicked)
self.ui.num_graph_days.valueChanged.connect(self._num_graph_days_changed)
self.ui.btn_graph_load.clicked.connect(self._graph_load_graph)
def _slGraphStation_changed(self):
def _sl_graph_station_changed(self):
"""
Behandelt die Stations-Änderung und lädt den Pegelstandsverlauf-Graf neu
"""
print("_slGraphStation_changed: %s" % (self.ui.slGraphStation.currentText(),))
print("_sl_graph_station_changed: %s" % (self.ui.sl_graph_station.currentText(),))
self._graph_load_graph()
def _btnGraphStationsRefresh_clicked(self):
def _btn_graph_stations_refresh_clicked(self):
"""
Klick auf Graf-Stations-Liste-Refresh:
Lässt die Stations-Liste für den Graphen neu laden
"""
print("_btnGraphStationsRefresh_clicked")
print("_btn_graph_stations_refresh_clicked")
self._graph_load_stations()
def _numGraphDays_changed(self):
def _num_graph_days_changed(self):
"""
Loggt lediglich die Graf-Tages-Änderung
"""
print("_numGraphDays_changed: %s" % (self.ui.numGraphDays.value(),))
print("_num_graph_days_changed: %s" % (self.ui.num_graph_days.value(),))
def _graph_load_graph(self):
"""
@ -801,13 +798,13 @@ class PoRunner(object):
"""
print("_graph_load_graph")
if not self.ui.slGraphStation.isEnabled():
if not self.ui.sl_graph_station.isEnabled():
# während dem Aktualisieren der Stationsliste treten change-signale auf, die werden hier abgefangen
print("_graph_load_graph: Stationsliste ist aktuell gesperrt")
return
station = self.ui.slGraphStation.currentText()
days = self.ui.numGraphDays.value()
station = self.ui.sl_graph_station.currentText()
days = self.ui.num_graph_days.value()
self.graph.load(station, days)
@ -818,15 +815,15 @@ class PoRunner(object):
Versucht die bisher ausgewählten Station in der neuen Liste wiederzufinden.
"""
print("_graph_load_stations")
self.ui.slGraphStation.setEnabled(False)
self.ui.btnGraphLoad.setEnabled(False)
self.ui.sl_graph_station.setEnabled(False)
self.ui.btn_graph_load.setEnabled(False)
# behalte die aktuelle Station, um sie (mit eventuell neuem Index) wiederherzustellen
current_station = self.ui.slGraphStation.currentText()
current_station = self.ui.sl_graph_station.currentText()
print("_graph_load_stations: bisherige_station=%s" % (current_station,))
# leere die bisherige Auswahlliste
self.ui.slGraphStation.clear()
self.ui.sl_graph_station.clear()
# Lade aktuelle StationsListe herunter
stations = PoStationReader().get_stations()
@ -837,19 +834,19 @@ class PoRunner(object):
for station in stations:
# Füge ein Item je Station hinzu
self.ui.slGraphStation.addItem(station.shortname)
self.ui.sl_graph_station.addItem(station.shortname)
if self._graphStation_set_by_shortname(current_station):
# Bisherige Station wiedergefunden → Wieder ausgewählt
print("_graph_load_stations: Bisherige Station \"%s\" wiederhergestellt" % (current_station,))
else:
# Bisherige Station nicht wiedergefunden → Wähle die erste Station aus der Liste
self.ui.slGraphStation.setCurrentIndex(0)
station = self.ui.slGraphStation.currentText()
self.ui.sl_graph_station.setCurrentIndex(0)
station = self.ui.sl_graph_station.currentText()
print("_graph_load_stations: Bisherige Station \"%s\" nicht wiedergefunden. Nehme erste Station: %s" % (current_station, station))
self.ui.slGraphStation.setEnabled(True)
self.ui.btnGraphLoad.setEnabled(True)
self.ui.sl_graph_station.setEnabled(True)
self.ui.btn_graph_load.setEnabled(True)
def _graphStation_set_by_shortname(self, shortname):
"""
@ -862,7 +859,7 @@ class PoRunner(object):
# Station nicht gefunden → Abbruch
return False
self.ui.slGraphStation.setCurrentIndex(index)
self.ui.sl_graph_station.setCurrentIndex(index)
return True
def _graphStation_get_index_by_shortname(self, shortname):
@ -872,8 +869,8 @@ class PoRunner(object):
:type shortname: str
"""
print("_graphStation_get_index_by_shortname: shortname=%s" % (shortname,))
for index in range(self.ui.slGraphStation.count()):
text = self.ui.slGraphStation.itemText(index)
for index in range(self.ui.sl_graph_station.count()):
text = self.ui.sl_graph_station.itemText(index)
if shortname == text:
# Station nicht gefunden → Abbruch
print("_graphStation_get_index_by_shortname: index=%d" % (index,))