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.episode = arg.get('episode')
self.penalties = arg.get('penalties')
self.time = arg.get('time')
class Penalty:

View File

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

View File

@@ -40,35 +40,32 @@ class GtkUi:
self.meta = {'connection': '{}:{}'.format(config.get('host'), config.get('port'))}
# Load base data and seasons
self.load_server_meta()
self.reload()
self.full_reload()
self.update_status_bar_meta()
def load_server_meta(self):
self.meta['database'] = self.data_client.send_request('load_db_meta')
def reload(self):
def full_reload(self):
with util.network_operation(self):
refresh_base = False
if not self.players.valid:
self.players.data = self.data_client.send_request('load_players')
refresh_base = True
if not self.drinks.valid:
self.drinks.data = self.data_client.send_request('load_drinks')
refresh_base= True
if not self.seasons.valid:
self.seasons.data = self.data_client.send_request('load_seasons')
refresh_base = True
if refresh_base:
reload.reload_base_data(self.ui, self)
if not self.episodes.valid:
with util.network_operation(self):
season_id = self.get_selected_season_id()
if season_id:
self.episodes.data = self.data_client.send_request('load_episodes', season_id)
self.season_stats.data = self.data_client.send_request('load_season_stats', season_id)
reload.reload_episodes(self.ui, self)
reload.reload_season_stats(self)
cur_season = [s for s in self.seasons.data if s.id == season_id][0]
self.enemies.data = cur_season.enemies
reload.rebuild_view_data(self)
def reload(self):
pass
def update_enemy(self, enemy: 'models.Enemy'):
with util.network_operation(self):
self.data_client.send_request('update_enemy', enemy)
self.full_reload()
def update_season(self, season: 'models.Season'):
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:
@@ -6,48 +6,42 @@ class BaseDataHandlers:
def __init__(self, app: 'gtk_ui.GtkUi'):
self.app = app
def do_manage_players(self, *_):
dialogs.run_management_dialog(self.app.ui, 'manage_players_dialog')
def do_add_player(self, entry):
if entry.get_text():
# sql.Player.create(name=entry.get_text())
entry.set_text('')
self.app.reload()
def do_manage_enemies(self, *_):
dialogs.run_management_dialog(self.app.ui, 'manage_enemies_dialog')
self.app.full_reload()
def on_player_name_edited(self, _, index, value):
row = self.app.ui.get_object('all_players_store')[index]
# sql.Player.update(name=value)\
# .where(sql.Player.id == row[0])\
# .execute()
self.app.reload()
self.app.full_reload()
def on_player_hex_edited(self, _, index, value):
row = self.app.ui.get_object('all_players_store')[index]
# sql.Player.update(hex_id=value)\
# .where(sql.Player.id == row[0])\
# .execute()
self.app.reload()
self.app.full_reload()
def do_add_drink(self, entry):
if entry.get_text():
sql.Drink.create(name=entry.get_text(), vol=0)
entry.set_text('')
self.app.reload()
self.app.full_reload()
def on_drink_name_edited(self, _, index, value):
row = self.app.ui.get_object('drink_store')[index]
# sql.Drink.update(name=value)\
# .where(sql.Drink.id == row[0])\
# .execute()
self.app.reload()
self.app.full_reload()
def on_drink_vol_edited(self, _, index, value):
row = self.app.ui.get_object('drink_store')[index]
# sql.Drink.update(vol=value) \
# .where(sql.Drink.id == row[0]) \
# .execute()
self.app.reload()
self.app.full_reload()

View File

@@ -1,5 +1,5 @@
from gi.repository import Gtk
from dsst_gtk3 import dialogs
from dsst_gtk3 import dialogs, gtk_ui
class DeathHandlers:
@@ -11,9 +11,10 @@ class DeathHandlers:
ep_id = self.app.get_selected_episode_id()
if not ep_id:
return
result = dialogs.show_edit_death_dialog(self.app.ui, ep_id)
result = dialogs.edit_death(self.app)
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):
self.app.ui.get_object('player_penalties_store')[path][2] = text

View File

@@ -1,6 +1,7 @@
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
@@ -29,10 +30,28 @@ class DialogHandlers:
def do_add_enemy(self, entry):
if entry.get_text():
store = self.app.ui.get_object('enemy_season_store')
# enemy = sql.Enemy.create(name=entry.get_text(), season=self.app.get_selected_season_id())
# store.append([enemy.name, False, 0, enemy.id])
enemy = models.Enemy()
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('')
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', *_):
dialog = self.app.ui.get_object('date_picker_dialog')
result = dialog.run()

View File

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

View File

@@ -13,4 +13,4 @@ class VictoryHandlers:
return
result = dialogs.show_edit_victory_dialog(self.app.ui, ep_id)
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
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
:param app: GtkUi instance
:param builder: Gtk.Builder with loaded UI
"""
# 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:
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
builder.get_object('drink_store').clear()
app.ui.get_object('drink_store').clear()
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
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()
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()
for season in app.seasons.data:
store.append([season.id, season.game_name])
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
:param app: GtkUi instance
:param builder: Gtk.Builder with loaded UI
"""
# 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):
model, selected_paths = selection.get_selected_rows()
model.clear()
@@ -47,6 +48,7 @@ def reload_season_stats(app: 'gtk_ui.GtkUi'):
"""Load statistic data for selected season
:param app: GtkUi instance
"""
if not app.season_stats.valid: return
season_stats = app.season_stats.data
# Load player kill/death data
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
store = app.ui.get_object('enemy_season_store')
store.clear()
for enemy_name, deaths, defeated, boss in season_stats.enemies:
store.append([enemy_name, defeated, deaths, boss])
for enemy_id, enemy_name, deaths, defeated, boss in season_stats.enemies:
store.append([enemy_name, defeated, deaths, boss, enemy_id])
def reload_episode_stats(app: 'gtk_ui.GtkUi'):
"""Reload all data that is dependant on a selected episode
: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.clear()
for player in episode.players:
@@ -107,3 +111,11 @@ def fill_list_store(store: Gtk.ListStore, models: list):
store.clear()
for model in models:
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-name optional -->
<column type="gboolean"/>
<!-- column-name enemy_id -->
<column type="gint"/>
</columns>
</object>
<object class="GtkAdjustment" id="ep_number_ajustment">
@@ -283,6 +285,16 @@
<column type="gchararray"/>
</columns>
</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">
<columns>
<!-- column-name penalty_id -->
@@ -1586,292 +1598,6 @@
<placeholder/>
</child>
</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">
<property name="can_focus">False</property>
<property name="title" translatable="yes">Edit Episode</property>
@@ -2649,6 +2375,20 @@
<property name="position">1</property>
</packing>
</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>
<packing>
<property name="expand">False</property>
@@ -2689,14 +2429,31 @@
<child>
<object class="GtkTreeViewColumn">
<property name="title" translatable="yes">Name</property>
<property name="expand">True</property>
<child>
<object class="GtkCellRendererText"/>
<object class="GtkCellRendererText">
<property name="editable">True</property>
<signal name="edited" handler="on_enemy_name_edited" swapped="no"/>
</object>
<attributes>
<attribute name="text">0</attribute>
</attributes>
</child>
</object>
</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>
</child>
</object>
@@ -2891,4 +2648,382 @@
<placeholder/>
</child>
</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>

View File

@@ -26,6 +26,10 @@ class ReadFunctions:
def load_players(*_):
return [mapping.db_to_player(player) for player in sql.Player.select()]
@staticmethod
def load_enemies(season_id, *_):
pass
@staticmethod
def load_drinks(*_):
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_deaths_for_season(season_id, player.id))
for player in players]
model.enemies = [(enemy.name,
model.enemies = [(enemy.id,
enemy.name,
sql_func.enemy_attempts(enemy.id),
sql.Victory.select().where(sql.Victory.enemy == enemy.id).exists(),
enemy.boss)

View File

@@ -7,6 +7,15 @@ class WriteFunctions:
def create_season(season: 'models.Season'):
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
def update_season(season: 'models.Season', *_):
(sql.Season