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.

922 lines
47 KiB

--imports
local WIM = WIM;
local _G = _G;
local table = table;
local CreateFrame = CreateFrame;
local unpack = unpack;
local UnitName = UnitName;
local pairs = pairs;
--set namespace
setfenv(1, WIM);
db_defaults.stats = {
whispers = 0,
mostConvos = 0,
versions = 1,
startDate = "",
}
local credits = {
"Pazza <Bronzebeard-US>\n\n",
"MysicalOS\nHumfras\nSylvaanar\n\nStewarta <Emerald Dream - EU>\n\nAstaldo <Bronzebeard - EU>\nZeke <Coilfang - US>\nMorphieus <Spinebreaker>\nNachonut <Bronzebeard - US>\n\nChiaki <Frostwolf - EU> - deDE\n"..
"BlueNyx <bluenyx@gmail.com> - koKR\nStingerSoft <stingersoft@iti.lt> - ruRU\nJunxian <junxian1121@hotmail.com> - zhCN & zhTW\nWoopy <Loatheb - NA> - esES & esMX\n\n\nAstrosloth and Zezerat are noobs! ;-p"
};
local states = {"arena", "combat", "pvp", "raid", "party", "resting", "other"};
local filterListCount = 9;
local function General_Main()
local frame = options.CreateOptionsFrame()
frame.welcome = frame:CreateSection(L["Welcome!"], L["_Description"]);
frame.welcome.nextOffSetY = -10;
frame.welcome.cb1 = frame.welcome:CreateCheckButton(L["Enable WIM"], WIM.db, "enabled", nil, function(self, button) SetEnabled(self:GetChecked()); end);
frame.welcome.nextOffSetY = -30;
frame.welcome.cb2 = frame.welcome:CreateCheckButton(L["Display Minimap Icon"], WIM.modules.MinimapIcon, "enabled", nil, function(self, button) EnableModule("MinimapIcon", self:GetChecked()); end);
frame.welcome.cb2:CreateCheckButton(L["Unlock from Minimap"], db.minimap, "free", nil, function(self, button) modules.MinimapIcon:OnEnable() end);
frame.welcome.cb2:CreateCheckButton(L["<Right-Click> to show unread messages."], db.minimap, "rightClickNew");
frame.welcome.nextOffSetY = -75;
frame.welcome.tabFun = frame.welcome:CreateCheckButton(L["Press <Tab> to advance to next tell target."], WIM.db, "tabAdvance");
local sensitivity = {};
table.insert(sensitivity, {
text = L["Sensitivity"],
isTitle = true,
justifyH = "LEFT",
});
for i=1,10 do
table.insert(sensitivity, {
text = i,
value = i*.05,
justifyH = "LEFT",
});
end
frame.welcome.sensitivity = frame.welcome:CreateCheckButtonMenu(L["Enable WorldFrame Click Detection."], WIM.modules.ClickControl, "enabled", nil, function(self, button) EnableModule("ClickControl", self:GetChecked()); end, sensitivity, db.ClickControl, "clickSensitivity");
frame.welcome:CreateCheckButton(L["Force sounds when game sound is disabled."], db.sounds, "force_game_sound");
frame.welcome.nextOffSetY = -25;
-- frame.welcome.cb3 = frame.welcome:CreateCheckButton(L["Display Tutorials"], WIM.modules.Tutorials, "enabled", nil, function(self, button) EnableModule("Tutorials", self:GetChecked()); end);
-- frame.welcome.reset = frame.welcome:CreateButton(L["Reset Tutorials"], function() db.shownTutorials = {}; end);
-- frame.welcome.reset:ClearAllPoints();
-- frame.welcome.reset:SetPoint("LEFT", frame.welcome.cb3, "RIGHT", frame.welcome.cb2.text:GetStringWidth()+30, 0);
-- frame.welcome.lastObj = frame.welcome.cb3;
return frame;
end
local function General_MessageFormatting()
local Preview = {
{"CHAT_MSG_WHISPER_INFORM", L["This is a long message which contains both emoticons and urls 8). WIM's home is www.WIMAddon.com."], UnitName("player")},
};
local frame = options.CreateOptionsFrame();
local f = frame:CreateSection(L["Message Formatting"], L["Manipulate how WIM displays messages."]);
f.nextOffSetY = -15;
local itemList = {};
local formats = GetMessageFormattingList();
f.default = {};
f.updateOptions = function()
for _, obj in pairs(f.default) do
if(db.messageFormat == L["Default"]) then
obj:Enable();
else
obj:Disable();
end
end
end
for i=1, #formats do
table.insert(itemList, {
text = formats[i],
value = formats[i],
justifyH = "LEFT",
func = function(self)
f.prev:Hide();
f.prev:Show();
f.updateOptions();
end,
});
end
db.messageFormat = isInTable(formats, db.messageFormat) and db.messageFormat or formats[1];
f.mf = f:CreateDropDownMenu(db, "messageFormat", itemList);
f.prevTitle = f:CreateText(nil, 12);
f.prevTitle:SetFullSize();
f.prevTitle:SetText(L["Preview"]);
f.prevTitle:SetJustifyH("LEFT");
f.nextOffSetY = -10
f.prevFrame = f:CreateSection();
options.AddFramedBackdrop(f.prevFrame);
f.prev = CreateFrame("ScrollingMessageFrame", f:GetName().."PrevScrollingMessageFrame");
f.prev:SetScript("OnShow", function(self)
local color = db.displayColors.wispIn;
local font, height, flags;
if(_G[db.skin.font]) then
font, height, flags = _G[db.skin.font]:GetFont();
else
font = libs.SML.MediaTable.font[db.skin.font] or _G["ChatFontNormal"]:GetFont();
end
self:SetFont(font, 14, db.skin.font_outline);
self:Clear();
for i=1, #Preview do
self:AddMessage(applyStringModifiers(applyMessageFormatting(self, unpack(Preview[i])), self), color.r, color.g, color.b);
end
self:SetIndentedWordWrap(db.wordwrap_indent);
end);
f.prev:SetFading(false);
f.prev:SetMaxLines(5);
f.prev:SetJustifyH("LEFT");
f.prevFrame:SetHeight(60);
f.prevFrame:SetScript("OnShow", nil); -- we don't want this to trigger
f.prevFrame:ImportCustomObject(f.prev):SetFullSize();
f.prev:ClearAllPoints();
f.prev:SetPoint("TOPLEFT", 5, -5); f.prev:SetPoint("BOTTOMRIGHT", -5, 5);
f.nextOffSetY = -10
formats = GetTimeStampFormats();
tsList = {};
for i=1, #formats do
table.insert(tsList, {
text = _G.date(formats[i]),
value = formats[i],
justifyH = "LEFT",
func = function() f.prev:Hide(); f.prev:Show(); end,
});
end
-- format non-related options.
f:CreateCheckButtonMenu(L["Display Time Stamps"], modules.TimeStamps, "enabled", nil, function(self, button) EnableModule("TimeStamps", self:GetChecked()); f.prev:Hide(); f.prev:Show(); end, tsList, db, "timeStampFormat", function(self, button) f.prev:Hide(); f.prev:Show(); end);
f:CreateCheckButton(L["Display Emoticons"], modules.Emoticons, "enabled", nil, function(self, button) EnableModule("Emoticons", self:GetChecked()); f.prev:Hide(); f.prev:Show(); end);
f:CreateCheckButton(L["Display URLs as Links"], modules.URLHandler, "enabled", nil, function(self, button) EnableModule("URLHandler", self:GetChecked()); f.prev:Hide(); f.prev:Show(); end);
f:CreateCheckButton(L["Indent long messages."], db, "wordwrap_indent", nil, function(self, button) UpdateAllWindowProps(); f.prev:Hide(); f.prev:Show(); end);
-- options specific to WIM's formatting.
f.default.color = f:CreateCheckButton(L["Colorize names."], db, "coloredNames", nil, function(self, button) UpdateAllWindowProps(); f.prev:Hide(); f.prev:Show(); end);
fList = {};
for i=1, #lists.bracketing do
table.insert(fList, {
text = lists.bracketing[i][1].." "..lists.bracketing[i][2],
value = i,
justifyH = "LEFT",
func = function() f.prev:Hide(); f.prev:Show(); end,
});
end
f.default.bracket = f:CreateCheckButtonMenu(L["Bracket names."], db.formatting.bracketing, "enabled", nil, function(self, button) f.prev:Hide(); f.prev:Show(); end, fList, db.formatting.bracketing, "type");
return frame;
end
local function createPopRuleFrame(winType)
local frame = options.CreateOptionsFrame();
frame.type = winType;
frame.main = frame:CreateSection((winType == "chat" and _G.CHAT..": " or "")..L["Window Behavior"], L["You can control how windows behave while you are in different situations."]);
-- frame.main.nextOffSetY = -20;
frame.main.intercept = frame.main:CreateCheckButton(L["Intercept Slash Commands"], db.pop_rules[frame.type], "intercept");
frame.main.obeyAutoFocusRules = frame.main:CreateCheckButton(L["Obey autofocus rules when opening frames via the menu. (autofocus if unchecked)"], db.pop_rules[frame.type], "obeyAutoFocusRules");
-- frame.main.nextOffSetY = -20;
frame.main.alwaysOther = frame.main:CreateCheckButton(L["Use the same rules for all states."], db.pop_rules[frame.type], "alwaysOther", nil, function(self)
if(self:GetChecked()) then
frame.main.selectedState = "other";
frame.main.tabs.buttons[#frame.main.tabs.buttons]:Click();
end
frame:Hide();
frame:Show();
end);
frame.main.nextOffSetY = -60;
frame.main.selectedState = "other";
frame.main.options = frame.main:CreateSection();
-- options.AddFramedBackdrop(frame.main.options);
frame.main.options.getDBTree = function() return db.pop_rules[frame.type][frame.main.selectedState]; end;
frame.main.options:CreateCheckButton(L["Pop-Up window when message is sent."], frame.main.options.getDBTree, "onSend");
frame.main.options:CreateCheckButton(L["Pop-Up window when message is received."], frame.main.options.getDBTree, "onReceive");
frame.main.options:CreateCheckButton(L["Auto focus a window when it is shown."], frame.main.options.getDBTree, "autofocus");
frame.main.options:CreateCheckButton(L["Keep focus on window after sending a message."], frame.main.options.getDBTree, "keepfocus");
frame.main.options:CreateCheckButton(L["Suppress messages from the default chat frame."], frame.main.options.getDBTree, "supress");
frame.main.tabs = CreateFrame("Frame", nil, frame.main);
frame.main.tabs:SetPoint("BOTTOMLEFT", frame.main.options, "TOPLEFT", 0, 1);
frame.main.tabs:SetPoint("BOTTOMRIGHT", frame.main.options, "TOPRIGHT", 1 , 1);
frame.main.tabs:SetHeight(20);
frame.main.tabs.title = frame.main.tabs:CreateFontString(nil, "OVERLAY", "GameFontNormal");
frame.main.tabs.title:SetPoint("BOTTOMLEFT", frame.main.tabs, "TOPLEFT", 0, 10);
frame.main.tabs.title:SetText(L["Behaviors for state:"]);
frame.main.tabs.buttons = {};
local function createButton(tg)
local state = states[#tg.buttons+1];
local button = CreateFrame("Button", nil, tg);
button.text = button:CreateFontString(nil, "OVERLAY", "ChatFontNormal");
button.text:SetAllPoints();
button.text:SetText(_G[_G.string.upper(state)] or L["state_resting"]);
button.state = state;
if(#tg.buttons == 0) then
button:SetPoint("BOTTOMLEFT");
else
button:SetPoint("BOTTOMLEFT", tg.buttons[#tg.buttons], "BOTTOMRIGHT", 2, 0);
end
button:SetHeight(tg:GetHeight());
button:SetWidth(55);
button.bg = button:CreateTexture(nil, "BACKGROUND");
button.bg:SetAllPoints();
button.bg:SetColorTexture(1,1,1,.25);
button:SetScript("OnClick", function(self)
frame.main.selectedState = self.state;
frame.main.options:Hide();
frame.main.options:Show();
for _,button in pairs(frame.main.tabs.buttons) do
if(self.state == button.state) then
button:SetAlpha(1);
else
button:SetAlpha(.35);
end
end
end);
table.insert(tg.buttons, button);
if(#tg.buttons == #states) then
button:Click();
end
end
for i=1,#states do
createButton(frame.main.tabs);
end
frame:SetScript("OnShow", function(self)
if(self.main.alwaysOther:GetChecked()) then
for i=1, #frame.main.tabs.buttons-1 do
frame.main.tabs.buttons[i]:Hide();
end
frame.main.tabs.title:Hide();
else
for i=1, #frame.main.tabs.buttons-1 do
frame.main.tabs.buttons[i]:Show();
end
frame.main.tabs.title:Show();
end
end);
return frame;
end
local function WhisperPopRules()
return createPopRuleFrame("whisper");
end
local function General_WindowSettings()
local frame = options.CreateOptionsFrame();
frame.menu = frame:CreateSection(L["Window Settings"], L["Some settings may be limited by certain skins."]);
frame.menu.nextOffSetY = -35;
frame.menu.width = frame.menu:CreateSlider(L["Default Width"], "150", "800", 150, 800, 1, db.winSize, "width", function(self) UpdateAllWindowProps(); end);
frame.menu.nextOffSetY = -45;
frame.menu.height = frame.menu:CreateSlider(L["Default Height"], "150", "600", 150, 600, 1, db.winSize, "height", function(self) UpdateAllWindowProps(); end);
frame.menu.nextOffSetY = -45;
frame.menu.scale = frame.menu:CreateSlider(L["Window Scale"], "10", "400", 10, 400, 1, db.winSize, "scale", function(self) UpdateAllWindowProps(); end);
frame.menu.nextOffSetY = -25;
-- window strata
local stratas = {"BACKGROUND", "LOW", "MEDIUM", "HIGH", "DIALOG", "TOOLTIP"};
local strataList = {};
frame.menu.strataText = frame.menu:CreateText();
frame.menu.strataText:SetText(L["Window Strata:"]);
for i=1, #stratas do
table.insert(strataList, {
text = stratas[i],
value = stratas[i],
justifyH = "LEFT",
func = function(self)
UpdateAllWindowProps();
end,
});
end
frame.menu.strataList = frame.menu:CreateDropDownMenu(db.winSize, "strata", strataList, 150);
frame.menu.strataList:ClearAllPoints();
frame.menu.strataList:SetPoint("LEFT", frame.menu.strataText, "LEFT", frame.menu.strataText:GetStringWidth(), 0);
frame.menu.lastObj = frame.menu.strataText;
frame.menu.nextOffSetY = -5;
frame.menu.clamp = frame.menu:CreateCheckButton(L["Clamp window to screen."], db, "clampToScreen", nil, function(self) UpdateAllWindowProps(); end);
frame.menu.nextOffSetY = -10;
frame.menu:CreateButton(L["Set Window Spawn Location"], ShowDemoWindow);
frame.menu.nextOffSetY = -10;
local cascade = {L["Up"], L["Down"], L["Left"], L["Right"], L["Up"].." & "..L["Left"], L["Up"].." & "..L["Right"], L["Down"].." & "..L["Left"], L["Down"].." & "..L["Right"]};
local tsList = {};
for i=1, #cascade do
table.insert(tsList, {
text = cascade[i],
value = i,
justifyH = "LEFT",
});
end
frame.menu:CreateCheckButtonMenu(L["Cascade overlapping windows."], db.winCascade, "enabled", nil, nil, tsList, db.winCascade, "direction", nil);
frame.menu:CreateCheckButton(L["Ignore arrow keys in message box."], db, "ignoreArrowKeys", nil, function(self) UpdateAllWindowProps(); end);
frame.menu:CreateCheckButton(L["Allow <ESC> to hide windows."], db, "escapeToHide", L["Windows will also be hidden when frames such as the world map are shown."], function(self) UpdateAllWindowProps(); end);
return frame;
end
local function General_VisualSettings()
local frame = options.CreateOptionsFrame();
frame.menu = frame:CreateSection(L["Display Settings"], L["Configure general window display settings."]);
frame.menu.nextOffSetY = -20;
frame.menu.skinText = frame.menu:CreateText();
frame.menu.skinText:SetText(L["Window Skin:"]);
frame.menu.skinTooltipText = function(theSkin)
local text, skin = "", GetSkinTable(theSkin);
if(skin.version) then text = text.."\n"..L["Version"]..": |cffffffff"..skin.version.."|r"; end
if(skin.author) then text = text.."\n"..skin.author; end
if(skin.website) then text = text.."\n"..skin.website; end
return text;
end
local skins = GetRegisteredSkins();
local skinList = {};
for i=1, #skins do
table.insert(skinList, {
text = skins[i],
value = skins[i],
tooltipTitle = skins[i],
tooltipText = frame.menu.skinTooltipText(skins[i]),
justifyH = "LEFT",
func = function(self)
LoadSkin(self.value);
end,
});
end
frame.menu.skinList = frame.menu:CreateDropDownMenu(db.skin, "selected", skinList, 150);
frame.menu.skinList:ClearAllPoints();
frame.menu.skinList:SetPoint("LEFT", frame.menu.skinText, "LEFT", frame.menu.skinText:GetStringWidth(), 0);
frame.menu.lastObj = frame.menu.skinText;
frame.menu.nextOffSetY = -15;
frame.menu:CreateColorPicker(L["Color: System Messages"], db.displayColors, "sysMsg");
frame.menu:CreateColorPicker(L["Color: Error Messages"], db.displayColors, "errorMsg");
frame.menu:CreateColorPicker(L["Color: URL - Web Addresses"], db.displayColors, "webAddress");
frame.menu.nextOffSetY = -10;
frame.menu:CreateColorPicker(L["Color: History Messages Sent"], db.displayColors, "historyOut");
frame.menu:CreateColorPicker(L["Color: History Messages Received"], db.displayColors, "historyIn");
frame.menu.nextOffSetY = -10;
frame.menu:CreateCheckButton(L["Use colors suggested by skin."], db.displayColors, "useSkin");
frame.menu.nextOffSetY = -30;
frame.menu.alpha = frame.menu:CreateSlider(L["Window Alpha"], "1", "100", 1, 100, 1, db, "windowAlpha", function(self) UpdateAllWindowProps(); end);
frame.menu.nextOffSetY = -35;
frame.menu:CreateCheckButton(L["Enable window fading effects."], db, "winFade");
frame.menu:CreateCheckButton(L["Enable window animation effects."], db, "winAnimation");
frame.menu:CreateCheckButton(L["Display item links when hovering over them."], db, "hoverLinks");
return frame;
end
local function General_Fonts()
local frame = options.CreateOptionsFrame();
frame.menu = frame:CreateSection(L["Fonts"], L["Configure the fonts used in WIM's message windows."]);
frame.menu.nextOffSetY = -30;
frame.list = frame.menu:ImportCustomObject(CreateFrame("Frame"));
options.frame.filterList = frame.list;
options.AddFramedBackdrop(frame.list);
frame.list:SetFullSize();
frame.list:SetHeight(4 * 24);
frame.list.scroll = CreateFrame("ScrollFrame", frame.menu:GetName().."FilterScroll", frame.list, "FauxScrollFrameTemplate");
frame.list.scroll:SetPoint("TOPLEFT", 0, -1);
frame.list.scroll:SetPoint("BOTTOMRIGHT", -23, 0);
frame.list.scroll.update = function(self)
self = self or _G.this;
self.flist = self.flist or {};
for key, _ in pairs(self.flist) do self.flist[key] = nil; end
local sml = libs.SML.MediaTable.font;
for font, _ in pairs(sml) do
table.insert(self.flist, font);
end
table.sort(self.flist);
local offset = _G.FauxScrollFrame_GetOffset(self);
for i=1, #frame.list.buttons do
local index = i+offset;
if(index <= #self.flist) then
frame.list.buttons[i]:SetFontItem(self.flist[index]);
frame.list.buttons[i]:Show();
if(db.skin.font == self.flist[index]) then
frame.list.buttons[i]:LockHighlight();
else
frame.list.buttons[i]:UnlockHighlight();
end
else
frame.list.buttons[i]:Hide();
end
end
_G.FauxScrollFrame_Update(self, #self.flist, #frame.list.buttons, 24);
end
frame.list.scroll:SetScript("OnVerticalScroll", function(self, offset)
_G.FauxScrollFrame_OnVerticalScroll(self, offset, 24, frame.list.scroll.update);
end);
frame.list:SetScript("OnShow", function(self)
self.scroll:update();
end);
frame.list.createButton = function(self)
self.buttons = self.buttons or {};
local button = CreateFrame("Button", nil, self);
button:SetHeight(24);
button:SetHighlightTexture("Interface\\QuestFrame\\UI-QuestTitleHighlight", "ADD");
button.title = button:CreateFontString(nil, "OVERLAY", "ChatFontNormal");
button.title:SetAllPoints();
button.title:SetJustifyH("LEFT")
local font, height, flags = button.title:GetFont();
button.title:SetFont(font, 18, flags);
button.title:SetTextColor(_G.GameFontNormal:GetTextColor());
button.title:SetText("Test");
button.SetFontItem = function(self, theFont)
self.font = theFont;
self.title:SetText(" "..theFont);
self.title:SetFont(libs.SML.MediaTable.font[theFont], 18, "");
end
button:SetScript("OnClick", function(self)
_G.PlaySound(856);
db.skin.font = self.font;
LoadSkin(db.skin.selected);
frame.list:Hide(); frame.list:Show();
end);
if(#self.buttons == 0) then
button:SetPoint("TOPLEFT");
button:SetPoint("TOPRIGHT", -25, 0);
else
button:SetPoint("TOPLEFT", self.buttons[#self.buttons], "BOTTOMLEFT");
button:SetPoint("TOPRIGHT", self.buttons[#self.buttons], "BOTTOMRIGHT");
end
table.insert(self.buttons, button);
end
for i=1, 4 do
frame.list:createButton();
end
frame.menu.nextOffSetY = -20;
frame.menu.outlineText = frame.menu:CreateText();
frame.menu.outlineText:SetText(L["Font Outline"]..":");
local outlineList = {
{text = L["None"],
value = "",
justifyH = "LEFT",
func = function(self)
LoadSkin(db.skin.selected);
end},
{text = L["Thin"],
value = "OUTLINE",
justifyH = "LEFT",
func = function(self)
LoadSkin(db.skin.selected);
end},
{text = L["Thick"],
value = "THICKOUTLINE",
justifyH = "LEFT",
func = function(self)
LoadSkin(db.skin.selected);
end},
};
frame.menu.outlineList = frame.menu:CreateDropDownMenu(db.skin, "font_outline", outlineList, 150);
frame.menu.outlineList:ClearAllPoints();
frame.menu.outlineList:SetPoint("LEFT", frame.menu.outlineText, "LEFT", frame.menu.outlineText:GetStringWidth(), 0);
frame.menu.lastObj = frame.menu.outlineText;
frame.menu.nextOffSetY = -20;
frame.menu:CreateCheckButton(L["Use font suggested by skin."], db.skin, "suggest", nil, function(self) LoadSkin(db.skin.selected); end);
frame.menu.nextOffSetY = -60;
frame.menu:CreateSlider(L["Chat Font Size"], "8", "50", 8, 50, 1, db, "fontSize", function(self) UpdateAllWindowProps(); end);
return frame;
end
local function Whispers_DisplaySettings()
local frame = options.CreateOptionsFrame();
frame.menu = frame:CreateSection(L["Display Settings"], L["Configure general display settings when dealing with whispers."]);
frame.menu.nextOffSetY = -10;
frame.menu:CreateColorPicker(L["Color: Messages Sent"], db.displayColors, "wispOut");
frame.menu:CreateColorPicker(L["Color: Messages Received"], db.displayColors, "wispIn");
frame.menu.nextOffSetY = -10;
frame.menu:CreateColorPicker(L["Color: BNet Messages Sent"], db.displayColors, "BNwispOut");
frame.menu:CreateColorPicker(L["Color: BNet Messages Received"], db.displayColors, "BNwispIn");
frame.menu.nextOffSetY = -20;
frame.menu:CreateCheckButton(L["Use colors suggested by skin."], db.displayColors, "useSkin");
frame.menu.nextOffSetY = -20;
frame.menu:CreateCheckButton(L["Display user class icons and details."], db, "whoLookups", L["Requires who lookups."]);
frame.menu:CreateCheckButton(L["Display Shortcut Bar"], WIM.modules.ShortcutBar, "enabled", nil, function(self, button) EnableModule("ShortcutBar", self:GetChecked()); end);
return frame;
end
local function Whispers_Filters(isChat)
local filterTypes = {L["Pattern"], L["User Type"], L["User Level"]};
local filterActions = {L["Allow"], L["Ignore"], L["Block"]}
local frame = options.CreateOptionsFrame();
local filters = isChat and chatFilters or filters;
frame.sub = frame:CreateSection((isChat and _G.CHAT..": " or "")..L["Filtering"], L["Filtering allows you to control which messages are handled as well as how they are handled by WIM."]);
frame.sub.nextOffSetY = -10;
frame.sub:CreateCheckButton(L["Enable Filtering"], isChat and WIM.modules.ChatFilters or WIM.modules.Filters, "enabled", nil, function(self, button) EnableModule(isChat and "ChatFilters" or "Filters", self:GetChecked()); end);
frame.sub.nextOffSetY = -15;
frame.list = frame.sub:ImportCustomObject(CreateFrame("Frame"));
if(isChat) then
options.frame.chatFilterList = frame.list;
else
options.frame.filterList = frame.list;
end
options.AddFramedBackdrop(frame.list);
frame.list:SetFullSize();
frame.list:SetHeight(filterListCount * 32);
frame.list.scroll = CreateFrame("ScrollFrame", frame.sub:GetName().."FilterScroll", frame.list, "FauxScrollFrameTemplate");
frame.list.scroll:SetPoint("TOPLEFT", 0, -1);
frame.list.scroll:SetPoint("BOTTOMRIGHT", -23, 0);
frame.list.scroll.update = function(self)
self = self or _G.this;
local offset = _G.FauxScrollFrame_GetOffset(self);
for i=1, #frame.list.buttons do
local index = i+offset;
if(index <= #filters) then
frame.list.buttons[i]:SetFilterIndex(index);
frame.list.buttons[i]:Show();
if(frame.list.selected == frame.list.buttons[i].index) then
frame.list.buttons[i]:LockHighlight();
else
frame.list.buttons[i]:UnlockHighlight();
end
else
frame.list.buttons[i]:Hide();
end
end
_G.FauxScrollFrame_Update(self, #filters, #frame.list.buttons, 32);
if(not frame.list.selected) then
frame.edit:Disable();
frame.delete:Disable();
else
frame.edit:Enable();
if(frame.list.selected and filters[frame.list.selected] and filters[frame.list.selected].protected) then
frame.delete:Disable();
else
frame.delete:Enable();
end
end
end
frame.list.scroll:SetScript("OnVerticalScroll", function(self, offset)
_G.FauxScrollFrame_OnVerticalScroll(self, offset, 32, frame.list.scroll.update);
end);
frame.list:SetScript("OnShow", function(self)
self.scroll:update();
end);
frame.list.createButton = function(self)
self.buttons = self.buttons or {};
local button = CreateFrame("Button", nil, self);
button:SetHeight(32);
button:SetHighlightTexture("Interface\\QuestFrame\\UI-QuestTitleHighlight", "ADD");
button.cb = CreateFrame("CheckButton", nil, button, "UICheckButtonTemplate");
button.cb:SetPoint("TOPLEFT");
button.cb:SetScale(.75);
button.cb:SetScript("OnClick", function(self)
self:GetParent().filter.enabled = self:GetChecked() and true or false;
frame.list:Hide(); frame.list:Show();
end);
button.title = button:CreateFontString(nil, "OVERLAY", "ChatFontNormal");
button.title:SetPoint("TOPLEFT", button.cb, "TOPRIGHT", 0, -4);
button.title:SetPoint("RIGHT");
button.title:SetJustifyH("LEFT")
button.title:SetTextColor(_G.GameFontNormal:GetTextColor());
button.title:SetText("Test Filter |cffffffff- User Type|r");
button.action = button:CreateFontString(nil, "OVERLAY", "ChatFontSmall");
button.action:SetPoint("TOPLEFT", button.title, "BOTTOMLEFT", 0, 0);
button.action:SetText("Action: Ignore");
button.stats = button:CreateFontString(nil, "OVERLAY", "ChatFontSmall");
button.stats:SetPoint("TOPLEFT", button.action, "TOPRIGHT");
button.stats:SetPoint("RIGHT");
button.stats:SetJustifyH("RIGHT");
button.stats:SetText("Total Filtered: 100");
button.down = CreateFrame("Button", nil, button);
button.down:SetWidth(14); button.down:SetHeight(14);
button.down:SetPoint("TOPRIGHT", 0, 0);
button.down:SetNormalTexture("Interface\\AddOns\\"..addonTocName.."\\Sources\\Options\\Textures\\down");
button.down:SetHighlightTexture("Interface\\AddOns\\"..addonTocName.."\\Sources\\Options\\Textures\\down", "ADD");
button.down:SetScript("OnClick", function(self)
local index = self:GetParent().index;
filters[index], filters[index+1] = filters[index+1], filters[index];
if(frame.list.selected == index) then frame.list.selected = frame.list.selected + 1; end
frame.list:Hide(); frame.list:Show();
end);
button.up = CreateFrame("Button", nil, button);
button.up:SetWidth(14); button.up:SetHeight(14);
button.up:SetPoint("RIGHT", button.down, "LEFT", -5, 0);
button.up:SetNormalTexture("Interface\\AddOns\\"..addonTocName.."\\Sources\\Options\\Textures\\up");
button.up:SetHighlightTexture("Interface\\AddOns\\"..addonTocName.."\\Sources\\Options\\Textures\\up", "ADD");
button.up:SetScript("OnClick", function(self)
local index = self:GetParent().index;
filters[index], filters[index-1] = filters[index-1], filters[index];
if(frame.list.selected == index) then frame.list.selected = frame.list.selected - 1; end
frame.list:Hide(); frame.list:Show();
end);
button.SetFilterIndex = function(self, index)
self.index = index;
self.filter = filters[index];
local alpha = self.filter.enabled and 1 or .65;
self.title:SetText(self.filter.name.."|cffffffff - "..filterTypes[self.filter.type]..(self.filter.protected and " ("..L["Protected"]..")" or "").."|r");
self.title:SetAlpha(alpha);
self.action:SetText(L["Action:"].." "..filterActions[self.filter.action]);
self.action:SetAlpha(alpha);
self.cb:SetChecked(self.filter.enabled);
self.stats:SetText(L["Occurrences:"].." "..(self.filter.stats or "0"));
self.stats:SetAlpha(alpha);
if(index == 1) then self.up:Hide(); else self.up:Show(); end
if(index == #filters) then self.down:Hide(); else self.down:Show(); end
end
button:SetScript("OnClick", function(self)
_G.PlaySound(856);
frame.list.selected = self.index;
frame.list:Hide(); frame.list:Show();
end);
if(#self.buttons == 0) then
button:SetPoint("TOPLEFT");
button:SetPoint("TOPRIGHT", -25, 0);
else
button:SetPoint("TOPLEFT", self.buttons[#self.buttons], "BOTTOMLEFT");
button:SetPoint("TOPRIGHT", self.buttons[#self.buttons], "BOTTOMRIGHT");
end
table.insert(self.buttons, button);
end
for i=1, filterListCount do
frame.list:createButton();
end
frame.nextOffSetY = 20;
frame.add = frame:CreateButton(L["Add Filter"], function(self) ShowFilterFrame(nil, nil, isChat); end);
frame.edit = frame:CreateButton(L["Edit Filter"], function(self) ShowFilterFrame(filters[frame.list.selected], frame.list.selected, isChat); end);
frame.edit:ClearAllPoints();
frame.edit:SetPoint("LEFT", frame.add, "RIGHT", 0, 0);
frame.delete = frame:CreateButton(L["Delete Filter"], function(self)
table.remove(filters, frame.list.selected);
if(frame.list.selected == 1) then
if(#filters > 0) then frame.list.selected = 1 else frame.list.selected = nil; end
else
frame.list.selected = frame.list.selected - 1;
end
frame.list:Hide(); frame.list:Show();
end);
frame.delete:ClearAllPoints();
frame.delete:SetPoint("TOP", frame.edit, "TOP");
frame.delete:SetPoint("RIGHT", 0, 0);
return frame;
end
local function General_History(isChat)
local historyDB = isChat and db.history.chat or db.history;
local f = options.CreateOptionsFrame();
f.sub = f:CreateSection((isChat and _G.CHAT..": " or "")..L["History"], L["WIM can store conversations to be viewed at a later time."]);
f.sub.nextOffSetY = -10;
f.sub:CreateCheckButton(L["Enable History"], isChat and WIM.modules.HistoryChat or WIM.modules.History, "enabled", nil, function(self, button) EnableModule(isChat and "HistoryChat" or "History", self:GetChecked()); end);
f.sub.nextOffSetY = -15;
local tsList = {};
for i=1, 10 do
table.insert(tsList, {
text = (i*5).." "..L["Messages"],
value = (i*5),
justifyH = "LEFT",
});
end
f.sub:CreateCheckButtonMenu(L["Preview history inside message windows."], historyDB, "preview", nil, nil, tsList, historyDB, "previewCount");
f.sub.nextOffSetY = -15;
if(not isChat) then
f.sub:CreateCheckButton(L["Record Friends"], historyDB.whispers, "friends");
f.sub:CreateCheckButton(L["Record Guild"], historyDB.whispers, "guild");
f.sub:CreateCheckButton(L["Record Everyone"], historyDB.whispers, "all");
else
f.sub.col1 = f.sub:CreateCheckButton(_G.GUILD, historyDB, "guild");
f.sub:CreateCheckButton(_G.GUILD_RANK1_DESC, historyDB, "officer");
f.sub:CreateCheckButton(_G.PARTY, historyDB, "party");
f.sub.col1row = f.sub:CreateCheckButton(_G.RAID, historyDB, "raid");
f.sub.col2 = f.sub:CreateCheckButton(_G.SAY, historyDB, "say");
f.sub.col2:ClearAllPoints();
f.sub.col2:SetPoint("TOPLEFT", f.sub.col1, 200, 0);
f.sub:CreateCheckButton(_G.INSTANCE_CHAT, historyDB, "battleground");
f.sub:CreateCheckButton(L["World Chat"], historyDB, "world");
f.sub:CreateCheckButton(L["Custom Chat"], historyDB, "custom");
end
--[[f.sub.chat = f.sub:CreateCheckButton(L["Record Chat"], db.history.chat, "enabled");
f.sub.chat:ClearAllPoints();
f.sub.chat:SetPoint("TOPLEFT", f.sub.whispers, 200, 0);
f.sub.chat:CreateCheckButton(L["Record Friends"], db.history.chat, "friends");
f.sub.chat:CreateCheckButton(L["Record Guild"], db.history.chat, "guild");
f.sub.chat:CreateCheckButton(L["Record Everyone"], db.history.chat, "all");
f.sub.chat:Disable();
f.sub.lastObj = f.sub.whispers;]]
f.sub.maint = f.sub:CreateSection(L["Maintenance"], L["Allowing your history logs to grow too large will affect the game's performance, therefore it is reccomended that you use the following options."]);
if (isChat) then
f.sub.maint:ClearAllPoints();
f.sub.maint:SetPoint("LEFT",f.sub.col1);
f.sub.maint:SetPoint("RIGHT",f.sub);
f.sub.maint:SetPoint("TOP",f.sub.col1row,"BOTTOM", 0, -10);
else
f.sub.maint:SetFullSize();
end
f.sub.maint:SetPoint("BOTTOM",0,10);
local countList = {100, 200, 500, 1000};
tsList = {};
for i=1, #countList do
table.insert(tsList, {
text = countList[i].." "..L["Messages"],
value = countList[i],
justifyH = "LEFT",
});
end
f.sub.maint.nextOffSetY = -10;
f.sub.maint:CreateCheckButtonMenu(L["Save a maximum number of messages per person."], historyDB, "maxPer", nil, nil, tsList, db.history, "maxCount");
--f.sub.maint.nextOffSetY = -10;
local tsList2 = {};
for i=1, 5 do
table.insert(tsList2, {
text = _G.format(L["%d |4Week:Weeks;"], i),
value = 60*60*24*7*i,
justifyH = "LEFT",
});
end
f.sub.maint:CreateCheckButtonMenu(L["Automatically delete old messages."], historyDB, "ageLimit", nil, nil, tsList2, db.history, "maxAge");
return f;
end
local function W2W_Main()
local f = options.CreateOptionsFrame();
f.sub = f:CreateSection("WIM-2-WIM (W2W)", L["WIM-2-WIM is a feature which allows users with WIM to interact in ways that normal whispering can not."]);
f.sub.nextOffSetY = -10;
f.sub:CreateCheckButton(L["Enable WIM-2-WIM"], WIM.modules.W2W, "enabled", nil, function(self, button) EnableModule("W2W", self:GetChecked()); end);
f.sub.nextOffSetY = -15;
return f;
end
local function W2W_Privacy()
local f = options.CreateOptionsFrame();
f.sub = f:CreateSection(L["Privacy"], L["Restrict the data that is shared."]);
f.sub.nextOffSetY = -10;
f.sub:CreateCheckButton(L["Allow others to see me typing."], db.w2w, "shareTyping", nil, function(self, button) UpdateAllServices(); end);
f.sub:CreateCheckButton(L["Allow others to see my location."], db.w2w, "shareCoordinates", nil, function(self, button) UpdateAllServices(); end);
f.sub:CreateCheckButton(L["Allow others to see my talent spec."], db.w2w, "shareTalentSpec", nil, function(self, button) UpdateAllServices(); end);
f.sub.nextOffSetY = -15;
return f;
end
local function General_Tabs()
local f = options.CreateOptionsFrame();
f.sub = f:CreateSection(L["Tab Management"], L["Automatically manage your open windows and place them into appropriate tab groups."]);
f.sub.nextOffSetY = -20;
f.sub.sortText = f.sub:CreateText();
f.sub.sortText:SetText(L["Sort tabs by:"]);
local sorts = {L["Window Created"], L["Last Activity"], L["Alphabetical"]};
local sortList = {};
for i=1, #sorts do
table.insert(sortList, {
text = sorts[i],
value = i,
justifyH = "LEFT",
func = function(self)
UpdateAllTabs();
end,
});
end
f.sub.sortList = f.sub:CreateDropDownMenu(db.tabs, "sortBy", sortList, 150);
f.sub.sortList:ClearAllPoints();
f.sub.sortList:SetPoint("LEFT", f.sub.sortText, "LEFT", f.sub.sortText:GetStringWidth(), 0);
f.sub.lastObj = f.sub.sortText;
f.sub.nextOffSetY = -30;
f.sub.whispers = f.sub:CreateCheckButton(L["Automatically group whispers."], db.tabs.whispers, "enabled", L["Does not apply to windows already opened."]);
f.sub.whispers:CreateCheckButton(L["Place friends in their own group."], db.tabs.whispers, "friends", L["Does not apply to windows already opened."]);
f.sub.whispers:CreateCheckButton(L["Place guild members in their own group."], db.tabs.whispers, "guild", L["Does not apply to windows already opened."]);
f.sub.nextOffSetY = -80;
f.sub.chat = f.sub:CreateCheckButton(L["Automatically group chat windows."], db.tabs.chat, "enabled", L["Does not apply to windows already opened."]);
f.sub.chat:CreateCheckButton(L["Group with whisper windows."], db.tabs.chat, "aswhisper", L["Does not apply to windows already opened."]);
return f;
end
local function General_Sounds(isChat)
local f = options.CreateOptionsFrame();
f.sub = f:CreateSection((isChat and _G.CHAT..": " or "")..L["Sounds"], L["Configure various sound events and how they are triggered."]);
f.sub.nextOffSetY = -20;
local soundList = {};
local whisperCount = 5;
local chatCount = 11;
for i = 1, (isChat and chatCount or whisperCount) do
soundList[i] = {};
for sound, _ in pairs(libs.SML.MediaTable.sound) do
table.insert(soundList[i], {
text = sound,
value = sound,
justifyH = "LEFT",
func = function(self)
_G.PlaySoundFile(libs.SML:Fetch(libs.SML.MediaType.SOUND, self.value));
end
});
end
end
if(isChat) then
f.sub.chat = f.sub:CreateCheckButtonMenu(L["Play sound when a message is received."], db.sounds.chat, "msgin", nil, nil, soundList[1], db.sounds.chat, "msgin_sml");
f.sub.chat:CreateCheckButtonMenu(L["Play special sound for %s."]:format(_G.GUILD), db.sounds.chat, "guild", nil, nil, soundList[2], db.sounds.chat, "guild_sml");
f.sub.chat:CreateCheckButtonMenu(L["Play special sound for %s."]:format(_G.GUILD_RANK1_DESC), db.sounds.chat, "officer", nil, nil, soundList[3], db.sounds.chat, "officer_sml");
f.sub.chat:CreateCheckButtonMenu(L["Play special sound for %s."]:format(_G.PARTY), db.sounds.chat, "party", nil, nil, soundList[4], db.sounds.chat, "party_sml");
f.sub.chat:CreateCheckButtonMenu(L["Play special sound for %s."]:format(_G.RAID), db.sounds.chat, "raid", nil, nil, soundList[5], db.sounds.chat, "raid_sml");
f.sub.chat:CreateCheckButtonMenu(L["Play special sound for %s."]:format(_G.RAID_LEADER), db.sounds.chat, "raidleader", nil, nil, soundList[6], db.sounds.chat, "raidleader_sml");
f.sub.chat:CreateCheckButtonMenu(L["Play special sound for %s."]:format(_G.INSTANCE_CHAT), db.sounds.chat, "battleground", nil, nil, soundList[5], db.sounds.chat, "battleground_sml");
f.sub.chat:CreateCheckButtonMenu(L["Play special sound for %s."]:format(_G.INSTANCE_CHAT_LEADER), db.sounds.chat, "battlegroundleader", nil, nil, soundList[6], db.sounds.chat, "battleground_sml");
f.sub.chat:CreateCheckButtonMenu(L["Play special sound for %s."]:format(_G.SAY), db.sounds.chat, "say", nil, nil, soundList[7], db.sounds.chat, "say_sml");
f.sub.chat:CreateCheckButtonMenu(L["Play special sound for %s."]:format(L["World Chat"]), db.sounds.chat, "world", nil, nil, soundList[8], db.sounds.chat, "world_sml");
f.sub.chat:CreateCheckButtonMenu(L["Play special sound for %s."]:format(L["Custom Chat"]), db.sounds.chat, "custom", nil, nil, soundList[9], db.sounds.chat, "custom_sml");
f.sub.nextOffSetY = -300;
f.sub:CreateCheckButtonMenu(L["Play sound when a message is sent."], db.sounds.chat, "msgout", nil, nil, soundList[10], db.sounds.chat, "msgout_sml");
else
f.sub.whispers = f.sub:CreateCheckButtonMenu(L["Play sound when a whisper is received."], db.sounds.whispers, "msgin", nil, nil, soundList[1], db.sounds.whispers, "msgin_sml");
f.sub.whispers:CreateCheckButtonMenu(L["Play special sound for battle.net friends."], db.sounds.whispers, "bnet", nil, nil, soundList[5], db.sounds.whispers, "bnet_sml");
f.sub.whispers:CreateCheckButtonMenu(L["Play special sound for friends."], db.sounds.whispers, "friend", nil, nil, soundList[2], db.sounds.whispers, "friend_sml");
f.sub.whispers:CreateCheckButtonMenu(L["Play special sound for guild members."], db.sounds.whispers, "guild", nil, nil, soundList[3], db.sounds.whispers, "guild_sml");
f.sub.nextOffSetY = -90;
f.sub:CreateCheckButtonMenu(L["Play sound when a whisper is sent."], db.sounds.whispers, "msgout", nil, nil, soundList[4], db.sounds.whispers, "msgout_sml");
end
return f;
end
local function General_Expose()
local frame = options.CreateOptionsFrame();
frame.menu = frame:CreateSection(L["Expose"], L["Expose is a Mac OS X inspired feature which enables you to quickly clear your screen of windows and then restore them back to their original position."]);
frame.menu.nextOffSetY = -20;
local cb1 = frame.menu:CreateCheckButton(L["Auto hide/restore windows during combat."], db.expose, "combat");
cb1:CreateCheckButton(L["Delay if I am typing a message."], db.expose, "protect");
cb1:CreateCheckButton(L["Only while in an instance."], db.expose, "groupOnly");
frame.menu.nextOffSetY = -90;
local direction = {L["Up"], L["Down"], L["Left"], L["Right"]};
local tsList = {};
for i=1, #direction do
table.insert(tsList, {
text = direction[i],
value = i,
justifyH = "LEFT",
});
end
frame.menu.directionText = frame.menu:CreateText();
frame.menu.directionText:SetText(L["Animation Direction:"]);
frame.menu.direction = frame.menu:CreateDropDownMenu(db.expose, "direction", tsList, 100);
frame.menu.direction:ClearAllPoints();
frame.menu.direction:SetPoint("LEFT", frame.menu.directionText, "LEFT", frame.menu.directionText:GetStringWidth(), 0);
frame.menu.lastObj = frame.menu.directionText;
frame.menu.nextOffSetY = -40;
frame.menu:CreateCheckButton(L["Show Border"], db.expose, "border");
frame.menu.nextOffSetY = -20;
frame.menu.size = frame.menu:CreateSlider(L["Border Size"], "1", "200", 1, 200, 1, db.expose, "borderSize");
return frame;
end
local function General_Credits()
local frame = options.CreateOptionsFrame();
frame.menu = frame:CreateSection(L["Credits"]);
frame.menu.nextOffSetY = -20;
frame.menu.createdBy = frame.menu:CreateSection("|cff69ccf0"..L["Created By:"].."|r", credits[1]);
frame.menu.nextOffSetY = -20;
frame.menu.createdBy2 = frame.menu.createdBy:CreateSection("|cff69ccf0"..L["Special Thanks:"].."|r", credits[2]);
return frame;
end
local function ChatPopRules()
return createPopRuleFrame("chat");
end
RegisterOptionFrame(L["General"], L["Main"], General_Main);
RegisterOptionFrame(L["General"], L["Window Settings"], General_WindowSettings);
RegisterOptionFrame(L["General"], L["Display Settings"], General_VisualSettings);
RegisterOptionFrame(L["General"], L["Fonts"], General_Fonts);
RegisterOptionFrame(L["General"], L["Message Formatting"], General_MessageFormatting);
RegisterOptionFrame(L["General"], L["Tab Management"], General_Tabs);
RegisterOptionFrame(L["General"], L["Expose"], General_Expose);
RegisterOptionFrame(L["General"]);
RegisterOptionFrame(L["General"], L["Credits"], General_Credits);
RegisterOptionFrame(L["Whispers"], L["Display Settings"], Whispers_DisplaySettings);
RegisterOptionFrame(L["Whispers"], L["History"], General_History);
RegisterOptionFrame(L["Whispers"], L["Filtering"], Whispers_Filters);
RegisterOptionFrame(L["Whispers"], L["Sounds"], General_Sounds);
RegisterOptionFrame(L["Whispers"], L["Window Behavior"], WhisperPopRules);
RegisterOptionFrame(L["Chat"], L["History"], function() return General_History(true); end);
RegisterOptionFrame(L["Chat"], L["Filtering"], function() return Whispers_Filters(true); end);
RegisterOptionFrame(L["Chat"], L["Sounds"], function() return General_Sounds(true); end);
RegisterOptionFrame(L["Chat"], L["Window Behavior"], ChatPopRules);
RegisterOptionFrame(L["Chat"]); -- breaker
--RegisterOptionFrame("WIM-2-WIM", L["General"], W2W_Main);
--RegisterOptionFrame("WIM-2-WIM", L["Privacy"], W2W_Privacy);