-
Notifications
You must be signed in to change notification settings - Fork 0
/
index.js
169 lines (135 loc) · 5.17 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
/**
* Änderungen in dieser Datei werden bei erneutem Start der App
* mit `npx cap open electron` wirksam.
*
* ACHTUNG: Wenn diese App einen Syntaxfehler enthält, dann bleibt
* der Aufruf von `npx cap open electron` ohne Fehlermeldung hängen!
*/
const { app, BrowserWindow, Menu, dialog, ipcMain } = require('electron');
const { CapacitorSplashScreen, configCapacitor } = require('@capacitor/electron');
const isDevMode = require('electron-is-dev');
const fs = require('fs');
const path = require('path');
const shell = require('electron').shell
const URL_HILFESEITE = "https://github.com/MDecker-MobileComputing/Ionic_Leetspeak/blob/master/README.md#leetspeak-app-ionic-app-in-electron-container";
// Place holders for our windows so they don't get garbage collected.
let mainWindow = null;
// Placeholder for SplashScreen ref
let splashScreen = null;
//Change this if you do not wish to have a splash screen
let useSplashScreen = true;
// Create simple menu for easy devtools access, and for demo
const menuTemplateDev = [
{
label: 'Options',
submenu: [
{
label: 'Open Dev Tools',
click() { mainWindow.openDevTools(); },
},
],
},
];
const aboutDialogOptionen = {
buttons: ["OK"],
message: "Leetspeak-Translator ist eine in Electron verpackte Ionic-App.\n\n2022 by MD"
};
/**
* Eigenes Menü für Electron-App definieren, siehe auch
* https://coursetro.com/posts/code/119/Working-with-Electron-Menus---Tutorial
*/
function erzeugeEigenesMenue() {
const onLoeschMenu = function(){ mainWindow.webContents.send("befehl-von-electron", "Dummy-Argument"); };
const onBeendenMenu = function(){ app.quit(); };
const onHilfeMenu = function(){ shell.openExternal(URL_HILFESEITE); };
const onUeberMenu = function(){ dialog.showMessageBox(aboutDialogOptionen); };
const aktionenMenuArray = [
{label: "Formular löschen", click: onLoeschMenu, accelerator: "CmdOrCtrl+L" },
{type: "separator"},
{label: "Beenden", click: onBeendenMenu }
];
const hilfeMenuArray = [
{label: "Hilfeseite im Browser öffnen", click: onHilfeMenu },
{type: "separator" },
{label: "Über diese App", click: onUeberMenu },
];
const aktionenMenu = { label: "Aktionen", submenu: aktionenMenuArray };
const hilfeMenu = { label: "Hilfe" , submenu: hilfeMenuArray };
const menu = Menu.buildFromTemplate([ aktionenMenu, hilfeMenu ]);
Menu.setApplicationMenu(menu);
}
async function createWindow () {
mainWindow = new BrowserWindow({
height: 920,
width: 1600,
show: false,
webPreferences: {
nodeIntegration: true,
preload: path.join(__dirname, 'node_modules', '@capacitor', 'electron', 'dist', 'electron-bridge.js')
}
});
configCapacitor(mainWindow);
if (isDevMode) {
// Set our above template to the Menu Object if we are in development mode, dont want users having the devtools.
Menu.setApplicationMenu(Menu.buildFromTemplate(menuTemplateDev));
// If we are developers we might as well open the devtools by default.
mainWindow.webContents.openDevTools();
}
if(useSplashScreen) {
splashScreen = new CapacitorSplashScreen(mainWindow);
splashScreen.init();
} else {
mainWindow.loadURL(`file://${__dirname}/app/index.html`);
mainWindow.webContents.on('dom-ready', () => {
mainWindow.show();
});
}
erzeugeEigenesMenue();
}
/**
* Event-Handler für Empfang von "Befehl" von Ionic, nämlich um das aktuelle
* Übersetzungsergebnis als lokale Datei zu speichern.
*
* Achtung: die Methode `dialog.showSaveDialog()` ist eine asynchrone Methode,
* die deshalb mit `await` aufgerufen wird; deshalb muss die Callback-Funktion
* selbst mit `async` deklariert werden.
*/
ipcMain.on("befehl-von-ionic", async (event, uebersetzungsergebnis) => {
const saveDialogOptionen = {
titel: "Speichern Textdatei mit Übersetzungsergebnis",
defaultPath: app.getPath("documents") + "/Leetspeek-Ergebnis.txt",
}
const saveDialogErgebnis = await dialog.showSaveDialog(saveDialogOptionen);
if (saveDialogErgebnis.canceled) {
dialog.showMessageBox({ buttons: ["Ok"], message: `Vorgang abgebrochen.` });
return;
}
const zieldatei = saveDialogErgebnis.filePath;
try {
fs.writeFileSync(zieldatei, uebersetzungsergebnis + "\n", "utf-8");
dialog.showMessageBox({ buttons: ["Ok"], message: `Datei "${zieldatei}" wurde erstellt.` });
}
catch(ex) {
dialog.showErrorBox("Fehler", "Datei konnte nicht geschrieben werden: " + ex);
return;
}
});
// This method will be called when Electron has finished
// initialization and is ready to create browser windows.
// Some Electron APIs can only be used after this event occurs.
app.on('ready', createWindow);
// Quit when all windows are closed.
app.on('window-all-closed', function () {
// On OS X it is common for applications and their menu bar
// to stay active until the user quits explicitly with Cmd + Q
if (process.platform !== 'darwin') {
app.quit();
}
});
app.on('activate', function () {
// On OS X it's common to re-create a window in the app when the
// dock icon is clicked and there are no other windows open.
if (mainWindow === null) {
createWindow();
}
});