mirror of
https://github.com/brues-code/pfUI.git
synced 2026-09-28 02:16:02 +00:00
api: separate gui functions
This commit is contained in:
@@ -0,0 +1,250 @@
|
||||
pfUI.api.ui = {}
|
||||
|
||||
-- load pfUI environment
|
||||
setfenv(1, pfUI:GetEnvironment())
|
||||
|
||||
function pfUI.api.ui:CreateTabChild(title, bwidth, bheight, bottom, static)
|
||||
-- setup env
|
||||
local childcount = table.getn(self.childs) + 1
|
||||
local button_width = bwidth or 150
|
||||
local button_height = bheight or 20
|
||||
local border = 4
|
||||
|
||||
-- create tab button
|
||||
local b = CreateFrame("Button", "pfConfig" .. title .. "Button", self, "UIPanelButtonTemplate")
|
||||
b:SetHeight(button_height)
|
||||
b:SetWidth(button_width)
|
||||
b:SetID(childcount)
|
||||
|
||||
if not self.align or self.align == "LEFT" then
|
||||
local outside = self.outside and -2 * border - button_width or 0
|
||||
if bottom then
|
||||
b:SetPoint("BOTTOMLEFT", self, "BOTTOMLEFT", border + outside, (self.bottomcount-1) * (button_height) + (self.bottomcount * border) )
|
||||
else
|
||||
b:SetPoint("TOPLEFT", self, "TOPLEFT", border + outside, -(childcount-1) * (button_height) - (childcount * border) )
|
||||
end
|
||||
elseif self.align == "TOP" then
|
||||
local outside = self.outside and 2 * border + button_height or 0
|
||||
b:SetPoint("TOPLEFT", self, "TOPLEFT", (childcount-1) * (button_width) + (childcount * border) + (self.outside and -border), -border + outside )
|
||||
end
|
||||
|
||||
SkinButton(b,.2,1,.8)
|
||||
b:SetText(title)
|
||||
|
||||
if childcount ~= 1 then
|
||||
b:SetTextColor(.5,.5,.5)
|
||||
else
|
||||
b:SetTextColor(.2,1,.8)
|
||||
end
|
||||
|
||||
b:SetScript("OnClick", function()
|
||||
for k,v in pairs(self.childs) do
|
||||
v:Hide()
|
||||
end
|
||||
self.childs[this:GetID()]:Show()
|
||||
|
||||
for k,v in pairs(self.buttons) do
|
||||
v.active = false
|
||||
v:SetTextColor(.5,.5,.5)
|
||||
end
|
||||
self.buttons[this:GetID()]:SetTextColor(.2,1,.8)
|
||||
end)
|
||||
|
||||
self.buttons[childcount] = b
|
||||
self.bottomcount = bottom and self.bottomcount + 1 or self.bottomcount
|
||||
|
||||
-- create child frame
|
||||
local child, scrollchild = nil, nil
|
||||
if not static then
|
||||
child = ui:CreateScrollFrame("pfConfig" .. title .. "Frame", self)
|
||||
scrollchild = ui:CreateScrollChild("pfConfig" .. title .. "ScrollChild", child)
|
||||
else
|
||||
child = CreateFrame("Frame", "pfConfig" .. title .. "Frame", self)
|
||||
end
|
||||
|
||||
if childcount ~= 1 then child:Hide() end
|
||||
|
||||
if not self.align or self.align == "LEFT" then
|
||||
child:SetPoint("TOPLEFT", self, "TOPLEFT", button_width + 2*border + 5, -border -5)
|
||||
child:SetPoint("BOTTOMRIGHT", self, "BOTTOMRIGHT", -border -5 , border + 5)
|
||||
elseif self.align == "TOP" then
|
||||
if self.outside then
|
||||
child:SetPoint("TOPLEFT", self, "TOPLEFT", 5, -5)
|
||||
child:SetPoint("BOTTOMRIGHT", self, "BOTTOMRIGHT", -5, 5)
|
||||
end
|
||||
end
|
||||
|
||||
local backdrop = CreateFrame("Frame", nil, child)
|
||||
backdrop:SetFrameLevel(1)
|
||||
backdrop:SetPoint("TOPLEFT", child, "TOPLEFT", -5, 5)
|
||||
backdrop:SetPoint("BOTTOMRIGHT", child, "BOTTOMRIGHT", 5, -5)
|
||||
CreateBackdrop(backdrop, nil, true)
|
||||
|
||||
local ret = scrollchild or child
|
||||
ret.button = b
|
||||
table.insert(self.childs, child)
|
||||
return ret
|
||||
end
|
||||
|
||||
function pfUI.api.ui:CreateTabFrame(parent, align, outside)
|
||||
local f = CreateFrame("Frame", nil, parent)
|
||||
|
||||
f:SetPoint("TOPLEFT", parent, "TOPLEFT", -5, 5)
|
||||
f:SetPoint("BOTTOMRIGHT", parent, "BOTTOMRIGHT", 5, -5)
|
||||
|
||||
-- setup env
|
||||
f.childs = { }
|
||||
f.buttons = { }
|
||||
f.align = align
|
||||
f.outside = outside
|
||||
f.bottomcount = 1
|
||||
|
||||
-- Create Child Frame
|
||||
f.CreateTabChild = pfUI.api.ui.CreateTabChild
|
||||
|
||||
return f
|
||||
end
|
||||
|
||||
function pfUI.api.ui:CreateScrollFrame(name, parent)
|
||||
local f = CreateFrame("ScrollFrame", name, parent)
|
||||
|
||||
f.Scroll = function(self, step)
|
||||
local current = self:GetVerticalScroll()
|
||||
local new = current + step*-25
|
||||
local max = self:GetVerticalScrollRange() + 25
|
||||
|
||||
if max > 25 then
|
||||
if new < 0 then
|
||||
self:SetVerticalScroll(0)
|
||||
elseif new > max then
|
||||
self:SetVerticalScroll(max)
|
||||
else
|
||||
self:SetVerticalScroll(new)
|
||||
end
|
||||
end
|
||||
|
||||
self:UpdateScrollState()
|
||||
end
|
||||
|
||||
f:EnableMouseWheel(1)
|
||||
|
||||
f.deco_up = CreateFrame("Frame", nil, f)
|
||||
f.deco_up:SetPoint("TOPLEFT", f, "TOPLEFT", -4, 4)
|
||||
f.deco_up:SetPoint("BOTTOMRIGHT", f, "TOPRIGHT", 4, -25)
|
||||
|
||||
f.deco_up.fader = f.deco_up:CreateTexture("OVERLAY")
|
||||
f.deco_up.fader:SetTexture(1,1,1,1)
|
||||
f.deco_up.fader:SetGradientAlpha("VERTICAL", 0, 0, 0, 0, 0, 0, 0, 1)
|
||||
f.deco_up.fader:SetAllPoints(f.deco_up)
|
||||
|
||||
f.deco_up_indicator = CreateFrame("Button", nil, f.deco_up)
|
||||
f.deco_up_indicator:SetFrameLevel(128)
|
||||
f.deco_up_indicator:Hide()
|
||||
f.deco_up_indicator:SetPoint("TOP", f.deco_up, "TOP", 0, -6)
|
||||
f.deco_up_indicator:SetHeight(12)
|
||||
f.deco_up_indicator:SetWidth(12)
|
||||
f.deco_up_indicator.modifier = 0.03
|
||||
f.deco_up_indicator:SetScript("OnClick", function()
|
||||
local f = this:GetParent():GetParent()
|
||||
f:Scroll(3)
|
||||
end)
|
||||
|
||||
f.deco_up_indicator:SetScript("OnUpdate", function()
|
||||
local alpha = this:GetAlpha()
|
||||
local fpsmod = GetFramerate() / 30
|
||||
|
||||
if alpha >= .75 then
|
||||
this.modifier = -0.03 / fpsmod
|
||||
elseif alpha <= .25 then
|
||||
this.modifier = 0.03 / fpsmod
|
||||
end
|
||||
|
||||
this:SetAlpha(alpha + this.modifier)
|
||||
end)
|
||||
|
||||
f.deco_up_indicator.tex = f.deco_up_indicator:CreateTexture("OVERLAY")
|
||||
f.deco_up_indicator.tex:SetTexture("Interface\\AddOns\\pfUI\\img\\up")
|
||||
f.deco_up_indicator.tex:SetAllPoints(f.deco_up_indicator)
|
||||
|
||||
f.deco_down = CreateFrame("Frame", nil, f)
|
||||
f.deco_down:SetPoint("BOTTOMLEFT", f, "BOTTOMLEFT", -4, -4)
|
||||
f.deco_down:SetPoint("TOPRIGHT", f, "BOTTOMRIGHT", 4, 25)
|
||||
|
||||
f.deco_down.fader = f.deco_down:CreateTexture("OVERLAY")
|
||||
f.deco_down.fader:SetTexture(1,1,1,1)
|
||||
f.deco_down.fader:SetGradientAlpha("VERTICAL", 0, 0, 0, 1, 0, 0, 0, 0)
|
||||
f.deco_down.fader:SetAllPoints(f.deco_down)
|
||||
|
||||
f.deco_down_indicator = CreateFrame("Button", nil, f.deco_down)
|
||||
f.deco_down_indicator:SetFrameLevel(128)
|
||||
f.deco_down_indicator:Hide()
|
||||
f.deco_down_indicator:SetPoint("BOTTOM", f.deco_down, "BOTTOM", 0, 6)
|
||||
f.deco_down_indicator:SetHeight(12)
|
||||
f.deco_down_indicator:SetWidth(12)
|
||||
f.deco_down_indicator.modifier = 0.03
|
||||
f.deco_down_indicator:SetScript("OnClick", function()
|
||||
local f = this:GetParent():GetParent()
|
||||
f:Scroll(-3)
|
||||
end)
|
||||
|
||||
f.deco_down_indicator:SetScript("OnUpdate", function()
|
||||
local alpha = this:GetAlpha()
|
||||
local fpsmod = GetFramerate() / 30
|
||||
|
||||
if alpha >= .75 then
|
||||
this.modifier = -0.03 / fpsmod
|
||||
elseif alpha <= .25 then
|
||||
this.modifier = 0.03 / fpsmod
|
||||
end
|
||||
|
||||
this:SetAlpha(alpha + this.modifier)
|
||||
end)
|
||||
|
||||
f.deco_down_indicator.tex = f.deco_down_indicator:CreateTexture("OVERLAY")
|
||||
f.deco_down_indicator.tex:SetTexture("Interface\\AddOns\\pfUI\\img\\down")
|
||||
f.deco_down_indicator.tex:SetAllPoints(f.deco_down_indicator)
|
||||
|
||||
f.UpdateScrollState = function(self)
|
||||
-- Update Scroll Indicators: Hide/Show if required.
|
||||
local current = floor(self:GetVerticalScroll())
|
||||
local max = floor(self:GetVerticalScrollRange() + 25)
|
||||
|
||||
if current > 0 then
|
||||
self.deco_up_indicator:Show()
|
||||
else
|
||||
self.deco_up_indicator:Hide()
|
||||
end
|
||||
|
||||
if max > 25 and current < max then
|
||||
self.deco_down_indicator:Show()
|
||||
self.deco_down_indicator:SetAlpha(.75)
|
||||
else
|
||||
self.deco_down_indicator:Hide()
|
||||
end
|
||||
end
|
||||
|
||||
f:SetScript("OnMouseWheel", function()
|
||||
this:Scroll(arg1)
|
||||
end)
|
||||
|
||||
return f
|
||||
end
|
||||
|
||||
function pfUI.api.ui:CreateScrollChild(name, parent)
|
||||
local f = CreateFrame("Frame", name, parent)
|
||||
|
||||
-- dummy values required
|
||||
f:SetWidth(1)
|
||||
f:SetHeight(1)
|
||||
f:SetAllPoints(parent)
|
||||
|
||||
parent:SetScrollChild(f)
|
||||
|
||||
-- OnShow is fired too early, postpone to the first frame draw
|
||||
f:SetScript("OnUpdate", function()
|
||||
this:GetParent():UpdateScrollState()
|
||||
this:SetScript("OnUpdate", nil)
|
||||
end)
|
||||
|
||||
return f
|
||||
end
|
||||
Reference in New Issue
Block a user