Create dedicated number painter

master
En Yi 2018-07-06 14:34:22 +08:00
parent 2f64fdd209
commit caa3077499
2 changed files with 41 additions and 32 deletions

View File

@ -5,11 +5,10 @@ VALID = 1
INVALID = 2 INVALID = 2
FIXED = 3 FIXED = 3
TESTING = True TESTING = False
if __name__ == "__main__": if __name__ == "__main__":
test_dir = './test_board.txt' test_dir = './test_board.txt'
else: else:
test_dir = './gameplay/test_board.txt' test_dir = './gameplay/test_board.txt'
class SudokuSystem: class SudokuSystem:

View File

@ -45,6 +45,7 @@ class BoxBoard(QGraphicsObject):
if line.length() > 1: if line.length() > 1:
painter.drawLine(line) painter.drawLine(line)
class SudokuGrid(QGraphicsObject): class SudokuGrid(QGraphicsObject):
# Prepare the signal # Prepare the signal
buttonClicked = pyqtSignal(float, float) buttonClicked = pyqtSignal(float, float)
@ -53,10 +54,10 @@ class SudokuGrid(QGraphicsObject):
super().__init__(parent) super().__init__(parent)
self.width = width self.width = width
self.height = height self.height = height
self.default_pen = QPen() self.default_pen = QPen()
self.default_pen.setColor(Qt.white) self.default_pen.setColor(Qt.white)
self.default_pen.setWidth(1) self.default_pen.setWidth(1)
self.thick_pen = QPen() self.thick_pen = QPen()
self.thick_pen.setColor(Qt.white) self.thick_pen.setColor(Qt.white)
self.thick_unit = 5 self.thick_unit = 5
@ -83,6 +84,7 @@ class SudokuGrid(QGraphicsObject):
self.thinlines.append(QLineF(delta_w, 0, delta_w, self.height)) self.thinlines.append(QLineF(delta_w, 0, delta_w, self.height))
self.sudoku_grid = sdk.SudokuSystem() self.sudoku_grid = sdk.SudokuSystem()
self.grid_painter = NumberPainter(self, self.sudoku_grid)
self.mouse_w = 0 self.mouse_w = 0
self.mouse_h = 0 self.mouse_h = 0
@ -97,28 +99,9 @@ class SudokuGrid(QGraphicsObject):
self.selected = False self.selected = False
self.invalid_pen = QPen()
self.invalid_pen.setColor(Qt.lightGray)
self.invalid_unit = 8
self.invalid_pen.setWidth(self.thick_unit)
def replace_cell_number(self, val): def replace_cell_number(self, val):
self.sudoku_grid.replace_cell_number(self.mouse_h, self.mouse_w, val) self.sudoku_grid.replace_cell_number(self.mouse_h, self.mouse_w, val)
self.update() self.grid_painter.update()
def _draw_number_cell(self, w, h, painter):
val = self.sudoku_grid.get_cell_number(h, w)
if val == 0:
val = ''
else:
if self.sudoku_grid.get_cell_status(h, w) == sdk.VALID:
painter.setPen(self.default_pen)
else:
painter.setPen(self.invalid_pen)
painter.drawText((w+0.5)*self.cell_width-5,
(h+0.5)*self.cell_height+5,
str(val))
def boundingRect(self): def boundingRect(self):
return QRectF(-5, -5, self.width+10, self.height+10) return QRectF(-5, -5, self.width+10, self.height+10)
@ -129,10 +112,6 @@ class SudokuGrid(QGraphicsObject):
for line in self.thinlines: for line in self.thinlines:
painter.drawLine(line) painter.drawLine(line)
for i in range(9):
for j in range(9):
self._draw_number_cell(i, j, painter)
painter.setPen(self.thick_pen) painter.setPen(self.thick_pen)
for line in self.thicklines: for line in self.thicklines:
painter.drawLine(line) painter.drawLine(line)
@ -157,12 +136,43 @@ class SudokuGrid(QGraphicsObject):
if not self.sudoku_grid.get_cell_status(self.mouse_h, self.mouse_w) == sdk.FIXED: if not self.sudoku_grid.get_cell_status(self.mouse_h, self.mouse_w) == sdk.FIXED:
self.buttonClicked.emit(w, h) self.buttonClicked.emit(w, h)
class NumberGrid(QGraphicsItem):
def __init__(self, parent): class NumberPainter(QGraphicsItem):
def __init__(self, parent, grid):
super().__init__(parent=parent) super().__init__(parent=parent)
self.parent = parent
self.sudoku_grid = grid
self.default_pen = QPen()
self.default_pen.setColor(Qt.white)
self.default_pen.setWidth(1)
self.invalid_pen = QPen()
self.invalid_pen.setColor(Qt.lightGray)
self.invalid_unit = 8
self.invalid_pen.setWidth(self.invalid_unit)
def paint(self, painter, style, widget=None): def paint(self, painter, style, widget=None):
pass for i in range(9):
for j in range(9):
self._draw_number_cell(i, j, painter)
def boundingRect(self):
return QRectF(-5, -5, self.parent.width+10, self.parent.height+10)
def _draw_number_cell(self, w, h, painter):
val = self.sudoku_grid.get_cell_number(h, w)
if val == 0:
val = ''
else:
if self.sudoku_grid.get_cell_status(h, w) == sdk.VALID:
painter.setPen(self.default_pen)
else:
painter.setPen(self.invalid_pen)
painter.drawText((w+0.5)*self.parent.cell_width-5,
(h+0.5)*self.parent.cell_height+5,
str(val))
class NumberRing(QGraphicsItem): class NumberRing(QGraphicsItem):
@ -199,5 +209,5 @@ class NumberRing(QGraphicsItem):
for btn in self.cell_buttons: for btn in self.cell_buttons:
btn.buttonClicked.connect(func) btn.buttonClicked.connect(func)
def mousePressEvent(self, event): #def mousePressEvent(self, event):
print('Yes') # print('Yes')