annotate Dock.lua @ 73:3745540e8996 v2.1.74

- New commands: - /dvn remove (index|tag) will remove a channel from the current profile - /dvncolors resets the tag color cache - Fixed an issue with creating more than one output channel per UI session. - Performance improvements: - Color caching now ignores decimal timestamps, removing a source of cache bloat - Cleaned up a bunch of global variable use in many areas
author Nenue
date Sat, 09 Apr 2016 06:34:04 -0400
parents 516ceb31703d
children f6fae1a4c66c
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@73 50
Nenue@73 51 local dockn = 1
Nenue@73 52 for i, d in pairs(self.dock.buttons) do
Nenue@73 53 dockn = max(i, dockn)
Nenue@73 54 end
Nenue@73 55 for i = 1, dockn do
Nenue@47 56 local d = self.dock.buttons[i]
Nenue@73 57 if d then
Nenue@73 58 d:SetPoint('TOPLEFT', DevianDock, 'TOPLEFT', draw_offset, 0)
Nenue@73 59 draw_offset= draw_offset + d:GetWidth() + pad_offset
Nenue@73 60 end
Nenue@47 61 end
Nenue@50 62 self.dock:SetWidth(draw_offset)
Nenue@50 63 end
Nenue@46 64
Nenue@50 65 --- Updates region visibility as needed
Nenue@50 66 local getFadeInArgs = function(sign, region)
Nenue@50 67 --print('Dvn', region)
Nenue@50 68 local db = D.db
Nenue@50 69 local alph = region:GetAlpha()
Nenue@50 70 local a = (db[sign..'_alpha_on'] - alph)
Nenue@50 71 local b = (db[sign..'_alpha_on']-db[sign..'_alpha_off'])
Nenue@50 72 local dur = (a / b) * db[sign..'_fade_in']
Nenue@50 73 return dur, alph, db[sign..'_alpha_on']
Nenue@50 74 end
Nenue@50 75
Nenue@50 76 local getFadeOutArgs = function(sign, region)
Nenue@50 77 local db = D.db
Nenue@50 78 local alph = region:GetAlpha()
Nenue@50 79 local a = (alph - db[sign..'_alpha_off'])
Nenue@50 80 local b = (db[sign..'_alpha_on']-db[sign..'_alpha_off'])
Nenue@50 81 local dur = (a / b) * db[sign..'_fade_out']
Nenue@50 82 return dur, alph, db[sign..'_alpha_off']
Nenue@50 83 end
Nenue@50 84
Nenue@58 85 local function queueFade (self, duration, from, to)
Nenue@58 86 self:SetAlpha(to)
Nenue@58 87 end
Nenue@58 88
Nenue@50 89 function D.UpdateBeacon(beacon)
Nenue@50 90 local db = D.db
Nenue@58 91 local isActive = (beacon.raised or beacon.selected or beacon.newMessage)
Nenue@50 92 if isActive then
Nenue@58 93 --print(beacon:GetName(), 'active, fade in')
Nenue@58 94 queueFade(beacon, getFadeInArgs('dock_button', beacon))
Nenue@50 95 end
Nenue@58 96
Nenue@50 97 if beacon.showName or isActive then
Nenue@58 98 --print(beacon:GetName(), 'show name, fade in name')
Nenue@58 99 queueFade(beacon.caption, getFadeInArgs('dock_button', beacon.caption))
Nenue@50 100 end
Nenue@50 101
Nenue@50 102 if not isActive then
Nenue@58 103 queueFade(beacon, getFadeOutArgs('dock_button', beacon))
Nenue@50 104 end
Nenue@58 105
Nenue@50 106 if (not beacon.showName) and (not isActive) then
Nenue@58 107 --print(beacon:GetName(), 'no name no active, fade out')
Nenue@58 108 queueFade(beacon.caption,getFadeOutArgs('dock_button', beacon.caption))
Nenue@50 109 end
Nenue@47 110 end
Nenue@47 111
Nenue@58 112 local function FrameFade(frame)
Nenue@58 113 if not D.fader then
Nenue@58 114 D.fader = CreateFrame('Frame', 'DevianFaderFrame', UIParent):CreateAnimationGroup('fader'):CreateAnimation('Alpha', 'FadeIn')
Nenue@58 115 end
Nenue@58 116 end
Nenue@58 117
Nenue@58 118 --- Dock interaction framescript
Nenue@47 119 function D.DockHighlight(beacon)
Nenue@47 120 db = D.db
Nenue@47 121 local self = D.dock
Nenue@58 122 local mouseOverDock = false
Nenue@47 123 if self:IsMouseOver() then
Nenue@47 124 mouseOverDock = true
Nenue@47 125 end
Nenue@47 126
Nenue@58 127 if beacon then
Nenue@58 128 --print(beacon:GetName(), ' highlighter got beacon')
Nenue@47 129 mouseOverDock = true
Nenue@47 130 if not beacon.raised then
Nenue@58 131 --print(beacon:GetName(), ' beacon not raised')
Nenue@47 132 beacon.raised = true
Nenue@50 133 D.UpdateBeacon(beacon)
Nenue@58 134
Nenue@58 135 -- IsMouseOver can still return false during its frame's OnEnter
Nenue@58 136 beacon.inc = 0
Nenue@58 137 beacon:SetScript('OnUpdate', function(self)
Nenue@58 138 if not self:IsMouseOver() then
Nenue@58 139 self.inc = self.inc + 1
Nenue@58 140 --print(self:GetName(),self.inc)
Nenue@58 141 if self.inc > 10 then
Nenue@58 142 --print(self:GetName(), 'lost mouseover, terminating OnUpdate')
Nenue@58 143 self.raised = nil
Nenue@58 144 D.UpdateBeacon(self)
Nenue@58 145 self:SetScript('OnUpdate', nil)
Nenue@58 146 end
Nenue@58 147 end
Nenue@58 148 end)
Nenue@46 149 end
Nenue@47 150 elseif beacon.raised and beacon.index ~= db.current_channel then
Nenue@47 151 beacon.raised = nil
Nenue@50 152 D.UpdateBeacon(beacon)
Nenue@58 153 --beacon:SetScript('OnUpdate', nil)
Nenue@47 154 end
Nenue@46 155
Nenue@47 156 if mouseOverDock then
Nenue@50 157 -- Raise it up
Nenue@47 158 if not self.raised then
Nenue@58 159
Nenue@58 160 self.raised = true
Nenue@58 161 queueFade(self, getFadeInArgs('dock', self))
Nenue@46 162 end
Nenue@47 163 elseif self.raised then
Nenue@50 164 -- Drop it down
Nenue@47 165 self.raised = nil
Nenue@58 166 queueFade(self, getFadeOutArgs('dock', self))
Nenue@58 167 for k, v in pairs(self.buttons) do
Nenue@58 168 v.raised = nil
Nenue@58 169 D.UpdateBeacon(v)
Nenue@58 170 end
Nenue@46 171 end
Nenue@47 172
Nenue@46 173 end