Migrate settings UI to OGPU themed widgets and add logout
All checks were successful
Build plugin / build (push) Successful in 1m6s
All checks were successful
Build plugin / build (push) Successful in 1m6s
- Replace plain Godot Controls with StatusPanel, ComponentTextInput, Toggle, CardButton, and Dropdown components - Add logout functionality that clears API key or closes session - Match Steam plugin's settings UI style
This commit is contained in:
parent
b9effee104
commit
c15d49bfd1
3 changed files with 166 additions and 84 deletions
|
|
@ -1,28 +1,27 @@
|
|||
extends Control
|
||||
extends MarginContainer
|
||||
|
||||
## itch.io plugin settings screen
|
||||
##
|
||||
## NOTE: this uses plain Godot Controls rather than OpenGamepadUI's themed
|
||||
## widget set (the ones used by the built-in Steam plugin's settings scene,
|
||||
## e.g. its custom StatusIndicator/TextInput components), since this plugin
|
||||
## was written without editor access to those scene resources. Swap the
|
||||
## nodes below for the themed equivalents if you want it to match the rest
|
||||
## of the settings UI pixel-for-pixel.
|
||||
## Uses OpenGamepadUI's themed widget set (StatusPanel, ComponentTextInput,
|
||||
## Toggle, CardButton, Dropdown) for consistent look with the rest of the
|
||||
## settings UI.
|
||||
|
||||
const ItchClient := preload("res://plugins/itch/core/itch_client.gd")
|
||||
var settings_manager := load("res://core/global/settings_manager.tres") as SettingsManager
|
||||
var notification_manager := load("res://core/global/notification_manager.tres") as NotificationManager
|
||||
const icon := preload("res://plugins/itch/assets/itch.svg")
|
||||
|
||||
@onready var status_label: Label = $%StatusLabel
|
||||
@onready var api_key_box: LineEdit = $%ApiKeyInput
|
||||
@onready var username_box: LineEdit = $%UsernameInput
|
||||
@onready var password_box: LineEdit = $%PasswordInput
|
||||
@onready var login_method: OptionButton = $%LoginMethod
|
||||
@onready var save_button: Button = $%SaveButton
|
||||
@onready var help_label: Label = $%HelpLabel
|
||||
@onready var filter_check: CheckBox = $%FilterUnsupported
|
||||
@onready var show_purchases_check: CheckBox = $%ShowPurchases
|
||||
@onready var status := $%Status as StatusPanel
|
||||
@onready var connected_status := $%ConnectedStatus as StatusPanel
|
||||
@onready var logged_in_status := $%LoggedInStatus as StatusPanel
|
||||
@onready var login_method := $%LoginMethod as Dropdown
|
||||
@onready var api_key_box := $%ApiKeyInput as ComponentTextInput
|
||||
@onready var username_box := $%UsernameInput as ComponentTextInput
|
||||
@onready var password_box := $%PasswordInput as ComponentTextInput
|
||||
@onready var save_button := $%SaveButton as CardButton
|
||||
@onready var logout_button := $%LogoutButton as CardButton
|
||||
@onready var filter_check := $%FilterUnsupported as Toggle
|
||||
@onready var show_purchases_check := $%ShowPurchases as Toggle
|
||||
@onready var collections_container: VBoxContainer = $%CollectionsContainer
|
||||
|
||||
@onready var itch: ItchClient = get_tree().get_first_node_in_group("itch_client")
|
||||
|
|
@ -31,12 +30,49 @@ var _collection_checks: Dictionary = {}
|
|||
|
||||
|
||||
func _ready() -> void:
|
||||
# Configure status indicators
|
||||
status.status = status.STATUS.CANCELLED
|
||||
status.color = "red"
|
||||
var set_running := func():
|
||||
if not itch.client_started:
|
||||
return
|
||||
status.status = status.STATUS.ACTIVE
|
||||
status.color = "green"
|
||||
if itch.client_started:
|
||||
set_running.call()
|
||||
itch.bootstrap_finished.connect(set_running)
|
||||
|
||||
# Configure connected status
|
||||
connected_status.status = connected_status.STATUS.ACTIVE
|
||||
if itch.state != itch.STATE.BOOT:
|
||||
connected_status.color = "green"
|
||||
itch.client_ready.connect(func():
|
||||
connected_status.color = "green"
|
||||
)
|
||||
|
||||
# Configure login status
|
||||
var update_login_status := func(login_status: ItchClient.LOGIN_STATUS):
|
||||
if login_status != ItchClient.LOGIN_STATUS.OK:
|
||||
logged_in_status.status = logged_in_status.STATUS.ACTIVE
|
||||
logged_in_status.color = "gray"
|
||||
return
|
||||
logged_in_status.status = logged_in_status.STATUS.CLOSED
|
||||
logged_in_status.color = "green"
|
||||
itch.logged_in.connect(update_login_status)
|
||||
itch.logged_in.connect(_on_login)
|
||||
|
||||
# Configure login method dropdown
|
||||
login_method.add_item("API Key", 0)
|
||||
login_method.add_item("Username & Password", 1)
|
||||
login_method.selected = 0
|
||||
|
||||
# Load saved settings
|
||||
var api_key := settings_manager.get_value("plugin.itch", "api_key", "") as String
|
||||
api_key_box.text = api_key
|
||||
api_key_box.secret = true
|
||||
|
||||
var saved_method: int = settings_manager.get_value("plugin.itch", "login_method", 0) as int
|
||||
login_method.selected = saved_method
|
||||
login_method.select(saved_method)
|
||||
_on_login_method_changed(saved_method)
|
||||
|
||||
var username := settings_manager.get_value("plugin.itch", "username", "") as String
|
||||
|
|
@ -45,39 +81,21 @@ func _ready() -> void:
|
|||
filter_check.button_pressed = settings_manager.get_value("plugin.itch", "filter_unsupported", true) as bool
|
||||
show_purchases_check.button_pressed = settings_manager.get_value("plugin.itch", "show_purchases", true) as bool
|
||||
|
||||
_update_status()
|
||||
itch.client_ready.connect(_update_status)
|
||||
itch.logged_in.connect(_on_login)
|
||||
|
||||
# Connect signals
|
||||
save_button.pressed.connect(_on_save_button)
|
||||
filter_check.toggled.connect(_on_filter_toggled)
|
||||
logout_button.pressed.connect(_on_logout_button)
|
||||
login_method.item_selected.connect(_on_login_method_changed)
|
||||
filter_check.toggled.connect(_on_filter_toggled)
|
||||
show_purchases_check.toggled.connect(_on_show_purchases_toggled)
|
||||
|
||||
# Build collection checkboxes once we're logged in.
|
||||
itch.logged_in.connect(_populate_collections.bind(), CONNECT_ONE_SHOT)
|
||||
|
||||
|
||||
func _update_status() -> void:
|
||||
if not itch:
|
||||
status_label.text = "Status: itch client not found"
|
||||
return
|
||||
if itch.state == itch.STATE.BOOT:
|
||||
status_label.text = "Status: starting butlerd..."
|
||||
return
|
||||
if not itch.is_logged_in:
|
||||
status_label.text = "Status: connected, not logged in"
|
||||
return
|
||||
var username: String = itch.profile.get("user", {}).get("username", "")
|
||||
status_label.text = "Status: logged in as " + username
|
||||
|
||||
|
||||
func _on_login(status: ItchClient.LOGIN_STATUS, _profile: Dictionary) -> void:
|
||||
_update_status()
|
||||
|
||||
func _on_login(login_status: ItchClient.LOGIN_STATUS, _profile: Dictionary) -> void:
|
||||
var notify := Notification.new("")
|
||||
notify.icon = icon
|
||||
if status == ItchClient.LOGIN_STATUS.OK:
|
||||
if login_status == ItchClient.LOGIN_STATUS.OK:
|
||||
notify.text = "Successfully logged in to itch.io"
|
||||
else:
|
||||
notify.text = "itch.io login failed. Double check your credentials."
|
||||
|
|
@ -91,7 +109,6 @@ func _on_login_method_changed(idx: int) -> void:
|
|||
api_key_box.visible = is_api
|
||||
username_box.visible = not is_api
|
||||
password_box.visible = not is_api
|
||||
help_label.visible = is_api
|
||||
|
||||
|
||||
func _on_save_button() -> void:
|
||||
|
|
@ -116,6 +133,26 @@ func _on_save_button() -> void:
|
|||
itch.login_with_password(uname, password)
|
||||
|
||||
|
||||
func _on_logout_button() -> void:
|
||||
var method: int = login_method.selected
|
||||
|
||||
# Clear saved credentials
|
||||
if method == 0:
|
||||
settings_manager.set_value("plugin.itch", "api_key", "")
|
||||
api_key_box.text = ""
|
||||
else:
|
||||
settings_manager.set_value("plugin.itch", "username", "")
|
||||
username_box.text = ""
|
||||
password_box.text = ""
|
||||
|
||||
# Logout from butlerd
|
||||
itch.logout()
|
||||
|
||||
var notify := Notification.new("Logged out of itch.io")
|
||||
notify.icon = icon
|
||||
notification_manager.show(notify)
|
||||
|
||||
|
||||
## Fetches the user's collections and builds a checkbox for each one.
|
||||
func _populate_collections(_status: ItchClient.LOGIN_STATUS, _profile: Dictionary) -> void:
|
||||
if not itch.is_logged_in:
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue