Mercurial > wow > mailopener
view Core.lua @ 3:c6f0976069c7
Default value for the welcome / bye notification is now set to false
The mailframe checkbox now primarily toggles the mail opening, however if you hold shift you can still disable the entire addon
Now properly removes QuickAuction?s mail count
Now tracks when a mail lost all attachments rather than it being deleted in order to continue processing the next item (mail sent by players containing text should now work properly). This should also be good for a nice speed increase.
Added a variable called ?busy? to the MailOpener object indicating whether or not Mail Opener is currently working. Other addons (or macros) can retrieve it with ?LibStub("AceAddon-3.0"):GetAddon("MailOpener").busy?
A mail refresh from the Postal service should no longer occur while mail is being opened but will happen instantly afterwards.
Postal?s module toggling will now be handled by Postal itself.
Added a short summary to the top of all modules for other developers.
The time remaining until next mail box refresh should be displayed for as long as Mail Opener can be sure.
| author | Zerotorescue |
|---|---|
| date | Tue, 07 Sep 2010 17:46:27 +0200 |
| parents | 57ba1593ac42 |
| children | 1ba07a64bf14 |
line wrap: on
line source
-- You can access this addon's object through: LibStub("AceAddon-3.0"):GetAddon("MailOpener") local MailOpener = LibStub("AceAddon-3.0"):NewAddon("MailOpener", "AceEvent-3.0", "AceTimer-3.0"); -- You can check if MailOpener is busy with LibStub("AceAddon-3.0"):GetAddon("MailOpener").busy (true or false/nil) local AutoOpenMail, MailOpenerConfig, lastAmount, lastQuickAuctionsStatus, freshList, mailboxEmptySoundPlayed; function MailOpener:OnInitialize() local defaults = { global = { uses = 0; }, profile = { general = { defaultStatus = "_enabled", defaultQAStatus = "__remember", continueOpeningStackableItems = false, autoDisableQAAutoMail = true, autoReenableQAAutoMail = false, autoSetBackQAAutoMail = true, continueOpening = false, waitTime = 5, initialDelay = 0.5, }, modules = { Collected = true, }, notifications = { welcome = false, bye = false, finishedCurrentBatch = true, mailboxIsEmpty = true, skipped = { all = true, inventoryFull = true, keepFreeSpaceLimit = true, GMMail = true, COD = true, normalGoldMail = true, normalItemsMail = true, AHexpired = true, AHsuccess = true, AHwon = true, AHcanceled = true, AHoutbid = true, other = true, }, processed = { all = true, normalGoldMail = true, normalItemsMail = true, AHexpired = true, AHsuccess = true, AHwon = true, AHcanceled = true, AHoutbid = true, other = true, }, bagsFullSound = false, bagsFullSoundFile = "Sound\\Spells\\SimonGame_Visual_BadPress.wav", bagsFullSoundFileName = "Simon Error", bagsFullSoundOnlyOnce = true, mailboxEmptySound = false, mailboxEmptySoundFile = "Sound\\Spells\\SimonGame_Visual_GameStart.wav", mailboxEmptySoundFileName = "Simon Start", mailboxEmptySoundOnlyOnce = true, }, }, }; -- Register our saved variables database self.db = LibStub("AceDB-3.0"):New("MailOpenerDB", defaults, true); -- Set these as object variables so we can use them in our modules if select(6, GetAddOnInfo("Postal")) == nil then self.PostalEnabled = true; -- Ensure this addon is loaded if AddonLoader is installed if AddonLoader and AddonLoader.LoadAddOn and not Postal then AddonLoader:LoadAddOn("Postal"); end end if select(6, GetAddOnInfo("QuickAuctions")) == nil then self.QuickAuctionsEnabled = true; -- Ensure this addon is loaded if AddonLoader is installed if AddonLoader and AddonLoader.LoadAddOn then AddonLoader:LoadAddOn("QuickAuctions"); end end -- Don't enable the config module until we need it for name, module in self:IterateModules() do if name == "Config" then module:SetEnabledState(false); elseif self.db.profile.modules[name] ~= nil then if self.db.profile.modules[name] then self:Debug("|cff00ff00Enabling|r module: " .. name); else self:Debug("|cffff0000Disabling|r module: " .. name); end module:SetEnabledState(self.db.profile.modules[name]); end end -- Make the open all checkbox local check = CreateFrame("CheckButton", "cbMailOpenerEnable", MailFrame, "ChatConfigCheckButtonTemplate"); check:SetHeight(26); check:SetWidth(26); check:SetChecked(true); check:SetHitRectInsets(0, -80, 0, 0); check:SetScript("OnClick", function(self) if IsShiftKeyDown() then -- Shift key = toggle addon on or off, since addon is already on there's only one option if not MailOpener:IsEnabled() then print("|cff15ff00Mail Opener|r: Shift key was held down, so |cff00ff00enabling|r the entire addon as well as automatic opening of mail."); MailOpener:Enable(); -- The above calls MAIL_SHOW which changes AutoOpenMail, so we can't remember the old setting AutoOpenMail = true; self:SetChecked(true); else print("|cff15ff00Mail Opener|r: Shift key was held down, so |cffff0000disabling|r the entire addon."); MailOpener:Disable(); self:SetChecked(false); end else -- Normal click if self:GetChecked() then print("|cff15ff00Mail Opener|r: |cff00ff00Enabling|r automatic opening of mail."); AutoOpenMail = true; else print("|cff15ff00Mail Opener|r: |cffff0000Disabling|r automatic opening of mail."); AutoOpenMail = false; end end end); check.tooltip = "Toggle automatic mail opening on or off (you can force this by holding shift when opening the mailbox.\n\nHold the |cffffffffSHIFT|r key to disable the entire addon."; check:SetPoint("TOPLEFT", MailFrame, "TOPLEFT", 68, -13) if self.QuickAuctionsEnabled then -- QA is enabled so move the checkbox further to the right check:SetPoint("TOPLEFT", MailFrame, "TOPLEFT", 155, -13); end -- Get reference to the text field local checkboxText = _G[check:GetName() .. "Text"]; checkboxText:SetText("Mail Opener"); -- We like this color more checkboxText:SetTextColor(1, 0.8, 0, 1); self.cbOpenAll = check; -- Make the config button local button = CreateFrame("Button", "btnMailOpenerConfig", MailFrame, "UIPanelButtonTemplate") button:SetText("Config") button:SetHeight(23) button:SetWidth(55) if self.PostalEnabled then button:SetPoint("TOPRIGHT", MailFrame, "TOPRIGHT", -75, -13); else button:SetPoint("TOPRIGHT", MailFrame, "TOPRIGHT", -55, -13); end button:SetScript("OnClick", function() MailOpener:EnableConfigModule(); MailOpenerConfig:Show(); if MailOpener.db.global.uses >= 15 then MailOpener:ShowBetaPopup(); end end); self.btnConfig = button; -- Disable the AddonLoader slash commands SLASH_MO1 = nil; SLASH_MAILOPEN1 = nil; SLASH_MAILOPENER1 = nil; -- Register our own slash commands SLASH_MAILOPENER1 = "/mo"; SLASH_MAILOPENER2 = "/mailopen"; SLASH_MAILOPENER3 = "/mailopener"; SlashCmdList["MAILOPENER"] = function(msg) MailOpener:EnableConfigModule(); MailOpenerConfig:CommandHandler(msg); end -- Attempt to remove the interface options added by AddonLoader (if enabled) if AddonLoader and AddonLoader.RemoveInterfaceOptions then AddonLoader:RemoveInterfaceOptions("Mail Opener"); end -- Now create our own options frame local frame = CreateFrame("Frame", nil, UIParent); frame:Hide(); frame.name = "Mail Opener"; frame:HookScript("OnShow", function(self) -- Enable the config module MailOpener:EnableConfigModule(); -- Load the options and add it to the blizzard interface list MailOpenerConfig:Load(); -- Refresh the frame to instantly show the right options InterfaceOptionsFrame_OpenToCategory(self.name) end); -- And add it to the interface options InterfaceOptions_AddCategory(frame); end function MailOpener:OnEnable() self:RegisterEvent("MAIL_SHOW"); self:RegisterEvent("PLAYER_ENTERING_WORLD"); self.btnConfig:Show(); -- Reset variables lastAmount = 0; self.debugChannel = nil; self.db.global.uses = ( self.db.global.uses + 1 ); if self.db.global.uses == 15 then self:ShowBetaPopup(); end -- If we were toggling this addon on while the mailbox is opened we must register all events again if MailFrame:IsVisible() then self:MAIL_SHOW(); end end function MailOpener:OnDisable() self:UnregisterEvent("MAIL_SHOW"); self.btnConfig:Hide(); MailOpener:Stop(); end -- We must disable Quick Auction's auto mail (if set up that way in the settings) before opening the mailbox or it will instantly start sending stuff function MailOpener:PLAYER_ENTERING_WORLD() self:UnregisterEvent("PLAYER_ENTERING_WORLD"); self:ToggleQAStatus(); end -- Fired when the mailbox is opened function MailOpener:MAIL_SHOW() -- To stop the timer when the mailbox is closed self:RegisterEvent("MAIL_CLOSED", "Stop"); self:RegisterEvent("PLAYER_LEAVING_WORLD", "Stop"); -- To set the timer for when to refresh again self:RegisterEvent("MAIL_INBOX_UPDATE"); -- We need to know when opening has completed self:RegisterMessage("MO_OPEN_COMPLETE"); self:Debug("defaultStatus:" .. self.db.profile.general.defaultStatus); -- Change the mail opening status according to our settings if self.db.profile.general.defaultStatus == "_enabled" then AutoOpenMail = true; self.cbOpenAll:SetChecked(true); elseif self.db.profile.general.defaultStatus == "disabled" then -- Disable auto opening but leave mail opener enabled AutoOpenMail = false; self.cbOpenAll:SetChecked(false); elseif self.db.profile.general.defaultStatus == "xdisabled" then -- Disable entire addon MailOpener:Disable(); self.cbOpenAll:SetChecked(false); end self:ToggleQAStatus(); -- Hide the InboxTooMuchMail warning to allow room for our mail remaining info line InboxTooMuchMail:Hide() InboxTooMuchMail.Show = function() end if self.QuickAuctionsEnabled then local QAMail = LibStub("AceAddon-3.0"):GetAddon("QuickAuctions"):GetModule("Mail"); -- Hide the open all button QAMail.massOpening:Hide(); -- Hide the x mail remaining text QAMail.totalMail:Hide(); end if self.db.profile.notifications.welcome then -- Welcome notification local _, c = UnitClass("player"); c = RAID_CLASS_COLORS[c]; c = string.format("|cff%02x%02x%02x", c.r * 255 + 0.5, c.g * 255 + 0.5, c.b * 255 + 0.5); print("|cff15ff00Mail Opener|r: Welcome back "..c..UnitName("player").."|r. Requesting new mail from the local Postal Service, your mail will automatically be opened when it becomes available."); end mailboxEmptySoundPlayed = nil; self:Recheck(); if self.db.profile.general.continueOpening then self:ScheduleOpen(true); end end -- Fired after a successful server sync -- Fired when mail is deleted (which happens after taking all attachments from a mail sent by the game) function MailOpener:MAIL_INBOX_UPDATE() local current, total = GetInboxNumItems(); -- Calculate the amount of mail waiting that actually have attachments -- If we just compare numbers we won't be including mail that isn't automatically deleted when opened, such as mail with attachments sent by other players local currentMailWithAttachments = 0; for i = 1, current do local _, _, _, _, money, _, _, items = GetInboxHeaderInfo(i); if (items and items > 0) or (money and money > 0) then currentMailWithAttachments = currentMailWithAttachments + 1; end end local tempLastAmount = lastAmount; lastAmount = currentMailWithAttachments; if currentMailWithAttachments ~= tempLastAmount then self:Debug("MAIL_INBOX_UPDATE - lastAmount:" .. tempLastAmount .. " - current:" .. currentMailWithAttachments); end if currentMailWithAttachments > tempLastAmount then -- New messages arrived in our mailbox, so this was a refresh, so set a timer self:Debug("MO_SERVER_SYNCED"); -- Yell that we successfully synced with the server self:SendMessage("MO_SERVER_SYNCED"); -- This list is fresh freshList = true; mailboxEmptySoundPlayed = nil; -- Stop previous timer self:CancelTimer(self.tmrRecheck, true); -- More will arrive in 60 seconds self.tmrRecheck = self:ScheduleTimer(function() self:Debug("tmrRecheck 61 finished"); -- We can get a fresh list now, so query the server freshList = false; -- Look for mail self:Recheck(); end, 61); self:Debug("tmrRecheck 61"); if not IsShiftKeyDown() then -- Allow overriding of mailopening with the shift key -- Open the current mail self:ScheduleOpen(false); end elseif currentMailWithAttachments < tempLastAmount then -- We lost a mail -- TODO: NYI: May need to delay this until the mail is actually deleted self:Debug("MO_MAIL_EMPTIED"); -- Yell that we successfully opened/removed a mail self:SendMessage("MO_MAIL_EMPTIED"); elseif (currentMailWithAttachments == 50 and tempLastAmount == 50) then if not IsShiftKeyDown() then -- Allow overriding of mailopening with the shift key -- Open the current mail self:ScheduleOpen(false); end end end function MailOpener:ScheduleOpen(continued) if lastAmount > 0 then local waitTime; if continued then waitTime = self.db.profile.general.waitTime; else -- Even though this is not a continuation and should be instant, we set a .5 second timer to prevent multiple calls of the OpenNow function waitTime = self.db.profile.general.initialDelay; end -- Stop previous timer self:CancelTimer(self.tmrOpenNow, true); -- Schedule the next open self.tmrOpenNow = self:ScheduleTimer("OpenNow", waitTime); end end function MailOpener:OpenNow() self:Debug("OpenNow (" .. ((self.busy and "1") or "0") .. ")"); if not self.busy and MailFrame:IsVisible() and AutoOpenMail then self:Debug("OpenNow"); -- BeanCounter is the only addon hiding the mail close button while busy, so we can look for that local BeanCounterActive = not InboxCloseButton:IsVisible(); if not BeanCounterActive then -- BeanCounter is INACTIVE self:CancelTimer(self.tmrTryAgain, true); -- Insurance if QuickAuctionsAutoMail then -- Remember the last known quick auctions status lastQuickAuctionsStatus = QuickAuctionsAutoMail:GetChecked(); end if self.db.profile.general.autoDisableQAAutoMail and self.QuickAuctionsEnabled and QuickAuctionsAutoMail and QuickAuctionsAutoMail:GetChecked() then -- If auto disable "QA Auto mail" is enabled and QA's auto mail is currently toggled on, turn it off -- We need to do this with a :click to trigger the right events self:Debug("Turning automail |cffff0000off|r."); QuickAuctionsAutoMail:Click(); end self.busy = true; self:Debug("MO_OPEN_MAIL"); -- Summon the mail opening gods self:SendMessage("MO_OPEN_MAIL"); else -- BeanCounter is ACTIVE self:Debug("BeanCounter active, waiting .5 seconds..."); self:CancelTimer(self.tmrTryAgain, true); -- Insurance -- Wait with summoning until BeanCounter is done, try again every 0.5 seconds self.tmrTryAgain = self:ScheduleTimer("OpenNow", 0.5); end end end function MailOpener:MO_OPEN_COMPLETE() self.busy = false; -- Try a recheck self:Recheck(); local current, total = GetInboxNumItems(); if (total - current) == 0 then -- There is probably no unopenable mail remaining, so play the sound (if enabled) if self.db.profile.notifications.mailboxEmptySound and (not MailOpener.db.profile.notifications.mailboxEmptySoundOnlyOnce or not mailboxEmptySoundPlayed) then PlaySoundFile(self.db.profile.notifications.mailboxEmptySoundFile); mailboxEmptySoundPlayed = true; end end if self.QuickAuctionsEnabled then -- Quick Auctions enabled? -- Toggle automailing as per settings if self.db.profile.general.autoReenableQAAutoMail and QuickAuctionsAutoMail and not QuickAuctionsAutoMail:GetChecked() then -- If auto re-enable "QA Auto mail" is enabled and QA's auto mail is currently toggled OFF, turn it on -- We need to do this with a :click to trigger the right events self:Debug("Turning automail |cff00ff00on|r."); QuickAuctionsAutoMail:Click(); elseif self.db.profile.general.autoSetBackQAAutoMail and QuickAuctionsAutoMail and lastQuickAuctionsStatus ~= QuickAuctionsAutoMail:GetChecked() then -- If auto set back "QA Auto mail" is enabled and QA's auto mail is currently not the same as it was before starting, toggle it -- We need to do this with a :click to trigger the right events if lastQuickAuctionsStatus then self:Debug("Turning automail |cff00ff00on|r."); else self:Debug("Turning automail |cffff0000off|r."); end QuickAuctionsAutoMail:Click(); end end if self.db.profile.general.continueOpening then self:ScheduleOpen(true); end end -- Run another CheckInbox function MailOpener:Recheck() self:Debug("|cffffff00Recheck|r"); -- Freshlist prevents this from being run too often -- It is set to true after a server sync -- and set to false 61 seconds afterwards with a recheck called instantly after it -- We're not refreshing while we're opening because it is automatically done when current batch was completely opened if not freshList and not self.busy and MailFrame:IsVisible() then self:Debug("|cff00ff00Recheck|r"); -- If this isn't a fresh list (so messages weren't received within the last 60 seconds) and the mailbox wasn't closed -- BeanCounter is the only addon hiding the mail close button while busy, so we can look for that local BeanCounterActive = not InboxCloseButton:IsVisible(); if not BeanCounterActive and AutoOpenMail then -- Query the server CheckInbox(); end -- Stop previous timer self:CancelTimer(self.tmrRecheck, true); -- Keep trying until it works self.tmrRecheck = self:ScheduleTimer("Recheck", 2); self:Debug("tmrRecheck 2"); end end -- Stop checking for new mail and unregister the events we needed function MailOpener:Stop() if self.db.profile.notifications.bye then print("|cff15ff00Mail Opener|r: Have a nice day. :)"); end self.busy = false; -- We won't need this anymore self:UnregisterEvent("MAIL_CLOSED"); self:UnregisterEvent("PLAYER_LEAVING_WORLD"); self:UnregisterEvent("MAIL_INBOX_UPDATE"); -- Messages self:UnregisterMessage("MO_OPEN_COMPLETE"); -- Timers self:CancelTimer(self.tmrTryAgain, true); self:CancelTimer(self.tmrOpenNow, true); -- If we wait with disabling QA automail until MAIL_SHOW, QA will beat us to it and already start sending stuff self:ToggleQAStatus(); end function MailOpener:Debug(t) if not self.debugChannel and self.debugChannel ~= false then -- We want to check just once, so if you add a debug channel later just do a /reload (registering an event for this is wasted resources) self.debugChannel = false; for i = 1, NUM_CHAT_WINDOWS do local name = GetChatWindowInfo(i); if name:upper() == "DEBUG" then self.debugChannel = _G["ChatFrame" .. i]; end end end if self.debugChannel then self.debugChannel:AddMessage(t); end end -- Enable our config module if it's disabled and make a reference to it function MailOpener:EnableConfigModule() if not MailOpenerConfig then MailOpenerConfig = self:GetModule("Config"); MailOpenerConfig:Enable(); end end -- Toggle Postal's opening modules on or off function MailOpener:TogglePostalModule(name, status) if MailOpener.PostalEnabled and Postal then -- Postal must be enabled -- Toggle module (let Postal handle this) Postal.ToggleModule(nil, name, Postal:GetModule(name), status); end end -- Change Quick Auction's auto mail status based on our prefered settings function MailOpener:ToggleQAStatus() self:Debug("defaultQAStatus:" .. self.db.profile.general.defaultQAStatus); if self.QuickAuctionsEnabled and self.db.profile.general.defaultQAStatus ~= "__remember" and QuickAuctionsAutoMail then if self.db.profile.general.defaultQAStatus == "_enabled" and not QuickAuctionsAutoMail:GetChecked() then self:Debug("Turning automail |cff00ff00on|r."); QuickAuctionsAutoMail:Click(); elseif self.db.profile.general.defaultQAStatus == "disabled" and QuickAuctionsAutoMail:GetChecked() then self:Debug("Turning automail |cffff0000off|r."); QuickAuctionsAutoMail:Click(); end end end function MailOpener:FormatMoney(copper) local gold = floor( copper / 10000 ); local silver = floor( ( copper - ( gold * 10000 ) ) / 100 ); local copper = mod(copper, 100); if gold > 0 then return format(GOLD_AMOUNT_TEXTURE .. " " .. SILVER_AMOUNT_TEXTURE .. " " .. COPPER_AMOUNT_TEXTURE, gold, 0, 0, silver, 0, 0, copper, 0, 0); elseif silver > 0 then return format(SILVER_AMOUNT_TEXTURE .. " " .. COPPER_AMOUNT_TEXTURE, silver, 0, 0, copper, 0, 0); else return format(COPPER_AMOUNT_TEXTURE, copper, 0, 0); end end StaticPopupDialogs["MailOpenerCopyWindow"] = { text = "Please CTRL-C to copy.", button2 = CLOSE, hasEditBox = 1, hasWideEditBox = 1, OnShow = function() local editBox = _G[this:GetName().."WideEditBox"]; if editBox and MailOpener.currentPopupContents then editBox:SetText(MailOpener.currentPopupContents); editBox:SetFocus(); editBox:HighlightText(0); end -- Position the close button in the middle local button = _G[this:GetName().."Button2"]; if button then -- Remove previous know position button:ClearAllPoints(); button:SetWidth(200); -- Reposition in the center button:SetPoint("CENTER", editBox, "CENTER", 0, -30); end end, EditBoxOnEscapePressed = function() this:GetParent():Hide(); end, timeout = 0, whileDead = 1, hideOnEscape = 1, maxLetters = 1024, }; -- The below either has to be removed or changed when releasing function MailOpener:ShowBetaPopup() function TableDump(key, val, jumps) local cache = ""; if not jumps then jumps = 0; end local spacer = ""; if jumps > 0 then for i = 1, jumps do spacer = spacer .. " "; end end if type(val) == "table" then cache = cache .. spacer .. key .. " = {\n"; foreach(val, function(k, v) cache = cache .. TableDump(k, v, (jumps + 1)); end); cache = cache .. spacer .. "},\n"; else cache = cache .. spacer .. key .. " = " .. tostring(val) .. ",\n"; end return cache; end local cache = ""; foreach(MailOpener.db.profile, function(k, v) cache = cache .. TableDump(k, v, 0); end); local AceGUI = LibStub("AceGUI-3.0"); local frame = AceGUI:Create("Frame"); frame:SetTitle("Mail Opener ALPHA"); frame:SetWidth(575); frame:SetHeight(375); -- Add a normal description label local desc = AceGUI:Create("Label"); desc:SetText("|cff00ff00After you have been using Mail Opener for a while and configured it just as you want it to be, please report your favorite settings by copying the text below at either of the below links. Thanks in advance!|r\n\n"); desc:SetFont(GameFontHighlightSmall:GetFont(), 13); desc:SetFullWidth(true); frame:AddChild(desc); -- Add a MultiLineEditBox local settingsMLEEB = AceGUI:Create("MultiLineEditBox"); settingsMLEEB:SetText(cache); settingsMLEEB:SetLabel("Hit CTRL-A to select all and CTRL-C to copy the text. You can then use CTRL-V to paste."); settingsMLEEB:SetFullWidth(true); settingsMLEEB:SetNumLines(8); settingsMLEEB:DisableButton(true); settingsMLEEB:SetCallback("OnTextChanged", function() settingsMLEEB:SetText(cache); end); frame:AddChild(settingsMLEEB); -- Empty line between the two links local label = AceGUI:Create("Label"); label:SetText("Please post the above text at either of these two links:"); label:SetFullWidth(true); frame:AddChild(label); local desc1 = AceGUI:Create("InteractiveLabel"); desc1:SetText("|cff00bbbb[http://wow.curseforge.com/addons/mailopener/create-ticket/]|r"); desc1:SetFont(GameFontHighlightSmall:GetFont(), 13); desc1:SetFullWidth(true); desc1:SetCallback("OnClick", function() MailOpener.currentPopupContents = "http://wow.curseforge.com/addons/mailopener/create-ticket/"; StaticPopup_Show("MailOpenerCopyWindow"); end); desc1:SetCallback("OnEnter", function() frame:SetStatusText("Click to copy this URL."); end); desc1:SetCallback("OnLeave", function() frame:SetStatusText(""); end); frame:AddChild(desc1); -- Empty line between the two links local spacer = AceGUI:Create("Label"); spacer:SetText(" "); frame:AddChild(spacer); local desc2 = AceGUI:Create("InteractiveLabel"); desc2:SetText("|cff00bbbb[http://20kleveling.com/JMTCforum/posting.php?mode=reply&f=9&t=1403]|r"); desc2:SetFont(GameFontHighlightSmall:GetFont(), 13); desc2:SetFullWidth(true); desc2:SetCallback("OnClick", function() MailOpener.currentPopupContents = "http://20kleveling.com/JMTCforum/posting.php?mode=reply&f=9&t=1403"; StaticPopup_Show("MailOpenerCopyWindow"); end); desc2:SetCallback("OnEnter", function() frame:SetStatusText("Click to copy this URL."); end); desc2:SetCallback("OnLeave", function() frame:SetStatusText(""); end); frame:AddChild(desc2); -- Empty line between the two links local label = AceGUI:Create("Label"); label:SetText("\n\nps. You can always view this window again at a later time by clicking the \"Config\" button in the mail frame.\nps2. The information above is completely Mail Opener related. It will be used to determine the best default settings."); label:SetFullWidth(true); frame:AddChild(label); end
