mirror of
https://github.com/wailsapp/wails.git
synced 2025-05-05 23:43:16 +08:00
137 lines
3.6 KiB
JavaScript
137 lines
3.6 KiB
JavaScript
/*
|
|
_ __ _ __
|
|
| | / /___ _(_) /____
|
|
| | /| / / __ `/ / / ___/
|
|
| |/ |/ / /_/ / / (__ )
|
|
|__/|__/\__,_/_/_/____/
|
|
The electron alternative for Go
|
|
(c) Lea Anthony 2019-present
|
|
*/
|
|
|
|
/* jshint esversion: 9 */
|
|
|
|
import {invoke} from "./invoke";
|
|
import {GetFlag} from "./flags";
|
|
|
|
let shouldDrag = false;
|
|
|
|
export function dragTest(e) {
|
|
let val = window.getComputedStyle(e.target).getPropertyValue("--webkit-app-region");
|
|
if (val) {
|
|
val = val.trim();
|
|
}
|
|
|
|
if (val !== "drag") {
|
|
return false;
|
|
}
|
|
|
|
// Only process the primary button
|
|
if (e.buttons !== 1) {
|
|
return false;
|
|
}
|
|
|
|
return e.detail === 1;
|
|
}
|
|
|
|
export function setupDrag() {
|
|
window.addEventListener('mousedown', onMouseDown);
|
|
window.addEventListener('mousemove', onMouseMove);
|
|
window.addEventListener('mouseup', onMouseUp);
|
|
}
|
|
|
|
let resizeEdge = null;
|
|
|
|
function testResize(e) {
|
|
if( resizeEdge ) {
|
|
invoke("resize:" + resizeEdge);
|
|
return true
|
|
}
|
|
return false;
|
|
}
|
|
|
|
function onMouseDown(e) {
|
|
|
|
// Check for resizing on Windows
|
|
if( WINDOWS ) {
|
|
if (testResize()) {
|
|
return;
|
|
}
|
|
}
|
|
if (dragTest(e)) {
|
|
// Ignore drag on scrollbars
|
|
if (e.offsetX > e.target.clientWidth || e.offsetY > e.target.clientHeight) {
|
|
return;
|
|
}
|
|
shouldDrag = true;
|
|
} else {
|
|
shouldDrag = false;
|
|
}
|
|
}
|
|
|
|
function onMouseUp(e) {
|
|
let mousePressed = e.buttons !== undefined ? e.buttons : e.which;
|
|
if (mousePressed > 0) {
|
|
endDrag();
|
|
}
|
|
}
|
|
|
|
export function endDrag() {
|
|
document.body.style.cursor = 'default';
|
|
shouldDrag = false;
|
|
}
|
|
|
|
function setResize(cursor) {
|
|
document.documentElement.style.cursor = cursor || defaultCursor;
|
|
resizeEdge = cursor;
|
|
}
|
|
|
|
function onMouseMove(e) {
|
|
if (shouldDrag) {
|
|
shouldDrag = false;
|
|
let mousePressed = e.buttons !== undefined ? e.buttons : e.which;
|
|
if (mousePressed > 0) {
|
|
invoke("drag");
|
|
}
|
|
return;
|
|
}
|
|
|
|
if (WINDOWS) {
|
|
handleResize(e);
|
|
}
|
|
}
|
|
|
|
let defaultCursor = "auto";
|
|
|
|
function handleResize(e) {
|
|
let resizeHandleHeight = GetFlag("system.resizeHandleHeight") || 5;
|
|
let resizeHandleWidth = GetFlag("system.resizeHandleWidth") || 5;
|
|
|
|
// Extra pixels for the corner areas
|
|
let cornerExtra = GetFlag("resizeCornerExtra") || 10;
|
|
|
|
let rightBorder = window.outerWidth - e.clientX < resizeHandleWidth;
|
|
let leftBorder = e.clientX < resizeHandleWidth;
|
|
let topBorder = e.clientY < resizeHandleHeight;
|
|
let bottomBorder = window.outerHeight - e.clientY < resizeHandleHeight;
|
|
|
|
// Adjust for corners
|
|
let rightCorner = window.outerWidth - e.clientX < (resizeHandleWidth + cornerExtra);
|
|
let leftCorner = e.clientX < (resizeHandleWidth + cornerExtra);
|
|
let topCorner = e.clientY < (resizeHandleHeight + cornerExtra);
|
|
let bottomCorner = window.outerHeight - e.clientY < (resizeHandleHeight + cornerExtra);
|
|
|
|
// If we aren't on an edge, but were, reset the cursor to default
|
|
if (!leftBorder && !rightBorder && !topBorder && !bottomBorder && resizeEdge !== undefined) {
|
|
setResize();
|
|
}
|
|
// Adjusted for corner areas
|
|
else if (rightCorner && bottomCorner) setResize("se-resize");
|
|
else if (leftCorner && bottomCorner) setResize("sw-resize");
|
|
else if (leftCorner && topCorner) setResize("nw-resize");
|
|
else if (topCorner && rightCorner) setResize("ne-resize");
|
|
else if (leftBorder) setResize("w-resize");
|
|
else if (topBorder) setResize("n-resize");
|
|
else if (bottomBorder) setResize("s-resize");
|
|
else if (rightBorder) setResize("e-resize");
|
|
}
|