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.
 
 
 
 
 
 
vasl-templates/vasl_templates/web_channel.py

101 lines
4.0 KiB

""" Web channel handler. """
import os
import base64
from PyQt5.QtWidgets import QApplication
from PyQt5.QtGui import QImage
from vasl_templates.webapp.config.constants import APP_NAME
from vasl_templates.file_dialog import FileDialog
# ---------------------------------------------------------------------
class WebChannelHandler:
"""Handle web channel requests."""
def __init__( self, parent ):
self.parent = parent
self.scenario_file_dialog = FileDialog(
self.parent,
"scenario", ".json",
"Scenario files (*.json);;All files (*)",
None
)
self.updated_vsav_file_dialog = FileDialog(
self.parent,
"VASL scenario", ".vsav",
"VASL scenario files (*.vsav);;All files (*)",
"scenario.vsav"
)
self.log_file_analysis_dialog = FileDialog(
self.parent,
"log file analysis", ".csv",
"Analysis files (*.csv);;All files (*)",
None
)
def on_new_scenario( self ):
"""Called when the scenario is reset."""
self.scenario_file_dialog.curr_fname = None
self.updated_vsav_file_dialog.curr_fname = None
def load_scenario( self ):
"""Called when the user wants to load a scenario."""
data = self.scenario_file_dialog.load_file( False )
if data is None:
return None, None
self.updated_vsav_file_dialog.curr_fname = None
return self.scenario_file_dialog.curr_fname, data
def save_scenario( self, fname, data ):
"""Called when the user wants to save a scenario."""
prev_curr_fname = self.scenario_file_dialog.curr_fname
if not self.scenario_file_dialog.curr_fname:
# NOTE: We are tracking the current scenario filename ourself, so we only use the filename
# passed to us by the web page if a new scenario is being saved for the first time.
self.scenario_file_dialog.curr_fname = fname
rc = self.scenario_file_dialog.save_file( data )
if not rc:
self.scenario_file_dialog.curr_fname = prev_curr_fname
return None
return self.scenario_file_dialog.curr_fname
def on_update_scenario_status( self, caption, is_dirty ):
"""Update the main window title to show the scenario details."""
title = APP_NAME
if caption:
title += " - {}".format( caption )
if is_dirty:
title += " (*)"
self.parent.setWindowTitle( title )
def on_snippet_image( self, img_data ):
"""Called when a snippet image has been generated."""
# NOTE: We could maybe add an HTML object to the clipboard as well, but having two formats on the clipboard
# simultaneously might confuse some programs, causing problems for no real benefit :shrug:
img = QImage.fromData( base64.b64decode( img_data ) )
QApplication.clipboard().setImage( img )
def load_vsav( self ):
"""Called when the user wants to load a VASL scenario to update."""
data = self.updated_vsav_file_dialog.load_file( True )
if data is None:
return None, None
fname = os.path.split( self.updated_vsav_file_dialog.curr_fname )[1]
return fname, data
def save_updated_vsav( self, fname, data ):
"""Called when a VASL scenario has been updated and is ready to be saved."""
dname = os.path.split( self.updated_vsav_file_dialog.curr_fname )[0]
self.updated_vsav_file_dialog.curr_fname = os.path.join( dname, fname )
return self.updated_vsav_file_dialog.save_file( data )
def save_log_file_analysis( self, data ):
"""Called when the user wants to save a log file analysis."""
prev_curr_fname = self.log_file_analysis_dialog.curr_fname
if not self.log_file_analysis_dialog.curr_fname:
self.log_file_analysis_dialog.curr_fname = "analysis.csv"
rc = self.log_file_analysis_dialog.save_file( data )
if not rc:
self.log_file_analysis_dialog.curr_fname = prev_curr_fname