update changes
[QuestHelper.git] / tracker.lua
blob315a0885b436ec32fffea4349035e9cda6731728
1 QuestHelper_File["tracker.lua"] = "Development Version"
2 QuestHelper_Loadtime["tracker.lua"] = GetTime()
4 local tracker = CreateFrame("Frame", "QuestHelperQuestWatchFrame", UIParent)
5 local minbutton = CreateFrame("Button", "QuestHelperQuestWatchFrameMinimizeButton", UIParent)
7 QuestHelper.tracker = tracker
9 tracker:Hide()
10 tracker:SetWidth(200)
11 tracker:SetHeight(100)
12 tracker.dw, tracker.dh = 200, 100
14 local in_tracker = 0
16 minbutton:SetFrameStrata("DIALOG")
17 minbutton:Hide()
18 minbutton:SetPoint("CENTER", QuestWatchFrame) -- We default to a different location to make it more likely to display the right item.
19 minbutton:SetMovable(true)
20 minbutton:SetUserPlaced(true)
21 minbutton:SetWidth(10)
22 minbutton:SetHeight(5)
23 local minbutton_tex = minbutton:CreateTexture()
24 minbutton_tex:SetAllPoints()
25 minbutton_tex:SetTexture(.8, .8, .8)
27 tracker:SetPoint("CENTER", minbutton)
29 function minbutton:moved()
30 local x, y = self:GetCenter()
31 local w, h = UIParent:GetWidth(), UIParent:GetHeight()
32 local anchor = (y < h*.45 and "BOTTOM" or y > h*.55 and "TOP" or "")..(x < w*.45 and "LEFT" or x > w*.55 and "RIGHT" or "")
34 tracker:ClearAllPoints()
35 tracker:SetPoint("CENTER", self)
37 if anchor ~= "" then
38 tracker:SetPoint(anchor, self)
39 end
40 end
42 function QuestHelper:ResetTrackerPosition(cmd)
43 minbutton:ClearAllPoints()
44 if cmd and string.find(cmd, "center") then
45 minbutton:SetPoint("CENTER", nil, "CENTER", 100, 100)
46 else
47 minbutton:SetPoint("RIGHT", nil, "RIGHT", -20, 230)
48 end
49 minbutton:moved()
50 QuestHelper_Pref.track_minimized = false
51 tracker:Show()
52 self:TextOut("Quest tracker postion reset.")
53 end
55 minbutton:SetScript("OnEvent", minbutton.moved)
56 minbutton:RegisterEvent("DISPLAY_SIZE_CHANGED")
57 minbutton:RegisterEvent("PLAYER_ENTERING_WORLD")
59 minbutton:SetScript("OnClick", function ()
60 QuestHelper_Pref.track_minimized = not QuestHelper_Pref.track_minimized
61 if QuestHelper_Pref.track_minimized then
62 tracker:Hide()
63 else
64 tracker:Show()
65 end
66 end)
68 minbutton:RegisterForDrag("LeftButton")
70 minbutton:SetScript("OnDragStart", function(self)
71 if self:IsVisible() then
72 self:StartMoving()
73 self:SetScript("OnUpdate", self.moved)
74 end
75 end)
77 minbutton:SetScript("OnDragStop", function(self)
78 self:SetScript("OnUpdate", nil)
79 self:StopMovingOrSizing()
80 self:moved()
81 end)
83 minbutton:SetScript("OnEnter", function (self)
84 self:SetAlpha(1)
85 end)
87 minbutton:SetScript("OnLeave", function (self)
88 self:SetAlpha(QuestHelper_Pref.track_minimized and .3 or .5)
89 end)
91 local unused_items = {}
92 local used_items = {}
94 local function itemupdate(item, delta)
95 local done = true
97 local a = item:GetAlpha()
98 a = a + delta
100 if a < 1 then
101 item:SetAlpha(a)
102 done = false
103 else
104 item:SetAlpha(1)
107 local t = item.t + delta
109 if t < 1 then
110 item.t = t
111 local it = 1-t
112 local sp = math.sqrt(t-t*t)
113 item.x, item.y = item.sx*it+item.dx*t+(item.sy-item.dy)*sp, item.sy*it+item.dy*t+(item.dx-item.sx)*sp
114 done = false
115 else
116 item.t = 1
117 item.x, item.y = item.dx, item.dy
120 item:ClearAllPoints()
121 item:SetPoint("TOPLEFT", tracker, "TOPLEFT", item.x, item.y)
123 if done then
124 item:SetScript("OnUpdate", nil)
128 local function itemfadeout(item, delta)
129 local a = item:GetAlpha()
130 a = a - delta
132 if a > 0 then
133 item:SetAlpha(a)
134 else
135 item:SetAlpha(1)
136 item:Hide()
137 item:SetScript("OnUpdate", nil)
138 return
141 local t = item.t + delta
143 if t < 1 then
144 item.t = t
145 local it = 1-t
146 local sp = math.sqrt(t-t*t)
147 item.x, item.y = item.sx*it+item.dx*t+(item.sy-item.dy)*sp, item.sy*it+item.dy*t+(item.dx-item.sx)*sp
148 else
149 item.t = 1
150 item.x, item.y = item.dx, item.dy
153 item:ClearAllPoints()
154 item:SetPoint("TOPLEFT", tracker, "TOPLEFT", item.x, item.y)
157 function QH_ToggleQuestLog() -- This seems to be gone in 3.0, so I'm adding it here.
158 if (QuestLogFrame:IsShown()) then
159 HideUIPanel(QuestLogFrame);
160 else
161 ShowUIPanel(QuestLogFrame);
166 local function itemclick(item, button)
167 if button == "RightButton" then
168 local quest = item.quest
169 local index = 1
170 while true do
171 local title = GetQuestLogTitle(index)
172 if not title then break end
174 if title == quest then
175 if UberQuest then
176 -- UberQuest needs a little extra effort to work properly.
178 if UberQuest_List:IsShown() and GetQuestLogSelection() == index then
179 QH_ToggleQuestLog()
180 else
181 QuestLog_SetSelection(index)
183 -- By hiding the list, the replaced ToggleQuestLog function should try to reshow it
184 -- and in the process update the frames to reflect the selected quest.
185 UberQuest_List:Hide()
186 UberQuest_Details:Show()
187 QH_ToggleQuestLog()
189 else
190 -- This code seems to work properly with the builtin questlog, as well as bEQL and DoubleWide.
192 if QuestLogFrame:IsShown() and GetQuestLogSelection() == index then
193 -- If the selected quest is already being shown, hide it.
194 QH_ToggleQuestLog()
195 else
196 -- Otherwise, select it and show it.
197 QuestLog_SetSelection(index)
199 if not QuestLogFrame:IsShown() then
200 QH_ToggleQuestLog()
205 return
208 index = index + 1
213 local specitem_max = 1
214 local specitem_unused = {}
216 local function addItem(name, quest, obj, y, qname, qindex)
217 local x = qname and 4 or 20
218 local item = used_items[quest] and used_items[quest][obj]
219 if not item then
220 item = next(unused_items)
221 if item then
222 unused_items[item] = nil
223 else
224 item = CreateFrame("Frame", nil, tracker)
225 item.text = item:CreateFontString()
226 item.text:SetShadowColor(0, 0, 0, .8)
227 item.text:SetShadowOffset(1, -1)
228 item.text:SetPoint("TOPLEFT", item)
231 if qname then
232 item.text:SetFont(QuestHelper.font.serif, 12)
233 item.text:SetTextColor(.82, .65, 0)
234 else
235 item.text:SetFont(QuestHelper.font.sans, 12)
236 item.text:SetTextColor(.82, .82, .82)
239 if not used_items[quest] then used_items[quest] = {} end
241 used_items[quest][obj] = item
242 item.sx, item.sy, item.x, item.y, item.dx, item.dy, item.t = x+30, y, x, y, x, y, 0
243 item:SetScript("OnUpdate", itemupdate)
244 item:SetAlpha(0)
245 item:Show()
248 item.used = true
250 item.quest = qname
251 item.text:SetText(name)
252 local w, h = item.text:GetWidth(), item.text:GetHeight()
253 item:SetWidth(w)
254 item:SetHeight(h)
256 if qname then
257 item:SetScript("OnMouseDown", itemclick)
258 item:EnableMouse(true)
261 if item.dx ~= x or item.dy ~= y then
262 item.sx, item.sy, item.dx, item.dy = item.x, item.y, x, y
263 item.t = 0
264 item:SetScript("OnUpdate", itemupdate)
267 if GetQuestLogSpecialItemInfo and qindex and GetQuestLogSpecialItemInfo(qindex) and not item.specitem then -- 3.1 hackery
268 item.specitem = table.remove(specitem_unused)
269 if not item.specitem then
270 item.specitem = CreateFrame("BUTTON", "QH_SpecItem_" .. tostring(specitem_max), item, "WatchFrameItemButtonTemplate")
271 specitem_max = specitem_max + 1
272 QuestHelper: Assert(item.specitem)
275 item.specitem:SetScale(0.9)
276 item.specitem:ClearAllPoints()
277 item.specitem:SetPoint("TOPRIGHT", item, "TOPLEFT", 0, 0)
279 item.specitem:SetID(obj.index)
281 local _, tex = GetQuestLogSpecialItemInfo(obj.index)
282 SetItemButtonTexture(item.specitem, tex)
283 item.specitem.rangeTimer = -1 -- This makes the little dot go away. Why does it do that?
285 item.specitem:Show()
288 return w+x+4, h
291 local function ccode(r1, g1, b1, r2, g2, b2, p)
292 local ip
293 p, ip = p*255, 255-p*255
294 return string.format("|cff%02x%02x%02x", r1*ip+r2*p, g1*ip+g2*p, b1*ip+b2*p)
297 local function qname(title, level)
298 if QuestHelper_Pref.track_level and level ~= 7777 and level ~= 7778 then
299 title = string.format("[%d] %s", level, title)
302 if level == 7778 then
303 level = -7778
306 if QuestHelper_Pref.track_qcolour then
307 local player_level = QuestHelper.player_level
308 local delta = level - player_level
310 local colour
312 if delta >= 5 then
313 colour = "|cffff0000"
314 elseif delta >= 0 then
315 colour = ccode(1, 1, 0, 1, 0, 0, delta/5)
316 else
317 local grey
319 if player_level >= 60 then grey = player_level - 9
320 elseif player_level >= 40 then grey = player_level - math.floor(player_level/5) - 1
321 elseif player_level >= 6 then grey = player_level - math.floor(player_level/10) - 5
322 else grey = 0 end
324 if level == -7778 then
325 colour = "|cff808080"
326 elseif level > grey then
327 colour = ccode(0, 1, 0, 1, 1, 0, (grey-level)/(grey-player_level))
328 else
329 colour = ccode(.4, .4, .4, .2, .8, .2, (1-level)/(1-grey))
333 title = string.format("%s%s", colour, title)
336 return title
339 local function oname(text, pct)
340 if QuestHelper_Pref.track_ocolour then
341 text = string.format("%s%s", pct < 0.5 and ccode(1, 0, 0, 1, 1, 0, pct*2) or ccode(1, 1, 0, 0, 1, 0, pct*2-1), text)
344 return text
347 local function removeUnusedItem(quest, obj, item)
348 unused_items[item] = true
349 used_items[quest][obj] = nil
350 if not next(used_items[quest]) then used_items[quest] = nil end
351 item.used = false
352 item.t = 0
353 item.sx, item.sy = item.x, item.y
354 item.dx, item.dy = item.x+30, item.y
355 item:SetScript("OnMouseDown", nil)
356 item:EnableMouse(false)
357 item:SetScript("OnUpdate", itemfadeout)
359 if item.specitem then
360 item.specitem:Hide()
361 table.insert(specitem_unused, item.specitem)
362 item.specitem = nil
366 local resizing = false
367 local check_delay = 4
368 local seen = {}
369 local obj_list = {}
370 local obj_index_lookup = {}
371 local quest_lookup = {}
372 local was_inside = false
374 local function watched_filter(obj)
375 return obj:IsWatched()
378 local function objlist_sort(a, b)
379 return (obj_index_lookup[a] or 0) < (obj_index_lookup[b] or 0)
382 function tracker:reset()
383 for quest, objs in pairs(used_items) do
384 for obj, item in pairs(objs) do
385 removeUnusedItem(quest, obj, item)
386 check_delay = 1e99
391 local function addobj(objective, seen, obj_index_lookup, filter, x, y, gap)
392 local count = 0
393 local quest
395 if objective.cat == "quest" then
396 quest = objective
397 else
398 quest = objective.quest
401 if quest and quest.watched and not seen[quest] and (not filter or filter(quest)) then
402 seen[quest] = true
404 local level, name = string.match(quest.obj, "^(%d+)/%d*/(.*)$")
406 if not level then
407 level, name = string.match(quest.obj, "^(%d+)/(.*)$")
408 if not level then
409 level, name = 1, quest.obj
413 level = tonumber(level) or 1
415 count = count + 1
416 local w, h = addItem(qname(name, level), true, quest, -(y+gap), name, quest.index)
417 x = math.max(x, w)
418 y = y + h + gap
419 gap = 2
421 for obj in pairs(quest.swap_after or quest.after) do
422 if obj.progress then
423 table.insert(obj_list, obj)
427 table.sort(obj_list, objlist_sort)
429 for i, obj in ipairs(obj_list) do
430 local pct, text = 0, obj.obj
431 local seen_sum, seen_max = 0, 0
433 if obj.progress then
434 local seen_have, seen_need = QuestHelper:CreateTable(), QuestHelper:CreateTable()
436 for user, progress in pairs(obj.progress) do
437 seen_sum = seen_sum + progress[3]
438 seen_max = seen_max + 1
439 seen_have[progress[1]] = true
440 seen_need[progress[2]] = true
443 if seen_max > 0 then
444 pct = seen_sum / seen_max
445 local list = QuestHelper:CreateTable()
447 for val in pairs(seen_have) do
448 table.insert(list, val)
451 table.sort(list)
453 local have = table.concat(list, ", ")
455 for i = #list,1,-1 do
456 list[i] = nil
459 for val in pairs(seen_need) do
460 table.insert(list, val)
463 if #list ~= 1 or list[1] ~= 1 then
464 -- If there is only one thing needed, ignore the progress, it's redundant.
465 -- It's either shown or it isn't.
467 table.sort(list)
469 local need = table.concat(list, ", ")
471 text = string.format((tonumber(have) and tonumber(need) and QUEST_ITEMS_NEEDED) or QUEST_FACTION_NEEDED,
472 text, have, need)
475 QuestHelper:ReleaseTable(list)
478 QuestHelper:ReleaseTable(seen_have)
479 QuestHelper:ReleaseTable(seen_need)
482 if seen_sum ~= seen_max then
483 count = count + 1
484 w, h = addItem(oname(text, pct), quest, obj, -y)
485 x = math.max(x, w)
486 y = y + h
490 for i = #obj_list, 1, -1 do obj_list[i] = nil end
493 return x, y, gap, count
496 local loading_vquest = { cat = "quest", obj = "7777/" .. QHFormat("QH_LOADING", "0"), after = {}, watched = true }
497 local hidden_vquest1 = { cat = "quest", obj = "7778/" .. QHText("QUESTS_HIDDEN_1"), after = {}, watched = true }
498 local hidden_vquest2 = { cat = "quest", obj = "7778/ " .. QHText("QUESTS_HIDDEN_2"), after = {}, watched = true }
500 function tracker:update(delta)
501 if not delta then
502 -- This is called without a value when the questlog is updated.
503 -- We'll make sure we update the display on the next update.
504 check_delay = 1e99
505 return
508 if resizing then
509 local t = self.t+delta
511 if t > 1 then
512 self:SetWidth(self.dw)
513 self:SetHeight(self.dh)
514 resizing = false
515 else
516 self.t = t
517 local it = 1-t
518 self:SetWidth(self.sw*it+self.dw*t)
519 self:SetHeight(self.sh*it+self.dh*t)
523 -- Manually checking if the mouse is in the frame, because if I used on OnEnter, i'd have to enable mouse input,
524 -- and if I did that, it would prevent the player from using the mouse to change the view if they clicked inside
525 -- the tracker.
526 local x, y = GetCursorPosition()
527 local s = 1/self:GetEffectiveScale()
528 x, y = x*s, y*s
530 QuestHelper: Assert(x)
531 QuestHelper: Assert(y)
532 --[[ QuestHelper: Assert(self:GetLeft())
533 QuestHelper: Assert(self:GetBottom())
534 QuestHelper: Assert(self:GetRight())
535 QuestHelper: Assert(self:GetTop())]]
537 -- Sometimes it just doesn't know its own coordinates. Not sure why. Maybe this will fix it.
538 local inside = (self:GetLeft() and (x >= self:GetLeft() and y >= self:GetBottom() and x < self:GetRight() and y < self:GetTop()))
539 if inside ~= was_inside then
540 was_inside = inside
541 if inside then
542 minbutton:SetAlpha(.7)
543 elseif not QuestHelper_Pref.track_minimized then
544 minbutton:SetAlpha(0)
548 check_delay = check_delay + delta
549 if check_delay > 5 or (not QuestHelper.Routing.map_walker and check_delay > 0.5) then
550 check_delay = 0
552 local quests = QuestHelper.quest_log
553 local added = 0
554 local x, y = 4, 4
555 local gap = 0
556 local track_size = QuestHelper_Pref.track_size
557 local quests_added = {}
559 for quest, objs in pairs(used_items) do
560 for obj, item in pairs(objs) do
561 item.used = false
565 for i, objective in pairs(QuestHelper.route) do
566 if objective.watched then
567 obj_index_lookup[objective] = i
571 for q, data in pairs(QuestHelper.quest_log) do
572 quest_lookup[data.index] = q
575 -- Add our little "not yet loaded" notification
576 local loadedshow = false
577 if not QuestHelper.Routing.map_walker then
578 local count
579 x, y, gap, count = addobj(loading_vquest, seen, nil, nil, x, y, gap)
580 added = added + count
581 loadedshow = true
583 if QuestHelper_Flight_Updates and QuestHelper_Flight_Updates_Current and QuestHelper_Flight_Updates > 0 and QuestHelper_Flight_Updates_Current < QuestHelper_Flight_Updates then
584 loading_vquest.obj = string.format("7777/" .. QHFormat("QH_LOADING", string.format("%d", QuestHelper_Flight_Updates_Current * 100 / QuestHelper_Flight_Updates)))
588 -- Add an extra large gap to seperate the notification from everything else
589 gap = gap * 5
591 -- Add Quests that are watched but not in the route.
592 if UberQuest then
593 local uq_settings = UberQuest_Config[UnitName("player")]
594 if uq_settings then
595 local list = uq_settings.selected
596 if list then
597 local i = 1
598 while true do
599 local name = GetQuestLogTitle(i)
600 if not name then break end
601 quest_lookup[name] = quest_lookup[i]
602 i = i + 1
604 for name in pairs(list) do
605 local q = quest_lookup[name]
606 if q and not obj_index_lookup[q] then
607 local count
608 x, y, gap, count = addobj(q, seen, obj_index_lookup, nil, x, y, gap)
609 added = added + count
610 quests_added[q] = true
615 else
616 for i = 1,GetNumQuestWatches() do
617 local q = quest_lookup[GetQuestIndexForWatch(i)]
618 if q and not obj_index_lookup[q] then
619 local count
620 x, y, gap, count = addobj(q, seen, obj_index_lookup, nil, x, y, gap)
621 added = added + count
626 -- Add Quests that are watched and are in the route.
627 for i, objective in ipairs(QuestHelper.route) do
628 local count
629 x, y, gap, count = addobj(objective, seen, obj_index_lookup, watched_filter, x, y, gap)
630 added = added + count
631 quests_added[objective] = true
634 -- Add an extra large gap to seperate the watched objectives from the automatic objectives.
635 gap = gap * 5
637 -- Add Quests that aren't watched and are in the route.
638 if added <= track_size then
639 for i, objective in ipairs(QuestHelper.route) do
640 local count
641 x, y, gap, count = addobj(objective, seen, obj_index_lookup, nil, x, y, gap)
642 added = added + count
643 quests_added[objective] = true
645 if added > track_size then
646 break
651 if not loadedshow and added < track_size and not QuestHelper_Pref.filter_done and not QuestHelper_Pref.filter_zone and not QuestHelper_Pref.filter_watched then
652 local added = 0
653 local notadded = 0
654 for k, v in pairs(quest_lookup) do
655 if not quests_added[v] then
656 notadded = notadded + 1
657 else
658 added = added + 1
662 if notadded > 0 then
663 gap = gap * 10
664 x, y, gap, count = addobj(hidden_vquest1, seen, nil, nil, x, y, gap)
665 added = added + count
666 x, y, gap, count = addobj(hidden_vquest2, seen, nil, nil, x, y, gap)
667 added = added + count
671 for obj in pairs(obj_index_lookup) do
672 obj_index_lookup[obj] = nil
675 for key in pairs(quest_lookup) do
676 quest_lookup[key] = nil
679 for quest, objs in pairs(used_items) do
680 for obj, item in pairs(objs) do
681 if not item.used then
682 removeUnusedItem(quest, obj, item)
687 for key in pairs(seen) do
688 seen[key] = nil
691 y = y+4
693 if x ~= tracker.dw or y ~= tracker.dy then
694 tracker.t = 0
695 tracker.sw, tracker.sh = tracker:GetWidth(), tracker:GetHeight()
696 tracker.dw, tracker.dh = x, y
697 resizing = true
700 added = 0
704 tracker:SetScript("OnUpdate", tracker.update)
706 -- Some hooks to update the tracker when quests are added or removed.
707 local orig_AddQuestWatch, orig_RemoveQuestWatch = AddQuestWatch, RemoveQuestWatch
709 function AddQuestWatch(...)
710 tracker:update()
711 return orig_AddQuestWatch(...)
714 function RemoveQuestWatch(...)
715 tracker:update()
716 return orig_RemoveQuestWatch(...)
719 -------------------------------------------------------------------------------------------------
720 -- This batch of stuff is to make sure the original tracker (and any modifications) stay hidden
722 local orig_TrackerOnShow
723 if QuestWatchFrame then -- 3.1 hackery
724 orig_TrackerOnShow = QuestWatchFrame:GetScript("OnShow")
726 local orig_TrackerBackdropOnShow -- bEQL (and perhaps other mods) add a backdrop to the tracker
727 local TrackerBackdropFound = false
729 local function TrackerBackdropOnShow(self, ...)
730 if QuestHelper_Pref.track and not QuestHelper_Pref.hide then
731 TrackerBackdropFound:Hide()
734 if orig_TrackerBackdropOnShow then
735 return orig_TrackerBackdropOnShow(self, ...)
739 function tracker:HideDefaultTracker()
740 -- The easy part: hide the original tracker
741 if QuestWatchFrame then -- 3.1 hackery
742 QuestWatchFrame:Hide()
743 else
744 WatchFrame_RemoveObjectiveHandler(WatchFrame_DisplayTrackedQuests)
745 WatchFrame_ClearDisplay()
746 WatchFrame_Update()
749 -- The harder part: check if a known backdrop is present (but we don't already know about it).
750 -- If it is, make sure it's hidden, and hook its OnShow to make sure it stays that way.
751 -- Unfortunately, I can't figure out a good time to check for this once, so we'll just have
752 -- to keep checking. Hopefully, this won't happen too often.
753 if not TrackerBackdropFound then
754 if QuestWatchFrameBackdrop then
755 -- Found bEQL's QuestWatchFrameBackdrop...
756 TrackerBackdropFound = QuestWatchFrameBackdrop
759 if TrackerBackdropFound then
760 -- OK, we found something - so hide it, and make sure it doesn't rear its ugly head again
761 TrackerBackdropFound:Hide()
763 orig_TrackerBackdropOnShow = TrackerBackdropFound:GetScript("OnShow")
764 TrackerBackdropFound:SetScript("OnShow", TrackerBackdropOnShow)
769 function tracker:ShowDefaultTracker()
770 if QuestWatchFrame then -- 3.1 hackery
771 QuestWatchFrame:Show()
772 -- Make sure the default tracker is up to date on what what's being watched and what isn't.
773 QuestWatch_Update()
774 else
775 -- I like how there's code explicitly to allow us to do this without checking if it's already added
776 WatchFrame_AddObjectiveHandler(WatchFrame_DisplayTrackedQuests)
777 -- Make sure the default tracker is up to date on what what's being watched and what isn't.
778 WatchFrame_Update()
781 if TrackerBackdropFound then
782 TrackerBackdropFound:Show()
786 if QuestWatchFrame then -- 3.1 hackery
787 local function QuestWatchFrameOnShow(self, ...)
788 if QuestHelper_Pref.track and not QuestHelper_Pref.hide then
789 tracker:HideDefaultTracker()
792 if orig_TrackerOnShow then
793 return orig_TrackerOnShow(self, ...)
797 QuestWatchFrame:SetScript("OnShow", QuestWatchFrameOnShow)
800 function QuestHelper:ShowTracker()
801 tracker:HideDefaultTracker()
802 minbutton:Show()
804 if QuestHelper_Pref.track_minimized then
805 minbutton:SetAlpha(.3)
806 else
807 minbutton:SetAlpha(0)
808 tracker:Show()
812 function QuestHelper:HideTracker()
813 tracker:ShowDefaultTracker()
814 tracker:Hide()
815 minbutton:Hide()