[Client] Do not preview a randomized turn order

Randomizing is a request to the server, not a local shuffle. Shuffling the
list locally meant the dialog showed an order the server then discarded, and
let the host re-open it until a favourable order appeared. The dialog now
switches to a mode that says the server will randomize and toggles back to the
manual list on request.
This commit is contained in:
Lukas Brübach 2026-11-04 08:58:35 +01:00
parent 9ba1946473
commit e945b73e3a
2 changed files with 31 additions and 15 deletions

View file

@ -2,10 +2,10 @@
#include <QDialogButtonBox> #include <QDialogButtonBox>
#include <QHBoxLayout> #include <QHBoxLayout>
#include <QLabel>
#include <QListWidget> #include <QListWidget>
#include <QListWidgetItem> #include <QListWidgetItem>
#include <QPushButton> #include <QPushButton>
#include <QRandomGenerator>
#include <QVBoxLayout> #include <QVBoxLayout>
DlgTurnOrder::DlgTurnOrder(const QStringList &_playerNames, QWidget *parent) DlgTurnOrder::DlgTurnOrder(const QStringList &_playerNames, QWidget *parent)
@ -23,6 +23,12 @@ DlgTurnOrder::DlgTurnOrder(const QStringList &_playerNames, QWidget *parent)
randomizeButton = new QPushButton(this); randomizeButton = new QPushButton(this);
connect(randomizeButton, &QPushButton::clicked, this, &DlgTurnOrder::actRandomize); connect(randomizeButton, &QPushButton::clicked, this, &DlgTurnOrder::actRandomize);
// Shown in place of the list while the server is asked to randomize: the
// order is chosen server side, so there is nothing to preview here.
hintLabel = new QLabel(this);
hintLabel->setWordWrap(true);
hintLabel->setAlignment(Qt::AlignCenter);
auto *buttonColumn = new QVBoxLayout; auto *buttonColumn = new QVBoxLayout;
buttonColumn->addWidget(moveUpButton); buttonColumn->addWidget(moveUpButton);
buttonColumn->addWidget(moveDownButton); buttonColumn->addWidget(moveDownButton);
@ -31,6 +37,7 @@ DlgTurnOrder::DlgTurnOrder(const QStringList &_playerNames, QWidget *parent)
auto *listLayout = new QHBoxLayout; auto *listLayout = new QHBoxLayout;
listLayout->addWidget(listWidget); listLayout->addWidget(listWidget);
listLayout->addWidget(hintLabel, 1);
listLayout->addLayout(buttonColumn); listLayout->addLayout(buttonColumn);
auto *buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel); auto *buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel);
@ -44,7 +51,7 @@ DlgTurnOrder::DlgTurnOrder(const QStringList &_playerNames, QWidget *parent)
updateButtons(); updateButtons();
retranslateUi(); updateMode();
setMinimumWidth(300); setMinimumWidth(300);
} }
@ -53,7 +60,8 @@ void DlgTurnOrder::retranslateUi()
setWindowTitle(tr("Set turn order")); setWindowTitle(tr("Set turn order"));
moveUpButton->setText(tr("Move up")); moveUpButton->setText(tr("Move up"));
moveDownButton->setText(tr("Move down")); moveDownButton->setText(tr("Move down"));
randomizeButton->setText(tr("Randomize")); randomizeButton->setText(randomizeRequested ? tr("Set order manually") : tr("Randomize"));
hintLabel->setText(tr("The server will randomize the turn order."));
} }
QStringList DlgTurnOrder::order() const QStringList DlgTurnOrder::order() const
@ -76,16 +84,25 @@ void DlgTurnOrder::moveSelected(int delta)
QListWidgetItem *item = listWidget->takeItem(row); QListWidgetItem *item = listWidget->takeItem(row);
listWidget->insertItem(newRow, item); listWidget->insertItem(newRow, item);
listWidget->setCurrentRow(newRow); listWidget->setCurrentRow(newRow);
randomizeRequested = false;
updateButtons(); updateButtons();
} }
void DlgTurnOrder::updateMode()
{
listWidget->setVisible(!randomizeRequested);
hintLabel->setVisible(randomizeRequested);
moveUpButton->setVisible(!randomizeRequested);
moveDownButton->setVisible(!randomizeRequested);
retranslateUi();
}
void DlgTurnOrder::updateButtons() void DlgTurnOrder::updateButtons()
{ {
const int row = listWidget->currentRow(); const int row = listWidget->currentRow();
const int count = listWidget->count(); const int count = listWidget->count();
moveUpButton->setEnabled(row > 0); const bool manualOrder = !randomizeRequested;
moveDownButton->setEnabled(row >= 0 && row < count - 1); moveUpButton->setEnabled(manualOrder && row > 0);
moveDownButton->setEnabled(manualOrder && row >= 0 && row < count - 1);
} }
void DlgTurnOrder::actMoveUp() void DlgTurnOrder::actMoveUp()
@ -100,15 +117,11 @@ void DlgTurnOrder::actMoveDown()
void DlgTurnOrder::actRandomize() void DlgTurnOrder::actRandomize()
{ {
QList<QListWidgetItem *> items; // Randomizing is a request to the server, not a local shuffle: showing a
while (listWidget->count() > 0) { // preview would let the host re-open the dialog until the order looks
items.append(listWidget->takeItem(0)); // favourable for them.
} randomizeRequested = !randomizeRequested;
while (!items.isEmpty()) { updateMode();
const int index = QRandomGenerator::global()->bounded(items.size());
listWidget->addItem(items.takeAt(index));
}
randomizeRequested = true;
updateButtons(); updateButtons();
} }

View file

@ -10,6 +10,7 @@
#include <QDialog> #include <QDialog>
#include <QStringList> #include <QStringList>
class QLabel;
class QListWidget; class QListWidget;
class QPushButton; class QPushButton;
@ -18,12 +19,14 @@ class DlgTurnOrder : public QDialog
Q_OBJECT Q_OBJECT
private: private:
QListWidget *listWidget; QListWidget *listWidget;
QLabel *hintLabel;
QPushButton *moveUpButton; QPushButton *moveUpButton;
QPushButton *moveDownButton; QPushButton *moveDownButton;
QPushButton *randomizeButton; QPushButton *randomizeButton;
bool randomizeRequested; bool randomizeRequested;
void moveSelected(int delta); void moveSelected(int delta);
void updateMode();
void updateButtons(); void updateButtons();
private slots: private slots: