-
Notifications
You must be signed in to change notification settings - Fork 0
/
auto-panel.js
125 lines (119 loc) · 3.31 KB
/
auto-panel.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
// https://forum.vivaldi.net/topic/28413/open-panels-on-mouse-over/22?_=1593504963587
function panelMouseOver(autoHide, delay_show, delay_change, delay_hide) {
var buttons = document
.getElementById("switch")
.getElementsByTagName("button");
buttons = [...buttons].filter((button) => button.title !== "http://empty/");
var show_token = null;
var activeButton = null;
/* Stop timer if mouse exits screen */
document.addEventListener("mouseout", function (e) {
clearTimeout(show_token);
});
/* Do auto-hide if applicable */
if (autoHide) {
var content = (document.getElementById("webview-container").onmouseover =
function () {
if (
!document
.getElementById("panels-container")
.getAttribute("class")
.includes("icons")
) {
clearTimeout(show_token);
setTimeout(function () {
vivaldi.prefs.get(
"vivaldi.panels.as_overlay.enabled",
function (isEnabled) {
hidePanel(isEnabled);
}
);
}, delay_hide);
}
});
}
function activeButtonIndex() {
for (let i = 0; i < buttons.length - 2; i++) {
if (buttons[i].getAttribute("class").includes("active")) {
return i;
}
}
return -1;
}
function getActiveButton() {
if (buttons[activeButtonIndex()]) {
return buttons[activeButtonIndex()];
}
return null;
}
function setActive(index, doDelay) {
clearTimeout(show_token);
var delay = 0;
if (doDelay) {
delay = activeButtonIndex() < 0 ? delay_show : delay_change;
}
show_token = setTimeout(function () {
var newButton = buttons[index];
if (
!["active", "add", "webpanel-suggestion", "addwebpanel"].some((cls) =>
newButton.classList.contains(cls)
)
) {
activeButton = newButton;
activeButton.click();
panel = index;
}
}, delay);
}
function setListeners() {
for (let index = 0; index < buttons.length - 2; index++) {
buttons[index].onmouseover = function () {
setActive(index, true);
};
buttons[index].onmouseout = function () {
clearTimeout(show_token);
};
buttons[index].ondragover = function () {
setActive(index, false);
};
}
}
setListeners();
function hidePanel(isFloating) {
if (isFloating) {
activeButton = activeButton ? activeButton : getActiveButton();
if (
activeButton &&
activeButton.getAttribute("class").includes("active")
) {
activeButton.click();
activeButton = null;
}
}
}
}
function addObserver() {
const switchPanel = document.getElementById("switch");
const config = {
childList: true,
subtree: true,
};
const callback = function (mutationList, observer) {
for (let mutation of mutationList) {
if (mutation.type === "childList") {
panelMouseOver(false, 500, 400, 400);
}
}
};
const observer = new MutationObserver(callback);
observer.observe(switchPanel, config);
}
setTimeout(function waitMouseOver() {
const browser = document.getElementById("browser");
if (browser) {
panelMouseOver(false, 500, 400, 400);
addObserver();
} else {
setTimeout(waitMouseOver, 500);
}
}, 500);