mirror of
https://github.com/MarkuruThunderhoof/RecipeRadar.git
synced 2026-09-21 23:16:55 +00:00
499 lines
16 KiB
Lua
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
|