SudokuGame/graphic_components/board.py

121 lines
4.3 KiB
Python

from PyQt5.QtGui import QPainter, QBrush, QPen, QColor, QFont
from PyQt5.QtWidgets import (QSizePolicy, QGraphicsWidget, QGraphicsItem,
QGraphicsLineItem, QGraphicsRectItem, QGraphicsObject,
QGraphicsItemGroup, QGraphicsPathItem, QGraphicsLinearLayout)
from PyQt5.QtCore import (QAbstractAnimation, QObject, QPointF, Qt, QRectF, QLineF,
QPropertyAnimation, pyqtProperty, pyqtSignal, QSizeF)
from graphic_components import sudoku_graphics as sdk_grap
from graphic_components import menu_graphics as menu_grap
from general import extras
class BoxBoard(QGraphicsWidget):
# Initialisation
def __init__(self, width, height, parent=None):
super().__init__(parent)
self.width = width
self.height = height
self.circumference = 2*(width+height)
self.setMinimumSize(QSizeF(width, height))
self.setMaximumSize(QSizeF(width, height))
self.size_policy = QSizePolicy(QSizePolicy.Minimum, QSizePolicy.Minimum)
self.size_policy.setHeightForWidth(True)
self.setSizePolicy(self.size_policy)
# Set up pens for drawing
self.default_pen = QPen()
self.default_pen.setColor(Qt.white)
self.default_pen.setWidth(5)
# The 4 lines to construct the box
self.left = QLineF(0, 0, 0, self.height)
self.down = QLineF(0, self.height, self.width, self.height)
self.right = QLineF(self.width, 0, self.width, self.height)
self.up = QLineF(0, 0, self.width, 0)
self.line_order = [self.up, self.right, self.down, self.left]
# Reimplemented boundingRect
#def boundingRect(self):
# return QRectF(-5, -5, self.width+10, self.height+10)
# Reimplemented paint
def paint(self, painter, style, widget=None):
painter.setPen(self.default_pen)
for line in self.line_order:
if line.length() > 1:
painter.drawLine(line)
#painter.drawRect(self.geometry())
super().paint(painter, style, widget)
#def sizeHint(self, which, constraint=None):
# super().sizeHint(which, constraint)
# return QSizeF(self.width, self.height)
class GameBoard(BoxBoard):
boxClicked = pyqtSignal(bool)
def __init__(self, width, height, parent=None):
super().__init__(width, height, parent)
self.gamegrid = sdk_grap.SudokuGrid(self.width, self.height, parent=self)
self.numring = sdk_grap.NumberRing(parent=self)
self.gamegrid.buttonClicked.connect(self.show_number_ring)
self.numring.connect_button_signals(self.select_ring_number)
self.gamegrid.setFocus(Qt.MouseFocusReason)
def show_number_ring(self, x=0, y=0):
print('Before', self.gamegrid.hasFocus(), self.numring.hasFocus())
if not self.gamegrid.freeze:
self.numring.setPos(x, y)
self.numring.setVisible(True)
self.numring.setFocus()
else:
self.gamegrid.freeze = False
self.gamegrid.setFocus()
print('After', self.gamegrid.hasFocus(), self.numring.hasFocus())
def select_ring_number(self, val):
if val == 'X':
val = 0
self.gamegrid.replace_cell_number(int(val))
self.show_number_ring()
#def mousePressEvent(self, event):
# print('clicked')
# extras.print_rect_info(self.boundingRect())
# self.buttonClicked.emit(False)
def freeze_gameboard(self, state):
self.gamegrid.freeze = state
self.numring.freeze_buttons(state)
class MenuBoard(BoxBoard):
# TODO: Create the components for the menu: A timer and a difficulty selector
def __init__(self, width, height, parent=None):
super().__init__(width, height, parent)
self.layout = QGraphicsLinearLayout(Qt.Horizontal)
self.layout.setMinimumWidth(width)
self.layout.setMinimumWidth(height)
self.diff_display = menu_grap.DifficultyDisplayer(parent=self)
self.layout.addItem(self.diff_display)
self.timer_display = menu_grap.TimerDisplayer(parent=self)
self.layout.addItem(self.timer_display)
self.layout.setItemSpacing(0, 50)
self.layout.setItemSpacing(1, 0)
self.setLayout(self.layout)
def show_difficulty(self, state):
print(state)
self.diff_display.selected = state
self.diff_display.update()