Fixed CharacterDirectory (#15757)

This commit is contained in:
Selis
2024-02-12 14:17:31 +01:00
committed by GitHub
parent cc7bf56ae5
commit 66d4b40e9d
8 changed files with 250 additions and 222 deletions
+13 -3
View File
@@ -36,6 +36,7 @@
* public
*
* Static Data to be sent to the UI.
*
* Static data differs from normal data in that it's large data that should be
* sent infrequently. This is implemented optionally for heavy uis that would
* be sending a lot of redundant data frequently. Gets squished into one
@@ -65,6 +66,17 @@
if(ui)
ui.send_full_update()
/**
* public
*
* Will force an update on static data for all viewers.
* Should be done manually whenever something happens to
* change static data.
*/
/datum/proc/update_static_data_for_all_viewers()
for (var/datum/tgui/window as anything in open_uis)
window.send_full_update()
/**
* public
*
@@ -130,7 +142,6 @@
* Associative list of JSON-encoded shared states that were set by
* tgui clients.
*/
/datum/var/list/tgui_shared_states
/**
@@ -194,8 +205,7 @@
// Name the verb, and hide it from the user panel.
set name = "uiclose"
set hidden = TRUE
var/mob/user = src && src.mob
var/mob/user = src?.mob
if(!user)
return
// Close all tgui datums based on window_id.
+21 -12
View File
@@ -11,7 +11,7 @@
var/mob/user
/// The object which owns the UI.
var/datum/src_object
/// The title of te UI.
/// The title of the UI.
var/title
/// The window_id for browse() and onclose().
var/datum/tgui_window/window
@@ -76,22 +76,29 @@
if(ui_x && ui_y)
src.window_size = list(ui_x, ui_y)
/datum/tgui/Destroy()
user = null
src_object = null
return ..()
/**
* public
*
* Open this UI (and initialize it with data).
*
* return bool - TRUE if a new pooled window is opened, FALSE in all other situations including if a new pooled window didn't open because one already exists.
*/
/datum/tgui/proc/open()
if(!user.client)
return null
return FALSE
if(window)
return null
return FALSE
process_status()
if(status < STATUS_UPDATE)
return null
return FALSE
window = SStgui.request_pooled_window(user)
if(!window)
return null
return FALSE
opened_at = world.time
window.acquire_lock(src)
if(!window.is_ready())
@@ -114,10 +121,14 @@
window.set_mouse_macro()
SStgui.on_open(src)
return TRUE
/**
* public
*
* Close the UI, and all its children.
* Close the UI.
*
* optional can_be_suspended bool
*/
/datum/tgui/proc/close(can_be_suspended = TRUE, logout = FALSE)
if(closing)
@@ -146,7 +157,7 @@
*
* Enable/disable auto-updating of the UI.
*
* required autoupdate bool Enable/disable auto-updating.
* required value bool Enable/disable auto-updating.
*/
/datum/tgui/proc/set_autoupdate(autoupdate)
src.autoupdate = autoupdate
@@ -178,6 +189,8 @@
* Makes an asset available to use in tgui.
*
* required asset datum/asset
*
* return bool - true if an asset was actually sent
*/
/datum/tgui/proc/send_asset(datum/asset/asset)
if(!window)
@@ -282,14 +295,12 @@
return
// Validate ping
if(!initialized && world.time - opened_at > TGUI_PING_TIMEOUT)
// #ifdef TGUI_DEBUGGING // Always log zombie windows
log_tgui(user, \
"Error: Zombie window detected, killing it with fire.\n" \
+ "window_id: [window.id]\n" \
+ "opened_at: [opened_at]\n" \
+ "world.time: [world.time]")
close(can_be_suspended = FALSE)
// #endif
return
// Update through a normal call to ui_interact
if(status != STATUS_DISABLED && (autoupdate || force))
@@ -321,9 +332,7 @@
/**
* private
*
* Handle clicks from the UI.
* Call the src_object's ui_act() if status is UI_INTERACTIVE.
* If the src_object's ui_act() returns 1, update all UIs attacked to it.
* Callback for handling incoming tgui messages.
*/
/datum/tgui/proc/on_message(type, list/payload, list/href_list)
// Pass act type messages to tgui_act
+17 -12
View File
@@ -1,4 +1,4 @@
/**
/*!
* Copyright (c) 2020 Aleksej Komarov
* SPDX-License-Identifier: MIT
*/
@@ -26,6 +26,18 @@
var/initial_inline_css
var/mouse_event_macro_set = FALSE
/**
* Static list used to map in macros that will then emit execute events to the tgui window
* A small disclaimer though I'm no tech wiz: I don't think it's possible to map in right or middle
* clicks in the current state, as they're keywords rather than modifiers.
*/
var/static/list/byondToTguiEventMap = list(
"MouseDown" = "byond/mousedown",
"MouseUp" = "byond/mouseup",
"Ctrl" = "byond/ctrldown",
"Ctrl+UP" = "byond/ctrlup",
)
/**
* public
*
@@ -165,8 +177,8 @@
* Acquire the window lock. Pool will not be able to provide this window
* to other UIs for the duration of the lock.
*
* Can be given an optional tgui datum, which will hook its on_message
* callback into the message stream.
* Can be given an optional tgui datum, which will be automatically
* subscribed to incoming messages via the on_message proc.
*
* optional ui /datum/tgui
*/
@@ -175,6 +187,8 @@
locked_by = ui
/**
* public
*
* Release the window lock.
*/
/datum/tgui_window/proc/release_lock()
@@ -391,11 +405,6 @@
if(mouse_event_macro_set)
return
var/list/byondToTguiEventMap = list(
"MouseDown" = "byond/mousedown",
"MouseUp" = "byond/mouseup"
)
for(var/mouseMacro in byondToTguiEventMap)
var/command_template = ".output CONTROL PAYLOAD"
var/event_message = TGUI_CREATE_MESSAGE(byondToTguiEventMap[mouseMacro], null)
@@ -416,10 +425,6 @@
/datum/tgui_window/proc/remove_mouse_macro()
if(!mouse_event_macro_set)
stack_trace("Unsetting mouse macro on tgui window that has none")
var/list/byondToTguiEventMap = list(
"MouseDown" = "byond/mousedown",
"MouseUp" = "byond/mouseup"
)
for(var/mouseMacro in byondToTguiEventMap)
winset(client, null, "[mouseMacro]Window[id]Macro.parent=null")
mouse_event_macro_set = FALSE