diff --git a/features/gui/autofill.lua b/features/gui/autofill.lua index 0b8f05b2c..0af8ffb64 100644 --- a/features/gui/autofill.lua +++ b/features/gui/autofill.lua @@ -7,8 +7,8 @@ local Color = require 'resources.color_presets' local enabled_style = 'working_weapon_button' local disabled_style = 'not_working_weapon_button' -local style_map = {[true] = enabled_style, [false] = disabled_style} -local enabled_locale_map = {[true] = {'common.enabled'}, [false] = {'common.disabled'}} +local style_map = { [true] = enabled_style, [false] = disabled_style } +local enabled_locale_map = { [true] = { 'common.enabled' }, [false] = { 'common.disabled' } } local main_button_name = Gui.uid_name() local main_frame_name = Gui.uid_name() @@ -26,7 +26,7 @@ local function player_created(event) type = 'sprite-button', name = main_button_name, sprite = 'item/piercing-rounds-magazine', - tooltip = {'autofill.main_button_tooltip'}, + tooltip = { 'autofill.main_button_tooltip' }, auto_toggle = true, }) end @@ -34,7 +34,7 @@ end local function update_ammo_button(button, name, enabled) local locale_name = Autofill.ammo_locales[name] local style = style_map[enabled] - local tooltip = {'', locale_name, ' ', enabled_locale_map[enabled]} + local tooltip = { '', locale_name, ' ', enabled_locale_map[enabled] } button.style = style button.tooltip = tooltip @@ -50,37 +50,43 @@ local function toggle_main_frame(event) local main_button = Gui.get_top_element(player, main_button_name) main_button.toggled = false else - frame = Gui.add_left_element(player, { type = 'frame', name = main_frame_name, caption = {'autofill.frame_name'}, direction = 'vertical' }) + frame = Gui.add_left_element(player, { type = 'frame', name = main_frame_name, caption = { 'autofill.frame_name' }, direction = 'vertical' }) + Gui.set_style(frame, { width = 376 }) - local enabled_checkbox = - frame.add { + local inner = frame.add { type = 'frame', style = 'inside_shallow_frame', direction = 'vertical' } + Gui.set_style(inner, { padding = 8 }) + + local enabled_checkbox = inner.add { type = 'checkbox', name = enabled_checkbox_name, - caption = {'autofill.enable'}, - state = Autofill.get_enabled(player_index) + caption = { 'autofill.enable' }, + state = Autofill.get_enabled(player_index), } - local ammo_count_flow = frame.add {type = 'flow', direction = 'horizontal'} - local ammo_count_label = ammo_count_flow.add {type = 'label', caption = {'autofill.ammo_count'}} - local ammo_count_textfield = - ammo_count_flow.add { + local ammo_count_flow = inner.add { type = 'flow', direction = 'horizontal' } + local ammo_count_label = ammo_count_flow.add { type = 'label', caption = { 'autofill.ammo_count' } } + Gui.set_style(ammo_count_label, { minimal_width = 140 }) + local ammo_count_textfield = ammo_count_flow.add { type = 'textfield', name = ammo_count_name, - text = tostring(Autofill.get_ammo_count(player_index)) + text = tostring(Autofill.get_ammo_count(player_index)), + numeric = true, + allow_decimal = false, + allow_negative = false, } - local enabled_ammos_flow = frame.add {type = 'flow', direction = 'horizontal'} - enabled_ammos_flow.add {type = 'label', caption = {'autofill.enabled_ammos'}} + local enabled_ammos_flow = inner.add { type = 'flow', direction = 'horizontal' } + local enabled_ammos_label = enabled_ammos_flow.add { type = 'label', caption = { 'autofill.enabled_ammos' } } + Gui.set_style(enabled_ammos_label, { minimal_width = 140 }) + + local grid = enabled_ammos_flow.add { type = 'scroll-pane', style = 'deep_slots_scroll_pane' }.add { type = 'table', column_count = 5, style = 'filter_slot_table' } for name, enabled in pairs(Autofill.get_player_ammos(player_index)) do - local button = - enabled_ammos_flow.add({type = 'flow'}).add( - { - type = 'sprite-button', - name = enabled_ammo_button, - sprite = 'item/' .. name - } - ) + local button = grid.add({ type = 'flow' }).add({ + type = 'sprite-button', + name = enabled_ammo_button, + sprite = 'item/' .. name, + }) update_ammo_button(button, name, enabled) Gui.set_data(button, name) @@ -91,7 +97,7 @@ local function toggle_main_frame(event) local data = { enabled_checkbox = enabled_checkbox, ammo_count_label = ammo_count_label, - ammo_count_textfield = ammo_count_textfield + ammo_count_textfield = ammo_count_textfield, } Gui.set_data(frame, data) @@ -112,7 +118,7 @@ local function set_ammo_count_elements_validation(textfield, label, valid) else color = Color.red label_color = Color.red - tooltip = {'autofill.invalid_ammo_count'} + tooltip = { 'autofill.invalid_ammo_count' } end textfield.style.font_color = color diff --git a/features/gui/paint.lua b/features/gui/paint.lua index 115aa1b89..247475930 100644 --- a/features/gui/paint.lua +++ b/features/gui/paint.lua @@ -7,21 +7,21 @@ local default_fallback_hidden_tile = 'dirt-6' local brush_tools = { ['refined-concrete'] = true, - ['refined-hazard-concrete'] = true + ['refined-hazard-concrete'] = true, } local valid_filters = { - ['acid-refined-concrete'] = true, - ['black-refined-concrete'] = true, - ['blue-refined-concrete'] = true, - ['brown-refined-concrete'] = true, - ['cyan-refined-concrete'] = true, - ['green-refined-concrete'] = true, + ['acid-refined-concrete'] = true, + ['black-refined-concrete'] = true, + ['blue-refined-concrete'] = true, + ['brown-refined-concrete'] = true, + ['cyan-refined-concrete'] = true, + ['green-refined-concrete'] = true, ['orange-refined-concrete'] = true, - ['pink-refined-concrete'] = true, + ['pink-refined-concrete'] = true, ['purple-refined-concrete'] = true, - ['red-refined-concrete'] = true, - ['yellow-refined-concrete'] = true + ['red-refined-concrete'] = true, + ['yellow-refined-concrete'] = true, } local main_button_name = Gui.uid_name() @@ -35,14 +35,11 @@ local filter_table_close_button_name = Gui.uid_name() local paint_brushes_by_player = {} -Global.register( - { - paint_brushes_by_player = paint_brushes_by_player - }, - function(tbl) - paint_brushes_by_player = tbl.paint_brushes_by_player - end -) +Global.register({ + paint_brushes_by_player = paint_brushes_by_player, +}, function(tbl) + paint_brushes_by_player = tbl.paint_brushes_by_player +end) local function refund_tiles(player, tiles) local count = 0 @@ -57,7 +54,7 @@ local function refund_tiles(player, tiles) end if count > 0 then - player.insert {name = 'refined-concrete', count = count} + player.insert { name = 'refined-concrete', count = count } end end @@ -119,7 +116,7 @@ local function player_build_tile(event) end if valid_filters[hidden_tile] then - hidden_tiles[#hidden_tiles + 1] = {position = tile_data.position, name = fallback_tile} + hidden_tiles[#hidden_tiles + 1] = { position = tile_data.position, name = fallback_tile } end ::continue:: @@ -134,11 +131,11 @@ local function player_build_tile(event) end if count > 0 then - player.insert {name = item_name, count = count} + player.insert { name = item_name, count = count } end if print_no_landfill_message then - player.print({'paint.no_place_landfill'}) + player.print({ 'paint.no_place_landfill' }) end end @@ -166,7 +163,7 @@ local function robot_built_tile(event) local hidden_tile = surface.get_hidden_tile(tile_data.position) if valid_filters[hidden_tile] then - hidden_tiles[#hidden_tiles + 1] = {position = tile_data.position, name = fallback_tile} + hidden_tiles[#hidden_tiles + 1] = { position = tile_data.position, name = fallback_tile } end end @@ -193,15 +190,13 @@ local function player_created(event) return end - local b = Gui.add_top_element(player, - { - name = main_button_name, - type = 'sprite-button', - sprite = 'utility/spray_icon', - tooltip = {'paint.tooltip'}, - auto_toggle = true, - } - ) + local b = Gui.add_top_element(player, { + name = main_button_name, + type = 'sprite-button', + sprite = 'utility/spray_icon', + tooltip = { 'paint.tooltip' }, + auto_toggle = true, + }) b.style.padding = 2 end @@ -216,27 +211,34 @@ local function draw_filters_table(event) return end - local frame = - center.add {type = 'frame', name = filters_table_name, direction = 'vertical', caption = {'paint.palette'}} + local frame = center.add { + type = 'frame', + name = filters_table_name, + direction = 'vertical', + caption = { 'paint.palette' }, + style = 'non_draggable_frame', + } - local t = frame.add {type = 'table', column_count = 6} - t.style.horizontal_spacing = 0 - t.style.vertical_spacing = 0 + local inner = frame.add { type = 'frame', style = 'inside_deep_frame' }.add { type = 'frame', style = 'filter_frame' }.add { type = 'scroll-pane', style = 'deep_slots_scroll_pane' } + + Gui.set_style(inner.parent, { natural_height = 0 }) + + local t = inner.add { type = 'table', column_count = 6, style = 'filter_slot_table' } + Gui.set_style(t, { bottom_padding = 8 }) for tile_name, _ in pairs(valid_filters) do - local flow = t.add {type = 'flow'} - local button = - flow.add { + local flow = t.add { type = 'flow' } + local button = flow.add { type = 'sprite-button', name = filter_element_name, sprite = 'tile/' .. tile_name, - tooltip = get_tile_localised_name(tile_name) + tooltip = get_tile_localised_name(tile_name), } - Gui.set_data(button, {frame = frame, tile_name = tile_name}) + Gui.set_data(button, { frame = frame, tile_name = tile_name }) button.style = 'slot_button' end - local flow = frame.add {type = 'flow'} + local flow = frame.add { type = 'flow' } local close_button = Gui.make_close_button(flow, filter_table_close_button_name) Gui.set_data(close_button, frame) @@ -255,106 +257,90 @@ local function toggle(event) local main_button = Gui.get_top_element(player, main_button_name) main_button.toggled = false else - main_frame = Gui.add_left_element(player, { + main_frame = Gui.add_left_element(player, { type = 'frame', name = main_frame_name, direction = 'vertical', - caption = {'paint.frame_name'} + caption = { 'paint.frame_name' }, }) + Gui.set_style(main_frame, { width = 370 }) + + local inner_frame = main_frame.add { type = 'frame', style = 'inside_shallow_frame', name = 'inner' } + Gui.set_style(inner_frame, { padding = 8 }) - local top_flow = main_frame.add {type = 'flow', direction = 'horizontal'} + local top_flow = inner_frame.add { type = 'flow', direction = 'horizontal' } local tile_name = paint_brushes_by_player[event.player_index] - local brush = - top_flow.add({type = 'flow'}).add { + local brush = top_flow.add({ type = 'flow' }).add { type = 'sprite-button', + style = 'slot_button_in_shallow_frame', name = filter_button_name, - tooltip = get_tile_localised_name(tile_name) or {'paint.select_brush'}, - sprite = tile_name and 'tile/' .. tile_name + tooltip = get_tile_localised_name(tile_name) or { 'paint.select_brush' }, + sprite = tile_name and 'tile/' .. tile_name, } - brush.style = 'slot_button' - local label = top_flow.add {type = 'label', caption = {'paint.instructions'}} - local label_style = label.style - label_style.font = 'default-bold' - label_style.single_line = false - label_style.left_padding = 10 + local label = top_flow.add { type = 'label', caption = { 'paint.instructions' } } + Gui.set_style(label, { font = 'default-bold', single_line = false, left_padding = 10 }) - local buttons_flow = main_frame.add {type = 'flow', direction = 'horizontal'} + local buttons_flow = main_frame.add { type = 'flow', direction = 'horizontal' } Gui.make_close_button(buttons_flow, main_button_name) - local clear_brush = - buttons_flow.add {type = 'button', name = filter_clear_name, caption = {'paint.clear_brush'}} + local clear_brush = buttons_flow.add { type = 'button', name = filter_clear_name, caption = { 'paint.clear_brush' } } Gui.set_data(clear_brush, brush) end end Gui.on_click(main_button_name, toggle) -Gui.on_click( - filter_button_name, - function(event) - if event.button == defines.mouse_button_type.right then - paint_brushes_by_player[event.player_index] = nil - local element = event.element - element.sprite = 'utility/pump_cannot_connect_icon' - element.tooltip = {'paint.select_brush'} - else - draw_filters_table(event) - end +Gui.on_click(filter_button_name, function(event) + if event.button == defines.mouse_button_type.right then + paint_brushes_by_player[event.player_index] = nil + local element = event.element + element.sprite = 'utility/pump_cannot_connect_icon' + element.tooltip = { 'paint.select_brush' } + else + draw_filters_table(event) end -) +end) -Gui.on_click( - filter_clear_name, - function(event) - local brush = Gui.get_data(event.element) +Gui.on_click(filter_clear_name, function(event) + local brush = Gui.get_data(event.element) - brush.sprite = 'utility/pump_cannot_connect_icon' - brush.tooltip = {'paint.select_brush'} + brush.sprite = 'utility/pump_cannot_connect_icon' + brush.tooltip = { 'paint.select_brush' } - paint_brushes_by_player[event.player_index] = nil - end -) + paint_brushes_by_player[event.player_index] = nil +end) -Gui.on_click( - filter_element_name, - function(event) - local element = event.element - if not element or not element.valid then - return - end +Gui.on_click(filter_element_name, function(event) + local element = event.element + if not element or not element.valid then + return + end - local data = Gui.get_data(element) - local frame = data.frame - local tile_name = data.tile_name - local filter_button = Gui.get_data(frame) + local data = Gui.get_data(element) + local frame = data.frame + local tile_name = data.tile_name + local filter_button = Gui.get_data(frame) - paint_brushes_by_player[event.player_index] = tile_name - filter_button.sprite = element.sprite - filter_button.tooltip = element.tooltip + paint_brushes_by_player[event.player_index] = tile_name + filter_button.sprite = element.sprite + filter_button.tooltip = element.tooltip - Gui.destroy(frame) - end -) + Gui.destroy(frame) +end) -Gui.on_click( - filter_table_close_button_name, - function(event) - local frame = Gui.get_data(event.element) - Gui.destroy(frame) - end -) +Gui.on_click(filter_table_close_button_name, function(event) + local frame = Gui.get_data(event.element) + Gui.destroy(frame) +end) -Gui.on_custom_close( - filters_table_name, - function(event) - local element = event.element - Gui.destroy(element) - end -) +Gui.on_custom_close(filters_table_name, function(event) + local element = event.element + Gui.destroy(element) +end) Gui.allow_player_to_toggle_top_element_visibility(main_button_name) diff --git a/features/gui/player_list.lua b/features/gui/player_list.lua index 4b39137fb..3df756dc1 100644 --- a/features/gui/player_list.lua +++ b/features/gui/player_list.lua @@ -625,7 +625,7 @@ end local function draw_main_frame(left, player) local player_index = player.index - local frame = left.add {type = 'frame', name = main_frame_name, direction = 'vertical'} + local frame = left.add {type = 'frame', name = main_frame_name, direction = 'vertical', style = 'non_draggable_frame'} local heading_table_flow = frame.add {type = 'flow'} diff --git a/features/gui/poll.lua b/features/gui/poll.lua index f604c7ffe..cb50207f7 100644 --- a/features/gui/poll.lua +++ b/features/gui/poll.lua @@ -24,36 +24,33 @@ local tick_duration_step = duration_step * 60 local inv_tick_duration_step = 1 / tick_duration_step local normal_color = Color.white -local focus_color = Color.dark_orange +local focus_color = Color.orange local notify_name = 'notify_poll' Settings.register(notify_name, Settings.types.boolean, true, 'poll.notify_caption_short') local polls = {} -local polls_counter = {0} +local polls_counter = { 0 } local active_polls = {} local no_notify_players = {} local player_poll_index = {} local player_create_poll_data = {} -Global.register( - { - polls = polls, - polls_counter = polls_counter, - active_polls = active_polls, - no_notify_players = no_notify_players, - player_poll_index = player_poll_index, - player_create_poll_data = player_create_poll_data - }, - function(tbl) - polls = tbl.polls - polls_counter = tbl.polls_counter - active_polls = tbl.active_polls - no_notify_players = tbl.no_notify_players - player_poll_index = tbl.player_poll_index - player_create_poll_data = tbl.player_create_poll_data - end -) +Global.register({ + polls = polls, + polls_counter = polls_counter, + active_polls = active_polls, + no_notify_players = no_notify_players, + player_poll_index = player_poll_index, + player_create_poll_data = player_create_poll_data, +}, function(tbl) + polls = tbl.polls + polls_counter = tbl.polls_counter + active_polls = tbl.active_polls + no_notify_players = tbl.no_notify_players + player_poll_index = tbl.player_poll_index + player_create_poll_data = tbl.player_create_poll_data +end) local main_button_name = Gui.uid_name() local main_frame_name = Gui.uid_name() @@ -78,47 +75,54 @@ local create_poll_edit_name = Gui.uid_name() local create_poll_confirm_name = Gui.uid_name() local create_poll_delete_name = Gui.uid_name() +local STYLES = { + x26 = { + size = 26, + }, + default_button = { + font = 'default-semibold', + height = 26, + minimal_width = 26, + top_padding = 0, + bottom_padding = 0, + left_padding = 2, + right_padding = 2, + font_color = { 0, 0, 0 }, + }, + direction_button = { + width = 24, + height = 24, + top_padding = 0, + bottom_padding = 0, + left_padding = 0, + right_padding = 0, + font = 'default-listbox', + }, + vote_button = { + height = 24, + width = 26, + padding = 0, + } +} + local function poll_id() local count = polls_counter[1] + 1 polls_counter[1] = count return count end -local function apply_direction_button_style(button) - local button_style = button.style - button_style.width = 24 - button_style.height = 24 - button_style.top_padding = 0 - button_style.bottom_padding = 0 - button_style.left_padding = 0 - button_style.right_padding = 0 - button_style.font = 'default-listbox' -end - -local function apply_button_style(button) - local button_style = button.style - button_style.font = 'default-semibold' - button_style.height = 26 - button_style.minimal_width = 26 - button_style.top_padding = 0 - button_style.bottom_padding = 0 - button_style.left_padding = 2 - button_style.right_padding = 2 - button_style.font_color = {0, 0, 0} -end - local function get_active_and_remaning_time(poll) local end_tick = poll.end_tick if end_tick == -1 then - return true, 'Endless Poll.' + return true, 'Endless poll' end local ticks = end_tick - game.tick if ticks < 0 then - return false, 'Poll Finished.' + return false, 'Poll finished.' else local include_seconds = ticks < ticks_in_hour - return true, 'End Time: ' .. Core.format_time(ticks, include_seconds) + return true, 'End time: ' .. Core.format_time(ticks, include_seconds) end end @@ -140,7 +144,7 @@ end local function send_poll_result_to_discord(poll) local _, remaning_time_message = get_active_and_remaning_time(poll) - local result = {'Poll #', poll.id, ' ', remaning_time_message, '\\n'} + local result = { 'Poll #', poll.id, ' ', remaning_time_message, '\\n' } local created_by_player = poll.created_by if created_by_player and created_by_player.valid then @@ -220,70 +224,65 @@ local function redraw_poll_viewer_content(data) local created_by_player = poll.created_by local created_by_text if created_by_player and created_by_player.valid then - created_by_text = ' Created by ' .. created_by_player.name + created_by_text = ' Created by: [color=yellow][font=count-font]' .. created_by_player.name .. '[/font][/color]' else created_by_text = '' end - local top_flow = poll_viewer_content.add {type = 'flow', direction = 'vertical'} - top_flow.add {type = 'label', caption = table.concat {'Poll #', poll.id, created_by_text}} + local top_flow = poll_viewer_content.add { type = 'flow', direction = 'vertical' } + top_flow.add { type = 'label', caption = table.concat { 'Poll #', poll.id, created_by_text } } local edited_by_players = poll.edited_by if next(edited_by_players) then - local edit_names = {'Edited by '} + local edit_names = { 'Edited by: [color=yellow][font=count-font]' } for pi, _ in pairs(edited_by_players) do local p = game.get_player(pi) if p and p.valid then insert(edit_names, p.name) - insert(edit_names, ', ') + insert(edit_names, '[color=white],[/color] ') end end table.remove(edit_names) + table.insert(edit_names, '[/font][/color]') local edit_text = table.concat(edit_names) - local top_flow_label = top_flow.add {type = 'label', caption = edit_text, tooltip = edit_text} - top_flow_label.style.single_line = false - top_flow_label.style.horizontally_stretchable = false + local top_flow_label = top_flow.add { type = 'label', caption = edit_text, tooltip = edit_text } + Gui.set_style(top_flow_label, { single_line = false, horizontally_stretchable = false }) end local poll_enabled = do_remaining_time(poll, remaining_time_label) - local question_flow = poll_viewer_content.add {type = 'table', column_count = 2} + local question_flow = poll_viewer_content.add { type = 'table', column_count = 2 } local edit_rank = poll.edit_rank or Ranks.regular if Rank.equal_or_greater_than(player.name, edit_rank) then - local edit_button = - question_flow.add { + local edit_button = question_flow.add { type = 'sprite-button', name = poll_view_edit_name, sprite = 'utility/rename_icon', - tooltip = 'Edit Poll.' + tooltip = 'Edit poll', + style = 'green_button', } - - local edit_button_style = edit_button.style - edit_button_style.width = 26 - edit_button_style.height = 26 + Gui.set_style(edit_button, STYLES.x26) + Gui.set_style(edit_button, { padding = 2 }) end - local question_label = question_flow.add {type = 'label', caption = poll.question} - local question_label_style = question_label.style - question_label_style.font_color = focus_color - question_label_style.single_line = false - question_label_style.font = 'default-listbox' + local question_label = question_flow.add { type = 'label', caption = poll.question, style = 'control_input_shortcut_label' } + Gui.set_style(question_label, { single_line = false }) - local grid = poll_viewer_content.add {type = 'table', column_count = 2} + local grid = poll_viewer_content.add { type = 'table', column_count = 2 } local answer = voters[player.index] local vote_buttons = {} for i, a in pairs(answers) do - local vote_button_flow = grid.add {type = 'flow'} - local vote_button = - vote_button_flow.add { + local vote_button_flow = grid.add { type = 'flow' } + local vote_button = vote_button_flow.add { type = 'button', name = poll_view_vote_name, caption = a.voted_count, - enabled = poll_enabled + enabled = poll_enabled, + style = 'frame_button', } local tooltip = tooltips[a] @@ -292,14 +291,7 @@ local function redraw_poll_viewer_content(data) end local vote_button_style = vote_button.style - vote_button_style.height = 24 - vote_button_style.width = 26 - vote_button_style.font = 'default-small' - vote_button_style.top_padding = 0 - vote_button_style.bottom_padding = 0 - vote_button_style.left_padding = 0 - vote_button_style.right_padding = 0 - + Gui.set_style(vote_button, STYLES.vote_button) if answer == a then vote_button_style.font_color = focus_color vote_button_style.disabled_font_color = focus_color @@ -308,11 +300,11 @@ local function redraw_poll_viewer_content(data) vote_button_style.disabled_font_color = normal_color end - Gui.set_data(vote_button, {answer = a, data = data}) + Gui.set_data(vote_button, { answer = a, data = data }) vote_buttons[i] = vote_button - local label = grid.add {type = 'label', caption = a.text} - label.style.single_line = false + local label = grid.add { type = 'label', caption = a.text } + Gui.set_style(label, { single_line = false }) end data.vote_buttons = vote_buttons @@ -333,9 +325,9 @@ local function update_poll_viewer(data) data.poll_index = poll_index if poll_index == 0 then - poll_index_label.caption = 'No Polls' + poll_index_label.caption = 'No polls' else - poll_index_label.caption = table.concat {'Poll ', poll_index, ' / ', #polls} + poll_index_label.caption = table.concat { 'Poll ', poll_index, ' / ', #polls } end back_button.enabled = poll_index > 1 @@ -345,29 +337,31 @@ local function update_poll_viewer(data) end local function draw_main_frame(left, player) - local frame = left.add {type = 'frame', name = main_frame_name, caption = 'Polls', direction = 'vertical'} - frame.style.maximal_width = 360 + local frame = left.add { type = 'frame', name = main_frame_name, caption = 'Polls', direction = 'vertical', style = 'non_draggable_frame' } + Gui.set_style(frame, { width = 400 }) + + local inner = frame.add { type = 'frame', style = 'inside_shallow_frame', direction = 'vertical' } + Gui.set_style(inner, { padding = 8 }) - local poll_viewer_top_flow = frame.add {type = 'table', column_count = 5} - poll_viewer_top_flow.style.horizontal_spacing = 0 + local poll_viewer_top_flow = inner.add { type = 'table', column_count = 5 } + Gui.set_style(poll_viewer_top_flow, { horizontal_spacing = 0 }) - local back_button = poll_viewer_top_flow.add {type = 'button', name = poll_view_back_name, caption = '◀'} - apply_direction_button_style(back_button) + local back_button = poll_viewer_top_flow.add { type = 'button', name = poll_view_back_name, caption = '◀' } + Gui.set_style(back_button, STYLES.direction_button) - local forward_button = poll_viewer_top_flow.add {type = 'button', name = poll_view_forward_name, caption = '▶'} - apply_direction_button_style(forward_button) + local forward_button = poll_viewer_top_flow.add { type = 'button', name = poll_view_forward_name, caption = '▶' } + Gui.set_style(forward_button, STYLES.direction_button) - local poll_index_label = poll_viewer_top_flow.add {type = 'label'} - poll_index_label.style.left_padding = 8 + local poll_index_label = poll_viewer_top_flow.add { type = 'label' } + Gui.set_style(poll_index_label, { left_padding = 8 }) - local spacer = poll_viewer_top_flow.add {type = 'flow'} - spacer.style.horizontally_stretchable = true + local spacer = poll_viewer_top_flow.add { type = 'flow' } + Gui.set_style(spacer, { horizontally_stretchable = true}) - local remaining_time_label = poll_viewer_top_flow.add {type = 'label'} + local remaining_time_label = poll_viewer_top_flow.add { type = 'label' } - local poll_viewer_content = frame.add {type = 'scroll-pane'} - poll_viewer_content.style.maximal_height = 250 - poll_viewer_content.style.width = 340 + local poll_viewer_content = inner.add { type = 'scroll-pane' } + Gui.set_style(poll_viewer_content, { maximal_height = 250, width = 340 }) local poll_index = player_poll_index[player.index] or #polls @@ -378,7 +372,7 @@ local function draw_main_frame(left, player) poll_viewer_content = poll_viewer_content, remaining_time_label = remaining_time_label, poll_index = poll_index, - notify_checkbox = nil + notify_checkbox = nil, } Gui.set_data(frame, data) @@ -388,47 +382,42 @@ local function draw_main_frame(left, player) update_poll_viewer(data) local state = Settings.get(player.index, notify_name) - local notify_checkbox = - frame.add { + local notify_checkbox = frame.add { type = 'checkbox', name = notify_checkbox_name, state = state, - caption = {'poll.notify_caption'}, - tooltip = {'poll.notify_tooltip'} + caption = { 'poll.notify_caption' }, + tooltip = { 'poll.notify_tooltip' }, } data.notify_checkbox = notify_checkbox - local bottom_flow = frame.add {type = 'flow', direction = 'horizontal'} + local bottom_flow = frame.add { type = 'flow', direction = 'horizontal' } - local left_flow = bottom_flow.add {type = 'flow'} - left_flow.style.horizontal_align = 'left' - left_flow.style.horizontally_stretchable = true + local left_flow = bottom_flow.add { type = 'flow' } + Gui.set_style(left_flow, { horizontal_align = 'left', horizontally_stretchable = true }) - local close_button = - left_flow.add { + local close_button = left_flow.add { type = 'button', name = main_button_name, - caption = {'common.close_button'}, - style = 'back_button' + caption = { 'common.close_button' }, + style = 'back_button', } - apply_button_style(close_button) + Gui.set_style(close_button, STYLES.default_button) - local right_flow = bottom_flow.add {type = 'flow'} - right_flow.style.horizontal_align = 'right' + local right_flow = bottom_flow.add { type = 'flow' } + Gui.set_style(right_flow, { horizontal_align = 'right' }) if Rank.equal_or_greater_than(player.name, Ranks.regular) then - local create_poll_button = - right_flow.add {type = 'button', name = create_poll_button_name, caption = 'Create Poll'} - apply_button_style(create_poll_button) + local create_poll_button = right_flow.add { type = 'button', name = create_poll_button_name, caption = 'Create poll' } + Gui.set_style(create_poll_button, STYLES.default_button) else - local create_poll_button = - right_flow.add { + local create_poll_button = right_flow.add { type = 'button', - caption = 'Create Poll', + caption = 'Create poll', enabled = false, - tooltip = 'Sorry, you need to be a regular to create polls.' + tooltip = 'Sorry, you need to be a regular to create polls.', } - apply_button_style(create_poll_button) + Gui.set_style(create_poll_button, STYLES.default_button) end end @@ -480,7 +469,7 @@ local function update_duration(slider) slider_data.data.duration = value * tick_duration_step if value == 0 then - label.caption = 'Endless Poll.' + label.caption = 'Endless poll' else local seconds = value * duration_step local include_seconds = seconds < 3600 @@ -495,79 +484,73 @@ local function redraw_create_poll_content(data) Gui.remove_data_recursively(grid) grid.clear() - grid.add {type = 'flow'} + grid.add { type = 'flow' } grid.add { type = 'label', - caption = 'Duration:', - tooltip = 'Pro tip: Use mouse wheel for more fine control.' + caption = 'Duration: [img=info]', + tooltip = 'Pro tip: use mouse wheel for more fine control', } - local duration_flow = grid.add {type = 'flow', direction = 'horizontal'} - local duration_slider = - duration_flow.add { + local duration_flow = grid.add { type = 'flow', direction = 'horizontal' } + local duration_slider = duration_flow.add { type = 'slider', name = create_poll_duration_name, minimum_value = 0, maximum_value = duration_slider_max, - value = math.floor(data.duration * inv_tick_duration_step) + value = math.floor(data.duration * inv_tick_duration_step), } - duration_slider.style.width = 80 + Gui.set_style(duration_slider, { width = 80 }) data.duration_slider = duration_slider - local duration_label = duration_flow.add {type = 'label'} + local duration_label = duration_flow.add { type = 'label' } - Gui.set_data(duration_slider, {duration_label = duration_label, data = data}) + Gui.set_data(duration_slider, { duration_label = duration_label, data = data }) update_duration(duration_slider) - grid.add {type = 'flow'} - local question_label = - grid.add({type = 'flow'}).add {type = 'label', name = create_poll_label_name, caption = 'Question:'} + grid.add { type = 'flow' } + local question_label = grid.add({ type = 'flow' }).add { type = 'label', name = create_poll_label_name, caption = 'Question:' } - local question_textfield = - grid.add({type = 'flow'}).add {type = 'textfield', name = create_poll_question_name, text = data.question} - question_textfield.style.width = 215 + local question_textfield = grid.add({ type = 'flow' }).add { type = 'textfield', name = create_poll_question_name, text = data.question } + Gui.set_style(question_textfield, { width = 215 }) Gui.set_data(question_label, question_textfield) Gui.set_data(question_textfield, data) local edit_mode = data.edit_mode for count, answer in pairs(answers) do - local delete_flow = grid.add {type = 'flow'} + local delete_flow = grid.add { type = 'flow' } local delete_button if edit_mode or count ~= 1 then - delete_button = - delete_flow.add { + delete_button = delete_flow.add { type = 'sprite-button', name = create_poll_delete_answer_name, sprite = 'utility/trash', - tooltip = 'Delete answer field.' + tooltip = 'Delete answer field', + style = 'tool_button_red', } - delete_button.style.height = 26 - delete_button.style.width = 26 + Gui.set_style(delete_button, STYLES.x26) else - delete_flow.style.height = 26 - delete_flow.style.width = 26 + Gui.set_style(delete_flow, STYLES.x26) end - local label_flow = grid.add {type = 'flow'} - local label = - label_flow.add { + local label_flow = grid.add { type = 'flow' } + local label = label_flow.add { type = 'label', name = create_poll_label_name, - caption = table.concat {'Answer #', count, ':'} + caption = table.concat { 'Answer #', count, ':' }, } - local textfield_flow = grid.add {type = 'flow'} + local textfield_flow = grid.add { type = 'flow' } - local textfield = textfield_flow.add {type = 'textfield', name = create_poll_answer_name, text = answer.text} - textfield.style.width = 215 - Gui.set_data(textfield, {answers = answers, count = count}) + local textfield = textfield_flow.add { type = 'textfield', name = create_poll_answer_name, text = answer.text } + Gui.set_style(textfield, { width = 215 }) + Gui.set_data(textfield, { answers = answers, count = count }) if delete_button then - Gui.set_data(delete_button, {data = data, count = count}) + Gui.set_data(delete_button, { data = data, count = count }) end Gui.set_data(label, textfield) @@ -591,35 +574,33 @@ local function draw_create_poll_frame(parent, player, previous_data) answers = {} for i, a in pairs(previous_data.answers) do - answers[i] = {text = a.text, source = a} + answers[i] = { text = a.text, source = a } end duration = previous_data.duration else question = '' - answers = {{text = ''}, {text = ''}, {text = ''}} + answers = { { text = '' }, { text = '' }, { text = '' } } duration = default_poll_duration end if edit_mode then - title_text = 'Edit Poll #' .. previous_data.id - confirm_text = 'Edit Poll' + title_text = 'Edit poll #' .. previous_data.id + confirm_text = 'Edit poll' confirm_name = create_poll_edit_name else - title_text = 'New Poll' - confirm_text = 'Create Poll' + title_text = 'New poll' + confirm_text = 'Create poll' confirm_name = create_poll_confirm_name end - local frame = - parent.add {type = 'frame', name = create_poll_frame_name, caption = title_text, direction = 'vertical'} - frame.style.maximal_width = 360 + local frame = parent.add { type = 'frame', name = create_poll_frame_name, caption = title_text, direction = 'vertical' } + Gui.set_style(frame, { maximal_width = 400 }) - local scroll_pane = frame.add {type = 'scroll-pane', vertical_scroll_policy = 'always'} - scroll_pane.style.maximal_height = 250 - scroll_pane.style.width = 340 + local scroll_pane = frame.add { type = 'scroll-pane', vertical_scroll_policy = 'always', style = 'notice_scroll_pane', horizontal_scroll_policy = 'never' } + Gui.set_style(scroll_pane, { maximal_height = 250, width = 360, padding = 4 }) - local grid = scroll_pane.add {type = 'table', column_count = 3} + local grid = scroll_pane.add { type = 'table', column_count = 3 } local data = { frame = frame, @@ -628,60 +609,57 @@ local function draw_create_poll_frame(parent, player, previous_data) answers = answers, duration = duration, previous_data = previous_data, - edit_mode = edit_mode + edit_mode = edit_mode, } Gui.set_data(frame, data) redraw_create_poll_content(data) - local add_answer_button = - scroll_pane.add { - type = 'button', + local add_answer_button = scroll_pane.add { + type = 'sprite-button', name = create_poll_add_answer_name, - caption = 'Add Answer' + sprite = 'utility/add', + style = 'green_button', + tooltip = 'Add answer', } - apply_button_style(add_answer_button) + Gui.set_style(add_answer_button, STYLES.default_button) Gui.set_data(add_answer_button, data) - local bottom_flow = frame.add {type = 'flow', direction = 'horizontal'} + local bottom_flow = frame.add { type = 'flow', direction = 'horizontal' } - local left_flow = bottom_flow.add {type = 'flow'} - left_flow.style.horizontal_align = 'left' - left_flow.style.horizontally_stretchable = true + local left_flow = bottom_flow.add { type = 'flow' } + Gui.set_style(left_flow, { horizontal_align = 'left', horizontally_stretchable = true }) - local close_button = - left_flow.add { + local close_button = left_flow.add { type = 'button', name = create_poll_close_name, - caption = {'common.close_button'}, - style = 'back_button' + caption = { 'common.close_button' }, + style = 'back_button', } - apply_button_style(close_button) + Gui.set_style(close_button, STYLES.default_button) Gui.set_data(close_button, frame) - local clear_button = left_flow.add {type = 'button', name = create_poll_clear_name, caption = 'Clear'} - apply_button_style(clear_button) + local clear_button = left_flow.add { type = 'button', name = create_poll_clear_name, caption = 'Clear' } + Gui.set_style(clear_button, STYLES.default_button) Gui.set_data(clear_button, data) - local right_flow = bottom_flow.add {type = 'flow'} - right_flow.style.horizontal_align = 'right' + local right_flow = bottom_flow.add { type = 'flow' } + Gui.set_style(right_flow, { horizontal_align = 'right' }) if edit_mode then - local delete_button = - right_flow.add {type = 'button', name = create_poll_delete_name, caption = {'common.delete'}} - apply_button_style(delete_button) + local delete_button = right_flow.add { type = 'button', name = create_poll_delete_name, caption = { 'common.delete' } } + Gui.set_style(delete_button, STYLES.default_button) Gui.set_data(delete_button, data) end - local confirm_button = right_flow.add {type = 'button', name = confirm_name, caption = confirm_text} - apply_button_style(confirm_button) + local confirm_button = right_flow.add { type = 'button', name = confirm_name, caption = confirm_text } + Gui.set_style(confirm_button, STYLES.default_button) Gui.set_data(confirm_button, data) end local function show_new_poll(poll_data) - local message = - table.concat {poll_data.created_by.name, ' has created a new Poll #', poll_data.id, ': ', poll_data.question} + local message = table.concat { poll_data.created_by.name, ' has created a new poll #', poll_data.id, ': ', poll_data.question } for _, p in pairs(game.connected_players) do local left = Gui.get_left_flow(p) @@ -723,7 +701,7 @@ local function create_poll(event) local text = a.text if text:find('%S') then local index = #answers + 1 - answers[index] = {text = text, index = index, voted_count = 0} + answers[index] = { text = text, index = index, voted_count = 0 } end end @@ -754,7 +732,7 @@ local function create_poll(event) duration = duration, created_by = event.player, edited_by = {}, - edit_rank = nil + edit_rank = nil, } insert(polls, poll_data) @@ -851,15 +829,13 @@ local function player_created(event) return end - Gui.add_top_element(player, - { - type = 'sprite-button', - name = main_button_name, - sprite = 'item/programmable-speaker', - tooltip = {'poll.tooltip'}, - auto_toggle = true, - } - ) + Gui.add_top_element(player, { + type = 'sprite-button', + name = main_button_name, + sprite = 'item/programmable-speaker', + tooltip = { 'poll.tooltip' }, + auto_toggle = true, + }) end local function player_joined(event) @@ -909,7 +885,7 @@ local function tick() table.remove(active_polls, i) send_poll_result_to_discord(poll) - local message = table.concat {'Poll finished: Poll #', poll.id, ': ', poll.question} + local message = table.concat { 'Poll finished: poll #', poll.id, ': ', poll.question } for _, p in pairs(game.connected_players) do if not no_notify_players[p.index] then p.print(message) @@ -926,310 +902,271 @@ Event.on_nth_tick(60, tick) Gui.on_click(main_button_name, toggle) -Gui.on_click( - create_poll_button_name, - function(event) - local player = event.player - local left = Gui.get_left_flow(player) - local frame = left[create_poll_frame_name] - if frame and frame.valid then - remove_create_poll_frame(frame, player.index) - else - draw_create_poll_frame(left, player) - end +Gui.on_click(create_poll_button_name, function(event) + local player = event.player + local left = Gui.get_left_flow(player) + local frame = left[create_poll_frame_name] + if frame and frame.valid then + remove_create_poll_frame(frame, player.index) + else + draw_create_poll_frame(left, player) end -) - -Gui.on_click( - poll_view_edit_name, - function(event) - local player = event.player - local left = Gui.get_left_flow(player) - local frame = left[create_poll_frame_name] +end) - if frame and frame.valid then - Gui.remove_data_recursively(frame) - frame.destroy() - end - - local main_frame = left[main_frame_name] - local frame_data = Gui.get_data(main_frame) - local poll = polls[frame_data.poll_index] +Gui.on_click(poll_view_edit_name, function(event) + local player = event.player + local left = Gui.get_left_flow(player) + local frame = left[create_poll_frame_name] - poll.edit_mode = true - draw_create_poll_frame(left, player, poll) + if frame and frame.valid then + Gui.remove_data_recursively(frame) + frame.destroy() end -) -Gui.on_value_changed( - create_poll_duration_name, - function(event) - update_duration(event.element) - end -) + local main_frame = left[main_frame_name] + local frame_data = Gui.get_data(main_frame) + local poll = polls[frame_data.poll_index] -Gui.on_click( - create_poll_delete_answer_name, - function(event) - local button_data = Gui.get_data(event.element) - local data = button_data.data + poll.edit_mode = true + draw_create_poll_frame(left, player, poll) +end) - table.remove(data.answers, button_data.count) - redraw_create_poll_content(data) - end -) +Gui.on_value_changed(create_poll_duration_name, function(event) + update_duration(event.element) +end) -Gui.on_click( - create_poll_label_name, - function(event) - local textfield = Gui.get_data(event.element) - textfield.focus() - end -) +Gui.on_click(create_poll_delete_answer_name, function(event) + local button_data = Gui.get_data(event.element) + local data = button_data.data -Gui.on_text_changed( - create_poll_question_name, - function(event) - local textfield = event.element - local data = Gui.get_data(textfield) + table.remove(data.answers, button_data.count) + redraw_create_poll_content(data) +end) - data.question = textfield.text - end -) +Gui.on_click(create_poll_label_name, function(event) + local textfield = Gui.get_data(event.element) + textfield.focus() +end) -Gui.on_text_changed( - create_poll_answer_name, - function(event) - local textfield = event.element - local data = Gui.get_data(textfield) +Gui.on_text_changed(create_poll_question_name, function(event) + local textfield = event.element + local data = Gui.get_data(textfield) - data.answers[data.count].text = textfield.text - end -) + data.question = textfield.text +end) -Gui.on_click( - create_poll_add_answer_name, - function(event) - local data = Gui.get_data(event.element) +Gui.on_text_changed(create_poll_answer_name, function(event) + local textfield = event.element + local data = Gui.get_data(textfield) - insert(data.answers, {text = ''}) - redraw_create_poll_content(data) - end -) + data.answers[data.count].text = textfield.text +end) -Gui.on_click( - create_poll_close_name, - function(event) - local frame = Gui.get_data(event.element) - remove_create_poll_frame(frame, event.player_index) - end -) +Gui.on_click(create_poll_add_answer_name, function(event) + local data = Gui.get_data(event.element) + + insert(data.answers, { text = '' }) + redraw_create_poll_content(data) +end) -Gui.on_click( - create_poll_clear_name, - function(event) - local data = Gui.get_data(event.element) +Gui.on_click(create_poll_close_name, function(event) + local frame = Gui.get_data(event.element) + remove_create_poll_frame(frame, event.player_index) +end) - local slider = data.duration_slider - slider.slider_value = math.floor(default_poll_duration * inv_tick_duration_step) - update_duration(slider) +Gui.on_click(create_poll_clear_name, function(event) + local data = Gui.get_data(event.element) - data.question = '' + local slider = data.duration_slider + slider.slider_value = math.floor(default_poll_duration * inv_tick_duration_step) + update_duration(slider) - local answers = data.answers - for i = 1, #answers do - answers[i].text = '' - end + data.question = '' - redraw_create_poll_content(data) + local answers = data.answers + for i = 1, #answers do + answers[i].text = '' end -) -Gui.on_click(create_poll_confirm_name, create_poll) + redraw_create_poll_content(data) +end) -Gui.on_click( - create_poll_delete_name, - function(event) - local player = event.player - local data = Gui.get_data(event.element) - local frame = data.frame - local poll = data.previous_data +Gui.on_click(create_poll_confirm_name, create_poll) - Gui.remove_data_recursively(frame) - frame.destroy() +Gui.on_click(create_poll_delete_name, function(event) + local player = event.player + local data = Gui.get_data(event.element) + local frame = data.frame + local poll = data.previous_data - player_create_poll_data[player.index] = nil + Gui.remove_data_recursively(frame) + frame.destroy() - local removed_index - for i, p in pairs(polls) do - if p == poll then - table.remove(polls, i) - table.remove_element(active_polls, p) - removed_index = i - break - end - end + player_create_poll_data[player.index] = nil - if not removed_index then - return + local removed_index + for i, p in pairs(polls) do + if p == poll then + table.remove(polls, i) + table.remove_element(active_polls, p) + removed_index = i + break end + end - local message = table.concat {player.name, ' has deleted Poll #', poll.id, ': ', poll.question} + if not removed_index then + return + end - for _, p in pairs(game.connected_players) do - if not no_notify_players[p.index] then - p.print(message) - end + local message = table.concat { player.name, ' has deleted poll #', poll.id, ': ', poll.question } - local main_frame = Gui.get_left_element(player, main_frame_name) - if main_frame and main_frame.valid then - local main_frame_data = Gui.get_data(main_frame) - local poll_index = main_frame_data.poll_index + for _, p in pairs(game.connected_players) do + if not no_notify_players[p.index] then + p.print(message) + end - if removed_index < poll_index then - main_frame_data.poll_index = poll_index - 1 - end + local main_frame = Gui.get_left_element(player, main_frame_name) + if main_frame and main_frame.valid then + local main_frame_data = Gui.get_data(main_frame) + local poll_index = main_frame_data.poll_index - update_poll_viewer(main_frame_data) + if removed_index < poll_index then + main_frame_data.poll_index = poll_index - 1 end + + update_poll_viewer(main_frame_data) end end -) +end) -Gui.on_click( - create_poll_edit_name, - function(event) - local player = event.player - local data = Gui.get_data(event.element) - local frame = data.frame - local poll = data.previous_data +Gui.on_click(create_poll_edit_name, function(event) + local player = event.player + local data = Gui.get_data(event.element) + local frame = data.frame + local poll = data.previous_data - local new_question = data.question - if not new_question:find('%S') then - player.print('Sorry, the poll needs a question.') - return - end + local new_question = data.question + if not new_question:find('%S') then + player.print('Sorry, the poll needs a question.') + return + end - local new_answer_set = {} - local new_answers = {} - for _, a in pairs(data.answers) do - if a.text:find('%S') then - local source = a.source - local index = #new_answers + 1 - if source then - new_answer_set[source] = a - source.text = a.text - source.index = index - new_answers[index] = source - else - new_answers[index] = {text = a.text, index = index, voted_count = 0} - end + local new_answer_set = {} + local new_answers = {} + for _, a in pairs(data.answers) do + if a.text:find('%S') then + local source = a.source + local index = #new_answers + 1 + if source then + new_answer_set[source] = a + source.text = a.text + source.index = index + new_answers[index] = source + else + new_answers[index] = { text = a.text, index = index, voted_count = 0 } end end + end - if not next(new_answers) then - player.print('Sorry, the poll needs at least one answer.') - return - end + if not next(new_answers) then + player.print('Sorry, the poll needs at least one answer.') + return + end - Gui.remove_data_recursively(frame) - frame.destroy() + Gui.remove_data_recursively(frame) + frame.destroy() - local player_index = player.index + local player_index = player.index - player_create_poll_data[player_index] = nil + player_create_poll_data[player_index] = nil - local old_answers = poll.answers - local voters = poll.voters - for _, a in pairs(old_answers) do - if not new_answer_set[a] then - for pi, a2 in pairs(voters) do - if a == a2 then - voters[pi] = nil - end + local old_answers = poll.answers + local voters = poll.voters + for _, a in pairs(old_answers) do + if not new_answer_set[a] then + for pi, a2 in pairs(voters) do + if a == a2 then + voters[pi] = nil end end end + end - poll.question = new_question - poll.answers = new_answers - poll.edited_by[player_index] = true + poll.question = new_question + poll.answers = new_answers + poll.edited_by[player_index] = true - local start_tick = game.tick - local duration = data.duration - local end_tick + local start_tick = game.tick + local duration = data.duration + local end_tick - if duration == 0 then - end_tick = -1 - else - end_tick = start_tick + duration - end + if duration == 0 then + end_tick = -1 + else + end_tick = start_tick + duration + end - poll.start_tick = start_tick - poll.end_tick = end_tick - poll.duration = duration + poll.start_tick = start_tick + poll.end_tick = end_tick + poll.duration = duration - local poll_index - for i, p in pairs(polls) do - if poll == p then - poll_index = i - break - end + local poll_index + for i, p in pairs(polls) do + if poll == p then + poll_index = i + break end + end - if not poll_index then -- In case we edit a poll that has been deleted. - insert(polls, poll) - insert(active_polls, poll) - poll_index = #polls - elseif not table.contains(active_polls, poll) then -- In case we edit a poll that has finished. - insert(active_polls, poll) - end + if not poll_index then -- In case we edit a poll that has been deleted. + insert(polls, poll) + insert(active_polls, poll) + poll_index = #polls + elseif not table.contains(active_polls, poll) then -- In case we edit a poll that has finished. + insert(active_polls, poll) + end - local message = table.concat {player.name, ' has edited Poll #', poll.id, ': ', poll.question} + local message = table.concat { player.name, ' has edited poll #', poll.id, ': ', poll.question } - for _, p in pairs(game.connected_players) do - local left = Gui.get_left_flow(p) - local main_frame = left[main_frame_name] + for _, p in pairs(game.connected_players) do + local left = Gui.get_left_flow(p) + local main_frame = left[main_frame_name] - if no_notify_players[p.index] then - if main_frame and main_frame.valid then - local main_frame_data = Gui.get_data(main_frame) - update_poll_viewer(main_frame_data) - end + if no_notify_players[p.index] then + if main_frame and main_frame.valid then + local main_frame_data = Gui.get_data(main_frame) + update_poll_viewer(main_frame_data) + end + else + p.print(message) + if main_frame and main_frame.valid then + local main_frame_data = Gui.get_data(main_frame) + main_frame_data.poll_index = poll_index + update_poll_viewer(main_frame_data) else - p.print(message) - if main_frame and main_frame.valid then - local main_frame_data = Gui.get_data(main_frame) - main_frame_data.poll_index = poll_index - update_poll_viewer(main_frame_data) - else - draw_main_frame(left, p) - end + draw_main_frame(left, p) end end - - send_poll_result_to_discord(poll) end -) -Gui.on_checked_state_changed( - notify_checkbox_name, - function(event) - local player_index = event.player_index - local checkbox = event.element - local state = checkbox.state + send_poll_result_to_discord(poll) +end) - local no_notify - if state then - no_notify = nil - else - no_notify = true - end +Gui.on_checked_state_changed(notify_checkbox_name, function(event) + local player_index = event.player_index + local checkbox = event.element + local state = checkbox.state - no_notify_players[player_index] = no_notify - Settings.set(player_index, notify_name, state) + local no_notify + if state then + no_notify = nil + else + no_notify = true end -) + + no_notify_players[player_index] = no_notify + Settings.set(player_index, notify_name, state) +end) local function do_direction(event, sign) local count @@ -1251,58 +1188,49 @@ local function do_direction(event, sign) update_poll_viewer(data) end -Gui.on_click( - poll_view_back_name, - function(event) - do_direction(event, -1) - end -) +Gui.on_click(poll_view_back_name, function(event) + do_direction(event, -1) +end) -Gui.on_click( - poll_view_forward_name, - function(event) - do_direction(event, 1) - end -) +Gui.on_click(poll_view_forward_name, function(event) + do_direction(event, 1) +end) Gui.on_click(poll_view_vote_name, vote) Gui.allow_player_to_toggle_top_element_visibility(main_button_name) -Event.add( - Settings.events.on_setting_set, - function(event) - if event.setting_name ~= notify_name then - return - end +Event.add(Settings.events.on_setting_set, function(event) + if event.setting_name ~= notify_name then + return + end - local player_index = event.player_index - local player = game.get_player(player_index) - if not player or not player.valid then - return - end + local player_index = event.player_index + local player = game.get_player(player_index) + if not player or not player.valid then + return + end - local state = event.new_value - local no_notify - if state then - no_notify = nil - else - no_notify = true - end + local state = event.new_value + local no_notify + if state then + no_notify = nil + else + no_notify = true + end - no_notify_players[player_index] = no_notify + no_notify_players[player_index] = no_notify - local frame = Gui.get_left_element(player, main_frame_name) - if not frame then - return - end + local frame = Gui.get_left_element(player, main_frame_name) + if not frame then + return + end - local data = Gui.get_data(frame) - local checkbox = data.notify_checkbox + local data = Gui.get_data(frame) + local checkbox = data.notify_checkbox - checkbox.state = state - end -) + checkbox.state = state +end) local Class = {} @@ -1353,7 +1281,7 @@ function Class.poll(data) local answers = {} for index, a in pairs(data.answers) do if a ~= '' then - insert(answers, {text = a, index = index, voted_count = 0}) + insert(answers, { text = a, index = index, voted_count = 0 }) end end @@ -1382,9 +1310,9 @@ function Class.poll(data) start_tick = start_tick, end_tick = end_tick, duration = duration, - created_by = game.player or {name = '', valid = true}, + created_by = game.player or { name = '', valid = true }, edited_by = {}, - edit_rank = data.edit_rank or nil + edit_rank = data.edit_rank or nil, } insert(polls, poll_data) @@ -1403,7 +1331,7 @@ function Class.poll_result(id) for _, poll_data in pairs(polls) do if poll_data.id == id then - local result = {'Question: ', poll_data.question, ' Answers: '} + local result = { 'Question: ', poll_data.question, ' Answers: ' } local answers = poll_data.answers local answers_count = #answers for i, a in pairs(answers) do @@ -1421,7 +1349,7 @@ function Class.poll_result(id) end end - return table.concat {'poll #', id, ' not found'} + return table.concat { 'poll #', id, ' not found' } end function Class.get_poll_data(id) @@ -1448,7 +1376,7 @@ local function poll_command(args) if not suc then Game.player_print(result) else - Game.player_print(table.concat {'Poll #', result, ' successfully created.'}) + Game.player_print(table.concat { 'Poll #', result, ' successfully created.' }) end end @@ -1471,32 +1399,24 @@ function Class.send_poll_result_to_discord(id) end end - local message = table.concat {'poll #', id, ' not found'} + local message = table.concat { 'poll #', id, ' not found' } Server.to_discord_embed(message) end -Command.add( - 'poll', - { - description = {'command_description.poll'}, - arguments = {'poll'}, - required_rank = Ranks.admin, - allowed_by_server = true, - custom_help_text = {'command_custom_help.poll'}, - log_command = true, - capture_excess_arguments = true - }, - poll_command -) - -Command.add( - 'poll-result', - { - description = {'command_description.poll_result'}, - arguments = {'poll'}, - allowed_by_server = true - }, - poll_result_command -) +Command.add('poll', { + description = { 'command_description.poll' }, + arguments = { 'poll' }, + required_rank = Ranks.admin, + allowed_by_server = true, + custom_help_text = { 'command_custom_help.poll' }, + log_command = true, + capture_excess_arguments = true, +}, poll_command) + +Command.add('poll-result', { + description = { 'command_description.poll_result' }, + arguments = { 'poll' }, + allowed_by_server = true, +}, poll_result_command) return Class diff --git a/features/gui/redmew_settings.lua b/features/gui/redmew_settings.lua index b3671aa74..aad40b4a3 100644 --- a/features/gui/redmew_settings.lua +++ b/features/gui/redmew_settings.lua @@ -1,8 +1,8 @@ -local Gui = require 'utils.gui' +local Color = require 'resources.color_presets' local Event = require 'utils.event' -local Toast = require 'features.gui.toast' +local Gui = require 'utils.gui' local Settings = require 'utils.redmew_settings' -local Color = require 'resources.color_presets' +local Toast = require 'features.gui.toast' local pairs = pairs local main_button_name = Gui.uid_name() @@ -17,14 +17,12 @@ local function player_created(event) return end - Gui.add_top_element(player, - { - type = 'sprite-button', - name = main_button_name, - sprite = 'item/iron-gear-wheel', - tooltip = {'redmew_settings_gui.tooltip'} - } - ) + Gui.add_top_element(player, { + type = 'sprite-button', + name = main_button_name, + sprite = 'item/iron-gear-wheel', + tooltip = { 'redmew_settings_gui.tooltip' }, + }) end local function player_joined(event) @@ -67,102 +65,82 @@ local function set_element_value(element, value) end end -local function create_input_element(frame, type, value) - if type == 'fraction' then - return frame.add({type = 'slider', value = value, minimum_value = 0, maximum_value = 1}) +local function create_input_element(frame, _type, value) + if _type == 'fraction' then + return frame.add { type = 'slider', value = value, minimum_value = 0, maximum_value = 1 } end - if type == 'boolean' then - return frame.add({type = 'checkbox', state = value}) + if _type == 'boolean' then + return frame.add { type = 'checkbox', state = value } end -- ensure something is always added to prevent errors - return frame.add({type = 'text-box', text = tostring(value)}) + return frame.add { type = 'text-box', text = tostring(value) } end local function draw_main_frame(center, player) local settings = Settings.get_setting_metadata() - local settings_frame = - center.add( - { - type = 'frame', - name = main_frame_name, - direction = 'vertical', - caption = {'redmew_settings_gui.frame_title'} - } - ) - - local settings_frame_style = settings_frame.style - settings_frame_style.width = 500 - - local info_text = settings_frame.add({type = 'label', caption = {'redmew_settings_gui.setting_info'}}) - local info_text_style = info_text.style - info_text_style.single_line = false - info_text_style.bottom_padding = 5 - info_text_style.left_padding = 5 - info_text_style.right_padding = 5 - info_text_style.top_padding = 5 - info_text_style.width = 370 - - local scroll_pane = settings_frame.add({type = 'scroll-pane'}) - local scroll_style = scroll_pane.style - scroll_style.vertically_squashable = true - scroll_style.maximal_height = 800 - scroll_style.bottom_padding = 5 - scroll_style.left_padding = 5 - scroll_style.right_padding = 5 - scroll_style.top_padding = 5 - - local setting_grid = scroll_pane.add({type = 'table', column_count = 2}) + local settings_frame = center.add({ + type = 'frame', + name = main_frame_name, + direction = 'vertical', + caption = { 'redmew_settings_gui.frame_title' }, + style = 'non_draggable_frame', + }) + Gui.set_style(settings_frame, { width = 500 }) + + local inner = settings_frame.add { type = 'frame', style = 'inside_shallow_frame', direction = 'vertical' } + + local header = inner + .add { type = 'frame', style = 'subheader_frame' } + .add { type = 'flow', direction = 'horizontal' } + Gui.set_style(header.parent, { height = 56, natural_height = 56, padding = 5 }) + Gui.set_style(header, { horizontally_stretchable = true }) + + local info_text = header.add { type = 'label', caption = { 'redmew_settings_gui.setting_info' } } + Gui.set_style(info_text, { + single_line = false, + padding = 5, + width = 370, + }) + + local scroll_pane = inner.add { type = 'scroll-pane' } + Gui.set_style(scroll_pane, { + vertically_squashable = true, + maximal_height = 800, + padding = 8, + }) + + local setting_grid = scroll_pane.add { type = 'table', column_count = 2 } local player_index = player.index local data = {} for name, setting in pairs(settings) do - local label = - setting_grid.add( - { - type = 'label', - caption = setting.locale_string - } - ) - - local label_style = label.style - label_style.horizontally_stretchable = true - label_style.height = 35 - label_style.vertical_align = 'center' + local label = setting_grid.add { type = 'label', caption = setting.locale_string } + Gui.set_style(label, { horizontally_stretchable = true, height = 35, vertical_align = 'center' }) local value = Settings.toScalar(name, Settings.get(player_index, name)) - local input_container = setting_grid.add({type = 'flow'}) - local input_container_style = input_container.style - input_container_style.height = 35 - input_container_style.vertical_align = 'center' + local input_container = setting_grid.add { type = 'flow' } + Gui.set_style(input_container, { height = 35, vertical_align = 'center' }) local input = create_input_element(input_container, setting.type, value) data[name] = { label = label, input = input, - previous_value = value + previous_value = value, } end - local bottom_flow = settings_frame.add({type = 'flow', direction = 'horizontal'}) + local bottom_flow = settings_frame.add { type = 'flow', direction = 'horizontal' } - local left_flow = bottom_flow.add({type = 'flow'}) - left_flow.style.horizontal_align = 'left' - left_flow.style.horizontally_stretchable = true + local left_flow = bottom_flow.add { type = 'flow' } + Gui.set_style(left_flow, { horizontal_align = 'left', horizontally_stretchable = true }) - local close_button = - left_flow.add({type = 'button', name = main_button_name, caption = {'redmew_settings_gui.button_cancel'}}) - close_button.style = 'back_button' + left_flow.add { type = 'button', name = main_button_name, caption = { 'redmew_settings_gui.button_cancel' }, style = 'back_button' } - local right_flow = bottom_flow.add({type = 'flow'}) - right_flow.style.horizontal_align = 'right' - - local save_button = - right_flow.add( - {type = 'button', name = save_changes_button_name, caption = {'redmew_settings_gui.button_save_changes'}} - ) - save_button.style = 'confirm_button' + local right_flow = bottom_flow.add { type = 'flow' } + Gui.set_style(right_flow, { horizontal_align = 'right' }) + local save_button = right_flow.add { type = 'button', name = save_changes_button_name, caption = { 'redmew_settings_gui.button_save_changes' }, style = 'confirm_button' } Gui.set_data(save_button, data) Gui.set_data(settings_frame, data) @@ -177,7 +155,6 @@ local function toggle(event) local main_frame = center[main_frame_name] local main_button = Gui.get_top_element(player, main_button_name) - if main_frame then main_button.toggled = false Gui.destroy(main_frame) @@ -226,7 +203,7 @@ local function save_changes(event) Settings.set(player_index, name, value) end - Toast.toast_player(player, 5, {'redmew_settings_gui.save_success_toast_message'}) + Toast.toast_player(player, 5, { 'redmew_settings_gui.save_success_toast_message' }) local main_frame = player.gui.center[main_frame_name] diff --git a/features/gui/tasklist.lua b/features/gui/tasklist.lua index f947e6550..7817a7f6c 100644 --- a/features/gui/tasklist.lua +++ b/features/gui/tasklist.lua @@ -1,16 +1,17 @@ +local Color = require 'resources.color_presets' +local Command = require 'utils.command' local Event = require 'utils.event' -local Gui = require 'utils.gui' local Global = require 'utils.global' -local Rank = require 'features.rank_system' -local Utils = require 'utils.core' +local Gui = require 'utils.gui' local math = require 'utils.math' -local Command = require 'utils.command' -local Color = require 'resources.color_presets' +local Rank = require 'features.rank_system' local Ranks = require 'resources.ranks' local Settings = require 'utils.redmew_settings' +local Utils = require 'utils.core' local normal_color = Color.white local focus_color = Color.dark_orange +local label_max_length = 80 local notify_name = 'notify_task' Settings.register(notify_name, Settings.types.boolean, true, 'tasklist.notify_caption_short') @@ -20,7 +21,7 @@ local server_player = { index = 0, name = '', admin = true, - print = print + print = print, } local init_announcements = 'There are no announcements.' @@ -30,35 +31,32 @@ local announcements = { editing_players = {}, last_edit_player = nil, last_update_player = nil, - last_update_time = nil + last_update_time = nil, } local tasks = {} local player_tasks = {} -local tasks_counter = {0} +local tasks_counter = { 0 } local last_task_update_data = { player = nil, - time = nil + time = nil, } local no_notify_players = {} -Global.register( - { - announcements = announcements, - tasks = tasks, - player_tasks = player_tasks, - tasks_counter = tasks_counter, - last_task_update_data = last_task_update_data, - no_notify_players = no_notify_players - }, - function(tbl) - announcements = tbl.announcements - tasks = tbl.tasks - player_tasks = tbl.player_tasks - tasks_counter = tbl.tasks_counter - last_task_update_data = tbl.last_task_update_data - no_notify_players = tbl.no_notify_players - end -) +Global.register({ + announcements = announcements, + tasks = tasks, + player_tasks = player_tasks, + tasks_counter = tasks_counter, + last_task_update_data = last_task_update_data, + no_notify_players = no_notify_players, +}, function(tbl) + announcements = tbl.announcements + tasks = tbl.tasks + player_tasks = tbl.player_tasks + tasks_counter = tbl.tasks_counter + last_task_update_data = tbl.last_task_update_data + no_notify_players = tbl.no_notify_players +end) local main_frame_name = Gui.uid_name() local main_button_name = Gui.uid_name() @@ -84,6 +82,33 @@ local create_task_clear_button_name = Gui.uid_name() local create_task_confirm_button_name = Gui.uid_name() local create_task_edit_button_name = Gui.uid_name() +local STYLES = { + count_button = { + height = 26, + width = 26, + padding = 0, + font = 'default-small', + }, + default_button = { + width = 26, + height = 26, + padding = 2, + }, + direction_button = { + width = 26, + height = 26, + padding = 0, + font = 'default-listbox', + }, + textbox = { + maximal_width = 1e6, + maximal_height = 1e6, + minimal_width = 450, + minimal_height = 100, + horizontally_stretchable = true, + }, +} + local function get_task_id() local count = tasks_counter[1] + 1 tasks_counter[1] = count @@ -98,11 +123,11 @@ local function get_announcements_updated_by_message() end return table.concat { - 'Updated by ', + 'Updated by: [color=yellow][font=count-font]', player.name, - ' (', + '[/font][/color] \nTime: [color=yellow][font=count-font]', Utils.format_time(game.tick - announcements.last_update_time), - ' ago).' + '[/font][/color] ago', } end @@ -112,18 +137,19 @@ local function get_edit_announcements_last_player_message() return '' end - return 'Last edit by ' .. player.name + return 'Last edit by [color=yellow][font=count-font]' .. player.name .. '[/font][/color]' end local function get_editing_players_message(players) - local message = {'Editing players: '} + local message = { 'Editing players: [color=yellow][font=count-font]' } for pi, _ in pairs(players) do local name = game.get_player(pi).name table.insert(message, name) - table.insert(message, ', ') + table.insert(message, '[color=white],[/color] ') end table.remove(message) + table.insert(message, '[/font][/color]') return table.concat(message) end @@ -136,55 +162,64 @@ local function get_task_updated_by_message() end return table.concat { - 'Updated by ', + 'Updated by: [color=yellow][font=count-font]', player.name, - ' (', + '[/font][/color] \nTime: [color=yellow][font=count-font]', Utils.format_time(game.tick - last_task_update_data.time), - ' ago).' + '[/font][/color] ago', } end +local function set_updated_by(element, caption) + local get_updated_by + if caption == 'Announcements' then + get_updated_by = get_announcements_updated_by_message + elseif caption == 'Tasks' then + get_updated_by = get_task_updated_by_message + end + + if not get_updated_by then + return + end + + local last_edit_message = get_updated_by() + element.caption = caption .. ' ' .. (#last_edit_message == 0 and '' or ' [img=info]') + element.tooltip = last_edit_message +end + +local function get_task_label_caption(task) + local caption = task.name + if #caption > label_max_length then + caption = caption:sub(1, label_max_length) .. ' [...]' + end + return table.concat { '#', task.task_id, ' ', caption } +end + local function get_task_label_tooltip(task, game_tick) - local tooltip = {'Created by ', task.created_by.name} + local tooltip = { task.name, '\n\n', 'Created by: [color=yellow][font=count-font]', task.created_by.name, '[/font][/color]' } local edited_by = task.edited_by if edited_by then - table.insert(tooltip, ' Edited by ') + table.insert(tooltip, '\nEdited by [color=yellow][font=count-font]') for _, p in pairs(edited_by) do table.insert(tooltip, p.name) - table.insert(tooltip, ', ') + table.insert(tooltip, '[color=white],[/color] ') end table.remove(tooltip) + table.insert(tooltip, '[/font][/color]') end - table.insert(tooltip, ' (') + table.insert(tooltip, '\nTime: [color=yellow][font=count-font]') table.insert(tooltip, Utils.format_time(game_tick - task.tick)) - table.insert(tooltip, ' ago)') + table.insert(tooltip, '[/font][/color] ago') return table.concat(tooltip) end -local function apply_direction_button_style(button) - local button_style = button.style - button_style.width = 26 - button_style.height = 26 - button_style.top_padding = 0 - button_style.bottom_padding = 0 - button_style.left_padding = 0 - button_style.right_padding = 0 - button_style.font = 'default-listbox' -end - -local function apply_button_style(button) - local style = button.style - style.width = 26 - style.height = 26 -end - local function update_volunteer_button(button, task) local volunteers = task.volunteers - local tooltip = {'Volunteers: '} + local tooltip = { 'Volunteers: ' } local count = 0 for _, p in pairs(volunteers) do @@ -228,95 +263,79 @@ local function redraw_tasks(data, enabled) local task_count = #tasks if task_count == 0 then - parent.add {type = 'label', caption = 'There are no Tasks.'} + parent.add { type = 'label', caption = { 'task.empty_tasks' } } return end - local delete_button_tooltip - local edit_button_tooltip - local up_button_tooltip - local down_button_tooltip - if enabled then - delete_button_tooltip = 'Delete task.' - edit_button_tooltip = 'Edit task.' - up_button_tooltip = 'Move the task up, right click moves 5 spaces, shift click moves the task to the top.' - down_button_tooltip = - 'Move the task down, right click moves 5 spaces, shift click moves the task to the bottom.' - else - delete_button_tooltip = 'Sorry, you have to be a regular to delete tasks.' - edit_button_tooltip = 'Sorry, you have to be a regular to edit tasks.' - up_button_tooltip = 'Sorry, you have to be a regualr to move tasks.' - down_button_tooltip = 'Sorry, you have to be a regualr to move tasks.' - end - local game_tick = game.tick + local delete_button_tooltip = enabled and { 'task.delete_tooltip' } or { 'task.regular_required' } + local edit_button_tooltip = enabled and { 'task.edit_tooltip' } or { 'task.regular_required' } + local up_button_tooltip = enabled and { 'task.up_tooltip' } or { 'task.regular_required' } + local down_button_tooltip = enabled and { 'task.down_tooltip' } or { 'task.regular_required' } for task_index, task in ipairs(tasks) do - local delete_button = - parent.add({type = 'flow'}).add { + local buttons_flow = parent.add { type = 'frame', style = 'deep_frame_in_shallow_frame' }.add { type = 'table', column_count = 5, style = 'table' } + Gui.set_style(buttons_flow.parent, { padding = 0, margin = 0 }) + Gui.set_style(buttons_flow, { horizontal_spacing = 0, vertical_spacing = 0, padding = 0, margin = 0 }) + + local delete_button = buttons_flow.add { type = 'sprite-button', name = delete_task_button_name, sprite = 'utility/trash', - tooltip = delete_button_tooltip + tooltip = delete_button_tooltip, + style = 'tool_button_red', } delete_button.enabled = enabled - apply_button_style(delete_button) + Gui.set_style(delete_button, STYLES.default_button) Gui.set_data(delete_button, task_index) - local edit_button = - parent.add({type = 'flow'}).add { + local edit_button = buttons_flow.add { type = 'sprite-button', name = edit_task_button_name, sprite = 'utility/rename_icon', - tooltip = edit_button_tooltip + tooltip = edit_button_tooltip, + style = 'green_button', } edit_button.enabled = enabled - apply_button_style(edit_button) + Gui.set_style(edit_button, STYLES.default_button) Gui.set_data(edit_button, task) - local up_button = - parent.add({type = 'flow'}).add { + local up_button = buttons_flow.add { type = 'button', name = move_task_up_button_name, caption = '▲', - tooltip = up_button_tooltip + tooltip = up_button_tooltip, } up_button.enabled = enabled and task_index ~= 1 - apply_direction_button_style(up_button) + Gui.set_style(up_button, STYLES.direction_button) Gui.set_data(up_button, task_index) - local down_button = - parent.add({type = 'flow'}).add { + + local down_button = buttons_flow.add { type = 'button', name = move_task_down_button_name, caption = '▼', - tooltip = down_button_tooltip + tooltip = down_button_tooltip, } down_button.enabled = enabled and task_index ~= task_count - apply_direction_button_style(down_button) + Gui.set_style(down_button, STYLES.direction_button) Gui.set_data(down_button, task_index) - local volunteer_button_flow = parent.add {type = 'flow'} - local volunteer_button = volunteer_button_flow.add {type = 'button', name = volunteer_task_button_name} - local volunteer_button_style = volunteer_button.style - volunteer_button_style.font = 'default-small' - volunteer_button_style.height = 26 - volunteer_button_style.width = 26 - volunteer_button_style.top_padding = 0 - volunteer_button_style.bottom_padding = 0 - volunteer_button_style.left_padding = 0 - volunteer_button_style.right_padding = 0 + local volunteer_button = buttons_flow.add { + type = 'button', + name = volunteer_task_button_name, + } + Gui.set_style(volunteer_button, STYLES.count_button) Gui.set_data(volunteer_button, task) update_volunteer_button(volunteer_button, task) volunteer_buttons[task.task_id] = volunteer_button - local label = - parent.add { + local label = parent.add { type = 'label', - caption = table.concat {'#', task.task_id, ' ', task.name}, - tooltip = get_task_label_tooltip(task, game_tick) + caption = get_task_label_caption(task), + tooltip = get_task_label_tooltip(task, game_tick), } - label.style.left_padding = 4 + Gui.set_style(label, { left_padding = 4, single_line = false }) task_labels[task_index] = label end @@ -327,97 +346,82 @@ local function draw_main_frame(left, player) local data = {} - local edit_announcements_button_tooltip - local add_task_button_tooltip - if enabled then - edit_announcements_button_tooltip = 'Edit announcements.' - add_task_button_tooltip = 'Create a new task.' - else - edit_announcements_button_tooltip = 'Sorry, you need to be a regular to edit announcements.' - add_task_button_tooltip = 'Sorry, you need to be a regular to create a new tasks.' - end + local edit_announcements_button_tooltip = enabled and { 'announcement.edit_tooltip' } or { 'announcement.regular_required' } + local add_task_button_tooltip = enabled and { 'task.create_tooltip' } or { 'task.regular_required' } - local frame = left.add {type = 'frame', name = main_frame_name, direction = 'vertical'} + local frame = left.add { type = 'frame', name = main_frame_name, direction = 'vertical' } + Gui.set_style(frame, { width = 470 }) Gui.set_data(frame, data) - local announcements_header_flow = frame.add {type = 'flow'} + local canvas = frame.add { type = 'flow', direction = 'vertical' } + Gui.set_style(canvas, { vertical_spacing = 8 }) - local edit_announcements_button = - announcements_header_flow.add { - type = 'sprite-button', - name = announcements_edit_button_name, - sprite = 'utility/rename_icon', - tooltip = edit_announcements_button_tooltip - } - edit_announcements_button.enabled = enabled - apply_button_style(edit_announcements_button) - - local announcements_header = announcements_header_flow.add {type = 'label', caption = 'Announcements'} - announcements_header.style.font = 'default-listbox' - - local last_edit_message = get_announcements_updated_by_message() - local announcements_updated_label = - announcements_header_flow.add { - type = 'label', - caption = last_edit_message, - tooltip = last_edit_message - } + do -- Announcements + local inner = canvas.add { type = 'frame', style = 'inside_shallow_frame', direction = 'vertical' } + local header = inner.add { type = 'frame', style = 'subheader_frame' }.add { type = 'flow', direction = 'horizontal' } - local announcements_textbox = frame.add {type = 'text-box', text = announcements.text} - announcements_textbox.read_only = true - --announcements_textbox.word_wrap = true - local announcements_textbox_style = announcements_textbox.style - announcements_textbox_style.width = 450 - announcements_textbox_style.height = 100 + local announcements_updated_label = header.add { type = 'label', style = 'subheader_caption_label' } + set_updated_by(announcements_updated_label, 'Announcements') + data.announcements_updated_label = announcements_updated_label - data.announcements_textbox = announcements_textbox - data.announcements_updated_label = announcements_updated_label + Gui.add_pusher(header) - local tasks_header_flow = frame.add {type = 'flow'} + header.add { + type = 'sprite-button', + name = announcements_edit_button_name, + sprite = 'utility/rename_icon', + tooltip = edit_announcements_button_tooltip, + style = 'tool_button', + enabled = enabled, + } - local add_task_button = - tasks_header_flow.add { - type = 'sprite-button', - name = add_task_button_name, - sprite = 'utility/add', - tooltip = add_task_button_tooltip - } - add_task_button.enabled = enabled - apply_button_style(add_task_button) - - local tasks_header = tasks_header_flow.add {type = 'label', caption = 'Tasks'} - tasks_header.style.font = 'default-listbox' - - local last_task_updated_message = get_task_updated_by_message() - local tasks_updated_label = - tasks_header_flow.add { - type = 'label', - caption = last_task_updated_message, - tooltip = last_task_updated_message - } - data.tasks_updated_label = tasks_updated_label + local announcements_textbox = inner.add { + type = 'text-box', + text = announcements.text, + } + announcements_textbox.read_only = true + announcements_textbox.word_wrap = true + Gui.set_style(announcements_textbox, STYLES.textbox) + + data.announcements_textbox = announcements_textbox + end + + do -- Tasks + local inner = canvas.add { type = 'frame', style = 'inside_shallow_frame', direction = 'vertical' } + local header = inner.add { type = 'frame', style = 'subheader_frame' }.add { type = 'flow', direction = 'horizontal' } + + local tasks_updated_label = header.add { type = 'label', style = 'subheader_caption_label' } + set_updated_by(tasks_updated_label, 'Tasks') + data.tasks_updated_label = tasks_updated_label + + Gui.add_pusher(header) + + header.add { + type = 'sprite-button', + name = add_task_button_name, + sprite = 'utility/add', + tooltip = add_task_button_tooltip, + style = 'tool_button', + enabled = enabled, + } - local tasks_scroll_pane = frame.add {type = 'scroll-pane', direction = 'vertical'} - local tasks_scroll_pane_style = tasks_scroll_pane.style - tasks_scroll_pane_style.width = 450 - tasks_scroll_pane_style.maximal_height = 250 + local tasks_scroll_pane = inner.add { type = 'scroll-pane', direction = 'vertical' } + Gui.set_style(tasks_scroll_pane, { width = 450, maximal_height = 250 }) - local tasks_content = tasks_scroll_pane.add {type = 'table', column_count = 6} - local tasks_content_style = tasks_content.style - tasks_content_style.horizontal_spacing = 0 - tasks_content_style.vertical_spacing = 0 - data.tasks_content = tasks_content + local tasks_content = tasks_scroll_pane.add { type = 'table', column_count = 2 } + Gui.set_style(tasks_content, { horizontal_spacing = 0, vertical_spacing = 0, padding = 8 }) + data.tasks_content = tasks_content - redraw_tasks(data, enabled) + redraw_tasks(data, enabled) + end local state = Settings.get(player.index, notify_name) - local notify_checkbox = - frame.add { + local notify_checkbox = frame.add { type = 'checkbox', name = notify_checkbox_name, state = state, - caption = {'tasklist.notify_caption'}, - tooltip = {'tasklist.notify_tooltip'} + caption = { 'tasklist.notify_caption' }, + tooltip = { 'tasklist.notify_tooltip' }, } data.notify_checkbox = notify_checkbox @@ -495,8 +499,7 @@ local function update_announcements(player) announcements.last_update_player = player announcements.last_update_time = game.tick - local last_edit_message = get_announcements_updated_by_message() - local update_message = 'The announcements have been updated by ' .. player.name + local update_message = { 'announcement.updated_by', player.name } for _, p in ipairs(game.connected_players) do local notify = not no_notify_players[p.index] @@ -511,9 +514,7 @@ local function update_announcements(player) local data = Gui.get_data(frame) data.announcements_textbox.text = text - local label = data.announcements_updated_label - label.caption = last_edit_message - label.tooltip = last_edit_message + set_updated_by(data.announcements_updated_label, 'Announcements') elseif notify then draw_main_frame(left, p) end @@ -529,7 +530,7 @@ local function create_new_tasks(task_name, player) edited_by = nil, tick = tick, name = task_name, - volunteers = {} + volunteers = {}, } table.insert(tasks, task) @@ -537,15 +538,12 @@ local function create_new_tasks(task_name, player) last_task_update_data.player = player last_task_update_data.time = tick - local update_message = get_task_updated_by_message() - - local message = - table.concat { + local message = table.concat { player.name, - ' has create a new task #', + ' has create a new [color=orange]task[/color] #', task_id, ' - ', - task_name + task_name, } for _, p in ipairs(game.connected_players) do @@ -554,7 +552,7 @@ local function create_new_tasks(task_name, player) local frame = left[main_frame_name] if frame and frame.valid then local frame_data = Gui.get_data(frame) - frame_data.tasks_updated_label.caption = update_message + set_updated_by(frame_data.tasks_updated_label, 'Tasks') local enabled = Rank.equal_or_greater_than(p.name, Ranks.regular) redraw_tasks(frame_data, enabled) @@ -577,37 +575,34 @@ local function draw_create_task_frame(left, previous_task) local text if previous_task then - frame_caption = 'Edit Task #' .. previous_task.task_id + frame_caption = 'Edit task #' .. previous_task.task_id confirm_button_name = create_task_edit_button_name - confirm_button_caption = 'Edit Task' + confirm_button_caption = 'Edit task' text = previous_task.name else - frame_caption = 'Create New Task' + frame_caption = 'Create new task' confirm_button_name = create_task_confirm_button_name - confirm_button_caption = 'Create Task' + confirm_button_caption = 'Create task' end - local frame = - left.add {type = 'frame', name = create_task_frame_name, caption = frame_caption, direction = 'vertical'} - frame.style.width = 470 + local frame = left.add { type = 'frame', name = create_task_frame_name, caption = frame_caption, direction = 'vertical', style = 'non_draggable_frame' } + Gui.set_style(frame, { width = 470 }) - local textbox = frame.add {type = 'textfield', text = text} - local textbox_style = textbox.style - textbox_style.width = 450 + local textbox = frame.add { type = 'textfield', text = text } + Gui.set_style(textbox, { width = 450 }) - local bottom_flow = frame.add {type = 'flow'} + local bottom_flow = frame.add { type = 'flow' } local close_button = Gui.make_close_button(bottom_flow, create_task_close_button_name) Gui.set_data(close_button, frame) - local clear_button = bottom_flow.add {type = 'button', name = create_task_clear_button_name, caption = 'Clear'} + local clear_button = bottom_flow.add { type = 'button', name = create_task_clear_button_name, caption = 'Clear' } Gui.set_data(clear_button, textbox) - bottom_flow.add({type = 'flow'}).style.horizontally_stretchable = true + bottom_flow.add({ type = 'flow' }).style.horizontally_stretchable = true - local confirm_button = - bottom_flow.add {type = 'button', name = confirm_button_name, caption = confirm_button_caption} - Gui.set_data(confirm_button, {frame = frame, textbox = textbox, previous_task = previous_task}) + local confirm_button = bottom_flow.add { type = 'button', name = confirm_button_name, caption = confirm_button_caption } + Gui.set_data(confirm_button, { frame = frame, textbox = textbox, previous_task = previous_task }) end local function player_created(event) @@ -616,16 +611,14 @@ local function player_created(event) return end - Gui.add_top_element(player, - { - type = 'sprite-button', - name = main_button_name, - sprite = 'item/repair-pack', - tooltip = {'tasklist.tooltip'}, - number = #tasks or 0, - auto_toggle = true, - } - ) + Gui.add_top_element(player, { + type = 'sprite-button', + name = main_button_name, + sprite = 'item/repair-pack', + tooltip = { 'tasklist.tooltip' }, + number = #tasks or 0, + auto_toggle = true, + }) end local function player_joined(event) @@ -637,15 +630,12 @@ local function player_joined(event) local frame = Gui.get_left_element(player, main_frame_name) if frame and frame.valid then local text = announcements.edit_text - local last_edit_message = get_announcements_updated_by_message() local data = Gui.get_data(frame) data.announcements_textbox.text = text - local label = data.announcements_updated_label - label.caption = last_edit_message - label.tooltip = last_edit_message + set_updated_by(data.announcements_updated_label, 'Announcements') local enabled = Rank.equal_or_greater_than(player.name, Ranks.regular) redraw_tasks(data, enabled) @@ -690,8 +680,8 @@ local function on_tick() if frame then local data = Gui.get_data(frame) - data.tasks_updated_label.caption = get_task_updated_by_message() - data.announcements_updated_label.caption = get_announcements_updated_by_message() + set_updated_by(data.tasks_updated_label, 'Tasks') + set_updated_by(data.announcements_updated_label, 'Announcements') local game_tick = game.tick for task_index, label in ipairs(data.task_labels) do @@ -707,201 +697,173 @@ Event.add(defines.events.on_player_created, player_created) Event.add(defines.events.on_player_joined_game, player_joined) Event.add(defines.events.on_player_left_game, player_left) Event.add(defines.events.on_player_removed, player_removed) -Event.on_nth_tick(60*59, on_tick) +Event.on_nth_tick(60 * 59, on_tick) Gui.on_click(main_button_name, toggle) -Gui.on_click( - announcements_edit_button_name, - function(event) - local player = event.player +Gui.on_click(announcements_edit_button_name, function(event) + local player = event.player - local frame = Gui.get_left_element(player, edit_announcements_frame_name) - if frame then - return - end + local frame = Gui.get_left_element(player, edit_announcements_frame_name) + if frame then + return + end - local data = {} + local data = {} - frame = Gui.add_left_element(player, { - type = 'frame', - name = edit_announcements_frame_name, - caption = 'Edit Announcements', - direction = 'vertical' - }) - frame.style.width = 470 + frame = Gui.add_left_element(player, { + type = 'frame', + name = edit_announcements_frame_name, + caption = 'Edit announcements', + direction = 'vertical', + }) + frame.style.width = 470 - Gui.set_data(frame, data) + Gui.set_data(frame, data) - local top_flow = frame.add {type = 'flow'} - local last_edit_player_label = top_flow.add {type = 'label'} - local editing_players_label = top_flow.add {type = 'label'} + local top_flow = frame.add { type = 'flow' } + local last_edit_player_label = top_flow.add { type = 'label' } + local editing_players_label = top_flow.add { type = 'label' } - local textbox = - frame.add {type = 'text-box', name = edit_announcements_textbox_name, text = announcements.edit_text} - --textbox.word_wrap = true - local textbox_style = textbox.style - textbox_style.width = 450 - textbox_style.height = 100 + local textbox = frame.add { + type = 'text-box', + name = edit_announcements_textbox_name, + text = announcements.edit_text, + } + textbox.word_wrap = true + Gui.set_style(textbox, STYLES.textbox) + data.textbox = textbox - data.textbox = textbox + local bottom_flow = frame.add { type = 'flow' } - local bottom_flow = frame.add {type = 'flow'} + local close_button = Gui.make_close_button(bottom_flow, edit_close_button_name) + local clear_button = bottom_flow.add { type = 'button', name = edit_clear_button_name, caption = 'Clear' } + local reset_button = bottom_flow.add { type = 'button', name = edit_reset_button_name, caption = 'Reset' } + bottom_flow.add({ type = 'flow' }).style.horizontally_stretchable = true + local confirm_button = bottom_flow.add { type = 'button', name = edit_confirm_button_name, caption = 'Confirm' } - local close_button = Gui.make_close_button(bottom_flow, edit_close_button_name) - local clear_button = bottom_flow.add {type = 'button', name = edit_clear_button_name, caption = 'Clear'} - local reset_button = bottom_flow.add {type = 'button', name = edit_reset_button_name, caption = 'Reset'} - bottom_flow.add({type = 'flow'}).style.horizontally_stretchable = true - local confirm_button = bottom_flow.add {type = 'button', name = edit_confirm_button_name, caption = 'Confirm'} + Gui.set_data(close_button, frame) + Gui.set_data(clear_button, textbox) + Gui.set_data(reset_button, textbox) + Gui.set_data(confirm_button, frame) - Gui.set_data(close_button, frame) - Gui.set_data(clear_button, textbox) - Gui.set_data(reset_button, textbox) - Gui.set_data(confirm_button, frame) + announcements.editing_players[player.index] = { + textbox = textbox, + last_edit_player_label = last_edit_player_label, + editing_players_label = editing_players_label, + } - announcements.editing_players[player.index] = { - textbox = textbox, - last_edit_player_label = last_edit_player_label, - editing_players_label = editing_players_label - } + local last_edit_message = get_edit_announcements_last_player_message() + local editing_players_message = get_editing_players_message(announcements.editing_players) + + last_edit_player_label.caption = last_edit_message + last_edit_player_label.tooltip = last_edit_message + editing_players_label.caption = editing_players_message + editing_players_label.tooltip = editing_players_message +end) + +Gui.on_checked_state_changed(notify_checkbox_name, function(event) + local player_index = event.player_index + local checkbox = event.element + local state = checkbox.state + + local no_notify + if state then + no_notify = nil + else + no_notify = true + end - local last_edit_message = get_edit_announcements_last_player_message() - local editing_players_message = get_editing_players_message(announcements.editing_players) + no_notify_players[player_index] = no_notify + Settings.set(player_index, notify_name, state) +end) + +Gui.on_click(edit_close_button_name, function(event) + local frame = Gui.get_data(event.element) + close_edit_announcements_frame(frame) +end) + +Gui.on_click(edit_clear_button_name, function(event) + local text = '' + local textbox = Gui.get_data(event.element) + textbox.text = text + update_edit_announcements_textbox(text, event.player) +end) + +Gui.on_click(edit_reset_button_name, function(event) + local text = announcements.text + local textbox = Gui.get_data(event.element) + textbox.text = text + update_edit_announcements_textbox(text, event.player) +end) + +Gui.on_click(edit_confirm_button_name, function(event) + local frame = Gui.get_data(event.element) + close_edit_announcements_frame(frame) - last_edit_player_label.caption = last_edit_message - last_edit_player_label.tooltip = last_edit_message - editing_players_label.caption = editing_players_message - editing_players_label.tooltip = editing_players_message - end -) - -Gui.on_checked_state_changed( - notify_checkbox_name, - function(event) - local player_index = event.player_index - local checkbox = event.element - local state = checkbox.state - - local no_notify - if state then - no_notify = nil - else - no_notify = true - end + local player = event.player + update_announcements(player) +end) - no_notify_players[player_index] = no_notify - Settings.set(player_index, notify_name, state) - end -) +Gui.on_text_changed(edit_announcements_textbox_name, function(event) + local textbox = event.element + local text = textbox.text -Gui.on_click( - edit_close_button_name, - function(event) - local frame = Gui.get_data(event.element) - close_edit_announcements_frame(frame) - end -) - -Gui.on_click( - edit_clear_button_name, - function(event) - local text = '' - local textbox = Gui.get_data(event.element) - textbox.text = text - update_edit_announcements_textbox(text, event.player) - end -) - -Gui.on_click( - edit_reset_button_name, - function(event) - local text = announcements.text - local textbox = Gui.get_data(event.element) - textbox.text = text - update_edit_announcements_textbox(text, event.player) - end -) + update_edit_announcements_textbox(text, event.player) +end) -Gui.on_click( - edit_confirm_button_name, - function(event) - local frame = Gui.get_data(event.element) - close_edit_announcements_frame(frame) +Gui.on_click(delete_task_button_name, function(event) + local task_index = Gui.get_data(event.element) - local player = event.player - update_announcements(player) - end -) + local task = table.remove(tasks, task_index) -Gui.on_text_changed( - edit_announcements_textbox_name, - function(event) - local textbox = event.element - local text = textbox.text + local message = table.concat { + event.player.name, + ' has deleted [color=orange]task[/color] #', + task.task_id, + ' - ', + task.name, + } - update_edit_announcements_textbox(text, event.player) + local task_id = task.task_id + for pi, _ in pairs(task.volunteers) do + local tasks_for_player = player_tasks[pi] + if tasks_for_player then + tasks_for_player[task_id] = nil + end end -) - -Gui.on_click( - delete_task_button_name, - function(event) - local task_index = Gui.get_data(event.element) - - local task = table.remove(tasks, task_index) - - local message = - table.concat { - event.player.name, - ' has deleted task #', - task.task_id, - ' - ', - task.name - } - local task_id = task.task_id - for pi, _ in pairs(task.volunteers) do - local tasks_for_player = player_tasks[pi] - if tasks_for_player then - tasks_for_player[task_id] = nil - end + for _, p in ipairs(game.connected_players) do + local notify = not no_notify_players[p.index] + local left = Gui.get_left_flow(p) + local frame = left[main_frame_name] + if frame and frame.valid then + local data = Gui.get_data(frame) + local enabled = Rank.equal_or_greater_than(p.name, Ranks.regular) + redraw_tasks(data, enabled) + elseif notify then + draw_main_frame(left, p) end - for _, p in ipairs(game.connected_players) do - local notify = not no_notify_players[p.index] - local left = Gui.get_left_flow(p) - local frame = left[main_frame_name] - if frame and frame.valid then - local data = Gui.get_data(frame) - local enabled = Rank.equal_or_greater_than(p.name, Ranks.regular) - redraw_tasks(data, enabled) - elseif notify then - draw_main_frame(left, p) - end - - update_top_gui(p) + update_top_gui(p) - if notify then - p.print(message) - end + if notify then + p.print(message) end end -) +end) -Gui.on_click( - edit_task_button_name, - function(event) - local previous_task = Gui.get_data(event.element) - local left = Gui.get_left_flow(event.player) - local frame = left[create_task_frame_name] +Gui.on_click(edit_task_button_name, function(event) + local previous_task = Gui.get_data(event.element) + local left = Gui.get_left_flow(event.player) + local frame = left[create_task_frame_name] - if frame then - Gui.destroy(frame) - end - - draw_create_task_frame(left, previous_task) + if frame then + Gui.destroy(frame) end -) + + draw_create_task_frame(left, previous_task) +end) local function do_direction(event, sign) local count @@ -936,241 +898,207 @@ local function do_direction(event, sign) end end -Gui.on_click( - move_task_up_button_name, - function(event) - do_direction(event, -1) - end -) +Gui.on_click(move_task_up_button_name, function(event) + do_direction(event, -1) +end) -Gui.on_click( - move_task_down_button_name, - function(event) - do_direction(event, 1) - end -) - -Gui.on_click( - volunteer_task_button_name, - function(event) - local button = event.element - local task = Gui.get_data(button) - local task_id = task.task_id +Gui.on_click(move_task_down_button_name, function(event) + do_direction(event, 1) +end) - local player_index = event.player_index - local volunteers = task.volunteers +Gui.on_click(volunteer_task_button_name, function(event) + local button = event.element + local task = Gui.get_data(button) + local task_id = task.task_id - if volunteers[player_index] then - volunteers[player_index] = nil + local player_index = event.player_index + local volunteers = task.volunteers - local tasks_for_player = player_tasks[player_index] - tasks_for_player[task_id] = nil - else - volunteers[player_index] = event.player + if volunteers[player_index] then + volunteers[player_index] = nil - local tasks_for_player = player_tasks[player_index] - if not tasks_for_player then - tasks_for_player = {} - player_tasks[player_index] = tasks_for_player - end + local tasks_for_player = player_tasks[player_index] + tasks_for_player[task_id] = nil + else + volunteers[player_index] = event.player - tasks_for_player[task_id] = task + local tasks_for_player = player_tasks[player_index] + if not tasks_for_player then + tasks_for_player = {} + player_tasks[player_index] = tasks_for_player end - for _, p in ipairs(game.connected_players) do - local frame = Gui.get_left_element(p, main_frame_name) - if frame and frame.valid then - local data = Gui.get_data(frame) - local volunteer_buttons = data.volunteer_buttons - - update_volunteer_button(volunteer_buttons[task_id], task) - end - end + tasks_for_player[task_id] = task end -) -Gui.on_click( - add_task_button_name, - function(event) - local left = Gui.get_left_flow(event.player) - local frame = left[create_task_frame_name] + for _, p in ipairs(game.connected_players) do + local frame = Gui.get_left_element(p, main_frame_name) + if frame and frame.valid then + local data = Gui.get_data(frame) + local volunteer_buttons = data.volunteer_buttons - if frame then - Gui.destroy(frame) + update_volunteer_button(volunteer_buttons[task_id], task) end - - draw_create_task_frame(left) end -) +end) -Gui.on_click( - create_task_close_button_name, - function(event) - local frame = Gui.get_data(event.element) +Gui.on_click(add_task_button_name, function(event) + local left = Gui.get_left_flow(event.player) + local frame = left[create_task_frame_name] + + if frame then Gui.destroy(frame) end -) -Gui.on_click( - create_task_clear_button_name, - function(event) - local textbox = Gui.get_data(event.element) - textbox.text = '' - end -) + draw_create_task_frame(left) +end) -Gui.on_click( - create_task_confirm_button_name, - function(event) - local data = Gui.get_data(event.element) +Gui.on_click(create_task_close_button_name, function(event) + local frame = Gui.get_data(event.element) + Gui.destroy(frame) +end) - local player = event.player - local textbox = data.textbox - local task_name = textbox.text +Gui.on_click(create_task_clear_button_name, function(event) + local textbox = Gui.get_data(event.element) + textbox.text = '' +end) - if task_name == '' then - player.print('Sorry, tasks cannot be empty.') - return - end +Gui.on_click(create_task_confirm_button_name, function(event) + local data = Gui.get_data(event.element) - local frame = data.frame - - Gui.destroy(frame) + local player = event.player + local textbox = data.textbox + local task_name = textbox.text - create_new_tasks(task_name, player) + if task_name == '' then + player.print('Sorry, tasks cannot be empty.') + return end -) -Gui.on_click( - create_task_edit_button_name, - function(event) - local data = Gui.get_data(event.element) + local frame = data.frame - local player = event.player - local textbox = data.textbox - local name = textbox.text + Gui.destroy(frame) - if name == '' then - player.print('Sorry, tasks cannot be empty.') - return - end + create_new_tasks(task_name, player) +end) - local frame = data.frame - local task = data.previous_task +Gui.on_click(create_task_edit_button_name, function(event) + local data = Gui.get_data(event.element) - Gui.destroy(frame) + local player = event.player + local textbox = data.textbox + local name = textbox.text - if task.name == name then - return - end + if name == '' then + player.print('Sorry, tasks cannot be empty.') + return + end - local tick = game.tick + local frame = data.frame + local task = data.previous_task - task.name = name - local edited_by = task.edited_by - if not edited_by then - edited_by = {} - task.edited_by = edited_by - end - edited_by[player.index] = player - task.tick = tick + Gui.destroy(frame) - last_task_update_data.player = player - last_task_update_data.time = tick + if task.name == name then + return + end - local task_index - for i, t in ipairs(tasks) do - if task == t then - task_index = i - break - end - end + local tick = game.tick - if not task_index then - table.insert(tasks, task) + task.name = name + local edited_by = task.edited_by + if not edited_by then + edited_by = {} + task.edited_by = edited_by + end + edited_by[player.index] = player + task.tick = tick + + last_task_update_data.player = player + last_task_update_data.time = tick + + local task_index + for i, t in ipairs(tasks) do + if task == t then + task_index = i + break end + end - local message = - table.concat { - event.player.name, - ' has edited task #', - task.task_id, - ' - ', - name - } + if not task_index then + table.insert(tasks, task) + end - local update_message = get_task_updated_by_message() + local message = table.concat { + event.player.name, + ' has edited [color=orange]task[/color] #', + task.task_id, + ' - ', + name, + } - for _, p in ipairs(game.connected_players) do - local notify = not no_notify_players[p.index] - local left = Gui.get_left_flow(p) - local main_frame = left[main_frame_name] + for _, p in ipairs(game.connected_players) do + local notify = not no_notify_players[p.index] + local left = Gui.get_left_flow(p) + local main_frame = left[main_frame_name] - if main_frame then - local main_frame_data = Gui.get_data(main_frame) + if main_frame then + local main_frame_data = Gui.get_data(main_frame) - main_frame_data.tasks_updated_label.caption = update_message - local enabled = Rank.equal_or_greater_than(p.name, Ranks.regular) - redraw_tasks(main_frame_data, enabled) - elseif notify then - draw_main_frame(left, p) - end + set_updated_by(main_frame_data.tasks_updated_label, 'Tasks') + local enabled = Rank.equal_or_greater_than(p.name, Ranks.regular) + redraw_tasks(main_frame_data, enabled) + elseif notify then + draw_main_frame(left, p) + end - if notify then - p.print(message) - end + if notify then + p.print(message) end end -) +end) Gui.allow_player_to_toggle_top_element_visibility(main_button_name) -Event.add( - Settings.events.on_setting_set, - function(event) - if event.setting_name ~= notify_name then - return - end - - local player_index = event.player_index - local player = game.get_player(player_index) - if not player or not player.valid then - return - end - - local state = event.new_value - local no_notify - if state then - no_notify = nil - else - no_notify = true - end +Event.add(Settings.events.on_setting_set, function(event) + if event.setting_name ~= notify_name then + return + end - no_notify_players[player_index] = no_notify + local player_index = event.player_index + local player = game.get_player(player_index) + if not player or not player.valid then + return + end - local frame = Gui.get_left_element(player, main_frame_name) - if not frame then - return - end + local state = event.new_value + local no_notify + if state then + no_notify = nil + else + no_notify = true + end - local data = Gui.get_data(frame) - local checkbox = data.notify_checkbox + no_notify_players[player_index] = no_notify - checkbox.state = state - end -) - -Command.add( - 'task', - { - description = {'command_description.task'}, - arguments = {'task'}, - required_rank = Ranks.regular, - allowed_by_server = true, - log_command = true, - capture_excess_arguments = true - }, - function(args, player) - create_new_tasks(args.task, player or server_player) + local frame = Gui.get_left_element(player, main_frame_name) + if not frame then + return end -) + + local data = Gui.get_data(frame) + local checkbox = data.notify_checkbox + + checkbox.state = state +end) + +Command.add('task', { + description = { 'command_description.task' }, + arguments = { 'task' }, + required_rank = Ranks.regular, + allowed_by_server = true, + log_command = true, + capture_excess_arguments = true, +}, function(args, player) + create_new_tasks(args.task, player or server_player) +end) diff --git a/locale/en/redmew_features.cfg b/locale/en/redmew_features.cfg index 1c1f15b36..60da4c4bb 100644 --- a/locale/en/redmew_features.cfg +++ b/locale/en/redmew_features.cfg @@ -184,7 +184,7 @@ insert_item=-__1__ __2__ (__3__) enable=Enable autofill enabled_ammos=Enabled ammo types ammo_count=Autofill ammo count -invalid_ammo_count=ammo count must be a positive integer +invalid_ammo_count=Ammo count must be a positive integer main_button_tooltip=[font=var][color=1,0.9,0.75]Autofill[/color][/font]\n Set ammo type & quantity frame_name=Autofill @@ -198,11 +198,11 @@ snake_destroyed=__1__ has been destroyed with a score of __2__. [paint] tooltip=[font=var][color=1,0.9,0.75]Paint brush[/color][/font]\n A touch of color to the factory! -frame_name=Paint Brush -clear_brush=Clear Brush +frame_name=Paint brush +clear_brush=Clear brush palette=Palette -select_brush=Select Brush Tile. -instructions=Select a brush tile to replace [item=refined-concrete] and [item=refined-hazard-concrete].\nOnly works when Paint Brush window is open. +select_brush=Select brush tile +instructions=Select a brush tile to replace [item=refined-concrete] and [item=refined-hazard-concrete].\nOnly works when Paint brush window is open. no_place_landfill=Coloured concrete can not be placed on landfill tiles. [death_corpse_tags] @@ -284,3 +284,17 @@ remove_player=[color=blue][Save Manager][/color] Player [color=orange]__1__[/col [corpse] looting=__1__ is looting __2__`s corpse. [gps=__3__,__4__,__5__] looted=__1__ has looted __2__`s corpse. [gps=__3__,__4__,__5__] + +[task] +empty_tasks=There are no [color=orange][font=default-semibold]tasks[/font][/color] +delete_tooltip=Delete [color=orange][font=default-semibold]task[/font][/color] +edit_tooltip=Edit [color=orange][font=default-semibold]task[/font][/color] +create_tooltip=Create a new [color=orange][font=default-semibold]task[/font][/color] +up_tooltip= __CONTROL_LEFT_CLICK__ move the [color=orange][font=default-semibold]task[/font][/color] up \n __CONTROL_RIGHT_CLICK__ move the [color=orange][font=default-semibold]task[/font][/color] 5 places up \n __CONTROL_KEY_SHIFT__ + __CONTROL_LEFT_CLICK__ move the [color=orange][font=default-semibold]task[/font][/color] to the top +down_tooltip= __CONTROL_LEFT_CLICK__ move the [color=orange][font=default-semibold]task[/font][/color] down \n __CONTROL_RIGHT_CLICK__ move the [color=orange][font=default-semibold]task[/font][/color] 5 places down \n __CONTROL_KEY_SHIFT__ + __CONTROL_LEFT_CLICK__ move the [color=orange][font=default-semibold]task[/font][/color] to the bottom +regular_required=Sorry, you have to be a regular to perform this action + +[announcement] +edit_tooltip=Edit [color=blue][font=default-semibold]announcements[/font][/color] +regular_required=Sorry, you have to be a regular to perform this action +updated_by=The [color=blue]announcements[/color] have been updated by __1__ diff --git a/locale/en/redmew_gui.cfg b/locale/en/redmew_gui.cfg index 8cff68ce4..ede2334d8 100644 --- a/locale/en/redmew_gui.cfg +++ b/locale/en/redmew_gui.cfg @@ -107,9 +107,9 @@ poke_caption=Poke __1__ report_caption=Report __1__ report_tooltip=Report player to the admin team for griefing or breaking the rules. report_button_tooltip=Report __1__ -poke_notify_caption=Notify me when pokes happen. -poke_notify_caption_short=Notify pokes. -poke_notify_tooltip=Receive a message when a player pokes another player. +poke_notify_caption=Notify me when pokes happen +poke_notify_caption_short=Notify pokes +poke_notify_tooltip=Receive a message when a player pokes another player [toast] toast_all=__1__ sent a toast to all players. @@ -122,8 +122,8 @@ tooltip=[font=var][color=1,0.9,0.75]Evolution[/color][/font]\n Alien evolution p [tag_group] tooltip=[font=var][color=1,0.9,0.75]Tags[/color][/font]\n Player tag group management notify_caption=Notify me when tag groups change. -notify_caption_short=Notify tag groups. -notify_tooltip=Receive a message when a player enters or leaves a tag group or when a tag group is created, edited or deleted. +notify_caption_short=Notify tag groups +notify_tooltip=Receive a message when a player enters or leaves a tag group or when a tag group is created, edited or deleted join_message=Join Message leave_message=Leave Message edit_group=Edit tag group @@ -145,18 +145,18 @@ player_already_has_tag=__1__ already has __2__ tag. [poll] tooltip=[font=var][color=1,0.9,0.75]Polls[/color][/font]\n View and manage polls -notify_caption=Notify me about polls. -notify_caption_short=Notify polls. -notify_tooltip=Receive a message when new polls are created and popup the poll. +notify_caption=Notify me about polls +notify_caption_short=Notify polls +notify_tooltip=Receive a message when new polls are created and popup the poll [score] tooltip=[font=var][color=1,0.9,0.75]Score[/color][/font]\n Check the game`s statistics [tasklist] tooltip=[font=var][color=1,0.9,0.75]Tasks[/color][/font]\n View and manage announcements, tasks -notify_caption=Notify me about new announcements or tasks. -notify_caption_short=Notify announcements / tasks. -notify_tooltip=Receive a message when tasks or announcements are created or edited. +notify_caption=Notify me about new announcements or tasks +notify_caption_short=Notify announcements / tasks +notify_tooltip=Receive a message when tasks or announcements are created or edited [popup] default_title=NOTICE! diff --git a/locale/en/redmew_utils.cfg b/locale/en/redmew_utils.cfg index a7ffe4a84..646db94bb 100644 --- a/locale/en/redmew_utils.cfg +++ b/locale/en/redmew_utils.cfg @@ -27,7 +27,7 @@ error_log=Error while running '__1__' with arguments __2__: __3__ print_admins=__1__(ADMIN) __2__: __3__ [gui_util] -button_tooltip=Shows / hides the Redmew Gui buttons. +button_tooltip=[font=var][color=1,0.9,0.75]Toolbar[/color][/font]\nCollapse / Expand the toolbar [redmew_settings_util] fraction_invalid_value=fraction setting type requires the input to be a valid number between 0 and 1.