diff --git a/Content/Levels/ColorCalibration/OpenVPCal.umap b/Content/Levels/ColorCalibration/OpenVPCal.umap index 96069c4..2c772fe 100644 Binary files a/Content/Levels/ColorCalibration/OpenVPCal.umap and b/Content/Levels/ColorCalibration/OpenVPCal.umap differ diff --git a/Content/Levels/Lidinis360/Media/ElectraFileMediaSource.uasset b/Content/Levels/Lidinis360/Media/ElectraFileMediaSource.uasset index fcd8949..7e47fec 100644 Binary files a/Content/Levels/Lidinis360/Media/ElectraFileMediaSource.uasset and b/Content/Levels/Lidinis360/Media/ElectraFileMediaSource.uasset differ diff --git a/Content/Media/ColorCalibration/ColorCalibrationPatterns.uasset b/Content/Media/ColorCalibration/ColorCalibrationPatterns.uasset index e5d5bf7..bbd6b87 100644 Binary files a/Content/Media/ColorCalibration/ColorCalibrationPatterns.uasset and b/Content/Media/ColorCalibration/ColorCalibrationPatterns.uasset differ diff --git a/Content/TheStudio/Media/Sync/DanteAudioTimecodeProvider.uasset b/Content/TheStudio/Media/Sync/DanteAudioTimecodeProvider.uasset index 30ca0a5..973cd35 100644 Binary files a/Content/TheStudio/Media/Sync/DanteAudioTimecodeProvider.uasset and b/Content/TheStudio/Media/Sync/DanteAudioTimecodeProvider.uasset differ diff --git a/Source/git_management.bat b/Source/git_management.bat index 94bf34d..061c507 100644 --- a/Source/git_management.bat +++ b/Source/git_management.bat @@ -1,47 +1,153 @@ -@echo off -REM --------------------------------------------- -REM Safe Switchboard External Command: Git Pull -REM Discards local changes, pulls latest from current branch -REM Safe to keep inside the Git repo -REM --------------------------------------------- +# plugin_prelaunch.py - With connection check +from switchboard.devices.device_base import Device, DeviceStatus +from switchboard.devices.device_widget_base import DeviceWidget +from switchboard.switchboard_logging import LOGGER +from switchboard.config import IntSetting, StringSetting -REM Change this to your project repo path (can be inside repo) -set REPO_PATH=D:\Projects\DEV_TheStudio_Plugin +from PySide6 import QtCore -REM Name of this batch file -set BATCH_NAME=%~nx0 -echo ------------------------------------------------ -echo [%COMPUTERNAME%] Starting safe Git pull on %REPO_PATH% -echo ------------------------------------------------ +class DevicePreLaunch(Device): + """PreLaunch device - executes batch file on connect""" + + csettings = { + 'batch_file': StringSetting( + attr_name="batch_file", + nice_name="Batch File Path", + value="D:\\Projects\\DEV_TheStudio_Plugin\\Source\\git_management.bat", + tool_tip="Full path to the batch file on the remote machine", + category="PreLaunch Settings", + ), + 'port': IntSetting( + attr_name="port", + nice_name="Listener Port", + value=2980, + tool_tip="Port of SwitchboardListener", + category="Network Settings", + ), + } + + def __init__(self, name, address, **kwargs): + super().__init__(name, address, **kwargs) + LOGGER.info(f"PreLaunch device '{name}' created") + + def device_settings(self): + return super().device_settings() + + def connect(self): + """Called when connect button clicked""" + LOGGER.info(f">>> {self.name}: connect() called!") + + # First, check if listener is reachable + LOGGER.info(f">>> {self.name}: Checking listener connection...") + + # Try a simple connectivity test + try: + # Send a simple test message + test_message = {'command': 'state'} + success, response = self.unreal_client.send_message(test_message) + + if not success: + LOGGER.error(f">>> {self.name}: Cannot connect to listener!") + self.device_qt_handler.signal_device_connect_failed.emit(self) + return + + LOGGER.info(f">>> {self.name}: Listener responded: {response}") + + except Exception as e: + LOGGER.error(f">>> {self.name}: Connection test failed: {e}") + self.device_qt_handler.signal_device_connect_failed.emit(self) + return + + # Set status to READY + self.status = DeviceStatus.READY + LOGGER.info(f">>> {self.name}: Status set to READY, executing batch file...") + + # Execute batch file + self.execute_batch_file() + + def disconnect(self): + """Called when disconnect button clicked""" + LOGGER.info(f">>> {self.name}: disconnect() called!") + self.status = DeviceStatus.DISCONNECTED + + def execute_batch_file(self): + """Execute the batch file""" + batch_file = self.batch_file.get_value() + + if not batch_file: + LOGGER.warning(f"  {self.name}: No batch file configured") + return False + + LOGGER.info(f">>> {self.name}: ========== EXECUTING ==========") + LOGGER.info(f">>> {self.name}: File: {batch_file}") + LOGGER.info(f">>> {self.name}: Address: {self.address}") + LOGGER.info(f">>> {self.name}: Port: {self.port.get_value()}") + + try: + message = { + 'command': 'start', + 'bTryKill': False, + 'bUpdateWorkingDir': False, + 'caller': self.name, + 'name': 'cmd.exe', + 'args': f'/c "{batch_file}"', + 'working_dir': '', + } + + LOGGER.info(f">>> {self.name}: Sending message...") + success, msg = self.unreal_client.send_message(message) + + if success: + LOGGER.info(f">>>  {self.name}: SUCCESS!") + LOGGER.info(f">>> Response: {msg}") + return True + else: + LOGGER.error(f">>> L {self.name}: Send failed!") + return False + + except Exception as e: + LOGGER.error(f">>> L {self.name}: ERROR: {e}") + import traceback + LOGGER.error(traceback.format_exc()) + return False -REM Navigate to the repo -cd /d "%REPO_PATH%" -REM Ensure Git is installed -where git >nul 2>&1 -IF %ERRORLEVEL% NEQ 0 ( - echo ERROR: Git is not installed or not in PATH - exit /b 1 -) - -REM Get current branch -for /f "tokens=*" %%i in ('git rev-parse --abbrev-ref HEAD') do set CURRENT_BRANCH=%%i -echo Current branch: %CURRENT_BRANCH% - -REM Discard any local changes (staged and unstaged) -git reset --hard - -REM Clean untracked files and directories, excluding this batch file -git clean -fdX -e "%BATCH_NAME%" - -REM Pull latest changes from origin for current branch -git pull origin %CURRENT_BRANCH% - -REM Show status -git status - -echo ------------------------------------------------ -echo [%COMPUTERNAME%] Git pull complete -echo ------------------------------------------------ -pause +class DeviceWidgetPreLaunch(DeviceWidget): + """Widget for PreLaunch device""" + + def __init__(self, name, device_hash, address, icons, parent=None): + super().__init__(name, device_hash, address, icons, parent=parent) + LOGGER.info(f"PreLaunch widget created for {name}") + + def _add_control_buttons(self): + """Add connect button""" + super()._add_control_buttons() + + CONTROL_BUTTON_ICON_SIZE = QtCore.QSize(21, 21) + + self.connect_button = self.add_control_button( + icon_size=CONTROL_BUTTON_ICON_SIZE, + checkable=True, + tool_tip='Connect and execute batch file', + hover_focus=False, + name='connect') + + self.connect_button.clicked.connect(self.connect_button_clicked) + + def connect_button_clicked(self): + """Handle connect button click""" + if self.connect_button.isChecked(): + self._connect() + else: + self._disconnect() + + def _connect(self): + """Connect""" + self.connect_button.setChecked(True) + self.signal_device_widget_connect.emit(self) + + def _disconnect(self): + """Disconnect""" + self.connect_button.setChecked(False) + self.signal_device_widget_disconnect.emit(self) \ No newline at end of file