Added media player and character select and started some other stuff

This commit is contained in:
2023-08-27 21:34:02 +02:00
parent aad5f3d421
commit a48fc04e3b
88 changed files with 1029 additions and 2798 deletions

13
.idea/.idea.MusicPlayer.dir/.idea/.gitignore generated vendored Normal file
View File

@@ -0,0 +1,13 @@
# Default ignored files
/shelf/
/workspace.xml
# Rider ignored files
/modules.xml
/.idea.MusicPlayer.iml
/contentModel.xml
/projectSettingsUpdater.xml
# Editor-based HTTP Client requests
/httpRequests/
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml

View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Encoding" addBOMForNewFiles="with BOM under Windows, with no BOM otherwise" />
</project>

View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="UserContentModel">
<attachedFolders />
<explicitIncludes />
<explicitExcludes />
</component>
</project>

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="" vcs="Git" />
</component>
</project>

View File

@@ -13,7 +13,39 @@ var list := $ScrollContainer/VBoxContainer
var game_label := $GameLabel
@onready
var player := $Player
var character_grid_container := $ScrollContainer2
@onready
var character_grid := $ScrollContainer2/GridContainer
@onready
var play_button := $PanelContainer/HBoxContainer/PlayButton
@onready
var pause_button := $PanelContainer/HBoxContainer/PauseButton
@onready
var stop_button := $PanelContainer/HBoxContainer/StopButton
@onready
var audio := $AudioStreamPlayer
@onready
var progress := $PanelContainer/HBoxContainer/HSlider
@onready
var label := $PanelContainer/HBoxContainer/Label
@onready
var add_player := $Players/VBoxContainer/HBoxContainer/AddPlayer
@onready
var players := $Players/VBoxContainer
var Player := preload("res://Player.tscn")
@onready
var path = '/Users/sebastian/ResilioSync/Sorterat_test/Metal Gear Solid 4 - Guns of the Patriots/2-16 Metal Gear Saga.mp3'
func get_suggestion_list() -> void:
var http_request = HTTPRequest.new()
@@ -25,12 +57,48 @@ func get_suggestion_list() -> void:
if error != OK:
push_error("An error occurred in the HTTP request.")
func add_players():
var new_player := Player.instantiate()
players.add_child(new_player)
new_player.connect("change_character_clicked", _on_player_change_character_clicked.bind(new_player))
# Called when the node enters the scene tree for the first time.
func _ready():
play_button.pressed.connect(fetch_first_song)
pause_button.pressed.connect(pause)
stop_button.pressed.connect(stop)
progress.drag_started.connect(_on_drag_started)
progress.drag_ended.connect(_on_drag_ended)
add_player.pressed.connect(add_players)
open_button.pressed.connect(open)
player.fetched.connect(fetched)
get_suggestion_list()
#dir_contents("/Users/sebastian/ResilioSync/Sorterat_test")
var characters := DirAccess.open("res://characters/")
if characters:
characters.list_dir_begin()
var file_name = characters.get_next()
while file_name != "":
if !file_name.ends_with(".import"):
var texture = load("res://characters/" + file_name)
var texture_btn := TextureButton.new()
character_grid.add_child(texture_btn)
texture_btn.custom_minimum_size = Vector2(80, 40)
texture_btn.ignore_texture_size = true
texture_btn.stretch_mode = TextureButton.STRETCH_KEEP_ASPECT
texture_btn.texture_normal = texture
texture_btn.pressed.connect(select_character.bind(file_name))
file_name = characters.get_next()
func fetched():
var http_request = HTTPRequest.new()
@@ -79,8 +147,9 @@ func open():
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta):
pass
if audio.has_stream_playback() && !is_changing && !audio.stream_paused:
progress.value = audio.get_playback_position()
label.text = format_text(progress.value, stream.get_length())
func _on_file_dialog_dir_selected(path):
print(path)
@@ -109,9 +178,118 @@ func dir_contents(path: String) -> void:
else:
print("An error occurred when trying to access the path.")
if songs:
player.set_songs(songs)
for game in games:
var label := Label.new()
label.text = game
list.add_child(label)
var is_changing: bool = false
var playback_position: float
var stream: AudioStream
func set_songs(new_songs) -> void:
songs = new_songs
func make_request(address, func_name) -> void:
var http_request = HTTPRequest.new()
add_child(http_request)
http_request.request_completed.connect(func_name)
# Perform a GET request. The URL below returns JSON as of writing.
var error = http_request.request(address)
if error != OK:
push_error("An error occurred in the HTTP request.")
func format_time(time: float) -> String:
var mins: String = "%02d" % floor(time / 60)
var sec: String = "%02d" % round(fmod(time, 60))
return mins + ":" + sec
func format_text(part: float, total: float) -> String:
return format_time(part) + " / " + format_time(total)
func fetch_first_song() -> void:
var http_request = HTTPRequest.new()
add_child(http_request)
#http.set_download_file("https://music.sanplex.tech/music/first")
http_request.request_completed.connect(first_song_fetched)
# Perform a GET request. The URL below returns JSON as of writing.
var error = http_request.request("https://music.sanplex.tech/music/rand")
if error != OK:
push_error("An error occurred in the HTTP request.")
func first_song_fetched(result, response_code, headers, body) -> void:
if result != HTTPRequest.RESULT_SUCCESS:
push_error("Song couldn't be downloaded. Try a different song.")
var sound = AudioStreamMP3.new()
sound.data = body
make_request("https://music.sanplex.tech/music/addQue", add_que)
play(sound)
func add_que(result, response_code, headers, body) -> void:
print("response_code", response_code)
fetched()
func play(song) -> void:
if audio.stream_paused:
audio.stream_paused = false
audio.seek(playback_position)
print("continue")
elif song:
print("play given song")
audio.stream = song
audio.play()
stream = audio.stream
else:
if songs:
#print(songs)
path = songs[0]
print(path)
print(FileAccess.file_exists(path))
audio.stream = load_mp3(path)
print("play")
audio.play()
stream = audio.stream
progress.max_value = round(stream.get_length())
progress.tick_count = round(stream.get_length() / 60)
func pause() -> void:
audio.stream_paused = true
playback_position = audio.get_playback_position()
func stop() -> void:
audio.stop()
audio.stream_paused = false
progress.value = 0
func _on_drag_started() -> void:
is_changing = true
func _on_drag_ended(_changed) -> void:
audio.seek(progress.value)
playback_position = progress.value
is_changing = false
func load_mp3(_path) -> AudioStream:
var file = FileAccess.open(_path, FileAccess.READ)
var sound = AudioStreamMP3.new()
sound.data = file.get_buffer(file.get_length())
return sound
var current_player
func _on_player_change_character_clicked(new_player):
print("_on_player_change_character_clicked")
current_player = new_player
character_grid_container.visible = true
func select_character(file_name: String):
print("select_character")
character_grid_container.visible = false
current_player._on_control_character_selected_clicked(file_name)

View File

@@ -1,7 +1,8 @@
[gd_scene load_steps=3 format=3 uid="uid://db7eqdsumxmo1"]
[gd_scene load_steps=4 format=3 uid="uid://xwq863o6uvsu"]
[ext_resource type="PackedScene" uid="uid://cvixk5bkj7lgb" path="res://Player.tscn" id="1_dm1l5"]
[ext_resource type="Script" path="res://MainWindow.gd" id="1_eu0t5"]
[ext_resource type="AudioStream" uid="uid://n2g8jddr85h2" path="res://01. Opening.mp3" id="4_5kvsq"]
[ext_resource type="Texture2D" uid="uid://o5go6smk7hm1" path="res://person_add_alt_1-black-36dp.svg" id="4_op458"]
[node name="Control" type="Control"]
layout_mode = 3
@@ -17,34 +18,20 @@ offset_bottom = 469.0
text = "Open"
[node name="FileDialog" type="FileDialog" parent="."]
initial_position = 2
title = "Open a Directory"
initial_position = 2
size = Vector2i(616, 400)
ok_button_text = "Select Current Folder"
file_mode = 2
access = 2
show_hidden_files = true
[node name="Player" parent="." instance=ExtResource("1_dm1l5")]
layout_mode = 0
anchors_preset = 0
anchor_left = 0.0
anchor_top = 0.0
anchor_right = 0.0
anchor_bottom = 0.0
offset_left = 98.0
offset_top = 550.0
offset_right = 748.0
offset_bottom = 581.0
grow_horizontal = 1
grow_vertical = 1
[node name="ScrollContainer" type="ScrollContainer" parent="."]
layout_mode = 0
offset_left = 703.0
offset_top = 42.0
offset_right = 1073.0
offset_bottom = 331.0
offset_left = 690.0
offset_top = 25.0
offset_right = 1060.0
offset_bottom = 314.0
[node name="VBoxContainer" type="VBoxContainer" parent="ScrollContainer"]
layout_mode = 2
@@ -65,4 +52,80 @@ offset_top = 141.0
offset_right = 557.0
offset_bottom = 253.0
[node name="ScrollContainer2" type="ScrollContainer" parent="."]
visible = false
clip_contents = false
custom_minimum_size = Vector2(100, 100)
layout_mode = 0
offset_left = 194.0
offset_top = 152.0
offset_right = 670.0
offset_bottom = 375.0
[node name="GridContainer" type="GridContainer" parent="ScrollContainer2"]
layout_mode = 2
size_flags_horizontal = 3
size_flags_vertical = 3
columns = 3
[node name="PanelContainer" type="PanelContainer" parent="."]
layout_mode = 0
offset_left = 110.0
offset_top = 485.0
offset_right = 758.0
offset_bottom = 525.0
[node name="HBoxContainer" type="HBoxContainer" parent="PanelContainer"]
layout_mode = 2
size_flags_vertical = 4
[node name="PlayButton" type="Button" parent="PanelContainer/HBoxContainer"]
layout_mode = 2
text = "Play"
[node name="PauseButton" type="Button" parent="PanelContainer/HBoxContainer"]
layout_mode = 2
text = "Pause"
[node name="StopButton" type="Button" parent="PanelContainer/HBoxContainer"]
layout_mode = 2
text = "Stop"
[node name="HSlider" type="HSlider" parent="PanelContainer/HBoxContainer"]
layout_mode = 2
size_flags_horizontal = 3
size_flags_vertical = 4
scrollable = false
[node name="Label" type="Label" parent="PanelContainer/HBoxContainer"]
layout_mode = 2
text = "1:00 / 3:00"
[node name="AudioStreamPlayer" type="AudioStreamPlayer" parent="."]
stream = ExtResource("4_5kvsq")
[node name="Players" type="PanelContainer" parent="."]
layout_mode = 0
offset_left = 837.0
offset_top = 264.0
offset_right = 1102.0
offset_bottom = 453.0
[node name="VBoxContainer" type="VBoxContainer" parent="Players"]
layout_mode = 2
[node name="HBoxContainer" type="HBoxContainer" parent="Players/VBoxContainer"]
layout_mode = 2
[node name="Label" type="Label" parent="Players/VBoxContainer/HBoxContainer"]
layout_mode = 2
size_flags_horizontal = 3
text = "Players"
horizontal_alignment = 1
[node name="AddPlayer" type="TextureButton" parent="Players/VBoxContainer/HBoxContainer"]
layout_mode = 2
size_flags_horizontal = 8
texture_normal = ExtResource("4_op458")
[connection signal="dir_selected" from="FileDialog" to="." method="_on_file_dialog_dir_selected"]

134
MediaPlayer.gd Normal file
View File

@@ -0,0 +1,134 @@
extends PanelContainer
@onready
var play_button := $HBoxContainer/PlayButton
@onready
var pause_button := $HBoxContainer/PauseButton
@onready
var stop_button := $HBoxContainer/StopButton
@onready
var audio := $AudioStreamPlayer
@onready
var progress := $HBoxContainer/HSlider
@onready
var label := $HBoxContainer/Label
@onready
var path = '/Users/sebastian/ResilioSync/Sorterat_test/Metal Gear Solid 4 - Guns of the Patriots/2-16 Metal Gear Saga.mp3'
var songs := []
var is_changing: bool = false
var playback_position: float
var stream: AudioStream
func set_songs(new_songs) -> void:
songs = new_songs
func make_request(address, func_name) -> void:
var http_request = HTTPRequest.new()
add_child(http_request)
http_request.request_completed.connect(func_name)
# Perform a GET request. The URL below returns JSON as of writing.
var error = http_request.request(address)
if error != OK:
push_error("An error occurred in the HTTP request.")
# Called when the node enters the scene tree for the first time.
func _ready() -> void:
play_button.pressed.connect(fetch_first_song)
pause_button.pressed.connect(pause)
stop_button.pressed.connect(stop)
progress.drag_started.connect(_on_drag_started)
progress.drag_ended.connect(_on_drag_ended)
func format_time(time: float) -> String:
var mins: String = "%02d" % floor(time / 60)
var sec: String = "%02d" % round(fmod(time, 60))
return mins + ":" + sec
func format_text(part: float, total: float) -> String:
return format_time(part) + " / " + format_time(total)
func _process(_delta):
if audio.has_stream_playback() && !is_changing && !audio.stream_paused:
progress.value = audio.get_playback_position()
label.text = format_text(progress.value, stream.get_length())
signal fetched
func fetch_first_song() -> void:
var http_request = HTTPRequest.new()
add_child(http_request)
#http.set_download_file("https://music.sanplex.tech/music/first")
http_request.request_completed.connect(first_song_fetched)
# Perform a GET request. The URL below returns JSON as of writing.
var error = http_request.request("https://music.sanplex.tech/music/rand")
if error != OK:
push_error("An error occurred in the HTTP request.")
func first_song_fetched(result, response_code, headers, body) -> void:
if result != HTTPRequest.RESULT_SUCCESS:
push_error("Song couldn't be downloaded. Try a different song.")
var sound = AudioStreamMP3.new()
sound.data = body
make_request("https://music.sanplex.tech/music/addQue", add_que)
#fetched.emit()
play(sound)
func add_que(result, response_code, headers, body) -> void:
print("response_code", response_code)
fetched.emit()
func play(song) -> void:
if audio.stream_paused:
audio.stream_paused = false
audio.seek(playback_position)
print("continue")
elif song:
print("play given song")
audio.stream = song
audio.play()
stream = audio.stream
else:
if songs:
#print(songs)
path = songs[0]
print(path)
print(FileAccess.file_exists(path))
audio.stream = load_mp3(path)
print("play")
audio.play()
stream = audio.stream
progress.max_value = round(stream.get_length())
progress.tick_count = round(stream.get_length() / 60)
func pause() -> void:
audio.stream_paused = true
playback_position = audio.get_playback_position()
func stop() -> void:
audio.stop()
audio.stream_paused = false
progress.value = 0
func _on_drag_started() -> void:
is_changing = true
func _on_drag_ended(_changed) -> void:
audio.seek(progress.value)
playback_position = progress.value
is_changing = false
func load_mp3(_path) -> AudioStream:
var file = FileAccess.open(_path, FileAccess.READ)
var sound = AudioStreamMP3.new()
sound.data = file.get_buffer(file.get_length())
return sound

48
MediaPlayer.tscn Normal file
View File

@@ -0,0 +1,48 @@
[gd_scene load_steps=3 format=3 uid="uid://ds15cgsf8vpvc"]
[ext_resource type="Script" path="res://MediaPlayer.gd" id="1_7xb8h"]
[ext_resource type="AudioStream" uid="uid://n2g8jddr85h2" path="res://01. Opening.mp3" id="2_sv4nm"]
[node name="MediaPlayer" type="PanelContainer"]
anchors_preset = 8
anchor_left = 0.5
anchor_top = 0.5
anchor_right = 0.5
anchor_bottom = 0.5
offset_left = -121.0
offset_top = -15.5
offset_right = 121.0
offset_bottom = 15.5
grow_horizontal = 2
grow_vertical = 2
size_flags_vertical = 4
script = ExtResource("1_7xb8h")
[node name="AudioStreamPlayer" type="AudioStreamPlayer" parent="."]
stream = ExtResource("2_sv4nm")
[node name="HBoxContainer" type="HBoxContainer" parent="."]
layout_mode = 2
size_flags_vertical = 4
[node name="PlayButton" type="Button" parent="HBoxContainer"]
layout_mode = 2
text = "Play"
[node name="PauseButton" type="Button" parent="HBoxContainer"]
layout_mode = 2
text = "Pause"
[node name="StopButton" type="Button" parent="HBoxContainer"]
layout_mode = 2
text = "Stop"
[node name="HSlider" type="HSlider" parent="HBoxContainer"]
layout_mode = 2
size_flags_horizontal = 3
size_flags_vertical = 4
scrollable = false
[node name="Label" type="Label" parent="HBoxContainer"]
layout_mode = 2
text = "1:00 / 3:00"

148
Player.gd
View File

@@ -1,134 +1,48 @@
extends PanelContainer
extends Control
@onready
var play_button := $HBoxContainer/PlayButton
var points := $HBoxContainer/Points
@onready
var pause_button := $HBoxContainer/PauseButton
var add := $HBoxContainer/AddPoint
@onready
var stop_button := $HBoxContainer/StopButton
var minus := $HBoxContainer/RemovePoint
@onready
var audio := $AudioStreamPlayer
var character := $HBoxContainer/Character
@onready
var progress := $HBoxContainer/HSlider
signal change_character_clicked
@onready
var label := $HBoxContainer/Label
@onready
var path = '/Users/sebastian/ResilioSync/Sorterat_test/Metal Gear Solid 4 - Guns of the Patriots/2-16 Metal Gear Saga.mp3'
var songs := []
var is_changing: bool = false
var playback_position: float
var stream: AudioStream
func set_songs(new_songs) -> void:
songs = new_songs
func make_request(address, func_name) -> void:
var http_request = HTTPRequest.new()
add_child(http_request)
http_request.request_completed.connect(func_name)
# Perform a GET request. The URL below returns JSON as of writing.
var error = http_request.request(address)
if error != OK:
push_error("An error occurred in the HTTP request.")
# Called when the node enters the scene tree for the first time.
func _ready() -> void:
play_button.pressed.connect(fetch_first_song)
pause_button.pressed.connect(pause)
stop_button.pressed.connect(stop)
progress.drag_started.connect(_on_drag_started)
progress.drag_ended.connect(_on_drag_ended)
func _ready():
print("_ready")
add.pressed.connect(add_point)
minus.pressed.connect(minus_point)
character.pressed.connect(change_character)
func format_time(time: float) -> String:
var mins: String = "%02d" % floor(time / 60)
var sec: String = "%02d" % round(fmod(time, 60))
return mins + ":" + sec
func add_point():
var value := int(points.text)
points.text = str(value + 1)
func format_text(part: float, total: float) -> String:
return format_time(part) + " / " + format_time(total)
func _process(_delta):
if audio.has_stream_playback() && !is_changing && !audio.stream_paused:
progress.value = audio.get_playback_position()
label.text = format_text(progress.value, stream.get_length())
signal fetched
func fetch_first_song() -> void:
var http_request = HTTPRequest.new()
add_child(http_request)
#http.set_download_file("https://music.sanplex.tech/music/first")
http_request.request_completed.connect(first_song_fetched)
func minus_point():
var value := int(points.text)
points.text = str(value - 1)
# Perform a GET request. The URL below returns JSON as of writing.
var error = http_request.request("https://music.sanplex.tech/music/rand")
if error != OK:
push_error("An error occurred in the HTTP request.")
func change_character():
print("change_character")
change_character_clicked.emit()
func first_song_fetched(result, response_code, headers, body) -> void:
if result != HTTPRequest.RESULT_SUCCESS:
push_error("Image couldn't be downloaded. Try a different image.")
var sound = AudioStreamMP3.new()
sound.data = body
make_request("https://music.sanplex.tech/music/addQue", add_que)
#fetched.emit()
play(sound)
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta):
pass
func _on_control_character_selected_clicked(file_name: String):
print("Back in player list with: " + file_name)
func add_que(result, response_code, headers, body) -> void:
print("response_code", response_code)
fetched.emit()
func play(song) -> void:
if audio.stream_paused:
audio.stream_paused = false
audio.seek(playback_position)
print("continue")
elif song:
print("play given song")
audio.stream = song
audio.play()
stream = audio.stream
else:
if songs:
#print(songs)
path = songs[0]
print(path)
print(FileAccess.file_exists(path))
audio.stream = load_mp3(path)
print("play")
audio.play()
stream = audio.stream
progress.max_value = round(stream.get_length())
progress.tick_count = round(stream.get_length() / 60)
func pause() -> void:
audio.stream_paused = true
playback_position = audio.get_playback_position()
func stop() -> void:
audio.stop()
audio.stream_paused = false
progress.value = 0
func _on_drag_started() -> void:
is_changing = true
func _on_drag_ended(_changed) -> void:
audio.seek(progress.value)
playback_position = progress.value
is_changing = false
func load_mp3(_path) -> AudioStream:
var file = FileAccess.open(_path, FileAccess.READ)
var sound = AudioStreamMP3.new()
sound.data = file.get_buffer(file.get_length())
return sound
var texture = load("res://characters/" + file_name)
character.custom_minimum_size = Vector2(80, 40)
character.ignore_texture_size = true
character.stretch_mode = TextureButton.STRETCH_KEEP_ASPECT
character.texture_normal = texture

View File

@@ -1,48 +1,47 @@
[gd_scene load_steps=3 format=3 uid="uid://cvixk5bkj7lgb"]
[gd_scene load_steps=4 format=3 uid="uid://cslogy2csnd7a"]
[ext_resource type="Script" path="res://Player.gd" id="1_if4kc"]
[ext_resource type="AudioStream" uid="uid://n2g8jddr85h2" path="res://01. Opening.mp3" id="2_sv4nm"]
[ext_resource type="Texture2D" uid="uid://bah8j3gu07305" path="res://characters/Kiryu.png" id="1_y7dih"]
[ext_resource type="Texture2D" uid="uid://t1tnj6nqpi4a" path="res://person_remove-black-36dp.svg" id="2_xw2ck"]
[node name="Player" type="PanelContainer"]
anchors_preset = 8
anchor_left = 0.5
anchor_top = 0.5
anchor_right = 0.5
anchor_bottom = 0.5
offset_left = -121.0
offset_top = -15.5
offset_right = 121.0
offset_bottom = 15.5
[node name="Player" type="Control"]
custom_minimum_size = Vector2(2.08165e-12, 40)
layout_mode = 3
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
size_flags_vertical = 4
script = ExtResource("1_if4kc")
[node name="AudioStreamPlayer" type="AudioStreamPlayer" parent="."]
stream = ExtResource("2_sv4nm")
[node name="HBoxContainer" type="HBoxContainer" parent="."]
layout_mode = 2
size_flags_vertical = 4
layout_mode = 0
offset_right = 40.0
offset_bottom = 40.0
[node name="PlayButton" type="Button" parent="HBoxContainer"]
[node name="Name" type="Label" parent="HBoxContainer"]
layout_mode = 2
text = "Play"
text = "Sansan: "
[node name="PauseButton" type="Button" parent="HBoxContainer"]
[node name="Points" type="Label" parent="HBoxContainer"]
layout_mode = 2
text = "Pause"
text = "0"
[node name="StopButton" type="Button" parent="HBoxContainer"]
[node name="Character" type="TextureButton" parent="HBoxContainer"]
custom_minimum_size = Vector2(80, 40)
layout_mode = 2
text = "Stop"
texture_normal = ExtResource("1_y7dih")
ignore_texture_size = true
stretch_mode = 5
[node name="HSlider" type="HSlider" parent="HBoxContainer"]
[node name="AddPoint" type="Button" parent="HBoxContainer"]
layout_mode = 2
size_flags_horizontal = 3
size_flags_vertical = 4
scrollable = false
text = "+1"
[node name="Label" type="Label" parent="HBoxContainer"]
[node name="RemovePoint" type="Button" parent="HBoxContainer"]
layout_mode = 2
text = "1:00 / 3:00"
text = "-1"
[node name="RemovePlayer" type="TextureButton" parent="HBoxContainer"]
layout_mode = 2
texture_normal = ExtResource("2_xw2ck")

View File

@@ -1,17 +0,0 @@
@tool
extends HBoxContainer
var colour : Color
var title : String:
set = set_title
var index : int
@onready var colour_picker := $TODOColourPickerButton
func _ready() -> void:
$TODOColourPickerButton.color = colour
$Label.text = title
func set_title(value: String) -> void:
title = value
$Label.text = value

View File

@@ -1,44 +0,0 @@
@tool
extends Panel
signal tree_built # used for debugging
const Todo := preload("res://addons/Todo_Manager/todo_class.gd")
const TodoItem := preload("res://addons/Todo_Manager/todoItem_class.gd")
var _sort_alphabetical := true
@onready var tree := $Tree as Tree
func build_tree(todo_item : TodoItem, patterns : Array, cased_patterns : Array[String]) -> void:
tree.clear()
var root := tree.create_item()
root.set_text(0, "Scripts")
var script := tree.create_item(root)
script.set_text(0, todo_item.get_short_path() + " -------")
script.set_metadata(0, todo_item)
for todo in todo_item.todos:
var item := tree.create_item(script)
var content_header : String = todo.content
if "\n" in todo.content:
content_header = content_header.split("\n")[0] + "..."
item.set_text(0, "(%0) - %1".format([todo.line_number, content_header], "%_"))
item.set_tooltip_text(0, todo.content)
item.set_metadata(0, todo)
for i in range(0, len(cased_patterns)):
if cased_patterns[i] == todo.pattern:
item.set_custom_color(0, patterns[i][1])
emit_signal("tree_built")
func sort_alphabetical(a, b) -> bool:
if a.script_path > b.script_path:
return true
else:
return false
func sort_backwards(a, b) -> bool:
if a.script_path < b.script_path:
return true
else:
return false

View File

@@ -1,297 +0,0 @@
@tool
extends Control
#signal tree_built # used for debugging
enum { CASE_INSENSITIVE, CASE_SENSITIVE }
const Project := preload("res://addons/Todo_Manager/Project.gd")
const Current := preload("res://addons/Todo_Manager/Current.gd")
const Todo := preload("res://addons/Todo_Manager/todo_class.gd")
const TodoItem := preload("res://addons/Todo_Manager/todoItem_class.gd")
const ColourPicker := preload("res://addons/Todo_Manager/UI/ColourPicker.tscn")
const Pattern := preload("res://addons/Todo_Manager/UI/Pattern.tscn")
const DEFAULT_PATTERNS := [["\\bTODO\\b", Color("96f1ad"), CASE_INSENSITIVE], ["\\bHACK\\b", Color("d5bc70"), CASE_INSENSITIVE], ["\\bFIXME\\b", Color("d57070"), CASE_INSENSITIVE]]
const DEFAULT_SCRIPT_COLOUR := Color("ccced3")
const DEFAULT_SCRIPT_NAME := false
const DEFAULT_SORT := true
var plugin : EditorPlugin
var todo_items : Array
var script_colour := Color("ccced3")
var ignore_paths : Array[String] = []
var full_path := false
var auto_refresh := true
var builtin_enabled := false
var _sort_alphabetical := true
var patterns := [["\\bTODO\\b", Color("96f1ad"), CASE_INSENSITIVE], ["\\bHACK\\b", Color("d5bc70"), CASE_INSENSITIVE], ["\\bFIXME\\b", Color("d57070"), CASE_INSENSITIVE]]
@onready var tabs := $VBoxContainer/TabContainer as TabContainer
@onready var project := $VBoxContainer/TabContainer/Project as Project
@onready var current := $VBoxContainer/TabContainer/Current as Current
@onready var project_tree := $VBoxContainer/TabContainer/Project/Tree as Tree
@onready var current_tree := $VBoxContainer/TabContainer/Current/Tree as Tree
@onready var settings_panel := $VBoxContainer/TabContainer/Settings as Panel
@onready var colours_container := $VBoxContainer/TabContainer/Settings/ScrollContainer/MarginContainer/VBoxContainer/HBoxContainer3/Colours as VBoxContainer
@onready var pattern_container := $VBoxContainer/TabContainer/Settings/ScrollContainer/MarginContainer/VBoxContainer/HBoxContainer4/Patterns as VBoxContainer
@onready var ignore_textbox := $VBoxContainer/TabContainer/Settings/ScrollContainer/MarginContainer/VBoxContainer/VBoxContainer/HBoxContainer2/Scripts/IgnorePaths/TextEdit as LineEdit
@onready var auto_refresh_button := $VBoxContainer/TabContainer/Settings/ScrollContainer/MarginContainer/VBoxContainer/HBoxContainer5/Patterns/RefreshCheckButton as CheckButton
func _ready() -> void:
load_config()
populate_settings()
func build_tree() -> void:
if tabs:
match tabs.current_tab:
0:
project.build_tree(todo_items, ignore_paths, patterns, plugin.cased_patterns, _sort_alphabetical, full_path)
create_config_file()
1:
current.build_tree(get_active_script(), patterns, plugin.cased_patterns)
create_config_file()
2:
pass
_:
pass
func get_active_script() -> TodoItem:
var current_script : Script = plugin.get_editor_interface().get_script_editor().get_current_script()
if current_script:
var script_path = current_script.resource_path
for todo_item in todo_items:
if todo_item.script_path == script_path:
return todo_item
# nothing found
var todo_item := TodoItem.new(script_path, [])
return todo_item
else:
# not a script
var todo_item := TodoItem.new("res://Documentation", [])
return todo_item
func go_to_script(script_path: String, line_number : int = 0) -> void:
if plugin.get_editor_interface().get_editor_settings().get_setting("text_editor/external/use_external_editor"):
var exec_path = plugin.get_editor_interface().get_editor_settings().get_setting("text_editor/external/exec_path")
var args := get_exec_flags(exec_path, script_path, line_number)
OS.execute(exec_path, args)
else:
var script := load(script_path)
plugin.get_editor_interface().edit_resource(script)
plugin.get_editor_interface().get_script_editor().goto_line(line_number - 1)
func get_exec_flags(editor_path : String, script_path : String, line_number : int) -> PackedStringArray:
var args : PackedStringArray
var script_global_path = ProjectSettings.globalize_path(script_path)
if editor_path.ends_with("code.cmd") or editor_path.ends_with("code"): ## VS Code
args.append(ProjectSettings.globalize_path("res://"))
args.append("--goto")
args.append(script_global_path + ":" + str(line_number))
elif editor_path.ends_with("rider64.exe") or editor_path.ends_with("rider"): ## Rider
args.append("--line")
args.append(str(line_number))
args.append(script_global_path)
else: ## Atom / Sublime
args.append(script_global_path + ":" + str(line_number))
return args
func sort_alphabetical(a, b) -> bool:
if a.script_path > b.script_path:
return true
else:
return false
func sort_backwards(a, b) -> bool:
if a.script_path < b.script_path:
return true
else:
return false
func populate_settings() -> void:
for i in patterns.size():
## Create Colour Pickers
var colour_picker: Variant = ColourPicker.instantiate()
colour_picker.colour = patterns[i][1]
colour_picker.title = patterns[i][0]
colour_picker.index = i
colours_container.add_child(colour_picker)
colour_picker.colour_picker.color_changed.connect(change_colour.bind(i))
## Create Patterns
var pattern_edit: Variant = Pattern.instantiate()
pattern_edit.text = patterns[i][0]
pattern_edit.index = i
pattern_container.add_child(pattern_edit)
pattern_edit.line_edit.text_changed.connect(change_pattern.bind(i,
colour_picker))
pattern_edit.remove_button.pressed.connect(remove_pattern.bind(i,
pattern_edit, colour_picker))
pattern_edit.case_checkbox.toggled.connect(case_sensitive_pattern.bind(i))
pattern_edit.case_checkbox.button_pressed = patterns[i][2]
var pattern_button := $VBoxContainer/TabContainer/Settings/ScrollContainer/MarginContainer/VBoxContainer/HBoxContainer4/Patterns/AddPatternButton
$VBoxContainer/TabContainer/Settings/ScrollContainer/MarginContainer/VBoxContainer/HBoxContainer4/Patterns.move_child(pattern_button, 0)
# path filtering
var ignore_paths_field := ignore_textbox
if not ignore_paths_field.is_connected("text_changed", _on_ignore_paths_changed):
ignore_paths_field.connect("text_changed", _on_ignore_paths_changed)
var ignore_paths_text := ""
for path in ignore_paths:
ignore_paths_text += path + ", "
ignore_paths_text = ignore_paths_text.trim_suffix(", ")
ignore_paths_field.text = ignore_paths_text
auto_refresh_button.button_pressed = auto_refresh
func rebuild_settings() -> void:
for node in colours_container.get_children():
node.queue_free()
for node in pattern_container.get_children():
if node is Button:
continue
node.queue_free()
populate_settings()
#### CONFIG FILE ####
func create_config_file() -> void:
var config = ConfigFile.new()
config.set_value("scripts", "full_path", full_path)
config.set_value("scripts", "sort_alphabetical", _sort_alphabetical)
config.set_value("scripts", "script_colour", script_colour)
config.set_value("scripts", "ignore_paths", ignore_paths)
config.set_value("patterns", "patterns", patterns)
config.set_value("config", "auto_refresh", auto_refresh)
config.set_value("config", "builtin_enabled", builtin_enabled)
var err = config.save("res://addons/Todo_Manager/todo.cfg")
func load_config() -> void:
var config := ConfigFile.new()
if config.load("res://addons/Todo_Manager/todo.cfg") == OK:
full_path = config.get_value("scripts", "full_path", DEFAULT_SCRIPT_NAME)
_sort_alphabetical = config.get_value("scripts", "sort_alphabetical", DEFAULT_SORT)
script_colour = config.get_value("scripts", "script_colour", DEFAULT_SCRIPT_COLOUR)
ignore_paths = config.get_value("scripts", "ignore_paths", [] as Array[String])
patterns = config.get_value("patterns", "patterns", DEFAULT_PATTERNS)
auto_refresh = config.get_value("config", "auto_refresh", true)
builtin_enabled = config.get_value("config", "builtin_enabled", false)
else:
create_config_file()
#### Events ####
func _on_SettingsButton_toggled(button_pressed: bool) -> void:
settings_panel.visible = button_pressed
if button_pressed == false:
create_config_file()
# plugin.find_tokens_from_path(plugin.script_cache)
if auto_refresh:
plugin.rescan_files(true)
func _on_Tree_item_activated() -> void:
var item : TreeItem
match tabs.current_tab:
0:
item = project_tree.get_selected()
1:
item = current_tree.get_selected()
if item.get_metadata(0) is Todo:
var todo : Todo = item.get_metadata(0)
call_deferred("go_to_script", todo.script_path, todo.line_number)
else:
var todo_item = item.get_metadata(0)
call_deferred("go_to_script", todo_item.script_path)
func _on_FullPathCheckBox_toggled(button_pressed: bool) -> void:
full_path = button_pressed
func _on_ScriptColourPickerButton_color_changed(color: Color) -> void:
script_colour = color
func _on_RescanButton_pressed() -> void:
plugin.rescan_files(true)
func change_colour(colour: Color, index: int) -> void:
patterns[index][1] = colour
func change_pattern(value: String, index: int, this_colour: Node) -> void:
patterns[index][0] = value
this_colour.title = value
plugin.rescan_files(true)
func remove_pattern(index: int, this: Node, this_colour: Node) -> void:
patterns.remove_at(index)
this.queue_free()
this_colour.queue_free()
plugin.rescan_files(true)
func case_sensitive_pattern(active: bool, index: int) -> void:
if active:
patterns[index][2] = CASE_SENSITIVE
else:
patterns[index][2] = CASE_INSENSITIVE
plugin.rescan_files(true)
func _on_DefaultButton_pressed() -> void:
patterns = DEFAULT_PATTERNS.duplicate(true)
_sort_alphabetical = DEFAULT_SORT
script_colour = DEFAULT_SCRIPT_COLOUR
full_path = DEFAULT_SCRIPT_NAME
rebuild_settings()
plugin.rescan_files(true)
func _on_AlphSortCheckBox_toggled(button_pressed: bool) -> void:
_sort_alphabetical = button_pressed
plugin.rescan_files(true)
func _on_AddPatternButton_pressed() -> void:
patterns.append(["\\bplaceholder\\b", Color.WHITE, CASE_INSENSITIVE])
rebuild_settings()
func _on_RefreshCheckButton_toggled(button_pressed: bool) -> void:
auto_refresh = button_pressed
func _on_Timer_timeout() -> void:
plugin.refresh_lock = false
func _on_ignore_paths_changed(new_text: String) -> void:
var text = ignore_textbox.text
var split: Array = text.split(',')
ignore_paths.clear()
for elem in split:
if elem == " " || elem == "":
continue
ignore_paths.push_front(elem.lstrip(' ').rstrip(' '))
# validate so no empty string slips through (all paths ignored)
var i := 0
for path in ignore_paths:
if (path == "" || path == " "):
ignore_paths.remove_at(i)
i += 1
plugin.rescan_files(true)
func _on_TabContainer_tab_changed(tab: int) -> void:
build_tree()
func _on_BuiltInCheckButton_toggled(button_pressed: bool) -> void:
builtin_enabled = button_pressed
plugin.rescan_files(true)

View File

@@ -1,21 +0,0 @@
@tool
extends HBoxContainer
var text : String : set = set_text
var disabled : bool
var index : int
@onready var line_edit := $LineEdit as LineEdit
@onready var remove_button := $RemoveButton as Button
@onready var case_checkbox := %CaseSensativeCheckbox as CheckBox
func _ready() -> void:
line_edit.text = text
remove_button.disabled = disabled
func set_text(value: String) -> void:
text = value
if line_edit:
line_edit.text = value

View File

@@ -1,74 +0,0 @@
@tool
extends Panel
signal tree_built # used for debugging
const Todo := preload("res://addons/Todo_Manager/todo_class.gd")
var _sort_alphabetical := true
var _full_path := false
@onready var tree := $Tree as Tree
func build_tree(todo_items : Array, ignore_paths : Array, patterns : Array, cased_patterns: Array[String], sort_alphabetical : bool, full_path : bool) -> void:
_full_path = full_path
tree.clear()
if sort_alphabetical:
todo_items.sort_custom(Callable(self, "sort_alphabetical"))
else:
todo_items.sort_custom(Callable(self, "sort_backwards"))
var root := tree.create_item()
root.set_text(0, "Scripts")
for todo_item in todo_items:
var ignore := false
for ignore_path in ignore_paths:
var script_path : String = todo_item.script_path
if script_path.begins_with(ignore_path) or script_path.begins_with("res://" + ignore_path) or script_path.begins_with("res:///" + ignore_path):
ignore = true
break
if ignore:
continue
var script := tree.create_item(root)
if full_path:
script.set_text(0, todo_item.script_path + " -------")
else:
script.set_text(0, todo_item.get_short_path() + " -------")
script.set_metadata(0, todo_item)
for todo in todo_item.todos:
var item := tree.create_item(script)
var content_header : String = todo.content
if "\n" in todo.content:
content_header = content_header.split("\n")[0] + "..."
item.set_text(0, "(%0) - %1".format([todo.line_number, content_header], "%_"))
item.set_tooltip_text(0, todo.content)
item.set_metadata(0, todo)
print(todo.title)
for i in range(0, len(cased_patterns)):
if cased_patterns[i] == todo.pattern:
item.set_custom_color(0, patterns[i][1])
emit_signal("tree_built")
func sort_alphabetical(a, b) -> bool:
if _full_path:
if a.script_path < b.script_path:
return true
else:
return false
else:
if a.get_short_path() < b.get_short_path():
return true
else:
return false
func sort_backwards(a, b) -> bool:
if _full_path:
if a.script_path > b.script_path:
return true
else:
return false
else:
if a.get_short_path() > b.get_short_path():
return true
else:
return false

View File

@@ -1,21 +0,0 @@
[gd_scene load_steps=2 format=3 uid="uid://bie1xn8v1kd66"]
[ext_resource type="Script" path="res://addons/Todo_Manager/ColourPicker.gd" id="1"]
[node name="TODOColour" type="HBoxContainer"]
offset_right = 105.0
offset_bottom = 31.0
script = ExtResource("1")
metadata/_edit_use_custom_anchors = false
[node name="Label" type="Label" parent="."]
offset_top = 4.0
offset_right = 1.0
offset_bottom = 27.0
[node name="TODOColourPickerButton" type="ColorPickerButton" parent="."]
custom_minimum_size = Vector2(40, 0)
offset_left = 65.0
offset_right = 105.0
offset_bottom = 31.0
size_flags_horizontal = 10

View File

@@ -1,316 +0,0 @@
[gd_scene load_steps=6 format=3 uid="uid://b6k0dtftankcx"]
[ext_resource type="Script" path="res://addons/Todo_Manager/Dock.gd" id="1"]
[ext_resource type="Script" path="res://addons/Todo_Manager/Project.gd" id="2"]
[ext_resource type="Script" path="res://addons/Todo_Manager/Current.gd" id="3"]
[sub_resource type="ButtonGroup" id="ButtonGroup_kqxcu"]
[sub_resource type="ButtonGroup" id="ButtonGroup_kltg3"]
[node name="Dock" type="Control"]
custom_minimum_size = Vector2(0, 200)
layout_mode = 3
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
size_flags_vertical = 3
script = ExtResource("1")
[node name="VBoxContainer" type="VBoxContainer" parent="."]
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
offset_top = 4.0
grow_horizontal = 2
grow_vertical = 2
metadata/_edit_layout_mode = 1
[node name="Header" type="HBoxContainer" parent="VBoxContainer"]
visible = false
layout_mode = 2
[node name="HeaderLeft" type="HBoxContainer" parent="VBoxContainer/Header"]
layout_mode = 2
size_flags_horizontal = 3
[node name="Title" type="Label" parent="VBoxContainer/Header/HeaderLeft"]
layout_mode = 2
text = "Todo Dock:"
[node name="HeaderRight" type="HBoxContainer" parent="VBoxContainer/Header"]
layout_mode = 2
size_flags_horizontal = 3
alignment = 2
[node name="SettingsButton" type="Button" parent="VBoxContainer/Header/HeaderRight"]
visible = false
layout_mode = 2
toggle_mode = true
text = "Settings"
[node name="TabContainer" type="TabContainer" parent="VBoxContainer"]
layout_mode = 2
size_flags_vertical = 3
[node name="Project" type="Panel" parent="VBoxContainer/TabContainer"]
layout_mode = 2
size_flags_horizontal = 3
size_flags_vertical = 3
script = ExtResource("2")
[node name="Tree" type="Tree" parent="VBoxContainer/TabContainer/Project"]
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
hide_root = true
[node name="Current" type="Panel" parent="VBoxContainer/TabContainer"]
visible = false
layout_mode = 2
size_flags_horizontal = 3
size_flags_vertical = 3
script = ExtResource("3")
[node name="Tree" type="Tree" parent="VBoxContainer/TabContainer/Current"]
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
hide_folding = true
hide_root = true
[node name="Settings" type="Panel" parent="VBoxContainer/TabContainer"]
visible = false
layout_mode = 2
[node name="ScrollContainer" type="ScrollContainer" parent="VBoxContainer/TabContainer/Settings"]
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
[node name="MarginContainer" type="MarginContainer" parent="VBoxContainer/TabContainer/Settings/ScrollContainer"]
layout_mode = 2
size_flags_horizontal = 3
size_flags_vertical = 3
[node name="VBoxContainer" type="VBoxContainer" parent="VBoxContainer/TabContainer/Settings/ScrollContainer/MarginContainer"]
layout_mode = 2
size_flags_horizontal = 3
size_flags_vertical = 3
[node name="Scripts" type="HBoxContainer" parent="VBoxContainer/TabContainer/Settings/ScrollContainer/MarginContainer/VBoxContainer"]
layout_mode = 2
[node name="Label" type="Label" parent="VBoxContainer/TabContainer/Settings/ScrollContainer/MarginContainer/VBoxContainer/Scripts"]
layout_mode = 2
text = "Scripts:"
[node name="HSeparator" type="HSeparator" parent="VBoxContainer/TabContainer/Settings/ScrollContainer/MarginContainer/VBoxContainer/Scripts"]
layout_mode = 2
size_flags_horizontal = 3
[node name="VBoxContainer" type="VBoxContainer" parent="VBoxContainer/TabContainer/Settings/ScrollContainer/MarginContainer/VBoxContainer"]
layout_mode = 2
size_flags_horizontal = 5
[node name="HBoxContainer2" type="HBoxContainer" parent="VBoxContainer/TabContainer/Settings/ScrollContainer/MarginContainer/VBoxContainer/VBoxContainer"]
layout_mode = 2
[node name="VSeparator" type="VSeparator" parent="VBoxContainer/TabContainer/Settings/ScrollContainer/MarginContainer/VBoxContainer/VBoxContainer/HBoxContainer2"]
layout_mode = 2
[node name="Scripts" type="VBoxContainer" parent="VBoxContainer/TabContainer/Settings/ScrollContainer/MarginContainer/VBoxContainer/VBoxContainer/HBoxContainer2"]
layout_mode = 2
[node name="ScriptName" type="HBoxContainer" parent="VBoxContainer/TabContainer/Settings/ScrollContainer/MarginContainer/VBoxContainer/VBoxContainer/HBoxContainer2/Scripts"]
layout_mode = 2
[node name="Label" type="Label" parent="VBoxContainer/TabContainer/Settings/ScrollContainer/MarginContainer/VBoxContainer/VBoxContainer/HBoxContainer2/Scripts/ScriptName"]
layout_mode = 2
text = "Script Name:"
[node name="FullPathCheckBox" type="CheckBox" parent="VBoxContainer/TabContainer/Settings/ScrollContainer/MarginContainer/VBoxContainer/VBoxContainer/HBoxContainer2/Scripts/ScriptName"]
layout_mode = 2
button_group = SubResource("ButtonGroup_kqxcu")
text = "Full path"
[node name="ShortNameCheckBox" type="CheckBox" parent="VBoxContainer/TabContainer/Settings/ScrollContainer/MarginContainer/VBoxContainer/VBoxContainer/HBoxContainer2/Scripts/ScriptName"]
layout_mode = 2
button_pressed = true
button_group = SubResource("ButtonGroup_kqxcu")
text = "Short name"
[node name="ScriptSort" type="HBoxContainer" parent="VBoxContainer/TabContainer/Settings/ScrollContainer/MarginContainer/VBoxContainer/VBoxContainer/HBoxContainer2/Scripts"]
layout_mode = 2
[node name="Label" type="Label" parent="VBoxContainer/TabContainer/Settings/ScrollContainer/MarginContainer/VBoxContainer/VBoxContainer/HBoxContainer2/Scripts/ScriptSort"]
layout_mode = 2
text = "Sort Order:"
[node name="AlphSortCheckBox" type="CheckBox" parent="VBoxContainer/TabContainer/Settings/ScrollContainer/MarginContainer/VBoxContainer/VBoxContainer/HBoxContainer2/Scripts/ScriptSort"]
layout_mode = 2
button_pressed = true
button_group = SubResource("ButtonGroup_kltg3")
text = "Alphabetical"
[node name="RAlphSortCheckBox" type="CheckBox" parent="VBoxContainer/TabContainer/Settings/ScrollContainer/MarginContainer/VBoxContainer/VBoxContainer/HBoxContainer2/Scripts/ScriptSort"]
layout_mode = 2
button_group = SubResource("ButtonGroup_kltg3")
text = "Reverse Alphabetical"
[node name="ScriptColour" type="HBoxContainer" parent="VBoxContainer/TabContainer/Settings/ScrollContainer/MarginContainer/VBoxContainer/VBoxContainer/HBoxContainer2/Scripts"]
layout_mode = 2
[node name="Label" type="Label" parent="VBoxContainer/TabContainer/Settings/ScrollContainer/MarginContainer/VBoxContainer/VBoxContainer/HBoxContainer2/Scripts/ScriptColour"]
layout_mode = 2
text = "Script Colour:"
[node name="ScriptColourPickerButton" type="ColorPickerButton" parent="VBoxContainer/TabContainer/Settings/ScrollContainer/MarginContainer/VBoxContainer/VBoxContainer/HBoxContainer2/Scripts/ScriptColour"]
custom_minimum_size = Vector2(40, 0)
layout_mode = 2
color = Color(0.8, 0.807843, 0.827451, 1)
[node name="IgnorePaths" type="HBoxContainer" parent="VBoxContainer/TabContainer/Settings/ScrollContainer/MarginContainer/VBoxContainer/VBoxContainer/HBoxContainer2/Scripts"]
layout_mode = 2
[node name="Label" type="Label" parent="VBoxContainer/TabContainer/Settings/ScrollContainer/MarginContainer/VBoxContainer/VBoxContainer/HBoxContainer2/Scripts/IgnorePaths"]
layout_mode = 2
text = "Ignore Paths:"
[node name="TextEdit" type="LineEdit" parent="VBoxContainer/TabContainer/Settings/ScrollContainer/MarginContainer/VBoxContainer/VBoxContainer/HBoxContainer2/Scripts/IgnorePaths"]
custom_minimum_size = Vector2(100, 0)
layout_mode = 2
expand_to_text_length = true
[node name="Label3" type="Label" parent="VBoxContainer/TabContainer/Settings/ScrollContainer/MarginContainer/VBoxContainer/VBoxContainer/HBoxContainer2/Scripts/IgnorePaths"]
layout_mode = 2
text = "(Separated by commas)"
[node name="TODOColours" type="HBoxContainer" parent="VBoxContainer/TabContainer/Settings/ScrollContainer/MarginContainer/VBoxContainer"]
layout_mode = 2
[node name="Label" type="Label" parent="VBoxContainer/TabContainer/Settings/ScrollContainer/MarginContainer/VBoxContainer/TODOColours"]
layout_mode = 2
text = "TODO Colours:"
[node name="HSeparator" type="HSeparator" parent="VBoxContainer/TabContainer/Settings/ScrollContainer/MarginContainer/VBoxContainer/TODOColours"]
layout_mode = 2
size_flags_horizontal = 3
[node name="HBoxContainer3" type="HBoxContainer" parent="VBoxContainer/TabContainer/Settings/ScrollContainer/MarginContainer/VBoxContainer"]
layout_mode = 2
[node name="VSeparator" type="VSeparator" parent="VBoxContainer/TabContainer/Settings/ScrollContainer/MarginContainer/VBoxContainer/HBoxContainer3"]
layout_mode = 2
[node name="Colours" type="VBoxContainer" parent="VBoxContainer/TabContainer/Settings/ScrollContainer/MarginContainer/VBoxContainer/HBoxContainer3"]
layout_mode = 2
[node name="Patterns" type="HBoxContainer" parent="VBoxContainer/TabContainer/Settings/ScrollContainer/MarginContainer/VBoxContainer"]
layout_mode = 2
[node name="Label" type="Label" parent="VBoxContainer/TabContainer/Settings/ScrollContainer/MarginContainer/VBoxContainer/Patterns"]
layout_mode = 2
text = "Patterns:"
[node name="HSeparator" type="HSeparator" parent="VBoxContainer/TabContainer/Settings/ScrollContainer/MarginContainer/VBoxContainer/Patterns"]
layout_mode = 2
size_flags_horizontal = 3
[node name="HBoxContainer4" type="HBoxContainer" parent="VBoxContainer/TabContainer/Settings/ScrollContainer/MarginContainer/VBoxContainer"]
layout_mode = 2
[node name="VSeparator" type="VSeparator" parent="VBoxContainer/TabContainer/Settings/ScrollContainer/MarginContainer/VBoxContainer/HBoxContainer4"]
layout_mode = 2
[node name="Patterns" type="VBoxContainer" parent="VBoxContainer/TabContainer/Settings/ScrollContainer/MarginContainer/VBoxContainer/HBoxContainer4"]
layout_mode = 2
size_flags_horizontal = 3
[node name="AddPatternButton" type="Button" parent="VBoxContainer/TabContainer/Settings/ScrollContainer/MarginContainer/VBoxContainer/HBoxContainer4/Patterns"]
layout_mode = 2
size_flags_horizontal = 0
text = "Add"
[node name="Config" type="HBoxContainer" parent="VBoxContainer/TabContainer/Settings/ScrollContainer/MarginContainer/VBoxContainer"]
layout_mode = 2
[node name="Label" type="Label" parent="VBoxContainer/TabContainer/Settings/ScrollContainer/MarginContainer/VBoxContainer/Config"]
layout_mode = 2
text = "Config:"
[node name="HSeparator" type="HSeparator" parent="VBoxContainer/TabContainer/Settings/ScrollContainer/MarginContainer/VBoxContainer/Config"]
layout_mode = 2
size_flags_horizontal = 3
[node name="HBoxContainer5" type="HBoxContainer" parent="VBoxContainer/TabContainer/Settings/ScrollContainer/MarginContainer/VBoxContainer"]
layout_mode = 2
[node name="VSeparator" type="VSeparator" parent="VBoxContainer/TabContainer/Settings/ScrollContainer/MarginContainer/VBoxContainer/HBoxContainer5"]
layout_mode = 2
[node name="Patterns" type="VBoxContainer" parent="VBoxContainer/TabContainer/Settings/ScrollContainer/MarginContainer/VBoxContainer/HBoxContainer5"]
layout_mode = 2
[node name="RefreshCheckButton" type="CheckButton" parent="VBoxContainer/TabContainer/Settings/ScrollContainer/MarginContainer/VBoxContainer/HBoxContainer5/Patterns"]
layout_mode = 2
size_flags_horizontal = 0
button_pressed = true
text = "Auto Refresh"
[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer/TabContainer/Settings/ScrollContainer/MarginContainer/VBoxContainer/HBoxContainer5/Patterns"]
layout_mode = 2
[node name="BuiltInCheckButton" type="CheckButton" parent="VBoxContainer/TabContainer/Settings/ScrollContainer/MarginContainer/VBoxContainer/HBoxContainer5/Patterns/HBoxContainer"]
layout_mode = 2
text = "Scan Built-in Scripts"
[node name="Label" type="Label" parent="VBoxContainer/TabContainer/Settings/ScrollContainer/MarginContainer/VBoxContainer/HBoxContainer5/Patterns/HBoxContainer"]
layout_mode = 2
text = "Some functionality will not work for built-in scripts"
[node name="DefaultButton" type="Button" parent="VBoxContainer/TabContainer/Settings/ScrollContainer/MarginContainer/VBoxContainer/HBoxContainer5/Patterns"]
layout_mode = 2
size_flags_horizontal = 0
text = "Reset to default"
[node name="Timer" type="Timer" parent="."]
one_shot = true
[node name="RescanButton" type="Button" parent="."]
layout_mode = 1
anchors_preset = 1
anchor_left = 1.0
anchor_right = 1.0
offset_left = -102.0
offset_top = 3.0
offset_bottom = 34.0
grow_horizontal = 0
text = "Rescan Files"
flat = true
[connection signal="toggled" from="VBoxContainer/Header/HeaderRight/SettingsButton" to="." method="_on_SettingsButton_toggled"]
[connection signal="tab_changed" from="VBoxContainer/TabContainer" to="." method="_on_TabContainer_tab_changed"]
[connection signal="item_activated" from="VBoxContainer/TabContainer/Project/Tree" to="." method="_on_Tree_item_activated"]
[connection signal="item_activated" from="VBoxContainer/TabContainer/Current/Tree" to="." method="_on_Tree_item_activated"]
[connection signal="toggled" from="VBoxContainer/TabContainer/Settings/ScrollContainer/MarginContainer/VBoxContainer/VBoxContainer/HBoxContainer2/Scripts/ScriptName/FullPathCheckBox" to="." method="_on_FullPathCheckBox_toggled"]
[connection signal="toggled" from="VBoxContainer/TabContainer/Settings/ScrollContainer/MarginContainer/VBoxContainer/VBoxContainer/HBoxContainer2/Scripts/ScriptSort/AlphSortCheckBox" to="." method="_on_AlphSortCheckBox_toggled"]
[connection signal="color_changed" from="VBoxContainer/TabContainer/Settings/ScrollContainer/MarginContainer/VBoxContainer/VBoxContainer/HBoxContainer2/Scripts/ScriptColour/ScriptColourPickerButton" to="." method="_on_ScriptColourPickerButton_color_changed"]
[connection signal="pressed" from="VBoxContainer/TabContainer/Settings/ScrollContainer/MarginContainer/VBoxContainer/HBoxContainer4/Patterns/AddPatternButton" to="." method="_on_AddPatternButton_pressed"]
[connection signal="toggled" from="VBoxContainer/TabContainer/Settings/ScrollContainer/MarginContainer/VBoxContainer/HBoxContainer5/Patterns/RefreshCheckButton" to="." method="_on_RefreshCheckButton_toggled"]
[connection signal="toggled" from="VBoxContainer/TabContainer/Settings/ScrollContainer/MarginContainer/VBoxContainer/HBoxContainer5/Patterns/HBoxContainer/BuiltInCheckButton" to="." method="_on_BuiltInCheckButton_toggled"]
[connection signal="pressed" from="VBoxContainer/TabContainer/Settings/ScrollContainer/MarginContainer/VBoxContainer/HBoxContainer5/Patterns/DefaultButton" to="." method="_on_DefaultButton_pressed"]
[connection signal="timeout" from="Timer" to="." method="_on_Timer_timeout"]
[connection signal="pressed" from="RescanButton" to="." method="_on_RescanButton_pressed"]

View File

@@ -1,26 +0,0 @@
[gd_scene load_steps=2 format=3 uid="uid://bx11sel2q5wli"]
[ext_resource type="Script" path="res://addons/Todo_Manager/Pattern.gd" id="1"]
[node name="Pattern" type="HBoxContainer"]
script = ExtResource("1")
[node name="LineEdit" type="LineEdit" parent="."]
layout_mode = 2
size_flags_horizontal = 0
expand_to_text_length = true
[node name="RemoveButton" type="Button" parent="."]
layout_mode = 2
text = "-"
[node name="MarginContainer" type="MarginContainer" parent="."]
custom_minimum_size = Vector2(20, 0)
layout_mode = 2
size_flags_horizontal = 0
[node name="CaseSensativeCheckbox" type="CheckBox" parent="."]
unique_name_in_owner = true
layout_mode = 2
size_flags_horizontal = 0
text = "Case Sensitive"

View File

@@ -1,7 +0,0 @@
extends Node
# TODO: this is a TODO
# HACK: this is a HACK
# FIXME: this is a FIXME
# TODO this works too
#Hack any format will do

Binary file not shown.

Before

Width:  |  Height:  |  Size: 111 KiB

View File

@@ -1,34 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cew0b35dqpm86"
path="res://.godot/imported/Instruct1.png-698c6faa3ef3ac4960807faa3e028bd6.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/Todo_Manager/doc/images/Instruct1.png"
dest_files=["res://.godot/imported/Instruct1.png-698c6faa3ef3ac4960807faa3e028bd6.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

View File

@@ -1,34 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://bix3qvdo0p21c"
path="res://.godot/imported/TODO_Manager_Logo.png-e07d7ec75201c66b732ef87ec1bece15.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/Todo_Manager/doc/images/TODO_Manager_Logo.png"
dest_files=["res://.godot/imported/TODO_Manager_Logo.png-e07d7ec75201c66b732ef87ec1bece15.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

Binary file not shown.

Before

Width:  |  Height:  |  Size: 243 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 30 KiB

View File

@@ -1,7 +0,0 @@
[plugin]
name="Todo Manager"
description="Dock for housing TODO messages."
author="Peter de Vroom"
version="2.2.1"
script="plugin.gd"

View File

@@ -1,280 +0,0 @@
@tool
extends EditorPlugin
const DockScene := preload("res://addons/Todo_Manager/UI/Dock.tscn")
const Dock := preload("res://addons/Todo_Manager/Dock.gd")
const Todo := preload("res://addons/Todo_Manager/todo_class.gd")
const TodoItem := preload("res://addons/Todo_Manager/todoItem_class.gd")
var _dockUI : Dock
class TodoCacheValue:
var todos: Array
var last_modified_time: int
func _init(todos: Array, last_modified_time: int):
self.todos = todos
self.last_modified_time = last_modified_time
var todo_cache : Dictionary # { key: script_path, value: TodoCacheValue }
var remove_queue : Array
var combined_pattern : String
var cased_patterns : Array[String]
var refresh_lock := false # makes sure _on_filesystem_changed only triggers once
func _enter_tree() -> void:
_dockUI = DockScene.instantiate() as Control
add_control_to_bottom_panel(_dockUI, "TODO")
get_editor_interface().get_resource_filesystem().connect("filesystem_changed",
_on_filesystem_changed)
get_editor_interface().get_file_system_dock().connect("file_removed", queue_remove)
get_editor_interface().get_script_editor().connect("editor_script_changed",
_on_active_script_changed)
_dockUI.plugin = self
combined_pattern = combine_patterns(_dockUI.patterns)
find_tokens_from_path(find_scripts())
_dockUI.build_tree()
func _exit_tree() -> void:
_dockUI.create_config_file()
remove_control_from_bottom_panel(_dockUI)
_dockUI.free()
func queue_remove(file: String):
for i in _dockUI.todo_items.size() - 1:
if _dockUI.todo_items[i].script_path == file:
_dockUI.todo_items.remove_at(i)
func find_tokens_from_path(scripts: Array[String]) -> void:
for script_path in scripts:
var file := FileAccess.open(script_path, FileAccess.READ)
var contents := file.get_as_text()
find_tokens(contents, script_path)
func find_tokens_from_script(script: Resource) -> void:
find_tokens(script.source_code, script.resource_path)
func find_tokens(text: String, script_path: String) -> void:
var cached_todos = get_cached_todos(script_path)
if cached_todos.size() != 0:
# var i := 0
# for todo_item in _dockUI.todo_items:
# if todo_item.script_path == script_path:
# _dockUI.todo_items.remove_at(i)
# i += 1
var todo_item := TodoItem.new(script_path, cached_todos)
_dockUI.todo_items.append(todo_item)
else:
var regex = RegEx.new()
# if regex.compile("#\\s*\\bTODO\\b.*|#\\s*\\bHACK\\b.*") == OK:
if regex.compile(combined_pattern) == OK:
var result : Array[RegExMatch] = regex.search_all(text)
if result.is_empty():
for i in _dockUI.todo_items.size():
if _dockUI.todo_items[i].script_path == script_path:
_dockUI.todo_items.remove_at(i)
return # No tokens found
var match_found : bool
var i := 0
for todo_item in _dockUI.todo_items:
if todo_item.script_path == script_path:
match_found = true
var updated_todo_item := update_todo_item(todo_item, result, text, script_path)
_dockUI.todo_items.remove_at(i)
_dockUI.todo_items.insert(i, updated_todo_item)
break
i += 1
if !match_found:
_dockUI.todo_items.append(create_todo_item(result, text, script_path))
func create_todo_item(regex_results: Array[RegExMatch], text: String, script_path: String) -> TodoItem:
var todo_item = TodoItem.new(script_path, [])
todo_item.script_path = script_path
var last_line_number := 0
var lines := text.split("\n")
for r in regex_results:
var new_todo : Todo = create_todo(r.get_string(), script_path)
new_todo.line_number = get_line_number(r.get_string(), text, last_line_number)
# GD Multiline comment
var trailing_line := new_todo.line_number
var should_break = false
while trailing_line < lines.size() and lines[trailing_line].dedent().begins_with("#"):
for other_r in regex_results:
if lines[trailing_line] in other_r.get_string():
should_break = true
break
if should_break:
break
new_todo.content += "\n" + lines[trailing_line]
trailing_line += 1
last_line_number = new_todo.line_number
todo_item.todos.append(new_todo)
cache_todos(todo_item.todos, script_path)
return todo_item
func update_todo_item(todo_item: TodoItem, regex_results: Array[RegExMatch], text: String, script_path: String) -> TodoItem:
todo_item.todos.clear()
var lines := text.split("\n")
for r in regex_results:
var new_todo : Todo = create_todo(r.get_string(), script_path)
new_todo.line_number = get_line_number(r.get_string(), text)
# GD Multiline comment
var trailing_line := new_todo.line_number
var should_break = false
while trailing_line < lines.size() and lines[trailing_line].dedent().begins_with("#"):
for other_r in regex_results:
if lines[trailing_line] in other_r.get_string():
should_break = true
break
if should_break:
break
new_todo.content += "\n" + lines[trailing_line]
trailing_line += 1
todo_item.todos.append(new_todo)
return todo_item
func get_line_number(what: String, from: String, start := 0) -> int:
what = what.split('\n')[0] # Match first line of multiline C# comments
var temp_array := from.split('\n')
var lines := Array(temp_array)
var line_number# = lines.find(what) + 1
for i in range(start, lines.size()):
if what in lines[i]:
line_number = i + 1 # +1 to account of 0-based array vs 1-based line numbers
break
else:
line_number = 0 # This is an error
return line_number
func _on_filesystem_changed() -> void:
if !refresh_lock:
if _dockUI.auto_refresh:
refresh_lock = true
_dockUI.get_node("Timer").start()
rescan_files(false)
func find_scripts() -> Array[String]:
var scripts : Array[String]
var directory_queue : Array[String]
var dir := DirAccess.open("res://")
### FIRST PHASE ###
if dir.get_open_error() == OK:
get_dir_contents(dir, scripts, directory_queue)
else:
printerr("TODO_Manager: There was an error during find_scripts() ### First Phase ###")
### SECOND PHASE ###
while not directory_queue.is_empty():
if dir.change_dir(directory_queue[0]) == OK:
get_dir_contents(dir, scripts, directory_queue)
else:
printerr("TODO_Manager: There was an error at: " + directory_queue[0])
directory_queue.pop_front()
return scripts
func cache_todos(todos: Array, script_path: String) -> void:
var last_modified_time = FileAccess.get_modified_time(script_path)
todo_cache[script_path] = TodoCacheValue.new(todos, last_modified_time)
func get_cached_todos(script_path: String) -> Array:
if todo_cache.has(script_path):
var cached_value: TodoCacheValue = todo_cache[script_path]
if cached_value.last_modified_time == FileAccess.get_modified_time(script_path):
return cached_value.todos
return []
func get_dir_contents(dir: DirAccess, scripts: Array[String], directory_queue: Array[String]) -> void:
dir.include_navigational = false
dir.include_hidden = false
dir.list_dir_begin()
var file_name : String = dir.get_next()
while file_name != "":
if dir.current_is_dir():
if file_name == ".import" or file_name == ".mono": # Skip .import folder which should never have scripts
pass
else:
directory_queue.append(dir.get_current_dir() + "/" + file_name)
else:
if file_name.ends_with(".gd") or file_name.ends_with(".cs") \
or file_name.ends_with(".c") or file_name.ends_with(".cpp") or file_name.ends_with(".h") \
or ((file_name.ends_with(".tscn") and _dockUI.builtin_enabled)):
if dir.get_current_dir() == "res://":
scripts.append(dir.get_current_dir() + file_name)
else:
scripts.append(dir.get_current_dir() + "/" + file_name)
file_name = dir.get_next()
func rescan_files(clear_cache: bool) -> void:
_dockUI.todo_items.clear()
if clear_cache:
todo_cache.clear()
combined_pattern = combine_patterns(_dockUI.patterns)
find_tokens_from_path(find_scripts())
_dockUI.build_tree()
func combine_patterns(patterns: Array) -> String:
# Case Sensitivity
cased_patterns = []
for pattern in patterns:
if pattern[2] == _dockUI.CASE_INSENSITIVE:
cased_patterns.append(pattern[0].insert(0, "((?i)") + ")")
else:
cased_patterns.append("(" + pattern[0] + ")")
if patterns.size() == 1:
return cased_patterns[0]
else:
var pattern_string := "((\\/\\*)|(#|\\/\\/))\\s*("
for i in range(patterns.size()):
if i == 0:
pattern_string += cased_patterns[i]
else:
pattern_string += "|" + cased_patterns[i]
pattern_string += ")(?(2)[\\s\\S]*?\\*\\/|.*)"
return pattern_string
func create_todo(todo_string: String, script_path: String) -> Todo:
var todo := Todo.new()
var regex = RegEx.new()
for pattern in cased_patterns:
if regex.compile(pattern) == OK:
var result : RegExMatch = regex.search(todo_string)
if result:
todo.pattern = pattern
todo.title = result.strings[0]
else:
continue
else:
printerr("Error compiling " + pattern)
todo.content = todo_string
todo.script_path = script_path
return todo
func _on_active_script_changed(script) -> void:
if _dockUI:
if _dockUI.tabs.current_tab == 1:
_dockUI.build_tree()

View File

@@ -1,18 +0,0 @@
@tool
extends RefCounted
var script_path : String
var todos : Array
func _init(script_path: String, todos: Array):
self.script_path = script_path
self.todos = todos
func get_short_path() -> String:
var temp_array := script_path.rsplit('/', false, 1)
var short_path : String
if not temp_array.size() > 1:
short_path = "(!)" + temp_array[0]
else:
short_path = temp_array[1]
return short_path

View File

@@ -1,9 +0,0 @@
@tool
extends RefCounted
var pattern : String
var title : String
var content : String
var script_path : String
var line_number : int

View File

@@ -1,21 +0,0 @@
MIT License
Copyright (c) 2016-2023 The Godot Engine community
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

File diff suppressed because it is too large Load Diff

View File

@@ -1,11 +0,0 @@
[configuration]
entry_symbol = "git_plugin_init"
[libraries]
macos.editor = "macos/libgit_plugin.macos.editor.universal.dylib"
windows.editor.x86_64 = "win64/libgit_plugin.windows.editor.x86_64.dll"
linux.editor.x86_64 = "linux/libgit_plugin.linux.editor.x86_64.so"
linux.editor.arm64 = "linux/libgit_plugin.linux.editor.arm64.so"
linux.editor.rv64 = ""

View File

@@ -1,7 +0,0 @@
[plugin]
name="Godot Git Plugin"
description="This plugin lets you interact with Git without leaving the Godot editor. More information can be found at https://github.com/godotengine/godot-git-plugin/wiki"
author="twaritwaikar"
version="v3.0.0"
script="godot-git-plugin.gd"

BIN
characters/Adol.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

View File

@@ -2,16 +2,16 @@
importer="texture"
type="CompressedTexture2D"
uid="uid://dm4238rk6sken"
path="res://.godot/imported/example1.png-6386c332ca46e1e62ea061b956a901cd.ctex"
uid="uid://bou7hnrkomu0i"
path="res://.godot/imported/Adol.png-9e4ae06b99138eef359646c7b22cec79.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/Todo_Manager/doc/images/example1.png"
dest_files=["res://.godot/imported/example1.png-6386c332ca46e1e62ea061b956a901cd.ctex"]
source_file="res://characters/Adol.png"
dest_files=["res://.godot/imported/Adol.png-9e4ae06b99138eef359646c7b22cec79.ctex"]
[params]

BIN
characters/Aloy.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 103 KiB

View File

@@ -2,16 +2,16 @@
importer="texture"
type="CompressedTexture2D"
uid="uid://cpuyli2uwof0w"
path="res://.godot/imported/example2.png-2e3a8f9cd1e178daf22b83dc0513f37a.ctex"
uid="uid://b1lb225rcs0cg"
path="res://.godot/imported/Aloy.png-1991978c81b5e74c0c0934a2dcf1ee6e.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/Todo_Manager/doc/images/example2.png"
dest_files=["res://.godot/imported/example2.png-2e3a8f9cd1e178daf22b83dc0513f37a.ctex"]
source_file="res://characters/Aloy.png"
dest_files=["res://.godot/imported/Aloy.png-1991978c81b5e74c0c0934a2dcf1ee6e.ctex"]
[params]

BIN
characters/Barbarian.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 109 KiB

View File

@@ -2,16 +2,16 @@
importer="texture"
type="CompressedTexture2D"
uid="uid://sd2bremxjlmr"
path="res://.godot/imported/Instruct5.png-001538ed8b5682dcf232de08035aab38.ctex"
uid="uid://dnfxsgmp800cn"
path="res://.godot/imported/Barbarian.png-7300144689e707396818d6f82b278ca6.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/Todo_Manager/doc/images/Instruct5.png"
dest_files=["res://.godot/imported/Instruct5.png-001538ed8b5682dcf232de08035aab38.ctex"]
source_file="res://characters/Barbarian.png"
dest_files=["res://.godot/imported/Barbarian.png-7300144689e707396818d6f82b278ca6.ctex"]
[params]

BIN
characters/Kiryu.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

View File

@@ -2,16 +2,16 @@
importer="texture"
type="CompressedTexture2D"
uid="uid://beyicwm310ytk"
path="res://.godot/imported/Instruct4.png-bf5aa1cffc066175cecf9281b0774809.ctex"
uid="uid://bah8j3gu07305"
path="res://.godot/imported/Kiryu.png-b44fd7e02123323f7129dedbcd326059.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/Todo_Manager/doc/images/Instruct4.png"
dest_files=["res://.godot/imported/Instruct4.png-bf5aa1cffc066175cecf9281b0774809.ctex"]
source_file="res://characters/Kiryu.png"
dest_files=["res://.godot/imported/Kiryu.png-b44fd7e02123323f7129dedbcd326059.ctex"]
[params]

BIN
characters/Kratos.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 129 KiB

View File

@@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://dbquf5kdhijwt"
path="res://.godot/imported/Kratos.png-96be93b60faf4be47d12b7d77e0db8a0.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://characters/Kratos.png"
dest_files=["res://.godot/imported/Kratos.png-96be93b60faf4be47d12b7d77e0db8a0.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

BIN
characters/Layton.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

View File

@@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://dppew11utp65u"
path="res://.godot/imported/Layton.png-e045f892ea6bda02bca9f3bf7a8f8f8d.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://characters/Layton.png"
dest_files=["res://.godot/imported/Layton.png-e045f892ea6bda02bca9f3bf7a8f8f8d.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

BIN
characters/Lemmings.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

View File

@@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://xq48fxilv5mh"
path="res://.godot/imported/Lemmings.png-1292d9ccd3f0d46e6cf743d3c018c7d0.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://characters/Lemmings.png"
dest_files=["res://.godot/imported/Lemmings.png-1292d9ccd3f0d46e6cf743d3c018c7d0.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

BIN
characters/Link.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 162 KiB

View File

@@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://c8r7ykphss4c2"
path="res://.godot/imported/Link.png-60e9508aedd004d12081c9005d4aa750.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://characters/Link.png"
dest_files=["res://.godot/imported/Link.png-60e9508aedd004d12081c9005d4aa750.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

BIN
characters/Miles.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

View File

@@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cylpgeyjnkvbd"
path="res://.godot/imported/Miles.png-a90dba30e189ed6725b379b5ff9f083e.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://characters/Miles.png"
dest_files=["res://.godot/imported/Miles.png-a90dba30e189ed6725b379b5ff9f083e.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

BIN
characters/PaperMario.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 136 KiB

View File

@@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://dr1oftfrqgfmw"
path="res://.godot/imported/PaperMario.png-290a7e8407957770ebf4195df8c53c73.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://characters/PaperMario.png"
dest_files=["res://.godot/imported/PaperMario.png-290a7e8407957770ebf4195df8c53c73.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

BIN
characters/Raiden.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 185 KiB

View File

@@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://bqmsmpbblqgds"
path="res://.godot/imported/Raiden.png-205a027967ace9bf18d56e3f092e9626.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://characters/Raiden.png"
dest_files=["res://.godot/imported/Raiden.png-205a027967ace9bf18d56e3f092e9626.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

BIN
characters/Samus.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 101 KiB

View File

@@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cbupdfevcwysf"
path="res://.godot/imported/Samus.png-ff0f0e36002791d773416c96a6e25d8b.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://characters/Samus.png"
dest_files=["res://.godot/imported/Samus.png-ff0f0e36002791d773416c96a6e25d8b.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

BIN
characters/Sora.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

View File

@@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://lkj0tdlrn07x"
path="res://.godot/imported/Sora.png-fc8f0331bc6ab24d4c685b270b81c596.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://characters/Sora.png"
dest_files=["res://.godot/imported/Sora.png-fc8f0331bc6ab24d4c685b270b81c596.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

BIN
noCharacter.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 788 B

34
noCharacter.png.import Normal file
View File

@@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://r4as0nmtoa7p"
path="res://.godot/imported/noCharacter.png-913d5aa8e4e20d65781e354ef1232fef.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://noCharacter.png"
dest_files=["res://.godot/imported/noCharacter.png-913d5aa8e4e20d65781e354ef1232fef.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" enable-background="new 0 0 24 24" viewBox="0 0 24 24" fill="black" width="36px" height="36px"><g><rect fill="none" height="24" width="24"/></g><g><path d="M13,8c0-2.21-1.79-4-4-4S5,5.79,5,8s1.79,4,4,4S13,10.21,13,8z M15,10v2h3v3h2v-3h3v-2h-3V7h-2v3H15z M1,18v2h16v-2 c0-2.66-5.33-4-8-4S1,15.34,1,18z"/></g></svg>

After

Width:  |  Height:  |  Size: 352 B

View File

@@ -2,16 +2,16 @@
importer="texture"
type="CompressedTexture2D"
uid="uid://cx5p2fr1m6u3h"
path="res://.godot/imported/Instruct2.png-4e8664e49d00a397bbd539f7dee976ff.ctex"
uid="uid://o5go6smk7hm1"
path="res://.godot/imported/person_add_alt_1-black-36dp.svg-bf42e8ddf13a4f7adae8637f26a86e94.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/Todo_Manager/doc/images/Instruct2.png"
dest_files=["res://.godot/imported/Instruct2.png-4e8664e49d00a397bbd539f7dee976ff.ctex"]
source_file="res://person_add_alt_1-black-36dp.svg"
dest_files=["res://.godot/imported/person_add_alt_1-black-36dp.svg-bf42e8ddf13a4f7adae8637f26a86e94.ctex"]
[params]
@@ -32,3 +32,6 @@ process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
svg/scale=1.0
editor/scale_with_editor_scale=false
editor/convert_colors_with_editor_theme=false

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" enable-background="new 0 0 24 24" viewBox="0 0 24 24" fill="black" width="36px" height="36px"><g><rect fill="none" height="24" width="24"/></g><g><path d="M14,8c0-2.21-1.79-4-4-4S6,5.79,6,8s1.79,4,4,4S14,10.21,14,8z M17,10v2h6v-2H17z M2,18v2h16v-2c0-2.66-5.33-4-8-4 S2,15.34,2,18z"/></g></svg>

After

Width:  |  Height:  |  Size: 333 B

View File

@@ -2,16 +2,16 @@
importer="texture"
type="CompressedTexture2D"
uid="uid://cqj87crklv7ke"
path="res://.godot/imported/Instruct3.png-3cc62ed99bf29d90b803cb8eb40881e9.ctex"
uid="uid://t1tnj6nqpi4a"
path="res://.godot/imported/person_remove-black-36dp.svg-60481722f4b86c76228674c37c2e8b80.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/Todo_Manager/doc/images/Instruct3.png"
dest_files=["res://.godot/imported/Instruct3.png-3cc62ed99bf29d90b803cb8eb40881e9.ctex"]
source_file="res://person_remove-black-36dp.svg"
dest_files=["res://.godot/imported/person_remove-black-36dp.svg-60481722f4b86c76228674c37c2e8b80.ctex"]
[params]
@@ -32,3 +32,6 @@ process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
svg/scale=1.0
editor/scale_with_editor_scale=false
editor/convert_colors_with_editor_theme=false

View File

@@ -12,7 +12,7 @@ config_version=5
config/name="MusicPlayer"
run/main_scene="res://MainWindow.tscn"
config/features=PackedStringArray("4.0", "Forward Plus")
config/features=PackedStringArray("4.1", "Forward Plus")
run/low_processor_mode=true
config/icon="res://icon.svg"
@@ -22,11 +22,6 @@ window/subwindows/embed_subwindows=false
window/stretch/mode="canvas_items"
window/stretch/aspect="expand"
[editor]
version_control/plugin_name="GitPlugin"
version_control/autoload_on_startup=true
[rendering]
textures/vram_compression/import_s3tc_bptc=true

BIN
sounds/check.mp3 Normal file

Binary file not shown.

19
sounds/check.mp3.import Normal file
View File

@@ -0,0 +1,19 @@
[remap]
importer="mp3"
type="AudioStreamMP3"
uid="uid://cstk3o6p0t1dd"
path="res://.godot/imported/check.mp3-e407ac461bb5c0be4e446189ee96e316.mp3str"
[deps]
source_file="res://sounds/check.mp3"
dest_files=["res://.godot/imported/check.mp3-e407ac461bb5c0be4e446189ee96e316.mp3str"]
[params]
loop=false
loop_offset=0
bpm=0
beat_count=0
bar_beats=4

BIN
sounds/intro_long.mp3 Normal file

Binary file not shown.

View File

@@ -0,0 +1,19 @@
[remap]
importer="mp3"
type="AudioStreamMP3"
uid="uid://cvuwsbyemprym"
path="res://.godot/imported/intro_long.mp3-32bebeda14ea0663216d473171276670.mp3str"
[deps]
source_file="res://sounds/intro_long.mp3"
dest_files=["res://.godot/imported/intro_long.mp3-32bebeda14ea0663216d473171276670.mp3str"]
[params]
loop=false
loop_offset=0
bpm=0
beat_count=0
bar_beats=4

BIN
sounds/intro_short.mp3 Normal file

Binary file not shown.

View File

@@ -0,0 +1,19 @@
[remap]
importer="mp3"
type="AudioStreamMP3"
uid="uid://pr4djcr5ni20"
path="res://.godot/imported/intro_short.mp3-a06e6f75611467edbef805507251f4d4.mp3str"
[deps]
source_file="res://sounds/intro_short.mp3"
dest_files=["res://.godot/imported/intro_short.mp3-a06e6f75611467edbef805507251f4d4.mp3str"]
[params]
loop=false
loop_offset=0
bpm=0
beat_count=0
bar_beats=4

BIN
sounds/sound0.mp3 Normal file

Binary file not shown.

19
sounds/sound0.mp3.import Normal file
View File

@@ -0,0 +1,19 @@
[remap]
importer="mp3"
type="AudioStreamMP3"
uid="uid://41ovxobjbp5b"
path="res://.godot/imported/sound0.mp3-ae0f9147e757d9da5043231a59c5fd8d.mp3str"
[deps]
source_file="res://sounds/sound0.mp3"
dest_files=["res://.godot/imported/sound0.mp3-ae0f9147e757d9da5043231a59c5fd8d.mp3str"]
[params]
loop=false
loop_offset=0
bpm=0
beat_count=0
bar_beats=4

BIN
sounds/sound1.mp3 Normal file

Binary file not shown.

19
sounds/sound1.mp3.import Normal file
View File

@@ -0,0 +1,19 @@
[remap]
importer="mp3"
type="AudioStreamMP3"
uid="uid://cc2nf2gae1dgk"
path="res://.godot/imported/sound1.mp3-c89a0fcf190a1a169ec1386d7c0dd01d.mp3str"
[deps]
source_file="res://sounds/sound1.mp3"
dest_files=["res://.godot/imported/sound1.mp3-c89a0fcf190a1a169ec1386d7c0dd01d.mp3str"]
[params]
loop=false
loop_offset=0
bpm=0
beat_count=0
bar_beats=4

BIN
sounds/winning.mp3 Normal file

Binary file not shown.

19
sounds/winning.mp3.import Normal file
View File

@@ -0,0 +1,19 @@
[remap]
importer="mp3"
type="AudioStreamMP3"
uid="uid://bjl6qkaw2uwaj"
path="res://.godot/imported/winning.mp3-18a19e66bdf777b25e9befded522ad0d.mp3str"
[deps]
source_file="res://sounds/winning.mp3"
dest_files=["res://.godot/imported/winning.mp3-18a19e66bdf777b25e9befded522ad0d.mp3str"]
[params]
loop=false
loop_offset=0
bpm=0
beat_count=0
bar_beats=4