Skip to content

Commit 00e170d

Browse files
authored
Check dirty flag before opening new or existing project (#127)
* Check dirty flag before opening new or existing project * Code cleanup
1 parent c7f60bf commit 00e170d

File tree

5 files changed

+50
-18
lines changed

5 files changed

+50
-18
lines changed

electron/app/js/ipcRendererPreload.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ contextBridge.exposeInMainWorld(
2828
send: (channel, ...args) => {
2929
const validChannels = [
3030
'close-window',
31+
'new-project',
3132
'open-project',
3233
'window-app-quit',
3334
'window-is-ready',
@@ -65,6 +66,8 @@ contextBridge.exposeInMainWorld(
6566
'show-startup-dialogs',
6667
'app-update-available',
6768
'blur-focused-item',
69+
'start-new-project',
70+
'start-open-project',
6871
'start-prepare-model',
6972
'start-validate-model',
7073
'start-create-image',

electron/app/js/project.js

Lines changed: 23 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -61,12 +61,18 @@ async function createNewProject(targetWindow) {
6161
return;
6262
}
6363

64-
let projectWindow = await _createOrReplace(targetWindow);
64+
sendToWindow(targetWindow, 'start-new-project', saveResponse.filePath);
65+
// window will reply with new-project -> initializeNewProject() including isDirty flag
66+
}
67+
68+
async function initializeNewProject(targetWindow, projectFile, isDirty) {
69+
// finish creating new project with project dirty flag
70+
let projectWindow = await _createOrReplace(targetWindow, isDirty);
6571
if (!projectWindow) {
6672
return;
6773
}
6874

69-
let projectFileName = getProjectFileName(saveResponse.filePath);
75+
let projectFileName = getProjectFileName(projectFile);
7076
if (path.extname(projectFileName) !== `.${projectFileExtension}`) {
7177
projectFileName = `${projectFileName}.${projectFileExtension}`;
7278
}
@@ -92,24 +98,18 @@ async function openProject(targetWindow) {
9298
}
9399

94100
const projectFileName = openResponse.filePaths[0];
95-
await openProjectFile(targetWindow, projectFileName)
96-
.catch(err => {
97-
dialog.showErrorBox(
98-
i18n.t('dialog-openProjectFileErrorTitle'),
99-
i18n.t('dialog-openProjectFileErrorMessage', { projectFileName: projectFileName, err: err }),
100-
);
101-
getLogger().error('Failed to open project file %s: %s', projectFileName, err);
102-
});
101+
sendToWindow(targetWindow, 'start-open-project', projectFileName);
102+
// window will reply with open-project -> openProjectFile() including isDirty flag
103103
}
104104

105-
async function openProjectFile(targetWindow, projectFile) {
105+
async function openProjectFile(targetWindow, projectFile, isDirty) {
106106
return new Promise((resolve, reject) => {
107107
const existingProjectWindow = _getOpenWindowForProject(projectFile);
108108
if (existingProjectWindow) {
109109
showExistingProjectWindow(existingProjectWindow);
110110
resolve();
111111
} else {
112-
_createOrReplace(targetWindow)
112+
_createOrReplace(targetWindow, isDirty)
113113
.then(projectWindow => {
114114
if (!projectWindow) {
115115
return resolve();
@@ -122,7 +122,14 @@ async function openProjectFile(targetWindow, projectFile) {
122122
})
123123
.catch(err => reject(err));
124124
}
125-
});
125+
})
126+
.catch(err => {
127+
dialog.showErrorBox(
128+
i18n.t('dialog-openProjectFileErrorTitle'),
129+
i18n.t('dialog-openProjectFileErrorMessage', { projectFileName: projectFile, err: err }),
130+
);
131+
getLogger().error('Failed to open project file %s: %s', projectFile, err);
132+
});
126133
}
127134

128135
// request the existing project file, prompting the user if needed.
@@ -441,9 +448,9 @@ async function _saveExternalFileContents(projectDirectory, externalFileContents)
441448
return saveResult;
442449
}
443450

444-
async function _createOrReplace(targetWindow) {
451+
async function _createOrReplace(targetWindow, isDirty) {
445452
let projectWindow = targetWindow;
446-
if (openProjects.has(targetWindow)) {
453+
if (openProjects.has(targetWindow) || isDirty) {
447454
const buttonResponse = await dialog.showMessageBox(targetWindow, {
448455
type: 'question',
449456
message: i18n.t('dialog-openProjectWindowPrompt'),
@@ -867,6 +874,7 @@ module.exports = {
867874
getWindowForProject,
868875
exportArchiveFile,
869876
isWktProjectFile,
877+
initializeNewProject,
870878
openProject,
871879
openProjectFile,
872880
_openProjectFile,

electron/app/main.js

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -241,10 +241,19 @@ class Main {
241241
});
242242
});
243243

244-
ipcMain.on('open-project', async (event, projectFile) => {
244+
ipcMain.on('open-project', async (event, projectFile, isDirty) => {
245245
try {
246246
const currentWindow = event.sender.getOwnerBrowserWindow();
247-
await project.openProjectFile(currentWindow, projectFile);
247+
await project.openProjectFile(currentWindow, projectFile, isDirty);
248+
} catch (e) {
249+
this._logger.error(e);
250+
}
251+
});
252+
253+
ipcMain.on('new-project', async (event, projectFile, isDirty) => {
254+
try {
255+
const currentWindow = event.sender.getOwnerBrowserWindow();
256+
await project.initializeNewProject(currentWindow, projectFile, isDirty);
248257
} catch (e) {
249258
this._logger.error(e);
250259
}

webui/src/js/viewModels/app-main.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ function(accUtils, ko, i18n, project, wktConsole, dialogHelper, viewHelper, scre
4545
const file = getDroppedFile(event);
4646
wktLogger.debug(`dropped file path = ${file.path}`);
4747
if (window.api.path.extname(file.name).toLowerCase() === '.wktproj') {
48-
window.api.ipc.send('open-project', file.path);
48+
window.api.ipc.send('open-project', file.path, project.isDirty());
4949
} else {
5050
wktLogger.warn(`Dropped file ${file.path} extension was not recognized as a wktproj file`);
5151
}

webui/src/js/windowStateUtils.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,18 @@ function(wktProject, wktConsole, wdtDiscoverer, dialogHelper, projectIO,
7979
});
8080
});
8181

82+
// continue opening project with isDirty value
83+
window.api.ipc.receive('start-open-project', projectFileName => {
84+
blurSelection();
85+
window.api.ipc.send('open-project', projectFileName, wktProject.isDirty());
86+
});
87+
88+
// continue new project with isDirty value
89+
window.api.ipc.receive('start-new-project', projectFileName => {
90+
blurSelection();
91+
window.api.ipc.send('new-project', projectFileName, wktProject.isDirty());
92+
});
93+
8294
window.api.ipc.receive('start-close-project', () => {
8395
blurSelection();
8496
projectIO.closeProject(false).catch(err => {

0 commit comments

Comments
 (0)