vanilla-wow-addons – Rev 1

Subversion Repositories:
Rev:

--[[ KLH Threatmeter KLHTM_SelfGui.lua

Lukon Mod 2: Part of the replacement for Gui.lua and Tables.lua. 
Controls the GUI for the personal threat details section of KLH 
ThreatMeter. See also KTM_Gui.xml, KTM_Gui.lua.
--]]

local mod = klhtm
local me = { }
mod.guiself = me 

-- The number of rows defined in New_Frame.xml
local Max_Rows = 15;

-- Local references to some Gui variables
local options = KLHTM_GuiOptions;
local gui = KLHTM_Gui;
local sizes = KLHTM_GuiSizes;
local state = KLHTM_GuiState;
local heights = KLHTM_GuiHeights;


------------------------------------------------------------------------------
-- Sets up the instance variable "gui.self". It contains data on the GUI
-- components in the personal threat details frame.
------------------------------------------------------------------------------
function KLHTM_CreateSelfTable()
        
        gui.self = {
                ["frame"] = KLHTM_SelfFrame,
                ["line"] = KLHTM_SelfFrameLine, -- dividing line between title bar and frame
                ["head"] = { -- column headers
                        ["name"] = {
                                ["frame"] = KLHTM_SelfFrameHeaderName,
                                ["text"] = KLHTM_SelfFrameHeaderNameText,
                                ["width"] = 90,
                                ["colour"] = {["r"] = 1.0, ["g"] = 1.0, ["b"] = 1.0},
                                ["vis"] = function() return (options.self.columnVis.name) end,
                        },
                        ["hits"] = {
                                ["frame"] = KLHTM_SelfFrameHeaderHits,
                                ["text"] = KLHTM_SelfFrameHeaderHitsText,
                                ["width"] = 35,
                                ["colour"] = {["r"] = 0.5, ["g"] = 0.9, ["b"] = 0.5},
                                ["vis"] = function() return (options.self.columnVis.hits) end,
                        },
                        ["rage"] = {
                                ["frame"] = KLHTM_SelfFrameHeaderRage,
                                ["text"] = KLHTM_SelfFrameHeaderRageText,
                                ["width"] = 35,
                                ["colour"] = {["r"] = 0.9, ["g"] = 0.5, ["b"] = 0.5},
                                ["vis"] = function() return (options.self.columnVis.rage) end,
                        },
                        ["dam"] = {
                                ["frame"] = KLHTM_SelfFrameHeaderDamage,
                                ["text"] = KLHTM_SelfFrameHeaderDamageText,
                                ["width"] = 55,
                                ["colour"] = {["r"] = 0.9, ["g"] = 0.9, ["b"] = 0.3},
                                ["vis"] = function() return (options.self.columnVis.dam) end,
                        },
                        ["threat"] = {
                                ["frame"] = KLHTM_SelfFrameHeaderThreat,
                                ["text"] = KLHTM_SelfFrameHeaderThreatText,
                                ["width"] = 50,
                                ["colour"] = {["r"] = 0.9, ["g"] = 0.5, ["b"] = 0.9},
                                ["vis"] = function() return (options.self.columnVis.threat) end,
                        },
                        ["pc"] = {
                                ["frame"] = KLHTM_SelfFrameHeaderPercentThreat,
                                ["text"] = KLHTM_SelfFrameHeaderPercentThreatText,
                                ["width"] = 30,
                                ["colour"] = {["r"] = 0.9, ["g"] = 0.5, ["b"] = 0.9},
                                ["vis"] = function() return (options.self.columnVis.pc) end,
                        },
                },
                ["rows"] = {},
                ["bottom"] = { -- self totals
                        ["frame"] = KLHTM_SelfFrameBottom,
                        ["line"] = KLHTM_SelfFrameBottomLine, -- dividing line between frame and bottom bar
                        ["reset"] = {
                                -- a dummy frame used to align the bottom bar strings with the Name header
                                ["frame"] = KLHTM_SelfFrameBottomName,
                                -- a dummy element. Referenced here only to be hidden
                                ["bar"] = KLHTM_SelfFrameBottomBar,
                                ["but"] = KLHTM_SelfFrameBottomReset,
                                ["text"] = KLHTM_SelfFrameBottomResetText,
                                ["width"] = 70,
                        },
                        ["string"] = {
                                ["hits"] = {
                                        ["frame"] = KLHTM_SelfFrameBottomHits,
                                        ["text"] = KLHTM_SelfFrameBottomHitsText,
                                },
                                ["rage"] = {
                                        ["frame"] = KLHTM_SelfFrameBottomRage,
                                        ["text"] = KLHTM_SelfFrameBottomRageText,
                                },
                                ["dam"] = {
                                        ["frame"] = KLHTM_SelfFrameBottomDamage,
                                        ["text"] = KLHTM_SelfFrameBottomDamageText,
                                },
                                ["threat"] = {
                                        ["frame"] = KLHTM_SelfFrameBottomThreat,
                                        ["text"] = KLHTM_SelfFrameBottomThreatText,
                                },
                        },
                },
        };
        for x = 1, Max_Rows do
                gui.self.rows[x] = {
                        ["frame"] = getglobal("KLHTM_SelfFrameRow" .. x);
                        ["name"] = {
                                ["frame"] = getglobal("KLHTM_SelfFrameRow" .. x .. "Name"),
                                ["text"] = getglobal("KLHTM_SelfFrameRow" .. x .. "NameText"),
                        },
                        ["hits"] = {
                                ["frame"] = getglobal("KLHTM_SelfFrameRow" .. x .. "Hits"),
                                ["text"] = getglobal("KLHTM_SelfFrameRow" .. x .. "HitsText"),
                        },
                        ["rage"] = {
                                ["frame"] = getglobal("KLHTM_SelfFrameRow" .. x .. "Rage"),
                                ["text"] = getglobal("KLHTM_SelfFrameRow" .. x .. "RageText"),
                        },
                        ["dam"] = {
                                ["frame"] = getglobal("KLHTM_SelfFrameRow" .. x .. "Damage"),
                                ["text"] = getglobal("KLHTM_SelfFrameRow" .. x .. "DamageText"),
                        },
                        ["threat"] = {
                                ["frame"] = getglobal("KLHTM_SelfFrameRow" .. x .. "Threat"),
                                ["text"] = getglobal("KLHTM_SelfFrameRow" .. x .. "ThreatText"),
                        },
                        ["pc"] = {
                                ["frame"] = getglobal("KLHTM_SelfFrameRow" .. x .. "PercentThreat"),
                                ["text"] = getglobal("KLHTM_SelfFrameRow" .. x .. "PercentThreatText"),
                        },
                        ["bar"] = getglobal("KLHTM_SelfFrameRow" .. x .. "Bar"),
                };
        end
end


------------------------------------------------------------------------------
-- Applies Gui component properties that are not specified in the XML.
------------------------------------------------------------------------------
function KLHTM_SetupSelfGui()
        
        -- headers and data
        for index, header in gui.self.head do
                header.text:SetText(mod.string.get("gui", "self", "head", index));
                header.frame:SetHeight(heights.header);
                header.text:SetHeight(heights.header);
                KLHTM_AddOutline(header.text);
                KLHTM_LocaliseStringWidth(header);
                
                for _, row in gui.self.rows do
                        row[index].text:SetTextColor(header.colour.r, header.colour.g, header.colour.b);
                        row[index].frame:SetHeight(heights.data);
                        KLHTM_AddOutline(row[index].text);
                end
        end
        
        -- rows
        for _, row in gui.self.rows do
                row.frame:SetHeight(heights.data);
        end
        
        -- bottom
        gui.self.bottom.frame:SetHeight(heights.button);
        
        for _, string in gui.self.bottom.string do
                string.frame:SetHeight(heights.data);
                KLHTM_AddOutline(string.text);
        end
        
        gui.self.bottom.reset.bar:Hide();       
        gui.self.bottom.reset.but:SetHeight(heights.button);
        gui.self.bottom.reset.frame:SetHeight(heights.button);
        gui.self.bottom.reset.but:SetText(mod.string.get("gui", "self", "reset"));
         
        local width = gui.self.bottom.reset.text:GetStringWidth();
        if (width + 10 > gui.self.bottom.reset.width) then
                gui.self.bottom.reset.width = width + 10;
        end
        
        gui.self.bottom.reset.but:SetWidth(gui.self.bottom.reset.width);
end


------------------------------------------------------------------------------
-- Sets the default options for displaying the main window and title bar strings
-- when the self view is selected.
------------------------------------------------------------------------------
function KLHTM_SetDefaultSelfOptions()
        
        options.self = {
                -- column visibility
                ["columnVis"] = {       
                        ["name"] = true,
                        ["hits"] = true,
                        ["rage"] = false,
                        ["dam"] = true,
                        ["threat"] = true,
                        ["pc"] = true,
                },
                -- title bar string visibility
                ["stringVis"] = {       
                        ["threat"] = true,
                },
                -- if true, rows with 0 threat are not shown
                ["hideZeroRows"] = true,
                -- if true, values of at least 10,000 are abbreviate with "k"
                ["abbreviate"] = false,
                -- the column used to sort data rows
                ["sortColumn"] = "threat",
                -- if true, values increase towards the bottom of the table
                ["sortDown"] = true,
        };
        
        -- rage column
        local class;
        _, class = UnitClass("player");
        if ((class == "WARRIOR") or (class == "DRUID")) then
                options.self.columnVis.rage = true;
        end
end


------------------------------------------------------------------------------
-- Updates the visibility of columns the self table and the bottom bar. The
-- contents are not rendered here. The frame width is stored in sizes.self.x.
-- Should be called whenever the column visibility changes.
------------------------------------------------------------------------------
function KLHTM_UpdateSelfFrame()
        
        sizes.self.x = 0;
        
        for column, header in gui.self.head do
                -- header
                if (header.vis()) then
                        header.frame:SetWidth(header.width);
                        header.text:SetWidth(header.width);
                        sizes.self.x = sizes.self.x + header.width;
                        header.frame:Show();

                else
                        header.frame:Hide();
                        header.frame:SetWidth(0.1);
                end
                -- rows
                for index, row in gui.self.rows do
                        if (header.vis()) then
                                row[column].frame:SetWidth(header.width);
                                row[column].frame:Show();
                        else
                                row[column].frame:Hide();
                                row[column].frame:SetWidth(0.1);
                        end
                end
        end
        
        -- bottom bar
        for name, string in gui.self.bottom.string do
                if (gui.self.head[name].vis()) then
                        string.frame:SetWidth(gui.self.head[name].width);
                        string.frame:Show();
                else
                        string.frame:Hide();
                        string.frame:SetWidth(0.1);
                end
        end
        -- a dummy frame used to align the bottom bar strings with
        -- the Name header
        gui.self.bottom.reset.frame:SetWidth(gui.self.head.name.width);
                
        for _, row in gui.self.rows do
                row.frame:SetWidth(sizes.self.x);
        end
end


------------------------------------------------------------------------------
-- Draws the minimised title bar strings present in the self view.
------------------------------------------------------------------------------
function KLHTM_DrawSelfStrings()
        
        local threat = mod.table.mydata[mod.string.get("threatsource", "total")].threat;
        threat = math.floor(threat + 0.5);
        
        if (options.self.abbreviate) then
                threat = KLHTM_Abbreviate(threat);
        end
        
        gui.title.string.threat.text:SetText(threat);
end


-- used by GetSelfData(). Defined at the class level to reduce memory use.
local GetSelfData_data;
local GetSelfData_totals;
------------------------------------------------------------------------------
-- Makes a copy of the personal threat data in KLHTM_MyData for use by
-- KLHTM_DrawSelfFrame(). KLHTM_MyData contains some non-integers created
-- by the heroic strike approximations - these are rounded off.
------------------------------------------------------------------------------
function KLHTM_GetSelfData()
        
        local data = GetSelfData_data;
        local totals = GetSelfData_totals;

        if (data == nil) then
                data = {};
                totals = {};
                for x = 1, 20 do -- 20: needs to be large enough to fit all the threat sources
                                                 -- that can be added to mod.table.mydata
                        data[x] = {["name"] = "", ["dam"] = 0, ["hits"] = 0, ["rage"] = 0, ["threat"] = 0, ["pc"] = 0,};
                end
        end
        
        local totalData = mod.table.mydata[mod.string.get("threatsource", "total")];
        totals.hits = totalData.hits;
        totals.rage = math.floor(totalData.rage + 0.5); 
        -- nb different index names
        totals.dam = math.floor(totalData.damage + 0.5);
        totals.threat = math.floor(totalData.threat + 0.5); 
        
        -- copy the personal threat data
        local rowCount = 0;
        for ability, info in mod.table.mydata do
                
                -- omit "zero rows" if necessary
                if (not (options.self.hideZeroRows and (info.threat == 0))) then
                        if (ability ~= mod.string.get("threatsource", "total")) then
                                rowCount = rowCount + 1;
                                data[rowCount].name = ability;
                                data[rowCount].hits = info.hits;
                                data[rowCount].threat = math.floor(info.threat + 0.5); 
                                data[rowCount].dam = math.floor(info.damage + 0.5);
                                data[rowCount].rage = math.floor(info.rage + 0.5);
                                if (totals.threat == 0) then
                                        data[rowCount].pc = 0;
                                else
                                        data[rowCount].pc = math.floor(data[rowCount].threat / totals.threat * 100);
                                end
                        end
                end
        end
        table.setn(data, rowCount);
        
        return data, totals
end


------------------------------------------------------------------------------
-- Updates the personal threat details. If the frame is minimised, only a
-- brief call to KLHTM_DrawSelfStrings() is made. Otherwise a copy of
-- KLHTM_MyData is made, processed, and used to redraw all the strings in the
-- Self frame.
------------------------------------------------------------------------------
function KLHTM_DrawSelfFrame()
        
        if (state.min) then
                KLHTM_DrawSelfStrings();
                return;
        end
        
        local data, totals = KLHTM_GetSelfData();

        table.sort(data, KLHTM_CompareSelfRows);

        -- bar reference value
        local barRef;
        
        if (table.getn(data) == 0) then
                barRef = 0;
        elseif (options.self.sortDown) then
                -- set the largest value to 100%
                barRef = data[table.getn(data)][options.self.sortColumn];
        else
                barRef = data[1][options.self.sortColumn];
        end
                
        if ((barRef == nil) or (tonumber(barRef) == nil)) then 
                barRef = 0;
        else
                barRef = sizes.self.x / barRef;
        end

        local barColours = gui.self.head[options.self.sortColumn].colour;
        
        -- truncate excess rows
        if (table.getn(data) > Max_Rows) then
                table.setn(data, Max_Rows);
        end
        
        -- render the rows
        for row = 1, table.getn(data) do
                for index, value in data[row] do
                        if (options.self.abbreviate) then
                                gui.self.rows[row][index].text:SetText(KLHTM_Abbreviate(value));
                        else
                                gui.self.rows[row][index].text:SetText(value);
                        end
                end
                -- bars
                if ((barRef == 0) or (data[row][options.self.sortColumn] == 0)) then
                        gui.self.rows[row].bar:Hide();
                else
                        gui.self.rows[row].bar:SetWidth(data[row][options.self.sortColumn] * barRef);
                        gui.self.rows[row].bar:SetVertexColor(barColours.r, barColours.g, barColours.b);
                        gui.self.rows[row].bar:Show();
                end
                gui.self.rows[row].frame:Show();
        end
        
        -- bottom bar
        for index, string in gui.self.bottom.string do
                if (totals[index] == 0) then
                        string.text:SetText("");
                else
                        if (options.self.abbreviate) then
                                string.text:SetText(KLHTM_Abbreviate(totals[index]));
                        else
                                string.text:SetText(totals[index]);
                        end
                end
        end
        
        -- hide empty rows
        for row = table.getn(data) + 1, Max_Rows do
                gui.self.rows[row].frame:Hide();
        end
        
        -- resize the frame
        sizes.self.y = heights.header + heights.button + heights.data * table.getn(data);
        -- 5 * 2 insets. 1 title gap, 1 row gap, 1 bottom gap
        sizes.frame.y = sizes.self.y + sizes.title.y + 13; 
        gui.frame:SetHeight(sizes.frame.y);
end


------------------------------------------------------------------------------
-- Sorts two rows in the self data table according to the sorting options
------------------------------------------------------------------------------
function KLHTM_CompareSelfRows(row1, row2) 
        
        -- todo: confirm the sign of these comparisoms
        if (options.self.sortDown) then
                return row1[options.self.sortColumn] < row2[options.self.sortColumn];
        else
                return row1[options.self.sortColumn] > row2[options.self.sortColumn];
        end
end

        
------------------------------------------------------------------------------
-- Changes the column used to sort personal threat data
------------------------------------------------------------------------------
function KLHTM_SelfHeader_OnClick(name)
        
        if (name == nil) then
                if mod.out.checktrace("warning", me, "invalidargument") then
                        mod.out.printtrace(string.format("The argument '%s' to SelfHeader_OnClick is unrecognised.", tostring(name)));
                end

                return;
        end
                
        if (name == "pc") then
                -- due to a quirk in the way percent threat is calculated, sorting by threat
                -- should be done via the threat column (see DrawSelfFrame())
                name = "threat";
        end
        
        if (options.self.sortColumn == name) then
                options.self.sortDown = not options.self.sortDown;
        else
                options.self.sortColumn = name;
                options.self.sortDown = true;
        end
        
        KLHTM_Redraw(true);
end

------------------------------------------------------------------------------
-- Called when the used clicks a button in the self view
------------------------------------------------------------------------------
function KLHTM_SelfButton_OnClick(name)
        
        if (name == "reset") then
                mod.table.resetmytable();
                KLHTM_Redraw(true);
        else
                if mod.out.checktrace("warning", me, "invalidargument") then
                        mod.out.printtrace(string.format("The argument '%s' to SelfButton_OnClick is unrecognised.", tostring(name)));
                end
        end
end

Generated by GNU Enscript 1.6.5.90.