changeset 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 36290c315606
children c90e45d1fa77
files Config.lua Devian.lua Devian.xml Dock.lua UI.lua
diffstat 5 files changed, 80 insertions(+), 141 deletions(-) [+]
line wrap: on
line diff
--- a/Config.lua	Mon Jan 04 08:39:07 2016 -0500
+++ b/Config.lua	Tue Jan 05 01:37:29 2016 -0500
@@ -1,4 +1,4 @@
----
+--- Devian - Config.lua
 -- @file-author@
 -- @project-revision@ @project-hash@
 -- @file-revision@ @file-hash@
--- a/Devian.lua	Mon Jan 04 08:39:07 2016 -0500
+++ b/Devian.lua	Tue Jan 05 01:37:29 2016 -0500
@@ -1,4 +1,4 @@
---- ${PACKAGE_NAME}
+--- Devian - Devian.lua
 -- @file-author@
 -- @project-revision@ @project-hash@
 -- @file-revision@ @file-hash@
@@ -74,8 +74,8 @@
   dock_fade_out = 0.45,
   dock_button_alpha_on = 1,
   dock_button_alpha_off = 0.2,
-  dock_button_fade_in = 0.15,
-  dock_button_fade_out = 0.45
+  dock_button_fade_in = 0.075,
+  dock_button_fade_out = 0.075
 
 }
 
--- a/Devian.xml	Mon Jan 04 08:39:07 2016 -0500
+++ b/Devian.xml	Tue Jan 05 01:37:29 2016 -0500
@@ -239,10 +239,10 @@
     <Size x="32" y="20" />
     <Layers>
       <Layer level="ARTWORK">
-        <Texture name="$parentBar" parent="DevianDock" setAllPoints="true" parentKey="bar" alphaMode="BLEND">
+        <Texture name="$parentBar" parent="DevianDock" setAllPoints="true" parentKey="caption" alphaMode="BLEND">
           <Color r="1" g="1" b="1" a="1" />
           <Gradient orientation="VERTICAL">
-            <MaxColor r="0" g="0" b="0" a="1" />
+            <MaxColor r="0.15" g=".15" b="0.15" a="0.4" />
             <MinColor r="0" g="0" b="0" a="0" />
           </Gradient>
         </Texture>
@@ -256,14 +256,10 @@
 
   <Button name="DevianBeacon" hidden="true" inherits="DevianButton" virtual="true" enableMouse="true" alpha="1" frameStrata="MEDIUM">
     <Size x="64" y="32" />
-    <TexCoords top="0" left="0" bottom="1" right="1" />
 
     <Scripts>
       <OnShow>
-        if self.console.index ~= DevianDB.current_channel then
-          UIFrameFadeIn(self,DevianDB.dock_onshow_fade_time, DevianDB.dock_onshow_fade_from, DevianDB.dock_onshow_fade_to)
-          UIFrameFadeIn(self.caption,DevianDB.dock_onshow_fade_time, DevianDB.dock_onshow_fade_from, 0)
-        end
+        Devian.UpdateBeacon(self)
       </OnShow>
       <OnMouseDown>
         --print("click", self:GetName(), button, self.console.index)
--- a/Dock.lua	Mon Jan 04 08:39:07 2016 -0500
+++ b/Dock.lua	Tue Jan 05 01:37:29 2016 -0500
@@ -1,100 +1,36 @@
---- ${PACKAGE_NAME}
+--- Devian - Dock.lua
 -- @file-author@
 -- @project-revision@ @project-hash@
 -- @file-revision@ @file-hash@
 -- Created: 12/26/2015 12:32 PM
--- Dock management functions
+-- Docking and arrangement calls
 
 local D = LibStub("AceAddon-3.0"):GetAddon("Devian")
-local _G = _G
+local ceil, floor, sqrt, pairs, GetScreenWidth, GetScreenHeight =  math.ceil, math.floor, math.sqrt, pairs, GetScreenWidth, GetScreenHeight
+local UIFrameFadeIn, UIFrameFadeOut = UIFrameFadeIn, UIFrameFadeOut
 local db
 
-local function Dock_MenuClick() end
-
-local function Dock_MouseDown(self, button, up)
-end
-local function Dock_MouseUp (self, button)
-  Dock_MouseDown(self, button, true)
-end
-
---- Adjusts frame element alignments
-local function PrepareForDock (frame, draw_x)
-  frame.left:SetPoint('TOPLEFT', frame.out, 'TOPLEFT', -2, 0)
-  frame.left:SetPoint('BOTTOMRIGHT', frame.out, 'BOTTOMLEFT', 0, 0)
-  frame.topleft:SetPoint('BOTTOMRIGHT', frame.out, 'TOPLEFT', 0, 0)
-  frame.top: SetPoint('TOPLEFT', frame.out, 'TOPLEFT', 0, 2)
-  frame.top:SetPoint('BOTTOMRIGHT', frame.out, 'TOPRIGHT', 0, 0)
-  frame.topright:SetPoint('BOTTOMLEFT', frame.out, 'TOPRIGHT', 0, 0)
-  frame.right:SetPoint('TOPLEFT', frame.out, 'TOPRIGHT', 0, 0)
-  frame.header:SetWidth(frame.header:GetStringWidth() * 1.2)
-  frame.header:SetPoint('TOPLEFT', frame, 'TOPLEFT', draw_x+4, 0)
-  frame.titlebar:SetPoint('TOPLEFT', frame.header, 'TOPLEFT', -4, 0)
-  frame.titlebar:SetPoint('TOPRIGHT', frame.header, 'TOPRIGHT', 0, 0)
-
-  return (draw_x + frame.header:GetStringWidth() * 1.2 + 4)
-end
-
-
---- Docks frames together
--- @param target frame on which to dock
--- @param ... frame objects to be docked
---
-function D:DockFrame(...)
-  local target = D.console[select(1,...)]
-  if target.dockedTo then
-    local t = D.c[target.dockedTo]
-    --print('channel',target.index,target.signature, 'is docked to',t.index, t.signature..'. using that instead')
-    target = D.console[target.DockedTo]
-  end
-
-  target.docked = {}
-  local draw_x = PrepareForDock(target, 4)
-  for i = 2, select('#', ...) do
-    local frame = D.console[select(i, ...)]
-    frame.dockedTo = target.index
-    width, draw_x = MorphToDock (frame, draw_x)
-    table.insert(target.docked, frame.index)
-    frame:ClearAllPoints()
-    frame:SetPoint('TOPLEFT', target, 'TOPLEFT', 0, 0)
-    frame:SetSize(target:GetWidth(), target:GetHeight())
-    frame.x = nil
-    frame.y = nil
-    frame.width = nil
-    frame.height = nil
-    frame.scriptsMD = frame:GetScript('OnMouseDown')
-    frame.scriptsMU = frame:GetScript('OnMouseUp')
-    frame:SetScript('OnMouseDown', nil)
-    frame:SetScript('OnMouseUp', nil)
-    frame:Save()
-  end
-end
-
 --- Spaces each frame evenly across the screen.
 function D:DistributeFrames() --
---print('frame grid:', max, num_side)
-local max = self.num_channels
-local num_side = math.ceil(math.sqrt(max))
-local w = GetScreenWidth() / num_side
-local h = GetScreenHeight() / num_side
-for i, frame in pairs(D.console) do
-  local dx = (i-1) % num_side
-  local dy = math.floor((i-1) / num_side)
-
-  --print('move:', frame.signature, 'dx=', dx, 'dy=', dy)
-  --print('move:', frame.signature, '                                       x=', dx * w, 'y=', -(dy * h), 'h=', h, 'w=', w)
-  frame.width = w
-  frame.height = h
-  frame.x = dx * w
-  frame.y = -(dy * h)
-  frame:Save()
-end
-
+  local max = self.num_channels
+  local num_side = ceil(sqrt(max))
+  local w = GetScreenWidth() / num_side
+  local h = GetScreenHeight() / num_side
+  for i, frame in pairs(D.console) do
+    local dx = (i-1) % num_side
+    local dy = floor((i-1) / num_side)
+    frame.width = w
+    frame.height = h
+    frame.x = dx * w
+    frame.y = -(dy * h)
+    frame:Save()
+  end
 end
 
 --- Place all frames stacked beneath the primary frame.
 function D:StackFrames()
   local last
-  for i, frame in pairs(self.console) do
+  for _, frame in pairs(self.console) do
     if last then
       frame.x = last.x
       frame.y = last.y - 20
@@ -108,7 +44,7 @@
 end
 
 
----
+--- Space everything and set the dock size
 function D:UpdateDock()
   local pad_offset = 12
   local draw_offset = pad_offset
@@ -117,66 +53,77 @@
     d:SetPoint('TOPLEFT',  DevianDock, 'TOPLEFT', draw_offset, 0)
     draw_offset=  draw_offset + d:GetWidth() + pad_offset
   end
+  self.dock:SetWidth(draw_offset)
+end
 
-  self.dock:SetWidth(draw_offset)
+--- Updates region visibility as needed
+local getFadeInArgs = function(sign, region)
+  --print('Dvn', region)
+  local db = D.db
+  local alph = region:GetAlpha()
+  local a = (db[sign..'_alpha_on'] - alph)
+  local b = (db[sign..'_alpha_on']-db[sign..'_alpha_off'])
+  local dur = (a / b) * db[sign..'_fade_in']
+  return dur, alph, db[sign..'_alpha_on']
+end
+
+local getFadeOutArgs = function(sign, region)
+  local db = D.db
+  local alph = region:GetAlpha()
+  local a = (alph  - db[sign..'_alpha_off'])
+  local b = (db[sign..'_alpha_on']-db[sign..'_alpha_off'])
+  local dur = (a / b) * db[sign..'_fade_out']
+  return dur, alph, db[sign..'_alpha_off']
+end
+
+function D.UpdateBeacon(beacon)
+  local db = D.db
+  local isActive = (beacon.raised or beacon.selected)
+  if isActive then
+    UIFrameFadeIn(beacon, getFadeInArgs('dock_button', beacon))
+  end
+  if beacon.showName or isActive then
+    UIFrameFadeIn(beacon.caption, getFadeInArgs('dock_button', beacon.caption))
+  end
+
+  if not isActive then
+    UIFrameFadeOut(beacon, getFadeOutArgs('dock_button', beacon))
+  end
+  if (not beacon.showName) and (not isActive) then
+    UIFrameFadeOut(beacon.caption,getFadeOutArgs('dock_button', beacon.caption))
+  end
 end
 
 --- Dock interactions
 function D.DockHighlight(beacon)
   db = D.db
-  --print('Dvn', 'dock mouse event', beacon)
   local self = D.dock
   local mouseOverDock
-    --for i, b in pairs(self.buttons) do
-      --print('polling', i, b:GetName())
   if self:IsMouseOver() then
     mouseOverDock = true
   end
 
-
   if beacon and beacon:IsMouseOver() then
     mouseOverDock = true
-    --print('mouse is over', i, b:GetName())
-
     if not beacon.raised then
       beacon.raised = true
-      local a = (db.dock_button_alpha_on - self:GetAlpha())
-      local b = (db.dock_button_alpha_on-db.dock_button_alpha_off)
-      local dur = (a / b) * db.dock_button_fade_in
-      --print(a, b, db.dock_button_fade_in, dur)
-      UIFrameFadeIn(beacon, dur,beacon:GetAlpha(),db.dock_button_alpha_on)
-      UIFrameFadeIn(beacon.caption, dur,beacon:GetAlpha(),1)
+      D.UpdateBeacon(beacon)
     end
   elseif beacon.raised and beacon.index ~= db.current_channel then
     beacon.raised = nil
-    local a = (self:GetAlpha() - db.dock_button_alpha_off)
-    local b = (db.dock_button_alpha_on-db.dock_button_alpha_off)
-    local dur = (a / b) * db.dock_button_fade_out
-    --print(a, b, db.dock_button_fade_in, dur)
-    UIFrameFadeOut(beacon, dur,beacon:GetAlpha(),db.dock_button_alpha_off)
-    UIFrameFadeOut(beacon.caption, dur,beacon:GetAlpha(),0)
+    D.UpdateBeacon(beacon)
   end
 
-      --end
-    --end
   if mouseOverDock then
+    -- Raise it up
     if not self.raised then
-    --print('rising')
     self.raised = true
-    local a = (db.dock_alpha_on - self:GetAlpha())
-    local b = (db.dock_alpha_on-db.dock_alpha_off)
-    local dur = (a / b) * db.dock_fade_in
-    --print(a, b, db.dock_fade_in, dur)
-    UIFrameFadeIn(self, dur,self:GetAlpha(),db.dock_alpha_on)
+    UIFrameFadeIn(self, getFadeInArgs('dock', self))
     end
   elseif  self.raised then
-    --print('dropping')
+    -- Drop it down
     self.raised = nil
-    local a = (self:GetAlpha() - db.dock_alpha_off)
-    local b = (db.dock_alpha_on-db.dock_alpha_off)
-    local dur = (a / b) * db.dock_fade_out
-    --print(a, b, db.dock_fade_in, dur)
-    UIFrameFadeOut(self, dur,self:GetAlpha(),db.dock_alpha_off)
+    UIFrameFadeOut(self, getFadeOutArgs('dock', self))
   end
 
 end
\ No newline at end of file
--- a/UI.lua	Mon Jan 04 08:39:07 2016 -0500
+++ b/UI.lua	Tue Jan 05 01:37:29 2016 -0500
@@ -1,19 +1,13 @@
---- ${PACKAGE_NAME}
+--- Devian - UI.lua
 -- @file-author@
 -- @project-revision@ @project-hash@
 -- @file-revision@ @file-hash@
 -- Created: 12/27/2015 3:01 AM
-
-
 if not LibStub then
   print('Something has happened...')
 end
 local D = LibStub("AceAddon-3.0"):GetAddon("Devian")
-
-
-
 local DEVIAN_FRAME = 'DevianConsole'
-local DEVIAN_DOCK_FRAME = 'DevianDock'
 
 
 local function Console_MinMax(self)
@@ -77,7 +71,6 @@
   db.minimized = self.minimized and true or nil
   db.enabled = self:IsVisible() and true or nil
   db.active = self.active and true or nil
-  --print('save:', db.signature, 'min=', db.minimized, ' enabled=', db.enabled, ' active = ', db.active, 'x=', db.x, 'y=', db.y, 'h=', db.height, 'w=', db.width)
   self:SetPoint('TOPLEFT', UIParent, 'TOPLEFT', db.x, db.y)
   self:SetWidth(db.width)
 end
@@ -86,11 +79,6 @@
 -- Frame method used to bring a console frame to the front of the display stack.
 local function Console_ToFront(c)
   local db = D.db
-  --print(D.raise_ct, 'Raising', c.signature)
-  --print(unpack(db.frontdrop))
-  --print(unpack(db.frontgrad))
-  --print(db.frontblend)
-  -- D.raise_ct = D.raise_ct + 1
   c:Raise()
   c:SetAlpha(db.frontalpha)
   c.out.backdrop:SetTexture(unpack(db.frontdrop))
@@ -100,16 +88,17 @@
   c.title:SetTextColor(unpack(db.frontborder))
   db.current_channel = c.index
 
+  -- update dock buttons
+  local beacon = D.dock.buttons[c.index]
+  beacon.selected = true
+  D.UpdateBeacon(beacon)
+
   for _, part in pairs(c.border) do
     part:SetTexture(unpack(db.frontborder))
   end
 
   for id, bc in pairs(D.console) do
     if id ~= c.index then
-      --print(D.raise_ct, 'Lowering', bc.signature)
-      --print(unpack(db.backdrop))
-      --print(unpack(db.backgrad))
-      --print(db.backblend)
       bc:SetAlpha(db.backalpha)
       bc.out.backdrop:SetTexture(unpack(db.backdrop))
       bc.out.backdrop:SetGradientAlpha(unpack(db.backgrad))
@@ -117,6 +106,10 @@
       bc.dropmenu.icon:SetVertexColor(unpack(db.backheader))
       bc.title:SetTextColor(unpack(db.backborder))
 
+      local beacon = D.dock.buttons[bc.index]
+      beacon.selected = nil
+      D.UpdateBeacon(beacon)
+
       for _, part in pairs(bc.border) do
         part:SetTexture(unpack(db.backborder))
       end