190 lines
6.8 KiB
C++
190 lines
6.8 KiB
C++
#include <QApplication>
|
|
#include <QHBoxLayout>
|
|
#include <QLabel>
|
|
#include <QLineEdit>
|
|
#include <QMessageBox>
|
|
#include <QPushButton>
|
|
#include <QTabWidget>
|
|
#include <QTextEdit>
|
|
#include <QTreeWidgetItem>
|
|
#include <QVBoxLayout>
|
|
#include <QWidget>
|
|
|
|
#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();
|
|
}
|