Files
DrunkSoulsStatTool/dsst/dsst_gtk3/dialogs.py
2018-03-12 20:09:04 +01:00

185 lines
7.5 KiB
Python

"""
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
def enter_string_dialog(builder: Gtk.Builder, title: str, value=None) -> str:
""" Simple modal dialog for entering a string value
:param builder: GtkBuilder with loaded dialogs.glade file
:param title: Dialog title
:param value: Pre set value for dialog
:return:
"""
dialog = builder.get_object("nameEnterDialog") # type: Gtk.Dialog
dialog.set_transient_for(builder.get_object("main_window"))
dialog.set_title(title)
entry = builder.get_object("nameEnterEntry")
if value:
entry.set_text(value)
entry.grab_focus()
result = dialog.run()
dialog.hide()
if result == Gtk.ResponseType.OK:
return entry.get_text()
else:
return value
def edit_season(builder: 'Gtk.Builder', season: 'models.Season'=None):
if not season:
season = models.Season()
builder.get_object('season_number_spin').set_value(season.number or 1)
builder.get_object('season_game_entry').set_text(season.game_name or '')
builder.get_object('season_start_entry').set_text(season.start_date or '')
builder.get_object('season_end_entry').set_text(season.end_date or '')
dialog = builder.get_object('edit_season_dialog')
result = dialog.run()
dialog.hide()
if result != Gtk.ResponseType.OK:
return None
season.number = builder.get_object('season_number_spin').get_value()
season.game_name = builder.get_object('season_game_entry').get_text()
start_string = builder.get_object('season_start_entry').get_text()
if start_string:
season.start_date = datetime.datetime.strptime(start_string, '%Y-%m-%d')
end_string = builder.get_object('season_end_entry').get_text()
if end_string:
season.end_date = datetime.datetime.strptime(end_string, '%Y-%m-%d')
return season
def edit_episode(app: 'gtk_ui.GtkUi', season_id: int, episode: 'models.Episode'=None):
"""Show an dialog to create or edit episodes
:param app: Reference to main UI application
:param season_id: Is of the season in which the episode appears
:param episode: Existing episode object to edit
:return: Edited episode object, or None if the process was canceled
"""
if not episode:
episode = models.Episode()
episode.date = datetime.datetime.today()
episode.number = 1
episode.name = ''
episode.players = []
app.ui.get_object('episode_name_entry').set_text(episode.name)
app.ui.get_object('episode_no_spin_button').set_value(episode.number)
app.ui.get_object('episode_calendar').select_month(episode.date.month, episode.date.year)
app.ui.get_object('episode_calendar').select_day(episode.date.day)
app.ui.get_object('episode_players_store').clear()
for player in episode.players:
app.ui.get_object('episode_players_store').append([player.id, player.name, player.hex_id])
dialog = app.ui.get_object('edit_episode_dialog') # type: Gtk.Dialog
result = dialog.run()
dialog.hide()
if result != Gtk.ResponseType.OK:
return None
episode.name = app.ui.get_object('episode_name_entry').get_text()
episode.number = app.ui.get_object('episode_no_spin_button').get_value()
cal_value = app.ui.get_object('episode_calendar').get_date()
selected_date = datetime.datetime(*cal_value).date()
episode.date = selected_date
player_ids = [row[0] for row in app.ui.get_object('episode_players_store')]
episode.players = [app.get_by_id(app.players, player_id) for player_id in player_ids]
episode.season = season_id
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 show_edit_victory_dialog(builder: Gtk.Builder, episode_id: int, victory):
pass
# """Show a dialog for editing or creating victory events.
# :param builder: A Gtk.Builder object
# :param episode_id: ID to witch the victory event belongs to
# :param victory: (Optional) Victory event witch should be edited
# :return: Gtk.ResponseType of the dialog
# """
# dialog = builder.get_object("edit_victory_dialog") # type: Gtk.Dialog
# dialog.set_transient_for(builder.get_object("main_window"))
# with sql.db.atomic():
# if victory:
# infos = [['edit_victory_player_combo', victory.player.id],
# ['edit_victory_enemy_combo', victory.enemy.id]]
# for info in infos:
# combo = builder.get_object(info[0])
# index = util.get_index_of_combo_model(combo, 0, info[1])
# combo.set_active(index)
# builder.get_object('victory_comment_entry').set_text(victory.info)
#
# # 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_victory_player_combo'), 0)
# enemy_id = util.get_combo_value(builder.get_object('edit_victory_enemy_combo'), 3)
# comment = builder.get_object('victory_comment_entry').get_text()
# if not victory:
# sql.Victory.create(episode=episode_id, player=player_id, enemy=enemy_id, info=comment)
# else:
# victory.player = player_id
# victory.enemy = enemy_id
# victory.info = comment
# victory.save()
#
# return result