--imports local WIM = WIM; local _G = _G; local table = table; local pairs = pairs; local CreateFrame = CreateFrame; local string = string; local select = select; local tonumber = tonumber --set namespace setfenv(1, WIM); local buttons = {}; -- create WIM Module local ShortcutBar = CreateModule("ShortcutBar", true); local buttonCount = 1; local function createButton(parent) local button = CreateFrame("Button", "WIM_ShortcutBarButton"..buttonCount, parent); button.icon = button:CreateTexture(nil, "BACKGROUND"); button.icon:SetAllPoints(); button:RegisterForClicks("LeftButtonUp", "RightButtonUp"); button.Enable = function(self) self:Show(); self.isEnabled = true; parent:UpdateButtons(); end button.Disable = function(self) self:Hide(); self.isEnabled = false; parent:UpdateButtons(); end button:SetScript("OnEnter", function(self) if(buttons[self.index].scripts and buttons[self.index].scripts.OnEnter) then buttons[self.index].scripts.OnEnter(self); else if(db.showToolTips) then _G.GameTooltip:SetOwner(self, "ANCHOR_RIGHT"); _G.GameTooltip:SetText(buttons[self.index].title); end end end); button:SetScript("OnLeave", function(self) _G.GameTooltip:Hide(); if(buttons[self.index].scripts and buttons[self.index].scripts.OnLeave) then buttons[self.index].scripts.OnLeave(self, button); end end); button:SetScript("OnClick", function(self, button) if(buttons[self.index].scripts and buttons[self.index].scripts.OnClick) then buttons[self.index].scripts.OnClick(self, button); end end); button.SetDefaults = function(self) if(buttons[self.index].scripts and buttons[self.index].scripts.SetDefaults) then buttons[self.index].scripts.SetDefaults(self); end end button:Enable(); buttonCount = buttonCount + 1; return button; end local function createShortCutBar() local frame = CreateFrame("Frame"); --widget info frame.type = "whisper"; -- will only show on whisper windows. -- test texture so you can see the frame to be placed. --frame.test = frame:CreateTexture(nil, "BACKGROUND"); --frame.test:SetColorTexture(1,1,1,.5); --frame.test:SetAllPoints(); frame.visibleCount = 0; frame.buttons = {}; frame.UpdateSkin = function(self) -- make sure all the button objects needed are available. local buttonsToCreate = #buttons - #frame.buttons; for i=1, buttonsToCreate do table.insert(frame.buttons, createButton(self)); end local skin = GetSelectedSkin().message_window.widgets.shortcuts; -- set points for all buttons. local stack = string.upper(skin.stack); local spacing = skin.spacing; if(stack == "UP") then for i=#buttons, 1, -1 do self.buttons[i]:ClearAllPoints(); if(i==#buttons) then self.buttons[i]:SetPoint("BOTTOMLEFT", self, "BOTTOMLEFT", 0, 0); self.buttons[i]:SetPoint("BOTTOMRIGHT", self, "BOTTOMRIGHT", 0, 0); else self.buttons[i]:SetPoint("BOTTOMLEFT", self.buttons[i+1], "TOPLEFT", 0, spacing); self.buttons[i]:SetPoint("BOTTOMRIGHT", self.buttons[i+1], "TOPRIGHT", 0, spacing); end end end if(stack == "DOWN") then for i=1, #buttons do self.buttons[i]:ClearAllPoints(); if(i==1) then self.buttons[i]:SetPoint("TOPLEFT", self, "TOPLEFT", 0, 0); self.buttons[i]:SetPoint("TOPRIGHT", self, "TOPRIGHT", 0, 0); else self.buttons[i]:SetPoint("TOPLEFT", self.buttons[i-1], "BOTTOMLEFT", 0, -spacing); self.buttons[i]:SetPoint("TOPRIGHT", self.buttons[i-1], "BOTTOMRIGHT", 0, -spacing); end end end if(stack == "RIGHT") then for i=1, #buttons do self.buttons[i]:ClearAllPoints(); if(i==1) then self.buttons[i]:SetPoint("TOPLEFT", self, "TOPLEFT", 0, 0); self.buttons[i]:SetPoint("BOTTOMLEFT", self, "BOTTOMRIGHT", 0, 0); else self.buttons[i]:SetPoint("TOPLEFT", self.buttons[i-1], "TOPRIGHT", spacing, 0); self.buttons[i]:SetPoint("BOTTOMLEFT", self.buttons[i-1], "BOTTOMRIGHT", spacing, 0); end end end if(stack == "LEFT") then for i=#buttons, 1, -1 do self.buttons[i]:ClearAllPoints(); if(i==#buttons) then self.buttons[i]:SetPoint("TOPRIGHT", self, "TOPRIGHT", 0, 0); self.buttons[i]:SetPoint("BOTTOMRIGHT", self, "BOTTOMRIGHT", 0, 0); else self.buttons[i]:SetPoint("TOPRIGHT", self.buttons[i+1], "TOPLEFT", -spacing, 0); self.buttons[i]:SetPoint("BOTTOMRIGHT", self.buttons[i+1], "BOTTOMLEFT", -spacing, 0); end end end for i=1,#buttons do self.buttons[i].index = i; self.buttons[i]:SetNormalTexture(skin.buttons.NormalTexture); self.buttons[i]:SetPushedTexture(skin.buttons.PushedTexture); self.buttons[i]:SetHighlightTexture(skin.buttons.HighlightTexture, skin.buttons.HighlightAlphaMode); self.buttons[i].icon:SetTexture(skin.buttons.icons[buttons[i].id] or "Interface\\Icons\\INV_Misc_QuestionMark"); end self:UpdateButtons(); end frame.UpdateButtons = function(self) local skin = GetSelectedSkin().message_window.widgets.shortcuts; local stack = string.upper(skin.stack) == "UP" or string.upper(skin.stack) == "DOWN"; self.visibleCount = 0; for i=1, #self.buttons do if(stack) then if(self.buttons[i].isEnabled) then self.visibleCount = self.visibleCount + 1; self.buttons[i]:SetHeight(self:GetWidth()); else self.buttons[i]:SetHeight(.001 - skin.spacing); end else if(self.buttons[i].isEnabled) then self.visibleCount = self.visibleCount + 1; self.buttons[i]:SetWidth(self:GetHeight()); else self.buttons[i]:SetWidth(.001 - skin.spacing); end end end -- must update window props to account for size restrictions if(self.parentWindow and self.parentWindow.initialized) then self.parentWindow:UpdateProps(); end end frame.SetDefaults = function(self) for i=1, #self.buttons do self.buttons[i]:SetDefaults(); end end frame.GetButtonCount = function(self) return self.visibleCount; end frame._GetWidth = frame.GetWidth; frame.GetWidth = function(self) local skin = GetSelectedSkin().message_window.widgets.shortcuts; if(string.upper(skin.stack) == "UP" or string.upper(skin.stack) == "DOWN") then return self:_GetWidth(); else return self:GetButtonCount()*self:GetHeight() + _G.math.max(self:GetButtonCount()-1, 0)*skin.spacing; end end frame._GetHeight = frame.GetHeight; frame.GetHeight = function(self) local skin = GetSelectedSkin().message_window.widgets.shortcuts; if(string.upper(skin.stack) == "UP" or string.upper(skin.stack) == "DOWN") then return self:GetButtonCount()*self:GetWidth() + _G.math.max(self:GetButtonCount()-1, 0)*skin.spacing; else return self:_GetHeight(); end end frame:UpdateSkin(); return frame; end function ShortcutBar:OnEnable() RegisterWidget("shortcuts", createShortCutBar); for widget in Widgets("shortcuts") do widget:Enable(); end end function ShortcutBar:OnDisable() if(db.modules.ShortcutBar.enabled) then return; end -- WIM.Widgets(widgetName) is an iterator of all loaded widgets. -- Since this widget can be disabled, we will hide the widgets already loaded. for widget in Widgets("shortcuts") do widget:Disable(); end end local BNinviteTypes = { ["BN_INVITE"] = true, ["BN_SUGGEST_INVITE"] = true, ["BN_REQUEST_INVITE"] = true, } local function canInviteBN(id) if not tonumber(id) then return end local show = true local bnetIDAccount, accountName, battleTag, isBattleTag, characterName, bnetIDGameAccount = GetBNGetFriendInfoByID(id); if not bnetIDGameAccount then show = false; else local guid = select(20, GetBNGetGameAccountInfo(bnetIDGameAccount)); local inviteType = _G.GetDisplayedInviteType(guid); if not BNinviteTypes["BN_"..inviteType] then show = false; elseif not _G.CanGroupWithAccount(id) then show = false elseif ( not _G.BNFeaturesEnabledAndConnected() ) then show = false; elseif ( _G.UnitInParty(characterName) or _G.UnitInRaid(characterName) ) then show = false; end end return show end function ShortcutBar:OnWindowShow(obj) if (obj.widgets.shortcuts) then for i=1, #buttons do if (buttons[i].id == "invite") then if (obj.isBN and not canInviteBN(obj.bn.id)) then --if(obj.isBN and obj.bn.realmName ~= env.realm) then obj.widgets.shortcuts.buttons[i]:Disable(); else obj.widgets.shortcuts.buttons[i]:Enable(); end elseif buttons[i].id == "ignore" then if obj.isBN then obj.widgets.shortcuts.buttons[i]:Disable(); else obj.widgets.shortcuts.buttons[i]:Enable(); end end end obj.widgets.shortcuts:UpdateButtons(); end end function ShortcutBar:FRIENDLIST_UPDATE() local friend = nil; for i=1, #buttons do if(buttons[i].id == "friend") then friend = i; end end for widget in Widgets("shortcuts") do if(lists.friends[widget.parentWindow.theUser] or _G.UnitName("player") == widget.parentWindow.theUser) then if(friend) then widget.buttons[friend]:Disable(); end else if(friend) then widget.buttons[friend]:Enable(); end end end end -- WIM Global API for Shortcut buttons. function RegisterShortcut(id, title, scripts) table.insert(buttons, { id = id, title = title, scripts = scripts }); end -- Register default buttons. RegisterShortcut("location", L["Player Location"], { OnClick = function(self, button) libs.DropDownMenu.CloseDropDownMenus(); if(button == "LeftButton") then local currentSelf = self; self.parentWindow:SendWho(function() buttons[currentSelf.index].scripts.OnEnter(currentSelf); end, true) else WIM.MENU_ARMORY_USER = self.parentWindow.theUser; WIM.MENU_ARMORY_REALM = env.realm; if(self.parentWindow.isBN) then WIM.MENU_ARMORY_USER = self.parentWindow.bn.toonName; WIM.MENU_ARMORY_REALM = self.parentWindow.bn.realmName; end PopContextMenu("MENU_ARMORY", self:GetName()); end end, OnEnter = function(self) local location = self.parentWindow.location ~= "" and self.parentWindow.location or L["Unknown"]; local guild = self.parentWindow.guild ~= "" and self.parentWindow.guild or L["Unknown"]; local tbl = self.parentWindow.w2w; if(not tbl or not tbl.services) then _G.GameTooltip:SetOwner(self, "ANCHOR_RIGHT"); _G.GameTooltip:AddLine("|cff"..self.parentWindow.classColor..self.parentWindow.theUser.."|r"); if(self.parentWindow.isBN) then local bn = self.parentWindow.bn; if bn.toonName and bn.toonName ~= "" then _G.GameTooltip:AddDoubleLine(L["Character"]..":", "|cffffffff"..bn.toonName.."|r"); end if bn.client and bn.client ~= "" then _G.GameTooltip:AddDoubleLine(L["Game"]..":", "|cffffffff"..bn.client.."|r"); end if bn.realmName and bn.realmName ~= "" then _G.GameTooltip:AddDoubleLine(L["Realm"]..":", "|cffffffff"..bn.realmName.."|r"); end end _G.GameTooltip:AddDoubleLine(L["Location"]..":", "|cffffffff"..location.."|r"); _G.GameTooltip:AddLine("|cff69ccf0"..L["Click to update..."].."|r"); _G.GameTooltip:AddLine("|cff69ccf0"..L["Right-Click for profile links..."].."|r"); _G.GameTooltip:Show(txt); else --w2w tooltip ShowW2WTip(self.parentWindow, self, "ANCHOR_RIGHT"); end end }); RegisterShortcut("invite", L["Invite to Party"], { OnClick = function(self) local win = self.parentWindow; if win.isBN then if _G.C_BattleNet then --Tested working on Retail local accountInfo = _G.C_BattleNet.GetAccountInfoByID(win.bn.id) local gameAccountID = accountInfo.gameAccountInfo.gameAccountID if gameAccountID then _G.BNInviteFriend(gameAccountID) end else --No idea if this actually works on classic, or if BNInviteFriend shouldb e used instead with gameID _G.FriendsFrame_BattlenetInvite(nil, win.bn.id) end else if isModernApi then _G.C_PartyInfo.InviteUnit(win.theUser) else _G.InviteUnit(win.theUser) end end end }); RegisterShortcut("friend", L["Add Friend"], { OnClick = function(self) _G.C_FriendList.AddFriend(self.parentWindow.theUser); end, SetDefaults = function(self) ShortcutBar:FRIENDLIST_UPDATE(); end }); RegisterShortcut("ignore", L["Ignore User"], { OnClick = function(self) local win = self.parentWindow; _G.StaticPopupDialogs["WIM_IGNORE"] = { preferredIndex = STATICPOPUP_NUMDIALOGS, text = _G.format(L["Are you sure you want to\nignore %s?"], "|cff69ccf0"..(win.isBN and win.toonName or win.theUser).."|r"), button1 = L["Yes"], button2 = L["No"], OnAccept = function() _G.C_FriendList.AddIgnore(win.isBN and win.toonName or win.theUser); end, timeout = 0, whileDead = 1, hideOnEscape = 1 }; _G.StaticPopup_Show("WIM_IGNORE"); end });