vanilla-wow-addons – Rev 1
?pathlinks?

--[[ KLHThreatMeter KTM_OptionsGui.lua
Controls a Gui for viewing and editing settings on the main window. See also
KTM_OptionsFrame.xml, KTM_Gui.lua.
--]]
local mod = klhtm
local me = { }
mod.guiopt = me
-- a table of the Gui components in the options frame
local gui = {};
KLHTM_OptionsGui = gui;
-- Gui options
local options = KLHTM_GuiOptions;
-- options frame visibility information
local state = {
["closed"] = true, -- false if the frame is visible
["frame"] = "gen", -- the visible subframe
};
-- the font size of the gui strings
local String_Font_Size = 11;
-- the font size of the button strings
local Button_Font_Size = 10;
------------------------------------------------------------------------------
-- Sets up the instance variable "gui". It contains references to the Options
-- Gui components
------------------------------------------------------------------------------
function KLHTM_CreateOptionsTable()
gui.frame = KLHTM_OptionsFrame;
gui.title = {
["frame"] = KLHTM_OptionsFrameTitle,
["back"] = KLHTM_OptionsFrameTitleBackground,
["text"] = KLHTM_OptionsFrameTitleText,
};
gui.gen = {
["frame"] = KLHTM_OptionsFrameGeneral,
["otherhead"] = {
["frame"] = KLHTM_OptionsFrameGeneralHeaderOther,
["text"] = KLHTM_OptionsFrameGeneralHeaderOtherText,
},
["scale"] = {
["frame"] = KLHTM_OptionsFrameGeneralScale,
["text"] = KLHTM_OptionsFrameGeneralScaleText,
["value"] = KLHTM_OptionsFrameGeneralScaleValue,
},
-- command button visibility when minimised
["minvishead"] = {
["frame"] = KLHTM_OptionsFrameGeneralMinimisedHeader,
["text"] = KLHTM_OptionsFrameGeneralMinimisedHeaderText,
},
["minvis"] = {
["pin"] = {
["frame"] = KLHTM_OptionsFrameGeneralMinimisedPin,
["text"] = KLHTM_OptionsFrameGeneralMinimisedPinText,
},
["opt"] = {
["frame"] = KLHTM_OptionsFrameGeneralMinimisedOptions,
["text"] = KLHTM_OptionsFrameGeneralMinimisedOptionsText,
},
["view"] = {
["frame"] = KLHTM_OptionsFrameGeneralMinimisedView,
["text"] = KLHTM_OptionsFrameGeneralMinimisedViewText,
},
["targ"] = {
["frame"] = KLHTM_OptionsFrameGeneralMinimisedMasterTarget,
["text"] = KLHTM_OptionsFrameGeneralMinimisedMasterTargetText,
},
["clear"] = {
["frame"] = KLHTM_OptionsFrameGeneralMinimisedClearThreat,
["text"] = KLHTM_OptionsFrameGeneralMinimisedClearThreatText,
},
},
-- command button visibility when maximised
["maxvishead"] = {
["frame"] = KLHTM_OptionsFrameGeneralMaximisedHeader,
["text"] = KLHTM_OptionsFrameGeneralMaximisedHeaderText,
},
["maxvis"] = {
["pin"] = {
["frame"] = KLHTM_OptionsFrameGeneralMaximisedPin,
["text"] = KLHTM_OptionsFrameGeneralMaximisedPinText,
},
["view"] = {
["frame"] = KLHTM_OptionsFrameGeneralMaximisedView,
["text"] = KLHTM_OptionsFrameGeneralMaximisedViewText,
},
["targ"] = {
["frame"] = KLHTM_OptionsFrameGeneralMaximisedMasterTarget,
["text"] = KLHTM_OptionsFrameGeneralMaximisedMasterTargetText,
},
["clear"] = {
["frame"] = KLHTM_OptionsFrameGeneralMaximisedClearThreat,
["text"] = KLHTM_OptionsFrameGeneralMaximisedClearThreatText,
},
},
};
gui.self = {
["frame"] = KLHTM_OptionsFrameSelf,
-- column visibility
["colhead"] = {
["frame"] = KLHTM_OptionsFrameSelfColumnHeader,
["text"] = KLHTM_OptionsFrameSelfColumnHeaderText,
},
["col"] = {
["hits"] = {
["frame"] = KLHTM_OptionsFrameSelfColumnHits,
["text"] = KLHTM_OptionsFrameSelfColumnHitsText,
},
["rage"] = {
["frame"] = KLHTM_OptionsFrameSelfColumnRage,
["text"] = KLHTM_OptionsFrameSelfColumnRageText,
},
["dam"] = {
["frame"] = KLHTM_OptionsFrameSelfColumnDamage,
["text"] = KLHTM_OptionsFrameSelfColumnDamageText,
},
["threat"] = {
["frame"] = KLHTM_OptionsFrameSelfColumnThreat,
["text"] = KLHTM_OptionsFrameSelfColumnThreatText,
},
["pc"] = {
["frame"] = KLHTM_OptionsFrameSelfColumnThreatPercent,
["text"] = KLHTM_OptionsFrameSelfColumnThreatPercentText,
},
},
["otherhead"] = {
["frame"] = KLHTM_OptionsFrameSelfOtherHeader,
["text"] = KLHTM_OptionsFrameSelfOtherHeaderText,
},
-- hide zero rows
["hide"] = {
["frame"] = KLHTM_OptionsFrameSelfHideZero,
["text"] = KLHTM_OptionsFrameSelfHideZeroText,
},
-- abbreviate large numbers
["abbreviate"] = {
["frame"] = KLHTM_OptionsFrameSelfAbbreviate,
["text"] = KLHTM_OptionsFrameSelfAbbreviateText,
},
-- title bar minimised string
["threat"] = {
["frame"] = KLHTM_OptionsFrameSelfMinimisedThreat,
["text"] = KLHTM_OptionsFrameSelfMinimisedThreatText,
},
};
gui.raid = {
["frame"] = KLHTM_OptionsFrameRaid,
-- column visibility
["colhead"] = {
["frame"] = KLHTM_OptionsFrameRaidColumnHeader,
["text"] = KLHTM_OptionsFrameRaidColumnHeaderText,
},
["col"] = {
["threat"] = {
["frame"] = KLHTM_OptionsFrameRaidColumnThreat,
["text"] = KLHTM_OptionsFrameRaidColumnThreatText,
},
["pc"] = {
["frame"] = KLHTM_OptionsFrameRaidColumnThreatPercent,
["text"] = KLHTM_OptionsFrameRaidColumnThreatPercentText,
},
},
-- minimised string visibility
["minvishead"] = {
["frame"] = KLHTM_OptionsFrameRaidMinimisedHeader,
["text"] = KLHTM_OptionsFrameRaidMinimisedHeaderText,
},
["minvis"] = {
["rank"] = {
["frame"] = KLHTM_OptionsFrameRaidMinimisedRank,
["text"] = KLHTM_OptionsFrameRaidMinimisedRankText,
},
["pc"] = {
["frame"] = KLHTM_OptionsFrameRaidMinimisedThreatPercent,
["text"] = KLHTM_OptionsFrameRaidMinimisedThreatPercentText,
},
["tdef"] = {
["frame"] = KLHTM_OptionsFrameRaidMinimisedDeficit,
["text"] = KLHTM_OptionsFrameRaidMinimisedDeficitText,
},
},
["otherhead"] = {
["frame"] = KLHTM_OptionsFrameRaidOtherHeader,
["text"] = KLHTM_OptionsFrameRaidOtherHeaderText,
},
-- hide zero rows
["hide"] = {
["frame"] = KLHTM_OptionsFrameRaidHideZero,
["text"] = KLHTM_OptionsFrameRaidHideZeroText,
},
-- max row count
["rows"] = {
["frame"] = KLHTM_OptionsFrameRaidRows,
["text"] = KLHTM_OptionsFrameRaidRowsText,
["value"] = KLHTM_OptionsFrameRaidRowsValue,
},
-- resize
["resize"] = {
["frame"] = KLHTM_OptionsFrameRaidResize,
["text"] = KLHTM_OptionsFrameRaidResizeText,
},
-- show aggro gain
["aggro"] = {
["frame"] = KLHTM_OptionsFrameRaidAggroGain,
["text"] = KLHTM_OptionsFrameRaidAggroGainText,
},
-- abbreviate large numbers
["abbreviate"] = {
["frame"] = KLHTM_OptionsFrameRaidAbbreviate,
["text"] = KLHTM_OptionsFrameRaidAbbreviateText,
},
-- hide bottom bar
["bottom"] = {
["frame"] = KLHTM_OptionsFrameRaidHideBottom,
["text"] = KLHTM_OptionsFrameRaidHideBottomText,
},
};
-- command buttons
gui.but = {
["gen"] = KLHTM_OptionsFrameControlsGeneral,
["self"] = KLHTM_OptionsFrameControlsSelf,
["raid"] = KLHTM_OptionsFrameControlsRaid,
["close"] = KLHTM_OptionsFrameControlsClose,
};
end
------------------------------------------------------------------------------
-- Applies Gui component properties that are not specified in the XML.
------------------------------------------------------------------------------
function KLHTM_SetupOptionsGui()
-- base frame
gui.frame:RegisterForDrag("LeftButton");
gui.frame:SetMovable(true);
gui.frame:SetBackdropColor(0, 0, 0);
gui.frame:SetBackdropBorderColor(1, 1, 1);
-- command buttons
for index, button in gui.but do
button:SetText(mod.string.get("optionsgui", "buttons", index));
end
-- general frame
for index, button in gui.gen.minvis do
button.text:SetText(mod.string.get("optionsgui", "labels", "buttons", index));
end
for index, button in gui.gen.maxvis do
button.text:SetText(mod.string.get("optionsgui", "labels", "buttons", index));
end
gui.gen.minvishead.text:SetText(mod.string.get("optionsgui", "labels", "headers", "minvis"));
gui.gen.maxvishead.text:SetText(mod.string.get("optionsgui", "labels", "headers", "maxvis"));
gui.gen.otherhead.text:SetText(mod.string.get("optionsgui", "labels", "headers", "other"));
gui.gen.scale.frame:SetMinMaxValues(KLHTM_Scale.min * 100, KLHTM_Scale.max * 100);
gui.gen.scale.frame:SetValueStep(KLHTM_Scale.tick * 100);
gui.gen.scale.text:SetText(mod.string.get("optionsgui", "labels", "options", "scale"));
-- self frame
gui.self.colhead.text:SetText(mod.string.get("optionsgui", "labels", "headers", "columns"));
for index, column in gui.self.col do
column.text:SetText(mod.string.get("optionsgui", "labels", "columns", index));
end
gui.self.otherhead.text:SetText(mod.string.get("optionsgui", "labels", "headers", "other"));
gui.self.hide.text:SetText(mod.string.get("optionsgui", "labels", "options", "hide"));
gui.self.abbreviate.text:SetText(mod.string.get("optionsgui", "labels", "options", "abbreviate"));
gui.self.threat.text:SetText(mod.string.get("optionsgui", "labels", "minvis", "threat"));
-- raid frame
gui.raid.colhead.text:SetText(mod.string.get("optionsgui", "labels", "headers", "columns"));
gui.raid.col.threat.text:SetText(mod.string.get("optionsgui", "labels", "columns", "threat"));
gui.raid.col.pc.text:SetText(mod.string.get("optionsgui", "labels", "columns", "pc"));
for index, button in gui.raid.minvis do
button.text:SetText(mod.string.get("optionsgui", "labels", "minvis", index));
end
gui.raid.minvishead.text:SetText(mod.string.get("optionsgui", "labels", "headers", "strings"));
gui.raid.otherhead.text:SetText(mod.string.get("optionsgui", "labels", "headers", "other"));
gui.raid.hide.text:SetText(mod.string.get("optionsgui", "labels", "options", "hide"));
gui.raid.resize.text:SetText(mod.string.get("optionsgui", "labels", "options", "resize"));
gui.raid.aggro.text:SetText(mod.string.get("optionsgui", "labels", "options", "aggro"));
gui.raid.abbreviate.text:SetText(mod.string.get("optionsgui", "labels", "options", "abbreviate"));
gui.raid.bottom.text:SetText(mod.string.get("optionsgui", "labels", "options", "bottom"));
gui.raid.rows.text:SetText(mod.string.get("optionsgui", "labels", "options", "rows"));
gui.raid.rows.frame:SetMinMaxValues(2, KLHTM_MaxRaidRows);
gui.raid.rows.frame:SetValueStep(1);
-- resize the strings. Due to localisation compatibility issues, this is not possible
-- to do via the XML.
local function resizeGroup(input)
for _, item in input do
if (item.text ~= nil) then
local path = item.text:GetFont();
item.text:SetFont(path, String_Font_Size);
end
end
end
resizeGroup(gui.gen);
resizeGroup(gui.gen.minvis);
resizeGroup(gui.gen.maxvis);
resizeGroup(gui.self);
resizeGroup(gui.self.col);
resizeGroup(gui.raid);
resizeGroup(gui.raid.col);
resizeGroup(gui.raid.minvis);
-- reduce font size if the buttons aren't large enough
local needsResize = false;
for index, button in gui.but do
-- 10: 5 pixels space for each edge
if (button:GetTextWidth() > button:GetWidth() - 10) then
needsResize = true;
end
end
if (needsResize) then
local path = gui.but.gen:GetFont();
for index, button in gui.but do
button:SetFont(path, Button_Font_Size);
end
if mod.out.checktrace("info", me, "resizing") then
mod.out.printtrace("Resizing options GUI button fonts");
end
end
end
------------------------------------------------------------------------------
-- Sets the states of the options gui components to match the current settings
------------------------------------------------------------------------------
function KLHTM_SyncOptionsGui()
-- general frame
for index, button in gui.gen.minvis do
button.frame:SetChecked(options.buttonVis.min[index]);
end
for index, button in gui.gen.maxvis do
button.frame:SetChecked(options.buttonVis.max[index]);
end
-- scale slider
local temp = gui.gen.scale.frame:GetScript("OnValueChanged");
gui.gen.scale.frame:SetScript("OnValueChanged", nil);
gui.gen.scale.frame:SetValue(options.scale * 100)
gui.gen.scale.frame:SetScript("OnValueChanged", temp);
gui.gen.scale.value:SetText(options.scale * 100 .. "%");
-- self frame
for index, column in gui.self.col do
column.frame:SetChecked(options.self.columnVis[index]);
end
gui.self.hide.frame:SetChecked(options.self.hideZeroRows);
gui.self.abbreviate.frame:SetChecked(options.self.abbreviate);
gui.self.threat.frame:SetChecked(options.self.stringVis.threat);
-- raid frame
gui.raid.col.threat.frame:SetChecked(options.raid.columnVis.threat)
gui.raid.col.pc.frame:SetChecked(options.raid.columnVis.pc)
for index, button in gui.raid.minvis do
button.frame:SetChecked(options.raid.stringVis[index]);
end
gui.raid.hide.frame:SetChecked(options.raid.hideZeroRows);
gui.raid.resize.frame:SetChecked(options.raid.resize);
gui.raid.aggro.frame:SetChecked(options.raid.showAggroGain);
gui.raid.abbreviate.frame:SetChecked(options.raid.abbreviate);
-- rows slider
local temp = gui.gen.scale.frame:GetScript("OnValueChanged");
gui.gen.scale.frame:SetScript("OnValueChanged", nil);
gui.raid.rows.frame:SetValue(options.raid.rows);
gui.gen.scale.frame:SetScript("OnValueChanged", temp);
gui.raid.rows.value:SetText(options.raid.rows);
end
------------------------------------------------------------------------------
-- Updates the visibility of the options frame and its subframes
------------------------------------------------------------------------------
function KLHTM_UpdateOptionsFrame()
if (state.closed) then
gui.frame:Hide();
return;
else
gui.frame:Show();
end
if (state.frame == "gen") then
gui.gen.frame:Show();
else
gui.gen.frame:Hide();
end
if (state.frame == "raid") then
gui.raid.frame:Show();
else
gui.raid.frame:Hide();
end
if (state.frame == "self") then
gui.self.frame:Show();
else
gui.self.frame:Hide();
end
gui.title.text:SetText(mod.string.get("optionsgui", "labels", "titlebar", state.frame));
local col = KLHTM_TitleBarColours[state.frame];
gui.title.back:SetGradientAlpha("VERTICAL", col.minR, col.minG, col.minB, col.minA, col.maxR, col.maxG, col.maxB, col.maxA);
end
------------------------------------------------------------------------------
-- Hides or shows the options frame. Called when the user clicks on the options
-- command button on the main frame. If the options frame is being shown, the
-- contents are synchronised with the gui settings.
------------------------------------------------------------------------------
function KLHTM_ToggleOptionsGui()
state.closed = not state.closed;
if (not state.closed) then
KLHTM_SyncOptionsGui();
end
KLHTM_UpdateOptionsFrame();
end
------------------------------------------------------------------------------
-- Called when the used clicks on one of the command buttons
------------------------------------------------------------------------------
function KLHTM_OptionsButton_OnClick(command)
if (command == "General") then
state.frame = "gen";
KLHTM_UpdateOptionsFrame();
elseif (command == "Self") then
state.frame = "self";
KLHTM_UpdateOptionsFrame();
elseif (command == "Raid") then
state.frame = "raid";
KLHTM_UpdateOptionsFrame();
elseif (command == "Close") then
state.closed = true;
KLHTM_UpdateOptionsFrame();
else
if mod.out.checktrace("warning", me, "invalidargument") then
mod.out.printtrace(string.format("The argument '%s' to OptionsButton_OnClick is not recognised.", tostring(command)))
end
end
end
-- converts the output of a checkbox GetChecked() query (1 or nil) to a boolean
local function ToBoolean(input)
if (input) then
return true;
else
return false;
end
end
------------------------------------------------------------------------------
-- Called when the user clicks on a checkbox in the general frame
------------------------------------------------------------------------------
function KLHTM_OptionsGeneral_OnClick(command)
if (command == "MinimisedPin") then
options.buttonVis.min.pin = ToBoolean(gui.gen.minvis.pin.frame:GetChecked());
elseif (command == "MinimisedView") then
options.buttonVis.min.view = ToBoolean(gui.gen.minvis.view.frame:GetChecked());
elseif (command == "MinimisedOptions") then
options.buttonVis.min.opt = ToBoolean(gui.gen.minvis.opt.frame:GetChecked());
elseif (command == "MinimisedMasterTarget") then
options.buttonVis.min.targ = ToBoolean(gui.gen.minvis.targ.frame:GetChecked());
elseif (command == "MinimisedClearThreat") then
options.buttonVis.min.clear = ToBoolean(gui.gen.minvis.clear.frame:GetChecked());
elseif (command == "MaximisedPin") then
options.buttonVis.max.pin = ToBoolean(gui.gen.maxvis.pin.frame:GetChecked());
elseif (command == "MaximisedView") then
options.buttonVis.max.view = ToBoolean(gui.gen.maxvis.view.frame:GetChecked());
elseif (command == "MaximisedOptions") then
options.buttonVis.max.opt = ToBoolean(gui.gen.maxvis.opt.frame:GetChecked());
elseif (command == "MaximisedMasterTarget") then
options.buttonVis.max.targ = ToBoolean(gui.gen.maxvis.targ.frame:GetChecked());
elseif (command == "MaximisedClearThreat") then
options.buttonVis.max.clear = ToBoolean(gui.gen.maxvis.clear.frame:GetChecked());
else
if mod.out.checktrace("warning", me, "invalidargument") then
mod.out.printtrace(string.format("The argument '%s' to OptionsGeneral_OnClick is not recognised.", tostring(command)))
end
return;
end
KLHTM_UpdateTitleButtons();
KLHTM_UpdateFrame();
end
------------------------------------------------------------------------------
-- Called when the user adjusts a slider in the general frame
------------------------------------------------------------------------------
function KLHTM_OptionsGeneral_OnValueChanged(command)
if (command == "Scale") then
KLHTM_SetGuiScale(gui.gen.scale.frame:GetValue() / 100);
gui.gen.scale.value:SetText(options.scale * 100 .. "%");
else
if mod.out.checktrace("warning", me, "invalidargument") then
mod.out.printtrace(string.format("The argument '%s' to OptionsGeneral_OnValueChanged is invalid.", tostring(command)))
end
end
end
------------------------------------------------------------------------------
-- Called when the user clicks on a checkbox in the self frame
------------------------------------------------------------------------------
function KLHTM_OptionsSelf_OnClick(command)
if (command == "ColumnHits") then
options.self.columnVis.hits = ToBoolean(gui.self.col.hits.frame:GetChecked());
elseif (command == "ColumnRage") then
options.self.columnVis.rage = ToBoolean(gui.self.col.rage.frame:GetChecked());
elseif (command == "ColumnDamage") then
options.self.columnVis.dam = ToBoolean(gui.self.col.dam.frame:GetChecked());
elseif (command == "ColumnThreat") then
options.self.columnVis.threat = ToBoolean(gui.self.col.threat.frame:GetChecked());
elseif (command == "ColumnThreatPercent") then
options.self.columnVis.pc = ToBoolean(gui.self.col.pc.frame:GetChecked());
elseif (command == "MinimisedThreat") then
options.self.stringVis.threat = ToBoolean(gui.self.threat.frame:GetChecked());
KLHTM_UpdateTitleStrings();
elseif (command == "HideZero") then
options.self.hideZeroRows = ToBoolean(gui.self.hide.frame:GetChecked());
elseif (command == "Abbreviate") then
options.self.abbreviate = ToBoolean(gui.self.abbreviate.frame:GetChecked());
else
if mod.out.checktrace("warning", me, "invalidargument") then
mod.out.printtrace(string.format("The argument '%s' to OptionsSelf_OnClick is unrecognised.", tostring(command)))
end
return;
end
KLHTM_UpdateSelfFrame();
KLHTM_UpdateFrame();
KLHTM_Redraw(true);
end
------------------------------------------------------------------------------
-- Called when the user clicks on a checkbox in the raid frame
------------------------------------------------------------------------------
function KLHTM_OptionsRaid_OnClick(command)
if (command == "ColumnThreat") then
options.raid.columnVis.threat = ToBoolean(gui.raid.col.threat.frame:GetChecked());
KLHTM_Redraw();
KLHTM_UpdateRaidFrame();
KLHTM_UpdateFrame();
elseif (command == "ColumnThreatPercent") then
options.raid.columnVis.pc = ToBoolean(gui.raid.col.pc.frame:GetChecked());
KLHTM_UpdateRaidFrame();
KLHTM_UpdateFrame();
elseif (command == "MinimisedRank") then
options.raid.stringVis.rank = ToBoolean(gui.raid.minvis.rank.frame:GetChecked());
KLHTM_UpdateTitleStrings();
KLHTM_UpdateFrame();
elseif (command == "MinimisedDeficit") then
options.raid.stringVis.tdef = ToBoolean(gui.raid.minvis.tdef.frame:GetChecked());
KLHTM_UpdateTitleStrings();
KLHTM_UpdateFrame();
elseif (command == "MinimisedThreatPercent") then
options.raid.stringVis.pc = ToBoolean(gui.raid.minvis.pc.frame:GetChecked());
KLHTM_UpdateTitleStrings();
KLHTM_UpdateFrame();
elseif (command == "HideZero") then
options.raid.hideZeroRows = ToBoolean(gui.raid.hide.frame:GetChecked());
elseif (command == "Resize") then
options.raid.resize = ToBoolean(gui.raid.resize.frame:GetChecked());
elseif (command == "Abbreviate") then
options.raid.abbreviate = ToBoolean(gui.raid.abbreviate.frame:GetChecked());
elseif (command == "AggroGain") then
options.raid.showAggroGain = ToBoolean(gui.raid.aggro.frame:GetChecked());
elseif (command == "HideBottom") then
options.raid.hideBottomBar = ToBoolean(gui.raid.bottom.frame:GetChecked());
KLHTM_UpdateRaidFrame();
else
if mod.out.checktrace("warning", me, "invalidargument") then
mod.out.printtrace(string.format("The argument '%s' to OptionsRaid_OnClick is unrecognised.", tostring(command)))
end
return;
end
KLHTM_Redraw(true);
end
------------------------------------------------------------------------------
-- Called when the user adjusts a slider in the raid frame
------------------------------------------------------------------------------
function KLHTM_OptionsRaid_OnValueChanged(command)
if (command == "Rows") then
options.raid.rows = gui.raid.rows.frame:GetValue();
gui.raid.rows.value:SetText(options.raid.rows);
KLHTM_Redraw(true);
else
if mod.out.checktrace("warning", me, "invalidargument") then
mod.out.printtrace(string.format("The argument '%s' to OptionsRaid_OnValueChanged is unrecognised.", tostring(command)))
end
end
end
------------------------------------------------------------------------------
-- Called when the user mouses-over some of the options frames
------------------------------------------------------------------------------
function KLHTM_Options_OnEnter(name)
local text = mod.string.get("optionsgui", "tooltips", name);
GameTooltip:SetOwner(this, "ANCHOR_BOTTOM");
GameTooltip:SetText(text, 1.0, 0.82, 0, 1, 1);
GameTooltip:Show();
end
function KLHTM_Options_OnLeave()
GameTooltip:Hide();
end