diff Devian.lua @ 33:e6650821a2c0

Debugging pass on console code.
author Nenue
date Sun, 27 Dec 2015 02:30:46 -0500
parents c6a2c2df4790
children 7441f3bce940
line wrap: on
line diff
--- a/Devian.lua	Sat Dec 26 21:51:57 2015 -0500
+++ b/Devian.lua	Sun Dec 27 02:30:46 2015 -0500
@@ -11,33 +11,38 @@
 local WORKSPACE_ON, WORKSPACE_OFF = 1, 2
 local PLAYER_REALM = UnitName("player") .. '-' .. GetRealmName()
 local DEVIAN_FRAME = 'DevianConsole'
+local DEVIAN_DOCK_FRAME = 'DevianDockFrame'
+local MSG_NEED_DEV_MODE = 'Must be in development mode to use this function.'
 local print = _G.print
 local db
 local defaults = {
   ['global'] = {{}, {}},
   ['tags'] = {},
   ['channels'] = {[1] = {signature = 'Main', index = 1, x = 100, y = 800, height = 500, width = 600, enabled = true}},
-  primary_channel = 1,
-  current_channel = 1,
-  max_channel = 1,
-  toggle = true,
-  load_message = "Defaults loaded.",
-  font = [[Interface\Addons\Devian\font\SourceCodePro-Regular.ttf]],
+  primary_channel = 1, -- the channel to which default output is sent
+  current_channel = 1, -- the front channel
+  max_channel = 1, -- the highest created channel id
+  enable = true, -- allow enabled consoles to appear
+  load_message = "Defaults loaded.", -- messages to be displayed after reload
+  font = [[Interface\Addons\Devian\font\SourceCodePro-Regular.ttf]], -- font info
   fontsize = 13,
   fontoutline = 'NONE',
-  headergrab = {'VERTICAL', 0, 0, 0, 0.5, 0.1, 0.1, 0.1, 0.3},
-  backalpha = 0.5,
-  backdrop = {0,0,0,0.4},
+  headergrad = {'VERTICAL', 0, 0, 0, 0.5, 0.1, 0.1, 0.1, 0.3}, -- header info
+  headerdrop = {1,1,1,1},
+  headeralpha = 1,
+  backdrop = {0,0,0,1},                                        -- background frame info
   backgrad = {'VERTICAL', 0.1, 0.1, 0.1, 0.3, 0, 0, 0, 0.5},
-  backblend = 'BLEND',
-  frontdrop = {0,0,0,1},
+  backblend = 'MOD',
+  backalpha = 0.7,
+  backborder = {0,0,1,0.75},
+  frontdrop = {0,0,0,1},                                       -- foreground frame info
   frontgrad = {'VERTICAL', 0.1, 0.1, 0.1, 0.9, 0, 0, 0, 0.9},
-  frontblend = 'BLEND',
+  frontblend = 'MOD',
   frontalpha = 1,
   frontborder = {1,0,0,1},
-  backborder = {0,0,1,0.75},
-  tagcolor = {},
-  workspace = 1,
+  tagcolor = {},   -- tag color repository
+  workspace = 1,   -- current profile
+  last_workspace = 2 -- default workspace to alternate with when just "/dvn" is issued
 }
 
 
@@ -55,6 +60,10 @@
 
   -- no args, toggle ui
   if mode == 'dock' then
+    if db.workspace == 1 then
+      D:Print('Must be in dev mode to use this.')
+      return
+    end
     if #args <= 2 then
       D:Print("Not enough arguments for dock command.")
       return
@@ -93,10 +102,19 @@
 
 
   elseif mode == 'stack' then
+    if db.workspace == 1 then
+      return D:Print(MSG_NEED_DEV_MODE)
+    end
     return D:StackFrames()
   elseif mode == 'grid' then
+    if db.workspace == 1 then
+      return D:Print(MSG_NEED_DEV_MODE)
+    end
     return D:DistributeFrames()
   elseif mode == 'tag' then -- tagging
+    if db.workspace == 1 then
+      return D:Print(MSG_NEED_DEV_MODE)
+    end
 
     if tag ~= nil and dest ~= nil then
       -- convert to ID
@@ -135,9 +153,15 @@
     else
       list_state = tonumber(mode)
       db.workspace = list_state
+      if list_state ~= 1 then
+        db.last_workspace = list_state
+      end
+
     end
   elseif mode == nil then
-    list_state = db.last_workspace and db.last_workspace or 1
+    list_state = (db.workspace == 1) and db.last_workspace or 1
+    db.workspace = list_state
+    db.load_message = "quick swapped workspace #"..list_state
   else
     return D:PrintHelp()
   end
@@ -172,7 +196,7 @@
           --print('DisableAddOn(', i, ',', value,')')
           DisableAddOn(i,value)
         end
-      else
+      elseif mode ~= 'save' then
         if type(db.unlisted) ~= 'table' then
           db.unlisted = {}
         end
@@ -183,7 +207,7 @@
   end
 
   if mode ~= 'save' then
-    db.load_message = "AddOn profile ".. list_state .." was loaded."
+    --db.load_message = "AddOn profile ".. list_state .." was loaded."
     ReloadUI()
   else
       D:Print('Profile #'.. (list_state)..' saved.')
@@ -267,6 +291,9 @@
 -- @paramsig [...]
 -- @param ... one or more space-seperated channel keys
 local function Console_Toggle(input)
+  if db.workspace == 1 then
+    return D:Print(MSG_NEED_DEV_MODE)
+  end
   local search = {}
   local n = 0
   if D:GetArgs(input,1) then
@@ -282,24 +309,22 @@
     search = D.console
   end
 
-  db.toggle = not db.toggle and true or nil
+  db.enabled = (not db.enabled) and true or nil
   for i, c in ipairs(search) do
-    print(i,c.index)
-    if db.toggle then
+    --print(i,c.index)
+    if db.enabled then
       c.enabled = true
       c:Show()
       if db.current_channel == c.index then
         c:ToFront()
       end
+      c:Save()
     else
-      c.enabled = nil
-      c.minimized = nil
-      c:Maximize()
       c:Hide()
     end
   end
 
-  if db.toggle then
+  if db.enabled then
     D:Print('toggled on?')
   else
     D:Print('toggled off?')
@@ -376,7 +401,7 @@
 -- @param Tag, signature, or numeric index of the channel to output on. Defaults to primary channel.
 -- @param ... Output contents.
 local function Message(prefix, ...)
-  if db.enabled == true then
+  if not db.enabled then
     return D.oldprint(prefix, ...)
   end
 
@@ -453,13 +478,28 @@
 -- @param i Numeric index of the channel as it manifests in db.channels
 -- @param vars Optional settings table to be used.
 local function CreateConsole(i, vars)
+  if tonumber(i) == nil or math.floor(i) ~= i then
+    error('Non-integer index value.')
+  end
+  if not vars then
+    vars = db.channels[i] and db.channels[i] or db.channels[db.primary_channel]
+  end
+  local f
+  if vars.docked then
+    f = CreateFrame('Frame','DevianDockFrame' .. i, DEVIAN_DOCK_FRAME)
+  else
+    f= CreateFrame('Frame', 'DevianChannelFrame' .. i, UIParent, DEVIAN_FRAME)
+  end
+  --@debug@
+  --print(f:GetName())
 
-  if not vars then
-    vars = db.channels[i]
+  --print('create(2)')
+  for k,v in pairs(vars) do
+    f[k] = v
+    --@debug@
+    --print(' f['..type(k)..' '..tostring(k)..'] = '..type(v)..' '..tostring(v))
   end
 
-  --print('make:', vars.signature, '(', vars.x, vars.y, ')', vars.width, 'x', vars.height)
-  local f = CreateFrame('Frame', 'DevianChannelFrame' .. tostring(i), UIParent, DEVIAN_FRAME)
   f:SetPoint('TOPLEFT', UIParent, 'TOPLEFT', vars.x, vars.y)
   f:SetSize(vars.width, vars.height)
   f:Lower()
@@ -470,139 +510,137 @@
     f.out.backdrop:SetTexture(unpack(db.backdrop))
   end
 
+
+
   f.Save = Console_Save
   f.Minimize = Console_Minimize
   f.Maximize = Console_Maximize
   f.MinMax = Console_MinMax
   f.ToFront = Console_ToFront
   f.Toggle = D.Console_Toggle
-  f.name = vars.name
-  f.index = i
-  f.signature = vars.signature
-  f.format = vars.header
-  f.x = vars.x
-  f.y = vars.y
-  f.width = vars.width
-  f.height = vars.height
-  f.docked = vars.docked
-  f.dockedTo = vars.dockedTo
-
   f:SetScript('OnMouseDown', Console_MouseDown)
   f:SetScript('OnMouseUp', Console_MouseUp)
-  if vars.enabled  then
-    f.enabled = true
-    if db.toggle then
-      f:Show()
-    end
-  end
+
   if vars.minimized then
     f:Minimize()
   else
     f:Maximize()
   end
+  if db.enabled and f.enabled then
+      f:Show()
+  end
 
   return f
 end
 
---- Updates a console "channel" entry, generating a new one if necessary.
--- Config data will be take from cinfo. If cinfo is a string, then only channel signature is set. The remaining variables are filled in from the primary channel.
--- i can be given to select a specific channel table entry to work on. Otherwise, it will just create a new channel and the frame associated with it.
--- @usage cinfo [, i]
--- @param cinfo Config variables table, or a string to be used as channel signature
--- @param i Console index. If valid, settings will be inherited from that channel.
-function D:SetChannel(cinfo, i)
-  -- try to resolve from arguments
-  local dbvars
+--- Updates console information and returns the handle of the channel object that was worked on.
+-- When key is nil or not a valid handle, a new channel is created using whatever signature can be found in cinfo.
+-- The signature can be passed as a string, or as a table entry under the key 'signature'
+-- If the signature of a new channel is also a tag, the channel will be added to that tag
+-- @param cinfo string signature of a new channel, or a table of config variables to be imposed on the channel
+-- @param key string signature or index number of channel to operate on
+-- @usage channel = D:SetChannel('new', nil) -- creates a new channel
+-- @usage channel = D:SetChannel({x = 200, y = 100}, 4) -- updates channel #4
+function D:SetChannel(cinfo, key)
   local t_info = {}
-  local channel
-  local isNew
-  if type(i) =='number' and  db.channels[i] then
-      dbvars = db.channels[i]
-  elseif type(i) == 'string' and D.sig[i] then
-    dbvars = db.channels[D.sig[i].index]
+  local channel, isNew, id, sig, t_id
+  -- obtain source data
+  if tonumber(key) ~= nil and  db.channels[key] then
+    id = tonumber(key)
+  elseif D.sigID[tostring(key)] then
+    id = D.sigID[tostring(key)]
   else
-    dbvars = db.channels[db.primary_channel]
+    id = db.primary_channel
     isNew = true
   end
+  local dbvars = db.channels[id]
+  t_id = id           -- overridden later if new
+  t_info.index = t_id --
+  --@debug@
+  --print('setchan(1) cinfo, key, id=', cinfo, key, id)--@end-debug@
 
+
+  -- obtain config info
+  if type(cinfo) == 'string' then
+    sig = cinfo
+    cinfo = {signature = sig}
+  elseif type(cinfo) ~= 'table' then -- stop here if a table wans't passed
+    error('Expecting table of string as arg1')
+  elseif cinfo.signature then -- new sig
+    sig = cinfo.signature
+  elseif isNew then -- new channel sig
+    sig = 'Ch'
+  else -- old sig
+    sig = db.channels[id].signature
+  end
+  t_info.signature = sig
   --@debug@
-  print('setchan(1)', cinfo, i, isNew)--@end-debug@
+  --print('setchan(2) sig,id,isNew=', sig, id, isNew)--@end-debug@
 
-  if type(cinfo) == 'string' and not db.sig[cinfo] then
-    t_info.signature = cinfo
-    cinfo = {}
-  elseif type(cinfo) ~= 'table' then
-    error('Expecting table of string as arg1')
+  for k,v in pairs(cinfo) do -- allow all cinfo to pass
+    t_info[k] = v
   end
 
-  --@debug@
-  print('setchan(2)', cinfo, i, isNew)--@end-debug@
-
-  --TODO: figure out why tag assignments are getting eaten
-  -- is cinfo a table or signature?
-
-
-
-  -- did we get a signature string?
-  if not (cinfo.signature or t_info.signature) then
-    t_info.signature = 'noname'
+  local blocked = {          -- ignore these vars:
+    ['docked'] = true,       -- table
+    ['dockedTo'] = true,     -- table-related
+    ['signature'] = true}    -- already determined
+  for k,v in pairs(dbvars) do
+    if not t_info[k] and not blocked[k] then -- already set or blocked?
+      t_info[k] = v
+    end
+  end
+  -- new channel overrides
+  if isNew then
+    if D.sigID[sig]then -- find a non-clashing signature
+    local result, i = sig, 1
+    while D.sigID[result] do
+      result = sig .. i
+      i = i + 1
+    end
+    t_info.signature = result
+    end
+    t_id = db.max_channel + 1
+    t_info.index = t_id
+    --@debug@
+    --print('setchan(3a) isNew, sig, t_info.signature=', isNew, sig, t_info.signature)--@end-debug@
+  else
+    --@debug@
+    --print('setchan(3b) isNew, sig, t_info.signature=', isNew, sig, t_info.signature)--@end-debug@
   end
 
-  --@debug@
-  print('setchan(3)', cinfo, i, isNew, t_info.signature)--@end-debug@
-  -- look for existing sigs
-  if D.sig[t_info.signature] then
-    local sigvar = t_info.signature
-    local j = 2
-    while D.sig[sigvar] do
-      sigvar = sigvar .. j
-      j = j + 1
+  local channel
+  if not self.console[t_id] then -- create a frame
+    if isNew then -- position the channel frame
+      t_info.x = t_info.x + 20
+      t_info.y = t_info.y - 20
+      db.channels[t_id] = t_info
+      --@debug@
+      print('setchan(4a)', 't_id, x, y=', t_id, t_info.x, t_info.y)--@end-debug@
     end
-    t_info.signature = sigvar
+    channel = CreateConsole(t_id, t_info)
+    self.console[t_id] = channel
+    self.sig[t_info.signature] = channel
+    self.sigID[t_info.signature] = t_id
+    self.IDsig[t_id] = t_info.signature
+
+  end
+  channel = self.console[t_id]
+  if channel.minimized then
+    channel:Minimize()
+  else
+    channel:Maximize()
   end
 
+  if channel.enabled and db.enabled then -- hide or show last since Min/Max mess with visibility
+    print('setchan(5a) enable')
+    channel:Show()
+  else
+    print('setchan(5a) disable')
+    channel:Hide()
+  end
   --@debug@
-  print('setchan(4)', cinfo, i, isNew, t_info.signature)--@end-debug@
-  -- can proceed to fill in from base vars here
-  for k,v in pairs(dbvars) do
-    if not t_info[k] then
-      if cinfo[k] then
-        t_info[k] = cinfo[k]
-        --@debug@
-        print('setchan(5a)', 'cinfo', k)--@end-debug@
-      elseif db.channels[self.primary_channel][k] then
-        t_info[k] = db.channels[self.primary_channel][k]
-        --@debug@
-        print('setchan(5b)', 'db', self.primary_channel, k)--@end-debug@
-      end
-    end
-  end
-
-  -- we're working with a fresh channel right?
-  if isNew then
-    i = D.num_channels + 1
-    t_info.index = i
-    t_info.x = t_info.x + 20
-    t_info.y = t_info.y - 20
-    db.channels[i] = t_info
-    --@debug@
-    print('setchan(6)', 'new index', i)--@end-debug@
-  end
-
-  -- can proceed to display something from here
-  if not self.console[i] then
-    self.console[i] = CreateConsole(i, t_info)
-    -- if it isn't already spawned, create the frame
-    --@debug@
-    print('setchan(7)', 'new console', i)--@end-debug@
-  end
-  local channel = self.console[i]
-  self.sig[t_info.signature] = channel
-  self.sigID[t_info.signature] = i
-  self.IDsig[i] = t_info.signature
-
-  --@debug@
-  print('setchan(8)', 'end', self.sig[t_info.signature], self.sigID[t_info.signature], self.IDsig[i], self.docked)--@end-debug@
+  --print('setchan(end); c:IsVisible(), c.enabled, db.enabled=', channel:IsVisible(), channel.enabled, db.enabled)--@end-debug@
   return channel
 end
 
@@ -615,7 +653,43 @@
 end
 
 function D:OnEnable()
+  print(MAJOR, MINOR)
+
+  if db.unlisted and #db.unlisted > 0 then
+    D:Print('New AddOns have been found since the last profile update: '.. table.concat(db.unlisted, ', '))
+    table.wipe(db.unlisted)
+  end
+
+  if db.workspace == 1 then
+    D:Print('Gameplay mode active (list #'..db.workspace..'). Print handling turned |cFFFFFF00OFF|r.')
+  else
+    D:Print('Development mode active (list #'..db.workspace..'). Print handling |cFF00FF00ON|r.')
+  end
+
+end
+
+function D:OnInitialize()
   -- commands
+  self:RegisterChatCommand("cleandvn", function(args)
+    DevianDB = nil
+    DevianDB = {
+      load_message = "All SavedVars wiped."
+    }
+    ReloadUI()
+    end)
+  self:RegisterChatCommand("resetdvn", function(args)
+    for k,v in pairs(DevianDB) do
+      if k ~= 'global' then
+        DevianDB[k] = nil
+      end
+    end
+
+    DevianDB.load_message = "Non-user SavedVars have been reset."
+    for k,v in pairs(defaults) do
+      DevianDB[k] = v
+    end
+    ReloadUI()
+  end)
   local cmdlist = {
     ['dvn'] = ScanAddOnList,
     ['devian'] = ScanAddOnList,
@@ -625,35 +699,7 @@
     self:RegisterChatCommand(cmd, func, true)
   end
 
-  if db.workspace == 1 then
-    D:Print('Gameplay mode active. Print handling turned |cFFFFFF00OFF|r..')
-  else
-    D:Print('Development mode active (list #'..db.workspace..'). Print handling |cFF00FF00ON|r.')
-  end
-
-end
-
-function D:OnInitialize()
-  -- emergency button
-  self:RegisterChatCommand("cleandvn", function(args)
-    DevianDB = nil
-    ReloadUI()
-    end)
-  self:RegisterChatCommand("resetdvn", function(args)
-    for k,v in pairs(DevianDB) do
-      if k ~= 'global' then
-        DevianDB[k] = nil
-      end
-    end
-
-    for k,v in pairs(defaults) do
-      DevianDB[k] = v
-    end
-    ReloadUI()
-  end)
-
-  -- savedvars
-  local cherry = false
+  -- pull defaults
   if not _G.DevianDB then
     _G.DevianDB = defaults
   end
@@ -674,7 +720,11 @@
     _G.oldprint = D.oldprint
   end
 
-  --self.raise_ct = 0
+  -- Stop here in game mode
+  if db.workspace == 1 then
+    return
+  end
+
   self.max_channel = 0
   self.num_channels = 0
   self.console = {}
@@ -702,21 +752,8 @@
     self.console[db.current_channel]:ToFront()
     -- bring the current channel to the front
   end
-
-  if db.enabled then
-    for i, c in pairs(self.console) do
-      self.console[i]:Hide()
-    end
+  setprinthandler(Message)
+  print = function(...)
+    _G.print('Dvn', ...)
   end
-
-
-  -- only do this in dev mode
-  if db.workspace > 1 then
-
-    setprinthandler(Message)
-    print = function(...)
-      _G.print('Dvn', ...)
-    end
-  end
-  print(MAJOR, MINOR)
 end
\ No newline at end of file