Compare commits

..

No commits in common. "master" and "v0.1.0" have entirely different histories.

71 changed files with 420 additions and 2041 deletions

View File

@ -1,32 +0,0 @@
---
name: Bug report
about: Create a report to help us improve
title: "[BUG]"
labels: bug
assignees: ''
---
**Describe the bug**
A clear and concise description of what the bug is.
**To Reproduce**
Steps to reproduce the behavior:
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error
**Expected behavior**
A clear and concise description of what you expected to happen.
**Screenshots**
If applicable, add screenshots to help explain your problem.
**Desktop (please complete the following information):**
- OS: [e.g. Windows]
- Godot Engine Version [e.g. 3.2.3rc6]
- Plugin Version [e.g. v1.7.0]
**Additional context**
Add any other context about the problem here.

View File

@ -1,17 +0,0 @@
---
name: Feature request
about: Suggest an idea for this project
title: "[FEATURE]"
labels: enhancement
assignees: ''
---
**Describe the solution you'd like**
A clear and concise description of what you want to happen.
**Describe an implementation suggestion**
A clear and concise description of any implementation method you'd like to suggest. It may be technical or just theoretical.
**Additional context**
Add any other context or screenshots about the feature request here.

48
.gitignore vendored
View File

@ -1,26 +1,22 @@
# Godot-specific ignores
.import/
scn/
.import
default_env.tres
icon.png
icon.png.import
project.godot
# Imported translations (automatically generated from CSV files)
*.translation
# Mono-specific ignores
.mono/
data_*/
mono_crash.*.json
# System/tool-specific ignores
.directory
*~
# Plugin specific ignores
icons.pngs/
fonts/
file.samples/
icon.png
dist
dist-*
cabal-dev
*.o
*.hi
*.chi
*.chs.h
*.dyn_o
*.dyn_hi
.hpc
.hsenv
.cabal-sandbox/
cabal.sandbox.config
*.prof
*.aux
*.hp
*.eventlog
.stack-work/
cabal.project.local
cabal.project.local~
.HTF/
.ghc.environment.*

View File

@ -1,7 +1,6 @@
MIT License
Copyright (c) 2020 fenix-hub
Copyright (c) 2022 Péter Magyar
Copyright (c) 2019 fenix-hub
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal

View File

@ -1,3 +0,0 @@
[gd_scene format=2]
[node name="Node2D" type="Node2D"]

View File

@ -1,70 +1,14 @@
<p align="right">
<a href="https://discord.gg/KnJGY9S">
<img src="https://github.com/fenix-hub/ColoredBadges/blob/master/svg/social/discord.svg" alt="react" style="vertical-align:top; margin:6px 4px">
</a>
</p>
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)!
<img src="addons/file-editor/icon.png" width="64" height="64" align="left">
# Godot File Editor
A little plugin to easy-way manage your text files inside your project folder.
# Godot Text Editor
A little plugin to easy-way manage your text files inside your project folder.
Author: *"Nicolo (fenix) Santilio"*
Version: *1.9.2*
Godot Version: *3.3.4*
Version: *0.1.0*
Godot Version: *3.1.1-stable*
**This repository was pushed directly from Godot Engine Editor thanks to this [GitHub Integration](https://github.com/fenix-hub/godot-engine.github-integration)!**
**This repository was pushed directly from Godot Engine Editor thanks to [GitHub Integration](https://github.com/fenix-hub/godot-engine.github-integration)!**
## What is this?
This is a little plugin I've made to easily edit text files in your project folder.
Building...
## How does it work?
You can open an existing file, create a new file and delete a file.
When opening / creating a file, the editor will open and you will be able to edit it and save it.
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.
![preview_0](https://imgur.com/X3lA49e.png) ![preview_1](https://imgur.com/qYcRbWM.png)
![preview1](https://i.imgur.com/BbZzKzD.png)![preview2](https://i.imgur.com/asggk4f.png) ![preview3](https://i.imgur.com/omReRZr.png)
## How do I install it?
**Manual**
Just download this whole repository and put it in your `res://addons` folder inside the project you want to work on.
Then, go to `Project > Plugins > "File Editor" > Status > Activate`.
**Automatic**
You can find this plugin in the AssetLib of Godot Engine Editor. Just download it from there and everything should be fine!
(Remember to activate this plugin)
## Supported formats
+ "*.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"
+ "*.cfg ; Configuration File"
+ "*.ini ; Initialization File (same as .cfg Configuration File)"
+ "*.csv ; Comma-separated values File"
+ "*.res ; Resource File"
#### Current version
To check all the features that are included in the current version, please read the [VERSION file](./VERSION.md)
#### Upcoming features
To check all the features I'm currently working on, please read the [TODO file](./TODO.md)
# Disclaimer
This addon was built for the intention of my **personal use**. 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.
Building...

View File

View File

@ -1,16 +0,0 @@
[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]
[img]res://addons/file-editor/icon.png[/img]
[code]monospaced text[/code]
left [center]center[/center] [right]right[/right]
[center][wave amp=50 freq=10]oooooondaaaaaaaaa[/wave][/center]
[center][tornado amp=50 freq=10 radius=5]tornaaaaaadoooooo[/tornado][/center]
[center][shake rate=15 level=10]scossa[/shake][/center]
[center][fade start=4 length=14]Effetto fantasmaaaaaa[/fade][/center]
[center][rainbow freq=4 sat=10 val=100]Arcobaleno![/rainbow][/center]
[center][pulse freq=6.0 height=5.0][pulse color=#00FFAA freq=2.0]Questo è un codice custom![/pulse][/pulse][/center]
*Some md text in bb file*

View File

@ -1,9 +0,0 @@
; 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"

View File

@ -1,19 +0,0 @@
COLUMN 1; ;COLUMN2;COLUMN3;COLUMN5;COLUMN6;;;;;;;;;
this is a; ;csv file with empty spaces; ;-;NEW COLUMN;;;;;;;;;
anyway,;they are stored in; ;the file;-;F;;;;;;;;;
this;is a ;new;line;-;F;;;;;;;;;
line 5;and column 5;where created;with the editor;-;F;;;;;;;;;
-;-;-;-;-;F;;;;;;;;;
res;res;res;;F;e;;;;;;;;;
awew;aweawe;ewaewa;wwwwwwwwiiiiiiiii ;F;F;;;;;;;;;
ciao;ciao;;;F;F;;;;;;;;;
ciao;ciao;ciao;ciao;ciao;F;;;;;;;;;
NON;NE;VOGLIO;SAPERE;NIENTE;;;;;;;;;;
UFFA;UFFA;UFFA;NUFFA;;REFFA;;;;;;;;;
;;;;;;;;;;;;;;
;;;;;;;;;;;;;;
;;;;;;;;;;;;;;
;;;;;;;;;;;;;;
;;;;;;;;;;;;;;
;;;;;;;;;;;;;;
;;;;;;;;;;;;;;YES
1 COLUMN 1 COLUMN2 COLUMN3 COLUMN5 COLUMN6
2 this is a csv file with empty spaces - NEW COLUMN
3 anyway, they are stored in the file - F
4 this is a new line - F
5 line 5 and column 5 where created with the editor - F
6 - - - - - F
7 res res res F e
8 awew aweawe ewaewa wwwwwwwwiiiiiiiii F F
9 ciao ciao F F
10 ciao ciao ciao ciao ciao F
11 NON NE VOGLIO SAPERE NIENTE
12 UFFA UFFA UFFA NUFFA REFFA
13
14
15
16
17
18
19 YES

View File

@ -1,3 +0,0 @@
[remap]
importer="keep"

View File

@ -1,9 +0,0 @@
<b>bolded text</b>
<i>italicized text</i>
<ins>insnderlined text</ins>
<del>deltrikethroinsgh text</del>
<a>httpdel://en.wikipedia.org</a>
<img src="res://addondel/file-editor/icon.png"/>
<a href=https://en.wikipedia.org>Englidelh Wikipedia</a>
<pre>monodelpaced text</pre>
left <center>center</center> <right>right</right>

View File

@ -1,9 +0,0 @@
[owner]
name="John Doe"
organization="Acme Widgets Inc."
[database]
server="192.0.2.62"
port="143"
file="payroll.dat"
[qqqq]
ewe="qq"

View File

@ -1,16 +0,0 @@
**bolded text**
*italicized text*
***bolded and italicized***
~~strikethrough~~
__underline__
> This is a quote
`this is some code`
[link](http://example.com)
![image](res://addons/file-editor/icon.png)
# header 1
## header 2
### header 3
#### header 5
##### header 6
###### header7

View File

@ -1 +0,0 @@
This is a simple text file.

View File

@ -1,120 +0,0 @@
<?xml version="1.0"?>
<catalog>
<book id="bk101">
<author>Gambardella, Matthew</author>
<title>XML Developer's Guide</title>
<genre>Computer</genre>
<price>44.95</price>
<publish_date>2000-10-01</publish_date>
<description>An in-depth look at creating applications
with XML.</description>
</book>
<book id="bk102">
<author>Ralls, Kim</author>
<title>Midnight Rain</title>
<genre>Fantasy</genre>
<price>5.95</price>
<publish_date>2000-12-16</publish_date>
<description>A former architect battles corporate zombies,
an evil sorceress, and her own childhood to become queen
of the world.</description>
</book>
<book id="bk103">
<author>Corets, Eva</author>
<title>Maeve Ascendant</title>
<genre>Fantasy</genre>
<price>5.95</price>
<publish_date>2000-11-17</publish_date>
<description>After the collapse of a nanotechnology
society in England, the young survivors lay the
foundation for a new society.</description>
</book>
<book id="bk104">
<author>Corets, Eva</author>
<title>Oberon's Legacy</title>
<genre>Fantasy</genre>
<price>5.95</price>
<publish_date>2001-03-10</publish_date>
<description>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.</description>
</book>
<book id="bk105">
<author>Corets, Eva</author>
<title>The Sundered Grail</title>
<genre>Fantasy</genre>
<price>5.95</price>
<publish_date>2001-09-10</publish_date>
<description>The two daughters of Maeve, half-sisters,
battle one another for control of England. Sequel to
Oberon's Legacy.</description>
</book>
<book id="bk106">
<author>Randall, Cynthia</author>
<title>Lover Birds</title>
<genre>Romance</genre>
<price>4.95</price>
<publish_date>2000-09-02</publish_date>
<description>When Carla meets Paul at an ornithology
conference, tempers fly as feathers get ruffled.</description>
</book>
<book id="bk107">
<author>Thurman, Paula</author>
<title>Splish Splash</title>
<genre>Romance</genre>
<price>4.95</price>
<publish_date>2000-11-02</publish_date>
<description>A deep sea diver finds true love twenty
thousand leagues beneath the sea.</description>
</book>
<book id="bk108">
<author>Knorr, Stefan</author>
<title>Creepy Crawlies</title>
<genre>Horror</genre>
<price>4.95</price>
<publish_date>2000-12-06</publish_date>
<description>An anthology of horror stories about roaches,
centipedes, scorpions and other insects.</description>
</book>
<book id="bk109">
<author>Kress, Peter</author>
<title>Paradox Lost</title>
<genre>Science Fiction</genre>
<price>6.95</price>
<publish_date>2000-11-02</publish_date>
<description>After an inadvertant trip through a Heisenberg
Uncertainty Device, James Salway discovers the problems
of being quantum.</description>
</book>
<book id="bk110">
<author>O'Brien, Tim</author>
<title>Microsoft .NET: The Programming Bible</title>
<genre>Computer</genre>
<price>36.95</price>
<publish_date>2000-12-09</publish_date>
<description>Microsoft's .NET initiative is explored in
detail in this deep programmer's reference.</description>
</book>
<book id="bk111">
<author>O'Brien, Tim</author>
<title>MSXML3: A Comprehensive Guide</title>
<genre>Computer</genre>
<price>36.95</price>
<publish_date>2000-12-01</publish_date>
<description>The Microsoft MSXML3 parser is covered in
detail, with attention to XML DOM interfaces, XSLT processing,
SAX and more.</description>
</book>
<book id="bk112">
<author>Galos, Mike</author>
<title>Visual Studio 7: A Comprehensive Guide</title>
<genre>Computer</genre>
<price>49.95</price>
<publish_date>2001-04-16</publish_date>
<description>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.</description>
</book>
</catalog>

View File

@ -1,9 +0,0 @@
keys;en;it;da;de;ja;es
HELLO;"""Hello!""";"""Ciao!""";"""Hej!""";"""Hallo!""";"""こんにちは!""";"""¡Hola!"""
BYE;"""Bye bye!""";"""Ciao ciao!""";"""Hej hej!""";"""Tschüss!""";"""バイバイ!""";"""¡Adiós!"""
GOODMORNING;"""Gooedmorning!""";"""Buongiorno!""";"""Gooedmorning!""";"""Guten Morgen!""";"""グーエドモーニング!""";"""¡Buen día!"""
CONFIRM;"""Confirm this action""";"""Conferma questa azione""";"""Bekræft denne handling""";"""Bestätigen Sie diese Aktion""";"""このアクションを確認します""";"""Confirma esta acción"""
CANCEL;"""Cancel this action""";"""Annulla questa azione""";"""Annuller denne handling""";"""Brechen Sie diese Aktion ab""";"""このアクションをキャンセルします""";"""Cancelar esta acción"""
YES;"""Yes, please""";"""Sì grazie""";"""Ja tak""";"""Ja bitte""";"""はい、お願いします""";"""Sí por favor"""
NO;"""No, thanks""";"""No grazie""";"""Nej tak""";"""Nein Danke""";"""結構です""";"""No, gracias"""
q;ds;q;q;q;w;q
1 keys en it da de ja es
2 HELLO "Hello!" "Ciao!" "Hej!" "Hallo!" "こんにちは!" "¡Hola!"
3 BYE "Bye bye!" "Ciao ciao!" "Hej hej!" "Tschüss!" "バイバイ!" "¡Adiós!"
4 GOODMORNING "Gooedmorning!" "Buongiorno!" "Gooedmorning!" "Guten Morgen!" "グーエドモーニング!" "¡Buen día!"
5 CONFIRM "Confirm this action" "Conferma questa azione" "Bekræft denne handling" "Bestätigen Sie diese Aktion" "このアクションを確認します" "Confirma esta acción"
6 CANCEL "Cancel this action" "Annulla questa azione" "Annuller denne handling" "Brechen Sie diese Aktion ab" "このアクションをキャンセルします" "Cancelar esta acción"
7 YES "Yes, please" "Sì grazie" "Ja tak" "Ja bitte" "はい、お願いします" "Sí por favor"
8 NO "No, thanks" "No grazie" "Nej tak" "Nein Danke" "結構です" "No, gracias"
9 q ds q q q w q

View File

@ -1,3 +0,0 @@
[remap]
importer="keep"

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

View File

@ -1,35 +0,0 @@
[remap]
importer="texture"
type="StreamTexture"
path="res://.import/icon.png-622f0db5e19ff24d06caa70a7b56e7cc.stex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/file-editor/icon.png"
dest_files=[ "res://.import/icon.png-622f0db5e19ff24d06caa70a7b56e7cc.stex" ]
[params]
compress/mode=0
compress/lossy_quality=0.7
compress/hdr_mode=0
compress/bptc_ldr=0
compress/normal_map=0
flags/repeat=0
flags/filter=true
flags/mipmaps=false
flags/anisotropic=false
flags/srgb=2
process/fix_alpha_border=true
process/premult_alpha=false
process/HDR_as_SRGB=false
process/invert_color=false
process/normal_map_invert_y=false
stream=false
size_limit=0
detect_3d=true
svg/scale=1.0

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 146 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 195 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 146 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 183 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 283 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 146 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 150 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 186 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 160 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 222 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 180 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 286 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 226 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 150 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 236 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 178 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 141 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 524 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 156 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 142 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 154 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 154 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 439 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 462 B

View File

@ -1,8 +0,0 @@
[Opened]
translation.csv="res://addons/file-editor/file.samples/translation.csv"
sample.bbs="res://addons/file-editor/file.samples/sample.bbs"
sample.cfg="res://addons/file-editor/file.samples/sample.cfg"
sample.ini="res://addons/file-editor/file.samples/sample.ini"
README.md="res://README.md"
VERSION.md="res://VERSION.md"

View File

@ -1,264 +0,0 @@
[gd_scene load_steps=15 format=2]
[ext_resource path="res://addons/file-editor/scripts/FileEditor.gd" type="Script" id=1]
[sub_resource type="Image" id=41]
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=30]
image = SubResource( 41 )
size = Vector2( 16, 16 )
[sub_resource type="Image" id=42]
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=32]
image = SubResource( 42 )
size = Vector2( 16, 16 )
[sub_resource type="Image" id=43]
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=34]
image = SubResource( 43 )
size = Vector2( 16, 16 )
[sub_resource type="Image" id=44]
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=36]
image = SubResource( 44 )
size = Vector2( 16, 16 )
[sub_resource type="Image" id=45]
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=38]
image = SubResource( 45 )
size = Vector2( 16, 16 )
[sub_resource type="Image" id=46]
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=40]
image = SubResource( 46 )
size = Vector2( 16, 16 )
[sub_resource type="StyleBoxEmpty" id=28]
[node name="FileEditor" type="Control"]
anchor_right = 1.0
anchor_bottom = 1.0
size_flags_horizontal = 3
size_flags_vertical = 3
script = ExtResource( 1 )
[node name="FileEditorContainer" type="VBoxContainer" parent="."]
visible = false
anchor_right = 1.0
anchor_bottom = 1.0
margin_left = 6.0
margin_right = -5.0
size_flags_horizontal = 3
size_flags_vertical = 3
[node name="TobBar" type="HBoxContainer" parent="FileEditorContainer"]
margin_right = 1000.0
margin_bottom = 20.0
[node name="file_btn" type="MenuButton" parent="FileEditorContainer/TobBar"]
margin_right = 35.0
margin_bottom = 20.0
text = "File"
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, "", null, 0, false, false, -1, 0, null, "", true, "Search in file...", null, 0, false, false, 6, 268435526, null, "", false, "Replace occurencies", null, 0, false, false, 7, 268435538, null, "", false ]
[node name="preview_btn" type="MenuButton" parent="FileEditorContainer/TobBar"]
margin_left = 39.0
margin_right = 101.0
margin_bottom = 20.0
text = "Preview"
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 ]
[node name="SettingsBtn" type="MenuButton" parent="FileEditorContainer/TobBar"]
margin_left = 105.0
margin_right = 168.0
margin_bottom = 20.0
text = "Settings"
items = [ "Change Font", null, 0, false, false, 0, 0, null, "", false ]
[node name="SplitContainer" type="HSplitContainer" parent="FileEditorContainer"]
margin_top = 24.0
margin_right = 1000.0
margin_bottom = 600.0
size_flags_horizontal = 3
size_flags_vertical = 3
split_offset = 150
[node name="FileContainer" type="VBoxContainer" parent="FileEditorContainer/SplitContainer"]
margin_right = 153.0
margin_bottom = 576.0
[node name="OpenFileList" type="ItemList" parent="FileEditorContainer/SplitContainer/FileContainer"]
margin_right = 153.0
margin_bottom = 572.0
size_flags_vertical = 3
items = [ "translation.csv", SubResource( 30 ), false, "sample.bbs", SubResource( 32 ), false, "sample.cfg", SubResource( 34 ), false, "sample.ini", SubResource( 36 ), false, "README.md", SubResource( 38 ), false, "VERSION.md", SubResource( 40 ), false ]
allow_reselect = true
[node name="HSeparator" type="HSeparator" parent="FileEditorContainer/SplitContainer/FileContainer"]
margin_top = 576.0
margin_right = 153.0
margin_bottom = 576.0
rect_min_size = Vector2( 2, 0 )
custom_constants/separation = 0
custom_styles/separator = SubResource( 28 )
[node name="EditorContainer" type="VBoxContainer" parent="FileEditorContainer/SplitContainer"]
margin_left = 165.0
margin_right = 1000.0
margin_bottom = 576.0
[node name="HBoxContainer" type="HBoxContainer" parent="FileEditorContainer/SplitContainer/EditorContainer"]
margin_right = 835.0
margin_bottom = 24.0
[node name="Label" type="Label" parent="FileEditorContainer/SplitContainer/EditorContainer/HBoxContainer"]
margin_top = 5.0
margin_right = 71.0
margin_bottom = 19.0
text = "Editing file:"
[node name="OpenFileName" type="LineEdit" parent="FileEditorContainer/SplitContainer/EditorContainer/HBoxContainer"]
margin_left = 75.0
margin_right = 650.0
margin_bottom = 24.0
mouse_filter = 1
size_flags_horizontal = 3
text = "res://VERSION.md"
editable = false
[node name="wrap_button" type="OptionButton" parent="FileEditorContainer/SplitContainer/EditorContainer/HBoxContainer"]
margin_left = 654.0
margin_right = 738.0
margin_bottom = 24.0
text = "No Wrap"
items = [ "No Wrap", null, false, 0, null, "Soft Wrap", null, false, 1, null ]
selected = 0
[node name="map_button" type="OptionButton" parent="FileEditorContainer/SplitContainer/EditorContainer/HBoxContainer"]
margin_left = 742.0
margin_right = 835.0
margin_bottom = 24.0
text = "Show Map"
items = [ "Hide Map", null, false, 0, null, "Show Map", null, false, 1, null ]
selected = 1
[node name="FileList" type="FileDialog" parent="."]
margin_top = 24.0
margin_right = 1024.0
margin_bottom = 600.0
size_flags_vertical = 3
popup_exclusive = true
window_title = "Salva un file"
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", "*.csv ; Comma-separated values", "*.cfg ; Configuration File", "*.ini ; Initialization File (same as .cfg Configuration File)", "*.csv ; Comma-separated values File", "*.res ; Resource File" )
show_hidden_files = true
[node name="NewFileDialogue" type="AcceptDialog" parent="."]
margin_left = 348.254
margin_top = 232.623
margin_right = 644.254
margin_bottom = 321.623
window_title = "Create new File"
[node name="VBoxContainer" type="VBoxContainer" parent="NewFileDialogue"]
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="Label" type="Label" parent="NewFileDialogue/VBoxContainer"]
margin_right = 280.0
margin_bottom = 16.0
size_flags_vertical = 3
text = "Insert file name (no extension needed)"
align = 1
valign = 1
[node name="new_filename" type="LineEdit" parent="NewFileDialogue/VBoxContainer"]
margin_left = 40.0
margin_top = 20.0
margin_right = 240.0
margin_bottom = 44.0
rect_min_size = Vector2( 200, 0 )
size_flags_horizontal = 6
size_flags_vertical = 3
clear_button_enabled = true
placeholder_text = "example"
[node name="ConfirmationDialog" type="ConfirmationDialog" parent="."]
anchor_left = 0.5
anchor_top = 0.5
anchor_right = 0.5
anchor_bottom = 0.5
margin_left = -323.5
margin_top = -37.5
margin_right = 323.5
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="SelectFontDialog" type="FileDialog" parent="."]
anchor_right = 1.0
anchor_bottom = 1.0
margin_left = 222.0
margin_top = 132.0
margin_right = -221.0
margin_bottom = -131.0
window_title = "Open a File"
resizable = true
mode = 0
access = 2
filters = PoolStringArray( "*.TTF", "*.ttf" )
show_hidden_files = true
[connection signal="confirmed" from="ConfirmationDialog" to="." method="_on_ConfirmationDialog_confirmed"]

View File

@ -1,658 +0,0 @@
tool
extends Control
enum FileMenuOptions {
FILE_MENU_OPTION_NEW = 0,
FILE_MENU_OPTION_OPEN = 1,
FILE_MENU_OPTION_CLOSE = 2,
FILE_MENU_OPTION_SAVE = 3,
FILE_MENU_OPTION_SAVE_AS = 4,
FILE_MENU_OPTION_DELETE = 5,
FILE_MENU_OPTION_SEARCH = 6,
FILE_MENU_OPTION_REPLACE = 7,
};
var DIRECTORY : String = "res://"
var EXCEPTIONS : String = "addons"
var EXTENSIONS : 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)",
"*.csv ; Comma-separated values File",
"*.res ; Resource File",
]
var file_btn : MenuButton = null
var preview_btn : MenuButton = null
var settings_btn : MenuButton = null
var file_btn_popup : PopupMenu = null
var preview_btn_popup : PopupMenu = null
var settings_btn_popup : PopupMenu = null
var editor_container : HSplitContainer = null
var file_container : VBoxContainer = null
var open_file_list : ItemList = null
var split_editor_container : VBoxContainer = null
var open_file_name : LineEdit = null
var wrap_btn : OptionButton = null
var map_btn : OptionButton = null
var file_list : FileDialog = null
var new_file_dialogue : AcceptDialog = null
var new_file_dialogue_name : LineEdit = null
var confirmation_close : ConfirmationDialog = null
var select_font_dialog : FileDialog = null
var LastOpenedFiles : Reference = null
var Preview = preload("res://addons/file-editor/scripts/Preview.gd")
var VanillaEditor = preload("res://addons/file-editor/scripts/VanillaEditor.gd")
var directories : Array
var files : Array
var current_file_index : int = -1
var current_file_path : String
var save_as : bool = false
var current_editor : Control
var current_font : DynamicFont
var editing_file : bool = false
func _init() -> void:
set_anchors_and_margins_preset(Control.PRESET_WIDE)
size_flags_vertical = SIZE_EXPAND_FILL
size_flags_horizontal = SIZE_EXPAND_FILL
var vbc : VBoxContainer = VBoxContainer.new()
add_child(vbc)
vbc.set_anchors_and_margins_preset(Control.PRESET_WIDE)
var tob_bar : HBoxContainer = HBoxContainer.new()
vbc.add_child(tob_bar)
file_btn = MenuButton.new()
tob_bar.add_child(file_btn)
file_btn.text = "File"
file_btn_popup = file_btn.get_popup()
var hotkey : InputEventKey = InputEventKey.new()
hotkey.scancode = KEY_N
hotkey.control = true
file_btn_popup.add_item("New File", FileMenuOptions.FILE_MENU_OPTION_NEW, hotkey.get_scancode_with_modifiers())
hotkey = InputEventKey.new()
hotkey.scancode = KEY_O
hotkey.control = true
file_btn_popup.add_item("Open File", FileMenuOptions.FILE_MENU_OPTION_OPEN, hotkey.get_scancode_with_modifiers())
hotkey = InputEventKey.new()
hotkey.scancode = KEY_C
hotkey.control = true
hotkey.alt = true
file_btn_popup.add_item("Close File", FileMenuOptions.FILE_MENU_OPTION_CLOSE, hotkey.get_scancode_with_modifiers())
file_btn_popup.add_separator()
hotkey = InputEventKey.new()
hotkey.scancode = KEY_S
hotkey.control = true
file_btn_popup.add_item("Save File", FileMenuOptions.FILE_MENU_OPTION_SAVE, hotkey.get_scancode_with_modifiers())
hotkey = InputEventKey.new()
hotkey.scancode = KEY_S
hotkey.control = true
hotkey.alt = true
file_btn_popup.add_item("Save File as...", FileMenuOptions.FILE_MENU_OPTION_SAVE_AS, hotkey.get_scancode_with_modifiers())
#hotkey = InputEventKey.new()
#hotkey.scancode = KEY_D
#hotkey.control = true
#file_btn_popup.add_item("Delete File", FileMenuOptions.FILE_MENU_OPTION_DELETE, hotkey.get_scancode_with_modifiers())
file_btn_popup.add_item("Delete File", FileMenuOptions.FILE_MENU_OPTION_DELETE)
file_btn_popup.add_separator()
hotkey = InputEventKey.new()
hotkey.scancode = KEY_F
hotkey.control = true
file_btn_popup.add_item("Search in file...", FileMenuOptions.FILE_MENU_OPTION_SEARCH, hotkey.get_scancode_with_modifiers())
hotkey = InputEventKey.new()
hotkey.scancode = KEY_R
hotkey.control = true
file_btn_popup.add_item("Replace occurencies", FileMenuOptions.FILE_MENU_OPTION_REPLACE, hotkey.get_scancode_with_modifiers())
#Preview
preview_btn = MenuButton.new()
tob_bar.add_child(preview_btn)
preview_btn.text = "Preview"
preview_btn_popup = preview_btn.get_popup()
preview_btn_popup.add_item("BBCode Preview")
preview_btn_popup.add_item("Markdown Preview")
preview_btn_popup.add_item("HTML Preview")
preview_btn_popup.add_item("CSV Preview")
#Settings
settings_btn = MenuButton.new()
tob_bar.add_child(settings_btn)
settings_btn.text = "Settings"
settings_btn_popup = settings_btn.get_popup()
settings_btn_popup.add_item("Change Font")
#SplitContainer
editor_container = HSplitContainer.new()
vbc.add_child(editor_container)
editor_container.split_offset = 150
editor_container.size_flags_horizontal = SIZE_EXPAND_FILL
editor_container.size_flags_vertical = SIZE_EXPAND_FILL
#Files
file_container = VBoxContainer.new()
editor_container.add_child(file_container)
open_file_list = ItemList.new()
file_container.add_child(open_file_list)
open_file_list.allow_reselect = true
open_file_list.size_flags_vertical = SIZE_EXPAND_FILL
file_container.add_child(HSeparator.new())
#Editor
split_editor_container = VBoxContainer.new()
editor_container.add_child(split_editor_container)
var editor_top_bar : HBoxContainer = HBoxContainer.new()
split_editor_container.add_child(editor_top_bar)
var edtopbar_label : Label = Label.new()
editor_top_bar.add_child(edtopbar_label)
edtopbar_label.text = "Editing file:"
open_file_name = LineEdit.new()
editor_top_bar.add_child(open_file_name)
open_file_name.editable = false
open_file_name.mouse_filter = Control.MOUSE_FILTER_PASS
open_file_name.size_flags_horizontal = SIZE_EXPAND_FILL
wrap_btn = OptionButton.new()
editor_top_bar.add_child(wrap_btn)
wrap_btn.add_item("No Wrap")
wrap_btn.add_item("Soft Wrap")
map_btn = OptionButton.new()
editor_top_bar.add_child(map_btn)
map_btn.add_item("Hide Map")
map_btn.add_item("Show Map")
map_btn.selected = 1
#dialogs
file_list = FileDialog.new()
add_child(file_list)
file_list.show_hidden_files = true
file_list.dialog_hide_on_ok = true
file_list.window_title = "Save file"
file_list.popup_exclusive = true
file_list.set_anchors_and_margins_preset(Control.PRESET_WIDE)
file_list.margin_left = 222
file_list.margin_top = 132
file_list.margin_right = -221
file_list.margin_bottom = -131
file_list.rect_min_size = Vector2(200, 70)
new_file_dialogue = AcceptDialog.new()
add_child(new_file_dialogue)
new_file_dialogue.window_title = "Create new File"
var nfd_vbc : VBoxContainer = VBoxContainer.new()
new_file_dialogue.add_child(nfd_vbc)
var nfd_name : Label = Label.new()
nfd_vbc.add_child(nfd_name)
nfd_name.text = "Insert file name (no extension needed)"
nfd_name.align = Label.ALIGN_CENTER
nfd_name.valign = Label.VALIGN_CENTER
nfd_name.size_flags_vertical = SIZE_EXPAND_FILL
new_file_dialogue_name = LineEdit.new()
nfd_vbc.add_child(new_file_dialogue_name)
new_file_dialogue_name.clear_button_enabled = true
new_file_dialogue_name.text = "example"
new_file_dialogue_name.rect_min_size = Vector2(200, 0)
new_file_dialogue_name.size_flags_horizontal = SIZE_EXPAND | SIZE_SHRINK_CENTER
new_file_dialogue_name.size_flags_vertical = SIZE_EXPAND_FILL
confirmation_close = ConfirmationDialog.new()
add_child(confirmation_close)
confirmation_close.dialog_text = "There are some unsaved changes.\nPress \"OK\" if you want to close this tab anyway, or \"cancel\" if you want to keep on editing your file."
confirmation_close.window_title = "Unsaved changes"
confirmation_close.set_anchors_and_margins_preset(Control.PRESET_CENTER)
select_font_dialog = FileDialog.new()
add_child(select_font_dialog)
select_font_dialog.mode = FileDialog.MODE_OPEN_FILE
select_font_dialog.access = FileDialog.ACCESS_FILESYSTEM
select_font_dialog.show_hidden_files = true
select_font_dialog.window_title = "Open a File"
select_font_dialog.resizable = true
select_font_dialog.set_anchors_and_margins_preset(Control.PRESET_WIDE)
select_font_dialog.margin_left = 222
select_font_dialog.margin_top = 132
select_font_dialog.margin_right = -221
select_font_dialog.margin_bottom = -131
select_font_dialog.rect_min_size = Vector2(200, 70)
var farr : PoolStringArray = PoolStringArray()
farr.push_back("*.TTF")
farr.push_back("*.ttf")
select_font_dialog.filters = farr
func _ready() -> void:
if not Engine.is_editor_hint():
return
clean_editor()
connect_signals()
if LastOpenedFiles:
var opened_files : Array = LastOpenedFiles.load_opened_files()
for opened_file in opened_files:
open_file(opened_file[1], opened_file[2])
file_list.set_filters(EXTENSIONS)
func connect_signals() -> void:
file_list.connect("confirmed",self,"update_list")
file_btn_popup.connect("id_pressed",self,"_on_file_btn_pressed")
preview_btn_popup.connect("id_pressed",self,"_on_preview_btn_pressed")
settings_btn_popup.connect("id_pressed",self,"_on_settings_btn_pressed")
open_file_list.connect("item_selected",self,"_on_fileitem_pressed")
wrap_btn.connect("item_selected",self,"on_wrap_button")
map_btn.connect("item_selected",self,"on_minimap_button")
select_font_dialog.connect("file_selected",self,"_on_font_selected")
func create_selected_file() -> void:
update_list()
file_list.mode = FileDialog.MODE_SAVE_FILE
file_list.set_title("Create a new File")
if file_list.is_connected("file_selected",self,"delete_file"):
file_list.disconnect("file_selected",self,"delete_file")
if file_list.is_connected("file_selected",self,"open_file"):
file_list.disconnect("file_selected",self,"open_file")
if not file_list.is_connected("file_selected",self,"create_new_file"):
file_list.connect("file_selected",self,"create_new_file")
open_file_list()
func open_selected_file() -> void:
update_list()
file_list.mode = FileDialog.MODE_OPEN_FILE
file_list.set_title("Select a File you want to edit")
if file_list.is_connected("file_selected",self,"delete_file"):
file_list.disconnect("file_selected",self,"delete_file")
if file_list.is_connected("file_selected",self,"create_new_file"):
file_list.disconnect("file_selected",self,"create_new_file")
if not file_list.is_connected("file_selected",self,"open_file"):
file_list.connect("file_selected",self,"open_file")
open_file_list()
func delete_selected_file() -> void:
update_list()
file_list.mode = FileDialog.MODE_OPEN_FILES
file_list.set_title("Select one or more Files you want to delete")
if file_list.is_connected("file_selected",self,"open_file"):
file_list.disconnect("file_selected",self,"open_file")
if file_list.is_connected("file_selected",self,"create_new_file"):
file_list.disconnect("file_selected",self,"create_new_file")
if not file_list.is_connected("files_selected",self,"delete_file"):
file_list.connect("files_selected",self,"delete_file")
open_file_list()
func save_current_file_as() -> void:
update_list()
file_list.mode = FileDialog.MODE_SAVE_FILE
file_list.set_title("Save this File as...")
if file_list.is_connected("file_selected",self,"delete_file"):
file_list.disconnect("file_selected",self,"delete_file")
if file_list.is_connected("file_selected",self,"open_file"):
file_list.disconnect("file_selected",self,"open_file")
if not file_list.is_connected("file_selected",self,"create_new_file"):
file_list.connect("file_selected",self,"create_new_file")
open_file_list()
func _on_file_btn_pressed(index : int) -> void:
match index:
FileMenuOptions.FILE_MENU_OPTION_NEW:
create_selected_file()
FileMenuOptions.FILE_MENU_OPTION_OPEN:
open_selected_file()
FileMenuOptions.FILE_MENU_OPTION_CLOSE:
if current_file_index!=-1 and current_file_path != "":
close_file(current_file_index)
FileMenuOptions.FILE_MENU_OPTION_SAVE:
if current_file_index!=-1 and current_file_path != "":
save_as = false
save_file(current_file_path)
FileMenuOptions.FILE_MENU_OPTION_SAVE_AS:
if current_file_index!=-1 and current_file_path != "":
save_as = true
save_file(current_file_path)
save_current_file_as()
FileMenuOptions.FILE_MENU_OPTION_DELETE:
delete_selected_file()
FileMenuOptions.FILE_MENU_OPTION_SEARCH:
current_editor.open_search_box()
FileMenuOptions.FILE_MENU_OPTION_REPLACE:
current_editor.open_replace_box()
func _on_preview_btn_pressed(id : int) -> void:
if id == 0:
bbcode_preview()
elif id == 1:
markdown_preview()
elif id == 2:
html_preview()
elif id == 3:
csv_preview()
func _on_settings_btn_pressed(index : int) -> void:
match index:
0:
select_font_dialog.popup()
func _on_font_selected(font_path : String) -> void:
current_editor.set_font(font_path)
LastOpenedFiles.store_editor_fonts(current_file_path.get_file(), font_path)
func _on_fileitem_pressed(index : int) -> void:
current_file_index = index
var selected_item_metadata : Array = open_file_list.get_item_metadata(current_file_index)
var extension : String = selected_item_metadata[0].current_path.get_file().get_extension()
if open_file_list.get_item_text(current_file_index).begins_with("(*)"):
editing_file = true
else:
editing_file = false
current_file_path = selected_item_metadata[0].current_path
if current_editor.visible or current_editor == null:
if current_editor != null:
current_editor.hide()
current_editor = selected_item_metadata[0]
current_editor.show()
open_file_name.set_text(current_editor.current_path)
if wrap_btn.get_selected_id() == 1:
current_editor.set_wrap_enabled(true)
else:
current_editor.set_wrap_enabled(false)
if map_btn.get_selected_id() == 1:
current_editor.draw_minimap(true)
else:
current_editor.draw_minimap(false)
func open_file(path : String, font : String = "null") -> void:
if current_file_path != path:
current_file_path = path
var vanilla_editor : Control = open_in_vanillaeditor(path)
if font != "null" and vanilla_editor.get("custom_fonts/font")!=null:
vanilla_editor.set_font(font)
generate_file_item(path, vanilla_editor)
LastOpenedFiles.store_opened_files(open_file_list)
current_editor.show()
func generate_file_item(path : String , veditor : Control) -> void:
open_file_name.set_text(path)
open_file_list.add_item(path.get_file(), null,true)
current_file_index = open_file_list.get_item_count()-1
open_file_list.set_item_metadata(current_file_index,[veditor])
open_file_list.select(open_file_list.get_item_count()-1)
func open_in_vanillaeditor(path : String) -> Control:
var editor : Control = VanillaEditor.new()
editor.LastOpenedFiles = LastOpenedFiles
editor.file_list = file_list
split_editor_container.add_child(editor,true)
if current_editor and current_editor!=editor:
editor.show()
current_editor.hide()
current_editor = editor
editor.connect("text_changed",self,"_on_vanillaeditor_text_changed")
var current_file : File = File.new()
current_file.open(path,File.READ)
var current_content : String = ""
current_content = current_file.get_as_text()
var last_modified = OS.get_datetime_from_unix_time(current_file.get_modified_time(path))
current_file.close()
editor.new_file_open(current_content,last_modified,current_file_path)
update_list()
if wrap_btn.get_selected_id() == 1:
current_editor.set_wrap_enabled(true)
return editor
func close_file(index : int) -> void:
if editing_file:
confirmation_close.popup()
else:
confirm_close(index)
func confirm_close(index : int) -> void:
LastOpenedFiles.remove_opened_file(index,open_file_list)
open_file_list.remove_item(index)
open_file_name.clear()
current_editor.queue_free()
if index > 0:
open_file_list.select(index-1)
_on_fileitem_pressed(index-1)
func _on_update_file() -> void:
var current_file : File = File.new()
current_file.open(current_file_path,File.READ)
var current_content : String = current_file.get_as_text()
var last_modified : Dictionary = OS.get_datetime_from_unix_time(current_file.get_modified_time(current_file_path))
current_file.close()
current_editor.new_file_open(current_content,last_modified,current_file_path)
func delete_file(files_selected : PoolStringArray) -> void:
var dir = Directory.new()
for file in files_selected:
dir.remove(file)
update_list()
func open_new_file_dialogue() -> void:
new_file_dialogue.popup()
new_file_dialogue.set_position(OS.get_screen_size()/2 - new_file_dialogue.get_size()/2)
func open_file_list() -> void:
update_list()
file_list.popup()
file_list.set_position(OS.get_screen_size()/2 - file_list.get_size()/2)
func create_new_file(given_path : String) -> void:
var current_file : File = File.new()
current_file.open(given_path,File.WRITE)
if save_as:
current_file.store_line(current_editor.text_editor.get_text())
current_file.close()
open_file(given_path)
func save_file(current_path : String) -> void:
print("Saving file: ",current_path)
var current_file : File = File.new()
current_file.open(current_path,File.WRITE)
var current_content : String = ""
var lines : int = current_editor.text_editor.get_line_count()
for line in range(lines):
#if current_editor.text_editor.get_line(line) == "":
# continue
current_content = current_editor.text_editor.get_text()
current_file.store_line(current_editor.text_editor.get_line(line))
current_file.close()
current_file_path = current_path
var last_modified : Dictionary = OS.get_datetime_from_unix_time(current_file.get_modified_time(current_file_path))
current_editor.update_lastmodified(last_modified,"save")
open_file_list.set_item_metadata(current_file_index,[current_editor])
if open_file_list.get_item_text(current_file_index).begins_with("(*)"):
open_file_list.set_item_text(current_file_index,open_file_list.get_item_text(current_file_index).lstrip("(*)"))
editing_file = false
update_list()
func clean_editor() -> void:
var nodes : Array = get_tree().get_nodes_in_group("vanilla_editor")
for i in range(nodes.size()):
var vanillaeditor : Node = nodes[i]
vanillaeditor.queue_free()
open_file_name.clear()
open_file_list.clear()
func csv_preview() -> void:
var preview : Control = Preview.new()
get_parent().get_parent().get_parent().add_child(preview)
preview.popup()
preview.window_title += " ("+current_file_path.get_file()+")"
var lines : int = current_editor.text_editor.get_line_count()
var rows : Array = Array()
for i in range(0, lines-1):
rows.append(current_editor.text_editor.get_line(i).rsplit(",",false))
preview.print_csv(rows)
func bbcode_preview() -> void:
var preview : Control = Preview.new()
get_parent().get_parent().get_parent().add_child(preview)
preview.popup()
preview.window_title += " ("+current_file_path.get_file()+")"
preview.print_bb(current_editor.text_editor.get_text())
func markdown_preview() -> void:
var preview : Control = Preview.new()
get_parent().get_parent().get_parent().add_child(preview)
preview.popup()
preview.window_title += " ("+current_file_path.get_file()+")"
preview.print_markdown(current_editor.text_editor.get_text())
func html_preview() -> void:
var preview : Control = Preview.new()
get_parent().get_parent().get_parent().add_child(preview)
preview.popup()
preview.window_title += " ("+current_file_path.get_file()+")"
preview.print_html(current_editor.text_editor.get_text())
func _on_vanillaeditor_text_changed() -> void:
if not open_file_list.get_item_text(current_file_index).begins_with("(*)"):
open_file_list.set_item_text(current_file_index,"(*)"+open_file_list.get_item_text(current_file_index))
editing_file = true
func update_list() -> void:
file_list.invalidate()
func on_wrap_button(index:int) -> void:
match index:
0:
current_editor.set_wrap_enabled(false)
1:
current_editor.set_wrap_enabled(true)
func on_minimap_button(index:int) -> void:
match index:
0:
current_editor.draw_minimap(false)
1:
current_editor.draw_minimap(true)
func check_file_preview(file : String) -> void:
# check whether the opened file has a corresponding preview session for its extension
pass
func _on_ConfirmationDialog_confirmed() -> void:
confirm_close(current_file_index)

View File

@ -1,15 +0,0 @@
tool
extends Node
func load_icon_from_name(icon_name : String) -> ImageTexture:
var file : File = File.new()
var image : Image = Image.new()
var texture : ImageTexture = ImageTexture.new()
file.open("res://addons/file-editor/icons.pngs/"+icon_name+".png.buttonicon", File.READ)
var buffer : PoolByteArray = file.get_buffer(file.get_len())
file.close()
image.load_png_from_buffer(buffer)
texture.create_from_image(image)
return texture

View File

@ -1,71 +0,0 @@
tool
extends Reference
var editor_plugin : EditorPlugin = null
var editor_settings : EditorSettings = null
func store_opened_files(filecontainer : Control) -> void:
var arr : Array = Array()
for child in range(filecontainer.get_item_count()):
var filepath : String = filecontainer.get_item_metadata(child)[0].current_path
var a : Array = Array()
a.push_back(filepath.get_file())
a.push_back(filepath)
arr.push_back(a)
editor_settings.set_project_metadata("file_editor", "files", arr)
func remove_opened_file(index : int , filecontainer : Control) -> void:
var filepath : String = filecontainer.get_item_metadata(index)[0].current_path
var f : String = filepath.get_file()
var arr : Array = editor_settings.get_project_metadata("file_editor", "files", Array())
for i in range(arr.size()):
var a : Array = arr[i]
if a[0] == f:
arr.remove(i)
break
editor_settings.set_project_metadata("file_editor", "files", arr)
var fonts_dict : Dictionary = editor_settings.get_project_metadata("file_editor", "file_fonts", Dictionary())
if fonts_dict.has(f):
fonts_dict.erase(f)
editor_settings.set_project_metadata("file_editor", "file_fonts", fonts_dict)
func load_opened_files() -> Array:
var arr : Array = editor_settings.get_project_metadata("file_editor", "files", Array())
var fonts_dict : Dictionary = editor_settings.get_project_metadata("file_editor", "file_fonts", Dictionary())
var keys : Array = Array()
for i in range(arr.size()):
var a : Array = arr[i]
# creating and returning an Array with this format [1:file name, 2:file path, 3:file font]
var k : Array
k.push_back(a[0])
k.push_back(a[1])
if fonts_dict.has(a[0]):
k.push_back(fonts_dict[a[0]])
else:
k.push_back("null")
keys.append(k)
return keys
func store_editor_fonts(file_name : String, font_path : String) -> void:
var fonts_dict : Dictionary = editor_settings.get_project_metadata("file_editor", "file_fonts", Dictionary())
fonts_dict[file_name] = font_path
editor_settings.set_project_metadata("file_editor", "file_fonts", fonts_dict)
func get_editor_font() -> String:
#var editor_plugin : EditorPlugin = EditorPlugin.new()
return editor_plugin.get_editor_interface().get_editor_settings().get_setting("interface/editor/code_font")

View File

@ -1,198 +0,0 @@
tool
extends WindowDialog
var text_preview : RichTextLabel = null
var table_preview : GridContainer = null
signal image_downloaded()
signal image_loaded()
func _init() -> void:
window_title = "File preview"
resizable = true
set_anchors_and_margins_preset(Control.PRESET_WIDE)
margin_left = 81
margin_top = 47
margin_right = -80
margin_bottom = -48
var vbc : VBoxContainer = VBoxContainer.new()
vbc.set_anchors_and_margins_preset(Control.PRESET_WIDE)
add_child(vbc)
text_preview = RichTextLabel.new()
vbc.add_child(text_preview)
text_preview.scroll_following = true
text_preview.bbcode_enabled = true
text_preview.size_flags_vertical = SIZE_EXPAND_FILL
text_preview.hide()
table_preview = GridContainer.new()
vbc.add_child(table_preview)
table_preview.columns = 3
table_preview.size_flags_horizontal = SIZE_EXPAND_FILL
table_preview.size_flags_vertical = SIZE_EXPAND_FILL
table_preview.hide()
connect("popup_hide", self, "_on_Preview_popup_hide")
func print_preview(content : String) -> void:
text_preview.append_bbcode(content)
text_preview.show()
func print_bb(content : String) -> void:
text_preview.append_bbcode(content)
text_preview.show()
func print_markdown(content : String) -> void:
var result : Array = Array()
var bolded : Array = Array()
var italics : Array = Array()
var striked : Array = Array()
var coded : Array = Array()
var linknames : Array = Array()
var images : Array = Array()
var links : Array = Array()
var lists : Array = Array()
var underlined : Array = Array()
var regex : RegEx = RegEx.new()
regex.compile('\\*\\*(?<boldtext>.*)\\*\\*')
result = regex.search_all(content)
for i in range(result.size()):
var res : RegExMatch = result[i]
bolded.append(res.get_string("boldtext"))
regex.compile('\\_\\_(?<underlinetext>.*)\\_\\_')
result = regex.search_all(content)
for i in range(result.size()):
var res : RegExMatch = result[i]
underlined.append(res.get_string("underlinetext"))
regex.compile("\\*(?<italictext>.*)\\*")
result = regex.search_all(content)
for i in range(result.size()):
var res : RegExMatch = result[i]
italics.append(res.get_string("italictext"))
regex.compile("~~(?<strikedtext>.*)~~")
result = regex.search_all(content)
for i in range(result.size()):
var res : RegExMatch = result[i]
striked.append(res.get_string("strikedtext"))
regex.compile("`(?<coded>.*)`")
result = regex.search_all(content)
for i in range(result.size()):
var res : RegExMatch = result[i]
coded.append(res.get_string("coded"))
regex.compile("[+-*](?<element>\\s.*)")
result = regex.search_all(content)
for i in range(result.size()):
var res : RegExMatch = result[i]
lists.append(res.get_string("element"))
regex.compile("(?<img>!\\[.*?\\))")
result = regex.search_all(content)
for i in range(result.size()):
var res : RegExMatch = result[i]
images.append(res.get_string("img"))
regex.compile("\\[(?<linkname>.*?)\\]|\\((?<link>[h\\.]\\S*?)\\)")
result = regex.search_all(content)
for i in range(result.size()):
var res : RegExMatch = result[i]
if res.get_string("link")!="":
links.append(res.get_string("link"))
if res.get_string("linkname")!="":
linknames.append(res.get_string("linkname"))
for i in range(bolded.size()):
var bold : String = bolded[i]
content = content.replace("**"+bold+"**","[b]"+bold+"[/b]")
for i in range(italics.size()):
var italic : String = italics[i]
content = content.replace("*"+italic+"*","[i]"+italic+"[/i]")
for i in range(striked.size()):
var strik : String = striked[i]
content = content.replace("~~"+strik+"~~","[s]"+strik+"[/s]")
for i in range(underlined.size()):
var underline : String = underlined[i]
content = content.replace("__"+underline+"__","[u]"+underline+"[/u]")
for i in range(coded.size()):
var code : String = coded[i]
content = content.replace("`"+code+"`","[code]"+code+"[/code]")
for i in range(images.size()):
var image : String = images[i]
var substr = image.split("(")
var imglink = substr[1].rstrip(")")
content = content.replace(image,"[img]"+imglink+"[/img]")
for i in links.size():
content = content.replace("["+linknames[i]+"]("+links[i]+")","[url="+links[i]+"]"+linknames[i]+"[/url]")
for i in range(lists.size()):
var element : String = lists[i]
if content.find("- "+element):
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]")
text_preview.append_bbcode(content)
text_preview.show()
func print_html(content : String) -> void:
content = content.replace("<i>","[i]")
content = content.replace("</i>","[/i]")
content = content.replace("<b>","[b]")
content = content.replace("</b>","[/b]")
content = content.replace("<u>","[u]")
content = content.replace("</u>","[/u]")
content = content.replace("<ins>","[u]")
content = content.replace("</ins>","[/u]")
content = content.replace("<del>","[s]")
content = content.replace("</del>","[/s]")
content = content.replace('<a href="',"[url=")
content = content.replace('">',"]")
content = content.replace("</a>","[/url]")
content = content.replace('<img src="',"[img]")
content = content.replace('" />',"[/img]")
content = content.replace('"/>',"[/img]")
content = content.replace("<pre>","[code]")
content = content.replace("</pre>","[/code]")
content = content.replace("<center>","[center]")
content = content.replace("</center>","[/center]")
content = content.replace("<right>","[right]")
content = content.replace("</right>","[/right]")
text_preview.append_bbcode(content)
text_preview.show()
func print_csv(rows : Array) -> void:
table_preview.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)
table_preview.add_child(label)
table_preview.show()
func _on_Preview_popup_hide() -> void:
queue_free()

View File

@ -1,374 +0,0 @@
tool
extends VBoxContainer
var LastOpenedFiles : Reference = null
var text_editor : TextEdit = null
var file_list : FileDialog = null
var search_box : HBoxContainer = null
var search_box_line_edit : LineEdit = null
var search_box_match_case_cb : CheckBox = null
var search_box_whole_words_cb : CheckBox = null
var search_box_close_button : Button = null
var replace_box : HBoxContainer = null
var replace_box_replace_le : LineEdit = null
var replace_box_with : LineEdit = null
var replace_box_button : Button = null
var replace_box_close : Button = null
var file_info_last_modified_icon : TextureRect = null
var file_info_last_modified : Label = null
var file_info_c_counter : Label = null
var file_info_read_only : CheckBox = null
var current_path : String = ""
var current_filename : String = ""
var search_flag : int = 0
signal text_changed()
func _init() -> void:
size_flags_vertical = SIZE_EXPAND_FILL
set_anchors_and_margins_preset(Control.PRESET_WIDE)
text_editor = TextEdit.new()
add_child(text_editor)
text_editor.highlight_current_line = true
text_editor.syntax_highlighting = true
text_editor.show_line_numbers = true
text_editor.breakpoint_gutter = true
text_editor.highlight_all_occurrences = true
text_editor.override_selected_font_color = true
text_editor.smooth_scrolling = true
text_editor.hiding_enabled = true
#todo look this up from the editor settings
#text_editor.caret_blink = true
#text_editor.caret_blink_speed = 1
text_editor.caret_moving_by_right_click = false
text_editor.minimap_draw = true
text_editor.size_flags_vertical = SIZE_EXPAND_FILL
text_editor.set("custom_colors/member_variable_color", Color(0.737255, 0.882353, 1))
text_editor.set("custom_colors/code_folding_color", Color(1, 1, 1, 0.701961))
text_editor.set("custom_colors/function_color", Color(0.341176, 0.701961, 1))
text_editor.set("custom_colors/safe_line_number_color", Color(0.8, 0.968627, 0.827451, 0.74902))
text_editor.set("custom_colors/symbol_color", Color(0.670588, 0.788235, 1))
text_editor.set("custom_colors/caret_background_color", Color(0, 0, 0))
text_editor.set("custom_colors/selection_color", Color(0.411765, 0.611765, 0.909804, 0.34902))
text_editor.set("custom_colors/caret_color", Color(1, 1, 1))
text_editor.set("custom_colors/breakpoint_color", Color(1, 0.470588, 0.419608))
text_editor.set("custom_colors/font_color_selected", Color(0, 0, 0))
text_editor.set("custom_colors/font_color", Color(1, 1, 1))
text_editor.set("custom_colors/completion_font_color", Color(1, 1, 1, 0.392157))
text_editor.set("custom_colors/completion_scroll_color", Color(1, 1, 1, 0.070588))
text_editor.set("custom_colors/background_color", Color(0.121569, 0.145098, 0.192157))
text_editor.set("custom_colors/number_color", Color(0.631373, 1, 0.882353))
text_editor.set("custom_colors/completion_background_color", Color(0.196078, 0.231373, 0.309804))
text_editor.set("custom_colors/brace_mismatch_color", Color(1, 0.470588, 0.419608))
text_editor.set("custom_colors/current_line_color", Color(1, 1, 1, 0.070588))
text_editor.set("custom_colors/completion_selected_color", Color(1, 1, 1, 0.070588))
text_editor.set("custom_colors/mark_color", Color(1, 0.470588, 0.419608, 0.301961))
text_editor.set("custom_colors/word_highlighted_color", Color(1, 1, 1, 0.392157))
text_editor.set("custom_colors/completion_existing_color", Color(1, 1, 1, 0.392157))
text_editor.set("custom_constants/completion_lines", 20)
text_editor.set("custom_constants/completion_max_width", 20)
text_editor.set("custom_constants/completion_scroll_width", 20)
#text_editor.owner = self
search_box = HBoxContainer.new()
add_child(search_box)
search_box.hide()
var selabel : Label = Label.new()
search_box.add_child(selabel)
selabel.text = "Search:"
search_box_line_edit = LineEdit.new()
search_box.add_child(search_box_line_edit)
search_box_line_edit.size_flags_horizontal = SIZE_EXPAND_FILL
search_box_line_edit.connect("text_changed", self, "_on_LineEdit_text_changed")
search_box_line_edit.connect("focus_entered", self, "_on_LineEdit_focus_entered")
search_box_match_case_cb = CheckBox.new()
search_box.add_child(search_box_match_case_cb)
search_box_match_case_cb.text = "Match Case"
search_box_match_case_cb.connect("toggled", self, "_on_matchcase_toggled")
search_box_whole_words_cb = CheckBox.new()
search_box.add_child(search_box_whole_words_cb)
search_box_whole_words_cb.text = "Whole Words"
search_box_whole_words_cb.connect("toggled", self, "_on_wholewords_toggled")
search_box_close_button = Button.new()
search_box.add_child(search_box_close_button)
search_box_close_button.text = "x"
search_box_close_button.flat = true
search_box_whole_words_cb.connect("pressed", self, "_on_close_pressed")
replace_box = HBoxContainer.new()
add_child(replace_box)
replace_box.hide()
var rblabel : Label = Label.new()
replace_box.add_child(rblabel)
rblabel.text = "Replace:"
replace_box_replace_le = LineEdit.new()
replace_box.add_child(replace_box_replace_le)
replace_box_replace_le.size_flags_horizontal = SIZE_EXPAND_FILL
var rb2label : Label = Label.new()
replace_box.add_child(rb2label)
rb2label.text = "With:"
replace_box_with = LineEdit.new()
replace_box.add_child(replace_box_with)
replace_box_with.size_flags_horizontal = SIZE_EXPAND_FILL
replace_box_button = Button.new()
replace_box.add_child(replace_box_button)
replace_box_button.text = "Replace"
replace_box_button.connect("pressed", self, "_on_Button_pressed")
replace_box_close = Button.new()
replace_box.add_child(replace_box_close)
replace_box_close.text = "x"
replace_box_close.flat = true
replace_box_button.connect("pressed", self, "_on_close2_pressed")
var file_info : HBoxContainer = HBoxContainer.new()
add_child(file_info)
file_info_last_modified_icon = TextureRect.new()
file_info.add_child(file_info_last_modified_icon)
file_info_last_modified_icon.stretch_mode = TextureRect.STRETCH_KEEP_CENTERED
var filabel : Label = Label.new()
file_info.add_child(filabel)
filabel.text = "Last modified time:"
file_info_last_modified = Label.new()
file_info.add_child(file_info_last_modified)
var fi2label : Label = Label.new()
file_info.add_child(fi2label)
fi2label.text = "Characters counter:"
fi2label.align = Label.ALIGN_RIGHT
fi2label.size_flags_horizontal = SIZE_EXPAND | SIZE_FILL | SIZE_SHRINK_CENTER | SIZE_SHRINK_END
file_info_c_counter = Label.new()
file_info.add_child(file_info_c_counter)
file_info_c_counter.size_flags_horizontal = SIZE_EXPAND
file_info_read_only = CheckBox.new()
file_info.add_child(file_info_read_only)
file_info_read_only.text = "Can Edit"
file_info_read_only.flat = true
file_info_read_only.size_flags_horizontal = SIZE_EXPAND | SIZE_SHRINK_END
func _ready() -> void:
text_editor.connect("text_changed", self, "_on_text_editor_text_changed")
#FileList = get_parent().get_parent().get_parent().get_parent().get_node("FileList")
file_info_read_only.connect("toggled",self,"_on_Readonly_toggled")
#file_info_read_only.set("custom_icons/checked",IconLoader.load_icon_from_name("read"))
#file_info_read_only.set("custom_icons/unchecked",IconLoader.load_icon_from_name("edit"))
add_to_group("vanilla_editor")
load_default_font()
func set_font(font_path : String) -> void:
var dynamic_font : DynamicFont = DynamicFont.new()
var dynamic_font_data : DynamicFontData = DynamicFontData.new()
dynamic_font_data.set_font_path(font_path)
dynamic_font.set_font_data(dynamic_font_data)
text_editor.set("custom_fonts/font",dynamic_font)
func load_default_font() -> void:
var default_font : String = LastOpenedFiles.get_editor_font()
if default_font != "":
set_font(default_font)
func set_wrap_enabled(enabled:bool) -> void:
text_editor.set_wrap_enabled(enabled)
text_editor.update()
func draw_minimap(value:bool) -> void:
text_editor.draw_minimap(value)
text_editor.update()
func color_region(filextension : String) -> void:
match(filextension):
"bbs":
text_editor.add_color_region("[b]","[/b]",Color8(153,153,255,255),false)
text_editor.add_color_region("[i]","[/i]",Color8(153,255,153,255),false)
text_editor.add_color_region("[s]","[/s]",Color8(255,153,153,255),false)
text_editor.add_color_region("[u]","[/u]",Color8(255,255,102,255),false)
text_editor.add_color_region("[url","[/url]",Color8(153,204,255,255),false)
text_editor.add_color_region("[code]","[/code]",Color8(192,192,192,255),false)
text_editor.add_color_region("[img]","[/img]",Color8(255,204,153,255),false)
text_editor.add_color_region("[center]","[/center]",Color8(175,238,238,255),false)
text_editor.add_color_region("[right]","[/right]",Color8(135,206,235,255),false)
"html":
text_editor.add_color_region("<b>","</b>",Color8(153,153,255,255),false)
text_editor.add_color_region("<i>","</i>",Color8(153,255,153,255),false)
text_editor.add_color_region("<del>","</del>",Color8(255,153,153,255),false)
text_editor.add_color_region("<ins>","</ins>",Color8(255,255,102,255),false)
text_editor.add_color_region("<a","</a>",Color8(153,204,255,255),false)
text_editor.add_color_region("<img","/>",Color8(255,204,153,255),true)
text_editor.add_color_region("<pre>","</pre>",Color8(192,192,192,255),false)
text_editor.add_color_region("<center>","</center>",Color8(175,238,238,255),false)
text_editor.add_color_region("<right>","</right>",Color8(135,206,235,255),false)
"md":
text_editor.add_color_region("***","***",Color8(126,186,181,255),false)
text_editor.add_color_region("**","**",Color8(153,153,255,255),false)
text_editor.add_color_region("*","*",Color8(153,255,153,255),false)
text_editor.add_color_region("+ ","",Color8(255,178,102,255),false)
text_editor.add_color_region("- ","",Color8(255,178,102,255),false)
text_editor.add_color_region("~~","~~",Color8(255,153,153,255),false)
text_editor.add_color_region("__","__",Color8(255,255,102,255),false)
text_editor.add_color_region("[",")",Color8(153,204,255,255),false)
text_editor.add_color_region("`","`",Color8(192,192,192,255),false)
text_editor.add_color_region('"*.','"',Color8(255,255,255,255),true)
text_editor.add_color_region("# ","",Color8(105,105,105,255),true)
text_editor.add_color_region("## ","",Color8(128,128,128,255),true)
text_editor.add_color_region("### ","",Color8(169,169,169,255),true)
text_editor.add_color_region("#### ","",Color8(192,192,192,255),true)
text_editor.add_color_region("##### ","",Color8(211,211,211,255),true)
text_editor.add_color_region("###### ","",Color8(255,255,255,255),true)
text_editor.add_color_region("> ","",Color8(172,138,79,255),true)
"cfg":
text_editor.add_color_region("[","]",Color8(153,204,255,255),false)
text_editor.add_color_region('"','"',Color8(255,255,102,255),false)
text_editor.add_color_region(';','',Color8(128,128,128,255),true)
"ini":
text_editor.add_color_region("[","]",Color8(153,204,255,255),false)
text_editor.add_color_region('"','"',Color8(255,255,102,255),false)
text_editor.add_color_region(';','',Color8(128,128,128,255),true)
_:
pass
func clean_editor() -> void:
text_editor.set_text("")
#file_info_last_modified_icon.texture = IconLoader.load_icon_from_name("save")
file_info_last_modified.set_text("")
file_list.invalidate()
current_filename = ""
current_path = ""
func new_file_open(file_content : String, last_modified : Dictionary, current_file_path : String) -> void:
current_path = current_file_path
current_filename = current_file_path.get_file()
color_region(current_filename.get_extension())
text_editor.set_text(file_content)
update_lastmodified(last_modified,"save")
file_list.invalidate()
count_characters()
func update_lastmodified(last_modified : Dictionary, icon : String) -> void:
file_info_last_modified.set_text(str(last_modified.hour)+":"+str(last_modified.minute)+" "+str(last_modified.day)+"/"+str(last_modified.month)+"/"+str(last_modified.year))
#file_info_last_modified_icon.texture = IconLoader.load_icon_from_name(icon)
func new_file_create(file_name : String) -> void:
text_editor.set_text("")
file_list.invalidate()
func _on_Readonly_toggled(button_pressed : bool) -> void:
if button_pressed:
file_info_read_only.set_text("Read Only")
text_editor.readonly = (true)
else:
file_info_read_only.set_text("Can Edit")
text_editor.readonly = (false)
func _on_text_editor_text_changed() -> void:
#file_info_last_modified_icon.texture = IconLoader.load_icon_from_name("saveas")
count_characters()
emit_signal("text_changed")
func count_characters() -> void:
var counted : int = 0
for line in range(text_editor.get_line_count()):
counted += text_editor.get_line(line).length()
file_info_c_counter.set_text(str(counted))
func _on_LineEdit_text_changed(new_text : String) -> void:
var linecount : int = text_editor.get_line_count()
if new_text != "":
var found : PoolIntArray
var find : bool = false
for line in range(linecount):
for column in range(text_editor.get_line(line).length()):
found = text_editor.search( new_text, search_flag, line , column )
if found.size():
if found[1] == line:
# if not find:
text_editor.select(line,found[0],found[1],found[0]+new_text.length())
# find = true
else:
text_editor.select(0,0,0,0)
else:
text_editor.select(0,0,0,0)
func _on_matchcase_toggled(button_pressed : bool) -> void:
if button_pressed:
search_flag = 1
else:
if search_box_whole_words_cb.is_pressed():
search_flag = 2
else:
search_flag = 0
_on_LineEdit_text_changed(search_box_line_edit.get_text())
func _on_wholewords_toggled(button_pressed : bool) -> void:
if button_pressed:
search_flag = 2
else:
if search_box_match_case_cb.is_pressed():
search_flag = 1
else:
search_flag = 0
_on_LineEdit_text_changed(search_box_line_edit.get_text())
func _on_close_pressed() -> void:
search_box.hide()
func open_search_box() -> void:
if search_box.visible:
search_box.hide()
else:
search_box.show()
search_box.get_node("LineEdit").grab_focus()
func _on_Button_pressed() -> void:
var linecount : int = text_editor.get_line_count()-1
var old_text : String = replace_box_replace_le.get_text()
var new_text : String = replace_box_with.get_text()
var text : String = text_editor.get_text()
text_editor.set_text(text.replace(old_text,new_text))
func open_replace_box() -> void:
if replace_box.visible:
replace_box.hide()
else:
replace_box.show()
replace_box.get_node("replace").grab_focus()
func _on_close2_pressed() -> void:
replace_box.hide()
func _on_LineEdit_focus_entered() -> void:
_on_LineEdit_text_changed(search_box_line_edit.get_text())

View File

@ -1,31 +0,0 @@
tool
extends EditorPlugin
var IconLoader = preload("res://addons/file-editor/scripts/IconLoader.gd").new()
var LastOpenedFiles = preload("res://addons/file-editor/scripts/LastOpenedFiles.gd").new()
var FileEditor
func _enter_tree():
LastOpenedFiles.editor_plugin = self
LastOpenedFiles.editor_settings = get_editor_interface().get_editor_settings()
FileEditor = preload("res://addons/file-editor/scripts/FileEditor.gd").new()
FileEditor.LastOpenedFiles = LastOpenedFiles
get_editor_interface().get_editor_viewport().add_child(FileEditor)
FileEditor.hide()
func _exit_tree():
get_editor_interface().get_editor_viewport().remove_child(FileEditor)
func has_main_screen():
return true
func get_plugin_name():
return "File"
func get_plugin_icon():
return IconLoader.load_icon_from_name("file")
func make_visible(visible):
FileEditor.visible = visible

14
file-editor/README.md Normal file
View File

@ -0,0 +1,14 @@
# Godot Text Editor
A little plugin to easy-way manage your text files inside your project folder.
Author: *"Nicolo (fenix) Santilio"*
Version: *0.1.0*
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)!**
## What is this?
Building...
## How does it work?
Building...

1
file-editor/TODO.md Normal file
View File

@ -0,0 +1 @@
### to do (v-0.x.x)

3
file-editor/VERSION.md Normal file
View File

@ -0,0 +1,3 @@
**version 0.1.0**

Binary file not shown.

Binary file not shown.

BIN
file-editor/icon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 889 B

View File

@ -0,0 +1,5 @@
<svg width="16" height="16" version="1.1" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg">
<g transform="translate(0 -1036.4)">
<path transform="translate(0 1036.4)" d="m5 1v1h-4v2h14v-2h-4v-1h-6zm-3 4v8a2 2 0 0 0 2 2h8a2 2 0 0 0 2 -2v-8h-12zm1 2h2v6h-2v-6zm4 0h2v6h-2v-6zm4 0h2v6h-2v-6z" fill="#e0e0e0" fill-opacity=".99608"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 347 B

View File

Before

Width:  |  Height:  |  Size: 244 B

After

Width:  |  Height:  |  Size: 244 B

View File

@ -0,0 +1,7 @@
<svg width="16" height="16" version="1.1" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg">
<g transform="translate(0 -1036.4)">
<g transform="translate(0 -1.6949e-5)">
<path transform="translate(0 1036.4)" d="m2 1v14h12v-9h-5v-5zm8 0v4h4z" fill="#e0e0e0"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 281 B

View File

@ -0,0 +1,8 @@
<svg width="16" height="16" version="1.1" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg">
<g transform="translate(0 -1036.4)">
<g transform="translate(0 -1.6949e-5)">
<path transform="translate(0 1036.4)" d="m2 1v14h8v-1h-2v-4h2v-2h4v-2h-5v-5zm8 0v4h4z" fill="#e0e0e0"/>
<path d="m11 1045.4v2h-2v2h2v2h2v-2h2v-2h-2v-2z" fill="#84ffb1"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 362 B

View File

@ -0,0 +1,3 @@
<svg width="16" height="16" version="1.1" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg">
<path d="m8 2c-2.5567 0-5.7907 1.9477-6.9551 5.7051a1.0001 1.0001 0 0 0 -0.00586 0.57031c1.1244 3.9354 4.4609 5.7246 6.9609 5.7246s5.8365-1.7892 6.9609-5.7246a1.0001 1.0001 0 0 0 0 -0.55273c-1.1003-3.7876-4.4066-5.7227-6.9609-5.7227zm0 2a4 4 0 0 1 4 4 4 4 0 0 1 -4 4 4 4 0 0 1 -4 -4 4 4 0 0 1 4 -4zm0 2a2 2 0 0 0 -2 2 2 2 0 0 0 2 2 2 2 0 0 0 2 -2 2 2 0 0 0 -2 -2z" color="#000000" color-rendering="auto" fill="#e0e0e0" fill-opacity=".99608" fill-rule="evenodd" image-rendering="auto" shape-rendering="auto" solid-color="#000000" style="isolation:auto;mix-blend-mode:normal;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-transform:none;white-space:normal"/>
</svg>

After

Width:  |  Height:  |  Size: 818 B

View File

@ -0,0 +1,5 @@
<svg width="16" height="16" version="1.1" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg">
<g transform="translate(0 -1036.4)">
<path transform="translate(0 1036.4)" d="m3 1c-1.1046 0-2 0.89543-2 2v10c0 1.1046 0.89543 2 2 2h10c1.1046 0 2-0.89543 2-2v-7-1-1l-3-3h-1v5 1h-8v-6zm1 0v5h3v-5h-3zm4 8c1.1046 0 2 0.89543 2 2 0 1.1046-0.89543 2-2 2s-2-0.89543-2-2c0-1.1046 0.89543-2 2-2z" fill="#e0e0e0"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 417 B

View File

Before

Width:  |  Height:  |  Size: 250 B

After

Width:  |  Height:  |  Size: 250 B

View File

@ -2,6 +2,6 @@
name="File Editor"
description="An internal file editor to view and edit text files in your project folder."
author="Nicolo 'fenix' Santilio"
version="1.9.0"
author="Nicolò 'fenix' Santilio"
version="0.1.0"
script="scripts/file-editor.gd"

View File

@ -0,0 +1,163 @@
[gd_scene load_steps=18 format=2]
[ext_resource path="res://addons/file-editor/scripts/FileEditor.gd" type="Script" id=1]
[ext_resource path="res://addons/file-editor/icons/new.svg" type="Texture" id=2]
[ext_resource path="res://addons/file-editor/icons/file.svg" type="Texture" id=3]
[ext_resource path="res://addons/file-editor/icons/delete.svg" type="Texture" id=4]
[ext_resource path="res://addons/file-editor/fonts/Roboto-Black.ttf" type="DynamicFontData" id=5]
[ext_resource path="res://addons/file-editor/icons/read.svg" type="Texture" id=6]
[ext_resource path="res://addons/file-editor/icons/edit.png" type="Texture" id=7]
[ext_resource path="res://addons/file-editor/icons/save.svg" type="Texture" id=8]
[ext_resource path="res://addons/file-editor/icons/saveas.png" type="Texture" id=9]
[sub_resource type="DynamicFont" id=1]
outline_size = 3
outline_color = Color( 0.168627, 0.160784, 0.192157, 1 )
font_data = ExtResource( 5 )
[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="StyleBoxEmpty" id=7]
[sub_resource type="DynamicFont" id=8]
font_data = ExtResource( 5 )
[node name="FileEditor" type="Control"]
anchor_right = 1.0
anchor_bottom = 1.0
script = ExtResource( 1 )
[node name="Container" type="VBoxContainer" parent="."]
anchor_right = 1.0
anchor_bottom = 1.0
[node name="Buttons" type="HBoxContainer" parent="Container"]
editor/display_folded = true
margin_right = 1024.0
margin_bottom = 22.0
[node name="newfile_btn" type="Button" parent="Container/Buttons"]
margin_right = 338.0
margin_bottom = 22.0
size_flags_horizontal = 3
text = "Create new File"
icon = ExtResource( 2 )
[node name="openfile_btn" type="Button" parent="Container/Buttons"]
margin_left = 342.0
margin_right = 680.0
margin_bottom = 22.0
size_flags_horizontal = 3
text = "Open File"
icon = ExtResource( 3 )
[node name="deletefile_btn" type="Button" parent="Container/Buttons"]
margin_left = 684.0
margin_right = 1024.0
margin_bottom = 22.0
size_flags_horizontal = 3
text = "Delete File"
icon = ExtResource( 4 )
[node name="HSeparator" type="HSeparator" parent="Container"]
margin_top = 26.0
margin_right = 1024.0
margin_bottom = 30.0
[node name="Label" type="Label" parent="Container"]
margin_top = 34.0
margin_right = 1024.0
margin_bottom = 53.0
custom_fonts/font = SubResource( 1 )
text = "EDITOR"
align = 1
[node name="Editor" type="VBoxContainer" parent="Container"]
margin_top = 57.0
margin_right = 1024.0
margin_bottom = 600.0
size_flags_vertical = 3
[node name="TopBar" type="HBoxContainer" parent="Container/Editor"]
margin_right = 1024.0
margin_bottom = 24.0
[node name="Filename" type="LineEdit" parent="Container/Editor/TopBar"]
margin_right = 917.0
margin_bottom = 24.0
size_flags_horizontal = 11
expand_to_text_length = true
[node name="Readonly" type="CheckBox" parent="Container/Editor/TopBar"]
margin_left = 921.0
margin_right = 1000.0
margin_bottom = 24.0
custom_icons/checked = ExtResource( 6 )
custom_icons/unchecked = ExtResource( 7 )
custom_styles/hover = SubResource( 2 )
custom_styles/pressed = SubResource( 3 )
custom_styles/focus = SubResource( 4 )
custom_styles/disabled = SubResource( 5 )
custom_styles/hover_pressed = SubResource( 6 )
custom_styles/normal = SubResource( 7 )
custom_fonts/font = SubResource( 8 )
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="close_btn" type="Button" parent="Container/Editor/TopBar"]
margin_left = 1004.0
margin_right = 1024.0
margin_bottom = 24.0
text = "X"
[node name="TextEditor" type="TextEdit" parent="Container/Editor"]
margin_top = 28.0
margin_right = 1024.0
margin_bottom = 517.0
size_flags_vertical = 3
syntax_highlighting = true
show_line_numbers = true
breakpoint_gutter = true
highlight_all_occurrences = true
smooth_scrolling = true
caret_blink = true
caret_blink_speed = 0.1
[node name="EditorButtons" type="HBoxContainer" parent="Container/Editor"]
margin_top = 521.0
margin_right = 1024.0
margin_bottom = 543.0
[node name="savefile_btn" type="Button" parent="Container/Editor/EditorButtons"]
margin_right = 510.0
margin_bottom = 22.0
size_flags_horizontal = 3
text = "Save File"
icon = ExtResource( 8 )
[node name="savefileas_btn" type="Button" parent="Container/Editor/EditorButtons"]
margin_left = 514.0
margin_right = 1024.0
margin_bottom = 22.0
size_flags_horizontal = 3
text = "Save File as..."
icon = ExtResource( 9 )
[node name="FileList" type="FileDialog" parent="."]
margin_top = 24.0
margin_right = 1024.0
margin_bottom = 600.0
size_flags_vertical = 3
popup_exclusive = true
dialog_hide_on_ok = true
[connection signal="toggled" from="Container/Editor/TopBar/Readonly" to="." method="_on_Readonly_toggled"]

View File

@ -0,0 +1,165 @@
tool
extends Control
onready var FileList = $FileList
onready var TextEditor = $Container/Editor/TextEditor
onready var Filename = $Container/Editor/TopBar/Filename
onready var CloseFile = $Container/Editor/TopBar/close_btn
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 SaveFile = $Container/Editor/EditorButtons/savefile_btn
onready var SaveFileAs = $Container/Editor/EditorButtons/savefileas_btn
onready var ReadOnly = $Container/Editor/TopBar/Readonly
var DIRECTORY : String = "res://"
var EXCEPTIONS : String = "addons"
var EXTENSIONS : 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",
]
var directories = []
var files = []
# -----
var current_file : File = File.new()
var current_path : String = ""
var current_content : String = ""
# -----
func _ready():
OpenFile.connect("pressed",self,"open_selected_file")
NewFile.connect("pressed",self,"create_new_file")
DeleteFile.connect("pressed",self,"delete_selected_file")
SaveFile.connect("pressed",self,"save_file")
SaveFileAs.connect("pressed",self,"save_file_as")
CloseFile.connect("pressed",self,"close_editor")
Filename.set_editable(false)
SaveFile.set_disabled(true)
FileList.set_filters(EXTENSIONS)
Editor.hide()
func close_editor():
Editor.hide()
Filename.set_text("")
TextEditor.set_text("")
current_file.close()
current_file = File.new()
current_path = ""
current_content = ""
func clear_editor():
TextEditor.set_text("")
Filename.set_text("")
current_file = File.new()
func create_new_file():
close_editor()
SaveFile.set_disabled(true)
Editor.show()
func open_filelist():
FileList.update()
FileList.popup()
FileList.set_position(OS.get_screen_size()/2 - FileList.get_size()/2)
func save_file_as():
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,"open_file"):
FileList.connect("file_selected",self,"open_file",[current_content])
else:
FileList.disconnect("file_selected",self,"open_file")
FileList.connect("file_selected",self,"open_file",[current_content])
open_filelist()
func open_selected_file():
clear_editor()
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 delete_selected_file():
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 open_file(path : String, content_file : String):
var content = ""
if content_file == "" or content_file == null:
current_file.open(path,File.READ)
content = current_file.get_as_text()
else:
content = content_file
current_file.open(path,File.WRITE)
current_file.store_line(content)
TextEditor.set_text(content)
Filename.set_text(path)
current_file.close()
current_path = path
current_content = content
Editor.show()
SaveFile.set_disabled(false)
func save_file():
if current_path == "" or current_path == null:
save_file_as()
else:
current_file.open(current_path,File.WRITE)
current_content = TextEditor.get_text()
if current_content == null:
current_content = ""
current_file.store_line(current_content)
current_file.close()
func delete_file(path : String):
clear_editor()
var dir = Directory.new()
dir.remove(path)
func _on_Readonly_toggled(button_pressed):
if button_pressed:
ReadOnly.set_text("Read Only")
TextEditor.readonly = (true)
else:
ReadOnly.set_text("Can Edit")
TextEditor.readonly = (false)

View File

@ -0,0 +1,14 @@
tool
extends EditorPlugin
var doc
func _enter_tree():
doc = preload("../scenes/FileEditor.tscn").instance()
add_control_to_dock(EditorPlugin.DOCK_SLOT_LEFT_BR,doc)
# add_autoload_singleton("UserData","res://addons/github-integration/scripts/user_data.gd")
func _exit_tree():
remove_control_from_docks(doc)
# remove_autoload_singleton("UserData")
doc.queue_free()

View File

@ -1,28 +0,0 @@
; Engine configuration file.
; It's best edited using the editor UI and not directly,
; since the parameters that go here are not all obvious.
;
; Format:
; [section] ; section goes between []
; param=value ; assign values to parameters
config_version=4
[application]
config/name="fileed"
config/icon="res://icon.png"
[editor_plugins]
enabled=PoolStringArray( "res://addons/file-editor/plugin.cfg" )
[physics]
common/enable_pause_aware_picking=true
[rendering]
vram_compression/import_etc=true
vram_compression/import_etc2=false
environment/default_environment="res://default_env.tres"