From 97b5778172572504c8dfbe173b18281e786270c0 Mon Sep 17 00:00:00 2001 From: Sebastiano Tronto Date: Fri, 25 Apr 2025 16:18:26 +0200 Subject: Initial commit --- qt-widgets/solvercfgwidget.cpp | 90 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 qt-widgets/solvercfgwidget.cpp (limited to 'qt-widgets/solvercfgwidget.cpp') 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 @@ +#include "solvercfgwidget.h" +#include "./ui_solvercfgwidget.h" + +enum class ScrambleState { empty, valid, invalid }; + +ScrambleState getScrambleState(const std::string&); + +SolverCfgWidget::SolverCfgWidget(QWidget *parent) + : QWidget(parent), ui(new Ui::SolverCfgWidget) +{ + ui->setupUi(this); + onScrambleChanged(ui->scrambleEditor->text()); + + nmovesValidator = new QIntValidator(0, 20, this); + ui->minMovesEditor->setValidator(nmovesValidator); + ui->maxMovesEditor->setValidator(nmovesValidator); + + QObject::connect(ui->scrambleEditor, + SIGNAL(textChanged(const QString&)), this, + SLOT(onScrambleChanged(const QString&))); + QObject::connect(ui->scrambleEditor, SIGNAL(returnPressed()), + this, SLOT(onScrambleSubmitted())); + QObject::connect(ui->solveButton, SIGNAL(clicked()), + this, SLOT(onScrambleSubmitted())); +} + +SolverCfgWidget::~SolverCfgWidget() +{ + delete nmovesValidator; + delete ui; +} + +void SolverCfgWidget::lockSubmit() +{ + submitLocked = true; + onScrambleChanged(ui->scrambleEditor->text()); +} + +void SolverCfgWidget::unlockSubmit() +{ + submitLocked = false; + onScrambleChanged(ui->scrambleEditor->text()); +} + +void SolverCfgWidget::onScrambleChanged(const QString& text) +{ + auto scrambleState = getScrambleState(text.toStdString()); + switch (scrambleState) { + case ScrambleState::empty: + ui->solveButton->setEnabled(false); + ui->scrambleEditor->setStyleSheet(""); + break; + case ScrambleState::valid: + ui->solveButton->setEnabled(!submitLocked); + ui->scrambleEditor->setStyleSheet(""); + break; + case ScrambleState::invalid: + ui->solveButton->setEnabled(false); + ui->scrambleEditor->setStyleSheet("border : 2px solid red"); + break; + } +} + +void SolverCfgWidget::onScrambleSubmitted() +{ + std::string scramble = ui->scrambleEditor->text().toStdString(); + auto state = getScrambleState(scramble); + if (state != ScrambleState::valid) + return; + + SolverConfiguration sc { + .cube = std::get(nissy::applymoves( + nissy::cube::SOLVED, nissy::moves_t{scramble})), + .minmoves = ui->minMovesEditor->text().toUInt(), + .maxmoves = ui->maxMovesEditor->text().toUInt(), + }; + emit solveRequest(sc); +} + +ScrambleState getScrambleState(const std::string& s) +{ + if (std::all_of(s.begin(), s.end(), + [](std::string::value_type c){ return std::isspace(c); })) + return ScrambleState::empty; + + auto c = nissy::applymoves(nissy::cube::SOLVED, nissy::moves_t{s}); + return std::holds_alternative(c) ? + ScrambleState::invalid : ScrambleState::valid; +} + -- cgit v1.3