From 2724964ff2ad6333c46e05d93098519a0d12739e Mon Sep 17 00:00:00 2001 From: Anton Lutteman Date: Mon, 13 Sep 2021 10:04:02 +0200 Subject: [PATCH 01/61] Updated git ignore to include build/ --- .gitignore | 1 + project/media/images/icon.png.import | 34 + .../models/car_parts/SMCE-hull.glb.import | 1064 +++++++++++++++++ .../models/car_parts/SMCE-wheel.glb.import | 1064 +++++++++++++++++ .../models/car_parts/SMTE-hull.glb.import | 1064 +++++++++++++++++ .../Monta\357\277\203\357\276\261a.material" | Bin 0 -> 1622 bytes .../media/models/tereno/Terreno.fbx.import | 1064 +++++++++++++++++ project/project.godot | 22 +- 8 files changed, 4302 insertions(+), 11 deletions(-) create mode 100644 project/media/images/icon.png.import create mode 100644 project/media/models/car_parts/SMCE-hull.glb.import create mode 100644 project/media/models/car_parts/SMCE-wheel.glb.import create mode 100644 project/media/models/car_parts/SMTE-hull.glb.import create mode 100644 "project/media/models/tereno/Monta\357\277\203\357\276\261a.material" create mode 100644 project/media/models/tereno/Terreno.fbx.import diff --git a/.gitignore b/.gitignore index ed349475..ec25c695 100644 --- a/.gitignore +++ b/.gitignore @@ -12,5 +12,6 @@ project/.import project/gdnative/lib project/share/RtResources project/share/version.txt +build/ godot.log *.png~ diff --git a/project/media/images/icon.png.import b/project/media/images/icon.png.import new file mode 100644 index 00000000..14d007f0 --- /dev/null +++ b/project/media/images/icon.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/icon.png-c7ddf17ea825f0bffd1e1d023b7c4be2.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://media/images/icon.png" +dest_files=[ "res://.import/icon.png-c7ddf17ea825f0bffd1e1d023b7c4be2.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/project/media/models/car_parts/SMCE-hull.glb.import b/project/media/models/car_parts/SMCE-hull.glb.import new file mode 100644 index 00000000..5ad455bb --- /dev/null +++ b/project/media/models/car_parts/SMCE-hull.glb.import @@ -0,0 +1,1064 @@ +[remap] + +importer="scene" +type="PackedScene" +path="res://.import/SMCE-hull.glb-e399d15446152ec11e1b0dfe980bda8f.scn" + +[deps] + +source_file="res://media/models/car_parts/SMCE-hull.glb" +dest_files=[ "res://.import/SMCE-hull.glb-e399d15446152ec11e1b0dfe980bda8f.scn" ] + +[params] + +nodes/root_type="Spatial" +nodes/root_name="Scene Root" +nodes/root_scale=1.0 +nodes/custom_script="" +nodes/storage=0 +nodes/use_legacy_names=false +materials/location=1 +materials/storage=1 +materials/keep_on_reimport=true +meshes/compress=true +meshes/ensure_tangents=true +meshes/storage=0 +meshes/light_baking=0 +meshes/lightmap_texel_size=0.1 +skins/use_named_skins=true +external_files/store_in_subdir=false +animation/import=true +animation/fps=15 +animation/filter_script="" +animation/storage=false +animation/keep_custom_tracks=false +animation/optimizer/enabled=true +animation/optimizer/max_linear_error=0.05 +animation/optimizer/max_angular_error=0.01 +animation/optimizer/max_angle=22 +animation/optimizer/remove_unused_tracks=true +animation/clips/amount=0 +animation/clip_1/name="" +animation/clip_1/start_frame=0 +animation/clip_1/end_frame=0 +animation/clip_1/loops=false +animation/clip_2/name="" +animation/clip_2/start_frame=0 +animation/clip_2/end_frame=0 +animation/clip_2/loops=false +animation/clip_3/name="" +animation/clip_3/start_frame=0 +animation/clip_3/end_frame=0 +animation/clip_3/loops=false +animation/clip_4/name="" +animation/clip_4/start_frame=0 +animation/clip_4/end_frame=0 +animation/clip_4/loops=false +animation/clip_5/name="" +animation/clip_5/start_frame=0 +animation/clip_5/end_frame=0 +animation/clip_5/loops=false +animation/clip_6/name="" +animation/clip_6/start_frame=0 +animation/clip_6/end_frame=0 +animation/clip_6/loops=false +animation/clip_7/name="" +animation/clip_7/start_frame=0 +animation/clip_7/end_frame=0 +animation/clip_7/loops=false +animation/clip_8/name="" +animation/clip_8/start_frame=0 +animation/clip_8/end_frame=0 +animation/clip_8/loops=false +animation/clip_9/name="" +animation/clip_9/start_frame=0 +animation/clip_9/end_frame=0 +animation/clip_9/loops=false +animation/clip_10/name="" +animation/clip_10/start_frame=0 +animation/clip_10/end_frame=0 +animation/clip_10/loops=false +animation/clip_11/name="" +animation/clip_11/start_frame=0 +animation/clip_11/end_frame=0 +animation/clip_11/loops=false +animation/clip_12/name="" +animation/clip_12/start_frame=0 +animation/clip_12/end_frame=0 +animation/clip_12/loops=false +animation/clip_13/name="" +animation/clip_13/start_frame=0 +animation/clip_13/end_frame=0 +animation/clip_13/loops=false +animation/clip_14/name="" +animation/clip_14/start_frame=0 +animation/clip_14/end_frame=0 +animation/clip_14/loops=false +animation/clip_15/name="" +animation/clip_15/start_frame=0 +animation/clip_15/end_frame=0 +animation/clip_15/loops=false +animation/clip_16/name="" +animation/clip_16/start_frame=0 +animation/clip_16/end_frame=0 +animation/clip_16/loops=false +animation/clip_17/name="" +animation/clip_17/start_frame=0 +animation/clip_17/end_frame=0 +animation/clip_17/loops=false +animation/clip_18/name="" +animation/clip_18/start_frame=0 +animation/clip_18/end_frame=0 +animation/clip_18/loops=false +animation/clip_19/name="" +animation/clip_19/start_frame=0 +animation/clip_19/end_frame=0 +animation/clip_19/loops=false +animation/clip_20/name="" +animation/clip_20/start_frame=0 +animation/clip_20/end_frame=0 +animation/clip_20/loops=false +animation/clip_21/name="" +animation/clip_21/start_frame=0 +animation/clip_21/end_frame=0 +animation/clip_21/loops=false +animation/clip_22/name="" +animation/clip_22/start_frame=0 +animation/clip_22/end_frame=0 +animation/clip_22/loops=false +animation/clip_23/name="" +animation/clip_23/start_frame=0 +animation/clip_23/end_frame=0 +animation/clip_23/loops=false +animation/clip_24/name="" +animation/clip_24/start_frame=0 +animation/clip_24/end_frame=0 +animation/clip_24/loops=false +animation/clip_25/name="" +animation/clip_25/start_frame=0 +animation/clip_25/end_frame=0 +animation/clip_25/loops=false +animation/clip_26/name="" +animation/clip_26/start_frame=0 +animation/clip_26/end_frame=0 +animation/clip_26/loops=false +animation/clip_27/name="" +animation/clip_27/start_frame=0 +animation/clip_27/end_frame=0 +animation/clip_27/loops=false +animation/clip_28/name="" +animation/clip_28/start_frame=0 +animation/clip_28/end_frame=0 +animation/clip_28/loops=false +animation/clip_29/name="" +animation/clip_29/start_frame=0 +animation/clip_29/end_frame=0 +animation/clip_29/loops=false +animation/clip_30/name="" +animation/clip_30/start_frame=0 +animation/clip_30/end_frame=0 +animation/clip_30/loops=false +animation/clip_31/name="" +animation/clip_31/start_frame=0 +animation/clip_31/end_frame=0 +animation/clip_31/loops=false +animation/clip_32/name="" +animation/clip_32/start_frame=0 +animation/clip_32/end_frame=0 +animation/clip_32/loops=false +animation/clip_33/name="" +animation/clip_33/start_frame=0 +animation/clip_33/end_frame=0 +animation/clip_33/loops=false +animation/clip_34/name="" +animation/clip_34/start_frame=0 +animation/clip_34/end_frame=0 +animation/clip_34/loops=false +animation/clip_35/name="" +animation/clip_35/start_frame=0 +animation/clip_35/end_frame=0 +animation/clip_35/loops=false +animation/clip_36/name="" +animation/clip_36/start_frame=0 +animation/clip_36/end_frame=0 +animation/clip_36/loops=false +animation/clip_37/name="" +animation/clip_37/start_frame=0 +animation/clip_37/end_frame=0 +animation/clip_37/loops=false +animation/clip_38/name="" +animation/clip_38/start_frame=0 +animation/clip_38/end_frame=0 +animation/clip_38/loops=false +animation/clip_39/name="" +animation/clip_39/start_frame=0 +animation/clip_39/end_frame=0 +animation/clip_39/loops=false +animation/clip_40/name="" +animation/clip_40/start_frame=0 +animation/clip_40/end_frame=0 +animation/clip_40/loops=false +animation/clip_41/name="" +animation/clip_41/start_frame=0 +animation/clip_41/end_frame=0 +animation/clip_41/loops=false +animation/clip_42/name="" +animation/clip_42/start_frame=0 +animation/clip_42/end_frame=0 +animation/clip_42/loops=false +animation/clip_43/name="" +animation/clip_43/start_frame=0 +animation/clip_43/end_frame=0 +animation/clip_43/loops=false +animation/clip_44/name="" +animation/clip_44/start_frame=0 +animation/clip_44/end_frame=0 +animation/clip_44/loops=false +animation/clip_45/name="" +animation/clip_45/start_frame=0 +animation/clip_45/end_frame=0 +animation/clip_45/loops=false +animation/clip_46/name="" +animation/clip_46/start_frame=0 +animation/clip_46/end_frame=0 +animation/clip_46/loops=false +animation/clip_47/name="" +animation/clip_47/start_frame=0 +animation/clip_47/end_frame=0 +animation/clip_47/loops=false +animation/clip_48/name="" +animation/clip_48/start_frame=0 +animation/clip_48/end_frame=0 +animation/clip_48/loops=false +animation/clip_49/name="" +animation/clip_49/start_frame=0 +animation/clip_49/end_frame=0 +animation/clip_49/loops=false +animation/clip_50/name="" +animation/clip_50/start_frame=0 +animation/clip_50/end_frame=0 +animation/clip_50/loops=false +animation/clip_51/name="" +animation/clip_51/start_frame=0 +animation/clip_51/end_frame=0 +animation/clip_51/loops=false +animation/clip_52/name="" +animation/clip_52/start_frame=0 +animation/clip_52/end_frame=0 +animation/clip_52/loops=false +animation/clip_53/name="" +animation/clip_53/start_frame=0 +animation/clip_53/end_frame=0 +animation/clip_53/loops=false +animation/clip_54/name="" +animation/clip_54/start_frame=0 +animation/clip_54/end_frame=0 +animation/clip_54/loops=false +animation/clip_55/name="" +animation/clip_55/start_frame=0 +animation/clip_55/end_frame=0 +animation/clip_55/loops=false +animation/clip_56/name="" +animation/clip_56/start_frame=0 +animation/clip_56/end_frame=0 +animation/clip_56/loops=false +animation/clip_57/name="" +animation/clip_57/start_frame=0 +animation/clip_57/end_frame=0 +animation/clip_57/loops=false +animation/clip_58/name="" +animation/clip_58/start_frame=0 +animation/clip_58/end_frame=0 +animation/clip_58/loops=false +animation/clip_59/name="" +animation/clip_59/start_frame=0 +animation/clip_59/end_frame=0 +animation/clip_59/loops=false +animation/clip_60/name="" +animation/clip_60/start_frame=0 +animation/clip_60/end_frame=0 +animation/clip_60/loops=false +animation/clip_61/name="" +animation/clip_61/start_frame=0 +animation/clip_61/end_frame=0 +animation/clip_61/loops=false +animation/clip_62/name="" +animation/clip_62/start_frame=0 +animation/clip_62/end_frame=0 +animation/clip_62/loops=false +animation/clip_63/name="" +animation/clip_63/start_frame=0 +animation/clip_63/end_frame=0 +animation/clip_63/loops=false +animation/clip_64/name="" +animation/clip_64/start_frame=0 +animation/clip_64/end_frame=0 +animation/clip_64/loops=false +animation/clip_65/name="" +animation/clip_65/start_frame=0 +animation/clip_65/end_frame=0 +animation/clip_65/loops=false +animation/clip_66/name="" +animation/clip_66/start_frame=0 +animation/clip_66/end_frame=0 +animation/clip_66/loops=false +animation/clip_67/name="" +animation/clip_67/start_frame=0 +animation/clip_67/end_frame=0 +animation/clip_67/loops=false +animation/clip_68/name="" +animation/clip_68/start_frame=0 +animation/clip_68/end_frame=0 +animation/clip_68/loops=false +animation/clip_69/name="" +animation/clip_69/start_frame=0 +animation/clip_69/end_frame=0 +animation/clip_69/loops=false +animation/clip_70/name="" +animation/clip_70/start_frame=0 +animation/clip_70/end_frame=0 +animation/clip_70/loops=false +animation/clip_71/name="" +animation/clip_71/start_frame=0 +animation/clip_71/end_frame=0 +animation/clip_71/loops=false +animation/clip_72/name="" +animation/clip_72/start_frame=0 +animation/clip_72/end_frame=0 +animation/clip_72/loops=false +animation/clip_73/name="" +animation/clip_73/start_frame=0 +animation/clip_73/end_frame=0 +animation/clip_73/loops=false +animation/clip_74/name="" +animation/clip_74/start_frame=0 +animation/clip_74/end_frame=0 +animation/clip_74/loops=false +animation/clip_75/name="" +animation/clip_75/start_frame=0 +animation/clip_75/end_frame=0 +animation/clip_75/loops=false +animation/clip_76/name="" +animation/clip_76/start_frame=0 +animation/clip_76/end_frame=0 +animation/clip_76/loops=false +animation/clip_77/name="" +animation/clip_77/start_frame=0 +animation/clip_77/end_frame=0 +animation/clip_77/loops=false +animation/clip_78/name="" +animation/clip_78/start_frame=0 +animation/clip_78/end_frame=0 +animation/clip_78/loops=false +animation/clip_79/name="" +animation/clip_79/start_frame=0 +animation/clip_79/end_frame=0 +animation/clip_79/loops=false +animation/clip_80/name="" +animation/clip_80/start_frame=0 +animation/clip_80/end_frame=0 +animation/clip_80/loops=false +animation/clip_81/name="" +animation/clip_81/start_frame=0 +animation/clip_81/end_frame=0 +animation/clip_81/loops=false +animation/clip_82/name="" +animation/clip_82/start_frame=0 +animation/clip_82/end_frame=0 +animation/clip_82/loops=false +animation/clip_83/name="" +animation/clip_83/start_frame=0 +animation/clip_83/end_frame=0 +animation/clip_83/loops=false +animation/clip_84/name="" +animation/clip_84/start_frame=0 +animation/clip_84/end_frame=0 +animation/clip_84/loops=false +animation/clip_85/name="" +animation/clip_85/start_frame=0 +animation/clip_85/end_frame=0 +animation/clip_85/loops=false +animation/clip_86/name="" +animation/clip_86/start_frame=0 +animation/clip_86/end_frame=0 +animation/clip_86/loops=false +animation/clip_87/name="" +animation/clip_87/start_frame=0 +animation/clip_87/end_frame=0 +animation/clip_87/loops=false +animation/clip_88/name="" +animation/clip_88/start_frame=0 +animation/clip_88/end_frame=0 +animation/clip_88/loops=false +animation/clip_89/name="" +animation/clip_89/start_frame=0 +animation/clip_89/end_frame=0 +animation/clip_89/loops=false +animation/clip_90/name="" +animation/clip_90/start_frame=0 +animation/clip_90/end_frame=0 +animation/clip_90/loops=false +animation/clip_91/name="" +animation/clip_91/start_frame=0 +animation/clip_91/end_frame=0 +animation/clip_91/loops=false +animation/clip_92/name="" +animation/clip_92/start_frame=0 +animation/clip_92/end_frame=0 +animation/clip_92/loops=false +animation/clip_93/name="" +animation/clip_93/start_frame=0 +animation/clip_93/end_frame=0 +animation/clip_93/loops=false +animation/clip_94/name="" +animation/clip_94/start_frame=0 +animation/clip_94/end_frame=0 +animation/clip_94/loops=false +animation/clip_95/name="" +animation/clip_95/start_frame=0 +animation/clip_95/end_frame=0 +animation/clip_95/loops=false +animation/clip_96/name="" +animation/clip_96/start_frame=0 +animation/clip_96/end_frame=0 +animation/clip_96/loops=false +animation/clip_97/name="" +animation/clip_97/start_frame=0 +animation/clip_97/end_frame=0 +animation/clip_97/loops=false +animation/clip_98/name="" +animation/clip_98/start_frame=0 +animation/clip_98/end_frame=0 +animation/clip_98/loops=false +animation/clip_99/name="" +animation/clip_99/start_frame=0 +animation/clip_99/end_frame=0 +animation/clip_99/loops=false +animation/clip_100/name="" +animation/clip_100/start_frame=0 +animation/clip_100/end_frame=0 +animation/clip_100/loops=false +animation/clip_101/name="" +animation/clip_101/start_frame=0 +animation/clip_101/end_frame=0 +animation/clip_101/loops=false +animation/clip_102/name="" +animation/clip_102/start_frame=0 +animation/clip_102/end_frame=0 +animation/clip_102/loops=false +animation/clip_103/name="" +animation/clip_103/start_frame=0 +animation/clip_103/end_frame=0 +animation/clip_103/loops=false +animation/clip_104/name="" +animation/clip_104/start_frame=0 +animation/clip_104/end_frame=0 +animation/clip_104/loops=false +animation/clip_105/name="" +animation/clip_105/start_frame=0 +animation/clip_105/end_frame=0 +animation/clip_105/loops=false +animation/clip_106/name="" +animation/clip_106/start_frame=0 +animation/clip_106/end_frame=0 +animation/clip_106/loops=false +animation/clip_107/name="" +animation/clip_107/start_frame=0 +animation/clip_107/end_frame=0 +animation/clip_107/loops=false +animation/clip_108/name="" +animation/clip_108/start_frame=0 +animation/clip_108/end_frame=0 +animation/clip_108/loops=false +animation/clip_109/name="" +animation/clip_109/start_frame=0 +animation/clip_109/end_frame=0 +animation/clip_109/loops=false +animation/clip_110/name="" +animation/clip_110/start_frame=0 +animation/clip_110/end_frame=0 +animation/clip_110/loops=false +animation/clip_111/name="" +animation/clip_111/start_frame=0 +animation/clip_111/end_frame=0 +animation/clip_111/loops=false +animation/clip_112/name="" +animation/clip_112/start_frame=0 +animation/clip_112/end_frame=0 +animation/clip_112/loops=false +animation/clip_113/name="" +animation/clip_113/start_frame=0 +animation/clip_113/end_frame=0 +animation/clip_113/loops=false +animation/clip_114/name="" +animation/clip_114/start_frame=0 +animation/clip_114/end_frame=0 +animation/clip_114/loops=false +animation/clip_115/name="" +animation/clip_115/start_frame=0 +animation/clip_115/end_frame=0 +animation/clip_115/loops=false +animation/clip_116/name="" +animation/clip_116/start_frame=0 +animation/clip_116/end_frame=0 +animation/clip_116/loops=false +animation/clip_117/name="" +animation/clip_117/start_frame=0 +animation/clip_117/end_frame=0 +animation/clip_117/loops=false +animation/clip_118/name="" +animation/clip_118/start_frame=0 +animation/clip_118/end_frame=0 +animation/clip_118/loops=false +animation/clip_119/name="" +animation/clip_119/start_frame=0 +animation/clip_119/end_frame=0 +animation/clip_119/loops=false +animation/clip_120/name="" +animation/clip_120/start_frame=0 +animation/clip_120/end_frame=0 +animation/clip_120/loops=false +animation/clip_121/name="" +animation/clip_121/start_frame=0 +animation/clip_121/end_frame=0 +animation/clip_121/loops=false +animation/clip_122/name="" +animation/clip_122/start_frame=0 +animation/clip_122/end_frame=0 +animation/clip_122/loops=false +animation/clip_123/name="" +animation/clip_123/start_frame=0 +animation/clip_123/end_frame=0 +animation/clip_123/loops=false +animation/clip_124/name="" +animation/clip_124/start_frame=0 +animation/clip_124/end_frame=0 +animation/clip_124/loops=false +animation/clip_125/name="" +animation/clip_125/start_frame=0 +animation/clip_125/end_frame=0 +animation/clip_125/loops=false +animation/clip_126/name="" +animation/clip_126/start_frame=0 +animation/clip_126/end_frame=0 +animation/clip_126/loops=false +animation/clip_127/name="" +animation/clip_127/start_frame=0 +animation/clip_127/end_frame=0 +animation/clip_127/loops=false +animation/clip_128/name="" +animation/clip_128/start_frame=0 +animation/clip_128/end_frame=0 +animation/clip_128/loops=false +animation/clip_129/name="" +animation/clip_129/start_frame=0 +animation/clip_129/end_frame=0 +animation/clip_129/loops=false +animation/clip_130/name="" +animation/clip_130/start_frame=0 +animation/clip_130/end_frame=0 +animation/clip_130/loops=false +animation/clip_131/name="" +animation/clip_131/start_frame=0 +animation/clip_131/end_frame=0 +animation/clip_131/loops=false +animation/clip_132/name="" +animation/clip_132/start_frame=0 +animation/clip_132/end_frame=0 +animation/clip_132/loops=false +animation/clip_133/name="" +animation/clip_133/start_frame=0 +animation/clip_133/end_frame=0 +animation/clip_133/loops=false +animation/clip_134/name="" +animation/clip_134/start_frame=0 +animation/clip_134/end_frame=0 +animation/clip_134/loops=false +animation/clip_135/name="" +animation/clip_135/start_frame=0 +animation/clip_135/end_frame=0 +animation/clip_135/loops=false +animation/clip_136/name="" +animation/clip_136/start_frame=0 +animation/clip_136/end_frame=0 +animation/clip_136/loops=false +animation/clip_137/name="" +animation/clip_137/start_frame=0 +animation/clip_137/end_frame=0 +animation/clip_137/loops=false +animation/clip_138/name="" +animation/clip_138/start_frame=0 +animation/clip_138/end_frame=0 +animation/clip_138/loops=false +animation/clip_139/name="" +animation/clip_139/start_frame=0 +animation/clip_139/end_frame=0 +animation/clip_139/loops=false +animation/clip_140/name="" +animation/clip_140/start_frame=0 +animation/clip_140/end_frame=0 +animation/clip_140/loops=false +animation/clip_141/name="" +animation/clip_141/start_frame=0 +animation/clip_141/end_frame=0 +animation/clip_141/loops=false +animation/clip_142/name="" +animation/clip_142/start_frame=0 +animation/clip_142/end_frame=0 +animation/clip_142/loops=false +animation/clip_143/name="" +animation/clip_143/start_frame=0 +animation/clip_143/end_frame=0 +animation/clip_143/loops=false +animation/clip_144/name="" +animation/clip_144/start_frame=0 +animation/clip_144/end_frame=0 +animation/clip_144/loops=false +animation/clip_145/name="" +animation/clip_145/start_frame=0 +animation/clip_145/end_frame=0 +animation/clip_145/loops=false +animation/clip_146/name="" +animation/clip_146/start_frame=0 +animation/clip_146/end_frame=0 +animation/clip_146/loops=false +animation/clip_147/name="" +animation/clip_147/start_frame=0 +animation/clip_147/end_frame=0 +animation/clip_147/loops=false +animation/clip_148/name="" +animation/clip_148/start_frame=0 +animation/clip_148/end_frame=0 +animation/clip_148/loops=false +animation/clip_149/name="" +animation/clip_149/start_frame=0 +animation/clip_149/end_frame=0 +animation/clip_149/loops=false +animation/clip_150/name="" +animation/clip_150/start_frame=0 +animation/clip_150/end_frame=0 +animation/clip_150/loops=false +animation/clip_151/name="" +animation/clip_151/start_frame=0 +animation/clip_151/end_frame=0 +animation/clip_151/loops=false +animation/clip_152/name="" +animation/clip_152/start_frame=0 +animation/clip_152/end_frame=0 +animation/clip_152/loops=false +animation/clip_153/name="" +animation/clip_153/start_frame=0 +animation/clip_153/end_frame=0 +animation/clip_153/loops=false +animation/clip_154/name="" +animation/clip_154/start_frame=0 +animation/clip_154/end_frame=0 +animation/clip_154/loops=false +animation/clip_155/name="" +animation/clip_155/start_frame=0 +animation/clip_155/end_frame=0 +animation/clip_155/loops=false +animation/clip_156/name="" +animation/clip_156/start_frame=0 +animation/clip_156/end_frame=0 +animation/clip_156/loops=false +animation/clip_157/name="" +animation/clip_157/start_frame=0 +animation/clip_157/end_frame=0 +animation/clip_157/loops=false +animation/clip_158/name="" +animation/clip_158/start_frame=0 +animation/clip_158/end_frame=0 +animation/clip_158/loops=false +animation/clip_159/name="" +animation/clip_159/start_frame=0 +animation/clip_159/end_frame=0 +animation/clip_159/loops=false +animation/clip_160/name="" +animation/clip_160/start_frame=0 +animation/clip_160/end_frame=0 +animation/clip_160/loops=false +animation/clip_161/name="" +animation/clip_161/start_frame=0 +animation/clip_161/end_frame=0 +animation/clip_161/loops=false +animation/clip_162/name="" +animation/clip_162/start_frame=0 +animation/clip_162/end_frame=0 +animation/clip_162/loops=false +animation/clip_163/name="" +animation/clip_163/start_frame=0 +animation/clip_163/end_frame=0 +animation/clip_163/loops=false +animation/clip_164/name="" +animation/clip_164/start_frame=0 +animation/clip_164/end_frame=0 +animation/clip_164/loops=false +animation/clip_165/name="" +animation/clip_165/start_frame=0 +animation/clip_165/end_frame=0 +animation/clip_165/loops=false +animation/clip_166/name="" +animation/clip_166/start_frame=0 +animation/clip_166/end_frame=0 +animation/clip_166/loops=false +animation/clip_167/name="" +animation/clip_167/start_frame=0 +animation/clip_167/end_frame=0 +animation/clip_167/loops=false +animation/clip_168/name="" +animation/clip_168/start_frame=0 +animation/clip_168/end_frame=0 +animation/clip_168/loops=false +animation/clip_169/name="" +animation/clip_169/start_frame=0 +animation/clip_169/end_frame=0 +animation/clip_169/loops=false +animation/clip_170/name="" +animation/clip_170/start_frame=0 +animation/clip_170/end_frame=0 +animation/clip_170/loops=false +animation/clip_171/name="" +animation/clip_171/start_frame=0 +animation/clip_171/end_frame=0 +animation/clip_171/loops=false +animation/clip_172/name="" +animation/clip_172/start_frame=0 +animation/clip_172/end_frame=0 +animation/clip_172/loops=false +animation/clip_173/name="" +animation/clip_173/start_frame=0 +animation/clip_173/end_frame=0 +animation/clip_173/loops=false +animation/clip_174/name="" +animation/clip_174/start_frame=0 +animation/clip_174/end_frame=0 +animation/clip_174/loops=false +animation/clip_175/name="" +animation/clip_175/start_frame=0 +animation/clip_175/end_frame=0 +animation/clip_175/loops=false +animation/clip_176/name="" +animation/clip_176/start_frame=0 +animation/clip_176/end_frame=0 +animation/clip_176/loops=false +animation/clip_177/name="" +animation/clip_177/start_frame=0 +animation/clip_177/end_frame=0 +animation/clip_177/loops=false +animation/clip_178/name="" +animation/clip_178/start_frame=0 +animation/clip_178/end_frame=0 +animation/clip_178/loops=false +animation/clip_179/name="" +animation/clip_179/start_frame=0 +animation/clip_179/end_frame=0 +animation/clip_179/loops=false +animation/clip_180/name="" +animation/clip_180/start_frame=0 +animation/clip_180/end_frame=0 +animation/clip_180/loops=false +animation/clip_181/name="" +animation/clip_181/start_frame=0 +animation/clip_181/end_frame=0 +animation/clip_181/loops=false +animation/clip_182/name="" +animation/clip_182/start_frame=0 +animation/clip_182/end_frame=0 +animation/clip_182/loops=false +animation/clip_183/name="" +animation/clip_183/start_frame=0 +animation/clip_183/end_frame=0 +animation/clip_183/loops=false +animation/clip_184/name="" +animation/clip_184/start_frame=0 +animation/clip_184/end_frame=0 +animation/clip_184/loops=false +animation/clip_185/name="" +animation/clip_185/start_frame=0 +animation/clip_185/end_frame=0 +animation/clip_185/loops=false +animation/clip_186/name="" +animation/clip_186/start_frame=0 +animation/clip_186/end_frame=0 +animation/clip_186/loops=false +animation/clip_187/name="" +animation/clip_187/start_frame=0 +animation/clip_187/end_frame=0 +animation/clip_187/loops=false +animation/clip_188/name="" +animation/clip_188/start_frame=0 +animation/clip_188/end_frame=0 +animation/clip_188/loops=false +animation/clip_189/name="" +animation/clip_189/start_frame=0 +animation/clip_189/end_frame=0 +animation/clip_189/loops=false +animation/clip_190/name="" +animation/clip_190/start_frame=0 +animation/clip_190/end_frame=0 +animation/clip_190/loops=false +animation/clip_191/name="" +animation/clip_191/start_frame=0 +animation/clip_191/end_frame=0 +animation/clip_191/loops=false +animation/clip_192/name="" +animation/clip_192/start_frame=0 +animation/clip_192/end_frame=0 +animation/clip_192/loops=false +animation/clip_193/name="" +animation/clip_193/start_frame=0 +animation/clip_193/end_frame=0 +animation/clip_193/loops=false +animation/clip_194/name="" +animation/clip_194/start_frame=0 +animation/clip_194/end_frame=0 +animation/clip_194/loops=false +animation/clip_195/name="" +animation/clip_195/start_frame=0 +animation/clip_195/end_frame=0 +animation/clip_195/loops=false +animation/clip_196/name="" +animation/clip_196/start_frame=0 +animation/clip_196/end_frame=0 +animation/clip_196/loops=false +animation/clip_197/name="" +animation/clip_197/start_frame=0 +animation/clip_197/end_frame=0 +animation/clip_197/loops=false +animation/clip_198/name="" +animation/clip_198/start_frame=0 +animation/clip_198/end_frame=0 +animation/clip_198/loops=false +animation/clip_199/name="" +animation/clip_199/start_frame=0 +animation/clip_199/end_frame=0 +animation/clip_199/loops=false +animation/clip_200/name="" +animation/clip_200/start_frame=0 +animation/clip_200/end_frame=0 +animation/clip_200/loops=false +animation/clip_201/name="" +animation/clip_201/start_frame=0 +animation/clip_201/end_frame=0 +animation/clip_201/loops=false +animation/clip_202/name="" +animation/clip_202/start_frame=0 +animation/clip_202/end_frame=0 +animation/clip_202/loops=false +animation/clip_203/name="" +animation/clip_203/start_frame=0 +animation/clip_203/end_frame=0 +animation/clip_203/loops=false +animation/clip_204/name="" +animation/clip_204/start_frame=0 +animation/clip_204/end_frame=0 +animation/clip_204/loops=false +animation/clip_205/name="" +animation/clip_205/start_frame=0 +animation/clip_205/end_frame=0 +animation/clip_205/loops=false +animation/clip_206/name="" +animation/clip_206/start_frame=0 +animation/clip_206/end_frame=0 +animation/clip_206/loops=false +animation/clip_207/name="" +animation/clip_207/start_frame=0 +animation/clip_207/end_frame=0 +animation/clip_207/loops=false +animation/clip_208/name="" +animation/clip_208/start_frame=0 +animation/clip_208/end_frame=0 +animation/clip_208/loops=false +animation/clip_209/name="" +animation/clip_209/start_frame=0 +animation/clip_209/end_frame=0 +animation/clip_209/loops=false +animation/clip_210/name="" +animation/clip_210/start_frame=0 +animation/clip_210/end_frame=0 +animation/clip_210/loops=false +animation/clip_211/name="" +animation/clip_211/start_frame=0 +animation/clip_211/end_frame=0 +animation/clip_211/loops=false +animation/clip_212/name="" +animation/clip_212/start_frame=0 +animation/clip_212/end_frame=0 +animation/clip_212/loops=false +animation/clip_213/name="" +animation/clip_213/start_frame=0 +animation/clip_213/end_frame=0 +animation/clip_213/loops=false +animation/clip_214/name="" +animation/clip_214/start_frame=0 +animation/clip_214/end_frame=0 +animation/clip_214/loops=false +animation/clip_215/name="" +animation/clip_215/start_frame=0 +animation/clip_215/end_frame=0 +animation/clip_215/loops=false +animation/clip_216/name="" +animation/clip_216/start_frame=0 +animation/clip_216/end_frame=0 +animation/clip_216/loops=false +animation/clip_217/name="" +animation/clip_217/start_frame=0 +animation/clip_217/end_frame=0 +animation/clip_217/loops=false +animation/clip_218/name="" +animation/clip_218/start_frame=0 +animation/clip_218/end_frame=0 +animation/clip_218/loops=false +animation/clip_219/name="" +animation/clip_219/start_frame=0 +animation/clip_219/end_frame=0 +animation/clip_219/loops=false +animation/clip_220/name="" +animation/clip_220/start_frame=0 +animation/clip_220/end_frame=0 +animation/clip_220/loops=false +animation/clip_221/name="" +animation/clip_221/start_frame=0 +animation/clip_221/end_frame=0 +animation/clip_221/loops=false +animation/clip_222/name="" +animation/clip_222/start_frame=0 +animation/clip_222/end_frame=0 +animation/clip_222/loops=false +animation/clip_223/name="" +animation/clip_223/start_frame=0 +animation/clip_223/end_frame=0 +animation/clip_223/loops=false +animation/clip_224/name="" +animation/clip_224/start_frame=0 +animation/clip_224/end_frame=0 +animation/clip_224/loops=false +animation/clip_225/name="" +animation/clip_225/start_frame=0 +animation/clip_225/end_frame=0 +animation/clip_225/loops=false +animation/clip_226/name="" +animation/clip_226/start_frame=0 +animation/clip_226/end_frame=0 +animation/clip_226/loops=false +animation/clip_227/name="" +animation/clip_227/start_frame=0 +animation/clip_227/end_frame=0 +animation/clip_227/loops=false +animation/clip_228/name="" +animation/clip_228/start_frame=0 +animation/clip_228/end_frame=0 +animation/clip_228/loops=false +animation/clip_229/name="" +animation/clip_229/start_frame=0 +animation/clip_229/end_frame=0 +animation/clip_229/loops=false +animation/clip_230/name="" +animation/clip_230/start_frame=0 +animation/clip_230/end_frame=0 +animation/clip_230/loops=false +animation/clip_231/name="" +animation/clip_231/start_frame=0 +animation/clip_231/end_frame=0 +animation/clip_231/loops=false +animation/clip_232/name="" +animation/clip_232/start_frame=0 +animation/clip_232/end_frame=0 +animation/clip_232/loops=false +animation/clip_233/name="" +animation/clip_233/start_frame=0 +animation/clip_233/end_frame=0 +animation/clip_233/loops=false +animation/clip_234/name="" +animation/clip_234/start_frame=0 +animation/clip_234/end_frame=0 +animation/clip_234/loops=false +animation/clip_235/name="" +animation/clip_235/start_frame=0 +animation/clip_235/end_frame=0 +animation/clip_235/loops=false +animation/clip_236/name="" +animation/clip_236/start_frame=0 +animation/clip_236/end_frame=0 +animation/clip_236/loops=false +animation/clip_237/name="" +animation/clip_237/start_frame=0 +animation/clip_237/end_frame=0 +animation/clip_237/loops=false +animation/clip_238/name="" +animation/clip_238/start_frame=0 +animation/clip_238/end_frame=0 +animation/clip_238/loops=false +animation/clip_239/name="" +animation/clip_239/start_frame=0 +animation/clip_239/end_frame=0 +animation/clip_239/loops=false +animation/clip_240/name="" +animation/clip_240/start_frame=0 +animation/clip_240/end_frame=0 +animation/clip_240/loops=false +animation/clip_241/name="" +animation/clip_241/start_frame=0 +animation/clip_241/end_frame=0 +animation/clip_241/loops=false +animation/clip_242/name="" +animation/clip_242/start_frame=0 +animation/clip_242/end_frame=0 +animation/clip_242/loops=false +animation/clip_243/name="" +animation/clip_243/start_frame=0 +animation/clip_243/end_frame=0 +animation/clip_243/loops=false +animation/clip_244/name="" +animation/clip_244/start_frame=0 +animation/clip_244/end_frame=0 +animation/clip_244/loops=false +animation/clip_245/name="" +animation/clip_245/start_frame=0 +animation/clip_245/end_frame=0 +animation/clip_245/loops=false +animation/clip_246/name="" +animation/clip_246/start_frame=0 +animation/clip_246/end_frame=0 +animation/clip_246/loops=false +animation/clip_247/name="" +animation/clip_247/start_frame=0 +animation/clip_247/end_frame=0 +animation/clip_247/loops=false +animation/clip_248/name="" +animation/clip_248/start_frame=0 +animation/clip_248/end_frame=0 +animation/clip_248/loops=false +animation/clip_249/name="" +animation/clip_249/start_frame=0 +animation/clip_249/end_frame=0 +animation/clip_249/loops=false +animation/clip_250/name="" +animation/clip_250/start_frame=0 +animation/clip_250/end_frame=0 +animation/clip_250/loops=false +animation/clip_251/name="" +animation/clip_251/start_frame=0 +animation/clip_251/end_frame=0 +animation/clip_251/loops=false +animation/clip_252/name="" +animation/clip_252/start_frame=0 +animation/clip_252/end_frame=0 +animation/clip_252/loops=false +animation/clip_253/name="" +animation/clip_253/start_frame=0 +animation/clip_253/end_frame=0 +animation/clip_253/loops=false +animation/clip_254/name="" +animation/clip_254/start_frame=0 +animation/clip_254/end_frame=0 +animation/clip_254/loops=false +animation/clip_255/name="" +animation/clip_255/start_frame=0 +animation/clip_255/end_frame=0 +animation/clip_255/loops=false +animation/clip_256/name="" +animation/clip_256/start_frame=0 +animation/clip_256/end_frame=0 +animation/clip_256/loops=false diff --git a/project/media/models/car_parts/SMCE-wheel.glb.import b/project/media/models/car_parts/SMCE-wheel.glb.import new file mode 100644 index 00000000..8e86f43a --- /dev/null +++ b/project/media/models/car_parts/SMCE-wheel.glb.import @@ -0,0 +1,1064 @@ +[remap] + +importer="scene" +type="PackedScene" +path="res://.import/SMCE-wheel.glb-a503500cd5d54d1ae7b21c87cff2cc62.scn" + +[deps] + +source_file="res://media/models/car_parts/SMCE-wheel.glb" +dest_files=[ "res://.import/SMCE-wheel.glb-a503500cd5d54d1ae7b21c87cff2cc62.scn" ] + +[params] + +nodes/root_type="Spatial" +nodes/root_name="Scene Root" +nodes/root_scale=1.0 +nodes/custom_script="" +nodes/storage=0 +nodes/use_legacy_names=false +materials/location=1 +materials/storage=1 +materials/keep_on_reimport=true +meshes/compress=true +meshes/ensure_tangents=true +meshes/storage=0 +meshes/light_baking=0 +meshes/lightmap_texel_size=0.1 +skins/use_named_skins=true +external_files/store_in_subdir=false +animation/import=true +animation/fps=15 +animation/filter_script="" +animation/storage=false +animation/keep_custom_tracks=false +animation/optimizer/enabled=true +animation/optimizer/max_linear_error=0.05 +animation/optimizer/max_angular_error=0.01 +animation/optimizer/max_angle=22 +animation/optimizer/remove_unused_tracks=true +animation/clips/amount=0 +animation/clip_1/name="" +animation/clip_1/start_frame=0 +animation/clip_1/end_frame=0 +animation/clip_1/loops=false +animation/clip_2/name="" +animation/clip_2/start_frame=0 +animation/clip_2/end_frame=0 +animation/clip_2/loops=false +animation/clip_3/name="" +animation/clip_3/start_frame=0 +animation/clip_3/end_frame=0 +animation/clip_3/loops=false +animation/clip_4/name="" +animation/clip_4/start_frame=0 +animation/clip_4/end_frame=0 +animation/clip_4/loops=false +animation/clip_5/name="" +animation/clip_5/start_frame=0 +animation/clip_5/end_frame=0 +animation/clip_5/loops=false +animation/clip_6/name="" +animation/clip_6/start_frame=0 +animation/clip_6/end_frame=0 +animation/clip_6/loops=false +animation/clip_7/name="" +animation/clip_7/start_frame=0 +animation/clip_7/end_frame=0 +animation/clip_7/loops=false +animation/clip_8/name="" +animation/clip_8/start_frame=0 +animation/clip_8/end_frame=0 +animation/clip_8/loops=false +animation/clip_9/name="" +animation/clip_9/start_frame=0 +animation/clip_9/end_frame=0 +animation/clip_9/loops=false +animation/clip_10/name="" +animation/clip_10/start_frame=0 +animation/clip_10/end_frame=0 +animation/clip_10/loops=false +animation/clip_11/name="" +animation/clip_11/start_frame=0 +animation/clip_11/end_frame=0 +animation/clip_11/loops=false +animation/clip_12/name="" +animation/clip_12/start_frame=0 +animation/clip_12/end_frame=0 +animation/clip_12/loops=false +animation/clip_13/name="" +animation/clip_13/start_frame=0 +animation/clip_13/end_frame=0 +animation/clip_13/loops=false +animation/clip_14/name="" +animation/clip_14/start_frame=0 +animation/clip_14/end_frame=0 +animation/clip_14/loops=false +animation/clip_15/name="" +animation/clip_15/start_frame=0 +animation/clip_15/end_frame=0 +animation/clip_15/loops=false +animation/clip_16/name="" +animation/clip_16/start_frame=0 +animation/clip_16/end_frame=0 +animation/clip_16/loops=false +animation/clip_17/name="" +animation/clip_17/start_frame=0 +animation/clip_17/end_frame=0 +animation/clip_17/loops=false +animation/clip_18/name="" +animation/clip_18/start_frame=0 +animation/clip_18/end_frame=0 +animation/clip_18/loops=false +animation/clip_19/name="" +animation/clip_19/start_frame=0 +animation/clip_19/end_frame=0 +animation/clip_19/loops=false +animation/clip_20/name="" +animation/clip_20/start_frame=0 +animation/clip_20/end_frame=0 +animation/clip_20/loops=false +animation/clip_21/name="" +animation/clip_21/start_frame=0 +animation/clip_21/end_frame=0 +animation/clip_21/loops=false +animation/clip_22/name="" +animation/clip_22/start_frame=0 +animation/clip_22/end_frame=0 +animation/clip_22/loops=false +animation/clip_23/name="" +animation/clip_23/start_frame=0 +animation/clip_23/end_frame=0 +animation/clip_23/loops=false +animation/clip_24/name="" +animation/clip_24/start_frame=0 +animation/clip_24/end_frame=0 +animation/clip_24/loops=false +animation/clip_25/name="" +animation/clip_25/start_frame=0 +animation/clip_25/end_frame=0 +animation/clip_25/loops=false +animation/clip_26/name="" +animation/clip_26/start_frame=0 +animation/clip_26/end_frame=0 +animation/clip_26/loops=false +animation/clip_27/name="" +animation/clip_27/start_frame=0 +animation/clip_27/end_frame=0 +animation/clip_27/loops=false +animation/clip_28/name="" +animation/clip_28/start_frame=0 +animation/clip_28/end_frame=0 +animation/clip_28/loops=false +animation/clip_29/name="" +animation/clip_29/start_frame=0 +animation/clip_29/end_frame=0 +animation/clip_29/loops=false +animation/clip_30/name="" +animation/clip_30/start_frame=0 +animation/clip_30/end_frame=0 +animation/clip_30/loops=false +animation/clip_31/name="" +animation/clip_31/start_frame=0 +animation/clip_31/end_frame=0 +animation/clip_31/loops=false +animation/clip_32/name="" +animation/clip_32/start_frame=0 +animation/clip_32/end_frame=0 +animation/clip_32/loops=false +animation/clip_33/name="" +animation/clip_33/start_frame=0 +animation/clip_33/end_frame=0 +animation/clip_33/loops=false +animation/clip_34/name="" +animation/clip_34/start_frame=0 +animation/clip_34/end_frame=0 +animation/clip_34/loops=false +animation/clip_35/name="" +animation/clip_35/start_frame=0 +animation/clip_35/end_frame=0 +animation/clip_35/loops=false +animation/clip_36/name="" +animation/clip_36/start_frame=0 +animation/clip_36/end_frame=0 +animation/clip_36/loops=false +animation/clip_37/name="" +animation/clip_37/start_frame=0 +animation/clip_37/end_frame=0 +animation/clip_37/loops=false +animation/clip_38/name="" +animation/clip_38/start_frame=0 +animation/clip_38/end_frame=0 +animation/clip_38/loops=false +animation/clip_39/name="" +animation/clip_39/start_frame=0 +animation/clip_39/end_frame=0 +animation/clip_39/loops=false +animation/clip_40/name="" +animation/clip_40/start_frame=0 +animation/clip_40/end_frame=0 +animation/clip_40/loops=false +animation/clip_41/name="" +animation/clip_41/start_frame=0 +animation/clip_41/end_frame=0 +animation/clip_41/loops=false +animation/clip_42/name="" +animation/clip_42/start_frame=0 +animation/clip_42/end_frame=0 +animation/clip_42/loops=false +animation/clip_43/name="" +animation/clip_43/start_frame=0 +animation/clip_43/end_frame=0 +animation/clip_43/loops=false +animation/clip_44/name="" +animation/clip_44/start_frame=0 +animation/clip_44/end_frame=0 +animation/clip_44/loops=false +animation/clip_45/name="" +animation/clip_45/start_frame=0 +animation/clip_45/end_frame=0 +animation/clip_45/loops=false +animation/clip_46/name="" +animation/clip_46/start_frame=0 +animation/clip_46/end_frame=0 +animation/clip_46/loops=false +animation/clip_47/name="" +animation/clip_47/start_frame=0 +animation/clip_47/end_frame=0 +animation/clip_47/loops=false +animation/clip_48/name="" +animation/clip_48/start_frame=0 +animation/clip_48/end_frame=0 +animation/clip_48/loops=false +animation/clip_49/name="" +animation/clip_49/start_frame=0 +animation/clip_49/end_frame=0 +animation/clip_49/loops=false +animation/clip_50/name="" +animation/clip_50/start_frame=0 +animation/clip_50/end_frame=0 +animation/clip_50/loops=false +animation/clip_51/name="" +animation/clip_51/start_frame=0 +animation/clip_51/end_frame=0 +animation/clip_51/loops=false +animation/clip_52/name="" +animation/clip_52/start_frame=0 +animation/clip_52/end_frame=0 +animation/clip_52/loops=false +animation/clip_53/name="" +animation/clip_53/start_frame=0 +animation/clip_53/end_frame=0 +animation/clip_53/loops=false +animation/clip_54/name="" +animation/clip_54/start_frame=0 +animation/clip_54/end_frame=0 +animation/clip_54/loops=false +animation/clip_55/name="" +animation/clip_55/start_frame=0 +animation/clip_55/end_frame=0 +animation/clip_55/loops=false +animation/clip_56/name="" +animation/clip_56/start_frame=0 +animation/clip_56/end_frame=0 +animation/clip_56/loops=false +animation/clip_57/name="" +animation/clip_57/start_frame=0 +animation/clip_57/end_frame=0 +animation/clip_57/loops=false +animation/clip_58/name="" +animation/clip_58/start_frame=0 +animation/clip_58/end_frame=0 +animation/clip_58/loops=false +animation/clip_59/name="" +animation/clip_59/start_frame=0 +animation/clip_59/end_frame=0 +animation/clip_59/loops=false +animation/clip_60/name="" +animation/clip_60/start_frame=0 +animation/clip_60/end_frame=0 +animation/clip_60/loops=false +animation/clip_61/name="" +animation/clip_61/start_frame=0 +animation/clip_61/end_frame=0 +animation/clip_61/loops=false +animation/clip_62/name="" +animation/clip_62/start_frame=0 +animation/clip_62/end_frame=0 +animation/clip_62/loops=false +animation/clip_63/name="" +animation/clip_63/start_frame=0 +animation/clip_63/end_frame=0 +animation/clip_63/loops=false +animation/clip_64/name="" +animation/clip_64/start_frame=0 +animation/clip_64/end_frame=0 +animation/clip_64/loops=false +animation/clip_65/name="" +animation/clip_65/start_frame=0 +animation/clip_65/end_frame=0 +animation/clip_65/loops=false +animation/clip_66/name="" +animation/clip_66/start_frame=0 +animation/clip_66/end_frame=0 +animation/clip_66/loops=false +animation/clip_67/name="" +animation/clip_67/start_frame=0 +animation/clip_67/end_frame=0 +animation/clip_67/loops=false +animation/clip_68/name="" +animation/clip_68/start_frame=0 +animation/clip_68/end_frame=0 +animation/clip_68/loops=false +animation/clip_69/name="" +animation/clip_69/start_frame=0 +animation/clip_69/end_frame=0 +animation/clip_69/loops=false +animation/clip_70/name="" +animation/clip_70/start_frame=0 +animation/clip_70/end_frame=0 +animation/clip_70/loops=false +animation/clip_71/name="" +animation/clip_71/start_frame=0 +animation/clip_71/end_frame=0 +animation/clip_71/loops=false +animation/clip_72/name="" +animation/clip_72/start_frame=0 +animation/clip_72/end_frame=0 +animation/clip_72/loops=false +animation/clip_73/name="" +animation/clip_73/start_frame=0 +animation/clip_73/end_frame=0 +animation/clip_73/loops=false +animation/clip_74/name="" +animation/clip_74/start_frame=0 +animation/clip_74/end_frame=0 +animation/clip_74/loops=false +animation/clip_75/name="" +animation/clip_75/start_frame=0 +animation/clip_75/end_frame=0 +animation/clip_75/loops=false +animation/clip_76/name="" +animation/clip_76/start_frame=0 +animation/clip_76/end_frame=0 +animation/clip_76/loops=false +animation/clip_77/name="" +animation/clip_77/start_frame=0 +animation/clip_77/end_frame=0 +animation/clip_77/loops=false +animation/clip_78/name="" +animation/clip_78/start_frame=0 +animation/clip_78/end_frame=0 +animation/clip_78/loops=false +animation/clip_79/name="" +animation/clip_79/start_frame=0 +animation/clip_79/end_frame=0 +animation/clip_79/loops=false +animation/clip_80/name="" +animation/clip_80/start_frame=0 +animation/clip_80/end_frame=0 +animation/clip_80/loops=false +animation/clip_81/name="" +animation/clip_81/start_frame=0 +animation/clip_81/end_frame=0 +animation/clip_81/loops=false +animation/clip_82/name="" +animation/clip_82/start_frame=0 +animation/clip_82/end_frame=0 +animation/clip_82/loops=false +animation/clip_83/name="" +animation/clip_83/start_frame=0 +animation/clip_83/end_frame=0 +animation/clip_83/loops=false +animation/clip_84/name="" +animation/clip_84/start_frame=0 +animation/clip_84/end_frame=0 +animation/clip_84/loops=false +animation/clip_85/name="" +animation/clip_85/start_frame=0 +animation/clip_85/end_frame=0 +animation/clip_85/loops=false +animation/clip_86/name="" +animation/clip_86/start_frame=0 +animation/clip_86/end_frame=0 +animation/clip_86/loops=false +animation/clip_87/name="" +animation/clip_87/start_frame=0 +animation/clip_87/end_frame=0 +animation/clip_87/loops=false +animation/clip_88/name="" +animation/clip_88/start_frame=0 +animation/clip_88/end_frame=0 +animation/clip_88/loops=false +animation/clip_89/name="" +animation/clip_89/start_frame=0 +animation/clip_89/end_frame=0 +animation/clip_89/loops=false +animation/clip_90/name="" +animation/clip_90/start_frame=0 +animation/clip_90/end_frame=0 +animation/clip_90/loops=false +animation/clip_91/name="" +animation/clip_91/start_frame=0 +animation/clip_91/end_frame=0 +animation/clip_91/loops=false +animation/clip_92/name="" +animation/clip_92/start_frame=0 +animation/clip_92/end_frame=0 +animation/clip_92/loops=false +animation/clip_93/name="" +animation/clip_93/start_frame=0 +animation/clip_93/end_frame=0 +animation/clip_93/loops=false +animation/clip_94/name="" +animation/clip_94/start_frame=0 +animation/clip_94/end_frame=0 +animation/clip_94/loops=false +animation/clip_95/name="" +animation/clip_95/start_frame=0 +animation/clip_95/end_frame=0 +animation/clip_95/loops=false +animation/clip_96/name="" +animation/clip_96/start_frame=0 +animation/clip_96/end_frame=0 +animation/clip_96/loops=false +animation/clip_97/name="" +animation/clip_97/start_frame=0 +animation/clip_97/end_frame=0 +animation/clip_97/loops=false +animation/clip_98/name="" +animation/clip_98/start_frame=0 +animation/clip_98/end_frame=0 +animation/clip_98/loops=false +animation/clip_99/name="" +animation/clip_99/start_frame=0 +animation/clip_99/end_frame=0 +animation/clip_99/loops=false +animation/clip_100/name="" +animation/clip_100/start_frame=0 +animation/clip_100/end_frame=0 +animation/clip_100/loops=false +animation/clip_101/name="" +animation/clip_101/start_frame=0 +animation/clip_101/end_frame=0 +animation/clip_101/loops=false +animation/clip_102/name="" +animation/clip_102/start_frame=0 +animation/clip_102/end_frame=0 +animation/clip_102/loops=false +animation/clip_103/name="" +animation/clip_103/start_frame=0 +animation/clip_103/end_frame=0 +animation/clip_103/loops=false +animation/clip_104/name="" +animation/clip_104/start_frame=0 +animation/clip_104/end_frame=0 +animation/clip_104/loops=false +animation/clip_105/name="" +animation/clip_105/start_frame=0 +animation/clip_105/end_frame=0 +animation/clip_105/loops=false +animation/clip_106/name="" +animation/clip_106/start_frame=0 +animation/clip_106/end_frame=0 +animation/clip_106/loops=false +animation/clip_107/name="" +animation/clip_107/start_frame=0 +animation/clip_107/end_frame=0 +animation/clip_107/loops=false +animation/clip_108/name="" +animation/clip_108/start_frame=0 +animation/clip_108/end_frame=0 +animation/clip_108/loops=false +animation/clip_109/name="" +animation/clip_109/start_frame=0 +animation/clip_109/end_frame=0 +animation/clip_109/loops=false +animation/clip_110/name="" +animation/clip_110/start_frame=0 +animation/clip_110/end_frame=0 +animation/clip_110/loops=false +animation/clip_111/name="" +animation/clip_111/start_frame=0 +animation/clip_111/end_frame=0 +animation/clip_111/loops=false +animation/clip_112/name="" +animation/clip_112/start_frame=0 +animation/clip_112/end_frame=0 +animation/clip_112/loops=false +animation/clip_113/name="" +animation/clip_113/start_frame=0 +animation/clip_113/end_frame=0 +animation/clip_113/loops=false +animation/clip_114/name="" +animation/clip_114/start_frame=0 +animation/clip_114/end_frame=0 +animation/clip_114/loops=false +animation/clip_115/name="" +animation/clip_115/start_frame=0 +animation/clip_115/end_frame=0 +animation/clip_115/loops=false +animation/clip_116/name="" +animation/clip_116/start_frame=0 +animation/clip_116/end_frame=0 +animation/clip_116/loops=false +animation/clip_117/name="" +animation/clip_117/start_frame=0 +animation/clip_117/end_frame=0 +animation/clip_117/loops=false +animation/clip_118/name="" +animation/clip_118/start_frame=0 +animation/clip_118/end_frame=0 +animation/clip_118/loops=false +animation/clip_119/name="" +animation/clip_119/start_frame=0 +animation/clip_119/end_frame=0 +animation/clip_119/loops=false +animation/clip_120/name="" +animation/clip_120/start_frame=0 +animation/clip_120/end_frame=0 +animation/clip_120/loops=false +animation/clip_121/name="" +animation/clip_121/start_frame=0 +animation/clip_121/end_frame=0 +animation/clip_121/loops=false +animation/clip_122/name="" +animation/clip_122/start_frame=0 +animation/clip_122/end_frame=0 +animation/clip_122/loops=false +animation/clip_123/name="" +animation/clip_123/start_frame=0 +animation/clip_123/end_frame=0 +animation/clip_123/loops=false +animation/clip_124/name="" +animation/clip_124/start_frame=0 +animation/clip_124/end_frame=0 +animation/clip_124/loops=false +animation/clip_125/name="" +animation/clip_125/start_frame=0 +animation/clip_125/end_frame=0 +animation/clip_125/loops=false +animation/clip_126/name="" +animation/clip_126/start_frame=0 +animation/clip_126/end_frame=0 +animation/clip_126/loops=false +animation/clip_127/name="" +animation/clip_127/start_frame=0 +animation/clip_127/end_frame=0 +animation/clip_127/loops=false +animation/clip_128/name="" +animation/clip_128/start_frame=0 +animation/clip_128/end_frame=0 +animation/clip_128/loops=false +animation/clip_129/name="" +animation/clip_129/start_frame=0 +animation/clip_129/end_frame=0 +animation/clip_129/loops=false +animation/clip_130/name="" +animation/clip_130/start_frame=0 +animation/clip_130/end_frame=0 +animation/clip_130/loops=false +animation/clip_131/name="" +animation/clip_131/start_frame=0 +animation/clip_131/end_frame=0 +animation/clip_131/loops=false +animation/clip_132/name="" +animation/clip_132/start_frame=0 +animation/clip_132/end_frame=0 +animation/clip_132/loops=false +animation/clip_133/name="" +animation/clip_133/start_frame=0 +animation/clip_133/end_frame=0 +animation/clip_133/loops=false +animation/clip_134/name="" +animation/clip_134/start_frame=0 +animation/clip_134/end_frame=0 +animation/clip_134/loops=false +animation/clip_135/name="" +animation/clip_135/start_frame=0 +animation/clip_135/end_frame=0 +animation/clip_135/loops=false +animation/clip_136/name="" +animation/clip_136/start_frame=0 +animation/clip_136/end_frame=0 +animation/clip_136/loops=false +animation/clip_137/name="" +animation/clip_137/start_frame=0 +animation/clip_137/end_frame=0 +animation/clip_137/loops=false +animation/clip_138/name="" +animation/clip_138/start_frame=0 +animation/clip_138/end_frame=0 +animation/clip_138/loops=false +animation/clip_139/name="" +animation/clip_139/start_frame=0 +animation/clip_139/end_frame=0 +animation/clip_139/loops=false +animation/clip_140/name="" +animation/clip_140/start_frame=0 +animation/clip_140/end_frame=0 +animation/clip_140/loops=false +animation/clip_141/name="" +animation/clip_141/start_frame=0 +animation/clip_141/end_frame=0 +animation/clip_141/loops=false +animation/clip_142/name="" +animation/clip_142/start_frame=0 +animation/clip_142/end_frame=0 +animation/clip_142/loops=false +animation/clip_143/name="" +animation/clip_143/start_frame=0 +animation/clip_143/end_frame=0 +animation/clip_143/loops=false +animation/clip_144/name="" +animation/clip_144/start_frame=0 +animation/clip_144/end_frame=0 +animation/clip_144/loops=false +animation/clip_145/name="" +animation/clip_145/start_frame=0 +animation/clip_145/end_frame=0 +animation/clip_145/loops=false +animation/clip_146/name="" +animation/clip_146/start_frame=0 +animation/clip_146/end_frame=0 +animation/clip_146/loops=false +animation/clip_147/name="" +animation/clip_147/start_frame=0 +animation/clip_147/end_frame=0 +animation/clip_147/loops=false +animation/clip_148/name="" +animation/clip_148/start_frame=0 +animation/clip_148/end_frame=0 +animation/clip_148/loops=false +animation/clip_149/name="" +animation/clip_149/start_frame=0 +animation/clip_149/end_frame=0 +animation/clip_149/loops=false +animation/clip_150/name="" +animation/clip_150/start_frame=0 +animation/clip_150/end_frame=0 +animation/clip_150/loops=false +animation/clip_151/name="" +animation/clip_151/start_frame=0 +animation/clip_151/end_frame=0 +animation/clip_151/loops=false +animation/clip_152/name="" +animation/clip_152/start_frame=0 +animation/clip_152/end_frame=0 +animation/clip_152/loops=false +animation/clip_153/name="" +animation/clip_153/start_frame=0 +animation/clip_153/end_frame=0 +animation/clip_153/loops=false +animation/clip_154/name="" +animation/clip_154/start_frame=0 +animation/clip_154/end_frame=0 +animation/clip_154/loops=false +animation/clip_155/name="" +animation/clip_155/start_frame=0 +animation/clip_155/end_frame=0 +animation/clip_155/loops=false +animation/clip_156/name="" +animation/clip_156/start_frame=0 +animation/clip_156/end_frame=0 +animation/clip_156/loops=false +animation/clip_157/name="" +animation/clip_157/start_frame=0 +animation/clip_157/end_frame=0 +animation/clip_157/loops=false +animation/clip_158/name="" +animation/clip_158/start_frame=0 +animation/clip_158/end_frame=0 +animation/clip_158/loops=false +animation/clip_159/name="" +animation/clip_159/start_frame=0 +animation/clip_159/end_frame=0 +animation/clip_159/loops=false +animation/clip_160/name="" +animation/clip_160/start_frame=0 +animation/clip_160/end_frame=0 +animation/clip_160/loops=false +animation/clip_161/name="" +animation/clip_161/start_frame=0 +animation/clip_161/end_frame=0 +animation/clip_161/loops=false +animation/clip_162/name="" +animation/clip_162/start_frame=0 +animation/clip_162/end_frame=0 +animation/clip_162/loops=false +animation/clip_163/name="" +animation/clip_163/start_frame=0 +animation/clip_163/end_frame=0 +animation/clip_163/loops=false +animation/clip_164/name="" +animation/clip_164/start_frame=0 +animation/clip_164/end_frame=0 +animation/clip_164/loops=false +animation/clip_165/name="" +animation/clip_165/start_frame=0 +animation/clip_165/end_frame=0 +animation/clip_165/loops=false +animation/clip_166/name="" +animation/clip_166/start_frame=0 +animation/clip_166/end_frame=0 +animation/clip_166/loops=false +animation/clip_167/name="" +animation/clip_167/start_frame=0 +animation/clip_167/end_frame=0 +animation/clip_167/loops=false +animation/clip_168/name="" +animation/clip_168/start_frame=0 +animation/clip_168/end_frame=0 +animation/clip_168/loops=false +animation/clip_169/name="" +animation/clip_169/start_frame=0 +animation/clip_169/end_frame=0 +animation/clip_169/loops=false +animation/clip_170/name="" +animation/clip_170/start_frame=0 +animation/clip_170/end_frame=0 +animation/clip_170/loops=false +animation/clip_171/name="" +animation/clip_171/start_frame=0 +animation/clip_171/end_frame=0 +animation/clip_171/loops=false +animation/clip_172/name="" +animation/clip_172/start_frame=0 +animation/clip_172/end_frame=0 +animation/clip_172/loops=false +animation/clip_173/name="" +animation/clip_173/start_frame=0 +animation/clip_173/end_frame=0 +animation/clip_173/loops=false +animation/clip_174/name="" +animation/clip_174/start_frame=0 +animation/clip_174/end_frame=0 +animation/clip_174/loops=false +animation/clip_175/name="" +animation/clip_175/start_frame=0 +animation/clip_175/end_frame=0 +animation/clip_175/loops=false +animation/clip_176/name="" +animation/clip_176/start_frame=0 +animation/clip_176/end_frame=0 +animation/clip_176/loops=false +animation/clip_177/name="" +animation/clip_177/start_frame=0 +animation/clip_177/end_frame=0 +animation/clip_177/loops=false +animation/clip_178/name="" +animation/clip_178/start_frame=0 +animation/clip_178/end_frame=0 +animation/clip_178/loops=false +animation/clip_179/name="" +animation/clip_179/start_frame=0 +animation/clip_179/end_frame=0 +animation/clip_179/loops=false +animation/clip_180/name="" +animation/clip_180/start_frame=0 +animation/clip_180/end_frame=0 +animation/clip_180/loops=false +animation/clip_181/name="" +animation/clip_181/start_frame=0 +animation/clip_181/end_frame=0 +animation/clip_181/loops=false +animation/clip_182/name="" +animation/clip_182/start_frame=0 +animation/clip_182/end_frame=0 +animation/clip_182/loops=false +animation/clip_183/name="" +animation/clip_183/start_frame=0 +animation/clip_183/end_frame=0 +animation/clip_183/loops=false +animation/clip_184/name="" +animation/clip_184/start_frame=0 +animation/clip_184/end_frame=0 +animation/clip_184/loops=false +animation/clip_185/name="" +animation/clip_185/start_frame=0 +animation/clip_185/end_frame=0 +animation/clip_185/loops=false +animation/clip_186/name="" +animation/clip_186/start_frame=0 +animation/clip_186/end_frame=0 +animation/clip_186/loops=false +animation/clip_187/name="" +animation/clip_187/start_frame=0 +animation/clip_187/end_frame=0 +animation/clip_187/loops=false +animation/clip_188/name="" +animation/clip_188/start_frame=0 +animation/clip_188/end_frame=0 +animation/clip_188/loops=false +animation/clip_189/name="" +animation/clip_189/start_frame=0 +animation/clip_189/end_frame=0 +animation/clip_189/loops=false +animation/clip_190/name="" +animation/clip_190/start_frame=0 +animation/clip_190/end_frame=0 +animation/clip_190/loops=false +animation/clip_191/name="" +animation/clip_191/start_frame=0 +animation/clip_191/end_frame=0 +animation/clip_191/loops=false +animation/clip_192/name="" +animation/clip_192/start_frame=0 +animation/clip_192/end_frame=0 +animation/clip_192/loops=false +animation/clip_193/name="" +animation/clip_193/start_frame=0 +animation/clip_193/end_frame=0 +animation/clip_193/loops=false +animation/clip_194/name="" +animation/clip_194/start_frame=0 +animation/clip_194/end_frame=0 +animation/clip_194/loops=false +animation/clip_195/name="" +animation/clip_195/start_frame=0 +animation/clip_195/end_frame=0 +animation/clip_195/loops=false +animation/clip_196/name="" +animation/clip_196/start_frame=0 +animation/clip_196/end_frame=0 +animation/clip_196/loops=false +animation/clip_197/name="" +animation/clip_197/start_frame=0 +animation/clip_197/end_frame=0 +animation/clip_197/loops=false +animation/clip_198/name="" +animation/clip_198/start_frame=0 +animation/clip_198/end_frame=0 +animation/clip_198/loops=false +animation/clip_199/name="" +animation/clip_199/start_frame=0 +animation/clip_199/end_frame=0 +animation/clip_199/loops=false +animation/clip_200/name="" +animation/clip_200/start_frame=0 +animation/clip_200/end_frame=0 +animation/clip_200/loops=false +animation/clip_201/name="" +animation/clip_201/start_frame=0 +animation/clip_201/end_frame=0 +animation/clip_201/loops=false +animation/clip_202/name="" +animation/clip_202/start_frame=0 +animation/clip_202/end_frame=0 +animation/clip_202/loops=false +animation/clip_203/name="" +animation/clip_203/start_frame=0 +animation/clip_203/end_frame=0 +animation/clip_203/loops=false +animation/clip_204/name="" +animation/clip_204/start_frame=0 +animation/clip_204/end_frame=0 +animation/clip_204/loops=false +animation/clip_205/name="" +animation/clip_205/start_frame=0 +animation/clip_205/end_frame=0 +animation/clip_205/loops=false +animation/clip_206/name="" +animation/clip_206/start_frame=0 +animation/clip_206/end_frame=0 +animation/clip_206/loops=false +animation/clip_207/name="" +animation/clip_207/start_frame=0 +animation/clip_207/end_frame=0 +animation/clip_207/loops=false +animation/clip_208/name="" +animation/clip_208/start_frame=0 +animation/clip_208/end_frame=0 +animation/clip_208/loops=false +animation/clip_209/name="" +animation/clip_209/start_frame=0 +animation/clip_209/end_frame=0 +animation/clip_209/loops=false +animation/clip_210/name="" +animation/clip_210/start_frame=0 +animation/clip_210/end_frame=0 +animation/clip_210/loops=false +animation/clip_211/name="" +animation/clip_211/start_frame=0 +animation/clip_211/end_frame=0 +animation/clip_211/loops=false +animation/clip_212/name="" +animation/clip_212/start_frame=0 +animation/clip_212/end_frame=0 +animation/clip_212/loops=false +animation/clip_213/name="" +animation/clip_213/start_frame=0 +animation/clip_213/end_frame=0 +animation/clip_213/loops=false +animation/clip_214/name="" +animation/clip_214/start_frame=0 +animation/clip_214/end_frame=0 +animation/clip_214/loops=false +animation/clip_215/name="" +animation/clip_215/start_frame=0 +animation/clip_215/end_frame=0 +animation/clip_215/loops=false +animation/clip_216/name="" +animation/clip_216/start_frame=0 +animation/clip_216/end_frame=0 +animation/clip_216/loops=false +animation/clip_217/name="" +animation/clip_217/start_frame=0 +animation/clip_217/end_frame=0 +animation/clip_217/loops=false +animation/clip_218/name="" +animation/clip_218/start_frame=0 +animation/clip_218/end_frame=0 +animation/clip_218/loops=false +animation/clip_219/name="" +animation/clip_219/start_frame=0 +animation/clip_219/end_frame=0 +animation/clip_219/loops=false +animation/clip_220/name="" +animation/clip_220/start_frame=0 +animation/clip_220/end_frame=0 +animation/clip_220/loops=false +animation/clip_221/name="" +animation/clip_221/start_frame=0 +animation/clip_221/end_frame=0 +animation/clip_221/loops=false +animation/clip_222/name="" +animation/clip_222/start_frame=0 +animation/clip_222/end_frame=0 +animation/clip_222/loops=false +animation/clip_223/name="" +animation/clip_223/start_frame=0 +animation/clip_223/end_frame=0 +animation/clip_223/loops=false +animation/clip_224/name="" +animation/clip_224/start_frame=0 +animation/clip_224/end_frame=0 +animation/clip_224/loops=false +animation/clip_225/name="" +animation/clip_225/start_frame=0 +animation/clip_225/end_frame=0 +animation/clip_225/loops=false +animation/clip_226/name="" +animation/clip_226/start_frame=0 +animation/clip_226/end_frame=0 +animation/clip_226/loops=false +animation/clip_227/name="" +animation/clip_227/start_frame=0 +animation/clip_227/end_frame=0 +animation/clip_227/loops=false +animation/clip_228/name="" +animation/clip_228/start_frame=0 +animation/clip_228/end_frame=0 +animation/clip_228/loops=false +animation/clip_229/name="" +animation/clip_229/start_frame=0 +animation/clip_229/end_frame=0 +animation/clip_229/loops=false +animation/clip_230/name="" +animation/clip_230/start_frame=0 +animation/clip_230/end_frame=0 +animation/clip_230/loops=false +animation/clip_231/name="" +animation/clip_231/start_frame=0 +animation/clip_231/end_frame=0 +animation/clip_231/loops=false +animation/clip_232/name="" +animation/clip_232/start_frame=0 +animation/clip_232/end_frame=0 +animation/clip_232/loops=false +animation/clip_233/name="" +animation/clip_233/start_frame=0 +animation/clip_233/end_frame=0 +animation/clip_233/loops=false +animation/clip_234/name="" +animation/clip_234/start_frame=0 +animation/clip_234/end_frame=0 +animation/clip_234/loops=false +animation/clip_235/name="" +animation/clip_235/start_frame=0 +animation/clip_235/end_frame=0 +animation/clip_235/loops=false +animation/clip_236/name="" +animation/clip_236/start_frame=0 +animation/clip_236/end_frame=0 +animation/clip_236/loops=false +animation/clip_237/name="" +animation/clip_237/start_frame=0 +animation/clip_237/end_frame=0 +animation/clip_237/loops=false +animation/clip_238/name="" +animation/clip_238/start_frame=0 +animation/clip_238/end_frame=0 +animation/clip_238/loops=false +animation/clip_239/name="" +animation/clip_239/start_frame=0 +animation/clip_239/end_frame=0 +animation/clip_239/loops=false +animation/clip_240/name="" +animation/clip_240/start_frame=0 +animation/clip_240/end_frame=0 +animation/clip_240/loops=false +animation/clip_241/name="" +animation/clip_241/start_frame=0 +animation/clip_241/end_frame=0 +animation/clip_241/loops=false +animation/clip_242/name="" +animation/clip_242/start_frame=0 +animation/clip_242/end_frame=0 +animation/clip_242/loops=false +animation/clip_243/name="" +animation/clip_243/start_frame=0 +animation/clip_243/end_frame=0 +animation/clip_243/loops=false +animation/clip_244/name="" +animation/clip_244/start_frame=0 +animation/clip_244/end_frame=0 +animation/clip_244/loops=false +animation/clip_245/name="" +animation/clip_245/start_frame=0 +animation/clip_245/end_frame=0 +animation/clip_245/loops=false +animation/clip_246/name="" +animation/clip_246/start_frame=0 +animation/clip_246/end_frame=0 +animation/clip_246/loops=false +animation/clip_247/name="" +animation/clip_247/start_frame=0 +animation/clip_247/end_frame=0 +animation/clip_247/loops=false +animation/clip_248/name="" +animation/clip_248/start_frame=0 +animation/clip_248/end_frame=0 +animation/clip_248/loops=false +animation/clip_249/name="" +animation/clip_249/start_frame=0 +animation/clip_249/end_frame=0 +animation/clip_249/loops=false +animation/clip_250/name="" +animation/clip_250/start_frame=0 +animation/clip_250/end_frame=0 +animation/clip_250/loops=false +animation/clip_251/name="" +animation/clip_251/start_frame=0 +animation/clip_251/end_frame=0 +animation/clip_251/loops=false +animation/clip_252/name="" +animation/clip_252/start_frame=0 +animation/clip_252/end_frame=0 +animation/clip_252/loops=false +animation/clip_253/name="" +animation/clip_253/start_frame=0 +animation/clip_253/end_frame=0 +animation/clip_253/loops=false +animation/clip_254/name="" +animation/clip_254/start_frame=0 +animation/clip_254/end_frame=0 +animation/clip_254/loops=false +animation/clip_255/name="" +animation/clip_255/start_frame=0 +animation/clip_255/end_frame=0 +animation/clip_255/loops=false +animation/clip_256/name="" +animation/clip_256/start_frame=0 +animation/clip_256/end_frame=0 +animation/clip_256/loops=false diff --git a/project/media/models/car_parts/SMTE-hull.glb.import b/project/media/models/car_parts/SMTE-hull.glb.import new file mode 100644 index 00000000..83b28286 --- /dev/null +++ b/project/media/models/car_parts/SMTE-hull.glb.import @@ -0,0 +1,1064 @@ +[remap] + +importer="scene" +type="PackedScene" +path="res://.import/SMTE-hull.glb-f9840d56cb170aa2bb3f0e555cbb95c9.scn" + +[deps] + +source_file="res://media/models/car_parts/SMTE-hull.glb" +dest_files=[ "res://.import/SMTE-hull.glb-f9840d56cb170aa2bb3f0e555cbb95c9.scn" ] + +[params] + +nodes/root_type="Spatial" +nodes/root_name="Scene Root" +nodes/root_scale=1.0 +nodes/custom_script="" +nodes/storage=0 +nodes/use_legacy_names=false +materials/location=1 +materials/storage=1 +materials/keep_on_reimport=true +meshes/compress=true +meshes/ensure_tangents=true +meshes/storage=0 +meshes/light_baking=0 +meshes/lightmap_texel_size=0.1 +skins/use_named_skins=true +external_files/store_in_subdir=false +animation/import=true +animation/fps=15 +animation/filter_script="" +animation/storage=false +animation/keep_custom_tracks=false +animation/optimizer/enabled=true +animation/optimizer/max_linear_error=0.05 +animation/optimizer/max_angular_error=0.01 +animation/optimizer/max_angle=22 +animation/optimizer/remove_unused_tracks=true +animation/clips/amount=0 +animation/clip_1/name="" +animation/clip_1/start_frame=0 +animation/clip_1/end_frame=0 +animation/clip_1/loops=false +animation/clip_2/name="" +animation/clip_2/start_frame=0 +animation/clip_2/end_frame=0 +animation/clip_2/loops=false +animation/clip_3/name="" +animation/clip_3/start_frame=0 +animation/clip_3/end_frame=0 +animation/clip_3/loops=false +animation/clip_4/name="" +animation/clip_4/start_frame=0 +animation/clip_4/end_frame=0 +animation/clip_4/loops=false +animation/clip_5/name="" +animation/clip_5/start_frame=0 +animation/clip_5/end_frame=0 +animation/clip_5/loops=false +animation/clip_6/name="" +animation/clip_6/start_frame=0 +animation/clip_6/end_frame=0 +animation/clip_6/loops=false +animation/clip_7/name="" +animation/clip_7/start_frame=0 +animation/clip_7/end_frame=0 +animation/clip_7/loops=false +animation/clip_8/name="" +animation/clip_8/start_frame=0 +animation/clip_8/end_frame=0 +animation/clip_8/loops=false +animation/clip_9/name="" +animation/clip_9/start_frame=0 +animation/clip_9/end_frame=0 +animation/clip_9/loops=false +animation/clip_10/name="" +animation/clip_10/start_frame=0 +animation/clip_10/end_frame=0 +animation/clip_10/loops=false +animation/clip_11/name="" +animation/clip_11/start_frame=0 +animation/clip_11/end_frame=0 +animation/clip_11/loops=false +animation/clip_12/name="" +animation/clip_12/start_frame=0 +animation/clip_12/end_frame=0 +animation/clip_12/loops=false +animation/clip_13/name="" +animation/clip_13/start_frame=0 +animation/clip_13/end_frame=0 +animation/clip_13/loops=false +animation/clip_14/name="" +animation/clip_14/start_frame=0 +animation/clip_14/end_frame=0 +animation/clip_14/loops=false +animation/clip_15/name="" +animation/clip_15/start_frame=0 +animation/clip_15/end_frame=0 +animation/clip_15/loops=false +animation/clip_16/name="" +animation/clip_16/start_frame=0 +animation/clip_16/end_frame=0 +animation/clip_16/loops=false +animation/clip_17/name="" +animation/clip_17/start_frame=0 +animation/clip_17/end_frame=0 +animation/clip_17/loops=false +animation/clip_18/name="" +animation/clip_18/start_frame=0 +animation/clip_18/end_frame=0 +animation/clip_18/loops=false +animation/clip_19/name="" +animation/clip_19/start_frame=0 +animation/clip_19/end_frame=0 +animation/clip_19/loops=false +animation/clip_20/name="" +animation/clip_20/start_frame=0 +animation/clip_20/end_frame=0 +animation/clip_20/loops=false +animation/clip_21/name="" +animation/clip_21/start_frame=0 +animation/clip_21/end_frame=0 +animation/clip_21/loops=false +animation/clip_22/name="" +animation/clip_22/start_frame=0 +animation/clip_22/end_frame=0 +animation/clip_22/loops=false +animation/clip_23/name="" +animation/clip_23/start_frame=0 +animation/clip_23/end_frame=0 +animation/clip_23/loops=false +animation/clip_24/name="" +animation/clip_24/start_frame=0 +animation/clip_24/end_frame=0 +animation/clip_24/loops=false +animation/clip_25/name="" +animation/clip_25/start_frame=0 +animation/clip_25/end_frame=0 +animation/clip_25/loops=false +animation/clip_26/name="" +animation/clip_26/start_frame=0 +animation/clip_26/end_frame=0 +animation/clip_26/loops=false +animation/clip_27/name="" +animation/clip_27/start_frame=0 +animation/clip_27/end_frame=0 +animation/clip_27/loops=false +animation/clip_28/name="" +animation/clip_28/start_frame=0 +animation/clip_28/end_frame=0 +animation/clip_28/loops=false +animation/clip_29/name="" +animation/clip_29/start_frame=0 +animation/clip_29/end_frame=0 +animation/clip_29/loops=false +animation/clip_30/name="" +animation/clip_30/start_frame=0 +animation/clip_30/end_frame=0 +animation/clip_30/loops=false +animation/clip_31/name="" +animation/clip_31/start_frame=0 +animation/clip_31/end_frame=0 +animation/clip_31/loops=false +animation/clip_32/name="" +animation/clip_32/start_frame=0 +animation/clip_32/end_frame=0 +animation/clip_32/loops=false +animation/clip_33/name="" +animation/clip_33/start_frame=0 +animation/clip_33/end_frame=0 +animation/clip_33/loops=false +animation/clip_34/name="" +animation/clip_34/start_frame=0 +animation/clip_34/end_frame=0 +animation/clip_34/loops=false +animation/clip_35/name="" +animation/clip_35/start_frame=0 +animation/clip_35/end_frame=0 +animation/clip_35/loops=false +animation/clip_36/name="" +animation/clip_36/start_frame=0 +animation/clip_36/end_frame=0 +animation/clip_36/loops=false +animation/clip_37/name="" +animation/clip_37/start_frame=0 +animation/clip_37/end_frame=0 +animation/clip_37/loops=false +animation/clip_38/name="" +animation/clip_38/start_frame=0 +animation/clip_38/end_frame=0 +animation/clip_38/loops=false +animation/clip_39/name="" +animation/clip_39/start_frame=0 +animation/clip_39/end_frame=0 +animation/clip_39/loops=false +animation/clip_40/name="" +animation/clip_40/start_frame=0 +animation/clip_40/end_frame=0 +animation/clip_40/loops=false +animation/clip_41/name="" +animation/clip_41/start_frame=0 +animation/clip_41/end_frame=0 +animation/clip_41/loops=false +animation/clip_42/name="" +animation/clip_42/start_frame=0 +animation/clip_42/end_frame=0 +animation/clip_42/loops=false +animation/clip_43/name="" +animation/clip_43/start_frame=0 +animation/clip_43/end_frame=0 +animation/clip_43/loops=false +animation/clip_44/name="" +animation/clip_44/start_frame=0 +animation/clip_44/end_frame=0 +animation/clip_44/loops=false +animation/clip_45/name="" +animation/clip_45/start_frame=0 +animation/clip_45/end_frame=0 +animation/clip_45/loops=false +animation/clip_46/name="" +animation/clip_46/start_frame=0 +animation/clip_46/end_frame=0 +animation/clip_46/loops=false +animation/clip_47/name="" +animation/clip_47/start_frame=0 +animation/clip_47/end_frame=0 +animation/clip_47/loops=false +animation/clip_48/name="" +animation/clip_48/start_frame=0 +animation/clip_48/end_frame=0 +animation/clip_48/loops=false +animation/clip_49/name="" +animation/clip_49/start_frame=0 +animation/clip_49/end_frame=0 +animation/clip_49/loops=false +animation/clip_50/name="" +animation/clip_50/start_frame=0 +animation/clip_50/end_frame=0 +animation/clip_50/loops=false +animation/clip_51/name="" +animation/clip_51/start_frame=0 +animation/clip_51/end_frame=0 +animation/clip_51/loops=false +animation/clip_52/name="" +animation/clip_52/start_frame=0 +animation/clip_52/end_frame=0 +animation/clip_52/loops=false +animation/clip_53/name="" +animation/clip_53/start_frame=0 +animation/clip_53/end_frame=0 +animation/clip_53/loops=false +animation/clip_54/name="" +animation/clip_54/start_frame=0 +animation/clip_54/end_frame=0 +animation/clip_54/loops=false +animation/clip_55/name="" +animation/clip_55/start_frame=0 +animation/clip_55/end_frame=0 +animation/clip_55/loops=false +animation/clip_56/name="" +animation/clip_56/start_frame=0 +animation/clip_56/end_frame=0 +animation/clip_56/loops=false +animation/clip_57/name="" +animation/clip_57/start_frame=0 +animation/clip_57/end_frame=0 +animation/clip_57/loops=false +animation/clip_58/name="" +animation/clip_58/start_frame=0 +animation/clip_58/end_frame=0 +animation/clip_58/loops=false +animation/clip_59/name="" +animation/clip_59/start_frame=0 +animation/clip_59/end_frame=0 +animation/clip_59/loops=false +animation/clip_60/name="" +animation/clip_60/start_frame=0 +animation/clip_60/end_frame=0 +animation/clip_60/loops=false +animation/clip_61/name="" +animation/clip_61/start_frame=0 +animation/clip_61/end_frame=0 +animation/clip_61/loops=false +animation/clip_62/name="" +animation/clip_62/start_frame=0 +animation/clip_62/end_frame=0 +animation/clip_62/loops=false +animation/clip_63/name="" +animation/clip_63/start_frame=0 +animation/clip_63/end_frame=0 +animation/clip_63/loops=false +animation/clip_64/name="" +animation/clip_64/start_frame=0 +animation/clip_64/end_frame=0 +animation/clip_64/loops=false +animation/clip_65/name="" +animation/clip_65/start_frame=0 +animation/clip_65/end_frame=0 +animation/clip_65/loops=false +animation/clip_66/name="" +animation/clip_66/start_frame=0 +animation/clip_66/end_frame=0 +animation/clip_66/loops=false +animation/clip_67/name="" +animation/clip_67/start_frame=0 +animation/clip_67/end_frame=0 +animation/clip_67/loops=false +animation/clip_68/name="" +animation/clip_68/start_frame=0 +animation/clip_68/end_frame=0 +animation/clip_68/loops=false +animation/clip_69/name="" +animation/clip_69/start_frame=0 +animation/clip_69/end_frame=0 +animation/clip_69/loops=false +animation/clip_70/name="" +animation/clip_70/start_frame=0 +animation/clip_70/end_frame=0 +animation/clip_70/loops=false +animation/clip_71/name="" +animation/clip_71/start_frame=0 +animation/clip_71/end_frame=0 +animation/clip_71/loops=false +animation/clip_72/name="" +animation/clip_72/start_frame=0 +animation/clip_72/end_frame=0 +animation/clip_72/loops=false +animation/clip_73/name="" +animation/clip_73/start_frame=0 +animation/clip_73/end_frame=0 +animation/clip_73/loops=false +animation/clip_74/name="" +animation/clip_74/start_frame=0 +animation/clip_74/end_frame=0 +animation/clip_74/loops=false +animation/clip_75/name="" +animation/clip_75/start_frame=0 +animation/clip_75/end_frame=0 +animation/clip_75/loops=false +animation/clip_76/name="" +animation/clip_76/start_frame=0 +animation/clip_76/end_frame=0 +animation/clip_76/loops=false +animation/clip_77/name="" +animation/clip_77/start_frame=0 +animation/clip_77/end_frame=0 +animation/clip_77/loops=false +animation/clip_78/name="" +animation/clip_78/start_frame=0 +animation/clip_78/end_frame=0 +animation/clip_78/loops=false +animation/clip_79/name="" +animation/clip_79/start_frame=0 +animation/clip_79/end_frame=0 +animation/clip_79/loops=false +animation/clip_80/name="" +animation/clip_80/start_frame=0 +animation/clip_80/end_frame=0 +animation/clip_80/loops=false +animation/clip_81/name="" +animation/clip_81/start_frame=0 +animation/clip_81/end_frame=0 +animation/clip_81/loops=false +animation/clip_82/name="" +animation/clip_82/start_frame=0 +animation/clip_82/end_frame=0 +animation/clip_82/loops=false +animation/clip_83/name="" +animation/clip_83/start_frame=0 +animation/clip_83/end_frame=0 +animation/clip_83/loops=false +animation/clip_84/name="" +animation/clip_84/start_frame=0 +animation/clip_84/end_frame=0 +animation/clip_84/loops=false +animation/clip_85/name="" +animation/clip_85/start_frame=0 +animation/clip_85/end_frame=0 +animation/clip_85/loops=false +animation/clip_86/name="" +animation/clip_86/start_frame=0 +animation/clip_86/end_frame=0 +animation/clip_86/loops=false +animation/clip_87/name="" +animation/clip_87/start_frame=0 +animation/clip_87/end_frame=0 +animation/clip_87/loops=false +animation/clip_88/name="" +animation/clip_88/start_frame=0 +animation/clip_88/end_frame=0 +animation/clip_88/loops=false +animation/clip_89/name="" +animation/clip_89/start_frame=0 +animation/clip_89/end_frame=0 +animation/clip_89/loops=false +animation/clip_90/name="" +animation/clip_90/start_frame=0 +animation/clip_90/end_frame=0 +animation/clip_90/loops=false +animation/clip_91/name="" +animation/clip_91/start_frame=0 +animation/clip_91/end_frame=0 +animation/clip_91/loops=false +animation/clip_92/name="" +animation/clip_92/start_frame=0 +animation/clip_92/end_frame=0 +animation/clip_92/loops=false +animation/clip_93/name="" +animation/clip_93/start_frame=0 +animation/clip_93/end_frame=0 +animation/clip_93/loops=false +animation/clip_94/name="" +animation/clip_94/start_frame=0 +animation/clip_94/end_frame=0 +animation/clip_94/loops=false +animation/clip_95/name="" +animation/clip_95/start_frame=0 +animation/clip_95/end_frame=0 +animation/clip_95/loops=false +animation/clip_96/name="" +animation/clip_96/start_frame=0 +animation/clip_96/end_frame=0 +animation/clip_96/loops=false +animation/clip_97/name="" +animation/clip_97/start_frame=0 +animation/clip_97/end_frame=0 +animation/clip_97/loops=false +animation/clip_98/name="" +animation/clip_98/start_frame=0 +animation/clip_98/end_frame=0 +animation/clip_98/loops=false +animation/clip_99/name="" +animation/clip_99/start_frame=0 +animation/clip_99/end_frame=0 +animation/clip_99/loops=false +animation/clip_100/name="" +animation/clip_100/start_frame=0 +animation/clip_100/end_frame=0 +animation/clip_100/loops=false +animation/clip_101/name="" +animation/clip_101/start_frame=0 +animation/clip_101/end_frame=0 +animation/clip_101/loops=false +animation/clip_102/name="" +animation/clip_102/start_frame=0 +animation/clip_102/end_frame=0 +animation/clip_102/loops=false +animation/clip_103/name="" +animation/clip_103/start_frame=0 +animation/clip_103/end_frame=0 +animation/clip_103/loops=false +animation/clip_104/name="" +animation/clip_104/start_frame=0 +animation/clip_104/end_frame=0 +animation/clip_104/loops=false +animation/clip_105/name="" +animation/clip_105/start_frame=0 +animation/clip_105/end_frame=0 +animation/clip_105/loops=false +animation/clip_106/name="" +animation/clip_106/start_frame=0 +animation/clip_106/end_frame=0 +animation/clip_106/loops=false +animation/clip_107/name="" +animation/clip_107/start_frame=0 +animation/clip_107/end_frame=0 +animation/clip_107/loops=false +animation/clip_108/name="" +animation/clip_108/start_frame=0 +animation/clip_108/end_frame=0 +animation/clip_108/loops=false +animation/clip_109/name="" +animation/clip_109/start_frame=0 +animation/clip_109/end_frame=0 +animation/clip_109/loops=false +animation/clip_110/name="" +animation/clip_110/start_frame=0 +animation/clip_110/end_frame=0 +animation/clip_110/loops=false +animation/clip_111/name="" +animation/clip_111/start_frame=0 +animation/clip_111/end_frame=0 +animation/clip_111/loops=false +animation/clip_112/name="" +animation/clip_112/start_frame=0 +animation/clip_112/end_frame=0 +animation/clip_112/loops=false +animation/clip_113/name="" +animation/clip_113/start_frame=0 +animation/clip_113/end_frame=0 +animation/clip_113/loops=false +animation/clip_114/name="" +animation/clip_114/start_frame=0 +animation/clip_114/end_frame=0 +animation/clip_114/loops=false +animation/clip_115/name="" +animation/clip_115/start_frame=0 +animation/clip_115/end_frame=0 +animation/clip_115/loops=false +animation/clip_116/name="" +animation/clip_116/start_frame=0 +animation/clip_116/end_frame=0 +animation/clip_116/loops=false +animation/clip_117/name="" +animation/clip_117/start_frame=0 +animation/clip_117/end_frame=0 +animation/clip_117/loops=false +animation/clip_118/name="" +animation/clip_118/start_frame=0 +animation/clip_118/end_frame=0 +animation/clip_118/loops=false +animation/clip_119/name="" +animation/clip_119/start_frame=0 +animation/clip_119/end_frame=0 +animation/clip_119/loops=false +animation/clip_120/name="" +animation/clip_120/start_frame=0 +animation/clip_120/end_frame=0 +animation/clip_120/loops=false +animation/clip_121/name="" +animation/clip_121/start_frame=0 +animation/clip_121/end_frame=0 +animation/clip_121/loops=false +animation/clip_122/name="" +animation/clip_122/start_frame=0 +animation/clip_122/end_frame=0 +animation/clip_122/loops=false +animation/clip_123/name="" +animation/clip_123/start_frame=0 +animation/clip_123/end_frame=0 +animation/clip_123/loops=false +animation/clip_124/name="" +animation/clip_124/start_frame=0 +animation/clip_124/end_frame=0 +animation/clip_124/loops=false +animation/clip_125/name="" +animation/clip_125/start_frame=0 +animation/clip_125/end_frame=0 +animation/clip_125/loops=false +animation/clip_126/name="" +animation/clip_126/start_frame=0 +animation/clip_126/end_frame=0 +animation/clip_126/loops=false +animation/clip_127/name="" +animation/clip_127/start_frame=0 +animation/clip_127/end_frame=0 +animation/clip_127/loops=false +animation/clip_128/name="" +animation/clip_128/start_frame=0 +animation/clip_128/end_frame=0 +animation/clip_128/loops=false +animation/clip_129/name="" +animation/clip_129/start_frame=0 +animation/clip_129/end_frame=0 +animation/clip_129/loops=false +animation/clip_130/name="" +animation/clip_130/start_frame=0 +animation/clip_130/end_frame=0 +animation/clip_130/loops=false +animation/clip_131/name="" +animation/clip_131/start_frame=0 +animation/clip_131/end_frame=0 +animation/clip_131/loops=false +animation/clip_132/name="" +animation/clip_132/start_frame=0 +animation/clip_132/end_frame=0 +animation/clip_132/loops=false +animation/clip_133/name="" +animation/clip_133/start_frame=0 +animation/clip_133/end_frame=0 +animation/clip_133/loops=false +animation/clip_134/name="" +animation/clip_134/start_frame=0 +animation/clip_134/end_frame=0 +animation/clip_134/loops=false +animation/clip_135/name="" +animation/clip_135/start_frame=0 +animation/clip_135/end_frame=0 +animation/clip_135/loops=false +animation/clip_136/name="" +animation/clip_136/start_frame=0 +animation/clip_136/end_frame=0 +animation/clip_136/loops=false +animation/clip_137/name="" +animation/clip_137/start_frame=0 +animation/clip_137/end_frame=0 +animation/clip_137/loops=false +animation/clip_138/name="" +animation/clip_138/start_frame=0 +animation/clip_138/end_frame=0 +animation/clip_138/loops=false +animation/clip_139/name="" +animation/clip_139/start_frame=0 +animation/clip_139/end_frame=0 +animation/clip_139/loops=false +animation/clip_140/name="" +animation/clip_140/start_frame=0 +animation/clip_140/end_frame=0 +animation/clip_140/loops=false +animation/clip_141/name="" +animation/clip_141/start_frame=0 +animation/clip_141/end_frame=0 +animation/clip_141/loops=false +animation/clip_142/name="" +animation/clip_142/start_frame=0 +animation/clip_142/end_frame=0 +animation/clip_142/loops=false +animation/clip_143/name="" +animation/clip_143/start_frame=0 +animation/clip_143/end_frame=0 +animation/clip_143/loops=false +animation/clip_144/name="" +animation/clip_144/start_frame=0 +animation/clip_144/end_frame=0 +animation/clip_144/loops=false +animation/clip_145/name="" +animation/clip_145/start_frame=0 +animation/clip_145/end_frame=0 +animation/clip_145/loops=false +animation/clip_146/name="" +animation/clip_146/start_frame=0 +animation/clip_146/end_frame=0 +animation/clip_146/loops=false +animation/clip_147/name="" +animation/clip_147/start_frame=0 +animation/clip_147/end_frame=0 +animation/clip_147/loops=false +animation/clip_148/name="" +animation/clip_148/start_frame=0 +animation/clip_148/end_frame=0 +animation/clip_148/loops=false +animation/clip_149/name="" +animation/clip_149/start_frame=0 +animation/clip_149/end_frame=0 +animation/clip_149/loops=false +animation/clip_150/name="" +animation/clip_150/start_frame=0 +animation/clip_150/end_frame=0 +animation/clip_150/loops=false +animation/clip_151/name="" +animation/clip_151/start_frame=0 +animation/clip_151/end_frame=0 +animation/clip_151/loops=false +animation/clip_152/name="" +animation/clip_152/start_frame=0 +animation/clip_152/end_frame=0 +animation/clip_152/loops=false +animation/clip_153/name="" +animation/clip_153/start_frame=0 +animation/clip_153/end_frame=0 +animation/clip_153/loops=false +animation/clip_154/name="" +animation/clip_154/start_frame=0 +animation/clip_154/end_frame=0 +animation/clip_154/loops=false +animation/clip_155/name="" +animation/clip_155/start_frame=0 +animation/clip_155/end_frame=0 +animation/clip_155/loops=false +animation/clip_156/name="" +animation/clip_156/start_frame=0 +animation/clip_156/end_frame=0 +animation/clip_156/loops=false +animation/clip_157/name="" +animation/clip_157/start_frame=0 +animation/clip_157/end_frame=0 +animation/clip_157/loops=false +animation/clip_158/name="" +animation/clip_158/start_frame=0 +animation/clip_158/end_frame=0 +animation/clip_158/loops=false +animation/clip_159/name="" +animation/clip_159/start_frame=0 +animation/clip_159/end_frame=0 +animation/clip_159/loops=false +animation/clip_160/name="" +animation/clip_160/start_frame=0 +animation/clip_160/end_frame=0 +animation/clip_160/loops=false +animation/clip_161/name="" +animation/clip_161/start_frame=0 +animation/clip_161/end_frame=0 +animation/clip_161/loops=false +animation/clip_162/name="" +animation/clip_162/start_frame=0 +animation/clip_162/end_frame=0 +animation/clip_162/loops=false +animation/clip_163/name="" +animation/clip_163/start_frame=0 +animation/clip_163/end_frame=0 +animation/clip_163/loops=false +animation/clip_164/name="" +animation/clip_164/start_frame=0 +animation/clip_164/end_frame=0 +animation/clip_164/loops=false +animation/clip_165/name="" +animation/clip_165/start_frame=0 +animation/clip_165/end_frame=0 +animation/clip_165/loops=false +animation/clip_166/name="" +animation/clip_166/start_frame=0 +animation/clip_166/end_frame=0 +animation/clip_166/loops=false +animation/clip_167/name="" +animation/clip_167/start_frame=0 +animation/clip_167/end_frame=0 +animation/clip_167/loops=false +animation/clip_168/name="" +animation/clip_168/start_frame=0 +animation/clip_168/end_frame=0 +animation/clip_168/loops=false +animation/clip_169/name="" +animation/clip_169/start_frame=0 +animation/clip_169/end_frame=0 +animation/clip_169/loops=false +animation/clip_170/name="" +animation/clip_170/start_frame=0 +animation/clip_170/end_frame=0 +animation/clip_170/loops=false +animation/clip_171/name="" +animation/clip_171/start_frame=0 +animation/clip_171/end_frame=0 +animation/clip_171/loops=false +animation/clip_172/name="" +animation/clip_172/start_frame=0 +animation/clip_172/end_frame=0 +animation/clip_172/loops=false +animation/clip_173/name="" +animation/clip_173/start_frame=0 +animation/clip_173/end_frame=0 +animation/clip_173/loops=false +animation/clip_174/name="" +animation/clip_174/start_frame=0 +animation/clip_174/end_frame=0 +animation/clip_174/loops=false +animation/clip_175/name="" +animation/clip_175/start_frame=0 +animation/clip_175/end_frame=0 +animation/clip_175/loops=false +animation/clip_176/name="" +animation/clip_176/start_frame=0 +animation/clip_176/end_frame=0 +animation/clip_176/loops=false +animation/clip_177/name="" +animation/clip_177/start_frame=0 +animation/clip_177/end_frame=0 +animation/clip_177/loops=false +animation/clip_178/name="" +animation/clip_178/start_frame=0 +animation/clip_178/end_frame=0 +animation/clip_178/loops=false +animation/clip_179/name="" +animation/clip_179/start_frame=0 +animation/clip_179/end_frame=0 +animation/clip_179/loops=false +animation/clip_180/name="" +animation/clip_180/start_frame=0 +animation/clip_180/end_frame=0 +animation/clip_180/loops=false +animation/clip_181/name="" +animation/clip_181/start_frame=0 +animation/clip_181/end_frame=0 +animation/clip_181/loops=false +animation/clip_182/name="" +animation/clip_182/start_frame=0 +animation/clip_182/end_frame=0 +animation/clip_182/loops=false +animation/clip_183/name="" +animation/clip_183/start_frame=0 +animation/clip_183/end_frame=0 +animation/clip_183/loops=false +animation/clip_184/name="" +animation/clip_184/start_frame=0 +animation/clip_184/end_frame=0 +animation/clip_184/loops=false +animation/clip_185/name="" +animation/clip_185/start_frame=0 +animation/clip_185/end_frame=0 +animation/clip_185/loops=false +animation/clip_186/name="" +animation/clip_186/start_frame=0 +animation/clip_186/end_frame=0 +animation/clip_186/loops=false +animation/clip_187/name="" +animation/clip_187/start_frame=0 +animation/clip_187/end_frame=0 +animation/clip_187/loops=false +animation/clip_188/name="" +animation/clip_188/start_frame=0 +animation/clip_188/end_frame=0 +animation/clip_188/loops=false +animation/clip_189/name="" +animation/clip_189/start_frame=0 +animation/clip_189/end_frame=0 +animation/clip_189/loops=false +animation/clip_190/name="" +animation/clip_190/start_frame=0 +animation/clip_190/end_frame=0 +animation/clip_190/loops=false +animation/clip_191/name="" +animation/clip_191/start_frame=0 +animation/clip_191/end_frame=0 +animation/clip_191/loops=false +animation/clip_192/name="" +animation/clip_192/start_frame=0 +animation/clip_192/end_frame=0 +animation/clip_192/loops=false +animation/clip_193/name="" +animation/clip_193/start_frame=0 +animation/clip_193/end_frame=0 +animation/clip_193/loops=false +animation/clip_194/name="" +animation/clip_194/start_frame=0 +animation/clip_194/end_frame=0 +animation/clip_194/loops=false +animation/clip_195/name="" +animation/clip_195/start_frame=0 +animation/clip_195/end_frame=0 +animation/clip_195/loops=false +animation/clip_196/name="" +animation/clip_196/start_frame=0 +animation/clip_196/end_frame=0 +animation/clip_196/loops=false +animation/clip_197/name="" +animation/clip_197/start_frame=0 +animation/clip_197/end_frame=0 +animation/clip_197/loops=false +animation/clip_198/name="" +animation/clip_198/start_frame=0 +animation/clip_198/end_frame=0 +animation/clip_198/loops=false +animation/clip_199/name="" +animation/clip_199/start_frame=0 +animation/clip_199/end_frame=0 +animation/clip_199/loops=false +animation/clip_200/name="" +animation/clip_200/start_frame=0 +animation/clip_200/end_frame=0 +animation/clip_200/loops=false +animation/clip_201/name="" +animation/clip_201/start_frame=0 +animation/clip_201/end_frame=0 +animation/clip_201/loops=false +animation/clip_202/name="" +animation/clip_202/start_frame=0 +animation/clip_202/end_frame=0 +animation/clip_202/loops=false +animation/clip_203/name="" +animation/clip_203/start_frame=0 +animation/clip_203/end_frame=0 +animation/clip_203/loops=false +animation/clip_204/name="" +animation/clip_204/start_frame=0 +animation/clip_204/end_frame=0 +animation/clip_204/loops=false +animation/clip_205/name="" +animation/clip_205/start_frame=0 +animation/clip_205/end_frame=0 +animation/clip_205/loops=false +animation/clip_206/name="" +animation/clip_206/start_frame=0 +animation/clip_206/end_frame=0 +animation/clip_206/loops=false +animation/clip_207/name="" +animation/clip_207/start_frame=0 +animation/clip_207/end_frame=0 +animation/clip_207/loops=false +animation/clip_208/name="" +animation/clip_208/start_frame=0 +animation/clip_208/end_frame=0 +animation/clip_208/loops=false +animation/clip_209/name="" +animation/clip_209/start_frame=0 +animation/clip_209/end_frame=0 +animation/clip_209/loops=false +animation/clip_210/name="" +animation/clip_210/start_frame=0 +animation/clip_210/end_frame=0 +animation/clip_210/loops=false +animation/clip_211/name="" +animation/clip_211/start_frame=0 +animation/clip_211/end_frame=0 +animation/clip_211/loops=false +animation/clip_212/name="" +animation/clip_212/start_frame=0 +animation/clip_212/end_frame=0 +animation/clip_212/loops=false +animation/clip_213/name="" +animation/clip_213/start_frame=0 +animation/clip_213/end_frame=0 +animation/clip_213/loops=false +animation/clip_214/name="" +animation/clip_214/start_frame=0 +animation/clip_214/end_frame=0 +animation/clip_214/loops=false +animation/clip_215/name="" +animation/clip_215/start_frame=0 +animation/clip_215/end_frame=0 +animation/clip_215/loops=false +animation/clip_216/name="" +animation/clip_216/start_frame=0 +animation/clip_216/end_frame=0 +animation/clip_216/loops=false +animation/clip_217/name="" +animation/clip_217/start_frame=0 +animation/clip_217/end_frame=0 +animation/clip_217/loops=false +animation/clip_218/name="" +animation/clip_218/start_frame=0 +animation/clip_218/end_frame=0 +animation/clip_218/loops=false +animation/clip_219/name="" +animation/clip_219/start_frame=0 +animation/clip_219/end_frame=0 +animation/clip_219/loops=false +animation/clip_220/name="" +animation/clip_220/start_frame=0 +animation/clip_220/end_frame=0 +animation/clip_220/loops=false +animation/clip_221/name="" +animation/clip_221/start_frame=0 +animation/clip_221/end_frame=0 +animation/clip_221/loops=false +animation/clip_222/name="" +animation/clip_222/start_frame=0 +animation/clip_222/end_frame=0 +animation/clip_222/loops=false +animation/clip_223/name="" +animation/clip_223/start_frame=0 +animation/clip_223/end_frame=0 +animation/clip_223/loops=false +animation/clip_224/name="" +animation/clip_224/start_frame=0 +animation/clip_224/end_frame=0 +animation/clip_224/loops=false +animation/clip_225/name="" +animation/clip_225/start_frame=0 +animation/clip_225/end_frame=0 +animation/clip_225/loops=false +animation/clip_226/name="" +animation/clip_226/start_frame=0 +animation/clip_226/end_frame=0 +animation/clip_226/loops=false +animation/clip_227/name="" +animation/clip_227/start_frame=0 +animation/clip_227/end_frame=0 +animation/clip_227/loops=false +animation/clip_228/name="" +animation/clip_228/start_frame=0 +animation/clip_228/end_frame=0 +animation/clip_228/loops=false +animation/clip_229/name="" +animation/clip_229/start_frame=0 +animation/clip_229/end_frame=0 +animation/clip_229/loops=false +animation/clip_230/name="" +animation/clip_230/start_frame=0 +animation/clip_230/end_frame=0 +animation/clip_230/loops=false +animation/clip_231/name="" +animation/clip_231/start_frame=0 +animation/clip_231/end_frame=0 +animation/clip_231/loops=false +animation/clip_232/name="" +animation/clip_232/start_frame=0 +animation/clip_232/end_frame=0 +animation/clip_232/loops=false +animation/clip_233/name="" +animation/clip_233/start_frame=0 +animation/clip_233/end_frame=0 +animation/clip_233/loops=false +animation/clip_234/name="" +animation/clip_234/start_frame=0 +animation/clip_234/end_frame=0 +animation/clip_234/loops=false +animation/clip_235/name="" +animation/clip_235/start_frame=0 +animation/clip_235/end_frame=0 +animation/clip_235/loops=false +animation/clip_236/name="" +animation/clip_236/start_frame=0 +animation/clip_236/end_frame=0 +animation/clip_236/loops=false +animation/clip_237/name="" +animation/clip_237/start_frame=0 +animation/clip_237/end_frame=0 +animation/clip_237/loops=false +animation/clip_238/name="" +animation/clip_238/start_frame=0 +animation/clip_238/end_frame=0 +animation/clip_238/loops=false +animation/clip_239/name="" +animation/clip_239/start_frame=0 +animation/clip_239/end_frame=0 +animation/clip_239/loops=false +animation/clip_240/name="" +animation/clip_240/start_frame=0 +animation/clip_240/end_frame=0 +animation/clip_240/loops=false +animation/clip_241/name="" +animation/clip_241/start_frame=0 +animation/clip_241/end_frame=0 +animation/clip_241/loops=false +animation/clip_242/name="" +animation/clip_242/start_frame=0 +animation/clip_242/end_frame=0 +animation/clip_242/loops=false +animation/clip_243/name="" +animation/clip_243/start_frame=0 +animation/clip_243/end_frame=0 +animation/clip_243/loops=false +animation/clip_244/name="" +animation/clip_244/start_frame=0 +animation/clip_244/end_frame=0 +animation/clip_244/loops=false +animation/clip_245/name="" +animation/clip_245/start_frame=0 +animation/clip_245/end_frame=0 +animation/clip_245/loops=false +animation/clip_246/name="" +animation/clip_246/start_frame=0 +animation/clip_246/end_frame=0 +animation/clip_246/loops=false +animation/clip_247/name="" +animation/clip_247/start_frame=0 +animation/clip_247/end_frame=0 +animation/clip_247/loops=false +animation/clip_248/name="" +animation/clip_248/start_frame=0 +animation/clip_248/end_frame=0 +animation/clip_248/loops=false +animation/clip_249/name="" +animation/clip_249/start_frame=0 +animation/clip_249/end_frame=0 +animation/clip_249/loops=false +animation/clip_250/name="" +animation/clip_250/start_frame=0 +animation/clip_250/end_frame=0 +animation/clip_250/loops=false +animation/clip_251/name="" +animation/clip_251/start_frame=0 +animation/clip_251/end_frame=0 +animation/clip_251/loops=false +animation/clip_252/name="" +animation/clip_252/start_frame=0 +animation/clip_252/end_frame=0 +animation/clip_252/loops=false +animation/clip_253/name="" +animation/clip_253/start_frame=0 +animation/clip_253/end_frame=0 +animation/clip_253/loops=false +animation/clip_254/name="" +animation/clip_254/start_frame=0 +animation/clip_254/end_frame=0 +animation/clip_254/loops=false +animation/clip_255/name="" +animation/clip_255/start_frame=0 +animation/clip_255/end_frame=0 +animation/clip_255/loops=false +animation/clip_256/name="" +animation/clip_256/start_frame=0 +animation/clip_256/end_frame=0 +animation/clip_256/loops=false diff --git "a/project/media/models/tereno/Monta\357\277\203\357\276\261a.material" "b/project/media/models/tereno/Monta\357\277\203\357\276\261a.material" new file mode 100644 index 0000000000000000000000000000000000000000..acac3fb2e15ab2cf210281b4ac8344a1637b3639 GIT binary patch literal 1622 zcmbVNOODhq5H$jX`2YVPZa~8<5uXL?*$fA;s^dz>!m*>Wd%A}e17|?u09=3zzyVlt z3RZIhB&wXm{o4`AO8lz)Tz;;q9K1VttA^(^zsGTnzu$F`EVzA0NcusSKi}6 z7{i<@)Gk!ubP76F=uur+w|Qt$NfdfXJEMl7vNfTCR z565%GwbL3KVd_vrJGHDse}**z^l?t8t3b?=n2cI*Q9a}xhErF;1=4aLh`Ns_A9TZP zV;`9)!-_*2wXtV-9_$(b;)Y~97Uqjhc?fQDT~_8rT6#E!EO9I8tz`;5Xu-CxbKJg#eiU2Tkk)MYjf zx0e;n8MeC4#Hy?F?9*Zb=WLau9VdDeDd$H)ISukU*?1e&RRi9m%hf<(K5IM<)lg=V zN15OO6YQXcLDa{Vk70w?=p}zl4!_Ti0*M}E+cKBCtQ-PW0a8J4G78?tkSKIV1->Y7 zC{wBQ{#M5gr7y(!l+&{o{S&vG;w^=it9v_2*^ICzsM2=uhK07SP)O65A3h(hR-%zv zsOyL+_Z^w8>QtiHK%|FImo@IG_BN>YHmUY@sMe4*D(N{Lg{5t|De0Q~&=9balW{R8 z@Z1HmAs5y;hGWI;B=Lt*r+7T$!437rWYVIsFcCi&C#)a(Fxd}2!O73hCqKT!({^m+ zf6vNlmD}rflb0WW@QRCM^*TfDBvSOhj*nk|{qp Date: Thu, 23 Sep 2021 21:45:00 +0200 Subject: [PATCH 02/61] Edit button with window --- project/src/ui/code_editor/MainWindow.gd | 13 ++++++++ project/src/ui/code_editor/MainWindow.tscn | 31 +++++++++++++++++++ project/src/ui/sketch_control/ControlPane.gd | 15 +++++++++ .../src/ui/sketch_control/ControlPane.tscn | 11 +++++++ 4 files changed, 70 insertions(+) create mode 100644 project/src/ui/code_editor/MainWindow.gd create mode 100644 project/src/ui/code_editor/MainWindow.tscn diff --git a/project/src/ui/code_editor/MainWindow.gd b/project/src/ui/code_editor/MainWindow.gd new file mode 100644 index 00000000..926d9f2f --- /dev/null +++ b/project/src/ui/code_editor/MainWindow.gd @@ -0,0 +1,13 @@ +extends Control + +onready var close_btn: Button = $Close + +# Called when the node enters the scene tree for the first time. +func _ready(): + close_btn.connect("pressed", self, "_on_close") + +func _on_close() -> void: + queue_free() + + + diff --git a/project/src/ui/code_editor/MainWindow.tscn b/project/src/ui/code_editor/MainWindow.tscn new file mode 100644 index 00000000..e97caf25 --- /dev/null +++ b/project/src/ui/code_editor/MainWindow.tscn @@ -0,0 +1,31 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://src/ui/code_editor/MainWindow.gd" type="Script" id=1] + +[node name="Control" type="Control"] +anchor_right = 1.0 +anchor_bottom = 1.0 +margin_left = 500.0 +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="TextEdit" type="TextEdit" parent="."] +margin_left = 144.141 +margin_top = 220.448 +margin_right = 644.141 +margin_bottom = 555.448 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Close" type="Button" parent="."] +margin_left = 617.0 +margin_top = 193.0 +margin_right = 643.0 +margin_bottom = 219.0 +text = "X" +__meta__ = { +"_edit_use_anchors_": false +} diff --git a/project/src/ui/sketch_control/ControlPane.gd b/project/src/ui/sketch_control/ControlPane.gd index 5daee16e..863ee98c 100644 --- a/project/src/ui/sketch_control/ControlPane.gd +++ b/project/src/ui/sketch_control/ControlPane.gd @@ -19,6 +19,7 @@ extends VBoxContainer var notification_t = preload("res://src/ui/simple_notification/SimpleNotification.tscn") var collapsable_t = preload("res://src/ui/collapsable/collapsable.tscn") +var code_main_window_t = preload("res://src/ui/code_editor/MainWindow.tscn") signal notification_created signal grab_focus @@ -26,6 +27,8 @@ signal grab_focus var _toolchain: Toolchain = null var _board = null +onready var edit_btn: Button = $SketchSlot/VBoxContainer2/HBoxContainer/HBoxContainer/Edit + onready var compile_btn: Button = $SketchSlot/VBoxContainer2/HBoxContainer/HBoxContainer/Compile onready var compile_log_btn: Button = $SketchSlot/VBoxContainer2/HBoxContainer/HBoxContainer/CompileLog onready var sketch_status: Label = $SketchSlot/VBoxContainer2/VBoxContainer/SketchStatus @@ -108,6 +111,8 @@ func _ready(): _board.connect(sig, self, "_on_board_" + sig) _board.connect("log", self, "_on_board_log") + + edit_btn.connect("pressed", self, "_on_edit") compile_btn.connect("pressed", self, "_on_compile") compile_log_btn.connect("pressed", self, "_show_compile_log") @@ -232,6 +237,16 @@ func _on_board_log(part: String): sketch_log.text += part +func _on_edit() -> void: + get_focus_owner().release_focus() + + #_set_vis(false) + + var code_editor = code_main_window_t.instance() + get_tree().root.add_child(code_editor) + + + func _on_compile() -> void: if ! _toolchain.compile(_board.get_sketch()): _create_notification("Failed to start compilation", 5) diff --git a/project/src/ui/sketch_control/ControlPane.tscn b/project/src/ui/sketch_control/ControlPane.tscn index ad4c7475..aff3cefa 100644 --- a/project/src/ui/sketch_control/ControlPane.tscn +++ b/project/src/ui/sketch_control/ControlPane.tscn @@ -145,6 +145,17 @@ margin_right = 1272.0 margin_bottom = 32.0 alignment = 2 +[node name="Edit" type="Button" parent="SketchSlot/VBoxContainer2/HBoxContainer/HBoxContainer"] +margin_left = 1112.0 +margin_right = 1154.0 +margin_bottom = 32.0 +mouse_default_cursor_shape = 2 +theme = ExtResource( 4 ) +text = " Edit " +__meta__ = { +"_edit_use_anchors_": false +} + [node name="Compile" type="Button" parent="SketchSlot/VBoxContainer2/HBoxContainer/HBoxContainer"] margin_left = 1158.0 margin_right = 1229.0 From 8f7f9f07ba03eb7299f18788c5163475f4600c14 Mon Sep 17 00:00:00 2001 From: akjeller Date: Thu, 30 Sep 2021 16:36:31 +0200 Subject: [PATCH 03/61] Contribution tables for gm1 --- .../contribution/gm1_table_of_contributions.pdf | Bin 0 -> 37114 bytes .../contribution/gm1_table_of_tasks.pdf | Bin 0 -> 48399 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 deliverables/contribution/gm1_table_of_contributions.pdf create mode 100644 deliverables/contribution/gm1_table_of_tasks.pdf diff --git a/deliverables/contribution/gm1_table_of_contributions.pdf b/deliverables/contribution/gm1_table_of_contributions.pdf new file mode 100644 index 0000000000000000000000000000000000000000..6ab5e007cae1f8c1faa27cc7e23ced27cab7685d GIT binary patch literal 37114 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 Date: Wed, 6 Oct 2021 16:20:26 +0200 Subject: [PATCH 04/61] Modified main_window and moved edit_btn --- project/Entry.tscn | 3 +++ project/src/ui/code_editor/MainWindow.tscn | 19 +++++++++---------- project/src/ui/hud/SmceHud.gd | 8 ++++++++ project/src/ui/hud/SmceHud.tscn | 16 ++++++++++++++-- project/src/ui/sketch_control/ControlPane.gd | 14 -------------- .../src/ui/sketch_control/ControlPane.tscn | 11 ----------- 6 files changed, 34 insertions(+), 37 deletions(-) diff --git a/project/Entry.tscn b/project/Entry.tscn index 21b5a709..142838eb 100644 --- a/project/Entry.tscn +++ b/project/Entry.tscn @@ -63,6 +63,9 @@ margin_bottom = -0.240051 focus_mode = 2 custom_styles/focus = SubResource( 1 ) selection_enabled = true +__meta__ = { +"_edit_use_anchors_": false +} [node name="Button" type="Button" parent="."] anchor_left = 0.5 diff --git a/project/src/ui/code_editor/MainWindow.tscn b/project/src/ui/code_editor/MainWindow.tscn index e97caf25..94dcebb0 100644 --- a/project/src/ui/code_editor/MainWindow.tscn +++ b/project/src/ui/code_editor/MainWindow.tscn @@ -5,26 +5,25 @@ [node name="Control" type="Control"] anchor_right = 1.0 anchor_bottom = 1.0 -margin_left = 500.0 script = ExtResource( 1 ) __meta__ = { "_edit_use_anchors_": false } -[node name="TextEdit" type="TextEdit" parent="."] -margin_left = 144.141 -margin_top = 220.448 -margin_right = 644.141 -margin_bottom = 555.448 +[node name="Background" type="ColorRect" parent="."] +anchor_right = 1.0 +anchor_bottom = 1.0 +color = Color( 0.12549, 0.12549, 0.12549, 1 ) __meta__ = { "_edit_use_anchors_": false } [node name="Close" type="Button" parent="."] -margin_left = 617.0 -margin_top = 193.0 -margin_right = 643.0 -margin_bottom = 219.0 +anchor_left = 1.0 +anchor_right = 1.0 +margin_left = -40.0 +margin_top = 10.0 +margin_right = -10.0 text = "X" __meta__ = { "_edit_use_anchors_": false diff --git a/project/src/ui/hud/SmceHud.gd b/project/src/ui/hud/SmceHud.gd index 39607955..fbf68e9c 100644 --- a/project/src/ui/hud/SmceHud.gd +++ b/project/src/ui/hud/SmceHud.gd @@ -22,17 +22,20 @@ var button_t = preload("res://src/ui/hud/SketchButton.tscn") var control_pane_t = preload("res://src/ui/sketch_control/ControlPane.tscn") var sketch_select_t = preload("res://src/ui/sketch_select/SketchSelect.tscn") var notification_t = preload("res://src/ui/simple_notification/SimpleNotification.tscn") +var code_main_window_t = preload("res://src/ui/code_editor/MainWindow.tscn") onready var lpane = $LeftPane onready var left_panel = $Panel/VBoxContainer/ScrollContainer/VBoxContainer onready var attach = $Panel/VBoxContainer/ScrollContainer/VBoxContainer/Control onready var new_sketch_btn = $Panel/VBoxContainer/ScrollContainer/VBoxContainer/ToolButton +onready var edit_sketch_btn = $Panel/VBoxContainer/OpenEditor onready var notification_display = $Notifications onready var profile_control = $ProfileControl onready var profile_control_toggle = $Panel/VBoxContainer/MarginContainer/VBoxContainer/ProfileControlToggle onready var profile_screen_toggle = $ProfileScreentoggle + var button_group: BButtonGroup = BButtonGroup.new() @@ -58,6 +61,7 @@ func _ready() -> void: set_disabled() button_group._init() new_sketch_btn.connect("pressed", self, "_on_sketch_btn") + edit_sketch_btn.connect("pressed", self, "_on_edit_btn") profile_control.connect("toggled", self, "_toggle_profile_control", [false]) profile_control_toggle.connect("pressed", self, "_toggle_profile_control", [true]) profile_screen_toggle.connect("button_down", self, "_toggle_profile_control", [false]) @@ -87,6 +91,10 @@ func _set_vis(visible, node = null) -> void: tween.start() +func _on_edit_btn() -> void: + get_focus_owner().release_focus() + var code_editor = code_main_window_t.instance() + get_tree().root.add_child(code_editor) func _on_sketch_btn() -> void: get_focus_owner().release_focus() diff --git a/project/src/ui/hud/SmceHud.tscn b/project/src/ui/hud/SmceHud.tscn index 2b9dafd4..ae00af6b 100644 --- a/project/src/ui/hud/SmceHud.tscn +++ b/project/src/ui/hud/SmceHud.tscn @@ -123,7 +123,7 @@ __meta__ = { [node name="ScrollContainer" type="ScrollContainer" parent="Panel/VBoxContainer"] margin_top = 46.0 margin_right = 48.0 -margin_bottom = 720.0 +margin_bottom = 676.0 size_flags_vertical = 3 theme = SubResource( 12 ) follow_focus = true @@ -131,7 +131,7 @@ scroll_horizontal_enabled = false [node name="VBoxContainer" type="VBoxContainer" parent="Panel/VBoxContainer/ScrollContainer"] margin_right = 48.0 -margin_bottom = 674.0 +margin_bottom = 630.0 size_flags_horizontal = 3 size_flags_vertical = 3 @@ -153,6 +153,18 @@ __meta__ = { "_edit_use_anchors_": false } +[node name="OpenEditor" type="ToolButton" parent="Panel/VBoxContainer"] +margin_top = 680.0 +margin_right = 48.0 +margin_bottom = 720.0 +rect_min_size = Vector2( 0, 40 ) +mouse_default_cursor_shape = 2 +custom_styles/focus = SubResource( 6 ) +text = "< >" +__meta__ = { +"_edit_use_anchors_": false +} + [node name="ProfileScreentoggle" type="ToolButton" parent="."] visible = false anchor_right = 1.0 diff --git a/project/src/ui/sketch_control/ControlPane.gd b/project/src/ui/sketch_control/ControlPane.gd index 863ee98c..7fe2f5c1 100644 --- a/project/src/ui/sketch_control/ControlPane.gd +++ b/project/src/ui/sketch_control/ControlPane.gd @@ -19,7 +19,6 @@ extends VBoxContainer var notification_t = preload("res://src/ui/simple_notification/SimpleNotification.tscn") var collapsable_t = preload("res://src/ui/collapsable/collapsable.tscn") -var code_main_window_t = preload("res://src/ui/code_editor/MainWindow.tscn") signal notification_created signal grab_focus @@ -27,7 +26,6 @@ signal grab_focus var _toolchain: Toolchain = null var _board = null -onready var edit_btn: Button = $SketchSlot/VBoxContainer2/HBoxContainer/HBoxContainer/Edit onready var compile_btn: Button = $SketchSlot/VBoxContainer2/HBoxContainer/HBoxContainer/Compile onready var compile_log_btn: Button = $SketchSlot/VBoxContainer2/HBoxContainer/HBoxContainer/CompileLog @@ -111,8 +109,6 @@ func _ready(): _board.connect(sig, self, "_on_board_" + sig) _board.connect("log", self, "_on_board_log") - - edit_btn.connect("pressed", self, "_on_edit") compile_btn.connect("pressed", self, "_on_compile") compile_log_btn.connect("pressed", self, "_show_compile_log") @@ -237,16 +233,6 @@ func _on_board_log(part: String): sketch_log.text += part -func _on_edit() -> void: - get_focus_owner().release_focus() - - #_set_vis(false) - - var code_editor = code_main_window_t.instance() - get_tree().root.add_child(code_editor) - - - func _on_compile() -> void: if ! _toolchain.compile(_board.get_sketch()): _create_notification("Failed to start compilation", 5) diff --git a/project/src/ui/sketch_control/ControlPane.tscn b/project/src/ui/sketch_control/ControlPane.tscn index aff3cefa..ad4c7475 100644 --- a/project/src/ui/sketch_control/ControlPane.tscn +++ b/project/src/ui/sketch_control/ControlPane.tscn @@ -145,17 +145,6 @@ margin_right = 1272.0 margin_bottom = 32.0 alignment = 2 -[node name="Edit" type="Button" parent="SketchSlot/VBoxContainer2/HBoxContainer/HBoxContainer"] -margin_left = 1112.0 -margin_right = 1154.0 -margin_bottom = 32.0 -mouse_default_cursor_shape = 2 -theme = ExtResource( 4 ) -text = " Edit " -__meta__ = { -"_edit_use_anchors_": false -} - [node name="Compile" type="Button" parent="SketchSlot/VBoxContainer2/HBoxContainer/HBoxContainer"] margin_left = 1158.0 margin_right = 1229.0 From 78ef4e00777c61150ceb744379e6b75ae3281380 Mon Sep 17 00:00:00 2001 From: Anton Lutteman Date: Thu, 7 Oct 2021 21:27:04 +0200 Subject: [PATCH 05/61] Initial script for dropdown button --- project/src/ui/code_editor/dropdown.gd | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 project/src/ui/code_editor/dropdown.gd diff --git a/project/src/ui/code_editor/dropdown.gd b/project/src/ui/code_editor/dropdown.gd new file mode 100644 index 00000000..7a8c38de --- /dev/null +++ b/project/src/ui/code_editor/dropdown.gd @@ -0,0 +1,16 @@ +extends OptionButton + + +# Declare member variables here. Examples: +# var a = 2 +# var b = "text" + + +# Called when the node enters the scene tree for the first time. +func _ready(): + pass # Replace with function body. + + +# Called every frame. 'delta' is the elapsed time since the previous frame. +#func _process(delta): +# pass From 420195dfb91305284ffc55758d92daf9c6ac8e7b Mon Sep 17 00:00:00 2001 From: Anton Lutteman Date: Thu, 7 Oct 2021 22:52:49 +0200 Subject: [PATCH 06/61] Added dropdown menu button with open and save file options --- project/src/ui/code_editor/MainWindow.gd | 32 +++++++++++++++++++++- project/src/ui/code_editor/MainWindow.tscn | 27 ++++++++++++++++++ project/src/ui/code_editor/dropdown.gd | 16 ----------- 3 files changed, 58 insertions(+), 17 deletions(-) delete mode 100644 project/src/ui/code_editor/dropdown.gd diff --git a/project/src/ui/code_editor/MainWindow.gd b/project/src/ui/code_editor/MainWindow.gd index 926d9f2f..8fc648af 100644 --- a/project/src/ui/code_editor/MainWindow.gd +++ b/project/src/ui/code_editor/MainWindow.gd @@ -1,13 +1,43 @@ extends Control onready var close_btn: Button = $Close - +onready var dropdown_btn: MenuButton = $DropDown +onready var fileDialog: FileDialog = $FileDialog # Called when the node enters the scene tree for the first time. func _ready(): close_btn.connect("pressed", self, "_on_close") + _init_dropdown() + +# Initializes the dropdown menu button +func _init_dropdown(): + dropdown_btn.get_popup().connect("id_pressed",self, "_on_item_pressed") + dropdown_btn.get_popup().add_item("Open File") + dropdown_btn.get_popup().add_item("Save File") + dropdown_btn.get_popup().add_item("Close") + func _on_close() -> void: queue_free() +# Function to handle dropdown menu button options +# Options to open and save file +func _on_item_pressed(id): + var name = dropdown_btn.get_popup().get_item_text(id) + if name == "Open File": + fileDialog.popup() # Opens file dialog for file selection + elif name == "Save File": + _save_file() + elif name == "Close": + _on_close() + +# Function to collect the path of a selected file and send it to the editor +func _on_FileDialog_file_selected(path): + print(path) # Path to file that should be opened in the editor + # Add functionallity here to open the file in the editor + +# Function save a file +func _save_file(): + print("Save File Pressed") # Add functionallity here to call the editor save function + diff --git a/project/src/ui/code_editor/MainWindow.tscn b/project/src/ui/code_editor/MainWindow.tscn index e97caf25..82b4c471 100644 --- a/project/src/ui/code_editor/MainWindow.tscn +++ b/project/src/ui/code_editor/MainWindow.tscn @@ -29,3 +29,30 @@ text = "X" __meta__ = { "_edit_use_anchors_": false } + +[node name="DropDown" type="MenuButton" parent="."] +margin_left = 145.0 +margin_top = 193.587 +margin_right = 227.0 +margin_bottom = 219.587 +text = "File" +flat = false +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="FileDialog" type="FileDialog" parent="."] +anchor_left = 0.00215611 +anchor_right = 0.00215611 +margin_left = 107.635 +margin_top = 220.315 +margin_right = 677.635 +margin_bottom = 539.315 +window_title = "Öppna en Fil" +resizable = true +mode = 0 +__meta__ = { +"_edit_use_anchors_": false +} + +[connection signal="file_selected" from="FileDialog" to="." method="_on_FileDialog_file_selected"] diff --git a/project/src/ui/code_editor/dropdown.gd b/project/src/ui/code_editor/dropdown.gd deleted file mode 100644 index 7a8c38de..00000000 --- a/project/src/ui/code_editor/dropdown.gd +++ /dev/null @@ -1,16 +0,0 @@ -extends OptionButton - - -# Declare member variables here. Examples: -# var a = 2 -# var b = "text" - - -# Called when the node enters the scene tree for the first time. -func _ready(): - pass # Replace with function body. - - -# Called every frame. 'delta' is the elapsed time since the previous frame. -#func _process(delta): -# pass From 6e4a727ce7e5869ae483f60ab765f59aa69a6d0b Mon Sep 17 00:00:00 2001 From: Anthony1911 Date: Fri, 8 Oct 2021 12:21:48 +0200 Subject: [PATCH 07/61] Add functionality to read and save files --- project/src/ui/file_dialog/FileLoader.gd | 35 ++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 project/src/ui/file_dialog/FileLoader.gd diff --git a/project/src/ui/file_dialog/FileLoader.gd b/project/src/ui/file_dialog/FileLoader.gd new file mode 100644 index 00000000..16dd15b6 --- /dev/null +++ b/project/src/ui/file_dialog/FileLoader.gd @@ -0,0 +1,35 @@ +# A class for loading files into the system +# +# Usage: +# var file_load = load("res://src/ui/file_dialog/FileLoader.gd") +# var content = file_load.loadFile ("path to file") #get file contents +# file_load.saveFile("path to file","content to record") #record into file +# + + + +# returns file contents if file exists, null otherwise +static func loadFile(filepath: String): + var f = File.new() + if f.file_exists(filepath): + f.open(filepath, File.READ) + var content = "" + while not f.eof_reached(): + var contentFragment = f.get_line() + content+=contentFragment + content+="\n" + f.close() + #print (content) + return content + return null + + + +# records given string into the file +static func saveFile(filepath:String, content:String): + var f = File.new() + f.open(filepath,File.WRITE) + var arr = content.split("\n") + for str1 in arr: + f.store_line(str1) + f.close() From 2c2ae261fbd71f85534b6f43d6d79e07e9e16d1f Mon Sep 17 00:00:00 2001 From: Mahan Date: Thu, 14 Oct 2021 13:32:08 +0100 Subject: [PATCH 08/61] TextEdit *Ability to load from button to text editor *Ability to edit in text editor *Ability to save from text editor *Anchored buttons and frames to allow resizing --- project/src/ui/code_editor/MainWindow.gd | 25 ++++++++++++++--- project/src/ui/code_editor/MainWindow.tscn | 31 ++++++++++++++++------ 2 files changed, 45 insertions(+), 11 deletions(-) diff --git a/project/src/ui/code_editor/MainWindow.gd b/project/src/ui/code_editor/MainWindow.gd index 8fc648af..764837d2 100644 --- a/project/src/ui/code_editor/MainWindow.gd +++ b/project/src/ui/code_editor/MainWindow.gd @@ -3,10 +3,15 @@ extends Control onready var close_btn: Button = $Close onready var dropdown_btn: MenuButton = $DropDown onready var fileDialog: FileDialog = $FileDialog +onready var textEditor: TextEdit = $TextEditor +onready var _path: String = "" + +onready var fileLoader = load("res://src/ui/file_dialog/FileLoader.gd").new() # Called when the node enters the scene tree for the first time. func _ready(): close_btn.connect("pressed", self, "_on_close") _init_dropdown() + _init_TextEditor() # Initializes the dropdown menu button func _init_dropdown(): @@ -14,6 +19,14 @@ func _init_dropdown(): dropdown_btn.get_popup().add_item("Open File") dropdown_btn.get_popup().add_item("Save File") dropdown_btn.get_popup().add_item("Close") + +#Initializes the texteditor settings +func _init_TextEditor(): + textEditor.caret_blink = true + textEditor.show_line_numbers = true + #Minimap view + #textEditor.minimap_draw = true + #textEditor.minimap_width = 150 func _on_close() -> void: @@ -32,12 +45,18 @@ func _on_item_pressed(id): # Function to collect the path of a selected file and send it to the editor func _on_FileDialog_file_selected(path): - print(path) # Path to file that should be opened in the editor - # Add functionallity here to open the file in the editor + #Save global path for quick save + _path = path + #Load text from file + var content = fileLoader.loadFile(path) + #Paste text into texteditor + textEditor.text = (content) + # Function save a file func _save_file(): - print("Save File Pressed") # Add functionallity here to call the editor save function + #save text into texteditor + fileLoader.saveFile(_path,textEditor.text) diff --git a/project/src/ui/code_editor/MainWindow.tscn b/project/src/ui/code_editor/MainWindow.tscn index 41a9ce1e..544f1277 100644 --- a/project/src/ui/code_editor/MainWindow.tscn +++ b/project/src/ui/code_editor/MainWindow.tscn @@ -21,19 +21,20 @@ __meta__ = { [node name="Close" type="Button" parent="."] anchor_left = 1.0 anchor_right = 1.0 -margin_left = -40.0 -margin_top = 10.0 -margin_right = -10.0 +margin_left = -50.0 +margin_top = 5.0 +margin_right = -5.0 +margin_bottom = 30.0 text = "X" __meta__ = { "_edit_use_anchors_": false } [node name="DropDown" type="MenuButton" parent="."] -margin_left = 145.0 -margin_top = 193.587 -margin_right = 227.0 -margin_bottom = 219.587 +margin_left = 5.0 +margin_top = 5.0 +margin_right = 100.0 +margin_bottom = 31.0 text = "File" flat = false __meta__ = { @@ -47,9 +48,23 @@ margin_left = 107.635 margin_top = 220.315 margin_right = 677.635 margin_bottom = 539.315 -window_title = "Öppna en Fil" +window_title = "Open a File" resizable = true mode = 0 +access = 2 +current_dir = "/SCHOOL/MPSOF-1/Year2/LP1/SoftEv/GITKRAKEN/group-10-smce-gd/project" +current_path = "/SCHOOL/MPSOF-1/Year2/LP1/SoftEv/GITKRAKEN/group-10-smce-gd/project/" +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="TextEditor" type="TextEdit" parent="."] +anchor_right = 1.0 +anchor_bottom = 1.0 +margin_left = 5.0 +margin_top = 35.0 +margin_right = -5.0 +margin_bottom = -5.0 __meta__ = { "_edit_use_anchors_": false } From a49c6b6a9569d65bd87f062b4614701991949194 Mon Sep 17 00:00:00 2001 From: aKjeller <44802724+aKjeller@users.noreply.github.com> Date: Thu, 14 Oct 2021 15:52:14 +0200 Subject: [PATCH 09/61] Create build.yml --- .github/workflows/build.yml | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 .github/workflows/build.yml diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 00000000..c3c313d3 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,20 @@ +name: Build +on: + push: + branches: + - master + pull_request: + types: [opened, synchronize, reopened] +jobs: + sonarcloud: + name: SonarCloud + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + with: + fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of analysis + - name: SonarCloud Scan + uses: SonarSource/sonarcloud-github-action@master + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # Needed to get PR information, if any + SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} From 7887583f570febea39042f66ea7f4c961fef5dfa Mon Sep 17 00:00:00 2001 From: akjeller Date: Thu, 14 Oct 2021 22:10:51 +0200 Subject: [PATCH 10/61] Contribution gm2 --- .../contribution/gm2_table_of_contributions.pdf | Bin 0 -> 38949 bytes .../contribution/gm2_table_of_tasks.pdf | Bin 0 -> 49879 bytes deliverables/tasks/gm2_tasks.pdf | Bin 0 -> 69239 bytes 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 deliverables/contribution/gm2_table_of_contributions.pdf create mode 100644 deliverables/contribution/gm2_table_of_tasks.pdf create mode 100644 deliverables/tasks/gm2_tasks.pdf diff --git a/deliverables/contribution/gm2_table_of_contributions.pdf b/deliverables/contribution/gm2_table_of_contributions.pdf new file mode 100644 index 0000000000000000000000000000000000000000..9da9a66dc39dbf8a34fd04420af5389c5bf838ba GIT binary patch literal 38949 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 P0cCn$NK5OPoB{j?Wwnr* literal 0 HcmV?d00001 diff --git a/deliverables/contribution/gm2_table_of_tasks.pdf b/deliverables/contribution/gm2_table_of_tasks.pdf new file mode 100644 index 0000000000000000000000000000000000000000..2ae5a91beaf5d03ad5a6ef800df8fd0aa3d293ff GIT binary patch literal 49879 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

gHN1DJbZFv3m2t$FtW_l0R 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 BAhiGh literal 0 HcmV?d00001 diff --git a/deliverables/tasks/gm2_tasks.pdf b/deliverables/tasks/gm2_tasks.pdf new file mode 100644 index 0000000000000000000000000000000000000000..85000663b2ecc8e5e15f31eaf107739f0cc2324d GIT binary patch literal 69239 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ΝTx~Q`A@0@KF100!k(h$-{-KM&zX-&^sl0GVKX{tmMv-#vYYziBJ_) zTqzY`S~T5g*jljTf^MmkRzZb>-N&1~Z~V+sY-rr*}eSG_M(PoRWKTSpdee@c;@$;Nsro zafzI~M3R5UU2G?JU-!*wr8}h%l#*jnz}U|6>Qg!A91W-Q+qhFSi2rQE4hFBNpxY_R z>ksbpygEHiV0-o3F}yZE(R*YDjfy(E-qywrv&a3;-@jAgfw%5&W;A-}qxqlLU8h%e zDlFW(d{GB3G!rNVNd)2FEewrc{jt?;^i@B$kADaNCHGISg#NNKLe@0I5*VF)ry+Vf0rhf|jpC>@s)yU;9NUyM@$e)sbj4}bn1-Qeq7nc-~HFN+_ zhfM(UVCmxdSGKaJGhh-V?ab`|V1|`U%`E|}V^0DKL4ex}Q-He+c_)A?3`;w60*ZfE z17s?@Iyl&v+WwhNhCjq%^*^X#ZFY8cIu2$ghCgFsAYfu;(ET%BK;M~}ndul9*f{_R zRsbmY&kH6-0w!hxR=`X#vjJ){0VbP`os%6f?QC?MoJ@?I1pmqV&(j~8F$16tz}H3a zU#;m9uy7D)bFwhgaj>wnvFQ@90=UQw|ESLfc>Sj(R#rATMphoEOebpNsRpInar8svZ8{`XcH{?RTo2Pa^}42*35n4JG!??0pd%L)U7E?^~zsQ)$L z|6VqCQjG|Gr;}2^o+vk6c)`7Y(W;XI;L`53Lkm^icd$d z45287-0=Hxp=Fs6bl3R)2q~wcRyKNS!~U}l z3u~;9p!RU2Um?TJ#BinQp!>cs02VFbK|!AT&pk z6y7nB?dE=iWHM7R6~~RImz|-Iq#H?3&`~0k3}vDs$&(aEF&AekWiggYSlwd-YVLaL zHJy6gFRyYoq<_M6ARMFe0)2cm67MWeeT5AtDr5X#53hfG6aU=D|Fs?eWCG5P|Mv|n zY6tKY^Jl;P*EXe<`1j#uVhA`#0Gk>>+y3j|Py(z76?;`X%RlaA2pIqL;h$&AA58ea zR>!}A+DxpR41g2u|F&4z0Za3rtL0o9+CxROg-`YIAu+xLn$U!B4Lg%09bBj}WTKcm zOIig)uryd35*gfdBpwVE4asyMAS&urXaE>P#f~ciI$GrG;Y7IvlE~U_5H(L9IBxRV zqq=JVL*k<^^QG*@={40m0xl>+C`s$t zL$2y}ezjA4SN!6h`%O_9ix+RzD+HsQ0?AGnO`|taEn|<9BAuY;#H9s9R)ROJsLKrfIA^F?M8DU^d?v3p z0_U}ecapA3-Jgw3@n}(c$cD%5Y;hN%0WrWcmzg3{ z_g4?L`PBY5yLw$KFL~O=FdHa76`^_gK@7FcnMtX0*(T&$jfA7)T(RxnrgZ$WQj4Jo3_ARH~o7cyS zZhRPLj)lj~`|-LA*UGv%Z=}gpiv|r!w8Na*(oXIhxX$J#;wi^Mbk{vJELl-pPc-Y( zlVNR&TqEuqwY>-)mhe(#&WU`P(W2#PG#5hIVo85vii+_N3sSB5*m5NJ2^N* z)-0o7$j#n*7*}duAs2BV}9pqJ_}pP3Nv!FjjqxsexZ*^R$qzw%m{JX{$H z>k2nOAdZep$a7m8SV`RgnSYY#o~A9a6Y|luApX>;!n>{glKTnhF*JoUkE~VTn2# zdWOm09?{WBNJvvm%`j>FE1jbRCwYjObTbutaE87gV6$<44VO|frk^ey)ov$gMt`SW&3S=0qD<+8ik**Zu`9g|xZW3Zz`+qKBFtJT>$ zv9E#Y4wz1!?q&ha@MvFSU`GkJ=$h12FPQd6d`Eg@x~hR+%A}CuZl@NzP`2l!rK|eu zch+lH2-!Be5q$hhJGNDd9)-HBBUiGo?a-4AH$gq{Gb-%c9YY+gcW<{&4J!&;Hwi@9?lrj^C{ zqRsb!%6Bk)b2a|0UDhY0akN0#@VOk!T3e6Jiy@VtQqtzCfs9>N@P`J=1~$bh3+WH} ziyz0P5RZ|msVKDF^yswFa!uLAuh|?U*n4Bj_Wij|H}b{ArRv*FGZ4|w@|o12=Yu7a zJJ(6wUWPe!#`&m)F(~S70nWpNwXWiz;V#^lL7T=k3Y=Rz-V}v$05Ox6}+$Z0dqbN*@y2 z{q8hs?a)xNi@j!Jd2C|OyfJWJg3|3b>Cr=9S8WKi(lx=Ap#A$MskyK?8X1il$A!Oj ztTe=oeTHbcauh~0cV$50_pb5F{|&rf(hH!&reHT{N7l!_T2yH{p@jLQ~(JU<+(i2sr?SWoDJS8<0z z*_0bQ*NrNRa?FP=3Q7@1S9+TcljWi{iN|)BsXw>u!d}CsZxTIWKJ7>Tp5Ye;iC^)p z;h1Pi|C{}%KJ{zGxKG5H3-x_IBTL|*0_XYQq4<*nVoh<{68yo`&7~ZAQE&YoVcc`W zGj+*~lWVA{{xGZyhOL>Jb0ufai=uz!?(u=%t+7-AlUGn~sQhuYC~sQg5tfz^;&+by zso`~L|6(`vA$sK-+Es>GPnJlt8J@}_^CMRDK`EM7n(&F!33^A`$HKrXOD^AuutwNt zEY|UH#?2z>@{Et5=P3DTugI6;{lo{ITg6+n6IuEOg_h868%NCx4!@-5wr8HuA9;it z3DFFbs2v%4rMbG4hzP%Y-wwVK)D+t z+2+)$Ctl~pUNu>y4GtSA&*&a-5qHsi%5J_l2rd^f-CI_-CMDL3u{MRV&0;qNyD`DO zOc{}$S+QlUPvM!`u5Cd+$ye%jYrc!}+DTg4TYnCA4ZkHAQRdR+KQ|#+zk;#OLU<)@ zlwKZrbB*HIkYo+vnL}6`LwZ16PW`&3^268f&r_yTx=_+n3$OA#VLd^(=N-eR8ME1M zdC*^M*_`{(d8NA*b;g*K1ACD#AgVr+ z+(e~cj=(C4Ta2Lit0GAig?qOl+nBPM$5hkYbI@st>$jF+O@p7QwoT{Y$Ix}tE`GD} zYm-}1_ZRcU*d!Kw>TArJq4v!HUJrQc7cw5ZBK+^L*EEqOKQ9%lBhVUQmoJw}suO9= zS{pi-LC*|ZGI`^^8X&AeY|gcZr`YX7%~wf?EW>B8@_>b#ZemM<;HtF|q?Etlu2)%4QAhhB#fKX$L+9(Jd$ zEL;h>Bcen~l}OBTV|^(Gm9KgCsm_2<0(+srMD}nvsS7rK_tD2@q(XQiA zZ1>FZuh?9<`Li~LS{pd-B~4TJS#w2Bkz&-YXnmN+ir{@{@&@n~BhJm`XZ*4stu0AA z!&K+E+~Q-**c)tG;vcRsOOn@xj3*X!ObO3;+|svz*NfGr_dh*JOp1;`Upn3yS#`RB zuPY)i`eXT|@f*vIF&on%k=9W~ikw6;_Bk%4B}BT%uCi$dZZX55nEE@C*chl2Xje0f zCd>No*k4u}pvkEa6Yj44VT#Y9$f`Vy$O#ieddD&pr6{cGo`_%q1SNs9pQ)7rV!$;h=0@^PSjVK65Tua_kpveERNB9 z!z*_ZpT}7^y;7SJA9Q(D4>L%j*hAOxVyteOp%dPqLr?15nEnWqv{~sU0Ph)+IWy|| z{HP4`)CatJ(FoGsET+6dU|z1sp79cjEpgF+huy0KQLze~&sRX-pjq}<9b!iaI4h*b zuW(ZlTntl?v>KTEdx98Y13HDhK{q4=Fi*LCt8_!`C}5-WXoTDrZ}8 zCqp!)bP06PA3R?NwGi$s3i8g$jKbD!%8+1y!;~n#L*6sQ?cza!hADF}2pN%xZm~Hl zkbEy2pg4g(6IJZ9I5GVQ!WK1vyN7rvz%-z_XN)s+HwwH)MxmH|!@gMbFd!lYdR5fV z7mF0gc>zw60DU0GWv@heLb1E}=reHwQMLeLP~8!bg2)x6>|>E)jZ@-+ADDWC_ygv%!MFk?apBvfyxFx#C`XUoL%e zZ%ycHv_xfq^aydXWSNdR{D68mwz*}P)Ing-Hv--VfgORT`I+^@kcSv#s>J6O$?hKH zcJtVW3JhKO%N0l@#w=%F^byY%2N%AE&|u$nA1F&89RuQyTn`dQ0v(7RjU#djkiYnD zpk5}>7!wt^T&f4OESR2D(zyK>Za>H_ogK72@RzI9TX>>zlP%N^Fb-8Ca9xP%;;}&W zSu_vp4yhfMn+*L(|8QVES>?b*1#pM3feaPsY*BR(^Ep)y>54+jzRfw8Eu4;(H;}0% z);_FE;OZ2PG&7LH85(E)+}~7Nu6N#BK9P%aI9u>4F|GaB6%cI#J3^V(eqzxUcvoZ{ z=xyn>pc^#T=$VK*LW@~>v-n41TQz<17L>F=8)C45u1!#F-|Rr>(mc4=;kttD7*~;2 zQ-Rc{@dMl?yRz&CUsrjXP}>qu0vjm31tIn1$~^&vmm}w_4@K; zZUyp@HPEZj_{_G!$PTPuG|{(cS=A2tMRg0o3;K!77WASR-GI6qZcVf^v0skHCiLM*M2eA$IvbYYEKc77Se-@!Jg)i}m@f@s0k@^Z{ z1^g{}gUNl?9GSmtz3;sV@(KJL+>i2_+Uu83QctOGpZ$@pGo)R_V*uol@0Q>T(9`7| z;T4iE7>^7-XdKXHU(G7STP`1?ei{A|^Hv;k-0Wdro(2Dv`3uMs`^&6POzez$pZ<~c zR^1)^6^AdZ4de$J`yj9ZLunpm=_i5l3nEkL=T%nvNB6hm%}=sYe{$m&cc#ChFJI^4 zhSU8-hVF=&O7Wj%W%y}~UkJa>A&#W`NetZy12PjC-{Zd>hnvXolNi7JFp&8yGkP)q z+)w|A{C1o-oW4P3?3MNH*cM<9Q1#c3^bh%gJKE1^i4!o?4(pc5??X$O&zwhST4 zCgOHDdve26!)y^~2sK4#3R74Iw)U}Bpcx5ay7YtFs|$p2 zS*g0b3K>ac;66i4NGaq4(4bue&;@@By9v>-V7I{-38C((71^>nnl|6GZ5D9y6pR`- zA^l7Vr$}Vf;i4S{jX`K>9bYMz`tpNWybFQ1eE{bz7_%TlC1Raen zOss>jL?1jiwl&NIr-^9Na25vjY8umRB=X4qO6)DQasN?m7${Rj{983hwJkMWsbc)+ zU>PNB{;QyTs9Z>Hp~{vLx?cx2F>b9WCOyVMyOjM}VCIgZkwcZGR3LJkw_5tb3o*#< z{0n4hJHxIIsamE8)ppw*%V6!&8=dTCb=&?9y)E1^;hXk}`<S0rf`YvH>GQoUHm}xaR8^!Y@A?HT+fREzwso(YHs}D^+&0)r;g?mFAYn zf3tcwCX$sU&R}K{K&krSEY?Wn_5BXOByKUOn#F)6L?=@`KD?~?iU)7%7|&|-#=1d; z9(j3SAAOGg*+6`Mit8mF?#G-zfxdy|LGh$5)avUDSFKMx6K;yfaM>E_=`Jvh~4Fg|C)9u;uhmstjpH2 zYX+ZChvAK_;P-2d5btG~K!wTomQenw#cfli-Kl5g9mQ7_<53`5C*~JpANaa!ax2AL zg%6I~27Ch*`PYzAik_7`S}x7)%|h!5A8`Hc*a z-7R;5fa)C&zh@=`wqu+!$epn2t=8uSn|@~;XXM+RCMXShXFh|J@h{Vk4fo&2_isp9 z5Pr`50vQ$>CK{G4200Y24POIlSNuIMU`2R~BwN{64pId3jcVlYh@q0CNGetj_6r<7 zCLe>3!4pY8WEkR~#0b*IOW&2G7&IoSL2`g1(bvBs5V1%TKrMD4UU9t%QXi$MK_Ee7<3(nKkDyc{UkeX{Y!TYqrS0NPXe-7PvEt zQ5`z`FvoDhNrYeKnD_@5o(lZQLvE$@ww5-&SO6cso#%SYJ zB#=cggcW4qzKGs8b!K^TXsmD@`UC6Q70R; z?9uCnuF}EJDyp%Y#Vsv%syQCbZY#S-YAs+uQl^g$y0BRngZ$e~3JrUzI+=34Q6NMO zYkRuD>_9c6Gu%y~Q=A*+5BzijO_PZjv2R&wqfT$syVi?^UBNW%QCX<%mYPdKb|3CWBAIsTa|9J zGxu^));ODc$CIm0lj_I#WF?G>>BbN6sJvcA9o6y4V;?3j%E7KSmN+zQTIC9lC_5Zl zSGM};>m>MS=D4qlgDO0XQzmD^znQ=^fVJK25Fff}U)=ekO z-GgR6Q|zMycUdBZ2Jf79kVn5U;Poqsw@mSK_Cw45fBW8+}dM{6M= znV=?@;~9!}%jJ5!q}f0$8!TB$CX2aoY9fx66#O+8FSKl&JA^(?`dq* zn;+R!AB|HFjoxP$EE8us4{G2sriy<{Ih{-~Mw7!h>={@!DC=r?lLqZbc!V1K`anvO zvOmaC=`;{%hnIxfNnn^Hbw+uTpl24sdHc;F!eaE!#7hJvmw5)2&`)-52DQ^bM(HQn zgNk?(=mKw!r;CxLBqkbm|1S(|$&#e*opQ{J8|F*RW{C#QRG2c1EyPh)rK@8b$pv#6 zR&%N5=H>+utGTMksF2C5OoS?nq5OsKWV#N-Z>=n5H_q#o%QT@Jf~99uD#H?^j;>UZNr{ zRpdYBIbB`D@A5Yg#9O_PWpb3&>#4GhiVFWWP1IQ}9}#=;Z)=Kg~;=KjfFwy~B>eXoZT{%$lw_jlUC z-oHwrRq41`8XEq41Xd)fs2J{l4KC)q;e#J2{MI?@f4#;9+{gddo#}t>asQ*l_*q8w)@Z@h{~GBRd@{Ky1PM-<2nSIgS2@ z^5l=h=>O)P`G2oG`Im?3|6E-E_hJ9n1^53SdXqmw5@rs7tb&0Bp!i?`XiS*@(%bwG zmBb%+*Z&_>5&&VyKkvPD<7KS|7~n!5`9f3Y2DcOHmt+5M{lAeyJ%58)FY@ z?meXB7{Z_}T}{6ZB$=%8x^9rhU!uyyL5m&!Kg4}wbY)GqZj6p?bkecy>^L2(W81dV zvE8w4+qTV)-SLif^S(#lcfT{vIQQ2bWBsUAbMC5HwQB9X_IjSDCfyFI3NsA2>{LV< z)R}Z!$xXVt_*a~ZX0n})C#KLM&{(1kZB%PJ&UMD^s90O0xQy)WtHt|@7q%gyj9Cg! z*utLOkpvwluSFJr+LhY+4Oep>=G&vk4H6-3r^aHY-d)s2!8sqH*^Cx+)@d!toaT?` zJ6VMMr=@|5(=KCI?`8h73PKy##(FH(toY_mF;*IsVj2pnS_k5zYmY{3gQA-k$b(e} zwST<{{((2}U-!UYq@RDM7X1sC;h&ep|CYh{{Bs0DNs<9IFFc`ntnT)CKGlS0!v;?5CX$K1cZ7U1N72)8Tg_+U9(?y z`84d!K%`r8=v98YP+B#=xJaQKi!=~gLQ1T3nd|-p`3H(UIrNvHC4q+451~vd^t-Pm zAxLyMnP|^><~XMxLY=M(5*p8N%|5tt1FAVX{N%PG>epjbTPS4Oa_G*QpX3AFCdQL& zv&-mvpI`N-i7%BzuK|=`%7!P#Yzal3Y|Hhyh>3YVg9YJhxZ(N88@|}^vu)bv!vgz~2m!{1q#ser^OUkOs(pDEh+>7C$?jsdplueEWgct1+*Xk@44ho=m zQ~XHaHA1#*<|pCL8=BV&0OaDYG?0zD-h^TJ6ZA2LfiYiZF#h62zLqmyo~ol+Og2xQ zs64B~l3zw{J{>wKa$Sua)cM`uLg-HFTiC<^Rd`BKF6~+$RV*ic9CrGkNp28|SG?ml z43~vjLStR3(r!$+ud^|eMYiTJn^NS!dU@QapLYq^(|&E}ErmLxuS-z)gD7ZpW6?5CaJ%w^Z zW>=ssMVS5i%)QruIbCs^z}I^XfpA@(&1auu=CvPtIRR^;{npbvFjh%Nat^fv0X!9<9KqW@Jy3wYQ#kqBto~;Rjxl{aJ|p0KH#83}VkEPH-Mn(A zGbyg3nkwOGW7oKcW!2nGmIJd>npK52DAHL>X#|g!Wn!d4FV!&W2lO~<>q&;5I)DF= zfVLh6CEj3Ko>iJ)LaBez91Qg!Pq|PhX4=U&lRAJ&JJOxl3yd~P=BXL|Vvl6*4lBa5 zL`^5y4@wM&XPYlk{)^wz!WIz1M}H|+SfM+dwWifs_uG7ZTVeYx$D`+oGFdEx-oM*G+Te#NahbbJf*;+c zPoWa2y(;qu%$htZ-}}ZnQ4mWnS*5>2Bh{t8NzpTuu!#Hw;hf`3zib2QGU7R2f5=+# z3SV^o`pGAoM0&-x1@B9rlxL=Yz4ZiNTvdSH+CLuzXoFsJ*XGS)pDl2pC8ro3Iy|>=tCH83~AUy zm!n#lrSI|Tm~8q^*G>1CdOi||QHsx;Sfgk@0?2)CfOwCZZ3DwmfVUA`-muB31k9bi zx>o?c#=rF(?P(Bql4F^1t>`l3X%1M;mp5cP>zh}EM(yxDIr(I>f*)0(doS~#yet(u zQCxH-x2}j0PPs}VjmeF4W4AZ4S`u7|WjJw6DKpf<@Rs&jtTtL9@r*b=x%qGah&Rar z{b zzQz-GKSD5GREXx7hK{*=@c}fQcKc5;13ucohvs>2w>t7Q38I}fap;tvLA8i2=q9H5 ztBWm%_310%Rs^1r);*N%E1)ic-s4?{-Jzu4IBpT_i z#rv+W3(-kws5Cxmu$#TuAI1!))x{$e&%|+({@Bi7g+7`Lsh!#~+(~Jtr%g4kgJWdb zTSa#vOAkox$f`6!I_m;VW)0JN_eA#|!PqQ%Uktw7;_C#SDe4SX@6$X=cKy8E0Z5Tk zNrxwLOO4LSpP-gXmL(iYmVZ&4g}8$B*NacAj;@R5a-BvvD&BBbP& z-Ln~)xj!6-5Z64X@Z`?BzTR?+Z^)TG9fQ+9Ivk2LkWww#X`I}U$)9x3l;8#MCJCui zb4dhHV;Ev|5S!wTjnHoj%Sox$SsvqL#gINT92%<)W7Q3#U`eWTzbMRo-^DV(F#ZmG z!rhkP`(6B+fFYM>MZ_I-Q`&o#ms=!eyZqR^r7y+m&&2QjgaeP?an{82fZ$@hkv5jm znXoF;kMtgzgjd2b%L_M}~d_^>pBFzcwA8Q3UGhihdu+VZPksVPJOt_BH4Wzth zw`NRo0LU;q>4kEK4yX5Q zv^_svyOzwQk=!XPCL-!&qtwtTk*rQw#7)gCbk&G;1l2S#{*sbX^@nLIH4j05aA9~` zK3I4-3;IDBn6jWHo-)<)Wa3hijhfEAZPJBb;Y%V}J*BYOcZ=}&OZf!?cf`Tzp=es+ zry|}EafO)E0~8PUAf0G|RU2_=GC&o#oPv65d^P4oS=BVdbpJVSpO7O#t8#8B)dDhZ zumQHDMMZwm&p{LB&K|>CXf``$@gAzi2vP>!DA#>hq#smN-3ECYymhnyhF+V8f}#@I z<~b%oGVy5KlQ|hmRU$FA!!mMjY~wmN+%^UC@2iU46Sldq2US;L(P0>SV?Rp!NQXil z^f!3f?#rh4WL52Nk2mTDO`FKS-#ytUU?@~p>sFLliYH~RT3`X)?2v#55|9UXkk}qL zi&%NJ*JgPR3x zO37Y@T@4fZpKsdnv%+~Tg(=F2*qWJsR}M7WNXVGih(MAz$7AHbdy@i@$Cq_Yc0qu>PMWwJxU-G8~6%l3*#e&U8 zMCR+7{jAiqtSekwDWXGT6_Smz?SYP4Cq&3~eqD`|mAAK9IXi7*k6(WPjtcLuq}5+q zzr^;&rTd7wn~eRC<@`^F5)ZzBS9JSPt63YTAk%ur4xCEMPzmIeS2NgALf#$RVfak) z^yaGJ-^sihzdLx#_&kjU?Jcu!rsQDK-s)AAtrB~oXE@;ETaAuDacC+sH&u)Z70^=A z-P#X1jyv)qY|g4I6(E0ZIftc@i;f}sqa=3ctM^95It6QMScgY>1r5-nFgvb_C3}IX z40!7|<)Ap6n*h$;T!khvkg_pX$D$hZF5#gFt2w54k|AcAVZD5-C}$CDS6V#1xVZG~ zF1GC%YJJ0JbQXJ)i;tN{S&`8sO%^f(Q5|WOHmn2jMg_)!-acC{)}CRFPmf@!r?*ua?AOo3ds_!k7Z= z!qI1RHdIT^bqroHcbg@qQA$NcXN%zi&KqPNjn^b{#6(QYu}26q z&@$k3S!tj{y%iNHG!1cxBFZpoD|kWaSC*MR0LHaMF{P;>=LdSj zmE4tDwqM+DOkGc>8V$2&{#8lGyRerqi<)_CbAdvI3wpzi$b z`KvOYFPb~ajrA*=ZeCPf|BUSMr*=m$E7%3xx3t!?L1sL9H=W6qoe?1(lFC0agf;~G z$>jGW$1G-4ISj=x-|gWq zN?6Wn-Qak?+p?g~V)2xaL=Tt!7fG?Y>_ zevEPw?dD}0?W}Kh?Hf(3STvWL)=jpDxo4aHR+xAJxm97h^g7fY=@3qNP&{;Is{ZAU zmbyIIFH^~4MM?Gkf!f_p+rGtVtGZU6a^%hpwwM^d$E)aq`& zu#XOTp4_))L$PzUTbF^r$!*!tqU8-n#Wu*uJv7nZl}ubT@|SFs-X8aiT^Iz-yKGj4 z-pDu%W;98&DjP;LHps9hpG%-gAX<<$6lH01`_UmYP7n7R95Z1Zhy%RA!X_8g4lCdB zuE%C=L(aTt-ca){DzqI>b9=i+1!l5wO2ft&37Wb>UeX8)B{|f3z%iv`Vz#K&>(||3 zA`;4PJb_yi$x5mnp%}eht(V1B?11+9Bd@8X&D2f7FlH43yzjC}fnFesr+4p0Y!Mwq z>Q87R^WIBL$CxLMMJw#JhvBue*5VaD(YyL*j!j7D-4k9-54r9J`PR+OrRS5Z z-8gASnLfc*33=)4>d-4$YenhwBK;QG)?Fj)YgM&~joLPgcx7M+$xC^M(G5`!(TxcG zZ#NZaRu>u@j`?)s9;Mdbd&;_x>t~nn=v%-BjX2lm%aBgLFW7Q&_fMB?QWYr|F)N|S zo}Cn-Cu|zAIJ1$ZaHr-^Vmd-Qws0+2vExnFrKXQ=j8?O?YwvC)@Zj9}POy*p*XcCb z30}v{lN>X#49CfyQ)1lo#pA1#*pwFZ!G=G3hxJbj)oLlwG_ZTxO<&PhbT~`BVN13FsCP~xZdoC}f9zHOL3gG*-H;`Mt z5vL1DrD~g@Oi=7WK`AL*Na2R-m?T$Hf$1*#>(u_oLFun(-a`GW7JwNcMH)2E4X&A% zkGXn3r>k<7ZH=d0S3b$~JZD3Tu2^|(QWkEx?lsXyh1y0%HnyeN5D}|s=wYrw1w4~V zFt%lhX9+*%iDgGiMXxj$;h*cfj<}E@gU%$16+SMeq%>*oYs9AENx7B4%`xsT{c#ld z!$&ZoW|EV#lbAA(MIuVj_H~HtgOfy7aw`K%km|R${h7B-1QVr{A)k3Kk~ell&bOuqMFyW()846Eh?Y>a>bYDiAr)B}l@;jAFkH)lNpT zco8%O`LJ3BB9}DE!vvXihi$RWeRKif;fw7U{YiQdxk*dG&2qmpetE@MpP{TF6%EKN zAzi_F4KgS}!KBKZJgCx}a2;_ayj~b*$f6xWj)40%4E0R(Y!G*Z8Ks(Z ze@`5%)=RM132p9euOjtA^qd(kX!NW*iZ)D=Lfk!@dkHo^9AROE`M0sX5{QmK$zCbv z=;GNmKuN}sABGbOC+KT9^(eS(L9HH!HoT75UIQtsgejXgm~4?$V?S%qm_nD<(T_5a z;#r8}>KsYCwkh1S5`sLM(k~f;2|XH_&Oa)>C0NXvIU|bv>U$Z?5VaAf3eC5bogm#B zr`%ZyI)W{Fo}3Erx#(t23N`G$F8*Aela_hqyQjVK$c!*+a`Cgt;o3GxgQL$a?ZsHYHya;q`i&;kZ>#y&Rj^A<#iD&waV_xnl9~vjHV4__ZzUMDxhF zS>!DlGjqO10i>)1Tb?D@HsmHM=INz4roWPC!}F3nns-8K$-014ZbPyH0gw|_f`0Pk zT7DAF@aLHx3!V$FmE5X(zyRm__0aghZ04TuE5WmihZ~TNAwBTD6plB{26AI zw#R|2Ex(p5J&!RIdsRyXJ+pP@pSYiTI7$@OWo+l5?C|)&ZHl9|HG#A(0k7NZ3lJ9z ztr6@$FK2GI+kyV~gq_e`Qtc?P{82BMvV z`xcp8VXYy(m)&x3mvlF z)_nIX9Mjva5|g)Bd5X`KoWZjoUlGx(wlpAT7zl1U00j5=&*EEm#L1+GwC$3i$L$tl zk?(>SllQ}FiVu6y$GO4tmUs61L)3|HlN1%#e_^TA4-gkwqnNa%L( zV1FAl@(&CNY-q$gXAWzPfkCjg9LZ5m5-OJdqlEDv&FCPCYqrnQfA)7GYx-A7iDZ8xi*J1`$|dzr ztRNNDzcoE~R8-vjSKyi8RQQZJf5kwBp%|aK`gdG;lP#~W|JJlMIVNV)-y{4;eC`Ih zdYkR}SFD8jFRAmtz-a#iVEA7u_5Vk#ko6N4{7a_(Dc}4rmHPhkS z%&hbrj2xd5?SID#KT*n0B|Hn~KVyY|;V%E6B>fa?|2KpD7nS{&So6Oy!q4IUGf2q%51SACPuLPOGsizdOWLu$7X6Iy!IwT?2-bz|QO#Uo zf6gh4=%1N2LEBl8vC%duWC;KEsl(z<>4AFs09^Uox1?Gt zO2G8}1aA@PIX86kU_5Md@mkC1;XbPc*lkMLiEN+M5s3dyv<5NT^9%ns>P#X@16z%M zUGe`dLjDg|_`gR7|5^n9OJMNt)%MTQ=D)AbKQ73B*f!xmq|L0%pX&er85m?{W9IrN zjQ39`tk;jlO~5P9!_)@P%SP%b?WmP2Gs`OZs1aEz@+gA38tONgpAa&z={b4d^h@!` zROr5_C^l9p*I+hEjw53RNJU{{iJ&J_uTht@q$g;P*RP`DI;#f5Kyk*mmO^a3w}^W*pdrE624LSWEZuJD z4zTe)px0X60o;+UyjLSQo+p=#T&xJ#W&=aE|8y?y1q4bzS!kct1YN~5 z`oi(iPwg;}$y*+JFCF+u)*gJ=E}f^CepEOdN4`NJC;8B351;8*NMeSL0#lq3DGy9t zkej(dI1d3GcHaY0;_L~u1@mNWZsQWKtk!2ZnYLiaj~l+rgoWQ*8TnqF4v*ZhtmHro zxy0|*!ef(#S`eB7n&w04dgZm7$bIPonEND$donp-wqSQNk#6J@B340;$gVxIY2doD z&ovyZr|XM_DaM@Ux9K}tQ<4k#6jv6%()N@)8P{}2EteX&anNIptDoEA#1yHaMo7P$ zKSGdqNKA?$7p5$+KN)FQh|Dnp4H{VNc-{W+;8?1|G|s>%>0xF-YumwEC3Ui9quD#t z+VE?E@L?bI3jKbG_S}in>|zrtj-p87K+&A8R~VCvM#al!RZ;Cxgk5?pNYB_Ea?z@3 zfu7F_FZD9#Ml6hB+|!pc-)Xj^sR+SL31?R8v+>X6jaHzK9z(|ub4iJ~+v&+@fu}Wd zb9%$n#?!ahjY;wNk_YQ1;%Gn>%n&5Mi(ew=Butt%YLH!dFx}TqjHmjQJ=yieGl>V0clrx#4urXwP6!efpt0 zr`dVYZj-wYXlGM6hu5xtH{8QBX*LdHi(}`ot}@JblzDEyNave=k@O;aFa24WS{>rh zAF%2>nU36g`yuDrm7)8ryAh*r8$pS~Y4~HL+K#^?)dB6QH=l|lB>s9mF?~2yA=9B; zRw94MJt@@z?ih@Hm_Bf@25eQ2=@og(|KK= zN#LYA4U3;=r(2W%Ln$TCe_+{+gXC^8e>2ipR{R0SEK&=;O#OEYvfu-b5IpTMdyaX} z(R)@|e%wPJNu*rAU3Af46ZWi2xvWL^M`za&+;CZR+J`ye*uavyB>ZT&wCk@}Ex%FWx#aJfxckP6ewKn4?zAxIpeoG4uuMtbQ^n;hI{d zXjA7QW%b_C1h^6aClUBzHtGycGE<4YRa(o&X#A+55_QVW#=Ii+XyRB{qDXvsZX2<# z4b0dz_?@7;-$dqY@J03#^!mXgvZI{g1^*#?9uIO4^gh(`oClXI_d&4R-f7_(9`_kj z`?-g2n#v-O#5l=JNwp4QRmLc7l!H&>Ut*m`L# zX!!Ygig*Sbhf9_1fPZyAy;T~Oq58(+xwX9m8z$wv%M3f2W;5rCfH3!T^4{9^!1mnT zk?U@cQAJF@dNRZ_3v(i07-{S*adq}0Cj5ZqM(_R8UDmmI&3lEEO973;^Gb^U>v=rc zYUR4jVPd}??_%wv2)<+O{=%ZuQkV}}gIF&WC8E81ZX}yIoIyG@6>U}E9UKi4j?Otm zb~r=dH77$=<(U?PvVMz5c1(G{qP)%rUCXDw5r`Uh=p6piOAHmFC;^^1PL&pCAOk5x~FD3dnW1ifPU< z^n`f`tKiP_;5zPJPZ5t@%Qgi!4zsCKyr+_dRO*{6XK=nt0C$bN z<|p*#BU`N<`k$wMY_U(`?nw=)W`#<%erE>b;jQ{&C?^A(cbv)A90j!vaBg8*vC}y+ z%CJxyZmFz_a&>=wfm}Nxl|1ruK6f_&bEV^0Iq-5+TQ*jTLNOgB-mew0H)V~E`vtiyD za7dXJBUVJ-rJxJa8+VH)?uJMHE;9xaxMQ*s*k1Ap7i0wrZs=}CST@by)F3Pm zCda*h zoye2EV-k{&k4T5+c`_%M#k$-Vvx8e<4}fTT1j+0dQ}$nM)*!K?07c=SJ(;A&0a4SkT>pFR~D&N*@hx~+!ACpJD$CQb z;tQ15^r#}{Bf|>iUlT^qJBs6Q+?sd!LM8@1`PBuIb~}@R@k9wUqssfm`$vDeFxH!b zUeo>zy?ni4{OwB|G77zqcEc4SG;vKisZXCC;lN~NPQVeCK9w2tfNI0_TU!gM8CU$6 z-v+ul#51b-TEELLd)oE3`MUccdtdk9qiXlZQ&~xw2AgK1h;!ko=%Q4aa9Q=Dk8^-W z=`;OZg1;sunnuuVkYR=#wq}3gKljm|up~DZixC;5=Qu;&0 zy$-u;?NjFh3{UB8lk4%vv!~?6qjEGYZo^BuEP#>RVzYqEAitzuIu=4#PGe-_cOFpGw||w?ugml(n!K#d?N!$9FSd zWB(|vJ3mg6U-H1bWc}# z6Y}y_@WOTl}ji{!vb>_=u(v2uy2scMPi|6n-VA z={Jm)V9p-sk@612HFE+9Oj8QF4W_DJzCSoelF|HWubH(Z-4p}sSUjS(ZJxAR!p6m9 zEd|)!gA)DVYy`Ui{5O=wR(D_Tpc3obpS(6ou>_%;iOTG3I$~V$ULhp6^%Hw7b3)rO z=;eU%qJIkXnZk!bxQOyZVysRE+A2l8cea`1;Ewc5b-#W9LMpaI-r)h?n5QZPM-*mL z&VC?_NN0|8<6Y@M5FEciZV>-b>;{_;Lwjhs8PTRZ@bxFknQ})OpYG|roQ_?+P&qKH zG&VZ4@!G{AO%UvTp{U8WtARS>1wC?)uwZ7soD93I4LZt=wh+r~L7I}<0CVPaF(s># zw(@fiYezfkK}|_*A$oFk&LbM?<#y)b&?Hd!^>z4y)Kh`zEzU~dcNV-Y2~kiO9Dnai zv)TvjskmO}sq_9++Q6r<$dBNK6wT8N)M7T@?&~Ygi#0OpfA)2^k|rwGo!Gy-NBTx@g@8*FtuNa)BP@1?9~w&#Y)3`Caf`u;K{QBR&RO zv>ty_jFtLNA2j1DSorJP>l3G<&pWpk)#~i;o~@BTy1AJ@?-`iz?{IuMo=ZEa4!Xgu zaeY0hU)g~?GhJ-PTmCyX4YnpUjDU~ZL|?YI#dHsch zd~)-yufa2kxuxRyyIA)jdG8@lEIUF7l;j^8Hgw%8jVhJY zWfV)pPpD?IAmIhS82l`xW6!cxWvICuwbyj$7|e~W<5Xsw%ofKL#BKN80YnFuk0-CZ zI()I%f3V6WXBEj|l?%O}C!bq<Y>i}+- zT=UH(7XEBIX&GsBWoC@H(T5_{C`a#r5MPK>?gx&?`4c1%KX z-oC!#;yGKB9iM?&Q@3v|t&xX^yTJ5_eE`;B?uk%-FxC@S3I5?s#^-(1He)56zkBrg zqnX|R26b7vp~A1rgt`8fdufeKVIe;S%6}j&d+|1mOq>s=aYmjE~>QHv=suTrC zwU`itP7WAb`EFx?Ee~uQ%4{4uX&l1nGj@Q9&D@$z`O8$zm+;6}Z)8F)lAID_|cTP=DP{QhceX8i|g z{!7-DZst*SV=Ni+uGv};@}Zebni84pP)2etAJvncurI%NSr#Uv!0B_qpqcT!2EU~L zOkeoz1GGA6C$f>c8}SJBc`#$W%)kV-ZJ@M?<#T|l9(~``mBNSb4}cI}w5FKjhxYpe z;o$wG*k!wstVG@C1$<>Bj5pN80|nUYoF& zl0@46wtkcR=!<4ltLcv&A>3Ko*5fN~SM|}v`26ywx(|>n2gNdoFg0}Ye24ILybE|A zx&rAnE5wCUa(XY*iva}p{sK1|i-vw1%mvl>MKZD1yZO#b%S1C$Hm7mTsESCUUbr7Y zV?WQNnejCmOKK2I0kbntTzX!OEqhJra$8R3gozNWb<9MeJ z+dfE@_f35JidF49w79bLm9~I5c;;4mX{g18yipecav7*pBWS6miTKrBmHF&SP z<5K>ld=!hqowWa)((5;1&Adh^Pj1`ogfnt~$paMX;2Js8tF7rL8 zH&5$663oJx17G#tT+~(=%dKC8jP1QYyo`N>?R>mH-$*Vmu|-jxt)Uq&R=!0~EX_@v znyEjqdy6}vMRg@7EsBg=$ZnmVF%C zMqV?@#J~L<_o9!HvoQjs^uGin@fZq)>sA$2>8t>rFzm)rXaT+b3lsJ3O9o z1vMjd-B7jP{f^?jQmxj2jICTn6j`;(p|<81r#U!F`fe1kqK#W;6Iqq}Y#o*$TDi2m zN+yo5+NU;6Q>U}Z!|<-?)Ozt$xqOXj<=O2pB6Xu<;vm(Mg~P;VY$J(kCe(4wg=R6G z`6GU`TF9J)=Gvmf)VN9r??d5oOqu2wQmy9;>*y{?If=7%V`>euYCBM~0IVh#Hjhe_ z1uY8KC+6`>+QZB%Le!Tkkq(qeJ~NjYo#55|PE|7>Y8Y!VcRXH)0dH2Vnq>9z5 zKPiBUx4b*@cdZNAC(t`IGGMW@Xrwui1bNZ9gupO;MnBNmkr@av5f+jvkKRZ#eKSbd z+2BXEf}fDHh$ zl#@USiot(tT~X|$;t!XEOpz$=Zk-373Yfnag!eH4$tc>WJOc>onkECYS-of|}j4 z3P1g`9+^jvd>2ViW!EqTx-vAA5zn4~LQu=^5rsC8eL$2E%bqDC%8h2rrSHA^{Ua$j`URZ0|4qPkC4X-MIEff$$^i^ltjuc4#+n>J$ z?Ar9oZ~zbcH;gLDZwOVgcL+d8If`v?Ht}z;v#V0g9o)#ysGV~=x?O@A&}%F^f}+-h z9qlWn0U0~KU6TPo-{wrnqtqkLE}tFvZZ+~&Ae|lQZl@jEuD2b_?pvsBPxTJw0Q9!X z0Q3$!{MOhNhaGhAE2huSmMDGv3y}>(S29FFfR)e&XgZ2(-)3n0c5>LVKF3DDBXU3J zBgQUa3&%As@5B{K3(~bh3(+;xqw_A(6;E(Xe?VwJ4aPO>qs*?dTl~)DPIIW|*XT#| zU79OaD{(I<7h--m9+U?rFGLqIo#3|`ylZzim}?Mt;w}(RREFM&E5=>HV1{1OP=@~e zuz;&CuZY*m!D?^=%X*C0Bprxy#DoTqP_Km7GArqBpzkA}JXiEx%`4X3^(*OJ5d2_M zl$aj=0oQG=0atzBU3a&b9R)YSYi~EuYw%#AzKF25D-?W@S8N@j*T9|PE6LqYg^Z3U zzCVEYJ#|NSn{B}GihEag2YL7C3Tk(2dvbuE6VX@X)qf}XieliyuNiH+Pt^|l`V#&F zR2;cG*cElUhXX!jhi?FdGd#ub0Zs0Mq4-00>Li<4_9M~$nIdu?pr7#$y9boRF7}<^ zd@~$6A!3pJNU?wZ%qIpg$#`el1IFMK`wnovk$#$(WIsafpF=)PMj7v4_kc*BrXJ2W z@J|z??1!KIGj!zqmTAU2{~quGr?`8X^Nn&3m>)SG!z>FJ<9y>AI=N($^^LKA_WblS z&UmNa1G;|tjdQ*ce3}?#eM9V@c|P44WdVJhZ!mj6(#Uxv7Fob&WQ=>j{=ZLr)9s(v zKR^Ed5j$@yWB-iz5ySb0yayEiv@*#8J|q3l6W>hx=d;Lp-Oq@)_khcvJq>Zbu??M6 ze+Cg{|4f8k-2EAq@@ECJtnV-TXPQsn&*}KG2UPtueRgU*bi%;$neEg5S?bedknxVX z2TcBK=Cc#BPt#{JVfN30LnqKU#Y9FKKC$-C5ubjab3?KR#QOC6oEykbzt4gFw10;C z4DfScpLHO6z$2XEOVf<5Z2M=Qp_7+?Jeg*Z-J0g~2J8XfBIh4Idylq%c8r|QHq3a( z-vfGo)-lO$4Rd-E?Ey_c7mQ->x*r_&&rKf(zz-}=0>5|iTlG#A zo_kmO*A?ASG6sZDTm`>O=(Zmqtu*7L`QBtx9EH(;-ktXBdZ!@ z?&MtF+m#1sMei_;!Tgz>A4KO=#fxj>9?+|C zyKZ&p2h!%2;4@|{t;rsCJaZ;)HOF@4EFJ_Sj0(6cR{=*rufZe7o6%GbfDdHDh39SX zbW|$vG9`n(W{vic={$C5->^^9kTFbep&(V79G^I9R4?E0a?9Sk+!ub^nfoKirQqkJ z&94$dE_?Oi{eW{uizsr06jsC~#LgijNtUQbT{ATF!y+!5pV!2UhBOMtH|Wh4 zNi`5aRf;-D&Yj?R1D2bghvD_BT`TBk`dnkBxeMAeo0!h+vTzyHui4eCHEJw6*~>8? zWlZbaDw8g&FN$@N=3j=v+<*3@oGSc!IEVJ$zBc9@j{PxIdfmiYzG>0G1Fy#cfp6}D zPaMEEY1y3l*L17PO)q~5%AHZu)_bhl!W!R3a$`Pz%xvi>9@_h3zcPVn71AGjV#jIk z7bzR^$H~jrnMg@%?F3XlK2v7#Zgd=GOORO*Ch*mU+lPYwqx2dvnRHWM))j|%6WPVM zAYd@KD|X!7Lu_l>7|`kahmoGawnCPr_r%Cg6*I67yo>1^CIk1t;vQ4LGX6EO^GZhi zaKh1b#$TgpWsyblYpbhc+MIZAn`o}0L`Ode29b>$&rsU)PVJJeCXF=@khWAeAx6W; zX_^pVCHB>2Bl2|jE`}CRQeITcGzqvQPIaKfQB4tldKgf)v+yE@vsL9BN7VPErJ;eF z>%6b9bLRxUEqY7a|C|TcGqFDZ{18$3PW-Z4NeMk21gEI%m~0f%(a!nQq_a>}Jvml! zhPcb&p~}JG-w_7&6+`!MB~ZjHn#(>S#;3xVN>|Vl2shO#?K#3--(#Vh2ndQ9>g#`f z6vhdHM1zBqoj!hPb#RnJ@)I@9;u6y;IeotmNXWIh!ND*bxsO!ZyOp{^L{E0h8E`a_ zkbs4#<0B(WkjmfE-5f?w_SFyoeVe+?i-R7myrPZnmnLh^v~<02zS1x?eeQMAkrMb( zI)O{`r->S>vuw=jVcqk*!`pA4%A?yoD^-~9IzqRV#8h&arwG9nUT|_o!7@^( z<%D>%>BfFr$H}r9E=%!GvnV#qb56S}0ai&o z1_Xq+Cl*v0ow+n;&j(4f@Q96YO+)7NsQ9VkyJiT8_EmCYHRcVQm~k42V>!;ggM~GP z1(l&c-@n$sI41Nus4#Q(C&RncZTs-lCu)AvOr5P5o-jNtJrpw!xAn-`>0T8PaWpW4iWj~k`3heP}!-(cbuyl$XK z3$8UAeZs$sx6Q94U1wmyM8I-g^s*1PG+%r1eOkcY(fGSC>aR8nSlfX;g2g$zJ8mU? zkxsF-_Nx9L$Ke%9)vI{+KUqZzdTsZ(%_o0b)Z%{R_PDraymB@c=VwBQ^kyB}t$`ox zQ4cA{D(-&wDEWTI^}gKi%R}M#>L0hX1e}B2uO#L|KTF|yy^d6y5+(8y%kr`IXaZ0N z_nWBBMwK~sb={@moZ6`=V~=EuM{1cp%KhjnCjYIFu7D^Us6=kzt$=!v=e6Mbxq;>u z-=Swk`y`V39WIeQ=P2$w^UGj#_RSfA>kWsg)dA5?Bh>GL-HwDO7afAd?@6(EP@x`J zN96nZ*xTtYmpLLeXx$0v7@xgEhXJ%h1kbQ3HauNrxLll{+wj7J9Xf-`?S2c4PPT! z1oQJmZ*n<#eP2`6`r#TzvcBmr2ybe1Qjf3STS*5JKp>biRS#w@Bl6-Mqf1Tis|H7cgTReuK8LQ3m!j--ZY>6^R$1IOKXs?o41a4 zOtw$Hl;qi|m6>UOr&}3r3Aganj1>OdNtHn1wl%^xiz)hik|8Br(><~m1V`r1ks4&J zXn29BRA1?nB4Tq<;ANVDn&;riFV&1nVjt}Y!3q@x{-oPQxn!wXI;#s%$P>#DO@tKN zR)@f#Fr4Dusu+7JW(W~1DMVn3XOF(^F!bjq??z@xRHZ@HGuRxyOgWPW{unj6A0xwd z2CwYrNo%q?sugMd2&2x*{TA5XT9@u@(;OJj!%<;XYX25 zm|)MA7m|L}w?Hne{APD{8YMdX39;C(fK~xlz8qZ`dD^-o?({I)ecNbn=@P&RjmwL3 zr%Q0s)GKz@k4lQQ6OWMZ=(`b^#1ratw))|ocPQFy?ChR2MOramHh&M>zAZd1T#mu| z;}5U#(nTb=A5Nfi2$?S9Q@wSBXe%SHK;M_aCy2(wm^EA&qDFTKJ&8PI*gVh*T^|o2 znB4;r*{lZF_3v(++7ZsB!o-&4D2rjZA+bQMU4}}ec#Oow7LlBfgAcB@;1J9{AYJ$ta#1$QrmsGdXkFePP z*g0Yaml{A1h9WMR3@MvN(68_#$a85%jC`FRG$HUpA*4)0BzMeWuLnPbr>F<7t+C4i zr!hkmq0Au18h~1Q%)sSkPnr^Hh;2()HsS|bGOA6Q6d^CeUdC}2AK~wKfz^?A-MxcT zKQ(60X_8f%?p&ASy>2)VgbI-{?yOAlHax-ftTC-k*{%Jjucj~~!1i~-o z6*prbOWpxExAZmv3T@068Q;4%6@zGEVq%9_NX8Lci*66Ii?K)5tkqny#?5#6%dkZh zA2U>RUYam@Ni=mSE9LXd=%o#a)y6n9B0g#_z0`<12TnAb&+)GJir7Kh-M+8c>0jEO z(pbLvE6}sK_vQi+2^lp-Tmn=Nqqhh!?7Oo_$B%gRsq3Mnr8}pudR^@&f7VH}2KAD( zX20`wB6&fYd00_(-!=+fyk6igjx!RrKrmQAuZ(OqTi@7O&_?}2Th^vT*VoZd}tLT zD7tI?;hQz@mr-Gt?@+ff!&3KaM(K9?R?;e|K*d3@mz+6IbT;Q`?(&A&Kh+;cJ2z*T zxs03zEVR;j#$=iy$935-lg7>sdAo#kAdm zz)z);{n+L;%?r&9h+WWg&W zu~DY5_<~r=R-1`|qZJkpm=Bz)>wYWJ^%<38WL78hR3|g}Jg-O=_I|&TQ)Zeb?;?NN ze*(NHb_6%$+LCZ9+|~`^mQmv+zaYBFiNtD0x=elNe6&R`qASF{JsCHO5%t(DQp`YI zYyk+tg>~SLo6bR%F$I?v$Diloq&a?3=!{oMmdzxJty6(uFjZK$nwVLAl`!TypGd{W z^Ui^u@8-I(A1Me^i*0e+9ahUO39F2%ygCT%HL{Ny(XIKx5iFV2;w-Ko(wVpcNootp zLt4L*Xpy`-PfS zB$8Np`TI$EvrenVpa$^*OI5)wc@VcT2 z0;alOXkMHpc>J8|P-t8w@(s|%N`;ZoVO!;c<`|ScXG$NRpf~u_pO~O7k(>W#Ka8Gw z4ke`C&nDJ2Ol8U~1HB4X$sSZGH1B{?FqBh@n0KsmtRxC<7iMJ|s)A&ihLCn5y3pNZ zQT6D!6S6t2_%%W2hg(5gJvKDH?L3Qb@p=snNfbLo5V+sDR|pZD7UA#Ui4)ZInWacj z*J))_jt>yP*;j&NX>biJvc&dwxcKVJbL=%q$xT_<5y-(A_avn$76%QhT&?h{R>r(@ zgAE}EOAYXg=HiF*+9Yl6MDg`U1dC8hxVjWwSt?SHFLg-h=q_M2o9?5n56RZKd}_-& z2gGe>r%-$|TRtCrV;D%t5k=ifjICIODGe>%`}T>vL7L;q-99HvEDWZbaw@Jc-7?@I z8VMoRJDHwLE##C(benZ%SPVJ`1T4n!E z*vu@b3rM@2ooZs**V-Rl|5#2>VcDXgO+}9!VAXQpca2gy$P>Aq*E+yZiP5+&T%4@1 z>^SC^c#fK^q^{_6bv|5iU}Cx{g_RhA{lri{lM7eiFT3nLGEb{&xjDQ=-}5TKimwq# zCOOtdNaZn}5~?(oNWHgJiffO<@pg90lwQr}WgeYMJf5Ifwn<_X&1PyM>H#|H?W1O2 z5>`RvebS4>s&&>2_u1#$kFCtL--^3IHes>hW2^g@j82(K+)=iL@xx=~02tX0Q?64K zICl3uidxpE@I1@$D}{3Hp(m*6z+OBqfwBTF77UZqU)eT8n3m?dd82LGW3g_(B^e!Q zk@8w^A)_F@yp?##j@%oe+Wa&i?=>2rGXjPY1XvTU5NBrpNXHJc>B~2a9G**!AttHQ zC>{>v8^(rrKHvZDcpXJRYOqYPO4Q2a{9273uZ_j=GQokFkaS?HbN+N9G5GV3hEo5< zbN?(ZlmyJ5(Yd1V2^S6680gi z?X938Wh;QbtL z(+AkhCk)c^Q;Rbx$52<-tnlqZ-RoO0-N884Wrm^lh%Yt&PF8iQZ3>AQ1Y-Xk;5x6UJT*Coq{Vp6lSt%cV`%8Mxr(vGwa zwYK(bZi&9TH14bwm6eesIHpDEgNZK36Y$yhuMK&$S~1j<^h0a4iN<3?HA;x}5Tl?~ zTN7ou+U*(1rm`=L8grycGKd)tS-s9(W>f#XLLuZ>d}{#yY@5tMf+VM5HyBu7qy^UI zgs0b@JO~0kLy`f~qhZF&Dlc9Nm}_sPl_#)t-3yE4ktK6OvfdP%sq!@m=tdShn%(^Y z;&Ev7WR?UTc;QvJ?kO{|fg^F2S$<@-b6C#_J%aMi)8vMey|1mC`C+Nnw6DtITCq~o zsZGinI01H>*Eenr+gW4iLIU#C;f=Ol3_}557qN10of6T1gQ`v5+{(!$B~kp5raQPh zVffbWZxJ|7{%uFFZ`Vj&+1@F2*FPu0(^S zmWcJ&wqeZBH0(Oby5)L#$;&lBq`&*H8k&5R0198&Y%v$ZvM8}|lqY&}{zn{L0&6$f z6Np{Zqhltwguy6aPTi})y_I!U?&QktB(FB0?Mn4U=|{1{?E~& zlcmF@x5#gQ2hY@1qN(1Q^d3fY9_C`rBI+`Yw3P{|Z#d^iU8MBwwk+YhK*1w9{a5H2 zvDC4lup;K=EgGo`cocO0NUTJ$Om-c7uHGCIiUh?TxsFybBrYLKk+XEgK4rzeJ@OQW z;>e6+-DZdfmt4j%E`>#oyM1DvxA)kip=fLr;%c;HFhmz$?_Jew*-xLB1zTs&gy+xaKu3-Zh=L_QC<5vCIB<`2B6N>5ap(Lg!V4iQ1PF(CEE`ryj zHGM9$U#MEKR%N>=2oW)h?X3YWVpT4dihQtswdxdvyUP;M%q(hTX6tF5%&%}QhKwQ{ z(YAq1-a!YX>E$e{g%fOsDRgFW+W8@GY|XD`sSxP=c%faZ-sly38-sYBNVNV>vr%iJOnuMBF^}HUk?Gk-UI;bPMr*EwRQ42d6w2ev=i8Hg>K1O~&!B4iuTmzZb++ zSnDNs3aNS~1!)SyAtuMDX&m5=RsgF=xHstzS|%nT0gJFX$_BElh0u%ki!dkfC;6rA z54K1x&db_+f9N|Y@ebYxR?9N<3k%>hT*~iZuGDTAP*^fd+roD09W$YUG6j*d0Q{)~x0Hh?C4M?%hbN$degnC?U{ozL=8&z*#HzX~7U;$x0c+3FnLY3)zca>xi{WXATk24@%Cr=n!>YxLjbw&?5Z)ip`o|M9@=v zXUJ}F46$addZBu{nhX#*EHAL4HNy&VN#^`0%o8a@HI*BSi2{Ow7zbe< z$i~26CKq|=Lhf~Ls5w$7@$4w}JMjrE4q%)#V{lYMYAo1Wq&r5{-rl}W22?m$5<@V~ z$DzU1Z9SFTlBzMCZfRD*d_0?6Z`qseJnwir+H%_Uu8;4qT^plrzM8DmY`)yCv)CZq zjgSd#`tU7jkj=M;s0c0qyG$yn^oK4K8$Y)NnN@*+RpNlK)Hxf-Xcr^EQJ|fc<*C-! z`I)171kR$iJST(i4Wr0qCP#k6oLw~uqdUQZgzVC(lx0&N1exER3MMckD^H0qvv;d~ zWafThbU5onulP6PWuU)zAS*fxQ+{ zn$ke4dIW_oT8TDZ zYM3E~o9lfcVAMd}Y+*BD-05v7Sex(_lvkQ()C=%8DVlSvD4ezTuWS2q3_jvx60}PY z`-RAerY*e9j#F~C7!V@LfpkrM7LB}bW5%dCJuSJlwc*Q3N@A@AWM;u(Ddj*;-x}_( z*+krvb4EDKc+4;bx39r&zL;^;MUi>3(%<-}jW|}#>$nerE4>qjC8fb0B^E(;Cf}qo zwl#W}%_7UHxTsHuu6Ui*hXmx+gG+Fp|A1qP72+;WF>UI)QCfp6sQ2Nr=P{R1T*0E&cw^ETS_fA^y#o726QlR}YrmX|Hiq1=` z(j7!X$8}dAK;tTQkxaTkC-*nQ%+LqQ;_i+fY~4*G1y2LJy7h326)qCQ%<|fC+dLE7 z&{x>NTEI|AYS@tpU8QQmywkn#yzpJZM5*St(M6f28a;zqnSzhCCx=C=Stv!1IgSht zt(TE|7KBW%%Tr>L?;NWcgsT$y*L8O9wet^V1(Bt8{{G)FlaGULTjD+(d=`u)X3gDu z`)~>l1eE6l^w@FDf^f{K-Ag-+6VuS* zsR!Uj?WzkawV_HW(LGdz@Gsb(EoQ1GjmSelj?mYrAhcjPtkMOf+HWW2QU~1@ zx0tePHJC0S z>KGEbvxxDP4$Zk%CEVcnHI`$=v~4Lg=)jTByziQp(La_01;tJ*ou{Vv6LDCN@oJ^R#hb|CGW z7%@k`8BHQy-|3-!TZkb~^rL2Vm4hgl78Xzy4-ah3AndFGM_xg*uklh7PR1w6HL_4E z<@|>MV1HzG`-m}x9Y4ovcQVc6zIRuDZSkl<=Oj$9LlXb-{`21z)1YkLK@r-~d#oD~ zSNt3C`iz`r>sF95jyPrD7E)1IQB2TbC_@FKJ4q`3*WARVC;d%Z9|5ju2hWg>m3+dj zUOo7u?5|PQt4Dlt$3xrzcVkDh+4Pbi+2+9$M-(UJro5)Qrm|#A^V$Lv^q`v><6slF z5Rr&L!f}xj&Gu$89tDjQG)EQLKw+xJadPz_Q17tEqRR#KlNAPNS>Mb z6ELte?nte+WJO>ieB!ceYz>={8F<2JS(?GA&kkeo;Vp?T{Yt$wtpKIuye?T!*}@NF zRHs=pQ(Iv0c^~{SCtV{?&R67;Zuy%Q+`pI$jRVrYhNIqp(pW^ywYE@{jLep-@oHI3 z5I7(Fey!$!WZ6-3GaM3%IoHN^-8<5*aZJAV0w$DMfjM!g>itgF;k|uK)}F7Ku7VMY z@-ioMXY^wn4o6(1BMd|7hr8v0f4)&;r@+Kmd-YptdzktZJCmcip1sP&d0m-mst|@! zo4Um*d#T43f`j-#v*uRlO5nTx&r7JamieSVEGGJs`Dy#oulr#$4YqQoJuAaTh{3Q4 z+;7h@AK%XR2kgEnv`lLhPlZw+(XbalJ5?axwJyoE{K~wZV%y3&u(J$4V3Z?tGLo}8 zDg;sUt+_r0MU};d*R=52L!q#p=7fbr{a6wcnEqUORYQf9VQ}~;$-tC9c1=yt1Xntr zT~eO|lRL~8hhS9XI=**`Tk45xsL}RB!ab)?KuJdvpnwRV(VAvK>=V{ooAvRD&OVYFpV3=>W~!>gH!TGR&uO4auB zRK+rgwVJhalfev%x4|j60}D$EzV68oj5WvLW`59h^n?Ta;FCATB|=yGjwMpGd{QXoLAhiM6;nG1VnIqiMjph9Im| z_g`r%46$aTKQ%p!lU9vq&?$+(o{EP?J}hFQ|K^#;x4DgQ`r7NbYo1BI0UG38$F!= zXYAA$nF^Hd#khN@ZyigQ92*2P;nZim-$Krxo>pWKh3rwi1rKNwgDl?b(vgEOHS>CmJ=0ID%uqs1}KJA`K0gyV@I_Qo50 zt1NOHK=MSk|3w;RcWg+T${?4io1&HtSy%LCd3i40er|ybPuyK7aH?b~w_+Sr1P&q^ zEF~uba3Rqz@O#c&fR8v0NjNgBJ!TwgrDoUDb~QwP!?J)P)%Nb;B=%UPfIqw&R@@%I`9bF2*_ut zz!cHUO)dTF^j3Wtv*>f%VoR^3cr4xmzB)B0FZG-VIlMI;73m-SnhFy-y7XAH5rj#o zq0LJkxpqoMUbHjYL>U#dD!(miPm(3hj*;#+dJDi_sv;*q6x#)cji}7EpELN)8LP;q zZ`jvrstvXjIy!4JqEF@qVJMp?#=r4!(^a~^M$P=P5IH`EU00t@+8SnvVZOU#&S9ss zc@@=F&BPPnn<%m-z4@6*SC}TCb^6f)o&b{H;P;cW|2hU<_|Fl%k#n7%o+y?+bkGYP zTFf$!{){M|IEmQRP7T}}iO~6Jxf8Fhqt4J$>lEKnhi&{GoQPUS^aNNcAE8(Ak7|NY z)z=c53?}0AUf3MC3X$lO+ALhsb@oWRwvLJ$?}zA&V91MJC+GLiQk9y+`Hyt;RVy0UdOt9@SXEV z!4hHyZ6f|?GWmGz*bQA=qDJD&#b({_=b%^3%6r(^+1J_qsOG3~fy7Q#7M4UDm55IH zicpqR569B6REi|>VLdi#oKlj6Skol+VYL|=HT3xXXtsT%JUWs)v{A#4xD|4zi=#Q| za)E1)w|7YE9JMKpF@Ql(x5a(RYma1y5{tq*?Rd>t4a|{o<>JBb;bQqX0Q*G$1a)ZN zNzG_=6fG-quMtHTJ0aJqZdZ;%ODNtEIPB3k;^RUId;r|^6%qgr4$dHfydG6ST=5$o z?=$eK1#+0*EMY95R@DkXx&C`gf=*BnK>NYG`Gi~WK4uLxxSZ;4MymNVQfg$VrG^7&3hz%+&q7;VH9AHe3p=o5zKlnzN zO|rb1iD#FFCxz>Czb1gqMw&tTh7`}D4`2t_K{8AU$sbGYlUsV3Vk!ARmXIy~l3eRN z)4u@BM-j4_9Dx5m&PG#J0Qt zh8baDhuXiqed_4U_L82)kZn427plM{Rv|Nl7}>F($Af_G$jdJ*K$W&T2)nm4`V61f z&&!UW6~x_Z+{@s}kU;zwsd-h7;>7$?BR~03@cah0h{OfXXU&@;Z!`Sy zFL)oaGiEEsc;f|ZJ@`>ogT&~kaM(Dqgwummhe~Rw5wHSSV)8Wxq5qksdp;wyA{C zznC=)aM*pmXfn7@Zq-)&RjY3Dt72OWgX{_;rTsmY*b?rmo?c9t`hKZV$BMD#AUP7L zPDs7dloSC%h3GkC%8mnuhTQamq!TBCC4L6q;bT}ofVHtPpDc0@TwK+`xC*9g#WSlQ zD3eGsLwD%80@EgdgJ&|S@w(mT^d{;R?C{;^Fi6*(30ZYN+xq6Na>{!xIHzBbk+$1(P zpLpv1u(cl1qM9N;n6S%%da z*qY{?nuQja;q<(sO~xzH7I0k&PfC5>1VHo76QKnck2arDp)nuj?&!kxtfcf-l6ii7 ze0(6u1L^*yHJTMn&lAMILAQ%SoG2>cHxceyWlyy=`_-wqx+jNl|}n8ZTb z&)zv9f^G0{nTf%^honzHv(_%P{XzMGp5!WhOme>6tF@)2<+=0Y+X!L&4Z1R3mJV;HXPgSkc3tJ2l z3ZvmAkp*Z{QTuoIp zRABR0nuM|!Ly`@W{%-{J{L(Ge-{{n1rcjHwA~Q!rWhY$`IzLD_T$cop=RWwQlt~Mj z)$lB8w8Mj6F8_$!WTVN$kls?DOQbO?i{T}bEkHR!Ly53+3Z%~?I?XE-Np!(wKk7l^ z;S=dU_A_|qU~vnL^;M&M1v9CIiddJ7vD5__bbCz{L+M>_mMrLE{n z+*LjpnW!q6Dx*WdJ zb^r9l98pdl!2%Ic4~f?^e1nV+J8epVR)gkprgM!~^;rucQ@mUS@Gvz^MumF}+NIf!%Px zjl)tu_3Cy8ec|jcyp5iqhrmxYrGQ_87xJdp5^F zSP|b@QjYm^=Ahc9dWd(z3h2mmPyIFUiJ>F^Bwk*0`1jEyC{{DV?~5)*9*G+zHIdDu zjT_@nQ-bg`r#oNQ-GEpA-3hf978j}svbKEzIv@=fYuCIS3$Xp0k{Wd&nlE$u=;KVN zRA+X_z;qK%6k@K76pTRnse%GMpvj9PXikm0B2+5Jq1asYtLc<4l0$$~>Q~2}hHwDL zFru-hcm&g-n`3&IHZC7yK0B!DHYh#_F%YDe6>0#a=)|^<3!kGuLJ9?y*7R41HL8^_ zGb*@DaAc4-xOY!@{~vwLnM$>)WHn@UbWdc?vD2N6u%@rd`R855XVc)1c9-N-W~5!H zEgmefU|vUVAs;Hda*jT;raZf<2TP~GP2jFA+k~5JOW$=kKc)#)=`Ym`in7G-obm0( zpTsmJi_E*eB+fKjnr8R$<0RxL^tTi8Te_TRnDoZy4d{dtWJDrfr3qLQ;#qwD6Z*9$ zUfGamKFJv`Z22f-)%66FCm-QHpAuhWFprvV_pjP~U?{NXewwPpXyj{7p8MxW`*!?l z{_;@!^)Ar9^<-xzYYbDph0*^UVn`6Fue z0MO~SQF^AsebozxR4Fhv%+ru0Psgvu6au+C8^hv&VJxAtgljHKkJ(@Q2AeHc@cl%$ zGiZ1QCrr}i3TL5p1ua-Ux5jOF%b}QVr9T1#YD+}y;SQ;F4RWCe{PXacfnlK$wEn8P zr7c{-N%@LJwQy~;mbW9gw>>yX%vV+=O2*I~Vq}8QRoZKRGRQttxeVwEq&;p_2KQ${ zz)x^`f(NDGc4feA!Epph)}vfXMUk{)m3A5W=0-CAP+J>a2M8eTx$EJcu5SHejGkHx z3Ac!8{ndv06M2v9g4V&yv&Sv*5p#7vp{|8jVO7Fbrj{kCpr&vwpqhVrekEXQlm|`R z+!ONkMvU@zJ}znY_bh6{^}|%OWtAg|DkxQZJdPfGL&|$roFkF3+>inU!kH~mRDzmJ zsVN7tMFawNGG}91Uzy<0&^f}e-+_hOCh;=7kAt-7)Qjud>Xk;EDcbGl6{cCIfvr@t zmA>2+d2ec4xD%j!D0#Q$RcV*?acshvU5Wy;L?hA~dPMp^p$?;Y$7xnNw|}u(F1J3l zO1#u2*cw!oQ!>H-lojna!kfd|FsWR&?N?$|E%g{RE2+L4i%bJ}ZAF9*xWJ~O-i5vuE7q4hTI*808u)8zl6Ud(r)v7w zAsc}(Y$y6c!kD3y*=^Y#tbOLX0vfNr7BD}{4t{0VUv-aAxYpEA3;VpF!$iV&tqMWe z1{0O)Qow*rXlLh zwZ4b4$r&1Fw^=p;r8{8u@+aj^hJMNQU(44=Banhjh6~tx17zGzqkWrR4UbEkFynie@->(t{GQI+)v@6rja~F|6c>5up zA=atnI(emi+JI-Vv&VX)Q30y-Lg7M)i)v_QmigsGHhDr4|KTvcn0R4Zx<9M!PPqRE zf%u;0cfPE&l0TIcj6`Bk{6>xj!@tG8h*GS7aP;kGfnqeKK%G2}zk+0LNBMe7Fev87 zXMt#8v2?K;)H3MHrcPT#5B%aKrsDN*uHs-zl(B60Av`6~Pt}t2Td>WAFaOy3^~L#$ z2ntiS`o~0QINVn}9hNnpCEq|(_Om@uZMxu*DLJ5%Dp`O7CYid1ombuZpq55RCbe03 zqwsF&R)kk7cyrSeh6*|_rlHmoarIUCZdKIG+_5 z(w|C^@3Huz$gb z`Z{#2CmMVXaliS7tF zJ96cWf&w+fe<+Qu>k0*V4eN^p=$Fn62qBaXR!k6S_^tG%JtuwY!`oHq4mcgkhM(`& z_yZSFLWRw3$rh{Woa^QpXwonS<<@_Yy~|^E0x-3^G-V8as7l0+FBxnbjEr_C2@J+R zpg)+xpDJ|2PQqTOPpV&hH$0?+G!iJ_=TnoT^l|nb`sxFF?_801Oe(f{JvS{Btc}$1 z^;Ihx_785zYxt(Db3qp0jvCb)0Qnn9gZ}qz0+aKGcCvZ(G!3r-h3uixuQHQb7RPiM8+# z*6+8xS_$_fEn{}4t)~nqD>TNqv;TqoXA4;BCR9jfpbLgzaCk$N^ z5b3E&Gg?sHvpLi2F5wsTaC zQg8*PiL=1vq=nwgvU^H4-W^E@3ll2abAAQ8Km7g35=PYz)YFc_y|IPOr%P7C{LL7S zA#>w>xrm8eVvLNlxwW?Bn?=Yg8G?RG0sJApSbhG6O5hHUi*049a_K^ z^UV?p=Con$%~KGDpb%n^+5#ca$$gYN(rBwKkXr1a?b2E^PeltuYHa7+xv|BuI__KY*29qy*(Hf?W05vw5baDw8eX@q|9y1t6ZemBZ{QD73q z+f&L4m*&NuA5yWz<{F_7plZG}XD3=?Zi<=v;FQQxeCTU-7-y`5-jj%l;!ZIlV(z^q z**aL^|f_?AykxmSdgQ$;UJBTKjxA zWIE{*VlyklAVVcnvJv^p@y6*8&qdXl)mD@ll78x@@E-jp`yQu`YsC9`hg?>=1=uiY zw41fY{86LPTeYeFpfYMrmPTQ7nGG zi=z@O1p>EyDSyQASm<1j!5vUrBnG=iMFR2ZXACwFT+z&Zb(T z%P6P-@y6qJ(+wL?19q->!g82oCnt&~OEx@8myz*o=okhwDiP8ekhW*vL@1dV#6w;< zp0XndsXqCX?2Fb<3-M<(xldx%gRK`BLc{$O2}*&y>X_xQT0=0pY(j??Hf&hD6pEko zVBU}#VjZ|KMkck{isPo-lYc*L%w@<6r7(w3Ue{0;v#iNp`g`0v?`Qm778v5o$zziW zaj1HYA|vbVAQ~x(7z`;?TBs3hitv8Rm;D2(yPSJ=HD~ME z+6g|2aNp0V2jhoS;`~aus2u;huRV5euJ?O0rO&0yjkk?8g%U75N4Bkgk@UH(2xKRW zCtGekoOVNQ^&a`2_03VMbf*aqlrQogckL-L@~%j=9Bt$RZYg?IT1&L-o9R9q1r@bj z2quBZ7(0H6;sY!_G<`6ccl}QRs8Irq-VZ437Q6;6vo(fX<-9+5xABQkl3$m&60VycX1o$J6W{h858RAw?IwypAY2)hs1=ENs`N!A}v`a89IMGOojiT&nSC^FVIN12^HV0Y@MV zx2^rb%AlXd}~=o->|tyhs=gl0+&b4$lo<97zslKdr8cNVi8ct0y3A* zgKK?Q1hXwN3HeQd&`86f$+F+~aVDr7&=Qt+gOx|25#`zq&D?9iQ!*@U3UIZy^!S)Edw&28708``sb(aq#x9PAZep`b^I4lV8d<$bR5X(zA3 zgVp=>oBi-E99nbUu~0GtKk{5j=u^M^Cc2gCch30sq%PI_-SqeuCm`Q|zk>edL4%I!$R z_(ztvNcq`iwAAe}Nv74JJ4Bi-WoYWYz$?-eqvh^YmMVF*Vk87hhl_1znASe6Y^|-z zCXqn7E3+p-vU7)PP`c~DfN12e5OFNMdmzeKO_6G|Jj_!@;rUxm7s)WjIY{;{*zpo6 zsblORsL$|M@-zz+36MBify%V3X|8tMdDGG>9=9o(V_nVIh=JkijT*yq z$Mxn~N%z4cM93$|i9wvz86&c|eWTBK#afh%^*j*rVcJwICH+W}vqgyAt?jjl$I^uw zDr@JCT1ayzE#!t+?MgCP>UUi>+Qyt)CE3(#WA?(vlrrO52e|~PJ{y9~0UeO0T|y{o zd$GCDVg0V01MUQUp6`*!&2hx6k=T#Z_ z7i3n(Z|tm^$uQ4>)XXiZB~HTZ{BVpKyoyM~DYu7M2ovJ0iPF}^(L*!xd3%WJ0)(V1l2HNLl?6>lOwqV` z%lD98Ql;bF>_=@Equjxu!@3s6t`98_qOK9Nc4E3ep7ik1Z`$F~VAa!l;eKCkqo8FB znVNpxN)FM6A|!@{2_|htu^K|Y0)V@M2{r}(C?gM_Z9w+o}&u!xhAQ z=_f0G>8!m|YUA~>3>d-TP4EKAK@n4j(J)gvnwrSLo?m9X7SC`yo$YeD6ct|=&PDby zf1R<;#*C%LZRohq;}#|7=rt4FuDPGMvtap~i=8h&JH9MMa#Lj>KK5)aEPd`IU>SW> z$ArA9sTLk3+t1E;r3S`g?Oq3zCi8_Ziw3Xyo*|yQX z>_l>x{Q6+irq;7$UP%p43dQ7FkcJ@kL76u&I?G*j{nsCVB=8b&xl(E0%tj4^DZ0Lv zZp7*DsF0OfZ>T8Ek0{xioH9kS)3yA;MK@fKO6!l;It*ez%h6V*J{~5Zv`Bh^r0Us9 zWZz|(B-O=BQ(h&f=;n!kUx1Mrz}}XGXT5v;pdL>_2P!oiB-UclEBn0 z<;~+OWJliUVkx~ekFYO6*|FHFDj}#tUY_)GS-PRfuTOcylc?rM8-q3eA;7?qZE#Yn z|HRY=>1w4&T>oYPm!)ZnG2|y-?gbU&fm~f!@ATwqG5WY0h*8p)afLtLn%OwrKg;`^$P@dG4vKyydJSJjj2l4M~YhLRvU8JsF=>p&Lmfp zi#MSP!j%eqRICVUe!R#fG6_ReOJK|A<7^b7us$$l3}o(L+y&xLOQaw6YNZFJs&!4d zg2_ZhjBV?j+T<_^g!?qyjF;f)B|N)cFdHFJ*VzmM47T)NK*fta;n$o<+|F=b&S`%q z3sOT#H?XrdG~@b_KDw9{H&5t`5CD~Ol`;l87eAiqRh!(gM_tEf<#akoX*dkH5?eTa+iWNj{s$)>enHqizxOqkaxhJ}>MMk{iV20*Ou| z<`KH`_Fk&f$&_y!NrU2mJ(B;x*Qyw|UKcc>FhimNC z5JT?!00T*5Ectg*2P5-;!nXWpHjSd0m63zAk&C>Im7cY%!oMgrpGXZp2LmH(M}p6V zwzLckOpKoZn!nQcOZ0=00YJ+{|4ESf1b{diSt%0$7-;F4SQuD7qy39g0{}46GSGig zW?<>W9Q7>CK6#8LmPQ2h|2IK~pWnunK;s7s07%R97mDVSQbP}*1u)YC{za()&;mch znEytpVf+gM^1q=VEdR;ef2Y*^RV#m^)cgnA|9|Dxu(Ezy%Sg|pMZiSBz)HZ#LQlX1 zAkbiC{H#R)D;w))`2hd`EgKsn0~^7=qyPr`&v>7RAOaQ^04)OxBhz1&e#T{DqNV?& z|1fBM27E$r{##9p001P=U}k2b1%8rK00b=b^aTHJSO1g7e`)=t$@t%;{LJC+*R1~? zqD25?AOJG`S1|B1=YJ)_1Z4X(g`NTMzmoYYk-xtGGU)%2Xnj@!8vz6Gf0gdv@jd^G zO7nlh_b|~j{SDs}GimKl4?l3>7KYm@0FlS51VdO}mH<4B8o2+$%%GKrl7o!c_U1R9 zTqjEKX8H5?4~~-K!WGlWTvpa0NY0BoIm7`yd(=mS&povTZS(VWU_NSWe*E%lN)bWw zvTE@~hd7w_7>fKe?)gv@^o_IXaGuh3W$o#_)*O^Iu6|?6|BBPtXc*nG`>45|&I*Z> zf4M`Mu=1@9DYY{!Y8e!B2u6w+3L@8vv}s|@7v0X4l&)ec0Y3aWX;RGTWLM>+>KVCY zN41Z1CZUL595n|nRy1ZNpooZ_5HC_xEsRU$;k0oPkUBJcDYyb=K0BWT?@%K{XDB+m zX991G4N-heLGM}+d$Ucnou^Kol{pHUC}6dk5a*y*?JBi)SR-Mj%h7~)nxo$FeN!}b z_umJYzgptIv9JD5D4_q))Be9gf&S{;|9}Gh^_%~%{_kpUWDNUP!-S>(pAP|mg@uWQ zz?k5FWDK7P{q-TR{%;v0;InD{Lq^X)|7qOc^cVq*ET0^#zsZ=G0nGo@V`cy{|1%E& zkoiC5!Ti}l|CSy-BO3$o-({?yBi-NinCSnaB>heHIZS+xo&S_E0zbi4|Ih=neAe9G zWq{9d;~z36Cg3MC>+gC@%nbDZrpL_0{Leg?m{~uEp})udjLP=UGBbZpC;zN_W(Jo3 zP^WCH|Ey;K>*tK{k30aZEdOQ)0LVc9zwC9i*E6#;vWMm5q*E|+H~Oo&(8=4_I1(`Y nHCBGk3u4yBHUysq{ja9w;HYQs_+JeR00b~H!jh5-$q4^n*%@}v literal 0 HcmV?d00001 From 5f3cbe31e263cc227816f1884669ba90467d1680 Mon Sep 17 00:00:00 2001 From: aKjeller <44802724+aKjeller@users.noreply.github.com> Date: Mon, 18 Oct 2021 14:46:10 +0200 Subject: [PATCH 11/61] Create action --- .github/workflows/action | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 .github/workflows/action diff --git a/.github/workflows/action b/.github/workflows/action new file mode 100644 index 00000000..460acbb9 --- /dev/null +++ b/.github/workflows/action @@ -0,0 +1,26 @@ +name: Duplicate code + +on: issue_comment + +jobs: + duplicate-code-check: + name: Check for duplicate code + # Trigger the tool only when a comment containing the keyword is published in a pull request + if: github.event.issue.pull_request && contains(github.event.comment.body, 'run_duplicate_code_detection_tool') + runs-on: ubuntu-20.04 + steps: + - name: Check for duplicate code + uses: platisd/duplicate-code-detection-tool@master + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + directories: "project/src" + # Only examine .h and .cpp files + file_extensions: "gd" + # Only report similarities above 5% + ignore_below: 5 + # If a file is more than 70% similar to another, then the job fails + fail_above: 70 + # If a file is more than 15% similar to another, show a warning symbol in the report + warn_above: 15 + # Remove `src/` from the file paths when reporting similarities + project_root_dir: "project/src" From 82f7c03776bdb8374a21d74edbc5861e8c81aebf Mon Sep 17 00:00:00 2001 From: aKjeller <44802724+aKjeller@users.noreply.github.com> Date: Mon, 18 Oct 2021 14:46:34 +0200 Subject: [PATCH 12/61] Rename action to action.yml --- .github/workflows/{action => action.yml} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename .github/workflows/{action => action.yml} (100%) diff --git a/.github/workflows/action b/.github/workflows/action.yml similarity index 100% rename from .github/workflows/action rename to .github/workflows/action.yml From eeed730295ad24cc85aab96cf3be607675aca2b6 Mon Sep 17 00:00:00 2001 From: akjeller Date: Mon, 18 Oct 2021 14:53:03 +0200 Subject: [PATCH 13/61] auto run code duplication test on pull request --- .github/workflows/action.yml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.github/workflows/action.yml b/.github/workflows/action.yml index 460acbb9..fbd15a2a 100644 --- a/.github/workflows/action.yml +++ b/.github/workflows/action.yml @@ -1,12 +1,10 @@ name: Duplicate code -on: issue_comment +on: pull_request jobs: duplicate-code-check: name: Check for duplicate code - # Trigger the tool only when a comment containing the keyword is published in a pull request - if: github.event.issue.pull_request && contains(github.event.comment.body, 'run_duplicate_code_detection_tool') runs-on: ubuntu-20.04 steps: - name: Check for duplicate code From 6e4d11027bda756923f8ac034ea8369dd1d29a27 Mon Sep 17 00:00:00 2001 From: Anthony1911 Date: Mon, 18 Oct 2021 22:29:29 +0200 Subject: [PATCH 14/61] Fix editor closing bug Now the editor keeps the entered text even after being closed and reopened --- project/src/ui/code_editor/MainWindow.gd | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/project/src/ui/code_editor/MainWindow.gd b/project/src/ui/code_editor/MainWindow.gd index 764837d2..5a899943 100644 --- a/project/src/ui/code_editor/MainWindow.gd +++ b/project/src/ui/code_editor/MainWindow.gd @@ -29,8 +29,13 @@ func _init_TextEditor(): #textEditor.minimap_width = 150 +# Function that hides the editor when its closed with a dedicated button func _on_close() -> void: - queue_free() + set_visible(false) + +# Function that displays the hidden editor +func enableEditor() -> void: + set_visible(true) # Function to handle dropdown menu button options # Options to open and save file From 4fac493a77830dfac24269e9cf4ddaf98b80b3ca Mon Sep 17 00:00:00 2001 From: Anthony1911 Date: Mon, 18 Oct 2021 22:31:44 +0200 Subject: [PATCH 15/61] Update SmceHud.gd --- project/src/ui/hud/SmceHud.gd | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/project/src/ui/hud/SmceHud.gd b/project/src/ui/hud/SmceHud.gd index fbf68e9c..ec59fc99 100644 --- a/project/src/ui/hud/SmceHud.gd +++ b/project/src/ui/hud/SmceHud.gd @@ -38,6 +38,8 @@ onready var profile_screen_toggle = $ProfileScreentoggle var button_group: BButtonGroup = BButtonGroup.new() +var code_editor = code_main_window_t.instance() +var code_editor_initialized = 0 var buttons: Array = [] var paths: Dictionary = {} @@ -93,8 +95,11 @@ func _set_vis(visible, node = null) -> void: func _on_edit_btn() -> void: get_focus_owner().release_focus() - var code_editor = code_main_window_t.instance() - get_tree().root.add_child(code_editor) + if (code_editor_initialized==0): + get_tree().root.add_child(code_editor) + code_editor_initialized = 1 + + code_editor.enableEditor() func _on_sketch_btn() -> void: get_focus_owner().release_focus() From df0970ed4e8998ec8a24e096211407465dc5e023 Mon Sep 17 00:00:00 2001 From: Anthony1911 Date: Mon, 18 Oct 2021 23:28:23 +0200 Subject: [PATCH 16/61] Added Arduino syntax highlighting --- project/src/ui/code_editor/MainWindow.gd | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/project/src/ui/code_editor/MainWindow.gd b/project/src/ui/code_editor/MainWindow.gd index 5a899943..51e2726e 100644 --- a/project/src/ui/code_editor/MainWindow.gd +++ b/project/src/ui/code_editor/MainWindow.gd @@ -22,6 +22,27 @@ func _init_dropdown(): #Initializes the texteditor settings func _init_TextEditor(): + + #Arduino syntax highlighting + textEditor.add_color_region('//','',Color(0.638306, 0.65625, 0.65625)) # comments + textEditor.add_color_region('/*','*/',Color(0.834412, 0.847656, 0.847656)) # info boxes + textEditor.add_color_region('"','"',Color(0.085144, 0.605469, 0.56721)) # Strings + + #variables + var varTypes = ['PROGMEM','sizeof','HIGH','LOW','OUTPUT','uint8_t','private','public','class','static','const','float','int','String','uint16_t','boolean','bool','void','byte','unsigned','long','char','uint32_t','word','struct'] + for v in varTypes: + textEditor.add_keyword_color(v,Color(0.228943, 0.945313, 0.844573)) + + #operators/keywords + var operators = ['ifndef','endif ','define','ifdef','include','setup','loop','if','for','while','switch','else','case','break','and','or','final','return'] + for o in operators: + textEditor.add_keyword_color(o,Color(0.605167, 0.875, 0.071777)) + + #stream, serial, other operations + var other = ['interrupts','noInterrupts','CAN','setCursor','display','bit','read','peek','onReceive','onRequest','flush', 'requestFrom','endTransmission','beginTransmission','setClock', 'status','write','size_t','Stream','Serial','begin','end','stop','print','printf','println','delay','attach','readMsgBuf','sendMsgBuf'] + for t in other: + textEditor.add_keyword_color(t,Color(0.976563, 0.599444, 0.324249)) + textEditor.caret_blink = true textEditor.show_line_numbers = true #Minimap view From 44cd2384bd029e953721f4f49748dcfe8d4bef67 Mon Sep 17 00:00:00 2001 From: Anthony1911 Date: Fri, 22 Oct 2021 20:21:26 +0200 Subject: [PATCH 17/61] Added popup window scene + script A popup window that can display a custom message and serve either confirmation or notification functions --- project/src/ui/popup/popup_window.gd | 62 ++++++++++++++++++++++++ project/src/ui/popup/popup_window.tscn | 65 ++++++++++++++++++++++++++ 2 files changed, 127 insertions(+) create mode 100644 project/src/ui/popup/popup_window.gd create mode 100644 project/src/ui/popup/popup_window.tscn diff --git a/project/src/ui/popup/popup_window.gd b/project/src/ui/popup/popup_window.gd new file mode 100644 index 00000000..8c1c4316 --- /dev/null +++ b/project/src/ui/popup/popup_window.gd @@ -0,0 +1,62 @@ +extends Popup + +# Usage: +# Load this class: var popupWindow = preload("res://src/ui/popup/popup_window.tscn") +# Input following code where popup is needed: +# var popup = popupWindow.instance() +# get_tree().root.add_child(popup) +# Either popup.confirmation("your message") OR popup.info("your message") +# Following only for confirmation popup: +# yield(popup,"click") +# var h = popup.choiseRet() - "no" = false, "yes" = true +# + +onready var buttonOK = $buttonOK # for information popup +onready var buttonYes = $buttonYES # for confirmation popup +onready var buttonNo = $buttonNO # for confirmation popup +onready var msgLabel = $messageLabel # for both popup types +signal click # for confirmation popup + +var choice # for confirmation popup, default + + +# Called when the node enters the scene tree for the first time. +func _ready(): + buttonOK.text = "OK" + buttonOK.connect("pressed", self, "_buttonOK_pressed") + buttonYes.text = "Yes" + buttonYes.connect("pressed", self, "_buttonYes_pressed") + buttonNo.text = "No" + buttonNo.connect("pressed", self, "_buttonNo_pressed") + +# Call this to display informational popup with simple "OK" button +func info(message): + msgLabel.text = message + buttonYes.set_visible(false) + buttonNo.set_visible(false) + popup() + +# Call this to display a popup with "yes" and "no" buttons +func confirmation(message): + msgLabel.text = message + buttonOK.set_visible(false) + popup() + +func _buttonOK_pressed() -> void: + queue_free() + +func _buttonYes_pressed() -> void: + choice = true + emit_signal("click") + queue_free() + +func _buttonNo_pressed() -> void: + choice = false + emit_signal("click") + queue_free() + +# Returns user's choice (only for confirmation popup) +func choiseRet(): + return choice + + diff --git a/project/src/ui/popup/popup_window.tscn b/project/src/ui/popup/popup_window.tscn new file mode 100644 index 00000000..1cb8d545 --- /dev/null +++ b/project/src/ui/popup/popup_window.tscn @@ -0,0 +1,65 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://src/ui/popup/popup_window.gd" type="Script" id=1] + +[node name="Control" type="Popup"] +anchor_right = 1.0 +anchor_bottom = 1.0 +margin_left = 2.74902 +margin_top = 5.92249 +margin_right = 2.74902 +margin_bottom = 5.92249 +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Panel" type="Panel" parent="."] +margin_left = 320.0 +margin_top = 146.0 +margin_right = 800.0 +margin_bottom = 502.0 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="buttonOK" type="Button" parent="."] +margin_left = 508.0 +margin_top = 446.0 +margin_right = 612.0 +margin_bottom = 490.0 +text = "OK" + +[node name="buttonYES" type="Button" parent="."] +margin_left = 340.0 +margin_top = 444.0 +margin_right = 437.0 +margin_bottom = 492.0 +rect_pivot_offset = Vector2( 97, 48 ) +text = "Yes" +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="buttonNO" type="Button" parent="."] +margin_left = 682.0 +margin_top = 444.0 +margin_right = 779.0 +margin_bottom = 492.0 +text = "No" +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="messageLabel" type="RichTextLabel" parent="."] +anchor_right = 0.5 +anchor_bottom = 0.056 +margin_left = 338.0 +margin_top = 254.0 +margin_right = 138.0 +margin_bottom = 299.68 +text = "\"default\"" +scroll_active = false +__meta__ = { +"_edit_use_anchors_": false +} From cb66fcdb2600ddea20ce07bef5d43a0cde72576a Mon Sep 17 00:00:00 2001 From: Anthony1911 Date: Sun, 31 Oct 2021 20:10:28 +0100 Subject: [PATCH 18/61] Enabled bracket matching --- CMakeLists.txt | 1 + include/gd/BraceEnabler.hxx | 35 +++++++++++++ project/project.godot | 5 ++ project/src/bind/BraceEnabler.gdns | 9 ++++ project/src/ui/code_editor/MainWindow.gd | 2 + src/gd/BraceEnabler.cxx | 67 ++++++++++++++++++++++++ src/lib.cxx | 3 +- 7 files changed, 121 insertions(+), 1 deletion(-) create mode 100644 include/gd/BraceEnabler.hxx create mode 100644 project/src/bind/BraceEnabler.gdns create mode 100644 src/gd/BraceEnabler.cxx diff --git a/CMakeLists.txt b/CMakeLists.txt index 29ce500f..7dd8a065 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -62,6 +62,7 @@ target_sources (godot-smce PRIVATE src/bind/BoardView.cxx src/bind/UartSlurper.cxx src/bind/BoardConfig.cxx + src/gd/BraceEnabler.cxx src/bind/FrameBuffer.cxx) target_include_directories (godot-smce PUBLIC include) diff --git a/include/gd/BraceEnabler.hxx b/include/gd/BraceEnabler.hxx new file mode 100644 index 00000000..a6c076f3 --- /dev/null +++ b/include/gd/BraceEnabler.hxx @@ -0,0 +1,35 @@ +/* + * BraceEnabler.hxx + * Copyright 2021 ItJustWorksTM + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GODOT_SMCE_BRACEENABLER_HPP +#define GODOT_SMCE_BRACEENABLER_HPP + +#include + +namespace godot { +class BraceEnabler : public Node { + GODOT_CLASS(BraceEnabler, Node); + + public: + static void _register_methods(); + void _init(); + void _notification(int what); +}; +} // namespace godot + +#endif // GODOT_SMCE_BRACEENABLER_HPP diff --git a/project/project.godot b/project/project.godot index dbca456d..703c62a1 100644 --- a/project/project.godot +++ b/project/project.godot @@ -39,6 +39,11 @@ _global_script_classes=[ { "language": "NativeScript", "path": "res://src/bind/BoardView.gdns" }, { +"base": "Reference", +"class": "BraceEnabler", +"language": "NativeScript", +"path": "res://src/bind/BraceEnabler.gdns" +}, { "base": "Node", "class": "BrushedMotor", "language": "GDScript", diff --git a/project/src/bind/BraceEnabler.gdns b/project/src/bind/BraceEnabler.gdns new file mode 100644 index 00000000..c562973f --- /dev/null +++ b/project/src/bind/BraceEnabler.gdns @@ -0,0 +1,9 @@ +[gd_resource type="NativeScript" load_steps=2 format=2] + +[ext_resource path="res://gdnative/smce.gdnlib" type="GDNativeLibrary" id=1] + +[resource] +resource_name = "BraceEnabler" +class_name = "BraceEnabler" +library = ExtResource( 1 ) +script_class_name = "BraceEnabler" diff --git a/project/src/ui/code_editor/MainWindow.gd b/project/src/ui/code_editor/MainWindow.gd index 51e2726e..33b4a134 100644 --- a/project/src/ui/code_editor/MainWindow.gd +++ b/project/src/ui/code_editor/MainWindow.gd @@ -45,6 +45,8 @@ func _init_TextEditor(): textEditor.caret_blink = true textEditor.show_line_numbers = true + textEditor.add_child(BraceEnabler.new()) + #Minimap view #textEditor.minimap_draw = true #textEditor.minimap_width = 150 diff --git a/src/gd/BraceEnabler.cxx b/src/gd/BraceEnabler.cxx new file mode 100644 index 00000000..056aebd7 --- /dev/null +++ b/src/gd/BraceEnabler.cxx @@ -0,0 +1,67 @@ +/* + * BraceEnabler.cxx + * Copyright 2021 ItJustWorksTM + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include +#include +#include +#include + +#include "gd/BraceEnabler.hxx" + +namespace godot { + +void BraceEnabler::_register_methods() { register_method("_notification", &BraceEnabler::_notification); } + +void BraceEnabler::_init() {} + +void BraceEnabler::_notification(int what) { + if (what != Node::NOTIFICATION_PARENTED) + return; + + auto* parent = get_parent(); + if (!parent || !parent->is_class("TextEdit")) + return; + + static std::ptrdiff_t offset = [=] { + const auto getter = + godot::api->godot_method_bind_get_method("TextEdit", "is_highlight_current_line_enabled"); + const auto setter = + godot::api->godot_method_bind_get_method("TextEdit", "set_highlight_current_line"); + const auto get = [=]() { return ___godot_icall_bool(getter, parent); }; + const auto set = [=](bool enabled) { ___godot_icall_void_bool(setter, parent, enabled); }; + + const auto prev = get(); + + auto* const base = reinterpret_cast(parent->_owner); + auto* ptr = base; + for (;; ++ptr) { + set(false); + while (*ptr) + ++ptr; + set(true); + if (*ptr == static_cast(true)) { + set(prev); + return ptr - base - 1; + } + } + }(); + + *(reinterpret_cast(parent->_owner) + offset) = true; +} + +} // namespace godot diff --git a/src/lib.cxx b/src/lib.cxx index a930b1d0..50f9c777 100644 --- a/src/lib.cxx +++ b/src/lib.cxx @@ -24,6 +24,7 @@ #include "bind/UartSlurper.hxx" #include "gd/AnyTask.hxx" #include "gd/GDResult.hxx" +#include "gd/BraceEnabler.hxx" using namespace godot; @@ -40,5 +41,5 @@ extern "C" void GDN_EXPORT godot_nativescript_init(void* handle) { register_classes(); + BoardConfig::FrameBufferConfig, BoardConfig::SecureDigitalStorage, BraceEnabler>(); } From 938700e96abb779ee2a03476d98bd4789521f4e6 Mon Sep 17 00:00:00 2001 From: Mahan Date: Sun, 31 Oct 2021 23:38:56 +0100 Subject: [PATCH 19/61] Tab-System V1.0 This commit features the following: * + button to open a file * Creates new tabs for every file that is currently being edited * Displays the file type and extension on the tab title * Allows simple manipulation such as closing a tab Some Improvements for next Milestone - Remember marker place when switching tabs - Warn user when closing an unsaved tab - Display an icon next to unsaved tabs --- project/src/ui/code_editor/MainWindow.gd | 23 +++-- project/src/ui/code_editor/MainWindow.tscn | 31 +++++- project/src/ui/code_editor/Tabs.gd | 104 +++++++++++++++++++++ 3 files changed, 145 insertions(+), 13 deletions(-) create mode 100644 project/src/ui/code_editor/Tabs.gd diff --git a/project/src/ui/code_editor/MainWindow.gd b/project/src/ui/code_editor/MainWindow.gd index 51e2726e..e12c4d17 100644 --- a/project/src/ui/code_editor/MainWindow.gd +++ b/project/src/ui/code_editor/MainWindow.gd @@ -1,10 +1,16 @@ extends Control + onready var close_btn: Button = $Close onready var dropdown_btn: MenuButton = $DropDown onready var fileDialog: FileDialog = $FileDialog onready var textEditor: TextEdit = $TextEditor -onready var _path: String = "" + + +var lastTab = 0 +var currentFileInfo = null +var fileInfos = {} + onready var fileLoader = load("res://src/ui/file_dialog/FileLoader.gd").new() # Called when the node enters the scene tree for the first time. @@ -22,6 +28,9 @@ func _init_dropdown(): #Initializes the texteditor settings func _init_TextEditor(): + textEditor.text = "Please open a file to edit" + #Enable syntax highlightning + textEditor.syntax_highlighting = true #Arduino syntax highlighting textEditor.add_color_region('//','',Color(0.638306, 0.65625, 0.65625)) # comments @@ -71,18 +80,14 @@ func _on_item_pressed(id): # Function to collect the path of a selected file and send it to the editor func _on_FileDialog_file_selected(path): - #Save global path for quick save - _path = path #Load text from file var content = fileLoader.loadFile(path) - #Paste text into texteditor - textEditor.text = (content) - + + #Tab management + get_node("Tabs")._create_new_tab_with_content(content,path) # Function save a file func _save_file(): #save text into texteditor - fileLoader.saveFile(_path,textEditor.text) + fileLoader.saveFile(currentFileInfo._path,textEditor.text) - - diff --git a/project/src/ui/code_editor/MainWindow.tscn b/project/src/ui/code_editor/MainWindow.tscn index 544f1277..815fce26 100644 --- a/project/src/ui/code_editor/MainWindow.tscn +++ b/project/src/ui/code_editor/MainWindow.tscn @@ -1,6 +1,7 @@ -[gd_scene load_steps=2 format=2] +[gd_scene load_steps=3 format=2] [ext_resource path="res://src/ui/code_editor/MainWindow.gd" type="Script" id=1] +[ext_resource path="res://src/ui/code_editor/Tabs.gd" type="Script" id=2] [node name="Control" type="Control"] anchor_right = 1.0 @@ -13,6 +14,10 @@ __meta__ = { [node name="Background" type="ColorRect" parent="."] anchor_right = 1.0 anchor_bottom = 1.0 +margin_left = 1.05948 +margin_top = -1.05946 +margin_right = 1.05945 +margin_bottom = -1.05945 color = Color( 0.12549, 0.12549, 0.12549, 1 ) __meta__ = { "_edit_use_anchors_": false @@ -58,15 +63,33 @@ __meta__ = { "_edit_use_anchors_": false } +[node name="Tabs" type="Tabs" parent="."] +anchor_right = 1.0 +anchor_bottom = 1.0 +margin_left = 6.0 +margin_top = 38.0 +margin_right = -6.0 +margin_bottom = -648.0 +tab_align = 0 +tab_close_display_policy = 1 +scrolling_enabled = false +script = ExtResource( 2 ) +__meta__ = { +"_edit_use_anchors_": false +} + [node name="TextEditor" type="TextEdit" parent="."] anchor_right = 1.0 anchor_bottom = 1.0 -margin_left = 5.0 -margin_top = 35.0 +margin_left = 6.0 +margin_top = 77.0 margin_right = -5.0 -margin_bottom = -5.0 +margin_bottom = -7.0 __meta__ = { "_edit_use_anchors_": false } [connection signal="file_selected" from="FileDialog" to="." method="_on_FileDialog_file_selected"] +[connection signal="tab_changed" from="Tabs" to="Tabs" method="_on_Tabs_tab_changed"] +[connection signal="tab_clicked" from="Tabs" to="Tabs" method="_on_Tabs_tab_clicked"] +[connection signal="tab_close" from="Tabs" to="Tabs" method="_on_Tabs_tab_close"] diff --git a/project/src/ui/code_editor/Tabs.gd b/project/src/ui/code_editor/Tabs.gd new file mode 100644 index 00000000..bc05c0d6 --- /dev/null +++ b/project/src/ui/code_editor/Tabs.gd @@ -0,0 +1,104 @@ +extends Tabs + +onready var mainControl: Node = get_tree().get_root().get_node("Control") + +class fileinfo: + var _index: int + var _name: String + var _path: String + var _content: String + +onready var tabs: Tabs = self +#Function that Initializes the tabssystem + +func _ready(): + tabs.add_tab("+") + tabs.tab_close_display_policy =Tabs.CLOSE_BUTTON_SHOW_NEVER + +#Create a new tab when openning a new file +func _create_new_tab_with_content(content,path): + #Save the content of the current file in memory + _save_tab_content() + #Get the name of the file + var name = path.substr(path.get_base_dir().length()+1,path.length()) + tabs.remove_tab(tabs.get_tab_count()-1); #Remove the + tab + tabs.add_tab(name) #Add the actuall tab + tabs.add_tab("+") #Add the + tab + var newFile = fileinfo.new() #Create an instance of fielinfo + newFile._index = tabs.get_tab_count()-2 + newFile._name = name + newFile._content = content + newFile._path = path + mainControl.fileInfos[newFile._index] = newFile #Store the info in memory + tabs.current_tab = newFile._index #Switch to the correct tab + _show_new_file(newFile) #Display the file content + +#Displays a new file of the type fileInfo +func _show_new_file(file): + if(file == null): + mainControl.textEditor.text = "Please open a file to edit" + mainControl.currentFileInfo = null + return + mainControl.textEditor.text = file._content + mainControl.currentFileInfo = file + +#Save the content of the file in memory (An array of fileInfo class objects) +func _save_tab_content(): + if(mainControl.currentFileInfo != null): + mainControl.currentFileInfo._content = mainControl.textEditor.text + mainControl.fileInfos[mainControl.currentFileInfo._index] = mainControl.currentFileInfo + + +#Signal when a tab is visually switched +func _on_Tabs_tab_changed(tab): + #Do not display the x on the + button + if(tabs.get_tab_title(tabs.current_tab) == "+"): + tabs.tab_close_display_policy = Tabs.CLOSE_BUTTON_SHOW_NEVER + #Display X only on active button if the active button is an actual tab + else: + tabs.tab_close_display_policy = Tabs.CLOSE_BUTTON_SHOW_ACTIVE_ONLY + + +#Signal from clicking on a tab +func _on_Tabs_tab_clicked(tab): + #Open file menu if pressed + + if(tabs.get_tab_title(tabs.current_tab) == "+"): + mainControl.fileDialog.popup() + + return + #Otherwise if clicked on another tab switch tabs and content: + + #Get the info about the selected tab + _save_tab_content() + #First save the current file in memory (NOT ACTUAL SAVE AS FILE) + var fileInfo = mainControl.fileInfos[tabs.current_tab] + #Display the content for the selected tab + _show_new_file(fileInfo) + +#Signal from pressing X on a tab +func _on_Tabs_tab_close(tab): + #If pressing X on another tab switch to that tab + if(tab != tabs.current_tab): + tabs.current_tab = tab + _on_Tabs_tab_clicked(tab) + return + + #The following changes the index for all tabs and shifts them by one + var removedIndex = tab + mainControl.fileInfos[removedIndex] = null + tabs.remove_tab(removedIndex) + var newIndex = 0 + for i in range(0, tabs.get_tab_count()): + if(removedIndex != i): + if(removedIndex < i): + var fi = mainControl.fileInfos[i] + fi._index = newIndex + mainControl.fileInfos[newIndex] = fi + newIndex = newIndex +1 + + #Update the view + _show_new_file(mainControl.fileInfos[tabs.current_tab]) + + #If only the + tab is left do not allow the user to remove it + if(tabs.get_tab_count() == 1): + tabs.tab_close_display_policy = Tabs.CLOSE_BUTTON_SHOW_NEVER From 3605ca4285d579a7b57f01943b10a0c94aec93b9 Mon Sep 17 00:00:00 2001 From: Mahan Date: Mon, 1 Nov 2021 12:18:19 +0100 Subject: [PATCH 20/61] TabSystem + newProject Added functionality for new project and new file to the tab system New File: Can create a new file such as .gd .h .ino New Arduino project: Creates a folder and forces the extension of the file to .ino --- project/NewArduinoTemplate.txt | 11 ++++ project/src/ui/code_editor/MainWindow.gd | 66 ++++++++++++++++++++---- 2 files changed, 68 insertions(+), 9 deletions(-) create mode 100644 project/NewArduinoTemplate.txt diff --git a/project/NewArduinoTemplate.txt b/project/NewArduinoTemplate.txt new file mode 100644 index 00000000..f1d41a4f --- /dev/null +++ b/project/NewArduinoTemplate.txt @@ -0,0 +1,11 @@ +//New file created by GD Code Editor + +void setup() { + // put your setup code here, to run once: + +} + +void loop() { + // put your main code here, to run repeatedly: + +} \ No newline at end of file diff --git a/project/src/ui/code_editor/MainWindow.gd b/project/src/ui/code_editor/MainWindow.gd index e12c4d17..0fefd948 100644 --- a/project/src/ui/code_editor/MainWindow.gd +++ b/project/src/ui/code_editor/MainWindow.gd @@ -6,10 +6,14 @@ onready var dropdown_btn: MenuButton = $DropDown onready var fileDialog: FileDialog = $FileDialog onready var textEditor: TextEdit = $TextEditor - -var lastTab = 0 var currentFileInfo = null -var fileInfos = {} +var fileInfos = {} #Keeps track of all fileInfo objects + +#SAVES CURRENT STATE OF filedialog operation +#Can have the following values: +# OPEN NEWFILE SAVE NEWPROJ +onready var fileDialogOperation: String = "" + onready var fileLoader = load("res://src/ui/file_dialog/FileLoader.gd").new() @@ -24,6 +28,8 @@ func _init_dropdown(): dropdown_btn.get_popup().connect("id_pressed",self, "_on_item_pressed") dropdown_btn.get_popup().add_item("Open File") dropdown_btn.get_popup().add_item("Save File") + dropdown_btn.get_popup().add_item("New File") + dropdown_btn.get_popup().add_item("New Arduino-Project") dropdown_btn.get_popup().add_item("Close") #Initializes the texteditor settings @@ -72,19 +78,61 @@ func enableEditor() -> void: func _on_item_pressed(id): var name = dropdown_btn.get_popup().get_item_text(id) if name == "Open File": - fileDialog.popup() # Opens file dialog for file selection + _open_file() elif name == "Save File": _save_file() + elif name == "New File": + _new_file() + elif name == "New Arduino-Project": + _new_proj() elif name == "Close": _on_close() - + +func _open_file(): + fileDialogOperation = "OPEN" + fileDialog.mode = fileDialog.MODE_OPEN_FILE #Change mode back to open file + fileDialog.popup() # Opens file dialog for file selection +#Function to create a new file +func _new_file(): + fileDialogOperation = "NEWFILE" + fileDialog.mode = fileDialog.MODE_SAVE_FILE #Change mode to open dir + fileDialog.add_filter("*.ino; ino file") + fileDialog.popup() #Get path for new file + fileDialog.clear_filters() + +#Function to create a new file +func _new_proj(): + fileDialogOperation = "NEWPROJ" + fileDialog.mode = fileDialog.MODE_SAVE_FILE #Change mode to open dir + fileDialog.add_filter("*.ino; ino file") + fileDialog.popup() #Get path for new file + fileDialog.clear_filters() + + # Function to collect the path of a selected file and send it to the editor func _on_FileDialog_file_selected(path): - #Load text from file - var content = fileLoader.loadFile(path) + + if(fileDialogOperation == "OPEN"): + print(path) + fileDialogOperation = "" + #Load text from file + var content = fileLoader.loadFile(path) + #Tab management + get_node("Tabs")._create_new_tab_with_content(content,path) + + elif(fileDialogOperation == "NEWFILE" ): + get_node("Tabs")._create_new_tab_with_content("",path) + _save_file() + + elif(fileDialogOperation == "NEWPROJ"): + var template = fileLoader.loadFile("res://NewArduinoTemplate.txt") + var finalPath = path+"/"+path.get_file()+".ino" + Directory.new().make_dir_recursive (path) + get_node("Tabs")._create_new_tab_with_content(template,finalPath) + _save_file() + + - #Tab management - get_node("Tabs")._create_new_tab_with_content(content,path) # Function save a file func _save_file(): From e9eace2fb9107193180660b6f888163fc366a579 Mon Sep 17 00:00:00 2001 From: akjeller Date: Tue, 2 Nov 2021 15:55:18 +0100 Subject: [PATCH 21/61] Editor links with sketches in the hud --- project/src/ui/code_editor/MainWindow.gd | 26 ++++++++++++------- project/src/ui/code_editor/Tabs.gd | 3 ++- project/src/ui/sketch_control/ControlPane.gd | 14 +++++++++- .../src/ui/sketch_control/ControlPane.tscn | 13 ++++++++++ 4 files changed, 44 insertions(+), 12 deletions(-) diff --git a/project/src/ui/code_editor/MainWindow.gd b/project/src/ui/code_editor/MainWindow.gd index 70ac3b08..9d6ccc25 100644 --- a/project/src/ui/code_editor/MainWindow.gd +++ b/project/src/ui/code_editor/MainWindow.gd @@ -6,6 +6,7 @@ onready var dropdown_btn: MenuButton = $DropDown onready var fileDialog: FileDialog = $FileDialog onready var textEditor: TextEdit = $TextEditor +var src_file = null var currentFileInfo = null var fileInfos = {} #Keeps track of all fileInfo objects @@ -14,8 +15,6 @@ var fileInfos = {} #Keeps track of all fileInfo objects # OPEN NEWFILE SAVE NEWPROJ onready var fileDialogOperation: String = "" - - onready var fileLoader = load("res://src/ui/file_dialog/FileLoader.gd").new() # Called when the node enters the scene tree for the first time. func _ready(): @@ -34,7 +33,12 @@ func _init_dropdown(): #Initializes the texteditor settings func _init_TextEditor(): - textEditor.text = "Please open a file to edit" + #Standard text + if(src_file == null): + textEditor.text = "Please open a file to edit" + else: + _load_content(src_file) + #Enable syntax highlightning textEditor.syntax_highlighting = true @@ -73,6 +77,7 @@ func _on_close() -> void: # Function that displays the hidden editor func enableEditor() -> void: + print(src_file) set_visible(true) # Function to handle dropdown menu button options @@ -113,14 +118,12 @@ func _new_proj(): # Function to collect the path of a selected file and send it to the editor func _on_FileDialog_file_selected(path): - + if(src_file == null): + src_file = path + if(fileDialogOperation == "OPEN"): - print(path) fileDialogOperation = "" - #Load text from file - var content = fileLoader.loadFile(path) - #Tab management - get_node("Tabs")._create_new_tab_with_content(content,path) + _load_content(path) elif(fileDialogOperation == "NEWFILE" ): get_node("Tabs")._create_new_tab_with_content("",path) @@ -134,7 +137,10 @@ func _on_FileDialog_file_selected(path): _save_file() - +func _load_content(path): + var content = fileLoader.loadFile(path) + #Tab management + get_node("Tabs")._create_new_tab_with_content(content,path) # Function save a file func _save_file(): diff --git a/project/src/ui/code_editor/Tabs.gd b/project/src/ui/code_editor/Tabs.gd index bc05c0d6..1e5b11ab 100644 --- a/project/src/ui/code_editor/Tabs.gd +++ b/project/src/ui/code_editor/Tabs.gd @@ -1,6 +1,7 @@ extends Tabs -onready var mainControl: Node = get_tree().get_root().get_node("Control") +#onready var mainControl: Node = get_tree().get_root().get_node("Control") +onready var mainControl: Node = get_parent_control() class fileinfo: var _index: int diff --git a/project/src/ui/sketch_control/ControlPane.gd b/project/src/ui/sketch_control/ControlPane.gd index 7fe2f5c1..4e91a35e 100644 --- a/project/src/ui/sketch_control/ControlPane.gd +++ b/project/src/ui/sketch_control/ControlPane.gd @@ -19,6 +19,7 @@ extends VBoxContainer var notification_t = preload("res://src/ui/simple_notification/SimpleNotification.tscn") var collapsable_t = preload("res://src/ui/collapsable/collapsable.tscn") +var code_main_window_t = preload("res://src/ui/code_editor/MainWindow.tscn") signal notification_created signal grab_focus @@ -26,7 +27,7 @@ signal grab_focus var _toolchain: Toolchain = null var _board = null - +onready var edit_sketch_btn = $SketchSlot/VBoxContainer2/HBoxContainer/HBoxContainer/EditButton onready var compile_btn: Button = $SketchSlot/VBoxContainer2/HBoxContainer/HBoxContainer/Compile onready var compile_log_btn: Button = $SketchSlot/VBoxContainer2/HBoxContainer/HBoxContainer/CompileLog onready var sketch_status: Label = $SketchSlot/VBoxContainer2/VBoxContainer/SketchStatus @@ -55,6 +56,8 @@ var cam_ctl: CamCtl = null setget set_cam_ctl var vehicle = null +var code_editor = null + func init(sketch: Sketch, toolchain: Toolchain): sketch_path = sketch.get_source() @@ -110,6 +113,7 @@ func _ready(): _board.connect("log", self, "_on_board_log") + edit_sketch_btn.connect("pressed", self, "_on_edit_btn") compile_btn.connect("pressed", self, "_on_compile") compile_log_btn.connect("pressed", self, "_show_compile_log") @@ -133,6 +137,14 @@ func _ready(): if _board.get_sketch().is_compiled(): _built() +func _on_edit_btn() -> void: + get_focus_owner().release_focus() + if (code_editor == null): + code_editor = code_main_window_t.instance() + code_editor.src_file = sketch_path + get_tree().root.add_child(code_editor) + + code_editor.enableEditor() func _on_board_cleaned() -> void: sketch_status.text = " Not Compiled" if ! _toolchain.is_building() else " Compiling..." diff --git a/project/src/ui/sketch_control/ControlPane.tscn b/project/src/ui/sketch_control/ControlPane.tscn index ad4c7475..e567210c 100644 --- a/project/src/ui/sketch_control/ControlPane.tscn +++ b/project/src/ui/sketch_control/ControlPane.tscn @@ -145,10 +145,23 @@ margin_right = 1272.0 margin_bottom = 32.0 alignment = 2 +[node name="EditButton" type="Button" parent="SketchSlot/VBoxContainer2/HBoxContainer/HBoxContainer"] +margin_left = 1120.0 +margin_right = 1154.0 +margin_bottom = 32.0 +rect_pivot_offset = Vector2( -338.875, 73 ) +mouse_default_cursor_shape = 2 +theme = ExtResource( 4 ) +text = " Edit " +__meta__ = { +"_edit_use_anchors_": false +} + [node name="Compile" type="Button" parent="SketchSlot/VBoxContainer2/HBoxContainer/HBoxContainer"] margin_left = 1158.0 margin_right = 1229.0 margin_bottom = 32.0 +rect_pivot_offset = Vector2( -338.875, 73 ) mouse_default_cursor_shape = 2 theme = ExtResource( 4 ) text = " Compile " From 4747fab0966dfdcdc97868ed6a1515c8d7db518d Mon Sep 17 00:00:00 2001 From: akjeller Date: Tue, 2 Nov 2021 19:05:36 +0100 Subject: [PATCH 22/61] file window added --- project/src/ui/code_editor/FileTree.gd | 42 ++++++++++++ project/src/ui/code_editor/MainWindow.gd | 38 +++++++---- project/src/ui/code_editor/MainWindow.tscn | 74 ++++++++++++++++------ project/src/ui/code_editor/Tabs.gd | 3 +- 4 files changed, 125 insertions(+), 32 deletions(-) create mode 100644 project/src/ui/code_editor/FileTree.gd diff --git a/project/src/ui/code_editor/FileTree.gd b/project/src/ui/code_editor/FileTree.gd new file mode 100644 index 00000000..a1ded78a --- /dev/null +++ b/project/src/ui/code_editor/FileTree.gd @@ -0,0 +1,42 @@ +extends Tree + + + +onready var file_tree: Tree = self + +# Called when the node enters the scene tree for the first time. +func _ready(): + pass # Replace with function body. + +func _fill_tree(path): + var name = path.substr(path.get_base_dir().length()+1,path.length()) + var root = file_tree.create_item() + root.set_text(0, name) + add_files_to_tree(path, root) + +func add_files_to_tree(path, parent): + var dir = Directory.new() + dir.open(path) + dir.list_dir_begin(true, false) + var file_name = dir.get_next() + while file_name != "": + var child = file_tree.create_item(parent) + child.set_text(0, file_name) + if dir.current_is_dir(): + add_files_to_tree(dir.get_current_dir() + "/" + file_name, child) + else: + child.set_metadata(0, dir.get_current_dir() + "/" + file_name) + file_name = dir.get_next() + + +# Called every frame. 'delta' is the elapsed time since the previous frame. +#func _process(delta): +# pass + + + + +func _on_FileTree_item_activated(): + var path = file_tree.get_selected().get_metadata(0) + if path != null: + get_parent().get_parent()._load_content(path) diff --git a/project/src/ui/code_editor/MainWindow.gd b/project/src/ui/code_editor/MainWindow.gd index 9d6ccc25..d3966c1d 100644 --- a/project/src/ui/code_editor/MainWindow.gd +++ b/project/src/ui/code_editor/MainWindow.gd @@ -4,12 +4,15 @@ extends Control onready var close_btn: Button = $Close onready var dropdown_btn: MenuButton = $DropDown onready var fileDialog: FileDialog = $FileDialog -onready var textEditor: TextEdit = $TextEditor +onready var textEditor: TextEdit = $HBoxContainer/VBoxContainer/TextEditor +onready var tabs: Tabs = $HBoxContainer/VBoxContainer/Tabs +onready var file_tree: Tree = $HBoxContainer/FileTree +onready var collapse_btn: Button = $HBoxContainer/CollapseBtn var src_file = null var currentFileInfo = null var fileInfos = {} #Keeps track of all fileInfo objects - +var tree_filled = false #SAVES CURRENT STATE OF filedialog operation #Can have the following values: # OPEN NEWFILE SAVE NEWPROJ @@ -77,7 +80,6 @@ func _on_close() -> void: # Function that displays the hidden editor func enableEditor() -> void: - print(src_file) set_visible(true) # Function to handle dropdown menu button options @@ -126,24 +128,38 @@ func _on_FileDialog_file_selected(path): _load_content(path) elif(fileDialogOperation == "NEWFILE" ): - get_node("Tabs")._create_new_tab_with_content("",path) + tabs._create_new_tab_with_content("",path) _save_file() elif(fileDialogOperation == "NEWPROJ"): var template = fileLoader.loadFile("res://NewArduinoTemplate.txt") var finalPath = path+"/"+path.get_file()+".ino" Directory.new().make_dir_recursive (path) - get_node("Tabs")._create_new_tab_with_content(template,finalPath) + tabs._create_new_tab_with_content(template,finalPath) _save_file() - - + +# load file and create new tab and fill tree if it is not filled func _load_content(path): var content = fileLoader.loadFile(path) #Tab management - get_node("Tabs")._create_new_tab_with_content(content,path) + tabs._create_new_tab_with_content(content,path) + _fill_tree() + +# Update the file tree with file structure +func _fill_tree(): + if(!tree_filled): + file_tree._fill_tree(src_file.get_base_dir()) + tree_filled = true # Function save a file func _save_file(): - #save text into texteditor - fileLoader.saveFile(currentFileInfo._path,textEditor.text) - + if currentFileInfo != null: + fileLoader.saveFile(currentFileInfo._path,textEditor.text) + +func _on_Collapse_btn_pressed(): + if(file_tree.is_visible_in_tree()): + file_tree.visible = false + collapse_btn.text = ">" + else: + file_tree.visible = true + collapse_btn.text = "<" diff --git a/project/src/ui/code_editor/MainWindow.tscn b/project/src/ui/code_editor/MainWindow.tscn index 815fce26..4ebb20f1 100644 --- a/project/src/ui/code_editor/MainWindow.tscn +++ b/project/src/ui/code_editor/MainWindow.tscn @@ -1,7 +1,8 @@ -[gd_scene load_steps=3 format=2] +[gd_scene load_steps=4 format=2] [ext_resource path="res://src/ui/code_editor/MainWindow.gd" type="Script" id=1] [ext_resource path="res://src/ui/code_editor/Tabs.gd" type="Script" id=2] +[ext_resource path="res://src/ui/code_editor/FileTree.gd" type="Script" id=3] [node name="Control" type="Control"] anchor_right = 1.0 @@ -37,9 +38,9 @@ __meta__ = { [node name="DropDown" type="MenuButton" parent="."] margin_left = 5.0 -margin_top = 5.0 +margin_top = 3.81079 margin_right = 100.0 -margin_bottom = 31.0 +margin_bottom = 29.8108 text = "File" flat = false __meta__ = { @@ -57,19 +58,51 @@ window_title = "Open a File" resizable = true mode = 0 access = 2 -current_dir = "/SCHOOL/MPSOF-1/Year2/LP1/SoftEv/GITKRAKEN/group-10-smce-gd/project" -current_path = "/SCHOOL/MPSOF-1/Year2/LP1/SoftEv/GITKRAKEN/group-10-smce-gd/project/" +current_dir = "/Users/Kjeller/Documents/dev/SMCE/group-10-smce-gd/project" +current_path = "/Users/Kjeller/Documents/dev/SMCE/group-10-smce-gd/project/" __meta__ = { "_edit_use_anchors_": false } -[node name="Tabs" type="Tabs" parent="."] +[node name="HBoxContainer" type="HBoxContainer" parent="."] anchor_right = 1.0 anchor_bottom = 1.0 -margin_left = 6.0 -margin_top = 38.0 -margin_right = -6.0 -margin_bottom = -648.0 +margin_left = 5.0 +margin_top = 35.0 +margin_right = -5.0 +margin_bottom = -5.0 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="FileTree" type="Tree" parent="HBoxContainer"] +margin_right = 248.0 +margin_bottom = 680.0 +size_flags_horizontal = 3 +script = ExtResource( 3 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="CollapseBtn" type="Button" parent="HBoxContainer"] +margin_left = 252.0 +margin_right = 272.0 +margin_bottom = 680.0 +text = "<" +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="VBoxContainer" type="VBoxContainer" parent="HBoxContainer"] +margin_left = 276.0 +margin_right = 1270.0 +margin_bottom = 680.0 +size_flags_horizontal = 3 +size_flags_stretch_ratio = 4.0 + +[node name="Tabs" type="Tabs" parent="HBoxContainer/VBoxContainer"] +margin_right = 994.0 +margin_bottom = 30.0 tab_align = 0 tab_close_display_policy = 1 scrolling_enabled = false @@ -78,18 +111,19 @@ __meta__ = { "_edit_use_anchors_": false } -[node name="TextEditor" type="TextEdit" parent="."] -anchor_right = 1.0 -anchor_bottom = 1.0 -margin_left = 6.0 -margin_top = 77.0 -margin_right = -5.0 -margin_bottom = -7.0 +[node name="TextEditor" type="TextEdit" parent="HBoxContainer/VBoxContainer"] +margin_top = 34.0 +margin_right = 994.0 +margin_bottom = 680.0 +size_flags_vertical = 3 +size_flags_stretch_ratio = 3.0 __meta__ = { "_edit_use_anchors_": false } [connection signal="file_selected" from="FileDialog" to="." method="_on_FileDialog_file_selected"] -[connection signal="tab_changed" from="Tabs" to="Tabs" method="_on_Tabs_tab_changed"] -[connection signal="tab_clicked" from="Tabs" to="Tabs" method="_on_Tabs_tab_clicked"] -[connection signal="tab_close" from="Tabs" to="Tabs" method="_on_Tabs_tab_close"] +[connection signal="item_activated" from="HBoxContainer/FileTree" to="HBoxContainer/FileTree" method="_on_FileTree_item_activated"] +[connection signal="pressed" from="HBoxContainer/CollapseBtn" to="." method="_on_Collapse_btn_pressed"] +[connection signal="tab_changed" from="HBoxContainer/VBoxContainer/Tabs" to="HBoxContainer/VBoxContainer/Tabs" method="_on_Tabs_tab_changed"] +[connection signal="tab_clicked" from="HBoxContainer/VBoxContainer/Tabs" to="HBoxContainer/VBoxContainer/Tabs" method="_on_Tabs_tab_clicked"] +[connection signal="tab_close" from="HBoxContainer/VBoxContainer/Tabs" to="HBoxContainer/VBoxContainer/Tabs" method="_on_Tabs_tab_close"] diff --git a/project/src/ui/code_editor/Tabs.gd b/project/src/ui/code_editor/Tabs.gd index 1e5b11ab..67c90deb 100644 --- a/project/src/ui/code_editor/Tabs.gd +++ b/project/src/ui/code_editor/Tabs.gd @@ -1,7 +1,7 @@ extends Tabs #onready var mainControl: Node = get_tree().get_root().get_node("Control") -onready var mainControl: Node = get_parent_control() +onready var mainControl: Node = get_parent().get_parent().get_parent() class fileinfo: var _index: int @@ -64,6 +64,7 @@ func _on_Tabs_tab_changed(tab): func _on_Tabs_tab_clicked(tab): #Open file menu if pressed + if(tabs.get_tab_title(tabs.current_tab) == "+"): + mainControl.fileDialogOperation = "OPEN" mainControl.fileDialog.popup() return From 3347bb67b4f49cd4a3f3fb33439dcfd0e110b205 Mon Sep 17 00:00:00 2001 From: Anthony1911 Date: Wed, 10 Nov 2021 20:54:06 +0100 Subject: [PATCH 23/61] Window is smaller now + resizeable --- project/src/ui/popup/popup_window.gd | 43 +++++++++++++--- project/src/ui/popup/popup_window.tscn | 69 +++++++++++++++----------- 2 files changed, 75 insertions(+), 37 deletions(-) diff --git a/project/src/ui/popup/popup_window.gd b/project/src/ui/popup/popup_window.gd index 8c1c4316..265e170c 100644 --- a/project/src/ui/popup/popup_window.gd +++ b/project/src/ui/popup/popup_window.gd @@ -15,6 +15,7 @@ onready var buttonOK = $buttonOK # for information popup onready var buttonYes = $buttonYES # for confirmation popup onready var buttonNo = $buttonNO # for confirmation popup onready var msgLabel = $messageLabel # for both popup types +onready var panel = $Panel signal click # for confirmation popup var choice # for confirmation popup, default @@ -31,16 +32,44 @@ func _ready(): # Call this to display informational popup with simple "OK" button func info(message): - msgLabel.text = message - buttonYes.set_visible(false) - buttonNo.set_visible(false) - popup() + var i = 1 + if (message.length()>112): + i = (message.length()/28)-4 + panel.margin_right = 793 + i*30 + panel.margin_left = 511 - i *30 + msgLabel.margin_right = 782 + i*30 + msgLabel.margin_left = 522 - i * 30 + msgLabel.text = message + buttonYes.set_visible(false) + buttonNo.set_visible(false) + popup() + else: + msgLabel.text = message + buttonYes.set_visible(false) + buttonNo.set_visible(false) + popup() # Call this to display a popup with "yes" and "no" buttons func confirmation(message): - msgLabel.text = message - buttonOK.set_visible(false) - popup() + var i = 1 + if (message.length()>112): + i = (message.length()/28)-4 + panel.margin_right = 793 + i*30 + panel.margin_left = 511 - i *30 + msgLabel.margin_right = 782 + i*30 + msgLabel.margin_left = 522 - i * 30 + buttonYes.margin_right = 588 - i * 30 + buttonYes.margin_left = 491 - i * 30 + buttonNo.margin_left = 713 + i*30 + buttonNo.margin_right = 810 + i*30 + msgLabel.text = message + buttonOK.set_visible(false) + popup() + else: + msgLabel.text = message + buttonOK.set_visible(false) + popup() + func _buttonOK_pressed() -> void: queue_free() diff --git a/project/src/ui/popup/popup_window.tscn b/project/src/ui/popup/popup_window.tscn index 1cb8d545..faa3c91b 100644 --- a/project/src/ui/popup/popup_window.tscn +++ b/project/src/ui/popup/popup_window.tscn @@ -1,40 +1,45 @@ -[gd_scene load_steps=2 format=2] +[gd_scene load_steps=3 format=2] [ext_resource path="res://src/ui/popup/popup_window.gd" type="Script" id=1] +[ext_resource path="res://media/fonts/Open_Sans/OpenSasn-Regular-Popup.tres" type="DynamicFont" id=2] [node name="Control" type="Popup"] +visible = true anchor_right = 1.0 anchor_bottom = 1.0 -margin_left = 2.74902 -margin_top = 5.92249 -margin_right = 2.74902 -margin_bottom = 5.92249 +margin_left = -0.963871 +margin_bottom = 4.0 script = ExtResource( 1 ) __meta__ = { "_edit_use_anchors_": false } [node name="Panel" type="Panel" parent="."] -margin_left = 320.0 -margin_top = 146.0 -margin_right = 800.0 -margin_bottom = 502.0 +margin_left = 511.0 +margin_top = 311.0 +margin_right = 793.0 +margin_bottom = 480.0 __meta__ = { "_edit_use_anchors_": false } [node name="buttonOK" type="Button" parent="."] -margin_left = 508.0 -margin_top = 446.0 -margin_right = 612.0 -margin_bottom = 490.0 +margin_left = 616.205 +margin_top = 440.496 +margin_right = 720.205 +margin_bottom = 484.496 +rect_scale = Vector2( 0.7, 0.7 ) text = "OK" +__meta__ = { +"_edit_use_anchors_": false +} [node name="buttonYES" type="Button" parent="."] -margin_left = 340.0 -margin_top = 444.0 -margin_right = 437.0 -margin_bottom = 492.0 +margin_left = 491.932 +margin_top = 423.36 +margin_right = 588.932 +margin_bottom = 471.36 +rect_scale = Vector2( 0.7, 0.7 ) rect_pivot_offset = Vector2( 97, 48 ) text = "Yes" __meta__ = { @@ -42,24 +47,28 @@ __meta__ = { } [node name="buttonNO" type="Button" parent="."] -margin_left = 682.0 -margin_top = 444.0 -margin_right = 779.0 -margin_bottom = 492.0 +margin_left = 713.684 +margin_top = 438.496 +margin_right = 810.684 +margin_bottom = 486.496 +rect_scale = Vector2( 0.7, 0.7 ) text = "No" __meta__ = { "_edit_use_anchors_": false } -[node name="messageLabel" type="RichTextLabel" parent="."] -anchor_right = 0.5 -anchor_bottom = 0.056 -margin_left = 338.0 -margin_top = 254.0 -margin_right = 138.0 -margin_bottom = 299.68 -text = "\"default\"" -scroll_active = false +[node name="messageLabel" type="Label" parent="."] +margin_left = 522.0 +margin_top = 311.0 +margin_right = 782.0 +margin_bottom = 434.0 +custom_fonts/font = ExtResource( 2 ) +text = "\"default\" +" +align = 1 +valign = 1 +autowrap = true +clip_text = true __meta__ = { "_edit_use_anchors_": false } From 817fb4c57db0fc8f6a6e99557fa860def99f5005 Mon Sep 17 00:00:00 2001 From: Anthony1911 Date: Fri, 12 Nov 2021 23:17:18 +0100 Subject: [PATCH 24/61] Added fonts for popup --- .../fonts/Open_Sans/OpenSans-Regular-Popup.ttf | Bin 0 -> 96932 bytes .../fonts/Open_Sans/OpenSasn-Regular-Popup.tres | 8 ++++++++ 2 files changed, 8 insertions(+) create mode 100644 project/media/fonts/Open_Sans/OpenSans-Regular-Popup.ttf create mode 100644 project/media/fonts/Open_Sans/OpenSasn-Regular-Popup.tres diff --git a/project/media/fonts/Open_Sans/OpenSans-Regular-Popup.ttf b/project/media/fonts/Open_Sans/OpenSans-Regular-Popup.ttf new file mode 100644 index 0000000000000000000000000000000000000000..29bfd35a2bfdd92b6e8b4ec2970f4d1eebf49357 GIT binary patch literal 96932 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

_T_kl)Xoan=RX{3lY#VQTZ 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 literal 0 HcmV?d00001 diff --git a/project/media/fonts/Open_Sans/OpenSasn-Regular-Popup.tres b/project/media/fonts/Open_Sans/OpenSasn-Regular-Popup.tres new file mode 100644 index 00000000..0e925a00 --- /dev/null +++ b/project/media/fonts/Open_Sans/OpenSasn-Regular-Popup.tres @@ -0,0 +1,8 @@ +[gd_resource type="DynamicFont" load_steps=2 format=2] + +[ext_resource path="res://media/fonts/Open_Sans/OpenSans-Regular.ttf" type="DynamicFontData" id=1] + +[resource] +use_mipmaps = true +use_filter = true +font_data = ExtResource( 1 ) From d04b09d6b607851dd9aff8f794a8506fd4d7a842 Mon Sep 17 00:00:00 2001 From: Anthony1911 Date: Fri, 12 Nov 2021 23:27:00 +0100 Subject: [PATCH 25/61] Refactoring Replacing duplicate code with dedicated method --- project/src/ui/popup/popup_window.gd | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/project/src/ui/popup/popup_window.gd b/project/src/ui/popup/popup_window.gd index 265e170c..501e1182 100644 --- a/project/src/ui/popup/popup_window.gd +++ b/project/src/ui/popup/popup_window.gd @@ -29,16 +29,20 @@ func _ready(): buttonYes.connect("pressed", self, "_buttonYes_pressed") buttonNo.text = "No" buttonNo.connect("pressed", self, "_buttonNo_pressed") - + +# Function to widen the window to support larger text +func widenWindow(var i): + panel.margin_right = 793 + i * 30 + panel.margin_left = 511 - i * 30 + msgLabel.margin_right = 782 + i * 30 + msgLabel.margin_left = 522 - i * 30 + # Call this to display informational popup with simple "OK" button func info(message): var i = 1 if (message.length()>112): i = (message.length()/28)-4 - panel.margin_right = 793 + i*30 - panel.margin_left = 511 - i *30 - msgLabel.margin_right = 782 + i*30 - msgLabel.margin_left = 522 - i * 30 + widenWindow(i) msgLabel.text = message buttonYes.set_visible(false) buttonNo.set_visible(false) @@ -54,14 +58,11 @@ func confirmation(message): var i = 1 if (message.length()>112): i = (message.length()/28)-4 - panel.margin_right = 793 + i*30 - panel.margin_left = 511 - i *30 - msgLabel.margin_right = 782 + i*30 - msgLabel.margin_left = 522 - i * 30 + widenWindow(i) buttonYes.margin_right = 588 - i * 30 buttonYes.margin_left = 491 - i * 30 - buttonNo.margin_left = 713 + i*30 - buttonNo.margin_right = 810 + i*30 + buttonNo.margin_left = 713 + i * 30 + buttonNo.margin_right = 810 + i * 30 msgLabel.text = message buttonOK.set_visible(false) popup() From 796daef05428ccf8239a50a9c2cd3165aa64653d Mon Sep 17 00:00:00 2001 From: Anthony1911 Date: Sun, 14 Nov 2021 18:19:41 +0100 Subject: [PATCH 26/61] Adding line limit functionality --- project/src/ui/code_editor/MainWindow.gd | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/project/src/ui/code_editor/MainWindow.gd b/project/src/ui/code_editor/MainWindow.gd index d3966c1d..794fbbbe 100644 --- a/project/src/ui/code_editor/MainWindow.gd +++ b/project/src/ui/code_editor/MainWindow.gd @@ -8,6 +8,7 @@ onready var textEditor: TextEdit = $HBoxContainer/VBoxContainer/TextEditor onready var tabs: Tabs = $HBoxContainer/VBoxContainer/Tabs onready var file_tree: Tree = $HBoxContainer/FileTree onready var collapse_btn: Button = $HBoxContainer/CollapseBtn +onready var lineLimit: LineEdit = $LineLimitField var src_file = null var currentFileInfo = null @@ -81,6 +82,17 @@ func _on_close() -> void: # Function that displays the hidden editor func enableEditor() -> void: set_visible(true) + +# Limit line length +func _input(event): + if event is InputEventKey and event.pressed: + var line = textEditor.cursor_get_line() + var s = textEditor.get_line(line) + if (event.as_text() == "Tab" && lineLimit.text != "" && s.length()>=(int(lineLimit.text)-1) && int(lineLimit.text) >= 10): + textEditor.get_tree().set_input_as_handled() + if event.get_unicode() != 0: # allow editing + if (lineLimit.text != "" && s.length()>=int(lineLimit.text) && int(lineLimit.text) >= 10): + textEditor.get_tree().set_input_as_handled() # ignore key press after limit # Function to handle dropdown menu button options # Options to open and save file From 0ae7fc743c37e5aa3b56b3a2d8184a44d22d12ff Mon Sep 17 00:00:00 2001 From: Anthony1911 Date: Sun, 14 Nov 2021 18:21:06 +0100 Subject: [PATCH 27/61] Adding line limit functionality --- project/src/ui/code_editor/MainWindow.tscn | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/project/src/ui/code_editor/MainWindow.tscn b/project/src/ui/code_editor/MainWindow.tscn index 4ebb20f1..d029ff27 100644 --- a/project/src/ui/code_editor/MainWindow.tscn +++ b/project/src/ui/code_editor/MainWindow.tscn @@ -121,6 +121,27 @@ __meta__ = { "_edit_use_anchors_": false } +[node name="LabelLineLimit" type="Label" parent="."] +margin_left = 1088.47 +margin_top = 50.4142 +margin_right = 1205.47 +margin_bottom = 70.4142 +text = "Line length limit:" +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="LineLimitField" type="LineEdit" parent="."] +margin_left = 1214.59 +margin_top = 46.669 +margin_right = 1272.59 +margin_bottom = 76.669 +hint_tooltip = "Values below 10 will be ignored" +text = "80" +__meta__ = { +"_edit_use_anchors_": false +} + [connection signal="file_selected" from="FileDialog" to="." method="_on_FileDialog_file_selected"] [connection signal="item_activated" from="HBoxContainer/FileTree" to="HBoxContainer/FileTree" method="_on_FileTree_item_activated"] [connection signal="pressed" from="HBoxContainer/CollapseBtn" to="." method="_on_Collapse_btn_pressed"] From 0c434c68fa51f197afc3e51ac4e67846cbb333fa Mon Sep 17 00:00:00 2001 From: Mahan Date: Mon, 15 Nov 2021 12:19:16 +0100 Subject: [PATCH 28/61] Tabs v1.1 *Remember marker place when switching tabs *Warn user when closing an unsaved tab *Display an icon next to unsaved tabs --- README.md | 10 +++++ project/project.godot | 3 +- project/src/ui/code_editor/MainWindow.gd | 2 + project/src/ui/code_editor/MainWindow.tscn | 5 ++- project/src/ui/code_editor/Tabs.gd | 47 +++++++++++++++++++++- project/src/ui/popup/popup_window.gd | 4 +- project/src/ui/popup/popup_window.tscn | 1 - 7 files changed, 65 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index ebc821b6..8dd64409 100644 --- a/README.md +++ b/README.md @@ -24,6 +24,16 @@ cmake -B build cmake --build build --target godot-smce ``` +### Building with new LIB_SMCE +Get latest libSMCE Release +Change environment variable to the correct version +copy SMCE.dll from release to project +```shell +cmake --build build --config release +``` + + + Packaging is done using _CPack_. _note: we bundle the shared lib of SMCE on export_ diff --git a/project/project.godot b/project/project.godot index 703c62a1..bc51036b 100644 --- a/project/project.godot +++ b/project/project.godot @@ -39,7 +39,7 @@ _global_script_classes=[ { "language": "NativeScript", "path": "res://src/bind/BoardView.gdns" }, { -"base": "Reference", +"base": "", "class": "BraceEnabler", "language": "NativeScript", "path": "res://src/bind/BraceEnabler.gdns" @@ -181,6 +181,7 @@ _global_script_class_icons={ "Board": "", "BoardConfig": "", "BoardView": "", +"BraceEnabler": "", "BrushedMotor": "", "CamCtl": "", "ControlUtil": "", diff --git a/project/src/ui/code_editor/MainWindow.gd b/project/src/ui/code_editor/MainWindow.gd index d3966c1d..cc04e5a9 100644 --- a/project/src/ui/code_editor/MainWindow.gd +++ b/project/src/ui/code_editor/MainWindow.gd @@ -155,6 +155,8 @@ func _fill_tree(): func _save_file(): if currentFileInfo != null: fileLoader.saveFile(currentFileInfo._path,textEditor.text) + currentFileInfo._savedContent = currentFileInfo._content + tabs._update_saved_status() func _on_Collapse_btn_pressed(): if(file_tree.is_visible_in_tree()): diff --git a/project/src/ui/code_editor/MainWindow.tscn b/project/src/ui/code_editor/MainWindow.tscn index 4ebb20f1..4fbf109a 100644 --- a/project/src/ui/code_editor/MainWindow.tscn +++ b/project/src/ui/code_editor/MainWindow.tscn @@ -58,8 +58,8 @@ window_title = "Open a File" resizable = true mode = 0 access = 2 -current_dir = "/Users/Kjeller/Documents/dev/SMCE/group-10-smce-gd/project" -current_path = "/Users/Kjeller/Documents/dev/SMCE/group-10-smce-gd/project/" +current_dir = "/SCHOOL/MPSOF-1/Year2/LP1/SoftEv/GITKRAKEN/group-10-smce-gd/project" +current_path = "/SCHOOL/MPSOF-1/Year2/LP1/SoftEv/GITKRAKEN/group-10-smce-gd/project/" __meta__ = { "_edit_use_anchors_": false } @@ -127,3 +127,4 @@ __meta__ = { [connection signal="tab_changed" from="HBoxContainer/VBoxContainer/Tabs" to="HBoxContainer/VBoxContainer/Tabs" method="_on_Tabs_tab_changed"] [connection signal="tab_clicked" from="HBoxContainer/VBoxContainer/Tabs" to="HBoxContainer/VBoxContainer/Tabs" method="_on_Tabs_tab_clicked"] [connection signal="tab_close" from="HBoxContainer/VBoxContainer/Tabs" to="HBoxContainer/VBoxContainer/Tabs" method="_on_Tabs_tab_close"] +[connection signal="text_changed" from="HBoxContainer/VBoxContainer/TextEditor" to="HBoxContainer/VBoxContainer/Tabs" method="_on_TextEditor_text_changed"] diff --git a/project/src/ui/code_editor/Tabs.gd b/project/src/ui/code_editor/Tabs.gd index 67c90deb..de6eaf6e 100644 --- a/project/src/ui/code_editor/Tabs.gd +++ b/project/src/ui/code_editor/Tabs.gd @@ -1,6 +1,7 @@ extends Tabs #onready var mainControl: Node = get_tree().get_root().get_node("Control") +onready var popupWindow = preload("res://src/ui/popup/popup_window.tscn") onready var mainControl: Node = get_parent().get_parent().get_parent() class fileinfo: @@ -8,7 +9,10 @@ class fileinfo: var _name: String var _path: String var _content: String - + var _savedContent: String + var _cursorColumn: int + var _cursorLine: int + onready var tabs: Tabs = self #Function that Initializes the tabssystem @@ -29,7 +33,10 @@ func _create_new_tab_with_content(content,path): newFile._index = tabs.get_tab_count()-2 newFile._name = name newFile._content = content + newFile._savedContent = content newFile._path = path + newFile._cursorLine = 0 + newFile._cursorColumn = 0 mainControl.fileInfos[newFile._index] = newFile #Store the info in memory tabs.current_tab = newFile._index #Switch to the correct tab _show_new_file(newFile) #Display the file content @@ -41,12 +48,16 @@ func _show_new_file(file): mainControl.currentFileInfo = null return mainControl.textEditor.text = file._content + mainControl.textEditor.cursor_set_line(file._cursorLine) + mainControl.textEditor.cursor_set_column(file._cursorColumn) mainControl.currentFileInfo = file #Save the content of the file in memory (An array of fileInfo class objects) func _save_tab_content(): if(mainControl.currentFileInfo != null): mainControl.currentFileInfo._content = mainControl.textEditor.text + mainControl.currentFileInfo._cursorColumn = mainControl.textEditor.cursor_get_column() + mainControl.currentFileInfo._cursorLine = mainControl.textEditor.cursor_get_line() mainControl.fileInfos[mainControl.currentFileInfo._index] = mainControl.currentFileInfo @@ -77,6 +88,7 @@ func _on_Tabs_tab_clicked(tab): #Display the content for the selected tab _show_new_file(fileInfo) + #Signal from pressing X on a tab func _on_Tabs_tab_close(tab): #If pressing X on another tab switch to that tab @@ -85,6 +97,17 @@ func _on_Tabs_tab_close(tab): _on_Tabs_tab_clicked(tab) return + var saved = _is_saved() + if(!saved): + var popup = popupWindow.instance() + get_tree().root.add_child(popup) + popup.confirmation("The tab you are trying to close is not saved!\nDo you wish to proceed?") + yield(popup,"click") + var choice = popup.choiseRet() + if(!choice): + return + + #The following changes the index for all tabs and shifts them by one var removedIndex = tab mainControl.fileInfos[removedIndex] = null @@ -104,3 +127,25 @@ func _on_Tabs_tab_close(tab): #If only the + tab is left do not allow the user to remove it if(tabs.get_tab_count() == 1): tabs.tab_close_display_policy = Tabs.CLOSE_BUTTON_SHOW_NEVER + +func _is_saved(): + var fileInfo = mainControl.fileInfos[tabs.current_tab] + if(fileInfo._savedContent == fileInfo._content): + #print("EQUAL") + return true; + else: + #print("NOT EQUAL") + return false; + + + +func _on_TextEditor_text_changed(): + _update_saved_status() + +func _update_saved_status(): + _save_tab_content() + var fileInfo = mainControl.fileInfos[tabs.current_tab] + if(_is_saved()): + tabs.set_tab_title(current_tab,fileInfo._name) + else: + tabs.set_tab_title(current_tab,fileInfo._name+"*") diff --git a/project/src/ui/popup/popup_window.gd b/project/src/ui/popup/popup_window.gd index 501e1182..4c7c9d6b 100644 --- a/project/src/ui/popup/popup_window.gd +++ b/project/src/ui/popup/popup_window.gd @@ -77,12 +77,12 @@ func _buttonOK_pressed() -> void: func _buttonYes_pressed() -> void: choice = true - emit_signal("click") + emit_signal("click",choice) queue_free() func _buttonNo_pressed() -> void: choice = false - emit_signal("click") + emit_signal("click",choice) queue_free() # Returns user's choice (only for confirmation popup) diff --git a/project/src/ui/popup/popup_window.tscn b/project/src/ui/popup/popup_window.tscn index faa3c91b..9df120f1 100644 --- a/project/src/ui/popup/popup_window.tscn +++ b/project/src/ui/popup/popup_window.tscn @@ -4,7 +4,6 @@ [ext_resource path="res://media/fonts/Open_Sans/OpenSasn-Regular-Popup.tres" type="DynamicFont" id=2] [node name="Control" type="Popup"] -visible = true anchor_right = 1.0 anchor_bottom = 1.0 margin_left = -0.963871 From 47ae4559ebfd3f47d3403d50de4442d3be49c90b Mon Sep 17 00:00:00 2001 From: Mahan Date: Mon, 15 Nov 2021 12:21:20 +0100 Subject: [PATCH 29/61] Small error fix staged the wrong edit in tscn file --- project/src/ui/popup/popup_window.tscn | 1 + 1 file changed, 1 insertion(+) diff --git a/project/src/ui/popup/popup_window.tscn b/project/src/ui/popup/popup_window.tscn index 9df120f1..faa3c91b 100644 --- a/project/src/ui/popup/popup_window.tscn +++ b/project/src/ui/popup/popup_window.tscn @@ -4,6 +4,7 @@ [ext_resource path="res://media/fonts/Open_Sans/OpenSasn-Regular-Popup.tres" type="DynamicFont" id=2] [node name="Control" type="Popup"] +visible = true anchor_right = 1.0 anchor_bottom = 1.0 margin_left = -0.963871 From 904e8670ed4ae590b53dd81818cd5cccf0da3b43 Mon Sep 17 00:00:00 2001 From: akjeller Date: Mon, 15 Nov 2021 16:28:10 +0100 Subject: [PATCH 30/61] Refactor out excessive use of get_parent() --- project/src/ui/code_editor/FileTree.gd | 13 ++----------- project/src/ui/code_editor/Tabs.gd | 8 +++----- project/src/ui/sketch_control/ControlPane.gd | 4 ++-- 3 files changed, 7 insertions(+), 18 deletions(-) diff --git a/project/src/ui/code_editor/FileTree.gd b/project/src/ui/code_editor/FileTree.gd index a1ded78a..13a4f1b9 100644 --- a/project/src/ui/code_editor/FileTree.gd +++ b/project/src/ui/code_editor/FileTree.gd @@ -1,7 +1,6 @@ extends Tree - - +onready var mainControl: Node = get_owner() onready var file_tree: Tree = self # Called when the node enters the scene tree for the first time. @@ -28,15 +27,7 @@ func add_files_to_tree(path, parent): child.set_metadata(0, dir.get_current_dir() + "/" + file_name) file_name = dir.get_next() - -# Called every frame. 'delta' is the elapsed time since the previous frame. -#func _process(delta): -# pass - - - - func _on_FileTree_item_activated(): var path = file_tree.get_selected().get_metadata(0) if path != null: - get_parent().get_parent()._load_content(path) + mainControl._load_content(path) diff --git a/project/src/ui/code_editor/Tabs.gd b/project/src/ui/code_editor/Tabs.gd index 67c90deb..bad9b800 100644 --- a/project/src/ui/code_editor/Tabs.gd +++ b/project/src/ui/code_editor/Tabs.gd @@ -1,7 +1,7 @@ extends Tabs -#onready var mainControl: Node = get_tree().get_root().get_node("Control") -onready var mainControl: Node = get_parent().get_parent().get_parent() +onready var mainControl: Node = get_owner() +onready var tabs: Tabs = self class fileinfo: var _index: int @@ -9,13 +9,11 @@ class fileinfo: var _path: String var _content: String -onready var tabs: Tabs = self #Function that Initializes the tabssystem - func _ready(): tabs.add_tab("+") tabs.tab_close_display_policy =Tabs.CLOSE_BUTTON_SHOW_NEVER - + #Create a new tab when openning a new file func _create_new_tab_with_content(content,path): #Save the content of the current file in memory diff --git a/project/src/ui/sketch_control/ControlPane.gd b/project/src/ui/sketch_control/ControlPane.gd index 4e91a35e..d8c31995 100644 --- a/project/src/ui/sketch_control/ControlPane.gd +++ b/project/src/ui/sketch_control/ControlPane.gd @@ -143,8 +143,8 @@ func _on_edit_btn() -> void: code_editor = code_main_window_t.instance() code_editor.src_file = sketch_path get_tree().root.add_child(code_editor) - - code_editor.enableEditor() + else: + code_editor.enableEditor() func _on_board_cleaned() -> void: sketch_status.text = " Not Compiled" if ! _toolchain.is_building() else " Compiling..." From ae77d45d3e20c39767bb42e8ebc0b2d1fcb847ad Mon Sep 17 00:00:00 2001 From: akjeller Date: Mon, 15 Nov 2021 16:46:33 +0100 Subject: [PATCH 31/61] Moved texteditor code to new file --- project/src/ui/code_editor/MainWindow.gd | 43 +--------------------- project/src/ui/code_editor/MainWindow.tscn | 4 +- project/src/ui/code_editor/TextEditor.gd | 41 +++++++++++++++++++++ 3 files changed, 45 insertions(+), 43 deletions(-) create mode 100644 project/src/ui/code_editor/TextEditor.gd diff --git a/project/src/ui/code_editor/MainWindow.gd b/project/src/ui/code_editor/MainWindow.gd index d3966c1d..e3540e45 100644 --- a/project/src/ui/code_editor/MainWindow.gd +++ b/project/src/ui/code_editor/MainWindow.gd @@ -23,7 +23,7 @@ onready var fileLoader = load("res://src/ui/file_dialog/FileLoader.gd").new() func _ready(): close_btn.connect("pressed", self, "_on_close") _init_dropdown() - _init_TextEditor() + textEditor._init_content() # Initializes the dropdown menu button func _init_dropdown(): @@ -34,46 +34,6 @@ func _init_dropdown(): dropdown_btn.get_popup().add_item("New Arduino-Project") dropdown_btn.get_popup().add_item("Close") -#Initializes the texteditor settings -func _init_TextEditor(): - #Standard text - if(src_file == null): - textEditor.text = "Please open a file to edit" - else: - _load_content(src_file) - - #Enable syntax highlightning - textEditor.syntax_highlighting = true - - #Arduino syntax highlighting - textEditor.add_color_region('//','',Color(0.638306, 0.65625, 0.65625)) # comments - textEditor.add_color_region('/*','*/',Color(0.834412, 0.847656, 0.847656)) # info boxes - textEditor.add_color_region('"','"',Color(0.085144, 0.605469, 0.56721)) # Strings - - #variables - var varTypes = ['PROGMEM','sizeof','HIGH','LOW','OUTPUT','uint8_t','private','public','class','static','const','float','int','String','uint16_t','boolean','bool','void','byte','unsigned','long','char','uint32_t','word','struct'] - for v in varTypes: - textEditor.add_keyword_color(v,Color(0.228943, 0.945313, 0.844573)) - - #operators/keywords - var operators = ['ifndef','endif ','define','ifdef','include','setup','loop','if','for','while','switch','else','case','break','and','or','final','return'] - for o in operators: - textEditor.add_keyword_color(o,Color(0.605167, 0.875, 0.071777)) - - #stream, serial, other operations - var other = ['interrupts','noInterrupts','CAN','setCursor','display','bit','read','peek','onReceive','onRequest','flush', 'requestFrom','endTransmission','beginTransmission','setClock', 'status','write','size_t','Stream','Serial','begin','end','stop','print','printf','println','delay','attach','readMsgBuf','sendMsgBuf'] - for t in other: - textEditor.add_keyword_color(t,Color(0.976563, 0.599444, 0.324249)) - - textEditor.caret_blink = true - textEditor.show_line_numbers = true - textEditor.add_child(BraceEnabler.new()) - - #Minimap view - #textEditor.minimap_draw = true - #textEditor.minimap_width = 150 - - # Function that hides the editor when its closed with a dedicated button func _on_close() -> void: set_visible(false) @@ -117,7 +77,6 @@ func _new_proj(): fileDialog.popup() #Get path for new file fileDialog.clear_filters() - # Function to collect the path of a selected file and send it to the editor func _on_FileDialog_file_selected(path): if(src_file == null): diff --git a/project/src/ui/code_editor/MainWindow.tscn b/project/src/ui/code_editor/MainWindow.tscn index 4ebb20f1..38148e9d 100644 --- a/project/src/ui/code_editor/MainWindow.tscn +++ b/project/src/ui/code_editor/MainWindow.tscn @@ -1,8 +1,9 @@ -[gd_scene load_steps=4 format=2] +[gd_scene load_steps=5 format=2] [ext_resource path="res://src/ui/code_editor/MainWindow.gd" type="Script" id=1] [ext_resource path="res://src/ui/code_editor/Tabs.gd" type="Script" id=2] [ext_resource path="res://src/ui/code_editor/FileTree.gd" type="Script" id=3] +[ext_resource path="res://src/ui/code_editor/TextEditor.gd" type="Script" id=4] [node name="Control" type="Control"] anchor_right = 1.0 @@ -117,6 +118,7 @@ margin_right = 994.0 margin_bottom = 680.0 size_flags_vertical = 3 size_flags_stretch_ratio = 3.0 +script = ExtResource( 4 ) __meta__ = { "_edit_use_anchors_": false } diff --git a/project/src/ui/code_editor/TextEditor.gd b/project/src/ui/code_editor/TextEditor.gd new file mode 100644 index 00000000..c00589fb --- /dev/null +++ b/project/src/ui/code_editor/TextEditor.gd @@ -0,0 +1,41 @@ +extends TextEdit + +onready var mainControl: Node = get_owner() +onready var textEditor: TextEdit = self + +# Called when the node enters the scene tree for the first time. +func _ready(): + #Enable syntax highlightning + textEditor.syntax_highlighting = true + + #Arduino syntax highlighting + textEditor.add_color_region('//','',Color(0.638306, 0.65625, 0.65625)) # comments + textEditor.add_color_region('/*','*/',Color(0.834412, 0.847656, 0.847656)) # info boxes + textEditor.add_color_region('"','"',Color(0.085144, 0.605469, 0.56721)) # Strings + + #variables + var varTypes = ['PROGMEM','sizeof','HIGH','LOW','OUTPUT','uint8_t','private','public','class','static','const','float','int','String','uint16_t','boolean','bool','void','byte','unsigned','long','char','uint32_t','word','struct'] + for v in varTypes: + textEditor.add_keyword_color(v,Color(0.228943, 0.945313, 0.844573)) + + #operators/keywords + var operators = ['ifndef','endif ','define','ifdef','include','setup','loop','if','for','while','switch','else','case','break','and','or','final','return'] + for o in operators: + textEditor.add_keyword_color(o,Color(0.605167, 0.875, 0.071777)) + + #stream, serial, other operations + var other = ['interrupts','noInterrupts','CAN','setCursor','display','bit','read','peek','onReceive','onRequest','flush', 'requestFrom','endTransmission','beginTransmission','setClock', 'status','write','size_t','Stream','Serial','begin','end','stop','print','printf','println','delay','attach','readMsgBuf','sendMsgBuf'] + for t in other: + textEditor.add_keyword_color(t,Color(0.976563, 0.599444, 0.324249)) + + textEditor.caret_blink = true + textEditor.show_line_numbers = true + textEditor.add_child(BraceEnabler.new()) + +func _init_content(): + #Standard text + if(mainControl.src_file == null): + textEditor.text = "Please open a file to edit" + else: + mainControl._load_content(mainControl.src_file) + From 9f363e23262cc17225b71b298ba040229803280d Mon Sep 17 00:00:00 2001 From: akjeller Date: Tue, 16 Nov 2021 17:12:23 +0100 Subject: [PATCH 32/61] Added icons in file_tree --- project/src/ui/code_editor/FileTree.gd | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/project/src/ui/code_editor/FileTree.gd b/project/src/ui/code_editor/FileTree.gd index 13a4f1b9..2a01a7e7 100644 --- a/project/src/ui/code_editor/FileTree.gd +++ b/project/src/ui/code_editor/FileTree.gd @@ -11,6 +11,7 @@ func _fill_tree(path): var name = path.substr(path.get_base_dir().length()+1,path.length()) var root = file_tree.create_item() root.set_text(0, name) + add_icon(root, true) add_files_to_tree(path, root) func add_files_to_tree(path, parent): @@ -22,11 +23,20 @@ func add_files_to_tree(path, parent): var child = file_tree.create_item(parent) child.set_text(0, file_name) if dir.current_is_dir(): + add_icon(child, true) add_files_to_tree(dir.get_current_dir() + "/" + file_name, child) else: child.set_metadata(0, dir.get_current_dir() + "/" + file_name) + add_icon(child, false) file_name = dir.get_next() - + +func add_icon(node, is_folder): + if is_folder: + node.set_icon(0, load('res://media/images/outline_folder_white_48dp.png')) + else: + node.set_icon(0, load('res://media/images/outline_description_white_48dp.png')) + node.set_icon_max_width(0, 20) + func _on_FileTree_item_activated(): var path = file_tree.get_selected().get_metadata(0) if path != null: From ffa66803aacaf8fd7cd7c56f6fd86a913729e140 Mon Sep 17 00:00:00 2001 From: akjeller Date: Tue, 16 Nov 2021 19:25:46 +0100 Subject: [PATCH 33/61] File tree buttons --- .../images/outline_delete_white_48dp.png | Bin 0 -> 243 bytes .../outline_delete_white_48dp.png.import | 34 ++++++++ .../images/outline_description_white_48dp.png | Bin 0 -> 350 bytes .../outline_description_white_48dp.png.import | 34 ++++++++ .../images/outline_folder_white_48dp.png | Bin 0 -> 359 bytes .../outline_folder_white_48dp.png.import | 34 ++++++++ .../images/outline_refresh_white_48dp.png | Bin 0 -> 853 bytes .../outline_refresh_white_48dp.png.import | 34 ++++++++ project/src/ui/code_editor/FileTree.gd | 73 +++++++++++++++--- project/src/ui/code_editor/MainWindow.tscn | 5 +- 10 files changed, 202 insertions(+), 12 deletions(-) create mode 100644 project/media/images/outline_delete_white_48dp.png create mode 100644 project/media/images/outline_delete_white_48dp.png.import create mode 100644 project/media/images/outline_description_white_48dp.png create mode 100644 project/media/images/outline_description_white_48dp.png.import create mode 100644 project/media/images/outline_folder_white_48dp.png create mode 100644 project/media/images/outline_folder_white_48dp.png.import create mode 100644 project/media/images/outline_refresh_white_48dp.png create mode 100644 project/media/images/outline_refresh_white_48dp.png.import diff --git a/project/media/images/outline_delete_white_48dp.png b/project/media/images/outline_delete_white_48dp.png new file mode 100644 index 0000000000000000000000000000000000000000..ac4af333a4a0e2f7636b3a6969e54eef27306f11 GIT binary patch literal 243 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD0wg^q?%xcgc6quuhE&{od*vW+vw?uCV|+%N z+RFn%Q=DZlaHKCetNUE#Qo#f|M3tn{X^G&DBayyI{SYex9K^y`L9INujrM>Pf~gLzKZc#5a)!e)?R)f OOFUiuT-G@yGywpvQdQgl literal 0 HcmV?d00001 diff --git a/project/media/images/outline_delete_white_48dp.png.import b/project/media/images/outline_delete_white_48dp.png.import new file mode 100644 index 00000000..a6c5dbdb --- /dev/null +++ b/project/media/images/outline_delete_white_48dp.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/outline_delete_white_48dp.png-27c9639844baf64968349be73c56fcff.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://media/images/outline_delete_white_48dp.png" +dest_files=[ "res://.import/outline_delete_white_48dp.png-27c9639844baf64968349be73c56fcff.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/project/media/images/outline_description_white_48dp.png b/project/media/images/outline_description_white_48dp.png new file mode 100644 index 0000000000000000000000000000000000000000..c11431005639ee20d87711284dd503f8d700a9e7 GIT binary patch literal 350 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD0wg^q?%&M7z^Ll!;uunK>+Nkvu0sYQu7T>i zB#xSvu}|&VA;G?G(Jq0)h)O>h%fJ)A{|E0aXY}P;!nrhMqk@vsFQv6tUoV;+^;%19 z|CPAOF{M8*+nroiHyCi#B)pdA12YZs8Pp9ytPi#aJb6Hj8vX(ykjex7OiB6IrY8xC&PUsIwt^Pi{p^=sQM1@=EVx_P_r|JEB>7ec@P k=nWSCI&G`Ji%b0l;XT)<*-vELw+>{yr>mdKI;Vst0A~4rTmS$7 literal 0 HcmV?d00001 diff --git a/project/media/images/outline_description_white_48dp.png.import b/project/media/images/outline_description_white_48dp.png.import new file mode 100644 index 00000000..3567e0fd --- /dev/null +++ b/project/media/images/outline_description_white_48dp.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/outline_description_white_48dp.png-763bce53e5ccf2d25eb6d9770d1aba0a.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://media/images/outline_description_white_48dp.png" +dest_files=[ "res://.import/outline_description_white_48dp.png-763bce53e5ccf2d25eb6d9770d1aba0a.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/project/media/images/outline_folder_white_48dp.png b/project/media/images/outline_folder_white_48dp.png new file mode 100644 index 0000000000000000000000000000000000000000..c85c6e3e437238adfc511f5844b113dad5fd52c9 GIT binary patch literal 359 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD0wg^q?%&M7z^Lcx;uunK>+LOTzrzk94uRr3 zk|j+lCa=txU{ECH{BTy6)lKG7mAcNuOIuBPlKs=%_HEz(r|(I>&i++K#vowb87+5X zQ*zE~nYR6pCNe+Y=4Jm+__CMxgLyBPDi<7<<5DX)9uDI5}UC~*=uI`mt_;S2Z5PQDJG41I~LG;Csw2eM^0h$}ca+-zuOU}QSQ#sd;55CMziGcvJE z;dO9GI`G5yqPN(G#nqEd6%wv4I4dQv;myT4b%H5Z1h!PUP1jw(z59LkFP-D>nYTY% z)itX$O+4twrTgov7ush3wflN&=}ZvNT_&%7H!41LtC|ro02w@8{an^LB{Ts5$|8~4 literal 0 HcmV?d00001 diff --git a/project/media/images/outline_folder_white_48dp.png.import b/project/media/images/outline_folder_white_48dp.png.import new file mode 100644 index 00000000..57bd9065 --- /dev/null +++ b/project/media/images/outline_folder_white_48dp.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/outline_folder_white_48dp.png-20b7cbf4f763683c8f27e4155c715908.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://media/images/outline_folder_white_48dp.png" +dest_files=[ "res://.import/outline_folder_white_48dp.png-20b7cbf4f763683c8f27e4155c715908.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/project/media/images/outline_refresh_white_48dp.png b/project/media/images/outline_refresh_white_48dp.png new file mode 100644 index 0000000000000000000000000000000000000000..594a237fa9792ec696b4d165a806c6826f58ec4e GIT binary patch literal 853 zcmV-b1FHOqP)CNNs|} zaREkavs7oeRKBUW5(}md!P2-3p?*_k8t7|w-~3OG$;-(%qt!iQ8Bm>)w_ zn~IG~3BPUy9I3IZN(#Sj1$>~|KrC2N_>k%V>ucmPp98JuJ?J!fd zKQV907l(6mU@?5Jv13!dIG&yZ^WasD{fhZgTg3&9*>Jx+2c))&D@t?Wc6pvoZ55aF zmcT3W48wA%ZQ`2h7WiJCnb(~;vVxs2V zU#Caq+K#KiJXjT*Vn>{cCox9r?(R+aF|Y~FPdyPM%SPeA)DtnZ?^Udlx-Q064(-j- zatv-AiF2?>>Z%xB{1uMtZtyX@`x{(}ty0It`1+Cf8Sml&T#S9NOzN=^LI@#*5JCtc fgb+dqA%wpG_!(1aiL5ph00000NkvXXu0mjfo#BOl literal 0 HcmV?d00001 diff --git a/project/media/images/outline_refresh_white_48dp.png.import b/project/media/images/outline_refresh_white_48dp.png.import new file mode 100644 index 00000000..8903e654 --- /dev/null +++ b/project/media/images/outline_refresh_white_48dp.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/outline_refresh_white_48dp.png-90032707c434f3814938c728493c521f.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://media/images/outline_refresh_white_48dp.png" +dest_files=[ "res://.import/outline_refresh_white_48dp.png-90032707c434f3814938c728493c521f.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/project/src/ui/code_editor/FileTree.gd b/project/src/ui/code_editor/FileTree.gd index 2a01a7e7..7f09e730 100644 --- a/project/src/ui/code_editor/FileTree.gd +++ b/project/src/ui/code_editor/FileTree.gd @@ -2,16 +2,32 @@ extends Tree onready var mainControl: Node = get_owner() onready var file_tree: Tree = self +onready var popupWindow = preload("res://src/ui/popup/popup_window.tscn") + +var icon_folder +var icon_doc +var icon_refresh +var icon_delete +var root_path # Called when the node enters the scene tree for the first time. func _ready(): - pass # Replace with function body. + icon_folder = resize_image_to_texture('res://media/images/outline_folder_white_48dp.png') + icon_doc = resize_image_to_texture('res://media/images/outline_description_white_48dp.png') + icon_refresh = resize_image_to_texture('res://media/images/outline_refresh_white_48dp.png') + icon_delete = resize_image_to_texture('res://media/images/outline_delete_white_48dp.png') func _fill_tree(path): + root_path = path var name = path.substr(path.get_base_dir().length()+1,path.length()) var root = file_tree.create_item() root.set_text(0, name) - add_icon(root, true) + root.set_icon(0, icon_folder) + + root.add_button(0, icon_folder, 0) + root.add_button(0, icon_refresh, 1) + root.add_button(0, icon_delete, 2) + add_files_to_tree(path, root) func add_files_to_tree(path, parent): @@ -23,21 +39,58 @@ func add_files_to_tree(path, parent): var child = file_tree.create_item(parent) child.set_text(0, file_name) if dir.current_is_dir(): - add_icon(child, true) + child.set_icon(0, icon_folder) add_files_to_tree(dir.get_current_dir() + "/" + file_name, child) else: child.set_metadata(0, dir.get_current_dir() + "/" + file_name) - add_icon(child, false) + child.set_icon(0, icon_doc) file_name = dir.get_next() -func add_icon(node, is_folder): - if is_folder: - node.set_icon(0, load('res://media/images/outline_folder_white_48dp.png')) - else: - node.set_icon(0, load('res://media/images/outline_description_white_48dp.png')) - node.set_icon_max_width(0, 20) +func resize_image_to_texture(input): + var texture = ImageTexture.new() + var image = Image.new() + image.load(input) + image.resize(20, 20) + texture.create_from_image(image) + return texture func _on_FileTree_item_activated(): var path = file_tree.get_selected().get_metadata(0) if path != null: mainControl._load_content(path) + + +func _on_FileTree_button_pressed(item, column, id): + match(id): + 0: + mainControl._open_file() + 1: + file_tree.clear() + _fill_tree(root_path) + 2: + var path = file_tree.get_selected().get_metadata(0) + if path != null: + delete_file(path, file_tree.get_selected().get_text(0)) + +func delete_file(path, file_name): + var popup = popupWindow.instance() + get_tree().root.add_child(popup) + popup.confirmation('Are you sure you want to delete: ' + file_name + '?') + yield(popup,"click") + var accept = popup.choiseRet() + if accept: + var dir = Directory.new() + dir.remove(path) + file_tree.clear() + _fill_tree(root_path) + +# Usage: +# Load this class: var popupWindow = preload("res://src/ui/popup/popup_window.tscn") +# Input following code where popup is needed: +# var popup = popupWindow.instance() +# get_tree().root.add_child(popup) +# Either popup.confirmation("your message") OR popup.info("your message") +# Following only for confirmation popup: +# yield(popup,"click") +# var h = popup.choiseRet() - "no" = false, "yes" = true +# diff --git a/project/src/ui/code_editor/MainWindow.tscn b/project/src/ui/code_editor/MainWindow.tscn index f41188e4..85eada46 100644 --- a/project/src/ui/code_editor/MainWindow.tscn +++ b/project/src/ui/code_editor/MainWindow.tscn @@ -59,8 +59,8 @@ window_title = "Open a File" resizable = true mode = 0 access = 2 -current_dir = "/SCHOOL/MPSOF-1/Year2/LP1/SoftEv/GITKRAKEN/group-10-smce-gd/project" -current_path = "/SCHOOL/MPSOF-1/Year2/LP1/SoftEv/GITKRAKEN/group-10-smce-gd/project/" +current_dir = "/Users/Kjeller/Documents/dev/SMCE/group-10-smce-gd/project" +current_path = "/Users/Kjeller/Documents/dev/SMCE/group-10-smce-gd/project/" __meta__ = { "_edit_use_anchors_": false } @@ -124,6 +124,7 @@ __meta__ = { } [connection signal="file_selected" from="FileDialog" to="." method="_on_FileDialog_file_selected"] +[connection signal="button_pressed" from="HBoxContainer/FileTree" to="HBoxContainer/FileTree" method="_on_FileTree_button_pressed"] [connection signal="item_activated" from="HBoxContainer/FileTree" to="HBoxContainer/FileTree" method="_on_FileTree_item_activated"] [connection signal="pressed" from="HBoxContainer/CollapseBtn" to="." method="_on_Collapse_btn_pressed"] [connection signal="tab_changed" from="HBoxContainer/VBoxContainer/Tabs" to="HBoxContainer/VBoxContainer/Tabs" method="_on_Tabs_tab_changed"] From b13eb756e2bcf9fc7d7f1b660d0d32893113ce74 Mon Sep 17 00:00:00 2001 From: Anton Lutteman Date: Tue, 16 Nov 2021 20:43:25 +0100 Subject: [PATCH 34/61] Added compile button Added button for compiling the "main" sketch, hides the editor when pressed --- project/project.godot | 26 ++++++++++---------- project/src/ui/code_editor/MainWindow.gd | 11 +++++++++ project/src/ui/code_editor/MainWindow.tscn | 20 +++++++++++---- project/src/ui/sketch_control/ControlPane.gd | 2 ++ 4 files changed, 41 insertions(+), 18 deletions(-) diff --git a/project/project.godot b/project/project.godot index bc51036b..c399ec6f 100644 --- a/project/project.godot +++ b/project/project.godot @@ -14,7 +14,7 @@ _global_script_classes=[ { "language": "GDScript", "path": "res://src/attachments/AnalogRaycast.gd" }, { -"base": "", +"base": "Reference", "class": "AnyTask", "language": "NativeScript", "path": "res://src/bind/AnyTask.gdns" @@ -24,22 +24,22 @@ _global_script_classes=[ { "language": "GDScript", "path": "res://src/utilities/toggleable_bgroup/BButtonGroup.gd" }, { -"base": "", +"base": "Node", "class": "Board", "language": "NativeScript", "path": "res://src/bind/Board.gdns" }, { -"base": "", +"base": "Reference", "class": "BoardConfig", "language": "NativeScript", "path": "res://src/bind/BoardConfig.gdns" }, { -"base": "", +"base": "Node", "class": "BoardView", "language": "NativeScript", "path": "res://src/bind/BoardView.gdns" }, { -"base": "", +"base": "Node", "class": "BraceEnabler", "language": "NativeScript", "path": "res://src/bind/BraceEnabler.gdns" @@ -59,17 +59,17 @@ _global_script_classes=[ { "language": "GDScript", "path": "res://src/utilities/control_util/ControlUtil.gd" }, { -"base": "", +"base": "Reference", "class": "FrameBufferConfig", "language": "NativeScript", "path": "res://src/bind/FrameBufferConfig.gdns" }, { -"base": "", +"base": "Reference", "class": "GDResult", "language": "NativeScript", "path": "res://src/bind/GDResult.gdns" }, { -"base": "", +"base": "Reference", "class": "GpioDriverConfig", "language": "NativeScript", "path": "res://src/bind/GpioDriverConfig.gdns" @@ -109,7 +109,7 @@ _global_script_classes=[ { "language": "GDScript", "path": "res://src/bind/SMCE.gd" }, { -"base": "", +"base": "Reference", "class": "SecureDigitalStorage", "language": "NativeScript", "path": "res://src/bind/SecureDigitalStorage.gdns" @@ -129,7 +129,7 @@ _global_script_classes=[ { "language": "GDScript", "path": "res://src/ui/simple_notification/SimpleNotification.gd" }, { -"base": "", +"base": "Reference", "class": "Sketch", "language": "NativeScript", "path": "res://src/bind/Sketch.gdns" @@ -149,17 +149,17 @@ _global_script_classes=[ { "language": "GDScript", "path": "res://src/ui/temp_tween/TempTween.gd" }, { -"base": "", +"base": "Node", "class": "Toolchain", "language": "NativeScript", "path": "res://src/bind/Toolchain.gdns" }, { -"base": "", +"base": "Reference", "class": "UartChannelConfig", "language": "NativeScript", "path": "res://src/bind/UartChannelConfig.gdns" }, { -"base": "", +"base": "Node", "class": "UartSlurper", "language": "NativeScript", "path": "res://src/bind/UartSlurper.gdns" diff --git a/project/src/ui/code_editor/MainWindow.gd b/project/src/ui/code_editor/MainWindow.gd index c49e5ec2..46ef57e9 100644 --- a/project/src/ui/code_editor/MainWindow.gd +++ b/project/src/ui/code_editor/MainWindow.gd @@ -2,6 +2,7 @@ extends Control onready var close_btn: Button = $Close +onready var compile_btn: Button = $Compile onready var dropdown_btn: MenuButton = $DropDown onready var fileDialog: FileDialog = $FileDialog onready var textEditor: TextEdit = $HBoxContainer/VBoxContainer/TextEditor @@ -13,6 +14,8 @@ var src_file = null var currentFileInfo = null var fileInfos = {} #Keeps track of all fileInfo objects var tree_filled = false +var sketch_owner = null + #SAVES CURRENT STATE OF filedialog operation #Can have the following values: # OPEN NEWFILE SAVE NEWPROJ @@ -22,6 +25,8 @@ onready var fileLoader = load("res://src/ui/file_dialog/FileLoader.gd").new() # Called when the node enters the scene tree for the first time. func _ready(): close_btn.connect("pressed", self, "_on_close") + compile_btn.visible = false + compile_btn.connect("pressed",self, "_on_compile") _init_dropdown() textEditor._init_content() @@ -37,6 +42,11 @@ func _init_dropdown(): # Function that hides the editor when its closed with a dedicated button func _on_close() -> void: set_visible(false) + +# Function that calls compile function and closes("hides") the editor +func _on_compile() -> void: + sketch_owner._on_compile() #Running compile functionality in ControlPane instance + _on_close() # Function that displays the hidden editor func enableEditor() -> void: @@ -61,6 +71,7 @@ func _open_file(): fileDialogOperation = "OPEN" fileDialog.mode = fileDialog.MODE_OPEN_FILE #Change mode back to open file fileDialog.popup() # Opens file dialog for file selection + #Function to create a new file func _new_file(): fileDialogOperation = "NEWFILE" diff --git a/project/src/ui/code_editor/MainWindow.tscn b/project/src/ui/code_editor/MainWindow.tscn index f41188e4..94e8f6b0 100644 --- a/project/src/ui/code_editor/MainWindow.tscn +++ b/project/src/ui/code_editor/MainWindow.tscn @@ -39,9 +39,9 @@ __meta__ = { [node name="DropDown" type="MenuButton" parent="."] margin_left = 5.0 -margin_top = 3.81079 +margin_top = 5.0 margin_right = 100.0 -margin_bottom = 29.8108 +margin_bottom = 29.0 text = "File" flat = false __meta__ = { @@ -55,12 +55,22 @@ margin_left = 107.635 margin_top = 220.315 margin_right = 677.635 margin_bottom = 539.315 -window_title = "Open a File" +window_title = "Öppna en Fil" resizable = true mode = 0 access = 2 -current_dir = "/SCHOOL/MPSOF-1/Year2/LP1/SoftEv/GITKRAKEN/group-10-smce-gd/project" -current_path = "/SCHOOL/MPSOF-1/Year2/LP1/SoftEv/GITKRAKEN/group-10-smce-gd/project/" +current_dir = "/Users/Anton/Desktop/MPSOF-1/DAT265/group10/group-10-smce-gd/project" +current_path = "/Users/Anton/Desktop/MPSOF-1/DAT265/group10/group-10-smce-gd/project/" +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Compile" type="Button" parent="."] +margin_left = 105.0 +margin_top = 5.0 +margin_right = 200.0 +margin_bottom = 29.0 +text = "Compile" __meta__ = { "_edit_use_anchors_": false } diff --git a/project/src/ui/sketch_control/ControlPane.gd b/project/src/ui/sketch_control/ControlPane.gd index d8c31995..73e1a7cb 100644 --- a/project/src/ui/sketch_control/ControlPane.gd +++ b/project/src/ui/sketch_control/ControlPane.gd @@ -142,7 +142,9 @@ func _on_edit_btn() -> void: if (code_editor == null): code_editor = code_main_window_t.instance() code_editor.src_file = sketch_path + code_editor.sketch_owner = self get_tree().root.add_child(code_editor) + code_editor.compile_btn.visible = true else: code_editor.enableEditor() From 209bcd948a95331b34c61637285e7b692c6515f6 Mon Sep 17 00:00:00 2001 From: akjeller Date: Wed, 17 Nov 2021 21:21:55 +0100 Subject: [PATCH 35/61] Switching tabs select correct file in tree --- project/src/ui/code_editor/FileTree.gd | 17 ++++++++++++++++- project/src/ui/code_editor/MainWindow.tscn | 6 +++--- project/src/ui/code_editor/Tabs.gd | 2 ++ 3 files changed, 21 insertions(+), 4 deletions(-) diff --git a/project/src/ui/code_editor/FileTree.gd b/project/src/ui/code_editor/FileTree.gd index 7f09e730..f9f5b8bc 100644 --- a/project/src/ui/code_editor/FileTree.gd +++ b/project/src/ui/code_editor/FileTree.gd @@ -4,6 +4,8 @@ onready var mainControl: Node = get_owner() onready var file_tree: Tree = self onready var popupWindow = preload("res://src/ui/popup/popup_window.tscn") + + var icon_folder var icon_doc var icon_refresh @@ -58,8 +60,21 @@ func _on_FileTree_item_activated(): var path = file_tree.get_selected().get_metadata(0) if path != null: mainControl._load_content(path) + +func _select_node(path): + _select_node_util(file_tree.get_root(), path) - +func _select_node_util(node, path): + if node == null: + return + elif node.get_metadata(0) == path: + node.select(0) + else: + var c = node.get_children() + while(c): + _select_node_util(c, path) + c = c.get_next() + func _on_FileTree_button_pressed(item, column, id): match(id): 0: diff --git a/project/src/ui/code_editor/MainWindow.tscn b/project/src/ui/code_editor/MainWindow.tscn index c997ff87..f7790635 100644 --- a/project/src/ui/code_editor/MainWindow.tscn +++ b/project/src/ui/code_editor/MainWindow.tscn @@ -55,12 +55,12 @@ margin_left = 107.635 margin_top = 220.315 margin_right = 677.635 margin_bottom = 539.315 -window_title = "Öppna en Fil" +window_title = "Open a File" resizable = true mode = 0 access = 2 -current_dir = "/Users/Anton/Desktop/MPSOF-1/DAT265/group10/group-10-smce-gd/project" -current_path = "/Users/Anton/Desktop/MPSOF-1/DAT265/group10/group-10-smce-gd/project/" +current_dir = "/Users/Kjeller/Documents/dev/SMCE/group-10-smce-gd/project" +current_path = "/Users/Kjeller/Documents/dev/SMCE/group-10-smce-gd/project/" __meta__ = { "_edit_use_anchors_": false } diff --git a/project/src/ui/code_editor/Tabs.gd b/project/src/ui/code_editor/Tabs.gd index b2112fc9..6e55992d 100644 --- a/project/src/ui/code_editor/Tabs.gd +++ b/project/src/ui/code_editor/Tabs.gd @@ -86,6 +86,8 @@ func _on_Tabs_tab_clicked(tab): var fileInfo = mainControl.fileInfos[tabs.current_tab] #Display the content for the selected tab _show_new_file(fileInfo) + + mainControl.file_tree._select_node(fileInfo._path) #Signal from pressing X on a tab From 1dad5670b74fd75ce02a291b1d4805769d2d2128 Mon Sep 17 00:00:00 2001 From: Anthony1911 Date: Wed, 17 Nov 2021 21:22:29 +0100 Subject: [PATCH 36/61] Added more highlight keywords --- project/src/ui/code_editor/TextEditor.gd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/src/ui/code_editor/TextEditor.gd b/project/src/ui/code_editor/TextEditor.gd index c00589fb..21ffac34 100644 --- a/project/src/ui/code_editor/TextEditor.gd +++ b/project/src/ui/code_editor/TextEditor.gd @@ -24,7 +24,7 @@ func _ready(): textEditor.add_keyword_color(o,Color(0.605167, 0.875, 0.071777)) #stream, serial, other operations - var other = ['interrupts','noInterrupts','CAN','setCursor','display','bit','read','peek','onReceive','onRequest','flush', 'requestFrom','endTransmission','beginTransmission','setClock', 'status','write','size_t','Stream','Serial','begin','end','stop','print','printf','println','delay','attach','readMsgBuf','sendMsgBuf'] + var other = ['interrupts','noInterrupts','CAN','setCursor','display','bit','read','peek','onReceive','onRequest','flush', 'requestFrom','endTransmission','beginTransmission','setClock', 'status','write','size_t','Stream','Serial','begin','end','stop','print','printf','println','delay','attach','readMsgBuf','sendMsgBuf','analogWrite','analogRead', 'digitalWrite', 'digitalRead', 'writeMicroseconds','pinMode','delayMicroseconds'] for t in other: textEditor.add_keyword_color(t,Color(0.976563, 0.599444, 0.324249)) From 9c97fdd4c9b952625752e8f61acb56c6eb18f35d Mon Sep 17 00:00:00 2001 From: Anthony1911 Date: Thu, 18 Nov 2021 10:42:46 +0100 Subject: [PATCH 37/61] Added selective syntax highlighting Only for Arduino and Godot - related files --- project/src/ui/code_editor/Tabs.gd | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/project/src/ui/code_editor/Tabs.gd b/project/src/ui/code_editor/Tabs.gd index 6e55992d..8fe41011 100644 --- a/project/src/ui/code_editor/Tabs.gd +++ b/project/src/ui/code_editor/Tabs.gd @@ -46,6 +46,14 @@ func _show_new_file(file): mainControl.textEditor.text = "Please open a file to edit" mainControl.currentFileInfo = null return + + #Enables syntax highlighting only for Arduino and Godot files + var format = (file._name.rsplit(".", true, 1))[1] + if (format == "ino" || format == "h" || format == "gd"): + mainControl.textEditor.syntax_highlighting = true + else: + mainControl.textEditor.syntax_highlighting = false + mainControl.textEditor.text = file._content mainControl.textEditor.cursor_set_line(file._cursorLine) mainControl.textEditor.cursor_set_column(file._cursorColumn) From 30462497ad103f7b156a83d33a93368d1df16eba Mon Sep 17 00:00:00 2001 From: Anthony1911 Date: Thu, 18 Nov 2021 11:08:10 +0100 Subject: [PATCH 38/61] Correction Correction on highlighted file formats --- project/src/ui/code_editor/Tabs.gd | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/project/src/ui/code_editor/Tabs.gd b/project/src/ui/code_editor/Tabs.gd index 8fe41011..4e099b71 100644 --- a/project/src/ui/code_editor/Tabs.gd +++ b/project/src/ui/code_editor/Tabs.gd @@ -47,9 +47,9 @@ func _show_new_file(file): mainControl.currentFileInfo = null return - #Enables syntax highlighting only for Arduino and Godot files + #Enables syntax highlighting only for Arduino files var format = (file._name.rsplit(".", true, 1))[1] - if (format == "ino" || format == "h" || format == "gd"): + if (format == "ino" || format == "h" || format == "pde" || format == "cpp" || format == "c"): mainControl.textEditor.syntax_highlighting = true else: mainControl.textEditor.syntax_highlighting = false From 13aa12902fdb1e5a3bc924fd44d3f350ef8a26cb Mon Sep 17 00:00:00 2001 From: Anthony1911 Date: Thu, 18 Nov 2021 11:34:41 +0100 Subject: [PATCH 39/61] Anchor refactoring Line limit UI remains in the same position after window resize --- project/src/ui/code_editor/MainWindow.tscn | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/project/src/ui/code_editor/MainWindow.tscn b/project/src/ui/code_editor/MainWindow.tscn index f7790635..386508d2 100644 --- a/project/src/ui/code_editor/MainWindow.tscn +++ b/project/src/ui/code_editor/MainWindow.tscn @@ -134,20 +134,24 @@ __meta__ = { } [node name="LabelLineLimit" type="Label" parent="."] -margin_left = 1088.47 -margin_top = 50.4142 -margin_right = 1205.47 -margin_bottom = 70.4142 +anchor_left = 1.0 +anchor_right = 1.0 +margin_left = -185.739 +margin_top = 51.8284 +margin_right = -68.7388 +margin_bottom = 71.8284 text = "Line length limit:" __meta__ = { "_edit_use_anchors_": false } [node name="LineLimitField" type="LineEdit" parent="."] -margin_left = 1214.59 -margin_top = 46.669 -margin_right = 1272.59 -margin_bottom = 76.669 +anchor_left = 1.0 +anchor_right = 1.0 +margin_left = -66.6904 +margin_top = 46.6691 +margin_right = -8.69043 +margin_bottom = 76.6691 hint_tooltip = "Values below 10 will be ignored" text = "80" __meta__ = { From c9c40aec7fc68839fb374d86518d342e03c24e15 Mon Sep 17 00:00:00 2001 From: Anthony1911 Date: Mon, 29 Nov 2021 10:36:12 +0100 Subject: [PATCH 40/61] Refactoring Popup now uses containers for display and automatic resizing --- project/src/ui/popup/popup_window.gd | 42 +++------------- project/src/ui/popup/popup_window.tscn | 70 +++++++++++++++----------- 2 files changed, 47 insertions(+), 65 deletions(-) diff --git a/project/src/ui/popup/popup_window.gd b/project/src/ui/popup/popup_window.gd index 4c7c9d6b..5b5b5876 100644 --- a/project/src/ui/popup/popup_window.gd +++ b/project/src/ui/popup/popup_window.gd @@ -11,10 +11,10 @@ extends Popup # var h = popup.choiseRet() - "no" = false, "yes" = true # -onready var buttonOK = $buttonOK # for information popup -onready var buttonYes = $buttonYES # for confirmation popup -onready var buttonNo = $buttonNO # for confirmation popup -onready var msgLabel = $messageLabel # for both popup types +onready var buttonOK = $Panel/btnContainer/buttonOK # for information popup +onready var buttonYes = $Panel/btnContainer/buttonYES # for confirmation popup +onready var buttonNo = $Panel/btnContainer/buttonNO # for confirmation popup +onready var msgLabel = $Panel/messageLabel # for both popup types onready var panel = $Panel signal click # for confirmation popup @@ -29,25 +29,9 @@ func _ready(): buttonYes.connect("pressed", self, "_buttonYes_pressed") buttonNo.text = "No" buttonNo.connect("pressed", self, "_buttonNo_pressed") - -# Function to widen the window to support larger text -func widenWindow(var i): - panel.margin_right = 793 + i * 30 - panel.margin_left = 511 - i * 30 - msgLabel.margin_right = 782 + i * 30 - msgLabel.margin_left = 522 - i * 30 - + # Call this to display informational popup with simple "OK" button func info(message): - var i = 1 - if (message.length()>112): - i = (message.length()/28)-4 - widenWindow(i) - msgLabel.text = message - buttonYes.set_visible(false) - buttonNo.set_visible(false) - popup() - else: msgLabel.text = message buttonYes.set_visible(false) buttonNo.set_visible(false) @@ -55,18 +39,6 @@ func info(message): # Call this to display a popup with "yes" and "no" buttons func confirmation(message): - var i = 1 - if (message.length()>112): - i = (message.length()/28)-4 - widenWindow(i) - buttonYes.margin_right = 588 - i * 30 - buttonYes.margin_left = 491 - i * 30 - buttonNo.margin_left = 713 + i * 30 - buttonNo.margin_right = 810 + i * 30 - msgLabel.text = message - buttonOK.set_visible(false) - popup() - else: msgLabel.text = message buttonOK.set_visible(false) popup() @@ -77,12 +49,12 @@ func _buttonOK_pressed() -> void: func _buttonYes_pressed() -> void: choice = true - emit_signal("click",choice) + emit_signal("click") queue_free() func _buttonNo_pressed() -> void: choice = false - emit_signal("click",choice) + emit_signal("click") queue_free() # Returns user's choice (only for confirmation popup) diff --git a/project/src/ui/popup/popup_window.tscn b/project/src/ui/popup/popup_window.tscn index faa3c91b..d953b1fc 100644 --- a/project/src/ui/popup/popup_window.tscn +++ b/project/src/ui/popup/popup_window.tscn @@ -7,68 +7,78 @@ visible = true anchor_right = 1.0 anchor_bottom = 1.0 -margin_left = -0.963871 -margin_bottom = 4.0 +margin_left = -139.135 +margin_top = -42.3918 +margin_right = -138.171 +margin_bottom = -38.3918 script = ExtResource( 1 ) __meta__ = { "_edit_use_anchors_": false } -[node name="Panel" type="Panel" parent="."] -margin_left = 511.0 -margin_top = 311.0 +[node name="Panel" type="PanelContainer" parent="."] +margin_left = 502.0 +margin_top = 305.0 margin_right = 793.0 margin_bottom = 480.0 +size_flags_vertical = 0 __meta__ = { "_edit_use_anchors_": false } -[node name="buttonOK" type="Button" parent="."] -margin_left = 616.205 -margin_top = 440.496 -margin_right = 720.205 -margin_bottom = 484.496 -rect_scale = Vector2( 0.7, 0.7 ) -text = "OK" +[node name="btnContainer" type="HBoxContainer" parent="Panel"] +margin_left = 7.0 +margin_top = 142.0 +margin_right = 284.0 +margin_bottom = 168.0 +size_flags_vertical = 14 +alignment = 1 __meta__ = { "_edit_use_anchors_": false } -[node name="buttonYES" type="Button" parent="."] -margin_left = 491.932 -margin_top = 423.36 -margin_right = 588.932 -margin_bottom = 471.36 -rect_scale = Vector2( 0.7, 0.7 ) +[node name="buttonYES" type="Button" parent="Panel/btnContainer"] +margin_right = 35.0 +margin_bottom = 26.0 rect_pivot_offset = Vector2( 97, 48 ) +size_flags_horizontal = 9 text = "Yes" __meta__ = { "_edit_use_anchors_": false } -[node name="buttonNO" type="Button" parent="."] -margin_left = 713.684 -margin_top = 438.496 -margin_right = 810.684 -margin_bottom = 486.496 -rect_scale = Vector2( 0.7, 0.7 ) +[node name="buttonOK" type="Button" parent="Panel/btnContainer"] +margin_left = 39.0 +margin_right = 71.0 +margin_bottom = 26.0 +size_flags_horizontal = 8 +text = "OK" +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="buttonNO" type="Button" parent="Panel/btnContainer"] +margin_left = 246.0 +margin_right = 277.0 +margin_bottom = 26.0 +size_flags_horizontal = 10 text = "No" __meta__ = { "_edit_use_anchors_": false } -[node name="messageLabel" type="Label" parent="."] -margin_left = 522.0 -margin_top = 311.0 -margin_right = 782.0 -margin_bottom = 434.0 +[node name="messageLabel" type="Label" parent="Panel"] +margin_left = 7.0 +margin_top = 63.0 +margin_right = 284.0 +margin_bottom = 112.0 +size_flags_horizontal = 3 custom_fonts/font = ExtResource( 2 ) text = "\"default\" " align = 1 valign = 1 autowrap = true -clip_text = true __meta__ = { "_edit_use_anchors_": false } From 6a0236709da4d5e11f99961d1e0e0b449565ae02 Mon Sep 17 00:00:00 2001 From: Anthony1911 Date: Mon, 29 Nov 2021 10:43:13 +0100 Subject: [PATCH 41/61] Refactoring Snake_case naming --- project/src/ui/popup/popup_window.gd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/src/ui/popup/popup_window.gd b/project/src/ui/popup/popup_window.gd index 5b5b5876..a51926b1 100644 --- a/project/src/ui/popup/popup_window.gd +++ b/project/src/ui/popup/popup_window.gd @@ -58,7 +58,7 @@ func _buttonNo_pressed() -> void: queue_free() # Returns user's choice (only for confirmation popup) -func choiseRet(): +func choice_Ret(): return choice From 3ad6349ba5681fae06d86ca34c20553d43001ba1 Mon Sep 17 00:00:00 2001 From: akjeller Date: Tue, 30 Nov 2021 16:20:58 +0100 Subject: [PATCH 42/61] Refactor file_tree, seperate ui and logic --- project/src/ui/code_editor/FileTree.gd | 52 ++++++++---------------- project/src/ui/code_editor/MainWindow.gd | 3 +- project/src/ui/file_dialog/FileLoader.gd | 40 +++++++++++++++++- 3 files changed, 58 insertions(+), 37 deletions(-) diff --git a/project/src/ui/code_editor/FileTree.gd b/project/src/ui/code_editor/FileTree.gd index f9f5b8bc..533e878f 100644 --- a/project/src/ui/code_editor/FileTree.gd +++ b/project/src/ui/code_editor/FileTree.gd @@ -3,14 +3,13 @@ extends Tree onready var mainControl: Node = get_owner() onready var file_tree: Tree = self onready var popupWindow = preload("res://src/ui/popup/popup_window.tscn") - - +onready var fileLoader = load("res://src/ui/file_dialog/FileLoader.gd").new() var icon_folder var icon_doc var icon_refresh var icon_delete -var root_path +var src_file # Called when the node enters the scene tree for the first time. func _ready(): @@ -19,34 +18,31 @@ func _ready(): icon_refresh = resize_image_to_texture('res://media/images/outline_refresh_white_48dp.png') icon_delete = resize_image_to_texture('res://media/images/outline_delete_white_48dp.png') -func _fill_tree(path): - root_path = path - var name = path.substr(path.get_base_dir().length()+1,path.length()) +func _update_tree(path): + src_file = path + var file_node = fileLoader.load_file_tree(path.get_base_dir()) + file_tree.clear() var root = file_tree.create_item() - root.set_text(0, name) + root.set_text(0, file_node._file_name) root.set_icon(0, icon_folder) - root.add_button(0, icon_folder, 0) root.add_button(0, icon_refresh, 1) root.add_button(0, icon_delete, 2) - add_files_to_tree(path, root) + _update_tree_add_children(file_node._children, root) -func add_files_to_tree(path, parent): - var dir = Directory.new() - dir.open(path) - dir.list_dir_begin(true, false) - var file_name = dir.get_next() - while file_name != "": +func _update_tree_add_children(children, parent): + if children == null: + return + for c in children: var child = file_tree.create_item(parent) - child.set_text(0, file_name) - if dir.current_is_dir(): + child.set_text(0, c._file_name) + if c._is_folder: child.set_icon(0, icon_folder) - add_files_to_tree(dir.get_current_dir() + "/" + file_name, child) + _update_tree_add_children(c._children, child) else: - child.set_metadata(0, dir.get_current_dir() + "/" + file_name) child.set_icon(0, icon_doc) - file_name = dir.get_next() + child.set_metadata(0, c._path) func resize_image_to_texture(input): var texture = ImageTexture.new() @@ -80,8 +76,7 @@ func _on_FileTree_button_pressed(item, column, id): 0: mainControl._open_file() 1: - file_tree.clear() - _fill_tree(root_path) + _update_tree(src_file) 2: var path = file_tree.get_selected().get_metadata(0) if path != null: @@ -96,16 +91,5 @@ func delete_file(path, file_name): if accept: var dir = Directory.new() dir.remove(path) - file_tree.clear() - _fill_tree(root_path) + _update_tree(src_file) -# Usage: -# Load this class: var popupWindow = preload("res://src/ui/popup/popup_window.tscn") -# Input following code where popup is needed: -# var popup = popupWindow.instance() -# get_tree().root.add_child(popup) -# Either popup.confirmation("your message") OR popup.info("your message") -# Following only for confirmation popup: -# yield(popup,"click") -# var h = popup.choiseRet() - "no" = false, "yes" = true -# diff --git a/project/src/ui/code_editor/MainWindow.gd b/project/src/ui/code_editor/MainWindow.gd index 92b41a10..09d72cf9 100644 --- a/project/src/ui/code_editor/MainWindow.gd +++ b/project/src/ui/code_editor/MainWindow.gd @@ -30,6 +30,7 @@ func _ready(): compile_btn.connect("pressed",self, "_on_compile") _init_dropdown() textEditor._init_content() + # Initializes the dropdown menu button func _init_dropdown(): @@ -130,7 +131,7 @@ func _load_content(path): # Update the file tree with file structure func _fill_tree(): if(!tree_filled): - file_tree._fill_tree(src_file.get_base_dir()) + file_tree._update_tree(src_file) tree_filled = true # Function save a file diff --git a/project/src/ui/file_dialog/FileLoader.gd b/project/src/ui/file_dialog/FileLoader.gd index 16dd15b6..791faf66 100644 --- a/project/src/ui/file_dialog/FileLoader.gd +++ b/project/src/ui/file_dialog/FileLoader.gd @@ -23,8 +23,6 @@ static func loadFile(filepath: String): return content return null - - # records given string into the file static func saveFile(filepath:String, content:String): var f = File.new() @@ -33,3 +31,41 @@ static func saveFile(filepath:String, content:String): for str1 in arr: f.store_line(str1) f.close() + +static func load_file_tree(path: String): + var root = fileNode.new() + root._path = path + root._file_name = path.substr(path.get_base_dir().length()+1,path.length()) + _load_file_tree_util(root) + + return root + +static func _load_file_tree_util(node): + var dir = Directory.new() + dir.open(node._path) + dir.list_dir_begin(true, false) + + var children = [] + + var file_name = dir.get_next() + while file_name != "": + var child = fileNode.new() + child._file_name = file_name + child._path = dir.get_current_dir() + "/" + file_name + if dir.current_is_dir(): + child._is_folder = true + _load_file_tree_util(child) + else: + child._is_folder = false + children.append(child) + file_name = dir.get_next() + node._children = children + +class fileNode: + var _path: String + var _file_name: String + var _children: Array + var _is_folder: bool + + + From 4d2d41db6fb9559383f8b119f191ebe5896dec98 Mon Sep 17 00:00:00 2001 From: akjeller Date: Tue, 30 Nov 2021 16:34:32 +0100 Subject: [PATCH 43/61] Removed all signals from scene --- project/src/ui/code_editor/FileTree.gd | 3 +++ project/src/ui/code_editor/MainWindow.gd | 5 ++++- project/src/ui/code_editor/MainWindow.tscn | 9 --------- project/src/ui/code_editor/Tabs.gd | 5 +++++ 4 files changed, 12 insertions(+), 10 deletions(-) diff --git a/project/src/ui/code_editor/FileTree.gd b/project/src/ui/code_editor/FileTree.gd index 533e878f..280dd6f5 100644 --- a/project/src/ui/code_editor/FileTree.gd +++ b/project/src/ui/code_editor/FileTree.gd @@ -13,6 +13,9 @@ var src_file # Called when the node enters the scene tree for the first time. func _ready(): + file_tree.connect("button_pressed", self, "_on_FileTree_button_pressed") + file_tree.connect("item_activated", self, "_on_FileTree_item_activated") + icon_folder = resize_image_to_texture('res://media/images/outline_folder_white_48dp.png') icon_doc = resize_image_to_texture('res://media/images/outline_description_white_48dp.png') icon_refresh = resize_image_to_texture('res://media/images/outline_refresh_white_48dp.png') diff --git a/project/src/ui/code_editor/MainWindow.gd b/project/src/ui/code_editor/MainWindow.gd index 09d72cf9..37a85646 100644 --- a/project/src/ui/code_editor/MainWindow.gd +++ b/project/src/ui/code_editor/MainWindow.gd @@ -27,7 +27,10 @@ onready var fileLoader = load("res://src/ui/file_dialog/FileLoader.gd").new() func _ready(): close_btn.connect("pressed", self, "_on_close") compile_btn.visible = false - compile_btn.connect("pressed",self, "_on_compile") + compile_btn.connect("pressed", self, "_on_compile") + fileDialog.connect("file_selected", self, "_on_FileDialog_file_selected") + collapse_btn.connect("pressed", self, "_on_Collapse_btn_pressed") + textEditor.connect("text_changed", tabs, "_on_TextEditor_text_changed") _init_dropdown() textEditor._init_content() diff --git a/project/src/ui/code_editor/MainWindow.tscn b/project/src/ui/code_editor/MainWindow.tscn index 386508d2..46e04970 100644 --- a/project/src/ui/code_editor/MainWindow.tscn +++ b/project/src/ui/code_editor/MainWindow.tscn @@ -157,12 +157,3 @@ text = "80" __meta__ = { "_edit_use_anchors_": false } - -[connection signal="file_selected" from="FileDialog" to="." method="_on_FileDialog_file_selected"] -[connection signal="button_pressed" from="HBoxContainer/FileTree" to="HBoxContainer/FileTree" method="_on_FileTree_button_pressed"] -[connection signal="item_activated" from="HBoxContainer/FileTree" to="HBoxContainer/FileTree" method="_on_FileTree_item_activated"] -[connection signal="pressed" from="HBoxContainer/CollapseBtn" to="." method="_on_Collapse_btn_pressed"] -[connection signal="tab_changed" from="HBoxContainer/VBoxContainer/Tabs" to="HBoxContainer/VBoxContainer/Tabs" method="_on_Tabs_tab_changed"] -[connection signal="tab_clicked" from="HBoxContainer/VBoxContainer/Tabs" to="HBoxContainer/VBoxContainer/Tabs" method="_on_Tabs_tab_clicked"] -[connection signal="tab_close" from="HBoxContainer/VBoxContainer/Tabs" to="HBoxContainer/VBoxContainer/Tabs" method="_on_Tabs_tab_close"] -[connection signal="text_changed" from="HBoxContainer/VBoxContainer/TextEditor" to="HBoxContainer/VBoxContainer/Tabs" method="_on_TextEditor_text_changed"] diff --git a/project/src/ui/code_editor/Tabs.gd b/project/src/ui/code_editor/Tabs.gd index 4e099b71..be331b57 100644 --- a/project/src/ui/code_editor/Tabs.gd +++ b/project/src/ui/code_editor/Tabs.gd @@ -16,6 +16,11 @@ class fileinfo: #Function that Initializes the tabssystem func _ready(): + tabs.connect("tab_changed", self, "_on_Tabs_tab_changed") + tabs.connect("tab_clicked", self, "_on_Tabs_tab_clicked") + tabs.connect("tab_close", self, "_on_Tabs_tab_close") + + tabs.add_tab("+") tabs.tab_close_display_policy =Tabs.CLOSE_BUTTON_SHOW_NEVER From 6ce61358399a4bf73b2376dc46ee5afebf871822 Mon Sep 17 00:00:00 2001 From: Anton Lutteman Date: Tue, 30 Nov 2021 20:59:58 +0100 Subject: [PATCH 44/61] Added a theme for the fileDialog Used fileDialog.tres, made it unique for our fileDialog and changed the background from transparent to 1E1E1E --- project/src/ui/code_editor/MainWindow.tscn | 186 ++++++++++++++++++++- 1 file changed, 178 insertions(+), 8 deletions(-) diff --git a/project/src/ui/code_editor/MainWindow.tscn b/project/src/ui/code_editor/MainWindow.tscn index 386508d2..1ab576c8 100644 --- a/project/src/ui/code_editor/MainWindow.tscn +++ b/project/src/ui/code_editor/MainWindow.tscn @@ -1,10 +1,179 @@ -[gd_scene load_steps=5 format=2] +[gd_scene load_steps=18 format=2] [ext_resource path="res://src/ui/code_editor/MainWindow.gd" type="Script" id=1] [ext_resource path="res://src/ui/code_editor/Tabs.gd" type="Script" id=2] [ext_resource path="res://src/ui/code_editor/FileTree.gd" type="Script" id=3] [ext_resource path="res://src/ui/code_editor/TextEditor.gd" type="Script" id=4] +[sub_resource type="StyleBoxFlat" id=1] +content_margin_left = 8.0 +content_margin_right = 8.0 +content_margin_top = 6.0 +content_margin_bottom = 6.0 +bg_color = Color( 0.368627, 0.368627, 0.368627, 0.231373 ) +border_width_bottom = 2 +border_color = Color( 0.27451, 0.27451, 0.27451, 1 ) + +[sub_resource type="StyleBoxFlat" id=2] +content_margin_left = 8.0 +content_margin_right = 8.0 +content_margin_top = 6.0 +content_margin_bottom = 6.0 +bg_color = Color( 1, 1, 1, 0.152941 ) +border_width_bottom = 2 +border_color = Color( 0, 0.74902, 1, 1 ) + +[sub_resource type="StyleBoxFlat" id=3] +content_margin_left = 4.0 +bg_color = Color( 0.196078, 0.196078, 0.211765, 1 ) +border_width_bottom = 2 +border_color = Color( 0, 0.74902, 1, 1 ) + +[sub_resource type="StyleBoxFlat" id=4] +content_margin_left = 4.0 +bg_color = Color( 0.196078, 0.196078, 0.211765, 1 ) +border_width_bottom = 2 +border_color = Color( 0.282353, 0.282353, 0.282353, 1 ) + +[sub_resource type="StyleBoxFlat" id=5] +bg_color = Color( 0, 0, 0, 0.231373 ) +border_width_left = 2 +border_width_right = 2 +border_color = Color( 0, 0.74902, 1, 1 ) + +[sub_resource type="StyleBoxFlat" id=6] +content_margin_left = 2.0 +content_margin_right = 2.0 +content_margin_top = 8.0 +content_margin_bottom = 8.0 +bg_color = Color( 0.145098, 0.145098, 0.164706, 1 ) +shadow_size = 2 + +[sub_resource type="StyleBoxEmpty" id=7] + +[sub_resource type="StyleBoxEmpty" id=8] + +[sub_resource type="StyleBoxFlat" id=9] +bg_color = Color( 0, 0, 0, 0.231373 ) +border_width_left = 2 +border_width_right = 2 +border_color = Color( 0, 0.74902, 1, 1 ) +expand_margin_left = 28.0 + +[sub_resource type="StyleBoxFlat" id=10] +bg_color = Color( 0, 0.74902, 1, 1 ) +border_width_left = 5 +border_width_right = 5 +border_color = Color( 0.145098, 0.145098, 0.164706, 1 ) + +[sub_resource type="StyleBoxFlat" id=11] +bg_color = Color( 0, 0.74902, 1, 1 ) +border_width_left = 4 +border_width_right = 4 +border_color = Color( 0.145098, 0.145098, 0.164706, 1 ) + +[sub_resource type="StyleBoxFlat" id=12] +bg_color = Color( 0.117647, 0.117647, 0.117647, 1 ) +border_color = Color( 0, 0.74902, 1, 1 ) + +[sub_resource type="Theme" id=13] +Button/colors/font_color = Color( 1, 1, 1, 1 ) +Button/colors/font_color_disabled = Color( 0.9, 0.9, 0.9, 0.2 ) +Button/colors/font_color_hover = Color( 0.94, 0.94, 0.94, 1 ) +Button/colors/font_color_pressed = Color( 1, 1, 1, 1 ) +Button/constants/hseparation = 2 +Button/fonts/font = null +Button/styles/disabled = SubResource( 1 ) +Button/styles/focus = SubResource( 1 ) +Button/styles/hover = SubResource( 2 ) +Button/styles/normal = SubResource( 1 ) +Button/styles/pressed = SubResource( 2 ) +LineEdit/colors/clear_button_color = Color( 0.88, 0.88, 0.88, 1 ) +LineEdit/colors/clear_button_color_pressed = Color( 1, 1, 1, 1 ) +LineEdit/colors/cursor_color = Color( 0.94, 0.94, 0.94, 1 ) +LineEdit/colors/font_color = Color( 0.88, 0.88, 0.88, 1 ) +LineEdit/colors/font_color_selected = Color( 0, 0, 0, 1 ) +LineEdit/colors/font_color_uneditable = Color( 0.88, 0.88, 0.88, 0.5 ) +LineEdit/colors/selection_color = Color( 0.49, 0.49, 0.49, 1 ) +LineEdit/constants/minimum_spaces = 12 +LineEdit/fonts/font = null +LineEdit/icons/clear = null +LineEdit/styles/focus = SubResource( 3 ) +LineEdit/styles/normal = SubResource( 4 ) +LineEdit/styles/read_only = null +PopupMenu/colors/font_color = Color( 0.88, 0.88, 0.88, 1 ) +PopupMenu/colors/font_color_accel = Color( 0.7, 0.7, 0.7, 0.8 ) +PopupMenu/colors/font_color_disabled = Color( 0.4, 0.4, 0.4, 0.8 ) +PopupMenu/colors/font_color_hover = Color( 0.88, 0.88, 0.88, 1 ) +PopupMenu/constants/hseparation = 4 +PopupMenu/constants/vseparation = 4 +PopupMenu/fonts/font = null +PopupMenu/icons/checked = null +PopupMenu/icons/radio_checked = null +PopupMenu/icons/radio_unchecked = null +PopupMenu/icons/submenu = null +PopupMenu/icons/unchecked = null +PopupMenu/styles/hover = SubResource( 5 ) +PopupMenu/styles/labeled_separator_left = null +PopupMenu/styles/labeled_separator_right = null +PopupMenu/styles/panel = SubResource( 6 ) +PopupMenu/styles/panel_disabled = null +PopupMenu/styles/separator = null +Tree/colors/custom_button_font_highlight = Color( 0.941176, 0.941176, 0.941176, 1 ) +Tree/colors/drop_position_color = Color( 0, 0.74902, 1, 1 ) +Tree/colors/font_color = Color( 1, 1, 1, 1 ) +Tree/colors/font_color_selected = Color( 1, 1, 1, 1 ) +Tree/colors/guide_color = Color( 1, 1, 1, 0 ) +Tree/colors/relationship_line_color = Color( 1, 1, 1, 0 ) +Tree/colors/title_button_color = Color( 0.88, 0.88, 0.88, 1 ) +Tree/constants/button_margin = 0 +Tree/constants/draw_guides = 0 +Tree/constants/draw_relationship_lines = 0 +Tree/constants/hseparation = 16 +Tree/constants/item_margin = 12 +Tree/constants/scroll_border = 0 +Tree/constants/scroll_speed = 12 +Tree/constants/vseparation = 5 +Tree/fonts/font = null +Tree/fonts/title_button_font = null +Tree/icons/arrow = null +Tree/icons/arrow_collapsed = null +Tree/icons/checked = null +Tree/icons/select_arrow = null +Tree/icons/unchecked = null +Tree/icons/updown = null +Tree/styles/bg = SubResource( 7 ) +Tree/styles/bg_focus = SubResource( 8 ) +Tree/styles/button_pressed = null +Tree/styles/cursor = null +Tree/styles/cursor_unfocused = null +Tree/styles/custom_button = null +Tree/styles/custom_button_hover = null +Tree/styles/custom_button_pressed = null +Tree/styles/selected = SubResource( 9 ) +Tree/styles/selected_focus = SubResource( 9 ) +Tree/styles/title_button_hover = null +Tree/styles/title_button_normal = null +Tree/styles/title_button_pressed = null +VScrollBar/icons/decrement = null +VScrollBar/icons/decrement_highlight = null +VScrollBar/icons/increment = null +VScrollBar/icons/increment_highlight = null +VScrollBar/styles/grabber = SubResource( 10 ) +VScrollBar/styles/grabber_highlight = SubResource( 11 ) +VScrollBar/styles/grabber_pressed = SubResource( 10 ) +VScrollBar/styles/scroll = null +VScrollBar/styles/scroll_focus = null +WindowDialog/colors/title_color = Color( 1, 1, 1, 0 ) +WindowDialog/constants/close_h_ofs = 0 +WindowDialog/constants/close_v_ofs = -999 +WindowDialog/constants/scaleborder_size = 4 +WindowDialog/constants/title_height = 0 +WindowDialog/fonts/title_font = null +WindowDialog/icons/close = null +WindowDialog/icons/close_highlight = null +WindowDialog/styles/panel = SubResource( 12 ) + [node name="Control" type="Control"] anchor_right = 1.0 anchor_bottom = 1.0 @@ -51,16 +220,17 @@ __meta__ = { [node name="FileDialog" type="FileDialog" parent="."] anchor_left = 0.00215611 anchor_right = 0.00215611 -margin_left = 107.635 -margin_top = 220.315 -margin_right = 677.635 -margin_bottom = 539.315 -window_title = "Open a File" +margin_left = 306.24 +margin_top = 105.0 +margin_right = 1078.24 +margin_bottom = 539.0 +theme = SubResource( 13 ) +window_title = "Öppna en Fil" resizable = true mode = 0 access = 2 -current_dir = "/Users/Kjeller/Documents/dev/SMCE/group-10-smce-gd/project" -current_path = "/Users/Kjeller/Documents/dev/SMCE/group-10-smce-gd/project/" +current_dir = "/Users/Anton/Desktop/MPSOF-1/DAT265/group10/group-10-smce-gd/project" +current_path = "/Users/Anton/Desktop/MPSOF-1/DAT265/group10/group-10-smce-gd/project/" __meta__ = { "_edit_use_anchors_": false } From 2a4d64a40b2a4753fd5e8655e95e049091757732 Mon Sep 17 00:00:00 2001 From: Mahan Date: Tue, 30 Nov 2021 21:13:04 +0100 Subject: [PATCH 45/61] Changed theme of all buttons Updated itJustWorks tres files and applied to most elements --- project/project.godot | 26 +-- project/src/ui/code_editor/MainWindow.tscn | 38 ++-- .../themes/regular_button/regular_button.tres | 181 +++++++++++++++++- 3 files changed, 220 insertions(+), 25 deletions(-) diff --git a/project/project.godot b/project/project.godot index c399ec6f..bc51036b 100644 --- a/project/project.godot +++ b/project/project.godot @@ -14,7 +14,7 @@ _global_script_classes=[ { "language": "GDScript", "path": "res://src/attachments/AnalogRaycast.gd" }, { -"base": "Reference", +"base": "", "class": "AnyTask", "language": "NativeScript", "path": "res://src/bind/AnyTask.gdns" @@ -24,22 +24,22 @@ _global_script_classes=[ { "language": "GDScript", "path": "res://src/utilities/toggleable_bgroup/BButtonGroup.gd" }, { -"base": "Node", +"base": "", "class": "Board", "language": "NativeScript", "path": "res://src/bind/Board.gdns" }, { -"base": "Reference", +"base": "", "class": "BoardConfig", "language": "NativeScript", "path": "res://src/bind/BoardConfig.gdns" }, { -"base": "Node", +"base": "", "class": "BoardView", "language": "NativeScript", "path": "res://src/bind/BoardView.gdns" }, { -"base": "Node", +"base": "", "class": "BraceEnabler", "language": "NativeScript", "path": "res://src/bind/BraceEnabler.gdns" @@ -59,17 +59,17 @@ _global_script_classes=[ { "language": "GDScript", "path": "res://src/utilities/control_util/ControlUtil.gd" }, { -"base": "Reference", +"base": "", "class": "FrameBufferConfig", "language": "NativeScript", "path": "res://src/bind/FrameBufferConfig.gdns" }, { -"base": "Reference", +"base": "", "class": "GDResult", "language": "NativeScript", "path": "res://src/bind/GDResult.gdns" }, { -"base": "Reference", +"base": "", "class": "GpioDriverConfig", "language": "NativeScript", "path": "res://src/bind/GpioDriverConfig.gdns" @@ -109,7 +109,7 @@ _global_script_classes=[ { "language": "GDScript", "path": "res://src/bind/SMCE.gd" }, { -"base": "Reference", +"base": "", "class": "SecureDigitalStorage", "language": "NativeScript", "path": "res://src/bind/SecureDigitalStorage.gdns" @@ -129,7 +129,7 @@ _global_script_classes=[ { "language": "GDScript", "path": "res://src/ui/simple_notification/SimpleNotification.gd" }, { -"base": "Reference", +"base": "", "class": "Sketch", "language": "NativeScript", "path": "res://src/bind/Sketch.gdns" @@ -149,17 +149,17 @@ _global_script_classes=[ { "language": "GDScript", "path": "res://src/ui/temp_tween/TempTween.gd" }, { -"base": "Node", +"base": "", "class": "Toolchain", "language": "NativeScript", "path": "res://src/bind/Toolchain.gdns" }, { -"base": "Reference", +"base": "", "class": "UartChannelConfig", "language": "NativeScript", "path": "res://src/bind/UartChannelConfig.gdns" }, { -"base": "Node", +"base": "", "class": "UartSlurper", "language": "NativeScript", "path": "res://src/bind/UartSlurper.gdns" diff --git a/project/src/ui/code_editor/MainWindow.tscn b/project/src/ui/code_editor/MainWindow.tscn index 386508d2..986a883f 100644 --- a/project/src/ui/code_editor/MainWindow.tscn +++ b/project/src/ui/code_editor/MainWindow.tscn @@ -1,9 +1,14 @@ -[gd_scene load_steps=5 format=2] +[gd_scene load_steps=7 format=2] [ext_resource path="res://src/ui/code_editor/MainWindow.gd" type="Script" id=1] [ext_resource path="res://src/ui/code_editor/Tabs.gd" type="Script" id=2] [ext_resource path="res://src/ui/code_editor/FileTree.gd" type="Script" id=3] [ext_resource path="res://src/ui/code_editor/TextEditor.gd" type="Script" id=4] +[ext_resource path="res://src/ui/themes/regular_button/regular_button.tres" type="Theme" id=5] + +[sub_resource type="StyleBoxFlat" id=1] +bg_color = Color( 0, 0, 0, 0 ) +border_color = Color( 0, 0.478431, 0.8, 1 ) [node name="Control" type="Control"] anchor_right = 1.0 @@ -32,16 +37,20 @@ margin_left = -50.0 margin_top = 5.0 margin_right = -5.0 margin_bottom = 30.0 +theme = ExtResource( 5 ) text = "X" __meta__ = { "_edit_use_anchors_": false } [node name="DropDown" type="MenuButton" parent="."] +anchor_bottom = 0.00277778 margin_left = 5.0 margin_top = 5.0 margin_right = 100.0 margin_bottom = 29.0 +theme = ExtResource( 5 ) +custom_styles/focus = SubResource( 1 ) text = "File" flat = false __meta__ = { @@ -59,17 +68,19 @@ window_title = "Open a File" resizable = true mode = 0 access = 2 -current_dir = "/Users/Kjeller/Documents/dev/SMCE/group-10-smce-gd/project" -current_path = "/Users/Kjeller/Documents/dev/SMCE/group-10-smce-gd/project/" +current_dir = "/SCHOOL/MPSOF-1/Year2/LP1/SoftEv/GITKRAKEN/group-10-smce-gd/project" +current_path = "/SCHOOL/MPSOF-1/Year2/LP1/SoftEv/GITKRAKEN/group-10-smce-gd/project/" __meta__ = { "_edit_use_anchors_": false } [node name="Compile" type="Button" parent="."] +anchor_bottom = 0.00277778 margin_left = 105.0 margin_top = 5.0 margin_right = 200.0 margin_bottom = 29.0 +theme = ExtResource( 5 ) text = "Compile" __meta__ = { "_edit_use_anchors_": false @@ -90,6 +101,7 @@ __meta__ = { margin_right = 248.0 margin_bottom = 680.0 size_flags_horizontal = 3 +theme = ExtResource( 5 ) script = ExtResource( 3 ) __meta__ = { "_edit_use_anchors_": false @@ -100,6 +112,7 @@ margin_left = 252.0 margin_right = 272.0 margin_bottom = 680.0 text = "<" +flat = true __meta__ = { "_edit_use_anchors_": false } @@ -114,6 +127,7 @@ size_flags_stretch_ratio = 4.0 [node name="Tabs" type="Tabs" parent="HBoxContainer/VBoxContainer"] margin_right = 994.0 margin_bottom = 30.0 +theme = ExtResource( 5 ) tab_align = 0 tab_close_display_policy = 1 scrolling_enabled = false @@ -128,6 +142,7 @@ margin_right = 994.0 margin_bottom = 680.0 size_flags_vertical = 3 size_flags_stretch_ratio = 3.0 +theme = ExtResource( 5 ) script = ExtResource( 4 ) __meta__ = { "_edit_use_anchors_": false @@ -136,10 +151,10 @@ __meta__ = { [node name="LabelLineLimit" type="Label" parent="."] anchor_left = 1.0 anchor_right = 1.0 -margin_left = -185.739 -margin_top = 51.8284 -margin_right = -68.7388 -margin_bottom = 71.8284 +margin_left = -182.822 +margin_top = 46.259 +margin_right = -65.8218 +margin_bottom = 66.259 text = "Line length limit:" __meta__ = { "_edit_use_anchors_": false @@ -148,11 +163,12 @@ __meta__ = { [node name="LineLimitField" type="LineEdit" parent="."] anchor_left = 1.0 anchor_right = 1.0 -margin_left = -66.6904 -margin_top = 46.6691 -margin_right = -8.69043 -margin_bottom = 76.6691 +margin_left = -64.0 +margin_top = 46.0 +margin_right = -6.0 +margin_bottom = 66.0 hint_tooltip = "Values below 10 will be ignored" +theme = ExtResource( 5 ) text = "80" __meta__ = { "_edit_use_anchors_": false diff --git a/project/src/ui/themes/regular_button/regular_button.tres b/project/src/ui/themes/regular_button/regular_button.tres index ce3593c1..dab3397c 100644 --- a/project/src/ui/themes/regular_button/regular_button.tres +++ b/project/src/ui/themes/regular_button/regular_button.tres @@ -1,4 +1,4 @@ -[gd_resource type="Theme" load_steps=6 format=2] +[gd_resource type="Theme" load_steps=13 format=2] [ext_resource path="res://src/ui/themes/regular_button/disabled.tres" type="StyleBox" id=1] [ext_resource path="res://src/ui/themes/regular_button/hover.tres" type="StyleBox" id=2] @@ -6,6 +6,34 @@ [ext_resource path="res://src/ui/themes/regular_button/focus.tres" type="StyleBox" id=4] [ext_resource path="res://media/fonts/Open_Sans/OpenSasn-Regular.tres" type="DynamicFont" id=5] +[sub_resource type="StyleBoxFlat" id=1] +content_margin_left = 10.0 +bg_color = Color( 0.180392, 0.180392, 0.180392, 1 ) + +[sub_resource type="StyleBoxFlat" id=7] +bg_color = Color( 0.243137, 0.243137, 0.243137, 1 ) + +[sub_resource type="StyleBoxFlat" id=6] +bg_color = Color( 0.117647, 0.117647, 0.117647, 1 ) + +[sub_resource type="StyleBoxFlat" id=5] +content_margin_left = 10.0 +content_margin_right = 10.0 +bg_color = Color( 0.180392, 0.180392, 0.180392, 1 ) + +[sub_resource type="StyleBoxFlat" id=4] +content_margin_left = 10.0 +content_margin_right = 10.0 +bg_color = Color( 0.243137, 0.243137, 0.243137, 1 ) + +[sub_resource type="StyleBoxFlat" id=2] +content_margin_left = 5.0 +content_margin_right = 0.0 +bg_color = Color( 0.180392, 0.180392, 0.180392, 1 ) + +[sub_resource type="StyleBoxFlat" id=3] +bg_color = Color( 0.180392, 0.180392, 0.180392, 1 ) + [resource] default_font = ExtResource( 5 ) Button/colors/font_color = Color( 0.88, 0.88, 0.88, 1 ) @@ -19,3 +47,154 @@ Button/styles/focus = ExtResource( 4 ) Button/styles/hover = ExtResource( 2 ) Button/styles/normal = ExtResource( 3 ) Button/styles/pressed = ExtResource( 3 ) +LineEdit/colors/clear_button_color = Color( 0.88, 0.88, 0.88, 1 ) +LineEdit/colors/clear_button_color_pressed = Color( 1, 1, 1, 1 ) +LineEdit/colors/cursor_color = Color( 0.94, 0.94, 0.94, 1 ) +LineEdit/colors/font_color = Color( 0.88, 0.88, 0.88, 1 ) +LineEdit/colors/font_color_selected = Color( 0, 0, 0, 1 ) +LineEdit/colors/font_color_uneditable = Color( 0.88, 0.88, 0.88, 0.5 ) +LineEdit/colors/selection_color = Color( 0.180392, 0.180392, 0.180392, 1 ) +LineEdit/constants/minimum_spaces = 12 +LineEdit/fonts/font = null +LineEdit/icons/clear = null +LineEdit/styles/focus = null +LineEdit/styles/normal = SubResource( 1 ) +LineEdit/styles/read_only = null +OptionButton/colors/font_color = Color( 0.88, 0.88, 0.88, 1 ) +OptionButton/colors/font_color_disabled = Color( 0.9, 0.9, 0.9, 0.2 ) +OptionButton/colors/font_color_hover = Color( 0.94, 0.94, 0.94, 1 ) +OptionButton/colors/font_color_pressed = Color( 1, 1, 1, 1 ) +OptionButton/constants/arrow_margin = 2 +OptionButton/constants/hseparation = 2 +OptionButton/fonts/font = null +OptionButton/icons/arrow = null +OptionButton/styles/disabled = ExtResource( 1 ) +OptionButton/styles/focus = ExtResource( 4 ) +OptionButton/styles/hover = ExtResource( 2 ) +OptionButton/styles/normal = ExtResource( 3 ) +OptionButton/styles/pressed = null +PopupMenu/colors/font_color = Color( 0.88, 0.88, 0.88, 1 ) +PopupMenu/colors/font_color_accel = Color( 0.7, 0.7, 0.7, 0.8 ) +PopupMenu/colors/font_color_disabled = Color( 0.4, 0.4, 0.4, 0.8 ) +PopupMenu/colors/font_color_hover = Color( 0.88, 0.88, 0.88, 1 ) +PopupMenu/colors/font_color_separator = Color( 0.88, 0.88, 0.88, 1 ) +PopupMenu/constants/hseparation = 4 +PopupMenu/constants/vseparation = 4 +PopupMenu/fonts/font = null +PopupMenu/icons/checked = null +PopupMenu/icons/radio_checked = null +PopupMenu/icons/radio_unchecked = null +PopupMenu/icons/submenu = null +PopupMenu/icons/unchecked = null +PopupMenu/styles/hover = SubResource( 7 ) +PopupMenu/styles/labeled_separator_left = null +PopupMenu/styles/labeled_separator_right = null +PopupMenu/styles/panel = SubResource( 6 ) +PopupMenu/styles/panel_disabled = null +PopupMenu/styles/separator = null +Tabs/colors/font_color_bg = Color( 0.69, 0.69, 0.69, 1 ) +Tabs/colors/font_color_disabled = Color( 0.9, 0.9, 0.9, 0.2 ) +Tabs/colors/font_color_fg = Color( 0.94, 0.94, 0.94, 1 ) +Tabs/constants/hseparation = 4 +Tabs/constants/label_valign_bg = 2 +Tabs/constants/label_valign_fg = 0 +Tabs/constants/top_margin = 24 +Tabs/fonts/font = null +Tabs/icons/close = null +Tabs/icons/decrement = null +Tabs/icons/decrement_highlight = null +Tabs/icons/increment = null +Tabs/icons/increment_highlight = null +Tabs/styles/button = null +Tabs/styles/button_pressed = null +Tabs/styles/panel = null +Tabs/styles/tab_bg = SubResource( 5 ) +Tabs/styles/tab_disabled = null +Tabs/styles/tab_fg = SubResource( 4 ) +TextEdit/colors/background_color = Color( 0, 0, 0, 0 ) +TextEdit/colors/bookmark_color = Color( 0.08, 0.49, 0.98, 1 ) +TextEdit/colors/brace_mismatch_color = Color( 1, 0.2, 0.2, 1 ) +TextEdit/colors/breakpoint_color = Color( 0.8, 0.8, 0.4, 0.2 ) +TextEdit/colors/caret_background_color = Color( 0, 0, 0, 1 ) +TextEdit/colors/caret_color = Color( 0.88, 0.88, 0.88, 1 ) +TextEdit/colors/code_folding_color = Color( 0.8, 0.8, 0.8, 0.8 ) +TextEdit/colors/completion_background_color = Color( 0.17, 0.16, 0.2, 1 ) +TextEdit/colors/completion_existing_color = Color( 0.87, 0.87, 0.87, 0.13 ) +TextEdit/colors/completion_font_color = Color( 0.67, 0.67, 0.67, 1 ) +TextEdit/colors/completion_scroll_color = Color( 1, 1, 1, 1 ) +TextEdit/colors/completion_selected_color = Color( 0.26, 0.26, 0.27, 1 ) +TextEdit/colors/current_line_color = Color( 0.25, 0.25, 0.26, 0.8 ) +TextEdit/colors/executing_line_color = Color( 0.2, 0.8, 0.2, 0.4 ) +TextEdit/colors/font_color = Color( 0.88, 0.88, 0.88, 1 ) +TextEdit/colors/font_color_readonly = Color( 0.88, 0.88, 0.88, 0.5 ) +TextEdit/colors/font_color_selected = Color( 0, 0, 0, 1 ) +TextEdit/colors/function_color = Color( 0.4, 0.64, 0.81, 1 ) +TextEdit/colors/line_number_color = Color( 0.67, 0.67, 0.67, 0.4 ) +TextEdit/colors/mark_color = Color( 1, 0.4, 0.4, 0.4 ) +TextEdit/colors/member_variable_color = Color( 0.9, 0.31, 0.35, 1 ) +TextEdit/colors/number_color = Color( 0.92, 0.58, 0.2, 1 ) +TextEdit/colors/safe_line_number_color = Color( 0.67, 0.78, 0.67, 0.6 ) +TextEdit/colors/selection_color = Color( 0.49, 0.49, 0.49, 1 ) +TextEdit/colors/symbol_color = Color( 0.94, 0.94, 0.94, 1 ) +TextEdit/colors/word_highlighted_color = Color( 0.8, 0.9, 0.9, 0.15 ) +TextEdit/constants/completion_lines = 7 +TextEdit/constants/completion_max_width = 50 +TextEdit/constants/completion_scroll_width = 3 +TextEdit/constants/line_spacing = 4 +TextEdit/fonts/font = null +TextEdit/icons/ = null +TextEdit/icons/fold = null +TextEdit/icons/folded = null +TextEdit/icons/space = null +TextEdit/icons/tab = null +TextEdit/styles/completion = null +TextEdit/styles/focus = null +TextEdit/styles/normal = SubResource( 2 ) +TextEdit/styles/read_only = null +ToolButton/colors/font_color = Color( 0.88, 0.88, 0.88, 1 ) +ToolButton/colors/font_color_disabled = Color( 0.9, 0.95, 1, 0.3 ) +ToolButton/colors/font_color_hover = Color( 0.94, 0.94, 0.94, 1 ) +ToolButton/colors/font_color_pressed = Color( 1, 1, 1, 1 ) +ToolButton/constants/hseparation = 3 +ToolButton/fonts/font = null +ToolButton/styles/disabled = null +ToolButton/styles/focus = null +ToolButton/styles/hover = null +ToolButton/styles/normal = null +ToolButton/styles/pressed = null +Tree/colors/custom_button_font_highlight = Color( 0.94, 0.94, 0.94, 1 ) +Tree/colors/drop_position_color = Color( 1, 0.3, 0.2, 1 ) +Tree/colors/font_color = Color( 0.69, 0.69, 0.69, 1 ) +Tree/colors/font_color_selected = Color( 1, 1, 1, 1 ) +Tree/colors/guide_color = Color( 0, 0, 0, 0.1 ) +Tree/colors/relationship_line_color = Color( 0.27, 0.27, 0.27, 1 ) +Tree/colors/title_button_color = Color( 0.88, 0.88, 0.88, 1 ) +Tree/constants/button_margin = 4 +Tree/constants/draw_guides = 1 +Tree/constants/draw_relationship_lines = 0 +Tree/constants/hseparation = 4 +Tree/constants/item_margin = 12 +Tree/constants/scroll_border = 4 +Tree/constants/scroll_speed = 12 +Tree/constants/vseparation = 4 +Tree/fonts/font = null +Tree/fonts/title_button_font = null +Tree/icons/arrow = null +Tree/icons/arrow_collapsed = null +Tree/icons/checked = null +Tree/icons/select_arrow = null +Tree/icons/unchecked = null +Tree/icons/updown = null +Tree/styles/bg = SubResource( 3 ) +Tree/styles/bg_focus = null +Tree/styles/button_pressed = null +Tree/styles/cursor = null +Tree/styles/cursor_unfocused = null +Tree/styles/custom_button = ExtResource( 3 ) +Tree/styles/custom_button_hover = ExtResource( 2 ) +Tree/styles/custom_button_pressed = null +Tree/styles/selected = ExtResource( 4 ) +Tree/styles/selected_focus = ExtResource( 4 ) +Tree/styles/title_button_hover = null +Tree/styles/title_button_normal = null +Tree/styles/title_button_pressed = null From c710fe5abf10f96b46213335bcf4ea1bc06e12e0 Mon Sep 17 00:00:00 2001 From: Anton Lutteman Date: Tue, 30 Nov 2021 21:39:15 +0100 Subject: [PATCH 46/61] Refactor tabs Refactor of tabs with requests from Ruthger --- project/src/ui/code_editor/Tabs.gd | 35 ++++++++++++++---------------- 1 file changed, 16 insertions(+), 19 deletions(-) diff --git a/project/src/ui/code_editor/Tabs.gd b/project/src/ui/code_editor/Tabs.gd index 4e099b71..8ef2b10d 100644 --- a/project/src/ui/code_editor/Tabs.gd +++ b/project/src/ui/code_editor/Tabs.gd @@ -13,6 +13,16 @@ class fileinfo: var _savedContent: String var _cursorColumn: int var _cursorLine: int + + func _init(_index, _name, _path, _content, _savedContent, _cursorColumn, _cursorLine): + self._index = _index + self._name = _name + self._path = _path + self._content = _content + self._savedContent = _savedContent + self._cursorColumn = _cursorColumn + self._cursorLine = _cursorLine + #Function that Initializes the tabssystem func _ready(): @@ -28,14 +38,9 @@ func _create_new_tab_with_content(content,path): tabs.remove_tab(tabs.get_tab_count()-1); #Remove the + tab tabs.add_tab(name) #Add the actuall tab tabs.add_tab("+") #Add the + tab - var newFile = fileinfo.new() #Create an instance of fielinfo - newFile._index = tabs.get_tab_count()-2 - newFile._name = name - newFile._content = content - newFile._savedContent = content - newFile._path = path - newFile._cursorLine = 0 - newFile._cursorColumn = 0 + + #Create an instance of fielinfo + var newFile = fileinfo.new(tabs.get_tab_count()-2, name, content, content, path, 0, 0) mainControl.fileInfos[newFile._index] = newFile #Store the info in memory tabs.current_tab = newFile._index #Switch to the correct tab _show_new_file(newFile) #Display the file content @@ -113,6 +118,7 @@ func _on_Tabs_tab_close(tab): popup.confirmation("The tab you are trying to close is not saved!\nDo you wish to proceed?") yield(popup,"click") var choice = popup.choiseRet() + popup.queue_free() if(!choice): return @@ -139,13 +145,7 @@ func _on_Tabs_tab_close(tab): func _is_saved(): var fileInfo = mainControl.fileInfos[tabs.current_tab] - if(fileInfo._savedContent == fileInfo._content): - #print("EQUAL") - return true; - else: - #print("NOT EQUAL") - return false; - + return fileInfo._savedContent == fileInfo._content func _on_TextEditor_text_changed(): @@ -154,7 +154,4 @@ func _on_TextEditor_text_changed(): func _update_saved_status(): _save_tab_content() var fileInfo = mainControl.fileInfos[tabs.current_tab] - if(_is_saved()): - tabs.set_tab_title(current_tab,fileInfo._name) - else: - tabs.set_tab_title(current_tab,fileInfo._name+"*") + tabs.set_tab_title(current_tab,fileInfo._name + "" if _is_saved() else fileInfo._name + "*") From b4b7c803af8e817ad926e9bf8ba4993a366d4d47 Mon Sep 17 00:00:00 2001 From: Anthony1911 Date: Thu, 2 Dec 2021 10:55:44 +0100 Subject: [PATCH 47/61] Renaming --- project/src/ui/popup/popup_window.gd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/src/ui/popup/popup_window.gd b/project/src/ui/popup/popup_window.gd index a51926b1..00c57b86 100644 --- a/project/src/ui/popup/popup_window.gd +++ b/project/src/ui/popup/popup_window.gd @@ -58,7 +58,7 @@ func _buttonNo_pressed() -> void: queue_free() # Returns user's choice (only for confirmation popup) -func choice_Ret(): +func choice_ret(): return choice From feafe231bacccf974c69c02c1406a07c66d5a3e2 Mon Sep 17 00:00:00 2001 From: Anthony1911 Date: Thu, 2 Dec 2021 11:08:58 +0100 Subject: [PATCH 48/61] Added several "Ctrl"-related shortcuts Save file, close tab, new project, new file, open file, quit editor, comment/uncomment line etc. --- project/src/ui/code_editor/MainWindow.gd | 49 +++++++++++++++++++++++- 1 file changed, 47 insertions(+), 2 deletions(-) diff --git a/project/src/ui/code_editor/MainWindow.gd b/project/src/ui/code_editor/MainWindow.gd index 92b41a10..c9736bdf 100644 --- a/project/src/ui/code_editor/MainWindow.gd +++ b/project/src/ui/code_editor/MainWindow.gd @@ -53,16 +53,61 @@ func _on_compile() -> void: func enableEditor() -> void: set_visible(true) -# Limit line length +# Limit line length + handle shortcuts func _input(event): if event is InputEventKey and event.pressed: var line = textEditor.cursor_get_line() var s = textEditor.get_line(line) - if (event.as_text() == "Tab" && lineLimit.text != "" && s.length()>=(int(lineLimit.text)-1) && int(lineLimit.text) >= 10): + var tb = get_node("Tabs").return_tab() + if ((event.as_text() == "Tab" || event.as_text() == "Control+V") && lineLimit.text != "" && s.length()>=(int(lineLimit.text)-1) && int(lineLimit.text) >= 10): textEditor.get_tree().set_input_as_handled() + if "Control" in event.as_text(): + if (event.as_text() == "Control+S"): # save file + _save_file() + if (event.as_text() == "Control+W" && fileInfos.size() !=0): # close current tab + get_node("Tabs")._on_Tabs_tab_close(tb) + if (event.as_text() == "Control+N"): #new file in tab + _new_file() + if (event.as_text() == "Control+P"): #new project + _new_proj() + if (event.as_text() == "Control+O"): #open file + _open_file() + if (event.as_text() == "Control+Slash"): #comment/uncomment line + if "//" in s: + var result = textEditor.search("//", 0, line, 0) + if result.size() > 0: + #var res_line = result[TextEdit.SEARCH_RESULT_LINE] + var result_column = result[TextEdit.SEARCH_RESULT_COLUMN] + textEditor.select(line, result_column, line, result_column+2) + textEditor.insert_text_at_cursor("") + else : + textEditor.cursor_set_column(0) + textEditor.insert_text_at_cursor("//") + if (event.as_text() == "Control+Q"): + _on_close() + var cmdArr = (event.as_text().rsplit("+", true, 1)) + if (event.as_text() == "Control+J"): # switch between tabs, one by one + if (tb>=fileInfos.size()-1): + get_node("Tabs")._save_tab_content() + get_node("Tabs")._show_new_file(fileInfos[0]) + get_node("Tabs").switch_tab(0) + if (tb=int(lineLimit.text) && int(lineLimit.text) >= 10): textEditor.get_tree().set_input_as_handled() # ignore key press after limit + # Function to handle dropdown menu button options # Options to open and save file From c38cdf86cb285fd04589f2b7afd4571c3e1508c8 Mon Sep 17 00:00:00 2001 From: Anthony1911 Date: Thu, 2 Dec 2021 11:10:18 +0100 Subject: [PATCH 49/61] Added methods for shortcut commands --- project/src/ui/code_editor/Tabs.gd | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/project/src/ui/code_editor/Tabs.gd b/project/src/ui/code_editor/Tabs.gd index 4e099b71..eb61ec15 100644 --- a/project/src/ui/code_editor/Tabs.gd +++ b/project/src/ui/code_editor/Tabs.gd @@ -40,6 +40,14 @@ func _create_new_tab_with_content(content,path): tabs.current_tab = newFile._index #Switch to the correct tab _show_new_file(newFile) #Display the file content + +#Two methods for shortcut commands +func switch_tab(tabN): + tabs.current_tab = tabN + +func return_tab(): + return current_tab + #Displays a new file of the type fileInfo func _show_new_file(file): if(file == null): From 7a7a001eed9bb3a3f1626800c8faa6d3523eb617 Mon Sep 17 00:00:00 2001 From: Anthony1911 Date: Thu, 2 Dec 2021 11:27:40 +0100 Subject: [PATCH 50/61] Update reference --- project/src/ui/code_editor/FileTree.gd | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/project/src/ui/code_editor/FileTree.gd b/project/src/ui/code_editor/FileTree.gd index f9f5b8bc..981dcbda 100644 --- a/project/src/ui/code_editor/FileTree.gd +++ b/project/src/ui/code_editor/FileTree.gd @@ -92,7 +92,7 @@ func delete_file(path, file_name): get_tree().root.add_child(popup) popup.confirmation('Are you sure you want to delete: ' + file_name + '?') yield(popup,"click") - var accept = popup.choiseRet() + var accept = popup.choice_ret() if accept: var dir = Directory.new() dir.remove(path) @@ -107,5 +107,5 @@ func delete_file(path, file_name): # Either popup.confirmation("your message") OR popup.info("your message") # Following only for confirmation popup: # yield(popup,"click") -# var h = popup.choiseRet() - "no" = false, "yes" = true +# var h = popup.choice_ret() - "no" = false, "yes" = true # From 590a58e96b22603455ef3375223c2b20975295e2 Mon Sep 17 00:00:00 2001 From: Anthony1911 Date: Thu, 2 Dec 2021 11:28:18 +0100 Subject: [PATCH 51/61] Update reference --- project/src/ui/code_editor/Tabs.gd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/src/ui/code_editor/Tabs.gd b/project/src/ui/code_editor/Tabs.gd index 4e099b71..e0405011 100644 --- a/project/src/ui/code_editor/Tabs.gd +++ b/project/src/ui/code_editor/Tabs.gd @@ -112,7 +112,7 @@ func _on_Tabs_tab_close(tab): get_tree().root.add_child(popup) popup.confirmation("The tab you are trying to close is not saved!\nDo you wish to proceed?") yield(popup,"click") - var choice = popup.choiseRet() + var choice = popup.choice_ret() if(!choice): return From 260cccd4ba3795a8e7baaaccc402d2da23c1c4c4 Mon Sep 17 00:00:00 2001 From: Anthony1911 Date: Thu, 2 Dec 2021 11:28:43 +0100 Subject: [PATCH 52/61] Update --- project/src/ui/popup/popup_window.gd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/src/ui/popup/popup_window.gd b/project/src/ui/popup/popup_window.gd index 00c57b86..51bcaedf 100644 --- a/project/src/ui/popup/popup_window.gd +++ b/project/src/ui/popup/popup_window.gd @@ -8,7 +8,7 @@ extends Popup # Either popup.confirmation("your message") OR popup.info("your message") # Following only for confirmation popup: # yield(popup,"click") -# var h = popup.choiseRet() - "no" = false, "yes" = true +# var h = popup.choice_ret() - "no" = false, "yes" = true # onready var buttonOK = $Panel/btnContainer/buttonOK # for information popup From 0548cdcb9c5e884105a3df5721c29ac75d42139e Mon Sep 17 00:00:00 2001 From: Mahan V Date: Thu, 2 Dec 2021 12:35:53 +0100 Subject: [PATCH 53/61] Revert "Added several "Ctrl"-related shortcuts" --- project/src/ui/code_editor/MainWindow.gd | 49 +----------------------- project/src/ui/code_editor/Tabs.gd | 8 ---- 2 files changed, 2 insertions(+), 55 deletions(-) diff --git a/project/src/ui/code_editor/MainWindow.gd b/project/src/ui/code_editor/MainWindow.gd index 137bde57..37a85646 100644 --- a/project/src/ui/code_editor/MainWindow.gd +++ b/project/src/ui/code_editor/MainWindow.gd @@ -57,61 +57,16 @@ func _on_compile() -> void: func enableEditor() -> void: set_visible(true) -# Limit line length + handle shortcuts +# Limit line length func _input(event): if event is InputEventKey and event.pressed: var line = textEditor.cursor_get_line() var s = textEditor.get_line(line) - var tb = get_node("Tabs").return_tab() - if ((event.as_text() == "Tab" || event.as_text() == "Control+V") && lineLimit.text != "" && s.length()>=(int(lineLimit.text)-1) && int(lineLimit.text) >= 10): + if (event.as_text() == "Tab" && lineLimit.text != "" && s.length()>=(int(lineLimit.text)-1) && int(lineLimit.text) >= 10): textEditor.get_tree().set_input_as_handled() - if "Control" in event.as_text(): - if (event.as_text() == "Control+S"): # save file - _save_file() - if (event.as_text() == "Control+W" && fileInfos.size() !=0): # close current tab - get_node("Tabs")._on_Tabs_tab_close(tb) - if (event.as_text() == "Control+N"): #new file in tab - _new_file() - if (event.as_text() == "Control+P"): #new project - _new_proj() - if (event.as_text() == "Control+O"): #open file - _open_file() - if (event.as_text() == "Control+Slash"): #comment/uncomment line - if "//" in s: - var result = textEditor.search("//", 0, line, 0) - if result.size() > 0: - #var res_line = result[TextEdit.SEARCH_RESULT_LINE] - var result_column = result[TextEdit.SEARCH_RESULT_COLUMN] - textEditor.select(line, result_column, line, result_column+2) - textEditor.insert_text_at_cursor("") - else : - textEditor.cursor_set_column(0) - textEditor.insert_text_at_cursor("//") - if (event.as_text() == "Control+Q"): - _on_close() - var cmdArr = (event.as_text().rsplit("+", true, 1)) - if (event.as_text() == "Control+J"): # switch between tabs, one by one - if (tb>=fileInfos.size()-1): - get_node("Tabs")._save_tab_content() - get_node("Tabs")._show_new_file(fileInfos[0]) - get_node("Tabs").switch_tab(0) - if (tb=int(lineLimit.text) && int(lineLimit.text) >= 10): textEditor.get_tree().set_input_as_handled() # ignore key press after limit - # Function to handle dropdown menu button options # Options to open and save file diff --git a/project/src/ui/code_editor/Tabs.gd b/project/src/ui/code_editor/Tabs.gd index 2a4c7ef9..be331b57 100644 --- a/project/src/ui/code_editor/Tabs.gd +++ b/project/src/ui/code_editor/Tabs.gd @@ -45,14 +45,6 @@ func _create_new_tab_with_content(content,path): tabs.current_tab = newFile._index #Switch to the correct tab _show_new_file(newFile) #Display the file content - -#Two methods for shortcut commands -func switch_tab(tabN): - tabs.current_tab = tabN - -func return_tab(): - return current_tab - #Displays a new file of the type fileInfo func _show_new_file(file): if(file == null): From 2c4a143004d2af42d127e8985dbe4cbda7a9b8e8 Mon Sep 17 00:00:00 2001 From: Mahan Date: Thu, 2 Dec 2021 13:10:29 +0100 Subject: [PATCH 54/61] Styling added for popup window --- project/src/ui/popup/popup_window.tscn | 8 +++-- .../themes/regular_button/regular_button.tres | 30 +++++++++++-------- 2 files changed, 23 insertions(+), 15 deletions(-) diff --git a/project/src/ui/popup/popup_window.tscn b/project/src/ui/popup/popup_window.tscn index faa3c91b..861cb219 100644 --- a/project/src/ui/popup/popup_window.tscn +++ b/project/src/ui/popup/popup_window.tscn @@ -1,10 +1,10 @@ -[gd_scene load_steps=3 format=2] +[gd_scene load_steps=4 format=2] [ext_resource path="res://src/ui/popup/popup_window.gd" type="Script" id=1] [ext_resource path="res://media/fonts/Open_Sans/OpenSasn-Regular-Popup.tres" type="DynamicFont" id=2] +[ext_resource path="res://src/ui/themes/regular_button/regular_button.tres" type="Theme" id=3] [node name="Control" type="Popup"] -visible = true anchor_right = 1.0 anchor_bottom = 1.0 margin_left = -0.963871 @@ -19,6 +19,7 @@ margin_left = 511.0 margin_top = 311.0 margin_right = 793.0 margin_bottom = 480.0 +theme = ExtResource( 3 ) __meta__ = { "_edit_use_anchors_": false } @@ -29,6 +30,7 @@ margin_top = 440.496 margin_right = 720.205 margin_bottom = 484.496 rect_scale = Vector2( 0.7, 0.7 ) +theme = ExtResource( 3 ) text = "OK" __meta__ = { "_edit_use_anchors_": false @@ -41,6 +43,7 @@ margin_right = 588.932 margin_bottom = 471.36 rect_scale = Vector2( 0.7, 0.7 ) rect_pivot_offset = Vector2( 97, 48 ) +theme = ExtResource( 3 ) text = "Yes" __meta__ = { "_edit_use_anchors_": false @@ -52,6 +55,7 @@ margin_top = 438.496 margin_right = 810.684 margin_bottom = 486.496 rect_scale = Vector2( 0.7, 0.7 ) +theme = ExtResource( 3 ) text = "No" __meta__ = { "_edit_use_anchors_": false diff --git a/project/src/ui/themes/regular_button/regular_button.tres b/project/src/ui/themes/regular_button/regular_button.tres index dab3397c..ff8a3f8e 100644 --- a/project/src/ui/themes/regular_button/regular_button.tres +++ b/project/src/ui/themes/regular_button/regular_button.tres @@ -1,4 +1,4 @@ -[gd_resource type="Theme" load_steps=13 format=2] +[gd_resource type="Theme" load_steps=14 format=2] [ext_resource path="res://src/ui/themes/regular_button/disabled.tres" type="StyleBox" id=1] [ext_resource path="res://src/ui/themes/regular_button/hover.tres" type="StyleBox" id=2] @@ -10,28 +10,31 @@ content_margin_left = 10.0 bg_color = Color( 0.180392, 0.180392, 0.180392, 1 ) -[sub_resource type="StyleBoxFlat" id=7] +[sub_resource type="StyleBoxFlat" id=8] +bg_color = Color( 0.117647, 0.117647, 0.117647, 1 ) + +[sub_resource type="StyleBoxFlat" id=2] bg_color = Color( 0.243137, 0.243137, 0.243137, 1 ) -[sub_resource type="StyleBoxFlat" id=6] +[sub_resource type="StyleBoxFlat" id=3] bg_color = Color( 0.117647, 0.117647, 0.117647, 1 ) -[sub_resource type="StyleBoxFlat" id=5] +[sub_resource type="StyleBoxFlat" id=4] content_margin_left = 10.0 content_margin_right = 10.0 bg_color = Color( 0.180392, 0.180392, 0.180392, 1 ) -[sub_resource type="StyleBoxFlat" id=4] +[sub_resource type="StyleBoxFlat" id=5] content_margin_left = 10.0 content_margin_right = 10.0 bg_color = Color( 0.243137, 0.243137, 0.243137, 1 ) -[sub_resource type="StyleBoxFlat" id=2] +[sub_resource type="StyleBoxFlat" id=6] content_margin_left = 5.0 content_margin_right = 0.0 bg_color = Color( 0.180392, 0.180392, 0.180392, 1 ) -[sub_resource type="StyleBoxFlat" id=3] +[sub_resource type="StyleBoxFlat" id=7] bg_color = Color( 0.180392, 0.180392, 0.180392, 1 ) [resource] @@ -73,6 +76,7 @@ OptionButton/styles/focus = ExtResource( 4 ) OptionButton/styles/hover = ExtResource( 2 ) OptionButton/styles/normal = ExtResource( 3 ) OptionButton/styles/pressed = null +Panel/styles/panel = SubResource( 8 ) PopupMenu/colors/font_color = Color( 0.88, 0.88, 0.88, 1 ) PopupMenu/colors/font_color_accel = Color( 0.7, 0.7, 0.7, 0.8 ) PopupMenu/colors/font_color_disabled = Color( 0.4, 0.4, 0.4, 0.8 ) @@ -86,10 +90,10 @@ PopupMenu/icons/radio_checked = null PopupMenu/icons/radio_unchecked = null PopupMenu/icons/submenu = null PopupMenu/icons/unchecked = null -PopupMenu/styles/hover = SubResource( 7 ) +PopupMenu/styles/hover = SubResource( 2 ) PopupMenu/styles/labeled_separator_left = null PopupMenu/styles/labeled_separator_right = null -PopupMenu/styles/panel = SubResource( 6 ) +PopupMenu/styles/panel = SubResource( 3 ) PopupMenu/styles/panel_disabled = null PopupMenu/styles/separator = null Tabs/colors/font_color_bg = Color( 0.69, 0.69, 0.69, 1 ) @@ -108,9 +112,9 @@ Tabs/icons/increment_highlight = null Tabs/styles/button = null Tabs/styles/button_pressed = null Tabs/styles/panel = null -Tabs/styles/tab_bg = SubResource( 5 ) +Tabs/styles/tab_bg = SubResource( 4 ) Tabs/styles/tab_disabled = null -Tabs/styles/tab_fg = SubResource( 4 ) +Tabs/styles/tab_fg = SubResource( 5 ) TextEdit/colors/background_color = Color( 0, 0, 0, 0 ) TextEdit/colors/bookmark_color = Color( 0.08, 0.49, 0.98, 1 ) TextEdit/colors/brace_mismatch_color = Color( 1, 0.2, 0.2, 1 ) @@ -149,7 +153,7 @@ TextEdit/icons/space = null TextEdit/icons/tab = null TextEdit/styles/completion = null TextEdit/styles/focus = null -TextEdit/styles/normal = SubResource( 2 ) +TextEdit/styles/normal = SubResource( 6 ) TextEdit/styles/read_only = null ToolButton/colors/font_color = Color( 0.88, 0.88, 0.88, 1 ) ToolButton/colors/font_color_disabled = Color( 0.9, 0.95, 1, 0.3 ) @@ -185,7 +189,7 @@ Tree/icons/checked = null Tree/icons/select_arrow = null Tree/icons/unchecked = null Tree/icons/updown = null -Tree/styles/bg = SubResource( 3 ) +Tree/styles/bg = SubResource( 7 ) Tree/styles/bg_focus = null Tree/styles/button_pressed = null Tree/styles/cursor = null From 810aeb3850fbc2826a80ab0191ee37478eaaab16 Mon Sep 17 00:00:00 2001 From: Anthony1911 Date: Thu, 2 Dec 2021 13:22:59 +0100 Subject: [PATCH 55/61] Enable ctrl shortcuts Improved version --- project/src/ui/code_editor/MainWindow.gd | 50 +++++++++++++++++++++++- 1 file changed, 48 insertions(+), 2 deletions(-) diff --git a/project/src/ui/code_editor/MainWindow.gd b/project/src/ui/code_editor/MainWindow.gd index 37a85646..6faccc7c 100644 --- a/project/src/ui/code_editor/MainWindow.gd +++ b/project/src/ui/code_editor/MainWindow.gd @@ -57,16 +57,62 @@ func _on_compile() -> void: func enableEditor() -> void: set_visible(true) -# Limit line length +# Limit line length + shortcuts func _input(event): if event is InputEventKey and event.pressed: var line = textEditor.cursor_get_line() var s = textEditor.get_line(line) - if (event.as_text() == "Tab" && lineLimit.text != "" && s.length()>=(int(lineLimit.text)-1) && int(lineLimit.text) >= 10): + var tb = tabs.return_tab() + if ((event.as_text() == "Tab" || event.as_text() == "Control+V") && lineLimit.text != "" && s.length()>=(int(lineLimit.text)-1) && int(lineLimit.text) >= 10): textEditor.get_tree().set_input_as_handled() + if "Control" in event.as_text(): + if (event.as_text() == "Control+W" && fileInfos.size() !=0): # close current tab + tabs._on_Tabs_tab_close(tb) + match event.as_text(): + "Control+S": # save file + _save_file() + "Control+N": #new file in tab + _new_file() + "Control+P": #new project + _new_proj() + "Control+O": #open file + _open_file() + "Control+Slash": #comment/uncomment line + if "//" in s: + var result = textEditor.search("//", 0, line, 0) + if result.size() > 0: + #var res_line = result[TextEdit.SEARCH_RESULT_LINE] + var result_column = result[TextEdit.SEARCH_RESULT_COLUMN] + textEditor.select(line, result_column, line, result_column+2) + textEditor.insert_text_at_cursor("") + else : + textEditor.cursor_set_column(0) + textEditor.insert_text_at_cursor("//") + "Control+Q": + _on_close() + var cmdArr = (event.as_text().rsplit("+", true, 1)) + if (event.as_text() == "Control+J"): # switch between tabs, one by one + if (tb>=fileInfos.size()-1): + tabs._save_tab_content() + tabs._show_new_file(fileInfos[0]) + tabs.switch_tab(0) + if (tb=int(lineLimit.text) && int(lineLimit.text) >= 10): textEditor.get_tree().set_input_as_handled() # ignore key press after limit + # Function to handle dropdown menu button options # Options to open and save file From 9b83058fc0a52a3c573a9175b0cf8adf3d20e920 Mon Sep 17 00:00:00 2001 From: Anthony1911 Date: Thu, 2 Dec 2021 13:24:04 +0100 Subject: [PATCH 56/61] Methods for ctrl shortcuts --- project/src/ui/code_editor/Tabs.gd | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/project/src/ui/code_editor/Tabs.gd b/project/src/ui/code_editor/Tabs.gd index be331b57..f2376722 100644 --- a/project/src/ui/code_editor/Tabs.gd +++ b/project/src/ui/code_editor/Tabs.gd @@ -64,6 +64,15 @@ func _show_new_file(file): mainControl.textEditor.cursor_set_column(file._cursorColumn) mainControl.currentFileInfo = file + +#Two methods for shortcut commands +func switch_tab(tabN): + tabs.current_tab = tabN + +func return_tab(): + return current_tab + + #Save the content of the file in memory (An array of fileInfo class objects) func _save_tab_content(): if(mainControl.currentFileInfo != null): From 4c69bfc5caa567781e860891d05af992de6b6a33 Mon Sep 17 00:00:00 2001 From: akjeller Date: Thu, 2 Dec 2021 13:53:42 +0100 Subject: [PATCH 57/61] Change to null check instead of saving variable --- project/src/ui/hud/SmceHud.gd | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/project/src/ui/hud/SmceHud.gd b/project/src/ui/hud/SmceHud.gd index ec59fc99..32fda1a6 100644 --- a/project/src/ui/hud/SmceHud.gd +++ b/project/src/ui/hud/SmceHud.gd @@ -38,8 +38,7 @@ onready var profile_screen_toggle = $ProfileScreentoggle var button_group: BButtonGroup = BButtonGroup.new() -var code_editor = code_main_window_t.instance() -var code_editor_initialized = 0 +var code_editor = null var buttons: Array = [] var paths: Dictionary = {} @@ -95,11 +94,11 @@ func _set_vis(visible, node = null) -> void: func _on_edit_btn() -> void: get_focus_owner().release_focus() - if (code_editor_initialized==0): + if (code_editor == null): + code_editor = code_main_window_t.instance() get_tree().root.add_child(code_editor) - code_editor_initialized = 1 - - code_editor.enableEditor() + else: + code_editor.enableEditor() func _on_sketch_btn() -> void: get_focus_owner().release_focus() From f8cfcb3c67f69f5c340073397ca0e13d51318bfd Mon Sep 17 00:00:00 2001 From: Anton Lutteman Date: Thu, 2 Dec 2021 13:58:02 +0100 Subject: [PATCH 58/61] -.- -.- --- project/src/ui/file_dialog/FilePicker.tscn | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/project/src/ui/file_dialog/FilePicker.tscn b/project/src/ui/file_dialog/FilePicker.tscn index e8561ae3..476ea478 100644 --- a/project/src/ui/file_dialog/FilePicker.tscn +++ b/project/src/ui/file_dialog/FilePicker.tscn @@ -30,8 +30,8 @@ mode_overrides_title = false mode = 0 access = 2 filters = PoolStringArray( "*.ino", "*.pde" ) -current_dir = "/home/ruthgerd/Sources/godot-smce/project" -current_path = "/home/ruthgerd/Sources/godot-smce/project/" +current_dir = "/Users/Anton/Desktop/MPSOF-1/DAT265/group10/group-10-smce-gd/project" +current_path = "/Users/Anton/Desktop/MPSOF-1/DAT265/group10/group-10-smce-gd/project/" __meta__ = { "_edit_use_anchors_": false } From 9ddc50bc061c337f3a2fa269b5c9c92ad883e624 Mon Sep 17 00:00:00 2001 From: Anton Lutteman Date: Thu, 2 Dec 2021 14:15:19 +0100 Subject: [PATCH 59/61] Bug fixed Bug fix for init function, variables in wrong order --- project/src/ui/code_editor/Tabs.gd | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/project/src/ui/code_editor/Tabs.gd b/project/src/ui/code_editor/Tabs.gd index 8ef2b10d..bfeacc28 100644 --- a/project/src/ui/code_editor/Tabs.gd +++ b/project/src/ui/code_editor/Tabs.gd @@ -23,6 +23,7 @@ class fileinfo: self._cursorColumn = _cursorColumn self._cursorLine = _cursorLine + #Function that Initializes the tabssystem func _ready(): @@ -40,7 +41,7 @@ func _create_new_tab_with_content(content,path): tabs.add_tab("+") #Add the + tab #Create an instance of fielinfo - var newFile = fileinfo.new(tabs.get_tab_count()-2, name, content, content, path, 0, 0) + var newFile = fileinfo.new(tabs.get_tab_count()-2, name, path, content, content, 0, 0) mainControl.fileInfos[newFile._index] = newFile #Store the info in memory tabs.current_tab = newFile._index #Switch to the correct tab _show_new_file(newFile) #Display the file content From 96d4e89f68d9bf85bf88648051d565c4e1e50e3c Mon Sep 17 00:00:00 2001 From: Mahan Date: Thu, 2 Dec 2021 14:23:54 +0100 Subject: [PATCH 60/61] Fixes * use match syntax, also maybe use an enum instead so that you dont have to compare text * please use enums for this * you need to check if open returned success, omit the file existence check and directly open the file *Fixed bug where creating a new file without extension would crash the program --- project/Entry.gd | 4 +++ project/src/ui/code_editor/MainWindow.gd | 40 ++++++++++++---------- project/src/ui/code_editor/MainWindow.tscn | 17 +++------ project/src/ui/code_editor/Tabs.gd | 14 +++++--- project/src/ui/file_dialog/FileLoader.gd | 5 ++- 5 files changed, 44 insertions(+), 36 deletions(-) diff --git a/project/Entry.gd b/project/Entry.gd index 9a6d259e..b9be42ec 100644 --- a/project/Entry.gd +++ b/project/Entry.gd @@ -103,3 +103,7 @@ func _error(message: String) -> void: func _on_clipboard_copy() -> void: OS.clipboard = error + + + + diff --git a/project/src/ui/code_editor/MainWindow.gd b/project/src/ui/code_editor/MainWindow.gd index 6faccc7c..0565709a 100644 --- a/project/src/ui/code_editor/MainWindow.gd +++ b/project/src/ui/code_editor/MainWindow.gd @@ -17,10 +17,13 @@ var fileInfos = {} #Keeps track of all fileInfo objects var tree_filled = false var sketch_owner = null + + #SAVES CURRENT STATE OF filedialog operation #Can have the following values: # OPEN NEWFILE SAVE NEWPROJ -onready var fileDialogOperation: String = "" +onready var fileDialogOperation: int = -1 +enum {fdo_NEWPROJ,fdo_NEWFILE,fdo_OPEN,fdo_NONE} onready var fileLoader = load("res://src/ui/file_dialog/FileLoader.gd").new() # Called when the node enters the scene tree for the first time. @@ -118,25 +121,26 @@ func _input(event): # Options to open and save file func _on_item_pressed(id): var name = dropdown_btn.get_popup().get_item_text(id) - if name == "Open File": - _open_file() - elif name == "Save File": - _save_file() - elif name == "New File": - _new_file() - elif name == "New Arduino-Project": - _new_proj() - elif name == "Close": - _on_close() + match name: + "Open File": + _open_file() + "Save File": + _save_file() + "New File": + _new_file() + "New Arduino-Project": + _new_proj() + "Close": + _on_close() func _open_file(): - fileDialogOperation = "OPEN" + fileDialogOperation = fdo_OPEN fileDialog.mode = fileDialog.MODE_OPEN_FILE #Change mode back to open file fileDialog.popup() # Opens file dialog for file selection #Function to create a new file func _new_file(): - fileDialogOperation = "NEWFILE" + fileDialogOperation = fdo_NEWFILE fileDialog.mode = fileDialog.MODE_SAVE_FILE #Change mode to open dir fileDialog.add_filter("*.ino; ino file") fileDialog.popup() #Get path for new file @@ -144,7 +148,7 @@ func _new_file(): #Function to create a new file func _new_proj(): - fileDialogOperation = "NEWPROJ" + fileDialogOperation = fdo_NEWPROJ fileDialog.mode = fileDialog.MODE_SAVE_FILE #Change mode to open dir fileDialog.add_filter("*.ino; ino file") fileDialog.popup() #Get path for new file @@ -155,15 +159,15 @@ func _on_FileDialog_file_selected(path): if(src_file == null): src_file = path - if(fileDialogOperation == "OPEN"): - fileDialogOperation = "" + if(fileDialogOperation == fdo_OPEN): + fileDialogOperation = fdo_NONE _load_content(path) - elif(fileDialogOperation == "NEWFILE" ): + elif(fileDialogOperation == fdo_NEWFILE ): tabs._create_new_tab_with_content("",path) _save_file() - elif(fileDialogOperation == "NEWPROJ"): + elif(fileDialogOperation == fdo_NEWPROJ): var template = fileLoader.loadFile("res://NewArduinoTemplate.txt") var finalPath = path+"/"+path.get_file()+".ino" Directory.new().make_dir_recursive (path) diff --git a/project/src/ui/code_editor/MainWindow.tscn b/project/src/ui/code_editor/MainWindow.tscn index 891279a8..71310295 100644 --- a/project/src/ui/code_editor/MainWindow.tscn +++ b/project/src/ui/code_editor/MainWindow.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=18 format=2] +[gd_scene load_steps=19 format=2] [ext_resource path="res://src/ui/code_editor/MainWindow.gd" type="Script" id=1] [ext_resource path="res://src/ui/code_editor/Tabs.gd" type="Script" id=2] @@ -10,15 +10,6 @@ bg_color = Color( 0, 0, 0, 0 ) border_color = Color( 0, 0.478431, 0.8, 1 ) -[sub_resource type="StyleBoxFlat" id=1] -content_margin_left = 8.0 -content_margin_right = 8.0 -content_margin_top = 6.0 -content_margin_bottom = 6.0 -bg_color = Color( 0.368627, 0.368627, 0.368627, 0.231373 ) -border_width_bottom = 2 -border_color = Color( 0.27451, 0.27451, 0.27451, 1 ) - [sub_resource type="StyleBoxFlat" id=2] content_margin_left = 8.0 content_margin_right = 8.0 @@ -234,12 +225,12 @@ margin_top = 105.0 margin_right = 1078.24 margin_bottom = 539.0 theme = SubResource( 13 ) -window_title = "Öppna en Fil" +window_title = "Open a File" resizable = true mode = 0 access = 2 -current_dir = "/Users/Anton/Desktop/MPSOF-1/DAT265/group10/group-10-smce-gd/project" -current_path = "/Users/Anton/Desktop/MPSOF-1/DAT265/group10/group-10-smce-gd/project/" +current_dir = "/SCHOOL/MPSOF-1/Year2/LP1/SoftEv/GITKRAKEN/group-10-smce-gd/project" +current_path = "/SCHOOL/MPSOF-1/Year2/LP1/SoftEv/GITKRAKEN/group-10-smce-gd/project/" __meta__ = { "_edit_use_anchors_": false } diff --git a/project/src/ui/code_editor/Tabs.gd b/project/src/ui/code_editor/Tabs.gd index f2376722..323ca20d 100644 --- a/project/src/ui/code_editor/Tabs.gd +++ b/project/src/ui/code_editor/Tabs.gd @@ -5,6 +5,8 @@ onready var mainControl: Node = get_owner() onready var tabs: Tabs = self onready var popupWindow = preload("res://src/ui/popup/popup_window.tscn") +enum {fdo_NEWPROJ,fdo_NEWFILE,fdo_OPEN} + class fileinfo: var _index: int var _name: String @@ -53,12 +55,16 @@ func _show_new_file(file): return #Enables syntax highlighting only for Arduino files - var format = (file._name.rsplit(".", true, 1))[1] - if (format == "ino" || format == "h" || format == "pde" || format == "cpp" || format == "c"): - mainControl.textEditor.syntax_highlighting = true + var format = (file._name.rsplit(".", true, 1)) + if(format.size() > 1): + print(format) + format = format[1] + if (format == "ino" || format == "h" || format == "pde" || format == "cpp" || format == "c"): + mainControl.textEditor.syntax_highlighting = true else: mainControl.textEditor.syntax_highlighting = false + mainControl.textEditor.text = file._content mainControl.textEditor.cursor_set_line(file._cursorLine) mainControl.textEditor.cursor_set_column(file._cursorColumn) @@ -96,7 +102,7 @@ func _on_Tabs_tab_changed(tab): func _on_Tabs_tab_clicked(tab): #Open file menu if pressed + if(tabs.get_tab_title(tabs.current_tab) == "+"): - mainControl.fileDialogOperation = "OPEN" + mainControl.fileDialogOperation = fdo_OPEN mainControl.fileDialog.popup() return diff --git a/project/src/ui/file_dialog/FileLoader.gd b/project/src/ui/file_dialog/FileLoader.gd index 791faf66..addac909 100644 --- a/project/src/ui/file_dialog/FileLoader.gd +++ b/project/src/ui/file_dialog/FileLoader.gd @@ -12,7 +12,10 @@ static func loadFile(filepath: String): var f = File.new() if f.file_exists(filepath): - f.open(filepath, File.READ) + var err = f.open(filepath, File.READ) + if err != OK: + print("Failed openning file",err) + return null var content = "" while not f.eof_reached(): var contentFragment = f.get_line() From c9088000daf5687de81c35500039751a9eb052d4 Mon Sep 17 00:00:00 2001 From: Mahan Date: Thu, 9 Dec 2021 19:09:22 +0100 Subject: [PATCH 61/61] Small fixes read description Fixed the following issues *Popup panel theme *Fix crash on editing initial prompt *Added panel color to theme .tres --- project/src/ui/code_editor/Tabs.gd | 2 ++ project/src/ui/popup/popup_window.tscn | 29 +++++++++++-------- .../themes/regular_button/regular_button.tres | 29 ++++++++++--------- 3 files changed, 34 insertions(+), 26 deletions(-) diff --git a/project/src/ui/code_editor/Tabs.gd b/project/src/ui/code_editor/Tabs.gd index 8d4f930b..3362b3e6 100644 --- a/project/src/ui/code_editor/Tabs.gd +++ b/project/src/ui/code_editor/Tabs.gd @@ -174,6 +174,8 @@ func _on_TextEditor_text_changed(): _update_saved_status() func _update_saved_status(): + if(mainControl.fileInfos): + return _save_tab_content() var fileInfo = mainControl.fileInfos[tabs.current_tab] tabs.set_tab_title(current_tab,fileInfo._name + "" if _is_saved() else fileInfo._name + "*") diff --git a/project/src/ui/popup/popup_window.tscn b/project/src/ui/popup/popup_window.tscn index 184b18b5..fd1bad55 100644 --- a/project/src/ui/popup/popup_window.tscn +++ b/project/src/ui/popup/popup_window.tscn @@ -1,10 +1,10 @@ -[gd_scene load_steps=3 format=2] +[gd_scene load_steps=4 format=2] [ext_resource path="res://src/ui/popup/popup_window.gd" type="Script" id=1] [ext_resource path="res://media/fonts/Open_Sans/OpenSasn-Regular-Popup.tres" type="DynamicFont" id=2] +[ext_resource path="res://src/ui/themes/regular_button/regular_button.tres" type="Theme" id=3] [node name="Control" type="Popup"] -visible = true anchor_right = 1.0 anchor_bottom = 1.0 margin_left = -139.135 @@ -16,52 +16,57 @@ __meta__ = { "_edit_use_anchors_": false } -[node name="Panel" type="PanelContainer" parent="."] +[node name="Panel" type="Panel" parent="."] margin_left = 502.0 margin_top = 305.0 margin_right = 793.0 margin_bottom = 480.0 size_flags_vertical = 0 +theme = ExtResource( 3 ) __meta__ = { "_edit_use_anchors_": false } [node name="btnContainer" type="HBoxContainer" parent="Panel"] margin_left = 7.0 -margin_top = 142.0 +margin_top = 148.0 margin_right = 284.0 margin_bottom = 168.0 size_flags_vertical = 14 +theme = ExtResource( 3 ) alignment = 1 __meta__ = { "_edit_use_anchors_": false } [node name="buttonYES" type="Button" parent="Panel/btnContainer"] -margin_right = 35.0 -margin_bottom = 26.0 +margin_right = 23.0 +margin_bottom = 20.0 rect_pivot_offset = Vector2( 97, 48 ) size_flags_horizontal = 9 +theme = ExtResource( 3 ) text = "Yes" __meta__ = { "_edit_use_anchors_": false } [node name="buttonOK" type="Button" parent="Panel/btnContainer"] -margin_left = 39.0 -margin_right = 71.0 -margin_bottom = 26.0 +margin_left = 27.0 +margin_right = 47.0 +margin_bottom = 20.0 size_flags_horizontal = 8 +theme = ExtResource( 3 ) text = "OK" __meta__ = { "_edit_use_anchors_": false } [node name="buttonNO" type="Button" parent="Panel/btnContainer"] -margin_left = 246.0 +margin_left = 258.0 margin_right = 277.0 -margin_bottom = 26.0 +margin_bottom = 20.0 size_flags_horizontal = 10 +theme = ExtResource( 3 ) text = "No" __meta__ = { "_edit_use_anchors_": false @@ -81,4 +86,4 @@ valign = 1 autowrap = true __meta__ = { "_edit_use_anchors_": false -} \ No newline at end of file +} diff --git a/project/src/ui/themes/regular_button/regular_button.tres b/project/src/ui/themes/regular_button/regular_button.tres index ff8a3f8e..a74a5df1 100644 --- a/project/src/ui/themes/regular_button/regular_button.tres +++ b/project/src/ui/themes/regular_button/regular_button.tres @@ -10,31 +10,31 @@ content_margin_left = 10.0 bg_color = Color( 0.180392, 0.180392, 0.180392, 1 ) -[sub_resource type="StyleBoxFlat" id=8] +[sub_resource type="StyleBoxFlat" id=2] bg_color = Color( 0.117647, 0.117647, 0.117647, 1 ) -[sub_resource type="StyleBoxFlat" id=2] +[sub_resource type="StyleBoxFlat" id=3] bg_color = Color( 0.243137, 0.243137, 0.243137, 1 ) -[sub_resource type="StyleBoxFlat" id=3] +[sub_resource type="StyleBoxFlat" id=4] bg_color = Color( 0.117647, 0.117647, 0.117647, 1 ) -[sub_resource type="StyleBoxFlat" id=4] +[sub_resource type="StyleBoxFlat" id=5] content_margin_left = 10.0 content_margin_right = 10.0 bg_color = Color( 0.180392, 0.180392, 0.180392, 1 ) -[sub_resource type="StyleBoxFlat" id=5] +[sub_resource type="StyleBoxFlat" id=6] content_margin_left = 10.0 content_margin_right = 10.0 bg_color = Color( 0.243137, 0.243137, 0.243137, 1 ) -[sub_resource type="StyleBoxFlat" id=6] +[sub_resource type="StyleBoxFlat" id=7] content_margin_left = 5.0 content_margin_right = 0.0 bg_color = Color( 0.180392, 0.180392, 0.180392, 1 ) -[sub_resource type="StyleBoxFlat" id=7] +[sub_resource type="StyleBoxFlat" id=8] bg_color = Color( 0.180392, 0.180392, 0.180392, 1 ) [resource] @@ -76,7 +76,8 @@ OptionButton/styles/focus = ExtResource( 4 ) OptionButton/styles/hover = ExtResource( 2 ) OptionButton/styles/normal = ExtResource( 3 ) OptionButton/styles/pressed = null -Panel/styles/panel = SubResource( 8 ) +Panel/styles/panel = SubResource( 2 ) +PanelContainer/icons/ = null PopupMenu/colors/font_color = Color( 0.88, 0.88, 0.88, 1 ) PopupMenu/colors/font_color_accel = Color( 0.7, 0.7, 0.7, 0.8 ) PopupMenu/colors/font_color_disabled = Color( 0.4, 0.4, 0.4, 0.8 ) @@ -90,10 +91,10 @@ PopupMenu/icons/radio_checked = null PopupMenu/icons/radio_unchecked = null PopupMenu/icons/submenu = null PopupMenu/icons/unchecked = null -PopupMenu/styles/hover = SubResource( 2 ) +PopupMenu/styles/hover = SubResource( 3 ) PopupMenu/styles/labeled_separator_left = null PopupMenu/styles/labeled_separator_right = null -PopupMenu/styles/panel = SubResource( 3 ) +PopupMenu/styles/panel = SubResource( 4 ) PopupMenu/styles/panel_disabled = null PopupMenu/styles/separator = null Tabs/colors/font_color_bg = Color( 0.69, 0.69, 0.69, 1 ) @@ -112,9 +113,9 @@ Tabs/icons/increment_highlight = null Tabs/styles/button = null Tabs/styles/button_pressed = null Tabs/styles/panel = null -Tabs/styles/tab_bg = SubResource( 4 ) +Tabs/styles/tab_bg = SubResource( 5 ) Tabs/styles/tab_disabled = null -Tabs/styles/tab_fg = SubResource( 5 ) +Tabs/styles/tab_fg = SubResource( 6 ) TextEdit/colors/background_color = Color( 0, 0, 0, 0 ) TextEdit/colors/bookmark_color = Color( 0.08, 0.49, 0.98, 1 ) TextEdit/colors/brace_mismatch_color = Color( 1, 0.2, 0.2, 1 ) @@ -153,7 +154,7 @@ TextEdit/icons/space = null TextEdit/icons/tab = null TextEdit/styles/completion = null TextEdit/styles/focus = null -TextEdit/styles/normal = SubResource( 6 ) +TextEdit/styles/normal = SubResource( 7 ) TextEdit/styles/read_only = null ToolButton/colors/font_color = Color( 0.88, 0.88, 0.88, 1 ) ToolButton/colors/font_color_disabled = Color( 0.9, 0.95, 1, 0.3 ) @@ -189,7 +190,7 @@ Tree/icons/checked = null Tree/icons/select_arrow = null Tree/icons/unchecked = null Tree/icons/updown = null -Tree/styles/bg = SubResource( 7 ) +Tree/styles/bg = SubResource( 8 ) Tree/styles/bg_focus = null Tree/styles/button_pressed = null Tree/styles/cursor = null