--[========[GUI2 Dialog Manipulations]========] print("Loading GUI module...") ---Show a basic alert dialog with a single button ---@param title? string Dialog title string ---@param msg string Detail message function gui.alert(title, msg) if not msg then msg = title; title = ""; end gui.show_prompt(title, msg, "ok", true) end ---Show a basic prompt dialog with two buttons ---@param title? string Dialog title string ---@param msg string Detail message ---@return boolean #True if OK or Yes was clicked function gui.confirm(title, msg) if not msg then msg = title; title = ""; end return gui.show_prompt(title, msg, "yes_no", true) end ---Displays a WML message box with attributes from attr and options from options. ---@param attr WML The contents of a [message] tag, without any [option]s. ---@param options string[]|gui_narration_option_info[] A list of options to show in the message box ---@return integer #the index of the selected option. function gui.get_user_choice(attr, options) local result = 0 function gui.__user_choice_helper(i) result = i end local msg = {} for k,v in pairs(attr) do msg[k] = attr[k] end for k,v in ipairs(options) do if type(v) == "table" or (type(v) == "userdata" and getmetatable(v) ~= "translatable string") then table.insert(msg, wml.tag.option { image = v.image, label = v.label, description = v.description or v.message, default = v.default, wml.tag.command { wml.tag.lua { code = string.format("gui.__user_choice_helper(%d)", k) }}}) elseif type(v) == "string" or type(v) == "number" or type(v) == "boolean" or (type(v) == "userdata" and getmetatable(v) == "translatable string") then table.insert(msg, wml.tag.option { description = v, wml.tag.command { wml.tag.lua { code = string.format("gui.__user_choice_helper(%d)", k) }}}) else -- only function and thread, because nil stops the cycle anyway error(string.format("Invalid data type in gui.get_user_choice (type: %s)", type(v))) end end wesnoth.wml_actions.message(msg) gui.__user_choice_helper = nil return result end -- These functions are initially declared local, then assigned into the wesnoth table. -- This is a compatibility path for the old GUI2 API. -- It can be removed if the old API is ever removed. local open_dialogs = {} local function reorder_dialog_args(t, n) local res = {} for i = 1, n do table.insert( res, t[1]) table.remove( t, 1 ) end local w = open_dialogs[1]:find(table.unpack(t)) return w, res end local function set_dialog_callback(...) local w, args = reorder_dialog_args({...}, 1) w.callback = args[1] end local function set_dialog_tooltip(...) local w, args = reorder_dialog_args({...}, 1) w.tooltip = args[1] end local function set_dialog_markup(...) local w, args = reorder_dialog_args({...}, 1) w.use_markup = args[1] end local function set_dialog_canvas(...) local w, args = reorder_dialog_args({...}, 2) w:set_canvas(table.unpack(args)) end local function set_dialog_focus(...) local w, args = reorder_dialog_args({...}, 0) w:focus() end local function set_dialog_active(...) local w, args = reorder_dialog_args({...}, 1) w.enabled = args[1] end local function set_dialog_visible(...) local w, args = reorder_dialog_args({...}, 1) w.visible = args[1] end local function set_dialog_value(...) local w, args = reorder_dialog_args({...}, 1) w.value_compat = args[1] end local function get_dialog_value(...) local w, args = reorder_dialog_args({...}, 0) return w.value_compat end local function add_dialog_tree_node(...) local w, args = reorder_dialog_args({...}, 2) w:add_item_of_type(table.unpack(args)) end local function remove_dialog_item(...) local w, args = reorder_dialog_args({...}, 2) w:remove_items_at(table.unpack(args)) end local old_show_dialog = gui.show_dialog function gui.show_dialog(dialog_wml, preshow, postshow) local res = old_show_dialog( dialog_wml, function(dialog) table.insert(open_dialogs, 1, dialog) if preshow then preshow(dialog) end end, postshow ) table.remove( open_dialogs, 1 ) return res end wesnoth.show_menu = wesnoth.deprecate_api('wesnoth.show_menu', 'gui.show_menu', 1, nil, gui.show_menu) wesnoth.show_message_dialog = wesnoth.deprecate_api('wesnoth.show_message_dialog', 'gui.show_narration', 1, nil, gui.show_narration) wesnoth.show_popup_dialog = wesnoth.deprecate_api('wesnoth.show_popup_dialog', 'gui.show_popup', 1, nil, gui.show_popup) wesnoth.show_story = wesnoth.deprecate_api('wesnoth.show_story', 'gui.show_story', 1, nil, gui.show_story) wesnoth.show_message_box = wesnoth.deprecate_api('wesnoth.show_message_box', 'gui.show_prompt', 1, nil, gui.show_prompt) wesnoth.alert = wesnoth.deprecate_api('wesnoth.alert', 'gui.alert', 1, nil, gui.alert) wesnoth.confirm = wesnoth.deprecate_api('wesnoth.confirm', 'gui.confirm', 1, nil, gui.confirm) wesnoth.show_lua_console = wesnoth.deprecate_api('wesnoth.show_lua_console', 'gui.show_lua_console', 1, nil, gui.show_lua_console) wesnoth.add_widget_definition = wesnoth.deprecate_api('wesnoth.add_widget_definition', 'gui.add_widget_definition', 1, nil, gui.add_widget_definition) wesnoth.set_dialog_callback = wesnoth.deprecate_api('wesnoth.set_dialog_callback', '.callback', 1, nil, set_dialog_callback) wesnoth.set_dialog_tooltip = wesnoth.deprecate_api('wesnoth.set_dialog_tooltip', '.tooltip', 1, nil, set_dialog_tooltip) wesnoth.set_dialog_markup = wesnoth.deprecate_api('wesnoth.set_dialog_markup', '.use_markup', 1, nil, set_dialog_markup) wesnoth.set_dialog_canvas = wesnoth.deprecate_api('wesnoth.set_dialog_canvas', ':set_canvas', 1, nil, set_dialog_canvas) wesnoth.set_dialog_focus = wesnoth.deprecate_api('wesnoth.set_dialog_focus', ':focus', 1, nil, set_dialog_focus) wesnoth.set_dialog_active = wesnoth.deprecate_api('wesnoth.set_dialog_active', '.enabled', 1, nil, set_dialog_active) wesnoth.set_dialog_visible = wesnoth.deprecate_api('wesnoth.set_dialog_visible', '.visible', 1, nil, set_dialog_visible) local value_attributes = '.selected_index or .selected or .text or .value or .percentage or .selected_item_path or .unfolded or .unit or .label' wesnoth.set_dialog_value = wesnoth.deprecate_api('wesnoth.set_dialog_value', value_attributes, 1, nil, set_dialog_value) wesnoth.get_dialog_value = wesnoth.deprecate_api('wesnoth.get_dialog_value', value_attributes, 1, nil, get_dialog_value) wesnoth.add_dialog_tree_node = wesnoth.deprecate_api('wesnoth.add_dialog_tree_node', ':add_item_of_type', 1, nil, add_dialog_tree_node) wesnoth.remove_dialog_item = wesnoth.deprecate_api('wesnoth.remove_dialog_item', ':remove_items_at', 1, nil, remove_dialog_item) wesnoth.show_dialog = wesnoth.deprecate_api('wesnoth.show_dialog', 'gui.show_dialog', 1, nil, gui.show_dialog) if wesnoth.kernel_type() == "Game Lua Kernel" then -- The deprecated function was only available in Game Lua Kernel, so even though show_help is available in other kernels, there's no need to expose the deprecated function there. wesnoth.open_help = wesnoth.deprecate_api('wesnoth.open_help', 'gui.show_help', 1, nil, gui.show_help) wesnoth.gamestate_inspector = wesnoth.deprecate_api('wesnoth.gamestate_inspector', 'gui.show_inspector', 1, nil, gui.show_inspector) end