Work on native gui: list views for objects; set version to 0.2.2

This commit is contained in:
2026-09-21 19:07:59 +02:00
parent d61faf2e71
commit 0adb07d75b
34 changed files with 3199 additions and 1133 deletions
+93 -3
View File
@@ -1,10 +1,9 @@
# SPDX-License-Identifier: WTFPL
import os
import gi
gi.require_version("Gtk", "3.0")
from gi.repository import Gtk
import re
from gi.repository import Gtk, Rsvg
import xml.etree.ElementTree as ET
from yms import gtkutils, combobox, treeview
@@ -21,6 +20,7 @@ class StatusView:
gtkutils.init_named_controls(self, builder)
# Generic information
self.label['version'].set_text("YMS version {}".format(context.__version__))
self.label['dbinfo'].set_text("Database: {} on {}".format(context.cfg['db'], context.cfg['host']))
# Load table status info
@@ -42,6 +42,96 @@ class StatusView:
contents = re.sub(r'(^\s*pass\s*=\s*).*$', r'\1********', contents, flags=re.MULTILINE)
self.text ['config'].get_buffer().set_text(contents)
# data for svg deck plan
self.svg = None
self.svg_width = 0
self.svg_height = 0
self.svg_scale = 1.0
self.svg_x = 0.0
self.svg_y = 0.0
self.svg_centerline_y = 0.0
self.load_svg()
def load_svg(self):
if not self.context.vessel.shapefile:
print("No Shapefile defined for current vessel")
return
shapefile = os.path.join(self.context.cfg['shapedir'], self.context.vessel.shapefile)
if not (os.path.isfile(shapefile) or os.access(shapefile, os.R_OK)):
print(f"Shapefile '{shapefile}' not found or not readable")
return
try:
self.svg = Rsvg.Handle.new_from_file(shapefile)
success, width, height = self.svg.get_intrinsic_size_in_pixels()
if not success:
raise RuntimeError("SVG has no pixelsize")
self.svg_width = width
self.svg_height = height
print(f"SVG: {self.svg_width} x {self.svg_height}")
self.area['status'].queue_draw()
except Exception as e:
print("Error trying to load svg deck plan:", e)
return
# try to detect centerline
self.svg_centerline_y = None
try:
tree = ET.parse(shapefile)
except Exception as e:
print("Error reading centerline from svg:", e)
self.svg_centerline_y = self.svg_height / 2
return
root = tree.getroot()
found = False
for element in root.iter():
if element.get("id") == "centerline":
found = True
print("\n--- centerline gefunden ---")
print("Tag:", element.tag)
print("Attribute:", element.attrib)
y1 = element.get("y1")
y2 = element.get("y2")
if y1 is not None and y2 is not None:
y1 = float(y1)
y2 = float(y2)
if not math.isclose(y1, y2, abs_tol=0.001):
raise ValueError(f"centerline not horizontal: y1={y1}, y2={y2}")
# calc arithmetic mean as fallback
self.centerline_y = (y1 + y2) / 2
else:
self.centerline_y = y1
print(f"centerline: SVG Y = {self.centerline_y}")
return
if not found:
print("No centerline with id='centerline' found!")
def on_drw_status_draw(self, area, cr):
cr.set_source_rgb(0.92, 0.97, 1.0)
cr.paint()
allocation = area.get_allocation()
scale_x = allocation.width / self.svg_width
scale_y = allocation.height / self.svg_height
self.svg_scale = min(scale_x, scale_y)
width = self.svg_width * self.svg_scale
height = self.svg_height * self.svg_scale
self.svg_x = (allocation.width - width) / 2
self.svg_y = (allocation.height - height) / 2
cr.save()
cr.translate(self.svg_x, self.svg_y)
cr.scale(self.svg_scale, self.svg_scale)
viewport = Rsvg.Rectangle()
viewport.x = 0
viewport.y = 0
viewport.width = self.svg_width
viewport.height = self.svg_height
self.svg.render_document(cr, viewport)
cr.restore()
return False
def get_table_counts(self):
# Detect all tables in database
sql= ("SELECT table_name "