forked from phcode-dev/staging.phcode.dev
-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathKeyboardOverlayMode.js
More file actions
1 lines (1 loc) · 4.37 KB
/
KeyboardOverlayMode.js
File metadata and controls
1 lines (1 loc) · 4.37 KB
1
define(function(require,exports,module){const EditorManager=require("editor/EditorManager"),AppInit=require("utils/AppInit"),MainViewManager=require("view/MainViewManager"),Commands=require("command/Commands"),CommandManager=require("command/CommandManager"),Menus=require("command/Menus"),Strings=require("strings"),Metrics=require("utils/Metrics"),Keys=require("command/Keys"),CONTROL_NAV_OVERLAY_ID="ctrl-nav-overlay";let overlay,paneToFocusOnExit,overlayMode=!1,overlayOrderCentralElement,currentOverlayElement;function showOverlay(targetId){if(Metrics.countEvent(Metrics.EVENT_TYPE.UI,"palette","showOverlay"),!targetId)return void console.error("No target ID for selecting overlay. Ignoring");const targetElement=document.getElementById(targetId);if(paneToFocusOnExit=MainViewManager.getActivePaneId(),targetElement&&overlay){const rect=targetElement.getBoundingClientRect();overlay.style.left=rect.left+"px",overlay.style.top=rect.top+"px",overlay.style.width=rect.width+"px",overlay.style.height=rect.height+"px",overlay.classList.remove("forced-hidden"),overlay.classList.add("hide-cursor"),overlay.focus(),overlayMode=!0,Menus.closeAll(),document.addEventListener("click",exitOverlayMode,!0)}}function startOverlayMode(){overlayOrderCentralElement=calculateUINavOrder(),currentOverlayElement=overlayOrderCentralElement,showOverlay(overlayOrderCentralElement.htmlID)}const ELEM_TYPE_PANE="pane",ELEM_TYPE_TOP_MENU="topMenu";function addElementUp(element,upElement){element.up=upElement,upElement.down=element}function addElementRight(element,rightElement){element.right=rightElement,rightElement.left=element}function calculateUINavOrder(){const firstPane={type:ELEM_TYPE_PANE,htmlID:MainViewManager.FIRST_PANE},secondPane={type:ELEM_TYPE_PANE,htmlID:MainViewManager.SECOND_PANE};addElementUp(firstPane,{type:ELEM_TYPE_TOP_MENU});const paneLayout=MainViewManager.getLayoutScheme();2===paneLayout.rows?addElementUp(secondPane,firstPane):2===paneLayout.columns&&(addElementRight(firstPane,secondPane),addElementUp(secondPane,{type:ELEM_TYPE_TOP_MENU}));const startingPane=MainViewManager.getActivePaneId()||"first-pane";return startingPane===MainViewManager.FIRST_PANE?firstPane:secondPane}function exitOverlayMode(){const overlay=document.getElementById(CONTROL_NAV_OVERLAY_ID);overlay.classList.add("forced-hidden"),overlayMode=!1,paneToFocusOnExit&&MainViewManager.setActivePaneId(paneToFocusOnExit),document.removeEventListener("click",exitOverlayMode,!0)}function processOverlayKeyboardEvent(event){const upElement=currentOverlayElement.up,downElement=currentOverlayElement.down,leftElement=currentOverlayElement.left,rightElement=currentOverlayElement.right;switch(event.key){case Keys.KEY.ARROW_UP:upElement&&upElement.type===ELEM_TYPE_TOP_MENU?(exitOverlayMode(),Menus.openMenu()):upElement&&upElement.type===ELEM_TYPE_PANE&&(currentOverlayElement=upElement,showOverlay(upElement.htmlID));break;case Keys.KEY.ARROW_DOWN:downElement&&downElement.type===ELEM_TYPE_PANE&&(currentOverlayElement=downElement,showOverlay(downElement.htmlID));break;case Keys.KEY.ARROW_LEFT:leftElement&&leftElement.type===ELEM_TYPE_PANE&&(currentOverlayElement=leftElement,showOverlay(leftElement.htmlID));break;case Keys.KEY.ARROW_RIGHT:rightElement&&rightElement.type===ELEM_TYPE_PANE&&(currentOverlayElement=rightElement,showOverlay(rightElement.htmlID));break;case Keys.KEY.RETURN:case Keys.KEY.ENTER:currentOverlayElement&¤tOverlayElement.type===ELEM_TYPE_PANE&&(MainViewManager.setActivePaneId(currentOverlayElement.htmlID),paneToFocusOnExit=MainViewManager.getActivePaneId(),exitOverlayMode());break;case Keys.KEY.ESCAPE:default:exitOverlayMode()}return event.stopPropagation(),event.preventDefault(),!0}function isInOverlayMode(){return overlayMode}AppInit.htmlReady(function(){overlay=document.getElementById(CONTROL_NAV_OVERLAY_ID);const overlayTextElement=document.getElementById("overlay-instruction-text");overlayTextElement.textContent=Strings.KEYBOARD_OVERLAY_TEXT}),AppInit.appReady(function(){CommandManager.register(Strings.CMD_KEYBOARD_NAV_OVERLAY,Commands.CMD_KEYBOARD_NAV_UI_OVERLAY,startOverlayMode);const viewMenu=Menus.getMenu(Menus.AppMenuBar.VIEW_MENU);viewMenu.addMenuItem(Commands.CMD_KEYBOARD_NAV_UI_OVERLAY,"Ctrl-P",Menus.AFTER,Commands.VIEW_TOGGLE_INSPECTION)}),exports.processOverlayKeyboardEvent=processOverlayKeyboardEvent,exports.startOverlayMode=startOverlayMode,exports.exitOverlayMode=exitOverlayMode,exports.isInOverlayMode=isInOverlayMode});