From daf691839fd73f4c40f3cc3cc4ae149d74b10e04 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Fri, 17 Feb 2023 14:24:21 -0800 Subject: [PATCH] item selection, callback skeleton --- plugins/lua/buildingplan.lua | 139 +++++++++++++++++++++++++++-------- 1 file changed, 109 insertions(+), 30 deletions(-) diff --git a/plugins/lua/buildingplan.lua b/plugins/lua/buildingplan.lua index 6b1abb84e..b9be7e800 100644 --- a/plugins/lua/buildingplan.lua +++ b/plugins/lua/buildingplan.lua @@ -182,6 +182,10 @@ end ItemLine = defclass(ItemLine, widgets.Panel) ItemLine.ATTRS{ idx=DEFAULT_NIL, + is_selected_fn=DEFAULT_NIL, + on_select=DEFAULT_NIL, + on_filter=DEFAULT_NIL, + on_clear_filter=DEFAULT_NIL, } function ItemLine:init() @@ -189,16 +193,38 @@ function ItemLine:init() self.visible = function() return #get_cur_filters() >= self.idx end self:addviews{ widgets.Label{ - frame={t=0, l=23}, + frame={t=0, l=0}, + text='*', + auto_width=true, + visible=self.is_selected_fn, + }, + widgets.Label{ + frame={t=0, r=0}, + text='*', + auto_width=true, + visible=self.is_selected_fn, + on_click=self.on_filter, + }, + widgets.Label{ + frame={t=0, l=25}, text={ {tile=get_button_start_pen}, {gap=6, tile=get_button_end_pen}, + }, + auto_width=true, + on_click=function() self.on_filter(self.idx) end, + }, + widgets.Label{ + frame={t=0, l=33}, + text={ {tile=get_button_start_pen}, {gap=1, tile=get_button_end_pen}, }, + auto_width=true, + on_click=function() self.on_clear_filter(self.idx) end, }, widgets.Label{ - frame={t=0, l=0}, + frame={t=0, l=2}, text={ {width=21, text=self:callback('get_item_line_text')}, {gap=3, text='filter', pen=COLOR_GREEN}, @@ -215,6 +241,13 @@ function ItemLine:reset() self.available = nil end +function ItemLine:onInput(keys) + if keys._MOUSE_L_DOWN and self:getMousePos() then + self.on_select(self.idx) + end + return ItemLine.super.onInput(self, keys) +end + function get_desc(filter) local desc = 'Unknown' if filter.has_tool_use and filter.has_tool_use > -1 then @@ -301,6 +334,8 @@ PlannerOverlay.ATTRS{ } function PlannerOverlay:init() + self.selected = 1 + local main_panel = widgets.Panel{ view_id='main', frame={t=0, l=0, r=0, h=14}, @@ -308,6 +343,14 @@ function PlannerOverlay:init() frame_background=gui.CLEAR_PEN, } + local function make_is_selected_fn(idx) + return function() return self.selected == idx end + end + + local function on_select_fn(idx) + self.selected = idx + end + main_panel:addviews{ widgets.Label{ frame={}, @@ -315,10 +358,22 @@ function PlannerOverlay:init() text='No items required.', visible=function() return #get_cur_filters() == 0 end, }, - ItemLine{view_id='item1', frame={t=0, l=0, r=0}, idx=1}, - ItemLine{view_id='item2', frame={t=2, l=0, r=0}, idx=2}, - ItemLine{view_id='item3', frame={t=4, l=0, r=0}, idx=3}, - ItemLine{view_id='item4', frame={t=6, l=0, r=0}, idx=4}, + ItemLine{view_id='item1', frame={t=0, l=0, r=0}, idx=1, + is_selected_fn=make_is_selected_fn(1), on_select=on_select_fn, + on_filter=self:callback('filter'), + on_clear_filter=self:callback('clear_filter')}, + ItemLine{view_id='item2', frame={t=2, l=0, r=0}, idx=2, + is_selected_fn=make_is_selected_fn(2), on_select=on_select_fn, + on_filter=self:callback('filter'), + on_clear_filter=self:callback('clear_filter')}, + ItemLine{view_id='item3', frame={t=4, l=0, r=0}, idx=3, + is_selected_fn=make_is_selected_fn(3), on_select=on_select_fn, + on_filter=self:callback('filter'), + on_clear_filter=self:callback('clear_filter')}, + ItemLine{view_id='item4', frame={t=6, l=0, r=0}, idx=4, + is_selected_fn=make_is_selected_fn(4), on_select=on_select_fn, + on_filter=self:callback('filter'), + on_clear_filter=self:callback('clear_filter')}, widgets.CycleHotkeyLabel{ view_id='stairs_top_subtype', frame={t=4, l=4}, @@ -354,32 +409,43 @@ function PlannerOverlay:init() }, visible=is_choosing_area, }, - widgets.CycleHotkeyLabel{ - view_id='safety', - frame={b=0, l=2}, - key='CUSTOM_G', - label='Safety: ', - options={ - {label='None', value='none'}, - {label='Magma', value='magma'}, - {label='Fire', value='fire'}, + widgets.Panel{ + visible=function() return #get_cur_filters() > 0 end, + subviews={ + widgets.HotkeyLabel{ + frame={b=1, l=0}, + key='SELECT', + label='Choose item', + on_activate=function() self:choose(self.selected) end, + enabled=function() + return (self.subviews['item'..self.selected].available or 0) > 0 + end, + }, + widgets.HotkeyLabel{ + frame={b=1, l=21}, + key='CUSTOM_F', + label='Filter', + on_activate=function() self:filter(self.selected) end, + }, + widgets.HotkeyLabel{ + frame={b=1, l=33}, + key='CUSTOM_X', + label='Clear filter', + on_activate=function() self:clear_filter(self.selected) end, + }, + widgets.CycleHotkeyLabel{ + view_id='safety', + frame={b=0, l=2}, + key='CUSTOM_G', + label='Safety: ', + options={ + {label='None', value='none'}, + {label='Magma', value='magma'}, + {label='Fire', value='fire'}, + }, + }, }, }, - widgets.HotkeyLabel{ - frame={b=1, l=0}, - key='SELECT', - label='Choose item', - }, - widgets.HotkeyLabel{ - frame={b=1, l=21}, - key='CUSTOM_F', - label='Filter', - }, - widgets.HotkeyLabel{ - frame={b=1, l=33}, - key='CUSTOM_X', - label='Clear filter', - }, } local error_panel = widgets.ResizingPanel{ @@ -418,6 +484,18 @@ function PlannerOverlay:reset() reset_counts_flag = false end +function PlannerOverlay:choose(idx) + print('choose', idx) +end + +function PlannerOverlay:filter(idx) + print('filter', idx) +end + +function PlannerOverlay:clear_filter(idx) + print('clear_filter', idx) +end + function PlannerOverlay:onInput(keys) if not is_plannable() then return false end if keys.LEAVESCREEN or keys._MOUSE_R_DOWN then @@ -425,6 +503,7 @@ function PlannerOverlay:onInput(keys) uibs.selection_pos:clear() return true end + self.selected = 1 self:reset() return false end