Added games picker and play/stop buttons
This commit is contained in:
@@ -9,7 +9,9 @@
|
||||
#include <QVBoxLayout>
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Helper: parse "GAM <cmd> CODE1Name1 CODE2Name2 ..." → name->code map
|
||||
// Helper: parse "GAM <subCmd> XXXXNAME1 XXXXNAME2 ..."
|
||||
// Code is always the first 4 characters; remainder is the display name.
|
||||
// "_S" sequences in the name are replaced with spaces.
|
||||
// ---------------------------------------------------------------------------
|
||||
static QMap<QString,QString> parseGamResponse(const QString &response,
|
||||
const QString &subCmd)
|
||||
@@ -20,15 +22,11 @@ static QMap<QString,QString> parseGamResponse(const QString &response,
|
||||
return result;
|
||||
|
||||
for (const QString &entry : tokens.mid(2)) {
|
||||
if (entry.isEmpty()) continue;
|
||||
// First up-to-4 uppercase chars = code, remainder = name
|
||||
int splitPos = 0;
|
||||
while (splitPos < entry.size() && entry[splitPos].isUpper())
|
||||
++splitPos;
|
||||
const QString code = entry.left(qMin(splitPos, 4));
|
||||
QString name = entry.mid(code.size());
|
||||
if (entry.size() < 5) continue; // need at least 4-char code + 1-char name
|
||||
const QString code = entry.left(4);
|
||||
QString name = entry.mid(4);
|
||||
name.replace("_S", " ");
|
||||
if (code.isEmpty() || name.isEmpty()) continue;
|
||||
if (name.isEmpty()) continue;
|
||||
result[name] = code;
|
||||
}
|
||||
return result;
|
||||
@@ -44,7 +42,7 @@ GamesPanel::GamesPanel(QWidget *parent) : QWidget(parent)
|
||||
|
||||
auto *splitter = new QSplitter(Qt::Horizontal, this);
|
||||
|
||||
// ---- Left pane: Available (not installed) games ----
|
||||
// ---- Left pane: Available (not yet installed) games ----
|
||||
auto *leftWidget = new QWidget(splitter);
|
||||
auto *leftLayout = new QVBoxLayout(leftWidget);
|
||||
leftLayout->setContentsMargins(4, 4, 4, 4);
|
||||
@@ -61,7 +59,7 @@ GamesPanel::GamesPanel(QWidget *parent) : QWidget(parent)
|
||||
leftLayout->addWidget(m_availableList, 1);
|
||||
leftLayout->addWidget(m_addBtn);
|
||||
|
||||
// ---- Right pane: Installed games ----
|
||||
// ---- Right pane: Installed games + Start/Stop ----
|
||||
auto *rightWidget = new QWidget(splitter);
|
||||
auto *rightLayout = new QVBoxLayout(rightWidget);
|
||||
rightLayout->setContentsMargins(4, 4, 4, 4);
|
||||
@@ -72,8 +70,27 @@ GamesPanel::GamesPanel(QWidget *parent) : QWidget(parent)
|
||||
m_installedList = new QListWidget(rightWidget);
|
||||
m_installedList->addItem("Connect to load installed games...");
|
||||
|
||||
// Start / Stop button row
|
||||
auto *btnRow = new QHBoxLayout();
|
||||
m_startBtn = new QPushButton("▶ Start Game", rightWidget);
|
||||
m_stopBtn = new QPushButton("■ Stop Game", rightWidget);
|
||||
m_startBtn->setEnabled(false);
|
||||
m_startBtn->setStyleSheet(
|
||||
"QPushButton { color: white; background-color: #2e7d32;"
|
||||
" border-radius: 4px; padding: 3px 10px; }"
|
||||
"QPushButton:hover { background-color: #1b5e20; }"
|
||||
"QPushButton:disabled { background-color: #888; color: #ccc; }");
|
||||
m_stopBtn->setStyleSheet(
|
||||
"QPushButton { color: white; background-color: #c62828;"
|
||||
" border-radius: 4px; padding: 3px 10px; }"
|
||||
"QPushButton:hover { background-color: #b71c1c; }");
|
||||
btnRow->addWidget(m_startBtn);
|
||||
btnRow->addWidget(m_stopBtn);
|
||||
btnRow->addStretch(1);
|
||||
|
||||
rightLayout->addWidget(instLabel);
|
||||
rightLayout->addWidget(m_installedList, 1);
|
||||
rightLayout->addLayout(btnRow);
|
||||
|
||||
splitter->addWidget(leftWidget);
|
||||
splitter->addWidget(rightWidget);
|
||||
@@ -83,10 +100,18 @@ GamesPanel::GamesPanel(QWidget *parent) : QWidget(parent)
|
||||
|
||||
layout->addWidget(splitter);
|
||||
|
||||
// Enable Add button only when something is selected in available list
|
||||
// Enable Add only when available list has selection
|
||||
connect(m_availableList, &QListWidget::currentRowChanged, this,
|
||||
[this](int row) { m_addBtn->setEnabled(row >= 0); });
|
||||
|
||||
// Enable Start only when installed list has selection
|
||||
connect(m_installedList, &QListWidget::currentRowChanged, this,
|
||||
[this](int row) { m_startBtn->setEnabled(row >= 0); });
|
||||
|
||||
connect(m_addBtn, &QPushButton::clicked, this, &GamesPanel::onAddClicked);
|
||||
connect(m_startBtn, &QPushButton::clicked, this, &GamesPanel::onStartClicked);
|
||||
connect(m_stopBtn, &QPushButton::clicked, this,
|
||||
[this]() { emit commandRequested(QStringLiteral("GST")); });
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
@@ -98,11 +123,12 @@ void GamesPanel::loadFromResponse(const QString &response)
|
||||
m_installedList->clear();
|
||||
for (const QString &name : m_installedGames.keys())
|
||||
m_installedList->addItem(name);
|
||||
m_startBtn->setEnabled(false);
|
||||
rebuildAvailable();
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Load all available games (GAM listall response)
|
||||
// Load full catalogue (GAM listall response)
|
||||
// ---------------------------------------------------------------------------
|
||||
void GamesPanel::loadAllFromResponse(const QString &response)
|
||||
{
|
||||
@@ -111,7 +137,7 @@ void GamesPanel::loadAllFromResponse(const QString &response)
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Rebuild available list = allGames minus installedGames (by code)
|
||||
// Rebuild available list = allGames minus installedGames (matched by code)
|
||||
// ---------------------------------------------------------------------------
|
||||
void GamesPanel::rebuildAvailable()
|
||||
{
|
||||
@@ -128,7 +154,7 @@ void GamesPanel::rebuildAvailable()
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Add button clicked → emit GAM add <code>
|
||||
// Add selected available game to installed list
|
||||
// ---------------------------------------------------------------------------
|
||||
void GamesPanel::onAddClicked()
|
||||
{
|
||||
@@ -138,3 +164,15 @@ void GamesPanel::onAddClicked()
|
||||
if (!m_allGames.contains(name)) return;
|
||||
emit commandRequested(QString("GAM add %1").arg(m_allGames[name]));
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Start selected installed game: GST <code> ,p
|
||||
// ---------------------------------------------------------------------------
|
||||
void GamesPanel::onStartClicked()
|
||||
{
|
||||
auto *item = m_installedList->currentItem();
|
||||
if (!item) return;
|
||||
const QString name = item->text();
|
||||
if (!m_installedGames.contains(name)) return;
|
||||
emit commandRequested(QString("GST %1 ,p").arg(m_installedGames[name]));
|
||||
}
|
||||
|
||||
10
GamesPanel.h
10
GamesPanel.h
@@ -13,21 +13,27 @@ class GamesPanel : public QWidget
|
||||
public:
|
||||
explicit GamesPanel(QWidget *parent = nullptr);
|
||||
void loadFromResponse(const QString &response); // GAM list (installed)
|
||||
void loadAllFromResponse(const QString &response); // GAM listall (all available)
|
||||
void loadAllFromResponse(const QString &response); // GAM listall (full catalogue)
|
||||
|
||||
signals:
|
||||
void commandRequested(const QString &cmd);
|
||||
|
||||
private slots:
|
||||
void onAddClicked();
|
||||
void onStartClicked();
|
||||
|
||||
private:
|
||||
void rebuildAvailable();
|
||||
|
||||
// Left pane
|
||||
QListWidget *m_availableList = nullptr;
|
||||
QListWidget *m_installedList = nullptr;
|
||||
QPushButton *m_addBtn = nullptr;
|
||||
|
||||
// Right pane
|
||||
QListWidget *m_installedList = nullptr;
|
||||
QPushButton *m_startBtn = nullptr;
|
||||
QPushButton *m_stopBtn = nullptr;
|
||||
|
||||
QMap<QString,QString> m_allGames; // name -> code (GAM listall)
|
||||
QMap<QString,QString> m_installedGames; // name -> code (GAM list)
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user