@ -1,384 +0,0 @@ |
||||
-- $Id: DiesalGUI-1.0.lua 61 2017-03-28 23:13:41Z diesal2010 $ |
||||
local MAJOR, MINOR = "DiesalGUI-1.0", "$Rev: 61 $" |
||||
local DiesalGUI, oldminor = LibStub:NewLibrary(MAJOR, MINOR) |
||||
if not DiesalGUI then return end -- No Upgrade needed. |
||||
-- ~~| Libraries |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local CallbackHandler = LibStub("CallbackHandler-1.0") |
||||
local DiesalTools = LibStub("DiesalTools-1.0") |
||||
local DiesalStyle = LibStub("DiesalStyle-1.0") |
||||
-- ~~| Lua Upvalues |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local type, select, tonumber = type, select, tonumber |
||||
local setmetatable, getmetatable, next = setmetatable, getmetatable, next |
||||
local pairs, ipairs = pairs,ipairs |
||||
local tinsert, tremove = table.insert, table.remove |
||||
-- ~~| WoW Upvalues |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local CreateFrame, UIParent = CreateFrame, UIParent |
||||
-- ~~| DiesalGUI Values |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
DiesalGUI.callbacks = DiesalGUI.callbacks or CallbackHandler:New(DiesalGUI) |
||||
DiesalGUI.ObjectFactory = DiesalGUI.ObjectFactory or {} |
||||
DiesalGUI.ObjectVersions = DiesalGUI.ObjectVersions or {} |
||||
DiesalGUI.ObjectPool = DiesalGUI.ObjectPool or {} |
||||
DiesalGUI.ObjectBase = DiesalGUI.ObjectBase or {} |
||||
-- ~~| DiesalGUI Upvalues |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local ObjectFactory = DiesalGUI.ObjectFactory |
||||
local ObjectVersions = DiesalGUI.ObjectVersions |
||||
local ObjectPool = DiesalGUI.ObjectPool |
||||
local ObjectBase = DiesalGUI.ObjectBase |
||||
-- ~~| DiesalGUI Local Methods |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local function OnMouse(frame,button) |
||||
DiesalGUI:ClearFocus() |
||||
end |
||||
-- capture mouse clicks on the WorldFrame |
||||
local function WorldFrameOnMouse(frame,button) |
||||
OnMouse(frame,button) |
||||
end |
||||
_G.WorldFrame:HookScript("OnMouseDown", WorldFrameOnMouse ) |
||||
-- Returns a new object |
||||
local function newObject(objectType) |
||||
if not ObjectFactory[objectType] then error("Attempt to construct unknown Object type", 2) end |
||||
|
||||
ObjectPool[objectType] = ObjectPool[objectType] or {} |
||||
|
||||
local newObj = next(ObjectPool[objectType]) |
||||
if not newObj then |
||||
newObj = ObjectFactory[objectType](object) |
||||
else |
||||
ObjectPool[objectType][newObj] = nil |
||||
end |
||||
|
||||
return newObj |
||||
end |
||||
-- Releases an object into ReleasedObjects |
||||
local function releaseObject(obj,objectType) |
||||
ObjectPool[objectType] = ObjectPool[objectType] or {} |
||||
|
||||
if ObjectPool[objectType][obj] then |
||||
error("Attempt to Release Object that is already released", 2) |
||||
end |
||||
ObjectPool[objectType][obj] = true |
||||
end |
||||
-- ~~| Object Blizzard Base |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
ObjectBase.Hide = function(self) |
||||
self.frame:Hide() |
||||
end |
||||
ObjectBase.Show = function(self) |
||||
self.frame:Show() |
||||
end |
||||
ObjectBase.SetParent = function(self, parent) |
||||
local frame = self.frame |
||||
frame:SetParent(nil) |
||||
frame:SetParent(parent) |
||||
self.settings.parent = parent |
||||
end |
||||
ObjectBase.SetWidth = function(self, width) |
||||
self.settings.width = width |
||||
self.frame:SetWidth(width) |
||||
self:FireEvent("OnWidthSet",width) |
||||
end |
||||
ObjectBase.SetHeight = function(self, height) |
||||
self.settings.height = height |
||||
self.frame:SetHeight(height) |
||||
self:FireEvent("OnHeightSet",height) |
||||
end |
||||
ObjectBase.SetSize = function(self, width, height) |
||||
self.settings.width = width |
||||
self.settings.height = height |
||||
|
||||
self.frame:SetHeight(height) |
||||
self.frame:SetWidth(width) |
||||
|
||||
self:FireEvent("OnWidthSet",width) |
||||
self:FireEvent("OnHeightSet",height) |
||||
end |
||||
ObjectBase.GetWidth = function(self) |
||||
return self.frame:GetWidth() |
||||
end |
||||
ObjectBase.GetHeight = function(self) |
||||
return self.frame:GetHeight() |
||||
end |
||||
ObjectBase.IsVisible = function(self) |
||||
return self.frame:IsVisible() |
||||
end |
||||
ObjectBase.IsShown = function(self) |
||||
return self.frame:IsShown() |
||||
end |
||||
ObjectBase.SetPoint = function(self, ...) |
||||
return self.frame:SetPoint(...) |
||||
end |
||||
ObjectBase.SetAllPoints = function(self, ...) |
||||
return self.frame:SetAllPoints(...) |
||||
end |
||||
ObjectBase.ClearAllPoints = function(self) |
||||
return self.frame:ClearAllPoints() |
||||
end |
||||
ObjectBase.GetNumPoints = function(self) |
||||
return self.frame:GetNumPoints() |
||||
end |
||||
ObjectBase.GetPoint = function(self, ...) |
||||
return self.frame:GetPoint(...) |
||||
end |
||||
-- ~~| Object Diesal Base |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
ObjectBase.CreateRegion = function(self,regionType,regionName,parentRegion,defaultFontObject) |
||||
if regionType == 'FontString' then |
||||
local fontString = parentRegion:CreateFontString() |
||||
-- set Default font properties |
||||
if defaultFontObject then |
||||
fontString.defaultFontObject = defaultFontObject |
||||
else |
||||
fontString.defaultFontObject = DiesalFontNormal |
||||
end |
||||
fontString:SetFont(fontString.defaultFontObject:GetFont()) |
||||
fontString:SetTextColor(fontString.defaultFontObject:GetTextColor()) |
||||
fontString:SetSpacing(fontString.defaultFontObject:GetSpacing()) |
||||
|
||||
self[regionName] = fontString |
||||
self.fontStrings[regionName] = fontString |
||||
return fontString |
||||
end |
||||
if regionType == 'Texture' then |
||||
self[regionName] = parentRegion:CreateTexture() |
||||
return self[regionName] |
||||
end |
||||
if regionType == 'EditBox' then |
||||
local editBox = CreateFrame(regionType,nil,parentRegion) |
||||
-- set Default font properties |
||||
if defaultFontObject then |
||||
editBox.defaultFontObject = defaultFontObject |
||||
else |
||||
editBox.defaultFontObject = DiesalFontNormal |
||||
end |
||||
editBox:SetFont(editBox.defaultFontObject:GetFont()) |
||||
editBox:SetTextColor(editBox.defaultFontObject:GetTextColor()) |
||||
editBox:SetSpacing(editBox.defaultFontObject:GetSpacing()) |
||||
editBox:HookScript('OnEscapePressed', function(this) DiesalGUI:ClearFocus(); end) |
||||
editBox:HookScript('OnEditFocusGained',function(this) DiesalGUI:SetFocus(this); GameTooltip:Hide(); end) |
||||
|
||||
self[regionName] = editBox |
||||
return editBox |
||||
end |
||||
if regionType == 'ScrollingMessageFrame' then |
||||
local srollingMessageFrame = CreateFrame(regionType,nil,parentRegion) |
||||
-- set Default font properties |
||||
if defaultFontObject then |
||||
srollingMessageFrame.defaultFontObject = defaultFontObject |
||||
else |
||||
srollingMessageFrame.defaultFontObject = DiesalFontNormal |
||||
end |
||||
srollingMessageFrame:SetFont(srollingMessageFrame.defaultFontObject:GetFont()) |
||||
srollingMessageFrame:SetTextColor(srollingMessageFrame.defaultFontObject:GetTextColor()) |
||||
srollingMessageFrame:SetSpacing(srollingMessageFrame.defaultFontObject:GetSpacing()) |
||||
|
||||
self[regionName] = srollingMessageFrame |
||||
return srollingMessageFrame |
||||
end |
||||
|
||||
self[regionName] = CreateFrame(regionType,nil,parentRegion) |
||||
return self[regionName] |
||||
end |
||||
ObjectBase.ResetFonts = function(self) |
||||
for name,fontString in pairs(self.fontStrings) do |
||||
fontString:SetFont(fontString.defaultFontObject:GetFont()) |
||||
fontString:SetTextColor(fontString.defaultFontObject:GetTextColor()) |
||||
fontString:SetSpacing(fontString.defaultFontObject:GetSpacing()) |
||||
end |
||||
end |
||||
ObjectBase.AddChild = function(self, object) |
||||
tinsert(self.children, object) |
||||
end |
||||
ObjectBase.ReleaseChild = function(self,object) |
||||
local children = self.children |
||||
|
||||
for i = 1,#children do |
||||
if children[i] == object then |
||||
children[i]:Release() |
||||
tremove(children,i) |
||||
break end |
||||
end |
||||
end |
||||
ObjectBase.ReleaseChildren = function(self) |
||||
local children = self.children |
||||
for i = 1,#children do |
||||
children[i]:Release() |
||||
children[i] = nil |
||||
end |
||||
end |
||||
ObjectBase.Release = function(self) |
||||
DiesalGUI:Release(self) |
||||
end |
||||
ObjectBase.SetParentObject = function(self, parent) |
||||
local frame = self.frame |
||||
local settings = self.settings |
||||
|
||||
frame:SetParent(nil) |
||||
frame:SetParent(parent.content) |
||||
settings.parent = parent.content |
||||
settings.parentObject = parent |
||||
end |
||||
ObjectBase.SetSettings = function(self,settings,apply) |
||||
for key,value in pairs(settings) do |
||||
self.settings[key] = value |
||||
end |
||||
if apply then self:ApplySettings() end |
||||
end |
||||
ObjectBase.ResetSettings = function(self,apply) |
||||
self.settings = DiesalTools.TableCopy( self.defaults ) |
||||
if apply then self:ApplySettings() end |
||||
end |
||||
ObjectBase.SetEventListener = function(self, event, listener) |
||||
if type(listener) == "function" then |
||||
self.eventListeners[event] = listener |
||||
else |
||||
error("listener is required to be a function", 2) |
||||
end |
||||
end |
||||
ObjectBase.ResetEventListeners = function(self) |
||||
for k in pairs(self.eventListeners) do |
||||
self.eventListeners[k] = nil |
||||
end |
||||
end |
||||
ObjectBase.FireEvent = function(self, event, ...) |
||||
if self.eventListeners[event] then |
||||
return self.eventListeners[event]( self, event, ...) |
||||
end |
||||
end |
||||
ObjectBase.SetStyle = function(self,name,style) |
||||
DiesalStyle:SetObjectStyle(self,name,style) |
||||
end |
||||
ObjectBase.UpdateStyle = function(self,name,style) |
||||
DiesalStyle:UpdateObjectStyle(self,name,style) |
||||
end |
||||
ObjectBase.UpdateStylesheet = function(self,Stylesheet) |
||||
DiesalStyle:UpdateObjectStylesheet(self,Stylesheet) |
||||
end |
||||
ObjectBase.SetStylesheet = function(self,Stylesheet) |
||||
DiesalStyle:SetObjectStylesheet(self,Stylesheet) |
||||
end |
||||
ObjectBase.ReleaseTexture = function(self,name) |
||||
if not self.textures[name] then return end |
||||
DiesalStyle:ReleaseTexture(self,name) |
||||
end |
||||
ObjectBase.ReleaseTextures = function(self) |
||||
DiesalStyle:ReleaseTextures(self) |
||||
end |
||||
-- ~~| DiesalGUI API |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
-- Returns an Object Base |
||||
function DiesalGUI:CreateObjectBase(Type) |
||||
local object = { |
||||
type = Type, |
||||
fontStrings = {}, |
||||
textures = {}, |
||||
children = {}, |
||||
eventListeners = {}, |
||||
} |
||||
setmetatable(object, {__index = ObjectBase}) |
||||
return object |
||||
end |
||||
-- Registers an Object constructor in the ObjectFactory |
||||
function DiesalGUI:RegisterObjectConstructor(Type, constructor, version) |
||||
assert(type(constructor) == "function") |
||||
assert(type(version) == "number") |
||||
|
||||
local oldVersion = ObjectVersions[Type] |
||||
if oldVersion and oldVersion >= version then return end |
||||
|
||||
ObjectVersions[Type] = version |
||||
ObjectFactory[Type] = constructor |
||||
end |
||||
-- Create a new Object |
||||
function DiesalGUI:Create(objectType,name) |
||||
if ObjectFactory[objectType] then |
||||
local object |
||||
if name then -- needs a specific name, bypass the objectPool and create a new object |
||||
object = ObjectFactory[objectType](name) |
||||
else |
||||
object = newObject(objectType) |
||||
end |
||||
object:ResetSettings() |
||||
-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
if object.OnAcquire then object:OnAcquire() end |
||||
return object |
||||
end |
||||
end |
||||
|
||||
function DiesalGUI:CreateThrottle(duration, callback) |
||||
assert(callback and type(callback) == 'function','callback has to be a function ') |
||||
assert(duration and type(duration) == 'number','duration has to be a number ') |
||||
|
||||
local throttle = CreateFrame("Frame", nil, UIParent):CreateAnimationGroup() |
||||
throttle.anim = throttle:CreateAnimation("Animation") |
||||
throttle.args = {} |
||||
local mt = getmetatable(throttle) |
||||
mt.__index.SetCallback = function(self,callback) |
||||
assert(callback and type(callback) == 'function','callback required to be a function ') |
||||
self:SetScript("OnFinished", function() callback(unpack(self.args)) end) |
||||
end |
||||
mt.__index.AddCallback = function(self,callback) |
||||
assert(callback and type(callback) == 'function','callback required to be a function ') |
||||
self:HookScript("OnFinished", function() callback(unpack(self.args)) end) |
||||
end |
||||
mt.__index.SetDuration = function(self,duration) |
||||
assert(duration and type(duration) == 'number','duration has to be a number ') |
||||
self.anim:SetDuration(duration) |
||||
end |
||||
mt.__call = function(self,...) |
||||
self.args = {...} |
||||
self:Stop() |
||||
self:Play() |
||||
end |
||||
setmetatable(throttle,mt) |
||||
|
||||
throttle:SetScript("OnFinished", function() callback(unpack(throttle.args)) end) |
||||
throttle:SetDuration(duration) |
||||
|
||||
return throttle |
||||
end |
||||
-- Releases an object ready for reuse by Create |
||||
function DiesalGUI:Release(object) |
||||
if object.OnRelease then object:OnRelease() end |
||||
object:FireEvent("OnRelease") |
||||
|
||||
object:ReleaseChildren() |
||||
object:ReleaseTextures() |
||||
object:ResetFonts() |
||||
object:ResetEventListeners() |
||||
|
||||
object.frame:ClearAllPoints() |
||||
object.frame:Hide() |
||||
object.frame:SetParent(UIParent) |
||||
releaseObject(object, object.type) |
||||
end |
||||
-- Set FocusedObject: Menu, Dropdown, editBox etc.... |
||||
function DiesalGUI:SetFocus(object) |
||||
if self.FocusedObject and self.FocusedObject ~= object then DiesalGUI:ClearFocus() end |
||||
self.FocusedObject = object |
||||
end |
||||
-- clear focus from the FocusedObject |
||||
function DiesalGUI:ClearFocus() |
||||
local FocusedObject = self.FocusedObject |
||||
if FocusedObject then |
||||
if FocusedObject.ClearFocus then -- FocusedObject is Focusable Frame |
||||
FocusedObject:ClearFocus() |
||||
end |
||||
self.FocusedObject = nil |
||||
end |
||||
end |
||||
-- Mouse Input capture for any DiesalGUI interactive region |
||||
function DiesalGUI:OnMouse(frame,button) |
||||
-- print(button) |
||||
OnMouse(frame,button) |
||||
DiesalGUI.callbacks:Fire("DiesalGUI_OnMouse", frame, button) |
||||
end |
||||
|
||||
DiesalGUI.counts = DiesalGUI.counts or {} |
||||
--- A type-based counter to count the number of widgets created. |
||||
function DiesalGUI:GetNextObjectNum(type) |
||||
if not self.counts[type] then |
||||
self.counts[type] = 0 |
||||
end |
||||
self.counts[type] = self.counts[type] + 1 |
||||
return self.counts[type] |
||||
end |
||||
--- Return the number of created widgets for this type. |
||||
function DiesalGUI:GetObjectCount(type) |
||||
return self.counts[type] or 0 |
||||
end |
@ -1,23 +0,0 @@ |
||||
<Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/ |
||||
..\FrameXML\UI.xsd"> |
||||
<Script file="DiesalGUI-1.0.lua"/> |
||||
<!-- Objects --> |
||||
<Script file="Objects\Window.lua"/> |
||||
<Script file="Objects\ScrollFrame.lua"/> |
||||
<Script file="Objects\ScrollingEditBox.lua"/> |
||||
<Script file="Objects\ScrollingMessageFrame.lua"/> |
||||
<Script file="Objects\CheckBox.lua"/> |
||||
<Script file="Objects\Button.lua"/> |
||||
<Script file="Objects\Spinner.lua"/> |
||||
<Script file="Objects\Input.lua"/> |
||||
<Script file="Objects\Dropdown.lua"/> |
||||
<Script file="Objects\DropdownItem.lua"/> |
||||
<Script file="Objects\ComboBox.lua"/> |
||||
<Script file="Objects\ComboBoxItem.lua"/> |
||||
<Script file="Objects\Accordian.lua"/> |
||||
<Script file="Objects\AccordianSection.lua"/> |
||||
<Script file="Objects\Tree.lua"/> |
||||
<Script file="Objects\Branch.lua"/> |
||||
<Script file="Objects\Bar.lua"/> |
||||
<Script file="Objects\Toggle.lua"/> |
||||
</Ui> |
@ -1,62 +0,0 @@ |
||||
local DiesalGUI = LibStub("DiesalGUI-1.0") |
||||
-- ~~| Libraries |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local DiesalTools = LibStub("DiesalTools-1.0") |
||||
local DiesalStyle = LibStub("DiesalStyle-1.0") |
||||
-- | Lua Upvalues |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
-- | Lua Upvalues |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
-- | Accordian |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local Type = "Accordian" |
||||
local Version = 2 |
||||
-- ~~| Stylesheets |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local Stylesheet = { |
||||
['frame-background'] = { |
||||
type = 'texture', |
||||
color = 'FF0000', |
||||
}, |
||||
|
||||
} |
||||
-- | Locals |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
-- | Methods |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local methods = { |
||||
['OnAcquire'] = function(self) |
||||
-- self:SetStylesheet(Stylesheet) |
||||
-- self:SetStylesheet(wireFrameSheet) |
||||
self:ResetSettings(true) |
||||
self:Show() |
||||
end, |
||||
['OnRelease'] = function(self) |
||||
|
||||
end, |
||||
['ApplySettings'] = function(self) |
||||
|
||||
end, |
||||
['CollapseAll'] = function(self) |
||||
for i=1 , #self.children do |
||||
self.children[i]:Collapse() |
||||
end |
||||
end, |
||||
['ExpandAll'] = function(self) |
||||
for i=1 , #self.children do |
||||
self.children[i]:Expand() |
||||
end |
||||
end, |
||||
} |
||||
-- | Constructor |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local function Constructor() |
||||
local self = DiesalGUI:CreateObjectBase(Type) |
||||
local frame = CreateFrame('Frame',nil,UIParent) |
||||
self.frame = frame |
||||
-- ~~ Default Settings ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
self.defaults = { } |
||||
-- ~~ Events ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
-- OnAcquire, OnRelease, OnHeightSet, OnWidthSet |
||||
-- OnHeightChange |
||||
-- ~~ Construct ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local content = self:CreateRegion("Frame", 'content', frame) |
||||
content:SetAllPoints() |
||||
-- ~~ Methods ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
for method, func in pairs(methods) do self[method] = func end |
||||
-- ~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
return self |
||||
end |
||||
DiesalGUI:RegisterObjectConstructor(Type,Constructor,Version) |
@ -1,217 +0,0 @@ |
||||
local DiesalGUI = LibStub("DiesalGUI-1.0") |
||||
-- ~~| Libraries |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local DiesalTools = LibStub("DiesalTools-1.0") |
||||
local DiesalStyle = LibStub("DiesalStyle-1.0") |
||||
-- ~~| Diesal Upvalues |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local Colors = DiesalStyle.Colors |
||||
local HSL, ShadeColor, TintColor = DiesalTools.HSL, DiesalTools.ShadeColor, DiesalTools.TintColor |
||||
-- | Lua Upvalues |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
-- | WoW Upvalues |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
-- | AccordianSection |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local Type = 'AccordianSection' |
||||
local Version = 3 |
||||
-- | Stylesheets |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local Stylesheet = { |
||||
['button-background'] = { |
||||
type = 'texture', |
||||
layer = 'BACKGROUND', |
||||
gradient = {'VERTICAL',Colors.UI_400_GR[1],Colors.UI_400_GR[2]}, |
||||
alpha = .95, |
||||
position = {0,0,-1,0}, |
||||
}, |
||||
['button-outline'] = { |
||||
type = 'outline', |
||||
layer = 'BACKGROUND', |
||||
color = '000000', |
||||
position = {1,1,0,1}, |
||||
}, |
||||
['button-inline'] = { |
||||
type = 'outline', |
||||
layer = 'ARTWORK', |
||||
gradient = {'VERTICAL','ffffff','ffffff'}, |
||||
alpha = {.03,.02}, |
||||
position = {0,0,-1,0}, |
||||
}, |
||||
['button-hover'] = { |
||||
type = 'texture', |
||||
layer = 'HIGHLIGHT', |
||||
color = 'ffffff', |
||||
alpha = .1, |
||||
}, |
||||
['button-leftExpandIcon'] = { |
||||
type = 'texture', |
||||
position = {0,nil,-1,nil}, |
||||
height = 16, |
||||
width = 16, |
||||
image = {'DiesalGUIcons',{3,6,16,256,128},HSL(Colors.UI_Hue,Colors.UI_Saturation,.65)}, |
||||
alpha = 1, |
||||
}, |
||||
['button-leftCollapseIcon'] = { |
||||
type = 'texture', |
||||
position = {0,nil,-1,nil}, |
||||
height = 16, |
||||
width = 16, |
||||
image = {'DiesalGUIcons',{4,6,16,256,128},HSL(Colors.UI_Hue,Colors.UI_Saturation,.65)}, |
||||
alpha = 1, |
||||
}, |
||||
['content-background'] = { |
||||
type = 'texture', |
||||
layer = 'BACKGROUND', |
||||
color = Colors.UI_300, |
||||
alpha = .95, |
||||
position = {0,0,-1,0}, |
||||
}, |
||||
['content-topShadow'] = { |
||||
type = 'texture', |
||||
layer = 'ARTWORK', |
||||
gradient = {'VERTICAL','000000','000000'}, |
||||
alpha = {.05,0}, |
||||
position = {0,0,-1,nil}, |
||||
height = 4, |
||||
}, |
||||
['content-bottomShadow'] = { |
||||
type = 'texture', |
||||
layer = 'ARTWORK', |
||||
gradient = {'VERTICAL','000000','000000'}, |
||||
alpha = {0,.05}, |
||||
position = {0,0,nil,0}, |
||||
height = 4, |
||||
}, |
||||
['content-inline'] = { |
||||
type = 'outline', |
||||
layer = 'ARTWORK', |
||||
color = 'ffffff', |
||||
alpha = .02, |
||||
position = {0,0,-1,0}, |
||||
}, |
||||
['text-Font'] = { |
||||
type = 'font', |
||||
color = Colors.UI_F450, |
||||
}, |
||||
} |
||||
local wireFrameSheet = { |
||||
['frame-white'] = { |
||||
type = 'outline', |
||||
layer = 'OVERLAY', |
||||
color = 'ffffff', |
||||
alpha = 1, |
||||
}, |
||||
['button-purple'] = { |
||||
type = 'outline', |
||||
layer = 'OVERLAY', |
||||
color = 'aa00ff', |
||||
alpha = .5, |
||||
}, |
||||
['content-yellow'] = { |
||||
type = 'outline', |
||||
layer = 'OVERLAY', |
||||
color = 'fffc00', |
||||
alpha = .5, |
||||
}, |
||||
} |
||||
-- | Locals |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
-- | Methods |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local methods = { |
||||
['OnAcquire'] = function(self) |
||||
self:SetStylesheet(Stylesheet) |
||||
self:Show() |
||||
end, |
||||
['OnRelease'] = function(self) end, |
||||
['ApplySettings'] = function(self) |
||||
self.button:SetHeight(self.settings.buttonHeight) |
||||
-- postion |
||||
self:ClearAllPoints() |
||||
if self.settings.position == 1 then |
||||
self:SetPoint('TOPLEFT') |
||||
self:SetPoint('RIGHT') |
||||
else |
||||
local anchor = self.settings.parentObject.children[self.settings.position-1].frame |
||||
self:SetPoint('TOPLEFT',anchor,'BOTTOMLEFT',0,0) |
||||
self:SetPoint('RIGHT') |
||||
end |
||||
-- set section name |
||||
self.text:SetText(self.settings.sectionName) |
||||
-- set section state |
||||
self[self.settings.expanded and 'Expand' or 'Collapse'](self) |
||||
-- set button visibility |
||||
self:SetButton(self.settings.button) |
||||
end, |
||||
['Collapse'] = function(self) |
||||
if not self.settings.button then self:UpdateHeight() return end |
||||
self.settings.expanded = false |
||||
self:FireEvent("OnStateChange", self.settings.position, 'Collapse') |
||||
self.textures['button-leftCollapseIcon']:SetAlpha(self.textures['button-leftCollapseIcon'].style.alpha[1]) |
||||
self.textures['button-leftExpandIcon']:SetAlpha(0) |
||||
self.content:Hide() |
||||
self:UpdateHeight() |
||||
end, |
||||
['Expand'] = function(self) |
||||
self.settings.expanded = true |
||||
self:FireEvent("OnStateChange", self.settings.position, 'Expand') |
||||
self.textures['button-leftExpandIcon']:SetAlpha(self.textures['button-leftExpandIcon'].style.alpha[1]) |
||||
self.textures['button-leftCollapseIcon']:SetAlpha(0) |
||||
self.content:Show() |
||||
self:UpdateHeight() |
||||
end, |
||||
['SetButton'] = function(self,state) |
||||
self.settings.button = state |
||||
self.button[state and 'Show' or 'Hide'](self.button) |
||||
if not state then |
||||
self:Expand() |
||||
else |
||||
self:UpdateHeight() |
||||
end |
||||
end, |
||||
['UpdateHeight'] = function(self) |
||||
local settings, children = self.settings, self.children |
||||
local contentHeight = 0 |
||||
self.content:SetPoint('TOPLEFT',self.frame,0,settings.button and -settings.buttonHeight or 0) |
||||
|
||||
if settings.expanded then |
||||
contentHeight = settings.contentPadding[3] + settings.contentPadding[4] |
||||
for i=1 , #children do contentHeight = contentHeight + children[i].frame:GetHeight() end |
||||
end |
||||
self.content:SetHeight(contentHeight) |
||||
self:SetHeight((settings.button and settings.buttonHeight or 0) + contentHeight) |
||||
self:FireEvent("OnHeightChange",contentHeight) |
||||
end, |
||||
} |
||||
-- | Constructor |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local function Constructor() |
||||
local self = DiesalGUI:CreateObjectBase(Type) |
||||
local frame = CreateFrame('Frame',nil,UIParent) |
||||
self.frame = frame |
||||
-- ~~ Default Settings ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
self.defaults = { |
||||
button = true, |
||||
contentPadding = {0,0,3,1 }, |
||||
expanded = true, |
||||
buttonHeight = 16, |
||||
} |
||||
-- ~~ Construct ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local button = self:CreateRegion("Button", 'button', frame) |
||||
button:SetPoint('TOPRIGHT') |
||||
button:SetPoint('TOPLEFT') |
||||
button:SetScript("OnClick", function(this,button) |
||||
DiesalGUI:OnMouse(this,button) |
||||
self[self.settings.expanded and "Collapse" or "Expand"](self) |
||||
end) |
||||
|
||||
local text = self:CreateRegion("FontString", 'text', button) |
||||
text:SetPoint("TOPLEFT",15,-2) |
||||
text:SetPoint("BOTTOMRIGHT",-15,0) |
||||
text:SetHeight(0) |
||||
text:SetJustifyH("MIDDLE") |
||||
text:SetJustifyH("LEFT") |
||||
text:SetWordWrap(false) |
||||
|
||||
local content = self:CreateRegion("Frame", 'content', frame) |
||||
content:SetPoint('TOPLEFT',frame,0,0) |
||||
content:SetPoint('TOPRIGHT',frame,0,0) |
||||
content:SetHeight(10) |
||||
-- ~~ Methods ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
for method, func in pairs(methods) do self[method] = func end |
||||
-- ~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
return self |
||||
end |
||||
DiesalGUI:RegisterObjectConstructor(Type,Constructor,Version) |
@ -1,177 +0,0 @@ |
||||
-- $Id: Bar.lua 60 2016-11-04 01:34:23Z diesal2010 $ |
||||
local DiesalGUI = LibStub("DiesalGUI-1.0") |
||||
-- | Libraries |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local DiesalTools = LibStub("DiesalTools-1.0") |
||||
local DiesalStyle = LibStub("DiesalStyle-1.0") |
||||
-- ~~| Diesal Upvalues |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local Colors = DiesalStyle.Colors |
||||
local HSL, ShadeColor, TintColor = DiesalTools.HSL, DiesalTools.ShadeColor, DiesalTools.TintColor |
||||
-- | Lua Upvalues |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local type, tonumber, select = type, tonumber, select |
||||
local pairs, ipairs, next = pairs, ipairs, next |
||||
local min, max = math.min, math.max |
||||
-- | WoW Upvalues |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
-- | Spinner |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local Type = "Bar" |
||||
local Version = 1 |
||||
-- | Stylesheets |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local Stylesheet = { |
||||
['frame-background'] = { |
||||
type = 'texture', |
||||
layer = 'BACKGROUND', |
||||
color = '000000', |
||||
alpha = .60, |
||||
}, |
||||
['frame-outline'] = { |
||||
type = 'outline', |
||||
layer = 'BORDER', |
||||
color = 'FFFFFF', |
||||
alpha = .02, |
||||
position = 1, |
||||
}, |
||||
['frame-inline'] = { |
||||
type = 'outline', |
||||
layer = 'BORDER', |
||||
color = '000000', |
||||
alpha = .60, |
||||
}, |
||||
['bar-background'] = { |
||||
type = 'texture', |
||||
layer = 'BACKGROUND', |
||||
gradient = {'VERTICAL',Colors.UI_A100,ShadeColor(Colors.UI_A100,.1)}, |
||||
position = 0, |
||||
}, |
||||
['bar-inline'] = { |
||||
type = 'outline', |
||||
layer = 'BORDER', |
||||
gradient = {'VERTICAL','FFFFFF','FFFFFF'}, |
||||
alpha = {.07,.02}, |
||||
position = 0, |
||||
}, |
||||
['bar-outline'] = { |
||||
type = 'texture', |
||||
layer = 'ARTWORK', |
||||
color = '000000', |
||||
alpha = .7, |
||||
width = 1, |
||||
position = {nil,1,0,0}, |
||||
}, |
||||
} |
||||
local wireFrame = { |
||||
['frame-white'] = { |
||||
type = 'outline', |
||||
layer = 'OVERLAY', |
||||
color = 'ffffff', |
||||
}, |
||||
['bar-green'] = { |
||||
type = 'outline', |
||||
layer = 'OVERLAY', |
||||
color = '55ff00', |
||||
}, |
||||
} |
||||
-- | Locals |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local function round(num) |
||||
return floor((num + 1/2)/1) * 1 |
||||
end |
||||
-- | Methods |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local methods = { |
||||
['OnAcquire'] = function(self) |
||||
self:SetStylesheet(Stylesheet) |
||||
self:ApplySettings() |
||||
|
||||
-- self:SetStylesheet(wireFrame) |
||||
self:Show() |
||||
end, |
||||
['OnRelease'] = function(self) |
||||
|
||||
end, |
||||
['ApplySettings'] = function(self) |
||||
self:UpdateSize() |
||||
end, |
||||
['UpdateSize'] = function(self) |
||||
self:SetWidth(self.settings.width) |
||||
self:SetHeight(self.settings.height) |
||||
|
||||
self.bar:SetPoint('TOPLEFT',self.settings.padding[1],-self.settings.padding[3]) |
||||
self.bar:SetPoint('BOTTOMLEFT',self.settings.padding[1],self.settings.padding[4]) |
||||
|
||||
self.settings.barWidth = self.settings.width - self.settings.padding[1] - self.settings.padding[2] |
||||
|
||||
self:UpdateBar() |
||||
end, |
||||
['SetColor'] = function(self, color, colorTop, gradientDirection) |
||||
|
||||
end, |
||||
['SetSize'] = function(self, width, height) |
||||
width, height = tonumber(width), tonumber(height) |
||||
if not width then error('Bar:SetSize(width, height) width to be a number.',0) end |
||||
if not height then error('Bar:SetSize(width, height) height to be a number.',0) end |
||||
|
||||
self.settings.width, self.settings.height = width, height |
||||
|
||||
self:UpdateSize() |
||||
end, |
||||
['SetValue'] = function(self, number, min, max) |
||||
number, min, max = tonumber(number), tonumber(min), tonumber(max) |
||||
if not number then error('Bar:SetValue(number) number needs to be a number.',0) end |
||||
|
||||
self.settings.min = min or self.settings.min |
||||
self.settings.max = max or self.settings.max |
||||
self.settings.value = number |
||||
self:UpdateBar() |
||||
end, |
||||
['SetMin'] = function(self, number) |
||||
number = tonumber(number) |
||||
if not number then error('Bar:SetMin(number) needs to be a number.',0) end |
||||
|
||||
self.settings.min = number |
||||
self:UpdateBar() |
||||
end, |
||||
['SetMax'] = function(self, number) |
||||
number = tonumber(number) |
||||
if not number then error('Bar:SetMax(number) needs to be a number.',0) end |
||||
|
||||
self.settings.max = number |
||||
self:UpdateBar() |
||||
end, |
||||
['UpdateBar'] = function(self) |
||||
local min, max, value, barWidth = self.settings.min, self.settings.max, self.settings.value, self.settings.barWidth |
||||
local width = round( (value - min) / (max - min) * barWidth ) |
||||
if width == 0 then |
||||
self.bar:Hide() |
||||
else |
||||
self.bar:Show() |
||||
self.bar:SetWidth(width) |
||||
end |
||||
end, |
||||
['IsVisible'] = function(self) |
||||
return self.frame:IsVisible() |
||||
end, |
||||
} |
||||
-- | Constructor |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local function Constructor() |
||||
local self = DiesalGUI:CreateObjectBase(Type) |
||||
local frame = CreateFrame('Frame',nil,UIParent) |
||||
self.frame = frame |
||||
-- ~~ Default Settings ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
self.defaults = { |
||||
height = 14, -- frame height (not bar) |
||||
width = 96, -- frame width (not bar) |
||||
padding = {1,1,1,1}, -- left, right, top, bottom (bar padding from frame) |
||||
value = 0, |
||||
min = 0, |
||||
max = 100, |
||||
} |
||||
-- ~~ Construct ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
frame:SetScript("OnHide",function(this) |
||||
self:FireEvent("OnHide") |
||||
end) |
||||
|
||||
local bar = self:CreateRegion("Frame", 'bar', frame) |
||||
|
||||
-- ~~ Methods ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
for method, func in pairs(methods) do self[method] = func end |
||||
-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
return self |
||||
end |
||||
DiesalGUI:RegisterObjectConstructor(Type,Constructor,Version) |
@ -1,279 +0,0 @@ |
||||
-- $Id: Branch.lua 60 2016-11-04 01:34:23Z diesal2010 $ |
||||
-- ~~| Libraries |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local DiesalTools = LibStub('DiesalTools-1.0') |
||||
local DiesalStyle = LibStub('DiesalStyle-1.0') |
||||
local DiesalGUI = LibStub('DiesalGUI-1.0') |
||||
-- ~~| Lua Upvalues |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local sub, format, match, lower = string.sub, string.format, string.match, string.lower |
||||
local tsort = table.sort |
||||
local tostring = tostring |
||||
-- ~~| WoW Upvalues |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
|
||||
-- ~~| TableExplorerBranch |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local Type = 'Branch' |
||||
local Version = 1 |
||||
-- ~~| Stylesheets |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local Stylesheet = { |
||||
['button-highlight'] = { |
||||
type = 'texture', |
||||
layer = 'HIGHLIGHT', |
||||
color = 'ffffff', |
||||
alpha = .1, |
||||
}, |
||||
['button-selected'] = { |
||||
type = 'texture', |
||||
layer = 'BORDER', |
||||
color = '0059b3', |
||||
alpha = 0, |
||||
}, |
||||
} |
||||
local wireFrameSheet = { |
||||
['frame-white'] = { |
||||
type = 'outline', |
||||
layer = 'OVERLAY', |
||||
color = 'ffffff', |
||||
}, |
||||
['button-purple'] = { |
||||
type = 'outline', |
||||
layer = 'OVERLAY', |
||||
color = 'aa00ff', |
||||
}, |
||||
['content-yellow'] = { |
||||
type = 'outline', |
||||
layer = 'OVERLAY', |
||||
color = 'fffc00', |
||||
}, |
||||
} |
||||
-- ~~| Methods |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local methods = { |
||||
['OnAcquire'] = function(self) |
||||
self:ApplySettings() |
||||
self:SetStylesheet(Stylesheet) |
||||
self:Show() |
||||
end, |
||||
['OnRelease'] = function(self) |
||||
|
||||
end, |
||||
['ApplySettings'] = function(self) |
||||
if not self.settings.position then return false end |
||||
|
||||
local button = self.button |
||||
local content = self.content |
||||
|
||||
button:SetHeight(self.settings.buttonHeight) |
||||
|
||||
if not self.settings.leaf then |
||||
self[self.settings.expanded and "Expand" or "Collapse"](self) |
||||
else |
||||
self:UpdateLines() |
||||
self:UpdateHeight() |
||||
end |
||||
|
||||
self:ClearAllPoints() |
||||
if self.settings.position == 1 then |
||||
self:SetPoint('TOPLEFT',self.settings.indent,0) |
||||
self:SetPoint('RIGHT') |
||||
else |
||||
local anchor = self.settings.parentObject.children[self.settings.position-1].frame |
||||
self:SetPoint('TOPLEFT',anchor,'BOTTOMLEFT',0,0) |
||||
self:SetPoint('RIGHT') |
||||
end |
||||
end, |
||||
['Collapse'] = function(self) |
||||
if self.settings.leaf then return end |
||||
self:FireEvent("OnStateChange",false) |
||||
self.settings.expanded = false |
||||
self:SetIconCollapsed() |
||||
self:UpdateLines() |
||||
self.content:Hide() |
||||
self:UpdateHeight() |
||||
end, |
||||
['Expand'] = function(self) |
||||
if self.settings.leaf then return end |
||||
self:FireEvent("OnStateChange",true) |
||||
self.settings.expanded = true |
||||
self:SetIconExpanded() |
||||
self:UpdateLines() |
||||
self.content:Show() |
||||
self:UpdateHeight() |
||||
end, |
||||
['UpdateHeight'] = function(self) |
||||
local contentHeight = 0 |
||||
local settings = self.settings |
||||
local children = self.children |
||||
|
||||
if settings.expanded then |
||||
for i=1 , #children do |
||||
contentHeight = contentHeight + children[i].frame:GetHeight() |
||||
end |
||||
end |
||||
self.content:SetHeight(contentHeight) |
||||
self:SetHeight(settings.buttonHeight + contentHeight) |
||||
settings.parentObject:UpdateHeight() |
||||
end, |
||||
['SetLabel'] = function(self,text) |
||||
self.text:SetText(text) |
||||
end, |
||||
['SetIconTexture'] = function(self,texture) |
||||
self.icon:SetTexture(texture) |
||||
end, |
||||
['SetIconCoords'] = function(self,left,right,top,bottom) |
||||
self.icon:SetTexCoord(left,right,top,bottom) |
||||
end, |
||||
['SetIconExpanded'] = function(self) |
||||
self.icon:SetTexCoord(DiesalTools.GetIconCoords(2,8,16,256,128)) |
||||
end, |
||||
['SetIconCollapsed'] = function(self) |
||||
self.icon:SetTexCoord(DiesalTools.GetIconCoords(1,8,16,256,128)) |
||||
end, |
||||
['SetSelected'] = function(self,state) |
||||
self:UpdateStyle('button-selected',{ |
||||
type = 'texture', |
||||
alpha = state and 1 or 0, |
||||
}) |
||||
end, |
||||
['UpdateLines'] = function(self) |
||||
if not self.settings.branches then return end |
||||
local foldColor = '353535' |
||||
local expandColor = '5a5a5a' |
||||
-- Frame Fold Line |
||||
if not self.settings.last and not self.settings.leaf then |
||||
self:UpdateStyle('frame-foldLine',{ |
||||
type = 'texture', |
||||
layer = 'OVERLAY', |
||||
color = foldColor, |
||||
position = {6,nil,-11,2}, |
||||
width = 1, |
||||
}) |
||||
end |
||||
-- expandable Fold Lines |
||||
if not self.settings.leaf then |
||||
self:UpdateStyle('button-square',{ |
||||
type = 'outline', |
||||
layer = 'BORDER', |
||||
color = foldColor, |
||||
position = {10,nil,-2,nil}, |
||||
width = 9, |
||||
height = 9, |
||||
}) |
||||
self:UpdateStyle('button-expandH',{ |
||||
type = 'texture', |
||||
layer = 'BORDER', |
||||
color = expandColor, |
||||
position = {8,nil,-6,nil}, |
||||
width = 5, |
||||
height = 1, |
||||
}) |
||||
self:UpdateStyle('button-expandV',{ |
||||
type = 'texture', |
||||
layer = 'BORDER', |
||||
color = expandColor, |
||||
position = {6,nil,-4,nil}, |
||||
width = 1, |
||||
height = 5, |
||||
alpha = 1, |
||||
}) |
||||
if self.settings.expanded then |
||||
self:UpdateStyle('button-expandV',{ |
||||
type = 'texture', |
||||
alpha = 0, |
||||
}) |
||||
end |
||||
else -- Leaf nodes |
||||
self:UpdateStyle('button-lineV',{ |
||||
type = 'texture', |
||||
layer = 'BORDER', |
||||
color = foldColor, |
||||
position = {6,nil,-6,nil}, |
||||
height = 1, |
||||
width = 6, |
||||
}) |
||||
self:UpdateStyle('button-lineH',{ |
||||
type = 'texture', |
||||
layer = 'BORDER', |
||||
color = foldColor, |
||||
position = {6,nil,0,0}, |
||||
width = 1, |
||||
}) |
||||
if self.settings.last then |
||||
self:UpdateStyle('button-lineH',{ |
||||
type = 'texture', |
||||
position = {6,nil,0,-7}, |
||||
}) |
||||
end |
||||
end |
||||
end, |
||||
} |
||||
-- ~~| TableExplorerBranch Constructor |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local function Constructor() |
||||
local self = DiesalGUI:CreateObjectBase(Type) |
||||
local frame = CreateFrame('Frame',nil,UIParent) |
||||
self.frame = frame |
||||
-- ~~ Default Settings ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
self.defaults = { |
||||
fontObject = DiesalFontNormal, |
||||
branches = true, |
||||
expanded = true, |
||||
buttonHeight = 14, |
||||
indent = 13, |
||||
expIconTex = 'DiesalGUIcons', |
||||
colIconTex = 'DiesalGUIcons', |
||||
expIconCoords = {DiesalTools.GetIconCoords(2,8,16,256,128)}, |
||||
colIconCoords = {DiesalTools.GetIconCoords(1,8,16,256,128)}, |
||||
} |
||||
-- ~~ Events ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
-- OnAcquire, OnRelease, OnHeightSet, OnWidthSet |
||||
-- ~~ Construct ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local button = self:CreateRegion("Button", 'button', frame) |
||||
button:SetPoint('TOPRIGHT') |
||||
button:SetPoint('TOPLEFT') |
||||
button:RegisterForClicks('RightButtonUp','LeftButtonUp') |
||||
button:RegisterForDrag( "LeftButton" ) |
||||
button:SetScript("OnClick", function(this,button) |
||||
DiesalGUI:OnMouse(this,button) |
||||
if button == 'LeftButton' then self[not self.settings.expanded and "Expand" or "Collapse"](self) end |
||||
self:FireEvent("OnClick",button) |
||||
end) |
||||
button:SetScript( "OnDoubleClick", function(this,...) |
||||
self:FireEvent("OnDoubleClick",...) |
||||
end) |
||||
button:SetScript( "OnDragStart", function(this,...) |
||||
self:FireEvent("OnDragStart",...) |
||||
end) |
||||
button:SetScript( "OnDragStop", function(this,...) |
||||
self:FireEvent("OnDragStop",...) |
||||
end) |
||||
button:SetScript("OnEnter",function(this,...) |
||||
self:FireEvent("OnEnter",...) |
||||
end) |
||||
button:SetScript("OnLeave", function(this,...) |
||||
self:FireEvent("OnLeave",...) |
||||
end) |
||||
|
||||
|
||||
local icon = self:CreateRegion("Texture", 'icon', button) |
||||
DiesalStyle:StyleTexture(icon,{ |
||||
position = {0,nil,2,nil}, |
||||
height = 16, |
||||
width = 16, |
||||
image = {'DiesalGUIcons'}, |
||||
}) |
||||
|
||||
local text = self:CreateRegion("FontString", 'text', button) |
||||
text:SetPoint("TOPLEFT",14,-1) |
||||
text:SetPoint("BOTTOMRIGHT",-4,0) |
||||
text:SetHeight(0) |
||||
text:SetJustifyH("TOP") |
||||
text:SetJustifyH("LEFT") |
||||
text:SetWordWrap(false) |
||||
|
||||
local content = self:CreateRegion("Frame", 'content', button) |
||||
content:SetPoint('TOPLEFT',button,'BOTTOMLEFT',0,0) |
||||
content:SetPoint('TOPRIGHT') |
||||
content:SetHeight(0) |
||||
-- ~~ Methods ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
for method, func in pairs(methods) do self[method] = func end |
||||
-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
return self |
||||
end |
||||
DiesalGUI:RegisterObjectConstructor(Type,Constructor,Version) |
@ -1,109 +0,0 @@ |
||||
-- $Id: Button.lua 60 2016-11-04 01:34:23Z diesal2010 $ |
||||
|
||||
local DiesalGUI = LibStub("DiesalGUI-1.0") |
||||
-- ~~| Libraries |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local DiesalTools = LibStub("DiesalTools-1.0") |
||||
local DiesalStyle = LibStub("DiesalStyle-1.0") |
||||
-- ~~| Lua Upvalues |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local type, tonumber, select = type, tonumber, select |
||||
local pairs, ipairs, next = pairs, ipairs, next |
||||
local min, max = math.min, math.max |
||||
-- ~~| WoW Upvalues |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local CreateFrame, UIParent, GetCursorPosition = CreateFrame, UIParent, GetCursorPosition |
||||
local GetScreenWidth, GetScreenHeight = GetScreenWidth, GetScreenHeight |
||||
local GetSpellInfo, GetBonusBarOffset, GetDodgeChance = GetSpellInfo, GetBonusBarOffset, GetDodgeChance |
||||
local GetPrimaryTalentTree, GetCombatRatingBonus = GetPrimaryTalentTree, GetCombatRatingBonus |
||||
-- ~~| Button |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local TYPE = "Button" |
||||
local VERSION = 5 |
||||
-- ~~| Button Stylesheets |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local Stylesheet = { |
||||
['text-color'] = { |
||||
type = 'Font', |
||||
color = 'b8c2cc', |
||||
}, |
||||
} |
||||
local wireFrame = { |
||||
['frame-white'] = { |
||||
type = 'outline', |
||||
layer = 'OVERLAY', |
||||
color = 'ffffff', |
||||
}, |
||||
} |
||||
-- ~~| Button Methods |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local methods = { |
||||
['OnAcquire'] = function(self) |
||||
self:ApplySettings() |
||||
self:SetStylesheet(Stylesheet) |
||||
self:Enable() |
||||
-- self:SetStylesheet(wireFrameSheet) |
||||
self:Show() |
||||
end, |
||||
['OnRelease'] = function(self) |
||||
|
||||
end, |
||||
['ApplySettings'] = function(self) |
||||
local settings = self.settings |
||||
local frame = self.frame |
||||
|
||||
self:SetWidth(settings.width) |
||||
self:SetHeight(settings.height) |
||||
end, |
||||
["SetText"] = function(self, text) |
||||
self.text:SetText(text) |
||||
end, |
||||
["Disable"] = function(self) |
||||
self.settings.disabled = true |
||||
self.frame:Disable() |
||||
end, |
||||
["Enable"] = function(self) |
||||
self.settings.disabled = false |
||||
self.frame:Enable() |
||||
end, |
||||
["RegisterForClicks"] = function(self,...) |
||||
self.frame:RegisterForClicks(...) |
||||
end, |
||||
} |
||||
-- ~~| Button Constructor |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local function Constructor(name) |
||||
local self = DiesalGUI:CreateObjectBase(TYPE) |
||||
local frame = CreateFrame('Button',name,UIParent) |
||||
self.frame = frame |
||||
self.defaults = { |
||||
height = 32, |
||||
width = 32, |
||||
} |
||||
-- ~~ Events ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
-- OnAcquire, OnRelease, OnHeightSet, OnWidthSet |
||||
-- OnClick, OnEnter, OnLeave, OnDisable, OnEnable |
||||
-- ~~ Construct ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local text = self:CreateRegion("FontString", 'text', frame) |
||||
text:SetPoint("TOPLEFT", 4, -1) -- sits below center when rendered off by 1 pixel, fuck you blizzard |
||||
text:SetPoint("BOTTOMRIGHT", -4, 0) |
||||
text:SetJustifyV("MIDDLE") |
||||
text:SetJustifyH("CENTER") |
||||
frame:SetFontString(text) |
||||
frame:SetScript("OnClick", function(this,button,...) |
||||
DiesalGUI:OnMouse(this,button) |
||||
|
||||
self:FireEvent("OnClick",button,...) |
||||
end) |
||||
frame:SetScript("OnEnter", function(this) |
||||
self:FireEvent("OnEnter") |
||||
end) |
||||
frame:SetScript("OnLeave", function(this) |
||||
self:FireEvent("OnLeave") |
||||
end) |
||||
frame:SetScript("OnDisable", function(this) |
||||
self:FireEvent("OnDisable") |
||||
end) |
||||
frame:SetScript("OnEnable", function(this) |
||||
self:FireEvent("OnEnable") |
||||
end) |
||||
-- ~~ Methods ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
for method, func in pairs(methods) do self[method] = func end |
||||
-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
return self |
||||
end |
||||
|
||||
DiesalGUI:RegisterObjectConstructor(TYPE,Constructor,VERSION) |
@ -1,163 +0,0 @@ |
||||
-- $Id: CheckBox.lua 60 2016-11-04 01:34:23Z diesal2010 $ |
||||
|
||||
local DiesalGUI = LibStub("DiesalGUI-1.0") |
||||
-- ~~| Libraries |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local DiesalTools = LibStub("DiesalTools-1.0") |
||||
local DiesalStyle = LibStub("DiesalStyle-1.0") |
||||
-- ~~| Diesal Upvalues |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local Colors = DiesalStyle.Colors |
||||
local HSL, ShadeColor, TintColor = DiesalTools.HSL, DiesalTools.ShadeColor, DiesalTools.TintColor |
||||
-- ~~| Lua Upvalues |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local type, tonumber, select = type, tonumber, select |
||||
local pairs, ipairs, next = pairs, ipairs, next |
||||
local min, max = math.min, math.max |
||||
-- ~~| WoW Upvalues |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local CreateFrame, UIParent, GetCursorPosition = CreateFrame, UIParent, GetCursorPosition |
||||
local GetScreenWidth, GetScreenHeight = GetScreenWidth, GetScreenHeight |
||||
local GetSpellInfo, GetBonusBarOffset, GetDodgeChance = GetSpellInfo, GetBonusBarOffset, GetDodgeChance |
||||
local GetPrimaryTalentTree, GetCombatRatingBonus = GetPrimaryTalentTree, GetCombatRatingBonus |
||||
-- ~~| Button |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local TYPE = "CheckBox" |
||||
local VERSION = 1 |
||||
-- ~~| Button Stylesheets |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local Stylesheet = { |
||||
['frame-background'] = { |
||||
type = 'texture', |
||||
layer = 'BACKGROUND', |
||||
color = '000000', |
||||
alpha = .60, |
||||
position = -2 |
||||
}, |
||||
['frame-inline'] = { |
||||
type = 'outline', |
||||
layer = 'BORDER', |
||||
color = '000000', |
||||
alpha = .6, |
||||
position = -2 |
||||
}, |
||||
['frame-outline'] = { |
||||
type = 'outline', |
||||
layer = 'BORDER', |
||||
color = 'FFFFFF', |
||||
alpha = .02, |
||||
position = -1, |
||||
}, |
||||
} |
||||
local checkBoxStyle = { |
||||
base = { |
||||
type = 'texture', |
||||
layer = 'ARTWORK', |
||||
color = Colors.UI_A400, |
||||
position = -3, |
||||
}, |
||||
disabled = { |
||||
type = 'texture', |
||||
color = HSL(Colors.UI_Hue,Colors.UI_Saturation,.35), |
||||
}, |
||||
enabled = { |
||||
type = 'texture', |
||||
color = Colors.UI_A400, |
||||
}, |
||||
} |
||||
|
||||
local wireFrame = { |
||||
['frame-white'] = { |
||||
type = 'outline', |
||||
layer = 'OVERLAY', |
||||
color = 'ffffff', |
||||
}, |
||||
} |
||||
-- ~~| Button Methods |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local methods = { |
||||
['OnAcquire'] = function(self) |
||||
self:ApplySettings() |
||||
self:SetStylesheet(Stylesheet) |
||||
self:Enable() |
||||
-- self:SetStylesheet(wireFrameSheet) |
||||
self:Show() |
||||
end, |
||||
['OnRelease'] = function(self) end, |
||||
['ApplySettings'] = function(self) |
||||
local settings = self.settings |
||||
local frame = self.frame |
||||
|
||||
self:SetWidth(settings.width) |
||||
self:SetHeight(settings.height) |
||||
end, |
||||
["SetChecked"] = function(self,value) |
||||
self.settings.checked = value |
||||
self.frame:SetChecked(value) |
||||
|
||||
self[self.settings.disabled and "Disable" or "Enable"](self) |
||||
end, |
||||
["GetChecked"] = function(self) |
||||
return self.settings.checked |
||||
end, |
||||
["Disable"] = function(self) |
||||
self.settings.disabled = true |
||||
DiesalStyle:StyleTexture(self.check,checkBoxStyle.disabled) |
||||
self.frame:Disable() |
||||
end, |
||||
["Enable"] = function(self) |
||||
self.settings.disabled = false |
||||
DiesalStyle:StyleTexture(self.check,checkBoxStyle.enabled) |
||||
self.frame:Enable() |
||||
end, |
||||
["RegisterForClicks"] = function(self,...) |
||||
self.frame:RegisterForClicks(...) |
||||
end, |
||||
} |
||||
-- ~~| Button Constructor |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local function Constructor() |
||||
local self = DiesalGUI:CreateObjectBase(TYPE) |
||||
local frame = CreateFrame('CheckButton', nil, UIParent) |
||||
self.frame = frame |
||||
|
||||
-- ~~ Default Settings ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
self.defaults = { |
||||
height = 11, |
||||
width = 11, |
||||
} |
||||
-- ~~ Events ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
-- OnAcquire, OnRelease, OnHeightSet, OnWidthSet |
||||
-- OnValueChanged, OnEnter, OnLeave, OnDisable, OnEnable |
||||
-- ~~ Construct ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
|
||||
local check = self:CreateRegion("Texture", 'check', frame) |
||||
DiesalStyle:StyleTexture(check,checkBoxStyle.base) |
||||
frame:SetCheckedTexture(check) |
||||
frame:SetScript('OnClick', function(this,button,...) |
||||
DiesalGUI:OnMouse(this,button) |
||||
|
||||
if not self.settings.disabled then |
||||
self:SetChecked(not self.settings.checked) |
||||
|
||||
if self.settings.checked then |
||||
-- PlaySound("igMainMenuOptionCheckBoxOn") |
||||
else |
||||
-- PlaySound("igMainMenuOptionCheckBoxOff") |
||||
end |
||||
|
||||
self:FireEvent("OnValueChanged", self.settings.checked) |
||||
end |
||||
end) |
||||
frame:SetScript('OnEnter', function(this) |
||||
self:FireEvent("OnEnter") |
||||
end) |
||||
frame:SetScript('OnLeave', function(this) |
||||
self:FireEvent("OnLeave") |
||||
end) |
||||
frame:SetScript("OnDisable", function(this) |
||||
self:FireEvent("OnDisable") |
||||
end) |
||||
frame:SetScript("OnEnable", function(this) |
||||
self:FireEvent("OnEnable") |
||||
end) |
||||
|
||||
-- ~~ Methods ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
for method, func in pairs(methods) do self[method] = func end |
||||
-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
return self |
||||
end |
||||
|
||||
DiesalGUI:RegisterObjectConstructor(TYPE,Constructor,VERSION) |
@ -1,282 +0,0 @@ |
||||
-- $Id: ComboBox.lua 60 2016-11-04 01:34:23Z diesal2010 $ |
||||
|
||||
local DiesalGUI = LibStub('DiesalGUI-1.0') |
||||
-- ~~| Libraries |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local DiesalTools = LibStub('DiesalTools-1.0') |
||||
local DiesalStyle = LibStub("DiesalStyle-1.0") |
||||
-- ~~| Diesal Upvalues |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local Colors = DiesalStyle.Colors |
||||
local HSL, ShadeColor, TintColor = DiesalTools.HSL, DiesalTools.ShadeColor, DiesalTools.TintColor |
||||
-- ~~| Lua Upvalues |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local sub, format, lower, upper,gsub = string.sub, string.format, string.lower, string.upper, string.gsub |
||||
local tsort = table.sort |
||||
|
||||
-- ~~| WoW Upvalues |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
|
||||
-- ~~| ComboBox |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local Type = 'ComboBox' |
||||
local Version = 1 |
||||
-- ~~| ComboBox Stylesheets |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local Stylesheet = { |
||||
['frame-background'] = { |
||||
type = 'texture', |
||||
layer = 'BACKGROUND', |
||||
color = '000000', |
||||
alpha = .7, |
||||
}, |
||||
['frame-inline'] = { |
||||
type = 'outline', |
||||
layer = 'BORDER', |
||||
color = '000000', |
||||
alpha = .7, |
||||
}, |
||||
['frame-outline'] = { |
||||
type = 'outline', |
||||
layer = 'BORDER', |
||||
color = 'FFFFFF', |
||||
alpha = .02, |
||||
position = 1, |
||||
}, |
||||
['button-background'] = { |
||||
type = 'texture', |
||||
layer = 'BACKGROUND', |
||||
gradient = {'VERTICAL',Colors.UI_500_GR[1],Colors.UI_500_GR[2]}, |
||||
}, |
||||
['button-outline'] = { |
||||
type = 'outline', |
||||
layer = 'ARTWORK', |
||||
color = '000000', |
||||
alpha = .9, |
||||
}, |
||||
['button-inline'] = { |
||||
type = 'outline', |
||||
layer = 'BORDER', |
||||
gradient = {'VERTICAL','FFFFFF','FFFFFF'}, |
||||
alpha = {.07,.02}, |
||||
position = -1, |
||||
}, |
||||
['button-hover'] = { |
||||
type = 'texture', |
||||
layer = 'HIGHLIGHT', |
||||
color = 'ffffff', |
||||
alpha = .05, |
||||
}, |
||||
['button-arrow'] = { |
||||
type = 'texture', |
||||
layer = 'BORDER', |
||||
image = {'DiesalGUIcons',{2,1,16,256,128}}, |
||||
alpha = .5, |
||||
position = {nil,-4,-5,nil}, |
||||
height = 4, |
||||
width = 5, |
||||
}, |
||||
['editBox-hover'] = { |
||||
type = 'texture', |
||||
layer = 'HIGHLIGHT', |
||||
color = 'ffffff', |
||||
alpha = .1, |
||||
position = {-1,0,-1,-1}, |
||||
}, |
||||
['editBox-font'] = { |
||||
type = 'Font', |
||||
color = Colors.UI_TEXT, |
||||
}, |
||||
|
||||
['dropdown-background'] = { |
||||
type = 'texture', |
||||
layer = 'BACKGROUND', |
||||
color = Colors.UI_100, |
||||
alpha = .95, |
||||
}, |
||||
['dropdown-inline'] = { |
||||
type = 'outline', |
||||
layer = 'BORDER', |
||||
color = 'ffffff', |
||||
alpha = .02, |
||||
position = -1, |
||||
}, |
||||
['dropdown-shadow'] = { |
||||
type = 'shadow', |
||||
}, |
||||
} |
||||
-- ~~| ComboBox Locals |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local function compare(a,b) |
||||
return a.value < b.value |
||||
end |
||||
local function sortList(list,orderedKeys) |
||||
if orderedKeys then return orderedKeys end |
||||
local sortedList = {} |
||||
local orderedKeys = {} |
||||
for key,value in pairs(list) do |
||||
sortedList[#sortedList + 1] = {key=key,value=value} |
||||
end |
||||
tsort(sortedList,compare) |
||||
for i,value in ipairs(sortedList) do |
||||
orderedKeys[#orderedKeys + 1] = value.key |
||||
end |
||||
|
||||
return orderedKeys |
||||
end |
||||
-- ~~| ComboBox Methods |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local methods = { |
||||
['OnAcquire'] = function(self) |
||||
self:ApplySettings() |
||||
self:SetStylesheet(Stylesheet) |
||||
-- self:SetStylesheet(wireFrameSheet) |
||||
self:Show() |
||||
end, |
||||
['OnRelease'] = function(self) end, |
||||
['ApplySettings'] = function(self) |
||||
local settings = self.settings |
||||
local content = self.content |
||||
local frame = self.frame |
||||
local children = self.children |
||||
local dropdown = self.dropdown |
||||
|
||||
frame:SetWidth(settings.width) |
||||
frame:SetHeight(settings.height) |
||||
|
||||
self.editBox:SetPoint('RIGHT',-settings.buttonWidth,0) |
||||
self.button:SetWidth(settings.buttonWidth) |
||||
|
||||
-- dropdown |
||||
content:SetPoint("TOPLEFT",settings.dropdownPadding[1],-settings.dropdownPadding[3]) |
||||
content:SetPoint("BOTTOMRIGHT",-settings.dropdownPadding[2],settings.dropdownPadding[4]) |
||||
|
||||
local menuHeight = 0 |
||||
for i=1 , #children do |
||||
menuHeight = menuHeight + children[i].frame:GetHeight() |
||||
end |
||||
dropdown:SetHeight(settings.dropdownPadding[3] + menuHeight + settings.dropdownPadding[4]) |
||||
|
||||
end, |
||||
['SetList'] = function(self,list,orderedKeys) |
||||
self:ReleaseChildren() |
||||
self:SetText('') |
||||
local settings = self.settings |
||||
local orderedKeys = sortList(list,orderedKeys) |
||||
settings.list = list |
||||
|
||||
for position, key in ipairs(orderedKeys) do |
||||
local comboBoxItem = DiesalGUI:Create('ComboBoxItem') |
||||
self:AddChild(comboBoxItem) |
||||
comboBoxItem:SetParentObject(self) |
||||
comboBoxItem:SetSettings({ |
||||
key = key, |
||||
value = list[key], |
||||
position = position, |
||||
},true) |
||||
end |
||||
self:ApplySettings() |
||||
end, |
||||
['SetValue'] = function(self,key) |
||||
for i=1,#self.children do |
||||
self.children[i]:SetSelected(false) |
||||
end |
||||
|
||||
for i=1,#self.children do |
||||
if self.children[i].settings.key == key then |
||||
self.children[i]:SetSelected(true) |
||||
self:SetText(self.children[i].settings.value) |
||||
self.editBox:SetCursorPosition(0) |
||||
break end |
||||
end |
||||
end, |
||||
['SetText'] = function(self,text) |
||||
self.editBox:SetText(text) |
||||
end, |
||||
['SetJustify'] = function(self,j) |
||||
self.editBox:SetJustifyH(j) |
||||
end, |
||||
['SetFocus'] = function(self) |
||||
DiesalGUI:SetFocus(self) |
||||
end, |
||||
['ClearFocus'] = function(self) |
||||
self.dropdown:Hide() |
||||
end, |
||||
['ClearSelection'] = function(self) |
||||
for i=1,#self.children do |
||||
self.children[i]:SetSelected(false) |
||||
end |
||||
self:SetText('') |
||||
end, |
||||
} |
||||
-- ~~| ComboBox Constructor |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local function Constructor() |
||||
local self = DiesalGUI:CreateObjectBase(Type) |
||||
local frame = CreateFrame('Frame',nil,UIParent) |
||||
self.frame = frame |
||||
-- ~~ Default Settings ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
self.defaults = { |
||||
width = 100, |
||||
height = 16, |
||||
buttonWidth = 16, |
||||
|
||||
dropdownPadding = {4,4,4,4}, |
||||
dropdownButtonWidth = 16, |
||||
} |
||||
-- ~~ Registered Events ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
-- OnValueSelected, OnRenameValue |
||||
-- OnEnter, OnLeave |
||||
-- OnButtonClick, OnButtonEnter, OnButtonLeave |
||||
-- ~~ Construct ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local editBox = self:CreateRegion("EditBox", 'editBox', frame) |
||||
editBox:SetPoint("TOPLEFT") |
||||
editBox:SetPoint("BOTTOMLEFT") |
||||
editBox:SetAutoFocus(false) |
||||
editBox:SetJustifyH("RIGHT") |
||||
editBox:SetJustifyV("CENTER") |
||||
editBox:SetTextInsets(1,2,2,0) |
||||
editBox:SetScript('OnEnterPressed', function(this) |
||||
local text = this:GetText() |
||||
DiesalGUI:ClearFocus() |
||||
if text ~= self.settings.oldValue then self:FireEvent("OnRenameValue",self.settings.selectedKey,text) end |
||||
end) |
||||
editBox:HookScript('OnEscapePressed', function(this,...) |
||||
this:SetText(self.settings.oldValue) |
||||
end) |
||||
editBox:HookScript('OnEditFocusGained', function(this) |
||||
self.settings.oldValue = this:GetText() |
||||
end) |
||||
editBox:HookScript('OnEditFocusLost', function(this,...) |
||||
self:SetText(self.settings.oldValue) |
||||
end) |
||||
editBox:SetScript("OnEnter",function(this) |
||||
self:FireEvent("OnEnter") |
||||
end) |
||||
editBox:SetScript("OnLeave", function(this) |
||||
self:FireEvent("OnLeave") |
||||
end) |
||||
|
||||
local button = self:CreateRegion("Button", 'button', frame) |
||||
button:SetPoint('TOPRIGHT') |
||||
button:SetPoint('BOTTOMRIGHT') |
||||
button:SetScript("OnEnter",function(this) |
||||
self:FireEvent("OnButtonEnter") |
||||
end) |
||||
button:SetScript("OnLeave", function(this) |
||||
self:FireEvent("OnButtonLeave") |
||||
end) |
||||
button:SetScript("OnClick", function(this, button) |
||||
self:FireEvent("OnButtonClick") |
||||
|
||||
local dropdown = self.dropdown |
||||
local visible = dropdown:IsVisible() |
||||
DiesalGUI:OnMouse(this,button) |
||||
dropdown[visible and "Hide" or 'Show'](dropdown) |
||||
end) |
||||
|
||||
local dropdown = self:CreateRegion("Frame", 'dropdown', frame) |
||||
dropdown:SetFrameStrata("FULLSCREEN_DIALOG") |
||||
dropdown:SetPoint('TOPRIGHT',frame,'BOTTOMRIGHT',0,-2) |
||||
dropdown:SetPoint('TOPLEFT',frame,'BOTTOMLEFT',0,-2) |
||||
dropdown:SetScript("OnShow", function(this) self:SetFocus() end) |
||||
dropdown:Hide() |
||||
|
||||
self:CreateRegion("Frame", 'content', dropdown) |
||||
-- ~~ Methods ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
for method, func in pairs(methods) do self[method] = func end |
||||
-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
return self |
||||
end |
||||
DiesalGUI:RegisterObjectConstructor(Type,Constructor,Version) |
@ -1,122 +0,0 @@ |
||||
-- $Id: ComboBoxItem.lua 60 2016-11-04 01:34:23Z diesal2010 $ |
||||
|
||||
local DiesalGUI = LibStub('DiesalGUI-1.0') |
||||
-- ~~| Libraries |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local DiesalTools = LibStub('DiesalTools-1.0') |
||||
local DiesalStyle = LibStub("DiesalStyle-1.0") |
||||
-- ~~| Diesal Upvalues |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local Colors = DiesalStyle.Colors |
||||
local HSL, ShadeColor, TintColor = DiesalTools.HSL, DiesalTools.ShadeColor, DiesalTools.TintColor |
||||
-- ~~| Lua Upvalues |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
|
||||
-- ~~| WoW Upvalues |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
|
||||
-- ~~| ComboBoxItem |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local Type = 'ComboBoxItem' |
||||
local Version = 2 |
||||
-- ~~| ComboBoxItem Stylesheets |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local Stylesheet = { |
||||
['frame-hover'] = { |
||||
type = 'texture', |
||||
layer = 'HIGHLIGHT', |
||||
color = 'b3d9ff', |
||||
alpha = .05, |
||||
}, |
||||
} |
||||
-- ~~| ComboBoxItem Locals |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
|
||||
-- ~~| ComboBoxItem Methods |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local methods = { |
||||
['OnAcquire'] = function(self) |
||||
self:ApplySettings() |
||||
self:SetStylesheet(Stylesheet) |
||||
-- self:SetStylesheet(wireFrameSheet) |
||||
self:Show() |
||||
end, |
||||
['OnRelease'] = function(self) |
||||
self.check:Hide() |
||||
end, |
||||
['ApplySettings'] = function(self) |
||||
if not self.settings.key then return end |
||||
|
||||
local settings = self.settings |
||||
local comboBoxSettings = settings.parentObject.settings |
||||
local text = self.text |
||||
|
||||
if settings.position == 1 then |
||||
self:SetPoint('TOPLEFT') |
||||
self:SetPoint('RIGHT') |
||||
else |
||||
self:SetPoint('TOPLEFT',settings.parentObject.children[settings.position-1].frame,'BOTTOMLEFT',0,0) |
||||
self:SetPoint('RIGHT') |
||||
end |
||||
|
||||
self:SetHeight(comboBoxSettings.dropdownButtonWidth) |
||||
|
||||
self:SetText(settings.value) |
||||
end, |
||||
['SetText'] = function(self,text) |
||||
self.text:SetText(text) |
||||
end, |
||||
['OnClick'] = function(self) |
||||
local settings = self.settings |
||||
local comboBox = settings.parentObject |
||||
local comboBoxSettings = comboBox.settings |
||||
local comboBoxItems = comboBox.children |
||||
|
||||
for i=1,#comboBoxItems do |
||||
comboBoxItems[i]:SetSelected(false) |
||||
end |
||||
|
||||
self:SetSelected(true) |
||||
|
||||
comboBox.dropdown:Hide() |
||||
comboBox:SetText(settings.value) |
||||
comboBox:FireEvent("OnValueSelected",settings.key,settings.value) |
||||
end, |
||||
['SetSelected'] = function(self,selected) |
||||
if selected then |
||||
self.settings.parentObject.settings.selectedKey = self.settings.key |
||||
self.settings.selected = true |
||||
self.check:Show() |
||||
else |
||||
self.settings.selected = false |
||||
self.check:Hide() |
||||
end |
||||
end, |
||||
} |
||||
-- ~~| ComboBoxItem Constructor |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local function Constructor() |
||||
local self = DiesalGUI:CreateObjectBase(Type) |
||||
local frame = CreateFrame('Button',nil,UIParent) |
||||
self.frame = frame |
||||
-- ~~ Default Settings ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
self.defaults = { } |
||||
-- ~~ Registered Events ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
|
||||
-- ~~ Construct ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
frame:SetScript("OnClick", function(this,button) self:OnClick() end) |
||||
frame:SetScript('OnEnter', function(this) end) |
||||
frame:SetScript('OnLeave', function(this) end) |
||||
|
||||
local text = self:CreateRegion("FontString", 'text', frame) |
||||
text:SetPoint("TOPLEFT",12,-2) |
||||
text:SetPoint("BOTTOMRIGHT",0,0) |
||||
text:SetJustifyH("TOP") |
||||
text:SetJustifyH("LEFT") |
||||
text:SetWordWrap(false) |
||||
|
||||
local check = self:CreateRegion("Texture", 'check', frame) |
||||
DiesalStyle:StyleTexture(check,{ |
||||
position = {2,nil,0,nil}, |
||||
height = 16, |
||||
width = 16, |
||||
image = {'DiesalGUIcons', {10,5,16,256,128},'FFFF00'}, |
||||
}) |
||||
check:Hide() |
||||
-- ~~ Methods ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
for method, func in pairs(methods) do self[method] = func end |
||||
-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
return self |
||||
end |
||||
DiesalGUI:RegisterObjectConstructor(Type,Constructor,Version) |
@ -1,296 +0,0 @@ |
||||
-- $Id: DropDown.lua 60 2016-11-04 01:34:23Z diesal2010 $ |
||||
|
||||
local DiesalGUI = LibStub('DiesalGUI-1.0') |
||||
-- ~~| Libraries |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local DiesalTools = LibStub('DiesalTools-1.0') |
||||
local DiesalStyle = LibStub("DiesalStyle-1.0") |
||||
-- ~~| Diesal Upvalues |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local Colors = DiesalStyle.Colors |
||||
local HSL, ShadeColor, TintColor = DiesalTools.HSL, DiesalTools.ShadeColor, DiesalTools.TintColor |
||||
-- ~~| Lua Upvalues |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local tsort = table.sort |
||||
local sub, format, lower, upper,gsub = string.sub, string.format, string.lower, string.upper, string.gsub |
||||
|
||||
-- ~~| WoW Upvalues |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
|
||||
-- ~~| Dropdown |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local Type = 'Dropdown' |
||||
local Version = 2 |
||||
-- ~~| Dropdown Stylesheets |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local Stylesheet = { |
||||
['frame-background'] = { |
||||
type = 'texture', |
||||
layer = 'BACKGROUND', |
||||
gradient = {'VERTICAL',Colors.UI_400_GR[1],Colors.UI_400_GR[2]}, |
||||
}, |
||||
['frame-outline'] = { |
||||
type = 'outline', |
||||
layer = 'BORDER', |
||||
color = '000000', |
||||
}, |
||||
['frame-inline'] = { |
||||
type = 'outline', |
||||
layer = 'BORDER', |
||||
gradient = {'VERTICAL','FFFFFF','FFFFFF'}, |
||||
alpha = {.07,.02}, |
||||
position = -1, |
||||
}, |
||||
['frame-hover'] = { |
||||
type = 'texture', |
||||
layer = 'HIGHLIGHT', |
||||
color = 'ffffff', |
||||
alpha = .05, |
||||
}, |
||||
['frame-arrow'] = { |
||||
type = 'texture', |
||||
layer = 'BORDER', |
||||
image = {'DiesalGUIcons',{2,1,16,256,128}}, |
||||
alpha = .5, |
||||
position = {nil,-5,-7,nil}, |
||||
height = 3, |
||||
width = 5, |
||||
}, |
||||
['text-color'] = { |
||||
type = 'Font', |
||||
color = Colors.UI_TEXT, |
||||
}, |
||||
['dropdown-background'] = { |
||||
type = 'texture', |
||||
layer = 'BACKGROUND', |
||||
color = Colors.UI_100, |
||||
alpha = .95, |
||||
}, |
||||
['dropdown-inline'] = { |
||||
type = 'outline', |
||||
layer = 'BORDER', |
||||
color = 'ffffff', |
||||
alpha = .02, |
||||
position = -1, |
||||
}, |
||||
['dropdown-shadow'] = { |
||||
type = 'shadow', |
||||
}, |
||||
} |
||||
-- ~~| Dropdown Locals |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local function compare(a,b) |
||||
return a.value < b.value |
||||
end |
||||
local function sortList(list,orderedKeys) |
||||
if orderedKeys then return orderedKeys end |
||||
local sortedList = {} |
||||
local orderedKeys = {} |
||||
for key,value in pairs(list) do |
||||
sortedList[#sortedList + 1] = {key=key,value=value} |
||||
end |
||||
tsort(sortedList,compare) |
||||
for i,value in ipairs(sortedList) do |
||||
orderedKeys[#orderedKeys + 1] = value.key |
||||
end |
||||
|
||||
return orderedKeys |
||||
end |
||||
-- ~~| Dropdown Methods |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local methods = { |
||||
['OnAcquire'] = function(self) |
||||
self:ApplySettings() |
||||
self:SetStylesheet(Stylesheet) |
||||
-- self:SetStylesheet(wireFrameSheet) |
||||
self:Show() |
||||
end, |
||||
['OnRelease'] = function(self) |
||||
|
||||
end, |
||||
['ApplySettings'] = function(self) |
||||
local settings = self.settings |
||||
local content = self.content |
||||
local frame = self.frame |
||||
local children = self.children |
||||
local dropdown = self.dropdown |
||||
|
||||
frame:SetWidth(settings.width) |
||||
frame:SetHeight(settings.height) |
||||
|
||||
content:SetPoint("TOPLEFT",settings.dropdownPadLeft,-settings.dropdownPadTop) |
||||
content:SetPoint("BOTTOMRIGHT",-settings.dropdownPadRight,settings.dropdownPadBottom) |
||||
|
||||
local menuHeight = 0 |
||||
for i=1 , #children do |
||||
menuHeight = menuHeight + children[i].frame:GetHeight() |
||||
end |
||||
dropdown:SetHeight(settings.dropdownPadTop + menuHeight + settings.dropdownPadBottom) |
||||
|
||||
end, |
||||
['SetList'] = function(self,list,orderedKeys) |
||||
self:ReleaseChildren() |
||||
self:SetText('') |
||||
local settings = self.settings |
||||
local orderedKeys = sortList(list,orderedKeys) |
||||
settings.list = list |
||||
|
||||
for position, key in ipairs(orderedKeys) do |
||||
local dropdownItem = DiesalGUI:Create('DropdownItem') |
||||
self:AddChild(dropdownItem) |
||||
dropdownItem:SetParentObject(self) |
||||
dropdownItem:SetSettings({ |
||||
key = key, |
||||
value = list[key], |
||||
position = position, |
||||
},true) |
||||
end |
||||
self:ApplySettings() |
||||
end, |
||||
['SetValue'] = function(self,key) |
||||
local selectionTable = {} |
||||
local selectedKey, dropdownText, selectedValue |
||||
|
||||
if key ~='CLEAR' then |
||||
if self.settings.multiSelect then |
||||
for i=1,#self.children do |
||||
if self.children[i].settings.key == key then selectedKey = key; self.children[i]:SetSelected(true) end |
||||
if self.children[i].settings.selected then |
||||
if dropdownText then |
||||
dropdownText = format('%s, %s',dropdownText,self.children[i].settings.value) |
||||
else |
||||
dropdownText = self.children[i].settings.value |
||||
end |
||||
selectionTable[#selectionTable+1] = self.children[i].settings.key |
||||
end |
||||
end |
||||
else |
||||
for i=1,#self.children do |
||||
self.children[i]:SetSelected(false) |
||||
if self.children[i].settings.key == key then |
||||
self.children[i]:SetSelected(true) |
||||
dropdownText = self.children[i].settings.value |
||||
selectionTable = {key} |
||||
selectedKey = key |
||||
selectedValue = value |
||||
end |
||||
end |
||||
end |
||||
else |
||||
self:ClearSelection() |
||||
end |
||||
if selectedKey then |
||||
self:SetText(dropdownText) |
||||
self:FireEvent("OnValueChanged",selectedKey,selectedValue,selectionTable) |
||||
else |
||||
self:SetText('') |
||||
self:FireEvent("OnValueChanged",selectedKey,selectedValue,selectionTable) |
||||
end |
||||
end, |
||||
['ClearSelection'] = function(self) |
||||
for i=1,#self.children do |
||||
self.children[i]:SetSelected(false) |
||||
end |
||||
self:SetText('') |
||||
end, |
||||
['SetValueTable'] = function(self,keyTable) |
||||
if not self.settings.multiSelect or type(keyTable) ~='table' then return end |
||||
local dropdownItems = self.children |
||||
local selectionTable = {} |
||||
local selectedKey |
||||
local dropdownText |
||||
|
||||
for i=1,#dropdownItems do |
||||
local dropdownItem = dropdownItems[i] |
||||
dropdownItem:SetSelected(false) |
||||
for _,key in ipairs(keyTable) do |
||||
|
||||
if dropdownItem.settings.key == key then |
||||
dropdownItem:SetSelected(true) |
||||
if dropdownText then |
||||
dropdownText = format('%s, %s',dropdownText,dropdownItem.settings.value) |
||||
else |
||||
dropdownText = dropdownItem.settings.value |
||||
end |
||||
selectionTable[#selectionTable+1] = dropdownItem.settings.key |
||||
end |
||||
end |
||||
end |
||||
self:FireEvent("OnValueChanged",nil,nil,selectionTable) |
||||
self:SetText(dropdownText) |
||||
end, |
||||
['SetMultiSelect'] = function(self,state) |
||||
self.settings.multiSelect = state |
||||
end, |
||||
['SetText'] = function(self,text) |
||||
self.text:SetText(text) |
||||
end, |
||||
['SetFocus'] = function(self) |
||||
DiesalGUI:SetFocus(self) |
||||
end, |
||||
['ClearFocus'] = function(self) |
||||
self.dropdown:Hide() |
||||
end, |
||||
['EnableMouse'] = function(self,state) |
||||
self.frame:EnableMouse(state) |
||||
end, |
||||
["RegisterForClicks"] = function(self,...) |
||||
self.frame:RegisterForClicks(...) |
||||
end, |
||||
['SetJustifyV'] = function(self,justify) |
||||
self.text:SetJustifyV(justify) |
||||
end, |
||||
['SetJustifyH'] = function(self,justify) |
||||
self.text:SetJustifyH(justify) |
||||
end, |
||||
} |
||||
-- ~~| Dropdown Constructor |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local function Constructor() |
||||
local self = DiesalGUI:CreateObjectBase(Type) |
||||
local frame = CreateFrame('Button',nil,UIParent) |
||||
self.frame = frame |
||||
self.defaults = { |
||||
dropdownPadLeft = 4, |
||||
dropdownPadRight = 4, |
||||
dropdownPadTop = 4, |
||||
dropdownPadBottom = 4, |
||||
itemHeight = 16, |
||||
width = 100, |
||||
height = 16, |
||||
} |
||||
-- ~~ Registered Events ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
-- OnValueChanged(event,selectedKey,selectedValue,selectionTable) |
||||
-- OnValueSelected(event,selectedKey,selectedValue,selectionTable) |
||||
-- OnEnter, OnLeave |
||||
-- ~~ Construct ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
frame:SetScript("OnMouseUp", function(this, button) |
||||
if button == 'LeftButton' then |
||||
local dropdown = self.dropdown |
||||
local visible = dropdown:IsVisible() |
||||
DiesalGUI:OnMouse(this,button) |
||||
dropdown[visible and "Hide" or 'Show'](dropdown) |
||||
end |
||||
end) |
||||
frame:SetScript("OnClick", function(this, ...) |
||||
self:FireEvent("OnClick", ...) |
||||
end) |
||||
frame:SetScript("OnEnter",function(this,...) |
||||
self:FireEvent("OnEnter",...) |
||||
end) |
||||
frame:SetScript("OnLeave", function(this,...) |
||||
self:FireEvent("OnLeave",...) |
||||
end) |
||||
|
||||
local text = self:CreateRegion("FontString", 'text', frame) |
||||
text:ClearAllPoints() |
||||
text:SetPoint("TOPLEFT", 4, -1) |
||||
text:SetPoint("BOTTOMRIGHT", -14, 1) |
||||
text:SetJustifyV("MIDDLE") |
||||
text:SetJustifyH("LEFT") |
||||
|
||||
local dropdown = self:CreateRegion("Frame", 'dropdown', frame) |
||||
dropdown:SetFrameStrata("FULLSCREEN_DIALOG") |
||||
dropdown:SetPoint('TOPRIGHT',frame,'BOTTOMRIGHT',0,-2) |
||||
dropdown:SetPoint('TOPLEFT',frame,'BOTTOMLEFT',0,-2) |
||||
dropdown:SetScript("OnShow", function(this) self:SetFocus() end) |
||||
dropdown:Hide() |
||||
|
||||
self:CreateRegion("Frame", 'content', dropdown) |
||||
-- ~~ Methods ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
for method, func in pairs(methods) do self[method] = func end |
||||
-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
return self |
||||
end |
||||
DiesalGUI:RegisterObjectConstructor(Type,Constructor,Version) |
@ -1,137 +0,0 @@ |
||||
-- $Id: DropDownItem.lua 60 2016-11-04 01:34:23Z diesal2010 $ |
||||
|
||||
local DiesalGUI = LibStub('DiesalGUI-1.0') |
||||
-- ~~| Libraries |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local DiesalTools = LibStub('DiesalTools-1.0') |
||||
local DiesalStyle = LibStub("DiesalStyle-1.0") |
||||
|
||||
-- ~~| Lua Upvalues |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local sub, format, lower, upper,gsub = string.sub, string.format, string.lower, string.upper, string.gsub |
||||
-- ~~| WoW Upvalues |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
|
||||
-- ~~| DropdownItem |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local Type = 'DropdownItem' |
||||
local Version = 2 |
||||
-- ~~| DropdownItem Stylesheets |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local Stylesheet = { |
||||
['frame-hover'] = { |
||||
type = 'texture', |
||||
layer = 'HIGHLIGHT', |
||||
color = 'b3d9ff', |
||||
alpha = .1, |
||||
}, |
||||
} |
||||
-- ~~| DropdownItem Methods |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local methods = { |
||||
['OnAcquire'] = function(self) |
||||
self:ApplySettings() |
||||
self:SetStylesheet(Stylesheet) |
||||
-- self:SetStylesheet(wireFrameSheet) |
||||
self:Show() |
||||
end, |
||||
['OnRelease'] = function(self) |
||||
self.check:Hide() |
||||
end, |
||||
['ApplySettings'] = function(self) |
||||
if not self.settings.key then return end |
||||
|
||||
local settings = self.settings |
||||
local dropdownSettings = settings.parentObject.settings |
||||
local text = self.text |
||||
|
||||
if settings.position == 1 then |
||||
self:SetPoint('TOPLEFT') |
||||
self:SetPoint('RIGHT') |
||||
else |
||||
self:SetPoint('TOPLEFT',settings.parentObject.children[settings.position-1].frame,'BOTTOMLEFT',0,0) |
||||
self:SetPoint('RIGHT') |
||||
end |
||||
|
||||
self:SetHeight(dropdownSettings.itemHeight) |
||||
|
||||
self:SetText(settings.value) |
||||
end, |
||||
['SetText'] = function(self,text) |
||||
self.text:SetText(text) |
||||
end, |
||||
['OnClick'] = function(self) |
||||
local settings = self.settings |
||||
local dropdown = settings.parentObject |
||||
local dropdownSettings= dropdown.settings |
||||
local dropdownItems = dropdown.children |
||||
|
||||
local selectionTable = {} |
||||
local dropdownText |
||||
if settings.key ~= 'CLEAR' then |
||||
if dropdownSettings.multiSelect then |
||||
self:SetSelected(not settings.selected) |
||||
for i=1,#dropdownItems do |
||||
if dropdownItems[i].settings.selected then |
||||
if dropdownText then |
||||
dropdownText = format('%s, %s',dropdownText,dropdownItems[i].settings.value) |
||||
else |
||||
dropdownText = dropdownItems[i].settings.value |
||||
end |
||||
selectionTable[#selectionTable+1] = dropdownItems[i].settings.key |
||||
end |
||||
end |
||||
else |
||||
for i=1,#dropdownItems do |
||||
dropdownItems[i]:SetSelected(false) |
||||
end |
||||
self:SetSelected(true) |
||||
dropdownText = settings.value |
||||
selectionTable = {settings.key} |
||||
dropdown.dropdown:Hide() |
||||
end |
||||
else |
||||
dropdown.dropdown:Hide() |
||||
dropdown:ClearSelection() |
||||
end |
||||
|
||||
dropdown:SetText(dropdownText) |
||||
dropdown:FireEvent("OnValueChanged",settings.key,settings.value,selectionTable) |
||||
dropdown:FireEvent("OnValueSelected",settings.key,settings.value,selectionTable) |
||||
end, |
||||
['SetSelected'] = function(self,selected) |
||||
if selected then |
||||
self.settings.selected = true |
||||
self.check:Show() |
||||
else |
||||
self.settings.selected = false |
||||
self.check:Hide() |
||||
end |
||||
end, |
||||
} |
||||
-- ~~| DropdownItem Constructor |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local function Constructor() |
||||
local self = DiesalGUI:CreateObjectBase(Type) |
||||
local frame = CreateFrame('Button',nil,UIParent) |
||||
self.frame = frame |
||||
self.defaults = { } |
||||
-- ~~ Construct ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
frame:SetScript("OnClick", function(this,button) self:OnClick() end) |
||||
frame:SetScript('OnEnter', function(this) end) |
||||
frame:SetScript('OnLeave', function(this) end) |
||||
|
||||
local text = self:CreateRegion("FontString", 'text', frame) |
||||
text:SetPoint("TOPLEFT",12,-2) |
||||
text:SetPoint("BOTTOMRIGHT",0,0) |
||||
text:SetJustifyH("TOP") |
||||
text:SetJustifyH("LEFT") |
||||
text:SetWordWrap(false) |
||||
|
||||
local check = self:CreateRegion("Texture", 'check', frame) |
||||
DiesalStyle:StyleTexture(check,{ |
||||
position = {2,nil,0,nil}, |
||||
height = 16, |
||||
width = 16, |
||||
image = {'DiesalGUIcons', {10,5,16,256,128},'FFFF00'}, |
||||
}) |
||||
check:Hide() |
||||
-- ~~ Methods ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
for method, func in pairs(methods) do self[method] = func end |
||||
-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
return self |
||||
end |
||||
DiesalGUI:RegisterObjectConstructor(Type,Constructor,Version) |
@ -1,124 +0,0 @@ |
||||
-- $Id: Input.lua 60 2016-11-04 01:34:23Z diesal2010 $ |
||||
|
||||
local DiesalGUI = LibStub("DiesalGUI-1.0") |
||||
-- ~~| Libraries |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local DiesalTools = LibStub("DiesalTools-1.0") |
||||
local DiesalStyle = LibStub("DiesalStyle-1.0") |
||||
-- ~~| Diesal Upvalues |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local Colors = DiesalStyle.Colors |
||||
local HSL, ShadeColor, TintColor = DiesalTools.HSL, DiesalTools.ShadeColor, DiesalTools.TintColor |
||||
-- ~~| Lua Upvalues |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
-- | Input |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local Type = "Input" |
||||
local Version = 1 |
||||
-- | Stylesheets |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local Stylesheet = { |
||||
['frame-background'] = { |
||||
type = 'texture', |
||||
layer = 'BACKGROUND', |
||||
color = '000000', |
||||
alpha = .6, |
||||
}, |
||||
['editBox-outline'] = { |
||||
type = 'outline', |
||||
layer = 'BORDER', |
||||
color = 'FFFFFF', |
||||
alpha = .02, |
||||
position = 1, |
||||
}, |
||||
['editBox-inline'] = { |
||||
type = 'outline', |
||||
layer = 'BORDER', |
||||
color = '000000', |
||||
alpha = .7, |
||||
}, |
||||
['editBox-hover'] = { |
||||
type = 'texture', |
||||
layer = 'HIGHLIGHT', |
||||
color = 'ffffff', |
||||
alpha = .05, |
||||
position = -1, |
||||
}, |
||||
['editBox-font'] = { |
||||
type = 'Font', |
||||
color = Colors.UI_TEXT, |
||||
}, |
||||
} |
||||
|
||||
-- ~~| Spinner Methods |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local methods = { |
||||
['OnAcquire'] = function(self) |
||||
self:SetStylesheet(Stylesheet) |
||||
self:ApplySettings() |
||||
self:Show() |
||||
end, |
||||
['OnRelease'] = function(self) |
||||
|
||||
end, |
||||
['ApplySettings'] = function(self) |
||||
self:SetWidth( self.settings.width) |
||||
self:SetHeight( self.settings.height) |
||||
end, |
||||
['GetText'] = function(self) |
||||
return self.editBox:GetText() |
||||
end, |
||||
['SetText'] = function(self,txt) |
||||
self.editBox:SetText(txt) |
||||
end, |
||||
['SetTextColor'] = function(self,color,alpha) |
||||
alpha = alpha or 1 |
||||
color = {DiesalTools.GetColor(color)} |
||||
self.editBox:SetTextColor(color[1],color[2],color[3],alpha) |
||||
end, |
||||
} |
||||
-- | Constructor |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local function Constructor() |
||||
local self = DiesalGUI:CreateObjectBase(Type) |
||||
local frame = CreateFrame('Frame',nil,UIParent) |
||||
self.frame = frame |
||||
self.defaults = { |
||||
height = 16, |
||||
width = 50, |
||||
mouse = true, |
||||
} |
||||
-- ~~ Events ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
-- OnAcquire, OnRelease, OnHeightSet, OnWidthSet |
||||
-- OnEnter, OnLeave, OnEnterPressed, OnValueChanged |
||||
-- ~~ Construct ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
frame:SetScript("OnHide",function(this) |
||||
self:FireEvent("OnHide") |
||||
end) |
||||
|
||||
local editBox = self:CreateRegion("EditBox", 'editBox', frame) |
||||
editBox:SetAllPoints() |
||||
editBox:SetAutoFocus(false) |
||||
editBox:SetJustifyH("LEFT") |
||||
editBox:SetJustifyV("CENTER") |
||||
editBox:SetTextInsets(3,0,2,0) |
||||
editBox:SetScript('OnEnterPressed', function(this,...) |
||||
self:FireEvent("OnEnterPressed",...) |
||||
DiesalGUI:ClearFocus() |
||||
end) |
||||
editBox:HookScript('OnEscapePressed', function(this,...) |
||||
self:FireEvent("OnEscapePressed",...) |
||||
end) |
||||
editBox:HookScript('OnEditFocusLost', function(this,...) |
||||
self:FireEvent("OnEditFocusLost",...) |
||||
end) |
||||
editBox:HookScript('OnEditFocusGained', function(this,...) |
||||
self:FireEvent("OnEditFocusGained",...) |
||||
end) |
||||
editBox:SetScript("OnEnter",function(this,...) |
||||
self:FireEvent("OnEnter",...) |
||||
end) |
||||
editBox:SetScript("OnLeave", function(this,...) |
||||
self:FireEvent("OnLeave",...) |
||||
end) |
||||
|
||||
-- ~~ Methods ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
for method, func in pairs(methods) do self[method] = func end |
||||
-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
return self |
||||
end |
||||
|
||||
DiesalGUI:RegisterObjectConstructor(Type,Constructor,Version) |
@ -1,163 +0,0 @@ |
||||
-- $Id: QuickDoc.lua 60 2016-11-04 01:34:23Z diesal2010 $ |
||||
|
||||
-- | Libraries |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local DiesalTools = LibStub("DiesalTools-1.0") |
||||
local DiesalStyle = LibStub("DiesalStyle-1.0") |
||||
local DiesalGUI = LibStub("DiesalGUI-1.0") |
||||
local DiesalMenu = LibStub('DiesalMenu-1.0') |
||||
-- | Lua Upvalues |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local print, type, select, tostring, tonumber = print, type, select, tostring, tonumber |
||||
local sub, format, match, lower = string.sub, string.format, string.match, string.lower |
||||
local table_sort = table.sort |
||||
local abs = math.abs |
||||
-- | WoW Upvalues |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
|
||||
|
||||
-- | TableExplorer |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local QuickDoc |
||||
local Type = "QuickDoc" |
||||
local Version = 1 |
||||
-- | Stylesheets |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local windowStylesheet = { |
||||
['content-background'] = { |
||||
type = 'texture', |
||||
color = '131517', |
||||
}, |
||||
} |
||||
|
||||
-- | Local |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
|
||||
local doc = { |
||||
{ type = 'section', |
||||
margin = {0,0,0,0}, |
||||
padding = {0,0,0,0}, |
||||
style = {}, |
||||
{ type = 'single-line', text = 'Editor', |
||||
font = nil. |
||||
fontSize = 14, |
||||
text = 'Editor', |
||||
}, |
||||
{ type = 'columns', text = 'Editor', |
||||
font = nil. |
||||
fontSize = 14, |
||||
text = 'Editor', |
||||
}, |
||||
} |
||||
} |
||||
|
||||
-- | Methods |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local methods = { |
||||
['OnAcquire'] = function(self) |
||||
self.settings = DiesalTools.TableCopy( self.defaults ) |
||||
self:ApplySettings() |
||||
self:Show() |
||||
end, |
||||
['OnRelease'] = function(self) |
||||
self.tree:ReleaseChildren() |
||||
end, |
||||
['ApplySettings'] = function(self) |
||||
|
||||
end, |
||||
['BuildDoc'] = function(self,doc) |
||||
if #doc == 0 then error('BuildDoc(doc) doc requires atleast one section') |
||||
local settings = self.settings |
||||
-- reset |
||||
self:ReleaseChildren() |
||||
-- setup |
||||
settings.doc = doc |
||||
|
||||
if #doc == 0 then |
||||
tree:UpdateHeight() |
||||
self.statusText:SetText('|cffff0000Table is empty.') |
||||
return end |
||||
-- sort tree table |
||||
local sortedTable = sortTable(settings.exploredTable) |
||||
-- build Tree Branches |
||||
for position, key in ipairs(sortedTable) do |
||||
if self.settings.endtime <= time() then self:Timeout() return end |
||||
self:BuildBranch(self.tree,key[2],settings.exploredTable[key[2]],position,1,position == #sortedTable) |
||||
end |
||||
end, |
||||
['BuildSection'] = function(self,parent,key,value,position,depth,last) |
||||
local tree = self.tree |
||||
local leaf = type(value) ~= 'table' or next(value) == nil or depth >= self.settings.maxDepth |
||||
local branch = DiesalGUI:Create('Branch') |
||||
-- | Reset Branch |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
branch:ReleaseChildren() |
||||
-- | setup Branch |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
branch:SetParentObject(parent) |
||||
parent:AddChild(branch) |
||||
branch:SetSettings({ |
||||
key = key, |
||||
value = value, |
||||
position = position, |
||||
depth = depth, |
||||
last = last, |
||||
leaf = leaf, |
||||
}) |
||||
branch:SetEventListener('OnClick',function(this,event,button) |
||||
if button =='RightButton' then |
||||
if not next(this.settings.menuData) then return end |
||||
DiesalMenu:Menu(this.settings.menuData,this.frame,10,-10) |
||||
end |
||||
end) |
||||
|
||||
self:SetBranchLabel(branch,key,value,leaf) |
||||
self:SetBranchMenu(branch,key,value) |
||||
self:SetBranchIcon(branch,type(value)) |
||||
|
||||
if value == tree or leaf then branch:ApplySettings() return end |
||||
-- | sort Branch Table |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local sortedTable = sortTable(value) |
||||
-- | build Branch Branches |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
for position, key in ipairs(sortedTable) do |
||||
if self.settings.endtime <= time() then self:Timeout() return end |
||||
self:BuildBranch(branch,key[2],value[key[2]],position,depth+1,position == #sortedTable) |
||||
end |
||||
-- | Update Branch | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
branch:ApplySettings() |
||||
end, |
||||
['Show'] = function(self) |
||||
self.window:Show() |
||||
end, |
||||
} |
||||
-- ~~| TableExplorer Constructor |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local function Constructor() |
||||
QuickDoc = DiesalGUI:CreateObjectBase(Type) |
||||
-- ~~ Default Settings ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
QuickDoc.defaults = { |
||||
|
||||
} |
||||
-- ~~ Construct ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local window = DiesalGUI:Create('Window') |
||||
window:SetSettings({ |
||||
header = false, |
||||
footer = false, |
||||
top = UIParent:GetHeight() - 100, |
||||
left = 100, |
||||
height = 300, |
||||
width = 400, |
||||
minWidth = 200, |
||||
minHeight = 200, |
||||
},true) |
||||
window:SetStylesheet(windowStylesheet) |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
-- ~~ Frames ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
QuickDoc.window = window |
||||
QuickDoc.content = window.content |
||||
QuickDoc.frame = window.frame |
||||
|
||||
|
||||
-- ~~ Methods ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
for method, func in pairs(methods) do QuickDoc[method] = func end |
||||
-- ~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
return QuickDoc |
||||
end |
||||
DiesalGUI:RegisterObjectConstructor(Type,Constructor,Version) |
@ -1,279 +0,0 @@ |
||||
-- $Id: ScrollFrame.lua 60 2016-11-04 01:34:23Z diesal2010 $ |
||||
|
||||
local DiesalGUI = LibStub("DiesalGUI-1.0") |
||||
-- ~~| Libraries |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local DiesalTools = LibStub("DiesalTools-1.0") |
||||
local DiesalStyle = LibStub("DiesalStyle-1.0") |
||||
-- ~~| Diesal Upvalues |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local Colors = DiesalStyle.Colors |
||||
local HSL, ShadeColor, TintColor = DiesalTools.HSL, DiesalTools.ShadeColor, DiesalTools.TintColor |
||||
-- ~~| Lua Upvalues |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local type, select, pairs, tonumber = type, select, pairs, tonumber |
||||
local setmetatable, getmetatable, next = setmetatable, getmetatable, next |
||||
local sub, format, lower, upper = string.sub, string.format, string.lower, string.upper |
||||
local floor, ceil, min, max, abs, modf = math.floor, math.ceil, math.min, math.max, math.abs, math.modf |
||||
-- ~~| WoW Upvalues |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local GetCursorPosition = GetCursorPosition |
||||
-- ~~| ScrollFrame |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local Type = 'ScrollFrame' |
||||
local Version = 3 |
||||
-- ~~| ScrollFrame Stylesheets |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local Stylesheet = { |
||||
['track-background'] = { |
||||
type = 'texture', |
||||
layer = 'BACKGROUND', |
||||
color = '000000', |
||||
alpha = .3, |
||||
}, |
||||
['grip-background'] = { |
||||
type = 'texture', |
||||
layer = 'BACKGROUND', |
||||
color = Colors.UI_400, |
||||
}, |
||||
['grip-inline'] = { |
||||
type = 'outline', |
||||
layer = 'BORDER', |
||||
color = 'FFFFFF', |
||||
alpha = .02, |
||||
}, |
||||
} |
||||
local wireFrame = { |
||||
['frame-white'] = { |
||||
type = 'outline', |
||||
layer = 'OVERLAY', |
||||
color = 'ffffff', |
||||
}, |
||||
['scrollFrameContainer-yellow'] = { |
||||
type = 'outline', |
||||
layer = 'OVERLAY', |
||||
color = 'ffff00', |
||||
}, |
||||
['scrollFrame-orange'] = { |
||||
type = 'outline', |
||||
layer = 'OVERLAY', |
||||
color = 'ff7f00', |
||||
}, |
||||
['scrollBar-blue'] = { |
||||
type = 'outline', |
||||
layer = 'OVERLAY', |
||||
color = '0080ff', |
||||
}, |
||||
['track-green'] = { |
||||
type = 'outline', |
||||
layer = 'OVERLAY', |
||||
color = '00ff00', |
||||
}, |
||||
['grip-purple'] = { |
||||
type = 'outline', |
||||
layer = 'OVERLAY', |
||||
color = 'a800ff', |
||||
}, |
||||
} |
||||
-- ~~| ScrollFrame Locals |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local internal |
||||
-- ~~| ScrollFrame Methods |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local methods = { |
||||
['OnAcquire'] = function(self) |
||||
self:ApplySettings() |
||||
self:SetStylesheet(Stylesheet) |
||||
--self:SetStylesheet(wireFrame) |
||||
self:Show() |
||||
end, |
||||
['OnRelease'] = function(self) |
||||
end, |
||||
['ApplySettings'] = function(self) |
||||
local settings = self.settings |
||||
local scrollFrame = self.scrollFrame |
||||
|
||||
scrollFrame:SetPoint('TOPLEFT',settings.contentPadding[1],-settings.contentPadding[3]) |
||||
scrollFrame:SetPoint('BOTTOMRIGHT',-settings.contentPadding[2],settings.contentPadding[4]) |
||||
|
||||
self.scrollBar:SetWidth(settings.scrollBarWidth) |
||||
self.scrollBar:SetPoint('TOPRIGHT',-settings.scrollBarPadding[2],-settings.scrollBarPadding[3]) |
||||
self.scrollBar:SetPoint('BOTTOMRIGHT',-settings.scrollBarPadding[2],settings.scrollBarPadding[4]) |
||||
|
||||
if settings.scrollBarButtons then |
||||
self.track:SetPoint('TOP',0,-settings.scrollBarButtonHeight) |
||||
self.track:SetPoint('BOTTOM',0,settings.scrollBarButtonHeight) |
||||
|
||||
self.buttonDown:SetHeight(settings.scrollBarButtonHeight) |
||||
self.buttonUp:SetHeight(settings.scrollBarButtonHeight) |
||||
self.buttonUp:Show() |
||||
self.buttonDown:Show() |
||||
else |
||||
self.track:SetPoint('TOP',0,0) |
||||
self.track:SetPoint('BOTTOM',0,0) |
||||
|
||||
self.buttonUp:Hide() |
||||
self.buttonDown:Hide() |
||||
end |
||||
self.content:SetHeight(settings.contentHeight) |
||||
end, |
||||
['SetContentHeight'] = function(self,height) |
||||
height = height < 1 and 1 or height -- height of 0 wont hide scrollbar |
||||
self.settings.contentHeight = height |
||||
self.content:SetHeight(height) |
||||
end, |
||||
['SetGripSize'] = function(self) |
||||
local contentSize = self.scrollFrame:GetVerticalScrollRange() + self.scrollFrame:GetHeight() |
||||
local windowSize = self.scrollFrame:GetHeight() |
||||
local trackSize = self.track:GetHeight() |
||||
local windowContentRatio = windowSize / contentSize |
||||
local gripSize = DiesalTools.Round(trackSize * windowContentRatio) |
||||
|
||||
gripSize = max(gripSize, 10) -- might give this a setting? |
||||
gripSize = min(gripSize, trackSize) |
||||
|
||||
self.grip:SetHeight(gripSize) |
||||
end, |
||||
['SetScrollThumbPosition'] = function(self) |
||||
local verticalScrollRange = self.scrollFrame:GetVerticalScrollRange() -- windowScrollAreaSize (rounded no need to round) |
||||
if verticalScrollRange < 1 then self.grip:SetPoint('TOP',0,0) return end |
||||
local verticalScroll = self.scrollFrame:GetVerticalScroll() -- windowPosition |
||||
local trackSize = self.track:GetHeight() |
||||
local gripSize = self.grip:GetHeight() |
||||
|
||||
local windowPositionRatio = verticalScroll / verticalScrollRange |
||||
local trackScrollAreaSize = trackSize - gripSize |
||||
local gripPositionOnTrack = DiesalTools.Round(trackScrollAreaSize * windowPositionRatio) |
||||
|
||||
self.grip:SetPoint('TOP',0,-gripPositionOnTrack) |
||||
end, |
||||
['ShowScrollBar'] = function(self,show) |
||||
if show then |
||||
self.scrollFrameContainer:SetPoint('BOTTOMRIGHT',-(self.settings.scrollBarWidth + self.settings.scrollBarPadding[1] + self.settings.scrollBarPadding[2]),0) |
||||
self.scrollBar:Show() |
||||
else |
||||
self.scrollBar:Hide() |
||||
self.scrollFrameContainer:SetPoint('BOTTOMRIGHT',0,0) |
||||
end |
||||
end, |
||||
['ScrollToBottom'] = function(self) |
||||
local scrollRange = self.scrollFrame:GetVerticalScrollRange() |
||||
if scrollRange > 0 and scrollRange ~= self.scrollFrame:GetVerticalScroll() then |
||||
self.scrollFrame:SetVerticalScroll(scrollRange) |
||||
end |
||||
end, |
||||
['SetVerticalScroll'] = function(self,num) |
||||
self.scrollFrame:SetVerticalScroll(num) |
||||
end, |
||||
['GetVerticalScroll'] = function(self) |
||||
return self.scrollFrame:GetVerticalScroll() |
||||
end, |
||||
['GetVerticalScrollRange'] = function(self) |
||||
return self.scrollFrame:GetVerticalScrollRange() |
||||
end, |
||||
['VerticallyScroll'] = function(self,num) |
||||
if num < 0 then |
||||
self.scrollFrame:SetVerticalScroll(max( self.scrollFrame:GetVerticalScroll() + num, 0)) |
||||
else |
||||
self.scrollFrame:SetVerticalScroll(min( self.scrollFrame:GetVerticalScroll() + num, self.scrollFrame:GetVerticalScrollRange())) |
||||
end |
||||
end, |
||||
} |
||||
-- ~~| ScrollFrame Constructor |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local function Constructor() |
||||
local self = DiesalGUI:CreateObjectBase(Type) |
||||
local frame = CreateFrame('Frame',nil,UIParent) |
||||
self.frame = frame |
||||
-- ~~ Default Settings ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
self.defaults = { |
||||
height = 300, |
||||
width = 500, |
||||
scrollBarButtonHeight = 4, |
||||
scrollBarWidth = 4, |
||||
scrollBarButtons = false, |
||||
scrollBarPadding = {0,0,0,0}, |
||||
contentPadding = {0,0,0,0}, |
||||
contentHeight = 1, |
||||
} |
||||
-- ~~ Events ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
-- OnAcquire, OnRelease, OnHeightSet, OnWidthSet |
||||
-- OnHide |
||||
-- ~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
frame:SetScript("OnHide",function(this) |
||||
self:FireEvent("OnHide") |
||||
end) |
||||
|
||||
local scrollFrameContainer = self:CreateRegion("Frame", 'scrollFrameContainer', frame) |
||||
scrollFrameContainer:SetAllPoints() |
||||
local scrollFrame = self:CreateRegion("ScrollFrame", 'scrollFrame', scrollFrameContainer) |
||||
scrollFrame:EnableMouseWheel(true) |
||||
scrollFrame:SetScript("OnMouseWheel", function(this,delta) |
||||
DiesalGUI:OnMouse(this,'MouseWheel') |
||||
if delta > 0 then |
||||
self:VerticallyScroll(-25) |
||||
else |
||||
self:VerticallyScroll(25) |
||||
end |
||||
end) |
||||
scrollFrame:SetScript("OnVerticalScroll", function(this,offset) |
||||
-- self.scrollFrame:GetVerticalScrollRange() windowScrollAreaSize |
||||
if this:GetVerticalScrollRange() < 1 then -- nothing to scroll |
||||
self:ShowScrollBar(false) |
||||
else |
||||
self:ShowScrollBar(true) |
||||
end |
||||
self:SetScrollThumbPosition() |
||||
end) |
||||
scrollFrame:SetScript("OnScrollRangeChanged", function(this,horizontalScrollRange, verticalScrollRange) |
||||
if verticalScrollRange < 1 then -- nothing to scroll |
||||
this:SetVerticalScroll(0) |
||||
self:ShowScrollBar(false) |
||||
return end |
||||
this:SetVerticalScroll(min(this:GetVerticalScroll(),verticalScrollRange)) |
||||
self:ShowScrollBar(true) |
||||
self:SetGripSize() |
||||
self:SetScrollThumbPosition() |
||||
end) |
||||
scrollFrame:SetScript("OnSizeChanged", function(this,width,height) |
||||
self.content:SetWidth(width) |
||||
end) |
||||
scrollFrame:SetScrollChild(self:CreateRegion("Frame", 'content', scrollFrame)) |
||||
scrollFrame:RegisterForDrag("LeftButton") |
||||
scrollFrame:SetScript( "OnDragStart", function(this,...) |
||||
self:FireEvent("OnDragStart",...) |
||||
end) |
||||
|
||||
local scrollBar = self:CreateRegion("Frame", 'scrollBar', frame) |
||||
scrollBar:Hide() |
||||
local buttonUp = self:CreateRegion("Frame", 'buttonUp', scrollBar) |
||||
buttonUp:SetPoint('TOPLEFT') |
||||
buttonUp:SetPoint('TOPRIGHT') |
||||
local buttonDown = self:CreateRegion("Frame", 'buttonDown', scrollBar) |
||||
buttonDown:SetPoint('BOTTOMLEFT') |
||||
buttonDown:SetPoint('BOTTOMRIGHT') |
||||
local track = self:CreateRegion("Frame", 'track', scrollBar) |
||||
track:SetPoint('LEFT') |
||||
track:SetPoint('RIGHT') |
||||
local grip = self:CreateRegion("Frame", 'grip', track) |
||||
grip:SetPoint('LEFT') |
||||
grip:SetPoint('RIGHT') |
||||
grip:SetPoint('TOP') |
||||
grip:EnableMouse(true) |
||||
grip:SetScript("OnMouseDown", function(this,button) |
||||
DiesalGUI:OnMouse(this,button) |
||||
if button ~= 'LeftButton' then return end |
||||
local MouseY = select(2, GetCursorPosition()) / this:GetEffectiveScale() |
||||
local effectiveScale = this:GetEffectiveScale() |
||||
local trackScrollAreaSize = track:GetHeight() - this:GetHeight() |
||||
local gripPositionOnTrack = abs(select(5,this:GetPoint(1))) |
||||
|
||||
this:SetScript("OnUpdate", function(this) |
||||
local newGripPosition = gripPositionOnTrack + (MouseY - (select(2, GetCursorPosition()) / effectiveScale )) |
||||
newGripPosition = min(max(newGripPosition,0),trackScrollAreaSize) |
||||
-- local newGripPositionRatio = newGripPosition / trackScrollAreaSize |
||||
-- local windowPosition = newGripPositionRatio * scrollArea:GetVerticalScrollRange() |
||||
scrollFrame:SetVerticalScroll((newGripPosition / trackScrollAreaSize) * scrollFrame:GetVerticalScrollRange()) |
||||
end) |
||||
end) |
||||
grip:SetScript("OnMouseUp", function(this,button) |
||||
this:SetScript("OnUpdate", function(this) end) |
||||
end) |
||||
-- ~~ Methods ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
for method, func in pairs(methods) do self[method] = func end |
||||
-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
return self |
||||
end |
||||
|
||||
DiesalGUI:RegisterObjectConstructor(Type,Constructor,Version) |
@ -1,279 +0,0 @@ |
||||
-- $Id: ScrollingEditBox.lua 60 2016-11-04 01:34:23Z diesal2010 $ |
||||
|
||||
local DiesalGUI = LibStub('DiesalGUI-1.0') |
||||
-- ~~| Libraries |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local DiesalTools = LibStub('DiesalTools-1.0') |
||||
local DiesalStyle = LibStub("DiesalStyle-1.0") |
||||
-- ~~| Diesal Upvalues |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local Colors = DiesalStyle.Colors |
||||
local HSL, ShadeColor, TintColor = DiesalTools.HSL, DiesalTools.ShadeColor, DiesalTools.TintColor |
||||
-- ~~| Lua Upvalues |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local type, select, pairs, tonumber = type, select, pairs, tonumber |
||||
local setmetatable, getmetatable, next = setmetatable, getmetatable, next |
||||
local sub, format, lower, upper = string.sub, string.format, string.lower, string.upper |
||||
local floor, ceil, min, max, abs, modf = math.floor, math.ceil, math.min, math.max, math.abs, math.modf |
||||
-- ~~| WoW Upvalues |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local GetCursorPosition = GetCursorPosition |
||||
-- ~~| ScrollingEditBox |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local Type = 'ScrollingEditBox' |
||||
local Version = 3 |
||||
-- ~~| ScrollingEditBox Stylesheets |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local Stylesheet = { |
||||
['track-background'] = { |
||||
type = 'texture', |
||||
layer = 'BACKGROUND', |
||||
color = '000000', |
||||
alpha = .3, |
||||
}, |
||||
['grip-background'] = { |
||||
type = 'texture', |
||||
layer = 'BACKGROUND', |
||||
color = Colors.UI_400, |
||||
}, |
||||
['grip-inline'] = { |
||||
type = 'outline', |
||||
layer = 'BORDER', |
||||
color = 'FFFFFF', |
||||
alpha = .02, |
||||
}, |
||||
} |
||||
local wireFrame = { |
||||
['frame-white'] = { |
||||
type = 'outline', |
||||
layer = 'OVERLAY', |
||||
color = 'ffffff', |
||||
}, |
||||
['scrollFrameContainer-yellow'] = { |
||||
type = 'outline', |
||||
layer = 'BACKGROUND', |
||||
color = 'fffc00', |
||||
}, |
||||
['scrollFrame-orange'] = { |
||||
type = 'outline', |
||||
layer = 'BORDER', |
||||
color = 'ffd400', |
||||
}, |
||||
['editBox-red'] = { |
||||
type = 'outline', |
||||
layer = 'ARTWORK', |
||||
color = 'ff0000', |
||||
aplha = .5, |
||||
}, |
||||
['scrollBar-blue'] = { |
||||
type = 'outline', |
||||
layer = 'OVERLAY', |
||||
color = '00aaff', |
||||
}, |
||||
['track-green'] = { |
||||
type = 'outline', |
||||
layer = 'OVERLAY', |
||||
color = '55ff00', |
||||
}, |
||||
} |
||||
-- ~~| ScrollingEditBox Locals |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
|
||||
-- ~~| ScrollingEditBox Methods |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local methods = { |
||||
['OnAcquire'] = function(self) |
||||
self:ApplySettings() |
||||
self:SetStylesheet(Stylesheet) |
||||
-- self:SetStylesheet(wireFrame) |
||||
self:Show() |
||||
end, |
||||
['OnRelease'] = function(self) end, |
||||
['ApplySettings'] = function(self) |
||||
local settings = self.settings |
||||
|
||||
self.scrollFrame:SetPoint('TOPLEFT',settings.contentPadding[1],-settings.contentPadding[3]) |
||||
self.scrollFrame:SetPoint('BOTTOMRIGHT',-settings.contentPadding[2],settings.contentPadding[4]) |
||||
|
||||
self.scrollBar:SetPoint('TOPRIGHT',0,-settings.contentPadding[3] + 1) |
||||
self.scrollBar:SetPoint('BOTTOMRIGHT',0,settings.contentPadding[4] - 1) |
||||
|
||||
|
||||
self.scrollBar:SetWidth(settings.scrollBarWidth) |
||||
self.buttonDown:SetHeight(settings.scrollBarButtonHeight) |
||||
self.buttonUp:SetHeight(settings.scrollBarButtonHeight) |
||||
|
||||
self.editBox:SetJustifyH(settings.justifyH) |
||||
self.editBox:SetJustifyV(settings.justifyV) |
||||
end, |
||||
['ShowScrollBar'] = function(self,show) |
||||
if show then |
||||
self.scrollFrameContainer:SetPoint('BOTTOMRIGHT',-(self.settings.scrollBarWidth + 1),0) |
||||
self.scrollBar:Show() |
||||
else |
||||
self.scrollBar:Hide() |
||||
self.scrollFrameContainer:SetPoint('BOTTOMRIGHT',0,0) |
||||
end |
||||
end, |
||||
['SetContentHeight'] = function(self,height) |
||||
self.settings.contentHeight = height |
||||
self.content:SetHeight(height) |
||||
end, |
||||
['SetGripSize'] = function(self) |
||||
local contentSize = self.scrollFrame:GetVerticalScrollRange() + self.scrollFrame:GetHeight() |
||||
local windowSize = self.scrollFrame:GetHeight() |
||||
local trackSize = self.track:GetHeight() |
||||
local windowContentRatio = windowSize / contentSize |
||||
local gripSize = DiesalTools.Round(trackSize * windowContentRatio) |
||||
|
||||
gripSize = max(gripSize, 10) -- might give this a setting? |
||||
gripSize = min(gripSize, trackSize) |
||||
|
||||
self.grip:SetHeight(gripSize) |
||||
end, |
||||
['SetScrollThumbPosition'] = function(self) |
||||
local verticalScrollRange = self.scrollFrame:GetVerticalScrollRange() -- windowScrollAreaSize (rounded no need to round) |
||||
if verticalScrollRange < 1 then self.grip:SetPoint('TOP',0,0) return end |
||||
local verticalScroll = self.scrollFrame:GetVerticalScroll() -- windowPosition |
||||
local trackSize = self.track:GetHeight() |
||||
local gripSize = self.grip:GetHeight() |
||||
|
||||
local windowPositionRatio = verticalScroll / verticalScrollRange |
||||
local trackScrollAreaSize = trackSize - gripSize |
||||
local gripPositionOnTrack = DiesalTools.Round(trackScrollAreaSize * windowPositionRatio) |
||||
|
||||
self.grip:SetPoint('TOP',0,-gripPositionOnTrack) |
||||
end, |
||||
['SetVerticalScroll'] = function(self,scroll) -- user scrolled only |
||||
self.settings.forceScrollBottom = DiesalTools.Round(scroll) == DiesalTools.Round(self.scrollFrame:GetVerticalScrollRange()) |
||||
self.scrollFrame:SetVerticalScroll(scroll) |
||||
end, |
||||
['SetText'] = function(self,txt) |
||||
self.settings.text = txt |
||||
self.editBox:SetText(txt or '') |
||||
end, |
||||
} |
||||
-- ~~| ScrollingEditBox Constructor |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local function Constructor() |
||||
local self = DiesalGUI:CreateObjectBase(Type) |
||||
local frame = CreateFrame('Frame',nil,UIParent) |
||||
self.frame = frame |
||||
-- ~~ Default Settings ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
self.defaults = { |
||||
scrollBarButtonHeight = 1, |
||||
scrollBarWidth = 4, |
||||
contentPadding = {0,0,0,0}, |
||||
justifyH = "LEFT", |
||||
justifyV = "TOP", |
||||
forceScrollBottom = true, |
||||
} |
||||
-- ~~ Events ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
-- OnAcquire, OnRelease, OnHeightSet, OnWidthSet |
||||
-- OnHide |
||||
-- ~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
frame:SetScript("OnHide",function(this) self:FireEvent("OnHide") end) |
||||
|
||||
local scrollFrameContainer = self:CreateRegion("Frame", 'scrollFrameContainer', frame) |
||||
scrollFrameContainer:SetAllPoints() |
||||
local scrollFrame = self:CreateRegion("ScrollFrame", 'scrollFrame', scrollFrameContainer) |
||||
scrollFrame:EnableMouseWheel(true) |
||||
scrollFrame:SetScript("OnMouseWheel", function(this,delta) |
||||
DiesalGUI:OnMouse(this,'MouseWheel') |
||||
if delta > 0 then |
||||
self:SetVerticalScroll(max( this:GetVerticalScroll() - 50, 0)) |
||||
else |
||||
self:SetVerticalScroll(min( this:GetVerticalScroll() + 50, this:GetVerticalScrollRange())) |
||||
end |
||||
end) |
||||
scrollFrame:SetScript("OnVerticalScroll", function(this,offset) |
||||
-- self.scrollFrame:GetVerticalScrollRange() windowScrollAreaSize |
||||
if this:GetVerticalScrollRange() < 1 then -- nothing to scroll |
||||
self:ShowScrollBar(false) |
||||
else |
||||
self:ShowScrollBar(true) |
||||
end |
||||
self:SetScrollThumbPosition() |
||||
end) |
||||
scrollFrame:SetScript("OnScrollRangeChanged", function(this,xOffset, verticalScrollRange) |
||||
if verticalScrollRange < 1 then -- nothing to scroll |
||||
this:SetVerticalScroll(0) |
||||
self:ShowScrollBar(false) |
||||
return end |
||||
|
||||
if self.settings.forceScrollBottom then |
||||
this:SetVerticalScroll(verticalScrollRange) |
||||
else |
||||
this:SetVerticalScroll(min(this:GetVerticalScroll(),verticalScrollRange)) |
||||
end |
||||
self:ShowScrollBar(true) |
||||
self:SetGripSize() |
||||
self:SetScrollThumbPosition() |
||||
end) |
||||
scrollFrame:SetScript("OnSizeChanged", function(this,width,height) |
||||
self.editBox:SetWidth(width) |
||||
end) |
||||
|
||||
local editBox = self:CreateRegion("EditBox", 'editBox', scrollFrame) |
||||
editBox:SetPoint("TOPLEFT") |
||||
editBox:SetPoint("TOPRIGHT") |
||||
editBox:SetAutoFocus(false) |
||||
editBox:SetMultiLine(true) |
||||
editBox:HookScript('OnEditFocusLost',function(this) |
||||
this:HighlightText(0,0) |
||||
-- this:SetText(self.settings.text) |
||||
end) |
||||
editBox:HookScript('OnEditFocusGained',function(this) |
||||
self:FireEvent("OnEditFocusGained") |
||||
end) |
||||
editBox:HookScript('OnEscapePressed',function(this) |
||||
self:FireEvent("OnEscapePressed") |
||||
end) |
||||
editBox:HookScript('OnTabPressed',function(this) |
||||
self:FireEvent("OnTabPressed") |
||||
end) |
||||
editBox:HookScript('OnCursorChanged',function(this,...) |
||||
self:FireEvent("OnCursorChanged",...) |
||||
end) |
||||
editBox:HookScript('OnTextChanged',function(this) |
||||
self:FireEvent("OnTextChanged") |
||||
end) |
||||
|
||||
|
||||
|
||||
scrollFrame:SetScrollChild(editBox) |
||||
|
||||
local scrollBar = self:CreateRegion("Frame", 'scrollBar', frame) |
||||
scrollBar:Hide() |
||||
local buttonUp = self:CreateRegion("Frame", 'buttonUp', scrollBar) |
||||
buttonUp:SetPoint('TOPLEFT') |
||||
buttonUp:SetPoint('TOPRIGHT') |
||||
local buttonDown = self:CreateRegion("Frame", 'buttonDown', scrollBar) |
||||
buttonDown:SetPoint('BOTTOMLEFT') |
||||
buttonDown:SetPoint('BOTTOMRIGHT') |
||||
local track = self:CreateRegion("Frame", 'track', scrollBar) |
||||
track:SetPoint('LEFT') |
||||
track:SetPoint('RIGHT') |
||||
track:SetPoint('TOP',buttonUp,'BOTTOM',0,0) |
||||
track:SetPoint('BOTTOM',buttonDown,'TOP',0,0) |
||||
local grip = self:CreateRegion("Frame", 'grip', track) |
||||
grip:SetPoint('LEFT') |
||||
grip:SetPoint('RIGHT') |
||||
grip:SetPoint('TOP') |
||||
grip:EnableMouse(true) |
||||
grip:SetScript("OnMouseDown", function(this,button) |
||||
DiesalGUI:OnMouse(this,button) |
||||
if button ~= 'LeftButton' then return end |
||||
local MouseY = select(2, GetCursorPosition()) / this:GetEffectiveScale() |
||||
local effectiveScale = this:GetEffectiveScale() |
||||
local trackScrollAreaSize = track:GetHeight() - this:GetHeight() |
||||
local gripPositionOnTrack = abs(select(5,this:GetPoint(1))) |
||||
|
||||
this:SetScript("OnUpdate", function(this) |
||||
local newGripPosition = gripPositionOnTrack + (MouseY - (select(2, GetCursorPosition()) / effectiveScale )) |
||||
newGripPosition = min(max(newGripPosition,0),trackScrollAreaSize) |
||||
-- local newGripPositionRatio = newGripPosition / trackScrollAreaSize |
||||
-- local windowPosition = newGripPositionRatio * scrollArea:GetVerticalScrollRange() |
||||
self:SetVerticalScroll((newGripPosition / trackScrollAreaSize) * scrollFrame:GetVerticalScrollRange()) |
||||
end) |
||||
end) |
||||
grip:SetScript("OnMouseUp", function(this,button) |
||||
this:SetScript("OnUpdate", function(this) end) |
||||
end) |
||||
-- ~~ Methods ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
for method, func in pairs(methods) do self[method] = func end |
||||
-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
return self |
||||
end |
||||
DiesalGUI:RegisterObjectConstructor(Type,Constructor,Version) |
@ -1,267 +0,0 @@ |
||||
-- $Id: ScrollingMessageFrame.lua 60 2016-11-04 01:34:23Z diesal2010 $ |
||||
|
||||
local DiesalGUI = LibStub('DiesalGUI-1.0') |
||||
-- ~~| Libraries |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local DiesalTools = LibStub('DiesalTools-1.0') |
||||
-- ~~| Lua Upvalues |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local type, select, pairs, tonumber = type, select, pairs, tonumber |
||||
local setmetatable, getmetatable, next = setmetatable, getmetatable, next |
||||
local sub, format, lower, upper = string.sub, string.format, string.lower, string.upper |
||||
local floor, ceil, min, max, abs, modf = math.floor, math.ceil, math.min, math.max, math.abs, math.modf |
||||
-- ~~| WoW Upvalues |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local GetCursorPosition = GetCursorPosition |
||||
-- ~~| ScrollingMessageFrame |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local Type = 'ScrollingMessageFrame' |
||||
local Version = 1 |
||||
-- ~~| ScrollingMessageFrame Stylesheets |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local Stylesheet = { |
||||
['track-background'] = { |
||||
type = 'texture', |
||||
layer = 'BACKGROUND', |
||||
color = '0e0e0e', |
||||
}, |
||||
['track-outline'] = { |
||||
type = 'outline', |
||||
layer = 'BORDER', |
||||
color = '060606', |
||||
}, |
||||
['grip-background'] = { |
||||
type = 'texture', |
||||
layer = 'BACKGROUND', |
||||
gradient = 'HORIZONTAL', |
||||
color = '5d5d5d', |
||||
colorEnd = '252525', |
||||
}, |
||||
['grip-outline'] = { |
||||
type = 'outline', |
||||
layer = 'BORDER', |
||||
color = '060606', |
||||
}, |
||||
} |
||||
|
||||
local wireFrame = { |
||||
['frame-white'] = { |
||||
type = 'outline', |
||||
layer = 'OVERLAY', |
||||
color = 'ffffff', |
||||
}, |
||||
['scrollFrameContainer-yellow'] = { |
||||
type = 'outline', |
||||
layer = 'OVERLAY', |
||||
color = 'fffc00', |
||||
}, |
||||
['scrollFrame-orange'] = { |
||||
type = 'outline', |
||||
layer = 'OVERLAY', |
||||
color = 'ffd400', |
||||
}, |
||||
['scrollingMessageFrame-red'] = { |
||||
type = 'outline', |
||||
layer = 'BORDER', |
||||
color = 'ff0000', |
||||
aplha = .5, |
||||
}, |
||||
['scrollBar-blue'] = { |
||||
type = 'outline', |
||||
layer = 'OVERLAY', |
||||
color = '00aaff', |
||||
}, |
||||
['track-green'] = { |
||||
type = 'outline', |
||||
layer = 'OVERLAY', |
||||
color = '55ff00', |
||||
}, |
||||
} |
||||
-- ~~| ScrollingMessageFrame Locals |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
|
||||
-- ~~| ScrollingMessageFrame Methods |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local methods = { |
||||
['OnAcquire'] = function(self) |
||||
self:ApplySettings() |
||||
self:SetStylesheet(Stylesheet) |
||||
self:SetStylesheet(wireFrame) |
||||
self:Show() |
||||
end, |
||||
['OnRelease'] = function(self) |
||||
end, |
||||
['ApplySettings'] = function(self) |
||||
local settings = self.settings |
||||
local scrollFrame = self.scrollFrame |
||||
|
||||
scrollFrame:SetPoint('TOPLEFT',settings.contentPadLeft,-settings.contentPadTop) |
||||
scrollFrame:SetPoint('BOTTOMRIGHT',-settings.contentPadRight,settings.contentPadBottom) |
||||
|
||||
self.scrollBar:SetWidth(settings.scrollBarWidth) |
||||
self.buttonDown:SetHeight(settings.scrollBarButtonHeight) |
||||
self.buttonUp:SetHeight(settings.scrollBarButtonHeight) |
||||
end, |
||||
['ShowScrollBar'] = function(self,show) |
||||
if show then |
||||
self.scrollFrameContainer:SetPoint('BOTTOMRIGHT',-(self.settings.scrollBarWidth + 1),0) |
||||
self.scrollBar:Show() |
||||
else |
||||
self.scrollBar:Hide() |
||||
self.scrollFrameContainer:SetPoint('BOTTOMRIGHT',0,0) |
||||
end |
||||
end, |
||||
['SetContentHeight'] = function(self,height) |
||||
self.settings.contentHeight = height |
||||
self.content:SetHeight(height) |
||||
end, |
||||
['SetGripSize'] = function(self) |
||||
local contentSize = self.scrollFrame:GetVerticalScrollRange() + self.scrollFrame:GetHeight() |
||||
local windowSize = self.scrollFrame:GetHeight() |
||||
local trackSize = self.track:GetHeight() |
||||
local windowContentRatio = windowSize / contentSize |
||||
local gripSize = DiesalTools.Round(trackSize * windowContentRatio) |
||||
|
||||
gripSize = max(gripSize, 10) -- might give this a setting? |
||||
gripSize = min(gripSize, trackSize) |
||||
|
||||
self.grip:SetHeight(gripSize) |
||||
end, |
||||
['SetScrollThumbPosition'] = function(self) |
||||
local verticalScrollRange = self.scrollFrame:GetVerticalScrollRange() -- windowScrollAreaSize (rounded no need to round) |
||||
if verticalScrollRange < 1 then self.grip:SetPoint('TOP',0,0) return end |
||||
local verticalScroll = self.scrollFrame:GetVerticalScroll() -- windowPosition |
||||
local trackSize = self.track:GetHeight() |
||||
local gripSize = self.grip:GetHeight() |
||||
|
||||
local windowPositionRatio = verticalScroll / verticalScrollRange |
||||
local trackScrollAreaSize = trackSize - gripSize |
||||
local gripPositionOnTrack = DiesalTools.Round(trackScrollAreaSize * windowPositionRatio) |
||||
|
||||
self.grip:SetPoint('TOP',0,-gripPositionOnTrack) |
||||
end, |
||||
['SetVerticalScroll'] = function(self,scroll) -- user scrolled only |
||||
self.settings.forceScrollBottom = DiesalTools.Round(scroll) == DiesalTools.Round(self.scrollFrame:GetVerticalScrollRange()) |
||||
self.scrollFrame:SetVerticalScroll(scroll) |
||||
end, |
||||
['AddMessage'] = function(self,msg) |
||||
if not msg then return end |
||||
self.scrollingMessageFrame:AddMessage(msg) |
||||
ChatFrame1:AddMessage(self.scrollingMessageFrame:GetNumRegions() ) |
||||
end, |
||||
['SetText'] = function(self,txt) |
||||
-- self.editBox:SetText(txt or '') |
||||
end, |
||||
} |
||||
-- ~~| ScrollingMessageFrame Constructor |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local function Constructor() |
||||
local self = DiesalGUI:CreateObjectBase(Type) |
||||
local frame = CreateFrame('Frame',nil,UIParent) |
||||
self.frame = frame |
||||
-- ~~ Default Settings ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
-- ~~ Default Settings ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
self.defaults = { |
||||
scrollBarButtonHeight = 1, |
||||
scrollBarWidth = 6, |
||||
contentPadLeft = 0, |
||||
contentPadRight = 0, |
||||
contentPadTop = 0, |
||||
contentPadBottom = 0, |
||||
forceScrollBottom = true, |
||||
} |
||||
-- ~~ Events ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
-- OnAcquire, OnRelease, OnHeightSet, OnWidthSet |
||||
-- OnHide |
||||
-- ~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
frame:SetScript("OnHide",function(this) self:FireEvent("OnHide") end) |
||||
|
||||
local scrollFrameContainer = self:CreateRegion("Frame", 'scrollFrameContainer', frame) |
||||
scrollFrameContainer:SetAllPoints() |
||||
local scrollFrame = self:CreateRegion("ScrollFrame", 'scrollFrame', scrollFrameContainer) |
||||
scrollFrame:EnableMouseWheel(true) |
||||
scrollFrame:SetScript("OnMouseWheel", function(this,delta) |
||||
DiesalGUI:OnMouse(this,'MouseWheel') |
||||
if delta > 0 then |
||||
self:SetVerticalScroll(max( this:GetVerticalScroll() - 50, 0)) |
||||
else |
||||
self:SetVerticalScroll(min( this:GetVerticalScroll() + 50, this:GetVerticalScrollRange())) |
||||
end |
||||
end) |
||||
scrollFrame:SetScript("OnVerticalScroll", function(this,offset) |
||||
-- self.scrollFrame:GetVerticalScrollRange() windowScrollAreaSize |
||||
if this:GetVerticalScrollRange() < 1 then -- nothing to scroll |
||||
self:ShowScrollBar(false) |
||||
else |
||||
self:ShowScrollBar(true) |
||||
end |
||||
self:SetScrollThumbPosition() |
||||
end) |
||||
scrollFrame:SetScript("OnScrollRangeChanged", function(this,xOffset, verticalScrollRange) |
||||
if verticalScrollRange < 1 then -- nothing to scroll |
||||
this:SetVerticalScroll(0) |
||||
self:ShowScrollBar(false) |
||||
return end |
||||
|
||||
if self.settings.forceScrollBottom then |
||||
this:SetVerticalScroll(verticalScrollRange) |
||||
else |
||||
this:SetVerticalScroll(min(this:GetVerticalScroll(),verticalScrollRange)) |
||||
end |
||||
self:ShowScrollBar(true) |
||||
self:SetGripSize() |
||||
self:SetScrollThumbPosition() |
||||
end) |
||||
scrollFrame:SetScript("OnSizeChanged", function(this,width,height) |
||||
self.scrollingMessageFrame:SetWidth(width) |
||||
end) |
||||
|
||||
local scrollingMessageFrame = self:CreateRegion("ScrollingMessageFrame", 'scrollingMessageFrame', scrollFrame) |
||||
scrollingMessageFrame:SetPoint("TOPLEFT") |
||||
scrollingMessageFrame:SetPoint("TOPRIGHT") |
||||
scrollingMessageFrame:SetJustifyH("LEFT") |
||||
scrollingMessageFrame:SetJustifyV("TOP") |
||||
scrollingMessageFrame:SetInsertMode("BOTTOM") |
||||
scrollingMessageFrame:SetMaxLines(500) |
||||
scrollingMessageFrame:SetHeight(500) |
||||
scrollingMessageFrame:SetFading(false) |
||||
scrollFrame:SetScrollChild(scrollingMessageFrame) |
||||
|
||||
|
||||
local scrollBar = self:CreateRegion("Frame", 'scrollBar', frame) |
||||
scrollBar:SetPoint('TOPRIGHT') |
||||
scrollBar:SetPoint('BOTTOMRIGHT') |
||||
scrollBar:Hide() |
||||
local buttonUp = self:CreateRegion("Frame", 'buttonUp', scrollBar) |
||||
buttonUp:SetPoint('TOPLEFT') |
||||
buttonUp:SetPoint('TOPRIGHT') |
||||
local buttonDown = self:CreateRegion("Frame", 'buttonDown', scrollBar) |
||||
buttonDown:SetPoint('BOTTOMLEFT') |
||||
buttonDown:SetPoint('BOTTOMRIGHT') |
||||
local track = self:CreateRegion("Frame", 'track', scrollBar) |
||||
track:SetPoint('LEFT') |
||||
track:SetPoint('RIGHT') |
||||
track:SetPoint('TOP',buttonUp,'BOTTOM',0,0) |
||||
track:SetPoint('BOTTOM',buttonDown,'TOP',0,0) |
||||
local grip = self:CreateRegion("Frame", 'grip', track) |
||||
grip:SetPoint('LEFT') |
||||
grip:SetPoint('RIGHT') |
||||
grip:SetPoint('TOP') |
||||
grip:EnableMouse(true) |
||||
grip:SetScript("OnMouseDown", function(this,button) |
||||
DiesalGUI:OnMouse(this,button) |
||||
if button ~= 'LeftButton' then return end |
||||
local MouseY = select(2, GetCursorPosition()) / this:GetEffectiveScale() |
||||
local effectiveScale = this:GetEffectiveScale() |
||||
local trackScrollAreaSize = track:GetHeight() - this:GetHeight() |
||||
local gripPositionOnTrack = abs(select(5,this:GetPoint(1))) |
||||
|
||||
this:SetScript("OnUpdate", function(this) |
||||
local newGripPosition = gripPositionOnTrack + (MouseY - (select(2, GetCursorPosition()) / effectiveScale )) |
||||
newGripPosition = min(max(newGripPosition,0),trackScrollAreaSize) |
||||
-- local newGripPositionRatio = newGripPosition / trackScrollAreaSize |
||||
-- local windowPosition = newGripPositionRatio * scrollArea:GetVerticalScrollRange() |
||||
self:SetVerticalScroll((newGripPosition / trackScrollAreaSize) * scrollFrame:GetVerticalScrollRange()) |
||||
end) |
||||
end) |
||||
grip:SetScript("OnMouseUp", function(this,button) |
||||
this:SetScript("OnUpdate", function(this) end) |
||||
end) |
||||
-- ~~ Methods ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
for method, func in pairs(methods) do self[method] = func end |
||||
-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
return self |
||||
end |
||||
DiesalGUI:RegisterObjectConstructor(Type,Constructor,Version) |
@ -1,294 +0,0 @@ |
||||
-- $Id: Spinner.lua 60 2016-11-04 01:34:23Z diesal2010 $ |
||||
local DiesalGUI = LibStub("DiesalGUI-1.0") |
||||
-- | Libraries |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local DiesalTools = LibStub("DiesalTools-1.0") |
||||
local DiesalStyle = LibStub("DiesalStyle-1.0") |
||||
-- ~~| Diesal Upvalues |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local Colors = DiesalStyle.Colors |
||||
local HSL, ShadeColor, TintColor = DiesalTools.HSL, DiesalTools.ShadeColor, DiesalTools.TintColor |
||||
local round = DiesalTools.Round |
||||
-- | Lua Upvalues |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local type, tonumber, select = type, tonumber, select |
||||
local pairs, ipairs, next = pairs, ipairs, next |
||||
local min, max = math.min, math.max |
||||
-- | WoW Upvalues |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
-- | Spinner |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local Type = "Spinner" |
||||
local Version = 3 |
||||
-- | Stylesheets |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local Stylesheet = { |
||||
['frame-background'] = { |
||||
type = 'texture', |
||||
layer = 'BACKGROUND', |
||||
color = '000000', |
||||
alpha = .6, |
||||
}, |
||||
['frame-inline'] = { |
||||
type = 'outline', |
||||
layer = 'BORDER', |
||||
color = '000000', |
||||
alpha = .6, |
||||
}, |
||||
['frame-outline'] = { |
||||
type = 'outline', |
||||
layer = 'BORDER', |
||||
color = 'FFFFFF', |
||||
alpha = .02, |
||||
position = 1, |
||||
}, |
||||
['frame-hover'] = { |
||||
type = 'outline', |
||||
layer = 'HIGHLIGHT', |
||||
color = 'FFFFFF', |
||||
alpha = .25, |
||||
position = -1, |
||||
}, |
||||
['editBox-font'] = { |
||||
type = 'Font', |
||||
color = Colors.UI_TEXT, |
||||
}, |
||||
['bar-background'] = { |
||||
type = 'texture', |
||||
layer = 'BACKGROUND', |
||||
gradient = {'VERTICAL',Colors.UI_A100,ShadeColor(Colors.UI_A100,.1)}, |
||||
}, |
||||
['bar-inline'] = { |
||||
type = 'outline', |
||||
layer = 'BORDER', |
||||
gradient = {'VERTICAL','FFFFFF','FFFFFF'}, |
||||
alpha = {.07,.02}, |
||||
}, |
||||
['bar-outline'] = { |
||||
type = 'texture', |
||||
layer = 'ARTWORK', |
||||
color = '000000', |
||||
alpha = .7, |
||||
width = 1, |
||||
position = {nil,1,0,0}, |
||||
}, |
||||
} |
||||
|
||||
local wireFrame = { |
||||
['frame-white'] = { |
||||
type = 'outline', |
||||
layer = 'OVERLAY', |
||||
color = 'ffffff', |
||||
}, |
||||
['editBox-purple'] = { |
||||
type = 'outline', |
||||
layer = 'OVERLAY', |
||||
color = 'aa00ff', |
||||
}, |
||||
['buttonUp-yellow'] = { |
||||
type = 'outline', |
||||
layer = 'OVERLAY', |
||||
color = 'fffc00', |
||||
}, |
||||
['buttonDown-orange'] = { |
||||
type = 'outline', |
||||
layer = 'OVERLAY', |
||||
color = 'ffd400', |
||||
}, |
||||
['bar-green'] = { |
||||
type = 'outline', |
||||
layer = 'OVERLAY', |
||||
color = '55ff00', |
||||
}, |
||||
} |
||||
-- | Internal Methods |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local function processNumber(self, number) |
||||
local settings = self.settings |
||||
local number, oldNumber = tonumber(number), self:GetNumber() |
||||
|
||||
if not number then |
||||
number = oldNumber or settings.min |
||||
else |
||||
number = max(min(number,settings.max),settings.min) |
||||
end |
||||
|
||||
settings.number = number |
||||
|
||||
self.editBox:SetText( (settings.prefix or '')..number..(settings.suffix or '') ) |
||||
self.editBox:HighlightText(0,0) -- clear any selcted text |
||||
self.editBox:SetCursorPosition(0) |
||||
|
||||
self:UpdateBar() |
||||
|
||||
if number ~= oldNumber then return number end |
||||
end |
||||
-- | Methods |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local methods = { |
||||
['OnAcquire'] = function(self) |
||||
self:SetStylesheet(Stylesheet) |
||||
-- self:SetStylesheet(wireFrame) |
||||
self:ApplySettings() |
||||
self:Show() |
||||
end, |
||||
['OnRelease'] = function(self) end, |
||||
['ApplySettings'] = function(self) |
||||
local settings = self.settings |
||||
local frame = self.frame |
||||
local buttonUp = self.buttonUp |
||||
local buttonDown = self.buttonDown |
||||
local editBox = self.editBox |
||||
local buttonsWidth = settings.buttons and settings.buttonsWidth or 0 |
||||
local buttonHeight = round(settings.height / 2) |
||||
-- Apply Settings |
||||
self:SetWidth(settings.width) |
||||
self:SetHeight(settings.height) |
||||
|
||||
editBox:EnableMouse(settings.mouse) |
||||
editBox:EnableMouseWheel(settings.mouseWheel) |
||||
editBox:SetPoint('BOTTOMRIGHT',-buttonsWidth,0) |
||||
|
||||
buttonUp[settings.buttons and "Show" or "Hide"](buttonUp) |
||||
buttonUp:EnableMouse(settings.mouse) |
||||
buttonUp:SetHeight(buttonHeight) |
||||
buttonUp:SetWidth(buttonsWidth) |
||||
buttonDown[settings.buttons and "Show" or "Hide"](buttonDown) |
||||
buttonDown:EnableMouse(settings.mouse) |
||||
buttonDown:SetHeight(buttonHeight) |
||||
buttonDown:SetWidth(buttonsWidth) |
||||
|
||||
self:UpdateBar() |
||||
end, |
||||
['EnableMouse'] = function(self,enable) |
||||
self.settings.mouse = enable |
||||
self.buttonUp:EnableMouse(enable) |
||||
self.buttonDown:EnableMouse(enable) |
||||
self.editBox:EnableMouse(enable) |
||||
self.editBox:EnableMouseWheel(enable) |
||||
end, |
||||
['GetNumber'] = function(self) |
||||
return self.settings.number |
||||
end, |
||||
['SetNumber'] = function(self,number) |
||||
local newNumber = processNumber(self, number) |
||||
if newNumber then self:FireEvent("OnValueChanged",false,newNumber) end |
||||
end, |
||||
['SetPrefix'] = function(self,prefix) |
||||
self.settings.prefix = prefix |
||||
processNumber(self, self.settings.number) |
||||
end, |
||||
['SetSuffix'] = function(self,suffix) |
||||
self.settings.suffix = suffix |
||||
processNumber(self, self.settings.number) |
||||
end, |
||||
['OnSpin'] = function(self,delta) |
||||
local step = IsShiftKeyDown() and self.settings.shiftStep or self.settings.step |
||||
local oldNumber = self.settings.number |
||||
local newNumber |
||||
|
||||
if delta > 0 then |
||||
newNumber = processNumber(self, round(oldNumber,step)+step) |
||||
else |
||||
newNumber = processNumber(self, round(oldNumber,step)-step) |
||||
end |
||||
|
||||
if newNumber then self:FireEvent("OnValueChanged",true,newNumber) end |
||||
end, |
||||
['UpdateBar'] = function(self) |
||||
if not self.settings.bar then return end |
||||
local settings = self.settings |
||||
local barWidth = self:GetWidth() - (settings.buttons and settings.buttonsWidth or 0) - 2 -- bar padding |
||||
local number = settings.number or settings.min |
||||
local width = round(((number - settings.min) / (settings.max - settings.min) * barWidth )) |
||||
if width == 0 then |
||||
self.bar:Hide() |
||||
else |
||||
self.bar:Show() |
||||
self.bar:SetWidth(width) |
||||
end |
||||
end, |
||||
['SetTextColor'] = function(self,color,alpha) |
||||
alpha = alpha or 1 |
||||
color = {DiesalTools.GetColor(color)} |
||||
self.editBox:SetTextColor(color[1],color[2],color[3],alpha) |
||||
end, |
||||
} |
||||
-- | Constructor |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local function Constructor() |
||||
local self = DiesalGUI:CreateObjectBase(Type) |
||||
local frame = CreateFrame('Frame',nil,UIParent) |
||||
self.frame = frame |
||||
-- ~~ Default Settings ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
self.defaults = { |
||||
height = 16, |
||||
width = 29, |
||||
mouse = true, |
||||
mouseWheel = true, |
||||
buttons = false, |
||||
buttonsWidth= 8, |
||||
bar = true, |
||||
min = 0, |
||||
max = 100, |
||||
step = 5, |
||||
shiftStep = 1, |
||||
} |
||||
-- ~~ Construct ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
frame:SetScript("OnHide",function(this) |
||||
self:FireEvent("OnHide") |
||||
end) |
||||
frame:SetScript('OnSizeChanged', function() self:UpdateBar() end ) |
||||
|
||||
local editBox = self:CreateRegion("EditBox", 'editBox', frame) |
||||
editBox:SetPoint("TOPLEFT") |
||||
editBox:SetAutoFocus(false) |
||||
editBox:SetJustifyH("CENTER") |
||||
editBox:SetJustifyV("CENTER") |
||||
editBox:SetTextInsets(1,0,2,0) |
||||
editBox:SetText(self.defaults.min) |
||||
editBox:SetScript('OnEnterPressed', function(this,...) |
||||
local number = this:GetNumber() or self.settings.number -- if entered text or nothing revert to old value |
||||
local newNumber = processNumber(self, number) |
||||
|
||||
if newNumber then self:FireEvent("OnValueChanged",true,newNumber)end |
||||
self:FireEvent("OnEnterPressed",...) |
||||
|
||||
DiesalGUI:ClearFocus() |
||||
end) |
||||
editBox:HookScript('OnEditFocusLost', function(this,...) |
||||
processNumber(self, self.settings.number) |
||||
end) |
||||
editBox:HookScript('OnEditFocusGained', function(this) |
||||
this:SetText( self.settings.number ) |
||||
this:HighlightText() |
||||
end) |
||||
editBox:SetScript("OnMouseWheel", function(this,delta) |
||||
DiesalGUI:OnMouse(this,'MouseWheel') |
||||
self:OnSpin(delta) |
||||
end) |
||||
editBox:SetScript("OnEnter",function(this,...) |
||||
self:FireEvent("OnEnter",...) |
||||
end) |
||||
editBox:SetScript("OnLeave", function(this,...) |
||||
self:FireEvent("OnLeave",...) |
||||
end) |
||||
|
||||
local bar = self:CreateRegion("Frame", 'bar', frame) |
||||
bar:SetPoint('TOPLEFT',1,-1) |
||||
bar:SetPoint('BOTTOMLEFT',-1,1) |
||||
|
||||
local buttonUp = self:CreateRegion("Button", 'buttonUp', frame) |
||||
buttonUp:SetPoint('TOP',0,0) |
||||
buttonUp:SetPoint('RIGHT') |
||||
buttonUp:SetScript("OnClick", function(this) |
||||
DiesalGUI:OnMouse(this,button) |
||||
PlaySound("gsTitleOptionExit") |
||||
self:OnSpin(1) |
||||
end) |
||||
local buttonDown = self:CreateRegion("Button", 'buttonDown', frame) |
||||
buttonDown:SetPoint('BOTTOM',0,0) |
||||
buttonDown:SetPoint('RIGHT') |
||||
buttonDown:SetScript("OnClick", function(this) |
||||
DiesalGUI:OnMouse(this,button) |
||||
PlaySound("gsTitleOptionExit") |
||||
self:OnSpin(-1) |
||||
end) |
||||
|
||||
-- ~~ Methods ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
for method, func in pairs(methods) do self[method] = func end |
||||
-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
return self |
||||
end |
||||
DiesalGUI:RegisterObjectConstructor(Type,Constructor,Version) |
@ -1,174 +0,0 @@ |
||||
-- $Id: Toggle.lua 60 2018-09-22 08:28:01Z DarkRotations $ |
||||
|
||||
local DiesalGUI = LibStub("DiesalGUI-1.0") |
||||
-- ~~| Libraries |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local DiesalTools = LibStub("DiesalTools-1.0") |
||||
local DiesalStyle = LibStub("DiesalStyle-1.0") |
||||
-- ~~| Diesal Upvalues |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local Colors = DiesalStyle.Colors |
||||
local HSL, ShadeColor, TintColor = DiesalTools.HSL, DiesalTools.ShadeColor, DiesalTools.TintColor |
||||
-- ~~| Lua Upvalues |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local type, tonumber, select = type, tonumber, select |
||||
local pairs, ipairs, next = pairs, ipairs, next |
||||
local min, max = math.min, math.max |
||||
-- ~~| WoW Upvalues |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local CreateFrame, UIParent, GetCursorPosition = CreateFrame, UIParent, GetCursorPosition |
||||
local GetScreenWidth, GetScreenHeight = GetScreenWidth, GetScreenHeight |
||||
local GetSpellInfo, GetBonusBarOffset, GetDodgeChance = GetSpellInfo, GetBonusBarOffset, GetDodgeChance |
||||
local GetPrimaryTalentTree, GetCombatRatingBonus = GetPrimaryTalentTree, GetCombatRatingBonus |
||||
-- ~~| Button |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local TYPE = "Toggle" |
||||
local VERSION = 1 |
||||
-- ~~| Button Stylesheets |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local Stylesheet = { |
||||
['frame-background'] = { |
||||
type = 'texture', |
||||
layer = 'BACKGROUND', |
||||
color = '333333', |
||||
alpha = .95, |
||||
position = -2 |
||||
}, |
||||
['frame-inline'] = { |
||||
type = 'outline', |
||||
layer = 'BORDER', |
||||
color = '000000', |
||||
alpha = .6, |
||||
position = -2 |
||||
}, |
||||
['frame-outline'] = { |
||||
type = 'outline', |
||||
layer = 'BORDER', |
||||
color = 'FFFFFF', |
||||
alpha = .1, |
||||
position = -1, |
||||
}, |
||||
} |
||||
local checkBoxStyle = { |
||||
base = { |
||||
type = 'texture', |
||||
layer = 'ARTWORK', |
||||
color = '00FF00', |
||||
position = -3, |
||||
}, |
||||
disabled = { |
||||
type = 'texture', |
||||
color = '00FFFF', |
||||
}, |
||||
enabled = { |
||||
type = 'texture', |
||||
color = Colors.UI_A400, |
||||
}, |
||||
} |
||||
|
||||
local wireFrame = { |
||||
['frame-white'] = { |
||||
type = 'outline', |
||||
layer = 'OVERLAY', |
||||
color = 'ffffff', |
||||
}, |
||||
} |
||||
-- ~~| Button Methods |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local methods = { |
||||
['OnAcquire'] = function(self) |
||||
self:ApplySettings() |
||||
self:SetStylesheet(Stylesheet) |
||||
self:Enable() |
||||
-- self:SetStylesheet(wireFrameSheet) |
||||
self.fontString:SetFontObject("DiesalFontNormal") |
||||
self.fontString:SetText() |
||||
self:Show() |
||||
end, |
||||
['OnRelease'] = function(self) end, |
||||
['ApplySettings'] = function(self) |
||||
local settings = self.settings |
||||
local frame = self.frame |
||||
|
||||
self:SetWidth(settings.width) |
||||
self:SetHeight(settings.height) |
||||
end, |
||||
["SetChecked"] = function(self,value) |
||||
self.settings.checked = value |
||||
self.frame:SetChecked(value) |
||||
|
||||
self[self.settings.disabled and "Disable" or "Enable"](self) |
||||
end, |
||||
["GetChecked"] = function(self) |
||||
return self.settings.checked |
||||
end, |
||||
["Disable"] = function(self) |
||||
self.settings.disabled = true |
||||
DiesalStyle:StyleTexture(self.check,self.checkBoxStyle and self.checkBoxStyle.disabled or checkBoxStyle.disabled) |
||||
self.frame:Disable() |
||||
end, |
||||
["Enable"] = function(self) |
||||
self.settings.disabled = false |
||||
DiesalStyle:StyleTexture(self.check,self.checkBoxStyle and self.checkBoxStyle.enabled or checkBoxStyle.enabled) |
||||
self.frame:Enable() |
||||
end, |
||||
["RegisterForClicks"] = function(self,...) |
||||
self.frame:RegisterForClicks(...) |
||||
end, |
||||
["SetText"] = function(self, text) |
||||
self.fontString:SetText(text) |
||||
end, |
||||
} |
||||
-- ~~| Button Constructor |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local function Constructor() |
||||
local self = DiesalGUI:CreateObjectBase(TYPE) |
||||
local frame = CreateFrame('CheckButton', nil, UIParent) |
||||
local fontString = frame:CreateFontString() |
||||
self.frame = frame |
||||
self.fontString = fontString |
||||
|
||||
-- ~~ Default Settings ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
self.defaults = { |
||||
height = 11, |
||||
width = 11, |
||||
} |
||||
-- ~~ Events ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
-- OnAcquire, OnRelease, OnHeightSet, OnWidthSet |
||||
-- OnValueChanged, OnEnter, OnLeave, OnDisable, OnEnable |
||||
-- ~~ Construct ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
|
||||
local check = self:CreateRegion("Texture", 'check', frame) |
||||
self.check = check |
||||
|
||||
DiesalStyle:StyleTexture(check,self.checkBoxStyle and self.checkBoxStyle.base or checkBoxStyle.base) |
||||
frame:SetCheckedTexture(check) |
||||
frame:SetScript('OnClick', function(this,button,...) |
||||
DiesalGUI:OnMouse(this,button) |
||||
|
||||
if not self.settings.disabled then |
||||
self:SetChecked(not self.settings.checked) |
||||
|
||||
if self.settings.checked then |
||||
----PlaySound("igMainMenuOptionCheckBoxOn") |
||||
else |
||||
----PlaySound("igMainMenuOptionCheckBoxOff") |
||||
end |
||||
|
||||
self:FireEvent("OnValueChanged", self.settings.checked) |
||||
end |
||||
end) |
||||
frame:SetScript('OnEnter', function(this) |
||||
self:FireEvent("OnEnter") |
||||
end) |
||||
frame:SetScript('OnLeave', function(this) |
||||
self:FireEvent("OnLeave") |
||||
end) |
||||
frame:SetScript("OnDisable", function(this) |
||||
self:FireEvent("OnDisable") |
||||
end) |
||||
frame:SetScript("OnEnable", function(this) |
||||
self:FireEvent("OnEnable") |
||||
end) |
||||
|
||||
fontString:SetPoint("TOPLEFT", check, "TOPRIGHT", 5, 2) |
||||
|
||||
-- ~~ Methods ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
for method, func in pairs(methods) do self[method] = func end |
||||
-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
return self |
||||
end |
||||
|
||||
DiesalGUI:RegisterObjectConstructor(TYPE,Constructor,VERSION) |
@ -1,93 +0,0 @@ |
||||
-- $Id: Tree.lua 60 2016-11-04 01:34:23Z diesal2010 $ |
||||
-- ~~| Libraries |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local DiesalGUI = LibStub("DiesalGUI-1.0") |
||||
local DiesalTools = LibStub("DiesalTools-1.0") |
||||
-- ~~| Lua Upvalues |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local sub, format, match, lower = string.sub, string.format, string.match, string.lower |
||||
local tsort = table.sort |
||||
|
||||
-- ~~| WoW Upvalues |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
|
||||
-- ~~| Tree |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local Type = "Tree" |
||||
local Version = 4 |
||||
-- ~~| Tree Stylesheets |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local Stylesheet = { |
||||
['content-background'] = { |
||||
type = 'texture', |
||||
color = 'ffffff', |
||||
alpha = .01, |
||||
}, |
||||
} |
||||
-- ~~| Tree Locals |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local function collapse(branch) |
||||
if branch.Collapse then branch:Collapse() end |
||||
if branch.children and next(branch.children) then |
||||
for i=1, #branch.children do |
||||
collapse(branch.children[i]) |
||||
end |
||||
end |
||||
end |
||||
-- ~~| Tree Methods |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local methods = { |
||||
['OnAcquire'] = function(self) |
||||
-- self:SetStylesheet(Stylesheet) |
||||
-- self:SetStylesheet(wireFrameSheet) |
||||
self:ApplySettings() |
||||
self:Show() |
||||
end, |
||||
['OnRelease'] = function(self) |
||||
|
||||
end, |
||||
['ApplySettings'] = function(self) |
||||
|
||||
end, |
||||
['UpdateHeight'] = function(self) |
||||
local height = 0 |
||||
|
||||
for i=1 , #self.children do |
||||
height = height + self.children[i].frame:GetHeight() |
||||
end |
||||
height = DiesalTools.Round(height) |
||||
|
||||
if self.settings.height ~= height then |
||||
|
||||
self.settings.height = height |
||||
self:SetHeight(height) |
||||
self:FireEvent("OnHeightChange",height) |
||||
end |
||||
end, |
||||
['CollapseAll'] = function(self, subBranches) |
||||
if subBranches then |
||||
collapse(self) |
||||
else |
||||
for i=1, #self.children do |
||||
self.children[i]:Collapse() |
||||
end |
||||
end |
||||
end, |
||||
['ExpandAll'] = function(self) |
||||
for i=1 , #self.children do |
||||
self.children[i]:Expand() |
||||
end |
||||
end, |
||||
} |
||||
-- ~~| Tree Constructor |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local function Constructor() |
||||
local self = DiesalGUI:CreateObjectBase(Type) |
||||
local frame = CreateFrame('Frame',nil,UIParent) |
||||
self.frame = frame |
||||
-- ~~ Default Settings ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
self.defaults = { depth = 0 } |
||||
-- ~~ Events ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
-- OnAcquire, OnRelease, OnHeightSet, OnWidthSet |
||||
-- OnHeightChange |
||||
-- ~~ Construct ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local content = self:CreateRegion("Frame", 'content', frame) |
||||
content:SetAllPoints() |
||||
-- ~~ Methods ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
for method, func in pairs(methods) do self[method] = func end |
||||
-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
return self |
||||
end |
||||
DiesalGUI:RegisterObjectConstructor(Type,Constructor,Version) |
@ -1,387 +0,0 @@ |
||||
-- $Id: Window.lua 60 2016-11-04 01:34:23Z diesal2010 $ |
||||
|
||||
local DiesalGUI = LibStub("DiesalGUI-1.0") |
||||
-- | Libraries |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local DiesalTools = LibStub("DiesalTools-1.0") |
||||
local DiesalStyle = LibStub("DiesalStyle-1.0") |
||||
local Colors = DiesalStyle.Colors |
||||
-- | Lua Upvalues |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local type, select, pairs, tonumber = type, select, pairs, tonumber |
||||
local floor, ceil = math.floor, math.ceil |
||||
-- | WoW Upvalues |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
-- | Window |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local Type = "Window" |
||||
local Version = 14 |
||||
-- ~~| Stylesheets |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local Stylesheet = { |
||||
['frame-outline'] = { |
||||
type = 'outline', |
||||
layer = 'BACKGROUND', |
||||
color = '000000', |
||||
}, |
||||
['frame-shadow'] = { |
||||
type = 'shadow', |
||||
}, |
||||
['titleBar-color'] = { |
||||
type = 'texture', |
||||
layer = 'BACKGROUND', |
||||
color = Colors.UI_400_GR[2], |
||||
alpha = .95, |
||||
}, |
||||
-- ['titleBar-background'] = { |
||||
-- type = 'texture', |
||||
-- layer = 'BACKGROUND', |
||||
-- gradient = {'VERTICAL',Colors.UI_400_GR[1],Colors.UI_400_GR[2]}, |
||||
-- alpha = .95, |
||||
-- position = {-1,-1,-1,0}, |
||||
-- }, |
||||
['titletext-Font'] = { |
||||
type = 'font', |
||||
color = 'd8d8d8', |
||||
}, |
||||
['closeButton-icon'] = { |
||||
type = 'texture', |
||||
layer = 'ARTWORK', |
||||
image = {'DiesalGUIcons', {9,5,16,256,128}}, |
||||
alpha = .3, |
||||
position = {-2,nil,-1,nil}, |
||||
width = 16, |
||||
height = 16, |
||||
}, |
||||
['closeButton-iconHover'] = { |
||||
type = 'texture', |
||||
layer = 'HIGHLIGHT', |
||||
image = {'DiesalGUIcons', {9,5,16,256,128}, 'b30000'}, |
||||
alpha = 1, |
||||
position = {-2,nil,-1,nil}, |
||||
width = 16, |
||||
height = 16, |
||||
}, |
||||
['header-background'] = { |
||||
type = 'texture', |
||||
layer = 'BACKGROUND', |
||||
gradient = {'VERTICAL',Colors.UI_400_GR[1],Colors.UI_400_GR[2]}, |
||||
alpha = .95, |
||||
position = {0,0,0,-1}, |
||||
}, |
||||
['header-inline'] = { |
||||
type = 'outline', |
||||
layer = 'BORDER', |
||||
gradient = {'VERTICAL','ffffff','ffffff'}, |
||||
alpha = {.05,.02}, |
||||
position = {0,0,0,-1}, |
||||
}, |
||||
['header-divider'] = { |
||||
type = 'texture', |
||||
layer = 'BORDER', |
||||
color = '000000', |
||||
alpha = 1, |
||||
position = {0,0,nil,0}, |
||||
height = 1, |
||||
}, |
||||
['content-background'] = { |
||||
type = 'texture', |
||||
layer = 'BACKGROUND', |
||||
color = Colors.UI_100, |
||||
alpha = .95, |
||||
}, |
||||
['content-outline'] = { |
||||
type = 'outline', |
||||
layer = 'BORDER', |
||||
color = 'FFFFFF', |
||||
alpha = .01 |
||||
}, |
||||
['footer-background'] = { |
||||
type = 'texture', |
||||
layer = 'BACKGROUND', |
||||
gradient = {'VERTICAL',Colors.UI_400_GR[1],Colors.UI_400_GR[2]}, |
||||
alpha = .95, |
||||
position = {0,0,-1,0}, |
||||
}, |
||||
['footer-divider'] = { |
||||
type = 'texture', |
||||
layer = 'BACKGROUND', |
||||
color = '000000', |
||||
position = {0,0,0,nil}, |
||||
height = 1, |
||||
}, |
||||
['footer-inline'] = { |
||||
type = 'outline', |
||||
layer = 'BORDER', |
||||
gradient = {'VERTICAL','ffffff','ffffff'}, |
||||
alpha = {.05,.02}, |
||||
position = {0,0,-1,0}, |
||||
debug = true, |
||||
}, |
||||
} |
||||
local wireFrame = { |
||||
['frame-white'] = { |
||||
type = 'outline', |
||||
layer = 'OVERLAY', |
||||
color = 'ffffff', |
||||
}, |
||||
['titleBar-yellow'] = { |
||||
type = 'outline', |
||||
layer = 'OVERLAY', |
||||
color = 'fffc00', |
||||
}, |
||||
['closeButton-orange'] = { |
||||
type = 'outline', |
||||
layer = 'OVERLAY', |
||||
color = 'ffd400', |
||||
}, |
||||
['header-blue'] = { |
||||
type = 'outline', |
||||
layer = 'OVERLAY', |
||||
color = '00aaff', |
||||
}, |
||||
['footer-green'] = { |
||||
type = 'outline', |
||||
layer = 'OVERLAY', |
||||
color = '55ff00', |
||||
}, |
||||
|
||||
} |
||||
local sizerWireFrame = { |
||||
['sizerR-yellow'] = { |
||||
type = 'outline', |
||||
layer = 'OVERLAY', |
||||
color = 'fffc00', |
||||
}, |
||||
['sizerB-green'] = { |
||||
type = 'outline', |
||||
layer = 'OVERLAY', |
||||
color = '55ff00', |
||||
}, |
||||
['sizerBR-blue'] = { |
||||
type = 'outline', |
||||
layer = 'OVERLAY', |
||||
color = '00aaff', |
||||
}, |
||||
} |
||||
-- | Window Locals |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local function round(num) |
||||
if num >= 0 then return floor(num+.5) |
||||
else return ceil(num-.5) end |
||||
end |
||||
|
||||
-- | Methods |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local methods = { |
||||
['OnAcquire'] = function(self) |
||||
self:ApplySettings() |
||||
self:SetStylesheet(Stylesheet) |
||||
-- self:SetStylesheet(sizerWireFrame) |
||||
self:Show() |
||||
end, |
||||
['OnRelease'] = function(self) end, |
||||
['SetTopLevel'] = function(self) |
||||
DiesalGUI:SetTopLevel(self.frame) |
||||
end, |
||||
['SetContentHeight'] = function(self, height) |
||||
local contentHeight = round(self.content:GetHeight()) |
||||
self.frame:SetHeight( (self.settings.height - contentHeight) + height ) |
||||
end, |
||||
['ApplySettings'] = function(self) |
||||
local settings = self.settings |
||||
local frame = self.frame |
||||
local titleBar = self.titleBar |
||||
local closeButton = self.closeButton |
||||
local header = self.header |
||||
local content = self.content |
||||
local footer = self.footer |
||||
|
||||
local headerHeight = settings.header and settings.headerHeight or 0 |
||||
local footerHeight = settings.footer and settings.footerHeight or 0 |
||||
|
||||
frame:SetMinResize(settings.minWidth,settings.minHeight) |
||||
frame:SetMaxResize(settings.maxWidth,settings.maxHeight) |
||||
|
||||
self:UpdatePosition() |
||||
self:UpdateSizers() |
||||
|
||||
titleBar:SetHeight(settings.titleBarHeight) |
||||
closeButton:SetHeight(settings.titleBarHeight) |
||||
closeButton:SetWidth(settings.titleBarHeight) |
||||
|
||||
content:SetPoint("TOPLEFT",settings.padding[1],-(settings.titleBarHeight + headerHeight)) |
||||
content:SetPoint("BOTTOMRIGHT",-settings.padding[2],footerHeight + settings.padding[4]) |
||||
header:SetHeight(headerHeight) |
||||
footer:SetHeight(footerHeight) |
||||
header[settings.header and "Show" or "Hide"](header) |
||||
footer[settings.footer and "Show" or "Hide"](footer) |
||||
|
||||
header:SetPoint("TOPLEFT",self.titleBar,"BOTTOMLEFT",settings.padding[1],0) |
||||
header:SetPoint("TOPRIGHT",self.titleBar,"BOTTOMRIGHT",-settings.padding[2],0) |
||||
|
||||
footer:SetPoint("BOTTOMLEFT",settings.padding[1],settings.padding[4]) |
||||
footer:SetPoint("BOTTOMRIGHT",-settings.padding[2],settings.padding[4]) |
||||
|
||||
end, |
||||
['UpdatePosition'] = function(self) |
||||
self.frame:ClearAllPoints() |
||||
if self.settings.top and self.settings.left then |
||||
self.frame:SetPoint("TOP",UIParent,"BOTTOM",0,self.settings.top) |
||||
self.frame:SetPoint("LEFT",UIParent,"LEFT",self.settings.left,0) |
||||
else |
||||
self.frame:SetPoint("CENTER",UIParent,"CENTER") |
||||
end |
||||
|
||||
self.frame:SetWidth(self.settings.width) |
||||
self.frame:SetHeight(self.settings.height) |
||||
end, |
||||
['UpdateSizers'] = function(self) |
||||
local settings = self.settings |
||||
|
||||
local frame = self.frame |
||||
local sizerB = self.sizerB |
||||
local sizerR = self.sizerR |
||||
local sizerBR = self.sizerBR |
||||
|
||||
sizerBR[settings.sizerBR and "Show" or "Hide"](sizerBR) |
||||
sizerBR:SetSize(settings.sizerBRWidth,settings.sizerBRHeight) |
||||
sizerB[settings.sizerB and "Show" or "Hide"](sizerB) |
||||
sizerB:SetHeight(settings.sizerHeight) |
||||
sizerB:SetPoint("BOTTOMRIGHT",frame,"BOTTOMRIGHT",-settings.sizerBRWidth,0) |
||||
sizerR[settings.sizerR and "Show" or "Hide"](sizerR) |
||||
sizerR:SetWidth(settings.sizerWidth) |
||||
sizerR:SetPoint("TOPRIGHT",frame,"TOPRIGHT",0,-settings.titleBarHeight) |
||||
sizerR:SetPoint("BOTTOMRIGHT",frame,"BOTTOMRIGHT",0,settings.sizerBRHeight) |
||||
end, |
||||
['SetTitle'] = function(self,title,subtitle) |
||||
local settings = self.settings |
||||
settings.title = title or settings.title |
||||
settings.subTitle = subtitle or settings.subTitle |
||||
self.titletext:SetText(('%s |cff7f7f7f%s'):format(settings.title,settings.subTitle)) |
||||
end, |
||||
} |
||||
-- | Constructor |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local function Constructor() |
||||
local self = DiesalGUI:CreateObjectBase(Type) |
||||
local frame = CreateFrame('Frame',nil,UIParent) |
||||
self.frame = frame |
||||
self.defaults = { |
||||
height = 300, |
||||
width = 500, |
||||
minHeight = 200, |
||||
minWidth = 200, |
||||
maxHeight = 9999, |
||||
maxWidth = 9999, |
||||
left = nil, |
||||
top = nil, |
||||
titleBarHeight= 18, |
||||
title = '', |
||||
subTitle = '', |
||||
padding = {1,1,0,1}, |
||||
header = false, |
||||
headerHeight = 21, |
||||
footer = false, |
||||
footerHeight = 21, |
||||
sizerR = true, |
||||
sizerB = true, |
||||
sizerBR = true, |
||||
sizerWidth = 6, |
||||
sizerHeight = 6, |
||||
sizerBRHeight = 6, |
||||
sizerBRWidth = 6, |
||||
} |
||||
-- ~~ Events ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
-- OnAcquire, OnRelease, OnHeightSet, OnWidthSet |
||||
-- OnSizeChanged, OnDragStop, OnHide, OnShow, OnClose |
||||
-- ~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
frame:EnableMouse() |
||||
frame:SetMovable(true) |
||||
frame:SetResizable(true) |
||||
frame:SetScript("OnMouseDown", function(this,button) |
||||
DiesalGUI:OnMouse(this,button) |
||||
end) |
||||
frame:SetScript("OnSizeChanged", function(this,width,height) |
||||
self.settings.width = DiesalTools.Round(width) |
||||
self.settings.height = DiesalTools.Round(height) |
||||
|
||||
self:FireEvent( "OnSizeChanged", self.settings.width, self.settings.height ) |
||||
end) |
||||
frame:SetScript("OnHide",function(this) |
||||
self:FireEvent("OnHide") |
||||
end) |
||||
frame:SetScript("OnShow",function(this) |
||||
self:FireEvent("OnShow") |
||||
end) |
||||
frame:SetToplevel(true) |
||||
frame.obj = self |
||||
local titleBar = self:CreateRegion("Button", 'titleBar', frame) |
||||
titleBar:SetPoint("TOPLEFT") |
||||
titleBar:SetPoint("TOPRIGHT") |
||||
titleBar:EnableMouse() |
||||
titleBar:SetScript("OnMouseDown",function(this,button) |
||||
DiesalGUI:OnMouse(this,button) |
||||
frame:StartMoving() |
||||
end) |
||||
titleBar:SetScript("OnMouseUp", function(this) |
||||
frame:StopMovingOrSizing() |
||||
|
||||
self.settings.top = DiesalTools.Round(frame:GetTop()) |
||||
self.settings.left = DiesalTools.Round(frame:GetLeft()) |
||||
|
||||
self:UpdatePosition() |
||||
self:FireEvent( "OnDragStop", self.settings.left, self.settings.top ) |
||||
end) |
||||
local closeButton = self:CreateRegion("Button", 'closeButton', titleBar) |
||||
closeButton:SetPoint("TOPRIGHT", -1, 1) |
||||
closeButton:SetScript("OnClick", function(this,button) |
||||
DiesalGUI:OnMouse(this,button) |
||||
--PlaySound("gsTitleOptionExit") |
||||
self:FireEvent("OnClose") |
||||
self:Hide() |
||||
end) |
||||
local titletext = self:CreateRegion("FontString", 'titletext', titleBar) |
||||
titletext:SetWordWrap(false) |
||||
titletext:SetPoint("TOPLEFT", 4, -5) |
||||
titletext:SetPoint("TOPRIGHT", -20, -5) |
||||
titletext:SetJustifyH("TOP") |
||||
titletext:SetJustifyH("LEFT") |
||||
|
||||
self:CreateRegion("Frame", 'header', frame) |
||||
self:CreateRegion("Frame", 'content', frame) |
||||
self:CreateRegion("Frame", 'footer', frame) |
||||
|
||||
local sizerBR = self:CreateRegion("Frame", 'sizerBR', frame) |
||||
sizerBR:SetPoint("BOTTOMRIGHT",frame,"BOTTOMRIGHT",0,0) |
||||
sizerBR:EnableMouse() |
||||
sizerBR:SetScript("OnMouseDown",function(this,button) |
||||
DiesalGUI:OnMouse(this,button) |
||||
frame:StartSizing("BOTTOMRIGHT") |
||||
end) |
||||
sizerBR:SetScript("OnMouseUp", function(this) |
||||
frame:StopMovingOrSizing() |
||||
self:UpdatePosition() |
||||
self:FireEvent( "OnSizeStop", self.settings.width, self.settings.height ) |
||||
end) |
||||
local sizerB = self:CreateRegion("Frame", 'sizerB', frame) |
||||
sizerB:SetPoint("BOTTOMLEFT",frame,"BOTTOMLEFT",0,0) |
||||
sizerB:EnableMouse() |
||||
sizerB:SetScript("OnMouseDown",function(this,button) |
||||
DiesalGUI:OnMouse(this,button) |
||||
frame:StartSizing("BOTTOM") |
||||
end) |
||||
sizerB:SetScript("OnMouseUp", function(this) |
||||
frame:StopMovingOrSizing() |
||||
self:UpdatePosition() |
||||
self:FireEvent( "OnSizeStop", self.settings.width, self.settings.height ) |
||||
end) |
||||
local sizerR = self:CreateRegion("Frame", 'sizerR', frame) |
||||
sizerR:EnableMouse() |
||||
sizerR:SetScript("OnMouseDown",function(this,button) |
||||
DiesalGUI:OnMouse(this,button) |
||||
frame:StartSizing("RIGHT") |
||||
end) |
||||
sizerR:SetScript("OnMouseUp", function(this) |
||||
frame:StopMovingOrSizing() |
||||
self:UpdatePosition() |
||||
self:FireEvent( "OnSizeStop", self.settings.width, self.settings.height ) |
||||
end) |
||||
-- ~~ Methods ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
for method, func in pairs(methods) do self[method] = func end |
||||
-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
return self |
||||
end |
||||
DiesalGUI:RegisterObjectConstructor(Type,Constructor,Version) |
@ -0,0 +1,360 @@ |
||||
local MAJOR, MINOR = "DiesalGUI-2.0", 1 |
||||
|
||||
---@alias Diesal.GUI DiesalGUI-2.0 |
||||
|
||||
---@class DiesalGUI-2.0 |
||||
---@field ObjectBase Diesal.GUI.ObjectBase.Methods |
||||
---@field ObjectFactory Diesal.GUI.Object.Factory |
||||
---@field ObjectVersions Diesal.GUI.Object.Versions |
||||
---@field ObjectPool Diesal.GUI.Object.Pool |
||||
---@field counts Diesal.GUI.Object.Counts |
||||
local DiesalGUI, oldMinor = LibStub:NewLibrary(MAJOR, MINOR) |
||||
if not DiesalGUI then |
||||
return |
||||
end |
||||
|
||||
local DiesalGUIDebug = false |
||||
|
||||
local DiesalGUIDebugRedFont = RED_FONT_COLOR or CreateColor(1, 0.12549020349979, 0.12549020349979, 1) |
||||
local DiesalGUIDebugWhiteFont = WHITE_FONT_COLOR or CreateColor(1, 1, 1, 1) |
||||
|
||||
local DiesalGUIDebugPrint = function(...) |
||||
if not DiesalGUIDebug then |
||||
return |
||||
end |
||||
local args = { ... } |
||||
local msgPrefix = DiesalGUIDebugRedFont:WrapTextInColorCode("[DiesalGUI Debug]: ") |
||||
local str = "" |
||||
for i = 1, #args do |
||||
str = str .. tostring(args[i]) .. " " |
||||
end |
||||
print(msgPrefix .. DiesalGUIDebugWhiteFont:WrapTextInColorCode(str)) |
||||
end |
||||
|
||||
---@class Diesal.GUI.Padding : { [1]: left, [2]: right, [3]: top, [4]: bottom } |
||||
|
||||
---@alias Diesal.Object.Constructed DiesalAccordian | DiesalAccordianSection | DiesalBar | DiesalBranch | DiesalButton | DiesalCheckBox | DiesalComboBox | DiesalComboBoxItem | DiesalDropDown | DiesalDropDownItem | DiesalInput | DiesalQuickDoc | DiesalScrollFrame | DiesalScrollingEditBox | DiesalScrollingMessageFrame | DiesalSpinner | DiesalText | DiesalTree | DiesalWindow |
||||
---@alias Diesal.Container Diesal.GUI.Object.Window | Diesal.GUI.Object.Accordian |
||||
---@alias Diesal.Container.Contents DiesalAccordian | DiesalAccordianSection | DiesalBar | DiesalBranch | DiesalButton | DiesalCheckBox | DiesalComboBox | DiesalComboBoxItem | DiesalDropDown | DiesalDropDownItem | FontString | DiesalInput | DiesalQuickDoc | DiesalScrollFrame | DiesalScrollingEditBox | DiesalScrollingMessageFrame | DiesalSpinner | DiesalTree | DiesalText | DiesalWindow | Diesal.GUI.ObjectBase |
||||
|
||||
DiesalGUI.Debug = { |
||||
Print = DiesalGUIDebugPrint, |
||||
Enabled = DiesalGUIDebug, |
||||
RedFont = DiesalGUIDebugRedFont, |
||||
WhiteFont = DiesalGUIDebugWhiteFont, |
||||
} |
||||
|
||||
local CallbackHandler = LibStub("CallbackHandler-1.0") |
||||
|
||||
local DiesalTools = LibStub("DiesalTools-2.0") |
||||
local DiesalStyle = LibStub("DiesalStyle-2.0") |
||||
|
||||
local type, select, tonumber = type, select, tonumber |
||||
local setmetatable, getmetatable, next = setmetatable, getmetatable, next |
||||
local pairs, ipairs = pairs, ipairs |
||||
local tinsert, tremove = table.insert, table.remove |
||||
|
||||
local CreateFrame, UIParent = CreateFrame, UIParent |
||||
|
||||
DiesalGUI.callbacks = DiesalGUI.callbacks or CallbackHandler:New(DiesalGUI) |
||||
|
||||
---@class Diesal.GUI.Object.Factory : { [Diesal.Object.Type]: fun(name?: string): Diesal.Object } |
||||
DiesalGUI.ObjectFactory = DiesalGUI.ObjectFactory or {} |
||||
|
||||
---@class Diesal.GUI.Object.Versions : { [Diesal.Object.Type]: number } |
||||
DiesalGUI.ObjectVersions = DiesalGUI.ObjectVersions or {} |
||||
|
||||
---@class Diesal.GUI.Object.Pool : { [Diesal.Object.Type]: { [Diesal.Object]: boolean } } |
||||
DiesalGUI.ObjectPool = DiesalGUI.ObjectPool or {} |
||||
|
||||
---@class Diesal.GUI.Object.Counts : { [Diesal.Object.Type]: number } |
||||
DiesalGUI.counts = DiesalGUI.counts or {} |
||||
|
||||
---@class Diesal.GUI.Object.AntiPool : { [Diesal.Object.Type]: boolean } |
||||
DiesalGUI.AntiPool = DiesalGUI.AntiPool or {} |
||||
|
||||
local ObjectFactory = DiesalGUI.ObjectFactory |
||||
local ObjectVersions = DiesalGUI.ObjectVersions |
||||
local ObjectPool = DiesalGUI.ObjectPool |
||||
|
||||
local function OnMouse(frame, button) |
||||
DiesalGUI:ClearFocus() |
||||
end |
||||
|
||||
-- Capture mouse clicks on the WorldFrame |
||||
---@param frame Frame |
||||
---@param button Button |
||||
local function WorldFrameOnMouse(frame, button) |
||||
OnMouse(frame, button) |
||||
end |
||||
|
||||
---@alias Diesal.Object |
||||
---|DiesalAccordian |
||||
---|DiesalAccordianSection |
||||
---|DiesalBar |
||||
---|DiesalBranch |
||||
---|DiesalButton |
||||
---|DGUIBuilder.Container |
||||
---|DiesalCheckBox |
||||
---|DiesalComboBox |
||||
---|DiesalComboBoxItem |
||||
---|DiesalDropDown |
||||
---|DiesalDropDownItem |
||||
---|DiesalInput |
||||
---|DiesalObjectBase |
||||
---|DiesalQuickDoc |
||||
---|DiesalScrollFrame |
||||
---|DiesalScrollingEditBox |
||||
---|DiesalScrollingMessageFrame |
||||
---|DiesalSpinner |
||||
---|DiesalText |
||||
---|DiesalTree |
||||
---|DiesalWindow |
||||
|
||||
---@diagnostic disable-next-line: undefined-field |
||||
_G.WorldFrame:HookScript("OnMouseDown", WorldFrameOnMouse) |
||||
|
||||
-- Objects (widgets) that are defined for use in DiesalGUI |
||||
---@alias Diesal.Object.Type |
||||
---|'"DiesalAccordian"' |
||||
---|'"DiesalAccordianSection"' |
||||
---|'"DiesalBar"' |
||||
---|'"DiesalBranch"' |
||||
---|'"DiesalButton"' |
||||
---|'"DiesalCheckBox"' |
||||
---|'"DiesalComboBox"' |
||||
---|'"DiesalComboBoxItem"' |
||||
---|'"DiesalDropDown"' |
||||
---|'"DiesalDropDownItem"' |
||||
---|'"DiesalInput"' |
||||
---|'"DiesalObjectBase"' |
||||
---|'"DiesalQuickDoc"' |
||||
---|'"DiesalScrollFrame"' |
||||
---|'"DiesalScrollingEditBox"' |
||||
---|'"DiesalScrollingMessageFrame"' |
||||
---|'"DiesalSpinner"' |
||||
---|'"DiesalText"' |
||||
---|'"DiesalTree"' |
||||
---|'"DiesalWindow"' |
||||
---|'"Container"' |
||||
---|'"VerticalLayout"' |
||||
|
||||
-- Returns a new object |
||||
---@generic T |
||||
---@param objectType `T` | Diesal.Object.Type |
||||
---@param base? boolean |
||||
---@return T newObj |
||||
local function newObject(objectType, base) |
||||
if not ObjectFactory[objectType] then |
||||
error("Attempt to construct unknown Object type", 2) |
||||
end |
||||
|
||||
if base then |
||||
return ObjectFactory.DiesalObjectBase(objectType) |
||||
end |
||||
|
||||
ObjectPool[objectType] = ObjectPool[objectType] or {} |
||||
|
||||
local newObj = next(ObjectPool[objectType]) |
||||
if not newObj then |
||||
newObj = ObjectFactory[objectType]() |
||||
else |
||||
ObjectPool[objectType][newObj] = nil |
||||
end |
||||
|
||||
return newObj |
||||
end |
||||
|
||||
-- Releases an object into ReleasedObjects |
||||
---@param obj Diesal.Object |
||||
---@param objectType Diesal.Object.Type |
||||
local function releaseObject(obj, objectType) |
||||
ObjectPool[objectType] = ObjectPool[objectType] or {} |
||||
|
||||
if ObjectPool[objectType][obj] then |
||||
error("Attempt to Release Object that is already released", 2) |
||||
end |
||||
ObjectPool[objectType][obj] = true |
||||
end |
||||
|
||||
-- Registers an Object constructor in the ObjectFactory |
||||
---@generic T : Diesal.Object.Type |
||||
---@param Type `T` |
||||
---@param constructor fun(name: string): T |
||||
---@param version number |
||||
function DiesalGUI:RegisterObjectConstructor(Type, constructor, version) |
||||
assert(type(constructor) == "function") |
||||
assert(type(version) == "number") |
||||
|
||||
local oldVersion = ObjectVersions[Type] |
||||
if oldVersion and oldVersion >= version then |
||||
return |
||||
end |
||||
|
||||
ObjectVersions[Type] = version |
||||
ObjectFactory[Type] = constructor |
||||
end |
||||
|
||||
--[[ -- Registers an Object constructor in the ObjectFactory |
||||
---@generic T : Diesal.Object.Type |
||||
---@param Type `T` |
||||
---@param constructor fun(self: Diesal.GUI, type: string | Diesal.Object.Type): Diesal.GUI.ObjectBase |
||||
---@param version number |
||||
function DiesalGUI:RegisterObjectBaseConstructor(Type, constructor, version) |
||||
assert(type(constructor) == "function") |
||||
assert(type(version) == "number") |
||||
|
||||
local oldVersion = ObjectVersions[Type] |
||||
if oldVersion and oldVersion >= version then |
||||
return |
||||
end |
||||
|
||||
ObjectVersions[Type] = version |
||||
ObjectFactory[Type] = constructor |
||||
|
||||
self.CreateObjectBase = constructor |
||||
end ]] |
||||
|
||||
-- Create a new Object |
||||
---@generic T |
||||
---@param objectType `T` | Diesal.Object.Type |
||||
---@param name? string | boolean |
||||
---@param methods? table |
||||
---@return T object |
||||
function DiesalGUI:Create(objectType, name, methods) |
||||
local base = (name ~= nil and type(name) == "boolean") and name or nil |
||||
local name = (name ~= nil and type(name) == "string") and name or nil |
||||
if ObjectFactory[objectType] then |
||||
local object |
||||
if name then -- needs a specific name, bypass the objectPool and create a new object |
||||
object = ObjectFactory[objectType](name) |
||||
else |
||||
object = newObject(objectType, base) |
||||
end |
||||
object:SetMethods(methods) |
||||
object:ResetSettings() |
||||
-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
if object.OnAcquire then |
||||
object:OnAcquire() |
||||
end |
||||
return object |
||||
---@diagnostic disable-next-line: missing-return |
||||
end |
||||
end |
||||
|
||||
---@param duration number |
||||
---@param callback fun(...) |
||||
function DiesalGUI:CreateThrottle(duration, callback) |
||||
assert(callback and type(callback) == "function", "callback has to be a function ") |
||||
assert(duration and type(duration) == "number", "duration has to be a number ") |
||||
|
||||
---@class Throttle : AnimationGroup, Object, FrameScriptObject |
||||
local throttle = CreateFrame("Frame", nil, UIParent):CreateAnimationGroup() |
||||
throttle.anim = throttle:CreateAnimation("Animation") |
||||
throttle.args = {} |
||||
|
||||
local mt = getmetatable(throttle) |
||||
---@cast mt Throttle, metatable |
||||
|
||||
mt.__index.SetCallback = function(this, callback) |
||||
assert(callback and type(callback) == "function", "callback required to be a function ") |
||||
this:SetScript("OnFinished", function() |
||||
callback(unpack(this.args)) |
||||
end) |
||||
end |
||||
|
||||
mt.__index.AddCallback = function(this, callback) |
||||
assert(callback and type(callback) == "function", "callback required to be a function ") |
||||
this:HookScript("OnFinished", function() |
||||
callback(unpack(this.args)) |
||||
end) |
||||
end |
||||
|
||||
mt.__index.SetDuration = function(this, callback) |
||||
assert(callback and type(callback) == "number", "duration has to be a number ") |
||||
this.anim:SetDuration(callback) |
||||
end |
||||
|
||||
mt.__call = function(this, ...) |
||||
this.args = { ... } |
||||
this:Stop() |
||||
this:Play() |
||||
end |
||||
|
||||
throttle = setmetatable(throttle, mt) |
||||
|
||||
throttle:SetScript("OnFinished", function() |
||||
callback(unpack(throttle.args)) |
||||
end) |
||||
throttle:SetDuration(duration) |
||||
|
||||
return throttle |
||||
end |
||||
|
||||
---@param object Diesal.Object |
||||
function DiesalGUI:Release(object) |
||||
if object.OnRelease then |
||||
object:OnRelease() |
||||
end |
||||
|
||||
object:FireEvent("OnRelease") |
||||
|
||||
object:ReleaseChildren() |
||||
object:ReleaseTextures() |
||||
object:ResetFonts() |
||||
object:ResetEventListeners() |
||||
|
||||
object.frame:ClearAllPoints() |
||||
object.frame:Hide() |
||||
object.frame:SetParent(UIParent) |
||||
releaseObject(object, object.type) |
||||
end |
||||
|
||||
---@alias Diesal.GUI.Object.Focusable |
||||
---|Diesal.GUI.Object.ComboBox |
||||
---|Diesal.GUI.Object.DropDown |
||||
|
||||
-- Set FocusedObject: Menu, Dropdown, editBox etc.... |
||||
---@param object Diesal.GUI.Object.Focusable |
||||
function DiesalGUI:SetFocus(object) |
||||
if self.FocusedObject and self.FocusedObject ~= object then |
||||
DiesalGUI:ClearFocus() |
||||
end |
||||
self.FocusedObject = object |
||||
end |
||||
|
||||
-- Clear focus from the FocusedObject |
||||
function DiesalGUI:ClearFocus() |
||||
local FocusedObject = self.FocusedObject |
||||
if FocusedObject then |
||||
if FocusedObject.ClearFocus then -- FocusedObject is Focusable Frame |
||||
FocusedObject:ClearFocus() |
||||
end |
||||
self.FocusedObject = nil |
||||
end |
||||
end |
||||
|
||||
-- Mouse Input capture for any DiesalGUI interactive region |
||||
---@param frame Frame |
||||
---@param button MouseButton | "MouseWheel" |
||||
function DiesalGUI:OnMouse(frame, button) |
||||
-- print(button) |
||||
OnMouse(frame, button) |
||||
DiesalGUI.callbacks:Fire("DiesalGUI_OnMouse", frame, button) |
||||
end |
||||
|
||||
--- A type-based counter to count the number of widgets created. |
||||
---@param objectType Diesal.Object.Type |
||||
function DiesalGUI:GetNextObjectNum(objectType) |
||||
if not self.counts[objectType] then |
||||
self.counts[objectType] = 0 |
||||
end |
||||
self.counts[objectType] = self.counts[objectType] + 1 |
||||
return self.counts[objectType] |
||||
end |
||||
|
||||
--- Return the number of created widgets for this type. |
||||
---@param objectType Diesal.Object.Type |
||||
function DiesalGUI:GetObjectCount(objectType) |
||||
return self.counts[objectType] or 0 |
||||
end |
@ -0,0 +1,25 @@ |
||||
<Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
||||
xsi:schemaLocation="http://www.blizzard.com/wow/ui/ ..\FrameXML\UI.xsd"> |
||||
<Script file="DiesalGUI-2.0.lua" /> |
||||
<!-- Objects --> |
||||
<Script file="Objects\ObjectBase.lua" /> |
||||
<Script file="Objects\Window.lua" /> |
||||
<Script file="Objects\ScrollFrame.lua" /> |
||||
<Script file="Objects\ScrollingEditBox.lua" /> |
||||
<Script file="Objects\ScrollingMessageFrame.lua" /> |
||||
<Script file="Objects\CheckBox.lua" /> |
||||
<Script file="Objects\Button.lua" /> |
||||
<Script file="Objects\Spinner.lua" /> |
||||
<Script file="Objects\Input.lua" /> |
||||
<Script file="Objects\Dropdown.lua" /> |
||||
<Script file="Objects\DropdownItem.lua" /> |
||||
<Script file="Objects\ComboBox.lua" /> |
||||
<Script file="Objects\ComboBoxItem.lua" /> |
||||
<Script file="Objects\Accordian.lua" /> |
||||
<Script file="Objects\AccordianSection.lua" /> |
||||
<Script file="Objects\Text.lua" /> |
||||
<Script file="Objects\Tree.lua" /> |
||||
<Script file="Objects\Branch.lua" /> |
||||
<Script file="Objects\Bar.lua" /> |
||||
<Script file="Objects\Toggle.lua" /> |
||||
</Ui> |
@ -0,0 +1,82 @@ |
||||
---@type Diesal.GUI |
||||
local DiesalGUI = LibStub("DiesalGUI-2.0") |
||||
---@type Diesal.Tools |
||||
local DiesalTools = LibStub("DiesalTools-2.0") |
||||
---@type Diesal.Style |
||||
local DiesalStyle = LibStub("DiesalStyle-2.0") |
||||
|
||||
local Type = "DiesalAccordian" |
||||
|
||||
local Version = 2 |
||||
|
||||
---@type Diesal.Style.Stylesheet |
||||
local Stylesheet = { |
||||
["frame-background"] = { |
||||
type = "texture", |
||||
color = "FF0000", |
||||
}, |
||||
} |
||||
|
||||
---@class Diesal.GUI.Accordian.Methods |
||||
local methods = { |
||||
|
||||
---@param self DiesalAccordian |
||||
OnAcquire = function(self) |
||||
-- self:SetStylesheet(Stylesheet) |
||||
-- self:SetStylesheet(wireFrameSheet) |
||||
self:ResetSettings(true) |
||||
self:Show() |
||||
end, |
||||
|
||||
---@param self DiesalAccordian |
||||
OnRelease = function(self) end, |
||||
|
||||
---@param self DiesalAccordian |
||||
ApplySettings = function(self) end, |
||||
|
||||
---@param self DiesalAccordian |
||||
CollapseAll = function(self) |
||||
for i = 1, #self.children do |
||||
self.children[i]:Collapse() |
||||
end |
||||
end, |
||||
|
||||
---@param self DiesalAccordian |
||||
ExpandAll = function(self) |
||||
for i = 1, #self.children do |
||||
self.children[i]:Expand() |
||||
end |
||||
end, |
||||
} |
||||
|
||||
---@class DiesalAccordian : Diesal.GUI.Object.Accordian |
||||
|
||||
local function Constructor() |
||||
---@class Diesal.GUI.Object.Accordian : Diesal.GUI.ObjectBase, Diesal.GUI.Accordian.Methods |
||||
---@field content Frame |
||||
---@field children DiesalAccordianSection[] |
||||
local self = DiesalGUI:Create(Type, true) |
||||
|
||||
self.isContainer = true |
||||
|
||||
local frame = CreateFrame("Frame", nil, UIParent) |
||||
self.frame = frame |
||||
|
||||
self.defaults = {} |
||||
-- Events |
||||
-- OnAcquire, OnRelease, OnHeightSet, OnWidthSet |
||||
-- OnHeightChange |
||||
|
||||
local content = self:CreateRegion("Frame", "content", frame) |
||||
content:SetAllPoints() |
||||
|
||||
-- ~~ Methods ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
self:SetMethods(methods) |
||||
--[[ for method, func in pairs(methods) do |
||||
self[method] = func |
||||
end ]] |
||||
-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
|
||||
return self |
||||
end |
||||
DiesalGUI:RegisterObjectConstructor(Type, Constructor, Version) |
@ -0,0 +1,264 @@ |
||||
---@type Diesal.GUI |
||||
local DiesalGUI = LibStub("DiesalGUI-2.0") |
||||
---@type Diesal.Tools |
||||
local DiesalTools = LibStub("DiesalTools-2.0") |
||||
---@type Diesal.Style |
||||
local DiesalStyle = LibStub("DiesalStyle-2.0") |
||||
|
||||
local Colors = DiesalStyle.Colors |
||||
local HSL, ShadeColor, TintColor = DiesalTools.HSL, DiesalTools.ShadeColor, DiesalTools.TintColor |
||||
|
||||
local Type = "DiesalAccordianSection" |
||||
local Version = 3 |
||||
|
||||
---@type Diesal.Style.Stylesheet |
||||
local Stylesheet = { |
||||
["button-background"] = { |
||||
type = "texture", |
||||
layer = "BACKGROUND", |
||||
gradient = { "VERTICAL", Colors.UI_400_GR[1], Colors.UI_400_GR[2] }, |
||||
alpha = 0.95, |
||||
position = { 0, 0, -1, 0 }, |
||||
}, |
||||
["button-outline"] = { |
||||
type = "outline", |
||||
layer = "BACKGROUND", |
||||
color = "000000", |
||||
position = { 1, 1, 0, 1 }, |
||||
}, |
||||
["button-inline"] = { |
||||
type = "outline", |
||||
layer = "ARTWORK", |
||||
gradient = { "VERTICAL", "ffffff", "ffffff" }, |
||||
alpha = { 0.03, 0.02 }, |
||||
position = { 0, 0, -1, 0 }, |
||||
}, |
||||
["button-hover"] = { |
||||
type = "texture", |
||||
layer = "HIGHLIGHT", |
||||
color = "ffffff", |
||||
alpha = 0.1, |
||||
}, |
||||
["button-leftExpandIcon"] = { |
||||
type = "texture", |
||||
position = { 0, nil, -1, nil }, |
||||
height = 16, |
||||
width = 16, |
||||
image = { "DiesalGUIcons", { 3, 6, 16, 256, 128 }, HSL(Colors.UI_Hue, Colors.UI_Saturation, 0.65) }, |
||||
alpha = 1, |
||||
}, |
||||
["button-leftCollapseIcon"] = { |
||||
type = "texture", |
||||
position = { 0, nil, -1, nil }, |
||||
height = 16, |
||||
width = 16, |
||||
image = { "DiesalGUIcons", { 4, 6, 16, 256, 128 }, HSL(Colors.UI_Hue, Colors.UI_Saturation, 0.65) }, |
||||
alpha = 1, |
||||
}, |
||||
["content-background"] = { |
||||
type = "texture", |
||||
layer = "BACKGROUND", |
||||
color = Colors.UI_300, |
||||
alpha = 0.95, |
||||
position = { 0, 0, -1, 0 }, |
||||
}, |
||||
["content-topShadow"] = { |
||||
type = "texture", |
||||
layer = "ARTWORK", |
||||
gradient = { "VERTICAL", "000000", "000000" }, |
||||
alpha = { 0.05, 0 }, |
||||
position = { 0, 0, -1, nil }, |
||||
height = 4, |
||||
}, |
||||
["content-bottomShadow"] = { |
||||
type = "texture", |
||||
layer = "ARTWORK", |
||||
gradient = { "VERTICAL", "000000", "000000" }, |
||||
alpha = { 0, 0.05 }, |
||||
position = { 0, 0, nil, 0 }, |
||||
height = 4, |
||||
}, |
||||
["content-inline"] = { |
||||
type = "outline", |
||||
layer = "ARTWORK", |
||||
color = "ffffff", |
||||
alpha = 0.02, |
||||
position = { 0, 0, -1, 0 }, |
||||
}, |
||||
["text-Font"] = { |
||||
type = "font", |
||||
color = Colors.UI_F450, |
||||
}, |
||||
} |
||||
|
||||
local wireFrameSheet = { |
||||
["frame-white"] = { |
||||
type = "outline", |
||||
layer = "OVERLAY", |
||||
color = "ffffff", |
||||
alpha = 1, |
||||
}, |
||||
["button-purple"] = { |
||||
type = "outline", |
||||
layer = "OVERLAY", |
||||
color = "aa00ff", |
||||
alpha = 0.5, |
||||
}, |
||||
["content-yellow"] = { |
||||
type = "outline", |
||||
layer = "OVERLAY", |
||||
color = "fffc00", |
||||
alpha = 0.5, |
||||
}, |
||||
} |
||||
|
||||
---@class Diesal.GUI.Accordian.Section.Methods |
||||
local methods = { |
||||
|
||||
---@param self DiesalAccordianSection |
||||
OnAcquire = function(self) |
||||
self:SetStylesheet(Stylesheet) |
||||
self:Show() |
||||
end, |
||||
|
||||
---@param self DiesalAccordianSection |
||||
OnRelease = function(self) end, |
||||
|
||||
---@param self DiesalAccordianSection |
||||
ApplySettings = function(self) |
||||
self.button:SetHeight(self.settings.buttonHeight) |
||||
-- postion |
||||
self:ClearAllPoints() |
||||
if self.settings.position == 1 then |
||||
self:SetPoint("TOPLEFT") |
||||
self:SetPoint("RIGHT") |
||||
else |
||||
local anchor = self.settings.parentObject.children[self.settings.position - 1].frame |
||||
self:SetPoint("TOPLEFT", anchor, "BOTTOMLEFT", 0, 0) |
||||
self:SetPoint("RIGHT") |
||||
end |
||||
-- set section name |
||||
self.text:SetText(self.settings.sectionName) |
||||
-- set section state |
||||
self[self.settings.expanded and "Expand" or "Collapse"](self) |
||||
-- set button visibility |
||||
self:SetButton(self.settings.button) |
||||
end, |
||||
|
||||
---@param self DiesalAccordianSection |
||||
Collapse = function(self) |
||||
if not self.settings.button then |
||||
self:UpdateHeight() |
||||
return |
||||
end |
||||
self.settings.expanded = false |
||||
self:FireEvent("OnStateChange", self.settings.position, "Collapse") |
||||
self.textures["button-leftCollapseIcon"]:SetAlpha(self.textures["button-leftCollapseIcon"].style.alpha[1]) |
||||
self.textures["button-leftExpandIcon"]:SetAlpha(0) |
||||
self.content:Hide() |
||||
self:UpdateHeight() |
||||
end, |
||||
|
||||
---@param self DiesalAccordianSection |
||||
Expand = function(self) |
||||
self.settings.expanded = true |
||||
self:FireEvent("OnStateChange", self.settings.position, "Expand") |
||||
self.textures["button-leftExpandIcon"]:SetAlpha(self.textures["button-leftExpandIcon"].style.alpha[1]) |
||||
self.textures["button-leftCollapseIcon"]:SetAlpha(0) |
||||
self.content:Show() |
||||
self:UpdateHeight() |
||||
end, |
||||
|
||||
---@param self DiesalAccordianSection |
||||
---@param state boolean |
||||
SetButton = function(self, state) |
||||
self.settings.button = state |
||||
self.button[state and "Show" or "Hide"](self.button) |
||||
if not state then |
||||
self:Expand() |
||||
else |
||||
self:UpdateHeight() |
||||
end |
||||
end, |
||||
|
||||
---@param self DiesalAccordianSection | Diesal.GUI.Object.Accordian.Section |
||||
UpdateHeight = function(self) |
||||
local settings, children = self.settings, self.children |
||||
local contentHeight = 0 |
||||
self.content:SetPoint("TOPLEFT", self.frame, 0, settings.button and -settings.buttonHeight or 0) |
||||
|
||||
if settings.expanded then |
||||
contentHeight = settings.contentPadding[3] + settings.contentPadding[4] |
||||
for i = 1, #children do |
||||
contentHeight = contentHeight + children[i].frame:GetHeight() |
||||
end |
||||
end |
||||
self.content:SetHeight(contentHeight) |
||||
self:SetHeight((settings.button and settings.buttonHeight or 0) + contentHeight) |
||||
self:FireEvent("OnHeightChange", contentHeight) |
||||
end, |
||||
} |
||||
|
||||
---@class DiesalAccordianSection : Diesal.GUI.Object.Accordian.Section |
||||
|
||||
---@class Diesal.GUI.Object.Accordian.Section.Settings.Default |
||||
---@field button boolean |
||||
---@field contentPadding Diesal.GUI.Padding |
||||
---@field expanded boolean |
||||
---@field buttonHeight number |
||||
|
||||
---@class Diesal.GUI.Object.Accordian.Section.Settings : Diesal.GUI.Object.Accordian.Section.Settings.Default |
||||
---@field sectionName string |
||||
---@field position number |
||||
---@field parentObject Diesal.GUI.Object.Accordian |
||||
|
||||
local function Constructor() |
||||
---@class Diesal.GUI.Object.Accordian.Section : Diesal.GUI.ObjectBase, Diesal.GUI.Accordian.Section.Methods |
||||
---@field button Button |
||||
---@field text Diesal.GUI.Region.FontString |
||||
---@field content Frame |
||||
---@field settings Diesal.GUI.Object.Accordian.Section.Settings |
||||
---@field defaults Diesal.GUI.Object.Accordian.Section.Settings.Default |
||||
local self = DiesalGUI:Create(Type, true) |
||||
|
||||
self.isContainer = true |
||||
|
||||
local frame = CreateFrame("Frame", nil, UIParent) |
||||
self.frame = frame |
||||
|
||||
self.defaults = { |
||||
button = true, |
||||
contentPadding = { 0, 0, 3, 1 }, |
||||
expanded = true, |
||||
buttonHeight = 16, |
||||
} |
||||
|
||||
local button = self:CreateRegion("Button", "button", frame) |
||||
button:SetPoint("TOPRIGHT") |
||||
button:SetPoint("TOPLEFT") |
||||
button:SetScript("OnClick", function(this, b) |
||||
DiesalGUI:OnMouse(this, b) |
||||
self[self.settings.expanded and "Collapse" or "Expand"](self) |
||||
end) |
||||
|
||||
local text = self:CreateRegion("FontString", "text", button) |
||||
text:SetPoint("TOPLEFT", 15, -2) |
||||
text:SetPoint("BOTTOMRIGHT", -15, 0) |
||||
text:SetHeight(0) |
||||
text:SetJustifyH("MIDDLE") |
||||
text:SetJustifyH("LEFT") |
||||
text:SetWordWrap(false) |
||||
|
||||
local content = self:CreateRegion("Frame", "content", frame) |
||||
content:SetPoint("TOPLEFT", frame, 0, 0) |
||||
content:SetPoint("TOPRIGHT", frame, 0, 0) |
||||
content:SetHeight(10) |
||||
-- ~~ Methods ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
self:SetMethods(methods) |
||||
--[[ for method, func in pairs(methods) do |
||||
self[method] = func |
||||
end ]] |
||||
-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
return self |
||||
end |
||||
DiesalGUI:RegisterObjectConstructor(Type, Constructor, Version) |
@ -0,0 +1,205 @@ |
||||
---@type Diesal.GUI |
||||
local DiesalGUI = LibStub("DiesalGUI-2.0") |
||||
---@type Diesal.Tools |
||||
local DiesalTools = LibStub("DiesalTools-2.0") |
||||
---@type Diesal.Style |
||||
local DiesalStyle = LibStub("DiesalStyle-2.0") |
||||
-- ~~| Diesal Upvalues |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local Colors = DiesalStyle.Colors |
||||
local HSL, ShadeColor, TintColor = DiesalTools.HSL, DiesalTools.ShadeColor, DiesalTools.TintColor |
||||
-- | Lua Upvalues |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local type, tonumber, select = type, tonumber, select |
||||
local pairs, ipairs, next = pairs, ipairs, next |
||||
local min, max = math.min, math.max |
||||
-- | WoW Upvalues |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
-- | Spinner |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local Type = "DiesalBar" |
||||
local Version = 1 |
||||
-- | Stylesheets |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local Stylesheet = { |
||||
["frame-background"] = { |
||||
type = "texture", |
||||
layer = "BACKGROUND", |
||||
color = "000000", |
||||
alpha = 0.60, |
||||
}, |
||||
["frame-outline"] = { |
||||
type = "outline", |
||||
layer = "BORDER", |
||||
color = "FFFFFF", |
||||
alpha = 0.02, |
||||
position = 1, |
||||
}, |
||||
["frame-inline"] = { |
||||
type = "outline", |
||||
layer = "BORDER", |
||||
color = "000000", |
||||
alpha = 0.60, |
||||
}, |
||||
["bar-background"] = { |
||||
type = "texture", |
||||
layer = "BACKGROUND", |
||||
gradient = { "VERTICAL", Colors.UI_A100, ShadeColor(Colors.UI_A100, 0.1) }, |
||||
position = 0, |
||||
}, |
||||
["bar-inline"] = { |
||||
type = "outline", |
||||
layer = "BORDER", |
||||
gradient = { "VERTICAL", "FFFFFF", "FFFFFF" }, |
||||
alpha = { 0.07, 0.02 }, |
||||
position = 0, |
||||
}, |
||||
["bar-outline"] = { |
||||
type = "texture", |
||||
layer = "ARTWORK", |
||||
color = "000000", |
||||
alpha = 0.7, |
||||
width = 1, |
||||
position = { nil, 1, 0, 0 }, |
||||
}, |
||||
} |
||||
local wireFrame = { |
||||
["frame-white"] = { |
||||
type = "outline", |
||||
layer = "OVERLAY", |
||||
color = "ffffff", |
||||
}, |
||||
["bar-green"] = { |
||||
type = "outline", |
||||
layer = "OVERLAY", |
||||
color = "55ff00", |
||||
}, |
||||
} |
||||
-- | Locals |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local function round(num) |
||||
return floor((num + 1 / 2) / 1) * 1 |
||||
end |
||||
-- | Methods |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
---@class Diesal.GUI.Object.Bar.Methods |
||||
---@field OnAcquire fun(self: Diesal.GUI.Object.Bar) |
||||
---@field OnRelease fun(self: Diesal.GUI.Object.Bar) |
||||
---@field ApplySettings fun(self: Diesal.GUI.Object.Bar) |
||||
---@field UpdateSize fun(self: Diesal.GUI.Object.Bar) |
||||
---@field SetColor fun(self: Diesal.GUI.Object.Bar, color: string, colorTop: string, gradientDirection: string) |
||||
---@field SetSize fun(self: Diesal.GUI.Object.Bar, width: number, height: number) |
||||
---@field SetValue fun(self: Diesal.GUI.Object.Bar, number: number, min: number, max: number) |
||||
---@field SetMin fun(self: Diesal.GUI.Object.Bar, number: number) |
||||
---@field SetMax fun(self: Diesal.GUI.Object.Bar, number: number) |
||||
---@field UpdateBar fun(self: Diesal.GUI.Object.Bar) |
||||
---@field IsVisible fun(self: Diesal.GUI.Object.Bar): boolean |
||||
local methods = { |
||||
["OnAcquire"] = function(self) |
||||
self:SetStylesheet(Stylesheet) |
||||
self:ApplySettings() |
||||
|
||||
-- self:SetStylesheet(wireFrame) |
||||
self:Show() |
||||
end, |
||||
["OnRelease"] = function(self) end, |
||||
["ApplySettings"] = function(self) |
||||
self:UpdateSize() |
||||
end, |
||||
["UpdateSize"] = function(self) |
||||
self:SetWidth(self.settings.width) |
||||
self:SetHeight(self.settings.height) |
||||
|
||||
self.bar:SetPoint("TOPLEFT", self.settings.padding[1], -self.settings.padding[3]) |
||||
self.bar:SetPoint("BOTTOMLEFT", self.settings.padding[1], self.settings.padding[4]) |
||||
|
||||
self.settings.barWidth = self.settings.width - self.settings.padding[1] - self.settings.padding[2] |
||||
|
||||
self:UpdateBar() |
||||
end, |
||||
["SetColor"] = function(self, color, colorTop, gradientDirection) end, |
||||
["SetSize"] = function(self, width, height) |
||||
width, height = tonumber(width), tonumber(height) |
||||
if not width then |
||||
error("Bar:SetSize(width, height) width to be a number.", 0) |
||||
end |
||||
if not height then |
||||
error("Bar:SetSize(width, height) height to be a number.", 0) |
||||
end |
||||
|
||||
self.settings.width, self.settings.height = width, height |
||||
|
||||
self:UpdateSize() |
||||
end, |
||||
["SetValue"] = function(self, number, mi, ma) |
||||
number, mi, ma = tonumber(number), tonumber(mi), tonumber(ma) |
||||
if not number then |
||||
error("Bar:SetValue(number) number needs to be a number.", 0) |
||||
end |
||||
|
||||
self.settings.min = mi or self.settings.min |
||||
self.settings.max = ma or self.settings.max |
||||
self.settings.value = number |
||||
self:UpdateBar() |
||||
end, |
||||
["SetMin"] = function(self, number) |
||||
number = tonumber(number) |
||||
if not number then |
||||
error("Bar:SetMin(number) needs to be a number.", 0) |
||||
end |
||||
|
||||
self.settings.min = number |
||||
self:UpdateBar() |
||||
end, |
||||
["SetMax"] = function(self, number) |
||||
number = tonumber(number) |
||||
if not number then |
||||
error("Bar:SetMax(number) needs to be a number.", 0) |
||||
end |
||||
|
||||
self.settings.max = number |
||||
self:UpdateBar() |
||||
end, |
||||
["UpdateBar"] = function(self) |
||||
local min, max, value, barWidth = self.settings.min, self.settings.max, self.settings.value, self.settings.barWidth |
||||
local width = round((value - min) / (max - min) * barWidth) |
||||
if width == 0 then |
||||
self.bar:Hide() |
||||
else |
||||
self.bar:Show() |
||||
self.bar:SetWidth(width) |
||||
end |
||||
end, |
||||
["IsVisible"] = function(self) |
||||
return self.frame:IsVisible() |
||||
end, |
||||
} |
||||
|
||||
---@class DiesalBar : Diesal.GUI.Object.Bar |
||||
|
||||
-- | Constructor |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local function Constructor() |
||||
---@class Diesal.GUI.Object.Bar : Diesal.GUI.ObjectBase, Diesal.GUI.Object.Bar.Methods |
||||
---@field bar Frame |
||||
---@field settings { height: number, width: number, padding: number[], value: number, min: number, max: number, barWidth: number } |
||||
local self = DiesalGUI:Create(Type, true) |
||||
local frame = CreateFrame("Frame", nil, UIParent) |
||||
self.frame = frame |
||||
-- ~~ Default Settings ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
self.defaults = { |
||||
height = 14, -- frame height (not bar) |
||||
width = 96, -- frame width (not bar) |
||||
padding = { 1, 1, 1, 1 }, -- left, right, top, bottom (bar padding from frame) |
||||
value = 0, |
||||
min = 0, |
||||
max = 100, |
||||
} |
||||
-- ~~ Construct ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
frame:SetScript("OnHide", function(this) |
||||
self:FireEvent("OnHide") |
||||
end) |
||||
|
||||
local bar = self:CreateRegion("Frame", "bar", frame) |
||||
|
||||
-- ~~ Methods ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
self:SetMethods(methods) |
||||
--[[ for method, func in pairs(methods) do |
||||
self[method] = func |
||||
end ]] |
||||
-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
return self |
||||
end |
||||
DiesalGUI:RegisterObjectConstructor(Type, Constructor, Version) |
@ -0,0 +1,341 @@ |
||||
---@type Diesal.GUI |
||||
local DiesalGUI = LibStub("DiesalGUI-2.0") |
||||
---@type Diesal.Tools |
||||
local DiesalTools = LibStub("DiesalTools-2.0") |
||||
---@type Diesal.Style |
||||
local DiesalStyle = LibStub("DiesalStyle-2.0") |
||||
-- ~~| Lua Upvalues |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local sub, format, match, lower = string.sub, string.format, string.match, string.lower |
||||
local tsort = table.sort |
||||
local tostring = tostring |
||||
-- ~~| WoW Upvalues |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
|
||||
-- ~~| TableExplorerBranch |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local Type = "DiesalBranch" |
||||
local Version = 1 |
||||
-- ~~| Stylesheets |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local Stylesheet = { |
||||
["button-highlight"] = { |
||||
type = "texture", |
||||
layer = "HIGHLIGHT", |
||||
color = "ffffff", |
||||
alpha = 0.1, |
||||
}, |
||||
["button-selected"] = { |
||||
type = "texture", |
||||
layer = "BORDER", |
||||
color = "0059b3", |
||||
alpha = 0, |
||||
}, |
||||
} |
||||
local wireFrameSheet = { |
||||
["frame-white"] = { |
||||
type = "outline", |
||||
layer = "OVERLAY", |
||||
color = "ffffff", |
||||
}, |
||||
["button-purple"] = { |
||||
type = "outline", |
||||
layer = "OVERLAY", |
||||
color = "aa00ff", |
||||
}, |
||||
["content-yellow"] = { |
||||
type = "outline", |
||||
layer = "OVERLAY", |
||||
color = "fffc00", |
||||
}, |
||||
} |
||||
-- ~~| Methods |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
---@class Diesal.GUI.Branch.Methods |
||||
---@field OnAcquire fun(self: Diesal.GUI.Object.Branch) |
||||
---@field OnRelease fun(self: Diesal.GUI.Object.Branch) |
||||
---@field ApplySettings fun(self: Diesal.GUI.Object.Branch): boolean | nil |
||||
---@field Collapse fun(self: Diesal.GUI.Object.Branch) |
||||
---@field Expand fun(self: Diesal.GUI.Object.Branch) |
||||
---@field UpdateHeight fun(self: Diesal.GUI.Object.Branch) |
||||
---@field SetLabel fun(self: Diesal.GUI.Object.Branch, text: string) |
||||
---@field SetIconTexture fun(self: Diesal.GUI.Object.Branch, texture: string) |
||||
---@field SetIconCoords fun(self: Diesal.GUI.Object.Branch, left: number, right: number, top: number, bottom: number) |
||||
---@field SetIconExpanded fun(self: Diesal.GUI.Object.Branch) |
||||
---@field SetIconCollapsed fun(self: Diesal.GUI.Object.Branch) |
||||
---@field SetSelected fun(self: Diesal.GUI.Object.Branch, state: boolean) |
||||
---@field UpdateLines fun(self: Diesal.GUI.Object.Branch) |
||||
local methods = { |
||||
["OnAcquire"] = function(self) |
||||
self:ApplySettings() |
||||
self:SetStylesheet(Stylesheet) |
||||
self:Show() |
||||
end, |
||||
["OnRelease"] = function(self) end, |
||||
["ApplySettings"] = function(self) |
||||
if not self.settings.position then |
||||
return false |
||||
end |
||||
|
||||
local button = self.button |
||||
local content = self.content |
||||
|
||||
button:SetHeight(self.settings.buttonHeight) |
||||
|
||||
if not self.settings.leaf then |
||||
self[self.settings.expanded and "Expand" or "Collapse"](self) |
||||
else |
||||
self:UpdateLines() |
||||
self:UpdateHeight() |
||||
end |
||||
|
||||
self:ClearAllPoints() |
||||
if self.settings.position == 1 then |
||||
self:SetPoint("TOPLEFT", self.settings.indent, 0) |
||||
self:SetPoint("RIGHT") |
||||
else |
||||
local anchor = self.settings.parentObject.children[self.settings.position - 1].frame |
||||
self:SetPoint("TOPLEFT", anchor, "BOTTOMLEFT", 0, 0) |
||||
self:SetPoint("RIGHT") |
||||
end |
||||
end, |
||||
["Collapse"] = function(self) |
||||
if self.settings.leaf then |
||||
return |
||||
end |
||||
self:FireEvent("OnStateChange", false) |
||||
self.settings.expanded = false |
||||
self:SetIconCollapsed() |
||||
self:UpdateLines() |
||||
self.content:Hide() |
||||
self:UpdateHeight() |
||||
end, |
||||
["Expand"] = function(self) |
||||
if self.settings.leaf then |
||||
return |
||||
end |
||||
self:FireEvent("OnStateChange", true) |
||||
self.settings.expanded = true |
||||
self:SetIconExpanded() |
||||
self:UpdateLines() |
||||
self.content:Show() |
||||
self:UpdateHeight() |
||||
end, |
||||
["UpdateHeight"] = function(self) |
||||
local contentHeight = 0 |
||||
local settings = self.settings |
||||
local children = self.children |
||||
|
||||
if settings.expanded then |
||||
for i = 1, #children do |
||||
contentHeight = contentHeight + children[i].frame:GetHeight() |
||||
end |
||||
end |
||||
self.content:SetHeight(contentHeight) |
||||
self:SetHeight(settings.buttonHeight + contentHeight) |
||||
settings.parentObject:UpdateHeight() |
||||
end, |
||||
["SetLabel"] = function(self, text) |
||||
self.text:SetText(text) |
||||
end, |
||||
["SetIconTexture"] = function(self, texture) |
||||
self.icon:SetTexture(texture) |
||||
end, |
||||
["SetIconCoords"] = function(self, left, right, top, bottom) |
||||
self.icon:SetTexCoord(left, right, top, bottom) |
||||
end, |
||||
["SetIconExpanded"] = function(self) |
||||
self.icon:SetTexCoord(DiesalTools.GetIconCoords(2, 8, 16, 256, 128)) |
||||
end, |
||||
["SetIconCollapsed"] = function(self) |
||||
self.icon:SetTexCoord(DiesalTools.GetIconCoords(1, 8, 16, 256, 128)) |
||||
end, |
||||
["SetSelected"] = function(self, state) |
||||
self:UpdateStyle("button-selected", { |
||||
type = "texture", |
||||
alpha = state and 1 or 0, |
||||
}) |
||||
end, |
||||
["UpdateLines"] = function(self) |
||||
if not self.settings.branches then |
||||
return |
||||
end |
||||
local foldColor = "353535" |
||||
local expandColor = "5a5a5a" |
||||
-- Frame Fold Line |
||||
if not self.settings.last and not self.settings.leaf then |
||||
self:UpdateStyle("frame-foldLine", { |
||||
type = "texture", |
||||
layer = "OVERLAY", |
||||
color = foldColor, |
||||
position = { 6, nil, -11, 2 }, |
||||
width = 1, |
||||
}) |
||||
end |
||||
-- expandable Fold Lines |
||||
if not self.settings.leaf then |
||||
self:UpdateStyle("button-square", { |
||||
type = "outline", |
||||
layer = "BORDER", |
||||
color = foldColor, |
||||
position = { 10, nil, -2, nil }, |
||||
width = 9, |
||||
height = 9, |
||||
}) |
||||
self:UpdateStyle("button-expandH", { |
||||
type = "texture", |
||||
layer = "BORDER", |
||||
color = expandColor, |
||||
position = { 8, nil, -6, nil }, |
||||
width = 5, |
||||
height = 1, |
||||
}) |
||||
self:UpdateStyle("button-expandV", { |
||||
type = "texture", |
||||
layer = "BORDER", |
||||
color = expandColor, |
||||
position = { 6, nil, -4, nil }, |
||||
width = 1, |
||||
height = 5, |
||||
alpha = 1, |
||||
}) |
||||
if self.settings.expanded then |
||||
self:UpdateStyle("button-expandV", { |
||||
type = "texture", |
||||
alpha = 0, |
||||
}) |
||||
end |
||||
else -- Leaf nodes |
||||
self:UpdateStyle("button-lineV", { |
||||
type = "texture", |
||||
layer = "BORDER", |
||||
color = foldColor, |
||||
position = { 6, nil, -6, nil }, |
||||
height = 1, |
||||
width = 6, |
||||
}) |
||||
self:UpdateStyle("button-lineH", { |
||||
type = "texture", |
||||
layer = "BORDER", |
||||
color = foldColor, |
||||
position = { 6, nil, 0, 0 }, |
||||
width = 1, |
||||
}) |
||||
if self.settings.last then |
||||
self:UpdateStyle("button-lineH", { |
||||
type = "texture", |
||||
position = { 6, nil, 0, -7 }, |
||||
}) |
||||
end |
||||
end |
||||
end, |
||||
} |
||||
|
||||
---@class DiesalBranch : Diesal.GUI.Object.Branch |
||||
|
||||
---@class Diesal.GUI.Object.Branch.Settings.Default |
||||
---@field fontObject Font |
||||
---@field branches boolean |
||||
---@field expanded boolean |
||||
---@field buttonHeight number |
||||
---@field indent number |
||||
---@field expIconTex string |
||||
---@field colIconTex string |
||||
---@field expIconCoords {[1]: number, [2]: number, [3]: number, [4]: number } |
||||
---@field colIconCoords {[1]: number, [2]: number, [3]: number, [4]: number } |
||||
|
||||
---@class Diesal.GUI.Object.Branch.Settings : Diesal.GUI.Object.Branch.Settings.Default |
||||
---@field parentObject Diesal.GUI.Object.Accordian.Section |
||||
---@field last boolean |
||||
---@field position number |
||||
---@field leaf boolean |
||||
|
||||
-- ~~| TableExplorerBranch Constructor |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local function Constructor() |
||||
---@class Diesal.GUI.Object.Branch : Diesal.GUI.ObjectBase, Diesal.GUI.Branch.Methods |
||||
---@field button Button |
||||
---@field icon Texture |
||||
---@field text Diesal.GUI.Region.FontString |
||||
---@field content Frame |
||||
---@field defaults Diesal.GUI.Object.Branch.Settings.Default |
||||
---@field settings Diesal.GUI.Object.Branch.Settings |
||||
local self = DiesalGUI:Create(Type, true) |
||||
|
||||
self.isContainer = true |
||||
|
||||
local frame = CreateFrame("Frame", nil, UIParent) |
||||
self.frame = frame |
||||
-- ~~ Default Settings ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
self.defaults = { |
||||
fontObject = DiesalFontNormal, |
||||
branches = true, |
||||
expanded = true, |
||||
buttonHeight = 14, |
||||
indent = 13, |
||||
expIconTex = "DiesalGUIcons", |
||||
colIconTex = "DiesalGUIcons", |
||||
expIconCoords = { DiesalTools.GetIconCoords(2, 8, 16, 256, 128) }, |
||||
colIconCoords = { DiesalTools.GetIconCoords(1, 8, 16, 256, 128) }, |
||||
} |
||||
-- ~~ Events ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
-- OnAcquire, OnRelease, OnHeightSet, OnWidthSet |
||||
-- ~~ Construct ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local button = self:CreateRegion("Button", "button", frame) |
||||
button:SetPoint("TOPRIGHT") |
||||
button:SetPoint("TOPLEFT") |
||||
button:RegisterForClicks("RightButtonUp", "LeftButtonUp") |
||||
button:RegisterForDrag("LeftButton") |
||||
---@param this Button |
||||
---@param button MouseButton |
||||
button:SetScript("OnClick", function(this, button) |
||||
DiesalGUI:OnMouse(this, button) |
||||
if button == "LeftButton" then |
||||
self[not self.settings.expanded and "Expand" or "Collapse"](self) |
||||
end |
||||
self:FireEvent("OnClick", button) |
||||
end) |
||||
---@param this Button |
||||
button:SetScript("OnDoubleClick", function(this, ...) |
||||
self:FireEvent("OnDoubleClick", ...) |
||||
end) |
||||
---@param this Button |
||||
button:SetScript("OnDragStart", function(this, ...) |
||||
self:FireEvent("OnDragStart", ...) |
||||
end) |
||||
---@param this Button |
||||
button:SetScript("OnDragStop", function(this, ...) |
||||
self:FireEvent("OnDragStop", ...) |
||||
end) |
||||
---@param this Button |
||||
button:SetScript("OnEnter", function(this, ...) |
||||
self:FireEvent("OnEnter", ...) |
||||
end) |
||||
---@param this Button |
||||
button:SetScript("OnLeave", function(this, ...) |
||||
self:FireEvent("OnLeave", ...) |
||||
end) |
||||
|
||||
local icon = self:CreateRegion("Texture", "icon", button) |
||||
DiesalStyle:StyleTexture(icon, { |
||||
position = { 0, nil, 2, nil }, |
||||
height = 16, |
||||
width = 16, |
||||
image = { "DiesalGUIcons" }, |
||||
}) |
||||
|
||||
local text = self:CreateRegion("FontString", "text", button) |
||||
text:SetPoint("TOPLEFT", 14, -1) |
||||
text:SetPoint("BOTTOMRIGHT", -4, 0) |
||||
text:SetHeight(0) |
||||
text:SetJustifyH("TOP") |
||||
text:SetJustifyH("LEFT") |
||||
text:SetWordWrap(false) |
||||
|
||||
local content = self:CreateRegion("Frame", "content", button) |
||||
content:SetPoint("TOPLEFT", button, "BOTTOMLEFT", 0, 0) |
||||
content:SetPoint("TOPRIGHT") |
||||
content:SetHeight(0) |
||||
-- ~~ Methods ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
self:SetMethods(methods) |
||||
--[[ for method, func in pairs(methods) do |
||||
self[method] = func |
||||
end ]] |
||||
-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
return self |
||||
end |
||||
DiesalGUI:RegisterObjectConstructor(Type, Constructor, Version) |
@ -0,0 +1,127 @@ |
||||
---@type Diesal.GUI |
||||
local DiesalGUI = LibStub("DiesalGUI-2.0") |
||||
---@type Diesal.Tools |
||||
local DiesalTools = LibStub("DiesalTools-2.0") |
||||
---@type Diesal.Style |
||||
local DiesalStyle = LibStub("DiesalStyle-2.0") |
||||
-- ~~| Lua Upvalues |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local type, tonumber, select = type, tonumber, select |
||||
local pairs, ipairs, next = pairs, ipairs, next |
||||
local min, max = math.min, math.max |
||||
-- ~~| WoW Upvalues |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local CreateFrame, UIParent, GetCursorPosition = CreateFrame, UIParent, GetCursorPosition |
||||
local GetScreenWidth, GetScreenHeight = GetScreenWidth, GetScreenHeight |
||||
local GetSpellInfo, GetBonusBarOffset, GetDodgeChance = GetSpellInfo, GetBonusBarOffset, GetDodgeChance |
||||
local GetCombatRatingBonus = GetCombatRatingBonus |
||||
-- ~~| Button |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local Type = "DiesalButton" |
||||
local Version = 5 |
||||
-- ~~| Button Stylesheets |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local Stylesheet = { |
||||
["text-color"] = { |
||||
type = "Font", |
||||
color = "b8c2cc", |
||||
}, |
||||
} |
||||
local wireFrame = { |
||||
["frame-white"] = { |
||||
type = "outline", |
||||
layer = "OVERLAY", |
||||
color = "ffffff", |
||||
}, |
||||
} |
||||
-- ~~| Button Methods |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
---@class Diesal.GUI.Button.Methods |
||||
---@field OnAcquire fun(self: Diesal.GUI.Object.Button) |
||||
---@field OnRelease fun(self: Diesal.GUI.Object.Button) |
||||
---@field ApplySettings fun(self: Diesal.GUI.Object.Button): boolean | nil |
||||
---@field SetText fun(self: Diesal.GUI.Object.Button, text: string) |
||||
---@field Disable fun(self: Diesal.GUI.Object.Button) |
||||
---@field Enable fun(self: Diesal.GUI.Object.Button) |
||||
---@field RegisterForClicks fun(self: Diesal.GUI.Object.Button, ...) |
||||
local methods = { |
||||
["OnAcquire"] = function(self) |
||||
self:ApplySettings() |
||||
self:SetStylesheet(Stylesheet) |
||||
self:Enable() |
||||
-- self:SetStylesheet(wireFrameSheet) |
||||
self:Show() |
||||
end, |
||||
["OnRelease"] = function(self) end, |
||||
["ApplySettings"] = function(self) |
||||
local settings = self.settings |
||||
local frame = self.frame |
||||
|
||||
self:SetWidth(settings.width) |
||||
self:SetHeight(settings.height) |
||||
end, |
||||
["SetText"] = function(self, text) |
||||
self.text:SetText(text) |
||||
end, |
||||
["Disable"] = function(self) |
||||
self.settings.disabled = true |
||||
self.frame:Disable() |
||||
end, |
||||
["Enable"] = function(self) |
||||
self.settings.disabled = false |
||||
self.frame:Enable() |
||||
end, |
||||
["RegisterForClicks"] = function(self, ...) |
||||
self.frame:RegisterForClicks(...) |
||||
end, |
||||
} |
||||
|
||||
---@class DiesalButton : Diesal.GUI.Object.Button |
||||
|
||||
-- ~~| Button Constructor |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local function Constructor(name) |
||||
---@class Diesal.GUI.Object.Button : Diesal.GUI.ObjectBase, Diesal.GUI.Button.Methods |
||||
---@field text Diesal.GUI.Region.FontString |
||||
---@field settings { disabled: boolean, height: number, width: number } |
||||
local self = DiesalGUI:Create(Type, true) |
||||
local frame = CreateFrame("Button", name, UIParent) |
||||
self.frame = frame |
||||
self.defaults = { |
||||
height = 32, |
||||
width = 32, |
||||
} |
||||
-- ~~ Events ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
-- OnAcquire, OnRelease, OnHeightSet, OnWidthSet |
||||
-- OnClick, OnEnter, OnLeave, OnDisable, OnEnable |
||||
-- ~~ Construct ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local text = self:CreateRegion("FontString", "text", frame) |
||||
text:SetPoint("TOPLEFT", 4, -1) -- sits below center when rendered off by 1 pixel, fuck you blizzard |
||||
text:SetPoint("BOTTOMRIGHT", -4, 0) |
||||
text:SetJustifyV("MIDDLE") |
||||
text:SetJustifyH("CENTER") |
||||
frame:SetFontString(text) |
||||
|
||||
---@param this Button |
||||
---@param button MouseButton |
||||
frame:SetScript("OnClick", function(this, button, ...) |
||||
DiesalGUI:OnMouse(this, button) |
||||
|
||||
self:FireEvent("OnClick", button, ...) |
||||
end) |
||||
frame:SetScript("OnEnter", function(this) |
||||
self:FireEvent("OnEnter") |
||||
end) |
||||
frame:SetScript("OnLeave", function(this) |
||||
self:FireEvent("OnLeave") |
||||
end) |
||||
frame:SetScript("OnDisable", function(this) |
||||
self:FireEvent("OnDisable") |
||||
end) |
||||
frame:SetScript("OnEnable", function(this) |
||||
self:FireEvent("OnEnable") |
||||
end) |
||||
-- ~~ Methods ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
self:SetMethods(methods) |
||||
--[[ for method, func in pairs(methods) do |
||||
self[method] = func |
||||
end ]] |
||||
-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
return self |
||||
end |
||||
|
||||
DiesalGUI:RegisterObjectConstructor(Type, Constructor, Version) |
@ -0,0 +1,190 @@ |
||||
---@type Diesal.GUI |
||||
local DiesalGUI = LibStub("DiesalGUI-2.0") |
||||
---@type Diesal.Tools |
||||
local DiesalTools = LibStub("DiesalTools-2.0") |
||||
---@type Diesal.Style |
||||
local DiesalStyle = LibStub("DiesalStyle-2.0") |
||||
-- ~~| Diesal Upvalues |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local Colors = DiesalStyle.Colors |
||||
local HSL, ShadeColor, TintColor = DiesalTools.HSL, DiesalTools.ShadeColor, DiesalTools.TintColor |
||||
-- ~~| Lua Upvalues |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local type, tonumber, select = type, tonumber, select |
||||
local pairs, ipairs, next = pairs, ipairs, next |
||||
local min, max = math.min, math.max |
||||
-- ~~| WoW Upvalues |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local CreateFrame, UIParent, GetCursorPosition = CreateFrame, UIParent, GetCursorPosition |
||||
local GetScreenWidth, GetScreenHeight = GetScreenWidth, GetScreenHeight |
||||
local GetSpellInfo, GetBonusBarOffset, GetDodgeChance = GetSpellInfo, GetBonusBarOffset, GetDodgeChance |
||||
local GetCombatRatingBonus = GetCombatRatingBonus |
||||
-- ~~| Button |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local Type = "DiesalCheckBox" |
||||
local Version = 1 |
||||
-- ~~| Button Stylesheets |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local Stylesheet = { |
||||
["frame-background"] = { |
||||
type = "texture", |
||||
layer = "BACKGROUND", |
||||
color = "000000", |
||||
alpha = 0.60, |
||||
position = -2, |
||||
}, |
||||
["frame-inline"] = { |
||||
type = "outline", |
||||
layer = "BORDER", |
||||
color = "000000", |
||||
alpha = 0.6, |
||||
position = -2, |
||||
}, |
||||
["frame-outline"] = { |
||||
type = "outline", |
||||
layer = "BORDER", |
||||
color = "FFFFFF", |
||||
alpha = 0.02, |
||||
position = -1, |
||||
}, |
||||
} |
||||
local checkBoxStyle = { |
||||
base = { |
||||
type = "texture", |
||||
layer = "ARTWORK", |
||||
color = Colors.UI_A400, |
||||
position = -3, |
||||
}, |
||||
disabled = { |
||||
type = "texture", |
||||
color = HSL(Colors.UI_Hue, Colors.UI_Saturation, 0.35), |
||||
}, |
||||
enabled = { |
||||
type = "texture", |
||||
color = Colors.UI_A400, |
||||
}, |
||||
} |
||||
|
||||
local wireFrame = { |
||||
["frame-white"] = { |
||||
type = "outline", |
||||
layer = "OVERLAY", |
||||
color = "ffffff", |
||||
}, |
||||
} |
||||
-- ~~| Button Methods |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
|
||||
---@class Diesal.GUI.CheckBox.Settings |
||||
---@field height number |
||||
---@field width number |
||||
---@field checked boolean |
||||
---@field disabled boolean |
||||
|
||||
---@class Diesal.GUI.CheckBox.Methods |
||||
local methods = { |
||||
---@param self Diesal.GUI.Object.CheckBox |
||||
["OnAcquire"] = function(self) |
||||
self:ApplySettings() |
||||
self:SetStylesheet(Stylesheet) |
||||
self:Enable() |
||||
-- self:SetStylesheet(wireFrameSheet) |
||||
self:Show() |
||||
end, |
||||
|
||||
---@param self Diesal.GUI.Object.CheckBox |
||||
["OnRelease"] = function(self) end, |
||||
|
||||
---@param self Diesal.GUI.Object.CheckBox |
||||
["ApplySettings"] = function(self) |
||||
local settings = self.settings |
||||
local frame = self.frame |
||||
|
||||
self:SetWidth(settings.width) |
||||
self:SetHeight(settings.height) |
||||
end, |
||||
|
||||
---@param self Diesal.GUI.Object.CheckBox |
||||
---@param value boolean |
||||
["SetChecked"] = function(self, value) |
||||
self.settings.checked = value |
||||
self.frame:SetChecked(value) |
||||
self.value = self.settings.checked |
||||
|
||||
self[self.settings.disabled and "Disable" or "Enable"](self) |
||||
end, |
||||
["GetChecked"] = function(self) |
||||
return self.settings.checked |
||||
end, |
||||
["Disable"] = function(self) |
||||
self.settings.disabled = true |
||||
DiesalStyle:StyleTexture(self.check, checkBoxStyle.disabled) |
||||
self.frame:Disable() |
||||
end, |
||||
["Enable"] = function(self) |
||||
self.settings.disabled = false |
||||
DiesalStyle:StyleTexture(self.check, checkBoxStyle.enabled) |
||||
self.frame:Enable() |
||||
end, |
||||
["RegisterForClicks"] = function(self, ...) |
||||
self.frame:RegisterForClicks(...) |
||||
end, |
||||
} |
||||
|
||||
---@class DiesalCheckBox : Diesal.GUI.Object.CheckBox |
||||
|
||||
-- ~~| Button Constructor |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local function Constructor() |
||||
---@class Diesal.GUI.Object.CheckBox : Diesal.GUI.ObjectBase, Diesal.GUI.CheckBox.Methods |
||||
---@field check Texture |
||||
---@field settings Diesal.GUI.CheckBox.Settings |
||||
---@field value boolean |
||||
local self = DiesalGUI:Create(Type, true) |
||||
local frame = CreateFrame("CheckButton", nil, UIParent) |
||||
self.frame = frame |
||||
|
||||
-- ~~ Default Settings ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
self.defaults = { |
||||
height = 11, |
||||
width = 11, |
||||
} |
||||
-- ~~ Events ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
-- OnAcquire, OnRelease, OnHeightSet, OnWidthSet |
||||
-- OnValueChanged, OnEnter, OnLeave, OnDisable, OnEnable |
||||
-- ~~ Construct ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
|
||||
local check = self:CreateRegion("Texture", "check", frame) |
||||
DiesalStyle:StyleTexture(check, checkBoxStyle.base) |
||||
frame:SetCheckedTexture(check) |
||||
frame:SetScript("OnClick", function(this, button, ...) |
||||
DiesalGUI:OnMouse(this, button) |
||||
|
||||
if not self.settings.disabled then |
||||
self:SetChecked(not self.settings.checked) |
||||
|
||||
if self.settings.checked then |
||||
PlaySound(856) |
||||
else |
||||
PlaySound(857) |
||||
end |
||||
|
||||
self:FireEvent("OnValueChanged", self.settings.checked) |
||||
end |
||||
end) |
||||
frame:SetScript("OnEnter", function(this) |
||||
self:FireEvent("OnEnter") |
||||
end) |
||||
frame:SetScript("OnLeave", function(this) |
||||
self:FireEvent("OnLeave") |
||||
end) |
||||
frame:SetScript("OnDisable", function(this) |
||||
self:FireEvent("OnDisable") |
||||
end) |
||||
frame:SetScript("OnEnable", function(this) |
||||
self:FireEvent("OnEnable") |
||||
end) |
||||
|
||||
-- ~~ Methods ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
self:SetMethods(methods) |
||||
--[[ for method, func in pairs(methods) do |
||||
self[method] = func |
||||
end ]] |
||||
-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
return self |
||||
end |
||||
|
||||
DiesalGUI:RegisterObjectConstructor(Type, Constructor, Version) |
@ -0,0 +1,314 @@ |
||||
---@type Diesal.GUI |
||||
local DiesalGUI = LibStub("DiesalGUI-2.0") |
||||
---@type Diesal.Tools |
||||
local DiesalTools = LibStub("DiesalTools-2.0") |
||||
---@type Diesal.Style |
||||
local DiesalStyle = LibStub("DiesalStyle-2.0") |
||||
-- ~~| Diesal Upvalues |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local Colors = DiesalStyle.Colors |
||||
local HSL, ShadeColor, TintColor = DiesalTools.HSL, DiesalTools.ShadeColor, DiesalTools.TintColor |
||||
-- ~~| Lua Upvalues |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local sub, format, lower, upper, gsub = string.sub, string.format, string.lower, string.upper, string.gsub |
||||
local tsort = table.sort |
||||
|
||||
-- ~~| WoW Upvalues |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
|
||||
-- ~~| ComboBox |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local Type = "DiesalComboBox" |
||||
local Version = 1 |
||||
-- ~~| ComboBox Stylesheets |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local Stylesheet = { |
||||
["frame-background"] = { |
||||
type = "texture", |
||||
layer = "BACKGROUND", |
||||
color = "000000", |
||||
alpha = 0.7, |
||||
}, |
||||
["frame-inline"] = { |
||||
type = "outline", |
||||
layer = "BORDER", |
||||
color = "000000", |
||||
alpha = 0.7, |
||||
}, |
||||
["frame-outline"] = { |
||||
type = "outline", |
||||
layer = "BORDER", |
||||
color = "FFFFFF", |
||||
alpha = 0.02, |
||||
position = 1, |
||||
}, |
||||
["button-background"] = { |
||||
type = "texture", |
||||
layer = "BACKGROUND", |
||||
gradient = { "VERTICAL", Colors.UI_500_GR[1], Colors.UI_500_GR[2] }, |
||||
}, |
||||
["button-outline"] = { |
||||
type = "outline", |
||||
layer = "ARTWORK", |
||||
color = "000000", |
||||
alpha = 0.9, |
||||
}, |
||||
["button-inline"] = { |
||||
type = "outline", |
||||
layer = "BORDER", |
||||
gradient = { "VERTICAL", "FFFFFF", "FFFFFF" }, |
||||
alpha = { 0.07, 0.02 }, |
||||
position = -1, |
||||
}, |
||||
["button-hover"] = { |
||||
type = "texture", |
||||
layer = "HIGHLIGHT", |
||||
color = "ffffff", |
||||
alpha = 0.05, |
||||
}, |
||||
["button-arrow"] = { |
||||
type = "texture", |
||||
layer = "BORDER", |
||||
image = { "DiesalGUIcons", { 2, 1, 16, 256, 128 } }, |
||||
alpha = 0.5, |
||||
position = { nil, -4, -5, nil }, |
||||
height = 4, |
||||
width = 5, |
||||
}, |
||||
["editBox-hover"] = { |
||||
type = "texture", |
||||
layer = "HIGHLIGHT", |
||||
color = "ffffff", |
||||
alpha = 0.1, |
||||
position = { -1, 0, -1, -1 }, |
||||
}, |
||||
["editBox-font"] = { |
||||
type = "Font", |
||||
color = Colors.UI_TEXT, |
||||
}, |
||||
|
||||
["dropdown-background"] = { |
||||
type = "texture", |
||||
layer = "BACKGROUND", |
||||
color = Colors.UI_100, |
||||
alpha = 0.95, |
||||
}, |
||||
["dropdown-inline"] = { |
||||
type = "outline", |
||||
layer = "BORDER", |
||||
color = "ffffff", |
||||
alpha = 0.02, |
||||
position = -1, |
||||
}, |
||||
["dropdown-shadow"] = { |
||||
type = "shadow", |
||||
}, |
||||
} |
||||
-- ~~| ComboBox Locals |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local function compare(a, b) |
||||
return a.value < b.value |
||||
end |
||||
local function sortList(list, orderedKeys) |
||||
if orderedKeys then |
||||
return orderedKeys |
||||
end |
||||
local sortedList = {} |
||||
local orderedKeys = {} |
||||
for key, value in pairs(list) do |
||||
sortedList[#sortedList + 1] = { key = key, value = value } |
||||
end |
||||
tsort(sortedList, compare) |
||||
for i, value in ipairs(sortedList) do |
||||
orderedKeys[#orderedKeys + 1] = value.key |
||||
end |
||||
|
||||
return orderedKeys |
||||
end |
||||
-- ~~| ComboBox Methods |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
---@class Diesal.GUI.ComboBox.Methods |
||||
---@field OnAcquire fun(self: Diesal.GUI.Object.ComboBox) |
||||
---@field OnRelease fun(self: Diesal.GUI.Object.ComboBox) |
||||
---@field ApplySettings fun(self: Diesal.GUI.Object.ComboBox): boolean | nil |
||||
---@field SetList fun(self: Diesal.GUI.Object.ComboBox, list: table, orderedKeys: table) |
||||
---@field SetValue fun(self: Diesal.GUI.Object.ComboBox, key: string) |
||||
---@field SetText fun(self: Diesal.GUI.Object.ComboBox, text: string) |
||||
---@field SetJustify fun(self: Diesal.GUI.Object.ComboBox, j: string) |
||||
---@field SetFocus fun(self: Diesal.GUI.Object.ComboBox) |
||||
---@field ClearFocus fun(self: Diesal.GUI.Object.ComboBox) |
||||
---@field ClearSelection fun(self: Diesal.GUI.Object.ComboBox) |
||||
local methods = { |
||||
["OnAcquire"] = function(self) |
||||
self:ApplySettings() |
||||
self:SetStylesheet(Stylesheet) |
||||
-- self:SetStylesheet(wireFrameSheet) |
||||
self:Show() |
||||
end, |
||||
["OnRelease"] = function(self) end, |
||||
["ApplySettings"] = function(self) |
||||
local settings = self.settings |
||||
local content = self.content |
||||
local frame = self.frame |
||||
local children = self.children |
||||
local dropdown = self.dropdown |
||||
|
||||
frame:SetWidth(settings.width) |
||||
frame:SetHeight(settings.height) |
||||
|
||||
self.editBox:SetPoint("RIGHT", -settings.buttonWidth, 0) |
||||
self.button:SetWidth(settings.buttonWidth) |
||||
|
||||
-- dropdown |
||||
content:SetPoint("TOPLEFT", settings.dropdownPadding[1], -settings.dropdownPadding[3]) |
||||
content:SetPoint("BOTTOMRIGHT", -settings.dropdownPadding[2], settings.dropdownPadding[4]) |
||||
|
||||
local menuHeight = 0 |
||||
for i = 1, #children do |
||||
menuHeight = menuHeight + children[i].frame:GetHeight() |
||||
end |
||||
dropdown:SetHeight(settings.dropdownPadding[3] + menuHeight + settings.dropdownPadding[4]) |
||||
end, |
||||
["SetList"] = function(self, list, orderedKeys) |
||||
self:ReleaseChildren() |
||||
self:SetText("") |
||||
local settings = self.settings |
||||
local orderedKeys = sortList(list, orderedKeys) |
||||
settings.list = list |
||||
|
||||
for position, key in ipairs(orderedKeys) do |
||||
local comboBoxItem = DiesalGUI:Create("DiesalComboBoxItem") --[[ @asDiesal.GUI.Object.ComboBox.Itemm ]] |
||||
self:AddChild(comboBoxItem) |
||||
comboBoxItem:SetParentObject(self) |
||||
comboBoxItem:SetSettings({ |
||||
key = key, |
||||
value = list[key], |
||||
position = position, |
||||
}, true) |
||||
end |
||||
self:ApplySettings() |
||||
end, |
||||
["SetValue"] = function(self, key) |
||||
for i = 1, #self.children do |
||||
self.children[i]:SetSelected(false) |
||||
end |
||||
|
||||
for i = 1, #self.children do |
||||
if self.children[i].settings.key == key then |
||||
self.children[i]:SetSelected(true) |
||||
self:SetText(self.children[i].settings.value) |
||||
self.editBox:SetCursorPosition(0) |
||||
break |
||||
end |
||||
end |
||||
end, |
||||
["SetText"] = function(self, text) |
||||
self.editBox:SetText(text) |
||||
end, |
||||
["SetJustify"] = function(self, j) |
||||
self.editBox:SetJustifyH(j) |
||||
end, |
||||
["SetFocus"] = function(self) |
||||
DiesalGUI:SetFocus(self) |
||||
end, |
||||
["ClearFocus"] = function(self) |
||||
self.dropdown:Hide() |
||||
end, |
||||
["ClearSelection"] = function(self) |
||||
for i = 1, #self.children do |
||||
self.children[i]:SetSelected(false) |
||||
end |
||||
self:SetText("") |
||||
end, |
||||
} |
||||
|
||||
---@class DiesalComboBox : Diesal.GUI.Object.ComboBox |
||||
-- ~~| ComboBox Constructor |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local function Constructor() |
||||
---@class Diesal.GUI.Object.ComboBox : Diesal.GUI.ObjectBase, Diesal.GUI.ComboBox.Methods |
||||
---@field editBox Diesal.GUI.Region.EditBox |
||||
---@field button Button |
||||
---@field dropdown Frame |
||||
---@field content Frame |
||||
---@field children Diesal.GUI.Object.ComboBox.Item[] |
||||
---@field settings { width: number, height: number, buttonWidth: number, dropdownPadding: table, dropdownButtonWidth: number, list: table, selectedKey: string, selectedValue: string, oldValue: string} |
||||
local self = DiesalGUI:Create(Type, true) |
||||
self.isContainer = true |
||||
local frame = CreateFrame("Frame", nil, UIParent) |
||||
self.frame = frame |
||||
-- ~~ Default Settings ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
self.defaults = { |
||||
width = 100, |
||||
height = 16, |
||||
buttonWidth = 16, |
||||
|
||||
dropdownPadding = { 4, 4, 4, 4 }, |
||||
dropdownButtonWidth = 16, |
||||
} |
||||
-- ~~ Registered Events ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
-- OnValueSelected, OnRenameValue |
||||
-- OnEnter, OnLeave |
||||
-- OnButtonClick, OnButtonEnter, OnButtonLeave |
||||
-- ~~ Construct ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local editBox = self:CreateRegion("EditBox", "editBox", frame) |
||||
editBox:SetPoint("TOPLEFT") |
||||
editBox:SetPoint("BOTTOMLEFT") |
||||
editBox:SetAutoFocus(false) |
||||
editBox:SetJustifyH("RIGHT") |
||||
editBox:SetJustifyV("CENTER") |
||||
editBox:SetTextInsets(1, 2, 2, 0) |
||||
editBox:SetScript("OnEnterPressed", function(this) |
||||
local text = this:GetText() |
||||
DiesalGUI:ClearFocus() |
||||
if text ~= self.settings.oldValue then |
||||
self:FireEvent("OnRenameValue", self.settings.selectedKey, text) |
||||
end |
||||
end) |
||||
editBox:HookScript("OnEscapePressed", function(this, ...) |
||||
this:SetText(self.settings.oldValue) |
||||
end) |
||||
editBox:HookScript("OnEditFocusGained", function(this) |
||||
self.settings.oldValue = this:GetText() |
||||
end) |
||||
editBox:HookScript("OnEditFocusLost", function(this, ...) |
||||
self:SetText(self.settings.oldValue) |
||||
end) |
||||
editBox:SetScript("OnEnter", function(this) |
||||
self:FireEvent("OnEnter") |
||||
end) |
||||
editBox:SetScript("OnLeave", function(this) |
||||
self:FireEvent("OnLeave") |
||||
end) |
||||
local button = self:CreateRegion("Button", "button", frame) |
||||
button:SetPoint("TOPRIGHT") |
||||
button:SetPoint("BOTTOMRIGHT") |
||||
button:SetScript("OnEnter", function(this) |
||||
self:FireEvent("OnButtonEnter") |
||||
end) |
||||
button:SetScript("OnLeave", function(this) |
||||
self:FireEvent("OnButtonLeave") |
||||
end) |
||||
|
||||
---@param this Button |
||||
---@param b MouseButton |
||||
button:SetScript("OnClick", function(this, b) |
||||
self:FireEvent("OnButtonClick") |
||||
|
||||
local dropdown = self.dropdown |
||||
local visible = dropdown:IsVisible() |
||||
DiesalGUI:OnMouse(this, b) |
||||
dropdown[visible and "Hide" or "Show"](dropdown) |
||||
end) |
||||
|
||||
local dropdown = self:CreateRegion("Frame", "dropdown", frame) |
||||
dropdown:SetFrameStrata("FULLSCREEN_DIALOG") |
||||
dropdown:SetPoint("TOPRIGHT", frame, "BOTTOMRIGHT", 0, -2) |
||||
dropdown:SetPoint("TOPLEFT", frame, "BOTTOMLEFT", 0, -2) |
||||
dropdown:SetScript("OnShow", function(this) |
||||
this:SetFocus() |
||||
end) |
||||
dropdown:Hide() |
||||
|
||||
self:CreateRegion("Frame", "content", dropdown) |
||||
-- ~~ Methods ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
self:SetMethods(methods) |
||||
--[[ for method, func in pairs(methods) do |
||||
self[method] = func |
||||
end ]] |
||||
-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
return self |
||||
end |
||||
DiesalGUI:RegisterObjectConstructor(Type, Constructor, Version) |
@ -0,0 +1,145 @@ |
||||
---@type Diesal.GUI |
||||
local DiesalGUI = LibStub("DiesalGUI-2.0") |
||||
---@type Diesal.Tools |
||||
local DiesalTools = LibStub("DiesalTools-2.0") |
||||
---@type Diesal.Style |
||||
local DiesalStyle = LibStub("DiesalStyle-2.0") |
||||
-- ~~| Diesal Upvalues |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local Colors = DiesalStyle.Colors |
||||
local HSL, ShadeColor, TintColor = DiesalTools.HSL, DiesalTools.ShadeColor, DiesalTools.TintColor |
||||
-- ~~| Lua Upvalues |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
|
||||
-- ~~| WoW Upvalues |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
|
||||
-- ~~| ComboBoxItem |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local Type = "DiesalComboBoxItem" |
||||
local Version = 2 |
||||
-- ~~| ComboBoxItem Stylesheets |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local Stylesheet = { |
||||
["frame-hover"] = { |
||||
type = "texture", |
||||
layer = "HIGHLIGHT", |
||||
color = "b3d9ff", |
||||
alpha = 0.05, |
||||
}, |
||||
} |
||||
-- ~~| ComboBoxItem Locals |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
|
||||
-- ~~| ComboBoxItem Methods |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
---@class Diesal.GUI.ComboBoxItem.Methods |
||||
local methods = { |
||||
["OnAcquire"] = function(self) |
||||
self:ApplySettings() |
||||
self:SetStylesheet(Stylesheet) |
||||
-- self:SetStylesheet(wireFrameSheet) |
||||
self:Show() |
||||
end, |
||||
["OnRelease"] = function(self) |
||||
self.check:Hide() |
||||
end, |
||||
["ApplySettings"] = function(self) |
||||
if not self.settings.key then |
||||
return |
||||
end |
||||
|
||||
local settings = self.settings |
||||
local comboBoxSettings = settings.parentObject.settings |
||||
local text = self.text |
||||
|
||||
if settings.position == 1 then |
||||
self:SetPoint("TOPLEFT") |
||||
self:SetPoint("RIGHT") |
||||
else |
||||
self:SetPoint("TOPLEFT", settings.parentObject.children[settings.position - 1].frame, "BOTTOMLEFT", 0, 0) |
||||
self:SetPoint("RIGHT") |
||||
end |
||||
|
||||
self:SetHeight(comboBoxSettings.dropdownButtonWidth) |
||||
|
||||
self:SetText(settings.value) |
||||
end, |
||||
["SetText"] = function(self, text) |
||||
self.text:SetText(text) |
||||
end, |
||||
["OnClick"] = function(self) |
||||
local settings = self.settings |
||||
local comboBox = settings.parentObject |
||||
local comboBoxSettings = comboBox.settings |
||||
local comboBoxItems = comboBox.children |
||||
|
||||
for i = 1, #comboBoxItems do |
||||
comboBoxItems[i]:SetSelected(false) |
||||
end |
||||
|
||||
self:SetSelected(true) |
||||
|
||||
comboBox.dropdown:Hide() |
||||
comboBox:SetText(settings.value) |
||||
comboBox:FireEvent("OnValueSelected", settings.key, settings.value) |
||||
end, |
||||
["SetSelected"] = function(self, selected) |
||||
if selected then |
||||
self.settings.parentObject.settings.selectedKey = self.settings.key |
||||
self.settings.selected = true |
||||
self.check:Show() |
||||
else |
||||
self.settings.selected = false |
||||
self.check:Hide() |
||||
end |
||||
end, |
||||
} |
||||
|
||||
---@class Diesal.GUI.ComboBoxItem.Settings |
||||
---@field parentObject Diesal.GUI.Object.ComboBox |
||||
---@field position number |
||||
---@field key string |
||||
---@field value string |
||||
---@field selected boolean |
||||
|
||||
---@class DiesalComboBoxItem : Diesal.GUI.Object.ComboBox.Item |
||||
|
||||
local function Constructor() |
||||
---@class Diesal.GUI.Object.ComboBox.Item : Diesal.GUI.ObjectBase, Diesal.GUI.ComboBoxItem.Methods |
||||
---@field text FontString |
||||
---@field check Texture |
||||
---@field settings Diesal.GUI.ComboBoxItem.Settings |
||||
local self = DiesalGUI:Create(Type, true) |
||||
|
||||
local frame = CreateFrame("Button", nil, UIParent) |
||||
self.frame = frame |
||||
|
||||
self.defaults = {} |
||||
|
||||
frame:SetScript("OnClick", function(this, button) |
||||
self:OnClick() |
||||
end) |
||||
frame:SetScript("OnEnter", function(this) end) |
||||
frame:SetScript("OnLeave", function(this) end) |
||||
|
||||
---@type Diesal.GUI.Region.FontString |
||||
local text = self:CreateRegion("FontString", "text", frame) |
||||
text:SetPoint("TOPLEFT", 12, -2) |
||||
text:SetPoint("BOTTOMRIGHT", 0, 0) |
||||
text:SetJustifyH("TOP") |
||||
text:SetJustifyH("LEFT") |
||||
text:SetWordWrap(false) |
||||
|
||||
local check = self:CreateRegion("Texture", "check", frame) --[[ @as Texture ]] |
||||
DiesalStyle:StyleTexture(check, { |
||||
position = { 2, nil, 0, nil }, |
||||
height = 16, |
||||
width = 16, |
||||
image = { "DiesalGUIcons", { 10, 5, 16, 256, 128 }, "FFFF00" }, |
||||
}) |
||||
check:Hide() |
||||
|
||||
-- ~~ Methods ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
self:SetMethods(methods) |
||||
--[[ for method, func in pairs(methods) do |
||||
self[method] = func |
||||
end ]] |
||||
-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
|
||||
return self |
||||
end |
||||
DiesalGUI:RegisterObjectConstructor(Type, Constructor, Version) |
@ -0,0 +1,404 @@ |
||||
---@type Diesal.GUI |
||||
local DiesalGUI = LibStub("DiesalGUI-2.0") |
||||
---@type Diesal.Tools |
||||
local DiesalTools = LibStub("DiesalTools-2.0") |
||||
---@type Diesal.Style |
||||
local DiesalStyle = LibStub("DiesalStyle-2.0") |
||||
-- ~~| Diesal Upvalues |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local Colors = DiesalStyle.Colors |
||||
local HSL, ShadeColor, TintColor = DiesalTools.HSL, DiesalTools.ShadeColor, DiesalTools.TintColor |
||||
-- ~~| Lua Upvalues |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local tsort = table.sort |
||||
local sub, format, lower, upper, gsub = string.sub, string.format, string.lower, string.upper, string.gsub |
||||
|
||||
-- ~~| WoW Upvalues |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
|
||||
-- ~~| Dropdown |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local Type = "DiesalDropDown" |
||||
local Version = 2 |
||||
-- ~~| Dropdown Stylesheets |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local Stylesheet = { |
||||
["frame-background"] = { |
||||
type = "texture", |
||||
layer = "BACKGROUND", |
||||
gradient = { "VERTICAL", Colors.UI_400_GR[1], Colors.UI_400_GR[2] }, |
||||
}, |
||||
["frame-outline"] = { |
||||
type = "outline", |
||||
layer = "BORDER", |
||||
color = "000000", |
||||
}, |
||||
["frame-inline"] = { |
||||
type = "outline", |
||||
layer = "BORDER", |
||||
gradient = { "VERTICAL", "FFFFFF", "FFFFFF" }, |
||||
alpha = { 0.07, 0.02 }, |
||||
position = -1, |
||||
}, |
||||
["frame-hover"] = { |
||||
type = "texture", |
||||
layer = "HIGHLIGHT", |
||||
color = "ffffff", |
||||
alpha = 0.05, |
||||
}, |
||||
["frame-arrow"] = { |
||||
type = "texture", |
||||
layer = "BORDER", |
||||
image = { "DiesalGUIcons", { 2, 1, 16, 256, 128 } }, |
||||
alpha = 0.5, |
||||
position = { nil, -5, -7, nil }, |
||||
height = 3, |
||||
width = 5, |
||||
}, |
||||
["text-color"] = { |
||||
type = "Font", |
||||
color = Colors.UI_TEXT, |
||||
}, |
||||
["dropdown-background"] = { |
||||
type = "texture", |
||||
layer = "BACKGROUND", |
||||
color = Colors.UI_100, |
||||
alpha = 0.95, |
||||
}, |
||||
["dropdown-inline"] = { |
||||
type = "outline", |
||||
layer = "BORDER", |
||||
color = "ffffff", |
||||
alpha = 0.02, |
||||
position = -1, |
||||
}, |
||||
["dropdown-shadow"] = { |
||||
type = "shadow", |
||||
}, |
||||
} |
||||
-- ~~| Dropdown Locals |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local function compare(a, b) |
||||
return a.value < b.value |
||||
end |
||||
local function sortList(list, orderedKeys) |
||||
if orderedKeys then |
||||
return orderedKeys |
||||
end |
||||
local sortedList = {} |
||||
local orderedKeys = {} |
||||
for key, value in pairs(list) do |
||||
sortedList[#sortedList + 1] = { key = key, value = value } |
||||
end |
||||
tsort(sortedList, compare) |
||||
for i, value in ipairs(sortedList) do |
||||
orderedKeys[#orderedKeys + 1] = value.key |
||||
end |
||||
|
||||
return orderedKeys |
||||
end |
||||
-- ~~| Dropdown Methods |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
---@class Diesal.GUI.DropDown.Methods |
||||
local methods = { |
||||
---@param self Diesal.GUI.Object.DropDown |
||||
OnAcquire = function(self) |
||||
self:ApplySettings() |
||||
self:SetStylesheet(Stylesheet) |
||||
-- self:SetStylesheet(wireFrameSheet) |
||||
self:Show() |
||||
end, |
||||
|
||||
---@param self Diesal.GUI.Object.DropDown |
||||
OnRelease = function(self) end, |
||||
|
||||
---@param self Diesal.GUI.Object.DropDown |
||||
ApplySettings = function(self) |
||||
local settings = self.settings |
||||
local content = self.content |
||||
local frame = self.frame |
||||
local children = self.children |
||||
local dropdown = self.dropdown |
||||
|
||||
frame:SetWidth(settings.width) |
||||
frame:SetHeight(settings.height) |
||||
|
||||
content:SetPoint("TOPLEFT", dropdown, settings.dropdownPadLeft, -settings.dropdownPadTop) |
||||
content:SetPoint("BOTTOMRIGHT", dropdown, -settings.dropdownPadRight, settings.dropdownPadBottom) |
||||
|
||||
local menuHeight = 0 |
||||
for i = 1, #children do |
||||
menuHeight = menuHeight + children[i].frame:GetHeight() |
||||
end |
||||
dropdown:SetHeight(settings.dropdownPadTop + menuHeight + settings.dropdownPadBottom) |
||||
end, |
||||
|
||||
---@param self Diesal.GUI.Object.DropDown |
||||
---@param list table |
||||
---@param orderedKeys? table |
||||
SetList = function(self, list, orderedKeys) |
||||
self:ReleaseChildren() |
||||
self:SetText("") |
||||
local settings = self.settings |
||||
--local orderedKeys = sortList(list, orderedKeys) |
||||
settings.list = list |
||||
local foldColor = "353535" |
||||
local expandColor = "5a5a5a" |
||||
for position, item in ipairs(list) do |
||||
local dropdownItem = DiesalGUI:Create("DiesalDropDownItem") |
||||
self:AddChild(dropdownItem) |
||||
dropdownItem:SetParentObject(self) |
||||
dropdownItem:SetSettings({ |
||||
key = item.key, |
||||
value = item.value, |
||||
position = position, |
||||
clickable = item.clickable, |
||||
indent = item.indent or 0, |
||||
}, true) |
||||
if item.indent > 0 then |
||||
local leftOffset = -6 + (-6 * item.indent) |
||||
dropdownItem:UpdateStyle("frame-lineV", { |
||||
type = "texture", |
||||
layer = "BORDER", |
||||
color = foldColor, |
||||
position = { leftOffset, nil, -8, nil }, |
||||
height = 1, |
||||
width = 6, |
||||
}) |
||||
dropdownItem:UpdateStyle("frame-lineH", { |
||||
type = "texture", |
||||
layer = "BORDER", |
||||
color = foldColor, |
||||
position = { leftOffset, nil, 0, 0 }, |
||||
width = 1, |
||||
}) |
||||
if item.last then |
||||
dropdownItem:UpdateStyle("frame-lineH", { |
||||
type = "texture", |
||||
position = { leftOffset, nil, 0, -7 }, |
||||
}) |
||||
end |
||||
end |
||||
end |
||||
|
||||
--[[ for position, key in ipairs(orderedKeys) do |
||||
---@type Diesal.GUI.Object.DropDown.Item |
||||
local dropdownItem = DiesalGUI:Create("DiesalDropDownItem") |
||||
self:AddChild(dropdownItem) |
||||
dropdownItem:SetParentObject(self) |
||||
dropdownItem:SetSettings({ |
||||
key = key, |
||||
value = list[key], |
||||
position = position, |
||||
}, true) |
||||
end ]] |
||||
self:ApplySettings() |
||||
end, |
||||
|
||||
---@param self Diesal.GUI.Object.DropDown |
||||
SetValue = function(self, key) |
||||
local selectionTable = {} |
||||
local selectedKey, dropdownText, selectedValue |
||||
|
||||
if key ~= "CLEAR" then |
||||
if self.settings.multiSelect then |
||||
for i = 1, #self.children do |
||||
if self.children[i].settings.key == key then |
||||
selectedKey = key |
||||
self.children[i]:SetSelected(true) |
||||
end |
||||
if self.children[i].settings.selected then |
||||
if dropdownText then |
||||
dropdownText = format("%s, %s", dropdownText, self.children[i].settings.value) |
||||
else |
||||
dropdownText = self.children[i].settings.value |
||||
end |
||||
selectionTable[#selectionTable + 1] = self.children[i].settings.key |
||||
end |
||||
end |
||||
else |
||||
for i = 1, #self.children do |
||||
local child = self.children[i] |
||||
child:SetSelected(false) |
||||
if child.settings.key == key then |
||||
child:SetSelected(true) |
||||
dropdownText = child.settings.value |
||||
selectionTable = { key } |
||||
selectedKey = key |
||||
selectedValue = self.value |
||||
end |
||||
end |
||||
end |
||||
else |
||||
self:ClearSelection() |
||||
end |
||||
|
||||
if selectedKey then |
||||
self:SetText(dropdownText) |
||||
self:FireEvent("OnValueChanged", selectedKey, selectedValue, selectionTable) |
||||
else |
||||
self:SetText("") |
||||
self:FireEvent("OnValueChanged", selectedKey, selectedValue, selectionTable) |
||||
end |
||||
end, |
||||
|
||||
---@param self Diesal.GUI.Object.DropDown |
||||
ClearSelection = function(self) |
||||
for i = 1, #self.children do |
||||
self.children[i]:SetSelected(false) |
||||
end |
||||
self:SetText("") |
||||
end, |
||||
|
||||
---@param self Diesal.GUI.Object.DropDown |
||||
SetValueTable = function(self, keyTable) |
||||
if not self.settings.multiSelect or type(keyTable) ~= "table" then |
||||
return |
||||
end |
||||
local dropdownItems = self.children |
||||
local selectionTable = {} |
||||
local selectedKey |
||||
local dropdownText |
||||
|
||||
for i = 1, #dropdownItems do |
||||
local dropdownItem = dropdownItems[i] |
||||
dropdownItem:SetSelected(false) |
||||
for _, key in ipairs(keyTable) do |
||||
if dropdownItem.settings.key == key then |
||||
dropdownItem:SetSelected(true) |
||||
dropdownText = dropdownText and format("%s, %s", dropdownText, dropdownItem.settings.value) or dropdownItem.settings.value |
||||
selectionTable[#selectionTable + 1] = dropdownItem.settings.key |
||||
end |
||||
end |
||||
end |
||||
self:FireEvent("OnValueChanged", nil, nil, selectionTable) |
||||
self:SetText(dropdownText) |
||||
end, |
||||
|
||||
---@param self Diesal.GUI.Object.DropDown |
||||
SetMultiSelect = function(self, state) |
||||
self.settings.multiSelect = state |
||||
end, |
||||
|
||||
---@param self Diesal.GUI.Object.DropDown |
||||
SetText = function(self, text) |
||||
self.text:SetText(text) |
||||
for i = 1, #self.children do |
||||
local child = self.children[i] |
||||
if child.settings.value == text then |
||||
self.value = child.settings.key |
||||
end |
||||
end |
||||
end, |
||||
|
||||
---@param self Diesal.GUI.Object.DropDown |
||||
SetFocus = function(self) |
||||
DiesalGUI:SetFocus(self) |
||||
end, |
||||
|
||||
---@param self Diesal.GUI.Object.DropDown |
||||
ClearFocus = function(self) |
||||
self.dropdown:Hide() |
||||
end, |
||||
|
||||
---@param self Diesal.GUI.Object.DropDown |
||||
EnableMouse = function(self, state) |
||||
self.frame:EnableMouse(state) |
||||
end, |
||||
|
||||
---@param self Diesal.GUI.Object.DropDown |
||||
RegisterForClicks = function(self, ...) |
||||
self.frame:RegisterForClicks(...) |
||||
end, |
||||
|
||||
---@param self Diesal.GUI.Object.DropDown |
||||
SetJustifyV = function(self, justify) |
||||
self.text:SetJustifyV(justify) |
||||
end, |
||||
|
||||
---@param self Diesal.GUI.Object.DropDown |
||||
SetJustifyH = function(self, justify) |
||||
self.text:SetJustifyH(justify) |
||||
end, |
||||
} |
||||
|
||||
---@class Diesal.GUI.Obeject.DropDown.Settings |
||||
---@field dropdownPadLeft number |
||||
---@field dropdownPadRight number |
||||
---@field dropdownPadTop number |
||||
---@field dropdownPadBottom number |
||||
---@field itemHeight number |
||||
---@field width number |
||||
---@field height number |
||||
---@field list table |
||||
---@field multiSelect boolean |
||||
|
||||
---@class DiesalDropDown : Diesal.GUI.Object.DropDown |
||||
|
||||
-- ~~| Dropdown Constructor |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local function Constructor() |
||||
---@class Diesal.GUI.Object.DropDown : Diesal.GUI.ObjectBase, Diesal.GUI.DropDown.Methods |
||||
---@field settings Diesal.GUI.Obeject.DropDown.Settings |
||||
---@field children Diesal.GUI.Object.DropDown.Item[] |
||||
---@field text FontString |
||||
---@field dropdown Frame |
||||
---@field content Frame |
||||
---@field value string |
||||
local self = DiesalGUI:Create(Type, true) |
||||
|
||||
local frame = CreateFrame("Button", nil, UIParent) |
||||
self.frame = frame |
||||
|
||||
self.isContainer = true |
||||
self.defaults = { |
||||
dropdownPadLeft = 4, |
||||
dropdownPadRight = 4, |
||||
dropdownPadTop = 4, |
||||
dropdownPadBottom = 4, |
||||
itemHeight = 16, |
||||
width = 100, |
||||
height = 16, |
||||
} |
||||
-- ~~ Registered Events ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
-- OnValueChanged(event,selectedKey,selectedValue,selectionTable) |
||||
-- OnValueSelected(event,selectedKey,selectedValue,selectionTable) |
||||
-- OnEnter, OnLeave |
||||
-- ~~ Construct ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
frame:SetScript("OnMouseUp", function(this, button) |
||||
if button == "LeftButton" then |
||||
local dropdown = self.dropdown |
||||
local visible = dropdown:IsVisible() |
||||
DiesalGUI:OnMouse(this, button) |
||||
dropdown[visible and "Hide" or "Show"](dropdown) |
||||
end |
||||
end) |
||||
frame:SetScript("OnClick", function(this, ...) |
||||
self:FireEvent("OnClick", ...) |
||||
end) |
||||
frame:SetScript("OnEnter", function(this, ...) |
||||
self:FireEvent("OnEnter", ...) |
||||
end) |
||||
frame:SetScript("OnLeave", function(this, ...) |
||||
self:FireEvent("OnLeave", ...) |
||||
end) |
||||
|
||||
local text = self:CreateRegion("FontString", "text", frame) |
||||
text:ClearAllPoints() |
||||
text:SetPoint("TOPLEFT", 4, -1) |
||||
text:SetPoint("BOTTOMRIGHT", -14, 1) |
||||
text:SetJustifyV("MIDDLE") |
||||
text:SetJustifyH("LEFT") |
||||
|
||||
local dropdown = self:CreateRegion("Frame", "dropdown", frame) |
||||
dropdown:SetFrameStrata("FULLSCREEN_DIALOG") |
||||
dropdown:SetPoint("TOPRIGHT", frame, "BOTTOMRIGHT", 0, -2) |
||||
dropdown:SetPoint("TOPLEFT", frame, "BOTTOMLEFT", 0, -2) |
||||
dropdown:SetScript("OnShow", function(this) |
||||
self:SetFocus() |
||||
end) |
||||
dropdown:Hide() |
||||
|
||||
self:CreateRegion("Frame", "content", dropdown) |
||||
|
||||
-- ~~ Methods ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
self:SetMethods(methods) |
||||
--[[ for method, func in pairs(methods) do |
||||
self[method] = func |
||||
end ]] |
||||
-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
return self |
||||
end |
||||
DiesalGUI:RegisterObjectConstructor(Type, Constructor, Version) |
@ -0,0 +1,171 @@ |
||||
---@type Diesal.GUI |
||||
local DiesalGUI = LibStub("DiesalGUI-2.0") |
||||
---@type Diesal.Tools |
||||
local DiesalTools = LibStub("DiesalTools-2.0") |
||||
---@type Diesal.Style |
||||
local DiesalStyle = LibStub("DiesalStyle-2.0") |
||||
|
||||
-- ~~| Lua Upvalues |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local sub, format, lower, upper, gsub = string.sub, string.format, string.lower, string.upper, string.gsub |
||||
-- ~~| WoW Upvalues |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
|
||||
-- ~~| DropdownItem |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local Type = "DiesalDropDownItem" |
||||
local Version = 2 |
||||
-- ~~| DropdownItem Stylesheets |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local Stylesheet = { |
||||
["frame-hover"] = { |
||||
type = "texture", |
||||
layer = "HIGHLIGHT", |
||||
color = "b3d9ff", |
||||
alpha = 0.1, |
||||
}, |
||||
} |
||||
-- ~~| DropdownItem Methods |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
---@class Diesal.GUI.DropDownItem.Methods |
||||
local methods = { |
||||
---@param self Diesal.GUI.Object.DropDown.Item |
||||
["OnAcquire"] = function(self) |
||||
self:ApplySettings() |
||||
self:SetStylesheet(Stylesheet) |
||||
-- self:SetStylesheet(wireFrameSheet) |
||||
self:Show() |
||||
end, |
||||
---@param self Diesal.GUI.Object.DropDown.Item |
||||
["OnRelease"] = function(self) |
||||
self.check:Hide() |
||||
end, |
||||
---@param self Diesal.GUI.Object.DropDown.Item |
||||
["ApplySettings"] = function(self) |
||||
if not self.settings.key then |
||||
return |
||||
end |
||||
|
||||
local settings = self.settings |
||||
local dropdownSettings = settings.parentObject.settings |
||||
local text = self.text |
||||
|
||||
if settings.position == 1 then |
||||
self:SetPoint("TOPLEFT") |
||||
else |
||||
self:SetPoint("TOPLEFT", settings.parentObject.children[settings.position - 1].frame, "BOTTOMLEFT", 0, 0) |
||||
end |
||||
self:SetPoint("RIGHT") |
||||
|
||||
self:SetHeight(dropdownSettings.itemHeight) |
||||
|
||||
self:SetText(settings.value) |
||||
|
||||
if settings.clickable == false then |
||||
self:UpdateStyle("frame-hover", { |
||||
type = "texture", |
||||
alpha = 0.0, |
||||
}) |
||||
end |
||||
end, |
||||
---@param self Diesal.GUI.Object.DropDown.Item |
||||
["SetText"] = function(self, text) |
||||
local indentText = self.settings.indent == 0 and "" or (" " .. (" "):rep(self.settings.indent) .. " ") |
||||
self.text:SetText(indentText .. text) |
||||
end, |
||||
---@param self Diesal.GUI.Object.DropDown.Item |
||||
["OnClick"] = function(self) |
||||
local settings = self.settings |
||||
local dropdown = settings.parentObject |
||||
local dropdownSettings = dropdown.settings |
||||
local dropdownItems = dropdown.children |
||||
|
||||
local selectionTable = {} |
||||
local dropdownText |
||||
print(settings.key, settings.value, settings.clickable) |
||||
if not settings.clickable then |
||||
return |
||||
end |
||||
if settings.key ~= "CLEAR" then |
||||
if dropdownSettings.multiSelect then |
||||
self:SetSelected(not settings.selected) |
||||
for i = 1, #dropdownItems do |
||||
if dropdownItems[i].settings.selected then |
||||
dropdownText = dropdownText and format("%s, %s", dropdownText, dropdownItems[i].settings.value) or dropdownItems[i].settings.value |
||||
selectionTable[#selectionTable + 1] = dropdownItems[i].settings.key |
||||
end |
||||
end |
||||
else |
||||
for i = 1, #dropdownItems do |
||||
if dropdownItems[i].SetSelected then |
||||
dropdownItems[i]:SetSelected(false) |
||||
end |
||||
end |
||||
self:SetSelected(true) |
||||
dropdownText = settings.value |
||||
selectionTable = { settings.key } |
||||
dropdown.dropdown:Hide() |
||||
end |
||||
else |
||||
dropdown.dropdown:Hide() |
||||
dropdown:ClearSelection() |
||||
end |
||||
|
||||
dropdown:SetText(dropdownText) |
||||
dropdown:FireEvent("OnValueChanged", settings.key, settings.value, selectionTable) |
||||
dropdown:FireEvent("OnValueSelected", settings.key, settings.value, selectionTable) |
||||
end, |
||||
---@param self Diesal.GUI.Object.DropDown.Item |
||||
["SetSelected"] = function(self, selected) |
||||
self.settings.selected = selected and true or false |
||||
self.check[selected and "Show" or "Hide"](self.check) |
||||
end, |
||||
} |
||||
|
||||
---@class Diesal.GUI.DropDownItem.Settings : Diesal.GUI.ObjectBase.Settings |
||||
---@field key string |
||||
---@field value string |
||||
---@field position number |
||||
---@field selected boolean |
||||
---@field clickable boolean |
||||
---@field indent number |
||||
---@field header boolean |
||||
|
||||
---@class DiesalDropDownItem : Diesal.GUI.Object.DropDown.Item |
||||
|
||||
-- ~~| DropdownItem Constructor |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local function Constructor() |
||||
---@class Diesal.GUI.Object.DropDown.Item : Diesal.GUI.ObjectBase, Diesal.GUI.DropDownItem.Methods |
||||
---@field check Texture |
||||
---@field text FontString |
||||
---@field settings Diesal.GUI.DropDownItem.Settings |
||||
local self = DiesalGUI:Create(Type, true) |
||||
local frame = CreateFrame("Button", nil, UIParent) |
||||
self.frame = frame |
||||
self.defaults = {} |
||||
-- ~~ Construct ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
frame:SetScript("OnClick", function(this, button) |
||||
self:OnClick() |
||||
end) |
||||
frame:SetScript("OnEnter", function(this) end) |
||||
frame:SetScript("OnLeave", function(this) end) |
||||
|
||||
local text = self:CreateRegion("FontString", "text", frame) |
||||
text:SetPoint("TOPLEFT", 12, -2) |
||||
text:SetPoint("BOTTOMRIGHT", 0, 0) |
||||
text:SetJustifyH("TOP") |
||||
text:SetJustifyH("LEFT") |
||||
text:SetWordWrap(false) |
||||
|
||||
local check = self:CreateRegion("Texture", "check", frame) |
||||
DiesalStyle:StyleTexture(check, { |
||||
position = { 2, nil, 0, nil }, |
||||
height = 16, |
||||
width = 16, |
||||
image = { "DiesalGUIcons", { 10, 5, 16, 256, 128 }, "FFFF00" }, |
||||
}) |
||||
check:Hide() |
||||
-- ~~ Methods ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
self:SetMethods(methods) |
||||
--[[ for method, func in pairs(methods) do |
||||
self[method] = func |
||||
end ]] |
||||
-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
return self |
||||
end |
||||
DiesalGUI:RegisterObjectConstructor(Type, Constructor, Version) |
@ -0,0 +1,131 @@ |
||||
---@type Diesal.GUI |
||||
local DiesalGUI = LibStub("DiesalGUI-2.0") |
||||
---@type Diesal.Tools |
||||
local DiesalTools = LibStub("DiesalTools-2.0") |
||||
---@type Diesal.Style |
||||
local DiesalStyle = LibStub("DiesalStyle-2.0") |
||||
-- ~~| Diesal Upvalues |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local Colors = DiesalStyle.Colors |
||||
local HSL, ShadeColor, TintColor = DiesalTools.HSL, DiesalTools.ShadeColor, DiesalTools.TintColor |
||||
-- ~~| Lua Upvalues |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
-- | Input |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local Type = "DiesalInput" |
||||
local Version = 1 |
||||
-- | Stylesheets |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local Stylesheet = { |
||||
["frame-background"] = { |
||||
type = "texture", |
||||
layer = "BACKGROUND", |
||||
color = "000000", |
||||
alpha = 0.6, |
||||
}, |
||||
["editBox-outline"] = { |
||||
type = "outline", |
||||
layer = "BORDER", |
||||
color = "FFFFFF", |
||||
alpha = 0.02, |
||||
position = 1, |
||||
}, |
||||
["editBox-inline"] = { |
||||
type = "outline", |
||||
layer = "BORDER", |
||||
color = "000000", |
||||
alpha = 0.7, |
||||
}, |
||||
["editBox-hover"] = { |
||||
type = "texture", |
||||
layer = "HIGHLIGHT", |
||||
color = "ffffff", |
||||
alpha = 0.05, |
||||
position = -1, |
||||
}, |
||||
["editBox-font"] = { |
||||
type = "Font", |
||||
color = Colors.UI_TEXT, |
||||
}, |
||||
} |
||||
|
||||
-- ~~| Spinner Methods |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
---@class Diesal.GUI.Input.Methods |
||||
local methods = { |
||||
["OnAcquire"] = function(self) |
||||
self:SetStylesheet(Stylesheet) |
||||
self:ApplySettings() |
||||
self:Show() |
||||
end, |
||||
["OnRelease"] = function(self) end, |
||||
["ApplySettings"] = function(self) |
||||
self:SetWidth(self.settings.width) |
||||
self:SetHeight(self.settings.height) |
||||
end, |
||||
["GetText"] = function(self) |
||||
return self.editBox:GetText() |
||||
end, |
||||
["SetText"] = function(self, txt) |
||||
self.editBox:SetText(txt) |
||||
end, |
||||
["SetTextColor"] = function(self, color, alpha) |
||||
alpha = alpha or 1 |
||||
color = { DiesalTools.GetColor(color) } |
||||
self.editBox:SetTextColor(color[1], color[2], color[3], alpha) |
||||
end, |
||||
} |
||||
|
||||
---@class DiesalInput : Diesal.GUI.Object.Input |
||||
|
||||
-- | Constructor |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local function Constructor() |
||||
---@class Diesal.GUI.Object.Input : Diesal.GUI.ObjectBase, Diesal.GUI.Input.Methods |
||||
local self = DiesalGUI:Create(Type, true) |
||||
local frame = CreateFrame("Frame", nil, UIParent) |
||||
self.frame = frame |
||||
self.defaults = { |
||||
height = 16, |
||||
width = 50, |
||||
mouse = true, |
||||
} |
||||
-- ~~ Events ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
-- OnAcquire, OnRelease, OnHeightSet, OnWidthSet |
||||
-- OnEnter, OnLeave, OnEnterPressed, OnValueChanged |
||||
-- ~~ Construct ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
frame:SetScript("OnHide", function(this) |
||||
self:FireEvent("OnHide") |
||||
end) |
||||
|
||||
---@type Diesal.GUI.Region.EditBox |
||||
local editBox = self:CreateRegion("EditBox", "editBox", frame) |
||||
editBox:SetAllPoints() |
||||
editBox:SetAutoFocus(false) |
||||
editBox:SetJustifyH("LEFT") |
||||
editBox:SetJustifyV("CENTER") |
||||
editBox:SetTextInsets(3, 0, 2, 0) |
||||
editBox:SetScript("OnEnterPressed", function(this, ...) |
||||
self:FireEvent("OnEnterPressed", ...) |
||||
DiesalGUI:ClearFocus() |
||||
end) |
||||
editBox:HookScript("OnEscapePressed", function(this, ...) |
||||
self:FireEvent("OnEscapePressed", ...) |
||||
end) |
||||
editBox:HookScript("OnEditFocusLost", function(this, ...) |
||||
self:FireEvent("OnEditFocusLost", ...) |
||||
end) |
||||
editBox:HookScript("OnEditFocusGained", function(this, ...) |
||||
self:FireEvent("OnEditFocusGained", ...) |
||||
end) |
||||
editBox:SetScript("OnEnter", function(this, ...) |
||||
self:FireEvent("OnEnter", ...) |
||||
end) |
||||
editBox:SetScript("OnLeave", function(this, ...) |
||||
self:FireEvent("OnLeave", ...) |
||||
end) |
||||
|
||||
-- ~~ Methods ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
self:SetMethods(methods) |
||||
--[[ for method, func in pairs(methods) do |
||||
self[method] = func |
||||
end ]] |
||||
-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
return self |
||||
end |
||||
|
||||
DiesalGUI:RegisterObjectConstructor(Type, Constructor, Version) |
@ -0,0 +1,479 @@ |
||||
---@type Tinkr, Bastion |
||||
|
||||
---@type Diesal.GUI |
||||
local DiesalGUI = LibStub("DiesalGUI-2.0") |
||||
|
||||
---@type Diesal.Tools |
||||
local DiesalTools = LibStub("DiesalTools-2.0") |
||||
|
||||
---@type Diesal.Style |
||||
local DiesalStyle = LibStub("DiesalStyle-2.0") |
||||
|
||||
local Type = "DiesalObjectBase" |
||||
local Version = 1 |
||||
|
||||
---@class Diesal.GUI.ObjectBase.Methods |
||||
local ObjectBase = { |
||||
--#region Diesal.GUI.Objectbase.BaseMethods |
||||
|
||||
--#region BlizzardFrameMethods |
||||
|
||||
---@generic T : Diesal.GUI.ObjectBase |
||||
---@param self T | Diesal.GUI.ObjectBase |
||||
Hide = function(self) |
||||
self.frame:Hide() |
||||
end, |
||||
|
||||
---@generic T : Diesal.GUI.ObjectBase |
||||
---@param self T | Diesal.GUI.ObjectBase |
||||
Show = function(self) |
||||
self.frame:Show() |
||||
end, |
||||
|
||||
---@generic T : Diesal.GUI.ObjectBase |
||||
---@param self T | Diesal.GUI.ObjectBase |
||||
---@param parent Frame |
||||
SetParent = function(self, parent) |
||||
local frame = self.frame |
||||
frame:SetParent(nil) |
||||
frame:SetParent(parent) |
||||
self.settings.parent = parent |
||||
end, |
||||
|
||||
---@generic T : Diesal.GUI.ObjectBase |
||||
---@param self T | Diesal.GUI.ObjectBase |
||||
GetWidth = function(self) |
||||
return self.frame:GetWidth() |
||||
end, |
||||
|
||||
---@generic T : Diesal.GUI.ObjectBase |
||||
---@param self T | Diesal.GUI.ObjectBase |
||||
SetWidth = function(self, width) |
||||
self.settings.width = width |
||||
self.frame:SetWidth(width) |
||||
self:FireEvent("OnWidthSet", width) |
||||
end, |
||||
|
||||
---@generic T : Diesal.GUI.ObjectBase |
||||
---@param self T | Diesal.GUI.ObjectBase |
||||
GetHeight = function(self) |
||||
return self.frame:GetHeight() |
||||
end, |
||||
|
||||
---@generic T : Diesal.GUI.ObjectBase |
||||
---@param self T | Diesal.GUI.ObjectBase |
||||
---@param height number |
||||
SetHeight = function(self, height) |
||||
self.settings.height = height |
||||
self.frame:SetHeight(height) |
||||
self:FireEvent("OnHeightSet", height) |
||||
end, |
||||
|
||||
---@generic T : Diesal.GUI.ObjectBase |
||||
---@param self T | Diesal.GUI.ObjectBase |
||||
---@return number width, number height |
||||
GetSize = function(self) |
||||
return self.frame:GetSize() |
||||
end, |
||||
|
||||
---@generic T : Diesal.GUI.ObjectBase |
||||
---@param self T | Diesal.GUI.ObjectBase |
||||
---@param width number |
||||
---@param height number |
||||
SetSize = function(self, width, height) |
||||
self.settings.width = width |
||||
self.settings.height = height |
||||
|
||||
--TODO: Transition to SetSize? |
||||
self.frame:SetSize(width, height) |
||||
--self.frame:SetHeight(height) |
||||
--self.frame:SetWidth(width) |
||||
|
||||
self:FireEvent("OnWidthSet", width) |
||||
self:FireEvent("OnHeightSet", height) |
||||
self:FireEvent("OnSizeSet", width, height) |
||||
end, |
||||
|
||||
---@generic T : Diesal.GUI.ObjectBase |
||||
---@param self T | Diesal.GUI.ObjectBase |
||||
IsVisible = function(self) |
||||
return self.frame:IsVisible() |
||||
end, |
||||
|
||||
---@generic T : Diesal.GUI.ObjectBase |
||||
---@param self T | Diesal.GUI.ObjectBase |
||||
IsShown = function(self) |
||||
return self.frame:IsShown() |
||||
end, |
||||
|
||||
---@generic T : Diesal.GUI.ObjectBase |
||||
---@param self T | Diesal.GUI.ObjectBase |
||||
SetPoint = function(self, ...) |
||||
self.frame:SetPoint(...) |
||||
end, |
||||
|
||||
---@generic T : Diesal.GUI.ObjectBase |
||||
---@param self T | Diesal.GUI.ObjectBase |
||||
SetAllPoints = function(self, ...) |
||||
return self.frame:SetAllPoints(...) |
||||
end, |
||||
|
||||
---@generic T : Diesal.GUI.ObjectBase |
||||
---@param self T | Diesal.GUI.ObjectBase |
||||
ClearAllPoints = function(self) |
||||
return self.frame:ClearAllPoints() |
||||
end, |
||||
|
||||
---@generic T : Diesal.GUI.ObjectBase |
||||
---@param self T | Diesal.GUI.ObjectBase |
||||
GetNumPoints = function(self) |
||||
return self.frame:GetNumPoints() |
||||
end, |
||||
|
||||
---@generic T : Diesal.GUI.ObjectBase |
||||
---@param self T | Diesal.GUI.ObjectBase |
||||
GetPoint = function(self, ...) |
||||
return self.frame:GetPoint(...) |
||||
end, |
||||
|
||||
--#endregion BlizzardFrameMethods |
||||
|
||||
---@class Diesal.GUI.Region.FontString : { defaultFontObject: Font }, FontString |
||||
|
||||
---@class Diesal.GUI.Region.EditBox : EditBox, FontableFrameMixin |
||||
---@field defaultFontObject Font |
||||
|
||||
---@class Diesal.GUI.Region.ScrollingMessageFrame : ScrollingMessageFrame |
||||
---@field defaultFontObject Font |
||||
|
||||
---@alias Diesal.GUI.Region.Custom |
||||
---|Diesal.GUI.Region.FontString |
||||
---|Diesal.GUI.Region.EditBox |
||||
---|Diesal.GUI.Region.ScrollingMessageFrame |
||||
|
||||
---@alias Diesal.GUI.Parent.Region |
||||
---|Frame |
||||
---|Texture |
||||
---|Diesal.Object |
||||
|
||||
--#region DiesalObjectMethods |
||||
|
||||
---@generic RT |
||||
---@generic T : Diesal.GUI.ObjectBase |
||||
---@param self T | Diesal.GUI.ObjectBase |
||||
---@param regionType `RT` | "FontString" | "Texture" | "EditBox" | "ScrollingMessageFrame" | FrameType |
||||
---@param regionName string |
||||
---@param parentRegion Diesal.GUI.Parent.Region |
||||
---@param defaultFontObject? Font |
||||
---@param ... any |
||||
---@return RT |
||||
CreateRegion = function(self, regionType, regionName, parentRegion, defaultFontObject, ...) |
||||
if regionType == "FontString" then |
||||
---@type Diesal.GUI.Region.FontString |
||||
local fontString = parentRegion:CreateFontString() |
||||
fontString.defaultFontObject = defaultFontObject or _G.DiesalFontNormal |
||||
fontString:SetFont(fontString.defaultFontObject:GetFont()) |
||||
fontString:SetTextColor(fontString.defaultFontObject:GetTextColor()) |
||||
fontString:SetSpacing(fontString.defaultFontObject:GetSpacing()) |
||||
|
||||
self[regionName] = fontString |
||||
self.fontStrings[regionName] = fontString |
||||
return fontString |
||||
end |
||||
|
||||
if regionType == "Texture" then |
||||
self[regionName] = parentRegion:CreateTexture(...) |
||||
return self[regionName] |
||||
end |
||||
|
||||
if regionType == "EditBox" then |
||||
local editBox = CreateFrame("EditBox", nil, parentRegion, ...) ---@cast editBox Diesal.GUI.Region.EditBox |
||||
-- set Default font properties |
||||
editBox.defaultFontObject = defaultFontObject or _G.DiesalFontNormal |
||||
editBox:SetFont(editBox.defaultFontObject:GetFont()) |
||||
editBox:SetTextColor(editBox.defaultFontObject:GetTextColor()) |
||||
editBox:SetSpacing(editBox.defaultFontObject:GetSpacing()) |
||||
|
||||
editBox:HookScript("OnEscapePressed", function(this) |
||||
DiesalGUI:ClearFocus() |
||||
end) |
||||
editBox:HookScript("OnEditFocusGained", function(this) |
||||
DiesalGUI:SetFocus(this) |
||||
GameTooltip:Hide() |
||||
end) |
||||
|
||||
self[regionName] = editBox |
||||
return editBox |
||||
end |
||||
|
||||
if regionType == "ScrollingMessageFrame" then |
||||
local srollingMessageFrame = CreateFrame("ScrollingMessageFrame", nil, parentRegion, ...) ---@cast srollingMessageFrame Diesal.GUI.Region.ScrollingMessageFrame |
||||
-- set Default font properties |
||||
srollingMessageFrame.defaultFontObject = defaultFontObject or _G.DiesalFontNormal |
||||
srollingMessageFrame:SetFont(srollingMessageFrame.defaultFontObject:GetFont()) |
||||
srollingMessageFrame:SetTextColor(srollingMessageFrame.defaultFontObject:GetTextColor()) |
||||
srollingMessageFrame:SetSpacing(srollingMessageFrame.defaultFontObject:GetSpacing()) |
||||
|
||||
self[regionName] = srollingMessageFrame |
||||
return srollingMessageFrame |
||||
end |
||||
|
||||
self[regionName] = CreateFrame(regionType, nil, parentRegion, ...) |
||||
return self[regionName] |
||||
end, |
||||
|
||||
---@generic T : Diesal.GUI.ObjectBase |
||||
---@param self T | Diesal.GUI.ObjectBase |
||||
---@param methods? table<string, fun(self: self, ...): any> |
||||
SetMethods = function(self, methods) |
||||
if methods and type(methods) == "table" then |
||||
for method, func in pairs(methods) do |
||||
if type(func) == "function" then |
||||
self.methods[method] = func |
||||
end |
||||
end |
||||
end |
||||
end, |
||||
|
||||
---@generic T : Diesal.GUI.ObjectBase |
||||
---@param self T | Diesal.GUI.ObjectBase |
||||
ResetFonts = function(self) |
||||
for name, fontString in pairs(self.fontStrings) do |
||||
fontString:SetFont(fontString.defaultFontObject:GetFont()) |
||||
fontString:SetTextColor(fontString.defaultFontObject:GetTextColor()) |
||||
fontString:SetSpacing(fontString.defaultFontObject:GetSpacing()) |
||||
end |
||||
end, |
||||
|
||||
---@generic T : Diesal.GUI.ObjectBase |
||||
---@param self T | Diesal.GUI.ObjectBase |
||||
---@param object Diesal.Object |
||||
AddChild = function(self, object) |
||||
tinsert(self.children, object) |
||||
end, |
||||
|
||||
---@generic T : Diesal.GUI.ObjectBase |
||||
---@param self T | Diesal.GUI.ObjectBase |
||||
Release = function(self) |
||||
DiesalGUI:Release(self) |
||||
end, |
||||
|
||||
---@generic T : Diesal.GUI.ObjectBase |
||||
---@param self T | Diesal.GUI.ObjectBase |
||||
---@param object Diesal.Object |
||||
ReleaseChild = function(self, object) |
||||
local children = self.children |
||||
|
||||
for i = 1, #children do |
||||
if children[i] == object then |
||||
children[i]:Release() |
||||
tremove(children, i) |
||||
break |
||||
end |
||||
end |
||||
end, |
||||
|
||||
---@generic T : Diesal.GUI.ObjectBase |
||||
---@param self T | Diesal.GUI.ObjectBase |
||||
ReleaseChildren = function(self) |
||||
local children = self.children |
||||
for i = 1, #children do |
||||
children[i]:Release() |
||||
children[i] = nil |
||||
end |
||||
end, |
||||
|
||||
---@generic T : Diesal.GUI.ObjectBase |
||||
---@param self T | Diesal.GUI.ObjectBase |
||||
---@param parent? Diesal.Object |
||||
SetParentObject = function(self, parent) |
||||
local frame = self.frame |
||||
local settings = self.settings |
||||
|
||||
frame:SetParent(nil) |
||||
if parent then |
||||
frame:SetParent(parent.content) |
||||
settings.parent = parent.content |
||||
end |
||||
|
||||
settings.parentObject = parent |
||||
end, |
||||
|
||||
---@generic T : Diesal.GUI.ObjectBase |
||||
---@param self T | Diesal.GUI.ObjectBase |
||||
---@param settings table |
||||
---@param apply? boolean |
||||
SetSettings = function(self, settings, apply) |
||||
for key, value in pairs(settings) do |
||||
self.settings[key] = value |
||||
end |
||||
if apply then |
||||
self:ApplySettings() |
||||
end |
||||
end, |
||||
|
||||
---@generic T : Diesal.GUI.ObjectBase |
||||
---@param self T | Diesal.GUI.ObjectBase |
||||
---@param apply? boolean |
||||
ResetSettings = function(self, apply) |
||||
self.settings = DiesalTools.TableCopy(self.defaults or {}) |
||||
if apply then |
||||
self:ApplySettings() |
||||
end |
||||
end, |
||||
|
||||
---@generic T : Diesal.GUI.ObjectBase |
||||
---@param self T | Diesal.GUI.ObjectBase |
||||
---@param event string |
||||
FireEvent = function(self, event, ...) |
||||
if self.eventListeners[event] then |
||||
return self.eventListeners[event](self, event, ...) |
||||
end |
||||
end, |
||||
|
||||
---@generic T : Diesal.GUI.ObjectBase |
||||
---@param self T | Diesal.GUI.ObjectBase |
||||
---@param event string |
||||
---@param listener fun(self: T, event: string, ...) |
||||
SetEventListener = function(self, event, listener) |
||||
if type(listener) == "function" then |
||||
self.eventListeners[event] = listener |
||||
else |
||||
error("listener is required to be a function", 2) |
||||
end |
||||
end, |
||||
|
||||
---@generic T : Diesal.GUI.ObjectBase |
||||
---@param self T | Diesal.GUI.ObjectBase |
||||
ResetEventListeners = function(self) |
||||
for k in pairs(self.eventListeners) do |
||||
self.eventListeners[k] = nil |
||||
end |
||||
end, |
||||
|
||||
---@generic T : Diesal.GUI.ObjectBase |
||||
---@param self T | Diesal.GUI.ObjectBase |
||||
---@param name string |
||||
---@param style Diesal.Style.Style |
||||
SetStyle = function(self, name, style) |
||||
DiesalStyle:SetObjectStyle(self, name, style) |
||||
end, |
||||
|
||||
---@generic T : Diesal.GUI.ObjectBase |
||||
---@param self T | Diesal.GUI.ObjectBase |
||||
---@param name string |
||||
---@param style Diesal.Style.Style |
||||
UpdateStyle = function(self, name, style) |
||||
DiesalStyle:UpdateObjectStyle(self, name, style) |
||||
end, |
||||
|
||||
---@generic T : Diesal.GUI.ObjectBase |
||||
---@param self T | Diesal.GUI.ObjectBase |
||||
---@param Stylesheet Diesal.Style.Stylesheet |
||||
UpdateStylesheet = function(self, Stylesheet) |
||||
DiesalStyle:UpdateObjectStylesheet(self, Stylesheet) |
||||
end, |
||||
|
||||
---@generic T : Diesal.GUI.ObjectBase |
||||
---@param self T | Diesal.GUI.ObjectBase |
||||
---@param Stylesheet Diesal.Style.Stylesheet |
||||
SetStylesheet = function(self, Stylesheet) |
||||
DiesalStyle:SetObjectStylesheet(self, Stylesheet) |
||||
end, |
||||
|
||||
---@generic T : Diesal.GUI.ObjectBase |
||||
---@param self T | Diesal.GUI.ObjectBase |
||||
---@param name string |
||||
ReleaseTexture = function(self, name) |
||||
if not self.textures[name] then |
||||
return |
||||
end |
||||
DiesalStyle:ReleaseTexture(self, name) |
||||
end, |
||||
|
||||
---@generic T : Diesal.GUI.ObjectBase |
||||
---@param self T | Diesal.GUI.ObjectBase |
||||
ReleaseTextures = function(self) |
||||
DiesalStyle:ReleaseTextures(self) |
||||
end, |
||||
|
||||
--#endregion DiesalObjectMethods |
||||
|
||||
--#endregion Diesal.GUI.Objectbase.BaseMethods |
||||
} |
||||
|
||||
DiesalGUI.ObjectBase = ObjectBase |
||||
|
||||
---@class Diesal.GUI.ObjectBase.Settings |
||||
---@field parent Frame |
||||
---@field parentObject Diesal.Object |
||||
---@field height number |
||||
---@field width number |
||||
|
||||
---@class Diesal.GUI.ObjectBase.Methods |
||||
---@field OnAcquire fun() |
||||
---@field OnRelease fun() |
||||
---@field ApplySettings fun() |
||||
|
||||
---@alias DiesalObjectBase Diesal.GUI.ObjectBase |
||||
|
||||
-- Returns an Object Base |
||||
---@param objectType string | Diesal.Object.Type |
||||
local Constructor = function(objectType) |
||||
---@class Diesal.GUI.ObjectBase : Diesal.GUI.ObjectBase.Methods |
||||
---@field frame Frame |
||||
---@field isContainer boolean |
||||
---@field type Diesal.Object.Type |
||||
---@field fontStrings { [string]: Diesal.GUI.Region.FontString } |
||||
---@field textures { [string]: Diesal.Style.Texture } |
||||
---@field children { [number]: Diesal.GUI.ObjectBase } |
||||
---@field eventListeners { [string]: fun(self: self, event: string, ...) } |
||||
---@field settings Diesal.GUI.ObjectBase.Settings |
||||
---@field defaults Diesal.GUI.ObjectBase.Settings |
||||
local object = { |
||||
isContainer = false, |
||||
type = objectType, |
||||
fontStrings = {}, |
||||
textures = {}, |
||||
children = {}, |
||||
eventListeners = {}, |
||||
methods = {}, |
||||
} |
||||
|
||||
for k, v in pairs(ObjectBase) do |
||||
object.methods[k] = v |
||||
end |
||||
|
||||
setmetatable(object, { |
||||
---@param self Diesal.GUI.ObjectBase |
||||
__index = function(self, k) |
||||
local response = rawget(object, k) |
||||
if response ~= nil then |
||||
return response |
||||
end |
||||
-- Look for replaced methods. |
||||
response = object.methods[k] |
||||
if response ~= nil then |
||||
return response |
||||
end |
||||
|
||||
return rawget(object, k) |
||||
end, |
||||
}) |
||||
return object |
||||
end |
||||
|
||||
DiesalGUI:RegisterObjectConstructor(Type, Constructor, Version) |
||||
|
||||
--[[ function DiesalGUI:CreateObjectBase(objectType) |
||||
local object = { |
||||
isContainer = false, |
||||
type = objectType, |
||||
fontStrings = {}, |
||||
textures = {}, |
||||
children = {}, |
||||
eventListeners = {}, |
||||
} |
||||
setmetatable(object, { __index = ObjectBase }) |
||||
return object |
||||
end ]] |
@ -0,0 +1,151 @@ |
||||
---@type Diesal.GUI |
||||
local DiesalGUI = LibStub("DiesalGUI-2.0") |
||||
---@type Diesal.Tools |
||||
local DiesalTools = LibStub("DiesalTools-2.0") |
||||
---@type Diesal.Style |
||||
local DiesalStyle = LibStub("DiesalStyle-2.0") |
||||
-- | Lua Upvalues |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local print, type, select, tostring, tonumber = print, type, select, tostring, tonumber |
||||
local sub, format, match, lower = string.sub, string.format, string.match, string.lower |
||||
local table_sort = table.sort |
||||
local abs = math.abs |
||||
-- | WoW Upvalues |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
|
||||
-- | TableExplorer |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local Type = "DiesalQuickDoc" |
||||
local Version = 1 |
||||
-- | Stylesheets |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local windowStylesheet = { |
||||
["content-background"] = { |
||||
type = "texture", |
||||
color = "131517", |
||||
}, |
||||
} |
||||
|
||||
-- | Local |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
|
||||
local doc = { |
||||
{ |
||||
type = "section", |
||||
margin = { 0, 0, 0, 0 }, |
||||
padding = { 0, 0, 0, 0 }, |
||||
style = {}, |
||||
{ type = "single-line", text = "Editor", font = nil, fontSize = 14 }, |
||||
{ type = "columns", text = "Editor", font = nil, fontSize = 14 }, |
||||
}, |
||||
} |
||||
|
||||
-- | Methods |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
---@class Diesal.GUI.QuickDoc.Methods |
||||
local methods = { |
||||
["OnAcquire"] = function(self) |
||||
self.settings = DiesalTools.TableCopy(self.defaults) |
||||
self:ApplySettings() |
||||
self:Show() |
||||
end, |
||||
["OnRelease"] = function(self) |
||||
self.tree:ReleaseChildren() |
||||
end, |
||||
["ApplySettings"] = function(self) end, |
||||
["BuildDoc"] = function(self, doc) |
||||
-- if #doc == 0 then error('BuildDoc(doc) doc requires atleast one section') |
||||
-- local settings = self.settings |
||||
-- -- reset |
||||
-- self:ReleaseChildren() |
||||
-- -- setup |
||||
-- settings.doc = doc |
||||
-- |
||||
-- if #doc == 0 then |
||||
-- tree:UpdateHeight() |
||||
-- self.statusText:SetText('|cffff0000Table is empty.') |
||||
-- return end |
||||
-- -- sort tree table |
||||
-- local sortedTable = sortTable(settings.exploredTable) |
||||
-- -- build Tree Branches |
||||
-- for position, key in ipairs(sortedTable) do |
||||
-- if self.settings.endtime <= time() then self:Timeout() return end |
||||
-- self:BuildBranch(self.tree,key[2],settings.exploredTable[key[2]],position,1,position == #sortedTable) |
||||
-- end |
||||
end, |
||||
["BuildSection"] = function(self, parent, key, value, position, depth, last) |
||||
-- local tree = self.tree |
||||
-- local leaf = type(value) ~= 'table' or next(value) == nil or depth >= self.settings.maxDepth |
||||
-- local branch = DiesalGUI:Create('Branch') |
||||
-- -- | Reset Branch |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
-- branch:ReleaseChildren() |
||||
-- -- | setup Branch |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
-- branch:SetParentObject(parent) |
||||
-- parent:AddChild(branch) |
||||
-- branch:SetSettings({ |
||||
-- key = key, |
||||
-- value = value, |
||||
-- position = position, |
||||
-- depth = depth, |
||||
-- last = last, |
||||
-- leaf = leaf, |
||||
-- }) |
||||
-- branch:SetEventListener('OnClick',function(this,event,button) |
||||
-- if button =='RightButton' then |
||||
-- if not next(this.settings.menuData) then return end |
||||
-- DiesalMenu:Menu(this.settings.menuData,this.frame,10,-10) |
||||
-- end |
||||
-- end) |
||||
-- |
||||
-- self:SetBranchLabel(branch,key,value,leaf) |
||||
-- self:SetBranchMenu(branch,key,value) |
||||
-- self:SetBranchIcon(branch,type(value)) |
||||
-- |
||||
-- if value == tree or leaf then branch:ApplySettings() return end |
||||
-- -- | sort Branch Table |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
-- local sortedTable = sortTable(value) |
||||
-- -- | build Branch Branches |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
-- for position, key in ipairs(sortedTable) do |
||||
-- if self.settings.endtime <= time() then self:Timeout() return end |
||||
-- self:BuildBranch(branch,key[2],value[key[2]],position,depth+1,position == #sortedTable) |
||||
-- end |
||||
-- -- | Update Branch | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
-- branch:ApplySettings() |
||||
end, |
||||
["Show"] = function(self) |
||||
self.window:Show() |
||||
end, |
||||
} |
||||
|
||||
---@class DiesalQuickDoc : Diesal.GUI.Object.QuickDoc |
||||
|
||||
-- ~~| TableExplorer Constructor |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local function Constructor() |
||||
---@class Diesal.GUI.Object.QuickDoc : Diesal.GUI.ObjectBase, Diesal.GUI.QuickDoc.Methods |
||||
local self = DiesalGUI:Create(Type, true) |
||||
self.isContainer = true |
||||
self.defaults = {} |
||||
|
||||
---@type Diesal.GUI.Object.Window |
||||
local window = DiesalGUI:Create("DiesalWindow") |
||||
|
||||
window:SetSettings({ |
||||
header = false, |
||||
footer = false, |
||||
top = UIParent:GetHeight() - 100, |
||||
left = 100, |
||||
height = 300, |
||||
width = 400, |
||||
minWidth = 200, |
||||
minHeight = 200, |
||||
}, true) |
||||
window:SetStylesheet(windowStylesheet) |
||||
|
||||
-- ~~ Frames ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
self.window = window |
||||
self.content = window.content |
||||
self.frame = window.frame |
||||
|
||||
-- ~~ Methods ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
self:SetMethods(methods) |
||||
--[[ for method, func in pairs(methods) do |
||||
self[method] = func |
||||
end ]] |
||||
-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
return self |
||||
end |
||||
DiesalGUI:RegisterObjectConstructor(Type, Constructor, Version) |
@ -0,0 +1,317 @@ |
||||
---@type Diesal.GUI |
||||
local DiesalGUI = LibStub("DiesalGUI-2.0") |
||||
---@type Diesal.Tools |
||||
local DiesalTools = LibStub("DiesalTools-2.0") |
||||
---@type Diesal.Style |
||||
local DiesalStyle = LibStub("DiesalStyle-2.0") |
||||
-- ~~| Diesal Upvalues |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local Colors = DiesalStyle.Colors |
||||
local HSL, ShadeColor, TintColor = DiesalTools.HSL, DiesalTools.ShadeColor, DiesalTools.TintColor |
||||
-- ~~| Lua Upvalues |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local type, select, pairs, tonumber = type, select, pairs, tonumber |
||||
local setmetatable, getmetatable, next = setmetatable, getmetatable, next |
||||
local sub, format, lower, upper = string.sub, string.format, string.lower, string.upper |
||||
local floor, ceil, min, max, abs, modf = math.floor, math.ceil, math.min, math.max, math.abs, math.modf |
||||
-- ~~| WoW Upvalues |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local GetCursorPosition = GetCursorPosition |
||||
-- ~~| ScrollFrame |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local Type = "DiesalScrollFrame" |
||||
local Version = 3 |
||||
-- ~~| ScrollFrame Stylesheets |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local Stylesheet = { |
||||
["track-background"] = { |
||||
type = "texture", |
||||
layer = "BACKGROUND", |
||||
color = "000000", |
||||
alpha = 0.3, |
||||
}, |
||||
["grip-background"] = { |
||||
type = "texture", |
||||
layer = "BACKGROUND", |
||||
color = Colors.UI_400, |
||||
}, |
||||
["grip-inline"] = { |
||||
type = "outline", |
||||
layer = "BORDER", |
||||
color = "FFFFFF", |
||||
alpha = 0.02, |
||||
}, |
||||
} |
||||
local wireFrame = { |
||||
["frame-white"] = { |
||||
type = "outline", |
||||
layer = "OVERLAY", |
||||
color = "ffffff", |
||||
}, |
||||
["scrollFrameContainer-yellow"] = { |
||||
type = "outline", |
||||
layer = "OVERLAY", |
||||
color = "ffff00", |
||||
}, |
||||
["scrollFrame-orange"] = { |
||||
type = "outline", |
||||
layer = "OVERLAY", |
||||
color = "ff7f00", |
||||
}, |
||||
["scrollBar-blue"] = { |
||||
type = "outline", |
||||
layer = "OVERLAY", |
||||
color = "0080ff", |
||||
}, |
||||
["track-green"] = { |
||||
type = "outline", |
||||
layer = "OVERLAY", |
||||
color = "00ff00", |
||||
}, |
||||
["grip-purple"] = { |
||||
type = "outline", |
||||
layer = "OVERLAY", |
||||
color = "a800ff", |
||||
}, |
||||
} |
||||
-- ~~| ScrollFrame Locals |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local internal |
||||
|
||||
---@class DiesalScrollFrame : Diesal.GUI.Object.ScrollFrame |
||||
|
||||
-- ~~| ScrollFrame Methods |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
---@class Diesal.GUI.ScrollFrame.Methods |
||||
local methods = { |
||||
["OnAcquire"] = function(self) |
||||
self:ApplySettings() |
||||
self:SetStylesheet(Stylesheet) |
||||
--self:SetStylesheet(wireFrame) |
||||
self:Show() |
||||
end, |
||||
["OnRelease"] = function(self) end, |
||||
["ApplySettings"] = function(self) |
||||
local settings = self.settings |
||||
local scrollFrame = self.scrollFrame |
||||
|
||||
scrollFrame:SetPoint("TOPLEFT", settings.contentPadding[1], -settings.contentPadding[3]) |
||||
scrollFrame:SetPoint("BOTTOMRIGHT", -settings.contentPadding[2], settings.contentPadding[4]) |
||||
|
||||
self.scrollBar:SetWidth(settings.scrollBarWidth) |
||||
self.scrollBar:SetPoint("TOPRIGHT", -settings.scrollBarPadding[2], -settings.scrollBarPadding[3]) |
||||
self.scrollBar:SetPoint("BOTTOMRIGHT", -settings.scrollBarPadding[2], settings.scrollBarPadding[4]) |
||||
|
||||
if settings.scrollBarButtons then |
||||
self.track:SetPoint("TOP", 0, -settings.scrollBarButtonHeight) |
||||
self.track:SetPoint("BOTTOM", 0, settings.scrollBarButtonHeight) |
||||
|
||||
self.buttonDown:SetHeight(settings.scrollBarButtonHeight) |
||||
self.buttonUp:SetHeight(settings.scrollBarButtonHeight) |
||||
self.buttonUp:Show() |
||||
self.buttonDown:Show() |
||||
else |
||||
self.track:SetPoint("TOP", 0, 0) |
||||
self.track:SetPoint("BOTTOM", 0, 0) |
||||
|
||||
self.buttonUp:Hide() |
||||
self.buttonDown:Hide() |
||||
end |
||||
self.content:SetHeight(settings.contentHeight) |
||||
end, |
||||
---@param height number |
||||
["SetContentHeight"] = function(self, height) |
||||
height = height < 1 and 1 or height -- height of 0 wont hide scrollbar |
||||
self.settings.contentHeight = height |
||||
self.content:SetHeight(height) |
||||
end, |
||||
["SetGripSize"] = function(self) |
||||
local contentSize = self.scrollFrame:GetVerticalScrollRange() + self.scrollFrame:GetHeight() |
||||
local windowSize = self.scrollFrame:GetHeight() |
||||
local trackSize = self.track:GetHeight() |
||||
local windowContentRatio = windowSize / contentSize |
||||
local gripSize = DiesalTools.Round(trackSize * windowContentRatio) |
||||
|
||||
gripSize = max(gripSize, 10) -- might give this a setting? |
||||
gripSize = min(gripSize, trackSize) |
||||
|
||||
self.grip:SetHeight(gripSize) |
||||
end, |
||||
["SetScrollThumbPosition"] = function(self) |
||||
local verticalScrollRange = self.scrollFrame:GetVerticalScrollRange() -- windowScrollAreaSize (rounded no need to round) |
||||
if verticalScrollRange < 1 then |
||||
self.grip:SetPoint("TOP", 0, 0) |
||||
return |
||||
end |
||||
local verticalScroll = self.scrollFrame:GetVerticalScroll() -- windowPosition |
||||
local trackSize = self.track:GetHeight() |
||||
local gripSize = self.grip:GetHeight() |
||||
|
||||
local windowPositionRatio = verticalScroll / verticalScrollRange |
||||
local trackScrollAreaSize = trackSize - gripSize |
||||
local gripPositionOnTrack = DiesalTools.Round(trackScrollAreaSize * windowPositionRatio) |
||||
|
||||
self.grip:SetPoint("TOP", 0, -gripPositionOnTrack) |
||||
end, |
||||
---@param show? boolean |
||||
["ShowScrollBar"] = function(self, show) |
||||
if show then |
||||
self.scrollFrameContainer:SetPoint("BOTTOMRIGHT", -(self.settings.scrollBarWidth + self.settings.scrollBarPadding[1] + self.settings.scrollBarPadding[2]), 0) |
||||
self.scrollBar:Show() |
||||
else |
||||
self.scrollBar:Hide() |
||||
self.scrollFrameContainer:SetPoint("BOTTOMRIGHT", 0, 0) |
||||
end |
||||
end, |
||||
["ScrollToBottom"] = function(self) |
||||
local scrollRange = self.scrollFrame:GetVerticalScrollRange() |
||||
if scrollRange > 0 and scrollRange ~= self.scrollFrame:GetVerticalScroll() then |
||||
self.scrollFrame:SetVerticalScroll(scrollRange) |
||||
end |
||||
end, |
||||
---@param num number |
||||
["SetVerticalScroll"] = function(self, num) |
||||
self.scrollFrame:SetVerticalScroll(num) |
||||
end, |
||||
["GetVerticalScroll"] = function(self) |
||||
return self.scrollFrame:GetVerticalScroll() |
||||
end, |
||||
["GetVerticalScrollRange"] = function(self) |
||||
return self.scrollFrame:GetVerticalScrollRange() |
||||
end, |
||||
---@param num number |
||||
["VerticallyScroll"] = function(self, num) |
||||
if num < 0 then |
||||
self.scrollFrame:SetVerticalScroll(max(self.scrollFrame:GetVerticalScroll() + num, 0)) |
||||
else |
||||
self.scrollFrame:SetVerticalScroll(min(self.scrollFrame:GetVerticalScroll() + num, self.scrollFrame:GetVerticalScrollRange())) |
||||
end |
||||
end, |
||||
} |
||||
-- ~~| ScrollFrame Constructor |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local function Constructor() |
||||
---@class Diesal.GUI.Object.ScrollFrame : Diesal.GUI.ObjectBase, Diesal.GUI.ScrollFrame.Methods |
||||
---@field scrollFrameContainer Frame |
||||
---@field scrollFrame ScrollFrame |
||||
---@field content Frame |
||||
---@field scrollBar Frame |
||||
---@field buttonUp Frame |
||||
---@field buttonDown Frame |
||||
---@field track Frame |
||||
---@field grip Frame |
||||
---@field parent Diesal.GUI.Object.Window |
||||
local self = DiesalGUI:Create(Type, true) |
||||
self.isContainer = true |
||||
local frame = CreateFrame("Frame", nil, UIParent) |
||||
self.frame = frame |
||||
-- ~~ Default Settings ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
self.defaults = { |
||||
height = 300, |
||||
width = 500, |
||||
scrollBarButtonHeight = 4, |
||||
scrollBarWidth = 4, |
||||
scrollBarButtons = false, |
||||
scrollBarPadding = { 0, 0, 0, 0 }, |
||||
contentPadding = { 0, 0, 0, 0 }, |
||||
contentHeight = 1, |
||||
} |
||||
-- ~~ Events ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
-- OnAcquire, OnRelease, OnHeightSet, OnWidthSet |
||||
-- OnHide |
||||
-- ~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
frame:SetScript("OnHide", function(this) |
||||
self:FireEvent("OnHide") |
||||
end) |
||||
|
||||
local scrollFrameContainer = self:CreateRegion("Frame", "scrollFrameContainer", frame) |
||||
scrollFrameContainer:SetAllPoints() |
||||
|
||||
local scrollFrame = self:CreateRegion("ScrollFrame", "scrollFrame", scrollFrameContainer) |
||||
scrollFrame:EnableMouseWheel(true) |
||||
|
||||
scrollFrame:SetScript("OnMouseWheel", function(this, delta) |
||||
DiesalGUI:OnMouse(this, "MouseWheel") |
||||
if delta > 0 then |
||||
self:VerticallyScroll(-25) |
||||
else |
||||
self:VerticallyScroll(25) |
||||
end |
||||
end) |
||||
|
||||
scrollFrame:SetScript("OnVerticalScroll", function(this, offset) |
||||
-- self.scrollFrame:GetVerticalScrollRange() windowScrollAreaSize |
||||
if this:GetVerticalScrollRange() < 1 then -- nothing to scroll |
||||
self:ShowScrollBar(false) |
||||
else |
||||
self:ShowScrollBar(true) |
||||
end |
||||
self:SetScrollThumbPosition() |
||||
end) |
||||
|
||||
scrollFrame:SetScript("OnScrollRangeChanged", function(this, horizontalScrollRange, verticalScrollRange) |
||||
if verticalScrollRange < 1 then -- nothing to scroll |
||||
this:SetVerticalScroll(0) |
||||
self:ShowScrollBar(false) |
||||
return |
||||
end |
||||
this:SetVerticalScroll(min(this:GetVerticalScroll(), verticalScrollRange)) |
||||
self:ShowScrollBar(true) |
||||
self:SetGripSize() |
||||
self:SetScrollThumbPosition() |
||||
end) |
||||
|
||||
scrollFrame:SetScript("OnSizeChanged", function(this, width, height) |
||||
self.content:SetWidth(width) |
||||
end) |
||||
|
||||
scrollFrame:SetScrollChild(self:CreateRegion("Frame", "content", scrollFrame)) |
||||
scrollFrame:RegisterForDrag("LeftButton") |
||||
scrollFrame:SetScript("OnDragStart", function(this, ...) |
||||
self:FireEvent("OnDragStart", ...) |
||||
end) |
||||
|
||||
local scrollBar = self:CreateRegion("Frame", "scrollBar", frame) |
||||
scrollBar:Hide() |
||||
|
||||
local buttonUp = self:CreateRegion("Frame", "buttonUp", scrollBar) |
||||
buttonUp:SetPoint("TOPLEFT") |
||||
buttonUp:SetPoint("TOPRIGHT") |
||||
|
||||
local buttonDown = self:CreateRegion("Frame", "buttonDown", scrollBar) |
||||
buttonDown:SetPoint("BOTTOMLEFT") |
||||
buttonDown:SetPoint("BOTTOMRIGHT") |
||||
|
||||
local track = self:CreateRegion("Frame", "track", scrollBar) |
||||
track:SetPoint("LEFT") |
||||
track:SetPoint("RIGHT") |
||||
|
||||
local grip = self:CreateRegion("Frame", "grip", track) |
||||
grip:SetPoint("LEFT") |
||||
grip:SetPoint("RIGHT") |
||||
grip:SetPoint("TOP") |
||||
grip:EnableMouse(true) |
||||
grip:SetScript("OnMouseDown", function(this, button) |
||||
DiesalGUI:OnMouse(this, button) |
||||
if button ~= "LeftButton" then |
||||
return |
||||
end |
||||
local MouseY = select(2, GetCursorPosition()) / this:GetEffectiveScale() |
||||
local effectiveScale = this:GetEffectiveScale() |
||||
local trackScrollAreaSize = track:GetHeight() - this:GetHeight() |
||||
local gripPositionOnTrack = abs(select(5, this:GetPoint(1))) |
||||
|
||||
this:SetScript("OnUpdate", function(this) |
||||
local newGripPosition = gripPositionOnTrack + (MouseY - (select(2, GetCursorPosition()) / effectiveScale)) |
||||
newGripPosition = min(max(newGripPosition, 0), trackScrollAreaSize) |
||||
-- local newGripPositionRatio = newGripPosition / trackScrollAreaSize |
||||
-- local windowPosition = newGripPositionRatio * scrollArea:GetVerticalScrollRange() |
||||
scrollFrame:SetVerticalScroll((newGripPosition / trackScrollAreaSize) * scrollFrame:GetVerticalScrollRange()) |
||||
end) |
||||
end) |
||||
|
||||
grip:SetScript("OnMouseUp", function(this, button) |
||||
this:SetScript("OnUpdate", function(this) end) |
||||
end) |
||||
-- ~~ Methods ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
self:SetMethods(methods) |
||||
--[[ for method, func in pairs(methods) do |
||||
self[method] = func |
||||
end ]] |
||||
-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
return self |
||||
end |
||||
|
||||
DiesalGUI:RegisterObjectConstructor(Type, Constructor, Version) |
@ -0,0 +1,293 @@ |
||||
---@type Diesal.GUI |
||||
local DiesalGUI = LibStub("DiesalGUI-2.0") |
||||
---@type Diesal.Tools |
||||
local DiesalTools = LibStub("DiesalTools-2.0") |
||||
---@type Diesal.Style |
||||
local DiesalStyle = LibStub("DiesalStyle-2.0") |
||||
-- ~~| Diesal Upvalues |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local Colors = DiesalStyle.Colors |
||||
local HSL, ShadeColor, TintColor = DiesalTools.HSL, DiesalTools.ShadeColor, DiesalTools.TintColor |
||||
-- ~~| Lua Upvalues |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local type, select, pairs, tonumber = type, select, pairs, tonumber |
||||
local setmetatable, getmetatable, next = setmetatable, getmetatable, next |
||||
local sub, format, lower, upper = string.sub, string.format, string.lower, string.upper |
||||
local floor, ceil, min, max, abs, modf = math.floor, math.ceil, math.min, math.max, math.abs, math.modf |
||||
-- ~~| WoW Upvalues |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local GetCursorPosition = GetCursorPosition |
||||
-- ~~| ScrollingEditBox |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local Type = "DiesalScrollingEditBox" |
||||
local Version = 3 |
||||
-- ~~| ScrollingEditBox Stylesheets |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local Stylesheet = { |
||||
["track-background"] = { |
||||
type = "texture", |
||||
layer = "BACKGROUND", |
||||
color = "000000", |
||||
alpha = 0.3, |
||||
}, |
||||
["grip-background"] = { |
||||
type = "texture", |
||||
layer = "BACKGROUND", |
||||
color = Colors.UI_400, |
||||
}, |
||||
["grip-inline"] = { |
||||
type = "outline", |
||||
layer = "BORDER", |
||||
color = "FFFFFF", |
||||
alpha = 0.02, |
||||
}, |
||||
} |
||||
local wireFrame = { |
||||
["frame-white"] = { |
||||
type = "outline", |
||||
layer = "OVERLAY", |
||||
color = "ffffff", |
||||
}, |
||||
["scrollFrameContainer-yellow"] = { |
||||
type = "outline", |
||||
layer = "BACKGROUND", |
||||
color = "fffc00", |
||||
}, |
||||
["scrollFrame-orange"] = { |
||||
type = "outline", |
||||
layer = "BORDER", |
||||
color = "ffd400", |
||||
}, |
||||
["editBox-red"] = { |
||||
type = "outline", |
||||
layer = "ARTWORK", |
||||
color = "ff0000", |
||||
aplha = 0.5, |
||||
}, |
||||
["scrollBar-blue"] = { |
||||
type = "outline", |
||||
layer = "OVERLAY", |
||||
color = "00aaff", |
||||
}, |
||||
["track-green"] = { |
||||
type = "outline", |
||||
layer = "OVERLAY", |
||||
color = "55ff00", |
||||
}, |
||||
} |
||||
-- ~~| ScrollingEditBox Locals |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
|
||||
-- ~~| ScrollingEditBox Methods |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
---@class Diesal.GUI.ScrollingEditBox.Methods |
||||
local methods = { |
||||
["OnAcquire"] = function(self) |
||||
self:ApplySettings() |
||||
self:SetStylesheet(Stylesheet) |
||||
-- self:SetStylesheet(wireFrame) |
||||
self:Show() |
||||
end, |
||||
["OnRelease"] = function(self) end, |
||||
["ApplySettings"] = function(self) |
||||
local settings = self.settings |
||||
|
||||
self.scrollFrame:SetPoint("TOPLEFT", settings.contentPadding[1], -settings.contentPadding[3]) |
||||
self.scrollFrame:SetPoint("BOTTOMRIGHT", -settings.contentPadding[2], settings.contentPadding[4]) |
||||
|
||||
self.scrollBar:SetPoint("TOPRIGHT", 0, -settings.contentPadding[3] + 1) |
||||
self.scrollBar:SetPoint("BOTTOMRIGHT", 0, settings.contentPadding[4] - 1) |
||||
|
||||
self.scrollBar:SetWidth(settings.scrollBarWidth) |
||||
self.buttonDown:SetHeight(settings.scrollBarButtonHeight) |
||||
self.buttonUp:SetHeight(settings.scrollBarButtonHeight) |
||||
|
||||
self.editBox:SetJustifyH(settings.justifyH) |
||||
self.editBox:SetJustifyV(settings.justifyV) |
||||
end, |
||||
["ShowScrollBar"] = function(self, show) |
||||
if show then |
||||
self.scrollFrameContainer:SetPoint("BOTTOMRIGHT", -(self.settings.scrollBarWidth + 1), 0) |
||||
self.scrollBar:Show() |
||||
else |
||||
self.scrollBar:Hide() |
||||
self.scrollFrameContainer:SetPoint("BOTTOMRIGHT", 0, 0) |
||||
end |
||||
end, |
||||
["SetContentHeight"] = function(self, height) |
||||
self.settings.contentHeight = height |
||||
self.content:SetHeight(height) |
||||
end, |
||||
["SetGripSize"] = function(self) |
||||
local contentSize = self.scrollFrame:GetVerticalScrollRange() + self.scrollFrame:GetHeight() |
||||
local windowSize = self.scrollFrame:GetHeight() |
||||
local trackSize = self.track:GetHeight() |
||||
local windowContentRatio = windowSize / contentSize |
||||
local gripSize = DiesalTools.Round(trackSize * windowContentRatio) |
||||
|
||||
gripSize = max(gripSize, 10) -- might give this a setting? |
||||
gripSize = min(gripSize, trackSize) |
||||
|
||||
self.grip:SetHeight(gripSize) |
||||
end, |
||||
["SetScrollThumbPosition"] = function(self) |
||||
local verticalScrollRange = self.scrollFrame:GetVerticalScrollRange() -- windowScrollAreaSize (rounded no need to round) |
||||
if verticalScrollRange < 1 then |
||||
self.grip:SetPoint("TOP", 0, 0) |
||||
return |
||||
end |
||||
local verticalScroll = self.scrollFrame:GetVerticalScroll() -- windowPosition |
||||
local trackSize = self.track:GetHeight() |
||||
local gripSize = self.grip:GetHeight() |
||||
|
||||
local windowPositionRatio = verticalScroll / verticalScrollRange |
||||
local trackScrollAreaSize = trackSize - gripSize |
||||
local gripPositionOnTrack = DiesalTools.Round(trackScrollAreaSize * windowPositionRatio) |
||||
|
||||
self.grip:SetPoint("TOP", 0, -gripPositionOnTrack) |
||||
end, |
||||
["SetVerticalScroll"] = function(self, scroll) -- user scrolled only |
||||
self.settings.forceScrollBottom = DiesalTools.Round(scroll) == DiesalTools.Round(self.scrollFrame:GetVerticalScrollRange()) |
||||
self.scrollFrame:SetVerticalScroll(scroll) |
||||
end, |
||||
["SetText"] = function(self, txt) |
||||
self.settings.text = txt |
||||
self.value = txt |
||||
self.editBox:SetText(txt or "") |
||||
end, |
||||
} |
||||
|
||||
---@class DiesalScrollingEditBox : Diesal.GUI.Object.ScrollingEditBox |
||||
|
||||
-- ~~| ScrollingEditBox Constructor |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local function Constructor() |
||||
---@class Diesal.GUI.Object.ScrollingEditBox : Diesal.GUI.ObjectBase, Diesal.GUI.ScrollingEditBox.Methods |
||||
local self = DiesalGUI:Create(Type, true) |
||||
local frame = CreateFrame("Frame", nil, UIParent) |
||||
self.frame = frame |
||||
-- ~~ Default Settings ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
self.defaults = { |
||||
scrollBarButtonHeight = 1, |
||||
scrollBarWidth = 4, |
||||
contentPadding = { 0, 0, 0, 0 }, |
||||
justifyH = "LEFT", |
||||
justifyV = "TOP", |
||||
forceScrollBottom = true, |
||||
} |
||||
-- ~~ Events ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
-- OnAcquire, OnRelease, OnHeightSet, OnWidthSet |
||||
-- OnHide |
||||
-- ~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
frame:SetScript("OnHide", function(this) |
||||
self:FireEvent("OnHide") |
||||
end) |
||||
|
||||
local scrollFrameContainer = self:CreateRegion("Frame", "scrollFrameContainer", frame) |
||||
scrollFrameContainer:SetAllPoints() |
||||
local scrollFrame = self:CreateRegion("ScrollFrame", "scrollFrame", scrollFrameContainer) |
||||
scrollFrame:EnableMouseWheel(true) |
||||
scrollFrame:SetScript("OnMouseWheel", function(this, delta) |
||||
DiesalGUI:OnMouse(this, "MouseWheel") |
||||
if delta > 0 then |
||||
self:SetVerticalScroll(max(this:GetVerticalScroll() - 50, 0)) |
||||
else |
||||
self:SetVerticalScroll(min(this:GetVerticalScroll() + 50, this:GetVerticalScrollRange())) |
||||
end |
||||
end) |
||||
scrollFrame:SetScript("OnVerticalScroll", function(this, offset) |
||||
-- self.scrollFrame:GetVerticalScrollRange() windowScrollAreaSize |
||||
if this:GetVerticalScrollRange() < 1 then -- nothing to scroll |
||||
self:ShowScrollBar(false) |
||||
else |
||||
self:ShowScrollBar(true) |
||||
end |
||||
self:SetScrollThumbPosition() |
||||
end) |
||||
scrollFrame:SetScript("OnScrollRangeChanged", function(this, xOffset, verticalScrollRange) |
||||
if verticalScrollRange < 1 then -- nothing to scroll |
||||
this:SetVerticalScroll(0) |
||||
self:ShowScrollBar(false) |
||||
return |
||||
end |
||||
|
||||
if self.settings.forceScrollBottom then |
||||
this:SetVerticalScroll(verticalScrollRange) |
||||
else |
||||
this:SetVerticalScroll(min(this:GetVerticalScroll(), verticalScrollRange)) |
||||
end |
||||
self:ShowScrollBar(true) |
||||
self:SetGripSize() |
||||
self:SetScrollThumbPosition() |
||||
end) |
||||
scrollFrame:SetScript("OnSizeChanged", function(this, width, height) |
||||
self.editBox:SetWidth(width) |
||||
end) |
||||
|
||||
local editBox = self:CreateRegion("EditBox", "editBox", scrollFrame) |
||||
editBox:SetPoint("TOPLEFT") |
||||
editBox:SetPoint("TOPRIGHT") |
||||
editBox:SetAutoFocus(false) |
||||
editBox:SetMultiLine(true) |
||||
editBox:HookScript("OnEditFocusLost", function(this) |
||||
this:HighlightText(0, 0) |
||||
this:SetText(self.settings.text) |
||||
end) |
||||
editBox:HookScript("OnEditFocusGained", function(this) |
||||
self:FireEvent("OnEditFocusGained") |
||||
end) |
||||
editBox:HookScript("OnEscapePressed", function(this) |
||||
self:FireEvent("OnEscapePressed") |
||||
end) |
||||
editBox:HookScript("OnTabPressed", function(this) |
||||
self:FireEvent("OnTabPressed") |
||||
end) |
||||
editBox:HookScript("OnCursorChanged", function(this, ...) |
||||
self:FireEvent("OnCursorChanged", ...) |
||||
end) |
||||
editBox:HookScript("OnTextChanged", function(this) |
||||
self:FireEvent("OnTextChanged") |
||||
end) |
||||
|
||||
scrollFrame:SetScrollChild(editBox) |
||||
|
||||
local scrollBar = self:CreateRegion("Frame", "scrollBar", frame) |
||||
scrollBar:Hide() |
||||
local buttonUp = self:CreateRegion("Frame", "buttonUp", scrollBar) |
||||
buttonUp:SetPoint("TOPLEFT") |
||||
buttonUp:SetPoint("TOPRIGHT") |
||||
local buttonDown = self:CreateRegion("Frame", "buttonDown", scrollBar) |
||||
buttonDown:SetPoint("BOTTOMLEFT") |
||||
buttonDown:SetPoint("BOTTOMRIGHT") |
||||
local track = self:CreateRegion("Frame", "track", scrollBar) |
||||
track:SetPoint("LEFT") |
||||
track:SetPoint("RIGHT") |
||||
track:SetPoint("TOP", buttonUp, "BOTTOM", 0, 0) |
||||
track:SetPoint("BOTTOM", buttonDown, "TOP", 0, 0) |
||||
local grip = self:CreateRegion("Frame", "grip", track) |
||||
grip:SetPoint("LEFT") |
||||
grip:SetPoint("RIGHT") |
||||
grip:SetPoint("TOP") |
||||
grip:EnableMouse(true) |
||||
grip:SetScript("OnMouseDown", function(this, button) |
||||
DiesalGUI:OnMouse(this, button) |
||||
if button ~= "LeftButton" then |
||||
return |
||||
end |
||||
local MouseY = select(2, GetCursorPosition()) / this:GetEffectiveScale() |
||||
local effectiveScale = this:GetEffectiveScale() |
||||
local trackScrollAreaSize = track:GetHeight() - this:GetHeight() |
||||
local gripPositionOnTrack = abs(select(5, this:GetPoint(1))) |
||||
|
||||
this:SetScript("OnUpdate", function(this) |
||||
local newGripPosition = gripPositionOnTrack + (MouseY - (select(2, GetCursorPosition()) / effectiveScale)) |
||||
newGripPosition = min(max(newGripPosition, 0), trackScrollAreaSize) |
||||
-- local newGripPositionRatio = newGripPosition / trackScrollAreaSize |
||||
-- local windowPosition = newGripPositionRatio * scrollArea:GetVerticalScrollRange() |
||||
self:SetVerticalScroll((newGripPosition / trackScrollAreaSize) * scrollFrame:GetVerticalScrollRange()) |
||||
end) |
||||
end) |
||||
grip:SetScript("OnMouseUp", function(this, button) |
||||
this:SetScript("OnUpdate", function(this) end) |
||||
end) |
||||
-- ~~ Methods ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
self:SetMethods(methods) |
||||
--[[ for method, func in pairs(methods) do |
||||
self[method] = func |
||||
end ]] |
||||
-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
return self |
||||
end |
||||
DiesalGUI:RegisterObjectConstructor(Type, Constructor, Version) |
@ -0,0 +1,283 @@ |
||||
---@type Diesal.GUI |
||||
local DiesalGUI = LibStub("DiesalGUI-2.0") |
||||
---@type Diesal.Tools |
||||
local DiesalTools = LibStub("DiesalTools-2.0") |
||||
---@type Diesal.Style |
||||
local DiesalStyle = LibStub("DiesalStyle-2.0") |
||||
-- ~~| Lua Upvalues |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local type, select, pairs, tonumber = type, select, pairs, tonumber |
||||
local setmetatable, getmetatable, next = setmetatable, getmetatable, next |
||||
local sub, format, lower, upper = string.sub, string.format, string.lower, string.upper |
||||
local floor, ceil, min, max, abs, modf = math.floor, math.ceil, math.min, math.max, math.abs, math.modf |
||||
-- ~~| WoW Upvalues |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local GetCursorPosition = GetCursorPosition |
||||
-- ~~| ScrollingMessageFrame |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local Type = "DiesalScrollingMessageFrame" |
||||
local Version = 1 |
||||
-- ~~| ScrollingMessageFrame Stylesheets |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local Stylesheet = { |
||||
["track-background"] = { |
||||
type = "texture", |
||||
layer = "BACKGROUND", |
||||
color = "0e0e0e", |
||||
}, |
||||
["track-outline"] = { |
||||
type = "outline", |
||||
layer = "BORDER", |
||||
color = "060606", |
||||
}, |
||||
["grip-background"] = { |
||||
type = "texture", |
||||
layer = "BACKGROUND", |
||||
gradient = "HORIZONTAL", |
||||
color = "5d5d5d", |
||||
colorEnd = "252525", |
||||
}, |
||||
["grip-outline"] = { |
||||
type = "outline", |
||||
layer = "BORDER", |
||||
color = "060606", |
||||
}, |
||||
} |
||||
|
||||
local wireFrame = { |
||||
["frame-white"] = { |
||||
type = "outline", |
||||
layer = "OVERLAY", |
||||
color = "ffffff", |
||||
}, |
||||
["scrollFrameContainer-yellow"] = { |
||||
type = "outline", |
||||
layer = "OVERLAY", |
||||
color = "fffc00", |
||||
}, |
||||
["scrollFrame-orange"] = { |
||||
type = "outline", |
||||
layer = "OVERLAY", |
||||
color = "ffd400", |
||||
}, |
||||
["scrollingMessageFrame-red"] = { |
||||
type = "outline", |
||||
layer = "BORDER", |
||||
color = "ff0000", |
||||
aplha = 0.5, |
||||
}, |
||||
["scrollBar-blue"] = { |
||||
type = "outline", |
||||
layer = "OVERLAY", |
||||
color = "00aaff", |
||||
}, |
||||
["track-green"] = { |
||||
type = "outline", |
||||
layer = "OVERLAY", |
||||
color = "55ff00", |
||||
}, |
||||
} |
||||
-- ~~| ScrollingMessageFrame Locals |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
|
||||
---@class DiesalScrollingMessageFrame : Diesal.GUI.Object.ScrollingMessageFrame |
||||
|
||||
-- ~~| ScrollingMessageFrame Methods |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
---@class Diesal.GUI.ScrollingMessageFrame.Methods |
||||
local methods = { |
||||
["OnAcquire"] = function(self) |
||||
self:ApplySettings() |
||||
self:SetStylesheet(Stylesheet) |
||||
self:SetStylesheet(wireFrame) |
||||
self:Show() |
||||
end, |
||||
["OnRelease"] = function(self) end, |
||||
["ApplySettings"] = function(self) |
||||
local settings = self.settings |
||||
local scrollFrame = self.scrollFrame |
||||
|
||||
scrollFrame:SetPoint("TOPLEFT", settings.contentPadLeft, -settings.contentPadTop) |
||||
scrollFrame:SetPoint("BOTTOMRIGHT", -settings.contentPadRight, settings.contentPadBottom) |
||||
|
||||
self.scrollBar:SetWidth(settings.scrollBarWidth) |
||||
self.buttonDown:SetHeight(settings.scrollBarButtonHeight) |
||||
self.buttonUp:SetHeight(settings.scrollBarButtonHeight) |
||||
end, |
||||
["ShowScrollBar"] = function(self, show) |
||||
if show then |
||||
self.scrollFrameContainer:SetPoint("BOTTOMRIGHT", -(self.settings.scrollBarWidth + 1), 0) |
||||
self.scrollBar:Show() |
||||
else |
||||
self.scrollBar:Hide() |
||||
self.scrollFrameContainer:SetPoint("BOTTOMRIGHT", 0, 0) |
||||
end |
||||
end, |
||||
["SetContentHeight"] = function(self, height) |
||||
self.settings.contentHeight = height |
||||
self.content:SetHeight(height) |
||||
end, |
||||
["SetGripSize"] = function(self) |
||||
local contentSize = self.scrollFrame:GetVerticalScrollRange() + self.scrollFrame:GetHeight() |
||||
local windowSize = self.scrollFrame:GetHeight() |
||||
local trackSize = self.track:GetHeight() |
||||
local windowContentRatio = windowSize / contentSize |
||||
local gripSize = DiesalTools.Round(trackSize * windowContentRatio) |
||||
|
||||
gripSize = max(gripSize, 10) -- might give this a setting? |
||||
gripSize = min(gripSize, trackSize) |
||||
|
||||
self.grip:SetHeight(gripSize) |
||||
end, |
||||
["SetScrollThumbPosition"] = function(self) |
||||
local verticalScrollRange = self.scrollFrame:GetVerticalScrollRange() -- windowScrollAreaSize (rounded no need to round) |
||||
if verticalScrollRange < 1 then |
||||
self.grip:SetPoint("TOP", 0, 0) |
||||
return |
||||
end |
||||
local verticalScroll = self.scrollFrame:GetVerticalScroll() -- windowPosition |
||||
local trackSize = self.track:GetHeight() |
||||
local gripSize = self.grip:GetHeight() |
||||
|
||||
local windowPositionRatio = verticalScroll / verticalScrollRange |
||||
local trackScrollAreaSize = trackSize - gripSize |
||||
local gripPositionOnTrack = DiesalTools.Round(trackScrollAreaSize * windowPositionRatio) |
||||
|
||||
self.grip:SetPoint("TOP", 0, -gripPositionOnTrack) |
||||
end, |
||||
["SetVerticalScroll"] = function(self, scroll) -- user scrolled only |
||||
self.settings.forceScrollBottom = DiesalTools.Round(scroll) == DiesalTools.Round(self.scrollFrame:GetVerticalScrollRange()) |
||||
self.scrollFrame:SetVerticalScroll(scroll) |
||||
end, |
||||
["AddMessage"] = function(self, msg) |
||||
if not msg then |
||||
return |
||||
end |
||||
self.scrollingMessageFrame:AddMessage(msg) |
||||
-- ChatFrame1:AddMessage(self.scrollingMessageFrame:GetNumRegions() ) |
||||
end, |
||||
["SetText"] = function(self, txt) |
||||
-- self.editBox:SetText(txt or '') |
||||
end, |
||||
} |
||||
-- ~~| ScrollingMessageFrame Constructor |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local function Constructor() |
||||
---@class Diesal.GUI.Object.ScrollingMessageFrame : Diesal.GUI.ObjectBase, Diesal.GUI.ScrollingMessageFrame.Methods |
||||
local self = DiesalGUI:Create(Type, true) |
||||
local frame = CreateFrame("Frame", nil, UIParent) |
||||
self.frame = frame |
||||
-- ~~ Default Settings ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
-- ~~ Default Settings ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
self.defaults = { |
||||
scrollBarButtonHeight = 1, |
||||
scrollBarWidth = 6, |
||||
contentPadLeft = 0, |
||||
contentPadRight = 0, |
||||
contentPadTop = 0, |
||||
contentPadBottom = 0, |
||||
forceScrollBottom = true, |
||||
} |
||||
-- ~~ Events ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
-- OnAcquire, OnRelease, OnHeightSet, OnWidthSet |
||||
-- OnHide |
||||
-- ~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
frame:SetScript("OnHide", function(this) |
||||
self:FireEvent("OnHide") |
||||
end) |
||||
|
||||
local scrollFrameContainer = self:CreateRegion("Frame", "scrollFrameContainer", frame) |
||||
scrollFrameContainer:SetAllPoints() |
||||
local scrollFrame = self:CreateRegion("ScrollFrame", "scrollFrame", scrollFrameContainer) |
||||
scrollFrame:EnableMouseWheel(true) |
||||
scrollFrame:SetScript("OnMouseWheel", function(this, delta) |
||||
DiesalGUI:OnMouse(this, "MouseWheel") |
||||
if delta > 0 then |
||||
self:SetVerticalScroll(max(this:GetVerticalScroll() - 50, 0)) |
||||
else |
||||
self:SetVerticalScroll(min(this:GetVerticalScroll() + 50, this:GetVerticalScrollRange())) |
||||
end |
||||
end) |
||||
scrollFrame:SetScript("OnVerticalScroll", function(this, offset) |
||||
-- self.scrollFrame:GetVerticalScrollRange() windowScrollAreaSize |
||||
if this:GetVerticalScrollRange() < 1 then -- nothing to scroll |
||||
self:ShowScrollBar(false) |
||||
else |
||||
self:ShowScrollBar(true) |
||||
end |
||||
self:SetScrollThumbPosition() |
||||
end) |
||||
scrollFrame:SetScript("OnScrollRangeChanged", function(this, xOffset, verticalScrollRange) |
||||
if verticalScrollRange < 1 then -- nothing to scroll |
||||
this:SetVerticalScroll(0) |
||||
self:ShowScrollBar(false) |
||||
return |
||||
end |
||||
|
||||
if self.settings.forceScrollBottom then |
||||
this:SetVerticalScroll(verticalScrollRange) |
||||
else |
||||
this:SetVerticalScroll(min(this:GetVerticalScroll(), verticalScrollRange)) |
||||
end |
||||
self:ShowScrollBar(true) |
||||
self:SetGripSize() |
||||
self:SetScrollThumbPosition() |
||||
end) |
||||
scrollFrame:SetScript("OnSizeChanged", function(this, width, height) |
||||
self.scrollingMessageFrame:SetWidth(width) |
||||
end) |
||||
|
||||
local scrollingMessageFrame = self:CreateRegion("ScrollingMessageFrame", "scrollingMessageFrame", scrollFrame) |
||||
scrollingMessageFrame:SetPoint("TOPLEFT") |
||||
scrollingMessageFrame:SetPoint("TOPRIGHT") |
||||
scrollingMessageFrame:SetJustifyH("LEFT") |
||||
scrollingMessageFrame:SetJustifyV("TOP") |
||||
scrollingMessageFrame:SetInsertMode("BOTTOM") |
||||
scrollingMessageFrame:SetMaxLines(500) |
||||
scrollingMessageFrame:SetHeight(500) |
||||
scrollingMessageFrame:SetFading(false) |
||||
scrollFrame:SetScrollChild(scrollingMessageFrame) |
||||
|
||||
local scrollBar = self:CreateRegion("Frame", "scrollBar", frame) |
||||
scrollBar:SetPoint("TOPRIGHT") |
||||
scrollBar:SetPoint("BOTTOMRIGHT") |
||||
scrollBar:Hide() |
||||
local buttonUp = self:CreateRegion("Frame", "buttonUp", scrollBar) |
||||
buttonUp:SetPoint("TOPLEFT") |
||||
buttonUp:SetPoint("TOPRIGHT") |
||||
local buttonDown = self:CreateRegion("Frame", "buttonDown", scrollBar) |
||||
buttonDown:SetPoint("BOTTOMLEFT") |
||||
buttonDown:SetPoint("BOTTOMRIGHT") |
||||
local track = self:CreateRegion("Frame", "track", scrollBar) |
||||
track:SetPoint("LEFT") |
||||
track:SetPoint("RIGHT") |
||||
track:SetPoint("TOP", buttonUp, "BOTTOM", 0, 0) |
||||
track:SetPoint("BOTTOM", buttonDown, "TOP", 0, 0) |
||||
local grip = self:CreateRegion("Frame", "grip", track) |
||||
grip:SetPoint("LEFT") |
||||
grip:SetPoint("RIGHT") |
||||
grip:SetPoint("TOP") |
||||
grip:EnableMouse(true) |
||||
grip:SetScript("OnMouseDown", function(this, button) |
||||
DiesalGUI:OnMouse(this, button) |
||||
if button ~= "LeftButton" then |
||||
return |
||||
end |
||||
local MouseY = select(2, GetCursorPosition()) / this:GetEffectiveScale() |
||||
local effectiveScale = this:GetEffectiveScale() |
||||
local trackScrollAreaSize = track:GetHeight() - this:GetHeight() |
||||
local gripPositionOnTrack = abs(select(5, this:GetPoint(1))) |
||||
|
||||
this:SetScript("OnUpdate", function(this) |
||||
local newGripPosition = gripPositionOnTrack + (MouseY - (select(2, GetCursorPosition()) / effectiveScale)) |
||||
newGripPosition = min(max(newGripPosition, 0), trackScrollAreaSize) |
||||
-- local newGripPositionRatio = newGripPosition / trackScrollAreaSize |
||||
-- local windowPosition = newGripPositionRatio * scrollArea:GetVerticalScrollRange() |
||||
self:SetVerticalScroll((newGripPosition / trackScrollAreaSize) * scrollFrame:GetVerticalScrollRange()) |
||||
end) |
||||
end) |
||||
grip:SetScript("OnMouseUp", function(this, button) |
||||
this:SetScript("OnUpdate", function(this) end) |
||||
end) |
||||
-- ~~ Methods ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
self:SetMethods(methods) |
||||
--[[ for method, func in pairs(methods) do |
||||
self[method] = func |
||||
end ]] |
||||
-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
return self |
||||
end |
||||
DiesalGUI:RegisterObjectConstructor(Type, Constructor, Version) |
@ -0,0 +1,345 @@ |
||||
---@type Diesal.GUI |
||||
local DiesalGUI = LibStub("DiesalGUI-2.0") |
||||
---@type Diesal.Tools |
||||
local DiesalTools = LibStub("DiesalTools-2.0") |
||||
---@type Diesal.Style |
||||
local DiesalStyle = LibStub("DiesalStyle-2.0") |
||||
-- ~~| Diesal Upvalues |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local Colors = DiesalStyle.Colors |
||||
local HSL, ShadeColor, TintColor = DiesalTools.HSL, DiesalTools.ShadeColor, DiesalTools.TintColor |
||||
local round = DiesalTools.Round |
||||
-- | Lua Upvalues |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local type, tonumber, select = type, tonumber, select |
||||
local pairs, ipairs, next = pairs, ipairs, next |
||||
local min, max = math.min, math.max |
||||
-- | WoW Upvalues |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
-- | Spinner |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local Type = "DiesalSpinner" |
||||
local Version = 3 |
||||
-- | Stylesheets |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local Stylesheet = { |
||||
["frame-background"] = { |
||||
type = "texture", |
||||
layer = "BACKGROUND", |
||||
color = "000000", |
||||
alpha = 0.6, |
||||
}, |
||||
["frame-inline"] = { |
||||
type = "outline", |
||||
layer = "BORDER", |
||||
color = "000000", |
||||
alpha = 0.6, |
||||
}, |
||||
["frame-outline"] = { |
||||
type = "outline", |
||||
layer = "BORDER", |
||||
color = "FFFFFF", |
||||
alpha = 0.02, |
||||
position = 1, |
||||
}, |
||||
["frame-hover"] = { |
||||
type = "outline", |
||||
layer = "HIGHLIGHT", |
||||
color = "FFFFFF", |
||||
alpha = 0.25, |
||||
position = -1, |
||||
}, |
||||
["editBox-font"] = { |
||||
type = "Font", |
||||
color = Colors.UI_TEXT, |
||||
}, |
||||
["bar-background"] = { |
||||
type = "texture", |
||||
layer = "BACKGROUND", |
||||
gradient = { "VERTICAL", Colors.UI_A100, ShadeColor(Colors.UI_A100, 0.1) }, |
||||
}, |
||||
["bar-inline"] = { |
||||
type = "outline", |
||||
layer = "BORDER", |
||||
gradient = { "VERTICAL", "FFFFFF", "FFFFFF" }, |
||||
alpha = { 0.07, 0.02 }, |
||||
}, |
||||
["bar-outline"] = { |
||||
type = "texture", |
||||
layer = "ARTWORK", |
||||
color = "000000", |
||||
alpha = 0.7, |
||||
width = 1, |
||||
position = { nil, 1, 0, 0 }, |
||||
}, |
||||
} |
||||
|
||||
local wireFrame = { |
||||
["frame-white"] = { |
||||
type = "outline", |
||||
layer = "OVERLAY", |
||||
color = "ffffff", |
||||
}, |
||||
["editBox-purple"] = { |
||||
type = "outline", |
||||
layer = "OVERLAY", |
||||
color = "aa00ff", |
||||
}, |
||||
["buttonUp-yellow"] = { |
||||
type = "outline", |
||||
layer = "OVERLAY", |
||||
color = "fffc00", |
||||
}, |
||||
["buttonDown-orange"] = { |
||||
type = "outline", |
||||
layer = "OVERLAY", |
||||
color = "ffd400", |
||||
}, |
||||
["bar-green"] = { |
||||
type = "outline", |
||||
layer = "OVERLAY", |
||||
color = "55ff00", |
||||
}, |
||||
} |
||||
-- | Internal Methods |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local function processNumber(self, number) |
||||
local settings = self.settings |
||||
local number, oldNumber = tonumber(number), self:GetNumber() |
||||
|
||||
if not number then |
||||
number = oldNumber or settings.min |
||||
else |
||||
number = max(min(number, settings.max), settings.min) |
||||
end |
||||
|
||||
settings.number = number |
||||
|
||||
self.editBox:SetText((settings.prefix or "") .. number .. (settings.suffix or "")) |
||||
self.editBox:HighlightText(0, 0) -- clear any selcted text |
||||
self.editBox:SetCursorPosition(0) |
||||
|
||||
self:UpdateBar() |
||||
|
||||
if number ~= oldNumber then |
||||
return number |
||||
end |
||||
end |
||||
-- | Methods |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
---@class Diesal.GUI.Spinner.Methods |
||||
local methods = { |
||||
---@param self Diesal.GUI.Object.Spinner |
||||
OnAcquire = function(self) |
||||
self:SetStylesheet(Stylesheet) |
||||
-- self:SetStylesheet(wireFrame) |
||||
self:ApplySettings() |
||||
self:Show() |
||||
end, |
||||
---@param self Diesal.GUI.Object.Spinner |
||||
OnRelease = function(self) end, |
||||
---@param self Diesal.GUI.Object.Spinner |
||||
ApplySettings = function(self) |
||||
local settings = self.settings |
||||
local frame = self.frame |
||||
local buttonUp = self.buttonUp |
||||
local buttonDown = self.buttonDown |
||||
local editBox = self.editBox |
||||
local buttonsWidth = settings.buttons and settings.buttonsWidth or 0 |
||||
local buttonHeight = round(settings.height / 2) |
||||
-- Apply Settings |
||||
self:SetWidth(settings.width) |
||||
self:SetHeight(settings.height) |
||||
|
||||
editBox:EnableMouse(settings.mouse) |
||||
editBox:EnableMouseWheel(settings.mouseWheel) |
||||
editBox:SetPoint("BOTTOMRIGHT", -buttonsWidth, 0) |
||||
|
||||
buttonUp[settings.buttons and "Show" or "Hide"](buttonUp) |
||||
buttonUp:EnableMouse(settings.mouse) |
||||
buttonUp:SetHeight(buttonHeight) |
||||
buttonUp:SetWidth(buttonsWidth) |
||||
buttonDown[settings.buttons and "Show" or "Hide"](buttonDown) |
||||
buttonDown:EnableMouse(settings.mouse) |
||||
buttonDown:SetHeight(buttonHeight) |
||||
buttonDown:SetWidth(buttonsWidth) |
||||
|
||||
self:UpdateBar() |
||||
end, |
||||
---@param self Diesal.GUI.Object.Spinner |
||||
EnableMouse = function(self, enable) |
||||
self.settings.mouse = enable |
||||
self.buttonUp:EnableMouse(enable) |
||||
self.buttonDown:EnableMouse(enable) |
||||
self.editBox:EnableMouse(enable) |
||||
self.editBox:EnableMouseWheel(enable) |
||||
end, |
||||
---@param self Diesal.GUI.Object.Spinner |
||||
GetNumber = function(self) |
||||
return self.settings.number |
||||
end, |
||||
---@param self Diesal.GUI.Object.Spinner |
||||
SetNumber = function(self, number) |
||||
local newNumber = processNumber(self, number) |
||||
if newNumber then |
||||
self:FireEvent("OnValueChanged", false, newNumber) |
||||
end |
||||
end, |
||||
---@param self Diesal.GUI.Object.Spinner |
||||
SetPrefix = function(self, prefix) |
||||
self.settings.prefix = prefix |
||||
processNumber(self, self.settings.number) |
||||
end, |
||||
---@param self Diesal.GUI.Object.Spinner |
||||
SetSuffix = function(self, suffix) |
||||
self.settings.suffix = suffix |
||||
processNumber(self, self.settings.number) |
||||
end, |
||||
---@param self Diesal.GUI.Object.Spinner |
||||
OnSpin = function(self, delta) |
||||
local step = IsShiftKeyDown() and self.settings.shiftStep or self.settings.step |
||||
local oldNumber = self.settings.number |
||||
local newNumber |
||||
|
||||
if delta > 0 then |
||||
newNumber = processNumber(self, round(oldNumber, step) + step) |
||||
else |
||||
newNumber = processNumber(self, round(oldNumber, step) - step) |
||||
end |
||||
|
||||
if newNumber then |
||||
self:FireEvent("OnValueChanged", true, newNumber) |
||||
end |
||||
end, |
||||
---@param self Diesal.GUI.Object.Spinner |
||||
UpdateBar = function(self) |
||||
if not self.settings.bar then |
||||
return |
||||
end |
||||
local settings = self.settings |
||||
local barWidth = self:GetWidth() - (settings.buttons and settings.buttonsWidth or 0) - 2 -- bar padding |
||||
local number = settings.number or settings.min |
||||
local width = round(((number - settings.min) / (settings.max - settings.min) * barWidth)) |
||||
if width == 0 then |
||||
self.bar:Hide() |
||||
else |
||||
self.bar:Show() |
||||
self.bar:SetWidth(width) |
||||
end |
||||
self.value = settings.number |
||||
end, |
||||
---@param self Diesal.GUI.Object.Spinner |
||||
SetTextColor = function(self, color, alpha) |
||||
alpha = alpha or 1 |
||||
color = { DiesalTools.GetColor(color) } |
||||
self.editBox:SetTextColor(color[1], color[2], color[3], alpha) |
||||
end, |
||||
} |
||||
|
||||
---@class DiesalSpinner : Diesal.GUI.Object.Spinner |
||||
|
||||
---@class Diesal.GUI.Object.Spinner.Settings.Defaults |
||||
---@field height number |
||||
---@field width number |
||||
---@field mouse boolean |
||||
---@field mouseWheel boolean |
||||
---@field buttons boolean |
||||
---@field buttonsWidth number |
||||
---@field bar boolean |
||||
---@field min number |
||||
---@field max number |
||||
---@field step number |
||||
---@field shiftStep number |
||||
|
||||
---@class Diesal.GUI.Object.Spinner.Settings: Diesal.GUI.Object.Spinner.Settings.Defaults |
||||
---@field number number |
||||
|
||||
-- | Constructor |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local function Constructor() |
||||
---@class Diesal.GUI.Object.Spinner : Diesal.GUI.ObjectBase, Diesal.GUI.Spinner.Methods |
||||
---@field settings Diesal.GUI.Object.Spinner.Settings |
||||
local self = DiesalGUI:Create(Type, true) |
||||
local frame = CreateFrame("Frame", nil, UIParent) |
||||
self.frame = frame |
||||
-- ~~ Default Settings ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
self.defaults = { |
||||
height = 16, |
||||
width = 29, |
||||
mouse = true, |
||||
mouseWheel = true, |
||||
buttons = false, |
||||
buttonsWidth = 8, |
||||
bar = true, |
||||
min = 0, |
||||
max = 100, |
||||
step = 5, |
||||
shiftStep = 1, |
||||
} |
||||
-- ~~ Construct ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
frame:SetScript("OnHide", function(this) |
||||
self:FireEvent("OnHide") |
||||
end) |
||||
frame:SetScript("OnSizeChanged", function() |
||||
self:UpdateBar() |
||||
end) |
||||
|
||||
local editBox = self:CreateRegion("EditBox", "editBox", frame) --[[ @asDiesal.GUI.Region.EditBoxx ]] |
||||
editBox:SetPoint("TOP") |
||||
editBox:SetPoint("BOTTOM") |
||||
editBox:SetAutoFocus(false) |
||||
editBox:SetJustifyH("CENTER") |
||||
editBox:SetJustifyV("CENTER") |
||||
editBox:SetTextInsets(0, 0, 0, 0) |
||||
editBox:SetText(self.defaults.min) |
||||
editBox:SetScript("OnEnterPressed", function(this, ...) |
||||
local number = this:GetNumber() or self.settings.number -- if entered text or nothing revert to old value |
||||
local newNumber = processNumber(self, number) |
||||
|
||||
if newNumber then |
||||
self:FireEvent("OnValueChanged", true, newNumber) |
||||
end |
||||
self:FireEvent("OnEnterPressed", ...) |
||||
|
||||
DiesalGUI:ClearFocus() |
||||
end) |
||||
editBox:HookScript("OnEditFocusLost", function(this, ...) |
||||
processNumber(self, self.settings.number) |
||||
end) |
||||
editBox:HookScript("OnEditFocusGained", function(this) |
||||
this:SetText(self.settings.number) |
||||
this:HighlightText() |
||||
end) |
||||
editBox:SetScript("OnMouseWheel", function(this, delta) |
||||
DiesalGUI:OnMouse(this, "MouseWheel") |
||||
self:OnSpin(delta) |
||||
end) |
||||
editBox:SetScript("OnEnter", function(this, ...) |
||||
self:FireEvent("OnEnter", ...) |
||||
end) |
||||
editBox:SetScript("OnLeave", function(this, ...) |
||||
self:FireEvent("OnLeave", ...) |
||||
end) |
||||
|
||||
local bar = self:CreateRegion("Frame", "bar", frame) |
||||
bar:SetPoint("TOPLEFT", 1, -1) |
||||
bar:SetPoint("BOTTOMLEFT", -1, 1) |
||||
|
||||
local buttonUp = self:CreateRegion("Button", "buttonUp", frame) |
||||
buttonUp:SetPoint("TOP", 0, 0) |
||||
buttonUp:SetPoint("RIGHT") |
||||
buttonUp:SetScript("OnClick", function(this, button) |
||||
DiesalGUI:OnMouse(this, button) |
||||
PlaySound(799) |
||||
self:OnSpin(1) |
||||
end) |
||||
local buttonDown = self:CreateRegion("Button", "buttonDown", frame) |
||||
buttonDown:SetPoint("BOTTOM", 0, 0) |
||||
buttonDown:SetPoint("RIGHT") |
||||
buttonDown:SetScript("OnClick", function(this, button) |
||||
DiesalGUI:OnMouse(this, button) |
||||
PlaySound(799) |
||||
self:OnSpin(-1) |
||||
end) |
||||
|
||||
-- ~~ Methods ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
self:SetMethods(methods) |
||||
--[[ for method, func in pairs(methods) do |
||||
self[method] = func |
||||
end ]] |
||||
-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
return self |
||||
end |
||||
DiesalGUI:RegisterObjectConstructor(Type, Constructor, Version) |
@ -0,0 +1,43 @@ |
||||
---@type Diesal.GUI |
||||
local DiesalGUI = LibStub("DiesalGUI-2.0") |
||||
---@type Diesal.Tools |
||||
local DiesalTools = LibStub("DiesalTools-2.0") |
||||
---@type Diesal.Style |
||||
local DiesalStyle = LibStub("DiesalStyle-2.0") |
||||
|
||||
local Type = "DiesalText" |
||||
local Version = 1 |
||||
|
||||
---@class Diesal.GUI.Text.Methods : Diesal.GUI.ObjectBase |
||||
---@field OnAcquire fun(self:Diesal.GUI.Object.Text, ...) |
||||
---@field OnRelease fun(self:Diesal.GUI.Object.Text, ...) |
||||
local methods = { |
||||
OnAcquire = function(self, ...) |
||||
self:Show() |
||||
end, |
||||
OnRelease = function(self, ...) |
||||
--self.fontString:SetText("") |
||||
end, |
||||
} |
||||
|
||||
---@class DiesalText : Diesal.GUI.Object.Text |
||||
|
||||
local function Constructor() |
||||
---@class Diesal.GUI.Object.Text : Diesal.GUI.ObjectBase, Diesal.GUI.Text.Methods, Frame |
||||
---@field fontString FontString |
||||
local self = DiesalGUI:Create(Type, true) |
||||
self.defaults = {} |
||||
local frame = CreateFrame("Frame", nil, UIParent) |
||||
self.frame = frame |
||||
self:CreateRegion("FontString", "fontString", frame) |
||||
--local fontString = frame:CreateFontString(nil, "OVERLAY", "DiesalFontNormal") |
||||
--self.fontString = fontString |
||||
self.fontStrings[#self.fontStrings + 1] = self.fontString |
||||
self:SetMethods(methods) |
||||
--[[ for method, func in pairs(methods) do |
||||
self[method] = func |
||||
end ]] |
||||
return self |
||||
end |
||||
|
||||
DiesalGUI:RegisterObjectConstructor(Type, Constructor, Version) |
@ -0,0 +1,245 @@ |
||||
---@type Tinkr, Bastion |
||||
Tinkr, Bastion = ... |
||||
|
||||
---@type Diesal.GUI |
||||
local DiesalGUI = LibStub("DiesalGUI-2.0") |
||||
---@type Diesal.Tools |
||||
local DiesalTools = LibStub("DiesalTools-2.0") |
||||
---@type Diesal.Style |
||||
local DiesalStyle = LibStub("DiesalStyle-2.0") |
||||
|
||||
-- ~~| Diesal Upvalues |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local Colors = DiesalStyle.Colors |
||||
local HSL, ShadeColor, TintColor = DiesalTools.HSL, DiesalTools.ShadeColor, DiesalTools.TintColor |
||||
-- ~~| Lua Upvalues |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local type, tonumber, select = type, tonumber, select |
||||
local pairs, ipairs, next = pairs, ipairs, next |
||||
local min, max = math.min, math.max |
||||
-- ~~| WoW Upvalues |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local CreateFrame, UIParent, GetCursorPosition = CreateFrame, UIParent, GetCursorPosition |
||||
-- ~~| Button |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local Type = "DiesalToggle" |
||||
local Version = 1 |
||||
-- ~~| Button Stylesheets |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local Stylesheet = { |
||||
["frame-background"] = { |
||||
type = "texture", |
||||
layer = "BACKGROUND", |
||||
color = "000000", |
||||
alpha = 0.60, |
||||
position = -2, |
||||
}, |
||||
["frame-inline"] = { |
||||
type = "outline", |
||||
layer = "BORDER", |
||||
color = "000000", |
||||
alpha = 0.6, |
||||
position = -2, |
||||
}, |
||||
["frame-outline"] = { |
||||
type = "outline", |
||||
layer = "BORDER", |
||||
color = "FFFFFF", |
||||
alpha = 0.1, |
||||
position = -1, |
||||
}, |
||||
} |
||||
local checkBoxStyle = { |
||||
base = { |
||||
type = "texture", |
||||
layer = "ARTWORK", |
||||
color = Colors.UI_A400, |
||||
position = -3, |
||||
}, |
||||
disabled = { |
||||
type = "texture", |
||||
color = HSL(Colors.UI_Hue, Colors.UI_Saturation, 0.35), |
||||
}, |
||||
enabled = { |
||||
type = "texture", |
||||
color = Colors.UI_A400, |
||||
}, |
||||
} |
||||
|
||||
local wireFrame = { |
||||
["frame-white"] = { |
||||
type = "outline", |
||||
layer = "OVERLAY", |
||||
color = "ffffff", |
||||
}, |
||||
} |
||||
-- ~~| Button Methods |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
---@class Diesal.GUI.Toggle.Methods |
||||
local methods = { |
||||
---@param self DiesalToggle |
||||
OnAcquire = function(self) |
||||
self:ApplySettings() |
||||
self:SetStylesheet(Stylesheet) |
||||
self:Enable() |
||||
-- self:SetStylesheet(wireFrameSheet) |
||||
self.label:SetFontObject(DiesalFontNormal) |
||||
self.label:SetText() |
||||
self:Show() |
||||
end, |
||||
|
||||
---@param self DiesalToggle |
||||
OnRelease = function(self) end, |
||||
|
||||
---@param self DiesalToggle |
||||
ApplySettings = function(self) |
||||
local settings = self.settings |
||||
local frame = self.frame |
||||
|
||||
self:SetWidth(settings.width) |
||||
self:SetHeight(settings.height) |
||||
end, |
||||
|
||||
---@param self DiesalToggle |
||||
---@param value boolean |
||||
SetChecked = function(self, value) |
||||
self.settings.checked = value |
||||
self.frame:SetChecked(value) |
||||
|
||||
self[self.settings.disabled and "Disable" or "Enable"](self) |
||||
end, |
||||
|
||||
---@param self DiesalToggle |
||||
GetChecked = function(self) |
||||
return self.settings.checked |
||||
end, |
||||
|
||||
---@param self DiesalToggle |
||||
Disable = function(self) |
||||
self.settings.disabled = true |
||||
DiesalStyle:StyleTexture(self.check, self.checkBoxStyle and self.checkBoxStyle.disabled or checkBoxStyle.disabled) |
||||
self.frame:Disable() |
||||
end, |
||||
|
||||
---@param self DiesalToggle |
||||
Enable = function(self) |
||||
self.settings.disabled = false |
||||
DiesalStyle:StyleTexture(self.check, self.checkBoxStyle and self.checkBoxStyle.enabled or checkBoxStyle.enabled) |
||||
self.frame:Enable() |
||||
end, |
||||
|
||||
---@param self DiesalToggle |
||||
---@param ... any |
||||
RegisterForClicks = function(self, ...) |
||||
self.frame:RegisterForClicks(...) |
||||
end, |
||||
|
||||
---@param self DiesalToggle |
||||
---@param text? string |
||||
SetText = function(self, text) |
||||
self.label:SetText(text) |
||||
self.frame:SetHitRectInsets(0, -self.label:GetWidth(), 0, 0) |
||||
end, |
||||
} |
||||
|
||||
---@alias DiesalToggle Diesal.GUI.Object.Toggle |
||||
|
||||
---@class Diesal.Style.CheckBox.Style |
||||
---@field base {type: "texture", layer: "ARTWORK", color: string, position: number} |
||||
---@field disabled {type: "texture", color: string} |
||||
---@field enabled {type: "texture", color: string}} |
||||
|
||||
---@class Diesal.GUI.Toggle.Settings |
||||
---@field height number |
||||
---@field width number |
||||
---@field checked boolean |
||||
---@field disabled boolean |
||||
---@field tooltip? string |
||||
|
||||
-- ~~| Button Constructor |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local function Constructor() |
||||
---@class Diesal.GUI.Object.Toggle : Diesal.GUI.ObjectBase, Diesal.GUI.Toggle.Methods |
||||
---@field check Texture |
||||
---@field settings Diesal.GUI.Toggle.Settings |
||||
---@field checkBoxStyle? Diesal.Style.CheckBox.Style |
||||
---@field label FontString |
||||
local self = DiesalGUI:Create(Type, true) |
||||
local frame = CreateFrame("CheckButton", nil, UIParent) |
||||
local fontString = self:CreateRegion("FontString", "label", frame) |
||||
self.frame = frame |
||||
|
||||
local c, a = 0.5, 0.5 |
||||
local tex = frame:CreateTexture(nil, "BACKGROUND") |
||||
tex:SetAllPoints() |
||||
tex:SetColorTexture(0, 0, 0, 0) |
||||
|
||||
-- ~~ Default Settings ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
self.defaults = { |
||||
height = 12, |
||||
width = 12, |
||||
} |
||||
|
||||
-- ~~ Events ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
-- OnAcquire, OnRelease, OnHeightSet, OnWidthSet |
||||
-- OnValueChanged, OnEnter, OnLeave, OnDisable, OnEnable |
||||
-- ~~ Construct ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
|
||||
local check = self:CreateRegion("Texture", "check", frame) |
||||
-- Setting self.check again is pointless when CreateRegion already does it.... |
||||
-- self.check = check |
||||
|
||||
DiesalStyle:StyleTexture(check, self.checkBoxStyle and self.checkBoxStyle.base or checkBoxStyle.base) |
||||
frame:SetCheckedTexture(check) |
||||
frame:SetScript("OnClick", function(this, button, ...) |
||||
DiesalGUI:OnMouse(this, button) |
||||
|
||||
if not self.settings.disabled then |
||||
self:SetChecked(not self.settings.checked) |
||||
|
||||
if self.settings.checked then |
||||
PlaySound(856) |
||||
else |
||||
PlaySound(857) |
||||
end |
||||
|
||||
self:FireEvent("OnValueChanged", self.settings.checked) |
||||
end |
||||
end) |
||||
|
||||
frame:SetScript("OnEnter", function(this) |
||||
if self.settings.tooltip then |
||||
GameTooltip:SetOwner(this, "ANCHOR_TOPLEFT", 0, 2) |
||||
GameTooltip:AddLine(self.settings.tooltip) |
||||
GameTooltip:Show() |
||||
end |
||||
self:FireEvent("OnEnter") |
||||
tex:SetColorTexture(c, c, c, a) |
||||
-- SetCursor([[Interface\Cursor\Cast]]) |
||||
end) |
||||
|
||||
frame:SetScript("OnLeave", function(this) |
||||
if self.settings.tooltip then |
||||
GameTooltip:Hide() |
||||
end |
||||
self:FireEvent("OnLeave") |
||||
tex:SetColorTexture(0, 0, 0, 0) |
||||
-- SetCursor(nil) |
||||
end) |
||||
|
||||
frame:SetScript("OnDisable", function(this) |
||||
self:FireEvent("OnDisable") |
||||
end) |
||||
frame:SetScript("OnEnable", function(this) |
||||
self:FireEvent("OnEnable") |
||||
end) |
||||
|
||||
fontString:SetPoint("LEFT", frame, "RIGHT", 5, 0) |
||||
fontString:SetHeight(0) |
||||
fontString:SetJustifyH("MIDDLE") |
||||
fontString:SetJustifyV("MIDDLE") |
||||
fontString:SetWordWrap(false) |
||||
|
||||
-- ~~ Methods ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
self:SetMethods(methods) |
||||
--[[ for method, func in pairs(methods) do |
||||
self[method] = func |
||||
end ]] |
||||
-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
return self |
||||
end |
||||
|
||||
DiesalGUI:RegisterObjectConstructor(Type, Constructor, Version) |
@ -0,0 +1,104 @@ |
||||
---@type Diesal.GUI |
||||
local DiesalGUI = LibStub("DiesalGUI-2.0") |
||||
---@type Diesal.Tools |
||||
local DiesalTools = LibStub("DiesalTools-2.0") |
||||
---@type Diesal.Style |
||||
local DiesalStyle = LibStub("DiesalStyle-2.0") |
||||
-- ~~| Lua Upvalues |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local sub, format, match, lower = string.sub, string.format, string.match, string.lower |
||||
local tsort = table.sort |
||||
|
||||
-- ~~| WoW Upvalues |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
|
||||
-- ~~| Tree |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local Type = "DiesalTree" |
||||
local Version = 4 |
||||
|
||||
---@class DTree : Diesal.GUI.Object.Tree |
||||
|
||||
-- ~~| Tree Stylesheets |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local Stylesheet = { |
||||
["content-background"] = { |
||||
type = "texture", |
||||
color = "ffffff", |
||||
alpha = 0.01, |
||||
}, |
||||
} |
||||
-- ~~| Tree Locals |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local function collapse(branch) |
||||
if branch.Collapse then |
||||
branch:Collapse() |
||||
end |
||||
if branch.children and next(branch.children) then |
||||
for i = 1, #branch.children do |
||||
collapse(branch.children[i]) |
||||
end |
||||
end |
||||
end |
||||
-- ~~| Tree Methods |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
---@class Diesal.GUI.Tree.Methods |
||||
local methods = { |
||||
["OnAcquire"] = function(self) |
||||
-- self:SetStylesheet(Stylesheet) |
||||
-- self:SetStylesheet(wireFrameSheet) |
||||
self:ApplySettings() |
||||
self:Show() |
||||
end, |
||||
["OnRelease"] = function(self) end, |
||||
["ApplySettings"] = function(self) end, |
||||
["UpdateHeight"] = function(self) |
||||
local height = 0 |
||||
|
||||
for i = 1, #self.children do |
||||
height = height + self.children[i].frame:GetHeight() |
||||
end |
||||
height = DiesalTools.Round(height) |
||||
|
||||
if self.settings.height ~= height then |
||||
self.settings.height = height |
||||
self:SetHeight(height) |
||||
self:FireEvent("OnHeightChange", height) |
||||
end |
||||
end, |
||||
["CollapseAll"] = function(self, subBranches) |
||||
if subBranches then |
||||
collapse(self) |
||||
else |
||||
for i = 1, #self.children do |
||||
self.children[i]:Collapse() |
||||
end |
||||
end |
||||
end, |
||||
["ExpandAll"] = function(self) |
||||
for i = 1, #self.children do |
||||
self.children[i]:Expand() |
||||
end |
||||
end, |
||||
} |
||||
|
||||
---@class DiesalTree : Diesal.GUI.Object.Tree |
||||
|
||||
-- ~~| Tree Constructor |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local function Constructor() |
||||
---@class Diesal.GUI.Object.Tree : Diesal.GUI.ObjectBase, Diesal.GUI.Tree.Methods |
||||
local self = DiesalGUI:Create(Type, true) |
||||
self.isContainer = true |
||||
local frame = CreateFrame("Frame", nil, UIParent) |
||||
self.frame = frame |
||||
-- ~~ Default Settings ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
self.defaults = { depth = 0 } |
||||
-- ~~ Events ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
-- OnAcquire, OnRelease, OnHeightSet, OnWidthSet |
||||
-- OnHeightChange |
||||
-- ~~ Construct ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local content = self:CreateRegion("Frame", "content", frame) |
||||
content:SetAllPoints() |
||||
-- ~~ Methods ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
self:SetMethods(methods) |
||||
--[[ for method, func in pairs(methods) do |
||||
self[method] = func |
||||
end ]] |
||||
-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
return self |
||||
end |
||||
DiesalGUI:RegisterObjectConstructor(Type, Constructor, Version) |
@ -0,0 +1,462 @@ |
||||
---@type Diesal.GUI |
||||
local DiesalGUI = LibStub("DiesalGUI-2.0") |
||||
---@type Diesal.Tools |
||||
local DiesalTools = LibStub("DiesalTools-2.0") |
||||
---@type Diesal.Style |
||||
local DiesalStyle = LibStub("DiesalStyle-2.0") |
||||
|
||||
local Colors = DiesalStyle.Colors |
||||
-- | Lua Upvalues |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local type, select, pairs, tonumber = type, select, pairs, tonumber |
||||
local floor, ceil = math.floor, math.ceil |
||||
-- | WoW Upvalues |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
-- | Window |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local Type = "DiesalWindow" |
||||
local Version = 14 |
||||
-- ~~| Stylesheets |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local Stylesheet = { |
||||
["frame-outline"] = { |
||||
type = "outline", |
||||
layer = "BACKGROUND", |
||||
color = "000000", |
||||
}, |
||||
["frame-shadow"] = { |
||||
type = "shadow", |
||||
}, |
||||
["titleBar-color"] = { |
||||
type = "texture", |
||||
layer = "BACKGROUND", |
||||
color = "000000", |
||||
alpha = 0.95, |
||||
}, |
||||
["titletext-Font"] = { |
||||
type = "font", |
||||
color = "d8d8d8", |
||||
}, |
||||
["closeButton-icon"] = { |
||||
type = "texture", |
||||
layer = "ARTWORK", |
||||
image = { "DiesalGUIcons", { 9, 5, 16, 256, 128 } }, |
||||
alpha = 0.3, |
||||
position = { -2, nil, -1, nil }, |
||||
width = 16, |
||||
height = 16, |
||||
}, |
||||
["closeButton-iconHover"] = { |
||||
type = "texture", |
||||
layer = "HIGHLIGHT", |
||||
image = { "DiesalGUIcons", { 9, 5, 16, 256, 128 }, "b30000" }, |
||||
alpha = 1, |
||||
position = { -2, nil, -1, nil }, |
||||
width = 16, |
||||
height = 16, |
||||
}, |
||||
["header-background"] = { |
||||
type = "texture", |
||||
layer = "BACKGROUND", |
||||
gradient = { "VERTICAL", Colors.UI_400_GR[1], Colors.UI_400_GR[2] }, |
||||
alpha = 0.95, |
||||
position = { 0, 0, 0, -1 }, |
||||
}, |
||||
["header-inline"] = { |
||||
type = "outline", |
||||
layer = "BORDER", |
||||
gradient = { "VERTICAL", "ffffff", "ffffff" }, |
||||
alpha = { 0.05, 0.02 }, |
||||
position = { 0, 0, 0, -1 }, |
||||
}, |
||||
["header-divider"] = { |
||||
type = "texture", |
||||
layer = "BORDER", |
||||
color = "000000", |
||||
alpha = 1, |
||||
position = { 0, 0, nil, 0 }, |
||||
height = 1, |
||||
}, |
||||
["content-background"] = { |
||||
type = "texture", |
||||
layer = "BACKGROUND", |
||||
color = Colors.UI_100, |
||||
alpha = 0.95, |
||||
}, |
||||
["content-outline"] = { |
||||
type = "outline", |
||||
layer = "BORDER", |
||||
color = "FFFFFF", |
||||
alpha = 0.01, |
||||
}, |
||||
["footer-background"] = { |
||||
type = "texture", |
||||
layer = "BACKGROUND", |
||||
gradient = { "VERTICAL", Colors.UI_400_GR[1], Colors.UI_400_GR[2] }, |
||||
alpha = 0.95, |
||||
position = { 0, 0, -1, 0 }, |
||||
}, |
||||
["footer-divider"] = { |
||||
type = "texture", |
||||
layer = "BACKGROUND", |
||||
color = "000000", |
||||
position = { 0, 0, 0, nil }, |
||||
height = 1, |
||||
}, |
||||
["footer-inline"] = { |
||||
type = "outline", |
||||
layer = "BORDER", |
||||
gradient = { "VERTICAL", "ffffff", "ffffff" }, |
||||
alpha = { 0.05, 0.02 }, |
||||
position = { 0, 0, -1, 0 }, |
||||
debug = true, |
||||
}, |
||||
} |
||||
local wireFrame = { |
||||
["frame-white"] = { |
||||
type = "outline", |
||||
layer = "OVERLAY", |
||||
color = "ffffff", |
||||
}, |
||||
["titleBar-yellow"] = { |
||||
type = "outline", |
||||
layer = "OVERLAY", |
||||
color = "fffc00", |
||||
}, |
||||
["closeButton-orange"] = { |
||||
type = "outline", |
||||
layer = "OVERLAY", |
||||
color = "ffd400", |
||||
}, |
||||
["header-blue"] = { |
||||
type = "outline", |
||||
layer = "OVERLAY", |
||||
color = "00aaff", |
||||
}, |
||||
["footer-green"] = { |
||||
type = "outline", |
||||
layer = "OVERLAY", |
||||
color = "55ff00", |
||||
}, |
||||
} |
||||
local sizerWireFrame = { |
||||
["sizerR-yellow"] = { |
||||
type = "outline", |
||||
layer = "OVERLAY", |
||||
color = "fffc00", |
||||
}, |
||||
["sizerB-green"] = { |
||||
type = "outline", |
||||
layer = "OVERLAY", |
||||
color = "55ff00", |
||||
}, |
||||
["sizerBR-blue"] = { |
||||
type = "outline", |
||||
layer = "OVERLAY", |
||||
color = "00aaff", |
||||
}, |
||||
} |
||||
-- | Window Locals |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local function round(num) |
||||
if num >= 0 then |
||||
return floor(num + 0.5) |
||||
else |
||||
return ceil(num - 0.5) |
||||
end |
||||
end |
||||
|
||||
-- | Methods |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
---@class Diesal.GUI.Window.Methods |
||||
---@field OnAcquire fun(self: Diesal.GUI.Object.Window) |
||||
---@field OnRelease fun(self: Diesal.GUI.Object.Window) |
||||
---@field SetTopLevel fun(self: Diesal.GUI.Object.Window) |
||||
---@field SetContentHeight fun(self: Diesal.GUI.Object.Window, height: number) |
||||
---@field ApplySettings fun(self: Diesal.GUI.Object.Window) |
||||
---@field UpdatePosition fun(self: Diesal.GUI.Object.Window) |
||||
---@field UpdateSizers fun(self: Diesal.GUI.Object.Window) |
||||
---@field SetTitle fun(self: Diesal.GUI.Object.Window, title?: string, subtitle?: string) |
||||
local methods = { |
||||
---@param self Diesal.GUI.Object.Window |
||||
["OnAcquire"] = function(self) |
||||
self:ApplySettings() |
||||
self:SetStylesheet(Stylesheet) |
||||
-- self:SetStylesheet(sizerWireFrame) |
||||
self:Show() |
||||
end, |
||||
["OnRelease"] = function(self) end, |
||||
["SetTopLevel"] = function(self) |
||||
self.frame:SetToplevel(true) |
||||
end, |
||||
---@param height number |
||||
["SetContentHeight"] = function(self, height) |
||||
local contentHeight = round(self.content:GetHeight()) |
||||
self.frame:SetHeight((self.settings.height - contentHeight) + height) |
||||
end, |
||||
["ApplySettings"] = function(self) |
||||
local settings = self.settings |
||||
local frame = self.frame |
||||
local titleBar = self.titleBar |
||||
local closeButton = self.closeButton |
||||
local header = self.header |
||||
local content = self.content |
||||
local footer = self.footer |
||||
|
||||
local headerHeight = settings.header and settings.headerHeight or 0 |
||||
local footerHeight = settings.footer and settings.footerHeight or 0 |
||||
|
||||
frame:SetResizeBounds(settings.minWidth, settings.minHeight, settings.maxWidth, settings.maxHeight) |
||||
|
||||
self:UpdatePosition() |
||||
self:UpdateSizers() |
||||
|
||||
titleBar:SetHeight(settings.titleBarHeight) |
||||
closeButton:SetHeight(settings.titleBarHeight) |
||||
closeButton:SetWidth(settings.titleBarHeight) |
||||
|
||||
content:SetPoint("TOPLEFT", settings.padding[1], -(settings.titleBarHeight + headerHeight)) |
||||
content:SetPoint("BOTTOMRIGHT", -settings.padding[2], footerHeight + settings.padding[4]) |
||||
header:SetHeight(headerHeight) |
||||
footer:SetHeight(footerHeight) |
||||
header[settings.header and "Show" or "Hide"](header) |
||||
footer[settings.footer and "Show" or "Hide"](footer) |
||||
|
||||
header:SetPoint("TOPLEFT", self.titleBar, "BOTTOMLEFT", settings.padding[1], 0) |
||||
header:SetPoint("TOPRIGHT", self.titleBar, "BOTTOMRIGHT", -settings.padding[2], 0) |
||||
|
||||
footer:SetPoint("BOTTOMLEFT", settings.padding[1], settings.padding[4]) |
||||
footer:SetPoint("BOTTOMRIGHT", -settings.padding[2], settings.padding[4]) |
||||
end, |
||||
["UpdatePosition"] = function(self) |
||||
self.frame:ClearAllPoints() |
||||
if self.settings.top and self.settings.left then |
||||
self.frame:SetPoint("TOP", UIParent, "BOTTOM", 0, self.settings.top) |
||||
self.frame:SetPoint("LEFT", UIParent, "LEFT", self.settings.left, 0) |
||||
else |
||||
self.frame:SetPoint("CENTER", UIParent, "CENTER") |
||||
end |
||||
|
||||
self.frame:SetWidth(self.settings.width) |
||||
self.frame:SetHeight(self.settings.height) |
||||
end, |
||||
["UpdateSizers"] = function(self) |
||||
local settings = self.settings |
||||
|
||||
local frame = self.frame |
||||
local sizerB = self.sizerB |
||||
local sizerR = self.sizerR |
||||
local sizerBR = self.sizerBR |
||||
|
||||
sizerBR[settings.sizerBR and "Show" or "Hide"](sizerBR) |
||||
sizerBR:SetSize(settings.sizerBRWidth, settings.sizerBRHeight) |
||||
sizerB[settings.sizerB and "Show" or "Hide"](sizerB) |
||||
sizerB:SetHeight(settings.sizerHeight) |
||||
sizerB:SetPoint("BOTTOMRIGHT", frame, "BOTTOMRIGHT", -settings.sizerBRWidth, 0) |
||||
sizerR[settings.sizerR and "Show" or "Hide"](sizerR) |
||||
sizerR:SetWidth(settings.sizerWidth) |
||||
sizerR:SetPoint("TOPRIGHT", frame, "TOPRIGHT", 0, -settings.titleBarHeight) |
||||
sizerR:SetPoint("BOTTOMRIGHT", frame, "BOTTOMRIGHT", 0, settings.sizerBRHeight) |
||||
end, |
||||
---@param title string |
||||
---@param subtitle? string |
||||
["SetTitle"] = function(self, title, subtitle) |
||||
local settings = self.settings |
||||
settings.title = title or settings.title |
||||
settings.subTitle = subtitle or settings.subTitle |
||||
self.titletext:SetText(("%s |cff7f7f7f%s"):format(settings.title, settings.subTitle)) |
||||
end, |
||||
} |
||||
|
||||
---@class Diesal.GUI.Window.Frame : Frame, { obj: Diesal.GUI.Object.Window } |
||||
|
||||
---@class Diesal.GUI.Window.Settings |
||||
---@field footer boolean -- false |
||||
---@field footerHeight number -- 21 |
||||
---@field header boolean -- false |
||||
---@field headerHeight number -- 21 |
||||
---@field height number -- 300 |
||||
---@field left? number |
||||
---@field maxHeight number -- 9999 |
||||
---@field maxWidth number -- 9999 |
||||
---@field minHeight number -- 200 |
||||
---@field minWidth number -- 200 |
||||
---@field padding { [1]: number, [2]: number, [3]: number, [4]: number } |
||||
---@field sizerB boolean -- true |
||||
---@field sizerBR boolean -- true |
||||
---@field sizerBRHeight number -- 6, |
||||
---@field sizerBRWidth number -- 6, |
||||
---@field sizerHeight number -- 6 |
||||
---@field sizerR boolean -- true |
||||
---@field sizerWidth number -- 6 |
||||
---@field subTitle string -- "" |
||||
---@field title string -- "" |
||||
---@field titleBarHeight number -- 18, |
||||
---@field top? number |
||||
---@field width number -- 500, |
||||
|
||||
---@class DiesalWindow : Diesal.GUI.Object.Window |
||||
|
||||
-- | Constructor |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local function Constructor() |
||||
---@class Diesal.GUI.Object.Window : Diesal.GUI.ObjectBase, Diesal.GUI.Window.Methods |
||||
---@field frame Diesal.GUI.Window.Frame |
||||
---@field titleBar Button |
||||
---@field closeButton Button |
||||
---@field titletext FontString |
||||
---@field header Frame |
||||
---@field content Frame |
||||
---@field footer Frame |
||||
---@field sizerR Frame |
||||
---@field sizerB Frame |
||||
---@field sizerBR Frame |
||||
---@field listener Tinkr.Util.GUIBuilder.Listener |
||||
---@field status_listener Tinkr.Util.GUIBuilder.Listener |
||||
---@field settings Diesal.GUI.Window.Settings |
||||
---@field defaults Diesal.GUI.Window.Settings |
||||
local self = DiesalGUI:Create(Type, true) |
||||
self.isContainer = true |
||||
|
||||
---@type Diesal.GUI.Window.Frame |
||||
local frame = CreateFrame("Frame", nil, UIParent) |
||||
|
||||
self.frame = frame |
||||
|
||||
self.defaults = { |
||||
height = 300, |
||||
width = 500, |
||||
minHeight = 200, |
||||
minWidth = 200, |
||||
maxHeight = 9999, |
||||
maxWidth = 9999, |
||||
left = nil, |
||||
top = nil, |
||||
titleBarHeight = 18, |
||||
title = "", |
||||
subTitle = "", |
||||
padding = { 1, 1, 0, 1 }, |
||||
header = false, |
||||
headerHeight = 21, |
||||
footer = false, |
||||
footerHeight = 21, |
||||
sizerR = true, |
||||
sizerB = true, |
||||
sizerBR = true, |
||||
sizerWidth = 6, |
||||
sizerHeight = 6, |
||||
sizerBRHeight = 6, |
||||
sizerBRWidth = 6, |
||||
} |
||||
-- ~~ Events ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
-- OnAcquire, OnRelease, OnHeightSet, OnWidthSet |
||||
-- OnSizeChanged, OnDragStop, OnHide, OnShow, OnClose |
||||
-- ~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
frame:EnableMouse() |
||||
frame:SetMovable(true) |
||||
frame:SetResizable(true) |
||||
frame:SetScript("OnMouseDown", function(this, button) |
||||
DiesalGUI:OnMouse(this, button) |
||||
end) |
||||
|
||||
frame:SetScript("OnSizeChanged", function(this, width, height) |
||||
self.settings.width = DiesalTools.Round(width) |
||||
self.settings.height = DiesalTools.Round(height) |
||||
|
||||
self:FireEvent("OnSizeChanged", self.settings.width, self.settings.height) |
||||
end) |
||||
|
||||
frame:SetScript("OnHide", function(this) |
||||
self:FireEvent("OnHide") |
||||
end) |
||||
|
||||
frame:SetScript("OnShow", function(this) |
||||
self:FireEvent("OnShow") |
||||
end) |
||||
|
||||
frame:SetToplevel(true) |
||||
|
||||
frame.obj = self |
||||
|
||||
local titleBar = self:CreateRegion("Button", "titleBar", frame) |
||||
titleBar:SetPoint("TOPLEFT") |
||||
titleBar:SetPoint("TOPRIGHT") |
||||
titleBar:EnableMouse() |
||||
|
||||
titleBar:SetScript("OnMouseDown", function(this, button) |
||||
DiesalGUI:OnMouse(this, button) |
||||
frame:StartMoving() |
||||
end) |
||||
|
||||
titleBar:SetScript("OnMouseUp", function(this) |
||||
frame:StopMovingOrSizing() |
||||
|
||||
self.settings.top = DiesalTools.Round(frame:GetTop()) |
||||
self.settings.left = DiesalTools.Round(frame:GetLeft()) |
||||
|
||||
self:UpdatePosition() |
||||
self:FireEvent("OnDragStop", self.settings.left, self.settings.top) |
||||
end) |
||||
|
||||
local closeButton = self:CreateRegion("Button", "closeButton", titleBar) |
||||
closeButton:SetPoint("TOPRIGHT", -1, 1) |
||||
closeButton:SetScript("OnClick", function(this, button) |
||||
DiesalGUI:OnMouse(this, button) |
||||
PlaySound(799) |
||||
self:FireEvent("OnClose") |
||||
self:Hide() |
||||
end) |
||||
|
||||
local titletext = self:CreateRegion("FontString", "titletext", titleBar) |
||||
titletext:SetWordWrap(false) |
||||
titletext:SetPoint("TOPLEFT", 4, -5) |
||||
titletext:SetPoint("TOPRIGHT", -20, -5) |
||||
titletext:SetJustifyH("TOP") |
||||
titletext:SetJustifyH("LEFT") |
||||
|
||||
self:CreateRegion("Frame", "header", frame) |
||||
self:CreateRegion("Frame", "content", frame) |
||||
self:CreateRegion("Frame", "footer", frame) |
||||
|
||||
local sizerBR = self:CreateRegion("Frame", "sizerBR", frame) |
||||
sizerBR:SetPoint("BOTTOMRIGHT", frame, "BOTTOMRIGHT", 0, 0) |
||||
sizerBR:EnableMouse() |
||||
sizerBR:SetScript("OnMouseDown", function(this, button) |
||||
DiesalGUI:OnMouse(this, button) |
||||
frame:StartSizing("BOTTOMRIGHT") |
||||
end) |
||||
|
||||
sizerBR:SetScript("OnMouseUp", function(this) |
||||
frame:StopMovingOrSizing() |
||||
self:UpdatePosition() |
||||
self:FireEvent("OnSizeStop", self.settings.width, self.settings.height) |
||||
end) |
||||
|
||||
local sizerB = self:CreateRegion("Frame", "sizerB", frame) |
||||
sizerB:SetPoint("BOTTOMLEFT", frame, "BOTTOMLEFT", 0, 0) |
||||
sizerB:EnableMouse() |
||||
sizerB:SetScript("OnMouseDown", function(this, button) |
||||
DiesalGUI:OnMouse(this, button) |
||||
frame:StartSizing("BOTTOM") |
||||
end) |
||||
|
||||
sizerB:SetScript("OnMouseUp", function(this) |
||||
frame:StopMovingOrSizing() |
||||
self:UpdatePosition() |
||||
self:FireEvent("OnSizeStop", self.settings.width, self.settings.height) |
||||
end) |
||||
|
||||
local sizerR = self:CreateRegion("Frame", "sizerR", frame) |
||||
sizerR:EnableMouse() |
||||
sizerR:SetScript("OnMouseDown", function(this, button) |
||||
DiesalGUI:OnMouse(this, button) |
||||
frame:StartSizing("RIGHT") |
||||
end) |
||||
|
||||
sizerR:SetScript("OnMouseUp", function(this) |
||||
frame:StopMovingOrSizing() |
||||
self:UpdatePosition() |
||||
self:FireEvent("OnSizeStop", self.settings.width, self.settings.height) |
||||
end) |
||||
-- ~~ Methods ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
self:SetMethods(methods) |
||||
--[[ for method, func in pairs(methods) do |
||||
self[method] = func |
||||
end ]] |
||||
-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
return self |
||||
end |
||||
DiesalGUI:RegisterObjectConstructor(Type, Constructor, Version) |
@ -1,69 +0,0 @@ |
||||
-- $Id: DiesalMenu-1.0.lua 53 2016-07-12 21:56:30Z diesal2010 $ |
||||
local MAJOR, MINOR = "DiesalMenu-1.0", "$Rev: 53 $" |
||||
local DiesalMenu, oldminor = LibStub:NewLibrary(MAJOR, MINOR) |
||||
if not DiesalMenu then return end -- No Upgrade needed. |
||||
-- ~~| Libraries |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local DiesalTools = LibStub("DiesalTools-1.0") |
||||
local DiesalStyle = LibStub("DiesalStyle-1.0") |
||||
local DiesalGUI = LibStub("DiesalGUI-1.0") |
||||
-- ~~| Lua Upvalues |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local type, select, tonumber = type, select, tonumber |
||||
local setmetatable, getmetatable, next = setmetatable, getmetatable, next |
||||
local sub, format, lower, upper, match = string.sub, string.format, string.lower, string.upper, string.match |
||||
local pairs, ipairs = pairs,ipairs |
||||
local tinsert, tremove, tconcat, tsort = table.insert, table.remove, table.concat, table.sort |
||||
local floor, ceil, abs, modf = math.floor, math.ceil, math.abs, math.modf |
||||
-- ~~| WoW Upvalues |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local CreateFrame, UIParent = CreateFrame, UIParent |
||||
-- ~~| DiesalMenu Values |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
|
||||
-- ~~| DiesalMenu Upvalues |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
-- ~~| DiesalStyle Locals |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local MENU |
||||
local CLOSEDELAY = 2 |
||||
|
||||
local closeTimer = CreateFrame('Frame') |
||||
closeTimer:Hide() |
||||
closeTimer:SetScript('OnUpdate', function(this,elapsed) |
||||
if this.count < 0 then |
||||
DiesalMenu:Close() |
||||
this:Hide() |
||||
else |
||||
this.count = this.count - elapsed |
||||
end |
||||
end) |
||||
-- ~~| DiesalMenu Local Methods |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
|
||||
-- ~~| DiesalMenu API |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
function DiesalMenu:Menu(menuData,anchor,x,y,closeDelay) |
||||
MENU = MENU or DiesalGUI:Create('Menu') |
||||
MENU:ResetSettings() |
||||
if not MENU:BuildMenu(menuData) then MENU:Hide() return end |
||||
MENU:Show() |
||||
MENU:ClearAllPoints() |
||||
MENU:SetPoint('TOPLEFT',anchor,'TOPLEFT',x,y) |
||||
closeTimer.closeDelay = closeDelay or CLOSEDELAY |
||||
DiesalMenu:StartCloseTimer() |
||||
DiesalMenu:SetFocus() |
||||
end |
||||
function DiesalMenu:Close() |
||||
DiesalMenu:StopCloseTimer() |
||||
if not MENU or not MENU:IsVisible() then return end |
||||
MENU:ResetSettings() |
||||
MENU:ReleaseChildren() |
||||
MENU:Hide() |
||||
MENU:ClearAllPoints() |
||||
end |
||||
function DiesalMenu:StartCloseTimer() |
||||
closeTimer.count = closeTimer.closeDelay |
||||
closeTimer:Show() |
||||
end |
||||
function DiesalMenu:StopCloseTimer() |
||||
closeTimer:Hide() |
||||
end |
||||
function DiesalMenu:ClearFocus() |
||||
DiesalMenu:Close() |
||||
end |
||||
function DiesalMenu:SetFocus() |
||||
DiesalGUI:SetFocus(DiesalMenu) |
||||
end |
@ -1,6 +0,0 @@ |
||||
<Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/..\FrameXML\UI.xsd"> |
||||
<Script file="DiesalMenu-1.0.lua"/> |
||||
<!-- Objects --> |
||||
<Script file="Objects\Menu.lua"/> |
||||
<Script file="Objects\MenuItem.lua"/> |
||||
</Ui> |
@ -1,132 +0,0 @@ |
||||
-- $Id: Menu.lua 60 2016-11-04 01:34:23Z diesal2010 $ |
||||
local DiesalMenu = LibStub('DiesalMenu-1.0') |
||||
-- ~~| Libraries |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local DiesalGUI = LibStub('DiesalGUI-1.0') |
||||
local DiesalTools = LibStub('DiesalTools-1.0') |
||||
local DiesalStyle = LibStub("DiesalStyle-1.0") |
||||
-- ~~| Diesal Upvalues |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local Colors = DiesalStyle.Colors |
||||
local HSL, ShadeColor, TintColor = DiesalTools.HSL, DiesalTools.ShadeColor, DiesalTools.TintColor |
||||
-- | Lua Upvalues |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local ipairs, pairs, table_sort = ipairs, pairs, table.sort |
||||
-- | WoW Upvalues |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
-- | Menu |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local Type = 'Menu' |
||||
local Version = 2 |
||||
-- | Stylesheets |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local Stylesheet = { |
||||
['frame-background'] = { |
||||
type = 'texture', |
||||
layer = 'BACKGROUND', |
||||
color = Colors.UI_100, |
||||
alpha = .95, |
||||
}, |
||||
['frame-inline'] = { |
||||
type = 'outline', |
||||
layer = 'BORDER', |
||||
color = 'ffffff', |
||||
alpha = .02, |
||||
position = -1, |
||||
}, |
||||
['frame-shadow'] = { |
||||
type = 'shadow', |
||||
}, |
||||
} |
||||
local wireFrame = { |
||||
['frame-white'] = { |
||||
type = 'outline', |
||||
layer = 'OVERLAY', |
||||
color = 'ffffff', |
||||
}, |
||||
['content-yellow'] = { |
||||
type = 'outline', |
||||
layer = 'OVERLAY', |
||||
color = 'fffc00', |
||||
}, |
||||
} |
||||
-- | Locals |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local function compare(a,b) |
||||
return a[1] < b[1] |
||||
end |
||||
local function sortTable(t) |
||||
local st = {} |
||||
for key, val in pairs(t) do |
||||
st[#st + 1] = {val.order, key} |
||||
end |
||||
table_sort(st,compare) |
||||
return st |
||||
end |
||||
-- | Methods |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local methods = { |
||||
['OnAcquire'] = function(self) |
||||
self.frame:SetFrameStrata("FULLSCREEN_DIALOG") |
||||
self:ApplySettings() |
||||
self:SetStylesheet(Stylesheet) |
||||
-- self:SetStylesheet(wireFrame) |
||||
end, |
||||
['OnRelease'] = function(self) |
||||
|
||||
end, |
||||
['ApplySettings'] = function(self) |
||||
self:UpdatePosition() |
||||
end, |
||||
['UpdatePosition'] = function(self) |
||||
self.content:SetPoint("TOPLEFT",self.settings.padding[1],-self.settings.padding[3]) |
||||
self.content:SetPoint("BOTTOMRIGHT",-self.settings.padding[2],self.settings.padding[4]) |
||||
end, |
||||
['UpdateSize'] = function(self) |
||||
local menuHeight = 0 |
||||
for i=1, #self.children do |
||||
menuHeight = menuHeight + self.children[i].frame:GetHeight() |
||||
end |
||||
self.frame:SetHeight(self.settings.padding[3] + menuHeight + self.settings.padding[4]) |
||||
self.frame:SetWidth(self.settings.padding[1] + self.settings.itemWidth + self.settings.padding[2]) |
||||
end, |
||||
['BuildMenu'] = function(self, menuData) |
||||
if menuData then self.settings.menuData = menuData else menuData = self.settings.menuData end |
||||
if not menuData then return end |
||||
-- reset menu |
||||
self:ReleaseChildren() |
||||
self:SetWidth(1) |
||||
-- set menu properties |
||||
for key in pairs(menuData) do |
||||
if menuData[key].check then self.settings.check = true end |
||||
if menuData[key].menuData then self.settings.arrow = true end |
||||
end |
||||
-- create menuItems |
||||
local sortedTable = sortTable(menuData) |
||||
for i = 1, #sortedTable do |
||||
local menuItem = DiesalGUI:Create('MenuItem') |
||||
self:AddChild(menuItem) |
||||
menuItem:SetParentObject(self) |
||||
menuItem:SetSettings({ |
||||
itemData = menuData[sortedTable[i][2]], |
||||
position = i, |
||||
},true) |
||||
end |
||||
|
||||
self:UpdateSize() |
||||
return true |
||||
end, |
||||
} |
||||
-- | Constructor |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local function Constructor() |
||||
local self = DiesalGUI:CreateObjectBase(Type) |
||||
local frame = CreateFrame('Frame',nil,UIParent) |
||||
self.frame = frame |
||||
self.defaults = { |
||||
itemWidth = 0, |
||||
padding = {4,4,8,8}, |
||||
} |
||||
-- ~~ Construct ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
frame:SetClampedToScreen( true ) |
||||
frame:SetScript('OnEnter', function(this) DiesalMenu:StopCloseTimer() end) |
||||
frame:SetScript('OnLeave', function(this) DiesalMenu:StartCloseTimer() end) |
||||
|
||||
self:CreateRegion("Frame", 'content', frame) |
||||
-- ~~ Methods ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
for method, func in pairs(methods) do self[method] = func end |
||||
-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
return self |
||||
end |
||||
DiesalGUI:RegisterObjectConstructor(Type,Constructor,Version) |
@ -1,157 +0,0 @@ |
||||
-- $Id: MenuItem.lua 60 2016-11-04 01:34:23Z diesal2010 $ |
||||
local DiesalMenu = LibStub('DiesalMenu-1.0') |
||||
-- ~~| Libraries |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local DiesalTools = LibStub('DiesalTools-1.0') |
||||
local DiesalStyle = LibStub("DiesalStyle-1.0") |
||||
local DiesalGUI = LibStub('DiesalGUI-1.0') |
||||
local DiesalStyle = LibStub("DiesalStyle-1.0") |
||||
-- ~~| Diesal Upvalues |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local Colors = DiesalStyle.Colors |
||||
local HSL, ShadeColor, TintColor = DiesalTools.HSL, DiesalTools.ShadeColor, DiesalTools.TintColor |
||||
-- | Lua Upvalues |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
-- | WoW Upvalues |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
-- | MenuItem |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local Type = 'MenuItem' |
||||
local Version = 2 |
||||
-- | Stylesheets |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local Stylesheet = { |
||||
['frame-hover'] = { |
||||
type = 'texture', |
||||
layer = 'HIGHLIGHT', |
||||
color = Colors.UI_1000, |
||||
alpha = .1, |
||||
}, |
||||
['text-color'] = { |
||||
type = 'Font', |
||||
color = 'cbcbcb', |
||||
}, |
||||
} |
||||
-- | Locals |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
|
||||
-- | Methods |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local methods = { |
||||
['OnAcquire'] = function(self) |
||||
self:ApplySettings() |
||||
self:SetStylesheet(Stylesheet) |
||||
-- self:SetStylesheet(wireFrame) |
||||
self:Show() |
||||
end, |
||||
['OnRelease'] = function(self) |
||||
|
||||
end, |
||||
['ApplySettings'] = function(self) |
||||
if not self.settings.itemData then return false end |
||||
|
||||
local settings = self.settings |
||||
local menuSettings= settings.parentObject.settings |
||||
local itemData = settings.itemData |
||||
local text = self.text |
||||
local check = self.check |
||||
local arrow = self.arrow |
||||
|
||||
local checkWidth = menuSettings.check and settings.checkWidth or settings.textPadLeft |
||||
local arrowWidth = menuSettings.arrow and settings.arrowWidth or settings.textPadRight |
||||
local textWidthMax = settings.widthMax - arrowWidth - checkWidth |
||||
|
||||
if settings.position == 1 then |
||||
self:SetPoint('TOPLEFT') |
||||
self:SetPoint('RIGHT') |
||||
else |
||||
self:SetPoint('TOPLEFT',settings.parentObject.children[settings.position-1].frame,'BOTTOMLEFT',0,0) |
||||
self:SetPoint('RIGHT') |
||||
end |
||||
|
||||
if itemData.type == 'spacer' then |
||||
self.frame:EnableMouse(false) |
||||
self:SetHeight(settings.spacerHeight) |
||||
else |
||||
self.frame:EnableMouse(true) |
||||
self:SetHeight(settings.height) |
||||
end |
||||
|
||||
self:SetText(itemData.name) |
||||
text:SetPoint("LEFT",checkWidth, 0) |
||||
text:SetPoint("RIGHT",-arrowWidth, 0) |
||||
|
||||
arrow[menuSettings.arrow and itemData.menuData and "Show" or "Hide"](arrow) |
||||
check[menuSettings.check and itemData.check and itemData.check() and "Show" or "Hide"](check) |
||||
|
||||
local textWidth = DiesalTools.Round(text:GetStringWidth()) + 10 |
||||
local itemWidth = checkWidth + textWidth + arrowWidth |
||||
|
||||
menuSettings.itemWidth = min(max(menuSettings.itemWidth,itemWidth),settings.widthMax) |
||||
end, |
||||
['SetText'] = function(self,text) |
||||
self.text:SetText(text or '') |
||||
end, |
||||
['OnClick'] = function(self) |
||||
local onClick = self.settings.itemData.onClick |
||||
if onClick then onClick() end |
||||
end, |
||||
['OnEnter'] = function(self) |
||||
DiesalMenu:StopCloseTimer() |
||||
local menuChildren = self.settings.parentObject.children |
||||
local menuData = self.settings.itemData.menuData |
||||
for i=1, #menuChildren do menuChildren[i]:ReleaseChildren() end |
||||
self:BuildSubMenu(menuData) |
||||
end, |
||||
['BuildSubMenu'] = function(self,menuData) |
||||
if not menuData then return end |
||||
local subMenu = DiesalGUI:Create('Menu') |
||||
if not subMenu:BuildMenu(menuData) then DiesalGUI:Release(subMenu) return end |
||||
self:AddChild(subMenu) |
||||
subMenu:SetParent(self.frame) |
||||
subMenu:ClearAllPoints() |
||||
subMenu:SetPoint('TOPLEFT',self.frame,'TOPRIGHT',0,0) |
||||
subMenu:Show() |
||||
end, |
||||
} |
||||
-- | Constructor |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local function Constructor() |
||||
local self = DiesalGUI:CreateObjectBase(Type) |
||||
local frame = CreateFrame('Button',nil,UIParent) |
||||
self.frame = frame |
||||
-- ~~ Default Settings ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
self.defaults = { |
||||
widthMax = 250, |
||||
height = 16, |
||||
spacerHeight = 5, |
||||
checkWidth = 14, |
||||
arrowWidth = 14, |
||||
textPadLeft = 2, |
||||
textPadRight = 2, |
||||
} |
||||
-- ~~ Events ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
-- OnAcquire, OnRelease, OnHeightSet, OnWidthSet |
||||
-- ~~ Construct ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
frame:SetScript("OnClick", function(this,button) DiesalGUI:OnMouse(this,button); self:OnClick() end) |
||||
frame:SetScript('OnEnter', function(this) self:OnEnter() end) |
||||
frame:SetScript('OnLeave', function(this) DiesalMenu:StartCloseTimer() end) |
||||
|
||||
local text = self:CreateRegion("FontString", 'text', frame) |
||||
text:SetPoint("TOP",0,-2) |
||||
text:SetPoint("BOTTOM",0,0) |
||||
text:SetJustifyH("TOP") |
||||
text:SetJustifyH("LEFT") |
||||
text:SetWordWrap(false) |
||||
|
||||
local check = self:CreateRegion("Texture", 'check', frame) |
||||
DiesalStyle:StyleTexture(check,{ |
||||
position = {1,nil,0,nil}, |
||||
height = 16, |
||||
width = 16, |
||||
image = {'DiesalGUIcons', {10,5,16,256,128},'FFFF00'}, |
||||
}) |
||||
local arrow = self:CreateRegion("Texture", 'arrow', frame) |
||||
DiesalStyle:StyleTexture(arrow,{ |
||||
position = {nil,2,-1,nil}, |
||||
height = 16, |
||||
width = 16, |
||||
image = {'DiesalGUIcons', {7,5,16,256,128},'FFFF00'}, |
||||
}) |
||||
-- ~~ Methods ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
for method, func in pairs(methods) do self[method] = func end |
||||
-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
return self |
||||
end |
||||
DiesalGUI:RegisterObjectConstructor(Type,Constructor,Version) |
@ -0,0 +1,93 @@ |
||||
local MAJOR, MINOR = "DiesalMenu-2.0", 1 |
||||
---@alias Diesal.Menu DiesalMenu-2.0 |
||||
|
||||
---@class DiesalMenu-2.0 |
||||
local DiesalMenu = LibStub:NewLibrary(MAJOR, MINOR) |
||||
|
||||
if not DiesalMenu then |
||||
return |
||||
end -- No Upgrade needed. |
||||
|
||||
---@type Diesal.Tools |
||||
local DiesalTools = LibStub("DiesalTools-2.0") |
||||
---@type Diesal.Style |
||||
local DiesalStyle = LibStub("DiesalStyle-2.0") |
||||
---@type Diesal.GUI |
||||
local DiesalGUI = LibStub("DiesalGUI-2.0") |
||||
|
||||
local type, select, tonumber = type, select, tonumber |
||||
local setmetatable, getmetatable, next = setmetatable, getmetatable, next |
||||
local sub, format, lower, upper, match = string.sub, string.format, string.lower, string.upper, string.match |
||||
local pairs, ipairs = pairs, ipairs |
||||
local tinsert, tremove, tconcat, tsort = table.insert, table.remove, table.concat, table.sort |
||||
local floor, ceil, abs, modf = math.floor, math.ceil, math.abs, math.modf |
||||
|
||||
local CreateFrame, UIParent = CreateFrame, UIParent |
||||
|
||||
---@type Diesal.Menu.Menu |
||||
local MENU |
||||
local CLOSEDELAY = 2 |
||||
|
||||
---@class Diesal.Menu.CloseTimer : Frame |
||||
---@field closeDelay number |
||||
local closeTimer = CreateFrame("Frame") |
||||
closeTimer:Hide() |
||||
|
||||
---@param this Diesal.Menu.CloseTimer |
||||
---@param elapsed number |
||||
closeTimer:SetScript("OnUpdate", function(this, elapsed) |
||||
if this.count < 0 then |
||||
DiesalMenu:Close() |
||||
this:Hide() |
||||
else |
||||
this.count = this.count - elapsed |
||||
end |
||||
end) |
||||
|
||||
---@param menuData any |
||||
---@param anchor any |
||||
---@param x number |
||||
---@param y number |
||||
---@param closeDelay number |
||||
function DiesalMenu:Menu(menuData, anchor, x, y, closeDelay) |
||||
MENU = MENU or DiesalGUI:Create("DiesalMenu") |
||||
MENU:ResetSettings() |
||||
if not MENU:BuildMenu(menuData) then |
||||
MENU:Hide() |
||||
return |
||||
end |
||||
MENU:Show() |
||||
MENU:ClearAllPoints() |
||||
MENU:SetPoint("TOPLEFT", anchor, "TOPLEFT", x, y) |
||||
closeTimer.closeDelay = closeDelay or CLOSEDELAY |
||||
DiesalMenu:StartCloseTimer() |
||||
DiesalMenu:SetFocus() |
||||
end |
||||
|
||||
function DiesalMenu:Close() |
||||
DiesalMenu:StopCloseTimer() |
||||
if not MENU or not MENU:IsVisible() then |
||||
return |
||||
end |
||||
MENU:ResetSettings() |
||||
MENU:ReleaseChildren() |
||||
MENU:Hide() |
||||
MENU:ClearAllPoints() |
||||
end |
||||
|
||||
function DiesalMenu:StartCloseTimer() |
||||
closeTimer.count = closeTimer.closeDelay |
||||
closeTimer:Show() |
||||
end |
||||
|
||||
function DiesalMenu:StopCloseTimer() |
||||
closeTimer:Hide() |
||||
end |
||||
|
||||
function DiesalMenu:ClearFocus() |
||||
DiesalMenu:Close() |
||||
end |
||||
|
||||
function DiesalMenu:SetFocus() |
||||
DiesalGUI:SetFocus(DiesalMenu) |
||||
end |
@ -0,0 +1,7 @@ |
||||
<Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
||||
xsi:schemaLocation="http://www.blizzard.com/wow/ui/..\FrameXML\UI.xsd"> |
||||
<Script file="DiesalMenu-2.0.lua" /> |
||||
<!-- Objects --> |
||||
<Script file="Objects\Menu.lua" /> |
||||
<Script file="Objects\MenuItem.lua" /> |
||||
</Ui> |
@ -0,0 +1,151 @@ |
||||
---@type Diesal.Menu |
||||
local DiesalMenu = LibStub("DiesalMenu-2.0") |
||||
-- ~~| Libraries |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
---@type Diesal.GUI |
||||
local DiesalGUI = LibStub("DiesalGUI-2.0") |
||||
---@type Diesal.Tools |
||||
local DiesalTools = LibStub("DiesalTools-2.0") |
||||
---@type Diesal.Style |
||||
local DiesalStyle = LibStub("DiesalStyle-2.0") |
||||
-- ~~| Diesal Upvalues |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local Colors = DiesalStyle.Colors |
||||
local HSL, ShadeColor, TintColor = DiesalTools.HSL, DiesalTools.ShadeColor, DiesalTools.TintColor |
||||
-- | Lua Upvalues |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local ipairs, pairs, table_sort = ipairs, pairs, table.sort |
||||
-- | WoW Upvalues |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
-- | Menu |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local Type = "DiesalMenu" |
||||
local Version = 2 |
||||
-- | Stylesheets |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local Stylesheet = { |
||||
["frame-background"] = { |
||||
type = "texture", |
||||
layer = "BACKGROUND", |
||||
color = Colors.UI_100, |
||||
alpha = 0.95, |
||||
}, |
||||
["frame-inline"] = { |
||||
type = "outline", |
||||
layer = "BORDER", |
||||
color = "ffffff", |
||||
alpha = 0.02, |
||||
position = -1, |
||||
}, |
||||
["frame-shadow"] = { |
||||
type = "shadow", |
||||
}, |
||||
} |
||||
local wireFrame = { |
||||
["frame-white"] = { |
||||
type = "outline", |
||||
layer = "OVERLAY", |
||||
color = "ffffff", |
||||
}, |
||||
["content-yellow"] = { |
||||
type = "outline", |
||||
layer = "OVERLAY", |
||||
color = "fffc00", |
||||
}, |
||||
} |
||||
-- | Locals |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local function compare(a, b) |
||||
return a[1] < b[1] |
||||
end |
||||
local function sortTable(t) |
||||
local st = {} |
||||
for key, val in pairs(t) do |
||||
st[#st + 1] = { val.order, key } |
||||
end |
||||
table_sort(st, compare) |
||||
return st |
||||
end |
||||
-- | Methods |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
---@class Diesal.Menu.Menu.Methods |
||||
local methods = { |
||||
["OnAcquire"] = function(self) |
||||
self.frame:SetFrameStrata("FULLSCREEN_DIALOG") |
||||
self:ApplySettings() |
||||
self:SetStylesheet(Stylesheet) |
||||
-- self:SetStylesheet(wireFrame) |
||||
end, |
||||
["OnRelease"] = function(self) end, |
||||
["ApplySettings"] = function(self) |
||||
self:UpdatePosition() |
||||
end, |
||||
["UpdatePosition"] = function(self) |
||||
self.content:SetPoint("TOPLEFT", self.settings.padding[1], -self.settings.padding[3]) |
||||
self.content:SetPoint("BOTTOMRIGHT", -self.settings.padding[2], self.settings.padding[4]) |
||||
end, |
||||
["UpdateSize"] = function(self) |
||||
local menuHeight = 0 |
||||
for i = 1, #self.children do |
||||
menuHeight = menuHeight + self.children[i].frame:GetHeight() |
||||
end |
||||
self.frame:SetHeight(self.settings.padding[3] + menuHeight + self.settings.padding[4]) |
||||
self.frame:SetWidth(self.settings.padding[1] + self.settings.itemWidth + self.settings.padding[2]) |
||||
end, |
||||
["BuildMenu"] = function(self, menuData) |
||||
if menuData then |
||||
self.settings.menuData = menuData |
||||
else |
||||
menuData = self.settings.menuData |
||||
end |
||||
if not menuData then |
||||
return |
||||
end |
||||
-- reset menu |
||||
self:ReleaseChildren() |
||||
self:SetWidth(1) |
||||
-- set menu properties |
||||
for key in pairs(menuData) do |
||||
if menuData[key].check then |
||||
self.settings.check = true |
||||
end |
||||
if menuData[key].menuData then |
||||
self.settings.arrow = true |
||||
end |
||||
end |
||||
-- create menuItems |
||||
local sortedTable = sortTable(menuData) |
||||
for i = 1, #sortedTable do |
||||
local menuItem = DiesalGUI:Create("DiesalMenuItem") |
||||
self:AddChild(menuItem) |
||||
menuItem:SetParentObject(self) |
||||
menuItem:SetSettings({ |
||||
itemData = menuData[sortedTable[i][2]], |
||||
position = i, |
||||
}, true) |
||||
end |
||||
|
||||
self:UpdateSize() |
||||
return true |
||||
end, |
||||
} |
||||
-- | Constructor |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local function Constructor() |
||||
---@class Diesal.Menu.Menu : Diesal.GUI.ObjectBase, Diesal.Menu.Menu.Methods |
||||
local self = DiesalGUI:Create(Type, true) |
||||
local frame = CreateFrame("Frame", nil, UIParent) |
||||
self.frame = frame |
||||
self.defaults = { |
||||
itemWidth = 0, |
||||
padding = { 4, 4, 8, 8 }, |
||||
} |
||||
-- ~~ Construct ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
frame:SetClampedToScreen(true) |
||||
frame:SetScript("OnEnter", function(this) |
||||
DiesalMenu:StopCloseTimer() |
||||
end) |
||||
frame:SetScript("OnLeave", function(this) |
||||
DiesalMenu:StartCloseTimer() |
||||
end) |
||||
|
||||
self:CreateRegion("Frame", "content", frame) |
||||
-- ~~ Methods ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
for method, func in pairs(methods) do |
||||
self[method] = func |
||||
end |
||||
-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
return self |
||||
end |
||||
DiesalGUI:RegisterObjectConstructor(Type, Constructor, Version) |
@ -0,0 +1,184 @@ |
||||
---@type Diesal.Menu |
||||
local DiesalMenu = LibStub("DiesalMenu-2.0") |
||||
|
||||
-- ~~| Libraries |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
---@type Diesal.Tools |
||||
local DiesalTools = LibStub("DiesalTools-2.0") |
||||
---@type Diesal.Style |
||||
local DiesalStyle = LibStub("DiesalStyle-2.0") |
||||
---@type Diesal.GUI |
||||
local DiesalGUI = LibStub("DiesalGUI-2.0") |
||||
|
||||
-- ~~| Diesal Upvalues |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local Colors = DiesalStyle.Colors |
||||
local HSL, ShadeColor, TintColor = DiesalTools.HSL, DiesalTools.ShadeColor, DiesalTools.TintColor |
||||
-- | Lua Upvalues |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
-- | WoW Upvalues |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
-- | MenuItem |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local Type = "DiesalMenuItem" |
||||
local Version = 2 |
||||
-- | Stylesheets |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local Stylesheet = { |
||||
["frame-hover"] = { |
||||
type = "texture", |
||||
layer = "HIGHLIGHT", |
||||
color = Colors.UI_1000, |
||||
alpha = 0.1, |
||||
}, |
||||
["text-color"] = { |
||||
type = "Font", |
||||
color = "cbcbcb", |
||||
}, |
||||
} |
||||
-- | Locals |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
|
||||
-- | Methods |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
---@class Diesal.Menu.MenuItem |
||||
local methods = { |
||||
["OnAcquire"] = function(self) |
||||
self:ApplySettings() |
||||
self:SetStylesheet(Stylesheet) |
||||
-- self:SetStylesheet(wireFrame) |
||||
self:Show() |
||||
end, |
||||
["OnRelease"] = function(self) end, |
||||
["ApplySettings"] = function(self) |
||||
if not self.settings.itemData then |
||||
return false |
||||
end |
||||
|
||||
local settings = self.settings |
||||
local menuSettings = settings.parentObject.settings |
||||
local itemData = settings.itemData |
||||
local text = self.text |
||||
local check = self.check |
||||
local arrow = self.arrow |
||||
|
||||
local checkWidth = menuSettings.check and settings.checkWidth or settings.textPadLeft |
||||
local arrowWidth = menuSettings.arrow and settings.arrowWidth or settings.textPadRight |
||||
local textWidthMax = settings.widthMax - arrowWidth - checkWidth |
||||
|
||||
if settings.position == 1 then |
||||
self:SetPoint("TOPLEFT") |
||||
self:SetPoint("RIGHT") |
||||
else |
||||
self:SetPoint("TOPLEFT", settings.parentObject.children[settings.position - 1].frame, "BOTTOMLEFT", 0, 0) |
||||
self:SetPoint("RIGHT") |
||||
end |
||||
|
||||
if itemData.type == "spacer" then |
||||
self.frame:EnableMouse(false) |
||||
self:SetHeight(settings.spacerHeight) |
||||
else |
||||
self.frame:EnableMouse(true) |
||||
self:SetHeight(settings.height) |
||||
end |
||||
|
||||
self:SetText(itemData.name) |
||||
text:SetPoint("LEFT", checkWidth, 0) |
||||
text:SetPoint("RIGHT", -arrowWidth, 0) |
||||
|
||||
arrow[menuSettings.arrow and itemData.menuData and "Show" or "Hide"](arrow) |
||||
check[menuSettings.check and itemData.check and itemData.check() and "Show" or "Hide"](check) |
||||
|
||||
local textWidth = DiesalTools.Round(text:GetStringWidth()) + 10 |
||||
local itemWidth = checkWidth + textWidth + arrowWidth |
||||
|
||||
menuSettings.itemWidth = min(max(menuSettings.itemWidth, itemWidth), settings.widthMax) |
||||
end, |
||||
["SetText"] = function(self, text) |
||||
self.text:SetText(text or "") |
||||
end, |
||||
["OnClick"] = function(self) |
||||
local onClick = self.settings.itemData.onClick |
||||
if onClick then |
||||
onClick() |
||||
end |
||||
end, |
||||
["OnEnter"] = function(self) |
||||
DiesalMenu:StopCloseTimer() |
||||
local menuChildren = self.settings.parentObject.children |
||||
local menuData = self.settings.itemData.menuData |
||||
for i = 1, #menuChildren do |
||||
menuChildren[i]:ReleaseChildren() |
||||
end |
||||
self:BuildSubMenu(menuData) |
||||
end, |
||||
["BuildSubMenu"] = function(self, menuData) |
||||
if not menuData then |
||||
return |
||||
end |
||||
local subMenu = DiesalGUI:Create("DiesalMenu") --[[ @as Diesal.Menu.Menu ]] |
||||
if not subMenu:BuildMenu(menuData) then |
||||
DiesalGUI:Release(subMenu) |
||||
return |
||||
end |
||||
self:AddChild(subMenu) |
||||
subMenu:SetParent(self.frame) |
||||
subMenu:ClearAllPoints() |
||||
subMenu:SetPoint("TOPLEFT", self.frame, "TOPRIGHT", 0, 0) |
||||
subMenu:Show() |
||||
end, |
||||
} |
||||
-- | Constructor |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local function Constructor() |
||||
---@class Diesal.Menu.MenuItem : Diesal.GUI.ObjectBase |
||||
---@field text FontString |
||||
---@field check Texture |
||||
---@field arrow Texture |
||||
local self = DiesalGUI:Create(Type, true) |
||||
local frame = CreateFrame("Button", nil, UIParent) |
||||
self.frame = frame |
||||
-- ~~ Default Settings ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
self.defaults = { |
||||
widthMax = 250, |
||||
height = 16, |
||||
spacerHeight = 5, |
||||
checkWidth = 14, |
||||
arrowWidth = 14, |
||||
textPadLeft = 2, |
||||
textPadRight = 2, |
||||
} |
||||
-- ~~ Events ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
-- OnAcquire, OnRelease, OnHeightSet, OnWidthSet |
||||
-- ~~ Construct ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
frame:SetScript("OnClick", function(this, button) |
||||
DiesalGUI:OnMouse(this, button) |
||||
self:OnClick() |
||||
end) |
||||
frame:SetScript("OnEnter", function(this) |
||||
self:OnEnter() |
||||
end) |
||||
frame:SetScript("OnLeave", function(this) |
||||
DiesalMenu:StartCloseTimer() |
||||
end) |
||||
|
||||
local text = self:CreateRegion("FontString", "text", frame) |
||||
text:SetPoint("TOP", 0, -2) |
||||
text:SetPoint("BOTTOM", 0, 0) |
||||
text:SetJustifyH("TOP") |
||||
text:SetJustifyH("LEFT") |
||||
text:SetWordWrap(false) |
||||
|
||||
local check = self:CreateRegion("Texture", "check", frame) |
||||
DiesalStyle:StyleTexture(check, { |
||||
position = { 1, nil, 0, nil }, |
||||
height = 16, |
||||
width = 16, |
||||
image = { "DiesalGUIcons", { 10, 5, 16, 256, 128 }, "FFFF00" }, |
||||
}) |
||||
local arrow = self:CreateRegion("Texture", "arrow", frame) |
||||
DiesalStyle:StyleTexture(arrow, { |
||||
position = { nil, 2, -1, nil }, |
||||
height = 16, |
||||
width = 16, |
||||
image = { "DiesalGUIcons", { 7, 5, 16, 256, 128 }, "FFFF00" }, |
||||
}) |
||||
-- ~~ Methods ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
for method, func in pairs(methods) do |
||||
self[method] = func |
||||
end |
||||
-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
return self |
||||
end |
||||
DiesalGUI:RegisterObjectConstructor(Type, Constructor, Version) |
Before Width: | Height: | Size: 256 KiB After Width: | Height: | Size: 256 KiB |
Before Width: | Height: | Size: 128 KiB After Width: | Height: | Size: 128 KiB |
Before Width: | Height: | Size: 256 KiB After Width: | Height: | Size: 256 KiB |
Before Width: | Height: | Size: 256 KiB After Width: | Height: | Size: 256 KiB |
Before Width: | Height: | Size: 32 KiB After Width: | Height: | Size: 32 KiB |
Before Width: | Height: | Size: 32 KiB After Width: | Height: | Size: 32 KiB |
@ -1,515 +0,0 @@ |
||||
-- $Id: DiesalTools-1.0.lua 61 2017-03-28 23:13:41Z diesal2010 $ |
||||
local MAJOR, MINOR = "DiesalTools-1.0", "$Rev: 61 $" |
||||
local DiesalTools, oldminor = LibStub:NewLibrary(MAJOR, MINOR) |
||||
if not DiesalTools then return end -- No Upgrade needed. |
||||
-- ~~| Libraries |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
-- ~~| Lua Upvalues |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local type, select, pairs, tonumber, tostring = type, select, pairs, tonumber, tostring |
||||
local table_concat = table.concat |
||||
local setmetatable, getmetatable, next = setmetatable, getmetatable, next |
||||
local sub, format, lower, upper,gsub = string.sub, string.format, string.lower, string.upper, string.gsub |
||||
local floor, ceil, abs, modf = math.floor, math.ceil, math.abs, math.modf |
||||
-- ~~| WoW Upvalues |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local CreateFrame, UIParent, GetCursorPosition = CreateFrame, UIParent, GetCursorPosition |
||||
local GetScreenWidth, GetScreenHeight = GetScreenWidth, GetScreenHeight |
||||
-- ~~| Locals |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local escapeSequences = { |
||||
[ "\a" ] = "\\a", -- Bell |
||||
[ "\b" ] = "\\b", -- Backspace |
||||
[ "\t" ] = "\\t", -- Horizontal tab |
||||
[ "\n" ] = "\\n", -- Newline |
||||
[ "\v" ] = "\\v", -- Vertical tab |
||||
[ "\f" ] = "\\f", -- Form feed |
||||
[ "\r" ] = "\\r", -- Carriage return |
||||
[ "\\" ] = "\\\\", -- Backslash |
||||
[ "\"" ] = "\\\"", -- Quotation mark |
||||
[ "|" ] = "||", |
||||
} |
||||
local lua_keywords = { |
||||
["and"] = true, ["break"] = true, ["do"] = true, |
||||
["else"] = true, ["elseif"] = true, ["end"] = true, |
||||
["false"] = true, ["for"] = true, ["function"] = true, |
||||
["if"] = true, ["in"] = true, ["local"] = true, |
||||
["nil"] = true, ["not"] = true, ["or"] = true, |
||||
["repeat"] = true, ["return"] = true, ["then"] = true, |
||||
["true"] = true, ["until"] = true, ["while"] = true |
||||
} |
||||
local sub_table = { |
||||
|
||||
} |
||||
local colors = { |
||||
blue = '|cff'..'00aaff', |
||||
darkblue = '|cff'..'004466', |
||||
orange = '|cff'..'ffaa00', |
||||
darkorange = '|cff'..'4c3300', |
||||
grey = '|cff'..'7f7f7f', |
||||
darkgrey = '|cff'..'414141', |
||||
white = '|cff'..'ffffff', |
||||
red = '|cff'..'ff0000', |
||||
green = '|cff'..'00ff2b', |
||||
yellow = '|cff'..'ffff00', |
||||
lightyellow = '|cff'..'ffea7f', |
||||
} |
||||
|
||||
local formattedArgs = {} |
||||
|
||||
local function GetCaller(level) |
||||
-- ADDON:LogMessage(debugstack(10,2, 0)) |
||||
for trace in debugstack(level,2, 0):gmatch("(.-)\n") do |
||||
-- Blizzard Sandbox |
||||
local match, _, file, line = trace:find("^.*\\(.-):(%d+)") |
||||
if match then return format('%s[%s%s: %s%s%s]|r',colors.orange,colors.yellow,file,colors.lightyellow,line,colors.orange) end |
||||
-- PQI DataFile |
||||
local match, _, file,line = trace:find('^%[string "[%s%-]*(.-%.lua).-"%]:(%d+)') |
||||
if match then return format('%s[%s%s: %s%s%s]|r',colors.orange,colors.yellow,file,colors.lightyellow,line,colors.orange) end |
||||
-- PQR Ability code |
||||
local match, _, file,line = trace:find('^%[string "(.-)"%]:(%d+)') |
||||
if match then return format('%s[%s%s: %s%s%s]|r',colors.orange,colors.yellow,file,colors.lightyellow,line,colors.orange) end |
||||
end |
||||
return format('%s[%sUnknown Caller%s]|r',colors.orange,colors.red,colors.orange) |
||||
end |
||||
local function round(number, base) |
||||
base = base or 1 |
||||
return floor((number + base/2)/base) * base |
||||
end |
||||
local function getRGBColorValues(color,g,b) |
||||
if type(color) == 'number' and type(g) == 'number' and type(b) == 'number' then |
||||
if color <= 1 and g <= 1 and b <= 1 then |
||||
return round(color*255), round(g*255), round(b*255) |
||||
end |
||||
return color[1], color[2], color[3] |
||||
elseif type(color) == 'table' and type(color[1]) == 'number' and type(color[2]) == 'number' and type(color[3]) == 'number' then |
||||
if color[1] <= 1 and color[2] <= 1 and color[3] <= 1 then |
||||
return round(color[1]*255), round(color[2]*255), round(color[3]*255) |
||||
end |
||||
return color[1], color[2], color[3] |
||||
elseif type(color) == 'string' then |
||||
return tonumber(sub(color, 1, 2),16), tonumber(sub(color, 3, 4),16), tonumber(sub(color, 5, 6),16) |
||||
end |
||||
end |
||||
|
||||
|
||||
function DiesalTools.GetColor(value) |
||||
if not value then return end |
||||
|
||||
if type(value) == 'table' and #value >= 3 then |
||||
return value[1]/255, value[2]/255, value[3]/255 |
||||
elseif type(value) == 'string' then |
||||
return tonumber(sub(value,1,2),16)/255, tonumber(sub(value,3,4),16)/255, tonumber(sub(value,5,6),16)/255 |
||||
end |
||||
end |
||||
|
||||
-- ~~| API |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
function DiesalTools.Stack() |
||||
print("|r------------------------------| Stack Trace |-------------------------------") |
||||
local stack = debugstack(1,12, 0) |
||||
for trace in stack:gmatch("(.-)\n") do |
||||
match, _, file, line, func = trace:find("^.*\\(.-):(%d+).-`(.*)'$") |
||||
if match then print(format("%s[%s%s: %s%s%s] %sfunction|r %s|r",colors.orange,colors.yellow,file,colors.lightyellow,line,colors.orange,colors.blue,func)) end |
||||
end |
||||
print("|r--------------------------------------------------------------------------------") |
||||
end |
||||
--[[ copy = TableCopy(src, dest, metatable) |
||||
@Arguments: |
||||
dest Table to copy to |
||||
src Table to copy |
||||
metatable if true copies the metatable as well (boolean) |
||||
@Returns: |
||||
table copy of table |
||||
--]] |
||||
function DiesalTools.TableCopy(src,dest,metatable) |
||||
if type(src) == 'table' then |
||||
if not dest then dest = {} end |
||||
for sk, sv in next, src, nil do |
||||
dest[DiesalTools.TableCopy(sk)] = DiesalTools.TableCopy(sv) |
||||
end |
||||
if metatable then setmetatable(dest, DiesalTools.TableCopy(getmetatable(src))) end |
||||
else -- number, string, boolean, etc |
||||
dest = src |
||||
end |
||||
return dest |
||||
end |
||||
--[[ red, blue, green = GetColor(value) |
||||
@Arguments: |
||||
value Hex color code or a table contating R,G,B color values |
||||
@Returns: |
||||
red Red component of color (0-1) (number) |
||||
green Green component of color(0-1) (number) |
||||
blue Blue component of color (0-1) (number) |
||||
-- ]] |
||||
|
||||
|
||||
-- | Color Tools |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
|
||||
-- converts a color from RGB[0-1], RGB[0-255], HEX or HSL to RGB[0-1], RGB[0-255] or HEX |
||||
function DiesalTools.ConvertColor(from,to,v1,v2,v3) |
||||
if not from or not to or not v1 then return end |
||||
if type(v1) == 'table' then v1,v2,v3 = v1[1],v1[2],v1[3] end |
||||
local r, g, b |
||||
from, to = from:lower(), to:lower() |
||||
|
||||
if from == 'rgb255' and type(v1) == 'number' and type(v2) == 'number' and type(v3) == 'number' then |
||||
r,g,b = v1, v2, v3 |
||||
elseif from == 'rgb1' and type(v1) == 'number' and type(v2) == 'number' and type(v3) == 'number' then |
||||
r,g,b = round(v1*255), round(v2*255), round(v3*255) |
||||
elseif from == 'hex' and type(v1) == 'string' and #v1 > 5 then |
||||
r,g,b = tonumber(sub(v1, 1, 2),16), tonumber(sub(v1, 3, 4),16), tonumber(sub(v1, 5, 6),16) |
||||
elseif from == 'hsl' and type(v1) == 'number' and type(v2) == 'number' and type(v3) == 'number' then |
||||
if v2 == 0 then |
||||
v3 = round(v3 * 255) |
||||
r,g,b = v3,v3,v3 |
||||
else |
||||
v1, v2, v3 = v1/360*6, min(max(0, v2), 1), min(max(0, v3), 1) |
||||
local c = (1-abs(2*v3-1))*v2 |
||||
local x = (1-abs(v1%2-1))*c |
||||
local m = (v3-.5*c) |
||||
r,g,b = 0,0,0 |
||||
if v1 < 1 then r,g,b = c,x,0 |
||||
elseif v1 < 2 then r,g,b = x,c,0 |
||||
elseif v1 < 3 then r,g,b = 0,c,x |
||||
elseif v1 < 4 then r,g,b = 0,x,c |
||||
elseif v1 < 5 then r,g,b = x,0,c |
||||
else r,g,b = c,0,x end |
||||
|
||||
r,g,b = round((r+m)*255),round((g+m)*255),round((b+m)*255) |
||||
end |
||||
else |
||||
return |
||||
end |
||||
r,g,b = min(255,max(0,r)), min(255,max(0,g)), min(255,max(0,b)) |
||||
|
||||
if to == 'rgb255' then |
||||
return r,g,b |
||||
elseif to == 'rgb1' then |
||||
return r/255,g/255,b/255 |
||||
elseif to == 'hex' then |
||||
return format("%02x%02x%02x",r,g,b) |
||||
end |
||||
end |
||||
-- Mixes a color with pure white to produce a lighter color |
||||
function DiesalTools.TintColor(color, percent, to, from) |
||||
percent = min(1,max(0,percent)) |
||||
from, to = from or 'hex', to and to:lower() or 'hex' |
||||
local r,g,b = DiesalTools.ConvertColor(from,'rgb255',color) |
||||
|
||||
if to == 'rgb255' then |
||||
return round((255-r)*percent+r), round((255-g)*percent+g), round((255-b)*percent+b) |
||||
elseif to == 'rgb1' then |
||||
return round( ((255-r)*percent+r) / 255 ), round( ((255-g)*percent+g) / 255 ), round( ((255-b)*percent+b) / 255 ) |
||||
elseif to == 'hex' then |
||||
return format("%02x%02x%02x", round((255-r)*percent+r), round((255-g)*percent+g), round((255-b)*percent+b) ) |
||||
end |
||||
-- return format("%02x%02x%02x", round((255-r)*percent+r), round((255-g)*percent+g), round((255-b)*percent+b) ) |
||||
end |
||||
-- Mixes a color with pure black to produce a darker color |
||||
function DiesalTools.ShadeColor(color, percent, to, from) |
||||
percent = min(1,max(0,percent)) |
||||
from, to = from or 'hex', to and to:lower() or 'hex' |
||||
local r,g,b = DiesalTools.ConvertColor(from,'rgb255',color) |
||||
|
||||
if to == 'rgb255' then |
||||
return round(-r*percent+r), round(-g*percent+g), round(-b*percent+b) |
||||
elseif to == 'rgb1' then |
||||
return round( (-r*percent+r) / 255 ), round( (-g*percent+g) / 255 ), round( (-b*percent+b) / 255 ) |
||||
elseif to == 'hex' then |
||||
return format("%02x%02x%02x", round(-r*percent+r), round(-g*percent+g), round(-b*percent+b) ) |
||||
end |
||||
end |
||||
-- Mixes a color with the another color to produce an intermediate color. |
||||
function DiesalTools.MixColors(color1, color2, percent, to, from) |
||||
percent = min(1,max(0,percent)) |
||||
from, to = from or 'hex', to and to:lower() or 'hex' |
||||
-- to = to and to:lower() or 'hex' |
||||
|
||||
local r1, g1, b1 = DiesalTools.ConvertColor(from,'rgb255',color1) |
||||
local r2, g2, b2 = DiesalTools.ConvertColor(from,'rgb255',color2) |
||||
|
||||
if to == 'rgb255' then |
||||
return round((r2-r1)*percent)+r1, round((g2-g1)*percent)+g1, round((b2-b1)*percent)+b1 |
||||
elseif to == 'rgb1' then |
||||
return round( ((r2-r1)*percent+r1) / 255 ), round( ((g2-g1)*percent+g1) / 255 ), round( ((b2-b1)*percent+b1) / 255 ) |
||||
elseif to == 'hex' then |
||||
return format("%02x%02x%02x", round((r2-r1)*percent)+r1, round((g2-g1)*percent)+g1, round((b2-b1)*percent)+b1 ) |
||||
end |
||||
end |
||||
--- converts color HSL to HEX |
||||
function DiesalTools.HSL(v1,v2,v3) |
||||
if not v1 then return end |
||||
if type(v1) == 'table' then v1,v2,v3 = v1[1],v1[2],v1[3] end |
||||
local r, g, b |
||||
|
||||
if v2 == 0 then |
||||
v3 = round(v3 * 255) |
||||
r,g,b = v3,v3,v3 |
||||
else |
||||
v1, v2, v3 = v1/360*6, min(max(0, v2), 1), min(max(0, v3), 1) |
||||
local c = (1-abs(2*v3-1))*v2 |
||||
local x = (1-abs(v1%2-1))*c |
||||
local m = (v3-.5*c) |
||||
r,g,b = 0,0,0 |
||||
if v1 < 1 then r,g,b = c,x,0 |
||||
elseif v1 < 2 then r,g,b = x,c,0 |
||||
elseif v1 < 3 then r,g,b = 0,c,x |
||||
elseif v1 < 4 then r,g,b = 0,x,c |
||||
elseif v1 < 5 then r,g,b = x,0,c |
||||
else r,g,b = c,0,x end |
||||
|
||||
r,g,b = round((r+m)*255),round((g+m)*255),round((b+m)*255) |
||||
end |
||||
|
||||
r,g,b = min(255,max(0,r)), min(255,max(0,g)), min(255,max(0,b)) |
||||
|
||||
return format("%02x%02x%02x",r,g,b) |
||||
end |
||||
|
||||
--[[ GetTxtColor(value) |
||||
@Arguments: |
||||
value Hex color code or a table contating R,G,B color values |
||||
@Returns: |
||||
text coloring escape sequence (|cFFFFFFFF) |
||||
-- ]] |
||||
function DiesalTools.GetTxtColor(value) |
||||
if not value then return end |
||||
|
||||
if type(value) =='table' then value = string.format("%02x%02x%02x", value[1], value[2], value[3]) end |
||||
return format('|cff%s',value) |
||||
end |
||||
|
||||
-- | Texture Tools |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
|
||||
--[[ Get a piece of a texture as a cooridnate refernce |
||||
-- @Param column the column in the texture |
||||
-- @Param row the row in the texture |
||||
-- @Param size the size in the texture |
||||
-- @Param textureWidth total texture width |
||||
-- @Param textureHeight total texture height |
||||
-- @Return edge coordinates for image cropping, plugs directly into Texture:SetTexCoord(left, right, top, bottom) ]] |
||||
function DiesalTools.GetIconCoords(column,row,size,textureWidth,textureHeight) |
||||
size = size or 16 |
||||
textureWidth = textureWidth or 128 |
||||
textureHeight = textureHeight or 16 |
||||
return (column * size - size) / textureWidth, (column * size) / textureWidth, (row * size - size) / textureHeight, (row * size) / textureHeight |
||||
end |
||||
-- | String Tools |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
|
||||
--[[ Capitalize a string |
||||
-- @Param str the string to capatilize |
||||
-- @Return the capitilized string ]] |
||||
function DiesalTools.Capitalize(str) |
||||
return (str:gsub("^%l", upper)) |
||||
end |
||||
--[[ Escape all formatting in a WoW-lua string |
||||
-- @Param str the string to escape |
||||
-- @Return the escaped string ]] |
||||
function DiesalTools.EscapeString(string) |
||||
return string:gsub( "[%z\1-\31\"\\|\127-\255]", escapeSequences ) |
||||
end |
||||
--[[ ID = CreateID(s) |
||||
-- @Param s string to parse |
||||
-- @Return ID string stripped of all non letter characters and color codes.]] |
||||
function DiesalTools.CreateID(s) |
||||
return gsub(s:gsub('c%x%x%x%x%x%x%x%x', ''), '[^%a%d]', '') |
||||
end |
||||
--[[ str = TrimString(s) |
||||
-- @Param s string to parse |
||||
-- @Return str string stripped of leading and trailing spaces.]] |
||||
function DiesalTools.TrimString(s) |
||||
return s:gsub("^%s*(.-)%s*$", "%1") |
||||
end |
||||
--[[ string = SpliceString(string, start, End, txt) |
||||
@Arguments: |
||||
string string to splice |
||||
start starting index of splice |
||||
End ending index of splice |
||||
txt new text to splice in (string) |
||||
@Returns: |
||||
string resulting string of the splice |
||||
|
||||
@example: |
||||
DiesalTools.SpliceString("123456789",2,4,'NEW') -- returns: "1NEW56789" |
||||
--]] |
||||
function DiesalTools.SpliceString(string,start,End,txt) |
||||
return string:sub(1, start-1)..txt..string:sub(End+1,-1) |
||||
end |
||||
--[[ string = Serialize(table) |
||||
@Param table - table to to serialize |
||||
@Return string - serialized table (string) |
||||
|
||||
@deserialization: |
||||
local func,err = loadstring('serialized table') |
||||
if err then error(err) end |
||||
return func() |
||||
]] |
||||
local function serialize_number(number) |
||||
-- no argument checking - called very often |
||||
local text = ("%.17g"):format(number) |
||||
-- on the same platform tostring() and string.format() |
||||
-- return the same results for 1/0, -1/0, 0/0 |
||||
-- so we don't need separate substitution table |
||||
return sub_table[text] or text |
||||
end |
||||
local function impl(t, cat, visited) |
||||
local t_type = type(t) |
||||
if t_type == "table" then |
||||
if not visited[t] then |
||||
visited[t] = true |
||||
|
||||
cat("{") |
||||
-- Serialize numeric indices |
||||
local next_i = 0 |
||||
for i, v in ipairs(t) do |
||||
if i > 1 then -- TODO: Move condition out of the loop |
||||
cat(",") |
||||
end |
||||
impl(v, cat, visited) |
||||
next_i = i |
||||
end |
||||
next_i = next_i + 1 |
||||
-- Serialize hash part |
||||
-- Skipping comma only at first element iff there is no numeric part. |
||||
local need_comma = (next_i > 1) |
||||
for k, v in pairs(t) do |
||||
local k_type = type(k) |
||||
if k_type == "string" then |
||||
if need_comma then |
||||
cat(",") |
||||
end |
||||
need_comma = true |
||||
-- TODO: Need "%q" analogue, which would put quotes |
||||
-- only if string does not match regexp below |
||||
if not lua_keywords[k] and ("^[%a_][%a%d_]*$"):match(k) then |
||||
cat(k) cat("=") |
||||
else |
||||
cat(format("[%q]=", k)) |
||||
end |
||||
impl(v, cat, visited) |
||||
else |
||||
if |
||||
k_type ~= "number" or -- non-string non-number |
||||
k >= next_i or k < 1 or -- integer key in hash part of the table |
||||
k % 1 ~= 0 -- non-integer key |
||||
then |
||||
if need_comma then |
||||
cat(",") |
||||
end |
||||
need_comma = true |
||||
|
||||
cat("[") |
||||
impl(k, cat, visited) |
||||
cat("]=") |
||||
impl(v, cat, visited) |
||||
end |
||||
end |
||||
end |
||||
cat("}") |
||||
visited[t] = nil |
||||
else |
||||
-- this loses information on recursive tables |
||||
cat('"table (recursive)"') |
||||
end |
||||
elseif t_type == "number" then |
||||
cat(serialize_number(t)) |
||||
elseif t_type == "boolean" then |
||||
cat(tostring(t)) |
||||
elseif t == nil then |
||||
cat("nil") |
||||
else |
||||
-- this converts non-serializable (functions) types to strings |
||||
cat(format("%q", tostring(t))) |
||||
end |
||||
end |
||||
local function tstr_cat(cat, t) |
||||
impl(t, cat, {}) |
||||
end |
||||
function DiesalTools.Serialize(t) |
||||
local buf = {} |
||||
local cat = function(v) buf[#buf + 1] = v end |
||||
impl(t, cat, {}) |
||||
return format('return %s',table_concat(buf)) |
||||
end |
||||
|
||||
-- | Math Tools |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
|
||||
--[[ Round a number |
||||
-- @Param number the number to round |
||||
-- @Param base the number to round to (can be a decimal) [Default:1] |
||||
-- @Return the rounded number to base ]] |
||||
function DiesalTools.Round(number, base) |
||||
base = base or 1 |
||||
return floor((number + base/2)/base) * base |
||||
end |
||||
--[[ Round a number for printing |
||||
-- @Param number the number to round |
||||
-- @Param idp number of decimal points to round to [Default:1] |
||||
-- @Return the rounded number ]] |
||||
function DiesalTools.RoundPrint(num, idp) |
||||
return string.format("%." .. (idp or 0) .. "f", num) |
||||
end |
||||
|
||||
-- | Frame Tools |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
|
||||
--[[ GetFrameQuadrant(frame) |
||||
@Arguments: |
||||
frame frame?!! |
||||
@Returns: |
||||
quadrant quadrant of the screen frames center is in |
||||
-- ]] |
||||
function DiesalTools.GetFrameQuadrant(frame) |
||||
if not frame:GetCenter() then return "UNKNOWN", frame:GetName() end |
||||
|
||||
local x, y = frame:GetCenter() |
||||
local screenWidth = GetScreenWidth() |
||||
local screenHeight = GetScreenHeight() |
||||
local quadrant |
||||
|
||||
if (x > (screenWidth / 4) and x < (screenWidth / 4)*3) and y > (screenHeight / 4)*3 then |
||||
quadrant = "TOP" |
||||
elseif x < (screenWidth / 4) and y > (screenHeight / 4)*3 then |
||||
quadrant = "TOPLEFT" |
||||
elseif x > (screenWidth / 4)*3 and y > (screenHeight / 4)*3 then |
||||
quadrant = "TOPRIGHT" |
||||
elseif (x > (screenWidth / 4) and x < (screenWidth / 4)*3) and y < (screenHeight / 4) then |
||||
quadrant = "BOTTOM" |
||||
elseif x < (screenWidth / 4) and y < (screenHeight / 4) then |
||||
quadrant = "BOTTOMLEFT" |
||||
elseif x > (screenWidth / 4)*3 and y < (screenHeight / 4) then |
||||
quadrant = "BOTTOMRIGHT" |
||||
elseif x < (screenWidth / 4) and (y > (screenHeight / 4) and y < (screenHeight / 4)*3) then |
||||
quadrant = "LEFT" |
||||
elseif x > (screenWidth / 4)*3 and y < (screenHeight / 4)*3 and y > (screenHeight / 4) then |
||||
quadrant = "RIGHT" |
||||
else |
||||
quadrant = "CENTER" |
||||
end |
||||
|
||||
return quadrant |
||||
end |
||||
|
||||
-- | Misc Tools |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
|
||||
--[[ Pack(...) blizzard dosnt use 5.2 yet so will have to create this one |
||||
@Arguments: |
||||
... arguments to pack into a table |
||||
@Returns: |
||||
a new table with all parameters stored into keys 1, 2, etc. and with a field "n" with the total number of parameters |
||||
]] |
||||
function DiesalTools.Pack(...) |
||||
return { n = select("#", ...), ... } |
||||
end |
||||
--[[ Unpack(...) |
||||
@Arguments: |
||||
t table to unpack |
||||
@Returns: |
||||
... list of arguments |
||||
]] |
||||
function DiesalTools.Unpack(t) |
||||
if t.n then |
||||
return unpack(t,1,t.n) |
||||
end |
||||
return unpack(table) |
||||
end |
@ -0,0 +1,581 @@ |
||||
local MAJOR, MINOR = "DiesalTools-2.0", 1 |
||||
---@alias Diesal.Tools DiesalTools-2.0 |
||||
|
||||
---@class DiesalTools-2.0 |
||||
local DiesalTools = LibStub:NewLibrary(MAJOR, MINOR) |
||||
|
||||
if not DiesalTools then |
||||
return |
||||
end -- No Upgrade needed. |
||||
-- ~~| Libraries |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
-- ~~| Lua Upvalues |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local type, select, pairs, tonumber, tostring = type, select, pairs, tonumber, tostring |
||||
local table_concat = table.concat |
||||
local setmetatable, getmetatable, next = setmetatable, getmetatable, next |
||||
local sub, format, lower, upper, gsub = string.sub, string.format, string.lower, string.upper, string.gsub |
||||
local floor, ceil, abs, modf = math.floor, math.ceil, math.abs, math.modf |
||||
-- ~~| WoW Upvalues |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local CreateFrame, UIParent, GetCursorPosition = CreateFrame, UIParent, GetCursorPosition |
||||
local GetScreenWidth, GetScreenHeight = GetScreenWidth, GetScreenHeight |
||||
-- ~~| Locals |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
local escapeSequences = { |
||||
["\a"] = "\\a", -- Bell |
||||
["\b"] = "\\b", -- Backspace |
||||
["\t"] = "\\t", -- Horizontal tab |
||||
["\n"] = "\\n", -- Newline |
||||
["\v"] = "\\v", -- Vertical tab |
||||
["\f"] = "\\f", -- Form feed |
||||
["\r"] = "\\r", -- Carriage return |
||||
["\\"] = "\\\\", -- Backslash |
||||
['"'] = '\\"', -- Quotation mark |
||||
["|"] = "||", |
||||
} |
||||
local lua_keywords = { |
||||
["and"] = true, |
||||
["break"] = true, |
||||
["do"] = true, |
||||
["else"] = true, |
||||
["elseif"] = true, |
||||
["end"] = true, |
||||
["false"] = true, |
||||
["for"] = true, |
||||
["function"] = true, |
||||
["if"] = true, |
||||
["in"] = true, |
||||
["local"] = true, |
||||
["nil"] = true, |
||||
["not"] = true, |
||||
["or"] = true, |
||||
["repeat"] = true, |
||||
["return"] = true, |
||||
["then"] = true, |
||||
["true"] = true, |
||||
["until"] = true, |
||||
["while"] = true, |
||||
} |
||||
local sub_table = {} |
||||
local colors = { |
||||
blue = "|cff" .. "00aaff", |
||||
darkblue = "|cff" .. "004466", |
||||
orange = "|cff" .. "ffaa00", |
||||
darkorange = "|cff" .. "4c3300", |
||||
grey = "|cff" .. "7f7f7f", |
||||
darkgrey = "|cff" .. "414141", |
||||
white = "|cff" .. "ffffff", |
||||
red = "|cff" .. "ff0000", |
||||
green = "|cff" .. "00ff2b", |
||||
yellow = "|cff" .. "ffff00", |
||||
lightyellow = "|cff" .. "ffea7f", |
||||
} |
||||
|
||||
local formattedArgs = {} |
||||
|
||||
---@param level number |
||||
local function GetCaller(level) |
||||
-- ADDON:LogMessage(debugstack(10,2, 0)) |
||||
for trace in debugstack(level, 2, 0):gmatch("(.-)\n") do |
||||
-- Blizzard Sandbox |
||||
local match, _, file, line = trace:find("^.*\\(.-):(%d+)") |
||||
if match then |
||||
return format("%s[%s%s: %s%s%s]|r", colors.orange, colors.yellow, file, colors.lightyellow, line, colors.orange) |
||||
end |
||||
-- PQI DataFile |
||||
local match, _, file, line = trace:find('^%[string "[%s%-]*(.-%.lua).-"%]:(%d+)') |
||||
if match then |
||||
return format("%s[%s%s: %s%s%s]|r", colors.orange, colors.yellow, file, colors.lightyellow, line, colors.orange) |
||||
end |
||||
-- PQR Ability code |
||||
local match, _, file, line = trace:find('^%[string "(.-)"%]:(%d+)') |
||||
if match then |
||||
return format("%s[%s%s: %s%s%s]|r", colors.orange, colors.yellow, file, colors.lightyellow, line, colors.orange) |
||||
end |
||||
end |
||||
return format("%s[%sUnknown Caller%s]|r", colors.orange, colors.red, colors.orange) |
||||
end |
||||
local function round(number, base) |
||||
base = base or 1 |
||||
return floor((number + base / 2) / base) * base |
||||
end |
||||
local function getRGBColorValues(color, g, b) |
||||
if type(color) == "number" and type(g) == "number" and type(b) == "number" then |
||||
if color <= 1 and g <= 1 and b <= 1 then |
||||
return round(color * 255), round(g * 255), round(b * 255) |
||||
end |
||||
return color[1], color[2], color[3] |
||||
elseif type(color) == "table" and type(color[1]) == "number" and type(color[2]) == "number" and type(color[3]) == "number" then |
||||
if color[1] <= 1 and color[2] <= 1 and color[3] <= 1 then |
||||
return round(color[1] * 255), round(color[2] * 255), round(color[3] * 255) |
||||
end |
||||
return color[1], color[2], color[3] |
||||
elseif type(color) == "string" then |
||||
return tonumber(sub(color, 1, 2), 16), tonumber(sub(color, 3, 4), 16), tonumber(sub(color, 5, 6), 16) |
||||
end |
||||
end |
||||
|
||||
function DiesalTools.GetColor(value) |
||||
if not value then |
||||
return |
||||
end |
||||
|
||||
if type(value) == "table" and #value >= 3 then |
||||
return value[1] / 255, value[2] / 255, value[3] / 255 |
||||
elseif type(value) == "string" then |
||||
return tonumber(sub(value, 1, 2), 16) / 255, tonumber(sub(value, 3, 4), 16) / 255, tonumber(sub(value, 5, 6), 16) / 255 |
||||
end |
||||
end |
||||
|
||||
-- ~~| API |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
|
||||
function DiesalTools.Stack() |
||||
print("|r------------------------------| Stack Trace |-------------------------------") |
||||
local stack = debugstack(1, 12, 0) |
||||
for trace in stack:gmatch("(.-)\n") do |
||||
local match, _, file, line, func = trace:find("^.*\\(.-):(%d+).-`(.*)'$") |
||||
if match then |
||||
print(format("%s[%s%s: %s%s%s] %sfunction|r %s|r", colors.orange, colors.yellow, file, colors.lightyellow, line, colors.orange, colors.blue, func)) |
||||
end |
||||
end |
||||
print("|r--------------------------------------------------------------------------------") |
||||
end |
||||
--[[ copy = TableCopy(src, dest, metatable) |
||||
@Arguments: |
||||
dest Table to copy to |
||||
src Table to copy |
||||
metatable if true copies the metatable as well (boolean) |
||||
@Returns: |
||||
table copy of table |
||||
--]] |
||||
function DiesalTools.TableCopy(src, dest, metatable) |
||||
if type(src) == "table" then |
||||
if not dest then |
||||
dest = {} |
||||
end |
||||
for sk, sv in next, src, nil do |
||||
dest[DiesalTools.TableCopy(sk)] = DiesalTools.TableCopy(sv) |
||||
end |
||||
if metatable then |
||||
setmetatable(dest, DiesalTools.TableCopy(getmetatable(src))) |
||||
end |
||||
else -- number, string, boolean, etc |
||||
dest = src |
||||
end |
||||
return dest |
||||
end |
||||
--[[ red, blue, green = GetColor(value) |
||||
@Arguments: |
||||
value Hex color code or a table contating R,G,B color values |
||||
@Returns: |
||||
red Red component of color (0-1) (number) |
||||
green Green component of color(0-1) (number) |
||||
blue Blue component of color (0-1) (number) |
||||
-- ]] |
||||
|
||||
-- | Color Tools |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
|
||||
---@alias ColorType 'rgb255' | 'rgb1' | 'hex' | 'hsl' |
||||
-- converts a color from RGB[0-1], RGB[0-255], HEX or HSL to RGB[0-1], RGB[0-255] or HEX |
||||
---@param from ColorType |
||||
---@param to ColorType |
||||
---@param v1 string | number | table |
||||
---@param v2? string | number |
||||
---@param v3? string | number |
||||
function DiesalTools.ConvertColor(from, to, v1, v2, v3) |
||||
if not from or not to or not v1 then |
||||
return |
||||
end |
||||
if type(v1) == "table" then |
||||
v1, v2, v3 = v1[1], v1[2], v1[3] |
||||
end |
||||
local r, g, b |
||||
from, to = from:lower(), to:lower() |
||||
|
||||
if from == "rgb255" and type(v1) == "number" and type(v2) == "number" and type(v3) == "number" then |
||||
r, g, b = v1, v2, v3 |
||||
elseif from == "rgb1" and type(v1) == "number" and type(v2) == "number" and type(v3) == "number" then |
||||
r, g, b = round(v1 * 255), round(v2 * 255), round(v3 * 255) |
||||
elseif from == "hex" and type(v1) == "string" and #v1 > 5 then |
||||
r, g, b = tonumber(sub(v1, 1, 2), 16), tonumber(sub(v1, 3, 4), 16), tonumber(sub(v1, 5, 6), 16) |
||||
elseif from == "hsl" and type(v1) == "number" and type(v2) == "number" and type(v3) == "number" then |
||||
if v2 == 0 then |
||||
v3 = round(v3 * 255) |
||||
r, g, b = v3, v3, v3 |
||||
else |
||||
v1, v2, v3 = v1 / 360 * 6, min(max(0, v2), 1), min(max(0, v3), 1) |
||||
local c = (1 - abs(2 * v3 - 1)) * v2 |
||||
local x = (1 - abs(v1 % 2 - 1)) * c |
||||
local m = (v3 - 0.5 * c) |
||||
r, g, b = 0, 0, 0 |
||||
if v1 < 1 then |
||||
r, g, b = c, x, 0 |
||||
elseif v1 < 2 then |
||||
r, g, b = x, c, 0 |
||||
elseif v1 < 3 then |
||||
r, g, b = 0, c, x |
||||
elseif v1 < 4 then |
||||
r, g, b = 0, x, c |
||||
elseif v1 < 5 then |
||||
r, g, b = x, 0, c |
||||
else |
||||
r, g, b = c, 0, x |
||||
end |
||||
|
||||
r, g, b = round((r + m) * 255), round((g + m) * 255), round((b + m) * 255) |
||||
end |
||||
else |
||||
return |
||||
end |
||||
r, g, b = min(255, max(0, r)), min(255, max(0, g)), min(255, max(0, b)) |
||||
|
||||
if to == "rgb255" then |
||||
return r, g, b |
||||
elseif to == "rgb1" then |
||||
return r / 255, g / 255, b / 255 |
||||
elseif to == "hex" then |
||||
return format("%02x%02x%02x", r, g, b) |
||||
end |
||||
end |
||||
-- Mixes a color with pure white to produce a lighter color |
||||
function DiesalTools.TintColor(color, percent, to, from) |
||||
percent = min(1, max(0, percent)) |
||||
from, to = from or "hex", to and to:lower() or "hex" |
||||
local r, g, b = DiesalTools.ConvertColor(from, "rgb255", color) |
||||
|
||||
if to == "rgb255" then |
||||
return round((255 - r) * percent + r), round((255 - g) * percent + g), round((255 - b) * percent + b) |
||||
elseif to == "rgb1" then |
||||
return round(((255 - r) * percent + r) / 255), round(((255 - g) * percent + g) / 255), round(((255 - b) * percent + b) / 255) |
||||
elseif to == "hex" then |
||||
return format("%02x%02x%02x", round((255 - r) * percent + r), round((255 - g) * percent + g), round((255 - b) * percent + b)) |
||||
end |
||||
-- return format("%02x%02x%02x", round((255-r)*percent+r), round((255-g)*percent+g), round((255-b)*percent+b) ) |
||||
end |
||||
-- Mixes a color with pure black to produce a darker color |
||||
function DiesalTools.ShadeColor(color, percent, to, from) |
||||
percent = min(1, max(0, percent)) |
||||
from, to = from or "hex", to and to:lower() or "hex" |
||||
local r, g, b = DiesalTools.ConvertColor(from, "rgb255", color) |
||||
|
||||
if to == "rgb255" then |
||||
return round(-r * percent + r), round(-g * percent + g), round(-b * percent + b) |
||||
elseif to == "rgb1" then |
||||
return round((-r * percent + r) / 255), round((-g * percent + g) / 255), round((-b * percent + b) / 255) |
||||
elseif to == "hex" then |
||||
return format("%02x%02x%02x", round(-r * percent + r), round(-g * percent + g), round(-b * percent + b)) |
||||
end |
||||
end |
||||
-- Mixes a color with the another color to produce an intermediate color. |
||||
function DiesalTools.MixColors(color1, color2, percent, to, from) |
||||
percent = min(1, max(0, percent)) |
||||
from, to = from or "hex", to and to:lower() or "hex" |
||||
-- to = to and to:lower() or 'hex' |
||||
|
||||
local r1, g1, b1 = DiesalTools.ConvertColor(from, "rgb255", color1) |
||||
local r2, g2, b2 = DiesalTools.ConvertColor(from, "rgb255", color2) |
||||
|
||||
if to == "rgb255" then |
||||
return round((r2 - r1) * percent) + r1, round((g2 - g1) * percent) + g1, round((b2 - b1) * percent) + b1 |
||||
elseif to == "rgb1" then |
||||
return round(((r2 - r1) * percent + r1) / 255), round(((g2 - g1) * percent + g1) / 255), round(((b2 - b1) * percent + b1) / 255) |
||||
elseif to == "hex" then |
||||
return format("%02x%02x%02x", round((r2 - r1) * percent) + r1, round((g2 - g1) * percent) + g1, round((b2 - b1) * percent) + b1) |
||||
end |
||||
end |
||||
--- converts color HSL to HEX |
||||
function DiesalTools.HSL(v1, v2, v3) |
||||
if not v1 then |
||||
return |
||||
end |
||||
if type(v1) == "table" then |
||||
v1, v2, v3 = v1[1], v1[2], v1[3] |
||||
end |
||||
local r, g, b |
||||
|
||||
if v2 == 0 then |
||||
v3 = round(v3 * 255) |
||||
r, g, b = v3, v3, v3 |
||||
else |
||||
v1, v2, v3 = v1 / 360 * 6, min(max(0, v2), 1), min(max(0, v3), 1) |
||||
local c = (1 - abs(2 * v3 - 1)) * v2 |
||||
local x = (1 - abs(v1 % 2 - 1)) * c |
||||
local m = (v3 - 0.5 * c) |
||||
r, g, b = 0, 0, 0 |
||||
if v1 < 1 then |
||||
r, g, b = c, x, 0 |
||||
elseif v1 < 2 then |
||||
r, g, b = x, c, 0 |
||||
elseif v1 < 3 then |
||||
r, g, b = 0, c, x |
||||
elseif v1 < 4 then |
||||
r, g, b = 0, x, c |
||||
elseif v1 < 5 then |
||||
r, g, b = x, 0, c |
||||
else |
||||
r, g, b = c, 0, x |
||||
end |
||||
|
||||
r, g, b = round((r + m) * 255), round((g + m) * 255), round((b + m) * 255) |
||||
end |
||||
|
||||
r, g, b = min(255, max(0, r)), min(255, max(0, g)), min(255, max(0, b)) |
||||
|
||||
return format("%02x%02x%02x", r, g, b) |
||||
end |
||||
|
||||
--[[ GetTxtColor(value) |
||||
@Arguments: |
||||
value Hex color code or a table contating R,G,B color values |
||||
@Returns: |
||||
text coloring escape sequence (|cFFFFFFFF) |
||||
-- ]] |
||||
function DiesalTools.GetTxtColor(value) |
||||
if not value then |
||||
return |
||||
end |
||||
|
||||
if type(value) == "table" then |
||||
value = string.format("%02x%02x%02x", value[1], value[2], value[3]) |
||||
end |
||||
return format("|cff%s", value) |
||||
end |
||||
|
||||
-- | Texture Tools |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
|
||||
--[[ Get a piece of a texture as a cooridnate refernce |
||||
-- @Param column the column in the texture |
||||
-- @Param row the row in the texture |
||||
-- @Param size the size in the texture |
||||
-- @Param textureWidth total texture width |
||||
-- @Param textureHeight total texture height |
||||
-- @Return edge coordinates for image cropping, plugs directly into Texture:SetTexCoord(left, right, top, bottom) ]] |
||||
function DiesalTools.GetIconCoords(column, row, size, textureWidth, textureHeight) |
||||
size = size or 16 |
||||
textureWidth = textureWidth or 128 |
||||
textureHeight = textureHeight or 16 |
||||
return (column * size - size) / textureWidth, (column * size) / textureWidth, (row * size - size) / textureHeight, (row * size) / textureHeight |
||||
end |
||||
-- | String Tools |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
|
||||
--[[ Capitalize a string |
||||
-- @Param str the string to capatilize |
||||
-- @Return the capitilized string ]] |
||||
function DiesalTools.Capitalize(str) |
||||
return (str:gsub("^%l", upper)) |
||||
end |
||||
--[[ Escape all formatting in a WoW-lua string |
||||
-- @Param str the string to escape |
||||
-- @Return the escaped string ]] |
||||
function DiesalTools.EscapeString(string) |
||||
return string:gsub('[%z\1-\31"\\|\127-\255]', escapeSequences) |
||||
end |
||||
--[[ ID = CreateID(s) |
||||
-- @Param s string to parse |
||||
-- @Return ID string stripped of all non letter characters and color codes.]] |
||||
function DiesalTools.CreateID(s) |
||||
return gsub(s:gsub("c%x%x%x%x%x%x%x%x", ""), "[^%a%d]", "") |
||||
end |
||||
--[[ str = TrimString(s) |
||||
-- @Param s string to parse |
||||
-- @Return str string stripped of leading and trailing spaces.]] |
||||
function DiesalTools.TrimString(s) |
||||
return s:gsub("^%s*(.-)%s*$", "%1") |
||||
end |
||||
--[[ string = SpliceString(string, start, End, txt) |
||||
@Arguments: |
||||
string string to splice |
||||
start starting index of splice |
||||
End ending index of splice |
||||
txt new text to splice in (string) |
||||
@Returns: |
||||
string resulting string of the splice |
||||
|
||||
@example: |
||||
DiesalTools.SpliceString("123456789",2,4,'NEW') -- returns: "1NEW56789" |
||||
--]] |
||||
function DiesalTools.SpliceString(string, start, End, txt) |
||||
return string:sub(1, start - 1) .. txt .. string:sub(End + 1, -1) |
||||
end |
||||
--[[ string = Serialize(table) |
||||
@Param table - table to to serialize |
||||
@Return string - serialized table (string) |
||||
|
||||
@deserialization: |
||||
local func,err = loadstring('serialized table') |
||||
if err then error(err) end |
||||
return func() |
||||
]] |
||||
local function serialize_number(number) |
||||
-- no argument checking - called very often |
||||
local text = ("%.17g"):format(number) |
||||
-- on the same platform tostring() and string.format() |
||||
-- return the same results for 1/0, -1/0, 0/0 |
||||
-- so we don't need separate substitution table |
||||
return sub_table[text] or text |
||||
end |
||||
local function impl(t, cat, visited) |
||||
local t_type = type(t) |
||||
if t_type == "table" then |
||||
if not visited[t] then |
||||
visited[t] = true |
||||
|
||||
cat("{") |
||||
-- Serialize numeric indices |
||||
local next_i = 0 |
||||
for i, v in ipairs(t) do |
||||
if i > 1 then -- TODO: Move condition out of the loop |
||||
cat(",") |
||||
end |
||||
impl(v, cat, visited) |
||||
next_i = i |
||||
end |
||||
next_i = next_i + 1 |
||||
-- Serialize hash part |
||||
-- Skipping comma only at first element iff there is no numeric part. |
||||
local need_comma = (next_i > 1) |
||||
for k, v in pairs(t) do |
||||
local k_type = type(k) |
||||
if k_type == "string" then |
||||
if need_comma then |
||||
cat(",") |
||||
end |
||||
need_comma = true |
||||
-- TODO: Need "%q" analogue, which would put quotes |
||||
-- only if string does not match regexp below |
||||
if not lua_keywords[k] and ("^[%a_][%a%d_]*$"):match(k) then |
||||
cat(k) |
||||
cat("=") |
||||
else |
||||
cat(format("[%q]=", k)) |
||||
end |
||||
impl(v, cat, visited) |
||||
else |
||||
if |
||||
k_type ~= "number" -- non-string non-number |
||||
or k >= next_i |
||||
or k < 1 -- integer key in hash part of the table |
||||
or k % 1 ~= 0 -- non-integer key |
||||
then |
||||
if need_comma then |
||||
cat(",") |
||||
end |
||||
need_comma = true |
||||
|
||||
cat("[") |
||||
impl(k, cat, visited) |
||||
cat("]=") |
||||
impl(v, cat, visited) |
||||
end |
||||
end |
||||
end |
||||
cat("}") |
||||
visited[t] = nil |
||||
else |
||||
-- this loses information on recursive tables |
||||
cat('"table (recursive)"') |
||||
end |
||||
elseif t_type == "number" then |
||||
cat(serialize_number(t)) |
||||
elseif t_type == "boolean" then |
||||
cat(tostring(t)) |
||||
elseif t == nil then |
||||
cat("nil") |
||||
else |
||||
-- this converts non-serializable (functions) types to strings |
||||
cat(format("%q", tostring(t))) |
||||
end |
||||
end |
||||
local function tstr_cat(cat, t) |
||||
impl(t, cat, {}) |
||||
end |
||||
function DiesalTools.Serialize(t) |
||||
local buf = {} |
||||
local cat = function(v) |
||||
buf[#buf + 1] = v |
||||
end |
||||
impl(t, cat, {}) |
||||
return format("return %s", table_concat(buf)) |
||||
end |
||||
|
||||
-- | Math Tools |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
|
||||
--[[ Round a number |
||||
-- @Param number the number to round |
||||
-- @Param base the number to round to (can be a decimal) [Default:1] |
||||
-- @Return the rounded number to base ]] |
||||
---@param number number |
||||
---@param base? number |
||||
function DiesalTools.Round(number, base) |
||||
base = base or 1 |
||||
return floor((number + base / 2) / base) * base |
||||
end |
||||
--[[ Round a number for printing |
||||
-- @Param number the number to round |
||||
-- @Param idp number of decimal points to round to [Default:1] |
||||
-- @Return the rounded number ]] |
||||
function DiesalTools.RoundPrint(num, idp) |
||||
return string.format("%." .. (idp or 0) .. "f", num) |
||||
end |
||||
|
||||
-- | Frame Tools |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
|
||||
--[[ GetFrameQuadrant(frame) |
||||
@Arguments: |
||||
frame frame?!! |
||||
@Returns: |
||||
quadrant quadrant of the screen frames center is in |
||||
-- ]] |
||||
function DiesalTools.GetFrameQuadrant(frame) |
||||
if not frame:GetCenter() then |
||||
return "UNKNOWN", frame:GetName() |
||||
end |
||||
|
||||
local x, y = frame:GetCenter() |
||||
local screenWidth = GetScreenWidth() |
||||
local screenHeight = GetScreenHeight() |
||||
local quadrant |
||||
|
||||
if (x > (screenWidth / 4) and x < (screenWidth / 4) * 3) and y > (screenHeight / 4) * 3 then |
||||
quadrant = "TOP" |
||||
elseif x < (screenWidth / 4) and y > (screenHeight / 4) * 3 then |
||||
quadrant = "TOPLEFT" |
||||
elseif x > (screenWidth / 4) * 3 and y > (screenHeight / 4) * 3 then |
||||
quadrant = "TOPRIGHT" |
||||
elseif (x > (screenWidth / 4) and x < (screenWidth / 4) * 3) and y < (screenHeight / 4) then |
||||
quadrant = "BOTTOM" |
||||
elseif x < (screenWidth / 4) and y < (screenHeight / 4) then |
||||
quadrant = "BOTTOMLEFT" |
||||
elseif x > (screenWidth / 4) * 3 and y < (screenHeight / 4) then |
||||
quadrant = "BOTTOMRIGHT" |
||||
elseif x < (screenWidth / 4) and (y > (screenHeight / 4) and y < (screenHeight / 4) * 3) then |
||||
quadrant = "LEFT" |
||||
elseif x > (screenWidth / 4) * 3 and y < (screenHeight / 4) * 3 and y > (screenHeight / 4) then |
||||
quadrant = "RIGHT" |
||||
else |
||||
quadrant = "CENTER" |
||||
end |
||||
|
||||
return quadrant |
||||
end |
||||
|
||||
-- | Misc Tools |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
|
||||
--[[ Pack(...) blizzard dosnt use 5.2 yet so will have to create this one |
||||
@Arguments: |
||||
... arguments to pack into a table |
||||
@Returns: |
||||
a new table with all parameters stored into keys 1, 2, etc. and with a field "n" with the total number of parameters |
||||
]] |
||||
function DiesalTools.Pack(...) |
||||
return { n = select("#", ...), ... } |
||||
end |
||||
--[[ Unpack(...) |
||||
@Arguments: |
||||
t table to unpack |
||||
@Returns: |
||||
... list of arguments |
||||
]] |
||||
function DiesalTools.Unpack(t) |
||||
if t.n then |
||||
return unpack(t, 1, t.n) |
||||
end |
||||
return unpack(table) |
||||
end |