diff --git a/lib/caditem.py b/lib/caditem.py index 9715173..6a9b4e7 100644 --- a/lib/caditem.py +++ b/lib/caditem.py @@ -170,6 +170,7 @@ class CadItem(DataModel): self._parent_children_mapping = {} self._data = {} self._gui_data = {} + self._gui_states = {} self._read_only_items = {} self._controller = None self._logic = None @@ -177,7 +178,10 @@ class CadItem(DataModel): def clear(self): self._data = {} self._gui_data = {} + self._gui_states = {} self._read_only_items = {} + if self._logic: + self._logic.clear_states() def add_logic(self, logic): self._logic = logic @@ -253,6 +257,19 @@ class CadItem(DataModel): else: self._gui_data[key] = val + def set_state_dict(self, data:dict): + """ setzt die Zustände der GUI wie readonly etc.""" + for k,v in data.items(): + self.set_state(k,v) + def set_state(self, key, val): + """ merkt sich den status wie 'readonly' etc für die GUI """ + if key not in self.gui_data_keys: + raise Exception("this data can not be set "+ key) + else: + self._gui_states[key] = val + def get_states(self): + return self._gui_states + def get_gui_data(self, key): if key in self._gui_data: return self._gui_data[key] @@ -308,12 +325,19 @@ class CadItem(DataModel): translated_data[self.excel_to_gui[k]] = v # Spezial: Befüllung von Änderungstext mit dem Author, falls in der .csv vorhanden - if "Indexerfasser" in data and "Aenderungstext" in data: - if data["Indexerfasser"] is not None: - translated_data["aenderungstext_sivas"] = '{aenderungstext} (von {author})'.format(aenderungstext=data["Aenderungstext"], author=data["Indexerfasser"]) + if "Indexerfasser" in data: + author = data["Indexerfasser"] + if "Aenderungstext" in data: + if author: + translated_data["aenderungstext_sivas"] = '{aenderungstext} (von {author})'.format(aenderungstext=data["Aenderungstext"], author=author) # Indexerfasser wird nicht in der gui verwaltet. Deshalb Modifikation aus den Rohdate else: translated_data["aenderungstext_sivas"] = data["Aenderungstext"] + else: + default = "Erstanlage" + if author: + default = 'Erstanlage (von {author})'.format(author=author) + translated_data["aenderungstext_sivas"] = default translated_data = self._transform_content_from_csv(translated_data) self.set_gui_dict(translated_data) @@ -422,7 +446,10 @@ class CadItem(DataModel): if self._logic == None: raise Exception("no logic set") else: - return self._logic.callback(key, value) + new_content = self._logic.callback(key, value) + states = self._logic.get_states() + self.set_state_dict(states) + return new_content def get_dependent(self, key): if self._logic == None: @@ -556,14 +583,28 @@ class CadItemRepository: class GuiLogic(): """ Class for business logic. implementing the dependencies between different user inputs - """ + + die neuen Inhalte nach jedem Callback werden als dict zurückgegeben. + Manche Callbacks verursachen weitere abhängige Callbacks. Am Ende geht das + gesamte Dictionary der neuen Inhalte von Comboboxen und Entries zurück und + werden im Modell gesetzt +""" def __init__(self, model, configs): # das Modell soll hier nur verwendet werden um aktuell Zustände abzufragen! # alles weitere zum Setzen von Daten etc. muss über den Controller laufen, also zurück gegeben werden. self._model = model # hier holt man die Daten der Configs self._config = configs - # hier sind alle Callbacks bzw. deren Comboboxen + # hier werden die Zustände gespeichert + self._states = dict() + + def clear_states(self): + self._states = dict() + def get_states(self): + return self._states + def set_state(self, key, val): + """ merkt sich den status wie 'readonly' etc für dieses item in der GUI""" + self._states[key] = val def set_gui_defaults(self): # set defaults from given logic @@ -855,9 +896,9 @@ class GuiLogic(): itemid = str(self._model.get_current_item_id()) pfade = [] for root, dirnames, filenames in os.walk(search_path): - pfade.extend(glob.glob(root + "/"+itemid+".par")) + pfade.extend(glob.glob(os.path.join(root, itemid+".par"))) for root, dirnames, filenames in os.walk(search_path): - pfade.extend(glob.glob(root + "/"+itemid+".asm")) + pfade.extend(glob.glob(os.path.join(root, itemid+".asm"))) # Dropdownwerte = Dateipfade von allen .par-Dateien, die die aktuelle Teilenummer im Dateinamen aufweisen und sich gleichzeitig in einem der rekursiv durchsuchten Pfade aus der Sektion "3D-Modelle" in "Zielpfade.cfg" befinden. # state_ComboBox = readonly # state_Button = keiner diff --git a/lib/controller.py b/lib/controller.py index 55e6002..64d8e31 100644 --- a/lib/controller.py +++ b/lib/controller.py @@ -109,8 +109,9 @@ class Controller(Observer): def refresh_gui(self): self._view.data_from_model() - def data_from_model(self): - self._view.data_from_model() + self._view.set_states() + # def data_from_model(self): + # self._view.data_from_model() def data_from_view(self, key=None): return self._view.data_from_view(key) @@ -194,6 +195,9 @@ class Controller(Observer): def get_all_gui_data(self): return self._model.get_all_gui_data() + def get_gui_states(self): + return self._model.get_states() + def set_widget_status(self, widgetname, status): #self._view.set_widget_status(widgetname, status) pass @@ -252,8 +256,9 @@ class Controller(Observer): # Suche Knopf darf nur bei Einzelteilen funktionieren und wenn Halbzeug/NEuaufbau nicht angehakt sind if pdm_kategorie_neu == "Einzelteil" and not (aus_halbzeug == True or neuaufbau == True): newpath = self._view.suche_3d() - self._model.set_gui_data('model3d_neu', newpath) - self._model.set_gui_data('cb_3Dmodel_neu', '') + if newpath: + self._model.set_gui_data('model3d_neu', newpath) + self._model.set_gui_data('cb_3Dmodel_neu', '') if __name__ == "__main__": diff --git a/lib/gui.py b/lib/gui.py index 639682e..00db949 100644 --- a/lib/gui.py +++ b/lib/gui.py @@ -170,6 +170,11 @@ class LeftFrameAsm(AllFrames): if 'asm_id' in data: self.asm_number.set(data["asm_id"]) + def set_states(self): + # not yet implemented. Not used + pass + + class RightFrameLabels(AllFrames): def __init__(self, frame, nrow=0): AllFrames.__init__(self, nrow) @@ -204,6 +209,11 @@ class RightFrameLabels(AllFrames): if 'teilenummer' in data: self.teilenummer_text.set(data["teilenummer"]) + def set_states(self): + data = self.get_controller().get_gui_states() + if 'teilenummer' in data: + self.teilenummer_text["state"] = data['teilenummer'] + class RightFramePDM(AllFrames): def __init__(self, frame, nrow=0): AllFrames.__init__(self, nrow) @@ -384,6 +394,12 @@ class RightFramePDM(AllFrames): if 'cb_3Dmodel_neu' in data: self.model3d_combo['values'] = data["cb_3Dmodel_neu"] + def set_states(self): + data = self.get_controller().get_gui_states() + pass + # if 'teilenummer' in data: + # self.teilenummer_text["state"] = data['teilenummer'] + class RightFrameBezeichnung(AllFrames): def __init__(self, frame, nrow=0): AllFrames.__init__(self, nrow) @@ -464,6 +480,10 @@ class RightFrameBezeichnung(AllFrames): if 'bezeichnung2_sivas' in data: self.bezeichnung2_sivas.set(data["bezeichnung2_sivas"]) + def set_states(self): + data = self.get_controller().get_gui_states() + pass + class RightFrameHalbzeugOhneS(AllFrames): def __init__(self, frame, nrow=0): AllFrames.__init__(self, nrow) @@ -636,6 +656,10 @@ class RightFrameHalbzeugOhneS(AllFrames): if 'cb_kalkulationsart_neu' in data: self.kalkulationsart_neu_combo['values'] = data['cb_kalkulationsart_neu'] + def set_states(self): + data = self.get_controller().get_gui_states() + pass + class RightFrameBeschaffungsart(AllFrames): def __init__(self, frame, nrow=0): AllFrames.__init__(self, nrow) @@ -733,6 +757,10 @@ class RightFrameBeschaffungsart(AllFrames): if "cb_halbzeug_neu" in data: self.halbzeug_combo['values'] = data["cb_halbzeug_neu"] + def set_states(self): + data = self.get_controller().get_gui_states() + pass + class RightFrameTOSGruppe(AllFrames): def __init__(self, frame, nrow=0): AllFrames.__init__(self, nrow) @@ -900,6 +928,10 @@ class RightFrameTOSGruppe(AllFrames): if "cb_hersteller_neu" in data: self.hersteller_neu_combo['values'] = data["cb_hersteller_neu"] + def set_states(self): + data = self.get_controller().get_gui_states() + pass + class RightFrameWerkstoffdiskrepanz(AllFrames): def __init__(self, frame, nrow=0): AllFrames.__init__(self, nrow) @@ -1018,6 +1050,10 @@ class RightFrameWerkstoffdiskrepanz(AllFrames): if 'cb_farbe_neu' in data: self.farbe_neu_combo['values'] = data["cb_farbe_neu"] + def set_states(self): + data = self.get_controller().get_gui_states() + pass + class RightFrameVersion(AllFrames): def __init__(self, frame, nrow=0): AllFrames.__init__(self, nrow) @@ -1118,6 +1154,10 @@ class RightFrameVersion(AllFrames): if text: self.freigabevermerk_neu.insert('1.0', text) + def set_states(self): + data = self.get_controller().get_gui_states() + pass + def clear_texts(self): self.aenderungstext_sivas.delete('1.0', 'end') self.aenderungstext_neu.delete('1.0', 'end') @@ -1178,6 +1218,11 @@ class RightFrameZusatzinfos(AllFrames): text = data["zusatzinfos_bendef_text"] if text: self.zusatzinfos_bendef_text.insert('1.0', text) + + def set_states(self): + data = self.get_controller().get_gui_states() + pass + def clear_texts(self): self.zusatzinfos_auto_text.delete('1.0', 'end') self.zusatzinfos_bendef_text.delete('1.0', 'end') @@ -1294,6 +1339,21 @@ class App(): self.rf8.clear_texts() self.rf9.clear_texts() + def set_states(self): + # not used. So not implemented: + #self.lf1.set_states() + #self.lf2.set_states() + + self.rf1.set_states() + self.rf2.set_states() + self.rf3.set_states() + self.rf4.set_states() + self.rf5.set_states() + self.rf6.set_states() + self.rf7.set_states() + self.rf8.set_states() + self.rf9.set_states() + def data_from_view(self, key=None): ret = dict()