├── .gitattributes ├── .gitignore ├── .import ├── go·reader_icon.png-eb6b9ff4d4880172aafde9a9124d4451.md5 ├── go·reader_icon.png-eb6b9ff4d4880172aafde9a9124d4451.stex ├── go·reader_splash.png-4d1f570c2cbda57ac4a6eca037bb1969.md5 ├── go·reader_splash.png-4d1f570c2cbda57ac4a6eca037bb1969.stex ├── go·reader_splash.png-acb6638996070732d2856e7966027ea4.md5 ├── go·reader_splash.png-acb6638996070732d2856e7966027ea4.stex ├── ico_about.png-667c34807e99eec68409107a3ca21ecb.md5 ├── ico_about.png-667c34807e99eec68409107a3ca21ecb.stex ├── ico_ebook.png-3f7e9d135ae3e31620ad49e41803f87d.md5 ├── ico_ebook.png-3f7e9d135ae3e31620ad49e41803f87d.stex ├── ico_import.png-f40a5467767134fc4b9427219fe8a893.md5 ├── ico_import.png-f40a5467767134fc4b9427219fe8a893.stex ├── ico_load.png-63691079baf62ef9054b56bd02795e02.md5 ├── ico_load.png-63691079baf62ef9054b56bd02795e02.stex ├── ico_settings.png-b04bb53a41ab12f2aedf2f7271911b66.md5 ├── ico_settings.png-b04bb53a41ab12f2aedf2f7271911b66.stex ├── icon.png-487276ed1e3a0c39cad0279d744ee560.md5 └── icon.png-487276ed1e3a0c39cad0279d744ee560.stex ├── 7z ├── 7z.dll ├── 7z.exe ├── 7z.sfx ├── 7zCon.sfx ├── 7zS2.sfx ├── 7zS2con.sfx ├── 7zSD.sfx ├── Codecs │ ├── LICENSE │ ├── README.md │ ├── brotli-x32.dll │ ├── flzma2-x32.dll │ ├── lizard-x32.dll │ ├── lz4-x32.dll │ ├── lz5-x32.dll │ └── zstd-x32.dll ├── License.txt └── note.txt ├── LICENSE ├── Main.gd ├── Main.tscn ├── README.md ├── core ├── SourceLoader.gd ├── Streamer.gd ├── Streamer.tscn ├── Tex.gd ├── Tex.tscn ├── file_search.gd └── resolution_manager.gd ├── default_env.tres ├── export_presets.cfg ├── global └── global.gd ├── icon.png ├── icon.png.import ├── project.godot ├── settings └── settings.json └── ui ├── About └── About.gd ├── Camera2D └── Camera2D.gd ├── DebugOverlay └── DebugOverlay.gd ├── Jump.gd ├── MenuContext └── MenuContext.gd ├── Messenger ├── Message.gd ├── Message.tscn └── Messenger.gd ├── Popup ├── FileDialog.gd └── Popup.gd ├── Settings └── Settings.gd ├── Starter └── Starter.gd ├── splash ├── go·reader_icon.ico ├── go·reader_icon.png ├── go·reader_icon.png.import ├── go·reader_splash.png └── go·reader_splash.png.import └── themes ├── LL12.tres ├── LL16.tres ├── LL18.tres ├── LL20.tres ├── LL24.tres ├── LL32.tres ├── LL48.tres ├── LLPage.tres ├── Lato-Light.ttf ├── Lato-Regular.ttf ├── icons ├── go·reader_splash.png.import ├── ico_about.png ├── ico_about.png.import ├── ico_ebook.png ├── ico_ebook.png.import ├── ico_import.png ├── ico_import.png.import ├── ico_load.png ├── ico_load.png.import ├── ico_settings.png └── ico_settings.png.import ├── sb_panel.tres ├── theme_context.tres └── theme_general.tres /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | *.json 3 | *.json 4 | *.json 5 | *.json 6 | settings/settings.json 7 | export_presets.cfg 8 | -------------------------------------------------------------------------------- /.import/go·reader_icon.png-eb6b9ff4d4880172aafde9a9124d4451.md5: -------------------------------------------------------------------------------- 1 | source_md5="9fc8ddc322fa4946e4a072527770ecaf" 2 | dest_md5="b48327d6ba89e3653830c8fdcb27ae2e" 3 | 4 | -------------------------------------------------------------------------------- /.import/go·reader_icon.png-eb6b9ff4d4880172aafde9a9124d4451.stex: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sirosky/go-reader/a5c765d8459591ea3d40dd5f4555c7f72819a2d7/.import/go·reader_icon.png-eb6b9ff4d4880172aafde9a9124d4451.stex -------------------------------------------------------------------------------- /.import/go·reader_splash.png-4d1f570c2cbda57ac4a6eca037bb1969.md5: -------------------------------------------------------------------------------- 1 | source_md5="a878975b464d735bfcf894257ceca6e7" 2 | dest_md5="24f3bb47f2e4d4807ff1b98ba5323aac" 3 | 4 | -------------------------------------------------------------------------------- /.import/go·reader_splash.png-4d1f570c2cbda57ac4a6eca037bb1969.stex: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sirosky/go-reader/a5c765d8459591ea3d40dd5f4555c7f72819a2d7/.import/go·reader_splash.png-4d1f570c2cbda57ac4a6eca037bb1969.stex -------------------------------------------------------------------------------- /.import/go·reader_splash.png-acb6638996070732d2856e7966027ea4.md5: -------------------------------------------------------------------------------- 1 | source_md5="147a0cc259eae40984994b2db62639cc" 2 | dest_md5="108a7af44da640bfe5a4ab857a832f9a" 3 | 4 | -------------------------------------------------------------------------------- /.import/go·reader_splash.png-acb6638996070732d2856e7966027ea4.stex: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sirosky/go-reader/a5c765d8459591ea3d40dd5f4555c7f72819a2d7/.import/go·reader_splash.png-acb6638996070732d2856e7966027ea4.stex -------------------------------------------------------------------------------- /.import/ico_about.png-667c34807e99eec68409107a3ca21ecb.md5: -------------------------------------------------------------------------------- 1 | source_md5="1cb538521ddb20d1f8682beda0f8df1f" 2 | dest_md5="15d42388aeb94b24118a84a613c01655" 3 | 4 | -------------------------------------------------------------------------------- /.import/ico_about.png-667c34807e99eec68409107a3ca21ecb.stex: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sirosky/go-reader/a5c765d8459591ea3d40dd5f4555c7f72819a2d7/.import/ico_about.png-667c34807e99eec68409107a3ca21ecb.stex -------------------------------------------------------------------------------- /.import/ico_ebook.png-3f7e9d135ae3e31620ad49e41803f87d.md5: -------------------------------------------------------------------------------- 1 | source_md5="424834088d38f2f0c90a1cabbfaf15cb" 2 | dest_md5="5bcacf0e6666a40691629bec5bbdff8a" 3 | 4 | -------------------------------------------------------------------------------- /.import/ico_ebook.png-3f7e9d135ae3e31620ad49e41803f87d.stex: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sirosky/go-reader/a5c765d8459591ea3d40dd5f4555c7f72819a2d7/.import/ico_ebook.png-3f7e9d135ae3e31620ad49e41803f87d.stex -------------------------------------------------------------------------------- /.import/ico_import.png-f40a5467767134fc4b9427219fe8a893.md5: -------------------------------------------------------------------------------- 1 | source_md5="d14980d5ea35377a304bed48859c08b8" 2 | dest_md5="ad62c829928f7e49cf0d5d8571aa19bb" 3 | 4 | -------------------------------------------------------------------------------- /.import/ico_import.png-f40a5467767134fc4b9427219fe8a893.stex: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sirosky/go-reader/a5c765d8459591ea3d40dd5f4555c7f72819a2d7/.import/ico_import.png-f40a5467767134fc4b9427219fe8a893.stex -------------------------------------------------------------------------------- /.import/ico_load.png-63691079baf62ef9054b56bd02795e02.md5: -------------------------------------------------------------------------------- 1 | source_md5="fdbf0a13fcabeae191c604d68b6b4044" 2 | dest_md5="f6aacf6dfe1a349a28d0184e59a8d5b9" 3 | 4 | -------------------------------------------------------------------------------- /.import/ico_load.png-63691079baf62ef9054b56bd02795e02.stex: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sirosky/go-reader/a5c765d8459591ea3d40dd5f4555c7f72819a2d7/.import/ico_load.png-63691079baf62ef9054b56bd02795e02.stex -------------------------------------------------------------------------------- /.import/ico_settings.png-b04bb53a41ab12f2aedf2f7271911b66.md5: -------------------------------------------------------------------------------- 1 | source_md5="4eb9fe349c34775c79454de705165846" 2 | dest_md5="f839218843c87584186cb12a8114be80" 3 | 4 | -------------------------------------------------------------------------------- /.import/ico_settings.png-b04bb53a41ab12f2aedf2f7271911b66.stex: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sirosky/go-reader/a5c765d8459591ea3d40dd5f4555c7f72819a2d7/.import/ico_settings.png-b04bb53a41ab12f2aedf2f7271911b66.stex -------------------------------------------------------------------------------- /.import/icon.png-487276ed1e3a0c39cad0279d744ee560.md5: -------------------------------------------------------------------------------- 1 | source_md5="47313fa4c47a9963fddd764e1ec6e4a8" 2 | dest_md5="2ded9e7f9060e2b530aab678b135fc5b" 3 | 4 | -------------------------------------------------------------------------------- /.import/icon.png-487276ed1e3a0c39cad0279d744ee560.stex: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sirosky/go-reader/a5c765d8459591ea3d40dd5f4555c7f72819a2d7/.import/icon.png-487276ed1e3a0c39cad0279d744ee560.stex -------------------------------------------------------------------------------- /7z/7z.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sirosky/go-reader/a5c765d8459591ea3d40dd5f4555c7f72819a2d7/7z/7z.dll -------------------------------------------------------------------------------- /7z/7z.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sirosky/go-reader/a5c765d8459591ea3d40dd5f4555c7f72819a2d7/7z/7z.exe -------------------------------------------------------------------------------- /7z/7z.sfx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sirosky/go-reader/a5c765d8459591ea3d40dd5f4555c7f72819a2d7/7z/7z.sfx -------------------------------------------------------------------------------- /7z/7zCon.sfx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sirosky/go-reader/a5c765d8459591ea3d40dd5f4555c7f72819a2d7/7z/7zCon.sfx -------------------------------------------------------------------------------- /7z/7zS2.sfx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sirosky/go-reader/a5c765d8459591ea3d40dd5f4555c7f72819a2d7/7z/7zS2.sfx -------------------------------------------------------------------------------- /7z/7zS2con.sfx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sirosky/go-reader/a5c765d8459591ea3d40dd5f4555c7f72819a2d7/7z/7zS2con.sfx -------------------------------------------------------------------------------- /7z/7zSD.sfx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sirosky/go-reader/a5c765d8459591ea3d40dd5f4555c7f72819a2d7/7z/7zSD.sfx -------------------------------------------------------------------------------- /7z/Codecs/LICENSE: -------------------------------------------------------------------------------- 1 | 7-Zip source code 2 | ~~~~~~~~~~~~~~~~~ 3 | License for use and distribution 4 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 5 | 6 | 7-Zip Codecs Copyright (C) 2016 - 2020 Tino Reichardt. 7 | 8 | 9 | GNU LGPL information 10 | -------------------- 11 | 12 | This library is free software; you can redistribute it and/or 13 | modify it under the terms of the GNU Lesser General Public 14 | License as published by the Free Software Foundation; either 15 | version 2.1 of the License, or (at your option) any later version. 16 | 17 | This library is distributed in the hope that it will be useful, 18 | but WITHOUT ANY WARRANTY; without even the implied warranty of 19 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 20 | Lesser General Public License for more details. 21 | 22 | You should have received a copy of the GNU Lesser General Public 23 | License along with this library; if not, write to the Free Software 24 | Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 25 | 26 | -- 27 | Tino Reichardt 28 | -------------------------------------------------------------------------------- /7z/Codecs/README.md: -------------------------------------------------------------------------------- 1 | 2 | This archive contains two precompiled DLL's for 7-Zip v17.00 or higher. 3 | 4 | ## Installation 5 | 6 | 1. download the codec archiv from https://mcmilk.de/projects/7-Zip-zstd/ 7 | 2. create a new directory named "Codecs" 8 | 3. put in there the CODEC-x32.dll or the CODEC-x64.dll, depending on your 7-Zip installation 9 | - normally, the x32 should go to: "C:\Program Files (x86)\7-Zip\Codecs" 10 | - and the x64 version should go in here: "C:\Program Files\7-Zip\Codecs" 11 | 4. then, you may check if the dll is correctly installed via this command: `7z.exe i` 12 | 13 | The output should look like this: 14 | ``` 15 | 16 | 7-Zip 17.00 beta (x64) : Copyright (c) 1999-2017 Igor Pavlov : 2017-04-29 17 | 18 | 19 | Libs: 20 | 0 c:\Program Files\7-Zip\7z.dll 21 | 1 c:\Program Files\7-Zip\Codecs\brotli-x64.dll 22 | 2 c:\Program Files\7-Zip\Codecs\lizard-x64.dll 23 | 3 c:\Program Files\7-Zip\Codecs\lz4-x64.dll 24 | 4 c:\Program Files\7-Zip\Codecs\lz5-x64.dll 25 | 5 c:\Program Files\7-Zip\Codecs\zstd-x64.dll 26 | 27 | Formats: 28 | 0 APM apm E R 29 | ... 30 | 31 | Codecs: 32 | 0 4ED 303011B BCJ2 33 | 0 ED 3030103 BCJ 34 | 0 ED 3030205 PPC 35 | 0 ED 3030401 IA64 36 | 0 ED 3030501 ARM 37 | 0 ED 3030701 ARMT 38 | 0 ED 3030805 SPARC 39 | 0 ED 20302 Swap2 40 | 0 ED 20304 Swap4 41 | 0 ED 40202 BZip2 42 | 0 ED 0 Copy 43 | 0 ED 40109 Deflate64 44 | 0 ED 40108 Deflate 45 | 0 ED 3 Delta 46 | 0 ED 21 LZMA2 47 | 0 ED 30101 LZMA 48 | 0 ED 30401 PPMD 49 | 0 D 40301 Rar1 50 | 0 D 40302 Rar2 51 | 0 D 40303 Rar3 52 | 0 D 40305 Rar5 53 | 0 ED 6F10701 7zAES 54 | 0 ED 6F00181 AES256CBC 55 | 1 ED 4F71102 BROTLI 56 | 2 ED 4F71106 LIZARD 57 | 3 ED 4F71104 LZ4 58 | 4 ED 4F71105 LZ5 59 | 5 ED 4F71101 ZSTD 60 | 61 | Hashers: 62 | 0 4 1 CRC32 63 | 0 20 201 SHA1 64 | 0 32 A SHA256 65 | 0 8 4 CRC64 66 | 0 32 202 BLAKE2sp 67 | ``` 68 | 69 | ## Usage 70 | 71 | - when compressing binaries (*.exe, *.dll), you have to explicitly disable 72 | the bcj2 filter via `-m0=bcj` 73 | - so the usage should look like this: 74 | 75 | ``` 76 | 7z a archiv.7z -m0=bcj -m1=zstd -mx1 ...Fast mode, with BCJ preprocessor on executables 77 | 7z a archiv.7z -m0=bcj -m1=zstd -mx.. ... 78 | 7z a archiv.7z -m0=bcj -m1=zstd -mx21 ...2nd Slowest Mode, with BCJ preprocessor on executables 79 | 7z a archiv.7z -m0=bcj -m1=zstd -mx22 ...Ultra Mode, with BCJ preprocessor on executables 80 | ``` 81 | 82 | ## License and redistribution 83 | 84 | - the same as the original 7-Zip, which means GNU LGPL 85 | 86 | /TR 2017-05-25 87 | -------------------------------------------------------------------------------- /7z/Codecs/brotli-x32.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sirosky/go-reader/a5c765d8459591ea3d40dd5f4555c7f72819a2d7/7z/Codecs/brotli-x32.dll -------------------------------------------------------------------------------- /7z/Codecs/flzma2-x32.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sirosky/go-reader/a5c765d8459591ea3d40dd5f4555c7f72819a2d7/7z/Codecs/flzma2-x32.dll -------------------------------------------------------------------------------- /7z/Codecs/lizard-x32.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sirosky/go-reader/a5c765d8459591ea3d40dd5f4555c7f72819a2d7/7z/Codecs/lizard-x32.dll -------------------------------------------------------------------------------- /7z/Codecs/lz4-x32.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sirosky/go-reader/a5c765d8459591ea3d40dd5f4555c7f72819a2d7/7z/Codecs/lz4-x32.dll -------------------------------------------------------------------------------- /7z/Codecs/lz5-x32.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sirosky/go-reader/a5c765d8459591ea3d40dd5f4555c7f72819a2d7/7z/Codecs/lz5-x32.dll -------------------------------------------------------------------------------- /7z/Codecs/zstd-x32.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sirosky/go-reader/a5c765d8459591ea3d40dd5f4555c7f72819a2d7/7z/Codecs/zstd-x32.dll -------------------------------------------------------------------------------- /7z/License.txt: -------------------------------------------------------------------------------- 1 | 7-Zip 2 | ~~~~~ 3 | License for use and distribution 4 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 5 | 6 | 7-Zip Copyright (C) 1999-2015 Igor Pavlov. 7 | 8 | Licenses for files are: 9 | 10 | 1) 7z.dll: GNU LGPL + unRAR restriction 11 | 2) All other files: GNU LGPL 12 | 13 | The GNU LGPL + unRAR restriction means that you must follow both 14 | GNU LGPL rules and unRAR restriction rules. 15 | 16 | 17 | Note: 18 | You can use 7-Zip on any computer, including a computer in a commercial 19 | organization. You don't need to register or pay for 7-Zip. 20 | 21 | 22 | GNU LGPL information 23 | -------------------- 24 | 25 | This library is free software; you can redistribute it and/or 26 | modify it under the terms of the GNU Lesser General Public 27 | License as published by the Free Software Foundation; either 28 | version 2.1 of the License, or (at your option) any later version. 29 | 30 | This library is distributed in the hope that it will be useful, 31 | but WITHOUT ANY WARRANTY; without even the implied warranty of 32 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 33 | Lesser General Public License for more details. 34 | 35 | You can receive a copy of the GNU Lesser General Public License from 36 | http://www.gnu.org/ 37 | 38 | 39 | unRAR restriction 40 | ----------------- 41 | 42 | The decompression engine for RAR archives was developed using source 43 | code of unRAR program. 44 | All copyrights to original unRAR code are owned by Alexander Roshal. 45 | 46 | The license for original unRAR code has the following restriction: 47 | 48 | The unRAR sources cannot be used to re-create the RAR compression algorithm, 49 | which is proprietary. Distribution of modified unRAR sources in separate form 50 | or as a part of other software is permitted, provided that it is clearly 51 | stated in the documentation and source comments that the code may 52 | not be used to develop a RAR (WinRAR) compatible archiver. 53 | 54 | 55 | -- 56 | Igor Pavlov 57 | -------------------------------------------------------------------------------- /7z/note.txt: -------------------------------------------------------------------------------- 1 | All software in this path is released under LGPL by Igor Pavlov; sfx icons were substituted from ones created by myself. 2 | Rar29.dll (Rar29.so on Linux systems) brings additional restriction: the unRAR sources cannot be used to re-create the RAR compression algorithm, which is proprietary. 3 | If you don't need to handle Rar format you can simply remove it. 4 | 5 | Reference: http://www.7-zip.org/ -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 Sirosky 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Main.gd: -------------------------------------------------------------------------------- 1 | extends Control 2 | 3 | onready var MenuContext = get_node("Popup/MenuContext") 4 | onready var SourceLoader = get_node("Core/SourceLoader") 5 | onready var Streamer = get_node("Core/Streamer") 6 | onready var Debug = get_node("/root/Main/UI/Debug") 7 | onready var UI = get_node("UI") 8 | onready var TexAll = get_node("TexAll") 9 | onready var Camera2D = get_node("Camera2D") 10 | onready var Starter = get_node("UI/Starter") 11 | onready var Welcome = get_node("/root/Main/Popup/Welcome") 12 | 13 | var Dir = Directory.new() 14 | var cur_dir = "" #Current directory manga is loaded from 15 | 16 | #Options 17 | var read_pages = 1 18 | 19 | # Called when the node enters the scene tree for the first time. 20 | func _ready(): 21 | settings_load() 22 | 23 | func _input(event): 24 | #Next page 25 | # if event is InputEventMouseButton and event.button_index == BUTTON_MIDDLE and event.pressed and not event.is_echo(): 26 | # page_next() 27 | 28 | if event.is_action_pressed("ui_cancel"): #Exit 29 | settings_save_page() 30 | yield(get_tree().create_timer(.1), "timeout") 31 | get_tree().quit() 32 | if event.is_action_pressed("ui_debug_overlay"): 33 | Debug.visible = !Debug.visible 34 | if event.is_action_pressed("ui_jump"): 35 | UI.Jump_toggle() 36 | if event.is_action_pressed("ui_fullscreen"): 37 | var a = OS.is_window_fullscreen() 38 | a = !a 39 | OS.set_window_fullscreen(a) 40 | if event.is_action_pressed("ui_load"): 41 | MenuContext._on_ButLoad_pressed() 42 | 43 | func reset(): 44 | if TexAll.get_child_count() > 0: #If there's anything loaded prior, reset everything 45 | Camera2D.position.x = 0 46 | Camera2D.position.y = OS.get_screen_size().y/2 47 | Camera2D.camera_limit_y1 = -24 48 | #Save our progress 49 | settings_save_page() 50 | 51 | # Camera2D.set_zoom(Vector2(1,1)) 52 | global.children_delete(TexAll) 53 | Streamer.reset() 54 | 55 | func settings_reset(): 56 | global.settings["General"] = {} 57 | global.settings["General"]["first_start"] = false 58 | global.settings["General"]["autoload"] = true 59 | global.settings["General"]["autoload_source"] = "" 60 | global.settings["General"]["fullscreen"] = true 61 | global.settings["General"]["debug_overlay"] = false 62 | global.settings["History"] = {} 63 | global.settings["BG"] = {} 64 | global.settings["BG"]["color"] = {} 65 | global.settings["BG"]["color"]["h"] = float(226)/float(360) 66 | global.settings["BG"]["color"]["s"] = float(60)/float(360) 67 | global.settings["BG"]["color"]["v"] = float(20)/float(360) 68 | 69 | func settings_load(): 70 | var file_temp = File.new() 71 | 72 | if file_temp.file_exists(global.settings_path): #Existing setting 73 | global.settings = global.json_read(global.settings_path) 74 | 75 | set_debug_overlay() 76 | set_fullscreen() 77 | set_bg_color(global.settings["BG"]["color"]["h"], global.settings["BG"]["color"]["s"], global.settings["BG"]["color"]["v"]) 78 | 79 | if global.settings["General"]["autoload"] == true and !global.settings["General"]["autoload_source"] == "" and Dir.dir_exists(global.settings["General"]["autoload_source"]): 80 | Starter.queue_free() 81 | SourceLoader.source_load(global.settings["General"]["autoload_source"]) 82 | 83 | else: #new start 84 | settings_reset() 85 | settings_save() 86 | Welcome.toggle() 87 | global.settings["General"]["first_start"] = false 88 | 89 | func settings_save(): 90 | var settings_path = OS.get_executable_path().get_base_dir() + "\\settings" #Only works when exported. 91 | #ProjecSettings.globalize_path doesn't work when exported for some dumb reason, so this is the workaround. 92 | 93 | if !Dir.dir_exists(settings_path): #Create a new folder for the base library 94 | Dir.make_dir(settings_path) 95 | 96 | global.json_write(global.settings_path, global.settings) 97 | 98 | func settings_save_page(): 99 | if cur_dir != "": 100 | global.settings["History"][cur_dir] = Streamer.page_cur 101 | global.settings["General"]["autoload_source"] = cur_dir 102 | settings_save() 103 | 104 | #set settings 105 | 106 | func set_debug_overlay(): 107 | Debug.visible = global.settings["General"]["debug_overlay"] 108 | 109 | func set_fullscreen(): 110 | OS.set_window_fullscreen(global.settings["General"]["fullscreen"]) 111 | 112 | func set_bg_color(h, s, v): 113 | VisualServer.set_default_clear_color(Color.from_hsv(h, s, v, 1)) 114 | # ProjectSettings.set_setting("rendering/environment/default_clear_color", color) 115 | -------------------------------------------------------------------------------- /Main.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=27 format=2] 2 | 3 | [ext_resource path="res://Main.gd" type="Script" id=1] 4 | [ext_resource path="res://core/Streamer.gd" type="Script" id=2] 5 | [ext_resource path="res://ui/MenuContext/MenuContext.gd" type="Script" id=3] 6 | [ext_resource path="res://ui/Camera2D/Camera2D.gd" type="Script" id=4] 7 | [ext_resource path="res://core/SourceLoader.gd" type="Script" id=5] 8 | [ext_resource path="res://ui/Jump.gd" type="Script" id=6] 9 | [ext_resource path="res://ui/DebugOverlay/DebugOverlay.gd" type="Script" id=7] 10 | [ext_resource path="res://ui/themes/LL48.tres" type="DynamicFont" id=8] 11 | [ext_resource path="res://ui/themes/LL20.tres" type="DynamicFont" id=9] 12 | [ext_resource path="res://ui/Starter/Starter.gd" type="Script" id=10] 13 | [ext_resource path="res://ui/themes/icons/ico_load.png" type="Texture" id=11] 14 | [ext_resource path="res://ui/themes/icons/ico_import.png" type="Texture" id=12] 15 | [ext_resource path="res://ui/themes/LL24.tres" type="DynamicFont" id=13] 16 | [ext_resource path="res://ui/themes/theme_context.tres" type="Theme" id=14] 17 | [ext_resource path="res://ui/themes/theme_general.tres" type="Theme" id=15] 18 | [ext_resource path="res://ui/themes/LLPage.tres" type="DynamicFont" id=16] 19 | [ext_resource path="res://ui/themes/LL32.tres" type="DynamicFont" id=17] 20 | [ext_resource path="res://ui/themes/LL18.tres" type="DynamicFont" id=18] 21 | [ext_resource path="res://ui/Settings/Settings.gd" type="Script" id=19] 22 | [ext_resource path="res://ui/themes/icons/ico_settings.png" type="Texture" id=20] 23 | [ext_resource path="res://ui/Messenger/Messenger.gd" type="Script" id=21] 24 | [ext_resource path="res://ui/themes/icons/ico_about.png" type="Texture" id=22] 25 | [ext_resource path="res://ui/themes/sb_panel.tres" type="StyleBox" id=23] 26 | [ext_resource path="res://ui/About/About.gd" type="Script" id=26] 27 | [ext_resource path="res://ui/themes/icons/ico_ebook.png" type="Texture" id=27] 28 | 29 | [sub_resource type="StyleBoxFlat" id=1] 30 | bg_color = Color( 0.156863, 0.305882, 0.529412, 1 ) 31 | 32 | [node name="Main" type="Control"] 33 | mouse_filter = 2 34 | script = ExtResource( 1 ) 35 | __meta__ = { 36 | "_edit_use_anchors_": false 37 | } 38 | 39 | [node name="Core" type="Node" parent="."] 40 | 41 | [node name="SourceLoader" type="Node" parent="Core"] 42 | script = ExtResource( 5 ) 43 | 44 | [node name="Streamer" type="Node" parent="Core"] 45 | script = ExtResource( 2 ) 46 | 47 | [node name="Tween" type="Tween" parent="Core"] 48 | 49 | [node name="TexAll" type="Node" parent="."] 50 | 51 | [node name="Camera2D" type="Camera2D" parent="."] 52 | position = Vector2( 0, 540 ) 53 | current = true 54 | limit_smoothed = true 55 | smoothing_speed = -1.0 56 | script = ExtResource( 4 ) 57 | 58 | [node name="UI" type="CanvasLayer" parent="."] 59 | script = ExtResource( 7 ) 60 | 61 | [node name="Debug" type="VBoxContainer" parent="UI"] 62 | visible = false 63 | margin_right = 40.0 64 | margin_bottom = 40.0 65 | __meta__ = { 66 | "_edit_use_anchors_": false 67 | } 68 | 69 | [node name="Label" type="Label" parent="UI/Debug"] 70 | margin_right = 40.0 71 | margin_bottom = 30.0 72 | custom_fonts/font = ExtResource( 13 ) 73 | custom_colors/font_color = Color( 0, 0.47451, 1, 1 ) 74 | 75 | [node name="Label2" type="Label" parent="UI/Debug"] 76 | margin_top = 38.0 77 | margin_right = 40.0 78 | margin_bottom = 68.0 79 | custom_fonts/font = ExtResource( 13 ) 80 | custom_colors/font_color = Color( 0, 0.47451, 1, 1 ) 81 | 82 | [node name="Label3" type="Label" parent="UI/Debug"] 83 | margin_top = 76.0 84 | margin_right = 40.0 85 | margin_bottom = 106.0 86 | custom_fonts/font = ExtResource( 13 ) 87 | custom_colors/font_color = Color( 0, 0.47451, 1, 1 ) 88 | 89 | [node name="Label4" type="Label" parent="UI/Debug"] 90 | margin_top = 114.0 91 | margin_right = 40.0 92 | margin_bottom = 144.0 93 | custom_fonts/font = ExtResource( 13 ) 94 | custom_colors/font_color = Color( 0, 0.47451, 1, 1 ) 95 | 96 | [node name="Label5" type="Label" parent="UI/Debug"] 97 | margin_top = 152.0 98 | margin_right = 40.0 99 | margin_bottom = 182.0 100 | custom_fonts/font = ExtResource( 13 ) 101 | custom_colors/font_color = Color( 0, 0.47451, 1, 1 ) 102 | 103 | [node name="Label6" type="Label" parent="UI/Debug"] 104 | margin_top = 190.0 105 | margin_right = 40.0 106 | margin_bottom = 220.0 107 | custom_fonts/font = ExtResource( 13 ) 108 | custom_colors/font_color = Color( 0, 0.47451, 1, 1 ) 109 | 110 | [node name="Label7" type="Label" parent="UI/Debug"] 111 | margin_top = 228.0 112 | margin_right = 40.0 113 | margin_bottom = 258.0 114 | custom_fonts/font = ExtResource( 13 ) 115 | custom_colors/font_color = Color( 0, 0.47451, 1, 1 ) 116 | 117 | [node name="Label8" type="Label" parent="UI/Debug"] 118 | margin_top = 266.0 119 | margin_right = 40.0 120 | margin_bottom = 296.0 121 | custom_fonts/font = ExtResource( 13 ) 122 | custom_colors/font_color = Color( 0, 0.47451, 1, 1 ) 123 | 124 | [node name="Label9" type="Label" parent="UI/Debug"] 125 | margin_top = 304.0 126 | margin_right = 40.0 127 | margin_bottom = 334.0 128 | custom_fonts/font = ExtResource( 13 ) 129 | custom_colors/font_color = Color( 0, 0.47451, 1, 1 ) 130 | 131 | [node name="ProgressBar" type="ProgressBar" parent="UI"] 132 | visible = false 133 | margin_left = -957.503 134 | margin_top = 1048.66 135 | margin_right = -717.503 136 | margin_bottom = 1096.66 137 | theme = ExtResource( 15 ) 138 | custom_fonts/font = ExtResource( 13 ) 139 | custom_colors/font_color = Color( 1, 1, 1, 1 ) 140 | __meta__ = { 141 | "_edit_use_anchors_": false 142 | } 143 | 144 | [node name="Jump" type="Control" parent="UI"] 145 | visible = false 146 | margin_right = 400.0 147 | margin_bottom = 120.0 148 | theme = ExtResource( 15 ) 149 | script = ExtResource( 6 ) 150 | __meta__ = { 151 | "_edit_use_anchors_": false 152 | } 153 | 154 | [node name="Panel" type="Panel" parent="UI/Jump"] 155 | margin_right = 400.0 156 | margin_bottom = 120.0 157 | __meta__ = { 158 | "_edit_use_anchors_": false 159 | } 160 | 161 | [node name="Margin" type="MarginContainer" parent="UI/Jump"] 162 | margin_right = 400.0 163 | margin_bottom = 120.0 164 | size_flags_horizontal = 3 165 | size_flags_vertical = 3 166 | custom_constants/margin_right = 12 167 | custom_constants/margin_top = 12 168 | custom_constants/margin_left = 12 169 | custom_constants/margin_bottom = 12 170 | __meta__ = { 171 | "_edit_use_anchors_": false 172 | } 173 | 174 | [node name="VBoxContainer" type="VBoxContainer" parent="UI/Jump/Margin"] 175 | margin_left = 12.0 176 | margin_top = 12.0 177 | margin_right = 388.0 178 | margin_bottom = 108.0 179 | 180 | [node name="SpinBox" type="SpinBox" parent="UI/Jump/Margin/VBoxContainer"] 181 | margin_right = 376.0 182 | margin_bottom = 45.0 183 | align = 1 184 | 185 | [node name="HBoxContainer" type="HBoxContainer" parent="UI/Jump/Margin/VBoxContainer"] 186 | margin_top = 53.0 187 | margin_right = 376.0 188 | margin_bottom = 90.0 189 | size_flags_horizontal = 3 190 | 191 | [node name="ButJump" type="Button" parent="UI/Jump/Margin/VBoxContainer/HBoxContainer"] 192 | margin_right = 184.0 193 | margin_bottom = 37.0 194 | size_flags_horizontal = 3 195 | text = "Jump" 196 | 197 | [node name="ButCancel" type="Button" parent="UI/Jump/Margin/VBoxContainer/HBoxContainer"] 198 | margin_left = 192.0 199 | margin_right = 376.0 200 | margin_bottom = 37.0 201 | size_flags_horizontal = 3 202 | text = "Cancel" 203 | 204 | [node name="Starter" type="Control" parent="UI"] 205 | visible = false 206 | margin_right = 640.0 207 | margin_bottom = 472.0 208 | script = ExtResource( 10 ) 209 | __meta__ = { 210 | "_edit_use_anchors_": false 211 | } 212 | 213 | [node name="Panel" type="Panel" parent="UI/Starter"] 214 | margin_right = 640.0 215 | margin_bottom = 472.0 216 | theme = ExtResource( 15 ) 217 | __meta__ = { 218 | "_edit_use_anchors_": false 219 | } 220 | 221 | [node name="Margin" type="MarginContainer" parent="UI/Starter"] 222 | margin_right = 640.0 223 | margin_bottom = 472.0 224 | size_flags_horizontal = 4 225 | size_flags_vertical = 0 226 | custom_constants/margin_right = 12 227 | custom_constants/margin_top = 12 228 | custom_constants/margin_left = 12 229 | custom_constants/margin_bottom = 12 230 | __meta__ = { 231 | "_edit_use_anchors_": false 232 | } 233 | 234 | [node name="VBox" type="VBoxContainer" parent="UI/Starter/Margin"] 235 | margin_left = 12.0 236 | margin_top = 12.0 237 | margin_right = 628.0 238 | margin_bottom = 460.0 239 | size_flags_horizontal = 5 240 | size_flags_vertical = 5 241 | custom_constants/separation = 16 242 | 243 | [node name="LabelTitle" type="Label" parent="UI/Starter/Margin/VBox"] 244 | modulate = Color( 1, 1, 1, 0.490196 ) 245 | margin_right = 616.0 246 | margin_bottom = 59.0 247 | custom_fonts/font = ExtResource( 8 ) 248 | text = "get started" 249 | align = 1 250 | 251 | [node name="HBox" type="HBoxContainer" parent="UI/Starter/Margin/VBox"] 252 | margin_top = 75.0 253 | margin_right = 616.0 254 | margin_bottom = 248.0 255 | custom_constants/separation = 12 256 | alignment = 1 257 | 258 | [node name="VBox1" type="VBoxContainer" parent="UI/Starter/Margin/VBox/HBox"] 259 | margin_left = 68.0 260 | margin_right = 220.0 261 | margin_bottom = 173.0 262 | 263 | [node name="ButLoad" type="Button" parent="UI/Starter/Margin/VBox/HBox/VBox1"] 264 | margin_right = 152.0 265 | margin_bottom = 140.0 266 | rect_min_size = Vector2( 128, 128 ) 267 | theme = ExtResource( 15 ) 268 | icon = ExtResource( 11 ) 269 | 270 | [node name="Label" type="Label" parent="UI/Starter/Margin/VBox/HBox/VBox1"] 271 | modulate = Color( 1, 1, 1, 0.784314 ) 272 | margin_top = 148.0 273 | margin_right = 152.0 274 | margin_bottom = 173.0 275 | custom_fonts/font = ExtResource( 9 ) 276 | text = "load from library" 277 | align = 1 278 | valign = 1 279 | 280 | [node name="VBox3" type="VBoxContainer" parent="UI/Starter/Margin/VBox/HBox"] 281 | margin_left = 232.0 282 | margin_right = 384.0 283 | margin_bottom = 173.0 284 | 285 | [node name="ButImportZIP" type="Button" parent="UI/Starter/Margin/VBox/HBox/VBox3"] 286 | margin_right = 152.0 287 | margin_bottom = 140.0 288 | rect_min_size = Vector2( 128, 128 ) 289 | theme = ExtResource( 15 ) 290 | icon = ExtResource( 27 ) 291 | 292 | [node name="Label" type="Label" parent="UI/Starter/Margin/VBox/HBox/VBox3"] 293 | modulate = Color( 1, 1, 1, 0.784314 ) 294 | margin_top = 148.0 295 | margin_right = 152.0 296 | margin_bottom = 173.0 297 | custom_fonts/font = ExtResource( 9 ) 298 | text = "import ebook" 299 | align = 1 300 | valign = 1 301 | 302 | [node name="VBox2" type="VBoxContainer" parent="UI/Starter/Margin/VBox/HBox"] 303 | margin_left = 396.0 304 | margin_right = 548.0 305 | margin_bottom = 173.0 306 | 307 | [node name="ButImport" type="Button" parent="UI/Starter/Margin/VBox/HBox/VBox2"] 308 | margin_right = 152.0 309 | margin_bottom = 140.0 310 | rect_min_size = Vector2( 128, 128 ) 311 | theme = ExtResource( 15 ) 312 | icon = ExtResource( 12 ) 313 | 314 | [node name="Label" type="Label" parent="UI/Starter/Margin/VBox/HBox/VBox2"] 315 | modulate = Color( 1, 1, 1, 0.784314 ) 316 | margin_top = 148.0 317 | margin_right = 152.0 318 | margin_bottom = 173.0 319 | custom_fonts/font = ExtResource( 9 ) 320 | text = "import to library" 321 | align = 1 322 | valign = 1 323 | 324 | [node name="HBox2" type="HBoxContainer" parent="UI/Starter/Margin/VBox"] 325 | margin_top = 264.0 326 | margin_right = 616.0 327 | margin_bottom = 437.0 328 | alignment = 1 329 | 330 | [node name="VBox" type="VBoxContainer" parent="UI/Starter/Margin/VBox/HBox2"] 331 | margin_left = 152.0 332 | margin_right = 304.0 333 | margin_bottom = 173.0 334 | 335 | [node name="ButSettings" type="Button" parent="UI/Starter/Margin/VBox/HBox2/VBox"] 336 | margin_right = 152.0 337 | margin_bottom = 140.0 338 | rect_min_size = Vector2( 128, 128 ) 339 | theme = ExtResource( 15 ) 340 | icon = ExtResource( 20 ) 341 | 342 | [node name="Label" type="Label" parent="UI/Starter/Margin/VBox/HBox2/VBox"] 343 | modulate = Color( 1, 1, 1, 0.784314 ) 344 | margin_top = 148.0 345 | margin_right = 152.0 346 | margin_bottom = 173.0 347 | custom_fonts/font = ExtResource( 9 ) 348 | text = "change settings" 349 | align = 1 350 | valign = 1 351 | 352 | [node name="VBox2" type="VBoxContainer" parent="UI/Starter/Margin/VBox/HBox2"] 353 | margin_left = 312.0 354 | margin_right = 464.0 355 | margin_bottom = 173.0 356 | 357 | [node name="ButAbout" type="Button" parent="UI/Starter/Margin/VBox/HBox2/VBox2"] 358 | margin_right = 152.0 359 | margin_bottom = 140.0 360 | rect_min_size = Vector2( 128, 128 ) 361 | theme = ExtResource( 15 ) 362 | icon = ExtResource( 22 ) 363 | 364 | [node name="Label" type="Label" parent="UI/Starter/Margin/VBox/HBox2/VBox2"] 365 | modulate = Color( 1, 1, 1, 0.784314 ) 366 | margin_top = 148.0 367 | margin_right = 152.0 368 | margin_bottom = 173.0 369 | custom_fonts/font = ExtResource( 9 ) 370 | text = "about" 371 | align = 1 372 | valign = 1 373 | 374 | [node name="LabelPage" type="Label" parent="UI"] 375 | margin_left = 747.135 376 | margin_top = 1039.0 377 | margin_right = 960.135 378 | margin_bottom = 1078.0 379 | custom_fonts/font = ExtResource( 16 ) 380 | text = "24 | 4934" 381 | align = 2 382 | valign = 2 383 | __meta__ = { 384 | "_edit_use_anchors_": false 385 | } 386 | 387 | [node name="Messenger" type="Node" parent="UI"] 388 | script = ExtResource( 21 ) 389 | 390 | [node name="Popup" type="CanvasLayer" parent="."] 391 | 392 | [node name="MenuContext" type="MarginContainer" parent="Popup"] 393 | visible = false 394 | margin_right = 228.0 395 | margin_bottom = 90.0 396 | custom_constants/margin_right = 4 397 | custom_constants/margin_top = 4 398 | custom_constants/margin_left = 4 399 | custom_constants/margin_bottom = 4 400 | script = ExtResource( 3 ) 401 | __meta__ = { 402 | "_edit_use_anchors_": false 403 | } 404 | 405 | [node name="Panel" type="Panel" parent="Popup/MenuContext"] 406 | margin_left = 4.0 407 | margin_top = 4.0 408 | margin_right = 278.0 409 | margin_bottom = 206.0 410 | mouse_filter = 2 411 | theme = ExtResource( 15 ) 412 | 413 | [node name="Margin" type="MarginContainer" parent="Popup/MenuContext"] 414 | margin_left = 4.0 415 | margin_top = 4.0 416 | margin_right = 278.0 417 | margin_bottom = 206.0 418 | custom_constants/margin_right = 4 419 | custom_constants/margin_top = 4 420 | custom_constants/margin_left = 4 421 | custom_constants/margin_bottom = 4 422 | 423 | [node name="VBox" type="VBoxContainer" parent="Popup/MenuContext/Margin"] 424 | margin_left = 4.0 425 | margin_top = 4.0 426 | margin_right = 270.0 427 | margin_bottom = 198.0 428 | custom_constants/separation = 6 429 | 430 | [node name="ButLoad" type="Button" parent="Popup/MenuContext/Margin/VBox"] 431 | margin_right = 220.0 432 | margin_bottom = 25.0 433 | size_flags_horizontal = 3 434 | size_flags_vertical = 3 435 | theme = ExtResource( 14 ) 436 | text = "Load from Library" 437 | align = 0 438 | 439 | [node name="ButImportZIP" type="Button" parent="Popup/MenuContext/Margin/VBox"] 440 | margin_top = 62.0 441 | margin_right = 220.0 442 | margin_bottom = 87.0 443 | size_flags_horizontal = 3 444 | size_flags_vertical = 3 445 | theme = ExtResource( 14 ) 446 | text = "Import eBook folder to Library" 447 | align = 0 448 | 449 | [node name="ButImport" type="Button" parent="Popup/MenuContext/Margin/VBox"] 450 | margin_top = 31.0 451 | margin_right = 220.0 452 | margin_bottom = 56.0 453 | size_flags_horizontal = 3 454 | size_flags_vertical = 3 455 | theme = ExtResource( 14 ) 456 | text = "Import images folder to Library" 457 | align = 0 458 | 459 | [node name="ButDirectory" type="Button" parent="Popup/MenuContext/Margin/VBox"] 460 | margin_top = 93.0 461 | margin_right = 220.0 462 | margin_bottom = 118.0 463 | size_flags_horizontal = 3 464 | size_flags_vertical = 3 465 | theme = ExtResource( 14 ) 466 | text = "Open Library in Windows" 467 | align = 0 468 | 469 | [node name="ButSettings" type="Button" parent="Popup/MenuContext/Margin/VBox"] 470 | margin_top = 124.0 471 | margin_right = 220.0 472 | margin_bottom = 149.0 473 | size_flags_horizontal = 3 474 | size_flags_vertical = 3 475 | theme = ExtResource( 14 ) 476 | text = "Settings" 477 | align = 0 478 | 479 | [node name="HSeparator" type="HSeparator" parent="Popup/MenuContext/Margin/VBox"] 480 | margin_top = 155.0 481 | margin_right = 220.0 482 | margin_bottom = 163.0 483 | 484 | [node name="ButJump" type="Button" parent="Popup/MenuContext/Margin/VBox"] 485 | margin_top = 169.0 486 | margin_right = 220.0 487 | margin_bottom = 194.0 488 | size_flags_horizontal = 3 489 | size_flags_vertical = 3 490 | theme = ExtResource( 14 ) 491 | text = "Jump to page" 492 | align = 0 493 | 494 | [node name="FileDialog" type="FileDialog" parent="Popup"] 495 | margin_left = -341.178 496 | margin_top = 188.58 497 | margin_right = 558.822 498 | margin_bottom = 788.58 499 | window_title = "Open a Directory" 500 | resizable = true 501 | mode_overrides_title = false 502 | mode = 2 503 | __meta__ = { 504 | "_edit_use_anchors_": false 505 | } 506 | 507 | [node name="Settings" type="Control" parent="Popup"] 508 | visible = false 509 | margin_right = 800.0 510 | margin_bottom = 360.0 511 | script = ExtResource( 19 ) 512 | __meta__ = { 513 | "_edit_use_anchors_": false 514 | } 515 | 516 | [node name="Panel" type="Panel" parent="Popup/Settings"] 517 | margin_right = 800.0 518 | margin_bottom = 360.0 519 | theme = ExtResource( 15 ) 520 | __meta__ = { 521 | "_edit_use_anchors_": false 522 | } 523 | 524 | [node name="Margin" type="MarginContainer" parent="Popup/Settings"] 525 | margin_right = 800.0 526 | margin_bottom = 360.0 527 | custom_constants/margin_right = 12 528 | custom_constants/margin_top = 12 529 | custom_constants/margin_left = 12 530 | custom_constants/margin_bottom = 12 531 | __meta__ = { 532 | "_edit_use_anchors_": false 533 | } 534 | 535 | [node name="VBox" type="VBoxContainer" parent="Popup/Settings/Margin"] 536 | margin_left = 12.0 537 | margin_top = 12.0 538 | margin_right = 788.0 539 | margin_bottom = 348.0 540 | 541 | [node name="Title" type="Label" parent="Popup/Settings/Margin/VBox"] 542 | margin_right = 776.0 543 | margin_bottom = 39.0 544 | custom_fonts/font = ExtResource( 17 ) 545 | text = "Settings" 546 | 547 | [node name="HSeparator" type="HSeparator" parent="Popup/Settings/Margin/VBox"] 548 | modulate = Color( 1, 1, 1, 0.392157 ) 549 | margin_top = 47.0 550 | margin_right = 776.0 551 | margin_bottom = 55.0 552 | 553 | [node name="Body" type="HBoxContainer" parent="Popup/Settings/Margin/VBox"] 554 | margin_top = 63.0 555 | margin_right = 776.0 556 | margin_bottom = 291.0 557 | size_flags_horizontal = 3 558 | size_flags_vertical = 3 559 | custom_constants/separation = 12 560 | 561 | [node name="Left" type="VBoxContainer" parent="Popup/Settings/Margin/VBox/Body"] 562 | margin_right = 160.0 563 | margin_bottom = 228.0 564 | rect_min_size = Vector2( 160, 0 ) 565 | size_flags_vertical = 3 566 | 567 | [node name="ButGeneral" type="Button" parent="Popup/Settings/Margin/VBox/Body/Left"] 568 | margin_right = 160.0 569 | margin_bottom = 25.0 570 | theme = ExtResource( 14 ) 571 | text = "General" 572 | align = 0 573 | 574 | [node name="ButBG" type="Button" parent="Popup/Settings/Margin/VBox/Body/Left"] 575 | margin_top = 33.0 576 | margin_right = 160.0 577 | margin_bottom = 58.0 578 | theme = ExtResource( 14 ) 579 | text = "Background" 580 | align = 0 581 | 582 | [node name="Right" type="MarginContainer" parent="Popup/Settings/Margin/VBox/Body"] 583 | margin_left = 172.0 584 | margin_right = 776.0 585 | margin_bottom = 228.0 586 | rect_min_size = Vector2( 160, 0 ) 587 | size_flags_horizontal = 3 588 | size_flags_vertical = 3 589 | 590 | [node name="General" type="GridContainer" parent="Popup/Settings/Margin/VBox/Body/Right"] 591 | visible = false 592 | margin_right = 604.0 593 | margin_bottom = 228.0 594 | custom_constants/vseparation = -8 595 | columns = 2 596 | 597 | [node name="Autoload" type="Label" parent="Popup/Settings/Margin/VBox/Body/Right/General"] 598 | margin_top = 13.0 599 | margin_right = 266.0 600 | margin_bottom = 35.0 601 | custom_fonts/font = ExtResource( 18 ) 602 | text = "autoload last read series on startup" 603 | 604 | [node name="CheckAuto" type="CheckBox" parent="Popup/Settings/Margin/VBox/Body/Right/General"] 605 | margin_left = 274.0 606 | margin_right = 322.0 607 | margin_bottom = 48.0 608 | 609 | [node name="Full" type="Label" parent="Popup/Settings/Margin/VBox/Body/Right/General"] 610 | margin_top = 53.0 611 | margin_right = 266.0 612 | margin_bottom = 75.0 613 | custom_fonts/font = ExtResource( 18 ) 614 | text = "fullscreen mode" 615 | __meta__ = { 616 | "_edit_use_anchors_": false 617 | } 618 | 619 | [node name="CheckFull" type="CheckBox" parent="Popup/Settings/Margin/VBox/Body/Right/General"] 620 | margin_left = 274.0 621 | margin_top = 40.0 622 | margin_right = 322.0 623 | margin_bottom = 88.0 624 | 625 | [node name="Debug" type="Label" parent="Popup/Settings/Margin/VBox/Body/Right/General"] 626 | margin_top = 93.0 627 | margin_right = 266.0 628 | margin_bottom = 115.0 629 | custom_fonts/font = ExtResource( 18 ) 630 | text = "debug overlay" 631 | __meta__ = { 632 | "_edit_use_anchors_": false 633 | } 634 | 635 | [node name="CheckDebug" type="CheckBox" parent="Popup/Settings/Margin/VBox/Body/Right/General"] 636 | margin_left = 274.0 637 | margin_top = 80.0 638 | margin_right = 322.0 639 | margin_bottom = 128.0 640 | 641 | [node name="Background" type="GridContainer" parent="Popup/Settings/Margin/VBox/Body/Right"] 642 | visible = false 643 | margin_right = 604.0 644 | margin_bottom = 228.0 645 | columns = 3 646 | 647 | [node name="H" type="Label" parent="Popup/Settings/Margin/VBox/Body/Right/Background"] 648 | margin_top = 5.0 649 | margin_right = 83.0 650 | margin_bottom = 27.0 651 | custom_fonts/font = ExtResource( 18 ) 652 | text = "hue:" 653 | __meta__ = { 654 | "_edit_use_anchors_": false 655 | } 656 | 657 | [node name="H2" type="HSlider" parent="Popup/Settings/Margin/VBox/Body/Right/Background"] 658 | margin_left = 91.0 659 | margin_right = 411.0 660 | margin_bottom = 32.0 661 | rect_min_size = Vector2( 320, 0 ) 662 | max_value = 1.0 663 | step = 0.01 664 | 665 | [node name="H3" type="Label" parent="Popup/Settings/Margin/VBox/Body/Right/Background"] 666 | margin_left = 419.0 667 | margin_top = 5.0 668 | margin_right = 429.0 669 | margin_bottom = 27.0 670 | custom_fonts/font = ExtResource( 18 ) 671 | text = "0" 672 | __meta__ = { 673 | "_edit_use_anchors_": false 674 | } 675 | 676 | [node name="S" type="Label" parent="Popup/Settings/Margin/VBox/Body/Right/Background"] 677 | margin_top = 45.0 678 | margin_right = 83.0 679 | margin_bottom = 67.0 680 | custom_fonts/font = ExtResource( 18 ) 681 | text = "saturation:" 682 | __meta__ = { 683 | "_edit_use_anchors_": false 684 | } 685 | 686 | [node name="S2" type="HSlider" parent="Popup/Settings/Margin/VBox/Body/Right/Background"] 687 | margin_left = 91.0 688 | margin_top = 40.0 689 | margin_right = 411.0 690 | margin_bottom = 72.0 691 | rect_min_size = Vector2( 320, 0 ) 692 | max_value = 1.0 693 | step = 0.01 694 | 695 | [node name="S3" type="Label" parent="Popup/Settings/Margin/VBox/Body/Right/Background"] 696 | margin_left = 419.0 697 | margin_top = 45.0 698 | margin_right = 429.0 699 | margin_bottom = 67.0 700 | custom_fonts/font = ExtResource( 18 ) 701 | text = "0" 702 | __meta__ = { 703 | "_edit_use_anchors_": false 704 | } 705 | 706 | [node name="V" type="Label" parent="Popup/Settings/Margin/VBox/Body/Right/Background"] 707 | margin_top = 85.0 708 | margin_right = 83.0 709 | margin_bottom = 107.0 710 | custom_fonts/font = ExtResource( 18 ) 711 | text = "value:" 712 | __meta__ = { 713 | "_edit_use_anchors_": false 714 | } 715 | 716 | [node name="V2" type="HSlider" parent="Popup/Settings/Margin/VBox/Body/Right/Background"] 717 | margin_left = 91.0 718 | margin_top = 80.0 719 | margin_right = 411.0 720 | margin_bottom = 112.0 721 | rect_min_size = Vector2( 320, 0 ) 722 | max_value = 1.0 723 | step = 0.01 724 | 725 | [node name="V3" type="Label" parent="Popup/Settings/Margin/VBox/Body/Right/Background"] 726 | margin_left = 419.0 727 | margin_top = 85.0 728 | margin_right = 429.0 729 | margin_bottom = 107.0 730 | custom_fonts/font = ExtResource( 18 ) 731 | text = "0" 732 | __meta__ = { 733 | "_edit_use_anchors_": false 734 | } 735 | 736 | [node name="Accept" type="HBoxContainer" parent="Popup/Settings/Margin/VBox"] 737 | margin_top = 299.0 738 | margin_right = 776.0 739 | margin_bottom = 336.0 740 | alignment = 2 741 | 742 | [node name="ButClose" type="Button" parent="Popup/Settings/Margin/VBox/Accept"] 743 | margin_left = 703.0 744 | margin_right = 776.0 745 | margin_bottom = 37.0 746 | theme = ExtResource( 15 ) 747 | custom_fonts/font = ExtResource( 9 ) 748 | text = "Close" 749 | 750 | [node name="Floater" type="Panel" parent="Popup/Settings"] 751 | visible = false 752 | margin_right = 8.0 753 | margin_bottom = 25.0 754 | rect_min_size = Vector2( 8, 25 ) 755 | custom_styles/panel = SubResource( 1 ) 756 | __meta__ = { 757 | "_edit_use_anchors_": false 758 | } 759 | 760 | [node name="About" type="PanelContainer" parent="Popup"] 761 | visible = false 762 | margin_right = 640.0 763 | margin_bottom = 511.0 764 | custom_styles/panel = ExtResource( 23 ) 765 | script = ExtResource( 26 ) 766 | __meta__ = { 767 | "_edit_use_anchors_": false 768 | } 769 | 770 | [node name="MarginContainer" type="MarginContainer" parent="Popup/About"] 771 | margin_right = 640.0 772 | margin_bottom = 511.0 773 | custom_constants/margin_right = 4 774 | custom_constants/margin_top = 4 775 | custom_constants/margin_left = 4 776 | custom_constants/margin_bottom = 4 777 | 778 | [node name="VBox" type="VBoxContainer" parent="Popup/About/MarginContainer"] 779 | margin_left = 4.0 780 | margin_top = 4.0 781 | margin_right = 636.0 782 | margin_bottom = 507.0 783 | 784 | [node name="Top" type="VBoxContainer" parent="Popup/About/MarginContainer/VBox"] 785 | margin_right = 632.0 786 | margin_bottom = 55.0 787 | custom_constants/separation = -6 788 | 789 | [node name="About" type="Label" parent="Popup/About/MarginContainer/VBox/Top"] 790 | margin_right = 632.0 791 | margin_bottom = 39.0 792 | theme = ExtResource( 15 ) 793 | custom_fonts/font = ExtResource( 17 ) 794 | text = "About" 795 | align = 1 796 | 797 | [node name="Version" type="Label" parent="Popup/About/MarginContainer/VBox/Top"] 798 | margin_top = 33.0 799 | margin_right = 632.0 800 | margin_bottom = 55.0 801 | theme = ExtResource( 15 ) 802 | custom_fonts/font = ExtResource( 18 ) 803 | text = "v. 1.2-Bellicose" 804 | align = 1 805 | 806 | [node name="HSeparator" type="HSeparator" parent="Popup/About/MarginContainer/VBox"] 807 | visible = false 808 | margin_top = 56.0 809 | margin_right = 532.0 810 | margin_bottom = 64.0 811 | 812 | [node name="Body" type="VBoxContainer" parent="Popup/About/MarginContainer/VBox"] 813 | margin_top = 63.0 814 | margin_right = 632.0 815 | margin_bottom = 458.0 816 | size_flags_horizontal = 3 817 | size_flags_vertical = 3 818 | 819 | [node name="RichTextLabel" type="RichTextLabel" parent="Popup/About/MarginContainer/VBox/Body"] 820 | margin_right = 632.0 821 | margin_bottom = 138.0 822 | rect_min_size = Vector2( 0, 40 ) 823 | size_flags_horizontal = 3 824 | size_flags_vertical = 3 825 | custom_fonts/normal_font = ExtResource( 9 ) 826 | text = "go·reader is a minimalistic comic and manga reading application designed using Godot game engine. 827 | 828 | Created by Sirosky. A big thanks to willnationsdev for his invaluable GDScript help throughout the project." 829 | scroll_active = false 830 | 831 | [node name="LabelDefault" type="Label" parent="Popup/About/MarginContainer/VBox/Body"] 832 | margin_top = 146.0 833 | margin_right = 632.0 834 | margin_bottom = 176.0 835 | custom_fonts/font = ExtResource( 13 ) 836 | text = "Default Controls" 837 | align = 1 838 | valign = 1 839 | 840 | [node name="VBoxContainer" type="VBoxContainer" parent="Popup/About/MarginContainer/VBox/Body"] 841 | margin_top = 184.0 842 | margin_right = 632.0 843 | margin_bottom = 395.0 844 | size_flags_vertical = 3 845 | 846 | [node name="Label" type="Label" parent="Popup/About/MarginContainer/VBox/Body/VBoxContainer"] 847 | margin_right = 632.0 848 | margin_bottom = 211.0 849 | custom_fonts/font = ExtResource( 9 ) 850 | text = "Pan camera: WASD, left mouse button, or arrow keys 851 | Scroll camera: Scroll wheel 852 | Zoom camera: Ctrl + scroll wheel 853 | Load comic or manga: L 854 | Fullscreen F 855 | Jump to page: J 856 | Exit: Esc" 857 | 858 | [node name="GridContainer" type="GridContainer" parent="Popup/About/MarginContainer/VBox/Body"] 859 | visible = false 860 | margin_top = 201.0 861 | margin_right = 632.0 862 | margin_bottom = 356.0 863 | size_flags_horizontal = 3 864 | size_flags_vertical = 3 865 | custom_constants/hseparation = 8 866 | columns = 2 867 | 868 | [node name="Label" type="Label" parent="Popup/About/MarginContainer/VBox/Body/GridContainer"] 869 | margin_right = 234.0 870 | margin_bottom = 25.0 871 | custom_fonts/font = ExtResource( 9 ) 872 | text = "Pan Camera: WASD | LMB" 873 | align = 1 874 | valign = 1 875 | 876 | [node name="Label7" type="Label" parent="Popup/About/MarginContainer/VBox/Body/GridContainer"] 877 | margin_left = 242.0 878 | margin_right = 484.0 879 | margin_bottom = 25.0 880 | custom_fonts/font = ExtResource( 9 ) 881 | text = "Scroll Camera: WASD | LMB" 882 | align = 1 883 | valign = 1 884 | 885 | [node name="Label2" type="Label" parent="Popup/About/MarginContainer/VBox/Body/GridContainer"] 886 | margin_top = 33.0 887 | margin_right = 234.0 888 | margin_bottom = 58.0 889 | custom_fonts/font = ExtResource( 9 ) 890 | text = "Zoom Camera: Ctrl + Scroll" 891 | align = 1 892 | valign = 1 893 | 894 | [node name="Label3" type="Label" parent="Popup/About/MarginContainer/VBox/Body/GridContainer"] 895 | margin_left = 242.0 896 | margin_top = 33.0 897 | margin_right = 484.0 898 | margin_bottom = 58.0 899 | custom_fonts/font = ExtResource( 9 ) 900 | text = "Fullscreen: F" 901 | align = 1 902 | valign = 1 903 | 904 | [node name="Label4" type="Label" parent="Popup/About/MarginContainer/VBox/Body/GridContainer"] 905 | margin_top = 66.0 906 | margin_right = 234.0 907 | margin_bottom = 91.0 908 | custom_fonts/font = ExtResource( 9 ) 909 | text = "Debug overlay: E" 910 | align = 1 911 | valign = 1 912 | 913 | [node name="Label5" type="Label" parent="Popup/About/MarginContainer/VBox/Body/GridContainer"] 914 | margin_left = 242.0 915 | margin_top = 66.0 916 | margin_right = 484.0 917 | margin_bottom = 91.0 918 | custom_fonts/font = ExtResource( 9 ) 919 | text = "Jump to page: J" 920 | align = 1 921 | valign = 1 922 | 923 | [node name="Label6" type="Label" parent="Popup/About/MarginContainer/VBox/Body/GridContainer"] 924 | margin_top = 99.0 925 | margin_right = 234.0 926 | margin_bottom = 124.0 927 | custom_fonts/font = ExtResource( 9 ) 928 | text = "Load a comic or manga: L" 929 | align = 1 930 | valign = 1 931 | 932 | [node name="ButClose" type="Button" parent="Popup/About/MarginContainer/VBox"] 933 | margin_left = 282.0 934 | margin_top = 466.0 935 | margin_right = 350.0 936 | margin_bottom = 503.0 937 | size_flags_horizontal = 4 938 | size_flags_vertical = 4 939 | theme = ExtResource( 15 ) 940 | custom_fonts/font = ExtResource( 9 ) 941 | text = "close" 942 | 943 | [node name="Welcome" type="PanelContainer" parent="Popup"] 944 | visible = false 945 | margin_right = 800.0 946 | margin_bottom = 480.0 947 | custom_styles/panel = ExtResource( 23 ) 948 | script = ExtResource( 26 ) 949 | __meta__ = { 950 | "_edit_use_anchors_": false 951 | } 952 | 953 | [node name="MarginContainer" type="MarginContainer" parent="Popup/Welcome"] 954 | margin_right = 800.0 955 | margin_bottom = 593.0 956 | custom_constants/margin_right = 4 957 | custom_constants/margin_top = 4 958 | custom_constants/margin_left = 4 959 | custom_constants/margin_bottom = 4 960 | 961 | [node name="VBox" type="VBoxContainer" parent="Popup/Welcome/MarginContainer"] 962 | margin_left = 4.0 963 | margin_top = 4.0 964 | margin_right = 796.0 965 | margin_bottom = 589.0 966 | 967 | [node name="Top" type="VBoxContainer" parent="Popup/Welcome/MarginContainer/VBox"] 968 | margin_right = 792.0 969 | margin_bottom = 55.0 970 | custom_constants/separation = -6 971 | 972 | [node name="About" type="Label" parent="Popup/Welcome/MarginContainer/VBox/Top"] 973 | margin_right = 792.0 974 | margin_bottom = 39.0 975 | theme = ExtResource( 15 ) 976 | custom_fonts/font = ExtResource( 17 ) 977 | text = "Welcome to go·reader!" 978 | align = 1 979 | 980 | [node name="Version" type="Label" parent="Popup/Welcome/MarginContainer/VBox/Top"] 981 | margin_top = 33.0 982 | margin_right = 792.0 983 | margin_bottom = 55.0 984 | theme = ExtResource( 15 ) 985 | custom_fonts/font = ExtResource( 18 ) 986 | text = "let's get you started" 987 | align = 1 988 | 989 | [node name="HSeparator" type="HSeparator" parent="Popup/Welcome/MarginContainer/VBox"] 990 | visible = false 991 | margin_top = 56.0 992 | margin_right = 532.0 993 | margin_bottom = 64.0 994 | 995 | [node name="Body" type="VBoxContainer" parent="Popup/Welcome/MarginContainer/VBox"] 996 | margin_top = 63.0 997 | margin_right = 792.0 998 | margin_bottom = 540.0 999 | size_flags_horizontal = 3 1000 | size_flags_vertical = 3 1001 | 1002 | [node name="RichTextLabel" type="RichTextLabel" parent="Popup/Welcome/MarginContainer/VBox/Body"] 1003 | margin_right = 792.0 1004 | margin_bottom = 220.0 1005 | rect_min_size = Vector2( 0, 220 ) 1006 | size_flags_horizontal = 3 1007 | size_flags_vertical = 3 1008 | custom_fonts/normal_font = ExtResource( 9 ) 1009 | bbcode_enabled = true 1010 | text = "go·reader allows you to read comics & manga that have been imported to the Library. Once you have imported a series into your Library, simply right click anywhere, and select Load. 1011 | 1012 | If your files are in CBZ, CBR, ZIP, etc.: 1) right click 2) select \"Import eBook folder to Library\" 3) select directory with files. 1013 | 1014 | If your files are loose images, ie individual JPGs or PNGs: 1) right click 2) select \"Import images folder to Library\" 3) select directory with files." 1015 | scroll_active = false 1016 | 1017 | [node name="LabelDefault" type="Label" parent="Popup/Welcome/MarginContainer/VBox/Body"] 1018 | margin_top = 228.0 1019 | margin_right = 792.0 1020 | margin_bottom = 258.0 1021 | custom_fonts/font = ExtResource( 13 ) 1022 | text = "Default Controls" 1023 | align = 1 1024 | valign = 1 1025 | 1026 | [node name="GridContainer" type="GridContainer" parent="Popup/Welcome/MarginContainer/VBox/Body"] 1027 | visible = false 1028 | margin_top = 266.0 1029 | margin_right = 792.0 1030 | margin_bottom = 364.0 1031 | size_flags_horizontal = 3 1032 | size_flags_vertical = 3 1033 | custom_constants/hseparation = 8 1034 | columns = 3 1035 | 1036 | [node name="Label" type="Label" parent="Popup/Welcome/MarginContainer/VBox/Body/GridContainer"] 1037 | margin_right = 227.0 1038 | margin_bottom = 25.0 1039 | custom_fonts/font = ExtResource( 9 ) 1040 | text = "Pan Camera: WASD | LMB" 1041 | align = 1 1042 | valign = 1 1043 | 1044 | [node name="Label7" type="Label" parent="Popup/Welcome/MarginContainer/VBox/Body/GridContainer"] 1045 | margin_left = 235.0 1046 | margin_right = 467.0 1047 | margin_bottom = 25.0 1048 | custom_fonts/font = ExtResource( 9 ) 1049 | text = "Scroll Camera: Scroll wheel" 1050 | align = 1 1051 | valign = 1 1052 | 1053 | [node name="Label2" type="Label" parent="Popup/Welcome/MarginContainer/VBox/Body/GridContainer"] 1054 | margin_left = 475.0 1055 | margin_right = 709.0 1056 | margin_bottom = 25.0 1057 | custom_fonts/font = ExtResource( 9 ) 1058 | text = "Zoom Camera: Ctrl + Scroll" 1059 | align = 1 1060 | valign = 1 1061 | 1062 | [node name="Label3" type="Label" parent="Popup/Welcome/MarginContainer/VBox/Body/GridContainer"] 1063 | margin_top = 33.0 1064 | margin_right = 227.0 1065 | margin_bottom = 58.0 1066 | custom_fonts/font = ExtResource( 9 ) 1067 | text = "Fullscreen: F" 1068 | align = 1 1069 | valign = 1 1070 | 1071 | [node name="Label4" type="Label" parent="Popup/Welcome/MarginContainer/VBox/Body/GridContainer"] 1072 | margin_left = 235.0 1073 | margin_top = 33.0 1074 | margin_right = 467.0 1075 | margin_bottom = 58.0 1076 | custom_fonts/font = ExtResource( 9 ) 1077 | text = "Debug overlay: E" 1078 | align = 1 1079 | valign = 1 1080 | 1081 | [node name="Label5" type="Label" parent="Popup/Welcome/MarginContainer/VBox/Body/GridContainer"] 1082 | margin_left = 475.0 1083 | margin_top = 33.0 1084 | margin_right = 709.0 1085 | margin_bottom = 58.0 1086 | custom_fonts/font = ExtResource( 9 ) 1087 | text = "Jump to page: J" 1088 | align = 1 1089 | valign = 1 1090 | 1091 | [node name="Label6" type="Label" parent="Popup/Welcome/MarginContainer/VBox/Body/GridContainer"] 1092 | margin_top = 66.0 1093 | margin_right = 227.0 1094 | margin_bottom = 91.0 1095 | custom_fonts/font = ExtResource( 9 ) 1096 | text = "Load a comic or manga: L" 1097 | align = 1 1098 | valign = 1 1099 | 1100 | [node name="Label" type="Label" parent="Popup/Welcome/MarginContainer/VBox/Body"] 1101 | margin_top = 266.0 1102 | margin_right = 792.0 1103 | margin_bottom = 477.0 1104 | custom_fonts/font = ExtResource( 9 ) 1105 | text = "Pan camera: WASD, left mouse button, or arrow keys 1106 | Scroll camera: Scroll wheel 1107 | Zoom camera: Ctrl + scroll wheel 1108 | Load comic or manga: L 1109 | Fullscreen F 1110 | Jump to page: J 1111 | Exit: Esc" 1112 | 1113 | [node name="ButClose" type="Button" parent="Popup/Welcome/MarginContainer/VBox"] 1114 | margin_left = 362.0 1115 | margin_top = 548.0 1116 | margin_right = 430.0 1117 | margin_bottom = 585.0 1118 | size_flags_horizontal = 4 1119 | size_flags_vertical = 4 1120 | theme = ExtResource( 15 ) 1121 | custom_fonts/font = ExtResource( 9 ) 1122 | text = "close" 1123 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ![](https://i.imgur.com/x6YjwNe.png) 2 | 3 | go·reader is a minimalistic comic & manga reader which provides a seamless and buttery smooth reading experience. With [go·reader's infinite scroll](https://i.imgur.com/Xdb2Fgc.mp4), read through hundreds (or thousands) of pages in a single sitting-- without any loading screens or having to load the next file! And if you don't finish the 40 volumes of *Berserk* in a single sitting, go·reader will resume where you left off when you open the app again. 4 | 5 | go·reader is powered by Godot game engine. In fact, that's why it's called go·reader. go(dot)reader. Heh. 6 | 7 | -------------------------------------- 8 | 9 | ## Primary Features 10 | 11 | - Infinite scroll for seamless reading 12 | - Support for the major comic/ manga file types-- CBZ, CBR, ZIP, RAR, etc. 13 | - Support for comic/ manga in loose image form-- PNG, JPEG, GIF, etc 14 | - The ability to jump from page 0 to page 420 of *Berserk* instantly 15 | - An easy-to-use interface that allows you to focus on the comic or manga 16 | 17 | ------------------------ 18 | 19 | ## Quick Start 20 | 21 | 1. Grab the latest version from the [releases page](https://github.com/Sirosky/go-reader/releases). 22 | 2. Unzip it into the directory of your choice. 23 | 3. Right click anywhere to import the folder containing the eBooks (CBZ, CBR, ZIP etc). A good idea would be to keep all the chapters of a series inside a single folder, and select that folder for importing. Due to limitations of Godot game engine, go·reader can only read a series after you import it. If you have issues with this step, take a look at the full guide below. 24 | 4. Right click or press L to load the series you just imported. 25 | 5. Start reading! 26 | 27 | --------------------------- 28 | 29 | ## Screenshots 30 | 31 | ![](https://i.imgur.com/Qh40uVO.png) 32 | 33 | ![](https://i.imgur.com/55xudZJ.png) 34 | 35 | ------------------------ 36 | 37 | ## Philosophy 38 | 39 | go·reader's sole purpose is to deliver a smooth reading experience-- that is to do one thing, and do it well. Thus it is not intended to be a replacement for the likes of Calibre or YACReader. I came up with the idea of go·reader after being mildly inconvenienced by how CDisplayEx handled loading-- it took a few extra seconds more than I would've liked. So I spent dozens of hours programming go·reader. Yes, I'm that petty. 40 | 41 | ----------- 42 | 43 | ## Full Guide 44 | 45 | ### Get Started 46 | 47 | ![](https://i.imgur.com/GCGs5BH.png) 48 | 49 | When you first launch the app, this menu should appear after the initial welcome popup. 50 | 51 | 1. **load from library**- select a directory, and it'll load the items you've imported into that directory. 52 | 2. **import ebook**- if your comics or manga are in CBZ, CBR, RAR, ZIP, or some other zipped-up format, this is the option to use. The app will prompt you for the *directory* containing the eBooks. Enter that directory. Then the app will prompt you for where in the Library you wish to import the eBooks. Select a folder and the import process will begin. go·reader will automatically bulk import all the eBooks located in the source directory. 53 | 3. **import to library**- use this option if your comic is in loose JPG, PNG, GIF etc. Essentially this just means a bunch of images inside a folder. Otherwise, the process is the same as the import ebook command 54 | 4. **change settings**- allows you to change the basic settings of go·reader. There aren't many options for now, but I'll work more in with due time. 55 | 5. **about**- just some basic information regarding go·reader. Also has the keyboard shortcuts. 56 | 57 | ### Context Menu 58 | 59 | ![](https://i.imgur.com/VEh6nUm.png) 60 | 61 | This is the context menu. You can bring it up any time by simply right clicking. Most of the options here are self-explanatory or covered above. So we'll just discuss the new options present. 62 | 63 | 1. **Open Library in Windows**- this will open the folder where the Library is located in Windows Explorer. Useful for manually transferring files or managing your imported files. 64 | 2. **Jump to page**- this allows you to jump to a specific page that you have loaded. Takes any value between 0 to the max page count. 65 | 66 | ### Manually Importing 67 | 68 | In the scenario where the import fails for whatever reason, you can still manually import your files. The process is very straightforward. 69 | 70 | 1. Right click in go·reader and select "Open Library in Windows" to open the library folder in Windows Explorer. 71 | 2. Copy the folder containing your eBook or loose images into the library folder. 72 | 3. If you copied over eBooks, use a program such as 7zip and extract the contents. 73 | 4. You should now be able to load your comic or manga with go·reader! 74 | 75 | ### **FAQ** 76 | 77 | 1. **Can I change the location of the library?** Unfortunately not. This is a limitation set by Godot. Similarly comics and manga must first be imported before they can be read. 78 | 2. **Is there/ will there be support for double-page mode?** No. There are several reasons for this: 1) I need a looooong break from working on the infinite scroll code, 2) CDisplayEx supports double-page mode and does a pretty good job of it already, and 3) double page mode isn't as suitable for infinite scroll. 79 | 3. **Can I use this on Mac or Linux?** go·reader is designed for Windows only. However you are free to compile the project using Godot on your Mac or Linux device. It *should* work for the most part. However, you will likely need to import manually. 80 | 4. **Is there/ will there be support for PDFs?** No. PDFs are a completely different beast compared to CBZs/ CBRs/ other typical comic and manga formats. But if anyone knows of a portable, command line software that can extract PDF pages as images and also allows for redistribution, do let me know. 81 | 5. **Screentones blur when I scroll, making it uncomfortable to read.** Make sure your monitor refresh rate is set to at least 60hz-- but the higher the smoother it will be. 82 | 83 | ---------- 84 | 85 | ## Credit 86 | 87 | 1. A big thanks to [willnationsdev](https://gist.github.com/willnationsdev) for putting up with my incessant GDScript questions during the odd hours of the day (and night). 88 | 2. Apple aka [whietfegeet](https://www.reddit.com/user/whietfegeet) for serving as my valued beta tester and guinea pig. 89 | 3. The creators and contributors of [Godot game engine](https://godotengine.org/) for creating this superb platform. 90 | 4. The creators and contributors of [7-zip](https://www.7-zip.org/), which does all the heavy lifting for go·reader's eBook importation code. 91 | -------------------------------------------------------------------------------- /core/SourceLoader.gd: -------------------------------------------------------------------------------- 1 | extends Node 2 | 3 | 4 | var file_search = FileSearch.new() #Launch file search class 5 | var Dir = Directory.new() 6 | var filter_regex = "(.jpg|.png|.jpeg|.gif|.bmp)" 7 | var filter_regex_zip = "(.zip|.rar|.7z|.gzip|.cbr|.cbz|.tar)" 8 | var tex_sorted = [] 9 | var importing_zips = [] #Paths of zips being imported 10 | var importing_complete = -1 11 | 12 | onready var Tex = get_node("/root/Main/Tex") 13 | onready var Main = get_node("/root/Main") 14 | onready var Streamer = get_node("../Streamer") 15 | onready var UI = get_node("/root/Main/UI") 16 | onready var Messenger = get_node("/root/Main/UI/Messenger") 17 | 18 | var thread = Thread.new() 19 | 20 | func _ready(): 21 | pass 22 | 23 | func source_load(dir): #Loads and sorts all the source images. Page = page to start on 24 | #dir = str("C:/" + dir) For some reason, the result from FileDiag doesn't include the Drive 25 | # print(dir) 26 | Main.cur_dir = dir 27 | 28 | var search 29 | 30 | search = file_search.search_regex_full_path(filter_regex, dir, 1) 31 | if search.size() > 0: 32 | var keys = search.keys() 33 | keys.sort() 34 | tex_sorted = keys #Sorted in order 35 | 36 | var start = 0 37 | if global.settings["History"].has(Main.cur_dir): 38 | start = global.settings["History"][Main.cur_dir] 39 | 40 | 41 | if start == 0: 42 | Streamer.tex_thread_start(0) 43 | Streamer.page_first_load = 1 44 | else: 45 | Streamer.tex_jump(start) 46 | 47 | global.Mes.message_send("load complete") 48 | 49 | #---------- IMPORT EBOOKS 50 | func source_import_zip_start(source, target, first_run): 51 | #--- FIRST RUN 52 | if first_run == 1: 53 | 54 | target = str(target + "/" + source.get_file()) 55 | source = ProjectSettings.globalize_path(source) 56 | 57 | if !Dir.dir_exists(target): #Create a new folder for the base library 58 | Dir.make_dir(target) 59 | 60 | #Find zips 61 | var search = file_search.search_regex_full_path(filter_regex_zip, source, 1) 62 | if search.size()>0: 63 | importing_zips = search.keys() 64 | 65 | if !thread.is_active(): 66 | UI.ProgressBar_toggle() 67 | UI.ProgressBar.max_value = importing_zips.size() 68 | thread.start( self, "source_import_zip_load", [importing_zips, target]) 69 | else: 70 | print("Can't start import. Thread occupied.") 71 | #--- SECOND RUN OR MORE 72 | else: 73 | if !thread.is_active(): 74 | thread.start( self, "source_import_zip_load", [importing_zips, target]) 75 | 76 | func source_import_zip_load(arr): #importing_zips, target 77 | var zip_path = str(OS.get_executable_path().get_base_dir() + "\\7z\\7z.exe") #This probably won't work in editor mode 78 | 79 | var out_path = ProjectSettings.globalize_path(str(arr[1] + "/" + importing_zips[0].get_file())) 80 | # out_path = out_path.rstrip("." + out_path.get_extension()) 81 | out_path = ProjectSettings.globalize_path(str(arr[1])) 82 | # print(out_path) 83 | 84 | OS.execute(zip_path, ["x", importing_zips[0], "-r", "-y", "-o" + str(out_path)], 1, ["complete"]) 85 | call_deferred("source_import_zip_finished", arr) 86 | 87 | func source_import_zip_finished(arr): 88 | thread.wait_to_finish() 89 | 90 | importing_zips.remove(0) 91 | 92 | if importing_zips.size() > 0: #We still have more, start allll over again 93 | UI.ProgressBar.value += 1 94 | print(UI.ProgressBar.value) 95 | source_import_zip_start(arr[0], arr[1], 0) 96 | else: #We are done 97 | UI.ProgressBar_toggle() #Done! Hide PB again 98 | Messenger.message_send("import complete") 99 | 100 | #---------- IMPORT LOOSE MANGA/COMICS 101 | func source_import_start(source, target): #Beginning of thread for importing 102 | # dir = str("C:" + dir) #For some reason, the result from FileDiag doesn't include the Drive 103 | target = str(target + "/" + source.get_file()) 104 | source = ProjectSettings.globalize_path(source) 105 | 106 | if !Dir.dir_exists(target): #Create a new folder for the base library 107 | Dir.make_dir(target) 108 | 109 | var folders = file_search.search_iterate_folder(source, 1) 110 | # print(source) 111 | # print(target) 112 | 113 | #Make directories for all subfolders 114 | for i in folders: 115 | var source_length = source.length() 116 | var remove_length = i.find(source) + source_length 117 | i.erase(0, remove_length) 118 | i = target + i 119 | if !Dir.dir_exists(i): 120 | Dir.make_dir(i) 121 | 122 | yield(get_tree().create_timer(1), "timeout") 123 | if !thread.is_active(): 124 | thread.start( self, "source_import_load", [source, target, folders]) 125 | UI.ProgressBar_toggle() 126 | else: 127 | print("Can't start import. Thread occupied.") 128 | 129 | 130 | func source_import_load(arr): #arr = [source, target, folders] 131 | var search = file_search.search_regex_full_path(filter_regex, arr[0], 1) 132 | if search.size()>0: 133 | #Visual progress 134 | UI.ProgressBar.max_value = search.size() - 1 135 | 136 | var keys = search.keys() 137 | 138 | for i in keys: #Put them into target 139 | var tar 140 | var source_length = arr[0].length() 141 | var remove_length = i.find(arr[0]) + source_length 142 | var base = i 143 | base.erase(0, remove_length) #Get subfolders 144 | tar = arr[1] + base #Create the full target directory 145 | 146 | # print("i: " + str(i)) 147 | # print("tar: " + str(tar)) 148 | 149 | Dir.copy(i, tar) 150 | UI.ProgressBar.value += 1 151 | 152 | call_deferred("source_import_finished", arr) 153 | 154 | func source_import_finished(arr): 155 | global.Mes.message_send("import complete") 156 | thread.wait_to_finish() 157 | UI.ProgressBar_toggle() #Done! Hide PB again 158 | -------------------------------------------------------------------------------- /core/Streamer.gd: -------------------------------------------------------------------------------- 1 | extends Node 2 | 3 | onready var Camera2D = get_node("/root/Main/Camera2D") 4 | onready var SourceLoader = get_node("../SourceLoader") 5 | onready var TexAll = get_node("/root/Main/TexAll") 6 | onready var MenuContext = get_node("/root/Main/Popup/MenuContext") 7 | onready var Main = get_node("/root/Main") 8 | onready var Core = get_node("/root/Main/Core") 9 | onready var UI = get_node("/root/Main/UI") 10 | var Tex = "res://core/Tex.tscn" 11 | 12 | #These share the same index 13 | var tex_obj = [] #objects 14 | var tex_path = [] #path to texture. 15 | var tex_coord = [] #y coordinate 16 | 17 | var page_max = 0 #Most recently loaded page. Pretty much irrelevant if there's a page jump. 18 | var page_cur = 0 #Current page we're looking at 19 | var page_buffer = 5 # How many extra pages to have loaded 20 | var page_buffer_unload = 10 #How many pages before we start unloading their textures. Should be greater than page_buffer 21 | var pages_tracking = [] #Current 22 | var pages_tracking_temp = [] 23 | var pages_loaded = [] #Current Tex that actually have textures loaded in them OR are about to be loaded 24 | var page_first_load = 0 #First time loading something a stream 25 | var tex_y_buffer = 24 #Space to leave between pages 26 | var just_jumped = 0 #Temporarily disables auto-loading new pages with page_new after a jump 27 | var jump_buffer_lesser = [] #Order of pages to load less than jumped page 28 | var jump_buffer_greater = [] #Order of pages to load greater than jumped page 29 | var jump_buffer_removed = [] #Pages that have been sent to processing 30 | 31 | #Threading 32 | var thread = [] 33 | var thread_status = [] #values = 1 for active, 0 for inactive 34 | var thread_queue = [] #value = index. Array of stuff the thread needs to load 35 | var thread_processing = [] #Array of indices 36 | 37 | func _ready(): 38 | Camera2D.connect("camera_moved", self, "_on_camera_moved") 39 | thread.append(Thread.new()) 40 | 41 | func _process(delta): 42 | #---- STREAMING LOGIC 43 | 44 | if just_jumped == 0 and tex_obj.size() > 0: 45 | 46 | #Check down 47 | var i = min(page_cur + 1, SourceLoader.tex_sorted.size() - 1) 48 | UI.Lab[8].text = str(i) 49 | if !thread_queue.has(i) and !thread_processing.has(i): 50 | while i <= page_cur + page_buffer: 51 | var skip = 0 #Stop iterating if we encounter an unloaded page 52 | 53 | if i <= tex_obj.size() -1 : 54 | if tex_obj[i] == Core and !pages_loaded.has(i) and !thread_processing.has(i): #If we jumped and this page had never been initiated 55 | tex_thread_start(i) #Properly load it now 56 | # print("page down Core: " + str(i)) 57 | skip = 1 58 | elif !pages_loaded.has(i) and !thread_processing.has(i): 59 | skip = 1 60 | # print("page down new: " + str(i)) 61 | tex_thread_start(i) 62 | 63 | i += 1 64 | # if skip ==0: 65 | # i += 1 66 | # else: 67 | # i = page_cur + page_buffer + 1 68 | 69 | #Check up 70 | if page_cur - page_buffer >= 0: #Don't drop below 0 71 | i = max(page_cur - 1, 0) 72 | 73 | while i >= page_cur - page_buffer: 74 | var skip = 0 #Stop iterating if we encounter an unloaded page 75 | 76 | if tex_obj[i] == Core: #If we jumped and this page had never been initiated 77 | tex_thread_start(i) #Properly load it now 78 | # print("page up: " + str(i)) 79 | skip = 1 80 | 81 | if skip ==0: 82 | i -= 1 83 | else: 84 | i = page_cur - page_buffer - 1 85 | 86 | #First load 87 | if page_max == 0 and page_first_load == 1: 88 | tex_thread_start(page_cur + 1) 89 | page_max = 1 90 | 91 | #Background loading 92 | #Check if thread has more work to do 93 | if thread_queue.size() > 0: 94 | 95 | thread_status = [] 96 | 97 | for i in range(thread.size()): 98 | thread_status.append(int(thread[i].is_active())) 99 | 100 | if thread_status.has(0): #Have at least one free thread 101 | # print("Starting from queue") 102 | tex_thread_start(thread_queue[0]) 103 | thread_queue.remove(0) #Remove from queue 104 | 105 | #---- POST BUFFER JUMP LOADING 106 | var remove = -1 107 | 108 | if just_jumped == 1: 109 | 110 | #Buffer prior to page 111 | for i in range(jump_buffer_lesser.size()): 112 | if thread_queue.has(jump_buffer_lesser[i]): 113 | remove = i 114 | # print("jump_buffer_lesser[i]: " + str(jump_buffer_lesser[i])) 115 | # print("Already processing lesser") 116 | break 117 | thread_queue.append(jump_buffer_lesser[i]) #Put in queue if it's not already there 118 | 119 | 120 | #Buffer after page 121 | remove = -1 122 | 123 | for i in range(jump_buffer_greater.size()): 124 | if thread_queue.has(jump_buffer_greater[i]): 125 | remove = i 126 | # print("jump_buffer_greater[i]: " + str(jump_buffer_greater[i])) 127 | # print("Already processing greater") 128 | break 129 | thread_queue.append(jump_buffer_greater[i]) #Put in queue if it's not already there 130 | 131 | #Exit just_jumped mode once we can 132 | if jump_buffer_greater.size() + jump_buffer_lesser.size() == 0 and jump_buffer_removed.size() > 1: 133 | just_jumped = 0 134 | # print("Exiting just_jumped mode") 135 | 136 | 137 | 138 | func _input(event): 139 | pass 140 | #Next page 141 | # if event is InputEventMouseButton and event.button_index == BUTTON_MIDDLE and event.pressed and not event.is_echo(): 142 | # if tex_obj[page_cur].texture == null: #Extra emergency loading 143 | # print("MMB emergency loading: " + str(page_cur)) 144 | # print(tex_obj[page_cur].texture) 145 | # tex_obj[page_cur].texture = null 146 | # tex_load(page_cur) 147 | 148 | func page_new(pg): #New page showed up 149 | pass 150 | 151 | func _on_camera_moved(): 152 | #Current page detection 153 | # pass 154 | if pages_tracking.size() > 0: 155 | 156 | while pages_tracking.has(null): 157 | pages_tracking.erase(null) 158 | 159 | var lowest_diff: float = 99999 160 | var result = 0 161 | for i in pages_tracking: #Check which page is closest to the center 162 | if i != null: 163 | var check_1 = float(abs(i.rect_position.y - Camera2D.position.y)) 164 | var check_2 = float(abs(i.rect_position.y + (i.rect_size.y) - Camera2D.position.y)) 165 | var res = min(check_1, check_2) 166 | 167 | if res < lowest_diff: 168 | lowest_diff = res 169 | result = i.page 170 | 171 | page_cur = result 172 | 173 | 174 | 175 | func tex_jump(page): #Used to jump to a specific page 176 | Main.reset() 177 | Camera2D.camera_limit_y1 = -9999999 178 | 179 | if page >= 0 and page <= SourceLoader.tex_sorted.size() - 1: 180 | var i = 0 181 | while i < page + 1: 182 | tex_obj.append(Core) 183 | tex_path.append("") 184 | tex_coord.append(-9999) 185 | i += 1 186 | page_cur = page 187 | just_jumped = 1 188 | tex_thread_start(page) 189 | 190 | #Load some buffer too 191 | yield(get_tree().create_timer(.5), "timeout") 192 | 193 | just_jumped = 1 194 | i = page - 1 195 | while i > page - 3: 196 | if i >= 0: 197 | # print(i) 198 | jump_buffer_lesser.append(i) 199 | # tex_thread_start(i) 200 | i -= 1 201 | 202 | i = page + 1 203 | while i < page + 3: 204 | if i <= SourceLoader.tex_sorted.size() - 1: 205 | jump_buffer_greater.append(i) 206 | # tex_thread_start(i) 207 | i += 1 208 | 209 | #Next stage is under _process 210 | 211 | 212 | #---------- THREADING 213 | 214 | func tex_thread_start(index): 215 | #Make sure this isn't already being processed 216 | if thread_processing.has(index): 217 | # print("A thread is already processing this page: " + str(index)) 218 | return 219 | 220 | thread_status = [] 221 | 222 | for i in range(thread.size()): 223 | thread_status.append(int(thread[i].is_active())) 224 | 225 | #Pick a thread if one is available. 226 | for i in range(thread_status.size()): 227 | if thread_status[i] == 0: #Not busy 228 | 229 | #Filter out stuff that is loaded 230 | if index <= tex_obj.size() - 1: 231 | if tex_obj[index] != Core: 232 | # print("canceled tex_obj[index]: " + str(tex_obj[index].texture)) 233 | return 234 | # print("thread selected: " + str(i)) 235 | print("thread start processing page: " + str(index)) 236 | # print(str(index) + " " + str(SourceLoader.tex_sorted[index])) 237 | #Start the thread 238 | thread[i].start( self, "tex_thread_load", [index, i]) 239 | thread_processing.append(index) 240 | pages_loaded.append(index) 241 | var loc = thread_queue.find(index) 242 | if loc != -1: 243 | thread_queue.remove(loc) 244 | return 245 | 246 | 247 | #No eligible threads? Add into queue. Thank you, come again 248 | if !thread_queue.has(index): 249 | thread_queue.append(index) 250 | # print(thread_queue) 251 | 252 | 253 | func tex_thread_load(arr): #value 0 = index, 1 = thread ID 254 | var image = Image.new() 255 | var err = image.load(SourceLoader.tex_sorted[arr[0]]) 256 | 257 | if err != OK: 258 | print("Error loading thumb- "+ str(err)) 259 | 260 | var image_w = image.get_width() 261 | var image_h = image.get_height() 262 | var texture = ImageTexture.new() 263 | 264 | texture.create_from_image(image,7) 265 | # print(texture) 266 | 267 | call_deferred("tex_thread_finish", arr) 268 | return texture 269 | 270 | func tex_thread_finish(arr): #This takes place on the main thread 271 | var texture = thread[arr[1]].wait_to_finish() 272 | 273 | #-------- CASE A- there has been no jump 274 | if !tex_obj.has(Core): 275 | page_max = tex_coord.size() - 1 #Check if a Tex for this page exists already 276 | 277 | if arr[0] >= page_max: #Loading a new page 278 | 279 | var t = global.scene_load(Tex, TexAll) 280 | t.texture = texture 281 | t.page = tex_coord.size() 282 | 283 | if tex_coord.size() == 0: #Completely new stream, page 0 284 | t.rect_position.y = 0 285 | t.rect_position.x = (texture.get_width()/2) * -1 286 | tex_coord.append(0) 287 | else: #Stream already exists 288 | t.rect_position.y = tex_obj[tex_coord.size()-1].rect_position.y + tex_obj[tex_coord.size()-1].rect_size.y + tex_y_buffer 289 | t.rect_position.x = (texture.get_width()/2) * -1 290 | tex_coord.append(t.rect_position.y) 291 | page_max = tex_coord.size() - 1 292 | 293 | tex_obj.append(t) 294 | tex_path.append(SourceLoader.tex_sorted[arr[0]]) 295 | else: #page already exists 296 | tex_obj[arr[0]].texture = texture 297 | tex_obj[arr[0]].rect_position.x = (texture.get_width()/2) * -1 298 | # print("loading old page " + str(arr[0])) 299 | 300 | #-------- CASE B- there has been a jump 301 | else: 302 | page_max = tex_coord.size() - 1 #Check if a Tex for this page exists already 303 | # print("jump loading") 304 | var tex_status = tex_obj_is_valid(arr[0]) 305 | 306 | if tex_status > 0: #New texture, or not propery initiated 307 | var t = global.scene_load(Tex, TexAll) 308 | t.texture = texture 309 | t.page = arr[0] 310 | # print("t.page: " + str(t.page)) 311 | 312 | 313 | #Figure out what Tex we should base our y coordinate on 314 | var tex_next = tex_obj_is_valid(arr[0] + 1) 315 | var tex_prev = tex_obj_is_valid(arr[0] - 1) 316 | 317 | # print("tex_next: " + str(arr[0] + 1)) 318 | # print("tex_prev: " + str(arr[0] + 1)) 319 | # print("tex_status: " + str(tex_status)) 320 | t.rect_position.y = -99999 321 | 322 | if tex_coord.size() - 1 == page_cur: #First load after jumping 323 | t.rect_position.y = 0 324 | if tex_next == 0: #scrolling up 325 | t.rect_position.y = tex_obj[arr[0] + 1].rect_position.y - t.rect_size.y - tex_y_buffer 326 | if tex_prev == 0: #scrolling down 327 | t.rect_position.y = tex_obj[arr[0] - 1].rect_position.y + tex_obj[arr[0] - 1].rect_size.y + tex_y_buffer 328 | 329 | t.rect_position.x = (texture.get_width()/2) * -1 330 | # print("y pos: " + str(t.rect_position.y)) 331 | 332 | page_max = tex_coord.size() - 1 333 | 334 | if t.rect_position.y == -99999: 335 | print("Position wrong: " + str(arr[0])) 336 | 337 | print("Finished pg: " + str(arr[0])) 338 | 339 | match tex_status: 340 | 1: 341 | tex_obj.append(t) 342 | tex_path.append(SourceLoader.tex_sorted[arr[0]]) 343 | tex_coord.append(t.rect_position.y) 344 | 2: 345 | tex_obj[arr[0]] = t 346 | tex_path[arr[0]] = SourceLoader.tex_sorted[arr[0]] 347 | tex_coord[arr[0]] = t.rect_position.y 348 | else: #Texture exists and is fully initiated 349 | tex_obj[arr[0]].texture = texture 350 | tex_obj[arr[0]].rect_position.x = (texture.get_width()/2) * -1 351 | print("Finished old pg: " + str(arr[0])) 352 | 353 | #Handle arrays 354 | var loc = thread_processing.find(arr[0]) 355 | if loc != -1: thread_processing.remove(loc) 356 | #print("thread_processing removed: " + str(loc)) 357 | loc = jump_buffer_greater.find(arr[0]) 358 | 359 | #If we just_jumped 360 | if loc != -1: 361 | # print("jump_buffer_greater: " + str(loc)) 362 | jump_buffer_greater.remove(loc) 363 | jump_buffer_removed.append(loc) 364 | loc = jump_buffer_lesser.find(arr[0]) 365 | if loc != -1: 366 | # print("jump_buffer_lesser: " + str(loc)) 367 | jump_buffer_lesser.remove(loc) 368 | jump_buffer_removed.append(loc) 369 | 370 | #If this is a first load 371 | if page_first_load == 1: 372 | page_first_load = 0 373 | 374 | 375 | 376 | func tex_obj_is_valid(index): #Checks if an entry in tex_obj is a properly initiated Tex 377 | var tex_status = 0 # 0 = everything is good, 1 = completely new, 2 = exists but not initiated, 3 = invalid [ie negative number] 378 | 379 | if !tex_obj.size() - 1 >= index: #New 380 | tex_status = 1 381 | else: 382 | if tex_obj[index] == Core: #Existing, but only made for jump 383 | tex_status = 2 384 | if tex_obj[index] == null: 385 | tex_status = 3 386 | # 387 | if index < 0: 388 | tex_status = 3 389 | ## 390 | #print("index: " + str(index)) 391 | # print("tex_status: " + str(tex_status)) 392 | return tex_status 393 | 394 | func reset(): 395 | #Reset all the relevant variables for Streamer 396 | for i in thread: 397 | i.wait_to_finish() 398 | 399 | tex_obj = [] #objects 400 | tex_path = [] #path to texture. 401 | tex_coord = [] #y coordinate 402 | 403 | page_max = 0 #Most recently loaded page 404 | page_cur = 0 #Current page we're looking at 405 | pages_tracking = [] #Current 406 | pages_tracking_temp = [] 407 | page_first_load = 0 408 | pages_loaded = [] 409 | 410 | #Threading 411 | thread_status = [] #values = 1 for active, 0 for inactive 412 | thread_queue = [] #value = index. Array of stuff the thread needs to load 413 | thread_processing = [] #Array of indices 414 | jump_buffer_lesser = [] #Order of pages to load less than jumped page 415 | jump_buffer_greater = [] #Order of pages to load greater than jumped page 416 | jump_buffer_removed = [] #Pages that have been sent to processing 417 | -------------------------------------------------------------------------------- /core/Streamer.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=2 format=2] 2 | 3 | [ext_resource path="res://core/Streamer.gd" type="Script" id=1] 4 | 5 | [node name="Streamer" type="Node"] 6 | script = ExtResource( 1 ) 7 | -------------------------------------------------------------------------------- /core/Tex.gd: -------------------------------------------------------------------------------- 1 | extends TextureRect 2 | 3 | 4 | onready var Vis = get_node("VisibilityNotifier2D") 5 | onready var Streamer = get_node("/root/Main/Core/Streamer") 6 | onready var Camera2D = get_node("/root/Main/Camera2D") 7 | onready var Core = get_node("/root/Main/Core") 8 | 9 | var page = 0 #The page this texture is loaded for 10 | 11 | # Called when the node enters the scene tree for the first time. 12 | func _ready(): 13 | Vis.connect("screen_exited", self, "_on_screen_exited") 14 | Vis.connect("screen_entered", self, "_on_screen_entered") 15 | # yield(get_tree().create_timer(.5), "timeout") 16 | # verify_coordinates() 17 | 18 | func _process(delta): 19 | Vis.rect = Rect2( 0, 0, rect_size.x, rect_size.y) 20 | 21 | if abs(Streamer.page_cur - page) > Streamer.page_buffer_unload: #Unload ourself 22 | Streamer.tex_obj[page] = Core 23 | if Streamer.pages_tracking.has(self): 24 | Streamer.pages_tracking.erase(self) 25 | if Streamer.pages_loaded.has(page): 26 | Streamer.pages_loaded.erase(page) 27 | self.queue_free() 28 | # texture = null 29 | # print(str(page) + " unloaded") 30 | 31 | #Fallback in case a page failed to load. Emergency loading! 32 | if Vis.is_on_screen() and texture == null and !Streamer.thread_queue.has(page) and !Streamer.thread_processing.has(page): 33 | Streamer.tex_thread_start(page) 34 | # print("emergency load: " + str(page)) 35 | 36 | if !Vis.is_on_screen() and Streamer.pages_tracking.has(page): #Remove us from tracking 37 | if abs(Streamer.page_cur - page) > Camera2D.camera_scroll_speed/10: 38 | Streamer.pages_tracking.remove(Streamer.pages_tracking.find(page)) 39 | 40 | # if rect_position.y == -99999: 41 | # yield(get_tree().create_timer(.5), "timeout") 42 | # verify_coordinates() 43 | 44 | 45 | func verify_coordinates(): 46 | if rect_position.y == -99999: #We need to change positions 47 | var tex_next = Streamer.tex_obj_is_valid(page + 1) 48 | var tex_prev = Streamer.tex_obj_is_valid(page - 1) 49 | print("verify coordinates") 50 | 51 | if tex_next == 0: #scrolling up 52 | rect_position.y = Streamer.tex_obj[page + 1].rect_position.y - rect_size.y - Streamer.tex_y_buffer 53 | print(rect_position.y) 54 | if tex_prev == 0: #scrolling down 55 | rect_position.y = Streamer.tex_obj[page - 1].rect_position.y + Streamer.tex_obj[page - 1].rect_size.y + Streamer.tex_y_buffer 56 | print(rect_position.y) 57 | 58 | func _on_screen_exited(): 59 | pass 60 | 61 | func _on_screen_entered(): 62 | #Fancy fade in 63 | global.Tween.interpolate_property(self, "modulate",Color(1, 1, 1, 0), Color(1, 1, 1, 1), .5, global.Tween.TRANS_CUBIC, global.Tween.EASE_OUT) 64 | global.Tween.start() 65 | 66 | if !Streamer.pages_tracking.has(self): 67 | Streamer.pages_tracking.append(self) 68 | Streamer.page_new(self) 69 | # Streamer.page_cur = page 70 | 71 | -------------------------------------------------------------------------------- /core/Tex.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=2 format=2] 2 | 3 | [ext_resource path="res://core/Tex.gd" type="Script" id=1] 4 | 5 | [node name="Tex" type="TextureRect"] 6 | mouse_filter = 2 7 | script = ExtResource( 1 ) 8 | __meta__ = { 9 | "_edit_use_anchors_": false 10 | } 11 | 12 | [node name="VisibilityNotifier2D" type="VisibilityNotifier2D" parent="."] 13 | -------------------------------------------------------------------------------- /core/file_search.gd: -------------------------------------------------------------------------------- 1 | # FileSearch 2 | # author: willnationsdev 3 | # license: MIT 4 | # description: A utility with helpful methods to search through one's project files (or any directory). 5 | tool 6 | extends Reference 7 | class_name FileSearch 8 | 9 | ##### CLASSES ##### 10 | 11 | class FileEvaluator: 12 | extends Reference 13 | 14 | ##### PROPERTIES ##### 15 | 16 | var file_path: String = "" setget set_file_path 17 | 18 | ##### virtuals ##### 19 | 20 | # _is_match() -> void: assigns a new file path to the object 21 | func _is_match() -> bool: 22 | return true 23 | 24 | # _get_key() -> void: If _is_match() returns true, returns the key used to store the data. 25 | func _get_key(): 26 | return file_path 27 | 28 | # _get_value() -> Dictionary: If _is_match() returns true, returns the data associated with the file. 29 | func _get_value() -> Dictionary: 30 | return { "path": file_path } 31 | #return { "path": file_path } 32 | 33 | # set_file_path(path) -> void: assigns a new file path to the object 34 | func set_file_path(p_value): 35 | file_path = p_value 36 | 37 | class FilesThatHaveString: 38 | extends FileEvaluator 39 | 40 | var _compare: String 41 | 42 | func _init(p_compare: String = ""): 43 | _compare = p_compare 44 | 45 | func _is_match() -> bool: 46 | return file_path.find(_compare) != -1 47 | 48 | class FilesThatAreSubsequenceOf: 49 | extends FileEvaluator 50 | 51 | var _compare: String 52 | var _case_sensitive: bool 53 | 54 | func _init(p_compare: String = "", p_case_sensitive: bool = false): 55 | _compare = p_compare 56 | _case_sensitive = p_case_sensitive 57 | 58 | func _is_match() -> bool: 59 | if _case_sensitive: 60 | return _compare.is_subsequence_of(file_path) 61 | return _compare.is_subsequence_ofi(file_path) 62 | 63 | class FilesThatMatchRegex: 64 | extends FileEvaluator 65 | 66 | var _regex: RegEx = RegEx.new() 67 | var _compare_full_path 68 | var _match: RegExMatch = null 69 | 70 | func _init(p_regex_str: String, p_compare_full_path: bool = false): 71 | _compare_full_path = p_compare_full_path 72 | if _regex.compile(p_regex_str) != OK: 73 | push_error("Check failed. FilesThatMatchRegex failed to compile regex: " + p_regex_str) 74 | return 75 | 76 | func _is_match() -> bool: 77 | if not _regex.is_valid(): 78 | return false 79 | _match = _regex.search(file_path if _compare_full_path else file_path.get_file()) 80 | return _match != null 81 | 82 | func _get_value() -> Dictionary: 83 | var data = ._get_value() 84 | data.match = _match 85 | return data 86 | 87 | class FilesThatExtendResource: 88 | extends FileEvaluator 89 | 90 | var _match_func: FuncRef 91 | var _exts: Dictionary 92 | 93 | func _init(p_types: PoolStringArray = PoolStringArray(["Resource"]), p_match_func: FuncRef = null, p_block_base_resource: bool = false): 94 | _match_func = p_match_func 95 | for type in p_types: 96 | for a_ext in ResourceLoader.get_recognized_extensions_for_type(type): 97 | _exts[a_ext] = null 98 | if p_block_base_resource: 99 | #warning-ignore:return_value_discarded 100 | #warning-ignore:return_value_discarded 101 | _exts.erase("tres") 102 | _exts.erase("res") 103 | 104 | func _is_match() -> bool: 105 | for a_ext in _exts: 106 | if file_path.get_file().get_extension() == a_ext: 107 | if _match_func: 108 | return _match_func.call_func(file_path) 109 | return true 110 | return false 111 | 112 | ##### SIGNALS ##### 113 | 114 | ##### CONSTANTS ##### 115 | 116 | const SELF_PATH: String = "res://core/file_search.gd" 117 | 118 | ##### NOTIFICATIONS ##### 119 | 120 | ##### VIRTUALS ##### 121 | 122 | ##### OVERRIDES ##### 123 | 124 | ##### PUBLIC METHODS ##### 125 | 126 | static func search_string(p_str: String, p_from_dir: String = "res://", p_recursive: bool = true) -> Dictionary: 127 | return _search_custom(FilesThatHaveString.new(p_str), p_from_dir, p_recursive) 128 | 129 | static func search_string_folder(p_str: String, p_from_dir: String = "res://", p_recursive: bool = true) -> Array: #search specifically for folders 130 | return _search_folder(FilesThatHaveString.new(p_str), p_from_dir, p_recursive) 131 | 132 | static func search_iterate_folder(p_from_dir: String = "res://", p_recursive: bool = true) -> Array: #iterate through all folders in dir 133 | return _search_iterate_folder(p_from_dir, p_recursive) 134 | 135 | static func search_subsequence(p_str: String, p_from_dir: String = "res://", p_recursive: bool = true) -> Dictionary: 136 | return _search(FilesThatAreSubsequenceOf.new(p_str, false), p_from_dir, p_recursive) 137 | 138 | static func search_subsequence_i(p_str: String, p_from_dir: String = "res://", p_recursive: bool = true) -> Dictionary: 139 | return _search(FilesThatAreSubsequenceOf.new(p_str, true), p_from_dir, p_recursive) 140 | 141 | static func search_regex(p_regex: String, p_from_dir: String = "res://", p_recursive: bool = true) -> Dictionary: 142 | return _search(FilesThatMatchRegex.new(p_regex, false), p_from_dir, p_recursive) 143 | 144 | static func search_regex_full_path(p_regex: String, p_from_dir: String = "res://", p_recursive: bool = true) -> Dictionary: 145 | return _search(FilesThatMatchRegex.new(p_regex, true), p_from_dir, p_recursive) 146 | 147 | static func search_scripts(p_match_func: FuncRef = null, p_from_dir: String = "res://", p_recursive: bool = true) -> Dictionary: 148 | return _search(FilesThatExtendResource.new(["Script"], p_match_func), p_from_dir, p_recursive) 149 | 150 | static func search_scenes(p_match_func: FuncRef = null, p_from_dir: String = "res://", p_recursive: bool = true) -> Dictionary: 151 | return _search(FilesThatExtendResource.new(["PackedScene"], p_match_func), p_from_dir, p_recursive) 152 | 153 | static func search_types(p_match_func: FuncRef = null, p_from_dir: String = "res://", p_recursive: bool = true) -> Dictionary: 154 | return _search(FilesThatExtendResource.new(["Script", "PackedScene"], p_match_func), p_from_dir, p_recursive) 155 | 156 | static func search_resources(p_types: PoolStringArray = ["Resource"], p_match_func: FuncRef = null, p_from_dir: String = "res://", p_recursive: bool = true) -> Dictionary: 157 | return _search(FilesThatExtendResource.new(p_types, p_match_func), p_from_dir, p_recursive) 158 | 159 | ##### PRIVATE METHODS ##### 160 | 161 | static func _this() -> Script: 162 | return load(SELF_PATH) as Script 163 | 164 | # p_evaluator: A FileEvaluator type. 165 | # p_from_dir: The starting location from which to scan. 166 | # p_recursive: If true, scan all sub-directories, not just the given one. 167 | static func _search(p_evaluator: FileEvaluator, p_from_dir: String = "res://", p_recursive: bool = true) -> Dictionary: 168 | var dirs: Array = [p_from_dir] 169 | var dir: Directory = Directory.new() 170 | var first: bool = true 171 | var data: Dictionary = {} 172 | var eval: FileEvaluator = p_evaluator 173 | 174 | # generate 'data' map 175 | while not dirs.empty(): 176 | var dir_name = dirs.back() 177 | dirs.pop_back() 178 | 179 | if dir.open(dir_name) == OK: 180 | #warning-ignore:return_value_discarded 181 | dir.list_dir_begin() 182 | var file_name = dir.get_next() 183 | while file_name: 184 | var starts_with_slash: bool = p_from_dir.ends_with("/") 185 | if first and not dir_name == p_from_dir: 186 | first = false 187 | # Ignore hidden content 188 | if not file_name.begins_with("."): 189 | var a_path = dir.get_current_dir() + ("/") + file_name 190 | eval.set_file_path(a_path) 191 | 192 | # If a directory, then add to list of directories to visit 193 | if p_recursive and dir.current_is_dir(): 194 | dirs.push_back(dir.get_current_dir().plus_file(file_name)) 195 | # If a file, check if we already have a record for the same name. 196 | # Only use files with extensions 197 | elif not data.has(a_path) and eval._is_match(): 198 | data[eval._get_key()] = eval._get_value() 199 | 200 | # Move on to the next file in this directory 201 | file_name = dir.get_next() 202 | 203 | # We've exhausted all files in this directory. Close the iterator 204 | dir.list_dir_end() 205 | 206 | return data 207 | 208 | #Removes ("" if first else "/") from original script so it doesn't miss the last "/" 209 | #Otherwise completely the same as _search 210 | static func _search_custom(p_evaluator: FileEvaluator, p_from_dir: String = "res://", p_recursive: bool = true) -> Dictionary: 211 | var dirs: Array = [p_from_dir] 212 | var dir: Directory = Directory.new() 213 | var first: bool = true 214 | var data: Dictionary = {} 215 | var eval: FileEvaluator = p_evaluator 216 | 217 | # generate 'data' map 218 | while not dirs.empty(): 219 | var dir_name = dirs.back() 220 | dirs.pop_back() 221 | 222 | if dir.open(dir_name) == OK: 223 | #warning-ignore:return_value_discarded 224 | dir.list_dir_begin() 225 | var file_name = dir.get_next() 226 | while file_name: 227 | if first and not dir_name == p_from_dir: 228 | first = false 229 | # Ignore hidden content 230 | if not file_name.begins_with("."): 231 | var a_path = dir.get_current_dir() + ("/") + file_name 232 | eval.set_file_path(a_path) 233 | 234 | # If a directory, then add to list of directories to visit 235 | if p_recursive and dir.current_is_dir(): 236 | dirs.push_back(dir.get_current_dir().plus_file(file_name)) 237 | # If a file, check if we already have a record for the same name. 238 | # Only use files with extensions 239 | elif not data.has(a_path) and eval._is_match(): 240 | data[eval._get_key()] = eval._get_value() 241 | 242 | # Move on to the next file in this directory 243 | file_name = dir.get_next() 244 | 245 | # We've exhausted all files in this directory. Close the iterator 246 | dir.list_dir_end() 247 | 248 | return data 249 | 250 | static func _search_folder(p_evaluator: FileEvaluator, p_from_dir: String = "res://", p_recursive: bool = true) -> Array: 251 | var dirs: Array = [p_from_dir] 252 | var dir: Directory = Directory.new() 253 | var first: bool = true 254 | var data: Array = [] 255 | var eval: FileEvaluator = p_evaluator 256 | 257 | # generate 'data' map 258 | while not dirs.empty(): 259 | var dir_name = dirs.back() 260 | dirs.pop_back() 261 | 262 | if dir.open(dir_name) == OK: 263 | #warning-ignore:return_value_discarded 264 | dir.list_dir_begin() 265 | var file_name = dir.get_next() 266 | while file_name: 267 | if first and not dir_name == p_from_dir: 268 | first = false 269 | # Ignore hidden content 270 | if not file_name.begins_with("."): 271 | var a_path = dir.get_current_dir() + ("/") + file_name 272 | eval.set_file_path(a_path) 273 | 274 | # If a directory, then add to list of directories to visit 275 | if p_recursive and dir.current_is_dir(): 276 | dirs.push_back(dir.get_current_dir().plus_file(file_name)) 277 | # If a file, check if we already have a record for the same name, and folder matches 278 | 279 | if not data.has(a_path) and eval._is_match() and file_name.get_extension() == "": 280 | data.append(eval.file_path) 281 | #data.append(file_name) ~get file name instead of file path 282 | 283 | # Move on to the next file in this directory 284 | file_name = dir.get_next() 285 | 286 | # We've exhausted all files in this directory. Close the iterator 287 | dir.list_dir_end() 288 | 289 | return data 290 | 291 | #finds all folders and subfolders in a directory 292 | static func _search_iterate_folder(p_from_dir: String = "res://", p_recursive: bool = true) -> Array: 293 | var dirs: Array = [p_from_dir] 294 | var dir: Directory = Directory.new() 295 | var first: bool = true 296 | var data: Array = [] 297 | 298 | 299 | # generate 'data' map 300 | while not dirs.empty(): 301 | var dir_name = dirs.back() 302 | dirs.pop_back() 303 | 304 | if dir.open(dir_name) == OK: 305 | #warning-ignore:return_value_discarded 306 | dir.list_dir_begin() 307 | var file_name = dir.get_next() 308 | while file_name: 309 | if first and not dir_name == p_from_dir: 310 | first = false 311 | # Ignore hidden content 312 | if not file_name.begins_with("."): 313 | var a_path = dir.get_current_dir() + ("/") + file_name 314 | # If a directory, then add to list of directories to visit 315 | if p_recursive and dir.current_is_dir(): 316 | dirs.push_back(dir.get_current_dir().plus_file(file_name)) 317 | # If a file, check if we already have a record for the same name, and folder matches 318 | 319 | if not data.has(a_path): #and file_name.get_extension() == "": has issues with periods in folder names 320 | data.append(a_path) 321 | #data.append(file_name) ~get file name instead of file path 322 | 323 | # Move on to the next file in this directory 324 | file_name = dir.get_next() 325 | 326 | # We've exhausted all files in this directory. Close the iterator 327 | dir.list_dir_end() 328 | 329 | return data 330 | 331 | ##### CONNECTIONS ##### 332 | 333 | ##### SETTERS AND GETTERS ##### 334 | -------------------------------------------------------------------------------- /core/resolution_manager.gd: -------------------------------------------------------------------------------- 1 | extends Node 2 | 3 | onready var vp = get_tree().get_root() 4 | onready var base_size = Vector2(1920, 1080) 5 | 6 | 7 | func _ready(): 8 | # Use whichever you would like by default 9 | #set_fullscreen() 10 | #set_windowed() 11 | pass 12 | 13 | 14 | func set_fullscreen(): 15 | var window_size = OS.get_screen_size() 16 | 17 | if OS.get_name() == 'Windows' && window_size == base_size: 18 | # Not sure if this works outside of Windows / native resolution. 19 | # - Mac didn't like it, nor smaller resolutions. 20 | OS.set_window_fullscreen(true) 21 | else: 22 | var scale = min(window_size.x / base_size.x, window_size.y / base_size.y) 23 | var scaled_size = (base_size * scale).round() 24 | 25 | var margins = Vector2(window_size.x - scaled_size.x, window_size.y - scaled_size.y) 26 | var screen_rect = Rect2((margins / 2).round(), scaled_size) 27 | 28 | OS.set_borderless_window(true) 29 | OS.set_window_position(OS.get_screen_position()) 30 | OS.set_window_size(Vector2(window_size.x, window_size.y + 1)) # Black magic? 31 | vp.set_size(scaled_size) # Not sure this is strictly necessary 32 | vp.set_attach_to_screen_rect(screen_rect) 33 | 34 | 35 | func set_windowed(): 36 | var window_size = OS.get_screen_size() 37 | # I set the windowed version to an arbitrary 80% of screen size here 38 | var scale = min(window_size.x / base_size.x, window_size.y / base_size.y) * 1 39 | var scaled_size = (base_size * scale).round() 40 | 41 | var window_x = (window_size.x / 2) - (scaled_size.x / 2) 42 | var window_y = (window_size.y / 2) - (scaled_size.y / 2) 43 | OS.set_borderless_window(false) 44 | OS.set_window_fullscreen(false) 45 | OS.set_window_position(Vector2(window_x, window_y)) 46 | OS.set_window_size(scaled_size) 47 | vp.set_size(scaled_size) 48 | -------------------------------------------------------------------------------- /default_env.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="Environment" load_steps=2 format=2] 2 | 3 | [sub_resource type="ProceduralSky" id=1] 4 | 5 | [resource] 6 | background_mode = 2 7 | background_sky = SubResource( 1 ) 8 | -------------------------------------------------------------------------------- /export_presets.cfg: -------------------------------------------------------------------------------- 1 | [preset.0] 2 | 3 | name="Windows Desktop" 4 | platform="Windows Desktop" 5 | runnable=true 6 | custom_features="" 7 | export_filter="all_resources" 8 | include_filter="" 9 | exclude_filter="" 10 | export_path="../go·reader RE/go·reader 1.2-bellicose/go·reader.exe" 11 | patch_list=PoolStringArray( ) 12 | script_export_mode=0 13 | script_encryption_key="" 14 | 15 | [preset.0.options] 16 | 17 | texture_format/bptc=false 18 | texture_format/s3tc=true 19 | texture_format/etc=false 20 | texture_format/etc2=false 21 | texture_format/no_bptc_fallbacks=true 22 | binary_format/64_bits=false 23 | binary_format/embed_pck=true 24 | custom_template/release="" 25 | custom_template/debug="" 26 | codesign/enable=false 27 | codesign/identity_type=0 28 | codesign/identity="" 29 | codesign/password="" 30 | codesign/timestamp=false 31 | codesign/timestamp_server_url="" 32 | codesign/digest_algorithm=1 33 | codesign/description="" 34 | codesign/custom_options=PoolStringArray( ) 35 | application/icon="res://ui/splash/go·reader_icon.ico" 36 | application/file_version="1.1-ardent" 37 | application/product_version="1.1-ardent" 38 | application/company_name="Sirosky" 39 | application/product_name="go·reader" 40 | application/file_description="" 41 | application/copyright="" 42 | application/trademarks="" 43 | -------------------------------------------------------------------------------- /global/global.gd: -------------------------------------------------------------------------------- 1 | extends Node 2 | #Singleton for general utility 3 | 4 | var window_width:int = ProjectSettings.get("display/window/size/width") 5 | var window_height:int = ProjectSettings.get("display/window/size/height") 6 | var mouse_x = 1 7 | var mouse_y = 1 8 | var rng = RandomNumberGenerator.new() 9 | 10 | #Nodes for reference 11 | onready var root = get_node("/root") 12 | onready var Camera = get_node("/root/Main/Camera2D") 13 | onready var Main = get_node("/root/Main") 14 | onready var Tween = get_node("/root/Main/Core/Tween") 15 | onready var Mes = get_node("/root/Main/UI/Messenger") 16 | 17 | #Settings 18 | var settings_path = "res://settings/settings.json" 19 | var settings = {} 20 | 21 | func _ready(): 22 | rng.randomize() 23 | 24 | func _process(delta): 25 | window_width = OS.get_window_size().x 26 | window_height = OS.get_window_size().y 27 | var res = Camera.get_global_mouse_position() 28 | mouse_x = res.x 29 | mouse_y = res.y 30 | 31 | #----------- node management 32 | 33 | func scene_load(scn_path : String, scn_par : Object): #Load, instance, and add a scene to a parent 34 | var scn = load(scn_path) #Load scene from resources 35 | var scn_inst = scn.instance() #Instance scene 36 | scn_par.add_child(scn_inst) #Get the parent and add it to the scene tree 37 | return scn_inst 38 | 39 | func scene_load_par(scn_path : String, scn_par : Object, self_node): 40 | var scn=load(scn_path) #Load scene from resources 41 | var scn_inst= scn.instance() #Instance scene 42 | self_node.scn_par.add_child(scn_inst) #Get the parent and add it to the scene tree 43 | return scn_inst 44 | 45 | func scene_instance(scn, scn_par : Object): #Instance an already loaded scene, add to parent 46 | var scn_inst= scn.instance() #Instance scene 47 | scn_par.add_child(scn_inst) #Get the parent and add it to the scene tree 48 | return scn_inst 49 | 50 | static func children_delete(node): 51 | #Deletes all child nodes 52 | for n in node.get_children(): 53 | node.remove_child(n) 54 | n.queue_free() 55 | 56 | func directory_list(path): 57 | var files = [] # create array to hold files 58 | var dir = Directory.new() 59 | dir.open(path) 60 | dir.list_dir_begin() 61 | 62 | while true: 63 | var file = dir.get_next() 64 | if file == "": #last file already reached, leave loop 65 | break 66 | elif not file.begins_with("."): #check if directory, then add 67 | files.append(file) 68 | return files 69 | 70 | #-----JSON 71 | 72 | func json_read(json_path): 73 | #Open, read, and load JSON 74 | #PathJSON e.g. "res://data/test.json" 75 | var data_file = File.new() 76 | if data_file.open(json_path, File.READ) != OK: 77 | print("read error: " + str(json_path)) 78 | return 79 | var data_text = data_file.get_as_text() 80 | data_file.close() 81 | var data_parse = JSON.parse(data_text) 82 | if data_parse.error != OK: 83 | print("parse error: " + str(json_path)) 84 | return 85 | print("parse successful: " + str(json_path)) 86 | #print(data_parse.result) 87 | 88 | return data_parse.result 89 | 90 | func json_write(json_path, dic): 91 | #Open, read, and load JSON 92 | #dic- dictionary to be stored in json 93 | #PathJSON e.g. "res://data/test.json" 94 | var data_file = File.new() 95 | if data_file.open(json_path, File.WRITE) != OK: 96 | print("read error: " + str(json_path)) 97 | return 98 | 99 | data_file.store_line(to_json(dic)) 100 | data_file.close() 101 | print("write success: " + str(json_path)) 102 | -------------------------------------------------------------------------------- /icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sirosky/go-reader/a5c765d8459591ea3d40dd5f4555c7f72819a2d7/icon.png -------------------------------------------------------------------------------- /icon.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/icon.png-487276ed1e3a0c39cad0279d744ee560.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://icon.png" 13 | dest_files=[ "res://.import/icon.png-487276ed1e3a0c39cad0279d744ee560.stex" ] 14 | 15 | [params] 16 | 17 | compress/mode=0 18 | compress/lossy_quality=0.7 19 | compress/hdr_mode=0 20 | compress/bptc_ldr=0 21 | compress/normal_map=0 22 | flags/repeat=0 23 | flags/filter=true 24 | flags/mipmaps=false 25 | flags/anisotropic=false 26 | flags/srgb=2 27 | process/fix_alpha_border=true 28 | process/premult_alpha=false 29 | process/HDR_as_SRGB=false 30 | process/invert_color=false 31 | stream=false 32 | size_limit=0 33 | detect_3d=true 34 | svg/scale=1.0 35 | -------------------------------------------------------------------------------- /project.godot: -------------------------------------------------------------------------------- 1 | ; Engine configuration file. 2 | ; It's best edited using the editor UI and not directly, 3 | ; since the parameters that go here are not all obvious. 4 | ; 5 | ; Format: 6 | ; [section] ; section goes between [] 7 | ; param=value ; assign values to parameters 8 | 9 | config_version=4 10 | 11 | _global_script_classes=[ { 12 | "base": "Reference", 13 | "class": "FileSearch", 14 | "language": "GDScript", 15 | "path": "res://core/file_search.gd" 16 | } ] 17 | _global_script_class_icons={ 18 | "FileSearch": "" 19 | } 20 | 21 | [application] 22 | 23 | config/name="go·reader" 24 | config/description="A minimalistic comic & manga reader." 25 | run/main_scene="res://Main.tscn" 26 | boot_splash/image="res://ui/splash/go·reader_splash.png" 27 | boot_splash/fullsize=false 28 | boot_splash/bg_color=Color( 0.08, 0.11, 0.2, 1 ) 29 | config/icon="res://ui/splash/go·reader_icon.png" 30 | config/windows_native_icon="res://ui/splash/go·reader_icon.ico" 31 | 32 | [autoload] 33 | 34 | global="*res://global/global.gd" 35 | ResolutionManager="*res://core/resolution_manager.gd" 36 | 37 | [display] 38 | 39 | window/size/width=1920 40 | window/size/height=1080 41 | window/size/fullscreen=true 42 | window/size/test_width=1920 43 | window/size/test_height=1080 44 | window/dpi/allow_hidpi=true 45 | 46 | [gui] 47 | 48 | theme/use_hidpi=true 49 | 50 | [input] 51 | 52 | ui_left={ 53 | "deadzone": 0.5, 54 | "events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777231,"unicode":0,"echo":false,"script":null) 55 | , Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":14,"pressure":0.0,"pressed":false,"script":null) 56 | , Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":65,"unicode":0,"echo":false,"script":null) 57 | ] 58 | } 59 | ui_right={ 60 | "deadzone": 0.5, 61 | "events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777233,"unicode":0,"echo":false,"script":null) 62 | , Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":15,"pressure":0.0,"pressed":false,"script":null) 63 | , Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":68,"unicode":0,"echo":false,"script":null) 64 | ] 65 | } 66 | ui_up={ 67 | "deadzone": 0.5, 68 | "events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777232,"unicode":0,"echo":false,"script":null) 69 | , Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":12,"pressure":0.0,"pressed":false,"script":null) 70 | , Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":87,"unicode":0,"echo":false,"script":null) 71 | ] 72 | } 73 | ui_down={ 74 | "deadzone": 0.5, 75 | "events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777234,"unicode":0,"echo":false,"script":null) 76 | , Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":13,"pressure":0.0,"pressed":false,"script":null) 77 | , Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":83,"unicode":0,"echo":false,"script":null) 78 | ] 79 | } 80 | ui_fullscreen={ 81 | "deadzone": 0.5, 82 | "events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":70,"unicode":0,"echo":false,"script":null) 83 | ] 84 | } 85 | ui_debug_overlay={ 86 | "deadzone": 0.5, 87 | "events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":69,"unicode":0,"echo":false,"script":null) 88 | ] 89 | } 90 | ui_jump={ 91 | "deadzone": 0.5, 92 | "events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":74,"unicode":0,"echo":false,"script":null) 93 | ] 94 | } 95 | ui_load={ 96 | "deadzone": 0.5, 97 | "events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":76,"unicode":0,"echo":false,"script":null) 98 | ] 99 | } 100 | 101 | [rendering] 102 | 103 | quality/shadows/filter_mode=0 104 | environment/default_clear_color=Color( 0.0784314, 0.109804, 0.2, 1 ) 105 | quality/filters/msaa=4 106 | environment/default_environment="res://default_env.tres" 107 | -------------------------------------------------------------------------------- /settings/settings.json: -------------------------------------------------------------------------------- 1 | {"BG":{"color":{"h":0,"s":0.66,"v":0.23}},"General":{"autoload":true,"autoload_source":"C:/Users/Sirosky/AppData/Roaming/Godot/app_userdata/go·reader/library/Yamada-kun to 7-nin no Majo","debug_overlay":false,"first_start":false,"fullscreen":true},"History":{"C:/Users/Sirosky/AppData/Roaming/Godot/app_userdata/go·reader/library":0,"C:/Users/Sirosky/AppData/Roaming/Godot/app_userdata/go·reader/library/Sample":5,"C:/Users/Sirosky/AppData/Roaming/Godot/app_userdata/go·reader/library/Yamada-kun to 7-nin no Majo":40}} 2 | -------------------------------------------------------------------------------- /ui/About/About.gd: -------------------------------------------------------------------------------- 1 | extends PanelContainer 2 | 3 | onready var ButClose = get_node("MarginContainer/VBox/ButClose") 4 | 5 | # Called when the node enters the scene tree for the first time. 6 | func _ready(): 7 | ButClose.connect("pressed", self, "toggle") 8 | 9 | func _process(delta): 10 | if modulate == Color(1, 1, 1, 0) and visible == true: 11 | visible = false 12 | 13 | func toggle(): 14 | 15 | var vis = !visible 16 | 17 | if vis == true: 18 | visible = true 19 | rect_position.x = OS.get_screen_size().x/2 - rect_size.x/2 20 | rect_position.y = OS.get_screen_size().y/2 - rect_size.y/2 21 | global.Tween.interpolate_property(self, "modulate",Color(1, 1, 1, 0), Color(1, 1, 1, .9), .5, global.Tween.TRANS_CUBIC, global.Tween.EASE_OUT) 22 | global.Tween.start() 23 | else: #Reset progress bar, make it go away 24 | global.Tween.interpolate_property(self, "modulate",Color(1, 1, 1, .9), Color(1, 1, 1, 0), .5, global.Tween.TRANS_CUBIC, global.Tween.EASE_OUT) 25 | global.Tween.start() 26 | -------------------------------------------------------------------------------- /ui/Camera2D/Camera2D.gd: -------------------------------------------------------------------------------- 1 | 2 | extends Camera2D 3 | 4 | onready var Main = get_node("/root/Main") 5 | 6 | 7 | # Camera control settings: 8 | # key - by keyboard 9 | # drag - by clicking mouse button, right mouse button by default; 10 | # edge - by moving mouse to the window edge 11 | # wheel - zoom in/out by mouse wheel 12 | # set current to to true! (inspector) 13 | export (bool) var key = true 14 | export (bool) var drag = true 15 | export (bool) var edge = false 16 | export (bool) var wheel = true 17 | export (bool) var active = true 18 | 19 | export (int) var zoom_out_limit = 4 20 | export (int) var zoom_in_limit = .8 21 | 22 | # Camera speed in px/s. 23 | export (int) var camera_speed = 1200 #1200 is the normal 24 | export (int) var camera_scroll_speed = 150 25 | 26 | # Initial zoom value taken from Editor. 27 | var camera_zoom = get_zoom() 28 | 29 | # Value meaning how near to the window edge (in px) the mouse must be, 30 | # to move a view. 31 | export (int) var camera_margin = 50 32 | 33 | # It changes a camera zoom value in units... (?, but it works... it probably 34 | # multiplies camera size by 1+camera_zoom_speed) 35 | const camera_zoom_speed = Vector2(0.1, 0.1) 36 | 37 | # Vector of camera's movement / second. 38 | var camera_movement = Vector2() 39 | 40 | # Previous mouse position used to count delta of the mouse movement. 41 | var _prev_mouse_pos = null 42 | 43 | #Backup values that can be used when camera is disabled 44 | var position_x 45 | var position_y 46 | var _zoom 47 | 48 | var camera_origin = Vector2() #Top left of camera 49 | #Limits of camera 50 | var camera_limit_x1 = -4000 51 | var camera_limit_y1 = -24 52 | var camera_limit_x2 = 4000 53 | var camera_limit_y2 = 999999 54 | 55 | signal camera_moved 56 | 57 | # INPUTS 58 | 59 | # Right mouse button was or is pressed. 60 | var __rmbk = false 61 | # Move camera by keys: left, top, right, bottom. 62 | var __keys = [false, false, false, false] 63 | 64 | func _ready(): 65 | set_h_drag_enabled(false) 66 | set_v_drag_enabled(false) 67 | set_enable_follow_smoothing(true) 68 | set_follow_smoothing(10) 69 | position.x = 0 70 | position.y = OS.get_screen_size().y/2 71 | 72 | func _physics_process(delta): 73 | if active == true: 74 | #Calculate camera origin 75 | camera_origin.x = position.x - OS.get_screen_size().x/2 76 | camera_origin.y = position.y - OS.get_screen_size().y/2 77 | 78 | # Move camera by keys defined in InputMap (ui_left/top/right/bottom). 79 | if key: 80 | if __keys[0]: 81 | camera_movement.x -= camera_speed * delta 82 | if __keys[1]: 83 | camera_movement.y -= camera_speed * delta 84 | if __keys[2]: 85 | camera_movement.x += camera_speed * delta 86 | if __keys[3]: 87 | camera_movement.y += camera_speed * delta 88 | 89 | 90 | # When RMB is pressed, move camera by difference of mouse position 91 | if drag and __rmbk: 92 | camera_movement = _prev_mouse_pos - get_local_mouse_position() 93 | 94 | #Bind camera to limits. Not 100% perfect but good enough here. 95 | if position.x - OS.get_screen_size().x/2 - camera_movement.x < camera_limit_x1 and camera_movement.x < 0: 96 | # print(position.x - OS.get_screen_size().x/2 - camera_movement.x) 97 | # print("stop") 98 | camera_movement.x = 0 99 | if position.y - OS.get_screen_size().y/2 - camera_movement.y < camera_limit_y1 and camera_movement.y < 0: 100 | camera_movement.y = 0 101 | if position.x + OS.get_screen_size().x/2 + camera_movement.x > camera_limit_x2 and camera_movement.x > 0: 102 | camera_movement.x = 0 103 | if position.y + OS.get_screen_size().y/2 + camera_movement.y > camera_limit_y2 and camera_movement.y > 0: 104 | camera_movement.y = 0 105 | 106 | # print("camera_movement.x: " + str(camera_movement.x)) 107 | 108 | # Update position of the camera. 109 | if camera_movement.y != 0 or camera_movement.x != 0: #Only checking y, because X doesn't matter for infinite scroll 110 | position += camera_movement * get_zoom() 111 | emit_signal("camera_moved") 112 | 113 | # Set camera movement to zero, update old mouse position. 114 | camera_movement = Vector2(0,0) 115 | _prev_mouse_pos = get_local_mouse_position() 116 | 117 | #Limits 118 | # camera_limit_y2 = Tex.rect_size.y 119 | 120 | 121 | 122 | func _unhandled_input( event ): 123 | if active == true: 124 | if event is InputEventMouseButton: 125 | 126 | #Dragging 127 | if drag and\ 128 | event.button_index == BUTTON_LEFT: 129 | # Control by right mouse button. 130 | if event.pressed: __rmbk = true 131 | else: __rmbk = false 132 | 133 | # ZOOOOOOOM 134 | if event.button_index in [BUTTON_WHEEL_UP, BUTTON_WHEEL_DOWN] and event.control: 135 | # Checking if future zoom won't be under 0. 136 | # In that cause engine will flip screen. 137 | if event.button_index == BUTTON_WHEEL_UP and\ 138 | camera_zoom.x - camera_zoom_speed.x > zoom_in_limit and\ 139 | camera_zoom.y - camera_zoom_speed.y > zoom_in_limit: 140 | camera_zoom -= camera_zoom_speed 141 | set_zoom(camera_zoom) 142 | # Checking if future zoom won't be above zoom_out_limit. 143 | if event.button_index == BUTTON_WHEEL_DOWN and\ 144 | camera_zoom.x + camera_zoom_speed.x < zoom_out_limit and\ 145 | camera_zoom.y + camera_zoom_speed.y < zoom_out_limit: 146 | camera_zoom += camera_zoom_speed 147 | set_zoom(camera_zoom) 148 | 149 | # Scrolling 150 | if event.button_index == BUTTON_WHEEL_UP and !event.control: 151 | camera_movement.y -= camera_scroll_speed 152 | if event.button_index == BUTTON_WHEEL_DOWN and !event.control: 153 | camera_movement.y += camera_scroll_speed 154 | 155 | 156 | 157 | # Control by keyboard handled by InpuMap. 158 | if event.is_action_pressed("ui_left"): 159 | __keys[0] = true 160 | if event.is_action_pressed("ui_up"): 161 | __keys[1] = true 162 | if event.is_action_pressed("ui_right"): 163 | __keys[2] = true 164 | if event.is_action_pressed("ui_down"): 165 | __keys[3] = true 166 | if event.is_action_released("ui_left"): 167 | __keys[0] = false 168 | if event.is_action_released("ui_up"): 169 | __keys[1] = false 170 | if event.is_action_released("ui_right"): 171 | __keys[2] = false 172 | if event.is_action_released("ui_down"): 173 | __keys[3] = false 174 | 175 | func pos_in_bounds(x, y): #Check if the proposed position is within camera bounds 176 | if x > camera_limit_x1 and y > camera_limit_y1 and x < camera_limit_x2 and y < camera_limit_y2: 177 | return true 178 | else: 179 | return false 180 | -------------------------------------------------------------------------------- /ui/DebugOverlay/DebugOverlay.gd: -------------------------------------------------------------------------------- 1 | extends CanvasLayer 2 | 3 | var Lab = [] 4 | onready var Cam = get_node("../Camera2D") 5 | onready var Main = get_node("/root/Main") 6 | onready var SourceLoader = get_node("/root/Main/Core/SourceLoader") 7 | onready var Streamer = get_node("/root/Main/Core/Streamer") 8 | onready var Debug = get_node("Debug") 9 | onready var ProgressBar = get_node("ProgressBar") 10 | onready var Jump = get_node("Jump") 11 | onready var LabelPage = get_node("LabelPage") 12 | 13 | func _ready(): 14 | #Set up debug 15 | for i in $Debug.get_children(): 16 | Lab.append(i) 17 | ProgressBar.rect_position.x = 0 18 | ProgressBar.rect_position.y = OS.get_screen_size().y - ProgressBar.rect_size.y 19 | LabelPage.rect_position.x = OS.get_screen_size().x - LabelPage.rect_size.x - 8 20 | LabelPage.rect_position.y = OS.get_screen_size().y - LabelPage.rect_size.y - 8 21 | global.Tween.interpolate_property(LabelPage, "modulate",Color(1, 1, 1, 0), Color(1, 1, 1, .8), 1, global.Tween.TRANS_CUBIC, global.Tween.EASE_OUT) 22 | global.Tween.start() 23 | 24 | func _process(delta): 25 | #Update debugger 26 | # str(str() + ": " + str()) 27 | Lab[0].text = str(str("Camera coordinates") + ": " + str(Cam.position)) 28 | Lab[1].text = str(str("Current page") + ": " + str(Streamer.page_cur)) 29 | Lab[2].text = str(str("Maximum pages loaded") + ": " + str(Streamer.page_max)) 30 | 31 | Lab[3].text = str(str("Pages tracking") + ": " + str(Streamer.pages_tracking)) 32 | 33 | 34 | Lab[3].text = str(str("Current pages loaded") + ": " + str(Streamer.pages_loaded)) 35 | 36 | Lab[4].text = str(str("Threads currently processing") + ": " + str(Streamer.thread_processing)) 37 | Lab[5].text = str(str("Thread 1 busy") + ": " + str(Streamer.thread[0].is_active())) 38 | # Lab[6].text = str(str("Thread 2 busy") + ": " + str(Streamer.thread[1].is_active())) 39 | Lab[7].text = str(str("Thread queue") + ": " + str(Streamer.thread_queue)) 40 | 41 | if ProgressBar.modulate == Color(1, 1, 1, 0): #Make it invisible 42 | ProgressBar.visible = false 43 | 44 | if Jump.modulate == Color(1, 1, 1, 0): #Make it invisible 45 | Jump.visible = false 46 | 47 | LabelPage.rect_position.x = OS.get_screen_size().x - LabelPage.rect_size.x - 8 48 | if Main.cur_dir != "": 49 | LabelPage.text = str(str(Streamer.page_cur + 1) + " of " + str(SourceLoader.tex_sorted.size())) 50 | else: 51 | LabelPage.text = "n/a" 52 | 53 | 54 | func ProgressBar_toggle(): 55 | var vis = !ProgressBar.visible 56 | 57 | if vis == true: 58 | ProgressBar.visible = true 59 | global.Tween.interpolate_property(ProgressBar, "modulate",Color(1, 1, 1, 0), Color(1, 1, 1, .8), 1, global.Tween.TRANS_CUBIC, global.Tween.EASE_OUT) 60 | global.Tween.start() 61 | else: #Reset progress bar, make it go away 62 | global.Tween.interpolate_property(ProgressBar, "modulate",Color(1, 1, 1, .8), Color(1, 1, 1, 0), 1, global.Tween.TRANS_CUBIC, global.Tween.EASE_OUT) 63 | global.Tween.start() 64 | ProgressBar.max_value = 100 65 | ProgressBar.value = 0 66 | 67 | func Jump_toggle(): 68 | var vis = !Jump.visible 69 | 70 | if vis == true: 71 | Jump.visible = true 72 | Jump.rect_position.x = OS.get_screen_size().x/2 - Jump.rect_size.x/2 73 | Jump.rect_position.y = OS.get_screen_size().y/2 - Jump.rect_size.y/2 74 | global.Tween.interpolate_property(Jump, "modulate",Color(1, 1, 1, 0), Color(1, 1, 1, .9), 1, global.Tween.TRANS_CUBIC, global.Tween.EASE_OUT) 75 | global.Tween.start() 76 | 77 | if SourceLoader.tex_sorted.size() > 0: 78 | Jump.SpinBox.max_value = SourceLoader.tex_sorted.size() - 1 79 | else: 80 | Jump.SpinBox.max_value = 0 81 | 82 | else: #Reset progress bar, make it go away 83 | global.Tween.interpolate_property(Jump, "modulate",Color(1, 1, 1, .9), Color(1, 1, 1, 0), 1, global.Tween.TRANS_CUBIC, global.Tween.EASE_OUT) 84 | global.Tween.start() 85 | Jump.SpinBox.value = 0 86 | -------------------------------------------------------------------------------- /ui/Jump.gd: -------------------------------------------------------------------------------- 1 | extends Control 2 | 3 | onready var SpinBox = get_node("Margin/VBoxContainer/SpinBox") 4 | onready var ButJump = get_node("Margin/VBoxContainer/HBoxContainer/ButJump") 5 | onready var ButCancel = get_node("Margin/VBoxContainer/HBoxContainer/ButCancel") 6 | onready var Streamer = get_node("/root/Main/Core/Streamer") 7 | onready var UI = get_node("../") 8 | 9 | # Called when the node enters the scene tree for the first time. 10 | func _ready(): 11 | ButJump.connect("pressed",self,"_on_ButJump_pressed") 12 | ButCancel.connect("pressed",self,"_on_ButCancel_pressed") 13 | 14 | 15 | # Called every frame. 'delta' is the elapsed time since the previous frame. 16 | #func _process(delta): 17 | # pass 18 | 19 | func _on_ButJump_pressed(): 20 | Streamer.tex_jump(int(SpinBox.value)) 21 | UI.Jump_toggle() 22 | 23 | func _on_ButCancel_pressed(): 24 | UI.Jump_toggle() 25 | -------------------------------------------------------------------------------- /ui/MenuContext/MenuContext.gd: -------------------------------------------------------------------------------- 1 | extends MarginContainer 2 | 3 | onready var ButLoad = get_node("Margin/VBox/ButLoad") 4 | onready var ButImport = get_node("Margin/VBox/ButImport") 5 | onready var ButImportZIP = get_node("Margin/VBox/ButImportZIP") 6 | onready var ButDirectory = get_node("Margin/VBox/ButDirectory") 7 | onready var ButSettings = get_node("Margin/VBox/ButSettings") 8 | onready var ButJump = get_node("Margin/VBox/ButJump") 9 | onready var FileDiag = get_node("../FileDialog") 10 | onready var Core = get_node("/root/Main/Core") 11 | onready var SourceLoader = get_node("/root/Main/Core/SourceLoader") 12 | onready var Streamer = get_node("/root/Main/Core/Streamer") 13 | onready var Popup = get_node("../") 14 | onready var Camera2D = get_node("/root/Main/Camera2D") 15 | onready var TexAll = get_node("/root/Main/TexAll") 16 | onready var Panel = get_node("Panel") 17 | onready var Main = get_node("/root/Main") 18 | onready var UI = get_node("/root/Main/UI") 19 | onready var Settings = get_node("/root/Main/Popup/Settings") 20 | 21 | var FileDiag_mode = 0 #0 = Load, 1 = Import select import source, 2 = Import select import location 22 | var import_source = "" #Path that is to be imported 23 | var import_timer = 0 24 | var Dir = Directory.new() 25 | 26 | func _ready(): 27 | ButLoad.connect("pressed",self,"_on_ButLoad_pressed") 28 | ButImport.connect("pressed",self,"_on_ButImport_pressed") 29 | ButDirectory.connect("pressed",self,"_on_ButDirectory_pressed") 30 | ButSettings.connect("pressed",self,"_on_ButSettings_pressed") 31 | ButImportZIP.connect("pressed",self,"_on_ButImportZIP_pressed") 32 | ButJump.connect("pressed",self,"_on_ButJump_pressed") 33 | 34 | FileDiag.connect("confirmed",self,"_on_confirmed") 35 | FileDiag.connect("file_selected",self,"_on_file_selected") 36 | FileDiag.mode = 2 #Open directory mode 37 | FileDiag.access = 2 #Can access all directories 38 | 39 | 40 | func _process(delta): 41 | Panel.rect_size.x = rect_size.x 42 | Panel.rect_size.y = rect_size.y 43 | Panel.rect_position.x = 0 44 | Panel.rect_position.y = 0 45 | 46 | if import_timer > 0: #Begin stage 2 of importing 47 | import_timer -= 1 48 | if import_timer == 0: 49 | if FileDiag_mode == 1: #Importing loose 50 | FileDiag_mode = 2 51 | if FileDiag_mode == 4: #Importing zip 52 | FileDiag_mode = 5 53 | 54 | FileDiag_show() 55 | FileDiag.access = 1 #Only user data 56 | 57 | 58 | var tar = ProjectSettings.globalize_path("user://library") 59 | if !Dir.dir_exists(tar): #Making sure library exists 60 | Dir.make_dir(tar) 61 | 62 | FileDiag.current_dir = tar 63 | FileDiag.window_title = "Select the import target location" 64 | 65 | 66 | func _input(event): 67 | if event is InputEventMouseButton: 68 | #Show context menu 69 | if event.button_index == BUTTON_RIGHT and event.pressed and not event.is_echo(): 70 | visible = true 71 | rect_position.x = get_viewport().get_mouse_position().x 72 | rect_position.y = get_viewport().get_mouse_position().y 73 | #Hide context menu 74 | if event.button_index == BUTTON_LEFT and event.pressed and not event.is_echo() and\ 75 | mouse_in_rect(rect_position.x, rect_position.y, rect_position.x + rect_size.x, rect_position.y + rect_size.y) == false: 76 | 77 | visible = false 78 | 79 | 80 | func _on_ButLoad_pressed(): #Prepare to load a manga from our library 81 | hide() 82 | FileDiag_show() 83 | FileDiag.mode = 2 #Open directory mode 84 | FileDiag.access = 1 85 | FileDiag_mode = 0 86 | FileDiag.current_dir = ProjectSettings.globalize_path("user://library") 87 | FileDiag.window_title = "Load from library" 88 | 89 | func _on_ButImport_pressed(): #Import a manga 90 | hide() 91 | FileDiag_show() 92 | FileDiag.access = 2 #Filesystem 93 | FileDiag_mode = 1 94 | FileDiag.window_title = "Load an import source" 95 | 96 | func _on_ButImportZIP_pressed(): 97 | FileDiag_show() 98 | FileDiag.access = 2 #Filesystem 99 | FileDiag_mode = 4 100 | FileDiag.window_title = "Load the folder with .CBRs, .CBZs,. ZIPs, etc." 101 | hide() 102 | 103 | func _on_ButDirectory_pressed(): 104 | hide() 105 | OS.shell_open(ProjectSettings.globalize_path("user://library")) 106 | 107 | 108 | func _on_ButJump_pressed(): 109 | hide() 110 | UI.Jump_toggle() 111 | 112 | func _on_ButSettings_pressed(): 113 | hide() 114 | Settings.show() 115 | 116 | func _on_confirmed(): 117 | if FileDiag_mode == 0: #Load new manga from library 118 | Main.settings_save_page() 119 | Main.reset() 120 | Main.cur_dir = ProjectSettings.globalize_path(FileDiag.current_dir) 121 | SourceLoader.source_load(ProjectSettings.globalize_path(FileDiag.current_dir)) 122 | 123 | if FileDiag_mode == 1: #Import loose source 124 | import_source = ProjectSettings.globalize_path(FileDiag.current_dir) 125 | import_timer = 20 #Slight delay before showing FileDiag again 126 | 127 | if FileDiag_mode == 4: #Import in zip form 128 | import_source = ProjectSettings.globalize_path(FileDiag.current_dir) 129 | import_timer = 20 #Slight delay before showing FileDiag again 130 | 131 | if FileDiag_mode == 2: #Select loose import target, begin importing 132 | SourceLoader.source_import_start(import_source, ProjectSettings.globalize_path(FileDiag.current_dir)) 133 | 134 | if FileDiag_mode == 5: #Select zip import target, begin importing 135 | SourceLoader.source_import_zip_start(import_source, ProjectSettings.globalize_path(FileDiag.current_dir), 1) 136 | 137 | 138 | func hide(): #Hides context menu 139 | visible = false 140 | 141 | func mouse_in_rect(x1, y1, x2, y2): 142 | #x1, y1 = top left coordinates of rect. x2, y2 = bottom right 143 | var mouse_x = get_viewport().get_mouse_position().x 144 | var mouse_y = get_viewport().get_mouse_position().y 145 | 146 | if mouse_x > x1 and mouse_y > y1 and mouse_x < x2 and mouse_y < y2: 147 | return true 148 | else: 149 | return false 150 | 151 | func FileDiag_show(): 152 | FileDiag.popup() 153 | FileDiag.rect_position.x = OS.get_screen_size().x/2 - FileDiag.rect_size.x/2 154 | FileDiag.rect_position.y = OS.get_screen_size().y/2 - FileDiag.rect_size.y/2 155 | -------------------------------------------------------------------------------- /ui/Messenger/Message.gd: -------------------------------------------------------------------------------- 1 | extends PanelContainer 2 | 3 | var time: int 4 | var text = '' 5 | var countdown_initial = -1 #Countdown before actual timer starts 6 | var countdown_destruction = -1 #Destroy once this hits 0 7 | var destroy_emitted = 0 #Destroy signal emitted 8 | 9 | signal destroy_me 10 | 11 | onready var Bar = get_node("VBox/ProgressBar") 12 | 13 | # Called when the node enters the scene tree for the first time. 14 | func init(): 15 | get_node("VBox/MarginContainer/RichTextLabel").bbcode_text = text 16 | Bar.max_value = time 17 | Bar.value = time 18 | 19 | # Called every frame. 'delta' is the elapsed time since the previous frame. 20 | func _process(delta): 21 | if time <= 0 and destroy_emitted == 0: 22 | emit_signal("destroy_me") 23 | destroy_emitted = 1 24 | elif countdown_initial <= 0: 25 | time -= 1 26 | Bar.value = time 27 | 28 | if countdown_destruction > 0: 29 | countdown_destruction -= 1 30 | 31 | if countdown_initial > 0: 32 | countdown_initial -= 1 33 | 34 | if countdown_destruction == 0: 35 | queue_free() 36 | 37 | 38 | 39 | 40 | 41 | -------------------------------------------------------------------------------- /ui/Messenger/Message.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=6 format=2] 2 | 3 | [ext_resource path="res://ui/themes/LL18.tres" type="DynamicFont" id=1] 4 | [ext_resource path="res://ui/Messenger/Message.gd" type="Script" id=2] 5 | 6 | [sub_resource type="StyleBoxFlat" id=3] 7 | bg_color = Color( 0.2, 0.2, 0.2, 0.784314 ) 8 | corner_radius_top_left = 8 9 | corner_radius_top_right = 8 10 | corner_radius_bottom_right = 8 11 | corner_radius_bottom_left = 8 12 | 13 | [sub_resource type="StyleBoxFlat" id=1] 14 | bg_color = Color( 0.156863, 0.305882, 0.529412, 1 ) 15 | corner_radius_bottom_right = 8 16 | corner_radius_bottom_left = 8 17 | 18 | [sub_resource type="StyleBoxFlat" id=2] 19 | bg_color = Color( 0.6, 0.6, 0.6, 0 ) 20 | 21 | [node name="Message" type="PanelContainer"] 22 | anchor_right = 1.0 23 | anchor_bottom = 1.0 24 | margin_left = 1519.33 25 | margin_top = 1029.17 26 | margin_right = -0.674561 27 | margin_bottom = -0.827148 28 | custom_styles/panel = SubResource( 3 ) 29 | script = ExtResource( 2 ) 30 | __meta__ = { 31 | "_edit_use_anchors_": false 32 | } 33 | 34 | [node name="VBox" type="VBoxContainer" parent="."] 35 | margin_right = 400.0 36 | margin_bottom = 50.0 37 | 38 | [node name="MarginContainer" type="MarginContainer" parent="VBox"] 39 | margin_right = 400.0 40 | margin_bottom = 34.0 41 | size_flags_horizontal = 3 42 | size_flags_vertical = 3 43 | custom_constants/margin_right = 6 44 | custom_constants/margin_top = 4 45 | custom_constants/margin_left = 6 46 | custom_constants/margin_bottom = 0 47 | 48 | [node name="RichTextLabel" type="RichTextLabel" parent="VBox/MarginContainer"] 49 | margin_left = 6.0 50 | margin_top = 4.0 51 | margin_right = 394.0 52 | margin_bottom = 34.0 53 | custom_fonts/normal_font = ExtResource( 1 ) 54 | 55 | [node name="ProgressBar" type="ProgressBar" parent="VBox"] 56 | margin_top = 42.0 57 | margin_right = 400.0 58 | margin_bottom = 50.0 59 | rect_min_size = Vector2( 0, 8 ) 60 | custom_styles/fg = SubResource( 1 ) 61 | custom_styles/bg = SubResource( 2 ) 62 | percent_visible = false 63 | -------------------------------------------------------------------------------- /ui/Messenger/Messenger.gd: -------------------------------------------------------------------------------- 1 | extends Node 2 | 3 | onready var Message = preload("res://ui/Messenger/Message.tscn") 4 | onready var Tween = get_node("/root/Main/Tween") #This is a dependency. 5 | 6 | var message_queue: Array #Current displayed messages 7 | var message_gap = 16 #Space between messages 8 | var message_max = 3 #Max number of messages 9 | var message_count = 0 #Current number of messages 10 | var message_life = 120 #How long they should stay 11 | var message_timer_arr: Array #Holds timer info for all messages 12 | var message_alpha = .8 #Maximum alpha value 13 | var message_offset_y = 46 #How much to offset landing spot 14 | 15 | var screen_size = OS.get_screen_size() 16 | onready var window_width = screen_size.x 17 | onready var window_height = screen_size.y 18 | 19 | func _ready(): 20 | pass 21 | 22 | func message_send(text): 23 | 24 | var temp = Message.instance() 25 | add_child(temp) #load button into the right container 26 | var node_path = NodePath(get_path_to(temp)) #locate the newly created button 27 | temp = get_node(node_path) #get button 28 | 29 | var tween_dur = 1 30 | temp.rect_position.x = window_width - temp.rect_size.x - 1 31 | temp.rect_position.y = window_height + 16 32 | temp.modulate = Color(1, 1, 1, 0) 33 | message_queue.push_front(temp) 34 | temp.connect("destroy_me", self,"message_delete", [temp]) 35 | temp.time = message_life 36 | temp.countdown_initial = tween_dur * 60 37 | temp.text = str(text) 38 | temp.init() 39 | 40 | var tar_x = temp.rect_position.x 41 | var tar_y = window_height - temp.rect_size.y - message_gap - message_offset_y 42 | 43 | message_sort() 44 | global.Tween.interpolate_property(temp, "modulate",Color(1, 1, 1, 0), Color(1, 1, 1, message_alpha), tween_dur, global.Tween.TRANS_SINE, global.Tween.EASE_OUT) 45 | global.Tween.interpolate_property(temp, "rect_position", Vector2(temp.rect_position.x, temp.rect_position.y), Vector2(tar_x,tar_y), tween_dur, global.Tween.TRANS_SINE, global.Tween.EASE_OUT) 46 | global.Tween.start() 47 | 48 | func message_sort(): 49 | 50 | for i in message_queue: 51 | var index = message_queue.find(i) 52 | var size = message_queue.size() 53 | 54 | if index != 0: 55 | 56 | var tar_x = i.rect_position.x 57 | var tar_y = window_height - ((i.rect_size.y + message_gap) * (index + 1)) - message_offset_y 58 | 59 | global.Tween.interpolate_property(i, "rect_position", Vector2(i.rect_position.x, i.rect_position.y), Vector2(tar_x,tar_y), 1.5, global.Tween.TRANS_SINE, global.Tween.EASE_OUT) 60 | global.Tween.start() 61 | 62 | func message_delete(message): 63 | var tween_dur = .5 64 | message.countdown_destruction = 60 * tween_dur 65 | message_queue.remove(message_queue.find(message)) 66 | global.Tween.interpolate_property(message, "modulate",Color(1, 1, 1, message_alpha), Color(1, 1, 1, 0), tween_dur, global.Tween.TRANS_SINE, global.Tween.EASE_OUT) 67 | global.Tween.start() 68 | 69 | func _on_tween_completed(obj, node): 70 | pass 71 | #Can figure out how this works later 72 | #print(obj) 73 | #print(node) 74 | -------------------------------------------------------------------------------- /ui/Popup/FileDialog.gd: -------------------------------------------------------------------------------- 1 | extends FileDialog 2 | 3 | var signal_tar = "../" 4 | 5 | 6 | # Called when the node enters the scene tree for the first time. 7 | func _ready(): 8 | pass 9 | 10 | func init(): 11 | #self.connect("dir_selected",get_node(signal_tar),"_on_dir_selected",[self]) #Connect to parent 12 | self.connect("confirmed",get_node(signal_tar),"_on_confirmed",[self]) #Connect to parent 13 | self.connect("file_selected",get_node(signal_tar),"_on_file_selected",[self]) #Connect to parent 14 | 15 | # Called every frame. 'delta' is the elapsed time since the previous frame. 16 | #func _process(delta): 17 | # pass 18 | -------------------------------------------------------------------------------- /ui/Popup/Popup.gd: -------------------------------------------------------------------------------- 1 | extends Control 2 | 3 | 4 | func _ready(): 5 | rect_size.x = OS.get_screen_size().x 6 | rect_size.y = OS.get_screen_size().y 7 | 8 | 9 | # Called every frame. 'delta' is the elapsed time since the previous frame. 10 | #func _process(delta): 11 | # pass 12 | -------------------------------------------------------------------------------- /ui/Settings/Settings.gd: -------------------------------------------------------------------------------- 1 | extends Control 2 | 3 | onready var Main = get_node("/root/Main") 4 | 5 | onready var General = get_node("Margin/VBox/Body/Right/General") 6 | onready var Background = get_node("Margin/VBox/Body/Right/Background") 7 | onready var Floater = get_node("Floater") 8 | 9 | #Left submenu 10 | onready var ButGeneral = get_node("Margin/VBox/Body/Left/ButGeneral") 11 | onready var ButBG = get_node("Margin/VBox/Body/Left/ButBG") 12 | 13 | #General 14 | onready var CheckAuto = get_node("Margin/VBox/Body/Right/General/CheckAuto") 15 | onready var CheckFull = get_node("Margin/VBox/Body/Right/General/CheckFull") 16 | onready var CheckDebug = get_node("Margin/VBox/Body/Right/General/CheckDebug") 17 | 18 | #BG 19 | onready var LabelH = get_node("Margin/VBox/Body/Right/Background/H3") 20 | onready var SliderH = get_node("Margin/VBox/Body/Right/Background/H2") 21 | onready var LabelS = get_node("Margin/VBox/Body/Right/Background/S3") 22 | onready var SliderS = get_node("Margin/VBox/Body/Right/Background/S2") 23 | onready var LabelV = get_node("Margin/VBox/Body/Right/Background/V3") 24 | onready var SliderV = get_node("Margin/VBox/Body/Right/Background/V2") 25 | 26 | onready var ButClose = get_node("Margin/VBox/Accept/ButClose") 27 | 28 | func _ready(): 29 | CheckAuto.rect_scale.x = .8 30 | CheckAuto.rect_scale.y = .8 31 | CheckAuto.rect_position.y += 4 32 | CheckFull.rect_scale.x = .8 33 | CheckFull.rect_scale.y = .8 34 | CheckFull.rect_position.y += 4 35 | CheckDebug.rect_scale.x = .8 36 | CheckDebug.rect_scale.y = .8 37 | CheckDebug.rect_position.y += 4 38 | 39 | CheckAuto.connect("pressed", self, "_on_CheckAuto_updated") 40 | CheckFull.connect("pressed", self, "_on_CheckFull_updated") 41 | CheckDebug.connect("pressed", self, "_on_CheckDebug_updated") 42 | ButGeneral.connect("pressed", self, "_on_Left_updated", [0]) 43 | ButBG.connect("pressed", self, "_on_Left_updated", [1]) 44 | ButClose.connect("pressed", self, "hide") 45 | SliderH.connect("value_changed", self, "_on_BGColor_updated", [SliderH]) 46 | SliderS.connect("value_changed", self, "_on_BGColor_updated", [SliderS]) 47 | SliderV.connect("value_changed", self, "_on_BGColor_updated", [SliderV]) 48 | 49 | 50 | # Called every frame. 'delta' is the elapsed time since the previous frame. 51 | func _process(delta): 52 | if modulate == Color(1, 1, 1, 0) and visible == true: 53 | visible = false 54 | 55 | if Background.visible == true: 56 | LabelH.text = str(SliderH.value) 57 | LabelS.text = str(SliderS.value) 58 | LabelV.text = str(SliderV.value) 59 | 60 | func _on_CheckAuto_updated(): 61 | global.settings["General"]["autoload"] = !global.settings["General"]["autoload"] 62 | Main.settings_save() 63 | 64 | func _on_CheckFull_updated(): 65 | global.settings["General"]["fullscreen"] = !global.settings["General"]["fullscreen"] 66 | Main.set_fullscreen() 67 | Main.settings_save() 68 | 69 | func _on_CheckDebug_updated(): 70 | global.settings["General"]["debug_overlay"] = !global.settings["General"]["debug_overlay"] 71 | Main.set_debug_overlay() 72 | Main.settings_save() 73 | 74 | func _on_BGColor_updated(value , obj): 75 | match obj: 76 | SliderH: 77 | global.settings["BG"]["color"]["h"] = SliderH.value 78 | SliderS: 79 | global.settings["BG"]["color"]["s"] = SliderS.value 80 | SliderV: 81 | global.settings["BG"]["color"]["v"] = SliderV.value 82 | 83 | Main.set_bg_color(SliderH.value, SliderS.value, SliderV.value) 84 | Main.settings_save() 85 | 86 | 87 | func _on_Left_updated(arr): #Left hand tab menu 88 | General.visible = false 89 | Background.visible = false 90 | 91 | match arr: 92 | 0: 93 | General.visible = true 94 | 1: 95 | Background.visible = true 96 | 97 | func show(): 98 | visible = true 99 | global.Tween.interpolate_property(self, "modulate",Color(1, 1, 1, 0), Color(1, 1, 1, .9), .5, global.Tween.TRANS_CUBIC, global.Tween.EASE_OUT) 100 | global.Tween.start() 101 | 102 | CheckAuto.pressed = global.settings["General"]["autoload"] 103 | CheckFull.pressed = global.settings["General"]["fullscreen"] 104 | CheckDebug.pressed = global.settings["General"]["debug_overlay"] 105 | 106 | SliderH.value = global.settings["BG"]["color"]["h"] 107 | SliderS.value = global.settings["BG"]["color"]["s"] 108 | SliderV.value = global.settings["BG"]["color"]["v"] 109 | 110 | 111 | rect_position.x = OS.get_screen_size().x/2 - rect_size.x/2 112 | rect_position.y = OS.get_screen_size().y/2 - rect_size.y/2 113 | General.visible = true 114 | Background.visible = false 115 | 116 | func hide(): 117 | global.Tween.interpolate_property(self, "modulate",Color(1, 1, 1, 0.9), Color(1, 1, 1, 0), .5, global.Tween.TRANS_CUBIC, global.Tween.EASE_OUT) 118 | global.Tween.start() 119 | global.Mes.message_send("settings saved") 120 | -------------------------------------------------------------------------------- /ui/Starter/Starter.gd: -------------------------------------------------------------------------------- 1 | extends Control 2 | 3 | onready var MenuContext = get_node("/root/Main/Popup/MenuContext") 4 | onready var ButLoad = get_node("Margin/VBox/HBox/VBox1/ButLoad") 5 | onready var ButImportZIP = get_node("Margin/VBox/HBox/VBox3/ButImportZIP") 6 | onready var ButAbout = get_node("Margin/VBox/HBox2/VBox2/ButAbout") 7 | onready var ButImport = get_node("Margin/VBox/HBox/VBox2/ButImport") 8 | onready var ButSettings = get_node("Margin/VBox/HBox2/VBox/ButSettings") 9 | onready var TexAll = get_node("/root/Main/TexAll") 10 | onready var About = get_node("/root/Main/Popup/About") 11 | 12 | #Icons are at 50% opacity, with white -> black gradient at 90 degrees @ 30% opacity, 128x128 13 | 14 | func _ready(): 15 | ButLoad.connect("pressed",self,"_on_ButLoad_pressed") 16 | ButImport.connect("pressed",self,"_on_ButImport_pressed") 17 | ButSettings.connect("pressed",self,"_on_ButSettings_pressed") 18 | ButImportZIP.connect("pressed",self,"_on_ButImportZIP_pressed") 19 | ButAbout.connect("pressed",self,"_on_ButAbout_pressed") 20 | 21 | func _process(delta): 22 | if modulate == Color(1, 1, 1, 0) and visible == true: 23 | visible = false 24 | queue_free() 25 | 26 | if TexAll.get_children().size() == 0 and visible == false: 27 | show() 28 | 29 | if visible == true and TexAll.get_children().size() > 0 and modulate == Color(1, 1, 1, .9): 30 | hide() 31 | 32 | func hide(): 33 | global.Tween.interpolate_property(self, "modulate",Color(1, 1, 1, .9), Color(1, 1, 1, 0), .5, global.Tween.TRANS_CUBIC, global.Tween.EASE_OUT) 34 | global.Tween.start() 35 | 36 | func show(): 37 | visible = true 38 | rect_position.x = OS.get_screen_size().x/2 - rect_size.x/2 39 | rect_position.y = OS.get_screen_size().y/2 - rect_size.y/2 40 | global.Tween.interpolate_property(self, "modulate",Color(1, 1, 1, 0), Color(1, 1, 1, .9), .5, global.Tween.TRANS_CUBIC, global.Tween.EASE_OUT) 41 | global.Tween.start() 42 | 43 | 44 | 45 | func _on_ButLoad_pressed(): 46 | MenuContext._on_ButLoad_pressed() 47 | 48 | func _on_ButImport_pressed(): 49 | MenuContext._on_ButImport_pressed() 50 | 51 | func _on_ButSettings_pressed(): 52 | MenuContext._on_ButSettings_pressed() 53 | 54 | func _on_ButImportZIP_pressed(): 55 | MenuContext._on_ButImportZIP_pressed() 56 | 57 | func _on_ButAbout_pressed(): 58 | About.toggle() 59 | 60 | -------------------------------------------------------------------------------- /ui/splash/go·reader_icon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sirosky/go-reader/a5c765d8459591ea3d40dd5f4555c7f72819a2d7/ui/splash/go·reader_icon.ico -------------------------------------------------------------------------------- /ui/splash/go·reader_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sirosky/go-reader/a5c765d8459591ea3d40dd5f4555c7f72819a2d7/ui/splash/go·reader_icon.png -------------------------------------------------------------------------------- /ui/splash/go·reader_icon.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/go·reader_icon.png-eb6b9ff4d4880172aafde9a9124d4451.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://ui/splash/go·reader_icon.png" 13 | dest_files=[ "res://.import/go·reader_icon.png-eb6b9ff4d4880172aafde9a9124d4451.stex" ] 14 | 15 | [params] 16 | 17 | compress/mode=0 18 | compress/lossy_quality=0.7 19 | compress/hdr_mode=0 20 | compress/bptc_ldr=0 21 | compress/normal_map=0 22 | flags/repeat=0 23 | flags/filter=true 24 | flags/mipmaps=false 25 | flags/anisotropic=false 26 | flags/srgb=2 27 | process/fix_alpha_border=true 28 | process/premult_alpha=false 29 | process/HDR_as_SRGB=false 30 | process/invert_color=false 31 | stream=false 32 | size_limit=0 33 | detect_3d=true 34 | svg/scale=1.0 35 | -------------------------------------------------------------------------------- /ui/splash/go·reader_splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sirosky/go-reader/a5c765d8459591ea3d40dd5f4555c7f72819a2d7/ui/splash/go·reader_splash.png -------------------------------------------------------------------------------- /ui/splash/go·reader_splash.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/go·reader_splash.png-acb6638996070732d2856e7966027ea4.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://ui/splash/go·reader_splash.png" 13 | dest_files=[ "res://.import/go·reader_splash.png-acb6638996070732d2856e7966027ea4.stex" ] 14 | 15 | [params] 16 | 17 | compress/mode=0 18 | compress/lossy_quality=0.7 19 | compress/hdr_mode=0 20 | compress/bptc_ldr=0 21 | compress/normal_map=0 22 | flags/repeat=0 23 | flags/filter=true 24 | flags/mipmaps=false 25 | flags/anisotropic=false 26 | flags/srgb=2 27 | process/fix_alpha_border=true 28 | process/premult_alpha=false 29 | process/HDR_as_SRGB=false 30 | process/invert_color=false 31 | stream=false 32 | size_limit=0 33 | detect_3d=true 34 | svg/scale=1.0 35 | -------------------------------------------------------------------------------- /ui/themes/LL12.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="DynamicFont" load_steps=2 format=2] 2 | 3 | [ext_resource path="res://ui/themes/Lato-Light.ttf" type="DynamicFontData" id=1] 4 | 5 | [resource] 6 | size = 12 7 | font_data = ExtResource( 1 ) 8 | -------------------------------------------------------------------------------- /ui/themes/LL16.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="DynamicFont" load_steps=2 format=2] 2 | 3 | [ext_resource path="res://ui/themes/Lato-Light.ttf" type="DynamicFontData" id=1] 4 | 5 | [resource] 6 | font_data = ExtResource( 1 ) 7 | -------------------------------------------------------------------------------- /ui/themes/LL18.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="DynamicFont" load_steps=2 format=2] 2 | 3 | [ext_resource path="res://ui/themes/Lato-Light.ttf" type="DynamicFontData" id=1] 4 | 5 | [resource] 6 | size = 18 7 | font_data = ExtResource( 1 ) 8 | -------------------------------------------------------------------------------- /ui/themes/LL20.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="DynamicFont" load_steps=2 format=2] 2 | 3 | [ext_resource path="res://ui/themes/Lato-Light.ttf" type="DynamicFontData" id=1] 4 | 5 | [resource] 6 | size = 20 7 | font_data = ExtResource( 1 ) 8 | -------------------------------------------------------------------------------- /ui/themes/LL24.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="DynamicFont" load_steps=2 format=2] 2 | 3 | [ext_resource path="res://ui/themes/Lato-Light.ttf" type="DynamicFontData" id=1] 4 | 5 | [resource] 6 | size = 24 7 | font_data = ExtResource( 1 ) 8 | -------------------------------------------------------------------------------- /ui/themes/LL32.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="DynamicFont" load_steps=2 format=2] 2 | 3 | [ext_resource path="res://ui/themes/Lato-Light.ttf" type="DynamicFontData" id=1] 4 | 5 | [resource] 6 | size = 32 7 | font_data = ExtResource( 1 ) 8 | -------------------------------------------------------------------------------- /ui/themes/LL48.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="DynamicFont" load_steps=2 format=2] 2 | 3 | [ext_resource path="res://ui/themes/Lato-Light.ttf" type="DynamicFontData" id=1] 4 | 5 | [resource] 6 | size = 48 7 | font_data = ExtResource( 1 ) 8 | -------------------------------------------------------------------------------- /ui/themes/LLPage.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="DynamicFont" load_steps=2 format=2] 2 | 3 | [ext_resource path="res://ui/themes/Lato-Light.ttf" type="DynamicFontData" id=1] 4 | 5 | [resource] 6 | size = 28 7 | outline_size = 2 8 | outline_color = Color( 0.00784314, 0.0117647, 0.105882, 1 ) 9 | font_data = ExtResource( 1 ) 10 | -------------------------------------------------------------------------------- /ui/themes/Lato-Light.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sirosky/go-reader/a5c765d8459591ea3d40dd5f4555c7f72819a2d7/ui/themes/Lato-Light.ttf -------------------------------------------------------------------------------- /ui/themes/Lato-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sirosky/go-reader/a5c765d8459591ea3d40dd5f4555c7f72819a2d7/ui/themes/Lato-Regular.ttf -------------------------------------------------------------------------------- /ui/themes/icons/go·reader_splash.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/go·reader_splash.png-4d1f570c2cbda57ac4a6eca037bb1969.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://ui/themes/icons/go·reader_splash.png" 13 | dest_files=[ "res://.import/go·reader_splash.png-4d1f570c2cbda57ac4a6eca037bb1969.stex" ] 14 | 15 | [params] 16 | 17 | compress/mode=0 18 | compress/lossy_quality=0.7 19 | compress/hdr_mode=0 20 | compress/bptc_ldr=0 21 | compress/normal_map=0 22 | flags/repeat=0 23 | flags/filter=true 24 | flags/mipmaps=false 25 | flags/anisotropic=false 26 | flags/srgb=2 27 | process/fix_alpha_border=true 28 | process/premult_alpha=false 29 | process/HDR_as_SRGB=false 30 | process/invert_color=false 31 | stream=false 32 | size_limit=0 33 | detect_3d=true 34 | svg/scale=1.0 35 | -------------------------------------------------------------------------------- /ui/themes/icons/ico_about.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sirosky/go-reader/a5c765d8459591ea3d40dd5f4555c7f72819a2d7/ui/themes/icons/ico_about.png -------------------------------------------------------------------------------- /ui/themes/icons/ico_about.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/ico_about.png-667c34807e99eec68409107a3ca21ecb.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://ui/themes/icons/ico_about.png" 13 | dest_files=[ "res://.import/ico_about.png-667c34807e99eec68409107a3ca21ecb.stex" ] 14 | 15 | [params] 16 | 17 | compress/mode=0 18 | compress/lossy_quality=0.7 19 | compress/hdr_mode=0 20 | compress/bptc_ldr=0 21 | compress/normal_map=0 22 | flags/repeat=0 23 | flags/filter=true 24 | flags/mipmaps=false 25 | flags/anisotropic=false 26 | flags/srgb=2 27 | process/fix_alpha_border=true 28 | process/premult_alpha=false 29 | process/HDR_as_SRGB=false 30 | process/invert_color=false 31 | stream=false 32 | size_limit=0 33 | detect_3d=true 34 | svg/scale=1.0 35 | -------------------------------------------------------------------------------- /ui/themes/icons/ico_ebook.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sirosky/go-reader/a5c765d8459591ea3d40dd5f4555c7f72819a2d7/ui/themes/icons/ico_ebook.png -------------------------------------------------------------------------------- /ui/themes/icons/ico_ebook.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/ico_ebook.png-3f7e9d135ae3e31620ad49e41803f87d.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://ui/themes/icons/ico_ebook.png" 13 | dest_files=[ "res://.import/ico_ebook.png-3f7e9d135ae3e31620ad49e41803f87d.stex" ] 14 | 15 | [params] 16 | 17 | compress/mode=0 18 | compress/lossy_quality=0.7 19 | compress/hdr_mode=0 20 | compress/bptc_ldr=0 21 | compress/normal_map=0 22 | flags/repeat=0 23 | flags/filter=true 24 | flags/mipmaps=false 25 | flags/anisotropic=false 26 | flags/srgb=2 27 | process/fix_alpha_border=true 28 | process/premult_alpha=false 29 | process/HDR_as_SRGB=false 30 | process/invert_color=false 31 | stream=false 32 | size_limit=0 33 | detect_3d=true 34 | svg/scale=1.0 35 | -------------------------------------------------------------------------------- /ui/themes/icons/ico_import.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sirosky/go-reader/a5c765d8459591ea3d40dd5f4555c7f72819a2d7/ui/themes/icons/ico_import.png -------------------------------------------------------------------------------- /ui/themes/icons/ico_import.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/ico_import.png-f40a5467767134fc4b9427219fe8a893.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://ui/themes/icons/ico_import.png" 13 | dest_files=[ "res://.import/ico_import.png-f40a5467767134fc4b9427219fe8a893.stex" ] 14 | 15 | [params] 16 | 17 | compress/mode=0 18 | compress/lossy_quality=0.7 19 | compress/hdr_mode=0 20 | compress/bptc_ldr=0 21 | compress/normal_map=0 22 | flags/repeat=0 23 | flags/filter=true 24 | flags/mipmaps=false 25 | flags/anisotropic=false 26 | flags/srgb=2 27 | process/fix_alpha_border=true 28 | process/premult_alpha=false 29 | process/HDR_as_SRGB=false 30 | process/invert_color=false 31 | stream=false 32 | size_limit=0 33 | detect_3d=true 34 | svg/scale=1.0 35 | -------------------------------------------------------------------------------- /ui/themes/icons/ico_load.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sirosky/go-reader/a5c765d8459591ea3d40dd5f4555c7f72819a2d7/ui/themes/icons/ico_load.png -------------------------------------------------------------------------------- /ui/themes/icons/ico_load.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/ico_load.png-63691079baf62ef9054b56bd02795e02.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://ui/themes/icons/ico_load.png" 13 | dest_files=[ "res://.import/ico_load.png-63691079baf62ef9054b56bd02795e02.stex" ] 14 | 15 | [params] 16 | 17 | compress/mode=0 18 | compress/lossy_quality=0.7 19 | compress/hdr_mode=0 20 | compress/bptc_ldr=0 21 | compress/normal_map=0 22 | flags/repeat=0 23 | flags/filter=true 24 | flags/mipmaps=false 25 | flags/anisotropic=false 26 | flags/srgb=2 27 | process/fix_alpha_border=true 28 | process/premult_alpha=false 29 | process/HDR_as_SRGB=false 30 | process/invert_color=false 31 | stream=false 32 | size_limit=0 33 | detect_3d=true 34 | svg/scale=1.0 35 | -------------------------------------------------------------------------------- /ui/themes/icons/ico_settings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sirosky/go-reader/a5c765d8459591ea3d40dd5f4555c7f72819a2d7/ui/themes/icons/ico_settings.png -------------------------------------------------------------------------------- /ui/themes/icons/ico_settings.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/ico_settings.png-b04bb53a41ab12f2aedf2f7271911b66.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://ui/themes/icons/ico_settings.png" 13 | dest_files=[ "res://.import/ico_settings.png-b04bb53a41ab12f2aedf2f7271911b66.stex" ] 14 | 15 | [params] 16 | 17 | compress/mode=0 18 | compress/lossy_quality=0.7 19 | compress/hdr_mode=0 20 | compress/bptc_ldr=0 21 | compress/normal_map=0 22 | flags/repeat=0 23 | flags/filter=true 24 | flags/mipmaps=false 25 | flags/anisotropic=false 26 | flags/srgb=2 27 | process/fix_alpha_border=true 28 | process/premult_alpha=false 29 | process/HDR_as_SRGB=false 30 | process/invert_color=false 31 | stream=false 32 | size_limit=0 33 | detect_3d=true 34 | svg/scale=1.0 35 | -------------------------------------------------------------------------------- /ui/themes/sb_panel.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="StyleBoxFlat" format=2] 2 | 3 | [resource] 4 | bg_color = Color( 0.14902, 0.14902, 0.14902, 1 ) 5 | corner_radius_top_left = 8 6 | corner_radius_top_right = 8 7 | corner_radius_bottom_right = 8 8 | corner_radius_bottom_left = 8 9 | -------------------------------------------------------------------------------- /ui/themes/theme_context.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="Theme" load_steps=6 format=2] 2 | 3 | [ext_resource path="res://ui/themes/LL20.tres" type="DynamicFont" id=1] 4 | 5 | [sub_resource type="StyleBoxFlat" id=1] 6 | bg_color = Color( 0.6, 0.6, 0.6, 0 ) 7 | corner_radius_top_left = 4 8 | corner_radius_top_right = 4 9 | corner_radius_bottom_right = 4 10 | corner_radius_bottom_left = 4 11 | 12 | [sub_resource type="StyleBoxFlat" id=2] 13 | bg_color = Color( 0.156863, 0.305882, 0.529412, 1 ) 14 | corner_radius_top_left = 4 15 | corner_radius_top_right = 4 16 | corner_radius_bottom_right = 4 17 | corner_radius_bottom_left = 4 18 | 19 | [sub_resource type="StyleBoxFlat" id=3] 20 | bg_color = Color( 0.137255, 0.137255, 0.137255, 0 ) 21 | corner_radius_top_left = 4 22 | corner_radius_top_right = 4 23 | corner_radius_bottom_right = 4 24 | corner_radius_bottom_left = 4 25 | 26 | [sub_resource type="StyleBoxFlat" id=4] 27 | bg_color = Color( 0.141, 0.2726, 0.47, 1 ) 28 | corner_radius_top_left = 4 29 | corner_radius_top_right = 4 30 | corner_radius_bottom_right = 4 31 | corner_radius_bottom_left = 4 32 | 33 | [resource] 34 | default_font = ExtResource( 1 ) 35 | Button/colors/font_color = Color( 1, 1, 1, 1 ) 36 | Button/colors/font_color_disabled = Color( 1, 1, 1, 1 ) 37 | Button/colors/font_color_hover = Color( 1, 1, 1, 1 ) 38 | Button/colors/font_color_pressed = Color( 1, 1, 1, 1 ) 39 | Button/constants/hseparation = 4 40 | Button/fonts/font = null 41 | Button/styles/disabled = null 42 | Button/styles/focus = SubResource( 1 ) 43 | Button/styles/hover = SubResource( 2 ) 44 | Button/styles/normal = SubResource( 3 ) 45 | Button/styles/pressed = SubResource( 4 ) 46 | CheckBox/colors/font_color = Color( 0, 0, 0, 1 ) 47 | CheckBox/colors/font_color_disabled = Color( 0, 0, 0, 1 ) 48 | CheckBox/colors/font_color_hover = Color( 0, 0, 0, 1 ) 49 | CheckBox/colors/font_color_hover_pressed = Color( 0, 0, 0, 1 ) 50 | CheckBox/colors/font_color_pressed = Color( 0, 0, 0, 1 ) 51 | CheckBox/constants/check_vadjust = 0 52 | CheckBox/constants/hseparation = 8 53 | CheckBox/fonts/font = null 54 | CheckBox/icons/checked = null 55 | CheckBox/icons/radio_checked = null 56 | CheckBox/icons/radio_unchecked = null 57 | CheckBox/icons/unchecked = null 58 | CheckBox/styles/disabled = null 59 | CheckBox/styles/focus = null 60 | CheckBox/styles/hover = null 61 | CheckBox/styles/hover_pressed = null 62 | CheckBox/styles/normal = null 63 | CheckBox/styles/pressed = null 64 | CheckButton/colors/font_color = Color( 0, 0, 0, 1 ) 65 | CheckButton/colors/font_color_disabled = Color( 0, 0, 0, 1 ) 66 | CheckButton/colors/font_color_hover = Color( 0, 0, 0, 1 ) 67 | CheckButton/colors/font_color_hover_pressed = Color( 0, 0, 0, 1 ) 68 | CheckButton/colors/font_color_pressed = Color( 0, 0, 0, 1 ) 69 | CheckButton/constants/check_vadjust = 0 70 | CheckButton/constants/hseparation = 8 71 | CheckButton/fonts/font = null 72 | CheckButton/icons/off = null 73 | CheckButton/icons/off_disabled = null 74 | CheckButton/icons/on = null 75 | CheckButton/icons/on_disabled = null 76 | CheckButton/styles/disabled = null 77 | CheckButton/styles/focus = null 78 | CheckButton/styles/hover = null 79 | CheckButton/styles/hover_pressed = null 80 | CheckButton/styles/normal = null 81 | CheckButton/styles/pressed = null 82 | ColorPicker/constants/h_width = 60 83 | ColorPicker/constants/label_width = 20 84 | ColorPicker/constants/margin = 8 85 | ColorPicker/constants/sv_height = 512 86 | ColorPicker/constants/sv_width = 512 87 | ColorPicker/icons/add_preset = null 88 | ColorPicker/icons/color_hue = null 89 | ColorPicker/icons/color_sample = null 90 | ColorPicker/icons/overbright_indicator = null 91 | ColorPicker/icons/preset_bg = null 92 | ColorPicker/icons/screen_picker = null 93 | ColorPickerButton/colors/font_color = Color( 0, 0, 0, 1 ) 94 | ColorPickerButton/colors/font_color_disabled = Color( 0, 0, 0, 1 ) 95 | ColorPickerButton/colors/font_color_hover = Color( 0, 0, 0, 1 ) 96 | ColorPickerButton/colors/font_color_pressed = Color( 0, 0, 0, 1 ) 97 | ColorPickerButton/constants/hseparation = 4 98 | ColorPickerButton/fonts/font = null 99 | ColorPickerButton/icons/bg = null 100 | ColorPickerButton/styles/disabled = null 101 | ColorPickerButton/styles/focus = null 102 | ColorPickerButton/styles/hover = null 103 | ColorPickerButton/styles/normal = null 104 | ColorPickerButton/styles/pressed = null 105 | Dialogs/constants/button_margin = 64 106 | Dialogs/constants/margin = 16 107 | FileDialog/colors/file_icon_modulate = Color( 0, 0, 0, 1 ) 108 | FileDialog/colors/files_disabled = Color( 0, 0, 0, 1 ) 109 | FileDialog/colors/folder_icon_modulate = Color( 0, 0, 0, 1 ) 110 | FileDialog/icons/file = null 111 | FileDialog/icons/folder = null 112 | FileDialog/icons/parent_folder = null 113 | FileDialog/icons/reload = null 114 | FileDialog/icons/toggle_hidden = null 115 | Fonts/fonts/large = null 116 | Fonts/fonts/normal = null 117 | GraphEdit/colors/activity = Color( 0, 0, 0, 1 ) 118 | GraphEdit/colors/grid_major = Color( 0, 0, 0, 1 ) 119 | GraphEdit/colors/grid_minor = Color( 0, 0, 0, 1 ) 120 | GraphEdit/colors/selection_fill = Color( 0, 0, 0, 1 ) 121 | GraphEdit/colors/selection_stroke = Color( 0, 0, 0, 1 ) 122 | GraphEdit/constants/bezier_len_neg = 320 123 | GraphEdit/constants/bezier_len_pos = 160 124 | GraphEdit/constants/port_grab_distance_horizontal = 96 125 | GraphEdit/constants/port_grab_distance_vertical = 12 126 | GraphEdit/icons/minus = null 127 | GraphEdit/icons/more = null 128 | GraphEdit/icons/reset = null 129 | GraphEdit/icons/snap = null 130 | GraphEdit/styles/bg = null 131 | GraphNode/colors/close_color = Color( 0, 0, 0, 1 ) 132 | GraphNode/colors/resizer_color = Color( 0, 0, 0, 1 ) 133 | GraphNode/colors/title_color = Color( 0, 0, 0, 1 ) 134 | GraphNode/constants/close_offset = 36 135 | GraphNode/constants/port_offset = 6 136 | GraphNode/constants/separation = 2 137 | GraphNode/constants/title_offset = 40 138 | GraphNode/fonts/title_font = null 139 | GraphNode/icons/close = null 140 | GraphNode/icons/port = null 141 | GraphNode/icons/resizer = null 142 | GraphNode/styles/breakpoint = null 143 | GraphNode/styles/comment = null 144 | GraphNode/styles/commentfocus = null 145 | GraphNode/styles/defaultfocus = null 146 | GraphNode/styles/defaultframe = null 147 | GraphNode/styles/frame = null 148 | GraphNode/styles/position = null 149 | GraphNode/styles/selectedframe = null 150 | GridContainer/constants/hseparation = 8 151 | GridContainer/constants/vseparation = 8 152 | HBoxContainer/constants/separation = 8 153 | HScrollBar/icons/decrement = null 154 | HScrollBar/icons/decrement_highlight = null 155 | HScrollBar/icons/increment = null 156 | HScrollBar/icons/increment_highlight = null 157 | HScrollBar/styles/grabber = null 158 | HScrollBar/styles/grabber_highlight = null 159 | HScrollBar/styles/grabber_pressed = null 160 | HScrollBar/styles/scroll = null 161 | HScrollBar/styles/scroll_focus = null 162 | HSeparator/constants/separation = 8 163 | HSeparator/styles/separator = null 164 | HSlider/icons/grabber = null 165 | HSlider/icons/grabber_disabled = null 166 | HSlider/icons/grabber_highlight = null 167 | HSlider/icons/tick = null 168 | HSlider/styles/grabber_area = null 169 | HSlider/styles/grabber_area_highlight = null 170 | HSlider/styles/slider = null 171 | HSplitContainer/constants/autohide = 2 172 | HSplitContainer/constants/separation = 24 173 | HSplitContainer/icons/grabber = null 174 | HSplitContainer/styles/bg = null 175 | Icons/icons/close = null 176 | ItemList/colors/font_color = Color( 0, 0, 0, 1 ) 177 | ItemList/colors/font_color_selected = Color( 0, 0, 0, 1 ) 178 | ItemList/colors/guide_color = Color( 0, 0, 0, 1 ) 179 | ItemList/constants/hseparation = 4 180 | ItemList/constants/icon_margin = 4 181 | ItemList/constants/line_separation = 4 182 | ItemList/constants/vseparation = 2 183 | ItemList/fonts/font = null 184 | ItemList/styles/bg = null 185 | ItemList/styles/bg_focus = null 186 | ItemList/styles/cursor = null 187 | ItemList/styles/cursor_unfocused = null 188 | ItemList/styles/selected = null 189 | ItemList/styles/selected_focus = null 190 | Label/colors/font_color = Color( 0, 0, 0, 1 ) 191 | Label/colors/font_color_shadow = Color( 0, 0, 0, 1 ) 192 | Label/colors/font_outline_modulate = Color( 0, 0, 0, 1 ) 193 | Label/constants/line_spacing = 6 194 | Label/constants/shadow_as_outline = 0 195 | Label/constants/shadow_offset_x = 2 196 | Label/constants/shadow_offset_y = 2 197 | Label/fonts/font = null 198 | Label/styles/normal = null 199 | LineEdit/colors/clear_button_color = Color( 0, 0, 0, 1 ) 200 | LineEdit/colors/clear_button_color_pressed = Color( 0, 0, 0, 1 ) 201 | LineEdit/colors/cursor_color = Color( 0, 0, 0, 1 ) 202 | LineEdit/colors/font_color = Color( 0, 0, 0, 1 ) 203 | LineEdit/colors/font_color_selected = Color( 0, 0, 0, 1 ) 204 | LineEdit/colors/font_color_uneditable = Color( 0, 0, 0, 1 ) 205 | LineEdit/colors/selection_color = Color( 0, 0, 0, 1 ) 206 | LineEdit/constants/minimum_spaces = 24 207 | LineEdit/fonts/font = null 208 | LineEdit/icons/clear = null 209 | LineEdit/styles/focus = null 210 | LineEdit/styles/normal = null 211 | LineEdit/styles/read_only = null 212 | LinkButton/colors/font_color = Color( 0, 0, 0, 1 ) 213 | LinkButton/colors/font_color_hover = Color( 0, 0, 0, 1 ) 214 | LinkButton/colors/font_color_pressed = Color( 0, 0, 0, 1 ) 215 | LinkButton/constants/underline_spacing = 4 216 | LinkButton/fonts/font = null 217 | LinkButton/styles/focus = null 218 | MarginContainer/constants/margin_bottom = 0 219 | MarginContainer/constants/margin_left = 0 220 | MarginContainer/constants/margin_right = 0 221 | MarginContainer/constants/margin_top = 0 222 | MenuButton/colors/font_color = Color( 0, 0, 0, 1 ) 223 | MenuButton/colors/font_color_disabled = Color( 0, 0, 0, 1 ) 224 | MenuButton/colors/font_color_hover = Color( 0, 0, 0, 1 ) 225 | MenuButton/colors/font_color_pressed = Color( 0, 0, 0, 1 ) 226 | MenuButton/constants/hseparation = 6 227 | MenuButton/fonts/font = null 228 | MenuButton/styles/disabled = null 229 | MenuButton/styles/focus = null 230 | MenuButton/styles/hover = null 231 | MenuButton/styles/normal = null 232 | MenuButton/styles/pressed = null 233 | OptionButton/colors/font_color = Color( 0, 0, 0, 1 ) 234 | OptionButton/colors/font_color_disabled = Color( 0, 0, 0, 1 ) 235 | OptionButton/colors/font_color_hover = Color( 0, 0, 0, 1 ) 236 | OptionButton/colors/font_color_pressed = Color( 0, 0, 0, 1 ) 237 | OptionButton/constants/arrow_margin = 4 238 | OptionButton/constants/hseparation = 4 239 | OptionButton/fonts/font = null 240 | OptionButton/icons/arrow = null 241 | OptionButton/styles/disabled = null 242 | OptionButton/styles/focus = null 243 | OptionButton/styles/hover = null 244 | OptionButton/styles/normal = null 245 | OptionButton/styles/pressed = null 246 | Panel/styles/panel = null 247 | PanelContainer/styles/panel = null 248 | PopupDialog/styles/panel = null 249 | PopupMenu/colors/font_color = Color( 0, 0, 0, 1 ) 250 | PopupMenu/colors/font_color_accel = Color( 0, 0, 0, 1 ) 251 | PopupMenu/colors/font_color_disabled = Color( 0, 0, 0, 1 ) 252 | PopupMenu/colors/font_color_hover = Color( 0, 0, 0, 1 ) 253 | PopupMenu/constants/hseparation = 8 254 | PopupMenu/constants/vseparation = 8 255 | PopupMenu/fonts/font = null 256 | PopupMenu/icons/checked = null 257 | PopupMenu/icons/radio_checked = null 258 | PopupMenu/icons/radio_unchecked = null 259 | PopupMenu/icons/submenu = null 260 | PopupMenu/icons/unchecked = null 261 | PopupMenu/styles/hover = null 262 | PopupMenu/styles/labeled_separator_left = null 263 | PopupMenu/styles/labeled_separator_right = null 264 | PopupMenu/styles/panel = null 265 | PopupMenu/styles/panel_disabled = null 266 | PopupMenu/styles/separator = null 267 | PopupPanel/styles/panel = null 268 | ProgressBar/colors/font_color = Color( 0, 0, 0, 1 ) 269 | ProgressBar/colors/font_color_shadow = Color( 0, 0, 0, 1 ) 270 | ProgressBar/fonts/font = null 271 | ProgressBar/styles/bg = null 272 | ProgressBar/styles/fg = null 273 | RichTextLabel/colors/default_color = Color( 0, 0, 0, 1 ) 274 | RichTextLabel/colors/font_color_selected = Color( 0, 0, 0, 1 ) 275 | RichTextLabel/colors/font_color_shadow = Color( 0, 0, 0, 1 ) 276 | RichTextLabel/colors/selection_color = Color( 0, 0, 0, 1 ) 277 | RichTextLabel/constants/line_separation = 2 278 | RichTextLabel/constants/shadow_as_outline = 0 279 | RichTextLabel/constants/shadow_offset_x = 2 280 | RichTextLabel/constants/shadow_offset_y = 2 281 | RichTextLabel/constants/table_hseparation = 6 282 | RichTextLabel/constants/table_vseparation = 6 283 | RichTextLabel/fonts/bold_font = null 284 | RichTextLabel/fonts/bold_italics_font = null 285 | RichTextLabel/fonts/italics_font = null 286 | RichTextLabel/fonts/mono_font = null 287 | RichTextLabel/fonts/normal_font = null 288 | RichTextLabel/styles/focus = null 289 | RichTextLabel/styles/normal = null 290 | ScrollContainer/styles/bg = null 291 | SpinBox/icons/updown = null 292 | TabContainer/colors/font_color_bg = Color( 0, 0, 0, 1 ) 293 | TabContainer/colors/font_color_disabled = Color( 0, 0, 0, 1 ) 294 | TabContainer/colors/font_color_fg = Color( 0, 0, 0, 1 ) 295 | TabContainer/constants/hseparation = 8 296 | TabContainer/constants/label_valign_bg = 4 297 | TabContainer/constants/label_valign_fg = 0 298 | TabContainer/constants/side_margin = 16 299 | TabContainer/constants/top_margin = 48 300 | TabContainer/fonts/font = null 301 | TabContainer/icons/decrement = null 302 | TabContainer/icons/decrement_highlight = null 303 | TabContainer/icons/increment = null 304 | TabContainer/icons/increment_highlight = null 305 | TabContainer/icons/menu = null 306 | TabContainer/icons/menu_highlight = null 307 | TabContainer/styles/panel = null 308 | TabContainer/styles/tab_bg = null 309 | TabContainer/styles/tab_disabled = null 310 | TabContainer/styles/tab_fg = null 311 | Tabs/colors/font_color_bg = Color( 0, 0, 0, 1 ) 312 | Tabs/colors/font_color_disabled = Color( 0, 0, 0, 1 ) 313 | Tabs/colors/font_color_fg = Color( 0, 0, 0, 1 ) 314 | Tabs/constants/hseparation = 8 315 | Tabs/constants/label_valign_bg = 4 316 | Tabs/constants/label_valign_fg = 0 317 | Tabs/constants/top_margin = 48 318 | Tabs/fonts/font = null 319 | Tabs/icons/close = null 320 | Tabs/icons/decrement = null 321 | Tabs/icons/decrement_highlight = null 322 | Tabs/icons/increment = null 323 | Tabs/icons/increment_highlight = null 324 | Tabs/styles/button = null 325 | Tabs/styles/button_pressed = null 326 | Tabs/styles/panel = null 327 | Tabs/styles/tab_bg = null 328 | Tabs/styles/tab_disabled = null 329 | Tabs/styles/tab_fg = null 330 | TextEdit/colors/background_color = Color( 0, 0, 0, 1 ) 331 | TextEdit/colors/bookmark_color = Color( 0, 0, 0, 1 ) 332 | TextEdit/colors/brace_mismatch_color = Color( 0, 0, 0, 1 ) 333 | TextEdit/colors/breakpoint_color = Color( 0, 0, 0, 1 ) 334 | TextEdit/colors/caret_background_color = Color( 0, 0, 0, 1 ) 335 | TextEdit/colors/caret_color = Color( 0, 0, 0, 1 ) 336 | TextEdit/colors/code_folding_color = Color( 0, 0, 0, 1 ) 337 | TextEdit/colors/completion_background_color = Color( 0, 0, 0, 1 ) 338 | TextEdit/colors/completion_existing_color = Color( 0, 0, 0, 1 ) 339 | TextEdit/colors/completion_font_color = Color( 0, 0, 0, 1 ) 340 | TextEdit/colors/completion_scroll_color = Color( 0, 0, 0, 1 ) 341 | TextEdit/colors/completion_selected_color = Color( 0, 0, 0, 1 ) 342 | TextEdit/colors/current_line_color = Color( 0, 0, 0, 1 ) 343 | TextEdit/colors/executing_line_color = Color( 0, 0, 0, 1 ) 344 | TextEdit/colors/font_color = Color( 0, 0, 0, 1 ) 345 | TextEdit/colors/font_color_readonly = Color( 0, 0, 0, 1 ) 346 | TextEdit/colors/font_color_selected = Color( 0, 0, 0, 1 ) 347 | TextEdit/colors/function_color = Color( 0, 0, 0, 1 ) 348 | TextEdit/colors/line_number_color = Color( 0, 0, 0, 1 ) 349 | TextEdit/colors/mark_color = Color( 0, 0, 0, 1 ) 350 | TextEdit/colors/member_variable_color = Color( 0, 0, 0, 1 ) 351 | TextEdit/colors/number_color = Color( 0, 0, 0, 1 ) 352 | TextEdit/colors/safe_line_number_color = Color( 0, 0, 0, 1 ) 353 | TextEdit/colors/selection_color = Color( 0, 0, 0, 1 ) 354 | TextEdit/colors/symbol_color = Color( 0, 0, 0, 1 ) 355 | TextEdit/colors/word_highlighted_color = Color( 0, 0, 0, 1 ) 356 | TextEdit/constants/completion_lines = 7 357 | TextEdit/constants/completion_max_width = 50 358 | TextEdit/constants/completion_scroll_width = 3 359 | TextEdit/constants/line_spacing = 8 360 | TextEdit/fonts/font = null 361 | TextEdit/icons/fold = null 362 | TextEdit/icons/folded = null 363 | TextEdit/icons/space = null 364 | TextEdit/icons/tab = null 365 | TextEdit/styles/completion = null 366 | TextEdit/styles/focus = null 367 | TextEdit/styles/normal = null 368 | TextEdit/styles/read_only = null 369 | ToolButton/colors/font_color = Color( 0, 0, 0, 1 ) 370 | ToolButton/colors/font_color_disabled = Color( 0, 0, 0, 1 ) 371 | ToolButton/colors/font_color_hover = Color( 0, 0, 0, 1 ) 372 | ToolButton/colors/font_color_pressed = Color( 0, 0, 0, 1 ) 373 | ToolButton/constants/hseparation = 3 374 | ToolButton/fonts/font = null 375 | ToolButton/styles/disabled = null 376 | ToolButton/styles/focus = null 377 | ToolButton/styles/hover = null 378 | ToolButton/styles/normal = null 379 | ToolButton/styles/pressed = null 380 | TooltipLabel/colors/font_color = Color( 0, 0, 0, 1 ) 381 | TooltipLabel/colors/font_color_shadow = Color( 0, 0, 0, 1 ) 382 | TooltipLabel/constants/shadow_offset_x = 1 383 | TooltipLabel/constants/shadow_offset_y = 1 384 | TooltipLabel/fonts/font = null 385 | TooltipPanel/styles/panel = null 386 | Tree/colors/custom_button_font_highlight = Color( 0, 0, 0, 1 ) 387 | Tree/colors/drop_position_color = Color( 0, 0, 0, 1 ) 388 | Tree/colors/font_color = Color( 0, 0, 0, 1 ) 389 | Tree/colors/font_color_selected = Color( 0, 0, 0, 1 ) 390 | Tree/colors/guide_color = Color( 0, 0, 0, 1 ) 391 | Tree/colors/relationship_line_color = Color( 0, 0, 0, 1 ) 392 | Tree/colors/title_button_color = Color( 0, 0, 0, 1 ) 393 | Tree/constants/button_margin = 8 394 | Tree/constants/draw_guides = 1 395 | Tree/constants/draw_relationship_lines = 0 396 | Tree/constants/hseparation = 8 397 | Tree/constants/item_margin = 24 398 | Tree/constants/scroll_border = 4 399 | Tree/constants/scroll_speed = 12 400 | Tree/constants/vseparation = 8 401 | Tree/fonts/font = null 402 | Tree/fonts/title_button_font = null 403 | Tree/icons/arrow = null 404 | Tree/icons/arrow_collapsed = null 405 | Tree/icons/checked = null 406 | Tree/icons/select_arrow = null 407 | Tree/icons/unchecked = null 408 | Tree/icons/updown = null 409 | Tree/styles/bg = null 410 | Tree/styles/bg_focus = null 411 | Tree/styles/button_pressed = null 412 | Tree/styles/cursor = null 413 | Tree/styles/cursor_unfocused = null 414 | Tree/styles/custom_button = null 415 | Tree/styles/custom_button_hover = null 416 | Tree/styles/custom_button_pressed = null 417 | Tree/styles/selected = null 418 | Tree/styles/selected_focus = null 419 | Tree/styles/title_button_hover = null 420 | Tree/styles/title_button_normal = null 421 | Tree/styles/title_button_pressed = null 422 | VBoxContainer/constants/separation = 8 423 | VScrollBar/icons/decrement = null 424 | VScrollBar/icons/decrement_highlight = null 425 | VScrollBar/icons/increment = null 426 | VScrollBar/icons/increment_highlight = null 427 | VScrollBar/styles/grabber = null 428 | VScrollBar/styles/grabber_highlight = null 429 | VScrollBar/styles/grabber_pressed = null 430 | VScrollBar/styles/scroll = null 431 | VScrollBar/styles/scroll_focus = null 432 | VSeparator/constants/separation = 8 433 | VSeparator/styles/separator = null 434 | VSlider/icons/grabber = null 435 | VSlider/icons/grabber_disabled = null 436 | VSlider/icons/grabber_highlight = null 437 | VSlider/icons/tick = null 438 | VSlider/styles/grabber_area = null 439 | VSlider/styles/grabber_area_highlight = null 440 | VSlider/styles/slider = null 441 | VSplitContainer/constants/autohide = 2 442 | VSplitContainer/constants/separation = 24 443 | VSplitContainer/icons/grabber = null 444 | VSplitContainer/styles/bg = null 445 | WindowDialog/colors/title_color = Color( 0, 0, 0, 1 ) 446 | WindowDialog/constants/close_h_ofs = 36 447 | WindowDialog/constants/close_v_ofs = 36 448 | WindowDialog/constants/scaleborder_size = 8 449 | WindowDialog/constants/title_height = 40 450 | WindowDialog/fonts/title_font = null 451 | WindowDialog/icons/close = null 452 | WindowDialog/icons/close_highlight = null 453 | WindowDialog/styles/panel = null 454 | -------------------------------------------------------------------------------- /ui/themes/theme_general.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="Theme" load_steps=5 format=2] 2 | 3 | [ext_resource path="res://ui/themes/LL20.tres" type="DynamicFont" id=1] 4 | [ext_resource path="res://ui/themes/sb_panel.tres" type="StyleBox" id=2] 5 | 6 | [sub_resource type="StyleBoxEmpty" id=1] 7 | 8 | [sub_resource type="StyleBoxFlat" id=2] 9 | bg_color = Color( 0.14902, 0.14902, 0.14902, 1 ) 10 | corner_radius_top_left = 8 11 | corner_radius_top_right = 8 12 | corner_radius_bottom_right = 8 13 | corner_radius_bottom_left = 8 14 | 15 | [resource] 16 | default_font = ExtResource( 1 ) 17 | Button/colors/font_color = Color( 1, 1, 1, 1 ) 18 | Button/colors/font_color_disabled = Color( 1, 1, 1, 1 ) 19 | Button/colors/font_color_hover = Color( 1, 1, 1, 1 ) 20 | Button/colors/font_color_pressed = Color( 1, 1, 1, 1 ) 21 | Button/constants/hseparation = 4 22 | Button/fonts/font = null 23 | Button/styles/disabled = null 24 | Button/styles/focus = SubResource( 1 ) 25 | Button/styles/hover = null 26 | Button/styles/normal = null 27 | Button/styles/pressed = null 28 | CheckBox/colors/font_color = Color( 1, 1, 1, 1 ) 29 | CheckBox/colors/font_color_disabled = Color( 1, 1, 1, 1 ) 30 | CheckBox/colors/font_color_hover = Color( 1, 1, 1, 1 ) 31 | CheckBox/colors/font_color_hover_pressed = Color( 1, 1, 1, 1 ) 32 | CheckBox/colors/font_color_pressed = Color( 1, 1, 1, 1 ) 33 | CheckBox/constants/check_vadjust = 0 34 | CheckBox/constants/hseparation = 8 35 | CheckBox/fonts/font = null 36 | CheckBox/icons/checked = null 37 | CheckBox/icons/radio_checked = null 38 | CheckBox/icons/radio_unchecked = null 39 | CheckBox/icons/unchecked = null 40 | CheckBox/styles/disabled = null 41 | CheckBox/styles/focus = null 42 | CheckBox/styles/hover = null 43 | CheckBox/styles/hover_pressed = null 44 | CheckBox/styles/normal = null 45 | CheckBox/styles/pressed = null 46 | CheckButton/colors/font_color = Color( 1, 1, 1, 1 ) 47 | CheckButton/colors/font_color_disabled = Color( 1, 1, 1, 1 ) 48 | CheckButton/colors/font_color_hover = Color( 1, 1, 1, 1 ) 49 | CheckButton/colors/font_color_hover_pressed = Color( 1, 1, 1, 1 ) 50 | CheckButton/colors/font_color_pressed = Color( 1, 1, 1, 1 ) 51 | CheckButton/constants/check_vadjust = 0 52 | CheckButton/constants/hseparation = 8 53 | CheckButton/fonts/font = null 54 | CheckButton/icons/off = null 55 | CheckButton/icons/off_disabled = null 56 | CheckButton/icons/on = null 57 | CheckButton/icons/on_disabled = null 58 | CheckButton/styles/disabled = null 59 | CheckButton/styles/focus = null 60 | CheckButton/styles/hover = null 61 | CheckButton/styles/hover_pressed = null 62 | CheckButton/styles/normal = null 63 | CheckButton/styles/pressed = null 64 | ColorPicker/constants/h_width = 60 65 | ColorPicker/constants/label_width = 20 66 | ColorPicker/constants/margin = 8 67 | ColorPicker/constants/sv_height = 512 68 | ColorPicker/constants/sv_width = 512 69 | ColorPicker/icons/add_preset = null 70 | ColorPicker/icons/color_hue = null 71 | ColorPicker/icons/color_sample = null 72 | ColorPicker/icons/overbright_indicator = null 73 | ColorPicker/icons/preset_bg = null 74 | ColorPicker/icons/screen_picker = null 75 | ColorPickerButton/colors/font_color = Color( 1, 1, 1, 1 ) 76 | ColorPickerButton/colors/font_color_disabled = Color( 1, 1, 1, 1 ) 77 | ColorPickerButton/colors/font_color_hover = Color( 1, 1, 1, 1 ) 78 | ColorPickerButton/colors/font_color_pressed = Color( 1, 1, 1, 1 ) 79 | ColorPickerButton/constants/hseparation = 4 80 | ColorPickerButton/fonts/font = null 81 | ColorPickerButton/icons/bg = null 82 | ColorPickerButton/styles/disabled = null 83 | ColorPickerButton/styles/focus = null 84 | ColorPickerButton/styles/hover = null 85 | ColorPickerButton/styles/normal = null 86 | ColorPickerButton/styles/pressed = null 87 | Dialogs/constants/button_margin = 64 88 | Dialogs/constants/margin = 16 89 | FileDialog/colors/file_icon_modulate = Color( 0.815686, 0.815686, 0.815686, 1 ) 90 | FileDialog/colors/files_disabled = Color( 1, 1, 1, 1 ) 91 | FileDialog/colors/folder_icon_modulate = Color( 1, 1, 1, 1 ) 92 | FileDialog/icons/file = null 93 | FileDialog/icons/folder = null 94 | FileDialog/icons/parent_folder = null 95 | FileDialog/icons/reload = null 96 | FileDialog/icons/toggle_hidden = null 97 | Fonts/fonts/large = null 98 | Fonts/fonts/normal = null 99 | GraphEdit/colors/activity = Color( 1, 1, 1, 1 ) 100 | GraphEdit/colors/grid_major = Color( 1, 1, 1, 1 ) 101 | GraphEdit/colors/grid_minor = Color( 1, 1, 1, 1 ) 102 | GraphEdit/colors/selection_fill = Color( 1, 1, 1, 1 ) 103 | GraphEdit/colors/selection_stroke = Color( 1, 1, 1, 1 ) 104 | GraphEdit/constants/bezier_len_neg = 320 105 | GraphEdit/constants/bezier_len_pos = 160 106 | GraphEdit/constants/port_grab_distance_horizontal = 96 107 | GraphEdit/constants/port_grab_distance_vertical = 12 108 | GraphEdit/icons/minus = null 109 | GraphEdit/icons/more = null 110 | GraphEdit/icons/reset = null 111 | GraphEdit/icons/snap = null 112 | GraphEdit/styles/bg = null 113 | GraphNode/colors/close_color = Color( 1, 1, 1, 1 ) 114 | GraphNode/colors/resizer_color = Color( 1, 1, 1, 1 ) 115 | GraphNode/colors/title_color = Color( 1, 1, 1, 1 ) 116 | GraphNode/constants/close_offset = 36 117 | GraphNode/constants/port_offset = 6 118 | GraphNode/constants/separation = 2 119 | GraphNode/constants/title_offset = 40 120 | GraphNode/fonts/title_font = null 121 | GraphNode/icons/close = null 122 | GraphNode/icons/port = null 123 | GraphNode/icons/resizer = null 124 | GraphNode/styles/breakpoint = null 125 | GraphNode/styles/comment = null 126 | GraphNode/styles/commentfocus = null 127 | GraphNode/styles/defaultfocus = null 128 | GraphNode/styles/defaultframe = null 129 | GraphNode/styles/frame = null 130 | GraphNode/styles/position = null 131 | GraphNode/styles/selectedframe = null 132 | GridContainer/constants/hseparation = 8 133 | GridContainer/constants/vseparation = 8 134 | HBoxContainer/constants/separation = 8 135 | HScrollBar/icons/decrement = null 136 | HScrollBar/icons/decrement_highlight = null 137 | HScrollBar/icons/increment = null 138 | HScrollBar/icons/increment_highlight = null 139 | HScrollBar/styles/grabber = null 140 | HScrollBar/styles/grabber_highlight = null 141 | HScrollBar/styles/grabber_pressed = null 142 | HScrollBar/styles/scroll = null 143 | HScrollBar/styles/scroll_focus = null 144 | HSeparator/constants/separation = 8 145 | HSeparator/styles/separator = null 146 | HSlider/icons/grabber = null 147 | HSlider/icons/grabber_disabled = null 148 | HSlider/icons/grabber_highlight = null 149 | HSlider/icons/tick = null 150 | HSlider/styles/grabber_area = null 151 | HSlider/styles/grabber_area_highlight = null 152 | HSlider/styles/slider = null 153 | HSplitContainer/constants/autohide = 2 154 | HSplitContainer/constants/separation = 24 155 | HSplitContainer/icons/grabber = null 156 | HSplitContainer/styles/bg = null 157 | Icons/icons/close = null 158 | ItemList/colors/font_color = Color( 1, 1, 1, 1 ) 159 | ItemList/colors/font_color_selected = Color( 1, 1, 1, 1 ) 160 | ItemList/colors/guide_color = Color( 1, 1, 1, 1 ) 161 | ItemList/constants/hseparation = 4 162 | ItemList/constants/icon_margin = 4 163 | ItemList/constants/line_separation = 4 164 | ItemList/constants/vseparation = 2 165 | ItemList/fonts/font = null 166 | ItemList/styles/bg = null 167 | ItemList/styles/bg_focus = null 168 | ItemList/styles/cursor = null 169 | ItemList/styles/cursor_unfocused = null 170 | ItemList/styles/selected = null 171 | ItemList/styles/selected_focus = null 172 | Label/colors/font_color = Color( 1, 1, 1, 0 ) 173 | Label/colors/font_color_shadow = Color( 1, 1, 1, 1 ) 174 | Label/colors/font_outline_modulate = Color( 1, 1, 1, 1 ) 175 | Label/constants/line_spacing = 6 176 | Label/constants/shadow_as_outline = 0 177 | Label/constants/shadow_offset_x = 2 178 | Label/constants/shadow_offset_y = 2 179 | Label/fonts/font = ExtResource( 1 ) 180 | Label/styles/normal = null 181 | LineEdit/colors/clear_button_color = Color( 1, 1, 1, 1 ) 182 | LineEdit/colors/clear_button_color_pressed = Color( 0.0470588, 0.00392157, 0.00392157, 1 ) 183 | LineEdit/colors/cursor_color = Color( 0.0509804, 0.00784314, 0.00784314, 1 ) 184 | LineEdit/colors/font_color = Color( 1, 1, 1, 1 ) 185 | LineEdit/colors/font_color_selected = Color( 1, 1, 1, 1 ) 186 | LineEdit/colors/font_color_uneditable = Color( 1, 1, 1, 1 ) 187 | LineEdit/colors/selection_color = Color( 1, 1, 1, 1 ) 188 | LineEdit/constants/minimum_spaces = 24 189 | LineEdit/fonts/font = null 190 | LineEdit/icons/clear = null 191 | LineEdit/styles/focus = null 192 | LineEdit/styles/normal = null 193 | LineEdit/styles/read_only = null 194 | LinkButton/colors/font_color = Color( 1, 1, 1, 1 ) 195 | LinkButton/colors/font_color_hover = Color( 1, 1, 1, 1 ) 196 | LinkButton/colors/font_color_pressed = Color( 1, 1, 1, 1 ) 197 | LinkButton/constants/underline_spacing = 4 198 | LinkButton/fonts/font = null 199 | LinkButton/styles/focus = null 200 | MarginContainer/constants/margin_bottom = 0 201 | MarginContainer/constants/margin_left = 0 202 | MarginContainer/constants/margin_right = 0 203 | MarginContainer/constants/margin_top = 0 204 | MenuButton/colors/font_color = Color( 1, 1, 1, 1 ) 205 | MenuButton/colors/font_color_disabled = Color( 1, 1, 1, 1 ) 206 | MenuButton/colors/font_color_hover = Color( 1, 1, 1, 1 ) 207 | MenuButton/colors/font_color_pressed = Color( 1, 1, 1, 1 ) 208 | MenuButton/constants/hseparation = 6 209 | MenuButton/fonts/font = null 210 | MenuButton/styles/disabled = null 211 | MenuButton/styles/focus = null 212 | MenuButton/styles/hover = null 213 | MenuButton/styles/normal = null 214 | MenuButton/styles/pressed = null 215 | OptionButton/colors/font_color = Color( 1, 1, 1, 1 ) 216 | OptionButton/colors/font_color_disabled = Color( 1, 1, 1, 1 ) 217 | OptionButton/colors/font_color_hover = Color( 1, 1, 1, 1 ) 218 | OptionButton/colors/font_color_pressed = Color( 1, 1, 1, 1 ) 219 | OptionButton/constants/arrow_margin = 4 220 | OptionButton/constants/hseparation = 4 221 | OptionButton/fonts/font = null 222 | OptionButton/icons/arrow = null 223 | OptionButton/styles/disabled = null 224 | OptionButton/styles/focus = null 225 | OptionButton/styles/hover = null 226 | OptionButton/styles/normal = null 227 | OptionButton/styles/pressed = null 228 | Panel/styles/panel = ExtResource( 2 ) 229 | PanelContainer/styles/panel = SubResource( 2 ) 230 | PopupDialog/styles/panel = null 231 | PopupMenu/colors/font_color = Color( 1, 1, 1, 1 ) 232 | PopupMenu/colors/font_color_accel = Color( 1, 1, 1, 1 ) 233 | PopupMenu/colors/font_color_disabled = Color( 1, 1, 1, 1 ) 234 | PopupMenu/colors/font_color_hover = Color( 1, 1, 1, 1 ) 235 | PopupMenu/constants/hseparation = 8 236 | PopupMenu/constants/vseparation = 8 237 | PopupMenu/fonts/font = null 238 | PopupMenu/icons/checked = null 239 | PopupMenu/icons/radio_checked = null 240 | PopupMenu/icons/radio_unchecked = null 241 | PopupMenu/icons/submenu = null 242 | PopupMenu/icons/unchecked = null 243 | PopupMenu/styles/hover = null 244 | PopupMenu/styles/labeled_separator_left = null 245 | PopupMenu/styles/labeled_separator_right = null 246 | PopupMenu/styles/panel = null 247 | PopupMenu/styles/panel_disabled = null 248 | PopupMenu/styles/separator = null 249 | PopupPanel/styles/panel = null 250 | ProgressBar/colors/font_color = Color( 1, 1, 1, 1 ) 251 | ProgressBar/colors/font_color_shadow = Color( 1, 1, 1, 1 ) 252 | ProgressBar/fonts/font = null 253 | ProgressBar/styles/bg = null 254 | ProgressBar/styles/fg = null 255 | RichTextLabel/colors/default_color = Color( 1, 1, 1, 1 ) 256 | RichTextLabel/colors/font_color_selected = Color( 1, 1, 1, 1 ) 257 | RichTextLabel/colors/font_color_shadow = Color( 1, 1, 1, 1 ) 258 | RichTextLabel/colors/selection_color = Color( 1, 1, 1, 1 ) 259 | RichTextLabel/constants/line_separation = 2 260 | RichTextLabel/constants/shadow_as_outline = 0 261 | RichTextLabel/constants/shadow_offset_x = 2 262 | RichTextLabel/constants/shadow_offset_y = 2 263 | RichTextLabel/constants/table_hseparation = 6 264 | RichTextLabel/constants/table_vseparation = 6 265 | RichTextLabel/fonts/bold_font = null 266 | RichTextLabel/fonts/bold_italics_font = null 267 | RichTextLabel/fonts/italics_font = null 268 | RichTextLabel/fonts/mono_font = null 269 | RichTextLabel/fonts/normal_font = ExtResource( 1 ) 270 | RichTextLabel/styles/focus = null 271 | RichTextLabel/styles/normal = null 272 | ScrollContainer/styles/bg = null 273 | SpinBox/icons/updown = null 274 | TabContainer/colors/font_color_bg = Color( 1, 1, 1, 1 ) 275 | TabContainer/colors/font_color_disabled = Color( 1, 1, 1, 1 ) 276 | TabContainer/colors/font_color_fg = Color( 1, 1, 1, 1 ) 277 | TabContainer/constants/hseparation = 8 278 | TabContainer/constants/label_valign_bg = 4 279 | TabContainer/constants/label_valign_fg = 0 280 | TabContainer/constants/side_margin = 16 281 | TabContainer/constants/top_margin = 48 282 | TabContainer/fonts/font = null 283 | TabContainer/icons/decrement = null 284 | TabContainer/icons/decrement_highlight = null 285 | TabContainer/icons/increment = null 286 | TabContainer/icons/increment_highlight = null 287 | TabContainer/icons/menu = null 288 | TabContainer/icons/menu_highlight = null 289 | TabContainer/styles/panel = null 290 | TabContainer/styles/tab_bg = null 291 | TabContainer/styles/tab_disabled = null 292 | TabContainer/styles/tab_fg = null 293 | Tabs/colors/font_color_bg = Color( 1, 1, 1, 1 ) 294 | Tabs/colors/font_color_disabled = Color( 1, 1, 1, 1 ) 295 | Tabs/colors/font_color_fg = Color( 1, 1, 1, 1 ) 296 | Tabs/constants/hseparation = 8 297 | Tabs/constants/label_valign_bg = 4 298 | Tabs/constants/label_valign_fg = 0 299 | Tabs/constants/top_margin = 48 300 | Tabs/fonts/font = null 301 | Tabs/icons/close = null 302 | Tabs/icons/decrement = null 303 | Tabs/icons/decrement_highlight = null 304 | Tabs/icons/increment = null 305 | Tabs/icons/increment_highlight = null 306 | Tabs/styles/button = null 307 | Tabs/styles/button_pressed = null 308 | Tabs/styles/panel = null 309 | Tabs/styles/tab_bg = null 310 | Tabs/styles/tab_disabled = null 311 | Tabs/styles/tab_fg = null 312 | TextEdit/colors/background_color = Color( 1, 1, 1, 1 ) 313 | TextEdit/colors/bookmark_color = Color( 1, 1, 1, 1 ) 314 | TextEdit/colors/brace_mismatch_color = Color( 1, 1, 1, 1 ) 315 | TextEdit/colors/breakpoint_color = Color( 1, 1, 1, 1 ) 316 | TextEdit/colors/caret_background_color = Color( 1, 1, 1, 1 ) 317 | TextEdit/colors/caret_color = Color( 1, 1, 1, 1 ) 318 | TextEdit/colors/code_folding_color = Color( 1, 1, 1, 1 ) 319 | TextEdit/colors/completion_background_color = Color( 1, 1, 1, 1 ) 320 | TextEdit/colors/completion_existing_color = Color( 1, 1, 1, 1 ) 321 | TextEdit/colors/completion_font_color = Color( 1, 1, 1, 1 ) 322 | TextEdit/colors/completion_scroll_color = Color( 1, 1, 1, 1 ) 323 | TextEdit/colors/completion_selected_color = Color( 1, 1, 1, 1 ) 324 | TextEdit/colors/current_line_color = Color( 1, 1, 1, 1 ) 325 | TextEdit/colors/executing_line_color = Color( 1, 1, 1, 1 ) 326 | TextEdit/colors/font_color = Color( 1, 1, 1, 1 ) 327 | TextEdit/colors/font_color_readonly = Color( 1, 1, 1, 1 ) 328 | TextEdit/colors/font_color_selected = Color( 1, 1, 1, 1 ) 329 | TextEdit/colors/function_color = Color( 1, 1, 1, 1 ) 330 | TextEdit/colors/line_number_color = Color( 1, 1, 1, 1 ) 331 | TextEdit/colors/mark_color = Color( 1, 1, 1, 1 ) 332 | TextEdit/colors/member_variable_color = Color( 1, 1, 1, 1 ) 333 | TextEdit/colors/number_color = Color( 1, 1, 1, 1 ) 334 | TextEdit/colors/safe_line_number_color = Color( 1, 1, 1, 1 ) 335 | TextEdit/colors/selection_color = Color( 1, 1, 1, 1 ) 336 | TextEdit/colors/symbol_color = Color( 1, 1, 1, 1 ) 337 | TextEdit/colors/word_highlighted_color = Color( 1, 1, 1, 1 ) 338 | TextEdit/constants/completion_lines = 7 339 | TextEdit/constants/completion_max_width = 50 340 | TextEdit/constants/completion_scroll_width = 3 341 | TextEdit/constants/line_spacing = 8 342 | TextEdit/fonts/font = null 343 | TextEdit/icons/fold = null 344 | TextEdit/icons/folded = null 345 | TextEdit/icons/space = null 346 | TextEdit/icons/tab = null 347 | TextEdit/styles/completion = null 348 | TextEdit/styles/focus = null 349 | TextEdit/styles/normal = null 350 | TextEdit/styles/read_only = null 351 | ToolButton/colors/font_color = Color( 1, 1, 1, 1 ) 352 | ToolButton/colors/font_color_disabled = Color( 1, 1, 1, 1 ) 353 | ToolButton/colors/font_color_hover = Color( 1, 1, 1, 1 ) 354 | ToolButton/colors/font_color_pressed = Color( 1, 1, 1, 1 ) 355 | ToolButton/constants/hseparation = 3 356 | ToolButton/fonts/font = null 357 | ToolButton/styles/disabled = null 358 | ToolButton/styles/focus = null 359 | ToolButton/styles/hover = null 360 | ToolButton/styles/normal = null 361 | ToolButton/styles/pressed = null 362 | TooltipLabel/colors/font_color = Color( 1, 1, 1, 1 ) 363 | TooltipLabel/colors/font_color_shadow = Color( 1, 1, 1, 1 ) 364 | TooltipLabel/constants/shadow_offset_x = 1 365 | TooltipLabel/constants/shadow_offset_y = 1 366 | TooltipLabel/fonts/font = null 367 | TooltipPanel/styles/panel = null 368 | Tree/colors/custom_button_font_highlight = Color( 1, 1, 1, 1 ) 369 | Tree/colors/drop_position_color = Color( 1, 1, 1, 1 ) 370 | Tree/colors/font_color = Color( 1, 1, 1, 1 ) 371 | Tree/colors/font_color_selected = Color( 1, 1, 1, 1 ) 372 | Tree/colors/guide_color = Color( 1, 1, 1, 1 ) 373 | Tree/colors/relationship_line_color = Color( 1, 1, 1, 1 ) 374 | Tree/colors/title_button_color = Color( 1, 1, 1, 1 ) 375 | Tree/constants/button_margin = 8 376 | Tree/constants/draw_guides = 1 377 | Tree/constants/draw_relationship_lines = 0 378 | Tree/constants/hseparation = 8 379 | Tree/constants/item_margin = 24 380 | Tree/constants/scroll_border = 4 381 | Tree/constants/scroll_speed = 12 382 | Tree/constants/vseparation = 8 383 | Tree/fonts/font = null 384 | Tree/fonts/title_button_font = null 385 | Tree/icons/arrow = null 386 | Tree/icons/arrow_collapsed = null 387 | Tree/icons/checked = null 388 | Tree/icons/select_arrow = null 389 | Tree/icons/unchecked = null 390 | Tree/icons/updown = null 391 | Tree/styles/bg = null 392 | Tree/styles/bg_focus = null 393 | Tree/styles/button_pressed = null 394 | Tree/styles/cursor = null 395 | Tree/styles/cursor_unfocused = null 396 | Tree/styles/custom_button = null 397 | Tree/styles/custom_button_hover = null 398 | Tree/styles/custom_button_pressed = null 399 | Tree/styles/selected = null 400 | Tree/styles/selected_focus = null 401 | Tree/styles/title_button_hover = null 402 | Tree/styles/title_button_normal = null 403 | Tree/styles/title_button_pressed = null 404 | VBoxContainer/constants/separation = 8 405 | VScrollBar/icons/decrement = null 406 | VScrollBar/icons/decrement_highlight = null 407 | VScrollBar/icons/increment = null 408 | VScrollBar/icons/increment_highlight = null 409 | VScrollBar/styles/grabber = null 410 | VScrollBar/styles/grabber_highlight = null 411 | VScrollBar/styles/grabber_pressed = null 412 | VScrollBar/styles/scroll = null 413 | VScrollBar/styles/scroll_focus = null 414 | VSeparator/constants/separation = 8 415 | VSeparator/styles/separator = null 416 | VSlider/icons/grabber = null 417 | VSlider/icons/grabber_disabled = null 418 | VSlider/icons/grabber_highlight = null 419 | VSlider/icons/tick = null 420 | VSlider/styles/grabber_area = null 421 | VSlider/styles/grabber_area_highlight = null 422 | VSlider/styles/slider = null 423 | VSplitContainer/constants/autohide = 2 424 | VSplitContainer/constants/separation = 24 425 | VSplitContainer/icons/grabber = null 426 | VSplitContainer/styles/bg = null 427 | WindowDialog/colors/title_color = Color( 1, 1, 1, 1 ) 428 | WindowDialog/constants/close_h_ofs = 36 429 | WindowDialog/constants/close_v_ofs = 36 430 | WindowDialog/constants/scaleborder_size = 8 431 | WindowDialog/constants/title_height = 40 432 | WindowDialog/fonts/title_font = null 433 | WindowDialog/icons/close = null 434 | WindowDialog/icons/close_highlight = null 435 | WindowDialog/styles/panel = null 436 | --------------------------------------------------------------------------------