diff --git a/src/mind_reader/ui/views/lobby_view.py b/src/mind_reader/ui/views/lobby_view.py index 12b92d6..f38beec 100644 --- a/src/mind_reader/ui/views/lobby_view.py +++ b/src/mind_reader/ui/views/lobby_view.py @@ -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())