@@ -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+
10331072function 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