diff --git a/addons/file-editor/README.md b/addons/file-editor/README.md
index e9ccbcc..6c35125 100644
--- a/addons/file-editor/README.md
+++ b/addons/file-editor/README.md
@@ -1,11 +1,13 @@
Check my **[Discord](https://discord.gg/KnJGY9S)** to stay updated on this repository.
*(Recommended since the AssetLibrary is not automatically updated)*
+This plugin is now supported in [Godot Extended Library Discord](https://discord.gg/JNrcucg), check out the [Godot Extended Library Project](https://github.com/godot-extended-libraries)!
+
# Godot Text Editor
A little plugin to easy-way manage your text files inside your project folder.
Author: *"Nicolo (fenix) Santilio"*
-Version: *1.2.1*
+Version: *1.4.3*
Godot Version: *3.1.1-stable*
**This repository was pushed directly from Godot Engine Editor thanks to [GitHub Integration](https://github.com/fenix-hub/godot-engine.github-integration)!**
@@ -19,7 +21,7 @@ When opening / creating a file, the editor will open and you will be able to edi
You can just *Save* the file, or *Save file As* a new file (if it is a new file but also to make some copies).
You will also be able to see some informations about the file you are editing (time and date of last edit) and you can set your editor to *Read Only* if you don't want to make changes but still read the content of the file.
Multiple files can be opened in different tabs.
-
+
## How do I install it?
**Manual**
@@ -45,6 +47,8 @@ You can find this plugin in the AssetLib of Godot Engine Editor. Just download i
+ "*.sql ; SQL database file",
+ "*.json ; JavaScript Object Notation File",
+ "*.html ; HyperText Markup Language"
++ "*.cfg ; Configuration File"
++ "*.ini ; Initialization File (same as .cfg Configuration File)"
#### Current version
To check all the features included in the current version, please read the [VERSION file](./VERSION.md)
@@ -56,3 +60,4 @@ To check all the features I'm currently working on, please read the [TODO file](
This addon was built for a **personal use** intention. It was released as an open source plugin in the hope that it could be useful to the Godot Engine Community.
As a "work in progress" project, there is *no warranty* for any eventual issue and bug that may broke your project.
I don't assume any responsibility for possible corruptions of your project files. It is always advisable to keep a copy of your files and check any changes.
+
diff --git a/addons/file-editor/TODO.md b/addons/file-editor/TODO.md
index 9e8a120..f88ece3 100644
--- a/addons/file-editor/TODO.md
+++ b/addons/file-editor/TODO.md
@@ -1,6 +1,4 @@
### to do (v-0.x.x)
-- XML Tree Visualizer
-- JSON Tree Visualizer
-- CSV Table Visualizer
-- .cfg support
-- CFG Tree Visualizer
+- Popup dialog when closing a tab if there is new content
+- Module for markdown support/conversion
+
diff --git a/addons/file-editor/VERSION.md b/addons/file-editor/VERSION.md
index c7f740f..b6c087f 100644
--- a/addons/file-editor/VERSION.md
+++ b/addons/file-editor/VERSION.md
@@ -1,65 +1,87 @@
-**version 0.0.1**
-*added*
-- Plugin Created
-
------------------------
-
-**version 0.1.1**
-*added*
-- "Create new File" option
-- "Open File" option
-- "Delete File" option
-- "Save File" option
-- "Save File As.." option
-
------------------------
-
-**version 0.1.2**
-*fixed*
-- Repository Installation, folder order
-
------------------------
-
-**version 0.2.5**
-*removed*
-- Old layout
-
-*added*
-- New Layout
-- Last modified time and date
-- Tabs
-
------------------------
-
-**version 0.3.1**
-*added*
-- Version check
-- Preview support
-- Context menu in editor
-- BBCode converter
-- Light Mardkwon converter (DEMO)
-
------------------------
-
-**version 1.2.1**
-*removed*
-- Old layout, the plugin won't appear in docs
-- Icons file extensions, plugin size reduced
-- Old Mardkwon preview method
-
-*added*
-- More supported files
-1. "*.dat ; Data File",
-2. "*.xml ; XML File",
-3. "*.sql ; SQL database file",
-4. "*.json ; JavaScript Object Notation File",
-5. "*.html ; HyperText Markup Language
-- New Markdown preview method ( Markdown -> BBCode converter)
-- New HTML preview method ( HTML -> BBCode converter)
-- New Plugin Layout: a new ButtonTool "File" in you TopBar will appear
-- Error check
-- Message popups for closing unsaved files
-
------------------------
-
-
+**version 0.0.1**
+*added*
+- Plugin Created
+
+-----------------------
+
+**version 0.1.1**
+*added*
+- "Create new File" option
+- "Open File" option
+- "Delete File" option
+- "Save File" option
+- "Save File As.." option
+
+-----------------------
+
+**version 0.1.2**
+*fixed*
+- Repository Installation, folder order
+
+-----------------------
+
+**version 0.2.5**
+*removed*
+- Old layout
+
+*added*
+- New Layout
+- Last modified time and date
+- Tabs
+
+-----------------------
+
+**version 0.3.1**
+*added*
+- Version check
+- Preview support
+- Context menu in editor
+- BBCode converter
+- Light Mardkwon converter (DEMO)
+
+-----------------------
+
+**version 1.2.1**
+*removed*
+- Old layout, the plugin won't appear in docs
+- Icons file extensions, plugin size reduced
+- Old Mardkwon preview method
+
+*added*
+- More supported files
+1. "*.dat ; Data File",
+2. "*.xml ; XML File",
+3. "*.sql ; SQL database file",
+4. "*.json ; JavaScript Object Notation File",
+5. "*.html ; HyperText Markup Language
+- New Markdown preview method ( Markdown -> BBCode converter)
+- New HTML preview method ( HTML -> BBCode converter)
+- New Plugin Layout: a new ButtonTool "File" in you TopBar will appear
+- Error check
+- Message popups for closing unsaved files
+
+-----------------------
+
+**version 1.4.3**
+*removed*
+- Old layout
+
+*added*
+- More supported files:
+1. "*.cfg ; Configuration File",
+2. "*.ini ; Initialization File (same as .cfg Configuration File)",
+- Added some sample files
+- Memorize system of last opened files
+- Added *Editor* button , you can now choose which editor to use:
+1. Vanilla Editor (simple text editor)
+2. Cfg/Ini Editor (table editor for Cfg/Ini files)
+ Editors are automatically updated, so if you update a cfg/ini file in the Vanilla Editor it will be updated in the Cfg/Ini Editor, and viceversa
+- Added editor shorcuts:
+1. *Ctrl + N* (new file)
+2. *Ctrl + O* (open file)
+3. *Ctrl + Alt + C* (close file)
+4. *Ctrl + S* (save file)
+5. *Ctrl + Alt + S* (save file as...)
+6. *Ctrl + D* (delete file)
+7. *Ctrl + 1* (Vanilla Editor)
+8. *Ctrl + 3* (Cfg/Ini Editor)
diff --git a/addons/file-editor/file.samples/sample.bbs b/addons/file-editor/file.samples/sample.bbs
new file mode 100644
index 0000000..317eacf
--- /dev/null
+++ b/addons/file-editor/file.samples/sample.bbs
@@ -0,0 +1,8 @@
+[b]bolded text[/b]
+[i]italicized text[/i]
+[u]underlined text[/u]
+[s]strikethrough text[/s]
+[url]https://en.wikipedia.org[/url]
+[url=https://en.wikipedia.org]English Wikipedia[/url]
+[code]monospaced text[/code]
+left [center]center[/center] [right]right[/right]
diff --git a/addons/file-editor/file.samples/sample.cfg b/addons/file-editor/file.samples/sample.cfg
new file mode 100644
index 0000000..4a00d73
--- /dev/null
+++ b/addons/file-editor/file.samples/sample.cfg
@@ -0,0 +1,19 @@
+[Locale]
+Language="en"
+[Version]
+Major="2"
+Minor="1"
+Micro="3"
+[Directories]
+TempDir="C:\Users\Jon\AppData\Local\Audacity\SessionData"
+[AudioIO]
+RecordingDevice="Microphone (Blue Snowball)"
+Host="MME"
+PlaybackDevice="Speakers / Headphones (Realtek)"
+EffectsPreviewLen="6"
+CutPreviewBeforeLen="2"
+CutPreviewAfterLen="1"
+SeekShortPeriod="1"
+SeekLongPeriod="15"
+Duplex="1"
+SWPlaythrough="0"
diff --git a/addons/file-editor/file.samples/sample.html b/addons/file-editor/file.samples/sample.html
new file mode 100644
index 0000000..213413c
--- /dev/null
+++ b/addons/file-editor/file.samples/sample.html
@@ -0,0 +1,7 @@
+bolded text,
+italicized text,
+underlined text
+strikethrough text
+English Wikipedia
+
+
diff --git a/addons/file-editor/file.samples/sample.ini b/addons/file-editor/file.samples/sample.ini
new file mode 100644
index 0000000..16f04fd
--- /dev/null
+++ b/addons/file-editor/file.samples/sample.ini
@@ -0,0 +1,10 @@
+; last modified 1 April 2001 by John Doe
+[owner]
+name="John Doe"
+organization="Acme Widgets Inc."
+
+[database]
+; use IP address in case network name resolution is not working
+server="192.0.2.62"
+port="143"
+file="payroll.dat"
diff --git a/addons/file-editor/file.samples/sample.md b/addons/file-editor/file.samples/sample.md
new file mode 100644
index 0000000..5c80f83
--- /dev/null
+++ b/addons/file-editor/file.samples/sample.md
@@ -0,0 +1,11 @@
+*italic*
+**bold**
+`monospace`
+~~strikethrough~~
+[link](http://example.com)
+
+
+Shopping list:
+- apples
+- oranges
+- pears
diff --git a/addons/file-editor/file.samples/sample.xml b/addons/file-editor/file.samples/sample.xml
new file mode 100644
index 0000000..7c254f1
--- /dev/null
+++ b/addons/file-editor/file.samples/sample.xml
@@ -0,0 +1,120 @@
+
+
+
+ Gambardella, Matthew
+ XML Developer's Guide
+ Computer
+ 44.95
+ 2000-10-01
+ An in-depth look at creating applications
+ with XML.
+
+
+ Ralls, Kim
+ Midnight Rain
+ Fantasy
+ 5.95
+ 2000-12-16
+ A former architect battles corporate zombies,
+ an evil sorceress, and her own childhood to become queen
+ of the world.
+
+
+ Corets, Eva
+ Maeve Ascendant
+ Fantasy
+ 5.95
+ 2000-11-17
+ After the collapse of a nanotechnology
+ society in England, the young survivors lay the
+ foundation for a new society.
+
+
+ Corets, Eva
+ Oberon's Legacy
+ Fantasy
+ 5.95
+ 2001-03-10
+ In post-apocalypse England, the mysterious
+ agent known only as Oberon helps to create a new life
+ for the inhabitants of London. Sequel to Maeve
+ Ascendant.
+
+
+ Corets, Eva
+ The Sundered Grail
+ Fantasy
+ 5.95
+ 2001-09-10
+ The two daughters of Maeve, half-sisters,
+ battle one another for control of England. Sequel to
+ Oberon's Legacy.
+
+
+ Randall, Cynthia
+ Lover Birds
+ Romance
+ 4.95
+ 2000-09-02
+ When Carla meets Paul at an ornithology
+ conference, tempers fly as feathers get ruffled.
+
+
+ Thurman, Paula
+ Splish Splash
+ Romance
+ 4.95
+ 2000-11-02
+ A deep sea diver finds true love twenty
+ thousand leagues beneath the sea.
+
+
+ Knorr, Stefan
+ Creepy Crawlies
+ Horror
+ 4.95
+ 2000-12-06
+ An anthology of horror stories about roaches,
+ centipedes, scorpions and other insects.
+
+
+ Kress, Peter
+ Paradox Lost
+ Science Fiction
+ 6.95
+ 2000-11-02
+ After an inadvertant trip through a Heisenberg
+ Uncertainty Device, James Salway discovers the problems
+ of being quantum.
+
+
+ O'Brien, Tim
+ Microsoft .NET: The Programming Bible
+ Computer
+ 36.95
+ 2000-12-09
+ Microsoft's .NET initiative is explored in
+ detail in this deep programmer's reference.
+
+
+ O'Brien, Tim
+ MSXML3: A Comprehensive Guide
+ Computer
+ 36.95
+ 2000-12-01
+ The Microsoft MSXML3 parser is covered in
+ detail, with attention to XML DOM interfaces, XSLT processing,
+ SAX and more.
+
+
+ Galos, Mike
+ Visual Studio 7: A Comprehensive Guide
+ Computer
+ 49.95
+ 2001-04-16
+ Microsoft Visual Studio 7 is explored in depth,
+ looking at how Visual Basic, Visual C++, C#, and ASP+ are
+ integrated into a comprehensive development
+ environment.
+
+
diff --git a/addons/file-editor/icon.png b/addons/file-editor/icon.png
index 84164c3..471326b 100644
Binary files a/addons/file-editor/icon.png and b/addons/file-editor/icon.png differ
diff --git a/addons/file-editor/icon.psd b/addons/file-editor/icon.psd
new file mode 100644
index 0000000..487d52a
Binary files /dev/null and b/addons/file-editor/icon.psd differ
diff --git a/addons/file-editor/icons.pngs/add.png.buttonicon b/addons/file-editor/icons.pngs/add.png.buttonicon
new file mode 100644
index 0000000..f558dae
Binary files /dev/null and b/addons/file-editor/icons.pngs/add.png.buttonicon differ
diff --git a/addons/file-editor/icons.pngs/edit_.png.buttonicon b/addons/file-editor/icons.pngs/edit_.png.buttonicon
new file mode 100644
index 0000000..20bfe8f
Binary files /dev/null and b/addons/file-editor/icons.pngs/edit_.png.buttonicon differ
diff --git a/addons/file-editor/icons.pngs/keys.png.buttonicon b/addons/file-editor/icons.pngs/keys.png.buttonicon
new file mode 100644
index 0000000..e7dd81c
Binary files /dev/null and b/addons/file-editor/icons.pngs/keys.png.buttonicon differ
diff --git a/addons/file-editor/icons.pngs/remove.png.buttonicon b/addons/file-editor/icons.pngs/remove.png.buttonicon
new file mode 100644
index 0000000..4a8924d
Binary files /dev/null and b/addons/file-editor/icons.pngs/remove.png.buttonicon differ
diff --git a/addons/file-editor/icons.pngs/section.png.buttonicon b/addons/file-editor/icons.pngs/section.png.buttonicon
new file mode 100644
index 0000000..5fa6183
Binary files /dev/null and b/addons/file-editor/icons.pngs/section.png.buttonicon differ
diff --git a/addons/file-editor/icons.pngs/sections.png.buttonicon b/addons/file-editor/icons.pngs/sections.png.buttonicon
new file mode 100644
index 0000000..772f537
Binary files /dev/null and b/addons/file-editor/icons.pngs/sections.png.buttonicon differ
diff --git a/addons/file-editor/lastopenedfiles.lastcfg b/addons/file-editor/lastopenedfiles.lastcfg
new file mode 100644
index 0000000..ab785f6
--- /dev/null
+++ b/addons/file-editor/lastopenedfiles.lastcfg
@@ -0,0 +1,4 @@
+[Opened]
+
+sample.cfg="res://addons/file-editor/file.samples/sample.cfg"
+README.md="res://addons/file-editor/README.md"
diff --git a/addons/file-editor/plugin.cfg b/addons/file-editor/plugin.cfg
index c955f48..68ea3c0 100644
--- a/addons/file-editor/plugin.cfg
+++ b/addons/file-editor/plugin.cfg
@@ -3,5 +3,5 @@
name="File Editor"
description="An internal file editor to view and edit text files in your project folder."
author="Nicolo 'fenix' Santilio"
-version="1.2.1"
+version="1.4.3"
script="scripts/file-editor.gd"
diff --git a/addons/file-editor/scenes/FileEditor.tscn b/addons/file-editor/scenes/FileEditor.tscn
index 82f44e3..4c97d16 100644
--- a/addons/file-editor/scenes/FileEditor.tscn
+++ b/addons/file-editor/scenes/FileEditor.tscn
@@ -1,105 +1,208 @@
-[gd_scene load_steps=7 format=2]
+[gd_scene load_steps=20 format=2]
[ext_resource path="res://addons/file-editor/scripts/FileEditor.gd" type="Script" id=1]
[ext_resource path="res://addons/file-editor/fonts/Roboto-Black.ttf" type="DynamicFontData" id=2]
+[ext_resource path="res://addons/file-editor/scenes/VanillaEditor.tscn" type="PackedScene" id=3]
+[ext_resource path="res://addons/file-editor/scenes/IniEditor.tscn" type="PackedScene" id=4]
-[sub_resource type="DynamicFont" id=6]
+[sub_resource type="Image" id=16]
+data = {
+"data": PoolByteArray( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ),
+"format": "RGBA8",
+"height": 16,
+"mipmaps": false,
+"width": 16
+}
+
+[sub_resource type="ImageTexture" id=3]
+image = SubResource( 16 )
+size = Vector2( 16, 16 )
+
+[sub_resource type="Image" id=17]
+data = {
+"data": PoolByteArray( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 175, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 175, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 175, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 16, 224, 224, 224, 239, 224, 224, 224, 239, 224, 224, 224, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 80, 224, 224, 224, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ),
+"format": "RGBA8",
+"height": 16,
+"mipmaps": false,
+"width": 16
+}
+
+[sub_resource type="ImageTexture" id=5]
+image = SubResource( 17 )
+size = Vector2( 16, 16 )
+
+[sub_resource type="Image" id=18]
+data = {
+"data": PoolByteArray( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 16, 224, 224, 224, 80, 224, 224, 224, 206, 224, 224, 224, 238, 224, 224, 224, 238, 224, 224, 224, 174, 224, 224, 224, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 48, 224, 224, 224, 206, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 206, 224, 224, 224, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 48, 224, 224, 224, 238, 224, 224, 224, 254, 224, 224, 224, 206, 224, 224, 224, 112, 224, 224, 224, 16, 224, 224, 224, 16, 224, 224, 224, 80, 224, 224, 224, 222, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 16, 224, 224, 224, 206, 224, 224, 224, 254, 224, 224, 224, 222, 224, 224, 224, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 16, 224, 224, 224, 206, 224, 224, 224, 254, 224, 224, 224, 238, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 96, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 96, 0, 0, 0, 0, 224, 224, 224, 64, 224, 224, 224, 206, 224, 224, 224, 222, 224, 224, 224, 64, 0, 0, 0, 0, 224, 224, 224, 96, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 112, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 206, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 32, 0, 0, 0, 0, 224, 224, 224, 222, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 238, 0, 0, 0, 0, 224, 224, 224, 16, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 238, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 222, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 16, 0, 0, 0, 0, 224, 224, 224, 222, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 238, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 222, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 126, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 96, 0, 0, 0, 0, 224, 224, 224, 64, 224, 224, 224, 254, 224, 224, 224, 238, 224, 224, 224, 96, 0, 0, 0, 0, 224, 224, 224, 80, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 126, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 16, 224, 224, 224, 222, 224, 224, 224, 254, 224, 224, 224, 222, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 16, 224, 224, 224, 190, 224, 224, 224, 254, 224, 224, 224, 238, 224, 224, 224, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 48, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 206, 224, 224, 224, 96, 0, 0, 0, 0, 224, 224, 224, 16, 224, 224, 224, 64, 224, 224, 224, 206, 224, 224, 224, 254, 224, 224, 224, 238, 224, 224, 224, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 48, 224, 224, 224, 222, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 238, 224, 224, 224, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 112, 224, 224, 224, 206, 224, 224, 224, 254, 224, 224, 224, 238, 224, 224, 224, 206, 224, 224, 224, 126, 224, 224, 224, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ),
+"format": "RGBA8",
+"height": 16,
+"mipmaps": false,
+"width": 16
+}
+
+[sub_resource type="ImageTexture" id=7]
+image = SubResource( 18 )
+size = Vector2( 16, 16 )
+
+[sub_resource type="DynamicFont" id=1]
size = 13
font_data = ExtResource( 2 )
-[sub_resource type="StyleBoxFlat" id=7]
-content_margin_left = 10.0
-content_margin_right = 10.0
-bg_color = Color( 0.196078, 0.231373, 0.309804, 1 )
-border_width_left = 1
-border_width_top = 1
-border_width_right = 1
-border_color = Color( 0.121569, 0.145098, 0.192157, 1 )
-expand_margin_bottom = 1.0
+[sub_resource type="Image" id=19]
+data = {
+"data": PoolByteArray( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ),
+"format": "RGBA8",
+"height": 16,
+"mipmaps": false,
+"width": 16
+}
-[sub_resource type="StyleBoxFlat" id=8]
-content_margin_left = 10.0
-content_margin_right = 10.0
-bg_color = Color( 0.145098, 0.172549, 0.231373, 1 )
-border_width_left = 1
-border_width_top = 1
-border_width_right = 1
-border_color = Color( 0.121569, 0.145098, 0.192157, 1 )
-expand_margin_bottom = 1.0
+[sub_resource type="ImageTexture" id=9]
+image = SubResource( 19 )
+size = Vector2( 16, 16 )
-[sub_resource type="StyleBoxFlat" id=9]
-bg_color = Color( 0.121569, 0.145098, 0.192157, 1 )
-draw_center = false
-border_width_left = 1
-border_width_top = 1
-border_width_right = 1
-border_width_bottom = 1
-border_color = Color( 0.121569, 0.145098, 0.192157, 1 )
+[sub_resource type="Image" id=20]
+data = {
+"data": PoolByteArray( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ),
+"format": "RGBA8",
+"height": 16,
+"mipmaps": false,
+"width": 16
+}
+
+[sub_resource type="ImageTexture" id=11]
+image = SubResource( 20 )
+size = Vector2( 16, 16 )
+
+[sub_resource type="Image" id=21]
+data = {
+"data": PoolByteArray( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ),
+"format": "RGBA8",
+"height": 16,
+"mipmaps": false,
+"width": 16
+}
+
+[sub_resource type="ImageTexture" id=13]
+image = SubResource( 21 )
+size = Vector2( 16, 16 )
+
+[sub_resource type="Image" id=22]
+data = {
+"data": PoolByteArray( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ),
+"format": "RGBA8",
+"height": 16,
+"mipmaps": false,
+"width": 16
+}
+
+[sub_resource type="ImageTexture" id=15]
+image = SubResource( 22 )
+size = Vector2( 16, 16 )
[node name="FileEditor" type="Control"]
anchor_right = 1.0
anchor_bottom = 1.0
+margin_left = 7.0
+margin_right = -6.0
size_flags_horizontal = 3
size_flags_vertical = 3
script = ExtResource( 1 )
-[node name="Container" type="VBoxContainer" parent="."]
+[node name="FileEditorContainer" type="VBoxContainer" parent="."]
anchor_right = 1.0
anchor_bottom = 1.0
margin_left = 6.0
margin_right = -5.0
-margin_bottom = -7.0
size_flags_horizontal = 3
size_flags_vertical = 3
-[node name="Buttons" type="HBoxContainer" parent="Container"]
-margin_right = 1013.0
-margin_bottom = 20.0
+[node name="TobBar" type="HBoxContainer" parent="FileEditorContainer"]
+margin_right = 1000.0
+margin_bottom = 22.0
-[node name="newfile_btn" type="Button" parent="Container/Buttons"]
-margin_right = 110.0
-margin_bottom = 20.0
-text = "Create new File"
-flat = true
+[node name="file_btn" type="MenuButton" parent="FileEditorContainer/TobBar"]
+margin_right = 54.0
+margin_bottom = 22.0
+text = "File"
+icon = SubResource( 3 )
+items = [ "New File", null, 0, false, false, 0, 268435534, null, "", false, "Open File", null, 0, false, false, 1, 268435535, null, "", false, "Close File", null, 0, false, false, 2, 335544387, null, "", false, "", null, 0, false, false, -1, 0, null, "", true, "Save File", null, 0, false, false, 3, 268435539, null, "", false, "Save File as...", null, 0, false, false, 4, 335544403, null, "", false, "Delete File", null, 0, false, false, 5, 268435524, null, "", false ]
-[node name="openfile_btn" type="Button" parent="Container/Buttons"]
-margin_left = 114.0
-margin_right = 188.0
-margin_bottom = 20.0
-text = "Open File"
-flat = true
+[node name="editor_btn" type="MenuButton" parent="FileEditorContainer/TobBar"]
+margin_left = 58.0
+margin_right = 126.0
+margin_bottom = 22.0
+text = "Editor"
+icon = SubResource( 5 )
+items = [ "Vanilla Editor", null, 0, false, false, 0, 268435505, null, "", false, "CSV Editor", null, 0, false, false, 1, 0, null, "", false, "CFG/INI Editor", null, 0, false, false, 2, 268435507, null, "", false ]
-[node name="deletefile_btn" type="Button" parent="Container/Buttons"]
-margin_left = 192.0
-margin_right = 274.0
-margin_bottom = 20.0
-text = "Delete File"
-flat = true
+[node name="preview_btn" type="MenuButton" parent="FileEditorContainer/TobBar"]
+margin_left = 130.0
+margin_right = 211.0
+margin_bottom = 22.0
+text = "Preview"
+icon = SubResource( 7 )
+items = [ "BBCode Preview", null, 0, false, false, 0, 0, null, "", false, "Markdown Preview", null, 0, false, false, 1, 0, null, "", false, "HTML Preview", null, 0, false, false, 2, 0, null, "", false, "CSV Preview", null, 0, false, false, 3, 0, null, "", false, "XML Preview", null, 0, false, false, 4, 0, null, "", false, "JSON Preview", null, 0, false, false, 5, 0, null, "", false ]
-[node name="version" type="Label" parent="Container/Buttons"]
-margin_left = 974.0
-margin_top = 1.0
-margin_right = 1013.0
-margin_bottom = 18.0
+[node name="version" type="Label" parent="FileEditorContainer/TobBar"]
+margin_left = 961.0
+margin_top = 2.0
+margin_right = 1000.0
+margin_bottom = 19.0
size_flags_horizontal = 10
-custom_fonts/font = SubResource( 6 )
+custom_fonts/font = SubResource( 1 )
custom_colors/font_color = Color( 0.121569, 0.145098, 0.192157, 1 )
text = "v1.2.1"
align = 1
-[node name="Editor" type="TabContainer" parent="Container"]
-visible = false
+[node name="SplitContainer" type="HSplitContainer" parent="FileEditorContainer"]
margin_top = 26.0
margin_right = 1000.0
margin_bottom = 600.0
size_flags_horizontal = 3
-size_flags_vertical = 11
-custom_styles/tab_fg = SubResource( 7 )
-custom_styles/tab_bg = SubResource( 8 )
-custom_styles/panel = SubResource( 9 )
-custom_colors/font_color_fg = Color( 1, 1, 1, 1 )
-tab_align = 0
-drag_to_rearrange_enabled = true
+size_flags_vertical = 3
+split_offset = 150
+
+[node name="BoxContainer" type="VBoxContainer" parent="FileEditorContainer/SplitContainer"]
+margin_right = 208.0
+margin_bottom = 574.0
+
+[node name="OpenFileName" type="LineEdit" parent="FileEditorContainer/SplitContainer/BoxContainer"]
+margin_right = 208.0
+margin_bottom = 24.0
+mouse_filter = 2
+text = "res://sample.html"
+context_menu_enabled = false
+
+[node name="OpenFileList" type="ItemList" parent="FileEditorContainer/SplitContainer/BoxContainer"]
+margin_top = 28.0
+margin_right = 208.0
+margin_bottom = 570.0
+size_flags_vertical = 3
+items = [ "sample.bbs", SubResource( 9 ), false, "sample.xml", SubResource( 11 ), false, "sample.md", SubResource( 13 ), false, "sample.html", SubResource( 15 ), false ]
+allow_reselect = true
+
+[node name="HSeparator" type="HSeparator" parent="FileEditorContainer/SplitContainer/BoxContainer"]
+margin_top = 574.0
+margin_right = 208.0
+margin_bottom = 574.0
+rect_min_size = Vector2( 2, 0 )
+custom_constants/separation = 0
+
+[node name="VanillaEditor" parent="FileEditorContainer/SplitContainer" instance=ExtResource( 3 )]
+anchor_right = 0.0
+anchor_bottom = 0.0
+margin_left = 220.0
+margin_right = 1000.0
+margin_bottom = 574.0
+
+[node name="IniEditor" parent="FileEditorContainer/SplitContainer" instance=ExtResource( 4 )]
+visible = false
+anchor_right = 0.0
+anchor_bottom = 0.0
+margin_left = 220.0
+margin_right = 1000.0
+margin_bottom = 576.0
[node name="FileList" type="FileDialog" parent="."]
margin_top = 24.0
@@ -108,10 +211,9 @@ margin_bottom = 600.0
size_flags_vertical = 3
popup_exclusive = true
dialog_hide_on_ok = true
-filters = PoolStringArray( "*.txt ; Plain Text File", "*.rtf ; Rich Text Format File", "*.log ; Log File", "*.md ; MD File", "*.doc ; WordPad Document", "*.doc ; Microsoft Word Document", "*.docm ; Word Open XML Macro-Enabled Document", "*.docx ; Microsoft Word Open XML Document", "*.bbs ; Bulletin Board System Text", "*.dat ; Data File", "*.xml ; XML File", "*.sql ; SQL database file", "*.json ; JavaScript Object Notation File", "*.html ; HyperText Markup Language" )
+filters = PoolStringArray( "*.txt ; Plain Text File", "*.rtf ; Rich Text Format File", "*.log ; Log File", "*.md ; MD File", "*.doc ; WordPad Document", "*.doc ; Microsoft Word Document", "*.docm ; Word Open XML Macro-Enabled Document", "*.docx ; Microsoft Word Open XML Document", "*.bbs ; Bulletin Board System Text", "*.dat ; Data File", "*.xml ; XML File", "*.sql ; SQL database file", "*.json ; JavaScript Object Notation File", "*.html ; HyperText Markup Language", "*.csv ; Comma-separated values", "*.cfg ; Configuration File", "*.ini ; Initialization File (same as .cfg Configuration File)" )
[node name="NewFileDialogue" type="AcceptDialog" parent="."]
-editor/display_folded = true
margin_left = 348.254
margin_top = 232.623
margin_right = 644.254
@@ -157,8 +259,3 @@ margin_bottom = 37.5
window_title = "Unsaved changes"
dialog_text = "There are some unsaved changes.
Press \"OK\" if you want to close this tab anyway, or \"cancel\" if you want to keep on editing your file."
-
-[node name="VSeparator" type="VSeparator" parent="."]
-visible = false
-anchor_bottom = 1.0
-margin_right = 24.0
diff --git a/addons/file-editor/scenes/IniEditor.tscn b/addons/file-editor/scenes/IniEditor.tscn
new file mode 100644
index 0000000..8c440df
--- /dev/null
+++ b/addons/file-editor/scenes/IniEditor.tscn
@@ -0,0 +1,369 @@
+[gd_scene load_steps=16 format=2]
+
+[ext_resource path="res://addons/file-editor/scripts/IniVisualEditor.gd" type="Script" id=1]
+
+[sub_resource type="Image" id=15]
+data = {
+"data": PoolByteArray( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ),
+"format": "RGBA8",
+"height": 16,
+"mipmaps": false,
+"width": 16
+}
+
+[sub_resource type="ImageTexture" id=2]
+image = SubResource( 15 )
+size = Vector2( 16, 16 )
+
+[sub_resource type="Image" id=16]
+data = {
+"data": PoolByteArray( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ),
+"format": "RGBA8",
+"height": 16,
+"mipmaps": false,
+"width": 16
+}
+
+[sub_resource type="ImageTexture" id=4]
+image = SubResource( 16 )
+size = Vector2( 16, 16 )
+
+[sub_resource type="Image" id=17]
+data = {
+"data": PoolByteArray( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 224, 224, 224, 254, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 224, 224, 224, 254, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 224, 224, 224, 254, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 224, 224, 224, 254, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 224, 224, 224, 254, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 224, 224, 224, 254, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 224, 224, 224, 254, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 224, 224, 224, 254, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 224, 224, 224, 254, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 224, 224, 224, 254, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 224, 224, 224, 254, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 224, 224, 224, 254, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 222, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 238, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 64, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 238, 224, 224, 224, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ),
+"format": "RGBA8",
+"height": 16,
+"mipmaps": false,
+"width": 16
+}
+
+[sub_resource type="ImageTexture" id=6]
+image = SubResource( 17 )
+size = Vector2( 16, 16 )
+
+[sub_resource type="Image" id=18]
+data = {
+"data": PoolByteArray( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 48, 224, 224, 224, 142, 224, 224, 224, 238, 224, 224, 224, 238, 224, 224, 224, 174, 224, 224, 224, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 32, 224, 224, 224, 238, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 238, 224, 224, 224, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 158, 224, 224, 224, 254, 224, 224, 224, 190, 224, 224, 224, 48, 224, 224, 224, 32, 224, 224, 224, 190, 224, 224, 224, 254, 224, 224, 224, 158, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 32, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 16, 224, 224, 224, 254, 224, 224, 224, 238, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 32, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 16, 224, 224, 224, 254, 224, 224, 224, 254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 158, 224, 224, 224, 254, 224, 224, 224, 190, 0, 0, 0, 0, 224, 224, 224, 16, 224, 224, 224, 158, 224, 224, 224, 254, 224, 224, 224, 174, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 32, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 238, 224, 224, 224, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 48, 224, 224, 224, 158, 224, 224, 224, 254, 224, 224, 224, 238, 224, 224, 224, 190, 224, 224, 224, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ),
+"format": "RGBA8",
+"height": 16,
+"mipmaps": false,
+"width": 16
+}
+
+[sub_resource type="ImageTexture" id=8]
+image = SubResource( 18 )
+size = Vector2( 16, 16 )
+
+[sub_resource type="Image" id=19]
+data = {
+"data": PoolByteArray( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ),
+"format": "RGBA8",
+"height": 16,
+"mipmaps": false,
+"width": 16
+}
+
+[sub_resource type="ImageTexture" id=10]
+image = SubResource( 19 )
+size = Vector2( 16, 16 )
+
+[sub_resource type="Image" id=20]
+data = {
+"data": PoolByteArray( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 175, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 175, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 175, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 16, 224, 224, 224, 239, 224, 224, 224, 239, 224, 224, 224, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 80, 224, 224, 224, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ),
+"format": "RGBA8",
+"height": 16,
+"mipmaps": false,
+"width": 16
+}
+
+[sub_resource type="ImageTexture" id=12]
+image = SubResource( 20 )
+size = Vector2( 16, 16 )
+
+[sub_resource type="Image" id=21]
+data = {
+"data": PoolByteArray( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 224, 224, 224, 254, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 224, 224, 224, 254, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 224, 224, 224, 254, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 224, 224, 224, 254, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 224, 224, 224, 254, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 224, 224, 224, 254, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 224, 224, 224, 254, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 224, 224, 224, 254, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 224, 224, 224, 254, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 224, 224, 224, 254, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 224, 224, 224, 254, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 224, 224, 224, 254, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 222, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 238, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 64, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 238, 224, 224, 224, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ),
+"format": "RGBA8",
+"height": 16,
+"mipmaps": false,
+"width": 16
+}
+
+[sub_resource type="ImageTexture" id=14]
+image = SubResource( 21 )
+size = Vector2( 16, 16 )
+
+[node name="IniEditor" type="Control"]
+anchor_right = 1.0
+anchor_bottom = 1.0
+script = ExtResource( 1 )
+
+[node name="VBoxContainer" type="VBoxContainer" parent="."]
+anchor_right = 1.0
+anchor_bottom = 1.0
+
+[node name="HSplitContainer" type="HSplitContainer" parent="VBoxContainer"]
+margin_right = 1024.0
+margin_bottom = 595.0
+size_flags_vertical = 3
+split_offset = 100
+
+[node name="VBoxContainer" type="VBoxContainer" parent="VBoxContainer/HSplitContainer"]
+margin_right = 174.0
+margin_bottom = 595.0
+size_flags_vertical = 3
+
+[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer/HSplitContainer/VBoxContainer"]
+editor/display_folded = true
+margin_right = 174.0
+margin_bottom = 16.0
+
+[node name="sections_icon" type="TextureRect" parent="VBoxContainer/HSplitContainer/VBoxContainer/HBoxContainer"]
+margin_right = 16.0
+margin_bottom = 16.0
+texture = SubResource( 2 )
+
+[node name="Label" type="Label" parent="VBoxContainer/HSplitContainer/VBoxContainer/HBoxContainer"]
+margin_left = 20.0
+margin_top = 1.0
+margin_right = 174.0
+margin_bottom = 15.0
+size_flags_horizontal = 7
+text = "Sections"
+
+[node name="sections2" type="ItemList" parent="VBoxContainer/HSplitContainer/VBoxContainer"]
+margin_top = 20.0
+margin_right = 174.0
+margin_bottom = 567.0
+size_flags_vertical = 3
+allow_reselect = true
+auto_height = true
+same_column_width = true
+
+[node name="HBoxContainer2" type="HBoxContainer" parent="VBoxContainer/HSplitContainer/VBoxContainer"]
+editor/display_folded = true
+margin_top = 571.0
+margin_right = 174.0
+margin_bottom = 595.0
+alignment = 1
+
+[node name="btn_add_section" type="ToolButton" parent="VBoxContainer/HSplitContainer/VBoxContainer/HBoxContainer2"]
+margin_left = 57.0
+margin_right = 85.0
+margin_bottom = 24.0
+hint_tooltip = "Add a new Section"
+icon = SubResource( 4 )
+
+[node name="btn_remove_section" type="ToolButton" parent="VBoxContainer/HSplitContainer/VBoxContainer/HBoxContainer2"]
+margin_left = 89.0
+margin_right = 117.0
+margin_bottom = 24.0
+hint_tooltip = "Remove selected Section"
+icon = SubResource( 6 )
+
+[node name="VBoxContainer2" type="VBoxContainer" parent="VBoxContainer/HSplitContainer"]
+editor/display_folded = true
+margin_left = 186.0
+margin_right = 1024.0
+margin_bottom = 595.0
+size_flags_vertical = 3
+
+[node name="HBoxContainer2" type="HBoxContainer" parent="VBoxContainer/HSplitContainer/VBoxContainer2"]
+margin_right = 838.0
+margin_bottom = 16.0
+
+[node name="keys_icon" type="TextureRect" parent="VBoxContainer/HSplitContainer/VBoxContainer2/HBoxContainer2"]
+margin_right = 16.0
+margin_bottom = 16.0
+texture = SubResource( 8 )
+
+[node name="Label" type="Label" parent="VBoxContainer/HSplitContainer/VBoxContainer2/HBoxContainer2"]
+margin_left = 20.0
+margin_top = 1.0
+margin_right = 838.0
+margin_bottom = 15.0
+size_flags_horizontal = 7
+text = "Keys"
+
+[node name="keys" type="Tree" parent="VBoxContainer/HSplitContainer/VBoxContainer2"]
+margin_top = 20.0
+margin_right = 838.0
+margin_bottom = 567.0
+size_flags_vertical = 3
+columns = 2
+allow_reselect = true
+hide_folding = true
+select_mode = 1
+
+[node name="HBoxContainer3" type="HBoxContainer" parent="VBoxContainer/HSplitContainer/VBoxContainer2"]
+editor/display_folded = true
+margin_top = 571.0
+margin_right = 838.0
+margin_bottom = 595.0
+alignment = 1
+
+[node name="btn_add_key" type="ToolButton" parent="VBoxContainer/HSplitContainer/VBoxContainer2/HBoxContainer3"]
+margin_left = 373.0
+margin_right = 401.0
+margin_bottom = 24.0
+hint_tooltip = "Add a new Key"
+icon = SubResource( 10 )
+
+[node name="btn_edit_key" type="ToolButton" parent="VBoxContainer/HSplitContainer/VBoxContainer2/HBoxContainer3"]
+margin_left = 405.0
+margin_right = 433.0
+margin_bottom = 24.0
+hint_tooltip = "Edit selected Key"
+icon = SubResource( 12 )
+
+[node name="btn_remove_key" type="ToolButton" parent="VBoxContainer/HSplitContainer/VBoxContainer2/HBoxContainer3"]
+margin_left = 437.0
+margin_right = 465.0
+margin_bottom = 24.0
+hint_tooltip = "Remove selected Key"
+icon = SubResource( 14 )
+
+[node name="HSeparator" type="HSeparator" parent="VBoxContainer"]
+margin_top = 599.0
+margin_right = 1024.0
+margin_bottom = 600.0
+rect_min_size = Vector2( 0, 1 )
+custom_constants/separation = 0
+
+[node name="Section" type="AcceptDialog" parent="."]
+editor/display_folded = true
+anchor_left = 0.5
+anchor_top = 0.5
+anchor_right = 0.5
+anchor_bottom = 0.5
+margin_left = -153.0
+margin_top = -29.0
+margin_right = 155.0
+margin_bottom = 98.0
+window_title = ""
+
+[node name="Container" type="VBoxContainer" parent="Section"]
+anchor_right = 1.0
+anchor_bottom = 1.0
+margin_left = 8.0
+margin_top = 8.0
+margin_right = -8.0
+margin_bottom = -36.0
+
+[node name="section" type="HBoxContainer" parent="Section/Container"]
+margin_right = 292.0
+margin_bottom = 24.0
+
+[node name="Label" type="Label" parent="Section/Container/section"]
+margin_top = 5.0
+margin_right = 91.0
+margin_bottom = 19.0
+text = "Section name:"
+
+[node name="_name" type="LineEdit" parent="Section/Container/section"]
+margin_left = 95.0
+margin_right = 292.0
+margin_bottom = 24.0
+size_flags_horizontal = 3
+context_menu_enabled = false
+
+[node name="key" type="HBoxContainer" parent="Section/Container"]
+margin_top = 28.0
+margin_right = 292.0
+margin_bottom = 52.0
+
+[node name="Label" type="Label" parent="Section/Container/key"]
+margin_top = 5.0
+margin_right = 91.0
+margin_bottom = 19.0
+rect_min_size = Vector2( 91, 0 )
+text = "Key name:"
+align = 1
+
+[node name="_name" type="LineEdit" parent="Section/Container/key"]
+margin_left = 95.0
+margin_right = 292.0
+margin_bottom = 24.0
+size_flags_horizontal = 3
+context_menu_enabled = false
+
+[node name="value" type="HBoxContainer" parent="Section/Container"]
+margin_top = 56.0
+margin_right = 292.0
+margin_bottom = 80.0
+
+[node name="Label" type="Label" parent="Section/Container/value"]
+margin_top = 5.0
+margin_right = 91.0
+margin_bottom = 19.0
+rect_min_size = Vector2( 91, 0 )
+text = "Key value:"
+align = 1
+
+[node name="_value" type="LineEdit" parent="Section/Container/value"]
+margin_left = 95.0
+margin_right = 292.0
+margin_bottom = 24.0
+size_flags_horizontal = 3
+context_menu_enabled = false
+
+[node name="Key" type="ConfirmationDialog" parent="."]
+editor/display_folded = true
+anchor_left = 0.5
+anchor_top = 0.5
+anchor_right = 0.5
+anchor_bottom = 0.5
+margin_left = -150.0
+margin_top = -46.0
+margin_right = 151.0
+margin_bottom = 64.0
+window_title = "Add a new Key"
+
+[node name="data" type="VBoxContainer" parent="Key"]
+anchor_right = 1.0
+anchor_bottom = 1.0
+margin_left = 8.0
+margin_top = 8.0
+margin_right = -8.0
+margin_bottom = -36.0
+alignment = 1
+
+[node name="HBoxContainer" type="HBoxContainer" parent="Key/data"]
+margin_top = 7.0
+margin_right = 285.0
+margin_bottom = 31.0
+
+[node name="Label" type="Label" parent="Key/data/HBoxContainer"]
+margin_top = 5.0
+margin_right = 140.0
+margin_bottom = 19.0
+size_flags_horizontal = 3
+text = "Key name:"
+align = 1
+valign = 1
+
+[node name="name" type="LineEdit" parent="Key/data/HBoxContainer"]
+margin_left = 144.0
+margin_right = 285.0
+margin_bottom = 24.0
+size_flags_horizontal = 3
+
+[node name="HBoxContainer2" type="HBoxContainer" parent="Key/data"]
+margin_top = 35.0
+margin_right = 285.0
+margin_bottom = 59.0
+
+[node name="Label" type="Label" parent="Key/data/HBoxContainer2"]
+margin_top = 5.0
+margin_right = 140.0
+margin_bottom = 19.0
+size_flags_horizontal = 3
+text = "Key value:"
+align = 1
+valign = 1
+
+[node name="value" type="LineEdit" parent="Key/data/HBoxContainer2"]
+margin_left = 144.0
+margin_right = 285.0
+margin_bottom = 24.0
+size_flags_horizontal = 3
diff --git a/addons/file-editor/scenes/Preview.tscn b/addons/file-editor/scenes/Preview.tscn
index 4382ada..47fb6e7 100644
--- a/addons/file-editor/scenes/Preview.tscn
+++ b/addons/file-editor/scenes/Preview.tscn
@@ -25,6 +25,7 @@ font_data = ExtResource( 5 )
font_data = ExtResource( 6 )
[node name="Preview" type="WindowDialog"]
+visible = true
anchor_right = 1.0
anchor_bottom = 1.0
margin_left = 81.0
@@ -40,8 +41,9 @@ anchor_right = 1.0
anchor_bottom = 1.0
[node name="TextPreview" type="RichTextLabel" parent="Container"]
+visible = false
margin_right = 863.0
-margin_bottom = 505.0
+margin_bottom = 250.0
size_flags_vertical = 3
custom_fonts/mono_font = SubResource( 1 )
custom_fonts/bold_italics_font = SubResource( 2 )
@@ -50,4 +52,11 @@ custom_fonts/bold_font = SubResource( 4 )
custom_fonts/normal_font = SubResource( 5 )
bbcode_enabled = true
scroll_following = true
+
+[node name="TablePreview" type="GridContainer" parent="Container"]
+margin_right = 863.0
+margin_bottom = 505.0
+size_flags_horizontal = 3
+size_flags_vertical = 3
+columns = 3
[connection signal="popup_hide" from="." to="." method="_on_Preview_popup_hide"]
diff --git a/addons/file-editor/scenes/VanillaEditor.tscn b/addons/file-editor/scenes/VanillaEditor.tscn
new file mode 100644
index 0000000..6a12bad
--- /dev/null
+++ b/addons/file-editor/scenes/VanillaEditor.tscn
@@ -0,0 +1,88 @@
+[gd_scene load_steps=10 format=2]
+
+[ext_resource path="res://addons/file-editor/scripts/FileScene.gd" type="Script" id=1]
+[ext_resource path="res://addons/file-editor/fonts/Roboto-Black.ttf" type="DynamicFontData" id=2]
+
+[sub_resource type="StyleBoxEmpty" id=1]
+
+[sub_resource type="StyleBoxEmpty" id=2]
+
+[sub_resource type="StyleBoxEmpty" id=3]
+
+[sub_resource type="StyleBoxEmpty" id=4]
+
+[sub_resource type="StyleBoxEmpty" id=5]
+
+[sub_resource type="StyleBoxEmpty" id=6]
+
+[sub_resource type="DynamicFont" id=7]
+font_data = ExtResource( 2 )
+
+[node name="VanillaEditor" type="VBoxContainer"]
+anchor_right = 1.0
+anchor_bottom = 1.0
+size_flags_vertical = 3
+script = ExtResource( 1 )
+
+[node name="TextEditor" type="TextEdit" parent="."]
+margin_right = 1024.0
+margin_bottom = 577.0
+size_flags_vertical = 3
+syntax_highlighting = true
+show_line_numbers = true
+breakpoint_gutter = true
+highlight_all_occurrences = true
+override_selected_font_color = true
+smooth_scrolling = true
+hiding_enabled = 1
+wrap_enabled = true
+caret_blink = true
+caret_blink_speed = 1.0
+caret_moving_by_right_click = false
+
+[node name="FileInfo" type="HBoxContainer" parent="."]
+margin_top = 581.0
+margin_right = 1024.0
+margin_bottom = 600.0
+custom_constants/separation = 2
+
+[node name="lastmodified_icon" type="TextureRect" parent="FileInfo"]
+margin_bottom = 19.0
+stretch_mode = 4
+
+[node name="Label" type="Label" parent="FileInfo"]
+margin_left = 2.0
+margin_top = 2.0
+margin_right = 127.0
+margin_bottom = 16.0
+text = "Last modified time:"
+
+[node name="lastmodified" type="Label" parent="FileInfo"]
+margin_left = 129.0
+margin_top = 2.0
+margin_right = 129.0
+margin_bottom = 16.0
+
+[node name="Readonly" type="CheckBox" parent="FileInfo"]
+margin_left = 939.0
+margin_right = 1018.0
+margin_bottom = 19.0
+size_flags_horizontal = 10
+custom_styles/hover = SubResource( 1 )
+custom_styles/pressed = SubResource( 2 )
+custom_styles/focus = SubResource( 3 )
+custom_styles/disabled = SubResource( 4 )
+custom_styles/hover_pressed = SubResource( 5 )
+custom_styles/normal = SubResource( 6 )
+custom_fonts/font = SubResource( 7 )
+custom_colors/font_color = Color( 0.145098, 0.172549, 0.231373, 1 )
+custom_colors/font_color_pressed = Color( 1, 1, 1, 1 )
+text = "Can Edit"
+flat = true
+
+[node name="VSeparator3" type="VSeparator" parent="FileInfo"]
+margin_left = 1020.0
+margin_right = 1024.0
+margin_bottom = 19.0
+rect_min_size = Vector2( 4, 0 )
+[connection signal="text_changed" from="TextEditor" to="." method="_on_TextEditor_text_changed"]
diff --git a/addons/file-editor/scripts/FileEditor.gd b/addons/file-editor/scripts/FileEditor.gd
index 67d9234..95b0c6d 100644
--- a/addons/file-editor/scripts/FileEditor.gd
+++ b/addons/file-editor/scripts/FileEditor.gd
@@ -3,18 +3,22 @@ extends Control
onready var FileList = $FileList
-onready var Editor = $Container/Editor
-
-onready var OpenFile = $Container/Buttons/openfile_btn
-onready var NewFile = $Container/Buttons/newfile_btn
-onready var DeleteFile = $Container/Buttons/deletefile_btn
-
onready var NewFileDialogue = $NewFileDialogue
onready var NewFileDialogue_name = $NewFileDialogue/VBoxContainer/new_filename
-onready var Version = $Container/Buttons/version
+onready var FileBTN = $FileEditorContainer/TobBar/file_btn.get_popup()
+onready var PreviewBTN = $FileEditorContainer/TobBar/preview_btn.get_popup()
+onready var EditorBTN = $FileEditorContainer/TobBar/editor_btn.get_popup()
-var FileScene = load("res://addons/file-editor/scenes/FileScene.tscn")
+onready var Version = $FileEditorContainer/TobBar/version
+
+onready var VanillaEditor = $FileEditorContainer/SplitContainer/VanillaEditor
+onready var IniEditor = $FileEditorContainer/SplitContainer/IniEditor
+
+onready var OpenFileList = $FileEditorContainer/SplitContainer/BoxContainer/OpenFileList
+onready var OpenFileName = $FileEditorContainer/SplitContainer/BoxContainer/OpenFileName
+
+var Preview = preload("res://addons/file-editor/scenes/Preview.tscn")
var DIRECTORY : String = "res://"
var EXCEPTIONS : String = "addons"
@@ -33,107 +37,376 @@ var EXTENSIONS : PoolStringArray = [
"*.sql ; SQL database file",
"*.json ; JavaScript Object Notation File",
"*.html ; HyperText Markup Language",
+"*.csv ; Comma-separated values",
+"*.cfg ; Configuration File",
+"*.ini ; Initialization File (same as .cfg Configuration File)",
]
var directories = []
var files = []
+var current_file_index = -1
+var current_file_path = ""
+var save_as = false
func _ready():
- OpenFile.connect("pressed",self,"open_selected_file")
- NewFile.connect("pressed",self,"open_newfiledialogue")
- DeleteFile.connect("pressed",self,"delete_selected_file")
-
- NewFile.icon = IconLoader.load_icon_from_name("new")
- OpenFile.icon = IconLoader.load_icon_from_name("file")
- DeleteFile.icon = IconLoader.load_icon_from_name("delete")
-
- NewFileDialogue.connect("confirmed",self,"create_new_file")
+ clean_editor()
+ update_version()
+ connect_signals()
+ create_shortcuts()
+ load_icons()
- FileList.connect("confirmed",self,"update_list")
+ var opened_files : Array = LastOpenedFiles.load_opened_files()
+ for open_file in opened_files:
+ open_file(open_file[1])
FileList.set_filters(EXTENSIONS)
+ IniEditor.hide()
+
+func create_shortcuts():
+ var hotkey
- Editor.hide()
+ hotkey = InputEventKey.new()
+ hotkey.scancode = KEY_S
+ hotkey.control = true
+ FileBTN.set_item_accelerator(4,hotkey.get_scancode_with_modifiers()) # save file
+ hotkey = InputEventKey.new()
+ hotkey.scancode = KEY_N
+ hotkey.control = true
+ FileBTN.set_item_accelerator(0,hotkey.get_scancode_with_modifiers()) # new file
+
+ hotkey = InputEventKey.new()
+ hotkey.scancode = KEY_O
+ hotkey.control = true
+ FileBTN.set_item_accelerator(1,hotkey.get_scancode_with_modifiers()) # open file
+
+ hotkey = InputEventKey.new()
+ hotkey.scancode = KEY_D
+ hotkey.control = true
+ FileBTN.set_item_accelerator(6,hotkey.get_scancode_with_modifiers()) # delete file
+
+ hotkey = InputEventKey.new()
+ hotkey.scancode = KEY_S
+ hotkey.control = true
+ hotkey.alt = true
+ FileBTN.set_item_accelerator(5,hotkey.get_scancode_with_modifiers()) #save file as
+
+ hotkey = InputEventKey.new()
+ hotkey.scancode = KEY_C
+ hotkey.control = true
+ hotkey.alt = true
+ FileBTN.set_item_accelerator(2,hotkey.get_scancode_with_modifiers()) # close file
+
+ # vanilla editor -----------------------
+
+ hotkey = InputEventKey.new()
+ hotkey.scancode = KEY_1
+ hotkey.control = true
+ EditorBTN.set_item_accelerator(0,hotkey.get_scancode_with_modifiers()) # vanilla editor
+
+ hotkey = InputEventKey.new()
+ hotkey.scancode = KEY_3
+ hotkey.control = true
+ EditorBTN.set_item_accelerator(2,hotkey.get_scancode_with_modifiers()) # vanilla editor
+
+func load_icons():
+ $FileEditorContainer/TobBar/file_btn.icon = IconLoader.load_icon_from_name("file")
+ $FileEditorContainer/TobBar/preview_btn.icon = IconLoader.load_icon_from_name("read")
+ $FileEditorContainer/TobBar/editor_btn.icon = IconLoader.load_icon_from_name("edit_")
+
+func connect_signals():
+ FileList.connect("confirmed",self,"update_list")
+ FileBTN.connect("id_pressed",self,"_on_filebtn_pressed")
+ PreviewBTN.connect("id_pressed",self,"_on_previewbtn_pressed")
+ EditorBTN.connect("id_pressed",self,"_on_editorbtn_pressed")
+
+ OpenFileList.connect("item_selected",self,"_on_fileitem_pressed")
+
+ VanillaEditor.connect("text_changed",self,"_on_vanillaeditor_text_changed")
+
+ #---------------- to update from IniEditor to VanillaEditor
+ IniEditor.connect("update_file",self,"_on_update_file")
+
+ # ---- preview buttons
+
+
+func update_version():
var plugin_version = ""
var config = ConfigFile.new()
var err = config.load("res://addons/file-editor/plugin.cfg")
if err == OK:
plugin_version = config.get_value("plugin","version")
- update_version("v"+plugin_version)
+ Version.set_text("v"+plugin_version)
-func update_version(v : String):
- Version.set_text(v)
+func create_selected_file():
+ update_list()
+ FileList.mode = FileDialog.MODE_SAVE_FILE
+ FileList.set_title("Create a new File")
+ if FileList.is_connected("file_selected",self,"delete_file"):
+ FileList.disconnect("file_selected",self,"delete_file")
+ if FileList.is_connected("file_selected",self,"open_file"):
+ FileList.disconnect("file_selected",self,"open_file")
+ if not FileList.is_connected("file_selected",self,"create_new_file"):
+ FileList.connect("file_selected",self,"create_new_file")
+ open_filelist()
+
+func open_selected_file():
+ update_list()
+ FileList.mode = FileDialog.MODE_OPEN_FILE
+ FileList.set_title("Select a File you want to edit")
+ if FileList.is_connected("file_selected",self,"delete_file"):
+ FileList.disconnect("file_selected",self,"delete_file")
+ if FileList.is_connected("file_selected",self,"create_new_file"):
+ FileList.disconnect("file_selected",self,"create_new_file")
+ if not FileList.is_connected("file_selected",self,"open_file"):
+ FileList.connect("file_selected",self,"open_file")
+ open_filelist()
+
+func delete_selected_file():
+ update_list()
+ FileList.mode = FileDialog.MODE_OPEN_FILES
+ FileList.set_title("Select one or more Files you want to delete")
+ if FileList.is_connected("file_selected",self,"open_file"):
+ FileList.disconnect("file_selected",self,"open_file")
+ if FileList.is_connected("file_selected",self,"create_new_file"):
+ FileList.disconnect("file_selected",self,"create_new_file")
+ if not FileList.is_connected("files_selected",self,"delete_file"):
+ FileList.connect("files_selected",self,"delete_file")
+ open_filelist()
+
+func save_current_file_as():
+ update_list()
+ FileList.mode = FileDialog.MODE_SAVE_FILE
+ FileList.set_title("Save this File as...")
+ if FileList.is_connected("file_selected",self,"delete_file"):
+ FileList.disconnect("file_selected",self,"delete_file")
+ if FileList.is_connected("file_selected",self,"open_file"):
+ FileList.disconnect("file_selected",self,"open_file")
+ if not FileList.is_connected("file_selected",self,"create_new_file"):
+ FileList.connect("file_selected",self,"create_new_file")
+ open_filelist()
+
+func _on_filebtn_pressed(index : int):
+ match index:
+ 0:
+ create_selected_file()
+ 1:
+ open_selected_file()
+ 2:
+ if current_file_index!=-1 and current_file_path != "":
+ close_file(current_file_index)
+
+ 3:
+ if current_file_index!=-1 and current_file_path != "":
+ save_as = false
+ save_file(current_file_path)
+ 4:
+ if current_file_index!=-1 and current_file_path != "":
+ save_as = true
+ save_file(current_file_path)
+ save_current_file_as()
+ 5:
+ delete_selected_file()
+
+func _on_previewbtn_pressed(id : int):
+ if id == 0:
+ bbcode_preview()
+ elif id == 1:
+ markdown_preview()
+ elif id == 2:
+ html_preview()
+ elif id == 3:
+ csv_preview()
+ elif id == 4:
+ xml_preview()
+ elif id == 5:
+ json_preview()
+
+func _on_editorbtn_pressed(index : int):
+ match index:
+ 0:
+ if not VanillaEditor.visible:
+ VanillaEditor.show()
+ IniEditor.hide()
+ 2:
+ if not IniEditor.visible:
+ VanillaEditor.hide()
+ IniEditor.show()
+
+func _on_fileitem_pressed(index : int):
+ current_file_index = index
+ var selected_item_metadata = OpenFileList.get_item_metadata(index)
+ current_file_path = selected_item_metadata[2]
+
+ OpenFileName.set_text(current_file_path)
+
+ VanillaEditor.new_file_open(selected_item_metadata[0],selected_item_metadata[1])
+ open_in_inieditor(current_file_path)
+
+func close_file(index):
+ LastOpenedFiles.remove_opened_file(index,OpenFileList)
+ OpenFileList.remove_item(index)
+ OpenFileName.clear()
+ VanillaEditor.clean_editor()
func open_file(path : String):
+ if current_file_path != path:
+ current_file_path = path
+
+ open_in_vanillaeditor(path)
+ open_in_inieditor(path)
+
+ LastOpenedFiles.store_opened_files(OpenFileList)
+
+func open_in_vanillaeditor(path : String):
var current_file : File = File.new()
current_file.open(path,File.READ)
- var current_content = current_file.get_as_text()
+ var current_content = current_file.get_as_text()
var last_modified = OS.get_datetime_from_unix_time(current_file.get_modified_time(path))
- var file_tab = FileScene.instance()
- Editor.add_child(file_tab)
+ current_file.close()
- file_tab.new_file_open(path,current_content,last_modified)
+ OpenFileName.set_text(path)
+ OpenFileList.add_item(path.get_file(),IconLoader.load_icon_from_name("file"),true)
+ current_file_index = OpenFileList.get_item_count()-1
+ OpenFileList.set_item_metadata(current_file_index,[current_content,last_modified,path])
- Editor.show()
+ VanillaEditor.new_file_open(current_content,last_modified)
+
+ update_list()
+
+ OpenFileList.select(OpenFileList.get_item_count()-1)
+
+func open_in_inieditor(path : String):
+ var extension = path.get_file().get_extension()
+ if extension == "ini" or extension == "cfg":
+ IniEditor.current_file_path = path
+ var current_file : ConfigFile = ConfigFile.new()
+ var err = current_file.load(path)
+ if err == OK:
+ var sections = current_file.get_sections()
+ var filemap = []
+ for section in sections:
+ var keys = []
+ var section_keys = current_file.get_section_keys(section)
+ for key in section_keys:
+ keys.append([key,current_file.get_value(section,key)])
+
+ filemap.append([section,keys])
+
+ IniEditor.open_file(filemap)
+ else:
+ IniEditor.clean_editor()
+
+
+func _on_update_file():
+ VanillaEditor.clean_editor()
+ var current_file : File = File.new()
+ current_file.open(current_file_path,File.READ)
+
+ var current_content = current_file.get_as_text()
+ var last_modified = OS.get_datetime_from_unix_time(current_file.get_modified_time(current_file_path))
current_file.close()
+
+ VanillaEditor.new_file_open(current_content,last_modified)
+
+func delete_file(files_selected : PoolStringArray):
+ var dir = Directory.new()
+ for file in files_selected:
+ dir.remove(file)
+
update_list()
func open_newfiledialogue():
NewFileDialogue.popup()
NewFileDialogue.set_position(OS.get_screen_size()/2 - NewFileDialogue.get_size()/2)
-func create_new_file():
- if NewFileDialogue_name.get_text():
- NewFileDialogue.hide()
- var new_file_tab = FileScene.instance()
- Editor.add_child(new_file_tab)
- new_file_tab.new_file_create(NewFileDialogue_name.get_text())
- Editor.show()
- update_list()
- else:
- print(" cannot be empty! Please, give your file a name.")
-
func open_filelist():
update_list()
FileList.popup()
FileList.set_position(OS.get_screen_size()/2 - FileList.get_size()/2)
-func open_selected_file():
- update_list()
- FileList.mode = FileDialog.MODE_OPEN_FILE
- FileList.set_title("Select a file you want to edit")
- if FileList.is_connected("file_selected",self,"delete_file"):
- FileList.disconnect("file_selected",self,"delete_file")
- if not FileList.is_connected("file_selected",self,"open_file"):
- FileList.connect("file_selected",self,"open_file")
- else:
- FileList.disconnect("file_selected",self,"open_file")
- FileList.connect("file_selected",self,"open_file")
- open_filelist()
+func _on_vanillaeditor_text_changed():
+ if not OpenFileList.get_item_text(current_file_index).ends_with("(*)"):
+ OpenFileList.set_item_text(current_file_index,OpenFileList.get_item_text(current_file_index)+"(*)")
-func delete_selected_file():
- update_list()
- FileList.mode = FileDialog.MODE_OPEN_FILE
- FileList.set_title("Select a file you want to delete")
- if FileList.is_connected("file_selected",self,"open_file"):
- FileList.disconnect("file_selected",self,"open_file")
- if not FileList.is_connected("file_selected",self,"delete_file"):
- FileList.connect("file_selected",self,"delete_file")
- else:
- FileList.disconnect("file_selected",self,"delete_file")
- FileList.connect("file_selected",self,"delete_file")
- open_filelist()
-
-func delete_file(path : String):
- var dir = Directory.new()
- dir.remove(path)
+func create_new_file(given_path : String):
+ var current_file = File.new()
+ current_file.open(given_path,File.WRITE)
+ if save_as :
+ current_file.store_line(VanillaEditor.get_node("TextEditor").get_text())
+ current_file.close()
+ open_file(given_path)
+
+func save_file(current_path : String):
+ var current_file = File.new()
+ current_file.open(current_path,File.WRITE)
+ var current_content = VanillaEditor.get_node("TextEditor").get_text()
+ if current_content == null:
+ current_content = ""
+ current_file.store_line(current_content)
+ current_file.close()
+
+ current_file_path = current_file_path
+
+ var last_modified = OS.get_datetime_from_unix_time(current_file.get_modified_time(current_path))
+
+ VanillaEditor.update_lastmodified(last_modified,"save")
+ OpenFileList.set_item_metadata(current_file_index,[current_content,last_modified,current_path])
+
+ if OpenFileList.get_item_text(current_file_index).ends_with("(*)"):
+ OpenFileList.set_item_text(current_file_index,OpenFileList.get_item_text(current_file_index).rstrip("(*)"))
+
+ open_in_inieditor(current_file_path)
update_list()
+func clean_editor():
+ OpenFileName.clear()
+ OpenFileList.clear()
+ VanillaEditor.clean_editor()
+ IniEditor.clean_editor()
+
+func csv_preview():
+ var preview = Preview.instance()
+ get_parent().get_parent().get_parent().add_child(preview)
+ preview.popup()
+ preview.window_title += " ("+current_file_path.get_file()+")"
+ var lines = VanillaEditor.get_node("TextEditor").get_line_count()
+ var rows = []
+ for i in range(0,lines-1):
+ rows.append(VanillaEditor.get_node("TextEditor").get_line(i).rsplit(",",false))
+ preview.print_csv(rows)
+
+func bbcode_preview():
+ var preview = Preview.instance()
+ get_parent().get_parent().get_parent().add_child(preview)
+ preview.popup()
+ preview.window_title += " ("+current_file_path.get_file()+")"
+ preview.print_bb(VanillaEditor.get_node("TextEditor").get_text())
+
+func markdown_preview():
+ var preview = Preview.instance()
+ get_parent().get_parent().get_parent().add_child(preview)
+ preview.popup()
+ preview.window_title += " ("+current_file_path.get_file()+")"
+ preview.print_markdown(VanillaEditor.get_node("TextEditor").get_text())
+
+func html_preview():
+ var preview = Preview.instance()
+ get_parent().get_parent().get_parent().add_child(preview)
+ preview.popup()
+ preview.window_title += " ("+current_file_path.get_file()+")"
+ preview.print_html(VanillaEditor.get_node("TextEditor").get_text())
+
+func xml_preview():
+ pass
+
+func json_preview():
+ pass
+
func update_list():
FileList.invalidate()
\ No newline at end of file
diff --git a/addons/file-editor/scripts/FileScene.gd b/addons/file-editor/scripts/FileScene.gd
index ddd1adf..3ee0120 100644
--- a/addons/file-editor/scripts/FileScene.gd
+++ b/addons/file-editor/scripts/FileScene.gd
@@ -1,10 +1,8 @@
tool
extends VBoxContainer
-onready var CloseFile = $TopBar/close_btn
onready var ReadOnly = $FileInfo/Readonly
-onready var FileButton = $TopBar/FileButton.get_popup()
onready var TextEditor = $TextEditor
@@ -14,8 +12,6 @@ onready var FileList = get_parent().get_parent().get_parent().get_node("FileList
onready var ClosingFile = get_parent().get_parent().get_parent().get_node("ConfirmationDialog")
-onready var FilePath = $TopBar/filepath
-
onready var LastModifiedIcon = $FileInfo/lastmodified_icon
var current_path = ""
@@ -23,121 +19,37 @@ var current_filename = ""
var old_file_content = ""
var Preview = load("res://addons/file-editor/scenes/Preview.tscn")
+signal text_changed()
+
func _ready():
- FileButton.connect("id_pressed",self,"button_pressed")
ClosingFile.connect("confirmed",self,"queue_free")
- CloseFile.connect("pressed",self,"close_editor")
-
ReadOnly.connect("toggled",self,"_on_Readonly_toggled")
ReadOnly.set("custom_icons/checked",IconLoader.load_icon_from_name("read"))
ReadOnly.set("custom_icons/unchecked",IconLoader.load_icon_from_name("edit"))
-func new_file_open(file_path, file_content, last_modified) :
- current_path = file_path
- var filename_ = file_path.get_file().replace(".","-")
-
- FilePath.set_text(current_path)
-
- if get_parent().has_node(filename_):
- queue_free()
- else:
- set_name(filename_)
- current_filename = filename_
- old_file_content = file_content
- TextEditor.set_text(file_content)
-
- LastModifiedIcon.texture = IconLoader.load_icon_from_name("saveas")
- LastModified.set_text(str(last_modified.hour)+":"+str(last_modified.minute)+" "+str(last_modified.day)+"/"+str(last_modified.month)+"/"+str(last_modified.year))
-
+func clean_editor():
+ TextEditor.set_text("")
+ LastModifiedIcon.texture = IconLoader.load_icon_from_name("save")
+ LastModified.set_text("")
FileList.invalidate()
+func new_file_open(file_content, last_modified):
+ TextEditor.set_text(file_content)
+ update_lastmodified(last_modified,"save")
+ FileList.invalidate()
+
+func update_lastmodified(last_modified : Dictionary, icon : String):
+ LastModified.set_text(str(last_modified.hour)+":"+str(last_modified.minute)+" "+str(last_modified.day)+"/"+str(last_modified.month)+"/"+str(last_modified.year))
+ LastModifiedIcon.texture = IconLoader.load_icon_from_name(icon)
+
func new_file_create(file_name):
- set_name(file_name)
- current_filename = file_name
- FileButton.set_item_disabled(0,true)
+ TextEditor.set_text("")
FileList.invalidate()
-func save_file(current_path : String):
- var current_file = File.new()
- current_file.open(current_path,File.WRITE)
- var current_content = TextEditor.get_text()
- if current_content == null:
- current_content = ""
- current_file.store_line(current_content)
- current_file.close()
- old_file_content = current_content
-
- var last_modified = OS.get_datetime_from_unix_time(current_file.get_modified_time(current_path))
- LastModified.set_text(str(last_modified.hour)+":"+str(last_modified.minute)+" "+str(last_modified.day)+"/"+str(last_modified.month)+"/"+str(last_modified.year))
- LastModifiedIcon.texture = IconLoader.load_icon_from_name("save")
- FilePath.set_text(current_path)
-
- FileList.invalidate()
-
-func save_file_as():
- var current_content = TextEditor.get_text()
- FileList.mode = FileDialog.MODE_SAVE_FILE
- FileList.set_title("Save this file as...")
- if FileList.is_connected("file_selected",self,"delete_file"):
- FileList.disconnect("file_selected",self,"delete_file")
- if not FileList.is_connected("file_selected",self,"save_file"):
- FileList.connect("file_selected",self,"save_file")
- FileList.current_file = current_filename.replace("-",".")
- open_filelist()
- old_file_content = current_content
-
- FileList.invalidate()
-
-func open_filelist():
- FileList.popup()
- FileList.set_position(OS.get_screen_size()/2 - FileList.get_size()/2)
-
-func button_pressed(id : int):
- if id == 0:
- save_file(current_path)
- elif id == 1:
- save_file_as()
- elif id == 2:
- open_preview()
- elif id == 3:
- bbcode_preview()
- elif id == 4:
- markdown_preview()
- elif id == 5:
- html_preview()
-
-func open_preview():
- var preview = Preview.instance()
- get_parent().get_parent().get_parent().add_child(preview)
- preview.popup()
- preview.window_title += " ("+current_filename+")"
- preview.print_preview(TextEditor.get_text())
-
-func bbcode_preview():
- var preview = Preview.instance()
- get_parent().get_parent().get_parent().add_child(preview)
- preview.popup()
- preview.window_title += " ("+current_filename+")"
- preview.print_bb(TextEditor.get_text())
-
-func markdown_preview():
- var preview = Preview.instance()
- get_parent().get_parent().get_parent().add_child(preview)
- preview.popup()
- preview.window_title += " ("+current_filename+")"
- preview.print_markdown(TextEditor.get_text())
-
-func html_preview():
- var preview = Preview.instance()
- get_parent().get_parent().get_parent().add_child(preview)
- preview.popup()
- preview.window_title += " ("+current_filename+")"
- preview.print_html(TextEditor.get_text())
-
func close_editor():
if old_file_content != TextEditor.get_text():
ClosingFile.popup()
@@ -154,3 +66,4 @@ func _on_Readonly_toggled(button_pressed):
func _on_TextEditor_text_changed():
LastModifiedIcon.texture = IconLoader.load_icon_from_name("saveas")
+ emit_signal("text_changed")
diff --git a/addons/file-editor/scripts/IconLoader.gd b/addons/file-editor/scripts/IconLoader.gd
index 068ee1b..a830b0e 100644
--- a/addons/file-editor/scripts/IconLoader.gd
+++ b/addons/file-editor/scripts/IconLoader.gd
@@ -1,6 +1,9 @@
tool
extends Node
+func _ready():
+ pass
+
func load_icon_from_name(icon_name : String) -> ImageTexture:
var file = File.new()
var image = Image.new()
diff --git a/addons/file-editor/scripts/IniVisualEditor.gd b/addons/file-editor/scripts/IniVisualEditor.gd
new file mode 100644
index 0000000..fb1b34c
--- /dev/null
+++ b/addons/file-editor/scripts/IniVisualEditor.gd
@@ -0,0 +1,274 @@
+extends Control
+tool
+
+onready var Keys = $VBoxContainer/HSplitContainer/VBoxContainer2/keys
+onready var Sections = $VBoxContainer/HSplitContainer/VBoxContainer/sections2
+
+onready var BtnAddSection = $VBoxContainer/HSplitContainer/VBoxContainer/HBoxContainer2/btn_add_section
+onready var BtnRemoveSection = $VBoxContainer/HSplitContainer/VBoxContainer/HBoxContainer2/btn_remove_section
+
+onready var BtnAddKey = $VBoxContainer/HSplitContainer/VBoxContainer2/HBoxContainer3/btn_add_key
+onready var BtnEditKey = $VBoxContainer/HSplitContainer/VBoxContainer2/HBoxContainer3/btn_edit_key
+onready var BtnRemoveKey = $VBoxContainer/HSplitContainer/VBoxContainer2/HBoxContainer3/btn_remove_key
+
+onready var Section = $Section
+onready var Key = $Key
+
+var selected_key
+var selected_section : int = -1
+var root : TreeItem
+
+var current_file_path : String = ""
+
+signal update_file()
+
+func _ready():
+ create_table_names()
+ connect_signals()
+ load_icons()
+ clean_editor()
+
+
+
+# var metadata = [["name","Godot Engine"],["version","1.0.0"],["color","Light Blue"]]
+# load_section("Engine", metadata)
+
+func connect_signals():
+ Sections.connect("item_selected",self,"_on_section_selected")
+ Sections.connect("nothing_selected",self,"_on_nosection_selected")
+
+ BtnAddSection.connect("pressed",self,"_on_addsection_pressed")
+ BtnRemoveSection.connect("pressed",self,"_on_removesection_pressed")
+
+ Keys.connect("item_selected",self,"_on_key_selected")
+ Keys.connect("nothing_selected",self,"_on_nokey_selected")
+
+ BtnAddKey.connect("pressed",self,"_on_addkey_pressed")
+ BtnRemoveKey.connect("pressed",self,"_on_removekey_pressed")
+ BtnEditKey.connect("pressed",self,"_on_editkey_pressed")
+
+func create_table_names():
+ create_root()
+ Keys.hide_root = true
+
+ Keys.set_column_titles_visible(true)
+ Keys.set_column_title(0,"Name")
+ Keys.set_column_title(1,"Value")
+
+func load_icons():
+ $VBoxContainer/HSplitContainer/VBoxContainer/HBoxContainer/sections_icon.texture = IconLoader.load_icon_from_name("sections")
+ $VBoxContainer/HSplitContainer/VBoxContainer2/HBoxContainer2/keys_icon.texture = IconLoader.load_icon_from_name("keys")
+ BtnAddSection.icon = IconLoader.load_icon_from_name("add")
+ BtnAddSection.hint_tooltip = "Add a new Section"
+ BtnRemoveSection.icon = IconLoader.load_icon_from_name("delete")
+ BtnRemoveSection.hint_tooltip = "Remove selected Section"
+
+ BtnAddKey.icon = IconLoader.load_icon_from_name("add")
+ BtnAddKey.hint_tooltip = "Add a new Key"
+ BtnRemoveKey.icon = IconLoader.load_icon_from_name("delete")
+ BtnRemoveKey.hint_tooltip = "Remove selected Key"
+ BtnEditKey.icon = IconLoader.load_icon_from_name("edit_")
+ BtnEditKey.hint_tooltip = "Edit selected Key"
+
+func _on_addsection_pressed():
+ Section.get_node("Container/section/_name").show()
+ Section.window_title = "Add a new Section"
+ if not Section.is_connected("confirmed",self,"new_section"):
+ Section.connect("confirmed",self,"new_section")
+ if Section.is_connected("confirmed",self,"remove_section"):
+ Section.disconnect("confirmed",self,"remove_section")
+ Section.popup()
+
+func _on_removesection_pressed():
+ Section.get_node("Container").hide()
+ Section.window_title = "Remove selected Section"
+ Section.dialog_text = "Are you sure you want to remove this Section?"
+ if not Section.is_connected("confirmed",self,"remove_section"):
+ Section.connect("confirmed",self,"remove_section")
+ if Section.is_connected("confirmed",self,"new_section"):
+ Section.disconnect("confirmed",self,"new_section")
+ Section.popup()
+
+func _on_addkey_pressed():
+ Key.get_node("data").show()
+ Key.get_node("data/HBoxContainer/name").editable = true
+ Key.get_node("data/HBoxContainer/name").set_text("")
+ Key.window_title = "Add a new Key"
+ Key.dialog_text = ""
+ if not Key.is_connected("confirmed",self,"new_key"):
+ Key.connect("confirmed",self,"new_key")
+ if Key.is_connected("confirmed",self,"edit_key"):
+ Key.disconnect("confirmed",self,"edit_key")
+ if Key.is_connected("confirmed",self,"remove_key"):
+ Key.disconnect("confirmed",self,"remove_key")
+ Key.popup()
+
+func _on_removekey_pressed():
+ Key.get_node("data").hide()
+ Key.window_title = "Delete selected Key"
+ Key.dialog_text = "Are you sure you want to remove the selected Key?"
+ if not Key.is_connected("confirmed",self,"remove_key"):
+ Key.connect("confirmed",self,"remove_key")
+ if Key.is_connected("confirmed",self,"edit_key"):
+ Key.disconnect("confirmed",self,"edit_key")
+ if Key.is_connected("confirmed",self,"new_key"):
+ Key.disconnect("confirmed",self,"new_key")
+ Key.popup()
+
+func _on_editkey_pressed():
+ Key.get_node("data").show()
+ Key.get_node("data/HBoxContainer/name").editable = false
+ Key.get_node("data/HBoxContainer/name").set_text(str(selected_key.get_text(0)))
+ Key.window_title = "Edit selected Key"
+ Key.dialog_text = ""
+ if not Key.is_connected("confirmed",self,"edit_key"):
+ Key.connect("confirmed",self,"edit_key")
+ if Key.is_connected("confirmed",self,"remove_key"):
+ Key.disconnect("confirmed",self,"remove_key")
+ if Key.is_connected("confirmed",self,"new_key"):
+ Key.disconnect("confirmed",self,"new_key")
+ Key.popup()
+
+func clean_editor():
+ Keys.clear()
+ Sections.clear()
+ selected_section = -1
+ BtnAddKey.disabled = true
+ if current_file_path == "":
+ BtnAddSection.disabled = true
+ else:
+ BtnAddSection.disabled = false
+ BtnEditKey.disabled = true
+ BtnRemoveKey.disabled = true
+ BtnRemoveSection.disabled = true
+
+ create_root()
+
+func open_file(filemap : Array):
+ clean_editor()
+ for section in filemap:
+ load_sections(section[0],section[1])
+
+func new_section():
+ var file = ConfigFile.new()
+ file.load(current_file_path)
+
+ var section_name = str(Section.get_node("Container/section/_name").get_text())
+ var key_name = str(Section.get_node("Container/key/_name").get_text())
+ var key_value = Section.get_node("Container/value/_value").get_text()
+
+ if section_name and key_name and key_value:
+ file.set_value(section_name,key_name,key_value)
+ file.save(current_file_path)
+
+ load_sections(section_name,[[key_name,key_value]])
+
+ emit_signal("update_file")
+ else:
+ print("Section <",section_name,"> with Key name: <",key_name,"> and Key value: <",key_value,"> not valid.")
+
+func remove_section():
+ var file = ConfigFile.new()
+ file.load(current_file_path)
+ var current_section = Sections.get_item_text(selected_section)
+ file.erase_section(current_section)
+ Sections.remove_item(selected_section)
+ file.save(current_file_path)
+
+ emit_signal("update_file")
+
+func new_key():
+ var key_name = str(Key.get_node("data/HBoxContainer/name").get_text())
+ var key_value = Key.get_node("data/HBoxContainer2/value").get_text()
+ if key_name and key_value:
+
+ var file = ConfigFile.new()
+ file.load(current_file_path)
+
+ var current_section = Sections.get_item_text(selected_section)
+
+ file.set_value(current_section,key_name,key_value)
+ file.save(current_file_path)
+
+ load_keys_selected_section([[key_name,key_value]])
+
+ file.save(current_file_path)
+
+ emit_signal("update_file")
+ else:
+ print("Key name: <",key_name,"> with Key value: <",key_value,"> not valid.")
+
+func remove_key():
+ var section = Sections.get_item_text(selected_section)
+ var sectionmetadata = Sections.get_item_metadata(selected_section)
+
+ for meta in sectionmetadata:
+ if meta.has(selected_key.get_text(0)):
+ sectionmetadata.erase(meta)
+
+ Sections.set_item_metadata(selected_section,sectionmetadata)
+
+ if Sections.get_item_metadata(selected_section) == []:
+ Sections.remove_item(selected_section)
+
+ var file = ConfigFile.new()
+ file.load(current_file_path)
+ file.set_value(section,selected_key.get_text(0),null)
+ file.save(current_file_path)
+
+ Keys.clear()
+ create_root()
+ load_keys_selected_section(sectionmetadata)
+
+ emit_signal("update_file")
+
+func edit_key():
+ remove_key()
+ new_key()
+
+# load a section with custom fields @section_name = name of section ; @section_metadata = keys of this section with keys' properties
+func load_sections(section_name : String, section_metadata : Array):
+ Sections.add_item(section_name,IconLoader.load_icon_from_name("section"),true)
+ Sections.set_item_metadata(Sections.get_item_count()-1,section_metadata)
+
+# load a key of a selected section to fill the "keys" list
+func load_keys_selected_section(metadata : Array):
+ for key in metadata:
+ var key_item = Keys.create_item(root)
+ key_item.set_text(0,key[0])
+ key_item.set_text(1,key[1])
+
+func _on_section_selected(index : int):
+ Keys.clear()
+ create_root()
+ BtnRemoveSection.disabled = false
+ BtnAddSection.disabled = false
+ BtnAddKey.disabled = false
+ BtnRemoveKey.disabled = true
+ BtnEditKey.disabled = true
+
+ selected_section = index
+ if Sections.get_item_metadata(index):
+ load_keys_selected_section(Sections.get_item_metadata(index))
+
+func _on_key_selected():
+ selected_key = Keys.get_selected()
+ BtnRemoveKey.disabled = false
+ BtnEditKey.disabled = false
+
+func _on_nosection_selected():
+ BtnRemoveKey.disabled = true
+ BtnAddKey.disabled = true
+ BtnEditKey.disabled = true
+ BtnRemoveSection.disabled = true
+ Keys.clear()
+ selected_section = -1
+
+func _on_nokey_selected():
+ BtnRemoveKey.disabled = true
+ BtnEditKey.disabled = true
+
+func create_root():
+ root = Keys.create_item()
+ root.set_text(0,"KEY_NAME")
+ root.set_text(1,"KEY_VALUE")
\ No newline at end of file
diff --git a/addons/file-editor/scripts/LastOpenedFiles.gd b/addons/file-editor/scripts/LastOpenedFiles.gd
new file mode 100644
index 0000000..063f0e6
--- /dev/null
+++ b/addons/file-editor/scripts/LastOpenedFiles.gd
@@ -0,0 +1,33 @@
+tool
+extends Node
+
+const lastopenedfile_path : String = "res://addons/file-editor/lastopenedfiles.lastcfg"
+
+func _ready():
+ pass
+
+func store_opened_files(filecontainer : Control):
+ var file = ConfigFile.new()
+ file.load(lastopenedfile_path)
+ for child in range(0,filecontainer.get_item_count()):
+ var filepath = filecontainer.get_item_metadata(child)[2]
+ file.set_value("Opened",filepath.get_file(),filepath)
+
+ file.save(lastopenedfile_path)
+
+func remove_opened_file(index : int , filecontainer : Control):
+ var file = ConfigFile.new()
+ file.load(lastopenedfile_path)
+ var filepath = filecontainer.get_item_metadata(index)[2]
+ file.set_value("Opened",filepath.get_file(),null)
+ file.save(lastopenedfile_path)
+
+func load_opened_files() -> Array:
+ var file = ConfigFile.new()
+ file.load(lastopenedfile_path)
+ var keys = []
+ if file.has_section("Opened"):
+ var openedfiles = file.get_section_keys("Opened")
+ for openedfile in openedfiles:
+ keys.append([openedfile,file.get_value("Opened",openedfile)])
+ return keys
\ No newline at end of file
diff --git a/addons/file-editor/scripts/Preview.gd b/addons/file-editor/scripts/Preview.gd
index 8934fef..83e8fd6 100644
--- a/addons/file-editor/scripts/Preview.gd
+++ b/addons/file-editor/scripts/Preview.gd
@@ -2,15 +2,19 @@ tool
extends WindowDialog
onready var TextPreview = $Container/TextPreview
+onready var TablePreview = $Container/TablePreview
func _ready():
- pass
+ TextPreview.hide()
+ TablePreview.hide()
func print_preview(content : String):
TextPreview.append_bbcode(content)
+ TextPreview.show()
func print_bb(content : String):
TextPreview.append_bbcode(content)
+ TextPreview.show()
func print_markdown(content : String):
var result = ""
@@ -49,7 +53,7 @@ func print_markdown(content : String):
for res in result:
coded.append(res.get_string("coded"))
- regex.compile("[+-](?\\s.*)")
+ regex.compile("[+-*](?\\s.*)")
result = regex.search_all(content)
if result:
for res in result:
@@ -89,8 +93,11 @@ func print_markdown(content : String):
content = content.replace("-"+element,"[indent]-"+element+"[/indent]")
if content.find("+ "+element):
content = content.replace("+"+element,"[indent]-"+element+"[/indent]")
+ if content.find("* "+element):
+ content = content.replace("+"+element,"[indent]-"+element+"[/indent]")
TextPreview.append_bbcode(content)
+ TextPreview.show()
func print_html(content : String):
content = content.replace("","[i]")
@@ -99,6 +106,10 @@ func print_html(content : String):
content = content.replace("","[/b]")
content = content.replace("","[u]")
content = content.replace("","[/u]")
+ content = content.replace("","[u]")
+ content = content.replace("","[/u]")
+ content = content.replace("","[s]")
+ content = content.replace("","[/s]")
content = content.replace('',"]")
content = content.replace("","[/url]")
@@ -111,6 +122,21 @@ func print_html(content : String):
content = content.replace("","[/center]")
TextPreview.append_bbcode(content)
+ TextPreview.show()
+
+func print_csv(rows : Array):
+ TablePreview.columns = rows[0].size()
+ for item in rows:
+ for string in item:
+ var label = Label.new()
+ label.text = str(string)
+ label.set_h_size_flags(SIZE_EXPAND)
+ label.set_align(1)
+ label.set_valign(1)
+ TablePreview.add_child(label)
+
+
+ TablePreview.show()
func _on_Preview_popup_hide():
queue_free()
diff --git a/addons/file-editor/scripts/file-editor.gd b/addons/file-editor/scripts/file-editor.gd
index 576a861..444da96 100644
--- a/addons/file-editor/scripts/file-editor.gd
+++ b/addons/file-editor/scripts/file-editor.gd
@@ -9,12 +9,15 @@ var IconLoader = preload("res://addons/file-editor/scripts/IconLoader.gd")
func _enter_tree():
add_autoload_singleton("IconLoader","res://addons/file-editor/scripts/IconLoader.gd")
+ add_autoload_singleton("LastOpenedFiles","res://addons/file-editor/scripts/LastOpenedFiles.gd")
get_editor_interface().get_editor_viewport().add_child(doc)
doc.hide()
func _exit_tree():
+ doc.clean_editor()
get_editor_interface().get_editor_viewport().remove_child(doc)
remove_autoload_singleton("IconLoader")
+ remove_autoload_singleton("LastOpenedFiles")
func has_main_screen():
return true