Change way of defining transitions for view toggling
This commit is contained in:
parent
199236f3cc
commit
89a8146717
6 changed files with 84 additions and 65 deletions
|
@ -223,7 +223,7 @@ local function perform_keybind_action(data, is_pressed)
|
|||
call_function(data.mod, data.function_name, is_pressed)
|
||||
return true
|
||||
elseif data.type == "view_toggle" and data.mod:is_enabled() then
|
||||
vmf.keybind_toggle_view(data.mod, data.view_name, can_perform_action, is_pressed)
|
||||
vmf.keybind_toggle_view(data.mod, data.view_name, data.transition_data, can_perform_action, is_pressed)
|
||||
return true
|
||||
end
|
||||
end
|
||||
|
@ -304,7 +304,8 @@ function vmf.generate_keybinds()
|
|||
shift = modifier_keys["shift"],
|
||||
|
||||
function_name = raw_keybind_data.function_name,
|
||||
view_name = raw_keybind_data.view_name
|
||||
view_name = raw_keybind_data.view_name,
|
||||
transition_data = raw_keybind_data.transition_data
|
||||
}
|
||||
|
||||
_keybinds[primary_key] = _keybinds[primary_key] or {
|
||||
|
|
|
@ -324,11 +324,31 @@ local function validate_keybind_data(data)
|
|||
vmf.throw_error("[widget \"%s\" (keybind)]: 'keybind_type' is set to \"function_call\" so 'function_name' " ..
|
||||
"field is required and must have 'string' type", data.setting_id)
|
||||
end
|
||||
if keybind_type == "view_toggle" and type(data.view_name) ~= "string" then
|
||||
if keybind_type == "view_toggle" then
|
||||
if type(data.view_name) ~= "string" then
|
||||
vmf.throw_error("[widget \"%s\" (keybind)]: 'keybind_type' is set to \"view_toggle\" so 'view_name' " ..
|
||||
"field is required and must have 'string' type", data.setting_id)
|
||||
end
|
||||
|
||||
local transition_data = data.transition_data
|
||||
if type(transition_data) ~= "table" then
|
||||
vmf.throw_error("[widget \"%s\" (keybind)]: 'keybind_type' is set to \"view_toggle\" so 'transition_data' " ..
|
||||
"field is required and must have 'table' type", data.setting_id)
|
||||
end
|
||||
if transition_data.open_view_transition_name and type(transition_data.open_view_transition_name) ~= "string" then
|
||||
vmf.throw_error("[widget \"%s\" (keybind)]: 'transition_data.open_view_transition_name' must have "..
|
||||
"'string' type", data.setting_id)
|
||||
end
|
||||
if transition_data.close_view_transition_name and type(transition_data.close_view_transition_name) ~= "string" then
|
||||
vmf.throw_error("[widget \"%s\" (keybind)]: 'transition_data.close_view_transition_name' must have "..
|
||||
"'string' type", data.setting_id)
|
||||
end
|
||||
if transition_data.transition_fade and type(transition_data.transition_fade) ~= "boolean" then
|
||||
vmf.throw_error("[widget \"%s\" (keybind)]: 'transition_data.transition_fade' must have "..
|
||||
"'boolean' type", data.setting_id)
|
||||
end
|
||||
end
|
||||
|
||||
local default_value = data.default_value
|
||||
if type(default_value) ~= "table" then
|
||||
vmf.throw_error("[widget \"%s\" (keybind)]: 'default_value' field is required and must have 'table' type",
|
||||
|
@ -368,6 +388,7 @@ local function initialize_keybind_data(mod, data, localize)
|
|||
new_data.keybind_type = data.keybind_type
|
||||
new_data.function_name = data.function_name -- required, if (keybind_type == "function_call")
|
||||
new_data.view_name = data.view_name -- required, if (keybind_type == "view_toggle")
|
||||
new_data.transition_data = data.transition_data -- required, if (keybind_type == "view_toggle")
|
||||
|
||||
validate_keybind_data(new_data)
|
||||
|
||||
|
@ -550,7 +571,8 @@ local function initialize_default_settings_and_keybinds(mod, initialized_widgets
|
|||
type = data.keybind_type,
|
||||
keys = mod:get(data.setting_id),
|
||||
function_name = data.function_name,
|
||||
view_name = data.view_name
|
||||
view_name = data.view_name,
|
||||
transition_data = data.transition_data
|
||||
}
|
||||
)
|
||||
end
|
||||
|
|
|
@ -31,17 +31,14 @@ local ERRORS = {
|
|||
blocked_transitions_element_wrong_type = "'view_settings.blocked_transitions.%s' must be a table, not %s.",
|
||||
blocked_transition_invalid = "you can't put transition '%s' into 'view_settings.blocked_transitions.%s', " ..
|
||||
"because it's not listed in 'view_transitions'.",
|
||||
blocked_transition_wrong_value = "invalid value for 'view_settings.blocked_transitions.%s.%s'; must be 'true'.",
|
||||
keybind_transitions_wrong_type = "'view_settings.keybind_transitions' (optional) must be a table, not %s.",
|
||||
open_view_transition_wrong_type = "'view_settings.keybind_transitions.open_view_transition' (optional) must be " ..
|
||||
"a string, not %s.",
|
||||
transition_fade_wrong_type = "'view_settings.keybind_transitions.transition_fade' (optional) must be a boolean, " ..
|
||||
"not %s.",
|
||||
blocked_transition_wrong_value = "invalid value for 'view_settings.blocked_transitions.%s.%s'; must be 'true'."
|
||||
},
|
||||
REGULAR = {
|
||||
view_data_wrong_type = "[Custom Views] (register_view) Loading view data file '%s': returned view data must be " ..
|
||||
"a table, not %s.",
|
||||
view_not_registered = "[Custom Views] Opening view with keybind: view '%s' wasn't registered for this mod."
|
||||
view_not_registered = "[Custom Views] Toggling view with keybind: view '%s' wasn't registered for this mod.",
|
||||
transition_not_registered = "[Custom Views] Toggling view with keybind: transition '%s' wasn't registered for " ..
|
||||
"'%s' view."
|
||||
},
|
||||
PREFIX = {
|
||||
view_initializing = "[Custom Views] Calling 'init_view_function'",
|
||||
|
@ -184,7 +181,6 @@ local function validate_view_data(view_data)
|
|||
|
||||
-- Use default values for optional fields if they are not defined.
|
||||
view_settings.blocked_transitions = view_settings.blocked_transitions or {inn = {}, ingame = {}}
|
||||
view_settings.keybind_transitions = view_settings.keybind_transitions or {}
|
||||
|
||||
-- Verify everything.
|
||||
if type(view_settings.init_view_function) ~= "function" then
|
||||
|
@ -231,21 +227,6 @@ local function validate_view_data(view_data)
|
|||
end
|
||||
end
|
||||
end
|
||||
|
||||
local keybind_transitions = view_settings.keybind_transitions
|
||||
if type(keybind_transitions) ~= "table" then
|
||||
vmf.throw_error(ERRORS.THROWABLE["keybind_transitions_wrong_type"], type(keybind_transitions))
|
||||
end
|
||||
if keybind_transitions.open_view_transition and type(keybind_transitions.open_view_transition) ~= "string" then
|
||||
vmf.throw_error(ERRORS.THROWABLE["open_view_transition_wrong_type"], type(keybind_transitions.open_view_transition))
|
||||
end
|
||||
if keybind_transitions.close_view_transition and type(keybind_transitions.close_view_transition) ~= "string" then
|
||||
vmf.throw_error(ERRORS.THROWABLE["close_view_transition_wrong_type"],
|
||||
type(keybind_transitions.close_view_transition))
|
||||
end
|
||||
if keybind_transitions.transition_fade and type(keybind_transitions.transition_fade) ~= "boolean" then
|
||||
vmf.throw_error(ERRORS.THROWABLE["transition_fade_wrong_type"], type(keybind_transitions.transition_fade))
|
||||
end
|
||||
end
|
||||
|
||||
-- #####################################################################################################################
|
||||
|
@ -359,27 +340,37 @@ end
|
|||
|
||||
-- Opens/closes a view if all conditions are met. Since keybinds module can't do UI-related checks, all the cheks are
|
||||
-- done in this function. This function is called every time some view-toggling keybind is pressed.
|
||||
function vmf.keybind_toggle_view(mod, view_name, can_be_opened, is_keybind_pressed)
|
||||
function vmf.keybind_toggle_view(mod, view_name, keybind_transition_data, can_be_opened, is_keybind_pressed)
|
||||
if _ingame_ui then
|
||||
if not _views_data[view_name] or (_views_data[view_name].mod ~= mod) then
|
||||
local view_data = _views_data[view_name]
|
||||
if not view_data or (view_data.mod ~= mod) then
|
||||
mod:error(ERRORS.REGULAR["view_not_registered"], view_name)
|
||||
return
|
||||
end
|
||||
|
||||
if is_view_active_for_current_level(view_name) then
|
||||
local keybind_transitions = _views_data[view_name].view_settings.keybind_transitions
|
||||
if _ingame_ui.current_view == view_name then
|
||||
if keybind_transitions.close_view_transition then
|
||||
mod:handle_transition(keybind_transitions.close_view_transition, true,
|
||||
keybind_transitions.transition_fade,
|
||||
keybind_transitions.close_view_transition_params)
|
||||
if keybind_transition_data.close_view_transition_name then
|
||||
if view_data.view_transitions[keybind_transition_data.close_view_transition_name] then
|
||||
mod:handle_transition(keybind_transition_data.close_view_transition_name, true,
|
||||
keybind_transition_data.transition_fade,
|
||||
keybind_transition_data.close_view_transition_params)
|
||||
else
|
||||
mod:error(ERRORS.REGULAR["transition_not_registered"], keybind_transition_data.close_view_transition_name,
|
||||
view_name)
|
||||
end
|
||||
end
|
||||
-- Can open views only when keybind is pressed.
|
||||
elseif can_be_opened and is_keybind_pressed then
|
||||
if keybind_transitions.open_view_transition then
|
||||
mod:handle_transition(keybind_transitions.open_view_transition, true,
|
||||
keybind_transitions.transition_fade,
|
||||
keybind_transitions.open_view_transition_params)
|
||||
if keybind_transition_data.open_view_transition_name then
|
||||
if view_data.view_transitions[keybind_transition_data.open_view_transition_name] then
|
||||
mod:handle_transition(keybind_transition_data.open_view_transition_name, true,
|
||||
keybind_transition_data.transition_fade,
|
||||
keybind_transition_data.open_view_transition_params)
|
||||
else
|
||||
mod:error(ERRORS.REGULAR["transition_not_registered"], keybind_transition_data.open_view_transition_name,
|
||||
view_name)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -9,7 +9,7 @@ if VT1 then
|
|||
-- Disable Mod Options button during mods reloading
|
||||
vmf:hook_safe(IngameView, "update_menu_options", function (self)
|
||||
for _, button_info in ipairs(self.active_button_data) do
|
||||
if button_info.transition == "vmf_options_view" then
|
||||
if button_info.transition == "vmf_options_view_open" then
|
||||
button_info.widget.content.disabled = _button_injection_data.mod_options_button_disabled
|
||||
button_info.widget.content.button_hotspot.disabled = _button_injection_data.mod_options_button_disabled
|
||||
end
|
||||
|
@ -22,11 +22,11 @@ if VT1 then
|
|||
vmf:hook(IngameView, "setup_button_layout", function (func, self, layout_data, ...)
|
||||
local mods_options_button = {
|
||||
display_name = vmf:localize("mods_options"),
|
||||
transition = "vmf_options_view",
|
||||
transition = "vmf_options_view_open",
|
||||
fade = false
|
||||
}
|
||||
for i = 1, #layout_data do
|
||||
if layout_data[i].transition == "options_menu" and layout_data[i + 1].transition ~= "vmf_options_view" then
|
||||
if layout_data[i].transition == "options_menu" and layout_data[i + 1].transition ~= "vmf_options_view_open" then
|
||||
table.insert(layout_data, i + 1, mods_options_button)
|
||||
break
|
||||
end
|
||||
|
@ -35,7 +35,7 @@ if VT1 then
|
|||
func(self, layout_data, ...)
|
||||
|
||||
for _, button_info in ipairs(self.active_button_data) do
|
||||
if button_info.transition == "vmf_options_view" then
|
||||
if button_info.transition == "vmf_options_view_open" then
|
||||
button_info.widget.style.text.localize = false
|
||||
button_info.widget.style.text_disabled.localize = false
|
||||
button_info.widget.style.text_click.localize = false
|
||||
|
@ -51,7 +51,7 @@ else
|
|||
|
||||
local function get_mod_options_button_index(layout_logic)
|
||||
for button_index, button_data in ipairs(layout_logic.active_button_data) do
|
||||
if button_data.transition == "vmf_options_view" then
|
||||
if button_data.transition == "vmf_options_view_open" then
|
||||
return button_index
|
||||
end
|
||||
end
|
||||
|
@ -98,12 +98,12 @@ else
|
|||
vmf:hook_safe(IngameViewLayoutLogic, "init", function (self)
|
||||
local mod_options_button = {
|
||||
display_name = vmf:localize("mods_options"),
|
||||
transition = "vmf_options_view",
|
||||
transition = "vmf_options_view_open",
|
||||
fade = false
|
||||
}
|
||||
for _, layout in pairs(self.layout_list) do
|
||||
for i = 1, #layout do
|
||||
if layout[i].transition == "options_menu" and layout[i + 1].transition ~= "vmf_options_view" then
|
||||
if layout[i].transition == "options_menu" and layout[i + 1].transition ~= "vmf_options_view_open" then
|
||||
table.insert(layout, i + 1, mod_options_button)
|
||||
break
|
||||
end
|
||||
|
|
|
@ -2654,6 +2654,7 @@ local function create_keybind_widget(widget_definition, scenegraph_id)
|
|||
keybind_type = widget_definition.keybind_type,
|
||||
function_name = widget_definition.function_name,
|
||||
view_name = widget_definition.view_name,
|
||||
transition_data = widget_definition.transition_data,
|
||||
|
||||
keybind_text = widget_definition.keybind_text,
|
||||
default_value = widget_definition.default_value,
|
||||
|
@ -3312,7 +3313,8 @@ local function set_new_keybind(keybind_widget_content)
|
|||
type = keybind_widget_content.keybind_type,
|
||||
keys = keybind_widget_content.keys,
|
||||
function_name = keybind_widget_content.function_name,
|
||||
view_name = keybind_widget_content.view_name
|
||||
view_name = keybind_widget_content.view_name,
|
||||
transition_data = keybind_widget_content.transition_data
|
||||
}
|
||||
)
|
||||
end
|
||||
|
@ -4284,16 +4286,15 @@ vmf:register_view({
|
|||
active = {
|
||||
inn = true,
|
||||
ingame = true
|
||||
},
|
||||
keybind_transitions = {
|
||||
open_view_transition = "vmf_options_view",
|
||||
close_view_transition = "exit_menu",
|
||||
}
|
||||
},
|
||||
view_transitions = {
|
||||
vmf_options_view = function (self)
|
||||
vmf_options_view_open = function (self)
|
||||
self.current_view = "vmf_options_view"
|
||||
self.menu_active = true
|
||||
end,
|
||||
vmf_options_view_close = function (self)
|
||||
require("scripts/ui/views/ingame_ui_settings").transitions.exit_menu(self)
|
||||
end
|
||||
}
|
||||
})
|
||||
|
|
|
@ -10,7 +10,11 @@ vmf_mod_data.options = {
|
|||
default_value = {"f4"},
|
||||
keybind_trigger = "pressed",
|
||||
keybind_type = "view_toggle",
|
||||
view_name = "vmf_options_view"
|
||||
view_name = "vmf_options_view",
|
||||
transition_data = {
|
||||
open_view_transition_name = "vmf_options_view_open",
|
||||
close_view_transition_name = "vmf_options_view_close"
|
||||
}
|
||||
},
|
||||
{
|
||||
setting_id = "vmf_options_scrolling_speed",
|
||||
|
|
Loading…
Add table
Reference in a new issue