| 
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@47
 | 
     9 local db
 | 
| 
Nenue@66
 | 
    10 local print = D.print
 | 
| 
Nenue@93
 | 
    11 local DOCK_BUTTON_PADDING = 6
 | 
| 
Nenue@93
 | 
    12 
 | 
| 
Nenue@93
 | 
    13 DevianDockButtonMixin = {}
 | 
| 
Nenue@93
 | 
    14 
 | 
| 
Nenue@93
 | 
    15 --- Updates region visibility as needed
 | 
| 
Nenue@93
 | 
    16 local getFadeInArgs = function(sign, region)
 | 
| 
Nenue@93
 | 
    17   --print('Dvn', region)
 | 
| 
Nenue@93
 | 
    18   local db = D.db
 | 
| 
Nenue@93
 | 
    19   local alph = region:GetAlpha()
 | 
| 
Nenue@93
 | 
    20   local a = (db[sign..'_alpha_on'] - alph)
 | 
| 
Nenue@93
 | 
    21   local b = (db[sign..'_alpha_on']-db[sign..'_alpha_off'])
 | 
| 
Nenue@93
 | 
    22   local dur = (a / b) * db[sign..'_fade_in']
 | 
| 
Nenue@93
 | 
    23   return dur, alph, db[sign..'_alpha_on']
 | 
| 
Nenue@93
 | 
    24 end
 | 
| 
Nenue@93
 | 
    25 
 | 
| 
Nenue@93
 | 
    26 local getFadeOutArgs = function(sign, region)
 | 
| 
Nenue@93
 | 
    27   local db = D.db
 | 
| 
Nenue@93
 | 
    28   local alph = region:GetAlpha()
 | 
| 
Nenue@93
 | 
    29   local a = (alph  - db[sign..'_alpha_off'])
 | 
| 
Nenue@93
 | 
    30   local b = (db[sign..'_alpha_on']-db[sign..'_alpha_off'])
 | 
| 
Nenue@93
 | 
    31   local dur = (a / b) * db[sign..'_fade_out']
 | 
| 
Nenue@93
 | 
    32   return dur, alph, db[sign..'_alpha_off']
 | 
| 
Nenue@93
 | 
    33 end
 | 
| 
Nenue@93
 | 
    34 
 | 
| 
Nenue@93
 | 
    35 local function queueFade (self, duration, from, to)
 | 
| 
Nenue@93
 | 
    36   self:SetAlpha(to)
 | 
| 
Nenue@93
 | 
    37 end
 | 
| 
Nenue@93
 | 
    38 
 | 
| 
Nenue@93
 | 
    39 local numBeacons = 0
 | 
| 
Nenue@93
 | 
    40 function D:GetDockButton(console)
 | 
| 
Nenue@93
 | 
    41   self.dock.usedButtons = self.dock.usedButtons or {}
 | 
| 
Nenue@93
 | 
    42 
 | 
| 
Nenue@93
 | 
    43   local button = self.dock.usedButtons[console.index]
 | 
| 
Nenue@93
 | 
    44   if not button then
 | 
| 
Nenue@93
 | 
    45     numBeacons = numBeacons + 1
 | 
| 
Nenue@93
 | 
    46     button = CreateFrame('Button', 'DevianDockBeacon'.. numBeacons, UIParent, 'DevianBeacon')
 | 
| 
Nenue@93
 | 
    47     button.color = {r = math.random(), g = math.random(), b = math.random()}
 | 
| 
Nenue@93
 | 
    48     button.Stripe:SetColorTexture(button.color.r, button.color.g, button.color.b,1)
 | 
| 
Nenue@93
 | 
    49     button.console = console
 | 
| 
Nenue@93
 | 
    50     self.dock.usedButtons[console.index] = button
 | 
| 
Nenue@93
 | 
    51     tinsert(self.dock.buttons, button)
 | 
| 
Nenue@93
 | 
    52   end
 | 
| 
Nenue@93
 | 
    53   button.index = console.index
 | 
| 
Nenue@93
 | 
    54   button.caption.name:SetText(console.signature)
 | 
| 
Nenue@93
 | 
    55   button:SetShown(true)
 | 
| 
Nenue@93
 | 
    56   return button
 | 
| 
Nenue@93
 | 
    57 end
 | 
| 
Nenue@93
 | 
    58 
 | 
| 
Nenue@93
 | 
    59 function DevianDockButtonMixin:OnMouseDown(button)
 | 
| 
Nenue@93
 | 
    60   --print("click", self:GetName(), button, self.console.index)
 | 
| 
Nenue@93
 | 
    61   if button == "LeftButton" then
 | 
| 
Nenue@93
 | 
    62     if IsShiftKeyDown() then
 | 
| 
Nenue@93
 | 
    63       D:Console_Toggle(self.console.index, 0)
 | 
| 
Nenue@93
 | 
    64     else
 | 
| 
Nenue@93
 | 
    65       if self.console.index == D.currentProfile.current_channel or (not self.console.enabled) then
 | 
| 
Nenue@93
 | 
    66         D:Console_Toggle(self.console.index)
 | 
| 
Nenue@93
 | 
    67         if self.console.enabled then
 | 
| 
Nenue@93
 | 
    68           if self.console.minimized then
 | 
| 
Nenue@93
 | 
    69             self.console:MinMax()
 | 
| 
Nenue@93
 | 
    70           end
 | 
| 
Nenue@93
 | 
    71           self.console:ToFront()
 | 
| 
Nenue@93
 | 
    72         end
 | 
| 
Nenue@93
 | 
    73       else
 | 
| 
Nenue@93
 | 
    74         self.console:ToFront()
 | 
| 
Nenue@93
 | 
    75       end
 | 
| 
Nenue@93
 | 
    76     end
 | 
| 
Nenue@93
 | 
    77   elseif button == "RightButton" then
 | 
| 
Nenue@93
 | 
    78     self.console:MinMax()
 | 
| 
Nenue@93
 | 
    79   end
 | 
| 
Nenue@93
 | 
    80   self.console:Save()
 | 
| 
Nenue@93
 | 
    81 end
 | 
| 
Nenue@93
 | 
    82 function DevianDockButtonMixin:OnShow()
 | 
| 
Nenue@93
 | 
    83   self:Update()
 | 
| 
Nenue@93
 | 
    84 end
 | 
| 
Nenue@93
 | 
    85 function DevianDockButtonMixin:OnEnter()
 | 
| 
Nenue@93
 | 
    86 end
 | 
| 
Nenue@93
 | 
    87 function DevianDockButtonMixin:Update()
 | 
| 
Nenue@93
 | 
    88   local db = D.db
 | 
| 
Nenue@93
 | 
    89   local isActive = (self.raised or self.selected or self.newMessage)
 | 
| 
Nenue@93
 | 
    90 
 | 
| 
Nenue@93
 | 
    91   if (self.showName or isActive) then
 | 
| 
Nenue@93
 | 
    92     self.caption:SetAlpha(1)
 | 
| 
Nenue@93
 | 
    93   else
 | 
| 
Nenue@93
 | 
    94     self.caption:SetAlpha(0.5)
 | 
| 
Nenue@93
 | 
    95   end
 | 
| 
Nenue@93
 | 
    96 
 | 
| 
Nenue@93
 | 
    97   if self.selected then
 | 
| 
Nenue@93
 | 
    98     self.Background:SetColorTexture(0.4,0.4,0.4,1)
 | 
| 
Nenue@93
 | 
    99   else
 | 
| 
Nenue@93
 | 
   100     self.Background:SetColorTexture(0,0,0,.5)
 | 
| 
Nenue@93
 | 
   101   end
 | 
| 
Nenue@93
 | 
   102 
 | 
| 
Nenue@93
 | 
   103   if (not self.showName) and (not isActive) then
 | 
| 
Nenue@93
 | 
   104     --print(self:GetName(), 'no name no active, fade out')
 | 
| 
Nenue@93
 | 
   105     self:SetAlpha(0.5)
 | 
| 
Nenue@93
 | 
   106   else
 | 
| 
Nenue@93
 | 
   107     self:SetAlpha(1)
 | 
| 
Nenue@93
 | 
   108   end
 | 
| 
Nenue@93
 | 
   109 
 | 
| 
Nenue@93
 | 
   110   self:SetWidth(self.caption.name:GetStringWidth() + DOCK_BUTTON_PADDING)
 | 
| 
Nenue@93
 | 
   111 end
 | 
| 
Nenue@93
 | 
   112 
 | 
| 
Nenue@93
 | 
   113 function DevianDockButtonMixin:Select()
 | 
| 
Nenue@93
 | 
   114   self.caption.pulse:Stop()
 | 
| 
Nenue@93
 | 
   115   self:Update()
 | 
| 
Nenue@93
 | 
   116 end
 | 
| 
Nenue@32
 | 
   117 
 | 
| 
Nenue@32
 | 
   118 --- Spaces each frame evenly across the screen.
 | 
| 
Nenue@32
 | 
   119 function D:DistributeFrames() --
 | 
| 
Nenue@50
 | 
   120   local max = self.num_channels
 | 
| 
Nenue@50
 | 
   121   local num_side = ceil(sqrt(max))
 | 
| 
Nenue@50
 | 
   122   local w = GetScreenWidth() / num_side
 | 
| 
Nenue@50
 | 
   123   local h = GetScreenHeight() / num_side
 | 
| 
Nenue@50
 | 
   124   for i, frame in pairs(D.console) do
 | 
| 
Nenue@50
 | 
   125     local dx = (i-1) % num_side
 | 
| 
Nenue@50
 | 
   126     local dy = floor((i-1) / num_side)
 | 
| 
Nenue@50
 | 
   127     frame.width = w
 | 
| 
Nenue@50
 | 
   128     frame.height = h
 | 
| 
Nenue@50
 | 
   129     frame.x = dx * w
 | 
| 
Nenue@50
 | 
   130     frame.y = -(dy * h)
 | 
| 
Nenue@50
 | 
   131     frame:Save()
 | 
| 
Nenue@50
 | 
   132   end
 | 
| 
Nenue@32
 | 
   133 end
 | 
| 
Nenue@32
 | 
   134 
 | 
| 
Nenue@32
 | 
   135 --- Place all frames stacked beneath the primary frame.
 | 
| 
Nenue@32
 | 
   136 function D:StackFrames()
 | 
| 
Nenue@32
 | 
   137   local last
 | 
| 
Nenue@50
 | 
   138   for _, frame in pairs(self.console) do
 | 
| 
Nenue@32
 | 
   139     if last then
 | 
| 
Nenue@32
 | 
   140       frame.x = last.x
 | 
| 
Nenue@32
 | 
   141       frame.y = last.y - 20
 | 
| 
Nenue@32
 | 
   142     else
 | 
| 
Nenue@32
 | 
   143       frame.x = (GetScreenWidth()-frame:GetWidth())/2
 | 
| 
Nenue@32
 | 
   144       frame.y = 0
 | 
| 
Nenue@32
 | 
   145     end
 | 
| 
Nenue@32
 | 
   146     frame:Save()
 | 
| 
Nenue@32
 | 
   147     last = frame
 | 
| 
Nenue@32
 | 
   148   end
 | 
| 
Nenue@32
 | 
   149 end
 | 
| 
Nenue@32
 | 
   150 
 | 
| 
Nenue@93
 | 
   151 function D:Dock_OnMouseWheel(delta)
 | 
| 
Nenue@93
 | 
   152   if delta >= 1 then
 | 
| 
Nenue@93
 | 
   153     D.dockScale = (D.dockScale or 1) - 0.1
 | 
| 
Nenue@93
 | 
   154   else
 | 
| 
Nenue@93
 | 
   155     D.dockScale = (D.dockScale or 1) + 0.1
 | 
| 
Nenue@93
 | 
   156   end
 | 
| 
Nenue@93
 | 
   157   D:UpdateDock()
 | 
| 
Nenue@93
 | 
   158 end
 | 
| 
Nenue@32
 | 
   159 
 | 
| 
Nenue@50
 | 
   160 --- Space everything and set the dock size
 | 
| 
Nenue@46
 | 
   161 function D:UpdateDock()
 | 
| 
Nenue@47
 | 
   162   local pad_offset = 12
 | 
| 
Nenue@93
 | 
   163   local drawWidth = 0
 | 
| 
Nenue@93
 | 
   164   local lastButton
 | 
| 
Nenue@93
 | 
   165   local numButtons = 0
 | 
| 
Nenue@93
 | 
   166   for i, d in ipairs(self.dock.buttons) do
 | 
| 
Nenue@93
 | 
   167     if d and d:IsShown() then
 | 
| 
Nenue@93
 | 
   168       d:SetScale(D.dockScale or 1)
 | 
| 
Nenue@93
 | 
   169       if lastButton then
 | 
| 
Nenue@93
 | 
   170         d:SetPoint('TOPLEFT', lastButton, 'TOPRIGHT', pad_offset, 0)
 | 
| 
Nenue@93
 | 
   171       else
 | 
| 
Nenue@93
 | 
   172         d:SetPoint('TOPLEFT',  DevianDock, 'TOPLEFT', pad_offset, 0)
 | 
| 
Nenue@93
 | 
   173       end
 | 
| 
Nenue@73
 | 
   174 
 | 
| 
Nenue@93
 | 
   175       drawWidth =  drawWidth + d:GetWidth() + pad_offset
 | 
| 
Nenue@93
 | 
   176       lastButton = d
 | 
| 
Nenue@93
 | 
   177       numButtons = numButtons + 1
 | 
| 
Nenue@93
 | 
   178       print(numButtons)
 | 
| 
Nenue@73
 | 
   179     end
 | 
| 
Nenue@47
 | 
   180   end
 | 
| 
Nenue@93
 | 
   181   self.numButtons = numButtons
 | 
| 
Nenue@93
 | 
   182   self.dock:SetWidth(drawWidth)
 | 
| 
Nenue@93
 | 
   183   self.db.dockPoint = self.db.dockPoint or 'TOP'
 | 
| 
Nenue@93
 | 
   184   self.dock:SetPoint(self.db.dockPoint, UIParent, self.db.dockPoint, 0, 0)
 | 
| 
Nenue@50
 | 
   185 end
 | 
| 
Nenue@46
 | 
   186 
 | 
| 
Nenue@47
 | 
   187 
 | 
| 
Nenue@58
 | 
   188 local function FrameFade(frame)
 | 
| 
Nenue@58
 | 
   189   if not D.fader then
 | 
| 
Nenue@58
 | 
   190     D.fader = CreateFrame('Frame', 'DevianFaderFrame', UIParent):CreateAnimationGroup('fader'):CreateAnimation('Alpha', 'FadeIn')
 | 
| 
Nenue@58
 | 
   191   end
 | 
| 
Nenue@46
 | 
   192 end |