gui.py 3.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. # coding: utf-8
  2. import typing
  3. from tkinter import Tk
  4. from tkinter import Button
  5. from tkinter import YES
  6. from tkinter import StringVar
  7. from tkinter import OptionMenu
  8. from tkinter import W
  9. from tkinter.ttk import Combobox
  10. from tkinter.ttk import Treeview
  11. from synergine2.config import Config
  12. from opencombat.gui import Gui
  13. from opencombat.strategy.team.stash import TeamStash
  14. class SelectTroopsGui(Gui):
  15. def __init__(
  16. self,
  17. config: Config,
  18. master: Tk,
  19. team_stash: TeamStash,
  20. countries: typing.List[str],
  21. ) -> None:
  22. super().__init__(config, master)
  23. self._master.title('Troops selection')
  24. self._team_stash = team_stash
  25. self._countries_troops = {} # type: typing.Dict[str, typing.List[TeamModel]] # nopep8
  26. # Widgets
  27. self._selected_country_var = StringVar(self._master)
  28. self._selected_country_var.set(countries[0])
  29. self._selected_country_var.trace('w', self._country_changed)
  30. self._select_country_menu = OptionMenu(
  31. self._master,
  32. self._selected_country_var,
  33. *countries,
  34. )
  35. self._teams_var = StringVar(self._master)
  36. self._teams_list = Combobox(
  37. self._master,
  38. height=10,
  39. state='readonly',
  40. textvariable=self._teams_var,
  41. )
  42. self._add_troop_var = StringVar(self._master)
  43. self._add_troop_button = Button(
  44. self._master,
  45. textvariable=self._add_troop_var,
  46. command=self._add_troop,
  47. )
  48. self._add_troop_var.set('Add troop')
  49. self._troops_view = Treeview(
  50. self._master,
  51. columns=('Soldiers',),
  52. height=10,
  53. )
  54. self._troops_view.heading('#0', text='Team')
  55. self._troops_view.heading('#1', text='Soldiers')
  56. self._troops_view.column('#0', stretch=YES)
  57. self._troops_view.column('#1', stretch=YES)
  58. # Layout
  59. self._select_country_menu.grid(row=0, column=0, sticky=W)
  60. self._teams_list.grid(row=1, column=0, sticky=W)
  61. self._add_troop_button.grid(row=2, column=0, sticky=W)
  62. self._troops_view.grid(row=3, column=0, sticky=W)
  63. # Default behaviours
  64. self._selected_country_var.set(countries[0])
  65. self._country_changed()
  66. def _country_changed(self, *args, **kwargs) -> None:
  67. country = self._selected_country_var.get()
  68. self._logger.info('Change country to "{}"'.format(
  69. country,
  70. ))
  71. country_team_names = [
  72. t.name for
  73. t in self._team_stash.get_team_by_country(
  74. self._selected_country_var.get(),
  75. )
  76. ]
  77. self._logger.debug('Change teams for: "{}"'.format(country_team_names))
  78. self._teams_list['values'] = country_team_names
  79. self._teams_var.set(country_team_names[0])
  80. self._update_troops_view(country)
  81. def _add_troop(self, *args, **kwargs) -> None:
  82. if self._teams_var.get():
  83. country = self._selected_country_var.get()
  84. team_name = self._teams_var.get()
  85. self._logger.info('Add troop "{}" to country "{}" troops'.format(
  86. team_name,
  87. team_name,
  88. ))
  89. team_model = self._team_stash.get_team_by_name(
  90. team_name=team_name,
  91. team_country=country,
  92. )
  93. self._countries_troops.setdefault(country, []).append(
  94. team_model,
  95. )
  96. self._update_troops_view(country)
  97. def _update_troops_view(self, country: str) -> None:
  98. teams = self._countries_troops.get(country, [])
  99. self._troops_view.delete(*self._troops_view.get_children())
  100. for team in teams:
  101. self._troops_view.insert(
  102. '',
  103. 'end',
  104. text=team.name,
  105. values=('o' * len(team.units,))
  106. )