From f338e6a0b1ff3fdc22747cec7a837e7823e9ef18 Mon Sep 17 00:00:00 2001 From: "James D. Callahan III" Date: Thu, 15 Jul 2010 02:19:26 -0400 Subject: [PATCH] Frame.lua is now Interface\Panel.lua --- AckisRecipeList.toc | 1 - Frame.lua | 1091 --------------------------------------------------- Interface/Panel.lua | 1091 +++++++++++++++++++++++++++++++++++++++++++++++++++ interface.xml | 1 + 4 files changed, 1092 insertions(+), 1092 deletions(-) delete mode 100644 Frame.lua create mode 100644 Interface/Panel.lua diff --git a/AckisRecipeList.toc b/AckisRecipeList.toc index db26e86..8be12bc 100644 --- a/AckisRecipeList.toc +++ b/AckisRecipeList.toc @@ -73,7 +73,6 @@ Player.lua # User Interface files interface.xml -Frame.lua # Database files database.xml diff --git a/Frame.lua b/Frame.lua deleted file mode 100644 index ebb7673..0000000 --- a/Frame.lua +++ /dev/null @@ -1,1091 +0,0 @@ ---[[ -************************************************************************ -Frame.lua -************************************************************************ -File date: @file-date-iso@ -File hash: @file-abbreviated-hash@ -Project hash: @project-abbreviated-hash@ -Project version: @project-version@ -************************************************************************ -Please see http://www.wowace.com/addons/arl/ for more information. -************************************************************************ -This source code is released under All Rights Reserved. -************************************************************************ -@class file -@name Frame.lua -************************************************************************ -]]-- - -------------------------------------------------------------------------------- --- Localized Lua globals. -------------------------------------------------------------------------------- -local _G = getfenv(0) - -local string = _G.string -local sformat = string.format -local strlower = string.lower -local smatch = string.match - -local select = _G.select - -local table = _G.table - -local ipairs, pairs = _G.ipairs, _G.pairs - -local tonumber = _G.tonumber -local tostring = _G.tostring - -------------------------------------------------------------------------------- --- Localized Blizzard API. -------------------------------------------------------------------------------- -local GetItemQualityColor = _G.GetItemQualityColor - --- GLOBALS: CreateFrame, GameTooltip, UIParent - -------------------------------------------------------------------------------- --- AddOn namespace. -------------------------------------------------------------------------------- -local LibStub = LibStub - -local MODNAME = "Ackis Recipe List" -local addon = LibStub("AceAddon-3.0"):GetAddon(MODNAME) - -local BFAC = LibStub("LibBabble-Faction-3.0"):GetLookupTable() -local L = LibStub("AceLocale-3.0"):GetLocale(MODNAME) - --- Set up the private intra-file namespace. -local private = select(2, ...) - -local Player = private.Player - -------------------------------------------------------------------------------- --- Upvalues -------------------------------------------------------------------------------- -local AcquireTable = private.AcquireTable -local ReleaseTable = private.ReleaseTable -local SetTextColor = private.SetTextColor -local GenericCreateButton = private.GenericCreateButton -local SetTooltipScripts = private.SetTooltipScripts - -local A = private.acquire_types - -------------------------------------------------------------------------------- --- Constants -------------------------------------------------------------------------------- -local ORDERED_PROFESSIONS = private.ordered_professions - -local FACTION_HORDE = BFAC["Horde"] -local FACTION_ALLIANCE = BFAC["Alliance"] -local FACTION_NEUTRAL = BFAC["Neutral"] - -function private.InitializeFrame() - ------------------------------------------------------------------------------- - -- Create the MainPanel and set its values - ------------------------------------------------------------------------------- - local MainPanel = CreateFrame("Frame", "ARL_MainPanel", UIParent) - - -- The panel width changes when contracting and expanding - store it for later use. - MainPanel.normal_width = 384 - MainPanel.expanded_width = 768 - - MainPanel:SetWidth(MainPanel.normal_width) - MainPanel:SetHeight(512) - MainPanel:SetFrameStrata("MEDIUM") - MainPanel:SetToplevel(true) - MainPanel:SetClampedToScreen(true) - MainPanel:SetClampRectInsets(0, -35, 0, 53) - - MainPanel:SetHitRectInsets(0, 35, 0, 53) - MainPanel:EnableMouse(true) - MainPanel:EnableKeyboard(true) - MainPanel:SetMovable(true) - - MainPanel.is_expanded = false - - -- Let the user banish the MainPanel with the ESC key. - table.insert(UISpecialFrames, "ARL_MainPanel") - addon.Frame = MainPanel - - do - local top_left = MainPanel:CreateTexture(nil, "ARTWORK") - top_left:SetTexture("Interface\\QuestFrame\\UI-QuestLog-TopLeft") - top_left:SetPoint("TOPLEFT", MainPanel, "TOPLEFT", 0, 0) - MainPanel.top_left = top_left - - local top_right = MainPanel:CreateTexture(nil, "ARTWORK") - top_right:SetTexture("Interface\\QuestFrame\\UI-QuestLog-TopRight") - top_right:SetPoint("TOPRIGHT", MainPanel, "TOPRIGHT", 0, 0) - MainPanel.top_right = top_right - - local bottom_left = MainPanel:CreateTexture(nil, "ARTWORK") - bottom_left:SetTexture("Interface\\QuestFrame\\UI-QuestLog-BotLeft") - bottom_left:SetPoint("BOTTOMLEFT", MainPanel, "BOTTOMLEFT", 0, 0) - MainPanel.bottom_left = bottom_left - - local bottom_right = MainPanel:CreateTexture(nil, "ARTWORK") - bottom_right:SetTexture("Interface\\QuestFrame\\UI-QuestLog-BotRight") - bottom_right:SetPoint("BOTTOMRIGHT", MainPanel, "BOTTOMRIGHT", 0, 0) - MainPanel.bottom_right = bottom_right - - local title_bar = MainPanel:CreateFontString(nil, "ARTWORK") - title_bar:SetFontObject("GameFontHighlightSmall") - title_bar:SetPoint("TOPLEFT", MainPanel, "TOPLEFT", 20, -20) - title_bar:SetPoint("TOPRIGHT", MainPanel, "TOPRIGHT", -40, -20) - title_bar:SetJustifyH("CENTER") - MainPanel.title_bar = title_bar - - MainPanel:Hide() - end -- do block - - ------------------------------------------------------------------------------- - -- MainPanel scripts/functions. - ------------------------------------------------------------------------------- - MainPanel:SetScript("OnHide", - function(self) - for spell_id, recipe in pairs(private.recipe_list) do - recipe:RemoveState("RELEVANT") - recipe:RemoveState("VISIBLE") - end - addon:ClosePopups() - end) - - MainPanel:SetScript("OnMouseDown", MainPanel.StartMoving) - - MainPanel:SetScript("OnMouseUp", - function(self, button) - self:StopMovingOrSizing() - - local opts = addon.db.profile.frameopts - local from, _, to, x, y = self:GetPoint() - - opts.anchorFrom = from - opts.anchorTo = to - - if self.is_expanded then - if opts.anchorFrom == "TOPLEFT" or opts.anchorFrom == "LEFT" or opts.anchorFrom == "BOTTOMLEFT" then - opts.offsetx = x - elseif opts.anchorFrom == "TOP" or opts.anchorFrom == "CENTER" or opts.anchorFrom == "BOTTOM" then - opts.offsetx = x - 151/2 - elseif opts.anchorFrom == "TOPRIGHT" or opts.anchorFrom == "RIGHT" or opts.anchorFrom == "BOTTOMRIGHT" then - opts.offsetx = x - 151 - end - else - opts.offsetx = x - end - opts.offsety = y - end) - - ------------------------------------------------------------------------------- - -- Displays the main GUI frame. - ------------------------------------------------------------------------------- - function MainPanel:Display(profession, is_linked) - self.is_linked = is_linked - - ------------------------------------------------------------------------------- - -- Set the profession. - ------------------------------------------------------------------------------- - local prev_profession = self.profession - - if profession == private.mining_name then - self.profession = 11 -- Smelting - self.prof_name = profession - else - for index, name in ipairs(ORDERED_PROFESSIONS) do - if name == profession then - self.profession = index - break - end - end - self.prof_name = nil - end - - if self.profession ~= prev_profession then - self.prev_profession = self.profession - end - self.prof_button:ChangeTexture(private.profession_textures[self.profession]) - - local editbox = self.search_editbox - - if self.profession ~= self.prev_profession then - editbox.prev_search = nil - end - editbox:SetText(editbox.prev_search or _G.SEARCH) - - -- If there is no current tab, this is the first time the panel has been - -- shown so things must be initialized. In this case, MainPanel.list_frame:Update() - -- will be called by the tab's OnClick handler. - if not self.current_tab then - local current_tab = self.tabs[addon.db.profile.current_tab] - local on_click = current_tab:GetScript("OnClick") - - on_click(current_tab) - - self.current_tab = addon.db.profile.current_tab - else - MainPanel.list_frame:Update(nil, false) - end - self.sort_button:SetTextures() - self.filter_toggle:SetTextures() - - self:UpdateTitle() - self:Show() - end - - do - ------------------------------------------------------------------------------- - -- Restore the panel's position on the screen. - ------------------------------------------------------------------------------- - local function Reset_Position(self) - local opts = addon.db.profile.frameopts - local FixedOffsetX = opts.offsetx - - self:ClearAllPoints() - - if opts.anchorTo == "" then -- no values yet, clamp to whatever frame is appropriate - if _G.ATSWFrame then - self:SetPoint("CENTER", _G.ATSWFrame, "CENTER", 490, 0) - elseif _G.CauldronFrame then - self:SetPoint("CENTER", _G.CauldronFrame, "CENTER", 490, 0) - elseif _G.Skillet then - self:SetPoint("CENTER", _G.SkilletFrame, "CENTER", 468, 0) - else - self:SetPoint("TOPLEFT", _G.TradeSkillFrame, "TOPRIGHT", 10, 0) - end - else - if self.is_expanded then - if opts.anchorFrom == "TOPLEFT" or opts.anchorFrom == "LEFT" or opts.anchorFrom == "BOTTOMLEFT" then - FixedOffsetX = opts.offsetx - elseif opts.anchorFrom == "TOP" or opts.anchorFrom == "CENTER" or opts.anchorFrom == "BOTTOM" then - FixedOffsetX = opts.offsetx + 151/2 - elseif opts.anchorFrom == "TOPRIGHT" or opts.anchorFrom == "RIGHT" or opts.anchorFrom == "BOTTOMRIGHT" then - FixedOffsetX = opts.offsetx + 151 - end - end - self:SetPoint(opts.anchorFrom, UIParent, opts.anchorTo, FixedOffsetX, opts.offsety) - end - self:SetScale(addon.db.profile.frameopts.uiscale) - end - - MainPanel:SetScript("OnShow", Reset_Position) - end -- do-block - - do - local VALID_CATEGORY = { - ["general"] = true, - ["obtain"] = true, - ["binding"] = true, - ["item"] = true, - ["quality"] = true, - ["player"] = true, - ["rep"] = true, - ["misc"] = true, - } - - function MainPanel:ToggleState() - local x, y = self:GetLeft(), self:GetBottom() - - if self.is_expanded then - -- Hide the category buttons - for category in pairs(self.filter_menu) do - if VALID_CATEGORY[category] then - self["menu_toggle_" .. category]:Hide() - end - end - self.filter_reset:Hide() - self.filter_menu:Hide() - - PlaySound("igCharacterInfoClose") - - self:SetWidth(self.normal_width) - self:SetHitRectInsets(0, 35, 0, 53) - self:SetClampRectInsets(0, -35, 0, 53) - - self.top_left:SetTexture("Interface\\QuestFrame\\UI-QuestLog-TopLeft") - self.top_right:SetTexture("Interface\\QuestFrame\\UI-QuestLog-TopRight") - self.bottom_left:Show() - self.bottom_right:Show() - - self.xclose_button:ClearAllPoints() - self.xclose_button:SetPoint("TOPRIGHT", self, "TOPRIGHT", -30, -8) - else - local found_active = false - - -- Show the category buttons. If one has been selected, show its information in the panel. - for category in pairs(MainPanel.filter_menu) do - local toggle = "menu_toggle_" .. category - - if VALID_CATEGORY[category] then - MainPanel[toggle]:Show() - - if MainPanel[toggle]:GetChecked() then - found_active = true - MainPanel.filter_menu[category]:Show() - MainPanel.filter_menu:Show() - end - end - end - - -- If nothing was checked, default to the general filters. - if not found_active then - MainPanel.menu_toggle_general:SetChecked(true) - MainPanel.filter_menu.general:Show() - MainPanel.filter_menu:Show() - end - MainPanel.filter_reset:Show() - - PlaySound("igCharacterInfoOpen") - - self:SetWidth(self.expanded_width) - self:SetHitRectInsets(0, 90, 0, 53) - self:SetClampRectInsets(0, -90, 0, 53) - - self.top_left:SetTexture("Interface\\QuestFrame\\UI-QuestLogDualPane-Left") - self.top_right:SetTexture("Interface\\QuestFrame\\UI-QuestLogDualPane-Right") - self.bottom_left:Hide() - self.bottom_right:Hide() - - self.xclose_button:ClearAllPoints() - self.xclose_button:SetPoint("TOPRIGHT", self, "TOPRIGHT", -84, -8) - end - self.is_expanded = not self.is_expanded - - self:ClearAllPoints() - self:SetPoint("BOTTOMLEFT", UIParent, "BOTTOMLEFT", x, y) - self:UpdateTitle() - end - end -- do-block - - function MainPanel:UpdateTitle() - local current_prof = ORDERED_PROFESSIONS[self.profession] - - if not self.is_expanded then - self.title_bar:SetFormattedText(SetTextColor(private.basic_colors["normal"], "ARL (%s) - %s"), addon.version, current_prof) - return - end - local total, active = 0, 0 - - for filter, info in pairs(self.filter_menu.value_map) do - if info.svroot then - if info.svroot[filter] == true then - active = active + 1 - end - total = total + 1 - end - end - self.title_bar:SetFormattedText(SetTextColor(private.basic_colors["normal"], "ARL (%s) - %s (%d/%d %s)"), addon.version, current_prof, active, total, _G.FILTERS) - end - - ------------------------------------------------------------------------------- - -- Create the profession-cycling button and assign its values. - ------------------------------------------------------------------------------- - local ProfCycle = CreateFrame("Button", nil, MainPanel, "UIPanelButtonTemplate") - ProfCycle:SetWidth(64) - ProfCycle:SetHeight(64) - ProfCycle:SetPoint("TOPLEFT", MainPanel, "TOPLEFT", 5, -4) - ProfCycle:RegisterForClicks("LeftButtonUp", "RightButtonUp") - - ProfCycle._normal = ProfCycle:CreateTexture(nil, "BACKGROUND") - ProfCycle._pushed = ProfCycle:CreateTexture(nil, "BACKGROUND") - ProfCycle._disabled = ProfCycle:CreateTexture(nil, "BACKGROUND") - - MainPanel.prof_button = ProfCycle - - ------------------------------------------------------------------------------- - -- ProfCycle scripts/functions. - ------------------------------------------------------------------------------- - ProfCycle:SetScript("OnClick", - function(self, button, down) - -- Known professions should be in Player.professions - - -- This loop is gonna be weird. The reason is because we need to - -- ensure that we cycle through all the known professions, but also - -- that we do so in order. That means that if the currently displayed - -- profession is the last one in the list, we're actually going to - -- iterate completely once to get to the currently displayed profession - -- and then iterate again to make sure we display the next one in line. - -- Further, there is the nuance that the person may not know any - -- professions yet at all. Users are so annoying. - local startLoop = 0 - local endLoop = 0 - local displayProf = 0 - - local NUM_PROFESSIONS = 12 - - -- ok, so first off, if we've never done this before, there is no "current" - -- and a single iteration will do nicely, thank you - if button == "LeftButton" then - -- normal profession switch - if MainPanel.profession == 0 then - startLoop = 1 - endLoop = NUM_PROFESSIONS + 1 - else - startLoop = MainPanel.profession + 1 - endLoop = MainPanel.profession - end - local index = startLoop - - while index ~= endLoop do - if index > NUM_PROFESSIONS then - index = 1 - elseif Player.professions[ORDERED_PROFESSIONS[index]] then - displayProf = index - MainPanel.profession = index - break - else - index = index + 1 - end - end - elseif button == "RightButton" then - -- reverse profession switch - if MainPanel.profession == 0 then - startLoop = NUM_PROFESSIONS + 1 - endLoop = 0 - else - startLoop = MainPanel.profession - 1 - endLoop = MainPanel.profession - end - local index = startLoop - - while index ~= endLoop do - if index < 1 then - index = NUM_PROFESSIONS - elseif Player.professions[ORDERED_PROFESSIONS[index]] then - displayProf = index - MainPanel.profession = index - break - else - index = index - 1 - end - end - end - local trade_frame = _G.GnomeWorksFrame or _G.Skillet or _G.MRTSkillFrame or _G.ATSWFrame or _G.CauldronFrame or _G.TradeSkillFrame - local is_shown = trade_frame:IsVisible() - local sfx - - PlaySound("igCharacterNPCSelect") - - -- If not shown, save the current sound effects setting then set it to 0. - if not is_shown then - sfx = tonumber(GetCVar("Sound_EnableSFX")) - SetCVar("Sound_EnableSFX", 0) - end - CastSpellByName(ORDERED_PROFESSIONS[MainPanel.profession]) - addon:Scan() - - if not is_shown then - CloseTradeSkill() - SetCVar("Sound_EnableSFX", sfx) - end - end) - - function ProfCycle:ChangeTexture(texture) - local normal, pushed, disabled = self._normal, self._pushed, self._disabled - - normal:SetTexture([[Interface\Addons\AckisRecipeList\img\]] .. texture .. [[_up]]) - normal:SetTexCoord(0, 1, 0, 1) - normal:SetAllPoints(self) - self:SetNormalTexture(normal) - - pushed:SetTexture([[Interface\Addons\AckisRecipeList\img\]] .. texture .. [[_down]]) - pushed:SetTexCoord(0, 1, 0, 1) - pushed:SetAllPoints(self) - self:SetPushedTexture(pushed) - - disabled:SetTexture([[Interface\Addons\AckisRecipeList\img\]] .. texture .. [[_up]]) - disabled:SetTexCoord(0, 1, 0, 1) - disabled:SetAllPoints(self) - self:SetDisabledTexture(disabled) - end - - ------------------------------------------------------------------------------- - -- The search entry box and associated methods. - ------------------------------------------------------------------------------- - local SearchRecipes - do - local acquire_names = private.acquire_names - local location_list = private.location_list - - local search_params = { - "name", - "skill_level", - --@debug@ - -- "item_id", - --@end-debug@ - "specialty", - } - -- Scans through the recipe database and toggles the flag on if the item is in the search criteria - function SearchRecipes(pattern) - if not pattern then - return - end - local current_prof = ORDERED_PROFESSIONS[MainPanel.profession] - - pattern = pattern:lower() - - for index, entry in pairs(private.recipe_list) do - entry:RemoveState("RELEVANT") - - if entry.profession == current_prof then - local found = false - - for index, field in ipairs(search_params) do - local str = entry[field] and tostring(entry[field]):lower() or nil - - if str and str:find(pattern) then - entry:AddState("RELEVANT") - found = true - break - end - end - - if not found then - for acquire_type in pairs(acquire_names) do - local str = acquire_names[acquire_type]:lower() - - if str and str:find(pattern) and entry.acquire_data[acquire_type] then - entry:AddState("RELEVANT") - found = true - break - end - end - end - - if not found then - for location_name in pairs(location_list) do - local breakout = false - - for spell_id in pairs(location_list[location_name].recipes) do - if spell_id == entry.spell_id then - local str = location_name:lower() - - if str and str:find(pattern) then - entry:AddState("RELEVANT") - breakout = true - break - end - end - end - - if breakout then - break - end - end - end - end - end -- if entry.profession - end -- for - end -- do - - ------------------------------------------------------------------------------- - -- Search EditBox - ------------------------------------------------------------------------------- - local SearchBox = CreateFrame("EditBox", nil, MainPanel, "InputBoxTemplate") - - SearchBox:EnableMouse(true) - SearchBox:SetAutoFocus(false) - SearchBox:SetFontObject(ChatFontSmall) - SearchBox:SetWidth(130) - SearchBox:SetHeight(12) - SearchBox:SetPoint("TOPLEFT", MainPanel, "TOPLEFT", 75, -39) - SearchBox:Show() - - MainPanel.search_editbox = SearchBox - - SearchBox:SetText(_G.SEARCH) - SearchBox:SetHistoryLines(10) - - -- Allow removal of focus from the SearchBox by clicking on the WorldFrame. - do - local old_x, old_y, click_time - - WorldFrame:HookScript("OnMouseDown", - function(frame, ...) - if not SearchBox:HasFocus() then - return - end - old_x, old_y = GetCursorPosition() - click_time = GetTime() - end) - - WorldFrame:HookScript("OnMouseUp", - function(frame, ...) - if not SearchBox:HasFocus() then - return - end - local x, y = GetCursorPosition() - - if not old_x or not old_y or not x or not y or not click_time then - SearchBox:ClearFocus() - return - end - - if (_G.math.abs(x - old_x) + _G.math.abs(y - old_y)) <= 5 and GetTime() - click_time < .5 then - SearchBox:ClearFocus() - end - end) - end - - -- Resets the SearchBox text and the state of all MainPanel.list_frame and recipe_list entries. - function SearchBox:Reset() - for index, recipe in pairs(private.recipe_list) do - recipe:RemoveState("RELEVANT") - end - self.prev_search = nil - - self:SetText(_G.SEARCH) - - if self:HasFocus() then - self:HighlightText() - end - MainPanel.list_frame:Update(nil, false) - end - - -- If there is text in the search box, return the recipe's RELEVANT state. - function SearchBox:MatchesRecipe(recipe) - local editbox_text = self:GetText() - - if editbox_text ~= "" and editbox_text ~= _G.SEARCH then - return recipe:HasState("RELEVANT") - end - return true - end - - SearchBox:SetScript("OnEnterPressed", - function(self) - local searchtext = self:GetText() - searchtext = searchtext:trim() - - if not searchtext or searchtext == "" then - self:Reset() - return - end - self:HighlightText() - - if searchtext == _G.SEARCH then - return - end - self.prev_search = searchtext - - self:AddHistoryLine(searchtext) - SearchRecipes(searchtext) - MainPanel.list_frame:Update(nil, false) - end) - - SearchBox:SetScript("OnEditFocusGained", SearchBox.HighlightText) - - SearchBox:SetScript("OnEditFocusLost", - function(self) - local text = self:GetText() - - if text == "" or text == _G.SEARCH then - self:Reset() - return - end - - -- Ensure that the highlight is cleared. - self:SetText(text) - - self:AddHistoryLine(text) - end) - - - SearchBox:SetScript("OnTextSet", - function(self) - local text = self:GetText() - - if text ~= "" and text ~= _G.SEARCH and text ~= self.prev_search then - self:HighlightText() - else - self:Reset() - end - end) - - do - local last_update = 0 - local updater = CreateFrame("Frame", nil, UIParent) - - updater:Hide() - updater:SetScript("OnUpdate", - function(self, elapsed) - last_update = last_update + elapsed - - if last_update >= 0.5 then - last_update = 0 - - SearchRecipes(SearchBox:GetText()) - MainPanel.list_frame:Update(nil, false) - self:Hide() - end - end) - - SearchBox:SetScript("OnTextChanged", - function(self, is_typed) - if not is_typed then - return - end - local text = self:GetText() - - if text ~= "" and text ~= _G.SEARCH and text ~= self.prev_search then - updater:Show() - else - self:Reset() - end - end) - end -- do - - ------------------------------------------------------------------------------- - -- Create the expand button and set its scripts. - ------------------------------------------------------------------------------- - local ExpandButtonFrame = CreateFrame("Frame", nil, MainPanel) - - ExpandButtonFrame:SetHeight(20) - ExpandButtonFrame:SetPoint("TOPLEFT", SearchBox, "BOTTOMLEFT", -12, -5) - - ExpandButtonFrame.left = ExpandButtonFrame:CreateTexture(nil, "BACKGROUND") - ExpandButtonFrame.left:SetWidth(8) - ExpandButtonFrame.left:SetHeight(22) - ExpandButtonFrame.left:SetPoint("TOPLEFT", ExpandButtonFrame, 0, 4) - ExpandButtonFrame.left:SetTexture("Interface\\QuestFrame\\UI-QuestLogSortTab-Left") - - ExpandButtonFrame.right = ExpandButtonFrame:CreateTexture(nil, "BACKGROUND") - ExpandButtonFrame.right:SetWidth(8) - ExpandButtonFrame.right:SetHeight(22) - ExpandButtonFrame.right:SetPoint("TOPRIGHT", ExpandButtonFrame, 0, 4) - ExpandButtonFrame.right:SetTexture("Interface\\QuestFrame\\UI-QuestLogSortTab-Right") - - ExpandButtonFrame.middle = ExpandButtonFrame:CreateTexture(nil, "BACKGROUND") - ExpandButtonFrame.middle:SetHeight(22) - ExpandButtonFrame.middle:SetPoint("LEFT", ExpandButtonFrame.left, "RIGHT") - ExpandButtonFrame.middle:SetPoint("RIGHT", ExpandButtonFrame.right, "LEFT") - ExpandButtonFrame.middle:SetTexture("Interface\\QuestFrame\\UI-QuestLogSortTab-Middle") - - local ExpandButton = GenericCreateButton(nil, MainPanel, 16, 16, "GameFontNormalSmall", _G.ALL, "LEFT", L["EXPANDALL_DESC"], 2) - - -- Make sure the button frame is large enough to hold the localized word for "All" - ExpandButtonFrame:SetWidth(27 + ExpandButton:GetFontString():GetStringWidth()) - - MainPanel.expand_button = ExpandButton - - ExpandButton:SetPoint("LEFT", ExpandButtonFrame.left, "RIGHT", -3, -3) - - ExpandButton.text:ClearAllPoints() - ExpandButton.text:SetPoint("LEFT", ExpandButton, "Right", 0, 0) - - ExpandButton:SetScript("OnClick", - function(self, mouse_button, down) - local current_tab = MainPanel.tabs[MainPanel.current_tab] - local expanded = current_tab["expand_button_"..MainPanel.profession] - local expand_mode - - if not expanded then - if _G.IsShiftKeyDown() then - expand_mode = "deep" - else - expand_mode = "normal" - end - else - local prof_name = ORDERED_PROFESSIONS[MainPanel.profession] - - table.wipe(current_tab[prof_name.." expanded"]) - end - -- MainPanel.list_frame:Update() must be called before the button can be expanded or contracted, since - -- the button is contracted from there. - -- If expand_mode is nil, that means expand nothing. - MainPanel.list_frame:Update(expand_mode, false) - - if expanded then - self:Contract(current_tab) - else - self:Expand(current_tab) - end - end) - - function ExpandButton:Expand(current_tab) - current_tab["expand_button_"..MainPanel.profession] = true - - self:SetNormalTexture("Interface\\BUTTONS\\UI-MinusButton-Up") - self:SetPushedTexture("Interface\\BUTTONS\\UI-MinusButton-Down") - self:SetHighlightTexture("Interface\\BUTTONS\\UI-PlusButton-Hilight") - self:SetDisabledTexture("Interface\\BUTTONS\\UI-MinusButton-Disabled") - - SetTooltipScripts(self, L["CONTRACTALL_DESC"]) - end - - function ExpandButton:Contract(current_tab) - current_tab["expand_button_"..MainPanel.profession] = nil - - self:SetNormalTexture("Interface\\Buttons\\UI-PlusButton-Up") - self:SetPushedTexture("Interface\\Buttons\\UI-PlusButton-Down") - self:SetHighlightTexture("Interface\\Buttons\\UI-PlusButton-Hilight") - self:SetDisabledTexture("Interface\\Buttons\\UI-PlusButton-Disabled") - - SetTooltipScripts(self, L["EXPANDALL_DESC"]) - end - - ------------------------------------------------------------------------------- - -- "Skill Level" checkbox. - ------------------------------------------------------------------------------- - local SkillToggle = CreateFrame("CheckButton", nil, MainPanel, "UICheckButtonTemplate") - SkillToggle:SetPoint("TOPLEFT", SearchBox, "TOPRIGHT", 0, 0) - SkillToggle:SetHeight(16) - SkillToggle:SetWidth(16) - - SkillToggle.text = SkillToggle:CreateFontString(nil, "ARTWORK", "GameFontNormalSmall") - SkillToggle.text:SetPoint("LEFT", SkillToggle, "RIGHT", 0, 0) - - SkillToggle:SetScript("OnClick", - function(self, button, down) - addon.db.profile.skill_view = not addon.db.profile.skill_view - MainPanel.list_frame:Update(nil, false) - end) - - SkillToggle:SetScript("OnShow", - function(self) - self:SetChecked(addon.db.profile.skill_view) - end) - - SkillToggle:SetNormalTexture("Interface\\Buttons\\UI-CheckBox-Up") - SkillToggle:SetPushedTexture("Interface\\Buttons\\UI-CheckBox-Down") - SkillToggle:SetHighlightTexture("Interface\\Buttons\\UI-CheckBox-Highlight") - SkillToggle:SetDisabledCheckedTexture("Interface\\Buttons\\UI-CheckBox-Check-Disabled") - SkillToggle:SetCheckedTexture("Interface\\Buttons\\UI-CheckBox-Check") - - SkillToggle.text:SetText(_G.SKILL) - SetTooltipScripts(SkillToggle, L["SKILL_TOGGLE_DESC"], 1) - - ------------------------------------------------------------------------------- - -- "Display Exclusions" checkbox. - ------------------------------------------------------------------------------- - local ExcludeToggle = CreateFrame("CheckButton", nil, MainPanel, "UICheckButtonTemplate") - ExcludeToggle:SetPoint("TOP", SkillToggle, "BOTTOM", 0, 1) - ExcludeToggle:SetHeight(16) - ExcludeToggle:SetWidth(16) - - ExcludeToggle.text = ExcludeToggle:CreateFontString(nil, "ARTWORK", "GameFontNormalSmall") - ExcludeToggle.text:SetPoint("LEFT", ExcludeToggle, "RIGHT", 0, 0) - - ExcludeToggle:SetScript("OnClick", - function(self, button, down) - addon.db.profile.ignoreexclusionlist = not addon.db.profile.ignoreexclusionlist - MainPanel.list_frame:Update(nil, false) - end) - - ExcludeToggle:SetScript("OnShow", - function(self) - self:SetChecked(addon.db.profile.ignoreexclusionlist) - end) - - ExcludeToggle:SetNormalTexture("Interface\\Buttons\\UI-CheckBox-Up") - ExcludeToggle:SetPushedTexture("Interface\\Buttons\\UI-CheckBox-Down") - ExcludeToggle:SetHighlightTexture("Interface\\Buttons\\UI-CheckBox-Highlight") - ExcludeToggle:SetDisabledCheckedTexture("Interface\\Buttons\\UI-CheckBox-Check-Disabled") - ExcludeToggle:SetCheckedTexture("Interface\\Buttons\\UI-CheckBox-Check") - - ExcludeToggle.text:SetText(L["Display Exclusions"]) - SetTooltipScripts(ExcludeToggle, L["DISPLAY_EXCLUSION_DESC"], 1) - - ------------------------------------------------------------------------------- - -- Create the X-close button, and set its scripts. - ------------------------------------------------------------------------------- - MainPanel.xclose_button = CreateFrame("Button", nil, MainPanel, "UIPanelCloseButton") - MainPanel.xclose_button:SetPoint("TOPRIGHT", MainPanel, "TOPRIGHT", -30, -8) - - MainPanel.xclose_button:SetScript("OnClick", - function(self, button, down) - MainPanel:Hide() - end) - - ------------------------------------------------------------------------------- - -- Create MainPanel.filter_toggle, and set its scripts. - ------------------------------------------------------------------------------- - do - local function Toggle_OnClick(self, button, down) - -- The first time this button is clicked, everything in the expanded section of the MainPanel must be created. - if private.InitializeFilterPanel then - private.InitializeFilterPanel() - end - SetTooltipScripts(self, MainPanel.is_expanded and L["FILTER_OPEN_DESC"] or L["FILTER_CLOSE_DESC"]) - - MainPanel:ToggleState() - self:SetTextures() - end - - local filter_toggle = GenericCreateButton(nil, MainPanel, 24, 24, nil, nil, nil, L["FILTER_OPEN_DESC"], 2) - filter_toggle:SetPoint("TOPLEFT", MainPanel, "TOPLEFT", 323, -41) - - filter_toggle:SetScript("OnClick", Toggle_OnClick) - - filter_toggle:SetHighlightTexture([[Interface\CHATFRAME\UI-ChatIcon-BlinkHilight]]) - - function filter_toggle:SetTextures() - if MainPanel.is_expanded then - self:SetNormalTexture([[Interface\BUTTONS\UI-SpellbookIcon-PrevPage-Up]]) - self:SetPushedTexture([[Interface\BUTTONS\UI-SpellbookIcon-PrevPage-Down]]) - self:SetDisabledTexture([[Interface\BUTTONS\UI-SpellbookIcon-PrevPage-Disabled]]) - else - self:SetNormalTexture([[Interface\BUTTONS\UI-SpellbookIcon-NextPage-Up]]) - self:SetPushedTexture([[Interface\BUTTONS\UI-SpellbookIcon-NextPage-Down]]) - self:SetDisabledTexture([[Interface\BUTTONS\UI-SpellbookIcon-NextPage-Disabled]]) - end - end - MainPanel.filter_toggle = filter_toggle - end -- do-block - - ------------------------------------------------------------------------------- - -- Sort-mode toggle button. - ------------------------------------------------------------------------------- - local SortToggle = GenericCreateButton(nil, MainPanel, 24, 24, nil, nil, nil, L["SORTING_DESC"], 2) - - MainPanel.sort_button = SortToggle - - SortToggle:SetPoint("LEFT", ExpandButtonFrame, "RIGHT", 0, 2) - - SortToggle:SetScript("OnClick", - function(self, button, down) - local sort_type = addon.db.profile.sorting - - addon.db.profile.sorting = (sort_type == "Ascending" and "Descending" or "Ascending") - - self:SetTextures() - MainPanel.list_frame:Update(nil, false) - end) - - SortToggle:SetHighlightTexture([[Interface\CHATFRAME\UI-ChatIcon-BlinkHilight]]) - - function SortToggle:SetTextures() - local sort_type = addon.db.profile.sorting - - if sort_type == "Ascending" then - self:SetNormalTexture([[Interface\CHATFRAME\UI-ChatIcon-ScrollDown-Up]]) - self:SetPushedTexture([[Interface\CHATFRAME\UI-ChatIcon-ScrollDown-Down]]) - self:SetDisabledTexture([[Interface\CHATFRAME\UI-ChatIcon-ScrollDown-Disabled]]) - else - self:SetNormalTexture([[Interface\CHATFRAME\UI-ChatIcon-ScrollUp-Up]]) - self:SetPushedTexture([[Interface\CHATFRAME\UI-ChatIcon-ScrollUp-Down]]) - self:SetDisabledTexture([[Interface\CHATFRAME\UI-ChatIcon-ScrollUp-Disabled]]) - end - end - - ------------------------------------------------------------------------------- - -- Create MainPanel.progress_bar and set its scripts - ------------------------------------------------------------------------------- - do - local progress_bar = CreateFrame("StatusBar", nil, MainPanel) - progress_bar:SetWidth(216) - progress_bar:SetHeight(18) - progress_bar:SetPoint("BOTTOMLEFT", MainPanel, 17, 80) - progress_bar:SetBackdrop({ - bgFile = [[Interface\DialogFrame\UI-DialogBox-Background-Dark]], - tile = true, - tileSize = 16, - }) - - progress_bar:SetStatusBarTexture([[Interface\TARGETINGFRAME\UI-StatusBar]]) - progress_bar:SetOrientation("HORIZONTAL") - progress_bar:SetStatusBarColor(0.37, 0.45, 1.0) - - local border = progress_bar:CreateTexture(nil, "OVERLAY") - border:SetWidth(288) - border:SetHeight(78) - border:SetPoint("TOPLEFT", progress_bar, "TOPLEFT", -36, 31) - border:SetTexture([[Interface\CastingBar\UI-CastingBar-Border]]) - - local text = progress_bar:CreateFontString(nil, "ARTWORK") - text:SetWidth(195) - text:SetHeight(14) - text:SetFontObject("GameFontHighlightSmall") - text:SetPoint("CENTER", progress_bar, "CENTER", 0, 0) - text:SetJustifyH("CENTER") - text:SetJustifyV("CENTER") - - progress_bar.text = text - MainPanel.progress_bar = progress_bar - end -- do - - ------------------------------------------------------------------------------- - -- Create the close button, and set its scripts. - ------------------------------------------------------------------------------- - MainPanel.close_button = GenericCreateButton(nil, MainPanel, 24, 111, "GameFontNormalSmall", _G.EXIT, "CENTER", L["CLOSE_DESC"], 1) - MainPanel.close_button:SetPoint("LEFT", MainPanel.progress_bar, "RIGHT", 3, 1) - - MainPanel.close_button:SetScript("OnClick", - function(self, button, down) - MainPanel:Hide() - end) - - ------------------------------------------------------------------------------- - -- Initialize components defined in other files. - ------------------------------------------------------------------------------- - private.InitializeListFrame() - private.InitializeTabs() - - private.InitializeFrame = nil -end - --------------------------------------------------------------------------------- ----- Creates a new frame with the contents of a text dump so you can copy and paste ---- Code borrowed from Antiarc (Chatter) with permission ---- @name AckisRecipeList:DisplayTextDump ---- @param RecipeDB The database (array) which you wish read data from. ---- @param profession Which profession are you displaying data for ---- @param text The text to be dumped --------------------------------------------------------------------------------- -do - local copy_frame = CreateFrame("Frame", "ARLCopyFrame", UIParent) - copy_frame:SetBackdrop({ - bgFile = [[Interface\DialogFrame\UI-DialogBox-Background]], - edgeFile = [[Interface\DialogFrame\UI-DialogBox-Border]], - tile = true, - tileSize = 16, - edgeSize = 16, - insets = { - left = 3, - right = 3, - top = 5, - bottom = 3 - } - }) - copy_frame:SetBackdropColor(0, 0, 0, 1) - copy_frame:SetWidth(750) - copy_frame:SetHeight(400) - copy_frame:SetPoint("CENTER", UIParent, "CENTER") - copy_frame:SetFrameStrata("DIALOG") - - table.insert(UISpecialFrames, "ARLCopyFrame") - - local scrollArea = CreateFrame("ScrollFrame", "ARLCopyScroll", copy_frame, "UIPanelScrollFrameTemplate") - scrollArea:SetPoint("TOPLEFT", copy_frame, "TOPLEFT", 8, -30) - scrollArea:SetPoint("BOTTOMRIGHT", copy_frame, "BOTTOMRIGHT", -30, 8) - - local edit_box = CreateFrame("EditBox", nil, copy_frame) - edit_box:SetMultiLine(true) - edit_box:SetMaxLetters(0) - edit_box:EnableMouse(true) - edit_box:SetAutoFocus(true) - edit_box:SetFontObject(ChatFontNormal) - edit_box:SetWidth(650) - edit_box:SetHeight(270) - edit_box:SetScript("OnEscapePressed", - function() - copy_frame:Hide() - end) - edit_box:HighlightText(0) - - scrollArea:SetScrollChild(edit_box) - - local close = CreateFrame("Button", nil, copy_frame, "UIPanelCloseButton") - close:SetPoint("TOPRIGHT", copy_frame, "TOPRIGHT") - - copy_frame:Hide() - - function addon:DisplayTextDump(RecipeDB, profession, text) - local text = (not RecipeDB and not profession) and text or self:GetTextDump(profession) - - if text ~= "" then - edit_box:SetText(text) - edit_box:HighlightText(0) - edit_box:SetCursorPosition(1) - copy_frame:Show() - end - end -end -- do diff --git a/Interface/Panel.lua b/Interface/Panel.lua new file mode 100644 index 0000000..f550d37 --- /dev/null +++ b/Interface/Panel.lua @@ -0,0 +1,1091 @@ +--[[ +************************************************************************ +Panel.lua +************************************************************************ +File date: @file-date-iso@ +File hash: @file-abbreviated-hash@ +Project hash: @project-abbreviated-hash@ +Project version: @project-version@ +************************************************************************ +Please see http://www.wowace.com/addons/arl/ for more information. +************************************************************************ +This source code is released under All Rights Reserved. +************************************************************************ +@class file +@name Panel.lua +************************************************************************ +]]-- + +------------------------------------------------------------------------------- +-- Localized Lua globals. +------------------------------------------------------------------------------- +local _G = getfenv(0) + +local string = _G.string +local sformat = string.format +local strlower = string.lower +local smatch = string.match + +local select = _G.select + +local table = _G.table + +local ipairs, pairs = _G.ipairs, _G.pairs + +local tonumber = _G.tonumber +local tostring = _G.tostring + +------------------------------------------------------------------------------- +-- Localized Blizzard API. +------------------------------------------------------------------------------- +local GetItemQualityColor = _G.GetItemQualityColor + +-- GLOBALS: CreateFrame, GameTooltip, UIParent + +------------------------------------------------------------------------------- +-- AddOn namespace. +------------------------------------------------------------------------------- +local LibStub = LibStub + +local MODNAME = "Ackis Recipe List" +local addon = LibStub("AceAddon-3.0"):GetAddon(MODNAME) + +local BFAC = LibStub("LibBabble-Faction-3.0"):GetLookupTable() +local L = LibStub("AceLocale-3.0"):GetLocale(MODNAME) + +-- Set up the private intra-file namespace. +local private = select(2, ...) + +local Player = private.Player + +------------------------------------------------------------------------------- +-- Upvalues +------------------------------------------------------------------------------- +local AcquireTable = private.AcquireTable +local ReleaseTable = private.ReleaseTable +local SetTextColor = private.SetTextColor +local GenericCreateButton = private.GenericCreateButton +local SetTooltipScripts = private.SetTooltipScripts + +local A = private.acquire_types + +------------------------------------------------------------------------------- +-- Constants +------------------------------------------------------------------------------- +local ORDERED_PROFESSIONS = private.ordered_professions + +local FACTION_HORDE = BFAC["Horde"] +local FACTION_ALLIANCE = BFAC["Alliance"] +local FACTION_NEUTRAL = BFAC["Neutral"] + +function private.InitializeFrame() + ------------------------------------------------------------------------------- + -- Create the MainPanel and set its values + ------------------------------------------------------------------------------- + local MainPanel = CreateFrame("Frame", "ARL_MainPanel", UIParent) + + -- The panel width changes when contracting and expanding - store it for later use. + MainPanel.normal_width = 384 + MainPanel.expanded_width = 768 + + MainPanel:SetWidth(MainPanel.normal_width) + MainPanel:SetHeight(512) + MainPanel:SetFrameStrata("MEDIUM") + MainPanel:SetToplevel(true) + MainPanel:SetClampedToScreen(true) + MainPanel:SetClampRectInsets(0, -35, 0, 53) + + MainPanel:SetHitRectInsets(0, 35, 0, 53) + MainPanel:EnableMouse(true) + MainPanel:EnableKeyboard(true) + MainPanel:SetMovable(true) + + MainPanel.is_expanded = false + + -- Let the user banish the MainPanel with the ESC key. + table.insert(UISpecialFrames, "ARL_MainPanel") + addon.Frame = MainPanel + + do + local top_left = MainPanel:CreateTexture(nil, "ARTWORK") + top_left:SetTexture("Interface\\QuestFrame\\UI-QuestLog-TopLeft") + top_left:SetPoint("TOPLEFT", MainPanel, "TOPLEFT", 0, 0) + MainPanel.top_left = top_left + + local top_right = MainPanel:CreateTexture(nil, "ARTWORK") + top_right:SetTexture("Interface\\QuestFrame\\UI-QuestLog-TopRight") + top_right:SetPoint("TOPRIGHT", MainPanel, "TOPRIGHT", 0, 0) + MainPanel.top_right = top_right + + local bottom_left = MainPanel:CreateTexture(nil, "ARTWORK") + bottom_left:SetTexture("Interface\\QuestFrame\\UI-QuestLog-BotLeft") + bottom_left:SetPoint("BOTTOMLEFT", MainPanel, "BOTTOMLEFT", 0, 0) + MainPanel.bottom_left = bottom_left + + local bottom_right = MainPanel:CreateTexture(nil, "ARTWORK") + bottom_right:SetTexture("Interface\\QuestFrame\\UI-QuestLog-BotRight") + bottom_right:SetPoint("BOTTOMRIGHT", MainPanel, "BOTTOMRIGHT", 0, 0) + MainPanel.bottom_right = bottom_right + + local title_bar = MainPanel:CreateFontString(nil, "ARTWORK") + title_bar:SetFontObject("GameFontHighlightSmall") + title_bar:SetPoint("TOPLEFT", MainPanel, "TOPLEFT", 20, -20) + title_bar:SetPoint("TOPRIGHT", MainPanel, "TOPRIGHT", -40, -20) + title_bar:SetJustifyH("CENTER") + MainPanel.title_bar = title_bar + + MainPanel:Hide() + end -- do block + + ------------------------------------------------------------------------------- + -- MainPanel scripts/functions. + ------------------------------------------------------------------------------- + MainPanel:SetScript("OnHide", + function(self) + for spell_id, recipe in pairs(private.recipe_list) do + recipe:RemoveState("RELEVANT") + recipe:RemoveState("VISIBLE") + end + addon:ClosePopups() + end) + + MainPanel:SetScript("OnMouseDown", MainPanel.StartMoving) + + MainPanel:SetScript("OnMouseUp", + function(self, button) + self:StopMovingOrSizing() + + local opts = addon.db.profile.frameopts + local from, _, to, x, y = self:GetPoint() + + opts.anchorFrom = from + opts.anchorTo = to + + if self.is_expanded then + if opts.anchorFrom == "TOPLEFT" or opts.anchorFrom == "LEFT" or opts.anchorFrom == "BOTTOMLEFT" then + opts.offsetx = x + elseif opts.anchorFrom == "TOP" or opts.anchorFrom == "CENTER" or opts.anchorFrom == "BOTTOM" then + opts.offsetx = x - 151/2 + elseif opts.anchorFrom == "TOPRIGHT" or opts.anchorFrom == "RIGHT" or opts.anchorFrom == "BOTTOMRIGHT" then + opts.offsetx = x - 151 + end + else + opts.offsetx = x + end + opts.offsety = y + end) + + ------------------------------------------------------------------------------- + -- Displays the main GUI frame. + ------------------------------------------------------------------------------- + function MainPanel:Display(profession, is_linked) + self.is_linked = is_linked + + ------------------------------------------------------------------------------- + -- Set the profession. + ------------------------------------------------------------------------------- + local prev_profession = self.profession + + if profession == private.mining_name then + self.profession = 11 -- Smelting + self.prof_name = profession + else + for index, name in ipairs(ORDERED_PROFESSIONS) do + if name == profession then + self.profession = index + break + end + end + self.prof_name = nil + end + + if self.profession ~= prev_profession then + self.prev_profession = self.profession + end + self.prof_button:ChangeTexture(private.profession_textures[self.profession]) + + local editbox = self.search_editbox + + if self.profession ~= self.prev_profession then + editbox.prev_search = nil + end + editbox:SetText(editbox.prev_search or _G.SEARCH) + + -- If there is no current tab, this is the first time the panel has been + -- shown so things must be initialized. In this case, MainPanel.list_frame:Update() + -- will be called by the tab's OnClick handler. + if not self.current_tab then + local current_tab = self.tabs[addon.db.profile.current_tab] + local on_click = current_tab:GetScript("OnClick") + + on_click(current_tab) + + self.current_tab = addon.db.profile.current_tab + else + MainPanel.list_frame:Update(nil, false) + end + self.sort_button:SetTextures() + self.filter_toggle:SetTextures() + + self:UpdateTitle() + self:Show() + end + + do + ------------------------------------------------------------------------------- + -- Restore the panel's position on the screen. + ------------------------------------------------------------------------------- + local function Reset_Position(self) + local opts = addon.db.profile.frameopts + local FixedOffsetX = opts.offsetx + + self:ClearAllPoints() + + if opts.anchorTo == "" then -- no values yet, clamp to whatever frame is appropriate + if _G.ATSWFrame then + self:SetPoint("CENTER", _G.ATSWFrame, "CENTER", 490, 0) + elseif _G.CauldronFrame then + self:SetPoint("CENTER", _G.CauldronFrame, "CENTER", 490, 0) + elseif _G.Skillet then + self:SetPoint("CENTER", _G.SkilletFrame, "CENTER", 468, 0) + else + self:SetPoint("TOPLEFT", _G.TradeSkillFrame, "TOPRIGHT", 10, 0) + end + else + if self.is_expanded then + if opts.anchorFrom == "TOPLEFT" or opts.anchorFrom == "LEFT" or opts.anchorFrom == "BOTTOMLEFT" then + FixedOffsetX = opts.offsetx + elseif opts.anchorFrom == "TOP" or opts.anchorFrom == "CENTER" or opts.anchorFrom == "BOTTOM" then + FixedOffsetX = opts.offsetx + 151/2 + elseif opts.anchorFrom == "TOPRIGHT" or opts.anchorFrom == "RIGHT" or opts.anchorFrom == "BOTTOMRIGHT" then + FixedOffsetX = opts.offsetx + 151 + end + end + self:SetPoint(opts.anchorFrom, UIParent, opts.anchorTo, FixedOffsetX, opts.offsety) + end + self:SetScale(addon.db.profile.frameopts.uiscale) + end + + MainPanel:SetScript("OnShow", Reset_Position) + end -- do-block + + do + local VALID_CATEGORY = { + ["general"] = true, + ["obtain"] = true, + ["binding"] = true, + ["item"] = true, + ["quality"] = true, + ["player"] = true, + ["rep"] = true, + ["misc"] = true, + } + + function MainPanel:ToggleState() + local x, y = self:GetLeft(), self:GetBottom() + + if self.is_expanded then + -- Hide the category buttons + for category in pairs(self.filter_menu) do + if VALID_CATEGORY[category] then + self["menu_toggle_" .. category]:Hide() + end + end + self.filter_reset:Hide() + self.filter_menu:Hide() + + PlaySound("igCharacterInfoClose") + + self:SetWidth(self.normal_width) + self:SetHitRectInsets(0, 35, 0, 53) + self:SetClampRectInsets(0, -35, 0, 53) + + self.top_left:SetTexture("Interface\\QuestFrame\\UI-QuestLog-TopLeft") + self.top_right:SetTexture("Interface\\QuestFrame\\UI-QuestLog-TopRight") + self.bottom_left:Show() + self.bottom_right:Show() + + self.xclose_button:ClearAllPoints() + self.xclose_button:SetPoint("TOPRIGHT", self, "TOPRIGHT", -30, -8) + else + local found_active = false + + -- Show the category buttons. If one has been selected, show its information in the panel. + for category in pairs(MainPanel.filter_menu) do + local toggle = "menu_toggle_" .. category + + if VALID_CATEGORY[category] then + MainPanel[toggle]:Show() + + if MainPanel[toggle]:GetChecked() then + found_active = true + MainPanel.filter_menu[category]:Show() + MainPanel.filter_menu:Show() + end + end + end + + -- If nothing was checked, default to the general filters. + if not found_active then + MainPanel.menu_toggle_general:SetChecked(true) + MainPanel.filter_menu.general:Show() + MainPanel.filter_menu:Show() + end + MainPanel.filter_reset:Show() + + PlaySound("igCharacterInfoOpen") + + self:SetWidth(self.expanded_width) + self:SetHitRectInsets(0, 90, 0, 53) + self:SetClampRectInsets(0, -90, 0, 53) + + self.top_left:SetTexture("Interface\\QuestFrame\\UI-QuestLogDualPane-Left") + self.top_right:SetTexture("Interface\\QuestFrame\\UI-QuestLogDualPane-Right") + self.bottom_left:Hide() + self.bottom_right:Hide() + + self.xclose_button:ClearAllPoints() + self.xclose_button:SetPoint("TOPRIGHT", self, "TOPRIGHT", -84, -8) + end + self.is_expanded = not self.is_expanded + + self:ClearAllPoints() + self:SetPoint("BOTTOMLEFT", UIParent, "BOTTOMLEFT", x, y) + self:UpdateTitle() + end + end -- do-block + + function MainPanel:UpdateTitle() + local current_prof = ORDERED_PROFESSIONS[self.profession] + + if not self.is_expanded then + self.title_bar:SetFormattedText(SetTextColor(private.basic_colors["normal"], "ARL (%s) - %s"), addon.version, current_prof) + return + end + local total, active = 0, 0 + + for filter, info in pairs(self.filter_menu.value_map) do + if info.svroot then + if info.svroot[filter] == true then + active = active + 1 + end + total = total + 1 + end + end + self.title_bar:SetFormattedText(SetTextColor(private.basic_colors["normal"], "ARL (%s) - %s (%d/%d %s)"), addon.version, current_prof, active, total, _G.FILTERS) + end + + ------------------------------------------------------------------------------- + -- Create the profession-cycling button and assign its values. + ------------------------------------------------------------------------------- + local ProfCycle = CreateFrame("Button", nil, MainPanel, "UIPanelButtonTemplate") + ProfCycle:SetWidth(64) + ProfCycle:SetHeight(64) + ProfCycle:SetPoint("TOPLEFT", MainPanel, "TOPLEFT", 5, -4) + ProfCycle:RegisterForClicks("LeftButtonUp", "RightButtonUp") + + ProfCycle._normal = ProfCycle:CreateTexture(nil, "BACKGROUND") + ProfCycle._pushed = ProfCycle:CreateTexture(nil, "BACKGROUND") + ProfCycle._disabled = ProfCycle:CreateTexture(nil, "BACKGROUND") + + MainPanel.prof_button = ProfCycle + + ------------------------------------------------------------------------------- + -- ProfCycle scripts/functions. + ------------------------------------------------------------------------------- + ProfCycle:SetScript("OnClick", + function(self, button, down) + -- Known professions should be in Player.professions + + -- This loop is gonna be weird. The reason is because we need to + -- ensure that we cycle through all the known professions, but also + -- that we do so in order. That means that if the currently displayed + -- profession is the last one in the list, we're actually going to + -- iterate completely once to get to the currently displayed profession + -- and then iterate again to make sure we display the next one in line. + -- Further, there is the nuance that the person may not know any + -- professions yet at all. Users are so annoying. + local startLoop = 0 + local endLoop = 0 + local displayProf = 0 + + local NUM_PROFESSIONS = 12 + + -- ok, so first off, if we've never done this before, there is no "current" + -- and a single iteration will do nicely, thank you + if button == "LeftButton" then + -- normal profession switch + if MainPanel.profession == 0 then + startLoop = 1 + endLoop = NUM_PROFESSIONS + 1 + else + startLoop = MainPanel.profession + 1 + endLoop = MainPanel.profession + end + local index = startLoop + + while index ~= endLoop do + if index > NUM_PROFESSIONS then + index = 1 + elseif Player.professions[ORDERED_PROFESSIONS[index]] then + displayProf = index + MainPanel.profession = index + break + else + index = index + 1 + end + end + elseif button == "RightButton" then + -- reverse profession switch + if MainPanel.profession == 0 then + startLoop = NUM_PROFESSIONS + 1 + endLoop = 0 + else + startLoop = MainPanel.profession - 1 + endLoop = MainPanel.profession + end + local index = startLoop + + while index ~= endLoop do + if index < 1 then + index = NUM_PROFESSIONS + elseif Player.professions[ORDERED_PROFESSIONS[index]] then + displayProf = index + MainPanel.profession = index + break + else + index = index - 1 + end + end + end + local trade_frame = _G.GnomeWorksFrame or _G.Skillet or _G.MRTSkillFrame or _G.ATSWFrame or _G.CauldronFrame or _G.TradeSkillFrame + local is_shown = trade_frame:IsVisible() + local sfx + + PlaySound("igCharacterNPCSelect") + + -- If not shown, save the current sound effects setting then set it to 0. + if not is_shown then + sfx = tonumber(GetCVar("Sound_EnableSFX")) + SetCVar("Sound_EnableSFX", 0) + end + CastSpellByName(ORDERED_PROFESSIONS[MainPanel.profession]) + addon:Scan() + + if not is_shown then + CloseTradeSkill() + SetCVar("Sound_EnableSFX", sfx) + end + end) + + function ProfCycle:ChangeTexture(texture) + local normal, pushed, disabled = self._normal, self._pushed, self._disabled + + normal:SetTexture([[Interface\Addons\AckisRecipeList\img\]] .. texture .. [[_up]]) + normal:SetTexCoord(0, 1, 0, 1) + normal:SetAllPoints(self) + self:SetNormalTexture(normal) + + pushed:SetTexture([[Interface\Addons\AckisRecipeList\img\]] .. texture .. [[_down]]) + pushed:SetTexCoord(0, 1, 0, 1) + pushed:SetAllPoints(self) + self:SetPushedTexture(pushed) + + disabled:SetTexture([[Interface\Addons\AckisRecipeList\img\]] .. texture .. [[_up]]) + disabled:SetTexCoord(0, 1, 0, 1) + disabled:SetAllPoints(self) + self:SetDisabledTexture(disabled) + end + + ------------------------------------------------------------------------------- + -- The search entry box and associated methods. + ------------------------------------------------------------------------------- + local SearchRecipes + do + local acquire_names = private.acquire_names + local location_list = private.location_list + + local search_params = { + "name", + "skill_level", + --@debug@ + -- "item_id", + --@end-debug@ + "specialty", + } + -- Scans through the recipe database and toggles the flag on if the item is in the search criteria + function SearchRecipes(pattern) + if not pattern then + return + end + local current_prof = ORDERED_PROFESSIONS[MainPanel.profession] + + pattern = pattern:lower() + + for index, entry in pairs(private.recipe_list) do + entry:RemoveState("RELEVANT") + + if entry.profession == current_prof then + local found = false + + for index, field in ipairs(search_params) do + local str = entry[field] and tostring(entry[field]):lower() or nil + + if str and str:find(pattern) then + entry:AddState("RELEVANT") + found = true + break + end + end + + if not found then + for acquire_type in pairs(acquire_names) do + local str = acquire_names[acquire_type]:lower() + + if str and str:find(pattern) and entry.acquire_data[acquire_type] then + entry:AddState("RELEVANT") + found = true + break + end + end + end + + if not found then + for location_name in pairs(location_list) do + local breakout = false + + for spell_id in pairs(location_list[location_name].recipes) do + if spell_id == entry.spell_id then + local str = location_name:lower() + + if str and str:find(pattern) then + entry:AddState("RELEVANT") + breakout = true + break + end + end + end + + if breakout then + break + end + end + end + end + end -- if entry.profession + end -- for + end -- do + + ------------------------------------------------------------------------------- + -- Search EditBox + ------------------------------------------------------------------------------- + local SearchBox = CreateFrame("EditBox", nil, MainPanel, "InputBoxTemplate") + + SearchBox:EnableMouse(true) + SearchBox:SetAutoFocus(false) + SearchBox:SetFontObject(ChatFontSmall) + SearchBox:SetWidth(130) + SearchBox:SetHeight(12) + SearchBox:SetPoint("TOPLEFT", MainPanel, "TOPLEFT", 75, -39) + SearchBox:Show() + + MainPanel.search_editbox = SearchBox + + SearchBox:SetText(_G.SEARCH) + SearchBox:SetHistoryLines(10) + + -- Allow removal of focus from the SearchBox by clicking on the WorldFrame. + do + local old_x, old_y, click_time + + WorldFrame:HookScript("OnMouseDown", + function(frame, ...) + if not SearchBox:HasFocus() then + return + end + old_x, old_y = GetCursorPosition() + click_time = GetTime() + end) + + WorldFrame:HookScript("OnMouseUp", + function(frame, ...) + if not SearchBox:HasFocus() then + return + end + local x, y = GetCursorPosition() + + if not old_x or not old_y or not x or not y or not click_time then + SearchBox:ClearFocus() + return + end + + if (_G.math.abs(x - old_x) + _G.math.abs(y - old_y)) <= 5 and GetTime() - click_time < .5 then + SearchBox:ClearFocus() + end + end) + end + + -- Resets the SearchBox text and the state of all MainPanel.list_frame and recipe_list entries. + function SearchBox:Reset() + for index, recipe in pairs(private.recipe_list) do + recipe:RemoveState("RELEVANT") + end + self.prev_search = nil + + self:SetText(_G.SEARCH) + + if self:HasFocus() then + self:HighlightText() + end + MainPanel.list_frame:Update(nil, false) + end + + -- If there is text in the search box, return the recipe's RELEVANT state. + function SearchBox:MatchesRecipe(recipe) + local editbox_text = self:GetText() + + if editbox_text ~= "" and editbox_text ~= _G.SEARCH then + return recipe:HasState("RELEVANT") + end + return true + end + + SearchBox:SetScript("OnEnterPressed", + function(self) + local searchtext = self:GetText() + searchtext = searchtext:trim() + + if not searchtext or searchtext == "" then + self:Reset() + return + end + self:HighlightText() + + if searchtext == _G.SEARCH then + return + end + self.prev_search = searchtext + + self:AddHistoryLine(searchtext) + SearchRecipes(searchtext) + MainPanel.list_frame:Update(nil, false) + end) + + SearchBox:SetScript("OnEditFocusGained", SearchBox.HighlightText) + + SearchBox:SetScript("OnEditFocusLost", + function(self) + local text = self:GetText() + + if text == "" or text == _G.SEARCH then + self:Reset() + return + end + + -- Ensure that the highlight is cleared. + self:SetText(text) + + self:AddHistoryLine(text) + end) + + + SearchBox:SetScript("OnTextSet", + function(self) + local text = self:GetText() + + if text ~= "" and text ~= _G.SEARCH and text ~= self.prev_search then + self:HighlightText() + else + self:Reset() + end + end) + + do + local last_update = 0 + local updater = CreateFrame("Frame", nil, UIParent) + + updater:Hide() + updater:SetScript("OnUpdate", + function(self, elapsed) + last_update = last_update + elapsed + + if last_update >= 0.5 then + last_update = 0 + + SearchRecipes(SearchBox:GetText()) + MainPanel.list_frame:Update(nil, false) + self:Hide() + end + end) + + SearchBox:SetScript("OnTextChanged", + function(self, is_typed) + if not is_typed then + return + end + local text = self:GetText() + + if text ~= "" and text ~= _G.SEARCH and text ~= self.prev_search then + updater:Show() + else + self:Reset() + end + end) + end -- do + + ------------------------------------------------------------------------------- + -- Create the expand button and set its scripts. + ------------------------------------------------------------------------------- + local ExpandButtonFrame = CreateFrame("Frame", nil, MainPanel) + + ExpandButtonFrame:SetHeight(20) + ExpandButtonFrame:SetPoint("TOPLEFT", SearchBox, "BOTTOMLEFT", -12, -5) + + ExpandButtonFrame.left = ExpandButtonFrame:CreateTexture(nil, "BACKGROUND") + ExpandButtonFrame.left:SetWidth(8) + ExpandButtonFrame.left:SetHeight(22) + ExpandButtonFrame.left:SetPoint("TOPLEFT", ExpandButtonFrame, 0, 4) + ExpandButtonFrame.left:SetTexture("Interface\\QuestFrame\\UI-QuestLogSortTab-Left") + + ExpandButtonFrame.right = ExpandButtonFrame:CreateTexture(nil, "BACKGROUND") + ExpandButtonFrame.right:SetWidth(8) + ExpandButtonFrame.right:SetHeight(22) + ExpandButtonFrame.right:SetPoint("TOPRIGHT", ExpandButtonFrame, 0, 4) + ExpandButtonFrame.right:SetTexture("Interface\\QuestFrame\\UI-QuestLogSortTab-Right") + + ExpandButtonFrame.middle = ExpandButtonFrame:CreateTexture(nil, "BACKGROUND") + ExpandButtonFrame.middle:SetHeight(22) + ExpandButtonFrame.middle:SetPoint("LEFT", ExpandButtonFrame.left, "RIGHT") + ExpandButtonFrame.middle:SetPoint("RIGHT", ExpandButtonFrame.right, "LEFT") + ExpandButtonFrame.middle:SetTexture("Interface\\QuestFrame\\UI-QuestLogSortTab-Middle") + + local ExpandButton = GenericCreateButton(nil, MainPanel, 16, 16, "GameFontNormalSmall", _G.ALL, "LEFT", L["EXPANDALL_DESC"], 2) + + -- Make sure the button frame is large enough to hold the localized word for "All" + ExpandButtonFrame:SetWidth(27 + ExpandButton:GetFontString():GetStringWidth()) + + MainPanel.expand_button = ExpandButton + + ExpandButton:SetPoint("LEFT", ExpandButtonFrame.left, "RIGHT", -3, -3) + + ExpandButton.text:ClearAllPoints() + ExpandButton.text:SetPoint("LEFT", ExpandButton, "Right", 0, 0) + + ExpandButton:SetScript("OnClick", + function(self, mouse_button, down) + local current_tab = MainPanel.tabs[MainPanel.current_tab] + local expanded = current_tab["expand_button_"..MainPanel.profession] + local expand_mode + + if not expanded then + if _G.IsShiftKeyDown() then + expand_mode = "deep" + else + expand_mode = "normal" + end + else + local prof_name = ORDERED_PROFESSIONS[MainPanel.profession] + + table.wipe(current_tab[prof_name.." expanded"]) + end + -- MainPanel.list_frame:Update() must be called before the button can be expanded or contracted, since + -- the button is contracted from there. + -- If expand_mode is nil, that means expand nothing. + MainPanel.list_frame:Update(expand_mode, false) + + if expanded then + self:Contract(current_tab) + else + self:Expand(current_tab) + end + end) + + function ExpandButton:Expand(current_tab) + current_tab["expand_button_"..MainPanel.profession] = true + + self:SetNormalTexture("Interface\\BUTTONS\\UI-MinusButton-Up") + self:SetPushedTexture("Interface\\BUTTONS\\UI-MinusButton-Down") + self:SetHighlightTexture("Interface\\BUTTONS\\UI-PlusButton-Hilight") + self:SetDisabledTexture("Interface\\BUTTONS\\UI-MinusButton-Disabled") + + SetTooltipScripts(self, L["CONTRACTALL_DESC"]) + end + + function ExpandButton:Contract(current_tab) + current_tab["expand_button_"..MainPanel.profession] = nil + + self:SetNormalTexture("Interface\\Buttons\\UI-PlusButton-Up") + self:SetPushedTexture("Interface\\Buttons\\UI-PlusButton-Down") + self:SetHighlightTexture("Interface\\Buttons\\UI-PlusButton-Hilight") + self:SetDisabledTexture("Interface\\Buttons\\UI-PlusButton-Disabled") + + SetTooltipScripts(self, L["EXPANDALL_DESC"]) + end + + ------------------------------------------------------------------------------- + -- "Skill Level" checkbox. + ------------------------------------------------------------------------------- + local SkillToggle = CreateFrame("CheckButton", nil, MainPanel, "UICheckButtonTemplate") + SkillToggle:SetPoint("TOPLEFT", SearchBox, "TOPRIGHT", 0, 0) + SkillToggle:SetHeight(16) + SkillToggle:SetWidth(16) + + SkillToggle.text = SkillToggle:CreateFontString(nil, "ARTWORK", "GameFontNormalSmall") + SkillToggle.text:SetPoint("LEFT", SkillToggle, "RIGHT", 0, 0) + + SkillToggle:SetScript("OnClick", + function(self, button, down) + addon.db.profile.skill_view = not addon.db.profile.skill_view + MainPanel.list_frame:Update(nil, false) + end) + + SkillToggle:SetScript("OnShow", + function(self) + self:SetChecked(addon.db.profile.skill_view) + end) + + SkillToggle:SetNormalTexture("Interface\\Buttons\\UI-CheckBox-Up") + SkillToggle:SetPushedTexture("Interface\\Buttons\\UI-CheckBox-Down") + SkillToggle:SetHighlightTexture("Interface\\Buttons\\UI-CheckBox-Highlight") + SkillToggle:SetDisabledCheckedTexture("Interface\\Buttons\\UI-CheckBox-Check-Disabled") + SkillToggle:SetCheckedTexture("Interface\\Buttons\\UI-CheckBox-Check") + + SkillToggle.text:SetText(_G.SKILL) + SetTooltipScripts(SkillToggle, L["SKILL_TOGGLE_DESC"], 1) + + ------------------------------------------------------------------------------- + -- "Display Exclusions" checkbox. + ------------------------------------------------------------------------------- + local ExcludeToggle = CreateFrame("CheckButton", nil, MainPanel, "UICheckButtonTemplate") + ExcludeToggle:SetPoint("TOP", SkillToggle, "BOTTOM", 0, 1) + ExcludeToggle:SetHeight(16) + ExcludeToggle:SetWidth(16) + + ExcludeToggle.text = ExcludeToggle:CreateFontString(nil, "ARTWORK", "GameFontNormalSmall") + ExcludeToggle.text:SetPoint("LEFT", ExcludeToggle, "RIGHT", 0, 0) + + ExcludeToggle:SetScript("OnClick", + function(self, button, down) + addon.db.profile.ignoreexclusionlist = not addon.db.profile.ignoreexclusionlist + MainPanel.list_frame:Update(nil, false) + end) + + ExcludeToggle:SetScript("OnShow", + function(self) + self:SetChecked(addon.db.profile.ignoreexclusionlist) + end) + + ExcludeToggle:SetNormalTexture("Interface\\Buttons\\UI-CheckBox-Up") + ExcludeToggle:SetPushedTexture("Interface\\Buttons\\UI-CheckBox-Down") + ExcludeToggle:SetHighlightTexture("Interface\\Buttons\\UI-CheckBox-Highlight") + ExcludeToggle:SetDisabledCheckedTexture("Interface\\Buttons\\UI-CheckBox-Check-Disabled") + ExcludeToggle:SetCheckedTexture("Interface\\Buttons\\UI-CheckBox-Check") + + ExcludeToggle.text:SetText(L["Display Exclusions"]) + SetTooltipScripts(ExcludeToggle, L["DISPLAY_EXCLUSION_DESC"], 1) + + ------------------------------------------------------------------------------- + -- Create the X-close button, and set its scripts. + ------------------------------------------------------------------------------- + MainPanel.xclose_button = CreateFrame("Button", nil, MainPanel, "UIPanelCloseButton") + MainPanel.xclose_button:SetPoint("TOPRIGHT", MainPanel, "TOPRIGHT", -30, -8) + + MainPanel.xclose_button:SetScript("OnClick", + function(self, button, down) + MainPanel:Hide() + end) + + ------------------------------------------------------------------------------- + -- Create MainPanel.filter_toggle, and set its scripts. + ------------------------------------------------------------------------------- + do + local function Toggle_OnClick(self, button, down) + -- The first time this button is clicked, everything in the expanded section of the MainPanel must be created. + if private.InitializeFilterPanel then + private.InitializeFilterPanel() + end + SetTooltipScripts(self, MainPanel.is_expanded and L["FILTER_OPEN_DESC"] or L["FILTER_CLOSE_DESC"]) + + MainPanel:ToggleState() + self:SetTextures() + end + + local filter_toggle = GenericCreateButton(nil, MainPanel, 24, 24, nil, nil, nil, L["FILTER_OPEN_DESC"], 2) + filter_toggle:SetPoint("TOPLEFT", MainPanel, "TOPLEFT", 323, -41) + + filter_toggle:SetScript("OnClick", Toggle_OnClick) + + filter_toggle:SetHighlightTexture([[Interface\CHATFRAME\UI-ChatIcon-BlinkHilight]]) + + function filter_toggle:SetTextures() + if MainPanel.is_expanded then + self:SetNormalTexture([[Interface\BUTTONS\UI-SpellbookIcon-PrevPage-Up]]) + self:SetPushedTexture([[Interface\BUTTONS\UI-SpellbookIcon-PrevPage-Down]]) + self:SetDisabledTexture([[Interface\BUTTONS\UI-SpellbookIcon-PrevPage-Disabled]]) + else + self:SetNormalTexture([[Interface\BUTTONS\UI-SpellbookIcon-NextPage-Up]]) + self:SetPushedTexture([[Interface\BUTTONS\UI-SpellbookIcon-NextPage-Down]]) + self:SetDisabledTexture([[Interface\BUTTONS\UI-SpellbookIcon-NextPage-Disabled]]) + end + end + MainPanel.filter_toggle = filter_toggle + end -- do-block + + ------------------------------------------------------------------------------- + -- Sort-mode toggle button. + ------------------------------------------------------------------------------- + local SortToggle = GenericCreateButton(nil, MainPanel, 24, 24, nil, nil, nil, L["SORTING_DESC"], 2) + + MainPanel.sort_button = SortToggle + + SortToggle:SetPoint("LEFT", ExpandButtonFrame, "RIGHT", 0, 2) + + SortToggle:SetScript("OnClick", + function(self, button, down) + local sort_type = addon.db.profile.sorting + + addon.db.profile.sorting = (sort_type == "Ascending" and "Descending" or "Ascending") + + self:SetTextures() + MainPanel.list_frame:Update(nil, false) + end) + + SortToggle:SetHighlightTexture([[Interface\CHATFRAME\UI-ChatIcon-BlinkHilight]]) + + function SortToggle:SetTextures() + local sort_type = addon.db.profile.sorting + + if sort_type == "Ascending" then + self:SetNormalTexture([[Interface\CHATFRAME\UI-ChatIcon-ScrollDown-Up]]) + self:SetPushedTexture([[Interface\CHATFRAME\UI-ChatIcon-ScrollDown-Down]]) + self:SetDisabledTexture([[Interface\CHATFRAME\UI-ChatIcon-ScrollDown-Disabled]]) + else + self:SetNormalTexture([[Interface\CHATFRAME\UI-ChatIcon-ScrollUp-Up]]) + self:SetPushedTexture([[Interface\CHATFRAME\UI-ChatIcon-ScrollUp-Down]]) + self:SetDisabledTexture([[Interface\CHATFRAME\UI-ChatIcon-ScrollUp-Disabled]]) + end + end + + ------------------------------------------------------------------------------- + -- Create MainPanel.progress_bar and set its scripts + ------------------------------------------------------------------------------- + do + local progress_bar = CreateFrame("StatusBar", nil, MainPanel) + progress_bar:SetWidth(216) + progress_bar:SetHeight(18) + progress_bar:SetPoint("BOTTOMLEFT", MainPanel, 17, 80) + progress_bar:SetBackdrop({ + bgFile = [[Interface\DialogFrame\UI-DialogBox-Background-Dark]], + tile = true, + tileSize = 16, + }) + + progress_bar:SetStatusBarTexture([[Interface\TARGETINGFRAME\UI-StatusBar]]) + progress_bar:SetOrientation("HORIZONTAL") + progress_bar:SetStatusBarColor(0.37, 0.45, 1.0) + + local border = progress_bar:CreateTexture(nil, "OVERLAY") + border:SetWidth(288) + border:SetHeight(78) + border:SetPoint("TOPLEFT", progress_bar, "TOPLEFT", -36, 31) + border:SetTexture([[Interface\CastingBar\UI-CastingBar-Border]]) + + local text = progress_bar:CreateFontString(nil, "ARTWORK") + text:SetWidth(195) + text:SetHeight(14) + text:SetFontObject("GameFontHighlightSmall") + text:SetPoint("CENTER", progress_bar, "CENTER", 0, 0) + text:SetJustifyH("CENTER") + text:SetJustifyV("CENTER") + + progress_bar.text = text + MainPanel.progress_bar = progress_bar + end -- do + + ------------------------------------------------------------------------------- + -- Create the close button, and set its scripts. + ------------------------------------------------------------------------------- + MainPanel.close_button = GenericCreateButton(nil, MainPanel, 24, 111, "GameFontNormalSmall", _G.EXIT, "CENTER", L["CLOSE_DESC"], 1) + MainPanel.close_button:SetPoint("LEFT", MainPanel.progress_bar, "RIGHT", 3, 1) + + MainPanel.close_button:SetScript("OnClick", + function(self, button, down) + MainPanel:Hide() + end) + + ------------------------------------------------------------------------------- + -- Initialize components defined in other files. + ------------------------------------------------------------------------------- + private.InitializeListFrame() + private.InitializeTabs() + + private.InitializeFrame = nil +end + +-------------------------------------------------------------------------------- +---- Creates a new frame with the contents of a text dump so you can copy and paste +--- Code borrowed from Antiarc (Chatter) with permission +--- @name AckisRecipeList:DisplayTextDump +--- @param RecipeDB The database (array) which you wish read data from. +--- @param profession Which profession are you displaying data for +--- @param text The text to be dumped +-------------------------------------------------------------------------------- +do + local copy_frame = CreateFrame("Frame", "ARLCopyFrame", UIParent) + copy_frame:SetBackdrop({ + bgFile = [[Interface\DialogFrame\UI-DialogBox-Background]], + edgeFile = [[Interface\DialogFrame\UI-DialogBox-Border]], + tile = true, + tileSize = 16, + edgeSize = 16, + insets = { + left = 3, + right = 3, + top = 5, + bottom = 3 + } + }) + copy_frame:SetBackdropColor(0, 0, 0, 1) + copy_frame:SetWidth(750) + copy_frame:SetHeight(400) + copy_frame:SetPoint("CENTER", UIParent, "CENTER") + copy_frame:SetFrameStrata("DIALOG") + + table.insert(UISpecialFrames, "ARLCopyFrame") + + local scrollArea = CreateFrame("ScrollFrame", "ARLCopyScroll", copy_frame, "UIPanelScrollFrameTemplate") + scrollArea:SetPoint("TOPLEFT", copy_frame, "TOPLEFT", 8, -30) + scrollArea:SetPoint("BOTTOMRIGHT", copy_frame, "BOTTOMRIGHT", -30, 8) + + local edit_box = CreateFrame("EditBox", nil, copy_frame) + edit_box:SetMultiLine(true) + edit_box:SetMaxLetters(0) + edit_box:EnableMouse(true) + edit_box:SetAutoFocus(true) + edit_box:SetFontObject(ChatFontNormal) + edit_box:SetWidth(650) + edit_box:SetHeight(270) + edit_box:SetScript("OnEscapePressed", + function() + copy_frame:Hide() + end) + edit_box:HighlightText(0) + + scrollArea:SetScrollChild(edit_box) + + local close = CreateFrame("Button", nil, copy_frame, "UIPanelCloseButton") + close:SetPoint("TOPRIGHT", copy_frame, "TOPRIGHT") + + copy_frame:Hide() + + function addon:DisplayTextDump(RecipeDB, profession, text) + local text = (not RecipeDB and not profession) and text or self:GetTextDump(profession) + + if text ~= "" then + edit_box:SetText(text) + edit_box:HighlightText(0) + edit_box:SetCursorPosition(1) + copy_frame:Show() + end + end +end -- do diff --git a/interface.xml b/interface.xml index 2ac92ef..50061cd 100644 --- a/interface.xml +++ b/interface.xml @@ -6,4 +6,5 @@ + -- 1.7.9.5