Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 15 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,21 @@ Immersion is developed and maintained by the same author.

<br>

## Collector Commands

The Collector module can exclude minimap buttons from Dragonflight UI: Reforged's minimap button collector.

```text
/dfrl collector list
/dfrl collector del <ButtonName>
/dfrl collector add <ButtonName>
/dfrl collector reset
```

Use `list` to show known minimap button names, `del` to release a button back to the minimap, `add` to collect it again, and `reset` to clear all exclusions.

<br>

## 🛠️ Installation

1. Download the **latest release** of **Dragonflight UI: Reforged**
Expand Down
23 changes: 22 additions & 1 deletion modules/gui/homeb.lua
Original file line number Diff line number Diff line change
Expand Up @@ -250,7 +250,28 @@ DFRL:NewMod("GUI-Dragonflight", 4, function()
end

_G["SLASH_DFRL1"] = "/dfrl"
_G.SlashCmdList["DFRL"] = function()
_G.SlashCmdList["DFRL"] = function(msg)
msg = msg or ""
local _, _, command, action, name = string.find(msg, "^(%S+)%s*(%S*)%s*(.*)$")
if command == "collector" then
if not DFRL.collector then
print("DFRL Collector is not available")
elseif action == "list" then
DFRL.collector.List()
elseif action == "del" and name ~= "" then
DFRL.collector.Del(name)
print("DFRL Collector excluded: " .. name)
elseif action == "add" and name ~= "" then
DFRL.collector.Add(name)
print("DFRL Collector added: " .. name)
elseif action == "reset" then
DFRL.collector.Reset()
print("DFRL Collector exclusions reset")
else
print("Usage: /dfrl collector list | del <ButtonName> | add <ButtonName> | reset")
end
return
end
Toggle()
end
end
Expand Down
251 changes: 234 additions & 17 deletions modules/map/collect.lua
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
DFRL:NewDefaults("Collector", {
enabled = { true },
collectDarkMode = {0, "slider", {0, 1}, nil, "appearance", 1, "Adjust dark mode intensity", nil, nil},
excluded = {{}},
})

DFRL:NewMod("Collector", 1, function()
Expand All @@ -15,6 +16,149 @@ DFRL:NewMod("Collector", 1, function()

DFRL.MinimapButtonsPerRow = 3

function Setup:GetExcluded()
local excluded = DFRL:GetTempDB("Collector", "excluded")
if type(excluded) ~= "table" then
excluded = {}
DFRL:SetTempDBNoCallback("Collector", "excluded", excluded)
end
return excluded
end

function Setup:IsExcluded(name)
local excluded = self:GetExcluded()
for i = 1, table.getn(excluded) do
if excluded[i] == name then
return true
end
end
return false
end

function Setup:AddExcluded(name)
if not name or name == "" or self:IsExcluded(name) then return end
local excluded = self:GetExcluded()
table.insert(excluded, name)
DFRL:SetTempDBNoCallback("Collector", "excluded", excluded)
end

function Setup:RemoveExcluded(name)
local excluded = self:GetExcluded()
for i = table.getn(excluded), 1, -1 do
if excluded[i] == name then
table.remove(excluded, i)
end
end
DFRL:SetTempDBNoCallback("Collector", "excluded", excluded)
end

function Setup:RemoveFromOrder(name)
local saved = DFRL:GetTempDB("Collector", "buttonOrder") or {}
for i = table.getn(saved), 1, -1 do
if saved[i] == name then
table.remove(saved, i)
end
end
DFRL:SetTempDBNoCallback("Collector", "buttonOrder", saved)

for i = table.getn(self.buttonOrder), 1, -1 do
local button = self.buttonOrder[i]
if button and button:GetName() == name then
table.remove(self.buttonOrder, i)
end
end
end

function Setup:GetDragTarget(button)
if not button then return nil end
if button:IsObjectType("Button") then return button end
if button:IsObjectType("Frame") then
local children = {button:GetChildren()}
for i = 1, table.getn(children) do
if children[i]:IsObjectType("Button") then
return children[i]
end
end
end
return button
end

function Setup:SetFallbackPosition(button)
button:ClearAllPoints()
button:SetFrameStrata("MEDIUM")
button:SetPoint("TOPLEFT", Minimap, "BOTTOMLEFT", 0, -8)
end

function Setup:ReleaseButton(button, useFallback)
if not button then return end
local dragTarget = self:GetDragTarget(button)
if dragTarget and dragTarget.dfrlCollectorScripts then
dragTarget:SetScript("OnDragStart", dragTarget.dfrlCollectorScripts.OnDragStart)
dragTarget:SetScript("OnDragStop", dragTarget.dfrlCollectorScripts.OnDragStop)
dragTarget.dfrlCollectorScripts = nil
end
if dragTarget and dragTarget.UnlockHighlight then
dragTarget:UnlockHighlight()
end
if button.UnlockHighlight then
button:UnlockHighlight()
end
if button.originalSetPoint then
button.SetPoint = button.originalSetPoint
button.originalSetPoint = nil
end

button:SetParent(Minimap)

if useFallback then
self:SetFallbackPosition(button)
end
button:Show()

if useFallback then
local releaseFrame = CreateFrame("Frame")
releaseFrame:SetScript("OnUpdate", function()
releaseFrame:SetScript("OnUpdate", nil)
self:SetFallbackPosition(button)
button:Show()
end)
end
end

function Setup:RefreshCollection(includeButton)
local buttons = {}
local seen = {}

local function AddButton(button, known)
if not button or not button:GetName() or seen[button:GetName()] then return end
seen[button:GetName()] = true
if self:IsExcluded(button:GetName()) then return end
if not known and not self:IsValidButton(button) then return end
table.insert(buttons, button)
end

for i = 1, table.getn(self.buttonOrder) do
AddButton(self.buttonOrder[i], true)
end

AddButton(includeButton, true)

local children = { Minimap:GetChildren() }
for i = 1, table.getn(children) do
AddButton(children[i], false)
end

if table.getn(buttons) == 0 then
self.collector:Hide()
if DFRL.toggleButton then DFRL.toggleButton:Hide() end
self.buttonOrder = {}
return
end
if DFRL.toggleButton then DFRL.toggleButton:Show() end
self:ArrangeButtons(buttons)
self.collector:Hide()
end

function Setup:CleanupFrames()
KillFrame(_G.MBB_MinimapButtonFrame)
KillFrame(_G.MinimapButtonFrame)
Expand Down Expand Up @@ -84,7 +228,9 @@ DFRL:NewMod("Collector", 1, function()
for i = 1, numChildren do
local child = children[i]
if child and self:IsValidButton(child) then
table.insert(buttons, child)
if not self:IsExcluded(child:GetName()) then
table.insert(buttons, child)
end
end
end
return buttons
Expand All @@ -101,21 +247,21 @@ DFRL:NewMod("Collector", 1, function()

for i = 1, table.getn(buttons) do
local button = buttons[i]
if not button.originalSetPoint then
button.originalSetPoint = button.SetPoint
button.SetPoint = function() end
end

button:SetParent(self.collector)
button:ClearAllPoints()

local row = math.floor(count / buttonsPerRow)
local col = count - (row * buttonsPerRow)

button:SetPoint("TOPRIGHT", self.collector, "TOPRIGHT",
button.originalSetPoint(button, "TOPRIGHT", self.collector, "TOPRIGHT",
-3 - (row * (buttonSize + padding)),
-6 - (col * (buttonSize + padding)))

if not button.originalSetPoint then
button.originalSetPoint = button.SetPoint
button.SetPoint = function() end
end

self:EnableDrag(button, i)

count = count + 1
Expand Down Expand Up @@ -235,6 +381,66 @@ DFRL:NewMod("Collector", 1, function()
DFRL:SetTempDBNoCallback("Collector", "buttonOrder", order)
end

function Setup:Exclude(name)
local button = _G[name]
self:AddExcluded(name)
self:RemoveFromOrder(name)
if button then
self:ReleaseButton(button, true)
end
self:RefreshCollection()
end

function Setup:Include(name)
self:RemoveExcluded(name)
self:RefreshCollection(_G[name])
end

function Setup:ResetExcluded()
DFRL:SetTempDBNoCallback("Collector", "excluded", {})
self:RefreshCollection()
end

function Setup:PrintExcluded()
local names = {}
local seen = {}

local function AddName(name)
if not name or name == "" or seen[name] then return end
seen[name] = true
table.insert(names, name)
end

for i = 1, table.getn(self.buttonOrder) do
local button = self.buttonOrder[i]
if button then AddName(button:GetName()) end
end

local children = { Minimap:GetChildren() }
for i = 1, table.getn(children) do
local child = children[i]
if child and child:GetName() and self:IsValidButton(child) then
AddName(child:GetName())
end
end

local excluded = self:GetExcluded()
for i = 1, table.getn(excluded) do
AddName(excluded[i])
end

if table.getn(names) == 0 then
print("DFRL Collector: no buttons found")
return
end

print("DFRL Collector buttons:")
for i = 1, table.getn(names) do
local status = self:IsExcluded(names[i]) and "excluded" or "collected"
print(" [" .. status .. "] " .. names[i])
end
end

function Setup:RepositionAllButtons()
local buttonSize = 24
local padding = 4
Expand Down Expand Up @@ -308,21 +514,20 @@ DFRL:NewMod("Collector", 1, function()
end

function Setup:EnableDrag(button, index)
local dragTarget = button
if button:IsObjectType("Frame") then
local children = {button:GetChildren()}
for i = 1, table.getn(children) do
if children[i]:IsObjectType("Button") then
dragTarget = children[i]
break
end
end
end
local dragTarget = self:GetDragTarget(button)
if not dragTarget then return end

dragTarget:RegisterForDrag("LeftButton")
button:SetMovable(true)
dragTarget:EnableMouse(true)

if not dragTarget.dfrlCollectorScripts then
dragTarget.dfrlCollectorScripts = {
OnDragStart = dragTarget:GetScript("OnDragStart"),
OnDragStop = dragTarget:GetScript("OnDragStop"),
}
end

dragTarget:SetScript("OnDragStart", function()
self.dragStartIndex = index
button.origRow = math.floor((index - 1) / DFRL.MinimapButtonsPerRow)
Expand All @@ -342,6 +547,11 @@ DFRL:NewMod("Collector", 1, function()
end
end

if not currentIndex then
self:ReleaseButton(button, true)
return
end

button:ClearAllPoints()
local buttonSize = 24
local padding = 4
Expand Down Expand Up @@ -370,6 +580,13 @@ DFRL:NewMod("Collector", 1, function()
self:StartDelayedCollection()
self:AddBorders()
self:CreateToggleButton()

DFRL.collector = {
List = function() Setup:PrintExcluded() end,
Del = function(name) Setup:Exclude(name) end,
Add = function(name) Setup:Include(name) end,
Reset = function() Setup:ResetExcluded() end,
}
end

Setup:Run()
Expand Down