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 |