# HG changeset patch
# User Nenue
# Date 1451201446 18000
# Node ID e6650821a2c0f0cf58e13866102679f9dd5637f8
# Parent c6a2c2df4790863166cdc5d0b25946e15deebac3
Debugging pass on console code.
diff -r c6a2c2df4790 -r e6650821a2c0 Devian.lua
--- 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
diff -r c6a2c2df4790 -r e6650821a2c0 Devian.xml
--- a/Devian.xml Sat Dec 26 21:51:57 2015 -0500
+++ b/Devian.xml Sun Dec 27 02:30:46 2015 -0500
@@ -5,11 +5,71 @@
.
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
- self.header:SetText(self.index..' '.. self.signature)
+ self.title:SetText(self.index..' '.. self.signature)
local up = delta > 0
@@ -43,69 +103,9 @@
end
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -163,6 +163,40 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff -r c6a2c2df4790 -r e6650821a2c0 Dock.lua
--- a/Dock.lua Sat Dec 26 21:51:57 2015 -0500
+++ b/Dock.lua Sun Dec 27 02:30:46 2015 -0500
@@ -9,78 +9,9 @@
local _G = _G
local db = DevianDB
+local function Dock_MenuClick() end
local function Dock_MouseDown(self, button, up)
- local parent = self.dockedTo and D.console[self.dockedTo] or self
- local docked = parent.docked
- if docked == nil then
- docked = {}
- end
- local worklist = {}
- for _, i in pairs(docked) do
- table.insert(worklist, D.console[i])
- end
-
- if not up then
- if button ~= 'RightButton' then
- if parent.titlebar:IsMouseOver() or not parent.isDocked then
- parent:ToFront()
- else
- parent.out:Hide()
- end
-
- if parent.out.grip:IsMouseOver() then
- parent:StartSizing()
- else
- parent:StartMoving()
- end
- else
- parent:MinMax()
- end
-
- else
- if button ~= 'RightButton' then
- if parent.titlebar:IsMouseOver() then
- parent.out:Show()
- end
- parent:StopMovingOrSizing()
- end
- end
-
- local fixparent = true
- for _, frame in pairs(worklist) do
- if not up then
- if button ~= 'RightButton' then
- if frame.titlebar:IsMouseOver() then
- frame:ToFront()
- fixparent = nil
- else
- frame.out:Hide()
- end
- if parent.out.grip:IsMouseOver() then
- frame:StartSizing()
- else
- frame:StartMoving()
- end
- end
- else
- if button ~= 'RightButton' then
- frame:StopMovingOrSizing()
- frame:SetPoint('TOPLEFT', parent, 'TOPLEFT')
- frame:SetPoint('BOTTOMRIGHT', parent, 'BOTTOMRIGHT')
- frame.x = nil
- frame.y = nil
- frame.width = nil
- frame.height = nil
- frame:Save()
-
- end
- end
- end
-
- if fixparent then
- parent.out:Show()
- end
end
local function Dock_MouseUp (self, button)
Dock_MouseDown(self, button, true)
@@ -130,7 +61,8 @@
frame.y = nil
frame.width = nil
frame.height = nil
- frame.oldscript = frame:GetScript('OnMousedown')
+ frame.scriptsMD = frame:GetScript('OnMouseDown')
+ frame.scriptsMU = frame:GetScript('OnMouseUp')
frame:SetScript('OnMouseDown', nil)
frame:SetScript('OnMouseUp', nil)
frame:Save()