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 |