annotate Dock.lua @ 58:0a9a6740ea5d v2.1

- Discarded use of blizzard functions never meant for the wild (http://forums.wowace.com/showthread.php?t=20397) - Fixed dock buttons not highlighting properly - Fixed dock buttons not dropping after selection change - Mouse input is disabled during player movement
author Nenue
date Tue, 12 Jan 2016 04:50:37 -0500
parents c3166f700438
children 516ceb31703d
rev   line source
Nenue@50 1 --- Devian - Dock.lua
Nenue@32 2 -- @file-author@
Nenue@32 3 -- @project-revision@ @project-hash@
Nenue@32 4 -- @file-revision@ @file-hash@
Nenue@32 5 -- Created: 12/26/2015 12:32 PM
Nenue@50 6 -- Docking and arrangement calls
Nenue@32 7
Nenue@32 8 local D = LibStub("AceAddon-3.0"):GetAddon("Devian")
Nenue@50 9 local ceil, floor, sqrt, pairs, GetScreenWidth, GetScreenHeight = math.ceil, math.floor, math.sqrt, pairs, GetScreenWidth, GetScreenHeight
Nenue@50 10 local UIFrameFadeIn, UIFrameFadeOut = UIFrameFadeIn, UIFrameFadeOut
Nenue@47 11 local db
Nenue@32 12
Nenue@32 13 --- Spaces each frame evenly across the screen.
Nenue@32 14 function D:DistributeFrames() --
Nenue@50 15 local max = self.num_channels
Nenue@50 16 local num_side = ceil(sqrt(max))
Nenue@50 17 local w = GetScreenWidth() / num_side
Nenue@50 18 local h = GetScreenHeight() / num_side
Nenue@50 19 for i, frame in pairs(D.console) do
Nenue@50 20 local dx = (i-1) % num_side
Nenue@50 21 local dy = floor((i-1) / num_side)
Nenue@50 22 frame.width = w
Nenue@50 23 frame.height = h
Nenue@50 24 frame.x = dx * w
Nenue@50 25 frame.y = -(dy * h)
Nenue@50 26 frame:Save()
Nenue@50 27 end
Nenue@32 28 end
Nenue@32 29
Nenue@32 30 --- Place all frames stacked beneath the primary frame.
Nenue@32 31 function D:StackFrames()
Nenue@32 32 local last
Nenue@50 33 for _, frame in pairs(self.console) do
Nenue@32 34 if last then
Nenue@32 35 frame.x = last.x
Nenue@32 36 frame.y = last.y - 20
Nenue@32 37 else
Nenue@32 38 frame.x = (GetScreenWidth()-frame:GetWidth())/2
Nenue@32 39 frame.y = 0
Nenue@32 40 end
Nenue@32 41 frame:Save()
Nenue@32 42 last = frame
Nenue@32 43 end
Nenue@32 44 end
Nenue@32 45
Nenue@32 46
Nenue@50 47 --- Space everything and set the dock size
Nenue@46 48 function D:UpdateDock()
Nenue@47 49 local pad_offset = 12
Nenue@47 50 local draw_offset = pad_offset
Nenue@47 51 for i = 1, #self.dock.buttons do
Nenue@47 52 local d = self.dock.buttons[i]
Nenue@47 53 d:SetPoint('TOPLEFT', DevianDock, 'TOPLEFT', draw_offset, 0)
Nenue@47 54 draw_offset= draw_offset + d:GetWidth() + pad_offset
Nenue@47 55 end
Nenue@50 56 self.dock:SetWidth(draw_offset)
Nenue@50 57 end
Nenue@46 58
Nenue@50 59 --- Updates region visibility as needed
Nenue@50 60 local getFadeInArgs = function(sign, region)
Nenue@50 61 --print('Dvn', region)
Nenue@50 62 local db = D.db
Nenue@50 63 local alph = region:GetAlpha()
Nenue@50 64 local a = (db[sign..'_alpha_on'] - alph)
Nenue@50 65 local b = (db[sign..'_alpha_on']-db[sign..'_alpha_off'])
Nenue@50 66 local dur = (a / b) * db[sign..'_fade_in']
Nenue@50 67 return dur, alph, db[sign..'_alpha_on']
Nenue@50 68 end
Nenue@50 69
Nenue@50 70 local getFadeOutArgs = function(sign, region)
Nenue@50 71 local db = D.db
Nenue@50 72 local alph = region:GetAlpha()
Nenue@50 73 local a = (alph - db[sign..'_alpha_off'])
Nenue@50 74 local b = (db[sign..'_alpha_on']-db[sign..'_alpha_off'])
Nenue@50 75 local dur = (a / b) * db[sign..'_fade_out']
Nenue@50 76 return dur, alph, db[sign..'_alpha_off']
Nenue@50 77 end
Nenue@50 78
Nenue@58 79 local function queueFade (self, duration, from, to)
Nenue@58 80 self:SetAlpha(to)
Nenue@58 81 end
Nenue@58 82
Nenue@50 83 function D.UpdateBeacon(beacon)
Nenue@50 84 local db = D.db
Nenue@58 85 local isActive = (beacon.raised or beacon.selected or beacon.newMessage)
Nenue@50 86 if isActive then
Nenue@58 87 --print(beacon:GetName(), 'active, fade in')
Nenue@58 88 queueFade(beacon, getFadeInArgs('dock_button', beacon))
Nenue@50 89 end
Nenue@58 90
Nenue@50 91 if beacon.showName or isActive then
Nenue@58 92 --print(beacon:GetName(), 'show name, fade in name')
Nenue@58 93 queueFade(beacon.caption, getFadeInArgs('dock_button', beacon.caption))
Nenue@50 94 end
Nenue@50 95
Nenue@50 96 if not isActive then
Nenue@58 97 queueFade(beacon, getFadeOutArgs('dock_button', beacon))
Nenue@50 98 end
Nenue@58 99
Nenue@50 100 if (not beacon.showName) and (not isActive) then
Nenue@58 101 --print(beacon:GetName(), 'no name no active, fade out')
Nenue@58 102 queueFade(beacon.caption,getFadeOutArgs('dock_button', beacon.caption))
Nenue@50 103 end
Nenue@47 104 end
Nenue@47 105
Nenue@58 106 local function FrameFade(frame)
Nenue@58 107 if not D.fader then
Nenue@58 108 D.fader = CreateFrame('Frame', 'DevianFaderFrame', UIParent):CreateAnimationGroup('fader'):CreateAnimation('Alpha', 'FadeIn')
Nenue@58 109 end
Nenue@58 110 end
Nenue@58 111
Nenue@58 112 --- Dock interaction framescript
Nenue@47 113 function D.DockHighlight(beacon)
Nenue@47 114 db = D.db
Nenue@47 115 local self = D.dock
Nenue@58 116 local mouseOverDock = false
Nenue@47 117 if self:IsMouseOver() then
Nenue@47 118 mouseOverDock = true
Nenue@47 119 end
Nenue@47 120
Nenue@58 121 if beacon then
Nenue@58 122 --print(beacon:GetName(), ' highlighter got beacon')
Nenue@47 123 mouseOverDock = true
Nenue@47 124 if not beacon.raised then
Nenue@58 125 --print(beacon:GetName(), ' beacon not raised')
Nenue@47 126 beacon.raised = true
Nenue@50 127 D.UpdateBeacon(beacon)
Nenue@58 128
Nenue@58 129 -- IsMouseOver can still return false during its frame's OnEnter
Nenue@58 130 beacon.inc = 0
Nenue@58 131 beacon:SetScript('OnUpdate', function(self)
Nenue@58 132 if not self:IsMouseOver() then
Nenue@58 133 self.inc = self.inc + 1
Nenue@58 134 --print(self:GetName(),self.inc)
Nenue@58 135 if self.inc > 10 then
Nenue@58 136 --print(self:GetName(), 'lost mouseover, terminating OnUpdate')
Nenue@58 137 self.raised = nil
Nenue@58 138 D.UpdateBeacon(self)
Nenue@58 139 self:SetScript('OnUpdate', nil)
Nenue@58 140 end
Nenue@58 141 end
Nenue@58 142 end)
Nenue@46 143 end
Nenue@47 144 elseif beacon.raised and beacon.index ~= db.current_channel then
Nenue@47 145 beacon.raised = nil
Nenue@50 146 D.UpdateBeacon(beacon)
Nenue@58 147 --beacon:SetScript('OnUpdate', nil)
Nenue@47 148 end
Nenue@46 149
Nenue@47 150 if mouseOverDock then
Nenue@50 151 -- Raise it up
Nenue@47 152 if not self.raised then
Nenue@58 153
Nenue@58 154 self.raised = true
Nenue@58 155 queueFade(self, getFadeInArgs('dock', self))
Nenue@46 156 end
Nenue@47 157 elseif self.raised then
Nenue@50 158 -- Drop it down
Nenue@47 159 self.raised = nil
Nenue@58 160 queueFade(self, getFadeOutArgs('dock', self))
Nenue@58 161 for k, v in pairs(self.buttons) do
Nenue@58 162 v.raised = nil
Nenue@58 163 D.UpdateBeacon(v)
Nenue@58 164 end
Nenue@46 165 end
Nenue@47 166
Nenue@46 167 end