Skip to content

Commit a1a0bf5

Browse files
authored
Merge pull request #2746 from headlamp-k8s/remember-zoom
app: Remember zoom level after restarts
2 parents 8386dcd + 7b5e8a0 commit a1a0bf5

File tree

1 file changed

+48
-3
lines changed

1 file changed

+48
-3
lines changed

app/electron/main.ts

Lines changed: 48 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -783,18 +783,21 @@ function getDefaultAppMenu(): AppMenu[] {
783783
sep,
784784
{
785785
label: i18n.t('Reset Zoom'),
786-
role: 'resetzoom',
787786
id: 'original-reset-zoom',
787+
accelerator: 'CmdOrCtrl+0',
788+
click: () => setZoom(1.0),
788789
},
789790
{
790791
label: i18n.t('Zoom In'),
791-
role: 'zoomin',
792792
id: 'original-zoom-in',
793+
accelerator: 'CmdOrCtrl+Plus',
794+
click: () => adjustZoom(0.1),
793795
},
794796
{
795797
label: i18n.t('Zoom Out'),
796-
role: 'zoomout',
797798
id: 'original-zoom-out',
799+
accelerator: 'CmdOrCtrl+-',
800+
click: () => adjustZoom(-0.1),
798801
},
799802
sep,
800803
{
@@ -1030,6 +1033,42 @@ function killProcess(pid: number) {
10301033
}
10311034
}
10321035

1036+
const ZOOM_FILE_PATH = path.join(app.getPath('userData'), 'headlamp-config.json');
1037+
let cachedZoom: number = 1.0;
1038+
1039+
function saveZoomFactor(factor: number) {
1040+
try {
1041+
fs.writeFileSync(ZOOM_FILE_PATH, JSON.stringify({ zoomFactor: factor }), 'utf-8');
1042+
} catch (err) {
1043+
console.error('Failed to save zoom factor:', err);
1044+
}
1045+
}
1046+
1047+
function loadZoomFactor() {
1048+
try {
1049+
const { zoomFactor = 1.0 } = JSON.parse(fs.readFileSync(ZOOM_FILE_PATH, 'utf-8'));
1050+
return zoomFactor;
1051+
} catch (err) {
1052+
console.error('Failed to load zoom factor, defaulting to 1.0:', err);
1053+
return 1.0;
1054+
}
1055+
}
1056+
1057+
// The zoom factor should respect the fixed limits set by Electron.
1058+
function clampZoom(factor: number) {
1059+
return Math.min(5.0, Math.max(0.25, factor));
1060+
}
1061+
1062+
function setZoom(factor: number) {
1063+
cachedZoom = factor;
1064+
mainWindow?.webContents.setZoomFactor(cachedZoom);
1065+
}
1066+
1067+
function adjustZoom(delta: number) {
1068+
const newZoom = clampZoom(cachedZoom + delta);
1069+
setZoom(newZoom);
1070+
}
1071+
10331072
function startElecron() {
10341073
console.info('App starting...');
10351074

@@ -1083,6 +1122,11 @@ function startElecron() {
10831122
}
10841123
});
10851124

1125+
mainWindow.webContents.on('did-finish-load', () => {
1126+
const startZoom = loadZoomFactor();
1127+
setZoom(startZoom);
1128+
});
1129+
10861130
mainWindow.webContents.on('dom-ready', () => {
10871131
const defaultMenu = getDefaultAppMenu();
10881132
const currentMenu = JSON.parse(JSON.stringify(defaultMenu));
@@ -1311,6 +1355,7 @@ function startElecron() {
13111355
app.once('window-all-closed', app.quit);
13121356

13131357
app.once('before-quit', () => {
1358+
saveZoomFactor(cachedZoom);
13141359
i18n.off('languageChanged');
13151360
if (mainWindow) {
13161361
mainWindow.removeAllListeners('close');

0 commit comments

Comments
 (0)