Initial commit
This commit is contained in:
@@ -0,0 +1,100 @@
|
||||
ketchup = false
|
||||
dish = "Banana"
|
||||
quantity = 1
|
||||
_menuPool = MenuPool.New()
|
||||
mainMenu = UIMenu.New("Native UI", "~b~NATIVEUI SHOWCASE")
|
||||
_menuPool:Add(mainMenu)
|
||||
|
||||
function ShowNotification(text)
|
||||
SetNotificationTextEntry("STRING")
|
||||
AddTextComponentString(text)
|
||||
DrawNotification(false, false)
|
||||
end
|
||||
|
||||
function AddMenuKetchup(menu)
|
||||
local newitem = UIMenuCheckboxItem.New("Add ketchup?", ketchup, "Do you wish to add ketchup?")
|
||||
menu:AddItem(newitem)
|
||||
menu.OnCheckboxChange = function(sender, item, checked_)
|
||||
if item == newitem then
|
||||
ketchup = checked_
|
||||
ShowNotification("~r~Ketchup status: ~b~"..tostring(ketchup))
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function AddMenuFoods(menu)
|
||||
local foods = {
|
||||
"Banana",
|
||||
"Apple",
|
||||
"Pizza",
|
||||
"Quartilicious",
|
||||
"Steak",
|
||||
0xF00D,
|
||||
}
|
||||
local newitem = UIMenuListItem.New("Food", foods, 1)
|
||||
menu:AddItem(newitem)
|
||||
menu.OnListChange = function(sender, item, index)
|
||||
if item == newitem then
|
||||
dish = item:IndexToItem(index)
|
||||
ShowNotification("Preparing ~b~" .. dish .. "~w~...")
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function AddMenuFoodCount(menu)
|
||||
local amount = {}
|
||||
for i = 1, 100 do amount[i] = i end
|
||||
local newitem = UIMenuSliderItem.New("Quantity", amount, 1, false)
|
||||
menu:AddItem(newitem)
|
||||
menu.OnSliderChange = function(sender, item, index)
|
||||
if item == newitem then
|
||||
quantity = item:IndexToItem(index)
|
||||
ShowNotification("Preparing ~r~" .. quantity .. " ~b~" .. dish .. "(s)~w~...")
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function AddMenuCook(menu)
|
||||
local newitem = UIMenuItem.New("Cook!", "Cook the dish with the appropriate ingredients and ketchup.")
|
||||
newitem:SetLeftBadge(BadgeStyle.Star)
|
||||
newitem:SetRightBadge(BadgeStyle.Tick)
|
||||
menu:AddItem(newitem)
|
||||
menu.OnItemSelect = function(sender, item, index)
|
||||
if item == newitem then
|
||||
local string = "You have ordered ~r~" .. quantity .. " ~b~"..dish.."(s)~w~ ~r~with~w~ ketchup."
|
||||
if not ketchup then
|
||||
string = "You have ordered ~r~" .. quantity .. " ~b~"..dish.."(s)~w~ ~r~without~w~ ketchup."
|
||||
end
|
||||
ShowNotification(string)
|
||||
end
|
||||
end
|
||||
menu.OnIndexChange = function(sender, index)
|
||||
if sender.Items[index] == newitem then
|
||||
newitem:SetLeftBadge(BadgeStyle.None)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function AddMenuAnotherMenu(menu)
|
||||
local submenu = _menuPool:AddSubMenu(menu, "Another Menu")
|
||||
for i = 1, 20, 1 do
|
||||
submenu:AddItem(UIMenuItem.New("PageFiller", "Sample description that takes more than one line. Moreso, it takes way more than two lines since it's so long. Wow, check out this length!"))
|
||||
end
|
||||
end
|
||||
|
||||
AddMenuKetchup(mainMenu)
|
||||
AddMenuFoods(mainMenu)
|
||||
AddMenuFoodCount(mainMenu)
|
||||
AddMenuCook(mainMenu)
|
||||
AddMenuAnotherMenu(mainMenu)
|
||||
_menuPool:RefreshIndex()
|
||||
|
||||
Citizen.CreateThread(function()
|
||||
while true do
|
||||
Citizen.Wait(0)
|
||||
_menuPool:ProcessMenus()
|
||||
if IsControlJustPressed(1, 51) then
|
||||
mainMenu:Visible(not mainMenu:Visible())
|
||||
end
|
||||
end
|
||||
end)
|
||||
@@ -0,0 +1,193 @@
|
||||
MenuPool = setmetatable({}, MenuPool)
|
||||
MenuPool.__index = MenuPool
|
||||
|
||||
function MenuPool.New()
|
||||
local _MenuPool = {
|
||||
Menus = {}
|
||||
}
|
||||
return setmetatable(_MenuPool, MenuPool)
|
||||
end
|
||||
|
||||
function MenuPool:AddSubMenu(Menu, Text, Description, KeepPosition, KeepBanner)
|
||||
if Menu() == "UIMenu" then
|
||||
local Item = UIMenuItem.New(tostring(Text), Description or "")
|
||||
Menu:AddItem(Item)
|
||||
local SubMenu
|
||||
if KeepPosition then
|
||||
SubMenu = UIMenu.New(Menu.Title:Text(), Text, Menu.Position.X, Menu.Position.Y)
|
||||
else
|
||||
SubMenu = UIMenu.New(Menu.Title:Text(), Text)
|
||||
end
|
||||
if KeepBanner then
|
||||
if Menu.Logo ~= nil then
|
||||
SubMenu.Logo = Menu.Logo
|
||||
else
|
||||
SubMenu.Logo = nil
|
||||
SubMenu.Banner = Menu.Banner
|
||||
end
|
||||
end
|
||||
self:Add(SubMenu)
|
||||
Menu:BindMenuToItem(SubMenu, Item)
|
||||
return SubMenu
|
||||
end
|
||||
end
|
||||
|
||||
function MenuPool:Add(Menu)
|
||||
if Menu() == "UIMenu" then
|
||||
table.insert(self.Menus, Menu)
|
||||
end
|
||||
end
|
||||
|
||||
function MenuPool:MouseEdgeEnabled(bool)
|
||||
if bool ~= nil then
|
||||
for _, Menu in pairs(self.Menus) do
|
||||
Menu.Settings.MouseEdgeEnabled = tobool(bool)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function MenuPool:ControlDisablingEnabled(bool)
|
||||
if bool ~= nil then
|
||||
for _, Menu in pairs(self.Menus) do
|
||||
Menu.Settings.ControlDisablingEnabled = tobool(bool)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function MenuPool:ResetCursorOnOpen(bool)
|
||||
if bool ~= nil then
|
||||
for _, Menu in pairs(self.Menus) do
|
||||
Menu.Settings.ResetCursorOnOpen = tobool(bool)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function MenuPool:MultilineFormats(bool)
|
||||
if bool ~= nil then
|
||||
for _, Menu in pairs(self.Menus) do
|
||||
Menu.Settings.MultilineFormats = tobool(bool)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function MenuPool:Audio(Attribute, Setting)
|
||||
if Attribute ~= nil and Setting ~= nil then
|
||||
for _, Menu in pairs(self.Menus) do
|
||||
if Menu.Settings.Audio[Attribute] then
|
||||
Menu.Settings.Audio[Attribute] = Setting
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function MenuPool:WidthOffset(offset)
|
||||
if tonumber(offset) then
|
||||
for _, Menu in pairs(self.Menus) do
|
||||
Menu:SetMenuWidthOffset(tonumber(offset))
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function MenuPool:CounterPreText(str)
|
||||
if str ~= nil then
|
||||
for _, Menu in pairs(self.Menus) do
|
||||
Menu.PageCounter.PreText = tostring(str)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function MenuPool:DisableInstructionalButtons(bool)
|
||||
if bool ~= nil then
|
||||
for _, Menu in pairs(self.Menus) do
|
||||
Menu.Settings.InstructionalButtons = tobool(bool)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function MenuPool:MouseControlsEnabled(bool)
|
||||
if bool ~= nil then
|
||||
for _, Menu in pairs(self.Menus) do
|
||||
Menu.Settings.MouseControlsEnabled = tobool(bool)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function MenuPool:RefreshIndex()
|
||||
for _, Menu in pairs(self.Menus) do
|
||||
Menu:RefreshIndex()
|
||||
end
|
||||
end
|
||||
|
||||
function MenuPool:ProcessMenus()
|
||||
self:ProcessControl()
|
||||
self:ProcessMouse()
|
||||
self:Draw()
|
||||
end
|
||||
|
||||
function MenuPool:ProcessControl()
|
||||
for _, Menu in pairs(self.Menus) do
|
||||
if Menu:Visible() then
|
||||
Menu:ProcessControl()
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function MenuPool:ProcessMouse()
|
||||
for _, Menu in pairs(self.Menus) do
|
||||
if Menu:Visible() then
|
||||
Menu:ProcessMouse()
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function MenuPool:Draw()
|
||||
for _, Menu in pairs(self.Menus) do
|
||||
if Menu:Visible() then
|
||||
Menu:Draw()
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function MenuPool:IsAnyMenuOpen()
|
||||
local open = false
|
||||
for _, Menu in pairs(self.Menus) do
|
||||
if Menu:Visible() then
|
||||
open = true
|
||||
break
|
||||
end
|
||||
end
|
||||
return open
|
||||
end
|
||||
|
||||
function MenuPool:CloseAllMenus()
|
||||
for _, Menu in pairs(self.Menus) do
|
||||
if Menu:Visible() then
|
||||
Menu:Visible(false)
|
||||
Menu.OnMenuClosed(Menu)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function MenuPool:SetBannerSprite(Sprite)
|
||||
if Sprite() == "Sprite" then
|
||||
for _, Menu in pairs(self.Menus) do
|
||||
Menu:SetBannerSprite(Sprite)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function MenuPool:SetBannerRectangle(Rectangle)
|
||||
if Rectangle() == "Rectangle" then
|
||||
for _, Menu in pairs(self.Menus) do
|
||||
Menu:SetBannerRectangle(Rectangle)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function MenuPool:TotalItemsPerPage(Value)
|
||||
if tonumber(Value) then
|
||||
for _, Menu in pairs(self.Menus) do
|
||||
Menu.Pagination.Total = Value - 1
|
||||
end
|
||||
end
|
||||
end
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,191 @@
|
||||
function GetResolution()
|
||||
local W, H = GetActiveScreenResolution()
|
||||
if (W/H) > 3.5 then
|
||||
return GetScreenResolution()
|
||||
else
|
||||
return W, H
|
||||
end
|
||||
end
|
||||
|
||||
function FormatXWYH(Value, Value2)
|
||||
return Value/1920, Value2/1080
|
||||
end
|
||||
|
||||
function math.round(num, numDecimalPlaces)
|
||||
return tonumber(string.format("%." .. (numDecimalPlaces or 0) .. "f", num))
|
||||
end
|
||||
|
||||
function tobool(input)
|
||||
if input == "true" or tonumber(input) == 1 or input == true then
|
||||
return true
|
||||
else
|
||||
return false
|
||||
end
|
||||
end
|
||||
|
||||
function string.split(inputstr, sep)
|
||||
if sep == nil then
|
||||
sep = "%s"
|
||||
end
|
||||
local t={} ; i=1
|
||||
for str in string.gmatch(inputstr, "([^"..sep.."]+)") do
|
||||
t[i] = str
|
||||
i = i + 1
|
||||
end
|
||||
|
||||
return t
|
||||
end
|
||||
|
||||
function string.starts(String, Start)
|
||||
return string.sub(String, 1, string.len(Start)) == Start
|
||||
end
|
||||
|
||||
function IsMouseInBounds(X, Y, Width, Height)
|
||||
local MX, MY = math.round(GetControlNormal(0, 239) * 1920), math.round(GetControlNormal(0, 240) * 1080)
|
||||
MX, MY = FormatXWYH(MX, MY)
|
||||
X, Y = FormatXWYH(X, Y)
|
||||
Width, Height = FormatXWYH(Width, Height)
|
||||
return (MX >= X and MX <= X + Width) and (MY > Y and MY < Y + Height)
|
||||
end
|
||||
|
||||
function GetSafeZoneBounds()
|
||||
local SafeSize = GetSafeZoneSize()
|
||||
SafeSize = math.round(SafeSize, 2)
|
||||
SafeSize = (SafeSize * 100) - 90
|
||||
SafeSize = 10 - SafeSize
|
||||
|
||||
local W, H = 1920, 1080
|
||||
|
||||
return {X = math.round(SafeSize * ((W/H) * 5.4)), Y = math.round(SafeSize * 5.4)}
|
||||
end
|
||||
|
||||
function Controller()
|
||||
return not IsInputDisabled(2)
|
||||
end
|
||||
|
||||
--[[
|
||||
|
||||
function UIMenu:ProcessMouse()
|
||||
if not self._Visible or self.JustOpened or #self.Items == 0 or tobool(Controller()) or not self.Settings.MouseControlsEnabled then
|
||||
EnableControlAction(0, 2, true)
|
||||
EnableControlAction(0, 1, true)
|
||||
EnableControlAction(0, 25, true)
|
||||
EnableControlAction(0, 24, true)
|
||||
if self.Dirty then
|
||||
for _, Item in pairs(self.Items) do
|
||||
if Item:Hovered() then
|
||||
Item:Hovered(false)
|
||||
end
|
||||
end
|
||||
end
|
||||
return
|
||||
end
|
||||
|
||||
local SafeZone = GetSafeZoneBounds()
|
||||
|
||||
local Limit = #self.Items - 1
|
||||
local Counter = 0
|
||||
|
||||
ShowCursorThisFrame()
|
||||
|
||||
if #self.Items > self.Pagination.Total + 1 then
|
||||
Limit = self.Pagination.Max
|
||||
end
|
||||
|
||||
if IsMouseInBounds(0, 0, 30, 1080) and self.Settings.MouseEdgeEnabled then
|
||||
SetGameplayCamRelativeHeading(GetGameplayCamRelativeHeading() + 5)
|
||||
SetCursorSprite(6)
|
||||
elseif IsMouseInBounds(GetScreenResolutionMaintainRatio().Width - 30, 0, 30, 1080) and self.Settings.MouseEdgeEnabled then
|
||||
SetGameplayCamRelativeHeading(GetGameplayCamRelativeHeading() - 5)
|
||||
SetCursorSprite(7)
|
||||
elseif self.Settings.MouseEdgeEnabled then
|
||||
SetCursorSprite(1)
|
||||
end
|
||||
|
||||
for i = self.Pagination.Min + 1, Limit, 1 do
|
||||
local X, Y = self.Position.X, self.Position.Y + 144 - 37 + self.Subtitle.ExtraY + (Counter * 38)
|
||||
local Width, Height = 431 + self.WidthOffset, 38
|
||||
local Item = self.Items[i]
|
||||
local Type, SubType = Item()
|
||||
|
||||
DrawRectangle(X, Y, Width, Height, 255, 0, 0, 150)
|
||||
if SubType == "UIMenuListItem" or SubType == "UIMenuSliderItem" then
|
||||
DrawRectangle(Item.LeftArrow.X, Item.LeftArrow.Y, Item.LeftArrow.Width, Item.LeftArrow.Height, 0, 255, 0, 150)
|
||||
DrawRectangle(Item.RightArrow.X, Item.RightArrow.Y, Item.RightArrow.Width, Item.RightArrow.Height, 0, 255, 0, 150)
|
||||
end
|
||||
|
||||
if IsMouseInBounds(X, Y, Width, Height) then
|
||||
Item:Hovered(true)
|
||||
if IsDisabledControlJustPressed(0, 24) then
|
||||
if Item:Selected() and Item:Enabled() then
|
||||
if SubType == "UIMenuListItem" then
|
||||
if IsMouseInBounds(Item.LeftArrow.X, Item.LeftArrow.Y, Item.LeftArrow.Width, Item.LeftArrow.Height) then
|
||||
self:GoLeft()
|
||||
elseif not IsMouseInBounds(Item.RightArrow.X, Item.RightArrow.Y, Item.RightArrow.Width, Item.RightArrow.Height) then
|
||||
self:SelectItem()
|
||||
end
|
||||
if IsMouseInBounds(Item.RightArrow.X, Item.RightArrow.Y, Item.RightArrow.Width, Item.RightArrow.Height) then
|
||||
self:GoRight()
|
||||
elseif not IsMouseInBounds(Item.LeftArrow.X, Item.LeftArrow.Y, Item.LeftArrow.Width, Item.LeftArrow.Height) then
|
||||
self:SelectItem()
|
||||
end
|
||||
elseif SubType == "UIMenuSliderItem" then
|
||||
if IsMouseInBounds(Item.LeftArrow.X, Item.LeftArrow.Y, Item.LeftArrow.Width, Item.LeftArrow.Height) then
|
||||
self:GoLeft()
|
||||
elseif not IsMouseInBounds(Item.RightArrow.X, Item.RightArrow.Y, Item.RightArrow.Width, Item.RightArrow.Height) then
|
||||
self:SelectItem()
|
||||
end
|
||||
if IsMouseInBounds(Item.RightArrow.X, Item.RightArrow.Y, Item.RightArrow.Width, Item.RightArrow.Height) then
|
||||
self:GoRight()
|
||||
elseif not IsMouseInBounds(Item.LeftArrow.X, Item.LeftArrow.Y, Item.LeftArrow.Width, Item.LeftArrow.Height) then
|
||||
self:SelectItem()
|
||||
end
|
||||
else
|
||||
self:SelectItem()
|
||||
end
|
||||
elseif not Item:Selected() then
|
||||
self:CurrentSelection(i-1)
|
||||
PlaySoundFrontend(-1, self.Settings.Audio.Error, self.Settings.Audio.Library, true)
|
||||
self.OnIndexChange(self, self:CurrentSelection())
|
||||
self.ReDraw = true
|
||||
elseif not Item:Enabled() and Item:Selected() then
|
||||
PlaySoundFrontend(-1, self.Settings.Audio.Error, self.Settings.Audio.Library, true)
|
||||
end
|
||||
end
|
||||
else
|
||||
Item:Hovered(false)
|
||||
end
|
||||
Counter = Counter + 1
|
||||
end
|
||||
|
||||
local ExtraX, ExtraY = self.Position.X, 144 + 38 * (self.Pagination.Total + 1) + self.Position.Y - 37 + self.Subtitle.ExtraY
|
||||
|
||||
if #self.Items <= self.Pagination.Total + 1 then return end
|
||||
|
||||
if IsMouseInBounds(ExtraX, ExtraY, 431 + self.WidthOffset, 18) then
|
||||
self.Extra.Up:Colour(30, 30, 30, 255)
|
||||
if IsDisabledControlJustPressed(0, 24) then
|
||||
if #self.Items > self.Pagination.Total + 1 then
|
||||
self:GoUpOverflow()
|
||||
else
|
||||
self:GoUp()
|
||||
end
|
||||
end
|
||||
else
|
||||
self.Extra.Up:Colour(0, 0, 0, 200)
|
||||
end
|
||||
|
||||
if IsMouseInBounds(ExtraX, ExtraY + 18, 431 + self.WidthOffset, 18) then
|
||||
self.Extra.Down:Colour(30, 30, 30, 255)
|
||||
if IsDisabledControlJustReleased(0, 24) then
|
||||
if #self.Items > self.Pagination.Total + 1 then
|
||||
self:GoDownOverflow()
|
||||
else
|
||||
self:GoDown()
|
||||
end
|
||||
end
|
||||
else
|
||||
self.Extra.Down:Colour(0, 0, 0, 200)
|
||||
end
|
||||
end
|
||||
--]]
|
||||
@@ -0,0 +1,32 @@
|
||||
resource_manifest_version '05cfa83c-a124-4cfa-a768-c24a5811d8f9'
|
||||
|
||||
--[[
|
||||
--All items unpacked
|
||||
|
||||
client_scripts {
|
||||
"Utils.lua",
|
||||
"elements/UIResRectangle.lua",
|
||||
"elements/UIResText.lua",
|
||||
"elements/Sprite.lua",
|
||||
"elements/StringMeasurer.lua",
|
||||
"elements/Badge.lua",
|
||||
"elements/Colours.lua",
|
||||
"items/UIMenuItem.lua",
|
||||
"items/UIMenuCheckboxItem.lua",
|
||||
"items/UIMenuListItem.lua",
|
||||
"items/UIMenuSliderItem.lua",
|
||||
"items/UIMenuColouredItem.lua",
|
||||
"items/UIMenuprogressItem.lua",
|
||||
"windows/UIMenuHeritageWindow.lua",
|
||||
"panels/UIMenuGridPanel.lua",
|
||||
"panels/UIMenuColourPanel.lua",
|
||||
"panels/UIMenuPercentagePanel.lua",
|
||||
"UIMenu.lua",
|
||||
"MenuPool.lua",
|
||||
"MenuExample.lua",
|
||||
}
|
||||
|
||||
--All items packed
|
||||
--]]
|
||||
|
||||
client_script "NativeUI.lua"
|
||||
@@ -0,0 +1,211 @@
|
||||
BadgeStyle = {
|
||||
None = 0,
|
||||
BronzeMedal = 1,
|
||||
GoldMedal = 2,
|
||||
SilverMedal = 3,
|
||||
Alert = 4,
|
||||
Crown = 5,
|
||||
Ammo = 6,
|
||||
Armour = 7,
|
||||
Barber = 8,
|
||||
Clothes = 9,
|
||||
Franklin = 10,
|
||||
Bike = 11,
|
||||
Car = 12,
|
||||
Gun = 13,
|
||||
Heart = 14,
|
||||
Makeup = 15,
|
||||
Mask = 16,
|
||||
Michael = 17,
|
||||
Star = 18,
|
||||
Tattoo = 19,
|
||||
Trevor = 20,
|
||||
Lock = 21,
|
||||
Tick = 22
|
||||
}
|
||||
|
||||
BadgeTexture = {
|
||||
[0] = function()
|
||||
return ""
|
||||
end,
|
||||
[1] = function()
|
||||
return "mp_medal_bronze"
|
||||
end,
|
||||
[2] = function()
|
||||
return "mp_medal_gold"
|
||||
end,
|
||||
[3] = function()
|
||||
return "medal_silver"
|
||||
end,
|
||||
[4] = function()
|
||||
return "mp_alerttriangle"
|
||||
end,
|
||||
[5] = function()
|
||||
return "mp_hostcrown"
|
||||
end,
|
||||
[6] = function(Selected)
|
||||
if Selected then
|
||||
return "shop_ammo_icon_b"
|
||||
else
|
||||
return "shop_ammo_icon_a"
|
||||
end
|
||||
end,
|
||||
[7] = function(Selected)
|
||||
if Selected then
|
||||
return "shop_armour_icon_b"
|
||||
else
|
||||
return "shop_armour_icon_a"
|
||||
end
|
||||
end,
|
||||
[8] = function(Selected)
|
||||
if Selected then
|
||||
return "shop_barber_icon_b"
|
||||
else
|
||||
return "shop_barber_icon_a"
|
||||
end
|
||||
end,
|
||||
[9] = function(Selected)
|
||||
if Selected then
|
||||
return "shop_clothing_icon_b"
|
||||
else
|
||||
return "shop_clothing_icon_a"
|
||||
end
|
||||
end,
|
||||
[10] = function(Selected)
|
||||
if Selected then
|
||||
return "shop_franklin_icon_b"
|
||||
else
|
||||
return "shop_franklin_icon_a"
|
||||
end
|
||||
end,
|
||||
[11] = function(Selected)
|
||||
if Selected then
|
||||
return "shop_garage_bike_icon_b"
|
||||
else
|
||||
return "shop_garage_bike_icon_a"
|
||||
end
|
||||
end,
|
||||
[12] = function(Selected)
|
||||
if Selected then
|
||||
return "shop_garage_icon_b"
|
||||
else
|
||||
return "shop_garage_icon_a"
|
||||
end
|
||||
end,
|
||||
[13] = function(Selected)
|
||||
if Selected then
|
||||
return "shop_gunclub_icon_b"
|
||||
else
|
||||
return "shop_gunclub_icon_a"
|
||||
end
|
||||
end,
|
||||
[14] = function(Selected)
|
||||
if Selected then
|
||||
return "shop_health_icon_b"
|
||||
else
|
||||
return "shop_health_icon_a"
|
||||
end
|
||||
end,
|
||||
[15] = function(Selected)
|
||||
if Selected then
|
||||
return "shop_makeup_icon_b"
|
||||
else
|
||||
return "shop_makeup_icon_a"
|
||||
end
|
||||
end,
|
||||
[16] = function(Selected)
|
||||
if Selected then
|
||||
return "shop_mask_icon_b"
|
||||
else
|
||||
return "shop_mask_icon_a"
|
||||
end
|
||||
end,
|
||||
[17] = function(Selected)
|
||||
if Selected then
|
||||
return "shop_michael_icon_b"
|
||||
else
|
||||
return "shop_michael_icon_a"
|
||||
end
|
||||
end,
|
||||
[18] = function()
|
||||
return "shop_new_star"
|
||||
end,
|
||||
[19] = function(Selected)
|
||||
if Selected then
|
||||
return "shop_tattoos_icon_b"
|
||||
else
|
||||
return "shop_tattoos_icon_a"
|
||||
end
|
||||
end,
|
||||
[20] = function(Selected)
|
||||
if Selected then
|
||||
return "shop_trevor_icon_b"
|
||||
else
|
||||
return "shop_trevor_icon_a"
|
||||
end
|
||||
end,
|
||||
[21] = function()
|
||||
return "shop_lock"
|
||||
end,
|
||||
[22] = function()
|
||||
return "shop_tick_icon"
|
||||
end,
|
||||
}
|
||||
|
||||
BadgeDictionary = {
|
||||
[0] = function(Selected)
|
||||
if Selected then
|
||||
return "commonmenu"
|
||||
else
|
||||
return "commonmenu"
|
||||
end
|
||||
end,
|
||||
}
|
||||
|
||||
BadgeColour = {
|
||||
[5] = function(Selected)
|
||||
if Selected then
|
||||
return 0, 0, 0, 255
|
||||
else
|
||||
return 255, 255, 255, 255
|
||||
end
|
||||
end,
|
||||
[21] = function(Selected)
|
||||
if Selected then
|
||||
return 0, 0, 0, 255
|
||||
else
|
||||
return 255, 255, 255, 255
|
||||
end
|
||||
end,
|
||||
[22] = function(Selected)
|
||||
if Selected then
|
||||
return 0, 0, 0, 255
|
||||
else
|
||||
return 255, 255, 255, 255
|
||||
end
|
||||
end,
|
||||
}
|
||||
|
||||
function GetBadgeTexture(Badge, Selected)
|
||||
if BadgeTexture[Badge] then
|
||||
return BadgeTexture[Badge](Selected)
|
||||
else
|
||||
return ""
|
||||
end
|
||||
end
|
||||
|
||||
function GetBadgeDictionary(Badge, Selected)
|
||||
if BadgeDictionary[Badge] then
|
||||
return BadgeDictionary[Badge](Selected)
|
||||
else
|
||||
return "commonmenu"
|
||||
end
|
||||
end
|
||||
|
||||
function GetBadgeColour(Badge, Selected)
|
||||
if BadgeColour[Badge] then
|
||||
return BadgeColour[Badge](Selected)
|
||||
else
|
||||
return 255, 255, 255, 255
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,218 @@
|
||||
Colours = {
|
||||
PureWhite = {255, 255, 255, 255},
|
||||
White = {240, 240, 240, 255},
|
||||
Black = {0, 0, 0, 255},
|
||||
Grey = {155, 155, 155, 255},
|
||||
GreyLight = {205, 205, 205, 255},
|
||||
GreyDark = {77, 77, 77, 255},
|
||||
Red = {224, 50, 50, 255},
|
||||
RedLight = {240, 153, 153, 255},
|
||||
RedDark = {112, 25, 25, 255},
|
||||
Blue = {93, 182, 229, 255},
|
||||
BlueLight = {174, 219, 242, 255},
|
||||
BlueDark = {47, 92, 115, 255},
|
||||
Yellow = {240, 200, 80, 255},
|
||||
YellowLight = {254, 235, 169, 255},
|
||||
YellowDark = {126, 107, 41, 255},
|
||||
Orange = {255, 133, 85, 255},
|
||||
OrangeLight = {255, 194, 170, 255},
|
||||
OrangeDark = {127, 66, 42, 255},
|
||||
Green = {114, 204, 114, 255},
|
||||
GreenLight = {185, 230, 185, 255},
|
||||
GreenDark = {57, 102, 57, 255},
|
||||
Purple = {132, 102, 226, 255},
|
||||
PurpleLight = {192, 179, 239, 255},
|
||||
PurpleDark = {67, 57, 111, 255},
|
||||
Pink = {203, 54, 148, 255},
|
||||
RadarHealth = {53, 154, 71, 255},
|
||||
RadarArmour = {93, 182, 229, 255},
|
||||
RadarDamage = {235, 36, 39, 255},
|
||||
NetPlayer1 = {194, 80, 80, 255},
|
||||
NetPlayer2 = {156, 110, 175, 255},
|
||||
NetPlayer3 = {255, 123, 196, 255},
|
||||
NetPlayer4 = {247, 159, 123, 255},
|
||||
NetPlayer5 = {178, 144, 132, 255},
|
||||
NetPlayer6 = {141, 206, 167, 255},
|
||||
NetPlayer7 = {113, 169, 175, 255},
|
||||
NetPlayer8 = {211, 209, 231, 255},
|
||||
NetPlayer9 = {144, 127, 153, 255},
|
||||
NetPlayer10 = {106, 196, 191, 255},
|
||||
NetPlayer11 = {214, 196, 153, 255},
|
||||
NetPlayer12 = {234, 142, 80, 255},
|
||||
NetPlayer13 = {152, 203, 234, 255},
|
||||
NetPlayer14 = {178, 98, 135, 255},
|
||||
NetPlayer15 = {144, 142, 122, 255},
|
||||
NetPlayer16 = {166, 117, 94, 255},
|
||||
NetPlayer17 = {175, 168, 168, 255},
|
||||
NetPlayer18 = {232, 142, 155, 255},
|
||||
NetPlayer19 = {187, 214, 91, 255},
|
||||
NetPlayer20 = {12, 123, 86, 255},
|
||||
NetPlayer21 = {123, 196, 255, 255},
|
||||
NetPlayer22 = {171, 60, 230, 255},
|
||||
NetPlayer23 = {206, 169, 13, 255},
|
||||
NetPlayer24 = {71, 99, 173, 255},
|
||||
NetPlayer25 = {42, 166, 185, 255},
|
||||
NetPlayer26 = {186, 157, 125, 255},
|
||||
NetPlayer27 = {201, 225, 255, 255},
|
||||
NetPlayer28 = {240, 240, 150, 255},
|
||||
NetPlayer29 = {237, 140, 161, 255},
|
||||
NetPlayer30 = {249, 138, 138, 255},
|
||||
NetPlayer31 = {252, 239, 166, 255},
|
||||
NetPlayer32 = {240, 240, 240, 255},
|
||||
SimpleBlipDefault = {159, 201, 166, 255},
|
||||
MenuBlue = {140, 140, 140, 255},
|
||||
MenuGreyLight = {140, 140, 140, 255},
|
||||
MenuBlueExtraDark = {40, 40, 40, 255},
|
||||
MenuYellow = {240, 160, 0, 255},
|
||||
MenuYellowDark = {240, 160, 0, 255},
|
||||
MenuGreen = {240, 160, 0, 255},
|
||||
MenuGrey = {140, 140, 140, 255},
|
||||
MenuGreyDark = {60, 60, 60, 255},
|
||||
MenuHighlight = {30, 30, 30, 255},
|
||||
MenuStandard = {140, 140, 140, 255},
|
||||
MenuDimmed = {75, 75, 75, 255},
|
||||
MenuExtraDimmed = {50, 50, 50, 255},
|
||||
BriefTitle = {95, 95, 95, 255},
|
||||
MidGreyMp = {100, 100, 100, 255},
|
||||
NetPlayer1Dark = {93, 39, 39, 255},
|
||||
NetPlayer2Dark = {77, 55, 89, 255},
|
||||
NetPlayer3Dark = {124, 62, 99, 255},
|
||||
NetPlayer4Dark = {120, 80, 80, 255},
|
||||
NetPlayer5Dark = {87, 72, 66, 255},
|
||||
NetPlayer6Dark = {74, 103, 83, 255},
|
||||
NetPlayer7Dark = {60, 85, 88, 255},
|
||||
NetPlayer8Dark = {105, 105, 64, 255},
|
||||
NetPlayer9Dark = {72, 63, 76, 255},
|
||||
NetPlayer10Dark = {53, 98, 95, 255},
|
||||
NetPlayer11Dark = {107, 98, 76, 255},
|
||||
NetPlayer12Dark = {117, 71, 40, 255},
|
||||
NetPlayer13Dark = {76, 101, 117, 255},
|
||||
NetPlayer14Dark = {65, 35, 47, 255},
|
||||
NetPlayer15Dark = {72, 71, 61, 255},
|
||||
NetPlayer16Dark = {85, 58, 47, 255},
|
||||
NetPlayer17Dark = {87, 84, 84, 255},
|
||||
NetPlayer18Dark = {116, 71, 77, 255},
|
||||
NetPlayer19Dark = {93, 107, 45, 255},
|
||||
NetPlayer20Dark = {6, 61, 43, 255},
|
||||
NetPlayer21Dark = {61, 98, 127, 255},
|
||||
NetPlayer22Dark = {85, 30, 115, 255},
|
||||
NetPlayer23Dark = {103, 84, 6, 255},
|
||||
NetPlayer24Dark = {35, 49, 86, 255},
|
||||
NetPlayer25Dark = {21, 83, 92, 255},
|
||||
NetPlayer26Dark = {93, 98, 62, 255},
|
||||
NetPlayer27Dark = {100, 112, 127, 255},
|
||||
NetPlayer28Dark = {120, 120, 75, 255},
|
||||
NetPlayer29Dark = {152, 76, 93, 255},
|
||||
NetPlayer30Dark = {124, 69, 69, 255},
|
||||
NetPlayer31Dark = {10, 43, 50, 255},
|
||||
NetPlayer32Dark = {95, 95, 10, 255},
|
||||
Bronze = {180, 130, 97, 255},
|
||||
Silver = {150, 153, 161, 255},
|
||||
Gold = {214, 181, 99, 255},
|
||||
Platinum = {166, 221, 190, 255},
|
||||
Gang1 = {29, 100, 153, 255},
|
||||
Gang2 = {214, 116, 15, 255},
|
||||
Gang3 = {135, 125, 142, 255},
|
||||
Gang4 = {229, 119, 185, 255},
|
||||
SameCrew = {252, 239, 166, 255},
|
||||
Freemode = {45, 110, 185, 255},
|
||||
PauseBg = {0, 0, 0, 255},
|
||||
Friendly = {93, 182, 229, 255},
|
||||
Enemy = {194, 80, 80, 255},
|
||||
Location = {240, 200, 80, 255},
|
||||
Pickup = {114, 204, 114, 255},
|
||||
PauseSingleplayer = {114, 204, 114, 255},
|
||||
FreemodeDark = {22, 55, 92, 255},
|
||||
InactiveMission = {154, 154, 154, 255},
|
||||
Damage = {194, 80, 80, 255},
|
||||
PinkLight = {252, 115, 201, 255},
|
||||
PmMitemHighlight = {252, 177, 49, 255},
|
||||
ScriptVariable = {0, 0, 0, 255},
|
||||
Yoga = {109, 247, 204, 255},
|
||||
Tennis = {241, 101, 34, 255},
|
||||
Golf = {214, 189, 97, 255},
|
||||
ShootingRange = {112, 25, 25, 255},
|
||||
FlightSchool = {47, 92, 115, 255},
|
||||
NorthBlue = {93, 182, 229, 255},
|
||||
SocialClub = {234, 153, 28, 255},
|
||||
PlatformBlue = {11, 55, 123, 255},
|
||||
PlatformGreen = {146, 200, 62, 255},
|
||||
PlatformGrey = {234, 153, 28, 255},
|
||||
FacebookBlue = {66, 89, 148, 255},
|
||||
IngameBg = {0, 0, 0, 255},
|
||||
Darts = {114, 204, 114, 255},
|
||||
Waypoint = {164, 76, 242, 255},
|
||||
Michael = {101, 180, 212, 255},
|
||||
Franklin = {171, 237, 171, 255},
|
||||
Trevor = {255, 163, 87, 255},
|
||||
GolfP1 = {240, 240, 240, 255},
|
||||
GolfP2 = {235, 239, 30, 255},
|
||||
GolfP3 = {255, 149, 14, 255},
|
||||
GolfP4 = {246, 60, 161, 255},
|
||||
WaypointLight = {210, 166, 249, 255},
|
||||
WaypointDark = {82, 38, 121, 255},
|
||||
PanelLight = {0, 0, 0, 255},
|
||||
MichaelDark = {72, 103, 116, 255},
|
||||
FranklinDark = {85, 118, 85, 255},
|
||||
TrevorDark = {127, 81, 43, 255},
|
||||
ObjectiveRoute = {240, 200, 80, 255},
|
||||
PausemapTint = {0, 0, 0, 255},
|
||||
PauseDeselect = {100, 100, 100, 255},
|
||||
PmWeaponsPurchasable = {45, 110, 185, 255},
|
||||
PmWeaponsLocked = {240, 240, 240, 255},
|
||||
ScreenBg = {0, 0, 0, 255},
|
||||
Chop = {224, 50, 50, 255},
|
||||
PausemapTintHalf = {0, 0, 0, 255},
|
||||
NorthBlueOfficial = {0, 71, 133, 255},
|
||||
ScriptVariable2 = {0, 0, 0, 255},
|
||||
H = {33, 118, 37, 255},
|
||||
HDark = {37, 102, 40, 255},
|
||||
T = {234, 153, 28, 255},
|
||||
TDark = {225, 140, 8, 255},
|
||||
HShard = {20, 40, 0, 255},
|
||||
ControllerMichael = {48, 255, 255, 255},
|
||||
ControllerFranklin = {48, 255, 0, 255},
|
||||
ControllerTrevor = {176, 80, 0, 255},
|
||||
ControllerChop = {127, 0, 0, 255},
|
||||
VideoEditorVideo = {53, 166, 224, 255},
|
||||
VideoEditorAudio = {162, 79, 157, 255},
|
||||
VideoEditorText = {104, 192, 141, 255},
|
||||
HbBlue = {29, 100, 153, 255},
|
||||
HbYellow = {234, 153, 28, 255},
|
||||
VideoEditorScore = {240, 160, 1, 255},
|
||||
VideoEditorAudioFadeout = {59, 34, 57, 255},
|
||||
VideoEditorTextFadeout = {41, 68, 53, 255},
|
||||
VideoEditorScoreFadeout = {82, 58, 10, 255},
|
||||
HeistBackground = {37, 102, 40, 255},
|
||||
VideoEditorAmbient = {240, 200, 80, 255},
|
||||
VideoEditorAmbientFadeout = {80, 70, 34, 255},
|
||||
Gb = {255, 133, 85, 255},
|
||||
G = {255, 194, 170, 255},
|
||||
B = {255, 133, 85, 255},
|
||||
LowFlow = {240, 200, 80, 255},
|
||||
LowFlowDark = {126, 107, 41, 255},
|
||||
G1 = {247, 159, 123, 255},
|
||||
G2 = {226, 134, 187, 255},
|
||||
G3 = {239, 238, 151, 255},
|
||||
G4 = {113, 169, 175, 255},
|
||||
G5 = {160, 140, 193, 255},
|
||||
G6 = {141, 206, 167, 255},
|
||||
G7 = {181, 214, 234, 255},
|
||||
G8 = {178, 144, 132, 255},
|
||||
G9 = {0, 132, 114, 255},
|
||||
G10 = {216, 85, 117, 255},
|
||||
G11 = {30, 100, 152, 255},
|
||||
G12 = {43, 181, 117, 255},
|
||||
G13 = {233, 141, 79, 255},
|
||||
G14 = {137, 210, 215, 255},
|
||||
G15 = {134, 125, 141, 255},
|
||||
Adversary = {109, 34, 33, 255},
|
||||
DegenRed = {255, 0, 0, 255},
|
||||
DegenYellow = {255, 255, 0, 255},
|
||||
DegenGreen = {0, 255, 0, 255},
|
||||
DegenCyan = {0, 255, 255, 255},
|
||||
DegenBlue = {0, 0, 255, 255},
|
||||
DegenMagenta = {255, 0, 255, 255},
|
||||
Stunt1 = {38, 136, 234, 255},
|
||||
Stunt2 = {224, 50, 50, 255},
|
||||
}
|
||||
@@ -0,0 +1,67 @@
|
||||
Sprite = setmetatable({}, Sprite)
|
||||
Sprite.__index = Sprite
|
||||
Sprite.__call = function() return "Sprite" end
|
||||
|
||||
function Sprite.New(TxtDictionary, TxtName, X, Y, Width, Height, Heading, R, G, B, A)
|
||||
local _Sprite = {
|
||||
TxtDictionary = tostring(TxtDictionary),
|
||||
TxtName = tostring(TxtName),
|
||||
X = tonumber(X) or 0,
|
||||
Y = tonumber(Y) or 0,
|
||||
Width = tonumber(Width) or 0,
|
||||
Height = tonumber(Height) or 0,
|
||||
Heading = tonumber(Heading) or 0,
|
||||
_Colour = {R = tonumber(R) or 255, G = tonumber(G) or 255, B = tonumber(B) or 255, A = tonumber(A) or 255},
|
||||
}
|
||||
return setmetatable(_Sprite, Sprite)
|
||||
end
|
||||
|
||||
function Sprite:Position(X, Y)
|
||||
if tonumber(X) and tonumber(Y) then
|
||||
self.X = tonumber(X)
|
||||
self.Y = tonumber(Y)
|
||||
else
|
||||
return {X = self.X, Y = self.Y}
|
||||
end
|
||||
end
|
||||
|
||||
function Sprite:Size(Width, Height)
|
||||
if tonumber(Width) and tonumber(Width) then
|
||||
self.Width = tonumber(Width)
|
||||
self.Height = tonumber(Height)
|
||||
else
|
||||
return {Width = self.Width, Height = self.Height}
|
||||
end
|
||||
end
|
||||
|
||||
function Sprite:Colour(R, G, B, A)
|
||||
if tonumber(R) or tonumber(G) or tonumber(B) or tonumber(A) then
|
||||
self._Colour.R = tonumber(R) or 255
|
||||
self._Colour.B = tonumber(B) or 255
|
||||
self._Colour.G = tonumber(G) or 255
|
||||
self._Colour.A = tonumber(A) or 255
|
||||
else
|
||||
return self._Colour
|
||||
end
|
||||
end
|
||||
|
||||
function Sprite:Draw()
|
||||
if not HasStreamedTextureDictLoaded(self.TxtDictionary) then
|
||||
RequestStreamedTextureDict(self.TxtDictionary, true)
|
||||
end
|
||||
local Position = self:Position()
|
||||
local Size = self:Size()
|
||||
Size.Width, Size.Height = FormatXWYH(Size.Width, Size.Height)
|
||||
Position.X, Position.Y = FormatXWYH(Position.X, Position.Y)
|
||||
DrawSprite(self.TxtDictionary, self.TxtName, Position.X + Size.Width * 0.5, Position.Y + Size.Height * 0.5, Size.Width, Size.Height, self.Heading, self._Colour.R, self._Colour.G, self._Colour.B, self._Colour.A)
|
||||
end
|
||||
|
||||
function DrawTexture(TxtDictionary, TxtName, X, Y, Width, Height, Heading, R, G, B, A)
|
||||
if not HasStreamedTextureDictLoaded(tostring(TxtDictionary) or "") then
|
||||
RequestStreamedTextureDict(tostring(TxtDictionary) or "", true)
|
||||
end
|
||||
X, Y, Width, Height = X or 0, Y or 0, Width or 0, Height or 0
|
||||
X, Y = FormatXWYH(X, Y)
|
||||
Width, Height = FormatXWYH(Width, Height)
|
||||
DrawSprite(tostring(TxtDictionary) or "", tostring(TxtName) or "", X + Width * 0.5, Y + Height * 0.5, Width, Height, tonumber(Heading) or 0, tonumber(R) or 255, tonumber(G) or 255, tonumber(B) or 255, tonumber(A) or 255)
|
||||
end
|
||||
@@ -0,0 +1,105 @@
|
||||
CharacterMap = {
|
||||
[' '] = 6,
|
||||
['!'] = 6,
|
||||
['"'] = 6,
|
||||
['#'] = 11,
|
||||
['$'] = 10,
|
||||
['%'] = 17,
|
||||
['&'] = 13,
|
||||
['\\'] = 4,
|
||||
['('] = 6,
|
||||
[')'] = 6,
|
||||
['*'] = 7,
|
||||
['+'] = 10,
|
||||
[','] = 4,
|
||||
['-'] = 6,
|
||||
['.'] = 4,
|
||||
['/'] = 7,
|
||||
['0'] = 12,
|
||||
['1'] = 7,
|
||||
['2'] = 11,
|
||||
['3'] = 11,
|
||||
['4'] = 11,
|
||||
['5'] = 11,
|
||||
['6'] = 12,
|
||||
['7'] = 10,
|
||||
['8'] = 11,
|
||||
['9'] = 11,
|
||||
[':'] = 5,
|
||||
[';'] = 4,
|
||||
['<'] = 9,
|
||||
['='] = 9,
|
||||
['>'] = 9,
|
||||
['?'] = 10,
|
||||
['@'] = 15,
|
||||
['A'] = 12,
|
||||
['B'] = 13,
|
||||
['C'] = 14,
|
||||
['D'] = 14,
|
||||
['E'] = 12,
|
||||
['F'] = 12,
|
||||
['G'] = 15,
|
||||
['H'] = 14,
|
||||
['I'] = 5,
|
||||
['J'] = 11,
|
||||
['K'] = 13,
|
||||
['L'] = 11,
|
||||
['M'] = 16,
|
||||
['N'] = 14,
|
||||
['O'] = 16,
|
||||
['P'] = 12,
|
||||
['Q'] = 15,
|
||||
['R'] = 13,
|
||||
['S'] = 12,
|
||||
['T'] = 11,
|
||||
['U'] = 13,
|
||||
['V'] = 12,
|
||||
['W'] = 18,
|
||||
['X'] = 11,
|
||||
['Y'] = 11,
|
||||
['Z'] = 12,
|
||||
['['] = 6,
|
||||
[']'] = 6,
|
||||
['^'] = 9,
|
||||
['_'] = 18,
|
||||
['`'] = 8,
|
||||
['a'] = 11,
|
||||
['b'] = 12,
|
||||
['c'] = 11,
|
||||
['d'] = 12,
|
||||
['e'] = 12,
|
||||
['f'] = 5,
|
||||
['g'] = 13,
|
||||
['h'] = 11,
|
||||
['i'] = 4,
|
||||
['j'] = 4,
|
||||
['k'] = 10,
|
||||
['l'] = 4,
|
||||
['m'] = 18,
|
||||
['n'] = 11,
|
||||
['o'] = 12,
|
||||
['p'] = 12,
|
||||
['q'] = 12,
|
||||
['r'] = 7,
|
||||
['s'] = 9,
|
||||
['t'] = 5,
|
||||
['u'] = 11,
|
||||
['v'] = 10,
|
||||
['w'] = 14,
|
||||
['x'] = 9,
|
||||
['y'] = 10,
|
||||
['z'] = 9,
|
||||
['{'] = 6,
|
||||
['|'] = 3,
|
||||
['}'] = 6,
|
||||
}
|
||||
|
||||
function MeasureString(str)
|
||||
local output = 0
|
||||
for i = 1, GetCharacterCount(str), 1 do
|
||||
if CharacterMap[string.sub(str, i, i)] then
|
||||
output = output + CharacterMap[string.sub(str, i, i)] + 1
|
||||
end
|
||||
end
|
||||
return output
|
||||
end
|
||||
@@ -0,0 +1,58 @@
|
||||
UIResRectangle = setmetatable({}, UIResRectangle)
|
||||
UIResRectangle.__index = UIResRectangle
|
||||
UIResRectangle.__call = function() return "Rectangle" end
|
||||
|
||||
function UIResRectangle.New(X, Y, Width, Height, R, G, B, A)
|
||||
local _UIResRectangle = {
|
||||
X = tonumber(X) or 0,
|
||||
Y = tonumber(Y) or 0,
|
||||
Width = tonumber(Width) or 0,
|
||||
Height = tonumber(Height) or 0,
|
||||
_Colour = {R = tonumber(R) or 255, G = tonumber(G) or 255, B = tonumber(B) or 255, A = tonumber(A) or 255},
|
||||
}
|
||||
return setmetatable(_UIResRectangle, UIResRectangle)
|
||||
end
|
||||
|
||||
function UIResRectangle:Position(X, Y)
|
||||
if tonumber(X) and tonumber(Y) then
|
||||
self.X = tonumber(X)
|
||||
self.Y = tonumber(Y)
|
||||
else
|
||||
return {X = self.X, Y = self.Y}
|
||||
end
|
||||
end
|
||||
|
||||
function UIResRectangle:Size(Width, Height)
|
||||
if tonumber(Width) and tonumber(Height) then
|
||||
self.Width = tonumber(Width)
|
||||
self.Height = tonumber(Height)
|
||||
else
|
||||
return {Width = self.Width, Height = self.Height}
|
||||
end
|
||||
end
|
||||
|
||||
function UIResRectangle:Colour(R, G, B, A)
|
||||
if tonumber(R) or tonumber(G) or tonumber(B) or tonumber(A) then
|
||||
self._Colour.R = tonumber(R) or 255
|
||||
self._Colour.B = tonumber(B) or 255
|
||||
self._Colour.G = tonumber(G) or 255
|
||||
self._Colour.A = tonumber(A) or 255
|
||||
else
|
||||
return self._Colour
|
||||
end
|
||||
end
|
||||
|
||||
function UIResRectangle:Draw()
|
||||
local Position = self:Position()
|
||||
local Size = self:Size()
|
||||
Size.Width, Size.Height = FormatXWYH(Size.Width, Size.Height)
|
||||
Position.X, Position.Y = FormatXWYH(Position.X, Position.Y)
|
||||
DrawRect(Position.X + Size.Width * 0.5, Position.Y + Size.Height * 0.5, Size.Width, Size.Height, self._Colour.R, self._Colour.G, self._Colour.B, self._Colour.A)
|
||||
end
|
||||
|
||||
function DrawRectangle(X, Y, Width, Height, R, G, B, A)
|
||||
X, Y, Width, Height = X or 0, Y or 0, Width or 0, Height or 0
|
||||
X, Y = FormatXWYH(X, Y)
|
||||
Width, Height = FormatXWYH(Width, Height)
|
||||
DrawRect(X + Width * 0.5, Y + Height * 0.5, Width, Height, tonumber(R) or 255, tonumber(G) or 255, tonumber(B) or 255, tonumber(A) or 255)
|
||||
end
|
||||
@@ -0,0 +1,199 @@
|
||||
UIResText = setmetatable({}, UIResText)
|
||||
UIResText.__index = UIResText
|
||||
UIResText.__call = function() return "Text" end
|
||||
|
||||
function GetCharacterCount(str)
|
||||
local characters = 0
|
||||
for c in str:gmatch("[%z\1-\127\194-\244][\128-\191]*") do
|
||||
local a = c:byte(1, -1)
|
||||
if a ~= nil then
|
||||
characters = characters + 1
|
||||
end
|
||||
end
|
||||
return characters
|
||||
end
|
||||
|
||||
function GetByteCount(str)
|
||||
local bytes = 0
|
||||
|
||||
for c in str:gmatch("[%z\1-\127\194-\244][\128-\191]*") do
|
||||
local a,b,c,d = c:byte(1, -1)
|
||||
if a ~= nil then
|
||||
bytes = bytes + 1
|
||||
end
|
||||
if b ~= nil then
|
||||
bytes = bytes + 1
|
||||
end
|
||||
if c ~= nil then
|
||||
bytes = bytes + 1
|
||||
end
|
||||
if d ~= nil then
|
||||
bytes = bytes + 1
|
||||
end
|
||||
end
|
||||
return bytes
|
||||
end
|
||||
|
||||
function AddLongStringForAscii(str)
|
||||
local maxbytelength = 99
|
||||
for i = 0, GetCharacterCount(str), 99 do
|
||||
AddTextComponentSubstringPlayerName(string.sub(str, i, math.min(maxbytelength, GetCharacterCount(str) - i))) --needs changed
|
||||
end
|
||||
end
|
||||
|
||||
function AddLongStringForUtf8(str)
|
||||
local maxbytelength = 99
|
||||
local bytecount = GetByteCount(str)
|
||||
|
||||
if bytecount < maxbytelength then
|
||||
AddTextComponentSubstringPlayerName(str)
|
||||
return
|
||||
end
|
||||
|
||||
local startIndex = 0
|
||||
|
||||
for i = 0, GetCharacterCount(str), 1 do
|
||||
local length = i - startIndex
|
||||
if GetByteCount(string.sub(str, startIndex, length)) > maxbytelength then
|
||||
AddTextComponentSubstringPlayerName(string.sub(str, startIndex, length - 1))
|
||||
i = i - 1
|
||||
startIndex = startIndex + (length - 1)
|
||||
end
|
||||
end
|
||||
AddTextComponentSubstringPlayerName(string.sub(str, startIndex, GetCharacterCount(str) - startIndex))
|
||||
end
|
||||
|
||||
function AddLongString(str)
|
||||
local bytecount = GetByteCount(str)
|
||||
if bytecount == GetCharacterCount(str) then
|
||||
AddLongStringForAscii(str)
|
||||
else
|
||||
AddLongStringForUtf8(str)
|
||||
end
|
||||
end
|
||||
|
||||
function MeasureStringWidthNoConvert(str, font, scale)
|
||||
BeginTextCommandWidth("STRING")
|
||||
AddLongString(str)
|
||||
SetTextFont(font or 0)
|
||||
SetTextScale(1.0, scale or 0)
|
||||
return EndTextCommandGetWidth(true)
|
||||
end
|
||||
|
||||
function MeasureStringWidth(str, font, scale)
|
||||
return MeasureStringWidthNoConvert(str, font, scale) * 1920
|
||||
end
|
||||
|
||||
function UIResText.New(Text, X, Y, Scale, R, G, B, A, Font, Alignment, DropShadow, Outline, WordWrap)
|
||||
local _UIResText = {
|
||||
_Text = tostring(Text) or "",
|
||||
X = tonumber(X) or 0,
|
||||
Y = tonumber(Y) or 0,
|
||||
Scale = tonumber(Scale) or 0,
|
||||
_Colour = {R = tonumber(R) or 255, G = tonumber(G) or 255, B = tonumber(B) or 255, A = tonumber(A) or 255},
|
||||
Font = tonumber(Font) or 0,
|
||||
Alignment = Alignment or nil,
|
||||
DropShadow = Dropshadow or nil,
|
||||
Outline = Outline or nil,
|
||||
WordWrap = tonumber(WordWrap) or 0,
|
||||
}
|
||||
return setmetatable(_UIResText, UIResText)
|
||||
end
|
||||
|
||||
function UIResText:Position(X, Y)
|
||||
if tonumber(X) and tonumber(Y) then
|
||||
self.X = tonumber(X)
|
||||
self.Y = tonumber(Y)
|
||||
else
|
||||
return {X = self.X, Y = self.Y}
|
||||
end
|
||||
end
|
||||
|
||||
function UIResText:Colour(R, G, B, A)
|
||||
if tonumber(R) and tonumber(G) and tonumber(B) and tonumber(A) then
|
||||
self._Colour.R = tonumber(R)
|
||||
self._Colour.B = tonumber(B)
|
||||
self._Colour.G = tonumber(G)
|
||||
self._Colour.A = tonumber(A)
|
||||
else
|
||||
return self._Colour
|
||||
end
|
||||
end
|
||||
|
||||
function UIResText:Text(Text)
|
||||
if tostring(Text) and Text ~= nil then
|
||||
self._Text = tostring(Text)
|
||||
else
|
||||
return self._Text
|
||||
end
|
||||
end
|
||||
|
||||
function UIResText:Draw()
|
||||
local Position = self:Position()
|
||||
Position.X, Position.Y = FormatXWYH(Position.X, Position.Y)
|
||||
|
||||
SetTextFont(self.Font)
|
||||
SetTextScale(1.0, self.Scale)
|
||||
SetTextColour(self._Colour.R, self._Colour.G, self._Colour.B, self._Colour.A)
|
||||
|
||||
if self.DropShadow then
|
||||
SetTextDropShadow()
|
||||
end
|
||||
if self.Outline then
|
||||
SetTextOutline()
|
||||
end
|
||||
|
||||
if self.Alignment ~= nil then
|
||||
if self.Alignment == 1 or self.Alignment == "Center" or self.Alignment == "Centre" then
|
||||
SetTextCentre(true)
|
||||
elseif self.Alignment == 2 or self.Alignment == "Right" then
|
||||
SetTextRightJustify(true)
|
||||
SetTextWrap(0, Position.X)
|
||||
end
|
||||
end
|
||||
|
||||
if tonumber(self.WordWrap) then
|
||||
if tonumber(self.WordWrap) ~= 0 then
|
||||
SetTextWrap(Position.X, Position.X + (tonumber(self.WordWrap) / Resolution.Width))
|
||||
end
|
||||
end
|
||||
|
||||
BeginTextCommandDisplayText("STRING")
|
||||
AddLongString(self._Text)
|
||||
EndTextCommandDisplayText(Position.X, Position.Y)
|
||||
end
|
||||
|
||||
function RenderText(Text, X, Y, Font, Scale, R, G, B, A, Alignment, DropShadow, Outline, WordWrap)
|
||||
Text = tostring(Text)
|
||||
X, Y = FormatXWYH(X, Y)
|
||||
SetTextFont(Font or 0)
|
||||
SetTextScale(1.0, Scale or 0)
|
||||
SetTextColour(R or 255, G or 255, B or 255, A or 255)
|
||||
|
||||
if DropShadow then
|
||||
SetTextDropShadow()
|
||||
end
|
||||
if Outline then
|
||||
SetTextOutline()
|
||||
end
|
||||
|
||||
if Alignment ~= nil then
|
||||
if Alignment == 1 or Alignment == "Center" or Alignment == "Centre" then
|
||||
SetTextCentre(true)
|
||||
elseif Alignment == 2 or Alignment == "Right" then
|
||||
SetTextRightJustify(true)
|
||||
SetTextWrap(0, X)
|
||||
end
|
||||
end
|
||||
|
||||
if tonumber(WordWrap) then
|
||||
if tonumber(WordWrap) ~= 0 then
|
||||
WordWrap, _ = FormatXWYH(WordWrap, 0)
|
||||
SetTextWrap(WordWrap, X - WordWrap)
|
||||
end
|
||||
end
|
||||
|
||||
BeginTextCommandDisplayText("STRING")
|
||||
AddLongString(Text)
|
||||
EndTextCommandDisplayText(X, Y)
|
||||
end
|
||||
@@ -0,0 +1,112 @@
|
||||
UIMenuCheckboxItem = setmetatable({}, UIMenuCheckboxItem)
|
||||
UIMenuCheckboxItem.__index = UIMenuCheckboxItem
|
||||
UIMenuCheckboxItem.__call = function() return "UIMenuItem", "UIMenuCheckboxItem" end
|
||||
|
||||
function UIMenuCheckboxItem.New(Text, Check, Description)
|
||||
local _UIMenuCheckboxItem = {
|
||||
Base = UIMenuItem.New(Text or "", Description or ""),
|
||||
CheckedSprite = Sprite.New("commonmenu", "shop_box_blank", 410, 95, 50, 50),
|
||||
Checked = tobool(Check),
|
||||
CheckboxEvent = function(menu, item, checked) end,
|
||||
}
|
||||
return setmetatable(_UIMenuCheckboxItem, UIMenuCheckboxItem)
|
||||
end
|
||||
|
||||
function UIMenuCheckboxItem:SetParentMenu(Menu)
|
||||
if Menu() == "UIMenu" then
|
||||
self.Base.ParentMenu = Menu
|
||||
else
|
||||
return self.Base.ParentMenu
|
||||
end
|
||||
end
|
||||
|
||||
function UIMenuCheckboxItem:Position(Y)
|
||||
if tonumber(Y) then
|
||||
self.Base:Position(Y)
|
||||
self.CheckedSprite:Position(380 + self.Base._Offset.X + self.Base.ParentMenu.WidthOffset, Y + 138 + self.Base._Offset.Y)
|
||||
end
|
||||
end
|
||||
|
||||
function UIMenuCheckboxItem:Selected(bool)
|
||||
if bool ~= nil then
|
||||
self.Base._Selected = tobool(bool)
|
||||
else
|
||||
return self.Base._Selected
|
||||
end
|
||||
end
|
||||
|
||||
function UIMenuCheckboxItem:Hovered(bool)
|
||||
if bool ~= nil then
|
||||
self.Base._Hovered = tobool(bool)
|
||||
else
|
||||
return self.Base._Hovered
|
||||
end
|
||||
end
|
||||
|
||||
function UIMenuCheckboxItem:Enabled(bool)
|
||||
if bool ~= nil then
|
||||
self.Base._Enabled = tobool(bool)
|
||||
else
|
||||
return self.Base._Enabled
|
||||
end
|
||||
end
|
||||
|
||||
function UIMenuCheckboxItem:Description(str)
|
||||
if tostring(str) and str ~= nil then
|
||||
self.Base._Description = tostring(str)
|
||||
else
|
||||
return self.Base._Description
|
||||
end
|
||||
end
|
||||
|
||||
function UIMenuCheckboxItem:Offset(X, Y)
|
||||
if tonumber(X) or tonumber(Y) then
|
||||
if tonumber(X) then
|
||||
self.Base._Offset.X = tonumber(X)
|
||||
end
|
||||
if tonumber(Y) then
|
||||
self.Base._Offset.Y = tonumber(Y)
|
||||
end
|
||||
else
|
||||
return self.Base._Offset
|
||||
end
|
||||
end
|
||||
|
||||
function UIMenuCheckboxItem:Text(Text)
|
||||
if tostring(Text) and Text ~= nil then
|
||||
self.Base.Text:Text(tostring(Text))
|
||||
else
|
||||
return self.Base.Text:Text()
|
||||
end
|
||||
end
|
||||
|
||||
function UIMenuCheckboxItem:SetLeftBadge()
|
||||
error("This item does not support badges")
|
||||
end
|
||||
|
||||
function UIMenuCheckboxItem:SetRightBadge()
|
||||
error("This item does not support badges")
|
||||
end
|
||||
|
||||
function UIMenuCheckboxItem:RightLabel()
|
||||
error("This item does not support a right label")
|
||||
end
|
||||
|
||||
function UIMenuCheckboxItem:Draw()
|
||||
self.Base:Draw()
|
||||
self.CheckedSprite:Position(380 + self.Base._Offset.X + self.Base.ParentMenu.WidthOffset, self.CheckedSprite.Y)
|
||||
if self.Base:Selected() then
|
||||
if self.Checked then
|
||||
self.CheckedSprite.TxtName = "shop_box_tickb"
|
||||
else
|
||||
self.CheckedSprite.TxtName = "shop_box_blankb"
|
||||
end
|
||||
else
|
||||
if self.Checked then
|
||||
self.CheckedSprite.TxtName = "shop_box_tick"
|
||||
else
|
||||
self.CheckedSprite.TxtName = "shop_box_blank"
|
||||
end
|
||||
end
|
||||
self.CheckedSprite:Draw()
|
||||
end
|
||||
@@ -0,0 +1,117 @@
|
||||
UIMenuColouredItem = setmetatable({}, UIMenuColouredItem)
|
||||
UIMenuColouredItem.__index = UIMenuColouredItem
|
||||
UIMenuColouredItem.__call = function() return "UIMenuItem", "UIMenuColouredItem" end
|
||||
|
||||
function UIMenuColouredItem.New(Text, Description, MainColour, HighlightColour)
|
||||
if type(Colour) ~= "table" then Colour = {R = 0, G = 0, B = 0, A = 255} end
|
||||
if type(HighlightColour) ~= "table" then Colour = {R = 255, G = 255, B = 255, A = 255} end
|
||||
local _UIMenuColouredItem = {
|
||||
Base = UIMenuItem.New(Text or "", Description or ""),
|
||||
Rectangle = UIResRectangle.New(0, 0, 431, 38, MainColour.R, MainColour.G, MainColour.B, MainColour.A),
|
||||
MainColour = MainColour,
|
||||
HighlightColour = HighlightColour,
|
||||
Activated = function(menu, item) end,
|
||||
}
|
||||
_UIMenuColouredItem.Base.SelectedSprite:Colour(HighlightColour.R, HighlightColour.G, HighlightColour.B, HighlightColour.A)
|
||||
return setmetatable(_UIMenuColouredItem, UIMenuColouredItem)
|
||||
end
|
||||
|
||||
function UIMenuColouredItem:SetParentMenu(Menu)
|
||||
if Menu() == "UIMenu" then
|
||||
self.Base.ParentMenu = Menu
|
||||
else
|
||||
return self.Base.ParentMenu
|
||||
end
|
||||
end
|
||||
|
||||
function UIMenuColouredItem:Position(Y)
|
||||
if tonumber(Y) then
|
||||
self.Base:Position(Y)
|
||||
self.Rectangle:Position(self.Base._Offset.X, Y + 144 + self.Base._Offset.Y)
|
||||
end
|
||||
end
|
||||
|
||||
function UIMenuColouredItem:Selected(bool)
|
||||
if bool ~= nil then
|
||||
self.Base._Selected = tobool(bool)
|
||||
else
|
||||
return self.Base._Selected
|
||||
end
|
||||
end
|
||||
|
||||
function UIMenuColouredItem:Hovered(bool)
|
||||
if bool ~= nil then
|
||||
self.Base._Hovered = tobool(bool)
|
||||
else
|
||||
return self.Base._Hovered
|
||||
end
|
||||
end
|
||||
|
||||
function UIMenuColouredItem:Enabled(bool)
|
||||
if bool ~= nil then
|
||||
self.Base._Enabled = tobool(bool)
|
||||
else
|
||||
return self.Base._Enabled
|
||||
end
|
||||
end
|
||||
|
||||
function UIMenuColouredItem:Description(str)
|
||||
if tostring(str) and str ~= nil then
|
||||
self.Base._Description = tostring(str)
|
||||
else
|
||||
return self.Base._Description
|
||||
end
|
||||
end
|
||||
|
||||
function UIMenuColouredItem:Offset(X, Y)
|
||||
if tonumber(X) or tonumber(Y) then
|
||||
if tonumber(X) then
|
||||
self.Base._Offset.X = tonumber(X)
|
||||
end
|
||||
if tonumber(Y) then
|
||||
self.Base._Offset.Y = tonumber(Y)
|
||||
end
|
||||
else
|
||||
return self.Base._Offset
|
||||
end
|
||||
end
|
||||
|
||||
function UIMenuColouredItem:Text(Text)
|
||||
if tostring(Text) and Text ~= nil then
|
||||
self.Base.Text:Text(tostring(Text))
|
||||
else
|
||||
return self.Base.Text:Text()
|
||||
end
|
||||
end
|
||||
|
||||
function UIMenuColouredItem:RightLabel(Text, MainColour, HighlightColour)
|
||||
if tostring(Text) and Text ~= nil then
|
||||
if type(MainColour) == "table" then
|
||||
self.Base.Label.MainColour = MainColour
|
||||
end
|
||||
if type(HighlightColour) == "table" then
|
||||
self.Base.Label.HighlightColour = HighlightColour
|
||||
end
|
||||
self.Base.Label.Text:Text(tostring(Text))
|
||||
else
|
||||
return self.Base.Label.Text:Text()
|
||||
end
|
||||
end
|
||||
|
||||
function UIMenuColouredItem:SetLeftBadge(Badge)
|
||||
if tonumber(Badge) then
|
||||
self.Base.LeftBadge.Badge = tonumber(Badge)
|
||||
end
|
||||
end
|
||||
|
||||
function UIMenuColouredItem:SetRightBadge(Badge)
|
||||
if tonumber(Badge) then
|
||||
self.Base.RightBadge.Badge = tonumber(Badge)
|
||||
end
|
||||
end
|
||||
|
||||
function UIMenuColouredItem:Draw()
|
||||
self.Rectangle:Size(431 + self.ParentMenu.WidthOffset, self.Rectangle.Height)
|
||||
self.Rectangle:Draw()
|
||||
self.Base:Draw()
|
||||
end
|
||||
@@ -0,0 +1,212 @@
|
||||
UIMenuItem = setmetatable({}, UIMenuItem)
|
||||
UIMenuItem.__index = UIMenuItem
|
||||
UIMenuItem.__call = function() return "UIMenuItem", "UIMenuItem" end
|
||||
|
||||
function UIMenuItem.New(Text, Description)
|
||||
_UIMenuItem = {
|
||||
Rectangle = UIResRectangle.New(0, 0, 431, 38, 255, 255, 255, 20),
|
||||
Text = UIResText.New(tostring(Text) or "", 8, 0, 0.33, 245, 245, 245, 255, 0),
|
||||
_Description = tostring(Description) or "";
|
||||
SelectedSprite = Sprite.New("commonmenu", "gradient_nav", 0, 0, 431, 38),
|
||||
LeftBadge = { Sprite = Sprite.New("commonmenu", "", 0, 0, 40, 40), Badge = 0},
|
||||
RightBadge = { Sprite = Sprite.New("commonmenu", "", 0, 0, 40, 40), Badge = 0},
|
||||
Label = {
|
||||
Text = UIResText.New("", 0, 0, 0.35, 245, 245, 245, 255, 0, "Right"),
|
||||
MainColour = {R = 255, G = 255, B = 255, A = 255},
|
||||
HighlightColour = {R = 0, G = 0, B = 0, A = 255},
|
||||
},
|
||||
_Selected = false,
|
||||
_Hovered = false,
|
||||
_Enabled = true,
|
||||
_Offset = {X = 0, Y = 0},
|
||||
ParentMenu = nil,
|
||||
Panels = {},
|
||||
Activated = function(menu, item) end,
|
||||
ActivatedPanel = function(menu, item, panel, panelvalue) end,
|
||||
}
|
||||
return setmetatable(_UIMenuItem, UIMenuItem)
|
||||
end
|
||||
|
||||
function UIMenuItem:SetParentMenu(Menu)
|
||||
if Menu ~= nil and Menu() == "UIMenu" then
|
||||
self.ParentMenu = Menu
|
||||
else
|
||||
return self.ParentMenu
|
||||
end
|
||||
end
|
||||
|
||||
function UIMenuItem:Selected(bool)
|
||||
if bool ~= nil then
|
||||
self._Selected = tobool(bool)
|
||||
else
|
||||
return self._Selected
|
||||
end
|
||||
end
|
||||
|
||||
function UIMenuItem:Hovered(bool)
|
||||
if bool ~= nil then
|
||||
self._Hovered = tobool(bool)
|
||||
else
|
||||
return self._Hovered
|
||||
end
|
||||
end
|
||||
|
||||
function UIMenuItem:Enabled(bool)
|
||||
if bool ~= nil then
|
||||
self._Enabled = tobool(bool)
|
||||
else
|
||||
return self._Enabled
|
||||
end
|
||||
end
|
||||
|
||||
function UIMenuItem:Description(str)
|
||||
if tostring(str) and str ~= nil then
|
||||
self._Description = tostring(str)
|
||||
else
|
||||
return self._Description
|
||||
end
|
||||
end
|
||||
|
||||
function UIMenuItem:Offset(X, Y)
|
||||
if tonumber(X) or tonumber(Y) then
|
||||
if tonumber(X) then
|
||||
self._Offset.X = tonumber(X)
|
||||
end
|
||||
if tonumber(Y) then
|
||||
self._Offset.Y = tonumber(Y)
|
||||
end
|
||||
else
|
||||
return self._Offset
|
||||
end
|
||||
end
|
||||
|
||||
function UIMenuItem:Position(Y)
|
||||
if tonumber(Y) then
|
||||
self.Rectangle:Position(self._Offset.X, Y + 144 + self._Offset.Y)
|
||||
self.SelectedSprite:Position(0 + self._Offset.X, Y + 144 + self._Offset.Y)
|
||||
self.Text:Position(8 + self._Offset.X, Y + 147 + self._Offset.Y)
|
||||
self.LeftBadge.Sprite:Position(0 + self._Offset.X, Y + 142 + self._Offset.Y)
|
||||
self.RightBadge.Sprite:Position(385 + self._Offset.X, Y + 142 + self._Offset.Y)
|
||||
self.Label.Text:Position(420 + self._Offset.X, Y + 148 + self._Offset.Y)
|
||||
end
|
||||
end
|
||||
|
||||
function UIMenuItem:RightLabel(Text, MainColour, HighlightColour)
|
||||
if tostring(Text) and Text ~= nil then
|
||||
if type(MainColour) == "table" then
|
||||
self.Label.MainColour = MainColour
|
||||
end
|
||||
if type(HighlightColour) == "table" then
|
||||
self.Label.HighlightColour = HighlightColour
|
||||
end
|
||||
self.Label.Text:Text(tostring(Text))
|
||||
else
|
||||
return self.Label.Text:Text()
|
||||
end
|
||||
end
|
||||
|
||||
function UIMenuItem:SetLeftBadge(Badge)
|
||||
if tonumber(Badge) then
|
||||
self.LeftBadge.Badge = tonumber(Badge)
|
||||
end
|
||||
end
|
||||
|
||||
function UIMenuItem:SetRightBadge(Badge)
|
||||
if tonumber(Badge) then
|
||||
self.RightBadge.Badge = tonumber(Badge)
|
||||
end
|
||||
end
|
||||
|
||||
function UIMenuItem:Text(Text)
|
||||
if tostring(Text) and Text ~= nil then
|
||||
self.Text:Text(tostring(Text))
|
||||
else
|
||||
return self.Text:Text()
|
||||
end
|
||||
end
|
||||
|
||||
function UIMenuItem:AddPanel(Panel)
|
||||
if Panel() == "UIMenuPanel" then
|
||||
table.insert(self.Panels, Panel)
|
||||
Panel:SetParentItem(self)
|
||||
end
|
||||
end
|
||||
|
||||
function UIMenuItem:RemovePanelAt(Index)
|
||||
if tonumber(Index) then
|
||||
if self.Panels[Index] then
|
||||
table.remove(self.Panels, tonumber(Index))
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function UIMenuItem:FindPanelIndex(Panel)
|
||||
if Panel() == "UIMenuPanel" then
|
||||
for Index = 1, #self.Panels do
|
||||
if self.Panels[Index] == Panel then
|
||||
return Index
|
||||
end
|
||||
end
|
||||
end
|
||||
return nil
|
||||
end
|
||||
|
||||
function UIMenuItem:FindPanelItem()
|
||||
for Index = #self.Items, 1, -1 do
|
||||
if self.Items[Index].Panel then
|
||||
return Index
|
||||
end
|
||||
end
|
||||
return nil
|
||||
end
|
||||
|
||||
function UIMenuItem:Draw()
|
||||
self.Rectangle:Size(431 + self.ParentMenu.WidthOffset, self.Rectangle.Height)
|
||||
self.SelectedSprite:Size(431 + self.ParentMenu.WidthOffset, self.SelectedSprite.Height)
|
||||
|
||||
if self._Hovered and not self._Selected then
|
||||
self.Rectangle:Draw()
|
||||
end
|
||||
|
||||
if self._Selected then
|
||||
self.SelectedSprite:Draw()
|
||||
end
|
||||
|
||||
if self._Enabled then
|
||||
if self._Selected then
|
||||
self.Text:Colour(0, 0, 0, 255)
|
||||
self.Label.Text:Colour(self.Label.HighlightColour.R, self.Label.HighlightColour.G, self.Label.HighlightColour.B, self.Label.HighlightColour.A)
|
||||
else
|
||||
self.Text:Colour(245, 245, 245, 255)
|
||||
self.Label.Text:Colour(self.Label.MainColour.R, self.Label.MainColour.G, self.Label.MainColour.B, self.Label.MainColour.A)
|
||||
end
|
||||
else
|
||||
self.Text:Colour(163, 159, 148, 255)
|
||||
self.Label.Text:Colour(163, 159, 148, 255)
|
||||
end
|
||||
|
||||
if self.LeftBadge.Badge == BadgeStyle.None then
|
||||
self.Text:Position(8 + self._Offset.X, self.Text.Y)
|
||||
else
|
||||
self.Text:Position(35 + self._Offset.X, self.Text.Y)
|
||||
self.LeftBadge.Sprite.TxtDictionary = GetBadgeDictionary(self.LeftBadge.Badge, self._Selected)
|
||||
self.LeftBadge.Sprite.TxtName = GetBadgeTexture(self.LeftBadge.Badge, self._Selected)
|
||||
self.LeftBadge.Sprite:Colour(GetBadgeColour(self.LeftBadge.Badge, self._Selected))
|
||||
self.LeftBadge.Sprite:Draw()
|
||||
end
|
||||
|
||||
if self.RightBadge.Badge ~= BadgeStyle.None then
|
||||
self.RightBadge.Sprite:Position(385 + self._Offset.X + self.ParentMenu.WidthOffset, self.RightBadge.Sprite.Y)
|
||||
self.RightBadge.Sprite.TxtDictionary = GetBadgeDictionary(self.RightBadge.Badge, self._Selected)
|
||||
self.RightBadge.Sprite.TxtName = GetBadgeTexture(self.RightBadge.Badge, self._Selected)
|
||||
self.RightBadge.Sprite:Colour(GetBadgeColour(self.RightBadge.Badge, self._Selected))
|
||||
self.RightBadge.Sprite:Draw()
|
||||
end
|
||||
|
||||
if self.Label.Text:Text() ~= "" and string.len(self.Label.Text:Text()) > 0 then
|
||||
self.Label.Text:Position(420 + self._Offset.X + self.ParentMenu.WidthOffset, self.Label.Text.Y)
|
||||
self.Label.Text:Draw()
|
||||
end
|
||||
|
||||
self.Text:Draw()
|
||||
end
|
||||
@@ -0,0 +1,206 @@
|
||||
UIMenuListItem = setmetatable({}, UIMenuListItem)
|
||||
UIMenuListItem.__index = UIMenuListItem
|
||||
UIMenuListItem.__call = function() return "UIMenuItem", "UIMenuListItem" end
|
||||
|
||||
function UIMenuListItem.New(Text, Items, Index, Description)
|
||||
if type(Items) ~= "table" then Items = {} end
|
||||
if Index == 0 then Index = 1 end
|
||||
local _UIMenuListItem = {
|
||||
Base = UIMenuItem.New(Text or "", Description or ""),
|
||||
Items = Items,
|
||||
LeftArrow = Sprite.New("commonmenu", "arrowleft", 110, 105, 30, 30),
|
||||
RightArrow = Sprite.New("commonmenu", "arrowright", 280, 105, 30, 30),
|
||||
ItemText = UIResText.New("", 290, 104, 0.35, 255, 255, 255, 255, 0, "Right"),
|
||||
_Index = tonumber(Index) or 1,
|
||||
Panels = {},
|
||||
OnListChanged = function(menu, item, newindex) end,
|
||||
OnListSelected = function(menu, item, newindex) end,
|
||||
}
|
||||
return setmetatable(_UIMenuListItem, UIMenuListItem)
|
||||
end
|
||||
|
||||
function UIMenuListItem:SetParentMenu(Menu)
|
||||
if Menu ~= nil and Menu() == "UIMenu" then
|
||||
self.Base.ParentMenu = Menu
|
||||
else
|
||||
return self.Base.ParentMenu
|
||||
end
|
||||
end
|
||||
|
||||
function UIMenuListItem:Position(Y)
|
||||
if tonumber(Y) then
|
||||
self.LeftArrow:Position(300 + self.Base._Offset.X + self.Base.ParentMenu.WidthOffset, 147 + Y + self.Base._Offset.Y)
|
||||
self.RightArrow:Position(400 + self.Base._Offset.X + self.Base.ParentMenu.WidthOffset, 147 + Y + self.Base._Offset.Y)
|
||||
self.ItemText:Position(300 + self.Base._Offset.X + self.Base.ParentMenu.WidthOffset, 147 + Y + self.Base._Offset.Y)
|
||||
self.Base:Position(Y)
|
||||
end
|
||||
end
|
||||
|
||||
function UIMenuListItem:Selected(bool)
|
||||
if bool ~= nil then
|
||||
self.Base._Selected = tobool(bool)
|
||||
else
|
||||
return self.Base._Selected
|
||||
end
|
||||
end
|
||||
|
||||
function UIMenuListItem:Hovered(bool)
|
||||
if bool ~= nil then
|
||||
self.Base._Hovered = tobool(bool)
|
||||
else
|
||||
return self.Base._Hovered
|
||||
end
|
||||
end
|
||||
|
||||
function UIMenuListItem:Enabled(bool)
|
||||
if bool ~= nil then
|
||||
self.Base._Enabled = tobool(bool)
|
||||
else
|
||||
return self.Base._Enabled
|
||||
end
|
||||
end
|
||||
|
||||
function UIMenuListItem:Description(str)
|
||||
if tostring(str) and str ~= nil then
|
||||
self.Base._Description = tostring(str)
|
||||
else
|
||||
return self.Base._Description
|
||||
end
|
||||
end
|
||||
|
||||
function UIMenuListItem:Offset(X, Y)
|
||||
if tonumber(X) or tonumber(Y) then
|
||||
if tonumber(X) then
|
||||
self.Base._Offset.X = tonumber(X)
|
||||
end
|
||||
if tonumber(Y) then
|
||||
self.Base._Offset.Y = tonumber(Y)
|
||||
end
|
||||
else
|
||||
return self.Base._Offset
|
||||
end
|
||||
end
|
||||
|
||||
function UIMenuListItem:Text(Text)
|
||||
if tostring(Text) and Text ~= nil then
|
||||
self.Base.Text:Text(tostring(Text))
|
||||
else
|
||||
return self.Base.Text:Text()
|
||||
end
|
||||
end
|
||||
|
||||
function UIMenuListItem:Index(Index)
|
||||
if tonumber(Index) then
|
||||
if tonumber(Index) > #self.Items then
|
||||
self._Index = 1
|
||||
elseif tonumber(Index) < 1 then
|
||||
self._Index = #self.Items
|
||||
else
|
||||
self._Index = tonumber(Index)
|
||||
end
|
||||
else
|
||||
return self._Index
|
||||
end
|
||||
end
|
||||
|
||||
function UIMenuListItem:ItemToIndex(Item)
|
||||
for i = 1, #self.Items do
|
||||
if type(Item) == type(self.Items[i]) and Item == self.Items[i] then
|
||||
return i
|
||||
elseif type(self.Items[i]) == "table" and (type(Item) == type(self.Items[i].Name) or type(Item) == type(self.Items[i].Value)) and (Item == self.Items[i].Name or Item == self.Items[i].Value) then
|
||||
return i
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function UIMenuListItem:IndexToItem(Index)
|
||||
if tonumber(Index) then
|
||||
if tonumber(Index) == 0 then Index = 1 end
|
||||
if self.Items[tonumber(Index)] then
|
||||
return self.Items[tonumber(Index)]
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function UIMenuListItem:SetLeftBadge()
|
||||
error("This item does not support badges")
|
||||
end
|
||||
|
||||
function UIMenuListItem:SetRightBadge()
|
||||
error("This item does not support badges")
|
||||
end
|
||||
|
||||
function UIMenuListItem:RightLabel()
|
||||
error("This item does not support a right label")
|
||||
end
|
||||
|
||||
function UIMenuListItem:AddPanel(Panel)
|
||||
if Panel() == "UIMenuPanel" then
|
||||
table.insert(self.Panels, Panel)
|
||||
Panel:SetParentItem(self)
|
||||
end
|
||||
end
|
||||
|
||||
function UIMenuListItem:RemovePanelAt(Index)
|
||||
if tonumber(Index) then
|
||||
if self.Panels[Index] then
|
||||
table.remove(self.Panels, tonumber(Index))
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function UIMenuListItem:FindPanelIndex(Panel)
|
||||
if Panel() == "UIMenuPanel" then
|
||||
for Index = 1, #self.Panels do
|
||||
if self.Panels[Index] == Panel then
|
||||
return Index
|
||||
end
|
||||
end
|
||||
end
|
||||
return nil
|
||||
end
|
||||
|
||||
function UIMenuListItem:FindPanelItem()
|
||||
for Index = #self.Items, 1, -1 do
|
||||
if self.Items[Index].Panel then
|
||||
return Index
|
||||
end
|
||||
end
|
||||
return nil
|
||||
end
|
||||
|
||||
function UIMenuListItem:Draw()
|
||||
self.Base:Draw()
|
||||
|
||||
if self:Enabled() then
|
||||
if self:Selected() then
|
||||
self.ItemText:Colour(0, 0, 0, 255)
|
||||
self.LeftArrow:Colour(0, 0, 0, 255)
|
||||
self.RightArrow:Colour(0, 0, 0, 255)
|
||||
else
|
||||
self.ItemText:Colour(245, 245, 245, 255)
|
||||
self.LeftArrow:Colour(245, 245, 245, 255)
|
||||
self.RightArrow:Colour(245, 245, 245, 255)
|
||||
end
|
||||
else
|
||||
self.ItemText:Colour(163, 159, 148, 255)
|
||||
self.LeftArrow:Colour(163, 159, 148, 255)
|
||||
self.RightArrow:Colour(163, 159, 148, 255)
|
||||
end
|
||||
|
||||
local Text = (type(self.Items[self._Index]) == "table") and tostring(self.Items[self._Index].Name) or tostring(self.Items[self._Index])
|
||||
local Offset = MeasureStringWidth(Text, 0, 0.35)
|
||||
|
||||
self.ItemText:Text(Text)
|
||||
self.LeftArrow:Position(378 - Offset + self.Base._Offset.X + self.Base.ParentMenu.WidthOffset, self.LeftArrow.Y)
|
||||
|
||||
if self:Selected() then
|
||||
self.LeftArrow:Draw()
|
||||
self.RightArrow:Draw()
|
||||
self.ItemText:Position(403 + self.Base._Offset.X + self.Base.ParentMenu.WidthOffset, self.ItemText.Y)
|
||||
else
|
||||
self.ItemText:Position(418 + self.Base._Offset.X + self.Base.ParentMenu.WidthOffset, self.ItemText.Y)
|
||||
end
|
||||
|
||||
self.ItemText:Draw()
|
||||
end
|
||||
@@ -0,0 +1,176 @@
|
||||
UIMenuProgressItem = setmetatable({}, UIMenuProgressItem)
|
||||
UIMenuProgressItem.__index = UIMenuProgressItem
|
||||
UIMenuProgressItem.__call = function() return "UIMenuItem", "UIMenuProgressItem" end
|
||||
|
||||
function UIMenuProgressItem.New(Text, Items, Index, Description, Counter)
|
||||
if type(Items) ~= "table" then Items = {} end
|
||||
if Index == 0 then Index = 1 end
|
||||
local _UIMenuProgressItem = {
|
||||
Base = UIMenuItem.New(Text or "", Description or ""),
|
||||
Data = {
|
||||
Items = Items,
|
||||
Counter = tobool(Counter),
|
||||
Max = 407.5,
|
||||
Index = tonumber(Index) or 1,
|
||||
},
|
||||
Background = UIResRectangle.New(0, 0, 415, 20),
|
||||
Bar = UIResRectangle.New(0, 0, 407.5, 12.5),
|
||||
OnProgressChanged = function(menu, item, newindex) end,
|
||||
OnProgressSelected = function(menu, item, newindex) end,
|
||||
}
|
||||
|
||||
_UIMenuProgressItem.Base.Rectangle.Height = 60
|
||||
_UIMenuProgressItem.Base.SelectedSprite.Height = 60
|
||||
|
||||
if _UIMenuProgressItem.Data.Counter then
|
||||
_UIMenuProgressItem.Base:RightLabel(_UIMenuProgressItem.Data.Index.."/"..#_UIMenuProgressItem.Data.Items)
|
||||
else
|
||||
_UIMenuProgressItem.Base:RightLabel((type(_UIMenuProgressItem.Data.Items[_UIMenuProgressItem.Data.Index]) == "table") and tostring(_UIMenuProgressItem.Data.Items[_UIMenuProgressItem.Data.Index].Name) or tostring(_UIMenuProgressItem.Data.Items[_UIMenuProgressItem.Data.Index]))
|
||||
end
|
||||
|
||||
_UIMenuProgressItem.Bar.Width = _UIMenuProgressItem.Data.Index/#_UIMenuProgressItem.Data.Items * _UIMenuProgressItem.Data.Max
|
||||
|
||||
return setmetatable(_UIMenuProgressItem, UIMenuProgressItem)
|
||||
end
|
||||
|
||||
function UIMenuProgressItem:SetParentMenu(Menu)
|
||||
if Menu() == "UIMenu" then
|
||||
self.Base.ParentMenu = Menu
|
||||
else
|
||||
return self.Base.ParentMenu
|
||||
end
|
||||
end
|
||||
|
||||
function UIMenuProgressItem:Position(Y)
|
||||
if tonumber(Y) then
|
||||
self.Base:Position(Y)
|
||||
self.Background:Position(8 + self.Base._Offset.X + self.Base.ParentMenu.WidthOffset, 177 + Y + self.Base._Offset.Y)
|
||||
self.Bar:Position(11.75 + self.Base._Offset.X + self.Base.ParentMenu.WidthOffset, 180.75 + Y + self.Base._Offset.Y)
|
||||
end
|
||||
end
|
||||
|
||||
function UIMenuProgressItem:Selected(bool)
|
||||
if bool ~= nil then
|
||||
self.Base._Selected = tobool(bool)
|
||||
else
|
||||
return self.Base._Selected
|
||||
end
|
||||
end
|
||||
|
||||
function UIMenuProgressItem:Hovered(bool)
|
||||
if bool ~= nil then
|
||||
self.Base._Hovered = tobool(bool)
|
||||
else
|
||||
return self.Base._Hovered
|
||||
end
|
||||
end
|
||||
|
||||
function UIMenuProgressItem:Enabled(bool)
|
||||
if bool ~= nil then
|
||||
self.Base._Enabled = tobool(bool)
|
||||
else
|
||||
return self.Base._Enabled
|
||||
end
|
||||
end
|
||||
|
||||
function UIMenuProgressItem:Description(str)
|
||||
if tostring(str) and str ~= nil then
|
||||
self.Base._Description = tostring(str)
|
||||
else
|
||||
return self.Base._Description
|
||||
end
|
||||
end
|
||||
|
||||
function UIMenuProgressItem:Offset(X, Y)
|
||||
if tonumber(X) or tonumber(Y) then
|
||||
if tonumber(X) then
|
||||
self.Base._Offset.X = tonumber(X)
|
||||
end
|
||||
if tonumber(Y) then
|
||||
self.Base._Offset.Y = tonumber(Y)
|
||||
end
|
||||
else
|
||||
return self.Base._Offset
|
||||
end
|
||||
end
|
||||
|
||||
function UIMenuProgressItem:Text(Text)
|
||||
if tostring(Text) and Text ~= nil then
|
||||
self.Base.Text:Text(tostring(Text))
|
||||
else
|
||||
return self.Base.Text:Text()
|
||||
end
|
||||
end
|
||||
|
||||
function UIMenuProgressItem:Index(Index)
|
||||
if tonumber(Index) then
|
||||
if tonumber(Index) > #self.Data.Items then
|
||||
self.Data.Index = 1
|
||||
elseif tonumber(Index) < 1 then
|
||||
self.Data.Index = #self.Data.Items
|
||||
else
|
||||
self.Data.Index = tonumber(Index)
|
||||
end
|
||||
|
||||
if self.Data.Counter then
|
||||
self.Base:RightLabel(self.Data.Index.."/"..#self.Data.Items)
|
||||
else
|
||||
self.Base:RightLabel((type(self.Data.Items[self.Data.Index]) == "table") and tostring(self.Data.Items[self.Data.Index].Name) or tostring(self.Data.Items[self.Data.Index]))
|
||||
end
|
||||
|
||||
self.Bar.Width = self.Data.Index/#self.Data.Items * self.Data.Max
|
||||
else
|
||||
return self.Data.Index
|
||||
end
|
||||
end
|
||||
|
||||
function UIMenuProgressItem:ItemToIndex(Item)
|
||||
for i = 1, #self.Data.Items do
|
||||
if type(Item) == type(self.Data.Items[i]) and Item == self.Data.Items[i] then
|
||||
return i
|
||||
elseif type(self.Data.Items[i]) == "table" and (type(Item) == type(self.Data.Items[i].Name) or type(Item) == type(self.Data.Items[i].Value)) and (Item == self.Data.Items[i].Name or Item == self.Data.Items[i].Value) then
|
||||
return i
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function UIMenuProgressItem:IndexToItem(Index)
|
||||
if tonumber(Index) then
|
||||
if tonumber(Index) == 0 then Index = 1 end
|
||||
if self.Data.Items[tonumber(Index)] then
|
||||
return self.Data.Items[tonumber(Index)]
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function UIMenuProgressItem:SetLeftBadge()
|
||||
error("This item does not support badges")
|
||||
end
|
||||
|
||||
function UIMenuProgressItem:SetRightBadge()
|
||||
error("This item does not support badges")
|
||||
end
|
||||
|
||||
function UIMenuProgressItem:RightLabel()
|
||||
error("This item does not support a right label")
|
||||
end
|
||||
|
||||
function UIMenuProgressItem:CalculateProgress(CursorX)
|
||||
local Progress = CursorX - self.Bar.X
|
||||
self:Index(math.round(#self.Data.Items * (((Progress >= 0 and Progress <= self.Data.Max) and Progress or ((Progress < 0) and 0 or self.Data.Max))/self.Data.Max)))
|
||||
end
|
||||
|
||||
function UIMenuProgressItem:Draw()
|
||||
self.Base:Draw()
|
||||
|
||||
if self.Base._Selected then
|
||||
self.Background:Colour(table.unpack(Colours.Black))
|
||||
self.Bar:Colour(table.unpack(Colours.White))
|
||||
else
|
||||
self.Background:Colour(table.unpack(Colours.White))
|
||||
self.Bar:Colour(table.unpack(Colours.Black))
|
||||
end
|
||||
|
||||
self.Background:Draw()
|
||||
self.Bar:Draw()
|
||||
end
|
||||
@@ -0,0 +1,169 @@
|
||||
UIMenuSliderItem = setmetatable({}, UIMenuSliderItem)
|
||||
UIMenuSliderItem.__index = UIMenuSliderItem
|
||||
UIMenuSliderItem.__call = function() return "UIMenuItem", "UIMenuSliderItem" end
|
||||
|
||||
function UIMenuSliderItem.New(Text, Items, Index, Description, Divider)
|
||||
if type(Items) ~= "table" then Items = {} end
|
||||
if Index == 0 then Index = 1 end
|
||||
local _UIMenuSliderItem = {
|
||||
Base = UIMenuItem.New(Text or "", Description or ""),
|
||||
Items = Items,
|
||||
ShowDivider = tobool(Divider),
|
||||
LeftArrow = Sprite.New("commonmenutu", "arrowleft", 0, 105, 15, 15),
|
||||
RightArrow = Sprite.New("commonmenutu", "arrowright", 0, 105, 15, 15),
|
||||
Background = UIResRectangle.New(0, 0, 150, 9, 4, 32, 57, 255),
|
||||
Slider = UIResRectangle.New(0, 0, 75, 9, 57, 116, 200, 255),
|
||||
Divider = UIResRectangle.New(0, 0, 2.5, 20, 245, 245, 245, 255),
|
||||
_Index = tonumber(Index) or 1,
|
||||
OnSliderChanged = function(menu, item, newindex) end,
|
||||
OnSliderSelected = function(menu, item, newindex) end,
|
||||
}
|
||||
return setmetatable(_UIMenuSliderItem, UIMenuSliderItem)
|
||||
end
|
||||
|
||||
function UIMenuSliderItem:SetParentMenu(Menu)
|
||||
if Menu() == "UIMenu" then
|
||||
self.Base.ParentMenu = Menu
|
||||
else
|
||||
return self.Base.ParentMenu
|
||||
end
|
||||
end
|
||||
|
||||
function UIMenuSliderItem:Position(Y)
|
||||
if tonumber(Y) then
|
||||
self.Background:Position(250 + self.Base._Offset.X + self.Base.ParentMenu.WidthOffset, Y + 158.5 + self.Base._Offset.Y)
|
||||
self.Slider:Position(250 + self.Base._Offset.X + self.Base.ParentMenu.WidthOffset, Y + 158.5 + self.Base._Offset.Y)
|
||||
self.Divider:Position(323.5 + self.Base._Offset.X + self.Base.ParentMenu.WidthOffset, Y + 153 + self.Base._Offset.Y)
|
||||
self.LeftArrow:Position(235 + self.Base._Offset.X + self.Base.ParentMenu.WidthOffset, 155.5 + Y + self.Base._Offset.Y)
|
||||
self.RightArrow:Position(400 + self.Base._Offset.X + self.Base.ParentMenu.WidthOffset, 155.5 + Y + self.Base._Offset.Y)
|
||||
self.Base:Position(Y)
|
||||
end
|
||||
end
|
||||
|
||||
function UIMenuSliderItem:Selected(bool)
|
||||
if bool ~= nil then
|
||||
self.Base._Selected = tobool(bool)
|
||||
else
|
||||
return self.Base._Selected
|
||||
end
|
||||
end
|
||||
|
||||
function UIMenuSliderItem:Hovered(bool)
|
||||
if bool ~= nil then
|
||||
self.Base._Hovered = tobool(bool)
|
||||
else
|
||||
return self.Base._Hovered
|
||||
end
|
||||
end
|
||||
|
||||
function UIMenuSliderItem:Enabled(bool)
|
||||
if bool ~= nil then
|
||||
self.Base._Enabled = tobool(bool)
|
||||
else
|
||||
return self.Base._Enabled
|
||||
end
|
||||
end
|
||||
|
||||
function UIMenuSliderItem:Description(str)
|
||||
if tostring(str) and str ~= nil then
|
||||
self.Base._Description = tostring(str)
|
||||
else
|
||||
return self.Base._Description
|
||||
end
|
||||
end
|
||||
|
||||
function UIMenuSliderItem:Offset(X, Y)
|
||||
if tonumber(X) or tonumber(Y) then
|
||||
if tonumber(X) then
|
||||
self.Base._Offset.X = tonumber(X)
|
||||
end
|
||||
if tonumber(Y) then
|
||||
self.Base._Offset.Y = tonumber(Y)
|
||||
end
|
||||
else
|
||||
return self.Base._Offset
|
||||
end
|
||||
end
|
||||
|
||||
function UIMenuSliderItem:Text(Text)
|
||||
if tostring(Text) and Text ~= nil then
|
||||
self.Base.Text:Text(tostring(Text))
|
||||
else
|
||||
return self.Base.Text:Text()
|
||||
end
|
||||
end
|
||||
|
||||
function UIMenuSliderItem:Index(Index)
|
||||
if tonumber(Index) then
|
||||
if tonumber(Index) > #self.Items then
|
||||
self._Index = 1
|
||||
elseif tonumber(Index) < 1 then
|
||||
self._Index = #self.Items
|
||||
else
|
||||
self._Index = tonumber(Index)
|
||||
end
|
||||
else
|
||||
return self._Index
|
||||
end
|
||||
end
|
||||
|
||||
function UIMenuSliderItem:ItemToIndex(Item)
|
||||
for i = 1, #self.Items do
|
||||
if type(Item) == type(self.Items[i]) and Item == self.Items[i] then
|
||||
return i
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function UIMenuSliderItem:IndexToItem(Index)
|
||||
if tonumber(Index) then
|
||||
if tonumber(Index) == 0 then Index = 1 end
|
||||
if self.Items[tonumber(Index)] then
|
||||
return self.Items[tonumber(Index)]
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function UIMenuSliderItem:SetLeftBadge()
|
||||
error("This item does not support badges")
|
||||
end
|
||||
|
||||
function UIMenuSliderItem:SetRightBadge()
|
||||
error("This item does not support badges")
|
||||
end
|
||||
|
||||
function UIMenuSliderItem:RightLabel()
|
||||
error("This item does not support a right label")
|
||||
end
|
||||
|
||||
function UIMenuSliderItem:Draw()
|
||||
self.Base:Draw()
|
||||
|
||||
if self:Enabled() then
|
||||
if self:Selected() then
|
||||
self.LeftArrow:Colour(0, 0, 0, 255)
|
||||
self.RightArrow:Colour(0, 0, 0, 255)
|
||||
else
|
||||
self.LeftArrow:Colour(245, 245, 245, 255)
|
||||
self.RightArrow:Colour(245, 245, 245, 255)
|
||||
end
|
||||
else
|
||||
self.LeftArrow:Colour(163, 159, 148, 255)
|
||||
self.RightArrow:Colour(163, 159, 148, 255)
|
||||
end
|
||||
|
||||
local Offset = ((self.Background.Width - self.Slider.Width)/(#self.Items - 1)) * (self._Index-1)
|
||||
|
||||
self.Slider:Position(250 + self.Base._Offset.X + Offset + self.Base.ParentMenu.WidthOffset, self.Slider.Y)
|
||||
|
||||
if self:Selected() then
|
||||
self.LeftArrow:Draw()
|
||||
self.RightArrow:Draw()
|
||||
end
|
||||
|
||||
self.Background:Draw()
|
||||
self.Slider:Draw()
|
||||
if self.ShowDivider then
|
||||
self.Divider:Draw()
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,228 @@
|
||||
UIMenuColourPanel = setmetatable({}, UIMenuColourPanel)
|
||||
UIMenuColourPanel.__index = UIMenuColourPanel
|
||||
UIMenuColourPanel.__call = function() return "UIMenuPanel", "UIMenuColourPanel" end
|
||||
|
||||
function UIMenuColourPanel.New(Title, Colours)
|
||||
_UIMenuColourPanel = {
|
||||
Data = {
|
||||
Pagination = {
|
||||
Min = 1,
|
||||
Max = 8,
|
||||
Total = 8,
|
||||
},
|
||||
Index = 1000,
|
||||
Items = Colours,
|
||||
Title = Title or "Title",
|
||||
Enabled = true,
|
||||
Value = 1,
|
||||
},
|
||||
Background = Sprite.New("commonmenu", "gradient_bgd", 0, 0, 431, 112),
|
||||
Bar = {},
|
||||
LeftArrow = Sprite.New("commonmenu", "arrowleft", 0, 0, 30, 30),
|
||||
RightArrow = Sprite.New("commonmenu", "arrowright", 0, 0, 30, 30),
|
||||
SelectedRectangle = UIResRectangle.New(0, 0, 44.5, 8),
|
||||
Text = UIResText.New(Title.." (1 of "..#Colours..")" or "Title".." (1 of "..#Colours..")", 0, 0, 0.35, 255, 255, 255, 255, 0, "Centre"),
|
||||
ParentItem = nil,
|
||||
}
|
||||
|
||||
for Index = 1, #Colours do
|
||||
if Index < 10 then
|
||||
table.insert(_UIMenuColourPanel.Bar, UIResRectangle.New(0, 0, 44.5, 44.5, table.unpack(Colours[Index])))
|
||||
else
|
||||
break
|
||||
end
|
||||
end
|
||||
|
||||
if #_UIMenuColourPanel.Data.Items ~= 0 then
|
||||
_UIMenuColourPanel.Data.Index = 1000 - (1000 % #_UIMenuColourPanel.Data.Items)
|
||||
_UIMenuColourPanel.Data.Pagination.Max = _UIMenuColourPanel.Data.Pagination.Total + 1
|
||||
_UIMenuColourPanel.Data.Pagination.Min = 0
|
||||
end
|
||||
return setmetatable(_UIMenuColourPanel, UIMenuColourPanel)
|
||||
end
|
||||
|
||||
function UIMenuColourPanel:SetParentItem(Item) -- required
|
||||
if Item() == "UIMenuItem" then
|
||||
self.ParentItem = Item
|
||||
else
|
||||
return self.ParentItem
|
||||
end
|
||||
end
|
||||
|
||||
function UIMenuColourPanel:Enabled(Enabled)
|
||||
if type(Enabled) == "boolean" then
|
||||
self.Data.Enabled = Enabled
|
||||
else
|
||||
return self.Data.Enabled
|
||||
end
|
||||
end
|
||||
|
||||
function UIMenuColourPanel:Position(Y) -- required
|
||||
if tonumber(Y) then
|
||||
local ParentOffsetX, ParentOffsetWidth = self.ParentItem:Offset().X, self.ParentItem:SetParentMenu().WidthOffset
|
||||
|
||||
self.Background:Position(ParentOffsetX, Y)
|
||||
for Index = 1, #self.Bar do
|
||||
self.Bar[Index]:Position(15 + (44.5 * (Index - 1)) + ParentOffsetX + (ParentOffsetWidth/2), 55 + Y)
|
||||
end
|
||||
self.SelectedRectangle:Position(15 + (44.5 * ((self:CurrentSelection() - self.Data.Pagination.Min) - 1)) + ParentOffsetX + (ParentOffsetWidth/2), 47 + Y)
|
||||
self.LeftArrow:Position(7.5 + ParentOffsetX + (ParentOffsetWidth/2), 15 + Y)
|
||||
self.RightArrow:Position(393.5 + ParentOffsetX + (ParentOffsetWidth/2), 15 + Y)
|
||||
self.Text:Position(215.5 + ParentOffsetX + (ParentOffsetWidth/2), 15 + Y)
|
||||
end
|
||||
end
|
||||
|
||||
function UIMenuColourPanel:CurrentSelection(value, PreventUpdate)
|
||||
if tonumber(value) then
|
||||
if #self.Data.Items == 0 then
|
||||
self.Data.Index = 0
|
||||
end
|
||||
|
||||
self.Data.Index = 1000000 - (1000000 % #self.Data.Items) + tonumber(value)
|
||||
|
||||
if self:CurrentSelection() > self.Data.Pagination.Max then
|
||||
self.Data.Pagination.Min = self:CurrentSelection() - (self.Data.Pagination.Total + 1)
|
||||
self.Data.Pagination.Max = self:CurrentSelection()
|
||||
elseif self:CurrentSelection() < self.Data.Pagination.Min then
|
||||
self.Data.Pagination.Min = self:CurrentSelection() - 1
|
||||
self.Data.Pagination.Max = self:CurrentSelection() + (self.Data.Pagination.Total + 1)
|
||||
end
|
||||
|
||||
self:UpdateSelection(PreventUpdate)
|
||||
else
|
||||
if #self.Data.Items == 0 then
|
||||
return 1
|
||||
else
|
||||
if self.Data.Index % #self.Data.Items == 0 then
|
||||
return 1
|
||||
else
|
||||
return self.Data.Index % #self.Data.Items + 1
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function UIMenuColourPanel:UpdateParent(Colour)
|
||||
local _, ParentType = self.ParentItem()
|
||||
if ParentType == "UIMenuListItem" then
|
||||
local PanelItemIndex = self.ParentItem:FindPanelItem()
|
||||
local PanelIndex = self.ParentItem:FindPanelIndex(self)
|
||||
if PanelItemIndex then
|
||||
self.ParentItem.Items[PanelItemIndex].Value[PanelIndex] = Colour
|
||||
self.ParentItem:Index(PanelItemIndex)
|
||||
self.ParentItem.Base.ParentMenu.OnListChange(self.ParentItem.Base.ParentMenu, self.ParentItem, self.ParentItem._Index)
|
||||
self.ParentItem.OnListChanged(self.ParentItem.Base.ParentMenu, self.ParentItem, self.ParentItem._Index)
|
||||
else
|
||||
for Index = 1, #self.ParentItem.Items do
|
||||
if type(self.ParentItem.Items[Index]) == "table" then
|
||||
if not self.ParentItem.Items[Index].Panels then self.ParentItem.Items[Index].Panels = {} end
|
||||
self.ParentItem.Items[Index].Panels[PanelIndex] = Colour
|
||||
else
|
||||
self.ParentItem.Items[Index] = {Name = tostring(self.ParentItem.Items[Index]), Value = self.ParentItem.Items[Index], Panels = {[PanelIndex] = Colour}}
|
||||
end
|
||||
end
|
||||
self.ParentItem.Base.ParentMenu.OnListChange(self.ParentItem.Base.ParentMenu, self.ParentItem, self.ParentItem._Index)
|
||||
self.ParentItem.OnListChanged(self.ParentItem.Base.ParentMenu, self.ParentItem, self.ParentItem._Index)
|
||||
end
|
||||
elseif ParentType == "UIMenuItem" then
|
||||
self.ParentItem.ActivatedPanel(self.ParentItem.ParentMenu, self.ParentItem, self, Colour)
|
||||
end
|
||||
end
|
||||
|
||||
function UIMenuColourPanel:UpdateSelection(PreventUpdate)
|
||||
local CurrentSelection = self:CurrentSelection()
|
||||
if not PreventUpdate then
|
||||
self:UpdateParent(CurrentSelection)
|
||||
end
|
||||
self.SelectedRectangle:Position(15 + (44.5 * ((CurrentSelection - self.Data.Pagination.Min) - 1)) + self.ParentItem:Offset().X, self.SelectedRectangle.Y)
|
||||
for Index = 1, 9 do
|
||||
self.Bar[Index]:Colour(table.unpack(self.Data.Items[self.Data.Pagination.Min + Index]))
|
||||
end
|
||||
self.Text:Text(self.Data.Title.." ("..CurrentSelection.." of "..#self.Data.Items..")")
|
||||
end
|
||||
|
||||
function UIMenuColourPanel:Functions()
|
||||
|
||||
local SafeZone = {X = 0, Y = 0}
|
||||
if self.ParentItem:SetParentMenu().Settings.ScaleWithSafezone then
|
||||
SafeZone = GetSafeZoneBounds()
|
||||
end
|
||||
|
||||
|
||||
if IsMouseInBounds(self.LeftArrow.X + SafeZone.X, self.LeftArrow.Y + SafeZone.Y, self.LeftArrow.Width, self.LeftArrow.Height) then
|
||||
if IsDisabledControlJustPressed(0, 24) then
|
||||
if #self.Data.Items > self.Data.Pagination.Total + 1 then
|
||||
if self:CurrentSelection() <= self.Data.Pagination.Min + 1 then
|
||||
if self:CurrentSelection() == 1 then
|
||||
self.Data.Pagination.Min = #self.Data.Items - (self.Data.Pagination.Total + 1)
|
||||
self.Data.Pagination.Max = #self.Data.Items
|
||||
self.Data.Index = 1000 - (1000 % #self.Data.Items)
|
||||
self.Data.Index = self.Data.Index + (#self.Data.Items - 1)
|
||||
self:UpdateSelection()
|
||||
else
|
||||
self.Data.Pagination.Min = self.Data.Pagination.Min - 1
|
||||
self.Data.Pagination.Max = self.Data.Pagination.Max - 1
|
||||
self.Data.Index = self.Data.Index - 1
|
||||
self:UpdateSelection()
|
||||
end
|
||||
else
|
||||
self.Data.Index = self.Data.Index - 1
|
||||
self:UpdateSelection()
|
||||
end
|
||||
else
|
||||
self.Data.Index = self.Data.Index - 1
|
||||
self:UpdateSelection()
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if IsMouseInBounds(self.RightArrow.X + SafeZone.X, self.RightArrow.Y + SafeZone.Y, self.RightArrow.Width, self.RightArrow.Height) then
|
||||
if IsDisabledControlJustPressed(0, 24) then
|
||||
if #self.Data.Items > self.Data.Pagination.Total + 1 then
|
||||
if self:CurrentSelection() >= self.Data.Pagination.Max then
|
||||
if self:CurrentSelection() == #self.Data.Items then
|
||||
self.Data.Pagination.Min = 0
|
||||
self.Data.Pagination.Max = self.Data.Pagination.Total + 1
|
||||
self.Data.Index = 1000 - (1000 % #self.Data.Items)
|
||||
self:UpdateSelection()
|
||||
else
|
||||
self.Data.Pagination.Max = self.Data.Pagination.Max + 1
|
||||
self.Data.Pagination.Min = self.Data.Pagination.Max - (self.Data.Pagination.Total + 1)
|
||||
self.Data.Index = self.Data.Index + 1
|
||||
self:UpdateSelection()
|
||||
end
|
||||
else
|
||||
self.Data.Index = self.Data.Index + 1
|
||||
self:UpdateSelection()
|
||||
end
|
||||
else
|
||||
self.Data.Index = self.Data.Index + 1
|
||||
self:UpdateSelection()
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
for Index = 1, #self.Bar do
|
||||
if IsMouseInBounds(self.Bar[Index].X + SafeZone.X, self.Bar[Index].Y + SafeZone.Y, self.Bar[Index].Width, self.Bar[Index].Height) then
|
||||
if IsDisabledControlJustPressed(0, 24) then
|
||||
self:CurrentSelection(self.Data.Pagination.Min + Index - 1)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function UIMenuColourPanel:Draw() -- required
|
||||
if self.Data.Enabled then
|
||||
self.Background:Size(431 + self.ParentItem:SetParentMenu().WidthOffset, 112)
|
||||
|
||||
self.Background:Draw()
|
||||
self.LeftArrow:Draw()
|
||||
self.RightArrow:Draw()
|
||||
self.Text:Draw()
|
||||
self.SelectedRectangle:Draw()
|
||||
for Index = 1, #self.Bar do
|
||||
self.Bar[Index]:Draw()
|
||||
end
|
||||
self:Functions()
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,145 @@
|
||||
UIMenuGridPanel = setmetatable({}, UIMenuGridPanel)
|
||||
UIMenuGridPanel.__index = UIMenuGridPanel
|
||||
UIMenuGridPanel.__call = function() return "UIMenuPanel", "UIMenuGridPanel" end
|
||||
|
||||
function UIMenuGridPanel.New(TopText, LeftText, RightText, BottomText)
|
||||
_UIMenuGridPanel = {
|
||||
Data = {
|
||||
Enabled = true,
|
||||
},
|
||||
Background = Sprite.New("commonmenu", "gradient_bgd", 0, 0, 431, 275),
|
||||
Grid = Sprite.New("pause_menu_pages_char_mom_dad", "nose_grid", 0, 0, 200, 200, 0),
|
||||
Circle = Sprite.New("mpinventory","in_world_circle", 0, 0, 20, 20, 0),
|
||||
Audio = {Slider = "CONTINUOUS_SLIDER", Library = "HUD_FRONTEND_DEFAULT_SOUNDSET", Id = nil},
|
||||
ParentItem = nil,
|
||||
Text = {
|
||||
Top = UIResText.New(TopText or "Top", 0, 0, 0.35, 255, 255, 255, 255, 0, "Centre"),
|
||||
Left = UIResText.New(LeftText or "Left", 0, 0, 0.35, 255, 255, 255, 255, 0, "Centre"),
|
||||
Right = UIResText.New(RightText or "Right", 0, 0, 0.35, 255, 255, 255, 255, 0, "Centre"),
|
||||
Bottom = UIResText.New(BottomText or "Bottom", 0, 0, 0.35, 255, 255, 255, 255, 0, "Centre"),
|
||||
},
|
||||
}
|
||||
return setmetatable(_UIMenuGridPanel, UIMenuGridPanel)
|
||||
end
|
||||
|
||||
function UIMenuGridPanel:SetParentItem(Item) -- required
|
||||
if Item() == "UIMenuItem" then
|
||||
self.ParentItem = Item
|
||||
else
|
||||
return self.ParentItem
|
||||
end
|
||||
end
|
||||
|
||||
function UIMenuGridPanel:Enabled(Enabled)
|
||||
if type(Enabled) == "boolean" then
|
||||
self.Data.Enabled = Enabled
|
||||
else
|
||||
return self.Data.Enabled
|
||||
end
|
||||
end
|
||||
|
||||
function UIMenuGridPanel:CirclePosition(X, Y)
|
||||
if tonumber(X) and tonumber(Y) then
|
||||
self.Circle.X = (self.Grid.X + 20) + ((self.Grid.Width - 40) * ((X >= 0.0 and X <= 1.0) and X or 0.0)) - (self.Circle.Width/2)
|
||||
self.Circle.Y = (self.Grid.Y + 20) + ((self.Grid.Height - 40) * ((Y >= 0.0 and Y <= 1.0) and Y or 0.0)) - (self.Circle.Height/2)
|
||||
else
|
||||
return math.round((self.Circle.X - (self.Grid.X + 20) + (self.Circle.Width/2))/(self.Grid.Width - 40), 2), math.round((self.Circle.Y - (self.Grid.Y + 20) + (self.Circle.Height/2))/(self.Grid.Height - 40), 2)
|
||||
end
|
||||
end
|
||||
|
||||
function UIMenuGridPanel:Position(Y) -- required
|
||||
if tonumber(Y) then
|
||||
local ParentOffsetX, ParentOffsetWidth = self.ParentItem:Offset().X, self.ParentItem:SetParentMenu().WidthOffset
|
||||
|
||||
self.Background:Position(ParentOffsetX, Y)
|
||||
self.Grid:Position(ParentOffsetX + 115.5 + (ParentOffsetWidth/2), 37.5 + Y)
|
||||
self.Text.Top:Position(ParentOffsetX + 215.5 + (ParentOffsetWidth/2), 5 + Y)
|
||||
self.Text.Left:Position(ParentOffsetX + 57.75 + (ParentOffsetWidth/2), 120 + Y)
|
||||
self.Text.Right:Position(ParentOffsetX + 373.25 + (ParentOffsetWidth/2), 120 + Y)
|
||||
self.Text.Bottom:Position(ParentOffsetX + 215.5 + (ParentOffsetWidth/2), 240 + Y)
|
||||
|
||||
if not self.CircleLocked then
|
||||
self.CircleLocked = true
|
||||
self:CirclePosition(0.5, 0.5)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function UIMenuGridPanel:UpdateParent(X, Y)
|
||||
local _, ParentType = self.ParentItem()
|
||||
self.Data.Value = {X = X, Y = Y}
|
||||
if ParentType == "UIMenuListItem" then
|
||||
local PanelItemIndex = self.ParentItem:FindPanelItem()
|
||||
if PanelItemIndex then
|
||||
self.ParentItem.Items[PanelItemIndex].Value[self.ParentItem:FindPanelIndex(self)] = {X = X, Y = Y}
|
||||
self.ParentItem:Index(PanelItemIndex)
|
||||
self.ParentItem.Base.ParentMenu.OnListChange(self.ParentItem.Base.ParentMenu, self.ParentItem, self.ParentItem._Index)
|
||||
self.ParentItem.OnListChanged(self.ParentItem.Base.ParentMenu, self.ParentItem, self.ParentItem._Index)
|
||||
else
|
||||
local PanelIndex = self.ParentItem:FindPanelIndex(self)
|
||||
for Index = 1, #self.ParentItem.Items do
|
||||
if type(self.ParentItem.Items[Index]) == "table" then
|
||||
if not self.ParentItem.Items[Index].Panels then self.ParentItem.Items[Index].Panels = {} end
|
||||
self.ParentItem.Items[Index].Panels[PanelIndex] = {X = X, Y = Y}
|
||||
else
|
||||
self.ParentItem.Items[Index] = {Name = tostring(self.ParentItem.Items[Index]), Value = self.ParentItem.Items[Index], Panels = {[PanelIndex] = {X = X, Y = Y}}}
|
||||
end
|
||||
end
|
||||
self.ParentItem.Base.ParentMenu.OnListChange(self.ParentItem.Base.ParentMenu, self.ParentItem, self.ParentItem._Index)
|
||||
self.ParentItem.OnListChanged(self.ParentItem.Base.ParentMenu, self.ParentItem, self.ParentItem._Index)
|
||||
end
|
||||
elseif ParentType == "UIMenuItem" then
|
||||
self.ParentItem.ActivatedPanel(self.ParentItem.ParentMenu, self.ParentItem, self, {X = X, Y = Y})
|
||||
end
|
||||
end
|
||||
|
||||
function UIMenuGridPanel:Functions()
|
||||
local SafeZone = {X = 0, Y = 0}
|
||||
if self.ParentItem:SetParentMenu().Settings.ScaleWithSafezone then
|
||||
SafeZone = GetSafeZoneBounds()
|
||||
end
|
||||
|
||||
if IsMouseInBounds(self.Grid.X + 20 + SafeZone.X, self.Grid.Y + 20 + SafeZone.Y, self.Grid.Width - 40, self.Grid.Height - 40) then
|
||||
if IsDisabledControlJustPressed(0, 24) then
|
||||
if not self.Pressed then
|
||||
self.Pressed = true
|
||||
Citizen.CreateThread(function()
|
||||
self.Audio.Id = GetSoundId()
|
||||
PlaySoundFrontend(self.Audio.Id, self.Audio.Slider, self.Audio.Library, 1)
|
||||
while IsDisabledControlPressed(0, 24) and IsMouseInBounds(self.Grid.X + 20 + SafeZone.X, self.Grid.Y + 20 + SafeZone.Y, self.Grid.Width - 40, self.Grid.Height - 40) do
|
||||
Citizen.Wait(0)
|
||||
local CursorX, CursorY = math.round(GetControlNormal(0, 239) * 1920) - SafeZone.X - (self.Circle.Width/2), math.round(GetControlNormal(0, 240) * 1080) - SafeZone.Y - (self.Circle.Height/2)
|
||||
|
||||
self.Circle:Position(((CursorX > (self.Grid.X + 10 + self.Grid.Width - 40)) and (self.Grid.X + 10 + self.Grid.Width - 40) or ((CursorX < (self.Grid.X + 20 - (self.Circle.Width/2))) and (self.Grid.X + 20 - (self.Circle.Width/2)) or CursorX)), ((CursorY > (self.Grid.Y + 10 + self.Grid.Height - 40)) and (self.Grid.Y + 10 + self.Grid.Height - 40) or ((CursorY < (self.Grid.Y + 20 - (self.Circle.Height/2))) and (self.Grid.Y + 20 - (self.Circle.Height/2)) or CursorY)))
|
||||
end
|
||||
StopSound(self.Audio.Id)
|
||||
ReleaseSoundId(self.Audio.Id)
|
||||
self.Pressed = false
|
||||
end)
|
||||
Citizen.CreateThread(function()
|
||||
while IsDisabledControlPressed(0, 24) and IsMouseInBounds(self.Grid.X + 20 + SafeZone.X, self.Grid.Y + 20 + SafeZone.Y, self.Grid.Width - 40, self.Grid.Height - 40) do
|
||||
Citizen.Wait(75)
|
||||
local ResultX, ResultY = math.round((self.Circle.X - (self.Grid.X + 20) + (self.Circle.Width/2))/(self.Grid.Width - 40), 2), math.round((self.Circle.Y - (self.Grid.Y + 20) + (self.Circle.Height/2))/(self.Grid.Height - 40), 2)
|
||||
|
||||
self:UpdateParent((((ResultX >= 0.0 and ResultX <= 1.0) and ResultX or ((ResultX <= 0) and 0.0) or 1.0) * 2) - 1, (((ResultY >= 0.0 and ResultY <= 1.0) and ResultY or ((ResultY <= 0) and 0.0) or 1.0) * 2) - 1)
|
||||
end
|
||||
end)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function UIMenuGridPanel:Draw() -- required
|
||||
if self.Data.Enabled then
|
||||
self.Background:Size(431 + self.ParentItem:SetParentMenu().WidthOffset, 275)
|
||||
|
||||
self.Background:Draw()
|
||||
self.Grid:Draw()
|
||||
self.Circle:Draw()
|
||||
self.Text.Top:Draw()
|
||||
self.Text.Left:Draw()
|
||||
self.Text.Right:Draw()
|
||||
self.Text.Bottom:Draw()
|
||||
self:Functions()
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,141 @@
|
||||
UIMenuPercentagePanel = setmetatable({}, UIMenuPercentagePanel)
|
||||
UIMenuPercentagePanel.__index = UIMenuPercentagePanel
|
||||
UIMenuPercentagePanel.__call = function() return "UIMenuPanel", "UIMenuPercentagePanel" end
|
||||
|
||||
function UIMenuPercentagePanel.New(MinText, MaxText)
|
||||
_UIMenuPercentagePanel = {
|
||||
Data = {
|
||||
Enabled = true,
|
||||
},
|
||||
Background = Sprite.New("commonmenu", "gradient_bgd", 0, 0, 431, 76),
|
||||
ActiveBar = UIResRectangle.New(0, 0, 413, 10, 245, 245, 245, 255),
|
||||
BackgroundBar = UIResRectangle.New(0, 0, 413, 10, 87, 87, 87, 255),
|
||||
Text = {
|
||||
Min = UIResText.New(MinText or "0%", 0, 0, 0.35, 255, 255, 255, 255, 0, "Centre"),
|
||||
Max = UIResText.New("100%", 0, 0, 0.35, 255, 255, 255, 255, 0, "Centre"),
|
||||
Title = UIResText.New(MaxText or "Opacity", 0, 0, 0.35, 255, 255, 255, 255, 0, "Centre"),
|
||||
},
|
||||
Audio = {Slider = "CONTINUOUS_SLIDER", Library = "HUD_FRONTEND_DEFAULT_SOUNDSET", Id = nil},
|
||||
ParentItem = nil,
|
||||
}
|
||||
|
||||
return setmetatable(_UIMenuPercentagePanel, UIMenuPercentagePanel)
|
||||
end
|
||||
|
||||
function UIMenuPercentagePanel:SetParentItem(Item) -- required
|
||||
if Item() == "UIMenuItem" then
|
||||
self.ParentItem = Item
|
||||
else
|
||||
return self.ParentItem
|
||||
end
|
||||
end
|
||||
|
||||
function UIMenuPercentagePanel:Enabled(Enabled)
|
||||
if type(Enabled) == "boolean" then
|
||||
self.Data.Enabled = Enabled
|
||||
else
|
||||
return self.Data.Enabled
|
||||
end
|
||||
end
|
||||
|
||||
function UIMenuPercentagePanel:Position(Y) -- required
|
||||
if tonumber(Y) then
|
||||
local ParentOffsetX, ParentOffsetWidth = self.ParentItem:Offset().X, self.ParentItem:SetParentMenu().WidthOffset
|
||||
self.Background:Position(ParentOffsetX, Y)
|
||||
self.ActiveBar:Position(ParentOffsetX + (ParentOffsetWidth/2) + 9, 50 + Y)
|
||||
self.BackgroundBar:Position(ParentOffsetX + (ParentOffsetWidth/2) + 9, 50 + Y)
|
||||
self.Text.Min:Position(ParentOffsetX + (ParentOffsetWidth/2) + 25, 15 + Y)
|
||||
self.Text.Max:Position(ParentOffsetX + (ParentOffsetWidth/2) + 398, 15 + Y)
|
||||
self.Text.Title:Position(ParentOffsetX + (ParentOffsetWidth/2) + 215.5, 15 + Y)
|
||||
end
|
||||
end
|
||||
|
||||
function UIMenuPercentagePanel:Percentage(Value)
|
||||
if tonumber(Value) then
|
||||
local Percent = ((Value < 0.0) and 0.0) or ((Value > 1.0) and 1.0 or Value)
|
||||
self.ActiveBar:Size(self.BackgroundBar.Width * Percent, self.ActiveBar.Height)
|
||||
else
|
||||
local SafeZone = {X = 0, Y = 0}
|
||||
if self.ParentItem:SetParentMenu().Settings.ScaleWithSafezone then
|
||||
SafeZone = GetSafeZoneBounds()
|
||||
end
|
||||
|
||||
local Progress = (math.round(GetControlNormal(0, 239) * 1920) - SafeZone.X) - self.ActiveBar.X
|
||||
return math.round(((Progress >= 0 and Progress <= 413) and Progress or ((Progress < 0) and 0 or 413))/self.BackgroundBar.Width, 2)
|
||||
end
|
||||
end
|
||||
|
||||
function UIMenuPercentagePanel:UpdateParent(Percentage)
|
||||
local _, ParentType = self.ParentItem()
|
||||
if ParentType == "UIMenuListItem" then
|
||||
local PanelItemIndex = self.ParentItem:FindPanelItem()
|
||||
if PanelItemIndex then
|
||||
self.ParentItem.Items[PanelItemIndex].Value[self.ParentItem:FindPanelIndex(self)] = Percentage
|
||||
self.ParentItem:Index(PanelItemIndex)
|
||||
self.ParentItem.Base.ParentMenu.OnListChange(self.ParentItem.Base.ParentMenu, self.ParentItem, self.ParentItem._Index)
|
||||
self.ParentItem.OnListChanged(self.ParentItem.Base.ParentMenu, self.ParentItem, self.ParentItem._Index)
|
||||
else
|
||||
local PanelIndex = self.ParentItem:FindPanelIndex(self)
|
||||
for Index = 1, #self.ParentItem.Items do
|
||||
if type(self.ParentItem.Items[Index]) == "table" then
|
||||
if not self.ParentItem.Items[Index].Panels then self.ParentItem.Items[Index].Panels = {} end
|
||||
self.ParentItem.Items[Index].Panels[PanelIndex] = Percentage
|
||||
else
|
||||
self.ParentItem.Items[Index] = {Name = tostring(self.ParentItem.Items[Index]), Value = self.ParentItem.Items[Index], Panels = {[PanelIndex] = Percentage}}
|
||||
end
|
||||
end
|
||||
self.ParentItem.Base.ParentMenu.OnListChange(self.ParentItem.Base.ParentMenu, self.ParentItem, self.ParentItem._Index)
|
||||
self.ParentItem.OnListChanged(self.ParentItem.Base.ParentMenu, self.ParentItem, self.ParentItem._Index)
|
||||
end
|
||||
elseif ParentType == "UIMenuItem" then
|
||||
self.ParentItem.ActivatedPanel(self.ParentItem.ParentMenu, self.ParentItem, self, Percentage)
|
||||
end
|
||||
end
|
||||
|
||||
function UIMenuPercentagePanel:Functions()
|
||||
|
||||
local SafeZone = {X = 0, Y = 0}
|
||||
if self.ParentItem:SetParentMenu().Settings.ScaleWithSafezone then
|
||||
SafeZone = GetSafeZoneBounds()
|
||||
end
|
||||
|
||||
if IsMouseInBounds(self.BackgroundBar.X + SafeZone.X, self.BackgroundBar.Y - 4 + SafeZone.Y, self.BackgroundBar.Width, self.BackgroundBar.Height + 8) then
|
||||
if IsDisabledControlJustPressed(0, 24) then
|
||||
if not self.Pressed then
|
||||
self.Pressed = true
|
||||
Citizen.CreateThread(function()
|
||||
self.Audio.Id = GetSoundId()
|
||||
PlaySoundFrontend(self.Audio.Id, self.Audio.Slider, self.Audio.Library, 1)
|
||||
while IsDisabledControlPressed(0, 24) and IsMouseInBounds(self.BackgroundBar.X + SafeZone.X, self.BackgroundBar.Y - 4 + SafeZone.Y, self.BackgroundBar.Width, self.BackgroundBar.Height + 8) do
|
||||
Citizen.Wait(0)
|
||||
local Progress = (math.round(GetControlNormal(0, 239) * 1920) - SafeZone.X) - self.ActiveBar.X
|
||||
self.ActiveBar:Size(((Progress >= 0 and Progress <= 413) and Progress or ((Progress < 0) and 0 or 413)), self.ActiveBar.Height)
|
||||
end
|
||||
StopSound(self.Audio.Id)
|
||||
ReleaseSoundId(self.Audio.Id)
|
||||
self.Pressed = false
|
||||
end)
|
||||
Citizen.CreateThread(function()
|
||||
while IsDisabledControlPressed(0, 24) and IsMouseInBounds(self.BackgroundBar.X + SafeZone.X, self.BackgroundBar.Y - 4 + SafeZone.Y, self.BackgroundBar.Width, self.BackgroundBar.Height + 8) do
|
||||
Citizen.Wait(75)
|
||||
local Progress = (math.round(GetControlNormal(0, 239) * 1920) - SafeZone.X) - self.ActiveBar.X
|
||||
self:UpdateParent(math.round(((Progress >= 0 and Progress <= 413) and Progress or ((Progress < 0) and 0 or 413))/self.BackgroundBar.Width, 2))
|
||||
end
|
||||
end)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function UIMenuPercentagePanel:Draw() -- required
|
||||
if self.Data.Enabled then
|
||||
self.Background:Size(431 + self.ParentItem:SetParentMenu().WidthOffset, 76)
|
||||
self.Background:Draw()
|
||||
self.BackgroundBar:Draw()
|
||||
self.ActiveBar:Draw()
|
||||
self.Text.Min:Draw()
|
||||
self.Text.Max:Draw()
|
||||
self.Text.Title:Draw()
|
||||
self:Functions()
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,69 @@
|
||||
UIMenuHeritageWindow = setmetatable({}, UIMenuHeritageWindow)
|
||||
UIMenuHeritageWindow.__index = UIMenuHeritageWindow
|
||||
UIMenuHeritageWindow.__call = function() return "UIMenuWindow", "UIMenuHeritageWindow" end
|
||||
|
||||
function UIMenuHeritageWindow.New(Mum, Dad)
|
||||
if not tonumber(Mum) then Mum = 0 end
|
||||
if not (Mum >= 0 and Mum <= 21) then Mum = 0 end
|
||||
if not tonumber(Dad) then Dad = 0 end
|
||||
if not (Dad >= 0 and Dad <= 23) then Dad = 0 end
|
||||
_UIMenuHeritageWindow = {
|
||||
Background = Sprite.New("pause_menu_pages_char_mom_dad", "mumdadbg", 0, 0, 431, 228), -- Background is required, must be a sprite or a rectangle.
|
||||
MumSprite = Sprite.New("char_creator_portraits", ((Mum < 21) and "female_"..Mum or "special_female_"..(tonumber(string.sub(Mum, 2, 2)) - 1)), 0, 0, 228, 228),
|
||||
DadSprite = Sprite.New("char_creator_portraits", ((Dad < 21) and "male_"..Dad or "special_male_"..(tonumber(string.sub(Dad, 2, 2)) - 1)), 0, 0, 228, 228),
|
||||
Mum = Mum,
|
||||
Dad = Dad,
|
||||
_Offset = {X = 0, Y = 0}, -- required
|
||||
ParentMenu = nil, -- required
|
||||
}
|
||||
return setmetatable(_UIMenuHeritageWindow, UIMenuHeritageWindow)
|
||||
end
|
||||
|
||||
function UIMenuHeritageWindow:SetParentMenu(Menu) -- required
|
||||
if Menu() == "UIMenu" then
|
||||
self.ParentMenu = Menu
|
||||
else
|
||||
return self.ParentMenu
|
||||
end
|
||||
end
|
||||
|
||||
function UIMenuHeritageWindow:Offset(X, Y) -- required
|
||||
if tonumber(X) or tonumber(Y) then
|
||||
if tonumber(X) then
|
||||
self._Offset.X = tonumber(X)
|
||||
end
|
||||
if tonumber(Y) then
|
||||
self._Offset.Y = tonumber(Y)
|
||||
end
|
||||
else
|
||||
return self._Offset
|
||||
end
|
||||
end
|
||||
|
||||
function UIMenuHeritageWindow:Position(Y) -- required
|
||||
if tonumber(Y) then
|
||||
self.Background:Position(self._Offset.X, 144 + Y + self._Offset.Y)
|
||||
self.MumSprite:Position(self._Offset.X + (self.ParentMenu.WidthOffset/2) + 25, 144 + Y + self._Offset.Y)
|
||||
self.DadSprite:Position(self._Offset.X + (self.ParentMenu.WidthOffset/2) + 195, 144 + Y + self._Offset.Y)
|
||||
end
|
||||
end
|
||||
|
||||
function UIMenuHeritageWindow:Index(Mum, Dad)
|
||||
if not tonumber(Mum) then Mum = self.Mum end
|
||||
if not (Mum >= 0 and Mum <= 21) then Mum = self.Mum end
|
||||
if not tonumber(Dad) then Dad = self.Dad end
|
||||
if not (Dad >= 0 and Dad <= 23) then Dad = self.Dad end
|
||||
|
||||
self.Mum = Mum
|
||||
self.Dad = Dad
|
||||
|
||||
self.MumSprite.TxtName = ((self.Mum < 21) and "female_"..self.Mum or "special_female_"..(tonumber(string.sub(Mum, 2, 2)) - 1))
|
||||
self.DadSprite.TxtName = ((self.Dad < 21) and "male_"..self.Dad or "special_male_"..(tonumber(string.sub(Dad, 2, 2)) - 1))
|
||||
end
|
||||
|
||||
function UIMenuHeritageWindow:Draw() -- required
|
||||
self.Background:Size(431 + self.ParentMenu.WidthOffset, 228)
|
||||
self.Background:Draw()
|
||||
self.DadSprite:Draw()
|
||||
self.MumSprite:Draw()
|
||||
end
|
||||
Reference in New Issue
Block a user