232 lines
7.3 KiB
JavaScript
232 lines
7.3 KiB
JavaScript
const { fileURL, loadScript, hideCursor, showCursor } = require('./utils.js')
|
|
let { remote } = require('electron')
|
|
|
|
const webFrame = require('electron').webFrame
|
|
|
|
// UO: Disable unintended zoom of fullscreen page if user wants to zoom
|
|
// only parts like Eyevisit info cards.
|
|
console.log('Disable pinch zoom', webFrame)
|
|
webFrame.setVisualZoomLevelLimits(1, 1)
|
|
|
|
let padContainer = null
|
|
let hideCursorTimeout = null
|
|
let debug = false
|
|
let urlPadMap = new Map()
|
|
|
|
window.urlPadMap = urlPadMap
|
|
window.padLoadedHandler = []
|
|
window.nodeDirname = __dirname
|
|
|
|
function pageSize() {
|
|
var w = window,
|
|
d = document,
|
|
e = d.documentElement,
|
|
g = d.getElementsByTagName('body')[0],
|
|
width = w.innerWidth || e.clientWidth || g.clientWidth,
|
|
height = w.innerHeight || e.clientHeight || g.clientHeight
|
|
|
|
return [width, height]
|
|
}
|
|
|
|
let size = pageSize()
|
|
let pageWidth = size[0]
|
|
let pageHeight = size[1]
|
|
|
|
/* Open a new at x, y position. */
|
|
function openPad(url, x, y) {
|
|
console.log('openPad')
|
|
if (remote.getGlobal('useBrowserView')) {
|
|
return ipcRenderer.send('loadBrowserView', { url, x, y })
|
|
}
|
|
const { Pad } = require('./pad.js')
|
|
const { minimalPad } = require('./padMinimal.js')
|
|
pad = null
|
|
if (urlPadMap.has(url)) {
|
|
let pad = urlPadMap.get(url)
|
|
pad.scatter.bringToFront()
|
|
/*TweenMax.to(pad.frame, 0.5, {
|
|
boxShadow: "0 0 25px 5px white", onComplete: () => {
|
|
TweenMax.to(pad.frame, 0.5, { boxShadow: "none" })
|
|
}
|
|
})*/
|
|
TweenMax.to(pad.frame, 0.2, {
|
|
scale: '1.01',
|
|
onComplete: () => {
|
|
TweenMax.to(pad.frame, 0.2, { scale: '1' })
|
|
}
|
|
})
|
|
// pad.scatter.moveTo(x, y)
|
|
return pad
|
|
}
|
|
y + 1600 > pageHeight ? (y = pageHeight - 1600) : (y = y)
|
|
if (remote.getGlobal('useMinimalPad')) {
|
|
pad = new minimalPad(padContainer, {
|
|
x: x,
|
|
y: y,
|
|
url: url,
|
|
tabbedView: true,
|
|
hasTtitleBar: false,
|
|
hideOnStart: false,
|
|
startScale: 1,
|
|
width: 1000,
|
|
height: 1500,
|
|
scalable: true,
|
|
rotatable: true
|
|
})
|
|
}
|
|
if (!remote.getGlobal('useMinimalPad')) {
|
|
pad = new Pad(padContainer, {
|
|
x: x,
|
|
y: y,
|
|
url: url,
|
|
hideOnStart: false,
|
|
startScale: 1,
|
|
width: 1000,
|
|
height: 1500,
|
|
scalable: true,
|
|
rotatable: true
|
|
})
|
|
}
|
|
urlPadMap.set(url, pad)
|
|
for (let callback of window.padLoadedHandler) {
|
|
callback(pad, url)
|
|
}
|
|
}
|
|
|
|
window.padLoadedHandler.push((pad, url) => {
|
|
console.log('Add specific behavior')
|
|
})
|
|
|
|
/* According to https://electron.atom.io/docs/faq/
|
|
"I can not use jQuery/RequireJS/Meteor/AngularJS in Electron" we
|
|
have to rename the symbols in the page before including other libraries.
|
|
Remember to use nodeRequire after this point.
|
|
*/
|
|
window.nodeRequire = require
|
|
delete window.require
|
|
delete window.exports
|
|
delete window.module
|
|
|
|
/* Create a DOMPadContainer, i.e. a special DOMScatterContainer, as a wrapper
|
|
of the document body.
|
|
*/
|
|
window.addEventListener('load', e => {
|
|
console.log('preloading')
|
|
// ../iwmlib/dist/iwmlib.3rdparty.js
|
|
// loadScript('../iwmlib/lib/3rdparty/preload.js', () => {
|
|
loadScript('../../iwmlib/dist/iwmlib.3rdparty.preload.js', () => {
|
|
//console.log("../iwmlib/dist/iwmlib.3rdparty.js loaded")
|
|
console.log('greensock loaded')
|
|
// loadScript('../iwmlib/dist/iwmlib.js', () => {
|
|
loadScript('../../iwmlib/dist/iwmlib.js', () => {
|
|
console.log('../iwmlib/dist/iwmlib.js loaded')
|
|
|
|
/* const { Pad, DOMPadContainer } = nodeRequire('./pad.js')
|
|
padContainer = new DOMPadContainer(document.body)
|
|
|
|
window.nodePadContainer = padContainer
|
|
ipcRenderer.send('padContainerLoaded') */
|
|
|
|
/*Register a handler for mousemove events. Hide the cursor a few
|
|
*seconds after the last move event.
|
|
*/
|
|
document.body.addEventListener('mousemove', e => {
|
|
showCursor()
|
|
clearTimeout(hideCursorTimeout)
|
|
hideCursorTimeout = setTimeout(hideCursor, 3000)
|
|
})
|
|
})
|
|
|
|
if (debug) {
|
|
loadScript('../iwmlib/dist/iwmlib.pixi.js', () => {
|
|
console.log('../iwmlib/dist/iwmlib.pixi.js loaded')
|
|
const DebugApp = require('./debug.js')
|
|
let debugApp = new DebugApp(document.body)
|
|
debugApp.setup()
|
|
debugApp.run()
|
|
})
|
|
}
|
|
})
|
|
})
|
|
|
|
/* Register a handler for all click events and check whether the link target
|
|
opens a new window. If the link target is blank, prevent the default behavior
|
|
and create a Pad scatter object instead.
|
|
*/
|
|
window.addEventListener('click', e => {
|
|
let node = e.target
|
|
let url = ''
|
|
let target = ''
|
|
|
|
let multiUserMode = false // remote.getGlobal('multiUserMode') // DOMScatter && remote.getGlobal('multiUserMode')
|
|
|
|
// console.log("click", multiUserMode, remote.getGlobal('multiUserMode'))
|
|
if (multiUserMode) {
|
|
while (node !== null) {
|
|
if (node.tagName === 'A' || node.tagName === 'a') {
|
|
if (node.target instanceof SVGAnimatedString) {
|
|
url = node.href.baseVal
|
|
target = node.target.baseVal
|
|
} else {
|
|
url = node.href
|
|
target = node.target
|
|
}
|
|
if (target === '_blank') {
|
|
e.preventDefault()
|
|
openPad(url, e.clientX, e.clientY)
|
|
}
|
|
return
|
|
}
|
|
node = node.parentNode
|
|
}
|
|
}
|
|
})
|
|
|
|
/* Register a handler for contextmenu events and check whether the link target
|
|
// opens a new window. If the link target is blank, prevent the default behavior
|
|
and show a popup menu with the option to open a pad instead.
|
|
*/
|
|
window.addEventListener('contextmenu', e => {
|
|
let node = e.target
|
|
let url = null
|
|
if (remote.getGlobal('multiUserMode')) {
|
|
while (node !== null) {
|
|
if (node.tagName === 'A' || node.tagName === 'a') {
|
|
if (node.target instanceof SVGAnimatedString) {
|
|
url = node.href.baseVal
|
|
} else {
|
|
url = node.href
|
|
}
|
|
e.preventDefault()
|
|
let point = { x: e.clientX, y: e.clientY }
|
|
PopupMenu.open(
|
|
{
|
|
'Open new Pad': () => openPad(url, e.clientX, e.clientY)
|
|
},
|
|
point,
|
|
{ fontSize: '0.8em' }
|
|
)
|
|
return
|
|
}
|
|
node = node.parentNode
|
|
}
|
|
}
|
|
})
|
|
|
|
/* Special error handling if the rendere process sends a error notification
|
|
log this error on the main console.
|
|
*/
|
|
let { Console } = require('console')
|
|
let debugConsole = new Console(process.stdout, process.stderr)
|
|
|
|
let { ipcRenderer } = require('electron')
|
|
window.addEventListener('error', event => {
|
|
debugConsole.error('PAGE ERROR', event.error, event.filename)
|
|
debugConsole.error('open', window.location.href)
|
|
ipcRenderer.send('error', 1)
|
|
})
|
|
|
|
ipcRenderer.on('newPad', (e, data) => {
|
|
openPad(data, 0, 0)
|
|
})
|