1381 lines
48 KiB
JavaScript
1381 lines
48 KiB
JavaScript
|
const {fileURL} = require('./utils.js')
|
||
|
const path = require('path')
|
||
|
|
||
|
/* A specialization that ignores webview events and thus allows
|
||
|
* webviews to get touch, mouse and wheel events.
|
||
|
*/
|
||
|
class minimalDOMPadContainer extends DOMScatterContainer {
|
||
|
|
||
|
capture(event) {
|
||
|
if (event.target.tagName === 'WEBVIEW' || event.target.classList.contains('interactiveElement'))
|
||
|
return false
|
||
|
return super.capture(event)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/* A wrapper for a webview that behaves like a virtual tablet browser.
|
||
|
* Uses a DOMScatter to zoom and rotate the virtual browser window.
|
||
|
* The position of buttons and the border size remain constant.
|
||
|
*/
|
||
|
class minimalPad {
|
||
|
|
||
|
constructor(scatterContainer, {
|
||
|
startScale=1.0, minScale=0.25, maxScale=10.5,
|
||
|
autoBringToFront=true,
|
||
|
type = 'minimal',
|
||
|
title="",
|
||
|
tabbedView = true,
|
||
|
hasTtitleBar = false,
|
||
|
// urlList=["https://www.iwm-tuebingen.de/www/index.html"],
|
||
|
padMapKey="key",
|
||
|
url="https://www.iwm-tuebingen.de/www/index.html",
|
||
|
hideOnStart=false,
|
||
|
translatable=true, scalable=true, rotatable=true,
|
||
|
movableX=true,
|
||
|
movableY=true,
|
||
|
rotationDegrees=null,
|
||
|
rotation=null,
|
||
|
onTransform=null,
|
||
|
transformOrigin = 'center center',
|
||
|
// extras which are in part needed
|
||
|
x=0,
|
||
|
y=0,
|
||
|
width=null,
|
||
|
height=null,
|
||
|
resizable=false,
|
||
|
} ={}) {
|
||
|
|
||
|
this.x = x
|
||
|
this.y = y
|
||
|
this.type = type
|
||
|
this.url = url
|
||
|
// this.urlList = urlList
|
||
|
this.padMapKey = padMapKey,
|
||
|
this.title = title,
|
||
|
this.hasTtitleBar = hasTtitleBar
|
||
|
this.tabbedView = tabbedView
|
||
|
this.hideOnStart = hideOnStart
|
||
|
this.width = width
|
||
|
this.height = height
|
||
|
this.minScale = minScale
|
||
|
this.maxScale = maxScale
|
||
|
this.scatterContainer = scatterContainer
|
||
|
this.startScale = startScale
|
||
|
this.scale = startScale
|
||
|
this.scalable = scalable
|
||
|
this.rotatable = rotatable
|
||
|
this.rotationDegrees = this.startRotationDegrees
|
||
|
this.transformOrigin = transformOrigin
|
||
|
|
||
|
this.web = null
|
||
|
this.WebviewCounter = 0
|
||
|
this.id=0
|
||
|
this.pointerCounter = 0
|
||
|
|
||
|
this.webviewMap = new Map()
|
||
|
this.overlayMap = new Map()
|
||
|
this.tabMap = new Map()
|
||
|
this.listMap = new Map()
|
||
|
|
||
|
this.frame = document.createElement('div')
|
||
|
this.frame.classList.add("pad")
|
||
|
this.border = 50 / startScale
|
||
|
|
||
|
Elements.setStyle(this.frame, {
|
||
|
backgroundColor: "#333",
|
||
|
position: "absolute",
|
||
|
display: 'flex',
|
||
|
width: this.width+"px",
|
||
|
height: this.height+"px",
|
||
|
visibility: "visible",
|
||
|
top: 0,
|
||
|
left: 0,
|
||
|
// boxShadow: `10px 10px 10px rgba(0, 0, 0, 0.5)`,
|
||
|
// borderRadius: '10px',
|
||
|
overflow: "visible"})
|
||
|
|
||
|
document.body.appendChild( this.frame)
|
||
|
|
||
|
this.tabs=document.createElement("div")
|
||
|
this.webBackground=document.createElement("div")
|
||
|
this.webviewList=document.createElement("div")
|
||
|
this.titlebar = document.createElement("div")
|
||
|
this.webViewSnapshot=document.createElement("img")
|
||
|
|
||
|
this.tabs.classList.add("interactiveElement")
|
||
|
this.tabs.classList.add("tabs")
|
||
|
// this.tabs.style.display="flex"
|
||
|
// this.tabs.style.flexFlow="row nowrap"
|
||
|
|
||
|
Elements.setStyle(this.tabs, {
|
||
|
position: "absolute",
|
||
|
background: "white",
|
||
|
overflowX: "auto",
|
||
|
overflowY: "hidden",
|
||
|
display: "flex",
|
||
|
flexFlow:"row nowrap",
|
||
|
// justifyContent: "flex-end",
|
||
|
alignItems: "flex-end"
|
||
|
// overflow: "auto",
|
||
|
})
|
||
|
|
||
|
this.titlebar.innerHTML = ""
|
||
|
|
||
|
Elements.setStyle(this.titlebar, {
|
||
|
color: "#fff",
|
||
|
position: "absolute",
|
||
|
overflowX: "hidden"
|
||
|
})
|
||
|
|
||
|
Elements.setStyle(this.webBackground, {
|
||
|
position: "absolute",
|
||
|
overflow: "hidden",
|
||
|
background: "white"
|
||
|
})
|
||
|
|
||
|
this.webviewList.classList.add("interactiveElement")
|
||
|
|
||
|
Elements.setStyle(this.webviewList, {
|
||
|
position: "absolute",
|
||
|
visibility: "hidden",
|
||
|
overflow: "auto",
|
||
|
background: "white",
|
||
|
boxShadow: "5px 5px 10px #bbb"
|
||
|
})
|
||
|
|
||
|
/*Elements.setStyle(this.overlay, {
|
||
|
position: "absolute",
|
||
|
overflow: "auto",
|
||
|
background: "white",
|
||
|
opacity: "0.8"
|
||
|
})*/
|
||
|
|
||
|
Elements.setStyle(this.webViewSnapshot, {
|
||
|
position: "absolute",
|
||
|
overflow: "auto"
|
||
|
})
|
||
|
|
||
|
if(this.hasTtitleBar)this.frame.appendChild(this.titlebar)
|
||
|
this.frame.appendChild(this.webBackground)
|
||
|
// this.frame.appendChild(this.webViewSnapshot)
|
||
|
this.frame.appendChild(this.tabs)
|
||
|
this.frame.appendChild(this.webviewList)
|
||
|
|
||
|
this.webViewSnapshot.style.visibility="hidden"
|
||
|
|
||
|
this.closeButton = this.addButton("../assets/icons/svg/cross.svg", "close")
|
||
|
this.backButton = this.addButton("../assets/icons/svg/left.svg", "go back")
|
||
|
this.forwardButton = this.addButton("../assets/icons/svg/right.svg", "go forward")
|
||
|
this.showWebviewListButton = this.addButton("../assets/icons/svg/flat/ic_list_48px.svg", "show list")
|
||
|
|
||
|
this.addNewWebview(this.url)
|
||
|
|
||
|
this.backButton.style.opacity = 0.5
|
||
|
this.forwardButton.style.opacity = 0.5
|
||
|
|
||
|
/*for (let callback of window.padLoadedHandler) {
|
||
|
callback(this, url)
|
||
|
}*/
|
||
|
|
||
|
// this.pseudoFrame = document.createElement('div')
|
||
|
this.pseudoFrameTop = document.createElement('div')
|
||
|
this.pseudoFrameLeft = document.createElement('div')
|
||
|
this.pseudoFrameRight = document.createElement('div')
|
||
|
|
||
|
/*Elements.setStyle(this.pseudoFrame, {
|
||
|
position: "absolute",
|
||
|
top: "0px",
|
||
|
left: "0px",
|
||
|
width: "100%",
|
||
|
height: "100%",
|
||
|
pointerEvents: "none"
|
||
|
})*/
|
||
|
|
||
|
Elements.setStyle(this.pseudoFrameTop, {
|
||
|
position: "absolute",
|
||
|
// background: "pink",
|
||
|
top: "0px",
|
||
|
left: "0px",
|
||
|
width: "100%"
|
||
|
// height: "50px"
|
||
|
})
|
||
|
|
||
|
Elements.setStyle(this.pseudoFrameLeft, {
|
||
|
position: "absolute",
|
||
|
// background: "pink",
|
||
|
top: "0px",
|
||
|
left: "0px",
|
||
|
// width: "5px",
|
||
|
height: "100%"
|
||
|
})
|
||
|
|
||
|
Elements.setStyle(this.pseudoFrameRight, {
|
||
|
position: "absolute",
|
||
|
// background: "pink",
|
||
|
top: "0px",
|
||
|
right: "0px",
|
||
|
// width: "5px",
|
||
|
height: "100%"
|
||
|
})
|
||
|
this.frame.appendChild(this.pseudoFrameTop)
|
||
|
this.frame.appendChild(this.pseudoFrameLeft)
|
||
|
this.frame.appendChild(this.pseudoFrameRight)
|
||
|
// this.frame.appendChild(this.pseudoFrame)
|
||
|
|
||
|
this.pseudoFrameTop.addEventListener('pointerenter',(e)=>{
|
||
|
this.scatter.scalable=false
|
||
|
this.web.pointerEvents = "none"
|
||
|
e.target.style.cursor = "move"
|
||
|
})
|
||
|
this.pseudoFrameTop.addEventListener('pointerleave',(e)=>{
|
||
|
this.scatter.scalable=true
|
||
|
// this.frame.style.cursor = "initial"
|
||
|
})
|
||
|
|
||
|
this.pseudoFrameLeft.addEventListener('pointerenter',(e)=>{
|
||
|
// e.target.setPointerCapture(e.pointerId)
|
||
|
this.scatter.scalable=false
|
||
|
this.web.pointerEvents = "none"
|
||
|
e.target.style.cursor = "move"
|
||
|
})
|
||
|
this.pseudoFrameLeft.addEventListener('pointerleave',(e)=>{
|
||
|
this.scatter.scalable=true
|
||
|
// this.frame.style.cursor = "initial"
|
||
|
})
|
||
|
|
||
|
this.pseudoFrameRight.addEventListener('pointerenter',(e)=>{
|
||
|
this.scatter.scalable=false
|
||
|
this.web.pointerEvents = "none"
|
||
|
e.target.style.cursor = "move"
|
||
|
})
|
||
|
this.pseudoFrameRight.addEventListener('pointerleave',(e)=>{
|
||
|
this.scatter.scalable=true
|
||
|
// this.frame.style.cursor = "initial"
|
||
|
})
|
||
|
|
||
|
/*this.web.addEventListener('new-window', (e) => {
|
||
|
|
||
|
if(e.url.indexOf("youtube")>-1)return
|
||
|
|
||
|
if (urlPadMap.has(e.url)) {
|
||
|
let childPad = urlPadMap.get(e.url)
|
||
|
childPad.scatter.moveTo(x, y)
|
||
|
return childPad
|
||
|
}
|
||
|
let childPad = new minimalPad(this.scatterContainer, {
|
||
|
x: this.scatter.position.x+100,
|
||
|
y: this.scatter.position.y+100,
|
||
|
url: e.url,
|
||
|
width: this.scatter.width,
|
||
|
height: this.scatter.height,
|
||
|
scalable: true,
|
||
|
rotatable: true})
|
||
|
urlPadMap.set(e.url, childPad)
|
||
|
|
||
|
for(let callback of window.padLoadedHandler) {
|
||
|
callback(childPad, url)
|
||
|
}
|
||
|
})*/
|
||
|
|
||
|
/*this.backButton.addEventListener('click', (e)=>{
|
||
|
if(this.web.canGoBack()){
|
||
|
TweenMax.to(e.target, 0.1, {scale:"1.1", onComplete: ()=>{
|
||
|
TweenMax.to(e.target, 0.1, {scale:"1.0"})
|
||
|
}})
|
||
|
this.web.goBack()
|
||
|
}
|
||
|
})
|
||
|
|
||
|
this.forwardButton.addEventListener('click', (e)=>{
|
||
|
if(this.web.canGoForward()){
|
||
|
TweenMax.to(e.target, 0.1, {scale:"1.1", onComplete: ()=>{
|
||
|
TweenMax.to(e.target, 0.1, {scale:"1.0"})
|
||
|
}})
|
||
|
this.web.goForward()
|
||
|
}
|
||
|
})
|
||
|
|
||
|
this.closeButton.addEventListener('click', (e)=>{
|
||
|
TweenMax.to(e.target, 0.1, {scale:"1.1", onComplete: ()=>{
|
||
|
TweenMax.to(e.target, 0.1, {scale:"1.0"})
|
||
|
}})
|
||
|
this.close()
|
||
|
})*/
|
||
|
|
||
|
InteractionMapper.on('tap',this.backButton, e => {
|
||
|
if(this.web.canGoBack()){
|
||
|
TweenMax.to(e.target, 0.1, {scale:"1.1", onComplete: ()=>{
|
||
|
TweenMax.to(e.target, 0.1, {scale:"1.0"})
|
||
|
}})
|
||
|
this.web.goBack()
|
||
|
}
|
||
|
})
|
||
|
|
||
|
InteractionMapper.on('tap',this.forwardButton, e => {
|
||
|
if(this.web.canGoForward()){
|
||
|
TweenMax.to(e.target, 0.1, {scale:"1.1", onComplete: ()=>{
|
||
|
TweenMax.to(e.target, 0.1, {scale:"1.0"})
|
||
|
}})
|
||
|
this.web.goForward()
|
||
|
}
|
||
|
})
|
||
|
|
||
|
InteractionMapper.on('tap',this.closeButton, e => {
|
||
|
TweenMax.to(e.target, 0.1, {scale:"1.1", onComplete: ()=>{
|
||
|
TweenMax.to(e.target, 0.1, {scale:"1.0"})
|
||
|
}})
|
||
|
this.close()
|
||
|
})
|
||
|
|
||
|
this.showWebviewListButton.addEventListener('click', (e)=>{
|
||
|
/*TweenMax.to(e.target, 0.1, {scale:"1.1", onComplete: ()=>{
|
||
|
TweenMax.to(e.target, 0.1, {scale:"1.0"})
|
||
|
}})*/
|
||
|
this.webviewList.style.visibility=="visible" ? this.webviewList.style.visibility="hidden" : this.webviewList.style.visibility="visible"
|
||
|
})
|
||
|
|
||
|
|
||
|
this.scatter = new DOMScatter(this.frame, scatterContainer, {
|
||
|
x: this.x,
|
||
|
y: this.y,
|
||
|
startScale: this.startScale,
|
||
|
width: this.width,
|
||
|
height: this.height,
|
||
|
minScale: this.minScale,
|
||
|
maxScale: this.maxScale,
|
||
|
scalable: this.scalable,
|
||
|
resizable: true,
|
||
|
rotatable: this.rotatable})
|
||
|
|
||
|
let img=document.createElement("img")
|
||
|
img.style.width = "70%"
|
||
|
img.style.position = "absolute"
|
||
|
img.style.bottom = "20%"
|
||
|
img.style.right = "20%"
|
||
|
img.style.pointerEvents="none"
|
||
|
img.src = "../../assets/icons/png/flat/resize.png"
|
||
|
this.scatter.resizeButton.appendChild(img)
|
||
|
|
||
|
this.scatter.moveTo({x, y})
|
||
|
this.scatter.bringToFront()
|
||
|
|
||
|
this.scatter.addTransformEventCallback((e) => {
|
||
|
let newBorder = 50 / e.scale
|
||
|
if (newBorder !== this.border) {
|
||
|
this.border = newBorder
|
||
|
this.layout()
|
||
|
}
|
||
|
})
|
||
|
|
||
|
/*this.test = document.createElement('div')
|
||
|
|
||
|
Elements.setStyle(this.test, {
|
||
|
position: "absolute",
|
||
|
width: "400px",
|
||
|
height: "400px",
|
||
|
overflow: "auto",
|
||
|
background: "pink"
|
||
|
})
|
||
|
this.frame.appendChild(this.test)
|
||
|
|
||
|
this.test.addEventListener('click',()=>{
|
||
|
// this.frame.style.visibility="hidden"
|
||
|
console.log($( this.webBackground ).children())
|
||
|
$( this.webBackground ).children().css( "visibility", "hidden" )
|
||
|
$( this.frame ).children().css( "visibility", "hidden" )
|
||
|
})*/
|
||
|
this.heinz = document.createElement('div')
|
||
|
|
||
|
Elements.setStyle(this.heinz, {
|
||
|
position: "absolute",
|
||
|
background: "pink",
|
||
|
top: "0px",
|
||
|
left: "0px",
|
||
|
width: "100%",
|
||
|
opacity: "0.5",
|
||
|
display: "inline",
|
||
|
height: "100%"
|
||
|
})
|
||
|
|
||
|
this.heinz.addEventListener('pointerdown',(e)=>{
|
||
|
console.log('pointer down on Heinz')
|
||
|
e.target.style.display="none"
|
||
|
})
|
||
|
this.layout()
|
||
|
|
||
|
// this.webBackground.appendChild(this.heinz)
|
||
|
// this.heinz.classList.add("interactiveElement")
|
||
|
|
||
|
}
|
||
|
|
||
|
addNewWebview(src){
|
||
|
/* if(this.web!=null){
|
||
|
this.web.style.visibility="hidden"
|
||
|
this.web.setAttribute('selected','0')
|
||
|
}*/
|
||
|
let timeTouchStart = 0
|
||
|
|
||
|
let webview=document.createElement("webview")
|
||
|
this.web=webview
|
||
|
// webview.style.pointerEvents="none"
|
||
|
webview.setAttribute('loaded','0')
|
||
|
this.webBackground.appendChild(webview)
|
||
|
this.webviewMap.set(src+this.padMapKey, webview)
|
||
|
// console.log("number of webviews",this.webviewMap.size)
|
||
|
// $("webview").each(function(i, obj) {
|
||
|
// obj.setAttribute('selected','0')
|
||
|
// })
|
||
|
|
||
|
Elements.setStyle(webview, {
|
||
|
position: "absolute",
|
||
|
overflow: "hidden",
|
||
|
width: "100%",
|
||
|
height: "100%",
|
||
|
// border: "1px solid #fff"
|
||
|
})
|
||
|
webview.src=src
|
||
|
webview.preload= path.join(__dirname, './preloadPad.js')
|
||
|
|
||
|
let listItem=document.createElement('div')
|
||
|
listItem.className="interactiveElement"
|
||
|
listItem.classList.add("webviewListItem")
|
||
|
listItem.setAttribute('id',src+this.padMapKey)
|
||
|
// listItem.style.height = "5%"
|
||
|
// // listItem.style.width = "80%"
|
||
|
// listItem.style.marginLeft="10%"
|
||
|
// listItem.style.marginTop="5%"
|
||
|
listItem.style.padding = "10px"
|
||
|
// listItem.style.paddingBottom = "10px"
|
||
|
this.webviewList.appendChild(listItem)
|
||
|
this.listMap.set(src+this.padMapKey,listItem)
|
||
|
|
||
|
webview.setAttribute('id',src+this.padMapKey)
|
||
|
|
||
|
this.setSelectedWebview(src+this.padMapKey)
|
||
|
|
||
|
this.addNewTab(webview,src)
|
||
|
|
||
|
listItem.addEventListener('click',(e)=>{
|
||
|
console.log(e.target.getAttribute('id'))
|
||
|
this.setSelectedWebview(e.target.getAttribute('id'))
|
||
|
this.webviewList.style.visibility = "hidden"
|
||
|
$(this.tabs).animate({scrollLeft: $(".tab[id='"+e.target.getAttribute('id')+"']").prop('offsetLeft') - 10}, "slow")
|
||
|
this.enableButtons()
|
||
|
})
|
||
|
|
||
|
listItem.addEventListener('pointerenter',(e)=>{
|
||
|
e.target.style.background = "#ddd"
|
||
|
let webview=null
|
||
|
this.webviewMap.forEach(function (item, key, mapObj) {
|
||
|
item.style.visibility="hidden"
|
||
|
if(item.getAttribute('id')==e.target.getAttribute("id")){
|
||
|
item.style.visibility="visible"
|
||
|
if(item.getAttribute('selected')=='0')item.style.opacity="0.5"
|
||
|
webview=item
|
||
|
// obj.style.width="50%"
|
||
|
// obj.style.height="50%"
|
||
|
}
|
||
|
})
|
||
|
this.overlayMap.forEach(function (item, key, mapObj) {
|
||
|
item.style.visibility="hidden"
|
||
|
if(item.getAttribute('id')==e.target.getAttribute("id")){
|
||
|
item.style.visibility="visible"
|
||
|
}
|
||
|
})
|
||
|
// webview.getAttribute('loaded')=='0' ? this.overlay.style.visibility='visible' : this.overlay.style.visibility='hidden'
|
||
|
})
|
||
|
|
||
|
listItem.addEventListener('pointerleave',(e)=>{
|
||
|
e.target.style.background = "#fff"
|
||
|
if(e.target.getAttribute('selected')=='1') e.target.style.background = "#999"
|
||
|
this.webviewMap.forEach(function (item, key, mapObj) {
|
||
|
if(item.getAttribute('selected')=='0'){
|
||
|
item.style.visibility="hidden"
|
||
|
}
|
||
|
if(item.getAttribute('selected')=='1'){
|
||
|
item.style.visibility="visible"
|
||
|
item.style.opacity="1"
|
||
|
}
|
||
|
// obj.style.width="100%"
|
||
|
// obj.style.height="100%"
|
||
|
})
|
||
|
})
|
||
|
let overlay = document.createElement('div')
|
||
|
overlay.style.position="absolute"
|
||
|
overlay.style.width="100%"
|
||
|
overlay.style.height="100%"
|
||
|
overlay.style.top="0px"
|
||
|
overlay.style.left="0px"
|
||
|
overlay.style.background="white"
|
||
|
overlay.style.opacity="0.6"
|
||
|
|
||
|
this.overlayMap.set(src,overlay)
|
||
|
|
||
|
let overlayCaptureEvents = document.createElement('div')
|
||
|
overlayCaptureEvents.style.position="absolute"
|
||
|
overlayCaptureEvents.style.background="lime"
|
||
|
overlayCaptureEvents.style.opacity="0.01"
|
||
|
overlayCaptureEvents.style.width="100%"
|
||
|
overlayCaptureEvents.style.height="100%"
|
||
|
overlayCaptureEvents.style.top="0px"
|
||
|
overlayCaptureEvents.style.left="0px"
|
||
|
// overlay.style.background="white"
|
||
|
|
||
|
overlayCaptureEvents.classList.add("interactiveElement")
|
||
|
|
||
|
overlayCaptureEvents.addEventListener('touchmove',(e)=>{
|
||
|
e.preventDefault()
|
||
|
e.stopPropagation()
|
||
|
})
|
||
|
|
||
|
overlayCaptureEvents.addEventListener('pointerup',(e)=>{
|
||
|
e.preventDefault()
|
||
|
e.stopPropagation()
|
||
|
let p = {x:e.clientX, y:e.clientY}
|
||
|
|
||
|
let webviewPosition = Points.fromPageToNode(webview,p)
|
||
|
// oldX = 0
|
||
|
// oldY = 0
|
||
|
|
||
|
let d = new Date()
|
||
|
console.log("delta Time",d.getTime()-timeTouchStart)
|
||
|
// if(d.getTime()-timeTouchStart<150)webview.sendInputEvent({type:'mouseUp', x: (e.clientX-webview.getBoundingClientRect().left)/this.scatter.scale, y: (e.clientY-webview.getBoundingClientRect().top)/this.scatter.scale, button:'left', clickCount: 1})
|
||
|
if(d.getTime()-timeTouchStart<150)webview.sendInputEvent({type:'mouseUp', x: webviewPosition.x, y: webviewPosition.y, button:'left', clickCount: 1})
|
||
|
})
|
||
|
|
||
|
overlayCaptureEvents.addEventListener('pointerdown',(e)=>{
|
||
|
e.preventDefault()
|
||
|
e.stopPropagation()
|
||
|
this.scatter.bringToFront()
|
||
|
let p = {x:e.clientX, y:e.clientY}
|
||
|
|
||
|
let webviewPosition = Points.fromPageToNode(webview,p)
|
||
|
|
||
|
let d = new Date()
|
||
|
timeTouchStart = d.getTime()
|
||
|
|
||
|
// webview.sendInputEvent({type:'mouseDown', x: (e.clientX-webview.getBoundingClientRect().left)/this.scatter.scale, y: (e.clientY-webview.getBoundingClientRect().top)/this.scatter.scale, button:'left', clickCount: 1})
|
||
|
webview.sendInputEvent({type:'mouseDown', x: webviewPosition.x, y: webviewPosition.y, button:'left', clickCount: 1})
|
||
|
})
|
||
|
|
||
|
overlayCaptureEvents.addEventListener('pointermove',(e)=>{
|
||
|
if(e.pointerType!='mouse'){
|
||
|
let rotation = Angle.radian2degree(this.scatter.rotation);
|
||
|
rotation = (rotation + 360) % 360;
|
||
|
|
||
|
let r = Math.sqrt(Math.pow(e.movementX, 2) + Math.pow(e.movementY, 2));
|
||
|
let phi = Angle.radian2degree(Math.atan2(e.movementX, e.movementY));
|
||
|
|
||
|
phi = ((phi) + 630) % 360;
|
||
|
let rot = ((rotation + 90) + 630) % 360;
|
||
|
|
||
|
let diffAngle = ((0 + rot) + 360) % 360;
|
||
|
let phiCorrected = (phi + diffAngle + 360) % 360;
|
||
|
|
||
|
let deltaX = r * Math.cos(Angle.degree2radian(phiCorrected));
|
||
|
let deltaY = -r * Math.sin(Angle.degree2radian(phiCorrected));
|
||
|
// if(oldX!=0)deltaX = (e.clientX-oldX)
|
||
|
// if(oldY!=0)deltaY = (e.clientY-oldY)
|
||
|
// console.log("e.movementY",e.movementY)
|
||
|
// webview.sendInputEvent({type:'mouseWheel', x: 0, y: 0, deltaX: e.movementX, deltaY: e.movementY, canScroll: true })
|
||
|
webview.executeJavaScript("window.scrollTo(scrollX+"+(-1*deltaX)+", scrollY+"+ (-1*deltaY)+")")
|
||
|
// oldX = e.clientX
|
||
|
// oldY = e.clientY
|
||
|
}
|
||
|
})
|
||
|
|
||
|
overlayCaptureEvents.addEventListener('mousewheel',(e)=>{
|
||
|
console.log("mousewheel",e.deltaY)
|
||
|
// webview.sendInputEvent({type:'mouseWheel', x: 0, y: 0, deltaX: e.deltaX, deltaY: -e.deltaY, canScroll: true })
|
||
|
webview.executeJavaScript("window.scrollTo(scrollX+"+e.deltaX+", scrollY+"+ e.deltaY+")")
|
||
|
})
|
||
|
|
||
|
let loadAnim = document.createElement("div")
|
||
|
loadAnim.style.webkitAnimation= "spin 2s linear infinite"
|
||
|
loadAnim.style.animation= "spin 2s linear infinite"
|
||
|
loadAnim.style.position = "absolute"
|
||
|
|
||
|
document.styleSheets[0].insertRule("div.tabs::-webkit-scrollbar {display: none;}");
|
||
|
document.styleSheets[0].insertRule('\
|
||
|
@keyframes spin {\
|
||
|
from { transform: rotateZ(0deg); }\
|
||
|
to { transform: rotateZ(360deg); }\
|
||
|
}'
|
||
|
)
|
||
|
|
||
|
overlay.appendChild(loadAnim)
|
||
|
|
||
|
this.webBackground.appendChild(overlay)
|
||
|
if(remote.getGlobal('multiUserMode'))this.webBackground.appendChild(overlayCaptureEvents)
|
||
|
|
||
|
webview.addEventListener('did-navigate', (e) => {
|
||
|
this.enableButtons()
|
||
|
//this.backButton.style.opacity = (webview.canGoBack()) ? 1 : 0.5
|
||
|
//this.forwardButton.style.opacity = (webview.canGoForward()) ? 1 : 0.5
|
||
|
})
|
||
|
|
||
|
webview.addEventListener('dom-ready',()=>{
|
||
|
// console.log("DOM READY TABBED WEBVIEW!!!!!!!!!!")
|
||
|
listItem.innerHTML=webview.getTitle()+" "+src
|
||
|
$(".tab[id='"+src+this.padMapKey+"']").children()[0].innerHTML=webview.getTitle()
|
||
|
// $(".tab[id='"+src+"']").children()[0].innerHTML="READY LOADED"
|
||
|
$(this.tabs).animate({scrollLeft: $(".tab[id='"+src+"']").prop('offsetLeft') - 10}, "slow")
|
||
|
this.titlebar.innerHTML=this.web.getTitle()
|
||
|
// this.web.openDevTools()
|
||
|
// webview.style.overflow= "auto"
|
||
|
// webview.style.overflowY= "hidden"
|
||
|
})
|
||
|
|
||
|
webview.addEventListener('ipc-message', (e) => {
|
||
|
if(e.channel=='touchStart'){
|
||
|
// console.log("pointer down on webview",e.srcElement)
|
||
|
if(e.srcElement.src==webview.src)this.pointerCounter++
|
||
|
this.scatter.bringToFront()
|
||
|
}
|
||
|
if(e.channel=='touchEnd'){
|
||
|
// console.log("pointer up on webview")
|
||
|
if(e.srcElement.src==webview.src)this.pointerCounter--
|
||
|
}
|
||
|
if(e.channel=='webviewPointerCancel'){
|
||
|
this.heinz.style.display="inline"
|
||
|
}
|
||
|
// console.log("pointerCounter",this.pointerCounter)
|
||
|
})
|
||
|
|
||
|
/* let {ipcRenderer} = require('electron')
|
||
|
|
||
|
ipcRenderer.on('touchStartWebview' ,function(event){
|
||
|
console.log(event)
|
||
|
})*/
|
||
|
|
||
|
webview.addEventListener('did-start-loading', ()=>{
|
||
|
|
||
|
webview.setAttribute('loaded','0')
|
||
|
overlay.style.visibility="visible"
|
||
|
|
||
|
let w = overlay.offsetWidth
|
||
|
let h = overlay.offsetHeight
|
||
|
|
||
|
let animationSize = w<h ? w*0.5 : h*0.5
|
||
|
let animationRingWidth = animationSize*0.1;
|
||
|
|
||
|
loadAnim.style.border=animationRingWidth+"px solid #f3f3f3"
|
||
|
loadAnim.style.borderTop=animationRingWidth+"px solid #ffb18c"
|
||
|
loadAnim.style.borderRadius="50%"
|
||
|
loadAnim.style.height=animationSize-animationRingWidth*2+"px"
|
||
|
loadAnim.style.width=animationSize-animationRingWidth*2+"px"
|
||
|
loadAnim.style.top = h*0.25+"px"
|
||
|
loadAnim.style.left = w*0.25+"px"
|
||
|
w<h ? loadAnim.style.top = 0.5*(h-animationSize)+"px" : loadAnim.style.left = 0.5*(w-animationSize)+"px"
|
||
|
})
|
||
|
|
||
|
// webview.addEventListener('dom-ready', ()=>{
|
||
|
// })
|
||
|
webview.addEventListener('did-stop-loading', ()=>{
|
||
|
webview.setAttribute('loaded','1')
|
||
|
this.layout()
|
||
|
overlay.style.visibility="hidden"
|
||
|
})
|
||
|
|
||
|
webview.addEventListener('new-window', (e) => {
|
||
|
if (!this.webviewMap.has(e.url+this.padMapKey)){
|
||
|
if(this.tabbedView)this.addNewWebview(e.url)
|
||
|
if(!this.tabbedView){
|
||
|
|
||
|
if (urlPadMap.has(e.url)) {
|
||
|
let childPad = urlPadMap.get(e.url)
|
||
|
childPad.scatter.moveTo(x, y)
|
||
|
return childPad
|
||
|
}
|
||
|
let childPad = new minimalPad(this.scatterContainer, {
|
||
|
x: this.scatter.position.x+100,
|
||
|
y: this.scatter.position.y+100,
|
||
|
url: e.url,
|
||
|
tabbedView: false,
|
||
|
hasTtitleBar: this.hasTtitleBar,
|
||
|
width: this.scatter.width,
|
||
|
height: this.scatter.height,
|
||
|
scalable: true,
|
||
|
rotatable: true})
|
||
|
urlPadMap.set(e.url, childPad)
|
||
|
|
||
|
for(let callback of window.padLoadedHandler) {
|
||
|
callback(childPad, url)
|
||
|
}
|
||
|
|
||
|
}
|
||
|
}
|
||
|
})
|
||
|
this.id++
|
||
|
}
|
||
|
|
||
|
setSelectedWebview(id){
|
||
|
let webview=null
|
||
|
this.webviewMap.forEach(function (item, key, mapObj) {
|
||
|
item.setAttribute('selected','0')
|
||
|
item.style.opacity = "0"
|
||
|
item.style.visibility = "hidden"
|
||
|
if(key==id){
|
||
|
webview=item
|
||
|
item.setAttribute('selected','1')
|
||
|
item.style.opacity = "1"
|
||
|
item.style.visibility = "visible"
|
||
|
}
|
||
|
})
|
||
|
|
||
|
this.tabMap.forEach(function (tab, key, mapObj) {
|
||
|
tab.style.border="none"
|
||
|
if(key==id){
|
||
|
tab.style.borderLeft="1px solid black"
|
||
|
tab.style.borderTop="1px solid black"
|
||
|
tab.style.borderRight="1px solid black"
|
||
|
}
|
||
|
})
|
||
|
|
||
|
this.listMap.forEach(function (entry, key, mapObj) {
|
||
|
entry.style.background = "white"
|
||
|
entry.setAttribute('selected','0')
|
||
|
if(key==id){
|
||
|
entry.style.background = "#999"
|
||
|
entry.setAttribute('selected','1')
|
||
|
}
|
||
|
})
|
||
|
this.web = webview
|
||
|
if(webview.getAttribute('loaded')=='1') this.titlebar.innerHTML=this.web.getTitle()
|
||
|
// webview.getAttribute('loaded')=='0' ? this.overlay.style.visibility='visible' : this.overlay.style.visibility='hidden'
|
||
|
}
|
||
|
|
||
|
addNewTab(webview,src){
|
||
|
|
||
|
this.tabMap.forEach(function (tab, key, mapObj) {
|
||
|
tab.style.border="none"
|
||
|
})
|
||
|
let tab=document.createElement('div')
|
||
|
tab.className="tab"
|
||
|
tab.classList.add("interactiveElement")
|
||
|
tab.style.display="flex"
|
||
|
tab.style.flexFlow="row nowrap"
|
||
|
tab.style.textOverflow="ellipsis"
|
||
|
tab.setAttribute('id',src+this.padMapKey)
|
||
|
// tab.innerHTML=" "
|
||
|
tab.style.color="black"
|
||
|
tab.style.background="white"
|
||
|
tab.style.borderLeft="1px solid black"
|
||
|
tab.style.borderTop="1px solid black"
|
||
|
tab.style.borderRight="1px solid black"
|
||
|
tab.style.position="relative"
|
||
|
tab.style.borderRadius="5px 5px 0 0"
|
||
|
tab.style.maxWidth="25%"
|
||
|
tab.style.height="80%"
|
||
|
tab.style.alignItems= "center"
|
||
|
// tab.style.display="inline"
|
||
|
// tab.style.marginLeft="10px"
|
||
|
tab.style.paddingLeft="10px"
|
||
|
this.tabs.appendChild(tab)
|
||
|
this.tabMap.set(src+this.padMapKey,tab)
|
||
|
let newSelectedWebview=null
|
||
|
|
||
|
let title = document.createElement('div')
|
||
|
title.classList.add('tabTitle')
|
||
|
// title.style.display="flex"
|
||
|
// title.style.flexFlow="row nowrap"
|
||
|
title.style.overflow="hidden"
|
||
|
title.style.whiteSpace="nowrap"
|
||
|
title.style.textOverflow="ellipsis"
|
||
|
title.style.pointerEvents="none"
|
||
|
title.innerHTML="New Tab"
|
||
|
tab.appendChild(title)
|
||
|
|
||
|
let close = document.createElement('img')
|
||
|
close.setAttribute('id',src+this.padMapKey)
|
||
|
close.classList.add('tabCloseButton')
|
||
|
close.style.background="#666"
|
||
|
close.style.height="50%"
|
||
|
close.style.marginLeft="10px"
|
||
|
close.style.marginRight="10px"
|
||
|
close.style.borderRadius="100%"
|
||
|
close.style.visibility="hidden"
|
||
|
close.src = "../../assets/icons/svg/cross.svg"
|
||
|
tab.appendChild(close)
|
||
|
|
||
|
close.addEventListener('click',(e)=>{
|
||
|
e.stopPropagation()
|
||
|
e.preventDefault()
|
||
|
let newSelectedItem = false
|
||
|
|
||
|
if(this.webviewMap.size>1){
|
||
|
let next=this.getNextTab(e.target.getAttribute("id"))
|
||
|
let previous=this.getPreviousTab(e.target.getAttribute("id"))
|
||
|
|
||
|
this.webviewMap.forEach(function (item, key, mapObj) {
|
||
|
if(item.getAttribute('id')==e.target.getAttribute("id")){
|
||
|
if(item.getAttribute('selected')=='1'){
|
||
|
newSelectedItem=true
|
||
|
}
|
||
|
mapObj.delete(key)
|
||
|
$(item).remove()
|
||
|
}
|
||
|
})
|
||
|
|
||
|
this.tabMap.forEach(function (tab, key, mapObj) {
|
||
|
if(tab.getAttribute('id')==e.target.getAttribute("id")){
|
||
|
mapObj.delete(key)
|
||
|
$(tab).remove()
|
||
|
}
|
||
|
})
|
||
|
|
||
|
this.listMap.forEach(function (entry, key, mapObj) {
|
||
|
if(entry.getAttribute('id')==e.target.getAttribute("id")){
|
||
|
mapObj.delete(key)
|
||
|
}
|
||
|
})
|
||
|
$(".webviewListItem[id='"+e.target.getAttribute("id")+"']").remove()
|
||
|
$(e.target).remove()
|
||
|
if(newSelectedItem){
|
||
|
next!=null ? this.setSelectedWebview(next.getAttribute('id')) : this.setSelectedWebview(previous.getAttribute('id'))
|
||
|
}
|
||
|
}
|
||
|
this.layout()
|
||
|
|
||
|
})
|
||
|
|
||
|
tab.addEventListener('pointerenter',(e)=>{
|
||
|
if(this.webviewMap.size>1)e.target.childNodes[1].style.visibility="visible"
|
||
|
let z=this.frame.style.zIndex
|
||
|
|
||
|
let webview=null
|
||
|
e.target.style.background="#ddd"
|
||
|
this.webviewMap.forEach(function (item, key, mapObj) {
|
||
|
item.style.visibility="hidden"
|
||
|
if(item.getAttribute('id')==e.target.getAttribute("id")){
|
||
|
item.style.visibility="visible"
|
||
|
if(item.getAttribute('selected')=='0')item.style.opacity="0.5"
|
||
|
webview=item
|
||
|
// obj.style.width="50%"
|
||
|
// obj.style.height="50%"
|
||
|
}
|
||
|
})
|
||
|
this.overlayMap.forEach(function (item, key, mapObj) {
|
||
|
item.style.visibility="hidden"
|
||
|
if(item.getAttribute('id')==e.target.getAttribute("id")){
|
||
|
item.style.visibility="visible"
|
||
|
}
|
||
|
})
|
||
|
// webview.getAttribute('loaded')=='0' ? this.overlay.style.visibility='visible' : this.overlay.style.visibility='hidden'
|
||
|
/*Popup.open({"text":webview.getTitle()},
|
||
|
{x: e.clientX, y: e.clientY},
|
||
|
{ fontSize: "2vh", maxWidth: width*0.2, spacing: '10px', notchPosition: 'topLeft', zIndex: z+100})*/
|
||
|
})
|
||
|
|
||
|
tab.addEventListener('pointerleave',(e)=>{
|
||
|
e.target.childNodes[1].style.visibility="hidden"
|
||
|
e.target.style.background="#fff"
|
||
|
this.webviewMap.forEach(function (item, key, mapObj) {
|
||
|
if(item.getAttribute('selected')=='0'){
|
||
|
item.style.visibility="hidden"
|
||
|
}
|
||
|
if(item.getAttribute('selected')=='1'){
|
||
|
item.style.visibility="visible"
|
||
|
item.style.opacity="1"
|
||
|
}
|
||
|
// obj.style.width="100%"
|
||
|
// obj.style.height="100%"
|
||
|
})
|
||
|
//this.web.style.visibility="visible"
|
||
|
//this.web.style.opacity="1"
|
||
|
})
|
||
|
tab.addEventListener('click',(e)=>{
|
||
|
this.tabMap.forEach(function (item, key, mapObj) {
|
||
|
item.style.border="none"
|
||
|
})
|
||
|
|
||
|
e.target.style.borderLeft="1px solid black"
|
||
|
e.target.style.borderTop="1px solid black"
|
||
|
e.target.style.borderRight="1px solid black"
|
||
|
|
||
|
this.setSelectedWebview(e.target.getAttribute('id'))
|
||
|
|
||
|
if(e.target.offsetLeft+e.target.offsetWidth>this.tabs.offsetWidth+this.tabs.scrollLeft){
|
||
|
$(this.tabs).animate({scrollLeft: e.target.offsetLeft-this.tabs.offsetWidth+e.target.offsetWidth}, "slow")
|
||
|
}
|
||
|
if(e.target.offsetLeft<this.tabs.scrollLeft){
|
||
|
$(this.tabs).animate({scrollLeft: e.target.offsetLeft-10}, "slow")
|
||
|
}
|
||
|
|
||
|
/* $("webview").each(function(i, obj) {
|
||
|
obj.style.visibility="hidden"
|
||
|
obj.setAttribute('selected','0')
|
||
|
if(obj.getAttribute('id')==src){
|
||
|
obj.style.visibility="visible"
|
||
|
obj.style.opacity="1"
|
||
|
newSelectedWebview=obj
|
||
|
obj.setAttribute('selected','1')
|
||
|
}
|
||
|
})*/
|
||
|
//this.web = newSelectedWebview
|
||
|
this.enableButtons()
|
||
|
})
|
||
|
}
|
||
|
|
||
|
getPreviousTab(val){
|
||
|
let obj=null
|
||
|
let returnValue=null
|
||
|
this.webviewMap.forEach(function (item, key, mapObj) {
|
||
|
if(key==val){
|
||
|
returnValue=obj
|
||
|
}
|
||
|
obj=item
|
||
|
})
|
||
|
return returnValue
|
||
|
}
|
||
|
|
||
|
getNextTab(val){
|
||
|
console.log("this.webviewMap",this.webviewMap[0])
|
||
|
let obj=null
|
||
|
let oldKey=null
|
||
|
let returnValue=null
|
||
|
this.webviewMap.forEach(function (item, key, mapObj) {
|
||
|
obj=item
|
||
|
if(oldKey==val){
|
||
|
returnValue=obj
|
||
|
}
|
||
|
oldKey=key
|
||
|
})
|
||
|
return returnValue
|
||
|
}
|
||
|
|
||
|
rad2degree(alpha){
|
||
|
return alpha * 180 / Math.PI;
|
||
|
}
|
||
|
|
||
|
degree2rad(alpha){
|
||
|
return alpha * Math.PI / 180;
|
||
|
}
|
||
|
|
||
|
close() {
|
||
|
// this.frame.style.display="none"
|
||
|
this.frame.parentNode.removeChild(this.frame)
|
||
|
urlPadMap.delete(this.url)
|
||
|
}
|
||
|
|
||
|
enableButtons() {
|
||
|
console.log("enabling buttons")
|
||
|
this.backButton.style.opacity = (this.web.canGoBack()) ? 1 : 0.5
|
||
|
this.forwardButton.style.opacity = (this.web.canGoForward()) ? 1 : 0.5
|
||
|
}
|
||
|
|
||
|
addButton(src, value) {
|
||
|
let button = document.createElement("img")
|
||
|
button.type = "image"
|
||
|
button.className = "frameButton"
|
||
|
button.style.position = "absolute"
|
||
|
button.src = fileURL(src)
|
||
|
button.value="close"
|
||
|
button.draggable = false
|
||
|
button.classList.add("interactiveElement")
|
||
|
this.frame.appendChild(button)
|
||
|
return button
|
||
|
}
|
||
|
|
||
|
layout() {
|
||
|
let b = this.border
|
||
|
let b2 = b * 2
|
||
|
let b8 = b / 8
|
||
|
let b25 = b / 25
|
||
|
let b15 = b / 15
|
||
|
Elements.setStyle(this.frame, {
|
||
|
// borderRadius: b8 + "px",
|
||
|
// boxShadow: `${b25}px ${b15}px ${b8}px rgba(0, 0, 0, 0.5)`
|
||
|
})
|
||
|
|
||
|
this.scatter.resizeButton.style.width=b+"px"
|
||
|
this.scatter.resizeButton.style.height=b+"px"
|
||
|
|
||
|
let size = "calc(100% - " + (2*b) +"px)"
|
||
|
let h = "calc(100% - " + (b) +"px)"
|
||
|
let w = "calc(100% - "+2 +"px)"
|
||
|
let w2 = "calc(100% - " + (b+2) +"px)"
|
||
|
|
||
|
/* Elements.setStyle(this.web, {
|
||
|
width: w,
|
||
|
height: h,
|
||
|
margin: "0px"})*/
|
||
|
|
||
|
$(this.frame).find(".tabCloseButton").css('height',0.5*b+"px")
|
||
|
$(this.frame).find(".tabCloseButton").css('width',0.5*b+"px")
|
||
|
$(this.frame).find(".tabCloseButton").css('borderRadius',b+"px")
|
||
|
$(this.frame).find(".tabTitle").css('fontSize',0.3*b+"px")
|
||
|
// $(this.frame).find(".tab").css('borderLeft',0.01*b+'px solid black')
|
||
|
// $(this.frame).find(".tab").css('borderTop',0.01*b+'px solid black')
|
||
|
// $(this.frame).find(".tab").css('borderRight',0.01*b+'px solid black')
|
||
|
// $(".tabTitle").css('fontSize',0.3*b+"px")
|
||
|
|
||
|
|
||
|
Elements.setStyle(this.titlebar, {
|
||
|
left: (b * 2.75) + "px",
|
||
|
top: "0px",
|
||
|
fontSize: 0.7*b+"px",
|
||
|
display: "none",
|
||
|
// paddingTop: 10+"px",
|
||
|
// textAlign: "center",
|
||
|
height: 0.9*b+"px"})
|
||
|
Elements.setStyle(this.webViewSnapshot, {
|
||
|
width: w,
|
||
|
height: h,
|
||
|
margin: "0px"})
|
||
|
Elements.setStyle(this.tabs, {
|
||
|
width: w2,
|
||
|
height: b+"px",
|
||
|
bottom: b+"px",
|
||
|
margin: "1px"})
|
||
|
Elements.setStyle(this.webBackground, {
|
||
|
width: w,
|
||
|
height: size,
|
||
|
margin: "1px"})
|
||
|
Elements.setStyle(this.webviewList, {
|
||
|
bottom: 2*b+2+"px",
|
||
|
right: b+"px",
|
||
|
width: "50%",
|
||
|
margin: "0px"})
|
||
|
/* Elements.setStyle(this.overlay, {
|
||
|
width: w,
|
||
|
height: h,
|
||
|
margin: "0px"})*/
|
||
|
Elements.setStyle(this.pseudoFrameTop, {
|
||
|
width: w,
|
||
|
height: 0.1*b+"px",
|
||
|
margin: "0px"})
|
||
|
Elements.setStyle(this.pseudoFrameLeft, {
|
||
|
width: 0.1*b+"px",
|
||
|
height: h,
|
||
|
margin: "0px"})
|
||
|
Elements.setStyle(this.pseudoFrameRight, {
|
||
|
width: 0.1*b+"px",
|
||
|
height: h,
|
||
|
margin: "0px"})
|
||
|
Elements.setStyle(this.closeButton, {
|
||
|
right: (b * 0.75) + "px",
|
||
|
bottom: "0px",
|
||
|
width: b+"px",
|
||
|
height: b+"px"})
|
||
|
Elements.setStyle(this.backButton, {
|
||
|
left: (b * 0.1) +"px",
|
||
|
bottom: "0px",
|
||
|
width: b+"px",
|
||
|
height: b+"px"})
|
||
|
Elements.setStyle(this.forwardButton, {
|
||
|
left: (this.border + (b * 0.1)) +"px",
|
||
|
bottom: "0px",
|
||
|
width: b+"px",
|
||
|
height: b+"px"})
|
||
|
Elements.setStyle(this.showWebviewListButton, {
|
||
|
right: "1px",
|
||
|
background: "white",
|
||
|
bottom: b+1+"px",
|
||
|
width: b+"px",
|
||
|
height: b+"px"})
|
||
|
|
||
|
if(this.tabMap.size > 1){
|
||
|
this.tabs.style.display = "flex"
|
||
|
this.showWebviewListButton.style.display = "inline"
|
||
|
|
||
|
if(this.hasTtitleBar){
|
||
|
Elements.setStyle(this.webBackground, {
|
||
|
top: b+"px",
|
||
|
width: w,
|
||
|
height: size-b,
|
||
|
margin: "1px"})
|
||
|
Elements.setStyle(this.titlebar, {
|
||
|
display: "inline"})
|
||
|
}
|
||
|
if(!this.hasTtitleBar){
|
||
|
Elements.setStyle(this.webBackground, {
|
||
|
width: w,
|
||
|
height: size,
|
||
|
margin: "1px"})
|
||
|
}
|
||
|
}
|
||
|
if(this.tabMap.size <= 1){
|
||
|
this.tabs.style.display = "none"
|
||
|
this.showWebviewListButton.style.display = "none"
|
||
|
|
||
|
if(this.hasTtitleBar){
|
||
|
Elements.setStyle(this.webBackground, {
|
||
|
top: b+"px",
|
||
|
width: w,
|
||
|
height: size,
|
||
|
margin: "1px"})
|
||
|
Elements.setStyle(this.titlebar, {
|
||
|
display: "inline"})
|
||
|
}
|
||
|
if(!this.hasTtitleBar){
|
||
|
Elements.setStyle(this.webBackground, {
|
||
|
width: w,
|
||
|
height: h,
|
||
|
margin: "1px"})
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if(!this.tabbedView){
|
||
|
this.tabs.style.display = "none"
|
||
|
this.showWebviewListButton.style.display = "none"
|
||
|
Elements.setStyle(this.webBackground, {
|
||
|
width: w,
|
||
|
height: h,
|
||
|
margin: "1px"})
|
||
|
}
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
class minimalPadFromElement {
|
||
|
|
||
|
constructor(element, scatterContainer, {
|
||
|
startScale=1.0, minScale=0.1, maxScale=1.0,
|
||
|
autoBringToFront=true,
|
||
|
translatable=true, scalable=true, rotatable=true,
|
||
|
movableX=true,
|
||
|
movableY=true,
|
||
|
rotationDegrees=null,
|
||
|
rotation=null,
|
||
|
onTransform=null,
|
||
|
transformOrigin = 'center center',
|
||
|
// extras which are in part needed
|
||
|
x=0,
|
||
|
y=0,
|
||
|
width=null,
|
||
|
height=null,
|
||
|
resizable=false,
|
||
|
} ={}) {
|
||
|
|
||
|
this.element = element
|
||
|
|
||
|
this.x = x
|
||
|
this.y = y
|
||
|
this.width = width
|
||
|
this.height = height
|
||
|
this.minScale = minScale
|
||
|
this.maxScale = maxScale
|
||
|
this.scatterContainer = scatterContainer
|
||
|
this.scale = startScale
|
||
|
this.scalable = scalable
|
||
|
this.rotatable = rotatable
|
||
|
this.rotationDegrees = this.startRotationDegrees
|
||
|
this.transformOrigin = transformOrigin
|
||
|
|
||
|
this.frame = document.createElement('div')
|
||
|
Elements.setStyle(this.frame, {
|
||
|
width: this.width+"px",
|
||
|
height: this.height+"px",
|
||
|
backgroundColor: "#333",
|
||
|
position: "fixed",
|
||
|
top: 0,
|
||
|
left: 0,
|
||
|
overflow: "auto"})
|
||
|
|
||
|
this.closeButton = this.addButton("../assets/icons/svg/cross.svg", "close")
|
||
|
|
||
|
document.body.appendChild( this.frame)
|
||
|
this.border = 50
|
||
|
|
||
|
this.frame.appendChild(this.element)
|
||
|
|
||
|
this.title = document.createElement("div")
|
||
|
this.title.innerHTML = ""
|
||
|
this.title.style.color = "white"
|
||
|
// this.frame.appendChild(this.title)
|
||
|
|
||
|
Elements.setStyle(this.title, {
|
||
|
position: "absolute"
|
||
|
})
|
||
|
|
||
|
// this.pseudoFrame = document.createElement('div')
|
||
|
this.pseudoFrameTop = document.createElement('div')
|
||
|
this.pseudoFrameLeft = document.createElement('div')
|
||
|
this.pseudoFrameRight = document.createElement('div')
|
||
|
|
||
|
/*Elements.setStyle(this.pseudoFrame, {
|
||
|
position: "absolute",
|
||
|
top: "0px",
|
||
|
left: "0px",
|
||
|
width: "100%",
|
||
|
height: "100%",
|
||
|
pointerEvents: "none"
|
||
|
})*/
|
||
|
|
||
|
Elements.setStyle(this.pseudoFrameTop, {
|
||
|
position: "absolute",
|
||
|
// background: "pink",
|
||
|
top: "0px",
|
||
|
left: "0px",
|
||
|
width: "100%"
|
||
|
// height: "50px"
|
||
|
})
|
||
|
|
||
|
Elements.setStyle(this.pseudoFrameLeft, {
|
||
|
position: "absolute",
|
||
|
// background: "pink",
|
||
|
top: "0px",
|
||
|
left: "0px",
|
||
|
// width: "5px",
|
||
|
height: "100%"
|
||
|
})
|
||
|
|
||
|
Elements.setStyle(this.pseudoFrameRight, {
|
||
|
position: "absolute",
|
||
|
// background: "pink",
|
||
|
top: "0px",
|
||
|
right: "0px",
|
||
|
// width: "5px",
|
||
|
height: "100%"
|
||
|
})
|
||
|
this.frame.appendChild(this.pseudoFrameTop)
|
||
|
this.frame.appendChild(this.pseudoFrameLeft)
|
||
|
this.frame.appendChild(this.pseudoFrameRight)
|
||
|
// this.frame.appendChild(this.pseudoFrame)
|
||
|
|
||
|
this.pseudoFrameTop.addEventListener('pointerenter',(e)=>{
|
||
|
this.scatter.scalable=false
|
||
|
this.element.pointerEvents = "none"
|
||
|
e.target.style.cursor = "move"
|
||
|
})
|
||
|
this.pseudoFrameTop.addEventListener('pointerleave',(e)=>{
|
||
|
this.scatter.scalable=true
|
||
|
// this.frame.style.cursor = "initial"
|
||
|
})
|
||
|
|
||
|
this.pseudoFrameLeft.addEventListener('pointerenter',(e)=>{
|
||
|
// e.target.setPointerCapture(e.pointerId)
|
||
|
this.scatter.scalable=false
|
||
|
this.element.pointerEvents = "none"
|
||
|
e.target.style.cursor = "move"
|
||
|
})
|
||
|
this.pseudoFrameLeft.addEventListener('pointerleave',(e)=>{
|
||
|
this.scatter.scalable=true
|
||
|
// this.frame.style.cursor = "initial"
|
||
|
})
|
||
|
|
||
|
this.pseudoFrameRight.addEventListener('pointerenter',(e)=>{
|
||
|
this.scatter.scalable=false
|
||
|
this.element.pointerEvents = "none"
|
||
|
e.target.style.cursor = "move"
|
||
|
})
|
||
|
this.pseudoFrameRight.addEventListener('pointerleave',(e)=>{
|
||
|
this.scatter.scalable=true
|
||
|
// this.frame.style.cursor = "initial"
|
||
|
})
|
||
|
// this.element.style.overflow = "auto"
|
||
|
// this.element.style.position = "absolute"
|
||
|
|
||
|
this.layout()
|
||
|
|
||
|
this.closeButton.addEventListener('click', ()=>{
|
||
|
this.frame.style.display="none"
|
||
|
})
|
||
|
|
||
|
this.scatter = new DOMScatter(this.frame, scatterContainer, {
|
||
|
x: this.x,
|
||
|
y: this.y,
|
||
|
startScale: this.startScale,
|
||
|
width: this.width,
|
||
|
height: this.height,
|
||
|
minScale: this.minScale,
|
||
|
maxScale: this.maxScale,
|
||
|
scalable: this.scalable,
|
||
|
resizable: true,
|
||
|
rotatable: this.rotatable})
|
||
|
|
||
|
let img=document.createElement("img")
|
||
|
img.style.width = "70%"
|
||
|
img.style.position = "absolute"
|
||
|
img.style.bottom = "20%"
|
||
|
img.style.right = "20%"
|
||
|
img.style.pointerEvents="none"
|
||
|
img.src = "../../assets/icons/png/flat/resize.png"
|
||
|
this.scatter.resizeButton.appendChild(img)
|
||
|
|
||
|
this.scatter.bringToFront()
|
||
|
this.scatter.addTransformEventCallback((e) => {
|
||
|
let newBorder = 50 / e.scale
|
||
|
if (newBorder !== this.border) {
|
||
|
this.border = newBorder
|
||
|
this.layout()
|
||
|
}
|
||
|
})
|
||
|
|
||
|
this.element.addEventListener('pointerdown', (e) => {
|
||
|
this.scatter.bringToFront()
|
||
|
})
|
||
|
}
|
||
|
|
||
|
close() {
|
||
|
// this.frame.style.display="none"
|
||
|
this.frame.parentNode.removeChild(this.frame)
|
||
|
urlPadMap.delete(this.url)
|
||
|
}
|
||
|
|
||
|
addButton(src, value) {
|
||
|
let button = document.createElement("img")
|
||
|
button.type = "image"
|
||
|
button.className = "frameButton"
|
||
|
button.style.position = "absolute"
|
||
|
button.src = fileURL(src)
|
||
|
button.value="close"
|
||
|
button.draggable = false
|
||
|
this.frame.appendChild(button)
|
||
|
return button
|
||
|
}
|
||
|
|
||
|
layout() {
|
||
|
let b = this.border
|
||
|
let b2 = b * 2
|
||
|
let b8 = b / 8
|
||
|
let b25 = b / 25
|
||
|
let b15 = b / 15
|
||
|
|
||
|
let size = "calc(100% - " + (2*b) +"px)"
|
||
|
let h = "calc(100% - " + (b) +"px)"
|
||
|
let w = "calc(100% - "+2 +"px)"
|
||
|
let w2 = "calc(100% - " + (b+2) +"px)"
|
||
|
|
||
|
this.scatter.resizeButton.style.width=b+"px"
|
||
|
this.scatter.resizeButton.style.height=b+"px"
|
||
|
|
||
|
Elements.setStyle(this.frame, {
|
||
|
// borderRadius: b8 + "px",
|
||
|
// boxShadow: `${b25}px ${b15}px ${b8}px rgba(0, 0, 0, 0.5)`
|
||
|
})
|
||
|
|
||
|
Elements.setStyle(this.element, {
|
||
|
width: w,
|
||
|
height: h,
|
||
|
top: 0+"px",
|
||
|
left: 0+"px"})
|
||
|
|
||
|
Elements.setStyle(this.title, {
|
||
|
left: (b * 1.5) + "px",
|
||
|
fontSize: (b * 0.8) + "px",
|
||
|
top: (0.1)+"0px"})
|
||
|
|
||
|
Elements.setStyle(this.pseudoFrameTop, {
|
||
|
width: w,
|
||
|
height: 0.1*b+"px",
|
||
|
margin: "0px"})
|
||
|
Elements.setStyle(this.pseudoFrameLeft, {
|
||
|
width: 0.1*b+"px",
|
||
|
height: h,
|
||
|
margin: "0px"})
|
||
|
Elements.setStyle(this.pseudoFrameRight, {
|
||
|
width: 0.1*b+"px",
|
||
|
height: h,
|
||
|
margin: "0px"})
|
||
|
Elements.setStyle(this.closeButton, {
|
||
|
right: (b * 0.75) + "px",
|
||
|
bottom: "0px",
|
||
|
width: b+"px",
|
||
|
height: b+"px"})
|
||
|
}
|
||
|
}
|
||
|
|
||
|
module.exports = { minimalPad, minimalDOMPadContainer, minimalPadFromElement}
|