mirror of
https://github.com/MarkuruThunderhoof/RecipeRadar.git
synced 2026-09-22 07:26:56 +00:00
547 lines
15 KiB
Lua
547 lines
15 KiB
Lua
|
|
-- DropDowns.lua: code concerned the dropdowns and corresponding filters
|
|
-- $Id: DropDowns.lua 433 2006-08-31 20:22:07Z jnmiller $
|
|
|
|
function RecipeRadar_DropDowns_Init()
|
|
|
|
-- can't use the OnLoad events because we use saved variables
|
|
RecipeRadar_TeamDropDown_OnLoad()
|
|
RecipeRadar_Prof1DropDown_OnLoad()
|
|
RecipeRadar_RealmAvailDropDown_OnLoad()
|
|
RecipeRadar_Prof2DropDown_OnLoad()
|
|
RecipeRadar_PersonAvailDropDown_OnLoad()
|
|
|
|
-- initialize the recipe filters and recipe tab icon
|
|
RecipeRadar_SetProf2Filter(RecipeRadar_Options.CurrentProfession)
|
|
|
|
if (RecipeRadar_Options.RealmAvailability) then
|
|
return RecipeRadar_RealmAvailDropDown:Show()
|
|
else
|
|
return RecipeRadar_PersonAvailDropDown:Show()
|
|
end
|
|
|
|
end
|
|
|
|
-----------------------------------------------------------------------------
|
|
-- Realm-wide availability drop down and filtering
|
|
-----------------------------------------------------------------------------
|
|
|
|
function RecipeRadar_RealmAvailDropDown_OnLoad()
|
|
|
|
local dropdown = getglobal("RecipeRadar_RealmAvailDropDown")
|
|
UIDropDownMenu_Initialize(dropdown, RecipeRadar_RealmAvailDropDown_Init)
|
|
UIDropDownMenu_SetText(RRS("Availability"), dropdown)
|
|
UIDropDownMenu_SetWidth(135, RecipeRadar_RealmAvailDropDown)
|
|
|
|
end
|
|
|
|
function RecipeRadar_RealmAvailDropDown_Init()
|
|
|
|
-- sort our drop down list by table-specified order
|
|
local t = { }
|
|
for key, val in RecipeRadar_Availabilities do
|
|
t[val.DropDown.ROrder] = key
|
|
end
|
|
|
|
for _, key in t do
|
|
|
|
local info = RecipeRadar_Availabilities[key]
|
|
local checked, item = nil, { }
|
|
|
|
item.text = RecipeRadar_ColorToCode(info.Color) ..
|
|
info.Text .. FONT_COLOR_CODE_CLOSE
|
|
item.value = key
|
|
item.func = RecipeRadar_RealmAvailDropDown_OnClick
|
|
item.checked = not RecipeRadar_IsRealmAvailFiltered(key)
|
|
item.keepShownOnClick = 1
|
|
|
|
UIDropDownMenu_AddButton(item)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
function RecipeRadar_RealmAvailDropDown_OnClick()
|
|
|
|
-- the logic here seems backwards, doesn't it?
|
|
if (UIDropDownMenuButton_GetChecked()) then
|
|
RecipeRadar_SetRealmAvailFilter(this.value, true)
|
|
else
|
|
RecipeRadar_SetRealmAvailFilter(this.value, false)
|
|
end
|
|
|
|
RecipeRadarListScrollFrameScrollBar:SetValue(0)
|
|
|
|
end
|
|
|
|
function RecipeRadar_IsRealmAvailFiltered(avail)
|
|
|
|
return RecipeRadar_Filters.RealmAvails[avail]
|
|
|
|
end
|
|
|
|
function RecipeRadar_SetRealmAvailFilter(avail, is_filtered)
|
|
|
|
RecipeRadar_Filters.RealmAvails[avail] = is_filtered
|
|
-- we filter out vendors here to keep the Update() quick
|
|
RecipeRadar_FilterVendors("avail", avail, is_filtered)
|
|
RecipeRadar_FilterRecipes("avail", avail, is_filtered)
|
|
RecipeRadar_FrameUpdate()
|
|
|
|
end
|
|
|
|
-----------------------------------------------------------------------------
|
|
-- Personal availability drop down and filtering
|
|
-----------------------------------------------------------------------------
|
|
|
|
function RecipeRadar_PersonAvailDropDown_OnLoad()
|
|
|
|
local dropdown = getglobal("RecipeRadar_PersonAvailDropDown")
|
|
UIDropDownMenu_Initialize(dropdown, RecipeRadar_PersonAvailDropDown_Init)
|
|
UIDropDownMenu_SetText(RRS("Availability"), dropdown)
|
|
UIDropDownMenu_SetWidth(135, RecipeRadar_PersonAvailDropDown)
|
|
|
|
end
|
|
|
|
function RecipeRadar_PersonAvailDropDown_Init()
|
|
|
|
-- sort our drop down list by table-specified order
|
|
local t = { }
|
|
for key, val in RecipeRadar_Availabilities do
|
|
if (val.DropDown.POrder) then
|
|
t[val.DropDown.POrder] = key
|
|
end
|
|
end
|
|
|
|
for _, key in t do
|
|
|
|
local info = RecipeRadar_Availabilities[key]
|
|
local checked, item = nil, { }
|
|
|
|
item.text = RecipeRadar_ColorToCode(info.Color) ..
|
|
info.Text .. FONT_COLOR_CODE_CLOSE
|
|
item.value = key
|
|
item.func = RecipeRadar_PersonAvailDropDown_OnClick
|
|
item.checked = not RecipeRadar_IsPersonAvailFiltered(key)
|
|
item.keepShownOnClick = 1
|
|
|
|
UIDropDownMenu_AddButton(item)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
function RecipeRadar_PersonAvailDropDown_OnClick()
|
|
|
|
-- the logic here seems backwards, doesn't it?
|
|
if (UIDropDownMenuButton_GetChecked()) then
|
|
RecipeRadar_SetPersonAvailFilter(this.value, true)
|
|
else
|
|
RecipeRadar_SetPersonAvailFilter(this.value, false)
|
|
end
|
|
|
|
RecipeRadarListScrollFrameScrollBar:SetValue(0)
|
|
|
|
end
|
|
|
|
function RecipeRadar_IsPersonAvailFiltered(avail)
|
|
|
|
return RecipeRadar_Filters.PersonAvails[avail]
|
|
|
|
end
|
|
|
|
function RecipeRadar_SetPersonAvailFilter(avail, is_filtered)
|
|
|
|
RecipeRadar_Filters.PersonAvails[avail] = is_filtered
|
|
-- we filter out vendors here to keep the Update() quick
|
|
RecipeRadar_FilterVendors("avail", avail, is_filtered)
|
|
RecipeRadar_FilterRecipes("avail", avail, is_filtered)
|
|
RecipeRadar_FrameUpdate()
|
|
|
|
end
|
|
|
|
-- Generic tester for those who don't care about the current mode.
|
|
function RecipeRadar_IsAvailabilityFiltered(avail)
|
|
|
|
if (RecipeRadar_Options.RealmAvailability) then
|
|
return RecipeRadar_IsRealmAvailFiltered(avail)
|
|
else
|
|
return RecipeRadar_IsPersonAvailFiltered(avail)
|
|
end
|
|
|
|
end
|
|
|
|
-----------------------------------------------------------------------------
|
|
-- Teams/factions drop down and filtering
|
|
-----------------------------------------------------------------------------
|
|
|
|
function RecipeRadar_TeamDropDown_OnLoad()
|
|
|
|
local dropdown = getglobal("RecipeRadar_TeamDropDown")
|
|
UIDropDownMenu_Initialize(dropdown, RecipeRadar_TeamDropDown_Init)
|
|
UIDropDownMenu_SetText(RRS("Factions"), dropdown)
|
|
UIDropDownMenu_SetWidth(112, RecipeRadar_TeamDropDown)
|
|
|
|
end
|
|
|
|
function RecipeRadar_TeamDropDown_Init()
|
|
|
|
-- sort our drop down list by table key
|
|
local t = { }
|
|
table.foreach(RecipeRadar_Teams,
|
|
function (k) table.insert(t, k) end)
|
|
table.sort(t)
|
|
|
|
for _, key in t do
|
|
|
|
local info = RecipeRadar_Teams[key]
|
|
local checked, item = nil, { }
|
|
|
|
item.text = RecipeRadar_ColorToCode(info.Color) ..
|
|
info.Name .. FONT_COLOR_CODE_CLOSE
|
|
item.value = key
|
|
item.func = RecipeRadar_TeamDropDown_OnClick
|
|
item.checked = not RecipeRadar_IsTeamFiltered(key)
|
|
item.keepShownOnClick = 1
|
|
|
|
UIDropDownMenu_AddButton(item)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
function RecipeRadar_TeamDropDown_OnClick()
|
|
|
|
-- the logic here seems backwards, doesn't it?
|
|
if (UIDropDownMenuButton_GetChecked()) then
|
|
RecipeRadar_SetTeamFilter(this.value, true)
|
|
else
|
|
RecipeRadar_SetTeamFilter(this.value, false)
|
|
end
|
|
|
|
RecipeRadarListScrollFrameScrollBar:SetValue(0)
|
|
|
|
end
|
|
|
|
function RecipeRadar_IsTeamFiltered(team)
|
|
|
|
return RecipeRadar_Filters.Teams[team]
|
|
|
|
end
|
|
|
|
function RecipeRadar_SetTeamFilter(team, is_filtered)
|
|
|
|
RecipeRadar_Filters.Teams[team] = is_filtered
|
|
-- we filter out vendors here to keep the Update() quick
|
|
RecipeRadar_FilterVendors("team", team, is_filtered)
|
|
RecipeRadar_FilterRecipes("team", team, is_filtered)
|
|
RecipeRadar_FrameUpdate()
|
|
|
|
end
|
|
|
|
-----------------------------------------------------------------------------
|
|
-- Multi-select professions drop down and filtering (for radar tab)
|
|
-----------------------------------------------------------------------------
|
|
|
|
function RecipeRadar_Prof1DropDown_OnLoad()
|
|
|
|
local dropdown = getglobal("RecipeRadar_Prof1DropDown")
|
|
UIDropDownMenu_Initialize(dropdown, RecipeRadar_Prof1DropDown_Init)
|
|
UIDropDownMenu_SetText(RRS("Professions"), dropdown)
|
|
UIDropDownMenu_SetWidth(135, RecipeRadar_Prof1DropDown)
|
|
|
|
end
|
|
|
|
function RecipeRadar_Prof1DropDown_Init()
|
|
|
|
-- sort our drop down list by table key
|
|
local t = { }
|
|
table.foreach(RecipeRadar_Professions,
|
|
function (k) table.insert(t, k) end)
|
|
table.sort(t)
|
|
|
|
for _, key in t do
|
|
|
|
local info = RecipeRadar_Professions[key]
|
|
local checked, item = nil, { }
|
|
|
|
item.text = info.Name
|
|
item.value = key
|
|
item.func = RecipeRadar_Prof1DropDown_OnClick
|
|
item.checked = not RecipeRadar_IsProfFiltered(key)
|
|
item.keepShownOnClick = 1
|
|
|
|
UIDropDownMenu_AddButton(item)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
function RecipeRadar_Prof1DropDown_OnClick()
|
|
|
|
-- the logic here seems backwards, doesn't it?
|
|
if (UIDropDownMenuButton_GetChecked()) then
|
|
RecipeRadar_SetProfFilter(this.value, true)
|
|
else
|
|
RecipeRadar_SetProfFilter(this.value, false)
|
|
end
|
|
|
|
RecipeRadarListScrollFrameScrollBar:SetValue(0)
|
|
|
|
end
|
|
|
|
function RecipeRadar_IsProfFiltered(prof)
|
|
|
|
return RecipeRadar_Filters.Professions[prof]
|
|
|
|
end
|
|
|
|
function RecipeRadar_SetProfFilter(prof, is_filtered)
|
|
|
|
RecipeRadar_Filters.Professions[prof] = is_filtered
|
|
-- we filter out vendors here to keep the Update() quick
|
|
RecipeRadar_FilterVendors("prof", prof, is_filtered)
|
|
RecipeRadar_FrameUpdate()
|
|
|
|
end
|
|
|
|
-----------------------------------------------------------------------------
|
|
-- Single-select professions drop down and filtering (for recipes tab)
|
|
-----------------------------------------------------------------------------
|
|
|
|
function RecipeRadar_Prof2DropDown_OnLoad()
|
|
|
|
local dropdown = getglobal("RecipeRadar_Prof2DropDown")
|
|
UIDropDownMenu_Initialize(dropdown, RecipeRadar_Prof2DropDown_Init)
|
|
UIDropDownMenu_SetText(RRS("Professions"), dropdown)
|
|
UIDropDownMenu_SetWidth(135, RecipeRadar_Prof2DropDown)
|
|
|
|
end
|
|
|
|
function RecipeRadar_Prof2DropDown_Init()
|
|
|
|
-- sort our drop down list by table key
|
|
local t = { }
|
|
table.foreach(RecipeRadar_Professions,
|
|
function (k) table.insert(t, k) end)
|
|
table.sort(t)
|
|
|
|
for _, key in t do
|
|
|
|
local info = RecipeRadar_Professions[key]
|
|
local checked, item = nil, { }
|
|
|
|
if (RecipeRadar_IsCurrentProfession(key)) then
|
|
checked = 1
|
|
end
|
|
|
|
item.text = info.Name
|
|
item.value = key
|
|
item.func = RecipeRadar_Prof2DropDown_OnClick
|
|
item.checked = checked
|
|
|
|
UIDropDownMenu_AddButton(item)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
function RecipeRadar_Prof2DropDown_OnClick()
|
|
|
|
UIDropDownMenu_SetSelectedID(RecipeRadar_Prof2DropDown, this:GetID())
|
|
RecipeRadar_SetProf2Filter(this.value)
|
|
RecipeRadarListScrollFrameScrollBar:SetValue(0)
|
|
|
|
end
|
|
|
|
function RecipeRadar_IsCurrentProfession(prof)
|
|
|
|
return RecipeRadar_Options.CurrentProfession == prof
|
|
|
|
end
|
|
|
|
function RecipeRadar_SetProf2Filter(prof)
|
|
|
|
RecipeRadarRecipesTabFrame:SetNormalTexture(
|
|
RecipeRadar_Professions[prof].Icon)
|
|
RecipeRadar_Options.CurrentProfession = prof
|
|
RecipeRadar_InitRecipeFilters()
|
|
RecipeRadar_FrameUpdate()
|
|
|
|
end
|
|
|
|
-----------------------------------------------------------------------------
|
|
-- Radar tab filtering code
|
|
-----------------------------------------------------------------------------
|
|
|
|
-- Checks for recipe filtering by either profession or availability.
|
|
function RecipeRadar_IsRecipeFiltered(recipe)
|
|
|
|
return recipe.IsFilteredByTeam or recipe.IsFilteredByProfession or
|
|
recipe.IsFilteredByAvailability
|
|
|
|
end
|
|
|
|
-- Iterate through all vendors or recipes and set their filter state.
|
|
-- This function is only useful for the radar tab, not the recipes tab.
|
|
-- filter_type is one of 'team', 'prof' or 'avail', filter_on is the
|
|
-- key on which to filter (eg. "Horde"), and is_filtered is the new state.
|
|
function RecipeRadar_FilterVendors(filter_type, filter_on, is_filtered)
|
|
|
|
local region = RecipeRadar_RegionData[RecipeRadar_Options.CurrentRegion]
|
|
if (not region) then return end
|
|
|
|
for _, vendor in region.Vendors do
|
|
|
|
-- this bit filters vendors by their team
|
|
if (filter_type == "team" and filter_on == vendor.Team) then
|
|
|
|
vendor.IsFiltered = is_filtered
|
|
|
|
-- if the to-be-filtered vendor is "active", unselect her
|
|
if (RecipeRadarRadarTabFrame.SelectedVendor == vendor) then
|
|
RecipeRadar_RadarTab_ClearSelection()
|
|
end
|
|
|
|
-- this bit filters recipes by their profession
|
|
elseif (filter_type == "prof") then
|
|
|
|
for _, recipe in vendor.Recipes do
|
|
|
|
if (filter_on == recipe.Type) then
|
|
|
|
recipe.IsFilteredByProfession = is_filtered
|
|
|
|
-- if the to-be-filtered recipe is selected, unselect it
|
|
if (RecipeRadarRadarTabFrame.SelectedRecipe == recipe) then
|
|
RecipeRadar_RadarTab_ClearSelection()
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
-- this bit filters recipes by their availability state
|
|
elseif (filter_type == "avail") then
|
|
|
|
for _, recipe in vendor.Recipes do
|
|
|
|
if (filter_on == RecipeRadar_Availability_GetKey(recipe)) then
|
|
|
|
recipe.IsFilteredByAvailability = is_filtered
|
|
|
|
-- if the to-be-filtered recipe is selected, unselect it
|
|
if (RecipeRadarRadarTabFrame.SelectedRecipe == recipe) then
|
|
RecipeRadar_RadarTab_ClearSelection()
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
-- Initializes vendor/recipe filters according to saved filter settings.
|
|
function RecipeRadar_InitVendorFilters()
|
|
|
|
local region = RecipeRadar_RegionData[RecipeRadar_Options.CurrentRegion]
|
|
if (not region) then return end
|
|
|
|
for _, vendor in region.Vendors do
|
|
|
|
-- set team filter
|
|
vendor.IsFiltered = RecipeRadar_IsTeamFiltered(vendor.Team)
|
|
|
|
for _, recipe in vendor.Recipes do
|
|
|
|
-- set profession filter
|
|
recipe.IsFilteredByProfession =
|
|
RecipeRadar_IsProfFiltered(recipe.Type)
|
|
|
|
-- set availability filter (the 'true') and auto-map if necessary
|
|
if (RecipeRadar_Availability_IsLearnable(recipe, true) and
|
|
RecipeRadar_Options.AutoMapVendors) then
|
|
RecipeRadar_Maps_AddVendor(vendor,
|
|
RecipeRadar_Options.CurrentRegion)
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
-----------------------------------------------------------------------------
|
|
-- Recipes tab filtering code
|
|
-----------------------------------------------------------------------------
|
|
|
|
-- Iterate through all recipes and set their filter state.
|
|
-- This function is only useful for the recipes tab, not the radar tab.
|
|
-- filter_type is one of 'team' or 'avail', filter_on is the
|
|
-- key on which to filter (eg. "Horde"), and is_filtered is the new state.
|
|
function RecipeRadar_FilterRecipes(filter_type, filter_on, is_filtered)
|
|
|
|
local prof = RecipeRadar_RecipeData[RecipeRadar_Options.CurrentProfession]
|
|
|
|
for _, recipe in prof.Recipes do
|
|
|
|
-- this bit filters recipes by their availability state
|
|
if (filter_type == "avail" and
|
|
filter_on == RecipeRadar_Availability_GetKey(recipe)) then
|
|
|
|
recipe.IsFilteredByAvailability = is_filtered
|
|
|
|
-- if the to-be-filtered recipe is "active", unselect it
|
|
if (RecipeRadarRecipesTabFrame.SelectedRecipe == recipe) then
|
|
RecipeRadar_RecipesTab_ClearSelection()
|
|
end
|
|
|
|
-- this bit filters vendors by their team
|
|
elseif (filter_type == "team") then
|
|
|
|
for _, location in recipe.Locations do
|
|
|
|
if (filter_on == location.Team) then
|
|
|
|
location.IsFiltered = is_filtered
|
|
|
|
-- if the to-be-filtered recipe is selected, unselect it
|
|
if (RecipeRadarRecipesTabFrame.SelectedLocation ==
|
|
location.Region) then
|
|
RecipeRadar_RecipesTab_ClearSelection()
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
-- Initializes vendor/recipe filters according to saved filter settings.
|
|
function RecipeRadar_InitRecipeFilters()
|
|
|
|
local prof = RecipeRadar_RecipeData[RecipeRadar_Options.CurrentProfession]
|
|
if (not prof) then return end
|
|
|
|
for _, recipe in prof.Recipes do
|
|
|
|
-- set availability filter (the 'true')
|
|
RecipeRadar_Availability_SetAvailabilityFilter(recipe)
|
|
|
|
for _, location in recipe.Locations do
|
|
-- set team filter
|
|
location.IsFiltered = RecipeRadar_IsTeamFiltered(location.Team)
|
|
end
|
|
|
|
end
|
|
|
|
end
|