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 +6 -3
- package/src/Application/Application.js +61 -37
- package/src/Application/Document.js +1 -1
- package/src/Application/Tabs.js +47 -46
- package/src/Editors/OutlineRouteGraph.js +35 -36
- package/src/Tools/Grouping/X3DTransformNodeTool.x3d +4 -4
- package/src/assets/Info.plist +336 -0
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sunrize",
|
|
3
3
|
"productName": "Sunrize X3D Editor",
|
|
4
|
-
"version": "1.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
|
-
"
|
|
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
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
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",
|
|
82
|
-
electron .ipcMain .on ("current-file",
|
|
83
|
-
electron .ipcMain .on ("
|
|
84
|
-
electron .ipcMain .on ("change-menu",
|
|
85
|
-
electron .ipcMain .on ("context-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 () =>
|
|
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 (
|
|
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} ·
|
|
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:
|
|
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:
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
682
|
-
|
|
683
|
-
|
|
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
|
-
|
|
756
|
+
if (this .ready)
|
|
741
757
|
{
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
758
|
+
for (const URL of urls)
|
|
759
|
+
{
|
|
760
|
+
if (URL .startsWith ("file:"))
|
|
761
|
+
this .addRecentDocument (url .fileURLToPath (URL));
|
|
762
|
+
}
|
|
745
763
|
|
|
746
|
-
|
|
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:
|
|
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
|
-
|
|
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:
|
|
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:
|
|
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 ("
|
|
223
|
+
electron .ipcRenderer .send ("add-recent-document", this .filePath);
|
|
224
224
|
}
|
|
225
225
|
else
|
|
226
226
|
{
|
package/src/Application/Tabs.js
CHANGED
|
@@ -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
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
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
|
-
|
|
344
|
-
|
|
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
|
-
|
|
352
|
-
|
|
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
|
-
|
|
370
|
-
|
|
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
|
-
|
|
378
|
-
|
|
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
|
|
387
|
-
|
|
388
|
-
|
|
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 (
|
|
393
|
+
if (numInputRoutesUp)
|
|
395
394
|
{
|
|
396
395
|
// Input curve up.
|
|
397
396
|
|
|
398
|
-
if (draw (state,
|
|
397
|
+
if (draw (state, numSelectedInputRoutesUp))
|
|
399
398
|
{
|
|
400
|
-
context .strokeStyle =
|
|
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 (
|
|
408
|
+
if (numOutputRoutesUp)
|
|
410
409
|
{
|
|
411
410
|
// Output curve up.
|
|
412
411
|
|
|
413
|
-
if (draw (state,
|
|
412
|
+
if (draw (state, numSelectedOutputRoutesUp))
|
|
414
413
|
{
|
|
415
|
-
context .strokeStyle =
|
|
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 (
|
|
425
|
+
if (numInputRoutesDown)
|
|
427
426
|
{
|
|
428
427
|
// Input curve down.
|
|
429
428
|
|
|
430
|
-
if (draw (state,
|
|
429
|
+
if (draw (state, numSelectedInputRoutesDown))
|
|
431
430
|
{
|
|
432
|
-
context .strokeStyle =
|
|
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 (
|
|
440
|
+
if (numOutputRoutesDown)
|
|
442
441
|
{
|
|
443
442
|
// Output curve down.
|
|
444
443
|
|
|
445
|
-
if (draw (state,
|
|
444
|
+
if (draw (state, numSelectedOutputRoutesDown))
|
|
446
445
|
{
|
|
447
|
-
context .strokeStyle =
|
|
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 - (
|
|
457
|
+
if (routes .size - (numInputRoutesDown + numOutputRoutesDown) > 0)
|
|
459
458
|
{
|
|
460
|
-
if (draw (state,
|
|
459
|
+
if (draw (state, hasVerticalSelectedRoutes))
|
|
461
460
|
{
|
|
462
|
-
context .strokeStyle =
|
|
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.
|
|
15
|
-
<meta name='modified' content='Fri, 24 Nov 2023
|
|
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
|
-
|
|
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
|
|
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>
|