From 9c7325440f8172a1554cd7d8e38d607b6b60f88f Mon Sep 17 00:00:00 2001 From: mistangl Date: Mon, 15 Jan 2024 15:04:24 +0100 Subject: [PATCH] =?UTF-8?q?zwischenstand=20eingepflegt.=20Controller=20Fun?= =?UTF-8?q?ktionen=20soll=20in=20Zukunft=20=C3=BCber=20Events=20aufgerufen?= =?UTF-8?q?=20werden)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/CreoMigrateGui.py | 77 ++++++++++++++++++++++++++----------------- lib/caditem.py | 8 ++++- lib/controller.py | 62 +++++++++++++++++++++++++++++++--- lib/test_gui.py | 10 ++++-- 4 files changed, 118 insertions(+), 39 deletions(-) diff --git a/lib/CreoMigrateGui.py b/lib/CreoMigrateGui.py index 5032811..0eaa4aa 100644 --- a/lib/CreoMigrateGui.py +++ b/lib/CreoMigrateGui.py @@ -7,11 +7,9 @@ from caditem import CadItem #logger = logging.getLogger(__name__) - - class TreeView(): - def __init__(self, frame, controller): - self.controller = controller + def __init__(self, frame): + self.controller = None # a treeview # hier Anzahl der sichtbaren Zeilen des Baums angeben: self.tree = ttk.Treeview(frame, height=40) @@ -25,8 +23,16 @@ class TreeView(): self.tree.bind('<>', self.item_selected) + def set_controller(self, controller): + self.controller = controller + + def refresh(self, parent_children_mapping, red_ids): + self.clear() + self.create(parent_children_mapping, red_ids) + def clear(self): - self.tree.delete() + for c in self.tree.get_children(): + self.tree.delete(c) def create(self, parent_children_mapping, red_ids): # adding data of first column after root @@ -56,13 +62,18 @@ class TreeView(): self.tree.tag_configure('good', background='white') self.tree.tag_configure('missing', background='red') + def data_from_model(self): + parent_children_mapping = self.controller.get_parent_children() + red_ids = self.controller.get_red_ids() + self.create(parent_children_mapping, red_ids) + def item_selected(self, event): - """callback if an item in the tree has been selected + """callback of TK if an item in the tree has been selected """ cid = self.tree.selection()[0] - # trage es + # trage die neue ID ins Modell ein self.controller.set_gui_data('teilenummer', cid) - self.controller.update_view() + # for selected_item in self.tree.selection(): # item = self.tree.item(selected_item) # record = item['values'] @@ -71,14 +82,17 @@ class TreeView(): def get_handle(self): return self.tree + class RightFrameLabels(): - def __init__(self, frame, controller, nrow=0): - self.controller = controller + def __init__(self, frame, nrow=0): + self.controller = None self.frame = frame self.build_gui() - self.data_from_model() self.set_start_rwo(nrow) + def set_controller(self, controller): + self.controller = controller + def get_rows(self): return self.rownum def set_start_rwo(self, nrow): @@ -134,11 +148,10 @@ class RightFrameLabels(): self.teilenummer_text.set(data["teilenummer"]) class RightFramePDM(): - def __init__(self, frame, controller, nrow=0): - self.controller = controller + def __init__(self, frame, nrow=0): + self.controller = None self.frame = frame self.build_gui() - self.data_from_model() self.set_start_rwo(nrow) def get_rows(self): @@ -232,22 +245,24 @@ class RightFramePDM(): if 'lebenszyklus_status_neu' in data: self.lebenszyklus_status_neu.set(data["lebenszyklus_status_neu"]) if 'aus_halbzeug_neu' in data: - self.zusatzinfos_text.set(data["aus_halbzeug_neu"]) + self.aus_halbzeug_neu= data["aus_halbzeug_neu"] if 'zusatzinfos_text_neu' in data: - self.aus_halbzeug_neu = data["zusatzinfos_text_neu"] + self.zusatzinfos_text.set(data["zusatzinfos_text_neu"]) def combo_callbacks(self, event): - """ handle the changed event """ + """ handle the changed event of TK""" # TODO falls nötig pass + def set_controller(self, controller): + self.controller = controller + class App(): - def __init__(self, root, controller): + def __init__(self, root): self.root = root - self.controller = controller # configure the grid # die erste Spalte mit Baum sollte unbeweglich bleiben bei Vergräßerung des Fensters. @@ -265,25 +280,27 @@ class App(): style = ttk.Style(self.root) style.theme_use('classic') - current_id = self.controller.get_current_asm_id() - parent_children_mapping = self.controller.get_parent_children() - red_ids = self.controller.get_red_ids() - self.tv = TreeView(left_frame, controller) - self.tv.create(parent_children_mapping, red_ids) + self.tv = TreeView(left_frame) gridhdl = self.tv.get_handle() gridhdl.grid(row=0, column=0, sticky=tk.NSEW) - self.rf0 = RightFrameLabels(right_frame, controller, 0) + self.rf0 = RightFrameLabels(right_frame, 0) nrows = self.rf0.get_rows() - self.rf1 = RightFramePDM(right_frame, controller, nrows) + self.rf1 = RightFramePDM(right_frame, nrows) nrows = self.rf1.get_rows() - #self.rf2 = RightFramePDM(right_frame, controller, nrows) + #self.rf2 = RightFramePDM(right_frame, nrows) # TODO usw. - def update_view(self): - self.rf0.update_view() - self.rf1.update_view() + def data_from_model(self): + self.tv.set_controller(self.controller) + self.rf0.set_controller(self.controller) + self.rf1.set_controller(self.controller) + self.tv.data_from_model() + self.rf0.data_from_model() + self.rf1.data_from_model() + def set_controller(self, controller): + self.controller = controller def mainloop(self): self.root.mainloop() diff --git a/lib/caditem.py b/lib/caditem.py index 8543b8e..378a183 100644 --- a/lib/caditem.py +++ b/lib/caditem.py @@ -1,4 +1,10 @@ import json +from controller import Controller, Event + + + + + class CadItem(): """ This item contains all data for writing all necessary data to the solid edg cad file @@ -33,7 +39,7 @@ class CadItem(): "neuaufbau", "lebenszyklus_status_neu", "aus_halbzeug_neu", - "zusatzinfos_txt_neu", + "zusatzinfos_text_neu", "bezeichnung_sivas", "bezeichnung_neu", "beschaffungsart_sivas","beschaffungsart_neu" "mengeneinheit_sivas","mengeneinheit_neu" diff --git a/lib/controller.py b/lib/controller.py index b22ccc4..1ac0d18 100644 --- a/lib/controller.py +++ b/lib/controller.py @@ -2,15 +2,66 @@ Contains the logic for the MVC of CreoMigrate Gui """ -class Controller(): +class Observer(): + _observers = [] + def __init__(self): + self._observers.append(self) + self._observables = {} + + def observe(self, event_name, callback): + """If the observer is not in the list, + append it into the list""" + if event_name not in self._observables: + self._observables[event_name] = callback + + def detach(self, observer): + """Remove the observer from the observer list""" + try: + self._observers.remove(observer) + except ValueError: + pass + + def attach(self, observer): + """If the observer is not in the list, + append it into the list""" + if observer not in self._observers: + self._observers.append(observer) + + def notify(self, modifier = None): + """Alert the observers""" + for observer in self._observers: + if modifier != observer: + observer.update(self) + +class Event(): + def __init__(self, name, data, autofire = True): + self.name = name + self.data = data + if autofire: + self.fire() + def fire(self): + for observer in Observer._observers: + if self.name in observer._observables: + observer._observables[self.name](self.data) + +class Controller(Observer): """ Class for manipulating the model and returning data for the view """ - def __init__(self, model): - self.model = model + def __init__(self): + self.model = None + self.view = None # currently just one gui/view + Observer.__init__(self) - def update_view(self): - pass + def set_model(self, model): + self.model = model + def set_view(self, view): + self.view = view + + def data_to_gui(self): + self.view.data_from_model() + def data_from_model(self): + self.view.data_from_model() def get_current_asm_id(self): self.model.get_current_asm_id() @@ -49,6 +100,7 @@ class Controller(): def set_gui_data(self, key, value): """merken der Eingaben des Nutzers der GUI """ self.model.set_gui_data(key, value) + self.notify() def get_gui_data(self, key): return self.model.get_gui_data(key) diff --git a/lib/test_gui.py b/lib/test_gui.py index 669cd95..78bfea8 100644 --- a/lib/test_gui.py +++ b/lib/test_gui.py @@ -74,15 +74,19 @@ gui_data = { "pdm_kategorie_neu":"Einzelteil", "neuaufbau" :"False", "lebenszyklus_status_neu" :"Serie", - "neuaufbau" :"", "aus_halbzeug_neu" :"True", + "zusatzinfos_text_neu": 'Dies sind neue Zusatzinfos', } model.set_gui_dict(gui_data) model.set_parent_children(parent_children_mapping) model.set_red_ids(red_ids) -controller = Controller(model) +controller = Controller() root = tk.Tk() -app = App(root, controller) +app = App(root) +app.set_controller(controller) +controller.set_view(app) +controller.set_model(model) +controller.data_to_gui() app.mainloop()