Files
RecipeRadar/RadarTab.lua
T

499 lines
16 KiB
Lua

-- RadarTab.lua: handles clicking and drawing for the Radar tab
-- $Id: RadarTab.lua 443 2006-09-01 04:41:40Z jnmiller $
function RecipeRadar_RadarTab_Init()
RecipeRadar_Prof1DropDown:Show()
RecipeRadar_Prof2DropDown:Hide()
RecipeRadar_SetActiveTab(1)
RecipeRadar_RadarTab_Update()
RecipeRadarListScrollFrameScrollBar:SetValue(
RecipeRadarRadarTabFrame.ScrollValue)
end
function RecipeRadar_RadarTab_OnClick()
if (RecipeRadar_Options.ActiveTab == 1) then
return
end
PlaySound("igSpellBookClose")
RecipeRadar_RadarTab_Init()
end
function RecipeRadar_RadarTab_ExpandAll(expand)
local region = RecipeRadar_RegionData[RecipeRadar_Options.CurrentRegion]
if (not region) then return end
for _, vendor in region.Vendors do
vendor.IsExpanded = expand
end
RecipeRadar_SelectFirstRecipe()
RecipeRadar_FrameUpdate()
end
function RecipeRadar_RadarTab_Update()
if (RecipeRadar_Options.ActiveTab ~= 1) then
return
end
local title = RRS("Recipe Radar")
if (RecipeRadar_Options.CurrentRegion) then
title = title .. " - " .. RecipeRadar_Options.CurrentRegion
local parens = string.find(title, " %(")
if (parens) then -- remove parenthesized zone title
title = string.sub(title, 1, parens - 1)
end
end
TitleBarText:SetText(title)
-- some globals for the Update() procedure
RecipeRadar_row = 0
RecipeRadar_last_button = ""
RecipeRadar_ContextMenuGlobal.RadarTabHasExpanded = false
RecipeRadar_ContextMenuGlobal.RadarTabHasCollapsed = false
RecipeRadarHighlightFrame:Hide()
local region = RecipeRadar_RegionData[RecipeRadar_Options.CurrentRegion]
-- only populate the scroll frame if we have valid region data
if (region) then
RecipeRadar_SortVendors(region)
table.foreach(region.Vendors, RecipeRadar_RadarTab_AddVendor)
end
-- update the scroll position and the width of the highlight frame
FauxScrollFrame_Update(RecipeRadarListScrollFrame, RecipeRadar_row,
RECIPERADAR_VENDORS_DISPLAYED, RECIPERADAR_VENDOR_HEIGHT,
nil, nil, nil, RecipeRadarHighlightFrame, 361, 384)
-- update the widths of the vendor/recipe buttons after scroll update
for i = 1, RECIPERADAR_VENDORS_DISPLAYED do
local button = getglobal("RecipeRadarVendor" .. i)
if (i > RecipeRadar_row) then
button:Hide()
elseif (button.Recipe) then
if (RecipeRadarListScrollFrame:IsVisible()) then
button:SetWidth(361 - RECIPERADAR_VENDOR_OFFSET)
else
button:SetWidth(384 - RECIPERADAR_VENDOR_OFFSET)
end
else
if (RecipeRadarListScrollFrame:IsVisible()) then
button:SetWidth(361)
else
button:SetWidth(384)
end
end
end
-- update the current selection (or lack thereof)
if (not region or not RecipeRadarRadarTabFrame.SelectedRecipe) then
RecipeRadar_HideRecipeDetails()
elseif (RecipeRadarRadarTabFrame.SelectedVendor) then
RecipeRadar_SetSelection(RecipeRadarRadarTabFrame.SelectedVendor,
RecipeRadarRadarTabFrame.SelectedRecipe)
RecipeRadar_ShowRecipeDetails()
end
end
-- This function is called for each vendor during the main update. It
-- adds the vendor and her recipes, if appropriate, to the main scroll frame.
function RecipeRadar_RadarTab_AddVendor(key, vendor)
-- don't add the vendor if she or her recipes are filtered
if (vendor.IsFiltered or not RecipeRadar_VendorHasRecipes(vendor)) then
if (vendor.IsMapped) then
RecipeRadar_Maps_RemoveVendor(vendor)
end
return
end
RecipeRadar_row = RecipeRadar_row + 1
local offset = FauxScrollFrame_GetOffset(RecipeRadarListScrollFrame)
local index = RecipeRadar_row - offset
-- reset our radio button to red/off in case there are no listed vendors
RecipeRadarMapVendorIndicator:SetVertexColor(1.0, 0, 0)
-- only do the following if we're in the scroll frame's visible portion
if (index > 0 and index <= RECIPERADAR_VENDORS_DISPLAYED) then
local button = getglobal("RecipeRadarVendor" .. index)
-- decide the horizontal offset of this button
if (index == 1) then
button:SetPoint("TOPLEFT", "RecipeRadarFrame",
"TOPLEFT", 22, -96)
elseif (RecipeRadar_last_button == "recipe") then
button:SetPoint("TOPLEFT", "RecipeRadarVendor" .. index - 1,
"BOTTOMLEFT", -RECIPERADAR_VENDOR_OFFSET, 0)
elseif (RecipeRadar_last_button == "vendor") then
button:SetPoint("TOPLEFT", "RecipeRadarVendor" .. index - 1,
"BOTTOMLEFT", 0, 0)
end
-- this variable decides the next button's horizontal offset
RecipeRadar_last_button = "vendor"
-- basic drawing code
button:UnlockHighlight()
button:SetText(vendor.Name)
RecipeRadar_SetButtonColors(button, RecipeRadar_Teams[vendor.Team].Color)
button:SetID(index)
button:Show()
-- drawing code for the little subtext field
local subtext = getglobal("RecipeRadarVendor" .. index .. "SubText")
if (vendor.Notes and vendor.Notes ~= "") then
local note = RecipeRadar_FormatVendorNote(vendor.Notes, true)
VendorNameDummySubText:SetText(note .. " ")
subtext:SetText(note)
button.r = RecipeRadar_Teams[vendor.Team].Color.r
button.g = RecipeRadar_Teams[vendor.Team].Color.g
button.b = RecipeRadar_Teams[vendor.Team].Color.b
subtext:SetTextColor(
RecipeRadar_Teams[vendor.Team].Color.r,
RecipeRadar_Teams[vendor.Team].Color.g,
RecipeRadar_Teams[vendor.Team].Color.b)
subtext:SetPoint("LEFT", "RecipeRadarVendor" .. index .. "Text",
"RIGHT", 10, 0)
subtext:Show()
else
subtext:Hide()
end
-- show or hide the little mapped indicator check mark
local check = getglobal("RecipeRadarVendor" .. index .. "Check")
if (vendor.IsMapped) then
VendorNameDummyText:SetText(vendor.Name .. " ")
local check_offset = VendorNameDummyText:GetWidth() + 24
if (vendor.Notes and vendor.Notes ~= "") then
check_offset = check_offset + VendorNameDummySubText:GetWidth()
end
check:SetPoint("TOPLEFT", "RecipeRadarVendor" .. index, "TOPLEFT",
check_offset, 0)
check:Show()
else
check:Hide()
end
-- unset to indicate this is a vendor header for the tooltip stuff
button.Recipe = nil
-- icon highlight is different for vendors than recipes
getglobal("RecipeRadarVendor" .. index .. "Highlight"):SetTexture(
"Interface\\Buttons\\UI-PlusButton-Hilight")
if (vendor.IsExpanded ~= false) then
RecipeRadar_ContextMenuGlobal.RadarTabHasExpanded = true
button:SetNormalTexture("Interface\\Buttons\\UI-MinusButton-Up")
else
RecipeRadar_ContextMenuGlobal.RadarTabHasCollapsed = true
button:SetNormalTexture("Interface\\Buttons\\UI-PlusButton-Up")
return
end
else
-- if the vendor is collapsed, we don't need to count her recipes
if (vendor.IsExpanded == false) then
RecipeRadar_ContextMenuGlobal.RadarTabHasCollapsed = true
return
else
RecipeRadar_ContextMenuGlobal.RadarTabHasExpanded = true
end
end
RecipeRadar_SortRecipes(vendor)
for _, recipe in vendor.Recipes do
-- skip filtered recipes, of course
if (not RecipeRadar_IsRecipeFiltered(recipe)) then
RecipeRadar_row = RecipeRadar_row + 1
index = RecipeRadar_row - offset;
-- only do this if we're in the scroll frame's visible portion
if (index > 0 and index <= RECIPERADAR_VENDORS_DISPLAYED) then
local button = getglobal("RecipeRadarVendor" .. index)
-- decide the horizontal offset of this button
if (index == 1) then
button:SetPoint("TOPLEFT", "RecipeRadarFrame",
"TOPLEFT", 22 + RECIPERADAR_VENDOR_OFFSET, -96)
elseif (RecipeRadar_last_button == "recipe") then
button:SetPoint("TOPLEFT", "RecipeRadarVendor" .. index - 1,
"BOTTOMLEFT", 0, 0)
elseif (RecipeRadar_last_button == "vendor") then
button:SetPoint("TOPLEFT", "RecipeRadarVendor" .. index - 1,
"BOTTOMLEFT", RECIPERADAR_VENDOR_OFFSET, 0)
end
-- this variable decides the next button's horizontal offset
RecipeRadar_last_button = "recipe"
-- generic list item drawing
RecipeRadar_DrawListItem(index, recipe)
-- radar tab-specific list item drawing
button:SetNormalTexture(RecipeRadar_Professions[recipe.Type].Icon)
getglobal("RecipeRadarVendor" .. index .. "Check"):Hide()
getglobal("RecipeRadarVendor" .. index .. "Highlight"):
SetTexture(RECIPERADAR_IMAGE_ROOT .. "Icons\\Highlight")
-- selected recipes look a little bit different
if (RecipeRadarRadarTabFrame.SelectedRecipe == recipe) then
RecipeRadarHighlightFrame:SetPoint("TOPLEFT",
"RecipeRadarVendor" .. index, "TOPLEFT", -22, 0)
RecipeRadarHighlightFrame:Show()
button:LockHighlight()
else
button:UnlockHighlight()
end
end
end
end
end
-- Handles a vendor/recipe button click in the main scroll frame. The
-- supplied index is row + offset in the scroll frame. index may also
-- be set to -1 to select the first visible recipe.
function RecipeRadar_RadarTab_ServiceClickIndex(index, button)
local region = RecipeRadar_RegionData[RecipeRadar_Options.CurrentRegion]
if (not region) then return end
if (not button) then button = "LeftButton" end
-- save this index so we can return to it on tab switch
RecipeRadarRadarTabFrame.SelectedIndex = index
-- sort the vendors so we're counting in the right order
RecipeRadar_SortVendors(region)
local row = 0
-- iterate through each vendor, counting up to index
for _, vendor in region.Vendors do
-- if this vendor is filtered, she does not count towards our index
if (not vendor.IsFiltered and RecipeRadar_VendorHasRecipes(vendor)) then
row = row + 1
if (row == index) then
if (button == "LeftButton") then
-- if the shift key is down, the user wants to (un)map this vendor
if (IsShiftKeyDown()) then
if (vendor.IsMapped) then
RecipeRadar_Maps_RemoveVendor(vendor)
else
RecipeRadar_Maps_AddVendor(vendor,
RecipeRadar_Options.CurrentRegion)
end
-- otherwise, we collapse or expand the vendor button
else
RecipeRadar_RadarTab_ToggleExpanded(vendor)
end
return
elseif (button == "RightButton") then
HideDropDownMenu(1)
RecipeRadar_ContextMenuGlobal.Vendor = vendor
RecipeRadar_RadarTab_ContextMenuOnLoad()
ToggleDropDownMenu(1, nil, RadarTabDropDown,
this:GetName(), GetCursorPosition(), 0)
return
end
end
if (vendor.IsExpanded ~= false) then
-- sort the recipes so we're counting in the right order
RecipeRadar_SortRecipes(vendor)
local vendor_index = row
-- iterate through each recipe, counting up to index
for _, recipe in vendor.Recipes do
-- don't count filtered recipes
if (not RecipeRadar_IsRecipeFiltered(recipe)) then
row = row + 1
-- if index is -1, this catches on the first iteration
if (row == index or index == -1) then
if (button == "LeftButton") then
-- if the shift key is down, we map this recipe's vendor
if (IsShiftKeyDown()) then
if (vendor.IsMapped) then
RecipeRadar_Maps_RemoveVendor(vendor)
else
RecipeRadar_Maps_AddVendor(vendor,
RecipeRadar_Options.CurrentRegion)
end
end
-- otherwise, select this recipe and show its details
RecipeRadarRadarTabFrame.SelectedVendor = vendor
RecipeRadarRadarTabFrame.SelectedRecipe = recipe
RecipeRadar_SetSelection(vendor, recipe)
RecipeRadar_ShowRecipeDetails()
return
elseif (button == "RightButton") then
HideDropDownMenu(1)
RecipeRadar_ContextMenuGlobal.Vendor = vendor
RecipeRadar_RadarTab_ContextMenuOnLoad()
ToggleDropDownMenu(1, nil, RadarTabDropDown,
this:GetName(), GetCursorPosition(), 0)
return
end
end
end
end
end
end
end
-- if the index was not found, select nothing
RecipeRadar_RadarTab_ClearSelection()
RecipeRadar_HideRecipeDetails()
end
function RecipeRadar_RadarTab_ToggleExpanded(vendor)
if (vendor.IsExpanded == false) then
vendor.IsExpanded = true
else
vendor.IsExpanded = false
end
RecipeRadar_RadarTab_ClearSelection()
RecipeRadar_FrameUpdate()
end
function RecipeRadar_RadarTab_ClearSelection()
RecipeRadarRadarTabFrame.SelectedVendor = nil
RecipeRadarRadarTabFrame.SelectedRecipe = nil
end
-- OnLoad event handler for the right-click context menu for map buttons.
function RecipeRadar_RadarTab_ContextMenuOnLoad()
UIDropDownMenu_Initialize(RadarTabDropDown,
RecipeRadar_RadarTab_ContextMenuInit, "MENU")
end
-- Initialization routine for the right-click context menu for map buttons.
function RecipeRadar_RadarTab_ContextMenuInit()
if (not RecipeRadar_ContextMenuGlobal.Vendor) then return end
-- putting in the vendor's name as the title of the popup
local item = { }
item.text = RecipeRadar_ContextMenuGlobal.Vendor.Name
item.isTitle = 1
item.notCheckable = 1
UIDropDownMenu_AddButton(item)
item = { }
if (RecipeRadar_ContextMenuGlobal.Vendor.IsMapped) then
item.text = RRS("Unmap Vendor")
item.value = "unmap"
else
item.text = RRS("Map Vendor")
item.value = "map"
end
item.notCheckable = 1
item.func = RecipeRadar_RadarTab_ContextMenuOnClick
UIDropDownMenu_AddButton(item)
item = { }
item.text = RRS("Expand All")
item.value = "expandall"
item.notCheckable = 1
item.func = RecipeRadar_RadarTab_ContextMenuOnClick
if (not RecipeRadar_ContextMenuGlobal.RadarTabHasCollapsed) then
item.disabled = 1
end
UIDropDownMenu_AddButton(item)
item = { }
item.text = RRS("Collapse All")
item.value = "collapseall"
item.notCheckable = 1
item.func = RecipeRadar_RadarTab_ContextMenuOnClick
if (not RecipeRadar_ContextMenuGlobal.RadarTabHasExpanded) then
item.disabled = 1
end
UIDropDownMenu_AddButton(item)
item = { }
item.text = CANCEL
item.notCheckable = 1
item.func = RecipeRadar_RadarTab_ContextMenuOnClick
UIDropDownMenu_AddButton(item)
end
-- OnClick event handler for the right-click context menu for map buttons.
function RecipeRadar_RadarTab_ContextMenuOnClick()
if (this.value == "unmap") then
RecipeRadar_Maps_RemoveVendor(RecipeRadar_ContextMenuGlobal.Vendor)
RecipeRadar_FrameUpdate()
elseif (this.value == "map") then
RecipeRadar_Maps_AddVendor(RecipeRadar_ContextMenuGlobal.Vendor,
RecipeRadar_Options.CurrentRegion)
RecipeRadar_FrameUpdate()
elseif (this.value == "expandall") then
RecipeRadar_RadarTab_ExpandAll(true)
elseif (this.value == "collapseall") then
RecipeRadar_RadarTab_ExpandAll(false)
end
end