Native gui: implement data lists for all modules

This commit is contained in:
2026-09-12 19:36:03 +02:00
parent 4bc8dd8280
commit d72147c012
24 changed files with 2439 additions and 198 deletions
+111 -49
View File
@@ -27,6 +27,33 @@ class BaseView(View):
#self.topwidget = builder.get_object("topobject")
#gtkutils.init_named_controls(self, builder)
# company types
self.db.cur.execute("SELECT ddval, ddtext FROM dropdown WHERE ddid=2 ORDER BY ddval")
self.comptype = dict(self.db.cur.fetchall())
combobox.load_from_dict(self.combo['flt_type'], {-2: _("─── all ───")} | self.comptype, -1)
# companies
self.lst_companies = Gtk.ListStore(int, str, str, str)
self.db.cur.execute("SELECT compid, compname, comptype, remarks FROM company ORDER BY compname")
for row in self.db.cur.fetchall():
self.lst_companies.append((row[0], row[1], self.comptype[row[2]], row[3]))
treeview.add_column(self.tree['companies'], _('ID'), 0)
treeview.add_column(self.tree['companies'], _('Name'), 1)
treeview.add_column(self.tree['companies'], _('Type'), 2)
treeview.add_column(self.tree['companies'], _('Remarks'), 3)
self.tree['companies'].set_model(self.lst_companies)
# combos
roles = {'captain': 'Captain', 'helmsman': 'Helmsman', 'sailor': 'Sailor'}
combobox.load_from_dict(self.combo['user_role'], roles)
langs = {'de': 'Deutsch', 'en': 'English'}
combobox.load_from_dict(self.combo['user_lang'], langs)
# shipyard
self.db.cur.execute("SELECT compid, compname FROM company WHERE comptype=3 ORDER BY compname")
shipyards = dict(self.db.cur.fetchall())
combobox.load_from_dict(self.combo['shipyard'], {-1: _("─── none ───")} | shipyards)
# get current vessel data
self.db.cur.execute("SELECT valint FROM settings WHERE userid=0 AND sno=1")
row = self.db.cur.fetchone()
@@ -38,11 +65,20 @@ class BaseView(View):
else:
self.context.vessel.vid = row[0]
# default storage for current vessel
sql = "SELECT sid, sname FROM storage WHERE stype=0 AND vid=%s ORDER BY sname"
self.db.cur.execute(sql, (self.context.vessel.vid,))
storages = dict(self.db.cur.fetchall())
combobox.load_from_dict(self.combo['storage'], {-1: _("─── none ───")} | storages)
# get list of vessels
vessellist = {}
self.db.dcur.execute("SELECT vid, vesselname, model FROM vessel ORDER BY vid")
for row in self.db.dcur.fetchall():
vessellist[row['vid']] = row['vesselname'] + " - " + row['model']
vessellist[row['vid']] = (
row['vesselname'] if row['model'] is None
else row['vesselname'] + " - " + row['model']
)
combobox.load_from_dict(self.combo['vessel'], vessellist, self.context.vessel.vid)
# vessel load triggered from combobox init
@@ -73,39 +109,6 @@ class BaseView(View):
treeview.add_column(self.tree['ddlists'], _('Records'), 2)
self.tree['ddlists'].set_model(self.lst_lists)
# company types
self.db.cur.execute("SELECT ddval, ddtext FROM dropdown WHERE ddid=2 ORDER BY ddval")
self.comptype = dict(self.db.cur.fetchall())
combobox.load_from_dict(self.combo['flt_type'], {-1: _("─── all ───")} | self.comptype, -1)
# companies
self.lst_companies = Gtk.ListStore(int, str, str, str)
self.db.cur.execute("SELECT compid, compname, comptype, remarks FROM company ORDER BY compname")
for row in self.db.cur.fetchall():
self.lst_companies.append((row[0], row[1], self.comptype[row[2]], row[3]))
treeview.add_column(self.tree['companies'], _('ID'), 0)
treeview.add_column(self.tree['companies'], _('Name'), 1)
treeview.add_column(self.tree['companies'], _('Type'), 2)
treeview.add_column(self.tree['companies'], _('Remarks'), 3)
self.tree['companies'].set_model(self.lst_companies)
# combos
roles = {'captain': 'Captain', 'helmsman': 'Helmsman', 'sailor': 'Sailor'}
combobox.load_from_dict(self.combo['user_role'], roles)
langs = {'de': 'Deutsch', 'en': 'English'}
combobox.load_from_dict(self.combo['user_lang'], langs)
# shipyard
self.db.cur.execute("SELECT compid, compname FROM company WHERE comptype=3 ORDER BY compname")
shipyards = dict(self.db.cur.fetchall())
combobox.load_from_dict(self.combo['shipyard'], shipyards)
# default storage
self.lst_storage_dfl = Gtk.ListStore(int, str)
self.db.cur.execute("SELECT sid, sname FROM storage WHERE stype=0 ORDER BY sname")
storages = dict(self.db.cur.fetchall())
combobox.load_from_dict(self.combo['storage'], storages)
# load shape of vessel if available
if self.context.vessel.vid > 0:
self.db.cur.execute("SELECT shapefile FROM vessel WHERE vid=%s", (self.context.vessel.vid, ))
@@ -125,23 +128,50 @@ class BaseView(View):
# WIP generic remarks handling
self.text['vessel_remarks'].set_size_request(200, 70)
def load_dropdowns(self):
# non static dropdown (re-)load feature
# default storage for current vessel
sql = "SELECT sid, sname FROM storage WHERE stype=0 AND vid=%s ORDER BY sname"
self.db.cur.execute(sql, (self.context.vessel.vid,))
storages = dict(self.db.cur.fetchall())
combobox.refresh_dict(self.combo['storage'], {-1: _("─── none ───")} | storages)
def on_cmb_vessel_changed(self, widget):
self.context.vessel.load(combobox.get_list_value(widget))
print(self.context.vessel)
sql = ("UPDATE settings SET valint=%s WHERE userid=0 AND sno=1")
self.db.cur.execute(sql, (self.context.vessel.vid,))
self.db.conn.commit()
# Refresh dependent data
self.load_dropdowns()
# Show data
self.entry['vesselname'].set_text(self.context.vessel.vesselname)
self.entry['model'].set_text(self.context.vessel.model)
self.text['vessel_remarks'].get_buffer().set_text(self.context.vessel.remarks or '')
self.spin['loa'].set_value(9.80)
self.display_vessel(self.context.vessel)
def on_but_vessel_add_clicked(self, widget):
print("Add vessel")
answer = gtkutils.questionbox(
_("Add new vessel.\n"
"Are you sure?"
), title="YMS")
if answer == False:
return
self.context.vessel.create()
def on_but_vessel_save_clicked(self, widget):
print("Save vessel")
vessel = self.context.vessel
vessel.vesselname = self.entry['vesselname'].get_text()
vessel.model = self.entry['model'].get_text()
vessel.year_built = self.spin['year_built'].get_value_as_int()
vessel.loa = self.spin['loa'].get_value()
vessel.lwl = self.spin['lwl'].get_value()
vessel.beam = self.spin['beam'].get_value()
vessel.draught = self.spin['draught'].get_value()
vessel.draught_min = self.spin['draught_min'].get_value()
vessel.displacement = self.spin['displacement'].get_value_as_int()
vessel.ballast = self.spin['ballast'].get_value_as_int()
txtbuf = self.text['vessel_remarks'].get_buffer()
vessel.remarks = txtbuf.get_text(txtbuf.get_start_iter(), txtbuf.get_end_iter(), True)
vessel.save()
def on_but_comp_new_clicked(self, widget):
print("New company")
@@ -158,20 +188,52 @@ class BaseView(View):
def on_but_comp_cancel_clicked(self, widget):
pass
def user_display(self):
self.entry['user_login'].set_text(self.context.user.login)
self.entry['user_displayname'].set_text(self.context.user.displayname)
combobox.activate_row(self.combo['user_role'], self.context.user.role)
combobox.activate_row(self.combo['user_lang'], self.context.user.language)
self.check['user_locked'].set_active('locked' in self.context.user.flags)
self.check['user_deleted'].set_active('deleted' in self.context.user.flags)
def display_vessel(self, vessel):
print("Display vessel")
self.entry['vesselname'].set_text(vessel.vesselname)
self.entry['model'].set_text(vessel.model or '')
self.spin['year_built'].set_value(vessel.year_built or 0)
self.spin['loa'].set_value(vessel.loa or 0)
self.spin['lwl'].set_value(vessel.lwl or 0)
self.spin['beam'].set_value(vessel.beam or 0)
self.spin['draught'].set_value(vessel.draught or 0)
self.spin['draught_min'].set_value(vessel.draught_min or 0)
self.spin['displacement'].set_value(vessel.displacement or 0)
self.spin['ballast'].set_value(vessel.ballast or 0)
self.text['vessel_remarks'].get_buffer().set_text(vessel.remarks or '')
combobox.activate_row(self.combo['shipyard'], vessel.shipyard or -1)
combobox.activate_row(self.combo['storage'], vessel.sid_default or -1)
def display_user(self, user):
self.entry['user_login'].set_text(user.login)
self.entry['user_displayname'].set_text(user.displayname)
combobox.activate_row(self.combo['user_role'], user.role)
combobox.activate_row(self.combo['user_lang'], user.language)
self.check['user_locked'].set_active('locked' in user.flags)
self.check['user_deleted'].set_active('deleted' in user.flags)
self.entry['user_pass'].set_text('')
def display_company(self, company):
self.entry['compname'].set_text(company.compname)
# Type
# Type2
self.entry['shortname'].set_text(company.shortname)
self.entry['street'].set_text(company.street)
self.entry['zip'].set_text(company.zip)
self.entry['city'].set_text(company.city)
self.entry['country'].set_text(company.country)
self.entry['contact'].set_text(company.contact)
self.entry['phone'].set_text(company.phone)
self.entry['email'].set_text(company.email)
self.entry['web'].set_text(company.web)
self.entry['customerno'].set_text(company.customerno)
self.entry['contractno'].set_text(company.contractno)
def on_tvw_user_row_activated(self, widget, path, column):
# load selected user
self.context.user.user_id = treeview.get_value(widget, 0)
self.context.user.load()
self.user_display()
self.display_user(self.context.user)
def on_but_user_new_clicked(self, widget):
# get first free user id and create a new record with name "user<nnn>"
@@ -193,7 +255,7 @@ class BaseView(View):
# TODO Select some other user from new list selection
self.context.user.user_id = treeview.get_value(self.tree['user'])
self.context.user.load()
self.user_display()
self.display_user(self.context.user)
def on_but_user_newpass_clicked(self, widget):
self.entry['user_pass'].set_text(self.context.user.genpass())
+50 -8
View File
@@ -5,15 +5,57 @@ import gi
gi.require_version("Gtk", "3.0")
from gi.repository import GLib, Gtk, Gdk
from .view import View
from yms import gtkutils, combobox, treeview
from yms.model import document
class DocumentsView:
class DocumentsView(View):
def __init__(self, context):
self.title = _("Documents")
builder = Gtk.Builder()
builder.set_translation_domain(context.textdomain)
builder.add_from_file(os.path.join(context.ui_path, "documents.ui"))
builder.connect_signals(self)
self.topwidget = builder.get_object("topobject")
gtkutils.init_named_controls(self, builder)
super().__init__(context, _("Documents"), "documents.ui")
self.doc = document.Document(context.db) # current record
self.newrecord = False
self.lst_documents = Gtk.ListStore(int, str, str, str, int)
sql = (
"SELECT d.docid, d.doctype, d.filename, d.title, COUNT(r.drid) AS refcount "
"FROM document AS d LEFT OUTER JOIN docref AS r USING (docid) "
"GROUP BY d.docid, d.doctype, d.filename, d.title "
"ORDER BY d.docid"
)
self.db.cur.execute(sql)
for row in self.db.cur.fetchall():
self.lst_documents.append(row)
treeview.add_column(self.tree['documents'], _('ID'), 0)
treeview.add_column(self.tree['documents'], _('Type'), 1)
treeview.add_column(self.tree['documents'], _('Filename'), 2)
treeview.add_column(self.tree['documents'], _('Title'), 3)
treeview.add_column(self.tree['documents'], _('References'), 3)
self.tree['documents'].set_model(self.lst_documents)
# buttons on list page
def on_but_new_clicked(self, widget):
self.topwidget.set_visible_child(self.box['doc_edit'])
def on_but_edit_clicked(self, widget):
self.topwidget.set_visible_child(self.box['doc_edit'])
def on_but_detail_clicked(self, widget):
self.topwidget.set_visible_child(self.box['doc_detail'])
# buttons on detail page
# edit2 uses edit callback
def on_but_close_clicked(self, widget):
self.topwidget.set_visible_child(self.box['documents'])
def on_but_delete_clicked(self, widget):
self.topwidget.set_visible_child(self.box['documents'])
# buttons on edit page
def on_but_save_clicked(self, widget):
pass
def on_but_cancel_clicked(self, widget):
self.topwidget.set_visible_child(self.box['documents'])
+39 -18
View File
@@ -5,39 +5,60 @@ import gi
gi.require_version("Gtk", "3.0")
from gi.repository import GLib, Gtk, Gdk
from .view import View
from yms import gtkutils, combobox, treeview
from yms.model import equipment
class EquipmentView:
class EquipmentView(View):
def __init__(self, context):
self.title = _("Equipment")
builder = Gtk.Builder()
builder.set_translation_domain(context.textdomain)
builder.add_from_file(os.path.join(context.ui_path, "equipment.ui"))
builder.connect_signals(self)
self.topwidget = builder.get_object("stk_equipment")
gtkutils.init_named_controls(self, builder)
super().__init__(context, _("Equipment"), "equipment.ui")
self.equip = equipment.Equipment(context.db) # current record
self.newrecord = False
self.lst_equipment = Gtk.ListStore(int, str, str, str, str, str, str)
sql = (
"SELECT e.eid, e.ename, c.compname, e.model, e.serial, "
"DATE_FORMAT(e.purchdate, '{}'), e.remarks "
"FROM equipment AS e LEFT OUTER JOIN company AS c ON (e.manufacturer=c.compid) "
"WHERE e.vid=%s "
"ORDER BY e.ename"
).format("%%d.%%m.%%Y") # TODO format from settings via mapping
self.db.cur.execute(sql, (context.vessel.vid,))
for row in self.db.cur.fetchall():
self.lst_equipment.append(row)
treeview.add_column(self.tree['equipment'], _('ID'), 0)
treeview.add_column(self.tree['equipment'], _('Name'), 1)
treeview.add_column(self.tree['equipment'], _('Manufacturer'), 2)
treeview.add_column(self.tree['equipment'], _('Model'), 3)
treeview.add_column(self.tree['equipment'], _('Serial'), 4)
treeview.add_column(self.tree['equipment'], _('Age'), 5)
treeview.add_column(self.tree['equipment'], _('Remarks'), 6)
self.tree['equipment'].set_model(self.lst_equipment)
# buttons on list page
def on_but_new_clicked(self, widget):
self.topwidget.set_visible_child(self.box['equip_edit'])
def on_but_edit_clicked(self, widget):
self.topwidget.set_visible_child(self.box['equip_edit'])
def on_but_detail_clicked(self, widget):
self.topwidget.set_visible_child(self.box['equip_detail'])
def on_but_edit_clicked(self, widget):
self.topwidget.set_visible_child(self.box['equip_edit'])
def on_but_edit2_clicked(self, widget):
self.topwidget.set_visible_child(self.box['equip_edit'])
# buttons on detail page
# edit2 uses edit callback
def on_but_close_clicked(self, widget):
self.topwidget.set_visible_child(self.box['equip_detail'])
def on_but_save_clicked(self, widget):
pass
self.topwidget.set_visible_child(self.box['equipment'])
def on_but_delete_clicked(self, widget):
self.topwidget.set_visible_child(self.box['equipment'])
# buttons on edit page
def on_but_save_clicked(self, widget):
pass
def on_but_cancel_clicked(self, widget):
self.topwidget.set_visible_child(self.box['equipment'])
+56 -8
View File
@@ -5,15 +5,63 @@ import gi
gi.require_version("Gtk", "3.0")
from gi.repository import GLib, Gtk, Gdk
from .view import View
from yms import gtkutils, combobox, treeview
from yms.model import inventory
class InventoryView:
class InventoryView(View):
def __init__(self, context):
self.title = _("Inventory")
builder = Gtk.Builder()
builder.set_translation_domain(context.textdomain)
builder.add_from_file(os.path.join(context.ui_path, "inventory.ui"))
builder.connect_signals(self)
self.topwidget = builder.get_object("topobject")
gtkutils.init_named_controls(self, builder)
super().__init__(context, _("Inventory"), "inventory.ui")
self.inv = inventory.Inventory(context.db) # current record
self.newrecord = False
# Inventory gets vessel assignment via
# - storage direct
# - or via box which is assigned to a storage
self.lst_inventory = Gtk.ListStore(int, str, str, int, str, str)
sql = (
"SELECT i.invid, i.invname, s.sname AS container, i.number, i.invcond, i.remarks "
"FROM inventory AS i JOIN storage AS s ON (i.conttype='storage' AND i.sid=s.sid) "
"WHERE s.vid=%s "
"UNION SELECT i.invid, i.invname, b.label AS container, i.number, i.invcond, i.remarks "
"FROM inventory AS i JOIN box AS b ON (i.conttype='box' AND i.boxid=b.boxid) JOIN storage AS s ON (b.sid=s.sid) "
"WHERE s.vid=%s"
)
self.db.cur.execute(sql, (context.vessel.vid, context.vessel.vid))
for row in self.db.cur.fetchall():
self.lst_inventory.append(row)
treeview.add_column(self.tree['inventory'], _('ID'), 0)
treeview.add_column(self.tree['inventory'], _('Name'), 1)
treeview.add_column(self.tree['inventory'], _('Container'), 2)
treeview.add_column(self.tree['inventory'], _('Number'), 3)
treeview.add_column(self.tree['inventory'], _('Condition'), 4)
treeview.add_column(self.tree['inventory'], _('Remarks'), 5)
self.tree['inventory'].set_model(self.lst_inventory)
# buttons on list page
def on_but_new_clicked(self, widget):
self.topwidget.set_visible_child(self.box['inv_edit'])
def on_but_edit_clicked(self, widget):
self.topwidget.set_visible_child(self.box['inv_edit'])
def on_but_detail_clicked(self, widget):
self.topwidget.set_visible_child(self.box['inv_detail'])
# buttons on detail page
# edit2 uses edit callback
def on_but_close_clicked(self, widget):
self.topwidget.set_visible_child(self.box['inventory'])
def on_but_delete_clicked(self, widget):
self.topwidget.set_visible_child(self.box['inventory'])
# buttons on edit page
def on_but_save_clicked(self, widget):
pass
def on_but_cancel_clicked(self, widget):
self.topwidget.set_visible_child(self.box['inventory'])
+49 -8
View File
@@ -5,15 +5,56 @@ import gi
gi.require_version("Gtk", "3.0")
from gi.repository import Gtk
from .view import View
from yms import gtkutils, combobox, treeview
from yms.model import maintenance
class MaintenanceView:
class MaintenanceView(View):
def __init__(self, context):
self.title = _("Maintenance")
builder = Gtk.Builder()
builder.set_translation_domain(context.textdomain)
builder.add_from_file(os.path.join(context.ui_path, "maintenance.ui"))
builder.connect_signals(self)
self.topwidget = builder.get_object("topobject")
gtkutils.init_named_controls(self, builder)
super().__init__(context, _("Maintenance"), "maintenance.ui")
self.maint = maintenance.Maintenance(context.db) # current record
self.newrecord = False
self.lst_maintenance = Gtk.ListStore(int, str, str, str)
sql = (
"SELECT m.maintid, m.activities, e.ename, m.remarks "
"FROM maintenance AS m LEFT OUTER JOIN equipment AS e USING (eid) "
"WHERE m.vid=%s "
"ORDER BY m.maintid"
)
self.db.cur.execute(sql, (context.vessel.vid,))
for row in self.db.cur.fetchall():
self.lst_maintenance.append(row)
treeview.add_column(self.tree['maintenance'], _('ID'), 0)
treeview.add_column(self.tree['maintenance'], _('Activities'), 1)
treeview.add_column(self.tree['maintenance'], _('Equipment'), 2)
treeview.add_column(self.tree['maintenance'], _('Remarks'), 3)
self.tree['maintenance'].set_model(self.lst_maintenance)
# buttons on list page
def on_but_new_clicked(self, widget):
self.topwidget.set_visible_child(self.box['maint_edit'])
def on_but_edit_clicked(self, widget):
self.topwidget.set_visible_child(self.box['maint_edit'])
def on_but_detail_clicked(self, widget):
self.topwidget.set_visible_child(self.box['maintv_detail'])
# buttons on detail page
# edit2 uses edit callback
def on_but_close_clicked(self, widget):
self.topwidget.set_visible_child(self.box['maintenance'])
def on_but_delete_clicked(self, widget):
self.topwidget.set_visible_child(self.box['maintenance'])
# buttons on edit page
def on_but_save_clicked(self, widget):
pass
def on_but_cancel_clicked(self, widget):
self.topwidget.set_visible_child(self.box['maintenance'])
+59 -8
View File
@@ -5,15 +5,66 @@ import gi
gi.require_version("Gtk", "3.0")
from gi.repository import Gtk
from .view import View
from yms import gtkutils, combobox, treeview
from yms.model import project
class ProjectsView:
class ProjectsView(View):
def __init__(self, context):
self.title = _("Projects")
builder = Gtk.Builder()
builder.set_translation_domain(context.textdomain)
builder.add_from_file(os.path.join(context.ui_path, "projects.ui"))
builder.connect_signals(self)
self.topwidget = builder.get_object("topobject")
gtkutils.init_named_controls(self, builder)
super().__init__(context, _("Projects"), "projects.ui")
self.project = project.Project(context.db) # current record
self.newrecord = False
self.lst_projects = Gtk.ListStore(int, str, str, int, str, str)
sql = (
"SELECT projid, projname, startdate, duration, projstate, remarks "
"FROM project "
"WHERE vid=%s "
"ORDER BY projid"
)
self.db.dcur.execute(sql, (context.vessel.vid,))
for row in self.db.dcur.fetchall():
data = (
row['projid'],
row['projname'],
self.format_date(row['startdate']),
row['duration'],
row['projstate'],
row['remarks']
)
self.lst_projects.append(data)
treeview.add_column(self.tree['projects'], _('ID'), 0)
treeview.add_column(self.tree['projects'], _('Name'), 1)
treeview.add_column(self.tree['projects'], _('Start date'), 2)
treeview.add_column(self.tree['projects'], _('Duration'), 3)
treeview.add_column(self.tree['projects'], _('Status'), 4)
treeview.add_column(self.tree['projects'], _('Remarks'), 5)
self.tree['projects'].set_model(self.lst_projects)
# buttons on list page
def on_but_new_clicked(self, widget):
self.topwidget.set_visible_child(self.box['proj_edit'])
def on_but_edit_clicked(self, widget):
self.topwidget.set_visible_child(self.box['proj_edit'])
def on_but_detail_clicked(self, widget):
self.topwidget.set_visible_child(self.box['proj_detail'])
# buttons on detail page
# edit2 uses edit callback
def on_but_close_clicked(self, widget):
self.topwidget.set_visible_child(self.box['projects'])
def on_but_delete_clicked(self, widget):
self.topwidget.set_visible_child(self.box['projects'])
# buttons on edit page
def on_but_save_clicked(self, widget):
pass
def on_but_cancel_clicked(self, widget):
self.topwidget.set_visible_child(self.box['projects'])
+64 -8
View File
@@ -5,15 +5,71 @@ import gi
gi.require_version("Gtk", "3.0")
from gi.repository import Gtk
from .view import View
from yms import gtkutils, combobox, treeview
from yms.model import provision
class ProvisionsView:
class ProvisionsView(View):
def __init__(self, context):
self.title = _("Provisions")
builder = Gtk.Builder()
builder.set_translation_domain(context.textdomain)
builder.add_from_file(os.path.join(context.ui_path, "provisions.ui"))
builder.connect_signals(self)
self.topwidget = builder.get_object("topobject")
gtkutils.init_named_controls(self, builder)
super().__init__(context, _("Provisions"), "provisions.ui")
self.prov = provision.Provision(context.db) # current record
self.newrecord = False
self.load_dropdown()
self.lst_provisions = Gtk.ListStore(int, str, int, str, str, str)
sql = (
"SELECT p.provid, p.provname, p.number, p.unit, p.storedate, p.shelflife "
"FROM provisions AS p LEFT OUTER JOIN storage AS s USING (sid) "
"WHERE s.vid=%s"
)
self.db.dcur.execute(sql, (context.vessel.vid,))
for row in self.db.dcur.fetchall():
data = (
row['provid'],
row['provname'],
row['number'],
self.prov_unit[row['unit']],
self.format_date(row['storedate']),
self.format_date(row['shelflife'])
)
self.lst_provisions.append(data)
treeview.add_column(self.tree['provisions'], _('ID'), 0)
treeview.add_column(self.tree['provisions'], _('Description'), 1)
treeview.add_column(self.tree['provisions'], _('Number'), 2)
treeview.add_column(self.tree['provisions'], _('Unit'), 3)
treeview.add_column(self.tree['provisions'], _('Stored'), 4)
treeview.add_column(self.tree['provisions'], _('Best before'), 5)
self.tree['provisions'].set_model(self.lst_provisions)
def load_dropdown(self):
self.db.cur.execute("SELECT ddval, ddtext FROM dropdown WHERE ddid=6 ORDER BY ddval")
self.prov_unit = dict(self.db.cur.fetchall())
# buttons on list page
def on_but_new_clicked(self, widget):
self.topwidget.set_visible_child(self.box['prov_edit'])
def on_but_edit_clicked(self, widget):
self.topwidget.set_visible_child(self.box['prov_edit'])
def on_but_detail_clicked(self, widget):
self.topwidget.set_visible_child(self.box['prov_detail'])
# buttons on detail page
# edit2 uses edit callback
def on_but_close_clicked(self, widget):
self.topwidget.set_visible_child(self.box['provisions'])
def on_but_delete_clicked(self, widget):
self.topwidget.set_visible_child(self.box['provisions'])
# buttons on edit page
def on_but_save_clicked(self, widget):
pass
def on_but_cancel_clicked(self, widget):
self.topwidget.set_visible_child(self.box['provisions'])
+3
View File
@@ -20,6 +20,9 @@ class StatusView:
self.topwidget = builder.get_object("topobject")
gtkutils.init_named_controls(self, builder)
# Generic information
self.label['dbinfo'].set_text("Database: {}".format(context.cfg['db']))
# Load table status info
self.lst_tables = Gtk.ListStore(str, int)
for row in self.get_table_counts():
+88
View File
@@ -0,0 +1,88 @@
# SPDX-License-Identifier: WTFPL
import os
import gi
gi.require_version("Gtk", "3.0")
from gi.repository import GLib, Gtk, Gdk
from .view import View
from yms import gtkutils, combobox, treeview
from yms.model import storage
class StorageView(View):
def __init__(self, context):
super().__init__(context, _("Storage"), "storage.ui")
self.storage = storage.Storage(context.db) # current record
self.newrecord = False
self.lst_storage = Gtk.ListStore(int, str, str, str)
sql = (
"SELECT sid, sname, CONCAT(x, ',', y, ',', z) AS position, remarks "
"FROM storage "
"WHERE vid=%s "
"ORDER BY sname"
)
self.db.cur.execute(sql, (context.vessel.vid,))
for row in self.db.cur.fetchall():
self.lst_storage.append(row)
treeview.add_column(self.tree['storage'], _('ID'), 0)
treeview.add_column(self.tree['storage'], _('Name'), 1)
treeview.add_column(self.tree['storage'], _('Position'), 2)
treeview.add_column(self.tree['storage'], _('Remarks'), 3)
self.tree['storage'].set_model(self.lst_storage)
def load_list(self):
pass
def display_record(self):
self.label['name'].set_text(self.storage.sname)
self.label['remarks'].set_text(self.storage.remarks or '')
def edit_record(self):
self.entry['sname'].set_text(self.storage.sname)
self.spin['x'].set_value(self.storage.x)
self.spin['y'].set_value(self.storage.y)
self.spin['z'].set_value(self.storage.z)
self.text['remarks'].get_buffer().set_text(self.storage.remarks or '')
# buttons on list page
def on_but_new_clicked(self, widget):
self.newrecord = True
self.label['title_edit'].set_text("Add new Storage")
self.topwidget.set_visible_child(self.box['stor_edit'])
def on_but_edit_clicked(self, widget):
self.newrecord = False
self.label['title_edit'].set_text("Edit Storage")
sid = treeview.get_value(self.tree['storage'], 0)
self.storage.load(sid)
self.edit_record()
self.topwidget.set_visible_child(self.box['stor_edit'])
def on_but_detail_clicked(self, widget):
sid = treeview.get_value(self.tree['storage'], 0)
self.storage.load(sid)
self.display_record()
self.topwidget.set_visible_child(self.box['stor_detail'])
# buttons on detail page
# edit2 uses edit callback
def on_but_close_clicked(self, widget):
self.topwidget.set_visible_child(self.box['storage'])
def on_but_delete_clicked(self, widget):
self.topwidget.set_visible_child(self.box['storage'])
self.newrecord = False
# buttons on edit page
def on_but_save_clicked(self, widget):
print("save not implemented yet")
self.newrecord = False
def on_but_cancel_clicked(self, widget):
self.topwidget.set_visible_child(self.box['storage'])
self.newrecord = False
+7 -1
View File
@@ -8,10 +8,11 @@ SPDX-License-Identifier: WTFPL
import os
import gi
gi.require_version("Gtk", "3.0")
from gi.repository import Gtk
from gi.repository import GLib, Gtk, Gdk
from yms import gtkutils
class View:
def __init__(self, context, title, ui_file):
self.context = context
self.db = context.db
@@ -25,6 +26,11 @@ class View:
self.topwidget = builder.get_object("topobject")
gtkutils.init_named_controls(self, builder)
def format_date(self, dateval):
if dateval is None:
return ''
return dateval.strftime(self.context.datefmt)
def on_textview_keypress(self, widget, event):
# Generic limit length function
if event.state & Gdk.ModifierType.CONTROL_MASK: