Mercurial > wow > devian
diff UI.lua @ 35:3304455a3f45
code organizing; UI stuff is in the UI script, Devian prime just deals with config and print
corner menu elements placed and hooked, still needs follow-up code
author | Nenue |
---|---|
date | Sun, 27 Dec 2015 03:51:17 -0500 |
parents | |
children | bec37163b7fe |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/UI.lua Sun Dec 27 03:51:17 2015 -0500 @@ -0,0 +1,369 @@ +--- ${PACKAGE_NAME} +-- @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 = 'DevianDockFrame' +local MSG_NEED_DEV_MODE = 'Must be in development mode to use this function.' + + +local function Console_MinMax(self) + if self.minimized then + self:Maximize() + else + self:Minimize() + end +end + +local function Console_Minimize(self) + self:SetHeight(20) + self:SetMaxResize(GetScreenWidth(),20) + self.minimized = true + self.out:Hide() + self:Save() +end + +local function Console_Maximize(self) + local db = D.channels[self.index] + self:SetHeight(db.height) + self:SetMaxResize(GetScreenWidth(),GetScreenHeight()) + self.minimized = nil + self.out:Show() + self:Save() +end + + +local function Console_Save(self) + local db = D.channels[self.index] + if self.x then + db.x = self.x + else + db.x = self:GetLeft() + end + + if self.y then + db.y = self.y + else + db.y = (self:GetTop() - GetScreenHeight()) + end + + if self.width then + db.width = self.width + else + db.width = self:GetWidth() + end + + if not self.minimized then + if self.height then + db.height = self.height + else + db.height = self:GetHeight() + end + self:SetHeight(db.height) + end + + db.dockedTo = self.dockedTo + db.docked = self.docked + + 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 + +-- Console frame toggler +-- @paramsig [...] +-- @param ... one or more space-seperated channel keys +local function Console_Toggle(input) + local db = D.db + if db.workspace == 1 then + return D:Print(MSG_NEED_DEV_MODE) + end + local search = {} + local n = 0 + if D:GetArgs(input,1) then + repeat + key, n = D:GetArgs(input,1,n) + if D.sig[key] then + table.insert(search, D.sig[key]) + elseif D.console[key] then + table.insert(search, D.console[key]) + end + until n == 1e9 + else + search = D.console + end + + db.enabled = (not db.enabled) and true or nil + for i, c in ipairs(search) do + --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:Hide() + end + end + + if db.enabled then + D:Print('toggled on?') + else + D:Print('toggled off?') + end +end + +--- Brings the console to the front. +-- 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)) + c.out.backdrop:SetGradientAlpha(unpack(db.frontgrad)) + c.out.backdrop:SetBlendMode(db.frontblend) + db.current_channel = c.index + + 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)) + bc.out.backdrop:SetBlendMode(db.backblend) + + for _, part in pairs(bc.border) do + part:SetTexture(unpack(db.backborder)) + end + end + end +end + +local function Console_MouseDown(self, button, up) + if button == 'LeftButton' then + if up then + self:StopMovingOrSizing() + self:ToFront() + self.x = nil + self.y = nil + self.width = nil + self.height = nil + self:Save() + elseif self.out.grip:IsMouseOver() then + self:StartSizing() + else + self:StartMoving() + end + else + if up then + self:MinMax() + end + end +end +local function Console_MouseUp(self, button) + return Console_MouseDown(self, button, true) +end +print('load check') + + +--- Constructs the frame object for a console channel +-- Initializes the console channel at a specified index. +-- Configuration data can be overridden by passing a desired settings table. +-- @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) + local db = D.db + if tonumber(i) == nil or math.floor(i) ~= i then + error('Non-integer index value.') + end + if not vars then + vars = D.channels[i] and D.channels[i] or D.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()) + + --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 + + f:SetPoint('TOPLEFT', UIParent, 'TOPLEFT', vars.x, vars.y) + f:SetSize(vars.width, vars.height) + f:Lower() + f.out:SetFont(db.font, db.fontsize, db.fontoutline) + if (db.current_channel == i) then + f.out.backdrop:SetTexture(unpack(db.frontdrop)) + else + 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:SetScript('OnMouseDown', Console_MouseDown) + f:SetScript('OnMouseUp', Console_MouseUp) + + if vars.minimized then + f:Minimize() + else + f:Maximize() + end + if db.enabled and f.enabled then + f:Show() + end + + return f +end + + +--- 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 db = self.db + local t_info = {} + 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 + 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(2) sig,id,isNew=', sig, id, isNew)--@end-debug@ + + for k,v in pairs(cinfo) do -- allow all cinfo to pass + t_info[k] = v + end + + 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 + + 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 + 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(end); c:IsVisible(), c.enabled, db.enabled=', channel:IsVisible(), channel.enabled, db.enabled)--@end-debug@ + return channel +end \ No newline at end of file