127 lines
2.8 KiB
Java
127 lines
2.8 KiB
Java
package gui.menu;
|
|
|
|
import java.util.Random;
|
|
import java.util.concurrent.CancellationException;
|
|
|
|
import gui.SudokuRenderer;
|
|
import imgui.ImGui;
|
|
import imgui.ImGuiStyle;
|
|
import sudoku.io.SudokuSerializer;
|
|
import sudoku.solver.Solver;
|
|
import sudoku.structure.MultiDoku;
|
|
|
|
public class SudokuView extends BaseView {
|
|
|
|
private final SudokuRenderer sudokuRenderer;
|
|
private Thread resolveThread;
|
|
private final MultiDoku doku;
|
|
private String lastSavePath = null;
|
|
|
|
private boolean resolved = false;
|
|
|
|
public SudokuView(StateMachine stateMachine, MultiDoku doku) {
|
|
super(stateMachine);
|
|
this.doku = doku;
|
|
this.sudokuRenderer = new SudokuRenderer(doku);
|
|
this.sudokuRenderer.onResolve.connect(this::onResolve);
|
|
}
|
|
|
|
private void onResolve() {
|
|
this.resolved = true;
|
|
}
|
|
|
|
private void stopResolve() {
|
|
if (resolveThread != null && resolveThread.isAlive()) {
|
|
resolveThread.interrupt();
|
|
resolveThread = null;
|
|
}
|
|
}
|
|
|
|
boolean centeredButton(String label) {
|
|
ImGuiStyle style = ImGui.getStyle();
|
|
|
|
float size = ImGui.calcTextSizeX(label) + style.getFramePaddingX() * 2.0f;
|
|
float avail = ImGui.getContentRegionAvailX();
|
|
|
|
float off = (avail - size) * 0.5f;
|
|
if (off > 0.0f)
|
|
ImGui.setCursorPosX(ImGui.getCursorPosX() + off);
|
|
|
|
return ImGui.button(label);
|
|
}
|
|
|
|
private void renderCancelButton() {
|
|
boolean wantsToStop = false;
|
|
if (resolveThread != null && resolveThread.isAlive()) {
|
|
// ImGui.endDisabled();
|
|
if (centeredButton("Annuler")) {
|
|
// we can't stop the Thread right now
|
|
wantsToStop = true;
|
|
}
|
|
}
|
|
if (resolveThread != null && !resolveThread.isAlive()) {
|
|
resolveThread.start();
|
|
}
|
|
if (wantsToStop)
|
|
stopResolve();
|
|
}
|
|
|
|
private void renderSolveButton() {
|
|
if (resolveThread != null)
|
|
ImGui.beginDisabled();
|
|
|
|
boolean beginSolve = false;
|
|
|
|
if (!resolved && centeredButton("Résoudre")) {
|
|
beginSolve = true;
|
|
}
|
|
if (resolveThread != null)
|
|
ImGui.endDisabled();
|
|
|
|
if (beginSolve) {
|
|
resolveThread = new Thread(() -> {
|
|
try {
|
|
Random rand = new Random();
|
|
Solver.solveRandom(doku, rand);
|
|
Thread.sleep(200);
|
|
} catch (CancellationException | InterruptedException e) {
|
|
System.out.println("The user is bored !");
|
|
}
|
|
stopResolve();
|
|
});
|
|
}
|
|
|
|
if (resolved) {
|
|
ImGui.text("Bravo !");
|
|
}
|
|
}
|
|
|
|
private void renderSaveButton() {
|
|
if (ImGui.button("Sauvegarder l'état de la grille")) {
|
|
lastSavePath = SudokuSerializer.saveMultiDoku(doku);
|
|
ImGui.openPopup("saveDone");
|
|
}
|
|
if (ImGui.beginPopup("saveDone")) {
|
|
ImGui.text("Sudoku sauvegardé dans ");
|
|
ImGui.text(lastSavePath);
|
|
ImGui.endPopup();
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void render() {
|
|
sudokuRenderer.render();
|
|
renderSolveButton();
|
|
renderSaveButton();
|
|
renderCancelButton();
|
|
renderReturnButton();
|
|
}
|
|
|
|
@Override
|
|
public void closeMenu() {
|
|
super.closeMenu();
|
|
stopResolve();
|
|
}
|
|
|
|
}
|