Create and modify enemies function.

This commit is contained in:
luxick
2018-03-14 13:40:02 +01:00
parent 437f418f49
commit c3e6793f69
12 changed files with 582 additions and 390 deletions

View File

@@ -57,6 +57,7 @@ class Death:
self.enemy = arg.get('enemy') self.enemy = arg.get('enemy')
self.episode = arg.get('episode') self.episode = arg.get('episode')
self.penalties = arg.get('penalties') self.penalties = arg.get('penalties')
self.time = arg.get('time')
class Penalty: class Penalty:

View File

@@ -4,7 +4,7 @@ This module contains UI functions for displaying different dialogs
import datetime import datetime
from gi.repository import Gtk from gi.repository import Gtk
from common import models from common import models
from dsst_gtk3 import gtk_ui from dsst_gtk3 import gtk_ui, util
def enter_string_dialog(builder: Gtk.Builder, title: str, value=None) -> str: def enter_string_dialog(builder: Gtk.Builder, title: str, value=None) -> str:
@@ -97,49 +97,68 @@ def edit_episode(app: 'gtk_ui.GtkUi', season_id: int, episode: 'models.Episode'=
return episode return episode
def show_edit_death_dialog(builder: Gtk.Builder, episode_id: int, death): def edit_death(app: 'gtk_ui.GtkUi', death: 'models.Death'=None):
pass """Show a dialog to create or edit death events for an episode
# """Show a dialog for editing or creating death events. :param app: Main Gtk application
# :param builder: A Gtk.Builder object :param death: (Optional) Existing death object to edit
# :param episode_id: ID to witch the death event belongs to :return: Death object or None if dialog was canceled
# :param death: (Optional) Death event witch should be edited """
# :return: Gtk.ResponseType of the dialog if not death:
# """ death = models.Death()
# dialog = builder.get_object("edit_death_dialog") # type: Gtk.Dialog death.episode = app.get_selected_episode_id()
# dialog.set_transient_for(builder.get_object("main_window")) death.info = ""
# with sql.db.atomic(): death.penalties = []
# if death: death.time = datetime.time(0, 0)
# index = util.get_index_of_combo_model(builder.get_object('edit_death_enemy_combo'), 0, death.enemy.id) hour_spin = app.ui.get_object('death_hour_spin')
# builder.get_object('edit_death_enemy_combo').set_active(index) min_spin = app.ui.get_object('death_min_spin')
# # Set time of death
# # TODO Default drink should be set in config hour_spin.set_value(death.time.hour)
# default_drink = sql.Drink.get().name min_spin.set_value(death.time.minute)
# store = builder.get_object('player_penalties_store') # Set Enemy
# store.clear() if death.enemy:
# for player in builder.get_object('episode_players_store'): index = util.get_index_of_combo_model(app.ui.get_object('edit_death_enemy_combo'), 0, death.enemy.id)
# store.append([None, player[1], default_drink, player[0]]) app.ui.get_object('edit_death_enemy_combo').set_active(index)
# # Set player
# # Run the dialog if death.player:
# result = dialog.run() index = util.get_index_of_combo_model(app.ui.get_object('edit_death_player_combo'), 0, death.player.id)
# dialog.hide() app.ui.get_object('edit_death_player_combo').set_active(index)
# if result != Gtk.ResponseType.OK: # Set shot size
# sql.db.rollback() if death.penalties:
# return result app.ui.get_object('edit_death_size_spin').set_value(death.penalties[0].size)
# # Set info comment
# # Collect info from widgets and save to database app.ui.get_object('edit_death_comment_entry').set_text(death.info)
# player_id = util.get_combo_value(builder.get_object('edit_death_player_combo'), 0) # Set penalties
# enemy_id = util.get_combo_value(builder.get_object('edit_death_enemy_combo'), 3) default_drink = app.drinks.data[0].name
# comment = builder.get_object('edit_death_comment_entry').get_text() store = app.ui.get_object('player_penalties_store')
# if not death: store.clear()
# death = sql.Death.create(episode=episode_id, player=player_id, enemy=enemy_id, info=comment) if death.penalties:
# for penalty in death.penalties:
# store = builder.get_object('player_penalties_store') store.append([penalty.id, penalty.player.name, penalty.drink.name, penalty.player.id])
# size = builder.get_object('edit_death_size_spin').get_value() else:
# for entry in store: for player in app.ui.get_object('episode_players_store'):
# drink_id = sql.Drink.get(sql.Drink.name == entry[2]) store.append([None, player[1], default_drink, player[0]])
# sql.Penalty.create(size=size, player=entry[3], death=death.id, drink=drink_id)
# # Run the dialog
# return result dialog = app.ui.get_object("edit_death_dialog") # type: Gtk.Dialog
result = dialog.run()
dialog.hide()
if result != Gtk.ResponseType.OK:
return None
# Parse the inputs
death.time = datetime.time(hour_spin.get_value(), min_spin.set_value)
death.enemy = util.get_combo_value(app.ui.get_object('edit_death_enemy_combo'), 3)
death.player = util.get_combo_value(app.ui.get_object('edit_death_player_combo'), 0)
death.info = app.ui.get_object('edit_death_comment_entry').get_text()
store = app.ui.get_object('player_penalties_store')
size = app.ui.get_object('edit_death_size_spin').get_value()
death.penalties.clear()
for entry in store:
drink_id = [drink.id for drink in app.drinks.data if drink.name == entry[2]][0]
penalty = models.Penalty({'id': entry[0], 'size': size, 'drink': drink_id, 'player': entry[3]})
death.penalties.append(penalty)
return death
def show_edit_victory_dialog(builder: Gtk.Builder, episode_id: int, victory): def show_edit_victory_dialog(builder: Gtk.Builder, episode_id: int, victory):

View File

@@ -40,35 +40,32 @@ class GtkUi:
self.meta = {'connection': '{}:{}'.format(config.get('host'), config.get('port'))} self.meta = {'connection': '{}:{}'.format(config.get('host'), config.get('port'))}
# Load base data and seasons # Load base data and seasons
self.load_server_meta() self.load_server_meta()
self.reload() self.full_reload()
self.update_status_bar_meta() self.update_status_bar_meta()
def load_server_meta(self): def load_server_meta(self):
self.meta['database'] = self.data_client.send_request('load_db_meta') self.meta['database'] = self.data_client.send_request('load_db_meta')
def reload(self): def full_reload(self):
with util.network_operation(self): with util.network_operation(self):
refresh_base = False self.players.data = self.data_client.send_request('load_players')
if not self.players.valid: self.drinks.data = self.data_client.send_request('load_drinks')
self.players.data = self.data_client.send_request('load_players') self.seasons.data = self.data_client.send_request('load_seasons')
refresh_base = True season_id = self.get_selected_season_id()
if not self.drinks.valid: if season_id:
self.drinks.data = self.data_client.send_request('load_drinks') self.episodes.data = self.data_client.send_request('load_episodes', season_id)
refresh_base= True self.season_stats.data = self.data_client.send_request('load_season_stats', season_id)
if not self.seasons.valid: cur_season = [s for s in self.seasons.data if s.id == season_id][0]
self.seasons.data = self.data_client.send_request('load_seasons') self.enemies.data = cur_season.enemies
refresh_base = True reload.rebuild_view_data(self)
if refresh_base:
reload.reload_base_data(self.ui, self)
if not self.episodes.valid: def reload(self):
with util.network_operation(self): pass
season_id = self.get_selected_season_id()
if season_id: def update_enemy(self, enemy: 'models.Enemy'):
self.episodes.data = self.data_client.send_request('load_episodes', season_id) with util.network_operation(self):
self.season_stats.data = self.data_client.send_request('load_season_stats', season_id) self.data_client.send_request('update_enemy', enemy)
reload.reload_episodes(self.ui, self) self.full_reload()
reload.reload_season_stats(self)
def update_season(self, season: 'models.Season'): def update_season(self, season: 'models.Season'):
with util.network_operation(self): with util.network_operation(self):

View File

@@ -1,4 +1,4 @@
from dsst_gtk3 import dialogs from dsst_gtk3 import dialogs, gtk_ui
class BaseDataHandlers: class BaseDataHandlers:
@@ -6,48 +6,42 @@ class BaseDataHandlers:
def __init__(self, app: 'gtk_ui.GtkUi'): def __init__(self, app: 'gtk_ui.GtkUi'):
self.app = app self.app = app
def do_manage_players(self, *_):
dialogs.run_management_dialog(self.app.ui, 'manage_players_dialog')
def do_add_player(self, entry): def do_add_player(self, entry):
if entry.get_text(): if entry.get_text():
# sql.Player.create(name=entry.get_text()) # sql.Player.create(name=entry.get_text())
entry.set_text('') entry.set_text('')
self.app.reload() self.app.full_reload()
def do_manage_enemies(self, *_):
dialogs.run_management_dialog(self.app.ui, 'manage_enemies_dialog')
def on_player_name_edited(self, _, index, value): def on_player_name_edited(self, _, index, value):
row = self.app.ui.get_object('all_players_store')[index] row = self.app.ui.get_object('all_players_store')[index]
# sql.Player.update(name=value)\ # sql.Player.update(name=value)\
# .where(sql.Player.id == row[0])\ # .where(sql.Player.id == row[0])\
# .execute() # .execute()
self.app.reload() self.app.full_reload()
def on_player_hex_edited(self, _, index, value): def on_player_hex_edited(self, _, index, value):
row = self.app.ui.get_object('all_players_store')[index] row = self.app.ui.get_object('all_players_store')[index]
# sql.Player.update(hex_id=value)\ # sql.Player.update(hex_id=value)\
# .where(sql.Player.id == row[0])\ # .where(sql.Player.id == row[0])\
# .execute() # .execute()
self.app.reload() self.app.full_reload()
def do_add_drink(self, entry): def do_add_drink(self, entry):
if entry.get_text(): if entry.get_text():
sql.Drink.create(name=entry.get_text(), vol=0) sql.Drink.create(name=entry.get_text(), vol=0)
entry.set_text('') entry.set_text('')
self.app.reload() self.app.full_reload()
def on_drink_name_edited(self, _, index, value): def on_drink_name_edited(self, _, index, value):
row = self.app.ui.get_object('drink_store')[index] row = self.app.ui.get_object('drink_store')[index]
# sql.Drink.update(name=value)\ # sql.Drink.update(name=value)\
# .where(sql.Drink.id == row[0])\ # .where(sql.Drink.id == row[0])\
# .execute() # .execute()
self.app.reload() self.app.full_reload()
def on_drink_vol_edited(self, _, index, value): def on_drink_vol_edited(self, _, index, value):
row = self.app.ui.get_object('drink_store')[index] row = self.app.ui.get_object('drink_store')[index]
# sql.Drink.update(vol=value) \ # sql.Drink.update(vol=value) \
# .where(sql.Drink.id == row[0]) \ # .where(sql.Drink.id == row[0]) \
# .execute() # .execute()
self.app.reload() self.app.full_reload()

View File

@@ -1,5 +1,5 @@
from gi.repository import Gtk from gi.repository import Gtk
from dsst_gtk3 import dialogs from dsst_gtk3 import dialogs, gtk_ui
class DeathHandlers: class DeathHandlers:
@@ -11,9 +11,10 @@ class DeathHandlers:
ep_id = self.app.get_selected_episode_id() ep_id = self.app.get_selected_episode_id()
if not ep_id: if not ep_id:
return return
result = dialogs.show_edit_death_dialog(self.app.ui, ep_id) result = dialogs.edit_death(self.app)
if result == Gtk.ResponseType.OK: if result == Gtk.ResponseType.OK:
self.app.reload() self.app.episodes.valid = False
self.app.full_reload()
def on_penalty_drink_changed(self, _, path, text): def on_penalty_drink_changed(self, _, path, text):
self.app.ui.get_object('player_penalties_store')[path][2] = text self.app.ui.get_object('player_penalties_store')[path][2] = text

View File

@@ -1,6 +1,7 @@
import datetime import datetime
from dsst_gtk3 import dialogs, util, gtk_ui from dsst_gtk3 import dialogs, util, gtk_ui, reload
from common import models
from gi.repository import Gtk from gi.repository import Gtk
@@ -29,10 +30,28 @@ class DialogHandlers:
def do_add_enemy(self, entry): def do_add_enemy(self, entry):
if entry.get_text(): if entry.get_text():
store = self.app.ui.get_object('enemy_season_store') store = self.app.ui.get_object('enemy_season_store')
# enemy = sql.Enemy.create(name=entry.get_text(), season=self.app.get_selected_season_id()) enemy = models.Enemy()
# store.append([enemy.name, False, 0, enemy.id]) enemy.name = entry.get_text()
enemy.season = self.app.get_selected_season_id()
enemy.boss = not self.app.ui.get_object('enemy_optional_ckeck').get_active()
self.app.ui.get_object('enemy_optional_ckeck').set_active(False)
entry.set_text('') entry.set_text('')
self.app.update_enemy(enemy)
def on_enemy_name_edited(self, _, index, value):
row = self.app.ui.get_object('enemy_season_store')[index]
enemy = [enemy for enemy in self.app.enemies.data if enemy.id == row[4]][0]
enemy.name = value
self.app.update_enemy(enemy)
def on_enemy_optional_edited(self, renderer, index):
new_optional_value = not renderer.get_active()
row = self.app.ui.get_object('enemy_season_store')[index]
enemy = [enemy for enemy in self.app.enemies.data if enemy.id == row[4]][0]
enemy.boss = new_optional_value
self.app.update_enemy(enemy)
def do_show_date_picker(self, entry: 'Gtk.Entry', *_): def do_show_date_picker(self, entry: 'Gtk.Entry', *_):
dialog = self.app.ui.get_object('date_picker_dialog') dialog = self.app.ui.get_object('date_picker_dialog')
result = dialog.run() result = dialog.run()

View File

@@ -10,12 +10,12 @@ class SeasonHandlers:
season = dialogs.edit_season(self.app.ui) season = dialogs.edit_season(self.app.ui)
if season: if season:
self.app.update_season(season) self.app.update_season(season)
self.app.reload() self.app.full_reload()
def do_season_selected(self, *_): def do_season_selected(self, *_):
self.app.episodes.valid = False self.app.episodes.valid = False
self.app.season_stats.valid = False self.app.season_stats.valid = False
self.app.reload() self.app.full_reload()
def do_add_episode(self, *_): def do_add_episode(self, *_):
season_id = self.app.get_selected_season_id() season_id = self.app.get_selected_season_id()
@@ -24,7 +24,7 @@ class SeasonHandlers:
ep = dialogs.edit_episode(self.app, season_id) ep = dialogs.edit_episode(self.app, season_id)
if ep: if ep:
self.app.update_episode(ep) self.app.update_episode(ep)
self.app.reload() self.app.full_reload()
def on_selected_episode_changed(self, *_): def on_selected_episode_changed(self, *_):
reload.reload_episode_stats(self.app) reload.reload_episode_stats(self.app)

View File

@@ -13,4 +13,4 @@ class VictoryHandlers:
return return
result = dialogs.show_edit_victory_dialog(self.app.ui, ep_id) result = dialogs.show_edit_victory_dialog(self.app.ui, ep_id)
if result == Gtk.ResponseType.OK: if result == Gtk.ResponseType.OK:
self.app.reload() self.app.full_reload()

View File

@@ -3,37 +3,38 @@ from gi.repository import Gtk
from dsst_gtk3 import util, gtk_ui from dsst_gtk3 import util, gtk_ui
def reload_base_data(builder: Gtk.Builder, app: 'gtk_ui.GtkUi',): def reload_base_data(app: 'gtk_ui.GtkUi',):
"""Reload function for all base data witch is not dependant on a selected season or episode """Reload function for all base data witch is not dependant on a selected season or episode
:param app: GtkUi instance :param app: GtkUi instance
:param builder: Gtk.Builder with loaded UI :param builder: Gtk.Builder with loaded UI
""" """
# Rebuild all players store # Rebuild all players store
builder.get_object('all_players_store').clear() app.ui.get_object('all_players_store').clear()
for player in app.players.data: for player in app.players.data:
builder.get_object('all_players_store').append([player.id, player.name, player.hex_id]) app.ui.get_object('all_players_store').append([player.id, player.name, player.hex_id])
# Rebuild drink store # Rebuild drink store
builder.get_object('drink_store').clear() app.ui.get_object('drink_store').clear()
for drink in app.drinks.data: for drink in app.drinks.data:
builder.get_object('drink_store').append([drink.id, drink.name, '{:.2f}%'.format(drink.vol)]) app.ui.get_object('drink_store').append([drink.id, drink.name, '{:.2f}%'.format(drink.vol)])
# Rebuild seasons store # Rebuild seasons store
combo = builder.get_object('season_combo_box') # type: Gtk.ComboBox combo = app.ui.get_object('season_combo_box') # type: Gtk.ComboBox
active = combo.get_active() active = combo.get_active()
with util.block_handler(combo, app.handlers.do_season_selected): with util.block_handler(combo, app.handlers.do_season_selected):
store = builder.get_object('seasons_store') store = app.ui.get_object('seasons_store')
store.clear() store.clear()
for season in app.seasons.data: for season in app.seasons.data:
store.append([season.id, season.game_name]) store.append([season.id, season.game_name])
combo.set_active(active) combo.set_active(active)
def reload_episodes(builder: Gtk.Builder, app: 'gtk_ui.GtkUi'): def reload_episodes(app: 'gtk_ui.GtkUi'):
"""Reload all data that is dependant on a selected season """Reload all data that is dependant on a selected season
:param app: GtkUi instance :param app: GtkUi instance
:param builder: Gtk.Builder with loaded UI :param builder: Gtk.Builder with loaded UI
""" """
# Rebuild episodes store # Rebuild episodes store
selection = builder.get_object('episodes_tree_view').get_selection() if not app.get_selected_season_id(): return
selection = app.ui.get_object('episodes_tree_view').get_selection()
with util.block_handler(selection, app.handlers.on_selected_episode_changed): with util.block_handler(selection, app.handlers.on_selected_episode_changed):
model, selected_paths = selection.get_selected_rows() model, selected_paths = selection.get_selected_rows()
model.clear() model.clear()
@@ -47,6 +48,7 @@ def reload_season_stats(app: 'gtk_ui.GtkUi'):
"""Load statistic data for selected season """Load statistic data for selected season
:param app: GtkUi instance :param app: GtkUi instance
""" """
if not app.season_stats.valid: return
season_stats = app.season_stats.data season_stats = app.season_stats.data
# Load player kill/death data # Load player kill/death data
store = app.ui.get_object('player_season_store') store = app.ui.get_object('player_season_store')
@@ -57,15 +59,17 @@ def reload_season_stats(app: 'gtk_ui.GtkUi'):
# Load enemy stats for season # Load enemy stats for season
store = app.ui.get_object('enemy_season_store') store = app.ui.get_object('enemy_season_store')
store.clear() store.clear()
for enemy_name, deaths, defeated, boss in season_stats.enemies: for enemy_id, enemy_name, deaths, defeated, boss in season_stats.enemies:
store.append([enemy_name, defeated, deaths, boss]) store.append([enemy_name, defeated, deaths, boss, enemy_id])
def reload_episode_stats(app: 'gtk_ui.GtkUi'): def reload_episode_stats(app: 'gtk_ui.GtkUi'):
"""Reload all data that is dependant on a selected episode """Reload all data that is dependant on a selected episode
:param app: app: GtkUi instance :param app: app: GtkUi instance
""" """
episode = [ep for ep in app.episodes.data if ep.id == app.get_selected_episode_id()][0] ep_id = app.get_selected_episode_id()
if not app.episodes.valid or not ep_id: return
episode = [ep for ep in app.episodes.data if ep.id == ep_id][0]
store = app.ui.get_object('episode_players_store') store = app.ui.get_object('episode_players_store')
store.clear() store.clear()
for player in episode.players: for player in episode.players:
@@ -106,4 +110,12 @@ def reload_episode_stats(app: 'gtk_ui.GtkUi'):
def fill_list_store(store: Gtk.ListStore, models: list): def fill_list_store(store: Gtk.ListStore, models: list):
store.clear() store.clear()
for model in models: for model in models:
pass pass
def rebuild_view_data(app: 'gtk_ui.GtkUi'):
reload_base_data(app)
reload_episodes(app)
reload_episode_stats(app)
reload_season_stats(app)

View File

@@ -32,6 +32,8 @@
<column type="gint"/> <column type="gint"/>
<!-- column-name optional --> <!-- column-name optional -->
<column type="gboolean"/> <column type="gboolean"/>
<!-- column-name enemy_id -->
<column type="gint"/>
</columns> </columns>
</object> </object>
<object class="GtkAdjustment" id="ep_number_ajustment"> <object class="GtkAdjustment" id="ep_number_ajustment">
@@ -283,6 +285,16 @@
<column type="gchararray"/> <column type="gchararray"/>
</columns> </columns>
</object> </object>
<object class="GtkAdjustment" id="hour_adjustment">
<property name="upper">24</property>
<property name="step_increment">1</property>
<property name="page_increment">1</property>
</object>
<object class="GtkAdjustment" id="minute_adjustment">
<property name="upper">60</property>
<property name="step_increment">1</property>
<property name="page_increment">1</property>
</object>
<object class="GtkListStore" id="player_penalties_store"> <object class="GtkListStore" id="player_penalties_store">
<columns> <columns>
<!-- column-name penalty_id --> <!-- column-name penalty_id -->
@@ -1586,292 +1598,6 @@
<placeholder/> <placeholder/>
</child> </child>
</object> </object>
<object class="GtkDialog" id="edit_death_dialog">
<property name="can_focus">False</property>
<property name="title" translatable="yes">Edit Death Event</property>
<property name="resizable">False</property>
<property name="modal">True</property>
<property name="type_hint">dialog</property>
<property name="deletable">False</property>
<property name="transient_for">main_window</property>
<child internal-child="vbox">
<object class="GtkBox">
<property name="can_focus">False</property>
<property name="orientation">vertical</property>
<property name="spacing">4</property>
<child internal-child="action_area">
<object class="GtkButtonBox">
<property name="can_focus">False</property>
<property name="layout_style">end</property>
<child>
<object class="GtkButton" id="okButtonRename4">
<property name="label">gtk-ok</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="use_stock">True</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkButton" id="cancelButtonRename4">
<property name="label">gtk-cancel</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="use_stock">True</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="orientation">vertical</property>
<property name="spacing">5</property>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="spacing">5</property>
<child>
<object class="GtkLabel">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="margin_top">5</property>
<property name="margin_bottom">5</property>
<property name="label" translatable="yes">Enemy</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkComboBox" id="edit_death_enemy_combo">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="model">enemy_season_store</property>
<child>
<object class="GtkCellRendererText"/>
<attributes>
<attribute name="text">0</attribute>
</attributes>
</child>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="pack_type">end</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkLabel">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="margin_left">5</property>
<property name="margin_right">5</property>
<property name="margin_top">5</property>
<property name="margin_bottom">5</property>
<property name="label" translatable="yes">Player</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkComboBox" id="edit_death_player_combo">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="model">episode_players_store</property>
<child>
<object class="GtkCellRendererText"/>
<attributes>
<attribute name="text">1</attribute>
</attributes>
</child>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="pack_type">end</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkLabel">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="margin_left">5</property>
<property name="margin_right">5</property>
<property name="margin_top">5</property>
<property name="margin_bottom">5</property>
<property name="label" translatable="yes">Drink Size</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkSpinButton" id="edit_death_size_spin">
<property name="visible">True</property>
<property name="can_focus">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="pack_type">end</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkLabel">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">Comment</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkEntry" id="edit_death_comment_entry">
<property name="visible">True</property>
<property name="can_focus">True</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="pack_type">end</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">3</property>
</packing>
</child>
<child>
<object class="GtkTreeView" id="edit_death_penalties_tree_view">
<property name="height_request">100</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="vexpand">True</property>
<property name="model">player_penalties_store</property>
<property name="search_column">0</property>
<child internal-child="selection">
<object class="GtkTreeSelection"/>
</child>
<child>
<object class="GtkTreeViewColumn">
<property name="title" translatable="yes">Player</property>
<child>
<object class="GtkCellRendererText"/>
<attributes>
<attribute name="text">1</attribute>
</attributes>
</child>
</object>
</child>
<child>
<object class="GtkTreeViewColumn">
<property name="title" translatable="yes">Penalty</property>
<child>
<object class="GtkCellRendererCombo" id="penalty_view_drink_renderer">
<property name="editable">True</property>
<property name="has_entry">False</property>
<property name="model">drink_store</property>
<property name="text_column">1</property>
<signal name="edited" handler="on_penalty_drink_changed" swapped="no"/>
</object>
<attributes>
<attribute name="text">2</attribute>
</attributes>
</child>
</object>
</child>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">4</property>
</packing>
</child>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
</child>
<action-widgets>
<action-widget response="-5">okButtonRename4</action-widget>
<action-widget response="-6">cancelButtonRename4</action-widget>
</action-widgets>
<child>
<placeholder/>
</child>
</object>
<object class="GtkDialog" id="edit_episode_dialog"> <object class="GtkDialog" id="edit_episode_dialog">
<property name="can_focus">False</property> <property name="can_focus">False</property>
<property name="title" translatable="yes">Edit Episode</property> <property name="title" translatable="yes">Edit Episode</property>
@@ -2649,6 +2375,20 @@
<property name="position">1</property> <property name="position">1</property>
</packing> </packing>
</child> </child>
<child>
<object class="GtkCheckButton" id="enemy_optional_ckeck">
<property name="label" translatable="yes">Optional</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="draw_indicator">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
</object> </object>
<packing> <packing>
<property name="expand">False</property> <property name="expand">False</property>
@@ -2689,14 +2429,31 @@
<child> <child>
<object class="GtkTreeViewColumn"> <object class="GtkTreeViewColumn">
<property name="title" translatable="yes">Name</property> <property name="title" translatable="yes">Name</property>
<property name="expand">True</property>
<child> <child>
<object class="GtkCellRendererText"/> <object class="GtkCellRendererText">
<property name="editable">True</property>
<signal name="edited" handler="on_enemy_name_edited" swapped="no"/>
</object>
<attributes> <attributes>
<attribute name="text">0</attribute> <attribute name="text">0</attribute>
</attributes> </attributes>
</child> </child>
</object> </object>
</child> </child>
<child>
<object class="GtkTreeViewColumn">
<property name="title" translatable="yes">Boss</property>
<child>
<object class="GtkCellRendererToggle">
<signal name="toggled" handler="on_enemy_optional_edited" swapped="no"/>
</object>
<attributes>
<attribute name="active">3</attribute>
</attributes>
</child>
</object>
</child>
</object> </object>
</child> </child>
</object> </object>
@@ -2891,4 +2648,382 @@
<placeholder/> <placeholder/>
</child> </child>
</object> </object>
<object class="GtkAdjustment" id="shot_size_adjustment">
<property name="upper">100</property>
<property name="value">0.20000000000000001</property>
<property name="step_increment">0.20000000000000001</property>
</object>
<object class="GtkDialog" id="edit_death_dialog">
<property name="can_focus">False</property>
<property name="title" translatable="yes">Edit Death Event</property>
<property name="resizable">False</property>
<property name="modal">True</property>
<property name="type_hint">dialog</property>
<property name="deletable">False</property>
<property name="transient_for">main_window</property>
<child internal-child="vbox">
<object class="GtkBox">
<property name="can_focus">False</property>
<property name="orientation">vertical</property>
<property name="spacing">4</property>
<child internal-child="action_area">
<object class="GtkButtonBox">
<property name="can_focus">False</property>
<property name="layout_style">end</property>
<child>
<object class="GtkButton" id="okButtonRename4">
<property name="label">gtk-ok</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="use_stock">True</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkButton" id="cancelButtonRename4">
<property name="label">gtk-cancel</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="use_stock">True</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="orientation">vertical</property>
<property name="spacing">5</property>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="spacing">5</property>
<child>
<object class="GtkLabel">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="margin_top">5</property>
<property name="margin_bottom">5</property>
<property name="label" translatable="yes">Time</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkSpinButton" id="death_hour_spin">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="max_length">2</property>
<property name="input_purpose">number</property>
<property name="adjustment">hour_adjustment</property>
<property name="numeric">True</property>
<property name="update_policy">if-valid</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkLabel">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">:</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkSpinButton" id="death_min_spin">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="max_length">2</property>
<property name="input_purpose">number</property>
<property name="adjustment">minute_adjustment</property>
<property name="numeric">True</property>
<property name="update_policy">if-valid</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="pack_type">end</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="spacing">5</property>
<child>
<object class="GtkLabel">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="margin_top">5</property>
<property name="margin_bottom">5</property>
<property name="label" translatable="yes">Enemy</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkComboBox" id="edit_death_enemy_combo">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="model">enemy_season_store</property>
<child>
<object class="GtkCellRendererText"/>
<attributes>
<attribute name="text">0</attribute>
</attributes>
</child>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="pack_type">end</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkLabel">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="margin_left">5</property>
<property name="margin_right">5</property>
<property name="margin_top">5</property>
<property name="margin_bottom">5</property>
<property name="label" translatable="yes">Player</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkComboBox" id="edit_death_player_combo">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="model">episode_players_store</property>
<child>
<object class="GtkCellRendererText"/>
<attributes>
<attribute name="text">1</attribute>
</attributes>
</child>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="pack_type">end</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkLabel">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="margin_left">5</property>
<property name="margin_right">5</property>
<property name="margin_top">5</property>
<property name="margin_bottom">5</property>
<property name="label" translatable="yes">Drink Size</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkSpinButton" id="edit_death_size_spin">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="adjustment">shot_size_adjustment</property>
<property name="digits">1</property>
<property name="numeric">True</property>
<property name="update_policy">if-valid</property>
<property name="value">0.20000000000000001</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="pack_type">end</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">3</property>
</packing>
</child>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkLabel">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">Comment</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkEntry" id="edit_death_comment_entry">
<property name="visible">True</property>
<property name="can_focus">True</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="pack_type">end</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">4</property>
</packing>
</child>
<child>
<object class="GtkTreeView" id="edit_death_penalties_tree_view">
<property name="height_request">100</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="vexpand">True</property>
<property name="model">player_penalties_store</property>
<property name="search_column">0</property>
<child internal-child="selection">
<object class="GtkTreeSelection"/>
</child>
<child>
<object class="GtkTreeViewColumn">
<property name="title" translatable="yes">Player</property>
<child>
<object class="GtkCellRendererText"/>
<attributes>
<attribute name="text">1</attribute>
</attributes>
</child>
</object>
</child>
<child>
<object class="GtkTreeViewColumn">
<property name="title" translatable="yes">Penalty</property>
<child>
<object class="GtkCellRendererCombo" id="penalty_view_drink_renderer">
<property name="editable">True</property>
<property name="has_entry">False</property>
<property name="model">drink_store</property>
<property name="text_column">1</property>
<signal name="edited" handler="on_penalty_drink_changed" swapped="no"/>
</object>
<attributes>
<attribute name="text">2</attribute>
</attributes>
</child>
</object>
</child>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">5</property>
</packing>
</child>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
</child>
<action-widgets>
<action-widget response="-5">okButtonRename4</action-widget>
<action-widget response="-6">cancelButtonRename4</action-widget>
</action-widgets>
<child>
<placeholder/>
</child>
</object>
</interface> </interface>

View File

@@ -26,6 +26,10 @@ class ReadFunctions:
def load_players(*_): def load_players(*_):
return [mapping.db_to_player(player) for player in sql.Player.select()] return [mapping.db_to_player(player) for player in sql.Player.select()]
@staticmethod
def load_enemies(season_id, *_):
pass
@staticmethod @staticmethod
def load_drinks(*_): def load_drinks(*_):
return [mapping.db_to_drink(drink) for drink in sql.Drink.select()] return [mapping.db_to_drink(drink) for drink in sql.Drink.select()]
@@ -39,7 +43,8 @@ class ReadFunctions:
sql_func.get_player_victories_for_season(season_id, player.id), sql_func.get_player_victories_for_season(season_id, player.id),
sql_func.get_player_deaths_for_season(season_id, player.id)) sql_func.get_player_deaths_for_season(season_id, player.id))
for player in players] for player in players]
model.enemies = [(enemy.name, model.enemies = [(enemy.id,
enemy.name,
sql_func.enemy_attempts(enemy.id), sql_func.enemy_attempts(enemy.id),
sql.Victory.select().where(sql.Victory.enemy == enemy.id).exists(), sql.Victory.select().where(sql.Victory.enemy == enemy.id).exists(),
enemy.boss) enemy.boss)

View File

@@ -7,6 +7,15 @@ class WriteFunctions:
def create_season(season: 'models.Season'): def create_season(season: 'models.Season'):
return 'Season created.' return 'Season created.'
@staticmethod
def update_enemy(enemy: 'models.Enemy'):
(sql.Enemy
.insert(id=enemy.id, boss=enemy.boss, name=enemy.name, season=enemy.season)
.on_conflict(update={sql.Enemy.name: enemy.name,
sql.Enemy.boss: enemy.boss,
sql.Enemy.season: enemy.season})
.execute())
@staticmethod @staticmethod
def update_season(season: 'models.Season', *_): def update_season(season: 'models.Season', *_):
(sql.Season (sql.Season