Refactor display rules.

This commit is contained in:
Dan Albert 2020-10-09 14:14:32 -07:00
parent 63bc3bd46e
commit 31d5e3151b
5 changed files with 70 additions and 70 deletions

43
qt_ui/displayoptions.py Normal file
View File

@ -0,0 +1,43 @@
"""Visibility options for the game map."""
from dataclasses import dataclass
from typing import Iterator
@dataclass
class DisplayRule:
name: str
_value: bool
@property
def menu_text(self) -> str:
return self.name
@property
def value(self) -> bool:
return self._value
@value.setter
def value(self, value: bool) -> None:
from qt_ui.widgets.map.QLiberationMap import QLiberationMap
self._value = value
QLiberationMap.instance.reload_scene()
QLiberationMap.instance.update()
def __bool__(self) -> bool:
return self.value
class DisplayOptions:
ground_objects = DisplayRule("Ground Objects", True)
control_points = DisplayRule("Control Points", True)
lines = DisplayRule("Lines", True)
events = DisplayRule("Events", True)
sam_ranges = DisplayRule("SAM Ranges", True)
flight_paths = DisplayRule("Flight Paths", False)
@classmethod
def menu_items(cls) -> Iterator[DisplayRule]:
# Python 3.6 enforces that __dict__ is order preserving by default.
for value in cls.__dict__.values():
if isinstance(value, DisplayRule):
yield value

View File

@ -1,5 +1,7 @@
from __future__ import annotations
import logging import logging
from typing import Dict, List, Optional, Tuple from typing import List, Optional, Tuple
from PySide2.QtCore import Qt from PySide2.QtCore import Qt
from PySide2.QtGui import QBrush, QColor, QPen, QPixmap, QWheelEvent from PySide2.QtGui import QBrush, QColor, QPen, QPixmap, QWheelEvent
@ -18,11 +20,12 @@ from game import Game, db
from game.data.radar_db import UNITS_WITH_RADAR from game.data.radar_db import UNITS_WITH_RADAR
from gen import Conflict from gen import Conflict
from gen.flights.flight import Flight from gen.flights.flight import Flight
from qt_ui.displayoptions import DisplayOptions
from qt_ui.models import GameModel from qt_ui.models import GameModel
from qt_ui.widgets.map.QFrontLine import QFrontLine
from qt_ui.widgets.map.QLiberationScene import QLiberationScene from qt_ui.widgets.map.QLiberationScene import QLiberationScene
from qt_ui.widgets.map.QMapControlPoint import QMapControlPoint from qt_ui.widgets.map.QMapControlPoint import QMapControlPoint
from qt_ui.widgets.map.QMapGroundObject import QMapGroundObject from qt_ui.widgets.map.QMapGroundObject import QMapGroundObject
from qt_ui.widgets.map.QFrontLine import QFrontLine
from qt_ui.windows.GameUpdateSignal import GameUpdateSignal from qt_ui.windows.GameUpdateSignal import GameUpdateSignal
from theater import ControlPoint, FrontLine from theater import ControlPoint, FrontLine
@ -30,15 +33,7 @@ from theater import ControlPoint, FrontLine
class QLiberationMap(QGraphicsView): class QLiberationMap(QGraphicsView):
WAYPOINT_SIZE = 4 WAYPOINT_SIZE = 4
instance = None instance: Optional[QLiberationMap] = None
display_rules: Dict[str, bool] = {
"cp": True,
"go": True,
"lines": True,
"events": True,
"sam": True,
"flight_paths": False
}
def __init__(self, game_model: GameModel): def __init__(self, game_model: GameModel):
super(QLiberationMap, self).__init__() super(QLiberationMap, self).__init__()
@ -161,7 +156,8 @@ class QLiberationMap(QGraphicsView):
buildings = self.game.theater.find_ground_objects_by_obj_name(ground_object.obj_name) buildings = self.game.theater.find_ground_objects_by_obj_name(ground_object.obj_name)
scene.addItem(QMapGroundObject(self, go_pos[0], go_pos[1], 14, 12, cp, ground_object, self.game, buildings)) scene.addItem(QMapGroundObject(self, go_pos[0], go_pos[1], 14, 12, cp, ground_object, self.game, buildings))
if ground_object.category == "aa" and self.get_display_rule("sam"): is_aa = ground_object.category == "aa"
if is_aa and DisplayOptions.sam_ranges:
max_range = 0 max_range = 0
has_radar = False has_radar = False
if ground_object.groups: if ground_object.groups:
@ -177,11 +173,11 @@ class QLiberationMap(QGraphicsView):
added_objects.append(ground_object.obj_name) added_objects.append(ground_object.obj_name)
for cp in self.game.theater.enemy_points(): for cp in self.game.theater.enemy_points():
if self.get_display_rule("lines"): if DisplayOptions.lines:
self.scene_create_lines_for_cp(cp, playerColor, enemyColor) self.scene_create_lines_for_cp(cp, playerColor, enemyColor)
for cp in self.game.theater.player_points(): for cp in self.game.theater.player_points():
if self.get_display_rule("lines"): if DisplayOptions.lines:
self.scene_create_lines_for_cp(cp, playerColor, enemyColor) self.scene_create_lines_for_cp(cp, playerColor, enemyColor)
self.draw_flight_plans(scene) self.draw_flight_plans(scene)
@ -202,7 +198,7 @@ class QLiberationMap(QGraphicsView):
# Something may have caused those items to already be removed. # Something may have caused those items to already be removed.
pass pass
self.flight_path_items.clear() self.flight_path_items.clear()
if not self.get_display_rule("flight_paths"): if not DisplayOptions.flight_paths:
return return
for package in self.game_model.ato_model.packages: for package in self.game_model.ato_model.packages:
for flight in package.flights: for flight in package.flights:
@ -367,18 +363,3 @@ class QLiberationMap(QGraphicsView):
effect = QGraphicsOpacityEffect() effect = QGraphicsOpacityEffect()
effect.setOpacity(0.3) effect.setOpacity(0.3)
overlay.setGraphicsEffect(effect) overlay.setGraphicsEffect(effect)
@staticmethod
def set_display_rule(rule: str, value: bool):
QLiberationMap.display_rules[rule] = value
QLiberationMap.instance.reload_scene()
QLiberationMap.instance.update()
@staticmethod
def get_display_rules() -> Dict[str, bool]:
return QLiberationMap.display_rules
@staticmethod
def get_display_rule(rule) -> bool:
return QLiberationMap.display_rules[rule]

View File

@ -7,6 +7,7 @@ from qt_ui.models import GameModel
from qt_ui.windows.basemenu.QBaseMenu2 import QBaseMenu2 from qt_ui.windows.basemenu.QBaseMenu2 import QBaseMenu2
from theater import ControlPoint from theater import ControlPoint
from .QMapObject import QMapObject from .QMapObject import QMapObject
from ...displayoptions import DisplayOptions
class QMapControlPoint(QMapObject): class QMapControlPoint(QMapObject):
@ -21,7 +22,7 @@ class QMapControlPoint(QMapObject):
self.base_details_dialog: Optional[QBaseMenu2] = None self.base_details_dialog: Optional[QBaseMenu2] = None
def paint(self, painter, option, widget=None) -> None: def paint(self, painter, option, widget=None) -> None:
if self.parent.get_display_rule("cp"): if DisplayOptions.control_points:
painter.save() painter.save()
painter.setRenderHint(QPainter.Antialiasing) painter.setRenderHint(QPainter.Antialiasing)
painter.setBrush(self.brush_color) painter.setBrush(self.brush_color)

View File

@ -8,8 +8,9 @@ import qt_ui.uiconstants as const
from game import Game from game import Game
from game.data.building_data import FORTIFICATION_BUILDINGS from game.data.building_data import FORTIFICATION_BUILDINGS
from qt_ui.windows.groundobject.QGroundObjectMenu import QGroundObjectMenu from qt_ui.windows.groundobject.QGroundObjectMenu import QGroundObjectMenu
from theater import TheaterGroundObject, ControlPoint from theater import ControlPoint, TheaterGroundObject
from .QMapObject import QMapObject from .QMapObject import QMapObject
from ...displayoptions import DisplayOptions
class QMapGroundObject(QMapObject): class QMapGroundObject(QMapObject):
@ -50,7 +51,7 @@ class QMapGroundObject(QMapObject):
player_icons = "_blue" player_icons = "_blue"
enemy_icons = "" enemy_icons = ""
if self.parent.get_display_rule("go"): if DisplayOptions.ground_objects:
painter.save() painter.save()
cat = self.ground_object.category cat = self.ground_object.category

View File

@ -19,6 +19,7 @@ from PySide2.QtWidgets import (
import qt_ui.uiconstants as CONST import qt_ui.uiconstants as CONST
from game import Game, persistency from game import Game, persistency
from qt_ui.dialogs import Dialog from qt_ui.dialogs import Dialog
from qt_ui.displayoptions import DisplayOptions
from qt_ui.models import GameModel from qt_ui.models import GameModel
from qt_ui.uiconstants import URLS from qt_ui.uiconstants import URLS
from qt_ui.widgets.QTopPanel import QTopPanel from qt_ui.widgets.QTopPanel import QTopPanel
@ -134,48 +135,21 @@ class QLiberationWindow(QMainWindow):
file_menu.addSeparator() file_menu.addSeparator()
file_menu.addAction(self.showLiberationPrefDialogAction) file_menu.addAction(self.showLiberationPrefDialogAction)
file_menu.addSeparator() file_menu.addSeparator()
#file_menu.addAction("Close Current Game", lambda: self.closeGame()) # Not working
file_menu.addAction("E&xit" , lambda: self.exit()) file_menu.addAction("E&xit" , lambda: self.exit())
displayMenu = self.menu.addMenu("&Display") displayMenu = self.menu.addMenu("&Display")
tg_cp_visibility = QAction('&Control Point', displayMenu) for display_rule in DisplayOptions.menu_items():
tg_cp_visibility.setCheckable(True) def make_check_closure():
tg_cp_visibility.setChecked(True) def closure():
tg_cp_visibility.toggled.connect(lambda: QLiberationMap.set_display_rule("cp", tg_cp_visibility.isChecked())) display_rule.value = action.isChecked()
return closure
tg_go_visibility = QAction('&Ground Objects', displayMenu) action = QAction(f"&{display_rule.menu_text}", displayMenu)
tg_go_visibility.setCheckable(True) action.setCheckable(True)
tg_go_visibility.setChecked(True) action.setChecked(display_rule.value)
tg_go_visibility.toggled.connect(lambda: QLiberationMap.set_display_rule("go", tg_go_visibility.isChecked())) action.toggled.connect(make_check_closure())
displayMenu.addAction(action)
tg_line_visibility = QAction('&Lines', displayMenu)
tg_line_visibility.setCheckable(True)
tg_line_visibility.setChecked(True)
tg_line_visibility.toggled.connect(
lambda: QLiberationMap.set_display_rule("lines", tg_line_visibility.isChecked()))
tg_event_visibility = QAction('&Events', displayMenu)
tg_event_visibility.setCheckable(True)
tg_event_visibility.setChecked(True)
tg_event_visibility.toggled.connect(lambda: QLiberationMap.set_display_rule("events", tg_event_visibility.isChecked()))
tg_sam_visibility = QAction('&SAM Range', displayMenu)
tg_sam_visibility.setCheckable(True)
tg_sam_visibility.setChecked(True)
tg_sam_visibility.toggled.connect(lambda: QLiberationMap.set_display_rule("sam", tg_sam_visibility.isChecked()))
tg_flight_path_visibility = QAction('&Flight Paths', displayMenu)
tg_flight_path_visibility.setCheckable(True)
tg_flight_path_visibility.setChecked(False)
tg_flight_path_visibility.toggled.connect(lambda: QLiberationMap.set_display_rule("flight_paths", tg_flight_path_visibility.isChecked()))
displayMenu.addAction(tg_go_visibility)
displayMenu.addAction(tg_cp_visibility)
displayMenu.addAction(tg_line_visibility)
displayMenu.addAction(tg_event_visibility)
displayMenu.addAction(tg_sam_visibility)
displayMenu.addAction(tg_flight_path_visibility)
help_menu = self.menu.addMenu("&Help") help_menu = self.menu.addMenu("&Help")
help_menu.addAction("&Discord Server", lambda: webbrowser.open_new_tab("https://" + "discord.gg" + "/" + "bKrt" + "rkJ")) help_menu.addAction("&Discord Server", lambda: webbrowser.open_new_tab("https://" + "discord.gg" + "/" + "bKrt" + "rkJ"))