feat: Change edge detection for HippieTaskBar

- Add position to options
- New function for edge detection according to mouse position
- set and use options.position
This commit is contained in:
sthag 2026-02-09 21:08:30 +01:00
parent 9696442a91
commit 7912b002a2
3 changed files with 29 additions and 13 deletions

View file

@ -95,7 +95,8 @@
"TimeDisplay": true, "TimeDisplay": true,
"DateDisplay": true, "DateDisplay": true,
"checkButtonAndTarget": true, "checkButtonAndTarget": true,
"getClosestEdge": true, "getClosestEdgeToElement": true,
"getClosestEdgeToMouse": true,
"centerElementUnderCursor": true, "centerElementUnderCursor": true,
"setAttributesAccordingToPosition": true, "setAttributesAccordingToPosition": true,
"HippieTaskBar": true "HippieTaskBar": true

View file

@ -346,20 +346,37 @@ function checkButtonAndTarget(event, element, button = 0) {
); );
} }
function getClosestEdge(element) { function getClosestEdgeToElement(element) {
'use strict';
const rect = element.getBoundingClientRect(); const rect = element.getBoundingClientRect();
const windowWidth = window.innerWidth;
const windowHeight = window.innerHeight;
const distances = { const distances = {
top: rect.top, top: rect.top,
right: windowWidth - rect.right, right: window.innerWidth - rect.right,
bottom: windowHeight - rect.bottom, bottom: window.innerHeight - rect.bottom,
left: rect.left left: rect.left
}; };
return Object.keys(distances).reduce((a, b) => distances[a] < distances[b] ? a : b); return Object.keys(distances).reduce((a, b) => distances[a] < distances[b] ? a : b);
} }
function getClosestEdgeToMouse(event) {
'use strict';
const mouseX = event.clientX;
const mouseY = event.clientY;
const distances = {
left: mouseX,
right: window.innerWidth - mouseX,
top: mouseY,
bottom: window.innerHeight - mouseY
};
return Object.keys(distances).reduce((a, b) =>
distances[a] < distances[b] ? a : b
);
}
function centerElementUnderCursor(event, element) { function centerElementUnderCursor(event, element) {
const offsetX = element.getBoundingClientRect().width / 2; const offsetX = element.getBoundingClientRect().width / 2;
const offsetY = element.getBoundingClientRect().height / 2; const offsetY = element.getBoundingClientRect().height / 2;

View file

@ -8,6 +8,7 @@ class HippieTaskBar {
// TODO: Erweitern auf allgemeine Möglichkeiten und dann aus JSON-Datei laden // TODO: Erweitern auf allgemeine Möglichkeiten und dann aus JSON-Datei laden
this.options = options || { this.options = options || {
direction: 0, direction: 0,
position: 'bottom',
date: { date: {
year: 'numeric', year: 'numeric',
month: '2-digit', month: '2-digit',
@ -30,7 +31,7 @@ class HippieTaskBar {
this.element.querySelector('.clock').appendChild(dateElement); this.element.querySelector('.clock').appendChild(dateElement);
this.date = new DateDisplay(dateElement, this.options.date); this.date = new DateDisplay(dateElement, this.options.date);
this.setOptions('bottom'); this.setOptions(this.options.position);
} }
onMouseDown(event) { onMouseDown(event) {
@ -49,7 +50,7 @@ class HippieTaskBar {
onMouseMove(event) { onMouseMove(event) {
if (this.isDragging) { if (this.isDragging) {
const closestEdge = getClosestEdge(this.placeholder); this.options.position = getClosestEdgeToMouse(event);
const borderRadius = '4px'; const borderRadius = '4px';
const attributes = { const attributes = {
top: { top: {
@ -110,7 +111,7 @@ class HippieTaskBar {
} }
}; };
setAttributesAccordingToPosition(this.placeholder, closestEdge, attributes); setAttributesAccordingToPosition(this.placeholder, this.options.position, attributes);
centerElementUnderCursor(event, this.placeholder); centerElementUnderCursor(event, this.placeholder);
} }
} }
@ -136,11 +137,8 @@ class HippieTaskBar {
this.element.style.display = ''; this.element.style.display = '';
} }
// TODO: Prüfung auf Ziel auslagern und schon bei Mausbewegung verfügbar machen
snapToEdges() { snapToEdges() {
const closestEdge = getClosestEdge(this.placeholder); this.setOptions(this.options.position);
this.setOptions(closestEdge);
this.date.changeFormat(this.options.date, this.options.direction); this.date.changeFormat(this.options.date, this.options.direction);
} }