feat(ui): заменены кнопки выбора ролей на переключаемые
This commit is contained in:
@@ -1,16 +1,27 @@
|
||||
from typing import Callable, Optional, cast
|
||||
|
||||
import wx
|
||||
|
||||
from mind_reader.core import GameState
|
||||
|
||||
|
||||
class RoleColumn(wx.Panel):
|
||||
def __init__(self, parent, role_key: str, button_label: str):
|
||||
def __init__(
|
||||
self,
|
||||
parent,
|
||||
role_key: str,
|
||||
button_label: str,
|
||||
on_role_selected: Optional[Callable[[str], None]] = None,
|
||||
):
|
||||
super().__init__(parent)
|
||||
self.role_key = role_key
|
||||
self.on_role_selected = on_role_selected
|
||||
self.is_active = False
|
||||
|
||||
sizer = wx.BoxSizer(wx.VERTICAL)
|
||||
|
||||
self.button_select = wx.Button(self, label=button_label)
|
||||
self.button_select = wx.ToggleButton(self, label=button_label)
|
||||
self.button_select.Bind(wx.EVT_TOGGLEBUTTON, self._on_button_click)
|
||||
sizer.Add(self.button_select, 0, wx.EXPAND | wx.ALL, 5)
|
||||
|
||||
self.list_players = wx.ListBox(self)
|
||||
@@ -18,13 +29,22 @@ class RoleColumn(wx.Panel):
|
||||
|
||||
self.SetSizer(sizer)
|
||||
|
||||
def _on_button_click(self, event):
|
||||
if self.is_active:
|
||||
self.button_select.SetValue(True)
|
||||
return
|
||||
|
||||
if self.on_role_selected:
|
||||
self.on_role_selected(self.role_key)
|
||||
|
||||
def set_players(self, players: list[str]):
|
||||
self.list_players.Clear()
|
||||
if players:
|
||||
self.list_players.AppendItems(players)
|
||||
|
||||
def disable_on_role_match(self, role: str):
|
||||
self.button_select.Enable(self.role_key != role)
|
||||
def set_role_state(self, role: str):
|
||||
self.is_active = self.role_key == role
|
||||
self.button_select.SetValue(self.is_active)
|
||||
|
||||
|
||||
class LobbyPanel(wx.Panel):
|
||||
@@ -39,24 +59,20 @@ class LobbyPanel(wx.Panel):
|
||||
|
||||
columns_sizer = wx.BoxSizer(wx.HORIZONTAL)
|
||||
|
||||
self.column_none = RoleColumn(self, "NONE", "👤 Без роли")
|
||||
self.column_setter = RoleColumn(self, "SETTER", "🧠 Загадывает")
|
||||
self.column_guesser = RoleColumn(self, "GUESSER", "🕵️ Угадывает")
|
||||
self.column_none = RoleColumn(
|
||||
self, "NONE", "👤 Без роли", self._on_role_click
|
||||
)
|
||||
self.column_setter = RoleColumn(
|
||||
self, "SETTER", "🧠 Загадывает", self._on_role_click
|
||||
)
|
||||
self.column_guesser = RoleColumn(
|
||||
self, "GUESSER", "🕵️ Угадывает", self._on_role_click
|
||||
)
|
||||
|
||||
columns_sizer.Add(self.column_none, 1, wx.EXPAND | wx.ALL, 5)
|
||||
columns_sizer.Add(self.column_setter, 1, wx.EXPAND | wx.ALL, 5)
|
||||
columns_sizer.Add(self.column_guesser, 1, wx.EXPAND | wx.ALL, 5)
|
||||
|
||||
self.column_none.button_select.Bind(
|
||||
wx.EVT_BUTTON, lambda evt: self._on_role_click("NONE")
|
||||
)
|
||||
self.column_setter.button_select.Bind(
|
||||
wx.EVT_BUTTON, lambda evt: self._on_role_click("SETTER")
|
||||
)
|
||||
self.column_guesser.button_select.Bind(
|
||||
wx.EVT_BUTTON, lambda evt: self._on_role_click("GUESSER")
|
||||
)
|
||||
|
||||
self.button_start = wx.Button(self, label="➔ Начать сессию")
|
||||
self.button_start.Bind(wx.EVT_BUTTON, self._on_start_click)
|
||||
|
||||
@@ -99,8 +115,8 @@ class LobbyPanel(wx.Panel):
|
||||
self.column_guesser.set_players(players_by_role["GUESSER"])
|
||||
|
||||
local_player_role = self.state.local_player_role
|
||||
self.column_none.disable_on_role_match(local_player_role)
|
||||
self.column_setter.disable_on_role_match(local_player_role)
|
||||
self.column_guesser.disable_on_role_match(local_player_role)
|
||||
self.column_none.set_role_state(local_player_role)
|
||||
self.column_setter.set_role_state(local_player_role)
|
||||
self.column_guesser.set_role_state(local_player_role)
|
||||
|
||||
self.button_start.Enable(self.state.is_session_ready())
|
||||
|
||||
Reference in New Issue
Block a user