Skip to content

Commit ada98d4

Browse files
committed
fix(favorites): various fixes when applying profile in background [gh#165](#165), [gh#166](#166), [gh#167](#167)
1 parent 121d717 commit ada98d4

3 files changed

Lines changed: 61 additions & 20 deletions

File tree

Api.lua

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ function ADDON.Api:MountIdToOriginalIndex(mountId)
77

88
local count = C_MountJournal.GetNumDisplayedMounts()
99
for i = 1, count do
10-
local displayedMountId = select(12, C_MountJournal.GetDisplayedMountInfo(i))
10+
local displayedMountId = C_MountJournal.GetDisplayedMountID(i)
1111
if displayedMountId == mountId then
1212
return i
1313
end

DevZone/Debug.lua

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,9 +78,12 @@ end
7878

7979
local function testFavorites()
8080
local _,_, favorites = ADDON.Api:GetFavoriteProfile()
81-
local expectedMounts = CopyTable(favorites)
81+
local expectedMounts = tFilter(favorites, function(mountId)
82+
local _, _, _, _, _, _, _, _, _, shouldHideOnChar = C_MountJournal.GetMountInfoByID(mountId)
83+
return not shouldHideOnChar
84+
end)
8285

83-
for i = 1, 100 do
86+
for i = 1, 10000 do
8487
local name, _, _, _, _, _, isFavorite, _,_,_,_, mountId = C_MountJournal.GetDisplayedMountInfo(i)
8588
if isFavorite then
8689
local listIndex = tIndexOf(expectedMounts,mountId)

Favorites.lua

Lines changed: 55 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,42 @@
11
local _, ADDON = ...
22

33
local function collectFavoredByApi()
4+
local c = 0
45
local mountIds = C_MountJournal.GetMountIDs()
56
local favoredMounts = {}
67
for _, mountId in ipairs(mountIds) do
78
local _, _, _, _, _, _, isFavorite = C_MountJournal.GetMountInfoByID(mountId)
89
if isFavorite then
9-
favoredMounts[#favoredMounts+1] = mountId
10+
c = c + 1
11+
favoredMounts[c] = mountId
1012
end
1113
end
1214

1315
return favoredMounts
1416
end
1517

1618
local backgroundTimer
17-
local function UpdateFavoritesInBackground()
19+
local function cancelBackgroundTask()
1820
if backgroundTimer then
1921
backgroundTimer:Cancel()
2022
end
23+
ADDON.Events:UnregisterFrameEventAndCallback("MOUNT_JOURNAL_SEARCH_UPDATED", 'cleanup-favorite-background')
24+
end
25+
local function UpdateFavoritesInBackground()
26+
cancelBackgroundTask()
2127

2228
local _, _ , favorites = ADDON.Api:GetFavoriteProfile()
23-
local flippedFavorites = CopyValuesAsKeys(favorites)
29+
favorites = tFilter(favorites, function(mountId)
30+
local _, _, _, _, _, _, _, _, _, shouldHideOnChar = C_MountJournal.GetMountInfoByID(mountId)
31+
return not shouldHideOnChar
32+
end)
33+
34+
local flippedFavorites = {}
35+
for _, v in pairs(favorites) do -- CopyValuesAsKeys() somehow created faulty list
36+
flippedFavorites[v] = true
37+
end
2438
local operationCount = #favorites
39+
favorites = nil
2540

2641
local favoredByApi = collectFavoredByApi()
2742

@@ -36,29 +51,52 @@ local function UpdateFavoritesInBackground()
3651
end
3752

3853
if operationCount > 0 then
39-
backgroundTimer = C_Timer.NewTicker(0.4, function()
40-
local toRemove = {}
41-
for mountId, value in pairs(flippedFavorites) do
42-
value = value ~= false
43-
local _, _, _, _, _, _, isFavorite = C_MountJournal.GetMountInfoByID(mountId)
44-
if isFavorite == value then
45-
toRemove[mountId] = mountId
54+
local lastTickMount, tickTryMount = 0, 0
55+
local tickHandler = function()
56+
local mountId, shouldBeFavored = next(flippedFavorites)
57+
if mountId then
58+
if lastTickMount == mountId and tickTryMount >= 3 then
59+
flippedFavorites[mountId] = nil
4660
else
47-
local index = ADDON.Api:MountIdToOriginalIndex(mountId)
61+
if lastTickMount == mountId then
62+
tickTryMount = tickTryMount + 1
63+
else
64+
lastTickMount = mountId
65+
tickTryMount = 1
66+
end
67+
68+
local index = ADDON.Api:MountIdToOriginalIndex(mountId) -- costly call
4869
if index then
49-
C_MountJournal.SetIsFavorite(index, value)
50-
break
70+
local isFavorite = C_MountJournal.GetIsFavorite(index)
71+
if isFavorite == shouldBeFavored then
72+
flippedFavorites[mountId] = nil
73+
else
74+
C_MountJournal.SetIsFavorite(index, shouldBeFavored)
75+
end
5176
end
5277
end
5378
end
54-
for mountId, _ in pairs(toRemove) do
55-
flippedFavorites[mountId] = nil
79+
80+
if TableIsEmpty(flippedFavorites) then
81+
cancelBackgroundTask()
82+
end
83+
end
84+
85+
ADDON.Events:RegisterFrameEventAndCallback("MOUNT_JOURNAL_SEARCH_UPDATED", function()
86+
local mountId, shouldBeFavored = next(flippedFavorites)
87+
if mountId then
88+
local _, _, _, _, _, _, isFavorite = C_MountJournal.GetMountInfoByID(mountId)
89+
if isFavorite == shouldBeFavored then
90+
flippedFavorites[mountId] = nil
91+
end
5692
end
5793

5894
if TableIsEmpty(flippedFavorites) then
59-
backgroundTimer:Cancel()
95+
cancelBackgroundTask()
6096
end
61-
end)
97+
end, 'cleanup-favorite-background')
98+
99+
backgroundTimer = C_Timer.NewTicker(0.4, tickHandler)
62100
end
63101
end
64102

0 commit comments

Comments
 (0)