From 8feb515d33e1a454458b65c6286e6c33a55fdac3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20Madar=C3=A1sz?= Date: Mon, 6 Nov 2023 09:55:10 +0100 Subject: [PATCH] editor sync --- tools/editor/3rd_lite_sys.h | 1 + tools/editor/art/icons/logo.ai | 208 ++++++++++ tools/editor/art/icons/logo.ico | Bin 0 -> 106477 bytes tools/editor/art/icons/logo.license | 2 + tools/editor/art/icons/logo.png | Bin 0 -> 31363 bytes .../editor/art/icons/scale-ruler-icon.license | 14 + tools/editor/art/icons/scale-ruler-icon.png | Bin 0 -> 3149 bytes tools/editor/art/icons/scale-ruler-icon.svg | 1 + .../art/lite/data/languages/language_bat.lua | 61 +++ .../lite/data/languages/language_batch.lua | 61 +++ .../art/lite/data/languages/language_cpp.lua | 121 ++++++ .../lite/data/languages/language_csharp.lua | 119 ++++++ .../art/lite/data/languages/language_glsl.lua | 373 ++++++++++++++++-- .../art/lite/data/languages/language_hlsl.lua | 274 +++++++++++++ .../art/lite/data/languages/language_moon.lua | 60 +++ .../art/lite/data/languages/language_nim.lua | 120 ++++++ .../art/lite/data/languages/language_odin.lua | 43 ++ .../art/lite/data/languages/language_teal.lua | 55 +++ .../art/lite/data/languages/language_ts.lua | 86 ++++ .../art/lite/data/languages/language_wren.lua | 43 ++ .../art/lite/data/plugins/closeconfirmx.lua | 53 +++ .../art/lite/data/plugins/colorpreview.lua | 54 +++ .../art/lite/data/plugins/gitstatus.lua | 68 ++++ .../art/lite/data/plugins/lfautoinsert.lua | 64 +++ .../lite/data/plugins/openfilelocation.lua | 30 ++ .../art/lite/data/plugins/rainbowparen.lua | 58 +++ .../art/lite/data/plugins/scalestatus.lua | 40 ++ .../art/lite/data/plugins/workspace.lua | 171 +++----- tools/editor/art/lite/data/themes/fwk.lua | 2 +- tools/editor/editor3.c | 2 +- tools/editor/v4k_editor.h | 2 +- tools/editor/v4k_editor6_script.h | 9 + 32 files changed, 2046 insertions(+), 149 deletions(-) create mode 100644 tools/editor/art/icons/logo.ai create mode 100644 tools/editor/art/icons/logo.ico create mode 100644 tools/editor/art/icons/logo.license create mode 100644 tools/editor/art/icons/logo.png create mode 100644 tools/editor/art/icons/scale-ruler-icon.license create mode 100644 tools/editor/art/icons/scale-ruler-icon.png create mode 100644 tools/editor/art/icons/scale-ruler-icon.svg create mode 100644 tools/editor/art/lite/data/languages/language_bat.lua create mode 100644 tools/editor/art/lite/data/languages/language_batch.lua create mode 100644 tools/editor/art/lite/data/languages/language_cpp.lua create mode 100644 tools/editor/art/lite/data/languages/language_csharp.lua create mode 100644 tools/editor/art/lite/data/languages/language_hlsl.lua create mode 100644 tools/editor/art/lite/data/languages/language_moon.lua create mode 100644 tools/editor/art/lite/data/languages/language_nim.lua create mode 100644 tools/editor/art/lite/data/languages/language_odin.lua create mode 100644 tools/editor/art/lite/data/languages/language_teal.lua create mode 100644 tools/editor/art/lite/data/languages/language_ts.lua create mode 100644 tools/editor/art/lite/data/languages/language_wren.lua create mode 100644 tools/editor/art/lite/data/plugins/closeconfirmx.lua create mode 100644 tools/editor/art/lite/data/plugins/colorpreview.lua create mode 100644 tools/editor/art/lite/data/plugins/gitstatus.lua create mode 100644 tools/editor/art/lite/data/plugins/lfautoinsert.lua create mode 100644 tools/editor/art/lite/data/plugins/openfilelocation.lua create mode 100644 tools/editor/art/lite/data/plugins/rainbowparen.lua create mode 100644 tools/editor/art/lite/data/plugins/scalestatus.lua diff --git a/tools/editor/3rd_lite_sys.h b/tools/editor/3rd_lite_sys.h index ccb1dd7..ec51fff 100644 --- a/tools/editor/3rd_lite_sys.h +++ b/tools/editor/3rd_lite_sys.h @@ -109,6 +109,7 @@ char* lt_key_name(char *dst, int key, int vk, int mods) { if( key == GLFW_KEY_RIGHT_CONTROL ) return "right ctrl"; if( key == GLFW_KEY_LEFT_SUPER ) return "left windows"; if( key == GLFW_KEY_RIGHT_SUPER ) return "left windows"; + if( key == GLFW_KEY_MENU ) return "menu"; if( key == GLFW_KEY_ESCAPE ) return "escape"; if( key == GLFW_KEY_BACKSPACE ) return "backspace"; diff --git a/tools/editor/art/icons/logo.ai b/tools/editor/art/icons/logo.ai new file mode 100644 index 0000000..5d05690 --- /dev/null +++ b/tools/editor/art/icons/logo.ai @@ -0,0 +1,208 @@ +%PDF-1.5 % +1 0 obj <>/OCGs[5 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <>stream + + + + + Adobe Illustrator CS6 (Macintosh) + 2015-12-25T23:34:04+01:00 + 2015-12-25T23:34:04+01:00 + 2015-12-25T23:34:04+01:00 + + + + 256 + 256 + JPEG + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 FXYq7FUo8w+b/LHl2D19b1O3sEIqqyuA7f6kYq7f7EYq8s8w/wDOU3k2yLR6LYXWrSDpK1LWE/Jn DyffHirzzWf+covP92WXTrey0yL9krG00o+bSMUP/AYqw7Ufzi/M/UCTP5kvEr1+ruLb/kwI8VSC 78z+ZLyv1vVry4rsfVuJXrvX9pj3xVL5Z5pmDSyNIwFAzksaeG+KuinmhYtFI0bEULISpp4bYqmF p5n8yWdPqmrXlvTYelcSpTev7LDviqf6d+cX5n6eQYPMl49On1hxc/8AJ8SYqzHRv+co/P8AaELq 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 + + + + + + 1 + False + False + + 500.000000 + 300.000000 + Pixels + + + + Cyan + Magenta + Yellow + Black + + + + + + Default Swatch Group + 0 + + + + + + Document + + + application/pdf + + + free_logo_2 + + + + + proof:pdf + uuid:3d80f318-a73b-8d4a-83a0-aa7625a338e9 + uuid:5b825168-1d11-5942-b0fd-1d4846b03e6f + + + Adobe PDF library 10.01 + + + + + + + + + + + + + + + + + + + + + + + + + endstream endobj 3 0 obj <> endobj 7 0 obj <>/Resources<>/Properties<>>>/Thumb 11 0 R/TrimBox[0.0 0.0 500.0 300.0]/Type/Page>> endobj 8 0 obj <>stream +HTRj@ +t.X^@!4~iJ]HzW^fh4c{~Ec`+0)zx +]r`EQG} Ji. +(7t.RF1G=▧zPihLCB*= +W%6&Z)9WKؑRl=zpQC{ eW2#Ol];@$76q\Nm⸼{$HJ$'T,*̢@^XJ36wY?lin&UI{BmZ\p? 6t endstream endobj 11 0 obj <>stream +8;Z]`;$t)]#R92hH2k3qSZsnIqh+e]H5Q7QM-m\g:%]#*OYRp(Z*]RDoMEeOX7_)r +\&pDInORVnSTaUX#JRV/I-[qIhAd;+2948oNP#+U?5t]ZX4=S[[.nn[H6BEc=:JEm +*[d#j>:MhSBUMrtA endstream endobj 12 0 obj [/Indexed/DeviceRGB 255 13 0 R] endobj 13 0 obj <>stream +8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0 +b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup` +E1r!/,*0[*9.aFIR2&b-C#soRZ7Dl%MLY\.?d>Mn +6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( +l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> endstream endobj 5 0 obj <> endobj 14 0 obj [/View/Design] endobj 15 0 obj <>>> endobj 10 0 obj <> endobj 9 0 obj <> endobj 16 0 obj <> endobj 17 0 obj <>stream +%!PS-Adobe-3.0 %%Creator: Adobe Illustrator(R) 16.0 %%AI8_CreatorVersion: 16.0.0 %%For: (Karim Amrani) () %%Title: (free_logo_2.fxg) %%CreationDate: 25/12/15 23:34 %%Canvassize: 16383 %%BoundingBox: 132 -264 358 -37 %%HiResBoundingBox: 132 -263.7998 357.9502 -37.8501 %%DocumentProcessColors: Cyan Magenta Yellow Black %AI5_FileFormat 12.0 %AI12_BuildNumber: 682 %AI3_ColorUsage: Color %AI7_ImageSettings: 0 %%RGBProcessColor: 0 0 0 ([Registration]) %AI3_Cropmarks: 0 -300 500 0 %AI3_TemplateBox: 249.5 -149.5 249.5 -149.5 %AI3_TileBox: -153 -429.5 630 129.5 %AI3_DocumentPreview: None %AI5_ArtSize: 14400 14400 %AI5_RulerUnits: 6 %AI9_ColorModel: 1 %AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 %AI5_TargetResolution: 800 %AI5_NumLayers: 1 %AI9_OpenToView: -306 222 1 1114 753 26 0 0 78 134 0 0 0 1 1 0 1 1 0 1 %AI5_OpenViewLayers: 7 %%PageOrigin:-150 -550 %AI7_GridSettings: 72 8 72 8 1 0 0.8 0.8 0.8 0.9 0.9 0.9 %AI9_Flatten: 1 %AI12_CMSettings: 00.MS %%EndComments endstream endobj 18 0 obj <>stream +%%BoundingBox: 132 -264 358 -37 %%HiResBoundingBox: 132 -263.7998 357.9502 -37.8501 %AI7_Thumbnail: 128 128 8 %%BeginData: 8090 Hex Bytes %0000330000660000990000CC0033000033330033660033990033CC0033FF %0066000066330066660066990066CC0066FF009900009933009966009999 %0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 %00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 %3333663333993333CC3333FF3366003366333366663366993366CC3366FF %3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 %33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 %6600666600996600CC6600FF6633006633336633666633996633CC6633FF %6666006666336666666666996666CC6666FF669900669933669966669999 %6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 %66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF %9933009933339933669933999933CC9933FF996600996633996666996699 %9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 %99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF %CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 %CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 %CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF %CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC %FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 %FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 %FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 %000011111111220000002200000022222222440000004400000044444444 %550000005500000055555555770000007700000077777777880000008800 %000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB %DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF %00FF0000FFFFFF0000FF00FFFFFF00FFFFFF %524C45FD35FFA8A87D7D52522752FD0527522752527D7DA87DA8A8FD64FF %A87D52522727F827F8272727F8FD0927F827F8FD04277D7DA8A8FD5CFF7D %7D2727F8FD1B27F827275252A8A8FD56FF7D522727F8FD2327F827277DA8 %FD50FFA852FD2D275252A8FD4CFF7D2727F8FD1527F827F827F8FD1527F8 %527DFD48FF7D52FD1727FD04527D52522752FD17277DFD44FF7D2727F8FD %0B27F8FD04277D7DA8A8FFA8FFA8FD07FFA8FFA8A87D7D52522727F827F8 %FD0B27F8277DFD40FFA852FD0F27527DA8A8FD19FFA87D5252FD0F27A8FD %3DFF5227F8FD0927F827277D7DFD21FFA8A85227F8FD0B27F87DA8FD39FF %A8FD0D27527DFD28FFA852FD0B27F8527DFD36FFA87DF8FD0927F82752A8 %FD2CFFA87D2727F8FD0727F82752FD34FFA852FD0B277DA8FD31FF52FD0C %27FD32FF7D27F8FD0727F82752A8FD34FFA87DFD0A27F8A8FD2FFF52FD0A %2752A8FD38FFA852FD0927F87DFD2DFF5227F8FD08277DFD3CFF7D27F8FD %0727F852FD2BFF52FD092752FD3FFFA852FD092752FD29FFFD0827F82752 %FD42FF7DF8FD0727F852A8FD26FFFD0A277DFD44FFA8FD092752A8FD24FF %FD0827F852A8FD46FFA8FD0827F852A8FD22FFFD0827F852FD23FFA87D7D %A8FD23FF52FD0727F852FD21FFFD0827F852FD22FFA852F827F82752FD23 %FF52FD0727F852FD1FFF52FD0727F87DFD23FF52FD062752FD23FF52FD07 %27F852FD1DFF52FD0727F852FD23FFA8F8FD0727A8FD23FF52FD0727F87D %FD1BFF7DFD08277DFD24FF52FD0727F8A8FD24FF52FD0827A8FD19FFA8FD %0727F87DFD24FFA8FD0A27FD25FF52FD0827A8FD18FF52FD072752FD25FF %7DFD0A277DFD25FF52FD0827FD17FF7DF8FD0527F852A8FD25FFFD0A27F8 %52FD26FFFD082752FD15FFA8FD0827A8FD25FF7DFD0C27FD27FFFD08277D %FD14FFFD08277DFD26FF52F8FD0B2752FD26FFA8F8FD0727A8FD12FF52FD %07277DFD26FFA8FD0E27A8FD26FF7DF8FD06277DFD11FF7DFD0827FD27FF %52FD0D27F87DFD27FF52F8FD0527F8A8FD10FF52FD0727FD27FFA8FD1027 %FD27FFA8FD0827FD0FFF7DF8FD0527F87DFD27FF7DF8FD0F277DFD27FF7D %FD07277DFD0EFFFD072752FD28FFFD112752FD28FFFD072752FD0DFF7DFD %0727A8FD27FF7DFD1127F8A8FD27FFA8F8FD0527F87DFD0CFF52FD062752 %FD28FF52FD122752FD28FF7DFD0727FD0BFF7DF8FD0627A8FD27FFA8F8FD %1327A8FD27FFA8FD07277DFD0AFFFD0627F87DFD28FF52FD14277DFD28FF %52FD062752FD09FF7DFD0727A8FD27FFA8FD1627FD28FFA8FD0627F8A8FD %08FF7DFD062752FD28FF7DFD16277DFD28FF7DFD062752FD08FFFD0727A8 %FD28FFFD1627F852FD28FFA8FD0727A8FD06FF7DFD0527F852FD28FF7DFD %1827A8FD28FF52FD06277DFD06FF52F8FD05277DFD27FFA852F8FD172752 %FD28FF7DF8FD0627FD06FFFD0727FD28FFA8FD1A27A8FD28FF52FD0627A8 %FD04FF7DFD0527F852FD28FFFD1A27F87DFD28FF52FD0527F87DFD04FF52 %F8FD05277DFD27FFA8FD1C27FD28FFA8F8FD052752FD04FFFD0727FD28FF %7DF8FD1B277DFD27FFA827F8272727F827A8FFFFA8FD062752FD28FFFD1D %2752FD28FF52FD0627A8FFFF7DF8FD05277DFD27FF7DFD1D27F8A8FD27FF %7DF8FD05277DFFFF52FD0627A8FD27FF52FD1E2752FD27FFA8FD0527F87D %FFFF52F8272727F827A8FD26FFA8F8FD1D27F827A8FD27FFFD0727FFFFFD %062752FD27FF52FD20277DFD27FF52FD052752FFA8FD0527F87DFD26FFA8 %FD2227FD27FF52FD0627A8A8FD06277DFD26FF7DF8FD21277DFD26FF7DFD %06277D7DFD0527F8A8FD26FFFD2227F852FD26FF7DFD0527F87D7DFD0627 %A8FD25FF7DFD2427A8FD25FFA8FD06275252FD0627A8FD24FFA852FD2427 %52FD25FFA8FD0527F85252FD052752FD25FFA8F8FD2527A8FD25FFFD0627 %52FD0727FD25FFFD2627F87DFD25FF27F8272727F85252FD052752FD24FF %A8FD2827FD25FFFD0E27FD24FF52F8FD27277DFD24FF52F8FD0B2752FD24 %FFFD292752FD24FF52FD0C2752FD23FF52FD2927F8A8FD23FF52F8FD0B27 %52FD23FF52F8FD292752FD23FF52FD0C2752FD23FFA852F8FD2927A8FD22 %FF52F8FD052752FD052752FD22FF52A8FFA852FD2727F87DFD22FFFD0E27 %FD21FFA827F87DA8FF7D27F8FD2627FD22FF52F8272727F85252FD052752 %FD21FF7DFD04277DFFFF7DFD26277DFD21FFFD072752FD0627FD21FFFD07 %27A8FFFF5227F8FD2127F852FD20FFA8FD0527F8527DFD0627A8FD1FFF7D %FD0727F852A8FFA852FD2227F8A8FD20FFFD06275252FD0627A8FD1EFFA8 %27F8FD0727F82752FFFF7D2727F8FD2027FD1FFF7DFD0527F87DA8FD0627 %7DFD1EFFA8F8FD0C27A8FFFF52FD2127A8FD1EFFA8FD06277D7DFD0527F8 %7DFD1EFFFD0E27F852A8FFA852F8FD1D27F87DFD1EFF7DFD0527F8A8A8FD %062752FD1DFFA8FD112752FFFFA8FD1F27FD1EFF7DF8FD0527A8A827F827 %2727F852FD1DFF52F8FD0F27F827277DFFFF7D27F8FD1B2752FD1DFFFD07 %27FFFF52FD0627FD1DFFFD1427F852A8FFFF7DFD1B2752FD1DFFFD062752 %FFFF52F8FD05277DFD1BFF52FD1527F82752A8FFA82727F8FD1727F8A8FD %1BFFA8FD062752FFFF7DFD0527F87DFD1AFFA852FD1927FFFFFF7D27F8FD %172752FD1BFF7DFD06277DFFFFA8FD0727FD1AFF7DF8FD1527F82752FD05 %FFA87DF8FD17277DFD1AFF52F8272727F827A8FFFFFF52FD052752FD1AFF %FD17277DA8FD09FF52FD16277DFD1AFFFD0727FD04FF52FD0527F8A8FD18 %FF7DFD1627A8FD0CFF7D52F8FD1427FD19FF7DFD0527F852FD04FFA8FD06 %2752FD18FF52FD1227F8527DFD10FF7DFD14277DFD18FF7DFD06277DFD04 %FFA8FD0727A8FD16FFA8F8FD0F27F827277DA8FD13FF5227F8FD0F27F827 %A8FD17FFFD0727A8FD05FF52FD0627A8FD16FF52FD112752FD17FFA852F8 %FD0F27F8A8FD16FF7DFD062752FD06FF7DF8FD052752FD15FFA8FD0F27F8 %527DFD1AFF7DFD1127FD16FF52F8FD05277DFD06FFA8FD0727A8FD14FF7D %FD0F277DFD1EFF52FD0F27A8FD15FFFD0727FD08FF52FD0527F852FD14FF %FD0C27F82752FD21FFA852F8FD0B27F852FD14FF52FD0527F852FD08FFA8 %FD0727FD13FF7DFD0B27F852A8FD24FFA8FD0D27FD13FFA8FD0727A8FD09 %FF52FD062752FD12FF52F8FD0727F82727A8FD28FF7D27F8FD092752FD12 %FF7DF8FD0627FD0AFF7DFD0727A8FD10FFA8FD0A277DFD2BFFA87DFD0A27 %A8FD11FFFD0627F8A8FD0BFFFD0627F852FD10FF52FD0727F852A8FD2EFF %A82727F8FD0527F87DFD10FF52FD0527F827A8FD0BFF7DFD0727A8FD0EFF %A852FD0727A8FD32FF7D52FD0727FD0FFFA8FD07277DFD0CFFA852FD0727 %FD0EFF7DF8272727F8277DFD35FFA87DFD06277DFD0EFF52F8FD0627FD0E %FF7DFD07277DFD0DFFFD05277DA8FD39FF52FD042752FD0DFF7DFD0627F8 %A8FD0FFFFD0827A8FD0BFF7D27F82752A8FD3CFF7D52F82727A8FD0BFFA8 %FD0627F852FD10FFA8FD072752FD0BFF52F8527DFD40FFA8272752FD0BFF %52FD0727A8FD11FF7DF8FD0527F87DFD09FFA8F87DFD44FF5227A8FD09FF %52FD072752FD12FFA852FD0727A8FD08FF7DA8FD46FFA8A8FD08FF7DFD08 %27FD14FF7DFD0827A8FD06FFA8FD51FFA827F8FD0527F87DFD15FF52FD08 %27FD58FF52FD07277DFD17FFFD082752FD56FF52F8FD0527F852FD19FFFD %082752FD54FF7DF8FD0727A8FD19FFA8F8FD072752FD52FF52F8FD0527F8 %277DFD1BFF7DF8FD072752FD50FF7DFD08277DFD1DFF52F8FD072752FD4E %FF52F8FD072752FD1FFF52F8FD072752FD4CFF7DFD082752FD20FFA852F8 %FD0827FD49FFA852F8FD0827FD23FF52FD0927FD47FFA852F8FD0827FD24 %FFA852F8FD0827A8FD44FF7D27F8FD0827FD26FFA852FD09277DFD42FF7D %FD0A27FD28FFA852F8FD0727F852A8FD3EFFA8FD0B27FD2BFF52F8FD0927 %7DFD3CFF7DFD0A2752FD2DFF7DF8FD0727F82727A8FD38FFA852F8FD0927 %52FD2FFFA8FD0B277DA8FD35FF52FD0B277DFD31FFA8FD0A27F82752FD31 %FFA87DFD0A27F827A8FD34FF52FD0C277DA8FD2DFF5227F8FD0A277DFD37 %FF7D27F8FD0927F82752A8A8FD27FF7D52F8FD0C27A8FD3AFF7DF8FD0B27 %F85252A8A8FD21FF7D7DFD0E2752FD3DFFA82727F8FD0927F827F827527D %7DFD19FFA8A87D522727F8FD0B27F8527DFD40FF7D52F8FD102752527D7D %A8A8FD0DFFA8A87D7D5252FD1127A8FD43FFA87DFD1027F827F8FD0627FD %05522752FD0427F827F8FD0F27F8277DFD48FF7D52FD3327A8FD4CFFA852 %27F8FD2927F82727527DFD50FFA8A852FD2827527DFD56FFA87D52522727 %F8FD1B27F82727527DFD5DFFA87D7D27522727F8FD0F27F8FD042752527D %A8FD64FFA8A87D7DFD0452FD0727522752527D7DA8A8FD34FFFF %%EndData endstream endobj 19 0 obj <>stream +%AI12_CompressedDatax}z:wB0ӑ# Z&^ǹc;. d˲,ɒ5o+D1 Jϧbދ~F i.Ÿ7!/1Q4QQN'y=·8{ c C`<Gx! +Bg4v?!+S\MyD>/^%@AoD+?}UYkeKMgX~>tsOxы~ 7 MFLL+ M3h8{_ N{`^43I¤/iFzȿ9wyQŅ4M# ] +gh&W@˘fL@ad%~4~l0Y!xaa?t4:?a4yq>썄?\SOHmnޠ1@'lWxv1 :e~&aUV-ѨO=3$O|2=A_yOq~1K~,x#hڄ^yldmpab\M/ lx Vvn |?x{Ⲡx_40t}h# +.uouPGn~l wa/D/ gvlZU\fdDg]8ߪCi6\8Ny&d]U[o*)xt7nz#EhN!/zʩ=5SI┺\\ +9/pI.Kl]m+݌ W#u3*b.i~þ!Sb7ۊ+!J%R,6ǦXj@ZK'jgu:) + w?spȼCg?\ӫt}݈Hl~NH}W O\&Q`i sN Ʈ]ђMoTmmY=ɔm* +ϑnkYb?3 #s~Sg=ec~vk Z|?  +RgIZ(xd*IWGөq:g86 \cI沬MS#4(ҟ~: CT.!roIJ@Q&0aC]pntRnj'0;M%6'OC/?r;k7]GÉ[l<R L@"n&hc^6I^i6ZN+Ȩφ1e9(/jzL[X̧^ Fj U]=H2U5Pˆ!] A6 *J j40M'`3 ?x.lFk( ] J@\j"twVȒaa<DÊ\pN?Bo:{:%45DzMzYqn6aY z ({P>QD`dB +8v5pS{Êg3Qif3c]s)I07|6ɑZgljNc#ѵO1طuYok`6k@{e씢$@(Z.jF8l@M1 ҤV;e/84Xx,RWIAD nFюQ a:G=cp=ڷ +'9l[jZJbek6&X ?5;Le>ͯ%5J>c_czQY*mz"on3*niϜ頴;ڪ 2c$85崾0h,?9MJObM,پ̡ ԋ@ph&bqNHˋ<}{h<džc(TnPźa>&Xd/63c:wlf5G/F-C}L~Eh3;v`=d-yvҀ`C%HCvUJ3cEՉl[斄v.So';1[m%t").ѭNg=H63n< `7J{jlDnx0TNq;dzw W41u)xy4t}j8l 9L!Ah^~(67m s@V1hJW0c\tSs0j +3ԖN& d0]f9dɼ APelWy v1tÓa<%Qxcp^)gC;Meh쀋˩ޢhhzEX4x+[z2t!JnH)c3kRmh30Y>4kPA/5`'aJ| _2b{3.J%.6@*<۞yOYFJۦIT9EuQ1os;;_mr苸NNlZNDNvS= S~q W018{u' '4X6 `*7Ht2 X(OOLU]G,%Pi9 UwAwupn慷 %@r@x%Otx/얗Jm]Ǽ .3@tAep<ćD/@:O!M?H0 + |%-zؽIt02 CG?7LٓR)'guXx';Dzݱcd9 d\:cfkӉyipamX](tvz;rDoc1D푧@-w4놖Mפ4䂒MzBZ `I[rw$IRa$>)- ""͛H(tQ=ݰu woެUMbm^S(Tn{E0A!ѷK[:SSD^V ] +vA{H{ٻ̚]'N\YRtI((VWS6 sP6b*}I{0ic1 ,P(w1˃",i.:\_0,ٲM%Ƌ3 j@ Y}ALm4* pLj( q&% =O͋\usȗ?#)>I|Dx/tEC# /E2?| ")_)t8tp$[CD:${QFH!=oϯOetKAML&۫$d^ӑBF^*P44cDA3! |FqT.kitY^F՝47RH且ÊTJlKFQ(i|i:?|3 +^ R8/i_ʷ0n_)ޘ{?ctMO[d,@z*f"rpU/mOL$i'IO LFO=%%]az7=7=us~1w'AsY?=1`,|3{ߡԸ3=&=m0۹JCR"d2_kiTKy~1o O;"Kl VbigcܹuNv ^ s׏f݊!`a-fT5v. >D"M 5c_MH.ewkR_ /xwhΰwvtK҄il*@^Gt❍"n# $^&5x"ہZ})@FnB}H^Oj$Xfu+QУO +A ܧ|iе 5vPZ 6z KvsI~?YW g#ڟge^B@7+3݃ . T |0b ++?eh9VQ#ٱl7םou%lU~eX*Ob*SGUqp`@@@('K3ҚD? +=Y1[2DG!r|M>>W.Ps@t ,t^LOI^uO~%̰1<$vnǙ=g|%s2HAy{}PމMW>cEwe^e=y 𞀛٨a0Z '*#sbَ(CNW U^ZU nU)>C;fCL3 -e?4ЌB3kךcOڑGeoF䱜-=BCšk;&]10Q&!`,>ɲ}c +Aa;qݱu~(l :?ONm河EDIr1_^EtȔ= Ne3@H1, gabϘR0ȫk+-L]b)I,MwVEQ%d35F}vk&Vqc~wړ]VX9A.AKt+>ά;is$إ-R<{VrtP\c|~3KhYBqCq&-}7F1 ?Q$RLl~яp72kǺn,KKco?ƍNޠtn+pRWohUʹC9DϺ'?oEgLNڍ@ Q,բwC')xpkӄQGH Ԥv->N4ߢƨ%w$)0Dwi%`CdOlO^&%n qǔ]̰g%N0KO!%le,h(pr8d᎜gwtǭ <4vYǽ!35]{@={ t0Jtj@¤@3[֞*}oMt>3_QU`vgI#S߳N@&L6vM +MxvnW[/uqܼQzq>_6 OӍ\Q`cgI4 + +/>*  /Z(hb} gUo,FF0kRC!`56љ1=Z6)wk03]+o7_C3>");9ǠI4`B&~Sq[dAh߯-ҕo'( &GD=A\I4kM k}x@1G842 +OާνzhOÇ*-y,&,lw$?q]G1. N]*3uh&&Ϟ)5vK^A.,d=bE`%f_{[45cPQ8!D(ƽRn E3mOy,703|^yzw[ wCߠijd6߿4mz7l{V9eMbb#2 .֎ B!;X8g8,q7 -$ 돺 m|Zw|ХA,(-a,AV2C 'fhф`uI@bG:N$S;OeE] ++Ar6^83:1Ij,cti JΝ y|o W'6y|2owZSbYv_heSb,#wy|&320~!E>3w=H[#^@1wK4:'*]n.g 鋝._FZyq2fgس00f ͏w܃08Q֫6$8%f`K'#6f1r׾#9 $߸SF\-Ŏ+P`Y4gžJs+c9VF=`taZC!gD#VǾN+^_D\t:uޱ30ە,gv#e\ydl#"6Ov.NȘ$pnu<2:$m+;0fÙ{ CKihPں0e9xUqc%7)jC*|N pvDms8PRvGΒbzOs1@-W,d=yu4 e>ڸhD0\FN&_SsT.Çጶ|uˇs73ñχP]'ӓM9|8h(U@>^bn(N7gm:Ź|8{[tSkM7Y78XrH-)b"0nkR "!7N (KOx+? v=,Bli\E<xўyV^J(Zª~ˏ][SCw+YCwIx*56s0t \Xk#˰E ɷiì[KW;݆o)ڠ&dƴ|dF&3R6򳁌THF*TgTe0{hS\1 ,KSsX^qm,ad#zR]&8HZ.MRI+p+ەRwm2NpH\;ݡfPg]( 'cZ45_-j2~,\;a +:̣ab6:Lb8±8Hyͦ.n6rm+Et>,zf; naQ' w|{/Ryoa;]! ?5a˒/zI1wFٌxU\ٕdfl;vxTc[}MʰK^ޢD6iz E3|)2RXT[CXG;;Q>R `aoFJ{KvdLH^ w%!m֘m=ϳ-"RVDވ]zcU\=f-TcL/GQ\tuETK 6T;߱sՕR{:V3kBcubyU31抜Xe׷^%9cHMU:J/\s׿N6}.;W1ٔ23s¹("Gs7b#4㳺KmT:#Dw@^FNϓ\N6Mge^PdY^rqMg6MgKf8dzl:ztV$nn˦sQL69:t9s'#fYn:3l:{̦\:Sѵ6#Il:.aʦʥf6iwBn, +r»l:\:5Vl:m(*%(r9VkdYin&NK]l:#'ul:y&MϐzbMgmWɱb6F M$grMg5 "R +;RNb%}:EUQD:bC,Yittrl1)(9&ӱsة țe]u9]ZYT]R-LJ cC4!ZDwh-#P-XnŜ5_LT)yhsPyckWX`{/ +/Pusrp ߺ,Zul$6:i"biLvIj]NpfzU`"lؕހ7ە=)2:*&m[Ű+_7qwOc+q-qv(0oTKXǮVS0XbפW%%t+dwwuzRK| 4$Q۞w{}wω/܋%mmvLS>RD :R:l~.·;{psaEu=-K.5/ܿ["#!S<){YjLM).[?k#5Å$KEdh^[-~*E, +SeQM;˽q +W1PU\grp7 +uCPz]ugmn(TohQW]O+ÂWwd[P5Z#Ȗ*mJu]Dg? φ9En}!,OE̙M]?իj#u7:>r]?CRU5n2ls6&WsW\]=Unju]׏N&cL]?Y_6=ōo*K\Ϝj]?so}51#e]?Rvf <Yz|zLU֫GkseQodx%'q~eTa@]?5ͺ,֯g4 7m,ɺH1s]JWuH2P귡}U?m+ Pz:ۊ ; +u9c U0ZuVaVGItC]P׏&r~􎚷aț/,E|h]Ea>qkf#i(㧙ɇ&Yҗt5Af=ۉx0X}B1|c'K=FרT@)0rLͪ{DžˑrQgKaG> ٫{$f&}\ana3+kw;P?27bmk;̨tnq~{Kt9~P=N#(f}-QWQv+jvɷʟecvLCSeư5$>}7Jz2H[ս~_T/9&v:R9S`^J]/-[)yc7 +Vpi ھSP<3\| 9 3,)ђSL3 2&r"q+_;s50J˰"-aR| ]n&*ty:N<&{|)@Uά\GKF\h v<$6#XL^z. R09M`, +dkş4+rO_HN0R7XLHn8Ol=Ze!V s{&l@[LWwaKuKZg&ڼ A~u~L9<;v?|@rCFkVY|P[k'HjxhgEV;.ܕ?qGn,Y/mRMZ +0 +U^?»89j'R*\}4 kE[fI>K+zR)iÕ{WVC_q@} F\ j+k)[:# +R=8 bB=,+\$W"-ԘF hx'qi6@#4 -v#oy%ffR{wRev%4`): Pyk6ObFm'Gff MD#Zؚbb,u=]=fdm^iRZ, Lq$.3_FΘ=&-ikr9cp&\>׋抾W/R&^ZwAT[gD|lh1li1k+_\u13&e<)^5O^Tp,>l'՘g >LD`T^^rQcn 'S0w{j`G֪H^gde)nK@&%µ=$k(}Z{6:^޴c^os)H4؍=v{QKܷ6iYPV+f+nj6> K {@_HI'p%H`|ك|z*N?!_Uc/bOy :/nw6; v@´%Va(ԛͳpKl *]@^jɻ +e\\`,Y\Q\ FpV\\r&[Gq.c4k1{׊xfyQ..x,ѝKыb*BdƜzחq8uVLPO_|+kjme[E|WIT3h}F:?V lny~ +ZVBHmM)E#F<]`Wv/c+y4̞_xzu0%hcs ®צ+[j+;y¼4ȼ +K'D +ya!Gw'X(B;{)Q6IWdmpr(ˍP|Ee%ON*:Arn4=<$:<?EvNQXWls +-E͉WNģiW=mѴ{yOy֙x4j_xg|kLᣇsV:OM fA1 b awhbgvW9br _+~ҫԁp/י $4>XH+Exwu?z.e1*|&FRxD3=O`]83փ'`"Bu5ʕ@(rE-AK՘uŕ0 "rL&!H +'^A(f#qr *+G1.SE"zuRT-}yIyɀ*۞$jŹ1glgfkU|cⱸ%%@KzWe̺ KZsX<ËRX!>pRG_(EC԰#2\#<h+`Vޑ#,q"Ş +e}-)= GNZ6lO)9s%LwĄI1~F~99IME +tГ)+IL(A,uJMl+Mo'zw4L޵{R=پ ?<0أ@}p)'~ Lo ?_ƵۀS 2zgRvݷ:,7X(U-[7g{r ;H^ +==Jc5[\(sGJ$z;gZۺosLW8qZ8PO)%}yegE֧r>I:+qE[\~(>Ȝ̕NY˽it)orC%wO'X|H:O'P<`)5.;{q$ȇ.6_Is6GϽB(n + 08.ЮP TP'Q;DׄҲ5.sU{G^eҍ<@t%:evR/c|G0Au\L={("]"*,H*nK=5ǹr9$EXJ1xoF[cӐr}K+uʨ-^k&~ jd #ou4pٟG$x`ʀɉPXr +rddVL_$ "k(]QdrW36/eRB9 BE>drIΛeb$Ws8F"˳t<Īӧd"<1]pC4rb)`,`? +&ΛERs`ɿ=?"~OY>*;,ԋե ӛOA9=} dD(Вi/5a8n͊I! +K_4~7JWk{]YآH 3 KM'+(7Yծ(ʅ {%W4 xP򱛧Q=n,f#&{Zck[ D mBpf2hxSVv_*x VaT/ 2]a _Q|{VH)赇n# !~нBT^!oWE{QxJQ1JG~{ d>,.z]%o9wC|&Ս) JJ{<=Kx΍82@ {YX{@qpԛӸ>*;{@ +U:2Hߤ]t&MnBD~fW7hWhxƢ+p,KcKcE+nfmf/ί[kO EV50/@I"IQ|toq>qgLrpUNC,:HC@;`Kޤ boq70/[x%LPm5&{ZJ_ݯNK^71#PLjps.W( |N`Bw+ ':U'Hq":#6UsCsD`' I3([A PdvT{(:bEP^gY7 ty,-WƀT1 +A:tz)vu7z1(bԳ}<B֊8jV B?ŊK/rԜ)a6|cHw2׺%zѝV\c#*`B0 J(PçQXpiLTq3F#;fq3FtVaq܌Qoq܌Q'`q܌x7o|vO8n߈l<Ƣ~;!ˈZHΐ|,?C3V~9l J &4D +.ٓ&xmR9?RG$ROHKTrȎяe͑]=v/QH.ðI9b]zRh7šL٥O}0\/[L˘>Q݊@z!A_խ'zG}OAv*>~ /|1 R94?a ,r6 jeC׉yy؛^ßӲ7v@}oQzvd^g\ +/ (L67~:O ?oɧ/~P,OߟvXo:& ? +YÙc % ag[OW&%`M`Jbl"m#m_/o/x/ϯf}RL,̥L:IyǞq\܆c16yl1I2 é_L,H$/I ?L"c{Rq)o /fj&E6e9Lg\cĉ9؇2Oڻ= ΍K1A9@ф“@hJS]1 MpL`'0 ~J(RpT:2Kǒ- g.Lh c2 gKedpdO= E)Tai%R`8NL76;.ч&WGHGRPz&w6 6Ǥ ]kG4W@^U=m endstream endobj 6 0 obj [5 0 R] endobj 20 0 obj <> endobj xref 0 21 0000000000 65535 f +0000000016 00000 n +0000000144 00000 n +0000021511 00000 n +0000000000 00000 f +0000023188 00000 n +0000052867 00000 n +0000021562 00000 n +0000021892 00000 n +0000023487 00000 n +0000023374 00000 n +0000022293 00000 n +0000022627 00000 n +0000022675 00000 n +0000023258 00000 n +0000023289 00000 n +0000023560 00000 n +0000023734 00000 n +0000024741 00000 n +0000033030 00000 n +0000052890 00000 n +trailer <]>> startxref 53080 %%EOF \ No newline at end of file diff --git a/tools/editor/art/icons/logo.ico b/tools/editor/art/icons/logo.ico new file mode 100644 index 0000000000000000000000000000000000000000..3b122dceb20b49cbe428da8ac36e62dac7dd1e0b GIT binary patch literal 106477 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 B=f(g4 literal 0 HcmV?d00001 diff --git a/tools/editor/art/icons/logo.license b/tools/editor/art/icons/logo.license new file mode 100644 index 0000000..07f18c1 --- /dev/null +++ b/tools/editor/art/icons/logo.license @@ -0,0 +1,2 @@ +Free & Open Sourced Logos +At Fairpixels, we had unused logo designs piling up on our hard drives and decided to make them available to the world, for free. The logos below can be downloaded unlimited times and used by anyone. For personal & commercial projects. No attribution required. Perfect for mvp's and mockups. diff --git a/tools/editor/art/icons/logo.png b/tools/editor/art/icons/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..1d2f8498bc6fb1ab45877f3c095107c4287608ad GIT binary patch literal 31363 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 literal 0 HcmV?d00001 diff --git a/tools/editor/art/icons/scale-ruler-icon.license b/tools/editor/art/icons/scale-ruler-icon.license new file mode 100644 index 0000000..72340da --- /dev/null +++ b/tools/editor/art/icons/scale-ruler-icon.license @@ -0,0 +1,14 @@ +https://uxwing.com/license/ + +Permitted: +- All icons on UXWing free to download, and use personal, commercial projects. +- Attribution and Credit is NOT required, however, any credit will be much appreciated. +- There is no limit to the number of times you can use. +- You may modify the resources according to your requirements. + +Brand icons: +- All brand logos /icons are trademarks of their respective owners/entities. This should only be used to represent the company or product to which they refer. + +Prohibitions: +- Resell, Direct redistribute, Sub-license, Claim credit, or Ownership of any of the icons. +- Don’t use this material for SPAM websites, illegal business, illegal activity, and hate/crime. diff --git a/tools/editor/art/icons/scale-ruler-icon.png b/tools/editor/art/icons/scale-ruler-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..5dc45f3782055f0236a49b3fb6817f9715d42b88 GIT binary patch literal 3149 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 literal 0 HcmV?d00001 diff --git a/tools/editor/art/icons/scale-ruler-icon.svg b/tools/editor/art/icons/scale-ruler-icon.svg new file mode 100644 index 0000000..1de3359 --- /dev/null +++ b/tools/editor/art/icons/scale-ruler-icon.svg @@ -0,0 +1 @@ +scale-ruler \ No newline at end of file diff --git a/tools/editor/art/lite/data/languages/language_bat.lua b/tools/editor/art/lite/data/languages/language_bat.lua new file mode 100644 index 0000000..3ee9fa2 --- /dev/null +++ b/tools/editor/art/lite/data/languages/language_bat.lua @@ -0,0 +1,61 @@ +local syntax = require "core.syntax" + +-- batch syntax for lite + +-- windows batch files use caseless matching for symbols +local symtable = { + ["keyword"] = { + "if", "else", "elsif", "not", "for", "do", "in", + "equ", "neq", "lss", "leq", "gtr", "geq", -- == != < <= > >= + "nul", "con", "prn", "prn", "lpt1", "com1", "com2", "com3", "com4", + "exist", "defined", + "errorlevel", "cmdextversion", + "goto", "call", "verify", + }, + ["function"] = { + "set", "setlocal", "endlocal", "enabledelayedexpansion", + "echo", "type", + "cd", "chdir", + "md", "mkdir", + "pause", "choice", "exit", + "del", "rd", "rmdir", + "copy", "xcopy", + "move", "ren", + "find", "findstr", + "sort", "shift", "attrib", + "cmd", "command", + "forfiles", + }, +} +-- prepare a mixed symbol list +local function prepare_symbols(symtable) + local symbols = { } + for symtype, symlist in pairs(symtable) do + for _, symname in ipairs(symlist) do + symbols[symname:lower()] = symtype + symbols[symname:upper()] = symtype + end + end + return symbols +end + +syntax.add { + files = { "%.bat$", "%.cmd$" }, + comment = "rem", + patterns = { + { pattern = "@echo off\n", type = "keyword" }, + { pattern = "@echo on\n", type = "keyword" }, + { pattern = "rem.-\n", type = "comment" }, -- rem comment line, rem, rem. + { pattern = "REM.-\n", type = "comment" }, + { pattern = "%s*:[%w%-]+", type = "symbol" }, -- :labels + { pattern = "%:%:.-\n", type = "comment" }, -- :: comment line + { pattern = "%%%w+%%", type = "symbol" }, -- %variable% + { pattern = "%%%%?~?[%w:]+", type = "symbol" }, -- %1, %~dpn1, %~1:2, %%i, %%~i + { pattern = "[!=()%>&%^/\\@]", type = "operator" }, -- operators + { pattern = "-?%.?%d+f?", type = "number" }, -- integer numbers + { pattern = { '"', '"', '\\' }, type = "string" }, -- "strings" + { pattern = "[%a_][%w_]*", type = "normal" }, + { pattern = ":eof", type = "keyword" }, -- not quite as intended, but ok for now + }, + symbols = prepare_symbols(symtable), +} \ No newline at end of file diff --git a/tools/editor/art/lite/data/languages/language_batch.lua b/tools/editor/art/lite/data/languages/language_batch.lua new file mode 100644 index 0000000..3ee9fa2 --- /dev/null +++ b/tools/editor/art/lite/data/languages/language_batch.lua @@ -0,0 +1,61 @@ +local syntax = require "core.syntax" + +-- batch syntax for lite + +-- windows batch files use caseless matching for symbols +local symtable = { + ["keyword"] = { + "if", "else", "elsif", "not", "for", "do", "in", + "equ", "neq", "lss", "leq", "gtr", "geq", -- == != < <= > >= + "nul", "con", "prn", "prn", "lpt1", "com1", "com2", "com3", "com4", + "exist", "defined", + "errorlevel", "cmdextversion", + "goto", "call", "verify", + }, + ["function"] = { + "set", "setlocal", "endlocal", "enabledelayedexpansion", + "echo", "type", + "cd", "chdir", + "md", "mkdir", + "pause", "choice", "exit", + "del", "rd", "rmdir", + "copy", "xcopy", + "move", "ren", + "find", "findstr", + "sort", "shift", "attrib", + "cmd", "command", + "forfiles", + }, +} +-- prepare a mixed symbol list +local function prepare_symbols(symtable) + local symbols = { } + for symtype, symlist in pairs(symtable) do + for _, symname in ipairs(symlist) do + symbols[symname:lower()] = symtype + symbols[symname:upper()] = symtype + end + end + return symbols +end + +syntax.add { + files = { "%.bat$", "%.cmd$" }, + comment = "rem", + patterns = { + { pattern = "@echo off\n", type = "keyword" }, + { pattern = "@echo on\n", type = "keyword" }, + { pattern = "rem.-\n", type = "comment" }, -- rem comment line, rem, rem. + { pattern = "REM.-\n", type = "comment" }, + { pattern = "%s*:[%w%-]+", type = "symbol" }, -- :labels + { pattern = "%:%:.-\n", type = "comment" }, -- :: comment line + { pattern = "%%%w+%%", type = "symbol" }, -- %variable% + { pattern = "%%%%?~?[%w:]+", type = "symbol" }, -- %1, %~dpn1, %~1:2, %%i, %%~i + { pattern = "[!=()%>&%^/\\@]", type = "operator" }, -- operators + { pattern = "-?%.?%d+f?", type = "number" }, -- integer numbers + { pattern = { '"', '"', '\\' }, type = "string" }, -- "strings" + { pattern = "[%a_][%w_]*", type = "normal" }, + { pattern = ":eof", type = "keyword" }, -- not quite as intended, but ok for now + }, + symbols = prepare_symbols(symtable), +} \ No newline at end of file diff --git a/tools/editor/art/lite/data/languages/language_cpp.lua b/tools/editor/art/lite/data/languages/language_cpp.lua new file mode 100644 index 0000000..a837d55 --- /dev/null +++ b/tools/editor/art/lite/data/languages/language_cpp.lua @@ -0,0 +1,121 @@ +pcall(require, "plugins.language_c") + +local syntax = require "core.syntax" + +syntax.add { + files = { + "%.h$", "%.inl$", "%.cpp$", "%.cc$", "%.C$", "%.cxx$", + "%.c++$", "%.hh$", "%.H$", "%.hxx$", "%.hpp$", "%.h++$" + }, + comment = "//", + patterns = { + { pattern = "//.-\n", type = "comment" }, + { pattern = { "/%*", "%*/" }, type = "comment" }, + { pattern = { "#", "[^\\]\n" }, type = "comment" }, + { pattern = { '"', '"', '\\' }, type = "string" }, + { pattern = { "'", "'", '\\' }, type = "string" }, + { pattern = "-?0x%x+", type = "number" }, + { pattern = "-?%d+[%d%.eE]*f?", type = "number" }, + { pattern = "-?%.?%d+f?", type = "number" }, + { pattern = "[%+%-=/%*%^%%<>!~|&]", type = "operator" }, + { pattern = "[%a_][%w_]*%f[(]", type = "function" }, + { pattern = "[%a_][%w_]*", type = "symbol" }, + }, + symbols = { + ["alignof"] = "keyword", + ["alignas"] = "keyword", + ["and"] = "keyword", + ["and_eq"] = "keyword", + ["not"] = "keyword", + ["not_eq"] = "keyword", + ["or"] = "keyword", + ["or_eq"] = "keyword", + ["xor"] = "keyword", + ["xor_eq"] = "keyword", + ["private"] = "keyword", + ["protected"] = "keyword", + ["public"] = "keyword", + ["register"] = "keyword", + ["nullptr"] = "keyword", + ["operator"] = "keyword", + ["asm"] = "keyword", + ["bitand"] = "keyword", + ["bitor"] = "keyword", + ["catch"] = "keyword", + ["throw"] = "keyword", + ["try"] = "keyword", + ["class"] = "keyword", + ["compl"] = "keyword", + ["explicit"] = "keyword", + ["export"] = "keyword", + ["concept"] = "keyword", + ["consteval"] = "keyword", + ["constexpr"] = "keyword", + ["constinit"] = "keyword", + ["const_cast"] = "keyword", + ["dynamic_cast"] = "keyword", + ["reinterpret_cast"] = "keyword", + ["static_cast"] = "keyword", + ["static_assert"] = "keyword", + ["template"] = "keyword", + ["this"] = "keyword", + ["thread_local"] = "keyword", + ["requires"] = "keyword", + ["co_wait"] = "keyword", + ["co_return"] = "keyword", + ["co_yield"] = "keyword", + ["decltype"] = "keyword", + ["delete"] = "keyword", + ["export"] = "keyword", + ["friend"] = "keyword", + ["typeid"] = "keyword", + ["typename"] = "keyword", + ["mutable"] = "keyword", + ["virtual"] = "keyword", + ["using"] = "keyword", + ["namespace"] = "keyword", + ["new"] = "keyword", + ["noexcept"] = "keyword", + ["if"] = "keyword", + ["then"] = "keyword", + ["else"] = "keyword", + ["elseif"] = "keyword", + ["do"] = "keyword", + ["while"] = "keyword", + ["for"] = "keyword", + ["break"] = "keyword", + ["continue"] = "keyword", + ["return"] = "keyword", + ["goto"] = "keyword", + ["struct"] = "keyword", + ["union"] = "keyword", + ["typedef"] = "keyword", + ["enum"] = "keyword", + ["extern"] = "keyword", + ["static"] = "keyword", + ["volatile"] = "keyword", + ["const"] = "keyword", + ["inline"] = "keyword", + ["switch"] = "keyword", + ["case"] = "keyword", + ["default"] = "keyword", + ["auto"] = "keyword", + ["const"] = "keyword", + ["void"] = "keyword", + ["int"] = "keyword2", + ["short"] = "keyword2", + ["long"] = "keyword2", + ["float"] = "keyword2", + ["double"] = "keyword2", + ["char"] = "keyword2", + ["unsigned"] = "keyword2", + ["bool"] = "keyword2", + ["true"] = "keyword2", + ["false"] = "keyword2", + ["wchar_t"] = "keyword2", + ["char8_t"] = "keyword2", + ["char16_t"] = "keyword2", + ["char32_t"] = "keyword2", + ["NULL"] = "literal", + }, +} \ No newline at end of file diff --git a/tools/editor/art/lite/data/languages/language_csharp.lua b/tools/editor/art/lite/data/languages/language_csharp.lua new file mode 100644 index 0000000..95a0f84 --- /dev/null +++ b/tools/editor/art/lite/data/languages/language_csharp.lua @@ -0,0 +1,119 @@ +local syntax = require "core.syntax" + +syntax.add { + files = "%.cs$", + comment = "//", + patterns = { + { pattern = "//.-\n", type = "comment" }, + { pattern = { "/%*", "%*/" }, type = "comment" }, + { pattern = { '"', '"', '\\' }, type = "string" }, + { pattern = { "[%$%@]?\"", '"', '\\' }, type = "string" }, -- string interpolation and verbatim + { pattern = "'\\x%x?%x?%x?%x'", type = "string" }, -- character hexadecimal escape sequence + { pattern = "'\\u%x%x%x%x'", type = "string" }, -- character unicode escape sequence + { pattern = "'\\?.'", type = "string" }, -- character literal + { pattern = "-?0x%x+", type = "number" }, + { pattern = "-?%d+[%d%.eE]*f?", type = "number" }, + { pattern = "-?%.?%d+f?", type = "number" }, + { pattern = "[%+%-=/%*%^%%<>!~|&]", type = "operator" }, + { pattern = "%?%?", type = "operator" }, -- ?? null-coalescing + { pattern = "%?%.", type = "operator" }, -- ?. null-conditional + { pattern = "[%a_][%w_]*%f[(]", type = "function" }, + { pattern = "[%a_][%w_]*", type = "symbol" }, + }, + symbols = { + -- keywords and contextual keywords + ["abstract"] = "keyword", + ["as"] = "keyword", + ["add"] = "keyword", + ["await"] = "keyword", + ["base"] = "keyword", + ["break"] = "keyword", + ["case"] = "keyword", + ["catch"] = "keyword", + ["checked"] = "keyword", + ["class"] = "keyword", + ["record"] = "keyword", + ["const"] = "keyword", + ["continue"] = "keyword", + ["default"] = "keyword", + ["delegate"] = "keyword", + ["do"] = "keyword", + ["else"] = "keyword", + ["enum"] = "keyword", + ["event"] = "keyword", + ["explicit"] = "keyword", + ["extern"] = "keyword", + ["finally"] = "keyword", + ["fixed"] = "keyword", + ["for"] = "keyword", + ["foreach"] = "keyword", + ["get"] = "keyword", + ["goto"] = "keyword", + ["if"] = "keyword", + ["implicit"] = "keyword", + ["in"] = "keyword", + ["interface"] = "keyword", + ["internal"] = "keyword", + ["is"] = "keyword", + ["lock"] = "keyword", + ["namespace"] = "keyword", + ["new"] = "keyword", + ["operator"] = "keyword", + ["out"] = "keyword", + ["override"] = "keyword", + ["remove"] = "keyword", + ["params"] = "keyword", + ["partial"] = "keyword", + ["private"] = "keyword", + ["protected"] = "keyword", + ["dynamic"] = "keyword", + ["public"] = "keyword", + ["readonly"] = "keyword", + ["ref"] = "keyword", + ["return"] = "keyword", + ["sealed"] = "keyword", + ["set"] = "keyword", + ["sizeof"] = "keyword", + ["stackalloc"] = "keyword", + ["static"] = "keyword", + ["struct"] = "keyword", + ["switch"] = "keyword", + ["this"] = "keyword", + ["throw"] = "keyword", + ["try"] = "keyword", + ["typeof"] = "keyword", + ["unchecked"] = "keyword", + ["unsafe"] = "keyword", + ["using"] = "keyword", + ["var"] = "keyword", + ["value"] = "keyword", + ["global"] = "keyword", + ["virtual"] = "keyword", + ["void"] = "keyword", + ["volatile"] = "keyword", + ["where"] = "keyword", + ["when"] = "keyword", + ["while"] = "keyword", + ["yield"] = "keyword", + -- types + ["bool"] = "keyword2", + ["byte"] = "keyword2", + ["char"] = "keyword2", + ["decimal"] = "keyword2", + ["double"] = "keyword2", + ["float"] = "keyword2", + ["int"] = "keyword2", + ["long"] = "keyword2", + ["object"] = "keyword2", + ["sbyte"] = "keyword2", + ["short"] = "keyword2", + ["string"] = "keyword2", + ["uint"] = "keyword2", + ["ulong"] = "keyword2", + ["ushort"] = "keyword2", + -- literals + ["true"] = "literal", + ["false"] = "literal", + ["null"] = "literal", + }, +} diff --git a/tools/editor/art/lite/data/languages/language_glsl.lua b/tools/editor/art/lite/data/languages/language_glsl.lua index 55d9891..77a0ae4 100644 --- a/tools/editor/art/lite/data/languages/language_glsl.lua +++ b/tools/editor/art/lite/data/languages/language_glsl.lua @@ -1,7 +1,11 @@ + +local style = require "core.style" +local common = require "core.common" + local syntax = require "core.syntax" syntax.add { - files = { "%.fx$", "%.glsl$", "%.fs$", "%.vs$", "%.gs$" }, + files = { "%.glsl$", "%.frag$", "%.vert$", "%.vs$", "%.fs$", "%.gs$", "%.fx$", }, comment = "//", patterns = { { pattern = "//.-\n", type = "comment" }, @@ -13,55 +17,370 @@ syntax.add { { pattern = "-?%d+[%d%.eE]*f?", type = "number" }, { pattern = "-?%.?%d+f?", type = "number" }, { pattern = "[%+%-=/%*%^%%<>!~|&]", type = "operator" }, + + { pattern = "ivec[2-4]", type = "keyword2" }, + { pattern = "bvec[2-4]", type = "keyword2" }, + { pattern = "uvec[2-4]", type = "keyword2" }, + { pattern = "vec[2-4]", type = "keyword2" }, + { pattern = "dmat[2-4]x[2-4]", type = "keyword2" }, + { pattern = "dmat[2-4]", type = "keyword2" }, + { pattern = "mat[2-4]x[2-4]", type = "keyword2" }, + { pattern = "mat[2-4]", type = "keyword2" }, + { pattern = "[%a_][%w_]*%f[(]", type = "function" }, { pattern = "[%a_][%w_]*", type = "symbol" }, }, symbols = { + --https://www.khronos.org/registry/OpenGL/specs/gl/GLSLangSpec.4.60.pdf + --The symbols are added here in the order they appear in the spec ["if"] = "keyword", - ["then"] = "keyword", ["else"] = "keyword", - ["elseif"] = "keyword", ["do"] = "keyword", ["while"] = "keyword", ["for"] = "keyword", ["break"] = "keyword", ["continue"] = "keyword", ["return"] = "keyword", - ["goto"] = "keyword", - ["struct"] = "keyword", - ["union"] = "keyword", - ["typedef"] = "keyword", - ["enum"] = "keyword", - ["extern"] = "keyword", - ["static"] = "keyword", - ["volatile"] = "keyword", ["const"] = "keyword", - ["inline"] = "keyword", ["switch"] = "keyword", ["case"] = "keyword", ["default"] = "keyword", - ["auto"] = "keyword", ["const"] = "keyword", ["void"] = "keyword", - ["uniform"] = "keyword", - ["in"] = "keyword", - ["out"] = "keyword", - ["inout"] = "keyword", + ["bool"] = "keyword2", ["int"] = "keyword2", - ["short"] = "keyword2", - ["long"] = "keyword2", + ["uint"] = "keyword2", ["float"] = "keyword2", ["double"] = "keyword2", - ["char"] = "keyword2", - ["unsigned"] = "keyword2", - ["bool"] = "keyword2", - ["vec2"] = "keyword2", - ["vec3"] = "keyword2", - ["vec4"] = "keyword2", - ["sampler2D"]= "keyword2", ["true"] = "literal", ["false"] = "literal", ["NULL"] = "literal", + + ["attribute"] = "keyword", + ["varying"] = "keyword", + ["uniform"] = "keyword", + ["buffer"] = "keyword", + ["shared"] = "keyword", + ["layout"] = "keyword", + ["centroid"] = "keyword", + ["flat"] = "keyword", + ["smooth"] = "keyword", + ["noperspective"]= "keyword", + ["patch"] = "keyword", + ["sample"] = "keyword", + ["in"] = "keyword", + ["out"] = "keyword", + ["inout"] = "keyword", + ["invariant"] = "keyword", + ["precise"] = "keyword", + ["lowp"] = "keyword", + ["mediump"] = "keyword", + ["highp"] = "keyword", + ["precision"] = "keyword", + ["struct"] = "keyword", + ["subroutine"] = "keyword", + + ["coherent"] = "keyword", + ["volatile"] = "keyword", + ["readonly"] = "keyword", + ["writeonly"] = "keyword", + + ["sampler1D"] = "keyword2", + ["sampler2D"] = "keyword2", + ["sampler3D"] = "keyword2", + ["samplerCube"] = "keyword2", + ["sampler1DShadow"] = "keyword2", + ["sampler2DShadow"] = "keyword2", + ["samplerCubeShadow"] = "keyword2", + ["sampler1DArray"] = "keyword2", + ["sampler2DArray"] = "keyword2", + ["samplerCubeArray"] = "keyword2", + ["sampler1DArrayShadow"] = "keyword2", + ["sampler2DArrayShadow"] = "keyword2", + ["samplerCubeArrayShadow"]= "keyword2", + ["isampler1D"] = "keyword2", + ["isampler2D"] = "keyword2", + ["isampler3D"] = "keyword2", + ["isamplerCube"] = "keyword2", + ["sampler2DMS"] = "keyword2", + ["isampler2DMS"] = "keyword2", + ["usampler2DMS"] = "keyword2", + ["sampler2DMSArray"] = "keyword2", + ["isampler2DMSArray"] = "keyword2", + ["usampler2DMSArray"] = "keyword2", + ["isampler1DArray"] = "keyword2", + ["isampler2DArray"] = "keyword2", + ["usampler1D"] = "keyword2", + ["usampler2D"] = "keyword2", + ["usampler3D"] = "keyword2", + ["usamplerCube"] = "keyword2", + ["usampler1DArray"] = "keyword2", + ["usampler2DArray"] = "keyword2", + ["sampler2DRect"] = "keyword2", + ["sampler2DRectShadow"] = "keyword2", + ["isampler2DRect"] = "keyword2", + ["usampler2DRect"] = "keyword2", + ["samplerBuffer"] = "keyword2", + ["isamplerBuffer"] = "keyword2", + ["usamplerBuffer"] = "keyword2", + + ["image1D"] = "keyword2", + ["iimage1D"] = "keyword2", + ["uimage1D"] = "keyword2", + ["image1DArray"] = "keyword2", + ["iimage1DArray"] = "keyword2", + ["uimage1DArray"] = "keyword2", + ["image2D"] = "keyword2", + ["iimage2D"] = "keyword2", + ["uimage2D"] = "keyword2", + ["image2DArray"] = "keyword2", + ["iimage2DArray"] = "keyword2", + ["uimage2DArray"] = "keyword2", + ["image2DRect"] = "keyword2", + ["iimage2DRect"] = "keyword2", + ["uimage2DRect"] = "keyword2", + ["image2DMS"] = "keyword2", + ["iimage2DMS"] = "keyword2", + ["uimage2DMS"] = "keyword2", + ["image2DMSArray"] = "keyword2", + ["iimage2DMSArray"]= "keyword2", + ["uimage2DMSArray"]= "keyword2", + ["image3D"] = "keyword2", + ["iimage3D"] = "keyword2", + ["uimage3D"] = "keyword2", + ["imageCube"] = "keyword2", + ["iimageCube"] = "keyword2", + ["uimageCube"] = "keyword2", + ["imageCubeArray"] = "keyword2", + ["iimageCubeArray"]= "keyword2", + ["uimageCubeArray"]= "keyword2", + ["imageBuffer"] = "keyword2", + ["iimageBuffer"] = "keyword2", + ["uimageBuffer"] = "keyword2", + + ["atomic_uint"] = "keyword2", + + ["radians"] = "keyword", + ["degrees"] = "keyword", + ["sin"] = "keyword", + ["cos"] = "keyword", + ["tan"] = "keyword", + ["asin"] = "keyword", + ["acos"] = "keyword", + ["atan"] = "keyword", + ["sinh"] = "keyword", + ["cosh"] = "keyword", + ["tanh"] = "keyword", + ["asinh"] = "keyword", + ["acosh"] = "keyword", + ["pow"] = "keyword", + ["exp"] = "keyword", + ["exp2"] = "keyword", + ["log2"] = "keyword", + ["sqrt"] = "keyword", + ["inversesqrt"] = "keyword", + ["abs"] = "keyword", + ["sign"] = "keyword", + ["floor"] = "keyword", + ["trunc"] = "keyword", + ["round"] = "keyword", + ["roundEven"] = "keyword", + ["ceil"] = "keyword", + ["fract"] = "keyword", + ["mod"] = "keyword", + ["modf"] = "keyword", + ["min"] = "keyword", + ["max"] = "keyword", + ["clamp"] = "keyword", + ["mix"] = "keyword", + ["step"] = "keyword", + ["smoothstep"] = "keyword", + ["isnan"] = "keyword", + ["isinf"] = "keyword", + ["floatBitsToInt"] = "keyword", + ["floatBitsToUint"] = "keyword", + ["intBitsToFloat"] = "keyword", + ["uintBitsToFloat"] = "keyword", + ["fma"] = "keyword", + ["frexp"] = "keyword", + ["ldexp"] = "keyword", + ["packUnorm2x16"] = "keyword", + ["packSnorm2x16"] = "keyword", + ["packUnorm4x8"] = "keyword", + ["packSnorm4x8"] = "keyword", + ["unpackUnorm2x16"] = "keyword", + ["unpackSnorm2x16"] = "keyword", + ["unpackUnorm4x8"] = "keyword", + ["unpackSnorm4x8"] = "keyword", + ["packHalf2x16"] = "keyword", + ["unpackHalf2x16"] = "keyword", + ["packDouble2x32"] = "keyword", + ["unpackDouble2x32"] = "keyword", + ["length"] = "keyword", + ["distance"] = "keyword", + ["dot"] = "keyword", + ["cross"] = "keyword", + ["normalize"] = "keyword", + ["ftransform"] = "keyword", + ["faceforward"] = "keyword", + ["reflect"] = "keyword", + ["refract"] = "keyword", + ["matrixCompMult"] = "keyword", + ["outerProduct"] = "keyword", + ["transpose"] = "keyword", + ["determinant"] = "keyword", + ["inverse"] = "keyword", + ["lessThan"] = "keyword", + ["lessThanEqual"] = "keyword", + ["greaterThan"] = "keyword", + ["greaterThanEqual"] = "keyword", + ["equal"] = "keyword", + ["notEqual"] = "keyword", + ["any"] = "keyword", + ["all"] = "keyword", + ["not"] = "keyword", + ["uaddCarry"] = "keyword", + ["usubBorrow"] = "keyword", + ["umulExtended"] = "keyword", + ["imulExtended"] = "keyword", + ["bitfieldExtract"] = "keyword", + ["bitfieldInsert"] = "keyword", + ["bitfieldReverse"] = "keyword", + ["bitCount"] = "keyword", + ["findLSB"] = "keyword", + ["findMSB"] = "keyword", + ["textureSize"] = "keyword", + ["textureQueryLod"] = "keyword", + ["textureQueryLevels"] = "keyword", + ["textureSamples"] = "keyword", + ["texture"] = "keyword", + ["textureProj"] = "keyword", + ["textureLod"] = "keyword", + ["textureOffset"] = "keyword", + ["texelFetch"] = "keyword", + ["texelFetchOffset"] = "keyword", + ["textureProjOffset"] = "keyword", + ["textureLodOffset"] = "keyword", + ["textureProjLod"] = "keyword", + ["textureProjLodOffset"] = "keyword", + ["textureGrad"] = "keyword", + ["textureGradOffset"] = "keyword", + ["textureProjGrad"] = "keyword", + ["textureProjGradOffset"]= "keyword", + ["textureGather"] = "keyword", + ["textureGatherOffset"] = "keyword", + ["textureGatherOffsets"] = "keyword", + + --Atomic Counter Functions + ["atomicCounterIncrement"]= "keyword", + ["atomicCounterDecrement"]= "keyword", + ["atomicCounter"] = "keyword", + ["atomicCounterAdd"] = "keyword", + ["atomicCounterSubtract"] = "keyword", + ["atomicCounterMin"] = "keyword", + ["atomicCounterMax"] = "keyword", + ["atomicCounterAnd"] = "keyword", + ["atomicCounterOr"] = "keyword", + ["atomicCounterXor"] = "keyword", + ["atomicCounterExchange"] = "keyword", + ["atomicCounterCompSwap"] = "keyword", + --Atomic Memory Functions + ["atomicAdd"] = "keyword", + ["atomicMin"] = "keyword", + ["atomicMax"] = "keyword", + ["atomicAnd"] = "keyword", + ["atomicOr"] = "keyword", + ["atomicXor"] = "keyword", + ["atomicExchange"]= "keyword", + ["atomicCompSwap"]= "keyword", + --Image Functions + ["imageSize"] = "keyword", + ["imageSamples"] = "keyword", + ["imageLoad"] = "keyword", + ["imageStore"] = "keyword", + ["imageAtomicAdd"] = "keyword", + ["imageAtomicMin"] = "keyword", + ["imageAtomicMax"] = "keyword", + ["imageAtomicAnd"] = "keyword", + ["imageAtomicOr"] = "keyword", + ["imageAtomicXor"] = "keyword", + ["imageAtomicExchange"]= "keyword", + ["imageAtomicCompSwap"]= "keyword", + --Geometry Shader Functions + ["EmitStreamVertex"] = "keyword", + ["EndStreamPrimitive"] = "keyword", + ["EmitVertex"] = "keyword", + ["EndPrimitive"] = "keyword", + --Fragment Processing Functions + ["dFdx"] = "keyword", + ["dFdy"] = "keyword", + ["dFdxFine"] = "keyword", + ["dFdyFine"] = "keyword", + ["dFdxCoarse"] = "keyword", + ["dFdyCoarse"] = "keyword", + ["fwidth"] = "keyword", + ["fwidthFine"] = "keyword", + ["fwidthCoarse"] = "keyword", + ["interpolateAtCentroid"]= "keyword", + ["interpolateAtSample"] = "keyword", + ["interpolateAtOffset"] = "keyword", + --Shader Invocation Control Functions + ["barrier"] = "keyword", + --Shader Memory Control Functions + ["memoryBarrier"] = "keyword", + ["memoryBarrierAtomicCounter"]= "keyword", + ["memoryBarrierBuffer"] = "keyword", + ["memoryBarrierShared"] = "keyword", + ["memoryBarrierImage"] = "keyword", + ["groupMemoryBarrier"] = "keyword", + --Subpass-Input Functions + ["subpassLoad"] = "keyword", + --Shader Invocation Group Functions + ["anyInvocation"] = "keyword", + ["allInvocations"] = "keyword", + ["allInvocationsEqual"]= "keyword", + + --"In addition, when targeting Vulkan, the following keywords also exist:" + ["texture1D"] = "keyword", + ["texture1DArray"] = "keyword", + ["itexture1D"] = "keyword", + ["itexture1DArray"] = "keyword", + ["utexture1D"] = "keyword", + ["utexture1DArray"] = "keyword", + ["texture2D"] = "keyword", + ["texture2DArray"] = "keyword", + ["itexture2D"] = "keyword", + ["itexture2DArray"] = "keyword", + ["utexture2D"] = "keyword", + ["utexture2DArray"] = "keyword", + ["texture2DRect"] = "keyword", + ["itexture2DRect"] = "keyword", + ["utexture2DRect"] = "keyword", + ["texture2DMS"] = "keyword", + ["itexture2DMS"] = "keyword", + ["utexture2DMS"] = "keyword", + ["texture2DMSArray"] = "keyword", + ["itexture2DMSArray"]= "keyword", + ["utexture2DMSArray"]= "keyword", + ["texture3D"] = "keyword", + ["itexture3D"] = "keyword", + ["utexture3D"] = "keyword", + ["textureCube"] = "keyword", + ["itextureCube"] = "keyword", + ["utextureCube"] = "keyword", + ["textureCubeArray"] = "keyword", + ["itextureCubeArray"]= "keyword", + ["utextureCubeArray"]= "keyword", + ["textureBuffer"] = "keyword", + ["itextureBuffer"] = "keyword", + ["utextureBuffer"] = "keyword", + ["sampler"] = "keyword2", + ["samplerShadow"] = "keyword2", + ["subpassInput"] = "keyword2", + ["isubpassInput"] = "keyword2", + ["usubpassInput"] = "keyword2", + ["subpassInputMS"] = "keyword2", + ["isubpassInputMS"] = "keyword2", + ["usubpassInputMS"] = "keyword2", }, } - diff --git a/tools/editor/art/lite/data/languages/language_hlsl.lua b/tools/editor/art/lite/data/languages/language_hlsl.lua new file mode 100644 index 0000000..3debf3e --- /dev/null +++ b/tools/editor/art/lite/data/languages/language_hlsl.lua @@ -0,0 +1,274 @@ + +local style = require "core.style" +local common = require "core.common" + +local syntax = require "core.syntax" + +syntax.add { + files = { "%.hlsl$", }, + comment = "//", + patterns = { + { pattern = "//.-\n", type = "comment" }, + { pattern = { "/%*", "%*/" }, type = "comment" }, + { pattern = { "#", "[^\\]\n" }, type = "comment" }, + { pattern = { '"', '"', '\\' }, type = "string" }, + { pattern = { "'", "'", '\\' }, type = "string" }, + { pattern = "-?0x%x+", type = "number" }, + { pattern = "-?%d+[%d%.eE]*f?", type = "number" }, + { pattern = "-?%.?%d+f?", type = "number" }, + { pattern = "[%+%-=/%*%^%%<>!~|&]", type = "operator" }, + + { pattern = "int[1-9]x[1-9]", type = "keyword2" }, + { pattern = "int1[0-6]x[1-9]", type = "keyword2" }, + { pattern = "int[1-9]x1[0-6]", type = "keyword2" }, + { pattern = "int1[0-6]x1[0-6]", type = "keyword2" }, + { pattern = "int[1-4]", type = "keyword2" }, + + { pattern = "uint[1-9]x[1-9]", type = "keyword2" }, + { pattern = "uint1[0-6]x[1-9]", type = "keyword2" }, + { pattern = "uint[1-9]x1[0-6]", type = "keyword2" }, + { pattern = "uint1[0-6]x1[0-6]", type = "keyword2" }, + { pattern = "uint[1-4]", type = "keyword2" }, + + { pattern = "dword[1-9]x[1-9]", type = "keyword2" }, + { pattern = "dword1[0-6]x[1-9]", type = "keyword2" }, + { pattern = "dword[1-9]x1[0-6]", type = "keyword2" }, + { pattern = "dword1[0-6]x1[0-6]", type = "keyword2" }, + { pattern = "dword[1-4]", type = "keyword2" }, + + { pattern = "half[1-9]x[1-9]", type = "keyword2" }, + { pattern = "half1[0-6]x[1-9]", type = "keyword2" }, + { pattern = "half[1-9]x1[0-6]", type = "keyword2" }, + { pattern = "half1[0-6]x1[0-6]", type = "keyword2" }, + { pattern = "half[1-4]", type = "keyword2" }, + + { pattern = "float[1-9]x[1-9]", type = "keyword2" }, + { pattern = "float1[0-6]x[1-9]", type = "keyword2" }, + { pattern = "float[1-9]x1[0-6]", type = "keyword2" }, + { pattern = "float1[0-6]x1[0-6]", type = "keyword2" }, + { pattern = "float[1-4]", type = "keyword2" }, + + { pattern = "double[1-9]x[1-9]", type = "keyword2" }, + { pattern = "double1[0-6]x[1-9]", type = "keyword2" }, + { pattern = "double[1-9]x1[0-6]", type = "keyword2" }, + { pattern = "double1[0-6]x1[0-6]", type = "keyword2" }, + { pattern = "double[1-4]", type = "keyword2" }, + + { pattern = "[%a_][%w_]*%f[(]", type = "function" }, + { pattern = "[%a_][%w_]*", type = "symbol" }, + }, + symbols = { + --https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/dx-graphics-hlsl-appendix-keywords + --The symbols are added in the order they appear on this webpage, which is alphabetically + ["AppendStructuredBuffer"]= "keyword", + ["asm"] = "keyword", + ["asm_fragment"] = "keyword", + ["BlendState"] = "keyword2", + ["bool"] = "keyword2", + ["break"] = "keyword", + ["Buffer"] = "keyword2", + ["ByteAddressBuffer"]= "keyword2", + ["case"] = "keyword", + ["cbuffer"] = "keyword2", + ["centroid"] = "keyword2", + ["class"] = "keyword", + ["column_major"] = "keyword", + ["compile"] = "keyword", + ["compile_fragment"] = "keyword", + ["CompileShader"] = "keyword", + ["const"] = "keyword", + ["continue"] = "keyword", + ["ComputeShader"] = "keyword", + ["ConsumeStructuredBuffer"]= "keyword", + ["default"] = "keyword", + ["DepthStencilState"]= "keyword", + ["DepthStencilView"] = "keyword", + ["discard"] = "keyword", + ["do"] = "keyword", + ["double"] = "keyword2", + ["DomainShader"] = "keyword2", + ["dword"] = "keyword2", + ["else"] = "keyword", + ["export"] = "keyword", + ["extern"] = "keyword", + ["false"] = "literal", + ["float"] = "keyword2", + ["for"] = "keyword", + ["fxgroup"] = "keyword2", + ["GeometryShader"] = "keyword2", + ["groupshared"] = "keyword", + ["half"] = "keyword2", + ["HullShader"] = "keyword2", + ["if"] = "keyword", + ["in"] = "keyword", + ["inline"] = "keyword", + ["inout"] = "keyword", + ["InputPatch"] = "keyword2", + ["int"] = "keyword2", + ["interface"] = "keyword", + ["line"] = "keyword2", + ["lineadj"] = "keyword2", + ["linear"] = "keyword", + ["LineStream"] = "keyword2", + ["matrix"] = "keyword2", + ["min16float"] = "keyword2", + ["min10float"] = "keyword2", + ["min16int"] = "keyword2", + ["min12int"] = "keyword2", + ["min16uint"] = "keyword2", + ["namespace"] = "keyword", + ["nointerpolation"] = "keyword", + ["noperspective"] = "keyword", + ["NULL"] = "literal", + ["out"] = "keyword", + ["OutputPatch"] = "keyword2", + ["packoffset"] = "keyword", + ["pass"] = "keyword", + ["pixelfragment"] = "keyword", + ["PixelShader"] = "keyword2", + ["point"] = "keyword2", + ["PointStream"] = "keyword2", + ["precise"] = "keyword", + ["RasterizerState"] = "keyword2", + ["RenderTargetView"] = "keyword2", + ["return"] = "keyword", + ["register"] = "keyword", + ["row_major"] = "keyword", + ["RWBuffer"] = "keyword2", + ["RWByteAddressBuffer"]= "keyword2", + ["RWStructuredBuffer"]= "keyword2", + ["RWTexture1D"] = "keyword2", + ["RWTexture1DArray"] = "keyword2", + ["RWTexture2D"] = "keyword2", + ["RWTexture2DArray"] = "keyword2", + ["RWTexture3D"] = "keyword2", + ["sample"] = "keyword", + ["sampler"] = "keyword2", + ["SamplerState"] = "keyword2", + ["SamplerComparisonState"]= "keyword2", + ["shared"] = "keyword", + ["snorm"] = "keyword", + ["stateblock"] = "keyword", + ["stateblock_state"] = "keyword", + ["static"] = "keyword", + ["string"] = "keyword2", + ["struct"] = "keyword", + ["switch"] = "keyword", + ["StructuredBuffer"] = "keyword2", + ["tbuffer"] = "keyword2", + ["technique"] = "keyword2", + ["technique10"] = "keyword2", + ["technique11"] = "keyword2", + ["texture"] = "keyword2", + ["Texture1D"] = "keyword2", + ["Texture1DArray"] = "keyword2", + ["Texture2D"] = "keyword2", + ["Texture2DArray"] = "keyword2", + ["Texture2DMS"] = "keyword2", + ["Texture2DMSArray"] = "keyword2", + ["Texture3D"] = "keyword2", + ["TextureCube"] = "keyword2", + ["TextureCubeArray"] = "keyword2", + ["true"] = "literal", + ["typedef"] = "keyword", + ["triangle"] = "keyword2", + ["triangleadj"] = "keyword2", + ["TriangleStream"] = "keyword2", + ["uint"] = "keyword2", + ["uniform"] = "keyword", + ["unorm"] = "keyword", + ["unsigned"] = "keyword", + ["vector"] = "keyword2", + ["vertexfragment"] = "keyword2", + ["VertexShader"] = "keyword2", + ["void"] = "keyword", + ["volatile"] = "keyword", + ["while"] = "keyword", + + --https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/dx-graphics-hlsl-intrinsic-functions + --The symbols are added in the order they appear on this webpage, which is alphabetically + ["abort"] = "keyword", + ["abs"] = "keyword", + ["acos"] = "keyword", + ["all"] = "keyword", + ["any"] = "keyword", + ["asdouble"] = "keyword", + ["asfloat"] = "keyword", + ["asin"] = "keyword", + ["asint"] = "keyword", + ["asuint"] = "keyword", + ["atan"] = "keyword", + ["atan2"] = "keyword", + ["ceil"] = "keyword", + ["clamp"] = "keyword", + ["clip"] = "keyword", + ["cos"] = "keyword", + ["cosh"] = "keyword", + ["countbits"] = "keyword", + ["cross"] = "keyword", + ["ddx"] = "keyword", + ["ddx_coarse"] = "keyword", + ["ddx_fine"] = "keyword", + ["ddy"] = "keyword", + ["ddy_coarse"] = "keyword", + ["ddy_fine"] = "keyword", + ["degrees"] = "keyword", + ["determinant"] = "keyword", + ["distance"] = "keyword", + ["dot"] = "keyword", + ["dst"] = "keyword", + ["errorf"] = "keyword", + ["exp"] = "keyword", + ["exp2"] = "keyword", + ["f16tof32"] = "keyword", + ["f32tof16"] = "keyword", + ["faceforward"] = "keyword", + ["firstbithigh"]= "keyword", + ["firstbitlow"] = "keyword", + ["floor"] = "keyword", + ["fma"] = "keyword", + ["fmod"] = "keyword", + ["frac"] = "keyword", + ["frexp"] = "keyword", + ["fwidth"] = "keyword", + ["isfinite"] = "keyword", + ["isinf"] = "keyword", + ["isnan"] = "keyword", + ["ldexp"] = "keyword", + ["length"] = "keyword", + ["lerp"] = "keyword", + ["lit"] = "keyword", + ["log"] = "keyword", + ["log10"] = "keyword", + ["log2"] = "keyword", + ["mad"] = "keyword", + ["max"] = "keyword", + ["min"] = "keyword", + ["modf"] = "keyword", + ["msad4"] = "keyword", + ["mul"] = "keyword", + ["noise"] = "keyword", + ["normalize"] = "keyword", + ["pow"] = "keyword", + ["printf"] = "keyword", + ["radians"] = "keyword", + ["rcp"] = "keyword", + ["reflect"] = "keyword", + ["refract"] = "keyword", + ["reversebits"] = "keyword", + ["round"] = "keyword", + ["rsqrt"] = "keyword", + ["saturate"] = "keyword", + ["sign"] = "keyword", + ["sin"] = "keyword", + ["sincos"] = "keyword", + ["sinh"] = "keyword", + ["smoothstep"] = "keyword", + ["sqrt"] = "keyword", + ["step"] = "keyword", + ["tan"] = "keyword", + ["tanh"] = "keyword", + ["transpose"] = "keyword", + ["trunc"] = "keyword", + }, +} diff --git a/tools/editor/art/lite/data/languages/language_moon.lua b/tools/editor/art/lite/data/languages/language_moon.lua new file mode 100644 index 0000000..225b58b --- /dev/null +++ b/tools/editor/art/lite/data/languages/language_moon.lua @@ -0,0 +1,60 @@ +local syntax = require "core.syntax" + +syntax.add { + files = "%.moon$", + headers = "^#!.*[ /]moon", + comment = "--", + patterns = { + { pattern = { '"', '"', '\\' }, type = "string" }, + { pattern = { "'", "'", '\\' }, type = "string" }, + { pattern = { "%[%[", "%]%]" }, type = "string" }, + { pattern = "%-%-.-\n", type = "comment" }, + { pattern = "-?0x%x+", type = "number" }, + { pattern = "-?%d+[%d%.eE]*", type = "number" }, + { pattern = "-?%.?%d+", type = "number" }, + { pattern = "%.%.%.?", type = "keyword2" }, + { pattern = "[<>~=]=", type = "keyword2" }, + { pattern = "[%+%-=/%*%^%%#<>]", type = "keyword2" }, + { pattern = "[%a_][%w_]*%s*%f[(\"{]", type = "function" }, + { pattern = "[%a_][%w_]*", type = "symbol" }, + { pattern = {"\\", "[%a_][%w_]*"}, type = "function" }, + { pattern = {"%.", "[%a_][%w_]*"}, type = "function" }, + { pattern = {"@", "[%a_][%w_]*"}, type = "keyword2" }, + { pattern = "!", type = "keyword2" }, + { pattern = "[%p]", type = "keyword" }, + }, + symbols = { + ["if"] = "keyword", + ["then"] = "keyword", + ["else"] = "keyword", + ["when"] = "keyword", + ["elseif"] = "keyword", + ["do"] = "keyword", + ["->"] = "keyword", + ["while"] = "keyword", + ["for"] = "keyword", + ["break"] = "keyword", + ["continue"] = "keyword", + ["export"] = "keyword", + ["unless"] = "keyword", + ["return"] = "keyword", + ["in"] = "keyword", + ["not"] = "keyword", + ["and"] = "keyword", + ["or"] = "keyword", + ["import"] = "keyword", + ["as"] = "keyword", + ["from"] = "keyword", + ["class"] = "keyword", + ["extends"] = "keyword", + ["switch"] = "keyword", + ["with"] = "keyword", + ["using"] = "keyword", + ["super"] = "keyword2", + ["self"] = "keyword2", + ["#"] = "keyword2", + ["true"] = "literal", + ["false"] = "literal", + ["nil"] = "literal", + }, +} diff --git a/tools/editor/art/lite/data/languages/language_nim.lua b/tools/editor/art/lite/data/languages/language_nim.lua new file mode 100644 index 0000000..3914add --- /dev/null +++ b/tools/editor/art/lite/data/languages/language_nim.lua @@ -0,0 +1,120 @@ +local syntax = require "core.syntax" + +local patterns = {} + +local symbols = { + ["nil"] = "literal", + ["true"] = "literal", + ["false"] = "literal", +} + +local number_patterns = { + "0[bB][01][01_]*", + "0o[0-7][0-7_]*", + "0[xX]%x[%x_]*", + "%d[%d_]*%.%d[%d_]*[eE][-+]?%d[%d_]*", + "%d[%d_]*%.%d[%d_]*", + "%d[%d_]*", +} + +local type_suffix_patterns = {} + +for _, size in ipairs({"", "8", "16", "32", "64"}) do + table.insert(type_suffix_patterns, "'?[fuiFUI]"..size) +end + +for _, pattern in ipairs(number_patterns) do + for _, suffix in ipairs(type_suffix_patterns) do + table.insert(patterns, { pattern = pattern..suffix, type = "literal" }) + end + table.insert(patterns, { pattern = pattern, type = "literal" }) +end + +local keywords = { + "addr", "and", "as", "asm", + "bind", "block", "break", + "case", "cast", "concept", "const", "continue", "converter", + "defer", "discard", "distinct", "div", "do", + "elif", "else", "end", "enum", "except", "export", + "finally", "for", "from", "func", + "if", "import", "in", "include", "interface", "is", "isnot", "iterator", + "let", + "macro", "method", "mixin", "mod", + "not", "notin", + "object", "of", "or", "out", + "proc", "ptr", + "raise", "ref", "return", + "shl", "shr", "static", + "template", "try", "tuple", "type", + "using", + "var", + "when", "while", + "xor", + "yield", +} + +for _, keyword in ipairs(keywords) do + symbols[keyword] = "keyword" +end + +local standard_types = { + "bool", "byte", + "int", "int8", "int16", "int32", "int64", + "uint", "uint8", "uint16", "uint32", "uint64", + "float", "float32", "float64", + "char", "string", "cstring", + "pointer", + "typedesc", + "void", "auto", "any", + "untyped", "typed", + "clong", "culong", "cchar", "cschar", "cshort", "cint", "csize", "csize_t", + "clonglong", "cfloat", "cdouble", "clongdouble", "cuchar", "cushort", + "cuint", "culonglong", "cstringArray", +} + +for _, type in ipairs(standard_types) do + symbols[type] = "keyword2" +end + +local standard_generic_types = { + "range", + "array", "open[aA]rray", "varargs", "seq", "set", + "sink", "lent", "owned", +} + +for _, type in ipairs(standard_generic_types) do + table.insert(patterns, { pattern = type.."%f[%[]", type = "keyword2" }) + table.insert(patterns, { pattern = type.." +%f[%w]", type = "keyword2" }) +end + +local user_patterns = { + -- comments + { pattern = { "##?%[", "]##?" }, type = "comment" }, + { pattern = "##?.-\n", type = "comment" }, + -- strings and chars + { pattern = { '"', '"', '\\' }, type = "string" }, + { pattern = { '"""', '"""[^"]' }, type = "string" }, + { pattern = { "'", "'", '\\' }, type = "literal" }, + -- function calls + { pattern = "[a-zA-Z][a-zA-Z0-9_]*%f[(]", type = "function" }, + -- identifiers + { pattern = "[A-Z][a-zA-Z0-9_]*", type = "keyword2" }, + { pattern = "[a-zA-Z][a-zA-Z0-9_]*", type = "symbol" }, + -- operators + { pattern = "%.%f[^.]", type = "normal" }, + { pattern = ":%f[ ]", type = "normal" }, + { pattern = "[=+%-*/<>@$~&%%|!?%^&.:\\]+", type = "operator" }, +} + +for _, pattern in ipairs(user_patterns) do + table.insert(patterns, pattern) +end + +local nim = { + files = { "%.nim$", "%.nims$", "%.nimble$" }, + comment = "#", + patterns = patterns, + symbols = symbols, +} + +syntax.add(nim) \ No newline at end of file diff --git a/tools/editor/art/lite/data/languages/language_odin.lua b/tools/editor/art/lite/data/languages/language_odin.lua new file mode 100644 index 0000000..ccd53db --- /dev/null +++ b/tools/editor/art/lite/data/languages/language_odin.lua @@ -0,0 +1,43 @@ +local syntax = require "core.syntax" + +syntax.add { + files = { "%.wren$" }, + comment = "//", + patterns = { + { pattern = "//.-\n", type = "comment" }, + { pattern = { "/%*", "%*/" }, type = "comment" }, + { pattern = { '"', '"', '\\' }, type = "string" }, + { pattern = { "'", "'", '\\' }, type = "string" }, + { pattern = "-?%.?%d+", type = "number" }, + { pattern = "%.%.%.?", type = "operator" }, + { pattern = "[<>!=]=", type = "operator" }, + { pattern = "[%+%-=/%*%^%%<>!~|&?:]", type = "operator" }, + { pattern = "[%a_][%w_]*%s*%f[(\"{]", type = "function" }, + { pattern = "[%a_][%w_]*", type = "symbol" }, + }, + symbols = { + ["break"] = "keyword", + ["class"] = "keyword", + ["construct"] = "keyword", + ["else"] = "keyword", + ["false"] = "keyword", + ["for"] = "keyword", + ["foreign"] = "keyword", + ["if"] = "keyword", + ["import"] = "keyword", + ["in"] = "keyword", + ["is"] = "keyword", + ["null"] = "keyword", + ["return"] = "keyword", + ["static"] = "keyword", + ["super"] = "keyword", + ["this"] = "keyword", + ["true"] = "keyword", + ["var"] = "keyword", + ["while"] = "keyword", + ["this"] = "keyword2", + ["true"] = "literal", + ["false"] = "literal", + ["null"] = "literal", + }, +} \ No newline at end of file diff --git a/tools/editor/art/lite/data/languages/language_teal.lua b/tools/editor/art/lite/data/languages/language_teal.lua new file mode 100644 index 0000000..e249b14 --- /dev/null +++ b/tools/editor/art/lite/data/languages/language_teal.lua @@ -0,0 +1,55 @@ +local syntax = require "core.syntax" + +syntax.add { + files = {"%.tl$","%.d.tl$"}, + comment = "--", + patterns = { + { pattern = { '"', '"', '\\' }, type = "string" }, + { pattern = { "'", "'", '\\' }, type = "string" }, + { pattern = { "%[%[", "%]%]" }, type = "string" }, + { pattern = { "%-%-%[%[", "%]%]"}, type = "comment" }, + { pattern = "%-%-.-\n", type = "comment" }, + { pattern = "-?0x%x+", type = "number" }, + { pattern = "-?%d+[%d%.eE]*", type = "number" }, + { pattern = "-?%.?%d+", type = "number" }, + { pattern = "<%a+>", type = "keyword2" }, + { pattern = "%.%.%.?", type = "operator" }, + { pattern = "[<>~=]=", type = "operator" }, + { pattern = "[%+%-=/%*%^%%#<>]", type = "operator" }, + { pattern = "[%a_][%w_]*%s*%f[(\"{]", type = "function" }, + { pattern = "[%a_][%w_]*", type = "symbol" }, + { pattern = "::[%a_][%w_]*::", type = "function" }, + }, + symbols = { + ["if"] = "keyword", + ["then"] = "keyword", + ["else"] = "keyword", + ["elseif"] = "keyword", + ["end"] = "keyword", + ["do"] = "keyword", + ["function"] = "keyword", + ["repeat"] = "keyword", + ["until"] = "keyword", + ["while"] = "keyword", + ["for"] = "keyword", + ["break"] = "keyword", + ["return"] = "keyword", + ["local"] = "keyword", + ["global"] = "keyword", + ["in"] = "keyword", + ["not"] = "keyword", + ["and"] = "keyword", + ["or"] = "keyword", + ["goto"] = "keyword", + ["enum"] = "keyword", + ["record"] = "keyword", + ["any"] = "keyword2", + ["boolean"] = "keyword2", + ["number"] = "keyword2", + ["string"] = "keyword2", + ["thread"] = "keyword2", + ["true"] = "literal", + ["false"] = "literal", + ["nil"] = "literal", + }, +} \ No newline at end of file diff --git a/tools/editor/art/lite/data/languages/language_ts.lua b/tools/editor/art/lite/data/languages/language_ts.lua new file mode 100644 index 0000000..282cf09 --- /dev/null +++ b/tools/editor/art/lite/data/languages/language_ts.lua @@ -0,0 +1,86 @@ +local syntax = require "core.syntax" + +syntax.add { + files = { "%.ts$", "%.d.ts$", "%.tsx$"}, + comment = "//", + patterns = { + { pattern = "//.-\n", type = "comment" }, + { pattern = { "/%*", "%*/" }, type = "comment" }, + { pattern = { '"', '"', '\\' }, type = "string" }, + { pattern = { "'", "'", '\\' }, type = "string" }, + { pattern = { "`", "`", '\\' }, type = "string" }, + { pattern = "0x[%da-fA-F]+", type = "number" }, + { pattern = "-?%d+[%d%.eE]*", type = "number" }, + { pattern = "-?%.?%d+", type = "number" }, + { pattern = "[%+%-=/%*%^%%<>!~|&]", type = "operator" }, + { pattern = "[%a_][%w_]*%f[(]", type = "function" }, + { pattern = "[%a_][%w_]*", type = "symbol" }, + }, + symbols = { + ["any"] = "keyword2", + ["arguments"] = "keyword2", + ["as"] = "keyword2", + ["async"] = "keyword", + ["await"] = "keyword", + ["boolean"] = "keyword2", + ["break"] = "keyword", + ["case"] = "keyword", + ["catch"] = "keyword", + ["class"] = "keyword", + ["const"] = "keyword", + ["constructor"]= "keyword2", + ["continue"] = "keyword", + ["debugger"] = "keyword", + ["declare"] = "keyword2", + ["default"] = "keyword", + ["delete"] = "keyword", + ["do"] = "keyword", + ["else"] = "keyword", + ["enum"] = "keyword2", + ["export"] = "keyword", + ["extends"] = "keyword", + ["false"] = "literal", + ["finally"] = "keyword", + ["for"] = "keyword", + ["from"] = "keyword", + ["function"] = "keyword", + ["get"] = "keyword", + ["if"] = "keyword", + ["implements"] = "keyword2", + ["import"] = "keyword", + ["in"] = "keyword", + ["Infinity"] = "keyword2", + ["instanceof"] = "keyword", + ["interface"] = "keyword2", + ["let"] = "keyword", + ["module"] = "keyword2", + ["new"] = "keyword", + ["null"] = "literal", + ["number"] = "keyword2", + ["of"] = "keyword2", + ["package"] = "keyword2", + ["private"] = "keyword2", + ["protected"] = "keyword2", + ["public"] = "keyword2", + ["require"] = "keyword2", + ["return"] = "keyword", + ["set"] = "keyword", + ["static"] = "keyword", + ["string"] = "keyword2", + ["super"] = "keyword", + ["switch"] = "keyword", + ["symbol"] = "keyword2", + ["this"] = "keyword2", + ["throw"] = "keyword", + ["true"] = "literal", + ["try"] = "keyword", + ["type"] = "keyword2", + ["typeof"] = "keyword", + ["undefined"] = "literal", + ["var"] = "keyword", + ["void"] = "keyword", + ["while"] = "keyword", + ["with"] = "keyword", + ["yield"] = "keyword", + }, +} \ No newline at end of file diff --git a/tools/editor/art/lite/data/languages/language_wren.lua b/tools/editor/art/lite/data/languages/language_wren.lua new file mode 100644 index 0000000..ccd53db --- /dev/null +++ b/tools/editor/art/lite/data/languages/language_wren.lua @@ -0,0 +1,43 @@ +local syntax = require "core.syntax" + +syntax.add { + files = { "%.wren$" }, + comment = "//", + patterns = { + { pattern = "//.-\n", type = "comment" }, + { pattern = { "/%*", "%*/" }, type = "comment" }, + { pattern = { '"', '"', '\\' }, type = "string" }, + { pattern = { "'", "'", '\\' }, type = "string" }, + { pattern = "-?%.?%d+", type = "number" }, + { pattern = "%.%.%.?", type = "operator" }, + { pattern = "[<>!=]=", type = "operator" }, + { pattern = "[%+%-=/%*%^%%<>!~|&?:]", type = "operator" }, + { pattern = "[%a_][%w_]*%s*%f[(\"{]", type = "function" }, + { pattern = "[%a_][%w_]*", type = "symbol" }, + }, + symbols = { + ["break"] = "keyword", + ["class"] = "keyword", + ["construct"] = "keyword", + ["else"] = "keyword", + ["false"] = "keyword", + ["for"] = "keyword", + ["foreign"] = "keyword", + ["if"] = "keyword", + ["import"] = "keyword", + ["in"] = "keyword", + ["is"] = "keyword", + ["null"] = "keyword", + ["return"] = "keyword", + ["static"] = "keyword", + ["super"] = "keyword", + ["this"] = "keyword", + ["true"] = "keyword", + ["var"] = "keyword", + ["while"] = "keyword", + ["this"] = "keyword2", + ["true"] = "literal", + ["false"] = "literal", + ["null"] = "literal", + }, +} \ No newline at end of file diff --git a/tools/editor/art/lite/data/plugins/closeconfirmx.lua b/tools/editor/art/lite/data/plugins/closeconfirmx.lua new file mode 100644 index 0000000..e623c9f --- /dev/null +++ b/tools/editor/art/lite/data/plugins/closeconfirmx.lua @@ -0,0 +1,53 @@ +-- CloseConfirmX plugin for lite text editor +-- implementation by chekoopa + +local core = require "core" +local config = require "core.config" + +config.closeconfirmx_use_legacy = false +config.closeconfirmx_use_short_name = true + +local legacy_confirm = core.confirm_close_all + +local function commandful_confirm() + local dirty_count = 0 + local dirty_name + for _, doc in ipairs(core.docs) do + if doc:is_dirty() then + dirty_count = dirty_count + 1 + dirty_name = doc:get_name() + end + end + if dirty_count > 0 then + local text + if dirty_count == 1 then + if config.closeconfirmx_use_short_name then + dirty_name = dirty_name:match("[^/%\\]*$") + end + text = string.format("Unsaved changes in \"%s\"; Confirm Exit", dirty_name) + else + text = string.format("Unsaved changes in %d docs; Confirm Exit", dirty_count) + end + core.command_view:enter(text, function(_, item) + if item.text:match("^[cC]") then + core.quit(true) + end + end, function(text) + local items = {} + if not text:find("^[^sS]") then table.insert(items, "Stay here") end + if not text:find("^[^cC]") then table.insert(items, "Close Without Saving") end + return items + end) + -- as we delegate a choice inside the callback, + return false + end + return true +end + +function core.confirm_close_all() + if config.closeconfirmx_use_legacy then + return legacy_confirm() + else + return commandful_confirm() + end +end diff --git a/tools/editor/art/lite/data/plugins/colorpreview.lua b/tools/editor/art/lite/data/plugins/colorpreview.lua new file mode 100644 index 0000000..57421d6 --- /dev/null +++ b/tools/editor/art/lite/data/plugins/colorpreview.lua @@ -0,0 +1,54 @@ +local common = require "core.common" +local DocView = require "core.docview" + + +local white = { common.color "#ffffff" } +local black = { common.color "#000000" } +local tmp = {} + + +local function draw_color_previews(self, idx, x, y, ptn, base, nibbles) + local text = self.doc.lines[idx] + local s, e = 0, 0 + + while true do + s, e = text:find(ptn, e + 1) + if not s then break end + + local str = text:sub(s, e) + local r, g, b = str:match(ptn) + r, g, b = tonumber(r, base), tonumber(g, base), tonumber(b, base) + + -- #123 becomes #112233 + if nibbles then + r = r * 16 + g = g * 16 + b = b * 16 + end + + local x1 = x + self:get_col_x_offset(idx, s) + local x2 = x + self:get_col_x_offset(idx, e + 1) + local oy = self:get_line_text_y_offset() + + local text_color = math.max(r, g, b) < 128 and white or black + tmp[1], tmp[2], tmp[3] = r, g, b + + local l1, _, l2, _ = self.doc:get_selection(true) + + if not (self.doc:has_selection() and idx >= l1 and idx <= l2) then + renderer.draw_rect(x1, y, x2 - x1, self:get_line_height(), tmp) + renderer.draw_text(self:get_font(), str, x1, y + oy, text_color) + end + end +end + + +local draw_line_text = DocView.draw_line_text + +function DocView:draw_line_text(idx, x, y) + draw_line_text(self, idx, x, y) + draw_color_previews(self, idx, x, y, "#(%x%x)(%x%x)(%x%x)%f[%W]", 16) + draw_color_previews(self, idx, x, y, "#(%x)(%x)(%x)%f[%W]", 16, true) -- support #fff css format + draw_color_previews(self, idx, x, y, "rgb?%((%d+)%D+(%d+)%D+(%d+).-%)", 10) + draw_color_previews(self, idx, x, y, "rgba?%((%d+)%D+(%d+)%D+(%d+).-%)", 10) +end diff --git a/tools/editor/art/lite/data/plugins/gitstatus.lua b/tools/editor/art/lite/data/plugins/gitstatus.lua new file mode 100644 index 0000000..b0b827c --- /dev/null +++ b/tools/editor/art/lite/data/plugins/gitstatus.lua @@ -0,0 +1,68 @@ +local core = require "core" +local config = require "core.config" +local style = require "core.style" +local StatusView = require "core.statusview" + + +local git = { + branch = nil, + inserts = 0, + deletes = 0, +} + + +local function exec(cmd, wait) + local tempfile = core.temp_filename() + system.exec(string.format("%s > %q", cmd, tempfile)) + coroutine.yield(wait) + local fp = io.open(tempfile) + local res = fp:read("*a") + fp:close() + os.remove(tempfile) + return res +end + + +core.add_thread(function() + while true do + if system.get_file_info(".git") then + -- get branch name + git.branch = exec("git rev-parse --abbrev-ref HEAD", 1):match("[^\n]*") + + -- get diff + local line = exec("git diff --stat", 1):match("[^\n]*%s*$") + git.inserts = tonumber(line:match("(%d+) ins")) or 0 + git.deletes = tonumber(line:match("(%d+) del")) or 0 + + else + git.branch = nil + end + + coroutine.yield(config.project_scan_rate) + end +end) + + +local get_items = StatusView.get_items + +function StatusView:get_items() + if not git.branch then + return get_items(self) + end + local left, right = get_items(self) + + local t = { + style.dim, self.separator, + (git.inserts ~= 0 or git.deletes ~= 0) and style.accent or style.text, + git.branch, + style.dim, " ", + git.inserts ~= 0 and style.accent or style.text, "+", git.inserts, + style.dim, " / ", + git.deletes ~= 0 and style.accent or style.text, "-", git.deletes, + } + for _, item in ipairs(t) do + table.insert(right, item) + end + + return left, right +end diff --git a/tools/editor/art/lite/data/plugins/lfautoinsert.lua b/tools/editor/art/lite/data/plugins/lfautoinsert.lua new file mode 100644 index 0000000..0ea7b9d --- /dev/null +++ b/tools/editor/art/lite/data/plugins/lfautoinsert.lua @@ -0,0 +1,64 @@ +local core = require "core" +local command = require "core.command" +local config = require "core.config" +local keymap = require "core.keymap" + +config.lfautoinsert_map = { + ["{%s*\n"] = "}", + ["%(%s*\n"] = ")", + ["%f[[]%[%s*\n"] = "]", + ["%[%[%s*\n"] = "]]", + ["=%s*\n"] = false, + [":%s*\n"] = false, + ["^#if.*\n"] = "#endif", + ["^#else.*\n"] = "#endif", + ["%f[%w]do%s*\n"] = "end", + ["%f[%w]then%s*\n"] = "end", + ["%f[%w]else%s*\n"] = "end", + ["%f[%w]repeat%s*\n"] = "until", + ["%f[%w]function.*%)%s*\n"] = "end", + ["^%s*<([^/][^%s>]*)[^>]*>%s*\n"] = "", +} + + +local function indent_size(doc, line) + local text = doc.lines[line] or "" + local s, e = text:find("^[\t ]*") + return e - s +end + +command.add("core.docview", { + ["autoinsert:newline"] = function() + command.perform("doc:newline") + + local doc = core.active_view.doc + local line, col = doc:get_selection() + local text = doc.lines[line - 1] + + for ptn, close in pairs(config.lfautoinsert_map) do + local s, _, str = text:find(ptn) + if s then + if close + and col == #doc.lines[line] + and indent_size(doc, line + 1) <= indent_size(doc, line - 1) + then + close = str and close:gsub("$TEXT", str) or close + command.perform("doc:newline") + core.active_view:on_text_input(close) + command.perform("doc:move-to-previous-line") + if doc.lines[line+1] == doc.lines[line+2] then + doc:remove(line+1, 1, line+2, 1) + end + elseif col < #doc.lines[line] then + command.perform("doc:newline") + command.perform("doc:move-to-previous-line") + end + command.perform("doc:indent") + end + end + end +}) + +keymap.add { + ["return"] = { "command:submit", "autoinsert:newline" } +} diff --git a/tools/editor/art/lite/data/plugins/openfilelocation.lua b/tools/editor/art/lite/data/plugins/openfilelocation.lua new file mode 100644 index 0000000..ad91635 --- /dev/null +++ b/tools/editor/art/lite/data/plugins/openfilelocation.lua @@ -0,0 +1,30 @@ +local core = require "core" +local command = require "core.command" +local config = require "core.config" + + +if PLATFORM == "Windows" then + config.filemanager = "explorer" +elseif PLATFORM == "Mac OS X" then + config.filemanager = "open" +else + config.filemanager = "xdg-open" +end + + +command.add("core.docview", { + ["open-file-location:open-file-location"] = function() + local doc = core.active_view.doc + if not doc.filename then + core.error "Cannot open location of unsaved doc" + return + end + local folder = doc.filename:match("^(.*)[/\\].*$") or "." + core.log("Opening \"%s\"", folder) + if PLATFORM == "Windows" then + system.exec(string.format("%s %s", config.filemanager, folder)) + else + system.exec(string.format("%s %q", config.filemanager, folder)) + end + end +}) \ No newline at end of file diff --git a/tools/editor/art/lite/data/plugins/rainbowparen.lua b/tools/editor/art/lite/data/plugins/rainbowparen.lua new file mode 100644 index 0000000..b2689f0 --- /dev/null +++ b/tools/editor/art/lite/data/plugins/rainbowparen.lua @@ -0,0 +1,58 @@ +local tokenizer = require "core.tokenizer" +local style = require "core.style" +local common = require "core.common" + +local tokenize = tokenizer.tokenize +local closers = { + ["("] = ")", + ["["] = "]", + ["{"] = "}" +} +local function parenstyle(parenstack) + return "paren" .. ((#parenstack % 5) + 1) +end +function tokenizer.tokenize(syntax, text, state) + state = state or {} + local res, istate = tokenize(syntax, text, state.istate) + local parenstack = state.parenstack or "" + local newres = {} + -- split parens out + -- the stock tokenizer can't do this because it merges identical adjacent tokens + for i, type, text in tokenizer.each_token(res) do + if type == "normal" or type == "symbol" then + for normtext1, paren, normtext2 in text:gmatch("([^%(%[{}%]%)]*)([%(%[{}%]%)]?)([^%(%[{}%]%)]*)") do + if #normtext1 > 0 then + table.insert(newres, type) + table.insert(newres, normtext1) + end + if #paren > 0 then + if paren == parenstack:sub(-1) then -- expected closer + parenstack = parenstack:sub(1, -2) + table.insert(newres, parenstyle(parenstack)) + elseif closers[paren] then -- opener + table.insert(newres, parenstyle(parenstack)) + parenstack = parenstack .. closers[paren] + else -- unexpected closer + table.insert(newres, "paren_unbalanced") + end + table.insert(newres, paren) + end + if #normtext2 > 0 then + table.insert(newres, type) + table.insert(newres, normtext2) + end + end + else + table.insert(newres, type) + table.insert(newres, text) + end + end + return newres, { parenstack = parenstack, istate = istate } +end + +style.syntax.paren_unbalanced = style.syntax.paren_unbalanced or { common.color "#DC0408" } +style.syntax.paren1 = style.syntax.paren1 or { common.color "#FC6F71"} +style.syntax.paren2 = style.syntax.paren2 or { common.color "#fcb053"} +style.syntax.paren3 = style.syntax.paren3 or { common.color "#fcd476"} +style.syntax.paren4 = style.syntax.paren4 or { common.color "#52dab2"} +style.syntax.paren5 = style.syntax.paren5 or { common.color "#5a98cf"} diff --git a/tools/editor/art/lite/data/plugins/scalestatus.lua b/tools/editor/art/lite/data/plugins/scalestatus.lua new file mode 100644 index 0000000..ded6df3 --- /dev/null +++ b/tools/editor/art/lite/data/plugins/scalestatus.lua @@ -0,0 +1,40 @@ +--[[ + scalestatus.lua + displays current scale (zoom) in status view + version: 20200628_155804 + originally by SwissalpS + + Depends on plugin scale.lua version >= 20200628_154010 +--]] +local scale = require "plugins.scale" +-- make sure plugin is installed and has get_scale field +if not scale.get_scale then + local core = require "core" + core.error("Plugin 'scale' needs to be updated, scalestatus inactive.") + return false +end + +local config = require "core.config" +local StatusView = require "core.statusview" + +config.scalestatus_format = '%.0f%%' + +local get_items = StatusView.get_items +function StatusView:get_items() + + local left, right = get_items(self) + + local t = { + self.separator, + string.format(config.scalestatus_format, scale.get_scale() * 100), + } + + for _, item in ipairs(t) do + table.insert(right, item) + end + + return left, right + +end + +return true diff --git a/tools/editor/art/lite/data/plugins/workspace.lua b/tools/editor/art/lite/data/plugins/workspace.lua index 3b3bd04..7ef84ae 100644 --- a/tools/editor/art/lite/data/plugins/workspace.lua +++ b/tools/editor/art/lite/data/plugins/workspace.lua @@ -1,58 +1,20 @@ --- mod-version:3 local core = require "core" -local common = require "core.common" local DocView = require "core.docview" -local LogView = require "core.logview" + +local workspace_filename = ".lite_workspace.lua" -local function workspace_files_for(project_dir) - local basename = common.basename(project_dir) - local workspace_dir = USERDIR .. PATHSEP .. "ws" - local info_wsdir = system.get_file_info(workspace_dir) - if not info_wsdir then - local ok, err = system.mkdir(workspace_dir) - if not ok then - error("cannot create workspace directory: \"" .. err .. "\"") +local function serialize(val) + if type(val) == "string" then + return string.format("%q", val) + elseif type(val) == "table" then + local t = {} + for k, v in pairs(val) do + table.insert(t, "[" .. serialize(k) .. "]=" .. serialize(v)) end + return "{" .. table.concat(t, ",") .. "}" end - return coroutine.wrap(function() - local files = system.list_dir(workspace_dir) or {} - local n = #basename - for _, file in ipairs(files) do - if file:sub(1, n) == basename then - local id = tonumber(file:sub(n + 1):match("^-(%d+)$")) - if id then - coroutine.yield(workspace_dir .. PATHSEP .. file, id) - end - end - end - end) -end - - -local function consume_workspace_file(project_dir) - for filename, id in workspace_files_for(project_dir) do - local load_f = loadfile(filename) - local workspace = load_f and load_f() - if workspace and workspace.path == project_dir then - os.remove(filename) - return workspace - end - end -end - - -local function get_workspace_filename(project_dir) - local id_list = {} - for filename, id in workspace_files_for(project_dir) do - id_list[id] = true - end - local id = 1 - while id_list[id] do - id = id + 1 - end - local basename = common.basename(project_dir) - return USERDIR .. PATHSEP .. "ws" .. PATHSEP .. basename .. "-" .. tostring(id) + return tostring(val) end @@ -83,18 +45,15 @@ local function save_view(view) filename = view.doc.filename, selection = { view.doc:get_selection() }, scroll = { x = view.scroll.to.x, y = view.scroll.to.y }, - crlf = view.doc.crlf, - text = view.doc.new_file and view.doc:get_text(1, 1, math.huge, math.huge) + text = not view.doc.filename and view.doc:get_text(1, 1, math.huge, math.huge) } end - if mt == LogView then return end for name, mod in pairs(package.loaded) do if mod == mt then return { type = "view", active = (core.active_view == view), - module = name, - scroll = { x = view.scroll.to.x, y = view.scroll.to.y, to = { x = view.scroll.to.x, y = view.scroll.to.y } }, + module = name } end end @@ -103,27 +62,16 @@ end local function load_view(t) if t.type == "doc" then - local dv - if not t.filename then - -- document not associated to a file - dv = DocView(core.open_doc()) - else - -- we have a filename, try to read the file - local ok, doc = pcall(core.open_doc, t.filename) - if ok then - dv = DocView(doc) - end - end - if dv and dv.doc then - if dv.doc.new_file and t.text then - dv.doc:insert(1, 1, t.text) - dv.doc.crlf = t.crlf - end - dv.doc:set_selection(table.unpack(t.selection)) - dv.last_line1, dv.last_col1, dv.last_line2, dv.last_col2 = dv.doc:get_selection() - dv.scroll.x, dv.scroll.to.x = t.scroll.x, t.scroll.x - dv.scroll.y, dv.scroll.to.y = t.scroll.y, t.scroll.y + local ok, doc = pcall(core.open_doc, t.filename) + if not ok then + return DocView(core.open_doc()) end + local dv = DocView(doc) + if t.text then doc:insert(1, 1, t.text) end + doc:set_selection(table.unpack(t.selection)) + dv.last_line, dv.last_col = doc:get_selection() + dv.scroll.x, dv.scroll.to.x = t.scroll.x, t.scroll.x + dv.scroll.y, dv.scroll.to.y = t.scroll.y, t.scroll.y return dv end return require(t.module)() @@ -156,22 +104,13 @@ end local function load_node(node, t) if t.type == "leaf" then local res - local active_view - for i, v in ipairs(t.views) do + for _, v in ipairs(t.views) do local view = load_view(v) - if view then - if v.active then res = view end - node:add_view(view) - if t.active_view == i then - active_view = view - end - if not view:is(DocView) then - view.scroll = v.scroll - end - end + if v.active then res = view end + node:add_view(view) end - if active_view then - node:set_active_view(active_view) + if t.active_view then + node:set_active_view(node.views[t.active_view]) end return res else @@ -184,63 +123,57 @@ local function load_node(node, t) end -local function save_directories() - local project_dir = core.project_dir - local dir_list = {} - for i = 2, #core.project_directories do - dir_list[#dir_list + 1] = common.relative_path(project_dir, core.project_directories[i].name) - end - return dir_list -end - - local function save_workspace() local root = get_unlocked_root(core.root_view.root_node) - local workspace_filename = get_workspace_filename(core.project_dir) local fp = io.open(workspace_filename, "w") if fp then - local node_text = common.serialize(save_node(root)) - local dir_text = common.serialize(save_directories()) - fp:write(string.format("return { path = %q, documents = %s, directories = %s }\n", core.project_dir, node_text, dir_text)) + fp:write("return ", serialize(save_node(root)), "\n") fp:close() end end local function load_workspace() - local workspace = consume_workspace_file(core.project_dir) - if workspace then + local ok, t = pcall(dofile, workspace_filename) + os.remove(workspace_filename) + if ok then local root = get_unlocked_root(core.root_view.root_node) - local active_view = load_node(root, workspace.documents) + local active_view = load_node(root, t) if active_view then core.set_active_view(active_view) end - for i, dir_name in ipairs(workspace.directories) do - core.add_project_directory(system.absolute_path(dir_name)) - end end end local run = core.run - function core.run(...) if #core.docs == 0 then core.try(load_workspace) - local on_quit_project = core.on_quit_project - function core.on_quit_project() - core.try(save_workspace) - on_quit_project() - end - - local on_enter_project = core.on_enter_project - function core.on_enter_project(new_dir) - on_enter_project(new_dir) - core.try(load_workspace) + local exit = os.exit + function os.exit(...) + save_workspace() + exit(...) end end core.run = run return core.run(...) end + +local run1 = core.run1 +function core.run1(...) + if #core.docs == 0 then + core.try(load_workspace) + + local exit = os.exit + function os.exit(...) + save_workspace() + exit(...) + end + end + + core.run1 = run1 + return core.run1(...) +end diff --git a/tools/editor/art/lite/data/themes/fwk.lua b/tools/editor/art/lite/data/themes/fwk.lua index e6d5eef..9d97dd2 100644 --- a/tools/editor/art/lite/data/themes/fwk.lua +++ b/tools/editor/art/lite/data/themes/fwk.lua @@ -2,7 +2,7 @@ local style = require "core.style" local common = require "core.common" style.background = { common.color "#242424" } -- main background -style.background2 = { common.color "#202020" } -- sidebar backgrounds +style.background2 = { common.color "#1a1a1a" } -- sidebar background and inactive tabs style.background3 = { common.color "#202020" } -- bottombar background prompts style.text = { common.color "#9ea191" } style.caret = { common.color "#F8F8F0" } diff --git a/tools/editor/editor3.c b/tools/editor/editor3.c index 2d2df64..701e002 100644 --- a/tools/editor/editor3.c +++ b/tools/editor/editor3.c @@ -395,7 +395,7 @@ void game(unsigned frame, float dt, double t) { int main(){ window_title("Editor " EDITOR_VERSION); window_create(flag("--transparent") ? 101 : 80,0); - window_icon("logo.png"); + window_icon("scale-ruler-icon.png"); while( window_swap() ) { editor_frame(game); diff --git a/tools/editor/v4k_editor.h b/tools/editor/v4k_editor.h index 5211ce2..f4e1b6e 100644 --- a/tools/editor/v4k_editor.h +++ b/tools/editor/v4k_editor.h @@ -576,7 +576,7 @@ void editor_frame( void (*game)(unsigned, float, double) ) { game(editor.frame, editor.dt, editor.t); // timing - editor.dt = window_delta() /*clampf(window_delta(), 0, 1/60.f)*/ * !window_has_pause() * editor.slomo; + editor.dt = clampf(window_delta(), 0, 1/60.f) * !window_has_pause() * editor.slomo; editor.t += editor.dt; editor.frame += !window_has_pause(); editor.frame += !editor.frame; diff --git a/tools/editor/v4k_editor6_script.h b/tools/editor/v4k_editor6_script.h index ca46feb..5e50f97 100644 --- a/tools/editor/v4k_editor6_script.h +++ b/tools/editor/v4k_editor6_script.h @@ -7,6 +7,15 @@ #include "3rd_lite.h" // } +TODO("bug: lite key bindings are being sent to editor") +TODO("eval: https://github.com/Jipok/lite-plugins") +TODO("eval: https://github.com/drmargarido/linters") +TODO("eval: https://github.com/monolifed/theme16") +TODO("eval: https://github.com/takase1121/lite-contextmenu ") +TODO("eval: https://github.com/drmargarido/TodoTreeView") +TODO("eval: https://github.com/takase1121/lite-nagbar") +TODO("eval: https://github.com/rxi/console") + int ui_texture_fit(texture_t t, struct nk_rect bounds) { // allocate complete window space struct nk_rect total_space = nk_window_get_content_region(ui_ctx);