local num_char --track character number drawing for, for positioning function RT.GRID_Remove_Expired() --- Prevent display for completely expired crafting chars. for k, _ in pairs(RT.SV.data.Craft) do if ((RT.SV.data.Craft[k][0].Simu_craft == 0 and RT.SV.data.Craft[k][1].Simu_craft == 0 and RT.SV.data.Craft[k][2].Simu_craft == 0)) then RT.SV.data.Craft[k] = nil if RT.debug then d("Expired char" .. k) end end end end function RT.GRID_Create() RT.UI.GRID_TLW= WINDOW_MANAGER:CreateTopLevelWindow("RT_GRID_TLW") RT.UI.GRID_TLW:SetClampedToScreen(false) RT.UI.GRID_TLW:SetMouseEnabled(true) RT.UI.GRID_TLW:SetDrawLayer(1) RT.UI.GRID_TLW:SetHidden(true) --/background RT.UI.GRID_BD = WINDOW_MANAGER:CreateControlFromVirtual("RT_GRID_BD",RT.UI.GRID_TLW, "ZO_DefaultBackdrop") -- Close Button RT.UI.GRID_BTN = WINDOW_MANAGER:CreateControl("RT_GRID_BTN" , RT.UI.GRID_TLW, CT_BUTTON) RT.UI.GRID_BTN:SetDimensions( 30 , 30 ) RT.UI.GRID_BTN:SetAnchor(TOPRIGHT,RT.UI.GRID_TLW,TOPRIGHT,5,-10) RT.UI.GRID_BTN:SetState( BSTATE_NORMAL ) -- RT.UI.GRID_BTN:SetMouseOverBlendMode(0) RT.UI.GRID_BTN:SetNormalTexture("/esoui/art/buttons/decline_down.dds") RT.UI.GRID_BTN:SetMouseOverTexture("/esoui/art/buttons/decline_up.dds") RT.UI.GRID_BTN:SetHandler( "OnClicked" , function(self) RT.UI.GRID_TLW:SetHidden(true); end ) for k, _ in pairs(RT.SV.data.Craft) do RT.GRID_Create_Character(k) end end function RT.GRID_Create_Character(k) local width = 360 local panelheight = 130 -- per character at 100% local prevcontrol, ctl_headers ctl_headers = {} -- controls at top of craft, indexed on craft if (num_char == nil) then num_char = 0 end RT.UI.GRID_WD[k] = {} -- Containing window for character data. We can then move it as a group RT.UI.GRID_WD[k].panel = WINDOW_MANAGER:CreateTopLevelWindow("RT_GRID_"..k.."_panel") RT.UI.GRID_WD[k].panel:SetParent(RT.UI.GRID_TLW) RT.UI.GRID_WD[k].panel:SetAnchor(TOPRIGHT,RT.UI.GRID_TLW,TOPRIGHT,0,panelheight*num_char) RT.UI.GRID_WD[k].panel:SetDimensions(width,panelheight) -- label for character name RT.UI.GRID_WD[k].label = WINDOW_MANAGER:CreateControl("RT_GRID_"..k.."_label",RT.UI.GRID_WD[k].panel,CT_LABEL) RT.UI.GRID_WD[k].label:SetFont(RT.font) RT.UI.GRID_WD[k].label:SetDimensions(width,20) RT.UI.GRID_WD[k].label:SetAnchor(TOPLEFT,RT.UI.GRID_WD[k].panel,TOPLEFT,0,0) RT.UI.GRID_WD[k].label:SetHorizontalAlignment(1) RT.UI.GRID_WD[k].label:SetText(string.upper(k)) prevcontrol = RT.UI.GRID_WD[k].label -- use this to anchor the next control, in this case the row of skill headers -- Create section headers with dummy text for each skill --blacksmithing RT.UI.GRID_WD[k][0] = {} RT.UI.GRID_WD[k][0][0] = {} RT.UI.GRID_WD[k][0][0]["BS_Icon"] = WINDOW_MANAGER:CreateControl("RT_GRID_"..k.."_0_icon",RT.UI.GRID_WD[k].panel,CT_TEXTURE) RT.UI.GRID_WD[k][0][0]["BS_Icon"]:SetHidden(false) RT.UI.GRID_WD[k][0][0]["BS_Icon"]:SetDimensions(20,20) RT.UI.GRID_WD[k][0][0]["BS_Icon"]:SetAnchor(TOPLEFT,prevcontrol,BOTTOMLEFT,0,5) -- below RT.UI.GRID_WD[k][0][0]["BS_Icon"]:SetTexture("/esoui/art/icons/ability_smith_007.dds") RT.UI.GRID_WD[k][0][0]["BS_Text"] = WINDOW_MANAGER:CreateControl("RT_GRID_"..k.."_0_text",RT.UI.GRID_WD[k].panel,CT_LABEL) RT.UI.GRID_WD[k][0][0]["BS_Text"]:SetHidden(false) RT.UI.GRID_WD[k][0][0]["BS_Text"]:SetFont(RT.font) RT.UI.GRID_WD[k][0][0]["BS_Text"]:SetDimensions(width/3,20) RT.UI.GRID_WD[k][0][0]["BS_Text"]:SetAnchor(TOPLEFT,RT.UI.GRID_WD[k][0][0]["BS_Icon"],TOPRIGHT,0,0) -- Side by the previous RT.UI.GRID_WD[k][0][0]["BS_Text"]:SetText(RT.L["Loading"]) ctl_headers[0] = RT.UI.GRID_WD[k][0][0]["BS_Icon"] --Clothing RT.UI.GRID_WD[k][1] = {} RT.UI.GRID_WD[k][1][0] = {} RT.UI.GRID_WD[k][1][0]["CL_Icon"] = WINDOW_MANAGER:CreateControl("RT_GRID_"..k.."_1_icon",RT.UI.GRID_WD[k].panel,CT_TEXTURE) RT.UI.GRID_WD[k][1][0]["CL_Icon"]:SetHidden(false) RT.UI.GRID_WD[k][1][0]["CL_Icon"]:SetDimensions(20,20) RT.UI.GRID_WD[k][1][0]["CL_Icon"]:SetAnchor(TOPLEFT,prevcontrol,BOTTOMLEFT,width/3,5) RT.UI.GRID_WD[k][1][0]["CL_Icon"]:SetTexture("/esoui/art/icons/ability_tradecraft_008.dds") RT.UI.GRID_WD[k][1][0]["CL_Text"] = WINDOW_MANAGER:CreateControl("RT_GRID_"..k.."_1_text",RT.UI.GRID_WD[k].panel,CT_LABEL) RT.UI.GRID_WD[k][1][0]["CL_Text"]:SetHidden(false) RT.UI.GRID_WD[k][1][0]["CL_Text"]:SetFont(RT.font) RT.UI.GRID_WD[k][1][0]["CL_Text"]:SetDimensions(width/3,20) RT.UI.GRID_WD[k][1][0]["CL_Text"]:SetAnchor(TOPLEFT,RT.UI.GRID_WD[k][1][0]["CL_Icon"],TOPRIGHT,0,0) RT.UI.GRID_WD[k][1][0]["CL_Text"]:SetText(RT.L["Loading"]) ctl_headers[1] = RT.UI.GRID_WD[k][1][0]["CL_Icon"] --Woodworking RT.UI.GRID_WD[k][2] = {} RT.UI.GRID_WD[k][2][0] = {} RT.UI.GRID_WD[k][2][0]["WO_Icon"] = WINDOW_MANAGER:CreateControl("RT_GRID_"..k.."_2_icon",RT.UI.GRID_WD[k].panel,CT_TEXTURE) RT.UI.GRID_WD[k][2][0]["WO_Icon"]:SetHidden(false) RT.UI.GRID_WD[k][2][0]["WO_Icon"]:SetDimensions(20,20) RT.UI.GRID_WD[k][2][0]["WO_Icon"]:SetAnchor(TOPLEFT,prevcontrol,BOTTOMLEFT,(width*2/3),5) RT.UI.GRID_WD[k][2][0]["WO_Icon"]:SetTexture("/esoui/art/icons/ability_tradecraft_009.dds") RT.UI.GRID_WD[k][2][0]["WO_Text"] = WINDOW_MANAGER:CreateControl("RT_GRID_"..k.."_2_text",RT.UI.GRID_WD[k].panel,CT_LABEL) RT.UI.GRID_WD[k][2][0]["WO_Text"]:SetHidden(false) RT.UI.GRID_WD[k][2][0]["WO_Text"]:SetFont(RT.font) RT.UI.GRID_WD[k][2][0]["WO_Text"]:SetDimensions(width,20) RT.UI.GRID_WD[k][2][0]["WO_Text"]:SetAnchor(TOPLEFT,RT.UI.GRID_WD[k][2][0]["WO_Icon"],TOPRIGHT,0,0) RT.UI.GRID_WD[k][2][0]["WO_Text"]:SetText(RT.L["Loading"]) ctl_headers[2] = RT.UI.GRID_WD[k][2][0]["WO_Icon"] for craft_id = 0, 2,1 do -- column prevcontrol=ctl_headers[craft_id] -- line up under this column for simcraft = 1, 3,1 do RT.UI.GRID_WD[k][craft_id][simcraft] = {} -- item icon RT.UI.GRID_WD[k][craft_id][simcraft]["item_icon"] = WINDOW_MANAGER:CreateControl("RT_GRID_"..k.."_"..craft_id.."_"..simcraft.."_icon",RT.UI.GRID_WD[k].panel,CT_TEXTURE) RT.UI.GRID_WD[k][craft_id][simcraft]["item_icon"]:SetHidden(true) RT.UI.GRID_WD[k][craft_id][simcraft]["item_icon"]:SetDimensions(20,20) RT.UI.GRID_WD[k][craft_id][simcraft]["item_icon"]:SetAnchor(TOPLEFT,prevcontrol,BOTTOMLEFT,0,0) --below RT.UI.GRID_WD[k][craft_id][simcraft]["item_icon"]:SetMouseEnabled(true) prevcontrol= RT.UI.GRID_WD[k][craft_id][simcraft]["item_icon"] -- trait icon RT.UI.GRID_WD[k][craft_id][simcraft]["trait_icon"] = WINDOW_MANAGER:CreateControl("RT_GRID_"..k.."_"..craft_id.."_"..simcraft.."_trait",RT.UI.GRID_WD[k].panel,CT_TEXTURE) RT.UI.GRID_WD[k][craft_id][simcraft]["trait_icon"]:SetHidden(true) RT.UI.GRID_WD[k][craft_id][simcraft]["trait_icon"]:SetDimensions(20,20) RT.UI.GRID_WD[k][craft_id][simcraft]["trait_icon"]:SetAnchor(TOPLEFT,prevcontrol,TOPRIGHT,0,0) --to right RT.UI.GRID_WD[k][craft_id][simcraft]["trait_icon"]:SetMouseEnabled(true) RT.UI.GRID_WD[k][craft_id][simcraft]["trait_icon"]:SetHandler("OnMouseExit", function (self) ZO_Tooltips_HideTextTooltip() end) prevcontrol=RT.UI.GRID_WD[k][craft_id][simcraft]["trait_icon"] -- text RT.UI.GRID_WD[k][craft_id][simcraft]["text"] = WINDOW_MANAGER:CreateControl("RT_GRID_"..k.."_"..craft_id.."_"..simcraft.."_text",RT.UI.GRID_WD[k].panel,CT_LABEL) RT.UI.GRID_WD[k][craft_id][simcraft]["text"]:SetHidden(true) RT.UI.GRID_WD[k][craft_id][simcraft]["text"]:SetFont(RT.font) RT.UI.GRID_WD[k][craft_id][simcraft]["text"]:SetDimensions(360,20) RT.UI.GRID_WD[k][craft_id][simcraft]["text"]:SetAnchor(TOPLEFT,prevcontrol,TOPRIGHT,0,0) --to right prevcontrol=RT.UI.GRID_WD[k][craft_id][simcraft]["item_icon"] -- set back to beginning of line end end num_char = num_char+1 RT.UI.GRID_TLW:SetDimensions(width,RT.UI.GRID_WD[k].panel:GetHeight()*num_char) end function RT.GRID_Update(timestamp) local emp_start, em_finish for k, _ in pairs(RT.SV.data.Craft) do -- if ( (RT.SV.data.Craft[k][0].Simu_craft ~= 0 or RT.SV.data.Craft[k][1].Simu_craft ~= 0 or RT.SV.data.Craft[k][2].Simu_craft ~= 0)) then for craft_id = 0, 2,1 do if (RT.SV.data.Craft[k][craft_id].MaxResearch ~= nil ) then local MaxResearch = RT.SV.data.Craft[k][craft_id].MaxResearch local Simu_craft = RT.SV.data.Craft[k][craft_id].Simu_craft if Simu_craft == MaxResearch then emp_start = "" --no highlighting em_finish = "" else emp_start = "|cFF0000" em_finish = "|r" end if (craft_id == 0) then RT.UI.GRID_WD[k][craft_id][0]["BS_Text"]:SetText(" "..emp_start .. Simu_craft.." / "..MaxResearch .. em_finish) elseif(craft_id == 1) then RT.UI.GRID_WD[k][craft_id][0]["CL_Text"]:SetText(" "..emp_start .. Simu_craft.." / "..MaxResearch .. em_finish) elseif(craft_id == 2) then RT.UI.GRID_WD[k][craft_id][0]["WO_Text"]:SetText(" "..emp_start .. Simu_craft.." / "..MaxResearch .. em_finish) end end for simcraft = 1, 3,1 do --erase the display, need when a research is completed. RT.UI.GRID_WD[k][craft_id][simcraft]["text"]:SetHidden(true) RT.UI.GRID_WD[k][craft_id][simcraft]["item_icon"]:SetHidden(true) RT.UI.GRID_WD[k][craft_id][simcraft]["trait_icon"]:SetHidden(true) if (RT.SV.data.Craft[k][craft_id].doing[simcraft] ~= nil)then RT.UI.GRID_WD[k][craft_id][simcraft]["item_icon"]:SetHidden(false) RT.UI.GRID_WD[k][craft_id][simcraft]["item_icon"]:SetTexture(RT.SV.data.Craft[k][craft_id].doing[simcraft]["Item_icon"]) RT.UI.GRID_WD[k][craft_id][simcraft]["trait_icon"]:SetHidden(false) RT.UI.GRID_WD[k][craft_id][simcraft]["trait_icon"]:SetTexture(RT.SV.data.Craft[k][craft_id].doing[simcraft]["Trait_icon"]) local currenttimer = RT.SV.data.Craft[k][craft_id].doing[simcraft]["EndTimeStamp"] - timestamp - 1 RT.UI.GRID_WD[k][craft_id][simcraft]["text"]:SetHidden(false) if (currenttimer > 0) then local tFormatted = FormatTimeSeconds(currenttimer, TIME_FORMAT_STYLE_COLONS, TIME_FORMAT_PRECISION_SECONDS, TIME_FORMAT_DIRECTION_DESCENDING) -- chop seconds RT.UI.GRID_WD[k][craft_id][simcraft]["text"]:SetText(string.sub(tFormatted, 1,string.len(tFormatted)-3)) else -- only triggers on display of not logged in chars. Current Char causes a data reload RT.UI.GRID_WD[k][craft_id][simcraft]["text"]:SetText(RT.L["Finished"]) RT.UI.GRID_WD[k].label:SetText("|cFF0000" .. string.upper(k) .."|r" ) end end end end -- end end RT.Set_Shortest() end function RT.Char_sort() -- Produce a sorted list for display RT.CharsInOrder = {} for k, _ in pairs(RT.SV.data.Craft) do table.insert(RT.CharsInOrder,k) end table.sort(RT.CharsInOrder, function (a,b) return RT.SV.data.Craft[a].shortest < RT.SV.data.Craft[b].shortest end) end -- move characters in grid function RT.GRID_Sort() local panelheight RT.Char_sort() panelheight = RT.UI.GRID_WD[RT.CharsInOrder[1]].panel:GetHeight() -- after scaling for k, v in ipairs(RT.CharsInOrder) do RT.UI.GRID_WD[v].panel:SetAnchor(TOPLEFT,RT.UI.GRID_TLW,TOPLEFT,0,panelheight*(k-1)) end RT.UI.GRID_TLW:SetHeight(table.getn(RT.CharsInOrder) * panelheight) end EVENT_MANAGER:RegisterForEvent(RT.name, EVENT_ADD_ON_LOADED, RT.Init)