local Srendarr = _G['Srendarr'] local L = Srendarr:GetLocale() local ICON_SIZE = Srendarr.ICON_SIZE local math_abs = math.abs local math_rad = math.rad local AuraAnchor = {} local function GetEdgeRelativePosition(self) local left, top = self :GetLeft(), self :GetTop() local right, bottom = self :GetRight(), self :GetBottom() local rootW, rootH = GuiRoot:GetWidth(), GuiRoot:GetHeight() local point = 0 local x, y if (left < (rootW - right) and left < math_abs((left + right) / 2 - rootW / 2)) then x, point = left, 2 -- 'LEFT' elseif ((rootW - right) < math_abs((left + right) / 2 - rootW / 2)) then x, point = right - rootW, 8 -- 'RIGHT' else x, point = (left + right) / 2 - rootW / 2, 0 end if (bottom < (rootH - top) and bottom < math_abs((bottom + top) / 2 - rootH / 2)) then y, point = top, point + 1 -- 'TOP|TOPLEFT|TOPRIGHT' elseif ((rootH - top) < math_abs((bottom + top) / 2 - rootH / 2)) then y, point = bottom - rootH, point + 4 -- 'BOTTOM|BOTTOMLEFT|BOTTOMRIGHT' else y = (bottom + top) / 2 - rootH / 2 end point = (point == 0) and 128 or point -- 'CENTER' return point, x, y end local function AddControl(parent, cType, level) local c = WINDOW_MANAGER:CreateControl(nil, parent, cType) c:SetDrawLayer(DL_OVERLAY) c:SetDrawLevel(level) return c, c end local function BuildDragOverlay(self) local ctrl local drag = AddControl(self, CT_TEXTURE, 3) drag:SetDimensions(ICON_SIZE, ICON_SIZE) drag:SetAnchor(CENTER) drag:SetTexture([[/esoui/art/actionbar/abilityself64_up.dds]]) -- border (and root) -- OVERLAY ICON drag.icon, ctrl = AddControl(drag, CT_TEXTURE, 2) ctrl:SetDimensions(ICON_SIZE, ICON_SIZE) ctrl:SetAnchor(CENTER) ctrl:SetTexture[[/esoui/art/icons/ability_restorationstaff_001.dds]] drag.flash, ctrl = AddControl(drag, CT_TEXTURE, 4) ctrl:SetDimensions(ICON_SIZE, ICON_SIZE) ctrl:SetAnchor(CENTER) ctrl:SetTexture([[/esoui/art/actionbar/actionslot_toggledon.dds]]) ctrl:SetColor(1, 0.82, 0) -- LABEL drag.label, ctrl = AddControl(drag, CT_LABEL, 4) ctrl:SetFont('ZoFontWinH5') ctrl:SetHeight(20) ctrl:SetVerticalAlignment(1) ctrl:SetHorizontalAlignment(1) ctrl:SetColor(0.64, 0.52, 0, 1) ctrl:SetText( (self.k_id == 1) and L.DragLabel_BuffShort or (self.k_id == 2) and L.DragLabel_BuffLong or (self.k_id == 3) and L.DragLabel_Debuff or (self.k_id == 4) and L.DragLabel_Target or (self.k_id == 5) and L.DragLabel_Target_Debuff ) -- GROWTH ARROW drag.growth, ctrl = AddControl(drag, CT_TEXTURE, 4) drag.growth:SetDimensions(32, 32) drag.growth:SetTexture([[/esoui/art/ava/ava_keepstatus_icon_timetoupgrade.dds]]) -- EXTRA GROWTH ARROW drag.growthExtra, ctrl = AddControl(drag, CT_TEXTURE, 4) drag.growthExtra:SetDimensions(32, 32) drag.growthExtra:SetTexture([[/esoui/art/ava/ava_keepstatus_icon_timetoupgrade.dds]]) -- ANIMATION drag.timeline = ANIMATION_MANAGER:CreateTimeline() drag.timeline:SetPlaybackType(ANIMATION_PLAYBACK_LOOP, -1) local anim anim = drag.timeline:InsertAnimation(ANIMATION_SCALE, drag.growth, 0) anim:SetDuration(750) anim:SetEasingFunction(ZO_LinearEase) anim:SetScaleValues(1, 1.25) anim = drag.timeline:InsertAnimation(ANIMATION_SCALE, drag.growth, 750) anim:SetDuration(750) anim:SetEasingFunction(ZO_LinearEase) anim:SetScaleValues(1.25, 1) anim = drag.timeline:InsertAnimation(ANIMATION_SCALE, drag.growthExtra, 0) anim:SetDuration(750) anim:SetEasingFunction(ZO_LinearEase) anim:SetScaleValues(1, 1.25) anim = drag.timeline:InsertAnimation(ANIMATION_SCALE, drag.growthExtra, 750) anim:SetDuration(750) anim:SetEasingFunction(ZO_LinearEase) anim:SetScaleValues(1.25, 1) anim = drag.timeline:InsertAnimation(ANIMATION_COLOR, drag.label, 0) anim:SetDuration(750) anim:SetEasingFunction(ZO_LinearEase) anim:SetColorValues(0.64, 0.52, 0, 1, 1, 0.82, 0, 1) anim = drag.timeline:InsertAnimation(ANIMATION_COLOR, drag.label, 750) anim:SetDuration(750) anim:SetEasingFunction(ZO_LinearEase) anim:SetColorValues(1, 0.82, 0, 1, 0.64, 0.52, 0, 1) anim = drag.timeline:InsertAnimation(ANIMATION_ALPHA, drag.flash, 0) anim:SetDuration(750) anim:SetEasingFunction(ZO_LinearEase) anim:SetAlphaValues(0.4, 1) anim = drag.timeline:InsertAnimation(ANIMATION_ALPHA, drag.flash, 750) anim:SetDuration(750) anim:SetEasingFunction(ZO_LinearEase) anim:SetAlphaValues(1, 0.4) self.drag = drag end local function ConfigureDragOverlay(self) local drag = self.drag if (not drag) then return end local db = Srendarr.db.frames[self.k_id] drag.growth:ClearAnchors() drag.growthExtra:ClearAnchors() drag.label:ClearAnchors() if (self.k_id == 1) then if (Srendarr.db.combineBuff) then drag.label:SetText(L.DragLabel_BuffAll) else drag.label:SetText(L.DragLabel_BuffShort) end end if (db.auraGrowth == 'LEFT' or db.auraGrowth == 'LEFTCENTER') then drag.label:SetAnchor(RIGHT, drag, LEFT, -4, 0) drag.growth:SetAnchor(RIGHT, drag.label, LEFT, -2, 0) drag.growth:SetTextureRotation(math_rad(90)) elseif (db.auraGrowth == 'RIGHT' or db.auraGrowth == 'RIGHTCENTER') then drag.label:SetAnchor(LEFT, drag, RIGHT, 4, 0) drag.growth:SetAnchor(LEFT, drag.label, RIGHT, 4, 0) drag.growth:SetTextureRotation(math_rad(270)) elseif (db.auraGrowth == 'UP') then drag.label:SetAnchor(BOTTOM, drag, TOP, 0, -4) drag.growth:SetAnchor(BOTTOM, drag.label, TOP, 0, -2) drag.growth:SetTextureRotation(0) else -- down drag.label:SetAnchor(TOP, drag, BOTTOM, 0, 4) drag.growth:SetAnchor(TOP, drag.label, BOTTOM, 0, 2) drag.growth:SetTextureRotation(math_rad(180)) end if (db.auraGrowth == 'LEFTCENTER') then drag.growthExtra:SetHidden(false) drag.growthExtra:SetAnchor(LEFT, drag, RIGHT, 4, 0) drag.growthExtra:SetTextureRotation(math_rad(270)) elseif (db.auraGrowth == 'RIGHTCENTER') then drag.growthExtra:SetHidden(false) drag.growthExtra:SetAnchor(RIGHT, drag, LEFT, -4, 0) drag.growthExtra:SetTextureRotation(math_rad(90)) else drag.growthExtra:SetHidden(true) end end local function EnableDrag(self) if ((self.k_id == 2 and Srendarr.db.combineBuff) or (self.k_id == 4 and not Srendarr.db.showTargetAuras) or (self.k_id == 5 and not Srendarr.db.showTargetAurasDebuff)) then return end -- no overlay if not being used if (not self.drag) then BuildDragOverlay(self) end self:SetMouseEnabled(true) self:SetMovable(true) self:ConfigureDragOverlay() self.drag:SetHidden(false) self.drag.timeline:PlayFromStart() Srendarr.auraFrames[self.k_id]:SetAurasNonInteractive() end local function DisableDrag(self) self:SetMouseEnabled(false) self:SetMovable(false) if (self.drag) then self.drag:SetHidden(true) self.drag.timeline:Stop() self.drag.growth:SetScale(1) self.drag.label:SetColor(0.64, 0.52, 0, 1) self.drag.flash:SetAlpha(0.4) end Srendarr.auraFrames[self.k_id]:ConfigureAllAuras() end function AuraAnchor:New(id, point, x, y, scale) local frame = CreateControl(nil, GuiRoot, CT_TOPLEVELCONTROL) frame:SetKeyboardEnabled(false) frame:SetMouseEnabled(false) frame:SetMovable(false) frame:SetClampedToScreen(true) frame:SetDimensions(ICON_SIZE, ICON_SIZE) frame:ClearAnchors() frame:SetAnchor(point, GuiRoot, point, x, y) frame:SetScale(scale) frame.k_id = id frame:SetHandler('OnReceiveDrag', function(af) af:StartMoving() end) frame:SetHandler('OnMouseUp', function(af) af:StopMovingOrResizing() local point, x, y = GetEdgeRelativePosition(af) Srendarr.db.frames[af.k_id].anchor.point = point Srendarr.db.frames[af.k_id].anchor.x = x Srendarr.db.frames[af.k_id].anchor.y = y end) frame['EnableDrag'] = EnableDrag frame['DisableDrag'] = DisableDrag frame['ConfigureDragOverlay'] = ConfigureDragOverlay return frame end Srendarr.AuraAnchor = AuraAnchor