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 |