118 lines
3.8 KiB
Lua
118 lines
3.8 KiB
Lua
|
local _ENV = mkmodule('plugins.sort.slab')
|
||
|
|
||
|
local gui = require('gui')
|
||
|
local sortoverlay = require('plugins.sort.sortoverlay')
|
||
|
local widgets = require('gui.widgets')
|
||
|
|
||
|
local building = df.global.game.main_interface.building
|
||
|
local view_sheets = df.global.game.main_interface.view_sheets
|
||
|
|
||
|
-- ----------------------
|
||
|
-- SlabOverlay
|
||
|
--
|
||
|
|
||
|
SlabOverlay = defclass(SlabOverlay, sortoverlay.SortOverlay)
|
||
|
SlabOverlay.ATTRS{
|
||
|
default_pos={x=-40, y=12},
|
||
|
viewscreens='dwarfmode/ViewSheets/BUILDING/Workshop',
|
||
|
frame={w=57, h=3},
|
||
|
}
|
||
|
|
||
|
function SlabOverlay:init()
|
||
|
local panel = widgets.Panel{
|
||
|
frame_background=gui.CLEAR_PEN,
|
||
|
visible=self:callback('get_key'),
|
||
|
}
|
||
|
panel:addviews{
|
||
|
widgets.BannerPanel{
|
||
|
frame={l=0, t=0, r=0, h=1},
|
||
|
subviews={
|
||
|
widgets.EditField{
|
||
|
view_id='search',
|
||
|
frame={l=1, t=0, r=1},
|
||
|
label_text="Search: ",
|
||
|
key='CUSTOM_ALT_S',
|
||
|
on_change=function(text) self:do_search(text) end,
|
||
|
},
|
||
|
},
|
||
|
},
|
||
|
widgets.BannerPanel{
|
||
|
frame={l=0, t=2, r=0, h=1},
|
||
|
subviews={
|
||
|
widgets.ToggleHotkeyLabel{
|
||
|
view_id='only_needs_slab',
|
||
|
frame={l=1, t=0, r=1},
|
||
|
label="Show only citizens who need a slab:",
|
||
|
key='CUSTOM_SHIFT_E',
|
||
|
initial_option=false,
|
||
|
on_change=function() self:do_search(self.subviews.search.text, true) end,
|
||
|
},
|
||
|
},
|
||
|
},
|
||
|
}
|
||
|
self:addviews{panel}
|
||
|
|
||
|
self:register_handler('SLAB', building.filtered_button,
|
||
|
curry(sortoverlay.single_vector_search,
|
||
|
{
|
||
|
get_search_key_fn=self:callback('get_search_key'),
|
||
|
matches_filters_fn=self:callback('matches_filters'),
|
||
|
}))
|
||
|
end
|
||
|
|
||
|
function SlabOverlay:onInput(keys)
|
||
|
if SlabOverlay.super.onInput(self, keys) then return true end
|
||
|
if keys._MOUSE_L and self:get_key() and self:getMousePos() then
|
||
|
return true
|
||
|
end
|
||
|
end
|
||
|
|
||
|
function SlabOverlay:get_key()
|
||
|
-- DF fails to set building.category back to NONE if there are no units that
|
||
|
-- can be memorialized, so we have to manually check for a populated button vector
|
||
|
if #building.button > 0 and
|
||
|
building.category == df.interface_category_building.SELECT_MEMORIAL_UNIT
|
||
|
then
|
||
|
return 'SLAB'
|
||
|
else
|
||
|
if safe_index(self.state, 'SLAB', 'saved_original') then
|
||
|
-- elements get freed as soon as the screen changes
|
||
|
self.state.SLAB.saved_original = nil
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
function SlabOverlay:reset()
|
||
|
SlabOverlay.super.reset(self)
|
||
|
self.subviews.only_needs_slab:setOption(false, false)
|
||
|
end
|
||
|
|
||
|
local function get_unit(if_button)
|
||
|
local hf = df.historical_figure.find(if_button.spec_id)
|
||
|
return hf and df.unit.find(hf.unit_id) or nil
|
||
|
end
|
||
|
|
||
|
function SlabOverlay:get_search_key(if_button)
|
||
|
local unit = get_unit(if_button)
|
||
|
if not unit then return if_button.filter_str end
|
||
|
return ('%s %s'):format(
|
||
|
dfhack.units.getReadableName(unit), -- last name is in english
|
||
|
dfhack.TranslateName(unit.name, false, true)) -- get untranslated last name
|
||
|
end
|
||
|
|
||
|
local function needs_slab(if_button)
|
||
|
local unit = get_unit(if_button)
|
||
|
if not unit then return false end
|
||
|
if not dfhack.units.isOwnGroup(unit) then return false end
|
||
|
local info = dfhack.toSearchNormalized(if_button.info)
|
||
|
if not info:find('no slabs engraved', 1, true) then return false end
|
||
|
return info:find('not memorialized', 1, true) or info:find('ghost', 1, true)
|
||
|
end
|
||
|
|
||
|
function SlabOverlay:matches_filters(if_button)
|
||
|
local only_needs_slab = self.subviews.only_needs_slab:getOptionValue()
|
||
|
return not only_needs_slab or needs_slab(if_button)
|
||
|
end
|
||
|
|
||
|
return _ENV
|