330 lines
13 KiB
Lua

require("scripts.gui_display_page")
require("scripts.gui_settings_page")
require("scripts.gui_import_export")
local function get_frame(player_index, frame_name)
local global_player = global.players[player_index]
if not global_player[frame_name] or not global_player[frame_name].valid then
reinitialize_player(player_index)
end
return global.players[player_index][frame_name]
end
function get_outer_frame(player_index)
return get_frame(player_index, "outer_frame")
end
function get_main_frame(player_index)
return get_frame(player_index, "main_frame")
end
function get_inner_frame(player_index)
return get_frame(player_index, "inner_frame")
end
function build_gui_frames(player)
local screen_element = player.gui.screen
local outer_frame = screen_element.add{type="frame", name="milestones_outer_frame", style="outer_frame", visible=false}
local main_frame = outer_frame.add{type="frame", name="milestones_main_frame", direction="vertical"}
local titlebar = main_frame.add{type="flow", name="milestones_titlebar", style="flib_titlebar_flow", direction="horizontal"}
titlebar.add{
type="label",
name="milestones_main_label",
style="frame_title",
caption={"milestones.title"},
ignored_by_interaction=true
}
titlebar.add{type="empty-widget", style="flib_titlebar_drag_handle", ignored_by_interaction=true}
local settings_button = titlebar.add{
type="sprite-button",
name="milestones_settings_button",
style="frame_action_button",
sprite="milestones_settings_white",
hovered_sprite="milestones_settings_black",
clicked_sprite="milestones_settings_black",
mouse_button_filter={"left"},
tooltip = {"milestones.settings_instructions"},
tags={
action="milestones_open_settings"
}
}
if not player.admin then
settings_button.enabled = false
settings_button.tooltip = {"milestones.settings_disabled"}
settings_button.sprite = "milestones_settings_disabled"
settings_button.hovered_sprite = "milestones_settings_disabled"
settings_button.clicked_sprite = "milestones_settings_disabled"
end
titlebar.add{
type="sprite-button",
name="milestones_pin_button",
style="frame_action_button",
mouse_button_filter={"left"},
sprite="milestones_pin_white",
hovered_sprite="milestones_pin_black",
clicked_sprite="milestones_pin_black",
tooltip = {"milestones.pin_instructions"},
tags={
action="milestones_pin_gui"
}
}
titlebar.add{
type="sprite-button",
name="milestones_close_button",
style="frame_action_button",
mouse_button_filter={"left"},
sprite="utility/close_white",
hovered_sprite="utility/close_black",
clicked_sprite="utility/close_black",
tooltip = {"gui.close-instruction"},
tags={
action="milestones_close_gui"
}
}
titlebar.drag_target = outer_frame
local inner_frame = main_frame.add{type="frame", name="milestones_inner_frame", direction="vertical", style="inside_shallow_frame"}
local dialog_buttons_bar = main_frame.add{type="flow", style="dialog_buttons_horizontal_flow", name="milestones_dialog_buttons", direction="horizontal"}
dialog_buttons_bar.add{type="button", style="back_button", caption={"milestones.settings_back"}, tags={action="milestones_cancel_settings"}}
dialog_buttons_bar.add{type="empty-widget", style="flib_dialog_footer_drag_handle", ignored_by_interaction=true}
dialog_buttons_bar.add{type="button", style="confirm_button", caption={"milestones.settings_confirm"}, tags={action="milestones_confirm_settings"}}
dialog_buttons_bar.drag_target = outer_frame
-- Import/export side menu
local import_export_frame = outer_frame.add{type="frame", name="milestones_settings_import_export", style="inner_frame_in_outer_frame", direction="vertical", visible=false}
local import_export_titlebar = import_export_frame.add{type="flow", name="milestones_settings_import_export_titlebar", style="flib_titlebar_flow", direction="horizontal"}
import_export_titlebar.add{
type="label",
name="milestones_settings_import_export_titlebar_label",
style="frame_title",
ignored_by_interaction=true
}
import_export_titlebar.add{type="empty-widget", style="flib_titlebar_drag_handle", ignored_by_interaction=true}
import_export_titlebar.drag_target = outer_frame
import_export_frame.add{type="flow", name="milestones_settings_import_export_inside", direction="vertical"}
return outer_frame, main_frame, inner_frame
end
local function update_settings_button(player) -- In case permissions changed
local main_frame = get_main_frame(player.index)
settings_button = main_frame.milestones_titlebar.milestones_settings_button
if player.admin then
settings_button.enabled = true
settings_button.tooltip = {"milestones.settings_instructions"}
settings_button.sprite = "milestones_settings_white"
settings_button.hovered_sprite = "milestones_settings_black"
settings_button.clicked_sprite = "milestones_settings_black"
else
settings_button.enabled = false
settings_button.tooltip = {"milestones.settings_disabled"}
settings_button.sprite = "milestones_settings_disabled"
settings_button.hovered_sprite = "milestones_settings_disabled"
settings_button.clicked_sprite = "milestones_settings_disabled"
end
end
local function open_gui(player)
local global_player = global.players[player.index]
local outer_frame = get_outer_frame(player.index)
build_display_page(player)
update_settings_button(player)
outer_frame.visible = true
outer_frame.bring_to_front()
player.opened = get_main_frame(player.index)
player.set_shortcut_toggled("milestones_toggle_gui", true)
if not global_player.opened_once_before then -- Open in the center the first time
outer_frame.force_auto_center()
global_player.opened_once_before = true
end
end
local function close_gui(player)
local outer_frame = get_outer_frame(player.index)
outer_frame.visible = false
outer_frame.auto_center = false -- Remove auto_center from the force_auto_center() that we did for the first open
get_inner_frame(player.index).clear()
local import_export_frame = outer_frame.milestones_settings_import_export
local import_export_inside_frame = import_export_frame.milestones_settings_import_export_inside
import_export_inside_frame.clear()
import_export_frame.visible = false
player.set_shortcut_toggled("milestones_toggle_gui", false)
if player.opened == get_main_frame(player.index) then
player.opened = nil
end
end
local function toggle_gui(player)
local visible = get_outer_frame(player.index).visible
if visible == false then
open_gui(player)
else
close_gui(player)
end
end
function refresh_gui_for_player(player)
if is_display_page_visible(player.index) then
get_inner_frame(player.index).clear()
build_display_page(player)
end
end
function refresh_gui_for_force(force)
for _, player in pairs(force.players) do
refresh_gui_for_player(player)
end
end
local function toggle_pinned(player, element)
local global_player = global.players[player.index]
global_player.pinned = not global_player.pinned
if global_player.pinned then
element.style = "flib_selected_frame_action_button"
element.sprite = "milestones_pin_black"
player.opened = nil
else
element.style = "frame_action_button"
element.sprite = "milestones_pin_white"
local main_frame = get_main_frame(player.index)
if player.opened == nil then
player.opened = main_frame
elseif player.opened ~= main_frame then
close_gui(player)
end
end
end
script.on_event(defines.events.on_gui_closed, function(event)
if event.element and event.element.name == "milestones_main_frame" then
local player = game.get_player(event.player_index)
local global_player = global.players[event.player_index]
if global_player.one_time_prevent_close then
global_player.one_time_prevent_close = false
player.opened = get_main_frame(player.index)
elseif not global_player.pinned then
close_gui(player)
end
end
end)
script.on_event(defines.events.on_player_display_resolution_changed, function(event)
local player = game.players[event.player_index]
refresh_gui_for_player(player)
end)
script.on_event(defines.events.on_player_display_scale_changed, function(event)
local player = game.players[event.player_index]
refresh_gui_for_player(player)
end)
-- Quickbar shortcut
script.on_event(defines.events.on_lua_shortcut, function(event)
if event.prototype_name == "milestones_toggle_gui" then
local player = game.get_player(event.player_index)
toggle_gui(player)
end
end)
-- Keyboard shortcuts
script.on_event("milestones_toggle_gui", function(event)
local player = game.get_player(event.player_index)
toggle_gui(player)
end)
-- Override `E` on the settings page
script.on_event("milestones_confirm_settings", function(event)
if is_settings_page_visible(event.player_index) then
confirm_settings_page(event.player_index)
global.players[event.player_index].one_time_prevent_close = true
end
end)
-- Override `Escape` on the settings page
script.on_event("milestones_cancel_settings", function(event)
if is_settings_page_visible(event.player_index) then
cancel_settings_page(event.player_index)
global.players[event.player_index].one_time_prevent_close = true
end
end)
script.on_event(defines.events.on_gui_click, function(event)
if not event.element then return end
if not event.element.tags then return end
if event.element.tags.action == "milestones_close_gui" then
local player = game.get_player(event.player_index)
close_gui(player)
elseif event.element.tags.action == "milestones_pin_gui" then
local player = game.get_player(event.player_index)
toggle_pinned(player, event.element)
elseif event.element.tags.action == "milestones_open_settings" then
local player = game.get_player(event.player_index)
get_inner_frame(player.index).clear()
build_settings_page(player)
elseif event.element.tags.action == "milestones_cancel_settings" then
cancel_settings_page(event.player_index)
elseif event.element.tags.action == "milestones_confirm_settings" then
confirm_settings_page(event.player_index)
elseif event.element.tags.action == "milestones_swap_setting" then
swap_settings(event.player_index, event)
elseif event.element.tags.action == "milestones_delete_settings" then
delete_selected_settings(event.player_index)
elseif event.element.tags.action == "milestones_add_setting" then
add_setting(event.player_index, event.element)
elseif event.element.tags.action == "milestones_edit_time" then
enable_edit_time(event.player_index, event.element)
elseif event.element.tags.action == "milestones_confirm_edit_time" then
confirm_edit_time(event.player_index, event.element)
elseif event.element.tags.action == "milestones_reset_preset" then
reset_preset(event.player_index)
elseif event.element.tags.action == "milestones_open_import" then
toggle_import_export_page(event.player_index, event.element, true)
elseif event.element.tags.action == "milestones_open_export" then
toggle_import_export_page(event.player_index, event.element, false)
elseif event.element.tags.action == "milestones_close_import_export" then
close_import_export_page(event.player_index)
elseif event.element.tags.action == "milestones_import_settings" then
import_settings(event.player_index)
elseif event.element.tags.action == "milestones_settings_infinity_button" then
toggle_infinity_button(event.element)
elseif event.element.tags.action == "milestones_select_setting" then -- have to use on_gui_click instead of on_gui_checked_state_changed so we can check for shift
select_setting(event)
end
end)
-- Textfield enter
script.on_event(defines.events.on_gui_confirmed, function(event)
if not event.element then return end
if not event.element.tags then return end
if event.element.tags.action == "milestones_confirm_edit_time_textfield" then
confirm_edit_time(event.player_index, event.element)
end
end)
-- Checkboxes
script.on_event(defines.events.on_gui_checked_state_changed, function(event)
if not event.element then return end
if not event.element.tags then return end
if event.element.name == "milestones_export_encoded_checkbox" then
toggle_export_encoded(event.element)
end
end)
-- Dropdowns
script.on_event(defines.events.on_gui_selection_state_changed, function(event)
if not event.element then return end
if not event.element.tags then return end
if event.element.tags.action == "milestones_change_preset" then
preset_dropdown_changed(event)
end
end)