You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

185 lines
7.8 KiB

local addonId, platerInternal = ...
local Plater = Plater
---@type detailsframework
local DF = DetailsFramework
local _
local TAB_INDEX_SEARCH = 26
function platerInternal.CreateSearchOptions()
local searchFrame = PlaterOptionsPanelContainerSearchFrame
local OTTFrame = PlaterNameplatesOverTheTopFrame
local mainFrame = PlaterOptionsPanelContainer
--before creating the search options, we need to create load all other tabs that has load on demand and did not load yet
searchFrame.TabsToLoad_Funtions = {}
local bHasLoadOnDemand = false
for tabName, bLoadState in pairs(platerInternal.LoadOnDemand_IsLoaded) do
if (not bLoadState) then
if (platerInternal.CreateSearchOptions ~= platerInternal.LoadOnDemand_LoadFunc[tabName]) then
table.insert(searchFrame.TabsToLoad_Funtions, platerInternal.LoadOnDemand_LoadFunc[tabName])
bHasLoadOnDemand = true
end
end
end
--check if there's any tab to load and if it's not already loading
if (bHasLoadOnDemand and not searchFrame.bIsLoadingOnDemand) then
searchFrame.bIsLoadingOnDemand = true
--execute the load function for each tab with a delay of 50ms
local totalTabsToLoad = #searchFrame.TabsToLoad_Funtions
for i = 1, totalTabsToLoad do
local func = searchFrame.TabsToLoad_Funtions[i]
if (i == 1) then
C_Timer.After(0, func)
else
C_Timer.After(0.05 * i, func)
end
end
if (not searchFrame.TimeBar) then
local texture = [[Interface\AddOns\Plater\images\bar_skyline]]
local timeBar = DF:CreateTimeBar(searchFrame, texture, 500, 30, 0, "timeBarLoadOnDemand", "$parentLoadOnDemandTimeBar")
timeBar:SetPoint("center", 0, 0)
timeBar:SetHook("OnTimerEnd", function()
timeBar:Hide()
platerInternal.CreateSearchOptions()
end)
searchFrame.TimeBar = timeBar
end
searchFrame.TimeBar:SetTimer((totalTabsToLoad + 1) * 0.05)
return
end
if (bHasLoadOnDemand) then
--there still some tabs to load, wait for them to load
searchFrame.TimeBar:SetTimer(0.05)
return
end
--already loaded? return
if (platerInternal.LoadOnDemand_IsLoaded.SearchOptions) then
return
end
local startX, startY, heightSize = 10, platerInternal.optionsYStart, 755
local highlightColorLastCombat = {1, 1, .2, .25}
--templates
local options_text_template = DF:GetTemplate ("font", "OPTIONS_FONT_TEMPLATE")
local options_dropdown_template = DF:GetTemplate ("dropdown", "OPTIONS_DROPDOWN_TEMPLATE")
local options_switch_template = DF:GetTemplate ("switch", "OPTIONS_CHECKBOX_TEMPLATE")
local options_slider_template = DF:GetTemplate ("slider", "OPTIONS_SLIDER_TEMPLATE")
local options_button_template = DF:GetTemplate ("button", "OPTIONS_BUTTON_TEMPLATE")
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--~search panel
local searchBox = DF:CreateTextEntry (searchFrame, function()end, 156, 20, "serachTextEntry", _, _, DF:GetTemplate ("dropdown", "PLATER_DROPDOWN_OPTIONS"))
searchBox:SetAsSearchBox()
searchBox:SetJustifyH("left")
searchBox:SetPoint(10, -145)
--create a search box in the main tab
local mainSearchBox = DF:CreateTextEntry(OTTFrame, function()end, 156, 20, "mainSearchTextEntry", _, _, DF:GetTemplate("dropdown", "PLATER_DROPDOWN_OPTIONS"))
mainSearchBox:SetAsSearchBox()
mainSearchBox:SetJustifyH("left")
mainSearchBox:SetPoint("topright", -220, 0)
local optionsWildCardFrame = CreateFrame("frame", "$parentWildCardOptionsFrame", searchFrame, BackdropTemplateMixin and "BackdropTemplate")
optionsWildCardFrame:SetAllPoints()
--all settings tables
local allTabSettings = PlaterOptionsPanelFrame.AllSettingsTable
local allTabHeaders = { --~changeindex2
mainFrame.AllButtons [1].button.text:GetText(), -- general
mainFrame.AllButtons [2].button.text:GetText(), -- threat & aggro
mainFrame.AllButtons [3].button.text:GetText(), -- target
mainFrame.AllButtons [4].button.text:GetText(), -- cast bar
mainFrame.AllButtons [5].button.text:GetText(), -- level & strata
mainFrame.AllButtons [8].button.text:GetText(), -- personal bar
mainFrame.AllButtons [9].button.text:GetText(), -- buff settings
--10 aura filter
mainFrame.AllButtons [11].button.text:GetText(), -- buff special
--mainFrame.AllButtons [12].button.text:GetText(), -- ghost auras
mainFrame.AllButtons [13].button.text:GetText(), -- enemy npc
mainFrame.AllButtons [14].button.text:GetText(), -- enemy player
mainFrame.AllButtons [15].button.text:GetText(), -- friendly npc
mainFrame.AllButtons [16].button.text:GetText(), -- friendly player
--17 18 19 has no options (npc colors, cast colors, aura list)
--mainFrame.AllButtons [20].button.text:GetText(), -- spell feedback (animations)
mainFrame.AllButtons [21].button.text:GetText(), -- auto
--22 profiles
mainFrame.AllButtons [23].button.text:GetText(), -- advanced
--mainFrame.AllButtons [24].button.text:GetText(), -- resources
--25 search
}
--this table will hold all options
local allOptions = {}
--start the fill process filling 'allOptions' with each individual option from each tab
for i = 1, #allTabSettings do
local tabSettings = allTabSettings[i]
local lastLabel = nil
for k, setting in pairs(tabSettings) do
if (type(setting) == "table") then
if (setting.type == "label") then
lastLabel = setting
end
if (setting.name) then
allOptions[#allOptions+1] = {setting = setting, label = lastLabel, header = allTabHeaders[i] }
end
end
end
end
searchBox:SetHook("OnEnterPressed", function(self)
local options = {}
local searchingText = string.lower(searchBox.text)
searchBox:SetFocus(false)
local lastTab = nil
local lastLabel = nil
if searchingText and searchingText ~= "" then
for i = 1, #allOptions do
local optionData = allOptions[i]
local optionName = string.lower(optionData.setting.name)
if (optionName:find(searchingText)) then
if optionData.header ~= lastTab then
if lastTab ~= nil then
options[#options+1] = {type = "label", get = function() return "" end, text_template = DF:GetTemplate("font", "OPTIONS_FONT_TEMPLATE")} -- blank
end
options[#options+1] = {type = "label", get = function() return optionData.header end, text_template = {color = "gold", size = 14, font = DF:GetBestFontForLanguage()}}
lastTab = optionData.header
lastLabel = nil
end
if optionData.label ~= lastLabel then
options[#options+1] = optionData.label
lastLabel = optionData.label
end
options[#options+1] = optionData.setting
end
end
end
options.always_boxfirst = true
options.language_addonId = addonId
options.Name = "Plater Search Options"
DF:BuildMenuVolatile(searchFrame, options, startX, startY-30, heightSize+40, false, options_text_template, options_dropdown_template, options_switch_template, true, options_slider_template, options_button_template, platerInternal.OptionsGlobalCallback)
end)
mainSearchBox:SetHook("OnEnterPressed", function(self)
local searchText = mainSearchBox.text
searchBox:SetText(searchText)
searchBox:RunHooksForWidget("OnEnterPressed")
_G["PlaterOptionsPanelContainer"]:SelectTabByIndex(TAB_INDEX_SEARCH)
end)
platerInternal.LoadOnDemand_IsLoaded.SearchOptions = true
end