Skip to content

Commit 2afa39f

Browse files
Merge pull request #537 from highperformancecoder/ticket-1775
raise variable browser window, if already created, otherwise create a…
2 parents b44df39 + 0da2559 commit 2afa39f

File tree

5 files changed

+72
-51
lines changed

5 files changed

+72
-51
lines changed

gui-js/apps/minsky-electron/src/app/app.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,7 @@ export default class App {
149149
context: App.mainWindow,
150150
systemWindowId: WindowManager.getSystemWindowId(this.mainWindow),
151151
menu: null,
152+
url: "",
152153
};
153154

154155
WindowManager.activeWindows.set(App.mainWindow.id, mainWindowDetails);

gui-js/apps/minsky-electron/src/app/managers/WindowManager.ts

Lines changed: 58 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -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

gui-js/libs/shared/src/lib/interfaces/ActiveWindow.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,6 @@ export interface ActiveWindow {
66
isMainWindow: boolean;
77
context: BrowserWindow;
88
systemWindowId: bigint;
9-
menu : Menu
9+
menu: Menu;
10+
url: string; /// url opened in this window, if any. Can be none or empty.
1011
}

gui-js/libs/shared/src/lib/interfaces/Interfaces.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,7 @@ export interface CreateWindowPayload {
132132
minWidth?: number;
133133
minHeight?: number;
134134
alwaysOnTop?: boolean;
135+
raiseIfPresent?: boolean; ///< if true, then raise an existing window instead of creating a duplicate
135136
}
136137

137138

gui-js/libs/ui-components/src/lib/wiring/variable/variable.component.ts

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -42,14 +42,15 @@ export class VariableComponent {
4242
});
4343
}
4444
}
45-
openVariablePane() {
46-
this.electronService.send(events.CREATE_MENU_POPUP, {
47-
title: 'Variables',
48-
url: "#/headless/variable-pane",
49-
width: 400,
50-
height: 450,
51-
alwaysOnTop: true,
52-
modal: false,
53-
});
45+
openVariablePane() {
46+
this.electronService.send(events.CREATE_MENU_POPUP, {
47+
title: 'Variables',
48+
url: "#/headless/variable-pane",
49+
width: 400,
50+
height: 450,
51+
alwaysOnTop: true,
52+
modal: false,
53+
raiseIfPresent: true,
54+
});
5455
}
5556
}

0 commit comments

Comments
 (0)