1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
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::cube_t>(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<nissy::error_t>(c) ?
ScrambleState::invalid : ScrambleState::valid;
}
|