5
0
mirror of https://github.com/wailsapp/wails.git synced 2025-05-05 23:43:16 +08:00
wails/v3/internal/runtime/desktop/drag.js

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");
}