package gui; import common.Signal; import imgui.ImGui; import imgui.extension.imguifiledialog.ImGuiFileDialog; import imgui.extension.imguifiledialog.flag.ImGuiFileDialogFlags; import imgui.type.ImInt; import sudoku.structure.Difficulty; import sudoku.structure.MultiDoku; import sudoku.structure.SudokuFactory; public class SudokuSelector { public final Signal onSelect = new Signal(); private MultiDoku doku; private final boolean canGenEmptyGrid; private final ImInt sudokuType = new ImInt(0); private final ImInt difficulty = new ImInt(Difficulty.Medium.ordinal()); private final String[] difficulties; private static final String[] sudokuTypes = { "Carré", "Rectangle", "Multidoku" }; private static final int SQUARE = 0, RECTANGLE = 1, MULTIDOKU = 2; private final ImInt sudokuSize = new ImInt(3); private final ImInt sudokuWidth = new ImInt(3); private final ImInt sudokuHeight = new ImInt(3); public SudokuSelector(boolean canGenEmptyGrid) { this.canGenEmptyGrid = canGenEmptyGrid; Difficulty[] diffs = Difficulty.values(); difficulties = new String[diffs.length]; for (int i = 0; i < diffs.length; i++) { difficulties[i] = diffs[i].getDisplayName(); } } private void selectSudoku(MultiDoku doku, boolean empty) { this.doku = doku; if (!empty) { try { SudokuFactory.fillDoku(doku, Difficulty.values()[difficulty.get()]); } catch (Exception e) { e.printStackTrace(); } } this.onSelect.emit(); } public void renderFileDialog() { if (ImGuiFileDialog.display("browse-sudoku", ImGuiFileDialogFlags.None)) { if (ImGuiFileDialog.isOk()) { var selection = ImGuiFileDialog.getSelection(); for (var entry : selection.entrySet()) { try { String filePath = entry.getValue(); this.doku = SudokuFactory.fromfile(filePath); if (this.doku != null) this.onSelect.emit(); } catch (Exception e) { e.printStackTrace(); } } } ImGuiFileDialog.close(); } } public void render() { ImGui.combo("Type de Sudoku", sudokuType, sudokuTypes); ImGui.combo("Difficulté", difficulty, difficulties); switch (sudokuType.get()) { case SQUARE: ImGui.inputInt("Taille", sudokuSize); if (ImGui.button("Résoudre un sudoku")) { selectSudoku(SudokuFactory.createBasicEmptySquareSudoku(sudokuSize.get()), false); } if (canGenEmptyGrid && ImGui.button("Générer une grille vide")) { selectSudoku(SudokuFactory.createBasicEmptySquareSudoku(sudokuSize.get()), true); } break; case RECTANGLE: ImGui.inputInt("Largeur", sudokuHeight); ImGui.inputInt("Longueur", sudokuWidth); if (ImGui.button("Résoudre un sudoku")) { selectSudoku( SudokuFactory.createBasicEmptyRectangleSudoku(sudokuWidth.get(), sudokuHeight.get()), false); } if (canGenEmptyGrid && ImGui.button("Générer une grille vide")) { selectSudoku( SudokuFactory.createBasicEmptyRectangleSudoku(sudokuWidth.get(), sudokuHeight.get()), true); } break; case MULTIDOKU: ImGui.inputInt("Taille", sudokuSize); if (ImGui.button("Résoudre un sudoku")) { selectSudoku(SudokuFactory.createBasicXShapedMultidoku(sudokuSize.get()), false); } if (canGenEmptyGrid && ImGui.button("Générer une grille vide")) { selectSudoku(SudokuFactory.createBasicXShapedMultidoku(sudokuSize.get()), true); } default: break; } if (ImGui.button("À partir d'un fichier")) { ImGuiFileDialog.openDialog("browse-sudoku", "Choisissez un fichier", ".json", "."); } renderFileDialog(); } public MultiDoku getDoku() { return doku; } }