local addonname, MOVANY = ... local function tdeepcopy(object) local lookup_table = {} local function _copy(object) if type(object) ~= "table" then return object elseif lookup_table[object] then return lookup_table[object] end local new_table = {} lookup_table[object] = new_table for index, value in pairs(object) do new_table[_copy(index)] = _copy(value) end return setmetatable(new_table, getmetatable(object)) end return _copy(object) end function MovAny:ToggleFrameEditors() local show = MAOptionsToggleFrameEditors:GetChecked() for i,fe in pairs(MovAny.frameEditors) do if show then fe:Show() else fe:Hide() end end end function MovAny:FrameEditor(name) --decho(o) if MovAny.frameEditors[name] then MovAny.frameEditors[name]:CloseDialog() return end if MovAny.MoveOnlyWhenVisible[name] then maPrint(string.format(MOVANY.ONLY_WHEN_VISIBLE, name)) return end local f for id = 1, 1000, 1 do f = _G["MA_FE"..id] if not f then f = MovAny:CreateFrameEditor(id, name) break end if not f.o then f:LoadFrame(name) f:Show() break end id = id + 1 end end function MovAny:CreateFrameEditor(id, name) local funcClearFocus = function(self) self:ClearFocus() end local leftColumnWidth = 50 local centerColumnWidth = 30 local secondColumnOffset = leftColumnWidth + 10 local fn = "MA_FE"..id local fe = CreateFrame("Frame", fn, UIParent) fe:SetWidth(610) fe:SetHeight(465) fe:SetFrameStrata("FULLSCREEN") fe:SetFrameLevel(1) fe:SetPoint("CENTER") fe:EnableMouse(true) fe:SetMovable(true) fe:RegisterForDrag("LeftButton") fe:SetScript("OnDragStart", fe.StartMoving) fe:SetScript("OnDragStop", fe.StopMovingOrSizing) fe:SetBackdrop({ bgFile = "Interface\\DialogFrame\\UI-DialogBox-Background", tile = "true", tileSize = 32, }) fe:SetBackdropColor(0, 0, 0) fe:SetBackdropBorderColor(0, 0, 0) local closeButton = CreateFrame("Button", fn.."Close", fe, "MAButtonTemplate") closeButton:SetText("X") closeButton:SetWidth(20) closeButton:SetHeight(20) closeButton:SetPoint("TOPRIGHT", -1, 0) closeButton:SetScript("OnClick", function() fe:CloseDialog() end) local helpfulNameLabel = fe:CreateFontString() helpfulNameLabel:SetFontObject("GameFontNormalSmall") helpfulNameLabel:SetWidth(leftColumnWidth) helpfulNameLabel:SetHeight(20) helpfulNameLabel:SetJustifyH("LEFT") helpfulNameLabel:SetPoint("TOPLEFT", fe, "TOPLEFT", 12, -8) helpfulNameLabel:SetText("Frame:") local helpfulName = fe:CreateFontString(fn.."HelpfulName") helpfulName:SetFontObject("GameFontHighlightSmall") helpfulName:SetWidth(270) helpfulName:SetHeight(20) helpfulName:SetJustifyH("LEFT") helpfulName:SetPoint("TOPLEFT", helpfulNameLabel, "TOPRIGHT", 6, 0) local realNameLabel = fe:CreateFontString() realNameLabel:SetFontObject("GameFontNormalSmall") realNameLabel:SetWidth(leftColumnWidth) realNameLabel:SetHeight(20) realNameLabel:SetJustifyH("LEFT") realNameLabel:SetPoint("TOPLEFT", helpfulNameLabel, "BOTTOMLEFT", 0, -2) realNameLabel:SetText("Name:") local realName = fe:CreateFontString(fn.."RealName") realName:SetFontObject("GameFontHighlightSmall") realName:SetWidth(270) realName:SetHeight(20) realName:SetJustifyH("LEFT") realName:SetPoint("TOPLEFT", realNameLabel, "TOPRIGHT", 6, 0) local enabledCheck = CreateFrame("CheckButton", fn.."Enabled", fe, "MACheckButtonTemplate") enabledCheck:SetPoint("TOPLEFT", realNameLabel, "BOTTOMLEFT", 2, -2) enabledCheck:SetScript("OnClick", function(self) MovAny:ToggleEnableFrame(fe.editFrame:GetName()) end) local enabledLabel = fe:CreateFontString() enabledLabel:SetFontObject("GameFontNormalSmall") --enabledLabel:SetWidth(leftColumnWidth) enabledLabel:SetHeight(20) enabledLabel:SetJustifyH("LEFT") enabledLabel:SetPoint("TOPLEFT", enabledCheck, "TOPRIGHT", 1, 2) enabledLabel:SetText("Enabled") local hideCheck = CreateFrame("CheckButton", fn.."Hide", fe, "MACheckButtonTemplate") hideCheck:SetPoint("TOPLEFT", enabledLabel, "TOPRIGHT", 9, -2) hideCheck:SetScript("OnClick", function(self) if not MovAny:ToggleHide(fe.editFrame:GetName()) then self:SetChecked(nil) end end) local hideLabel = fe:CreateFontString() hideLabel:SetFontObject("GameFontNormalSmall") --hideLabel:SetWidth(leftColumnWidth) hideLabel:SetHeight(20) hideLabel:SetJustifyH("LEFT") hideLabel:SetPoint("TOPLEFT", hideCheck, "TOPRIGHT", 1, 2) hideLabel:SetText("Hidden") local clampToScreenCheck = CreateFrame("CheckButton", fn.."ClampToScreenButton", fe, "MACheckButtonTemplate") clampToScreenCheck:SetPoint("TOPLEFT", hideLabel, "TOPRIGHT", 9, -2) clampToScreenCheck:SetScript("OnClick", function() local opt = fe:VerifyOpt() if opt.clampToScreen then opt.clampToScreen = nil else opt.clampToScreen = true end if fe.editFrame and fe.editFrame.SetClampedToScreen then fe.editFrame:SetClampedToScreen(opt.clampToScreen) local mover = MovAny:GetMoverByFrameName(fe.o.name) if mover then mover:SetClampedToScreen(opt.clampToScreen) end end end) local clampToScreenLabel = fe:CreateFontString() clampToScreenLabel:SetFontObject("GameFontNormalSmall") clampToScreenLabel:SetWidth(100) clampToScreenLabel:SetHeight(20) clampToScreenLabel:SetJustifyH("LEFT") clampToScreenLabel:SetPoint("TOPLEFT", clampToScreenCheck, "TOPRIGHT", 0, 0) clampToScreenLabel:SetText("Clamp to screen") --[[ local positionHeading = fe:CreateFontString() positionHeading:SetFontObject("GameFontNormalSmall") positionHeading:SetWidth(leftColumnWidth) positionHeading:SetHeight(20) positionHeading:SetJustifyH("LEFT") positionHeading:SetPoint("TOPLEFT", enabledCheck, "BOTTOMLEFT", -3, -2) positionHeading:SetText("Position") ]] local dropDownClickFunc = function(self) ToggleDropDownMenu(1, nil, self, self, 6, 7, nil, self) end local pointLabel = fe:CreateFontString() pointLabel:SetFontObject("GameFontNormalSmall") pointLabel:SetWidth(leftColumnWidth) pointLabel:SetHeight(18) pointLabel:SetJustifyH("LEFT") pointLabel:SetPoint("TOPLEFT", enabledCheck, "BOTTOMLEFT", -2, -4) pointLabel:SetText("Attach") local pointDropDownButton = CreateFrame("Button", fn.."Point", fe, "UIDropDownMenuTemplate") pointDropDownButton:SetID(1) pointDropDownButton:SetScript("OnClick", dropDownClickFunc) local pointFunc = function(self) UIDropDownMenu_SetSelectedValue(pointDropDownButton, self.value) fe:VerifyOpt() if fe.opt.pos[1] ~= self.value then fe.opt.pos[1] = self.value fe:WritePoint() end end local pointDropDown_MenuInit = function() local point if fe.opt and fe.opt.pos and fe.opt.pos[1] then point = fe.opt.pos[1] elseif fe.editFrame then point = fe.editFrame:GetPoint() end local info for _, infoTab in pairs(MovAny.DDMPointList) do info = UIDropDownMenu_CreateInfo() info.text = infoTab.text info.value = infoTab.value info.func = pointFunc if point == infoTab.value then info.checked = true end UIDropDownMenu_AddButton(info) end end pointDropDownButton:SetPoint("TOPLEFT", pointLabel, "TOPRIGHT", -12, 1) UIDropDownMenu_Initialize(pointDropDownButton, pointDropDown_MenuInit) UIDropDownMenu_SetWidth(pointDropDownButton, 100) local pointResetButton = CreateFrame("Button", fn.."PointResetButton", fe, "MAButtonTemplate") pointResetButton:SetWidth(20) pointResetButton:SetHeight(20) pointResetButton:SetPoint("TOPLEFT", pointDropDownButton, "TOPRIGHT", 0, -2.5) pointResetButton:SetText("R") pointResetButton:SetScript("OnClick", function() local p = MovAny:GetFirstOrgPoint(fe:VerifyOpt()) if not p then return end p = p[1] if fe.opt and fe.opt.pos[1] ~= p then UIDropDownMenu_Initialize(pointDropDownButton, pointDropDown_MenuInit) UIDropDownMenu_SetSelectedValue(pointDropDownButton, p) fe.opt.pos[1] = p fe:WritePoint() end end) local relPointLabel = fe:CreateFontString() relPointLabel:SetFontObject("GameFontNormalSmall") relPointLabel:SetWidth(leftColumnWidth) relPointLabel:SetHeight(18) --relPointLabel:SetJustifyH("LEFT") relPointLabel:SetPoint("TOPLEFT", pointLabel, "BOTTOMLEFT", 0, -10) relPointLabel:SetText("to") local relPointDropDownButton = CreateFrame("Button", fn.."RelPoint", fe, "UIDropDownMenuTemplate") relPointDropDownButton:SetID(2) relPointDropDownButton:SetScript("OnClick", dropDownClickFunc) local relPointFunc = function(self) UIDropDownMenu_SetSelectedValue(relPointDropDownButton, self.value) fe:VerifyOpt() if not fe.opt.orgPos and fe.editFrame then MovAny:StoreOrgPoints(fe.editFrame, fe.opt) end local updateEditor if not fe.opt.pos then fe.opt.pos = MovAny:GetRelativePoint(MovAny:GetFirstOrgPoint(fe.opt), fe) updateEditor = true end if fe.opt.pos[3] ~= self.value then fe.opt.pos[3] = self.value fe:WritePoint(updateEditor) end end local relPointDropDown_MenuInit = function() local info for _, infoTab in pairs(MovAny.DDMPointList) do info = UIDropDownMenu_CreateInfo() info.text = infoTab.text info.value = infoTab.value info.func = relPointFunc info.checked = nil UIDropDownMenu_AddButton(info) end end relPointDropDownButton:SetPoint("TOPLEFT", relPointLabel, "TOPRIGHT", -12, 1) UIDropDownMenu_Initialize(relPointDropDownButton, relPointDropDown_MenuInit) UIDropDownMenu_SetWidth(relPointDropDownButton, 100) local relPointResetButton = CreateFrame("Button", fn.."RelPointResetButton", fe, "MAButtonTemplate") relPointResetButton:SetWidth(20) relPointResetButton:SetHeight(20) relPointResetButton:SetPoint("TOPLEFT", relPointDropDownButton, "TOPRIGHT", 0, -2.5) relPointResetButton:SetText("R") relPointResetButton:SetScript("OnClick", function() local p = MovAny:GetFirstOrgPoint(fe:VerifyOpt()) if not p then return end p = p[3] if fe.opt and fe.opt.pos[3] ~= p then UIDropDownMenu_Initialize(relPointDropDownButton, relPointDropDown_MenuInit) UIDropDownMenu_SetSelectedValue(relPointDropDownButton, p) fe.opt.pos[3] = p fe:WritePoint() end end) local relToLabel = fe:CreateFontString() relToLabel:SetFontObject("GameFontNormalSmall") relToLabel:SetWidth(leftColumnWidth) relToLabel:SetHeight(18) --relToLabel:SetJustifyH("LEFT") relToLabel:SetPoint("TOPLEFT", relPointLabel, "BOTTOMLEFT", 0, -15) relToLabel:SetText("of") local relToEdit = CreateFrame("EditBox", fn.."RelToEdit", fe, "InputBoxTemplate") local relToFunc = function(self) self = self or relToEdit local value = self:GetText() if value == "" then if fe.opt and fe.opt.pos then self:SetText(fe.opt.pos[2]) else local p = MovAny:GetFirstOrgPoint(fe:VerifyOpt()) p = p[2] self:SetText(p) end elseif _G[value] then fe:VerifyOpt() if not fe.opt.orgPos and fe.editFrame then MovAny:StoreOrgPoints(fe.editFrame, fe.opt) end local updateEditor if not fe.opt.pos then fe.opt.pos = MovAny:GetRelativePoint(MovAny:GetFirstOrgPoint(fe.opt), fe) updateEditor = true end if fe.opt.pos[2] ~= value then fe.opt.pos[2] = value fe:WritePoint(updateEditor) end else maPrint(string.format(MOVANY.ELEMENT_NOT_FOUND_NAMED, value)) end self:ClearFocus() end local relToEscapeFunc = function(self) local value = self:GetText() if _G[value] then fe:VerifyOpt() if not fe.opt.orgPos and fe.editFrame then MovAny:StoreOrgPoints(fe.editFrame, fe.opt) end local updateEditor if not fe.opt.pos then fe.opt.pos = MovAny:GetRelativePoint(MovAny:GetFirstOrgPoint(fe.opt), fe) updateEditor = true end if fe.opt.pos[2] ~= value then fe.opt.pos[2] = value fe:WritePoint(updateEditor) end else if fe.opt and fe.opt.pos then self:SetText(fe.opt.pos[2]) else local p = MovAny:GetFirstOrgPoint(fe:VerifyOpt()) p = p[2] self:SetText(p) end end self:ClearFocus() end relToEdit:SetFontObject("GameFontHighlightSmall") relToEdit:SetWidth(300) relToEdit:SetHeight(20) relToEdit:SetJustifyH("LEFT") relToEdit:SetAutoFocus(false) relToEdit:SetPoint("TOPLEFT", relToLabel, "TOPRIGHT", 10, 0) relToEdit:SetScript("OnTabPressed", relToFunc) relToEdit:SetScript("OnEnterPressed", relToFunc) relToEdit:SetScript("OnEscapePressed", relToEscapeFunc) local relToResetButton = CreateFrame("Button", fn.."RelToResetButton", fe, "MAButtonTemplate") relToResetButton:SetWidth(20) relToResetButton:SetHeight(20) relToResetButton:SetPoint("TOPLEFT", relToEdit, "TOPRIGHT", 7, 0) relToResetButton:SetText("R") relToResetButton:SetScript("OnClick", function() local p = MovAny:GetFirstOrgPoint(fe:VerifyOpt()) if not p then return end p = p[2] if relToEdit:GetText() ~= p then relToEdit:SetText(p) relToFunc() end end) local xLabel = fe:CreateFontString() xLabel:SetFontObject("GameFontNormalSmall") xLabel:SetWidth(leftColumnWidth) xLabel:SetHeight(18) xLabel:SetJustifyH("LEFT") xLabel:SetPoint("TOPLEFT", relToLabel, "BOTTOMLEFT", 0, -13) xLabel:SetText("X offset") local xEdit = CreateFrame("EditBox", fn.."XEdit", fe, "InputBoxTemplate") local xSlider = CreateFrame("Slider", fn.."XSlider", fe, "OptionsSliderTemplate") xEdit:SetFontObject("GameFontHighlightSmall") xEdit:SetMaxLetters(10) xEdit:SetWidth(59) xEdit:SetHeight(20) xEdit:SetJustifyH("CENTER") xEdit:SetAutoFocus(false) xEdit:SetPoint("TOPLEFT", xLabel, "TOPRIGHT", 10, 0) xEdit:SetText("0") local xSliderFunc local xEditFunc = function(self) self:ClearFocus() local v = tonumber(xEdit:GetText()) if v == nil then return end xSlider:SetScript("OnValueChanged", nil) xSlider:SetMinMaxValues(v - 200, v + 200) xSlider:SetValue(v) v = numfor(v) _G[xSlider:GetName().."Low"]:SetText(v - 200) _G[xSlider:GetName().."High"]:SetText(v + 200) _G[xSlider:GetName().."Text"]:SetText(v) xSlider:SetScript("OnValueChanged", xSliderFunc) if fe.updating then return end fe:VerifyOpt() if not fe.opt.orgPos and fe.editFrame then MovAny:StoreOrgPoints(fe.editFrame, fe.opt) end local updateEditor if not fe.opt.pos then fe.opt.pos = MovAny:GetRelativePoint(MovAny:GetFirstOrgPoint(fe.opt), fe) updateEditor = true end if fe.opt.pos[4] ~= tonumber(xEdit:GetText()) then fe.opt.pos[4] = tonumber(xEdit:GetText()) fe:WritePoint(updateEditor) end end xEdit:SetScript("OnEnterPressed", xEditFunc) xEdit:SetScript("OnTabPressed", xEditFunc) xEdit:SetScript("OnEscapePressed", funcClearFocus) xSlider:SetScale(.75) xSlider:SetWidth(535) xSlider:SetMinMaxValues(-200, 200) xSlider:SetValue(0) xSlider:SetValueStep(1) xSlider:SetPoint("TOPLEFT", xEdit, "TOPRIGHT", 10, -2) xSlider:SetScript("OnMouseUp", function(self) local v = numfor(xSlider:GetValue()) xSlider:SetScript("OnValueChanged", nil) xSlider:SetMinMaxValues(v - 200, v + 200) xSlider:SetScript("OnValueChanged", xSliderFunc) _G[xSlider:GetName().."Low"]:SetText(v - 200) _G[xSlider:GetName().."High"]:SetText(v + 200) _G[xSlider:GetName().."Text"]:SetText(v) end) xSliderFunc = function(self) local v = numfor(xSlider:GetValue()) _G[xSlider:GetName().."Text"]:SetText(v) xEdit:SetText(numfor(xSlider:GetValue())) if fe.updating then return end fe:VerifyOpt() if not fe.opt.orgPos and fe.editFrame then MovAny:StoreOrgPoints(fe.editFrame, fe.opt) end local updateEditor if not fe.opt.pos then fe.opt.pos = MovAny:GetRelativePoint(MovAny:GetFirstOrgPoint(fe.opt), fe) updateEditor = true end if fe.opt.pos[4] ~= xSlider:GetValue() then fe.opt.pos[4] = xSlider:GetValue() fe:WritePoint(updateEditor) end end xSlider:SetScript("OnValueChanged", xSliderFunc) local xResetButton = CreateFrame("Button", fn.."XResetButton", fe, "MAButtonTemplate") xResetButton:SetWidth(20) xResetButton:SetHeight(20) xResetButton:SetPoint("TOPLEFT", xSlider, "TOPRIGHT", 12, 2) xResetButton:SetText("R") xResetButton:SetScript("OnClick", function() local p = MovAny:GetFirstOrgPoint(fe:VerifyOpt()) if not p then return end p = p[4] xSlider:SetScript("OnValueChanged", nil) xSlider:SetMinMaxValues(p-200, p+200) xSlider:SetScript("OnValueChanged", xSliderFunc) xSlider:SetValue(p) end) local xZeroButton = CreateFrame("Button", fn.."XZeroButton", fe, "MAButtonTemplate") xZeroButton:SetWidth(20) xZeroButton:SetHeight(20) xZeroButton:SetPoint("TOPLEFT", xResetButton, "TOPRIGHT", 5, 0) xZeroButton:SetText("0") xZeroButton:SetScript("OnClick", function() xSlider:SetScript("OnValueChanged", nil) xSlider:SetMinMaxValues(-200, 200) xSlider:SetScript("OnValueChanged", xSliderFunc) xSlider:SetValue(0) end) local yLabel = fe:CreateFontString() yLabel:SetFontObject("GameFontNormalSmall") yLabel:SetWidth(leftColumnWidth) yLabel:SetHeight(18) yLabel:SetJustifyH("LEFT") yLabel:SetPoint("TOPLEFT", xLabel, "BOTTOMLEFT", 0, -13) yLabel:SetText("Y offset") local yEdit = CreateFrame("EditBox", fn.."YEdit", fe, "InputBoxTemplate") local ySlider = CreateFrame("Slider", fn.."YSlider", fe, "OptionsSliderTemplate") yEdit:SetFontObject("GameFontHighlightSmall") yEdit:SetMaxLetters(10) yEdit:SetWidth(59) yEdit:SetHeight(20) yEdit:SetJustifyH("CENTER") yEdit:SetAutoFocus(false) yEdit:SetPoint("TOPLEFT", yLabel, "TOPRIGHT", 10, 0) yEdit:SetText("0") local ySliderFunc local yEditFunc = function(self) self:ClearFocus() local v = tonumber(yEdit:GetText()) if not v then return end ySlider:SetScript("OnValueChanged", nil) ySlider:SetMinMaxValues(v - 200, v + 200) ySlider:SetValue(v) v = numfor(v) _G[ySlider:GetName().."Low"]:SetText(v - 200) _G[ySlider:GetName().."High"]:SetText(v + 200) _G[ySlider:GetName().."Text"]:SetText(v) ySlider:SetScript("OnValueChanged", ySliderFunc) if fe.updating then return end fe:VerifyOpt() if not fe.opt.orgPos and fe.editFrame then MovAny:StoreOrgPoints(fe.editFrame, fe.opt) end local updateEditor if not fe.opt.pos then fe.opt.pos = MovAny:GetRelativePoint(MovAny:GetFirstOrgPoint(fe.opt), fe) updateEditor = true end if fe.opt.pos[5] ~= tonumber(yEdit:GetText()) then fe.opt.pos[5] = tonumber(yEdit:GetText()) fe:WritePoint(updateEditor) end end yEdit:SetScript("OnEnterPressed", yEditFunc) yEdit:SetScript("OnTabPressed", yEditFunc) yEdit:SetScript("OnEscapePressed", funcClearFocus) ySlider:SetScale(.75) ySlider:SetWidth(535) ySlider:SetMinMaxValues(-200, 200) ySlider:SetValue(0) ySlider:SetValueStep(1) ySlider:SetPoint("TOPLEFT", yEdit, "TOPRIGHT", 10, -2) ySlider:SetScript("OnMouseUp", function(self) local v = numfor(ySlider:GetValue()) ySlider:SetScript("OnValueChanged", nil) ySlider:SetMinMaxValues(v - 200, v + 200) ySlider:SetScript("OnValueChanged", ySliderFunc) _G[ySlider:GetName().."Low"]:SetText(v - 200) _G[ySlider:GetName().."High"]:SetText(v + 200) _G[ySlider:GetName().."Text"]:SetText(v) end) ySliderFunc = function(self) local v = numfor(ySlider:GetValue()) _G[ySlider:GetName().."Text"]:SetText(v) yEdit:SetText(numfor(ySlider:GetValue())) if fe.updating then return end fe:VerifyOpt() if not fe.opt.orgPos and fe.editFrame then MovAny:StoreOrgPoints(fe.editFrame, fe.opt) end local updateEditor if not fe.opt.pos then fe.opt.pos = MovAny:GetRelativePoint(MovAny:GetFirstOrgPoint(fe.opt), fe) updateEditor = true end if fe.opt.pos[5] ~= self:GetValue() then fe.opt.pos[5] = self:GetValue() fe:WritePoint(updateEditor) end end ySlider:SetScript("OnValueChanged", ySliderFunc) local yResetButton = CreateFrame("Button", fn.."YResetButton", fe, "MAButtonTemplate") yResetButton:SetWidth(20) yResetButton:SetHeight(20) yResetButton:SetPoint("TOPLEFT", ySlider, "TOPRIGHT", 12, 2) yResetButton:SetText("R") yResetButton:SetScript("OnClick", function() local p = MovAny:GetFirstOrgPoint(fe:VerifyOpt()) if not p then return end p = p[5] ySlider:SetScript("OnValueChanged", nil) ySlider:SetMinMaxValues(p-200, p+200) ySlider:SetScript("OnValueChanged", ySliderFunc) ySlider:SetValue(p) end) local yZeroButton = CreateFrame("Button", fn.."YZeroButton", fe, "MAButtonTemplate") yZeroButton:SetWidth(20) yZeroButton:SetHeight(20) yZeroButton:SetPoint("TOPLEFT", yResetButton, "TOPRIGHT", 5, 0) yZeroButton:SetText("0") yZeroButton:SetScript("OnClick", function() ySlider:SetScript("OnValueChanged", nil) ySlider:SetMinMaxValues(-200, 200) ySlider:SetScript("OnValueChanged", ySliderFunc) ySlider:SetValue(0) end) local widthLabel = fe:CreateFontString() widthLabel:SetFontObject("GameFontNormalSmall") widthLabel:SetWidth(leftColumnWidth) widthLabel:SetHeight(18) widthLabel:SetJustifyH("LEFT") widthLabel:SetPoint("TOPLEFT", yLabel, "BOTTOMLEFT", 0, -13) widthLabel:SetText("Width") local widthEdit = CreateFrame("EditBox", fn.."WidthEdit", fe, "InputBoxTemplate") local widthSlider = CreateFrame("Slider", fn.."WidthSlider", fe, "OptionsSliderTemplate") widthEdit:SetFontObject("GameFontHighlightSmall") widthEdit:SetMaxLetters(10) widthEdit:SetWidth(59) widthEdit:SetHeight(20) widthEdit:SetJustifyH("CENTER") widthEdit:SetAutoFocus(false) widthEdit:SetPoint("TOPLEFT", widthLabel, "TOPRIGHT", 10, 0) widthEdit:SetText("0") local widthSliderFunc local widthEditFunc = function(self) self:ClearFocus() local v = tonumber(widthEdit:GetText()) if v == nil or v < 1 then return end local lowV = v - 200 if lowV < 1 then lowV = 1 end widthSlider:SetScript("OnValueChanged", nil) widthSlider:SetMinMaxValues(lowV, lowV + 400) widthSlider:SetValue(v) widthSlider:SetScript("OnValueChanged", widthSliderFunc) v = numfor(v) _G[widthSlider:GetName().."Low"]:SetText(numfor(lowV)) _G[widthSlider:GetName().."High"]:SetText(numfor(lowV + 400)) _G[widthSlider:GetName().."Text"]:SetText(v) if fe.updating then return end fe:VerifyOpt() fe:WriteDimentions() end widthEdit:SetScript("OnEnterPressed", widthEditFunc) widthEdit:SetScript("OnTabPressed", widthEditFunc) widthEdit:SetScript("OnEscapePressed", funcClearFocus) widthSlider:SetScale(.75) widthSlider:SetWidth(535) widthSlider:SetMinMaxValues(-200, 200) widthSlider:SetValue(0) widthSlider:SetValueStep(1) widthSlider:SetPoint("TOPLEFT", widthEdit, "TOPRIGHT", 10, -2) widthSlider:SetScript("OnMouseUp", function(self) local v = widthSlider:GetValue() local lowV = v - 200 if lowV < 1 then lowV = 1 end v = numfor(v) widthSlider:SetMinMaxValues(lowV, lowV + 400) _G[widthSlider:GetName().."Low"]:SetText(numfor(lowV)) _G[widthSlider:GetName().."High"]:SetText(numfor(lowV + 400)) _G[widthSlider:GetName().."Text"]:SetText(v) end) widthSliderFunc = function(self) local v = numfor(widthSlider:GetValue()) _G[widthSlider:GetName().."Text"]:SetText(v) widthEdit:SetText(numfor(widthSlider:GetValue())) if fe.updating then return end fe:VerifyOpt() fe:WriteDimentions() end widthSlider:SetScript("OnValueChanged", widthSliderFunc) local widthResetButton = CreateFrame("Button", fn.."WidthResetButton", fe, "MAButtonTemplate") widthResetButton:SetWidth(20) widthResetButton:SetHeight(20) widthResetButton:SetPoint("TOPLEFT", widthSlider, "TOPRIGHT", 12, 2) widthResetButton:SetText("R") widthResetButton:SetScript("OnClick", function() local opt = fe:VerifyOpt() local p = opt.originalWidth if not p then return end local lowV = p - 200 if lowV < 0 then lowV = 0 end widthSlider:SetScript("OnValueChanged", nil) widthSlider:SetMinMaxValues(lowV, lowV + 400) widthSlider:SetScript("OnValueChanged", widthSliderFunc) widthSlider:SetValue(p) _G[heightSlider:GetName().."Low"]:SetText(numfor(lowV)) _G[heightSlider:GetName().."High"]:SetText(numfor(lowV + 400)) end) local heightLabel = fe:CreateFontString() heightLabel:SetFontObject("GameFontNormalSmall") heightLabel:SetWidth(leftColumnWidth) heightLabel:SetHeight(18) heightLabel:SetJustifyH("LEFT") heightLabel:SetPoint("TOPLEFT", widthLabel, "BOTTOMLEFT", 0, -13) heightLabel:SetText("Height") local heightEdit = CreateFrame("EditBox", fn.."HeightEdit", fe, "InputBoxTemplate") local heightSlider = CreateFrame("Slider", fn.."HeightSlider", fe, "OptionsSliderTemplate") heightEdit:SetFontObject("GameFontHighlightSmall") heightEdit:SetMaxLetters(10) heightEdit:SetWidth(59) heightEdit:SetHeight(20) heightEdit:SetJustifyH("CENTER") heightEdit:SetAutoFocus(false) heightEdit:SetPoint("TOPLEFT", heightLabel, "TOPRIGHT", 10, 0) heightEdit:SetText("0") local heightSliderFunc local heightEditFunc = function(self) self:ClearFocus() local v = tonumber(heightEdit:GetText()) if v == nil or v < 1 then return end local lowV = v - 200 if lowV < 1 then lowV = 1 end heightSlider:SetScript("OnValueChanged", nil) heightSlider:SetMinMaxValues(lowV, lowV + 400) heightSlider:SetValue(v) v = numfor(v) _G[heightSlider:GetName().."Low"]:SetText(numfor(lowV)) _G[heightSlider:GetName().."High"]:SetText(numfor(lowV + 400)) _G[heightSlider:GetName().."Text"]:SetText(v) heightSlider:SetScript("OnValueChanged", heightSliderFunc) if fe.updating then return end fe:VerifyOpt() fe:WriteDimentions() end heightEdit:SetScript("OnEnterPressed", heightEditFunc) heightEdit:SetScript("OnTabPressed", heightEditFunc) heightEdit:SetScript("OnEscapePressed", funcClearFocus) heightSlider:SetScale(.75) heightSlider:SetWidth(535) heightSlider:SetMinMaxValues(-200, 200) heightSlider:SetValue(0) heightSlider:SetValueStep(1) heightSlider:SetPoint("TOPLEFT", heightEdit, "TOPRIGHT", 10, -2) heightSlider:SetScript("OnMouseUp", function(self) local v = heightSlider:GetValue() local lowV = v - 200 if lowV < 1 then lowV = 1 end v = numfor(v) heightSlider:SetMinMaxValues(lowV, lowV + 400) _G[heightSlider:GetName().."Low"]:SetText(numfor(lowV)) _G[heightSlider:GetName().."High"]:SetText(numfor(lowV + 400)) end) heightSliderFunc = function(self) local v = numfor(heightSlider:GetValue()) _G[heightSlider:GetName().."Text"]:SetText(v) heightEdit:SetText(numfor(heightSlider:GetValue())) if fe.updating then return end fe:VerifyOpt() fe:WriteDimentions() end heightSlider:SetScript("OnValueChanged", heightSliderFunc) local heightResetButton = CreateFrame("Button", fn.."HeightResetButton", fe, "MAButtonTemplate") heightResetButton:SetWidth(20) heightResetButton:SetHeight(20) heightResetButton:SetPoint("TOPLEFT", heightSlider, "TOPRIGHT", 12, 2) heightResetButton:SetText("R") heightResetButton:SetScript("OnClick", function() local opt = fe:VerifyOpt() local p = opt.originalHeight if not p then return end local lowV = p - 200 if lowV < 1 then lowV = 1 end heightSlider:SetScript("OnValueChanged", nil) heightSlider:SetMinMaxValues(lowV, lowV + 400) heightSlider:SetScript("OnValueChanged", heightSliderFunc) heightSlider:SetValue(p) local v = heightSlider:GetValue() _G[heightSlider:GetName().."Low"]:SetText(numfor(lowV)) _G[heightSlider:GetName().."High"]:SetText(numfor(lowV + 400)) end) local scaleLabel = fe:CreateFontString() scaleLabel:SetFontObject("GameFontNormalSmall") scaleLabel:SetWidth(leftColumnWidth) scaleLabel:SetHeight(20) scaleLabel:SetJustifyH("LEFT") scaleLabel:SetPoint("TOPLEFT", heightLabel, "BOTTOMLEFT", 0, -20) scaleLabel:SetText("Scale:") local scaleEdit = CreateFrame("EditBox", fn.."ScaleEdit", fe, "InputBoxTemplate") local scaleSlider = CreateFrame("Slider", fn.."ScaleSlider", fe, "OptionsSliderTemplate") scaleEdit:SetFontObject("GameFontHighlightSmall") scaleEdit:SetMaxLetters(6) scaleEdit:SetWidth(59) scaleEdit:SetHeight(20) scaleEdit:SetJustifyH("CENTER") scaleEdit:SetAutoFocus(false) scaleEdit:SetPoint("TOPLEFT", scaleLabel, "TOPRIGHT", 10, 0) scaleEdit:SetText("1") local scaleSliderFunc local scaleEditFunc = function(self) self:ClearFocus() local v = tonumber(self:GetText()) if not v then return end _G[scaleSlider:GetName().."Text"]:SetText(v) scaleSlider:SetScript("OnValueChanged", nil) scaleSlider:SetValue(v) scaleSlider:SetScript("OnValueChanged", scaleSliderFunc) if fe.updating then return end fe:VerifyOpt() if fe.opt.scale ~= tonumber(self:GetText()) then fe.opt.scale = tonumber(self:GetText()) fe:WriteScale() end end scaleEdit:SetScript("OnEnterPressed", scaleEditFunc) scaleEdit:SetScript("OnTabPressed", scaleEditFunc) scaleEdit:SetScript("OnEscapePressed", funcClearFocus) scaleSlider:SetScale(.75) scaleSlider:SetWidth(535) scaleSlider:SetMinMaxValues(0,10) scaleSlider:SetValue(1) scaleSlider:SetValueStep(.01) scaleSlider:SetPoint("TOPLEFT", scaleEdit, "TOPRIGHT", 10, -2) scaleSlider:SetScript("OnMouseUp", function(self) _G[self:GetName().."Text"]:SetText(numfor(self:GetValue(), 2)) end) _G[scaleSlider:GetName().."Low"]:SetText("0") _G[scaleSlider:GetName().."High"]:SetText("10") scaleSliderFunc = function(self) if not self.GetValue then return end local v = numfor(self:GetValue(), 2) _G[self:GetName().."Text"]:SetText(v) scaleEdit:SetText(v) if fe.updating then return end fe:VerifyOpt() if fe.opt.scale ~= self:GetValue() then fe.opt.scale = self:GetValue() fe:WriteScale() end end scaleSlider:SetScript("OnValueChanged", scaleSliderFunc) local scaleResetButton = CreateFrame("Button", fn.."ScaleResetButton", fe, "MAButtonTemplate") scaleResetButton:SetWidth(20) scaleResetButton:SetHeight(20) scaleResetButton:SetPoint("TOPLEFT", scaleSlider, "TOPRIGHT", 12, 2) scaleResetButton:SetText("R") scaleResetButton:SetScript("OnClick", function() local opt = fe:VerifyOpt() local p = opt.originalScale if not p then return end scaleSlider:SetValue(p) end) local scaleOneButton = CreateFrame("Button", fn.."ScaleOneButton", fe, "MAButtonTemplate") scaleOneButton:SetWidth(20) scaleOneButton:SetHeight(20) scaleOneButton:SetPoint("TOPLEFT", scaleResetButton, "TOPRIGHT", 5, 0) scaleOneButton:SetText("1") scaleOneButton:SetScript("OnClick", function() scaleSlider:SetValue(1) end) local alphaLabel = fe:CreateFontString() alphaLabel:SetFontObject("GameFontNormalSmall") alphaLabel:SetWidth(leftColumnWidth) alphaLabel:SetHeight(20) alphaLabel:SetJustifyH("LEFT") alphaLabel:SetPoint("TOPLEFT", scaleLabel, "BOTTOMLEFT", 0, -2) alphaLabel:SetText("Alpha:") local alphaEdit = CreateFrame("EditBox", fn.."AlphaEdit", fe, "InputBoxTemplate") local alphaSlider = CreateFrame("Slider", fn.."AlphaSlider", fe, "OptionsSliderTemplate") alphaEdit:SetFontObject("GameFontHighlightSmall") alphaEdit:SetMaxLetters(5) alphaEdit:SetWidth(59) alphaEdit:SetHeight(20) alphaEdit:SetJustifyH("CENTER") alphaEdit:SetAutoFocus(false) alphaEdit:SetPoint("TOPLEFT", alphaLabel, "TOPRIGHT", 10, 0) alphaEdit:SetText("100") local alphaSliderFunc local alphaEditFunc = function(self) self:ClearFocus() local v = tonumber(self:GetText()) if v == nil then return end if v > 100 then v = 100 self:SetText(v) elseif v < 0 then v = 0 self:SetText(v) end _G[alphaSlider:GetName().."Text"]:SetText(v.."%") alphaSlider:SetScript("OnValueChanged", nil) alphaSlider:SetValue(v / 100) alphaSlider:SetScript("OnValueChanged", alphaSliderFunc) if fe.updating then return end fe:WriteAlpha() end alphaEdit:SetScript("OnEnterPressed", alphaEditFunc) alphaEdit:SetScript("OnTabPressed", alphaEditFunc) alphaEdit:SetScript("OnEscapePressed", funcClearFocus) alphaSlider:SetScale(.75) alphaSlider:SetWidth(535) alphaSlider:SetMinMaxValues(0,1) alphaSlider:SetValue(1) alphaSlider:SetValueStep(.01) alphaSlider:SetPoint("TOPLEFT", alphaEdit, "TOPRIGHT", 10, -2) alphaSlider:SetScript("OnMouseUp", function(self) _G[self:GetName().."Text"]:SetText(numfor(alphaSlider:GetValue() * 100, 0).."%") end) alphaSliderFunc = function(self) local v = numfor(alphaSlider:GetValue() * 100, 0) _G[self:GetName().."Text"]:SetText(v.."%") alphaEdit:SetText(v) if fe.updating then return end fe:WriteAlpha() end alphaSlider:SetScript("OnValueChanged", alphaSliderFunc) _G[alphaSlider:GetName().."Low"]:SetText("0%") _G[alphaSlider:GetName().."High"]:SetText("100%") local alphaResetButton = CreateFrame("Button", fn.."AlphaResetButton", fe, "MAButtonTemplate") alphaResetButton:SetWidth(20) alphaResetButton:SetHeight(20) alphaResetButton:SetPoint("TOPLEFT", alphaSlider, "TOPRIGHT", 12, 2) alphaResetButton:SetText("R") alphaResetButton:SetScript("OnClick", function() local opt = fe:VerifyOpt() local p = opt.originalAlpha if not p then return end alphaSlider:SetValue(p) end) local alphaFullButton = CreateFrame("Button", fn.."AlphaFullButton", fe, "MAButtonTemplate") alphaFullButton:SetWidth(20) alphaFullButton:SetHeight(20) alphaFullButton:SetPoint("TOPLEFT", alphaResetButton, "TOPRIGHT", 5, 0) alphaFullButton:SetText("1") alphaFullButton:SetScript("OnClick", function() alphaSlider:SetValue(1) end) local hideArtworkCheck = CreateFrame("CheckButton", fn.."Hide", fe, "MACheckButtonTemplate") local hideBackgroundCheck = CreateFrame("CheckButton", fn.."Hide", fe, "MACheckButtonTemplate") local hideBorderCheck = CreateFrame("CheckButton", fn.."Hide", fe, "MACheckButtonTemplate") local hideHighlightCheck = CreateFrame("CheckButton", fn.."Hide", fe, "MACheckButtonTemplate") local hideOverlayCheck = CreateFrame("CheckButton", fn.."Hide", fe, "MACheckButtonTemplate") local hideLayerFunc = function(self) fe:VerifyOpt() MovAny:ResetLayers(fe.editFrame, fe.opt, true) if self == hideArtworkCheck then fe.opt.disableLayerArtwork = self:GetChecked() elseif self == hideBackgroundCheck then fe.opt.disableLayerBackground = self:GetChecked() elseif self == hideBorderCheck then fe.opt.disableLayerBorder = self:GetChecked() elseif self == hideHighlightCheck then fe.opt.disableLayerHighlight = self:GetChecked() elseif self == hideOverlayCheck then fe.opt.disableLayerOverlay = self:GetChecked() end MovAny:ApplyLayers(fe.editFrame, fe.opt) end local hideLayersHeading = fe:CreateFontString() hideLayersHeading:SetFontObject("GameFontNormalSmall") hideLayersHeading:SetWidth(85) hideLayersHeading:SetHeight(20) hideLayersHeading:SetJustifyH("LEFT") hideLayersHeading:SetPoint("TOPLEFT", alphaLabel, "BOTTOMLEFT", 0, -10) hideLayersHeading:SetText("Hide Layer") local layersResetButton = CreateFrame("Button", fn.."PointResetButton", fe, "MAButtonTemplate") layersResetButton:SetWidth(20) layersResetButton:SetHeight(20) layersResetButton:SetPoint("TOPLEFT", hideLayersHeading, "TOPRIGHT", 0, -1) layersResetButton:SetText("R") layersResetButton:SetScript("OnClick", function() local opt = fe:VerifyOpt() if fe.editFrame and opt then MovAny:ResetLayers(fe.editFrame, opt) hideArtworkCheck:SetChecked(nil) hideBackgroundCheck:SetChecked(nil) hideBorderCheck:SetChecked(nil) hideHighlightCheck:SetChecked(nil) hideOverlayCheck:SetChecked(nil) end end) hideArtworkCheck:SetWidth(20) hideArtworkCheck:SetHeight(20) hideArtworkCheck:SetPoint("TOPLEFT", hideLayersHeading, "BOTTOMLEFT", 4, -2) hideArtworkCheck:SetScript("OnClick", hideLayerFunc) local hideArtworkLabel = fe:CreateFontString() hideArtworkLabel:SetFontObject("GameFontNormalSmall") --hideArtworkLabel:SetWidth(leftColumnWidth) hideArtworkLabel:SetHeight(16) hideArtworkLabel:SetJustifyH("LEFT") hideArtworkLabel:SetPoint("TOPLEFT", hideArtworkCheck, "TOPRIGHT", 3, 0) hideArtworkLabel:SetText("Artwork") hideBackgroundCheck:SetWidth(20) hideBackgroundCheck:SetHeight(20) hideBackgroundCheck:SetPoint("TOPLEFT", hideArtworkCheck, "BOTTOMLEFT", 0, -1) hideBackgroundCheck:SetScript("OnClick", hideLayerFunc) local hideBackgroundLabel = fe:CreateFontString() hideBackgroundLabel:SetFontObject("GameFontNormalSmall") --hideBackgroundLabel:SetWidth(leftColumnWidth) hideBackgroundLabel:SetHeight(16) hideBackgroundLabel:SetJustifyH("LEFT") hideBackgroundLabel:SetPoint("TOPLEFT", hideBackgroundCheck, "TOPRIGHT", 3, 0) hideBackgroundLabel:SetText("Background") hideBorderCheck:SetWidth(20) hideBorderCheck:SetHeight(20) hideBorderCheck:SetPoint("TOPLEFT", hideBackgroundCheck, "BOTTOMLEFT", 0, -1) hideBorderCheck:SetScript("OnClick", hideLayerFunc) local hideBorderLabel = fe:CreateFontString() hideBorderLabel:SetFontObject("GameFontNormalSmall") --hideBorderLabel:SetWidth(leftColumnWidth) hideBorderLabel:SetHeight(16) hideBorderLabel:SetJustifyH("LEFT") hideBorderLabel:SetPoint("TOPLEFT", hideBorderCheck, "TOPRIGHT", 3, 0) hideBorderLabel:SetText("Border") hideHighlightCheck:SetWidth(20) hideHighlightCheck:SetHeight(20) hideHighlightCheck:SetPoint("TOPLEFT", hideBorderCheck, "BOTTOMLEFT", 0, -1) hideHighlightCheck:SetScript("OnClick", hideLayerFunc) local hideHighlightLabel = fe:CreateFontString() hideHighlightLabel:SetFontObject("GameFontNormalSmall") --hideHighlightLabel:SetWidth(leftColumnWidth) hideHighlightLabel:SetHeight(16) hideHighlightLabel:SetJustifyH("LEFT") hideHighlightLabel:SetPoint("TOPLEFT", hideHighlightCheck, "TOPRIGHT", 3, 0) hideHighlightLabel:SetText("Highlight") hideOverlayCheck:SetWidth(20) hideOverlayCheck:SetHeight(20) hideOverlayCheck:SetPoint("TOPLEFT", hideHighlightCheck, "BOTTOMLEFT", 0, -1) hideOverlayCheck:SetScript("OnClick", hideLayerFunc) local hideOverlayLabel = fe:CreateFontString() hideOverlayLabel:SetFontObject("GameFontNormalSmall") --hideOverlayLabel:SetWidth(leftColumnWidth) hideOverlayLabel:SetHeight(16) hideOverlayLabel:SetJustifyH("LEFT") hideOverlayLabel:SetPoint("TOPLEFT", hideOverlayCheck, "TOPRIGHT", 3, 0) hideOverlayLabel:SetText("Overlay") local strataLabel = fe:CreateFontString() strataLabel:SetFontObject("GameFontNormalSmall") strataLabel:SetWidth(leftColumnWidth) strataLabel:SetHeight(20) strataLabel:SetJustifyH("LEFT") strataLabel:SetPoint("TOPLEFT", layersResetButton, "TOPRIGHT", 30, 0) strataLabel:SetText("Strata:") local strataDropDownButton = CreateFrame("Button", fn.."Strata", fe, "UIDropDownMenuTemplate") strataDropDownButton:SetID(3) strataDropDownButton:SetScript("OnClick", dropDownClickFunc) local strataFunc = function(self) UIDropDownMenu_SetSelectedValue(strataDropDownButton, self.value) local opt = fe:VerifyOpt() if opt.frameStrata ~= self.value then opt.frameStrata = self.value local editFrame = fe.editFrame if editFrame then if not opt.orgFrameStrata then opt.orgFrameStrata = editFrame:GetFrameStrata() end if not InCombatLockdown() or not MovAny:IsProtected(editFrame) then editFrame:SetFrameStrata(opt.frameStrata) else local closure = function(f, fs) return function() if MovAny:IsProtected(f) and InCombatLockdown() then return true end f:SetFrameStrata(fs) end end MovAny.pendingActions[fe.o.name..":SetFrameStrata"] = closure(editFrame, opt.frameStrata) end end end end local strataDropDown_MenuInit = function() local frameStrata = (fe.opt and fe.opt.frameStrata) or (fe.editFrame and fe.editFrame:GetFrameStrata()) or nil local info for _, infoTab in pairs(MovAny.DDMStrataList) do info = UIDropDownMenu_CreateInfo() info.text = infoTab.text info.value = infoTab.value info.func = strataFunc if frameStrata == infoTab.value then info.checked = true end UIDropDownMenu_AddButton(info) end end strataDropDownButton:SetPoint("TOPLEFT", strataLabel, "TOPRIGHT", -12, 1) UIDropDownMenu_Initialize(strataDropDownButton, strataDropDown_MenuInit) UIDropDownMenu_SetWidth(strataDropDownButton, 130) --[[ strataDropDownButton:SetScript("OnClick", function() ToggleDropDownMenu(1, nil, nil, strataDropDownButton, 0, 0, nil, strataDropDownButton) end) ]] local strataResetButton = CreateFrame("Button", fn.."StrataResetButton", fe, "MAButtonTemplate") strataResetButton:SetWidth(20) strataResetButton:SetHeight(20) strataResetButton:SetPoint("TOPLEFT", strataDropDownButton, "TOPRIGHT", 0, -2.5) strataResetButton:SetText("R") strataResetButton:SetScript("OnClick", function() local opt = fe:VerifyOpt() local fs = opt.orgFrameStrata local editFrame = fe.editFrame if not fs then return end if strataDropDownButton:GetText() ~= fs then if editFrame then if not InCombatLockdown() or not MovAny:IsProtected(editFrame) then editFrame:SetFrameStrata(fs) else local closure = function(f, fs) return function() if MovAny:IsProtected(f) and InCombatLockdown() then return true end f:SetFrameStrata(fs) end end MovAny.pendingActions[fe.o.name..":SetFrameStrata"] = closure(editFrame, fs) end end opt.frameStrata = fs UIDropDownMenu_Initialize(strataDropDownButton, strataDropDown_MenuInit) UIDropDownMenu_SetSelectedValue(strataDropDownButton, fs) opt.orgFrameStrata = nil opt.frameStrata = nil end end) local revertButton = CreateFrame("Button", fn.."RevertButton", fe, "MAButtonTemplate") revertButton:SetWidth(75) revertButton:SetHeight(22) revertButton:SetPoint("TOPLEFT", strataResetButton, "TOPRIGHT", 25, 0) revertButton:SetText("Revert") revertButton.tooltipText = "Reverts the frame to the modifications it had when this editor was opened." revertButton:SetScript("OnClick", function() if fe.editFrame and (InCombatLockdown() and MovAny:IsProtected(fe.editFrame)) then maPrint(string.format(MOVANY.FRAME_PROTECTED_DURING_COMBAT, fe.o.name)) else if fe.editFrame then MovAny:ResetAll(fe.editFrame, MovAny:GetFrameOptions(fe.o.name), true) end local opt = tdeepcopy(fe.initialOpt) MovAny.frameOptions[fe.o.name] = opt fe.opt = opt MovAny:SyncFrame(fe.o.name, opt, true) fe:UpdateEditor() end end) local resetButton = CreateFrame("Button", fn.."ResetButton", fe, "MAButtonTemplate") resetButton:SetWidth(75) resetButton:SetHeight(22) resetButton:SetPoint("TOPLEFT", revertButton, "BOTTOMLEFT", 0, -10) resetButton:SetText("Reset") resetButton.tooltipText = "Resets the frame, undoing all modifications you have made with MoveAnything." resetButton:SetScript("OnClick", function() if not fe.editFrame then return end MovAny:ResetFrameConfirm(fe.o.name) end) local exportButton = CreateFrame("Button", fn.."ExportButton", fe, "MAButtonTemplate") exportButton:SetWidth(75) exportButton:SetHeight(22) exportButton:SetPoint("TOPLEFT", resetButton, "BOTTOMLEFT", 0, -10) exportButton:SetText("Export") exportButton:Disable() exportButton.tooltipText = "Not yet implemented." exportButton:SetScript("OnClick", function() end) local syncButton = CreateFrame("Button", fn.."SyncButton", fe, "MAButtonTemplate") syncButton:SetWidth(75) syncButton:SetHeight(22) syncButton:SetPoint("TOPLEFT", exportButton, "BOTTOMLEFT", 0, -10) syncButton:SetText("Sync") syncButton:Disable() syncButton.tooltipText = "Synchronize the frame with all modifications made in MoveAnything." syncButton:SetScript("OnClick", function() if fe.editFrame then MovAny:SyncFrame(fe.o.name) end end) local moverButton = CreateFrame("Button", fn.."MoverButton", fe, "MAButtonTemplate") moverButton:SetWidth(75) moverButton:SetHeight(22) moverButton:SetPoint("TOPLEFT", revertButton, "TOPRIGHT", 10, 0) moverButton:SetText("Mover") moverButton.tooltipText = "Toggles a mover on/off for the frame." moverButton:SetScript("OnClick", function(self) MovAny:ToggleMove(fe.o.name) fe:UpdateButtons() end) local showButton = CreateFrame("Button", fn.."ShowButton", fe, "MAButtonTemplate") showButton:SetWidth(75) showButton:SetHeight(22) showButton:SetPoint("TOPLEFT", moverButton, "BOTTOMLEFT", 0, -10) showButton:SetText("Show") showButton.tooltipText = "Toggles visibility of the frame, any change is not permanent. For permanent hiding use the \"Hidden\" checkbox." showButton:SetScript("OnClick", function(self) local opt = fe.opt local f = fe.editFrame if not f then return end if not MovAny:IsProtected(f) or not InCombatLockdown() then if f:IsShown() then if (opt and opt.UIPanelWindows) or UIPanelWindows[ f:GetName() ] then HideUIPanel(f) else f:Hide() end else if (opt and opt.UIPanelWindows) or UIPanelWindows[ f:GetName() ] then ShowUIPanel(f) else f:Show() end end fe:UpdateButtons() else maPrint(string.format(MOVANY.FRAME_PROTECTED_DURING_COMBAT, f:GetName())) end end) local importButton = CreateFrame("Button", fn.."ImportButton", fe, "MAButtonTemplate") importButton:SetWidth(75) importButton:SetHeight(22) importButton:SetPoint("TOPLEFT", showButton, "BOTTOMLEFT", 0, -10) importButton:SetText("Import") importButton:Disable() importButton.tooltipText = "Not yet implemented." importButton:SetScript("OnClick", function() end) local actualsHeading = fe:CreateFontString() actualsHeading:SetFontObject("GameFontNormalSmall") actualsHeading:SetWidth(140) actualsHeading:SetHeight(20) actualsHeading:SetJustifyH("LEFT") actualsHeading:SetPoint("TOPRIGHT", fe, "TOPRIGHT", -25, -4) actualsHeading:SetText("Absolute values") local infoTextWidthLabel = fe:CreateFontString() infoTextWidthLabel:SetFontObject("GameFontNormalSmall") infoTextWidthLabel:SetWidth(leftColumnWidth) infoTextWidthLabel:SetHeight(16) infoTextWidthLabel:SetJustifyH("RIGHT") infoTextWidthLabel:SetPoint("TOPLEFT", actualsHeading, "BOTTOMLEFT", -55, -1) infoTextWidthLabel:SetText("Width:") local infoTextWidth = fe:CreateFontString() infoTextWidth:SetFontObject("GameFontNormalSmall") infoTextWidth:SetWidth(60) infoTextWidth:SetHeight(16) infoTextWidth:SetJustifyH("LEFT") infoTextWidth:SetPoint("TOPLEFT", infoTextWidthLabel, "TOPRIGHT", 3, 0) local infoTextXLabel = fe:CreateFontString() infoTextXLabel:SetFontObject("GameFontNormalSmall") infoTextXLabel:SetWidth(leftColumnWidth) infoTextXLabel:SetHeight(16) infoTextXLabel:SetJustifyH("RIGHT") infoTextXLabel:SetPoint("TOPLEFT", infoTextWidthLabel, "BOTTOMLEFT", 0, -1) infoTextXLabel:SetText("X:") local infoTextX = fe:CreateFontString() infoTextX:SetFontObject("GameFontNormalSmall") infoTextX:SetWidth(60) infoTextX:SetHeight(16) infoTextX:SetJustifyH("LEFT") infoTextX:SetPoint("TOPLEFT", infoTextXLabel, "TOPRIGHT", 3, 0) local infoTextAlphaLabel = fe:CreateFontString() infoTextAlphaLabel:SetFontObject("GameFontNormalSmall") infoTextAlphaLabel:SetWidth(leftColumnWidth) infoTextAlphaLabel:SetHeight(16) infoTextAlphaLabel:SetJustifyH("RIGHT") infoTextAlphaLabel:SetPoint("TOPLEFT", infoTextXLabel, "BOTTOMLEFT", 0, -1) infoTextAlphaLabel:SetText("Alpha:") local infoTextAlpha = fe:CreateFontString() infoTextAlpha:SetFontObject("GameFontNormalSmall") infoTextAlpha:SetWidth(60) infoTextAlpha:SetHeight(16) infoTextAlpha:SetJustifyH("LEFT") infoTextAlpha:SetPoint("TOPLEFT", infoTextAlphaLabel, "TOPRIGHT", 3, 0) local infoTextHeightLabel = fe:CreateFontString() infoTextHeightLabel:SetFontObject("GameFontNormalSmall") infoTextHeightLabel:SetWidth(leftColumnWidth) infoTextHeightLabel:SetHeight(16) infoTextHeightLabel:SetJustifyH("RIGHT") infoTextHeightLabel:SetPoint("TOPLEFT", actualsHeading, "BOTTOMLEFT", 55, -1) infoTextHeightLabel:SetText("Height:") local infoTextHeight = fe:CreateFontString() infoTextHeight:SetFontObject("GameFontNormalSmall") infoTextHeight:SetWidth(60) infoTextHeight:SetHeight(16) infoTextHeight:SetJustifyH("LEFT") infoTextHeight:SetPoint("TOPLEFT", infoTextHeightLabel, "TOPRIGHT", 3, 0) local infoTextYLabel = fe:CreateFontString() infoTextYLabel:SetFontObject("GameFontNormalSmall") infoTextYLabel:SetWidth(leftColumnWidth) infoTextYLabel:SetHeight(16) infoTextYLabel:SetJustifyH("RIGHT") infoTextYLabel:SetPoint("TOPLEFT", infoTextHeightLabel, "BOTTOMLEFT", 0, -1) infoTextYLabel:SetText("Y:") local infoTextY = fe:CreateFontString() infoTextY:SetFontObject("GameFontNormalSmall") infoTextY:SetWidth(60) infoTextY:SetHeight(16) infoTextY:SetJustifyH("LEFT") infoTextY:SetPoint("TOPLEFT", infoTextYLabel, "TOPRIGHT", 3, 0) local infoTextScaleLabel = fe:CreateFontString() infoTextScaleLabel:SetFontObject("GameFontNormalSmall") infoTextScaleLabel:SetWidth(leftColumnWidth) infoTextScaleLabel:SetHeight(16) infoTextScaleLabel:SetJustifyH("RIGHT") infoTextScaleLabel:SetPoint("TOPLEFT", infoTextYLabel, "BOTTOMLEFT", 0, -1) infoTextScaleLabel:SetText("Scale:") local infoTextScale = fe:CreateFontString() infoTextScale:SetFontObject("GameFontNormalSmall") infoTextScale:SetWidth(60) infoTextScale:SetHeight(16) infoTextScale:SetJustifyH("LEFT") infoTextScale:SetPoint("TOPLEFT", infoTextScaleLabel, "TOPRIGHT", 3, 0) --[[ Width Height Lock proportions ]] fe.LoadFrame = function(self, name) if self.o then MovAny.frameEditors[self.o.name] = nil end self.editFrame = _G[name] self.opt = MovAny:GetFrameOptions(name, nil, true) self.o = MovAny:GetFrame(name) self.initialOpt = tdeepcopy(self.opt) MovAny.frameEditors[name] = self self:UpdateEditor() end fe.UpdateEditor = function() fe.updating = true local o = fe.o local fn = o.name local opt = MovAny:GetFrameOptions(fn) fe.opt = opt local editFrame = fe.editFrame local frameHeight = 460 realName:SetText(fn) helpfulName:SetText(o.helpfulName) enabledCheck:SetChecked(not opt or not opt.disabled) if not MovAny.NoHide[fn] then hideLabel:Show() hideCheck:Show() hideCheck:SetChecked(opt and opt.hidden) else hideLabel:Hide() hideCheck:Hide() end if not editFrame or editFrame.SetClampedToScreen then clampToScreenCheck:Show() clampToScreenLabel:Show() clampToScreenCheck:SetChecked((opt and opt.clampToScreen) or (editFrame and editFrame:IsClampedToScreen())) else clampToScreenCheck:Hide() clampToScreenLabel:Hide() end local nextPoint = {"TOPLEFT", enabledCheck, "BOTTOMLEFT", -2, -4} if not MovAny.NoMove[fn] then pointLabel:SetPoint(unpack(nextPoint)) nextPoint = {"TOPLEFT", yLabel, "BOTTOMLEFT", 0, -20} pointLabel:Show() pointDropDownButton:Show() pointResetButton:Show() relPointLabel:Show() relPointDropDownButton:Show() relPointResetButton:Show() relToLabel:Show() relToEdit:Show() relToResetButton:Show() xLabel:Show() xEdit:Show() xSlider:Show() xResetButton:Show() yLabel:Show() yEdit:Show() ySlider:Show() yResetButton:Show() local p if opt and opt.pos then p = opt.pos elseif editFrame then local mover = MovAny:GetMoverByFrameName(fn) if mover then p = {mover:GetPoint()} else p = {editFrame:GetPoint()} end end if p then UIDropDownMenu_Initialize(pointDropDownButton, pointDropDown_MenuInit) UIDropDownMenu_SetSelectedValue(pointDropDownButton, p[1] or "TOPLEFT") local relPoint = p[3] or p[1] or "TOPLEFT" UIDropDownMenu_Initialize(relPointDropDownButton, relPointDropDown_MenuInit) UIDropDownMenu_SetSelectedValue(relPointDropDownButton, relPoint) local relativeTo = "UIParent" if p[2] then if type(p[2]) == "string" then relativeTo = p[2] elseif type(p[2]) == "table" and p[2]:GetName() then relativeTo = p[2]:GetName() end end relToEdit:SetText(relativeTo) local v = tonumber(numfor(p[4])) or 0 xSlider:SetMinMaxValues(v - 200, v + 200) _G[xSlider:GetName().."Low"]:SetText(v - 200) _G[xSlider:GetName().."High"]:SetText(v + 200) xSlider:SetValue(numfor(p[4] or 0)) v = tonumber(numfor(p[5])) or 0 ySlider:SetMinMaxValues(v - 200, v + 200) _G[ySlider:GetName().."Low"]:SetText(v - 200) _G[ySlider:GetName().."High"]:SetText(v + 200) ySlider:SetValue(numfor(p[5] or 0)) end else frameHeight = frameHeight - 150 pointLabel:Hide() pointDropDownButton:Hide() pointResetButton:Hide() relPointLabel:Hide() relPointDropDownButton:Hide() relPointResetButton:Hide() relToLabel:Hide() relToEdit:Hide() relToResetButton:Hide() xLabel:Hide() xEdit:Hide() xSlider:Hide() xResetButton:Hide() yLabel:Hide() yEdit:Hide() ySlider:Hide() yResetButton:Hide() end if editFrame and MovAny:CanBeScaled(editFrame) and editFrame.GetScale then if MovAny.ScaleWH[fn] then frameHeight = frameHeight + 27 widthLabel:SetPoint(unpack(nextPoint)) nextPoint = {"TOPLEFT", heightLabel, "BOTTOMLEFT", 0, -20} scaleLabel:Hide() scaleEdit:Hide() scaleSlider:Hide() scaleResetButton:Hide() widthLabel:Show() widthEdit:Show() widthSlider:Show() widthResetButton:Show() heightLabel:Show() heightEdit:Show() heightSlider:Show() heightResetButton:Show() local v = 1 if opt and (opt.width or opt.originalWidth) then if opt.width then v = opt.width elseif opt.originalWidth then v = opt.originalWidth end elseif fe.editFrame then v = fe.editFrame:GetWidth() end local lowV = tonumber(numfor(v)) - 200 if lowV < 1 then lowV = 1 end --widthEdit:SetText(v) widthSlider:SetMinMaxValues(lowV, lowV + 400) widthSlider:SetValue(v) _G[widthSlider:GetName().."Low"]:SetText(lowV) _G[widthSlider:GetName().."High"]:SetText(lowV + 400) v = 1 if opt and (opt.height or opt.originalHeight) then if opt.height then v = opt.height elseif opt.originalHeight then v = opt.originalHeight end elseif fe.editFrame then v = fe.editFrame:GetHeight() end lowV = tonumber(numfor(v)) - 200 if lowV < 1 then lowV = 1 end --heightEdit:SetText(v) heightSlider:SetMinMaxValues(lowV, lowV + 400) heightSlider:SetValue(v) _G[heightSlider:GetName().."Low"]:SetText(lowV) _G[heightSlider:GetName().."High"]:SetText(lowV + 400) else scaleLabel:SetPoint(unpack(nextPoint)) nextPoint = {"TOPLEFT", scaleLabel, "BOTTOMLEFT", 0, -20} scaleLabel:Show() scaleEdit:Show() scaleSlider:Show() scaleResetButton:Show() widthLabel:Hide() widthEdit:Hide() widthSlider:Hide() widthResetButton:Hide() heightLabel:Hide() heightEdit:Hide() heightSlider:Hide() heightResetButton:Hide() local scale = opt and opt.scale or 1 if scale then --scaleEdit:SetText(numfor(scale)) scaleSlider:SetValue(scale) else frameHeight = frameHeight - 40 scaleLabel:Hide() scaleEdit:Hide() scaleSlider:Hide() scaleResetButton:Hide() end end else frameHeight = frameHeight - 40 scaleLabel:Hide() scaleEdit:Hide() scaleSlider:Hide() scaleResetButton:Hide() end if editFrame and not MovAny.NoAlpha[fn] and editFrame.GetAlpha then alphaLabel:SetPoint(unpack(nextPoint)) nextPoint = {"TOPLEFT", alphaLabel, "BOTTOMLEFT", 0, -20} alphaLabel:Show() alphaEdit:Show() alphaSlider:Show() alphaResetButton:Show() local alpha = opt and opt.alpha or 1 --alphaEdit:SetText(numfor(alpha * 100)) alphaSlider:SetValue(alpha) else frameHeight = frameHeight - 40 alphaLabel:Hide() alphaEdit:Hide() alphaSlider:Hide() alphaResetButton:Hide() end fe:SetHeight(frameHeight) hideLayersHeading:SetPoint(unpack(nextPoint)) if fe.editFrame and fe.editFrame.DisableDrawLayer then hideLayersHeading:Show() hideArtworkCheck:Show() hideBackgroundCheck:Show() hideBorderCheck:Show() hideHighlightCheck:Show() hideOverlayCheck:Show() hideArtworkLabel:Show() hideBackgroundLabel:Show() hideBorderLabel:Show() hideHighlightLabel:Show() hideOverlayLabel:Show() hideArtworkCheck:SetChecked(fe.opt and fe.opt.disableLayerArtwork) hideBackgroundCheck:SetChecked(fe.opt and fe.opt.disableLayerBackground) hideBorderCheck:SetChecked(fe.opt and fe.opt.disableLayerBorder) hideHighlightCheck:SetChecked(fe.opt and fe.opt.disableLayerHighlight) hideOverlayCheck:SetChecked(fe.opt and fe.opt.disableLayerOverlay) else hideLayersHeading:Hide() hideArtworkCheck:Hide() hideBackgroundCheck:Hide() hideBorderCheck:Hide() hideHighlightCheck:Hide() hideOverlayCheck:Hide() hideArtworkLabel:Hide() hideBackgroundLabel:Hide() hideBorderLabel:Hide() hideHighlightLabel:Hide() hideOverlayLabel:Hide() end if (opt and opt.frameStrata) or (editFrame and editFrame.GetFrameStrata and editFrame:GetFrameStrata()) then strataLabel:Show() strataDropDownButton:Show() local frameStrata = (opt and opt.frameStrata) or (editFrame and editFrame:GetFrameStrata()) or nil UIDropDownMenu_Initialize(strataDropDownButton, strataDropDown_MenuInit) if frameStrata then UIDropDownMenu_SetSelectedValue(strataDropDownButton, frameStrata) else UIDropDownMenu_SetSelectedValue(strataDropDownButton, "BACKGROUND") end else strataLabel:Hide() strataDropDownButton:Hide() end fe:UpdateButtons() fe:UpdateActuals() fe.updating = nil end fe.UpdateButtons = function() if MovAny:GetFrameOptions(fe.o.name) then resetButton:Enable() else resetButton:Disable() end if fe.editFrame then local mover = MovAny:GetMoverByFrameName(fe.o.name) moverButton:Enable() moverButton:SetText(mover and "Detach" or "Attach") if mover then syncButton:Disable() else syncButton:Enable() end else moverButton:Disable() syncButton:Disable() end if fe.editFrame then showButton:Enable() showButton:SetText(fe.editFrame:IsShown() and "Hide" or "Show") else showButton:Disable() end end fe.CloseDialog = function() if IsShiftKeyDown() and IsControlKeyDown() and IsAltKeyDown() then ReloadUI() else fe:Hide() MovAny.frameEditors[fe.o.name] = nil fe.o = nil fe.opt = nil fe.editFrame = nil fe.initialOpt = nil end end fe.VerifyOpt = function(self, dontCreate) local opt = MovAny:GetFrameOptions(fe.o.name) if not opt then if dontCreate then fe.opt = nil else fe.opt = MovAny:HookFrame(fe.o.name) end end return fe.opt end fe.WritePoint = function(self, updateEditor) if fe.updating then return end local fn = fe.o.name local editFrame = fe.editFrame local opt = fe:VerifyOpt() if fe.editFrame and not opt.orgPos then MovAny:StoreOrgPoints(editFrame, opt) end fe.updating = true local mover = MovAny:GetMoverByFrameName(fn) if editFrame then if mover and (not InCombatLockdown() or not MovAny:IsProtected(editFrame)) then mover.dontUpdate = true MovAny:DetachMover(mover) end if not InCombatLockdown() or not MovAny:IsProtected(editFrame) then MovAny:ApplyPosition(editFrame, opt) else local closure = function(f, opt) return function() if MovAny:IsProtected(f) and InCombatLockdown() then return true end MovAny:ApplyPosition(f, opt) end end MovAny.pendingActions[fe.o.name..":SetPoint"] = closure(editFrame, opt) end if mover and (not InCombatLockdown() or not MovAny:IsProtected(editFrame)) then MovAny:AttachMover(fn) end end if updateEditor then fe:UpdateEditor() else fe:UpdateButtons() fe:UpdateActuals() end fe.updating = nil end fe.WriteScale = function() if fe.updating then return end local fn = fe.o.name local editFrame = fe.editFrame local opt = fe:VerifyOpt() local scale = scaleSlider:GetValue() fe.updating = true local mover = MovAny:GetMoverByFrameName(fn) if mover and (not InCombatLockdown() or not MovAny:IsProtected(editFrame)) then mover.dontUpdate = true MovAny:StopMoving(fn) end if scale > 0 then opt.scale = scale if editFrame then if not InCombatLockdown() or not MovAny:IsProtected(editFrame) then MovAny:ApplyScale(editFrame, opt) else local closure = function(f, opt) return function() if MovAny:IsProtected(f) and InCombatLockdown() then return true end MovAny:ApplyScale(f, opt) end end MovAny.pendingActions[fn..":SetScale"] = closure(editFrame, opt) end end end if mover and (not InCombatLockdown() or not MovAny:IsProtected(editFrame)) then MovAny:AttachMover(fn) end fe:UpdateButtons() fe:UpdateActuals() fe.updating = nil end fe.WriteDimentions = function() if fe.updating then return end local fn = fe.o.name local editFrame = fe.editFrame local opt = fe:VerifyOpt() if editFrame then if type(opt.originalWidth) == "nil" then opt.originalWidth = editFrame:GetWidth() end if type(opt.originalHeight) == "nil" then opt.originalHeight = editFrame:GetHeight() end end fe.updating = true local mover = MovAny:GetMoverByFrameName(fn) if mover and (not InCombatLockdown() or not MovAny:IsProtected(editFrame)) then mover.dontUpdate = true MovAny:StopMoving(fn) end local width = widthSlider:GetValue() if width >= 0 then opt.width = width end local height = heightSlider:GetValue() if height >= 0 then opt.height = height end if editFrame then if not InCombatLockdown() or not MovAny:IsProtected(editFrame) then MovAny:ApplyScale(editFrame, opt) else local closure = function(f, opt) return function() if MovAny:IsProtected(f) and InCombatLockdown() then return true end MovAny:ApplyScale(f,opt) end end MovAny.pendingActions[fn..":Scale"] = closure(editFrame, opt) end end if mover and (not InCombatLockdown() or not MovAny:IsProtected(editFrame)) then MovAny:AttachMover(fn) end fe:UpdateButtons() fe:UpdateActuals() fe.updating = nil end fe.WriteAlpha = function() if fe.updating then return end local fn = fe.o.name local opt = fe:VerifyOpt() fe.updating = true if opt.alpha ~= tonumber(alphaSlider:GetValue()) then opt.alpha = tonumber(alphaSlider:GetValue()) if fe.editFrame then MovAny:ApplyAlpha(fe.editFrame, opt) end if opt.alpha == opt.originalAlpha then opt.alpha = nil opt.originalAlpha = nil end end fe:UpdateButtons() fe:UpdateActuals() fe.updating = nil end fe.UpdateActuals = function() local editFrame = fe.editFrame if not editFrame then actualsHeading:Hide() infoTextWidthLabel:Hide() infoTextWidth:Hide() infoTextHeightLabel:Hide() infoTextHeight:Hide() infoTextXLabel:Hide() infoTextX:Hide() infoTextYLabel:Hide() infoTextY:Hide() infoTextScaleLabel:Hide() infoTextScale:Hide() infoTextAlphaLabel:Hide() infoTextAlpha:Hide() return end actualsHeading:Show() infoTextWidthLabel:Show() infoTextWidth:Show() infoTextHeightLabel:Show() infoTextHeight:Show() infoTextXLabel:Show() infoTextX:Show() infoTextYLabel:Show() infoTextY:Show() if editFrame.GetEffectiveScale or editFrame.GetScale then local scale if editFrame.GetScale then scale = editFrame:GetScale() elseif editFrame.GetEffectiveScale then scale = editFrame:GetEffectiveScale() / UIParent:GetScale() end if editFrame:GetLeft() then infoTextX:SetText(numfor(editFrame:GetLeft() * scale)) else infoTextX:SetText("?") end if editFrame:GetBottom() then infoTextY:SetText(numfor(editFrame:GetBottom() * scale)) end if editFrame:GetWidth() then infoTextWidth:SetText(numfor(editFrame:GetWidth() * scale)) end if editFrame:GetHeight() then infoTextHeight:SetText(numfor(editFrame:GetHeight() * scale)) end infoTextScaleLabel:Show() infoTextScale:Show() infoTextScale:SetText(numfor(scale * 100).."%") else infoTextX:SetText(numfor(editFrame:GetLeft())) infoTextY:SetText(numfor(editFrame:GetBottom())) infoTextWidth:SetText(numfor(editFrame:GetWidth())) infoTextHeight:SetText(numfor(editFrame:GetHeight())) infoTextScaleLabel:Hide() infoTextScale:Hide() end if editFrame.GetEffectiveAlpha or editFrame.GetAlpha then infoTextAlphaLabel:Show() infoTextAlpha:Show() local alpha if editFrame.GetEffectiveAlpha then alpha = editFrame:GetEffectiveAlpha() elseif editFrame.GetAlpha then alpha = editFrame:GetAlpha() end infoTextAlpha:SetText(numfor(alpha * 100, 0).."%") else infoTextAlphaLabel:Hide() infoTextAlpha:Hide() end end fe:LoadFrame(name) end