2024-11-22 02:22:21 +02:00

93 lines
2.5 KiB
Lua

local helper = require("druid.helper")
local mini_graph = require("druid.widget.mini_graph.mini_graph")
---@class widget.memory_panel: druid.widget
---@field root node
local M = {}
function M:init()
self.root = self:get_node("root")
self.delta_time = 0.1
self.samples_count = 30
self.memory_limit = 100
self.mini_graph = self.druid:new_widget(mini_graph, "mini_graph")
self.mini_graph:set_samples(self.samples_count)
-- This one is not works with scaled root
--gui.set_parent(self:get_node("content"), self.mini_graph.content, true)
do -- Set parent manually
local parent_node = self.mini_graph.content
local position = helper.get_full_position(parent_node, self.mini_graph.root)
local content = self:get_node("content")
gui.set_parent(content, self.mini_graph.content)
gui.set_position(content, -position)
end
self.max_value = self.druid:new_text("text_max_value")
self.text_per_second = self.druid:new_text("text_per_second")
self.text_memory = self.druid:new_text("text_memory")
self.memory = collectgarbage("count")
self.memory_samples = {}
self:update_text_memory()
self.timer_id = timer.delay(self.delta_time, true, function()
self:push_next_value()
end)
end
function M:on_remove()
timer.cancel(self.timer_id)
end
function M:set_low_memory_limit(limit)
self.memory_limit = limit
end
function M:push_next_value()
local memory = collectgarbage("count")
local diff = math.max(0, memory - self.memory)
self.memory = memory
self:update_text_memory()
table.insert(self.memory_samples, diff)
if #self.memory_samples > self.samples_count then
table.remove(self.memory_samples, 1)
end
self.mini_graph:push_line_value(diff)
local max_value = math.max(unpack(self.memory_samples))
max_value = math.max(max_value, self.memory_limit) -- low limit to display
self.mini_graph:set_max_value(max_value)
local max_memory = math.ceil(self.mini_graph:get_highest_value())
self.max_value:set_text(max_memory .. " KB")
local last_second = 0
local last_second_samples = math.ceil(1 / self.delta_time)
for index = #self.memory_samples - last_second_samples + 1, #self.memory_samples do
last_second = last_second + (self.memory_samples[index] or 0)
end
self.text_per_second:set_text(math.ceil(last_second) .. " KB/s")
end
function M:update_text_memory()
local memory = math.ceil(collectgarbage("count")) -- in KB
if memory > 1024 then
memory = memory / 1024
self.text_memory:set_text(string.format("%.2f", memory) .. " MB")
else
self.text_memory:set_text(memory .. " KB")
end
end
return M