added collapsing widgets feature to the options menu

This commit is contained in:
Azumgi 2018-01-25 00:12:27 +03:00
parent c574b03bdd
commit f7cfc27b2f
11 changed files with 215 additions and 19 deletions

View file

@ -136,12 +136,11 @@ With this event you won't need to repeatedly check if some option is changed. By
Localization
Gui (WIP) Gui (WIP)
Options menu (WIP) Options menu (WIP)
Keybindings (Will do) Keybindings (Will do)
Network (Will do) Network (Will do)
Actions Actions
Chat Localization
Game modes Game modes
Debug modules Debug modules

Binary file not shown.

View file

@ -0,0 +1,18 @@
common = {
input = {
filename = "gui/common_widgets_background_lit"
}
output = {
apply_processing = true
correct_gamma = true
cut_alpha_threshold = 0.5
enable_cut_alpha_threshold = false
format = "A8R8G8B8"
mipmap_filter = "kaiser"
mipmap_filter_wrap_mode = "mirror"
mipmap_keep_original = false
mipmap_num_largest_steps_to_discard = 0
mipmap_num_smallest_steps_to_discard = 0
srgb = true
}
}

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

View file

@ -13,5 +13,6 @@ common = {
mipmap_keep_original = false mipmap_keep_original = false
mipmap_num_largest_steps_to_discard = 0 mipmap_num_largest_steps_to_discard = 0
mipmap_num_smallest_steps_to_discard = 0 mipmap_num_smallest_steps_to_discard = 0
srgb = true
} }
} }

View file

@ -0,0 +1,14 @@
common_widgets_background_lit = {
material_contexts = {
surface_material = ""
}
shader = "gui_gradient:DIFFUSE_MAP:MASKED"
textures = {
diffuse_map = "gui/common_widgets_background_lit"
}
variables = {
}
}

View file

@ -3,7 +3,7 @@ header_background_lit = {
surface_material = "" surface_material = ""
} }
shader = "gui:DIFFUSE_MAP" shader = "gui_gradient:DIFFUSE_MAP:MASKED"
textures = { textures = {
diffuse_map = "gui/header_background_lit" diffuse_map = "gui/header_background_lit"

View file

@ -9,6 +9,7 @@ package = [
material = [ material = [
"materials/header_background" "materials/header_background"
"materials/header_background_lit" "materials/header_background_lit"
"materials/common_widgets_background_lit"
] ]
lua = [ lua = [

View file

@ -65,9 +65,19 @@ local options_widgets = {
["text"] = "Warn joining players about game mode", ["text"] = "Warn joining players about game mode",
["tooltip"] = "You don't want others to ruin your game," .. "\n" .. ["tooltip"] = "You don't want others to ruin your game," .. "\n" ..
"do you?", "do you?",
["default_value"] = true, -- Default first option is enabled. In this case Below
["sub_widgets"] = {
{
["setting_name"] = "whatever",
["widget_type"] = "checkbox",
["text"] = "Whatever",
["tooltip"] = "Whatever," .. "\n" ..
"whatever",
["default_value"] = true -- Default first option is enabled. In this case Below ["default_value"] = true -- Default first option is enabled. In this case Below
} }
} }
}
}
}, },
{ {
["setting_name"] = "git_gut", ["setting_name"] = "git_gut",

View file

@ -1,15 +1,17 @@
--[[ --[[
Don't set settings to the values which aren't defined in options Don't set settings to the values which aren't defined in options
Glitch I won't fix soon: widget is collapsed, setting were changed not from .. whatever
VMFOptionsView.update_picked_option_for_settings_list_widgets VMFOptionsView.update_picked_option_for_settings_list_widgets
]] ]]
local vmf = get_mod("VMF") -- @TODO: replace it with VMF later local vmf = get_mod("VMF")
inject_material("materials/header_background", "header_background", "ingame_ui") inject_material("materials/header_background", "header_background", "ingame_ui")
inject_material("materials/header_background_lit", "header_background_lit", "ingame_ui") inject_material("materials/header_background_lit", "header_background_lit", "ingame_ui")
inject_material("materials/common_widgets_background_lit", "common_widgets_background_lit", "ingame_ui")
--███████╗ ██████╗███████╗███╗ ██╗███████╗ ██████╗ ██████╗ █████╗ ██████╗ ██╗ ██╗███████╗ --███████╗ ██████╗███████╗███╗ ██╗███████╗ ██████╗ ██████╗ █████╗ ██████╗ ██╗ ██╗███████╗
--██╔════╝██╔════╝██╔════╝████╗ ██║██╔════╝██╔════╝ ██╔══██╗██╔══██╗██╔══██╗██║ ██║██╔════╝ --██╔════╝██╔════╝██╔════╝████╗ ██║██╔════╝██╔════╝ ██╔══██╗██╔══██╗██╔══██╗██║ ██║██╔════╝
@ -329,8 +331,16 @@ local function create_header_widget(widget_definition, scenegraph_id, offset_y)
offset_function = function (ui_scenegraph, ui_style, ui_content, ui_renderer) offset_function = function (ui_scenegraph, ui_style, ui_content, ui_renderer)
if ui_content.highlight_hotspot.on_release and not ui_content.checkbox_hotspot.on_release then
ui_content.callback_hide_sub_widgets(ui_content)
end
if ui_content.checkbox_hotspot.on_release then if ui_content.checkbox_hotspot.on_release then
if ui_content.is_widget_collapsed then
ui_content.callback_hide_sub_widgets(ui_content)
end
local mod_name = ui_content.mod_name local mod_name = ui_content.mod_name
local is_mod_suspended = ui_content.is_checkbox_checked local is_mod_suspended = ui_content.is_checkbox_checked
@ -339,6 +349,7 @@ local function create_header_widget(widget_definition, scenegraph_id, offset_y)
ui_content.callback_mod_suspend_state_changed(mod_name, is_mod_suspended) ui_content.callback_mod_suspend_state_changed(mod_name, is_mod_suspended)
end end
ui_content.background_texture = ui_content.is_widget_collapsed and "header_background_lit" or "header_background"
ui_content.checkbox_texture = ui_content.is_checkbox_checked and "checkbox_checked" or "checkbox_unchecked" ui_content.checkbox_texture = ui_content.is_checkbox_checked and "checkbox_checked" or "checkbox_unchecked"
end end
}, },
@ -368,6 +379,7 @@ local function create_header_widget(widget_definition, scenegraph_id, offset_y)
is_checkbox_checked = true, is_checkbox_checked = true,
is_checkbox_visible = false, is_checkbox_visible = false,
is_widget_visible = true, -- for header it will always be 'true', but I need this variable anyways is_widget_visible = true, -- for header it will always be 'true', but I need this variable anyways
is_widget_collapsed = widget_definition.is_widget_collapsed,
checkbox_texture = "checkbox_unchecked", checkbox_texture = "checkbox_unchecked",
highlight_texture = "playerlist_hover", highlight_texture = "playerlist_hover",
@ -379,7 +391,6 @@ local function create_header_widget(widget_definition, scenegraph_id, offset_y)
text = widget_definition.readable_mod_name, text = widget_definition.readable_mod_name,
mod_name = widget_definition.mod_name, mod_name = widget_definition.mod_name,
setting_name = widget_definition.setting_name,
widget_type = widget_definition.widget_type, widget_type = widget_definition.widget_type,
}, },
style = { style = {
@ -388,19 +399,18 @@ local function create_header_widget(widget_definition, scenegraph_id, offset_y)
background = { background = {
size = {widget_size[1], widget_size[2] - 3}, size = {widget_size[1], widget_size[2] - 3},
offset = {0, offset_y + 1, 1}, offset = {0, offset_y + 1, 1}
masked = true
}, },
highlight_texture = { highlight_texture = {
size = {widget_size[1], widget_size[2] - 3}, size = {widget_size[1], widget_size[2] - 3},
offset = {0, offset_y + 1, 1}, offset = {0, offset_y + 1, 2},
color = {255, 255, 255, 255}, color = {255, 255, 255, 255},
masked = true masked = true
}, },
text = { text = {
offset = {60, offset_y + 18, 2}, offset = {60, offset_y + 18, 3},
font_size = 28, font_size = 28,
font_type = "hell_shark_masked", font_type = "hell_shark_masked",
dynamic_font = true, dynamic_font = true,
@ -409,7 +419,7 @@ local function create_header_widget(widget_definition, scenegraph_id, offset_y)
checkbox = { checkbox = {
size = {30, 30}, size = {30, 30},
offset = {widget_size[1] - 180, offset_y + 25, 2}, offset = {widget_size[1] - 180, offset_y + 25, 3},
masked = true masked = true
}, },
@ -466,6 +476,16 @@ local function create_checkbox_widget(widget_definition, scenegraph_id, offset_y
{ {
pass_type = "texture", pass_type = "texture",
style_id = "background",
texture_id = "background_texture",
content_check_function = function (content)
return content.is_widget_collapsed
end
},
{
pass_type = "texture",
style_id = "highlight_texture", style_id = "highlight_texture",
texture_id = "highlight_texture", texture_id = "highlight_texture",
content_check_function = function (content) content_check_function = function (content)
@ -502,7 +522,16 @@ local function create_checkbox_widget(widget_definition, scenegraph_id, offset_y
offset_function = function (ui_scenegraph, ui_style, ui_content, ui_renderer) offset_function = function (ui_scenegraph, ui_style, ui_content, ui_renderer)
if ui_content.highlight_hotspot.on_release and not ui_content.checkbox_hotspot.on_release then
ui_content.callback_hide_sub_widgets(ui_content)
end
if ui_content.checkbox_hotspot.on_release then if ui_content.checkbox_hotspot.on_release then
if ui_content.is_widget_collapsed then
ui_content.callback_hide_sub_widgets(ui_content)
end
local mod_name = ui_content.mod_name local mod_name = ui_content.mod_name
local setting_name = ui_content.setting_name local setting_name = ui_content.setting_name
local old_value = ui_content.is_checkbox_checked local old_value = ui_content.is_checkbox_checked
@ -548,9 +577,11 @@ local function create_checkbox_widget(widget_definition, scenegraph_id, offset_y
content = { content = {
is_checkbox_checked = false, is_checkbox_checked = false,
is_widget_visible = true, is_widget_visible = true,
is_widget_collapsed = widget_definition.is_widget_collapsed,
checkbox_texture = "checkbox_unchecked", -- texture name checkbox_texture = "checkbox_unchecked",
highlight_texture = "playerlist_hover", -- texture name highlight_texture = "playerlist_hover",
background_texture = "common_widgets_background_lit",
checkbox_hotspot = {}, checkbox_hotspot = {},
highlight_hotspot = {}, highlight_hotspot = {},
@ -567,15 +598,19 @@ local function create_checkbox_widget(widget_definition, scenegraph_id, offset_y
style = { style = {
-- VISUALS -- VISUALS
background = {
size = {widget_size[1], widget_size[2] - 3},
offset = {0, offset_y + 1, 0}
},
highlight_texture = { highlight_texture = {
size = {widget_size[1], widget_size[2] - 3}, size = {widget_size[1], widget_size[2] - 3},
offset = {0, offset_y + 1, 0}, offset = {0, offset_y + 1, 1},
masked = true masked = true
}, },
text = { text = {
offset = {60 + widget_definition.widget_level * 40, offset_y + 5, 0}, offset = {60 + widget_definition.widget_level * 40, offset_y + 5, 2},
font_size = 28, font_size = 28,
font_type = "hell_shark_masked", font_type = "hell_shark_masked",
dynamic_font = true, dynamic_font = true,
@ -663,6 +698,16 @@ local function create_stepper_widget(widget_definition, scenegraph_id, offset_y,
{ {
pass_type = "texture", pass_type = "texture",
style_id = "background",
texture_id = "background_texture",
content_check_function = function (content)
return content.is_widget_collapsed
end
},
{
pass_type = "texture",
style_id = "highlight_texture", style_id = "highlight_texture",
texture_id = "highlight_texture", texture_id = "highlight_texture",
content_check_function = function (content) content_check_function = function (content)
@ -716,10 +761,17 @@ local function create_stepper_widget(widget_definition, scenegraph_id, offset_y,
pass_type = "local_offset", pass_type = "local_offset",
offset_function = function (ui_scenegraph, ui_style, ui_content, ui_renderer) offset_function = function (ui_scenegraph, ui_style, ui_content, ui_renderer)
ui_content.left_arrow_texture = ui_content.left_arrow_hotspot.is_hover and "settings_arrow_clicked" or "settings_arrow_normal"
ui_content.right_arrow_texture = ui_content.right_arrow_hotspot.is_hover and "settings_arrow_clicked" or "settings_arrow_normal" if ui_content.highlight_hotspot.on_release and not ui_content.left_arrow_hotspot.on_release and not ui_content.right_arrow_hotspot.on_release then
ui_content.callback_hide_sub_widgets(ui_content)
end
if ui_content.left_arrow_hotspot.on_release or ui_content.right_arrow_hotspot.on_release then if ui_content.left_arrow_hotspot.on_release or ui_content.right_arrow_hotspot.on_release then
if ui_content.is_widget_collapsed then
ui_content.callback_hide_sub_widgets(ui_content)
end
local mod_name = ui_content.mod_name local mod_name = ui_content.mod_name
local setting_name = ui_content.setting_name local setting_name = ui_content.setting_name
local old_value = ui_content.options_values[ui_content.current_option_number] local old_value = ui_content.options_values[ui_content.current_option_number]
@ -737,6 +789,9 @@ local function create_stepper_widget(widget_definition, scenegraph_id, offset_y,
local new_value = ui_content.options_values[new_option_number] local new_value = ui_content.options_values[new_option_number]
ui_content.callback_setting_changed(mod_name, setting_name, old_value, new_value) ui_content.callback_setting_changed(mod_name, setting_name, old_value, new_value)
end end
ui_content.left_arrow_texture = ui_content.left_arrow_hotspot.is_hover and "settings_arrow_clicked" or "settings_arrow_normal"
ui_content.right_arrow_texture = ui_content.right_arrow_hotspot.is_hover and "settings_arrow_clicked" or "settings_arrow_normal"
end end
}, },
-- DEBUG -- DEBUG
@ -770,10 +825,12 @@ local function create_stepper_widget(widget_definition, scenegraph_id, offset_y,
}, },
content = { content = {
is_widget_visible = true, is_widget_visible = true,
is_widget_collapsed = widget_definition.is_widget_collapsed,
highlight_texture = "playerlist_hover", -- texture name highlight_texture = "playerlist_hover", -- texture name
left_arrow_texture = "settings_arrow_normal", left_arrow_texture = "settings_arrow_normal",
right_arrow_texture = "settings_arrow_normal", right_arrow_texture = "settings_arrow_normal",
background_texture = "common_widgets_background_lit",
highlight_hotspot = {}, highlight_hotspot = {},
left_arrow_hotspot = {}, left_arrow_hotspot = {},
@ -798,6 +855,11 @@ local function create_stepper_widget(widget_definition, scenegraph_id, offset_y,
-- VISUALS -- VISUALS
background = {
size = {widget_size[1], widget_size[2] - 3},
offset = {0, offset_y + 1, 0}
},
highlight_texture = { highlight_texture = {
size = {widget_size[1], widget_size[2] - 3}, size = {widget_size[1], widget_size[2] - 3},
offset = {0, offset_y + 1, 0}, offset = {0, offset_y + 1, 0},
@ -1061,6 +1123,7 @@ VMFOptionsView.build_header_widget = function (self, definition, scenegraph_id,
content.is_checkbox_visible = definition.is_mod_toggable content.is_checkbox_visible = definition.is_mod_toggable
content.callback_mod_suspend_state_changed = callback(self, "callback_mod_suspend_state_changed") content.callback_mod_suspend_state_changed = callback(self, "callback_mod_suspend_state_changed")
content.callback_hide_sub_widgets = callback(self, "callback_hide_sub_widgets")
return widget return widget
end end
@ -1071,6 +1134,7 @@ VMFOptionsView.build_stepper_widget = function (self, definition, scenegraph_id,
local content = widget.content local content = widget.content
content.callback_setting_changed = callback(self, "callback_setting_changed") content.callback_setting_changed = callback(self, "callback_setting_changed")
content.callback_hide_sub_widgets = callback(self, "callback_hide_sub_widgets")
return widget return widget
end end
@ -1081,6 +1145,7 @@ VMFOptionsView.build_checkbox_widget = function (self, definition, scenegraph_id
local content = widget.content local content = widget.content
content.callback_setting_changed = callback(self, "callback_setting_changed") content.callback_setting_changed = callback(self, "callback_setting_changed")
content.callback_hide_sub_widgets = callback(self, "callback_hide_sub_widgets")
return widget return widget
end end
@ -1125,6 +1190,78 @@ VMFOptionsView.rearrange_settings_list = function (self)
end end
VMFOptionsView.callback_hide_sub_widgets = function (self, widget_content)
local mod_name = widget_content.mod_name
local setting_name = widget_content.setting_name
local is_widget_collapsed = widget_content.is_widget_collapsed
local widget_number = not setting_name and 1 -- if (setting_name == nil) -> it's header -> #1
local are_there_visible_sub_widgets = false
if not is_widget_collapsed then
for _, mod_widgets in ipairs(self.settings_list_widgets) do
if mod_widgets[1].content.mod_name == mod_name then
for i, widget in ipairs(mod_widgets) do
if widget_number then
if widget.content.parent_widget_number == widget_number then
--vmf:echo(tostring(i))
are_there_visible_sub_widgets = are_there_visible_sub_widgets or widget.content.is_widget_visible
end
else
if widget.content.setting_name == setting_name then
widget_number = i
end
end
end
end
end
end
widget_content.is_widget_collapsed = not is_widget_collapsed and are_there_visible_sub_widgets
setting_name = setting_name or mod_name -- header
local all_collapsed_widgets = vmf:get("options_menu_collapsed_widgets")
all_collapsed_widgets = all_collapsed_widgets or {}
local mod_collapsed_widgets = all_collapsed_widgets[mod_name]
if widget_content.is_widget_collapsed then
mod_collapsed_widgets = mod_collapsed_widgets or {}
mod_collapsed_widgets[setting_name] = true
all_collapsed_widgets[mod_name] = mod_collapsed_widgets
else
if mod_collapsed_widgets then
mod_collapsed_widgets[setting_name] = nil
local is_collapsed_widgets_list_empty = true
for _, _ in pairs(mod_collapsed_widgets) do
is_collapsed_widgets_list_empty = false
end
if is_collapsed_widgets_list_empty then
all_collapsed_widgets[mod_name] = nil
end
end
end
vmf:set("options_menu_collapsed_widgets", all_collapsed_widgets)
--vmf:echo(tostring(are_there_visible_sub_widgets))
self:update_settings_list_widgets_visibility(mod_name)
self:rearrange_settings_list()
end
VMFOptionsView.callback_setting_changed = function (self, mod_name, setting_name, old_value, new_value) VMFOptionsView.callback_setting_changed = function (self, mod_name, setting_name, old_value, new_value)
--vmf:echo("CHANGED: " .. mod_name .. " " .. setting_name .. " " .. tostring(old_value) .. " " .. tostring(new_value)) --vmf:echo("CHANGED: " .. mod_name .. " " .. setting_name .. " " .. tostring(old_value) .. " " .. tostring(new_value))
@ -1235,6 +1372,7 @@ VMFOptionsView.update_picked_option_for_settings_list_widgets = function (self)
end end
end end
VMFOptionsView.update_settings_list_widgets_visibility = function (self, mod_name) VMFOptionsView.update_settings_list_widgets_visibility = function (self, mod_name)
--table.dump(self.settings_list_widgets, "WIDGETSSSSSSSS", 3) --table.dump(self.settings_list_widgets, "WIDGETSSSSSSSS", 3)
@ -1251,12 +1389,12 @@ VMFOptionsView.update_settings_list_widgets_visibility = function (self, mod_nam
-- if 'header' or 'checkbox' -- if 'header' or 'checkbox'
if parent_widget.style.checkbox then if parent_widget.style.checkbox then
widget.content.is_widget_visible = parent_widget.content.is_checkbox_checked and parent_widget.content.is_widget_visible widget.content.is_widget_visible = parent_widget.content.is_checkbox_checked and parent_widget.content.is_widget_visible and not parent_widget.content.is_widget_collapsed
-- if 'stepper' -- if 'stepper'
else else
if widget.content.show_widget_condition then if widget.content.show_widget_condition then
widget.content.is_widget_visible = widget.content.show_widget_condition[parent_widget.content.current_option_number] and parent_widget.content.is_widget_visible widget.content.is_widget_visible = widget.content.show_widget_condition[parent_widget.content.current_option_number] and parent_widget.content.is_widget_visible and not parent_widget.content.is_widget_collapsed
else else
get_mod(widget.content.mod_name):echo("ERROR: the stepper widget in the options menu has sub_widgets, but some of its sub_widgets doesn't have 'show_widget_condition'", true) get_mod(widget.content.mod_name):echo("ERROR: the stepper widget in the options menu has sub_widgets, but some of its sub_widgets doesn't have 'show_widget_condition'", true)
end end
@ -1516,6 +1654,12 @@ VMFMod.create_options = function (self, widgets_definition, is_mod_toggable, rea
local new_widget_definition = nil local new_widget_definition = nil
local new_widget_index = nil local new_widget_index = nil
local options_menu_collapsed_widgets = vmf:get("options_menu_collapsed_widgets")
local mod_collapsed_widgets = nil
if options_menu_collapsed_widgets then
mod_collapsed_widgets = options_menu_collapsed_widgets[self._name]
end
-- defining header widget -- defining header widget
new_widget_index = 1 new_widget_index = 1
@ -1530,6 +1674,11 @@ VMFMod.create_options = function (self, widgets_definition, is_mod_toggable, rea
new_widget_definition.default = true new_widget_definition.default = true
new_widget_definition.is_mod_toggable = is_mod_toggable new_widget_definition.is_mod_toggable = is_mod_toggable
if mod_collapsed_widgets then
new_widget_definition.is_widget_collapsed = mod_collapsed_widgets[self._name]
end
-- @TODO: wtf?
local mod_suspend_state_list = vmf:get("mod_suspend_state_list") local mod_suspend_state_list = vmf:get("mod_suspend_state_list")
mod_suspend_state_list = (type(mod_suspend_state_list) == "table") and mod_suspend_state_list or {} mod_suspend_state_list = (type(mod_suspend_state_list) == "table") and mod_suspend_state_list or {}
if type(mod_suspend_state_list[self._name]) == "nil" then if type(mod_suspend_state_list[self._name]) == "nil" then
@ -1572,6 +1721,10 @@ VMFMod.create_options = function (self, widgets_definition, is_mod_toggable, rea
new_widget_definition.show_widget_condition = current_widget.show_widget_condition new_widget_definition.show_widget_condition = current_widget.show_widget_condition
new_widget_definition.parent_widget_number = parent_number new_widget_definition.parent_widget_number = parent_number
if mod_collapsed_widgets then
new_widget_definition.is_widget_collapsed = mod_collapsed_widgets[current_widget.setting_name]
end
check_widget_definition(self, new_widget_definition) check_widget_definition(self, new_widget_definition)
if type(self:get(current_widget.setting_name)) == "nil" then if type(self:get(current_widget.setting_name)) == "nil" then