Skip to content

Commit ae5697d

Browse files
committed
feat: Added custom titleBarverlay with close,minimize and maximize styles
1 parent 0eb63e5 commit ae5697d

File tree

5 files changed

+169
-8
lines changed

5 files changed

+169
-8
lines changed

main.ts

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -102,13 +102,6 @@ export class Main {
102102
resizable: true,
103103
};
104104

105-
if (!this.isMac) {
106-
options.titleBarOverlay = {
107-
color: '#FFFFFF',
108-
height: 26,
109-
};
110-
}
111-
112105
if (this.isDevelopment || this.isLinux) {
113106
Object.assign(options, { icon: this.icon });
114107
}

main/preload.ts

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,42 @@ const ipc = {
2727
return ipcRenderer.send(IPC_MESSAGES.RELOAD_MAIN_WINDOW);
2828
},
2929

30+
minimizeWindow() {
31+
return ipcRenderer.send(IPC_MESSAGES.MINIMIZE_MAIN_WINDOW);
32+
},
33+
34+
toggleMaximize() {
35+
return ipcRenderer.send(IPC_MESSAGES.MAXIMIZE_MAIN_WINDOW);
36+
},
37+
38+
isMaximized() {
39+
return new Promise((resolve, reject) => {
40+
ipcRenderer.send(IPC_MESSAGES.ISMAXIMIZED_MAIN_WINDOW);
41+
ipcRenderer.once(
42+
IPC_MESSAGES.ISMAXIMIZED_RESULT,
43+
(_event, isMaximized) => {
44+
resolve(isMaximized);
45+
}
46+
);
47+
});
48+
},
49+
50+
isFullscreen() {
51+
return new Promise((resolve, reject) => {
52+
ipcRenderer.send(IPC_MESSAGES.ISFULLSCREEN_MAIN_WINDOW);
53+
ipcRenderer.once(
54+
IPC_MESSAGES.ISFULLSCREEN_RESULT,
55+
(_event, isFullscreen) => {
56+
resolve(isFullscreen);
57+
}
58+
);
59+
});
60+
},
61+
62+
closeWindow() {
63+
return ipcRenderer.send(IPC_MESSAGES.CLOSE_MAIN_WINDOW);
64+
},
65+
3066
async getCreds() {
3167
return (await ipcRenderer.invoke(IPC_ACTIONS.GET_CREDS)) as Creds;
3268
},

main/registerIpcMainMessageListeners.ts

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,28 @@ export default function registerIpcMainMessageListeners(main: Main) {
2020
ipcMain.on(IPC_MESSAGES.RELOAD_MAIN_WINDOW, () => {
2121
main.mainWindow!.reload();
2222
});
23+
24+
ipcMain.on(IPC_MESSAGES.MINIMIZE_MAIN_WINDOW, () => {
25+
main.mainWindow!.minimize();
26+
});
27+
28+
ipcMain.on(IPC_MESSAGES.MAXIMIZE_MAIN_WINDOW, () => {
29+
main.mainWindow!.isMaximized()?main.mainWindow!.unmaximize():main.mainWindow!.maximize()
30+
});
31+
32+
ipcMain.on(IPC_MESSAGES.ISMAXIMIZED_MAIN_WINDOW, (event) => {
33+
const isMaximized = main.mainWindow?.isMaximized() ?? false;
34+
event.sender.send(IPC_MESSAGES.ISMAXIMIZED_RESULT, isMaximized);
35+
});
36+
37+
ipcMain.on(IPC_MESSAGES.ISFULLSCREEN_MAIN_WINDOW, (event) => {
38+
const isFullscreen = main.mainWindow?.isFullScreen() ?? false;
39+
event.sender.send(IPC_MESSAGES.ISFULLSCREEN_RESULT, isFullscreen);
40+
});
41+
42+
ipcMain.on(IPC_MESSAGES.CLOSE_MAIN_WINDOW, () => {
43+
main.mainWindow!.close();
44+
});
2345

2446
ipcMain.on(IPC_MESSAGES.OPEN_EXTERNAL, (_, link: string) => {
2547
shell.openExternal(link).catch((err) => emitMainProcessError(err));

src/components/WindowsTitleBar.vue

Lines changed: 104 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,61 @@
11
<template>
22
<div
3-
class="window-drag flex items-center border-b dark:bg-gray-900 text-gray-900 dark:text-gray-100 border-gray-100 dark:border-gray-800"
3+
class="
4+
window-drag
5+
flex
6+
items-center
7+
border-b
8+
dark:bg-gray-900
9+
text-gray-900
10+
dark:text-gray-100
11+
border-gray-100
12+
dark:border-gray-800
13+
"
414
style="height: 28px"
515
>
616
<Fb class="ms-2" />
717
<p v-if="companyName && dbPath" class="mx-auto text-sm">
818
{{ companyName }} - {{ dbPath }}
919
</p>
20+
<div v-if="!isFullscreen" class="window-no-drag flex h-full items-center justify-end">
21+
<div
22+
class="
23+
flex
24+
items-center
25+
px-4
26+
h-full
27+
hover:bg-gray-300
28+
dark:hover:bg-gray-875
29+
"
30+
@click="minimizeWindow"
31+
>
32+
<feather-icon name="minus" class="h-4 w-4 flex-shrink-0" />
33+
</div>
34+
<div
35+
class="
36+
flex
37+
items-center
38+
px-4
39+
h-full
40+
hover:bg-gray-300
41+
dark:hover:bg-gray-875
42+
"
43+
@click="toggleMaximize"
44+
>
45+
<feather-icon
46+
v-if="isMax"
47+
name="minimize"
48+
class="h-3 w-3 flex-shrink-0"
49+
/>
50+
<feather-icon v-else name="square" class="h-3 w-3 flex-shrink-0" />
51+
</div>
52+
<div
53+
class="flex items-center px-4 h-full hover:bg-red-600 hover:text-white"
54+
@click="closeWindow"
55+
>
56+
<feather-icon name="x" class="h-4 w-4 flex-shrink-0" />
57+
</div>
58+
</div>
1059
</div>
1160
</template>
1261

@@ -20,5 +69,59 @@ export default {
2069
dbPath: String,
2170
companyName: String,
2271
},
72+
data() {
73+
return {
74+
isMax: Boolean,
75+
isFullscreen: Boolean,
76+
};
77+
},
78+
mounted() {
79+
this.getIsMaximized();
80+
this.getIsFullscreen();
81+
window.addEventListener('resize', this.getIsFullscreen);
82+
document.addEventListener('webkitfullscreenchange', this.getIsFullscreen);
83+
document.addEventListener('mozfullscreenchange', this.getIsFullscreen);
84+
document.addEventListener('fullscreenchange', this.getIsFullscreen);
85+
document.addEventListener('MSFullscreenChange', this.getIsFullscreen);
86+
},
87+
destroyed() {
88+
window.removeEventListener('resize', this.getIsFullscreen);
89+
document.removeEventListener('webkitfullscreenchange', this.getIsFullscreen);
90+
document.removeEventListener('mozfullscreenchange', this.getIsFullscreen);
91+
document.removeEventListener('fullscreenchange', this.getIsFullscreen);
92+
document.removeEventListener('MSFullscreenChange', this.getIsFullscreen);
93+
},
94+
methods: {
95+
minimizeWindow() {
96+
ipc.minimizeWindow();
97+
},
98+
toggleMaximize() {
99+
ipc.toggleMaximize();
100+
this.getIsMaximized();
101+
},
102+
closeWindow() {
103+
ipc.closeWindow();
104+
},
105+
getIsMaximized() {
106+
ipc
107+
.isMaximized()
108+
.then((result) => {
109+
this.isMax = result;
110+
})
111+
.catch((error) => {
112+
console.error(error);
113+
});
114+
},
115+
getIsFullscreen() {
116+
ipc
117+
.isFullscreen()
118+
.then((result) => {
119+
this.isFullscreen = result;
120+
})
121+
.catch((error) => {
122+
console.error(error);
123+
});
124+
},
125+
},
23126
};
24127
</script>

utils/messages.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,13 @@ export enum IPC_MESSAGES {
55
OPEN_EXTERNAL = 'open-external',
66
SHOW_ITEM_IN_FOLDER = 'show-item-in-folder',
77
RELOAD_MAIN_WINDOW = 'reload-main-window',
8+
MINIMIZE_MAIN_WINDOW = 'minimize-main-window',
9+
MAXIMIZE_MAIN_WINDOW = 'maximize-main-window',
10+
ISMAXIMIZED_MAIN_WINDOW = 'ismaximized-main-window',
11+
ISMAXIMIZED_RESULT = 'ismaximized-result',
12+
ISFULLSCREEN_MAIN_WINDOW = 'isfullscreen-main-window',
13+
ISFULLSCREEN_RESULT = 'isfullscreen-result',
14+
CLOSE_MAIN_WINDOW = 'close-main-window',
815
}
916

1017
// ipcRenderer.invoke(...)

0 commit comments

Comments
 (0)