139 lines
4.8 KiB
GDScript
139 lines
4.8 KiB
GDScript
@tool
|
|
extends MarginContainer
|
|
|
|
enum UseCase {
|
|
Overlay, Game, Other
|
|
}
|
|
|
|
const PRESET_GAME_SCOPES = preload("res://addons/twitcher/auth/preset_game_scopes.tres")
|
|
const PRESET_OVERLAY_SCOPES = preload("res://addons/twitcher/auth/preset_overlay_scopes.tres")
|
|
const TwitchScopeProperty = preload("res://addons/twitcher/editor/inspector/twitch_scope_property.gd")
|
|
const TwitchEditorSettings = preload("res://addons/twitcher/editor/twitch_editor_settings.gd")
|
|
const TwitchTweens = preload("res://addons/twitcher/editor/twitch_tweens.gd")
|
|
|
|
@export var choose_button_group: ButtonGroup
|
|
|
|
@onready var overlay: CheckBox = %Overlay
|
|
@onready var game: CheckBox = %Game
|
|
@onready var something_else: CheckBox = %SomethingElse
|
|
@onready var scope_list: RichTextLabel = %ScopeList
|
|
@onready var to_documentation: Button = %ToDocumentation
|
|
@onready var scope_file_select: FileSelect = %ScopeFileSelect
|
|
@onready var scopes_container: HBoxContainer = %Scopes
|
|
@onready var advanced_edit: CheckButton = %AdvancedEdit
|
|
@onready var other_scope_options: PanelContainer = %OtherScopeOptions
|
|
@onready var extended_scope_info: PanelContainer = %ExtendedScopeInfo
|
|
@onready var save: Button = %Save
|
|
|
|
var other_scope_property: TwitchScopeProperty = TwitchScopeProperty.new()
|
|
var scopes: TwitchOAuthScopes: set = update_scopes
|
|
var has_changes: bool:
|
|
set(val):
|
|
has_changes = val
|
|
changed.emit()
|
|
save.text = save.text.trim_suffix(" (unsaved changes)")
|
|
if has_changes: save.text += " (unsaved changes)"
|
|
|
|
signal changed
|
|
signal use_case_changed(use_case: UseCase)
|
|
|
|
|
|
func _ready() -> void:
|
|
to_documentation.pressed.connect(_on_to_documentation_pressed)
|
|
choose_button_group.pressed.connect(_on_choose)
|
|
scope_file_select.file_selected.connect(_on_scope_file_selected)
|
|
save.pressed.connect(_on_save_pressed)
|
|
other_scope_property.scope_selected.connect(_on_scope_info)
|
|
advanced_edit.toggled.connect(_on_toggle_advanced_edit)
|
|
|
|
scopes_container.hide()
|
|
extended_scope_info.hide()
|
|
extended_scope_info.add_child(other_scope_property)
|
|
|
|
# Reset radio buttons cause it's a tool script and the radio button stay and won't throw another signal otherwise
|
|
game.set_pressed_no_signal(false)
|
|
overlay.set_pressed_no_signal(false)
|
|
something_else.set_pressed_no_signal(false)
|
|
|
|
scope_file_select.path = TwitchEditorSettings.get_scope_path()
|
|
match TwitchEditorSettings.project_preset:
|
|
TwitchEditorSettings.PRESET_GAME:
|
|
game.button_pressed = true
|
|
TwitchEditorSettings.PRESET_OVERLAY:
|
|
overlay.button_pressed = true
|
|
TwitchEditorSettings.PRESET_OTHER:
|
|
something_else.button_pressed = true
|
|
|
|
# Needs to be resetted cause the radio reset will change the has_changges to true
|
|
has_changes = false
|
|
|
|
func _on_scope_file_selected(path: String) -> void:
|
|
has_changes = true
|
|
if FileAccess.file_exists(path):
|
|
var resource = load(path)
|
|
if resource is OAuthScopes: scopes = resource
|
|
else: OS.alert("The selected scope is not a scope file, it will be overwritten!")
|
|
|
|
|
|
func _on_toggle_advanced_edit(toggled_on: bool) -> void:
|
|
extended_scope_info.visible = toggled_on
|
|
|
|
|
|
func _on_choose(button: BaseButton) -> void:
|
|
match button:
|
|
overlay:
|
|
use_case_changed.emit(UseCase.Overlay)
|
|
scopes = PRESET_OVERLAY_SCOPES.duplicate(true)
|
|
advanced_edit.button_pressed = false
|
|
TwitchEditorSettings.project_preset = TwitchEditorSettings.PRESET_OVERLAY
|
|
game:
|
|
use_case_changed.emit(UseCase.Game)
|
|
scopes = PRESET_GAME_SCOPES.duplicate(true)
|
|
advanced_edit.button_pressed = false
|
|
TwitchEditorSettings.project_preset = TwitchEditorSettings.PRESET_GAME
|
|
something_else:
|
|
use_case_changed.emit(UseCase.Other)
|
|
scopes = TwitchOAuthScopes.new()
|
|
advanced_edit.button_pressed = true
|
|
TwitchEditorSettings.project_preset = TwitchEditorSettings.PRESET_OTHER
|
|
|
|
_show_selected_scopes()
|
|
has_changes = true
|
|
|
|
func _on_scope_info(scope: TwitchScope.Definition) -> void:
|
|
_show_selected_scopes()
|
|
|
|
|
|
func _on_save_pressed() -> void:
|
|
var s_path = scope_file_select.path
|
|
scopes.take_over_path(s_path)
|
|
ResourceSaver.save(scopes, s_path)
|
|
TwitchEditorSettings.set_scope_path(s_path)
|
|
TwitchTweens.flash(save, Color.GREEN)
|
|
has_changes = false
|
|
|
|
|
|
func _show_selected_scopes() -> void:
|
|
scopes_container.show()
|
|
|
|
if scopes.used_scopes.is_empty():
|
|
scope_list.text = "[i]No scopes selected yet[/i]"
|
|
return
|
|
|
|
var scope_description: String = ""
|
|
for scope_name: StringName in scopes.used_scopes:
|
|
var scope: TwitchScope.Definition = TwitchScope.SCOPE_MAP[scope_name]
|
|
scope_description += "[b]%s[/b] - %s\n\n" % [scope.value, scope.description]
|
|
|
|
scope_list.text = scope_description
|
|
|
|
|
|
func _on_to_documentation_pressed() -> void:
|
|
OS.shell_open("https://dev.twitch.tv/docs/authentication/scopes/")
|
|
|
|
|
|
func update_scopes(val: TwitchOAuthScopes) -> void:
|
|
scopes = val
|
|
other_scope_property.set_object_and_property(scopes, "")
|
|
other_scope_property.update_property()
|
|
_show_selected_scopes()
|