summaryrefslogtreecommitdiff
path: root/packages/frontend/src/components/MkWindow.vue
diff options
context:
space:
mode:
authorremi <768.jac@gmail.com>2023-04-08 05:55:05 +0200
committerGitHub <noreply@github.com>2023-04-08 12:55:05 +0900
commit44a4faebc00c67becba925bd4bb928b941cde91a (patch)
tree6db1a472853294de620b1717615215331ef37efc /packages/frontend/src/components/MkWindow.vue
parentci: ignore develop commits (diff)
downloadsharkey-44a4faebc00c67becba925bd4bb928b941cde91a.tar.gz
sharkey-44a4faebc00c67becba925bd4bb928b941cde91a.tar.bz2
sharkey-44a4faebc00c67becba925bd4bb928b941cde91a.zip
feat: add minimize/Fold button for windows (#10508)
* add window minimizing! * Fix window being able to go offscreen * Revert en-US.yml changes --------- Co-authored-by: mothmoon <remilia@remilia.se>
Diffstat (limited to 'packages/frontend/src/components/MkWindow.vue')
-rw-r--r--packages/frontend/src/components/MkWindow.vue64
1 files changed, 46 insertions, 18 deletions
diff --git a/packages/frontend/src/components/MkWindow.vue b/packages/frontend/src/components/MkWindow.vue
index 30b5391e9a..1afcb104e9 100644
--- a/packages/frontend/src/components/MkWindow.vue
+++ b/packages/frontend/src/components/MkWindow.vue
@@ -11,15 +11,17 @@
<div :class="$style.body" class="_shadow" @mousedown="onBodyMousedown" @keydown="onKeydown">
<div :class="[$style.header, { [$style.mini]: mini }]" @contextmenu.prevent.stop="onContextmenu">
<span :class="$style.headerLeft">
- <button v-for="button in buttonsLeft" v-tooltip="button.title" class="_button" :class="[$style.headerButton, { [$style.highlighted]: button.highlighted }]" @click="button.onClick"><i :class="button.icon"></i></button>
+ <button v-for="button in buttonsLeft" v-if="!minimized" v-tooltip="button.title" class="_button" :class="[$style.headerButton, { [$style.highlighted]: button.highlighted }]" @click="button.onClick"><i :class="button.icon"></i></button>
</span>
<span :class="$style.headerTitle" @mousedown.prevent="onHeaderMousedown" @touchstart.prevent="onHeaderMousedown">
<slot name="header"></slot>
</span>
<span :class="$style.headerRight">
- <button v-for="button in buttonsRight" v-tooltip="button.title" class="_button" :class="[$style.headerButton, { [$style.highlighted]: button.highlighted }]" @click="button.onClick"><i :class="button.icon"></i></button>
+ <button v-for="button in buttonsRight" v-if="!minimized" v-tooltip="button.title" class="_button" :class="[$style.headerButton, { [$style.highlighted]: button.highlighted }]" @click="button.onClick"><i :class="button.icon"></i></button>
+ <button v-if="canResize && minimized" v-tooltip="i18n.ts.windowRestore" class="_button" :class="$style.headerButton" @click="unMinimize()"><i class="ti ti-maximize"></i></button>
+ <button v-else-if="canResize && !maximized" v-tooltip="i18n.ts.windowMinimize" class="_button" :class="$style.headerButton" @click="minimize()"><i class="ti ti-minimize"></i></button>
<button v-if="canResize && maximized" v-tooltip="i18n.ts.windowRestore" class="_button" :class="$style.headerButton" @click="unMaximize()"><i class="ti ti-picture-in-picture"></i></button>
- <button v-else-if="canResize && !maximized" v-tooltip="i18n.ts.windowMaximize" class="_button" :class="$style.headerButton" @click="maximize()"><i class="ti ti-rectangle"></i></button>
+ <button v-else-if="canResize && !maximized && !minimized" v-tooltip="i18n.ts.windowMaximize" class="_button" :class="$style.headerButton" @click="maximize()"><i class="ti ti-rectangle"></i></button>
<button v-if="closeButton" v-tooltip="i18n.ts.close" class="_button" :class="$style.headerButton" @click="close()"><i class="ti ti-x"></i></button>
</span>
</div>
@@ -27,7 +29,7 @@
<slot></slot>
</div>
</div>
- <template v-if="canResize">
+ <template v-if="canResize && !minimized">
<div :class="$style.handleTop" @mousedown.prevent="onTopHandleMousedown"></div>
<div :class="$style.handleRight" @mousedown.prevent="onRightHandleMousedown"></div>
<div :class="$style.handleBottom" @mousedown.prevent="onBottomHandleMousedown"></div>
@@ -100,10 +102,11 @@ let rootEl = $shallowRef<HTMLElement | null>();
let showing = $ref(true);
let beforeClickedAt = 0;
let maximized = $ref(false);
-let unMaximizedTop = '';
-let unMaximizedLeft = '';
-let unMaximizedWidth = '';
-let unMaximizedHeight = '';
+let minimized = $ref(false);
+let unResizedTop = '';
+let unResizedLeft = '';
+let unResizedWidth = '';
+let unResizedHeight = '';
function close() {
showing = false;
@@ -132,10 +135,10 @@ function top() {
function maximize() {
maximized = true;
- unMaximizedTop = rootEl.style.top;
- unMaximizedLeft = rootEl.style.left;
- unMaximizedWidth = rootEl.style.width;
- unMaximizedHeight = rootEl.style.height;
+ unResizedTop = rootEl.style.top;
+ unResizedLeft = rootEl.style.left;
+ unResizedWidth = rootEl.style.width;
+ unResizedHeight = rootEl.style.height;
rootEl.style.top = '0';
rootEl.style.left = '0';
rootEl.style.width = '100%';
@@ -144,10 +147,35 @@ function maximize() {
function unMaximize() {
maximized = false;
- rootEl.style.top = unMaximizedTop;
- rootEl.style.left = unMaximizedLeft;
- rootEl.style.width = unMaximizedWidth;
- rootEl.style.height = unMaximizedHeight;
+ rootEl.style.top = unResizedTop;
+ rootEl.style.left = unResizedLeft;
+ rootEl.style.width = unResizedWidth;
+ rootEl.style.height = unResizedHeight;
+}
+
+function minimize() {
+ minimized = true;
+ unResizedWidth = rootEl.style.width;
+ unResizedHeight = rootEl.style.height;
+ rootEl.style.width = minWidth + 'px';
+ rootEl.style.height = props.mini ? '32px' : '39px';
+}
+
+function unMinimize() {
+ const main = rootEl;
+ if (main == null) return;
+
+ minimized = false;
+ rootEl.style.width = unResizedWidth;
+ rootEl.style.height = unResizedHeight;
+ const browserWidth = window.innerWidth;
+ const browserHeight = window.innerHeight;
+ const windowWidth = main.offsetWidth;
+ const windowHeight = main.offsetHeight;
+
+ const position = main.getBoundingClientRect();
+ if (position.top + windowHeight > browserHeight) main.style.top = browserHeight - windowHeight + 'px';
+ if (position.left + windowWidth > browserWidth) main.style.left = browserWidth - windowWidth + 'px';
}
function onBodyMousedown() {
@@ -155,7 +183,7 @@ function onBodyMousedown() {
}
function onDblClick() {
- maximize();
+ if (minimized) {unMinimize();} else {maximize();}
}
function onHeaderMousedown(evt: MouseEvent) {
@@ -187,7 +215,7 @@ function onHeaderMousedown(evt: MouseEvent) {
const clickX = evt.touches && evt.touches.length > 0 ? evt.touches[0].clientX : evt.clientX;
const clickY = evt.touches && evt.touches.length > 0 ? evt.touches[0].clientY : evt.clientY;
- const moveBaseX = beforeMaximized ? parseInt(unMaximizedWidth, 10) / 2 : clickX - position.left; // TODO: parseIntやめる
+ const moveBaseX = beforeMaximized ? parseInt(unResizedWidth, 10) / 2 : clickX - position.left; // TODO: parseIntやめる
const moveBaseY = beforeMaximized ? 20 : clickY - position.top;
const browserWidth = window.innerWidth;
const browserHeight = window.innerHeight;