z_mirror/flib
git clone https://git.raiguard.me/z_mirror/flib
a9f2be7
trunk
1local flib_math =require ( "__flib__.math" ) 2local flib_gui =require ( "__flib__.gui" ) 3local flib_table =require ( "__flib__.table" ) 4local flib_technology =require ( "__flib__.technology" ) 5 6local flib_gui_templates ={} 7 8--- Create and return a technology slot. `on_click` must be a registered GUI handler through `gui-lite`. 9--- @param parent LuaGuiElement 10--- @param technology LuaTechnology 11--- @param level uint 12--- @param research_state TechnologyResearchState 13--- @param on_click flib.GuiElemHandler? 14--- @param tags Tags? 15--- @param index uint? 16--- @return LuaGuiElement 17function flib_gui_templates . technology_slot ( parent , technology , level , research_state , on_click , tags , index ) 18local technology_prototype =technology . prototype 19 20local is_multilevel =flib_technology . is_multilevel ( technology ) 21 22local research_state_str =flib_table . find ( flib_technology . research_state , research_state ) 23local style ="flib_technology_slot_" .. research_state_str 24if technology . upgrade or is_multilevel or technology_prototype . level > 1 then 25style =style .. "_multilevel" 26end 27 28local base =parent . add ( { 29type ="sprite-button" , 30style =style , 31elem_tooltip ={ type ="technology" , name =technology . name } , 32tags =tags , 33index =index , 34} ) 35if on_click then 36base . tags =flib_gui . format_handlers ( { [ defines . events . on_gui_click ] =on_click } , tags ) 37end 38base 39. add ( { type ="flow" , name ="icon_flow" , style ="flib_technology_slot_sprite_flow" , ignored_by_interaction =true } ) 40. add ( { 41type ="sprite" , 42name ="icon" , 43style ="flib_technology_slot_sprite" , 44sprite ="technology/" .. technology . name , 45} ) 46 47if technology . upgrade or is_multilevel or technology_prototype . level > 1 then 48base . add ( { 49type ="label" , 50name ="level_label" , 51style ="flib_technology_slot_level_label_" .. research_state_str , 52caption =level , 53ignored_by_interaction =true , 54} ) 55end 56if is_multilevel then 57local max_level =technology_prototype . max_level 58local max_level_str =max_level == flib_math . max_uint and "[img=infinity]" or tostring ( max_level ) 59base . add ( { 60type ="label" , 61name ="level_range_label" , 62style ="flib_technology_slot_level_range_label_" .. research_state_str , 63caption =technology_prototype . level .. " - " .. max_level_str , 64ignored_by_interaction =true , 65} ) 66end 67 68local ingredients_flow =base . add ( { 69type ="flow" , 70style ="flib_technology_slot_ingredients_flow" , 71ignored_by_interaction =true , 72} ) 73 74local ingredients =technology . research_unit_ingredients 75local ingredients_len =# ingredients 76for i =1 , ingredients_len do 77local ingredient =ingredients [ i ] 78ingredients_flow . add ( { 79type ="sprite" , 80style ="flib_technology_slot_ingredient" , 81sprite ="item/" .. ingredient . name , 82ignored_by_interaction =true , 83} ) 84end 85ingredients_flow . style . horizontal_spacing =flib_math . clamp (( 68 - 16 ) / ( ingredients_len - 1 ) - 16 , - 15 , - 5 ) 86 87local progress =flib_technology . get_research_progress ( technology , level ) 88 89base . add ( { 90type ="progressbar" , 91name ="progressbar" , 92style ="flib_technology_slot_progressbar" , 93value =progress , 94visible =progress > 0 , 95ignored_by_interaction =true , 96} ) 97 98return base 99end 100 101return flib_gui_templates