summaryrefslogtreecommitdiff
path: root/src/solverwindow.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/solverwindow.cc')
-rw-r--r--src/solverwindow.cc118
1 files changed, 67 insertions, 51 deletions
diff --git a/src/solverwindow.cc b/src/solverwindow.cc
index f680c59..a73eb51 100644
--- a/src/solverwindow.cc
+++ b/src/solverwindow.cc
@@ -38,13 +38,13 @@ SolverWindow::SolverWindow()
}
}
-void SolverWindow::loadFromFile(const QString & filename)
+void SolverWindow::openFromFile(const QString & filename)
{
QFile file(filename);
if (!file.open(QFile::ReadOnly | QFile::Text)) {
- QMessageBox::warning(this, tr("Open file"),
- tr("Could not open file %1:\n%2.")
+ QMessageBox::warning(this, tr("Open"),
+ tr("Could not open file \"%1\":\n%2.")
.arg(filename)
.arg(file.errorString()));
return;
@@ -77,8 +77,8 @@ void SolverWindow::saveToFile(const QString & filename)
{
QFile file(filename);
if (!file.open(QFile::WriteOnly | QFile::Text)) {
- QMessageBox::warning(this, tr("Save file"),
- tr("Cannot write file %1:\n%2.")
+ QMessageBox::warning(this, tr("Save"),
+ tr("Could not write to file \"%1\":\n%2.")
.arg(filename)
.arg(file.errorString()));
return;
@@ -116,54 +116,64 @@ void SolverWindow::saveToFile(const QString & filename)
}
-void SolverWindow::load()
+void SolverWindow::doOpen()
{
- QString filename = QFileDialog::getOpenFileName(this, tr("Open..."), HOMEDIR, "Sudoku (*.sudoku)");
+ QString filename = QFileDialog::getOpenFileName(this, tr("Open"), HOMEDIR, "Sudoku (*.sudoku)");
if (!filename.isEmpty()) {
- loadFromFile(filename);
- }
-
- return;
+ openFromFile(filename);
+ }
}
-void SolverWindow::revert()
+void SolverWindow::doRevert()
{
if (!solverwindow_filename.isEmpty()) {
- loadFromFile(solverwindow_filename);
+ QFileInfo fileinfo(solverwindow_filename);
+ if (QMessageBox::warning(this, tr("Revert?"), tr("Revert the state of the game to the previously saved file \"%1\"?").arg(fileinfo.fileName()), QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes) {
+ openFromFile(solverwindow_filename);
+ }
}
}
-void SolverWindow::save()
+void SolverWindow::doSave()
{
if (solverwindow_filename.isEmpty()) {
- saveas();
+ // no file name is set, use the Save As dialog
+ doSaveAs();
} else {
+ // confirm overwriting an existing file
+ QFile file (solverwindow_filename);
+ if (file.exists()) {
+ QFileInfo fileinfo(file);
+ if (QMessageBox::warning(this, tr("Overwrite file?"), tr("The file \"%1\" already exists. Do you wish to overwrite it?").arg(fileinfo.fileName()), QMessageBox::Yes | QMessageBox::No) != QMessageBox::Yes) {
+ return;
+ }
+ }
saveToFile(solverwindow_filename);
+
}
- return;
}
-void SolverWindow::saveas()
+void SolverWindow::doSaveAs()
{
+ // QFileDialog::getSaveFileName() warns about existing files
QString filename = QFileDialog::getSaveFileName(this, tr("Save as..."), HOMEDIR, "Sudoku (*.sudoku)");
+
if (!filename.isEmpty()) {
- solverwindow_filename = filename;
- saveToFile(solverwindow_filename);
+ saveToFile(filename);
}
-
- return;
}
-void SolverWindow::clear()
+void SolverWindow::doNew()
{
- Sudoku sudoku;
- solverwindow_sudokuwidget->set_values(sudoku);
-
- solverwindow_filename.clear();
+ if (QMessageBox::question(this, tr("New"), tr("Start a new game?"), QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes) {
+ Sudoku sudoku;
+ solverwindow_sudokuwidget->set_values(sudoku);
+ solverwindow_filename.clear();
+ }
}
-void SolverWindow::step()
+void SolverWindow::doStep()
{
Sudoku sudoku;
solverwindow_sudokuwidget->get_values(sudoku);
@@ -171,7 +181,7 @@ void SolverWindow::step()
Sudoku solution(sudoku);
int solved = solution.solve_rules();
if (solved == 0) {
- QMessageBox::warning(this, tr("Step"), tr("No cells to solve found"));
+ QMessageBox::warning(this, tr("Step"), tr("No more cells to solve!"));
return;
}
@@ -190,10 +200,9 @@ void SolverWindow::step()
index_current = (index_current + 1) % 81;
} while (index_current != index_start);
-
}
-void SolverWindow::guess()
+void SolverWindow::doGuess()
{
Sudoku sudoku;
solverwindow_sudokuwidget->get_values(sudoku);
@@ -201,7 +210,7 @@ void SolverWindow::guess()
Sudoku solution(sudoku);
int solved = solution.solve_search();
if (solved == 0) {
- QMessageBox::warning(this, tr("Guess"), tr("No cells to solve found"));
+ QMessageBox::warning(this, tr("Guess"), tr("No more cells to solve!"));
return;
}
@@ -220,59 +229,66 @@ void SolverWindow::guess()
index_current = (index_current + 1) % 81;
} while (index_current != index_start);
-
}
-void SolverWindow::solve()
+void SolverWindow::doSolve()
{
- // TODO messagebox, detect invalid and solved states
+ // TODO detect invalid and solved states
Sudoku sudoku;
solverwindow_sudokuwidget->get_values(sudoku);
int solved = sudoku.solve_rules();
sudoku.validate();
solverwindow_sudokuwidget->set_values(sudoku);
- qDebug() << solved << " cells solved";
+
+ if (solved == 0) {
+ QMessageBox::warning(this, tr("Solve rules"), tr("No more cells to solve!"));
+ return;
+ }
}
-void SolverWindow::search()
+void SolverWindow::doSearch()
{
- // TODO messagebox, detect invalid and solved states
+ // TODO detect invalid and solved states
Sudoku sudoku;
solverwindow_sudokuwidget->get_values(sudoku);
int iterations = sudoku.solve_search();
+ sudoku.validate();
solverwindow_sudokuwidget->set_values(sudoku);
- if (iterations > 0) {
- qDebug() << "solved in " << iterations << " iterations";
+
+ if (iterations == 0) {
+ QMessageBox::warning(this, tr("Find solution"), tr("No more cells to solve!"));
+ return;
}
}
-void SolverWindow::step_constraints()
+void SolverWindow::doValidate()
{
Sudoku sudoku;
solverwindow_sudokuwidget->get_values(sudoku);
- int solved = sudoku.solve_constraints();
+
+ bool is_valid = sudoku.validate();
solverwindow_sudokuwidget->set_values(sudoku);
- // qDebug() << solved << " cells solved";
+
+ if (is_valid) {
+ QMessageBox::information(this, tr("Validate"), tr("Sudoku is valid."));
+ } else {
+ QMessageBox::warning(this, tr("Validate"), tr("Sudoku is not valid!"));
+ }
}
-void SolverWindow::step_coverage()
+void SolverWindow::step_constraints()
{
Sudoku sudoku;
solverwindow_sudokuwidget->get_values(sudoku);
- int solved = sudoku.solve_coverage();
+ int solved = sudoku.solve_constraints();
solverwindow_sudokuwidget->set_values(sudoku);
- // qDebug() << solved << " cells solved";
}
-void SolverWindow::validate()
+void SolverWindow::step_coverage()
{
Sudoku sudoku;
solverwindow_sudokuwidget->get_values(sudoku);
- if (sudoku.validate()) {
- QMessageBox::information(this, tr("Validate"), tr("Sudoku is valid."));
- } else {
- QMessageBox::warning(this, tr("Validate"), tr("Sudoku is not valid!"));
- }
+ int solved = sudoku.solve_coverage();
solverwindow_sudokuwidget->set_values(sudoku);
}