#include "LogPanel.h" #include "WebSocketController.h" #include #include #include #include #include #include static const QStringList k_logNames = { "Wireless", "DataBase", "GenericControllers", "ControlPanelRxBusy", "ErrorChecker", "Main", "PowerControl", "Radar", "LogSerial", "GameEventHandler", "GameScript", "userList", "SecondarySystems", "Sounds", "Games", "SecureSocketComms", "CurrentLimit", "TimerDisplay", "Wall:Controlmessages", "PowerOffTimer", "LogMaster", "Wall:Sensingsystem", "Globals", "GameTimer", "Nfc", "ControlPanelTx", "Targetsystem", "GameBase", "LogSyncMessages", "MasterController", "Wall:Buttons", "ControlPanelRx", "PowerStateChange", "SecureSocket", "Authentication", "UplinkComms", "Resources", "GameCounter", "StripInterface", "Uplink", "Wall:Datarequests", "Wirelesswall", "BeamBreakers", "WebSocketServer", "Wall:Targetdrawing", "LoopTestMessages", "Gps", "LoopMessages", "NfcRemote", "LogLoopErrors" }; LogPanel::LogPanel(WebSocketController *ctrl, QWidget *parent) : QWidget(parent), m_ctrl(ctrl) { auto *outer = new QVBoxLayout(this); outer->setContentsMargins(6, 6, 6, 6); outer->setSpacing(6); auto *toolbar = new QHBoxLayout(); auto *refreshBtn = new QPushButton("Refresh", this); auto *allOnBtn = new QPushButton("All On", this); auto *allOffBtn = new QPushButton("All Off", this); toolbar->addWidget(refreshBtn); toolbar->addWidget(allOnBtn); toolbar->addWidget(allOffBtn); toolbar->addStretch(1); outer->addLayout(toolbar); auto *scroll = new QScrollArea(this); scroll->setWidgetResizable(true); auto *inner = new QWidget(scroll); auto *grid = new QGridLayout(inner); grid->setSpacing(4); grid->setContentsMargins(4, 4, 4, 4); const int cols = 4; for (int i = 0; i < k_logNames.size(); ++i) { const QString &name = k_logNames[i]; auto *cb = new QCheckBox(name, inner); m_checkboxes[name] = cb; grid->addWidget(cb, i / cols, i % cols); connect(cb, &QCheckBox::toggled, this, [this, name](bool checked) { onCheckboxToggled(name, checked); }); } scroll->setWidget(inner); outer->addWidget(scroll, 1); connect(refreshBtn, &QPushButton::clicked, this, &LogPanel::requestRefresh); connect(allOnBtn, &QPushButton::clicked, this, [this]() { for (auto *cb : m_checkboxes) cb->setChecked(true); }); connect(allOffBtn, &QPushButton::clicked, this, [this]() { for (auto *cb : m_checkboxes) cb->setChecked(false); }); } void LogPanel::requestRefresh() { if (m_ctrl) m_ctrl->sendCommand(QStringLiteral("LOG")); } void LogPanel::onCheckboxToggled(const QString &name, bool checked) { if (!m_ctrl) return; const QString state = checked ? "on" : "off"; m_ctrl->sendCommand(QString("LOG %1=%2").arg(name, state)); m_ctrl->sendCommand(QStringLiteral("LOG")); } void LogPanel::applyLogResponse(const QString &msg) { for (auto *cb : m_checkboxes) cb->blockSignals(true); for (auto *cb : m_checkboxes) cb->setChecked(false); const QStringList tokens = msg.split(' ', Qt::SkipEmptyParts); for (int i = 1; i < tokens.size(); ++i) { const QString &tok = tokens[i]; const bool isOn = tok.endsWith('*'); const QString name = isOn ? tok.chopped(1) : tok; if (m_checkboxes.contains(name)) m_checkboxes[name]->setChecked(isOn); } for (auto *cb : m_checkboxes) cb->blockSignals(false); }