From 9a213fa0d29cd14e8cc896cdd360cc60a0a01644 Mon Sep 17 00:00:00 2001 From: Taka Date: Mon, 23 Jul 2018 15:14:36 +0000 Subject: [PATCH] Added hotkeys. --- .../webapp/static/hotkey/jquery.hotkey.js | 206 ++++++++++++++++++ vasl_templates/webapp/static/main.js | 35 +++ vasl_templates/webapp/templates/index.html | 7 +- 3 files changed, 245 insertions(+), 3 deletions(-) create mode 100644 vasl_templates/webapp/static/hotkey/jquery.hotkey.js diff --git a/vasl_templates/webapp/static/hotkey/jquery.hotkey.js b/vasl_templates/webapp/static/hotkey/jquery.hotkey.js new file mode 100644 index 0000000..113d7ac --- /dev/null +++ b/vasl_templates/webapp/static/hotkey/jquery.hotkey.js @@ -0,0 +1,206 @@ +/*jslint browser: true*/ +/*jslint jquery: true*/ + +/* + * jQuery Hotkeys Plugin + * Copyright 2010, John Resig + * Dual licensed under the MIT or GPL Version 2 licenses. + * + * Based upon the plugin by Tzury Bar Yochay: + * https://github.com/tzuryby/jquery.hotkeys + * + * Original idea by: + * Binny V A, http://www.openjs.com/scripts/events/keyboard_shortcuts/ + */ + +/* + * One small change is: now keys are passed by object { keys: '...' } + * Might be useful, when you want to pass some other data to your handler + */ + +(function(jQuery) { + + jQuery.hotkeys = { + version: "0.2.0", + + specialKeys: { + 8: "backspace", + 9: "tab", + 10: "return", + 13: "return", + 16: "shift", + 17: "ctrl", + 18: "alt", + 19: "pause", + 20: "capslock", + 27: "esc", + 32: "space", + 33: "pageup", + 34: "pagedown", + 35: "end", + 36: "home", + 37: "left", + 38: "up", + 39: "right", + 40: "down", + 45: "insert", + 46: "del", + 59: ";", + 61: "=", + 96: "0", + 97: "1", + 98: "2", + 99: "3", + 100: "4", + 101: "5", + 102: "6", + 103: "7", + 104: "8", + 105: "9", + 106: "*", + 107: "+", + 109: "-", + 110: ".", + 111: "/", + 112: "f1", + 113: "f2", + 114: "f3", + 115: "f4", + 116: "f5", + 117: "f6", + 118: "f7", + 119: "f8", + 120: "f9", + 121: "f10", + 122: "f11", + 123: "f12", + 144: "numlock", + 145: "scroll", + 173: "-", + 186: ";", + 187: "=", + 188: ",", + 189: "-", + 190: ".", + 191: "/", + 192: "`", + 219: "[", + 220: "\\", + 221: "]", + 222: "'" + }, + + shiftNums: { + "`": "~", + "1": "!", + "2": "@", + "3": "#", + "4": "$", + "5": "%", + "6": "^", + "7": "&", + "8": "*", + "9": "(", + "0": ")", + "-": "_", + "=": "+", + ";": ": ", + "'": "\"", + ",": "<", + ".": ">", + "/": "?", + "\\": "|" + }, + + // excludes: button, checkbox, file, hidden, image, password, radio, reset, search, submit, url + textAcceptingInputTypes: [ + "text", "password", "number", "email", "url", "range", "date", "month", "week", "time", "datetime", + "datetime-local", "search", "color", "tel"], + + // default input types not to bind to unless bound directly + textInputTypes: /textarea|input|select/i, + + options: { + filterInputAcceptingElements: true, + filterTextInputs: true, + filterContentEditable: true + } + }; + + function keyHandler(handleObj) { + if (typeof handleObj.data === "string") { + handleObj.data = { + keys: handleObj.data + }; + } + + // Only care when a possible input has been specified + if (!handleObj.data || !handleObj.data.keys || typeof handleObj.data.keys !== "string") { + return; + } + + var origHandler = handleObj.handler, + keys = handleObj.data.keys.toLowerCase().split(" "); + + handleObj.handler = function(event) { + // Don't fire in text-accepting inputs that we didn't directly bind to + if (this !== event.target && + (jQuery.hotkeys.options.filterInputAcceptingElements && + jQuery.hotkeys.textInputTypes.test(event.target.nodeName) || + (jQuery.hotkeys.options.filterContentEditable && jQuery(event.target).attr('contenteditable')) || + (jQuery.hotkeys.options.filterTextInputs && + jQuery.inArray(event.target.type, jQuery.hotkeys.textAcceptingInputTypes) > -1))) { + return; + } + + var special = event.type !== "keypress" && jQuery.hotkeys.specialKeys[event.which], + character = String.fromCharCode(event.which).toLowerCase(), + modif = "", + possible = {}; + + jQuery.each(["alt", "ctrl", "shift"], function(index, specialKey) { + + if (event[specialKey + 'Key'] && special !== specialKey) { + modif += specialKey + '+'; + } + }); + + // metaKey is triggered off ctrlKey erronously + if (event.metaKey && !event.ctrlKey && special !== "meta") { + modif += "meta+"; + } + + if (event.metaKey && special !== "meta" && modif.indexOf("alt+ctrl+shift+") > -1) { + modif = modif.replace("alt+ctrl+shift+", "hyper+"); + } + + if (special) { + possible[modif + special] = true; + } + else { + possible[modif + character] = true; + possible[modif + jQuery.hotkeys.shiftNums[character]] = true; + + // "$" can be triggered as "Shift+4" or "Shift+$" or just "$" + if (modif === "shift+") { + possible[jQuery.hotkeys.shiftNums[character]] = true; + } + } + + for (var i = 0, l = keys.length; i < l; i++) { + if (possible[keys[i]]) { + // NOTE: Seem to need this when running in PyQt. + event.preventDefault() ; + return origHandler.apply(this, arguments); + } + } + }; + } + + jQuery.each(["keydown", "keyup", "keypress"], function() { + jQuery.event.special[this] = { + add: keyHandler + }; + }); + +})(jQuery || this.jQuery || window.jQuery); diff --git a/vasl_templates/webapp/static/main.js b/vasl_templates/webapp/static/main.js index cbbbec8..2d0ca24 100644 --- a/vasl_templates/webapp/static/main.js +++ b/vasl_templates/webapp/static/main.js @@ -188,6 +188,9 @@ $(document).ready( function () { edit_template( $(this).attr("data-id") ) ; } ) ; + // initialize hotkeys + init_hotkeys() ; + // add some dummy links for the test suite to edit templates if ( getUrlParam( "edit_template_links" ) ) { $("input[type='button'].generate").each( function() { @@ -202,6 +205,38 @@ $(document).ready( function () { } } ) ; +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +function init_hotkeys() +{ + // initialize hotkeys + jQuery.hotkeys.options.filterInputAcceptingElements = false ; + jQuery.hotkeys.options.filterContentEditable = false ; + jQuery.hotkeys.options.filterTextInputs = false ; + + function set_focus_to( tab, $ctrl ) { + var curr_tab = $("#tabs .ui-tabs-active a").attr( "href" ) ; + if ( curr_tab !== tab ) + $("#tabs .ui-tabs-nav a[href='"+tab+"']").trigger( "click" ) ; + $ctrl.focus() ; + } + $(document).bind( "keydown", "alt+c", function() { + set_focus_to( "#tabs-scenario", $("input[name='SCENARIO_NAME']") ) ; + } ) ; + $(document).bind( "keydown", "alt+p", function() { + set_focus_to( "#tabs-scenario", $("select[name='PLAYER_1']") ) ; + } ) ; + $(document).bind( "keydown", "alt+y", function() { + set_focus_to( "#tabs-scenario", $("textarea[name='VICTORY_CONDITIONS']") ) ; + } ) ; + $(document).bind( "keydown", "alt+1", function() { + set_focus_to( "#tabs-ob1", $("textarea[name='OB_SETUP_1']") ) ; + } ) ; + $(document).bind( "keydown", "alt+2", function() { + set_focus_to( "#tabs-ob2", $("textarea[name='OB_SETUP_2']") ) ; + } ) ; +} + // -------------------------------------------------------------------- function install_template_pack( data ) diff --git a/vasl_templates/webapp/templates/index.html b/vasl_templates/webapp/templates/index.html index d001c6d..2a82768 100644 --- a/vasl_templates/webapp/templates/index.html +++ b/vasl_templates/webapp/templates/index.html @@ -32,7 +32,7 @@
-
Scenario +
Scenario
Name:
Location:
@@ -48,7 +48,7 @@
ELR
SAN
-
Player 1:
+
Player 1:
Player 2:
@@ -57,7 +57,7 @@
-
Victory Conditions +
Victory Conditions