feat(ui): заменены кнопки выбора ролей на переключаемые

This commit is contained in:
2026-08-07 00:48:21 +03:00
parent 3add50cbbc
commit 5fcbf5ac06
+36 -20
View File
@@ -1,16 +1,27 @@
from typing import Callable, Optional, cast
import wx import wx
from mind_reader.core import GameState from mind_reader.core import GameState
class RoleColumn(wx.Panel): 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) super().__init__(parent)
self.role_key = role_key self.role_key = role_key
self.on_role_selected = on_role_selected
self.is_active = False
sizer = wx.BoxSizer(wx.VERTICAL) 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) sizer.Add(self.button_select, 0, wx.EXPAND | wx.ALL, 5)
self.list_players = wx.ListBox(self) self.list_players = wx.ListBox(self)
@@ -18,13 +29,22 @@ class RoleColumn(wx.Panel):
self.SetSizer(sizer) 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]): def set_players(self, players: list[str]):
self.list_players.Clear() self.list_players.Clear()
if players: if players:
self.list_players.AppendItems(players) self.list_players.AppendItems(players)
def disable_on_role_match(self, role: str): def set_role_state(self, role: str):
self.button_select.Enable(self.role_key != role) self.is_active = self.role_key == role
self.button_select.SetValue(self.is_active)
class LobbyPanel(wx.Panel): class LobbyPanel(wx.Panel):
@@ -39,24 +59,20 @@ class LobbyPanel(wx.Panel):
columns_sizer = wx.BoxSizer(wx.HORIZONTAL) columns_sizer = wx.BoxSizer(wx.HORIZONTAL)
self.column_none = RoleColumn(self, "NONE", "👤 Без роли") self.column_none = RoleColumn(
self.column_setter = RoleColumn(self, "SETTER", "🧠 Загадывает") self, "NONE", "👤 Без роли", self._on_role_click
self.column_guesser = RoleColumn(self, "GUESSER", "🕵️ Угадывает") )
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_none, 1, wx.EXPAND | wx.ALL, 5)
columns_sizer.Add(self.column_setter, 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) 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 = wx.Button(self, label="➔ Начать сессию")
self.button_start.Bind(wx.EVT_BUTTON, self._on_start_click) 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"]) self.column_guesser.set_players(players_by_role["GUESSER"])
local_player_role = self.state.local_player_role local_player_role = self.state.local_player_role
self.column_none.disable_on_role_match(local_player_role) self.column_none.set_role_state(local_player_role)
self.column_setter.disable_on_role_match(local_player_role) self.column_setter.set_role_state(local_player_role)
self.column_guesser.disable_on_role_match(local_player_role) self.column_guesser.set_role_state(local_player_role)
self.button_start.Enable(self.state.is_session_ready()) self.button_start.Enable(self.state.is_session_ready())