comparison ObjectiveTracker/Frame.lua @ 39:92534dc793f2

- restore the previous QuestLogSelection after pulling for selection-restricted quest data; fixes icon mixups while quest map is open - moved progressbar builders into the schema environment, with all the other Frame.lua functions; prep for configuration access - relegate the various removal events to a framescript in their corresponding blocks; this takes care of resolving dead frames
author Nenue
date Thu, 21 Apr 2016 16:43:37 -0400
parents 1f8f9cc3d956
children
comparison
equal deleted inserted replaced
38:1f8f9cc3d956 39:92534dc793f2
1 --- ${PACKAGE_NAME} 1 --- ${PACKAGE_NAME}
2 -- @file-author@ 2 -- @file-author@
3 -- @project-revision@ @project-hash@ 3 -- @project-revision@ @project-hash@
4 -- @file-revision@ @file-hash@ 4 -- @file-revision@ @file-hash@
5 -- Created: 3/30/2016 12:49 AM 5 -- Created: 3/30/2016 12:49 AM
6 --- Everything that involves directly placing elements on the screen goes here. Sizing, spacing, tiling, etc.
6 local B = select(2,...).frame 7 local B = select(2,...).frame
7 local T = B:RegisterModule("ObjectiveTracker", _G.VeneerObjectiveWrapper, 'BuffFrame') 8 local T = B:RegisterModule("ObjectiveTracker", _G.VeneerObjectiveWrapper, 'BuffFrame')
8 local _G, ipairs, max, min, unpack, floor, pairs, tostring, type, band = _G, ipairs, max, min, unpack, floor, pairs, tostring, type, bit.band 9 local _G, ipairs, max, min, unpack, floor, pairs, tostring, type, band = _G, ipairs, max, min, unpack, floor, pairs, tostring, type, bit.band
9 local IsResting, UnitXP, UnitXPMax, GetXPExhaustion, tinsert, tremove = IsResting, UnitXP, UnitXPMax, GetXPExhaustion, table.insert, table.remove 10 local IsResting, UnitXP, UnitXPMax, GetXPExhaustion, tinsert, tremove = IsResting, UnitXP, UnitXPMax, GetXPExhaustion, table.insert, table.remove
10 local UnitLevel, IsQuestWatched, UIParent = UnitLevel, IsQuestWatched, UIParent 11 local UnitLevel, IsQuestWatched, UIParent = UnitLevel, IsQuestWatched, UIParent
65 local titleFont, titleSize, titleOutline = [[Interface\Addons\SharedMedia_MyMedia\font\ArchivoNarrow-Bold.ttf]], 16, 'OUTLINE' 66 local titleFont, titleSize, titleOutline = [[Interface\Addons\SharedMedia_MyMedia\font\ArchivoNarrow-Bold.ttf]], 16, 'OUTLINE'
66 local titleColor = {0,.7,1,1} 67 local titleColor = {0,.7,1,1}
67 68
68 local textbg = {'HORIZONTAL', 0, 0, 0, 0.4, 0, 0, 0, 0 } 69 local textbg = {'HORIZONTAL', 0, 0, 0, 0.4, 0, 0, 0, 0 }
69 local textFont, textSize, textOutline = [[Interface\Addons\SharedMedia_MyMedia\font\ArchivoNarrow-Regular.ttf]], 16, 'OUTLINE' 70 local textFont, textSize, textOutline = [[Interface\Addons\SharedMedia_MyMedia\font\ArchivoNarrow-Regular.ttf]], 16, 'OUTLINE'
70 local textColor = {1,1,1,1} 71 local textColor = {1,1,1,1 }
72
73 local widgetTextFont, widgetTextSize, widgetTextOutline = [[Interface\Addons\SharedMedia_MyMedia\font\XOIREQE.TTF]], 11, 'OUTLINE'
74 local widgetTextColor = {1,1,1,1 }
75 local widgetHeight, widgetBorder = 17, 1
76
71 77
72 local selectionbg = {'HORIZONTAL', 1, 1, 1, 0, 1, 1, 1, 0.225} 78 local selectionbg = {'HORIZONTAL', 1, 1, 1, 0, 1, 1, 1, 0.225}
73 local titleSpacing, textSpacing, blockSpacing = 3, 3, 1 79 local titleSpacing, textSpacing, blockSpacing = 3, 3, 1
74 local titleIndent, textIndent,selectionIndent = 2, 5, 50 80 local titleIndent, textIndent,selectionIndent = 2, 5, 50
75 --- END SCHEMA 81 --- END SCHEMA
123 rewardSize = c.rewardSize 129 rewardSize = c.rewardSize
124 blockSchema = newSchema 130 blockSchema = newSchema
125 elseif layer == 'line' then 131 elseif layer == 'line' then
126 textColor = c.textColor 132 textColor = c.textColor
127 lineSchema = newSchema 133 lineSchema = newSchema
134 elseif layer == 'widget' then
135 widgetTextColor = c.textSpacing
136 widgetTextFont, widgetTextSize, widgetTextOutline = unpack(c.textFont)
128 end 137 end
129 tprint('|cFFFF0088 Schema:|r', layer, lastSchema[layer], '->', newSchema) 138 tprint('|cFFFF0088 Schema:|r', layer, lastSchema[layer], '->', newSchema)
130 end 139 end
131 -- todo: figure out why objectives go invisible 140 -- todo: figure out why objectives go invisible
132 local anchorPoint, anchorFrame 141 local anchorPoint, anchorFrame
612 Wrapper:Show() 621 Wrapper:Show()
613 Scroller:Show() 622 Scroller:Show()
614 Scroll:Show() 623 Scroll:Show()
615 end 624 end
616 625
626
627 -----------------------------------------
628 -- Criteria frames
629
630 --[[
631 text = description,
632 type = type,
633 finished = completed,
634 quantity = quantity,
635 requiredQuantity = requiredQuantity,
636 characterName = characterName,
637 flags = flags,
638 assetID = assetID,
639 quantityString = quantityString,
640 criteriaID = criteriaID,
641 ]]
642 local newWidgetID = 0
643 T.WidgetRegistry = {}
644 local wr = T.WidgetRegistry
645
646 --- Get a usable widget for the given achievement criteria set.
647 -- Returns a frame object with dimensioning parameters needed to size the receiving tracker block
648 T.GetWidget = function(data, objectiveType, objectiveKey)
649 local print = B.print('ObjectiveWidgets')
650 local widgetType = objectiveType
651 local widget
652 local isNew
653 if wr[widgetType] and wr[widgetType].used[objectiveKey] then
654 widget = wr[widgetType].used[objectiveKey]
655 print('|cFF00FF00Updating ('..objectiveKey..')', widget)
656 elseif not wr[widgetType] or #wr[widgetType].free == 0 then
657 -- creating a new frame
658 isNew = true
659 widget = CreateFrame(widgetType, 'VeneerObjective' .. widgetType .. (wr[widgetType] and (wr[widgetType].lastn+1) or (1)), VeneerObjectiveScroll, 'VeneerObjectiveCriteria' .. widgetType)
660 print('|cFFFF0088Creating `'..widget:GetName()..'` id', wr[widgetType].lastn)
661 T.UpdateSchema(widgetType, data.schema or 'default')
662 else
663 -- recycling for a different criteria set
664 isNew = true
665 widget = tremove(wr[widgetType].free)
666 print('|cFFFFFF00Acquiring released widget', widget:GetName())
667 end
668
669
670 wr[widgetType].used[objectiveKey] = widget
671 widget.objective = data
672 widget.key = objectiveKey
673 T.InitializeWidget(widget, isNew)
674 return widget
675 end
676
677 --- WidgetTemplate 'OnLoad'
678 T.RegisterWidget = function(frame)
679 local print = B.print('ObjectiveWidgets')
680 local widgetType = frame.widgetType
681 if not wr[frame.widgetType] then
682 print('|cFFFF4400[[WidgetTemplate]]|r', widgetType)
683 wr[widgetType] = { lastn = 1, free = {}, used = {}, usedIndex = {}, freeIndex = {} }
684 else
685 print('|cFF0088FF+ [[WidgetTemplate]]r', widgetType, wr[widgetType].lastn)
686 wr[widgetType].lastn = wr[widgetType].lastn + 1
687 end
688 end
689 --- WidgetTemplate 'OnShow'
690 local wrapperWidth, textIndent
691 T.InitializeWidget = setmetatable({}, {
692 __call = function(t, frame, isNew, ...)
693 -- todo: config pull
694 if not wrapperWidth then
695 wrapperWidth = T.Conf.Wrapper.Width
696 textIndent = T.Conf.Wrapper.TextIndent
697 end
698
699 tprint('Initialize', frame:GetName(), isNew, ...)
700 frame:SetWidth(wrapperWidth - textIndent * 2)
701 frame:SetScript('OnEvent', T.UpdateWidget[frame.widgetType])
702 frame:RegisterEvent('QUEST_LOG_UPDATE')
703 frame:RegisterEvent('TRACKED_ACHIEVEMENT_UPDATE')
704 frame:RegisterEvent('TRACKED_ACHIEVEMENT_LIST_CHANGED')
705 frame:RegisterEvent('CRITERIA_UPDATE')
706 frame:RegisterEvent('CRITERIA_COMPLETE')
707 frame:RegisterEvent('CRITERIA_EARNED')
708 t[frame.widgetType](frame, isNew)
709 T.UpdateWidget[frame.widgetType](frame, isNew)
710 end,
711 })
712
713 --- WidgetTemplate 'OnEvent'
714 T.UpdateWidget = setmetatable({}, {
715 __call = function(t, frame, isNew, ...)
716 tprint('Update', frame:GetName(), isNew, ...)
717 if not frame.widgetType then
718 return
719 end
720
721 return t[frame.widgetType](frame, isNew)
722 end
723 })
724
725
726 local progressHeight = 17
727 local progressBorder = 1
728 local progressFont = _G.VeneerCriteriaFontNormal
729
730 local lprint = B.print('Line')
731 T.InitializeWidget.StatusBar = function(self, isNew)
732 local print = lprint
733 local c = T.Conf.Wrapper
734
735 tprint(self:GetName(), isNew)
736 if isNew then
737 self.maxValue = self.maxValue or 1
738 self:SetMinMaxValues(0, self.maxValue)
739
740 self:SetHeight(widgetHeight)
741 self.height = widgetHeight
742
743 self.status:SetFont(widgetTextFont, widgetTextSize, widgetTextOutline)
744 self.status:SetTextColor(unpack(widgetTextColor))
745 end
746 self.value = self.value or 1
747 self:SetValue(self.value)
748
749 self.status:SetText(self.objective.quantityString)
750 end
751
752 T.UpdateWidget.StatusBar = function (self)
753 local value, maxValue = self.value, self.maxValue
754 print('update vals:')
755 for k,v in pairs(self) do
756 print(k, v)
757 end
758 self.width = self.width or self:GetWidth()
759 self:SetValue(self.value)
760 local format = self.format or '%d/%d'
761 self.status:SetFormattedText(format, value, maxValue)
762 local progress = (value / maxValue)
763 if progress > 0 then
764 print('color:', 1-progress*2 , progress*2 - 1,0,1)
765 print('width:', (self.width -progressBorder * 2) * progress)
766 self:SetStatusBarColor(1-progress*2 , progress*2,0,1)
767 end
768 end
769
770
771 T.InitializeWidget.Hidden = function (self)
772 self.height = 0
773 end
774 T.UpdateWidget.Hidden = function (self)
775 self.height= 0
776 end
777
778
779 --- Queue any active item buttons for update for that frame
780 local iprint = B.print('ItemButton')
781 local Quest = T.Quest
782 local IsQuestWatched, InCombatLockdown = IsQuestWatched, InCombatLockdown
783 T.UpdateActionButtons = function(updateReason)
784 local print = iprint
785 Scroller.snap_upper = 0
786 Scroller.snap_lower = 0
787 local print = B.print('ItemButton')
788 if updateReason then
789 print = B.print('IB_'..updateReason)
790 end
791
792 local previousItem
793 for questID, itemButton in pairs(Quest.itemButtons) do
794 local info= T.Quest.Info[questID]
795
796 print('|cFF00FFFF'.. questID .. '|r', itemButton:GetName())
797 local block = T.Quest.QuestBlock[questID]
798 if block then
799 -- Dispatch the probe
800 if IsQuestWatched(info.logIndex) then
801 itemButton.previousItem = previousItem
802 print(' |cFFFFFF00probing', block:GetName())
803 block:SetScript('OnUpdate', function()
804 if block:GetBottom() and not InCombatLockdown() then
805 print(' '..block:GetName()..' |cFF00FF00probe hit!')
806 T.UpdateBlockAction(block, itemButton, itemButton.previousItem) -- needs to be previousItem from this scope
807 block:SetScript('OnUpdate', nil)
808
809 end
810 end)
811 previousItem = itemButton
812 else
813 print('hidden block or unwatched quest')
814 itemButton.previousItem = nil
815 itemButton:Hide()
816 end
817 elseif itemButton:IsVisible() then
818 print(' |cFFFF0088hiding unwatched quest button', itemButton:GetName())
819 itemButton.previousItem = nil
820 itemButton:Hide()
821 else
822 print(' |cFFBBBBBBignoring hidden log quest button', itemButton:GetName())
823 end
824 end
825 end