diff --git a/locale/en/caravan.cfg b/locale/en/caravan.cfg index 0b33bb3e..c2d001eb 100644 --- a/locale/en/caravan.cfg +++ b/locale/en/caravan.cfg @@ -51,6 +51,7 @@ the-inventory-is-empty=The inventory is empty. add-interrupt-frame-title=Add interrupt edit-interrupt-frame-title=Edit interrupt save-interrupt=Save interrupt +duplicate-interrupt=Duplicate interrupt delete-interrupt=Delete interrupt confirm-deletion=Are you sure? cancel-deletion=Cancel deletion diff --git a/scripts/caravan/event-handlers/interrupts.lua b/scripts/caravan/event-handlers/interrupts.lua index 823fd6e0..9dd5f286 100644 --- a/scripts/caravan/event-handlers/interrupts.lua +++ b/scripts/caravan/event-handlers/interrupts.lua @@ -338,6 +338,37 @@ gui_events[defines.events.on_gui_click]["py_edit_interrupt_confirm_button"] = fu storage.edited_interrupts[event.player_index] = nil end +gui_events[defines.events.on_gui_click]["py_duplicate_interrupt_button"] = function(event) + local player = game.get_player(event.player_index) + local edited_interrupt = storage.edited_interrupts[event.player_index] + + -- edge case: need to check the rename textfield when 'Duplicate interrupt' is pressed instead of enter + local textfield = event.element.parent.py_edit_interrupt_textfield + if string.len(textfield.text) ~= 0 and textfield.text ~= edited_interrupt.name then + edited_interrupt.name = textfield.text + end + + local interrupt_copy_name = edited_interrupt.name + while storage.interrupts[interrupt_copy_name] ~= nil do + interrupt_copy_name = interrupt_copy_name .. "*" + end + + storage.interrupts[interrupt_copy_name] = table.deepcopy(edited_interrupt) + storage.interrupts[interrupt_copy_name].name = interrupt_copy_name + + local unit_number = CaravanGui.get_gui(player).tags.unit_number + assert(unit_number) + local caravan_data = storage.caravans[unit_number] + table.insert(caravan_data.interrupts, interrupt_copy_name) + CaravanScheduleGui.update_schedule_pane(player) + + if player.gui.screen.edit_interrupt_gui then + player.gui.screen.edit_interrupt_gui.destroy() + local edit_interrupt_gui = EditInterruptGui.build(player.gui.screen, storage.interrupts[interrupt_copy_name]) + CaravanUtils.restore_gui_location(edit_interrupt_gui, window_location) + end +end + gui_events[defines.events.on_gui_click]["py_delete_interrupt_button"] = function(event) local element = event.element local removed_interrupt = element.tags.interrupt_name @@ -366,6 +397,7 @@ gui_events[defines.events.on_gui_click]["py_delete_interrupt_button"] = function element.parent.py_delete_interrupt_cancel.visible = true element.parent.py_delete_interrupt_confirm.visible = true element.parent.py_interrupt_count_label.visible = false + element.parent.py_duplicate_interrupt_button.visible = false end end @@ -375,6 +407,7 @@ gui_events[defines.events.on_gui_click]["py_delete_interrupt_cancel"] = function element.parent.py_interrupt_count_label.visible = true element.parent.py_delete_interrupt_cancel.visible = false element.parent.py_delete_interrupt_confirm.visible = false + element.parent.py_duplicate_interrupt_button.visible = true end gui_events[defines.events.on_gui_click]["py_edit_interrupt_condition_move_up_button"] = function(event) diff --git a/scripts/caravan/gui/edit_interrupt.lua b/scripts/caravan/gui/edit_interrupt.lua index 3d4fcc29..992d5643 100644 --- a/scripts/caravan/gui/edit_interrupt.lua +++ b/scripts/caravan/gui/edit_interrupt.lua @@ -61,6 +61,7 @@ function P.build_subheader_frame(parent) -- work out how many caravans have this interrupt and store in the element tags for use in on_click local relevant_caravans = caravans_with_interrupt(edited_interrupt.name) flow.add {type = "label", name = "py_interrupt_count_label", caption = {"caravan-gui.interrupt-count", table_size(relevant_caravans)}, style = "clickable_squashable_label", tags = {name = edited_interrupt.name, ids = relevant_caravans}}.style.horizontal_align = "right" + flow.add {type = "sprite-button", name = "py_duplicate_interrupt_button", style = "tool_button", sprite = "utility/copy", tooltip = {"caravan-gui.duplicate-interrupt"}} -- handle deletion flow.add {type = "label", visible = false, name = "py_delete_interrupt_confirm", caption = {"caravan-gui.confirm-deletion"}} flow.add {type = "sprite-button", name = "py_delete_interrupt_button", style = "tool_button_red", sprite = "utility/trash", tooltip = {"caravan-gui.delete-interrupt"}, tags = {interrupt_name = edited_interrupt.name}}