aboutsummaryrefslogtreecommitdiff
path: root/qt-widgets/solvercfgwidget.cpp
blob: 8027fe59f390ffba49d85d8fc2fea58973e2e52f (plain)
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;
}

Generated with cgit - Back to sebastiano.tronto.net