mirror of
https://github.com/Refactorio/RedMew.git
synced 2024-12-12 10:04:40 +02:00
a1f1b81ca4
* Frontier V2 * Shortcuts default disabled
284 lines
8.1 KiB
Lua
284 lines
8.1 KiB
Lua
local Gui = require 'utils.gui'
|
|
local Event = require 'utils.event'
|
|
local Global = require 'utils.global'
|
|
local Config = require 'config'.player_shortcuts
|
|
|
|
local AutoStash = require 'features.auto_stash'
|
|
local ClearCorpses = require 'features.clear_corpses'
|
|
local BatteryCharge = require 'features.battery_charge'
|
|
|
|
local player_preferences = {}
|
|
Global.register(player_preferences, function(tbl) player_preferences = tbl end)
|
|
|
|
local main_button_name = Gui.uid_name()
|
|
local main_frame_name = Gui.uid_name()
|
|
local settings_button_name = Gui.uid_name()
|
|
local checkbox_action_name = Gui.uid_name()
|
|
local shortcut_action_name = Gui.uid_name()
|
|
|
|
local shortcut_buttons = {
|
|
auto_stash = {
|
|
name = 'auto_stash',
|
|
caption = {'player_shortcuts.auto_stash_caption'},
|
|
sprite = 'item/wooden-chest',
|
|
tooltip = {'player_shortcuts.auto_stash_tooltip'},
|
|
action = AutoStash.auto_stash,
|
|
},
|
|
battery_charge = {
|
|
name = 'battery_charge',
|
|
caption = {'player_shortcuts.battery_charge_caption'},
|
|
sprite = 'item/battery-mk2-equipment',
|
|
tooltip = {'player_shortcuts.battery_charge_tooltip'},
|
|
action = BatteryCharge.recharge,
|
|
},
|
|
clear_corpses = {
|
|
name = 'clear_corpses',
|
|
caption = {'player_shortcuts.clear_corpses_caption'},
|
|
sprite = 'entity/big-biter',
|
|
tooltip = {'player_shortcuts.clear_corpses_tooltip'},
|
|
action = ClearCorpses.clear_corpses,
|
|
},
|
|
}
|
|
|
|
local Public = {}
|
|
Public.main_button_name = main_button_name
|
|
Public.main_frame_name = main_frame_name
|
|
|
|
local function enabled_shortcuts()
|
|
local shortcuts = {}
|
|
for k, v in pairs(shortcut_buttons) do
|
|
if Config.shortcuts[k] then
|
|
shortcuts[k] = v
|
|
end
|
|
end
|
|
return shortcuts
|
|
end
|
|
|
|
local function get_player_preferences(player)
|
|
local player_data = player_preferences[player.name]
|
|
if not player_data then
|
|
player_data = {}
|
|
player_preferences[player.name] = player_data
|
|
end
|
|
return player_data
|
|
end
|
|
|
|
local function add_shortcut_selection_row(player, parent, child)
|
|
local player_data = get_player_preferences(player)
|
|
if player_data[child.name] == nil then
|
|
player_data[child.name] = true
|
|
end
|
|
|
|
local row = parent.add { type = 'frame', style = 'shortcut_selection_row' }
|
|
Gui.set_style(row, { horizontally_stretchable = true, vertically_stretchable = false })
|
|
|
|
local icon = row.add {
|
|
type = 'sprite-button',
|
|
style = 'transparent_slot',
|
|
sprite = child.sprite,
|
|
tooltip = child.tooltip,
|
|
}
|
|
Gui.set_style(icon, { width = 20, height = 20 })
|
|
|
|
local checkbox = row.add {
|
|
type = 'checkbox',
|
|
caption = child.caption,
|
|
state = player_data[child.name],
|
|
tags = { action = checkbox_action_name, name = child.name },
|
|
}
|
|
Gui.set_style(checkbox, { minimal_width = 160, horizontally_stretchable = true })
|
|
end
|
|
|
|
function Public.on_player_created(player)
|
|
if not Config.enabled then
|
|
return
|
|
end
|
|
|
|
local b = Gui.add_top_element(player, {
|
|
type = 'sprite-button',
|
|
name = main_button_name,
|
|
sprite = 'utility/hand_black',
|
|
tooltip = {'player_shortcuts.info_tooltip'},
|
|
})
|
|
b.style.padding = 2
|
|
end
|
|
|
|
function Public.toggle_main_button(player)
|
|
local main_frame = player.gui.screen[main_frame_name]
|
|
if main_frame then
|
|
main_frame.destroy()
|
|
else
|
|
Public.get_main_frame(player)
|
|
end
|
|
end
|
|
|
|
function Public.toggle_shortcuts_settings(player)
|
|
local frame = Public.get_main_frame(player)
|
|
frame.children[1].qbip.qbsp.visible = not frame.children[1].qbip.qbsp.visible
|
|
end
|
|
|
|
function Public.get_main_frame(player)
|
|
local main_frame = player.gui.screen[main_frame_name]
|
|
if main_frame and main_frame.valid then
|
|
return main_frame
|
|
end
|
|
|
|
main_frame = player.gui.screen.add {
|
|
type = 'frame',
|
|
name = main_frame_name,
|
|
direction = 'horizontal',
|
|
style = 'quick_bar_window_frame',
|
|
}
|
|
main_frame.auto_center = true
|
|
|
|
do -- shortcuts
|
|
local left_flow = main_frame.add { type = 'flow', direction = 'vertical' }
|
|
Gui.set_style(left_flow, { horizontally_stretchable = true })
|
|
|
|
local settings_scroll_pane = left_flow
|
|
.add {
|
|
type = 'frame',
|
|
name = 'qbip',
|
|
style = 'quick_bar_inner_panel'
|
|
}.
|
|
add {
|
|
type = 'scroll-pane',
|
|
name = 'qbsp',
|
|
style = 'shortcut_bar_selection_scroll_pane',
|
|
}
|
|
Gui.set_style(settings_scroll_pane, { horizontally_squashable = false, minimal_width = 40 * table_size(enabled_shortcuts()) })
|
|
|
|
for _, s in pairs(enabled_shortcuts()) do
|
|
add_shortcut_selection_row(player, settings_scroll_pane, s)
|
|
end
|
|
settings_scroll_pane.visible = false
|
|
|
|
local table_frame = left_flow.add {
|
|
type = 'frame',
|
|
name = 'table_frame',
|
|
direction = 'horizontal',
|
|
style = 'quick_bar_inner_panel',
|
|
}
|
|
Gui.set_style(table_frame, { horizontally_stretchable = true, margin = 0 })
|
|
|
|
local table = table_frame.add {
|
|
type = 'table',
|
|
name = 'table',
|
|
column_count = table_size(enabled_shortcuts()),
|
|
style = 'filter_slot_table',
|
|
}
|
|
Gui.set_style(table, { horizontally_stretchable = true })
|
|
|
|
local button
|
|
local player_data = get_player_preferences(player)
|
|
for button_name, s in pairs(enabled_shortcuts()) do
|
|
button = table.add {
|
|
type = 'sprite-button',
|
|
style = 'quick_bar_slot_button',
|
|
sprite = s.sprite,
|
|
hovered_sprite = s.hovered_sprite,
|
|
tooltip = s.tooltip,
|
|
tags = { action = shortcut_action_name, name = button_name },
|
|
}
|
|
Gui.set_style(button, { font_color = { 165, 165, 165 } })
|
|
if player_data[button_name] == nil then
|
|
player_data[button_name] = true
|
|
end
|
|
button.visible = player_data[button_name]
|
|
end
|
|
end
|
|
|
|
do -- settings
|
|
local right_flow = main_frame.add {
|
|
type = 'flow',
|
|
direction = 'vertical',
|
|
}
|
|
Gui.set_style(right_flow, { horizontal_align = 'center', padding = 0 })
|
|
right_flow.drag_target = main_frame
|
|
|
|
right_flow.add {
|
|
type = 'sprite-button',
|
|
name = settings_button_name,
|
|
style = 'shortcut_bar_expand_button',
|
|
sprite = 'utility/expand_dots_white',
|
|
hovered_sprite = 'utility/expand_dots',
|
|
clicked_sprite = 'utility/expand_dots',
|
|
tooltip = {'player_shortcuts.settings_tooltip'},
|
|
mouse_button_filter = { 'left' },
|
|
auto_toggle = true,
|
|
}
|
|
|
|
local widget = right_flow.add { type = 'empty-widget', style = 'draggable_space', ignored_by_interaction = true }
|
|
Gui.set_style(widget, { vertically_stretchable = true, width = 8, margin = 0 })
|
|
end
|
|
|
|
return main_frame
|
|
end
|
|
|
|
Gui.allow_player_to_toggle_top_element_visibility(main_button_name)
|
|
|
|
Gui.on_click(main_button_name, function(event)
|
|
Public.toggle_main_button(event.player)
|
|
end)
|
|
|
|
Gui.on_click(settings_button_name, function(event)
|
|
Public.toggle_shortcuts_settings(event.player)
|
|
end)
|
|
|
|
Event.add(defines.events.on_gui_checked_state_changed, function(event)
|
|
local element = event.element
|
|
if not (element and element.valid) then
|
|
return
|
|
end
|
|
|
|
local player = game.get_player(event.player_index)
|
|
if not (player and player.valid) then
|
|
return
|
|
end
|
|
|
|
local action_name = element.tags and element.tags.action
|
|
if action_name and action_name == checkbox_action_name then
|
|
local name = element.tags.name
|
|
local frame = Public.get_main_frame(player)
|
|
for _, button in pairs(frame.children[1].table_frame.table.children) do
|
|
if button.tags.name == name then
|
|
local player_data = get_player_preferences(player)
|
|
player_data[name] = element.state
|
|
button.visible = element.state
|
|
end
|
|
end
|
|
end
|
|
end)
|
|
|
|
Event.add(defines.events.on_gui_click, function(event)
|
|
local element = event.element
|
|
if not (element and element.valid) then
|
|
return
|
|
end
|
|
|
|
local player = game.get_player(event.player_index)
|
|
if not (player and player.valid) then
|
|
return
|
|
end
|
|
|
|
local action_name = element.tags and element.tags.action
|
|
if action_name and action_name == shortcut_action_name then
|
|
local name = element.tags.name
|
|
local shortcut = shortcut_buttons[name]
|
|
if shortcut and shortcut.action then
|
|
shortcut.action(player, event)
|
|
end
|
|
end
|
|
end)
|
|
|
|
Event.add(defines.events.on_player_created, function(event)
|
|
local player = game.get_player(event.player_index)
|
|
if not (player and player.valid) then
|
|
return
|
|
end
|
|
|
|
Public.on_player_created(player)
|
|
end)
|
|
|
|
return Public
|