annotate Dock.lua @ 111:5c591d9b4029 tip

Added tag v8.0.1-20181807-1 for changeset 930922e1ec5b
author Nenue
date Wed, 18 Jul 2018 15:02:50 -0400
parents 790dca545f1d
children
rev   line source
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@99 9
Nenue@99 10 local CreateFrame, tinsert, random = CreateFrame, tinsert, math.random
Nenue@99 11 local ipairs, pairs = ipairs, pairs
Nenue@47 12 local db
Nenue@98 13 local print = DEVIAN_WORKSPACE and function(...) print('DvnDock', ...) end or nop
Nenue@93 14 local DOCK_BUTTON_PADDING = 6
Nenue@93 15
Nenue@98 16 DevianDockHandler = {
Nenue@98 17 usedButtons = {},
Nenue@98 18 buttons = {},
Nenue@98 19 }
Nenue@99 20 DevianDockTabMixin = {}
Nenue@93 21
Nenue@99 22 function DevianDockTabMixin:OnMouseDown(button)
Nenue@93 23 --print("click", self:GetName(), button, self.console.index)
Nenue@100 24 local console = self.console
Nenue@93 25 if button == "LeftButton" then
Nenue@93 26 if IsShiftKeyDown() then
Nenue@100 27 DevianDock:ToggleAll(console)
Nenue@93 28 else
Nenue@98 29
Nenue@100 30 console.newMessage = nil
Nenue@100 31 if console.isFront or (not console.enabled) then
Nenue@100 32
Nenue@100 33 console:Toggle()
Nenue@100 34 if console.enabled then
Nenue@100 35 if console.minimized then
Nenue@100 36 console:MinMax()
Nenue@93 37 end
Nenue@100 38 console:ToFront()
Nenue@93 39 end
Nenue@93 40 else
Nenue@100 41 console:ToFront()
Nenue@93 42 end
Nenue@93 43 end
Nenue@93 44 elseif button == "RightButton" then
Nenue@100 45 console:MinMax()
Nenue@93 46 end
Nenue@100 47 DevianDock:Update()
Nenue@93 48 end
Nenue@99 49 function DevianDockTabMixin:OnShow()
Nenue@93 50 self:Update()
Nenue@93 51 end
Nenue@99 52 function DevianDockTabMixin:OnEnter()
Nenue@93 53 end
Nenue@99 54 function DevianDockTabMixin:Update()
Nenue@100 55 local console = self.console
Nenue@100 56 local isActive = (console.isFront or console.newMessage)
Nenue@93 57
Nenue@100 58 if console.newMessage and (not self.pulse:IsPlaying()) then
Nenue@100 59 self.pulse:Play()
Nenue@100 60 elseif not console.newMessage then
Nenue@100 61 self.pulse:Stop()
Nenue@93 62 end
Nenue@93 63
Nenue@93 64 if self.selected then
Nenue@93 65 self.Background:SetColorTexture(0.4,0.4,0.4,1)
Nenue@93 66 else
Nenue@93 67 self.Background:SetColorTexture(0,0,0,.5)
Nenue@93 68 end
Nenue@93 69
Nenue@100 70 if isActive then
Nenue@100 71 self:SetAlpha(1)
Nenue@100 72 else
Nenue@93 73 self:SetAlpha(0.5)
Nenue@93 74 end
Nenue@93 75
Nenue@100 76
Nenue@100 77
Nenue@93 78 self:SetWidth(self.caption.name:GetStringWidth() + DOCK_BUTTON_PADDING)
Nenue@93 79 end
Nenue@93 80
Nenue@99 81 function DevianDockTabMixin:Select()
Nenue@93 82 self:Update()
Nenue@93 83 end
Nenue@32 84
Nenue@32 85 --- Spaces each frame evenly across the screen.
Nenue@32 86 function D:DistributeFrames() --
Nenue@50 87 local max = self.num_channels
Nenue@50 88 local num_side = ceil(sqrt(max))
Nenue@50 89 local w = GetScreenWidth() / num_side
Nenue@50 90 local h = GetScreenHeight() / num_side
Nenue@50 91 for i, frame in pairs(D.console) do
Nenue@50 92 local dx = (i-1) % num_side
Nenue@50 93 local dy = floor((i-1) / num_side)
Nenue@50 94 frame.width = w
Nenue@50 95 frame.height = h
Nenue@50 96 frame.x = dx * w
Nenue@50 97 frame.y = -(dy * h)
Nenue@50 98 frame:Save()
Nenue@50 99 end
Nenue@32 100 end
Nenue@32 101
Nenue@32 102 --- Place all frames stacked beneath the primary frame.
Nenue@32 103 function D:StackFrames()
Nenue@32 104 local last
Nenue@50 105 for _, frame in pairs(self.console) do
Nenue@32 106 if last then
Nenue@32 107 frame.x = last.x
Nenue@32 108 frame.y = last.y - 20
Nenue@32 109 else
Nenue@32 110 frame.x = (GetScreenWidth()-frame:GetWidth())/2
Nenue@32 111 frame.y = 0
Nenue@32 112 end
Nenue@32 113 frame:Save()
Nenue@32 114 last = frame
Nenue@32 115 end
Nenue@32 116 end
Nenue@32 117
Nenue@99 118
Nenue@99 119 do
Nenue@99 120 local numBeacons = 0
Nenue@99 121 function DevianDockHandler:GetDockButton(console)
Nenue@99 122 self.usedButtons = self.usedButtons or {}
Nenue@99 123 local index = console:GetID()
Nenue@99 124 local button = self.usedButtons[index]
Nenue@99 125 if not button then
Nenue@99 126 numBeacons = numBeacons + 1
Nenue@99 127 button = CreateFrame('Button', 'DevianDockBeacon'.. numBeacons, UIParent, 'DevianDockTabTemplate')
Nenue@99 128 button.color = {r = random(), g = random(), b = random()}
Nenue@99 129 button.Stripe:SetColorTexture(button.color.r, button.color.g, button.color.b,1)
Nenue@99 130 button.console = console
Nenue@99 131 self.usedButtons[index] = button
Nenue@99 132 tinsert(self.buttons, button)
Nenue@99 133 --oldprint('create dock', index, console.signature)
Nenue@99 134 end
Nenue@99 135 button.index = console.index
Nenue@99 136 button.caption.name:SetText(console.signature)
Nenue@99 137 button:SetShown(true)
Nenue@99 138 return button
Nenue@99 139 end
Nenue@99 140 end
Nenue@99 141
Nenue@98 142 function DevianDockHandler:OnMouseWheel(delta)
Nenue@93 143 if delta >= 1 then
Nenue@98 144 self.dockScale = (self.dockScale or 1) - 0.1
Nenue@93 145 else
Nenue@98 146 self.dockScale = (self.dockScale or 1) + 0.1
Nenue@93 147 end
Nenue@98 148 self:Update()
Nenue@93 149 end
Nenue@32 150
Nenue@50 151 --- Space everything and set the dock size
Nenue@98 152 function DevianDockHandler:Update()
Nenue@47 153 local pad_offset = 12
Nenue@93 154 local drawWidth = 0
Nenue@93 155 local lastButton
Nenue@93 156 local numButtons = 0
Nenue@100 157 local numOpen = 0
Nenue@100 158 local numBackground = 0
Nenue@100 159 local numClosed = 0
Nenue@100 160 local numMinimized = 0
Nenue@98 161 for i, d in ipairs(self.buttons) do
Nenue@93 162 if d and d:IsShown() then
Nenue@93 163 d:SetScale(D.dockScale or 1)
Nenue@93 164 if lastButton then
Nenue@93 165 d:SetPoint('TOPLEFT', lastButton, 'TOPRIGHT', pad_offset, 0)
Nenue@93 166 else
Nenue@93 167 d:SetPoint('TOPLEFT', DevianDock, 'TOPLEFT', pad_offset, 0)
Nenue@93 168 end
Nenue@73 169
Nenue@100 170 local console = d.console
Nenue@100 171 if console.enabled then
Nenue@100 172 numOpen = numOpen + 1
Nenue@100 173 if not console.isFront then
Nenue@100 174 numBackground = numBackground + 1
Nenue@100 175 end
Nenue@100 176
Nenue@100 177 else
Nenue@100 178 numClosed = numClosed + 1
Nenue@100 179 end
Nenue@100 180 if console.minimized then
Nenue@100 181 numMinimized = numMinimized + 1
Nenue@100 182 end
Nenue@100 183
Nenue@100 184 d:Update()
Nenue@100 185
Nenue@93 186 drawWidth = drawWidth + d:GetWidth() + pad_offset
Nenue@93 187 lastButton = d
Nenue@93 188 numButtons = numButtons + 1
Nenue@93 189 print(numButtons)
Nenue@73 190 end
Nenue@47 191 end
Nenue@100 192
Nenue@100 193 self.numOpen, self.numMinimized, self.numClosed, self.numButtons, self.numBackground = numOpen, numMinimized, numClosed, numButtons, numBackground
Nenue@98 194 self:SetWidth(drawWidth)
Nenue@98 195
Nenue@98 196 D.db.dockPoint = D.db.dockPoint or 'TOPLEFT'
Nenue@98 197 self:SetPoint(D.db.dockPoint , UIParent, D.db.dockPoint , 0, 0)
Nenue@50 198 end
Nenue@100 199
Nenue@100 200
Nenue@100 201 function DevianDockHandler:ToggleAll(sender)
Nenue@100 202 local keepSender = IsShiftKeyDown() and sender
Nenue@100 203 local senderID = sender and sender:GetID()
Nenue@100 204 local op, arg = 'Toggle', false
Nenue@100 205 if (keepSender and (self.numBackground == 0)) or (self.numOpen == 0) then
Nenue@100 206 arg = true
Nenue@100 207 elseif self.numClosed == 0 then
Nenue@100 208 arg = false
Nenue@100 209 end
Nenue@100 210
Nenue@100 211 for index, button in ipairs(self.buttons) do
Nenue@100 212 local frame = button.console
Nenue@100 213 if frame then
Nenue@100 214 if not((frame.index == senderID) and keepSender) then
Nenue@100 215 frame[op](frame, arg)
Nenue@100 216 end
Nenue@100 217
Nenue@100 218 end
Nenue@100 219 end
Nenue@100 220 self:Update()
Nenue@100 221 end