sunrize 1.2.2 → 1.2.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "sunrize",
3
3
  "productName": "Sunrize X3D Editor",
4
- "version": "1.2.2",
4
+ "version": "1.2.4",
5
5
  "description": "A Multi-Platform X3D Editor",
6
6
  "main": "src/main.js",
7
7
  "bin": {
@@ -15,7 +15,9 @@
15
15
  "start": "electron .",
16
16
  "development": "SUNRISE_ENVIRONMENT=DEVELOPMENT electron .",
17
17
  "package": "electron-forge package",
18
- "make": "electron-forge make"
18
+ "premake": "npm i -D electron",
19
+ "make": "electron-forge make",
20
+ "postmake": "npm i -P electron"
19
21
  },
20
22
  "repository": {
21
23
  "type": "git",
@@ -87,7 +89,8 @@
87
89
  "config": {
88
90
  "forge": {
89
91
  "packagerConfig": {
90
- "icon": "./src/assets/images/icon.png"
92
+ "icon": "./src/assets/images/icon.png",
93
+ "extendInfo": "./src/assets/Info.plist"
91
94
  },
92
95
  "makers": [
93
96
  {
@@ -19,10 +19,11 @@ const localStorage = new LocalStorage (path .join (electron .app .getPath ("user
19
19
 
20
20
  module .exports = class Application
21
21
  {
22
- config = new DataStorage (localStorage, "Sunrize.Application.");
23
- mainMenu = [ ];
24
- openURLValue = "";
25
- exportPath = new Map ();
22
+ config = new DataStorage (localStorage, "Sunrize.Application.");
23
+ receivedFiles = [ ];
24
+ mainMenu = [ ];
25
+ openURLValue = "";
26
+ exportPath = new Map ();
26
27
 
27
28
  static run ()
28
29
  {
@@ -70,37 +71,34 @@ module .exports = class Application
70
71
 
71
72
  async setup ()
72
73
  {
73
-
74
- await electron .app .whenReady ();
75
-
76
74
  electron .app .on ("activate", (event) => this .activate ());
77
75
  electron .app .on ("new-window-for-tab", (event) => this .createWindow ());
78
76
  electron .app .on ("open-file", (event, filePath) => this .openFiles ([url .pathToFileURL (filePath) .href]));
79
77
  electron .app .on ("window-all-closed", (event) => this .quit ());
80
78
 
81
- electron .ipcMain .on ("title", (event, title) => this .title = title);
82
- electron .ipcMain .on ("current-file", (event, currentFile) => this .currentFile = currentFile);
83
- electron .ipcMain .on ("save-file", (event, filePath) => this .saveFile (filePath));
84
- electron .ipcMain .on ("change-menu", (event, object) => this .updateMenu (object));
85
- electron .ipcMain .on ("context-menu", (event, id, menu) => this .contextMenu (id, menu));
79
+ electron .ipcMain .on ("title", (event, title) => this .title = title);
80
+ electron .ipcMain .on ("current-file", (event, currentFile) => this .currentFile = currentFile);
81
+ electron .ipcMain .on ("add-recent-document", (event, filePath) => this .addRecentDocument (filePath));
82
+ electron .ipcMain .on ("change-menu", (event, object) => this .updateMenu (object));
83
+ electron .ipcMain .on ("context-menu", (event, id, menu) => this .contextMenu (id, menu));
86
84
 
87
85
  electron .ipcMain .handle ("file-path", async (event, basename) => await this .showSaveDialog (basename));
88
- electron .ipcMain .handle ("fullname", async () => this .fullname);
89
-
90
- this .fullname = await (await import ("fullname")) .default ();
86
+ electron .ipcMain .handle ("fullname", async () => await (await import ("fullname")) .default ());
91
87
 
88
+ await electron .app .whenReady ();
92
89
  await this .updateMenu ();
93
90
  await this .createWindow ();
94
91
 
95
- this .openFiles (process .argv .slice (2) .map (filePath => url .pathToFileURL (filePath) .href));
92
+ this .openFiles (process .argv .slice (electron .app .isPackaged ? 1 : 2)
93
+ .map (filePath => url .pathToFileURL (filePath) .href));
94
+
95
+ this .openFiles (this .receivedFiles);
96
96
 
97
97
  electron .app .on ("second-instance", (event, argv, cwd) =>
98
98
  {
99
99
  this .openFiles (argv .slice (1)
100
100
  .filter (filePath => fs .existsSync (filePath) && fs .lstatSync (filePath) .isFile ())
101
101
  .map (filePath => url .pathToFileURL (filePath) .href));
102
-
103
- this .mainWindow .show ();
104
102
  });
105
103
  }
106
104
 
@@ -116,13 +114,27 @@ module .exports = class Application
116
114
 
117
115
  set title (title)
118
116
  {
119
- this .mainWindow .title = `${title} · Sunrize`;
117
+ this .mainWindow .title = `${title} · ${electron .app .getName ()}`;
118
+ }
119
+
120
+ #currentFile = "";
121
+
122
+ get currentFile ()
123
+ {
124
+ return this .#currentFile;
125
+ }
126
+
127
+ set currentFile (currentFile)
128
+ {
129
+ this .#currentFile = currentFile .startsWith ("file:") ? url .fileURLToPath (currentFile) : "";
130
+
131
+ this .mainWindow .setRepresentedFilename (this .#currentFile);
120
132
  }
121
133
 
122
134
  pushMenu (menu)
123
135
  {
124
136
  this .mainMenu .push (menu);
125
- electron .Menu .setApplicationMenu (menu)
137
+ electron .Menu .setApplicationMenu (menu);
126
138
  }
127
139
 
128
140
  popMenu ()
@@ -140,7 +152,7 @@ module .exports = class Application
140
152
  const menu = electron .Menu .buildFromTemplate ([
141
153
  {
142
154
  role: "appMenu",
143
- label: "Sunrize",
155
+ label: electron .app .getName (),
144
156
  },
145
157
  {
146
158
  role: "fileMenu",
@@ -177,7 +189,7 @@ module .exports = class Application
177
189
  this .pushMenu (electron .Menu .buildFromTemplate ([
178
190
  {
179
191
  role: "appMenu",
180
- label: "Sunrize",
192
+ label: electron .app .getName (),
181
193
  },
182
194
  { role: "editMenu" },
183
195
  ]));
@@ -231,7 +243,7 @@ module .exports = class Application
231
243
  if (response .canceled)
232
244
  return;
233
245
 
234
- electron .app .addRecentDocument (response .filePath);
246
+ this .addRecentDocument (response .filePath);
235
247
 
236
248
  this .mainWindow .webContents .send ("save-file-as", response .filePath);
237
249
  },
@@ -245,7 +257,7 @@ module .exports = class Application
245
257
  if (response .canceled)
246
258
  return;
247
259
 
248
- electron .app .addRecentDocument (response .filePath);
260
+ this .addRecentDocument (response .filePath);
249
261
 
250
262
  this .mainWindow .webContents .send ("save-copy-as", response .filePath);
251
263
  },
@@ -294,7 +306,7 @@ module .exports = class Application
294
306
  if (response .canceled)
295
307
  return;
296
308
 
297
- electron .app .addRecentDocument (response .filePath);
309
+ this .addRecentDocument (response .filePath);
298
310
 
299
311
  this .exportPath .set (this .currentFile, response .filePath);
300
312
 
@@ -637,6 +649,8 @@ module .exports = class Application
637
649
 
638
650
  async createWindow ()
639
651
  {
652
+ this .appIcon = new electron .Tray (path .join (__dirname, "../assets/images/icon.png"));
653
+
640
654
  const window = new electron .BrowserWindow ({
641
655
  icon: path .join (__dirname, "../assets/images/icon.png"),
642
656
  x: this .config .position [0],
@@ -673,14 +687,16 @@ module .exports = class Application
673
687
  window .setFullScreen (this .config .fullscreen);
674
688
 
675
689
  await window .loadFile (path .join (__dirname, "../assets/html/application.html"));
690
+
691
+ this .ready = true;
676
692
  }
677
693
 
678
694
  activate ()
679
695
  {
680
696
  if (electron .BrowserWindow .getAllWindows () .length)
681
- return;
682
-
683
- this .createWindow ();
697
+ this .mainWindow .show ();
698
+ else
699
+ this .createWindow ();
684
700
  }
685
701
 
686
702
  contextMenu (id, menu)
@@ -737,13 +753,21 @@ module .exports = class Application
737
753
  */
738
754
  openFiles (urls)
739
755
  {
740
- for (const URL of urls)
756
+ if (this .ready)
741
757
  {
742
- if (URL .startsWith ("file:"))
743
- electron .app .addRecentDocument (url .fileURLToPath (URL));
744
- }
758
+ for (const URL of urls)
759
+ {
760
+ if (URL .startsWith ("file:"))
761
+ this .addRecentDocument (url .fileURLToPath (URL));
762
+ }
745
763
 
746
- this .mainWindow .webContents .send ("open-files", urls);
764
+ this .mainWindow .webContents .send ("open-files", urls);
765
+ this .mainWindow .show ();
766
+ }
767
+ else
768
+ {
769
+ this .receivedFiles .push (... urls);
770
+ }
747
771
  }
748
772
 
749
773
  async showOpenDialog (defaultPath)
@@ -751,7 +775,7 @@ module .exports = class Application
751
775
  this .pushMenu (electron .Menu .buildFromTemplate ([
752
776
  {
753
777
  role: "appMenu",
754
- label: "Sunrize",
778
+ label: electron .app .getName (),
755
779
  },
756
780
  { role: "editMenu" },
757
781
  ]));
@@ -772,7 +796,7 @@ module .exports = class Application
772
796
  return response;
773
797
  }
774
798
 
775
- saveFile (filePath)
799
+ addRecentDocument (filePath)
776
800
  {
777
801
  electron .app .addRecentDocument (filePath);
778
802
  }
@@ -782,7 +806,7 @@ module .exports = class Application
782
806
  this .pushMenu (electron .Menu .buildFromTemplate ([
783
807
  {
784
808
  role: "appMenu",
785
- label: "Sunrize",
809
+ label: electron .app .getName (),
786
810
  },
787
811
  { role: "editMenu" },
788
812
  ]));
@@ -810,7 +834,7 @@ module .exports = class Application
810
834
  this .pushMenu (electron .Menu .buildFromTemplate ([
811
835
  {
812
836
  role: "appMenu",
813
- label: "Sunrize",
837
+ label: electron .app .getName (),
814
838
  },
815
839
  { role: "editMenu" },
816
840
  ]));
@@ -220,7 +220,7 @@ module .exports = class Document extends Interface
220
220
 
221
221
  fs .writeFile (this .filePath, Editor .getContents (scene, path .extname (this .filePath)), Function .prototype);
222
222
 
223
- electron .ipcRenderer .send ("save-file", this .filePath);
223
+ electron .ipcRenderer .send ("add-recent-document", this .filePath);
224
224
  }
225
225
  else
226
226
  {
@@ -34,74 +34,72 @@ module .exports = new class Tabs
34
34
  {
35
35
  this .tabs .on ("tab-active", tab =>
36
36
  {
37
- electron .ipcRenderer .send ("title", tab .getTitle ())
38
-
39
- if (tab .url .startsWith ("file:"))
40
- electron .ipcRenderer .send ("current-file", url .fileURLToPath (tab .url))
37
+ electron .ipcRenderer .send ("title", tab .getTitle ());
38
+ electron .ipcRenderer .send ("current-file", tab .url);
41
39
 
42
40
  if (tab .domReady)
43
- tab .webview .send ("activate")
41
+ tab .webview .send ("activate");
44
42
 
45
- tab .initialized = true
43
+ tab .initialized = true;
46
44
 
47
- this .saveTabs ()
48
- })
45
+ this .saveTabs ();
46
+ });
49
47
 
50
- this .tabs .on ("tab-removed", (tab) => this .saveTabs ())
48
+ this .tabs .on ("tab-removed", (tab) => this .saveTabs ());
51
49
 
52
50
  // Actions
53
51
 
54
- electron .ipcRenderer .on ("open-files", (event, urls) => this .openTabs (urls))
55
- electron .ipcRenderer .on ("save-file", (event) => this .saveFile ())
56
- electron .ipcRenderer .on ("save-file-as", (event, filePath) => this .saveFileAs (filePath))
57
- electron .ipcRenderer .on ("save-all-files", (event) => this .saveAllFiles ())
58
- electron .ipcRenderer .on ("reload" , (event) => this .reloadTab ())
59
- electron .ipcRenderer .on ("quit", (event) => this .quit ())
52
+ electron .ipcRenderer .on ("open-files", (event, urls) => this .openTabs (urls));
53
+ electron .ipcRenderer .on ("save-file", (event) => this .saveFile ());
54
+ electron .ipcRenderer .on ("save-file-as", (event, filePath) => this .saveFileAs (filePath));
55
+ electron .ipcRenderer .on ("save-all-files", (event) => this .saveAllFiles ());
56
+ electron .ipcRenderer .on ("reload" , (event) => this .reloadTab ());
57
+ electron .ipcRenderer .on ("quit", (event) => this .quit ());
60
58
 
61
- electron .ipcRenderer .on ("toggle-developer-tools", (event) => this .tabs .getActiveTab () .webview .openDevTools ())
59
+ electron .ipcRenderer .on ("toggle-developer-tools", (event) => this .tabs .getActiveTab () .webview .openDevTools ());
62
60
 
63
- $(window) .on ("beforeunload", () => this .close ())
61
+ $(window) .on ("beforeunload", () => this .close ());
64
62
 
65
63
  // Forward Actions
66
64
 
67
- this .forwardToAllTabs ("auto-save")
68
- this .forwardToActiveTab ("export-as")
65
+ this .forwardToAllTabs ("auto-save");
66
+ this .forwardToActiveTab ("export-as");
69
67
 
70
- this .forwardToActiveTab ("scene-properties")
71
- this .forwardToActiveTab ("save-copy-as")
72
- this .forwardToActiveTab ("scene-properties")
68
+ this .forwardToActiveTab ("scene-properties");
69
+ this .forwardToActiveTab ("save-copy-as");
70
+ this .forwardToActiveTab ("scene-properties");
73
71
 
74
- this .forwardToActiveTab ("undo")
75
- this .forwardToActiveTab ("redo")
72
+ this .forwardToActiveTab ("undo");
73
+ this .forwardToActiveTab ("redo");
76
74
 
77
- this .forwardToActiveTab ("cut")
78
- this .forwardToActiveTab ("copy")
79
- this .forwardToActiveTab ("paste")
80
- this .forwardToActiveTab ("delete")
75
+ this .forwardToActiveTab ("cut");
76
+ this .forwardToActiveTab ("copy");
77
+ this .forwardToActiveTab ("paste");
78
+ this .forwardToActiveTab ("delete");
81
79
 
82
- this .forwardToActiveTab ("select-all")
83
- this .forwardToActiveTab ("deselect-all")
84
- this .forwardToActiveTab ("hide-unselected-objects")
85
- this .forwardToActiveTab ("show-selected-objects")
86
- this .forwardToActiveTab ("show-all-objects")
87
- this .forwardToActiveTab ("remove-empty-groups")
80
+ this .forwardToActiveTab ("select-all");
81
+ this .forwardToActiveTab ("deselect-all");
82
+ this .forwardToActiveTab ("hide-unselected-objects");
83
+ this .forwardToActiveTab ("show-selected-objects");
84
+ this .forwardToActiveTab ("show-all-objects");
85
+ this .forwardToActiveTab ("remove-empty-groups");
88
86
 
89
- this .forwardToAllTabs ("expand-extern-proto-declarations")
90
- this .forwardToAllTabs ("expand-prototype-instances")
91
- this .forwardToAllTabs ("expand-inline-nodes")
87
+ this .forwardToAllTabs ("expand-extern-proto-declarations");
88
+ this .forwardToAllTabs ("expand-prototype-instances");
89
+ this .forwardToAllTabs ("expand-inline-nodes");
92
90
 
93
- this .forwardToAllTabs ("primitive-quality")
94
- this .forwardToAllTabs ("texture-quality")
95
- this .forwardToAllTabs ("display-rubberband")
96
- this .forwardToAllTabs ("display-timings")
91
+ this .forwardToAllTabs ("primitive-quality");
92
+ this .forwardToAllTabs ("texture-quality");
93
+ this .forwardToAllTabs ("display-rubberband");
94
+ this .forwardToAllTabs ("display-timings");
97
95
 
98
- this .forwardToActiveTab ("show-library")
99
- this .forwardToActiveTab ("browser-size")
100
- this .forwardToActiveTab ("script-editor-menu")
101
- this .forwardToActiveTab ("outline-editor-menu")
96
+ this .forwardToActiveTab ("show-library");
97
+ this .forwardToActiveTab ("browser-size");
98
+ this .forwardToActiveTab ("script-editor-menu");
99
+ this .forwardToActiveTab ("outline-editor-menu");
102
100
 
103
101
  // Restore tabs.
104
- this .restoreTabs (this .config .activeTab)
102
+ this .restoreTabs (this .config .activeTab);
105
103
  }
106
104
 
107
105
  // Tab handling
@@ -128,6 +126,9 @@ module .exports = new class Tabs
128
126
  return false
129
127
  })
130
128
 
129
+ for (const fileURL of openTabs .filter (fileURL => fileURL .startsWith ("file:")))
130
+ electron .ipcRenderer .send ("add-recent-document", url .fileURLToPath (fileURL));
131
+
131
132
  if (openTabs .length)
132
133
  this .openTabs (openTabs, false)
133
134
 
@@ -321,14 +321,14 @@ module .exports = class OutlineRouteGraph extends OutlineView
321
321
  routeId = element .attr ("route-id") !== undefined ? parseInt (element .attr ("route-id")) : undefined;
322
322
 
323
323
  let
324
- inputAdds = 0,
325
- inputDeletes = 0,
326
- outputAdds = 0,
327
- outputDeletes = 0,
328
- selectedInputRoutesUp = false,
329
- selectedInputRoutesDown = false,
330
- selectedOutputRoutesUp = false,
331
- selectedOutputRoutesDown = false;
324
+ numInputRoutesDown = 0,
325
+ numInputRoutesUp = 0,
326
+ numOutputRoutesDown = 0,
327
+ numOutputRoutesUp = 0,
328
+ numSelectedInputRoutesUp = 0,
329
+ numSelectedInputRoutesDown = 0,
330
+ numSelectedOutputRoutesUp = 0,
331
+ numSelectedOutputRoutesDown = 0;
332
332
 
333
333
  field .getInputRoutes () .forEach (route =>
334
334
  {
@@ -340,21 +340,20 @@ module .exports = class OutlineRouteGraph extends OutlineView
340
340
 
341
341
  if (routes .has (route))
342
342
  {
343
- ++ inputDeletes;
344
- selectedInputRoutesUp = this .selectedRoutes .has (route .getId ());
343
+ numInputRoutesUp += 1;
344
+ numSelectedInputRoutesUp += this .selectedRoutes .has (route .getId ());
345
345
 
346
346
  routes .delete (route);
347
347
  selectedRoutes .delete (route);
348
348
  }
349
349
  else
350
350
  {
351
- ++ inputAdds;
352
- selectedInputRoutesDown = this .selectedRoutes .has (route .getId ());
351
+ numInputRoutesDown += 1;
352
+ numSelectedInputRoutesDown += this .selectedRoutes .has (route .getId ());
353
353
 
354
354
  routes .add (route);
355
355
  }
356
- },
357
- this)
356
+ })
358
357
 
359
358
  field .getOutputRoutes () .forEach (route =>
360
359
  {
@@ -366,16 +365,16 @@ module .exports = class OutlineRouteGraph extends OutlineView
366
365
 
367
366
  if (routes .has (route))
368
367
  {
369
- ++ outputDeletes;
370
- selectedOutputRoutesUp = this .selectedRoutes .has (route .getId ());
368
+ numOutputRoutesUp += 1;
369
+ numSelectedOutputRoutesUp += this .selectedRoutes .has (route .getId ());
371
370
 
372
371
  routes .delete (route);
373
372
  selectedRoutes .delete (route);
374
373
  }
375
374
  else
376
375
  {
377
- ++ outputAdds;
378
- selectedOutputRoutesDown = this .selectedRoutes .has (route .getId ());
376
+ numOutputRoutesDown += 1;
377
+ numSelectedOutputRoutesDown += this .selectedRoutes .has (route .getId ());
379
378
 
380
379
  routes .add (route);
381
380
  }
@@ -383,21 +382,21 @@ module .exports = class OutlineRouteGraph extends OutlineView
383
382
 
384
383
  // Determine vertical selected lines.
385
384
 
386
- const verticalSelectedRoute = this .haveSelectedRoute (selectedRoutes);
387
-
388
- function draw (state, selected) { return (state === "normal" && !selected) || (state === "selected" && selected) }
385
+ const
386
+ hasVerticalSelectedRoutes = this .haveSelectedRoute (selectedRoutes),
387
+ draw = (state, selected) => (state === "normal" && !selected) || (state === "selected" && selected);
389
388
 
390
389
  ["normal", "selected"] .forEach (state =>
391
390
  {
392
391
  // Draw curve up.
393
392
 
394
- if (inputDeletes)
393
+ if (numInputRoutesUp)
395
394
  {
396
395
  // Input curve up.
397
396
 
398
- if (draw (state, selectedInputRoutesUp))
397
+ if (draw (state, numSelectedInputRoutesUp))
399
398
  {
400
- context .strokeStyle = selectedInputRoutesUp ? routeSelectedColor : routeColor;
399
+ context .strokeStyle = numSelectedInputRoutesUp ? routeSelectedColor : routeColor;
401
400
 
402
401
  context .beginPath ();
403
402
  context .arc (0, 0, 9.5, 1/2 * Math .PI, 2 * Math .PI, true);
@@ -406,13 +405,13 @@ module .exports = class OutlineRouteGraph extends OutlineView
406
405
  }
407
406
  }
408
407
 
409
- if (outputDeletes)
408
+ if (numOutputRoutesUp)
410
409
  {
411
410
  // Output curve up.
412
411
 
413
- if (draw (state, selectedOutputRoutesUp))
412
+ if (draw (state, numSelectedOutputRoutesUp))
414
413
  {
415
- context .strokeStyle = selectedOutputRoutesUp ? routeSelectedColor : routeColor;
414
+ context .strokeStyle = numSelectedOutputRoutesUp ? routeSelectedColor : routeColor;
416
415
 
417
416
  context .beginPath ();
418
417
  context .arc (0, 5, 9.5, 1/2 * Math .PI, 2 * Math .PI, true);
@@ -423,13 +422,13 @@ module .exports = class OutlineRouteGraph extends OutlineView
423
422
 
424
423
  // Draw curve down.
425
424
 
426
- if (inputAdds)
425
+ if (numInputRoutesDown)
427
426
  {
428
427
  // Input curve down.
429
428
 
430
- if (draw (state, selectedInputRoutesDown))
429
+ if (draw (state, numSelectedInputRoutesDown))
431
430
  {
432
- context .strokeStyle = selectedInputRoutesDown ? routeSelectedColor : routeColor;
431
+ context .strokeStyle = numSelectedInputRoutesDown ? routeSelectedColor : routeColor;
433
432
 
434
433
  context .beginPath ();
435
434
  context .arc (0, 19, 9.5, 3/2 * Math .PI, 2 * Math .PI);
@@ -438,13 +437,13 @@ module .exports = class OutlineRouteGraph extends OutlineView
438
437
  }
439
438
  }
440
439
 
441
- if (outputAdds)
440
+ if (numOutputRoutesDown)
442
441
  {
443
442
  // Output curve down.
444
443
 
445
- if (draw (state, selectedOutputRoutesDown))
444
+ if (draw (state, numSelectedOutputRoutesDown))
446
445
  {
447
- context .strokeStyle = selectedOutputRoutesDown ? routeSelectedColor : routeColor;
446
+ context .strokeStyle = numSelectedOutputRoutesDown ? routeSelectedColor : routeColor;
448
447
 
449
448
  context .beginPath ();
450
449
  context .arc (0, 24, 9.5, 3/2 * Math .PI, 2 * Math .PI);
@@ -455,11 +454,11 @@ module .exports = class OutlineRouteGraph extends OutlineView
455
454
 
456
455
  // Draw vertical line.
457
456
 
458
- if (routes .size - (inputAdds + outputAdds) > 0)
457
+ if (routes .size - (numInputRoutesDown + numOutputRoutesDown) > 0)
459
458
  {
460
- if (draw (state, verticalSelectedRoute))
459
+ if (draw (state, hasVerticalSelectedRoutes))
461
460
  {
462
- context .strokeStyle = verticalSelectedRoute ? routeSelectedColor : routeColor;
461
+ context .strokeStyle = hasVerticalSelectedRoutes ? routeSelectedColor : routeColor;
463
462
 
464
463
  context .beginPath ();
465
464
  context .moveTo (9.5, 0);
@@ -11,8 +11,8 @@
11
11
  <meta name='comment' content='Rise and Shine'/>
12
12
  <meta name='created' content='Fri, 29 Aug 2014 13:13:27 GMT'/>
13
13
  <meta name='creator' content='Holger Seelig'/>
14
- <meta name='generator' content='Sunrize X3D Editor V1.2.1, https://create3000.github.io/sunrize/'/>
15
- <meta name='modified' content='Fri, 24 Nov 2023 01:25:58 GMT'/>
14
+ <meta name='generator' content='Sunrize X3D Editor V1.2.2, https://create3000.github.io/sunrize/'/>
15
+ <meta name='modified' content='Fri, 24 Nov 2023 22:43:39 GMT'/>
16
16
  </head>
17
17
  <Scene>
18
18
  <ExternProtoDeclare name='ToolShader' url='"../Shaders/ToolShader.x3d"'>
@@ -978,7 +978,7 @@ function set_time (value)
978
978
  {
979
979
  time = 0;
980
980
 
981
- set_next ();
981
+ set_dlbclick ();
982
982
  }
983
983
  else
984
984
  {
@@ -986,7 +986,7 @@ function set_time (value)
986
986
  }
987
987
  }
988
988
 
989
- function set_next ()
989
+ function set_dlbclick ()
990
990
  {
991
991
  if (bboxSize .length ())
992
992
  set_tool ((tool + 1) % tools .length);
@@ -0,0 +1,336 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3
+ <plist version="1.0">
4
+ <dict>
5
+ <key>CFBundleDocumentTypes</key>
6
+ <array>
7
+ <dict>
8
+ <key>CFBundleTypeExtensions</key>
9
+ <array>
10
+ <string>x3d</string>
11
+ <string>X3D</string>
12
+ </array>
13
+ <key>CFBundleTypeMIMETypes</key>
14
+ <array>
15
+ <string>model/x3d+xml</string>
16
+ </array>
17
+ <key>CFBundleTypeName</key>
18
+ <string>X3D Model (XML Encoding)</string>
19
+ <key>CFBundleTypeIconFile</key>
20
+ <string>electron.icns</string>
21
+ <key>CFBundleTypeRole</key>
22
+ <string>Editor</string>
23
+ <key>LSHandlerRank</key>
24
+ <string>Owner</string>
25
+ <key>LSIsAppleDefaultForType</key>
26
+ <true/>
27
+ <key>LSItemContentTypes</key>
28
+ <array>
29
+ <string>io.github.create3000.x3d</string>
30
+ <string>io.castleengine.view3dscene.x3d</string>
31
+ <string>public.plain-text</string>
32
+ </array>
33
+ </dict>
34
+ <dict>
35
+ <key>CFBundleTypeExtensions</key>
36
+ <array>
37
+ <string>x3dz</string>
38
+ <string>X3DZ</string>
39
+ <string>x3d.gz</string>
40
+ <string>X3D.GZ</string>
41
+ </array>
42
+ <key>CFBundleTypeMIMETypes</key>
43
+ <array>
44
+ <string>model/x3d+xml</string>
45
+ <string>application/gzip</string>
46
+ </array>
47
+ <key>CFBundleTypeName</key>
48
+ <string>X3D Model (XML Encoding)</string>
49
+ <key>CFBundleTypeIconFile</key>
50
+ <string>electron.icns</string>
51
+ <key>CFBundleTypeRole</key>
52
+ <string>Editor</string>
53
+ <key>LSHandlerRank</key>
54
+ <string>Owner</string>
55
+ <key>LSIsAppleDefaultForType</key>
56
+ <true/>
57
+ <key>LSItemContentTypes</key>
58
+ <array>
59
+ <string>io.github.create3000.x3d</string>
60
+ <string>io.castleengine.view3dscene.x3d</string>
61
+ <string>public.data</string>
62
+ </array>
63
+ </dict>
64
+ <dict>
65
+ <key>CFBundleTypeExtensions</key>
66
+ <array>
67
+ <string>x3dv</string>
68
+ <string>X3DV</string>
69
+ </array>
70
+ <key>CFBundleTypeMIMETypes</key>
71
+ <array>
72
+ <string>model/x3d+vrml</string>
73
+ </array>
74
+ <key>CFBundleTypeName</key>
75
+ <string>X3D Model (Classic VRML Encoding)</string>
76
+ <key>CFBundleTypeIconFile</key>
77
+ <string>electron.icns</string>
78
+ <key>CFBundleTypeRole</key>
79
+ <string>Editor</string>
80
+ <key>LSHandlerRank</key>
81
+ <string>Owner</string>
82
+ <key>LSIsAppleDefaultForType</key>
83
+ <true/>
84
+ <key>LSItemContentTypes</key>
85
+ <array>
86
+ <string>io.github.create3000.x3dv</string>
87
+ <string>io.castleengine.view3dscene.x3dv</string>
88
+ <string>public.plain-text</string>
89
+ </array>
90
+ </dict>
91
+ <dict>
92
+ <key>CFBundleTypeExtensions</key>
93
+ <array>
94
+ <string>x3dvz</string>
95
+ <string>X3DVZ</string>
96
+ <string>x3dv.gz</string>
97
+ <string>X3DV.GZ</string>
98
+ </array>
99
+ <key>CFBundleTypeMIMETypes</key>
100
+ <array>
101
+ <string>model/x3d+vrml</string>
102
+ <string>application/gzip</string>
103
+ </array>
104
+ <key>CFBundleTypeName</key>
105
+ <string>X3D Model (Classic VRML Encoding)</string>
106
+ <key>CFBundleTypeIconFile</key>
107
+ <string>electron.icns</string>
108
+ <key>CFBundleTypeRole</key>
109
+ <string>Editor</string>
110
+ <key>LSHandlerRank</key>
111
+ <string>Owner</string>
112
+ <key>LSIsAppleDefaultForType</key>
113
+ <true/>
114
+ <key>LSItemContentTypes</key>
115
+ <array>
116
+ <string>io.github.create3000.x3dv</string>
117
+ <string>io.castleengine.view3dscene.x3dv</string>
118
+ <string>public.data</string>
119
+ </array>
120
+ </dict>
121
+ <dict>
122
+ <key>CFBundleTypeExtensions</key>
123
+ <array>
124
+ <string>x3dv</string>
125
+ <string>X3DV</string>
126
+ </array>
127
+ <key>CFBundleTypeMIMETypes</key>
128
+ <array>
129
+ <string>model/x3d+vrml</string>
130
+ </array>
131
+ <key>CFBundleTypeName</key>
132
+ <string>X3D Model (Classic VRML Encoding)</string>
133
+ <key>CFBundleTypeIconFile</key>
134
+ <string>electron.icns</string>
135
+ <key>CFBundleTypeRole</key>
136
+ <string>Editor</string>
137
+ <key>LSHandlerRank</key>
138
+ <string>Owner</string>
139
+ <key>LSIsAppleDefaultForType</key>
140
+ <true/>
141
+ <key>LSItemContentTypes</key>
142
+ <array>
143
+ <string>io.github.create3000.x3dv</string>
144
+ <string>io.castleengine.view3dscene.x3dv</string>
145
+ <string>public.plain-text</string>
146
+ </array>
147
+ </dict>
148
+ <dict>
149
+ <key>CFBundleTypeExtensions</key>
150
+ <array>
151
+ <string>x3dvz</string>
152
+ <string>X3DVZ</string>
153
+ <string>x3dv.gz</string>
154
+ <string>X3DV.GZ</string>
155
+ </array>
156
+ <key>CFBundleTypeMIMETypes</key>
157
+ <array>
158
+ <string>model/x3d+vrml</string>
159
+ <string>application/gzip</string>
160
+ </array>
161
+ <key>CFBundleTypeName</key>
162
+ <string>X3D Model (Classic VRML Encoding)</string>
163
+ <key>CFBundleTypeIconFile</key>
164
+ <string>electron.icns</string>
165
+ <key>CFBundleTypeRole</key>
166
+ <string>Editor</string>
167
+ <key>LSHandlerRank</key>
168
+ <string>Owner</string>
169
+ <key>LSIsAppleDefaultForType</key>
170
+ <true/>
171
+ <key>LSItemContentTypes</key>
172
+ <array>
173
+ <string>io.github.create3000.x3dv</string>
174
+ <string>io.castleengine.view3dscene.x3dv</string>
175
+ <string>public.data</string>
176
+ </array>
177
+ </dict>
178
+ <dict>
179
+ <key>CFBundleTypeExtensions</key>
180
+ <array>
181
+ <string>wrl</string>
182
+ <string>WRL</string>
183
+ <string>vrml</string>
184
+ <string>VRML</string>
185
+ </array>
186
+ <key>CFBundleTypeMIMETypes</key>
187
+ <array>
188
+ <string>model/vrml</string>
189
+ <string>x-world/x-vrml</string>
190
+ </array>
191
+ <key>CFBundleTypeName</key>
192
+ <string>VRML Document</string>
193
+ <key>CFBundleTypeIconFile</key>
194
+ <string>electron.icns</string>
195
+ <key>CFBundleTypeRole</key>
196
+ <string>Editor</string>
197
+ <key>LSHandlerRank</key>
198
+ <string>Owner</string>
199
+ <key>LSIsAppleDefaultForType</key>
200
+ <true/>
201
+ <key>LSItemContentTypes</key>
202
+ <array>
203
+ <string>io.github.create3000.vrml</string>
204
+ <string>io.castleengine.view3dscene.vrml</string>
205
+ <string>public.plain-text</string>
206
+ </array>
207
+ </dict>
208
+ <dict>
209
+ <key>CFBundleTypeExtensions</key>
210
+ <array>
211
+ <string>wrz</string>
212
+ <string>WRZ</string>
213
+ <string>wrl.gz</string>
214
+ <string>WRL.GZ</string>
215
+ </array>
216
+ <key>CFBundleTypeMIMETypes</key>
217
+ <array>
218
+ <string>model/vrml</string>
219
+ <string>x-world/x-vrml</string>
220
+ <string>application/gzip</string>
221
+ </array>
222
+ <key>CFBundleTypeName</key>
223
+ <string>VRML Document</string>
224
+ <key>CFBundleTypeIconFile</key>
225
+ <string>electron.icns</string>
226
+ <key>CFBundleTypeRole</key>
227
+ <string>Editor</string>
228
+ <key>LSHandlerRank</key>
229
+ <string>Owner</string>
230
+ <key>LSIsAppleDefaultForType</key>
231
+ <true/>
232
+ <key>LSItemContentTypes</key>
233
+ <array>
234
+ <string>io.github.create3000.vrml</string>
235
+ <string>io.castleengine.view3dscene.vrml</string>
236
+ <string>public.data</string>
237
+ </array>
238
+ </dict>
239
+ <dict>
240
+ <key>CFBundleTypeExtensions</key>
241
+ <array>
242
+ <string>gltf</string>
243
+ <string>GLTF</string>
244
+ <string>glb</string>
245
+ <string>GLB</string>
246
+ </array>
247
+ <key>CFBundleTypeMIMETypes</key>
248
+ <array>
249
+ <string>model/gltf+json</string>
250
+ </array>
251
+ <key>CFBundleTypeName</key>
252
+ <string>glTF Model</string>
253
+ <key>CFBundleTypeRole</key>
254
+ <string>Editor</string>
255
+ <key>LSHandlerRank</key>
256
+ <string>Alternate</string>
257
+ <key>LSIsAppleDefaultForType</key>
258
+ <true/>
259
+ </dict>
260
+ <dict>
261
+ <key>CFBundleTypeExtensions</key>
262
+ <array>
263
+ <string>obj</string>
264
+ <string>OBJ</string>
265
+ </array>
266
+ <key>CFBundleTypeMIMETypes</key>
267
+ <array>
268
+ <string>model/obj</string>
269
+ </array>
270
+ <key>CFBundleTypeName</key>
271
+ <string>Geometry Definition File Format</string>
272
+ <key>CFBundleTypeRole</key>
273
+ <string>Editor</string>
274
+ <key>LSHandlerRank</key>
275
+ <string>Alternate</string>
276
+ <key>LSIsAppleDefaultForType</key>
277
+ <true/>
278
+ </dict>
279
+ <dict>
280
+ <key>CFBundleTypeExtensions</key>
281
+ <array>
282
+ <string>stl</string>
283
+ <string>STL</string>
284
+ </array>
285
+ <key>CFBundleTypeMIMETypes</key>
286
+ <array>
287
+ <string>model/stl</string>
288
+ </array>
289
+ <key>CFBundleTypeName</key>
290
+ <string>Standard Tesselated Geometry File Format</string>
291
+ <key>CFBundleTypeRole</key>
292
+ <string>Editor</string>
293
+ <key>LSHandlerRank</key>
294
+ <string>Alternate</string>
295
+ <key>LSIsAppleDefaultForType</key>
296
+ <true/>
297
+ </dict>
298
+ <dict>
299
+ <key>CFBundleTypeExtensions</key>
300
+ <array>
301
+ <string>ply</string>
302
+ <string>PLY</string>
303
+ </array>
304
+ <key>CFBundleTypeMIMETypes</key>
305
+ <array>
306
+ <string>model/ply</string>
307
+ </array>
308
+ <key>CFBundleTypeName</key>
309
+ <string>Polygon File Format</string>
310
+ <key>CFBundleTypeRole</key>
311
+ <string>Editor</string>
312
+ <key>LSHandlerRank</key>
313
+ <string>Alternate</string>
314
+ <key>LSIsAppleDefaultForType</key>
315
+ <true/>
316
+ </dict>
317
+ <dict>
318
+ <key>CFBundleTypeExtensions</key>
319
+ <array>
320
+ <string>svg</string>
321
+ <string>SVG</string>
322
+ </array>
323
+ <key>CFBundleTypeMIMETypes</key>
324
+ <array>
325
+ <string>image/svg+xml</string>
326
+ </array>
327
+ <key>CFBundleTypeName</key>
328
+ <string>Scalable Vector Graphics Image</string>
329
+ <key>CFBundleTypeRole</key>
330
+ <string>Editor</string>
331
+ <key>LSHandlerRank</key>
332
+ <string>Alternate</string>
333
+ </dict>
334
+ </array>
335
+ </dict>
336
+ </plist>