First Commit

This commit is contained in:
xiaolinquan committed 2026-11-06 01:04:35 +08:00
commit 3796ec5cd2
146 files changed
+4825

No files matched your search

+121
View File
@@ -0,0 +1,121 @@
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QApplication>
#include <QClipboard>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent), ui(new Ui::MainWindow)
{
ui->setupUi(this);
ui->groupModeCombo->addItems({tr("每组最多人数"), tr("分成几组")});
connect(ui->namesEdit, &QPlainTextEdit::textChanged, this, &MainWindow::markDirty);
connect(ui->applyButton, &QPushButton::clicked, this, &MainWindow::applyNames);
connect(ui->sampleButton, &QPushButton::clicked, this, [this] {
ui->namesEdit->setPlainText(QStringLiteral(
"01 陈晨\n02 林悦\n03 王宁\n04 李然\n05 周航\n06 赵晴\n"
"07 孙瑞\n08 吴桐\n09 郑宇\n10 许诺\n11 何欣\n12 方舟"));
});
connect(ui->drawButton, &QPushButton::clicked, this, &MainWindow::drawNames);
connect(ui->groupsButton, &QPushButton::clicked, this, &MainWindow::makeGroups);
connect(ui->resetButton, &QPushButton::clicked, this, [this] {
m_session.resetDraw();
m_round = 0;
ui->historyList->clear();
ui->chosenEdit->clear();
ui->statusLabel->setText(tr("抽签已重置,所有人重新进入候选池。"));
refreshControls();
});
connect(ui->copyGroupsButton, &QPushButton::clicked, this, [this] {
QApplication::clipboard()->setText(ui->groupsEdit->toPlainText());
ui->statusLabel->setText(tr("分组结果已复制。"));
});
connect(ui->groupModeCombo, static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged),
this, [this] { ui->groupsEdit->clear(); ui->copyGroupsButton->setEnabled(false); });
connect(ui->groupValueSpin, static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged),
this, [this] { ui->groupsEdit->clear(); ui->copyGroupsButton->setEnabled(false); });
ui->sampleButton->click();
}
MainWindow::~MainWindow() { delete ui; }
void MainWindow::markDirty()
{
m_dirty = true;
// 名单有改动时清除旧展示,避免把旧名单的结果当成新名单的结果。
ui->chosenEdit->clear();
ui->historyList->clear();
ui->groupsEdit->clear();
ui->copyGroupsButton->setEnabled(false);
ui->statusLabel->setText(tr("名单尚未应用。检查后点击“应用名单”开始新一轮。"));
refreshControls();
}
void MainWindow::applyNames()
{
const auto parsed = Roster::parse(ui->namesEdit->toPlainText());
if (!parsed.ok()) {
ui->statusLabel->setText(parsed.error);
return;
}
m_session.setNames(parsed.names);
m_dirty = false;
m_round = 0;
ui->historyList->clear();
ui->chosenEdit->clear();
ui->groupsEdit->clear();
ui->copyGroupsButton->setEnabled(false);
ui->statusLabel->setText(tr("已应用 %1 人。抽签与分组现在使用这份名单。").arg(parsed.names.size()));
refreshControls();
}
void MainWindow::refreshControls()
{
const int remaining = m_session.remainingCount();
ui->drawButton->setEnabled(!m_dirty && remaining > 0);
ui->resetButton->setEnabled(!m_dirty);
ui->groupsButton->setEnabled(!m_dirty && !m_session.names().isEmpty());
ui->drawCountSpin->setEnabled(!m_dirty && remaining > 0);
ui->drawCountSpin->setMaximum(qMax(1, remaining));
ui->countLabel->setText(m_dirty ? tr("名单待应用")
: tr("名单 %1 人 · 尚未抽到 %2 人").arg(m_session.names().size()).arg(remaining));
}
void MainWindow::drawNames()
{
if (m_dirty) return;
const QStringList selected = m_session.draw(ui->drawCountSpin->value(),
*QRandomGenerator::global());
if (selected.isEmpty()) return;
++m_round;
ui->chosenEdit->setPlainText(selected.join(QStringLiteral("\n")));
ui->historyList->addItem(tr("第 %1 次:%2").arg(m_round).arg(selected.join(QStringLiteral("、"))));
ui->historyList->scrollToBottom();
ui->statusLabel->setText(m_session.remainingCount() == 0
? tr("所有人都已抽到。点击“重置抽签”可以开始下一轮。")
: tr("本次抽取 %1 人,已从候选池中移除。").arg(selected.size()));
refreshControls();
}
void MainWindow::makeGroups()
{
if (m_dirty) return;
const auto groups = m_session.groups(ui->groupValueSpin->value(),
ui->groupModeCombo->currentIndex() == 1, *QRandomGenerator::global());
if (groups.isEmpty()) {
ui->groupsEdit->clear();
ui->copyGroupsButton->setEnabled(false);
ui->statusLabel->setText(tr("组数不能超过名单人数,请调整后再分组。"));
return;
}
QStringList lines;
for (int i = 0; i < groups.size(); ++i) {
lines.append(tr("第 %1 组(%2 人)").arg(i + 1).arg(groups.at(i).size()));
lines.append(groups.at(i).join(QStringLiteral("、")));
lines.append(QString());
}
ui->groupsEdit->setPlainText(lines.join(QStringLiteral("\n")));
ui->copyGroupsButton->setEnabled(true);
ui->statusLabel->setText(tr("已将全部 %1 人分为 %2 组,每人出现一次,各组人数最多相差 1。")
.arg(m_session.names().size()).arg(groups.size()));
}