solvercfgwidget.cpp (2504B)
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