From ad56d9e930affee5dccc26cd1707721b8683e2f2 Mon Sep 17 00:00:00 2001 From: karim Date: Sun, 24 May 2026 18:14:13 +0200 Subject: [PATCH] Fix Texture-Picker: Custom-Bridge fuer Project-Settings Satellite MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit open_satellite_window ohne bridge=-Param verwendet eine Inline-Bridge die nur READY/SAVE/CANCEL kennt — PICK_TEXTURE_FILE-Messages wurden stumm verworfen. Fix: _ProjectSettingsBridge als BaseBridge-Subclass mit eigener PICK_TEXTURE_FILE-Handler-Logik. Sendet TEXTURE_PICKED direkt zurueck an die selbe WebView. Co-Authored-By: Claude Opus 4.7 --- rhino/rhinopanel.py | 54 +++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 52 insertions(+), 2 deletions(-) diff --git a/rhino/rhinopanel.py b/rhino/rhinopanel.py index e809971..9c58854 100644 --- a/rhino/rhinopanel.py +++ b/rhino/rhinopanel.py @@ -749,12 +749,62 @@ class EbenenBridge(panel_base.BaseBridge): print("[PROJECT-SETTINGS] {} Waende regenert".format(len(wall_ids))) except Exception as ex: print("[PROJECT-SETTINGS] wall regen:", ex) - panel_base.open_satellite_window( + # Custom-Bridge fuer Project-Settings: handelt SAVE/CANCEL + + # PICK_TEXTURE_FILE direkt in dieser Satellite-WebView. Inline-Bridge + # konnte nur READY/SAVE/CANCEL → Texture-Picker-Messages gingen + # verloren. + bridge_holder = {"form": None} + class _ProjectSettingsBridge(panel_base.BaseBridge): + def __init__(self): + panel_base.BaseBridge.__init__(self, "project_settings") + def handle(self, data): + if not isinstance(data, dict): return + t = data.get("type", "") + p = data.get("payload") or {} + if t == "READY": + pass + elif t == "SAVE": + try: on_save(p) + except Exception as ex: + print("[PROJECT-SETTINGS] on_save:", ex) + try: + f = bridge_holder.get("form") + if f is not None: f.Close() + except Exception: pass + elif t == "CANCEL": + try: + f = bridge_holder.get("form") + if f is not None: f.Close() + except Exception: pass + elif t == "PICK_TEXTURE_FILE": + self._pick_texture(p) + def _pick_texture(self, payload): + slot = payload.get("slot") or "diffuse" + try: + import Eto.Forms as forms + dlg = forms.OpenFileDialog() + dlg.Title = "Textur waehlen ({})".format(slot) + dlg.MultiSelect = False + dlg.Filters.Add(forms.FileFilter("Bilder", + ".jpg", ".jpeg", ".png", ".tif", ".tiff", ".bmp", ".tga")) + dlg.Filters.Add(forms.FileFilter("Alle", ".*")) + parent = bridge_holder.get("form") + res = dlg.ShowDialog(parent) if parent else dlg.ShowDialog(None) + if str(res) != "Ok": + self.send("TEXTURE_PICKED", {"slot": slot, "path": None}) + return + self.send("TEXTURE_PICKED", + {"slot": slot, "path": dlg.FileName or ""}) + except Exception as ex: + print("[PROJECT-SETTINGS] pick_texture:", ex) + self.send("TEXTURE_PICKED", {"slot": slot, "path": None}) + b = _ProjectSettingsBridge() + bridge_holder["form"] = panel_base.open_satellite_window( "project_settings", params=params, title="Projekt-Einstellungen", size=(440, 540), - on_save=on_save) + bridge=b) def _pick_texture_file(self, payload): """Oeffnet macOS-File-Picker (via Eto.Forms.OpenFileDialog) und