local QUEST_POI_BUTTONS_MAX = { }; -- max of a button created
local QUEST_POI_BUTTONS_SELECTED = { }; -- selected button
QUEST_POI_SWAP_BUTTONS = { }; -- buttons that need to swap in (for QUEST_POI_COMPLETE_SWAP type)
QUEST_POI_ICONS_PER_ROW = 8;
QUEST_POI_ICON_SIZE = 0.125;
-- POI types
local QUEST_POI_MAX_TYPES = 4;
QUEST_POI_NUMERIC = 1; -- number within a circle
QUEST_POI_COMPLETE_IN = 2; -- completed quest icon within a normal circle
QUEST_POI_COMPLETE_OUT = 3; -- completed quest icon within a darker circle (quest outside current zone)
QUEST_POI_COMPLETE_SWAP = 4; -- completed quest icon without a circle that needs to be swapped on selection (for map)
-- POI text colors (offsets into texture)
local QUEST_POI_COLOR_BLACK = 0;
local QUEST_POI_COLOR_YELLOW = 0.5;
function QuestPOI_DisplayButton(parentName, buttonType, buttonIndex, questId)
local buttonName = "poi"..parentName..buttonType.."_"..buttonIndex;
local poiButton = _G[buttonName];
local swapButton;
if ( not poiButton ) then
if ( buttonType == QUEST_POI_COMPLETE_SWAP ) then
poiButton = CreateFrame("Button", buttonName, _G[parentName], "QuestPOICompletedTemplate");
if ( not QUEST_POI_SWAP_BUTTONS[parentName] ) then
swapButton = true;
end
else
poiButton = CreateFrame("Button", buttonName, _G[parentName], "QuestPOITemplate");
end
-- frame-specific stuff
if ( parentName == "WatchFrameLines" ) then
poiButton:SetScale(0.9);
poiButton:RegisterForClicks("LeftButtonUp", "RightButtonUp");
poiButton:SetScript("OnClick", WatchFrameQuestPOI_OnClick);
elseif ( parentName == "WorldMapPOIFrame" ) then
poiButton:SetScript("OnEnter", WorldMapQuestPOI_OnEnter);
poiButton:SetScript("OnLeave", WorldMapQuestPOI_OnLeave);
poiButton:SetScript("OnClick", WorldMapQuestPOI_OnClick);
if ( swapButton ) then
swapButton = CreateFrame("Button", "poi"..parentName.."_Swap", _G[parentName], "QuestPOITemplate");
QUEST_POI_SWAP_BUTTONS[parentName] = swapButton;
swapButton.type = buttonType;
swapButton:SetScript("OnEnter", WorldMapQuestPOI_OnEnter);
swapButton:SetScript("OnLeave", WorldMapQuestPOI_OnLeave);
swapButton:SetScript("OnClick", WorldMapQuestPOI_OnClick);
swapButton:SetFrameLevel(poiButton:GetFrameLevel() + 2);
swapButton.selectionGlow:Show();
swapButton.normalTexture:SetTexCoord(0.500, 0.625, 0.375, 0.5);
swapButton.pushedTexture:SetTexCoord(0.375, 0.500, 0.375, 0.5);
swapButton.highlightTexture:SetTexCoord(0.625, 0.750, 0.375, 0.5);
swapButton.turnin:Show();
swapButton.number:Hide();
end
end
-- *
poiButton.index = buttonIndex;
poiButton.type = buttonType;
poiButton.parentName = parentName;
QUEST_POI_BUTTONS_MAX[parentName..buttonType] = buttonIndex;
if ( buttonType == QUEST_POI_COMPLETE_IN ) then
poiButton.turnin:Show();
poiButton.number:Hide();
elseif ( buttonType == QUEST_POI_COMPLETE_OUT ) then
poiButton.turnin:Show();
poiButton.number:Hide();
poiButton.normalTexture:SetTexCoord(0.500, 0.625, 0.875, 1.0);
poiButton.pushedTexture:SetTexCoord(0.375, 0.500, 0.875, 1.0);
poiButton.highlightTexture:SetTexCoord(0.625, 0.750, 0.375, 0.5);
elseif ( buttonType == QUEST_POI_NUMERIC ) then
buttonIndex = buttonIndex - 1;
local yOffset = 0.5 + floor(buttonIndex / QUEST_POI_ICONS_PER_ROW) * QUEST_POI_ICON_SIZE;
local xOffset = mod(buttonIndex, QUEST_POI_ICONS_PER_ROW) * QUEST_POI_ICON_SIZE;
poiButton.number:SetTexCoord(xOffset, xOffset + QUEST_POI_ICON_SIZE, yOffset, yOffset + QUEST_POI_ICON_SIZE);
end
end
poiButton.questId = questId;
if ( poiButton.isSelected ) then
QuestPOI_DeselectButton(poiButton);
end
poiButton:Show();
return poiButton;
end
local function QuestPOI_FindButtonByQuestId(parentName, questId)
local poiButton;
local numButtons;
for i = 1, QUEST_POI_MAX_TYPES do
numButtons = QUEST_POI_BUTTONS_MAX[parentName..i];
if ( numButtons ) then
for j = 1, numButtons do
poiButton = _G["poi"..parentName..i.."_"..j];
if ( poiButton.questId == questId ) then
return poiButton;
end
end
end
end
end
function QuestPOI_SelectButtonByIndex(parentName, buttonType, buttonIndex)
QuestPOI_SelectButton(_G["poi"..parentName..buttonType.."_"..buttonIndex]);
end
function QuestPOI_SelectButtonByQuestId(parentName, questId, deselectOnFail)
local poiButton = QuestPOI_FindButtonByQuestId(parentName, questId);
if ( poiButton ) then
QuestPOI_SelectButton(poiButton);
elseif ( deselectOnFail ) then
poiButton = QUEST_POI_BUTTONS_SELECTED[parentName];
if ( poiButton ) then
QuestPOI_DeselectButton(poiButton);
end
end
end
function QuestPOI_SelectButton(poiButton)
if ( poiButton ) then
local parentName = poiButton.parentName;
if ( QUEST_POI_BUTTONS_SELECTED[parentName] ) then
-- return if already selected
if ( QUEST_POI_BUTTONS_SELECTED[parentName] == poiButton ) then
return;
else
QuestPOI_DeselectButton(QUEST_POI_BUTTONS_SELECTED[parentName]);
end
end
-- select
QUEST_POI_BUTTONS_SELECTED[parentName] = poiButton;
poiButton.isSelected = true;
if ( poiButton.type == QUEST_POI_NUMERIC ) then
poiButton.selectionGlow:Show();
poiButton.normalTexture:SetTexCoord(0.500, 0.625, 0.375, 0.5);
poiButton.pushedTexture:SetTexCoord(0.375, 0.500, 0.375, 0.5);
poiButton.highlightTexture:SetTexCoord(0.625, 0.750, 0.375, 0.5);
QuestPOI_SetTextColor(poiButton, QUEST_POI_COLOR_BLACK);
elseif ( poiButton.type == QUEST_POI_COMPLETE_IN ) then
poiButton.selectionGlow:Show();
poiButton.normalTexture:SetTexCoord(0.500, 0.625, 0.375, 0.5);
poiButton.pushedTexture:SetTexCoord(0.375, 0.500, 0.375, 0.5);
poiButton.highlightTexture:SetTexCoord(0.625, 0.750, 0.375, 0.5);
elseif ( poiButton.type == QUEST_POI_COMPLETE_OUT ) then
-- has no selected mode, should switch to QUEST_POI_COMPLETE_IN type upon being selected
elseif ( poiButton.type == QUEST_POI_COMPLETE_SWAP ) then
local swapButton = QUEST_POI_SWAP_BUTTONS[parentName];
swapButton:ClearAllPoints();
swapButton:SetPoint("CENTER", poiButton);
swapButton.quest = poiButton.quest;
swapButton:Show();
poiButton:Hide();
end
if ( not WorldMapFrame:IsShown() ) then
poiButton.selectionGlow:Hide();
end
end
end
function QuestPOI_DeselectButtonByParent(parentName)
QuestPOI_DeselectButton(QUEST_POI_BUTTONS_SELECTED[parentName]);
end
function QuestPOI_DeselectButton(poiButton)
if ( poiButton and poiButton.isSelected ) then
if ( poiButton.type == QUEST_POI_NUMERIC ) then
poiButton.selectionGlow:Hide();
poiButton.normalTexture:SetTexCoord(0.875, 1, 0.875, 1);
poiButton.pushedTexture:SetTexCoord(0.750, 0.875, 0.875, 1);
poiButton.highlightTexture:SetTexCoord(0.625, 0.750, 0.875, 1);
QuestPOI_SetTextColor(poiButton, QUEST_POI_COLOR_YELLOW);
elseif ( poiButton.type == QUEST_POI_COMPLETE_IN ) then
poiButton.selectionGlow:Hide();
poiButton.normalTexture:SetTexCoord(0.875, 1, 0.875, 1);
poiButton.pushedTexture:SetTexCoord(0.750, 0.875, 0.875, 1);
poiButton.highlightTexture:SetTexCoord(0.625, 0.750, 0.875, 1);
elseif ( poiButton.type == QUEST_POI_COMPLETE_OUT ) then
-- has no selected mode
elseif ( poiButton.type == QUEST_POI_COMPLETE_SWAP ) then
poiButton:Show();
QUEST_POI_SWAP_BUTTONS[poiButton.parentName]:Hide();
end
QUEST_POI_BUTTONS_SELECTED[poiButton.parentName] = nil;
poiButton.isSelected = false;
end
end
function QuestPOI_SetTextColor(poiButton, yOffset)
local index = poiButton.index - 1
yOffset = yOffset + floor(index / QUEST_POI_ICONS_PER_ROW) * QUEST_POI_ICON_SIZE;
local xOffset = mod(index, QUEST_POI_ICONS_PER_ROW) * QUEST_POI_ICON_SIZE;
poiButton.number:SetTexCoord(xOffset, xOffset + QUEST_POI_ICON_SIZE, yOffset, yOffset + QUEST_POI_ICON_SIZE);
end
function QuestPOI_HideButtons(parentName, buttonType, buttonIndex)
local numButtons;
numButtons = QUEST_POI_BUTTONS_MAX[parentName..buttonType];
if ( numButtons ) then
local poiButton;
local buttonName = "poi"..parentName..buttonType.."_";
for i = buttonIndex, numButtons do
poiButton = _G[buttonName..i];
if ( poiButton.isSelected and poiButton.type == QUEST_POI_COMPLETE_SWAP ) then
QuestPOI_DeselectButton(poiButton);
end
poiButton:Hide();
poiButton.questId = nil;
end
end
end
function QuestPOI_HideAllButtons(parentName)
local numButtons;
for i = 1, QUEST_POI_MAX_TYPES do
numButtons = QUEST_POI_BUTTONS_MAX[parentName..i];
if ( numButtons ) then
local poiButton;
local buttonName = "poi"..parentName..i.."_";
for j = 1, numButtons do
poiButton = _G[buttonName..j];
if ( poiButton.isSelected and poiButton.type == QUEST_POI_COMPLETE_SWAP ) then
QuestPOI_DeselectButton(poiButton);
end
poiButton:Hide();
poiButton.questId = nil;
end
end
end
end
function QuestPOIButton_OnMouseDown(self)
if ( self.isComplete ) then
self.turnin:SetPoint("CENTER", 0, -1);
else
self.number:SetPoint("CENTER", 1, -1);
end
end
function QuestPOIButton_OnMouseUp(self)
if ( self.isComplete ) then
self.turnin:SetPoint("CENTER", -1, 0);
else
self.number:SetPoint("CENTER", 0, 0);
end
end