-
Notifications
You must be signed in to change notification settings - Fork 0
/
mainWindow.py
138 lines (119 loc) · 4.74 KB
/
mainWindow.py
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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
import sys
from PyQt5 import QtWidgets, QtCore, QtGui, Qt
from src.widgets.puzzleWidget import PuzzleWidget
from src.algorithms.sudokuTemplate import SudokuSolverOne, SudokuSolverTwo
#from src.algorithms.saveStrategy import ComplicatedSaver, SimpleSaver
from src.algorithms.fileFactory import FileFactory
class MainWindow(QtWidgets.QWidget):
def __init__(self):
super(MainWindow, self).__init__()
self.fileFactory = FileFactory()
self.setWindowTitle("Sudoku Hero")
self.resize(1000,700)
self.initUI()
def initUI(self):
'''
Set up the controls for the window.
'''
layout = QtWidgets.QVBoxLayout()
hbox = QtWidgets.QHBoxLayout()
vbox2 = QtWidgets.QVBoxLayout()
vbox3 = QtWidgets.QVBoxLayout()
vbox = QtWidgets.QVBoxLayout()
self.btnLoad = QtWidgets.QPushButton("Load Puzzles", self)
self.btnSolve = QtWidgets.QPushButton("Solve", self)
self.btnSave = QtWidgets.QPushButton("Save Result", self)
self.btnSolve.setEnabled(False)
self.btnSave.setEnabled(False)
self.puzzleList = QtWidgets.QListWidget(self)
self.puzzleList.setViewMode(Qt.QListView.IconMode)
self.graphicsView = PuzzleWidget(self)
self.combo = QtWidgets.QComboBox(self)
self.combo.addItem("SudokuSolverOne")
self.combo.addItem("SudokuSolverTwo")
self.comboSave = QtWidgets.QComboBox(self)
self.comboSave.addItem("Joins & Maps")
self.comboSave.addItem("Row-based")
label = QtWidgets.QLabel("Select <i>solving</i> method:", self)
lblSave = QtWidgets.QLabel("Select <i>saving</i> method:", self)
self.puzzleList.setFixedHeight(80)
self.puzzleList.setMinimumWidth(700)
hbox.addWidget(self.puzzleList)
vbox2.addWidget(self.btnLoad)
vbox3.addWidget(label)
vbox3.addWidget(self.combo)
vbox3.addWidget(lblSave)
vbox3.addWidget(self.comboSave)
hbox.addStretch(1)
hbox.addLayout(vbox3)
vbox2.addWidget(self.btnSolve)
vbox2.addWidget(self.btnSave)
vbox.addWidget(self.graphicsView)
vbox.addLayout(hbox)
hbox.addLayout(vbox2)
layout.addLayout(vbox)
self.setLayout(layout)
# Event handlers
self.btnLoad.clicked.connect(self.onClick)
self.btnSolve.clicked.connect(self.onSolve)
self.btnSave.clicked.connect(self.onSave)
self.puzzleList.clicked.connect(self.onPuzzleClick)
def onSolve(self):
'''
Happens when the "Solve" button is clicked.
'''
self.solver.trigger.connect(self.graphicsView.updateCell)
self.solver.finished.connect(self.graphicsView.finished)
self.solver.finished.connect(self.finished)
self.solver.start()
def onSave(self):
'''
Happens when the "Save" button is clicked.
'''
#if str(self.comboSave.currentText()) == "Joins & Maps":
# self.saver = SimpleSaver()
#else:
# self.saver = ComplicatedSaver()
filename = QtWidgets.QFileDialog.getSaveFileName( \
self, 'Save puzzle as...', '', 'Text Files (*.txt)')
#self.saver.savePuzzle(self.solver.puzzle, filename[0])
saveObject = self.fileFactory.saveFile(\
str(self.comboSave.currentText()))
saveObject.savePuzzle(self.solver.puzzle, filename[0])
def onClick(self):
'''
Happens when the "Load Puzzles" button is clicked.
'''
filenames = QtWidgets.QFileDialog.getOpenFileNames( \
self, 'Select puzzles', '', 'Text Files (*.txt)')
print(type(filenames))
for _file in filenames[0]:
listItem = QtWidgets.QListWidgetItem(_file)
self.puzzleList.addItem(listItem)
def onPuzzleClick(self, index):
'''
Happens when a puzzle is selected from the list.
'''
print(index.data())
if str(self.combo.currentText()) == "SudokuSolverOne":
self.solver = SudokuSolverOne()
else:
self.solver = SudokuSolverTwo()
fileObject = self.fileFactory.getFile(index.data())
tup = fileObject.load(index.data())
self.solver.setData(tup)
self.graphicsView.scene.clear()
self.graphicsView.setPuzzle(self.solver.puzzle)
self.btnSolve.setEnabled(True)
self.btnSave.setEnabled(False)
def finished(self, msg):
'''
Happens when a puzzle is finished being solved.
'''
if msg == "SOLVED":
self.btnSave.setEnabled(True)
# Application entry point
app = QtWidgets.QApplication(sys.argv)
w = MainWindow()
w.show()
sys.exit(app.exec_())