1.6.0 - 8.0.1
This commit is contained in:
parent
f3e05ec550
commit
04345705c9
53
CHANGELOG
53
CHANGELOG
|
@ -1,2 +1,51 @@
|
||||||
[0.0.10][June 11, 2017]
|
[1.5.0][February 18, 2018]
|
||||||
- Experimental Release
|
U Updated the locales of the main UI.
|
||||||
|
U Removed the message displaying the daily record when the player enter the world.
|
||||||
|
U Updated the day reset logic.
|
||||||
|
U Updated the reset logic.
|
||||||
|
A Added a day counter to the main UI.
|
||||||
|
A Added a logic reseting the addon for a new month on DayCounter 31.
|
||||||
|
A Added a command: "/mxw config" to show the settings.
|
||||||
|
|
||||||
|
[1.4.0][February 17, 2018]
|
||||||
|
U Updated the daily value locales of the main UI.
|
||||||
|
U Updated the daily record guild message.
|
||||||
|
A Added a message displaying the daily record when the player enter the world.
|
||||||
|
A The daily record value is now displayed on the main UI.
|
||||||
|
|
||||||
|
[1.3.3][February 12, 2018]
|
||||||
|
U Updated the dependencies for the TSM4 beta.
|
||||||
|
|
||||||
|
[1.3.2][February 12, 2018]
|
||||||
|
F Fixed an init bug. Don't commit codes before testing...
|
||||||
|
|
||||||
|
[1.3.1][February 12, 2018]
|
||||||
|
F Fixed a bug with the daily stage message system.
|
||||||
|
U Updated the daily stage message locales.
|
||||||
|
|
||||||
|
[1.3.0][February 12, 2018]
|
||||||
|
U Chat system optimization.
|
||||||
|
U General code optimization.
|
||||||
|
A Added a daily stage message for the daily money counter.
|
||||||
|
A Added a daily record system for the daily money counter.
|
||||||
|
|
||||||
|
[1.2.0][February 11, 2018]
|
||||||
|
A Added a guild message system sending the alert content to the guild channel.
|
||||||
|
A Added a command: "/mxw gmsg" to turn on/off the guild message.
|
||||||
|
|
||||||
|
[1.1.1][February 11, 2018]
|
||||||
|
F Fixed the bug clearing the daily counter on each new client launch.
|
||||||
|
|
||||||
|
[1.1.0][February 11, 2018]
|
||||||
|
U The daily counter is now reset during the addon init on a new day.
|
||||||
|
A Added a command: "/mxw reset" to reset the monthly counter.
|
||||||
|
A Added a command: "/mxw alert" to turn on/off the alert.
|
||||||
|
|
||||||
|
[1.0.0][January 30, 2018]
|
||||||
|
! First stable release. (If you are still using 1.3.0b, update ASAP!)
|
||||||
|
F Fixed the alert being empty under certain circumstances.
|
||||||
|
F Fixed a bug where a previous alert was repeating if you looted a corpse with money only.
|
||||||
|
U The alert frame now use the item link instead of using the name.
|
||||||
|
U Improved the Alert frame appearance.
|
||||||
|
A Added a settings frame with the minimum alert threshold and a reset button.
|
||||||
|
A Added a command: "/mxw restore" to restore the backed up global variable after a reset.
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
-- MxW (MxW Addon)
|
-- MxW (MxW Addon)
|
||||||
-- By mikx
|
-- By mikx
|
||||||
-- https://git.mikx.ca/wow-addons/MxW_Addon
|
-- https://git.mikx.xyz/wow/MxW_Addon
|
||||||
-- Licensed under the GNU General Public License 3.0
|
-- Licensed under the GNU General Public License 3.0
|
||||||
-- See included License file for more informations.
|
-- See included License file for more informations.
|
||||||
|
|
||||||
|
@ -8,6 +8,8 @@ local MX = LibStub("AceAddon-3.0"):GetAddon("MxW");
|
||||||
local L = LibStub("AceLocale-3.0"):GetLocale("MxW");
|
local L = LibStub("AceLocale-3.0"):GetLocale("MxW");
|
||||||
|
|
||||||
local numItems
|
local numItems
|
||||||
|
local iLink
|
||||||
|
local value
|
||||||
|
|
||||||
local LOOT_OPENED_Frame = CreateFrame("Frame")
|
local LOOT_OPENED_Frame = CreateFrame("Frame")
|
||||||
LOOT_OPENED_Frame:RegisterEvent("LOOT_OPENED")
|
LOOT_OPENED_Frame:RegisterEvent("LOOT_OPENED")
|
||||||
|
@ -22,50 +24,58 @@ LOOT_OPENED_Frame:SetScript("OnEvent",
|
||||||
for i = 1, numItems do
|
for i = 1, numItems do
|
||||||
-- get loot slot link to get iteminfo, we can't use item name due to API limitation
|
-- get loot slot link to get iteminfo, we can't use item name due to API limitation
|
||||||
iLink = GetLootSlotLink(i)
|
iLink = GetLootSlotLink(i)
|
||||||
-- get the iteminfo only if the itemlink is not empty (EXEMPLE: money in a slot = empty)
|
-- get the iteminfo and continue only if the itemlink is not empty (EXEMPLE: money in a slot = empty)
|
||||||
if (iLink ~= nil) then
|
if (iLink ~= nil) then
|
||||||
-- get the iteminfo using the slot itemlink
|
-- get the iteminfo using the slot itemlink
|
||||||
name, link, quality, iLevel, reqLevel, class, subclass, maxStack, equipSlot, texture, vendorPrice = GetItemInfo(iLink)
|
name, link, quality, iLevel, reqLevel, class, subclass, maxStack, equipSlot, texture, vendorPrice = GetItemInfo(iLink)
|
||||||
end
|
-- get the item value using the link, return nil if the item has no value
|
||||||
-- get the item value using the link, return nil if the item has no value
|
value = MX.TSM:GetItemValue(link, "DBMarket");
|
||||||
value = MX.TSM:GetItemValue(link, "DBMarket");
|
|
||||||
|
|
||||||
-- MINIMUM QUALITY SETTINGS ------
|
-- MINIMUM QUALITY SETTINGS ------
|
||||||
local eq = 2 -- equipable quality
|
local eq = 2 -- equipable quality
|
||||||
local mq = 1 -- mats quality
|
local mq = 1 -- mats quality
|
||||||
local cq = 1 -- consumable quality
|
local cq = 1 -- consumable quality
|
||||||
local oq = 1 -- other quality
|
local oq = 1 -- other quality
|
||||||
local rq = 1 -- recipe quality
|
local rq = 1 -- recipe quality
|
||||||
----------------------------------
|
----------------------------------
|
||||||
-- if value is nil, the object is not BoE/not known by TSM & Looter is the player
|
-- if value is nil, the object is not BoE/not known by TSM & Looter is the player
|
||||||
-- we use locales because the item class is localized by the client
|
-- we use locales because the item class is localized by the client
|
||||||
if (value ~= nil) then
|
if (value ~= nil and Settings_Alert_Enabled) then
|
||||||
if(class == L["Alert_Class_Armor"]) then
|
if(class == L["Alert_Class_Armor"]) then
|
||||||
if (value >= Farmer_Logic_MinAlert and quality >= eq) then
|
if (value >= Farmer_Logic_MinAlert and quality >= eq) then
|
||||||
MX:SendAlert(link,value);
|
MX:SendAlert(link,value);
|
||||||
|
MX:ChatGuildLootMessage(link,value);
|
||||||
|
end
|
||||||
|
elseif(class == L["Alert_Class_Weapon"]) then
|
||||||
|
if (value >= Farmer_Logic_MinAlert and quality >= eq) then
|
||||||
|
MX:SendAlert(link,value);
|
||||||
|
MX:ChatGuildLootMessage(link,value);
|
||||||
|
end
|
||||||
|
elseif(class == L["Alert_Class_TradeGoods"]) then
|
||||||
|
if (value >= Farmer_Logic_MinAlert and quality >= mq) then
|
||||||
|
MX:SendAlert(link,value);
|
||||||
|
MX:ChatGuildLootMessage(link,value);
|
||||||
|
end
|
||||||
|
elseif(class == L["Alert_Class_Consumable"]) then
|
||||||
|
if (value >= Farmer_Logic_MinAlert and quality >= cq) then
|
||||||
|
MX:SendAlert(link,value);
|
||||||
|
MX:ChatGuildLootMessage(link,value);
|
||||||
|
end
|
||||||
|
elseif(class == L["Alert_Class_Misc"]) then
|
||||||
|
if (value >= Farmer_Logic_MinAlert and quality >= oq) then
|
||||||
|
MX:SendAlert(link,value);
|
||||||
|
MX:ChatGuildLootMessage(link,value);
|
||||||
|
end
|
||||||
|
elseif(class == "Recipe") then
|
||||||
|
if (value >= Farmer_Logic_MinAlert and quality >= rq) then
|
||||||
|
MX:SendAlert(link,value);
|
||||||
|
MX:ChatGuildLootMessage(link,value);
|
||||||
|
end
|
||||||
end
|
end
|
||||||
elseif(class == L["Alert_Class_Weapon"]) then
|
value = nil
|
||||||
if (value >= Farmer_Logic_MinAlert and quality >= eq) then
|
iLink = nil
|
||||||
MX:SendAlert(link,value);
|
end
|
||||||
end
|
end
|
||||||
elseif(class == L["Alert_Class_TradeGoods"]) then
|
|
||||||
if (value >= Farmer_Logic_MinAlert and quality >= mq) then
|
|
||||||
MX:SendAlert(link,value);
|
|
||||||
end
|
|
||||||
elseif(class == L["Alert_Class_Consumable"]) then
|
|
||||||
if (value >= Farmer_Logic_MinAlert and quality >= cq) then
|
|
||||||
MX:SendAlert(link,value);
|
|
||||||
end
|
|
||||||
elseif(class == L["Alert_Class_Misc"]) then
|
|
||||||
if (value >= Farmer_Logic_MinAlert and quality >= oq) then
|
|
||||||
MX:SendAlert(link,value);
|
|
||||||
end
|
|
||||||
elseif(class == "Recipe") then
|
|
||||||
if (value >= Farmer_Logic_MinAlert and quality >= rq) then
|
|
||||||
MX:SendAlert(link,value);
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
-- MxW (MxW Addon)
|
-- MxW (MxW Addon)
|
||||||
-- By mikx
|
-- By mikx
|
||||||
-- https://git.mikx.ca/wow-addons/MxW_Addon
|
-- https://git.mikx.xyz/wow/MxW_Addon
|
||||||
-- Licensed under the GNU General Public License 3.0
|
-- Licensed under the GNU General Public License 3.0
|
||||||
-- See included License file for more informations.
|
-- See included License file for more informations.
|
||||||
|
|
||||||
|
@ -17,19 +17,28 @@ PLAYER_MONEY_Frame:SetScript("OnEvent", function(self, event, ...)
|
||||||
|
|
||||||
if (DiffGold > 0) then -- Gold gain
|
if (DiffGold > 0) then -- Gold gain
|
||||||
|
|
||||||
local weekday, month, day, year = CalendarGetDate();
|
local date = C_Calendar.GetDate()
|
||||||
-- Reset Global Daily Counter
|
local weekday = date.weekday
|
||||||
if (Farmer_Logic_Day ~= day) then
|
local month = date.month
|
||||||
Farmer_Money_DayGlobal = 0;
|
local day = date.monthDay
|
||||||
MX:UpdateMainUI()
|
local year = date.year
|
||||||
Farmer_Logic_Day = day;
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Write to SavedVariables
|
-- Write to SavedVariables
|
||||||
Farmer_Money_MonthGlobal = Farmer_Money_MonthGlobal + DiffGold;
|
Farmer_Money_MonthGlobal = Farmer_Money_MonthGlobal + DiffGold;
|
||||||
Farmer_Money_DayGlobal = Farmer_Money_DayGlobal + DiffGold;
|
Farmer_Money_DayGlobal = Farmer_Money_DayGlobal + DiffGold;
|
||||||
|
|
||||||
|
if(Farmer_Money_DayGlobal >= DailyRecord and DailyRecordFlag == false) then
|
||||||
|
MX:ChatGuildDailyRecord(DailyRecord)
|
||||||
|
DailyRecord = Farmer_Money_DayGlobal;
|
||||||
|
DailyRecordFlag = true;
|
||||||
|
end
|
||||||
|
|
||||||
|
if(DailyRecordFlag) then
|
||||||
|
DailyRecord = Farmer_Money_DayGlobal;
|
||||||
|
end
|
||||||
|
|
||||||
MX:UpdateMainUI()
|
MX:UpdateMainUI()
|
||||||
|
MX:ChatGuildDailyMoneyThresholdMessage(Farmer_Money_DayGlobal)
|
||||||
|
|
||||||
elseif (DiffGold <= 0) then -- Gold lost
|
elseif (DiffGold <= 0) then -- Gold lost
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
-- MxW (MxW Addon)
|
-- MxW (MxW Addon)
|
||||||
-- By mikx
|
-- By mikx
|
||||||
-- https://git.mikx.ca/wow-addons/MxW_Addon
|
-- https://git.mikx.xyz/wow/MxW_Addon
|
||||||
-- Licensed under the GNU General Public License 3.0
|
-- Licensed under the GNU General Public License 3.0
|
||||||
-- See included License file for more informations.
|
-- See included License file for more informations.
|
||||||
|
|
||||||
|
@ -21,43 +21,114 @@ local backdrop = {
|
||||||
|
|
||||||
local labTodayGold = AceGUI:Create("Label")
|
local labTodayGold = AceGUI:Create("Label")
|
||||||
local labMonthGold = AceGUI:Create("Label")
|
local labMonthGold = AceGUI:Create("Label")
|
||||||
|
local labDailyRecord = AceGUI:Create("Label")
|
||||||
|
local labDayCounter = AceGUI:Create("Label")
|
||||||
|
|
||||||
|
local EditBoxMinAlert = AceGUI:Create("EditBox")
|
||||||
|
|
||||||
function MX:ShowMainUI()
|
function MX:ShowMainUI()
|
||||||
local MAIN_UI = AceGUI:Create("Window")
|
local MAIN_UI = AceGUI:Create("Window")
|
||||||
MAIN_UI:SetHeight(100)
|
MAIN_UI:SetHeight(80)
|
||||||
MAIN_UI:SetTitle("MxW " .. self.db.profile.version)
|
MAIN_UI:SetTitle("MxW " .. self.db.profile.version)
|
||||||
MAIN_UI:SetStatusTable(self.db.profile.mainUI)
|
MAIN_UI:SetStatusTable(self.db.profile.mainUI)
|
||||||
MAIN_UI:SetLayout("List")
|
MAIN_UI:SetLayout("List")
|
||||||
MAIN_UI:SetWidth(300)
|
MAIN_UI:SetWidth(200)
|
||||||
MAIN_UI:EnableResize(false)
|
MAIN_UI:EnableResize(false)
|
||||||
|
|
||||||
labTodayGold:SetFont("Fonts\\FRIZQT__.TTF", 10)
|
labDayCounter:SetFont("Interface\\Addons\\MxW\\Media\\Font\\Homespun.ttf", 10)
|
||||||
|
labDayCounter:SetColor(1, 1, 1)
|
||||||
|
labDayCounter:SetFullWidth(true)
|
||||||
|
MAIN_UI:AddChild(labDayCounter)
|
||||||
|
|
||||||
|
local labSpaceA = AceGUI:Create("Label")
|
||||||
|
labSpaceA:SetFont("Fonts\\FRIZQT__.TTF", 10)
|
||||||
|
labSpaceA:SetColor(1, 1, 1)
|
||||||
|
labSpaceA:SetFullWidth(true)
|
||||||
|
labSpaceA:SetText(" ")
|
||||||
|
MAIN_UI:AddChild(labSpaceA)
|
||||||
|
|
||||||
|
labTodayGold:SetFont("Interface\\Addons\\MxW\\Media\\Font\\Homespun.ttf", 10)
|
||||||
labTodayGold:SetColor(1, 1, 1)
|
labTodayGold:SetColor(1, 1, 1)
|
||||||
labTodayGold:SetFullWidth(true)
|
labTodayGold:SetFullWidth(true)
|
||||||
MAIN_UI:AddChild(labTodayGold)
|
MAIN_UI:AddChild(labTodayGold)
|
||||||
|
|
||||||
labMonthGold:SetFont("Fonts\\FRIZQT__.TTF", 10)
|
labMonthGold:SetFont("Interface\\Addons\\MxW\\Media\\Font\\Homespun.ttf", 10)
|
||||||
labMonthGold:SetColor(1, 1, 1)
|
labMonthGold:SetColor(1, 1, 1)
|
||||||
labMonthGold:SetFullWidth(true)
|
labMonthGold:SetFullWidth(true)
|
||||||
MAIN_UI:AddChild(labMonthGold)
|
MAIN_UI:AddChild(labMonthGold)
|
||||||
|
|
||||||
local labSpace = AceGUI:Create("Label")
|
local labSpaceB = AceGUI:Create("Label")
|
||||||
labSpace:SetFont("Fonts\\FRIZQT__.TTF", 10)
|
labSpaceB:SetFont("Fonts\\FRIZQT__.TTF", 10)
|
||||||
labSpace:SetColor(1, 1, 1)
|
labSpaceB:SetColor(1, 1, 1)
|
||||||
labSpace:SetFullWidth(true)
|
labSpaceB:SetFullWidth(true)
|
||||||
labSpace:SetText(" ")
|
labSpaceB:SetText(" ")
|
||||||
MAIN_UI:AddChild(labSpace)
|
MAIN_UI:AddChild(labSpaceB)
|
||||||
|
|
||||||
local BUTTON_LOOTLIST = AceGUI:Create("Button")
|
labDailyRecord:SetFont("Interface\\Addons\\MxW\\Media\\Font\\Homespun.ttf", 10)
|
||||||
BUTTON_LOOTLIST:SetAutoWidth(true)
|
labDailyRecord:SetColor(1, 1, 1)
|
||||||
BUTTON_LOOTLIST:SetText(L["MainForm_Button_LootList"])
|
labDailyRecord:SetFullWidth(true)
|
||||||
BUTTON_LOOTLIST:SetPoint("RIGHT", 5, 15)
|
MAIN_UI:AddChild(labDailyRecord)
|
||||||
BUTTON_LOOTLIST:SetCallback("OnClick",
|
|
||||||
|
local BUTTON_SETTINGS = AceGUI:Create("Button")
|
||||||
|
BUTTON_SETTINGS:SetAutoWidth(true)
|
||||||
|
BUTTON_SETTINGS:SetText(L["MainForm_Button_Settings"])
|
||||||
|
BUTTON_SETTINGS:SetPoint("RIGHT", 5, 15)
|
||||||
|
BUTTON_SETTINGS:SetCallback("OnClick",
|
||||||
function()
|
function()
|
||||||
MX:ShowListUI()
|
MX:ShowSettingsUI()
|
||||||
end
|
end
|
||||||
)
|
)
|
||||||
MAIN_UI:AddChild(BUTTON_LOOTLIST)
|
--MAIN_UI:AddChild(BUTTON_SETTINGS)
|
||||||
|
end
|
||||||
|
|
||||||
|
function MX:ShowSettingsUI()
|
||||||
|
local SETTINGS_UI = AceGUI:Create("Window")
|
||||||
|
SETTINGS_UI:SetHeight(150)
|
||||||
|
SETTINGS_UI:SetTitle(L["MainForm_Button_Settings"])
|
||||||
|
SETTINGS_UI:SetStatusTable(self.db.profile.settingsUI)
|
||||||
|
SETTINGS_UI:SetLayout("List")
|
||||||
|
SETTINGS_UI:SetWidth(300)
|
||||||
|
|
||||||
|
EditBoxMinAlert:SetLabel(L["SettingsUI_EditBox_MinAlert"])
|
||||||
|
local money = floor(Farmer_Logic_MinAlert / (COPPER_PER_SILVER * SILVER_PER_GOLD))
|
||||||
|
EditBoxMinAlert:SetText(money)
|
||||||
|
EditBoxMinAlert:SetCallback("OnEnterPressed",
|
||||||
|
function()
|
||||||
|
local value = EditBoxMinAlert:GetText()
|
||||||
|
local fv = floor(value * (COPPER_PER_SILVER * SILVER_PER_GOLD))
|
||||||
|
Farmer_Logic_MinAlert = fv
|
||||||
|
ReloadUI();
|
||||||
|
end
|
||||||
|
)
|
||||||
|
SETTINGS_UI:AddChild(EditBoxMinAlert)
|
||||||
|
|
||||||
|
local labSpace = AceGUI:Create("Label")
|
||||||
|
labSpace:SetFont("Fonts\\FRIZQT__.TTF", 10)
|
||||||
|
labSpace:SetColor(1, 1, 1)
|
||||||
|
labSpace:SetFullWidth(true)
|
||||||
|
labSpace:SetText(" ")
|
||||||
|
SETTINGS_UI:AddChild(labSpace)
|
||||||
|
|
||||||
|
local BUTTON_RESET = AceGUI:Create("Button")
|
||||||
|
BUTTON_RESET:SetAutoWidth(true)
|
||||||
|
BUTTON_RESET:SetText(L["SettingsUI_Button_Reset"])
|
||||||
|
BUTTON_RESET:SetPoint("RIGHT", 5, 15)
|
||||||
|
BUTTON_RESET:SetCallback("OnClick",
|
||||||
|
function()
|
||||||
|
if (Farmer_Logic_Day ~= day) then
|
||||||
|
Farmer_Money_DayGlobal = 0;
|
||||||
|
Farmer_Money_MonthBack = Farmer_Money_MonthGlobal;
|
||||||
|
Farmer_Money_MonthGlobal = 0;
|
||||||
|
ReloadUI();
|
||||||
|
else
|
||||||
|
Farmer_Money_MonthBack = Farmer_Money_MonthGlobal;
|
||||||
|
Farmer_Money_MonthGlobal = Farmer_Money_DayGlobal;
|
||||||
|
Farmer_Money_DayGlobal = 0;
|
||||||
|
ReloadUI();
|
||||||
|
end
|
||||||
|
end
|
||||||
|
)
|
||||||
|
SETTINGS_UI:AddChild(BUTTON_RESET)
|
||||||
end
|
end
|
||||||
|
|
||||||
function MX:ShowListUI()
|
function MX:ShowListUI()
|
||||||
|
@ -91,14 +162,64 @@ end)
|
||||||
local MainFrame_Event_PLAYER_ENTERING_WORLD = CreateFrame("Frame")
|
local MainFrame_Event_PLAYER_ENTERING_WORLD = CreateFrame("Frame")
|
||||||
MainFrame_Event_PLAYER_ENTERING_WORLD :RegisterEvent("PLAYER_ENTERING_WORLD")
|
MainFrame_Event_PLAYER_ENTERING_WORLD :RegisterEvent("PLAYER_ENTERING_WORLD")
|
||||||
MainFrame_Event_PLAYER_ENTERING_WORLD :SetScript("OnEvent", function(self, event, ...)
|
MainFrame_Event_PLAYER_ENTERING_WORLD :SetScript("OnEvent", function(self, event, ...)
|
||||||
|
local date = C_Calendar.GetDate()
|
||||||
|
local weekday = date.weekday
|
||||||
|
local month = date.month
|
||||||
|
local day = date.monthDay
|
||||||
|
local year = date.year
|
||||||
-- Init gold variable
|
-- Init gold variable
|
||||||
CurrentGold = GetMoney()
|
CurrentGold = GetMoney()
|
||||||
|
-- Reset Global Daily Counter
|
||||||
|
if(DailyRecord == nil) then
|
||||||
|
DailyRecord = Farmer_Money_DayGlobal;
|
||||||
|
DailyRecordFlag = false;
|
||||||
|
end
|
||||||
|
if (Farmer_Logic_Day ~= day) then
|
||||||
|
if(DailyRecordFlag) then
|
||||||
|
DailyRecordFlag = false;
|
||||||
|
end
|
||||||
|
Farmer_Money_DayGlobal = 0;
|
||||||
|
Farmer_Logic_Day = day;
|
||||||
|
DailyTen = false;
|
||||||
|
DailyTwenty = false;
|
||||||
|
DailyThirty = false;
|
||||||
|
DailyForty = false;
|
||||||
|
DailyFifty = false;
|
||||||
|
DailySixty = false;
|
||||||
|
DailySeventy = false;
|
||||||
|
DailyEighty = false;
|
||||||
|
DailyNinety = false;
|
||||||
|
DailyHundred = false;
|
||||||
|
DayCounter = DayCounter + 1;
|
||||||
|
end
|
||||||
|
if (DayCounter >= 31) then
|
||||||
|
Farmer_Money_MonthBack = Farmer_Money_MonthGlobal;
|
||||||
|
Farmer_Money_MonthGlobal = 0;
|
||||||
|
Farmer_Money_DayGlobal = 0;
|
||||||
|
DayCounter = 1;
|
||||||
|
DailyRecord = 1;
|
||||||
|
DailyRecordFlag = false;
|
||||||
|
DailyTen = false;
|
||||||
|
DailyTwenty = false;
|
||||||
|
DailyThirty = false;
|
||||||
|
DailyForty = false;
|
||||||
|
DailyFifty = false;
|
||||||
|
DailySixty = false;
|
||||||
|
DailySeventy = false;
|
||||||
|
DailyEighty = false;
|
||||||
|
DailyNinety = false;
|
||||||
|
DailyHundred = false;
|
||||||
|
end
|
||||||
MX:UpdateMainUI()
|
MX:UpdateMainUI()
|
||||||
end)
|
end)
|
||||||
|
|
||||||
function MX:UpdateMainUI()
|
function MX:UpdateMainUI()
|
||||||
|
local DayColor = "|cff1ead01";
|
||||||
|
local GoldMedian = floor(Farmer_Money_MonthGlobal / DayCounter);
|
||||||
labTodayGold:SetText(format("%s (%s)", MX:FormatMoney(Farmer_Money_DayGlobal),L["MainForm_Label_Money_Lab_Today"]))
|
labTodayGold:SetText(format("%s (%s)", MX:FormatMoney(Farmer_Money_DayGlobal),L["MainForm_Label_Money_Lab_Today"]))
|
||||||
labMonthGold:SetText(format("%s (%s)", MX:FormatMoney(Farmer_Money_MonthGlobal),L["MainForm_Label_Money_Lab_Month"]))
|
labMonthGold:SetText(format("%s (%s)", MX:FormatMoney(Farmer_Money_MonthGlobal),L["MainForm_Label_Money_Lab_Month"]))
|
||||||
|
labDailyRecord:SetText(format("%s %s", MX:FormatMoneyGoldOnly(DailyRecord), L["Chat_ChatGuildDailyRecordUI"]))
|
||||||
|
labDayCounter:SetText(format("%s %s%i/30|r (~%s/%s)", L["MainForm_Label_DayCounter"], DayColor, DayCounter, MX:FormatMoneyGoldOnly(GoldMedian),L["MainForm_Label_Money_Lab_Today"]))
|
||||||
end
|
end
|
||||||
|
|
||||||
function MX:ShowMain()
|
function MX:ShowMain()
|
||||||
|
|
|
@ -1,12 +1,19 @@
|
||||||
-- MxW (MxW Addon)
|
-- MxW (MxW Addon)
|
||||||
-- By mikx
|
-- By mikx
|
||||||
-- https://git.mikx.ca/wow-addons/MxW_Addon
|
-- https://git.mikx.xyz/wow/MxW_Addon
|
||||||
-- Licensed under the GNU General Public License 3.0
|
-- Licensed under the GNU General Public License 3.0
|
||||||
-- See included License file for more informations.
|
-- See included License file for more informations.
|
||||||
|
|
||||||
local MX = LibStub("AceAddon-3.0"):GetAddon("MxW");
|
local MX = LibStub("AceAddon-3.0"):GetAddon("MxW");
|
||||||
local L = LibStub("AceLocale-3.0"):GetLocale("MxW");
|
local L = LibStub("AceLocale-3.0"):GetLocale("MxW");
|
||||||
|
|
||||||
|
local backdrop = {
|
||||||
|
bgFile = [[Interface\Tooltips\UI-Tooltip-Background]],
|
||||||
|
edgeFile = [[Interface\Tooltips\UI-Tooltip-Border]],
|
||||||
|
edgeSize = 2,
|
||||||
|
insets = { left = 1, right = 1, top = 1, bottom = 1 }
|
||||||
|
}
|
||||||
|
|
||||||
-- Alert Cooking
|
-- Alert Cooking
|
||||||
-- Based on [[ AchievementAlertFrame ]] from Blizzard
|
-- Based on [[ AchievementAlertFrame ]] from Blizzard
|
||||||
function CookAlert(frame, item, fvalue)
|
function CookAlert(frame, item, fvalue)
|
||||||
|
@ -20,7 +27,7 @@ function CookAlert(frame, item, fvalue)
|
||||||
local unlocked = frame.Unlocked;
|
local unlocked = frame.Unlocked;
|
||||||
local oldCheevo = frame.OldAchievement;
|
local oldCheevo = frame.OldAchievement;
|
||||||
|
|
||||||
displayName:SetText(itemName);
|
displayName:SetText(itemLink);
|
||||||
|
|
||||||
AchievementShield_SetPoints(0, shieldPoints, GameFontNormal, GameFontNormalSmall);
|
AchievementShield_SetPoints(0, shieldPoints, GameFontNormal, GameFontNormalSmall);
|
||||||
|
|
||||||
|
@ -31,28 +38,31 @@ function CookAlert(frame, item, fvalue)
|
||||||
frame.guildDisplay = nil;
|
frame.guildDisplay = nil;
|
||||||
frame:SetHeight(88);
|
frame:SetHeight(88);
|
||||||
local background = frame.Background;
|
local background = frame.Background;
|
||||||
background:SetTexture("Interface\\AchievementFrame\\UI-Achievement-Alert-Background");
|
background:SetTexture([[Interface\Tooltips\UI-Tooltip-Background]]);
|
||||||
background:SetTexCoord(0, 0.605, 0, 0.703);
|
background:SetTexCoord(0, 0.605, 0, 0.703);
|
||||||
background:SetPoint("TOPLEFT", 0, 0);
|
background:SetPoint("TOPLEFT", 0, 0);
|
||||||
background:SetPoint("BOTTOMRIGHT", 0, 0);
|
background:SetPoint("BOTTOMRIGHT", 0, 0);
|
||||||
local iconBorder = frame.Icon.Overlay;
|
frame:SetBackdrop(backdrop)
|
||||||
iconBorder:SetTexture("Interface\\AchievementFrame\\UI-Achievement-IconFrame");
|
frame:SetBackdropColor(0, 0, 0)
|
||||||
iconBorder:SetTexCoord(0, 0.5625, 0, 0.5625);
|
frame:SetBackdropBorderColor(0.4, 0.4, 0.4)
|
||||||
iconBorder:SetPoint("CENTER", -1, 2);
|
--local iconBorder = frame.Icon.Overlay;
|
||||||
|
--iconBorder:SetTexture("Interface\\AchievementFrame\\UI-Achievement-IconFrame");
|
||||||
|
--iconBorder:SetTexCoord(0, 0.5625, 0, 0.5625);
|
||||||
|
--iconBorder:SetPoint("CENTER", -1, 2);
|
||||||
frame.Icon:SetPoint("TOPLEFT", -26, 16);
|
frame.Icon:SetPoint("TOPLEFT", -26, 16);
|
||||||
displayName:SetPoint("BOTTOMLEFT", 72, 36);
|
displayName:SetPoint("BOTTOMLEFT", 72, 36);
|
||||||
displayName:SetPoint("BOTTOMRIGHT", -60, 36);
|
displayName:SetPoint("BOTTOMRIGHT", -60, 36);
|
||||||
unlocked:SetPoint("TOP", 7, -23);
|
unlocked:SetPoint("TOP", 7, -23);
|
||||||
unlocked:SetFont("Fonts\\FRIZQT__.TTF", 10, "OUTLINE")
|
unlocked:SetFont("Interface\\Addons\\MxW\\Media\\Font\\Homespun.ttf", 10, "OUTLINEMONOCHROME")
|
||||||
unlocked:SetText(fvalue);
|
unlocked:SetText(fvalue);
|
||||||
frame.GuildName:Hide();
|
frame.GuildName:Hide();
|
||||||
frame.GuildBorder:Hide();
|
frame.GuildBorder:Hide();
|
||||||
frame.GuildBanner:Hide();
|
frame.GuildBanner:Hide();
|
||||||
frame.glow:SetTexture("Interface\\AchievementFrame\\UI-Achievement-Alert-Glow");
|
--frame.glow:SetTexture("Interface\\AchievementFrame\\UI-Achievement-Alert-Glow");
|
||||||
frame.glow:SetTexCoord(0, 0.78125, 0, 0.66796875);
|
--frame.glow:SetTexCoord(0, 0.78125, 0, 0.66796875);
|
||||||
frame.shine:SetTexture("Interface\\AchievementFrame\\UI-Achievement-Alert-Glow");
|
--frame.shine:SetTexture("Interface\\AchievementFrame\\UI-Achievement-Alert-Glow");
|
||||||
frame.shine:SetTexCoord(0.78125, 0.912109375, 0, 0.28125);
|
--frame.shine:SetTexCoord(0.78125, 0.912109375, 0, 0.28125);
|
||||||
frame.shine:SetPoint("BOTTOMLEFT", 0, 8);
|
--frame.shine:SetPoint("BOTTOMLEFT", 0, 8);
|
||||||
|
|
||||||
shieldIcon:SetTexture([[Interface\AchievementFrame\UI-Achievement-Shields-NoPoints]]);
|
shieldIcon:SetTexture([[Interface\AchievementFrame\UI-Achievement-Shields-NoPoints]]);
|
||||||
|
|
||||||
|
@ -73,8 +83,8 @@ function MX:SendAlert(iLink,value)
|
||||||
|
|
||||||
fvalue = MX:FormatMoney(value);
|
fvalue = MX:FormatMoney(value);
|
||||||
|
|
||||||
FarmerAlert:AddAlert(itemName,fvalue);
|
FarmerAlert:AddAlert(itemLink,fvalue);
|
||||||
PlaySoundFile("Sound\\Spells\\AchievmentSound1.ogg")
|
PlaySoundFile("Interface\\Addons\\MxW\\Media\\Sound\\register.mp3", "Master")
|
||||||
end
|
end
|
||||||
|
|
||||||
local COLOR_GREY = "|cff888888"
|
local COLOR_GREY = "|cff888888"
|
||||||
|
|
|
@ -0,0 +1,88 @@
|
||||||
|
-- MxW (MxW Addon)
|
||||||
|
-- By mikx
|
||||||
|
-- https://git.mikx.xyz/wow/MxW_Addon
|
||||||
|
-- Licensed under the GNU General Public License 3.0
|
||||||
|
-- See included License file for more informations.
|
||||||
|
|
||||||
|
local MX = LibStub("AceAddon-3.0"):GetAddon("MxW");
|
||||||
|
local L = LibStub("AceLocale-3.0"):GetLocale("MxW");
|
||||||
|
|
||||||
|
-----------------
|
||||||
|
-- Guild channel
|
||||||
|
-----------------
|
||||||
|
|
||||||
|
---- Loot Alert Guild Message
|
||||||
|
function MX:ChatGuildLootMessage(link,value)
|
||||||
|
if (Settings_GuildMessage_Enabled) then
|
||||||
|
local msg = format("[MxW] %s [%s]",link,MX:FormatMoneyNoColor(value));
|
||||||
|
SendChatMessage(msg, "GUILD", nil);
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
---- Daily Record Guild Message
|
||||||
|
function MX:ChatGuildDailyRecord(oldvalue)
|
||||||
|
if (Settings_GuildMessage_Enabled) then
|
||||||
|
local pname = UnitName("player")
|
||||||
|
local ogv = floor(oldvalue / (COPPER_PER_SILVER * SILVER_PER_GOLD))
|
||||||
|
local msg = format("[MxW] %s %s %ig!",pname,L["Chat_ChatGuildDailyRecordA"],ogv);
|
||||||
|
SendChatMessage(msg, "GUILD", nil);
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
---- Daily Money Threshold Guild Message
|
||||||
|
function MX:ChatGuildDailyMoneyThresholdMessage(value)
|
||||||
|
if (Settings_GuildMessage_Enabled) then
|
||||||
|
|
||||||
|
local gv = floor(value / (COPPER_PER_SILVER * SILVER_PER_GOLD))
|
||||||
|
local post = false
|
||||||
|
local msg
|
||||||
|
local pname = UnitName("player")
|
||||||
|
if(gv >= 10000 and DailyTen == false) then
|
||||||
|
msg = format("[MxW] %s %s %ig!",pname,L["Chat_GuildDailyMoneyThresholdMessage"],10000);
|
||||||
|
DailyTen = true;
|
||||||
|
post = true;
|
||||||
|
elseif(gv >= 20000 and DailyTwenty == false) then
|
||||||
|
msg = format("[MxW] %s %s %ig!",pname,L["Chat_GuildDailyMoneyThresholdMessage"],20000);
|
||||||
|
DailyTwenty = true;
|
||||||
|
post = true;
|
||||||
|
elseif(gv >= 30000 and DailyThirty == false) then
|
||||||
|
msg = format("[MxW] %s %s %ig!",pname,L["Chat_GuildDailyMoneyThresholdMessage"],30000);
|
||||||
|
DailyThirty = true;
|
||||||
|
post = true;
|
||||||
|
elseif(gv >= 40000 and DailyForty == false) then
|
||||||
|
msg = format("[MxW] %s %s %ig!",pname,L["Chat_GuildDailyMoneyThresholdMessage"],40000);
|
||||||
|
DailyForty = true;
|
||||||
|
post = true;
|
||||||
|
elseif(gv >= 50000 and DailyFifty == false) then
|
||||||
|
msg = format("[MxW] %s %s %ig!",pname,L["Chat_GuildDailyMoneyThresholdMessage"],50000);
|
||||||
|
DailyFifty = true;
|
||||||
|
post = true;
|
||||||
|
elseif(gv >= 60000 and DailySixty == false) then
|
||||||
|
msg = format("[MxW] %s %s %ig!",pname,L["Chat_GuildDailyMoneyThresholdMessage"],60000);
|
||||||
|
DailySixty = true;
|
||||||
|
post = true;
|
||||||
|
elseif(gv >= 70000 and DailySeventy == false) then
|
||||||
|
msg = format("[MxW] %s %s %ig!",pname,L["Chat_GuildDailyMoneyThresholdMessage"],70000);
|
||||||
|
DailySeventy = true;
|
||||||
|
post = true;
|
||||||
|
elseif(gv >= 80000 and DailyEighty == false) then
|
||||||
|
msg = format("[MxW] %s %s %ig!",pname,L["Chat_GuildDailyMoneyThresholdMessage"],80000);
|
||||||
|
DailyEighty = true;
|
||||||
|
post = true;
|
||||||
|
elseif(gv >= 90000 and DailyNinety == false) then
|
||||||
|
msg = format("[MxW] %s %s %ig!",pname,L["Chat_GuildDailyMoneyThresholdMessage"],90000);
|
||||||
|
DailyNinety = true;
|
||||||
|
post = true;
|
||||||
|
elseif(gv >= 100000 and DailyHundred == false) then
|
||||||
|
msg = format("[MxW] %s %s %ig!",pname,L["Chat_GuildDailyMoneyThresholdMessage"],100000);
|
||||||
|
DailyHundred = true;
|
||||||
|
post = true;
|
||||||
|
end
|
||||||
|
|
||||||
|
if(post) then
|
||||||
|
SendChatMessage(msg, "GUILD", nil);
|
||||||
|
post = false;
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
end
|
|
@ -1,5 +1,5 @@
|
||||||
-- MxW (MxW Addon)
|
-- MxW (MxW Addon)
|
||||||
-- By mikx
|
-- By mikx
|
||||||
-- https://git.mikx.ca/wow-addons/MxW_Addon
|
-- https://git.mikx.xyz/wow/MxW_Addon
|
||||||
-- Licensed under the GNU General Public License 3.0
|
-- Licensed under the GNU General Public License 3.0
|
||||||
-- See included License file for more informations.
|
-- See included License file for more informations.
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
<Ui xmlns="http://www.blizzard.com/wow/ui/">
|
<Ui xmlns="http://www.blizzard.com/wow/ui/">
|
||||||
<Script file="Alert.lua"/>
|
<Script file="Alert.lua"/>
|
||||||
<Script file="DB.lua"/>
|
<Script file="DB.lua"/>
|
||||||
|
<Script file="Chat.lua"/>
|
||||||
<Script file="Math.lua"/>
|
<Script file="Math.lua"/>
|
||||||
<Script file="Money.lua"/>
|
<Script file="Money.lua"/>
|
||||||
<Script file="TSM.lua"/>
|
<Script file="TSM.lua"/>
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
-- MxW (MxW Addon)
|
-- MxW (MxW Addon)
|
||||||
-- By mikx
|
-- By mikx
|
||||||
-- https://git.mikx.ca/wow-addons/MxW_Addon
|
-- https://git.mikx.xyz/wow/MxW_Addon
|
||||||
-- Licensed under the GNU General Public License 3.0
|
-- Licensed under the GNU General Public License 3.0
|
||||||
-- See included License file for more informations.
|
-- See included License file for more informations.
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
-- MxW (MxW Addon)
|
-- MxW (MxW Addon)
|
||||||
-- By mikx
|
-- By mikx
|
||||||
-- https://git.mikx.ca/wow-addons/MxW_Addon
|
-- https://git.mikx.xyz/wow/MxW_Addon
|
||||||
-- Licensed under the GNU General Public License 3.0
|
-- Licensed under the GNU General Public License 3.0
|
||||||
-- See included License file for more informations.
|
-- See included License file for more informations.
|
||||||
|
|
||||||
|
@ -26,6 +26,20 @@ function MX:FormatMoney(money)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function MX:FormatMoneyGoldOnly(money)
|
||||||
|
local ret = ""
|
||||||
|
local gold = floor(money / (COPPER_PER_SILVER * SILVER_PER_GOLD));
|
||||||
|
local silver = floor((money - (gold * COPPER_PER_SILVER * SILVER_PER_GOLD)) / COPPER_PER_SILVER);
|
||||||
|
local copper = mod(money, COPPER_PER_SILVER);
|
||||||
|
|
||||||
|
if (gold == 0) then
|
||||||
|
return "0g"
|
||||||
|
end
|
||||||
|
if (gold > 0) then
|
||||||
|
return format("%s%02dg|r", COLOR_GOLD, gold)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
function MX:FormatMoneyShort(money)
|
function MX:FormatMoneyShort(money)
|
||||||
local ret = ""
|
local ret = ""
|
||||||
local gold = floor(money / (COPPER_PER_SILVER * SILVER_PER_GOLD));
|
local gold = floor(money / (COPPER_PER_SILVER * SILVER_PER_GOLD));
|
||||||
|
@ -39,3 +53,15 @@ function MX:FormatMoneyShort(money)
|
||||||
return format("%s%sg%s", COLOR_GOLD, gold, COLOR_WHITE)
|
return format("%s%sg%s", COLOR_GOLD, gold, COLOR_WHITE)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function MX:FormatMoneyNoColor(money)
|
||||||
|
local gold = floor(money / (COPPER_PER_SILVER * SILVER_PER_GOLD));
|
||||||
|
local silver = floor((money - (gold * COPPER_PER_SILVER * SILVER_PER_GOLD)) / COPPER_PER_SILVER);
|
||||||
|
local copper = mod(money, COPPER_PER_SILVER);
|
||||||
|
if (gold == 0) then
|
||||||
|
return format("%ss %sc", silver, copper)
|
||||||
|
end
|
||||||
|
if (gold > 0) then
|
||||||
|
return format("%sg %ss %sc", gold, silver, copper)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
-- MxW (MxW Addon)
|
-- MxW (MxW Addon)
|
||||||
-- By mikx
|
-- By mikx
|
||||||
-- https://git.mikx.ca/wow-addons/MxW_Addon
|
-- https://git.mikx.xyz/wow/MxW_Addon
|
||||||
-- Licensed under the GNU General Public License 3.0
|
-- Licensed under the GNU General Public License 3.0
|
||||||
-- See included License file for more informations.
|
-- See included License file for more informations.
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
-- MxW (MxW Addon)
|
-- MxW (MxW Addon)
|
||||||
-- By mikx
|
-- By mikx
|
||||||
-- https://git.mikx.ca/wow-addons/MxW_Addon
|
-- https://git.mikx.xyz/wow/MxW_Addon
|
||||||
-- Licensed under the GNU General Public License 3.0
|
-- Licensed under the GNU General Public License 3.0
|
||||||
-- See included License file for more informations.
|
-- See included License file for more informations.
|
||||||
|
|
||||||
|
@ -16,5 +16,5 @@ MX.TSM = MX.TSM or {}
|
||||||
-- GetItemValue(itemID, priceSource)
|
-- GetItemValue(itemID, priceSource)
|
||||||
-- Return itemID value as a int using priceSource
|
-- Return itemID value as a int using priceSource
|
||||||
function MX.TSM:GetItemValue(itemID, priceSource)
|
function MX.TSM:GetItemValue(itemID, priceSource)
|
||||||
return TSMAPI:GetItemValue(itemID, priceSource)
|
return TSMAPI_FOUR.CustomPrice.GetValue(priceSource, itemID)
|
||||||
end
|
end
|
||||||
|
|
|
@ -0,0 +1,813 @@
|
||||||
|
--- **AceGUI-3.0** provides access to numerous widgets which can be used to create GUIs.
|
||||||
|
-- AceGUI is used by AceConfigDialog to create the option GUIs, but you can use it by itself
|
||||||
|
-- to create any custom GUI. There are more extensive examples in the test suite in the Ace3
|
||||||
|
-- stand-alone distribution.
|
||||||
|
--
|
||||||
|
-- **Note**: When using AceGUI-3.0 directly, please do not modify the frames of the widgets directly,
|
||||||
|
-- as any "unknown" change to the widgets will cause addons that get your widget out of the widget pool
|
||||||
|
-- to misbehave. If you think some part of a widget should be modifiable, please open a ticket, and we"ll
|
||||||
|
-- implement a proper API to modify it.
|
||||||
|
-- @usage
|
||||||
|
-- local AceGUI = LibStub("AceGUI-3.0")
|
||||||
|
-- -- Create a container frame
|
||||||
|
-- local f = AceGUI:Create("Frame")
|
||||||
|
-- f:SetCallback("OnClose",function(widget) AceGUI:Release(widget) end)
|
||||||
|
-- f:SetTitle("AceGUI-3.0 Example")
|
||||||
|
-- f:SetStatusText("Status Bar")
|
||||||
|
-- f:SetLayout("Flow")
|
||||||
|
-- -- Create a button
|
||||||
|
-- local btn = AceGUI:Create("Button")
|
||||||
|
-- btn:SetWidth(170)
|
||||||
|
-- btn:SetText("Button !")
|
||||||
|
-- btn:SetCallback("OnClick", function() print("Click!") end)
|
||||||
|
-- -- Add the button to the container
|
||||||
|
-- f:AddChild(btn)
|
||||||
|
-- @class file
|
||||||
|
-- @name AceGUI-3.0
|
||||||
|
-- @release $Id: AceGUI-3.0.lua 1102 2013-10-25 14:15:23Z nevcairiel $
|
||||||
|
local ACEGUI_MAJOR, ACEGUI_MINOR = "AceGUI-3.0", 34
|
||||||
|
local AceGUI, oldminor = LibStub:NewLibrary(ACEGUI_MAJOR, ACEGUI_MINOR)
|
||||||
|
|
||||||
|
if not AceGUI then return end -- No upgrade needed
|
||||||
|
|
||||||
|
-- Lua APIs
|
||||||
|
local tconcat, tremove, tinsert = table.concat, table.remove, table.insert
|
||||||
|
local select, pairs, next, type = select, pairs, next, type
|
||||||
|
local error, assert, loadstring = error, assert, loadstring
|
||||||
|
local setmetatable, rawget, rawset = setmetatable, rawget, rawset
|
||||||
|
local math_max = math.max
|
||||||
|
|
||||||
|
-- WoW APIs
|
||||||
|
local UIParent = UIParent
|
||||||
|
|
||||||
|
-- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
|
||||||
|
-- List them here for Mikk's FindGlobals script
|
||||||
|
-- GLOBALS: geterrorhandler, LibStub
|
||||||
|
|
||||||
|
--local con = LibStub("AceConsole-3.0",true)
|
||||||
|
|
||||||
|
AceGUI.WidgetRegistry = AceGUI.WidgetRegistry or {}
|
||||||
|
AceGUI.LayoutRegistry = AceGUI.LayoutRegistry or {}
|
||||||
|
AceGUI.WidgetBase = AceGUI.WidgetBase or {}
|
||||||
|
AceGUI.WidgetContainerBase = AceGUI.WidgetContainerBase or {}
|
||||||
|
AceGUI.WidgetVersions = AceGUI.WidgetVersions or {}
|
||||||
|
|
||||||
|
-- local upvalues
|
||||||
|
local WidgetRegistry = AceGUI.WidgetRegistry
|
||||||
|
local LayoutRegistry = AceGUI.LayoutRegistry
|
||||||
|
local WidgetVersions = AceGUI.WidgetVersions
|
||||||
|
|
||||||
|
--[[
|
||||||
|
xpcall safecall implementation
|
||||||
|
]]
|
||||||
|
local xpcall = xpcall
|
||||||
|
|
||||||
|
local function errorhandler(err)
|
||||||
|
return geterrorhandler()(err)
|
||||||
|
end
|
||||||
|
|
||||||
|
local function CreateDispatcher(argCount)
|
||||||
|
local code = [[
|
||||||
|
local xpcall, eh = ...
|
||||||
|
local method, ARGS
|
||||||
|
local function call() return method(ARGS) end
|
||||||
|
|
||||||
|
local function dispatch(func, ...)
|
||||||
|
method = func
|
||||||
|
if not method then return end
|
||||||
|
ARGS = ...
|
||||||
|
return xpcall(call, eh)
|
||||||
|
end
|
||||||
|
|
||||||
|
return dispatch
|
||||||
|
]]
|
||||||
|
|
||||||
|
local ARGS = {}
|
||||||
|
for i = 1, argCount do ARGS[i] = "arg"..i end
|
||||||
|
code = code:gsub("ARGS", tconcat(ARGS, ", "))
|
||||||
|
return assert(loadstring(code, "safecall Dispatcher["..argCount.."]"))(xpcall, errorhandler)
|
||||||
|
end
|
||||||
|
|
||||||
|
local Dispatchers = setmetatable({}, {__index=function(self, argCount)
|
||||||
|
local dispatcher = CreateDispatcher(argCount)
|
||||||
|
rawset(self, argCount, dispatcher)
|
||||||
|
return dispatcher
|
||||||
|
end})
|
||||||
|
Dispatchers[0] = function(func)
|
||||||
|
return xpcall(func, errorhandler)
|
||||||
|
end
|
||||||
|
|
||||||
|
local function safecall(func, ...)
|
||||||
|
return Dispatchers[select("#", ...)](func, ...)
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Recycling functions
|
||||||
|
local newWidget, delWidget
|
||||||
|
do
|
||||||
|
-- Version Upgrade in Minor 29
|
||||||
|
-- Internal Storage of the objects changed, from an array table
|
||||||
|
-- to a hash table, and additionally we introduced versioning on
|
||||||
|
-- the widgets which would discard all widgets from a pre-29 version
|
||||||
|
-- anyway, so we just clear the storage now, and don't try to
|
||||||
|
-- convert the storage tables to the new format.
|
||||||
|
-- This should generally not cause *many* widgets to end up in trash,
|
||||||
|
-- since once dialogs are opened, all addons should be loaded already
|
||||||
|
-- and AceGUI should be on the latest version available on the users
|
||||||
|
-- setup.
|
||||||
|
-- -- nevcairiel - Nov 2nd, 2009
|
||||||
|
if oldminor and oldminor < 29 and AceGUI.objPools then
|
||||||
|
AceGUI.objPools = nil
|
||||||
|
end
|
||||||
|
|
||||||
|
AceGUI.objPools = AceGUI.objPools or {}
|
||||||
|
local objPools = AceGUI.objPools
|
||||||
|
--Returns a new instance, if none are available either returns a new table or calls the given contructor
|
||||||
|
function newWidget(type)
|
||||||
|
if not WidgetRegistry[type] then
|
||||||
|
error("Attempt to instantiate unknown widget type", 2)
|
||||||
|
end
|
||||||
|
|
||||||
|
if not objPools[type] then
|
||||||
|
objPools[type] = {}
|
||||||
|
end
|
||||||
|
|
||||||
|
local newObj = next(objPools[type])
|
||||||
|
if not newObj then
|
||||||
|
newObj = WidgetRegistry[type]()
|
||||||
|
newObj.AceGUIWidgetVersion = WidgetVersions[type]
|
||||||
|
else
|
||||||
|
objPools[type][newObj] = nil
|
||||||
|
-- if the widget is older then the latest, don't even try to reuse it
|
||||||
|
-- just forget about it, and grab a new one.
|
||||||
|
if not newObj.AceGUIWidgetVersion or newObj.AceGUIWidgetVersion < WidgetVersions[type] then
|
||||||
|
return newWidget(type)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return newObj
|
||||||
|
end
|
||||||
|
-- Releases an instance to the Pool
|
||||||
|
function delWidget(obj,type)
|
||||||
|
if not objPools[type] then
|
||||||
|
objPools[type] = {}
|
||||||
|
end
|
||||||
|
if objPools[type][obj] then
|
||||||
|
error("Attempt to Release Widget that is already released", 2)
|
||||||
|
end
|
||||||
|
objPools[type][obj] = true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
-------------------
|
||||||
|
-- API Functions --
|
||||||
|
-------------------
|
||||||
|
|
||||||
|
-- Gets a widget Object
|
||||||
|
|
||||||
|
--- Create a new Widget of the given type.
|
||||||
|
-- This function will instantiate a new widget (or use one from the widget pool), and call the
|
||||||
|
-- OnAcquire function on it, before returning.
|
||||||
|
-- @param type The type of the widget.
|
||||||
|
-- @return The newly created widget.
|
||||||
|
function AceGUI:Create(type)
|
||||||
|
if WidgetRegistry[type] then
|
||||||
|
local widget = newWidget(type)
|
||||||
|
|
||||||
|
if rawget(widget, "Acquire") then
|
||||||
|
widget.OnAcquire = widget.Acquire
|
||||||
|
widget.Acquire = nil
|
||||||
|
elseif rawget(widget, "Aquire") then
|
||||||
|
widget.OnAcquire = widget.Aquire
|
||||||
|
widget.Aquire = nil
|
||||||
|
end
|
||||||
|
|
||||||
|
if rawget(widget, "Release") then
|
||||||
|
widget.OnRelease = rawget(widget, "Release")
|
||||||
|
widget.Release = nil
|
||||||
|
end
|
||||||
|
|
||||||
|
if widget.OnAcquire then
|
||||||
|
widget:OnAcquire()
|
||||||
|
else
|
||||||
|
error(("Widget type %s doesn't supply an OnAcquire Function"):format(type))
|
||||||
|
end
|
||||||
|
-- Set the default Layout ("List")
|
||||||
|
safecall(widget.SetLayout, widget, "List")
|
||||||
|
safecall(widget.ResumeLayout, widget)
|
||||||
|
return widget
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
--- Releases a widget Object.
|
||||||
|
-- This function calls OnRelease on the widget and places it back in the widget pool.
|
||||||
|
-- Any data on the widget is being erased, and the widget will be hidden.\\
|
||||||
|
-- If this widget is a Container-Widget, all of its Child-Widgets will be releases as well.
|
||||||
|
-- @param widget The widget to release
|
||||||
|
function AceGUI:Release(widget)
|
||||||
|
safecall(widget.PauseLayout, widget)
|
||||||
|
widget:Fire("OnRelease")
|
||||||
|
safecall(widget.ReleaseChildren, widget)
|
||||||
|
|
||||||
|
if widget.OnRelease then
|
||||||
|
widget:OnRelease()
|
||||||
|
-- else
|
||||||
|
-- error(("Widget type %s doesn't supply an OnRelease Function"):format(widget.type))
|
||||||
|
end
|
||||||
|
for k in pairs(widget.userdata) do
|
||||||
|
widget.userdata[k] = nil
|
||||||
|
end
|
||||||
|
for k in pairs(widget.events) do
|
||||||
|
widget.events[k] = nil
|
||||||
|
end
|
||||||
|
widget.width = nil
|
||||||
|
widget.relWidth = nil
|
||||||
|
widget.height = nil
|
||||||
|
widget.relHeight = nil
|
||||||
|
widget.noAutoHeight = nil
|
||||||
|
widget.frame:ClearAllPoints()
|
||||||
|
widget.frame:Hide()
|
||||||
|
widget.frame:SetParent(UIParent)
|
||||||
|
widget.frame.width = nil
|
||||||
|
widget.frame.height = nil
|
||||||
|
if widget.content then
|
||||||
|
widget.content.width = nil
|
||||||
|
widget.content.height = nil
|
||||||
|
end
|
||||||
|
delWidget(widget, widget.type)
|
||||||
|
end
|
||||||
|
|
||||||
|
-----------
|
||||||
|
-- Focus --
|
||||||
|
-----------
|
||||||
|
|
||||||
|
|
||||||
|
--- Called when a widget has taken focus.
|
||||||
|
-- e.g. Dropdowns opening, Editboxes gaining kb focus
|
||||||
|
-- @param widget The widget that should be focused
|
||||||
|
function AceGUI:SetFocus(widget)
|
||||||
|
if self.FocusedWidget and self.FocusedWidget ~= widget then
|
||||||
|
safecall(self.FocusedWidget.ClearFocus, self.FocusedWidget)
|
||||||
|
end
|
||||||
|
self.FocusedWidget = widget
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
--- Called when something has happened that could cause widgets with focus to drop it
|
||||||
|
-- e.g. titlebar of a frame being clicked
|
||||||
|
function AceGUI:ClearFocus()
|
||||||
|
if self.FocusedWidget then
|
||||||
|
safecall(self.FocusedWidget.ClearFocus, self.FocusedWidget)
|
||||||
|
self.FocusedWidget = nil
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-------------
|
||||||
|
-- Widgets --
|
||||||
|
-------------
|
||||||
|
--[[
|
||||||
|
Widgets must provide the following functions
|
||||||
|
OnAcquire() - Called when the object is acquired, should set everything to a default hidden state
|
||||||
|
|
||||||
|
And the following members
|
||||||
|
frame - the frame or derivitive object that will be treated as the widget for size and anchoring purposes
|
||||||
|
type - the type of the object, same as the name given to :RegisterWidget()
|
||||||
|
|
||||||
|
Widgets contain a table called userdata, this is a safe place to store data associated with the wigdet
|
||||||
|
It will be cleared automatically when a widget is released
|
||||||
|
Placing values directly into a widget object should be avoided
|
||||||
|
|
||||||
|
If the Widget can act as a container for other Widgets the following
|
||||||
|
content - frame or derivitive that children will be anchored to
|
||||||
|
|
||||||
|
The Widget can supply the following Optional Members
|
||||||
|
:OnRelease() - Called when the object is Released, should remove any additional anchors and clear any data
|
||||||
|
:OnWidthSet(width) - Called when the width of the widget is changed
|
||||||
|
:OnHeightSet(height) - Called when the height of the widget is changed
|
||||||
|
Widgets should not use the OnSizeChanged events of thier frame or content members, use these methods instead
|
||||||
|
AceGUI already sets a handler to the event
|
||||||
|
:LayoutFinished(width, height) - called after a layout has finished, the width and height will be the width and height of the
|
||||||
|
area used for controls. These can be nil if the layout used the existing size to layout the controls.
|
||||||
|
|
||||||
|
]]
|
||||||
|
|
||||||
|
--------------------------
|
||||||
|
-- Widget Base Template --
|
||||||
|
--------------------------
|
||||||
|
do
|
||||||
|
local WidgetBase = AceGUI.WidgetBase
|
||||||
|
|
||||||
|
WidgetBase.SetParent = function(self, parent)
|
||||||
|
local frame = self.frame
|
||||||
|
frame:SetParent(nil)
|
||||||
|
frame:SetParent(parent.content)
|
||||||
|
self.parent = parent
|
||||||
|
end
|
||||||
|
|
||||||
|
WidgetBase.SetCallback = function(self, name, func)
|
||||||
|
if type(func) == "function" then
|
||||||
|
self.events[name] = func
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
WidgetBase.Fire = function(self, name, ...)
|
||||||
|
if self.events[name] then
|
||||||
|
local success, ret = safecall(self.events[name], self, name, ...)
|
||||||
|
if success then
|
||||||
|
return ret
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
WidgetBase.SetWidth = function(self, width)
|
||||||
|
self.frame:SetWidth(width)
|
||||||
|
self.frame.width = width
|
||||||
|
if self.OnWidthSet then
|
||||||
|
self:OnWidthSet(width)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
WidgetBase.SetRelativeWidth = function(self, width)
|
||||||
|
if width <= 0 or width > 1 then
|
||||||
|
error(":SetRelativeWidth(width): Invalid relative width.", 2)
|
||||||
|
end
|
||||||
|
self.relWidth = width
|
||||||
|
self.width = "relative"
|
||||||
|
end
|
||||||
|
|
||||||
|
WidgetBase.SetHeight = function(self, height)
|
||||||
|
self.frame:SetHeight(height)
|
||||||
|
self.frame.height = height
|
||||||
|
if self.OnHeightSet then
|
||||||
|
self:OnHeightSet(height)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
--[[ WidgetBase.SetRelativeHeight = function(self, height)
|
||||||
|
if height <= 0 or height > 1 then
|
||||||
|
error(":SetRelativeHeight(height): Invalid relative height.", 2)
|
||||||
|
end
|
||||||
|
self.relHeight = height
|
||||||
|
self.height = "relative"
|
||||||
|
end ]]
|
||||||
|
|
||||||
|
WidgetBase.IsVisible = function(self)
|
||||||
|
return self.frame:IsVisible()
|
||||||
|
end
|
||||||
|
|
||||||
|
WidgetBase.IsShown= function(self)
|
||||||
|
return self.frame:IsShown()
|
||||||
|
end
|
||||||
|
|
||||||
|
WidgetBase.Release = function(self)
|
||||||
|
AceGUI:Release(self)
|
||||||
|
end
|
||||||
|
|
||||||
|
WidgetBase.SetPoint = function(self, ...)
|
||||||
|
return self.frame:SetPoint(...)
|
||||||
|
end
|
||||||
|
|
||||||
|
WidgetBase.ClearAllPoints = function(self)
|
||||||
|
return self.frame:ClearAllPoints()
|
||||||
|
end
|
||||||
|
|
||||||
|
WidgetBase.GetNumPoints = function(self)
|
||||||
|
return self.frame:GetNumPoints()
|
||||||
|
end
|
||||||
|
|
||||||
|
WidgetBase.GetPoint = function(self, ...)
|
||||||
|
return self.frame:GetPoint(...)
|
||||||
|
end
|
||||||
|
|
||||||
|
WidgetBase.GetUserDataTable = function(self)
|
||||||
|
return self.userdata
|
||||||
|
end
|
||||||
|
|
||||||
|
WidgetBase.SetUserData = function(self, key, value)
|
||||||
|
self.userdata[key] = value
|
||||||
|
end
|
||||||
|
|
||||||
|
WidgetBase.GetUserData = function(self, key)
|
||||||
|
return self.userdata[key]
|
||||||
|
end
|
||||||
|
|
||||||
|
WidgetBase.IsFullHeight = function(self)
|
||||||
|
return self.height == "fill"
|
||||||
|
end
|
||||||
|
|
||||||
|
WidgetBase.SetFullHeight = function(self, isFull)
|
||||||
|
if isFull then
|
||||||
|
self.height = "fill"
|
||||||
|
else
|
||||||
|
self.height = nil
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
WidgetBase.IsFullWidth = function(self)
|
||||||
|
return self.width == "fill"
|
||||||
|
end
|
||||||
|
|
||||||
|
WidgetBase.SetFullWidth = function(self, isFull)
|
||||||
|
if isFull then
|
||||||
|
self.width = "fill"
|
||||||
|
else
|
||||||
|
self.width = nil
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- local function LayoutOnUpdate(this)
|
||||||
|
-- this:SetScript("OnUpdate",nil)
|
||||||
|
-- this.obj:PerformLayout()
|
||||||
|
-- end
|
||||||
|
|
||||||
|
local WidgetContainerBase = AceGUI.WidgetContainerBase
|
||||||
|
|
||||||
|
WidgetContainerBase.PauseLayout = function(self)
|
||||||
|
self.LayoutPaused = true
|
||||||
|
end
|
||||||
|
|
||||||
|
WidgetContainerBase.ResumeLayout = function(self)
|
||||||
|
self.LayoutPaused = nil
|
||||||
|
end
|
||||||
|
|
||||||
|
WidgetContainerBase.PerformLayout = function(self)
|
||||||
|
if self.LayoutPaused then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
safecall(self.LayoutFunc, self.content, self.children)
|
||||||
|
end
|
||||||
|
|
||||||
|
--call this function to layout, makes sure layed out objects get a frame to get sizes etc
|
||||||
|
WidgetContainerBase.DoLayout = function(self)
|
||||||
|
self:PerformLayout()
|
||||||
|
-- if not self.parent then
|
||||||
|
-- self.frame:SetScript("OnUpdate", LayoutOnUpdate)
|
||||||
|
-- end
|
||||||
|
end
|
||||||
|
|
||||||
|
WidgetContainerBase.AddChild = function(self, child, beforeWidget)
|
||||||
|
if beforeWidget then
|
||||||
|
local siblingIndex = 1
|
||||||
|
for _, widget in pairs(self.children) do
|
||||||
|
if widget == beforeWidget then
|
||||||
|
break
|
||||||
|
end
|
||||||
|
siblingIndex = siblingIndex + 1
|
||||||
|
end
|
||||||
|
tinsert(self.children, siblingIndex, child)
|
||||||
|
else
|
||||||
|
tinsert(self.children, child)
|
||||||
|
end
|
||||||
|
child:SetParent(self)
|
||||||
|
child.frame:Show()
|
||||||
|
self:DoLayout()
|
||||||
|
end
|
||||||
|
|
||||||
|
WidgetContainerBase.AddChildren = function(self, ...)
|
||||||
|
for i = 1, select("#", ...) do
|
||||||
|
local child = select(i, ...)
|
||||||
|
tinsert(self.children, child)
|
||||||
|
child:SetParent(self)
|
||||||
|
child.frame:Show()
|
||||||
|
end
|
||||||
|
self:DoLayout()
|
||||||
|
end
|
||||||
|
|
||||||
|
WidgetContainerBase.ReleaseChildren = function(self)
|
||||||
|
local children = self.children
|
||||||
|
for i = 1,#children do
|
||||||
|
AceGUI:Release(children[i])
|
||||||
|
children[i] = nil
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
WidgetContainerBase.SetLayout = function(self, Layout)
|
||||||
|
self.LayoutFunc = AceGUI:GetLayout(Layout)
|
||||||
|
end
|
||||||
|
|
||||||
|
WidgetContainerBase.SetAutoAdjustHeight = function(self, adjust)
|
||||||
|
if adjust then
|
||||||
|
self.noAutoHeight = nil
|
||||||
|
else
|
||||||
|
self.noAutoHeight = true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local function FrameResize(this)
|
||||||
|
local self = this.obj
|
||||||
|
if this:GetWidth() and this:GetHeight() then
|
||||||
|
if self.OnWidthSet then
|
||||||
|
self:OnWidthSet(this:GetWidth())
|
||||||
|
end
|
||||||
|
if self.OnHeightSet then
|
||||||
|
self:OnHeightSet(this:GetHeight())
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local function ContentResize(this)
|
||||||
|
if this:GetWidth() and this:GetHeight() then
|
||||||
|
this.width = this:GetWidth()
|
||||||
|
this.height = this:GetHeight()
|
||||||
|
this.obj:DoLayout()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
setmetatable(WidgetContainerBase, {__index=WidgetBase})
|
||||||
|
|
||||||
|
--One of these function should be called on each Widget Instance as part of its creation process
|
||||||
|
|
||||||
|
--- Register a widget-class as a container for newly created widgets.
|
||||||
|
-- @param widget The widget class
|
||||||
|
function AceGUI:RegisterAsContainer(widget)
|
||||||
|
widget.children = {}
|
||||||
|
widget.userdata = {}
|
||||||
|
widget.events = {}
|
||||||
|
widget.base = WidgetContainerBase
|
||||||
|
widget.content.obj = widget
|
||||||
|
widget.frame.obj = widget
|
||||||
|
widget.content:SetScript("OnSizeChanged", ContentResize)
|
||||||
|
widget.frame:SetScript("OnSizeChanged", FrameResize)
|
||||||
|
setmetatable(widget, {__index = WidgetContainerBase})
|
||||||
|
widget:SetLayout("List")
|
||||||
|
return widget
|
||||||
|
end
|
||||||
|
|
||||||
|
--- Register a widget-class as a widget.
|
||||||
|
-- @param widget The widget class
|
||||||
|
function AceGUI:RegisterAsWidget(widget)
|
||||||
|
widget.userdata = {}
|
||||||
|
widget.events = {}
|
||||||
|
widget.base = WidgetBase
|
||||||
|
widget.frame.obj = widget
|
||||||
|
widget.frame:SetScript("OnSizeChanged", FrameResize)
|
||||||
|
setmetatable(widget, {__index = WidgetBase})
|
||||||
|
return widget
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
------------------
|
||||||
|
-- Widget API --
|
||||||
|
------------------
|
||||||
|
|
||||||
|
--- Registers a widget Constructor, this function returns a new instance of the Widget
|
||||||
|
-- @param Name The name of the widget
|
||||||
|
-- @param Constructor The widget constructor function
|
||||||
|
-- @param Version The version of the widget
|
||||||
|
function AceGUI:RegisterWidgetType(Name, Constructor, Version)
|
||||||
|
assert(type(Constructor) == "function")
|
||||||
|
assert(type(Version) == "number")
|
||||||
|
|
||||||
|
local oldVersion = WidgetVersions[Name]
|
||||||
|
if oldVersion and oldVersion >= Version then return end
|
||||||
|
|
||||||
|
WidgetVersions[Name] = Version
|
||||||
|
WidgetRegistry[Name] = Constructor
|
||||||
|
end
|
||||||
|
|
||||||
|
--- Registers a Layout Function
|
||||||
|
-- @param Name The name of the layout
|
||||||
|
-- @param LayoutFunc Reference to the layout function
|
||||||
|
function AceGUI:RegisterLayout(Name, LayoutFunc)
|
||||||
|
assert(type(LayoutFunc) == "function")
|
||||||
|
if type(Name) == "string" then
|
||||||
|
Name = Name:upper()
|
||||||
|
end
|
||||||
|
LayoutRegistry[Name] = LayoutFunc
|
||||||
|
end
|
||||||
|
|
||||||
|
--- Get a Layout Function from the registry
|
||||||
|
-- @param Name The name of the layout
|
||||||
|
function AceGUI:GetLayout(Name)
|
||||||
|
if type(Name) == "string" then
|
||||||
|
Name = Name:upper()
|
||||||
|
end
|
||||||
|
return LayoutRegistry[Name]
|
||||||
|
end
|
||||||
|
|
||||||
|
AceGUI.counts = AceGUI.counts or {}
|
||||||
|
|
||||||
|
--- A type-based counter to count the number of widgets created.
|
||||||
|
-- This is used by widgets that require a named frame, e.g. when a Blizzard
|
||||||
|
-- Template requires it.
|
||||||
|
-- @param type The widget type
|
||||||
|
function AceGUI:GetNextWidgetNum(type)
|
||||||
|
if not self.counts[type] then
|
||||||
|
self.counts[type] = 0
|
||||||
|
end
|
||||||
|
self.counts[type] = self.counts[type] + 1
|
||||||
|
return self.counts[type]
|
||||||
|
end
|
||||||
|
|
||||||
|
--- Return the number of created widgets for this type.
|
||||||
|
-- In contrast to GetNextWidgetNum, the number is not incremented.
|
||||||
|
-- @param type The widget type
|
||||||
|
function AceGUI:GetWidgetCount(type)
|
||||||
|
return self.counts[type] or 0
|
||||||
|
end
|
||||||
|
|
||||||
|
--- Return the version of the currently registered widget type.
|
||||||
|
-- @param type The widget type
|
||||||
|
function AceGUI:GetWidgetVersion(type)
|
||||||
|
return WidgetVersions[type]
|
||||||
|
end
|
||||||
|
|
||||||
|
-------------
|
||||||
|
-- Layouts --
|
||||||
|
-------------
|
||||||
|
|
||||||
|
--[[
|
||||||
|
A Layout is a func that takes 2 parameters
|
||||||
|
content - the frame that widgets will be placed inside
|
||||||
|
children - a table containing the widgets to layout
|
||||||
|
]]
|
||||||
|
|
||||||
|
-- Very simple Layout, Children are stacked on top of each other down the left side
|
||||||
|
AceGUI:RegisterLayout("List",
|
||||||
|
function(content, children)
|
||||||
|
local height = 0
|
||||||
|
local width = content.width or content:GetWidth() or 0
|
||||||
|
for i = 1, #children do
|
||||||
|
local child = children[i]
|
||||||
|
|
||||||
|
local frame = child.frame
|
||||||
|
frame:ClearAllPoints()
|
||||||
|
frame:Show()
|
||||||
|
if i == 1 then
|
||||||
|
frame:SetPoint("TOPLEFT", content)
|
||||||
|
else
|
||||||
|
frame:SetPoint("TOPLEFT", children[i-1].frame, "BOTTOMLEFT")
|
||||||
|
end
|
||||||
|
|
||||||
|
if child.width == "fill" then
|
||||||
|
child:SetWidth(width)
|
||||||
|
frame:SetPoint("RIGHT", content)
|
||||||
|
|
||||||
|
if child.DoLayout then
|
||||||
|
child:DoLayout()
|
||||||
|
end
|
||||||
|
elseif child.width == "relative" then
|
||||||
|
child:SetWidth(width * child.relWidth)
|
||||||
|
|
||||||
|
if child.DoLayout then
|
||||||
|
child:DoLayout()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
height = height + (frame.height or frame:GetHeight() or 0)
|
||||||
|
end
|
||||||
|
safecall(content.obj.LayoutFinished, content.obj, nil, height)
|
||||||
|
end)
|
||||||
|
|
||||||
|
-- A single control fills the whole content area
|
||||||
|
AceGUI:RegisterLayout("Fill",
|
||||||
|
function(content, children)
|
||||||
|
if children[1] then
|
||||||
|
children[1]:SetWidth(content:GetWidth() or 0)
|
||||||
|
children[1]:SetHeight(content:GetHeight() or 0)
|
||||||
|
children[1].frame:SetAllPoints(content)
|
||||||
|
children[1].frame:Show()
|
||||||
|
safecall(content.obj.LayoutFinished, content.obj, nil, children[1].frame:GetHeight())
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
|
||||||
|
local layoutrecursionblock = nil
|
||||||
|
local function safelayoutcall(object, func, ...)
|
||||||
|
layoutrecursionblock = true
|
||||||
|
object[func](object, ...)
|
||||||
|
layoutrecursionblock = nil
|
||||||
|
end
|
||||||
|
|
||||||
|
AceGUI:RegisterLayout("Flow",
|
||||||
|
function(content, children)
|
||||||
|
if layoutrecursionblock then return end
|
||||||
|
--used height so far
|
||||||
|
local height = 0
|
||||||
|
--width used in the current row
|
||||||
|
local usedwidth = 0
|
||||||
|
--height of the current row
|
||||||
|
local rowheight = 0
|
||||||
|
local rowoffset = 0
|
||||||
|
local lastrowoffset
|
||||||
|
|
||||||
|
local width = content.width or content:GetWidth() or 0
|
||||||
|
|
||||||
|
--control at the start of the row
|
||||||
|
local rowstart
|
||||||
|
local rowstartoffset
|
||||||
|
local lastrowstart
|
||||||
|
local isfullheight
|
||||||
|
|
||||||
|
local frameoffset
|
||||||
|
local lastframeoffset
|
||||||
|
local oversize
|
||||||
|
for i = 1, #children do
|
||||||
|
local child = children[i]
|
||||||
|
oversize = nil
|
||||||
|
local frame = child.frame
|
||||||
|
local frameheight = frame.height or frame:GetHeight() or 0
|
||||||
|
local framewidth = frame.width or frame:GetWidth() or 0
|
||||||
|
lastframeoffset = frameoffset
|
||||||
|
-- HACK: Why did we set a frameoffset of (frameheight / 2) ?
|
||||||
|
-- That was moving all widgets half the widgets size down, is that intended?
|
||||||
|
-- Actually, it seems to be neccessary for many cases, we'll leave it in for now.
|
||||||
|
-- If widgets seem to anchor weirdly with this, provide a valid alignoffset for them.
|
||||||
|
-- TODO: Investigate moar!
|
||||||
|
frameoffset = child.alignoffset or (frameheight / 2)
|
||||||
|
|
||||||
|
if child.width == "relative" then
|
||||||
|
framewidth = width * child.relWidth
|
||||||
|
end
|
||||||
|
|
||||||
|
frame:Show()
|
||||||
|
frame:ClearAllPoints()
|
||||||
|
if i == 1 then
|
||||||
|
-- anchor the first control to the top left
|
||||||
|
frame:SetPoint("TOPLEFT", content)
|
||||||
|
rowheight = frameheight
|
||||||
|
rowoffset = frameoffset
|
||||||
|
rowstart = frame
|
||||||
|
rowstartoffset = frameoffset
|
||||||
|
usedwidth = framewidth
|
||||||
|
if usedwidth > width then
|
||||||
|
oversize = true
|
||||||
|
end
|
||||||
|
else
|
||||||
|
-- if there isn't available width for the control start a new row
|
||||||
|
-- if a control is "fill" it will be on a row of its own full width
|
||||||
|
if usedwidth == 0 or ((framewidth) + usedwidth > width) or child.width == "fill" then
|
||||||
|
if isfullheight then
|
||||||
|
-- a previous row has already filled the entire height, there's nothing we can usefully do anymore
|
||||||
|
-- (maybe error/warn about this?)
|
||||||
|
break
|
||||||
|
end
|
||||||
|
--anchor the previous row, we will now know its height and offset
|
||||||
|
rowstart:SetPoint("TOPLEFT", content, "TOPLEFT", 0, -(height + (rowoffset - rowstartoffset) + 3))
|
||||||
|
height = height + rowheight + 3
|
||||||
|
--save this as the rowstart so we can anchor it after the row is complete and we have the max height and offset of controls in it
|
||||||
|
rowstart = frame
|
||||||
|
rowstartoffset = frameoffset
|
||||||
|
rowheight = frameheight
|
||||||
|
rowoffset = frameoffset
|
||||||
|
usedwidth = framewidth
|
||||||
|
if usedwidth > width then
|
||||||
|
oversize = true
|
||||||
|
end
|
||||||
|
-- put the control on the current row, adding it to the width and checking if the height needs to be increased
|
||||||
|
else
|
||||||
|
--handles cases where the new height is higher than either control because of the offsets
|
||||||
|
--math.max(rowheight-rowoffset+frameoffset, frameheight-frameoffset+rowoffset)
|
||||||
|
|
||||||
|
--offset is always the larger of the two offsets
|
||||||
|
rowoffset = math_max(rowoffset, frameoffset)
|
||||||
|
rowheight = math_max(rowheight, rowoffset + (frameheight / 2))
|
||||||
|
|
||||||
|
frame:SetPoint("TOPLEFT", children[i-1].frame, "TOPRIGHT", 0, frameoffset - lastframeoffset)
|
||||||
|
usedwidth = framewidth + usedwidth
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if child.width == "fill" then
|
||||||
|
safelayoutcall(child, "SetWidth", width)
|
||||||
|
frame:SetPoint("RIGHT", content)
|
||||||
|
|
||||||
|
usedwidth = 0
|
||||||
|
rowstart = frame
|
||||||
|
rowstartoffset = frameoffset
|
||||||
|
|
||||||
|
if child.DoLayout then
|
||||||
|
child:DoLayout()
|
||||||
|
end
|
||||||
|
rowheight = frame.height or frame:GetHeight() or 0
|
||||||
|
rowoffset = child.alignoffset or (rowheight / 2)
|
||||||
|
rowstartoffset = rowoffset
|
||||||
|
elseif child.width == "relative" then
|
||||||
|
safelayoutcall(child, "SetWidth", width * child.relWidth)
|
||||||
|
|
||||||
|
if child.DoLayout then
|
||||||
|
child:DoLayout()
|
||||||
|
end
|
||||||
|
elseif oversize then
|
||||||
|
if width > 1 then
|
||||||
|
frame:SetPoint("RIGHT", content)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if child.height == "fill" then
|
||||||
|
frame:SetPoint("BOTTOM", content)
|
||||||
|
isfullheight = true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
--anchor the last row, if its full height needs a special case since its height has just been changed by the anchor
|
||||||
|
if isfullheight then
|
||||||
|
rowstart:SetPoint("TOPLEFT", content, "TOPLEFT", 0, -height)
|
||||||
|
elseif rowstart then
|
||||||
|
rowstart:SetPoint("TOPLEFT", content, "TOPLEFT", 0, -(height + (rowoffset - rowstartoffset) + 3))
|
||||||
|
end
|
||||||
|
|
||||||
|
height = height + rowheight + 3
|
||||||
|
safecall(content.obj.LayoutFinished, content.obj, nil, height)
|
||||||
|
end)
|
|
@ -0,0 +1,28 @@
|
||||||
|
<Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/
|
||||||
|
..\FrameXML\UI.xsd">
|
||||||
|
<Script file="AceGUI-3.0.lua"/>
|
||||||
|
<!-- Container -->
|
||||||
|
<Script file="widgets\AceGUIContainer-BlizOptionsGroup.lua"/>
|
||||||
|
<Script file="widgets\AceGUIContainer-DropDownGroup.lua"/>
|
||||||
|
<Script file="widgets\AceGUIContainer-Frame.lua"/>
|
||||||
|
<Script file="widgets\AceGUIContainer-InlineGroup.lua"/>
|
||||||
|
<Script file="widgets\AceGUIContainer-ScrollFrame.lua"/>
|
||||||
|
<Script file="widgets\AceGUIContainer-SimpleGroup.lua"/>
|
||||||
|
<Script file="widgets\AceGUIContainer-TabGroup.lua"/>
|
||||||
|
<Script file="widgets\AceGUIContainer-TreeGroup.lua"/>
|
||||||
|
<Script file="widgets\AceGUIContainer-Window.lua"/>
|
||||||
|
<!-- Widgets -->
|
||||||
|
<Script file="widgets\AceGUIWidget-Button.lua"/>
|
||||||
|
<Script file="widgets\AceGUIWidget-CheckBox.lua"/>
|
||||||
|
<Script file="widgets\AceGUIWidget-ColorPicker.lua"/>
|
||||||
|
<Script file="widgets\AceGUIWidget-DropDown.lua"/>
|
||||||
|
<Script file="widgets\AceGUIWidget-DropDown-Items.lua"/>
|
||||||
|
<Script file="widgets\AceGUIWidget-EditBox.lua"/>
|
||||||
|
<Script file="widgets\AceGUIWidget-Heading.lua"/>
|
||||||
|
<Script file="widgets\AceGUIWidget-Icon.lua"/>
|
||||||
|
<Script file="widgets\AceGUIWidget-InteractiveLabel.lua"/>
|
||||||
|
<Script file="widgets\AceGUIWidget-Keybinding.lua"/>
|
||||||
|
<Script file="widgets\AceGUIWidget-Label.lua"/>
|
||||||
|
<Script file="widgets\AceGUIWidget-MultiLineEditBox.lua"/>
|
||||||
|
<Script file="widgets\AceGUIWidget-Slider.lua"/>
|
||||||
|
</Ui>
|
|
@ -0,0 +1,138 @@
|
||||||
|
--[[-----------------------------------------------------------------------------
|
||||||
|
BlizOptionsGroup Container
|
||||||
|
Simple container widget for the integration of AceGUI into the Blizzard Interface Options
|
||||||
|
-------------------------------------------------------------------------------]]
|
||||||
|
local Type, Version = "BlizOptionsGroup", 21
|
||||||
|
local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
|
||||||
|
if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
|
||||||
|
|
||||||
|
-- Lua APIs
|
||||||
|
local pairs = pairs
|
||||||
|
|
||||||
|
-- WoW APIs
|
||||||
|
local CreateFrame = CreateFrame
|
||||||
|
|
||||||
|
--[[-----------------------------------------------------------------------------
|
||||||
|
Scripts
|
||||||
|
-------------------------------------------------------------------------------]]
|
||||||
|
|
||||||
|
local function OnShow(frame)
|
||||||
|
frame.obj:Fire("OnShow")
|
||||||
|
end
|
||||||
|
|
||||||
|
local function OnHide(frame)
|
||||||
|
frame.obj:Fire("OnHide")
|
||||||
|
end
|
||||||
|
|
||||||
|
--[[-----------------------------------------------------------------------------
|
||||||
|
Support functions
|
||||||
|
-------------------------------------------------------------------------------]]
|
||||||
|
|
||||||
|
local function okay(frame)
|
||||||
|
frame.obj:Fire("okay")
|
||||||
|
end
|
||||||
|
|
||||||
|
local function cancel(frame)
|
||||||
|
frame.obj:Fire("cancel")
|
||||||
|
end
|
||||||
|
|
||||||
|
local function default(frame)
|
||||||
|
frame.obj:Fire("default")
|
||||||
|
end
|
||||||
|
|
||||||
|
local function refresh(frame)
|
||||||
|
frame.obj:Fire("refresh")
|
||||||
|
end
|
||||||
|
|
||||||
|
--[[-----------------------------------------------------------------------------
|
||||||
|
Methods
|
||||||
|
-------------------------------------------------------------------------------]]
|
||||||
|
|
||||||
|
local methods = {
|
||||||
|
["OnAcquire"] = function(self)
|
||||||
|
self:SetName()
|
||||||
|
self:SetTitle()
|
||||||
|
end,
|
||||||
|
|
||||||
|
-- ["OnRelease"] = nil,
|
||||||
|
|
||||||
|
["OnWidthSet"] = function(self, width)
|
||||||
|
local content = self.content
|
||||||
|
local contentwidth = width - 63
|
||||||
|
if contentwidth < 0 then
|
||||||
|
contentwidth = 0
|
||||||
|
end
|
||||||
|
content:SetWidth(contentwidth)
|
||||||
|
content.width = contentwidth
|
||||||
|
end,
|
||||||
|
|
||||||
|
["OnHeightSet"] = function(self, height)
|
||||||
|
local content = self.content
|
||||||
|
local contentheight = height - 26
|
||||||
|
if contentheight < 0 then
|
||||||
|
contentheight = 0
|
||||||
|
end
|
||||||
|
content:SetHeight(contentheight)
|
||||||
|
content.height = contentheight
|
||||||
|
end,
|
||||||
|
|
||||||
|
["SetName"] = function(self, name, parent)
|
||||||
|
self.frame.name = name
|
||||||
|
self.frame.parent = parent
|
||||||
|
end,
|
||||||
|
|
||||||
|
["SetTitle"] = function(self, title)
|
||||||
|
local content = self.content
|
||||||
|
content:ClearAllPoints()
|
||||||
|
if not title or title == "" then
|
||||||
|
content:SetPoint("TOPLEFT", 10, -10)
|
||||||
|
self.label:SetText("")
|
||||||
|
else
|
||||||
|
content:SetPoint("TOPLEFT", 10, -40)
|
||||||
|
self.label:SetText(title)
|
||||||
|
end
|
||||||
|
content:SetPoint("BOTTOMRIGHT", -10, 10)
|
||||||
|
end
|
||||||
|
}
|
||||||
|
|
||||||
|
--[[-----------------------------------------------------------------------------
|
||||||
|
Constructor
|
||||||
|
-------------------------------------------------------------------------------]]
|
||||||
|
local function Constructor()
|
||||||
|
local frame = CreateFrame("Frame")
|
||||||
|
frame:Hide()
|
||||||
|
|
||||||
|
-- support functions for the Blizzard Interface Options
|
||||||
|
frame.okay = okay
|
||||||
|
frame.cancel = cancel
|
||||||
|
frame.default = default
|
||||||
|
frame.refresh = refresh
|
||||||
|
|
||||||
|
frame:SetScript("OnHide", OnHide)
|
||||||
|
frame:SetScript("OnShow", OnShow)
|
||||||
|
|
||||||
|
local label = frame:CreateFontString(nil, "OVERLAY", "GameFontNormalLarge")
|
||||||
|
label:SetPoint("TOPLEFT", 10, -15)
|
||||||
|
label:SetPoint("BOTTOMRIGHT", frame, "TOPRIGHT", 10, -45)
|
||||||
|
label:SetJustifyH("LEFT")
|
||||||
|
label:SetJustifyV("TOP")
|
||||||
|
|
||||||
|
--Container Support
|
||||||
|
local content = CreateFrame("Frame", nil, frame)
|
||||||
|
content:SetPoint("TOPLEFT", 10, -10)
|
||||||
|
content:SetPoint("BOTTOMRIGHT", -10, 10)
|
||||||
|
|
||||||
|
local widget = {
|
||||||
|
label = label,
|
||||||
|
frame = frame,
|
||||||
|
content = content,
|
||||||
|
type = Type
|
||||||
|
}
|
||||||
|
for method, func in pairs(methods) do
|
||||||
|
widget[method] = func
|
||||||
|
end
|
||||||
|
|
||||||
|
return AceGUI:RegisterAsContainer(widget)
|
||||||
|
end
|
||||||
|
|
||||||
|
AceGUI:RegisterWidgetType(Type, Constructor, Version)
|
|
@ -0,0 +1,157 @@
|
||||||
|
--[[-----------------------------------------------------------------------------
|
||||||
|
DropdownGroup Container
|
||||||
|
Container controlled by a dropdown on the top.
|
||||||
|
-------------------------------------------------------------------------------]]
|
||||||
|
local Type, Version = "DropdownGroup", 21
|
||||||
|
local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
|
||||||
|
if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
|
||||||
|
|
||||||
|
-- Lua APIs
|
||||||
|
local assert, pairs, type = assert, pairs, type
|
||||||
|
|
||||||
|
-- WoW APIs
|
||||||
|
local CreateFrame = CreateFrame
|
||||||
|
|
||||||
|
--[[-----------------------------------------------------------------------------
|
||||||
|
Scripts
|
||||||
|
-------------------------------------------------------------------------------]]
|
||||||
|
local function SelectedGroup(self, event, value)
|
||||||
|
local group = self.parentgroup
|
||||||
|
local status = group.status or group.localstatus
|
||||||
|
status.selected = value
|
||||||
|
self.parentgroup:Fire("OnGroupSelected", value)
|
||||||
|
end
|
||||||
|
|
||||||
|
--[[-----------------------------------------------------------------------------
|
||||||
|
Methods
|
||||||
|
-------------------------------------------------------------------------------]]
|
||||||
|
local methods = {
|
||||||
|
["OnAcquire"] = function(self)
|
||||||
|
self.dropdown:SetText("")
|
||||||
|
self:SetDropdownWidth(200)
|
||||||
|
self:SetTitle("")
|
||||||
|
end,
|
||||||
|
|
||||||
|
["OnRelease"] = function(self)
|
||||||
|
self.dropdown.list = nil
|
||||||
|
self.status = nil
|
||||||
|
for k in pairs(self.localstatus) do
|
||||||
|
self.localstatus[k] = nil
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
|
||||||
|
["SetTitle"] = function(self, title)
|
||||||
|
self.titletext:SetText(title)
|
||||||
|
self.dropdown.frame:ClearAllPoints()
|
||||||
|
if title and title ~= "" then
|
||||||
|
self.dropdown.frame:SetPoint("TOPRIGHT", -2, 0)
|
||||||
|
else
|
||||||
|
self.dropdown.frame:SetPoint("TOPLEFT", -1, 0)
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
|
||||||
|
["SetGroupList"] = function(self,list,order)
|
||||||
|
self.dropdown:SetList(list,order)
|
||||||
|
end,
|
||||||
|
|
||||||
|
["SetStatusTable"] = function(self, status)
|
||||||
|
assert(type(status) == "table")
|
||||||
|
self.status = status
|
||||||
|
end,
|
||||||
|
|
||||||
|
["SetGroup"] = function(self,group)
|
||||||
|
self.dropdown:SetValue(group)
|
||||||
|
local status = self.status or self.localstatus
|
||||||
|
status.selected = group
|
||||||
|
self:Fire("OnGroupSelected", group)
|
||||||
|
end,
|
||||||
|
|
||||||
|
["OnWidthSet"] = function(self, width)
|
||||||
|
local content = self.content
|
||||||
|
local contentwidth = width - 26
|
||||||
|
if contentwidth < 0 then
|
||||||
|
contentwidth = 0
|
||||||
|
end
|
||||||
|
content:SetWidth(contentwidth)
|
||||||
|
content.width = contentwidth
|
||||||
|
end,
|
||||||
|
|
||||||
|
["OnHeightSet"] = function(self, height)
|
||||||
|
local content = self.content
|
||||||
|
local contentheight = height - 63
|
||||||
|
if contentheight < 0 then
|
||||||
|
contentheight = 0
|
||||||
|
end
|
||||||
|
content:SetHeight(contentheight)
|
||||||
|
content.height = contentheight
|
||||||
|
end,
|
||||||
|
|
||||||
|
["LayoutFinished"] = function(self, width, height)
|
||||||
|
self:SetHeight((height or 0) + 63)
|
||||||
|
end,
|
||||||
|
|
||||||
|
["SetDropdownWidth"] = function(self, width)
|
||||||
|
self.dropdown:SetWidth(width)
|
||||||
|
end
|
||||||
|
}
|
||||||
|
|
||||||
|
--[[-----------------------------------------------------------------------------
|
||||||
|
Constructor
|
||||||
|
-------------------------------------------------------------------------------]]
|
||||||
|
local PaneBackdrop = {
|
||||||
|
bgFile = "Interface\\ChatFrame\\ChatFrameBackground",
|
||||||
|
edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border",
|
||||||
|
tile = true, tileSize = 16, edgeSize = 16,
|
||||||
|
insets = { left = 3, right = 3, top = 5, bottom = 3 }
|
||||||
|
}
|
||||||
|
|
||||||
|
local function Constructor()
|
||||||
|
local frame = CreateFrame("Frame")
|
||||||
|
frame:SetHeight(100)
|
||||||
|
frame:SetWidth(100)
|
||||||
|
frame:SetFrameStrata("FULLSCREEN_DIALOG")
|
||||||
|
|
||||||
|
local titletext = frame:CreateFontString(nil, "OVERLAY", "GameFontNormal")
|
||||||
|
titletext:SetPoint("TOPLEFT", 4, -5)
|
||||||
|
titletext:SetPoint("TOPRIGHT", -4, -5)
|
||||||
|
titletext:SetJustifyH("LEFT")
|
||||||
|
titletext:SetHeight(18)
|
||||||
|
|
||||||
|
local dropdown = AceGUI:Create("Dropdown")
|
||||||
|
dropdown.frame:SetParent(frame)
|
||||||
|
dropdown.frame:SetFrameLevel(dropdown.frame:GetFrameLevel() + 2)
|
||||||
|
dropdown:SetCallback("OnValueChanged", SelectedGroup)
|
||||||
|
dropdown.frame:SetPoint("TOPLEFT", -1, 0)
|
||||||
|
dropdown.frame:Show()
|
||||||
|
dropdown:SetLabel("")
|
||||||
|
|
||||||
|
local border = CreateFrame("Frame", nil, frame)
|
||||||
|
border:SetPoint("TOPLEFT", 0, -26)
|
||||||
|
border:SetPoint("BOTTOMRIGHT", 0, 3)
|
||||||
|
border:SetBackdrop(PaneBackdrop)
|
||||||
|
border:SetBackdropColor(0.1,0.1,0.1,0.5)
|
||||||
|
border:SetBackdropBorderColor(0.4,0.4,0.4)
|
||||||
|
|
||||||
|
--Container Support
|
||||||
|
local content = CreateFrame("Frame", nil, border)
|
||||||
|
content:SetPoint("TOPLEFT", 10, -10)
|
||||||
|
content:SetPoint("BOTTOMRIGHT", -10, 10)
|
||||||
|
|
||||||
|
local widget = {
|
||||||
|
frame = frame,
|
||||||
|
localstatus = {},
|
||||||
|
titletext = titletext,
|
||||||
|
dropdown = dropdown,
|
||||||
|
border = border,
|
||||||
|
content = content,
|
||||||
|
type = Type
|
||||||
|
}
|
||||||
|
for method, func in pairs(methods) do
|
||||||
|
widget[method] = func
|
||||||
|
end
|
||||||
|
dropdown.parentgroup = widget
|
||||||
|
|
||||||
|
return AceGUI:RegisterAsContainer(widget)
|
||||||
|
end
|
||||||
|
|
||||||
|
AceGUI:RegisterWidgetType(Type, Constructor, Version)
|
|
@ -0,0 +1,316 @@
|
||||||
|
--[[-----------------------------------------------------------------------------
|
||||||
|
Frame Container
|
||||||
|
-------------------------------------------------------------------------------]]
|
||||||
|
local Type, Version = "Frame", 26
|
||||||
|
local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
|
||||||
|
if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
|
||||||
|
|
||||||
|
-- Lua APIs
|
||||||
|
local pairs, assert, type = pairs, assert, type
|
||||||
|
local wipe = table.wipe
|
||||||
|
|
||||||
|
-- WoW APIs
|
||||||
|
local PlaySound = PlaySound
|
||||||
|
local CreateFrame, UIParent = CreateFrame, UIParent
|
||||||
|
|
||||||
|
-- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
|
||||||
|
-- List them here for Mikk's FindGlobals script
|
||||||
|
-- GLOBALS: CLOSE
|
||||||
|
|
||||||
|
--[[-----------------------------------------------------------------------------
|
||||||
|
Scripts
|
||||||
|
-------------------------------------------------------------------------------]]
|
||||||
|
local function Button_OnClick(frame)
|
||||||
|
PlaySound(PlaySoundKitID and "gsTitleOptionExit" or 799) -- SOUNDKIT.GS_TITLE_OPTION_EXIT
|
||||||
|
frame.obj:Hide()
|
||||||
|
end
|
||||||
|
|
||||||
|
local function Frame_OnShow(frame)
|
||||||
|
frame.obj:Fire("OnShow")
|
||||||
|
end
|
||||||
|
|
||||||
|
local function Frame_OnClose(frame)
|
||||||
|
frame.obj:Fire("OnClose")
|
||||||
|
end
|
||||||
|
|
||||||
|
local function Frame_OnMouseDown(frame)
|
||||||
|
AceGUI:ClearFocus()
|
||||||
|
end
|
||||||
|
|
||||||
|
local function Title_OnMouseDown(frame)
|
||||||
|
frame:GetParent():StartMoving()
|
||||||
|
AceGUI:ClearFocus()
|
||||||
|
end
|
||||||
|
|
||||||
|
local function MoverSizer_OnMouseUp(mover)
|
||||||
|
local frame = mover:GetParent()
|
||||||
|
frame:StopMovingOrSizing()
|
||||||
|
local self = frame.obj
|
||||||
|
local status = self.status or self.localstatus
|
||||||
|
status.width = frame:GetWidth()
|
||||||
|
status.height = frame:GetHeight()
|
||||||
|
status.top = frame:GetTop()
|
||||||
|
status.left = frame:GetLeft()
|
||||||
|
end
|
||||||
|
|
||||||
|
local function SizerSE_OnMouseDown(frame)
|
||||||
|
frame:GetParent():StartSizing("BOTTOMRIGHT")
|
||||||
|
AceGUI:ClearFocus()
|
||||||
|
end
|
||||||
|
|
||||||
|
local function SizerS_OnMouseDown(frame)
|
||||||
|
frame:GetParent():StartSizing("BOTTOM")
|
||||||
|
AceGUI:ClearFocus()
|
||||||
|
end
|
||||||
|
|
||||||
|
local function SizerE_OnMouseDown(frame)
|
||||||
|
frame:GetParent():StartSizing("RIGHT")
|
||||||
|
AceGUI:ClearFocus()
|
||||||
|
end
|
||||||
|
|
||||||
|
local function StatusBar_OnEnter(frame)
|
||||||
|
frame.obj:Fire("OnEnterStatusBar")
|
||||||
|
end
|
||||||
|
|
||||||
|
local function StatusBar_OnLeave(frame)
|
||||||
|
frame.obj:Fire("OnLeaveStatusBar")
|
||||||
|
end
|
||||||
|
|
||||||
|
--[[-----------------------------------------------------------------------------
|
||||||
|
Methods
|
||||||
|
-------------------------------------------------------------------------------]]
|
||||||
|
local methods = {
|
||||||
|
["OnAcquire"] = function(self)
|
||||||
|
self.frame:SetParent(UIParent)
|
||||||
|
self.frame:SetFrameStrata("FULLSCREEN_DIALOG")
|
||||||
|
self:SetTitle()
|
||||||
|
self:SetStatusText()
|
||||||
|
self:ApplyStatus()
|
||||||
|
self:Show()
|
||||||
|
self:EnableResize(true)
|
||||||
|
end,
|
||||||
|
|
||||||
|
["OnRelease"] = function(self)
|
||||||
|
self.status = nil
|
||||||
|
wipe(self.localstatus)
|
||||||
|
end,
|
||||||
|
|
||||||
|
["OnWidthSet"] = function(self, width)
|
||||||
|
local content = self.content
|
||||||
|
local contentwidth = width - 34
|
||||||
|
if contentwidth < 0 then
|
||||||
|
contentwidth = 0
|
||||||
|
end
|
||||||
|
content:SetWidth(contentwidth)
|
||||||
|
content.width = contentwidth
|
||||||
|
end,
|
||||||
|
|
||||||
|
["OnHeightSet"] = function(self, height)
|
||||||
|
local content = self.content
|
||||||
|
local contentheight = height - 57
|
||||||
|
if contentheight < 0 then
|
||||||
|
contentheight = 0
|
||||||
|
end
|
||||||
|
content:SetHeight(contentheight)
|
||||||
|
content.height = contentheight
|
||||||
|
end,
|
||||||
|
|
||||||
|
["SetTitle"] = function(self, title)
|
||||||
|
self.titletext:SetText(title)
|
||||||
|
self.titlebg:SetWidth((self.titletext:GetWidth() or 0) + 10)
|
||||||
|
end,
|
||||||
|
|
||||||
|
["SetStatusText"] = function(self, text)
|
||||||
|
self.statustext:SetText(text)
|
||||||
|
end,
|
||||||
|
|
||||||
|
["Hide"] = function(self)
|
||||||
|
self.frame:Hide()
|
||||||
|
end,
|
||||||
|
|
||||||
|
["Show"] = function(self)
|
||||||
|
self.frame:Show()
|
||||||
|
end,
|
||||||
|
|
||||||
|
["EnableResize"] = function(self, state)
|
||||||
|
local func = state and "Show" or "Hide"
|
||||||
|
self.sizer_se[func](self.sizer_se)
|
||||||
|
self.sizer_s[func](self.sizer_s)
|
||||||
|
self.sizer_e[func](self.sizer_e)
|
||||||
|
end,
|
||||||
|
|
||||||
|
-- called to set an external table to store status in
|
||||||
|
["SetStatusTable"] = function(self, status)
|
||||||
|
assert(type(status) == "table")
|
||||||
|
self.status = status
|
||||||
|
self:ApplyStatus()
|
||||||
|
end,
|
||||||
|
|
||||||
|
["ApplyStatus"] = function(self)
|
||||||
|
local status = self.status or self.localstatus
|
||||||
|
local frame = self.frame
|
||||||
|
self:SetWidth(status.width or 700)
|
||||||
|
self:SetHeight(status.height or 500)
|
||||||
|
frame:ClearAllPoints()
|
||||||
|
if status.top and status.left then
|
||||||
|
frame:SetPoint("TOP", UIParent, "BOTTOM", 0, status.top)
|
||||||
|
frame:SetPoint("LEFT", UIParent, "LEFT", status.left, 0)
|
||||||
|
else
|
||||||
|
frame:SetPoint("CENTER")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
}
|
||||||
|
|
||||||
|
--[[-----------------------------------------------------------------------------
|
||||||
|
Constructor
|
||||||
|
-------------------------------------------------------------------------------]]
|
||||||
|
local FrameBackdrop = {
|
||||||
|
bgFile = "Interface\\DialogFrame\\UI-DialogBox-Background",
|
||||||
|
edgeFile = "Interface\\DialogFrame\\UI-DialogBox-Border",
|
||||||
|
tile = true, tileSize = 32, edgeSize = 32,
|
||||||
|
insets = { left = 8, right = 8, top = 8, bottom = 8 }
|
||||||
|
}
|
||||||
|
|
||||||
|
local PaneBackdrop = {
|
||||||
|
bgFile = "Interface\\ChatFrame\\ChatFrameBackground",
|
||||||
|
edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border",
|
||||||
|
tile = true, tileSize = 16, edgeSize = 16,
|
||||||
|
insets = { left = 3, right = 3, top = 5, bottom = 3 }
|
||||||
|
}
|
||||||
|
|
||||||
|
local function Constructor()
|
||||||
|
local frame = CreateFrame("Frame", nil, UIParent)
|
||||||
|
frame:Hide()
|
||||||
|
|
||||||
|
frame:EnableMouse(true)
|
||||||
|
frame:SetMovable(true)
|
||||||
|
frame:SetResizable(true)
|
||||||
|
frame:SetFrameStrata("FULLSCREEN_DIALOG")
|
||||||
|
frame:SetBackdrop(FrameBackdrop)
|
||||||
|
frame:SetBackdropColor(0, 0, 0, 1)
|
||||||
|
frame:SetMinResize(400, 200)
|
||||||
|
frame:SetToplevel(true)
|
||||||
|
frame:SetScript("OnShow", Frame_OnShow)
|
||||||
|
frame:SetScript("OnHide", Frame_OnClose)
|
||||||
|
frame:SetScript("OnMouseDown", Frame_OnMouseDown)
|
||||||
|
|
||||||
|
local closebutton = CreateFrame("Button", nil, frame, "UIPanelButtonTemplate")
|
||||||
|
closebutton:SetScript("OnClick", Button_OnClick)
|
||||||
|
closebutton:SetPoint("BOTTOMRIGHT", -27, 17)
|
||||||
|
closebutton:SetHeight(20)
|
||||||
|
closebutton:SetWidth(100)
|
||||||
|
closebutton:SetText(CLOSE)
|
||||||
|
|
||||||
|
local statusbg = CreateFrame("Button", nil, frame)
|
||||||
|
statusbg:SetPoint("BOTTOMLEFT", 15, 15)
|
||||||
|
statusbg:SetPoint("BOTTOMRIGHT", -132, 15)
|
||||||
|
statusbg:SetHeight(24)
|
||||||
|
statusbg:SetBackdrop(PaneBackdrop)
|
||||||
|
statusbg:SetBackdropColor(0.1,0.1,0.1)
|
||||||
|
statusbg:SetBackdropBorderColor(0.4,0.4,0.4)
|
||||||
|
statusbg:SetScript("OnEnter", StatusBar_OnEnter)
|
||||||
|
statusbg:SetScript("OnLeave", StatusBar_OnLeave)
|
||||||
|
|
||||||
|
local statustext = statusbg:CreateFontString(nil, "OVERLAY", "GameFontNormal")
|
||||||
|
statustext:SetPoint("TOPLEFT", 7, -2)
|
||||||
|
statustext:SetPoint("BOTTOMRIGHT", -7, 2)
|
||||||
|
statustext:SetHeight(20)
|
||||||
|
statustext:SetJustifyH("LEFT")
|
||||||
|
statustext:SetText("")
|
||||||
|
|
||||||
|
local titlebg = frame:CreateTexture(nil, "OVERLAY")
|
||||||
|
titlebg:SetTexture("Interface\\DialogFrame\\UI-DialogBox-Header")
|
||||||
|
titlebg:SetTexCoord(0.31, 0.67, 0, 0.63)
|
||||||
|
titlebg:SetPoint("TOP", 0, 12)
|
||||||
|
titlebg:SetWidth(100)
|
||||||
|
titlebg:SetHeight(40)
|
||||||
|
|
||||||
|
local title = CreateFrame("Frame", nil, frame)
|
||||||
|
title:EnableMouse(true)
|
||||||
|
title:SetScript("OnMouseDown", Title_OnMouseDown)
|
||||||
|
title:SetScript("OnMouseUp", MoverSizer_OnMouseUp)
|
||||||
|
title:SetAllPoints(titlebg)
|
||||||
|
|
||||||
|
local titletext = title:CreateFontString(nil, "OVERLAY", "GameFontNormal")
|
||||||
|
titletext:SetPoint("TOP", titlebg, "TOP", 0, -14)
|
||||||
|
|
||||||
|
local titlebg_l = frame:CreateTexture(nil, "OVERLAY")
|
||||||
|
titlebg_l:SetTexture("Interface\\DialogFrame\\UI-DialogBox-Header")
|
||||||
|
titlebg_l:SetTexCoord(0.21, 0.31, 0, 0.63)
|
||||||
|
titlebg_l:SetPoint("RIGHT", titlebg, "LEFT")
|
||||||
|
titlebg_l:SetWidth(30)
|
||||||
|
titlebg_l:SetHeight(40)
|
||||||
|
|
||||||
|
local titlebg_r = frame:CreateTexture(nil, "OVERLAY")
|
||||||
|
titlebg_r:SetTexture("Interface\\DialogFrame\\UI-DialogBox-Header")
|
||||||
|
titlebg_r:SetTexCoord(0.67, 0.77, 0, 0.63)
|
||||||
|
titlebg_r:SetPoint("LEFT", titlebg, "RIGHT")
|
||||||
|
titlebg_r:SetWidth(30)
|
||||||
|
titlebg_r:SetHeight(40)
|
||||||
|
|
||||||
|
local sizer_se = CreateFrame("Frame", nil, frame)
|
||||||
|
sizer_se:SetPoint("BOTTOMRIGHT")
|
||||||
|
sizer_se:SetWidth(25)
|
||||||
|
sizer_se:SetHeight(25)
|
||||||
|
sizer_se:EnableMouse()
|
||||||
|
sizer_se:SetScript("OnMouseDown",SizerSE_OnMouseDown)
|
||||||
|
sizer_se:SetScript("OnMouseUp", MoverSizer_OnMouseUp)
|
||||||
|
|
||||||
|
local line1 = sizer_se:CreateTexture(nil, "BACKGROUND")
|
||||||
|
line1:SetWidth(14)
|
||||||
|
line1:SetHeight(14)
|
||||||
|
line1:SetPoint("BOTTOMRIGHT", -8, 8)
|
||||||
|
line1:SetTexture("Interface\\Tooltips\\UI-Tooltip-Border")
|
||||||
|
local x = 0.1 * 14/17
|
||||||
|
line1:SetTexCoord(0.05 - x, 0.5, 0.05, 0.5 + x, 0.05, 0.5 - x, 0.5 + x, 0.5)
|
||||||
|
|
||||||
|
local line2 = sizer_se:CreateTexture(nil, "BACKGROUND")
|
||||||
|
line2:SetWidth(8)
|
||||||
|
line2:SetHeight(8)
|
||||||
|
line2:SetPoint("BOTTOMRIGHT", -8, 8)
|
||||||
|
line2:SetTexture("Interface\\Tooltips\\UI-Tooltip-Border")
|
||||||
|
local x = 0.1 * 8/17
|
||||||
|
line2:SetTexCoord(0.05 - x, 0.5, 0.05, 0.5 + x, 0.05, 0.5 - x, 0.5 + x, 0.5)
|
||||||
|
|
||||||
|
local sizer_s = CreateFrame("Frame", nil, frame)
|
||||||
|
sizer_s:SetPoint("BOTTOMRIGHT", -25, 0)
|
||||||
|
sizer_s:SetPoint("BOTTOMLEFT")
|
||||||
|
sizer_s:SetHeight(25)
|
||||||
|
sizer_s:EnableMouse(true)
|
||||||
|
sizer_s:SetScript("OnMouseDown", SizerS_OnMouseDown)
|
||||||
|
sizer_s:SetScript("OnMouseUp", MoverSizer_OnMouseUp)
|
||||||
|
|
||||||
|
local sizer_e = CreateFrame("Frame", nil, frame)
|
||||||
|
sizer_e:SetPoint("BOTTOMRIGHT", 0, 25)
|
||||||
|
sizer_e:SetPoint("TOPRIGHT")
|
||||||
|
sizer_e:SetWidth(25)
|
||||||
|
sizer_e:EnableMouse(true)
|
||||||
|
sizer_e:SetScript("OnMouseDown", SizerE_OnMouseDown)
|
||||||
|
sizer_e:SetScript("OnMouseUp", MoverSizer_OnMouseUp)
|
||||||
|
|
||||||
|
--Container Support
|
||||||
|
local content = CreateFrame("Frame", nil, frame)
|
||||||
|
content:SetPoint("TOPLEFT", 17, -27)
|
||||||
|
content:SetPoint("BOTTOMRIGHT", -17, 40)
|
||||||
|
|
||||||
|
local widget = {
|
||||||
|
localstatus = {},
|
||||||
|
titletext = titletext,
|
||||||
|
statustext = statustext,
|
||||||
|
titlebg = titlebg,
|
||||||
|
sizer_se = sizer_se,
|
||||||
|
sizer_s = sizer_s,
|
||||||
|
sizer_e = sizer_e,
|
||||||
|
content = content,
|
||||||
|
frame = frame,
|
||||||
|
type = Type
|
||||||
|
}
|
||||||
|
for method, func in pairs(methods) do
|
||||||
|
widget[method] = func
|
||||||
|
end
|
||||||
|
closebutton.obj, statusbg.obj = widget, widget
|
||||||
|
|
||||||
|
return AceGUI:RegisterAsContainer(widget)
|
||||||
|
end
|
||||||
|
|
||||||
|
AceGUI:RegisterWidgetType(Type, Constructor, Version)
|
|
@ -0,0 +1,103 @@
|
||||||
|
--[[-----------------------------------------------------------------------------
|
||||||
|
InlineGroup Container
|
||||||
|
Simple container widget that creates a visible "box" with an optional title.
|
||||||
|
-------------------------------------------------------------------------------]]
|
||||||
|
local Type, Version = "InlineGroup", 21
|
||||||
|
local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
|
||||||
|
if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
|
||||||
|
|
||||||
|
-- Lua APIs
|
||||||
|
local pairs = pairs
|
||||||
|
|
||||||
|
-- WoW APIs
|
||||||
|
local CreateFrame, UIParent = CreateFrame, UIParent
|
||||||
|
|
||||||
|
--[[-----------------------------------------------------------------------------
|
||||||
|
Methods
|
||||||
|
-------------------------------------------------------------------------------]]
|
||||||
|
local methods = {
|
||||||
|
["OnAcquire"] = function(self)
|
||||||
|
self:SetWidth(300)
|
||||||
|
self:SetHeight(100)
|
||||||
|
self:SetTitle("")
|
||||||
|
end,
|
||||||
|
|
||||||
|
-- ["OnRelease"] = nil,
|
||||||
|
|
||||||
|
["SetTitle"] = function(self,title)
|
||||||
|
self.titletext:SetText(title)
|
||||||
|
end,
|
||||||
|
|
||||||
|
|
||||||
|
["LayoutFinished"] = function(self, width, height)
|
||||||
|
if self.noAutoHeight then return end
|
||||||
|
self:SetHeight((height or 0) + 40)
|
||||||
|
end,
|
||||||
|
|
||||||
|
["OnWidthSet"] = function(self, width)
|
||||||
|
local content = self.content
|
||||||
|
local contentwidth = width - 20
|
||||||
|
if contentwidth < 0 then
|
||||||
|
contentwidth = 0
|
||||||
|
end
|
||||||
|
content:SetWidth(contentwidth)
|
||||||
|
content.width = contentwidth
|
||||||
|
end,
|
||||||
|
|
||||||
|
["OnHeightSet"] = function(self, height)
|
||||||
|
local content = self.content
|
||||||
|
local contentheight = height - 20
|
||||||
|
if contentheight < 0 then
|
||||||
|
contentheight = 0
|
||||||
|
end
|
||||||
|
content:SetHeight(contentheight)
|
||||||
|
content.height = contentheight
|
||||||
|
end
|
||||||
|
}
|
||||||
|
|
||||||
|
--[[-----------------------------------------------------------------------------
|
||||||
|
Constructor
|
||||||
|
-------------------------------------------------------------------------------]]
|
||||||
|
local PaneBackdrop = {
|
||||||
|
bgFile = "Interface\\ChatFrame\\ChatFrameBackground",
|
||||||
|
edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border",
|
||||||
|
tile = true, tileSize = 16, edgeSize = 16,
|
||||||
|
insets = { left = 3, right = 3, top = 5, bottom = 3 }
|
||||||
|
}
|
||||||
|
|
||||||
|
local function Constructor()
|
||||||
|
local frame = CreateFrame("Frame", nil, UIParent)
|
||||||
|
frame:SetFrameStrata("FULLSCREEN_DIALOG")
|
||||||
|
|
||||||
|
local titletext = frame:CreateFontString(nil, "OVERLAY", "GameFontNormal")
|
||||||
|
titletext:SetPoint("TOPLEFT", 14, 0)
|
||||||
|
titletext:SetPoint("TOPRIGHT", -14, 0)
|
||||||
|
titletext:SetJustifyH("LEFT")
|
||||||
|
titletext:SetHeight(18)
|
||||||
|
|
||||||
|
local border = CreateFrame("Frame", nil, frame)
|
||||||
|
border:SetPoint("TOPLEFT", 0, -17)
|
||||||
|
border:SetPoint("BOTTOMRIGHT", -1, 3)
|
||||||
|
border:SetBackdrop(PaneBackdrop)
|
||||||
|
border:SetBackdropColor(0.1, 0.1, 0.1, 0.5)
|
||||||
|
border:SetBackdropBorderColor(0.4, 0.4, 0.4)
|
||||||
|
|
||||||
|
--Container Support
|
||||||
|
local content = CreateFrame("Frame", nil, border)
|
||||||
|
content:SetPoint("TOPLEFT", 10, -10)
|
||||||
|
content:SetPoint("BOTTOMRIGHT", -10, 10)
|
||||||
|
|
||||||
|
local widget = {
|
||||||
|
frame = frame,
|
||||||
|
content = content,
|
||||||
|
titletext = titletext,
|
||||||
|
type = Type
|
||||||
|
}
|
||||||
|
for method, func in pairs(methods) do
|
||||||
|
widget[method] = func
|
||||||
|
end
|
||||||
|
|
||||||
|
return AceGUI:RegisterAsContainer(widget)
|
||||||
|
end
|
||||||
|
|
||||||
|
AceGUI:RegisterWidgetType(Type, Constructor, Version)
|
|
@ -0,0 +1,204 @@
|
||||||
|
--[[-----------------------------------------------------------------------------
|
||||||
|
ScrollFrame Container
|
||||||
|
Plain container that scrolls its content and doesn't grow in height.
|
||||||
|
-------------------------------------------------------------------------------]]
|
||||||
|
local Type, Version = "ScrollFrame", 24
|
||||||
|
local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
|
||||||
|
if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
|
||||||
|
|
||||||
|
-- Lua APIs
|
||||||
|
local pairs, assert, type = pairs, assert, type
|
||||||
|
local min, max, floor, abs = math.min, math.max, math.floor, math.abs
|
||||||
|
|
||||||
|
-- WoW APIs
|
||||||
|
local CreateFrame, UIParent = CreateFrame, UIParent
|
||||||
|
|
||||||
|
--[[-----------------------------------------------------------------------------
|
||||||
|
Support functions
|
||||||
|
-------------------------------------------------------------------------------]]
|
||||||
|
local function FixScrollOnUpdate(frame)
|
||||||
|
frame:SetScript("OnUpdate", nil)
|
||||||
|
frame.obj:FixScroll()
|
||||||
|
end
|
||||||
|
|
||||||
|
--[[-----------------------------------------------------------------------------
|
||||||
|
Scripts
|
||||||
|
-------------------------------------------------------------------------------]]
|
||||||
|
local function ScrollFrame_OnMouseWheel(frame, value)
|
||||||
|
frame.obj:MoveScroll(value)
|
||||||
|
end
|
||||||
|
|
||||||
|
local function ScrollFrame_OnSizeChanged(frame)
|
||||||
|
frame:SetScript("OnUpdate", FixScrollOnUpdate)
|
||||||
|
end
|
||||||
|
|
||||||
|
local function ScrollBar_OnScrollValueChanged(frame, value)
|
||||||
|
frame.obj:SetScroll(value)
|
||||||
|
end
|
||||||
|
|
||||||
|
--[[-----------------------------------------------------------------------------
|
||||||
|
Methods
|
||||||
|
-------------------------------------------------------------------------------]]
|
||||||
|
local methods = {
|
||||||
|
["OnAcquire"] = function(self)
|
||||||
|
self:SetScroll(0)
|
||||||
|
self.scrollframe:SetScript("OnUpdate", FixScrollOnUpdate)
|
||||||
|
end,
|
||||||
|
|
||||||
|
["OnRelease"] = function(self)
|
||||||
|
self.status = nil
|
||||||
|
for k in pairs(self.localstatus) do
|
||||||
|
self.localstatus[k] = nil
|
||||||
|
end
|
||||||
|
self.scrollframe:SetPoint("BOTTOMRIGHT")
|
||||||
|
self.scrollbar:Hide()
|
||||||
|
self.scrollBarShown = nil
|
||||||
|
self.content.height, self.content.width = nil, nil
|
||||||
|
end,
|
||||||
|
|
||||||
|
["SetScroll"] = function(self, value)
|
||||||
|
local status = self.status or self.localstatus
|
||||||
|
local viewheight = self.scrollframe:GetHeight()
|
||||||
|
local height = self.content:GetHeight()
|
||||||
|
local offset
|
||||||
|
|
||||||
|
if viewheight > height then
|
||||||
|
offset = 0
|
||||||
|
else
|
||||||
|
offset = floor((height - viewheight) / 1000.0 * value)
|
||||||
|
end
|
||||||
|
self.content:ClearAllPoints()
|
||||||
|
self.content:SetPoint("TOPLEFT", 0, offset)
|
||||||
|
self.content:SetPoint("TOPRIGHT", 0, offset)
|
||||||
|
status.offset = offset
|
||||||
|
status.scrollvalue = value
|
||||||
|
end,
|
||||||
|
|
||||||
|
["MoveScroll"] = function(self, value)
|
||||||
|
local status = self.status or self.localstatus
|
||||||
|
local height, viewheight = self.scrollframe:GetHeight(), self.content:GetHeight()
|
||||||
|
|
||||||
|
if self.scrollBarShown then
|
||||||
|
local diff = height - viewheight
|
||||||
|
local delta = 1
|
||||||
|
if value < 0 then
|
||||||
|
delta = -1
|
||||||
|
end
|
||||||
|
self.scrollbar:SetValue(min(max(status.scrollvalue + delta*(1000/(diff/45)),0), 1000))
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
|
||||||
|
["FixScroll"] = function(self)
|
||||||
|
if self.updateLock then return end
|
||||||
|
self.updateLock = true
|
||||||
|
local status = self.status or self.localstatus
|
||||||
|
local height, viewheight = self.scrollframe:GetHeight(), self.content:GetHeight()
|
||||||
|
local offset = status.offset or 0
|
||||||
|
local curvalue = self.scrollbar:GetValue()
|
||||||
|
-- Give us a margin of error of 2 pixels to stop some conditions that i would blame on floating point inaccuracys
|
||||||
|
-- No-one is going to miss 2 pixels at the bottom of the frame, anyhow!
|
||||||
|
if viewheight < height + 2 then
|
||||||
|
if self.scrollBarShown then
|
||||||
|
self.scrollBarShown = nil
|
||||||
|
self.scrollbar:Hide()
|
||||||
|
self.scrollbar:SetValue(0)
|
||||||
|
self.scrollframe:SetPoint("BOTTOMRIGHT")
|
||||||
|
self:DoLayout()
|
||||||
|
end
|
||||||
|
else
|
||||||
|
if not self.scrollBarShown then
|
||||||
|
self.scrollBarShown = true
|
||||||
|
self.scrollbar:Show()
|
||||||
|
self.scrollframe:SetPoint("BOTTOMRIGHT", -20, 0)
|
||||||
|
self:DoLayout()
|
||||||
|
end
|
||||||
|
local value = (offset / (viewheight - height) * 1000)
|
||||||
|
if value > 1000 then value = 1000 end
|
||||||
|
self.scrollbar:SetValue(value)
|
||||||
|
self:SetScroll(value)
|
||||||
|
if value < 1000 then
|
||||||
|
self.content:ClearAllPoints()
|
||||||
|
self.content:SetPoint("TOPLEFT", 0, offset)
|
||||||
|
self.content:SetPoint("TOPRIGHT", 0, offset)
|
||||||
|
status.offset = offset
|
||||||
|
end
|
||||||
|
end
|
||||||
|
self.updateLock = nil
|
||||||
|
end,
|
||||||
|
|
||||||
|
["LayoutFinished"] = function(self, width, height)
|
||||||
|
self.content:SetHeight(height or 0 + 20)
|
||||||
|
self.scrollframe:SetScript("OnUpdate", FixScrollOnUpdate)
|
||||||
|
end,
|
||||||
|
|
||||||
|
["SetStatusTable"] = function(self, status)
|
||||||
|
assert(type(status) == "table")
|
||||||
|
self.status = status
|
||||||
|
if not status.scrollvalue then
|
||||||
|
status.scrollvalue = 0
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
|
||||||
|
["OnWidthSet"] = function(self, width)
|
||||||
|
local content = self.content
|
||||||
|
content.width = width
|
||||||
|
end,
|
||||||
|
|
||||||
|
["OnHeightSet"] = function(self, height)
|
||||||
|
local content = self.content
|
||||||
|
content.height = height
|
||||||
|
end
|
||||||
|
}
|
||||||
|
--[[-----------------------------------------------------------------------------
|
||||||
|
Constructor
|
||||||
|
-------------------------------------------------------------------------------]]
|
||||||
|
local function Constructor()
|
||||||
|
local frame = CreateFrame("Frame", nil, UIParent)
|
||||||
|
local num = AceGUI:GetNextWidgetNum(Type)
|
||||||
|
|
||||||
|
local scrollframe = CreateFrame("ScrollFrame", nil, frame)
|
||||||
|
scrollframe:SetPoint("TOPLEFT")
|
||||||
|
scrollframe:SetPoint("BOTTOMRIGHT")
|
||||||
|
scrollframe:EnableMouseWheel(true)
|
||||||
|
scrollframe:SetScript("OnMouseWheel", ScrollFrame_OnMouseWheel)
|
||||||
|
scrollframe:SetScript("OnSizeChanged", ScrollFrame_OnSizeChanged)
|
||||||
|
|
||||||
|
local scrollbar = CreateFrame("Slider", ("AceConfigDialogScrollFrame%dScrollBar"):format(num), scrollframe, "UIPanelScrollBarTemplate")
|
||||||
|
scrollbar:SetPoint("TOPLEFT", scrollframe, "TOPRIGHT", 4, -16)
|
||||||
|
scrollbar:SetPoint("BOTTOMLEFT", scrollframe, "BOTTOMRIGHT", 4, 16)
|
||||||
|
scrollbar:SetMinMaxValues(0, 1000)
|
||||||
|
scrollbar:SetValueStep(1)
|
||||||
|
scrollbar:SetValue(0)
|
||||||
|
scrollbar:SetWidth(16)
|
||||||
|
scrollbar:Hide()
|
||||||
|
-- set the script as the last step, so it doesn't fire yet
|
||||||
|
scrollbar:SetScript("OnValueChanged", ScrollBar_OnScrollValueChanged)
|
||||||
|
|
||||||
|
local scrollbg = scrollbar:CreateTexture(nil, "BACKGROUND")
|
||||||
|
scrollbg:SetAllPoints(scrollbar)
|
||||||
|
scrollbg:SetColorTexture(0, 0, 0, 0.4)
|
||||||
|
|
||||||
|
--Container Support
|
||||||
|
local content = CreateFrame("Frame", nil, scrollframe)
|
||||||
|
content:SetPoint("TOPLEFT")
|
||||||
|
content:SetPoint("TOPRIGHT")
|
||||||
|
content:SetHeight(400)
|
||||||
|
scrollframe:SetScrollChild(content)
|
||||||
|
|
||||||
|
local widget = {
|
||||||
|
localstatus = { scrollvalue = 0 },
|
||||||
|
scrollframe = scrollframe,
|
||||||
|
scrollbar = scrollbar,
|
||||||
|
content = content,
|
||||||
|
frame = frame,
|
||||||
|
type = Type
|
||||||
|
}
|
||||||
|
for method, func in pairs(methods) do
|
||||||
|
widget[method] = func
|
||||||
|
end
|
||||||
|
scrollframe.obj, scrollbar.obj = widget, widget
|
||||||
|
|
||||||
|
return AceGUI:RegisterAsContainer(widget)
|
||||||
|
end
|
||||||
|
|
||||||
|
AceGUI:RegisterWidgetType(Type, Constructor, Version)
|
|
@ -0,0 +1,69 @@
|
||||||
|
--[[-----------------------------------------------------------------------------
|
||||||
|
SimpleGroup Container
|
||||||
|
Simple container widget that just groups widgets.
|
||||||
|
-------------------------------------------------------------------------------]]
|
||||||
|
local Type, Version = "SimpleGroup", 20
|
||||||
|
local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
|
||||||
|
if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
|
||||||
|
|
||||||
|
-- Lua APIs
|
||||||
|
local pairs = pairs
|
||||||
|
|
||||||
|
-- WoW APIs
|
||||||
|
local CreateFrame, UIParent = CreateFrame, UIParent
|
||||||
|
|
||||||
|
|
||||||
|
--[[-----------------------------------------------------------------------------
|
||||||
|
Methods
|
||||||
|
-------------------------------------------------------------------------------]]
|
||||||
|
local methods = {
|
||||||
|
["OnAcquire"] = function(self)
|
||||||
|
self:SetWidth(300)
|
||||||
|
self:SetHeight(100)
|
||||||
|
end,
|
||||||
|
|
||||||
|
-- ["OnRelease"] = nil,
|
||||||
|
|
||||||
|
["LayoutFinished"] = function(self, width, height)
|
||||||
|
if self.noAutoHeight then return end
|
||||||
|
self:SetHeight(height or 0)
|
||||||
|
end,
|
||||||
|
|
||||||
|
["OnWidthSet"] = function(self, width)
|
||||||
|
local content = self.content
|
||||||
|
content:SetWidth(width)
|
||||||
|
content.width = width
|
||||||
|
end,
|
||||||
|
|
||||||
|
["OnHeightSet"] = function(self, height)
|
||||||
|
local content = self.content
|
||||||
|
content:SetHeight(height)
|
||||||
|
content.height = height
|
||||||
|
end
|
||||||
|
}
|
||||||
|
|
||||||
|
--[[-----------------------------------------------------------------------------
|
||||||
|
Constructor
|
||||||
|
-------------------------------------------------------------------------------]]
|
||||||
|
local function Constructor()
|
||||||
|
local frame = CreateFrame("Frame", nil, UIParent)
|
||||||
|
frame:SetFrameStrata("FULLSCREEN_DIALOG")
|
||||||
|
|
||||||
|
--Container Support
|
||||||
|
local content = CreateFrame("Frame", nil, frame)
|
||||||
|
content:SetPoint("TOPLEFT")
|
||||||
|
content:SetPoint("BOTTOMRIGHT")
|
||||||
|
|
||||||
|
local widget = {
|
||||||
|
frame = frame,
|
||||||
|
content = content,
|
||||||
|
type = Type
|
||||||
|
}
|
||||||
|
for method, func in pairs(methods) do
|
||||||
|
widget[method] = func
|
||||||
|
end
|
||||||
|
|
||||||
|
return AceGUI:RegisterAsContainer(widget)
|
||||||
|
end
|
||||||
|
|
||||||
|
AceGUI:RegisterWidgetType(Type, Constructor, Version)
|
|
@ -0,0 +1,350 @@
|
||||||
|
--[[-----------------------------------------------------------------------------
|
||||||
|
TabGroup Container
|
||||||
|
Container that uses tabs on top to switch between groups.
|
||||||
|
-------------------------------------------------------------------------------]]
|
||||||
|
local Type, Version = "TabGroup", 36
|
||||||
|
local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
|
||||||
|
if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
|
||||||
|
|
||||||
|
-- Lua APIs
|
||||||
|
local pairs, ipairs, assert, type, wipe = pairs, ipairs, assert, type, wipe
|
||||||
|
|
||||||
|
-- WoW APIs
|
||||||
|
local PlaySound = PlaySound
|
||||||
|
local CreateFrame, UIParent = CreateFrame, UIParent
|
||||||
|
local _G = _G
|
||||||
|
|
||||||
|
-- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
|
||||||
|
-- List them here for Mikk's FindGlobals script
|
||||||
|
-- GLOBALS: PanelTemplates_TabResize, PanelTemplates_SetDisabledTabState, PanelTemplates_SelectTab, PanelTemplates_DeselectTab
|
||||||
|
|
||||||
|
-- local upvalue storage used by BuildTabs
|
||||||
|
local widths = {}
|
||||||
|
local rowwidths = {}
|
||||||
|
local rowends = {}
|
||||||
|
|
||||||
|
--[[-----------------------------------------------------------------------------
|
||||||
|
Support functions
|
||||||
|
-------------------------------------------------------------------------------]]
|
||||||
|
local function UpdateTabLook(frame)
|
||||||
|
if frame.disabled then
|
||||||
|
PanelTemplates_SetDisabledTabState(frame)
|
||||||
|
elseif frame.selected then
|
||||||
|
PanelTemplates_SelectTab(frame)
|
||||||
|
else
|
||||||
|
PanelTemplates_DeselectTab(frame)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local function Tab_SetText(frame, text)
|
||||||
|
frame:_SetText(text)
|
||||||
|
local width = frame.obj.frame.width or frame.obj.frame:GetWidth() or 0
|
||||||
|
PanelTemplates_TabResize(frame, 0, nil, nil, width, frame:GetFontString():GetStringWidth())
|
||||||
|
end
|
||||||
|
|
||||||
|
local function Tab_SetSelected(frame, selected)
|
||||||
|
frame.selected = selected
|
||||||
|
UpdateTabLook(frame)
|
||||||
|
end
|
||||||
|
|
||||||
|
local function Tab_SetDisabled(frame, disabled)
|
||||||
|
frame.disabled = disabled
|
||||||
|
UpdateTabLook(frame)
|
||||||
|
end
|
||||||
|
|
||||||
|
local function BuildTabsOnUpdate(frame)
|
||||||
|
local self = frame.obj
|
||||||
|
self:BuildTabs()
|
||||||
|
frame:SetScript("OnUpdate", nil)
|
||||||
|
end
|
||||||
|
|
||||||
|
--[[-----------------------------------------------------------------------------
|
||||||
|
Scripts
|
||||||
|
-------------------------------------------------------------------------------]]
|
||||||
|
local function Tab_OnClick(frame)
|
||||||
|
if not (frame.selected or frame.disabled) then
|
||||||
|
PlaySound(PlaySoundKitID and "igCharacterInfoTab" or 841) -- SOUNDKIT.IG_CHARACTER_INFO_TAB
|
||||||
|
frame.obj:SelectTab(frame.value)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local function Tab_OnEnter(frame)
|
||||||
|
local self = frame.obj
|
||||||
|
self:Fire("OnTabEnter", self.tabs[frame.id].value, frame)
|
||||||
|
end
|
||||||
|
|
||||||
|
local function Tab_OnLeave(frame)
|
||||||
|
local self = frame.obj
|
||||||
|
self:Fire("OnTabLeave", self.tabs[frame.id].value, frame)
|
||||||
|
end
|
||||||
|
|
||||||
|
local function Tab_OnShow(frame)
|
||||||
|
_G[frame:GetName().."HighlightTexture"]:SetWidth(frame:GetTextWidth() + 30)
|
||||||
|
end
|
||||||
|
|
||||||
|
--[[-----------------------------------------------------------------------------
|
||||||
|
Methods
|
||||||
|
-------------------------------------------------------------------------------]]
|
||||||
|
local methods = {
|
||||||
|
["OnAcquire"] = function(self)
|
||||||
|
self:SetTitle()
|
||||||
|
end,
|
||||||
|
|
||||||
|
["OnRelease"] = function(self)
|
||||||
|
self.status = nil
|
||||||
|
for k in pairs(self.localstatus) do
|
||||||
|
self.localstatus[k] = nil
|
||||||
|
end
|
||||||
|
self.tablist = nil
|
||||||
|
for _, tab in pairs(self.tabs) do
|
||||||
|
tab:Hide()
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
|
||||||
|
["CreateTab"] = function(self, id)
|
||||||
|
local tabname = ("AceGUITabGroup%dTab%d"):format(self.num, id)
|
||||||
|
local tab = CreateFrame("Button", tabname, self.border, "OptionsFrameTabButtonTemplate")
|
||||||
|
tab.obj = self
|
||||||
|
tab.id = id
|
||||||
|
|
||||||
|
tab.text = _G[tabname .. "Text"]
|
||||||
|
tab.text:ClearAllPoints()
|
||||||
|
tab.text:SetPoint("LEFT", 14, -3)
|
||||||
|
tab.text:SetPoint("RIGHT", -12, -3)
|
||||||
|
|
||||||
|
tab:SetScript("OnClick", Tab_OnClick)
|
||||||
|
tab:SetScript("OnEnter", Tab_OnEnter)
|
||||||
|
tab:SetScript("OnLeave", Tab_OnLeave)
|
||||||
|
tab:SetScript("OnShow", Tab_OnShow)
|
||||||
|
|
||||||
|
tab._SetText = tab.SetText
|
||||||
|
tab.SetText = Tab_SetText
|
||||||
|
tab.SetSelected = Tab_SetSelected
|
||||||
|
tab.SetDisabled = Tab_SetDisabled
|
||||||
|
|
||||||
|
return tab
|
||||||
|
end,
|
||||||
|
|
||||||
|
["SetTitle"] = function(self, text)
|
||||||
|
self.titletext:SetText(text or "")
|
||||||
|
if text and text ~= "" then
|
||||||
|
self.alignoffset = 25
|
||||||
|
else
|
||||||
|
self.alignoffset = 18
|
||||||
|
end
|
||||||
|
self:BuildTabs()
|
||||||
|
end,
|
||||||
|
|
||||||
|
["SetStatusTable"] = function(self, status)
|
||||||
|
assert(type(status) == "table")
|
||||||
|
self.status = status
|
||||||
|
end,
|
||||||
|
|
||||||
|
["SelectTab"] = function(self, value)
|
||||||
|
local status = self.status or self.localstatus
|
||||||
|
local found
|
||||||
|
for i, v in ipairs(self.tabs) do
|
||||||
|
if v.value == value then
|
||||||
|
v:SetSelected(true)
|
||||||
|
found = true
|
||||||
|
else
|
||||||
|
v:SetSelected(false)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
status.selected = value
|
||||||
|
if found then
|
||||||
|
self:Fire("OnGroupSelected",value)
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
|
||||||
|
["SetTabs"] = function(self, tabs)
|
||||||
|
self.tablist = tabs
|
||||||
|
self:BuildTabs()
|
||||||
|
end,
|
||||||
|
|
||||||
|
|
||||||
|
["BuildTabs"] = function(self)
|
||||||
|
local hastitle = (self.titletext:GetText() and self.titletext:GetText() ~= "")
|
||||||
|
local status = self.status or self.localstatus
|
||||||
|
local tablist = self.tablist
|
||||||
|
local tabs = self.tabs
|
||||||
|
|
||||||
|
if not tablist then return end
|
||||||
|
|
||||||
|
local width = self.frame.width or self.frame:GetWidth() or 0
|
||||||
|
|
||||||
|
wipe(widths)
|
||||||
|
wipe(rowwidths)
|
||||||
|
wipe(rowends)
|
||||||
|
|
||||||
|
--Place Text into tabs and get thier initial width
|
||||||
|
for i, v in ipairs(tablist) do
|
||||||
|
local tab = tabs[i]
|
||||||
|
if not tab then
|
||||||
|
tab = self:CreateTab(i)
|
||||||
|
tabs[i] = tab
|
||||||
|
end
|
||||||
|
|
||||||
|
tab:Show()
|
||||||
|
tab:SetText(v.text)
|
||||||
|
tab:SetDisabled(v.disabled)
|
||||||
|
tab.value = v.value
|
||||||
|
|
||||||
|
widths[i] = tab:GetWidth() - 6 --tabs are anchored 10 pixels from the right side of the previous one to reduce spacing, but add a fixed 4px padding for the text
|
||||||
|
end
|
||||||
|
|
||||||
|
for i = (#tablist)+1, #tabs, 1 do
|
||||||
|
tabs[i]:Hide()
|
||||||
|
end
|
||||||
|
|
||||||
|
--First pass, find the minimum number of rows needed to hold all tabs and the initial tab layout
|
||||||
|
local numtabs = #tablist
|
||||||
|
local numrows = 1
|
||||||
|
local usedwidth = 0
|
||||||
|
|
||||||
|
for i = 1, #tablist do
|
||||||
|
--If this is not the first tab of a row and there isn't room for it
|
||||||
|
if usedwidth ~= 0 and (width - usedwidth - widths[i]) < 0 then
|
||||||
|
rowwidths[numrows] = usedwidth + 10 --first tab in each row takes up an extra 10px
|
||||||
|
rowends[numrows] = i - 1
|
||||||
|
numrows = numrows + 1
|
||||||
|
usedwidth = 0
|
||||||
|
end
|
||||||
|
usedwidth = usedwidth + widths[i]
|
||||||
|
end
|
||||||
|
rowwidths[numrows] = usedwidth + 10 --first tab in each row takes up an extra 10px
|
||||||
|
rowends[numrows] = #tablist
|
||||||
|
|
||||||
|
--Fix for single tabs being left on the last row, move a tab from the row above if applicable
|
||||||
|
if numrows > 1 then
|
||||||
|
--if the last row has only one tab
|
||||||
|
if rowends[numrows-1] == numtabs-1 then
|
||||||
|
--if there are more than 2 tabs in the 2nd last row
|
||||||
|
if (numrows == 2 and rowends[numrows-1] > 2) or (rowends[numrows] - rowends[numrows-1] > 2) then
|
||||||
|
--move 1 tab from the second last row to the last, if there is enough space
|
||||||
|
if (rowwidths[numrows] + widths[numtabs-1]) <= width then
|
||||||
|
rowends[numrows-1] = rowends[numrows-1] - 1
|
||||||
|
rowwidths[numrows] = rowwidths[numrows] + widths[numtabs-1]
|
||||||
|
rowwidths[numrows-1] = rowwidths[numrows-1] - widths[numtabs-1]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
--anchor the rows as defined and resize tabs to fill thier row
|
||||||
|
local starttab = 1
|
||||||
|
for row, endtab in ipairs(rowends) do
|
||||||
|
local first = true
|
||||||
|
for tabno = starttab, endtab do
|
||||||
|
local tab = tabs[tabno]
|
||||||
|
tab:ClearAllPoints()
|
||||||
|
if first then
|
||||||
|
tab:SetPoint("TOPLEFT", self.frame, "TOPLEFT", 0, -(hastitle and 14 or 7)-(row-1)*20 )
|
||||||
|
first = false
|
||||||
|
else
|
||||||
|
tab:SetPoint("LEFT", tabs[tabno-1], "RIGHT", -10, 0)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- equal padding for each tab to fill the available width,
|
||||||
|
-- if the used space is above 75% already
|
||||||
|
-- the 18 pixel is the typical width of a scrollbar, so we can have a tab group inside a scrolling frame,
|
||||||
|
-- and not have the tabs jump around funny when switching between tabs that need scrolling and those that don't
|
||||||
|
local padding = 0
|
||||||
|
if not (numrows == 1 and rowwidths[1] < width*0.75 - 18) then
|
||||||
|
padding = (width - rowwidths[row]) / (endtab - starttab+1)
|
||||||
|
end
|
||||||
|
|
||||||
|
for i = starttab, endtab do
|
||||||
|
PanelTemplates_TabResize(tabs[i], padding + 4, nil, nil, width, tabs[i]:GetFontString():GetStringWidth())
|
||||||
|
end
|
||||||
|
starttab = endtab + 1
|
||||||
|
end
|
||||||
|
|
||||||
|
self.borderoffset = (hastitle and 17 or 10)+((numrows)*20)
|
||||||
|
self.border:SetPoint("TOPLEFT", 1, -self.borderoffset)
|
||||||
|
end,
|
||||||
|
|
||||||
|
["OnWidthSet"] = function(self, width)
|
||||||
|
local content = self.content
|
||||||
|
local contentwidth = width - 60
|
||||||
|
if contentwidth < 0 then
|
||||||
|
contentwidth = 0
|
||||||
|
end
|
||||||
|
content:SetWidth(contentwidth)
|
||||||
|
content.width = contentwidth
|
||||||
|
self:BuildTabs(self)
|
||||||
|
self.frame:SetScript("OnUpdate", BuildTabsOnUpdate)
|
||||||
|
end,
|
||||||
|
|
||||||
|
["OnHeightSet"] = function(self, height)
|
||||||
|
local content = self.content
|
||||||
|
local contentheight = height - (self.borderoffset + 23)
|
||||||
|
if contentheight < 0 then
|
||||||
|
contentheight = 0
|
||||||
|
end
|
||||||
|
content:SetHeight(contentheight)
|
||||||
|
content.height = contentheight
|
||||||
|
end,
|
||||||
|
|
||||||
|
["LayoutFinished"] = function(self, width, height)
|
||||||
|
if self.noAutoHeight then return end
|
||||||
|
self:SetHeight((height or 0) + (self.borderoffset + 23))
|
||||||
|
end
|
||||||
|
}
|
||||||
|
|
||||||
|
--[[-----------------------------------------------------------------------------
|
||||||
|
Constructor
|
||||||
|
-------------------------------------------------------------------------------]]
|
||||||
|
local PaneBackdrop = {
|
||||||
|
bgFile = "Interface\\ChatFrame\\ChatFrameBackground",
|
||||||
|
edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border",
|
||||||
|
tile = true, tileSize = 16, edgeSize = 16,
|
||||||
|
insets = { left = 3, right = 3, top = 5, bottom = 3 }
|
||||||
|
}
|
||||||
|
|
||||||
|
local function Constructor()
|
||||||
|
local num = AceGUI:GetNextWidgetNum(Type)
|
||||||
|
local frame = CreateFrame("Frame",nil,UIParent)
|
||||||
|
frame:SetHeight(100)
|
||||||
|
frame:SetWidth(100)
|
||||||
|
frame:SetFrameStrata("FULLSCREEN_DIALOG")
|
||||||
|
|
||||||
|
local titletext = frame:CreateFontString(nil,"OVERLAY","GameFontNormal")
|
||||||
|
titletext:SetPoint("TOPLEFT", 14, 0)
|
||||||
|
titletext:SetPoint("TOPRIGHT", -14, 0)
|
||||||
|
titletext:SetJustifyH("LEFT")
|
||||||
|
titletext:SetHeight(18)
|
||||||
|
titletext:SetText("")
|
||||||
|
|
||||||
|
local border = CreateFrame("Frame", nil, frame)
|
||||||
|
border:SetPoint("TOPLEFT", 1, -27)
|
||||||
|
border:SetPoint("BOTTOMRIGHT", -1, 3)
|
||||||
|
border:SetBackdrop(PaneBackdrop)
|
||||||
|
border:SetBackdropColor(0.1, 0.1, 0.1, 0.5)
|
||||||
|
border:SetBackdropBorderColor(0.4, 0.4, 0.4)
|
||||||
|
|
||||||
|
local content = CreateFrame("Frame", nil, border)
|
||||||
|
content:SetPoint("TOPLEFT", 10, -7)
|
||||||
|
content:SetPoint("BOTTOMRIGHT", -10, 7)
|
||||||
|
|
||||||
|
local widget = {
|
||||||
|
num = num,
|
||||||
|
frame = frame,
|
||||||
|
localstatus = {},
|
||||||
|
alignoffset = 18,
|
||||||
|
titletext = titletext,
|
||||||
|
border = border,
|
||||||
|
borderoffset = 27,
|
||||||
|
tabs = {},
|
||||||
|
content = content,
|
||||||
|
type = Type
|
||||||
|
}
|
||||||
|
for method, func in pairs(methods) do
|
||||||
|
widget[method] = func
|
||||||
|
end
|
||||||
|
|
||||||
|
return AceGUI:RegisterAsContainer(widget)
|
||||||
|
end
|
||||||
|
|
||||||
|
AceGUI:RegisterWidgetType(Type, Constructor, Version)
|
|
@ -0,0 +1,710 @@
|
||||||
|
--[[-----------------------------------------------------------------------------
|
||||||
|
TreeGroup Container
|
||||||
|
Container that uses a tree control to switch between groups.
|
||||||
|
-------------------------------------------------------------------------------]]
|
||||||
|
local Type, Version = "TreeGroup", 40
|
||||||
|
local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
|
||||||
|
if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
|
||||||
|
|
||||||
|
-- Lua APIs
|
||||||
|
local next, pairs, ipairs, assert, type = next, pairs, ipairs, assert, type
|
||||||
|
local math_min, math_max, floor = math.min, math.max, floor
|
||||||
|
local select, tremove, unpack, tconcat = select, table.remove, unpack, table.concat
|
||||||
|
|
||||||
|
-- WoW APIs
|
||||||
|
local CreateFrame, UIParent = CreateFrame, UIParent
|
||||||
|
|
||||||
|
-- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
|
||||||
|
-- List them here for Mikk's FindGlobals script
|
||||||
|
-- GLOBALS: GameTooltip, FONT_COLOR_CODE_CLOSE
|
||||||
|
|
||||||
|
-- Recycling functions
|
||||||
|
local new, del
|
||||||
|
do
|
||||||
|
local pool = setmetatable({},{__mode='k'})
|
||||||
|
function new()
|
||||||
|
local t = next(pool)
|
||||||
|
if t then
|
||||||
|
pool[t] = nil
|
||||||
|
return t
|
||||||
|
else
|
||||||
|
return {}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
function del(t)
|
||||||
|
for k in pairs(t) do
|
||||||
|
t[k] = nil
|
||||||
|
end
|
||||||
|
pool[t] = true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local DEFAULT_TREE_WIDTH = 175
|
||||||
|
local DEFAULT_TREE_SIZABLE = true
|
||||||
|
|
||||||
|
--[[-----------------------------------------------------------------------------
|
||||||
|
Support functions
|
||||||
|
-------------------------------------------------------------------------------]]
|
||||||
|
local function GetButtonUniqueValue(line)
|
||||||
|
local parent = line.parent
|
||||||
|
if parent and parent.value then
|
||||||
|
return GetButtonUniqueValue(parent).."\001"..line.value
|
||||||
|
else
|
||||||
|
return line.value
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local function UpdateButton(button, treeline, selected, canExpand, isExpanded)
|
||||||
|
local self = button.obj
|
||||||
|
local toggle = button.toggle
|
||||||
|
local frame = self.frame
|
||||||
|
local text = treeline.text or ""
|
||||||
|
local icon = treeline.icon
|
||||||
|
local iconCoords = treeline.iconCoords
|
||||||
|
local level = treeline.level
|
||||||
|
local value = treeline.value
|
||||||
|
local uniquevalue = treeline.uniquevalue
|
||||||
|
local disabled = treeline.disabled
|
||||||
|
|
||||||
|
button.treeline = treeline
|
||||||
|
button.value = value
|
||||||
|
button.uniquevalue = uniquevalue
|
||||||
|
if selected then
|
||||||
|
button:LockHighlight()
|
||||||
|
button.selected = true
|
||||||
|
else
|
||||||
|
button:UnlockHighlight()
|
||||||
|
button.selected = false
|
||||||
|
end
|
||||||
|
local normalTexture = button:GetNormalTexture()
|
||||||
|
local line = button.line
|
||||||
|
button.level = level
|
||||||
|
if ( level == 1 ) then
|
||||||
|
button:SetNormalFontObject("GameFontNormal")
|
||||||
|
button:SetHighlightFontObject("GameFontHighlight")
|
||||||
|
button.text:SetPoint("LEFT", (icon and 16 or 0) + 8, 2)
|
||||||
|
else
|
||||||
|
button:SetNormalFontObject("GameFontHighlightSmall")
|
||||||
|
button:SetHighlightFontObject("GameFontHighlightSmall")
|
||||||
|
button.text:SetPoint("LEFT", (icon and 16 or 0) + 8 * level, 2)
|
||||||
|
end
|
||||||
|
|
||||||
|
if disabled then
|
||||||
|
button:EnableMouse(false)
|
||||||
|
button.text:SetText("|cff808080"..text..FONT_COLOR_CODE_CLOSE)
|
||||||
|
else
|
||||||
|
button.text:SetText(text)
|
||||||
|
button:EnableMouse(true)
|
||||||
|
end
|
||||||
|
|
||||||
|
if icon then
|
||||||
|
button.icon:SetTexture(icon)
|
||||||
|
button.icon:SetPoint("LEFT", 8 * level, (level == 1) and 0 or 1)
|
||||||
|
else
|
||||||
|
button.icon:SetTexture(nil)
|
||||||
|
end
|
||||||
|
|
||||||
|
if iconCoords then
|
||||||
|
button.icon:SetTexCoord(unpack(iconCoords))
|
||||||
|
else
|
||||||
|
button.icon:SetTexCoord(0, 1, 0, 1)
|
||||||
|
end
|
||||||
|
|
||||||
|
if canExpand then
|
||||||
|
if not isExpanded then
|
||||||
|
toggle:SetNormalTexture("Interface\\Buttons\\UI-PlusButton-UP")
|
||||||
|
toggle:SetPushedTexture("Interface\\Buttons\\UI-PlusButton-DOWN")
|
||||||
|
else
|
||||||
|
toggle:SetNormalTexture("Interface\\Buttons\\UI-MinusButton-UP")
|
||||||
|
toggle:SetPushedTexture("Interface\\Buttons\\UI-MinusButton-DOWN")
|
||||||
|
end
|
||||||
|
toggle:Show()
|
||||||
|
else
|
||||||
|
toggle:Hide()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local function ShouldDisplayLevel(tree)
|
||||||
|
local result = false
|
||||||
|
for k, v in ipairs(tree) do
|
||||||
|
if v.children == nil and v.visible ~= false then
|
||||||
|
result = true
|
||||||
|
elseif v.children then
|
||||||
|
result = result or ShouldDisplayLevel(v.children)
|
||||||
|
end
|
||||||
|
if result then return result end
|
||||||
|
end
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
|
||||||
|
local function addLine(self, v, tree, level, parent)
|
||||||
|
local line = new()
|
||||||
|
line.value = v.value
|
||||||
|
line.text = v.text
|
||||||
|
line.icon = v.icon
|
||||||
|
line.iconCoords = v.iconCoords
|
||||||
|
line.disabled = v.disabled
|
||||||
|
line.tree = tree
|
||||||
|
line.level = level
|
||||||
|
line.parent = parent
|
||||||
|
line.visible = v.visible
|
||||||
|
line.uniquevalue = GetButtonUniqueValue(line)
|
||||||
|
if v.children then
|
||||||
|
line.hasChildren = true
|
||||||
|
else
|
||||||
|
line.hasChildren = nil
|
||||||
|
end
|
||||||
|
self.lines[#self.lines+1] = line
|
||||||
|
return line
|
||||||
|
end
|
||||||
|
|
||||||
|
--fire an update after one frame to catch the treeframes height
|
||||||
|
local function FirstFrameUpdate(frame)
|
||||||
|
local self = frame.obj
|
||||||
|
frame:SetScript("OnUpdate", nil)
|
||||||
|
self:RefreshTree()
|
||||||
|
end
|
||||||
|
|
||||||
|
local function BuildUniqueValue(...)
|
||||||
|
local n = select('#', ...)
|
||||||
|
if n == 1 then
|
||||||
|
return ...
|
||||||
|
else
|
||||||
|
return (...).."\001"..BuildUniqueValue(select(2,...))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
--[[-----------------------------------------------------------------------------
|
||||||
|
Scripts
|
||||||
|
-------------------------------------------------------------------------------]]
|
||||||
|
local function Expand_OnClick(frame)
|
||||||
|
local button = frame.button
|
||||||
|
local self = button.obj
|
||||||
|
local status = (self.status or self.localstatus).groups
|
||||||
|
status[button.uniquevalue] = not status[button.uniquevalue]
|
||||||
|
self:RefreshTree()
|
||||||
|
end
|
||||||
|
|
||||||
|
local function Button_OnClick(frame)
|
||||||
|
local self = frame.obj
|
||||||
|
self:Fire("OnClick", frame.uniquevalue, frame.selected)
|
||||||
|
if not frame.selected then
|
||||||
|
self:SetSelected(frame.uniquevalue)
|
||||||
|
frame.selected = true
|
||||||
|
frame:LockHighlight()
|
||||||
|
self:RefreshTree()
|
||||||
|
end
|
||||||
|
AceGUI:ClearFocus()
|
||||||
|
end
|
||||||
|
|
||||||
|
local function Button_OnDoubleClick(button)
|
||||||
|
local self = button.obj
|
||||||
|
local status = self.status or self.localstatus
|
||||||
|
local status = (self.status or self.localstatus).groups
|
||||||
|
status[button.uniquevalue] = not status[button.uniquevalue]
|
||||||
|
self:RefreshTree()
|
||||||
|
end
|
||||||
|
|
||||||
|
local function Button_OnEnter(frame)
|
||||||
|
local self = frame.obj
|
||||||
|
self:Fire("OnButtonEnter", frame.uniquevalue, frame)
|
||||||
|
|
||||||
|
if self.enabletooltips then
|
||||||
|
GameTooltip:SetOwner(frame, "ANCHOR_NONE")
|
||||||
|
GameTooltip:SetPoint("LEFT",frame,"RIGHT")
|
||||||
|
GameTooltip:SetText(frame.text:GetText() or "", 1, .82, 0, true)
|
||||||
|
|
||||||
|
GameTooltip:Show()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local function Button_OnLeave(frame)
|
||||||
|
local self = frame.obj
|
||||||
|
self:Fire("OnButtonLeave", frame.uniquevalue, frame)
|
||||||
|
|
||||||
|
if self.enabletooltips then
|
||||||
|
GameTooltip:Hide()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local function OnScrollValueChanged(frame, value)
|
||||||
|
if frame.obj.noupdate then return end
|
||||||
|
local self = frame.obj
|
||||||
|
local status = self.status or self.localstatus
|
||||||
|
status.scrollvalue = floor(value + 0.5)
|
||||||
|
self:RefreshTree()
|
||||||
|
AceGUI:ClearFocus()
|
||||||
|
end
|
||||||
|
|
||||||
|
local function Tree_OnSizeChanged(frame)
|
||||||
|
frame.obj:RefreshTree()
|
||||||
|
end
|
||||||
|
|
||||||
|
local function Tree_OnMouseWheel(frame, delta)
|
||||||
|
local self = frame.obj
|
||||||
|
if self.showscroll then
|
||||||
|
local scrollbar = self.scrollbar
|
||||||
|
local min, max = scrollbar:GetMinMaxValues()
|
||||||
|
local value = scrollbar:GetValue()
|
||||||
|
local newvalue = math_min(max,math_max(min,value - delta))
|
||||||
|
if value ~= newvalue then
|
||||||
|
scrollbar:SetValue(newvalue)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local function Dragger_OnLeave(frame)
|
||||||
|
frame:SetBackdropColor(1, 1, 1, 0)
|
||||||
|
end
|
||||||
|
|
||||||
|
local function Dragger_OnEnter(frame)
|
||||||
|
frame:SetBackdropColor(1, 1, 1, 0.8)
|
||||||
|
end
|
||||||
|
|
||||||
|
local function Dragger_OnMouseDown(frame)
|
||||||
|
local treeframe = frame:GetParent()
|
||||||
|
treeframe:StartSizing("RIGHT")
|
||||||
|
end
|
||||||
|
|
||||||
|
local function Dragger_OnMouseUp(frame)
|
||||||
|
local treeframe = frame:GetParent()
|
||||||
|
local self = treeframe.obj
|
||||||
|
local frame = treeframe:GetParent()
|
||||||
|
treeframe:StopMovingOrSizing()
|
||||||
|
--treeframe:SetScript("OnUpdate", nil)
|
||||||
|
treeframe:SetUserPlaced(false)
|
||||||
|
--Without this :GetHeight will get stuck on the current height, causing the tree contents to not resize
|
||||||
|
treeframe:SetHeight(0)
|
||||||
|
treeframe:SetPoint("TOPLEFT", frame, "TOPLEFT",0,0)
|
||||||
|
treeframe:SetPoint("BOTTOMLEFT", frame, "BOTTOMLEFT",0,0)
|
||||||
|
|
||||||
|
local status = self.status or self.localstatus
|
||||||
|
status.treewidth = treeframe:GetWidth()
|
||||||
|
|
||||||
|
treeframe.obj:Fire("OnTreeResize",treeframe:GetWidth())
|
||||||
|
-- recalculate the content width
|
||||||
|
treeframe.obj:OnWidthSet(status.fullwidth)
|
||||||
|
-- update the layout of the content
|
||||||
|
treeframe.obj:DoLayout()
|
||||||
|
end
|
||||||
|
|
||||||
|
--[[-----------------------------------------------------------------------------
|
||||||
|
Methods
|
||||||
|
-------------------------------------------------------------------------------]]
|
||||||
|
local methods = {
|
||||||
|
["OnAcquire"] = function(self)
|
||||||
|
self:SetTreeWidth(DEFAULT_TREE_WIDTH, DEFAULT_TREE_SIZABLE)
|
||||||
|
self:EnableButtonTooltips(true)
|
||||||
|
self.frame:SetScript("OnUpdate", FirstFrameUpdate)
|
||||||
|
end,
|
||||||
|
|
||||||
|
["OnRelease"] = function(self)
|
||||||
|
self.status = nil
|
||||||
|
for k, v in pairs(self.localstatus) do
|
||||||
|
if k == "groups" then
|
||||||
|
for k2 in pairs(v) do
|
||||||
|
v[k2] = nil
|
||||||
|
end
|
||||||
|
else
|
||||||
|
self.localstatus[k] = nil
|
||||||
|
end
|
||||||
|
end
|
||||||
|
self.localstatus.scrollvalue = 0
|
||||||
|
self.localstatus.treewidth = DEFAULT_TREE_WIDTH
|
||||||
|
self.localstatus.treesizable = DEFAULT_TREE_SIZABLE
|
||||||
|
end,
|
||||||
|
|
||||||
|
["EnableButtonTooltips"] = function(self, enable)
|
||||||
|
self.enabletooltips = enable
|
||||||
|
end,
|
||||||
|
|
||||||
|
["CreateButton"] = function(self)
|
||||||
|
local num = AceGUI:GetNextWidgetNum("TreeGroupButton")
|
||||||
|
local button = CreateFrame("Button", ("AceGUI30TreeButton%d"):format(num), self.treeframe, "OptionsListButtonTemplate")
|
||||||
|
button.obj = self
|
||||||
|
|
||||||
|
local icon = button:CreateTexture(nil, "OVERLAY")
|
||||||
|
icon:SetWidth(14)
|
||||||
|
icon:SetHeight(14)
|
||||||
|
button.icon = icon
|
||||||
|
|
||||||
|
button:SetScript("OnClick",Button_OnClick)
|
||||||
|
button:SetScript("OnDoubleClick", Button_OnDoubleClick)
|
||||||
|
button:SetScript("OnEnter",Button_OnEnter)
|
||||||
|
button:SetScript("OnLeave",Button_OnLeave)
|
||||||
|
|
||||||
|
button.toggle.button = button
|
||||||
|
button.toggle:SetScript("OnClick",Expand_OnClick)
|
||||||
|
|
||||||
|
button.text:SetHeight(14) -- Prevents text wrapping
|
||||||
|
|
||||||
|
return button
|
||||||
|
end,
|
||||||
|
|
||||||
|
["SetStatusTable"] = function(self, status)
|
||||||
|
assert(type(status) == "table")
|
||||||
|
self.status = status
|
||||||
|
if not status.groups then
|
||||||
|
status.groups = {}
|
||||||
|
end
|
||||||
|
if not status.scrollvalue then
|
||||||
|
status.scrollvalue = 0
|
||||||
|
end
|
||||||
|
if not status.treewidth then
|
||||||
|
status.treewidth = DEFAULT_TREE_WIDTH
|
||||||
|
end
|
||||||
|
if status.treesizable == nil then
|
||||||
|
status.treesizable = DEFAULT_TREE_SIZABLE
|
||||||
|
end
|
||||||
|
self:SetTreeWidth(status.treewidth,status.treesizable)
|
||||||
|
self:RefreshTree()
|
||||||
|
end,
|
||||||
|
|
||||||
|
--sets the tree to be displayed
|
||||||
|
["SetTree"] = function(self, tree, filter)
|
||||||
|
self.filter = filter
|
||||||
|
if tree then
|
||||||
|
assert(type(tree) == "table")
|
||||||
|
end
|
||||||
|
self.tree = tree
|
||||||
|
self:RefreshTree()
|
||||||
|
end,
|
||||||
|
|
||||||
|
["BuildLevel"] = function(self, tree, level, parent)
|
||||||
|
local groups = (self.status or self.localstatus).groups
|
||||||
|
local hasChildren = self.hasChildren
|
||||||
|
|
||||||
|
for i, v in ipairs(tree) do
|
||||||
|
if v.children then
|
||||||
|
if not self.filter or ShouldDisplayLevel(v.children) then
|
||||||
|
local line = addLine(self, v, tree, level, parent)
|
||||||
|
if groups[line.uniquevalue] then
|
||||||
|
self:BuildLevel(v.children, level+1, line)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
elseif v.visible ~= false or not self.filter then
|
||||||
|
addLine(self, v, tree, level, parent)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
|
||||||
|
["RefreshTree"] = function(self,scrollToSelection)
|
||||||
|
local buttons = self.buttons
|
||||||
|
local lines = self.lines
|
||||||
|
|
||||||
|
for i, v in ipairs(buttons) do
|
||||||
|
v:Hide()
|
||||||
|
end
|
||||||
|
while lines[1] do
|
||||||
|
local t = tremove(lines)
|
||||||
|
for k in pairs(t) do
|
||||||
|
t[k] = nil
|
||||||
|
end
|
||||||
|
del(t)
|
||||||
|
end
|
||||||
|
|
||||||
|
if not self.tree then return end
|
||||||
|
--Build the list of visible entries from the tree and status tables
|
||||||
|
local status = self.status or self.localstatus
|
||||||
|
local groupstatus = status.groups
|
||||||
|
local tree = self.tree
|
||||||
|
|
||||||
|
local treeframe = self.treeframe
|
||||||
|
|
||||||
|
status.scrollToSelection = status.scrollToSelection or scrollToSelection -- needs to be cached in case the control hasn't been drawn yet (code bails out below)
|
||||||
|
|
||||||
|
self:BuildLevel(tree, 1)
|
||||||
|
|
||||||
|
local numlines = #lines
|
||||||
|
|
||||||
|
local maxlines = (floor(((self.treeframe:GetHeight()or 0) - 20 ) / 18))
|
||||||
|
if maxlines <= 0 then return end
|
||||||
|
|
||||||
|
local first, last
|
||||||
|
|
||||||
|
scrollToSelection = status.scrollToSelection
|
||||||
|
status.scrollToSelection = nil
|
||||||
|
|
||||||
|
if numlines <= maxlines then
|
||||||
|
--the whole tree fits in the frame
|
||||||
|
status.scrollvalue = 0
|
||||||
|
self:ShowScroll(false)
|
||||||
|
first, last = 1, numlines
|
||||||
|
else
|
||||||
|
self:ShowScroll(true)
|
||||||
|
--scrolling will be needed
|
||||||
|
self.noupdate = true
|
||||||
|
self.scrollbar:SetMinMaxValues(0, numlines - maxlines)
|
||||||
|
--check if we are scrolled down too far
|
||||||
|
if numlines - status.scrollvalue < maxlines then
|
||||||
|
status.scrollvalue = numlines - maxlines
|
||||||
|
end
|
||||||
|
self.noupdate = nil
|
||||||
|
first, last = status.scrollvalue+1, status.scrollvalue + maxlines
|
||||||
|
--show selection?
|
||||||
|
if scrollToSelection and status.selected then
|
||||||
|
local show
|
||||||
|
for i,line in ipairs(lines) do -- find the line number
|
||||||
|
if line.uniquevalue==status.selected then
|
||||||
|
show=i
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if not show then
|
||||||
|
-- selection was deleted or something?
|
||||||
|
elseif show>=first and show<=last then
|
||||||
|
-- all good
|
||||||
|
else
|
||||||
|
-- scrolling needed!
|
||||||
|
if show<first then
|
||||||
|
status.scrollvalue = show-1
|
||||||
|
else
|
||||||
|
status.scrollvalue = show-maxlines
|
||||||
|
end
|
||||||
|
first, last = status.scrollvalue+1, status.scrollvalue + maxlines
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if self.scrollbar:GetValue() ~= status.scrollvalue then
|
||||||
|
self.scrollbar:SetValue(status.scrollvalue)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local buttonnum = 1
|
||||||
|
for i = first, last do
|
||||||
|
local line = lines[i]
|
||||||
|
local button = buttons[buttonnum]
|
||||||
|
if not button then
|
||||||
|
button = self:CreateButton()
|
||||||
|
|
||||||
|
buttons[buttonnum] = button
|
||||||
|
button:SetParent(treeframe)
|
||||||
|
button:SetFrameLevel(treeframe:GetFrameLevel()+1)
|
||||||
|
button:ClearAllPoints()
|
||||||
|
if buttonnum == 1 then
|
||||||
|
if self.showscroll then
|
||||||
|
button:SetPoint("TOPRIGHT", -22, -10)
|
||||||
|
button:SetPoint("TOPLEFT", 0, -10)
|
||||||
|
else
|
||||||
|
button:SetPoint("TOPRIGHT", 0, -10)
|
||||||
|
button:SetPoint("TOPLEFT", 0, -10)
|
||||||
|
end
|
||||||
|
else
|
||||||
|
button:SetPoint("TOPRIGHT", buttons[buttonnum-1], "BOTTOMRIGHT",0,0)
|
||||||
|
button:SetPoint("TOPLEFT", buttons[buttonnum-1], "BOTTOMLEFT",0,0)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
UpdateButton(button, line, status.selected == line.uniquevalue, line.hasChildren, groupstatus[line.uniquevalue] )
|
||||||
|
button:Show()
|
||||||
|
buttonnum = buttonnum + 1
|
||||||
|
end
|
||||||
|
|
||||||
|
end,
|
||||||
|
|
||||||
|
["SetSelected"] = function(self, value)
|
||||||
|
local status = self.status or self.localstatus
|
||||||
|
if status.selected ~= value then
|
||||||
|
status.selected = value
|
||||||
|
self:Fire("OnGroupSelected", value)
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
|
||||||
|
["Select"] = function(self, uniquevalue, ...)
|
||||||
|
self.filter = false
|
||||||
|
local status = self.status or self.localstatus
|
||||||
|
local groups = status.groups
|
||||||
|
local path = {...}
|
||||||
|
for i = 1, #path do
|
||||||
|
groups[tconcat(path, "\001", 1, i)] = true
|
||||||
|
end
|
||||||
|
status.selected = uniquevalue
|
||||||
|
self:RefreshTree(true)
|
||||||
|
self:Fire("OnGroupSelected", uniquevalue)
|
||||||
|
end,
|
||||||
|
|
||||||
|
["SelectByPath"] = function(self, ...)
|
||||||
|
self:Select(BuildUniqueValue(...), ...)
|
||||||
|
end,
|
||||||
|
|
||||||
|
["SelectByValue"] = function(self, uniquevalue)
|
||||||
|
self:Select(uniquevalue, ("\001"):split(uniquevalue))
|
||||||
|
end,
|
||||||
|
|
||||||
|
["ShowScroll"] = function(self, show)
|
||||||
|
self.showscroll = show
|
||||||
|
if show then
|
||||||
|
self.scrollbar:Show()
|
||||||
|
if self.buttons[1] then
|
||||||
|
self.buttons[1]:SetPoint("TOPRIGHT", self.treeframe,"TOPRIGHT",-22,-10)
|
||||||
|
end
|
||||||
|
else
|
||||||
|
self.scrollbar:Hide()
|
||||||
|
if self.buttons[1] then
|
||||||
|
self.buttons[1]:SetPoint("TOPRIGHT", self.treeframe,"TOPRIGHT",0,-10)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
|
||||||
|
["OnWidthSet"] = function(self, width)
|
||||||
|
local content = self.content
|
||||||
|
local treeframe = self.treeframe
|
||||||
|
local status = self.status or self.localstatus
|
||||||
|
status.fullwidth = width
|
||||||
|
|
||||||
|
local contentwidth = width - status.treewidth - 20
|
||||||
|
if contentwidth < 0 then
|
||||||
|
contentwidth = 0
|
||||||
|
end
|
||||||
|
content:SetWidth(contentwidth)
|
||||||
|
content.width = contentwidth
|
||||||
|
|
||||||
|
local maxtreewidth = math_min(400, width - 50)
|
||||||
|
|
||||||
|
if maxtreewidth > 100 and status.treewidth > maxtreewidth then
|
||||||
|
self:SetTreeWidth(maxtreewidth, status.treesizable)
|
||||||
|
end
|
||||||
|
treeframe:SetMaxResize(maxtreewidth, 1600)
|
||||||
|
end,
|
||||||
|
|
||||||
|
["OnHeightSet"] = function(self, height)
|
||||||
|
local content = self.content
|
||||||
|
local contentheight = height - 20
|
||||||
|
if contentheight < 0 then
|
||||||
|
contentheight = 0
|
||||||
|
end
|
||||||
|
content:SetHeight(contentheight)
|
||||||
|
content.height = contentheight
|
||||||
|
end,
|
||||||
|
|
||||||
|
["SetTreeWidth"] = function(self, treewidth, resizable)
|
||||||
|
if not resizable then
|
||||||
|
if type(treewidth) == 'number' then
|
||||||
|
resizable = false
|
||||||
|
elseif type(treewidth) == 'boolean' then
|
||||||
|
resizable = treewidth
|
||||||
|
treewidth = DEFAULT_TREE_WIDTH
|
||||||
|
else
|
||||||
|
resizable = false
|
||||||
|
treewidth = DEFAULT_TREE_WIDTH
|
||||||
|
end
|
||||||
|
end
|
||||||
|
self.treeframe:SetWidth(treewidth)
|
||||||
|
self.dragger:EnableMouse(resizable)
|
||||||
|
|
||||||
|
local status = self.status or self.localstatus
|
||||||
|
status.treewidth = treewidth
|
||||||
|
status.treesizable = resizable
|
||||||
|
|
||||||
|
-- recalculate the content width
|
||||||
|
if status.fullwidth then
|
||||||
|
self:OnWidthSet(status.fullwidth)
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
|
||||||
|
["GetTreeWidth"] = function(self)
|
||||||
|
local status = self.status or self.localstatus
|
||||||
|
return status.treewidth or DEFAULT_TREE_WIDTH
|
||||||
|
end,
|
||||||
|
|
||||||
|
["LayoutFinished"] = function(self, width, height)
|
||||||
|
if self.noAutoHeight then return end
|
||||||
|
self:SetHeight((height or 0) + 20)
|
||||||
|
end
|
||||||
|
}
|
||||||
|
|
||||||
|
--[[-----------------------------------------------------------------------------
|
||||||
|
Constructor
|
||||||
|
-------------------------------------------------------------------------------]]
|
||||||
|
local PaneBackdrop = {
|
||||||
|
bgFile = "Interface\\ChatFrame\\ChatFrameBackground",
|
||||||
|
edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border",
|
||||||
|
tile = true, tileSize = 16, edgeSize = 16,
|
||||||
|
insets = { left = 3, right = 3, top = 5, bottom = 3 }
|
||||||
|
}
|
||||||
|
|
||||||
|
local DraggerBackdrop = {
|
||||||
|
bgFile = "Interface\\Tooltips\\UI-Tooltip-Background",
|
||||||
|
edgeFile = nil,
|
||||||
|
tile = true, tileSize = 16, edgeSize = 0,
|
||||||
|
insets = { left = 3, right = 3, top = 7, bottom = 7 }
|
||||||
|
}
|
||||||
|
|
||||||
|
local function Constructor()
|
||||||
|
local num = AceGUI:GetNextWidgetNum(Type)
|
||||||
|
local frame = CreateFrame("Frame", nil, UIParent)
|
||||||
|
|
||||||
|
local treeframe = CreateFrame("Frame", nil, frame)
|
||||||
|
treeframe:SetPoint("TOPLEFT")
|
||||||
|
treeframe:SetPoint("BOTTOMLEFT")
|
||||||
|
treeframe:SetWidth(DEFAULT_TREE_WIDTH)
|
||||||
|
treeframe:EnableMouseWheel(true)
|
||||||
|
treeframe:SetBackdrop(PaneBackdrop)
|
||||||
|
treeframe:SetBackdropColor(0.1, 0.1, 0.1, 0.5)
|
||||||
|
treeframe:SetBackdropBorderColor(0.4, 0.4, 0.4)
|
||||||
|
treeframe:SetResizable(true)
|
||||||
|
treeframe:SetMinResize(100, 1)
|
||||||
|
treeframe:SetMaxResize(400, 1600)
|
||||||
|
treeframe:SetScript("OnUpdate", FirstFrameUpdate)
|
||||||
|
treeframe:SetScript("OnSizeChanged", Tree_OnSizeChanged)
|
||||||
|
treeframe:SetScript("OnMouseWheel", Tree_OnMouseWheel)
|
||||||
|
|
||||||
|
local dragger = CreateFrame("Frame", nil, treeframe)
|
||||||
|
dragger:SetWidth(8)
|
||||||
|
dragger:SetPoint("TOP", treeframe, "TOPRIGHT")
|
||||||
|
dragger:SetPoint("BOTTOM", treeframe, "BOTTOMRIGHT")
|
||||||
|
dragger:SetBackdrop(DraggerBackdrop)
|
||||||
|
dragger:SetBackdropColor(1, 1, 1, 0)
|
||||||
|
dragger:SetScript("OnEnter", Dragger_OnEnter)
|
||||||
|
dragger:SetScript("OnLeave", Dragger_OnLeave)
|
||||||
|
dragger:SetScript("OnMouseDown", Dragger_OnMouseDown)
|
||||||
|
dragger:SetScript("OnMouseUp", Dragger_OnMouseUp)
|
||||||
|
|
||||||
|
local scrollbar = CreateFrame("Slider", ("AceConfigDialogTreeGroup%dScrollBar"):format(num), treeframe, "UIPanelScrollBarTemplate")
|
||||||
|
scrollbar:SetScript("OnValueChanged", nil)
|
||||||
|
scrollbar:SetPoint("TOPRIGHT", -10, -26)
|
||||||
|
scrollbar:SetPoint("BOTTOMRIGHT", -10, 26)
|
||||||
|
scrollbar:SetMinMaxValues(0,0)
|
||||||
|
scrollbar:SetValueStep(1)
|
||||||
|
scrollbar:SetValue(0)
|
||||||
|
scrollbar:SetWidth(16)
|
||||||
|
scrollbar:SetScript("OnValueChanged", OnScrollValueChanged)
|
||||||
|
|
||||||
|
local scrollbg = scrollbar:CreateTexture(nil, "BACKGROUND")
|
||||||
|
scrollbg:SetAllPoints(scrollbar)
|
||||||
|
scrollbg:SetColorTexture(0,0,0,0.4)
|
||||||
|
|
||||||
|
local border = CreateFrame("Frame",nil,frame)
|
||||||
|
border:SetPoint("TOPLEFT", treeframe, "TOPRIGHT")
|
||||||
|
border:SetPoint("BOTTOMRIGHT")
|
||||||
|
border:SetBackdrop(PaneBackdrop)
|
||||||
|
border:SetBackdropColor(0.1, 0.1, 0.1, 0.5)
|
||||||
|
border:SetBackdropBorderColor(0.4, 0.4, 0.4)
|
||||||
|
|
||||||
|
--Container Support
|
||||||
|
local content = CreateFrame("Frame", nil, border)
|
||||||
|
content:SetPoint("TOPLEFT", 10, -10)
|
||||||
|
content:SetPoint("BOTTOMRIGHT", -10, 10)
|
||||||
|
|
||||||
|
local widget = {
|
||||||
|
frame = frame,
|
||||||
|
lines = {},
|
||||||
|
levels = {},
|
||||||
|
buttons = {},
|
||||||
|
hasChildren = {},
|
||||||
|
localstatus = { groups = {}, scrollvalue = 0 },
|
||||||
|
filter = false,
|
||||||
|
treeframe = treeframe,
|
||||||
|
dragger = dragger,
|
||||||
|
scrollbar = scrollbar,
|
||||||
|
border = border,
|
||||||
|
content = content,
|
||||||
|
type = Type
|
||||||
|
}
|
||||||
|
for method, func in pairs(methods) do
|
||||||
|
widget[method] = func
|
||||||
|
end
|
||||||
|
treeframe.obj, dragger.obj, scrollbar.obj = widget, widget, widget
|
||||||
|
|
||||||
|
return AceGUI:RegisterAsContainer(widget)
|
||||||
|
end
|
||||||
|
|
||||||
|
AceGUI:RegisterWidgetType(Type, Constructor, Version)
|
|
@ -0,0 +1,336 @@
|
||||||
|
local AceGUI = LibStub("AceGUI-3.0")
|
||||||
|
|
||||||
|
-- Lua APIs
|
||||||
|
local pairs, assert, type = pairs, assert, type
|
||||||
|
|
||||||
|
-- WoW APIs
|
||||||
|
local PlaySound = PlaySound
|
||||||
|
local CreateFrame, UIParent = CreateFrame, UIParent
|
||||||
|
|
||||||
|
-- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
|
||||||
|
-- List them here for Mikk's FindGlobals script
|
||||||
|
-- GLOBALS: GameFontNormal
|
||||||
|
|
||||||
|
----------------
|
||||||
|
-- Main Frame --
|
||||||
|
----------------
|
||||||
|
--[[
|
||||||
|
Events :
|
||||||
|
OnClose
|
||||||
|
|
||||||
|
]]
|
||||||
|
do
|
||||||
|
local Type = "Window"
|
||||||
|
local Version = 6
|
||||||
|
|
||||||
|
local function frameOnShow(this)
|
||||||
|
this.obj:Fire("OnShow")
|
||||||
|
end
|
||||||
|
|
||||||
|
local function frameOnClose(this)
|
||||||
|
this.obj:Fire("OnClose")
|
||||||
|
end
|
||||||
|
|
||||||
|
local function closeOnClick(this)
|
||||||
|
PlaySound(PlaySoundKitID and "gsTitleOptionExit" or 799) -- SOUNDKIT.GS_TITLE_OPTION_EXIT
|
||||||
|
this.obj:Hide()
|
||||||
|
end
|
||||||
|
|
||||||
|
local function frameOnMouseDown(this)
|
||||||
|
AceGUI:ClearFocus()
|
||||||
|
end
|
||||||
|
|
||||||
|
local function titleOnMouseDown(this)
|
||||||
|
this:GetParent():StartMoving()
|
||||||
|
AceGUI:ClearFocus()
|
||||||
|
end
|
||||||
|
|
||||||
|
local function frameOnMouseUp(this)
|
||||||
|
local frame = this:GetParent()
|
||||||
|
frame:StopMovingOrSizing()
|
||||||
|
local self = frame.obj
|
||||||
|
local status = self.status or self.localstatus
|
||||||
|
status.width = frame:GetWidth()
|
||||||
|
status.height = frame:GetHeight()
|
||||||
|
status.top = frame:GetTop()
|
||||||
|
status.left = frame:GetLeft()
|
||||||
|
end
|
||||||
|
|
||||||
|
local function sizerseOnMouseDown(this)
|
||||||
|
this:GetParent():StartSizing("BOTTOMRIGHT")
|
||||||
|
AceGUI:ClearFocus()
|
||||||
|
end
|
||||||
|
|
||||||
|
local function sizersOnMouseDown(this)
|
||||||
|
this:GetParent():StartSizing("BOTTOM")
|
||||||
|
AceGUI:ClearFocus()
|
||||||
|
end
|
||||||
|
|
||||||
|
local function sizereOnMouseDown(this)
|
||||||
|
this:GetParent():StartSizing("RIGHT")
|
||||||
|
AceGUI:ClearFocus()
|
||||||
|
end
|
||||||
|
|
||||||
|
local function sizerOnMouseUp(this)
|
||||||
|
this:GetParent():StopMovingOrSizing()
|
||||||
|
end
|
||||||
|
|
||||||
|
local function SetTitle(self,title)
|
||||||
|
self.titletext:SetText(title)
|
||||||
|
end
|
||||||
|
|
||||||
|
local function SetStatusText(self,text)
|
||||||
|
-- self.statustext:SetText(text)
|
||||||
|
end
|
||||||
|
|
||||||
|
local function Hide(self)
|
||||||
|
self.frame:Hide()
|
||||||
|
end
|
||||||
|
|
||||||
|
local function Show(self)
|
||||||
|
self.frame:Show()
|
||||||
|
end
|
||||||
|
|
||||||
|
local function OnAcquire(self)
|
||||||
|
self.frame:SetParent(UIParent)
|
||||||
|
self.frame:SetFrameStrata("FULLSCREEN_DIALOG")
|
||||||
|
self:ApplyStatus()
|
||||||
|
self:EnableResize(true)
|
||||||
|
self:Show()
|
||||||
|
end
|
||||||
|
|
||||||
|
local function OnRelease(self)
|
||||||
|
self.status = nil
|
||||||
|
for k in pairs(self.localstatus) do
|
||||||
|
self.localstatus[k] = nil
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- called to set an external table to store status in
|
||||||
|
local function SetStatusTable(self, status)
|
||||||
|
assert(type(status) == "table")
|
||||||
|
self.status = status
|
||||||
|
self:ApplyStatus()
|
||||||
|
end
|
||||||
|
|
||||||
|
local function ApplyStatus(self)
|
||||||
|
local status = self.status or self.localstatus
|
||||||
|
local frame = self.frame
|
||||||
|
self:SetWidth(status.width or 700)
|
||||||
|
self:SetHeight(status.height or 500)
|
||||||
|
if status.top and status.left then
|
||||||
|
frame:SetPoint("TOP",UIParent,"BOTTOM",0,status.top)
|
||||||
|
frame:SetPoint("LEFT",UIParent,"LEFT",status.left,0)
|
||||||
|
else
|
||||||
|
frame:SetPoint("CENTER",UIParent,"CENTER")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local function OnWidthSet(self, width)
|
||||||
|
local content = self.content
|
||||||
|
local contentwidth = width - 34
|
||||||
|
if contentwidth < 0 then
|
||||||
|
contentwidth = 0
|
||||||
|
end
|
||||||
|
content:SetWidth(contentwidth)
|
||||||
|
content.width = contentwidth
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
local function OnHeightSet(self, height)
|
||||||
|
local content = self.content
|
||||||
|
local contentheight = height - 57
|
||||||
|
if contentheight < 0 then
|
||||||
|
contentheight = 0
|
||||||
|
end
|
||||||
|
content:SetHeight(contentheight)
|
||||||
|
content.height = contentheight
|
||||||
|
end
|
||||||
|
|
||||||
|
local function EnableResize(self, state)
|
||||||
|
local func = state and "Show" or "Hide"
|
||||||
|
self.sizer_se[func](self.sizer_se)
|
||||||
|
self.sizer_s[func](self.sizer_s)
|
||||||
|
self.sizer_e[func](self.sizer_e)
|
||||||
|
end
|
||||||
|
|
||||||
|
local function Constructor()
|
||||||
|
local frame = CreateFrame("Frame",nil,UIParent)
|
||||||
|
local self = {}
|
||||||
|
self.type = "Window"
|
||||||
|
|
||||||
|
self.Hide = Hide
|
||||||
|
self.Show = Show
|
||||||
|
self.SetTitle = SetTitle
|
||||||
|
self.OnRelease = OnRelease
|
||||||
|
self.OnAcquire = OnAcquire
|
||||||
|
self.SetStatusText = SetStatusText
|
||||||
|
self.SetStatusTable = SetStatusTable
|
||||||
|
self.ApplyStatus = ApplyStatus
|
||||||
|
self.OnWidthSet = OnWidthSet
|
||||||
|
self.OnHeightSet = OnHeightSet
|
||||||
|
self.EnableResize = EnableResize
|
||||||
|
|
||||||
|
self.localstatus = {}
|
||||||
|
|
||||||
|
self.frame = frame
|
||||||
|
frame.obj = self
|
||||||
|
frame:SetWidth(700)
|
||||||
|
frame:SetHeight(500)
|
||||||
|
frame:SetPoint("CENTER",UIParent,"CENTER",0,0)
|
||||||
|
frame:EnableMouse()
|
||||||
|
frame:SetMovable(true)
|
||||||
|
frame:SetResizable(true)
|
||||||
|
frame:SetFrameStrata("FULLSCREEN_DIALOG")
|
||||||
|
frame:SetScript("OnMouseDown", frameOnMouseDown)
|
||||||
|
|
||||||
|
frame:SetScript("OnShow",frameOnShow)
|
||||||
|
frame:SetScript("OnHide",frameOnClose)
|
||||||
|
frame:SetMinResize(240,240)
|
||||||
|
frame:SetToplevel(true)
|
||||||
|
|
||||||
|
local titlebg = frame:CreateTexture(nil, "BACKGROUND")
|
||||||
|
titlebg:SetTexture([[Interface\PaperDollInfoFrame\UI-GearManager-Title-Background]])
|
||||||
|
titlebg:SetPoint("TOPLEFT", 9, -6)
|
||||||
|
titlebg:SetPoint("BOTTOMRIGHT", frame, "TOPRIGHT", -28, -24)
|
||||||
|
|
||||||
|
local dialogbg = frame:CreateTexture(nil, "BACKGROUND")
|
||||||
|
dialogbg:SetTexture([[Interface\Tooltips\UI-Tooltip-Background]])
|
||||||
|
dialogbg:SetPoint("TOPLEFT", 8, -24)
|
||||||
|
dialogbg:SetPoint("BOTTOMRIGHT", -6, 8)
|
||||||
|
dialogbg:SetVertexColor(0, 0, 0, .75)
|
||||||
|
|
||||||
|
local topleft = frame:CreateTexture(nil, "BORDER")
|
||||||
|
topleft:SetTexture([[Interface\PaperDollInfoFrame\UI-GearManager-Border]])
|
||||||
|
topleft:SetWidth(64)
|
||||||
|
topleft:SetHeight(64)
|
||||||
|
topleft:SetPoint("TOPLEFT")
|
||||||
|
topleft:SetTexCoord(0.501953125, 0.625, 0, 1)
|
||||||
|
|
||||||
|
local topright = frame:CreateTexture(nil, "BORDER")
|
||||||
|
topright:SetTexture([[Interface\PaperDollInfoFrame\UI-GearManager-Border]])
|
||||||
|
topright:SetWidth(64)
|
||||||
|
topright:SetHeight(64)
|
||||||
|
topright:SetPoint("TOPRIGHT")
|
||||||
|
topright:SetTexCoord(0.625, 0.75, 0, 1)
|
||||||
|
|
||||||
|
local top = frame:CreateTexture(nil, "BORDER")
|
||||||
|
top:SetTexture([[Interface\PaperDollInfoFrame\UI-GearManager-Border]])
|
||||||
|
top:SetHeight(64)
|
||||||
|
top:SetPoint("TOPLEFT", topleft, "TOPRIGHT")
|
||||||
|
top:SetPoint("TOPRIGHT", topright, "TOPLEFT")
|
||||||
|
top:SetTexCoord(0.25, 0.369140625, 0, 1)
|
||||||
|
|
||||||
|
local bottomleft = frame:CreateTexture(nil, "BORDER")
|
||||||
|
bottomleft:SetTexture([[Interface\PaperDollInfoFrame\UI-GearManager-Border]])
|
||||||
|
bottomleft:SetWidth(64)
|
||||||
|
bottomleft:SetHeight(64)
|
||||||
|
bottomleft:SetPoint("BOTTOMLEFT")
|
||||||
|
bottomleft:SetTexCoord(0.751953125, 0.875, 0, 1)
|
||||||
|
|
||||||
|
local bottomright = frame:CreateTexture(nil, "BORDER")
|
||||||
|
bottomright:SetTexture([[Interface\PaperDollInfoFrame\UI-GearManager-Border]])
|
||||||
|
bottomright:SetWidth(64)
|
||||||
|
bottomright:SetHeight(64)
|
||||||
|
bottomright:SetPoint("BOTTOMRIGHT")
|
||||||
|
bottomright:SetTexCoord(0.875, 1, 0, 1)
|
||||||
|
|
||||||
|
local bottom = frame:CreateTexture(nil, "BORDER")
|
||||||
|
bottom:SetTexture([[Interface\PaperDollInfoFrame\UI-GearManager-Border]])
|
||||||
|
bottom:SetHeight(64)
|
||||||
|
bottom:SetPoint("BOTTOMLEFT", bottomleft, "BOTTOMRIGHT")
|
||||||
|
bottom:SetPoint("BOTTOMRIGHT", bottomright, "BOTTOMLEFT")
|
||||||
|
bottom:SetTexCoord(0.376953125, 0.498046875, 0, 1)
|
||||||
|
|
||||||
|
local left = frame:CreateTexture(nil, "BORDER")
|
||||||
|
left:SetTexture([[Interface\PaperDollInfoFrame\UI-GearManager-Border]])
|
||||||
|
left:SetWidth(64)
|
||||||
|
left:SetPoint("TOPLEFT", topleft, "BOTTOMLEFT")
|
||||||
|
left:SetPoint("BOTTOMLEFT", bottomleft, "TOPLEFT")
|
||||||
|
left:SetTexCoord(0.001953125, 0.125, 0, 1)
|
||||||
|
|
||||||
|
local right = frame:CreateTexture(nil, "BORDER")
|
||||||
|
right:SetTexture([[Interface\PaperDollInfoFrame\UI-GearManager-Border]])
|
||||||
|
right:SetWidth(64)
|
||||||
|
right:SetPoint("TOPRIGHT", topright, "BOTTOMRIGHT")
|
||||||
|
right:SetPoint("BOTTOMRIGHT", bottomright, "TOPRIGHT")
|
||||||
|
right:SetTexCoord(0.1171875, 0.2421875, 0, 1)
|
||||||
|
|
||||||
|
local close = CreateFrame("Button", nil, frame, "UIPanelCloseButton")
|
||||||
|
close:SetPoint("TOPRIGHT", 2, 1)
|
||||||
|
close:SetScript("OnClick", closeOnClick)
|
||||||
|
self.closebutton = close
|
||||||
|
close.obj = self
|
||||||
|
|
||||||
|
local titletext = frame:CreateFontString(nil, "ARTWORK")
|
||||||
|
titletext:SetFontObject(GameFontNormal)
|
||||||
|
titletext:SetPoint("TOPLEFT", 12, -8)
|
||||||
|
titletext:SetPoint("TOPRIGHT", -32, -8)
|
||||||
|
self.titletext = titletext
|
||||||
|
|
||||||
|
local title = CreateFrame("Button", nil, frame)
|
||||||
|
title:SetPoint("TOPLEFT", titlebg)
|
||||||
|
title:SetPoint("BOTTOMRIGHT", titlebg)
|
||||||
|
title:EnableMouse()
|
||||||
|
title:SetScript("OnMouseDown",titleOnMouseDown)
|
||||||
|
title:SetScript("OnMouseUp", frameOnMouseUp)
|
||||||
|
self.title = title
|
||||||
|
|
||||||
|
local sizer_se = CreateFrame("Frame",nil,frame)
|
||||||
|
sizer_se:SetPoint("BOTTOMRIGHT",frame,"BOTTOMRIGHT",0,0)
|
||||||
|
sizer_se:SetWidth(25)
|
||||||
|
sizer_se:SetHeight(25)
|
||||||
|
sizer_se:EnableMouse()
|
||||||
|
sizer_se:SetScript("OnMouseDown",sizerseOnMouseDown)
|
||||||
|
sizer_se:SetScript("OnMouseUp", sizerOnMouseUp)
|
||||||
|
self.sizer_se = sizer_se
|
||||||
|
|
||||||
|
local line1 = sizer_se:CreateTexture(nil, "BACKGROUND")
|
||||||
|
self.line1 = line1
|
||||||
|
line1:SetWidth(14)
|
||||||
|
line1:SetHeight(14)
|
||||||
|
line1:SetPoint("BOTTOMRIGHT", -8, 8)
|
||||||
|
line1:SetTexture("Interface\\Tooltips\\UI-Tooltip-Border")
|
||||||
|
local x = 0.1 * 14/17
|
||||||
|
line1:SetTexCoord(0.05 - x, 0.5, 0.05, 0.5 + x, 0.05, 0.5 - x, 0.5 + x, 0.5)
|
||||||
|
|
||||||
|
local line2 = sizer_se:CreateTexture(nil, "BACKGROUND")
|
||||||
|
self.line2 = line2
|
||||||
|
line2:SetWidth(8)
|
||||||
|
line2:SetHeight(8)
|
||||||
|
line2:SetPoint("BOTTOMRIGHT", -8, 8)
|
||||||
|
line2:SetTexture("Interface\\Tooltips\\UI-Tooltip-Border")
|
||||||
|
local x = 0.1 * 8/17
|
||||||
|
line2:SetTexCoord(0.05 - x, 0.5, 0.05, 0.5 + x, 0.05, 0.5 - x, 0.5 + x, 0.5)
|
||||||
|
|
||||||
|
local sizer_s = CreateFrame("Frame",nil,frame)
|
||||||
|
sizer_s:SetPoint("BOTTOMRIGHT",frame,"BOTTOMRIGHT",-25,0)
|
||||||
|
sizer_s:SetPoint("BOTTOMLEFT",frame,"BOTTOMLEFT",0,0)
|
||||||
|
sizer_s:SetHeight(25)
|
||||||
|
sizer_s:EnableMouse()
|
||||||
|
sizer_s:SetScript("OnMouseDown",sizersOnMouseDown)
|
||||||
|
sizer_s:SetScript("OnMouseUp", sizerOnMouseUp)
|
||||||
|
self.sizer_s = sizer_s
|
||||||
|
|
||||||
|
local sizer_e = CreateFrame("Frame",nil,frame)
|
||||||
|
sizer_e:SetPoint("BOTTOMRIGHT",frame,"BOTTOMRIGHT",0,25)
|
||||||
|
sizer_e:SetPoint("TOPRIGHT",frame,"TOPRIGHT",0,0)
|
||||||
|
sizer_e:SetWidth(25)
|
||||||
|
sizer_e:EnableMouse()
|
||||||
|
sizer_e:SetScript("OnMouseDown",sizereOnMouseDown)
|
||||||
|
sizer_e:SetScript("OnMouseUp", sizerOnMouseUp)
|
||||||
|
self.sizer_e = sizer_e
|
||||||
|
|
||||||
|
--Container Support
|
||||||
|
local content = CreateFrame("Frame",nil,frame)
|
||||||
|
self.content = content
|
||||||
|
content.obj = self
|
||||||
|
content:SetPoint("TOPLEFT",frame,"TOPLEFT",12,-32)
|
||||||
|
content:SetPoint("BOTTOMRIGHT",frame,"BOTTOMRIGHT",-12,13)
|
||||||
|
|
||||||
|
AceGUI:RegisterAsContainer(self)
|
||||||
|
return self
|
||||||
|
end
|
||||||
|
|
||||||
|
AceGUI:RegisterWidgetType(Type,Constructor,Version)
|
||||||
|
end
|
|
@ -0,0 +1,103 @@
|
||||||
|
--[[-----------------------------------------------------------------------------
|
||||||
|
Button Widget
|
||||||
|
Graphical Button.
|
||||||
|
-------------------------------------------------------------------------------]]
|
||||||
|
local Type, Version = "Button", 24
|
||||||
|
local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
|
||||||
|
if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
|
||||||
|
|
||||||
|
-- Lua APIs
|
||||||
|
local pairs = pairs
|
||||||
|
|
||||||
|
-- WoW APIs
|
||||||
|
local _G = _G
|
||||||
|
local PlaySound, CreateFrame, UIParent = PlaySound, CreateFrame, UIParent
|
||||||
|
|
||||||
|
--[[-----------------------------------------------------------------------------
|
||||||
|
Scripts
|
||||||
|
-------------------------------------------------------------------------------]]
|
||||||
|
local function Button_OnClick(frame, ...)
|
||||||
|
AceGUI:ClearFocus()
|
||||||
|
PlaySound(PlaySoundKitID and "igMainMenuOption" or 852) -- SOUNDKIT.IG_MAINMENU_OPTION
|
||||||
|
frame.obj:Fire("OnClick", ...)
|
||||||
|
end
|
||||||
|
|
||||||
|
local function Control_OnEnter(frame)
|
||||||
|
frame.obj:Fire("OnEnter")
|
||||||
|
end
|
||||||
|
|
||||||
|
local function Control_OnLeave(frame)
|
||||||
|
frame.obj:Fire("OnLeave")
|
||||||
|
end
|
||||||
|
|
||||||
|
--[[-----------------------------------------------------------------------------
|
||||||
|
Methods
|
||||||
|
-------------------------------------------------------------------------------]]
|
||||||
|
local methods = {
|
||||||
|
["OnAcquire"] = function(self)
|
||||||
|
-- restore default values
|
||||||
|
self:SetHeight(24)
|
||||||
|
self:SetWidth(200)
|
||||||
|
self:SetDisabled(false)
|
||||||
|
self:SetAutoWidth(false)
|
||||||
|
self:SetText()
|
||||||
|
end,
|
||||||
|
|
||||||
|
-- ["OnRelease"] = nil,
|
||||||
|
|
||||||
|
["SetText"] = function(self, text)
|
||||||
|
self.text:SetText(text)
|
||||||
|
if self.autoWidth then
|
||||||
|
self:SetWidth(self.text:GetStringWidth() + 30)
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
|
||||||
|
["SetAutoWidth"] = function(self, autoWidth)
|
||||||
|
self.autoWidth = autoWidth
|
||||||
|
if self.autoWidth then
|
||||||
|
self:SetWidth(self.text:GetStringWidth() + 30)
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
|
||||||
|
["SetDisabled"] = function(self, disabled)
|
||||||
|
self.disabled = disabled
|
||||||
|
if disabled then
|
||||||
|
self.frame:Disable()
|
||||||
|
else
|
||||||
|
self.frame:Enable()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
}
|
||||||
|
|
||||||
|
--[[-----------------------------------------------------------------------------
|
||||||
|
Constructor
|
||||||
|
-------------------------------------------------------------------------------]]
|
||||||
|
local function Constructor()
|
||||||
|
local name = "AceGUI30Button" .. AceGUI:GetNextWidgetNum(Type)
|
||||||
|
local frame = CreateFrame("Button", name, UIParent, "UIPanelButtonTemplate")
|
||||||
|
frame:Hide()
|
||||||
|
|
||||||
|
frame:EnableMouse(true)
|
||||||
|
frame:SetScript("OnClick", Button_OnClick)
|
||||||
|
frame:SetScript("OnEnter", Control_OnEnter)
|
||||||
|
frame:SetScript("OnLeave", Control_OnLeave)
|
||||||
|
|
||||||
|
local text = frame:GetFontString()
|
||||||
|
text:ClearAllPoints()
|
||||||
|
text:SetPoint("TOPLEFT", 15, -1)
|
||||||
|
text:SetPoint("BOTTOMRIGHT", -15, 1)
|
||||||
|
text:SetJustifyV("MIDDLE")
|
||||||
|
|
||||||
|
local widget = {
|
||||||
|
text = text,
|
||||||
|
frame = frame,
|
||||||
|
type = Type
|
||||||
|
}
|
||||||
|
for method, func in pairs(methods) do
|
||||||
|
widget[method] = func
|
||||||
|
end
|
||||||
|
|
||||||
|
return AceGUI:RegisterAsWidget(widget)
|
||||||
|
end
|
||||||
|
|
||||||
|
AceGUI:RegisterWidgetType(Type, Constructor, Version)
|
|
@ -0,0 +1,295 @@
|
||||||
|
--[[-----------------------------------------------------------------------------
|
||||||
|
Checkbox Widget
|
||||||
|
-------------------------------------------------------------------------------]]
|
||||||
|
local Type, Version = "CheckBox", 23
|
||||||
|
local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
|
||||||
|
if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
|
||||||
|
|
||||||
|
-- Lua APIs
|
||||||
|
local select, pairs = select, pairs
|
||||||
|
|
||||||
|
-- WoW APIs
|
||||||
|
local PlaySound = PlaySound
|
||||||
|
local CreateFrame, UIParent = CreateFrame, UIParent
|
||||||
|
|
||||||
|
-- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
|
||||||
|
-- List them here for Mikk's FindGlobals script
|
||||||
|
-- GLOBALS: SetDesaturation, GameFontHighlight
|
||||||
|
|
||||||
|
--[[-----------------------------------------------------------------------------
|
||||||
|
Support functions
|
||||||
|
-------------------------------------------------------------------------------]]
|
||||||
|
local function AlignImage(self)
|
||||||
|
local img = self.image:GetTexture()
|
||||||
|
self.text:ClearAllPoints()
|
||||||
|
if not img then
|
||||||
|
self.text:SetPoint("LEFT", self.checkbg, "RIGHT")
|
||||||
|
self.text:SetPoint("RIGHT")
|
||||||
|
else
|
||||||
|
self.text:SetPoint("LEFT", self.image,"RIGHT", 1, 0)
|
||||||
|
self.text:SetPoint("RIGHT")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
--[[-----------------------------------------------------------------------------
|
||||||
|
Scripts
|
||||||
|
-------------------------------------------------------------------------------]]
|
||||||
|
local function Control_OnEnter(frame)
|
||||||
|
frame.obj:Fire("OnEnter")
|
||||||
|
end
|
||||||
|
|
||||||
|
local function Control_OnLeave(frame)
|
||||||
|
frame.obj:Fire("OnLeave")
|
||||||
|
end
|
||||||
|
|
||||||
|
local function CheckBox_OnMouseDown(frame)
|
||||||
|
local self = frame.obj
|
||||||
|
if not self.disabled then
|
||||||
|
if self.image:GetTexture() then
|
||||||
|
self.text:SetPoint("LEFT", self.image,"RIGHT", 2, -1)
|
||||||
|
else
|
||||||
|
self.text:SetPoint("LEFT", self.checkbg, "RIGHT", 1, -1)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
AceGUI:ClearFocus()
|
||||||
|
end
|
||||||
|
|
||||||
|
local function CheckBox_OnMouseUp(frame)
|
||||||
|
local self = frame.obj
|
||||||
|
if not self.disabled then
|
||||||
|
self:ToggleChecked()
|
||||||
|
|
||||||
|
if self.checked then
|
||||||
|
PlaySound(PlaySoundKitID and "igMainMenuOptionCheckBoxOn" or 856) -- SOUNDKIT.IG_MAINMENU_OPTION_CHECKBOX_ON
|
||||||
|
else -- for both nil and false (tristate)
|
||||||
|
PlaySound(PlaySoundKitID and "igMainMenuOptionCheckBoxOff" or 857) -- SOUNDKIT.IG_MAINMENU_OPTION_CHECKBOX_OFF
|
||||||
|
end
|
||||||
|
|
||||||
|
self:Fire("OnValueChanged", self.checked)
|
||||||
|
AlignImage(self)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
--[[-----------------------------------------------------------------------------
|
||||||
|
Methods
|
||||||
|
-------------------------------------------------------------------------------]]
|
||||||
|
local methods = {
|
||||||
|
["OnAcquire"] = function(self)
|
||||||
|
self:SetType()
|
||||||
|
self:SetValue(false)
|
||||||
|
self:SetTriState(nil)
|
||||||
|
-- height is calculated from the width and required space for the description
|
||||||
|
self:SetWidth(200)
|
||||||
|
self:SetImage()
|
||||||
|
self:SetDisabled(nil)
|
||||||
|
self:SetDescription(nil)
|
||||||
|
end,
|
||||||
|
|
||||||
|
-- ["OnRelease"] = nil,
|
||||||
|
|
||||||
|
["OnWidthSet"] = function(self, width)
|
||||||
|
if self.desc then
|
||||||
|
self.desc:SetWidth(width - 30)
|
||||||
|
if self.desc:GetText() and self.desc:GetText() ~= "" then
|
||||||
|
self:SetHeight(28 + self.desc:GetHeight())
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
|
||||||
|
["SetDisabled"] = function(self, disabled)
|
||||||
|
self.disabled = disabled
|
||||||
|
if disabled then
|
||||||
|
self.frame:Disable()
|
||||||
|
self.text:SetTextColor(0.5, 0.5, 0.5)
|
||||||
|
SetDesaturation(self.check, true)
|
||||||
|
if self.desc then
|
||||||
|
self.desc:SetTextColor(0.5, 0.5, 0.5)
|
||||||
|
end
|
||||||
|
else
|
||||||
|
self.frame:Enable()
|
||||||
|
self.text:SetTextColor(1, 1, 1)
|
||||||
|
if self.tristate and self.checked == nil then
|
||||||
|
SetDesaturation(self.check, true)
|
||||||
|
else
|
||||||
|
SetDesaturation(self.check, false)
|
||||||
|
end
|
||||||
|
if self.desc then
|
||||||
|
self.desc:SetTextColor(1, 1, 1)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
|
||||||
|
["SetValue"] = function(self,value)
|
||||||
|
local check = self.check
|
||||||
|
self.checked = value
|
||||||
|
if value then
|
||||||
|
SetDesaturation(self.check, false)
|
||||||
|
self.check:Show()
|
||||||
|
else
|
||||||
|
--Nil is the unknown tristate value
|
||||||
|
if self.tristate and value == nil then
|
||||||
|
SetDesaturation(self.check, true)
|
||||||
|
self.check:Show()
|
||||||
|
else
|
||||||
|
SetDesaturation(self.check, false)
|
||||||
|
self.check:Hide()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
self:SetDisabled(self.disabled)
|
||||||
|
end,
|
||||||
|
|
||||||
|
["GetValue"] = function(self)
|
||||||
|
return self.checked
|
||||||
|
end,
|
||||||
|
|
||||||
|
["SetTriState"] = function(self, enabled)
|
||||||
|
self.tristate = enabled
|
||||||
|
self:SetValue(self:GetValue())
|
||||||
|
end,
|
||||||
|
|
||||||
|
["SetType"] = function(self, type)
|
||||||
|
local checkbg = self.checkbg
|
||||||
|
local check = self.check
|
||||||
|
local highlight = self.highlight
|
||||||
|
|
||||||
|
local size
|
||||||
|
if type == "radio" then
|
||||||
|
size = 16
|
||||||
|
checkbg:SetTexture("Interface\\Buttons\\UI-RadioButton")
|
||||||
|
checkbg:SetTexCoord(0, 0.25, 0, 1)
|
||||||
|
check:SetTexture("Interface\\Buttons\\UI-RadioButton")
|
||||||
|
check:SetTexCoord(0.25, 0.5, 0, 1)
|
||||||
|
check:SetBlendMode("ADD")
|
||||||
|
highlight:SetTexture("Interface\\Buttons\\UI-RadioButton")
|
||||||
|
highlight:SetTexCoord(0.5, 0.75, 0, 1)
|
||||||
|
else
|
||||||
|
size = 24
|
||||||
|
checkbg:SetTexture("Interface\\Buttons\\UI-CheckBox-Up")
|
||||||
|
checkbg:SetTexCoord(0, 1, 0, 1)
|
||||||
|
check:SetTexture("Interface\\Buttons\\UI-CheckBox-Check")
|
||||||
|
check:SetTexCoord(0, 1, 0, 1)
|
||||||
|
check:SetBlendMode("BLEND")
|
||||||
|
highlight:SetTexture("Interface\\Buttons\\UI-CheckBox-Highlight")
|
||||||
|
highlight:SetTexCoord(0, 1, 0, 1)
|
||||||
|
end
|
||||||
|
checkbg:SetHeight(size)
|
||||||
|
checkbg:SetWidth(size)
|
||||||
|
end,
|
||||||
|
|
||||||
|
["ToggleChecked"] = function(self)
|
||||||
|
local value = self:GetValue()
|
||||||
|
if self.tristate then
|
||||||
|
--cycle in true, nil, false order
|
||||||
|
if value then
|
||||||
|
self:SetValue(nil)
|
||||||
|
elseif value == nil then
|
||||||
|
self:SetValue(false)
|
||||||
|
else
|
||||||
|
self:SetValue(true)
|
||||||
|
end
|
||||||
|
else
|
||||||
|
self:SetValue(not self:GetValue())
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
|
||||||
|
["SetLabel"] = function(self, label)
|
||||||
|
self.text:SetText(label)
|
||||||
|
end,
|
||||||
|
|
||||||
|
["SetDescription"] = function(self, desc)
|
||||||
|
if desc then
|
||||||
|
if not self.desc then
|
||||||
|
local desc = self.frame:CreateFontString(nil, "OVERLAY", "GameFontHighlightSmall")
|
||||||
|
desc:ClearAllPoints()
|
||||||
|
desc:SetPoint("TOPLEFT", self.checkbg, "TOPRIGHT", 5, -21)
|
||||||
|
desc:SetWidth(self.frame.width - 30)
|
||||||
|
desc:SetJustifyH("LEFT")
|
||||||
|
desc:SetJustifyV("TOP")
|
||||||
|
self.desc = desc
|
||||||
|
end
|
||||||
|
self.desc:Show()
|
||||||
|
--self.text:SetFontObject(GameFontNormal)
|
||||||
|
self.desc:SetText(desc)
|
||||||
|
self:SetHeight(28 + self.desc:GetHeight())
|
||||||
|
else
|
||||||
|
if self.desc then
|
||||||
|
self.desc:SetText("")
|
||||||
|
self.desc:Hide()
|
||||||
|
end
|
||||||
|
--self.text:SetFontObject(GameFontHighlight)
|
||||||
|
self:SetHeight(24)
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
|
||||||
|
["SetImage"] = function(self, path, ...)
|
||||||
|
local image = self.image
|
||||||
|
image:SetTexture(path)
|
||||||
|
|
||||||
|
if image:GetTexture() then
|
||||||
|
local n = select("#", ...)
|
||||||
|
if n == 4 or n == 8 then
|
||||||
|
image:SetTexCoord(...)
|
||||||
|
else
|
||||||
|
image:SetTexCoord(0, 1, 0, 1)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
AlignImage(self)
|
||||||
|
end
|
||||||
|
}
|
||||||
|
|
||||||
|
--[[-----------------------------------------------------------------------------
|
||||||
|
Constructor
|
||||||
|
-------------------------------------------------------------------------------]]
|
||||||
|
local function Constructor()
|
||||||
|
local frame = CreateFrame("Button", nil, UIParent)
|
||||||
|
frame:Hide()
|
||||||
|
|
||||||
|
frame:EnableMouse(true)
|
||||||
|
frame:SetScript("OnEnter", Control_OnEnter)
|
||||||
|
frame:SetScript("OnLeave", Control_OnLeave)
|
||||||
|
frame:SetScript("OnMouseDown", CheckBox_OnMouseDown)
|
||||||
|
frame:SetScript("OnMouseUp", CheckBox_OnMouseUp)
|
||||||
|
|
||||||
|
local checkbg = frame:CreateTexture(nil, "ARTWORK")
|
||||||
|
checkbg:SetWidth(24)
|
||||||
|
checkbg:SetHeight(24)
|
||||||
|
checkbg:SetPoint("TOPLEFT")
|
||||||
|
checkbg:SetTexture("Interface\\Buttons\\UI-CheckBox-Up")
|
||||||
|
|
||||||
|
local check = frame:CreateTexture(nil, "OVERLAY")
|
||||||
|
check:SetAllPoints(checkbg)
|
||||||
|
check:SetTexture("Interface\\Buttons\\UI-CheckBox-Check")
|
||||||
|
|
||||||
|
local text = frame:CreateFontString(nil, "OVERLAY", "GameFontHighlight")
|
||||||
|
text:SetJustifyH("LEFT")
|
||||||
|
text:SetHeight(18)
|
||||||
|
text:SetPoint("LEFT", checkbg, "RIGHT")
|
||||||
|
text:SetPoint("RIGHT")
|
||||||
|
|
||||||
|
local highlight = frame:CreateTexture(nil, "HIGHLIGHT")
|
||||||
|
highlight:SetTexture("Interface\\Buttons\\UI-CheckBox-Highlight")
|
||||||
|
highlight:SetBlendMode("ADD")
|
||||||
|
highlight:SetAllPoints(checkbg)
|
||||||
|
|
||||||
|
local image = frame:CreateTexture(nil, "OVERLAY")
|
||||||
|
image:SetHeight(16)
|
||||||
|
image:SetWidth(16)
|
||||||
|
image:SetPoint("LEFT", checkbg, "RIGHT", 1, 0)
|
||||||
|
|
||||||
|
local widget = {
|
||||||
|
checkbg = checkbg,
|
||||||
|
check = check,
|
||||||
|
text = text,
|
||||||
|
highlight = highlight,
|
||||||
|
image = image,
|
||||||
|
frame = frame,
|
||||||
|
type = Type
|
||||||
|
}
|
||||||
|
for method, func in pairs(methods) do
|
||||||
|
widget[method] = func
|
||||||
|
end
|
||||||
|
|
||||||
|
return AceGUI:RegisterAsWidget(widget)
|
||||||
|
end
|
||||||
|
|
||||||
|
AceGUI:RegisterWidgetType(Type, Constructor, Version)
|
|
@ -0,0 +1,188 @@
|
||||||
|
--[[-----------------------------------------------------------------------------
|
||||||
|
ColorPicker Widget
|
||||||
|
-------------------------------------------------------------------------------]]
|
||||||
|
local Type, Version = "ColorPicker", 23
|
||||||
|
local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
|
||||||
|
if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
|
||||||
|
|
||||||
|
-- Lua APIs
|
||||||
|
local pairs = pairs
|
||||||
|
|
||||||
|
-- WoW APIs
|
||||||
|
local CreateFrame, UIParent = CreateFrame, UIParent
|
||||||
|
|
||||||
|
-- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
|
||||||
|
-- List them here for Mikk's FindGlobals script
|
||||||
|
-- GLOBALS: ShowUIPanel, HideUIPanel, ColorPickerFrame, OpacitySliderFrame
|
||||||
|
|
||||||
|
--[[-----------------------------------------------------------------------------
|
||||||
|
Support functions
|
||||||
|
-------------------------------------------------------------------------------]]
|
||||||
|
local function ColorCallback(self, r, g, b, a, isAlpha)
|
||||||
|
if not self.HasAlpha then
|
||||||
|
a = 1
|
||||||
|
end
|
||||||
|
self:SetColor(r, g, b, a)
|
||||||
|
if ColorPickerFrame:IsVisible() then
|
||||||
|
--colorpicker is still open
|
||||||
|
self:Fire("OnValueChanged", r, g, b, a)
|
||||||
|
else
|
||||||
|
--colorpicker is closed, color callback is first, ignore it,
|
||||||
|
--alpha callback is the final call after it closes so confirm now
|
||||||
|
if isAlpha then
|
||||||
|
self:Fire("OnValueConfirmed", r, g, b, a)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
--[[-----------------------------------------------------------------------------
|
||||||
|
Scripts
|
||||||
|
-------------------------------------------------------------------------------]]
|
||||||
|
local function Control_OnEnter(frame)
|
||||||
|
frame.obj:Fire("OnEnter")
|
||||||
|
end
|
||||||
|
|
||||||
|
local function Control_OnLeave(frame)
|
||||||
|
frame.obj:Fire("OnLeave")
|
||||||
|
end
|
||||||
|
|
||||||
|
local function ColorSwatch_OnClick(frame)
|
||||||
|
HideUIPanel(ColorPickerFrame)
|
||||||
|
local self = frame.obj
|
||||||
|
if not self.disabled then
|
||||||
|
ColorPickerFrame:SetFrameStrata("FULLSCREEN_DIALOG")
|
||||||
|
ColorPickerFrame:SetFrameLevel(frame:GetFrameLevel() + 10)
|
||||||
|
ColorPickerFrame:SetClampedToScreen(true)
|
||||||
|
|
||||||
|
ColorPickerFrame.func = function()
|
||||||
|
local r, g, b = ColorPickerFrame:GetColorRGB()
|
||||||
|
local a = 1 - OpacitySliderFrame:GetValue()
|
||||||
|
ColorCallback(self, r, g, b, a)
|
||||||
|
end
|
||||||
|
|
||||||
|
ColorPickerFrame.hasOpacity = self.HasAlpha
|
||||||
|
ColorPickerFrame.opacityFunc = function()
|
||||||
|
local r, g, b = ColorPickerFrame:GetColorRGB()
|
||||||
|
local a = 1 - OpacitySliderFrame:GetValue()
|
||||||
|
ColorCallback(self, r, g, b, a, true)
|
||||||
|
end
|
||||||
|
|
||||||
|
local r, g, b, a = self.r, self.g, self.b, self.a
|
||||||
|
if self.HasAlpha then
|
||||||
|
ColorPickerFrame.opacity = 1 - (a or 0)
|
||||||
|
end
|
||||||
|
ColorPickerFrame:SetColorRGB(r, g, b)
|
||||||
|
|
||||||
|
ColorPickerFrame.cancelFunc = function()
|
||||||
|
ColorCallback(self, r, g, b, a, true)
|
||||||
|
end
|
||||||
|
|
||||||
|
ShowUIPanel(ColorPickerFrame)
|
||||||
|
end
|
||||||
|
AceGUI:ClearFocus()
|
||||||
|
end
|
||||||
|
|
||||||
|
--[[-----------------------------------------------------------------------------
|
||||||
|
Methods
|
||||||
|
-------------------------------------------------------------------------------]]
|
||||||
|
local methods = {
|
||||||
|
["OnAcquire"] = function(self)
|
||||||
|
self:SetHeight(24)
|
||||||
|
self:SetWidth(200)
|
||||||
|
self:SetHasAlpha(false)
|
||||||
|
self:SetColor(0, 0, 0, 1)
|
||||||
|
self:SetDisabled(nil)
|
||||||
|
self:SetLabel(nil)
|
||||||
|
end,
|
||||||
|
|
||||||
|
-- ["OnRelease"] = nil,
|
||||||
|
|
||||||
|
["SetLabel"] = function(self, text)
|
||||||
|
self.text:SetText(text)
|
||||||
|
end,
|
||||||
|
|
||||||
|
["SetColor"] = function(self, r, g, b, a)
|
||||||
|
self.r = r
|
||||||
|
self.g = g
|
||||||
|
self.b = b
|
||||||
|
self.a = a or 1
|
||||||
|
self.colorSwatch:SetVertexColor(r, g, b, a)
|
||||||
|
end,
|
||||||
|
|
||||||
|
["SetHasAlpha"] = function(self, HasAlpha)
|
||||||
|
self.HasAlpha = HasAlpha
|
||||||
|
end,
|
||||||
|
|
||||||
|
["SetDisabled"] = function(self, disabled)
|
||||||
|
self.disabled = disabled
|
||||||
|
if self.disabled then
|
||||||
|
self.frame:Disable()
|
||||||
|
self.text:SetTextColor(0.5, 0.5, 0.5)
|
||||||
|
else
|
||||||
|
self.frame:Enable()
|
||||||
|
self.text:SetTextColor(1, 1, 1)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
}
|
||||||
|
|
||||||
|
--[[-----------------------------------------------------------------------------
|
||||||
|
Constructor
|
||||||
|
-------------------------------------------------------------------------------]]
|
||||||
|
local function Constructor()
|
||||||
|
local frame = CreateFrame("Button", nil, UIParent)
|
||||||
|
frame:Hide()
|
||||||
|
|
||||||
|
frame:EnableMouse(true)
|
||||||
|
frame:SetScript("OnEnter", Control_OnEnter)
|
||||||
|
frame:SetScript("OnLeave", Control_OnLeave)
|
||||||
|
frame:SetScript("OnClick", ColorSwatch_OnClick)
|
||||||
|
|
||||||
|
local colorSwatch = frame:CreateTexture(nil, "OVERLAY")
|
||||||
|
colorSwatch:SetWidth(19)
|
||||||
|
colorSwatch:SetHeight(19)
|
||||||
|
colorSwatch:SetTexture("Interface\\ChatFrame\\ChatFrameColorSwatch")
|
||||||
|
colorSwatch:SetPoint("LEFT")
|
||||||
|
|
||||||
|
local texture = frame:CreateTexture(nil, "BACKGROUND")
|
||||||
|
texture:SetWidth(16)
|
||||||
|
texture:SetHeight(16)
|
||||||
|
texture:SetColorTexture(1, 1, 1)
|
||||||
|
texture:SetPoint("CENTER", colorSwatch)
|
||||||
|
texture:Show()
|
||||||
|
|
||||||
|
local checkers = frame:CreateTexture(nil, "BACKGROUND")
|
||||||
|
checkers:SetWidth(14)
|
||||||
|
checkers:SetHeight(14)
|
||||||
|
checkers:SetTexture("Tileset\\Generic\\Checkers")
|
||||||
|
checkers:SetTexCoord(.25, 0, 0.5, .25)
|
||||||
|
checkers:SetDesaturated(true)
|
||||||
|
checkers:SetVertexColor(1, 1, 1, 0.75)
|
||||||
|
checkers:SetPoint("CENTER", colorSwatch)
|
||||||
|
checkers:Show()
|
||||||
|
|
||||||
|
local text = frame:CreateFontString(nil,"OVERLAY","GameFontHighlight")
|
||||||
|
text:SetHeight(24)
|
||||||
|
text:SetJustifyH("LEFT")
|
||||||
|
text:SetTextColor(1, 1, 1)
|
||||||
|
text:SetPoint("LEFT", colorSwatch, "RIGHT", 2, 0)
|
||||||
|
text:SetPoint("RIGHT")
|
||||||
|
|
||||||
|
--local highlight = frame:CreateTexture(nil, "HIGHLIGHT")
|
||||||
|
--highlight:SetTexture("Interface\\QuestFrame\\UI-QuestTitleHighlight")
|
||||||
|
--highlight:SetBlendMode("ADD")
|
||||||
|
--highlight:SetAllPoints(frame)
|
||||||
|
|
||||||
|
local widget = {
|
||||||
|
colorSwatch = colorSwatch,
|
||||||
|
text = text,
|
||||||
|
frame = frame,
|
||||||
|
type = Type
|
||||||
|
}
|
||||||
|
for method, func in pairs(methods) do
|
||||||
|
widget[method] = func
|
||||||
|
end
|
||||||
|
|
||||||
|
return AceGUI:RegisterAsWidget(widget)
|
||||||
|
end
|
||||||
|
|
||||||
|
AceGUI:RegisterWidgetType(Type, Constructor, Version)
|
|
@ -0,0 +1,471 @@
|
||||||
|
--[[ $Id: AceGUIWidget-DropDown-Items.lua 1161 2017-08-12 14:30:16Z funkydude $ ]]--
|
||||||
|
|
||||||
|
local AceGUI = LibStub("AceGUI-3.0")
|
||||||
|
|
||||||
|
-- Lua APIs
|
||||||
|
local select, assert = select, assert
|
||||||
|
|
||||||
|
-- WoW APIs
|
||||||
|
local PlaySound = PlaySound
|
||||||
|
local CreateFrame = CreateFrame
|
||||||
|
|
||||||
|
local function fixlevels(parent,...)
|
||||||
|
local i = 1
|
||||||
|
local child = select(i, ...)
|
||||||
|
while child do
|
||||||
|
child:SetFrameLevel(parent:GetFrameLevel()+1)
|
||||||
|
fixlevels(child, child:GetChildren())
|
||||||
|
i = i + 1
|
||||||
|
child = select(i, ...)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local function fixstrata(strata, parent, ...)
|
||||||
|
local i = 1
|
||||||
|
local child = select(i, ...)
|
||||||
|
parent:SetFrameStrata(strata)
|
||||||
|
while child do
|
||||||
|
fixstrata(strata, child, child:GetChildren())
|
||||||
|
i = i + 1
|
||||||
|
child = select(i, ...)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- ItemBase is the base "class" for all dropdown items.
|
||||||
|
-- Each item has to use ItemBase.Create(widgetType) to
|
||||||
|
-- create an initial 'self' value.
|
||||||
|
-- ItemBase will add common functions and ui event handlers.
|
||||||
|
-- Be sure to keep basic usage when you override functions.
|
||||||
|
|
||||||
|
local ItemBase = {
|
||||||
|
-- NOTE: The ItemBase version is added to each item's version number
|
||||||
|
-- to ensure proper updates on ItemBase changes.
|
||||||
|
-- Use at least 1000er steps.
|
||||||
|
version = 1000,
|
||||||
|
counter = 0,
|
||||||
|
}
|
||||||
|
|
||||||
|
function ItemBase.Frame_OnEnter(this)
|
||||||
|
local self = this.obj
|
||||||
|
|
||||||
|
if self.useHighlight then
|
||||||
|
self.highlight:Show()
|
||||||
|
end
|
||||||
|
self:Fire("OnEnter")
|
||||||
|
|
||||||
|
if self.specialOnEnter then
|
||||||
|
self.specialOnEnter(self)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function ItemBase.Frame_OnLeave(this)
|
||||||
|
local self = this.obj
|
||||||
|
|
||||||
|
self.highlight:Hide()
|
||||||
|
self:Fire("OnLeave")
|
||||||
|
|
||||||
|
if self.specialOnLeave then
|
||||||
|
self.specialOnLeave(self)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- exported, AceGUI callback
|
||||||
|
function ItemBase.OnAcquire(self)
|
||||||
|
self.frame:SetToplevel(true)
|
||||||
|
self.frame:SetFrameStrata("FULLSCREEN_DIALOG")
|
||||||
|
end
|
||||||
|
|
||||||
|
-- exported, AceGUI callback
|
||||||
|
function ItemBase.OnRelease(self)
|
||||||
|
self:SetDisabled(false)
|
||||||
|
self.pullout = nil
|
||||||
|
self.frame:SetParent(nil)
|
||||||
|
self.frame:ClearAllPoints()
|
||||||
|
self.frame:Hide()
|
||||||
|
end
|
||||||
|
|
||||||
|
-- exported
|
||||||
|
-- NOTE: this is called by a Dropdown-Pullout.
|
||||||
|
-- Do not call this method directly
|
||||||
|
function ItemBase.SetPullout(self, pullout)
|
||||||
|
self.pullout = pullout
|
||||||
|
|
||||||
|
self.frame:SetParent(nil)
|
||||||
|
self.frame:SetParent(pullout.itemFrame)
|
||||||
|
self.parent = pullout.itemFrame
|
||||||
|
fixlevels(pullout.itemFrame, pullout.itemFrame:GetChildren())
|
||||||
|
end
|
||||||
|
|
||||||
|
-- exported
|
||||||
|
function ItemBase.SetText(self, text)
|
||||||
|
self.text:SetText(text or "")
|
||||||
|
end
|
||||||
|
|
||||||
|
-- exported
|
||||||
|
function ItemBase.GetText(self)
|
||||||
|
return self.text:GetText()
|
||||||
|
end
|
||||||
|
|
||||||
|
-- exported
|
||||||
|
function ItemBase.SetPoint(self, ...)
|
||||||
|
self.frame:SetPoint(...)
|
||||||
|
end
|
||||||
|
|
||||||
|
-- exported
|
||||||
|
function ItemBase.Show(self)
|
||||||
|
self.frame:Show()
|
||||||
|
end
|
||||||
|
|
||||||
|
-- exported
|
||||||
|
function ItemBase.Hide(self)
|
||||||
|
self.frame:Hide()
|
||||||
|
end
|
||||||
|
|
||||||
|
-- exported
|
||||||
|
function ItemBase.SetDisabled(self, disabled)
|
||||||
|
self.disabled = disabled
|
||||||
|
if disabled then
|
||||||
|
self.useHighlight = false
|
||||||
|
self.text:SetTextColor(.5, .5, .5)
|
||||||
|
else
|
||||||
|
self.useHighlight = true
|
||||||
|
self.text:SetTextColor(1, 1, 1)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- exported
|
||||||
|
-- NOTE: this is called by a Dropdown-Pullout.
|
||||||
|
-- Do not call this method directly
|
||||||
|
function ItemBase.SetOnLeave(self, func)
|
||||||
|
self.specialOnLeave = func
|
||||||
|
end
|
||||||
|
|
||||||
|
-- exported
|
||||||
|
-- NOTE: this is called by a Dropdown-Pullout.
|
||||||
|
-- Do not call this method directly
|
||||||
|
function ItemBase.SetOnEnter(self, func)
|
||||||
|
self.specialOnEnter = func
|
||||||
|
end
|
||||||
|
|
||||||
|
function ItemBase.Create(type)
|
||||||
|
-- NOTE: Most of the following code is copied from AceGUI-3.0/Dropdown widget
|
||||||
|
local count = AceGUI:GetNextWidgetNum(type)
|
||||||
|
local frame = CreateFrame("Button", "AceGUI30DropDownItem"..count)
|
||||||
|
local self = {}
|
||||||
|
self.frame = frame
|
||||||
|
frame.obj = self
|
||||||
|
self.type = type
|
||||||
|
|
||||||
|
self.useHighlight = true
|
||||||
|
|
||||||
|
frame:SetHeight(17)
|
||||||
|
frame:SetFrameStrata("FULLSCREEN_DIALOG")
|
||||||
|
|
||||||
|
local text = frame:CreateFontString(nil,"OVERLAY","GameFontNormalSmall")
|
||||||
|
text:SetTextColor(1,1,1)
|
||||||
|
text:SetJustifyH("LEFT")
|
||||||
|
text:SetPoint("TOPLEFT",frame,"TOPLEFT",18,0)
|
||||||
|
text:SetPoint("BOTTOMRIGHT",frame,"BOTTOMRIGHT",-8,0)
|
||||||
|
self.text = text
|
||||||
|
|
||||||
|
local highlight = frame:CreateTexture(nil, "OVERLAY")
|
||||||
|
highlight:SetTexture("Interface\\QuestFrame\\UI-QuestTitleHighlight")
|
||||||
|
highlight:SetBlendMode("ADD")
|
||||||
|
highlight:SetHeight(14)
|
||||||
|
highlight:ClearAllPoints()
|
||||||
|
highlight:SetPoint("RIGHT",frame,"RIGHT",-3,0)
|
||||||
|
highlight:SetPoint("LEFT",frame,"LEFT",5,0)
|
||||||
|
highlight:Hide()
|
||||||
|
self.highlight = highlight
|
||||||
|
|
||||||
|
local check = frame:CreateTexture("OVERLAY")
|
||||||
|
check:SetWidth(16)
|
||||||
|
check:SetHeight(16)
|
||||||
|
check:SetPoint("LEFT",frame,"LEFT",3,-1)
|
||||||
|
check:SetTexture("Interface\\Buttons\\UI-CheckBox-Check")
|
||||||
|
check:Hide()
|
||||||
|
self.check = check
|
||||||
|
|
||||||
|
local sub = frame:CreateTexture("OVERLAY")
|
||||||
|
sub:SetWidth(16)
|
||||||
|
sub:SetHeight(16)
|
||||||
|
sub:SetPoint("RIGHT",frame,"RIGHT",-3,-1)
|
||||||
|
sub:SetTexture("Interface\\ChatFrame\\ChatFrameExpandArrow")
|
||||||
|
sub:Hide()
|
||||||
|
self.sub = sub
|
||||||
|
|
||||||
|
frame:SetScript("OnEnter", ItemBase.Frame_OnEnter)
|
||||||
|
frame:SetScript("OnLeave", ItemBase.Frame_OnLeave)
|
||||||
|
|
||||||
|
self.OnAcquire = ItemBase.OnAcquire
|
||||||
|
self.OnRelease = ItemBase.OnRelease
|
||||||
|
|
||||||
|
self.SetPullout = ItemBase.SetPullout
|
||||||
|
self.GetText = ItemBase.GetText
|
||||||
|
self.SetText = ItemBase.SetText
|
||||||
|
self.SetDisabled = ItemBase.SetDisabled
|
||||||
|
|
||||||
|
self.SetPoint = ItemBase.SetPoint
|
||||||
|
self.Show = ItemBase.Show
|
||||||
|
self.Hide = ItemBase.Hide
|
||||||
|
|
||||||
|
self.SetOnLeave = ItemBase.SetOnLeave
|
||||||
|
self.SetOnEnter = ItemBase.SetOnEnter
|
||||||
|
|
||||||
|
return self
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Register a dummy LibStub library to retrieve the ItemBase, so other addons can use it.
|
||||||
|
local IBLib = LibStub:NewLibrary("AceGUI-3.0-DropDown-ItemBase", ItemBase.version)
|
||||||
|
if IBLib then
|
||||||
|
IBLib.GetItemBase = function() return ItemBase end
|
||||||
|
end
|
||||||
|
|
||||||
|
--[[
|
||||||
|
Template for items:
|
||||||
|
|
||||||
|
-- Item:
|
||||||
|
--
|
||||||
|
do
|
||||||
|
local widgetType = "Dropdown-Item-"
|
||||||
|
local widgetVersion = 1
|
||||||
|
|
||||||
|
local function Constructor()
|
||||||
|
local self = ItemBase.Create(widgetType)
|
||||||
|
|
||||||
|
AceGUI:RegisterAsWidget(self)
|
||||||
|
return self
|
||||||
|
end
|
||||||
|
|
||||||
|
AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion + ItemBase.version)
|
||||||
|
end
|
||||||
|
--]]
|
||||||
|
|
||||||
|
-- Item: Header
|
||||||
|
-- A single text entry.
|
||||||
|
-- Special: Different text color and no highlight
|
||||||
|
do
|
||||||
|
local widgetType = "Dropdown-Item-Header"
|
||||||
|
local widgetVersion = 1
|
||||||
|
|
||||||
|
local function OnEnter(this)
|
||||||
|
local self = this.obj
|
||||||
|
self:Fire("OnEnter")
|
||||||
|
|
||||||
|
if self.specialOnEnter then
|
||||||
|
self.specialOnEnter(self)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local function OnLeave(this)
|
||||||
|
local self = this.obj
|
||||||
|
self:Fire("OnLeave")
|
||||||
|
|
||||||
|
if self.specialOnLeave then
|
||||||
|
self.specialOnLeave(self)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- exported, override
|
||||||
|
local function SetDisabled(self, disabled)
|
||||||
|
ItemBase.SetDisabled(self, disabled)
|
||||||
|
if not disabled then
|
||||||
|
self.text:SetTextColor(1, 1, 0)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local function Constructor()
|
||||||
|
local self = ItemBase.Create(widgetType)
|
||||||
|
|
||||||
|
self.SetDisabled = SetDisabled
|
||||||
|
|
||||||
|
self.frame:SetScript("OnEnter", OnEnter)
|
||||||
|
self.frame:SetScript("OnLeave", OnLeave)
|
||||||
|
|
||||||
|
self.text:SetTextColor(1, 1, 0)
|
||||||
|
|
||||||
|
AceGUI:RegisterAsWidget(self)
|
||||||
|
return self
|
||||||
|
end
|
||||||
|
|
||||||
|
AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion + ItemBase.version)
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Item: Execute
|
||||||
|
-- A simple button
|
||||||
|
do
|
||||||
|
local widgetType = "Dropdown-Item-Execute"
|
||||||
|
local widgetVersion = 1
|
||||||
|
|
||||||
|
local function Frame_OnClick(this, button)
|
||||||
|
local self = this.obj
|
||||||
|
if self.disabled then return end
|
||||||
|
self:Fire("OnClick")
|
||||||
|
if self.pullout then
|
||||||
|
self.pullout:Close()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local function Constructor()
|
||||||
|
local self = ItemBase.Create(widgetType)
|
||||||
|
|
||||||
|
self.frame:SetScript("OnClick", Frame_OnClick)
|
||||||
|
|
||||||
|
AceGUI:RegisterAsWidget(self)
|
||||||
|
return self
|
||||||
|
end
|
||||||
|
|
||||||
|
AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion + ItemBase.version)
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Item: Toggle
|
||||||
|
-- Some sort of checkbox for dropdown menus.
|
||||||
|
-- Does not close the pullout on click.
|
||||||
|
do
|
||||||
|
local widgetType = "Dropdown-Item-Toggle"
|
||||||
|
local widgetVersion = 4
|
||||||
|
|
||||||
|
local function UpdateToggle(self)
|
||||||
|
if self.value then
|
||||||
|
self.check:Show()
|
||||||
|
else
|
||||||
|
self.check:Hide()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local function OnRelease(self)
|
||||||
|
ItemBase.OnRelease(self)
|
||||||
|
self:SetValue(nil)
|
||||||
|
end
|
||||||
|
|
||||||
|
local function Frame_OnClick(this, button)
|
||||||
|
local self = this.obj
|
||||||
|
if self.disabled then return end
|
||||||
|
self.value = not self.value
|
||||||
|
if self.value then
|
||||||
|
PlaySound(PlaySoundKitID and "igMainMenuOptionCheckBoxOn" or 856) -- SOUNDKIT.IG_MAINMENU_OPTION_CHECKBOX_ON
|
||||||
|
else
|
||||||
|
PlaySound(PlaySoundKitID and "igMainMenuOptionCheckBoxOff" or 857) -- SOUNDKIT.IG_MAINMENU_OPTION_CHECKBOX_OFF
|
||||||
|
end
|
||||||
|
UpdateToggle(self)
|
||||||
|
self:Fire("OnValueChanged", self.value)
|
||||||
|
end
|
||||||
|
|
||||||
|
-- exported
|
||||||
|
local function SetValue(self, value)
|
||||||
|
self.value = value
|
||||||
|
UpdateToggle(self)
|
||||||
|
end
|
||||||
|
|
||||||
|
-- exported
|
||||||
|
local function GetValue(self)
|
||||||
|
return self.value
|
||||||
|
end
|
||||||
|
|
||||||
|
local function Constructor()
|
||||||
|
local self = ItemBase.Create(widgetType)
|
||||||
|
|
||||||
|
self.frame:SetScript("OnClick", Frame_OnClick)
|
||||||
|
|
||||||
|
self.SetValue = SetValue
|
||||||
|
self.GetValue = GetValue
|
||||||
|
self.OnRelease = OnRelease
|
||||||
|
|
||||||
|
AceGUI:RegisterAsWidget(self)
|
||||||
|
return self
|
||||||
|
end
|
||||||
|
|
||||||
|
AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion + ItemBase.version)
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Item: Menu
|
||||||
|
-- Shows a submenu on mouse over
|
||||||
|
-- Does not close the pullout on click
|
||||||
|
do
|
||||||
|
local widgetType = "Dropdown-Item-Menu"
|
||||||
|
local widgetVersion = 2
|
||||||
|
|
||||||
|
local function OnEnter(this)
|
||||||
|
local self = this.obj
|
||||||
|
self:Fire("OnEnter")
|
||||||
|
|
||||||
|
if self.specialOnEnter then
|
||||||
|
self.specialOnEnter(self)
|
||||||
|
end
|
||||||
|
|
||||||
|
self.highlight:Show()
|
||||||
|
|
||||||
|
if not self.disabled and self.submenu then
|
||||||
|
self.submenu:Open("TOPLEFT", self.frame, "TOPRIGHT", self.pullout:GetRightBorderWidth(), 0, self.frame:GetFrameLevel() + 100)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local function OnHide(this)
|
||||||
|
local self = this.obj
|
||||||
|
if self.submenu then
|
||||||
|
self.submenu:Close()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- exported
|
||||||
|
local function SetMenu(self, menu)
|
||||||
|
assert(menu.type == "Dropdown-Pullout")
|
||||||
|
self.submenu = menu
|
||||||
|
end
|
||||||
|
|
||||||
|
-- exported
|
||||||
|
local function CloseMenu(self)
|
||||||
|
self.submenu:Close()
|
||||||
|
end
|
||||||
|
|
||||||
|
local function Constructor()
|
||||||
|
local self = ItemBase.Create(widgetType)
|
||||||
|
|
||||||
|
self.sub:Show()
|
||||||
|
|
||||||
|
self.frame:SetScript("OnEnter", OnEnter)
|
||||||
|
self.frame:SetScript("OnHide", OnHide)
|
||||||
|
|
||||||
|
self.SetMenu = SetMenu
|
||||||
|
self.CloseMenu = CloseMenu
|
||||||
|
|
||||||
|
AceGUI:RegisterAsWidget(self)
|
||||||
|
return self
|
||||||
|
end
|
||||||
|
|
||||||
|
AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion + ItemBase.version)
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Item: Separator
|
||||||
|
-- A single line to separate items
|
||||||
|
do
|
||||||
|
local widgetType = "Dropdown-Item-Separator"
|
||||||
|
local widgetVersion = 2
|
||||||
|
|
||||||
|
-- exported, override
|
||||||
|
local function SetDisabled(self, disabled)
|
||||||
|
ItemBase.SetDisabled(self, disabled)
|
||||||
|
self.useHighlight = false
|
||||||
|
end
|
||||||
|
|
||||||
|
local function Constructor()
|
||||||
|
local self = ItemBase.Create(widgetType)
|
||||||
|
|
||||||
|
self.SetDisabled = SetDisabled
|
||||||
|
|
||||||
|
local line = self.frame:CreateTexture(nil, "OVERLAY")
|
||||||
|
line:SetHeight(1)
|
||||||
|
line:SetColorTexture(.5, .5, .5)
|
||||||
|
line:SetPoint("LEFT", self.frame, "LEFT", 10, 0)
|
||||||
|
line:SetPoint("RIGHT", self.frame, "RIGHT", -10, 0)
|
||||||
|
|
||||||
|
self.text:Hide()
|
||||||
|
|
||||||
|
self.useHighlight = false
|
||||||
|
|
||||||
|
AceGUI:RegisterAsWidget(self)
|
||||||
|
return self
|
||||||
|
end
|
||||||
|
|
||||||
|
AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion + ItemBase.version)
|
||||||
|
end
|
|
@ -0,0 +1,737 @@
|
||||||
|
--[[ $Id: AceGUIWidget-DropDown.lua 1161 2017-08-12 14:30:16Z funkydude $ ]]--
|
||||||
|
local AceGUI = LibStub("AceGUI-3.0")
|
||||||
|
|
||||||
|
-- Lua APIs
|
||||||
|
local min, max, floor = math.min, math.max, math.floor
|
||||||
|
local select, pairs, ipairs, type = select, pairs, ipairs, type
|
||||||
|
local tsort = table.sort
|
||||||
|
|
||||||
|
-- WoW APIs
|
||||||
|
local PlaySound = PlaySound
|
||||||
|
local UIParent, CreateFrame = UIParent, CreateFrame
|
||||||
|
local _G = _G
|
||||||
|
|
||||||
|
-- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
|
||||||
|
-- List them here for Mikk's FindGlobals script
|
||||||
|
-- GLOBALS: CLOSE
|
||||||
|
|
||||||
|
local function fixlevels(parent,...)
|
||||||
|
local i = 1
|
||||||
|
local child = select(i, ...)
|
||||||
|
while child do
|
||||||
|
child:SetFrameLevel(parent:GetFrameLevel()+1)
|
||||||
|
fixlevels(child, child:GetChildren())
|
||||||
|
i = i + 1
|
||||||
|
child = select(i, ...)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local function fixstrata(strata, parent, ...)
|
||||||
|
local i = 1
|
||||||
|
local child = select(i, ...)
|
||||||
|
parent:SetFrameStrata(strata)
|
||||||
|
while child do
|
||||||
|
fixstrata(strata, child, child:GetChildren())
|
||||||
|
i = i + 1
|
||||||
|
child = select(i, ...)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
do
|
||||||
|
local widgetType = "Dropdown-Pullout"
|
||||||
|
local widgetVersion = 3
|
||||||
|
|
||||||
|
--[[ Static data ]]--
|
||||||
|
|
||||||
|
local backdrop = {
|
||||||
|
bgFile = "Interface\\ChatFrame\\ChatFrameBackground",
|
||||||
|
edgeFile = "Interface\\DialogFrame\\UI-DialogBox-Border",
|
||||||
|
edgeSize = 32,
|
||||||
|
tileSize = 32,
|
||||||
|
tile = true,
|
||||||
|
insets = { left = 11, right = 12, top = 12, bottom = 11 },
|
||||||
|
}
|
||||||
|
local sliderBackdrop = {
|
||||||
|
bgFile = "Interface\\Buttons\\UI-SliderBar-Background",
|
||||||
|
edgeFile = "Interface\\Buttons\\UI-SliderBar-Border",
|
||||||
|
tile = true, tileSize = 8, edgeSize = 8,
|
||||||
|
insets = { left = 3, right = 3, top = 3, bottom = 3 }
|
||||||
|
}
|
||||||
|
|
||||||
|
local defaultWidth = 200
|
||||||
|
local defaultMaxHeight = 600
|
||||||
|
|
||||||
|
--[[ UI Event Handlers ]]--
|
||||||
|
|
||||||
|
-- HACK: This should be no part of the pullout, but there
|
||||||
|
-- is no other 'clean' way to response to any item-OnEnter
|
||||||
|
-- Used to close Submenus when an other item is entered
|
||||||
|
local function OnEnter(item)
|
||||||
|
local self = item.pullout
|
||||||
|
for k, v in ipairs(self.items) do
|
||||||
|
if v.CloseMenu and v ~= item then
|
||||||
|
v:CloseMenu()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- See the note in Constructor() for each scroll related function
|
||||||
|
local function OnMouseWheel(this, value)
|
||||||
|
this.obj:MoveScroll(value)
|
||||||
|
end
|
||||||
|
|
||||||
|
local function OnScrollValueChanged(this, value)
|
||||||
|
this.obj:SetScroll(value)
|
||||||
|
end
|
||||||
|
|
||||||
|
local function OnSizeChanged(this)
|
||||||
|
this.obj:FixScroll()
|
||||||
|
end
|
||||||
|
|
||||||
|
--[[ Exported methods ]]--
|
||||||
|
|
||||||
|
-- exported
|
||||||
|
local function SetScroll(self, value)
|
||||||
|
local status = self.scrollStatus
|
||||||
|
local frame, child = self.scrollFrame, self.itemFrame
|
||||||
|
local height, viewheight = frame:GetHeight(), child:GetHeight()
|
||||||
|
|
||||||
|
local offset
|
||||||
|
if height > viewheight then
|
||||||
|
offset = 0
|
||||||
|
else
|
||||||
|
offset = floor((viewheight - height) / 1000 * value)
|
||||||
|
end
|
||||||
|
child:ClearAllPoints()
|
||||||
|
child:SetPoint("TOPLEFT", frame, "TOPLEFT", 0, offset)
|
||||||
|
child:SetPoint("TOPRIGHT", frame, "TOPRIGHT", self.slider:IsShown() and -12 or 0, offset)
|
||||||
|
status.offset = offset
|
||||||
|
status.scrollvalue = value
|
||||||
|
end
|
||||||
|
|
||||||
|
-- exported
|
||||||
|
local function MoveScroll(self, value)
|
||||||
|
local status = self.scrollStatus
|
||||||
|
local frame, child = self.scrollFrame, self.itemFrame
|
||||||
|
local height, viewheight = frame:GetHeight(), child:GetHeight()
|
||||||
|
|
||||||
|
if height > viewheight then
|
||||||
|
self.slider:Hide()
|
||||||
|
else
|
||||||
|
self.slider:Show()
|
||||||
|
local diff = height - viewheight
|
||||||
|
local delta = 1
|
||||||
|
if value < 0 then
|
||||||
|
delta = -1
|
||||||
|
end
|
||||||
|
self.slider:SetValue(min(max(status.scrollvalue + delta*(1000/(diff/45)),0), 1000))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- exported
|
||||||
|
local function FixScroll(self)
|
||||||
|
local status = self.scrollStatus
|
||||||
|
local frame, child = self.scrollFrame, self.itemFrame
|
||||||
|
local height, viewheight = frame:GetHeight(), child:GetHeight()
|
||||||
|
local offset = status.offset or 0
|
||||||
|
|
||||||
|
if viewheight < height then
|
||||||
|
self.slider:Hide()
|
||||||
|
child:SetPoint("TOPRIGHT", frame, "TOPRIGHT", 0, offset)
|
||||||
|
self.slider:SetValue(0)
|
||||||
|
else
|
||||||
|
self.slider:Show()
|
||||||
|
local value = (offset / (viewheight - height) * 1000)
|
||||||
|
if value > 1000 then value = 1000 end
|
||||||
|
self.slider:SetValue(value)
|
||||||
|
self:SetScroll(value)
|
||||||
|
if value < 1000 then
|
||||||
|
child:ClearAllPoints()
|
||||||
|
child:SetPoint("TOPLEFT", frame, "TOPLEFT", 0, offset)
|
||||||
|
child:SetPoint("TOPRIGHT", frame, "TOPRIGHT", -12, offset)
|
||||||
|
status.offset = offset
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- exported, AceGUI callback
|
||||||
|
local function OnAcquire(self)
|
||||||
|
self.frame:SetParent(UIParent)
|
||||||
|
--self.itemFrame:SetToplevel(true)
|
||||||
|
end
|
||||||
|
|
||||||
|
-- exported, AceGUI callback
|
||||||
|
local function OnRelease(self)
|
||||||
|
self:Clear()
|
||||||
|
self.frame:ClearAllPoints()
|
||||||
|
self.frame:Hide()
|
||||||
|
end
|
||||||
|
|
||||||
|
-- exported
|
||||||
|
local function AddItem(self, item)
|
||||||
|
self.items[#self.items + 1] = item
|
||||||
|
|
||||||
|
local h = #self.items * 16
|
||||||
|
self.itemFrame:SetHeight(h)
|
||||||
|
self.frame:SetHeight(min(h + 34, self.maxHeight)) -- +34: 20 for scrollFrame placement (10 offset) and +14 for item placement
|
||||||
|
|
||||||
|
item.frame:SetPoint("LEFT", self.itemFrame, "LEFT")
|
||||||
|
item.frame:SetPoint("RIGHT", self.itemFrame, "RIGHT")
|
||||||
|
|
||||||
|
item:SetPullout(self)
|
||||||
|
item:SetOnEnter(OnEnter)
|
||||||
|
end
|
||||||
|
|
||||||
|
-- exported
|
||||||
|
local function Open(self, point, relFrame, relPoint, x, y)
|
||||||
|
local items = self.items
|
||||||
|
local frame = self.frame
|
||||||
|
local itemFrame = self.itemFrame
|
||||||
|
|
||||||
|
frame:SetPoint(point, relFrame, relPoint, x, y)
|
||||||
|
|
||||||
|
|
||||||
|
local height = 8
|
||||||
|
for i, item in pairs(items) do
|
||||||
|
if i == 1 then
|
||||||
|
item:SetPoint("TOP", itemFrame, "TOP", 0, -2)
|
||||||
|
else
|
||||||
|
item:SetPoint("TOP", items[i-1].frame, "BOTTOM", 0, 1)
|
||||||
|
end
|
||||||
|
|
||||||
|
item:Show()
|
||||||
|
|
||||||
|
height = height + 16
|
||||||
|
end
|
||||||
|
itemFrame:SetHeight(height)
|
||||||
|
fixstrata("TOOLTIP", frame, frame:GetChildren())
|
||||||
|
frame:Show()
|
||||||
|
self:Fire("OnOpen")
|
||||||
|
end
|
||||||
|
|
||||||
|
-- exported
|
||||||
|
local function Close(self)
|
||||||
|
self.frame:Hide()
|
||||||
|
self:Fire("OnClose")
|
||||||
|
end
|
||||||
|
|
||||||
|
-- exported
|
||||||
|
local function Clear(self)
|
||||||
|
local items = self.items
|
||||||
|
for i, item in pairs(items) do
|
||||||
|
AceGUI:Release(item)
|
||||||
|
items[i] = nil
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- exported
|
||||||
|
local function IterateItems(self)
|
||||||
|
return ipairs(self.items)
|
||||||
|
end
|
||||||
|
|
||||||
|
-- exported
|
||||||
|
local function SetHideOnLeave(self, val)
|
||||||
|
self.hideOnLeave = val
|
||||||
|
end
|
||||||
|
|
||||||
|
-- exported
|
||||||
|
local function SetMaxHeight(self, height)
|
||||||
|
self.maxHeight = height or defaultMaxHeight
|
||||||
|
if self.frame:GetHeight() > height then
|
||||||
|
self.frame:SetHeight(height)
|
||||||
|
elseif (self.itemFrame:GetHeight() + 34) < height then
|
||||||
|
self.frame:SetHeight(self.itemFrame:GetHeight() + 34) -- see :AddItem
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- exported
|
||||||
|
local function GetRightBorderWidth(self)
|
||||||
|
return 6 + (self.slider:IsShown() and 12 or 0)
|
||||||
|
end
|
||||||
|
|
||||||
|
-- exported
|
||||||
|
local function GetLeftBorderWidth(self)
|
||||||
|
return 6
|
||||||
|
end
|
||||||
|
|
||||||
|
--[[ Constructor ]]--
|
||||||
|
|
||||||
|
local function Constructor()
|
||||||
|
local count = AceGUI:GetNextWidgetNum(widgetType)
|
||||||
|
local frame = CreateFrame("Frame", "AceGUI30Pullout"..count, UIParent)
|
||||||
|
local self = {}
|
||||||
|
self.count = count
|
||||||
|
self.type = widgetType
|
||||||
|
self.frame = frame
|
||||||
|
frame.obj = self
|
||||||
|
|
||||||
|
self.OnAcquire = OnAcquire
|
||||||
|
self.OnRelease = OnRelease
|
||||||
|
|
||||||
|
self.AddItem = AddItem
|
||||||
|
self.Open = Open
|
||||||
|
self.Close = Close
|
||||||
|
self.Clear = Clear
|
||||||
|
self.IterateItems = IterateItems
|
||||||
|
self.SetHideOnLeave = SetHideOnLeave
|
||||||
|
|
||||||
|
self.SetScroll = SetScroll
|
||||||
|
self.MoveScroll = MoveScroll
|
||||||
|
self.FixScroll = FixScroll
|
||||||
|
|
||||||
|
self.SetMaxHeight = SetMaxHeight
|
||||||
|
self.GetRightBorderWidth = GetRightBorderWidth
|
||||||
|
self.GetLeftBorderWidth = GetLeftBorderWidth
|
||||||
|
|
||||||
|
self.items = {}
|
||||||
|
|
||||||
|
self.scrollStatus = {
|
||||||
|
scrollvalue = 0,
|
||||||
|
}
|
||||||
|
|
||||||
|
self.maxHeight = defaultMaxHeight
|
||||||
|
|
||||||
|
frame:SetBackdrop(backdrop)
|
||||||
|
frame:SetBackdropColor(0, 0, 0)
|
||||||
|
frame:SetFrameStrata("FULLSCREEN_DIALOG")
|
||||||
|
frame:SetClampedToScreen(true)
|
||||||
|
frame:SetWidth(defaultWidth)
|
||||||
|
frame:SetHeight(self.maxHeight)
|
||||||
|
--frame:SetToplevel(true)
|
||||||
|
|
||||||
|
-- NOTE: The whole scroll frame code is copied from the AceGUI-3.0 widget ScrollFrame
|
||||||
|
local scrollFrame = CreateFrame("ScrollFrame", nil, frame)
|
||||||
|
local itemFrame = CreateFrame("Frame", nil, scrollFrame)
|
||||||
|
|
||||||
|
self.scrollFrame = scrollFrame
|
||||||
|
self.itemFrame = itemFrame
|
||||||
|
|
||||||
|
scrollFrame.obj = self
|
||||||
|
itemFrame.obj = self
|
||||||
|
|
||||||
|
local slider = CreateFrame("Slider", "AceGUI30PulloutScrollbar"..count, scrollFrame)
|
||||||
|
slider:SetOrientation("VERTICAL")
|
||||||
|
slider:SetHitRectInsets(0, 0, -10, 0)
|
||||||
|
slider:SetBackdrop(sliderBackdrop)
|
||||||
|
slider:SetWidth(8)
|
||||||
|
slider:SetThumbTexture("Interface\\Buttons\\UI-SliderBar-Button-Vertical")
|
||||||
|
slider:SetFrameStrata("FULLSCREEN_DIALOG")
|
||||||
|
self.slider = slider
|
||||||
|
slider.obj = self
|
||||||
|
|
||||||
|
scrollFrame:SetScrollChild(itemFrame)
|
||||||
|
scrollFrame:SetPoint("TOPLEFT", frame, "TOPLEFT", 6, -12)
|
||||||
|
scrollFrame:SetPoint("BOTTOMRIGHT", frame, "BOTTOMRIGHT", -6, 12)
|
||||||
|
scrollFrame:EnableMouseWheel(true)
|
||||||
|
scrollFrame:SetScript("OnMouseWheel", OnMouseWheel)
|
||||||
|
scrollFrame:SetScript("OnSizeChanged", OnSizeChanged)
|
||||||
|
scrollFrame:SetToplevel(true)
|
||||||
|
scrollFrame:SetFrameStrata("FULLSCREEN_DIALOG")
|
||||||
|
|
||||||
|
itemFrame:SetPoint("TOPLEFT", scrollFrame, "TOPLEFT", 0, 0)
|
||||||
|
itemFrame:SetPoint("TOPRIGHT", scrollFrame, "TOPRIGHT", -12, 0)
|
||||||
|
itemFrame:SetHeight(400)
|
||||||
|
itemFrame:SetToplevel(true)
|
||||||
|
itemFrame:SetFrameStrata("FULLSCREEN_DIALOG")
|
||||||
|
|
||||||
|
slider:SetPoint("TOPLEFT", scrollFrame, "TOPRIGHT", -16, 0)
|
||||||
|
slider:SetPoint("BOTTOMLEFT", scrollFrame, "BOTTOMRIGHT", -16, 0)
|
||||||
|
slider:SetScript("OnValueChanged", OnScrollValueChanged)
|
||||||
|
slider:SetMinMaxValues(0, 1000)
|
||||||
|
slider:SetValueStep(1)
|
||||||
|
slider:SetValue(0)
|
||||||
|
|
||||||
|
scrollFrame:Show()
|
||||||
|
itemFrame:Show()
|
||||||
|
slider:Hide()
|
||||||
|
|
||||||
|
self:FixScroll()
|
||||||
|
|
||||||
|
AceGUI:RegisterAsWidget(self)
|
||||||
|
return self
|
||||||
|
end
|
||||||
|
|
||||||
|
AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion)
|
||||||
|
end
|
||||||
|
|
||||||
|
do
|
||||||
|
local widgetType = "Dropdown"
|
||||||
|
local widgetVersion = 31
|
||||||
|
|
||||||
|
--[[ Static data ]]--
|
||||||
|
|
||||||
|
--[[ UI event handler ]]--
|
||||||
|
|
||||||
|
local function Control_OnEnter(this)
|
||||||
|
this.obj.button:LockHighlight()
|
||||||
|
this.obj:Fire("OnEnter")
|
||||||
|
end
|
||||||
|
|
||||||
|
local function Control_OnLeave(this)
|
||||||
|
this.obj.button:UnlockHighlight()
|
||||||
|
this.obj:Fire("OnLeave")
|
||||||
|
end
|
||||||
|
|
||||||
|
local function Dropdown_OnHide(this)
|
||||||
|
local self = this.obj
|
||||||
|
if self.open then
|
||||||
|
self.pullout:Close()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local function Dropdown_TogglePullout(this)
|
||||||
|
local self = this.obj
|
||||||
|
PlaySound(PlaySoundKitID and "igMainMenuOptionCheckBoxOn" or 856) -- SOUNDKIT.IG_MAINMENU_OPTION_CHECKBOX_ON
|
||||||
|
if self.open then
|
||||||
|
self.open = nil
|
||||||
|
self.pullout:Close()
|
||||||
|
AceGUI:ClearFocus()
|
||||||
|
else
|
||||||
|
self.open = true
|
||||||
|
self.pullout:SetWidth(self.pulloutWidth or self.frame:GetWidth())
|
||||||
|
self.pullout:Open("TOPLEFT", self.frame, "BOTTOMLEFT", 0, self.label:IsShown() and -2 or 0)
|
||||||
|
AceGUI:SetFocus(self)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local function OnPulloutOpen(this)
|
||||||
|
local self = this.userdata.obj
|
||||||
|
local value = self.value
|
||||||
|
|
||||||
|
if not self.multiselect then
|
||||||
|
for i, item in this:IterateItems() do
|
||||||
|
item:SetValue(item.userdata.value == value)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
self.open = true
|
||||||
|
self:Fire("OnOpened")
|
||||||
|
end
|
||||||
|
|
||||||
|
local function OnPulloutClose(this)
|
||||||
|
local self = this.userdata.obj
|
||||||
|
self.open = nil
|
||||||
|
self:Fire("OnClosed")
|
||||||
|
end
|
||||||
|
|
||||||
|
local function ShowMultiText(self)
|
||||||
|
local text
|
||||||
|
for i, widget in self.pullout:IterateItems() do
|
||||||
|
if widget.type == "Dropdown-Item-Toggle" then
|
||||||
|
if widget:GetValue() then
|
||||||
|
if text then
|
||||||
|
text = text..", "..widget:GetText()
|
||||||
|
else
|
||||||
|
text = widget:GetText()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
self:SetText(text)
|
||||||
|
end
|
||||||
|
|
||||||
|
local function OnItemValueChanged(this, event, checked)
|
||||||
|
local self = this.userdata.obj
|
||||||
|
|
||||||
|
if self.multiselect then
|
||||||
|
self:Fire("OnValueChanged", this.userdata.value, checked)
|
||||||
|
ShowMultiText(self)
|
||||||
|
else
|
||||||
|
if checked then
|
||||||
|
self:SetValue(this.userdata.value)
|
||||||
|
self:Fire("OnValueChanged", this.userdata.value)
|
||||||
|
else
|
||||||
|
this:SetValue(true)
|
||||||
|
end
|
||||||
|
if self.open then
|
||||||
|
self.pullout:Close()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
--[[ Exported methods ]]--
|
||||||
|
|
||||||
|
-- exported, AceGUI callback
|
||||||
|
local function OnAcquire(self)
|
||||||
|
local pullout = AceGUI:Create("Dropdown-Pullout")
|
||||||
|
self.pullout = pullout
|
||||||
|
pullout.userdata.obj = self
|
||||||
|
pullout:SetCallback("OnClose", OnPulloutClose)
|
||||||
|
pullout:SetCallback("OnOpen", OnPulloutOpen)
|
||||||
|
self.pullout.frame:SetFrameLevel(self.frame:GetFrameLevel() + 1)
|
||||||
|
fixlevels(self.pullout.frame, self.pullout.frame:GetChildren())
|
||||||
|
|
||||||
|
self:SetHeight(44)
|
||||||
|
self:SetWidth(200)
|
||||||
|
self:SetLabel()
|
||||||
|
self:SetPulloutWidth(nil)
|
||||||
|
end
|
||||||
|
|
||||||
|
-- exported, AceGUI callback
|
||||||
|
local function OnRelease(self)
|
||||||
|
if self.open then
|
||||||
|
self.pullout:Close()
|
||||||
|
end
|
||||||
|
AceGUI:Release(self.pullout)
|
||||||
|
self.pullout = nil
|
||||||
|
|
||||||
|
self:SetText("")
|
||||||
|
self:SetDisabled(false)
|
||||||
|
self:SetMultiselect(false)
|
||||||
|
|
||||||
|
self.value = nil
|
||||||
|
self.list = nil
|
||||||
|
self.open = nil
|
||||||
|
self.hasClose = nil
|
||||||
|
|
||||||
|
self.frame:ClearAllPoints()
|
||||||
|
self.frame:Hide()
|
||||||
|
end
|
||||||
|
|
||||||
|
-- exported
|
||||||
|
local function SetDisabled(self, disabled)
|
||||||
|
self.disabled = disabled
|
||||||
|
if disabled then
|
||||||
|
self.text:SetTextColor(0.5,0.5,0.5)
|
||||||
|
self.button:Disable()
|
||||||
|
self.button_cover:Disable()
|
||||||
|
self.label:SetTextColor(0.5,0.5,0.5)
|
||||||
|
else
|
||||||
|
self.button:Enable()
|
||||||
|
self.button_cover:Enable()
|
||||||
|
self.label:SetTextColor(1,.82,0)
|
||||||
|
self.text:SetTextColor(1,1,1)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- exported
|
||||||
|
local function ClearFocus(self)
|
||||||
|
if self.open then
|
||||||
|
self.pullout:Close()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- exported
|
||||||
|
local function SetText(self, text)
|
||||||
|
self.text:SetText(text or "")
|
||||||
|
end
|
||||||
|
|
||||||
|
-- exported
|
||||||
|
local function SetLabel(self, text)
|
||||||
|
if text and text ~= "" then
|
||||||
|
self.label:SetText(text)
|
||||||
|
self.label:Show()
|
||||||
|
self.dropdown:SetPoint("TOPLEFT",self.frame,"TOPLEFT",-15,-14)
|
||||||
|
self:SetHeight(40)
|
||||||
|
self.alignoffset = 26
|
||||||
|
else
|
||||||
|
self.label:SetText("")
|
||||||
|
self.label:Hide()
|
||||||
|
self.dropdown:SetPoint("TOPLEFT",self.frame,"TOPLEFT",-15,0)
|
||||||
|
self:SetHeight(26)
|
||||||
|
self.alignoffset = 12
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- exported
|
||||||
|
local function SetValue(self, value)
|
||||||
|
if self.list then
|
||||||
|
self:SetText(self.list[value] or "")
|
||||||
|
end
|
||||||
|
self.value = value
|
||||||
|
end
|
||||||
|
|
||||||
|
-- exported
|
||||||
|
local function GetValue(self)
|
||||||
|
return self.value
|
||||||
|
end
|
||||||
|
|
||||||
|
-- exported
|
||||||
|
local function SetItemValue(self, item, value)
|
||||||
|
if not self.multiselect then return end
|
||||||
|
for i, widget in self.pullout:IterateItems() do
|
||||||
|
if widget.userdata.value == item then
|
||||||
|
if widget.SetValue then
|
||||||
|
widget:SetValue(value)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
ShowMultiText(self)
|
||||||
|
end
|
||||||
|
|
||||||
|
-- exported
|
||||||
|
local function SetItemDisabled(self, item, disabled)
|
||||||
|
for i, widget in self.pullout:IterateItems() do
|
||||||
|
if widget.userdata.value == item then
|
||||||
|
widget:SetDisabled(disabled)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local function AddListItem(self, value, text, itemType)
|
||||||
|
if not itemType then itemType = "Dropdown-Item-Toggle" end
|
||||||
|
local exists = AceGUI:GetWidgetVersion(itemType)
|
||||||
|
if not exists then error(("The given item type, %q, does not exist within AceGUI-3.0"):format(tostring(itemType)), 2) end
|
||||||
|
|
||||||
|
local item = AceGUI:Create(itemType)
|
||||||
|
item:SetText(text)
|
||||||
|
item.userdata.obj = self
|
||||||
|
item.userdata.value = value
|
||||||
|
item:SetCallback("OnValueChanged", OnItemValueChanged)
|
||||||
|
self.pullout:AddItem(item)
|
||||||
|
end
|
||||||
|
|
||||||
|
local function AddCloseButton(self)
|
||||||
|
if not self.hasClose then
|
||||||
|
local close = AceGUI:Create("Dropdown-Item-Execute")
|
||||||
|
close:SetText(CLOSE)
|
||||||
|
self.pullout:AddItem(close)
|
||||||
|
self.hasClose = true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- exported
|
||||||
|
local sortlist = {}
|
||||||
|
local function SetList(self, list, order, itemType)
|
||||||
|
self.list = list
|
||||||
|
self.pullout:Clear()
|
||||||
|
self.hasClose = nil
|
||||||
|
if not list then return end
|
||||||
|
|
||||||
|
if type(order) ~= "table" then
|
||||||
|
for v in pairs(list) do
|
||||||
|
sortlist[#sortlist + 1] = v
|
||||||
|
end
|
||||||
|
tsort(sortlist)
|
||||||
|
|
||||||
|
for i, key in ipairs(sortlist) do
|
||||||
|
AddListItem(self, key, list[key], itemType)
|
||||||
|
sortlist[i] = nil
|
||||||
|
end
|
||||||
|
else
|
||||||
|
for i, key in ipairs(order) do
|
||||||
|
AddListItem(self, key, list[key], itemType)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if self.multiselect then
|
||||||
|
ShowMultiText(self)
|
||||||
|
AddCloseButton(self)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- exported
|
||||||
|
local function AddItem(self, value, text, itemType)
|
||||||
|
if self.list then
|
||||||
|
self.list[value] = text
|
||||||
|
AddListItem(self, value, text, itemType)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- exported
|
||||||
|
local function SetMultiselect(self, multi)
|
||||||
|
self.multiselect = multi
|
||||||
|
if multi then
|
||||||
|
ShowMultiText(self)
|
||||||
|
AddCloseButton(self)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- exported
|
||||||
|
local function GetMultiselect(self)
|
||||||
|
return self.multiselect
|
||||||
|
end
|
||||||
|
|
||||||
|
local function SetPulloutWidth(self, width)
|
||||||
|
self.pulloutWidth = width
|
||||||
|
end
|
||||||
|
|
||||||
|
--[[ Constructor ]]--
|
||||||
|
|
||||||
|
local function Constructor()
|
||||||
|
local count = AceGUI:GetNextWidgetNum(widgetType)
|
||||||
|
local frame = CreateFrame("Frame", nil, UIParent)
|
||||||
|
local dropdown = CreateFrame("Frame", "AceGUI30DropDown"..count, frame, "UIDropDownMenuTemplate")
|
||||||
|
|
||||||
|
local self = {}
|
||||||
|
self.type = widgetType
|
||||||
|
self.frame = frame
|
||||||
|
self.dropdown = dropdown
|
||||||
|
self.count = count
|
||||||
|
frame.obj = self
|
||||||
|
dropdown.obj = self
|
||||||
|
|
||||||
|
self.OnRelease = OnRelease
|
||||||
|
self.OnAcquire = OnAcquire
|
||||||
|
|
||||||
|
self.ClearFocus = ClearFocus
|
||||||
|
|
||||||
|
self.SetText = SetText
|
||||||
|
self.SetValue = SetValue
|
||||||
|
self.GetValue = GetValue
|
||||||
|
self.SetList = SetList
|
||||||
|
self.SetLabel = SetLabel
|
||||||
|
self.SetDisabled = SetDisabled
|
||||||
|
self.AddItem = AddItem
|
||||||
|
self.SetMultiselect = SetMultiselect
|
||||||
|
self.GetMultiselect = GetMultiselect
|
||||||
|
self.SetItemValue = SetItemValue
|
||||||
|
self.SetItemDisabled = SetItemDisabled
|
||||||
|
self.SetPulloutWidth = SetPulloutWidth
|
||||||
|
|
||||||
|
self.alignoffset = 26
|
||||||
|
|
||||||
|
frame:SetScript("OnHide",Dropdown_OnHide)
|
||||||
|
|
||||||
|
dropdown:ClearAllPoints()
|
||||||
|
dropdown:SetPoint("TOPLEFT",frame,"TOPLEFT",-15,0)
|
||||||
|
dropdown:SetPoint("BOTTOMRIGHT",frame,"BOTTOMRIGHT",17,0)
|
||||||
|
dropdown:SetScript("OnHide", nil)
|
||||||
|
|
||||||
|
local left = _G[dropdown:GetName() .. "Left"]
|
||||||
|
local middle = _G[dropdown:GetName() .. "Middle"]
|
||||||
|
local right = _G[dropdown:GetName() .. "Right"]
|
||||||
|
|
||||||
|
middle:ClearAllPoints()
|
||||||
|
right:ClearAllPoints()
|
||||||
|
|
||||||
|
middle:SetPoint("LEFT", left, "RIGHT", 0, 0)
|
||||||
|
middle:SetPoint("RIGHT", right, "LEFT", 0, 0)
|
||||||
|
right:SetPoint("TOPRIGHT", dropdown, "TOPRIGHT", 0, 17)
|
||||||
|
|
||||||
|
local button = _G[dropdown:GetName() .. "Button"]
|
||||||
|
self.button = button
|
||||||
|
button.obj = self
|
||||||
|
button:SetScript("OnEnter",Control_OnEnter)
|
||||||
|
button:SetScript("OnLeave",Control_OnLeave)
|
||||||
|
button:SetScript("OnClick",Dropdown_TogglePullout)
|
||||||
|
|
||||||
|
local button_cover = CreateFrame("BUTTON",nil,self.frame)
|
||||||
|
self.button_cover = button_cover
|
||||||
|
button_cover.obj = self
|
||||||
|
button_cover:SetPoint("TOPLEFT",self.frame,"BOTTOMLEFT",0,25)
|
||||||
|
button_cover:SetPoint("BOTTOMRIGHT",self.frame,"BOTTOMRIGHT")
|
||||||
|
button_cover:SetScript("OnEnter",Control_OnEnter)
|
||||||
|
button_cover:SetScript("OnLeave",Control_OnLeave)
|
||||||
|
button_cover:SetScript("OnClick",Dropdown_TogglePullout)
|
||||||
|
|
||||||
|
local text = _G[dropdown:GetName() .. "Text"]
|
||||||
|
self.text = text
|
||||||
|
text.obj = self
|
||||||
|
text:ClearAllPoints()
|
||||||
|
text:SetPoint("RIGHT", right, "RIGHT" ,-43, 2)
|
||||||
|
text:SetPoint("LEFT", left, "LEFT", 25, 2)
|
||||||
|
|
||||||
|
local label = frame:CreateFontString(nil,"OVERLAY","GameFontNormalSmall")
|
||||||
|
label:SetPoint("TOPLEFT",frame,"TOPLEFT",0,0)
|
||||||
|
label:SetPoint("TOPRIGHT",frame,"TOPRIGHT",0,0)
|
||||||
|
label:SetJustifyH("LEFT")
|
||||||
|
label:SetHeight(18)
|
||||||
|
label:Hide()
|
||||||
|
self.label = label
|
||||||
|
|
||||||
|
AceGUI:RegisterAsWidget(self)
|
||||||
|
return self
|
||||||
|
end
|
||||||
|
|
||||||
|
AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion)
|
||||||
|
end
|
|
@ -0,0 +1,265 @@
|
||||||
|
--[[-----------------------------------------------------------------------------
|
||||||
|
EditBox Widget
|
||||||
|
-------------------------------------------------------------------------------]]
|
||||||
|
local Type, Version = "EditBox", 27
|
||||||
|
local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
|
||||||
|
if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
|
||||||
|
|
||||||
|
-- Lua APIs
|
||||||
|
local tostring, pairs = tostring, pairs
|
||||||
|
|
||||||
|
-- WoW APIs
|
||||||
|
local PlaySound = PlaySound
|
||||||
|
local GetCursorInfo, ClearCursor, GetSpellInfo = GetCursorInfo, ClearCursor, GetSpellInfo
|
||||||
|
local CreateFrame, UIParent = CreateFrame, UIParent
|
||||||
|
local _G = _G
|
||||||
|
|
||||||
|
-- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
|
||||||
|
-- List them here for Mikk's FindGlobals script
|
||||||
|
-- GLOBALS: AceGUIEditBoxInsertLink, ChatFontNormal, OKAY
|
||||||
|
|
||||||
|
--[[-----------------------------------------------------------------------------
|
||||||
|
Support functions
|
||||||
|
-------------------------------------------------------------------------------]]
|
||||||
|
if not AceGUIEditBoxInsertLink then
|
||||||
|
-- upgradeable hook
|
||||||
|
hooksecurefunc("ChatEdit_InsertLink", function(...) return _G.AceGUIEditBoxInsertLink(...) end)
|
||||||
|
end
|
||||||
|
|
||||||
|
function _G.AceGUIEditBoxInsertLink(text)
|
||||||
|
for i = 1, AceGUI:GetWidgetCount(Type) do
|
||||||
|
local editbox = _G["AceGUI-3.0EditBox"..i]
|
||||||
|
if editbox and editbox:IsVisible() and editbox:HasFocus() then
|
||||||
|
editbox:Insert(text)
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local function ShowButton(self)
|
||||||
|
if not self.disablebutton then
|
||||||
|
self.button:Show()
|
||||||
|
self.editbox:SetTextInsets(0, 20, 3, 3)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local function HideButton(self)
|
||||||
|
self.button:Hide()
|
||||||
|
self.editbox:SetTextInsets(0, 0, 3, 3)
|
||||||
|
end
|
||||||
|
|
||||||
|
--[[-----------------------------------------------------------------------------
|
||||||
|
Scripts
|
||||||
|
-------------------------------------------------------------------------------]]
|
||||||
|
local function Control_OnEnter(frame)
|
||||||
|
frame.obj:Fire("OnEnter")
|
||||||
|
end
|
||||||
|
|
||||||
|
local function Control_OnLeave(frame)
|
||||||
|
frame.obj:Fire("OnLeave")
|
||||||
|
end
|
||||||
|
|
||||||
|
local function Frame_OnShowFocus(frame)
|
||||||
|
frame.obj.editbox:SetFocus()
|
||||||
|
frame:SetScript("OnShow", nil)
|
||||||
|
end
|
||||||
|
|
||||||
|
local function EditBox_OnEscapePressed(frame)
|
||||||
|
AceGUI:ClearFocus()
|
||||||
|
end
|
||||||
|
|
||||||
|
local function EditBox_OnEnterPressed(frame)
|
||||||
|
local self = frame.obj
|
||||||
|
local value = frame:GetText()
|
||||||
|
local cancel = self:Fire("OnEnterPressed", value)
|
||||||
|
if not cancel then
|
||||||
|
PlaySound(PlaySoundKitID and "igMainMenuOptionCheckBoxOn" or 856) -- SOUNDKIT.IG_MAINMENU_OPTION_CHECKBOX_ON
|
||||||
|
HideButton(self)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local function EditBox_OnReceiveDrag(frame)
|
||||||
|
local self = frame.obj
|
||||||
|
local type, id, info = GetCursorInfo()
|
||||||
|
if type == "item" then
|
||||||
|
self:SetText(info)
|
||||||
|
self:Fire("OnEnterPressed", info)
|
||||||
|
ClearCursor()
|
||||||
|
elseif type == "spell" then
|
||||||
|
local name = GetSpellInfo(id, info)
|
||||||
|
self:SetText(name)
|
||||||
|
self:Fire("OnEnterPressed", name)
|
||||||
|
ClearCursor()
|
||||||
|
elseif type == "macro" then
|
||||||
|
local name = GetMacroInfo(id)
|
||||||
|
self:SetText(name)
|
||||||
|
self:Fire("OnEnterPressed", name)
|
||||||
|
ClearCursor()
|
||||||
|
end
|
||||||
|
HideButton(self)
|
||||||
|
AceGUI:ClearFocus()
|
||||||
|
end
|
||||||
|
|
||||||
|
local function EditBox_OnTextChanged(frame)
|
||||||
|
local self = frame.obj
|
||||||
|
local value = frame:GetText()
|
||||||
|
if tostring(value) ~= tostring(self.lasttext) then
|
||||||
|
self:Fire("OnTextChanged", value)
|
||||||
|
self.lasttext = value
|
||||||
|
ShowButton(self)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local function EditBox_OnFocusGained(frame)
|
||||||
|
AceGUI:SetFocus(frame.obj)
|
||||||
|
end
|
||||||
|
|
||||||
|
local function Button_OnClick(frame)
|
||||||
|
local editbox = frame.obj.editbox
|
||||||
|
editbox:ClearFocus()
|
||||||
|
EditBox_OnEnterPressed(editbox)
|
||||||
|
end
|
||||||
|
|
||||||
|
--[[-----------------------------------------------------------------------------
|
||||||
|
Methods
|
||||||
|
-------------------------------------------------------------------------------]]
|
||||||
|
local methods = {
|
||||||
|
["OnAcquire"] = function(self)
|
||||||
|
-- height is controlled by SetLabel
|
||||||
|
self:SetWidth(200)
|
||||||
|
self:SetDisabled(false)
|
||||||
|
self:SetLabel()
|
||||||
|
self:SetText()
|
||||||
|
self:DisableButton(false)
|
||||||
|
self:SetMaxLetters(0)
|
||||||
|
end,
|
||||||
|
|
||||||
|
["OnRelease"] = function(self)
|
||||||
|
self:ClearFocus()
|
||||||
|
end,
|
||||||
|
|
||||||
|
["SetDisabled"] = function(self, disabled)
|
||||||
|
self.disabled = disabled
|
||||||
|
if disabled then
|
||||||
|
self.editbox:EnableMouse(false)
|
||||||
|
self.editbox:ClearFocus()
|
||||||
|
self.editbox:SetTextColor(0.5,0.5,0.5)
|
||||||
|
self.label:SetTextColor(0.5,0.5,0.5)
|
||||||
|
else
|
||||||
|
self.editbox:EnableMouse(true)
|
||||||
|
self.editbox:SetTextColor(1,1,1)
|
||||||
|
self.label:SetTextColor(1,.82,0)
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
|
||||||
|
["SetText"] = function(self, text)
|
||||||
|
self.lasttext = text or ""
|
||||||
|
self.editbox:SetText(text or "")
|
||||||
|
self.editbox:SetCursorPosition(0)
|
||||||
|
HideButton(self)
|
||||||
|
end,
|
||||||
|
|
||||||
|
["GetText"] = function(self, text)
|
||||||
|
return self.editbox:GetText()
|
||||||
|
end,
|
||||||
|
|
||||||
|
["SetLabel"] = function(self, text)
|
||||||
|
if text and text ~= "" then
|
||||||
|
self.label:SetText(text)
|
||||||
|
self.label:Show()
|
||||||
|
self.editbox:SetPoint("TOPLEFT",self.frame,"TOPLEFT",7,-18)
|
||||||
|
self:SetHeight(44)
|
||||||
|
self.alignoffset = 30
|
||||||
|
else
|
||||||
|
self.label:SetText("")
|
||||||
|
self.label:Hide()
|
||||||
|
self.editbox:SetPoint("TOPLEFT",self.frame,"TOPLEFT",7,0)
|
||||||
|
self:SetHeight(26)
|
||||||
|
self.alignoffset = 12
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
|
||||||
|
["DisableButton"] = function(self, disabled)
|
||||||
|
self.disablebutton = disabled
|
||||||
|
if disabled then
|
||||||
|
HideButton(self)
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
|
||||||
|
["SetMaxLetters"] = function (self, num)
|
||||||
|
self.editbox:SetMaxLetters(num or 0)
|
||||||
|
end,
|
||||||
|
|
||||||
|
["ClearFocus"] = function(self)
|
||||||
|
self.editbox:ClearFocus()
|
||||||
|
self.frame:SetScript("OnShow", nil)
|
||||||
|
end,
|
||||||
|
|
||||||
|
["SetFocus"] = function(self)
|
||||||
|
self.editbox:SetFocus()
|
||||||
|
if not self.frame:IsShown() then
|
||||||
|
self.frame:SetScript("OnShow", Frame_OnShowFocus)
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
|
||||||
|
["HighlightText"] = function(self, from, to)
|
||||||
|
self.editbox:HighlightText(from, to)
|
||||||
|
end
|
||||||
|
}
|
||||||
|
|
||||||
|
--[[-----------------------------------------------------------------------------
|
||||||
|
Constructor
|
||||||
|
-------------------------------------------------------------------------------]]
|
||||||
|
local function Constructor()
|
||||||
|
local num = AceGUI:GetNextWidgetNum(Type)
|
||||||
|
local frame = CreateFrame("Frame", nil, UIParent)
|
||||||
|
frame:Hide()
|
||||||
|
|
||||||
|
local editbox = CreateFrame("EditBox", "AceGUI-3.0EditBox"..num, frame, "InputBoxTemplate")
|
||||||
|
editbox:SetAutoFocus(false)
|
||||||
|
editbox:SetFontObject(ChatFontNormal)
|
||||||
|
editbox:SetScript("OnEnter", Control_OnEnter)
|
||||||
|
editbox:SetScript("OnLeave", Control_OnLeave)
|
||||||
|
editbox:SetScript("OnEscapePressed", EditBox_OnEscapePressed)
|
||||||
|
editbox:SetScript("OnEnterPressed", EditBox_OnEnterPressed)
|
||||||
|
editbox:SetScript("OnTextChanged", EditBox_OnTextChanged)
|
||||||
|
editbox:SetScript("OnReceiveDrag", EditBox_OnReceiveDrag)
|
||||||
|
editbox:SetScript("OnMouseDown", EditBox_OnReceiveDrag)
|
||||||
|
editbox:SetScript("OnEditFocusGained", EditBox_OnFocusGained)
|
||||||
|
editbox:SetTextInsets(0, 0, 3, 3)
|
||||||
|
editbox:SetMaxLetters(256)
|
||||||
|
editbox:SetPoint("BOTTOMLEFT", 6, 0)
|
||||||
|
editbox:SetPoint("BOTTOMRIGHT")
|
||||||
|
editbox:SetHeight(19)
|
||||||
|
|
||||||
|
local label = frame:CreateFontString(nil, "OVERLAY", "GameFontNormalSmall")
|
||||||
|
label:SetPoint("TOPLEFT", 0, -2)
|
||||||
|
label:SetPoint("TOPRIGHT", 0, -2)
|
||||||
|
label:SetJustifyH("LEFT")
|
||||||
|
label:SetHeight(18)
|
||||||
|
|
||||||
|
local button = CreateFrame("Button", nil, editbox, "UIPanelButtonTemplate")
|
||||||
|
button:SetWidth(40)
|
||||||
|
button:SetHeight(20)
|
||||||
|
button:SetPoint("RIGHT", -2, 0)
|
||||||
|
button:SetText(OKAY)
|
||||||
|
button:SetScript("OnClick", Button_OnClick)
|
||||||
|
button:Hide()
|
||||||
|
|
||||||
|
local widget = {
|
||||||
|
alignoffset = 30,
|
||||||
|
editbox = editbox,
|
||||||
|
label = label,
|
||||||
|
button = button,
|
||||||
|
frame = frame,
|
||||||
|
type = Type
|
||||||
|
}
|
||||||
|
for method, func in pairs(methods) do
|
||||||
|
widget[method] = func
|
||||||
|
end
|
||||||
|
editbox.obj, button.obj = widget, widget
|
||||||
|
|
||||||
|
return AceGUI:RegisterAsWidget(widget)
|
||||||
|
end
|
||||||
|
|
||||||
|
AceGUI:RegisterWidgetType(Type, Constructor, Version)
|
|
@ -0,0 +1,78 @@
|
||||||
|
--[[-----------------------------------------------------------------------------
|
||||||
|
Heading Widget
|
||||||
|
-------------------------------------------------------------------------------]]
|
||||||
|
local Type, Version = "Heading", 20
|
||||||
|
local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
|
||||||
|
if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
|
||||||
|
|
||||||
|
-- Lua APIs
|
||||||
|
local pairs = pairs
|
||||||
|
|
||||||
|
-- WoW APIs
|
||||||
|
local CreateFrame, UIParent = CreateFrame, UIParent
|
||||||
|
|
||||||
|
--[[-----------------------------------------------------------------------------
|
||||||
|
Methods
|
||||||
|
-------------------------------------------------------------------------------]]
|
||||||
|
local methods = {
|
||||||
|
["OnAcquire"] = function(self)
|
||||||
|
self:SetText()
|
||||||
|
self:SetFullWidth()
|
||||||
|
self:SetHeight(18)
|
||||||
|
end,
|
||||||
|
|
||||||
|
-- ["OnRelease"] = nil,
|
||||||
|
|
||||||
|
["SetText"] = function(self, text)
|
||||||
|
self.label:SetText(text or "")
|
||||||
|
if text and text ~= "" then
|
||||||
|
self.left:SetPoint("RIGHT", self.label, "LEFT", -5, 0)
|
||||||
|
self.right:Show()
|
||||||
|
else
|
||||||
|
self.left:SetPoint("RIGHT", -3, 0)
|
||||||
|
self.right:Hide()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
}
|
||||||
|
|
||||||
|
--[[-----------------------------------------------------------------------------
|
||||||
|
Constructor
|
||||||
|
-------------------------------------------------------------------------------]]
|
||||||
|
local function Constructor()
|
||||||
|
local frame = CreateFrame("Frame", nil, UIParent)
|
||||||
|
frame:Hide()
|
||||||
|
|
||||||
|
local label = frame:CreateFontString(nil, "BACKGROUND", "GameFontNormal")
|
||||||
|
label:SetPoint("TOP")
|
||||||
|
label:SetPoint("BOTTOM")
|
||||||
|
label:SetJustifyH("CENTER")
|
||||||
|
|
||||||
|
local left = frame:CreateTexture(nil, "BACKGROUND")
|
||||||
|
left:SetHeight(8)
|
||||||
|
left:SetPoint("LEFT", 3, 0)
|
||||||
|
left:SetPoint("RIGHT", label, "LEFT", -5, 0)
|
||||||
|
left:SetTexture("Interface\\Tooltips\\UI-Tooltip-Border")
|
||||||
|
left:SetTexCoord(0.81, 0.94, 0.5, 1)
|
||||||
|
|
||||||
|
local right = frame:CreateTexture(nil, "BACKGROUND")
|
||||||
|
right:SetHeight(8)
|
||||||
|
right:SetPoint("RIGHT", -3, 0)
|
||||||
|
right:SetPoint("LEFT", label, "RIGHT", 5, 0)
|
||||||
|
right:SetTexture("Interface\\Tooltips\\UI-Tooltip-Border")
|
||||||
|
right:SetTexCoord(0.81, 0.94, 0.5, 1)
|
||||||
|
|
||||||
|
local widget = {
|
||||||
|
label = label,
|
||||||
|
left = left,
|
||||||
|
right = right,
|
||||||
|
frame = frame,
|
||||||
|
type = Type
|
||||||
|
}
|
||||||
|
for method, func in pairs(methods) do
|
||||||
|
widget[method] = func
|
||||||
|
end
|
||||||
|
|
||||||
|
return AceGUI:RegisterAsWidget(widget)
|
||||||
|
end
|
||||||
|
|
||||||
|
AceGUI:RegisterWidgetType(Type, Constructor, Version)
|
|
@ -0,0 +1,140 @@
|
||||||
|
--[[-----------------------------------------------------------------------------
|
||||||
|
Icon Widget
|
||||||
|
-------------------------------------------------------------------------------]]
|
||||||
|
local Type, Version = "Icon", 21
|
||||||
|
local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
|
||||||
|
if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
|
||||||
|
|
||||||
|
-- Lua APIs
|
||||||
|
local select, pairs, print = select, pairs, print
|
||||||
|
|
||||||
|
-- WoW APIs
|
||||||
|
local CreateFrame, UIParent = CreateFrame, UIParent
|
||||||
|
|
||||||
|
--[[-----------------------------------------------------------------------------
|
||||||
|
Scripts
|
||||||
|
-------------------------------------------------------------------------------]]
|
||||||
|
local function Control_OnEnter(frame)
|
||||||
|
frame.obj:Fire("OnEnter")
|
||||||
|
end
|
||||||
|
|
||||||
|
local function Control_OnLeave(frame)
|
||||||
|
frame.obj:Fire("OnLeave")
|
||||||
|
end
|
||||||
|
|
||||||
|
local function Button_OnClick(frame, button)
|
||||||
|
frame.obj:Fire("OnClick", button)
|
||||||
|
AceGUI:ClearFocus()
|
||||||
|
end
|
||||||
|
|
||||||
|
--[[-----------------------------------------------------------------------------
|
||||||
|
Methods
|
||||||
|
-------------------------------------------------------------------------------]]
|
||||||
|
local methods = {
|
||||||
|
["OnAcquire"] = function(self)
|
||||||
|
self:SetHeight(110)
|
||||||
|
self:SetWidth(110)
|
||||||
|
self:SetLabel()
|
||||||
|
self:SetImage(nil)
|
||||||
|
self:SetImageSize(64, 64)
|
||||||
|
self:SetDisabled(false)
|
||||||
|
end,
|
||||||
|
|
||||||
|
-- ["OnRelease"] = nil,
|
||||||
|
|
||||||
|
["SetLabel"] = function(self, text)
|
||||||
|
if text and text ~= "" then
|
||||||
|
self.label:Show()
|
||||||
|
self.label:SetText(text)
|
||||||
|
self:SetHeight(self.image:GetHeight() + 25)
|
||||||
|
else
|
||||||
|
self.label:Hide()
|
||||||
|
self:SetHeight(self.image:GetHeight() + 10)
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
|
||||||
|
["SetImage"] = function(self, path, ...)
|
||||||
|
local image = self.image
|
||||||
|
image:SetTexture(path)
|
||||||
|
|
||||||
|
if image:GetTexture() then
|
||||||
|
local n = select("#", ...)
|
||||||
|
if n == 4 or n == 8 then
|
||||||
|
image:SetTexCoord(...)
|
||||||
|
else
|
||||||
|
image:SetTexCoord(0, 1, 0, 1)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
|
||||||
|
["SetImageSize"] = function(self, width, height)
|
||||||
|
self.image:SetWidth(width)
|
||||||
|
self.image:SetHeight(height)
|
||||||
|
--self.frame:SetWidth(width + 30)
|
||||||
|
if self.label:IsShown() then
|
||||||
|
self:SetHeight(height + 25)
|
||||||
|
else
|
||||||
|
self:SetHeight(height + 10)
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
|
||||||
|
["SetDisabled"] = function(self, disabled)
|
||||||
|
self.disabled = disabled
|
||||||
|
if disabled then
|
||||||
|
self.frame:Disable()
|
||||||
|
self.label:SetTextColor(0.5, 0.5, 0.5)
|
||||||
|
self.image:SetVertexColor(0.5, 0.5, 0.5, 0.5)
|
||||||
|
else
|
||||||
|
self.frame:Enable()
|
||||||
|
self.label:SetTextColor(1, 1, 1)
|
||||||
|
self.image:SetVertexColor(1, 1, 1, 1)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
}
|
||||||
|
|
||||||
|
--[[-----------------------------------------------------------------------------
|
||||||
|
Constructor
|
||||||
|
-------------------------------------------------------------------------------]]
|
||||||
|
local function Constructor()
|
||||||
|
local frame = CreateFrame("Button", nil, UIParent)
|
||||||
|
frame:Hide()
|
||||||
|
|
||||||
|
frame:EnableMouse(true)
|
||||||
|
frame:SetScript("OnEnter", Control_OnEnter)
|
||||||
|
frame:SetScript("OnLeave", Control_OnLeave)
|
||||||
|
frame:SetScript("OnClick", Button_OnClick)
|
||||||
|
|
||||||
|
local label = frame:CreateFontString(nil, "BACKGROUND", "GameFontHighlight")
|
||||||
|
label:SetPoint("BOTTOMLEFT")
|
||||||
|
label:SetPoint("BOTTOMRIGHT")
|
||||||
|
label:SetJustifyH("CENTER")
|
||||||
|
label:SetJustifyV("TOP")
|
||||||
|
label:SetHeight(18)
|
||||||
|
|
||||||
|
local image = frame:CreateTexture(nil, "BACKGROUND")
|
||||||
|
image:SetWidth(64)
|
||||||
|
image:SetHeight(64)
|
||||||
|
image:SetPoint("TOP", 0, -5)
|
||||||
|
|
||||||
|
local highlight = frame:CreateTexture(nil, "HIGHLIGHT")
|
||||||
|
highlight:SetAllPoints(image)
|
||||||
|
highlight:SetTexture("Interface\\PaperDollInfoFrame\\UI-Character-Tab-Highlight")
|
||||||
|
highlight:SetTexCoord(0, 1, 0.23, 0.77)
|
||||||
|
highlight:SetBlendMode("ADD")
|
||||||
|
|
||||||
|
local widget = {
|
||||||
|
label = label,
|
||||||
|
image = image,
|
||||||
|
frame = frame,
|
||||||
|
type = Type
|
||||||
|
}
|
||||||
|
for method, func in pairs(methods) do
|
||||||
|
widget[method] = func
|
||||||
|
end
|
||||||
|
|
||||||
|
widget.SetText = function(self, ...) print("AceGUI-3.0-Icon: SetText is deprecated! Use SetLabel instead!"); self:SetLabel(...) end
|
||||||
|
|
||||||
|
return AceGUI:RegisterAsWidget(widget)
|
||||||
|
end
|
||||||
|
|
||||||
|
AceGUI:RegisterWidgetType(Type, Constructor, Version)
|
|
@ -0,0 +1,101 @@
|
||||||
|
--[[-----------------------------------------------------------------------------
|
||||||
|
InteractiveLabel Widget
|
||||||
|
-------------------------------------------------------------------------------]]
|
||||||
|
local Type, Version = "InteractiveLabel", 21
|
||||||
|
local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
|
||||||
|
if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
|
||||||
|
|
||||||
|
-- Lua APIs
|
||||||
|
local select, pairs = select, pairs
|
||||||
|
|
||||||
|
-- WoW APIs
|
||||||
|
local CreateFrame, UIParent = CreateFrame, UIParent
|
||||||
|
|
||||||
|
-- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
|
||||||
|
-- List them here for Mikk's FindGlobals script
|
||||||
|
-- GLOBALS: GameFontHighlightSmall
|
||||||
|
|
||||||
|
--[[-----------------------------------------------------------------------------
|
||||||
|
Scripts
|
||||||
|
-------------------------------------------------------------------------------]]
|
||||||
|
local function Control_OnEnter(frame)
|
||||||
|
frame.obj:Fire("OnEnter")
|
||||||
|
end
|
||||||
|
|
||||||
|
local function Control_OnLeave(frame)
|
||||||
|
frame.obj:Fire("OnLeave")
|
||||||
|
end
|
||||||
|
|
||||||
|
local function Label_OnClick(frame, button)
|
||||||
|
frame.obj:Fire("OnClick", button)
|
||||||
|
AceGUI:ClearFocus()
|
||||||
|
end
|
||||||
|
|
||||||
|
--[[-----------------------------------------------------------------------------
|
||||||
|
Methods
|
||||||
|
-------------------------------------------------------------------------------]]
|
||||||
|
local methods = {
|
||||||
|
["OnAcquire"] = function(self)
|
||||||
|
self:LabelOnAcquire()
|
||||||
|
self:SetHighlight()
|
||||||
|
self:SetHighlightTexCoord()
|
||||||
|
self:SetDisabled(false)
|
||||||
|
end,
|
||||||
|
|
||||||
|
-- ["OnRelease"] = nil,
|
||||||
|
|
||||||
|
["SetHighlight"] = function(self, ...)
|
||||||
|
self.highlight:SetTexture(...)
|
||||||
|
end,
|
||||||
|
|
||||||
|
["SetHighlightTexCoord"] = function(self, ...)
|
||||||
|
local c = select("#", ...)
|
||||||
|
if c == 4 or c == 8 then
|
||||||
|
self.highlight:SetTexCoord(...)
|
||||||
|
else
|
||||||
|
self.highlight:SetTexCoord(0, 1, 0, 1)
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
|
||||||
|
["SetDisabled"] = function(self,disabled)
|
||||||
|
self.disabled = disabled
|
||||||
|
if disabled then
|
||||||
|
self.frame:EnableMouse(false)
|
||||||
|
self.label:SetTextColor(0.5, 0.5, 0.5)
|
||||||
|
else
|
||||||
|
self.frame:EnableMouse(true)
|
||||||
|
self.label:SetTextColor(1, 1, 1)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
}
|
||||||
|
|
||||||
|
--[[-----------------------------------------------------------------------------
|
||||||
|
Constructor
|
||||||
|
-------------------------------------------------------------------------------]]
|
||||||
|
local function Constructor()
|
||||||
|
-- create a Label type that we will hijack
|
||||||
|
local label = AceGUI:Create("Label")
|
||||||
|
|
||||||
|
local frame = label.frame
|
||||||
|
frame:EnableMouse(true)
|
||||||
|
frame:SetScript("OnEnter", Control_OnEnter)
|
||||||
|
frame:SetScript("OnLeave", Control_OnLeave)
|
||||||
|
frame:SetScript("OnMouseDown", Label_OnClick)
|
||||||
|
|
||||||
|
local highlight = frame:CreateTexture(nil, "HIGHLIGHT")
|
||||||
|
highlight:SetTexture(nil)
|
||||||
|
highlight:SetAllPoints()
|
||||||
|
highlight:SetBlendMode("ADD")
|
||||||
|
|
||||||
|
label.highlight = highlight
|
||||||
|
label.type = Type
|
||||||
|
label.LabelOnAcquire = label.OnAcquire
|
||||||
|
for method, func in pairs(methods) do
|
||||||
|
label[method] = func
|
||||||
|
end
|
||||||
|
|
||||||
|
return label
|
||||||
|
end
|
||||||
|
|
||||||
|
AceGUI:RegisterWidgetType(Type, Constructor, Version)
|
||||||
|
|
|
@ -0,0 +1,249 @@
|
||||||
|
--[[-----------------------------------------------------------------------------
|
||||||
|
Keybinding Widget
|
||||||
|
Set Keybindings in the Config UI.
|
||||||
|
-------------------------------------------------------------------------------]]
|
||||||
|
local Type, Version = "Keybinding", 25
|
||||||
|
local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
|
||||||
|
if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
|
||||||
|
|
||||||
|
-- Lua APIs
|
||||||
|
local pairs = pairs
|
||||||
|
|
||||||
|
-- WoW APIs
|
||||||
|
local IsShiftKeyDown, IsControlKeyDown, IsAltKeyDown = IsShiftKeyDown, IsControlKeyDown, IsAltKeyDown
|
||||||
|
local CreateFrame, UIParent = CreateFrame, UIParent
|
||||||
|
|
||||||
|
-- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
|
||||||
|
-- List them here for Mikk's FindGlobals script
|
||||||
|
-- GLOBALS: NOT_BOUND
|
||||||
|
|
||||||
|
--[[-----------------------------------------------------------------------------
|
||||||
|
Scripts
|
||||||
|
-------------------------------------------------------------------------------]]
|
||||||
|
|
||||||
|
local function Control_OnEnter(frame)
|
||||||
|
frame.obj:Fire("OnEnter")
|
||||||
|
end
|
||||||
|
|
||||||
|
local function Control_OnLeave(frame)
|
||||||
|
frame.obj:Fire("OnLeave")
|
||||||
|
end
|
||||||
|
|
||||||
|
local function Keybinding_OnClick(frame, button)
|
||||||
|
if button == "LeftButton" or button == "RightButton" then
|
||||||
|
local self = frame.obj
|
||||||
|
if self.waitingForKey then
|
||||||
|
frame:EnableKeyboard(false)
|
||||||
|
frame:EnableMouseWheel(false)
|
||||||
|
self.msgframe:Hide()
|
||||||
|
frame:UnlockHighlight()
|
||||||
|
self.waitingForKey = nil
|
||||||
|
else
|
||||||
|
frame:EnableKeyboard(true)
|
||||||
|
frame:EnableMouseWheel(true)
|
||||||
|
self.msgframe:Show()
|
||||||
|
frame:LockHighlight()
|
||||||
|
self.waitingForKey = true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
AceGUI:ClearFocus()
|
||||||
|
end
|
||||||
|
|
||||||
|
local ignoreKeys = {
|
||||||
|
["BUTTON1"] = true, ["BUTTON2"] = true,
|
||||||
|
["UNKNOWN"] = true,
|
||||||
|
["LSHIFT"] = true, ["LCTRL"] = true, ["LALT"] = true,
|
||||||
|
["RSHIFT"] = true, ["RCTRL"] = true, ["RALT"] = true,
|
||||||
|
}
|
||||||
|
local function Keybinding_OnKeyDown(frame, key)
|
||||||
|
local self = frame.obj
|
||||||
|
if self.waitingForKey then
|
||||||
|
local keyPressed = key
|
||||||
|
if keyPressed == "ESCAPE" then
|
||||||
|
keyPressed = ""
|
||||||
|
else
|
||||||
|
if ignoreKeys[keyPressed] then return end
|
||||||
|
if IsShiftKeyDown() then
|
||||||
|
keyPressed = "SHIFT-"..keyPressed
|
||||||
|
end
|
||||||
|
if IsControlKeyDown() then
|
||||||
|
keyPressed = "CTRL-"..keyPressed
|
||||||
|
end
|
||||||
|
if IsAltKeyDown() then
|
||||||
|
keyPressed = "ALT-"..keyPressed
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
frame:EnableKeyboard(false)
|
||||||
|
frame:EnableMouseWheel(false)
|
||||||
|
self.msgframe:Hide()
|
||||||
|
frame:UnlockHighlight()
|
||||||
|
self.waitingForKey = nil
|
||||||
|
|
||||||
|
if not self.disabled then
|
||||||
|
self:SetKey(keyPressed)
|
||||||
|
self:Fire("OnKeyChanged", keyPressed)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local function Keybinding_OnMouseDown(frame, button)
|
||||||
|
if button == "LeftButton" or button == "RightButton" then
|
||||||
|
return
|
||||||
|
elseif button == "MiddleButton" then
|
||||||
|
button = "BUTTON3"
|
||||||
|
elseif button == "Button4" then
|
||||||
|
button = "BUTTON4"
|
||||||
|
elseif button == "Button5" then
|
||||||
|
button = "BUTTON5"
|
||||||
|
end
|
||||||
|
Keybinding_OnKeyDown(frame, button)
|
||||||
|
end
|
||||||
|
|
||||||
|
local function Keybinding_OnMouseWheel(frame, direction)
|
||||||
|
local button
|
||||||
|
if direction >= 0 then
|
||||||
|
button = "MOUSEWHEELUP"
|
||||||
|
else
|
||||||
|
button = "MOUSEWHEELDOWN"
|
||||||
|
end
|
||||||
|
Keybinding_OnKeyDown(frame, button)
|
||||||
|
end
|
||||||
|
|
||||||
|
--[[-----------------------------------------------------------------------------
|
||||||
|
Methods
|
||||||
|
-------------------------------------------------------------------------------]]
|
||||||
|
local methods = {
|
||||||
|
["OnAcquire"] = function(self)
|
||||||
|
self:SetWidth(200)
|
||||||
|
self:SetLabel("")
|
||||||
|
self:SetKey("")
|
||||||
|
self.waitingForKey = nil
|
||||||
|
self.msgframe:Hide()
|
||||||
|
self:SetDisabled(false)
|
||||||
|
self.button:EnableKeyboard(false)
|
||||||
|
self.button:EnableMouseWheel(false)
|
||||||
|
end,
|
||||||
|
|
||||||
|
-- ["OnRelease"] = nil,
|
||||||
|
|
||||||
|
["SetDisabled"] = function(self, disabled)
|
||||||
|
self.disabled = disabled
|
||||||
|
if disabled then
|
||||||
|
self.button:Disable()
|
||||||
|
self.label:SetTextColor(0.5,0.5,0.5)
|
||||||
|
else
|
||||||
|
self.button:Enable()
|
||||||
|
self.label:SetTextColor(1,1,1)
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
|
||||||
|
["SetKey"] = function(self, key)
|
||||||
|
if (key or "") == "" then
|
||||||
|
self.button:SetText(NOT_BOUND)
|
||||||
|
self.button:SetNormalFontObject("GameFontNormal")
|
||||||
|
else
|
||||||
|
self.button:SetText(key)
|
||||||
|
self.button:SetNormalFontObject("GameFontHighlight")
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
|
||||||
|
["GetKey"] = function(self)
|
||||||
|
local key = self.button:GetText()
|
||||||
|
if key == NOT_BOUND then
|
||||||
|
key = nil
|
||||||
|
end
|
||||||
|
return key
|
||||||
|
end,
|
||||||
|
|
||||||
|
["SetLabel"] = function(self, label)
|
||||||
|
self.label:SetText(label or "")
|
||||||
|
if (label or "") == "" then
|
||||||
|
self.alignoffset = nil
|
||||||
|
self:SetHeight(24)
|
||||||
|
else
|
||||||
|
self.alignoffset = 30
|
||||||
|
self:SetHeight(44)
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
}
|
||||||
|
|
||||||
|
--[[-----------------------------------------------------------------------------
|
||||||
|
Constructor
|
||||||
|
-------------------------------------------------------------------------------]]
|
||||||
|
|
||||||
|
local ControlBackdrop = {
|
||||||
|
bgFile = "Interface\\Tooltips\\UI-Tooltip-Background",
|
||||||
|
edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border",
|
||||||
|
tile = true, tileSize = 16, edgeSize = 16,
|
||||||
|
insets = { left = 3, right = 3, top = 3, bottom = 3 }
|
||||||
|
}
|
||||||
|
|
||||||
|
local function keybindingMsgFixWidth(frame)
|
||||||
|
frame:SetWidth(frame.msg:GetWidth() + 10)
|
||||||
|
frame:SetScript("OnUpdate", nil)
|
||||||
|
end
|
||||||
|
|
||||||
|
local function Constructor()
|
||||||
|
local name = "AceGUI30KeybindingButton" .. AceGUI:GetNextWidgetNum(Type)
|
||||||
|
|
||||||
|
local frame = CreateFrame("Frame", nil, UIParent)
|
||||||
|
local button = CreateFrame("Button", name, frame, "UIPanelButtonTemplate")
|
||||||
|
|
||||||
|
button:EnableMouse(true)
|
||||||
|
button:EnableMouseWheel(false)
|
||||||
|
button:RegisterForClicks("AnyDown")
|
||||||
|
button:SetScript("OnEnter", Control_OnEnter)
|
||||||
|
button:SetScript("OnLeave", Control_OnLeave)
|
||||||
|
button:SetScript("OnClick", Keybinding_OnClick)
|
||||||
|
button:SetScript("OnKeyDown", Keybinding_OnKeyDown)
|
||||||
|
button:SetScript("OnMouseDown", Keybinding_OnMouseDown)
|
||||||
|
button:SetScript("OnMouseWheel", Keybinding_OnMouseWheel)
|
||||||
|
button:SetPoint("BOTTOMLEFT")
|
||||||
|
button:SetPoint("BOTTOMRIGHT")
|
||||||
|
button:SetHeight(24)
|
||||||
|
button:EnableKeyboard(false)
|
||||||
|
|
||||||
|
local text = button:GetFontString()
|
||||||
|
text:SetPoint("LEFT", 7, 0)
|
||||||
|
text:SetPoint("RIGHT", -7, 0)
|
||||||
|
|
||||||
|
local label = frame:CreateFontString(nil, "OVERLAY", "GameFontHighlight")
|
||||||
|
label:SetPoint("TOPLEFT")
|
||||||
|
label:SetPoint("TOPRIGHT")
|
||||||
|
label:SetJustifyH("CENTER")
|
||||||
|
label:SetHeight(18)
|
||||||
|
|
||||||
|
local msgframe = CreateFrame("Frame", nil, UIParent)
|
||||||
|
msgframe:SetHeight(30)
|
||||||
|
msgframe:SetBackdrop(ControlBackdrop)
|
||||||
|
msgframe:SetBackdropColor(0,0,0)
|
||||||
|
msgframe:SetFrameStrata("FULLSCREEN_DIALOG")
|
||||||
|
msgframe:SetFrameLevel(1000)
|
||||||
|
msgframe:SetToplevel(true)
|
||||||
|
|
||||||
|
local msg = msgframe:CreateFontString(nil, "OVERLAY", "GameFontNormal")
|
||||||
|
msg:SetText("Press a key to bind, ESC to clear the binding or click the button again to cancel.")
|
||||||
|
msgframe.msg = msg
|
||||||
|
msg:SetPoint("TOPLEFT", 5, -5)
|
||||||
|
msgframe:SetScript("OnUpdate", keybindingMsgFixWidth)
|
||||||
|
msgframe:SetPoint("BOTTOM", button, "TOP")
|
||||||
|
msgframe:Hide()
|
||||||
|
|
||||||
|
local widget = {
|
||||||
|
button = button,
|
||||||
|
label = label,
|
||||||
|
msgframe = msgframe,
|
||||||
|
frame = frame,
|
||||||
|
alignoffset = 30,
|
||||||
|
type = Type
|
||||||
|
}
|
||||||
|
for method, func in pairs(methods) do
|
||||||
|
widget[method] = func
|
||||||
|
end
|
||||||
|
button.obj = widget
|
||||||
|
|
||||||
|
return AceGUI:RegisterAsWidget(widget)
|
||||||
|
end
|
||||||
|
|
||||||
|
AceGUI:RegisterWidgetType(Type, Constructor, Version)
|
|
@ -0,0 +1,173 @@
|
||||||
|
--[[-----------------------------------------------------------------------------
|
||||||
|
Label Widget
|
||||||
|
Displays text and optionally an icon.
|
||||||
|
-------------------------------------------------------------------------------]]
|
||||||
|
local Type, Version = "Label", 24
|
||||||
|
local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
|
||||||
|
if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
|
||||||
|
|
||||||
|
-- Lua APIs
|
||||||
|
local max, select, pairs = math.max, select, pairs
|
||||||
|
|
||||||
|
-- WoW APIs
|
||||||
|
local CreateFrame, UIParent = CreateFrame, UIParent
|
||||||
|
|
||||||
|
-- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
|
||||||
|
-- List them here for Mikk's FindGlobals script
|
||||||
|
-- GLOBALS: GameFontHighlightSmall
|
||||||
|
|
||||||
|
--[[-----------------------------------------------------------------------------
|
||||||
|
Support functions
|
||||||
|
-------------------------------------------------------------------------------]]
|
||||||
|
|
||||||
|
local function UpdateImageAnchor(self)
|
||||||
|
if self.resizing then return end
|
||||||
|
local frame = self.frame
|
||||||
|
local width = frame.width or frame:GetWidth() or 0
|
||||||
|
local image = self.image
|
||||||
|
local label = self.label
|
||||||
|
local height
|
||||||
|
|
||||||
|
label:ClearAllPoints()
|
||||||
|
image:ClearAllPoints()
|
||||||
|
|
||||||
|
if self.imageshown then
|
||||||
|
local imagewidth = image:GetWidth()
|
||||||
|
if (width - imagewidth) < 200 or (label:GetText() or "") == "" then
|
||||||
|
-- image goes on top centered when less than 200 width for the text, or if there is no text
|
||||||
|
image:SetPoint("TOP")
|
||||||
|
label:SetPoint("TOP", image, "BOTTOM")
|
||||||
|
label:SetPoint("LEFT")
|
||||||
|
label:SetWidth(width)
|
||||||
|
height = image:GetHeight() + label:GetHeight()
|
||||||
|
else
|
||||||
|
-- image on the left
|
||||||
|
image:SetPoint("TOPLEFT")
|
||||||
|
if image:GetHeight() > label:GetHeight() then
|
||||||
|
label:SetPoint("LEFT", image, "RIGHT", 4, 0)
|
||||||
|
else
|
||||||
|
label:SetPoint("TOPLEFT", image, "TOPRIGHT", 4, 0)
|
||||||
|
end
|
||||||
|
label:SetWidth(width - imagewidth - 4)
|
||||||
|
height = max(image:GetHeight(), label:GetHeight())
|
||||||
|
end
|
||||||
|
else
|
||||||
|
-- no image shown
|
||||||
|
label:SetPoint("TOPLEFT")
|
||||||
|
label:SetWidth(width)
|
||||||
|
height = label:GetHeight()
|
||||||
|
end
|
||||||
|
|
||||||
|
self.resizing = true
|
||||||
|
frame:SetHeight(height)
|
||||||
|
frame.height = height
|
||||||
|
self.resizing = nil
|
||||||
|
end
|
||||||
|
|
||||||
|
--[[-----------------------------------------------------------------------------
|
||||||
|
Methods
|
||||||
|
-------------------------------------------------------------------------------]]
|
||||||
|
local methods = {
|
||||||
|
["OnAcquire"] = function(self)
|
||||||
|
-- set the flag to stop constant size updates
|
||||||
|
self.resizing = true
|
||||||
|
-- height is set dynamically by the text and image size
|
||||||
|
self:SetWidth(200)
|
||||||
|
self:SetText()
|
||||||
|
self:SetImage(nil)
|
||||||
|
self:SetImageSize(16, 16)
|
||||||
|
self:SetColor()
|
||||||
|
self:SetFontObject()
|
||||||
|
self:SetJustifyH("LEFT")
|
||||||
|
self:SetJustifyV("TOP")
|
||||||
|
|
||||||
|
-- reset the flag
|
||||||
|
self.resizing = nil
|
||||||
|
-- run the update explicitly
|
||||||
|
UpdateImageAnchor(self)
|
||||||
|
end,
|
||||||
|
|
||||||
|
-- ["OnRelease"] = nil,
|
||||||
|
|
||||||
|
["OnWidthSet"] = function(self, width)
|
||||||
|
UpdateImageAnchor(self)
|
||||||
|
end,
|
||||||
|
|
||||||
|
["SetText"] = function(self, text)
|
||||||
|
self.label:SetText(text)
|
||||||
|
UpdateImageAnchor(self)
|
||||||
|
end,
|
||||||
|
|
||||||
|
["SetColor"] = function(self, r, g, b)
|
||||||
|
if not (r and g and b) then
|
||||||
|
r, g, b = 1, 1, 1
|
||||||
|
end
|
||||||
|
self.label:SetVertexColor(r, g, b)
|
||||||
|
end,
|
||||||
|
|
||||||
|
["SetImage"] = function(self, path, ...)
|
||||||
|
local image = self.image
|
||||||
|
image:SetTexture(path)
|
||||||
|
|
||||||
|
if image:GetTexture() then
|
||||||
|
self.imageshown = true
|
||||||
|
local n = select("#", ...)
|
||||||
|
if n == 4 or n == 8 then
|
||||||
|
image:SetTexCoord(...)
|
||||||
|
else
|
||||||
|
image:SetTexCoord(0, 1, 0, 1)
|
||||||
|
end
|
||||||
|
else
|
||||||
|
self.imageshown = nil
|
||||||
|
end
|
||||||
|
UpdateImageAnchor(self)
|
||||||
|
end,
|
||||||
|
|
||||||
|
["SetFont"] = function(self, font, height, flags)
|
||||||
|
self.label:SetFont(font, height, flags)
|
||||||
|
end,
|
||||||
|
|
||||||
|
["SetFontObject"] = function(self, font)
|
||||||
|
self:SetFont((font or GameFontHighlightSmall):GetFont())
|
||||||
|
end,
|
||||||
|
|
||||||
|
["SetImageSize"] = function(self, width, height)
|
||||||
|
self.image:SetWidth(width)
|
||||||
|
self.image:SetHeight(height)
|
||||||
|
UpdateImageAnchor(self)
|
||||||
|
end,
|
||||||
|
|
||||||
|
["SetJustifyH"] = function(self, justifyH)
|
||||||
|
self.label:SetJustifyH(justifyH)
|
||||||
|
end,
|
||||||
|
|
||||||
|
["SetJustifyV"] = function(self, justifyV)
|
||||||
|
self.label:SetJustifyV(justifyV)
|
||||||
|
end,
|
||||||
|
}
|
||||||
|
|
||||||
|
--[[-----------------------------------------------------------------------------
|
||||||
|
Constructor
|
||||||
|
-------------------------------------------------------------------------------]]
|
||||||
|
local function Constructor()
|
||||||
|
local frame = CreateFrame("Frame", nil, UIParent)
|
||||||
|
frame:Hide()
|
||||||
|
|
||||||
|
local label = frame:CreateFontString(nil, "BACKGROUND", "GameFontHighlightSmall")
|
||||||
|
local image = frame:CreateTexture(nil, "BACKGROUND")
|
||||||
|
|
||||||
|
-- create widget
|
||||||
|
local widget = {
|
||||||
|
label = label,
|
||||||
|
image = image,
|
||||||
|
frame = frame,
|
||||||
|
type = Type
|
||||||
|
}
|
||||||
|
for method, func in pairs(methods) do
|
||||||
|
widget[method] = func
|
||||||
|
end
|
||||||
|
|
||||||
|
return AceGUI:RegisterAsWidget(widget)
|
||||||
|
end
|
||||||
|
|
||||||
|
AceGUI:RegisterWidgetType(Type, Constructor, Version)
|
|
@ -0,0 +1,366 @@
|
||||||
|
local Type, Version = "MultiLineEditBox", 28
|
||||||
|
local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
|
||||||
|
if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
|
||||||
|
|
||||||
|
-- Lua APIs
|
||||||
|
local pairs = pairs
|
||||||
|
|
||||||
|
-- WoW APIs
|
||||||
|
local GetCursorInfo, GetSpellInfo, ClearCursor = GetCursorInfo, GetSpellInfo, ClearCursor
|
||||||
|
local CreateFrame, UIParent = CreateFrame, UIParent
|
||||||
|
local _G = _G
|
||||||
|
|
||||||
|
-- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
|
||||||
|
-- List them here for Mikk's FindGlobals script
|
||||||
|
-- GLOBALS: ACCEPT, ChatFontNormal
|
||||||
|
|
||||||
|
--[[-----------------------------------------------------------------------------
|
||||||
|
Support functions
|
||||||
|
-------------------------------------------------------------------------------]]
|
||||||
|
|
||||||
|
if not AceGUIMultiLineEditBoxInsertLink then
|
||||||
|
-- upgradeable hook
|
||||||
|
hooksecurefunc("ChatEdit_InsertLink", function(...) return _G.AceGUIMultiLineEditBoxInsertLink(...) end)
|
||||||
|
end
|
||||||
|
|
||||||
|
function _G.AceGUIMultiLineEditBoxInsertLink(text)
|
||||||
|
for i = 1, AceGUI:GetWidgetCount(Type) do
|
||||||
|
local editbox = _G[("MultiLineEditBox%uEdit"):format(i)]
|
||||||
|
if editbox and editbox:IsVisible() and editbox:HasFocus() then
|
||||||
|
editbox:Insert(text)
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
local function Layout(self)
|
||||||
|
self:SetHeight(self.numlines * 14 + (self.disablebutton and 19 or 41) + self.labelHeight)
|
||||||
|
|
||||||
|
if self.labelHeight == 0 then
|
||||||
|
self.scrollBar:SetPoint("TOP", self.frame, "TOP", 0, -23)
|
||||||
|
else
|
||||||
|
self.scrollBar:SetPoint("TOP", self.label, "BOTTOM", 0, -19)
|
||||||
|
end
|
||||||
|
|
||||||
|
if self.disablebutton then
|
||||||
|
self.scrollBar:SetPoint("BOTTOM", self.frame, "BOTTOM", 0, 21)
|
||||||
|
self.scrollBG:SetPoint("BOTTOMLEFT", 0, 4)
|
||||||
|
else
|
||||||
|
self.scrollBar:SetPoint("BOTTOM", self.button, "TOP", 0, 18)
|
||||||
|
self.scrollBG:SetPoint("BOTTOMLEFT", self.button, "TOPLEFT")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
--[[-----------------------------------------------------------------------------
|
||||||
|
Scripts
|
||||||
|
-------------------------------------------------------------------------------]]
|
||||||
|
local function OnClick(self) -- Button
|
||||||
|
self = self.obj
|
||||||
|
self.editBox:ClearFocus()
|
||||||
|
if not self:Fire("OnEnterPressed", self.editBox:GetText()) then
|
||||||
|
self.button:Disable()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local function OnCursorChanged(self, _, y, _, cursorHeight) -- EditBox
|
||||||
|
self, y = self.obj.scrollFrame, -y
|
||||||
|
local offset = self:GetVerticalScroll()
|
||||||
|
if y < offset then
|
||||||
|
self:SetVerticalScroll(y)
|
||||||
|
else
|
||||||
|
y = y + cursorHeight - self:GetHeight()
|
||||||
|
if y > offset then
|
||||||
|
self:SetVerticalScroll(y)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local function OnEditFocusLost(self) -- EditBox
|
||||||
|
self:HighlightText(0, 0)
|
||||||
|
self.obj:Fire("OnEditFocusLost")
|
||||||
|
end
|
||||||
|
|
||||||
|
local function OnEnter(self) -- EditBox / ScrollFrame
|
||||||
|
self = self.obj
|
||||||
|
if not self.entered then
|
||||||
|
self.entered = true
|
||||||
|
self:Fire("OnEnter")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local function OnLeave(self) -- EditBox / ScrollFrame
|
||||||
|
self = self.obj
|
||||||
|
if self.entered then
|
||||||
|
self.entered = nil
|
||||||
|
self:Fire("OnLeave")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local function OnMouseUp(self) -- ScrollFrame
|
||||||
|
self = self.obj.editBox
|
||||||
|
self:SetFocus()
|
||||||
|
self:SetCursorPosition(self:GetNumLetters())
|
||||||
|
end
|
||||||
|
|
||||||
|
local function OnReceiveDrag(self) -- EditBox / ScrollFrame
|
||||||
|
local type, id, info = GetCursorInfo()
|
||||||
|
if type == "spell" then
|
||||||
|
info = GetSpellInfo(id, info)
|
||||||
|
elseif type ~= "item" then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
ClearCursor()
|
||||||
|
self = self.obj
|
||||||
|
local editBox = self.editBox
|
||||||
|
if not editBox:HasFocus() then
|
||||||
|
editBox:SetFocus()
|
||||||
|
editBox:SetCursorPosition(editBox:GetNumLetters())
|
||||||
|
end
|
||||||
|
editBox:Insert(info)
|
||||||
|
self.button:Enable()
|
||||||
|
end
|
||||||
|
|
||||||
|
local function OnSizeChanged(self, width, height) -- ScrollFrame
|
||||||
|
self.obj.editBox:SetWidth(width)
|
||||||
|
end
|
||||||
|
|
||||||
|
local function OnTextChanged(self, userInput) -- EditBox
|
||||||
|
if userInput then
|
||||||
|
self = self.obj
|
||||||
|
self:Fire("OnTextChanged", self.editBox:GetText())
|
||||||
|
self.button:Enable()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local function OnTextSet(self) -- EditBox
|
||||||
|
self:HighlightText(0, 0)
|
||||||
|
self:SetCursorPosition(self:GetNumLetters())
|
||||||
|
self:SetCursorPosition(0)
|
||||||
|
self.obj.button:Disable()
|
||||||
|
end
|
||||||
|
|
||||||
|
local function OnVerticalScroll(self, offset) -- ScrollFrame
|
||||||
|
local editBox = self.obj.editBox
|
||||||
|
editBox:SetHitRectInsets(0, 0, offset, editBox:GetHeight() - offset - self:GetHeight())
|
||||||
|
end
|
||||||
|
|
||||||
|
local function OnShowFocus(frame)
|
||||||
|
frame.obj.editBox:SetFocus()
|
||||||
|
frame:SetScript("OnShow", nil)
|
||||||
|
end
|
||||||
|
|
||||||
|
local function OnEditFocusGained(frame)
|
||||||
|
AceGUI:SetFocus(frame.obj)
|
||||||
|
frame.obj:Fire("OnEditFocusGained")
|
||||||
|
end
|
||||||
|
|
||||||
|
--[[-----------------------------------------------------------------------------
|
||||||
|
Methods
|
||||||
|
-------------------------------------------------------------------------------]]
|
||||||
|
local methods = {
|
||||||
|
["OnAcquire"] = function(self)
|
||||||
|
self.editBox:SetText("")
|
||||||
|
self:SetDisabled(false)
|
||||||
|
self:SetWidth(200)
|
||||||
|
self:DisableButton(false)
|
||||||
|
self:SetNumLines()
|
||||||
|
self.entered = nil
|
||||||
|
self:SetMaxLetters(0)
|
||||||
|
end,
|
||||||
|
|
||||||
|
["OnRelease"] = function(self)
|
||||||
|
self:ClearFocus()
|
||||||
|
end,
|
||||||
|
|
||||||
|
["SetDisabled"] = function(self, disabled)
|
||||||
|
local editBox = self.editBox
|
||||||
|
if disabled then
|
||||||
|
editBox:ClearFocus()
|
||||||
|
editBox:EnableMouse(false)
|
||||||
|
editBox:SetTextColor(0.5, 0.5, 0.5)
|
||||||
|
self.label:SetTextColor(0.5, 0.5, 0.5)
|
||||||
|
self.scrollFrame:EnableMouse(false)
|
||||||
|
self.button:Disable()
|
||||||
|
else
|
||||||
|
editBox:EnableMouse(true)
|
||||||
|
editBox:SetTextColor(1, 1, 1)
|
||||||
|
self.label:SetTextColor(1, 0.82, 0)
|
||||||
|
self.scrollFrame:EnableMouse(true)
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
|
||||||
|
["SetLabel"] = function(self, text)
|
||||||
|
if text and text ~= "" then
|
||||||
|
self.label:SetText(text)
|
||||||
|
if self.labelHeight ~= 10 then
|
||||||
|
self.labelHeight = 10
|
||||||
|
self.label:Show()
|
||||||
|
end
|
||||||
|
elseif self.labelHeight ~= 0 then
|
||||||
|
self.labelHeight = 0
|
||||||
|
self.label:Hide()
|
||||||
|
end
|
||||||
|
Layout(self)
|
||||||
|
end,
|
||||||
|
|
||||||
|
["SetNumLines"] = function(self, value)
|
||||||
|
if not value or value < 4 then
|
||||||
|
value = 4
|
||||||
|
end
|
||||||
|
self.numlines = value
|
||||||
|
Layout(self)
|
||||||
|
end,
|
||||||
|
|
||||||
|
["SetText"] = function(self, text)
|
||||||
|
self.editBox:SetText(text)
|
||||||
|
end,
|
||||||
|
|
||||||
|
["GetText"] = function(self)
|
||||||
|
return self.editBox:GetText()
|
||||||
|
end,
|
||||||
|
|
||||||
|
["SetMaxLetters"] = function (self, num)
|
||||||
|
self.editBox:SetMaxLetters(num or 0)
|
||||||
|
end,
|
||||||
|
|
||||||
|
["DisableButton"] = function(self, disabled)
|
||||||
|
self.disablebutton = disabled
|
||||||
|
if disabled then
|
||||||
|
self.button:Hide()
|
||||||
|
else
|
||||||
|
self.button:Show()
|
||||||
|
end
|
||||||
|
Layout(self)
|
||||||
|
end,
|
||||||
|
|
||||||
|
["ClearFocus"] = function(self)
|
||||||
|
self.editBox:ClearFocus()
|
||||||
|
self.frame:SetScript("OnShow", nil)
|
||||||
|
end,
|
||||||
|
|
||||||
|
["SetFocus"] = function(self)
|
||||||
|
self.editBox:SetFocus()
|
||||||
|
if not self.frame:IsShown() then
|
||||||
|
self.frame:SetScript("OnShow", OnShowFocus)
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
|
||||||
|
["HighlightText"] = function(self, from, to)
|
||||||
|
self.editBox:HighlightText(from, to)
|
||||||
|
end,
|
||||||
|
|
||||||
|
["GetCursorPosition"] = function(self)
|
||||||
|
return self.editBox:GetCursorPosition()
|
||||||
|
end,
|
||||||
|
|
||||||
|
["SetCursorPosition"] = function(self, ...)
|
||||||
|
return self.editBox:SetCursorPosition(...)
|
||||||
|
end,
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
--[[-----------------------------------------------------------------------------
|
||||||
|
Constructor
|
||||||
|
-------------------------------------------------------------------------------]]
|
||||||
|
local backdrop = {
|
||||||
|
bgFile = [[Interface\Tooltips\UI-Tooltip-Background]],
|
||||||
|
edgeFile = [[Interface\Tooltips\UI-Tooltip-Border]], edgeSize = 16,
|
||||||
|
insets = { left = 4, right = 3, top = 4, bottom = 3 }
|
||||||
|
}
|
||||||
|
|
||||||
|
local function Constructor()
|
||||||
|
local frame = CreateFrame("Frame", nil, UIParent)
|
||||||
|
frame:Hide()
|
||||||
|
|
||||||
|
local widgetNum = AceGUI:GetNextWidgetNum(Type)
|
||||||
|
|
||||||
|
local label = frame:CreateFontString(nil, "OVERLAY", "GameFontNormalSmall")
|
||||||
|
label:SetPoint("TOPLEFT", frame, "TOPLEFT", 0, -4)
|
||||||
|
label:SetPoint("TOPRIGHT", frame, "TOPRIGHT", 0, -4)
|
||||||
|
label:SetJustifyH("LEFT")
|
||||||
|
label:SetText(ACCEPT)
|
||||||
|
label:SetHeight(10)
|
||||||
|
|
||||||
|
local button = CreateFrame("Button", ("%s%dButton"):format(Type, widgetNum), frame, "UIPanelButtonTemplate")
|
||||||
|
button:SetPoint("BOTTOMLEFT", 0, 4)
|
||||||
|
button:SetHeight(22)
|
||||||
|
button:SetWidth(label:GetStringWidth() + 24)
|
||||||
|
button:SetText(ACCEPT)
|
||||||
|
button:SetScript("OnClick", OnClick)
|
||||||
|
button:Disable()
|
||||||
|
|
||||||
|
local text = button:GetFontString()
|
||||||
|
text:ClearAllPoints()
|
||||||
|
text:SetPoint("TOPLEFT", button, "TOPLEFT", 5, -5)
|
||||||
|
text:SetPoint("BOTTOMRIGHT", button, "BOTTOMRIGHT", -5, 1)
|
||||||
|
text:SetJustifyV("MIDDLE")
|
||||||
|
|
||||||
|
local scrollBG = CreateFrame("Frame", nil, frame)
|
||||||
|
scrollBG:SetBackdrop(backdrop)
|
||||||
|
scrollBG:SetBackdropColor(0, 0, 0)
|
||||||
|
scrollBG:SetBackdropBorderColor(0.4, 0.4, 0.4)
|
||||||
|
|
||||||
|
local scrollFrame = CreateFrame("ScrollFrame", ("%s%dScrollFrame"):format(Type, widgetNum), frame, "UIPanelScrollFrameTemplate")
|
||||||
|
|
||||||
|
local scrollBar = _G[scrollFrame:GetName() .. "ScrollBar"]
|
||||||
|
scrollBar:ClearAllPoints()
|
||||||
|
scrollBar:SetPoint("TOP", label, "BOTTOM", 0, -19)
|
||||||
|
scrollBar:SetPoint("BOTTOM", button, "TOP", 0, 18)
|
||||||
|
scrollBar:SetPoint("RIGHT", frame, "RIGHT")
|
||||||
|
|
||||||
|
scrollBG:SetPoint("TOPRIGHT", scrollBar, "TOPLEFT", 0, 19)
|
||||||
|
scrollBG:SetPoint("BOTTOMLEFT", button, "TOPLEFT")
|
||||||
|
|
||||||
|
scrollFrame:SetPoint("TOPLEFT", scrollBG, "TOPLEFT", 5, -6)
|
||||||
|
scrollFrame:SetPoint("BOTTOMRIGHT", scrollBG, "BOTTOMRIGHT", -4, 4)
|
||||||
|
scrollFrame:SetScript("OnEnter", OnEnter)
|
||||||
|
scrollFrame:SetScript("OnLeave", OnLeave)
|
||||||
|
scrollFrame:SetScript("OnMouseUp", OnMouseUp)
|
||||||
|
scrollFrame:SetScript("OnReceiveDrag", OnReceiveDrag)
|
||||||
|
scrollFrame:SetScript("OnSizeChanged", OnSizeChanged)
|
||||||
|
scrollFrame:HookScript("OnVerticalScroll", OnVerticalScroll)
|
||||||
|
|
||||||
|
local editBox = CreateFrame("EditBox", ("%s%dEdit"):format(Type, widgetNum), scrollFrame)
|
||||||
|
editBox:SetAllPoints()
|
||||||
|
editBox:SetFontObject(ChatFontNormal)
|
||||||
|
editBox:SetMultiLine(true)
|
||||||
|
editBox:EnableMouse(true)
|
||||||
|
editBox:SetAutoFocus(false)
|
||||||
|
editBox:SetCountInvisibleLetters(false)
|
||||||
|
editBox:SetScript("OnCursorChanged", OnCursorChanged)
|
||||||
|
editBox:SetScript("OnEditFocusLost", OnEditFocusLost)
|
||||||
|
editBox:SetScript("OnEnter", OnEnter)
|
||||||
|
editBox:SetScript("OnEscapePressed", editBox.ClearFocus)
|
||||||
|
editBox:SetScript("OnLeave", OnLeave)
|
||||||
|
editBox:SetScript("OnMouseDown", OnReceiveDrag)
|
||||||
|
editBox:SetScript("OnReceiveDrag", OnReceiveDrag)
|
||||||
|
editBox:SetScript("OnTextChanged", OnTextChanged)
|
||||||
|
editBox:SetScript("OnTextSet", OnTextSet)
|
||||||
|
editBox:SetScript("OnEditFocusGained", OnEditFocusGained)
|
||||||
|
|
||||||
|
|
||||||
|
scrollFrame:SetScrollChild(editBox)
|
||||||
|
|
||||||
|
local widget = {
|
||||||
|
button = button,
|
||||||
|
editBox = editBox,
|
||||||
|
frame = frame,
|
||||||
|
label = label,
|
||||||
|
labelHeight = 10,
|
||||||
|
numlines = 4,
|
||||||
|
scrollBar = scrollBar,
|
||||||
|
scrollBG = scrollBG,
|
||||||
|
scrollFrame = scrollFrame,
|
||||||
|
type = Type
|
||||||
|
}
|
||||||
|
for method, func in pairs(methods) do
|
||||||
|
widget[method] = func
|
||||||
|
end
|
||||||
|
button.obj, editBox.obj, scrollFrame.obj = widget, widget, widget
|
||||||
|
|
||||||
|
return AceGUI:RegisterAsWidget(widget)
|
||||||
|
end
|
||||||
|
|
||||||
|
AceGUI:RegisterWidgetType(Type, Constructor, Version)
|
|
@ -0,0 +1,285 @@
|
||||||
|
--[[-----------------------------------------------------------------------------
|
||||||
|
Slider Widget
|
||||||
|
Graphical Slider, like, for Range values.
|
||||||
|
-------------------------------------------------------------------------------]]
|
||||||
|
local Type, Version = "Slider", 22
|
||||||
|
local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
|
||||||
|
if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
|
||||||
|
|
||||||
|
-- Lua APIs
|
||||||
|
local min, max, floor = math.min, math.max, math.floor
|
||||||
|
local tonumber, pairs = tonumber, pairs
|
||||||
|
|
||||||
|
-- WoW APIs
|
||||||
|
local PlaySound = PlaySound
|
||||||
|
local CreateFrame, UIParent = CreateFrame, UIParent
|
||||||
|
|
||||||
|
-- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
|
||||||
|
-- List them here for Mikk's FindGlobals script
|
||||||
|
-- GLOBALS: GameFontHighlightSmall
|
||||||
|
|
||||||
|
--[[-----------------------------------------------------------------------------
|
||||||
|
Support functions
|
||||||
|
-------------------------------------------------------------------------------]]
|
||||||
|
local function UpdateText(self)
|
||||||
|
local value = self.value or 0
|
||||||
|
if self.ispercent then
|
||||||
|
self.editbox:SetText(("%s%%"):format(floor(value * 1000 + 0.5) / 10))
|
||||||
|
else
|
||||||
|
self.editbox:SetText(floor(value * 100 + 0.5) / 100)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local function UpdateLabels(self)
|
||||||
|
local min, max = (self.min or 0), (self.max or 100)
|
||||||
|
if self.ispercent then
|
||||||
|
self.lowtext:SetFormattedText("%s%%", (min * 100))
|
||||||
|
self.hightext:SetFormattedText("%s%%", (max * 100))
|
||||||
|
else
|
||||||
|
self.lowtext:SetText(min)
|
||||||
|
self.hightext:SetText(max)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
--[[-----------------------------------------------------------------------------
|
||||||
|
Scripts
|
||||||
|
-------------------------------------------------------------------------------]]
|
||||||
|
local function Control_OnEnter(frame)
|
||||||
|
frame.obj:Fire("OnEnter")
|
||||||
|
end
|
||||||
|
|
||||||
|
local function Control_OnLeave(frame)
|
||||||
|
frame.obj:Fire("OnLeave")
|
||||||
|
end
|
||||||
|
|
||||||
|
local function Frame_OnMouseDown(frame)
|
||||||
|
frame.obj.slider:EnableMouseWheel(true)
|
||||||
|
AceGUI:ClearFocus()
|
||||||
|
end
|
||||||
|
|
||||||
|
local function Slider_OnValueChanged(frame)
|
||||||
|
local self = frame.obj
|
||||||
|
if not frame.setup then
|
||||||
|
local newvalue = frame:GetValue()
|
||||||
|
if self.step and self.step > 0 then
|
||||||
|
local min_value = self.min or 0
|
||||||
|
newvalue = floor((newvalue - min_value) / self.step + 0.5) * self.step + min_value
|
||||||
|
end
|
||||||
|
if newvalue ~= self.value and not self.disabled then
|
||||||
|
self.value = newvalue
|
||||||
|
self:Fire("OnValueChanged", newvalue)
|
||||||
|
end
|
||||||
|
if self.value then
|
||||||
|
UpdateText(self)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local function Slider_OnMouseUp(frame)
|
||||||
|
local self = frame.obj
|
||||||
|
self:Fire("OnMouseUp", self.value)
|
||||||
|
end
|
||||||
|
|
||||||
|
local function Slider_OnMouseWheel(frame, v)
|
||||||
|
local self = frame.obj
|
||||||
|
if not self.disabled then
|
||||||
|
local value = self.value
|
||||||
|
if v > 0 then
|
||||||
|
value = min(value + (self.step or 1), self.max)
|
||||||
|
else
|
||||||
|
value = max(value - (self.step or 1), self.min)
|
||||||
|
end
|
||||||
|
self.slider:SetValue(value)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local function EditBox_OnEscapePressed(frame)
|
||||||
|
frame:ClearFocus()
|
||||||
|
end
|
||||||
|
|
||||||
|
local function EditBox_OnEnterPressed(frame)
|
||||||
|
local self = frame.obj
|
||||||
|
local value = frame:GetText()
|
||||||
|
if self.ispercent then
|
||||||
|
value = value:gsub('%%', '')
|
||||||
|
value = tonumber(value) / 100
|
||||||
|
else
|
||||||
|
value = tonumber(value)
|
||||||
|
end
|
||||||
|
|
||||||
|
if value then
|
||||||
|
PlaySound(PlaySoundKitID and "igMainMenuOptionCheckBoxOn" or 856) -- SOUNDKIT.IG_MAINMENU_OPTION_CHECKBOX_ON
|
||||||
|
self.slider:SetValue(value)
|
||||||
|
self:Fire("OnMouseUp", value)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local function EditBox_OnEnter(frame)
|
||||||
|
frame:SetBackdropBorderColor(0.5, 0.5, 0.5, 1)
|
||||||
|
end
|
||||||
|
|
||||||
|
local function EditBox_OnLeave(frame)
|
||||||
|
frame:SetBackdropBorderColor(0.3, 0.3, 0.3, 0.8)
|
||||||
|
end
|
||||||
|
|
||||||
|
--[[-----------------------------------------------------------------------------
|
||||||
|
Methods
|
||||||
|
-------------------------------------------------------------------------------]]
|
||||||
|
local methods = {
|
||||||
|
["OnAcquire"] = function(self)
|
||||||
|
self:SetWidth(200)
|
||||||
|
self:SetHeight(44)
|
||||||
|
self:SetDisabled(false)
|
||||||
|
self:SetIsPercent(nil)
|
||||||
|
self:SetSliderValues(0,100,1)
|
||||||
|
self:SetValue(0)
|
||||||
|
self.slider:EnableMouseWheel(false)
|
||||||
|
end,
|
||||||
|
|
||||||
|
-- ["OnRelease"] = nil,
|
||||||
|
|
||||||
|
["SetDisabled"] = function(self, disabled)
|
||||||
|
self.disabled = disabled
|
||||||
|
if disabled then
|
||||||
|
self.slider:EnableMouse(false)
|
||||||
|
self.label:SetTextColor(.5, .5, .5)
|
||||||
|
self.hightext:SetTextColor(.5, .5, .5)
|
||||||
|
self.lowtext:SetTextColor(.5, .5, .5)
|
||||||
|
--self.valuetext:SetTextColor(.5, .5, .5)
|
||||||
|
self.editbox:SetTextColor(.5, .5, .5)
|
||||||
|
self.editbox:EnableMouse(false)
|
||||||
|
self.editbox:ClearFocus()
|
||||||
|
else
|
||||||
|
self.slider:EnableMouse(true)
|
||||||
|
self.label:SetTextColor(1, .82, 0)
|
||||||
|
self.hightext:SetTextColor(1, 1, 1)
|
||||||
|
self.lowtext:SetTextColor(1, 1, 1)
|
||||||
|
--self.valuetext:SetTextColor(1, 1, 1)
|
||||||
|
self.editbox:SetTextColor(1, 1, 1)
|
||||||
|
self.editbox:EnableMouse(true)
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
|
||||||
|
["SetValue"] = function(self, value)
|
||||||
|
self.slider.setup = true
|
||||||
|
self.slider:SetValue(value)
|
||||||
|
self.value = value
|
||||||
|
UpdateText(self)
|
||||||
|
self.slider.setup = nil
|
||||||
|
end,
|
||||||
|
|
||||||
|
["GetValue"] = function(self)
|
||||||
|
return self.value
|
||||||
|
end,
|
||||||
|
|
||||||
|
["SetLabel"] = function(self, text)
|
||||||
|
self.label:SetText(text)
|
||||||
|
end,
|
||||||
|
|
||||||
|
["SetSliderValues"] = function(self, min, max, step)
|
||||||
|
local frame = self.slider
|
||||||
|
frame.setup = true
|
||||||
|
self.min = min
|
||||||
|
self.max = max
|
||||||
|
self.step = step
|
||||||
|
frame:SetMinMaxValues(min or 0,max or 100)
|
||||||
|
UpdateLabels(self)
|
||||||
|
frame:SetValueStep(step or 1)
|
||||||
|
if self.value then
|
||||||
|
frame:SetValue(self.value)
|
||||||
|
end
|
||||||
|
frame.setup = nil
|
||||||
|
end,
|
||||||
|
|
||||||
|
["SetIsPercent"] = function(self, value)
|
||||||
|
self.ispercent = value
|
||||||
|
UpdateLabels(self)
|
||||||
|
UpdateText(self)
|
||||||
|
end
|
||||||
|
}
|
||||||
|
|
||||||
|
--[[-----------------------------------------------------------------------------
|
||||||
|
Constructor
|
||||||
|
-------------------------------------------------------------------------------]]
|
||||||
|
local SliderBackdrop = {
|
||||||
|
bgFile = "Interface\\Buttons\\UI-SliderBar-Background",
|
||||||
|
edgeFile = "Interface\\Buttons\\UI-SliderBar-Border",
|
||||||
|
tile = true, tileSize = 8, edgeSize = 8,
|
||||||
|
insets = { left = 3, right = 3, top = 6, bottom = 6 }
|
||||||
|
}
|
||||||
|
|
||||||
|
local ManualBackdrop = {
|
||||||
|
bgFile = "Interface\\ChatFrame\\ChatFrameBackground",
|
||||||
|
edgeFile = "Interface\\ChatFrame\\ChatFrameBackground",
|
||||||
|
tile = true, edgeSize = 1, tileSize = 5,
|
||||||
|
}
|
||||||
|
|
||||||
|
local function Constructor()
|
||||||
|
local frame = CreateFrame("Frame", nil, UIParent)
|
||||||
|
|
||||||
|
frame:EnableMouse(true)
|
||||||
|
frame:SetScript("OnMouseDown", Frame_OnMouseDown)
|
||||||
|
|
||||||
|
local label = frame:CreateFontString(nil, "OVERLAY", "GameFontNormal")
|
||||||
|
label:SetPoint("TOPLEFT")
|
||||||
|
label:SetPoint("TOPRIGHT")
|
||||||
|
label:SetJustifyH("CENTER")
|
||||||
|
label:SetHeight(15)
|
||||||
|
|
||||||
|
local slider = CreateFrame("Slider", nil, frame)
|
||||||
|
slider:SetOrientation("HORIZONTAL")
|
||||||
|
slider:SetHeight(15)
|
||||||
|
slider:SetHitRectInsets(0, 0, -10, 0)
|
||||||
|
slider:SetBackdrop(SliderBackdrop)
|
||||||
|
slider:SetThumbTexture("Interface\\Buttons\\UI-SliderBar-Button-Horizontal")
|
||||||
|
slider:SetPoint("TOP", label, "BOTTOM")
|
||||||
|
slider:SetPoint("LEFT", 3, 0)
|
||||||
|
slider:SetPoint("RIGHT", -3, 0)
|
||||||
|
slider:SetValue(0)
|
||||||
|
slider:SetScript("OnValueChanged",Slider_OnValueChanged)
|
||||||
|
slider:SetScript("OnEnter", Control_OnEnter)
|
||||||
|
slider:SetScript("OnLeave", Control_OnLeave)
|
||||||
|
slider:SetScript("OnMouseUp", Slider_OnMouseUp)
|
||||||
|
slider:SetScript("OnMouseWheel", Slider_OnMouseWheel)
|
||||||
|
|
||||||
|
local lowtext = slider:CreateFontString(nil, "ARTWORK", "GameFontHighlightSmall")
|
||||||
|
lowtext:SetPoint("TOPLEFT", slider, "BOTTOMLEFT", 2, 3)
|
||||||
|
|
||||||
|
local hightext = slider:CreateFontString(nil, "ARTWORK", "GameFontHighlightSmall")
|
||||||
|
hightext:SetPoint("TOPRIGHT", slider, "BOTTOMRIGHT", -2, 3)
|
||||||
|
|
||||||
|
local editbox = CreateFrame("EditBox", nil, frame)
|
||||||
|
editbox:SetAutoFocus(false)
|
||||||
|
editbox:SetFontObject(GameFontHighlightSmall)
|
||||||
|
editbox:SetPoint("TOP", slider, "BOTTOM")
|
||||||
|
editbox:SetHeight(14)
|
||||||
|
editbox:SetWidth(70)
|
||||||
|
editbox:SetJustifyH("CENTER")
|
||||||
|
editbox:EnableMouse(true)
|
||||||
|
editbox:SetBackdrop(ManualBackdrop)
|
||||||
|
editbox:SetBackdropColor(0, 0, 0, 0.5)
|
||||||
|
editbox:SetBackdropBorderColor(0.3, 0.3, 0.30, 0.80)
|
||||||
|
editbox:SetScript("OnEnter", EditBox_OnEnter)
|
||||||
|
editbox:SetScript("OnLeave", EditBox_OnLeave)
|
||||||
|
editbox:SetScript("OnEnterPressed", EditBox_OnEnterPressed)
|
||||||
|
editbox:SetScript("OnEscapePressed", EditBox_OnEscapePressed)
|
||||||
|
|
||||||
|
local widget = {
|
||||||
|
label = label,
|
||||||
|
slider = slider,
|
||||||
|
lowtext = lowtext,
|
||||||
|
hightext = hightext,
|
||||||
|
editbox = editbox,
|
||||||
|
alignoffset = 25,
|
||||||
|
frame = frame,
|
||||||
|
type = Type
|
||||||
|
}
|
||||||
|
for method, func in pairs(methods) do
|
||||||
|
widget[method] = func
|
||||||
|
end
|
||||||
|
slider.obj, editbox.obj = widget, widget
|
||||||
|
|
||||||
|
return AceGUI:RegisterAsWidget(widget)
|
||||||
|
end
|
||||||
|
|
||||||
|
AceGUI:RegisterWidgetType(Type,Constructor,Version)
|
|
@ -1,4 +1,4 @@
|
||||||
<Ui xmlns="http://www.blizzard.com/wow/ui/">
|
<Ui xmlns="http://www.blizzard.com/wow/ui/">
|
||||||
<Script file="LibStub\LibStub.lua"/>
|
<Script file="LibStub\LibStub.lua"/>
|
||||||
<Script file="CallbackHandler-1.0\CallbackHandler-1.0.lua"/>
|
<Script file="CallbackHandler-1.0\CallbackHandler-1.0.lua"/>
|
||||||
<Include file="LibSpellRange-1.0\lib.xml"/>
|
<Include file="LibSpellRange-1.0\lib.xml"/>
|
||||||
|
@ -14,8 +14,6 @@
|
||||||
<Include file="AceHook-3.0\AceHook-3.0.xml"/>
|
<Include file="AceHook-3.0\AceHook-3.0.xml"/>
|
||||||
<Include file="LibSharedMedia-3.0\lib.xml"/>
|
<Include file="LibSharedMedia-3.0\lib.xml"/>
|
||||||
<Script file="LibSimpleSticky\LibSimpleSticky.lua"/>
|
<Script file="LibSimpleSticky\LibSimpleSticky.lua"/>
|
||||||
<Include file='oUF\oUF.xml'/>
|
|
||||||
<Include file='oUF_Plugins\oUF_Plugins.xml'/>
|
|
||||||
<Include file="LibActionButton-1.0\LibActionButton-1.0.xml"/>
|
<Include file="LibActionButton-1.0\LibActionButton-1.0.xml"/>
|
||||||
<Script file="LibDataBroker\LibDataBroker-1.1.lua"/>
|
<Script file="LibDataBroker\LibDataBroker-1.1.lua"/>
|
||||||
<Script file="LibDualSpec-1.0\LibDualSpec-1.0.lua"/>
|
<Script file="LibDualSpec-1.0\LibDualSpec-1.0.lua"/>
|
||||||
|
@ -27,4 +25,4 @@
|
||||||
<Include file="LibBase64-1.0\lib.xml"/>
|
<Include file="LibBase64-1.0\lib.xml"/>
|
||||||
<Script file="LibAnim\LibAnim.lua"/>
|
<Script file="LibAnim\LibAnim.lua"/>
|
||||||
<Include file="DropDownMenu\DropDownMenu.xml"/>
|
<Include file="DropDownMenu\DropDownMenu.xml"/>
|
||||||
</Ui>
|
</Ui>
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
-- MxW (MxW Addon)
|
-- MxW (MxW Addon)
|
||||||
-- By mikx
|
-- By mikx
|
||||||
-- https://git.mikx.ca/wow-addons/MxW_Addon
|
-- https://git.mikx.xyz/wow/MxW_Addon
|
||||||
-- Licensed under the GNU General Public License 3.0
|
-- Licensed under the GNU General Public License 3.0
|
||||||
-- See included License file for more informations.
|
-- See included License file for more informations.
|
||||||
|
|
||||||
|
@ -10,6 +10,15 @@ if not L then return; end
|
||||||
|
|
||||||
-- Message
|
-- Message
|
||||||
L["Message_Loaded"] = " a été chargé."
|
L["Message_Loaded"] = " a été chargé."
|
||||||
|
L["ChatCMD_Help"] = "[MxW] Argument(s) dispo. : restore/reset/alert/gmsg/config";
|
||||||
|
L["Settings_Alert_Enabled"] = "[MxW] Alerte activée. Seuil : ";
|
||||||
|
L["Settings_Alert_Disabled"] = "[MxW] Alerte désactivée.";
|
||||||
|
L["Settings_GuildMessage_Enabled"] = "[MxW] Message de guilde activé.";
|
||||||
|
L["Settings_GuildMessage_Disabled"] = "[MxW] Message de guilde désactivé.";
|
||||||
|
L["Chat_GuildDailyMoneyThresholdMessage"] = "a dépassé le palier journalier de";
|
||||||
|
L["Chat_ChatGuildDailyRecordA"] = "a battu son record journalier de";
|
||||||
|
L["Chat_ChatGuildDailyRecordEnterWorld"] = "Record journalier : "
|
||||||
|
L["Chat_ChatGuildDailyRecordUI"] = "(Record)";
|
||||||
|
|
||||||
-- Option
|
-- Option
|
||||||
L["MainForm_Option_MinimumUI"] = "Valeur Minimale (Affichage dans l'UI.)";
|
L["MainForm_Option_MinimumUI"] = "Valeur Minimale (Affichage dans l'UI.)";
|
||||||
|
@ -18,7 +27,7 @@ L["MainForm_Option_MinimumUI_Usage"] = "<valeur en cuivre>";
|
||||||
|
|
||||||
-- MainForm
|
-- MainForm
|
||||||
L["MainForm_Label_Close"] = "FERMER";
|
L["MainForm_Label_Close"] = "FERMER";
|
||||||
L["MainForm_Label_Money_Lab_Today"] = "Auj.";
|
L["MainForm_Label_Money_Lab_Today"] = "Jour";
|
||||||
L["MainForm_Label_Money_Lab_Month"] = "Mois";
|
L["MainForm_Label_Money_Lab_Month"] = "Mois";
|
||||||
L["MainForm_Label_Money_Global"] = "Or (Global) :"
|
L["MainForm_Label_Money_Global"] = "Or (Global) :"
|
||||||
L["MainForm_Label_Money_Player"] = "Or (Joueur) :"
|
L["MainForm_Label_Money_Player"] = "Or (Joueur) :"
|
||||||
|
@ -27,9 +36,14 @@ L["MainForm_Label_Money_Min"] = "Min.";
|
||||||
L["MainForm_Label_LastBoE"] = "Dernier BOE :"
|
L["MainForm_Label_LastBoE"] = "Dernier BOE :"
|
||||||
L["MainForm_Label_LastBoE_NONE"] = "n/d"
|
L["MainForm_Label_LastBoE_NONE"] = "n/d"
|
||||||
L["MainForm_Label_Loot"] = "- BUTIN -";
|
L["MainForm_Label_Loot"] = "- BUTIN -";
|
||||||
L["MainForm_Button_LootList"] = "Liste de loot(s)";
|
L["MainForm_Button_Settings"] = "Options";
|
||||||
L["MainForm_Group_Features"] = "Fonctions";
|
L["MainForm_Group_Features"] = "Fonctions";
|
||||||
L["MainForm_Group_Gold"] = "Or";
|
L["MainForm_Group_Gold"] = "Or";
|
||||||
|
L["MainForm_Label_DayCounter"] = "Jour(s)";
|
||||||
|
|
||||||
|
L["SettingsUI_EditBox_MinAlert"] = "Seuil d'alerte (Or)";
|
||||||
|
L["SettingsUI_Button_Reset"] = "Remise à zéro";
|
||||||
|
L["SettingsUI_DropDown_Value"] = "Source des valeurs";
|
||||||
|
|
||||||
-- Alert Classes
|
-- Alert Classes
|
||||||
L["Alert_Class_Misc"] = "Divers";
|
L["Alert_Class_Misc"] = "Divers";
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
-- MxW (MxW Addon)
|
-- MxW (MxW Addon)
|
||||||
-- By mikx
|
-- By mikx
|
||||||
-- https://git.mikx.ca/wow-addons/MxW_Addon
|
-- https://git.mikx.xyz/wow/MxW_Addon
|
||||||
-- Licensed under the GNU General Public License 3.0
|
-- Licensed under the GNU General Public License 3.0
|
||||||
-- See included License file for more informations.
|
-- See included License file for more informations.
|
||||||
|
|
||||||
|
@ -10,6 +10,15 @@ if not L then return; end
|
||||||
|
|
||||||
-- Message
|
-- Message
|
||||||
L["Message_Loaded"] = " has been loaded."
|
L["Message_Loaded"] = " has been loaded."
|
||||||
|
L["ChatCMD_Help"] = "[MxW] Available Argument(s) : restore/reset/alert/gmsg/config";
|
||||||
|
L["Settings_Alert_Enabled"] = "[MxW] Alert Disabled. Threshold: ";
|
||||||
|
L["Settings_Alert_Disabled"] = "[MxW] Alert Enabled.";
|
||||||
|
L["Settings_GuildMessage_Enabled"] = "[MxW] Guild Message Enabled.";
|
||||||
|
L["Settings_GuildMessage_Disabled"] = "[MxW] Guild Message Disabled.";
|
||||||
|
L["Chat_GuildDailyMoneyThresholdMessage"] = "has exceeded the daily stage of";
|
||||||
|
L["Chat_ChatGuildDailyRecordA"] = "has beaten his daily record of";
|
||||||
|
L["Chat_ChatGuildDailyRecordEnterWorld"] = "Daily Record: "
|
||||||
|
L["Chat_ChatGuildDailyRecordUI"] = "(Record)";
|
||||||
|
|
||||||
-- Option
|
-- Option
|
||||||
L["MainForm_Option_MinimumUI"] = "Minimum Value (Display in the UI.)";
|
L["MainForm_Option_MinimumUI"] = "Minimum Value (Display in the UI.)";
|
||||||
|
@ -27,9 +36,14 @@ L["MainForm_Label_Money_Min"] = "Min.";
|
||||||
L["MainForm_Label_LastBoE"] = "Last BOE:"
|
L["MainForm_Label_LastBoE"] = "Last BOE:"
|
||||||
L["MainForm_Label_LastBoE_NONE"] = "n/a"
|
L["MainForm_Label_LastBoE_NONE"] = "n/a"
|
||||||
L["MainForm_Label_Loot"] = "- LOOT -";
|
L["MainForm_Label_Loot"] = "- LOOT -";
|
||||||
L["MainForm_Button_LootList"] = "Loot List";
|
L["MainForm_Button_Settings"] = "Settings";
|
||||||
L["MainForm_Group_Features"] = "Fonctions";
|
L["MainForm_Group_Features"] = "Fonctions";
|
||||||
L["MainForm_Group_Gold"] = "Or";
|
L["MainForm_Group_Gold"] = "Or";
|
||||||
|
L["MainForm_Label_DayCounter"] = "Day(s)";
|
||||||
|
|
||||||
|
L["SettingsUI_EditBox_MinAlert"] = "Alert Thresold (Gold)";
|
||||||
|
L["SettingsUI_Button_Reset"] = "Reset";
|
||||||
|
L["SettingsUI_DropDown_Value"] = "Value Source";
|
||||||
|
|
||||||
-- Alert Classes
|
-- Alert Classes
|
||||||
L["Alert_Class_Misc"] = "Miscellaneous";
|
L["Alert_Class_Misc"] = "Miscellaneous";
|
||||||
|
|
Binary file not shown.
Binary file not shown.
Before Width: | Height: | Size: 200 KiB After Width: | Height: | Size: 200 KiB |
7
MxW.toc
7
MxW.toc
|
@ -1,11 +1,10 @@
|
||||||
## Interface: 70300
|
## Interface: 70300
|
||||||
## Title: |cff1784d1MxW|r
|
## Title: |cff1784d1MxW|r
|
||||||
## Version: 1.2.0b_7.3.5
|
## Version: 1.6.0_8.0.1
|
||||||
## Author: mikx
|
## Author: mikx
|
||||||
## Notes: MxW Addon
|
## Notes: MxW Addon
|
||||||
## RequiredDeps: TradeSkillMaster, TradeSkillMaster_AuctionDB
|
## RequiredDeps: TradeSkillMaster
|
||||||
## OptionalDeps: TradeSkillMaster_WoWuction, TheUndermineJournal
|
## SavedVariables: MxWDB,DayCounter,DailyRecord,DailyRecordFlag,DailyTen,DailyTwenty,DailyThirty,DailyForty,DailyFifty,DailySixty,DailySeventy,DailyEighty,DailyNinety,DailyHundred,CurrentGold,Settings_Alert_Enabled,Settings_GuildMessage_Enabled,Farmer_Money_MonthBack,Farmer_Logic_Day,Farmer_Logic_MinUI,Farmer_Logic_MinAlert,Farmer_Money_MonthGlobal,Farmer_Money_DayGlobal
|
||||||
## SavedVariables: MxWDB,CurrentGold,Farmer_Logic_Day,Farmer_Logic_MinUI,Farmer_Logic_MinAlert,Farmer_Money_MonthGlobal,Farmer_Money_DayGlobal
|
|
||||||
|
|
||||||
Libraries\Load_Libraries.xml
|
Libraries\Load_Libraries.xml
|
||||||
Locale\Load_Locales.xml
|
Locale\Load_Locales.xml
|
||||||
|
|
111
init.lua
111
init.lua
|
@ -1,6 +1,6 @@
|
||||||
-- MxW (MxW Addon)
|
-- MxW (MxW Addon)
|
||||||
-- By mikx
|
-- By mikx
|
||||||
-- https://git.mikx.ca/wow-addons/MxW_Addon
|
-- https://git.mikx.xyz/wow/MxW_Addon
|
||||||
-- Licensed under the GNU General Public License 3.0
|
-- Licensed under the GNU General Public License 3.0
|
||||||
-- See included License file for more informations.
|
-- See included License file for more informations.
|
||||||
|
|
||||||
|
@ -12,7 +12,7 @@ local MXLDB = LibStub("LibDataBroker-1.1"):NewDataObject("MxW", {
|
||||||
type = "data source",
|
type = "data source",
|
||||||
text = "MxW",
|
text = "MxW",
|
||||||
icon = "Interface\\Icons\\Inv_misc_herb_goldclover",
|
icon = "Interface\\Icons\\Inv_misc_herb_goldclover",
|
||||||
OnClick = function() MX:ShowMain(); end,
|
OnClick = function() MX:ShowMainUI(); end,
|
||||||
})
|
})
|
||||||
local icon = LibStub("LibDBIcon-1.0")
|
local icon = LibStub("LibDBIcon-1.0")
|
||||||
|
|
||||||
|
@ -30,7 +30,6 @@ function MX:OnInitialize()
|
||||||
|
|
||||||
-- Init Saved Variables
|
-- Init Saved Variables
|
||||||
if (Farmer_Logic_Day == nil) then
|
if (Farmer_Logic_Day == nil) then
|
||||||
local weekday, month, day, year = CalendarGetDate();
|
|
||||||
Farmer_Logic_Day = day;
|
Farmer_Logic_Day = day;
|
||||||
end
|
end
|
||||||
if (Farmer_Money_DayGlobal == nil) then
|
if (Farmer_Money_DayGlobal == nil) then
|
||||||
|
@ -45,13 +44,60 @@ function MX:OnInitialize()
|
||||||
if (Farmer_Logic_MinAlert == nil) then
|
if (Farmer_Logic_MinAlert == nil) then
|
||||||
Farmer_Logic_MinAlert = 1000000; -- 100 golds
|
Farmer_Logic_MinAlert = 1000000; -- 100 golds
|
||||||
end
|
end
|
||||||
|
if (Settings_Alert_Enabled == nil) then
|
||||||
|
Settings_Alert_Enabled = true;
|
||||||
|
end
|
||||||
|
if (Settings_GuildMessage_Enabled == nil) then
|
||||||
|
Settings_GuildMessage_Enabled = true;
|
||||||
|
end
|
||||||
|
|
||||||
|
local parentHeight = UIParent:GetHeight()
|
||||||
|
|
||||||
if (self.db.profile.mainUI == nil) then
|
if (self.db.profile.mainUI == nil) then
|
||||||
self.db.profile.mainUI = { ["height"] = 100, ["top"] = 50, ["left"] = 50, ["width"] = 300, }
|
self.db.profile.mainUI = { ["height"] = 100, ["top"] = parentHeight-50, ["left"] = 50, ["width"] = 300, }
|
||||||
end
|
end
|
||||||
|
|
||||||
if (self.db.profile.lootlistUI == nil) then
|
if (self.db.profile.lootlistUI == nil) then
|
||||||
self.db.profile.lootlistUI = { ["height"] = 100, ["top"] = 50, ["left"] = 50, ["width"] = 300, }
|
self.db.profile.lootlistUI = { ["height"] = 100, ["top"] = parentHeight-50, ["left"] = 50, ["width"] = 300, }
|
||||||
|
end
|
||||||
|
|
||||||
|
if (self.db.profile.settingsUI == nil) then
|
||||||
|
self.db.profile.settingsUI = { ["height"] = 140, ["top"] = parentHeight-50, ["left"] = 50, ["width"] = 250, }
|
||||||
|
end
|
||||||
|
|
||||||
|
if (DailyTen == nil) then
|
||||||
|
DailyTen = false
|
||||||
|
end
|
||||||
|
if (DailyTwenty == nil) then
|
||||||
|
DailyTwenty = false
|
||||||
|
end
|
||||||
|
if (DailyThirty == nil) then
|
||||||
|
DailyThirty = false
|
||||||
|
end
|
||||||
|
if (DailyForty == nil) then
|
||||||
|
DailyForty = false
|
||||||
|
end
|
||||||
|
if (DailyFifty == nil) then
|
||||||
|
DailyFifty = false
|
||||||
|
end
|
||||||
|
if (DailySixty == nil) then
|
||||||
|
DailySixty = false
|
||||||
|
end
|
||||||
|
if (DailySeventy == nil) then
|
||||||
|
DailySeventy = false
|
||||||
|
end
|
||||||
|
if (DailyEighty == nil) then
|
||||||
|
DailyEighty = false
|
||||||
|
end
|
||||||
|
if (DailyNinety == nil) then
|
||||||
|
DailyNinety = false
|
||||||
|
end
|
||||||
|
if (DailyHundred == nil) then
|
||||||
|
DailyHundred = false
|
||||||
|
end
|
||||||
|
|
||||||
|
if (DayCounter == nil) then
|
||||||
|
DayCounter = 1;
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Meta Data
|
-- Meta Data
|
||||||
|
@ -62,6 +108,61 @@ function MX:OnInitialize()
|
||||||
print("MxW v." .. self.db.profile.version .. L["Message_Loaded"]);
|
print("MxW v." .. self.db.profile.version .. L["Message_Loaded"]);
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local function MyAddonCommands(msg, editbox)
|
||||||
|
if msg == 'restore' then
|
||||||
|
if (Farmer_Logic_Day ~= day) then
|
||||||
|
Farmer_Money_DayGlobal = 0;
|
||||||
|
Farmer_Money_MonthGlobal = Farmer_Money_MonthBack;
|
||||||
|
ReloadUI();
|
||||||
|
elseif (Farmer_Logic_Day == day) then
|
||||||
|
Farmer_Money_MonthGlobal = Farmer_Money_MonthBack + Farmer_Money_DayGlobal;
|
||||||
|
ReloadUI();
|
||||||
|
end
|
||||||
|
elseif (msg == 'reset') then
|
||||||
|
if (Farmer_Logic_Day ~= day) then
|
||||||
|
Farmer_Money_DayGlobal = 0;
|
||||||
|
Farmer_Money_MonthBack = Farmer_Money_MonthGlobal;
|
||||||
|
Farmer_Money_MonthGlobal = 0;
|
||||||
|
DayCounter = 1;
|
||||||
|
DailyRecord = 1;
|
||||||
|
DailyRecordFlag = false;
|
||||||
|
ReloadUI();
|
||||||
|
else
|
||||||
|
Farmer_Money_MonthBack = Farmer_Money_MonthGlobal;
|
||||||
|
Farmer_Money_MonthGlobal = Farmer_Money_DayGlobal;
|
||||||
|
Farmer_Money_DayGlobal = 0;
|
||||||
|
DayCounter = 1;
|
||||||
|
DailyRecord = 1;
|
||||||
|
DailyRecordFlag = false;
|
||||||
|
ReloadUI();
|
||||||
|
end
|
||||||
|
elseif (msg == 'alert') then
|
||||||
|
if (Settings_Alert_Enabled) then
|
||||||
|
Settings_Alert_Enabled = false;
|
||||||
|
print(L["Settings_Alert_Disabled"])
|
||||||
|
else
|
||||||
|
Settings_Alert_Enabled = true;
|
||||||
|
print(L["Settings_Alert_Enabled"] .. MX:FormatMoney(Farmer_Logic_MinAlert))
|
||||||
|
end
|
||||||
|
elseif (msg == 'gmsg') then
|
||||||
|
if (Settings_GuildMessage_Enabled) then
|
||||||
|
Settings_GuildMessage_Enabled = false;
|
||||||
|
print(L["Settings_GuildMessage_Disabled"])
|
||||||
|
else
|
||||||
|
Settings_GuildMessage_Enabled = true;
|
||||||
|
print(L["Settings_GuildMessage_Enabled"])
|
||||||
|
end
|
||||||
|
elseif (msg == 'config') then
|
||||||
|
MX:ShowSettingsUI();
|
||||||
|
else
|
||||||
|
print(L["ChatCMD_Help"])
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
SLASH_MXW1 = '/mxw'
|
||||||
|
|
||||||
|
SlashCmdList["MXW"] = MyAddonCommands
|
||||||
|
|
||||||
function MX:OnEnable()
|
function MX:OnEnable()
|
||||||
MX:ShowMainUI()
|
MX:ShowMainUI()
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in New Issue