forked from Bastion/Bastion
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.
122 lines
3.0 KiB
122 lines
3.0 KiB
2 years ago
|
--- @type StdUi
|
||
|
local StdUi = LibStub and LibStub('StdUi', true);
|
||
|
if not StdUi then
|
||
|
return
|
||
|
end
|
||
|
|
||
|
local module, version = 'Window', 5;
|
||
|
if not StdUi:UpgradeNeeded(module, version) then return end;
|
||
|
|
||
|
--- @return Frame
|
||
|
function StdUi:Window(parent, width, height, title)
|
||
|
parent = parent or UIParent;
|
||
|
local frame = self:PanelWithTitle(parent, width, height, title);
|
||
|
frame:SetClampedToScreen(true);
|
||
|
frame.titlePanel.isWidget = false;
|
||
|
self:MakeDraggable(frame); -- , frame.titlePanel
|
||
|
|
||
|
local closeBtn = self:Button(frame, 16, 16, 'X');
|
||
|
closeBtn.text:SetFontSize(12);
|
||
|
closeBtn.isWidget = false;
|
||
|
self:GlueTop(closeBtn, frame, -10, -10, 'RIGHT');
|
||
|
|
||
|
closeBtn:SetScript('OnClick', function(self)
|
||
|
self:GetParent():Hide();
|
||
|
end);
|
||
|
|
||
|
frame.closeBtn = closeBtn;
|
||
|
|
||
|
function frame:SetWindowTitle(t)
|
||
|
self.titlePanel.label:SetText(t);
|
||
|
end
|
||
|
|
||
|
-- Resizable window shortcut
|
||
|
function frame:MakeResizable(direction)
|
||
|
StdUi:MakeResizable(frame, direction);
|
||
|
return frame;
|
||
|
end
|
||
|
|
||
|
return frame;
|
||
|
end
|
||
|
|
||
|
-- Reusing dialogs
|
||
|
StdUi.dialogs = {};
|
||
|
--- @return Frame
|
||
|
function StdUi:Dialog(title, message, dialogId)
|
||
|
local window;
|
||
|
if dialogId and self.dialogs[dialogId] then
|
||
|
window = self.dialogs[dialogId];
|
||
|
else
|
||
|
window = self:Window(nil, self.config.dialog.width, self.config.dialog.height, title);
|
||
|
window:SetPoint('CENTER');
|
||
|
window:SetFrameStrata('DIALOG');
|
||
|
end
|
||
|
|
||
|
if window.messageLabel then
|
||
|
window.messageLabel:SetText(message);
|
||
|
else
|
||
|
window.messageLabel = self:Label(window, message);
|
||
|
window.messageLabel:SetJustifyH('MIDDLE');
|
||
|
self:GlueAcross(window.messageLabel, window, 5, -10, -5, 5);
|
||
|
end
|
||
|
|
||
|
window:Show();
|
||
|
|
||
|
if dialogId then
|
||
|
self.dialogs[dialogId] = window;
|
||
|
end
|
||
|
|
||
|
return window;
|
||
|
end
|
||
|
|
||
|
--- Dialog with additional buttons, buttons can be like this
|
||
|
--- local btn = {
|
||
|
--- ok = {
|
||
|
--- text = 'OK',
|
||
|
--- onClick = function() end
|
||
|
--- },
|
||
|
--- cancel = {
|
||
|
--- text = 'Cancel',
|
||
|
--- onClick = function() end
|
||
|
--- }
|
||
|
--- }
|
||
|
--- @return Frame
|
||
|
function StdUi:Confirm(title, message, buttons, dialogId)
|
||
|
local window = self:Dialog(title, message, dialogId);
|
||
|
|
||
|
if buttons and not window.buttons then
|
||
|
window.buttons = {};
|
||
|
|
||
|
local btnCount = self.Util.tableCount(buttons);
|
||
|
|
||
|
local btnMargin = self.config.dialog.button.margin;
|
||
|
local btnWidth = self.config.dialog.button.width;
|
||
|
local btnHeight = self.config.dialog.button.height;
|
||
|
|
||
|
local totalWidth = btnCount * btnWidth + (btnCount - 1) * btnMargin;
|
||
|
local leftMargin = math.floor((self.config.dialog.width - totalWidth) / 2);
|
||
|
|
||
|
local i = 0;
|
||
|
for k, btnDefinition in pairs(buttons) do
|
||
|
local btn = self:Button(window, btnWidth, btnHeight, btnDefinition.text);
|
||
|
btn.window = window;
|
||
|
|
||
|
self:GlueBottom(btn, window, leftMargin + (i * (btnWidth + btnMargin)), 10, 'LEFT');
|
||
|
|
||
|
if btnDefinition.onClick then
|
||
|
btn:SetScript('OnClick', btnDefinition.onClick);
|
||
|
end
|
||
|
|
||
|
window.buttons[k] = btn;
|
||
|
i = i + 1;
|
||
|
end
|
||
|
|
||
|
window.messageLabel:ClearAllPoints();
|
||
|
self:GlueAcross(window.messageLabel, window, 5, -10, -5, 5 + btnHeight + 5);
|
||
|
end
|
||
|
|
||
|
return window;
|
||
|
end
|
||
|
|
||
|
StdUi:RegisterModule(module, version);
|