175 lines
5.3 KiB
Lua

--[[
Business logic for the main UI.
]]--
function todo.toggle_main_frame(player)
if todo.get_main_frame(player) then
todo.minimize_main_frame(player)
else
todo.maximize_main_frame(player)
todo.refresh_task_table(player)
end
end
function todo.minimize_main_frame(player)
todo.log("Minimizing UI for player " .. player.name)
player.set_shortcut_toggled("todo-toggle-ui-shortcut", false)
local frame = todo.get_main_frame(player)
if frame then
frame.destroy()
-- just close import/export
if (todo.get_import_dialog(player)) then
todo.on_import_cancel_click(player)
end
if (todo.get_export_dialog(player)) then
todo.on_export_cancel_click(player)
end
-- Also close the clean / clean confirmation dialogs
if (todo.get_clean_dialog(player)) then
todo.destroy_clean_dialog(player)
end
if (todo.get_clean_confirm_dialog(player)) then
todo.destroy_clean_confirm_dialog(player)
end
-- if other dialog open, set it to opened
local dialog = todo.get_add_dialog(player)
if (dialog) then
player.opened = dialog
return true
end
dialog = todo.get_edit_dialog(player)
if (dialog) then
player.opened = dialog
return true
end
return true
end
return false
end
function todo.on_maximize_button_click(player)
if (todo.get_main_frame(player)) then
todo.minimize_main_frame(player)
else
todo.maximize_main_frame(player)
end
todo.refresh_task_table(player)
end
function todo.maximize_main_frame(player)
todo.log("Maximizing UI for player " .. player.name)
player.set_shortcut_toggled("todo-toggle-ui-shortcut", true)
if not todo.get_main_frame(player) then
frame = todo.create_maximized_frame(player)
player.opened = frame
return true
end
return false
end
function todo.update_main_task_list_for_everyone()
for _, player in pairs(game.players) do
todo.refresh_task_table(player)
end
end
function todo.refresh_task_table(player)
todo.update_current_task_label(player)
-- if the player has the UI minimized do nothing
local main_frame = todo.get_main_frame(player)
if not main_frame then
return
end
local table = todo.get_task_table(player)
for i, element in ipairs(table.children) do
if i > table.column_count then
element.destroy()
end
end
local open_length = #global.todo.open
for i, task in ipairs(global.todo.open) do
local expanded = todo.should_show_task_details(player, task.id)
todo.add_task_to_table(player, table, task, false, i == 1, i == open_length, expanded)
end
if (todo.show_completed_tasks(player)) then
for _, task in ipairs(global.todo.done) do
-- we don't want ordering for completed tasks
local expanded = todo.should_show_task_details(player, task.id)
todo.add_task_to_table(player, table, task, true, true, true, expanded)
end
end
end
function todo.update_current_task_label(player)
if not todo.get_maximize_button(player) then
return
end
-- we may update the button label
todo.log("updating button label")
local count = 0
for _, task in pairs(global.todo.open) do
if task.assignee == player.name then
todo.log(serpent.block(task))
todo.get_maximize_button(player).caption = { "",
{ todo.translate(player, "todo_list") },
": ",
task.title
}
return
end
-- only count tasks that are assignable
if (not task.assignee) then
count = count + 1
end
end
if (count == 0) then
todo.get_maximize_button(player).caption = { todo.translate(player, "todo_list") }
else
todo.get_maximize_button(player).caption = { "", { todo.translate(player, "todo_list") }, ": ", { todo.translate(player, "tasks_available"), count } }
end
end
function todo.on_toggle_show_completed_click(player)
todo.toggle_show_completed(player)
todo.refresh_task_table(player)
end
function todo.toggle_show_completed(player)
if not global.todo.settings[player.name] then
global.todo.settings[player.name] = {}
global.todo.settings[player.name].show_completed = true
else
global.todo.settings[player.name].show_completed = not global.todo.settings[player.name].show_completed
end
local frame = todo.get_main_frame(player)
if (global.todo.settings[player.name].show_completed) then
frame.todo_main_button_flow.todo_toggle_show_completed_button.caption = { todo.translate(player, "hide_done") }
else
frame.todo_main_button_flow.todo_toggle_show_completed_button.caption = { todo.translate(player, "show_done") }
end
end
function todo.get_maximize_button(player)
local flow = mod_gui.get_button_flow(player)
if flow.todo_maximize_button then
return flow.todo_maximize_button
else
return nil
end
end