{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-markus/src/client/expose.js"],"names":["html","pt","rect","Expose","_stylesToSave","toggle","isOpen","close","open","current","lively","registerKeys","document","body","globalFocus","windows","querySelectorAll","sort","w1","w2","parseInt","style","length","dimWindow","rows","Math","ceil","windowsPerRows","marginV","marginH","paddingV","paddingH","topLeft","forEach","w","i","row","floor","column","saveWindowStyles","transition","cursor","exposeScale","elementLength","border","ext","getExtent","realScale","min","max","x","y","tempScale","setScaleTransform","pos","addPt","delta","getGlobalPosition","setPosition","subPt","addEventListener","onWindowMouseMove","onWindowClick","setSelectedWindow","second","scale","win","transformOrigin","transform","removeEventListener","Array","from","restoreWindowStyles","tempScaledExtent","undimWindow","window","dataset","toLowerCase","selectNext","idx","indexOf","selectedWin","selectPrev","selectUp","col","selectDown","setTimeout","overlay","createElement","id","position","top","left","bottom","right","width","height","background","opacity","appendChild","querySelector","remove","windowRemoveHighlight","windowHighlight","evt","gotoWindow","onKeyDown","key","String","fromCharCode","keyCode","metaKey","ctrlKey","preventDefault","stopPropagation","onLeftDown","onUpDown","onRightDown","onDownDown","onEnterDown","call","onEscDown","postLoad","console","log"],"mappings":"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","file":"expose.js","sourcesContent":["\nimport html from \"src/client/html.js\"\nimport {pt,rect} from \"src/client/graphics.js\"\n\n// import lively from './lively.js'\n\nexport default class Expose {\n\n  static get _stylesToSave() {\n    return [\n      // capitalized for dataset\n      'Position',\n      'Left',\n      'Top',\n      'Bottom',\n      'Right',\n      'Width',\n      'Height',\n      'Cursor',\n      'Transform',\n      'Border'\n    ];\n  }\n\n  static toggle() {\n    if (Expose.isOpen) {\n      this.close()\n    } else {\n      this.open();\n    }\n  }\n\n  static open() {\n   \n    if (!Expose.current) return\n    \n    lively.html.registerKeys(document.body, \"expose\", Expose.current, true)\n    lively.globalFocus()\n\n    if (Expose.isOpen) {\n      return;\n    }\n\n    Expose.isOpen = true;\n\n    // Sort windows according to their z-index, because the order\n    // of z-index corresponds to the order of the windows last access.\n    let windows = [...document.querySelectorAll('body > lively-window')].sort((w1, w2) => {\n      return parseInt(w2.style[\"z-index\"]) - parseInt(w1.style[\"z-index\"]);\n    });\n\n    Expose.windows = windows;\n\n    if (windows.length < 2) {\n      // 0: no windows to display\n      // 1: no expose on a single window\n      Expose.isOpen = false;\n      return;\n    }\n\n    Expose.dimWindow();\n\n    let rows = Math.ceil(windows.length / Expose.windowsPerRows);\n\n    let marginV = 40;\n    let marginH = 40;\n    let paddingV = 20;\n    let paddingH = 20;\n\n    let topLeft = pt(100,100)\n    windows.forEach((w, i) => {\n      let row = Math.floor(i / (Expose.windowsPerRows));\n      let column = i % Expose.windowsPerRows;\n\n      Expose.saveWindowStyles(w);\n\n      w.style.transition = 'all 100ms';\n      w.style.cursor = 'pointer';\n\n  \n      // win.style.width = `calc(${1 / Expose.windowsPerRows * 100}% - ${1 * marginH}px - ${(Expose.windowsPerRows - 1) * paddingH}px)`;\n      // win.style.height = `calc(${1 / rows * 100}% - ${2 * marginV}px - ${(0) * paddingV}px)`;\n\n      // win.style.top = `calc(${marginV}px + ${row} * (${1 / rows * 100 }% - ${paddingV}px))`;\n      // win.style.left = `calc(${marginH}px + ${column} * (${1 / Expose.windowsPerRows * 100 }% - ${1 * marginH}px))`;\n      // win.style.right = 'auto';\n      // win.style.bottom = 'auto';\n      this.exposeScale = 0.5\n      this.elementLength = 300 \n      w.style.border = \"\"\n    \n      var ext = lively.getExtent(w)\n      \n      const realScale = Math.min(1, this.elementLength / Math.max(ext.x, ext.y))\n      w.tempScale = realScale\n\n      // scale with origin topleft\n      this.setScaleTransform(realScale, w, ext)\n      var pos = topLeft.addPt(pt(column * (this.elementLength + 20), row * (this.elementLength + 20)))\n      \n      var delta = lively.getGlobalPosition(document.body)\n      // lively.setPosition(win, pos.subPt(pt(600,100)))\n      lively.setPosition(w, pos.subPt(delta))\n      \n      // lively.setPosition(win, pt(100,100))\n      // lively.showPoint(pos)\n      \n    w.addEventListener('mousemove', Expose.onWindowMouseMove);\n    w.addEventListener('click', Expose.onWindowClick);\n    })\n\n    Expose.setSelectedWindow(windows.second);\n  }\n\n  static setScaleTransform(scale, win, ext) {\n    win.style.transformOrigin = \"top left\";\n    win.style.transform = `scale(${scale})`\n  }\n\n  static close() {\n\n    lively.removeEventListener(\"expose\", document.body)\n\n    if (!Expose.isOpen) {\n      return;\n    }\n\n    Expose.isOpen = false;\n\n    let windows = Array.from(document.querySelectorAll('body > lively-window'));\n    windows.forEach((win) => {\n      Expose.restoreWindowStyles(win);\n\n      win.removeEventListener('mousemove', Expose.onWindowMouseMove);\n      win.removeEventListener('click', Expose.onWindowClick);\n      \n      delete win.tempScaledExtent\n      delete win.tempScale\n    });\n\n    Expose.undimWindow();\n  }\n\n  static saveWindowStyles(window) {\n    Expose._stylesToSave.forEach((style) => {\n      window.dataset[`livelyExposePrev${style}`] = window.style[style.toLowerCase()];\n    });\n    window.dataset['livelyExposePrevTransition'] = window.style.transition;\n  }\n\n  static selectNext() {\n    let idx = Expose.windows.indexOf(Expose.selectedWin);\n    Expose.setSelectedWindow(Expose.windows[idx+1] || Expose.windows[0]);\n  }\n\n  static selectPrev() {\n    let idx = Expose.windows.indexOf(Expose.selectedWin);\n    Expose.setSelectedWindow(Expose.windows[idx-1] || Expose.windows[Expose.windows.length-1]);\n  }\n\n  static selectUp() {\n    let idx = Expose.windows.indexOf(Expose.selectedWin);\n    let row = Math.floor(idx / Expose.windowsPerRows);\n    let col = idx % Expose.windowsPerRows;\n    Expose.setSelectedWindow(Expose.windows[(row-1)*Expose.windowsPerRows + col] || Expose.windows[Expose.windows.length-1]);\n  }\n\n  static selectDown() {\n    let idx = Expose.windows.indexOf(Expose.selectedWin);\n    let row = Math.floor(idx / Expose.windowsPerRows);\n    let col = idx % Expose.windowsPerRows;\n    Expose.setSelectedWindow(Expose.windows[(row+1)*Expose.windowsPerRows + col] || Expose.windows[0]);\n  }\n\n  static restoreWindowStyles(w) {\n    Expose._stylesToSave.forEach((style) => {\n      w.style[style.toLowerCase()] = w.dataset[`livelyExposePrev${style}`];\n    });\n\n    // restore transition later for animation\n    setTimeout(function() {\n      w.style.transition = w.dataset['livelyExposePrevTransition'];\n    }, 100);\n  }\n\n  static dimWindow() {\n    let overlay = document.createElement('div');\n    overlay.id = 'lively-expose-overlay';\n    overlay.style.position = 'fixed';\n    overlay.style.top = 0;\n    overlay.style.left = 0;\n    overlay.style.bottom = 0;\n    overlay.style.right = 0;\n    overlay.style.width = '100%';\n    overlay.style.height = '100%';\n    overlay.style.background = 'rgba(0, 0, 0, 0.7)';\n    overlay.style.opacity = 0;\n    overlay.style.transition = 'opacity 100ms';\n    overlay.style['z-index'] = 99;\n\n    document.body.appendChild(overlay);\n    overlay.style.opacity = 1;\n  }\n\n  static undimWindow() {\n    let overlay = document.querySelector('#lively-expose-overlay');\n    if (overlay) {\n      overlay.style.opacity = 0;\n      setTimeout(() => {\n        overlay.remove()\n      }, 100);\n    }\n  }\n\n  static setSelectedWindow(w) {\n    if (w === Expose.selectedWin) {\n      return;\n    }\n    Expose.windowRemoveHighlight(Expose.selectedWin);\n    Expose.windowHighlight(w);\n    Expose.selectedWin = w;\n  }\n\n  static onWindowMouseMove(evt) {\n    Expose.setSelectedWindow(this);\n  }\n\n  static onWindowClick(evt) {\n    let win = this;\n    setTimeout(() => lively.gotoWindow(win, false), 1000);\n    Expose.close();\n  }\n  \n  /* Highlights */\n  static windowHighlight(w) {\n    this.setScaleTransform(w.tempScale + 0.05, w, w.tempScaledExtent)\n    w.style.border = \"3px solid orange\"\n    w.style.transform = w.style.transform  + \" translate(-20px,-20px)\" ;\n  }\n\n  static windowRemoveHighlight(w) {\n    if (!w) return;\n    w.style.border =\"\"\n    this.setScaleTransform(w.tempScale, w, w.tempScaledExtent)\n  }\n\n\n  // Single Global Event\n  static onKeyDown(evt) {\n    var key = String.fromCharCode(evt.keyCode)\n    // #TODO Consider replacing or disable for editor, \n    // since Ctrl-E is \"jump to end of line\" in every other editor\n    // #KeyboardShortcut Ctrl-E toggle expose\n    if ((key === \"E\" && (evt.metaKey || evt.ctrlKey)) \n        /* || (key === \"Q\" && evt.altKey) */) {\n      Expose.toggle();\n      evt.preventDefault()\n      evt.stopPropagation();\n    }\n  }\n\n  onLeftDown(evt) {\n    \n    \n    Expose.selectPrev();\n  }\n  \n  onUpDown(evt) {\n    Expose.selectUp();\n  }\n  \n  onRightDown(evt) {\n    Expose.selectNext();\n  }\n\n  onDownDown(evt) {\n    Expose.selectDown();\n  }\n  \n  onEnterDown(evt) {\n    Expose.onWindowClick.call(Expose.selectedWin, evt);\n  }\n\n  onEscDown(evt) {\n    Expose.close();\n  }\n\n\n  static postLoad() {\n    if (window.lively && lively.removeEventListener) {\n      console.log(\"Post load expose\")\n      // basic class configuration\n      Expose.isOpen = false;\n      Expose.windowsPerRows = 4;\n      lively.removeEventListener(\"ToggleExpose\", document)\n      lively.addEventListener(\"ToggleExpose\",document, \"keydown\", evt => {\n        Expose.onKeyDown(evt)\n      })\n      Expose.current = new Expose()\n    } else {\n      console.log(\"defere Post load expose\")\n      window.setTimeout(this.postLoad, 100)\n    }\n  }\n}\n\nExpose.postLoad()\n"]}