Files
create/src/Mod/Create/InitGui.py
forbes e0e8e22cd2
Some checks failed
Build and Test / build (pull_request) Failing after 17m0s
feat: live SSE-based Database Activity panel
Replace the static startup-only item list with a real-time event feed:

- InitGui.py: remove the startup list_items() call that showed
  '(Unable to connect)' when not yet authenticated; show a simple
  '(Waiting for connection...)' placeholder instead
- silo_commands.py (submodule): maintain an in-memory event list
  prepended by SSE events, seeded with 10 recent items on first
  connect, with relative timestamps refreshed every 60s

The panel now shows live activity ('F01-0001 updated · just now')
instead of requiring expensive full re-fetches on every SSE event.
2026-02-12 17:27:36 -06:00

157 lines
5.1 KiB
Python

# Kindred Create - Core Module
# GUI initialization - loads ztools and Silo workbenches
import os
import sys
import FreeCAD
import FreeCADGui
def setup_kindred_workbenches():
"""Load Kindred Create addon workbenches."""
home = FreeCAD.getHomePath()
mods_dir = os.path.join(home, "mods")
addons = [
("ztools", "ztools/ztools"),
("silo", "silo/freecad"),
]
for name, subpath in addons:
addon_path = os.path.join(mods_dir, subpath)
if os.path.isdir(addon_path):
# Ensure path is in sys.path
if addon_path not in sys.path:
sys.path.insert(0, addon_path)
# Execute InitGui.py if it exists
init_gui_file = os.path.join(addon_path, "InitGui.py")
if os.path.isfile(init_gui_file):
try:
with open(init_gui_file) as f:
exec_globals = globals().copy()
exec_globals["__file__"] = init_gui_file
exec_globals["__name__"] = name
exec(
compile(f.read(), init_gui_file, "exec"),
exec_globals,
)
FreeCAD.Console.PrintLog(f"Create: Loaded {name} workbench\n")
except Exception as e:
FreeCAD.Console.PrintWarning(
f"Create: Failed to load {name} GUI: {e}\n"
)
setup_kindred_workbenches()
FreeCAD.Console.PrintLog("Create GUI module initialized\n")
# ---------------------------------------------------------------------------
# Silo integration enhancements
# ---------------------------------------------------------------------------
def _check_silo_first_start():
"""Show Silo settings dialog on first startup if not yet configured."""
try:
param = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/KindredSilo")
if not param.GetBool("FirstStartChecked", False):
param.SetBool("FirstStartChecked", True)
if not param.GetString("ApiUrl", ""):
FreeCADGui.runCommand("Silo_Settings")
except Exception as e:
FreeCAD.Console.PrintLog(f"Create: Silo first-start check skipped: {e}\n")
def _register_silo_origin():
"""Register Silo as a file origin so the origin selector can offer it."""
try:
import silo_commands # noqa: F401 - registers Silo commands
import silo_origin
silo_origin.register_silo_origin()
except Exception as e:
FreeCAD.Console.PrintLog(f"Create: Silo origin registration skipped: {e}\n")
def _setup_silo_auth_panel():
"""Dock the Silo authentication panel in the right-hand side panel."""
try:
from PySide import QtCore, QtWidgets
mw = FreeCADGui.getMainWindow()
if mw is None:
return
# Don't create duplicate panels
if mw.findChild(QtWidgets.QDockWidget, "SiloDatabaseAuth"):
return
import silo_commands
auth = silo_commands.SiloAuthDockWidget()
panel = QtWidgets.QDockWidget("Database Auth", mw)
panel.setObjectName("SiloDatabaseAuth")
panel.setWidget(auth.widget)
# Keep the auth object alive so its QTimer isn't destroyed while running
panel._auth = auth
mw.addDockWidget(QtCore.Qt.RightDockWidgetArea, panel)
except Exception as e:
FreeCAD.Console.PrintLog(f"Create: Silo auth panel skipped: {e}\n")
def _setup_silo_activity_panel():
"""Show a dock widget with live Silo database activity."""
try:
from PySide import QtCore, QtWidgets
mw = FreeCADGui.getMainWindow()
if mw is None:
return
# Don't create duplicate panels
if mw.findChild(QtWidgets.QDockWidget, "SiloDatabaseActivity"):
return
panel = QtWidgets.QDockWidget("Database Activity", mw)
panel.setObjectName("SiloDatabaseActivity")
widget = QtWidgets.QWidget()
layout = QtWidgets.QVBoxLayout(widget)
layout.setContentsMargins(0, 0, 0, 0)
activity_list = QtWidgets.QListWidget()
activity_list.addItem("(Waiting for connection...)")
layout.addWidget(activity_list)
panel.setWidget(widget)
mw.addDockWidget(QtCore.Qt.RightDockWidgetArea, panel)
except Exception as e:
FreeCAD.Console.PrintLog(f"Create: Silo activity panel skipped: {e}\n")
def _check_for_updates():
"""Check for application updates in the background."""
try:
from update_checker import _run_update_check
_run_update_check()
except Exception as e:
FreeCAD.Console.PrintLog(f"Create: Update check skipped: {e}\n")
# Defer enhancements until the GUI event loop is running
try:
from PySide.QtCore import QTimer
QTimer.singleShot(1500, _register_silo_origin)
QTimer.singleShot(2000, _setup_silo_auth_panel)
QTimer.singleShot(3000, _check_silo_first_start)
QTimer.singleShot(4000, _setup_silo_activity_panel)
QTimer.singleShot(10000, _check_for_updates)
except Exception:
pass