|  |  |  | @ -135,24 +135,29 @@ end | 
		
	
		
			
				|  |  |  |  | -- ItemSelection | 
		
	
		
			
				|  |  |  |  | -- | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | local BUILD_TEXT_PEN = to_pen{fg=COLOR_BLACK, bg=COLOR_GREEN, keep_lower=true} | 
		
	
		
			
				|  |  |  |  | local BUILD_TEXT_HPEN = to_pen{fg=COLOR_WHITE, bg=COLOR_GREEN, keep_lower=true} | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | ItemSelection = defclass(ItemSelection, widgets.Window) | 
		
	
		
			
				|  |  |  |  | ItemSelection.ATTRS{ | 
		
	
		
			
				|  |  |  |  |     frame_title='Choose items', | 
		
	
		
			
				|  |  |  |  |     frame={w=60, h=30, l=4, t=8}, | 
		
	
		
			
				|  |  |  |  |     frame={w=56, h=20, l=4, t=8}, | 
		
	
		
			
				|  |  |  |  |     draggable=false, | 
		
	
		
			
				|  |  |  |  |     resizable=true, | 
		
	
		
			
				|  |  |  |  |     resize_min={w=56, h=20}, | 
		
	
		
			
				|  |  |  |  |     index=DEFAULT_NIL, | 
		
	
		
			
				|  |  |  |  |     selected_set=DEFAULT_NIL, | 
		
	
		
			
				|  |  |  |  |     on_submit=DEFAULT_NIL, | 
		
	
		
			
				|  |  |  |  |     on_cancel=DEFAULT_NIL, | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | function ItemSelection:init() | 
		
	
		
			
				|  |  |  |  |     local filter = get_cur_filters()[self.index] | 
		
	
		
			
				|  |  |  |  |     self.quantity = get_quantity(filter) | 
		
	
		
			
				|  |  |  |  |     self.num_selected = 0 | 
		
	
		
			
				|  |  |  |  |     self.selected_set = {} | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     self:addviews{ | 
		
	
		
			
				|  |  |  |  |         widgets.Label{ | 
		
	
		
			
				|  |  |  |  |             frame={t=0}, | 
		
	
		
			
				|  |  |  |  |             frame={t=0, l=0, r=10}, | 
		
	
		
			
				|  |  |  |  |             text={ | 
		
	
		
			
				|  |  |  |  |                 get_desc(filter), | 
		
	
		
			
				|  |  |  |  |                 self.quantity == 1 and '' or 's', | 
		
	
	
		
			
				
					|  |  |  | @ -162,6 +167,17 @@ function ItemSelection:init() | 
		
	
		
			
				|  |  |  |  |                 ' selected)', | 
		
	
		
			
				|  |  |  |  |             }, | 
		
	
		
			
				|  |  |  |  |         }, | 
		
	
		
			
				|  |  |  |  |         widgets.Label{ | 
		
	
		
			
				|  |  |  |  |             frame={r=0, w=9, t=0, h=3}, | 
		
	
		
			
				|  |  |  |  |             text_pen=BUILD_TEXT_PEN, | 
		
	
		
			
				|  |  |  |  |             text_hpen=BUILD_TEXT_HPEN, | 
		
	
		
			
				|  |  |  |  |             text={ | 
		
	
		
			
				|  |  |  |  |                 '         ', NEWLINE, | 
		
	
		
			
				|  |  |  |  |                 '  Build  ', NEWLINE, | 
		
	
		
			
				|  |  |  |  |                 '         ', | 
		
	
		
			
				|  |  |  |  |             }, | 
		
	
		
			
				|  |  |  |  |             on_click=self:callback('submit'), | 
		
	
		
			
				|  |  |  |  |         }, | 
		
	
		
			
				|  |  |  |  |         widgets.FilteredList{ | 
		
	
		
			
				|  |  |  |  |             frame={t=3, l=0, r=0, b=0}, | 
		
	
		
			
				|  |  |  |  |             case_sensitive=false, | 
		
	
	
		
			
				
					|  |  |  | @ -251,6 +267,22 @@ function ItemSelection:get_entry_icon(item_id) | 
		
	
		
			
				|  |  |  |  |     return self.selected_set[item_id] and get_selected_item_pen() or nil | 
		
	
		
			
				|  |  |  |  | end | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | function ItemSelection:submit() | 
		
	
		
			
				|  |  |  |  |     local selected_items = {} | 
		
	
		
			
				|  |  |  |  |     for item_id in pairs(self.selected_set) do | 
		
	
		
			
				|  |  |  |  |         table.insert(selected_items, item_id) | 
		
	
		
			
				|  |  |  |  |     end | 
		
	
		
			
				|  |  |  |  |     self.on_submit(selected_items) | 
		
	
		
			
				|  |  |  |  | end | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | function ItemSelection:onInput(keys) | 
		
	
		
			
				|  |  |  |  |     if keys.LEAVESCREEN or keys._MOUSE_R_DOWN then | 
		
	
		
			
				|  |  |  |  |         self.on_cancel() | 
		
	
		
			
				|  |  |  |  |         return true | 
		
	
		
			
				|  |  |  |  |     end | 
		
	
		
			
				|  |  |  |  |     return ItemSelection.super.onInput(self, keys) | 
		
	
		
			
				|  |  |  |  | end | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | BuildingplanScreen = defclass(BuildingplanScreen, gui.ZScreen) | 
		
	
		
			
				|  |  |  |  | BuildingplanScreen.ATTRS { | 
		
	
		
			
				|  |  |  |  |     force_pause=true, | 
		
	
	
		
			
				
					|  |  |  | @ -265,27 +297,19 @@ ItemSelectionScreen.ATTRS { | 
		
	
		
			
				|  |  |  |  |     focus_path='buildingplan/itemselection', | 
		
	
		
			
				|  |  |  |  |     index=DEFAULT_NIL, | 
		
	
		
			
				|  |  |  |  |     on_submit=DEFAULT_NIL, | 
		
	
		
			
				|  |  |  |  |     on_cancel=DEFAULT_NIL, | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | function ItemSelectionScreen:init() | 
		
	
		
			
				|  |  |  |  |     self.selected_set = {} | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     self:addviews{ | 
		
	
		
			
				|  |  |  |  |         ItemSelection{ | 
		
	
		
			
				|  |  |  |  |             index=self.index, | 
		
	
		
			
				|  |  |  |  |             selected_set=self.selected_set, | 
		
	
		
			
				|  |  |  |  |             on_submit=self.on_submit, | 
		
	
		
			
				|  |  |  |  |             on_cancel=self.on_cancel, | 
		
	
		
			
				|  |  |  |  |         } | 
		
	
		
			
				|  |  |  |  |     } | 
		
	
		
			
				|  |  |  |  | end | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | function ItemSelectionScreen:onDismiss() | 
		
	
		
			
				|  |  |  |  |     local selected_items = {} | 
		
	
		
			
				|  |  |  |  |     for item_id in pairs(self.selected_set) do | 
		
	
		
			
				|  |  |  |  |         table.insert(selected_items, item_id) | 
		
	
		
			
				|  |  |  |  |     end | 
		
	
		
			
				|  |  |  |  |     self.on_submit(selected_items) | 
		
	
		
			
				|  |  |  |  | end | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | -------------------------------- | 
		
	
		
			
				|  |  |  |  | -- PlannerOverlay | 
		
	
		
			
				|  |  |  |  | -- | 
		
	
	
		
			
				
					|  |  |  | @ -714,20 +738,27 @@ function PlannerOverlay:onInput(keys) | 
		
	
		
			
				|  |  |  |  |                 end | 
		
	
		
			
				|  |  |  |  |                 local choose = self.subviews.choose | 
		
	
		
			
				|  |  |  |  |                 if choose.enabled() and choose:getOptionValue() then | 
		
	
		
			
				|  |  |  |  |                     local chosen_items = {} | 
		
	
		
			
				|  |  |  |  |                     local chosen_items, active_screens = {}, {} | 
		
	
		
			
				|  |  |  |  |                     local pending = num_filters | 
		
	
		
			
				|  |  |  |  |                     for idx = num_filters,1,-1 do | 
		
	
		
			
				|  |  |  |  |                         chosen_items[idx] = {} | 
		
	
		
			
				|  |  |  |  |                         if (self.subviews['item'..idx].available or 0) > 0 then | 
		
	
		
			
				|  |  |  |  |                             ItemSelectionScreen{ | 
		
	
		
			
				|  |  |  |  |                             active_screens[idx] = ItemSelectionScreen{ | 
		
	
		
			
				|  |  |  |  |                                 index=idx, | 
		
	
		
			
				|  |  |  |  |                                 on_submit=function(items) | 
		
	
		
			
				|  |  |  |  |                                     chosen_items[idx] = items | 
		
	
		
			
				|  |  |  |  |                                     active_screens[idx]:dismiss() | 
		
	
		
			
				|  |  |  |  |                                     active_screens[idx] = nil | 
		
	
		
			
				|  |  |  |  |                                     pending = pending - 1 | 
		
	
		
			
				|  |  |  |  |                                     if pending == 0 then | 
		
	
		
			
				|  |  |  |  |                                         self:place_building(pos, chosen_items) | 
		
	
		
			
				|  |  |  |  |                                     end | 
		
	
		
			
				|  |  |  |  |                                 end, | 
		
	
		
			
				|  |  |  |  |                                 on_cancel=function() | 
		
	
		
			
				|  |  |  |  |                                     for i,scr in pairs(active_screens) do | 
		
	
		
			
				|  |  |  |  |                                         scr:dismiss() | 
		
	
		
			
				|  |  |  |  |                                     end | 
		
	
		
			
				|  |  |  |  |                                 end, | 
		
	
		
			
				|  |  |  |  |                             }:show() | 
		
	
		
			
				|  |  |  |  |                         else | 
		
	
		
			
				|  |  |  |  |                             pending = pending - 1 | 
		
	
	
		
			
				
					|  |  |  | 
 |