From 814cbb202b47ae328861e01fdc311d6f56460a99 Mon Sep 17 00:00:00 2001 From: Ahmil Jilani Date: Sun, 20 Nov 2011 07:39:00 -0500 Subject: [PATCH] 2.4 --- SuperDuperMacro/SDM-MainFrame-Left.tga | Bin 0 -> 524332 bytes SuperDuperMacro/SDM-MainFrame-Middle.tga | Bin 0 -> 524332 bytes SuperDuperMacro/SDM-MainFrame-Right.tga | Bin 0 -> 524332 bytes SuperDuperMacro/SuperDuperMacro.toc | 3 +- SuperDuperMacro/SuperDuperMacro_Core.lua | 78 +- SuperDuperMacro/SuperDuperMacro_Frames.lua | 680 ++++++++++++++--- SuperDuperMacro/SuperDuperMacro_Frames.xml | 986 ------------------------- SuperDuperMacro/SuperDuperMacro_Interface.lua | 142 ++-- SuperDuperMacro/SuperDuperMacro_Sharing.lua | 241 +++--- SuperDuperMacro/sdm Readme.txt | 8 +- 10 files changed, 850 insertions(+), 1288 deletions(-) create mode 100644 SuperDuperMacro/SDM-MainFrame-Left.tga create mode 100644 SuperDuperMacro/SDM-MainFrame-Middle.tga create mode 100644 SuperDuperMacro/SDM-MainFrame-Right.tga delete mode 100644 SuperDuperMacro/SuperDuperMacro_Frames.xml diff --git a/SuperDuperMacro/SDM-MainFrame-Left.tga b/SuperDuperMacro/SDM-MainFrame-Left.tga new file mode 100644 index 0000000000000000000000000000000000000000..3f9060c8014e48d07ae2b65de1aa8a197612808b GIT binary patch literal 524332 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 literal 0 HcmV?d00001 diff --git a/SuperDuperMacro/SDM-MainFrame-Middle.tga b/SuperDuperMacro/SDM-MainFrame-Middle.tga new file mode 100644 index 0000000000000000000000000000000000000000..6f50964567562d70f5de5322f2b7c5f929d5ee01 GIT binary patch literal 524332 zcmeI)JUGLvGU&q(8&hbV6>-zO9 z$MO4r{QjX_zJJWWXFHFV^}jj4rT<&w|3&Y=|0iRPt*rA~+b^rBr`H?#t?$1-EcbGe z$2$KtzjghW{@4CiKkxr>*7UBd^IgwZPiuQ0|Ll{~p?osVTlwVgKRF%BxcA9cGS;4F zj?;dB|KpE8KE1O1Y~1gq^__OI_j`%SPk#RM`3*>Y=quy;`=1}m+IRBk^SONgJl{RH zF`vvcb54C2YsS5d_mE|>UGLvGud%&$|LgkoEXVPSmoERUDvCAF?{t>*Q>7gQeX8t_TO<%N00se9QVF*e0(>1>G*zm ztNOyjvVLoS>+>&OW=-$P+TVI!{Z_rUH~#E@`Zkvb-+OTC<=Z?~WBV0Y`rhcXmv6b} zZ=sR@KgOiUfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= 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 D&T2T1 literal 0 HcmV?d00001 diff --git a/SuperDuperMacro/SuperDuperMacro.toc b/SuperDuperMacro/SuperDuperMacro.toc index 45c456f..8326c84 100644 --- a/SuperDuperMacro/SuperDuperMacro.toc +++ b/SuperDuperMacro/SuperDuperMacro.toc @@ -2,10 +2,9 @@ ## Title : Super Duper Macro ## Notes: Enables creation of incredibly long macros. ## Author: hypehuman -## Version: 2.3 +## Version: 2.4 ## SavedVariables: sdm_version, sdm_listFilters, sdm_iconSize, sdm_mainContents, sdm_macros SuperDuperMacro_Core.lua SuperDuperMacro_Interface.lua SuperDuperMacro_Sharing.lua -SuperDuperMacro_Frames.xml SuperDuperMacro_Frames.lua \ No newline at end of file diff --git a/SuperDuperMacro/SuperDuperMacro_Core.lua b/SuperDuperMacro/SuperDuperMacro_Core.lua index a0b0498..2196322 100644 --- a/SuperDuperMacro/SuperDuperMacro_Core.lua +++ b/SuperDuperMacro/SuperDuperMacro_Core.lua @@ -23,11 +23,11 @@ SLASH_SUPERDUPERMACRO1 = "/sdm"; sdm_eventFrame = CreateFrame("Frame") sdm_eventFrame:RegisterEvent("VARIABLES_LOADED") sdm_eventFrame:RegisterEvent("UPDATE_MACROS") -sdm_eventFrame:RegisterEvent("CHAT_MSG_ADDON") sdm_eventFrame:SetScript("OnEvent", function (self, event, ...) if event=="VARIABLES_LOADED" then local oldVersion = sdm_version sdm_version=GetAddOnMetadata("SuperDuperMacro", "Version") --the version of this addon + sdm_mainFrameTitle:SetText("Super Duper Macro "..sdm_version) sdm_eventFrame:UnregisterEvent(event) if (not sdm_macros) then sdm_macros={} --type tokens: "b": button macro. "f": floating macro. "s": scripts. "c": containers (folders) @@ -66,44 +66,47 @@ sdm_eventFrame:SetScript("OnEvent", function (self, event, ...) sdm_listFilters["true"]=true sdm_listFilters["false"]=true end - sdm_mainFrame_iconSizeSlider:SetValue(sdm_iconSize) - sdm_mainFrame_iconSizeSlider:SetScript("OnValueChanged", function(self) sdm_iconSize = self:GetValue() sdm_UpdateList() end) + sdm_iconSizeSlider:SetValue(sdm_iconSize) + sdm_iconSizeSlider:SetScript("OnValueChanged", function(self) sdm_iconSize = self:GetValue() sdm_UpdateList() end) sdm_SelectItem(nil) --We want to start with no macro selected elseif event=="UPDATE_MACROS" then - sdm_countUpdateMacrosEvents=sdm_countUpdateMacrosEvents+1 - if sdm_countUpdateMacrosEvents==2 then - sdm_eventFrame:UnregisterEvent(event) - local killOnSight = {} - local macrosToDelete = {} - local iIsPerCharacter=false - local thisID, mTab - for i=1,54 do --Check each macro to see if it's been orphaned by a previous installation of SDM. - if i==37 then iIsPerCharacter=true end - thisID = sdm_GetSdmID(i) - mTab = sdm_macros[thisID] - if thisID then --if the macro was created by SDM... - if killOnSight[thisID] then --if this ID is marked as kill-on-sight, kill it. - table.insert(macrosToDelete, i) - elseif (not mTab) or mTab.type~="b" or (not sdm_UsedByThisChar(mTab)) then --if this ID is not in use by this character as a button macro, kill it and mark this ID as KoS - table.insert(macrosToDelete, i) - killOnSight[thisID]=1 - elseif (mTab.characters~=nil)~=iIsPerCharacter then --if the macro is in the wrong spot based on perCharacter, kill it, but give it a chance to find one in the right spot. - table.insert(macrosToDelete, i) - else --This macro is good and should be here. Kill any duplicates. - killOnSight[thisID]=1 + if sdm_countUpdateMacrosEvents < 2 then + sdm_countUpdateMacrosEvents=sdm_countUpdateMacrosEvents+1 + if sdm_countUpdateMacrosEvents==2 then + local killOnSight = {} + local macrosToDelete = {} + local iIsPerCharacter=false + local thisID, mTab + for i=1,54 do --Check each macro to see if it's been orphaned by a previous installation of SDM. + if i==37 then iIsPerCharacter=true end + thisID = sdm_GetSdmID(i) + mTab = sdm_macros[thisID] + if thisID then --if the macro was created by SDM... + if killOnSight[thisID] then --if this ID is marked as kill-on-sight, kill it. + table.insert(macrosToDelete, i) + elseif (not mTab) or mTab.type~="b" or (not sdm_UsedByThisChar(mTab)) then --if this ID is not in use by this character as a button macro, kill it and mark this ID as KoS + table.insert(macrosToDelete, i) + killOnSight[thisID]=1 + elseif (mTab.characters~=nil)~=iIsPerCharacter then --if the macro is in the wrong spot based on perCharacter, kill it, but give it a chance to find one in the right spot. + table.insert(macrosToDelete, i) + else --This macro is good and should be here. Kill any duplicates. + killOnSight[thisID]=1 + end end end - end - for i=getn(macrosToDelete),1,-1 do -- we delete in descending order so that the indices don't get messed up while we're deleting, which would cause us to delete the wrong macros - print(sdm_printPrefix.."Deleting extraneous macro "..macrosToDelete[i]..": "..GetMacroInfo(macrosToDelete[i])) - DeleteMacro(macrosToDelete[i]) - end - for i,v in pairs(sdm_macros) do - if sdm_UsedByThisChar(sdm_macros[i]) then - sdm_SetUpMacro(sdm_macros[i]) + for i=getn(macrosToDelete),1,-1 do -- we delete in descending order so that the indices don't get messed up while we're deleting, which would cause us to delete the wrong macros + print(sdm_printPrefix.."Deleting extraneous macro "..macrosToDelete[i]..": "..GetMacroInfo(macrosToDelete[i])) + DeleteMacro(macrosToDelete[i]) + end + for i,v in pairs(sdm_macros) do + if sdm_UsedByThisChar(sdm_macros[i]) then + sdm_SetUpMacro(sdm_macros[i]) + end end end end + local numAccountMacros, numCharacterMacros = GetNumMacros() + sdm_macroLimitText:SetText("Global macros: "..numAccountMacros.."/36\nCharacter-specific macros: "..numCharacterMacros.."/18") elseif event=="ADDON_LOADED" then local addonName = ...; if addonName=="Blizzard_MacroUI" then @@ -118,7 +121,10 @@ sdm_eventFrame:SetScript("OnEvent", function (self, event, ...) sdm_doAfterCombat={} print(sdm_printPrefix.."Your macros are now up to date.") elseif event=="CHAT_MSG_ADDON" then - sdm_InterpretAddonMessage(...) + --print("debug:", event, ...) + if ... == sdm_msgPrefix then + sdm_InterpretAddonMessage(...) + end end end) @@ -303,7 +309,9 @@ function sdm_CheckCreationSafety(type, name, character) --returns the mTab of th print(sdm_printPrefix.."Invalid name") return false end - if (type=="b" or type=="f") and sdm_ContainsIllegalChars(name, true) then + if type=="c" then + return true + elseif (type=="b" or type=="f") and sdm_ContainsIllegalChars(name, true) then return false end if (not character) and GetMacroInfo(36) then @@ -345,7 +353,7 @@ function sdm_CreateNew(type, name, character) --returns the mTab of the new macr if sdm_receiving and sdm_receiving.text then mTab.text=sdm_receiving.text mTab.icon=sdm_receiving.icon - SendAddonMessage("SDM recDone", "", "WHISPER", sdm_receiving.playerName) + SendAddonMessage(sdm_msgPrefix, sdm_msgCommands.ReceivingDone, "WHISPER", sdm_receiving.playerName) -- let the sender know that we've saved the macro sdm_EndReceiving("|cff44ff00Saved|r") elseif sdm_saveAsText then mTab.text = sdm_saveAsText diff --git a/SuperDuperMacro/SuperDuperMacro_Frames.lua b/SuperDuperMacro/SuperDuperMacro_Frames.lua index 249d144..5a70d81 100644 --- a/SuperDuperMacro/SuperDuperMacro_Frames.lua +++ b/SuperDuperMacro/SuperDuperMacro_Frames.lua @@ -1,9 +1,28 @@ -local f +local f, fs, t ----------------------------------------- --[[ Creation of the main SDM window ]]-- ----------------------------------------- +f = CreateFrame("Frame", "sdm_mainFrame", UIParent) +f:Hide() +f:SetMovable(true) +f:SetSize(768,447) +f:ClearAllPoints() +f:SetPoint("TOPLEFT", 0, -104) +sdm_MakeDraggable(f) +f:SetScript("OnShow", function(self) + PlaySound "igCharacterInfoOpen" + sdm_UpdateList() +end) +f:SetScript("OnHide", function(self) + PlaySound "igCharacterInfoClose" + sdm_currentlyPlacing=nil + sdm_StopMove() + self:ClearAllPoints() + self:SetPoint("TOPLEFT", 0, -104) +end) + -- The following few lines are a bit weird, but they ensure that: -- (1) when the user presses escape, the SDM frame will hide, -- (2) when that happens, SDM will get a chance to show a dialog box, and @@ -14,132 +33,375 @@ hooksecurefunc("CloseSpecialWindows", function() sdm_Quit() end) +-- Artwork and text: + +t = f:CreateTexture("sdm_mainFramePortrait", "BACKGROUND") +t:SetTexture("Interface\\AddOns\\SuperDuperMacro\\SDM-Icon.tga") +t:SetWidth(60) +t:SetHeight(60) +t:SetPoint("TOPLEFT", 7,-6) + +t = f:CreateTexture("sdm_mainFrameLeft", "ARTWORK") +t:SetTexture("Interface\\AddOns\\SuperDuperMacro\\SDM-MainFrame-Left.tga") +t:SetWidth(256) +t:SetHeight(512) +t:SetPoint("TOPLEFT") + +t = f:CreateTexture("sdm_mainFrameMiddle", "ARTWORK") +t:SetTexture("Interface\\AddOns\\SuperDuperMacro\\SDM-MainFrame-Middle.tga") +t:SetWidth(256) -- The original Auction House frame uses 320 for this value. +t:SetHeight(512) +t:SetPoint("TOPLEFT", sdm_mainFrameLeft, "TOPRIGHT") + +t = f:CreateTexture("sdm_mainFrameRight", "ARTWORK") +t:SetTexture("Interface\\AddOns\\SuperDuperMacro\\SDM-MainFrame-Right.tga") +t:SetWidth(256) +t:SetHeight(512) +t:SetPoint("TOPLEFT", sdm_mainFrameMiddle, "TOPRIGHT") + +fs = f:CreateFontString("sdm_mainFrameTitle", "OVERLAY", "GameFontNormal") +fs:SetText("Super Duper Macro") -- this text will be reset when the version number is loaded +fs:SetPoint("TOP", 0,-18) + -- Red buttons: f = CreateFrame("Button", "sdm_quitButton", sdm_mainFrame, "UIPanelCloseButton") f:SetPoint("TOPRIGHT", 3, -8) f:SetScript("OnClick", function() sdm_Quit() end) -f = CreateFrame("Button", "sdm_aboutButton", sdm_mainFrame, "UIPanelButtonTemplate") -f:SetText("About SDM") -f:SetWidth(100) -f:SetHeight(19) -f:SetPoint("RIGHT", sdm_quitButton, "LEFT", 5,0) -f:SetScript("OnClick", sdm_About) - -f = CreateFrame("Button", "sdm_linkToMacroFrame", sdm_mainFrame, "UIPanelButtonTemplate") -f:SetText("Standard Macros") -f:SetWidth(125) -f:SetHeight(19) -f:SetPoint("TOPLEFT", 68,-14) +f = CreateFrame("Button", "sdm_linkToMacroFrame", sdm_mainFrame, "UIPanelCloseButton") +f:SetWidth(50) +f:SetHeight(50) +f:SetPoint("TOPLEFT", 296, -29) f:SetScript("OnClick", function() sdm_Quit(" ShowMacroFrame()") end) +t = f:CreateTexture() +t:SetDrawLayer("OVERLAY", 7) +t:SetPoint("CENTER", -1,0) +t:SetWidth(20) +t:SetHeight(20) +t:SetTexture("Interface\\MacroFrame\\MacroFrame-Icon") sdm_SetTooltip(f, "Show the default macro interface") f = CreateFrame("Button", "sdm_newButton", sdm_mainFrame, "UIPanelButtonTemplate") f:SetText("New") -f:SetWidth(80) +f:SetWidth(50) f:SetHeight(22) -f:SetPoint("TOPLEFT", 75, -42) +-- position will be set later f:SetScript("OnClick", sdm_NewButtonClicked) sdm_AddToExclusiveGroup(f, "centerwindows", true) -sdm_SetTooltip(f, "Create a new macro or script") +sdm_SetTooltip(f, "Create a new macro, script, or folder") f = CreateFrame("Button", "sdm_sendReceiveButton", sdm_mainFrame, "UIPanelButtonTemplate") -f:SetText("Send/Receive") -f:SetWidth(120) +f:SetText("Share >>") +f:SetWidth(75) f:SetHeight(22) -f:SetPoint("TOPLEFT", sdm_newButton, "TOPRIGHT") -f:SetScript("OnClick", function() sdm_sendReceiveFrame:Show() end) +f:SetPoint("BOTTOMRIGHT", -6, 27) +f:SetScript("OnClick", function() + if sdm_sendReceiveFrame:IsShown() then + sdm_sendReceiveFrame:Hide() + else + sdm_sendReceiveFrame:Show() + end +end) sdm_SetTooltip(f, "Share macros with your friends") f = CreateFrame("Button", "sdm_saveButton", sdm_mainFrame, "UIPanelButtonTemplate") f:SetText("Save") -f:SetWidth(80) +f:SetWidth(60) f:SetHeight(22) -f:SetPoint("BOTTOMRIGHT", -8,14) +f:SetPoint("BOTTOM", 0,38) +f:SetPoint("RIGHT", sdm_sendReceiveButton, "LEFT", -46,0) f:SetScript("OnClick", function() - sdm_Edit(sdm_macros[sdm_currentEdit], sdm_mainFrame_editScrollFrame_text:GetText()) + sdm_Edit(sdm_macros[sdm_currentEdit], sdm_bodyBox:GetText()) sdm_UpdateList() end) -f = CreateFrame("Button", "sdm_deleteButton", sdm_mainFrame, "UIPanelButtonTemplate") -f:SetText("Delete") -f:SetWidth(80) -f:SetHeight(22) -f:SetPoint("RIGHT", sdm_saveButton, "LEFT") -f:SetScript("OnClick", sdm_DeleteButtonClicked) - f = CreateFrame("Button", "sdm_usageButton", sdm_mainFrame, "UIPanelButtonTemplate") f:SetText("Usage...") -f:SetWidth(80) +f:SetWidth(75) f:SetHeight(22) -f:SetPoint("RIGHT", sdm_deleteButton, "LEFT") +f:SetPoint("RIGHT", sdm_saveButton, "LEFT") f:SetScript("OnClick", function() sdm_ShowUsage(sdm_macros[sdm_currentEdit]) end) +sdm_SetTooltip(f, "Click for instructions on how to use the selected item.") f = CreateFrame("Button", "sdm_changeIconButton", sdm_mainFrame, "UIPanelButtonTemplate") f:SetText("Change Name/Icon") -f:SetWidth(150) +f:SetWidth(140) f:SetHeight(22) f:SetPoint("RIGHT", sdm_usageButton, "LEFT") f:SetScript("OnClick", function() sdm_changeIconFrame:Show() end) sdm_AddToExclusiveGroup(f, "centerwindows", true) f = CreateFrame("Button", "sdm_saveAsButton", sdm_mainFrame, "UIPanelButtonTemplate") -f:SetPoint("TOPLEFT", sdm_saveButton, "BOTTOMLEFT") -f:SetPoint("RIGHT", sdm_saveButton) -f:SetHeight(sdm_saveButton:GetHeight()) +f:SetSize(80,22) +f:SetPoint("TOP", sdm_saveButton, "BOTTOM") +f:SetPoint("RIGHT", sdm_sendReceiveButton, "LEFT", -30,0) f:SetText("Save As...") f:SetScript("OnClick", sdm_SaveAsButtonClicked) sdm_SetTooltip(f, "Saves a copy of the current item. You may change the type, or make it global or character-specific.") -f = CreateFrame("Button", "$parent_downgradeButton", sdm_mainFrame, "UIPanelButtonTemplate") -f:SetPoint("TOPLEFT", sdm_deleteButton, "BOTTOMLEFT") -f:SetPoint("RIGHT", sdm_deleteButton) +f = CreateFrame("Button", "sdm_deleteButton", sdm_mainFrame, "UIPanelButtonTemplate") +f:SetText("Delete") +f:SetWidth(70) +f:SetHeight(22) +f:SetPoint("RIGHT", sdm_saveAsButton, "LEFT") +f:SetScript("OnClick", sdm_DeleteButtonClicked) + +f = CreateFrame("Button", "sdm_downgradeButton", sdm_mainFrame, "UIPanelButtonTemplate") +f:SetPoint("RIGHT", sdm_deleteButton, "LEFT") +f:SetSize(90,22) f:SetHeight(sdm_deleteButton:GetHeight()) f:SetText("Downgrade") f:SetScript("OnClick", sdm_DowngradeButtonClicked) sdm_SetTooltip(f, "Turns this macro into a default macro. Anything over 255 characters will be lost.") -f = CreateFrame("Button", "$parent_claimButton", sdm_mainFrame, "UIPanelButtonTemplate") -f:SetPoint("TOPLEFT", sdm_usageButton, "BOTTOMLEFT") -f:SetPoint("RIGHT", sdm_usageButton) +f = CreateFrame("Button", "sdm_claimButton", sdm_mainFrame, "UIPanelButtonTemplate") +f:SetPoint("RIGHT", sdm_downgradeButton, "LEFT") +f:SetSize(65,22) f:SetHeight(sdm_usageButton:GetHeight()) f:SetText("Claim") f:SetScript("OnClick", sdm_ClaimButtonClicked) sdm_SetTooltip(f, "Did you know that character-specific items can belong to multiple characters? Click this button to claim this item for your current character.") -f = CreateFrame("Button", "$parent_disownButton", sdm_mainFrame, "UIPanelButtonTemplate") -f:SetAllPoints(sdm_mainFrame_claimButton) +f = CreateFrame("Button", "sdm_disownButton", sdm_mainFrame, "UIPanelButtonTemplate") +f:SetAllPoints(sdm_claimButton) f:SetText("Disown") f:SetScript("OnClick", sdm_DisownButtonClicked) sdm_SetTooltip(f, "Removes this item from your current character's list. Other characters will still be able to use it.") -f = CreateFrame("Button", "sdm_newFolderButton", sdm_mainFrame, "UIPanelButtonTemplate") -f:SetText("New Folder") -f:SetWidth(100) -f:SetHeight(22) -f:SetPoint("RIGHT", sdm_usageButton, "LEFT", -304,0) +-- Edit box for macro body: + +f = CreateFrame("ScrollFrame", "sdm_bodyScroller", sdm_mainFrame, "UIPanelScrollFrameTemplate") +f:SetSize(417,304) +f:SetPoint("BOTTOMRIGHT", -32,64) + +f = CreateFrame("EditBox", "sdm_bodyBox") +f:SetMultiLine(true) +f:SetAutoFocus(false) +f:SetWidth(sdm_bodyScroller:GetWidth()) +f:SetHeight(20) -- automatically resizes if there based on the amount of text +f:SetScript("OnEscapePressed", function(self) self:ClearFocus() end) +f:SetScript("OnTabPressed", function(self) self:Insert(" ") end) +f:SetScript("OnTextSet", function() + sdm_saveButton:Disable() + sdm_textChanged=-2 +end) +f:SetScript("OnTextChanged", function() + if sdm_textChanged then + sdm_textChanged=sdm_textChanged+1 + if sdm_textChanged>0 then + sdm_saveButton:Enable() + end + end +end) +f:SetFontObject("GameFontHighlightSmall") +sdm_bodyScroller:SetScrollChild(f) + +f = CreateFrame("Button", "sdm_bodyBackground", sdm_mainFrame) +f:SetPoint("BOTTOMLEFT", sdm_bodyScroller, -5,-5) +f:SetPoint("TOPRIGHT", sdm_bodyScroller, 27,5) +f:SetBackdrop({ + edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border", + tile = true, + tileSize = 16, + edgeSize = 16 +}) f:SetScript("OnClick", function() - sdm_newFolderFrame:Show() - sdm_newFolderNameInput:SetFocus() + local e = sdm_bodyBox + local l = e:GetNumLetters() + e:SetCursorPosition(l) + e:SetFocus() end) -sdm_AddToExclusiveGroup(f, "centerwindows", true) -sdm_SetTooltip(sdm_mainFrame_iconSizeSlider, "Change the display size of the macros in the list above.") -sdm_SetTooltip(sdm_mainFrame_collapseAllButton, "Expand/collapse all folders") -sdm_SetTooltip(sdm_mainFrame_typeFilterDropdown, "Show/hide certain macros in the list") -sdm_SetTooltip(sdm_mainFrame_charFilterDropdown, "Show/hide certain macros in the list") +fs = f:CreateFontString("sdm_currentTitle", "OVERLAY", "SystemFont_Huge1") -- make this a layer of sdm_bodyBackground so that they show and hide together +fs:SetText("") +fs:SetWordWrap(true) +fs:SetPoint("BOTTOM", sdm_bodyBackground, "TOP") +fs:SetSize(403,40) +fs:SetJustifyH("CENTER") +fs:SetJustifyV("CENTER") + +fs = f:CreateFontString("sdm_containerInstructions", "OVERLAY", "GameFontNormal") +fs:SetText(sdm_containerInstructionsString) +fs:SetPoint("BOTTOMLEFT", 10,10) +fs:SetPoint("TOPRIGHT", -10,-10) + +-- Macro list: + +f = CreateFrame("ScrollFrame", "sdm_listScroller", sdm_mainFrame, "UIPanelScrollFrameTemplate") +f:SetWidth(268) +f:SetPoint("TOP", sdm_newButton, "BOTTOM", 0, -5) +f:SetPoint("BOTTOMLEFT", 20,50) + +f = CreateFrame("Frame", "sdm_macroList") +f:SetWidth(sdm_listScroller:GetWidth()) +f:SetHeight(50) -- automatically resizes based on the number of items in the list +sdm_listScroller:SetScrollChild(f) + +f = CreateFrame("Frame", "sdm_listBackground", sdm_mainFrame) +f:SetPoint("BOTTOMLEFT", sdm_listScroller, -5,-5) +f:SetPoint("TOPRIGHT", sdm_listScroller, 27,5) +f:SetBackdrop({ + edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border", + tile = true, + tileSize = 16, + edgeSize = 16 +}) + + +fs = f:CreateFontString("sdm_macroLimitText", "OVERLAY", "GameFontNormal") +fs:SetPoint("TOP", f, "BOTTOM") +fs:SetHeight(30) +fs:SetText("") + +f = CreateFrame("Frame", "sdm_macroLimitFrame", sdm_mainFrame) +f:SetAllPoints(sdm_macroLimitText) +sdm_SetTooltip(f, "This limit only applies to standard macros and Super Duper button macros. If you're running out of room, try storing some infrequently used Button Macros as Floating Macros using the 'Save As...' button. To do this with standard macros, you will have to upgrade them first.") + +-- List filters: + +fs = sdm_mainFrame:CreateFontString("sdm_filterText", "ARTWORK", "GameFontNormal") +fs:SetText("Filters:") +fs:SetPoint("TOPLEFT", 75, -44) + +f = CreateFrame("Frame", "sdm_typeFilterDropdown", sdm_mainFrame, "UIDropDownMenuTemplate") +f:EnableMouse(true) +f:SetPoint("LEFT", sdm_filterText, "RIGHT", -15,-3) +f:SetScript("OnShow", sdm_TypeDropdownLoaded) +sdm_SetTooltip(f, "Filter the list below") + +f = CreateFrame("Frame", "sdm_charFilterDropdown", sdm_mainFrame, "UIDropDownMenuTemplate") +f:EnableMouse(true) +f:SetPoint("LEFT", sdm_typeFilterDropdown, "RIGHT", -28,0) +f:SetScript("OnShow", sdm_CharDropdownLoaded) +sdm_SetTooltip(f, "Filter the list below") + +-- Button to expand/collapse all folders: + +f = CreateFrame("CheckButton", "sdm_collapseAllButton", sdm_mainFrame) +f:SetWidth(16) +f:SetHeight(16) +f:SetPoint("TOPLEFT", 23,-70) +f:SetPoint("TOP", sdm_typeFilterDropdown, "BOTTOM", 0,3) +f:SetNormalTexture("Interface\\Buttons\\UI-MinusButton-UP") +f:SetCheckedTexture("Interface\\Buttons\\UI-PlusButton-UP") +f:SetHighlightTexture("Interface\\Buttons\\UI-PlusButton-Hilight", "ADD") +f:SetNormalFontObject("GameFontNormal") +f:SetHighlightFontObject("GameFontHighlight") +f:SetText("All") +f:SetHitRectInsets(0, -20, 0, 0) -- this line extends the clickable area so that it covers the "All" text +f:SetScript("OnClick", sdm_CollapseAllButtonClicked) +sdm_SetTooltip(f, "Expand/collapse all folders") +fs = select(4, f:GetRegions()) +fs:SetPoint("LEFT", f, "RIGHT") + +-- List size slider: + +f = CreateFrame("Slider", "sdm_iconSizeSlider", sdm_mainFrame) +f:SetOrientation("HORIZONTAL") +f:EnableMouse(true) +f:SetMinMaxValues(11,64) +f:SetHeight(17) +f:SetWidth(141) +f:SetPoint("LEFT", sdm_collapseAllButton, "RIGHT", 35,0) +f:SetHitRectInsets(0,0,-10,-10) +f:SetBackdrop({ + 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 + } +}) +f:SetThumbTexture("Interface\\Buttons\\UI-SliderBar-Button-Horizontal") +sdm_SetTooltip(f, "Change the display size of the macros in the list above.") + +sdm_newButton:SetPoint("LEFT", sdm_iconSizeSlider, "RIGHT", 20,0) + +-------------------------------------------------- +--[[ Creation of the Change Name/Icon" window ]]-- +-------------------------------------------------- + +f = CreateFrame("Frame", "sdm_changeIconFrame", sdm_mainFrame, UIParent) +f:Hide() +f:SetToplevel(true) +f:SetSize(297,350) +f:SetPoint("CENTER", 70,0) +f:SetBackdrop({ + bgFile = "Interface\\DialogFrame\\UI-DialogBox-Background", + edgeFile = "Interface\\DialogFrame\\UI-DialogBox-Border", + tile = true, + tileSize = 32, + edgeSize = 32, + insets = { + left = 11, + right = 12, + top = 12, + bottom = 11 + } +}) +f:SetScript("OnShow", function(self) + sdm_OnShow_changeIconFrame(self, sdm_macros[sdm_currentEdit]) +end) +f:SetScript("OnHide", function(self) + sdm_OnHide_changeIconFrame(self) +end) +sdm_AddToExclusiveGroup(f, "centerwindows") +sdm_MakeDraggable(f) + +f = CreateFrame("EditBox", "sdm_changeNameInput", sdm_changeIconFrame, "InputBoxTemplate") +f:SetAutoFocus(false) +f:SetSize(200,26) +f:SetPoint("TOPLEFT", 70,-21) +f:SetScript("OnEscapePressed", function(self) self:ClearFocus() end) +f:SetScript("OnEnterPressed", sdm_ChangeIconOkayed) --- other stuff (to be copied from frames.xml) +fs = f:CreateFontString("sdm_changeNameInput_Text", "ARTWORK", "GameFontNormal") +fs:SetText("Name: ") +fs:SetPoint("RIGHT", f, "LEFT", -5,0) -------------------------------------------- --[[ Creation of the "New Macro" window ]]-- -------------------------------------------- +f = CreateFrame("Frame", "sdm_newFrame", sdm_mainFrame, UIParent) +f:SetFrameStrata("HIGH") +f:Hide() +f:SetWidth(280) +f:SetHeight(145) +f:SetPoint("CENTER", 70,0) +f:SetBackdrop({ + -- path to the background texture + bgFile = "Interface\\DialogFrame\\UI-DialogBox-Background", + -- path to the border texture + edgeFile = "Interface\\DialogFrame\\UI-DialogBox-Border", + -- true to repeat the background texture to fill the frame, false to scale it + tile = true, + -- size (width or height) of the square repeating background tiles (in pixels) + tileSize = 32, + -- thickness of edge segments and square size of edge corners (in pixels) + edgeSize = 32, + -- distance from the edges of the frame to those of the background texture (in pixels) + insets = { + left = 11, + right = 12, + top = 12, + bottom = 11 + } +}) +sdm_MakeDraggable(f) +f:SetScript("OnHide", function() UIFrameFlashStop(sdm_createMacroButton_flash) end) +sdm_AddToExclusiveGroup(f, "centerwindows") + -- Radio buttons: -function sdm_FancifyNewRadioButton(button, colorCode, text) - local fs = button:CreateFontString(nil, "ARTWORK", "GameFontNormal") +function sdm_FancifyNewRadioButton(button, text, colorCode) + fs = button:CreateFontString(button:GetName().."Text", "ARTWORK", "GameFontNormal") fs:SetPoint("LEFT", button, "RIGHT") fs:SetText(text) if colorCode then @@ -151,54 +413,36 @@ function sdm_FancifyNewRadioButton(button, colorCode, text) end end -f = CreateFrame("CheckButton", "sdm_buttonRadio", sdm_newFrame, "SendMailRadioButtonTemplate") +function sdm_CreateRadioButton(name, groupName, parent, below, text, colorCode) + local button = CreateFrame("CheckButton", name, parent, "SendMailRadioButtonTemplate") + sdm_AddToRadioGroup(button, groupName) + sdm_FancifyNewRadioButton(button, text, colorCode) + if below then + button:SetPoint("TOPLEFT", below, "BOTTOMLEFT") + end + return button +end + +f = sdm_CreateRadioButton("sdm_buttonRadio", "NewType", sdm_newFrame, nil, "Button Macro", "b") f:SetPoint("TOPLEFT", 15,-15) -f:SetScript("OnClick", function() - sdm_buttonRadio:SetChecked(1) - sdm_floatingRadio:SetChecked(nil) - sdm_scriptRadio:SetChecked(nil) -end) f:SetChecked(1) -sdm_FancifyNewRadioButton(f, "b", "Button Macro") sdm_SetTooltip(f, "Button macros can be placed on your action bars. However, you can only have a limited number of these. They can also be called with a slash command.") -f = CreateFrame("CheckButton", "sdm_floatingRadio", sdm_newFrame, "SendMailRadioButtonTemplate") -f:SetPoint("TOPLEFT", sdm_buttonRadio, "BOTTOMLEFT") -f:SetScript("OnClick", function() - sdm_buttonRadio:SetChecked(nil) - sdm_floatingRadio:SetChecked(1) - sdm_scriptRadio:SetChecked(nil) -end) -sdm_FancifyNewRadioButton(f, "f", "Floating Macro") +f = sdm_CreateRadioButton("sdm_floatingRadio", "NewType", sdm_newFrame, sdm_buttonRadio, "Floating Macro", "f") sdm_SetTooltip(f, "You can make as many floating macros as you like, but they cannot be placed on your action bars. They can called in other macros via a slash command.") -f = CreateFrame("CheckButton", "sdm_scriptRadio", sdm_newFrame, "SendMailRadioButtonTemplate") -f:SetPoint("TOPLEFT", sdm_floatingRadio, "BOTTOMLEFT") -f:SetScript("OnClick", function() - sdm_buttonRadio:SetChecked(nil) - sdm_floatingRadio:SetChecked(nil) - sdm_scriptRadio:SetChecked(1) -end) -sdm_FancifyNewRadioButton(f, "s", "Script") +f = sdm_CreateRadioButton("sdm_scriptRadio", "NewType", sdm_newFrame, sdm_floatingRadio, "Script", "s") sdm_SetTooltip(f, "Scripts are blocks of lua code. You can call these with a slash command or a function call.") -f = CreateFrame("CheckButton", "sdm_globalRadio", sdm_newFrame, "SendMailRadioButtonTemplate") +f = sdm_CreateRadioButton("sdm_folderRadio", "NewType", sdm_newFrame, sdm_scriptRadio, "Folder") +sdm_SetTooltip(f, "Folders can contain macros, scripts, or other folders. Alt-click on a folder for options and instructions.") + +f = sdm_CreateRadioButton("sdm_globalRadio", "NewChar", sdm_newFrame, nil, "Global") f:SetPoint("LEFT", sdm_buttonRadio, "RIGHT", 103,0) -f:SetScript("OnClick", function() - sdm_globalRadio:SetChecked(1) - sdm_charspecRadio:SetChecked(nil) -end) f:SetChecked(1) -sdm_FancifyNewRadioButton(f, nil, "Global") sdm_SetTooltip(f, "Selecting 'Global' will make this available to all characters.") -f = CreateFrame("CheckButton", "sdm_charspecRadio", sdm_newFrame, "SendMailRadioButtonTemplate") -f:SetPoint("TOPLEFT", sdm_globalRadio, "BOTTOMLEFT") -f:SetScript("OnClick", function() - sdm_globalRadio:SetChecked(nil) - sdm_charspecRadio:SetChecked(1) -end) -sdm_FancifyNewRadioButton(f, nil, "Character-specific") +f = sdm_CreateRadioButton("sdm_charspecRadio", "NewChar", sdm_newFrame, sdm_globalRadio, "Character-specific") sdm_SetTooltip(f, "Selecting 'Character-specific' will make this available only to select characters. Use the 'Claim' and 'Disown' buttons to enable or disable it for individual characters.") -- Text input box: @@ -207,12 +451,13 @@ f = CreateFrame("EditBox", "sdm_newMacroNameInput", sdm_newFrame, "InputBoxTempl f:SetAutoFocus(false) f:SetWidth(200) f:SetHeight(26) -f:SetPoint("TOPLEFT", sdm_scriptRadio, "BOTTOMLEFT", 50,0) -f:SetScript("OnEscapePressed", function() sdm_newMacroNameInput:ClearFocus() end) +f:SetPoint("TOPLEFT", sdm_folderRadio, "BOTTOMLEFT", 50,0) +f:SetScript("OnEscapePressed", function(self) self:ClearFocus() end) f:SetScript("OnEnterPressed", function() sdm_createMacroButton:Click() end) -local fs = f:CreateFontString(nil, "ARTWORK", "GameFontNormal") +fs = f:CreateFontString(sdm_newMacroNameText, "ARTWORK", "GameFontNormal") fs:SetPoint("RIGHT", f, "LEFT", -5,0) fs:SetText("Name: ") +sdm_SetTooltip(f, "Some characters (such as spaces) are not allowed in Super Duper macro names. If you would like spaces (or nothing) to show on the button text, use the 'Change Name/Icon' button after you have created the macro and select the 'Different name on button' option.") -- Red buttons: @@ -241,26 +486,234 @@ f:SetScript("OnClick", sdm_CancelNewMacroButtonPressed) --[[ Creation of the "Send/Receive" window ]]-- ----------------------------------------------- -sdm_SetTooltip(sdm_sendReceiveFrame_sendButton, "Make sure that your recipient clicks 'Receive' before you click 'Send'.") -sdm_SetTooltip(sdm_sendReceiveFrame_receiveButton, "Once you have received the macro, click the glowing 'Create' button to save it.") +f = CreateFrame("Frame", "sdm_sendReceiveFrame", sdm_mainFrame) +f:Hide() +f:SetWidth(256) +f:SetHeight(394) +f:SetPoint("LEFT", sdm_mainFrame, "RIGHT", -10,0) +f:SetBackdrop({ + bgFile = "Interface\\DialogFrame\\UI-DialogBox-Background", + edgeFile = "Interface\\DialogFrame\\UI-DialogBox-Border", + tile = true, + tileSize = 32, + edgeSize = 32, + insets = { + left = 11, + right = 12, + top = 12, + bottom = 11 + } +}) +f:SetScript("OnShow", function() + sdm_sendReceiveButton:SetText("Share <<") +end) +f:SetScript("OnHide", function() + sdm_sendReceiveButton:SetText("Share >>") + if (not sdm_sending) then + sdm_sendStatusBar:SetValue(0) + sdm_sendStatusBar_text:SetText("") + end + if (not sdm_receiving) then + sdm_receiveStatusBar:SetValue(0) + sdm_receiveStatusBar_text:SetText("") + end +end) +sdm_MakeDraggable(f) + +-- Frame text: + +fs = f:CreateFontString("sdm_sendInstructionText", "ARTWORK", "GameFontNormal") +fs:SetText("Send currently selected macro to:") +fs:SetPoint("LEFT", f, "TOPLEFT", 15,-20) + +fs = f:CreateFontString("sdm_receiveInstructionText", "ARTWORK", "GameFontNormal") +fs:SetText("Await a macro from:") +fs:SetPoint("TOPLEFT", sdm_sendInstructionText, "BOTTOMLEFT", 0,-206) + +-- Status bars: + +f = CreateFrame("Frame", "sdm_sendBarParent", sdm_sendReceiveFrame) +f:SetWidth(200) +f:SetHeight(30) +f:SetPoint("TOP", 0,-181) +f:SetBackdrop({ + bgFile = "Interface\\Tooltips\\UI-Tooltip-Background", + edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border", + tile = true, + tileSize = 32, + edgeSize = 8, + insets = { + left = 2, + right = 2, + top = 2, + bottom = 2 + } +}) +f:SetBackdropColor(0, 0, 0, 0.7) + +f = CreateFrame("StatusBar", "sdm_sendStatusBar", sdm_sendBarParent) +f:SetMinMaxValues(0,100) +f:SetValue(0) +f:SetPoint("BOTTOMLEFT", 5,5) +f:SetPoint("TOPRIGHT", -5,-5) +f:SetStatusBarTexture("Interface\\PaperDollInfoFrame\\UI-Character-Skills-Bar", "BACKGROUND") +f:SetStatusBarColor(0, 0.5, 1) +fs = f:CreateFontString("sdm_sendStatusBar_text", "ARTWORK", "GameFontNormal") +fs:SetText("") +fs:SetTextColor(1, 0.5, 0) +fs:SetPoint("CENTER") + +f = CreateFrame("Frame", "sdm_receiveBarParent", sdm_sendReceiveFrame) +f:SetWidth(200) +f:SetHeight(30) +f:SetPoint("TOP", 0,-351) +f:SetBackdrop({ + bgFile = "Interface\\Tooltips\\UI-Tooltip-Background", + edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border", + tile = true, + tileSize = 32, + edgeSize = 8, + insets = { + left = 2, + right = 2, + top = 2, + bottom = 2 + } +}) +f:SetBackdropColor(0, 0, 0, 0.7) + +f = CreateFrame("StatusBar", "sdm_receiveStatusBar", sdm_receiveBarParent) +f:SetMinMaxValues(0,100) +f:SetValue(0) +f:SetPoint("BOTTOMLEFT", 5,5) +f:SetPoint("TOPRIGHT", -5,-5) +f:SetStatusBarTexture("Interface\\PaperDollInfoFrame\\UI-Character-Skills-Bar", "BACKGROUND") +f:SetStatusBarColor(0, 0.5, 1) +fs = f:CreateFontString("sdm_receiveStatusBar_text", "ARTWORK", "GameFontNormal") +fs:SetText("") +fs:SetTextColor(1, 0.5, 0) +fs:SetPoint("CENTER") + +-- Radio buttons: + +f = sdm_CreateRadioButton("sdm_sendPartyRadio", "SendTo", sdm_sendReceiveFrame, nil, "Party") +f:SetPoint("TOPLEFT", sdm_sendInstructionText, "BOTTOMLEFT", 0,-4) +f:SetChecked(1) + +f = sdm_CreateRadioButton("sdm_sendRaidRadio", "SendTo", sdm_sendReceiveFrame, sdm_sendPartyRadio, "Raid") + +f = sdm_CreateRadioButton("sdm_sendBattlegroundRadio", "SendTo", sdm_sendReceiveFrame, sdm_sendRaidRadio, "Battleground") + +f = sdm_CreateRadioButton("sdm_sendGuildRadio", "SendTo", sdm_sendReceiveFrame, sdm_sendBattlegroundRadio, "Guild") + +f = sdm_CreateRadioButton("sdm_sendArbitraryRadio", "SendTo", sdm_sendReceiveFrame, sdm_sendGuildRadio, "A specific character:") + +f = sdm_CreateRadioButton("sdm_sendTargetRadio", "SendTo", sdm_sendReceiveFrame, nil, "Your current target") +f:SetPoint("TOPLEFT", sdm_sendArbitraryRadio, "BOTTOMLEFT", 0,-25) + +f = sdm_CreateRadioButton("sdm_receiveArbitraryRadio", "ReceiveFrom", sdm_sendReceiveFrame, nil, "A specific character:") +f:SetPoint("TOPLEFT", sdm_receiveInstructionText, "BOTTOMLEFT", 0,-4) +f:SetChecked(1) + +f = sdm_CreateRadioButton("sdm_receiveTargetRadio", "ReceiveFrom", sdm_sendReceiveFrame, nil, "Your current target") +f:SetPoint("TOPLEFT", sdm_receiveArbitraryRadio, "BOTTOMLEFT", 0,-25) + +f = sdm_CreateRadioButton("sdm_receiveAnyoneRadio", "ReceiveFrom", sdm_sendReceiveFrame, sdm_receiveTargetRadio, "Anyone") + +-- Input boxes: + +local boxWidth = 180 +local boxHeight = 26 +local boxOffset = 32 + +f = CreateFrame("EditBox", "sdm_sendInput", sdm_sendReceiveFrame, "InputBoxTemplate") +f:SetAutoFocus(false) +f:SetWidth(boxWidth) +f:SetHeight(boxHeight) +f:SetPoint("TOPLEFT", sdm_sendArbitraryRadio, "BOTTOMLEFT", boxOffset,0) +f:SetScript("OnEscapePressed", function(self) self:ClearFocus() end) +f:SetScript("OnEnterPressed", function() sdm_sendButton:Click() end) +f:SetScript("OnEditFocusGained", function() + if not sdm_sendArbitraryRadio:GetChecked() then + sdm_sendArbitraryRadio:Click() + end +end) + +f = CreateFrame("EditBox", "sdm_receiveInput", sdm_sendReceiveFrame, "InputBoxTemplate") +f:SetAutoFocus(false) +f:SetWidth(boxWidth) +f:SetHeight(boxHeight) +f:SetPoint("TOPLEFT", sdm_receiveArbitraryRadio, "BOTTOMLEFT", boxOffset,0) +f:SetScript("OnEscapePressed", function(self) self:ClearFocus() end) +f:SetScript("OnEnterPressed", function() sdm_sendButton:Click() end) +f:SetScript("OnEditFocusGained", function() + if not sdm_receiveArbitraryRadio:GetChecked() then + sdm_receiveArbitraryRadio:Click() + end +end) + +-- Red buttons: + +f = CreateFrame("Button", "sdm_quitSendReceiveButton", sdm_sendReceiveFrame, "UIPanelCloseButton") +f:SetPoint("TOPRIGHT", -3,-3) +f:SetScript("OnClick", function() sdm_sendReceiveFrame:Hide() end) + +local buttonOver = 38 +local buttonUp = 30 +local buttonWidth = 60 +local buttonHeight = 24 + +f = CreateFrame("Button", "sdm_sendButton", sdm_sendReceiveFrame, "UIPanelButtonTemplate") +f:SetText("Send") +f:SetWidth(buttonWidth) +f:SetHeight(buttonHeight) +f:SetPoint("CENTER", sdm_sendBarParent, "CENTER", -buttonOver, buttonUp) +f:SetScript("OnClick", sdm_SendButtonClicked) +sdm_SetTooltip(f, "Make sure that your recipient clicks 'Receive' before you click 'Send'.") + +f = CreateFrame("Button", "sdm_cancelSendButton", sdm_sendReceiveFrame, "UIPanelButtonTemplate") +f:SetText("Cancel") +f:SetWidth(buttonWidth) +f:SetHeight(buttonHeight) +f:SetPoint("CENTER", sdm_sendBarParent, "CENTER", buttonOver, buttonUp) +f:SetScript("OnClick", sdm_CancelSend) +f:Disable() + +f = CreateFrame("Button", "sdm_receiveButton", sdm_sendReceiveFrame, "UIPanelButtonTemplate") +f:SetText("Receive") +f:SetWidth(buttonWidth) +f:SetHeight(buttonHeight) +f:SetPoint("CENTER", sdm_receiveBarParent, "CENTER", -buttonOver, buttonUp) +f:SetScript("OnClick", sdm_ReceiveButtonClicked) +sdm_SetTooltip(f, "Once you have received the macro, click the glowing 'Create' button to save it.") +sdm_AddToExclusiveGroup(f, "centerwindows", true) + +f = CreateFrame("Button", "sdm_cancelReceiveButton", sdm_sendReceiveFrame, "UIPanelButtonTemplate") +f:SetText("Cancel") +f:SetWidth(buttonWidth) +f:SetHeight(buttonHeight) +f:SetPoint("CENTER", sdm_receiveBarParent, "CENTER", buttonOver, buttonUp) +f:SetScript("OnClick", sdm_CancelReceive) +f:Disable() --------------------------------------------------------- --[[ Buttons that we add to the default macro window ]]-- --------------------------------------------------------- function sdm_CreateDefaultMacroFrameButtons() - local f - --Create the button that links from the default macro frame to the SDM frame - f = CreateFrame("Button", "$parent_linkToSDM", MacroFrame, "UIPanelButtonTemplate") - f:SetWidth(150) - f:SetHeight(19) - f:SetPoint("TOPLEFT", 68, -14) - f:SetText("Super Duper Macro") + f = CreateFrame("Button", "$parent_linkToSDM", MacroFrame, "UIPanelCloseButton") + f:SetAllPoints(sdm_linkToMacroFrame) f:SetScript("OnClick", function() HideUIPanel(MacroFrame) - sdm_mainFrame:Show() + sdm_mainFrame:Show() end) + t = f:CreateTexture() + t:SetDrawLayer("OVERLAY", 7) + t:SetPoint("CENTER", -1,0) + t:SetWidth(20) + t:SetHeight(20) + t:SetTexture("Interface\\AddOns\\SuperDuperMacro\\SDM-Icon.tga") sdm_SetTooltip(f, "Open Super Duper Macro, an advanced macro interface that lets you create longer macros") --Create the button that turns a regular macro into a Super Duper macro @@ -268,20 +721,15 @@ function sdm_CreateDefaultMacroFrameButtons() f:SetPoint("TOPLEFT", MacroDeleteButton, "TOPRIGHT") f:SetPoint("BOTTOMRIGHT", MacroNewButton, "BOTTOMLEFT") f:SetText("Upgrade! ") - local t = f:CreateTexture() + t = f:CreateTexture() + t:SetDrawLayer("OVERLAY", 7) margin = 0.25 * f:GetHeight() t:SetPoint("TOPRIGHT", f, "TOPRIGHT", -margin, -margin) t:SetPoint("BOTTOM", f, "BOTTOM", 0, margin) t:SetWidth(t:GetHeight()) t:SetTexture("Interface\\AddOns\\SuperDuperMacro\\SDM-Icon.tga") - local t2 = f:CreateTexture(nil, "OVERLAY") - t2:SetTexture(t:GetTexture()) - t2:SetAllPoints(t) - local t3 = f:CreateTexture(nil, "HIGHLIGHT") - t3:SetTexture(t:GetTexture()) - t3:SetAllPoints(t) f:SetScript("OnClick", sdm_UpgradeButtonClicked) - sdm_SetTooltip(f, "Turn the current macro into a Super Duper Macro, allowing you to make it longer") + sdm_SetTooltip(f, "Turn the selected macro into a Super Duper Macro, allowing you to make it longer") -- The following three frames are only showed when SDM's "Change Name/Icon" button is clicked. Clicking this button hijack's the default MacroPopupFrame and modifies it to our needs. diff --git a/SuperDuperMacro/SuperDuperMacro_Frames.xml b/SuperDuperMacro/SuperDuperMacro_Frames.xml deleted file mode 100644 index 622f9de..0000000 --- a/SuperDuperMacro/SuperDuperMacro_Frames.xml +++ /dev/null @@ -1,986 +0,0 @@ - - - - - self.TimeSinceLastUpdate=0 - - sdm_OnUpdate(self, elapsed); - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - sdm_CharDropdownLoaded(self); - - - - - - - - - - - - - - - - - - - - - - - - - - - sdm_TypeDropdownLoaded(self); - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - self:ClearFocus() - - - self:Insert(" ") - - - sdm_saveButton:Disable() - sdm_textChanged=-2 - - - if sdm_textChanged then - sdm_textChanged=sdm_textChanged+1 - if sdm_textChanged>0 then - sdm_saveButton:Enable() - end - end - - - - - - - - - - - - - - - - - - - - - - - - self:SetBackdropBorderColor(TOOLTIP_DEFAULT_COLOR.r, TOOLTIP_DEFAULT_COLOR.g, TOOLTIP_DEFAULT_COLOR.b) - self:SetBackdropColor(TOOLTIP_DEFAULT_BACKGROUND_COLOR.r, TOOLTIP_DEFAULT_BACKGROUND_COLOR.g, TOOLTIP_DEFAULT_BACKGROUND_COLOR.b) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - sdm_StartMove(); - sdm_StopMove(); - sdm_StopMove(); - - PlaySound "igCharacterInfoOpen" - self:SetPoint("TOPLEFT", "UIParent", "TOPLEFT", 0, -104) - sdm_currentlyPlacing=nil - sdm_UpdateList() - - - PlaySound "igCharacterInfoClose"; - sdm_StopMove() - - - - - - - - - - - - - - - - - - - - - - - - - sdm_StartMove(); - sdm_StopMove(); - sdm_StopMove(); - - sdm_AddToExclusiveGroup(self, "centerwindows") - - - UIFrameFlashStop(sdm_createMacroButton_flash) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - self:ClearFocus() - - - sdm_createFolderButton:Click() - - - - - - - - sdm_StartMove(); - sdm_StopMove(); - sdm_StopMove(); - - sdm_AddToExclusiveGroup(self, "centerwindows") - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - self:ClearFocus() - - - sdm_ChangeIconOkayed() - - - - - - - sdm_AddToExclusiveGroup(self, "centerwindows") - - - sdm_OnShow_changeIconFrame(self, sdm_macros[sdm_currentEdit]) - - - sdm_OnHide_changeIconFrame(self) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - self:SetChecked(1) - - - self:SetChecked(1) - sdm_sendReceiveFrame_sendRaidRadio:SetChecked(nil) - sdm_sendReceiveFrame_sendBattlegroundRadio:SetChecked(nil) - sdm_sendReceiveFrame_sendGuildRadio:SetChecked(nil) - sdm_sendReceiveFrame_sendTargetRadio:SetChecked(nil) - sdm_sendReceiveFrame_sendArbitraryRadio:SetChecked(nil) - sdm_sendReceiveFrame_sendInput:ClearFocus() - - - - - - - - - - - - - - - - - - - - sdm_sendReceiveFrame_sendPartyRadio:SetChecked(nil) - self:SetChecked(1) - sdm_sendReceiveFrame_sendBattlegroundRadio:SetChecked(nil) - sdm_sendReceiveFrame_sendGuildRadio:SetChecked(nil) - sdm_sendReceiveFrame_sendTargetRadio:SetChecked(nil) - sdm_sendReceiveFrame_sendArbitraryRadio:SetChecked(nil) - sdm_sendReceiveFrame_sendInput:ClearFocus() - - - - - - - - - - - - - - - - - - - - sdm_sendReceiveFrame_sendPartyRadio:SetChecked(nil) - sdm_sendReceiveFrame_sendRaidRadio:SetChecked(nil) - self:SetChecked(1) - sdm_sendReceiveFrame_sendGuildRadio:SetChecked(nil) - sdm_sendReceiveFrame_sendTargetRadio:SetChecked(nil) - sdm_sendReceiveFrame_sendArbitraryRadio:SetChecked(nil) - sdm_sendReceiveFrame_sendInput:ClearFocus() - - - - - - - - - - - - - - - - - - - - sdm_sendReceiveFrame_sendPartyRadio:SetChecked(nil) - sdm_sendReceiveFrame_sendRaidRadio:SetChecked(nil) - sdm_sendReceiveFrame_sendBattlegroundRadio:SetChecked(nil) - self:SetChecked(1) - sdm_sendReceiveFrame_sendTargetRadio:SetChecked(nil) - sdm_sendReceiveFrame_sendArbitraryRadio:SetChecked(nil) - sdm_sendReceiveFrame_sendInput:ClearFocus() - - - - - - - - - - - - - - - - - - - - sdm_sendReceiveFrame_sendPartyRadio:SetChecked(nil) - sdm_sendReceiveFrame_sendRaidRadio:SetChecked(nil) - sdm_sendReceiveFrame_sendBattlegroundRadio:SetChecked(nil) - sdm_sendReceiveFrame_sendGuildRadio:SetChecked(nil) - self:SetChecked(1) - sdm_sendReceiveFrame_sendArbitraryRadio:SetChecked(nil) - sdm_sendReceiveFrame_sendInput:ClearFocus() - - - - - - - - - - - - - - - - - - - - sdm_sendReceiveFrame_sendInput:SetFocus() - - - - - - - - - - - - - - - self:ClearFocus() - - - sdm_sendReceiveFrame_sendButton:Click() - - - sdm_sendReceiveFrame_sendPartyRadio:SetChecked(nil) - sdm_sendReceiveFrame_sendRaidRadio:SetChecked(nil) - sdm_sendReceiveFrame_sendBattlegroundRadio:SetChecked(nil) - sdm_sendReceiveFrame_sendGuildRadio:SetChecked(nil) - sdm_sendReceiveFrame_sendTargetRadio:SetChecked(nil) - sdm_sendReceiveFrame_sendArbitraryRadio:SetChecked(1) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - self:SetChecked(1) - - - self:SetChecked(1) - sdm_sendReceiveFrame_receiveArbitraryRadio:SetChecked(nil) - sdm_sendReceiveFrame_receiveInput:ClearFocus() - - - - - - - - - - - - - - - - - - - - sdm_sendReceiveFrame_receiveInput:SetFocus() - - - - - - - - - - - - - - - self:ClearFocus() - - - sdm_sendReceiveFrame_receiveButton:Click() - - - sdm_sendReceiveFrame_receiveTargetRadio:SetChecked(nil) - sdm_sendReceiveFrame_receiveArbitraryRadio:SetChecked(1) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - sdm_StartMove(); - sdm_StopMove(); - sdm_StopMove(); - - if (not sdm_sending) then - sdm_sendReceiveFrame_sendBar_statusBar:SetValue(0) - sdm_sendReceiveFrame_sendBar_statusBar_text:SetText("") - end - if (not sdm_receiving) then - sdm_sendReceiveFrame_receiveBar_statusBar:SetValue(0) - sdm_sendReceiveFrame_receiveBar_statusBar_text:SetText("") - end - - - - \ No newline at end of file diff --git a/SuperDuperMacro/SuperDuperMacro_Interface.lua b/SuperDuperMacro/SuperDuperMacro_Interface.lua index 603483e..7a7ae5b 100644 --- a/SuperDuperMacro/SuperDuperMacro_Interface.lua +++ b/SuperDuperMacro/SuperDuperMacro_Interface.lua @@ -59,12 +59,12 @@ function sdm_FilterButtonClicked(self, _, _, on) end function sdm_NewButtonClicked() - sdm_SaveConfirmationBox("sdm_SelectItem(nil) sdm_newFrame:Show() sdm_newMacroNameInput:SetFocus()") + sdm_SaveConfirmationBox("sdm_newFrame:Show() sdm_newMacroNameInput:SetFocus()") end function sdm_SaveAsButtonClicked() local saved = sdm_macros[sdm_currentEdit] - sdm_saveAsText = sdm_mainFrame_editScrollFrame_text:GetText() -- we'll save this text into the new one, but leave the old one unsaved. + sdm_saveAsText = sdm_bodyBox:GetText() -- we'll save this text into the new one, but leave the old one unsaved. sdm_saveAsIcon = saved.icon sdm_newFrame:Show() sdm_newMacroNameInput:SetFocus() @@ -196,37 +196,37 @@ function sdm_SelectItem(newCurrentEdit) sdm_deleteButton:Disable() sdm_usageButton:Disable() sdm_changeIconButton:Disable() - sdm_mainFrame_editScrollFrame:Hide() + sdm_bodyScroller:Hide() sdm_saveButton:Disable() sdm_saveAsButton:Disable() - sdm_mainFrame_downgradeButton:Disable() - sdm_sendReceiveFrame_sendButton:Disable() + sdm_downgradeButton:Disable() + sdm_sendButton:Disable() sdm_containerInstructions:Hide() else - sdm_mainFrame_editScrollFrame_text:ClearFocus() + sdm_bodyBox:ClearFocus() sdm_deleteButton:Enable() sdm_changeIconButton:Enable() if mTab.type=="c" then - sdm_mainFrame_editScrollFrame:Hide() + sdm_bodyScroller:Hide() sdm_containerInstructions:Show() sdm_usageButton:Disable() sdm_saveAsButton:Disable() - sdm_sendReceiveFrame_sendButton:Disable() + sdm_sendButton:Disable() else if not sdm_sending then - sdm_sendReceiveFrame_sendButton:Enable() + sdm_sendButton:Enable() end - sdm_mainFrame_editScrollFrame:Show() + sdm_bodyScroller:Show() sdm_containerInstructions:Hide() sdm_usageButton:Enable() sdm_saveAsButton:Enable() if mTab.type=="b" and sdm_UsedByThisChar(mTab) then - sdm_mainFrame_downgradeButton:Enable() + sdm_downgradeButton:Enable() else - sdm_mainFrame_downgradeButton:Disable() + sdm_downgradeButton:Disable() end end - sdm_mainFrame_editScrollFrame_text:SetText(mTab.text or "") + sdm_bodyBox:SetText(mTab.text or "") sdm_saveButton:Disable() end sdm_UpdateClaimDisownButtons() @@ -237,18 +237,18 @@ end function sdm_UpdateClaimDisownButtons() local mTab = sdm_macros[sdm_currentEdit] if mTab and mTab.characters then - sdm_mainFrame_claimButton:Enable() - sdm_mainFrame_disownButton:Enable() + sdm_claimButton:Enable() + sdm_disownButton:Enable() else - sdm_mainFrame_claimButton:Disable() - sdm_mainFrame_disownButton:Disable() + sdm_claimButton:Disable() + sdm_disownButton:Disable() end if sdm_UsedByThisChar(mTab) then - sdm_mainFrame_claimButton:Hide() - sdm_mainFrame_disownButton:Show() + sdm_claimButton:Hide() + sdm_disownButton:Show() else - sdm_mainFrame_claimButton:Show() - sdm_mainFrame_disownButton:Hide() + sdm_claimButton:Show() + sdm_disownButton:Hide() end end @@ -383,7 +383,7 @@ function sdm_UpdateList() listItem = table.remove(sdm_unusedListItems[isContainer],1) if not listItem then --create the listItem - listItem = CreateFrame("Button", CreateListItemFrameName(), sdm_mainFrame_macrosScroll_macroList) + listItem = CreateFrame("Button", CreateListItemFrameName(), sdm_macroList) listItem.icon = listItem:CreateTexture(nil, "OVERLAY") listItem.text = listItem:CreateFontString(nil,"ARTWORK","GameFontNormal") listItem.text:SetJustifyH("LEFT") @@ -758,17 +758,17 @@ function sdm_thawEditFrame() end function sdm_SaveConfirmationBox(postponed) - if (not sdm_currentEdit) or sdm_macros[sdm_currentEdit].type=="c" or sdm_macros[sdm_currentEdit].text==sdm_mainFrame_editScrollFrame_text:GetText() then + if (not sdm_currentEdit) or sdm_macros[sdm_currentEdit].type=="c" or sdm_macros[sdm_currentEdit].text==sdm_bodyBox:GetText() then RunScript(postponed) else - sdm_mainFrame_editScrollFrame_text:ClearFocus() + sdm_bodyBox:ClearFocus() StaticPopupDialogs["SDM_CONFIRM"] = { text = "Do you want to save your changes to "..sdm_currentTitle:GetText().."?", button1 = "Save", --left button button3 = "Don't Save", --middle button button2 = "Cancel", -- right button OnAccept = function() - sdm_Edit(sdm_macros[sdm_currentEdit], sdm_mainFrame_editScrollFrame_text:GetText()) + sdm_Edit(sdm_macros[sdm_currentEdit], sdm_bodyBox:GetText()) RunScript(postponed) end, --button1 (left) OnAlt = function() @@ -805,7 +805,7 @@ function sdm_PickupMacro(ID) end function sdm_Quit(append) - local scriptOnQuit = "sdm_mainFrame:Hide() sdm_changeIconFrame:Hide() sdm_newFolderFrame:Hide()" + local scriptOnQuit = "sdm_mainFrame:Hide() sdm_changeIconFrame:Hide()" if (not sdm_receiving) then scriptOnQuit = scriptOnQuit.." sdm_newFrame:Hide()" if (not sdm_sending) then @@ -818,21 +818,66 @@ function sdm_Quit(append) sdm_SaveConfirmationBox(scriptOnQuit) end +function sdm_AddToRadioGroup(button, groupName) + sdm_radioGroups = sdm_radioGroups or {} + local group = sdm_radioGroups[groupName] + if not group then + sdm_radioGroups[groupName] = {} + group = sdm_radioGroups[groupName] + end + tinsert(group, button) + button.radioGroupName = groupName + button:SetScript("OnClick", sdm_RadioButtonClicked) +end + +function sdm_RadioButtonClicked(button) + local group = sdm_radioGroups[button.radioGroupName] + for _,b in pairs(group) do + b:SetChecked(nil) + end + button:SetChecked(1) + + if button.radioGroupName == "NewType" then + for _,b in pairs(sdm_radioGroups.NewChar) do + if button == sdm_folderRadio then + b:Hide() + else + b:Show() + end + end + + elseif button.radioGroupName == "SendTo" then + if button == sdm_sendArbitraryRadio then + sdm_sendInput:SetFocus() + else + sdm_sendInput:ClearFocus() + end + elseif button.radioGroupName == "ReceiveFrom" then + if button == sdm_receiveArbitraryRadio then + sdm_receiveInput:SetFocus() + else + sdm_receiveInput:ClearFocus() + end + end +end + function sdm_CreateMacroButtonClicked() local name = sdm_newMacroNameInput:GetText() + local character + if sdm_charspecRadio:GetChecked() then + character = sdm_thisChar + end - local type = nil + local type if sdm_buttonRadio:GetChecked() then type="b" elseif sdm_floatingRadio:GetChecked() then type="f" elseif sdm_scriptRadio:GetChecked() then type="s" - end - - local character - if sdm_charspecRadio:GetChecked() then - character = sdm_thisChar + elseif sdm_folderRadio:GetChecked() then + type="c" + character = nil end if sdm_CheckCreationSafety(type, name, character) then @@ -842,16 +887,7 @@ function sdm_CreateMacroButtonClicked() end end -function sdm_CreateFolderButtonClicked() - local name = sdm_newFolderNameInput:GetText() - if name=="" then - return - end - sdm_newFolderFrame:Hide() - sdm_CreateNew("c", name) - sdm_UpdateList() -end - +-- When any non-button frame in a given group is opened, all buttons in that group are disabled. function sdm_AddToExclusiveGroup(f, group, isButton) --f is the frame, group is a key, button is a boolean that tells if it's a button or a window sdm_exclusiveGroups = sdm_exclusiveGroups or {} --contains groups of mutually exclusive frames if not sdm_exclusiveGroups[group] then @@ -867,7 +903,7 @@ function sdm_AddToExclusiveGroup(f, group, isButton) --f is the frame, group is end end -function sdm_ExclusiveWindowShown(f) --when a window in the group is shown, disable all buttons in the group. +function sdm_ExclusiveWindowShown(f) --when a window in the group is shown, disable all buttons in the group, remembering which ones were disabled local t = sdm_exclusiveGroups[f.exclusiveGroupKey] t.isEnabled={} for _,button in pairs(t.buttons) do @@ -881,19 +917,23 @@ function sdm_ExclusiveWindowShown(f) --when a window in the group is shown, disa end end -function sdm_ExclusiveWindowHidden(f) --reenable the buttons. +function sdm_ExclusiveWindowHidden(f) --reenable the buttons local t = sdm_exclusiveGroups[f.exclusiveGroupKey] - for _,button in pairs(t.buttons) do - if t.isEnabled[button] then - button:Enable() - end + for button in pairs(t.isEnabled) do + button:Enable() end - t.isEnabled=nil if f.exclusiveGroupKey=="centerwindows" then sdm_listLocked = false end end +function sdm_MakeDraggable(f) + f:EnableMouse(true) + f:RegisterForDrag("LeftButton") + f:SetScript("OnDragStart", sdm_StartMove) + f:SetScript("OnDragStop", sdm_StopMove) +end + function sdm_StartMove() if not sdm_mainFrameIsMoving then sdm_mainFrameIsMoving = true @@ -910,7 +950,7 @@ end function sdm_DefaultMacroFrameLoaded() sdm_macroUILoaded=true - select(6, MacroFrame:GetRegions()):SetPoint("TOP",MacroFrame, "TOP", 76, -17) -- Move the text "Create Macros" 76 units to the right. + --select(6, MacroFrame:GetRegions()):SetPoint("TOP",MacroFrame, "TOP", 76, -17) -- Move the text "Create Macros" 76 units to the right. sdm_CreateDefaultMacroFrameButtons() @@ -959,7 +999,7 @@ else end sdm_unusedListItems={} sdm_listItems,sdm_unusedListItems[true],sdm_unusedListItems[false]={},{},{} -sdm_listItemPrefix = "sdm_mainFrame_macrosScroll_macroList_listItem" +sdm_listItemPrefix = "sdm_macroListItem" sdm_containerInstructionsString = [[ Left-click on a folder to open or close it. diff --git a/SuperDuperMacro/SuperDuperMacro_Sharing.lua b/SuperDuperMacro/SuperDuperMacro_Sharing.lua index db52f16..d9b6977 100644 --- a/SuperDuperMacro/SuperDuperMacro_Sharing.lua +++ b/SuperDuperMacro/SuperDuperMacro_Sharing.lua @@ -1,13 +1,60 @@ +sdm_msgPrefix = "SupDupMac" +sdm_msgPrefixLength = string.len(sdm_msgPrefix) +sdm_msgCommandLength = 1 +sdm_msgLengthLimit = 254 +sdm_msgCommands = { + SendFirst = "1", -- I'm sending you the first part of a macro + SendMore = "2", -- I'm sending you more of the macro + SendFailed = "3", -- I failed to send you the macro + Receiving = "4", -- I just received the first part of your macro + ReceivingDone = "5", -- I just saved the macro that you sent me + ReceivingFailed = "6", -- I failed to receive your macro +} + +function sdm_OnUpdate(self, elapsed) --used for sending macros + self.TimeSinceLastUpdate = self.TimeSinceLastUpdate + elapsed + if self.TimeSinceLastUpdate > sdm_updateInterval then + if sdm_sending.i == 2 then + sdm_sending.command = sdm_msgCommands.SendMore + end + SendAddonMessage(sdm_msgPrefix, sdm_sending.command..sdm_sending.lines[sdm_sending.i], sdm_sending.channel, sdm_sending.target) + sdm_sendStatusBar:SetValue(sdm_sending.i) + sdm_sending.i = sdm_sending.i+1 + if sdm_sending.i>sdm_sending.numLines then + sdm_EndSending("|cff44ff00Sent to "..(sdm_sending.target or sdm_sending.channel).."|r") + end + self.TimeSinceLastUpdate = 0 + end +end + +function sdm_RegisterMessages() + sdm_eventFrame:RegisterEvent("CHAT_MSG_ADDON") + local success = RegisterAddonMessagePrefix(sdm_msgPrefix) + if not success then + print(sdm_printPrefix.."You have too many addon prefixes registered. SDM will not be able to send or receive macros.") + end +end + +-- create an invisible frame that is used to measure time +local f = CreateFrame("Frame", "sdm_updateFrame", UIParent) +f:Hide() +f:SetScript("OnShow", function(self) + self.TimeSinceLastUpdate = 0 +end) +f:SetScript("OnUpdate", sdm_OnUpdate) + function sdm_SendMacro(mTab, chan, tar) if sdm_sending then print(sdm_printPrefix.."You are already sending something.") return end + print(sdm_printPrefix.."Sending to the following people (if nobody is listed, then nobody is waiting):") + sdm_RegisterMessages() local perCharacter=nil --make the string that will be split up and sent. It consists of a bunch of values separated by commas. They are, in order: the version the sender is running, the minimum version the receiver must have, the type of macro, the index of the icon, the perCharacter status ("" or "nil"), the length of the name, the length of the text, the name, and the text. There is no comma between the name and the text. local textToSend = sdm_version..","..sdm_minVersion..","..mTab.type..","..tostring(mTab.icon)..","..tostring(mTab.characters)..","..mTab.name:len()..","..mTab.text:len()..","..mTab.name..mTab.text - local pref = "SDM send1" -- if the prefix ends in "send1", it's the first line. If it ends in "send2", it's any line after the first. - local lineLen = 254 - pref:len() + local comm = sdm_msgCommands.SendFirst -- if the command is SendFirst, it's the first part. If it's SendMore, it's any part after the first. + local lineLen = sdm_msgLengthLimit - sdm_msgPrefixLength - sdm_msgCommandLength local linesToSend={} local pos = 1 while pos <= textToSend:len() do @@ -20,54 +67,38 @@ function sdm_SendMacro(mTab, chan, tar) numLines = getn(linesToSend), channel = chan, target = tar, - prefix = pref + command = comm } - sdm_sendReceiveFrame_sendBar_statusBar:SetMinMaxValues(0, sdm_sending.numLines) - sdm_sendReceiveFrame_sendBar_statusBar:SetValue(0) - sdm_sendReceiveFrame_sendBar_statusBar_text:SetText("|cffffccffSending to "..(sdm_sending.target or sdm_sending.channel).."|r") - sdm_sendReceiveFrame_cancelSendButton:Enable() - sdm_sendReceiveFrame_sendButton:Disable() - sdm_sendReceiveFrame_sendPartyRadio:Disable() - sdm_sendReceiveFrame_sendRaidRadio:Disable() - sdm_sendReceiveFrame_sendBattlegroundRadio:Disable() - sdm_sendReceiveFrame_sendGuildRadio:Disable() - sdm_sendReceiveFrame_sendTargetRadio:Disable() - sdm_sendReceiveFrame_sendArbitraryRadio:Disable() - sdm_sendReceiveFrame_sendInput:EnableMouse(nil) + sdm_sendStatusBar:SetMinMaxValues(0, sdm_sending.numLines) + sdm_sendStatusBar:SetValue(0) + sdm_sendStatusBar_text:SetText("|cffffccffSending to "..(sdm_sending.target or sdm_sending.channel).."|r") + sdm_cancelSendButton:Enable() + sdm_sendButton:Disable() + sdm_sendPartyRadio:Disable() + sdm_sendRaidRadio:Disable() + sdm_sendBattlegroundRadio:Disable() + sdm_sendGuildRadio:Disable() + sdm_sendTargetRadio:Disable() + sdm_sendArbitraryRadio:Disable() + sdm_sendInput:EnableMouse(nil) sdm_updateFrame:Show() end -function sdm_OnUpdate(self, elapsed) --used for sending macros - self.TimeSinceLastUpdate = self.TimeSinceLastUpdate + elapsed - if self.TimeSinceLastUpdate > sdm_updateInterval then - if sdm_sending.i == 2 then - sdm_sending.prefix="SDM send2" - end - SendAddonMessage(sdm_sending.prefix, sdm_sending.lines[sdm_sending.i], sdm_sending.channel, sdm_sending.target) - sdm_sendReceiveFrame_sendBar_statusBar:SetValue(sdm_sending.i) - sdm_sending.i = sdm_sending.i+1 - if sdm_sending.i>sdm_sending.numLines then - sdm_EndSending("|cff44ff00Sent to "..(sdm_sending.target or sdm_sending.channel).."|r") - end - self.TimeSinceLastUpdate = 0 - end -end - function sdm_EndSending(text) sdm_updateFrame:Hide() - sdm_sendReceiveFrame_sendBar_statusBar_text:SetText(text) + sdm_sendStatusBar_text:SetText(text) sdm_sending=nil - sdm_sendReceiveFrame_cancelSendButton:Disable() + sdm_cancelSendButton:Disable() if sdm_currentEdit then - sdm_sendReceiveFrame_sendButton:Enable() + sdm_sendButton:Enable() end - sdm_sendReceiveFrame_sendPartyRadio:Enable() - sdm_sendReceiveFrame_sendRaidRadio:Enable() - sdm_sendReceiveFrame_sendBattlegroundRadio:Enable() - sdm_sendReceiveFrame_sendGuildRadio:Enable() - sdm_sendReceiveFrame_sendTargetRadio:Enable() - sdm_sendReceiveFrame_sendArbitraryRadio:Enable() - sdm_sendReceiveFrame_sendInput:EnableMouse(1) + sdm_sendPartyRadio:Enable() + sdm_sendRaidRadio:Enable() + sdm_sendBattlegroundRadio:Enable() + sdm_sendGuildRadio:Enable() + sdm_sendTargetRadio:Enable() + sdm_sendArbitraryRadio:Enable() + sdm_sendInput:EnableMouse(1) end function sdm_WaitForMacro(name) @@ -75,14 +106,16 @@ function sdm_WaitForMacro(name) print(sdm_printPrefix.."You are already receiving or waiting.") return end + sdm_RegisterMessages() sdm_receiving = {playerName=name, first=true} - sdm_sendReceiveFrame_receiveBar_statusBar:SetValue(0) - sdm_sendReceiveFrame_receiveBar_statusBar_text:SetText("|cffffccffWaiting for "..sdm_receiving.playerName.."|r") - sdm_sendReceiveFrame_cancelReceiveButton:Enable() - sdm_sendReceiveFrame_receiveButton:Disable() - sdm_sendReceiveFrame_receiveTargetRadio:Disable() - sdm_sendReceiveFrame_receiveArbitraryRadio:Disable() - sdm_sendReceiveFrame_receiveInput:EnableMouse(nil) + sdm_receiveStatusBar:SetValue(0) + sdm_receiveStatusBar_text:SetText("|cffffccffWaiting for "..sdm_receiving.playerName.."|r") + sdm_cancelReceiveButton:Enable() + sdm_receiveButton:Disable() + sdm_receiveTargetRadio:Disable() + sdm_receiveArbitraryRadio:Disable() + sdm_receiveAnyoneRadio:Disable() + sdm_receiveInput:EnableMouse(nil) sdm_SelectItem(nil) sdm_newFrame:Show() sdm_newMacroNameInput:ClearFocus() @@ -99,31 +132,42 @@ function sdm_WaitForMacro(name) end function sdm_InterpretAddonMessage(...) - local arg1, arg2, arg3, arg4 = ... - if arg4~=sdm_thisChar.name and arg1:sub(1,17)=="SDM" then - local txt=arg1:sub(18) - if sdm_receiving and arg4:upper()==sdm_receiving.playerName:upper() and (not sdm_receiving.text) then - if txt==" send1" then - sdm_ReceiveLine(arg2, true) - elseif txt==" send2" then - sdm_ReceiveLine(arg2, false) - elseif txt==" sendFailed" then - print(sdm_printPrefix..""..arg4.." failed to send the macro. Reason: "..arg2) - sdm_EndReceiving("|cffff0000Failed|r") - end - elseif txt==" receiving" then - print(sdm_printPrefix.."Sending macro to "..arg4.."...") - elseif txt==" recDone" then - print(sdm_printPrefix..""..arg4.." has accepted your macro.") - elseif txt==" recFailed" then --"SDM recFailed","reason,version" - local version, reason = sdm_SplitString(arg2, ",", 1) - print(sdm_printPrefix..""..arg4.." did not receive your macro. Reason: "..reason) + --print("debug: interpreting") + local prefix, message, _, sender = ... + if prefix ~= sdm_msgPrefix or sender==sdm_thisChar.name then + return + end + local command = message:sub(1,1) + local txt=message:sub(2) + if sdm_receiving and not sdm_receiving.text then + if sdm_receiving.playerName == "" and command == sdm_msgCommands.SendFirst then + sdm_receiving.playerName = sender end + if sender:upper() ~= sdm_receiving.playerName:upper() then + return + end + if command == sdm_msgCommands.SendFirst then -- this is the first part of the macro (also contains data such as name and type) + sdm_ReceiveLine(txt, true) + elseif command == sdm_msgCommands.SendMore then -- this is some part other than the first + sdm_ReceiveLine(txt, false) + elseif command == sdm_msgCommands.SendFailed then -- this is a reason why the sender failed to send us the macro + print(sdm_printPrefix..sender.." failed to send the macro. Reason: "..txt) + sdm_EndReceiving("|cffff0000Failed|r") + end + elseif command == sdm_msgCommands.Receiving then + print(sdm_printPrefix..sender.." has begun to receive your macro...") + elseif command == sdm_msgCommands.ReceivingDone then -- the target has finished receiving + print(sdm_printPrefix..sender.." has accepted your macro.") + elseif command == sdm_msgCommands.ReceivingFailed then -- this is a reason why the recipient failed to receive our macro + local version, reason = sdm_SplitString(txt, ",", 1) + print(sdm_printPrefix..sender.." did not receive your macro. Reason: "..reason) end end function sdm_ReceiveLine(line, send1) + --print("debug: in recline") if sdm_receiving.first and send1 then --this is the first line + --print("debug: is firstline") sdm_receiving.nameAndText, sdm_receiving.textLen, sdm_receiving.playerNameLen, sdm_receiving.perCharacter, sdm_receiving.icon, sdm_receiving.type, sdm_receiving.minVersion, sdm_receiving.sendersVersion = sdm_SplitString(line, ",", 7) sdm_receiving.perCharacter = (sdm_receiving.perCharacter~="nil") if sdm_receiving.icon=="nil" then @@ -134,15 +178,15 @@ function sdm_ReceiveLine(line, send1) sdm_receiving.textLen = 0 + sdm_receiving.textLen sdm_receiving.playerNameLen = 0 + sdm_receiving.playerNameLen sdm_receiving.first = false - sdm_sendReceiveFrame_receiveBar_statusBar:SetMinMaxValues(0, sdm_receiving.playerNameLen + sdm_receiving.textLen) - sdm_sendReceiveFrame_receiveBar_statusBar_text:SetText("|cffffccffReceiving|r") + sdm_receiveStatusBar:SetMinMaxValues(0, sdm_receiving.playerNameLen + sdm_receiving.textLen) + sdm_receiveStatusBar_text:SetText("|cffffccffReceiving|r") if sdm_CompareVersions(sdm_receiving.sendersVersion, sdm_minVersion)==2 or sdm_CompareVersions(sdm_version, sdm_receiving.minVersion)==2 then print(sdm_printPrefix.."You failed to recieve the macro due to a version incompatibility.") - SendAddonMessage("SDM recFailed", "Incompatible Versions,"..sdm_version, "WHISPER", sdm_receiving.playerName) + SendAddonMessage(sdm_msgPrefix, sdm_msgCommands.ReceivingFailed.."Incompatible Versions,"..sdm_version, "WHISPER", sdm_receiving.playerName) sdm_EndReceiving("|cffff0000Failed|r") return else - SendAddonMessage("SDM receiving", sdm_version, "WHISPER", sdm_receiving.playerName) + SendAddonMessage(sdm_msgPrefix, sdm_msgCommands.Receiving..sdm_version, "WHISPER", sdm_receiving.playerName) end elseif (not sdm_receiving.first) and (not send1) then sdm_receiving.nameAndText = sdm_receiving.nameAndText..line @@ -150,9 +194,9 @@ function sdm_ReceiveLine(line, send1) return end local currLen = sdm_receiving.nameAndText:len() - sdm_sendReceiveFrame_receiveBar_statusBar:SetValue(currLen) + sdm_receiveStatusBar:SetValue(currLen) if currLen == (sdm_receiving.playerNameLen + sdm_receiving.textLen) then - sdm_sendReceiveFrame_receiveBar_statusBar_text:SetText("|cffff9900Click \"Create\" to save|r") + sdm_receiveStatusBar_text:SetText("|cffff9900Click \"Create\" to save|r") UIFrameFlash(sdm_createMacroButton_flash, 0.5, 0.5, 1e6, false) sdm_newMacroNameInput:EnableMouse(1) sdm_buttonRadio:Enable() @@ -180,13 +224,14 @@ function sdm_ReceiveLine(line, send1) end function sdm_EndReceiving(text) - sdm_sendReceiveFrame_receiveBar_statusBar_text:SetText(text) - sdm_sendReceiveFrame_cancelReceiveButton:Disable() - sdm_sendReceiveFrame_receiveButton:Enable() + sdm_receiveStatusBar_text:SetText(text) + sdm_cancelReceiveButton:Disable() + sdm_receiveButton:Enable() sdm_newButton:Enable() - sdm_sendReceiveFrame_receiveTargetRadio:Enable() - sdm_sendReceiveFrame_receiveArbitraryRadio:Enable() - sdm_sendReceiveFrame_receiveInput:EnableMouse(1) + sdm_receiveTargetRadio:Enable() + sdm_receiveArbitraryRadio:Enable() + sdm_receiveAnyoneRadio:Enable() + sdm_receiveInput:EnableMouse(1) sdm_newMacroNameInput:SetText("") sdm_newMacroNameInput:EnableMouse(1) sdm_buttonRadio:Enable() @@ -199,12 +244,14 @@ function sdm_EndReceiving(text) end function sdm_CancelSend() - SendAddonMessage("SDM sendFailed", "Cancelled", sdm_sending.channel, sdm_sending.target) + SendAddonMessage(sdm_msgPrefix, sdm_msgCommands.SendFailed.."Cancelled", sdm_sending.channel, sdm_sending.target) sdm_EndSending("|cffff0000Cancelled|r") end function sdm_CancelReceive() - SendAddonMessage("SDM recFailed", "Cancelled,"..sdm_version, "WHISPER", sdm_receiving.playerName) + if sdm_receiving.playerName~="" then + SendAddonMessage(sdm_msgPrefix, sdm_msgCommands.ReceivingFailed.."Cancelled,"..sdm_version, "WHISPER", sdm_receiving.playerName) + end sdm_EndReceiving("|cffff0000Cancelled|r") sdm_newFrame:Hide() end @@ -223,51 +270,53 @@ end function sdm_SendButtonClicked() local channel local target - if sdm_sendReceiveFrame_sendPartyRadio:GetChecked() then + if sdm_sendPartyRadio:GetChecked() then channel="PARTY" - elseif sdm_sendReceiveFrame_sendRaidRadio:GetChecked() then + elseif sdm_sendRaidRadio:GetChecked() then channel="RAID" - elseif sdm_sendReceiveFrame_sendBattlegroundRadio:GetChecked() then + elseif sdm_sendBattlegroundRadio:GetChecked() then channel="BATTLEGROUND" - elseif sdm_sendReceiveFrame_sendGuildRadio:GetChecked() then + elseif sdm_sendGuildRadio:GetChecked() then channel="GUILD" - elseif sdm_sendReceiveFrame_sendTargetRadio:GetChecked() then + elseif sdm_sendTargetRadio:GetChecked() then channel="WHISPER" if UnitIsPlayer("target") then target, realm = UnitName("target") - if realm then + if realm and realm~="" then target = target.."-"..realm end end - elseif sdm_sendReceiveFrame_sendArbitraryRadio:GetChecked() then + elseif sdm_sendArbitraryRadio:GetChecked() then channel="WHISPER" - target=sdm_sendReceiveFrame_sendInput:GetText() + target=sdm_sendInput:GetText() end if channel=="WHISPER" and ((not target) or target=="" or target==sdm_thisChar.name) then return end - sdm_sendReceiveFrame_sendInput:ClearFocus() + sdm_sendInput:ClearFocus() sdm_SendMacro(sdm_macros[sdm_currentEdit], channel, target) end function sdm_ReceiveButtonClicked() local sender - if sdm_sendReceiveFrame_receiveTargetRadio:GetChecked() then + if sdm_receiveTargetRadio:GetChecked() then if UnitIsPlayer("target") then sender, realm = UnitName("target") - if realm then + if realm and realm~="" then sender = sender.."-"..realm end end - elseif sdm_sendReceiveFrame_receiveArbitraryRadio:GetChecked() then - sender=sdm_sendReceiveFrame_receiveInput:GetText() + elseif sdm_receiveArbitraryRadio:GetChecked() then + sender=sdm_receiveInput:GetText() + elseif sdm_receiveAnyoneRadio:GetChecked() then + sender = "" end if ((not sender) or sender=="" or sender==sdm_thisChar.name) then return end - sdm_sendReceiveFrame_receiveInput:ClearFocus() + sdm_receiveInput:ClearFocus() sdm_SaveConfirmationBox("sdm_WaitForMacro("..sdm_Stringer(sender)..")") end sdm_sending=nil --info about the macro you're trying to send sdm_receiving=nil --info about the macro you're receiving (or waiting to receive) sdm_updateInterval=0.25 --can be as low as 0.01 and still work, but it might disconnect you if there are other addons sending out messages too. 0.25 is slower but safer. -sdm_minVersion="1.6" --the oldest version that is compatible with this one for exchanging macros \ No newline at end of file +sdm_minVersion="2.4" --the oldest version that is compatible with this one for exchanging macros \ No newline at end of file diff --git a/SuperDuperMacro/sdm Readme.txt b/SuperDuperMacro/sdm Readme.txt index a086b7d..104aec7 100644 --- a/SuperDuperMacro/sdm Readme.txt +++ b/SuperDuperMacro/sdm Readme.txt @@ -1,5 +1,5 @@ Super Duper Macro -version 2.3 +version 2.4 by hypehuman Check for updates at http://www.wowinterface.com/downloads/info10496 @@ -25,13 +25,17 @@ Special thanks to: Change Log +2.4 (11/20/11) +¥ÊFixed the Send/Receive feature; now you can share macros with your friends again, as long as you are both using the latest version. +¥ Fixed a bug where buttons on the SDM frame would sometimes stretch away +¥ÊMany UI Improvements + 2.3 (11/16/11) ¥ÊThe SDM frame now hides when you press escape! ¥ÊAdded more tooltips; still more to come 2.2.1 (11/15/11) ¥ÊFixed a bug where the macro list sometimes became unclickable -¥ÊFixed a bug that sometimes caused buttons to show in the wrong places 2.2 (11/4/11) ¥ÊUpgraded macros will now appropriately change their icons based on the macro code (unless an icon other than the Question Mark icon was selected). If you upgraded a macro with version 2.1, you will need to manually change the icon to the Question Mark icon. -- 1.7.9.5