@@ -32,11 +32,11 @@ export class WindowManager {
3232 private static uidToWindowMap = new Map < string , ActiveWindow > ( ) ;
3333
3434 static getWindowByUid ( uid : string ) : ActiveWindow {
35- return this . uidToWindowMap . get ( uid ) ;
35+ return WindowManager . uidToWindowMap . get ( uid ) ;
3636 }
3737
3838 static storeWindowMenu ( win : BrowserWindow , menu : Menu ) {
39- const details = this . activeWindows . get ( win . id ) ;
39+ const details = WindowManager . activeWindows . get ( win . id ) ;
4040 if ( details ) {
4141 details . menu = menu ;
4242 }
@@ -49,7 +49,7 @@ export class WindowManager {
4949
5050 static setApplicationMenu ( win : BrowserWindow ) {
5151 if ( Functions . isMacOS ( ) ) {
52- const details = this . activeWindows . get ( win . id ) ;
52+ const details = WindowManager . activeWindows . get ( win . id ) ;
5353 if ( details ) {
5454 Menu . setApplicationMenu ( details . menu ) ;
5555 }
@@ -59,14 +59,14 @@ export class WindowManager {
5959 static async renderFrame ( ) {
6060 try
6161 {
62- return this . currentTab ?. renderFrame (
62+ return WindowManager . currentTab ?. renderFrame (
6363 {
64- parentWindowId : this . activeWindows . get ( 1 ) . systemWindowId . toString ( ) ,
65- offsetLeft : this . leftOffset ,
66- offsetTop : this . topOffset + this . electronTopOffset ,
67- childWidth : this . canvasWidth ,
68- childHeight : this . canvasHeight ,
69- scalingFactor : this . scaleFactor
64+ parentWindowId : WindowManager . activeWindows . get ( 1 ) . systemWindowId . toString ( ) ,
65+ offsetLeft : WindowManager . leftOffset ,
66+ offsetTop : WindowManager . topOffset + WindowManager . electronTopOffset ,
67+ childWidth : WindowManager . canvasWidth ,
68+ childHeight : WindowManager . canvasHeight ,
69+ scalingFactor : WindowManager . scaleFactor
7070 } ) ;
7171 }
7272 catch ( err ) {
@@ -76,10 +76,10 @@ export class WindowManager {
7676 }
7777
7878 static async setCurrentTab ( tab /*: RenderNativeWindow*/ ) {
79- if ( this . currentTab !== tab ) {
80- await this . currentTab ?. destroyFrame ( ) ;
81- this . currentTab = tab ;
82- return this . renderFrame ( ) ;
79+ if ( WindowManager . currentTab !== tab ) {
80+ await WindowManager . currentTab ?. destroyFrame ( ) ;
81+ WindowManager . currentTab = tab ;
82+ return WindowManager . renderFrame ( ) ;
8383 }
8484 }
8585
@@ -103,11 +103,11 @@ export class WindowManager {
103103 }
104104
105105 static getMainWindow ( ) : BrowserWindow {
106- return this . activeWindows . get ( 1 ) ?. context ; // TODO:: Is this accurate?
106+ return WindowManager . activeWindows . get ( 1 ) ?. context ; // TODO:: Is WindowManager accurate?
107107 }
108108
109109 static focusIfWindowIsPresent ( uid : string ) {
110- const windowDetails = this . uidToWindowMap . get ( uid ) ;
110+ const windowDetails = WindowManager . uidToWindowMap . get ( uid ) ;
111111 if ( windowDetails ) {
112112 windowDetails . context . focus ( ) ;
113113 return true ;
@@ -131,6 +131,19 @@ export class WindowManager {
131131 return initialURL ;
132132 }
133133
134+ /// if window already exists attached to \a url, then raise it
135+ /// @return window if it exists, null otherwise
136+ static raiseWindow ( url : string ) : BrowserWindow {
137+ let window = null ;
138+ for ( let i of WindowManager . activeWindows )
139+ if ( i [ 1 ] . url == url ) {
140+ window = i [ 1 ] . context ;
141+ break ;
142+ }
143+ if ( window ) window . show ( ) ;
144+ return window ;
145+ }
146+
134147 static createPopupWindowWithRouting (
135148 payload : CreateWindowPayload ,
136149 // eslint-disable-next-line @typescript-eslint/ban-types
@@ -142,14 +155,14 @@ export class WindowManager {
142155
143156 url . searchParams . set ( 'systemWindowId' , WindowManager . getSystemWindowId ( window ) . toString ( ) ) ;
144157 const relativeUrlString = ( payload . url [ 0 ] == '#' ?'#' :'' ) + url . pathname + '?' + url . searchParams . toString ( ) ;
145- window . loadURL ( this . getWindowUrl ( relativeUrlString ) ) ;
158+ window . loadURL ( WindowManager . getWindowUrl ( relativeUrlString ) ) ;
146159 return window ;
147160 }
148161
149162 static closeWindowByUid ( uid : string ) {
150- const windowDetails = this . uidToWindowMap . get ( uid ) ;
163+ const windowDetails = WindowManager . uidToWindowMap . get ( uid ) ;
151164 if ( windowDetails ) {
152- this . uidToWindowMap . delete ( uid ) ;
165+ WindowManager . uidToWindowMap . delete ( uid ) ;
153166 windowDetails . context . close ( ) ;
154167 }
155168 }
@@ -167,8 +180,6 @@ export class WindowManager {
167180 slashes : true ,
168181 } ) ;
169182
170- console . log ( payload . url ) ;
171- console . log ( filePath ) ;
172183 window . loadURL ( filePath ) ;
173184 return window ;
174185 }
@@ -177,8 +188,14 @@ export class WindowManager {
177188 payload : CreateWindowPayload ,
178189 onCloseCallback ?: ( ev : Electron . Event ) => void
179190 ) {
180- const { width, height, minWidth, minHeight, title, modal = true , backgroundColor= StoreManager . store . get ( 'backgroundColor' ) , alwaysOnTop } = payload ;
191+ const { width, height, minWidth, minHeight, title, modal = true , backgroundColor= StoreManager . store . get ( 'backgroundColor' ) , alwaysOnTop, url } = payload ;
181192
193+ // do not duplicate window if requested and window already exists
194+ if ( payload . raiseIfPresent ) {
195+ const childWindow = WindowManager . raiseWindow ( url ) ;
196+ if ( childWindow ) return childWindow ;
197+ }
198+
182199 const childWindow = new BrowserWindow ( {
183200 width,
184201 height,
@@ -189,7 +206,7 @@ export class WindowManager {
189206 useContentSize : true ,
190207 minimizable : false ,
191208 show : false ,
192- parent : modal ? this . getMainWindow ( ) : null ,
209+ parent : modal ? WindowManager . getMainWindow ( ) : null ,
193210 modal,
194211 backgroundColor,
195212 alwaysOnTop,
@@ -225,21 +242,22 @@ export class WindowManager {
225242 context : childWindow ,
226243 systemWindowId : windowId ,
227244 menu : null ,
245+ url,
228246 } ;
229247
230248 if ( payload . uid ) {
231- this . uidToWindowMap . set ( payload . uid , childWindowDetails ) ;
249+ WindowManager . uidToWindowMap . set ( payload . uid , childWindowDetails ) ;
232250 }
233251
234- this . activeWindows . set ( childWindow . id , childWindowDetails ) ;
252+ WindowManager . activeWindows . set ( childWindow . id , childWindowDetails ) ;
235253
236254 childWindow . on ( 'close' , ( ev : Electron . Event ) => {
237255 try {
238256 if ( payload ?. uid ) {
239- this . uidToWindowMap . delete ( payload . uid ) ;
257+ WindowManager . uidToWindowMap . delete ( payload . uid ) ;
240258 }
241259 if ( childWindow ?. id ) {
242- this . activeWindows . delete ( childWindow . id ) ;
260+ WindowManager . activeWindows . delete ( childWindow . id ) ;
243261 }
244262 if ( onCloseCallback ) {
245263 onCloseCallback ( ev ) ;
@@ -249,36 +267,35 @@ export class WindowManager {
249267 }
250268 } ) ;
251269 // in the event the webcontents is closed without the containing window being so.
252- childWindow . webContents . on ( 'destroyed' , ( ) => this . activeWindows . delete ( childWindow . id ) ) ;
270+ childWindow . webContents . on ( 'destroyed' , ( ) => WindowManager . activeWindows . delete ( childWindow . id ) ) ;
253271 return childWindow ;
254272 }
255273
256274 public static scrollToCenter ( ) {
257- // TODO:: Replace this with something cleaner
258- this . getMainWindow ( ) . webContents . executeJavaScript (
275+ // TODO:: Replace WindowManager with something cleaner
276+ WindowManager . getMainWindow ( ) . webContents . executeJavaScript (
259277 `var container=document.getElementsByClassName('minsky-canvas-container')[0]; var canvas = container.getElementsByTagName('canvas')[0]; container.scrollTop=canvas.clientHeight/2; container.scrollLeft=canvas.clientWidth/2;` ,
260278 false
261279 ) ;
262280 }
263281
264282 static onAppLayoutChanged ( payload : AppLayoutPayload ) {
265283
266- this . topOffset = Math . round ( payload . offset . top ) ;
267- console . log ( "topOffset=" , this . topOffset ) ;
268- this . leftOffset = Math . round ( payload . offset . left ) ;
269- this . scaleFactor = screen . getPrimaryDisplay ( ) . scaleFactor ;
284+ WindowManager . topOffset = Math . round ( payload . offset . top ) ;
285+ WindowManager . leftOffset = Math . round ( payload . offset . left ) ;
286+ WindowManager . scaleFactor = screen . getPrimaryDisplay ( ) . scaleFactor ;
270287 if ( Functions . isWindows ( ) )
271- // calculate this offset internally in C++
272- this . electronTopOffset = 0 ;
288+ // calculate WindowManager offset internally in C++
289+ WindowManager . electronTopOffset = 0 ;
273290 else
274291 {
275- let size = this . getMainWindow ( ) . getSize ( ) ;
276- let contentSize = this . getMainWindow ( ) . getContentSize ( ) ;
277- this . electronTopOffset = size [ 1 ] - contentSize [ 1 ] ;
292+ let size = WindowManager . getMainWindow ( ) . getSize ( ) ;
293+ let contentSize = WindowManager . getMainWindow ( ) . getContentSize ( ) ;
294+ WindowManager . electronTopOffset = size [ 1 ] - contentSize [ 1 ] ;
278295 }
279296
280- this . canvasHeight = payload . drawableArea . height ;
281- this . canvasWidth = payload . drawableArea . width ;
297+ WindowManager . canvasHeight = payload . drawableArea . height ;
298+ WindowManager . canvasWidth = payload . drawableArea . width ;
282299
283300 }
284301
0 commit comments