| 
Nenue@50
 | 
     1 --- Devian - UI.lua
 | 
| 
Nenue@35
 | 
     2 -- @file-author@
 | 
| 
Nenue@35
 | 
     3 -- @project-revision@ @project-hash@
 | 
| 
Nenue@35
 | 
     4 -- @file-revision@ @file-hash@
 | 
| 
Nenue@35
 | 
     5 -- Created: 12/27/2015 3:01 AM
 | 
| 
Nenue@35
 | 
     6 if not LibStub then
 | 
| 
Nenue@35
 | 
     7   print('Something has happened...')
 | 
| 
Nenue@35
 | 
     8 end
 | 
| 
Nenue@66
 | 
     9 local _, D = ...
 | 
| 
Nenue@35
 | 
    10 local DEVIAN_FRAME = 'DevianConsole'
 | 
| 
Nenue@66
 | 
    11 local insert, tonumber, pairs, concat = tinsert, tonumber, pairs, table.concat
 | 
| 
Nenue@66
 | 
    12 local L = D.L
 | 
| 
Nenue@66
 | 
    13 local print = D.print
 | 
| 
Nenue@66
 | 
    14 
 | 
| 
Nenue@66
 | 
    15 
 | 
| 
Nenue@66
 | 
    16 
 | 
| 
Nenue@66
 | 
    17 
 | 
| 
Nenue@66
 | 
    18 local Console_OnMovementChanged = function(self, event)
 | 
| 
Nenue@66
 | 
    19   local db = D.db
 | 
| 
Nenue@66
 | 
    20   if self.enabled then
 | 
| 
Nenue@66
 | 
    21     if event == 'PLAYER_STARTED_MOVING' then
 | 
| 
Nenue@66
 | 
    22       self.moveFade:Stop()
 | 
| 
Nenue@66
 | 
    23       local F1 = self.moveFade.alphaOut
 | 
| 
Nenue@66
 | 
    24       F1:SetFromAlpha(db.movement_fade_from)
 | 
| 
Nenue@66
 | 
    25       F1:SetToAlpha(db.movement_fade_to)
 | 
| 
Nenue@66
 | 
    26       F1:SetDuration(db.movement_fade_time)
 | 
| 
Nenue@66
 | 
    27       self.moveFade:Play()
 | 
| 
Nenue@66
 | 
    28       self:EnableMouse(false)
 | 
| 
Nenue@66
 | 
    29     else
 | 
| 
Nenue@66
 | 
    30       self.moveFade:Stop()
 | 
| 
Nenue@66
 | 
    31       local F1 = self.moveFade.alphaOut
 | 
| 
Nenue@66
 | 
    32       F1:SetToAlpha(db.movement_fade_from)
 | 
| 
Nenue@66
 | 
    33       F1:SetFromAlpha(db.movement_fade_to)
 | 
| 
Nenue@66
 | 
    34       F1:SetDuration(db.movement_fade_time)
 | 
| 
Nenue@66
 | 
    35       self.moveFade:Play()
 | 
| 
Nenue@66
 | 
    36       self:EnableMouse(true)
 | 
| 
Nenue@66
 | 
    37     end
 | 
| 
Nenue@66
 | 
    38   end
 | 
| 
Nenue@66
 | 
    39 end
 | 
| 
Nenue@66
 | 
    40 
 | 
| 
Nenue@35
 | 
    41 
 | 
| 
Nenue@35
 | 
    42 
 | 
| 
Nenue@35
 | 
    43 local function Console_MinMax(self)
 | 
| 
Nenue@35
 | 
    44   if self.minimized then
 | 
| 
Nenue@35
 | 
    45     self:Maximize()
 | 
| 
Nenue@35
 | 
    46   else
 | 
| 
Nenue@35
 | 
    47     self:Minimize()
 | 
| 
Nenue@35
 | 
    48   end
 | 
| 
Nenue@35
 | 
    49 end
 | 
| 
Nenue@35
 | 
    50 
 | 
| 
Nenue@35
 | 
    51 local function Console_Minimize(self)
 | 
| 
Nenue@35
 | 
    52   self:SetHeight(20)
 | 
| 
Nenue@35
 | 
    53   self:SetMaxResize(GetScreenWidth(),20)
 | 
| 
Nenue@35
 | 
    54   self.minimized = true
 | 
| 
Nenue@35
 | 
    55   self.out:Hide()
 | 
| 
Nenue@35
 | 
    56   self:Save()
 | 
| 
Nenue@35
 | 
    57 end
 | 
| 
Nenue@35
 | 
    58 
 | 
| 
Nenue@35
 | 
    59 local function Console_Maximize(self)
 | 
| 
Nenue@35
 | 
    60   local db = D.channels[self.index]
 | 
| 
Nenue@35
 | 
    61   self:SetHeight(db.height)
 | 
| 
Nenue@35
 | 
    62   self:SetMaxResize(GetScreenWidth(),GetScreenHeight())
 | 
| 
Nenue@35
 | 
    63   self.minimized = nil
 | 
| 
Nenue@35
 | 
    64   self.out:Show()
 | 
| 
Nenue@35
 | 
    65   self:Save()
 | 
| 
Nenue@35
 | 
    66 end
 | 
| 
Nenue@35
 | 
    67 
 | 
| 
Nenue@35
 | 
    68 
 | 
| 
Nenue@35
 | 
    69 local function Console_Save(self)
 | 
| 
Nenue@70
 | 
    70   local db = D.currentProfile.channels[self.index]
 | 
| 
Nenue@35
 | 
    71     db.x = self:GetLeft()
 | 
| 
Nenue@35
 | 
    72     db.y = (self:GetTop() - GetScreenHeight())
 | 
| 
Nenue@35
 | 
    73     db.width = self:GetWidth()
 | 
| 
Nenue@35
 | 
    74 
 | 
| 
Nenue@35
 | 
    75   if not self.minimized then
 | 
| 
Nenue@55
 | 
    76     db.height = self:GetHeight()
 | 
| 
Nenue@35
 | 
    77     self:SetHeight(db.height)
 | 
| 
Nenue@35
 | 
    78   end
 | 
| 
Nenue@35
 | 
    79 
 | 
| 
Nenue@35
 | 
    80   db.dockedTo = self.dockedTo
 | 
| 
Nenue@35
 | 
    81   db.docked = self.docked
 | 
| 
Nenue@35
 | 
    82 
 | 
| 
Nenue@70
 | 
    83   db.minimized = self.minimized
 | 
| 
Nenue@70
 | 
    84   db.enabled = self.enabled
 | 
| 
Nenue@70
 | 
    85   db.active = self.active
 | 
| 
Nenue@35
 | 
    86   self:SetPoint('TOPLEFT', UIParent, 'TOPLEFT', db.x, db.y)
 | 
| 
Nenue@35
 | 
    87   self:SetWidth(db.width)
 | 
| 
Nenue@35
 | 
    88 end
 | 
| 
Nenue@35
 | 
    89 
 | 
| 
Nenue@35
 | 
    90 --- Brings the console to the front.
 | 
| 
Nenue@35
 | 
    91 -- Frame method used to bring a console frame to the front of the display stack.
 | 
| 
Nenue@35
 | 
    92 local function Console_ToFront(c)
 | 
| 
Nenue@35
 | 
    93   local db = D.db
 | 
| 
Nenue@68
 | 
    94   local profile = D.currentProfile
 | 
| 
Nenue@35
 | 
    95   c:Raise()
 | 
| 
Nenue@35
 | 
    96   c:SetAlpha(db.frontalpha)
 | 
| 
Nenue@83
 | 
    97   c.out.backdrop:SetColorTexture(unpack(db.frontdrop))
 | 
| 
Nenue@35
 | 
    98   c.out.backdrop:SetGradientAlpha(unpack(db.frontgrad))
 | 
| 
Nenue@35
 | 
    99   c.out.backdrop:SetBlendMode(db.frontblend)
 | 
| 
Nenue@45
 | 
   100   c.dropmenu.icon:SetVertexColor(unpack(db.frontheader))
 | 
| 
Nenue@45
 | 
   101   c.title:SetTextColor(unpack(db.frontborder))
 | 
| 
Nenue@60
 | 
   102 
 | 
| 
Nenue@62
 | 
   103   --oldprint('changing current toplevel from', db.current_channel, 'to', c.index)
 | 
| 
Nenue@68
 | 
   104   profile.current_channel = c.index
 | 
| 
Nenue@35
 | 
   105 
 | 
| 
Nenue@62
 | 
   106   --oldprint('toplevel is now', db.current_channel)
 | 
| 
Nenue@60
 | 
   107   c:Save()
 | 
| 
Nenue@60
 | 
   108 
 | 
| 
Nenue@60
 | 
   109 
 | 
| 
Nenue@50
 | 
   110   -- update dock buttons
 | 
| 
Nenue@93
 | 
   111   local beacon = c.dockButton
 | 
| 
Nenue@50
 | 
   112   beacon.selected = true
 | 
| 
Nenue@58
 | 
   113   beacon.newMessage = nil
 | 
| 
Nenue@93
 | 
   114   beacon:Update()
 | 
| 
Nenue@50
 | 
   115 
 | 
| 
Nenue@35
 | 
   116   for _, part in pairs(c.border) do
 | 
| 
Nenue@83
 | 
   117     part:SetColorTexture(unpack(db.frontborder))
 | 
| 
Nenue@35
 | 
   118   end
 | 
| 
Nenue@35
 | 
   119 
 | 
| 
Nenue@35
 | 
   120   for id, bc in pairs(D.console) do
 | 
| 
Nenue@35
 | 
   121     if id ~= c.index then
 | 
| 
Nenue@35
 | 
   122       bc:SetAlpha(db.backalpha)
 | 
| 
Nenue@83
 | 
   123       bc.out.backdrop:SetColorTexture(unpack(db.backdrop))
 | 
| 
Nenue@35
 | 
   124       bc.out.backdrop:SetGradientAlpha(unpack(db.backgrad))
 | 
| 
Nenue@35
 | 
   125       bc.out.backdrop:SetBlendMode(db.backblend)
 | 
| 
Nenue@45
 | 
   126       bc.dropmenu.icon:SetVertexColor(unpack(db.backheader))
 | 
| 
Nenue@36
 | 
   127       bc.title:SetTextColor(unpack(db.backborder))
 | 
| 
Nenue@35
 | 
   128 
 | 
| 
Nenue@93
 | 
   129       local beacon = D.dock.usedButtons[bc.index]
 | 
| 
Nenue@58
 | 
   130       beacon.raised = nil
 | 
| 
Nenue@58
 | 
   131       beacon.showName = nil
 | 
| 
Nenue@50
 | 
   132       beacon.selected = nil
 | 
| 
Nenue@93
 | 
   133       beacon:Update()
 | 
| 
Nenue@50
 | 
   134 
 | 
| 
Nenue@35
 | 
   135       for _, part in pairs(bc.border) do
 | 
| 
Nenue@83
 | 
   136         part:SetColorTexture(unpack(db.backborder))
 | 
| 
Nenue@35
 | 
   137       end
 | 
| 
Nenue@35
 | 
   138     end
 | 
| 
Nenue@35
 | 
   139   end
 | 
| 
Nenue@35
 | 
   140 end
 | 
| 
Nenue@35
 | 
   141 
 | 
| 
Nenue@35
 | 
   142 local function Console_MouseDown(self, button, up)
 | 
| 
Nenue@35
 | 
   143   if button == 'LeftButton' then
 | 
| 
Nenue@35
 | 
   144     if up then
 | 
| 
Nenue@35
 | 
   145       self:StopMovingOrSizing()
 | 
| 
Nenue@35
 | 
   146       self:ToFront()
 | 
| 
Nenue@35
 | 
   147       self:Save()
 | 
| 
Nenue@35
 | 
   148     elseif self.out.grip:IsMouseOver() then
 | 
| 
Nenue@35
 | 
   149       self:StartSizing()
 | 
| 
Nenue@35
 | 
   150     else
 | 
| 
Nenue@35
 | 
   151       self:StartMoving()
 | 
| 
Nenue@35
 | 
   152     end
 | 
| 
Nenue@35
 | 
   153   else
 | 
| 
Nenue@35
 | 
   154     if up then
 | 
| 
Nenue@35
 | 
   155       self:MinMax()
 | 
| 
Nenue@35
 | 
   156     end
 | 
| 
Nenue@35
 | 
   157   end
 | 
| 
Nenue@35
 | 
   158 end
 | 
| 
Nenue@35
 | 
   159 local function Console_MouseUp(self, button)
 | 
| 
Nenue@35
 | 
   160   return Console_MouseDown(self, button, true)
 | 
| 
Nenue@35
 | 
   161 end
 | 
| 
Nenue@35
 | 
   162 
 | 
| 
Nenue@35
 | 
   163 
 | 
| 
Nenue@35
 | 
   164 --- Constructs the frame object for a console channel
 | 
| 
Nenue@35
 | 
   165 -- Initializes the console channel at a specified index.
 | 
| 
Nenue@35
 | 
   166 -- Configuration data can be overridden by passing a desired settings table.
 | 
| 
Nenue@35
 | 
   167 -- @param i Numeric index of the channel as it manifests in db.channels
 | 
| 
Nenue@35
 | 
   168 -- @param vars Optional settings table to be used.
 | 
| 
Nenue@35
 | 
   169 local function CreateConsole(i, vars)
 | 
| 
Nenue@35
 | 
   170   local db = D.db
 | 
| 
Nenue@35
 | 
   171   if tonumber(i) == nil or math.floor(i) ~= i then
 | 
| 
Nenue@35
 | 
   172     error('Non-integer index value.')
 | 
| 
Nenue@35
 | 
   173   end
 | 
| 
Nenue@35
 | 
   174   if not vars then
 | 
| 
Nenue@35
 | 
   175     vars = D.channels[i] and D.channels[i] or D.channels[db.primary_channel]
 | 
| 
Nenue@35
 | 
   176   end
 | 
| 
Nenue@35
 | 
   177   local f
 | 
| 
Nenue@70
 | 
   178   f = CreateFrame('Frame', 'DevianChannelFrame' .. i, UIParent, DEVIAN_FRAME)
 | 
| 
Nenue@47
 | 
   179 
 | 
| 
Nenue@35
 | 
   180   --@debug@
 | 
| 
Nenue@35
 | 
   181   --print(f:GetName())
 | 
| 
Nenue@35
 | 
   182 
 | 
| 
Nenue@35
 | 
   183   --print('create(2)')
 | 
| 
Nenue@35
 | 
   184   for k,v in pairs(vars) do
 | 
| 
Nenue@35
 | 
   185     f[k] = v
 | 
| 
Nenue@35
 | 
   186     --@debug@
 | 
| 
Nenue@36
 | 
   187     --print(' f['..type(k)..' '..tostring(k)..'] = '..type(v)..' '..tostring(v))
 | 
| 
Nenue@35
 | 
   188   end
 | 
| 
Nenue@35
 | 
   189 
 | 
| 
Nenue@35
 | 
   190   f:SetPoint('TOPLEFT', UIParent, 'TOPLEFT', vars.x, vars.y)
 | 
| 
Nenue@35
 | 
   191   f:SetSize(vars.width, vars.height)
 | 
| 
Nenue@35
 | 
   192   f:Lower()
 | 
| 
Nenue@35
 | 
   193   f.out:SetFont(db.font, db.fontsize, db.fontoutline)
 | 
| 
Nenue@35
 | 
   194   if (db.current_channel == i) then
 | 
| 
Nenue@83
 | 
   195     f.out.backdrop:SetColorTexture(unpack(db.frontdrop))
 | 
| 
Nenue@36
 | 
   196     f.dropmenu.icon:SetVertexColor(unpack(db.headerfontcolor))
 | 
| 
Nenue@36
 | 
   197     f.title:SetTextColor(unpack(db.headerfontcolor))
 | 
| 
Nenue@45
 | 
   198     f.header:SetAlpha(db.headeralpha)
 | 
| 
Nenue@35
 | 
   199   else
 | 
| 
Nenue@83
 | 
   200     f.out.backdrop:SetColorTexture(unpack(db.backdrop))
 | 
| 
Nenue@35
 | 
   201   end
 | 
| 
Nenue@35
 | 
   202 
 | 
| 
Nenue@35
 | 
   203   f.Save = Console_Save
 | 
| 
Nenue@35
 | 
   204   f.Minimize = Console_Minimize
 | 
| 
Nenue@35
 | 
   205   f.Maximize = Console_Maximize
 | 
| 
Nenue@35
 | 
   206   f.MinMax = Console_MinMax
 | 
| 
Nenue@35
 | 
   207   f.ToFront = Console_ToFront
 | 
| 
Nenue@35
 | 
   208   f.Toggle = D.Console_Toggle
 | 
| 
Nenue@35
 | 
   209   f:SetScript('OnMouseDown', Console_MouseDown)
 | 
| 
Nenue@35
 | 
   210   f:SetScript('OnMouseUp', Console_MouseUp)
 | 
| 
Nenue@66
 | 
   211   f.profileID = db.current_profile
 | 
| 
Nenue@35
 | 
   212 
 | 
| 
Nenue@36
 | 
   213 
 | 
| 
Nenue@36
 | 
   214   UIDropDownMenu_Initialize(f.menuFrame, function()
 | 
| 
Nenue@36
 | 
   215     local info = { {
 | 
| 
Nenue@36
 | 
   216         text= "Close",
 | 
| 
Nenue@36
 | 
   217         value = "OptClose",
 | 
| 
Nenue@36
 | 
   218         func = function ()
 | 
| 
Nenue@36
 | 
   219           f.enabled = nil
 | 
| 
Nenue@36
 | 
   220           f:Hide()
 | 
| 
Nenue@36
 | 
   221           f:Save()
 | 
| 
Nenue@38
 | 
   222         end },--[[
 | 
| 
Nenue@36
 | 
   223       {
 | 
| 
Nenue@36
 | 
   224         text = "Dock",
 | 
| 
Nenue@36
 | 
   225         value = "OptDock",
 | 
| 
Nenue@38
 | 
   226         func = function() print('Dvn', 'docking shenanary') end }]]
 | 
| 
Nenue@36
 | 
   227     }
 | 
| 
Nenue@36
 | 
   228     for _, v in ipairs(info) do
 | 
| 
Nenue@36
 | 
   229       UIDropDownMenu_AddButton(v)
 | 
| 
Nenue@36
 | 
   230     end
 | 
| 
Nenue@36
 | 
   231   end, 'MENU')
 | 
| 
Nenue@36
 | 
   232 
 | 
| 
Nenue@66
 | 
   233   if db.movement_fade then
 | 
| 
Nenue@66
 | 
   234     f:RegisterEvent('PLAYER_STARTED_MOVING')
 | 
| 
Nenue@66
 | 
   235     f:RegisterEvent('PLAYER_STOPPED_MOVING')
 | 
| 
Nenue@66
 | 
   236     f:SetScript('OnEvent', Console_OnMovementChanged)
 | 
| 
Nenue@66
 | 
   237   end
 | 
| 
Nenue@66
 | 
   238 
 | 
| 
Nenue@93
 | 
   239   f.dockButton = D:GetDockButton(f)
 | 
| 
Nenue@93
 | 
   240 
 | 
| 
Nenue@47
 | 
   241 
 | 
| 
Nenue@35
 | 
   242   if vars.minimized then
 | 
| 
Nenue@35
 | 
   243     f:Minimize()
 | 
| 
Nenue@35
 | 
   244   else
 | 
| 
Nenue@35
 | 
   245     f:Maximize()
 | 
| 
Nenue@35
 | 
   246   end
 | 
| 
Nenue@68
 | 
   247   if db.enabled then
 | 
| 
Nenue@68
 | 
   248     f.enabled = true
 | 
| 
Nenue@35
 | 
   249     f:Show()
 | 
| 
Nenue@35
 | 
   250   end
 | 
| 
Nenue@35
 | 
   251 
 | 
| 
Nenue@35
 | 
   252   return f
 | 
| 
Nenue@35
 | 
   253 end
 | 
| 
Nenue@35
 | 
   254 
 | 
| 
Nenue@35
 | 
   255 
 | 
| 
Nenue@35
 | 
   256 --- Updates console information and returns the handle of the channel object that was worked on.
 | 
| 
Nenue@35
 | 
   257 -- When key is nil or not a valid handle, a new channel is created using whatever signature can be found in cinfo.
 | 
| 
Nenue@35
 | 
   258 -- The signature can be passed as a string, or as a table entry under the key 'signature'
 | 
| 
Nenue@35
 | 
   259 -- If the signature of a new channel is also a tag, the channel will be added to that tag
 | 
| 
Nenue@35
 | 
   260 -- @param cinfo string signature of a new channel, or a table of config variables to be imposed on the channel
 | 
| 
Nenue@35
 | 
   261 -- @param key string signature or index number of channel to operate on
 | 
| 
Nenue@35
 | 
   262 -- @usage channel = D:SetChannel('new', nil) -- creates a new channel
 | 
| 
Nenue@35
 | 
   263 -- @usage channel = D:SetChannel({x = 200, y = 100}, 4) -- updates channel #4
 | 
| 
Nenue@35
 | 
   264 function D:SetChannel(cinfo, key)
 | 
| 
Nenue@66
 | 
   265   local profile = D.currentProfile
 | 
| 
Nenue@35
 | 
   266   local t_info = {}
 | 
| 
Nenue@35
 | 
   267   local channel, isNew, id, sig, t_id
 | 
| 
Nenue@36
 | 
   268   --@debug@
 | 
| 
Nenue@68
 | 
   269   --print('setchan(0) cinfo, key', cinfo, key)--@end-debug@
 | 
| 
Nenue@35
 | 
   270   -- obtain source data
 | 
| 
Nenue@66
 | 
   271   if tonumber(key) ~= nil and  D.channels[key] then
 | 
| 
Nenue@35
 | 
   272     id = tonumber(key)
 | 
| 
Nenue@35
 | 
   273   elseif D.sigID[tostring(key)] then
 | 
| 
Nenue@35
 | 
   274     id = D.sigID[tostring(key)]
 | 
| 
Nenue@35
 | 
   275   else
 | 
| 
Nenue@66
 | 
   276     id = profile.default_channel
 | 
| 
Nenue@35
 | 
   277     isNew = true
 | 
| 
Nenue@35
 | 
   278   end
 | 
| 
Nenue@66
 | 
   279   local dbvars = D.channels[id]
 | 
| 
Nenue@35
 | 
   280   t_id = id           -- overridden later if new
 | 
| 
Nenue@35
 | 
   281   t_info.index = t_id --
 | 
| 
Nenue@35
 | 
   282   --@debug@
 | 
| 
Nenue@68
 | 
   283   --print('setchan(1) cinfo, key, id=', cinfo, key, id)--@end-debug@
 | 
| 
Nenue@35
 | 
   284 
 | 
| 
Nenue@35
 | 
   285 
 | 
| 
Nenue@35
 | 
   286   -- obtain config info
 | 
| 
Nenue@35
 | 
   287   if type(cinfo) == 'string' then
 | 
| 
Nenue@35
 | 
   288     sig = cinfo
 | 
| 
Nenue@35
 | 
   289     cinfo = {signature = sig}
 | 
| 
Nenue@35
 | 
   290   elseif type(cinfo) ~= 'table' then -- stop here if a table wans't passed
 | 
| 
Nenue@66
 | 
   291     error('Expecting table of string as arg1')
 | 
| 
Nenue@35
 | 
   292   elseif cinfo.signature then -- new sig
 | 
| 
Nenue@66
 | 
   293     sig = cinfo.signature
 | 
| 
Nenue@35
 | 
   294   elseif isNew then -- new channel sig
 | 
| 
Nenue@66
 | 
   295     sig = 'Ch'
 | 
| 
Nenue@35
 | 
   296   else -- old sig
 | 
| 
Nenue@66
 | 
   297     sig = D.channels[id].signature
 | 
| 
Nenue@35
 | 
   298   end
 | 
| 
Nenue@35
 | 
   299   t_info.signature = sig
 | 
| 
Nenue@35
 | 
   300   --@debug@
 | 
| 
Nenue@68
 | 
   301   --print('setchan(2) sig,id,isNew=', sig, id, isNew)--@end-debug@
 | 
| 
Nenue@35
 | 
   302 
 | 
| 
Nenue@35
 | 
   303   for k,v in pairs(cinfo) do -- allow all cinfo to pass
 | 
| 
Nenue@35
 | 
   304   t_info[k] = v
 | 
| 
Nenue@35
 | 
   305   end
 | 
| 
Nenue@35
 | 
   306 
 | 
| 
Nenue@35
 | 
   307   local blocked = {          -- ignore these vars:
 | 
| 
Nenue@35
 | 
   308     ['docked'] = true,       -- table
 | 
| 
Nenue@35
 | 
   309     ['dockedTo'] = true,     -- table-related
 | 
| 
Nenue@35
 | 
   310     ['signature'] = true}    -- already determined
 | 
| 
Nenue@35
 | 
   311   for k,v in pairs(dbvars) do
 | 
| 
Nenue@35
 | 
   312     if not t_info[k] and not blocked[k] then -- already set or blocked?
 | 
| 
Nenue@70
 | 
   313     --print('assign', k, '=', v)
 | 
| 
Nenue@35
 | 
   314     t_info[k] = v
 | 
| 
Nenue@35
 | 
   315     end
 | 
| 
Nenue@35
 | 
   316   end
 | 
| 
Nenue@35
 | 
   317   -- new channel overrides
 | 
| 
Nenue@35
 | 
   318   if isNew then
 | 
| 
Nenue@72
 | 
   319     if D.sigID[sig] then -- find a non-clashing signature
 | 
| 
Nenue@35
 | 
   320     local result, i = sig, 1
 | 
| 
Nenue@35
 | 
   321     while D.sigID[result] do
 | 
| 
Nenue@35
 | 
   322       result = sig .. i
 | 
| 
Nenue@35
 | 
   323       i = i + 1
 | 
| 
Nenue@35
 | 
   324     end
 | 
| 
Nenue@35
 | 
   325     t_info.signature = result
 | 
| 
Nenue@35
 | 
   326     end
 | 
| 
Nenue@36
 | 
   327     t_id = self.max_channel + 1
 | 
| 
Nenue@35
 | 
   328     t_info.index = t_id
 | 
| 
Nenue@72
 | 
   329 
 | 
| 
Nenue@72
 | 
   330     self.max_channel = t_id
 | 
| 
Nenue@35
 | 
   331     --@debug@
 | 
| 
Nenue@68
 | 
   332     --print('setchan(3a) t_id, isNew, sig, t_info.signature=', t_id, isNew, sig, t_info.signature)--@end-debug@
 | 
| 
Nenue@35
 | 
   333   else
 | 
| 
Nenue@35
 | 
   334     --@debug@
 | 
| 
Nenue@68
 | 
   335     --print('setchan(3b) t_id, isNew, sig, t_info.signature=', t_id, isNew, sig, t_info.signature)--@end-debug@
 | 
| 
Nenue@35
 | 
   336   end
 | 
| 
Nenue@35
 | 
   337 
 | 
| 
Nenue@35
 | 
   338   local channel
 | 
| 
Nenue@35
 | 
   339   if not self.console[t_id] then -- create a frame
 | 
| 
Nenue@66
 | 
   340     if isNew then -- position the channel frame
 | 
| 
Nenue@66
 | 
   341       profile.max_channel = t_id
 | 
| 
Nenue@66
 | 
   342       t_info.x = t_info.x + 20
 | 
| 
Nenue@66
 | 
   343       t_info.y = t_info.y - 20
 | 
| 
Nenue@66
 | 
   344       profile.channels[t_id] = t_info
 | 
| 
Nenue@66
 | 
   345       --@debug@
 | 
| 
Nenue@68
 | 
   346       --print('setchan(4a)', 't_id, x, y=', t_id, t_info.x, t_info.y)--@end-debug@
 | 
| 
Nenue@66
 | 
   347     end
 | 
| 
Nenue@66
 | 
   348     channel = CreateConsole(t_id, t_info)
 | 
| 
Nenue@66
 | 
   349     self.console[t_id] = channel
 | 
| 
Nenue@66
 | 
   350     self.sig[t_info.signature] = channel
 | 
| 
Nenue@66
 | 
   351     self.sigID[t_info.signature] = t_id
 | 
| 
Nenue@66
 | 
   352     self.IDsig[t_id] = t_info.signature
 | 
| 
Nenue@35
 | 
   353   end
 | 
| 
Nenue@35
 | 
   354   channel = self.console[t_id]
 | 
| 
Nenue@35
 | 
   355   if channel.minimized then
 | 
| 
Nenue@35
 | 
   356     channel:Minimize()
 | 
| 
Nenue@35
 | 
   357   else
 | 
| 
Nenue@35
 | 
   358     channel:Maximize()
 | 
| 
Nenue@35
 | 
   359   end
 | 
| 
Nenue@35
 | 
   360 
 | 
| 
Nenue@55
 | 
   361   if channel.enabled then -- hide or show last since Min/Max mess with visibility
 | 
| 
Nenue@70
 | 
   362     --print('setchan(5a) enable')
 | 
| 
Nenue@55
 | 
   363     channel:Show()
 | 
| 
Nenue@60
 | 
   364     --channel:ToFront()
 | 
| 
Nenue@35
 | 
   365   else
 | 
| 
Nenue@68
 | 
   366     --print('setchan(5a) disable')
 | 
| 
Nenue@35
 | 
   367     channel:Hide()
 | 
| 
Nenue@35
 | 
   368   end
 | 
| 
Nenue@35
 | 
   369   --@debug@
 | 
| 
Nenue@68
 | 
   370   --print('setchan(end); c:IsVisible(), c.enabled, db.enabled=', channel:IsVisible(), channel.enabled, profile.enabled)--@end-debug@
 | 
| 
Nenue@35
 | 
   371   return channel
 | 
| 
Nenue@66
 | 
   372 end
 | 
| 
Nenue@66
 | 
   373 
 | 
| 
Nenue@66
 | 
   374 --- Console frame toggler
 | 
| 
Nenue@66
 | 
   375 -- @paramsig [...]
 | 
| 
Nenue@66
 | 
   376 -- @param ... one or more space-seperated channel keys
 | 
| 
Nenue@87
 | 
   377 function D:Console_Toggle(cmd, force)
 | 
| 
Nenue@87
 | 
   378 
 | 
| 
Nenue@87
 | 
   379 
 | 
| 
Nenue@88
 | 
   380   local search = {}
 | 
| 
Nenue@87
 | 
   381   if cmd then
 | 
| 
Nenue@87
 | 
   382     cmd = tostring(cmd)
 | 
| 
Nenue@87
 | 
   383     local i, j = 0, 0
 | 
| 
Nenue@87
 | 
   384     repeat
 | 
| 
Nenue@87
 | 
   385       i, j = cmd:find("%S+", j+1)
 | 
| 
Nenue@87
 | 
   386       if i and j then
 | 
| 
Nenue@87
 | 
   387         local key = cmd:sub(i, j)
 | 
| 
Nenue@87
 | 
   388         if self.sig[key] then
 | 
| 
Nenue@87
 | 
   389           --print(key, self.sigID[key])
 | 
| 
Nenue@87
 | 
   390           insert(search, self.sigID[key])
 | 
| 
Nenue@87
 | 
   391         elseif self.console[tonumber(key)] then
 | 
| 
Nenue@87
 | 
   392           --print(key, tonumber(key))
 | 
| 
Nenue@87
 | 
   393           insert(search, tonumber(key))
 | 
| 
Nenue@87
 | 
   394         end
 | 
| 
Nenue@87
 | 
   395       end
 | 
| 
Nenue@87
 | 
   396     until not(i or j)
 | 
| 
Nenue@87
 | 
   397   end
 | 
| 
Nenue@87
 | 
   398 
 | 
| 
Nenue@66
 | 
   399   local profile = D.currentProfile
 | 
| 
Nenue@66
 | 
   400   local setAll
 | 
| 
Nenue@70
 | 
   401 
 | 
| 
Nenue@70
 | 
   402   -- if nothing was found, then do an all toggle
 | 
| 
Nenue@66
 | 
   403   if #search < 1 then
 | 
| 
Nenue@70
 | 
   404     search = self.sigID -- using this since it lists frame ID's
 | 
| 
Nenue@66
 | 
   405     setAll = true
 | 
| 
Nenue@66
 | 
   406   end
 | 
| 
Nenue@70
 | 
   407 
 | 
| 
Nenue@70
 | 
   408   -- sort global enable state
 | 
| 
Nenue@66
 | 
   409   if setAll then
 | 
| 
Nenue@66
 | 
   410     --oldprint('setall', setAll)
 | 
| 
Nenue@66
 | 
   411     profile.enabled = (not profile.enabled) and true or nil
 | 
| 
Nenue@66
 | 
   412     if force == 0 then
 | 
| 
Nenue@66
 | 
   413       profile.enabled = nil
 | 
| 
Nenue@66
 | 
   414     end
 | 
| 
Nenue@66
 | 
   415   end
 | 
| 
Nenue@66
 | 
   416 
 | 
| 
Nenue@70
 | 
   417   -- sort local enable states: if global enable, apply that change to channel
 | 
| 
Nenue@70
 | 
   418   -- else, channel enable takes precedence
 | 
| 
Nenue@66
 | 
   419   for i, id in pairs(search) do
 | 
| 
Nenue@66
 | 
   420     local c = self.console[id]
 | 
| 
Nenue@66
 | 
   421     if setAll then
 | 
| 
Nenue@70
 | 
   422       c.enabled = profile.enabled
 | 
| 
Nenue@66
 | 
   423     else
 | 
| 
Nenue@66
 | 
   424       c.enabled = (not c.enabled) and true or nil
 | 
| 
Nenue@66
 | 
   425       if force == 0 then
 | 
| 
Nenue@66
 | 
   426         c.enabled = nil
 | 
| 
Nenue@66
 | 
   427       end
 | 
| 
Nenue@66
 | 
   428     end
 | 
| 
Nenue@66
 | 
   429 
 | 
| 
Nenue@70
 | 
   430     if c.enabled then
 | 
| 
Nenue@70
 | 
   431       profile.enabled = true
 | 
| 
Nenue@66
 | 
   432       c:Show()
 | 
| 
Nenue@70
 | 
   433     else
 | 
| 
Nenue@66
 | 
   434       c:Hide()
 | 
| 
Nenue@66
 | 
   435     end
 | 
| 
Nenue@66
 | 
   436     c:Save()
 | 
| 
Nenue@66
 | 
   437   end
 | 
| 
Nenue@66
 | 
   438 
 | 
| 
Nenue@66
 | 
   439   if setAll then
 | 
| 
Nenue@66
 | 
   440     if profile.enabled then
 | 
| 
Nenue@66
 | 
   441       self:Print('toggled all consoles ON')
 | 
| 
Nenue@66
 | 
   442       if D.console[profile.current_channel] then
 | 
| 
Nenue@66
 | 
   443         D.console[profile.current_channel]:ToFront()
 | 
| 
Nenue@66
 | 
   444       end
 | 
| 
Nenue@66
 | 
   445     else
 | 
| 
Nenue@66
 | 
   446       self:Print('toggled all consoles OFF')
 | 
| 
Nenue@66
 | 
   447     end
 | 
| 
Nenue@66
 | 
   448   else
 | 
| 
Nenue@66
 | 
   449     local result = {}
 | 
| 
Nenue@66
 | 
   450     for i, id in pairs(search) do
 | 
| 
Nenue@66
 | 
   451       result[i] = tostring(id) .. ' = ' .. (self.console[id].enabled and 'ON' or 'OFF')
 | 
| 
Nenue@66
 | 
   452     end
 | 
| 
Nenue@66
 | 
   453     self:Print('toggled: '..concat(result, ', '))
 | 
| 
Nenue@66
 | 
   454   end
 | 
| 
Nenue@66
 | 
   455 end
 |