You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

219 lines
7.1 KiB

--[[
BlockDialog.lua
@Author : DengSir (tdaddon@163.com)
@Link : https://dengsir.github.io
]]
local MAJOR, MINOR = 'BlockDialog', 2
local GUI = LibStub('tdGUI-1.0')
local BlockDialog, oldminor = GUI:NewClass(MAJOR, MINOR, 'Frame')
if not BlockDialog then return end
function BlockDialog:Constructor(parent)
self:Hide()
self:EnableMouse(true)
self:EnableMouseWheel(true)
self:SetScript('OnMouseWheel', nop)
self:SetScript('OnHide', self.OnHide)
self:SetScript('OnShow', self.Layout)
local Bg = self:CreateTexture(nil, 'BACKGROUND') do
Bg:SetAllPoints(true)
Bg:SetTexture([[Interface\FrameGeneral\UI-Background-Marble]])
end
local TLCorner = self:CreateTexture(nil, 'ARTWORK') do
TLCorner:SetSize(64, 64)
TLCorner:SetPoint('TOPLEFT', Bg, 'TOPLEFT')
TLCorner:SetTexture([[Interface\Common\bluemenu-main]])
TLCorner:SetTexCoord(0.00390625, 0.25390625, 0.00097656, 0.06347656)
end
local TRCorner = self:CreateTexture(nil, 'ARTWORK') do
TRCorner:SetSize(64, 64)
TRCorner:SetPoint('TOPRIGHT', Bg, 'TOPRIGHT')
TRCorner:SetTexture([[Interface\Common\bluemenu-main]])
TRCorner:SetTexCoord(0.51953125, 0.76953125, 0.00097656, 0.06347656)
end
local BRCorner = self:CreateTexture(nil, 'ARTWORK') do
BRCorner:SetSize(64, 64)
BRCorner:SetPoint('BOTTOMRIGHT', Bg, 'BOTTOMRIGHT')
BRCorner:SetTexture([[Interface\Common\bluemenu-main]])
BRCorner:SetTexCoord(0.00390625, 0.25390625, 0.06542969, 0.12792969)
end
local BLCorner = self:CreateTexture(nil, 'ARTWORK') do
BLCorner:SetSize(64, 64)
BLCorner:SetPoint('BOTTOMLEFT', Bg, 'BOTTOMLEFT')
BLCorner:SetTexture([[Interface\Common\bluemenu-main]])
BLCorner:SetTexCoord(0.26171875, 0.51171875, 0.00097656, 0.06347656)
end
local LLine = self:CreateTexture(nil, 'ARTWORK') do
LLine:SetWidth(43)
LLine:SetPoint('TOPLEFT', TLCorner, 'BOTTOMLEFT')
LLine:SetPoint('BOTTOMLEFT', BLCorner, 'TOPLEFT')
LLine:SetTexture([[Interface\Common\bluemenu-vert]])
LLine:SetTexCoord(0.06250000, 0.39843750, 0.00000000, 1.00000000)
end
local RLine = self:CreateTexture(nil, 'ARTWORK') do
RLine:SetWidth(43)
RLine:SetPoint('TOPRIGHT', TRCorner, 'BOTTOMRIGHT')
RLine:SetPoint('BOTTOMRIGHT', BRCorner, 'TOPRIGHT')
RLine:SetTexture([[Interface\Common\bluemenu-vert]])
RLine:SetTexCoord(0.41406250, 0.75000000, 0.00000000, 1.00000000)
end
local BLine = self:CreateTexture(nil, 'ARTWORK') do
BLine:SetHeight(43)
BLine:SetPoint('BOTTOMLEFT', BLCorner, 'BOTTOMRIGHT')
BLine:SetPoint('BOTTOMRIGHT', BRCorner, 'BOTTOMLEFT')
BLine:SetTexture([[Interface\Common\bluemenu-goldborder-horiz]])
BLine:SetTexCoord(0.00000000, 1.00000000, 0.35937500, 0.69531250)
end
local TLine = self:CreateTexture(nil, 'ARTWORK') do
TLine:SetHeight(43)
TLine:SetPoint('TOPLEFT', TLCorner, 'TOPRIGHT')
TLine:SetPoint('TOPRIGHT', TRCorner, 'TOPLEFT')
TLine:SetTexture([[Interface\Common\bluemenu-goldborder-horiz]])
TLine:SetTexCoord(0.00000000, 1.00000000, 0.00781250, 0.34375000)
end
local Text = self:CreateFontString(nil, 'OVERLAY', 'GameFontHighlight') do
Text:SetPoint('LEFT', 10, 0)
Text:SetPoint('RIGHT', -10, 0)
end
local AcceptButton = CreateFrame('Button', nil, self, 'UIPanelButtonTemplate') do
AcceptButton:SetSize(80, 22)
AcceptButton:SetScript('OnClick', function()
self:OnAcceptClick()
end)
end
local CancelButton = CreateFrame('Button', nil, self, 'UIPanelButtonTemplate') do
CancelButton:SetSize(80, 22)
CancelButton:SetScript('OnClick', function()
self:OnCancelClick()
end)
end
local EditBox = GUI:GetClass('EditBox'):New(self, true) do
EditBox:Hide()
EditBox:SetPoint('BOTTOMRIGHT', -10, 40)
EditBox:SetCallback('OnEditFocusLost', function()
self:OnEditFocusLost()
end)
end
self.Text = Text
self.AcceptButton = AcceptButton
self.CancelButton = CancelButton
self.EditBox = EditBox
end
function BlockDialog:Open(opts)
self.AcceptButton:SetText(opts.acceptText or ACCEPT)
self.CancelButton:SetText(opts.cancelText or CANCEL)
self.CancelButton:SetShown(not opts.cancelHidden)
self.Text:SetText(opts.text)
self.OnAccept = opts.OnAccept or nop
self.OnCancel = opts.OnCancel or nop
self.closeType = nil
self.ctx = opts.ctx
self.editFocusLost = nil
if opts.editBox then
self.EditBox:Show()
self.EditBox:SetText(opts.editText or '')
else
self.EditBox:Hide()
end
if opts.delay and opts.delay > 0 then
self.acceptText = opts.acceptText or ACCEPT
self.delay = math.ceil(opts.delay)
self.delayTimer = C_Timer.NewTicker(1, function() self:OnTimer() end, self.delay)
self:OnTimer()
else
if self.delayTimer then
self.delayTimer:Cancel()
end
self.delay = nil
self.acceptText = nil
self.delayTimer = nil
self.AcceptButton:Enable()
end
self:Show()
if opts.editBox then
if opts.editFocus then
self.EditBox:SetFocus()
end
if opts.editHighlightAll then
self.EditBox:HighlightText()
end
if opts.editFocusLost then
self.editFocusLost = opts.editFocusLost
end
end
end
function BlockDialog:Layout()
local acceptXOffset = self.CancelButton:IsShown() and -2 or 41
if self.EditBox:IsShown() then
self.EditBox:SetPoint('TOPLEFT', 10, - self.Text:GetHeight() - 40)
self.AcceptButton:SetPoint('TOPRIGHT', self.EditBox, 'BOTTOM', acceptXOffset, -5)
self.CancelButton:SetPoint('TOPLEFT', self.EditBox, 'BOTTOM', 2, -5)
self.Text:SetPoint('BOTTOM', self.EditBox, 'TOP', 0, 20)
else
self.AcceptButton:SetPoint('TOPRIGHT', self, 'CENTER', acceptXOffset, -5)
self.CancelButton:SetPoint('TOPLEFT', self, 'CENTER', 2, -5)
self.Text:SetPoint('BOTTOM', self, 'CENTER', 0, 20)
end
end
function BlockDialog:OnAcceptClick()
self.closeType = 'OnAccept'
self:Hide()
end
function BlockDialog:OnCancelClick()
self:Hide()
end
function BlockDialog:OnEditFocusLost()
if not self.editFocusLost then
return
end
if self.editFocusLost == 'ACCEPT' then
self:OnAcceptClick()
else
self:OnCancelClick()
end
end
function BlockDialog:OnHide()
if self.delayTimer then
self.delayTimer:Cancel()
end
self:Hide()
self[self.closeType or 'OnCancel'](self.ctx, self.EditBox:GetText())
end
function BlockDialog:OnTimer()
if self.delay <= 0 then
self.delayTimer = nil
self.AcceptButton:SetText(self.acceptText)
self.AcceptButton:Enable()
else
self.AcceptButton:SetText(format('%s (%d)', self.acceptText, self.delay))
self.AcceptButton:Disable()
self.delay = self.delay - 1
end
end