|
|
|
@ -1,5 +1,6 @@
|
|
|
|
|
local _ENV = mkmodule('plugins.sort.info')
|
|
|
|
|
|
|
|
|
|
local gui = require('gui')
|
|
|
|
|
local overlay = require('plugins.overlay')
|
|
|
|
|
local widgets = require('gui.widgets')
|
|
|
|
|
local utils = require('utils')
|
|
|
|
@ -7,6 +8,7 @@ local utils = require('utils')
|
|
|
|
|
local info = df.global.game.main_interface.info
|
|
|
|
|
local creatures = info.creatures
|
|
|
|
|
local objects = info.artifacts
|
|
|
|
|
local justice = info.justice
|
|
|
|
|
|
|
|
|
|
-- these sort functions attempt to match the vanilla info panelsort behavior, which
|
|
|
|
|
-- is not quite the same as the rest of DFHack. For example, in other DFHack sorts,
|
|
|
|
@ -159,6 +161,9 @@ local function assign_trainer_search(data, filter, incremental)
|
|
|
|
|
end, nil, data, filter, incremental)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local function interrogation_search(data, filter, incremental)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local HANDLERS = {
|
|
|
|
|
CITIZEN=make_cri_unitst_handlers(creatures.cri_unit.CITIZEN),
|
|
|
|
|
PET=make_cri_unitst_handlers(creatures.cri_unit.PET),
|
|
|
|
@ -166,6 +171,7 @@ local HANDLERS = {
|
|
|
|
|
DECEASED=make_cri_unitst_handlers(creatures.cri_unit.DECEASED),
|
|
|
|
|
PET_OT={search_fn=overall_training_search},
|
|
|
|
|
PET_AT={search_fn=assign_trainer_search},
|
|
|
|
|
INTERROGATING={search_fn=interrogation_search},
|
|
|
|
|
}
|
|
|
|
|
for idx,name in ipairs(df.artifacts_mode_type) do
|
|
|
|
|
if idx < 0 then goto continue end
|
|
|
|
@ -251,8 +257,12 @@ local function resize_overlay(self)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local function is_tabs_in_two_rows()
|
|
|
|
|
return dfhack.screen.readTile(64, 6, false).ch == 0
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local function get_panel_offsets()
|
|
|
|
|
local tabs_in_two_rows = dfhack.screen.readTile(64, 6, false).ch == 0
|
|
|
|
|
local tabs_in_two_rows = is_tabs_in_two_rows()
|
|
|
|
|
local is_objects = info.current_mode == df.info_interface_mode_type.ARTIFACTS
|
|
|
|
|
local l_offset = (not tabs_in_two_rows and is_objects) and 4 or 0
|
|
|
|
|
local t_offset = 1
|
|
|
|
@ -331,4 +341,95 @@ function InfoOverlay:onInput(keys)
|
|
|
|
|
return InfoOverlay.super.onInput(self, keys)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
-- ----------------------
|
|
|
|
|
-- InterrogationOverlay
|
|
|
|
|
--
|
|
|
|
|
|
|
|
|
|
InterrogationOverlay = defclass(InterrogationOverlay, overlay.OverlayWidget)
|
|
|
|
|
InterrogationOverlay.ATTRS{
|
|
|
|
|
default_pos={x=47, y=10},
|
|
|
|
|
default_enabled=true,
|
|
|
|
|
viewscreens={
|
|
|
|
|
'dwarfmode/Info/JUSTICE/Interrogating',
|
|
|
|
|
'dwarfmode/Info/JUSTICE/Convicting',
|
|
|
|
|
},
|
|
|
|
|
frame={w=27, h=9},
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function InterrogationOverlay:init()
|
|
|
|
|
self:addviews{
|
|
|
|
|
widgets.Panel{
|
|
|
|
|
view_id='panel',
|
|
|
|
|
frame={l=0, t=4, h=5, r=0},
|
|
|
|
|
frame_background=gui.CLEAR_PEN,
|
|
|
|
|
frame_style=gui.FRAME_MEDIUM,
|
|
|
|
|
subviews={
|
|
|
|
|
widgets.EditField{
|
|
|
|
|
view_id='search',
|
|
|
|
|
frame={l=0, t=0, r=0},
|
|
|
|
|
label_text="Search: ",
|
|
|
|
|
key='CUSTOM_ALT_S',
|
|
|
|
|
},
|
|
|
|
|
widgets.CycleHotkeyLabel{
|
|
|
|
|
view_id='subset',
|
|
|
|
|
frame={l=0, t=1, w=24},
|
|
|
|
|
key='CUSTOM_SHIFT_F',
|
|
|
|
|
label='Show:',
|
|
|
|
|
options={
|
|
|
|
|
{label='All', value='all', pen=COLOR_GREEN},
|
|
|
|
|
{label='Undead visitors', value='undead', pen=COLOR_RED},
|
|
|
|
|
{label='Other visitors', value='visitors', pen=COLOR_LIGHTRED},
|
|
|
|
|
{label='Residents', value='residents', pen=COLOR_YELLOW},
|
|
|
|
|
{label='Citizens', value='citizens', pen=COLOR_CYAN},
|
|
|
|
|
{label='Animals', value='animals', pen=COLOR_MAGENTA},
|
|
|
|
|
{label='Deceased', value='deceased', pen=COLOR_BLUE},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
widgets.ToggleHotkeyLabel{
|
|
|
|
|
view_id='include_interviewed',
|
|
|
|
|
frame={l=0, t=2, w=23},
|
|
|
|
|
key='CUSTOM_SHIFT_I',
|
|
|
|
|
label='Interviewed:',
|
|
|
|
|
options={
|
|
|
|
|
{label='Include', value=true, pen=COLOR_GREEN},
|
|
|
|
|
{label='Exclude', value=false, pen=COLOR_RED},
|
|
|
|
|
},
|
|
|
|
|
initial_option=true,
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
}
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function InterrogationOverlay:render(dc)
|
|
|
|
|
local sw = dfhack.screen.getWindowSize()
|
|
|
|
|
local info_panel_border = 31 -- from edges of panel to screen edges
|
|
|
|
|
local info_panel_width = sw - info_panel_border
|
|
|
|
|
local info_panel_center = info_panel_width // 2
|
|
|
|
|
local panel_x_offset = (info_panel_center + 5) - self.frame_rect.x1
|
|
|
|
|
local frame_w = math.min(panel_x_offset + 37, info_panel_width - 56)
|
|
|
|
|
local panel_l = panel_x_offset
|
|
|
|
|
local panel_t = is_tabs_in_two_rows() and 4 or 0
|
|
|
|
|
|
|
|
|
|
if self.frame.w ~= frame_w or
|
|
|
|
|
self.subviews.panel.frame.l ~= panel_l or
|
|
|
|
|
self.subviews.panel.frame.t ~= panel_t
|
|
|
|
|
then
|
|
|
|
|
self.frame.w = frame_w
|
|
|
|
|
self.subviews.panel.frame.l = panel_l
|
|
|
|
|
self.subviews.panel.frame.t = panel_t
|
|
|
|
|
self:updateLayout()
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
InterrogationOverlay.super.render(self, dc)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function InterrogationOverlay:onInput(keys)
|
|
|
|
|
if keys._MOUSE_R and self.subviews.search.focus then
|
|
|
|
|
self.subviews.search:setFocus(false)
|
|
|
|
|
return true
|
|
|
|
|
end
|
|
|
|
|
return InfoOverlay.super.onInput(self, keys)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
return _ENV
|
|
|
|
|