Skip to content

Commit

Permalink
Refactor mapgen options
Browse files Browse the repository at this point in the history
to eliminite some duplicate code
also, add missed --num-teams argument
  • Loading branch information
Gatsik committed Jun 30, 2024
1 parent d7143f3 commit 427bd9d
Show file tree
Hide file tree
Showing 4 changed files with 423 additions and 458 deletions.
127 changes: 61 additions & 66 deletions res/games/mapgen.ui
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
<rect>
<x>0</x>
<y>0</y>
<width>550</width>
<width>584</width>
<height>475</height>
</rect>
</property>
Expand Down Expand Up @@ -594,28 +594,8 @@
</font>
</property>
<property name="currentText">
<string>Casual</string>
<string/>
</property>
<item>
<property name="text">
<string>Casual</string>
</property>
</item>
<item>
<property name="text">
<string>Tournament</string>
</property>
</item>
<item>
<property name="text">
<string>Blind</string>
</property>
</item>
<item>
<property name="text">
<string>Unexplored</string>
</property>
</item>
</widget>
</item>
</layout>
Expand Down Expand Up @@ -654,11 +634,14 @@
<double>2.500000000000000</double>
</property>
<property name="maximum">
<double>40.000000000000000</double>
<double>80.000000000000000</double>
</property>
<property name="singleStep">
<double>1.250000000000000</double>
</property>
<property name="value">
<double>5.000000000000000</double>
</property>
</widget>
</item>
</layout>
Expand All @@ -673,60 +656,72 @@
</font>
</property>
<property name="text">
<string>Number of Spawns</string>
<string>Spawns</string>
</property>
</widget>
</item>
<item>
<widget class="QComboBox" name="numberOfSpawns">
<widget class="QSpinBox" name="numberOfSpawns">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="font">
<font>
<pointsize>10</pointsize>
</font>
</property>
<property name="minimumContentsLength">
<property name="minimum">
<number>1</number>
</property>
<property name="maximum">
<number>1000</number>
</property>
<property name="value">
<number>2</number>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QLabel" name="labelNumberOfTeams">
<property name="font">
<font>
<pointsize>10</pointsize>
</font>
</property>
<property name="text">
<string>Teams</string>
</property>
</widget>
</item>
<item>
<widget class="QSpinBox" name="numberOfTeams">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="font">
<font>
<pointsize>10</pointsize>
</font>
</property>
<property name="minimum">
<number>1</number>
</property>
<property name="maximum">
<number>1000</number>
</property>
<property name="value">
<number>2</number>
</property>
<item>
<property name="text">
<string>2</string>
</property>
</item>
<item>
<property name="text">
<string>4</string>
</property>
</item>
<item>
<property name="text">
<string>6</string>
</property>
</item>
<item>
<property name="text">
<string>8</string>
</property>
</item>
<item>
<property name="text">
<string>10</string>
</property>
</item>
<item>
<property name="text">
<string>12</string>
</property>
</item>
<item>
<property name="text">
<string>14</string>
</property>
</item>
<item>
<property name="text">
<string>16</string>
</property>
</item>
</widget>
</item>
</layout>
Expand Down
155 changes: 155 additions & 0 deletions src/games/mapgenoptions.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,155 @@
from __future__ import annotations

import random
from typing import Any

from PyQt6.QtWidgets import QComboBox
from PyQt6.QtWidgets import QSpinBox

import config


class OptionMixin:
def reset(self) -> None:
raise NotImplementedError

def set_value(self, value: Any) -> None:
raise NotImplementedError

def value(self) -> Any:
raise NotImplementedError

def active(self) -> bool:
raise NotImplementedError

def load(self) -> None:
raise NotImplementedError

def save(self) -> None:
raise NotImplementedError

def as_cmd_arg(self) -> list[str]:
raise NotImplementedError


class MapGenOption(OptionMixin):
def __init__(
self,
name: str,
ui_elem: QComboBox | QSpinBox,
typ: type = str,
default: Any = None,
) -> None:
self.conf = config.Settings()
self.name = name
self.ui_elem = ui_elem
self.typ = typ
self.default = default

def reset(self) -> None:
if self.default is not None:
self.set_value(self.default)

def load(self) -> None:
self.set_value(
self.conf.get(
f"mapGenerator/{self.ui_elem.objectName()}",
default=self.default,
type=self.typ,
),
)

def save(self) -> None:
self.conf.set(
f"mapGenerator/{self.ui_elem.objectName()}",
self.value(),
)

def as_cmd_arg(self) -> list[str]:
return [f"--{self.name}", str(self.value())]


class ComboBoxOption(MapGenOption):
def __init__(
self,
name: str,
ui_elem: QComboBox,
default: str | None = None,
opts: list[str] | None = None,
) -> None:
MapGenOption.__init__(self, name, ui_elem, str, default)
self.opts = opts

def set_value(self, value: str) -> None:
self.ui_elem.setCurrentText(value)

def value(self) -> str:
return self.ui_elem.currentText()

def active(self) -> bool:
return self.ui_elem.isEnabled() and self.value() != self.default

def populate(self) -> None:
if self.opts is None:
return
for opt in self.opts:
self.ui_elem.addItem(opt)

def load(self) -> None:
self.populate()
MapGenOption.load(self)


class SpinBoxOption(MapGenOption):
def __init__(
self,
name: str,
ui_elem: QSpinBox,
typ: type,
default: int | float | None = None,
) -> None:
MapGenOption.__init__(self, name, ui_elem, typ, default)

def set_value(self, value: int | float) -> None:
self.ui_elem.setValue(value)

def value(self) -> int | float:
return self.ui_elem.value()

def active(self) -> bool:
return self.ui_elem.isEnabled()


class RangeOption(OptionMixin):
def __init__(
self,
name: str,
minimum: SpinBoxOption,
maximum: SpinBoxOption,
) -> None:
self.name = name
self.minimum = minimum
self.maximum = maximum

def reset(self) -> None:
self.minimum.reset()
self.maximum.reset()

def value(self) -> float:
minval = min(self.minimum.value(), self.maximum.value())
maxval = max(self.minimum.value(), self.maximum.value())
return random.randrange(round(minval), round(maxval + 1)) / 100

def active(self) -> bool:
return self.minimum.active() and self.maximum.active()

def load(self) -> None:
self.minimum.load()
self.maximum.load()

def save(self) -> None:
self.minimum.save()
self.maximum.save()

def as_cmd_arg(self) -> list[str]:
return [f"--{self.name}", str(self.value())]
Loading

0 comments on commit 427bd9d

Please sign in to comment.