From ad54e01cd0d7696e32aec8cec2951f64a8e0a354 Mon Sep 17 00:00:00 2001 From: l0go Date: Mon, 3 Mar 2025 09:16:53 -0500 Subject: [PATCH 01/12] Start the tedious work of an electron port --- .gitignore | 4 +- bin/Release.hx | 85 ----- bin/cdb.cmd | 16 - bin/index.html | 6 +- bin/package.json | 12 - castle.hxml => build.hxml | 17 +- package.json | 18 + pnpm-lock.yaml | 590 +++++++++++++++++++++++++++++ src/{ => app}/JqPages.hx | 11 +- src/{ => app}/Level.hx | 13 +- src/{ => app}/Main.hx | 589 +++++++++++++--------------- src/{ => app}/Model.hx | 11 +- src/{ => app}/Resolver.hx | 0 src/{ => app}/lvl/Image.hx | 0 src/{ => app}/lvl/Image3D.hx | 0 src/{ => app}/lvl/LayerData.hx | 0 src/{ => app}/lvl/LayerGfx.hx | 0 src/{ => app}/lvl/Palette.hx | 0 src/{ => app}/test/Test.hx | 0 src/{ => app}/test/dat/Data.hx | 0 src/{ => app}/test/test.cdb | 0 src/{ => app}/test/test.hxml | 0 src/{ => app}/test/test.hxproj | 0 src/{ => app}/vdom/Answer.hx | 0 src/{ => app}/vdom/Client.hx | 0 src/{ => app}/vdom/Dom.hx | 0 src/{ => app}/vdom/Event.hx | 0 src/{ => app}/vdom/JQuery.hx | 0 src/{ => app}/vdom/Message.hx | 0 src/{ => app}/vdom/Query.hx | 0 src/{ => app}/vdom/README.md | 0 src/{ => app}/vdom/Server.hx | 0 src/js/node/webkit/App.hx | 21 - src/js/node/webkit/Clipboard.hx | 14 - src/js/node/webkit/Menu.hx | 20 - src/js/node/webkit/MenuItem.hx | 19 - src/js/node/webkit/MenuItemType.hx | 8 - src/js/node/webkit/Shell.hx | 10 - src/js/node/webkit/Window.hx | 43 --- src/runtime/Main.hx | 369 ++++++++++++++++++ 40 files changed, 1276 insertions(+), 600 deletions(-) delete mode 100644 bin/Release.hx delete mode 100644 bin/cdb.cmd delete mode 100644 bin/package.json rename castle.hxml => build.hxml (71%) create mode 100644 package.json create mode 100644 pnpm-lock.yaml rename src/{ => app}/JqPages.hx (98%) rename src/{ => app}/Level.hx (99%) rename src/{ => app}/Main.hx (86%) rename src/{ => app}/Model.hx (96%) rename src/{ => app}/Resolver.hx (100%) rename src/{ => app}/lvl/Image.hx (100%) rename src/{ => app}/lvl/Image3D.hx (100%) rename src/{ => app}/lvl/LayerData.hx (100%) rename src/{ => app}/lvl/LayerGfx.hx (100%) rename src/{ => app}/lvl/Palette.hx (100%) rename src/{ => app}/test/Test.hx (100%) rename src/{ => app}/test/dat/Data.hx (100%) rename src/{ => app}/test/test.cdb (100%) rename src/{ => app}/test/test.hxml (100%) rename src/{ => app}/test/test.hxproj (100%) rename src/{ => app}/vdom/Answer.hx (100%) rename src/{ => app}/vdom/Client.hx (100%) rename src/{ => app}/vdom/Dom.hx (100%) rename src/{ => app}/vdom/Event.hx (100%) rename src/{ => app}/vdom/JQuery.hx (100%) rename src/{ => app}/vdom/Message.hx (100%) rename src/{ => app}/vdom/Query.hx (100%) rename src/{ => app}/vdom/README.md (100%) rename src/{ => app}/vdom/Server.hx (100%) delete mode 100644 src/js/node/webkit/App.hx delete mode 100644 src/js/node/webkit/Clipboard.hx delete mode 100644 src/js/node/webkit/Menu.hx delete mode 100644 src/js/node/webkit/MenuItem.hx delete mode 100644 src/js/node/webkit/MenuItemType.hx delete mode 100644 src/js/node/webkit/Shell.hx delete mode 100644 src/js/node/webkit/Window.hx create mode 100644 src/runtime/Main.hx diff --git a/.gitignore b/.gitignore index 4d00a931..6f9c7c44 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ +.haxelib/ /*.cdb /new.img /src/test/test.js @@ -8,6 +9,7 @@ /bin/style.min.css /www/sample /bin/castle.js +/bin/index.js /bin/nwjs /bin/*.lnk -/dist \ No newline at end of file +/dist diff --git a/bin/Release.hx b/bin/Release.hx deleted file mode 100644 index b31e3db1..00000000 --- a/bin/Release.hx +++ /dev/null @@ -1,85 +0,0 @@ -class Release { - - public static function main() { - var files = [ - "package.json", - "icon.png", - "index.html", - "castle.js", - "style.css", - "dock", - "libs", - ]; - - var zfiles = []; - - function add(f:String) { - if( sys.FileSystem.isDirectory(f) ) { - for( file in sys.FileSystem.readDirectory(f) ) - add(f+"/"+file); - return; - } - var data = sys.io.File.getBytes(f); - zfiles.push({ - fileTime : Date.now(), - fileSize : data.length, - fileName : f, - dataSize : data.length, - data : data, - compressed : false, - crc32 : null, - extraFields : null, - }); - } - for( f in files ) - add(f); - var o = new haxe.io.BytesOutput(); - new haxe.zip.Writer(o).write(Lambda.list(zfiles)); - var bytes = o.getBytes(); - sys.io.File.saveBytes("package.nw", bytes); - - /* - var platforms = [ - "win", - "osx", // When unzipping with OSX, the rights will be correctly set on the .app - "linux", // TODO : linux uses TGZ for rights, we lack format.tgz.Writer atm - ]; - for( pf in platforms ) { - var zip = 'node-webkit-$pf.zip'; - if( !sys.FileSystem.exists(zip) ) { - Sys.println('$zip not found'); - continue; - } - var z = new haxe.zip.Reader(sys.io.File.read(zip)).read(); - for( e in z ) { - switch( e.fileName ) { - case "nw": - e.fileName = "cdb"; - case "nw.exe": - e.fileName = "cdb.exe"; - case "nwsnapshot", "nwsnapshot.exe": - z.remove(e); - default: - if( e.fileName.substr(0, 15) == "node-webkit.app" ) - e.fileName = "castleDB.app" + e.fileName.substr(15); - } - } - z.add({ - fileTime : Date.now(), - fileSize : bytes.length, - fileName : "package.nw", - dataSize : bytes.length, - data : bytes, - compressed : false, - crc32 : null, - extraFields : null, - }); - var out = 'castledb-$pf.zip'; - var o = sys.io.File.write(out); - new haxe.zip.Writer(o).write(z); - o.close(); - Sys.println('$out written'); - }*/ - } - -} \ No newline at end of file diff --git a/bin/cdb.cmd b/bin/cdb.cmd deleted file mode 100644 index 726d988a..00000000 --- a/bin/cdb.cmd +++ /dev/null @@ -1,16 +0,0 @@ -@echo off - -if exist "%~dp0nwjs\nw.exe" ( - if exist "%~dp0castle.js" ( - start /D %~dp0 nwjs\nw.exe --nwapp package.json %* - ) else ( - echo. - echo Missing "castle.js". - pause - ) -) else ( - echo. - echo This requires "nw.exe" in ./nwjs/ folder. - echo Get it on: https://nwjs.io/ - pause -) \ No newline at end of file diff --git a/bin/index.html b/bin/index.html index 91ad531e..a06e831a 100644 --- a/bin/index.html +++ b/bin/index.html @@ -1,8 +1,8 @@ - - + + @@ -349,4 +349,4 @@

About

- \ No newline at end of file + diff --git a/bin/package.json b/bin/package.json deleted file mode 100644 index 0b241261..00000000 --- a/bin/package.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "name" : "CastleDB", - "window" : { - "title" : "CastleDB Editor v1.6.2", - "icon" : "icon.png", - "width" : 800, - "height" : 600, - "show" : false, - "toolbar" : false - }, - "main" : "index.html" -} \ No newline at end of file diff --git a/castle.hxml b/build.hxml similarity index 71% rename from castle.hxml rename to build.hxml index 55b7b735..1318267a 100644 --- a/castle.hxml +++ b/build.hxml @@ -1,6 +1,18 @@ --cp src --js bin/castle.js -main Main +-lib electron +--debug +-dce std +-w -WDeprecated + +--each + +-js bin/index.js +-cp src/runtime/ + +--next + +-cp src/app/ +-js bin/castle.js -lib hxnodejs:git:https://github.com/HaxeFoundation/hxnodejs -lib hx3compat:git:https://github.com/HaxeFoundation/hx3compat -lib format:git:https://github.com/HaxeFoundation/format @@ -8,5 +20,4 @@ -lib thx.csv -D lz4js -D analyzer-optimize --dce std -D js-es=6 diff --git a/package.json b/package.json new file mode 100644 index 00000000..443e6ac8 --- /dev/null +++ b/package.json @@ -0,0 +1,18 @@ +{ + "name": "castle", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "start": "electron bin/", + "test": "echo \"Error: no test specified\" && exit 1" + }, + "keywords": [], + "author": "", + "license": "ISC", + "dependencies": { + "electron": "^34.2.0", + "jquery": "^3.7.1", + "jquery-sortable": "^0.9.13" + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 00000000..64171560 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,590 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + electron: + specifier: ^34.2.0 + version: 34.2.0 + jquery: + specifier: ^3.7.1 + version: 3.7.1 + jquery-sortable: + specifier: ^0.9.13 + version: 0.9.13 + +packages: + + '@electron/get@2.0.3': + resolution: {integrity: sha512-Qkzpg2s9GnVV2I2BjRksUi43U5e6+zaQMcjoJy0C+C5oxaKl+fmckGDQFtRpZpZV0NQekuZZ+tGz7EA9TVnQtQ==} + engines: {node: '>=12'} + + '@sindresorhus/is@4.6.0': + resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} + engines: {node: '>=10'} + + '@szmarczak/http-timer@4.0.6': + resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==} + engines: {node: '>=10'} + + '@types/cacheable-request@6.0.3': + resolution: {integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==} + + '@types/http-cache-semantics@4.0.4': + resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==} + + '@types/keyv@3.1.4': + resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} + + '@types/node@20.17.19': + resolution: {integrity: sha512-LEwC7o1ifqg/6r2gn9Dns0f1rhK+fPFDoMiceTJ6kWmVk6bgXBI/9IOWfVan4WiAavK9pIVWdX0/e3J+eEUh5A==} + + '@types/responselike@1.0.3': + resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} + + '@types/yauzl@2.10.3': + resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} + + boolean@3.2.0: + resolution: {integrity: sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + + buffer-crc32@0.2.13: + resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} + + cacheable-lookup@5.0.4: + resolution: {integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==} + engines: {node: '>=10.6.0'} + + cacheable-request@7.0.4: + resolution: {integrity: sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==} + engines: {node: '>=8'} + + clone-response@1.0.3: + resolution: {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==} + + debug@4.4.0: + resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decompress-response@6.0.0: + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} + engines: {node: '>=10'} + + defer-to-connect@2.0.1: + resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} + engines: {node: '>=10'} + + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + + detect-node@2.1.0: + resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} + + electron@34.2.0: + resolution: {integrity: sha512-SYwBJNeXBTm1q/ErybQMUBZAYqEreBUqBwTrNkw1rV4YatDZk5Aittpcus3PPeC4UoI/tqmJ946uG8AKHTd6CA==} + engines: {node: '>= 12.20.55'} + hasBin: true + + end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + + env-paths@2.2.1: + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es6-error@4.1.1: + resolution: {integrity: sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + extract-zip@2.0.1: + resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==} + engines: {node: '>= 10.17.0'} + hasBin: true + + fd-slicer@1.1.0: + resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} + + fs-extra@8.1.0: + resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} + engines: {node: '>=6 <7 || >=8'} + + get-stream@5.2.0: + resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} + engines: {node: '>=8'} + + global-agent@3.0.0: + resolution: {integrity: sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==} + engines: {node: '>=10.0'} + + globalthis@1.0.4: + resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} + engines: {node: '>= 0.4'} + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + got@11.8.6: + resolution: {integrity: sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==} + engines: {node: '>=10.19.0'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + + http-cache-semantics@4.1.1: + resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} + + http2-wrapper@1.0.3: + resolution: {integrity: sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==} + engines: {node: '>=10.19.0'} + + jquery-sortable@0.9.13: + resolution: {integrity: sha512-AlWotHQnKOAJLRfmbsv0iHcmTB6v6ZsCJ3MvIFaiqJ4Lcpuo8z2w+orAEo6SSP7sLfvhMegM0Oy+I3p20qUO+g==} + + jquery@2.2.4: + resolution: {integrity: sha512-lBHj60ezci2u1v2FqnZIraShGgEXq35qCzMv4lITyHGppTnA13rwR0MgwyNJh9TnDs3aXUvd1xjAotfraMHX/Q==} + deprecated: This version is deprecated. Please upgrade to the latest version or find support at https://www.herodevs.com/support/jquery-nes. + + jquery@3.7.1: + resolution: {integrity: sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg==} + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-stringify-safe@5.0.1: + resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} + + jsonfile@4.0.0: + resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + lowercase-keys@2.0.0: + resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} + engines: {node: '>=8'} + + matcher@3.0.0: + resolution: {integrity: sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==} + engines: {node: '>=10'} + + mimic-response@1.0.1: + resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==} + engines: {node: '>=4'} + + mimic-response@3.1.0: + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: '>=10'} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + normalize-url@6.1.0: + resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} + engines: {node: '>=10'} + + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + p-cancelable@2.1.1: + resolution: {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==} + engines: {node: '>=8'} + + pend@1.2.0: + resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} + + progress@2.0.3: + resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} + engines: {node: '>=0.4.0'} + + pump@3.0.2: + resolution: {integrity: sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==} + + quick-lru@5.1.1: + resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} + engines: {node: '>=10'} + + resolve-alpn@1.2.1: + resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} + + responselike@2.0.1: + resolution: {integrity: sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==} + + roarr@2.15.4: + resolution: {integrity: sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==} + engines: {node: '>=8.0'} + + semver-compare@1.0.0: + resolution: {integrity: sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==} + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.7.1: + resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} + engines: {node: '>=10'} + hasBin: true + + serialize-error@7.0.1: + resolution: {integrity: sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==} + engines: {node: '>=10'} + + sprintf-js@1.1.3: + resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} + + sumchecker@3.0.1: + resolution: {integrity: sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==} + engines: {node: '>= 8.0'} + + type-fest@0.13.1: + resolution: {integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==} + engines: {node: '>=10'} + + undici-types@6.19.8: + resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} + + universalify@0.1.2: + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} + engines: {node: '>= 4.0.0'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + yauzl@2.10.0: + resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} + +snapshots: + + '@electron/get@2.0.3': + dependencies: + debug: 4.4.0 + env-paths: 2.2.1 + fs-extra: 8.1.0 + got: 11.8.6 + progress: 2.0.3 + semver: 6.3.1 + sumchecker: 3.0.1 + optionalDependencies: + global-agent: 3.0.0 + transitivePeerDependencies: + - supports-color + + '@sindresorhus/is@4.6.0': {} + + '@szmarczak/http-timer@4.0.6': + dependencies: + defer-to-connect: 2.0.1 + + '@types/cacheable-request@6.0.3': + dependencies: + '@types/http-cache-semantics': 4.0.4 + '@types/keyv': 3.1.4 + '@types/node': 20.17.19 + '@types/responselike': 1.0.3 + + '@types/http-cache-semantics@4.0.4': {} + + '@types/keyv@3.1.4': + dependencies: + '@types/node': 20.17.19 + + '@types/node@20.17.19': + dependencies: + undici-types: 6.19.8 + + '@types/responselike@1.0.3': + dependencies: + '@types/node': 20.17.19 + + '@types/yauzl@2.10.3': + dependencies: + '@types/node': 20.17.19 + optional: true + + boolean@3.2.0: + optional: true + + buffer-crc32@0.2.13: {} + + cacheable-lookup@5.0.4: {} + + cacheable-request@7.0.4: + dependencies: + clone-response: 1.0.3 + get-stream: 5.2.0 + http-cache-semantics: 4.1.1 + keyv: 4.5.4 + lowercase-keys: 2.0.0 + normalize-url: 6.1.0 + responselike: 2.0.1 + + clone-response@1.0.3: + dependencies: + mimic-response: 1.0.1 + + debug@4.4.0: + dependencies: + ms: 2.1.3 + + decompress-response@6.0.0: + dependencies: + mimic-response: 3.1.0 + + defer-to-connect@2.0.1: {} + + define-data-property@1.1.4: + dependencies: + es-define-property: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 + optional: true + + define-properties@1.2.1: + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 + optional: true + + detect-node@2.1.0: + optional: true + + electron@34.2.0: + dependencies: + '@electron/get': 2.0.3 + '@types/node': 20.17.19 + extract-zip: 2.0.1 + transitivePeerDependencies: + - supports-color + + end-of-stream@1.4.4: + dependencies: + once: 1.4.0 + + env-paths@2.2.1: {} + + es-define-property@1.0.1: + optional: true + + es-errors@1.3.0: + optional: true + + es6-error@4.1.1: + optional: true + + escape-string-regexp@4.0.0: + optional: true + + extract-zip@2.0.1: + dependencies: + debug: 4.4.0 + get-stream: 5.2.0 + yauzl: 2.10.0 + optionalDependencies: + '@types/yauzl': 2.10.3 + transitivePeerDependencies: + - supports-color + + fd-slicer@1.1.0: + dependencies: + pend: 1.2.0 + + fs-extra@8.1.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + + get-stream@5.2.0: + dependencies: + pump: 3.0.2 + + global-agent@3.0.0: + dependencies: + boolean: 3.2.0 + es6-error: 4.1.1 + matcher: 3.0.0 + roarr: 2.15.4 + semver: 7.7.1 + serialize-error: 7.0.1 + optional: true + + globalthis@1.0.4: + dependencies: + define-properties: 1.2.1 + gopd: 1.2.0 + optional: true + + gopd@1.2.0: + optional: true + + got@11.8.6: + dependencies: + '@sindresorhus/is': 4.6.0 + '@szmarczak/http-timer': 4.0.6 + '@types/cacheable-request': 6.0.3 + '@types/responselike': 1.0.3 + cacheable-lookup: 5.0.4 + cacheable-request: 7.0.4 + decompress-response: 6.0.0 + http2-wrapper: 1.0.3 + lowercase-keys: 2.0.0 + p-cancelable: 2.1.1 + responselike: 2.0.1 + + graceful-fs@4.2.11: {} + + has-property-descriptors@1.0.2: + dependencies: + es-define-property: 1.0.1 + optional: true + + http-cache-semantics@4.1.1: {} + + http2-wrapper@1.0.3: + dependencies: + quick-lru: 5.1.1 + resolve-alpn: 1.2.1 + + jquery-sortable@0.9.13: + dependencies: + jquery: 2.2.4 + + jquery@2.2.4: {} + + jquery@3.7.1: {} + + json-buffer@3.0.1: {} + + json-stringify-safe@5.0.1: + optional: true + + jsonfile@4.0.0: + optionalDependencies: + graceful-fs: 4.2.11 + + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + lowercase-keys@2.0.0: {} + + matcher@3.0.0: + dependencies: + escape-string-regexp: 4.0.0 + optional: true + + mimic-response@1.0.1: {} + + mimic-response@3.1.0: {} + + ms@2.1.3: {} + + normalize-url@6.1.0: {} + + object-keys@1.1.1: + optional: true + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + p-cancelable@2.1.1: {} + + pend@1.2.0: {} + + progress@2.0.3: {} + + pump@3.0.2: + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + + quick-lru@5.1.1: {} + + resolve-alpn@1.2.1: {} + + responselike@2.0.1: + dependencies: + lowercase-keys: 2.0.0 + + roarr@2.15.4: + dependencies: + boolean: 3.2.0 + detect-node: 2.1.0 + globalthis: 1.0.4 + json-stringify-safe: 5.0.1 + semver-compare: 1.0.0 + sprintf-js: 1.1.3 + optional: true + + semver-compare@1.0.0: + optional: true + + semver@6.3.1: {} + + semver@7.7.1: + optional: true + + serialize-error@7.0.1: + dependencies: + type-fest: 0.13.1 + optional: true + + sprintf-js@1.1.3: + optional: true + + sumchecker@3.0.1: + dependencies: + debug: 4.4.0 + transitivePeerDependencies: + - supports-color + + type-fest@0.13.1: + optional: true + + undici-types@6.19.8: {} + + universalify@0.1.2: {} + + wrappy@1.0.2: {} + + yauzl@2.10.0: + dependencies: + buffer-crc32: 0.2.13 + fd-slicer: 1.1.0 diff --git a/src/JqPages.hx b/src/app/JqPages.hx similarity index 98% rename from src/JqPages.hx rename to src/app/JqPages.hx index 482705d9..90c1c7a6 100644 --- a/src/JqPages.hx +++ b/src/app/JqPages.hx @@ -14,6 +14,9 @@ * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ import js.jquery.Helper.*; +import electron.main.Menu; +import electron.main.MenuItem; + extern class DockNode { var elementPanel : js.html.HtmlElement; @@ -194,13 +197,13 @@ class JqPage extends vdom.Server { case "popupMenu": var args : Array = cast args; - var n = new js.node.webkit.Menu(); + var n = new Menu(); for( i in 0...args.length ) { - var mit = new js.node.webkit.MenuItem( { label : args[i] } ); + var mit = new MenuItem( { label : args[i] } ); n.append(mit); mit.click = function() result(i); } - @:privateAccess n.popup(Main.inst.mousePos.x, Main.inst.mousePos.y); + @:privateAccess n.popup({x : Main.inst.mousePos.x, y : Main.inst.mousePos.y}); case "startDrag": @@ -381,4 +384,4 @@ class JqPages { }); } -} \ No newline at end of file +} diff --git a/src/Level.hx b/src/app/Level.hx similarity index 99% rename from src/Level.hx rename to src/app/Level.hx index 326c196c..55999921 100644 --- a/src/Level.hx +++ b/src/app/Level.hx @@ -20,9 +20,9 @@ import js.jquery.JQuery; import Main.K; import lvl.LayerData; -import js.node.webkit.Menu; -import js.node.webkit.MenuItem; -import js.node.webkit.MenuItemType; +import electron.renderer.IpcRenderer; +import electron.main.Menu; +import electron.main.MenuItem; typedef LevelState = { var curLayer : String; @@ -322,7 +322,7 @@ class Level { var f = getFileTime(w.path); if( f != w.time && f != 0. ) { w.time = f; - js.node.webkit.App.clearCache(); + IpcRenderer.invoke("clearCache"); for( c in w.callb ) c(); } @@ -650,13 +650,12 @@ class Level { }).keypress(function(e) if( e.keyCode == 13 ) JTHIS.blur())); }; nrename.enabled = ndel.enabled; - n.popup(mouseX, mouseY); + IpcRenderer.invoke("popupMenu", n, {x : mouseX, y: mouseY}); } public function onResize() { - var win = js.node.webkit.Window.get(); - content.find(".scroll").css("height", (win.height - 240) + "px"); + content.find(".scroll").css("height", ((electron.main.BrowserWindow.getFocusedWindow() : electron.main.BrowserWindow).getBounds().height - 240) + "px"); } function setSort( j : JQuery, callb : { ref : Dynamic -> Void } ) { diff --git a/src/Main.hx b/src/app/Main.hx similarity index 86% rename from src/Main.hx rename to src/app/Main.hx index 577599b2..78d3c171 100644 --- a/src/Main.hx +++ b/src/app/Main.hx @@ -18,9 +18,9 @@ import cdb.Sheet; import js.jquery.Helper.*; import js.jquery.JQuery; -import js.node.webkit.Menu; -import js.node.webkit.MenuItem; -import js.node.webkit.MenuItemType; + +//import electron.main.BrowserWindow; +import electron.renderer.IpcRenderer; private typedef Cursor = { s : Sheet, @@ -53,7 +53,7 @@ class Main extends Model { static var UID = 0; - var window : js.node.webkit.Window; + var window : js.html.Window; var viewSheet : Sheet; var mousePos : { x : Int, y : Int }; var typesStr : String; @@ -69,26 +69,36 @@ class Main extends Model { var colProps : { sheet : String, ref : Column, index : Null }; var levels : Array; var level : Level; - var mcompress : MenuItem; var pages : JqPages; - var macEditMenu : MenuItem; - function new() { super(); - window = js.node.webkit.Window.get(); - window.on("resize", onResize); - window.on("focus", function(_) js.node.webkit.App.clearCache()); + + window = js.Browser.window; + + /* + window = new BrowserWindow({ + webPreferences: { + nodeIntegration: true, + contextIsolation: false + } + }); + window.loadFile("index.html"); + window.webContents.openDevTools({ mode: 'detach' }); + **/ + + window.addEventListener("resize", onResize); + window.addEventListener("focus", function(_) IpcRenderer.invoke("clearCache")); initMenu(); levels = []; mousePos = { x : 0, y : 0 }; sheetCursors = new Map(); - window.window.addEventListener("keydown", onKey); - window.window.addEventListener("keypress", onKeyPress); - window.window.addEventListener("keyup", onKeyUp); - window.window.addEventListener("mousemove", onMouseMove); - window.window.addEventListener("dragover", function(e : js.html.Event) { e.preventDefault(); return false; }); - window.window.addEventListener("drop", onDragDrop); + window.addEventListener("keydown", onKey); + window.addEventListener("keypress", onKeyPress); + window.addEventListener("keyup", onKeyUp); + window.addEventListener("mousemove", onMouseMove); + window.addEventListener("dragover", function(e : js.html.Event) { e.preventDefault(); return false; }); + window.addEventListener("drop", onDragDrop); J(".modal").keypress(function(e) e.stopPropagation()).keydown(function(e) e.stopPropagation()); J("#search input").keydown(function(e) { if( e.keyCode == 27 ) { @@ -133,7 +143,7 @@ class Main extends Model { function onResize(_) { if( level != null ) level.onResize(); - pages.onResize(); + pages?.onResize(); } function onMouseMove( e : js.html.MouseEvent ) { @@ -158,7 +168,7 @@ class Main extends Model { data : data, schema : schema, }; - js.node.webkit.Clipboard.getInstance().set(clipboard.text, "text"); + electron.Clipboard.writeText(clipboard.text); } function moveCursor( dx : Int, dy : Int, shift : Bool, ctrl : Bool ) { @@ -311,7 +321,7 @@ class Main extends Model { var out = {}; for( x in s.x1...s.x2+1 ) { var c = cursor.s.columns[x]; - var v = Reflect.field(obj, c.name); + var v = Reflect.field(obj, c?.name); if( v != null ) Reflect.setField(out, c.name, v); } @@ -323,7 +333,7 @@ class Main extends Model { onKey(cast { keyCode : 'C'.code, ctrlKey : true }); onKey(cast { keyCode : K.DELETE } ); case 'V'.code if( ctrlDown ): - if( cursor.s == null || clipboard == null || js.node.webkit.Clipboard.getInstance().get("text") != clipboard.text ) + if( cursor.s == null || clipboard == null || electron.Clipboard.readText() != clipboard.text ) return; var sheet = cursor.s; var posX = cursor.x < 0 ? 0 : cursor.x; @@ -706,19 +716,8 @@ class Main extends Model { J('.imagePreview').hide(); J('.previewContent > img').replaceWith(''); } - - function popupLine( sheet : Sheet, index : Int ) { - var n = new Menu(); - var nup = new MenuItem( { label : "Move Up" } ); - var ndown = new MenuItem( { label : "Move Down" } ); - var nins = new MenuItem( { label : "Insert" } ); - var ndel = new MenuItem( { label : "Delete" } ); - var nsep = new MenuItem( { label : "Separator", type : MenuItemType.checkbox } ); - var nref = new MenuItem( { label : "Show References" } ); - var ndup = new MenuItem( { label : "Duplicate" } ); - for( m in [nup, ndown, nins, ndel, nsep, nref, ndup] ) - n.append(m); - + + function getSepIndex(sheet: Sheet, index: Int) { var sepIndex = -1; for (i in 0...sheet.separators.length) { var s = sheet.separators[i]; @@ -727,78 +726,79 @@ class Main extends Model { break; } } - nsep.checked = sepIndex >= 0; - nins.click = function() { - newLine(sheet, index); - }; - nup.click = function() { + return sepIndex; + } + + function initializeLine( sheet : Sheet, index : Int ) { + IpcRenderer.removeAllListeners("line-move-up"); + IpcRenderer.on("line-move-up", function() { moveLine(sheet, index, -1); - }; - ndown.click = function() { + }); + + IpcRenderer.removeAllListeners("line-move-down"); + IpcRenderer.on("line-move-down", function() { moveLine(sheet, index, 1); - }; - ndel.click = function() { + }); + + IpcRenderer.removeAllListeners("line-insert"); + IpcRenderer.on("line-insert", function() { + newLine(sheet, index); + }); + + IpcRenderer.removeAllListeners("line-delete"); + IpcRenderer.on("line-delete", function() { sheet.deleteLine(index); refresh(); save(); - }; - nsep.click = function() { + }); + + final sepIndex = getSepIndex(sheet, index); + IpcRenderer.removeAllListeners("line-separator"); + IpcRenderer.on("line-separator", function() { if (sepIndex >= 0) { // remove sheet.separators.splice(sepIndex, 1); } else sheet.separators.push({index: index, id:Std.string(sepIndex), title:"unnamed separator"}); refresh(); save(); - }; - nref.click = function() { + }); + + IpcRenderer.removeAllListeners("line-references-show"); + IpcRenderer.on("line-references-show", function() { showReferences(sheet, index); - }; - ndup.click = function() { + }); + + IpcRenderer.removeAllListeners("line-duplicate"); + IpcRenderer.on("line-duplicate", function() { sheet.copyLine(index, sheet.lines[index]); refresh(); save(); + }); - }; - if( sheet.props.hide ) - nsep.enabled = false; - n.popup(mousePos.x, mousePos.y); + IpcRenderer.invoke("popupLine", !sheet.props.hide, sepIndex >= 0, {x : mousePos.x, y: mousePos.y}); } function popupColumn( sheet : Sheet, c : Column, ?isProperties ) { - var n = new Menu(); - var nedit = new MenuItem( { label : "Edit" } ); - var nins = new MenuItem( { label : "Add Column" } ); - var nleft = new MenuItem( { label : "Move Left" } ); - var nright = new MenuItem( { label : "Move Right" } ); - var ndel = new MenuItem( { label : "Delete" } ); - var ndisp = new MenuItem( { label : "Display Column", type : MenuItemType.checkbox } ); - var nicon = new MenuItem( { label : "Display Icon", type : MenuItemType.checkbox } ); - for( m in [nedit, nins, nleft, nright, ndel, ndisp, nicon] ) - n.append(m); - switch( c.type ) { case TId, TString, TEnum(_), TFlags(_): - var conv = new MenuItem( { label : "Convert" } ); - var cm = new Menu(); - for( k in [ - { n : "lowercase", f : function(s:String) return s.toLowerCase() }, - { n : "UPPERCASE", f : function(s:String) return s.toUpperCase() }, - { n : "UpperIdent", f : function(s:String) return s.substr(0,1).toUpperCase() + s.substr(1) }, - { n : "lowerIdent", f : function(s:String) return s.substr(0, 1).toLowerCase() + s.substr(1) }, - ] ) { - var m = new MenuItem( { label : k.n } ); - m.click = function() { - - switch( c.type ) { + var caseConverts = [ + "lowercase" => function(s:String) return s.toLowerCase(), + "UPPERCASE" => function(s:String) return s.toUpperCase(), + "UpperIdent" => function(s:String) return s.substr(0,1).toUpperCase() + s.substr(1), + "lowerIdent" => function(s:String) return s.substr(0, 1).toLowerCase() + s.substr(1), + ]; + IpcRenderer.removeAllListeners("column-convert-casing"); + IpcRenderer.on("column-convert-casing", function(event, caseLabel) { + switch( c.type ) { case TEnum(values), TFlags(values): for( i in 0...values.length ) - values[i] = k.f(values[i]); + values[i] = caseConverts[caseLabel](values[i]); default: var refMap = new Map(); for( obj in sheet.getLines() ) { var t = Reflect.field(obj, c.name); if( t != null && t != "" ) { - var t2 = k.f(t); + var t2 = caseConverts[caseLabel](t); if( t2 == null && !c.opt ) t2 = ""; if( t2 == null ) Reflect.deleteField(obj, c.name); @@ -812,62 +812,57 @@ class Main extends Model { if( c.type == TId ) base.updateRefs(sheet, refMap); sheet.sync(); // might have changed ID or DISP - } - + } - refresh(); - save(); - }; - cm.append(m); - } - conv.submenu = cm; - n.append(conv); + refresh(); + save(); + }); case TInt, TFloat: - var conv = new MenuItem( { label : "Convert" } ); - var cm = new Menu(); - for( k in [ - { n : "* 10", f : function(s:Float) return s * 10 }, - { n : "/ 10", f : function(s:Float) return s / 10 }, - { n : "+ 1", f : function(s:Float) return s + 1 }, - { n : "- 1", f : function(s:Float) return s - 1 }, - ] ) { - var m = new MenuItem( { label : k.n } ); - m.click = function() { - for( obj in sheet.getLines() ) { - var t = Reflect.field(obj, c.name); - if( t != null ) { - var t2 = k.f(t); - if( c.type == TInt ) t2 = Std.int(t2); - Reflect.setField(obj, c.name, t2); - } + var operations = [ + "* 10" => function(s:Float) return s * 10, + "/ 10" => function(s:Float) return s / 10, + "+ 1" => function(s:Float) return s + 1, + "- 1" => function(s:Float) return s - 1, + ]; + IpcRenderer.removeAllListeners("column-convert-number"); + IpcRenderer.on("column-convert-number", function(event, operationLabel) { + for( obj in sheet.getLines() ) { + var t = Reflect.field(obj, c.name); + if( t != null ) { + var t2 = operations[operationLabel](t); + if( c.type == TInt ) t2 = Std.int(t2); + Reflect.setField(obj, c.name, t2); } - refresh(); - save(); - }; - cm.append(m); - } - conv.submenu = cm; - n.append(conv); + } + refresh(); + save(); + }); default: } + + var ndispEnabled = false; + var niconEnabled = false; - ndisp.checked = sheet.props.displayColumn == c.name; - nicon.checked = sheet.props.displayIcon == c.name; - - ndisp.enabled = false; - nicon.enabled = false; switch( c.type ) { case TString, TRef(_): - ndisp.enabled = true; + ndispEnabled = true; case TTilePos: - nicon.enabled = true; + niconEnabled = true; default: } - nedit.click = function() { + IpcRenderer.removeAllListeners("column-edit"); + IpcRenderer.on("column-edit", function() { newColumn(sheet.name, c); - }; - nleft.click = function() { + }); + + IpcRenderer.removeAllListeners("column-add"); + IpcRenderer.on("column-add", function() { + newColumn(sheet.name, Lambda.indexOf(sheet.columns,c) + 1); + }); + + IpcRenderer.removeAllListeners("column-move-left"); + IpcRenderer.on("column-move-left", function() { var index = Lambda.indexOf(sheet.columns, c); if( index > 0 ) { sheet.columns.remove(c); @@ -875,8 +870,10 @@ class Main extends Model { refresh(); save(); } - }; - nright.click = function() { + }); + + IpcRenderer.removeAllListeners("column-move-right"); + IpcRenderer.on("column-move-right", function() { var index = Lambda.indexOf(sheet.columns, c); if( index < sheet.columns.length - 1 ) { sheet.columns.remove(c); @@ -884,12 +881,16 @@ class Main extends Model { refresh(); save(); } - } - ndel.click = function() { + }); + + IpcRenderer.removeAllListeners("column-delete"); + IpcRenderer.on("column-delete", function() { if( !isProperties || js.Browser.window.confirm("Do you really want to delete this property for all objects?") ) deleteColumn(sheet, c.name); - }; - ndisp.click = function() { + }); + + IpcRenderer.removeAllListeners("column-display"); + IpcRenderer.on("column-display", function() { if( sheet.props.displayColumn == c.name ) { sheet.props.displayColumn = null; } else { @@ -898,8 +899,10 @@ class Main extends Model { sheet.sync(); refresh(); save(); - }; - nicon.click = function() { + }); + + IpcRenderer.removeAllListeners("column-display-icon"); + IpcRenderer.on("column-display-icon", function() { if( sheet.props.displayIcon == c.name ) { sheet.props.displayIcon = null; } else { @@ -908,44 +911,20 @@ class Main extends Model { sheet.sync(); refresh(); save(); - }; - nins.click = function() { - newColumn(sheet.name, Lambda.indexOf(sheet.columns,c) + 1); - }; - n.popup(mousePos.x, mousePos.y); + }); + + IpcRenderer.invoke("popupColumn", c.type.getName(), sheet.props.displayIcon == c.name, ndispEnabled, niconEnabled, {x : mousePos.x, y: mousePos.y}); } function popupSheet( s : Sheet, li : JQuery ) { - var n = new Menu(); - var nins = new MenuItem( { label : "Add Sheet" } ); - var nleft = new MenuItem( { label : "Move Left" } ); - var nright = new MenuItem( { label : "Move Right" } ); - var nren = new MenuItem( { label : "Rename" } ); - var ndel = new MenuItem( { label : "Delete" } ); - var nindex = new MenuItem( { label : "Add Index", type : MenuItemType.checkbox } ); - var ngroup = new MenuItem( { label : "Add Group", type : MenuItemType.checkbox } ); - - var ncsv = new MenuItem( { label : "CSV..." } ); - var csv = new Menu(); - var importSheetCSV = new MenuItem( { label : "Import Sheet Data...", type : MenuItemType.checkbox } ); - var exportSheetCSV = new MenuItem( { label : "Export Sheet Data...", type : MenuItemType.checkbox } ); - csv.append(importSheetCSV); - csv.append(exportSheetCSV); - ncsv.submenu = csv; - - var njson = new MenuItem( { label : "JSON..." } ); - var json = new Menu(); - var importSheetJSON = new MenuItem( { label : "Import Sheet Data...", type : MenuItemType.checkbox } ); - var exportSheetJSON = new MenuItem( { label : "Export Sheet Data...", type : MenuItemType.checkbox } ); - json.append(importSheetJSON); - json.append(exportSheetJSON); - njson.submenu = json; - - for( m in [nins, nleft, nright, nren, ndel, nindex, ngroup, njson, ncsv] ) - n.append(m); - - nleft.click = function() { + IpcRenderer.removeAllListeners("sheet-add"); + IpcRenderer.on("sheet-add", function() { + newSheet(); + }); + + IpcRenderer.removeAllListeners("sheet-move-left"); + IpcRenderer.on("sheet-move-left", function() { var prev = -1; for( i in 0...base.sheets.length ) { var s2 = base.sheets[i]; @@ -959,8 +938,10 @@ class Main extends Model { prefs.curSheet = prev; initContent(); save(); - }; - nright.click = function() { + }); + + IpcRenderer.removeAllListeners("sheet-move-right"); + IpcRenderer.on("sheet-move-right", function() { var sheets = [for( s in base.sheets ) if( !s.props.hide ) s]; var index = sheets.indexOf(s); var next = sheets[index+1]; @@ -986,17 +967,22 @@ class Main extends Model { prefs.curSheet = base.sheets.indexOf(s); initContent(); save(); - } - ndel.click = function() { + }); + + IpcRenderer.removeAllListeners("sheet-rename"); + IpcRenderer.on("sheet-rename", function() { + li.dblclick(); + }); + + IpcRenderer.removeAllListeners("sheet-delete"); + IpcRenderer.on("sheet-delete", function() { base.deleteSheet(s); initContent(); save(); - }; - nins.click = function() { - newSheet(); - }; - nindex.checked = s.props.hasIndex; - nindex.click = function() { + }); + + IpcRenderer.removeAllListeners("sheet-add-index"); + IpcRenderer.on("sheet-add-index", function() { if( s.props.hasIndex ) { for( o in s.getLines() ) Reflect.deleteField(o, "index"); @@ -1010,9 +996,10 @@ class Main extends Model { s.props.hasIndex = true; } save(); - }; - ngroup.checked = s.props.hasGroup; - ngroup.click = function() { + }); + + IpcRenderer.removeAllListeners("sheet-add-group"); + IpcRenderer.on("sheet-add-group", function() { if( s.props.hasGroup ) { for( o in s.getLines() ) Reflect.deleteField(o, "group"); @@ -1026,22 +1013,34 @@ class Main extends Model { s.props.hasGroup = true; } save(); - }; - nren.click = function() { - li.dblclick(); - }; + }); - importSheetJSON.click = function() { - var i = J("").attr("type", "file").css("display","none").change(function(e) { + IpcRenderer.removeAllListeners("sheet-import-csv"); + IpcRenderer.on("sheet-import-csv", function(event, file) { + this.importSheetCSV(s, file); + initContent(); + }); + + IpcRenderer.removeAllListeners("sheet-export-csv"); + IpcRenderer.on("sheet-export-csv", function() { + var i = J("").attr("type", "file").attr("nwsaveas",'${s.name}.csv').css("display","none").change(function(e) { var j = JTHIS; - this.importSheetJSON(s, j.val()); + this.exportSheetCSV(s, j.val()); initContent(); j.remove(); }); i.appendTo(J("body")); i.click(); - }; - exportSheetJSON.click = function() { + }); + + IpcRenderer.removeAllListeners("sheet-import-json"); + IpcRenderer.on("sheet-import-json", function(event, file) { + this.importSheetJSON(s, file); + initContent(); + }); + + IpcRenderer.removeAllListeners("sheet-export-json"); + IpcRenderer.on("sheet-export-json", function() { var i = J("").attr("type", "file").attr("nwsaveas",'${s.name}.json').css("display","none").change(function(e) { var j = JTHIS; this.exportSheetJSON(s, j.val()); @@ -1050,50 +1049,26 @@ class Main extends Model { }); i.appendTo(J("body")); i.click(); - }; - - importSheetCSV.click = function() { - var i = J("").attr("type", "file").css("display","none").change(function(e) { - var j = JTHIS; - this.importSheetCSV(s, j.val()); - initContent(); - j.remove(); - }); - i.appendTo(J("body")); - i.click(); - }; - exportSheetCSV.click = function() { - var i = J("").attr("type", "file").attr("nwsaveas",'${s.name}.csv').css("display","none").change(function(e) { - var j = JTHIS; - this.exportSheetCSV(s, j.val()); - initContent(); - j.remove(); - }); - i.appendTo(J("body")); - i.click(); - }; + }); - if( s.isLevel() || (s.hasColumn("width", [TInt]) && s.hasColumn("height", [TInt]) && s.hasColumn("props",[TDynamic])) ) { - var nlevel = new MenuItem( { label : "Level", type : MenuItemType.checkbox } ); - nlevel.checked = s.isLevel(); - n.append(nlevel); - nlevel.click = function() { - if( s.isLevel() ) - Reflect.deleteField(s.props, "level"); - else - s.props.level = { - tileSets : {}, - } - save(); - refresh(); - }; - } + IpcRenderer.removeAllListeners("sheet-level"); + IpcRenderer.on("sheet-level", function() { + if( s.isLevel() ) + Reflect.deleteField(s.props, "level"); + else + s.props.level = { + tileSets : {}, + } + save(); + refresh(); + }); - n.popup(mousePos.x, mousePos.y); + final showLevelCheckbox = s.isLevel() || (s.hasColumn("width", [TInt]) && s.hasColumn("height", [TInt]) && s.hasColumn("props",[TDynamic])); + IpcRenderer.invoke("popupSheet", showLevelCheckbox, s.props.hasIndex, s.props.hasGroup, s.isLevel(), {x : mousePos.x, y: mousePos.y}); } public function editCell( c : Column, v : JQuery, sheet : Sheet, index : Int ) { - if( macEditMenu != null ) window.menu.append(macEditMenu); + // TODO: if( macEditMenu != null ) (Menu.getApplicationMenu() : Menu).items.push(cast macEditMenu); var obj = sheet.lines[index]; var val : Dynamic = Reflect.field(obj, c.name); var old = val; @@ -1106,7 +1081,7 @@ class Main extends Model { var html = getValue(); if( v.hasClass("edit") ) return; function editDone() { - if( macEditMenu != null ) window.menu.remove(macEditMenu); + // TODO: if( macEditMenu != null ) (Menu.getApplicationMenu() : Menu).items.remove(cast macEditMenu); v.html(html); v.removeClass("edit"); setErrorMessage(); @@ -1485,6 +1460,7 @@ class Main extends Model { fs.change(function(_) { fs.off("change"); var path : String = fs.val(); + trace(path); fs.val(""); if( path == "" ) { if( cancel != null ) cancel(); @@ -1507,6 +1483,7 @@ class Main extends Model { var available = []; var index = 0; for( c in sheet.columns ) { + trace(c); if( c.opt && !Reflect.hasField(props,c.name) ) { available.push(c); continue; @@ -1600,6 +1577,7 @@ class Main extends Model { e.stopPropagation(); }); + var lines = [for( i in 0...sheet.lines.length ) { var l = J(""); l.data("index", i); @@ -1607,7 +1585,7 @@ class Main extends Model { l.mousedown(function(e) { if( e.which == 3 ) { head.click(); - haxe.Timer.delay(popupLine.bind(sheet,i),1); + haxe.Timer.delay(initializeLine.bind(sheet, i), 1); e.preventDefault(); return; } @@ -2040,7 +2018,7 @@ class Main extends Model { } @:keep function openFile( file : String ) { - js.node.webkit.Shell.openItem(file); + electron.main.Dialog.showOpenDialog({ properties: ['openFile'] }); } function setCursor( ?s, ?x=0, ?y=0, ?sel, update = true ) { @@ -2281,6 +2259,7 @@ class Main extends Model { if( cursor.s != null ) newLine(cursor.s); } + @:keep function createSheet( name : String, level : Bool ) { name = StringTools.trim(name); if( !base.r_ident.match(name) ) { @@ -2544,34 +2523,23 @@ class Main extends Model { refresh(); } - function initMenu() { - var modifier = "ctrl"; - var menu = Menu.createWindowMenu(); - if(Sys.systemName().indexOf("Mac") != -1) { - modifier = "cmd"; +function initMenu() { + IpcRenderer.on('open-recent', function(event, file) { + prefs.curFile = file; + load(); + }); + + for( file in prefs.recent ) { + if( file == null ) continue; + IpcRenderer.invoke("add-recents-file", file); } - var mfile = new MenuItem({ label : "File" }); - var mfiles = new Menu(); - var mnew = new MenuItem( { label : "New", key : "N", modifiers : modifier } ); - var mopen = new MenuItem( { label : "Open...", key : "O", modifiers : modifier } ); - var mrecent = new MenuItem( { label : "Recent Files" } ); - var msave = new MenuItem( { label : "Save As...", key : "S", modifiers : "shift+" + modifier } ); - var mclean = new MenuItem( { label : "Clean Images" } ); - var mexport = new MenuItem( { label : "Export Localized texts" } ); - mcompress = new MenuItem( { label : "Enable Compression", type : MenuItemType.checkbox } ); - mcompress.click = function() { - base.compress = mcompress.checked; - save(); - }; - var mabout = new MenuItem( { label : "About" } ); - var mexit = new MenuItem( { label : "Exit", key : "Q", modifiers : modifier } ); - var mdebug = new MenuItem( { label : "Dev" } ); - mnew.click = function() { + + IpcRenderer.on('click-new', function() { prefs.curFile = null; load(true); - }; - mdebug.click = function() window.showDevTools(); - mopen.click = function() { + }); + + IpcRenderer.on('click-open', function() { var i = J("").attr("type", "file").css("display","none").change(function(e) { var j = JTHIS; prefs.curFile = j.val(); @@ -2580,8 +2548,9 @@ class Main extends Model { }); i.appendTo(J("body")); i.click(); - }; - msave.click = function() { + }); + + IpcRenderer.on('click-save', function() { var i = J("").attr("type", "file").attr("nwsaveas","new.cdb").css("display","none").change(function(e) { var j = JTHIS; prefs.curFile = j.val(); @@ -2590,8 +2559,9 @@ class Main extends Model { }); i.appendTo(J("body")); i.click(); - }; - mclean.click = function() { + }); + + IpcRenderer.on('click-clean', function() { var lcount = @:privateAccess base.cleanLayers(); var icount = 0; if( imageBank != null ) { @@ -2602,36 +2572,15 @@ class Main extends Model { if( count2 == 0 ) imageBank = null; } error([ - lcount + " tileset data removed", - icount + " unused images removed" + lcount + " tileset data removed", + icount + " unused images removed" ].join("\n")); refresh(); if( lcount > 0 ) save(); if( icount > 0 ) saveImages(); - }; - mexit.click = function() Sys.exit(0); - mabout.click = function() { - J("#about").show(); - }; - - var mrecents = new Menu(); - for( file in prefs.recent ) { - if( file == null ) continue; - var m = new MenuItem( { label : file } ); - m.click = function() { - prefs.curFile = file; - load(); - }; - mrecents.append(m); - } - mrecent.submenu = mrecents; - - for( m in [mnew, mopen, mrecent, msave, mclean, mcompress, mexport, mabout, mexit] ) - mfiles.append(m); - mfile.submenu = mfiles; - - mexport.click = function() { + }); + IpcRenderer.on('click-export', function() { var lang = new cdb.Lang(@:privateAccess base.data); var xml = lang.buildXML(); var i = J("").attr("type", "file").attr("nwsaveas","export.xml").css("display","none").change(function(e) { @@ -2642,69 +2591,50 @@ class Main extends Model { }); i.appendTo(J("body")); i.click(); + }); - }; + IpcRenderer.on('click-compression', function(event, checked) { + base.compress = checked; + save(); + }); + + IpcRenderer.on('click-about', function() { + J("#about").show(); + }); - // create an edit menu - modifier = "ctrl+shift"; - if(Sys.systemName().indexOf("Mac") != -1) - modifier = "cmd+shift"; - - var medit = new MenuItem({ label : "Database" }); - var medits = new Menu(); - var mnewsheet = new MenuItem( { label : "New Sheet", key : "N", modifiers : modifier } ); - var mnewcolumn = new MenuItem( { label : "Add Column", key : "C", modifiers : modifier } ); - var mnewline = new MenuItem( { label : "Add Line", key : "L", modifiers : modifier } ); - var medittypes = new MenuItem( { label : "Edit Types", key : "E", modifiers : modifier } ); - mnewcolumn.click = ()->newColumn(); - mnewsheet.click = ()->newSheet(); - medittypes.click = ()->editTypes(); - mnewline.click = ()->insertLine(); - - for(m in [mnewsheet, mnewcolumn, mnewline, medittypes]) - medits.append(m); - medit.submenu = medits; + IpcRenderer.on('click-new-sheet', function() newSheet()); + IpcRenderer.on('click-add-column', function() newColumn()); + IpcRenderer.on('click-add-line', function() insertLine()); + IpcRenderer.on('click-edit-types', function() editTypes()); - if(Sys.systemName().indexOf("Mac") != -1) { - menu.createMacBuiltin("CastleDB", {hideEdit: false, hideWindow: true}); // needed so copy&paste inside INPUTs work - menu.removeAt(0); // remove default menu - macEditMenu = menu.items[0]; // save default edit menu - menu.removeAt(0); // remove default edit menu - menu.insert(mfile, 0); // put it before the default Edit menu - mfiles.insert(mdebug, 7); // needs to go under File or it won't show - mfiles.insert(medit, 7); // needs to go under File or it won't show - } - else { - menu.append(mfile); - menu.append(medit); - menu.append(mdebug); - } + if( prefs.windowPos.x > 0 && prefs.windowPos.y > 0 ) IpcRenderer.invoke("setWindowPosition", prefs.windowPos.x, prefs.windowPos.y); + if( prefs.windowPos.w > 50 && prefs.windowPos.h > 50 ) IpcRenderer.invoke("setWindowSize", prefs.windowPos.w, prefs.windowPos.h); + if( prefs.windowPos.max ) IpcRenderer.invoke("maximize"); - window.menu = menu; - if( prefs.windowPos.x > 0 && prefs.windowPos.y > 0 ) window.moveTo(prefs.windowPos.x, prefs.windowPos.y); - if( prefs.windowPos.w > 50 && prefs.windowPos.h > 50 ) window.resizeTo(prefs.windowPos.w, prefs.windowPos.h); - window.show(); - if( prefs.windowPos.max ) window.maximize(); - window.on('close', function() { + // TODO: electron message this + window.addEventListener('beforeunload', function() { if( prefs.curFile == null && base.sheets.length > 0 ) { if( !js.Browser.window.confirm("Do you want to exit without saving your changes?") ) return; } if( !prefs.windowPos.max ) + IpcRenderer.send('getWindowGeometry'); + IpcRenderer.on("windowGeometry", (event, size : {width : Int, height : Int, x : Int, y : Int}) -> { prefs.windowPos = { - x : window.x, - y : window.y, - w : window.width, - h : window.height, + x : size.x, + y : size.y, + w : size.width, + h : size.height, max : false, }; + }); savePrefs(); - window.close(true); + window.close(); }); - window.on('maximize', function() { + IpcRenderer.on('maximize', function() { prefs.windowPos.max = true; }); - window.on('unmaximize', function() { + IpcRenderer.on('unmaximize', function() { prefs.windowPos.max = false; }); } @@ -2731,7 +2661,7 @@ class Main extends Model { lastSave = getFileTime(); super.load(noError); - window.title = "CastleDB Editor v1.6.2 - " + prefs.curFile; + js.Browser.document.title = "CastleDB Editor v1.6.2 - " + prefs.curFile; J('.imagePreview').hide(); initContent(); @@ -2739,7 +2669,7 @@ class Main extends Model { if( prefs.curFile != null ) prefs.recent.unshift(prefs.curFile); if( prefs.recent.length > 8 ) prefs.recent.pop(); - mcompress.checked = base.compress; + IpcRenderer.invoke("set-mcompress", base.compress); } override function save( history = true ) { @@ -2750,6 +2680,7 @@ class Main extends Model { public static var inst : Main; static function main() { untyped if( js.node.Fs.accessSync == null ) js.node.Fs.accessSync = function(path) if( !(js.node.Fs : Dynamic).existsSync(path) ) throw path + " does not exists"; + inst = new Main(); Reflect.setField(js.Browser.window, "_", inst); } diff --git a/src/Model.hx b/src/app/Model.hx similarity index 96% rename from src/Model.hx rename to src/app/Model.hx index 796e84b3..4bc70502 100644 --- a/src/Model.hx +++ b/src/app/Model.hx @@ -207,10 +207,10 @@ class Model { @:access(cdb.Sheet) @:access(cdb.Database) - function importSheetJSON(_s:cdb.Sheet, _filePath:String) { + function importSheetJSON(_s:cdb.Sheet, _contents:String) { // TODO: do import validation!!! - var shs:Array = cast haxe.Json.parse(sys.io.File.getContent(_filePath)); + var shs:Array = cast haxe.Json.parse(_contents); for (s in shs) { // rename the imported sheet to match the current selected sheet. s.name = s.name.replace(s.name.split('@')[0], _s.name); @@ -263,8 +263,9 @@ class Model { } @:access(cdb.Sheet) - function importSheetCSV(_s:cdb.Sheet, _filePath:String) { - var d = Csv.decode(sys.io.File.getContent(_filePath)); + function importSheetCSV(_s:cdb.Sheet, _contents:String) { + var d = Csv.decode(_contents); + trace(d); var header = d.shift(); // get rid off first line var colMapSheet = new Map(); @@ -297,4 +298,4 @@ class Model { this.save(); } -} \ No newline at end of file +} diff --git a/src/Resolver.hx b/src/app/Resolver.hx similarity index 100% rename from src/Resolver.hx rename to src/app/Resolver.hx diff --git a/src/lvl/Image.hx b/src/app/lvl/Image.hx similarity index 100% rename from src/lvl/Image.hx rename to src/app/lvl/Image.hx diff --git a/src/lvl/Image3D.hx b/src/app/lvl/Image3D.hx similarity index 100% rename from src/lvl/Image3D.hx rename to src/app/lvl/Image3D.hx diff --git a/src/lvl/LayerData.hx b/src/app/lvl/LayerData.hx similarity index 100% rename from src/lvl/LayerData.hx rename to src/app/lvl/LayerData.hx diff --git a/src/lvl/LayerGfx.hx b/src/app/lvl/LayerGfx.hx similarity index 100% rename from src/lvl/LayerGfx.hx rename to src/app/lvl/LayerGfx.hx diff --git a/src/lvl/Palette.hx b/src/app/lvl/Palette.hx similarity index 100% rename from src/lvl/Palette.hx rename to src/app/lvl/Palette.hx diff --git a/src/test/Test.hx b/src/app/test/Test.hx similarity index 100% rename from src/test/Test.hx rename to src/app/test/Test.hx diff --git a/src/test/dat/Data.hx b/src/app/test/dat/Data.hx similarity index 100% rename from src/test/dat/Data.hx rename to src/app/test/dat/Data.hx diff --git a/src/test/test.cdb b/src/app/test/test.cdb similarity index 100% rename from src/test/test.cdb rename to src/app/test/test.cdb diff --git a/src/test/test.hxml b/src/app/test/test.hxml similarity index 100% rename from src/test/test.hxml rename to src/app/test/test.hxml diff --git a/src/test/test.hxproj b/src/app/test/test.hxproj similarity index 100% rename from src/test/test.hxproj rename to src/app/test/test.hxproj diff --git a/src/vdom/Answer.hx b/src/app/vdom/Answer.hx similarity index 100% rename from src/vdom/Answer.hx rename to src/app/vdom/Answer.hx diff --git a/src/vdom/Client.hx b/src/app/vdom/Client.hx similarity index 100% rename from src/vdom/Client.hx rename to src/app/vdom/Client.hx diff --git a/src/vdom/Dom.hx b/src/app/vdom/Dom.hx similarity index 100% rename from src/vdom/Dom.hx rename to src/app/vdom/Dom.hx diff --git a/src/vdom/Event.hx b/src/app/vdom/Event.hx similarity index 100% rename from src/vdom/Event.hx rename to src/app/vdom/Event.hx diff --git a/src/vdom/JQuery.hx b/src/app/vdom/JQuery.hx similarity index 100% rename from src/vdom/JQuery.hx rename to src/app/vdom/JQuery.hx diff --git a/src/vdom/Message.hx b/src/app/vdom/Message.hx similarity index 100% rename from src/vdom/Message.hx rename to src/app/vdom/Message.hx diff --git a/src/vdom/Query.hx b/src/app/vdom/Query.hx similarity index 100% rename from src/vdom/Query.hx rename to src/app/vdom/Query.hx diff --git a/src/vdom/README.md b/src/app/vdom/README.md similarity index 100% rename from src/vdom/README.md rename to src/app/vdom/README.md diff --git a/src/vdom/Server.hx b/src/app/vdom/Server.hx similarity index 100% rename from src/vdom/Server.hx rename to src/app/vdom/Server.hx diff --git a/src/js/node/webkit/App.hx b/src/js/node/webkit/App.hx deleted file mode 100644 index f6cf39fe..00000000 --- a/src/js/node/webkit/App.hx +++ /dev/null @@ -1,21 +0,0 @@ -package js.node.webkit; - -@:jsRequire("nw.gui", "App") -extern class App { - - static var argv : Array; - static var fullArgv : Array; - static var dataPath : String; - static var manifest : Dynamic; - - static function quit() : Void; - static function clearCache() : Void; - static function closeAllWindows() : Void; - static function crashBrowser() : Void; - static function crashRenderer() : Void; - static function getProxyForURL( url : String ) : String; - static function setProxyConfig( config : String ) : Void; - - static function on( event : String, callb : Dynamic -> Void ) : Void; - -} \ No newline at end of file diff --git a/src/js/node/webkit/Clipboard.hx b/src/js/node/webkit/Clipboard.hx deleted file mode 100644 index 8d3b8ee4..00000000 --- a/src/js/node/webkit/Clipboard.hx +++ /dev/null @@ -1,14 +0,0 @@ -package js.node.webkit; - -@:jsRequire("nw.gui", "Clipboard") -extern class Clipboard { - - public static inline function getInstance() : Clipboard { - return untyped Clipboard.get(); - } - - public function get( ?type : String ) : Dynamic; - public function set( data : Dynamic, ?type : String ) : Void; - public function clear() : Void; - -} \ No newline at end of file diff --git a/src/js/node/webkit/Menu.hx b/src/js/node/webkit/Menu.hx deleted file mode 100644 index 33771424..00000000 --- a/src/js/node/webkit/Menu.hx +++ /dev/null @@ -1,20 +0,0 @@ -package js.node.webkit; - -@:jsRequire("nw.gui", "Menu") -extern class Menu { - - var items(default, null) : Array; - - function new( ?t : { type : String } ) : Void; - function append( it : MenuItem ) : Void; - function insert( it : MenuItem, pos : Int ) : Void; - function remove( it : MenuItem ) : Void; - function removeAt( pos : Int ) : Void; - function popup( x : Int, y : Int ) : Void; - function createMacBuiltin( appName : String, options : Dynamic ) : Void; - - static inline function createWindowMenu() : Menu { - return new Menu( { type : "menubar" } ); - } - -} \ No newline at end of file diff --git a/src/js/node/webkit/MenuItem.hx b/src/js/node/webkit/MenuItem.hx deleted file mode 100644 index b8395690..00000000 --- a/src/js/node/webkit/MenuItem.hx +++ /dev/null @@ -1,19 +0,0 @@ -package js.node.webkit; - -@:jsRequire("nw.gui", "MenuItem") -extern class MenuItem { - - var type(default, null) : MenuItemType; - var label : String; - var icon : String; - var tooltip : String; - var checked : Bool; - var enabled : Bool; - var submenu : Menu; - - function new( ?t : { ?label : String, ?icon : String, ?type : MenuItemType, ?key : String, ?modifiers : String } ) : Void; - - dynamic function click() : Void; - function on( event : String, callb : Void -> Void ) : Void; - -} \ No newline at end of file diff --git a/src/js/node/webkit/MenuItemType.hx b/src/js/node/webkit/MenuItemType.hx deleted file mode 100644 index fb09ec27..00000000 --- a/src/js/node/webkit/MenuItemType.hx +++ /dev/null @@ -1,8 +0,0 @@ -package js.node.webkit; - -@:enum -abstract MenuItemType(String) { - var separator = "separator"; - var checkbox = "checkbox"; - var normal = "normal"; -} diff --git a/src/js/node/webkit/Shell.hx b/src/js/node/webkit/Shell.hx deleted file mode 100644 index d798607e..00000000 --- a/src/js/node/webkit/Shell.hx +++ /dev/null @@ -1,10 +0,0 @@ -package js.node.webkit; - -@:jsRequire("nw.gui", "Shell") -extern class Shell { - - static function openExternal( url : String ) : Void; - static function openItem( filePath : String ) : Void; - static function showItemInFolder( filePath : String ) : Void; - -} diff --git a/src/js/node/webkit/Window.hx b/src/js/node/webkit/Window.hx deleted file mode 100644 index f83c007e..00000000 --- a/src/js/node/webkit/Window.hx +++ /dev/null @@ -1,43 +0,0 @@ -package js.node.webkit; - -@:jsRequire("nw.gui", "Window") -extern class Window { - public var window : #if (haxe_ver >= 3.2) js.html.Window #else js.html.DOMWindow #end; - public var x : Int; - public var y : Int; - public var width : Int; - public var height : Int; - public var title : String; - public var isFullScreen : Bool; - public var isKioskMode : Bool; - public var zoomLevel : Int; - public var menu : Menu; - public function moveTo( x : Int, y : Int ) : Void; - public function moveBy( x : Int, y : Int ) : Void; - public function resizeTo( w : Int, h : Int ) : Void; - public function resizeBy( w : Int, h : Int ) : Void; - public function focus() : Void; - public function blur() : Void; - public function show() : Void; - public function hide() : Void; - public function close( ?force : Bool ) : Void; - public function reload() : Void; - public function reloadIgnoringCache() : Void; - public function maximize() : Void; - public function unmaximize() : Void; - public function minimize() : Void; - public function restore() : Void; - public function enterFullscreen() : Void; - public function leavFullscreen() : Void; - public function showDevTools( ?id : String, ?headless : Bool ) : Void; - public function closeDevTools() : Void; - - @:overload(function( event : String, callb : Dynamic -> Dynamic ) : Void {}) - @:overload(function( event : String, callb : Void -> Dynamic ) : Void {}) - @:overload(function( event : String, callb : Dynamic -> Void ) : Void {}) - public function on( event : String, callb : Void -> Void ) : Void; - - public static function get() : Window; - public static function open( url : String, ?options : { } ) : Window; - -} diff --git a/src/runtime/Main.hx b/src/runtime/Main.hx new file mode 100644 index 00000000..89b17626 --- /dev/null +++ b/src/runtime/Main.hx @@ -0,0 +1,369 @@ +package; + +import electron.main.Dialog; +import cdb.Data.ColumnType; + +import electron.main.App; +import electron.main.BrowserWindow; +import electron.main.IpcMain; + +import electron.main.Menu; +import electron.main.MenuItem; + +class Main { + static function main() { + electron.main.App.whenReady().then(_ -> { + final win = new BrowserWindow({ + webPreferences: { + nodeIntegration: true, + contextIsolation: false + } + }); + + IpcMain.handle("getWindowGeometry", (event) -> { + final size = win.getSize(); + final pos = win.getPosition(); + event.reply("windowGeometry", {width : size[0], height : size[1], x : pos[0], y : pos[1]}); + }); + + IpcMain.handle("setWindowPosition", (event, x, y) -> { + (BrowserWindow.fromWebContents(event.sender) : BrowserWindow).setPosition(x, y); + }); + + IpcMain.handle("setWindowSize", (event, width, height) -> { + (BrowserWindow.fromWebContents(event.sender) : BrowserWindow).setSize(width, height); + }); + + IpcMain.handle("openDevTools", (event, _) -> { + event.sender.openDevTools(); + }); + + IpcMain.handle("clearCache", () -> { + (BrowserWindow.getFocusedWindow() : BrowserWindow).webContents.session.clearCache(); + }); + + IpcMain.handle("popupLine", (event, enableSeparator, checkSeparator, options) -> { + popupLine(win, enableSeparator, checkSeparator).popup(options); + }); + + IpcMain.handle("popupColumn", (event, columnType, checked, ndispEnabled, niconEnabled, options) -> { + popupColumn(win, columnType, checked, ndispEnabled, niconEnabled).popup(options); + }); + + IpcMain.handle("popupSheet", (event, showLevelCheckbox, showLevelCheckbox, nindexChecked, ngroupChecked, nlevelChecked, options) -> { + popupSheet(win, showLevelCheckbox, nindexChecked, ngroupChecked, nlevelChecked).popup(options); + }); + + IpcMain.handle("maximize", (event) -> { + win.maximize(); + }); + + win.on("maximize", () -> { + win.webContents.send("maximize"); + }); + + win.on("unmaximize", () -> { + win.webContents.send("unmaximize"); + }); + + win.on("openFile", (event, channel) -> { + Dialog.showOpenDialog({ properties: ['openFile'] }).then((response) -> { + window.webContents.send(channel, sys.io.File.getContent(untyped response.filePaths[0])); + }); + }); + + initMenu(win); + + win.loadFile("index.html"); + }); + } + + static function initMenu(window: BrowserWindow) { + var modifier = "Ctrl"; + var menu = new Menu(); + if(Sys.systemName().indexOf("Mac") != -1) { + modifier = "Cmd"; + } + + var mrecents = new Menu(); + IpcMain.removeHandler("add-recents-file"); + IpcMain.handle("add-recents-file", function(event, file) { + var m = new MenuItem( { label : file } ); + m.click = function() { + window.webContents.send("open-recent", file); + }; + mrecents.append(m); + }); + + var mfiles = new Menu(); + var mfile = new MenuItem({ label : "File", submenu: mfiles }); + + var mnew = new MenuItem( { label : "New", accelerator : '$modifier+N' } ); + mnew.click = () -> { + window.webContents.send("click-new"); + }; + + var mopen = new MenuItem( { label : "Open...", accelerator : '$modifier+O' } ); + mopen.click = () -> { + window.webContents.send("click-open"); + }; + + var mrecent = new MenuItem( { label : "Recent Files", submenu : mrecents } ); + + var msave = new MenuItem( { label : "Save As...", accelerator : '$modifier+S' } ); + msave.click = () -> { + window.webContents.send("click-save"); + }; + + var mclean = new MenuItem( { label : "Clean Images" } ); + mclean.click = () -> { + window.webContents.send("click-clean"); + }; + + var mexport = new MenuItem( { label : "Export Localized texts" } ); + mexport.click = () -> { + window.webContents.send("click-export"); + }; + + var mcompress = new MenuItem( { label : "Enable Compression", role: "checkbox" } ); + mcompress.click = function() { + window.webContents.send("click-compression", mcompress.checked); + }; + IpcMain.removeHandler("set-mcompress"); + IpcMain.handle("set-mcompress", (event, value) -> { + mcompress.checked = value; + }); + + var mabout = new MenuItem( { label : "About" } ); + mabout.click = function() { + window.webContents.send("click-about"); + }; + + var mexit = new MenuItem( { label : "Exit", accelerator : '$modifier+Q' } ); + mexit.click = function() electron.main.App.quit(); + + var mdebug = new MenuItem( { label : "Dev" } ); + mdebug.click = function(event) { + window.webContents.openDevTools(); + } + + for( m in [mnew, mopen, mrecent, msave, mclean, mcompress, mexport, mabout, mexit] ) + mfiles.append(m); + + // create an edit menu + modifier = "Ctrl+Shift"; + if(Sys.systemName().indexOf("Mac") != -1) + modifier = "Cmd+Shift"; + + var medits = new Menu(); + var medit = new MenuItem({ label : "Database", submenu : medits }); + + var mnewsheet = new MenuItem( { label : "New Sheet", accelerator : '$modifier+N' } ); + mnewsheet.click = () -> { + window.webContents.send("click-new-sheet"); + }; + + var mnewcolumn = new MenuItem( { label : "Add Column", accelerator : '$modifier+C' } ); + mnewcolumn.click = () -> { + window.webContents.send("click-add-column"); + }; + + var mnewline = new MenuItem( { label : "Add Line", accelerator : '$modifier+L' } ); + mnewline.click = () -> { + window.webContents.send("click-add-line"); + }; + + var medittypes = new MenuItem( { label : "Edit Types", accelerator : '$modifier+E' } ); + medittypes.click = () -> { + window.webContents.send("click-edit-types"); + }; + + for(m in [mnewsheet, mnewcolumn, mnewline, medittypes]) + medits.append(m); + + // TODO: Don't let logo remove this without figuring out what it does + //if(Sys.systemName().indexOf("Mac") != -1) { + // menu.removeAt(0); // remove default menu + // macEditMenu = menu.items[0]; // save default edit menu + // menu.removeAt(0); // remove default edit menu + // menu.insert(mfile, 0); // put it before the default Edit menu + // mfiles.insert(mdebug, 7); // needs to go under File or it won't show + // mfiles.insert(medit, 7); // needs to go under File or it won't show + //} + //else { + menu.append(mfile); + menu.append(medit); + menu.append(mdebug); + //} + + Menu.setApplicationMenu(menu); + } + + static function popupLine(window: BrowserWindow, enableSeparator: Bool, checkSeparator: Bool) { + var n = new Menu(); + for (label => channel in [ + "Move Up" => "line-move-up", + "Move Down" => "line-move-down", + "Insert" => "line-insert", + "Delete" => "line-delete", + "Duplicate" => "line-duplicate", + "Show References" => "line-references-show", + ]) { + var item = new MenuItem({ label : label }); + item.click = () -> { + window.webContents.send(channel); + }; + n.append(item); + } + + var nsep = new MenuItem( { label : "Separator", role: "checkbox" } ); + nsep.enabled = enableSeparator; + nsep.checked = checkSeparator; + nsep.click = () -> { + window.webContents.send("line-separator"); + }; + n.append(nsep); + + return n; + } + + static function popupColumn(window: BrowserWindow, columnType: String, checked: Bool, ndispEnabled: Bool, niconEnabled: Bool) { + var n = new Menu(); + for (label => channel in [ + "Edit" => "column-edit", + "Add Column" => "column-add", + "Move Left" => "column-move-left", + "Move Right" => "column-move-right", + "Delete" => "column-delete", + ]) { + var item = new MenuItem({ label : label }); + item.click = () -> { + window.webContents.send(channel); + }; + n.append(item); + } + + var ndisp = new MenuItem( { label : "Display Column", role : "checkbox" } ); + ndisp.click = () -> { + window.webContents.send("column-display"); + } + ndisp.checked = checked; + ndisp.enabled = ndispEnabled; + n.append(ndisp); + + var nicon = new MenuItem( { label : "Display Icon", role : "checkbox" } ); + nicon.click = () -> { + window.webContents.send("column-display-icon"); + } + nicon.checked = checked; + nicon.enabled = niconEnabled; + n.append(nicon); + + switch (columnType) { + case "TId", "TString", "TEnum", "TFlags": + var cm = new Menu(); + var conv = new MenuItem( { label : "Convert", submenu: cm } ); + for( k in ["lowercase", "UPPERCASE", "UpperIdent","lowerIdent"] ) { + var m = new MenuItem( { label : k } ); + m.click = () -> { + window.webContents.send("column-convert-casing", k); + } + cm.append(m); + } + n.append(conv); + case "TInt", "TFloat": + var cm = new Menu(); + var conv = new MenuItem( { label : "Convert", submenu: cm} ); + for (k in ["* 10", "/ 10", "+ 1", "-1"]) { + var m = new MenuItem( { label : k } ); + m.click = () -> { + window.webContents.send("column-convert-number", k); + } + cm.append(m); + } + n.append(conv); + default: + } + + return n; + } + + static function popupSheet(window: BrowserWindow, showLevelCheckbox: Bool, nindexChecked: Bool, ngroupChecked: Bool, nlevelChecked: Bool) { + var n = new Menu(); + for (label => channel in [ + "Add Sheet" => "sheet-add", + "Move Left" => "sheet-move-left", + "Move Right" => "sheet-move-right", + "Rename" => "sheet-rename", + "Delete" => "sheet-delete", + ]) { + var item = new MenuItem({ label : label }); + item.click = () -> { + window.webContents.send(channel); + }; + n.append(item); + } + + var nindex = new MenuItem( { label : "Add Index", role : "checkbox" } ); + nindex.click = () -> { + window.webContents.send("sheet-add-index"); + }; + nindex.checked = nindexChecked; + + var ngroup = new MenuItem( { label : "Add Group", role : "checkbox" } ); + ngroup.click = () -> { + window.webContents.send("sheet-add-group"); + }; + IpcMain.removeHandler("set-ngroup"); + ngroup.checked = nindexChecked; + + // CSV + var csv = new Menu(); + var ncsv = new MenuItem( { label : "CSV...", submenu : csv} ); + + var importSheetCSV = new MenuItem( { label : "Import Sheet Data...", role : "checkbox" } ); + importSheetCSV.click = () -> { + Dialog.showOpenDialog({ properties: ['openFile'] }).then((response) -> { + window.webContents.send("sheet-import-csv", sys.io.File.getContent(untyped response.filePaths[0])); + }); + }; + + var exportSheetCSV = new MenuItem( { label : "Export Sheet Data...", role : "checkbox" } ); + exportSheetCSV.click = () -> { + window.webContents.send("sheet-export-csv"); + }; + + csv.append(importSheetCSV); + csv.append(exportSheetCSV); + + // JSON + var json = new Menu(); + var njson = new MenuItem( { label : "JSON...", submenu: json} ); + + var importSheetJSON = new MenuItem( { label : "Import Sheet Data...", role : "checkbox" } ); + importSheetJSON.click = () -> { + Dialog.showOpenDialog({ properties: ['openFile'] }).then((response) -> { + window.webContents.send("sheet-import-json", sys.io.File.getContent(untyped response.filePaths[0])); + }); + }; + + var exportSheetJSON = new MenuItem( { label : "Export Sheet Data...", role : "checkbox" } ); + exportSheetJSON.click = () -> { + window.webContents.send("sheet-export-json"); + }; + + json.append(importSheetJSON); + json.append(exportSheetJSON); + + for( m in [nindex, ngroup, njson, ncsv] ) + n.append(m); + + if (showLevelCheckbox) { + var nlevel = new MenuItem( { label : "Level", role : "checkbox" } ); + nlevel.checked = nlevelChecked; + n.append(nlevel); + } + + return n; + } +} From ed69a7cd57e7ec1411b451a36f97bbc3bdb27d86 Mon Sep 17 00:00:00 2001 From: l0go Date: Tue, 4 Mar 2025 09:56:43 -0500 Subject: [PATCH 02/12] TFile mostly works now --- bin/index.html | 3 --- src/app/Level.hx | 2 +- src/app/Main.hx | 65 +++++++++++++++------------------------------ src/app/Model.hx | 1 + src/runtime/Main.hx | 15 ++++++++--- 5 files changed, 35 insertions(+), 51 deletions(-) diff --git a/bin/index.html b/bin/index.html index a06e831a..e267efa5 100644 --- a/bin/index.html +++ b/bin/index.html @@ -16,9 +16,6 @@
- - -