{"version":3,"sources":["https://lively-kernel.org/lively4/swd21-pipes-and-filters/src/client/expose.js"],"names":["html","pt","rect","Expose","_stylesToSave","toggle","isOpen","close","open","current","lively","registerKeys","document","body","globalFocus","windows","Array","from","querySelectorAll","sort","w1","w2","parseInt","style","length","selectedWin","dimWindow","rows","Math","ceil","windowsPerRows","marginV","marginH","paddingV","paddingH","topLeft","i","win","row","floor","column","saveWindowStyles","transition","cursor","exposeScale","elementLength","border","ext","getExtent","x","y","realScale","min","tempScale","setScaleTransform","pos","addPt","delta","getGlobalPosition","setPosition","subPt","addEventListener","onWindowMouseEnter","onWindowMouseLeave","onWindowClick","call","scale","transformOrigin","transform","removeEventListener","forEach","restoreWindowStyles","tempScaledExtent","undimWindow","window","dataset","toLowerCase","selectNext","idx","indexOf","setSelectedWindow","selectPrev","selectUp","col","selectDown","setTimeout","overlay","createElement","id","position","top","left","bottom","right","width","height","background","opacity","appendChild","querySelector","remove","w","windowRemoveHighlight","windowHighlight","evt","gotoWindow","onKeyDown","key","String","fromCharCode","keyCode","metaKey","ctrlKey","preventDefault","stopPropagation","onLeftDown","onUpDown","onRightDown","onDownDown","onEnterDown","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    ];\n  }\n\n  static toggle() {\n\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 = Array.from(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 === 0) {\n      // no windows to display\n      Expose.isOpen = false;\n      return;\n    }\n\n    // select the second window, if it exists\n    Expose.selectedWin = windows[1] || windows[0];\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    for (var i = 0; i < windows.length; i++) {\n      let win = windows[i];\n      let row = Math.floor(i / (Expose.windowsPerRows));\n      let column = i % Expose.windowsPerRows;\n\n      Expose.saveWindowStyles(win);\n\n      win.style.transition = 'all 200ms';\n      win.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      win.style.border = \"\"\n    \n      var ext = lively.getExtent(win)\n      if (ext.x > ext.y) {\n        var realScale = this.elementLength / ext.x\n      } else {\n        realScale = this.elementLength / ext.y\n      }\n      realScale = Math.min(1, realScale)\n      win.tempScale = realScale\n\n      // scale with origin topleft\n      this.setScaleTransform(realScale, win, 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(win, pos.subPt(delta))\n      \n      // lively.setPosition(win, pt(100,100))\n      // lively.showPoint(pos)\n      \n      win.addEventListener('mouseenter', Expose.onWindowMouseEnter);\n      win.addEventListener('mouseleave', Expose.onWindowMouseLeave);\n      win.addEventListener('click', Expose.onWindowClick);\n    }\n\n    Expose.onWindowMouseEnter.call(Expose.selectedWin);\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('mouseenter', Expose.onWindowMouseEnter);\n      win.removeEventListener('mouseleave', Expose.onWindowMouseLeave);\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(window) {\n    Expose._stylesToSave.forEach((style) => {\n      window.style[style.toLowerCase()] = window.dataset[`livelyExposePrev${style}`];\n    });\n\n    // restore transition later for animation\n    setTimeout(function() {\n      window.style.transition = window.dataset['livelyExposePrevTransition'];\n    }, 200);\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 200ms';\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      }, 200);\n    }\n  }\n\n  static setSelectedWindow(w) {\n    Expose.windowRemoveHighlight(Expose.selectedWin);\n    Expose.windowHighlight(w);\n    Expose.selectedWin = w;\n  }\n\n  static onWindowMouseEnter(evt) {\n    Expose.setSelectedWindow(this);\n  }\n\n  static onWindowMouseLeave(evt) {\n    Expose.windowRemoveHighlight(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.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"]}