#include #include #include #include #include #include #include #include #include #include #include #include "GamesPanel.h" #include "LogPanel.h" #include "PowerPanel.h" #include "SettingsTree.h" #include "VersionsPanel.h" #include "WebSocketController.h" static QWidget *makeGamesTab(WebSocketController *ctrl, QWidget *parent) { auto *panel = new GamesPanel(parent); ctrl->setGamesPanel(panel); return panel; } static QWidget *makeVersionsTab(WebSocketController *ctrl, QWidget *parent) { auto *panel = new VersionsPanel(parent); ctrl->setVersionsPanel(panel); return panel; } static QWidget *makeSettingsTab(WebSocketController *ctrl, QWidget *parent) { auto *page = new QWidget(parent); auto *layout = new QVBoxLayout(page); layout->setContentsMargins(2, 2, 2, 2); auto *tree = new SettingsTree(page); auto *ph = new QTreeWidgetItem(tree); ph->setText(0, "Connect to load settings..."); layout->addWidget(tree, 1); ctrl->setSettingsTree(tree); return page; } static QWidget *makeManualTab(WebSocketController *ctrl, QWidget *parent) { auto *page = new QWidget(parent); auto *layout = new QVBoxLayout(page); auto *row = new QHBoxLayout(); auto *cmdEdit = new QLineEdit(page); cmdEdit->setPlaceholderText("Enter command to send..."); auto *sendBtn = new QPushButton("Send", page); auto *clearBtn = new QPushButton("Clear", page); row->addWidget(new QLabel("Command:", page)); row->addWidget(cmdEdit, 1); row->addWidget(sendBtn); row->addWidget(clearBtn); auto *log = new QTextEdit(page); log->setReadOnly(true); layout->addLayout(row); layout->addWidget(log, 1); ctrl->addLogView(log); auto send = [cmdEdit, ctrl]() { const QString cmd = cmdEdit->text().trimmed(); if (!cmd.isEmpty()) { ctrl->sendCommand(cmd); cmdEdit->clear(); } }; QObject::connect(sendBtn, &QPushButton::clicked, page, send); QObject::connect(cmdEdit, &QLineEdit::returnPressed, page, send); QObject::connect(clearBtn, &QPushButton::clicked, log, &QTextEdit::clear); return page; } static QWidget *makePowerTab(WebSocketController *ctrl, QWidget *parent) { auto *panel = new PowerPanel(parent); ctrl->setPowerPanel(panel); return panel; } static QWidget *makeLogsTab(WebSocketController *ctrl, QWidget *parent) { auto *panel = new LogPanel(ctrl, parent); ctrl->setLogPanel(panel); return panel; } static QWidget *makePanelsTab(WebSocketController *ctrl, QWidget *parent) { auto *page = new QWidget(parent); auto *layout = new QVBoxLayout(page); auto *log = new QTextEdit(page); log->setReadOnly(true); layout->addWidget(log, 1); ctrl->addLogView(log); return page; } int main(int argc, char *argv[]) { QApplication app(argc, argv); QWidget window; window.setWindowTitle("ESA WebSocket Client"); auto *mainLayout = new QVBoxLayout(&window); mainLayout->setContentsMargins(6, 6, 6, 6); mainLayout->setSpacing(4); // --- Header bar --- auto *headerRow = new QHBoxLayout(); auto *urlEdit = new QLineEdit(&window); urlEdit->setPlaceholderText("ws://127.0.0.1:3491/"); urlEdit->setText("ws://127.0.0.1:3491/"); auto *connectBtn = new QPushButton("Connect", &window); auto *disconnectBtn = new QPushButton("Disconnect", &window); auto *shutdownBtn = new QPushButton("Shutdown", &window); disconnectBtn->setEnabled(false); shutdownBtn->setEnabled(false); shutdownBtn->setStyleSheet( "QPushButton { color: white; background-color: #c62828;" " border-radius: 4px; padding: 3px 10px; }" "QPushButton:hover { background-color: #b71c1c; }" "QPushButton:disabled { background-color: #888888; color: #cccccc; }"); auto *statusLabel = new QLabel("Disconnected", &window); headerRow->addWidget(new QLabel("WebSocket URL:", &window)); headerRow->addWidget(urlEdit, 1); headerRow->addWidget(connectBtn); headerRow->addWidget(disconnectBtn); headerRow->addWidget(shutdownBtn); headerRow->addWidget(statusLabel); mainLayout->addLayout(headerRow); // --- Controller --- auto *ctrl = new WebSocketController(urlEdit, statusLabel, &window); // --- Tabs --- auto *tabs = new QTabWidget(&window); tabs->addTab(makeGamesTab (ctrl, &window), "games"); tabs->addTab(makeVersionsTab(ctrl, &window), "versions"); tabs->addTab(makeManualTab (ctrl, &window), "manual"); tabs->addTab(makeSettingsTab(ctrl, &window), "settings"); tabs->addTab(makePowerTab (ctrl, &window), "power"); tabs->addTab(makeLogsTab (ctrl, &window), "logs"); tabs->addTab(makePanelsTab (ctrl, &window), "panels"); mainLayout->addWidget(tabs, 1); // --- Shutdown: confirm then send --- QObject::connect(shutdownBtn, &QPushButton::clicked, &window, [ctrl, &window]() { QMessageBox msgBox(&window); msgBox.setWindowTitle("Confirm Shutdown"); msgBox.setText("Are you sure you want to shut down the machine?"); msgBox.setInformativeText("This will send the POW ShutDown command immediately."); msgBox.setIcon(QMessageBox::Warning); msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::Cancel); msgBox.setDefaultButton(QMessageBox::Cancel); if (msgBox.exec() == QMessageBox::Yes) ctrl->sendCommand(QStringLiteral("POW ShutDown")); }); // --- Wire up buttons --- QObject::connect(connectBtn, &QPushButton::clicked, ctrl, &WebSocketController::startConnection); QObject::connect(disconnectBtn, &QPushButton::clicked, ctrl, &WebSocketController::closeConnection); QObject::connect(ctrl->socket(), &QWebSocket::connected, ctrl, &WebSocketController::onConnected); QObject::connect(ctrl->socket(), &QWebSocket::disconnected, ctrl, &WebSocketController::onDisconnected); QObject::connect(ctrl->socket(), &QWebSocket::textMessageReceived, ctrl, &WebSocketController::onTextMessageReceived); QObject::connect(ctrl->socket(), &QWebSocket::errorOccurred, ctrl, &WebSocketController::onErrorOccurred); QObject::connect(ctrl->socket(), &QWebSocket::connected, &window, [connectBtn, disconnectBtn, shutdownBtn]() { connectBtn->setEnabled(false); disconnectBtn->setEnabled(true); shutdownBtn->setEnabled(true); }); QObject::connect(ctrl->socket(), &QWebSocket::disconnected, &window, [connectBtn, disconnectBtn, shutdownBtn]() { connectBtn->setEnabled(true); disconnectBtn->setEnabled(false); shutdownBtn->setEnabled(false); }); window.resize(1050, 620); window.show(); return app.exec(); }