Source code for Main
# -*- coding: utf-8 -*-
import logging
import sys
from PyQt5.QtCore import QSize, Qt
from PyQt5.QtGui import QIcon
from PyQt5.QtWidgets import QMainWindow, QAction, qApp, QApplication, QWidget, QSizePolicy, QMessageBox
import resources_rc
from game import Game
from mainButton import MainButton
from settings import Settings
from settingsWindow import SettingsWindow
from connectionWindow import ConnectionWindow
[docs]class Main(QMainWindow):
"""
Main Window of program. \n
Inherits: :class:`PyQt5.QtWidgets.QMainWindow`
"""
def __init__(self):
super().__init__()
logging.basicConfig(format='%(levelname)s:%(message)s', level=logging.DEBUG)
logging.debug("Initialization...")
self.settings = Settings()
self.game = Game(self, self.settings)
self.init_ui()
logging.info("Game Ready!")
[docs] def init_ui(self):
"""
Initialize user interface in Main Window. Intended to use only inside constructor.
"""
if self.settings.always_on_top:
self.setWindowFlags(Qt.WindowStaysOnTopHint)
self.setWindowIcon(QIcon(":/graphics/start.png"))
self.setMinimumSize(300, 300)
self.setWindowTitle('Draughts')
# Initialize Toolbar
self.toolbar = self.addToolBar("Bar")
self.toolbar.setMovable(False)
self.toolbar.setIconSize(QSize(28, 28))
# Surrender
self.surrender_button = QAction(QIcon(':/graphics/surrender.png'), 'Surrender', self)
self.surrender_button.triggered.connect(self.surrender_button_clicked)
self.surrender_button.setDisabled(True)
self.toolbar.addAction(self.surrender_button)
# Multiplayer
self.multiplayer_button = QAction(QIcon(':/graphics/internet.png'), 'Multiplayer', self)
self.multiplayer_button.triggered.connect(self.establish_internet_connection)
self.toolbar.addAction(self.multiplayer_button)
# Blank Space
spacer_widget = QWidget(self)
spacer_widget.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Preferred)
self.toolbar.addWidget(spacer_widget)
# Main Button
self.main_button = MainButton(self)
self.main_button.triggered.connect(self.main_button_clicked)
self.toolbar.addAction(self.main_button)
# Blank Space
spacer_widget2 = QWidget(self)
spacer_widget2.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Preferred)
self.toolbar.addWidget(spacer_widget2)
# Options
options_act = QAction(QIcon(':/graphics/settings.png'), 'Options', self)
options_act.setShortcut('Ctrl+O')
options_act.triggered.connect(self.show_settings_window)
self.toolbar.addAction(options_act)
# Exit game
exit_act = QAction(QIcon(':/graphics/exit.png'), 'Exit', self)
exit_act.setShortcut('Ctrl+Q')
exit_act.triggered.connect(qApp.quit)
self.toolbar.addAction(exit_act)
# noinspection PyUnusedLocal
[docs] def paintEvent(self, e):
"""
Overwrites method from :class:`PyQt5.QtWidgets.QMainWindow`
"""
self.game.update_drawing()
[docs] def show_settings_window(self):
"""
Shows QWidget with settings window :class:`settingsWindow.SettingsWindow`
Function called on option_act trigger event.
"""
self.settings_window = SettingsWindow(self.settings,mp = self.game.multiplayer)
[docs] def main_button_clicked(self):
"""
Starts game.
Function called on main_button trigger event.
main_button is in the middle of toolbar.
"""
if self.game.pieces is None:
self.game.start_match()
[docs] def surrender_button_clicked(self):
"""
Shows :class:`QMessageBox` to check if user didn't make misclick.
Function called on surrender_button trigger event.
"""
if self.game.multiplayer:
self.game.connection.send_special_action("surrender")
self.game.end_match()
self.game.connection.close()
return
msg_box = QMessageBox()
msg_box.setWindowTitle("Player surrendered")
msg_box.setText("Do You want to play again?")
msg_box.setStandardButtons(QMessageBox.Yes | QMessageBox.No)
msg_box.buttonClicked.connect(self.surrender_button_clicked_answered)
msg_box.exec_()
[docs] def surrender_button_clicked_answered(self, i):
"""
Surrenders the game.
Function called from msg_box inside :func:`surrender_button_clicked`
"""
if i.text() == "&Yes":
self.game.end_match()
self.game.start_match()
elif i.text() == "&No":
self.surrender_button.setDisabled(True)
self.game.end_match()
[docs] def establish_internet_connection(self):
"""
Shows QWidget with host/connect options :class:`connectionWindow.ConnectionWindow`
Function called on multiplayer_button trigger event.
"""
self.connection_window = ConnectionWindow()
self.connection_window.got_connection.connect(self.connection_established)
self.connection_window.exec()
[docs] def connection_established(self):
"""
Starts multiplayer match and sends settings dump to other side.
Called after successful connection established in :class:`connectionWindow.ConnectionWindow`
"""
self.game.start_multiplayer_match(self.connection_window.connection)
self.connection_window.connection.send_special_action("[settings]"+self.settings.json_dump_for_mp_connection())
if __name__ == '__main__':
app = QApplication(sys.argv)
w = Main()
w.show()
sys.exit(app.exec_())