aboutsummaryrefslogtreecommitdiff
path: root/qt-widgets/solvercfgwidget.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'qt-widgets/solvercfgwidget.cpp')
-rw-r--r--qt-widgets/solvercfgwidget.cpp90
1 files changed, 90 insertions, 0 deletions
diff --git a/qt-widgets/solvercfgwidget.cpp b/qt-widgets/solvercfgwidget.cpp
new file mode 100644
index 0000000..8027fe5
--- /dev/null
+++ b/qt-widgets/solvercfgwidget.cpp
@@ -0,0 +1,90 @@
1#include "solvercfgwidget.h"
2#include "./ui_solvercfgwidget.h"
3
4enum class ScrambleState { empty, valid, invalid };
5
6ScrambleState getScrambleState(const std::string&);
7
8SolverCfgWidget::SolverCfgWidget(QWidget *parent)
9 : QWidget(parent), ui(new Ui::SolverCfgWidget)
10{
11 ui->setupUi(this);
12 onScrambleChanged(ui->scrambleEditor->text());
13
14 nmovesValidator = new QIntValidator(0, 20, this);
15 ui->minMovesEditor->setValidator(nmovesValidator);
16 ui->maxMovesEditor->setValidator(nmovesValidator);
17
18 QObject::connect(ui->scrambleEditor,
19 SIGNAL(textChanged(const QString&)), this,
20 SLOT(onScrambleChanged(const QString&)));
21 QObject::connect(ui->scrambleEditor, SIGNAL(returnPressed()),
22 this, SLOT(onScrambleSubmitted()));
23 QObject::connect(ui->solveButton, SIGNAL(clicked()),
24 this, SLOT(onScrambleSubmitted()));
25}
26
27SolverCfgWidget::~SolverCfgWidget()
28{
29 delete nmovesValidator;
30 delete ui;
31}
32
33void SolverCfgWidget::lockSubmit()
34{
35 submitLocked = true;
36 onScrambleChanged(ui->scrambleEditor->text());
37}
38
39void SolverCfgWidget::unlockSubmit()
40{
41 submitLocked = false;
42 onScrambleChanged(ui->scrambleEditor->text());
43}
44
45void SolverCfgWidget::onScrambleChanged(const QString& text)
46{
47 auto scrambleState = getScrambleState(text.toStdString());
48 switch (scrambleState) {
49 case ScrambleState::empty:
50 ui->solveButton->setEnabled(false);
51 ui->scrambleEditor->setStyleSheet("");
52 break;
53 case ScrambleState::valid:
54 ui->solveButton->setEnabled(!submitLocked);
55 ui->scrambleEditor->setStyleSheet("");
56 break;
57 case ScrambleState::invalid:
58 ui->solveButton->setEnabled(false);
59 ui->scrambleEditor->setStyleSheet("border : 2px solid red");
60 break;
61 }
62}
63
64void SolverCfgWidget::onScrambleSubmitted()
65{
66 std::string scramble = ui->scrambleEditor->text().toStdString();
67 auto state = getScrambleState(scramble);
68 if (state != ScrambleState::valid)
69 return;
70
71 SolverConfiguration sc {
72 .cube = std::get<nissy::cube_t>(nissy::applymoves(
73 nissy::cube::SOLVED, nissy::moves_t{scramble})),
74 .minmoves = ui->minMovesEditor->text().toUInt(),
75 .maxmoves = ui->maxMovesEditor->text().toUInt(),
76 };
77 emit solveRequest(sc);
78}
79
80ScrambleState getScrambleState(const std::string& s)
81{
82 if (std::all_of(s.begin(), s.end(),
83 [](std::string::value_type c){ return std::isspace(c); }))
84 return ScrambleState::empty;
85
86 auto c = nissy::applymoves(nissy::cube::SOLVED, nissy::moves_t{s});
87 return std::holds_alternative<nissy::error_t>(c) ?
88 ScrambleState::invalid : ScrambleState::valid;
89}
90

Generated with cgit - Back to sebastiano.tronto.net