WoWInterface SVN DagAssist

[/] [branches/] [4.03/] [DagAssistConfig.lua] - Rev 6

Go to most recent revision | Compare with Previous | Blame | View Log

------------------------------------------------
--               DagAssistConfig               --
--             Dagos of Cenarius              --
------------------------------------------------

if (not DagAssist) then
        DagAssist = {};
end

--Set up the config frame
DagAssist.Config = CreateFrame("Frame", "DA_ConfigFrame", UIParent);
local fraConfig = DagAssist.Config;
fraConfig:EnableMouse(true);
fraConfig:RegisterForDrag("LeftButton");
fraConfig:SetToplevel(true);
fraConfig:SetMovable(true);
fraConfig:SetSize(384, 572);
fraConfig:SetPoint("TOPLEFT", UIParent, "TOPLEFT", 100, -100);
fraConfig:SetClampedToScreen(true);
fraConfig:Hide();

fraConfig.configBackdrop = {
        bgFile = "Interface\\Tooltips\\UI-Tooltip-Background",  
        edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border",
        tile = true,
        tileSize = 32,
        edgeSize = 13,
        insets = {left = 4, right = 4, top = 4, bottom = 4}
}
fraConfig:SetBackdrop(fraConfig.configBackdrop);
fraConfig:SetBackdropColor(0, 0, 0, 0.9);

fraConfig:SetScript("OnMouseDown", 
        function(self, event, ...)
                self:StartMoving();
        end
)

fraConfig:SetScript("OnMouseUp", 
        function(self, event, ...)
                self:StopMovingOrSizing();
        end
)

fraConfig.DagAssistLoaded = false;
fraConfig:SetScript("OnEvent",
        function(self, event, ...)
                if (event == "ADDON_LOADED") then
                        local name = ...;
                        if (name == "DagAssist") then
                                fraConfig.DagAssistLoaded = true;
                                
                                if (not DA_Vars) then
                                        DA_Vars = {};
                                end
                                if (not DA_Vars.Menu) then
                                        DA_Vars.Menu = DagAssist.LoadDefaultMenu();
                                end

                        end
                elseif (event == "PLAYER_ENTERING_WORLD") then
                        if (fraConfig.DagAssistLoaded) then
                                fraConfig:UnregisterEvent("PLAYER_ENTERING_WORLD");
                                DagAssistConfigLoadHeaders();
                        end
                end
        end
)
fraConfig:RegisterEvent("ADDON_LOADED");
fraConfig:RegisterEvent("PLAYER_ENTERING_WORLD");


--Title
fraConfig.lblTitle = fraConfig:CreateFontString(nil, "OVERLAY", "GameFontNormalLarge");
fraConfig.lblTitle:SetPoint("TOPLEFT", fraConfig, "TOPLEFT", 16, -16);
fraConfig.lblTitle:SetHeight(25);
fraConfig.lblTitle:SetText(GetAddOnMetadata("DagAssist", "title").." v"..GetAddOnMetadata("DagAssist", "version"));

-- Instructions 
fraConfig.lblInstructions = fraConfig:CreateFontString(nil, 'ARTWORK');
fraConfig.lblInstructions:SetFont("Fonts\\FRIZQT__.TTF", 10, nil);
fraConfig.lblInstructions:SetPoint("TOPLEFT", fraConfig.lblTitle, "BOTTOMLEFT", 5, -5);
fraConfig.lblInstructions:SetWidth(340);
fraConfig.lblInstructions:SetJustifyH("LEFT");
fraConfig.lblInstructions:SetText("Please drag abilities/items for the selected menu section to the action slots below.  "..
                                                                  "New sections can be created by typing in the New Section box and pressing Enter.");
fraConfig.lblInstructions:SetTextColor(1,1,1,1);

--Set up the group frame
DagAssist.SectionGroup = CreateFrame("Frame", "DA_ConfigFrame", fraConfig);
DagAssist.SectionGroup:EnableMouse(true);
DagAssist.SectionGroup:SetSize(344, 80);
DagAssist.SectionGroup:SetPoint("TOPLEFT", fraConfig, "TOPLEFT", 18, -80);
DagAssist.SectionGroup:SetBackdrop(fraConfig.configBackdrop);
DagAssist.SectionGroup:SetBackdropColor(1, 1, 1, 0.2);

--Header list
fraConfig.cboHeaders = CreateFrame("Frame", "DagAssistConfigHeaderList", fraConfig, "DA_Combobox");
fraConfig.cboHeaders:SetPoint("TOPLEFT", DagAssist.SectionGroup, "TOPLEFT", -5, -20)
function fraConfig.cboHeaders:OnClickEvent(selectedItem)
        DagAssistConfigSaveSection(fraConfig.cboHeaders.PreviousItem);
        DagAssistConfigLoadSection(selectedItem);
end

--Section label
fraConfig.lblMenuSection = DagAssist.SectionGroup:CreateFontString(nil, "OVERLAY", "GameFontHighlight");
fraConfig.lblMenuSection:SetPoint("BOTTOMLEFT", fraConfig.cboHeaders, "TOPLEFT", 18, 0);
fraConfig.lblMenuSection:SetHeight(15);
fraConfig.lblMenuSection:SetText("Section");
fraConfig.lblMenuSection:SetTextColor(1,1,0,1);

-- Move up button
fraConfig.btnMoveUp = CreateFrame("Button", "DagAssistConfigMoveUpButton", DagAssist.SectionGroup, "DA_Button2");
fraConfig.btnMoveUp:SetSize(55, 25);
fraConfig.btnMoveUp:SetPoint("TOPLEFT", fraConfig.cboHeaders, "TOPRIGHT", -15, 0);
fraConfig.btnMoveUp:SetText("Up");
fraConfig.btnMoveUp:SetScript("OnClick", 
        function(self, event, ...)
                if (DA_Vars.Menu) then
                        for index = 1, table.getn(DA_Vars.Menu) do
                                local sectionData = DA_Vars.Menu[index];
                                if (sectionData.Name == fraConfig.cboHeaders.SelectedItem) then
                                        if (index ~= 1) then
                                                table.remove(DA_Vars.Menu, index);
                                                table.insert(DA_Vars.Menu, index-1, sectionData);
                                                DagAssistConfigLoadHeaders(sectionData.Name);
                                        end
                                        return;
                                end
                        end
                end
        end
)

-- Move up button
fraConfig.btnMoveDown = CreateFrame("Button", "DagAssistConfigMoveDownButton", DagAssist.SectionGroup, "DA_Button2");
fraConfig.btnMoveDown:SetSize(55, 25);
fraConfig.btnMoveDown:SetPoint("TOPLEFT", fraConfig.btnMoveUp, "TOPRIGHT", 2, 0);
fraConfig.btnMoveDown:SetText("Down");
fraConfig.btnMoveDown:SetScript("OnClick", 
        function(self, event, ...)
                if (DA_Vars.Menu) then
                        for index = 1, table.getn(DA_Vars.Menu) do
                                local sectionData = DA_Vars.Menu[index];
                                if (sectionData.Name == fraConfig.cboHeaders.SelectedItem) then
                                        if (index ~= table.getn(DA_Vars.Menu)) then
                                                table.remove(DA_Vars.Menu, index);
                                                table.insert(DA_Vars.Menu, index+1, sectionData);
                                                DagAssistConfigLoadHeaders(sectionData.Name);
                                        end
                                        return;
                                end
                        end
                end
        end
)

--Delete button
fraConfig.btnDelete = CreateFrame("Button", "DagAssistConfigDeleteButton", DagAssist.SectionGroup, "DA_Button2");
fraConfig.btnDelete:SetSize(65, 25);
fraConfig.btnDelete:SetPoint("TOPLEFT", fraConfig.btnMoveDown, "TOPRIGHT", 2, 0);
fraConfig.btnDelete:SetText("Delete");
fraConfig.btnDelete:SetScript("OnClick", 
        function(self, event, ...)
                if (DA_Vars.Menu) then
                        if (table.getn(DA_Vars.Menu) == 1) then
                                return;
                        end
                        
                        for index = 1, table.getn(DA_Vars.Menu) do
                                local sectionData = DA_Vars.Menu[index];
                                if (sectionData.Name == fraConfig.cboHeaders.SelectedItem) then
                                        table.remove(DA_Vars.Menu, index);
                                        break;
                                end
                        end
                        DagAssistConfigLoadHeaders();
                end
        end
)

--New header editbox
fraConfig.txtNewHeader = CreateFrame("EditBox", "DagAssistConfigNewHeader", DagAssist.SectionGroup, "DA_Editbox");
fraConfig.txtNewHeader:SetSize(150, 25);
fraConfig.txtNewHeader:SetPoint("TOPLEFT", fraConfig.cboHeaders, "BOTTOMRIGHT", -45, 5);
fraConfig.txtNewHeader:SetAutoFocus(false);
function fraConfig.txtNewHeader:OnEnterEvent(editText)
        if (not DA_Vars.Menu) then
                DA_Vars.Menu = DagAssist.LoadDefaultMenu();
        end
        
        DagAssistConfigSaveSection(fraConfig.cboHeaders.SelectedItem);
        
        local newSection = {};
        newSection.Name = editText;
        newSection.Actions = {};
        table.insert(DA_Vars.Menu, newSection);
        
        DagAssistConfigLoadHeaders(editText);
        
        self:SetText("");
        self:ClearFocus();
end

--New section label
fraConfig.lblNewSection = DagAssist.SectionGroup:CreateFontString(nil, "OVERLAY", "GameFontHighlight");
fraConfig.lblNewSection:SetPoint("RIGHT", fraConfig.txtNewHeader, "LEFT", -5, 0);
fraConfig.lblNewSection:SetHeight(15);
fraConfig.lblNewSection:SetText("New Section");
fraConfig.lblNewSection:SetTextColor(1,1,0,1);

--Close button
fraConfig.btnClose = CreateFrame("Button", "DagAssistConfigDeleteButton", fraConfig, "DA_Button2");
fraConfig.btnClose:SetSize(35, 20);
fraConfig.btnClose:SetPoint("BOTTOMRIGHT", fraConfig, "BOTTOMRIGHT", -10, 10);
fraConfig.btnClose:SetText("OK");
fraConfig.btnClose:SetScript("OnClick", 
        function(self, event, ...)
                DagAssistConfigSaveSection(fraConfig.cboHeaders.SelectedItem);
                fraConfig:Hide();
                DagAssist:LoadMenu();
        end
)

--[[
--Hide minimap button
fraConfig.chkHideMinimap = CreateFrame("CheckButton", "DagAssistConfigHideMinimapButton", fraConfig, "ChatConfigCheckButtonTemplate");
fraConfig.chkHideMinimap:SetPoint("BOTTOMLEFT", fraConfig, "BOTTOMLEFT", 10, 10);

--Hide minimap button label
fraConfig.lblHideButton = fraConfig:CreateFontString(nil, "OVERLAY", "GameFontHighlight");
fraConfig.lblHideButton:SetPoint("LEFT", fraConfig.chkHideMinimap, "RIGHT", 0, 2);
fraConfig.lblHideButton:SetHeight(7);
fraConfig.lblHideButton:SetText("Hide minimap button");
--]]

function DagAssistRetrieveCursorItem(self, event, ...)
        if (InCombatLockdown() == 1) then
                return;
        end
        
        if (GetCursorInfo()) then
                local oldActionType, oldActionData, oldActionSubType;
                if (self.DA_ActionData) then
                        oldActionType = self.DA_ActionType;
                        oldActionData = self.DA_ActionData;
                        oldActionSubType = self.DA_ActionSubType;
                end
                
                local cursorType, cursorData, cursorSubType;
                cursorType, cursorData, cursorSubType = GetCursorInfo();
                ClearCursor();
                
                local itemName, itemID;
                if cursorType == "companion" then
                        _, itemName = GetCompanionInfo(cursorSubType, cursorData);
                        cursorData = itemName;
                        
                elseif cursorType == "item" then
                        _, link, _, _, _, _, _, _, _, itemTexture, _ = GetItemInfo(cursorData);
                        local _, _, parts = strsplit("|", link);
                        _, itemID = strsplit(":", parts);
                        cursorData = itemID;

                elseif cursorType == "spell" then
                        local link = GetSpellLink(cursorData, cursorSubType);
                        local _, _, parts = strsplit("|", link);
                        _, itemID = strsplit(":", parts);
                        cursorData = itemID;
                end
                
                DagAssistAssignConfigButtonAction(self, cursorType, cursorData, cursorSubType);
                
                if (oldActionData) then
                        DagAssistPickupAction(oldActionType, oldActionData, oldActionSubType);
                end
        end
end

function DagAssistAssignConfigButtonAction(self, actionType, actionData, actionSubType)
        --local itemTexture, itemName;
        
        local actionInfo = DagAssistGetActionInfo(actionType, actionData, actionSubType);
        
        self.DA_ActionType = actionType;
        self.DA_ActionSubType = actionSubType;
        self.DA_ActionData = actionData;
                
        if (actionInfo.Texture) then self.Icon:SetTexture(actionInfo.Texture); end
        if (actionInfo.Name) then
                self:SetText(actionInfo.Name);
        else
                self:SetText("nil");
        end     
end

function DagAssistGetActionInfo(actionType, actionData, actionSubType)
        local itemTexture, itemName;
        local ret = {};
        
        if actionType == "companion" then
                local companionID = DagAssistGetCompanionID(actionSubType, actionData)
                _, itemName, _, itemTexture, _ = GetCompanionInfo(actionSubType, companionID);
        elseif actionType == "equipmentset" then
                itemName = actionData;
                itemTexture, _ = GetEquipmentSetInfoByName(actionData);
                itemTexture = "Interface\\Icons\\"..itemTexture;
        elseif actionType == "item" then
                itemName, _, _, _, _, _, _, _, _, itemTexture, _ = GetItemInfo(actionData);
        elseif actionType == "macro" then
                itemName, itemTexture, _ = GetMacroInfo(actionData);
        elseif actionType == "spell" then
                itemName = GetSpellInfo(actionData);
                itemTexture = GetSpellTexture(itemName);
        end
        if (itemName) then
                ret.Name = itemName;
        end
        if (itemTexture) then
                ret.Texture = itemTexture;
        end
        
        return ret;
end

function DagAssistClearConfigButtonAction(self)
        self:SetText(nil);
        self.Icon:SetTexture(nil);
        self.DA_ActionType = nil;
        self.DA_ActionData = nil;
        self.DA_ActionSubType = nil;
end

function DagAssistPickupAction(actionType, actionData, actionSubType)
        if actionType == "companion" then
                local companionID = DagAssistGetCompanionID(actionSubType, actionData);
                PickupCompanion(actionSubType, companionID);
        elseif actionType == "equipmentset" then
                PickupEquipmentSetByName(actionData);
        elseif actionType == "item" then
                PickupItem(actionSubType);
        elseif actionType == "macro" then
                PickupMacro(actionData);
        elseif actionType == "spell" then
                PickupSpell(actionData);
        end
end

function DagAssistGetCompanionID(subType, name)
        local i = 1;
        local _, itemName = GetCompanionInfo(subType, i);
        
        while (itemName) do
                if (itemName == name) then
                        return i;
                end
                
                i = i + 1;
                _, itemName = GetCompanionInfo(subType, i);
        end
end


function DagAssistOnDragStart(self, event, ...)
        if (InCombatLockdown() == 1) then
                return;
        end
        
        local cursorType, cursorData, cursorSubType;
        if (GetCursorInfo()) then
                cursorType, cursorData, cursorSubType = GetCursorInfo();
                ClearCursor();
        end
        
        if (self.DA_ActionData) then
                DagAssistPickupAction(self.DA_ActionType, self.DA_ActionData, self.DA_ActionSubType);
                
                if (cursorData) then
                        DagAssistAssignConfigButtonAction(self, cursorType, cursorData, cursorSubType);
                else
                        DagAssistClearConfigButtonAction(self);
                end
        end
end


--Items label
fraConfig.lblMenuItems = fraConfig:CreateFontString(nil, "OVERLAY", "GameFontHighlight");
fraConfig.lblMenuItems:SetPoint("TOPLEFT", fraConfig, "TOPLEFT", 40, -165);
fraConfig.lblMenuItems:SetHeight(15);
fraConfig.lblMenuItems:SetText("Drag Actions Below");
fraConfig.lblMenuItems:SetTextColor(1,1,0,1);

--Menu items
fraConfig.previousMenuItem = nil;
fraConfig.configButtons = {};
for index = 1, 15 do
        local currentItem = CreateFrame("Button", "DagAssistMenuItem"..index, fraConfig, "DAConfig_MenuButtonTemplate");
        table.insert(fraConfig.configButtons, currentItem);
        currentItem:SetBackdropColor(1, 0, 0, 0.5);
        if (fraConfig.previousMenuItem) then
                currentItem:SetPoint("TOPLEFT", fraConfig.previousMenuItem, "BOTTOMLEFT");
        else
                currentItem:SetPoint("TOPLEFT", fraConfig, "TOPLEFT", 50, -185);
        end
        
        currentItem.Icon = currentItem:CreateTexture("DagAssistMenuItemIcon"..index, "OVERLAY");
        currentItem.Icon:SetSize(16, 16);
        currentItem.Icon:SetPoint("TOPLEFT", currentItem, "TOPLEFT", 2, -2);
        currentItem:RegisterForDrag("LeftButton");

        currentItem:SetScript("OnDragStart", DagAssistOnDragStart);
        currentItem:SetScript("OnReceiveDrag", DagAssistRetrieveCursorItem);
        currentItem:SetScript("OnClick", DagAssistRetrieveCursorItem);

        fraConfig.previousMenuItem = currentItem;
end

function DagAssistConfigSaveSection(section)
        --Save the displayed menu section
        
        --Find the correct menu section
        for index = 1, table.getn(DA_Vars.Menu) do 
                local sectionData = DA_Vars.Menu[index];
                if (sectionData.Name == section) then
                        sectionData.Actions = {};
                        
                        for actionIndex = 1, table.getn(fraConfig.configButtons) do 
                                local configButton = fraConfig.configButtons[actionIndex];
                                if (configButton.DA_ActionData) then
                                        local saveData = {};
                                        saveData.DA_ActionType = configButton.DA_ActionType;
                                        saveData.DA_ActionData = configButton.DA_ActionData;
                                        saveData.DA_ActionSubType = configButton.DA_ActionSubType;
                                        table.insert(sectionData.Actions, saveData);
                                end
                        end
                
                        break;
                end
        end
        
end

function DagAssistConfigLoadHeaders(selectedHeader)
        if (DA_Vars.Menu) then
                local headers = {};
                local selectedIndex = 1;
                
                for index = 1, table.getn(DA_Vars.Menu) do
                        local sectionData = DA_Vars.Menu[index];
                        
                        if (not selectedHeader) then
                                selectedHeader = sectionData.Name;
                        end
                        if (sectionData.Name == selectedHeader) then
                                selectedIndex = index;
                        end
                        
                        table.insert(headers, sectionData.Name);
                end
                fraConfig.cboHeaders.AddRange(headers);
                
                UIDropDownMenu_SetSelectedID(fraConfig.cboHeaders, selectedIndex);
                fraConfig.cboHeaders.PreviousItem = fraConfig.cboHeaders.SelectedItem;
                fraConfig.cboHeaders.SelectedItem = selectedHeader;

                DagAssistConfigLoadSection(selectedHeader);
        end
end

function DagAssistConfigLoadSection(section)
        if (DA_Vars.Menu) then
                for index = 1, table.getn(fraConfig.configButtons) do 
                        local configButton = fraConfig.configButtons[index];
                        DagAssistClearConfigButtonAction(configButton);
                end
                
                for index = 1, table.getn(DA_Vars.Menu) do 
                        local sectionData = DA_Vars.Menu[index];
                        if (sectionData.Name == section) then
                                if (sectionData.Actions) then
                                        for actionIndex = 1, table.getn(sectionData.Actions) do
                                                local configButton = fraConfig.configButtons[actionIndex];
                                                local saveData = sectionData.Actions[actionIndex];
                                                DagAssistAssignConfigButtonAction(configButton, saveData.DA_ActionType, saveData.DA_ActionData, saveData.DA_ActionSubType);
                                        end
                                end
                                break;
                        end
                end
        end
end
                
function DagAssistConfigFrame_Toggle()
        if ( DagAssist.Config:IsVisible() ) then
                DagAssistConfigSaveSection(fraConfig.cboHeaders.SelectedItem);
                DagAssist.Config:Hide();
        else
                DagAssist.Config:Show();
        end
end

Go to most recent revision | Compare with Previous | Blame