Mercurial > wow > devian
comparison Dock.lua @ 50:c3166f700438
dock beacons and text fader cleaned up
fixed OnLeave ending at mouseOverDock false and causing beacons to stick
fixed a nil argument in dock framescript
author | Nenue |
---|---|
date | Tue, 05 Jan 2016 01:37:29 -0500 |
parents | 2bf7eb1844cb |
children | 0a9a6740ea5d |
comparison
equal
deleted
inserted
replaced
49:36290c315606 | 50:c3166f700438 |
---|---|
1 --- ${PACKAGE_NAME} | 1 --- Devian - Dock.lua |
2 -- @file-author@ | 2 -- @file-author@ |
3 -- @project-revision@ @project-hash@ | 3 -- @project-revision@ @project-hash@ |
4 -- @file-revision@ @file-hash@ | 4 -- @file-revision@ @file-hash@ |
5 -- Created: 12/26/2015 12:32 PM | 5 -- Created: 12/26/2015 12:32 PM |
6 -- Dock management functions | 6 -- Docking and arrangement calls |
7 | 7 |
8 local D = LibStub("AceAddon-3.0"):GetAddon("Devian") | 8 local D = LibStub("AceAddon-3.0"):GetAddon("Devian") |
9 local _G = _G | 9 local ceil, floor, sqrt, pairs, GetScreenWidth, GetScreenHeight = math.ceil, math.floor, math.sqrt, pairs, GetScreenWidth, GetScreenHeight |
10 local UIFrameFadeIn, UIFrameFadeOut = UIFrameFadeIn, UIFrameFadeOut | |
10 local db | 11 local db |
11 | |
12 local function Dock_MenuClick() end | |
13 | |
14 local function Dock_MouseDown(self, button, up) | |
15 end | |
16 local function Dock_MouseUp (self, button) | |
17 Dock_MouseDown(self, button, true) | |
18 end | |
19 | |
20 --- Adjusts frame element alignments | |
21 local function PrepareForDock (frame, draw_x) | |
22 frame.left:SetPoint('TOPLEFT', frame.out, 'TOPLEFT', -2, 0) | |
23 frame.left:SetPoint('BOTTOMRIGHT', frame.out, 'BOTTOMLEFT', 0, 0) | |
24 frame.topleft:SetPoint('BOTTOMRIGHT', frame.out, 'TOPLEFT', 0, 0) | |
25 frame.top: SetPoint('TOPLEFT', frame.out, 'TOPLEFT', 0, 2) | |
26 frame.top:SetPoint('BOTTOMRIGHT', frame.out, 'TOPRIGHT', 0, 0) | |
27 frame.topright:SetPoint('BOTTOMLEFT', frame.out, 'TOPRIGHT', 0, 0) | |
28 frame.right:SetPoint('TOPLEFT', frame.out, 'TOPRIGHT', 0, 0) | |
29 frame.header:SetWidth(frame.header:GetStringWidth() * 1.2) | |
30 frame.header:SetPoint('TOPLEFT', frame, 'TOPLEFT', draw_x+4, 0) | |
31 frame.titlebar:SetPoint('TOPLEFT', frame.header, 'TOPLEFT', -4, 0) | |
32 frame.titlebar:SetPoint('TOPRIGHT', frame.header, 'TOPRIGHT', 0, 0) | |
33 | |
34 return (draw_x + frame.header:GetStringWidth() * 1.2 + 4) | |
35 end | |
36 | |
37 | |
38 --- Docks frames together | |
39 -- @param target frame on which to dock | |
40 -- @param ... frame objects to be docked | |
41 -- | |
42 function D:DockFrame(...) | |
43 local target = D.console[select(1,...)] | |
44 if target.dockedTo then | |
45 local t = D.c[target.dockedTo] | |
46 --print('channel',target.index,target.signature, 'is docked to',t.index, t.signature..'. using that instead') | |
47 target = D.console[target.DockedTo] | |
48 end | |
49 | |
50 target.docked = {} | |
51 local draw_x = PrepareForDock(target, 4) | |
52 for i = 2, select('#', ...) do | |
53 local frame = D.console[select(i, ...)] | |
54 frame.dockedTo = target.index | |
55 width, draw_x = MorphToDock (frame, draw_x) | |
56 table.insert(target.docked, frame.index) | |
57 frame:ClearAllPoints() | |
58 frame:SetPoint('TOPLEFT', target, 'TOPLEFT', 0, 0) | |
59 frame:SetSize(target:GetWidth(), target:GetHeight()) | |
60 frame.x = nil | |
61 frame.y = nil | |
62 frame.width = nil | |
63 frame.height = nil | |
64 frame.scriptsMD = frame:GetScript('OnMouseDown') | |
65 frame.scriptsMU = frame:GetScript('OnMouseUp') | |
66 frame:SetScript('OnMouseDown', nil) | |
67 frame:SetScript('OnMouseUp', nil) | |
68 frame:Save() | |
69 end | |
70 end | |
71 | 12 |
72 --- Spaces each frame evenly across the screen. | 13 --- Spaces each frame evenly across the screen. |
73 function D:DistributeFrames() -- | 14 function D:DistributeFrames() -- |
74 --print('frame grid:', max, num_side) | 15 local max = self.num_channels |
75 local max = self.num_channels | 16 local num_side = ceil(sqrt(max)) |
76 local num_side = math.ceil(math.sqrt(max)) | 17 local w = GetScreenWidth() / num_side |
77 local w = GetScreenWidth() / num_side | 18 local h = GetScreenHeight() / num_side |
78 local h = GetScreenHeight() / num_side | 19 for i, frame in pairs(D.console) do |
79 for i, frame in pairs(D.console) do | 20 local dx = (i-1) % num_side |
80 local dx = (i-1) % num_side | 21 local dy = floor((i-1) / num_side) |
81 local dy = math.floor((i-1) / num_side) | 22 frame.width = w |
82 | 23 frame.height = h |
83 --print('move:', frame.signature, 'dx=', dx, 'dy=', dy) | 24 frame.x = dx * w |
84 --print('move:', frame.signature, ' x=', dx * w, 'y=', -(dy * h), 'h=', h, 'w=', w) | 25 frame.y = -(dy * h) |
85 frame.width = w | 26 frame:Save() |
86 frame.height = h | 27 end |
87 frame.x = dx * w | |
88 frame.y = -(dy * h) | |
89 frame:Save() | |
90 end | |
91 | |
92 end | 28 end |
93 | 29 |
94 --- Place all frames stacked beneath the primary frame. | 30 --- Place all frames stacked beneath the primary frame. |
95 function D:StackFrames() | 31 function D:StackFrames() |
96 local last | 32 local last |
97 for i, frame in pairs(self.console) do | 33 for _, frame in pairs(self.console) do |
98 if last then | 34 if last then |
99 frame.x = last.x | 35 frame.x = last.x |
100 frame.y = last.y - 20 | 36 frame.y = last.y - 20 |
101 else | 37 else |
102 frame.x = (GetScreenWidth()-frame:GetWidth())/2 | 38 frame.x = (GetScreenWidth()-frame:GetWidth())/2 |
106 last = frame | 42 last = frame |
107 end | 43 end |
108 end | 44 end |
109 | 45 |
110 | 46 |
111 --- | 47 --- Space everything and set the dock size |
112 function D:UpdateDock() | 48 function D:UpdateDock() |
113 local pad_offset = 12 | 49 local pad_offset = 12 |
114 local draw_offset = pad_offset | 50 local draw_offset = pad_offset |
115 for i = 1, #self.dock.buttons do | 51 for i = 1, #self.dock.buttons do |
116 local d = self.dock.buttons[i] | 52 local d = self.dock.buttons[i] |
117 d:SetPoint('TOPLEFT', DevianDock, 'TOPLEFT', draw_offset, 0) | 53 d:SetPoint('TOPLEFT', DevianDock, 'TOPLEFT', draw_offset, 0) |
118 draw_offset= draw_offset + d:GetWidth() + pad_offset | 54 draw_offset= draw_offset + d:GetWidth() + pad_offset |
119 end | 55 end |
56 self.dock:SetWidth(draw_offset) | |
57 end | |
120 | 58 |
121 self.dock:SetWidth(draw_offset) | 59 --- Updates region visibility as needed |
60 local getFadeInArgs = function(sign, region) | |
61 --print('Dvn', region) | |
62 local db = D.db | |
63 local alph = region:GetAlpha() | |
64 local a = (db[sign..'_alpha_on'] - alph) | |
65 local b = (db[sign..'_alpha_on']-db[sign..'_alpha_off']) | |
66 local dur = (a / b) * db[sign..'_fade_in'] | |
67 return dur, alph, db[sign..'_alpha_on'] | |
68 end | |
69 | |
70 local getFadeOutArgs = function(sign, region) | |
71 local db = D.db | |
72 local alph = region:GetAlpha() | |
73 local a = (alph - db[sign..'_alpha_off']) | |
74 local b = (db[sign..'_alpha_on']-db[sign..'_alpha_off']) | |
75 local dur = (a / b) * db[sign..'_fade_out'] | |
76 return dur, alph, db[sign..'_alpha_off'] | |
77 end | |
78 | |
79 function D.UpdateBeacon(beacon) | |
80 local db = D.db | |
81 local isActive = (beacon.raised or beacon.selected) | |
82 if isActive then | |
83 UIFrameFadeIn(beacon, getFadeInArgs('dock_button', beacon)) | |
84 end | |
85 if beacon.showName or isActive then | |
86 UIFrameFadeIn(beacon.caption, getFadeInArgs('dock_button', beacon.caption)) | |
87 end | |
88 | |
89 if not isActive then | |
90 UIFrameFadeOut(beacon, getFadeOutArgs('dock_button', beacon)) | |
91 end | |
92 if (not beacon.showName) and (not isActive) then | |
93 UIFrameFadeOut(beacon.caption,getFadeOutArgs('dock_button', beacon.caption)) | |
94 end | |
122 end | 95 end |
123 | 96 |
124 --- Dock interactions | 97 --- Dock interactions |
125 function D.DockHighlight(beacon) | 98 function D.DockHighlight(beacon) |
126 db = D.db | 99 db = D.db |
127 --print('Dvn', 'dock mouse event', beacon) | |
128 local self = D.dock | 100 local self = D.dock |
129 local mouseOverDock | 101 local mouseOverDock |
130 --for i, b in pairs(self.buttons) do | |
131 --print('polling', i, b:GetName()) | |
132 if self:IsMouseOver() then | 102 if self:IsMouseOver() then |
133 mouseOverDock = true | 103 mouseOverDock = true |
134 end | 104 end |
135 | 105 |
136 | |
137 if beacon and beacon:IsMouseOver() then | 106 if beacon and beacon:IsMouseOver() then |
138 mouseOverDock = true | 107 mouseOverDock = true |
139 --print('mouse is over', i, b:GetName()) | |
140 | |
141 if not beacon.raised then | 108 if not beacon.raised then |
142 beacon.raised = true | 109 beacon.raised = true |
143 local a = (db.dock_button_alpha_on - self:GetAlpha()) | 110 D.UpdateBeacon(beacon) |
144 local b = (db.dock_button_alpha_on-db.dock_button_alpha_off) | |
145 local dur = (a / b) * db.dock_button_fade_in | |
146 --print(a, b, db.dock_button_fade_in, dur) | |
147 UIFrameFadeIn(beacon, dur,beacon:GetAlpha(),db.dock_button_alpha_on) | |
148 UIFrameFadeIn(beacon.caption, dur,beacon:GetAlpha(),1) | |
149 end | 111 end |
150 elseif beacon.raised and beacon.index ~= db.current_channel then | 112 elseif beacon.raised and beacon.index ~= db.current_channel then |
151 beacon.raised = nil | 113 beacon.raised = nil |
152 local a = (self:GetAlpha() - db.dock_button_alpha_off) | 114 D.UpdateBeacon(beacon) |
153 local b = (db.dock_button_alpha_on-db.dock_button_alpha_off) | |
154 local dur = (a / b) * db.dock_button_fade_out | |
155 --print(a, b, db.dock_button_fade_in, dur) | |
156 UIFrameFadeOut(beacon, dur,beacon:GetAlpha(),db.dock_button_alpha_off) | |
157 UIFrameFadeOut(beacon.caption, dur,beacon:GetAlpha(),0) | |
158 end | 115 end |
159 | 116 |
160 --end | |
161 --end | |
162 if mouseOverDock then | 117 if mouseOverDock then |
118 -- Raise it up | |
163 if not self.raised then | 119 if not self.raised then |
164 --print('rising') | |
165 self.raised = true | 120 self.raised = true |
166 local a = (db.dock_alpha_on - self:GetAlpha()) | 121 UIFrameFadeIn(self, getFadeInArgs('dock', self)) |
167 local b = (db.dock_alpha_on-db.dock_alpha_off) | |
168 local dur = (a / b) * db.dock_fade_in | |
169 --print(a, b, db.dock_fade_in, dur) | |
170 UIFrameFadeIn(self, dur,self:GetAlpha(),db.dock_alpha_on) | |
171 end | 122 end |
172 elseif self.raised then | 123 elseif self.raised then |
173 --print('dropping') | 124 -- Drop it down |
174 self.raised = nil | 125 self.raised = nil |
175 local a = (self:GetAlpha() - db.dock_alpha_off) | 126 UIFrameFadeOut(self, getFadeOutArgs('dock', self)) |
176 local b = (db.dock_alpha_on-db.dock_alpha_off) | |
177 local dur = (a / b) * db.dock_fade_out | |
178 --print(a, b, db.dock_fade_in, dur) | |
179 UIFrameFadeOut(self, dur,self:GetAlpha(),db.dock_alpha_off) | |
180 end | 127 end |
181 | 128 |
182 end | 129 end |