Files
RecipeRadar/DropDowns.lua
T

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