diff --git a/vasl_templates/webapp/data/default-template-pack/turn_track.j2 b/vasl_templates/webapp/data/default-template-pack/turn_track.j2 index 99f07be..d6b7c59 100644 --- a/vasl_templates/webapp/data/default-template-pack/turn_track.j2 +++ b/vasl_templates/webapp/data/default-template-pack/turn_track.j2 @@ -28,6 +28,9 @@ td.half-turn { {% if TURN_TRACK_PREVIEW_MODE %} body { margin: 0 ; } +body ::selection {} +body ::moz-selection {} +body { user-select: none ; } .reinforce1, .reinforce2 { opacity: 0 ; } .flag-click { width: 13px ; height: 13px ; cursor: pointer ; } .shading-click { cursor: pointer ; } @@ -63,13 +66,13 @@ function onShadingClick( turnNo ) { {% for turnSquare in row %}
{% if TURN_TRACK_PREVIEW_MODE %}
{% if TURN_TRACK_PREVIEW_MODE and turnSquare[0] != TURN_TRACK_HALF_TURN %}
args.nTurns ) break ; - var val = [ turnNo, - args.shading[turnNo] ? true : false, + var vals = [ turnNo, args.reinforce2[turnNo] ? true : false, args.reinforce1[turnNo] ? true : false, ] ; if ( params.TURN_TRACK.SWAP_PLAYERS ) - val = [ val[0], val[1], val[3], val[2] ] ; - turnTrackSquares[ turnTrackSquares.length-1 ].push( val ) ; + vals = [ vals[0], vals[2], vals[1] ] ; + if ( shadings[turnNo] ) + vals.push( gAppConfig.TURN_TRACK_SHADING_COLORS[ shadings[turnNo] - 1 ] ) ; + turnTrackSquares[ turnTrackSquares.length-1 ].push( vals ) ; nTurnTrackSquares += 1 ; } } @@ -550,7 +552,6 @@ function make_turn_track_params( params ) params.TURN_TRACK_HALF_TURN_IMAGE_URL = forceLocalImages ? make_app_url( "/static/images/turn-track-half-turn.png", true ) : params.IMAGES_BASE_URL + "/turn-track-half-turn.png" ; - params.TURN_TRACK_SHADING_COLOR = TURN_TRACK_SHADING_COLOR ; // NOTE: The convention is that player 1 sets up first, player 2 moves first, // so swapping players actually maps turn track player 1 to the real player 1. // NOTE: We generate the player flag URL's instead of using params.PLAYER_FLAG_1/2 @@ -567,12 +568,16 @@ function make_turn_track_params( params ) function parseTurnTrackParams( params ) { - function parseCommaList( reinf ) { - var turnFlags = {} ; + function parseCommaList( reinf, verbatim ) { + var turnFlags = verbatim ? [] : {} ; reinf.split( "," ).forEach( function( turnNo ) { - turnNo = parseInt( turnNo.trim() ) ; - if ( ! isNaN( turnNo ) ) - turnFlags[ turnNo ] = true ; + if ( verbatim ) + turnFlags.push( turnNo.trim() ) ; + else { + turnNo = parseInt( turnNo.trim() ) ; + if ( ! isNaN( turnNo ) ) + turnFlags[ turnNo ] = true ; + } } ) ; return turnFlags ; } @@ -588,13 +593,13 @@ function parseTurnTrackParams( params ) var width = params.TURN_TRACK.WIDTH ; if ( width === "" ) width = vertical ? 1 : nTurns ; - var shading = parseCommaList( params.TURN_TRACK.SHADING ) ; - var reinforce1 = parseCommaList( params.TURN_TRACK.REINFORCEMENTS_1 ) ; - var reinforce2 = parseCommaList( params.TURN_TRACK.REINFORCEMENTS_2 ) ; + var shadings = parseCommaList( params.TURN_TRACK.SHADING, true ) ; + var reinforce1 = parseCommaList( params.TURN_TRACK.REINFORCEMENTS_1, false ) ; + var reinforce2 = parseCommaList( params.TURN_TRACK.REINFORCEMENTS_2, false ) ; return { nTurns: nTurns, halfTurn: halfTurn, - vertical: vertical, width: width, shading: shading, + vertical: vertical, width: width, shadings: shadings, reinforce1: reinforce1, reinforce2: reinforce2 } ; } diff --git a/vasl_templates/webapp/static/turn_track.js b/vasl_templates/webapp/static/turn_track.js index 801b79f..5be8fc7 100644 --- a/vasl_templates/webapp/static/turn_track.js +++ b/vasl_templates/webapp/static/turn_track.js @@ -1,12 +1,11 @@ DEFAULT_TURN_TRACK_TURNS_MIN = 6 ; DEFAULT_TURN_TRACK_TURNS_MAX = 10 ; -TURN_TRACK_SHADING_COLOR = "#e0e0e0" ; // NOTE: Reinforcement flags get clipped on turn 100, but this is unlikely to be an issue :-/ _MAX_TURN_TRACK_TURNS = 100 ; gTurnTrackReinforcements = null ; -gTurnTrackShading = null ; +gTurnTrackShadings = null ; // -------------------------------------------------------------------- @@ -16,7 +15,7 @@ function editTurnTrackSettings() var $dlg, $iframe, iframeSeqNo=0 ; // FUDGE! This should work as a local variable, but causes a weird problem where it doesn't get reset properly :-/ gTurnTrackReinforcements = null ; - gTurnTrackShading = null ; + gTurnTrackShadings = null ; function loadControls() { // load the dialog controls @@ -37,7 +36,7 @@ function editTurnTrackSettings() var params = updatePreview( false ) ; var args = parseTurnTrackParams( params ) ; gTurnTrackReinforcements = { 1: args.reinforce1, 2: args.reinforce2 } ; - gTurnTrackShading = args.shading ; + gTurnTrackShadings = parseTurnTrackShadings( args.shadings ) ; // update the UI updateUI() ; } @@ -54,7 +53,7 @@ function editTurnTrackSettings() $panel.find( "input[name='TURN_TRACK_REINFORCEMENTS_1']" ).val( "" ) ; $panel.find( "input[name='TURN_TRACK_REINFORCEMENTS_2']" ).val( "" ) ; gTurnTrackReinforcements = null ; - gTurnTrackShading = null ; + gTurnTrackShadings = null ; loadControls() ; } } ) ; @@ -150,16 +149,27 @@ function editTurnTrackSettings() function onShadingClick( turnNo ) { // NOTE: This method gets called by a click handler in the snippet HTML. // toggle the turn track square's shading - if ( gTurnTrackShading[turnNo] ) - delete gTurnTrackShading[turnNo] ; - else - gTurnTrackShading[turnNo] = true ; - $panel.find( "input[name='TURN_TRACK_SHADING']" ).val( - Object.keys( gTurnTrackShading ).join( "," ) - ) ; - $iframe.contents().find( "#turn-square-" + turnNo ).css( { - "background-color": gTurnTrackShading && gTurnTrackShading[turnNo] ? TURN_TRACK_SHADING_COLOR : "inherit" + // determine the new shading strength + var strength = gTurnTrackShadings[turnNo] || 0 ; + var col ; + if ( ++strength <= gAppConfig.TURN_TRACK_SHADING_COLORS.length ) { + gTurnTrackShadings[turnNo] = strength ; + col = gAppConfig.TURN_TRACK_SHADING_COLORS[ strength-1 ] ; + } else { + delete gTurnTrackShadings[turnNo] ; + col = "inherit" ; + } + // update the saved setting + var shadings = [] ; + Object.keys( gTurnTrackShadings ).forEach( function( key ) { + var strength = gTurnTrackShadings[key] ; + for ( var i=1 ; i < strength ; ++i ) + key += "+" ; + shadings.push( key ) ; } ) ; + $panel.find( "input[name='TURN_TRACK_SHADING']" ).val( shadings.join( "," ) ) ; + // update the turn square in the UI + $iframe.contents().find( "#turn-square-" + turnNo ).css( { "background-color": col } ) ; } function updateFlag( turnNo, playerNo ) { @@ -322,6 +332,26 @@ function updateTurnTrackNTurns( nTurns ) } } +function parseTurnTrackShadings( shadings ) { + // NOTE: A turn track shading setting consists of a number (the turn number), + // followed by 0 or more plus signs (to indicate a darker shading color). + var shadingTable = {} ; + shadings.forEach( function( shading ) { + var strength = 1 ; + while ( shading.length > 0 && shading.substr( shading.length-1 ) === "+" ) { + strength += 1 ; + shading = shading.substr( 0, shading.length-1 ) ; + } + if ( strength > gAppConfig.TURN_TRACK_SHADING_COLORS.length ) + return ; + var turnNo = parseInt( shading ) ; + if ( isNaN( turnNo ) ) + return ; + shadingTable[turnNo] = strength ; + } ) ; + return shadingTable ; +} + function formatTurnTrackOption( opt ) { // format the turn track