Quantcast

add smooth feature

rawoil [06-19-21 - 05:36]
add smooth feature
Filename
oUF_Simple/core/functions.lua
oUF_Simple/core/style.lua
oUF_Simple/modules/oUF_Smooth.lua
oUF_Simple/oUF_Simple.toc
oUF_SimpleConfig/global.lua
diff --git a/oUF_Simple/core/functions.lua b/oUF_Simple/core/functions.lua
index 7e01aa6..fe6e502 100644
--- a/oUF_Simple/core/functions.lua
+++ b/oUF_Simple/core/functions.lua
@@ -540,3 +540,10 @@ local function CreateDragFrame(self)
   rLib:CreateDragFrame(self, L.dragFrames, -2, true)
 end
 L.F.CreateDragFrame = CreateDragFrame
+
+--ToggleSmooth
+local function ToggleSmooth(self, enabled)
+  self.Health.Smooth = enabled
+  if self.Power then self.Power.Smooth = enabled end
+end
+L.F.ToggleSmooth = ToggleSmooth
\ No newline at end of file
diff --git a/oUF_Simple/core/style.lua b/oUF_Simple/core/style.lua
index 73de8b8..08a44be 100644
--- a/oUF_Simple/core/style.lua
+++ b/oUF_Simple/core/style.lua
@@ -28,6 +28,7 @@ local function CreateStyle(self)
   L.F.CreateHealthText(self)
   self.Power = L.F.CreatePowerBar(self)
   L.F.CreatePowerText(self)
+  L.F.ToggleSmooth(self, L.C.smooth)
   self.Castbar = L.F.CreateCastBar(self)
   self.rClassBar = L.F.CreateClassBar(self)
   -- self.AlternativePower = L.F.CreateAltPowerBar(self)
diff --git a/oUF_Simple/modules/oUF_Smooth.lua b/oUF_Simple/modules/oUF_Smooth.lua
new file mode 100644
index 0000000..b5dc3d8
--- /dev/null
+++ b/oUF_Simple/modules/oUF_Smooth.lua
@@ -0,0 +1,53 @@
+local _, ns = ...
+local oUF = ns.oUF or oUF
+assert(oUF, "<name> was unable to locate oUF install.")
+
+local smoothing = {}
+local function Smooth(self, value)
+	local _, max = self:GetMinMaxValues()
+	if value == self:GetValue() or (self._max and self._max ~= max) then
+		smoothing[self] = nil
+		self:SetValue_(value)
+	else
+		smoothing[self] = value
+	end
+	self._max = max
+end
+
+local function SmoothBar(self, bar)
+	bar.SetValue_ = bar.SetValue
+	bar.SetValue = Smooth
+end
+
+local function hook(frame)
+	frame.SmoothBar = SmoothBar
+	if frame.Health and frame.Health.Smooth then
+		frame:SmoothBar(frame.Health)
+	end
+	if frame.Power and frame.Power.Smooth then
+		frame:SmoothBar(frame.Power)
+	end
+end
+
+
+for i, frame in ipairs(oUF.objects) do hook(frame) end
+oUF:RegisterInitCallback(hook)
+
+
+local f, min, max = CreateFrame('Frame'), math.min, math.max
+f:SetScript('OnUpdate', function()
+	local limit = 30/GetFramerate()
+	for bar, value in pairs(smoothing) do
+		local cur = bar:GetValue()
+		local new = cur + min((value-cur)/3, max(value-cur, limit))
+		if new ~= new then
+			-- Mad hax to prevent QNAN.
+			new = value
+		end
+		bar:SetValue_(new)
+		if cur == value or abs(new - value) < 2 then
+			bar:SetValue_(value)
+			smoothing[bar] = nil
+		end
+	end
+end)
diff --git a/oUF_Simple/oUF_Simple.toc b/oUF_Simple/oUF_Simple.toc
index 9ea8a53..9692924 100644
--- a/oUF_Simple/oUF_Simple.toc
+++ b/oUF_Simple/oUF_Simple.toc
@@ -8,6 +8,7 @@
 modules\rClassBar.lua
 modules\oUF_DebuffHighlight.lua
 modules\oUF_Swing.lua
+modules\oUF_Smooth.lua

 core\init.lua
 core\functions.lua
diff --git a/oUF_SimpleConfig/global.lua b/oUF_SimpleConfig/global.lua
index ca69655..1101578 100644
--- a/oUF_SimpleConfig/global.lua
+++ b/oUF_SimpleConfig/global.lua
@@ -71,7 +71,8 @@ L.C.colors.healthbar = {
 L.C.colors.power = {
   mana = {0.1, 0.2, 1}
 }
-
+--smooth
+L.C.smooth = true
 --fonts
 L.C.fonts = {
   expressway = rLib.mediapath .. "expressway.ttf",