📄 titanutils.lua
字号:
-- Constants
TITAN_ARTWORK_PATH = "Interface\\AddOns\\Titan\\Artwork\\";
TITAN_THRESHOLD_EXCEPTION_COLOR = GRAY_FONT_COLOR;
-- Tables
TITAN_PANEL_NONMOVABLE_PLUGINS = {"Clock", "Volume", "UIScale", "Trans", "AutoHide", "AuxAutoHide"};
TitanPlugins = {};
TitanPluginsIndex = {};
function TitanDebug(debug_message)
-- Default green color
DEFAULT_CHAT_FRAME:AddMessage("|cff00ff00" .. TITAN_DEBUG .. " " .. debug_message);
end
function TitanUtils_GetNextButtonOnBar(bar, id, side)
local index = TitanUtils_GetCurrentIndex(TitanPanelSettings.Buttons, id);
for i, id in TitanPanelSettings.Buttons do
if TitanUtils_GetWhichBar(id) == bar and i > index and TitanPanel_GetPluginSide(id) == side then
return i;
end
end
end
function TitanUtils_GetRealPosition(id)
local i = TitanPanel_GetButtonNumber(id);
if TitanPanelSettings.Location[i] == "Bar" and TitanPanelGetVar("BothBars") then
return TITAN_PANEL_PLACE_TOP;
elseif TitanPanelSettings.Location[i] == "Bar" then
return TitanPanelGetVar("Position");
else
return TITAN_PANEL_PLACE_BOTTOM;
end
end
function TitanUtils_GetWhichBar(id)
local i = TitanPanel_GetButtonNumber(id);
return TitanPanelSettings.Location[i];
end
function TitanUtils_GetDoubleBar(bothbars, framePosition)
if framePosition == TITAN_PANEL_PLACE_TOP then
return TitanPanelGetVar("DoubleBar")
elseif framePosition == TITAN_PANEL_PLACE_BOTTOM and bothbars == nil then
return TitanPanelGetVar("DoubleBar")
elseif framePosition == TITAN_PANEL_PLACE_BOTTOM and bothbars == 1 then
return TitanPanelGetVar("AuxDoubleBar")
end
end
function TitanUtils_CheckAutoHideCounting(elapsed)
local frame = TitanPanelBarButtonHider;
local auxframe = TitanPanelAuxBarButtonHider;
if (TitanPanelGetVar("AutoHide")) then
if (not frame.frameTimer or not frame.isCounting) then
-- Do nothing
elseif (frame.frameTimer < 0) then
TitanPanelBarButton_Hide("TitanPanelBarButton", TitanPanelGetVar("Position"));
frame.frameTimer = nil;
frame.isCounting = nil;
else
frame.frameTimer = frame.frameTimer - elapsed;
end
end
if (TitanPanelGetVar("AuxAutoHide")) then
if (not auxframe.frameTimer or not auxframe.isCounting) then
-- Do nothing
elseif (auxframe.frameTimer < 0) then
TitanPanelBarButton_Hide("TitanPanelAuxBarButton", TITAN_PANEL_PLACE_BOTTOM);
auxframe.frameTimer = nil;
auxframe.isCounting = nil;
else
auxframe.frameTimer = auxframe.frameTimer - elapsed;
end
end
end
function TitanUtils_StartAutoHideCounting(frame)
TITAN_PANEL_SELECTED = TitanUtils_GetButtonID(this:GetName())
-- Toggle menu
if TITAN_PANEL_SELECTED == "MoneyButtonGold" or TITAN_PANEL_SELECTED == "MoneyButtonSilver" or TITAN_PANEL_SELECTED == "MoneyButtonCopper" then
TITAN_PANEL_SELECTED = "Money"
end
if frame ~= nil then
local frname = getglobal(frame);
frname.frameTimer = TITAN_AUTOHIDE_WAIT_TIME;
frname.isCounting = 1;
end
end
function TitanUtils_StopAutoHideCounting(frame)
TITAN_PANEL_SELECTED = TitanUtils_GetButtonID(this:GetName())
-- Toggle menu
if TITAN_PANEL_SELECTED == "MoneyButtonGold" or TITAN_PANEL_SELECTED == "MoneyButtonSilver" or TITAN_PANEL_SELECTED == "MoneyButtonCopper" then
TITAN_PANEL_SELECTED = "Money"
end
if frame == nil then
frame = "TitanPanel" .. TitanUtils_GetWhichBar(TITAN_PANEL_SELECTED) .. "ButtonHider";
end
local frname = getglobal(frame)
frname.isCounting = nil;
end
function TitanUtils_CheckFrameCounting(frame, elapsed)
if (frame:IsVisible()) then
if (not frame.frameTimer or not frame.isCounting) then
return;
elseif ( frame.frameTimer < 0 ) then
frame:Hide();
frame.frameTimer = nil;
frame.isCounting = nil;
else
frame.frameTimer = frame.frameTimer - elapsed;
end
end
end
function TitanUtils_StartFrameCounting(frame, frameShowTime)
frame.frameTimer = frameShowTime;
frame.isCounting = 1;
end
function TitanUtils_StopFrameCounting(frame)
frame.isCounting = nil;
end
function TitanUtils_CloseAllControlFrames()
for index, value in TitanPlugins do
local frame = getglobal("TitanPanel"..index.."ControlFrame");
if (frame and frame:IsVisible()) then
frame:Hide();
end
end
end
function TitanUtils_IsAnyControlFrameVisible()
for index, value in TitanPlugins do
local frame = getglobal("TitanPanel"..index.."ControlFrame");
if (frame:IsVisible()) then
return true;
end
end
return false;
end
function TitanUtils_CloseRightClickMenu()
if (DropDownList1:IsVisible()) then
DropDownList1:Hide();
end
end
function TitanUtils_Ternary(a, b, c)
if (a) then
return b;
else
return c;
end
end
function TitanUtils_Toggle(value)
if (value == 1) then
return nil;
else
return 1;
end
end
function TitanUtils_Min(a, b)
if (a and b) then
return TitanUtils_Ternary((a < b), a, b);
end
end
function TitanUtils_Max(a, b)
if (a and b) then
return TitanUtils_Ternary((a > b), a, b);
end
end
function TitanUtils_GetEstTimeText(s)
if (s < 0) then
return TITAN_NA;
elseif (s < 60) then
return format("%d "..TITAN_SECONDS, s);
elseif (s < 60*60) then
return format("%.1f "..TITAN_MINUTES, s/60);
elseif (s < 24*60*60) then
return format("%.1f "..TITAN_HOURS, s/60/60);
else
return format("%.1f "..TITAN_DAYS, s/24/60/60);
end
end
function TitanUtils_GetFullTimeText(s)
if (s < 0) then
return TITAN_NA;
end
local days = floor(s/24/60/60); s = mod(s, 24*60*60);
local hours = floor(s/60/60); s = mod(s, 60*60);
local minutes = floor(s/60); s = mod(s, 60);
local seconds = s;
return format("%d"..TITAN_DAYS_ABBR..", %2d"..TITAN_HOURS_ABBR..", %2d"..TITAN_MINUTES_ABBR..", %2d"..TITAN_SECONDS_ABBR,
days, hours, minutes, seconds);
end
function TitanUtils_GetAbbrTimeText(s)
if (s < 0) then
return TITAN_NA;
end
local days = floor(s/24/60/60); s = mod(s, 24*60*60);
local hours = floor(s/60/60); s = mod(s, 60*60);
local minutes = floor(s/60); s = mod(s, 60);
local seconds = s;
local timeText = "";
if (days ~= 0) then
timeText = timeText..format("%d"..TITAN_DAYS_ABBR.." ", days);
end
if (days ~= 0 or hours ~= 0) then
timeText = timeText..format("%d"..TITAN_HOURS_ABBR.." ", hours);
end
if (days ~= 0 or hours ~= 0 or minutes ~= 0) then
timeText = timeText..format("%d"..TITAN_MINUTES_ABBR.." ", minutes);
end
timeText = timeText..format("%d"..TITAN_SECONDS_ABBR, seconds);
return timeText;
end
function TitanUtils_GetButton(id, returnThis)
if (id) then
return getglobal("TitanPanel"..id.."Button"), id;
elseif (returnThis) then
return this, TitanUtils_GetButtonID();
end
end
function TitanUtils_GetButtonID(name)
if (name == nil) then
name = this:GetName();
end
local s, e, id = string.find(name, "TitanPanel(.*)Button");
return id;
end
function TitanUtils_GetParentButtonID(name)
local frame = TitanUtils_Ternary(name, getglobal(name), this);
if ( frame and frame:GetParent() ) then
return TitanUtils_GetButtonID(frame:GetParent():GetName());
end
end
function TitanUtils_GetButtonIDFromMenu()
if ( this:GetParent() ) then
if ( this:GetParent():GetName() == "TitanPanelBarButton" ) then
return "Bar";
elseif ( this:GetParent():GetName() == "TitanPanelAuxBarButton" ) then
return "Bar";
elseif ( this:GetParent():GetParent()) then
-- TitanPanelChildButton
return TitanUtils_GetButtonID(this:GetParent():GetParent():GetName());
else
-- TitanPanelButton
return TitanUtils_GetButtonID(this:GetParent():GetName());
end
end
end
function TitanUtils_GetControlFrame(id)
if (id == nil) then
id = TitanUtils_GetButtonID();
end
if (id) then
return getglobal("TitanPanel"..id.."ControlFrame");
else
return;
end
end
function TitanUtils_GetPlugin(id)
if (id == nil) then
id = TitanUtils_GetButtonID();
end
if (id) then
return TitanPlugins[id];
end
end
function TitanUtils_IsPluginRegistered(id)
if (id and TitanPlugins[id]) then
return true;
else
return false;
end
end
function TitanUtils_RegisterPlugin(registry)
if (registry and registry.id) then
local id = registry.id;
if TitanUtils_IsPluginRegistered(id) then
-- We have already registered this plugin we have an issue!
TitanPanel_LoadError("Plugin " .. id .. TITAN_PANEL_ERROR_DUP_PLUGIN);
else
if (not TitanUtils_TableContainsValue(TitanPluginsIndex, id)) then
TitanPlugins[id] = registry;
-- if (not TitanUtils_TableContainsValue(TITAN_PANEL_NONMOVABLE_PLUGINS, id)) then
table.insert(TitanPluginsIndex, registry.id);
table.sort(TitanPluginsIndex,
function(a, b)
return TitanPlugins[a].menuText < TitanPlugins[b].menuText;
end
);
-- end
end
end
end
end
function TitanUtils_TableContainsValue(table, value)
if (table and value) then
for i, v in table do
if (v == value) then
return i;
end
end
end
end
function TitanUtils_TableContainsIndex(table, index)
if (table and index) then
for i, v in table do
if (i == index) then
return i;
end
end
end
end
function TitanUtils_GetCurrentIndex(table, value)
return TitanUtils_TableContainsValue(table, value);
end
function TitanUtils_GetPreviousButton(table, id, isSameType, ignoreClock)
local index = TitanUtils_GetCurrentIndex(table, id);
local isIcon = TitanPanelButton_IsIcon(id);
local previousButton, isPreviousIcon;
if ( isSameType ) then
-- Get the previous button with the same type
while ( index > 1 ) do
previousButton = TitanUtils_GetButton(table[index - 1]);
isPreviousIcon = TitanPanelButton_IsIcon(table[index - 1]);
if ( ( isIcon and isPreviousIcon ) or ( not isIcon and not isPreviousIcon ) ) then
if ( ( table[index - 1] == TITAN_CLOCK_ID ) and ignoreClock ) then
-- Do nothing, ignore Clock button
else
return previousButton;
end
end
index = index - 1;
end
else
-- Simply get the previous button
if ( index > 1 ) then
return TitanUtils_GetButton(table[index - 1]);
end
end
end
function TitanUtils_GetNextButton(table, id, isSameType, ignoreClock)
local index = TitanUtils_GetCurrentIndex(table, id);
local isIcon = TitanPanelButton_IsIcon(id);
local nextButton, isNextIcon;
if ( isSameType ) then
-- Get the next button with the same type
while ( table[index + 1] ) do
nextButton = TitanUtils_GetButton(table[index + 1]);
isNextIcon = TitanPanelButton_IsIcon(table[index + 1]);
if ( ( isIcon and isNextIcon ) or ( not isIcon and not isNextIcon ) ) then
if ( ( table[index + 1] == TITAN_CLOCK_ID ) and ignoreClock ) then
-- Do nothing, ignore Clock button
else
return nextButton;
end
end
index = index + 1;
end
else
-- Simply get the next button
if ( table[index + 1] ) then
return TitanUtils_GetButton(table[index + 1]);
end
end
end
function TitanUtils_GetFirstButton(array, isSameType, isIcon, ignoreClock)
local firstButton, isFirstIcon;
local size = table.getn(array);
local index = 1;
if ( isSameType ) then
-- Get the first button with the same type
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -