diff options
Diffstat (limited to 'qt-widgets/solvercfgwidget.cpp')
| -rw-r--r-- | qt-widgets/solvercfgwidget.cpp | 90 |
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 | |||
| 4 | enum class ScrambleState { empty, valid, invalid }; | ||
| 5 | |||
| 6 | ScrambleState getScrambleState(const std::string&); | ||
| 7 | |||
| 8 | SolverCfgWidget::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 | |||
| 27 | SolverCfgWidget::~SolverCfgWidget() | ||
| 28 | { | ||
| 29 | delete nmovesValidator; | ||
| 30 | delete ui; | ||
| 31 | } | ||
| 32 | |||
| 33 | void SolverCfgWidget::lockSubmit() | ||
| 34 | { | ||
| 35 | submitLocked = true; | ||
| 36 | onScrambleChanged(ui->scrambleEditor->text()); | ||
| 37 | } | ||
| 38 | |||
| 39 | void SolverCfgWidget::unlockSubmit() | ||
| 40 | { | ||
| 41 | submitLocked = false; | ||
| 42 | onScrambleChanged(ui->scrambleEditor->text()); | ||
| 43 | } | ||
| 44 | |||
| 45 | void 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 | |||
| 64 | void 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 | |||
| 80 | ScrambleState 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 | |||
