Aleksei-bird 7c9c708c92 Первый фикс
Пачки некоторых позиций увеличены
2024-03-01 20:54:33 +03:00

228 lines
7.6 KiB
Lua

-- This file contains general-purpose dialogs that are generic and used in several places
-- Note: This system seems to have a problem, as references to functions stored in global
-- break when reloading the game. In that case, just close the dialog without changes
-- ** CHOOSER **
local function add_chooser_button(modal_elements, definition)
local style, note = "flib_slot_button_default", nil
if definition.selected then
style = "flib_slot_button_green"
note = {"fp.selected"}
elseif definition.preferred then
style = "flib_slot_button_pink"
note = {"fp.preferred"}
end
local first_line = (note == nil) and {"fp.tt_title", definition.localised_name}
or {"fp.tt_title_with_note", definition.localised_name, note}
local tooltip = {"", first_line, "\n", definition.amount_line, "\n\n", definition.tooltip_appendage}
modal_elements.choices_table.add{type="sprite-button", style=style, tooltip=tooltip,
tags={mod="fp", on_gui_click="make_chooser_choice", element_id=definition.element_id},
sprite=definition.sprite, number=definition.button_number, mouse_button_filter={"left"}}
end
local function handler_chooser_button_click(player, tags, event)
local handler_name = util.globals.modal_data(player).click_handler_name
GLOBAL_HANDLERS[handler_name](player, tags.element_id, event)
util.raise.close_dialog(player, "cancel")
end
-- Handles populating the chooser dialog
local function open_chooser_dialog(_, modal_data)
local modal_elements = modal_data.modal_elements
local content_frame = modal_elements.content_frame
local frame_choices = content_frame.add{type="frame", direction="horizontal", style="slot_button_deep_frame"}
modal_elements.choices_table = frame_choices.add{type="table", column_count=8, style="filter_slot_table"}
for _, definition in ipairs(modal_data.button_definitions) do
add_chooser_button(modal_elements, definition)
end
end
-- ** EVENTS **
local chooser_listeners = {}
chooser_listeners.gui = {
on_gui_click = {
{
name = "make_chooser_choice", -- great naming right there
timeout = 20,
handler = handler_chooser_button_click
}
}
}
chooser_listeners.dialog = {
dialog = "chooser",
metadata = (function(modal_data)
local info_tag = (modal_data.text_tooltip) and "[img=info]" or ""
return {
caption = {"", {"fp.choose"}, " ", modal_data.title},
subheader_text = {"", modal_data.text, " ", info_tag},
subheader_tooltip = (modal_data.text_tooltip or ""),
create_content_frame = true
}
end),
open = open_chooser_dialog
}
-- ** OPTIONS **
local options_listeners = {}
-- ** LOCAL UTIL **
local function call_change_handler(player, tags, event)
local modal_data = util.globals.modal_data(player)
local handler_name = modal_data.field_handlers[tags.field_name]
if handler_name then GLOBAL_HANDLERS[handler_name](modal_data, event) end
end
-- ** ELEMENTS **
options_listeners.gui = {}
local elements = {}
-- ** TEXTFIELD **
elements.textfield = {}
function elements.textfield.create(table, field, modal_elements)
local textfield = table.add{type="textfield", text=field.text,
tags={mod="fp", on_gui_text_changed="change_option", field_name=field.name}}
textfield.style.width = (field.width or 180)
if field.focus then util.gui.select_all(textfield) end
modal_elements[field.name] = textfield
end
function elements.textfield.read(textfield)
return textfield.text
end
-- ** NUMERIC TEXTFIELD **
elements.numeric_textfield = {}
function elements.numeric_textfield.create(table, field, modal_elements)
local textfield = table.add{type="textfield", text=tostring(field.text or ""),
tags={mod="fp", on_gui_text_changed="change_option", field_name=field.name}}
textfield.style.width = (field.width or 75)
util.gui.setup_numeric_textfield(textfield, true, false)
if field.focus then util.gui.select_all(textfield) end
modal_elements[field.name] = textfield
end
function elements.numeric_textfield.read(textfield)
return tonumber(textfield.text)
end
-- ** TEXTFIELD EVENT **
options_listeners.gui.on_gui_text_changed = {
{
name = "change_option",
handler = call_change_handler
}
}
-- ** ON OFF SWITCH **
elements.on_off_switch = {}
options_listeners.gui.on_gui_switch_state_changed = {
{
name = "change_option",
handler = call_change_handler
}
}
function elements.on_off_switch.create(table, field, modal_elements)
local state = util.gui.switch.convert_to_state(field.state)
local switch = table.add{type="switch", switch_state=state,
tags={mod="fp", on_gui_switch_state_changed="change_option", field_name=field.name},
left_label_caption={"fp.on"}, right_label_caption={"fp.off"}}
modal_elements[field.name] = switch
end
function elements.on_off_switch.read(switch)
return util.gui.switch.convert_to_boolean(switch.switch_state)
end
-- ** CHOOSE ELEM BUTTON **
elements.choose_elem_button = {}
options_listeners.gui.on_gui_elem_changed = {
{
name = "change_option",
handler = call_change_handler
}
}
function elements.choose_elem_button.create(table, field, modal_elements)
local choose_elem_button = table.add{type="choose-elem-button",
tags={mod="fp", on_gui_elem_changed="change_option", field_name=field.name},
elem_type=field.elem_type, style="fp_sprite-button_inset"}
choose_elem_button.elem_value = field.elem_value
modal_elements[field.name] = choose_elem_button
end
function elements.choose_elem_button.read(choose_elem_button)
return choose_elem_button.elem_value
end
local function open_options_dialog(_, modal_data)
local modal_elements = modal_data.modal_elements
local content_frame = modal_elements.content_frame
local table_options = content_frame.add{type="table", column_count=2}
table_options.style.margin = {0, 12, 8, 2}
table_options.style.horizontal_spacing = 24
table_options.style.vertical_spacing = 16
modal_data.field_handlers = {}
for _, field in ipairs(modal_data.fields) do
local caption = (field.tooltip) and {"fp.info_label", field.caption} or field.caption
table_options.add{type="label", caption=caption, tooltip=field.tooltip, style="heading_3_label"}
elements[field.type].create(table_options, field, modal_elements)
modal_data.field_handlers[field.name] = field.change_handler_name
end
-- Call all the change handlers once to set the initial state correctly
for field_name, handler_name in pairs(modal_data.field_handlers) do
GLOBAL_HANDLERS[handler_name](modal_data, modal_elements[field_name])
end
end
local function close_options_dialog(player, action)
local modal_data = util.globals.modal_data(player)
local options_data = {}
for _, field in pairs(modal_data.fields) do
local element = modal_data.modal_elements[field.name]
options_data[field.name] = elements[field.type].read(element)
end
local handler_name = modal_data.submission_handler_name
GLOBAL_HANDLERS[handler_name](player, options_data, action)
end
options_listeners.dialog = {
dialog = "options",
metadata = (function(modal_data) return {
caption = modal_data.title,
subheader_text = modal_data.text,
create_content_frame = true,
show_submit_button = true,
show_delete_button = modal_data.allow_deletion
} end),
open = open_options_dialog,
close = close_options_dialog
}
return { chooser_listeners, options_listeners }