Change way of defining transitions for view toggling

This commit is contained in:
Azumgi 2019-01-24 21:59:22 +03:00
parent 199236f3cc
commit 89a8146717
6 changed files with 84 additions and 65 deletions

View file

@ -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 {

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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
}
})

View file

@ -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",