241 lines
8.8 KiB
Lua
241 lines
8.8 KiB
Lua
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: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
|
|
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();
|
|
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();
|
|
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 |