2889 lines
96 KiB
Lua
2889 lines
96 KiB
Lua
UIPanelWindows["AchievementFrame"] = { area = "doublewide", pushable = 0, width = 840, xoffset = 80, whileDead = 1 };
|
|
|
|
ACHIEVEMENTUI_CATEGORIES = {};
|
|
|
|
ACHIEVEMENTUI_GOLDBORDER_R = 1;
|
|
ACHIEVEMENTUI_GOLDBORDER_G = 0.675;
|
|
ACHIEVEMENTUI_GOLDBORDER_B = 0.125;
|
|
ACHIEVEMENTUI_GOLDBORDER_A = 1;
|
|
|
|
ACHIEVEMENTUI_REDBORDER_R = 0.7;
|
|
ACHIEVEMENTUI_REDBORDER_G = 0.15;
|
|
ACHIEVEMENTUI_REDBORDER_B = 0.05;
|
|
ACHIEVEMENTUI_REDBORDER_A = 1;
|
|
|
|
ACHIEVEMENTUI_CATEGORIESWIDTH = 175;
|
|
|
|
ACHIEVEMENTUI_PROGRESSIVEHEIGHT = 50;
|
|
ACHIEVEMENTUI_PROGRESSIVEWIDTH = 42;
|
|
|
|
ACHIEVEMENTUI_MAX_SUMMARY_ACHIEVEMENTS = 4;
|
|
|
|
ACHIEVEMENTUI_MAXCONTENTWIDTH = 330;
|
|
local ACHIEVEMENTUI_FONTHEIGHT; -- set in AchievementButton_OnLoad
|
|
local ACHIEVEMENTUI_MAX_LINES_COLLAPSED = 3; -- can show 3 lines of text when achievement is collapsed
|
|
|
|
ACHIEVEMENTUI_DEFAULTSUMMARYACHIEVEMENTS = {6, 503, 116, 545, 1017};
|
|
|
|
ACHIEVEMENT_CATEGORY_NORMAL_R = 0;
|
|
ACHIEVEMENT_CATEGORY_NORMAL_G = 0;
|
|
ACHIEVEMENT_CATEGORY_NORMAL_B = 0;
|
|
ACHIEVEMENT_CATEGORY_NORMAL_A = .9;
|
|
|
|
ACHIEVEMENT_CATEGORY_HIGHLIGHT_R = 0;
|
|
ACHIEVEMENT_CATEGORY_HIGHLIGHT_G = .6;
|
|
ACHIEVEMENT_CATEGORY_HIGHLIGHT_B = 0;
|
|
ACHIEVEMENT_CATEGORY_HIGHLIGHT_A = .65;
|
|
|
|
ACHIEVEMENTBUTTON_LABELWIDTH = 320;
|
|
|
|
ACHIEVEMENT_COMPARISON_SUMMARY_ID = -1
|
|
ACHIEVEMENT_COMPARISON_STATS_SUMMARY_ID = -2
|
|
|
|
ACHIEVEMENT_FILTER_ALL = 1;
|
|
ACHIEVEMENT_FILTER_COMPLETE = 2;
|
|
ACHIEVEMENT_FILTER_INCOMPLETE = 3;
|
|
|
|
local FEAT_OF_STRENGTH_ID = 81;
|
|
|
|
local trackedAchievements = {};
|
|
local function updateTrackedAchievements (...)
|
|
local count = select("#", ...);
|
|
|
|
for i = 1, count do
|
|
trackedAchievements[select(i, ...)] = true;
|
|
end
|
|
end
|
|
|
|
|
|
-- [[ AchievementFrame ]] --
|
|
|
|
function AchievementFrame_ToggleAchievementFrame(toggleStatFrame)
|
|
AchievementFrameComparison:Hide();
|
|
AchievementFrameTab_OnClick = AchievementFrameBaseTab_OnClick;
|
|
if ( not toggleStatFrame ) then
|
|
if ( AchievementFrame:IsShown() and AchievementFrame.selectedTab == 1 ) then
|
|
HideUIPanel(AchievementFrame);
|
|
else
|
|
ShowUIPanel(AchievementFrame);
|
|
AchievementFrameTab_OnClick(1);
|
|
end
|
|
return;
|
|
end
|
|
if ( AchievementFrame:IsShown() and AchievementFrame.selectedTab == 2 ) then
|
|
HideUIPanel(AchievementFrame);
|
|
else
|
|
ShowUIPanel(AchievementFrame);
|
|
AchievementFrameTab_OnClick(2);
|
|
end
|
|
end
|
|
|
|
function AchievementFrame_DisplayComparison (unit)
|
|
AchievementFrame.wasShown = nil;
|
|
AchievementFrameTab_OnClick = AchievementFrameComparisonTab_OnClick;
|
|
AchievementFrameTab_OnClick(1);
|
|
ShowUIPanel(AchievementFrame);
|
|
--AchievementFrame_ShowSubFrame(AchievementFrameComparison, AchievementFrameSummary);
|
|
AchievementFrameComparison_SetUnit(unit);
|
|
AchievementFrameComparison_ForceUpdate();
|
|
end
|
|
|
|
function AchievementFrame_OnLoad (self)
|
|
PanelTemplates_SetNumTabs(self, 2);
|
|
self.selectedTab = 1;
|
|
PanelTemplates_UpdateTabs(self);
|
|
end
|
|
|
|
function AchievementFrame_OnShow (self)
|
|
PlaySound("AchievementMenuOpen");
|
|
AchievementFrameHeaderPoints:SetText(GetTotalAchievementPoints());
|
|
if ( not AchievementFrame.wasShown ) then
|
|
AchievementFrame.wasShown = true;
|
|
AchievementCategoryButton_OnClick(AchievementFrameCategoriesContainerButton1);
|
|
end
|
|
UpdateMicroButtons();
|
|
AchievementFrame_LoadTextures();
|
|
end
|
|
|
|
function AchievementFrame_OnHide (self)
|
|
PlaySound("AchievementMenuClose");
|
|
UpdateMicroButtons();
|
|
AchievementFrame_ClearTextures();
|
|
end
|
|
|
|
function AchievementFrame_ForceUpdate ()
|
|
if ( AchievementFrameAchievements:IsShown() ) then
|
|
AchievementFrameAchievements_ForceUpdate();
|
|
elseif ( AchievementFrameStats:IsShown() ) then
|
|
AchievementFrameStats_Update();
|
|
elseif ( AchievementFrameComparison:IsShown() ) then
|
|
AchievementFrameComparison_ForceUpdate();
|
|
end
|
|
end
|
|
|
|
function AchievementFrameBaseTab_OnClick (id)
|
|
PanelTemplates_Tab_OnClick(_G["AchievementFrameTab"..id], AchievementFrame);
|
|
|
|
local isSummary = false
|
|
if ( id == 1 ) then
|
|
achievementFunctions = ACHIEVEMENT_FUNCTIONS;
|
|
AchievementFrameCategories_GetCategoryList(ACHIEVEMENTUI_CATEGORIES); -- This needs to happen before AchievementFrame_ShowSubFrame (fix for bug 157885)
|
|
if ( achievementFunctions.selectedCategory == "summary" ) then
|
|
isSummary = true;
|
|
AchievementFrame_ShowSubFrame(AchievementFrameSummary);
|
|
else
|
|
AchievementFrame_ShowSubFrame(AchievementFrameAchievements);
|
|
end
|
|
AchievementFrameWaterMark:SetTexture("Interface\\AchievementFrame\\UI-Achievement-AchievementWatermark");
|
|
else
|
|
achievementFunctions = STAT_FUNCTIONS;
|
|
AchievementFrameCategories_GetCategoryList(ACHIEVEMENTUI_CATEGORIES);
|
|
if ( achievementFunctions.selectedCategory == "summary" ) then
|
|
AchievementFrame_ShowSubFrame(AchievementFrameStats);
|
|
achievementFunctions.selectedCategory = ACHIEVEMENT_COMPARISON_STATS_SUMMARY_ID;
|
|
AchievementFrameStatsContainerScrollBar:SetValue(0);
|
|
else
|
|
AchievementFrame_ShowSubFrame(AchievementFrameStats);
|
|
end
|
|
AchievementFrameWaterMark:SetTexture("Interface\\AchievementFrame\\UI-Achievement-StatWatermark");
|
|
end
|
|
|
|
AchievementFrameCategories_Update();
|
|
|
|
if ( not isSummary ) then
|
|
achievementFunctions.updateFunc();
|
|
end
|
|
end
|
|
|
|
AchievementFrameTab_OnClick = AchievementFrameBaseTab_OnClick;
|
|
|
|
function AchievementFrameComparisonTab_OnClick (id)
|
|
if ( id == 1 ) then
|
|
achievementFunctions = COMPARISON_ACHIEVEMENT_FUNCTIONS;
|
|
AchievementFrame_ShowSubFrame(AchievementFrameComparison, AchievementFrameComparisonContainer);
|
|
AchievementFrameWaterMark:SetTexture("Interface\\AchievementFrame\\UI-Achievement-AchievementWatermark");
|
|
else
|
|
achievementFunctions = COMPARISON_STAT_FUNCTIONS;
|
|
AchievementFrame_ShowSubFrame(AchievementFrameComparison, AchievementFrameComparisonStatsContainer);
|
|
AchievementFrameWaterMark:SetTexture("Interface\\AchievementFrame\\UI-Achievement-StatWatermark");
|
|
end
|
|
|
|
AchievementFrameCategories_GetCategoryList(ACHIEVEMENTUI_CATEGORIES);
|
|
AchievementFrameCategories_Update();
|
|
PanelTemplates_Tab_OnClick(_G["AchievementFrameTab"..id], AchievementFrame);
|
|
|
|
achievementFunctions.updateFunc();
|
|
end
|
|
|
|
ACHIEVEMENTFRAME_SUBFRAMES = {
|
|
"AchievementFrameSummary",
|
|
"AchievementFrameAchievements",
|
|
"AchievementFrameStats",
|
|
"AchievementFrameComparison",
|
|
"AchievementFrameComparisonContainer",
|
|
"AchievementFrameComparisonStatsContainer"
|
|
};
|
|
|
|
function AchievementFrame_ShowSubFrame(...)
|
|
local subFrame, show;
|
|
for _, name in next, ACHIEVEMENTFRAME_SUBFRAMES do
|
|
subFrame = _G[name];
|
|
show = false;
|
|
for i=1, select("#", ...) do
|
|
if ( subFrame == select(i, ...)) then
|
|
show = true
|
|
end
|
|
end
|
|
if ( show ) then
|
|
subFrame:Show();
|
|
else
|
|
subFrame:Hide();
|
|
end
|
|
end
|
|
end
|
|
|
|
-- [[ AchievementFrameCategories ]] --
|
|
|
|
function AchievementFrameCategories_OnLoad (self)
|
|
self:SetBackdropBorderColor(ACHIEVEMENTUI_GOLDBORDER_R, ACHIEVEMENTUI_GOLDBORDER_G, ACHIEVEMENTUI_GOLDBORDER_B, ACHIEVEMENTUI_GOLDBORDER_A);
|
|
self.buttons = {};
|
|
self:RegisterEvent("ADDON_LOADED");
|
|
self:SetScript("OnEvent", AchievementFrameCategories_OnEvent);
|
|
end
|
|
|
|
function AchievementFrameCategories_OnEvent (self, event, ...)
|
|
if ( event == "ADDON_LOADED" ) then
|
|
local addonName = ...;
|
|
if ( addonName and addonName ~= "Blizzard_AchievementUI" ) then
|
|
return;
|
|
end
|
|
|
|
AchievementFrameCategories_GetCategoryList(ACHIEVEMENTUI_CATEGORIES);
|
|
|
|
AchievementFrameCategoriesContainerScrollBar.Show =
|
|
function (self)
|
|
ACHIEVEMENTUI_CATEGORIESWIDTH = 175;
|
|
AchievementFrameCategories:SetWidth(175);
|
|
AchievementFrameCategoriesContainer:GetScrollChild():SetWidth(175);
|
|
AchievementFrameAchievements:SetPoint("TOPLEFT", "$parentCategories", "TOPRIGHT", 22, 0);
|
|
AchievementFrameStats:SetPoint("TOPLEFT", "$parentCategories", "TOPRIGHT", 22, 0);
|
|
AchievementFrameComparison:SetPoint("TOPLEFT", "$parentCategories", "TOPRIGHT", 22, 0)
|
|
AchievementFrameWaterMark:SetWidth(145);
|
|
AchievementFrameWaterMark:SetTexCoord(0, 145/256, 0, 1);
|
|
for _, button in next, AchievementFrameCategoriesContainer.buttons do
|
|
AchievementFrameCategories_DisplayButton(button, button.element)
|
|
end
|
|
getmetatable(self).__index.Show(self);
|
|
end
|
|
|
|
AchievementFrameCategoriesContainerScrollBar.Hide =
|
|
function (self)
|
|
ACHIEVEMENTUI_CATEGORIESWIDTH = 197;
|
|
AchievementFrameCategories:SetWidth(197);
|
|
AchievementFrameCategoriesContainer:GetScrollChild():SetWidth(197);
|
|
AchievementFrameAchievements:SetPoint("TOPLEFT", "$parentCategories", "TOPRIGHT", 0, 0);
|
|
AchievementFrameStats:SetPoint("TOPLEFT", "$parentCategories", "TOPRIGHT", 0, 0);
|
|
AchievementFrameComparison:SetPoint("TOPLEFT", "$parentCategories", "TOPRIGHT", 0, 0)
|
|
AchievementFrameWaterMark:SetWidth(167);
|
|
AchievementFrameWaterMark:SetTexCoord(0, 167/256, 0, 1);
|
|
for _, button in next, AchievementFrameCategoriesContainer.buttons do
|
|
AchievementFrameCategories_DisplayButton(button, button.element);
|
|
end
|
|
getmetatable(self).__index.Hide(self);
|
|
end
|
|
|
|
AchievementFrameCategoriesContainerScrollBarBG:Show();
|
|
AchievementFrameCategoriesContainer.update = AchievementFrameCategories_Update;
|
|
HybridScrollFrame_CreateButtons(AchievementFrameCategoriesContainer, "AchievementCategoryTemplate", 0, 0, "TOP", "TOP", 0, 0, "TOP", "BOTTOM");
|
|
AchievementFrameCategories_Update();
|
|
self:UnregisterEvent(event)
|
|
end
|
|
end
|
|
|
|
function AchievementFrameCategories_OnShow (self)
|
|
AchievementFrameCategories_Update();
|
|
end
|
|
|
|
function AchievementFrameCategories_GetCategoryList (categories)
|
|
local cats = achievementFunctions.categoryAccessor();
|
|
|
|
for i in next, categories do
|
|
categories[i] = nil;
|
|
end
|
|
-- Insert the fake Summary category
|
|
tinsert(categories, { ["id"] = "summary" });
|
|
|
|
for i, id in next, cats do
|
|
local _, parent = GetCategoryInfo(id);
|
|
if ( parent == -1 ) then
|
|
tinsert(categories, { ["id"] = id });
|
|
end
|
|
end
|
|
|
|
local _, parent;
|
|
for i = #cats, 1, -1 do
|
|
_, parent = GetCategoryInfo(cats[i]);
|
|
for j, category in next, categories do
|
|
if ( category.id == parent ) then
|
|
category.parent = true;
|
|
category.collapsed = true;
|
|
tinsert(categories, j+1, { ["id"] = cats[i], ["parent"] = category.id, ["hidden"] = true});
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
local displayCategories = {};
|
|
function AchievementFrameCategories_Update ()
|
|
local scrollFrame = AchievementFrameCategoriesContainer
|
|
|
|
local categories = ACHIEVEMENTUI_CATEGORIES;
|
|
local offset = HybridScrollFrame_GetOffset(scrollFrame);
|
|
local buttons = scrollFrame.buttons;
|
|
|
|
local displayCategories = displayCategories;
|
|
|
|
for i in next, displayCategories do
|
|
displayCategories[i] = nil;
|
|
end
|
|
|
|
local selection = achievementFunctions.selectedCategory;
|
|
if ( selection == ACHIEVEMENT_COMPARISON_SUMMARY_ID or selection == ACHIEVEMENT_COMPARISON_STATS_SUMMARY_ID ) then
|
|
selection = "summary";
|
|
end
|
|
|
|
local parent;
|
|
if ( selection ) then
|
|
for i, category in next, categories do
|
|
if ( category.id == selection ) then
|
|
parent = category.parent;
|
|
end
|
|
end
|
|
end
|
|
|
|
for i, category in next, categories do
|
|
if ( not category.hidden ) then
|
|
tinsert(displayCategories, category);
|
|
elseif ( parent and category.id == parent ) then
|
|
category.collapsed = false;
|
|
tinsert(displayCategories, category);
|
|
elseif ( parent and category.parent and category.parent == parent ) then
|
|
category.hidden = false;
|
|
tinsert(displayCategories, category);
|
|
end
|
|
end
|
|
|
|
local numCategories = #displayCategories;
|
|
local numButtons = #buttons;
|
|
|
|
local totalHeight = numCategories * buttons[1]:GetHeight();
|
|
local displayedHeight = 0;
|
|
|
|
local element
|
|
for i = 1, numButtons do
|
|
element = displayCategories[i + offset];
|
|
displayedHeight = displayedHeight + buttons[i]:GetHeight();
|
|
if ( element ) then
|
|
AchievementFrameCategories_DisplayButton(buttons[i], element);
|
|
if ( selection and element.id == selection ) then
|
|
buttons[i]:LockHighlight();
|
|
else
|
|
buttons[i]:UnlockHighlight();
|
|
end
|
|
buttons[i]:Show();
|
|
else
|
|
buttons[i].element = nil;
|
|
buttons[i]:Hide();
|
|
end
|
|
end
|
|
|
|
HybridScrollFrame_Update(scrollFrame, totalHeight, displayedHeight);
|
|
|
|
return displayCategories;
|
|
end
|
|
|
|
function AchievementFrameCategories_DisplayButton (button, element)
|
|
if ( not element ) then
|
|
button.element = nil;
|
|
button:Hide();
|
|
return;
|
|
end
|
|
|
|
button:Show();
|
|
if ( type(element.parent) == "number" ) then
|
|
button:SetWidth(ACHIEVEMENTUI_CATEGORIESWIDTH - 25);
|
|
button.label:SetFontObject("GameFontHighlight");
|
|
button.parentID = element.parent;
|
|
button.background:SetVertexColor(0.6, 0.6, 0.6);
|
|
else
|
|
button:SetWidth(ACHIEVEMENTUI_CATEGORIESWIDTH - 10);
|
|
button.label:SetFontObject("GameFontNormal");
|
|
button.parentID = element.parent;
|
|
button.background:SetVertexColor(1, 1, 1);
|
|
end
|
|
|
|
local categoryName, parentID, flags;
|
|
local numAchievements, numCompleted;
|
|
|
|
local id = element.id;
|
|
|
|
-- kind of janky
|
|
if ( id == "summary" ) then
|
|
categoryName = ACHIEVEMENT_SUMMARY_CATEGORY;
|
|
numAchievements, numCompleted = GetNumCompletedAchievements();
|
|
else
|
|
categoryName, parentID, flags = GetCategoryInfo(id);
|
|
numAchievements, numCompleted = AchievementFrame_GetCategoryTotalNumAchievements(id, true);
|
|
end
|
|
button.label:SetText(categoryName);
|
|
button.categoryID = id;
|
|
button.flags = flags;
|
|
button.element = element;
|
|
|
|
-- For the tooltip
|
|
button.name = categoryName;
|
|
if ( id == FEAT_OF_STRENGTH_ID ) then
|
|
-- This is the feat of strength category since it's sorted to the end of the list
|
|
button.text = FEAT_OF_STRENGTH_DESCRIPTION;
|
|
button.showTooltipFunc = AchievementFrameCategory_FeatOfStrengthTooltip;
|
|
elseif ( AchievementFrame.selectedTab == 1 ) then
|
|
button.text = nil;
|
|
button.numAchievements = numAchievements;
|
|
button.numCompleted = numCompleted;
|
|
button.numCompletedText = numCompleted.."/"..numAchievements;
|
|
button.showTooltipFunc = AchievementFrameCategory_StatusBarTooltip;
|
|
else
|
|
button.showTooltipFunc = nil;
|
|
end
|
|
end
|
|
|
|
function AchievementFrameCategory_StatusBarTooltip(self)
|
|
GameTooltip_SetDefaultAnchor(GameTooltip, self);
|
|
GameTooltip:SetMinimumWidth(128, 1);
|
|
GameTooltip:SetText(self.name, 1, 1, 1, nil, 1);
|
|
GameTooltip_ShowStatusBar(GameTooltip, 0, self.numAchievements, self.numCompleted, self.numCompletedText);
|
|
GameTooltip:Show();
|
|
end
|
|
|
|
function AchievementFrameCategory_FeatOfStrengthTooltip(self)
|
|
GameTooltip_SetDefaultAnchor(GameTooltip, self);
|
|
GameTooltip:SetText(self.name, 1, 1, 1);
|
|
GameTooltip:AddLine(self.text, nil, nil, nil, 1);
|
|
GameTooltip:Show();
|
|
end
|
|
|
|
function AchievementFrameCategories_UpdateTooltip()
|
|
local container = AchievementFrameCategoriesContainer;
|
|
if ( not container:IsVisible() or not container.buttons ) then
|
|
return;
|
|
end
|
|
|
|
for _, button in next, AchievementFrameCategoriesContainer.buttons do
|
|
if ( button:IsMouseOver() and button.showTooltipFunc ) then
|
|
button:showTooltipFunc();
|
|
break;
|
|
end
|
|
end
|
|
end
|
|
|
|
function AchievementFrameCategories_SelectButton (button)
|
|
local id = button.element.id;
|
|
|
|
if ( type(button.element.parent) ~= "number" ) then
|
|
-- Is top level category (can expand/contract)
|
|
if ( button.isSelected and button.element.collapsed == false ) then
|
|
button.element.collapsed = true;
|
|
for i, category in next, ACHIEVEMENTUI_CATEGORIES do
|
|
if ( category.parent == id ) then
|
|
category.hidden = true;
|
|
end
|
|
end
|
|
else
|
|
for i, category in next, ACHIEVEMENTUI_CATEGORIES do
|
|
if ( category.parent == id ) then
|
|
category.hidden = false;
|
|
elseif ( category.parent == true ) then
|
|
category.collapsed = true;
|
|
elseif ( category.parent ) then
|
|
category.hidden = true;
|
|
end
|
|
end
|
|
button.element.collapsed = false;
|
|
end
|
|
end
|
|
|
|
local buttons = AchievementFrameCategoriesContainer.buttons;
|
|
for _, button in next, buttons do
|
|
button.isSelected = nil;
|
|
end
|
|
|
|
button.isSelected = true;
|
|
|
|
if ( id == achievementFunctions.selectedCategory ) then
|
|
-- If this category was selected already, bail after changing collapsed states
|
|
return
|
|
end
|
|
|
|
--Intercept "summary" category
|
|
if ( id == "summary" ) then
|
|
if ( achievementFunctions == ACHIEVEMENT_FUNCTIONS ) then
|
|
AchievementFrame_ShowSubFrame(AchievementFrameSummary);
|
|
achievementFunctions.selectedCategory = id;
|
|
return;
|
|
elseif ( achievementFunctions == STAT_FUNCTIONS ) then
|
|
AchievementFrame_ShowSubFrame(AchievementFrameStats);
|
|
achievementFunctions.selectedCategory = ACHIEVEMENT_COMPARISON_STATS_SUMMARY_ID;
|
|
AchievementFrameStatsContainerScrollBar:SetValue(0);
|
|
elseif ( achievementFunctions == COMPARISON_ACHIEVEMENT_FUNCTIONS ) then
|
|
-- Put the summary stuff for comparison here, Derek!
|
|
AchievementFrame_ShowSubFrame(AchievementFrameComparison, AchievementFrameComparisonContainer);
|
|
achievementFunctions.selectedCategory = ACHIEVEMENT_COMPARISON_SUMMARY_ID;
|
|
AchievementFrameComparisonContainerScrollBar:SetValue(0);
|
|
AchievementFrameComparison_UpdateStatusBars(ACHIEVEMENT_COMPARISON_SUMMARY_ID);
|
|
elseif ( achievementFunctions == COMPARISON_STAT_FUNCTIONS ) then
|
|
AchievementFrame_ShowSubFrame(AchievementFrameComparison, AchievementFrameComparisonStatsContainer);
|
|
achievementFunctions.selectedCategory = ACHIEVEMENT_COMPARISON_STATS_SUMMARY_ID;
|
|
AchievementFrameComparisonStatsContainerScrollBar:SetValue(0);
|
|
end
|
|
|
|
else
|
|
if ( achievementFunctions == STAT_FUNCTIONS ) then
|
|
AchievementFrame_ShowSubFrame(AchievementFrameStats);
|
|
AchievementFrameStatsContainerScrollBar:SetValue(0);
|
|
elseif ( achievementFunctions == ACHIEVEMENT_FUNCTIONS ) then
|
|
AchievementFrame_ShowSubFrame(AchievementFrameAchievements);
|
|
AchievementFrameAchievementsContainerScrollBar:SetValue(0);
|
|
if ( id == FEAT_OF_STRENGTH_ID ) then
|
|
AchievementFrameFilterDropDown:Hide();
|
|
AchievementFrameHeaderRightDDLInset:Hide();
|
|
else
|
|
AchievementFrameFilterDropDown:Show();
|
|
AchievementFrameHeaderRightDDLInset:Show();
|
|
end
|
|
elseif ( achievementFunctions == COMPARISON_ACHIEVEMENT_FUNCTIONS ) then
|
|
AchievementFrame_ShowSubFrame(AchievementFrameComparison, AchievementFrameComparisonContainer);
|
|
AchievementFrameComparisonContainerScrollBar:SetValue(0);
|
|
AchievementFrameComparison_UpdateStatusBars(id);
|
|
else
|
|
AchievementFrame_ShowSubFrame(AchievementFrameComparison, AchievementFrameComparisonStatsContainer);
|
|
AchievementFrameComparisonStatsContainerScrollBar:SetValue(0);
|
|
end
|
|
achievementFunctions.selectedCategory = id;
|
|
end
|
|
|
|
if ( achievementFunctions.clearFunc ) then
|
|
achievementFunctions.clearFunc();
|
|
end
|
|
|
|
achievementFunctions.updateFunc();
|
|
end
|
|
|
|
function AchievementFrameAchievements_OnShow()
|
|
if ( achievementFunctions.selectedCategory == FEAT_OF_STRENGTH_ID ) then
|
|
AchievementFrameFilterDropDown:Hide();
|
|
AchievementFrameHeaderRightDDLInset:Hide();
|
|
else
|
|
AchievementFrameFilterDropDown:Show();
|
|
AchievementFrameHeaderRightDDLInset:Show();
|
|
end
|
|
end
|
|
|
|
function AchievementFrameCategories_ClearSelection ()
|
|
local buttons = AchievementFrameCategoriesContainer.buttons;
|
|
for _, button in next, buttons do
|
|
button.isSelected = nil;
|
|
button:UnlockHighlight();
|
|
end
|
|
|
|
for i, category in next, ACHIEVEMENTUI_CATEGORIES do
|
|
if ( category.parent == true ) then
|
|
category.collapsed = true;
|
|
elseif ( category.parent ) then
|
|
category.hidden = true;
|
|
end
|
|
end
|
|
end
|
|
|
|
function AchievementFrameComparison_UpdateStatusBars (id)
|
|
local numAchievements, numCompleted = GetCategoryNumAchievements(id);
|
|
local name = GetCategoryInfo(id);
|
|
|
|
if ( id == ACHIEVEMENT_COMPARISON_SUMMARY_ID ) then
|
|
name = ACHIEVEMENT_SUMMARY_CATEGORY;
|
|
end
|
|
|
|
local statusBar = AchievementFrameComparisonSummaryPlayerStatusBar;
|
|
statusBar:SetMinMaxValues(0, numAchievements);
|
|
statusBar:SetValue(numCompleted);
|
|
statusBar.title:SetText(string.format(ACHIEVEMENTS_COMPLETED_CATEGORY, name));
|
|
statusBar.text:SetText(numCompleted.."/"..numAchievements);
|
|
|
|
local friendCompleted = GetComparisonCategoryNumAchievements(id);
|
|
|
|
statusBar = AchievementFrameComparisonSummaryFriendStatusBar;
|
|
statusBar:SetMinMaxValues(0, numAchievements);
|
|
statusBar:SetValue(friendCompleted);
|
|
statusBar.text:SetText(friendCompleted.."/"..numAchievements);
|
|
end
|
|
|
|
-- [[ AchievementCategoryButton ]] --
|
|
|
|
function AchievementCategoryButton_OnLoad (button)
|
|
button:EnableMouse(true);
|
|
button:EnableMouseWheel(true);
|
|
|
|
local buttonName = button:GetName();
|
|
|
|
button.label = _G[buttonName .. "Label"];
|
|
button.background = _G[buttonName.."Background"];
|
|
end
|
|
|
|
function AchievementCategoryButton_OnClick (button)
|
|
AchievementFrameCategories_SelectButton(button);
|
|
AchievementFrameCategories_Update();
|
|
end
|
|
|
|
-- [[ AchievementFrameAchievements ]] --
|
|
|
|
function AchievementFrameAchievements_OnLoad (self)
|
|
AchievementFrameAchievementsContainerScrollBar.Show =
|
|
function (self)
|
|
AchievementFrameAchievements:SetWidth(504);
|
|
for _, button in next, AchievementFrameAchievements.buttons do
|
|
button:SetWidth(496);
|
|
end
|
|
getmetatable(self).__index.Show(self);
|
|
end
|
|
|
|
AchievementFrameAchievementsContainerScrollBar.Hide =
|
|
function (self)
|
|
AchievementFrameAchievements:SetWidth(530);
|
|
for _, button in next, AchievementFrameAchievements.buttons do
|
|
button:SetWidth(522);
|
|
end
|
|
getmetatable(self).__index.Hide(self);
|
|
end
|
|
|
|
self:RegisterEvent("ADDON_LOADED");
|
|
AchievementFrameAchievementsContainerScrollBarBG:Show();
|
|
AchievementFrameAchievementsContainer.update = AchievementFrameAchievements_Update;
|
|
HybridScrollFrame_CreateButtons(AchievementFrameAchievementsContainer, "AchievementTemplate", 0, -2);
|
|
end
|
|
|
|
function AchievementFrameAchievements_OnEvent (self, event, ...)
|
|
if ( event == "ADDON_LOADED" ) then
|
|
self:RegisterEvent("ACHIEVEMENT_EARNED");
|
|
self:RegisterEvent("CRITERIA_UPDATE");
|
|
self:RegisterEvent("TRACKED_ACHIEVEMENT_UPDATE");
|
|
|
|
updateTrackedAchievements(GetTrackedAchievements());
|
|
elseif ( event == "ACHIEVEMENT_EARNED" ) then
|
|
local achievementID = ...;
|
|
AchievementFrameCategories_Update();
|
|
AchievementFrameCategories_UpdateTooltip();
|
|
-- This has to happen before AchievementFrameAchievements_ForceUpdate() in order to achieve the behavior we want, since it clears the selection for progressive achievements.
|
|
local selection = AchievementFrameAchievements.selection;
|
|
AchievementFrameAchievements_ForceUpdate();
|
|
if ( AchievementFrameAchievementsContainer:IsShown() and selection == achievementID ) then
|
|
AchievementFrame_SelectAchievement(selection, true);
|
|
end
|
|
AchievementFrameHeaderPoints:SetText(GetTotalAchievementPoints());
|
|
|
|
elseif ( event == "CRITERIA_UPDATE" ) then
|
|
if ( AchievementFrameAchievements.selection ) then
|
|
local id = AchievementFrameAchievementsObjectives.id;
|
|
local button = AchievementFrameAchievementsObjectives:GetParent();
|
|
AchievementFrameAchievementsObjectives.id = nil;
|
|
AchievementButton_DisplayObjectives(button, id, button.completed);
|
|
AchievementFrameAchievements_Update();
|
|
else
|
|
AchievementFrameAchievementsObjectives.id = nil; -- Force redraw
|
|
end
|
|
elseif ( event == "TRACKED_ACHIEVEMENT_UPDATE" ) then
|
|
for k, v in next, trackedAchievements do
|
|
trackedAchievements[k] = nil;
|
|
end
|
|
|
|
updateTrackedAchievements(GetTrackedAchievements());
|
|
end
|
|
|
|
if ( not AchievementMicroButton:IsShown() ) then
|
|
AchievementMicroButton_Update();
|
|
end
|
|
end
|
|
|
|
function AchievementFrameAchievementsBackdrop_OnLoad (self)
|
|
self:SetBackdropBorderColor(ACHIEVEMENTUI_GOLDBORDER_R, ACHIEVEMENTUI_GOLDBORDER_G, ACHIEVEMENTUI_GOLDBORDER_B, ACHIEVEMENTUI_GOLDBORDER_A);
|
|
self:SetFrameLevel(self:GetFrameLevel()+1);
|
|
end
|
|
|
|
function AchievementFrameAchievements_Update ()
|
|
local category = achievementFunctions.selectedCategory;
|
|
if ( category == "summary" ) then
|
|
return;
|
|
end
|
|
local scrollFrame = AchievementFrameAchievementsContainer
|
|
|
|
local offset = HybridScrollFrame_GetOffset(scrollFrame);
|
|
local buttons = scrollFrame.buttons;
|
|
local numAchievements, numCompleted, completedOffset = ACHIEVEMENTUI_SELECTEDFILTER(category);
|
|
local numButtons = #buttons;
|
|
|
|
-- If the current category is feats of strength and there are no entries then show the explanation text
|
|
if ( AchievementFrame_IsFeatOfStrength() and numAchievements == 0 ) then
|
|
AchievementFrameAchievementsFeatOfStrengthText:Show();
|
|
else
|
|
AchievementFrameAchievementsFeatOfStrengthText:Hide();
|
|
end
|
|
|
|
local selection = AchievementFrameAchievements.selection;
|
|
if ( selection ) then
|
|
AchievementButton_ResetObjectives();
|
|
end
|
|
|
|
local extraHeight = scrollFrame.largeButtonHeight or ACHIEVEMENTBUTTON_COLLAPSEDHEIGHT
|
|
|
|
local achievementIndex;
|
|
local displayedHeight = 0;
|
|
for i = 1, numButtons do
|
|
achievementIndex = i + offset + completedOffset;
|
|
if ( achievementIndex > numAchievements + completedOffset ) then
|
|
buttons[i]:Hide();
|
|
else
|
|
AchievementButton_DisplayAchievement(buttons[i], category, achievementIndex, selection);
|
|
displayedHeight = displayedHeight + buttons[i]:GetHeight();
|
|
end
|
|
end
|
|
|
|
local totalHeight = numAchievements * ACHIEVEMENTBUTTON_COLLAPSEDHEIGHT;
|
|
totalHeight = totalHeight + (extraHeight - ACHIEVEMENTBUTTON_COLLAPSEDHEIGHT);
|
|
|
|
HybridScrollFrame_Update(scrollFrame, totalHeight, displayedHeight);
|
|
|
|
if ( selection ) then
|
|
AchievementFrameAchievements.selection = selection;
|
|
else
|
|
HybridScrollFrame_CollapseButton(scrollFrame);
|
|
end
|
|
end
|
|
|
|
function AchievementFrameAchievements_ForceUpdate ()
|
|
if ( AchievementFrameAchievements.selection ) then
|
|
local nextID = GetNextAchievement(AchievementFrameAchievements.selection);
|
|
local id, _, _, completed = GetAchievementInfo(AchievementFrameAchievements.selection);
|
|
if ( nextID and completed ) then
|
|
AchievementFrameAchievements.selection = nil;
|
|
end
|
|
end
|
|
AchievementFrameAchievementsObjectives:Hide();
|
|
AchievementFrameAchievementsObjectives.id = nil;
|
|
|
|
local buttons = AchievementFrameAchievementsContainer.buttons;
|
|
for i, button in next, buttons do
|
|
button.id = nil;
|
|
end
|
|
|
|
AchievementFrameAchievements_Update();
|
|
end
|
|
|
|
function AchievementFrameAchievements_ClearSelection ()
|
|
AchievementButton_ResetObjectives();
|
|
for _, button in next, AchievementFrameAchievements.buttons do
|
|
button:Collapse();
|
|
if ( not button:IsMouseOver() ) then
|
|
button.highlight:Hide();
|
|
end
|
|
button.selected = nil;
|
|
if ( not button.tracked:GetChecked() ) then
|
|
button.tracked:Hide();
|
|
end
|
|
button.description:Show();
|
|
button.hiddenDescription:Hide();
|
|
end
|
|
|
|
AchievementFrameAchievements.selection = nil;
|
|
end
|
|
|
|
-- [[ Achievement Icon ]] --
|
|
|
|
function AchievementIcon_Desaturate (self)
|
|
self.bling:SetVertexColor(.6, .6, .6, 1);
|
|
self.frame:SetVertexColor(.75, .75, .75, 1);
|
|
self.texture:SetVertexColor(.55, .55, .55, 1);
|
|
end
|
|
|
|
function AchievementIcon_Saturate (self)
|
|
self.bling:SetVertexColor(1, 1, 1, 1);
|
|
self.frame:SetVertexColor(1, 1, 1, 1);
|
|
self.texture:SetVertexColor(1, 1, 1, 1);
|
|
end
|
|
|
|
function AchievementIcon_OnLoad (self)
|
|
local name = self:GetName();
|
|
self.bling = _G[name .. "Bling"];
|
|
self.texture = _G[name .. "Texture"];
|
|
self.frame = _G[name .. "Overlay"];
|
|
|
|
self.Desaturate = AchievementIcon_Desaturate;
|
|
self.Saturate = AchievementIcon_Saturate;
|
|
end
|
|
|
|
-- [[ Achievement Shield ]] --
|
|
|
|
function AchievementShield_Desaturate (self)
|
|
self.icon:SetTexCoord(.5, 1, 0, 1);
|
|
end
|
|
|
|
function AchievementShield_Saturate (self)
|
|
self.icon:SetTexCoord(0, .5, 0, 1);
|
|
end
|
|
|
|
function AchievementShield_OnLoad (self)
|
|
local name = self:GetName();
|
|
self.icon = _G[name .. "Icon"];
|
|
self.points = _G[name .. "Points"];
|
|
|
|
self.Desaturate = AchievementShield_Desaturate;
|
|
self.Saturate = AchievementShield_Saturate;
|
|
end
|
|
|
|
-- [[ AchievementButton ]] --
|
|
|
|
ACHIEVEMENTBUTTON_DESCRIPTIONHEIGHT = 20;
|
|
ACHIEVEMENTBUTTON_COLLAPSEDHEIGHT = 84;
|
|
ACHIEVEMENTBUTTON_CRITERIAROWHEIGHT = 15;
|
|
ACHIEVEMENTBUTTON_METAROWHEIGHT = 14;
|
|
ACHIEVEMENTBUTTON_MAXHEIGHT = 232;
|
|
ACHIEVEMENTBUTTON_TEXTUREHEIGHT = 128;
|
|
|
|
function AchievementButton_UpdatePlusMinusTexture (button)
|
|
local id = button.id;
|
|
if ( not id ) then
|
|
return; -- This happens when we create buttons
|
|
end
|
|
|
|
local display = false;
|
|
if ( GetAchievementNumCriteria(id) ~= 0 ) then
|
|
display = true;
|
|
elseif ( GetPreviousAchievement(id) and button.completed ) then
|
|
display = true;
|
|
end
|
|
|
|
if ( display ) then
|
|
button.plusMinus:Show();
|
|
if ( button.collapsed and button.saturated ) then
|
|
button.plusMinus:SetTexCoord(0, .5, 0, .5);
|
|
elseif ( button.collapsed ) then
|
|
button.plusMinus:SetTexCoord(.5, 1, 0, .5);
|
|
elseif ( button.saturated ) then
|
|
button.plusMinus:SetTexCoord(0, .5, .5, 1);
|
|
else
|
|
button.plusMinus:SetTexCoord(.5, 1, .5, 1);
|
|
end
|
|
else
|
|
button.plusMinus:Hide();
|
|
end
|
|
end
|
|
|
|
function AchievementButton_Collapse (self)
|
|
if ( self.collapsed ) then
|
|
return;
|
|
end
|
|
|
|
self.collapsed = true;
|
|
AchievementButton_UpdatePlusMinusTexture(self);
|
|
self:SetHeight(ACHIEVEMENTBUTTON_COLLAPSEDHEIGHT);
|
|
_G[self:GetName() .. "Background"]:SetTexCoord(0, 1, 1-(ACHIEVEMENTBUTTON_COLLAPSEDHEIGHT / 256), 1);
|
|
_G[self:GetName() .. "Glow"]:SetTexCoord(0, 1, 0, ACHIEVEMENTBUTTON_COLLAPSEDHEIGHT / 128);
|
|
|
|
if ( not self.tracked:GetChecked() ) then
|
|
self.tracked:Hide();
|
|
end
|
|
end
|
|
|
|
function AchievementButton_Expand (self, height)
|
|
if ( not self.collapsed ) then
|
|
return;
|
|
end
|
|
|
|
self.collapsed = nil;
|
|
AchievementButton_UpdatePlusMinusTexture(self);
|
|
self:SetHeight(height);
|
|
_G[self:GetName() .. "Background"]:SetTexCoord(0, 1, max(0, 1-(height / 256)), 1);
|
|
_G[self:GetName() .. "Glow"]:SetTexCoord(0, 1, 0, (height+5) / 128);
|
|
end
|
|
|
|
function AchievementButton_Saturate (self)
|
|
local name = self:GetName();
|
|
self.saturated = true;
|
|
_G[name .. "TitleBackground"]:SetTexCoord(0, 0.9765625, 0, 0.3125);
|
|
_G[name .. "Background"]:SetTexture("Interface\\AchievementFrame\\UI-Achievement-Parchment-Horizontal");
|
|
_G[name .. "Glow"]:SetVertexColor(1.0, 1.0, 1.0);
|
|
self.icon:Saturate();
|
|
self.shield:Saturate();
|
|
self.shield.points:SetVertexColor(1, 1, 1);
|
|
self.reward:SetVertexColor(1, .82, 0);
|
|
self.label:SetVertexColor(1, 1, 1);
|
|
self.description:SetTextColor(0, 0, 0, 1);
|
|
self.description:SetShadowOffset(0, 0);
|
|
AchievementButton_UpdatePlusMinusTexture(self);
|
|
self:SetBackdropBorderColor(ACHIEVEMENTUI_REDBORDER_R, ACHIEVEMENTUI_REDBORDER_G, ACHIEVEMENTUI_REDBORDER_B, ACHIEVEMENTUI_REDBORDER_A);
|
|
end
|
|
|
|
function AchievementButton_Desaturate (self)
|
|
local name = self:GetName();
|
|
self.saturated = nil;
|
|
_G[name .. "TitleBackground"]:SetTexCoord(0, 0.9765625, 0.34375, 0.65625);
|
|
_G[name .. "Background"]:SetTexture("Interface\\AchievementFrame\\UI-Achievement-Parchment-Horizontal-Desaturated");
|
|
_G[name .. "Glow"]:SetVertexColor(.22, .17, .13);
|
|
self.icon:Desaturate();
|
|
self.shield:Desaturate();
|
|
self.shield.points:SetVertexColor(.65, .65, .65);
|
|
self.reward:SetVertexColor(.8, .8, .8);
|
|
self.label:SetVertexColor(.65, .65, .65);
|
|
self.description:SetTextColor(1, 1, 1, 1);
|
|
self.description:SetShadowOffset(1, -1);
|
|
AchievementButton_UpdatePlusMinusTexture(self);
|
|
self:SetBackdropBorderColor(.5, .5, .5);
|
|
end
|
|
|
|
function AchievementButton_OnLoad (self)
|
|
local name = self:GetName();
|
|
self.label = _G[name .. "Label"];
|
|
self.description = _G[name .. "Description"];
|
|
self.hiddenDescription = _G[name .. "HiddenDescription"];
|
|
self.reward = _G[name .. "Reward"];
|
|
self.rewardBackground = _G[name.."RewardBackground"];
|
|
self.icon = _G[name .. "Icon"];
|
|
self.shield = _G[name .. "Shield"];
|
|
self.objectives = _G[name .. "Objectives"];
|
|
self.highlight = _G[name .. "Highlight"];
|
|
self.dateCompleted = _G[name .. "DateCompleted"]
|
|
self.tracked = _G[name .. "Tracked"];
|
|
self.check = _G[name .. "Check"];
|
|
self.plusMinus = _G[name .. "PlusMinus"];
|
|
|
|
self.dateCompleted:ClearAllPoints();
|
|
self.dateCompleted:SetPoint("TOP", self.shield, "BOTTOM", -3, 6);
|
|
if ( not ACHIEVEMENTUI_FONTHEIGHT ) then
|
|
local _, fontHeight = self.description:GetFont();
|
|
ACHIEVEMENTUI_FONTHEIGHT = fontHeight;
|
|
end
|
|
self.description:SetHeight(ACHIEVEMENTUI_FONTHEIGHT * ACHIEVEMENTUI_MAX_LINES_COLLAPSED);
|
|
self.description:SetWidth(ACHIEVEMENTUI_MAXCONTENTWIDTH);
|
|
self.hiddenDescription:SetWidth(ACHIEVEMENTUI_MAXCONTENTWIDTH);
|
|
|
|
self:SetBackdropBorderColor(ACHIEVEMENTUI_REDBORDER_R, ACHIEVEMENTUI_REDBORDER_G, ACHIEVEMENTUI_REDBORDER_B, ACHIEVEMENTUI_REDBORDER_A);
|
|
self.Collapse = AchievementButton_Collapse;
|
|
self.Expand = AchievementButton_Expand;
|
|
self.Saturate = AchievementButton_Saturate;
|
|
self.Desaturate = AchievementButton_Desaturate;
|
|
|
|
self:Collapse();
|
|
self:Desaturate();
|
|
|
|
AchievementFrameAchievements.buttons = AchievementFrameAchievements.buttons or {};
|
|
tinsert(AchievementFrameAchievements.buttons, self);
|
|
end
|
|
|
|
function AchievementButton_OnClick (self, ignoreModifiers)
|
|
if(IsModifiedClick() and not ignoreModifiers) then
|
|
if ( IsModifiedClick("CHATLINK") and ChatEdit_GetActiveWindow() ) then
|
|
local achievementLink = GetAchievementLink(self.id);
|
|
if ( achievementLink ) then
|
|
ChatEdit_InsertLink(achievementLink);
|
|
end
|
|
elseif ( IsModifiedClick("QUESTWATCHTOGGLE") ) then
|
|
AchievementButton_ToggleTracking(self.id);
|
|
end
|
|
|
|
return;
|
|
end
|
|
|
|
if ( self.selected ) then
|
|
if ( not self:IsMouseOver() ) then
|
|
self.highlight:Hide();
|
|
end
|
|
AchievementFrameAchievements_ClearSelection()
|
|
HybridScrollFrame_CollapseButton(AchievementFrameAchievementsContainer);
|
|
AchievementFrameAchievements_Update();
|
|
return;
|
|
end
|
|
AchievementFrameAchievements_ClearSelection()
|
|
AchievementFrameAchievements_SelectButton(self);
|
|
AchievementButton_DisplayAchievement(self, achievementFunctions.selectedCategory, self.index, self.id);
|
|
HybridScrollFrame_ExpandButton(AchievementFrameAchievementsContainer, ((self.index - 1) * ACHIEVEMENTBUTTON_COLLAPSEDHEIGHT), self:GetHeight());
|
|
AchievementFrameAchievements_Update();
|
|
if ( not ignoreModifiers ) then
|
|
AchievementFrameAchievements_AdjustSelection();
|
|
end
|
|
end
|
|
|
|
function AchievementButton_ToggleTracking (id)
|
|
if ( trackedAchievements[id] ) then
|
|
RemoveTrackedAchievement(id);
|
|
AchievementFrameAchievements_ForceUpdate();
|
|
WatchFrame_Update();
|
|
return;
|
|
end
|
|
|
|
local count = GetNumTrackedAchievements();
|
|
|
|
if ( count >= WATCHFRAME_MAXACHIEVEMENTS ) then
|
|
UIErrorsFrame:AddMessage(format(ACHIEVEMENT_WATCH_TOO_MANY, WATCHFRAME_MAXACHIEVEMENTS), 1.0, 0.1, 0.1, 1.0);
|
|
return;
|
|
end
|
|
|
|
local _, _, _, completed = GetAchievementInfo(id)
|
|
if ( completed ) then
|
|
UIErrorsFrame:AddMessage(ERR_ACHIEVEMENT_WATCH_COMPLETED, 1.0, 0.1, 0.1, 1.0);
|
|
return;
|
|
end
|
|
|
|
AddTrackedAchievement(id);
|
|
AchievementFrameAchievements_ForceUpdate();
|
|
WatchFrame_Update();
|
|
|
|
return true;
|
|
end
|
|
|
|
function AchievementButton_DisplayAchievement (button, category, achievement, selectionID)
|
|
local id, name, points, completed, month, day, year, description, flags, icon, rewardText = GetAchievementInfo(category, achievement);
|
|
if ( not id ) then
|
|
button:Hide();
|
|
return;
|
|
else
|
|
button:Show();
|
|
end
|
|
|
|
button.index = achievement;
|
|
button.element = true;
|
|
|
|
if ( button.id ~= id ) then
|
|
button.id = id;
|
|
button.label:SetWidth(ACHIEVEMENTBUTTON_LABELWIDTH);
|
|
button.label:SetText(name)
|
|
|
|
if ( GetPreviousAchievement(id) ) then
|
|
-- If this is a progressive achievement, show the total score.
|
|
AchievementShield_SetPoints(AchievementButton_GetProgressivePoints(id), button.shield.points, AchievementPointsFont, AchievementPointsFontSmall);
|
|
else
|
|
AchievementShield_SetPoints(points, button.shield.points, AchievementPointsFont, AchievementPointsFontSmall);
|
|
end
|
|
|
|
if ( points > 0 ) then
|
|
button.shield.icon:SetTexture([[Interface\AchievementFrame\UI-Achievement-Shields]]);
|
|
else
|
|
button.shield.icon:SetTexture([[Interface\AchievementFrame\UI-Achievement-Shields-NoPoints]]);
|
|
end
|
|
button.description:SetText(description);
|
|
button.hiddenDescription:SetText(description);
|
|
button.numLines = ceil(button.hiddenDescription:GetHeight() / ACHIEVEMENTUI_FONTHEIGHT);
|
|
button.icon.texture:SetTexture(icon);
|
|
if ( completed and not button.completed ) then
|
|
button.completed = true;
|
|
button.dateCompleted:SetText(string.format(SHORTDATE, day, month, year));
|
|
button.dateCompleted:Show();
|
|
button:Saturate();
|
|
elseif ( completed ) then
|
|
button.dateCompleted:SetText(string.format(SHORTDATE, day, month, year));
|
|
else
|
|
button.completed = nil;
|
|
button.dateCompleted:Hide();
|
|
button:Desaturate();
|
|
end
|
|
|
|
if ( rewardText == "" ) then
|
|
button.reward:Hide();
|
|
button.rewardBackground:Hide();
|
|
else
|
|
button.reward:SetText(rewardText);
|
|
button.reward:Show();
|
|
button.rewardBackground:Show();
|
|
if ( button.completed ) then
|
|
button.rewardBackground:SetVertexColor(1, 1, 1);
|
|
else
|
|
button.rewardBackground:SetVertexColor(0.35, 0.35, 0.35);
|
|
end
|
|
end
|
|
|
|
if ( IsTrackedAchievement(id) ) then
|
|
button.check:Show();
|
|
button.label:SetWidth(button.label:GetStringWidth() + 4); -- This +4 here is to fudge around any string width issues that arize from resizing a string set to its string width. See bug 144418 for an example.
|
|
button.tracked:SetChecked(true);
|
|
button.tracked:Show();
|
|
else
|
|
button.check:Hide();
|
|
button.tracked:SetChecked(false);
|
|
button.tracked:Hide();
|
|
end
|
|
|
|
AchievementButton_UpdatePlusMinusTexture(button);
|
|
end
|
|
|
|
if ( id == selectionID ) then
|
|
local achievements = AchievementFrameAchievements;
|
|
|
|
achievements.selection = button.id;
|
|
achievements.selectionIndex = button.index;
|
|
button.selected = true;
|
|
button.highlight:Show();
|
|
local height = AchievementButton_DisplayObjectives(button, button.id, button.completed);
|
|
if ( height == ACHIEVEMENTBUTTON_COLLAPSEDHEIGHT ) then
|
|
button:Collapse();
|
|
else
|
|
button:Expand(height);
|
|
end
|
|
if ( not completed ) then
|
|
button.tracked:Show();
|
|
end
|
|
elseif ( button.selected ) then
|
|
button.selected = nil;
|
|
if ( not button:IsMouseOver() ) then
|
|
button.highlight:Hide();
|
|
end
|
|
button:Collapse();
|
|
button.description:Show();
|
|
button.hiddenDescription:Hide();
|
|
end
|
|
|
|
return id;
|
|
end
|
|
|
|
function AchievementFrameAchievements_SelectButton (button)
|
|
local achievements = AchievementFrameAchievements;
|
|
|
|
achievements.selection = button.id;
|
|
achievements.selectionIndex = button.index;
|
|
button.selected = true;
|
|
end
|
|
|
|
function AchievementButton_ResetObjectives ()
|
|
AchievementFrameAchievementsObjectives:Hide();
|
|
end
|
|
|
|
function AchievementButton_DisplayObjectives (button, id, completed)
|
|
local objectives = AchievementFrameAchievementsObjectives;
|
|
|
|
objectives:ClearAllPoints();
|
|
objectives:SetParent(button);
|
|
objectives:Show();
|
|
objectives.completed = completed;
|
|
local height = 0;
|
|
if ( objectives.id == id ) then
|
|
local ACHIEVEMENTMODE_CRITERIA = 1;
|
|
if ( objectives.mode == ACHIEVEMENTMODE_CRITERIA ) then
|
|
if ( objectives:GetHeight() > 0 ) then
|
|
objectives:SetPoint("TOP", "$parentHiddenDescription", "BOTTOM", 0, -8);
|
|
objectives:SetPoint("LEFT", "$parentIcon", "RIGHT", -5, 0);
|
|
objectives:SetPoint("RIGHT", "$parentShield", "LEFT", -10, 0);
|
|
end
|
|
height = ACHIEVEMENTBUTTON_COLLAPSEDHEIGHT + objectives:GetHeight();
|
|
else
|
|
objectives:SetPoint("TOP", "$parentHiddenDescription", "BOTTOM", 0, -8);
|
|
height = ACHIEVEMENTBUTTON_COLLAPSEDHEIGHT + objectives:GetHeight();
|
|
end
|
|
elseif ( completed and GetPreviousAchievement(id) ) then
|
|
objectives:SetHeight(0);
|
|
AchievementButton_ResetCriteria();
|
|
AchievementButton_ResetProgressBars();
|
|
AchievementButton_ResetMiniAchievements();
|
|
AchievementButton_ResetMetas();
|
|
AchievementObjectives_DisplayProgressiveAchievement(objectives, id);
|
|
objectives:SetPoint("TOP", "$parentHiddenDescription", "BOTTOM", 0, -8);
|
|
height = ACHIEVEMENTBUTTON_COLLAPSEDHEIGHT + objectives:GetHeight();
|
|
else
|
|
objectives:SetHeight(0);
|
|
AchievementButton_ResetCriteria();
|
|
AchievementButton_ResetProgressBars();
|
|
AchievementButton_ResetMiniAchievements();
|
|
AchievementButton_ResetMetas();
|
|
AchievementObjectives_DisplayCriteria(objectives, id);
|
|
if ( objectives:GetHeight() > 0 ) then
|
|
objectives:SetPoint("TOP", "$parentHiddenDescription", "BOTTOM", 0, -8);
|
|
objectives:SetPoint("LEFT", "$parentIcon", "RIGHT", -5, -25);
|
|
objectives:SetPoint("RIGHT", "$parentShield", "LEFT", -10, 0);
|
|
end
|
|
height = ACHIEVEMENTBUTTON_COLLAPSEDHEIGHT + objectives:GetHeight();
|
|
end
|
|
|
|
if ( height ~= ACHIEVEMENTBUTTON_COLLAPSEDHEIGHT or button.numLines > ACHIEVEMENTUI_MAX_LINES_COLLAPSED ) then
|
|
button.hiddenDescription:Show();
|
|
button.description:Hide();
|
|
local descriptionHeight = button.hiddenDescription:GetHeight();
|
|
height = height + descriptionHeight - ACHIEVEMENTBUTTON_DESCRIPTIONHEIGHT;
|
|
if ( button.reward:IsShown() ) then
|
|
height = height + 4;
|
|
end
|
|
end
|
|
|
|
objectives.id = id;
|
|
return height;
|
|
end
|
|
|
|
function AchievementShield_SetPoints(points, pointString, normalFont, smallFont)
|
|
if ( points == 0 ) then
|
|
pointString:SetText("");
|
|
return;
|
|
end
|
|
if ( points <= 100 ) then
|
|
pointString:SetFontObject(normalFont);
|
|
else
|
|
pointString:SetFontObject(smallFont);
|
|
end
|
|
pointString:SetText(points);
|
|
end
|
|
|
|
function AchievementButton_ResetTable (t)
|
|
for k, v in next, t do
|
|
v:Hide();
|
|
end
|
|
end
|
|
|
|
local criteriaTable = {}
|
|
|
|
function AchievementButton_ResetCriteria ()
|
|
AchievementButton_ResetTable(criteriaTable);
|
|
end
|
|
|
|
function AchievementButton_GetCriteria (index)
|
|
local criteriaTable = criteriaTable;
|
|
|
|
if ( criteriaTable[index] ) then
|
|
return criteriaTable[index];
|
|
end
|
|
|
|
local frame = CreateFrame("FRAME", "AchievementFrameCriteria" .. index, AchievementFrameAchievements, "AchievementCriteriaTemplate");
|
|
AchievementFrame_LocalizeCriteria(frame);
|
|
criteriaTable[index] = frame;
|
|
|
|
return frame;
|
|
end
|
|
|
|
-- The smallest table in WoW.
|
|
local miniTable = {}
|
|
|
|
function AchievementButton_ResetMiniAchievements ()
|
|
AchievementButton_ResetTable(miniTable);
|
|
end
|
|
|
|
function AchievementButton_GetMiniAchievement (index)
|
|
local miniTable = miniTable;
|
|
if ( miniTable[index] ) then
|
|
return miniTable[index];
|
|
end
|
|
|
|
local frame = CreateFrame("FRAME", "AchievementFrameMiniAchievement" .. index, AchievementFrameAchievements, "MiniAchievementTemplate");
|
|
AchievementButton_LocalizeMiniAchievement(frame);
|
|
miniTable[index] = frame;
|
|
|
|
return frame;
|
|
end
|
|
|
|
local progressBarTable = {};
|
|
|
|
function AchievementButton_ResetProgressBars ()
|
|
AchievementButton_ResetTable(progressBarTable);
|
|
end
|
|
|
|
function AchievementButton_GetProgressBar (index)
|
|
local progressBarTable = progressBarTable;
|
|
if ( progressBarTable[index] ) then
|
|
return progressBarTable[index];
|
|
end
|
|
|
|
local frame = CreateFrame("STATUSBAR", "AchievementFrameProgressBar" .. index, AchievementFrameAchievements, "AchievementProgressBarTemplate");
|
|
AchievementButton_LocalizeProgressBar(frame);
|
|
progressBarTable[index] = frame;
|
|
|
|
return frame;
|
|
end
|
|
|
|
local metaCriteriaTable = {};
|
|
|
|
function AchievementButton_ResetMetas ()
|
|
AchievementButton_ResetTable(metaCriteriaTable);
|
|
end
|
|
|
|
function AchievementButton_GetMeta (index)
|
|
local metaCriteriaTable = metaCriteriaTable;
|
|
if ( metaCriteriaTable[index] ) then
|
|
return metaCriteriaTable[index];
|
|
end
|
|
|
|
local frame = CreateFrame("BUTTON", "AchievementFrameMeta" .. index, AchievementFrameAchievements, "MetaCriteriaTemplate");
|
|
AchievementButton_LocalizeMetaAchievement(frame);
|
|
metaCriteriaTable[index] = frame;
|
|
|
|
return frame;
|
|
end
|
|
|
|
function AchievementButton_GetProgressivePoints(achievementID)
|
|
local points;
|
|
local _, _, progressivePoints, completed = GetAchievementInfo(achievementID);
|
|
|
|
while GetPreviousAchievement(achievementID) do
|
|
achievementID = GetPreviousAchievement(achievementID);
|
|
_, _, points, completed = GetAchievementInfo(achievementID);
|
|
progressivePoints = progressivePoints+points;
|
|
end
|
|
|
|
if ( progressivePoints ) then
|
|
return progressivePoints;
|
|
else
|
|
return 0;
|
|
end
|
|
end
|
|
|
|
local achievementList = {};
|
|
|
|
function AchievementObjectives_DisplayProgressiveAchievement (objectivesFrame, id)
|
|
local ACHIEVEMENTMODE_PROGRESSIVE = 2;
|
|
local achievementID = id;
|
|
|
|
local achievementList = achievementList;
|
|
for i in next, achievementList do
|
|
achievementList[i] = nil;
|
|
end
|
|
|
|
tinsert(achievementList, 1, achievementID);
|
|
while GetPreviousAchievement(achievementID) do
|
|
tinsert(achievementList, 1, GetPreviousAchievement(achievementID));
|
|
achievementID = GetPreviousAchievement(achievementID);
|
|
end
|
|
|
|
local i = 0;
|
|
for index, achievementID in ipairs(achievementList) do
|
|
local _, achievementName, points, completed, month, day, year, description, flags, iconpath = GetAchievementInfo(achievementID);
|
|
|
|
local miniAchievement = AchievementButton_GetMiniAchievement(index);
|
|
|
|
miniAchievement:Show();
|
|
miniAchievement:SetParent(objectivesFrame);
|
|
_G[miniAchievement:GetName() .. "Icon"]:SetTexture(iconpath);
|
|
if ( index == 1 ) then
|
|
miniAchievement:SetPoint("TOPLEFT", objectivesFrame, "TOPLEFT", -4, -4);
|
|
elseif ( index == 7 ) then
|
|
miniAchievement:SetPoint("TOPLEFT", miniTable[1], "BOTTOMLEFT", 0, -8);
|
|
else
|
|
miniAchievement:SetPoint("TOPLEFT", miniTable[index-1], "TOPRIGHT", 4, 0);
|
|
end
|
|
|
|
miniAchievement.points:SetText(points);
|
|
|
|
miniAchievement.numCriteria = 0;
|
|
if ( not ( bit.band(flags, ACHIEVEMENT_FLAGS_HAS_PROGRESS_BAR) == ACHIEVEMENT_FLAGS_HAS_PROGRESS_BAR ) ) then
|
|
for i = 1, GetAchievementNumCriteria(achievementID) do
|
|
local criteriaString, criteriaType, completed = GetAchievementCriteriaInfo(achievementID, i);
|
|
if ( completed == false ) then
|
|
criteriaString = "|CFF808080 - " .. criteriaString;
|
|
else
|
|
criteriaString = "|CFF00FF00 - " .. criteriaString;
|
|
end
|
|
miniAchievement["criteria" .. i] = criteriaString;
|
|
miniAchievement.numCriteria = i;
|
|
end
|
|
end
|
|
miniAchievement.name = achievementName;
|
|
miniAchievement.desc = description;
|
|
if ( month ) then
|
|
miniAchievement.date = string.format(SHORTDATE, day, month, year);
|
|
end
|
|
i = index;
|
|
end
|
|
|
|
objectivesFrame:SetHeight(math.ceil(i/6) * ACHIEVEMENTUI_PROGRESSIVEHEIGHT);
|
|
objectivesFrame:SetWidth(min(i, 6) * ACHIEVEMENTUI_PROGRESSIVEWIDTH);
|
|
objectivesFrame.mode = ACHIEVEMENTMODE_PROGRESSIVE;
|
|
end
|
|
|
|
function AchievementFrame_GetCategoryNumAchievements_All (categoryID)
|
|
local numAchievements, numCompleted = GetCategoryNumAchievements(categoryID);
|
|
|
|
return numAchievements, numCompleted, 0;
|
|
end
|
|
|
|
function AchievementFrame_GetCategoryNumAchievements_Complete (categoryID)
|
|
local numAchievements, numCompleted = GetCategoryNumAchievements(categoryID);
|
|
|
|
return numCompleted, numCompleted, 0;
|
|
end
|
|
|
|
function AchievementFrame_GetCategoryNumAchievements_Incomplete (categoryID)
|
|
local numAchievements, numCompleted = GetCategoryNumAchievements(categoryID);
|
|
|
|
return numAchievements - numCompleted, 0, numCompleted
|
|
end
|
|
|
|
ACHIEVEMENTUI_SELECTEDFILTER = AchievementFrame_GetCategoryNumAchievements_All;
|
|
|
|
AchievementFrameFilters = { {text=ACHIEVEMENTFRAME_FILTER_ALL, func= AchievementFrame_GetCategoryNumAchievements_All},
|
|
{text=ACHIEVEMENTFRAME_FILTER_COMPLETED, func=AchievementFrame_GetCategoryNumAchievements_Complete},
|
|
{text=ACHIEVEMENTFRAME_FILTER_INCOMPLETE, func=AchievementFrame_GetCategoryNumAchievements_Incomplete} };
|
|
|
|
function AchievementFrameFilterDropDown_OnLoad (self)
|
|
self.relativeTo = "AchievementFrameFilterDropDown"
|
|
self.xOffset = -14;
|
|
self.yOffset = 10;
|
|
UIDropDownMenu_Initialize(self, AchievementFrameFilterDropDown_Initialize);
|
|
end
|
|
|
|
function AchievementFrameFilterDropDown_Initialize (self)
|
|
local info = UIDropDownMenu_CreateInfo();
|
|
for i, filter in ipairs(AchievementFrameFilters) do
|
|
info.text = filter.text;
|
|
info.value = i;
|
|
info.func = AchievementFrameFilterDropDownButton_OnClick;
|
|
if ( filter.func == ACHIEVEMENTUI_SELECTEDFILTER ) then
|
|
info.checked = 1;
|
|
UIDropDownMenu_SetText(self, filter.text);
|
|
else
|
|
info.checked = nil;
|
|
end
|
|
UIDropDownMenu_AddButton(info);
|
|
end
|
|
end
|
|
|
|
function AchievementFrameFilterDropDownButton_OnClick (self)
|
|
AchievementFrame_SetFilter(self.value);
|
|
end
|
|
|
|
function AchievementFrame_SetFilter(value)
|
|
local func = AchievementFrameFilters[value].func;
|
|
if ( func ~= ACHIEVEMENTUI_SELECTEDFILTER ) then
|
|
ACHIEVEMENTUI_SELECTEDFILTER = func;
|
|
UIDropDownMenu_SetText(AchievementFrameFilterDropDown, AchievementFrameFilters[value].text)
|
|
AchievementFrameAchievementsContainerScrollBar:SetValue(0);
|
|
AchievementFrameAchievements_ForceUpdate();
|
|
end
|
|
end
|
|
|
|
function AchievementObjectives_DisplayCriteria (objectivesFrame, id)
|
|
if ( not id ) then
|
|
return;
|
|
end
|
|
|
|
local ACHIEVEMENTMODE_CRITERIA = 1;
|
|
local numCriteria = GetAchievementNumCriteria(id);
|
|
|
|
if ( numCriteria == 0 ) then
|
|
objectivesFrame.mode = ACHIEVEMENTMODE_CRITERIA;
|
|
objectivesFrame:SetHeight(0);
|
|
return;
|
|
end
|
|
|
|
local frameLevel = objectivesFrame:GetFrameLevel() + 1;
|
|
|
|
-- Why textStrings? You try naming anything just "string" and see how happy you are.
|
|
local textStrings, progressBars, metas = 0, 0, 0;
|
|
|
|
local numRows = 0;
|
|
local maxCriteriaWidth = 0;
|
|
local yPos;
|
|
for i = 1, numCriteria do
|
|
local criteriaString, criteriaType, completed, quantity, reqQuantity, charName, flags, assetID, quantityString = GetAchievementCriteriaInfo(id, i);
|
|
|
|
if ( criteriaType == CRITERIA_TYPE_ACHIEVEMENT and assetID ) then
|
|
metas = metas + 1;
|
|
local metaCriteria = AchievementButton_GetMeta(metas);
|
|
|
|
if ( metas == 1 ) then
|
|
metaCriteria:SetPoint("TOP", objectivesFrame, "TOP", 0, -4);
|
|
numRows = numRows + 2;
|
|
elseif ( math.fmod(metas, 2) == 0 ) then
|
|
yPos = -((metas/2 - 1) * 28) - 8;
|
|
metaCriteriaTable[metas-1]:SetPoint("TOPLEFT", objectivesFrame, "TOPLEFT", 20, yPos);
|
|
metaCriteria:SetPoint("TOPLEFT", objectivesFrame, "TOPLEFT", 210, yPos);
|
|
else
|
|
metaCriteria:SetPoint("TOPLEFT", objectivesFrame, "TOPLEFT", 20, -(math.ceil(metas/2 - 1) * 28) - 8);
|
|
numRows = numRows + 2;
|
|
end
|
|
|
|
local id, achievementName, points, completed, month, day, year, description, flags, iconpath = GetAchievementInfo(assetID);
|
|
|
|
if ( month ) then
|
|
metaCriteria.date = string.format(SHORTDATE, day, month, year);
|
|
else
|
|
metaCriteria.date = nil;
|
|
end
|
|
|
|
metaCriteria.id = id;
|
|
metaCriteria.label:SetText(achievementName);
|
|
metaCriteria.icon:SetTexture(iconpath);
|
|
|
|
if ( objectivesFrame.completed and completed ) then
|
|
metaCriteria.check:Show();
|
|
metaCriteria.border:SetVertexColor(1, 1, 1, 1);
|
|
metaCriteria.icon:SetVertexColor(1, 1, 1, 1);
|
|
metaCriteria.label:SetShadowOffset(0, 0)
|
|
metaCriteria.label:SetTextColor(0, 0, 0, 1);
|
|
elseif ( completed ) then
|
|
metaCriteria.check:Show();
|
|
metaCriteria.border:SetVertexColor(1, 1, 1, 1);
|
|
metaCriteria.icon:SetVertexColor(1, 1, 1, 1);
|
|
metaCriteria.label:SetShadowOffset(1, -1)
|
|
metaCriteria.label:SetTextColor(0, 1, 0, 1);
|
|
else
|
|
metaCriteria.check:Hide();
|
|
metaCriteria.border:SetVertexColor(.75, .75, .75, 1);
|
|
metaCriteria.icon:SetVertexColor(.55, .55, .55, 1);
|
|
metaCriteria.label:SetShadowOffset(1, -1)
|
|
metaCriteria.label:SetTextColor(.6, .6, .6, 1);
|
|
end
|
|
|
|
metaCriteria:SetParent(objectivesFrame);
|
|
metaCriteria:Show();
|
|
elseif ( bit.band(flags, ACHIEVEMENT_CRITERIA_PROGRESS_BAR) == ACHIEVEMENT_CRITERIA_PROGRESS_BAR ) then
|
|
-- Display this criteria as a progress bar!
|
|
progressBars = progressBars + 1;
|
|
local progressBar = AchievementButton_GetProgressBar(progressBars);
|
|
|
|
if ( progressBars == 1 ) then
|
|
progressBar:SetPoint("TOP", objectivesFrame, "TOP", 4, -4);
|
|
else
|
|
progressBar:SetPoint("TOP", progressBarTable[progressBars-1], "BOTTOM", 0, 0);
|
|
end
|
|
|
|
progressBar.text:SetText(string.format("%s", quantityString));
|
|
progressBar:SetMinMaxValues(0, reqQuantity);
|
|
progressBar:SetValue(quantity);
|
|
|
|
progressBar:SetParent(objectivesFrame);
|
|
progressBar:Show();
|
|
|
|
numRows = numRows + 1;
|
|
else
|
|
textStrings = textStrings + 1;
|
|
local criteria = AchievementButton_GetCriteria(textStrings);
|
|
criteria:ClearAllPoints();
|
|
if ( textStrings == 1 ) then
|
|
if ( numCriteria == 1 ) then
|
|
criteria:SetPoint("TOP", objectivesFrame, "TOP", -14, 0);
|
|
else
|
|
criteria:SetPoint("TOPLEFT", objectivesFrame, "TOPLEFT", 0, 0);
|
|
end
|
|
|
|
else
|
|
criteria:SetPoint("TOPLEFT", criteriaTable[textStrings-1], "BOTTOMLEFT", 0, 0);
|
|
end
|
|
|
|
if ( objectivesFrame.completed and completed ) then
|
|
criteria.name:SetTextColor(0, 0, 0, 1);
|
|
criteria.name:SetShadowOffset(0, 0);
|
|
elseif ( completed ) then
|
|
criteria.name:SetTextColor(0, 1, 0, 1);
|
|
criteria.name:SetShadowOffset(1, -1);
|
|
else
|
|
criteria.name:SetTextColor(.6, .6, .6, 1);
|
|
criteria.name:SetShadowOffset(1, -1);
|
|
end
|
|
|
|
if ( completed ) then
|
|
criteria.check:SetPoint("LEFT", 18, -3);
|
|
criteria.name:SetPoint("LEFT", criteria.check, "RIGHT", 0, 2);
|
|
criteria.check:Show();
|
|
criteria.name:SetText(criteriaString);
|
|
else
|
|
criteria.check:SetPoint("LEFT", 0, -3);
|
|
criteria.name:SetPoint("LEFT", criteria.check, "RIGHT", 5, 2);
|
|
criteria.check:Hide();
|
|
criteria.name:SetText("- "..criteriaString);
|
|
end
|
|
|
|
criteria:SetParent(objectivesFrame);
|
|
criteria:Show();
|
|
local stringWidth = criteria.name:GetStringWidth()
|
|
criteria:SetWidth(stringWidth + criteria.check:GetWidth());
|
|
maxCriteriaWidth = max(maxCriteriaWidth, stringWidth + criteria.check:GetWidth());
|
|
|
|
numRows = numRows + 1;
|
|
end
|
|
end
|
|
|
|
if ( textStrings > 0 and progressBars > 0 ) then
|
|
-- If we have text criteria and progressBar criteria, display the progressBar criteria first and position the textStrings under them.
|
|
criteriaTable[1]:ClearAllPoints();
|
|
if ( textStrings == 1 ) then
|
|
criteriaTable[1]:SetPoint("TOP", progressBarTable[progressBars], "BOTTOM", -14, -4);
|
|
else
|
|
criteriaTable[1]:SetPoint("TOP", progressBarTable[progressBars], "BOTTOM", 0, -4);
|
|
criteriaTable[1]:SetPoint("LEFT", objectivesFrame, "LEFT", 0, 0);
|
|
end
|
|
elseif ( textStrings > 1 ) then
|
|
-- Figure out if we can make multiple columns worth of criteria instead of one long one
|
|
local numColumns = floor(ACHIEVEMENTUI_MAXCONTENTWIDTH/maxCriteriaWidth);
|
|
if ( numColumns > 1 ) then
|
|
local step;
|
|
local rows = 1;
|
|
local position = 0;
|
|
for i=1, #criteriaTable do
|
|
position = position + 1;
|
|
if ( position > numColumns ) then
|
|
position = position - numColumns;
|
|
rows = rows + 1;
|
|
end
|
|
|
|
if ( rows == 1 ) then
|
|
criteriaTable[i]:ClearAllPoints();
|
|
criteriaTable[i]:SetPoint("TOPLEFT", objectivesFrame, "TOPLEFT", (position - 1)*(ACHIEVEMENTUI_MAXCONTENTWIDTH/numColumns), 0);
|
|
else
|
|
criteriaTable[i]:ClearAllPoints();
|
|
criteriaTable[i]:SetPoint("TOPLEFT", criteriaTable[position + ((rows - 2) * numColumns)], "BOTTOMLEFT", 0, 0);
|
|
end
|
|
end
|
|
numRows = ceil(numRows/numColumns);
|
|
end
|
|
end
|
|
|
|
if ( metas > 0 ) then
|
|
objectivesFrame:SetHeight(numRows * ACHIEVEMENTBUTTON_METAROWHEIGHT + 10);
|
|
else
|
|
objectivesFrame:SetHeight(numRows * ACHIEVEMENTBUTTON_CRITERIAROWHEIGHT);
|
|
end
|
|
objectivesFrame.mode = ACHIEVEMENTMODE_CRITERIA;
|
|
end
|
|
|
|
-- [[ StatsFrames ]]--
|
|
|
|
function AchievementFrameStats_OnEvent (self, event, ...)
|
|
if ( event == "CRITERIA_UPDATE" and self:IsShown() ) then
|
|
AchievementFrameStats_Update();
|
|
end
|
|
end
|
|
|
|
function AchievementFrameStats_OnLoad (self)
|
|
AchievementFrameStatsContainerScrollBar.Show =
|
|
function (self)
|
|
AchievementFrameStats:SetWidth(504);
|
|
for _, button in next, AchievementFrameStats.buttons do
|
|
button:SetWidth(496);
|
|
end
|
|
getmetatable(self).__index.Show(self);
|
|
end
|
|
|
|
AchievementFrameStatsContainerScrollBar.Hide =
|
|
function (self)
|
|
AchievementFrameStats:SetWidth(530);
|
|
for _, button in next, AchievementFrameStats.buttons do
|
|
button:SetWidth(522);
|
|
end
|
|
getmetatable(self).__index.Hide(self);
|
|
end
|
|
|
|
self:RegisterEvent("CRITERIA_UPDATE");
|
|
AchievementFrameStatsContainerScrollBarBG:Show();
|
|
AchievementFrameStatsContainer.update = AchievementFrameStats_Update;
|
|
HybridScrollFrame_CreateButtons(AchievementFrameStatsContainer, "StatTemplate");
|
|
end
|
|
|
|
local displayStatCategories = {};
|
|
|
|
function AchievementFrameStats_Update ()
|
|
local category = achievementFunctions.selectedCategory;
|
|
local scrollFrame = AchievementFrameStatsContainer;
|
|
local offset = HybridScrollFrame_GetOffset(scrollFrame);
|
|
local buttons = scrollFrame.buttons;
|
|
local numButtons = #buttons;
|
|
local statHeight = 24;
|
|
|
|
local numStats, numCompleted = GetCategoryNumAchievements(category);
|
|
|
|
local categories = ACHIEVEMENTUI_CATEGORIES;
|
|
-- clear out table
|
|
if ( achievementFunctions.lastCategory ~= category ) then
|
|
local statCat;
|
|
for i in next, displayStatCategories do
|
|
displayStatCategories[i] = nil;
|
|
end
|
|
-- build a list of shown category and stat id's
|
|
|
|
tinsert(displayStatCategories, {id = category, header = true});
|
|
for i=1, numStats do
|
|
tinsert(displayStatCategories, {id = GetAchievementInfo(category, i)});
|
|
end
|
|
-- add all the subcategories and their stat id's
|
|
for i, cat in next, categories do
|
|
if ( cat.parent == category ) then
|
|
tinsert(displayStatCategories, {id = cat.id, header = true});
|
|
numStats = GetCategoryNumAchievements(cat.id);
|
|
for k=1, numStats do
|
|
tinsert(displayStatCategories, {id = GetAchievementInfo(cat.id, k)});
|
|
end
|
|
end
|
|
end
|
|
achievementFunctions.lastCategory = category;
|
|
end
|
|
|
|
-- iterate through the displayStatCategories and display them
|
|
local selection = AchievementFrameStats.selection;
|
|
local statCount = #displayStatCategories;
|
|
local statIndex, id, button;
|
|
local stat;
|
|
|
|
local totalHeight = statCount * statHeight;
|
|
local displayedHeight = numButtons * statHeight;
|
|
for i = 1, numButtons do
|
|
button = buttons[i];
|
|
statIndex = offset + i;
|
|
if ( statIndex <= statCount ) then
|
|
stat = displayStatCategories[statIndex];
|
|
if ( stat.header ) then
|
|
AchievementFrameStats_SetHeader(button, stat.id);
|
|
else
|
|
AchievementFrameStats_SetStat(button, stat.id, nil, statIndex);
|
|
end
|
|
button:Show();
|
|
else
|
|
button:Hide();
|
|
end
|
|
end
|
|
HybridScrollFrame_Update(scrollFrame, totalHeight, displayedHeight);
|
|
end
|
|
|
|
function AchievementFrameStats_SetStat(button, category, index, colorIndex, isSummary)
|
|
--Remove these variables when we know for sure we don't need them
|
|
local id, name, points, completed, month, day, year, description, flags, icon;
|
|
if ( not isSummary ) then
|
|
if ( not index ) then
|
|
id, name, points, completed, month, day, year, description, flags, icon = GetAchievementInfo(category);
|
|
else
|
|
id, name, points, completed, month, day, year, description, flags, icon = GetAchievementInfo(category, index);
|
|
end
|
|
|
|
else
|
|
-- This is on the summary page
|
|
id, name, points, completed, month, day, year, description, flags, icon = GetAchievementInfoFromCriteria(category);
|
|
end
|
|
|
|
button.id = id;
|
|
|
|
if ( not colorIndex ) then
|
|
if ( not index ) then
|
|
message("Error, need a color index or index");
|
|
end
|
|
colorIndex = index;
|
|
end
|
|
button:SetText(name);
|
|
button.background:Show();
|
|
-- Color every other line yellow
|
|
if ( mod(colorIndex, 2) == 1 ) then
|
|
button.background:SetTexCoord(0, 1, 0.1875, 0.3671875);
|
|
button.background:SetBlendMode("BLEND");
|
|
button.background:SetAlpha(1.0);
|
|
button:SetHeight(24);
|
|
else
|
|
button.background:SetTexCoord(0, 1, 0.375, 0.5390625);
|
|
button.background:SetBlendMode("ADD");
|
|
button.background:SetAlpha(0.5);
|
|
button:SetHeight(24);
|
|
end
|
|
|
|
-- Figure out the criteria
|
|
local numCriteria = GetAchievementNumCriteria(id);
|
|
if ( numCriteria == 0 ) then
|
|
-- This is no good!
|
|
end
|
|
-- Just show the first criteria for now
|
|
local criteriaString, criteriaType, completed, quantityNumber, reqQuantity, charName, flags, assetID, quantity;
|
|
if ( not isSummary ) then
|
|
quantity = GetStatistic(id);
|
|
else
|
|
criteriaString, criteriaType, completed, quantityNumber, reqQuantity, charName, flags, assetID, quantity = GetAchievementCriteriaInfo(category);
|
|
end
|
|
if ( not quantity ) then
|
|
quantity = "--";
|
|
end
|
|
button.value:SetText(quantity);
|
|
|
|
-- Hide the header images
|
|
button.title:Hide();
|
|
button.left:Hide();
|
|
button.middle:Hide();
|
|
button.right:Hide();
|
|
button.isHeader = false;
|
|
end
|
|
|
|
function AchievementFrameStats_SetHeader(button, id)
|
|
-- show header
|
|
button.left:Show();
|
|
button.middle:Show();
|
|
button.right:Show();
|
|
local text;
|
|
if ( id == ACHIEVEMENT_COMPARISON_STATS_SUMMARY_ID ) then
|
|
text = ACHIEVEMENT_SUMMARY_CATEGORY;
|
|
else
|
|
text = GetCategoryInfo(id);
|
|
end
|
|
button.title:SetText(text);
|
|
button.title:Show();
|
|
button.value:SetText("");
|
|
button:SetText("");
|
|
button:SetHeight(24);
|
|
button.background:Hide();
|
|
button.isHeader = true;
|
|
button.id = id;
|
|
end
|
|
|
|
function AchievementStatButton_OnLoad(self, parentFrame)
|
|
local name = self:GetName();
|
|
self.background = _G[name.."BG"];
|
|
self.left = _G[name.."HeaderLeft"];
|
|
self.middle = _G[name.."HeaderMiddle"];
|
|
self.right = _G[name.."HeaderRight"];
|
|
self.text = _G[name.."Text"];
|
|
self.title = _G[name.."Title"];
|
|
self.value = _G[name.."Value"];
|
|
self.value:SetVertexColor(1, 0.97, 0.6);
|
|
parentFrame.buttons = parentFrame.buttons or {};
|
|
tinsert(parentFrame.buttons, self);
|
|
end
|
|
|
|
function AchievementStatButton_OnClick(self)
|
|
if ( self.isHeader ) then
|
|
achievementFunctions.selectedCategory = self.id;
|
|
AchievementFrameCategories_Update();
|
|
AchievementFrameStats_Update();
|
|
elseif ( self.summary ) then
|
|
AchievementFrame_SelectSummaryStatistic(self.id);
|
|
end
|
|
end
|
|
|
|
-- [[ Summary Frame ]] --
|
|
function AchievementFrameSummary_OnShow()
|
|
if ( achievementFunctions ~= COMPARISON_ACHIEVEMENT_FUNCTIONS and achievementFunctions ~= COMPARISON_STAT_FUNCTIONS ) then
|
|
AchievementFrameSummary:SetWidth(530);
|
|
AchievementFrameSummary_Update();
|
|
else
|
|
AchievementFrameComparisonDark:Hide();
|
|
AchievementFrameComparisonWatermark:Hide();
|
|
AchievementFrameComparison:SetWidth(650);
|
|
AchievementFrameSummary:SetWidth(650);
|
|
AchievementFrameSummary_Update(true);
|
|
end
|
|
end
|
|
|
|
function AchievementFrameSummary_Update(isCompare)
|
|
AchievementFrameSummaryCategoriesStatusBar_Update();
|
|
AchievementFrameSummary_UpdateAchievements(GetLatestCompletedAchievements());
|
|
end
|
|
|
|
function AchievementFrameSummary_UpdateAchievements(...)
|
|
local numAchievements = select("#", ...);
|
|
local id, name, points, completed, month, day, year, description, flags, icon;
|
|
local buttons = AchievementFrameSummaryAchievements.buttons;
|
|
local button, anchorTo, achievementID;
|
|
local defaultAchievementCount = 1;
|
|
|
|
for i=1, ACHIEVEMENTUI_MAX_SUMMARY_ACHIEVEMENTS do
|
|
if ( buttons ) then
|
|
button = buttons[i];
|
|
end
|
|
if ( not button ) then
|
|
button = CreateFrame("Button", "AchievementFrameSummaryAchievement"..i, AchievementFrameSummaryAchievements, "SummaryAchievementTemplate");
|
|
|
|
if ( i == 1 ) then
|
|
button:SetPoint("TOPLEFT",AchievementFrameSummaryAchievementsHeader, "BOTTOMLEFT", 18, 2 );
|
|
button:SetPoint("TOPRIGHT",AchievementFrameSummaryAchievementsHeader, "BOTTOMRIGHT", -18, 2 );
|
|
else
|
|
anchorTo = _G["AchievementFrameSummaryAchievement"..i-1];
|
|
button:SetPoint("TOPLEFT",anchorTo, "BOTTOMLEFT", 0, 3 );
|
|
button:SetPoint("TOPRIGHT",anchorTo, "BOTTOMRIGHT", 0, 3 );
|
|
end
|
|
|
|
if ( not buttons ) then
|
|
buttons = AchievementFrameSummaryAchievements.buttons;
|
|
end
|
|
AchievementFrameSummary_LocalizeButton(button);
|
|
end;
|
|
|
|
if ( i <= numAchievements ) then
|
|
achievementID = select(i, ...);
|
|
id, name, points, completed, month, day, year, description, flags, icon = GetAchievementInfo(achievementID);
|
|
button.label:SetText(name);
|
|
button.description:SetText(description);
|
|
AchievementShield_SetPoints(points, button.shield.points, GameFontNormal, GameFontNormalSmall);
|
|
if ( points > 0 ) then
|
|
button.shield.icon:SetTexture([[Interface\AchievementFrame\UI-Achievement-Shields]]);
|
|
else
|
|
button.shield.icon:SetTexture([[Interface\AchievementFrame\UI-Achievement-Shields-NoPoints]]);
|
|
end
|
|
button.icon.texture:SetTexture(icon);
|
|
button.id = id;
|
|
|
|
if ( completed ) then
|
|
button.dateCompleted:SetText(string.format(SHORTDATE, day, month, year));
|
|
else
|
|
button.dateCompleted:SetText("");
|
|
end
|
|
|
|
button:Saturate();
|
|
button.tooltipTitle = nil;
|
|
button:Show();
|
|
else
|
|
for i=defaultAchievementCount, ACHIEVEMENTUI_MAX_SUMMARY_ACHIEVEMENTS do
|
|
achievementID = ACHIEVEMENTUI_DEFAULTSUMMARYACHIEVEMENTS[defaultAchievementCount];
|
|
if ( not achievementID ) then
|
|
break;
|
|
end
|
|
id, name, points, completed, month, day, year, description, flags, icon = GetAchievementInfo(achievementID);
|
|
if ( completed ) then
|
|
defaultAchievementCount = defaultAchievementCount+1;
|
|
else
|
|
id, name, points, completed, month, day, year, description, flags, icon = GetAchievementInfo(achievementID);
|
|
button.label:SetText(name);
|
|
button.description:SetText(description);
|
|
AchievementShield_SetPoints(points, button.shield.points, GameFontNormal, GameFontNormalSmall);
|
|
if ( points > 0 ) then
|
|
button.shield.icon:SetTexture([[Interface\AchievementFrame\UI-Achievement-Shields]]);
|
|
else
|
|
button.shield.icon:SetTexture([[Interface\AchievementFrame\UI-Achievement-Shields-NoPoints]]);
|
|
end
|
|
button.icon.texture:SetTexture(icon);
|
|
button.id = id;
|
|
if ( month ) then
|
|
button.dateCompleted:SetText(string.format(SHORTDATE, day, month, year));
|
|
else
|
|
button.dateCompleted:SetText("");
|
|
end
|
|
button:Show();
|
|
defaultAchievementCount = defaultAchievementCount+1;
|
|
button:Desaturate();
|
|
button.tooltipTitle = SUMMARY_ACHIEVEMENT_INCOMPLETE;
|
|
button.tooltip = SUMMARY_ACHIEVEMENT_INCOMPLETE_TEXT;
|
|
break;
|
|
end
|
|
end
|
|
end
|
|
end
|
|
if ( numAchievements == 0 ) then
|
|
AchievementFrameSummaryAchievementsEmptyText:Show();
|
|
else
|
|
AchievementFrameSummaryAchievementsEmptyText:Hide();
|
|
end
|
|
end
|
|
|
|
function AchievementFrameSummaryCategoriesStatusBar_Update()
|
|
local total, completed = GetNumCompletedAchievements();
|
|
AchievementFrameSummaryCategoriesStatusBar:SetMinMaxValues(0, total);
|
|
AchievementFrameSummaryCategoriesStatusBar:SetValue(completed);
|
|
AchievementFrameSummaryCategoriesStatusBarText:SetText(completed.."/"..total);
|
|
end
|
|
|
|
function AchievementFrameSummaryAchievement_OnLoad(self)
|
|
AchievementComparisonPlayerButton_OnLoad(self);
|
|
self.highlight = _G[self:GetName().."Highlight"];
|
|
AchievementFrameSummaryAchievements.buttons = AchievementFrameSummaryAchievements.buttons or {};
|
|
tinsert(AchievementFrameSummaryAchievements.buttons, self);
|
|
self:Saturate();
|
|
self:SetBackdropBorderColor(ACHIEVEMENTUI_REDBORDER_R, ACHIEVEMENTUI_REDBORDER_G, ACHIEVEMENTUI_REDBORDER_B, 0.5);
|
|
self.titleBar:SetVertexColor(1,1,1,0.5);
|
|
self.dateCompleted:Show();
|
|
end
|
|
|
|
function AchievementFrameSummaryAchievement_OnClick(self)
|
|
local id = self.id
|
|
local nextID, completed = GetNextAchievement(id);
|
|
if ( nextID and completed ) then
|
|
local newID;
|
|
while ( nextID and completed ) do
|
|
newID, completed = GetNextAchievement(nextID);
|
|
if ( completed ) then
|
|
nextID = newID;
|
|
end
|
|
end
|
|
id = nextID;
|
|
end
|
|
|
|
AchievementFrame_SelectAchievement(id);
|
|
end
|
|
|
|
function AchievementFrameSummaryAchievement_OnEnter(self)
|
|
self.highlight:Show();
|
|
if ( self.tooltipTitle ) then
|
|
GameTooltip:SetOwner(self, "ANCHOR_RIGHT");
|
|
GameTooltip:SetText(self.tooltipTitle,1,1,1);
|
|
GameTooltip:AddLine(self.tooltip, nil, nil, nil, 1);
|
|
GameTooltip:Show();
|
|
end
|
|
end
|
|
|
|
function AchievementFrameSummaryCategoryButton_OnClick (self)
|
|
local id = self:GetParent():GetID();
|
|
for _, button in next, AchievementFrameCategoriesContainer.buttons do
|
|
if ( button.categoryID == id ) then
|
|
button:Click();
|
|
return;
|
|
end
|
|
end
|
|
end
|
|
|
|
function AchievementFrameSummaryCategory_OnLoad (self)
|
|
self:SetMinMaxValues(0, 100);
|
|
self:SetValue(0);
|
|
local name = self:GetName();
|
|
self.text = _G[name .. "Text"];
|
|
|
|
local categoryName = GetCategoryInfo(self:GetID());
|
|
_G[name .. "Label"]:SetText(categoryName);
|
|
end
|
|
|
|
function AchievementFrame_GetCategoryTotalNumAchievements (id, showAll)
|
|
-- Not recursive because we only have one deep and this saves time.
|
|
local totalAchievements, totalCompleted = 0, 0;
|
|
local numAchievements, numCompleted = GetCategoryNumAchievements(id, showAll);
|
|
totalAchievements = totalAchievements + numAchievements;
|
|
totalCompleted = totalCompleted + numCompleted;
|
|
|
|
for _, category in next, ACHIEVEMENTUI_CATEGORIES do
|
|
if ( category.parent == id ) then
|
|
numAchievements, numCompleted = GetCategoryNumAchievements(category.id, showAll);
|
|
totalAchievements = totalAchievements + numAchievements;
|
|
totalCompleted = totalCompleted + numCompleted;
|
|
end
|
|
end
|
|
|
|
return totalAchievements, totalCompleted;
|
|
end
|
|
|
|
function AchievementFrameSummaryCategory_OnEvent (self, event, ...)
|
|
AchievementFrameSummaryCategory_OnShow(self);
|
|
end
|
|
|
|
function AchievementFrameSummaryCategory_OnShow (self)
|
|
local totalAchievements, totalCompleted = AchievementFrame_GetCategoryTotalNumAchievements(self:GetID(), true);
|
|
|
|
self.text:SetText(string.format("%d/%d", totalCompleted, totalAchievements));
|
|
self:SetMinMaxValues(0, totalAchievements);
|
|
self:SetValue(totalCompleted);
|
|
self:RegisterEvent("ACHIEVEMENT_EARNED");
|
|
end
|
|
|
|
function AchievementFrameSummaryCategory_OnHide (self)
|
|
self:UnregisterEvent("ACHIEVEMENT_EARNED");
|
|
end
|
|
|
|
function AchievementFrame_SelectAchievement(id, forceSelect)
|
|
if ( not AchievementFrame:IsShown() and not forceSelect ) then
|
|
return;
|
|
end
|
|
|
|
local _, _, _, achCompleted = GetAchievementInfo(id);
|
|
if ( achCompleted and (ACHIEVEMENTUI_SELECTEDFILTER == AchievementFrameFilters[ACHIEVEMENT_FILTER_INCOMPLETE].func) ) then
|
|
AchievementFrame_SetFilter(ACHIEVEMENT_FILTER_ALL);
|
|
elseif ( (not achCompleted) and (ACHIEVEMENTUI_SELECTEDFILTER == AchievementFrameFilters[ACHIEVEMENT_FILTER_COMPLETE].func) ) then
|
|
AchievementFrame_SetFilter(ACHIEVEMENT_FILTER_ALL);
|
|
end
|
|
|
|
AchievementFrameTab_OnClick = AchievementFrameBaseTab_OnClick;
|
|
AchievementFrameTab_OnClick(1);
|
|
AchievementFrameSummary:Hide();
|
|
AchievementFrameAchievements:Show();
|
|
|
|
-- Figure out if this is part of a progressive achievement; if it is and it's incomplete, make sure the previous level was completed. If not, find the first incomplete achievement in the chain and display that instead.
|
|
local _, _, _, completed = GetAchievementInfo(id);
|
|
if ( not completed and GetPreviousAchievement(id) ) then
|
|
local prevID = GetPreviousAchievement(id);
|
|
_, _, _, completed = GetAchievementInfo(prevID);
|
|
while ( prevID and not completed ) do
|
|
id = prevID;
|
|
prevID = GetPreviousAchievement(id);
|
|
if ( prevID ) then
|
|
_, _, _, completed = GetAchievementInfo(prevID);
|
|
end
|
|
end
|
|
elseif ( completed ) then
|
|
local nextID, completed = GetNextAchievement(id);
|
|
if ( nextID and completed ) then
|
|
local newID
|
|
while ( nextID and completed ) do
|
|
newID, completed = GetNextAchievement(nextID);
|
|
if ( completed ) then
|
|
nextID = newID;
|
|
end
|
|
end
|
|
id = nextID;
|
|
end
|
|
end
|
|
|
|
AchievementFrameCategories_ClearSelection();
|
|
local category = GetAchievementCategory(id);
|
|
|
|
local categoryIndex, parent, hidden = 0;
|
|
for i, entry in next, ACHIEVEMENTUI_CATEGORIES do
|
|
if ( entry.id == category ) then
|
|
parent = entry.parent;
|
|
end
|
|
end
|
|
|
|
for i, entry in next, ACHIEVEMENTUI_CATEGORIES do
|
|
if ( entry.id == parent ) then
|
|
entry.collapsed = false;
|
|
elseif ( entry.parent == parent ) then
|
|
entry.hidden = false;
|
|
elseif ( entry.parent == true ) then
|
|
entry.collapsed = true;
|
|
elseif ( entry.parent ) then
|
|
entry.hidden = true;
|
|
end
|
|
end
|
|
|
|
achievementFunctions.selectedCategory = category;
|
|
AchievementFrameCategoriesContainerScrollBar:SetValue(0);
|
|
AchievementFrameCategories_Update();
|
|
|
|
local shown, i = false, 1;
|
|
while ( not shown ) do
|
|
for _, button in next, AchievementFrameCategoriesContainer.buttons do
|
|
if ( button.categoryID == category and math.ceil(button:GetBottom()) >= math.ceil(AchievementFrameAchievementsContainer:GetBottom())) then
|
|
shown = true;
|
|
end
|
|
end
|
|
|
|
if ( not shown ) then
|
|
local _, maxVal = AchievementFrameCategoriesContainerScrollBar:GetMinMaxValues();
|
|
if ( AchievementFrameCategoriesContainerScrollBar:GetValue() == maxVal ) then
|
|
--assert(false)
|
|
return;
|
|
else
|
|
HybridScrollFrame_OnMouseWheel(AchievementFrameCategoriesContainer, -1);
|
|
end
|
|
end
|
|
|
|
-- Remove me if everything's working fine
|
|
i = i + 1;
|
|
if ( i > 100 ) then
|
|
--assert(false);
|
|
return;
|
|
end
|
|
end
|
|
|
|
AchievementFrameAchievements_ClearSelection();
|
|
AchievementFrameAchievementsContainerScrollBar:SetValue(0);
|
|
AchievementFrameAchievements_Update();
|
|
|
|
local shown = false;
|
|
while ( not shown ) do
|
|
for _, button in next, AchievementFrameAchievementsContainer.buttons do
|
|
if ( button.id == id and math.ceil(button:GetTop()) >= math.ceil(AchievementFrameAchievementsContainer:GetBottom())) then
|
|
-- The "True" here ignores modifiers, so you don't accidentally track or link this achievement. :P
|
|
AchievementButton_OnClick(button, true);
|
|
|
|
-- We found the button!
|
|
shown = button;
|
|
break;
|
|
end
|
|
end
|
|
|
|
local _, maxVal = AchievementFrameAchievementsContainerScrollBar:GetMinMaxValues();
|
|
if ( shown ) then
|
|
-- If we can, move the achievement we're scrolling to to the top of the screen.
|
|
local newHeight = AchievementFrameAchievementsContainerScrollBar:GetValue() + AchievementFrameAchievementsContainer:GetTop() - shown:GetTop();
|
|
newHeight = min(newHeight, maxVal);
|
|
AchievementFrameAchievementsContainerScrollBar:SetValue(newHeight);
|
|
else
|
|
if ( AchievementFrameAchievementsContainerScrollBar:GetValue() == maxVal ) then
|
|
--assert(false, "Failed to find achievement " .. id .. " while jumping!")
|
|
return;
|
|
else
|
|
HybridScrollFrame_OnMouseWheel(AchievementFrameAchievementsContainer, -1);
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
function AchievementFrameAchievements_FindSelection()
|
|
local _, maxVal = AchievementFrameAchievementsContainerScrollBar:GetMinMaxValues();
|
|
local scrollHeight = AchievementFrameAchievementsContainer:GetHeight();
|
|
local newHeight = 0;
|
|
AchievementFrameAchievementsContainerScrollBar:SetValue(0);
|
|
while ( not shown ) do
|
|
for _, button in next, AchievementFrameAchievementsContainer.buttons do
|
|
if ( button.selected ) then
|
|
newHeight = AchievementFrameAchievementsContainerScrollBar:GetValue() + AchievementFrameAchievementsContainer:GetTop() - button:GetTop();
|
|
newHeight = min(newHeight, maxVal);
|
|
AchievementFrameAchievementsContainerScrollBar:SetValue(newHeight);
|
|
return;
|
|
end
|
|
end
|
|
if ( AchievementFrameAchievementsContainerScrollBar:GetValue() == maxVal ) then
|
|
return;
|
|
else
|
|
newHeight = newHeight + scrollHeight;
|
|
newHeight = min(newHeight, maxVal);
|
|
AchievementFrameAchievementsContainerScrollBar:SetValue(newHeight);
|
|
end
|
|
end
|
|
end
|
|
|
|
function AchievementFrameAchievements_AdjustSelection()
|
|
local selectedButton;
|
|
-- check if selection is visible
|
|
for _, button in next, AchievementFrameAchievementsContainer.buttons do
|
|
if ( button.selected ) then
|
|
selectedButton = button;
|
|
break;
|
|
end
|
|
end
|
|
|
|
if ( not selectedButton ) then
|
|
AchievementFrameAchievements_FindSelection();
|
|
else
|
|
local newHeight;
|
|
if ( selectedButton:GetTop() > AchievementFrameAchievementsContainer:GetTop() ) then
|
|
newHeight = AchievementFrameAchievementsContainerScrollBar:GetValue() + AchievementFrameAchievementsContainer:GetTop() - selectedButton:GetTop();
|
|
elseif ( selectedButton:GetBottom() < AchievementFrameAchievementsContainer:GetBottom() ) then
|
|
if ( selectedButton:GetHeight() > AchievementFrameAchievementsContainer:GetHeight() ) then
|
|
newHeight = AchievementFrameAchievementsContainerScrollBar:GetValue() + AchievementFrameAchievementsContainer:GetTop() - selectedButton:GetTop();
|
|
else
|
|
newHeight = AchievementFrameAchievementsContainerScrollBar:GetValue() + AchievementFrameAchievementsContainer:GetBottom() - selectedButton:GetBottom();
|
|
end
|
|
end
|
|
if ( newHeight ) then
|
|
local _, maxVal = AchievementFrameAchievementsContainerScrollBar:GetMinMaxValues();
|
|
newHeight = min(newHeight, maxVal);
|
|
AchievementFrameAchievementsContainerScrollBar:SetValue(newHeight);
|
|
end
|
|
end
|
|
end
|
|
|
|
function AchievementFrame_SelectSummaryStatistic (criteriaId)
|
|
AchievementFrameTab_OnClick = AchievementFrameBaseTab_OnClick;
|
|
AchievementFrameTab_OnClick(2);
|
|
AchievementFrameStats:Show();
|
|
AchievementFrameSummary:Hide();
|
|
|
|
AchievementFrameCategories_ClearSelection();
|
|
|
|
local id = GetAchievementInfoFromCriteria(criteriaId);
|
|
local category = GetAchievementCategory(id);
|
|
|
|
local categoryIndex, parent, hidden = 0;
|
|
|
|
local categoryIndex, parent, hidden = 0;
|
|
for i, entry in next, ACHIEVEMENTUI_CATEGORIES do
|
|
if ( entry.id == category ) then
|
|
parent = entry.parent;
|
|
end
|
|
end
|
|
|
|
for i, entry in next, ACHIEVEMENTUI_CATEGORIES do
|
|
if ( entry.id == parent ) then
|
|
entry.collapsed = false;
|
|
elseif ( entry.parent == parent ) then
|
|
entry.hidden = false;
|
|
elseif ( entry.parent == true ) then
|
|
entry.collapsed = true;
|
|
elseif ( entry.parent ) then
|
|
entry.hidden = true;
|
|
end
|
|
end
|
|
|
|
achievementFunctions.selectedCategory = category;
|
|
AchievementFrameCategories_Update();
|
|
AchievementFrameCategoriesContainerScrollBar:SetValue(0);
|
|
|
|
local shown, i = false, 1;
|
|
while ( not shown ) do
|
|
for _, button in next, AchievementFrameCategoriesContainer.buttons do
|
|
if ( button.categoryID == category and math.ceil(button:GetBottom()) >= math.ceil(AchievementFrameAchievementsContainer:GetBottom())) then
|
|
shown = true;
|
|
end
|
|
end
|
|
|
|
if ( not shown ) then
|
|
local _, maxVal = AchievementFrameCategoriesContainerScrollBar:GetMinMaxValues();
|
|
if ( AchievementFrameCategoriesContainerScrollBar:GetValue() == maxVal ) then
|
|
assert(false)
|
|
else
|
|
HybridScrollFrame_OnMouseWheel(AchievementFrameCategoriesContainer, -1);
|
|
end
|
|
end
|
|
|
|
-- Remove me if everything's working fine
|
|
i = i + 1;
|
|
if ( i > 100 ) then
|
|
assert(false);
|
|
end
|
|
end
|
|
|
|
AchievementFrameStats_Update();
|
|
AchievementFrameStatsContainerScrollBar:SetValue(0);
|
|
|
|
local shown, i = false, 1;
|
|
while ( not shown ) do
|
|
for _, button in next, AchievementFrameStatsContainer.buttons do
|
|
if ( button.id == id and math.ceil(button:GetBottom()) >= math.ceil(AchievementFrameStatsContainer:GetBottom())) then
|
|
AchievementStatButton_OnClick(button);
|
|
|
|
-- We found the button! MAKE IT SHOWN ZOMG!
|
|
shown = button;
|
|
end
|
|
end
|
|
|
|
if ( shown and AchievementFrameStatsContainerScrollBar:IsShown() ) then
|
|
-- If we can, move the achievement we're scrolling to to the top of the screen.
|
|
AchievementFrameStatsContainerScrollBar:SetValue(AchievementFrameStatsContainerScrollBar:GetValue() + AchievementFrameStatsContainer:GetTop() - shown:GetTop());
|
|
elseif ( not shown ) then
|
|
local _, maxVal = AchievementFrameStatsContainerScrollBar:GetMinMaxValues();
|
|
if ( AchievementFrameStatsContainerScrollBar:GetValue() == maxVal ) then
|
|
assert(false)
|
|
else
|
|
HybridScrollFrame_OnMouseWheel(AchievementFrameStatsContainer, -1);
|
|
end
|
|
end
|
|
|
|
-- Remove me if everything's working fine.
|
|
i = i + 1;
|
|
if ( i > 100 ) then
|
|
assert(false);
|
|
end
|
|
end
|
|
end
|
|
|
|
function AchievementFrameComparison_OnLoad (self)
|
|
AchievementFrameComparisonContainer_OnLoad(self);
|
|
AchievementFrameComparisonStatsContainer_OnLoad(self);
|
|
self:RegisterEvent("ACHIEVEMENT_EARNED");
|
|
self:RegisterEvent("INSPECT_ACHIEVEMENT_READY");
|
|
end
|
|
|
|
function AchievementFrameComparisonContainer_OnLoad (parent)
|
|
AchievementFrameComparisonContainerScrollBar.Show =
|
|
function (self)
|
|
AchievementFrameComparison:SetWidth(626);
|
|
AchievementFrameComparisonSummaryPlayer:SetWidth(498);
|
|
for _, button in next, AchievementFrameComparisonContainer.buttons do
|
|
button:SetWidth(616);
|
|
button.player:SetWidth(498);
|
|
end
|
|
getmetatable(self).__index.Show(self);
|
|
end
|
|
|
|
AchievementFrameComparisonContainerScrollBar.Hide =
|
|
function (self)
|
|
AchievementFrameComparison:SetWidth(650);
|
|
AchievementFrameComparisonSummaryPlayer:SetWidth(522);
|
|
for _, button in next, AchievementFrameComparisonContainer.buttons do
|
|
button:SetWidth(640);
|
|
button.player:SetWidth(522);
|
|
end
|
|
getmetatable(self).__index.Hide(self);
|
|
end
|
|
|
|
AchievementFrameComparisonContainerScrollBarBG:Show();
|
|
AchievementFrameComparisonContainer.update = AchievementFrameComparison_Update;
|
|
HybridScrollFrame_CreateButtons(AchievementFrameComparisonContainer, "ComparisonTemplate", 0, -2);
|
|
end
|
|
|
|
function AchievementFrameComparisonStatsContainer_OnLoad (parent)
|
|
AchievementFrameComparisonStatsContainerScrollBar.Show =
|
|
function (self)
|
|
AchievementFrameComparison:SetWidth(626);
|
|
for _, button in next, AchievementFrameComparisonStatsContainer.buttons do
|
|
button:SetWidth(616);
|
|
end
|
|
getmetatable(self).__index.Show(self);
|
|
end
|
|
|
|
AchievementFrameComparisonStatsContainerScrollBar.Hide =
|
|
function (self)
|
|
AchievementFrameComparison:SetWidth(650);
|
|
for _, button in next, AchievementFrameComparisonStatsContainer.buttons do
|
|
button:SetWidth(640);
|
|
end
|
|
getmetatable(self).__index.Hide(self);
|
|
end
|
|
|
|
AchievementFrameComparisonStatsContainerScrollBarBG:Show();
|
|
AchievementFrameComparisonStatsContainer.update = AchievementFrameComparison_UpdateStats;
|
|
HybridScrollFrame_CreateButtons(AchievementFrameComparisonStatsContainer, "ComparisonStatTemplate", 0, -2);
|
|
end
|
|
|
|
function AchievementFrameComparison_OnShow ()
|
|
AchievementFrameStats:Hide();
|
|
AchievementFrameAchievements:Hide();
|
|
AchievementFrame:SetWidth(890);
|
|
AchievementFrame:SetAttribute("UIPanelLayout-xOffset", 38);
|
|
UpdateUIPanelPositions(AchievementFrame);
|
|
AchievementFrame.isComparison = true;
|
|
end
|
|
|
|
function AchievementFrameComparison_OnHide ()
|
|
AchievementFrame.selectedTab = nil;
|
|
AchievementFrame:SetWidth(768);
|
|
AchievementFrame:SetAttribute("UIPanelLayout-xOffset", 80);
|
|
UpdateUIPanelPositions(AchievementFrame);
|
|
AchievementFrame.isComparison = false;
|
|
ClearAchievementComparisonUnit();
|
|
end
|
|
|
|
function AchievementFrameComparison_OnEvent (self, event, ...)
|
|
if ( event == "INSPECT_ACHIEVEMENT_READY" ) then
|
|
AchievementFrameComparisonHeaderPoints:SetText(GetComparisonAchievementPoints());
|
|
AchievementFrameComparison_UpdateStatusBars(achievementFunctions.selectedCategory)
|
|
elseif ( event == "UNIT_PORTRAIT_UPDATE" ) then
|
|
local updateUnit = ...;
|
|
if ( updateUnit and updateUnit == AchievementFrameComparisonHeaderPortrait.unit and UnitName(updateUnit) == AchievementFrameComparisonHeaderName:GetText() ) then
|
|
SetPortraitTexture(AchievementFrameComparisonHeaderPortrait, updateUnit);
|
|
end
|
|
end
|
|
|
|
AchievementFrameComparison_ForceUpdate();
|
|
end
|
|
|
|
function AchievementFrameComparison_SetUnit (unit)
|
|
ClearAchievementComparisonUnit();
|
|
SetAchievementComparisonUnit(unit);
|
|
|
|
AchievementFrameComparisonHeaderPoints:SetText(GetComparisonAchievementPoints());
|
|
AchievementFrameComparisonHeaderName:SetText(UnitName(unit));
|
|
SetPortraitTexture(AchievementFrameComparisonHeaderPortrait, unit);
|
|
AchievementFrameComparisonHeaderPortrait.unit = unit;
|
|
AchievementFrameComparisonHeaderPortrait.race = UnitRace(unit);
|
|
AchievementFrameComparisonHeaderPortrait.sex = UnitSex(unit);
|
|
end
|
|
|
|
function AchievementFrameComparison_ClearSelection ()
|
|
-- Doesn't do anything WHEE~!
|
|
end
|
|
|
|
function AchievementFrameComparison_ForceUpdate ()
|
|
if ( achievementFunctions == COMPARISON_ACHIEVEMENT_FUNCTIONS ) then
|
|
local buttons = AchievementFrameComparisonContainer.buttons;
|
|
for i, button in next, buttons do
|
|
button.id = nil;
|
|
end
|
|
|
|
AchievementFrameComparison_Update();
|
|
elseif ( achievementFunctions == COMPARISON_STAT_FUNCTIONS ) then
|
|
AchievementFrameComparison_UpdateStats();
|
|
end
|
|
end
|
|
|
|
function AchievementFrameComparison_Update ()
|
|
local category = achievementFunctions.selectedCategory;
|
|
if ( not category or category == "summary" ) then
|
|
return;
|
|
end
|
|
local scrollFrame = AchievementFrameComparisonContainer
|
|
|
|
local offset = HybridScrollFrame_GetOffset(scrollFrame);
|
|
local buttons = scrollFrame.buttons;
|
|
local numAchievements, numCompleted = GetCategoryNumAchievements(category);
|
|
local numButtons = #buttons;
|
|
|
|
local achievementIndex;
|
|
local buttonHeight = buttons[1]:GetHeight();
|
|
for i = 1, numButtons do
|
|
achievementIndex = i + offset;
|
|
AchievementFrameComparison_DisplayAchievement(buttons[i], category, achievementIndex);
|
|
end
|
|
|
|
HybridScrollFrame_Update(scrollFrame, buttonHeight*numAchievements, buttonHeight*numButtons);
|
|
end
|
|
|
|
ACHIEVEMENTCOMPARISON_PLAYERSHIELDFONT1 = GameFontNormal;
|
|
ACHIEVEMENTCOMPARISON_PLAYERSHIELDFONT2 = GameFontNormalSmall;
|
|
ACHIEVEMENTCOMPARISON_FRIENDSHIELDFONT1 = GameFontNormalSmall;
|
|
ACHIEVEMENTCOMPARISON_FRIENDSHIELDFONT2 = GameFontNormalSmall;
|
|
|
|
function AchievementFrameComparison_DisplayAchievement (button, category, index)
|
|
local id, name, points, completed, month, day, year, description, flags, icon, rewardText = GetAchievementInfo(category, index);
|
|
if ( not id ) then
|
|
button:Hide();
|
|
return;
|
|
else
|
|
button:Show();
|
|
end
|
|
|
|
if ( GetPreviousAchievement(id) ) then
|
|
-- If this is a progressive achievement, show the total score.
|
|
points = AchievementButton_GetProgressivePoints(id);
|
|
end
|
|
|
|
if ( button.id ~= id ) then
|
|
button.id = id;
|
|
|
|
local player = button.player;
|
|
local friend = button.friend;
|
|
|
|
local friendCompleted, friendMonth, friendDay, friendYear = GetAchievementComparisonInfo(id);
|
|
player.label:SetText(name);
|
|
|
|
player.description:SetText(description);
|
|
|
|
player.icon.texture:SetTexture(icon);
|
|
friend.icon.texture:SetTexture(icon);
|
|
|
|
if ( points > 0 ) then
|
|
player.shield.icon:SetTexture([[Interface\AchievementFrame\UI-Achievement-Shields]]);
|
|
friend.shield.icon:SetTexture([[Interface\AchievementFrame\UI-Achievement-Shields]]);
|
|
else
|
|
player.shield.icon:SetTexture([[Interface\AchievementFrame\UI-Achievement-Shields-NoPoints]]);
|
|
friend.shield.icon:SetTexture([[Interface\AchievementFrame\UI-Achievement-Shields-NoPoints]]);
|
|
end
|
|
AchievementShield_SetPoints(points, player.shield.points, ACHIEVEMENTCOMPARISON_PLAYERSHIELDFONT1, ACHIEVEMENTCOMPARISON_PLAYERSHIELDFONT2);
|
|
AchievementShield_SetPoints(points, friend.shield.points, ACHIEVEMENTCOMPARISON_FRIENDSHIELDFONT1, ACHIEVEMENTCOMPARISON_FRIENDSHIELDFONT2);
|
|
|
|
if ( completed and not player.completed ) then
|
|
player.completed = true;
|
|
player.dateCompleted:SetText(string.format(SHORTDATE, day, month, year));
|
|
player.dateCompleted:Show();
|
|
player:Saturate();
|
|
elseif ( completed ) then
|
|
player.dateCompleted:SetText(string.format(SHORTDATE, day, month, year));
|
|
else
|
|
player.completed = nil;
|
|
player.dateCompleted:Hide();
|
|
player:Desaturate();
|
|
end
|
|
|
|
if ( friendCompleted and not friend.completed ) then
|
|
friend.completed = true;
|
|
friend.status:SetText(string.format(SHORTDATE, friendDay, friendMonth, friendYear));
|
|
friend:Saturate();
|
|
elseif ( friendCompleted ) then
|
|
friend.status:SetText(string.format(SHORTDATE, friendDay, friendMonth, friendYear));
|
|
else
|
|
friend.completed = nil;
|
|
friend.status:SetText(INCOMPLETE);
|
|
friend:Desaturate();
|
|
end
|
|
end
|
|
end
|
|
|
|
local displayStatCategories = {};
|
|
function AchievementFrameComparison_UpdateStats ()
|
|
local category = achievementFunctions.selectedCategory;
|
|
local scrollFrame = AchievementFrameComparisonStatsContainer;
|
|
local offset = HybridScrollFrame_GetOffset(scrollFrame);
|
|
local buttons = scrollFrame.buttons;
|
|
local numButtons = #buttons;
|
|
local headerHeight = 24;
|
|
local statHeight = 24;
|
|
local totalHeight = 0;
|
|
local numStats, numCompleted = GetCategoryNumAchievements(category);
|
|
|
|
local categories = ACHIEVEMENTUI_CATEGORIES;
|
|
-- clear out table
|
|
if ( achievementFunctions.lastCategory ~= category ) then
|
|
local statCat;
|
|
for i in next, displayStatCategories do
|
|
displayStatCategories[i] = nil;
|
|
end
|
|
-- build a list of shown category and stat id's
|
|
|
|
tinsert(displayStatCategories, {id = category, header = true});
|
|
totalHeight = totalHeight+headerHeight;
|
|
|
|
for i=1, numStats do
|
|
tinsert(displayStatCategories, {id = GetAchievementInfo(category, i)});
|
|
totalHeight = totalHeight+statHeight;
|
|
end
|
|
achievementFunctions.lastCategory = category;
|
|
achievementFunctions.lastHeight = totalHeight;
|
|
else
|
|
totalHeight = achievementFunctions.lastHeight;
|
|
end
|
|
|
|
-- add all the subcategories and their stat id's
|
|
for i, cat in next, categories do
|
|
if ( cat.parent == category ) then
|
|
tinsert(displayStatCategories, {id = cat.id, header = true});
|
|
totalHeight = totalHeight+headerHeight;
|
|
numStats = GetCategoryNumAchievements(cat.id);
|
|
for k=1, numStats do
|
|
tinsert(displayStatCategories, {id = GetAchievementInfo(cat.id, k)});
|
|
totalHeight = totalHeight+statHeight;
|
|
end
|
|
end
|
|
end
|
|
|
|
-- iterate through the displayStatCategories and display them
|
|
local statCount = #displayStatCategories;
|
|
local statIndex, id, button;
|
|
local stat;
|
|
local displayedHeight = 0;
|
|
for i = 1, numButtons do
|
|
button = buttons[i];
|
|
statIndex = offset + i;
|
|
if ( statIndex <= statCount ) then
|
|
stat = displayStatCategories[statIndex];
|
|
if ( stat.header ) then
|
|
AchievementFrameComparisonStats_SetHeader(button, stat.id);
|
|
else
|
|
AchievementFrameComparisonStats_SetStat(button, stat.id, nil, statIndex);
|
|
end
|
|
button:Show();
|
|
else
|
|
button:Hide();
|
|
end
|
|
displayedHeight = displayedHeight+button:GetHeight();
|
|
end
|
|
HybridScrollFrame_Update(scrollFrame, totalHeight, displayedHeight);
|
|
end
|
|
|
|
function AchievementFrameComparisonStat_OnLoad (self)
|
|
local name = self:GetName();
|
|
self.background = _G[name.."BG"];
|
|
self.left = _G[name.."HeaderLeft"];
|
|
self.middle = _G[name.."HeaderMiddle"];
|
|
self.right = _G[name.."HeaderRight"];
|
|
self.left2 = _G[name.."HeaderLeft2"];
|
|
self.middle2 = _G[name.."HeaderMiddle2"];
|
|
self.right2 = _G[name.."HeaderRight2"];
|
|
self.text = _G[name.."Text"];
|
|
self.title = _G[name.."Title"];
|
|
self.value = _G[name.."Value"];
|
|
self.value:SetVertexColor(1, 0.97, 0.6);
|
|
self.friendValue = _G[name.."ComparisonValue"];
|
|
self.friendValue:SetVertexColor(1, 0.97, 0.6);
|
|
self.mouseover = _G[name.. "Mouseover"];
|
|
end
|
|
|
|
function AchievementFrameComparisonStats_SetStat (button, category, index, colorIndex, isSummary)
|
|
--Remove these variables when we know for sure we don't need them
|
|
local id, name, points, completed, month, day, year, description, flags, icon;
|
|
if ( not isSummary ) then
|
|
if ( not index ) then
|
|
id, name, points, completed, month, day, year, description, flags, icon = GetAchievementInfo(category);
|
|
else
|
|
id, name, points, completed, month, day, year, description, flags, icon = GetAchievementInfo(category, index);
|
|
end
|
|
|
|
else
|
|
-- This is on the summary page
|
|
id, name, points, completed, month, day, year, description, flags, icon = GetAchievementInfoFromCriteria(category);
|
|
end
|
|
|
|
button.id = id;
|
|
|
|
if ( not colorIndex ) then
|
|
if ( not index ) then
|
|
message("Error, need a color index or index");
|
|
end
|
|
colorIndex = index;
|
|
end
|
|
|
|
button.background:Show();
|
|
-- Color every other line yellow
|
|
if ( mod(colorIndex, 2) == 1 ) then
|
|
button.background:SetTexCoord(0, 1, 0.1875, 0.3671875);
|
|
button.background:SetBlendMode("BLEND");
|
|
button.background:SetAlpha(1.0);
|
|
button:SetHeight(24);
|
|
else
|
|
button.background:SetTexCoord(0, 1, 0.375, 0.5390625);
|
|
button.background:SetBlendMode("ADD");
|
|
button.background:SetAlpha(0.5);
|
|
button:SetHeight(24);
|
|
end
|
|
|
|
-- Figure out the criteria
|
|
local numCriteria = GetAchievementNumCriteria(id);
|
|
if ( numCriteria == 0 ) then
|
|
-- This is no good!
|
|
end
|
|
-- Just show the first criteria for now
|
|
local criteriaString, criteriaType, completed, quantityNumber, reqQuantity, charName, flags, assetID, quantity, friendQuantity;
|
|
if ( not isSummary ) then
|
|
friendQuantity = GetComparisonStatistic(id);
|
|
quantity = GetStatistic(id);
|
|
else
|
|
criteriaString, criteriaType, completed, quantityNumber, reqQuantity, charName, flags, assetID, quantity = GetAchievementCriteriaInfo(category);
|
|
end
|
|
if ( not quantity ) then
|
|
quantity = "--";
|
|
end
|
|
if ( not friendQuantity ) then
|
|
friendQuantity = "--";
|
|
end
|
|
|
|
button.value:SetText(quantity);
|
|
|
|
-- We're gonna use button.text here to measure string width for friendQuantity. This saves us many strings!
|
|
button.text:SetText(friendQuantity);
|
|
local width = button.text:GetStringWidth();
|
|
if ( width > button.friendValue:GetWidth() ) then
|
|
button.friendValue:SetFontObject("AchievementFont_Small");
|
|
button.mouseover:Show();
|
|
button.mouseover.tooltip = friendQuantity;
|
|
else
|
|
button.friendValue:SetFontObject("GameFontHighlightRight");
|
|
button.mouseover:Hide();
|
|
button.mouseover.tooltip = nil;
|
|
end
|
|
|
|
button.text:SetText(name);
|
|
button.friendValue:SetText(friendQuantity);
|
|
|
|
|
|
-- Hide the header images
|
|
button.title:Hide();
|
|
button.left:Hide();
|
|
button.middle:Hide();
|
|
button.right:Hide();
|
|
button.left2:Hide();
|
|
button.middle2:Hide();
|
|
button.right2:Hide();
|
|
button.isHeader = false;
|
|
end
|
|
|
|
function AchievementFrameComparisonStats_SetHeader(button, id)
|
|
-- show header
|
|
button.left:Show();
|
|
button.middle:Show();
|
|
button.right:Show();
|
|
button.left2:Show();
|
|
button.middle2:Show();
|
|
button.right2:Show();
|
|
button.title:SetText(GetCategoryInfo(id));
|
|
button.title:Show();
|
|
button.friendValue:SetText("");
|
|
button.value:SetText("");
|
|
button.text:SetText("");
|
|
button:SetHeight(24);
|
|
button.background:Hide();
|
|
button.isHeader = true;
|
|
button.id = id;
|
|
end
|
|
|
|
function AchievementComparisonPlayerButton_Saturate (self)
|
|
local name = self:GetName();
|
|
_G[name .. "TitleBackground"]:SetTexCoord(0, 0.9765625, 0, 0.3125);
|
|
_G[name .. "Background"]:SetTexture("Interface\\AchievementFrame\\UI-Achievement-Parchment-Horizontal");
|
|
_G[name .. "Glow"]:SetVertexColor(1.0, 1.0, 1.0);
|
|
self.icon:Saturate();
|
|
self.shield:Saturate();
|
|
self.shield.points:SetVertexColor(1, 1, 1);
|
|
self.label:SetVertexColor(1, 1, 1);
|
|
self.description:SetTextColor(0, 0, 0, 1);
|
|
self.description:SetShadowOffset(0, 0);
|
|
self:SetBackdropBorderColor(ACHIEVEMENTUI_REDBORDER_R, ACHIEVEMENTUI_REDBORDER_G, ACHIEVEMENTUI_REDBORDER_B, ACHIEVEMENTUI_REDBORDER_A);
|
|
end
|
|
|
|
function AchievementComparisonPlayerButton_Desaturate (self)
|
|
local name = self:GetName();
|
|
_G[name .. "TitleBackground"]:SetTexCoord(0, 0.9765625, 0.34375, 0.65625);
|
|
_G[name .. "Background"]:SetTexture("Interface\\AchievementFrame\\UI-Achievement-Parchment-Horizontal-Desaturated");
|
|
_G[name .. "Glow"]:SetVertexColor(.22, .17, .13);
|
|
self.icon:Desaturate();
|
|
self.shield:Desaturate();
|
|
self.shield.points:SetVertexColor(.65, .65, .65);
|
|
self.label:SetVertexColor(.65, .65, .65);
|
|
self.description:SetTextColor(1, 1, 1, 1);
|
|
self.description:SetShadowOffset(1, -1);
|
|
self:SetBackdropBorderColor(.5, .5, .5);
|
|
end
|
|
|
|
function AchievementComparisonPlayerButton_OnLoad (self)
|
|
local name = self:GetName();
|
|
|
|
self.label = _G[name .. "Label"];
|
|
self.description = _G[name .. "Description"];
|
|
self.icon = _G[name .. "Icon"];
|
|
self.shield = _G[name .. "Shield"];
|
|
self.dateCompleted = _G[name .. "DateCompleted"];
|
|
self.titleBar = _G[name .. "TitleBackground"];
|
|
|
|
self:SetBackdropBorderColor(ACHIEVEMENTUI_REDBORDER_R, ACHIEVEMENTUI_REDBORDER_G, ACHIEVEMENTUI_REDBORDER_B, ACHIEVEMENTUI_REDBORDER_A);
|
|
self.Saturate = AchievementComparisonPlayerButton_Saturate;
|
|
self.Desaturate = AchievementComparisonPlayerButton_Desaturate;
|
|
|
|
self:Desaturate();
|
|
|
|
-- AchievementFrameComparison.buttons = AchievementFrameComparison.buttons or {};
|
|
-- tinsert(AchievementFrameComparison.buttons, self);
|
|
end
|
|
|
|
function AchievementComparisonFriendButton_Saturate (self)
|
|
local name = self:GetName();
|
|
_G[name .. "TitleBackground"]:SetTexCoord(0.3, 0.575, 0, 0.3125);
|
|
_G[name .. "Background"]:SetTexture("Interface\\AchievementFrame\\UI-Achievement-Parchment-Horizontal");
|
|
_G[name .. "Glow"]:SetVertexColor(1.0, 1.0, 1.0);
|
|
self.icon:Saturate();
|
|
self.shield:Saturate();
|
|
self.shield.points:SetVertexColor(1, 1, 1);
|
|
self.status:SetVertexColor(1, .82, 0);
|
|
self:SetBackdropBorderColor(ACHIEVEMENTUI_REDBORDER_R, ACHIEVEMENTUI_REDBORDER_G, ACHIEVEMENTUI_REDBORDER_B, ACHIEVEMENTUI_REDBORDER_A);
|
|
end
|
|
|
|
function AchievementComparisonFriendButton_Desaturate (self)
|
|
local name = self:GetName();
|
|
_G[name .. "TitleBackground"]:SetTexCoord(0.3, 0.575, 0.34375, 0.65625);
|
|
_G[name .. "Background"]:SetTexture("Interface\\AchievementFrame\\UI-Achievement-Parchment-Horizontal-Desaturated");
|
|
_G[name .. "Glow"]:SetVertexColor(.22, .17, .13);
|
|
self.icon:Desaturate();
|
|
self.shield:Desaturate();
|
|
self.shield.points:SetVertexColor(.65, .65, .65);
|
|
self.status:SetVertexColor(.65, .65, .65);
|
|
self:SetBackdropBorderColor(.5, .5, .5);
|
|
end
|
|
|
|
function AchievementComparisonFriendButton_OnLoad (self)
|
|
local name = self:GetName();
|
|
|
|
self.status = _G[name .. "Status"];
|
|
self.icon = _G[name .. "Icon"];
|
|
self.shield = _G[name .. "Shield"];
|
|
|
|
self:SetBackdropBorderColor(ACHIEVEMENTUI_REDBORDER_R, ACHIEVEMENTUI_REDBORDER_G, ACHIEVEMENTUI_REDBORDER_B, ACHIEVEMENTUI_REDBORDER_A);
|
|
self.Saturate = AchievementComparisonFriendButton_Saturate;
|
|
self.Desaturate = AchievementComparisonFriendButton_Desaturate;
|
|
|
|
self:Desaturate();
|
|
end
|
|
|
|
function AchievementFrame_IsComparison()
|
|
return AchievementFrame.isComparison;
|
|
end
|
|
|
|
function AchievementFrame_IsFeatOfStrength()
|
|
if ( AchievementFrame.selectedTab == 1 and achievementFunctions.selectedCategory == displayCategories[#displayCategories].id ) then
|
|
return true;
|
|
end
|
|
return false;
|
|
end
|
|
|
|
ACHIEVEMENT_FUNCTIONS = {
|
|
categoryAccessor = GetCategoryList,
|
|
clearFunc = AchievementFrameAchievements_ClearSelection,
|
|
updateFunc = AchievementFrameAchievements_Update,
|
|
selectedCategory = "summary";
|
|
}
|
|
|
|
STAT_FUNCTIONS = {
|
|
categoryAccessor = GetStatisticsCategoryList,
|
|
clearFunc = nil,
|
|
updateFunc = AchievementFrameStats_Update,
|
|
selectedCategory = "summary";
|
|
}
|
|
|
|
COMPARISON_ACHIEVEMENT_FUNCTIONS = {
|
|
categoryAccessor = GetCategoryList,
|
|
clearFunc = AchievementFrameComparison_ClearSelection,
|
|
updateFunc = AchievementFrameComparison_Update,
|
|
selectedCategory = -1,
|
|
}
|
|
|
|
COMPARISON_STAT_FUNCTIONS = {
|
|
categoryAccessor = GetStatisticsCategoryList,
|
|
clearFunc = AchievementFrameComparison_ClearSelection,
|
|
updateFunc = AchievementFrameComparison_UpdateStats,
|
|
selectedCategory = -2,
|
|
}
|
|
|
|
achievementFunctions = ACHIEVEMENT_FUNCTIONS;
|
|
|
|
|
|
ACHIEVEMENT_TEXTURES_TO_LOAD = {
|
|
{
|
|
name="AchievementFrameAchievementsBackground",
|
|
file="Interface\\AchievementFrame\\UI-Achievement-AchievementBackground",
|
|
},
|
|
{
|
|
name="AchievementFrameSummaryBackground",
|
|
file="Interface\\AchievementFrame\\UI-Achievement-AchievementBackground",
|
|
},
|
|
{
|
|
name="AchievementFrameComparisonBackground",
|
|
file="Interface\\AchievementFrame\\UI-Achievement-AchievementBackground",
|
|
},
|
|
{
|
|
name="AchievementFrameCategoriesBG",
|
|
file="Interface\\AchievementFrame\\UI-Achievement-AchievementBackground",
|
|
},
|
|
{
|
|
name="AchievementFrameWaterMark",
|
|
},
|
|
{
|
|
name="AchievementFrameHeaderLeft",
|
|
file="Interface\\AchievementFrame\\UI-Achievement-Header",
|
|
},
|
|
{
|
|
name="AchievementFrameHeaderRight",
|
|
file="Interface\\AchievementFrame\\UI-Achievement-Header",
|
|
},
|
|
{
|
|
name="AchievementFrameHeaderPointBorder",
|
|
file="Interface\\AchievementFrame\\UI-Achievement-Header",
|
|
},
|
|
{
|
|
name="AchievementFrameComparisonWatermark",
|
|
file="Interface\\AchievementFrame\\UI-Achievement-StatsComparisonBackground",
|
|
},
|
|
}
|
|
|
|
function AchievementFrame_ClearTextures()
|
|
for k, v in pairs(ACHIEVEMENT_TEXTURES_TO_LOAD) do
|
|
_G[v.name]:SetTexture(nil);
|
|
end
|
|
end
|
|
|
|
function AchievementFrame_LoadTextures()
|
|
for k, v in pairs(ACHIEVEMENT_TEXTURES_TO_LOAD) do
|
|
if ( v.file ) then
|
|
_G[v.name]:SetTexture(v.file);
|
|
end
|
|
end
|
|
end |