Nenue@98: -- Mixin for console Nenue@98: local _, D = ... Nenue@98: DevianConsoleMixin = {} Nenue@98: Nenue@99: local print = function(...) print('Dvn', ...) end Nenue@99: function D.IterateChannels(callback, sender) Nenue@99: for index, channel in ipairs(D.console) do Nenue@99: if channel ~= sender then Nenue@99: callback(channel) Nenue@99: end Nenue@99: end Nenue@99: end Nenue@99: Nenue@98: function DevianConsoleMixin:OnLoad() Nenue@98: self:SetMaxResize(GetScreenWidth(), GetScreenHeight()) Nenue@98: self:SetMinResize(100, 24) Nenue@98: self:EnableMouse(true) Nenue@98: self:RegisterForDrag('LeftButton') Nenue@98: self:SetMovable(true) Nenue@98: self:SetResizable(true) Nenue@99: self:SetClampedToScreen(true) Nenue@98: self.out:SetFont("Interface\\Addons\\Devian\\font\\SourceCodePro-Regular.ttf", 13, 'NORMAL') Nenue@98: self.out:SetJustifyH('LEFT') Nenue@98: self.out:SetFading(false) Nenue@99: self.out:SetMaxLines(2048) Nenue@99: Nenue@99: self:RegisterEvent('PLAYER_STARTED_MOVING') Nenue@99: self:RegisterEvent('PLAYER_STOPPED_MOVING') Nenue@107: self:RegisterEvent('PLAYER_ENTERING_WORLD') Nenue@99: Nenue@99: UIDropDownMenu_Initialize(self.DropdownFrame, function() Nenue@99: local info = UIDropDownMenu_CreateInfo() Nenue@99: info.text = 'Pin' Nenue@99: info.func = function() self:Pin() end Nenue@100: info.isNotRadio = true Nenue@100: info.checked = (self.pinned) Nenue@99: UIDropDownMenu_AddButton(info) Nenue@100: Nenue@100: info.notCheckable = 1 Nenue@99: if self.minimized then Nenue@99: info.text = 'Maximize' Nenue@99: info.func = function() self:Maximize() end Nenue@99: else Nenue@99: info.text = 'Minimize' Nenue@99: info.func = function() self:Minimize() end Nenue@99: end Nenue@99: UIDropDownMenu_AddButton(info) Nenue@99: info.text = 'Close' Nenue@99: info.func = function() self:Toggle() end Nenue@99: UIDropDownMenu_AddButton(info) Nenue@99: Nenue@99: end, 'MENU') Nenue@99: self.DropdownButton:SetScript('OnClick', function(button) Nenue@99: ToggleDropDownMenu(1, nil, self.DropdownFrame, button, 0, 0) Nenue@99: end) Nenue@98: Nenue@98: self.width = self:GetWidth() Nenue@98: self.height = self:GetWidth() Nenue@100: self.isHover = false Nenue@98: end Nenue@98: Nenue@98: function DevianConsoleMixin:Setup(info) Nenue@98: for k,v in pairs(info) do Nenue@98: self[k] = v Nenue@98: --oldprint(k,v) Nenue@98: end Nenue@98: self.Dock = DevianDock:GetDockButton(self) Nenue@98: self:Update() Nenue@98: end Nenue@98: Nenue@99: local blockedType = {['table'] = true, ['function'] = true } Nenue@99: local blockedKey = {[0] = true } Nenue@99: Nenue@99: -- Synchronize vars Nenue@99: function DevianConsoleMixin:Finalize() Nenue@99: local id = self:GetID() Nenue@99: for k,v in pairs(D.channels[id]) do Nenue@99: if not self[k] then Nenue@99: D.channels[id][k] = nil Nenue@99: end Nenue@99: end Nenue@99: for k,v in pairs(self) do Nenue@99: if not (blockedType[type(v)] or blockedKey[k]) then Nenue@99: if D.channels[id][k] ~= v then Nenue@99: D.channels[id][k] = v Nenue@99: end Nenue@99: end Nenue@99: end Nenue@100: D.channels[id].isPressed = nil Nenue@100: D.channels[id].isHover = nil Nenue@99: end Nenue@99: Nenue@99: function DevianConsoleMixin:Pin(pinned) Nenue@99: self.pinned = pinned or (not self.pinned) Nenue@99: self:Update(true) Nenue@99: end Nenue@99: Nenue@99: function DevianConsoleMixin:Update(setFinal) Nenue@98: self:SetPoint('TOPLEFT', UIParent, 'TOPLEFT', self.x, self.y) Nenue@99: Nenue@99: if self.minimized then Nenue@99: self:SetHeight(20) Nenue@99: self:SetMaxResize(GetScreenWidth(),20) Nenue@99: self.GripBottom:Hide() Nenue@99: self.GripSide:Hide() Nenue@99: else Nenue@99: self:SetSize(self.width, self.height) Nenue@99: self.GripBottom:Show() Nenue@99: self.GripSide:Show() Nenue@99: end Nenue@99: Nenue@99: Nenue@98: -- oldprint(self:GetName(), self.x, self.y) Nenue@98: Nenue@100: local isFront = (D.currentProfile.current_channel == self.index) Nenue@98: local r,g,b,a = unpack(D.db.backborder) Nenue@98: if isFront then Nenue@98: r,g,b,a = unpack(D.db.frontborder) Nenue@98: self.backdrop:SetColorTexture(0,0,0,1) Nenue@100: elseif self.pinned then Nenue@100: self.backdrop:SetColorTexture(0,0,0,1) Nenue@100: r,g,b,a = unpack(D.db.backborder) Nenue@100: self.DropdownButton.Background:SetGradient('VERTICAL', .65,.35,.25, .15, .11, .05) Nenue@98: else Nenue@100: self.DropdownButton.Background:SetGradient('VERTICAL', .25,.35,.65, .05, .11, .15) Nenue@100: self.backdrop:SetColorTexture(0,0,0,1) Nenue@100: if self.raised then Nenue@100: self.raised = nil Nenue@100: self:Lower() Nenue@100: end Nenue@100: end Nenue@100: if self.isPressed then Nenue@100: r,g,b,a = 1,1,1,1 Nenue@100: elseif self.isHover then Nenue@108: r,g,b,a = 1,.5,0,1 Nenue@100: end Nenue@98: Nenue@100: Nenue@98: for name, region in pairs(self.border) do Nenue@98: region:SetColorTexture(r,g,b,a) Nenue@98: end Nenue@100: self.title:SetText(self.index..' '.. (self.signature or '?') .. (' '..self:GetFrameLevel())) Nenue@98: Nenue@98: --oldprint(self:GetID(), self.enabled, self.minimized, self.x, self.y) Nenue@98: self.isFront = isFront Nenue@98: self:SetShown(self.enabled) Nenue@99: self.backdrop:SetShown(self.enabled) Nenue@99: self.out:SetShown((not self.minimized)) Nenue@99: Nenue@99: Nenue@99: if setFinal then Nenue@99: self:Finalize() Nenue@99: end Nenue@99: Nenue@98: end Nenue@98: Nenue@98: Nenue@99: Nenue@98: function DevianConsoleMixin:OnShow() Nenue@98: self:Update() Nenue@98: end Nenue@98: Nenue@98: Nenue@98: Nenue@102: function DevianConsoleMixin:OnHide() Nenue@102: end Nenue@98: Nenue@98: function DevianConsoleMixin:OnMouseWheel(delta) Nenue@98: Nenue@98: local up = delta > 0 Nenue@98: if IsControlKeyDown() then Nenue@98: if up then self.out:ScrollToTop() Nenue@98: else self.out:ScrollToBottom() end Nenue@98: elseif IsShiftKeyDown() then Nenue@98: if up then self.out:PageUp() Nenue@98: else self.out:PageDown() end Nenue@98: else Nenue@98: if up then self.out:ScrollUp() Nenue@98: else self.out:ScrollDown() end Nenue@98: end Nenue@108: Nenue@108: Nenue@108: if self.out:AtBottom() then Nenue@108: Nenue@108: self.newMessage = nil Nenue@108: self.Dock:Update() Nenue@108: end Nenue@108: Nenue@98: end Nenue@98: function DevianConsoleMixin:MinMax(minimized) Nenue@98: minimized = minimized or self.minimized Nenue@98: if minimized then Nenue@98: self:Maximize() Nenue@98: else Nenue@98: self:Minimize() Nenue@98: end Nenue@98: end Nenue@98: Nenue@98: function DevianConsoleMixin:Minimize() Nenue@98: self.minimized = true Nenue@99: self:Update(true) Nenue@98: end Nenue@98: Nenue@98: function DevianConsoleMixin:Maximize() Nenue@99: self.minimized = nilnil Nenue@99: self:Update(true) Nenue@98: end Nenue@98: Nenue@99: function DevianConsoleMixin:OnMouseDown(button) Nenue@100: self.isPressed = true Nenue@100: self:Update() Nenue@99: end Nenue@99: Nenue@99: Nenue@98: function DevianConsoleMixin:OnMouseUp(button) Nenue@100: self.isPressed = nil Nenue@98: if button == 'LeftButton' then Nenue@100: --print('go to front') Nenue@98: self:ToFront() Nenue@98: else Nenue@98: self:MinMax() Nenue@98: end Nenue@98: end Nenue@98: Nenue@98: function DevianConsoleMixin:OnLeave() Nenue@100: self.isHover = nil Nenue@100: self:Update() Nenue@98: end Nenue@98: Nenue@98: function DevianConsoleMixin:OnEnter() Nenue@100: self.isHover = true Nenue@100: self:Update() Nenue@98: end Nenue@98: Nenue@98: function DevianConsoleMixin:OnDragStart() Nenue@99: self:ToFront() Nenue@99: self:StartMoving() Nenue@99: D.IterateChannels(function(frame) Nenue@99: frame.out:SetShown(false) Nenue@99: frame.backdrop:Hide() Nenue@99: end, self) Nenue@98: end Nenue@98: Nenue@98: function DevianConsoleMixin:OnDragStop() Nenue@99: Nenue@99: local channelEntry = D.channels[self:GetID()] Nenue@98: self.x = self:GetLeft() Nenue@98: self.y = self:GetTop() - GetScreenHeight() Nenue@99: if not self.minimized then Nenue@99: self.width = self:GetWidth() Nenue@99: self.height = self:GetHeight() Nenue@99: end Nenue@99: Nenue@99: --print(channelEntry.x, channelEntry.y, channelEntry.width, channelEntry.height) Nenue@98: self:StopMovingOrSizing() Nenue@99: self:SetClampRectInsets(0,0,0,0) Nenue@98: Nenue@99: self:Update(true) Nenue@99: Nenue@99: D.IterateChannels(function(frame) Nenue@100: frame:Update(true) Nenue@99: end, self) Nenue@98: end Nenue@98: Nenue@98: function DevianConsoleMixin:ToFront() Nenue@100: D.currentProfile.current_channel = self.index Nenue@100: Nenue@98: self:Raise() Nenue@98: for index, channel in ipairs(D.console) do Nenue@100: channel:Update(true) Nenue@98: end Nenue@98: end Nenue@98: Nenue@100: function DevianConsoleMixin:Toggle(value) Nenue@100: if value == nil then Nenue@100: value = (not self.enabled) Nenue@100: end Nenue@100: Nenue@100: self.enabled = value Nenue@100: D:Print('Console #'..self:GetID(), self.enabled and 'open' or 'closed') Nenue@100: Nenue@100: self:Update(true) Nenue@99: end Nenue@99: Nenue@102: Nenue@102: Nenue@99: function DevianConsoleMixin:OnEvent(event, arg) Nenue@100: --oldprint(event, arg) Nenue@99: local db = D.db Nenue@99: if self.enabled then Nenue@99: if event == 'PLAYER_STARTED_MOVING' then Nenue@100: local F1 = self.moveFade.alphaOut Nenue@102: self:SetAlpha(db.movement_fade_to) Nenue@100: self:EnableMouse(false) Nenue@100: elseif event == 'PLAYER_STOPPED_MOVING' then Nenue@102: self:SetAlpha(db.movement_fade_from) Nenue@99: self:EnableMouse(true) Nenue@99: end Nenue@99: end Nenue@99: end Nenue@99: Nenue@99: DevianConsoleSizeButtonMixin = {} Nenue@99: function DevianConsoleSizeButtonMixin:OnLoad() Nenue@99: self:RegisterForDrag('LeftButton') Nenue@99: end Nenue@99: function DevianConsoleSizeButtonMixin:OnDragStart() Nenue@99: local anchor = self:GetPoint(2) Nenue@99: local frame = self:GetParent() Nenue@99: if anchor == 'BOTTOMLEFT' then Nenue@99: frame:SetClampRectInsets(frame:GetLeft(), GetScreenWidth()- frame:GetRight(), GetScreenHeight() - frame:GetTop(), 0) Nenue@99: frame:SetMinResize(frame.width, 24) Nenue@99: frame:SetMaxResize(frame.width, GetScreenHeight()) Nenue@99: elseif anchor == 'BOTTOM' then Nenue@99: frame:SetClampRectInsets(frame:GetLeft(), 0, GetScreenHeight() - frame:GetTop(), GetScreenHeight() - frame:GetBottom()) Nenue@99: frame:SetMinResize(200, frame.height) Nenue@99: frame:SetMaxResize(GetScreenWidth(), frame.height) Nenue@99: end Nenue@99: frame:StartSizing() Nenue@99: end Nenue@100: Nenue@99: function DevianConsoleSizeButtonMixin:OnDragStop() Nenue@99: local frame = self:GetParent() Nenue@99: frame:OnDragStop() Nenue@99: end