Create attractive VASL scenarios, with loads of useful information embedded to assist with game play.
https://vasl-templates.org
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
88 lines
2.9 KiB
88 lines
2.9 KiB
""" Web channel handler. """
|
|
|
|
import os
|
|
|
|
from PyQt5.QtWidgets import QFileDialog
|
|
|
|
from vasl_templates.webapp.config.constants import APP_NAME
|
|
|
|
# ---------------------------------------------------------------------
|
|
|
|
class WebChannelHandler:
|
|
"""Handle web channel requests."""
|
|
|
|
_FILE_FILTERS = "Scenario files (*.json);;All files (*)"
|
|
|
|
def __init__( self, window ):
|
|
|
|
# initialize
|
|
self._window = window
|
|
|
|
# NOTE: While loading/saving scenarios works fine when handled by the embedded browser,
|
|
# we can't get the full path of the file saved loaded (because of browser security).
|
|
# This means that we can't e.g. default saving a scenario to the same file it was loaded from.
|
|
# This is such a lousy UX, we handle load/save operations ourself, where we can manage this.
|
|
self._curr_scenario_fname = None
|
|
|
|
def on_new_scenario( self ):
|
|
"""Called when the scenario is reset."""
|
|
self._curr_scenario_fname = None
|
|
|
|
def load_scenario( self ):
|
|
"""Called when the user wants to load a scenario."""
|
|
|
|
# ask the user which file to load
|
|
fname, _ = QFileDialog.getOpenFileName(
|
|
self._window, "Load scenario",
|
|
os.path.split(self._curr_scenario_fname)[0] if self._curr_scenario_fname else None,
|
|
WebChannelHandler._FILE_FILTERS
|
|
)
|
|
if not fname:
|
|
return None
|
|
|
|
# load the scenario
|
|
try:
|
|
with open( fname, "r", encoding="utf-8" ) as fp:
|
|
data = fp.read()
|
|
except Exception as ex: #pylint: disable=broad-except
|
|
self._window.showErrorMsg( "Can't load the scenario:\n\n{}".format( ex ) )
|
|
return None
|
|
self._curr_scenario_fname = fname
|
|
|
|
return data
|
|
|
|
def save_scenario( self, data ):
|
|
"""Called when the user wants to save a scenario."""
|
|
|
|
# ask the user where to save the scenario
|
|
fname, _ = QFileDialog.getSaveFileName(
|
|
self._window, "Save scenario",
|
|
self._curr_scenario_fname,
|
|
WebChannelHandler._FILE_FILTERS
|
|
)
|
|
if not fname:
|
|
return False
|
|
|
|
# check the file extension
|
|
extn = os.path.splitext( fname )[1]
|
|
if not extn:
|
|
fname += ".json"
|
|
elif fname.endswith( "." ):
|
|
fname = fname[:-1]
|
|
|
|
# save the file
|
|
try:
|
|
with open( fname, "w", encoding="utf-8" ) as fp:
|
|
fp.write( data )
|
|
except Exception as ex: #pylint: disable=broad-except
|
|
self._window.showErrorMsg( "Can't save the scenario:\n\n{}".format( ex ) )
|
|
return False
|
|
self._curr_scenario_fname = fname
|
|
|
|
return True
|
|
|
|
def on_scenario_name_change( self, val ):
|
|
"""Update the main window title to show the scenario name."""
|
|
self._window.setWindowTitle(
|
|
"{} - {}".format( APP_NAME, val ) if val else APP_NAME
|
|
)
|
|
|