diff --git a/src/forms/judgingdialog.ui b/src/forms/judgingdialog.ui index 24489131..f65bfe1a 100755 --- a/src/forms/judgingdialog.ui +++ b/src/forms/judgingdialog.ui @@ -3,7 +3,7 @@ JudgingDialog - Qt::WindowModality::WindowModal + Qt::WindowModality::NonModal diff --git a/src/lemon.cpp b/src/lemon.cpp index 43fb77fe..ba83d1a7 100644 --- a/src/lemon.cpp +++ b/src/lemon.cpp @@ -81,6 +81,8 @@ LemonLime::LemonLime(QWidget *parent) : QMainWindow(parent), ui(new Ui::LemonLim connect(ui->moveDownButton, &QToolButton::clicked, this, &LemonLime::moveDownTask); connect(ui->resultViewer, &ResultViewer::itemSelectionChanged, this, &LemonLime::viewerSelectionChanged); connect(ui->resultViewer, &ResultViewer::contestantDeleted, this, &LemonLime::contestantDeleted); + connect(ui->resultViewer, &ResultViewer::requestEnterJudgeMode, this, &LemonLime::enterJudgeMode); + connect(ui->resultViewer, &ResultViewer::requestLeaveJudgeMode, this, &LemonLime::leaveJudgeMode); connect(ui->newAction, &QAction::triggered, this, &LemonLime::newAction); connect(ui->openAction, &QAction::triggered, this, &LemonLime::loadAction); connect(ui->saveAction, &QAction::triggered, this, &LemonLime::saveAction); @@ -597,6 +599,31 @@ void LemonLime::contestantDeleted() { ui->refreshAction->setEnabled(true); } +// 会锁定若干控件,防止用户操作,并禁止表格选中事件(这样双击时就会直接返回) +void LemonLime::enterJudgeMode() { + ui->tabWidget->tabBar()->setEnabled(false); + ui->cleanupButton->setEnabled(false); + ui->refreshButton->setEnabled(false); + ui->judgeButton->setEnabled(false); + ui->judgeAllButton->setEnabled(false); + ui->judgeUnjudgedButton->setEnabled(false); + ui->resultViewer->clearSelection(); + ui->resultViewer->setSelectionMode(QAbstractItemView::NoSelection); + + menuBar()->setEnabled(false); +} + +void LemonLime::leaveJudgeMode() { + ui->tabWidget->tabBar()->setEnabled(true); + ui->cleanupButton->setEnabled(true); + ui->refreshButton->setEnabled(true); + ui->judgeAllButton->setEnabled(true); + ui->judgeUnjudgedButton->setEnabled(true); + ui->resultViewer->setSelectionMode(QAbstractItemView::ExtendedSelection); + + menuBar()->setEnabled(true); +} + void LemonLime::saveContest(const QString &fileName) { QFile file(fileName); diff --git a/src/lemon.h b/src/lemon.h index 17385bc1..79049c58 100644 --- a/src/lemon.h +++ b/src/lemon.h @@ -65,6 +65,8 @@ class LemonLime : public QMainWindow { void moveDownTask(); void viewerSelectionChanged(); void contestantDeleted(); + void enterJudgeMode(); + void leaveJudgeMode(); void newAction(); void saveAction(); static void openFolderAction(); diff --git a/src/resultviewer.cpp b/src/resultviewer.cpp index c6c160ad..92c5632e 100644 --- a/src/resultviewer.cpp +++ b/src/resultviewer.cpp @@ -96,34 +96,34 @@ void ResultViewer::setContest(Contest *contest) { } void ResultViewer::refreshViewer() { - clear(); - setRowCount(0); - setColumnCount(0); - - if (! curContest) + if (! curContest) { + clear(); + setRowCount(0); + setColumnCount(0); return; + } + clear(); + setSortingEnabled(false); - QStringList headerList; - headerList << tr("Rank") << tr("Name") << tr("Total Score"); - QList taskList = curContest->getTaskList(); Settings setting; curContest->copySettings(setting); ColorTheme colors = setting.getCurrentColorTheme(); - -#if QT_VERSION >= QT_VERSION_CHECK(6, 5, 0) if (QGuiApplication::styleHints()->colorScheme() == Qt::ColorScheme::Dark) { colors.invertLightness(); LOG("Auto dark mode has been set"); } -#endif + + QStringList headerList; + headerList << tr("Rank") << tr("Name") << tr("Total Score"); + QList taskList = curContest->getTaskList(); for (auto &i : taskList) { headerList << i->getProblemTitle(); } - headerList << tr("Total Used Time (s)") << tr("Judging Time"); setColumnCount(taskList.size() + 5); setHorizontalHeaderLabels(headerList); horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents); + QList contestantList = curContest->getContestantList(); QList> sortList; QList fullScore; @@ -158,8 +158,6 @@ void ResultViewer::refreshViewer() { bg = colors.getColorPer(score, fullScore[j]); item(i, j + 3)->setBackground(bg); - - // qDebug() << i << j << bg; } else { item(i, j + 3)->setText(tr("Invalid")); } @@ -213,6 +211,7 @@ void ResultViewer::refreshViewer() { } } + setSortingEnabled(true); sortByColumn(0, Qt::AscendingOrder); } @@ -242,22 +241,24 @@ void ResultViewer::judgeSelected() { } auto *dialog = new JudgingDialog(this); - dialog->setModal(true); + emit requestEnterJudgeMode(); dialog->setContest(curContest); dialog->show(); dialog->judge(judgeList); delete dialog; refreshViewer(); + emit requestLeaveJudgeMode(); } void ResultViewer::judgeAll() { auto *dialog = new JudgingDialog(this); - dialog->setModal(true); + emit requestEnterJudgeMode(); dialog->setContest(curContest); dialog->show(); dialog->judgeAll(); delete dialog; refreshViewer(); + emit requestLeaveJudgeMode(); } void ResultViewer::judgeUnjudged() { @@ -282,12 +283,13 @@ void ResultViewer::judgeUnjudged() { } auto *dialog = new JudgingDialog(this); - dialog->setModal(true); + emit requestEnterJudgeMode(); dialog->setContest(curContest); dialog->show(); dialog->judge(judgeList); delete dialog; refreshViewer(); + emit requestLeaveJudgeMode(); } void ResultViewer::judgeGrey() { @@ -312,12 +314,13 @@ void ResultViewer::judgeGrey() { } auto *dialog = new JudgingDialog(this); - dialog->setModal(true); + emit requestEnterJudgeMode(); dialog->setContest(curContest); dialog->show(); dialog->judge(judgeList); delete dialog; refreshViewer(); + emit requestLeaveJudgeMode(); } void ResultViewer::judgeMagenta() { @@ -345,12 +348,13 @@ void ResultViewer::judgeMagenta() { } auto *dialog = new JudgingDialog(this); - dialog->setModal(true); + emit requestEnterJudgeMode(); dialog->setContest(curContest); dialog->show(); dialog->judge(judgeList); delete dialog; refreshViewer(); + emit requestLeaveJudgeMode(); } void ResultViewer::clearPath(const QString &curDir) { @@ -406,6 +410,8 @@ void ResultViewer::deleteContestant() { void ResultViewer::detailInformation() { QList selectionRange = selectedRanges(); + if (selectionRange.size() == 0) + return; int index = selectionRange[0].topRow(); auto *dialog = new DetailDialog(this); dialog->setModal(true); diff --git a/src/resultviewer.h b/src/resultviewer.h index 3081919c..7065746a 100644 --- a/src/resultviewer.h +++ b/src/resultviewer.h @@ -44,4 +44,6 @@ class ResultViewer : public QTableWidget { signals: void contestantDeleted(); + void requestEnterJudgeMode(); + void requestLeaveJudgeMode(); };