Guest User

Rail signaling gui/signal_tool_gui.lua

a guest
Nov 4th, 2021
272
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 8.49 KB | None | 0 0
  1. require("scripts/settings")
  2.  
  3. local function create_button(parent, name, sprite_path)
  4. local button = parent.add{
  5. type = "sprite-button",
  6. name=name,
  7. sprite = sprite_path
  8. }
  9. button.style.width = 36
  10. button.style.height = 36
  11. return button
  12. end
  13.  
  14. local function open_signal_gui(event)
  15. if event.item.name ~= "rail-signal-planner" then
  16. return
  17. end
  18. if not global.signal_settings then
  19. global.signal_settings = {}
  20. end
  21. if not global.signal_settings[event.player_index] then
  22. set_default_settings(event.player_index)
  23. end
  24. local global_settings = global.signal_settings[event.player_index]
  25. local player = game.players[event.player_index]
  26. if player.opened then
  27. player.opened.destroy()
  28. end
  29. local gui = player.gui
  30. local frame = gui.screen.add{type="frame", name="rail_signal_gui", caption={"rsp-gui.rail-signal-planner"}}
  31. frame.auto_center=true
  32. local flow = frame.add{type="flow", name="rail_signal_flow", direction="vertical"}
  33. local signal_entity_table = flow.add{type="table", name="rail_signal_table", column_count=2, vertical_screening=true}
  34. flow.drag_target=frame
  35. signal_entity_table.add{type="label", name="rail_signal_item_label", caption={"entity-name.rail-signal"}}
  36. signal_entity_table.add{type="choose-elem-button", name="rail_signal_item", elem_type="item", item=get_setting("rail_signal_item", player), tooltip={"rsp-gui.tooltip-rail-signal"}}
  37. signal_entity_table.add{type="label", name="rail_chain_signal_item_label", caption={"entity-name.rail-chain-signal"}}
  38. signal_entity_table.add{type="choose-elem-button", name="rail_chain_signal_item", elem_type="item", item=get_setting("rail_chain_signal_item", player), tooltip={"rsp-gui.tooltip-rail-chain-signal"}}
  39.  
  40. local wagon_value = math.ceil((global_settings.train_length + 1)/7)
  41. local wagon_length_tooltip = {"rsp-gui.tooltip-wagon-length"}
  42. flow.add{type="label", name="wagon_length_label", caption={"rsp-gui.wagon-length-label"}, tooltip=wagon_length_tooltip}
  43. local wagon_length_flow = flow.add{type="flow", name="wagon_length_flow", direction="horizontal", tooltip=wagon_length_tooltip}
  44. local wagon_slider = wagon_length_flow.add{type="slider", name="wagon_length_slider", minimum_value=1, maximum_value=16, value=wagon_value, value_step=1, tooltip=wagon_length_tooltip}
  45. wagon_slider.style.maximal_width = 100
  46. local wagon_textfield = wagon_length_flow.add{type="textfield", name="wagon_length_textfield", text=wagon_value, numeric=true, allow_decimal=false, allow_negative=false, tooltip=wagon_length_tooltip}
  47. wagon_textfield.style.maximal_width=50
  48.  
  49. local train_length_tooltip = {"rsp-gui.tooltip-train-length"}
  50. flow.add{type="label", name="train_length_label", caption={"rsp-gui.train-length-label"}, tooltip=train_length_tooltip}
  51. local train_length_flow = flow.add{type="flow", name="train_length_flow", direction="horizontal", tooltip=train_length_tooltip}
  52. local train_length_slider = train_length_flow.add{type="slider", name="train_length_slider", minimum_value=0, maximum_value=16*7-1, value=global_settings.train_length, value_step=1, tooltip=train_length_tooltip}
  53. train_length_slider.style.maximal_width = 100
  54. local train_length_textfield = train_length_flow.add{type="textfield", name="train_length_textfield", text=global_settings.train_length, numeric=true, allow_decimal=false, allow_negative=false, tooltip=train_length_tooltip}
  55. train_length_textfield.style.maximal_width=50
  56.  
  57. local rail_signal_distance_tooltip = {"rsp-gui.tooltip-rail-distance"}
  58. flow.add{type="label", name="rail_distance_label", caption={"rsp-gui.rail-distance-label"}, tooltip=rail_signal_distance_tooltip}
  59. local rail_signal_distance_flow = flow.add{type="flow", name="rail_signal_distance_flow", direction="horizontal", tooltip=rail_signal_distance_tooltip}
  60. local rail_signal_distance_slider = rail_signal_distance_flow.add{type="slider", name="rail_signal_distance_slider", minimum_value=2, maximum_value=50, value=global_settings.rail_signal_distance, value_step=1, tooltip=rail_signal_distance_tooltip}
  61. rail_signal_distance_slider.style.maximal_width = 100
  62. local rail_signal_distance_textfield = rail_signal_distance_flow.add{type="textfield", name="rail_signal_distance_textfield", text=global_settings.rail_signal_distance, numeric=true, allow_decimal=false, allow_negative=false, tooltip=rail_signal_distance_tooltip}
  63. rail_signal_distance_textfield.style.maximal_width=50
  64. --
  65. --local button_flow = flow.add{type="flow", name="rail_signal_button_flow", direction="horizontal"}
  66. --button_flow.style.top_margin=20
  67. --button_flow.style.horizontal_align = "center"
  68. --local cancel_button = create_button(button_flow, "rail_cancel_button", "utility/close_black", {1,0,0})
  69. --local delete_button = create_button(button_flow, "rail_delete_button", "utility/remove", {1,0,0})
  70. --local reset_button = create_button(button_flow, "rail_reset_button", "utility/reset", {1,0.5,0})
  71. --local set_default_button = create_button(button_flow, "rail_set_default_button", "utility/export_slot", {1,1,1})
  72. --local conform_button = create_button(button_flow, "rail_confirm_button", "utility/confirm_slot", {1,1,1})
  73.  
  74. player.opened = gui.screen.rail_signal_gui
  75. end
  76.  
  77. local function on_gui_value_changed(event)
  78. local player = game.players[event.player_index]
  79. if event.element.name == "wagon_length_slider" then
  80. local slider_value = event.element.slider_value
  81. event.element.parent.wagon_length_textfield.text = tostring(event.element.slider_value)
  82. set_settings({["train_length"] = 7*slider_value - 1}, player)
  83. event.element.parent.parent.train_length_flow.train_length_textfield.text = tostring(7*slider_value - 1)
  84. event.element.parent.parent.train_length_flow.train_length_slider.slider_value = 7*slider_value - 1
  85. elseif event.element.name == "train_length_slider" then
  86. set_settings({["train_length"] = event.element.slider_value}, player)
  87. event.element.parent.train_length_textfield.text = tostring(event.element.slider_value)
  88. elseif event.element.name == "rail_signal_distance_slider" then
  89. set_settings({["rail_signal_distance"] = event.element.slider_value}, player)
  90. event.element.parent.rail_signal_distance_textfield.text = tostring(event.element.slider_value)
  91. end
  92. end
  93.  
  94. local function on_gui_text_changed(event)
  95. local player = game.players[event.player_index]
  96. if event.element.name == "wagon_length_textfield" then
  97. local slider_value
  98. if not event.element.text or event.element.text == "" then
  99. slider_value = 1
  100. else
  101. slider_value = tonumber(event.element.text)
  102. end
  103. if slider_value < 1 then
  104. slider_value = 1
  105. end
  106. set_settings({["train_length"] = 7*slider_value - 1}, player)
  107. event.element.parent.wagon_length_slider.slider_value = slider_value
  108. event.element.parent.parent.train_length_flow.train_length_textfield.text = tostring(7*slider_value - 1)
  109. event.element.parent.parent.train_length_flow.train_length_slider.slider_value = 7*slider_value - 1
  110. elseif event.element.name == "train_length_textfield" then
  111. local slider_value
  112. if not event.element.text or event.element.text == "" then
  113. slider_value = 1
  114. else
  115. slider_value = tonumber(event.element.text)
  116. end
  117. if slider_value < 1 then
  118. slider_value = 1
  119. end
  120. set_settings({["train_length"] = slider_value}, player)
  121. event.element.parent.train_length_slider.slider_value = slider_value
  122. elseif event.element.name == "rail_signal_distance_textfield" then
  123. local slider_value
  124. if not event.element.text or event.element.text == "" then
  125. slider_value = 2
  126. else
  127. slider_value = tonumber(event.element.text)
  128. end
  129. if slider_value < 2 then
  130. slider_value = 2
  131. end
  132. set_settings({["rail_signal_distance"] = slider_value}, player)
  133. event.element.parent.rail_signal_distance_slider.slider_value = slider_value
  134. end
  135. end
  136.  
  137. local function on_gui_elem_changed(event)
  138. local element = event.element
  139. local player = game.players[event.player_index]
  140. if element.name == "rail_signal_item" then
  141. set_settings({["rail_signal_item"] = element.elem_value}, player)
  142. elseif element.name == "rail_chain_signal_item" then
  143. set_settings({["rail_chain_signal_item"] = element.elem_value}, player)
  144. end
  145. end
  146.  
  147. local function close_signal_gui(event)
  148. local player = game.players[event.player_index]
  149. if player and player.valid and player.gui.screen.rail_signal_gui then
  150. player.gui.screen.rail_signal_gui.destroy()
  151. end
  152. end
  153.  
  154. script.on_event(defines.events.on_mod_item_opened, open_signal_gui)
  155.  
  156. script.on_event(defines.events.on_gui_closed, close_signal_gui)
  157.  
  158. script.on_event(defines.events.on_gui_value_changed, on_gui_value_changed)
  159. script.on_event(defines.events.on_gui_text_changed, on_gui_text_changed)
  160. script.on_event(defines.events.on_gui_elem_changed, on_gui_elem_changed)
  161. script.on_event(defines.events.on_gui_elem_changed, on_gui_elem_changed)
  162.  
Advertisement
Add Comment
Please, Sign In to add comment