annotate Dock.lua @ 70:d73b883b415b

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