Mercurial > wow > devian
comparison Console.lua @ 99:7d94df3804a7
- Console drag buttons for resizing
- While dragging a console frame, other frames are ghosted out
- Dropdown menu includes Toggle, Pin, and MinMax
author | Nenue |
---|---|
date | Thu, 27 Oct 2016 06:11:04 -0400 |
parents | 33bc8baba858 |
children | 790dca545f1d |
comparison
equal
deleted
inserted
replaced
98:33bc8baba858 | 99:7d94df3804a7 |
---|---|
1 -- Mixin for console | 1 -- Mixin for console |
2 local _, D = ... | 2 local _, D = ... |
3 DevianConsoleMixin = {} | 3 DevianConsoleMixin = {} |
4 | 4 |
5 local print = function(...) print('Dvn', ...) end | |
6 function D.IterateChannels(callback, sender) | |
7 for index, channel in ipairs(D.console) do | |
8 if channel ~= sender then | |
9 callback(channel) | |
10 end | |
11 end | |
12 end | |
13 | |
5 function DevianConsoleMixin:OnLoad() | 14 function DevianConsoleMixin:OnLoad() |
6 self:SetMaxResize(GetScreenWidth(), GetScreenHeight()) | 15 self:SetMaxResize(GetScreenWidth(), GetScreenHeight()) |
7 self:SetMinResize(100, 24) | 16 self:SetMinResize(100, 24) |
8 | |
9 self:EnableMouse(true) | 17 self:EnableMouse(true) |
10 self:RegisterForDrag('LeftButton') | 18 self:RegisterForDrag('LeftButton') |
11 self:SetMovable(true) | 19 self:SetMovable(true) |
12 self:SetResizable(true) | 20 self:SetResizable(true) |
21 self:SetClampedToScreen(true) | |
13 self.out:SetFont("Interface\\Addons\\Devian\\font\\SourceCodePro-Regular.ttf", 13, 'NORMAL') | 22 self.out:SetFont("Interface\\Addons\\Devian\\font\\SourceCodePro-Regular.ttf", 13, 'NORMAL') |
14 self.out:SetJustifyH('LEFT') | 23 self.out:SetJustifyH('LEFT') |
15 self.out:SetFading(false) | 24 self.out:SetFading(false) |
25 self.out:SetMaxLines(2048) | |
26 | |
27 self:RegisterEvent('PLAYER_STARTED_MOVING') | |
28 self:RegisterEvent('PLAYER_STOPPED_MOVING') | |
29 | |
30 UIDropDownMenu_Initialize(self.DropdownFrame, function() | |
31 local info = UIDropDownMenu_CreateInfo() | |
32 info.notCheckable = 1 | |
33 info.text = 'Pin' | |
34 info.func = function() self:Pin() end | |
35 UIDropDownMenu_AddButton(info) | |
36 if self.minimized then | |
37 info.text = 'Maximize' | |
38 info.func = function() self:Maximize() end | |
39 else | |
40 info.text = 'Minimize' | |
41 info.func = function() self:Minimize() end | |
42 end | |
43 UIDropDownMenu_AddButton(info) | |
44 info.text = 'Close' | |
45 info.func = function() self:Toggle() end | |
46 UIDropDownMenu_AddButton(info) | |
47 | |
48 end, 'MENU') | |
49 self.DropdownButton:SetScript('OnClick', function(button) | |
50 ToggleDropDownMenu(1, nil, self.DropdownFrame, button, 0, 0) | |
51 end) | |
16 | 52 |
17 self.width = self:GetWidth() | 53 self.width = self:GetWidth() |
18 self.height = self:GetWidth() | 54 self.height = self:GetWidth() |
19 end | 55 end |
20 | 56 |
25 end | 61 end |
26 self.Dock = DevianDock:GetDockButton(self) | 62 self.Dock = DevianDock:GetDockButton(self) |
27 self:Update() | 63 self:Update() |
28 end | 64 end |
29 | 65 |
30 function DevianConsoleMixin:Update() | 66 local blockedType = {['table'] = true, ['function'] = true } |
67 local blockedKey = {[0] = true } | |
68 | |
69 -- Synchronize vars | |
70 function DevianConsoleMixin:Finalize() | |
71 local id = self:GetID() | |
72 for k,v in pairs(D.channels[id]) do | |
73 if not self[k] then | |
74 D.channels[id][k] = nil | |
75 end | |
76 end | |
77 for k,v in pairs(self) do | |
78 if not (blockedType[type(v)] or blockedKey[k]) then | |
79 if D.channels[id][k] ~= v then | |
80 D.channels[id][k] = v | |
81 end | |
82 end | |
83 end | |
84 end | |
85 | |
86 function DevianConsoleMixin:Pin(pinned) | |
87 self.pinned = pinned or (not self.pinned) | |
88 self:Update(true) | |
89 end | |
90 | |
91 function DevianConsoleMixin:Update(setFinal) | |
31 self.title:SetText(self.index..' '.. (self.signature or '?')) | 92 self.title:SetText(self.index..' '.. (self.signature or '?')) |
32 self:SetSize(self.width, self.height) | |
33 self:SetPoint('TOPLEFT', UIParent, 'TOPLEFT', self.x, self.y) | 93 self:SetPoint('TOPLEFT', UIParent, 'TOPLEFT', self.x, self.y) |
94 | |
95 if self.minimized then | |
96 self:SetHeight(20) | |
97 self:SetMaxResize(GetScreenWidth(),20) | |
98 self.GripBottom:Hide() | |
99 self.GripSide:Hide() | |
100 else | |
101 self:SetSize(self.width, self.height) | |
102 self.GripBottom:Show() | |
103 self.GripSide:Show() | |
104 end | |
105 | |
106 | |
34 -- oldprint(self:GetName(), self.x, self.y) | 107 -- oldprint(self:GetName(), self.x, self.y) |
35 | 108 |
36 local isFront = D.currentProfile.current_channel == self.index | 109 local isFront = D.currentProfile.current_channel == self.index |
37 local r,g,b,a = unpack(D.db.backborder) | 110 local r,g,b,a = unpack(D.db.backborder) |
38 if isFront then | 111 if isFront then |
47 end | 120 end |
48 | 121 |
49 --oldprint(self:GetID(), self.enabled, self.minimized, self.x, self.y) | 122 --oldprint(self:GetID(), self.enabled, self.minimized, self.x, self.y) |
50 self.isFront = isFront | 123 self.isFront = isFront |
51 self:SetShown(self.enabled) | 124 self:SetShown(self.enabled) |
52 self.out:SetShown(self.enabled) | 125 self.backdrop:SetShown(self.enabled) |
53 end | 126 self.out:SetShown((not self.minimized)) |
127 | |
128 | |
129 if setFinal then | |
130 self:Finalize() | |
131 end | |
132 | |
133 end | |
134 | |
54 | 135 |
55 | 136 |
56 function DevianConsoleMixin:OnShow() | 137 function DevianConsoleMixin:OnShow() |
57 self:Update() | 138 self:Update() |
58 end | 139 end |
83 self:Minimize() | 164 self:Minimize() |
84 end | 165 end |
85 end | 166 end |
86 | 167 |
87 function DevianConsoleMixin:Minimize() | 168 function DevianConsoleMixin:Minimize() |
88 self:SetHeight(20) | |
89 self:SetMaxResize(GetScreenWidth(),20) | |
90 self.minimized = true | 169 self.minimized = true |
91 self.out:Hide() | 170 self:Update(true) |
92 D.channels[self.index].minimized = true | |
93 end | 171 end |
94 | 172 |
95 function DevianConsoleMixin:Maximize() | 173 function DevianConsoleMixin:Maximize() |
96 local db = D.channels[self.index] | 174 self.minimized = nilnil |
97 self:SetHeight(db.height) | 175 self:Update(true) |
98 self:SetMaxResize(GetScreenWidth(),GetScreenHeight()) | 176 end |
99 self.minimized = nil | 177 |
100 self.out:Show() | 178 function DevianConsoleMixin:OnMouseDown(button) |
101 D.channels[self.index].minimized = nil | 179 |
102 end | 180 if button == 'LeftButton' then |
181 self:ToFront() | |
182 end | |
183 end | |
184 | |
103 | 185 |
104 function DevianConsoleMixin:OnMouseUp(button) | 186 function DevianConsoleMixin:OnMouseUp(button) |
105 if button == 'LeftButton' then | 187 if button == 'LeftButton' then |
106 self:ToFront() | 188 self:ToFront() |
107 else | 189 else |
114 | 196 |
115 function DevianConsoleMixin:OnEnter() | 197 function DevianConsoleMixin:OnEnter() |
116 end | 198 end |
117 | 199 |
118 function DevianConsoleMixin:OnDragStart() | 200 function DevianConsoleMixin:OnDragStart() |
119 | 201 self:ToFront() |
120 self:StartMoving() | 202 self:StartMoving() |
203 D.IterateChannels(function(frame) | |
204 frame.out:SetShown(false) | |
205 frame.backdrop:Hide() | |
206 end, self) | |
121 end | 207 end |
122 | 208 |
123 function DevianConsoleMixin:OnDragStop() | 209 function DevianConsoleMixin:OnDragStop() |
210 | |
211 local channelEntry = D.channels[self:GetID()] | |
124 self.x = self:GetLeft() | 212 self.x = self:GetLeft() |
125 self.y = self:GetTop() - GetScreenHeight() | 213 self.y = self:GetTop() - GetScreenHeight() |
126 D.currentProfile.channels[self:GetID()].x = self:GetLeft() | 214 if not self.minimized then |
127 D.currentProfile.channels[self:GetID()].y = self:GetTop() - GetScreenHeight() | 215 self.width = self:GetWidth() |
216 self.height = self:GetHeight() | |
217 end | |
218 | |
219 --print(channelEntry.x, channelEntry.y, channelEntry.width, channelEntry.height) | |
128 self:StopMovingOrSizing() | 220 self:StopMovingOrSizing() |
129 end | 221 self:SetClampRectInsets(0,0,0,0) |
130 | 222 |
131 function DevianConsoleMixin:Reset() | 223 self:Update(true) |
224 | |
225 D.IterateChannels(function(frame) | |
226 frame:Update() | |
227 end, self) | |
132 end | 228 end |
133 | 229 |
134 function DevianConsoleMixin:ToFront() | 230 function DevianConsoleMixin:ToFront() |
135 self:Raise() | 231 self:Raise() |
136 D.currentProfile.current_channel = self.index | 232 D.currentProfile.current_channel = self.index |
142 function DevianConsoleMixin:Toggle() | 238 function DevianConsoleMixin:Toggle() |
143 self.enabled = (not self.enabled) | 239 self.enabled = (not self.enabled) |
144 --oldprint(self:GetID(), self.enabled) | 240 --oldprint(self:GetID(), self.enabled) |
145 self:Update() | 241 self:Update() |
146 end | 242 end |
243 | |
244 function DevianConsoleMixin:OnEvent(event, arg) | |
245 oldprint(event, arg) | |
246 local db = D.db | |
247 if self.enabled then | |
248 if event == 'PLAYER_STARTED_MOVING' then | |
249 self.moveFade:GetProgress() | |
250 self.moveFade:Stop() | |
251 local F1 = self.moveFade.alphaOut | |
252 F1:SetFromAlpha(db.movement_fade_from) | |
253 F1:SetToAlpha(db.movement_fade_to) | |
254 F1:SetDuration(db.movement_fade_time) | |
255 self.moveFade:Play() | |
256 self:EnableMouse(false) | |
257 else | |
258 self.moveFade:Stop() | |
259 local F1 = self.moveFade.alphaOut | |
260 F1:SetToAlpha(db.movement_fade_from) | |
261 F1:SetFromAlpha(db.movement_fade_to) | |
262 F1:SetDuration(db.movement_fade_time) | |
263 self.moveFade:Play() | |
264 self:EnableMouse(true) | |
265 end | |
266 end | |
267 end | |
268 | |
269 DevianConsoleSizeButtonMixin = {} | |
270 function DevianConsoleSizeButtonMixin:OnLoad() | |
271 self:RegisterForDrag('LeftButton') | |
272 end | |
273 function DevianConsoleSizeButtonMixin:OnDragStart() | |
274 local anchor = self:GetPoint(2) | |
275 local frame = self:GetParent() | |
276 if anchor == 'BOTTOMLEFT' then | |
277 frame:SetClampRectInsets(frame:GetLeft(), GetScreenWidth()- frame:GetRight(), GetScreenHeight() - frame:GetTop(), 0) | |
278 frame:SetMinResize(frame.width, 24) | |
279 frame:SetMaxResize(frame.width, GetScreenHeight()) | |
280 elseif anchor == 'BOTTOM' then | |
281 frame:SetClampRectInsets(frame:GetLeft(), 0, GetScreenHeight() - frame:GetTop(), GetScreenHeight() - frame:GetBottom()) | |
282 frame:SetMinResize(200, frame.height) | |
283 frame:SetMaxResize(GetScreenWidth(), frame.height) | |
284 end | |
285 frame:StartSizing() | |
286 end | |
287 function DevianConsoleSizeButtonMixin:OnDragStop() | |
288 local frame = self:GetParent() | |
289 frame:OnDragStop() | |
290 end |