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