feat: AR-VMS-Seaman initial commit — Python FastAPI + PySide6 (runtime server + desktop studio client)

This commit is contained in:
2026-07-03 12:16:31 -04:00
parent 7390d5cd51
commit 2302e963b2
12 changed files with 1144 additions and 136 deletions
+18 -4
View File
@@ -20,6 +20,7 @@ from PySide6.QtWidgets import (
QMessageBox,
QPushButton,
QSplitter,
QStackedWidget,
QStatusBar,
QTabWidget,
QToolBar,
@@ -42,6 +43,7 @@ from vmssailor.studio.theme import (
)
from vmssailor.studio.widgets.system_sidebar import SystemSidebar
from vmssailor.studio.widgets.vessel_canvas import VesselCanvas
from vmssailor.studio.widgets.welcome_screen import WelcomeScreen
from vmssailor.studio.wizard.wizard import VesselWizard
logger = logging.getLogger(__name__)
@@ -119,7 +121,10 @@ class MainWindow(QMainWindow):
self._topbar = bar
def _build_central(self) -> None:
# Splitter horizontal: sidebar | canvas
# Welcome screen (visible al arrancar sin proyecto)
self._welcome = WelcomeScreen()
# Workspace splitter (visible cuando hay proyecto cargado)
self._splitter = QSplitter(Qt.Horizontal)
self._splitter.setHandleWidth(1)
self._splitter.setChildrenCollapsible(False)
@@ -129,7 +134,6 @@ class MainWindow(QMainWindow):
self._sidebar.setMinimumWidth(260)
self._sidebar.setMaximumWidth(380)
# Right pane: vertical splitter with canvas on top + editor tabs below
self._canvas = VesselCanvas()
self._equipment_editor = EquipmentEditor()
self._mimic_editor = MimicEditor()
@@ -153,13 +157,18 @@ class MainWindow(QMainWindow):
self._splitter.addWidget(right_splitter)
self._splitter.setSizes([280, 1160])
# Compose central widget: topbar (top) + splitter (rest)
# StackedWidget conmuta entre welcome y workspace
self._main_stack = QStackedWidget()
self._main_stack.addWidget(self._welcome) # index 0
self._main_stack.addWidget(self._splitter) # index 1
# Compose central widget: topbar (top) + stack (rest)
wrapper = QWidget()
outer = QVBoxLayout(wrapper)
outer.setContentsMargins(0, 0, 0, 0)
outer.setSpacing(0)
outer.addWidget(self._topbar)
outer.addWidget(self._splitter, 1)
outer.addWidget(self._main_stack, 1)
self.setCentralWidget(wrapper)
def _build_statusbar(self) -> None:
@@ -254,6 +263,9 @@ class MainWindow(QMainWindow):
self._equipment_editor.projectMutated.connect(self._on_project_mutated)
self._tag_editor.projectMutated.connect(self._on_project_mutated)
self._alarm_editor.projectMutated.connect(self._on_project_mutated)
# Welcome screen CTAs disparan las mismas acciones que el menú
self._welcome.newProjectRequested.connect(self.on_new_wizard)
self._welcome.openProjectRequested.connect(self.on_open)
# ----- Slots --------------------------------------------------------
@@ -360,6 +372,8 @@ class MainWindow(QMainWindow):
self._btn_save_top.setEnabled(has_project)
self._btn_validate.setEnabled(has_project)
self._btn_compile.setEnabled(has_project)
# Conmuta entre welcome screen (0) y workspace (1)
self._main_stack.setCurrentIndex(1 if has_project else 0)
self._update_window_title()
self._update_stats()
if project is not None: