You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

317 lines
11 KiB

--import
local WIM = WIM;
local _G = _G;
local CreateFrame = CreateFrame;
local table = table;
local string = string;
--set namespace
setfenv(1, WIM);
local Menu = CreateModule("Menu", true);
local groupCount = 0;
local buttonCount = 0;
local lists = {
whisper = {},
chat = {}
}
local maxButtons = {
whisper = 20,
chat = 10
};
db_defaults.menuSortActivity = true;
local function sortWindows(a, b)
if(db and db.menuSortActivity) then
return a.lastActivity > b.lastActivity;
else
return string.lower(a.theUser) < string.lower(b.theUser);
end
end
function isMouseOver()
-- can optionaly exclude an object
local x,y = _G.GetCursorPosition();
local menu = WIM.Menu;
if(not menu) then
return false;
else
local x1, y1 = menu:GetLeft()*menu:GetEffectiveScale(), menu:GetTop()*menu:GetEffectiveScale();
local x2, y2 = x1 + menu:GetWidth()*menu:GetEffectiveScale(), y1 - menu:GetHeight()*menu:GetEffectiveScale();
if(x >= x1 and x <= x2 and y <= y1 and y >= y2) then
return true;
end
return false;
end
end
local function createCloseButton(parent)
local button = CreateFrame("Button", nil, parent);
button:SetNormalTexture("Interface\\AddOns\\"..addonTocName.."\\Modules\\Textures\\xNormal");
button:SetPushedTexture("Interface\\AddOns\\"..addonTocName.."\\Modules\\Textures\\xPressed");
button:SetWidth(16);
button:SetHeight(16);
button:SetScript("OnClick", function(self)
self:GetParent().win.widgets.close.forceShift = true;
self:GetParent().win.widgets.close:Click();
end);
return button;
end
local function createStatusIcon(parent)
local icon = parent:CreateTexture(nil, "OVERLAY");
icon:SetWidth(14); icon:SetHeight(14);
icon:SetAlpha(.85);
icon:SetTexture("Interface\\AddOns\\"..addonTocName.."\\Sources\\Options\\Textures\\blipClear");
return icon;
end
local function createButton(parent)
buttonCount = buttonCount + 1;
local button = CreateFrame("Button", "WIM3MenuButton"..buttonCount, parent, "UIPanelButtonTemplate");
local bgtex = "Interface\\AddOns\\"..addonTocName.."\\Modules\\Textures\\Menu_bg"
button:SetNormalTexture(bgtex); button:SetPushedTexture(bgtex); button:SetDisabledTexture(bgtex); button:SetHighlightTexture(bgtex);
button:SetHighlightTexture("Interface\\QuestFrame\\UI-QuestLogTitleHighlight", "ADD");
button:GetHighlightTexture():SetVertexColor(.196, .388, .8);
button:SetHeight(20);
button:GetHighlightTexture():SetAllPoints();
button.text = _G[button:GetName().."Text"];
button.text:ClearAllPoints();
button.text:SetPoint("LEFT"); button.text:SetPoint("RIGHT");
button:GetHighlightTexture():ClearAllPoints();
button:GetHighlightTexture():SetAllPoints();
button.status = createStatusIcon(button);
button.status:SetPoint("LEFT", button, "RIGHT", 0, -1);
button.close = createCloseButton(button);
button.close:SetPoint("LEFT", button.status, "RIGHT", 2, 0);
button:SetScript("OnClick", function(self, b)
local forceShow = true
if db.pop_rules[self.win.type].obeyAutoFocusRules then
forceShow = self.win:GetRuleSet().autofocus
end
self.win:Pop(true, forceShow);
WIM.Menu:Hide();
end);
button:SetScript("OnUpdate", function(self, elapsed)
if(self.win) then
if(self.win.online ~= nil and not self.win.online and self.win.type == "whisper") then
self.text:SetTextColor(.5, .5, .5);
self.status:SetTexture("Interface\\AddOns\\"..addonTocName.."\\Sources\\Options\\Textures\\blipRed");
self.canFade = true;
elseif(self.win.unreadCount and self.win.unreadCount > 0) then
self.text:SetTextColor(1, 1, 1);
self.status:SetTexture("Interface\\AddOns\\"..addonTocName.."\\Sources\\Options\\Textures\\blipBlue");
self.canFade = false;
else
self.text:SetTextColor(1, 1, 1);
self.status:SetTexture("Interface\\AddOns\\"..addonTocName.."\\Sources\\Options\\Textures\\blipClear");
self.canFade = true;
end
-- set opacity of button text.
if(self.win and not self.win:IsShown() and self.canFade) then
self.text:SetAlpha(.65);
self.status:SetAlpha(.65);
else
self.text:SetAlpha(1);
self.status:SetAlpha(1);
end
end
end);
button.GetMinimumWidth = function(self)
return self.text:GetStringWidth()+40;
end
return button;
end
local function createGroup(title, list, maxButtons, showNone)
groupCount = groupCount + 1;
-- Changes for Patch 9.0.1 - Shadowlands, retail and classic
4 years ago
local group = CreateFrame("Frame", "WIM3MenuGroup"..groupCount, _G.WIM3Menu, "BackdropTemplate");
-- set backdrop - changes for Patch 9.0.1 - Shadowlands, retail and classic
group.backdropInfo = {bgFile = "Interface\\AddOns\\"..addonTocName.."\\Modules\\Textures\\Menu_bg",
edgeFile = "Interface\\AddOns\\"..addonTocName.."\\Modules\\Textures\\Menu",
tile = true, tileSize = 32, edgeSize = 32,
insets = { left = 32, right = 32, top = 32, bottom = 32 }};
4 years ago
group:ApplyBackdrop();
group.list = list;
group.title = CreateFrame("Frame", group:GetName().."Title", group);
group.title:SetHeight(17);
group.title:SetPoint("TOPLEFT", 20, -18); group.title:SetPoint("TOPRIGHT", -20, -18);
group.title.bg = group.title:CreateTexture(nil, "BACKGROUND");
group.title.bg:SetAllPoints();
group.title.text = group.title:CreateFontString(nil, "OVERLAY", "ChatFontNormal");
local font = group.title.text:GetFont();
group.title.text:SetFont(font, 11, "");
group.title.text:SetAllPoints();
group.title.text:SetText(title.." ");
group.title.text:SetJustifyV("TOP");
group.title.text:SetJustifyH("RIGHT");
group.buttons = {};
local lastButton = group.title;
local offSet = -32;
for i=1, maxButtons do
local button = createButton(group);
button:SetPoint("TOPLEFT", lastButton, "BOTTOMLEFT");
button:SetPoint("TOPRIGHT", lastButton, "BOTTOMRIGHT", offSet, 0);
offSet= 0;
button.shown = false;
lastButton = button;
table.insert(group.buttons, button);
end
group.showNone = showNone;
group.GetButtonCount = function(self)
local count = 0;
for i=1, #self.buttons do
count = self.buttons[i].shown and count+1 or count;
end
return count;
end
group.UpdateHeight = function(self)
if(#self.list == 0 and not self.showNone) then
group:SetHeight(0);
else
group:SetHeight(_G.math.max(group.title:GetHeight() + group.buttons[1]:GetHeight()*self:GetButtonCount() + 18*2, 64));
end
end
group.width = 0;
group.Refresh = function(self)
local maxWidth = 150-18*2;
table.sort(self.list, sortWindows);
for i=1, #self.buttons do
local button = self.buttons[i];
if(i > #self.list) then
button.win = nil;
button:Hide();
button.shown = false;
else
button.win = self.list[i];
button.close:Show();
button.status:Show();
button.text:SetText(button.win.theUser);
button:Show();
button:Enable();
button.text:SetJustifyH("LEFT");
button.shown = true;
maxWidth = _G.math.max(maxWidth, button:GetMinimumWidth());
self:Show();
end
end
self.title:Show();
if(#self.list == 0) then
if(self.showNone) then
self.buttons[1].win = nil;
self.buttons[1].close:Hide();
self.buttons[1].status:Hide();
self.buttons[1]:Show();
self.buttons[1].shown = true;
self.buttons[1]:Disable();
self.buttons[1].text:SetJustifyH("LEFT");
self.buttons[1].text:SetText(L["None"]);
self.buttons[1].text:SetTextColor(.5, .5, .5);
else
self.title:Hide();
self:Hide();
end
end
self.width = maxWidth+18*2;
self:UpdateHeight();
end
return group;
end
local function createMenu()
local menu = CreateFrame("Frame", "WIM3Menu", _G.UIParent);
menu:Hide(); -- testing only.
menu:SetClampedToScreen(true);
menu:SetFrameStrata("DIALOG");
menu:SetToplevel(true);
menu:SetWidth(180);
menu:SetHeight(200);
menu.groups = {};
--create whisper group
menu.groups[1] = createGroup(L["Whispers"], lists.whisper, maxButtons.whisper, true);
menu.groups[1]:SetPoint("TOPLEFT");
menu.groups[1]:SetPoint("TOPRIGHT");
--create chat group
menu.groups[2] = createGroup(L["Chat"], lists.chat, maxButtons.chat, false);
menu.groups[2]:SetPoint("TOPLEFT", menu.groups[1], "BOTTOMLEFT", 0, 25);
menu.groups[2]:SetPoint("TOPRIGHT", menu.groups[1], "BOTTOMRIGHT", 0, 25);
menu.Refresh = function(self)
local groupHeight = 0;
local groupWidth = 0;
for i=1, #self.groups do
self.groups[i]:Refresh();
groupHeight = groupHeight + self.groups[i]:GetHeight();
groupWidth = _G.math.max(groupWidth, self.groups[i].width);
end
self:SetHeight(groupHeight);
self:SetWidth(groupWidth);
end
menu:SetScript("OnUpdate", function(self)
if(isMouseOver()) then
self.mouseStamp = _G.time();
else
if((_G.time() - self.mouseStamp) > 1) then
self:Hide();
end
end
end);
menu:SetScript("OnShow", function(self)
self.mouseStamp = _G.time();
libs.DropDownMenu.CloseDropDownMenus();
end);
return menu;
end
function Menu:OnWindowCreated(obj)
-- add obj to specified list & Update
if(obj.type == "whisper" or obj.type == "chat") then
addToTableUnique(lists[obj.type], obj);
WIM.Menu:Refresh();
end
end
function Menu:OnWindowDestroyed(obj)
-- remove obj to specified list & Update
obj.widgets.close.forceShift = nil;
if(obj.type == "whisper" or obj.type == "chat") then
removeFromTable(lists[obj.type], obj);
WIM.Menu:Refresh();
end
end
function Menu:OnWindowPopped(obj)
-- check status of obj to specified list & Update
if(obj.type == "whisper" or obj.type == "chat") then
WIM.Menu:Refresh();
end
end
-- for convention, we will load the module as normal.
function Menu:OnEnable()
if(not WIM.Menu) then
WIM.Menu = createMenu();
WIM.Menu:Refresh();
end
end
-- This is a core module and must always be loaded...
Menu.canDisable = false;
Menu:Enable();