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.
220 lines
7.3 KiB
220 lines
7.3 KiB
|
2 years ago
|
--[[
|
||
|
|
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
|