Jump to content

Painel DX bugado


Recommended Posts

Painel DX Bugado

Bom, eu recentemente baixei um script de painel dx, o problema e que eu utilizo MTA no Modo Janela por questões de FPS, só que painel só funciona direito se eu tiver com a Tela Cheia, eu gostaria de saber como eu posso estar arrumando o script para que ele possa Funcionar tanto na Tela cheia, como na Modo Janela

Print do Painel Modo Janela

spacer.png

Print do Painel Tela cheia

spacer.png

Codigo
Caso vocês precisem se forem detectar o problema no código em si

cFenixMTA.lua

 --[[


 ################################################
 #                                              #
 #             SCRIPT DESENVOLVIDO POR:         #
 #             Facebook.com/FENIXMTA/           #
 #             Youtube.com/FENIXMTA             #
 #             Não retire os créditos !         #
 #                                              #
 ################################################




 --]]

local screenW, screenH = guiGetScreenSize()
local resW, resH = 1360,768
local x, y = (screenW/resW), (screenH/resH)

local dxfont0_fonte = dxCreateFont("Files/fonte.ttf", 10)
local dxfont1_fonte = dxCreateFont("Files/fonte.ttf", 12)

FM_gridList = dxGrid:Create(screenW * 0.4034, screenH * 0.4844, screenW * 0.1757, screenH * 0.1237)
colum = FM_gridList:AddColumn("Tempo", 230)
FM_gridList:SetVisible(false)

local components = { "Segundo(s)", "Minuto(s)", "Hora(s)", "Dia(s)" }
for _, component in ipairs( components ) do
	 FM_gridList:AddItem ( colum ,component)
end

local ID = createElement("FM_dxEditBox") 
local Motivo = createElement("FM_dxEditBox")
local Tempo = createElement("FM_dxEditBox")

function dxPainel ()

        dxDrawRectangle(screenW * 0.3477, screenH * 0.2708, screenW * 0.2870, screenH * 0.4310, tocolor(0, 0, 0, 160), false)
        dxDrawRectangle(screenW * 0.3477, screenH * 0.2708, screenW * 0.2870, screenH * 0.0391, tocolor(0, 0, 0, 160), false)
        dxDrawRectangle(screenW * 0.3477, screenH * 0.3099, screenW * 0.1127, screenH * 0.0000, tocolor(255, 0, 0, 255), false)
        dxDrawRectangle(screenW * 0.3477, screenH * 0.3099, screenW * 0.2870, screenH * 0.0039, tocolor(255, 0, 0, 255), false)
        dxDrawText("Painel de Punições", 475, 208, 867, 238, tocolor(255, 255, 255, 255), 1.00, dxfont0_fonte, "center", "center", false, false, false, false, false)
		dxDrawEditBox("ID Jogador", screenW * 0.4034, screenH * 0.3320, screenW * 0.1757, screenH * 0.0378, false, 100, ID)
		dxDrawEditBox("Motivo do Ban", screenW * 0.4034, screenH * 0.3828, screenW * 0.1757, screenH * 0.0378, false, 200, Motivo)
		dxDrawEditBox("Tempo do Ban", screenW * 0.4034, screenH * 0.4336, screenW * 0.1757, screenH * 0.0378, false, 200, Tempo)
        dxDrawImage(screenW * 0.4341, screenH * 0.6276, screenW * 0.1142, screenH * 0.0612, "Files/button.png", 0, 0, 0, tocolor(255, 0, 0, 255), false)
        dxDrawText("Banir", screenW * 0.4341, screenH * 0.6250, screenW * 0.5483, screenH * 0.6888, tocolor(255, 255, 255, 255), 1.00, dxfont1_fonte, "center", "center", false, false, false, false, false)
		
end		

function abrirDx ()
  if not isEventHandlerAdded("onClientRender", getRootElement(), dxPainel) then
     addEventHandler("onClientRender", root , dxPainel)
     showCursor(true)
	 FM_gridList:SetVisible(true)
	 else
	 removeEventHandler ("onClientRender" , root, dxPainel)
	 showCursor(false)
	 FM_gridList:SetVisible(false)
    end
end
addEvent ("FM_OpenPainel", true)
addEventHandler ("FM_OpenPainel", getRootElement(), abrirDx )

function Banir (_,state)
 if isEventHandlerAdded("onClientRender", root, dxPainel) then  
  if state == "down" then
  if cursorPosition (screenW * 0.4341, screenH * 0.6276, screenW * 0.1142, screenH * 0.0612) then  
  local ID_Jogador = getElementData(ID, "FM_Texto")  
  local Motivo_Banir = getElementData(Motivo, "FM_Texto") 
  local Tempo_Banir = getElementData(Tempo, "FM_Texto") 
  local gridItem = FM_gridList:GetSelectedItem()
  local Tempo_Selecionado = FM_gridList:GetItemDetails( colum, gridItem, 1) or nil
  local ID =  tonumber ( ID_Jogador ) or nil
  local T_Banir =  tonumber ( Tempo_Banir ) or nil
  if ID == tonumber("0") or ID == nil then
  return outputChatBox("ID")
  end
  if Motivo_Banir == "" or Motivo_Banir == nil then
  return outputChatBox("Motivo")
  end
  if T_Banir == tonumber("0") or T_Banir == nil then
  return outputChatBox("TEMPO")
  end
  if Tempo_Selecionado == nil then
  return outputChatBox("Escolha tempo")
  end
  triggerServerEvent ( "FM_banirJogador", getLocalPlayer(), ID , T_Banir, Tempo_Selecionado, Motivo_Banir )
      end
    end
  end
end
addEventHandler ( "onClientClick", root, Banir )

function isEventHandlerAdded( sEventName, pElementAttachedTo, func )
	if 
		type( sEventName ) == 'string' and 
		isElement( pElementAttachedTo ) and 
		type( func ) == 'function' 
	then
		local aAttachedFunctions = getEventHandlers( sEventName, pElementAttachedTo )
		if type( aAttachedFunctions ) == 'table' and #aAttachedFunctions > 0 then
			for i, v in ipairs( aAttachedFunctions ) do
				if v == func then
					return true
				end
			end
		end
	end

	return false
end

function cursorPosition(x, y, w, h)
	if (not isCursorShowing()) then
		return false
	end
	local mx, my = getCursorPosition()
	local fullx, fully = guiGetScreenSize()
	cursorx, cursory = mx*fullx, my*fully
	if cursorx > x and cursorx < x + w and cursory > y and cursory < y + h then
		return true
	else
		return false
	end
end

sFenixMTA.lua

 --[[


 ################################################
 #                                              #                                                  
 #             SCRIPT DESENVOLVIDO POR:         #
 #             Facebook.com/FENIXMTA/           #
 #             Youtube.com/FENIXMTA             #
 #             Não retire os créditos !         #
 #                                              #
 ################################################




 --]]
 
function getPlayerID(id)
	v = false
	for i, player in ipairs (getElementsByType("player")) do
		if getElementData(player, "ID") == id then
			v = player
			break
		end
	end
	return v
end
 
Acl = "Admin" -- Grupo do Painel P , que terá acesso ao Dx

Cmd = "punir" -- Comando para abrir o Dx

function abrirDx (source,command)
 local acc = getAccountName(getPlayerAccount(source))
      if isObjectInACLGroup("user."..acc, aclGetGroup (Acl)) then
	  triggerClientEvent (source, "FM_OpenPainel", source)
   end
end
addCommandHandler(Cmd ,abrirDx) 

function banirJogador ( ID , T_Banir , Tempo_Selecionado , Motivo_Banir)

local FDP = getPlayerID(ID)

if Tempo_Selecionado == "Segundo(s)" then
     Multiplicador = 1
elseif Tempo_Selecionado == "Minuto(s)" then
     Multiplicador = 60
elseif Tempo_Selecionado == "Hora(s)" then
     Multiplicador = 3600
elseif Tempo_Selecionado == "Dia(s)" then
     Multiplicador = 86400
    end
  Tempo = T_Banir*Multiplicador
  banPlayer ( FDP, true, false, true, "" , ""..Motivo_Banir.."" , ""..Tempo.."" )

end
addEvent("FM_banirJogador" , true)
addEventHandler("FM_banirJogador" , getRootElement() , banirJogador) 

addEventHandler ( "onResourceStart", resourceRoot, function ( mod )
        if isObjectInACLGroup ( "resource." .. getResourceName ( mod ), aclGetGroup ( "Admin" ) ) then
            outputDebugString ( "Banco Itaú Ativado com Sucesso.", 3 )
		else
     		cancelEvent ( )
            outputChatBox ( "#FFA500[ATENÇÃO] #FFFFFF- Para Ativar este #FFA500Resource  #FFFFFF[...]  Adicione sua ACL no #FFA500Admin.", root, 255, 255, 255, true )  
    end
end
)
 

 

Link to comment
19 minutes ago, ~#BlackSCR said:

Cade a função de criação do gridlist?

Gridlist
 

local font1 = dxCreateFont("Files/fonte.ttf", 10)
local font_10 = dxCreateFont("Files/fonte.ttf", 10)
local font_11 = dxCreateFont("Files/fonte.ttf", 9)

dxGrid          =   { items = {} };
local cursorOn;

local NATIVE_RESOLUTION     =   { nil } -- put your screen resolution here to fit the gridlists to all resolutions (ex: { 1366, 768 } )
if ( table.maxn ( NATIVE_RESOLUTION ) == 2 ) then
    FIT_MODE                =   true
    RES                     =   { guiGetScreenSize() };
    X,Y                     =   RES[1] / NATIVE_RESOLUTION[1], RES[2] / NATIVE_RESOLUTION[2];
    SCALE                   =   ( 1 / NATIVE_RESOLUTION[1] ) * RES[1];
end

--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- Core - functions

function dxGrid:Create ( x, y, width, height, postGUI )
    -- table dxGrid:Create ( int x, int y, int width, int height[, bool postGUI ] )

    if __checkParams ( "Create", "nnnn", x, y, width, height ) then
        local data = {
            x       =       FIT_MODE and ( x * X ) or x;                                -- X position
            y       =       FIT_MODE and ( y * Y ) or y;                                -- Y position
            w       =       FIT_MODE and ( width * X ) or width;                        -- Width
            h       =       FIT_MODE and ( height * Y ) or height;                      -- Height
            pg      =       postGUI or false;                                           -- PostGUI
            i       =       {};                                                         -- Items
            mi      =       __calcMaxItems ( FIT_MODE and ( height * Y ) or height );   -- Max items
            s       =       1;                                                          -- Scroll Level
            r       =       -1;                                                         -- Row count
            se      =       -1;                                                         -- Selected item
            mo      =       nil;                                                        -- Mouse-on item
            vis     =       true                                                        -- Visible
        };

        setmetatable ( data, { __index = dxGrid } );
        table.insert ( dxGrid.items, data );

        return data;
    end
end

function dxGrid:Destroy ()
    -- bool dxGrid:Destroy ()

    for k, v in pairs ( dxGrid.items ) do
        if v == self then
            dxGrid.items[k] = nil;
            return true;
        end
    end
    return false;
end

function dxGrid:SetItemText (itemID, column, new_text )

    if __checkParams ( "SetItemText", "nns", itemID, column, new_text ) then
        if self.i[column] and self.i[column][itemID] then
            self.i[column][itemID].text = new_text
            return self.i[column][itemID].text == new_text
        end
    end
    return false
end

function dxGrid:SetVisible ( visible )
    -- bool Gridlist:SetVisible ( bool state )
    
    if __checkParams ( "SetVisible", "b", visible ) then
        self.vis = visible

        return true
    else
        return false
    end
end

function dxGrid:IsVisible ( )
    -- bool Gridlist:IsVisible()

    return self.vis
end

function dxGrid:AddColumn ( title, width )
    -- int Gridlist:AddColumn ( string title, int width )

    if __checkParams ( "AddColumn", "sn", title, width ) then
        local data = {
            info    =   { title = title, width = FIT_MODE and ( width * X ) or width }
        };

        table.insert ( self.i, data );

        return #self.i;
    end
end

function dxGrid:RemoveColumn ( columnIndex )
    -- bool Gridlist:RemoveColumn ( int columnIndex )

    if __checkParams ( "RemoveColumn", "n", columnIndex ) then
        self.i[columnIndex] = nil;

        -- Recalculate the highest item count
        local highest = -1;

        for _, v in ipairs ( self.i ) do
            if #v > highest then
                highest = ( #v - 1 );
            end
        end

        self.r = highest;

        -- Recalculate the scroll level (if necessary)
        if ( ( ( self.s + self.mi ) - 2 ) == self.r ) then
            self.s = ( self.r - self.mi ) + 1;
        end

        return true
    end
    return false
end

function dxGrid:GetColumnCount ()
    -- int Gridlist:GetColumnCount()

    return #self.i
end

function dxGrid:AddItem ( columnIndex, text, data, r, g, b )
    -- int Gridlist:AddItem ( int columnIndex, string title[, mixed data, int r, int g, int b ] )

    if __checkParams ( "AddItem", "ns", columnIndex, text ) then
        if self.i[columnIndex] then 
            local tColor = __checkRGB ( r, g, b ) and { r, g, b } or { 255, 255, 255 };
            
            table.insert ( self.i[columnIndex], { id = #self.i[columnIndex] + 1, text = tostring( text ), data = data, color = tColor } );

            if #self.i[columnIndex] > self.r then
                self.r = #self.i[columnIndex];
            end

            return #self.i[columnIndex];
        end
        return false;
    end
end

function dxGrid:RemoveItem ( column, itemID )
    -- bool Gridlist:RemoveItem ( int columnIndex, int itemIndex )

    if __checkParams ( "RemoveItem", "nn", column, itemID ) then
        if self.i[column] and self.i[column][itemID] then
            -- Recalculate the highest item count
            if self.r == #self.i[column] then
                local highest = -1;

                for _, v in ipairs ( self.i ) do
                    if #v > highest then
                        highest = ( #v - 1 );
                    end
                end

                self.r = highest;
            end

            -- Recalculate the scroll level (if necessary)
            if ( ( ( self.s + self.mi ) - 2 ) == self.r ) then
                self.s = ( self.r - self.mi ) + 1;
            end

            -- Reset the selected item if necessary²
            if itemID == self.se then
                local newItem   =   self.se - 1

                if newItem <= self.r then
                    self.se = math.max ( 0, newItem );
                else
                    self.se = -1
                end
            end

            table.remove ( self.i[column], itemID );

            return true;
        end
        return false
    end
end

function dxGrid:GetItemCount ( columnID )
    -- int Gridlist:GetItemCount ( int columnIndex )

    if __checkParams ( "GetItemCount", "n", columnID ) then
        if self.i[columnID] then
            return #self.i[columnID]
        end
        return false
    end
end

function dxGrid:Clear ()
    -- bool Gridlist:Clear()

    for k, v in ipairs ( self.i ) do
        self.i[k] = { info = v.info }
    end

    self.r = -1
    self.se = nil

    -- Recalculate the scroll level
    self.s = 1;

    return true
end

function dxGrid:GetSelectedItem ( )
    -- int Gridlist:GetSelectedItem ()

    return self.se;
end

function dxGrid:SetSelectedItem ( itemID )
    -- bool Gridlist:SetSelectedItem ( int itemIndex )

    if __checkParams ( "SetSelectedItem", "n", itemID ) then
        if itemID <= self.r then
            self.se = itemID;
            return self.se == itemID;
        end
        return false;
    end
end

function dxGrid:GetItemDetails ( column, itemID )
    -- string, mixed Gridlist:GetItemDetails ( int columnIndex, int itemIndex )

    if __checkParams ( "GetItemDetails", "nn", columnID, itemID ) then
        if self.i[column] then
            if self.i[column][itemID] then
                return self.i[column][itemID].text, self.i[column][itemID].data
            end
        end
        return false
    end
end

--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- Core - render/move

addEventHandler ( "onClientRender", root,
    function ( )
        -- Is there any gridlist to render?
        if #dxGrid.items > 0 then
            -- Loop through all grid lists
            for index, data in ipairs ( dxGrid.items ) do
                -- Is the gridlist visible?
                if data.vis then
                    -- Draw the 'gridlist' itself                  
                    dxDrawRectangle (data.x, data.y, data.w, data.h, tocolor ( 0, 0, 0, 100), data.pg );

                    -- Draw the column bar
                    dxDrawRectangle ( data.x, data.y, data.w, 30 % data.h, tocolor (255, 0 , 0 , 255), data.pg );

                    -- Set cursorOn variable to the current gridlist, if it's selected
                    cursorOn = nil
                    if __isMouseInPosition ( data.x, data.y, data.w, data.h ) then
                        cursorOn = index;
                    end

                    -- Check if there's any selected item
                    local seeFrom   =   data.s;
                    local seeTo     =   ( data.s + data.mi ) - 1;

                    if data.se and data.se <= data.r and data.se >= seeFrom and data.se <= seeTo then
                        local index     =   data.se - ( data.s - 1 );
                        local y2        =   data.y + ( ( index - 1 ) * 25 );

                        -- Draw a rectangle to make it looks like selected
                        dxDrawRectangle ( data.x, ( 30 % data.h ) + y2, data.w, 25, tocolor ( 0, 0, 0, 110 ), data.pg );

                      --  dxDrawRectangle ( data.x, ( 30 % data.h ) + y2, data.w, 25, tocolor (0, 0, 0,  ), data.pg );
                    end

                    -- Is there any column?
                    if #data.i > 0 then
                    local cWidth = 0

                        -- Loop through all columns
                        for cIndex, cData in ipairs ( data.i ) do
                            -- we'll go beyond the gridlist width with this column ?
                            if ( ( cWidth + cData.info.width ) <= data.w ) then
                                local x = data.x + cWidth;

                                -- Draw the column title
                                dxDrawText ( cData.info.title, x + 10, data.y, cData.info.width + x, ( 30 % data.h ) + data.y, tocolor ( 255, 255, 255 , 200 ), FIT_MODE and ( 1 * SCALE ) or 1, font_10, "center", "center", true, true, data.pg, false, true );

                                -- Reset the selected item
                                cData.info.selected = -1;

                                -- Is there any item ?
                                if #cData > 0 then
                                    local seeFrom   =   data.s;
                                    local seeTo     =   ( data.s + data.mi ) - 1;

                                    -- Loop the items
                                    for iIndex = seeFrom, seeTo do
                                        -- There's a row with this index in the current column?
                                        if cData[iIndex] then
                                            local index     =   iIndex - ( data.s - 1 );
                                            local y         =   data.y + ( index * 25 );
                                            local y2        =   data.y + ( ( index - 1 ) * 25 );

                                            -- Check if cursor is on item position
                                            if __isMouseInPosition ( data.x, ( 30 % data.h ) + y2, data.w, 25 ) then
                                                -- Define the mouse-on variable
                                                data.mo = iIndex;
                                            end

                                            -- Draw the item text
                                            dxDrawText ( cData[iIndex]["text"], x + 10, y, cData.info.width + x, ( 30 % data.h ) + y + 5, tocolor ( 255, 255, 255, 255), FIT_MODE and ( 1 * SCALE ) or 1, font_11, "left", "center", true, true, data.pg, false, true );
                                        end
                                    end
                                end

                                -- Increase cWidth variable (to draw the columns correctly)
                                cWidth = cWidth + cData.info.width;
                            end
                        end
                    end
                end
            end
        end
    end
, true, "low-5")

--

addEventHandler ( "onClientKey", root,
    function ( button, press )
        -- Is cursor showing?
        if isCursorShowing () then
            -- Is there any gridlist?
            if #dxGrid.items > 0 then
                -- Is there any selected gridlist?
                if cursorOn then
                    -- We pressed the scroll?
                    if press and #button > 6 then
                        -- Does the gridlist requires scroll?
                        if dxGrid.items[cursorOn].r > dxGrid.items[cursorOn].mi then
                            -- Define some variables
                            local index         =   cursorOn;
                            local currentValue  =   dxGrid.items[index].s;
                            local newValue      =   math.max(1, button == "mouse_wheel_down" and currentValue + 2 or button == "arrow_d" and currentValue + 2 or button == "mouse_wheel_up" and currentValue - 1 or button == "arrow_u" and currentValue - 1)

                            -- Check if we have spent the row's limit with the new value
                            if ( ( newValue + dxGrid.items[index].mi ) > dxGrid.items[index].r ) then
                                newValue = ( dxGrid.items[index].r - dxGrid.items[index].mi ) + 1;
                            end



                            -- Set the new scroll level
                            dxGrid.items[index].s = newValue;
                        end
                    elseif press and button == "mouse1" and dxGrid.items[cursorOn].mo then
                        dxGrid.items[cursorOn].se = dxGrid.items[cursorOn].mo;
                    end
                end
            end
        end
    end
)

--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- Useful

function __calcMaxItems ( height )
    for i = 0, 9999 do
        if ( ( ( i + 1 ) * 25 ) >= math.floor ( height ) ) then
            return ( ( ( i + 1 ) * 25 ) > math.floor ( height ) and ( i - 1 ) or i );
        end
    end
    return false;
end

function __checkParams ( methodName, pattern, ... )
    local cTable = {
        ["string"] = "s";
        ["number"] = "n";
        ["boolean"] = "b";

        ["s"] = "string";
        ["n"] = "number";
        ["b"] = "boolean"
    };

    if #pattern > table.maxn ( { ... } ) then
        local index = table.maxn ( { ... } ) == 0 and 1 or table.maxn ( { ... } ) + 1
        --return false, error ( "Bad Argument @ '"..methodName.."' [Expected "..cTable[ pattern:sub ( index, index ) ].." at argument "..index..", got none]" )
    end

    for k, v in pairs ( { ... } ) do
        if cTable[ type ( v ) ] ~= pattern:sub ( k, k ) then
            ---return false, error ( "Bad Argument @ '"..methodName.."' [Expected "..cTable[ pattern:sub ( k, k ) ].." at argument "..k..", got "..( type ( v ) or "none" ).."]" )
        end
    end
    return true;
end

function __checkRGB ( r, g, b )
    -- Check if all parameters were passed
    if ( not r ) or ( not g ) or ( not b ) then
        return false;
    end
    
    for _, v in ipairs ( { r, g, b } ) do
        if ( type ( v ) ~= "number" ) or ( v < 0 ) or ( v > 255 ) then
            return false;
        end
    end
    
    return true;
end

function __isMouseInPosition ( x, y, w, h )
    if not isCursorShowing() then return false end

    local res   =   { guiGetScreenSize() };
    local cpos  =   { getCursorPosition() };
    local fpos  =   { res[1] * cpos[1], res[2] * cpos[2] };
    return ( fpos[1] >= x and fpos[1] <= x + w ) and ( fpos[2] >= y and fpos[2] <= y + h )
end


----------------------------------------------------------------------------------------------------------------------

dxGrid1          =   { items = {} };
local cursorOn;

local NATIVE_RESOLUTION     =   { nil } -- put your screen resolution here to fit the gridlists to all resolutions (ex: { 1366, 768 } )
if ( table.maxn ( NATIVE_RESOLUTION ) == 2 ) then
    FIT_MODE                =   true
    RES                     =   { guiGetScreenSize() };
    X,Y                     =   RES[1] / NATIVE_RESOLUTION[1], RES[2] / NATIVE_RESOLUTION[2];
    SCALE                   =   ( 1 / NATIVE_RESOLUTION[1] ) * RES[1];
end

--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- Core - functions

function dxGrid1:Create ( x, y, width, height, postGUI )
    -- table dxGrid:Create ( int x, int y, int width, int height[, bool postGUI ] )

    if __checkParams ( "Create", "nnnn", x, y, width, height ) then
        local data = {
            x       =       FIT_MODE and ( x * X ) or x;                                -- X position
            y       =       FIT_MODE and ( y * Y ) or y;                                -- Y position
            w       =       FIT_MODE and ( width * X ) or width;                        -- Width
            h       =       FIT_MODE and ( height * Y ) or height;                      -- Height
            pg      =       postGUI or false;                                           -- PostGUI
            i       =       {};                                                         -- Items
            mi      =       __calcMaxItems ( FIT_MODE and ( height * Y ) or height );   -- Max items
            s       =       1;                                                          -- Scroll Level
            r       =       -1;                                                         -- Row count
            se      =       -1;                                                         -- Selected item
            mo      =       nil;                                                        -- Mouse-on item
            vis     =       true                                                        -- Visible
        };

        setmetatable ( data, { __index = dxGrid1 } );
        table.insert ( dxGrid1.items, data );

        return data;
    end
end

function dxGrid1:Destroy ()
    -- bool dxGrid:Destroy ()

    for k, v in pairs ( dxGrid1.items ) do
        if v == self then
            dxGrid1.items[k] = nil;
            return true;
        end
    end
    return false;
end

function dxGrid1:SetItemText (itemID, column, new_text )

    if __checkParams ( "SetItemText", "nns", itemID, column, new_text ) then
        if self.i[column] and self.i[column][itemID] then
            self.i[column][itemID].text = new_text
            return self.i[column][itemID].text == new_text
        end
    end
    return false
end

function dxGrid1:SetVisible ( visible )
    -- bool Gridlist:SetVisible ( bool state )
    
    if __checkParams ( "SetVisible", "b", visible ) then
        self.vis = visible

        return true
    else
        return false
    end
end

function dxGrid1:IsVisible ( )
    -- bool Gridlist:IsVisible()

    return self.vis
end

function dxGrid1:AddColumn ( title, width )
    -- int Gridlist:AddColumn ( string title, int width )

    if __checkParams ( "AddColumn", "sn", title, width ) then
        local data = {
            info    =   { title = title, width = FIT_MODE and ( width * X ) or width }
        };

        table.insert ( self.i, data );

        return #self.i;
    end
end

function dxGrid1:RemoveColumn ( columnIndex )
    -- bool Gridlist:RemoveColumn ( int columnIndex )

    if __checkParams ( "RemoveColumn", "n", columnIndex ) then
        self.i[columnIndex] = nil;

        -- Recalculate the highest item count
        local highest = -1;

        for _, v in ipairs ( self.i ) do
            if #v > highest then
                highest = ( #v - 1 );
            end
        end

        self.r = highest;

        -- Recalculate the scroll level (if necessary)
        if ( ( ( self.s + self.mi ) - 2 ) == self.r ) then
            self.s = ( self.r - self.mi ) + 1;
        end

        return true
    end
    return false
end

function dxGrid1:GetColumnCount ()
    -- int Gridlist:GetColumnCount()

    return #self.i
end

function dxGrid1:AddItem ( columnIndex, text, data, r, g, b )
    -- int Gridlist:AddItem ( int columnIndex, string title[, mixed data, int r, int g, int b ] )

    if __checkParams ( "AddItem", "ns", columnIndex, text ) then
        if self.i[columnIndex] then 
            local tColor = __checkRGB ( r, g, b ) and { r, g, b } or { 255, 255, 255 };
            
            table.insert ( self.i[columnIndex], { id = #self.i[columnIndex] + 1, text = tostring( text ), data = data, color = tColor } );

            if #self.i[columnIndex] > self.r then
                self.r = #self.i[columnIndex];
            end

            return #self.i[columnIndex];
        end
        return false;
    end
end

function dxGrid1:RemoveItem ( column, itemID )
    -- bool Gridlist:RemoveItem ( int columnIndex, int itemIndex )

    if __checkParams ( "RemoveItem", "nn", column, itemID ) then
        if self.i[column] and self.i[column][itemID] then
            -- Recalculate the highest item count
            if self.r == #self.i[column] then
                local highest = -1;

                for _, v in ipairs ( self.i ) do
                    if #v > highest then
                        highest = ( #v - 1 );
                    end
                end

                self.r = highest;
            end

            -- Recalculate the scroll level (if necessary)
            if ( ( ( self.s + self.mi ) - 2 ) == self.r ) then
                self.s = ( self.r - self.mi ) + 1;
            end

            -- Reset the selected item if necessary²
            if itemID == self.se then
                local newItem   =   self.se - 1

                if newItem <= self.r then
                    self.se = math.max ( 0, newItem );
                else
                    self.se = -1
                end
            end

            table.remove ( self.i[column], itemID );

            return true;
        end
        return false
    end
end

function dxGrid1:GetItemCount ( columnID )
    -- int Gridlist:GetItemCount ( int columnIndex )

    if __checkParams ( "GetItemCount", "n", columnID ) then
        if self.i[columnID] then
            return #self.i[columnID]
        end
        return false
    end
end

function dxGrid1:Clear ()
    -- bool Gridlist:Clear()

    for k, v in ipairs ( self.i ) do
        self.i[k] = { info = v.info }
    end

    self.r = -1
    self.se = nil

    -- Recalculate the scroll level
    self.s = 1;

    return true
end

function dxGrid1:GetSelectedItem ( )
    -- int Gridlist:GetSelectedItem ()

    return self.se;
end

function dxGrid1:SetSelectedItem ( itemID )
    -- bool Gridlist:SetSelectedItem ( int itemIndex )

    if __checkParams ( "SetSelectedItem", "n", itemID ) then
        if itemID <= self.r then
            self.se = itemID;
            return self.se == itemID;
        end
        return false;
    end
end

function dxGrid1:GetItemDetails ( column, itemID )
    -- string, mixed Gridlist:GetItemDetails ( int columnIndex, int itemIndex )

    if __checkParams ( "GetItemDetails", "nn", columnID, itemID ) then
        if self.i[column] then
            if self.i[column][itemID] then
                return self.i[column][itemID].text, self.i[column][itemID].data
            end
        end
        return false
    end
end

--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- Core - render/move

addEventHandler ( "onClientRender", root,
    function ( )
        -- Is there any gridlist to render?
        if #dxGrid1.items > 0 then
            -- Loop through all grid lists
            for index, data in ipairs ( dxGrid1.items ) do
                -- Is the gridlist visible?
                if data.vis then
                    -- Draw the 'gridlist' itself                  
                    dxDrawRectangle (data.x, data.y, data.w, data.h, tocolor ( 0, 0, 0, 100), data.pg );

                    -- Draw the column bar
                    dxDrawRectangle ( data.x, data.y, data.w, 30 % data.h, tocolor (255, 0 , 0 , 255), data.pg );

                    -- Set cursorOn variable to the current gridlist, if it's selected
                    cursorOn = nil
                    if __isMouseInPosition ( data.x, data.y, data.w, data.h ) then
                        cursorOn = index;
                    end

                    -- Check if there's any selected item
                    local seeFrom   =   data.s;
                    local seeTo     =   ( data.s + data.mi ) - 1;

                    if data.se and data.se <= data.r and data.se >= seeFrom and data.se <= seeTo then
                        local index     =   data.se - ( data.s - 1 );
                        local y2        =   data.y + ( ( index - 1 ) * 25 );

                        -- Draw a rectangle to make it looks like selected
                        dxDrawRectangle ( data.x, ( 30 % data.h ) + y2, data.w, 25, tocolor ( 0, 0, 0, 110 ), data.pg );

                      --  dxDrawRectangle ( data.x, ( 30 % data.h ) + y2, data.w, 25, tocolor (0, 0, 0,  ), data.pg );
                    end

                    -- Is there any column?
                    if #data.i > 0 then
                    local cWidth = 0

                        -- Loop through all columns
                        for cIndex, cData in ipairs ( data.i ) do
                            -- we'll go beyond the gridlist width with this column ?
                            if ( ( cWidth + cData.info.width ) <= data.w ) then
                                local x = data.x + cWidth;

                                -- Draw the column title
                                dxDrawText ( cData.info.title, x + 10, data.y, cData.info.width + x, ( 30 % data.h ) + data.y, tocolor ( 0, 0, 0 , 220 ), FIT_MODE and ( 1 * SCALE ) or 1, font_10, "left", "center", true, true, data.pg, false, true );

                                -- Reset the selected item
                                cData.info.selected = -1;

                                -- Is there any item ?
                                if #cData > 0 then
                                    local seeFrom   =   data.s;
                                    local seeTo     =   ( data.s + data.mi ) - 1;

                                    -- Loop the items
                                    for iIndex = seeFrom, seeTo do
                                        -- There's a row with this index in the current column?
                                        if cData[iIndex] then
                                            local index     =   iIndex - ( data.s - 1 );
                                            local y         =   data.y + ( index * 25 );
                                            local y2        =   data.y + ( ( index - 1 ) * 25 );

                                            -- Check if cursor is on item position
                                            if __isMouseInPosition ( data.x, ( 30 % data.h ) + y2, data.w, 25 ) then
                                                -- Define the mouse-on variable
                                                data.mo = iIndex;
                                            end

                                            -- Draw the item text
                                            dxDrawText ( cData[iIndex]["text"], x + 10, y, cData.info.width + x, ( 30 % data.h ) + y + 5, tocolor ( 255, 255, 255, 255), FIT_MODE and ( 1 * SCALE ) or 1, font_11, "left", "center", true, true, data.pg, true, true );
                                        end
                                    end
                                end

                                -- Increase cWidth variable (to draw the columns correctly)
                                cWidth = cWidth + cData.info.width;
                            end
                        end
                    end
                end
            end
        end
    end
, true, "low-5")

--

addEventHandler ( "onClientKey", root,
    function ( button, press )
        -- Is cursor showing?
        if isCursorShowing () then
            -- Is there any gridlist?
            if #dxGrid1.items > 0 then
                -- Is there any selected gridlist?
                if cursorOn then
                    -- We pressed the scroll?
                    if press and #button > 6 then
                        -- Does the gridlist requires scroll?
                        if dxGrid1.items[cursorOn].r > dxGrid1.items[cursorOn].mi then
                            -- Define some variables
                            local index         =   cursorOn;
                            local currentValue  =   dxGrid1.items[index].s;
                            local newValue      =   math.max(1, button == "mouse_wheel_down" and currentValue + 2 or button == "arrow_d" and currentValue + 2 or button == "mouse_wheel_up" and currentValue - 1 or button == "arrow_u" and currentValue - 1)

                            -- Check if we have spent the row's limit with the new value
                            if ( ( newValue + dxGrid1.items[index].mi ) > dxGrid1.items[index].r ) then
                                newValue = ( dxGrid1.items[index].r - dxGrid1.items[index].mi ) + 1;
                            end



                            -- Set the new scroll level
                            dxGrid1.items[index].s = newValue;
                        end
                    elseif press and button == "mouse1" and dxGrid1.items[cursorOn].mo then
                        dxGrid1.items[cursorOn].se = dxGrid1.items[cursorOn].mo;
                    end
                end
            end
        end
    end
)

--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- Useful

function __calcMaxItems ( height )
    for i = 0, 9999 do
        if ( ( ( i + 1 ) * 25 ) >= math.floor ( height ) ) then
            return ( ( ( i + 1 ) * 25 ) > math.floor ( height ) and ( i - 1 ) or i );
        end
    end
    return false;
end

function __checkParams ( methodName, pattern, ... )
    local cTable = {
        ["string"] = "s";
        ["number"] = "n";
        ["boolean"] = "b";

        ["s"] = "string";
        ["n"] = "number";
        ["b"] = "boolean"
    };

    if #pattern > table.maxn ( { ... } ) then
        local index = table.maxn ( { ... } ) == 0 and 1 or table.maxn ( { ... } ) + 1
        --return false, error ( "Bad Argument @ '"..methodName.."' [Expected "..cTable[ pattern:sub ( index, index ) ].." at argument "..index..", got none]" )
    end

    for k, v in pairs ( { ... } ) do
        if cTable[ type ( v ) ] ~= pattern:sub ( k, k ) then
            ---return false, error ( "Bad Argument @ '"..methodName.."' [Expected "..cTable[ pattern:sub ( k, k ) ].." at argument "..k..", got "..( type ( v ) or "none" ).."]" )
        end
    end
    return true;
end

function __checkRGB ( r, g, b )
    -- Check if all parameters were passed
    if ( not r ) or ( not g ) or ( not b ) then
        return false;
    end
    
    for _, v in ipairs ( { r, g, b } ) do
        if ( type ( v ) ~= "number" ) or ( v < 0 ) or ( v > 255 ) then
            return false;
        end
    end
    
    return true;
end

function __isMouseInPosition ( x, y, w, h )
    if not isCursorShowing() then return false end

    local res   =   { guiGetScreenSize() };
    local cpos  =   { getCursorPosition() };
    local fpos  =   { res[1] * cpos[1], res[2] * cpos[2] };
    return ( fpos[1] >= x and fpos[1] <= x + w ) and ( fpos[2] >= y and fpos[2] <= y + h )
end

EditBox

local font1 = dxCreateFont("Files/fonte.ttf", 10)
local font_10 = dxCreateFont("Files/fonte.ttf", 10)
local font_11 = dxCreateFont("Files/fonte.ttf", 9)

dxGrid          =   { items = {} };
local cursorOn;

local NATIVE_RESOLUTION     =   { nil } -- put your screen resolution here to fit the gridlists to all resolutions (ex: { 1366, 768 } )
if ( table.maxn ( NATIVE_RESOLUTION ) == 2 ) then
    FIT_MODE                =   true
    RES                     =   { guiGetScreenSize() };
    X,Y                     =   RES[1] / NATIVE_RESOLUTION[1], RES[2] / NATIVE_RESOLUTION[2];
    SCALE                   =   ( 1 / NATIVE_RESOLUTION[1] ) * RES[1];
end

--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- Core - functions

function dxGrid:Create ( x, y, width, height, postGUI )
    -- table dxGrid:Create ( int x, int y, int width, int height[, bool postGUI ] )

    if __checkParams ( "Create", "nnnn", x, y, width, height ) then
        local data = {
            x       =       FIT_MODE and ( x * X ) or x;                                -- X position
            y       =       FIT_MODE and ( y * Y ) or y;                                -- Y position
            w       =       FIT_MODE and ( width * X ) or width;                        -- Width
            h       =       FIT_MODE and ( height * Y ) or height;                      -- Height
            pg      =       postGUI or false;                                           -- PostGUI
            i       =       {};                                                         -- Items
            mi      =       __calcMaxItems ( FIT_MODE and ( height * Y ) or height );   -- Max items
            s       =       1;                                                          -- Scroll Level
            r       =       -1;                                                         -- Row count
            se      =       -1;                                                         -- Selected item
            mo      =       nil;                                                        -- Mouse-on item
            vis     =       true                                                        -- Visible
        };

        setmetatable ( data, { __index = dxGrid } );
        table.insert ( dxGrid.items, data );

        return data;
    end
end

function dxGrid:Destroy ()
    -- bool dxGrid:Destroy ()

    for k, v in pairs ( dxGrid.items ) do
        if v == self then
            dxGrid.items[k] = nil;
            return true;
        end
    end
    return false;
end

function dxGrid:SetItemText (itemID, column, new_text )

    if __checkParams ( "SetItemText", "nns", itemID, column, new_text ) then
        if self.i[column] and self.i[column][itemID] then
            self.i[column][itemID].text = new_text
            return self.i[column][itemID].text == new_text
        end
    end
    return false
end

function dxGrid:SetVisible ( visible )
    -- bool Gridlist:SetVisible ( bool state )
    
    if __checkParams ( "SetVisible", "b", visible ) then
        self.vis = visible

        return true
    else
        return false
    end
end

function dxGrid:IsVisible ( )
    -- bool Gridlist:IsVisible()

    return self.vis
end

function dxGrid:AddColumn ( title, width )
    -- int Gridlist:AddColumn ( string title, int width )

    if __checkParams ( "AddColumn", "sn", title, width ) then
        local data = {
            info    =   { title = title, width = FIT_MODE and ( width * X ) or width }
        };

        table.insert ( self.i, data );

        return #self.i;
    end
end

function dxGrid:RemoveColumn ( columnIndex )
    -- bool Gridlist:RemoveColumn ( int columnIndex )

    if __checkParams ( "RemoveColumn", "n", columnIndex ) then
        self.i[columnIndex] = nil;

        -- Recalculate the highest item count
        local highest = -1;

        for _, v in ipairs ( self.i ) do
            if #v > highest then
                highest = ( #v - 1 );
            end
        end

        self.r = highest;

        -- Recalculate the scroll level (if necessary)
        if ( ( ( self.s + self.mi ) - 2 ) == self.r ) then
            self.s = ( self.r - self.mi ) + 1;
        end

        return true
    end
    return false
end

function dxGrid:GetColumnCount ()
    -- int Gridlist:GetColumnCount()

    return #self.i
end

function dxGrid:AddItem ( columnIndex, text, data, r, g, b )
    -- int Gridlist:AddItem ( int columnIndex, string title[, mixed data, int r, int g, int b ] )

    if __checkParams ( "AddItem", "ns", columnIndex, text ) then
        if self.i[columnIndex] then 
            local tColor = __checkRGB ( r, g, b ) and { r, g, b } or { 255, 255, 255 };
            
            table.insert ( self.i[columnIndex], { id = #self.i[columnIndex] + 1, text = tostring( text ), data = data, color = tColor } );

            if #self.i[columnIndex] > self.r then
                self.r = #self.i[columnIndex];
            end

            return #self.i[columnIndex];
        end
        return false;
    end
end

function dxGrid:RemoveItem ( column, itemID )
    -- bool Gridlist:RemoveItem ( int columnIndex, int itemIndex )

    if __checkParams ( "RemoveItem", "nn", column, itemID ) then
        if self.i[column] and self.i[column][itemID] then
            -- Recalculate the highest item count
            if self.r == #self.i[column] then
                local highest = -1;

                for _, v in ipairs ( self.i ) do
                    if #v > highest then
                        highest = ( #v - 1 );
                    end
                end

                self.r = highest;
            end

            -- Recalculate the scroll level (if necessary)
            if ( ( ( self.s + self.mi ) - 2 ) == self.r ) then
                self.s = ( self.r - self.mi ) + 1;
            end

            -- Reset the selected item if necessary²
            if itemID == self.se then
                local newItem   =   self.se - 1

                if newItem <= self.r then
                    self.se = math.max ( 0, newItem );
                else
                    self.se = -1
                end
            end

            table.remove ( self.i[column], itemID );

            return true;
        end
        return false
    end
end

function dxGrid:GetItemCount ( columnID )
    -- int Gridlist:GetItemCount ( int columnIndex )

    if __checkParams ( "GetItemCount", "n", columnID ) then
        if self.i[columnID] then
            return #self.i[columnID]
        end
        return false
    end
end

function dxGrid:Clear ()
    -- bool Gridlist:Clear()

    for k, v in ipairs ( self.i ) do
        self.i[k] = { info = v.info }
    end

    self.r = -1
    self.se = nil

    -- Recalculate the scroll level
    self.s = 1;

    return true
end

function dxGrid:GetSelectedItem ( )
    -- int Gridlist:GetSelectedItem ()

    return self.se;
end

function dxGrid:SetSelectedItem ( itemID )
    -- bool Gridlist:SetSelectedItem ( int itemIndex )

    if __checkParams ( "SetSelectedItem", "n", itemID ) then
        if itemID <= self.r then
            self.se = itemID;
            return self.se == itemID;
        end
        return false;
    end
end

function dxGrid:GetItemDetails ( column, itemID )
    -- string, mixed Gridlist:GetItemDetails ( int columnIndex, int itemIndex )

    if __checkParams ( "GetItemDetails", "nn", columnID, itemID ) then
        if self.i[column] then
            if self.i[column][itemID] then
                return self.i[column][itemID].text, self.i[column][itemID].data
            end
        end
        return false
    end
end

--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- Core - render/move

addEventHandler ( "onClientRender", root,
    function ( )
        -- Is there any gridlist to render?
        if #dxGrid.items > 0 then
            -- Loop through all grid lists
            for index, data in ipairs ( dxGrid.items ) do
                -- Is the gridlist visible?
                if data.vis then
                    -- Draw the 'gridlist' itself                  
                    dxDrawRectangle (data.x, data.y, data.w, data.h, tocolor ( 0, 0, 0, 100), data.pg );

                    -- Draw the column bar
                    dxDrawRectangle ( data.x, data.y, data.w, 30 % data.h, tocolor (255, 0 , 0 , 255), data.pg );

                    -- Set cursorOn variable to the current gridlist, if it's selected
                    cursorOn = nil
                    if __isMouseInPosition ( data.x, data.y, data.w, data.h ) then
                        cursorOn = index;
                    end

                    -- Check if there's any selected item
                    local seeFrom   =   data.s;
                    local seeTo     =   ( data.s + data.mi ) - 1;

                    if data.se and data.se <= data.r and data.se >= seeFrom and data.se <= seeTo then
                        local index     =   data.se - ( data.s - 1 );
                        local y2        =   data.y + ( ( index - 1 ) * 25 );

                        -- Draw a rectangle to make it looks like selected
                        dxDrawRectangle ( data.x, ( 30 % data.h ) + y2, data.w, 25, tocolor ( 0, 0, 0, 110 ), data.pg );

                      --  dxDrawRectangle ( data.x, ( 30 % data.h ) + y2, data.w, 25, tocolor (0, 0, 0,  ), data.pg );
                    end

                    -- Is there any column?
                    if #data.i > 0 then
                    local cWidth = 0

                        -- Loop through all columns
                        for cIndex, cData in ipairs ( data.i ) do
                            -- we'll go beyond the gridlist width with this column ?
                            if ( ( cWidth + cData.info.width ) <= data.w ) then
                                local x = data.x + cWidth;

                                -- Draw the column title
                                dxDrawText ( cData.info.title, x + 10, data.y, cData.info.width + x, ( 30 % data.h ) + data.y, tocolor ( 255, 255, 255 , 200 ), FIT_MODE and ( 1 * SCALE ) or 1, font_10, "center", "center", true, true, data.pg, false, true );

                                -- Reset the selected item
                                cData.info.selected = -1;

                                -- Is there any item ?
                                if #cData > 0 then
                                    local seeFrom   =   data.s;
                                    local seeTo     =   ( data.s + data.mi ) - 1;

                                    -- Loop the items
                                    for iIndex = seeFrom, seeTo do
                                        -- There's a row with this index in the current column?
                                        if cData[iIndex] then
                                            local index     =   iIndex - ( data.s - 1 );
                                            local y         =   data.y + ( index * 25 );
                                            local y2        =   data.y + ( ( index - 1 ) * 25 );

                                            -- Check if cursor is on item position
                                            if __isMouseInPosition ( data.x, ( 30 % data.h ) + y2, data.w, 25 ) then
                                                -- Define the mouse-on variable
                                                data.mo = iIndex;
                                            end

                                            -- Draw the item text
                                            dxDrawText ( cData[iIndex]["text"], x + 10, y, cData.info.width + x, ( 30 % data.h ) + y + 5, tocolor ( 255, 255, 255, 255), FIT_MODE and ( 1 * SCALE ) or 1, font_11, "left", "center", true, true, data.pg, false, true );
                                        end
                                    end
                                end

                                -- Increase cWidth variable (to draw the columns correctly)
                                cWidth = cWidth + cData.info.width;
                            end
                        end
                    end
                end
            end
        end
    end
, true, "low-5")

--

addEventHandler ( "onClientKey", root,
    function ( button, press )
        -- Is cursor showing?
        if isCursorShowing () then
            -- Is there any gridlist?
            if #dxGrid.items > 0 then
                -- Is there any selected gridlist?
                if cursorOn then
                    -- We pressed the scroll?
                    if press and #button > 6 then
                        -- Does the gridlist requires scroll?
                        if dxGrid.items[cursorOn].r > dxGrid.items[cursorOn].mi then
                            -- Define some variables
                            local index         =   cursorOn;
                            local currentValue  =   dxGrid.items[index].s;
                            local newValue      =   math.max(1, button == "mouse_wheel_down" and currentValue + 2 or button == "arrow_d" and currentValue + 2 or button == "mouse_wheel_up" and currentValue - 1 or button == "arrow_u" and currentValue - 1)

                            -- Check if we have spent the row's limit with the new value
                            if ( ( newValue + dxGrid.items[index].mi ) > dxGrid.items[index].r ) then
                                newValue = ( dxGrid.items[index].r - dxGrid.items[index].mi ) + 1;
                            end



                            -- Set the new scroll level
                            dxGrid.items[index].s = newValue;
                        end
                    elseif press and button == "mouse1" and dxGrid.items[cursorOn].mo then
                        dxGrid.items[cursorOn].se = dxGrid.items[cursorOn].mo;
                    end
                end
            end
        end
    end
)

--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- Useful

function __calcMaxItems ( height )
    for i = 0, 9999 do
        if ( ( ( i + 1 ) * 25 ) >= math.floor ( height ) ) then
            return ( ( ( i + 1 ) * 25 ) > math.floor ( height ) and ( i - 1 ) or i );
        end
    end
    return false;
end

function __checkParams ( methodName, pattern, ... )
    local cTable = {
        ["string"] = "s";
        ["number"] = "n";
        ["boolean"] = "b";

        ["s"] = "string";
        ["n"] = "number";
        ["b"] = "boolean"
    };

    if #pattern > table.maxn ( { ... } ) then
        local index = table.maxn ( { ... } ) == 0 and 1 or table.maxn ( { ... } ) + 1
        --return false, error ( "Bad Argument @ '"..methodName.."' [Expected "..cTable[ pattern:sub ( index, index ) ].." at argument "..index..", got none]" )
    end

    for k, v in pairs ( { ... } ) do
        if cTable[ type ( v ) ] ~= pattern:sub ( k, k ) then
            ---return false, error ( "Bad Argument @ '"..methodName.."' [Expected "..cTable[ pattern:sub ( k, k ) ].." at argument "..k..", got "..( type ( v ) or "none" ).."]" )
        end
    end
    return true;
end

function __checkRGB ( r, g, b )
    -- Check if all parameters were passed
    if ( not r ) or ( not g ) or ( not b ) then
        return false;
    end
    
    for _, v in ipairs ( { r, g, b } ) do
        if ( type ( v ) ~= "number" ) or ( v < 0 ) or ( v > 255 ) then
            return false;
        end
    end
    
    return true;
end

function __isMouseInPosition ( x, y, w, h )
    if not isCursorShowing() then return false end

    local res   =   { guiGetScreenSize() };
    local cpos  =   { getCursorPosition() };
    local fpos  =   { res[1] * cpos[1], res[2] * cpos[2] };
    return ( fpos[1] >= x and fpos[1] <= x + w ) and ( fpos[2] >= y and fpos[2] <= y + h )
end


----------------------------------------------------------------------------------------------------------------------

dxGrid1          =   { items = {} };
local cursorOn;

local NATIVE_RESOLUTION     =   { nil } -- put your screen resolution here to fit the gridlists to all resolutions (ex: { 1366, 768 } )
if ( table.maxn ( NATIVE_RESOLUTION ) == 2 ) then
    FIT_MODE                =   true
    RES                     =   { guiGetScreenSize() };
    X,Y                     =   RES[1] / NATIVE_RESOLUTION[1], RES[2] / NATIVE_RESOLUTION[2];
    SCALE                   =   ( 1 / NATIVE_RESOLUTION[1] ) * RES[1];
end

--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- Core - functions

function dxGrid1:Create ( x, y, width, height, postGUI )
    -- table dxGrid:Create ( int x, int y, int width, int height[, bool postGUI ] )

    if __checkParams ( "Create", "nnnn", x, y, width, height ) then
        local data = {
            x       =       FIT_MODE and ( x * X ) or x;                                -- X position
            y       =       FIT_MODE and ( y * Y ) or y;                                -- Y position
            w       =       FIT_MODE and ( width * X ) or width;                        -- Width
            h       =       FIT_MODE and ( height * Y ) or height;                      -- Height
            pg      =       postGUI or false;                                           -- PostGUI
            i       =       {};                                                         -- Items
            mi      =       __calcMaxItems ( FIT_MODE and ( height * Y ) or height );   -- Max items
            s       =       1;                                                          -- Scroll Level
            r       =       -1;                                                         -- Row count
            se      =       -1;                                                         -- Selected item
            mo      =       nil;                                                        -- Mouse-on item
            vis     =       true                                                        -- Visible
        };

        setmetatable ( data, { __index = dxGrid1 } );
        table.insert ( dxGrid1.items, data );

        return data;
    end
end

function dxGrid1:Destroy ()
    -- bool dxGrid:Destroy ()

    for k, v in pairs ( dxGrid1.items ) do
        if v == self then
            dxGrid1.items[k] = nil;
            return true;
        end
    end
    return false;
end

function dxGrid1:SetItemText (itemID, column, new_text )

    if __checkParams ( "SetItemText", "nns", itemID, column, new_text ) then
        if self.i[column] and self.i[column][itemID] then
            self.i[column][itemID].text = new_text
            return self.i[column][itemID].text == new_text
        end
    end
    return false
end

function dxGrid1:SetVisible ( visible )
    -- bool Gridlist:SetVisible ( bool state )
    
    if __checkParams ( "SetVisible", "b", visible ) then
        self.vis = visible

        return true
    else
        return false
    end
end

function dxGrid1:IsVisible ( )
    -- bool Gridlist:IsVisible()

    return self.vis
end

function dxGrid1:AddColumn ( title, width )
    -- int Gridlist:AddColumn ( string title, int width )

    if __checkParams ( "AddColumn", "sn", title, width ) then
        local data = {
            info    =   { title = title, width = FIT_MODE and ( width * X ) or width }
        };

        table.insert ( self.i, data );

        return #self.i;
    end
end

function dxGrid1:RemoveColumn ( columnIndex )
    -- bool Gridlist:RemoveColumn ( int columnIndex )

    if __checkParams ( "RemoveColumn", "n", columnIndex ) then
        self.i[columnIndex] = nil;

        -- Recalculate the highest item count
        local highest = -1;

        for _, v in ipairs ( self.i ) do
            if #v > highest then
                highest = ( #v - 1 );
            end
        end

        self.r = highest;

        -- Recalculate the scroll level (if necessary)
        if ( ( ( self.s + self.mi ) - 2 ) == self.r ) then
            self.s = ( self.r - self.mi ) + 1;
        end

        return true
    end
    return false
end

function dxGrid1:GetColumnCount ()
    -- int Gridlist:GetColumnCount()

    return #self.i
end

function dxGrid1:AddItem ( columnIndex, text, data, r, g, b )
    -- int Gridlist:AddItem ( int columnIndex, string title[, mixed data, int r, int g, int b ] )

    if __checkParams ( "AddItem", "ns", columnIndex, text ) then
        if self.i[columnIndex] then 
            local tColor = __checkRGB ( r, g, b ) and { r, g, b } or { 255, 255, 255 };
            
            table.insert ( self.i[columnIndex], { id = #self.i[columnIndex] + 1, text = tostring( text ), data = data, color = tColor } );

            if #self.i[columnIndex] > self.r then
                self.r = #self.i[columnIndex];
            end

            return #self.i[columnIndex];
        end
        return false;
    end
end

function dxGrid1:RemoveItem ( column, itemID )
    -- bool Gridlist:RemoveItem ( int columnIndex, int itemIndex )

    if __checkParams ( "RemoveItem", "nn", column, itemID ) then
        if self.i[column] and self.i[column][itemID] then
            -- Recalculate the highest item count
            if self.r == #self.i[column] then
                local highest = -1;

                for _, v in ipairs ( self.i ) do
                    if #v > highest then
                        highest = ( #v - 1 );
                    end
                end

                self.r = highest;
            end

            -- Recalculate the scroll level (if necessary)
            if ( ( ( self.s + self.mi ) - 2 ) == self.r ) then
                self.s = ( self.r - self.mi ) + 1;
            end

            -- Reset the selected item if necessary²
            if itemID == self.se then
                local newItem   =   self.se - 1

                if newItem <= self.r then
                    self.se = math.max ( 0, newItem );
                else
                    self.se = -1
                end
            end

            table.remove ( self.i[column], itemID );

            return true;
        end
        return false
    end
end

function dxGrid1:GetItemCount ( columnID )
    -- int Gridlist:GetItemCount ( int columnIndex )

    if __checkParams ( "GetItemCount", "n", columnID ) then
        if self.i[columnID] then
            return #self.i[columnID]
        end
        return false
    end
end

function dxGrid1:Clear ()
    -- bool Gridlist:Clear()

    for k, v in ipairs ( self.i ) do
        self.i[k] = { info = v.info }
    end

    self.r = -1
    self.se = nil

    -- Recalculate the scroll level
    self.s = 1;

    return true
end

function dxGrid1:GetSelectedItem ( )
    -- int Gridlist:GetSelectedItem ()

    return self.se;
end

function dxGrid1:SetSelectedItem ( itemID )
    -- bool Gridlist:SetSelectedItem ( int itemIndex )

    if __checkParams ( "SetSelectedItem", "n", itemID ) then
        if itemID <= self.r then
            self.se = itemID;
            return self.se == itemID;
        end
        return false;
    end
end

function dxGrid1:GetItemDetails ( column, itemID )
    -- string, mixed Gridlist:GetItemDetails ( int columnIndex, int itemIndex )

    if __checkParams ( "GetItemDetails", "nn", columnID, itemID ) then
        if self.i[column] then
            if self.i[column][itemID] then
                return self.i[column][itemID].text, self.i[column][itemID].data
            end
        end
        return false
    end
end

--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- Core - render/move

addEventHandler ( "onClientRender", root,
    function ( )
        -- Is there any gridlist to render?
        if #dxGrid1.items > 0 then
            -- Loop through all grid lists
            for index, data in ipairs ( dxGrid1.items ) do
                -- Is the gridlist visible?
                if data.vis then
                    -- Draw the 'gridlist' itself                  
                    dxDrawRectangle (data.x, data.y, data.w, data.h, tocolor ( 0, 0, 0, 100), data.pg );

                    -- Draw the column bar
                    dxDrawRectangle ( data.x, data.y, data.w, 30 % data.h, tocolor (255, 0 , 0 , 255), data.pg );

                    -- Set cursorOn variable to the current gridlist, if it's selected
                    cursorOn = nil
                    if __isMouseInPosition ( data.x, data.y, data.w, data.h ) then
                        cursorOn = index;
                    end

                    -- Check if there's any selected item
                    local seeFrom   =   data.s;
                    local seeTo     =   ( data.s + data.mi ) - 1;

                    if data.se and data.se <= data.r and data.se >= seeFrom and data.se <= seeTo then
                        local index     =   data.se - ( data.s - 1 );
                        local y2        =   data.y + ( ( index - 1 ) * 25 );

                        -- Draw a rectangle to make it looks like selected
                        dxDrawRectangle ( data.x, ( 30 % data.h ) + y2, data.w, 25, tocolor ( 0, 0, 0, 110 ), data.pg );

                      --  dxDrawRectangle ( data.x, ( 30 % data.h ) + y2, data.w, 25, tocolor (0, 0, 0,  ), data.pg );
                    end

                    -- Is there any column?
                    if #data.i > 0 then
                    local cWidth = 0

                        -- Loop through all columns
                        for cIndex, cData in ipairs ( data.i ) do
                            -- we'll go beyond the gridlist width with this column ?
                            if ( ( cWidth + cData.info.width ) <= data.w ) then
                                local x = data.x + cWidth;

                                -- Draw the column title
                                dxDrawText ( cData.info.title, x + 10, data.y, cData.info.width + x, ( 30 % data.h ) + data.y, tocolor ( 0, 0, 0 , 220 ), FIT_MODE and ( 1 * SCALE ) or 1, font_10, "left", "center", true, true, data.pg, false, true );

                                -- Reset the selected item
                                cData.info.selected = -1;

                                -- Is there any item ?
                                if #cData > 0 then
                                    local seeFrom   =   data.s;
                                    local seeTo     =   ( data.s + data.mi ) - 1;

                                    -- Loop the items
                                    for iIndex = seeFrom, seeTo do
                                        -- There's a row with this index in the current column?
                                        if cData[iIndex] then
                                            local index     =   iIndex - ( data.s - 1 );
                                            local y         =   data.y + ( index * 25 );
                                            local y2        =   data.y + ( ( index - 1 ) * 25 );

                                            -- Check if cursor is on item position
                                            if __isMouseInPosition ( data.x, ( 30 % data.h ) + y2, data.w, 25 ) then
                                                -- Define the mouse-on variable
                                                data.mo = iIndex;
                                            end

                                            -- Draw the item text
                                            dxDrawText ( cData[iIndex]["text"], x + 10, y, cData.info.width + x, ( 30 % data.h ) + y + 5, tocolor ( 255, 255, 255, 255), FIT_MODE and ( 1 * SCALE ) or 1, font_11, "left", "center", true, true, data.pg, true, true );
                                        end
                                    end
                                end

                                -- Increase cWidth variable (to draw the columns correctly)
                                cWidth = cWidth + cData.info.width;
                            end
                        end
                    end
                end
            end
        end
    end
, true, "low-5")

--

addEventHandler ( "onClientKey", root,
    function ( button, press )
        -- Is cursor showing?
        if isCursorShowing () then
            -- Is there any gridlist?
            if #dxGrid1.items > 0 then
                -- Is there any selected gridlist?
                if cursorOn then
                    -- We pressed the scroll?
                    if press and #button > 6 then
                        -- Does the gridlist requires scroll?
                        if dxGrid1.items[cursorOn].r > dxGrid1.items[cursorOn].mi then
                            -- Define some variables
                            local index         =   cursorOn;
                            local currentValue  =   dxGrid1.items[index].s;
                            local newValue      =   math.max(1, button == "mouse_wheel_down" and currentValue + 2 or button == "arrow_d" and currentValue + 2 or button == "mouse_wheel_up" and currentValue - 1 or button == "arrow_u" and currentValue - 1)

                            -- Check if we have spent the row's limit with the new value
                            if ( ( newValue + dxGrid1.items[index].mi ) > dxGrid1.items[index].r ) then
                                newValue = ( dxGrid1.items[index].r - dxGrid1.items[index].mi ) + 1;
                            end



                            -- Set the new scroll level
                            dxGrid1.items[index].s = newValue;
                        end
                    elseif press and button == "mouse1" and dxGrid1.items[cursorOn].mo then
                        dxGrid1.items[cursorOn].se = dxGrid1.items[cursorOn].mo;
                    end
                end
            end
        end
    end
)

--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- Useful

function __calcMaxItems ( height )
    for i = 0, 9999 do
        if ( ( ( i + 1 ) * 25 ) >= math.floor ( height ) ) then
            return ( ( ( i + 1 ) * 25 ) > math.floor ( height ) and ( i - 1 ) or i );
        end
    end
    return false;
end

function __checkParams ( methodName, pattern, ... )
    local cTable = {
        ["string"] = "s";
        ["number"] = "n";
        ["boolean"] = "b";

        ["s"] = "string";
        ["n"] = "number";
        ["b"] = "boolean"
    };

    if #pattern > table.maxn ( { ... } ) then
        local index = table.maxn ( { ... } ) == 0 and 1 or table.maxn ( { ... } ) + 1
        --return false, error ( "Bad Argument @ '"..methodName.."' [Expected "..cTable[ pattern:sub ( index, index ) ].." at argument "..index..", got none]" )
    end

    for k, v in pairs ( { ... } ) do
        if cTable[ type ( v ) ] ~= pattern:sub ( k, k ) then
            ---return false, error ( "Bad Argument @ '"..methodName.."' [Expected "..cTable[ pattern:sub ( k, k ) ].." at argument "..k..", got "..( type ( v ) or "none" ).."]" )
        end
    end
    return true;
end

function __checkRGB ( r, g, b )
    -- Check if all parameters were passed
    if ( not r ) or ( not g ) or ( not b ) then
        return false;
    end
    
    for _, v in ipairs ( { r, g, b } ) do
        if ( type ( v ) ~= "number" ) or ( v < 0 ) or ( v > 255 ) then
            return false;
        end
    end
    
    return true;
end

function __isMouseInPosition ( x, y, w, h )
    if not isCursorShowing() then return false end

    local res   =   { guiGetScreenSize() };
    local cpos  =   { getCursorPosition() };
    local fpos  =   { res[1] * cpos[1], res[2] * cpos[2] };
    return ( fpos[1] >= x and fpos[1] <= x + w ) and ( fpos[2] >= y and fpos[2] <= y + h )
end

 

37 minutes ago, Lord Henry said:

Utilize o botão <> do fórum para postar códigos. Não cole direto no texto.

OfSmewi.png

Me desculpe eu utilizei outra função que apareceu pra mim, não estou a achar a opção de editar

Link to comment
local font1 = dxCreateFont("Files/fonte.ttf", 10)
local font_10 = dxCreateFont("Files/fonte.ttf", 10)
local font_11 = dxCreateFont("Files/fonte.ttf", 9)

dxGrid          =   { items = {} };
local cursorOn;

local NATIVE_RESOLUTION     =   { 1366, 768 } -- put your screen resolution here to fit the gridlists to all resolutions (ex: { 1366, 768 } )
if ( table.maxn ( NATIVE_RESOLUTION ) == 2 ) then
    FIT_MODE                =   true
    RES                     =   { guiGetScreenSize() };
    X,Y                     =   RES[1] / NATIVE_RESOLUTION[1], RES[2] / NATIVE_RESOLUTION[2];
    SCALE                   =   ( 1 / NATIVE_RESOLUTION[1] ) * RES[1];
end

--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- Core - functions

function dxGrid:Create ( x, y, width, height, postGUI )
    -- table dxGrid:Create ( int x, int y, int width, int height[, bool postGUI ] )

    if __checkParams ( "Create", "nnnn", x, y, width, height ) then
        local data = {
            x       =       FIT_MODE and ( x * X ) or x;                                -- X position
            y       =       FIT_MODE and ( y * Y ) or y;                                -- Y position
            w       =       FIT_MODE and ( width * X ) or width;                        -- Width
            h       =       FIT_MODE and ( height * Y ) or height;                      -- Height
            pg      =       postGUI or false;                                           -- PostGUI
            i       =       {};                                                         -- Items
            mi      =       __calcMaxItems ( FIT_MODE and ( height * Y ) or height );   -- Max items
            s       =       1;                                                          -- Scroll Level
            r       =       -1;                                                         -- Row count
            se      =       -1;                                                         -- Selected item
            mo      =       nil;                                                        -- Mouse-on item
            vis     =       true                                                        -- Visible
        };

        setmetatable ( data, { __index = dxGrid } );
        table.insert ( dxGrid.items, data );

        return data;
    end
end

function dxGrid:Destroy ()
    -- bool dxGrid:Destroy ()

    for k, v in pairs ( dxGrid.items ) do
        if v == self then
            dxGrid.items[k] = nil;
            return true;
        end
    end
    return false;
end

function dxGrid:SetItemText (itemID, column, new_text )

    if __checkParams ( "SetItemText", "nns", itemID, column, new_text ) then
        if self.i[column] and self.i[column][itemID] then
            self.i[column][itemID].text = new_text
            return self.i[column][itemID].text == new_text
        end
    end
    return false
end

function dxGrid:SetVisible ( visible )
    -- bool Gridlist:SetVisible ( bool state )
    
    if __checkParams ( "SetVisible", "b", visible ) then
        self.vis = visible

        return true
    else
        return false
    end
end

function dxGrid:IsVisible ( )
    -- bool Gridlist:IsVisible()

    return self.vis
end

function dxGrid:AddColumn ( title, width )
    -- int Gridlist:AddColumn ( string title, int width )

    if __checkParams ( "AddColumn", "sn", title, width ) then
        local data = {
            info    =   { title = title, width = FIT_MODE and ( width * X ) or width }
        };

        table.insert ( self.i, data );

        return #self.i;
    end
end

function dxGrid:RemoveColumn ( columnIndex )
    -- bool Gridlist:RemoveColumn ( int columnIndex )

    if __checkParams ( "RemoveColumn", "n", columnIndex ) then
        self.i[columnIndex] = nil;

        -- Recalculate the highest item count
        local highest = -1;

        for _, v in ipairs ( self.i ) do
            if #v > highest then
                highest = ( #v - 1 );
            end
        end

        self.r = highest;

        -- Recalculate the scroll level (if necessary)
        if ( ( ( self.s + self.mi ) - 2 ) == self.r ) then
            self.s = ( self.r - self.mi ) + 1;
        end

        return true
    end
    return false
end

function dxGrid:GetColumnCount ()
    -- int Gridlist:GetColumnCount()

    return #self.i
end

function dxGrid:AddItem ( columnIndex, text, data, r, g, b )
    -- int Gridlist:AddItem ( int columnIndex, string title[, mixed data, int r, int g, int b ] )

    if __checkParams ( "AddItem", "ns", columnIndex, text ) then
        if self.i[columnIndex] then 
            local tColor = __checkRGB ( r, g, b ) and { r, g, b } or { 255, 255, 255 };
            
            table.insert ( self.i[columnIndex], { id = #self.i[columnIndex] + 1, text = tostring( text ), data = data, color = tColor } );

            if #self.i[columnIndex] > self.r then
                self.r = #self.i[columnIndex];
            end

            return #self.i[columnIndex];
        end
        return false;
    end
end

function dxGrid:RemoveItem ( column, itemID )
    -- bool Gridlist:RemoveItem ( int columnIndex, int itemIndex )

    if __checkParams ( "RemoveItem", "nn", column, itemID ) then
        if self.i[column] and self.i[column][itemID] then
            -- Recalculate the highest item count
            if self.r == #self.i[column] then
                local highest = -1;

                for _, v in ipairs ( self.i ) do
                    if #v > highest then
                        highest = ( #v - 1 );
                    end
                end

                self.r = highest;
            end

            -- Recalculate the scroll level (if necessary)
            if ( ( ( self.s + self.mi ) - 2 ) == self.r ) then
                self.s = ( self.r - self.mi ) + 1;
            end

            -- Reset the selected item if necessary²
            if itemID == self.se then
                local newItem   =   self.se - 1

                if newItem <= self.r then
                    self.se = math.max ( 0, newItem );
                else
                    self.se = -1
                end
            end

            table.remove ( self.i[column], itemID );

            return true;
        end
        return false
    end
end

function dxGrid:GetItemCount ( columnID )
    -- int Gridlist:GetItemCount ( int columnIndex )

    if __checkParams ( "GetItemCount", "n", columnID ) then
        if self.i[columnID] then
            return #self.i[columnID]
        end
        return false
    end
end

function dxGrid:Clear ()
    -- bool Gridlist:Clear()

    for k, v in ipairs ( self.i ) do
        self.i[k] = { info = v.info }
    end

    self.r = -1
    self.se = nil

    -- Recalculate the scroll level
    self.s = 1;

    return true
end

function dxGrid:GetSelectedItem ( )
    -- int Gridlist:GetSelectedItem ()

    return self.se;
end

function dxGrid:SetSelectedItem ( itemID )
    -- bool Gridlist:SetSelectedItem ( int itemIndex )

    if __checkParams ( "SetSelectedItem", "n", itemID ) then
        if itemID <= self.r then
            self.se = itemID;
            return self.se == itemID;
        end
        return false;
    end
end

function dxGrid:GetItemDetails ( column, itemID )
    -- string, mixed Gridlist:GetItemDetails ( int columnIndex, int itemIndex )

    if __checkParams ( "GetItemDetails", "nn", columnID, itemID ) then
        if self.i[column] then
            if self.i[column][itemID] then
                return self.i[column][itemID].text, self.i[column][itemID].data
            end
        end
        return false
    end
end

--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- Core - render/move

addEventHandler ( "onClientRender", root,
    function ( )
        -- Is there any gridlist to render?
        if #dxGrid.items > 0 then
            -- Loop through all grid lists
            for index, data in ipairs ( dxGrid.items ) do
                -- Is the gridlist visible?
                if data.vis then
                    -- Draw the 'gridlist' itself                  
                    dxDrawRectangle (data.x, data.y, data.w, data.h, tocolor ( 0, 0, 0, 100), data.pg );

                    -- Draw the column bar
                    dxDrawRectangle ( data.x, data.y, data.w, 30 % data.h, tocolor (255, 0 , 0 , 255), data.pg );

                    -- Set cursorOn variable to the current gridlist, if it's selected
                    cursorOn = nil
                    if __isMouseInPosition ( data.x, data.y, data.w, data.h ) then
                        cursorOn = index;
                    end

                    -- Check if there's any selected item
                    local seeFrom   =   data.s;
                    local seeTo     =   ( data.s + data.mi ) - 1;

                    if data.se and data.se <= data.r and data.se >= seeFrom and data.se <= seeTo then
                        local index     =   data.se - ( data.s - 1 );
                        local y2        =   data.y + ( ( index - 1 ) * 25 );

                        -- Draw a rectangle to make it looks like selected
                        dxDrawRectangle ( data.x, ( 30 % data.h ) + y2, data.w, 25, tocolor ( 0, 0, 0, 110 ), data.pg );

                      --  dxDrawRectangle ( data.x, ( 30 % data.h ) + y2, data.w, 25, tocolor (0, 0, 0,  ), data.pg );
                    end

                    -- Is there any column?
                    if #data.i > 0 then
                    local cWidth = 0

                        -- Loop through all columns
                        for cIndex, cData in ipairs ( data.i ) do
                            -- we'll go beyond the gridlist width with this column ?
                            if ( ( cWidth + cData.info.width ) <= data.w ) then
                                local x = data.x + cWidth;

                                -- Draw the column title
                                dxDrawText ( cData.info.title, x + 10, data.y, cData.info.width + x, ( 30 % data.h ) + data.y, tocolor ( 255, 255, 255 , 200 ), FIT_MODE and ( 1 * SCALE ) or 1, font_10, "center", "center", true, true, data.pg, false, true );

                                -- Reset the selected item
                                cData.info.selected = -1;

                                -- Is there any item ?
                                if #cData > 0 then
                                    local seeFrom   =   data.s;
                                    local seeTo     =   ( data.s + data.mi ) - 1;

                                    -- Loop the items
                                    for iIndex = seeFrom, seeTo do
                                        -- There's a row with this index in the current column?
                                        if cData[iIndex] then
                                            local index     =   iIndex - ( data.s - 1 );
                                            local y         =   data.y + ( index * 25 );
                                            local y2        =   data.y + ( ( index - 1 ) * 25 );

                                            -- Check if cursor is on item position
                                            if __isMouseInPosition ( data.x, ( 30 % data.h ) + y2, data.w, 25 ) then
                                                -- Define the mouse-on variable
                                                data.mo = iIndex;
                                            end

                                            -- Draw the item text
                                            dxDrawText ( cData[iIndex]["text"], x + 10, y, cData.info.width + x, ( 30 % data.h ) + y + 5, tocolor ( 255, 255, 255, 255), FIT_MODE and ( 1 * SCALE ) or 1, font_11, "left", "center", true, true, data.pg, false, true );
                                        end
                                    end
                                end

                                -- Increase cWidth variable (to draw the columns correctly)
                                cWidth = cWidth + cData.info.width;
                            end
                        end
                    end
                end
            end
        end
    end
, true, "low-5")

--

addEventHandler ( "onClientKey", root,
    function ( button, press )
        -- Is cursor showing?
        if isCursorShowing () then
            -- Is there any gridlist?
            if #dxGrid.items > 0 then
                -- Is there any selected gridlist?
                if cursorOn then
                    -- We pressed the scroll?
                    if press and #button > 6 then
                        -- Does the gridlist requires scroll?
                        if dxGrid.items[cursorOn].r > dxGrid.items[cursorOn].mi then
                            -- Define some variables
                            local index         =   cursorOn;
                            local currentValue  =   dxGrid.items[index].s;
                            local newValue      =   math.max(1, button == "mouse_wheel_down" and currentValue + 2 or button == "arrow_d" and currentValue + 2 or button == "mouse_wheel_up" and currentValue - 1 or button == "arrow_u" and currentValue - 1)

                            -- Check if we have spent the row's limit with the new value
                            if ( ( newValue + dxGrid.items[index].mi ) > dxGrid.items[index].r ) then
                                newValue = ( dxGrid.items[index].r - dxGrid.items[index].mi ) + 1;
                            end



                            -- Set the new scroll level
                            dxGrid.items[index].s = newValue;
                        end
                    elseif press and button == "mouse1" and dxGrid.items[cursorOn].mo then
                        dxGrid.items[cursorOn].se = dxGrid.items[cursorOn].mo;
                    end
                end
            end
        end
    end
)

--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- Useful

function __calcMaxItems ( height )
    for i = 0, 9999 do
        if ( ( ( i + 1 ) * 25 ) >= math.floor ( height ) ) then
            return ( ( ( i + 1 ) * 25 ) > math.floor ( height ) and ( i - 1 ) or i );
        end
    end
    return false;
end

function __checkParams ( methodName, pattern, ... )
    local cTable = {
        ["string"] = "s";
        ["number"] = "n";
        ["boolean"] = "b";

        ["s"] = "string";
        ["n"] = "number";
        ["b"] = "boolean"
    };

    if #pattern > table.maxn ( { ... } ) then
        local index = table.maxn ( { ... } ) == 0 and 1 or table.maxn ( { ... } ) + 1
        --return false, error ( "Bad Argument @ '"..methodName.."' [Expected "..cTable[ pattern:sub ( index, index ) ].." at argument "..index..", got none]" )
    end

    for k, v in pairs ( { ... } ) do
        if cTable[ type ( v ) ] ~= pattern:sub ( k, k ) then
            ---return false, error ( "Bad Argument @ '"..methodName.."' [Expected "..cTable[ pattern:sub ( k, k ) ].." at argument "..k..", got "..( type ( v ) or "none" ).."]" )
        end
    end
    return true;
end

function __checkRGB ( r, g, b )
    -- Check if all parameters were passed
    if ( not r ) or ( not g ) or ( not b ) then
        return false;
    end
    
    for _, v in ipairs ( { r, g, b } ) do
        if ( type ( v ) ~= "number" ) or ( v < 0 ) or ( v > 255 ) then
            return false;
        end
    end
    
    return true;
end

function __isMouseInPosition ( x, y, w, h )
    if not isCursorShowing() then return false end

    local res   =   { guiGetScreenSize() };
    local cpos  =   { getCursorPosition() };
    local fpos  =   { res[1] * cpos[1], res[2] * cpos[2] };
    return ( fpos[1] >= x and fpos[1] <= x + w ) and ( fpos[2] >= y and fpos[2] <= y + h )
end


----------------------------------------------------------------------------------------------------------------------

dxGrid1          =   { items = {} };
local cursorOn;

local NATIVE_RESOLUTION     =   { nil } -- put your screen resolution here to fit the gridlists to all resolutions (ex: { 1366, 768 } )
if ( table.maxn ( NATIVE_RESOLUTION ) == 2 ) then
    FIT_MODE                =   true
    RES                     =   { guiGetScreenSize() };
    X,Y                     =   RES[1] / NATIVE_RESOLUTION[1], RES[2] / NATIVE_RESOLUTION[2];
    SCALE                   =   ( 1 / NATIVE_RESOLUTION[1] ) * RES[1];
end

--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- Core - functions

function dxGrid1:Create ( x, y, width, height, postGUI )
    -- table dxGrid:Create ( int x, int y, int width, int height[, bool postGUI ] )

    if __checkParams ( "Create", "nnnn", x, y, width, height ) then
        local data = {
            x       =       FIT_MODE and ( x * X ) or x;                                -- X position
            y       =       FIT_MODE and ( y * Y ) or y;                                -- Y position
            w       =       FIT_MODE and ( width * X ) or width;                        -- Width
            h       =       FIT_MODE and ( height * Y ) or height;                      -- Height
            pg      =       postGUI or false;                                           -- PostGUI
            i       =       {};                                                         -- Items
            mi      =       __calcMaxItems ( FIT_MODE and ( height * Y ) or height );   -- Max items
            s       =       1;                                                          -- Scroll Level
            r       =       -1;                                                         -- Row count
            se      =       -1;                                                         -- Selected item
            mo      =       nil;                                                        -- Mouse-on item
            vis     =       true                                                        -- Visible
        };

        setmetatable ( data, { __index = dxGrid1 } );
        table.insert ( dxGrid1.items, data );

        return data;
    end
end

function dxGrid1:Destroy ()
    -- bool dxGrid:Destroy ()

    for k, v in pairs ( dxGrid1.items ) do
        if v == self then
            dxGrid1.items[k] = nil;
            return true;
        end
    end
    return false;
end

function dxGrid1:SetItemText (itemID, column, new_text )

    if __checkParams ( "SetItemText", "nns", itemID, column, new_text ) then
        if self.i[column] and self.i[column][itemID] then
            self.i[column][itemID].text = new_text
            return self.i[column][itemID].text == new_text
        end
    end
    return false
end

function dxGrid1:SetVisible ( visible )
    -- bool Gridlist:SetVisible ( bool state )
    
    if __checkParams ( "SetVisible", "b", visible ) then
        self.vis = visible

        return true
    else
        return false
    end
end

function dxGrid1:IsVisible ( )
    -- bool Gridlist:IsVisible()

    return self.vis
end

function dxGrid1:AddColumn ( title, width )
    -- int Gridlist:AddColumn ( string title, int width )

    if __checkParams ( "AddColumn", "sn", title, width ) then
        local data = {
            info    =   { title = title, width = FIT_MODE and ( width * X ) or width }
        };

        table.insert ( self.i, data );

        return #self.i;
    end
end

function dxGrid1:RemoveColumn ( columnIndex )
    -- bool Gridlist:RemoveColumn ( int columnIndex )

    if __checkParams ( "RemoveColumn", "n", columnIndex ) then
        self.i[columnIndex] = nil;

        -- Recalculate the highest item count
        local highest = -1;

        for _, v in ipairs ( self.i ) do
            if #v > highest then
                highest = ( #v - 1 );
            end
        end

        self.r = highest;

        -- Recalculate the scroll level (if necessary)
        if ( ( ( self.s + self.mi ) - 2 ) == self.r ) then
            self.s = ( self.r - self.mi ) + 1;
        end

        return true
    end
    return false
end

function dxGrid1:GetColumnCount ()
    -- int Gridlist:GetColumnCount()

    return #self.i
end

function dxGrid1:AddItem ( columnIndex, text, data, r, g, b )
    -- int Gridlist:AddItem ( int columnIndex, string title[, mixed data, int r, int g, int b ] )

    if __checkParams ( "AddItem", "ns", columnIndex, text ) then
        if self.i[columnIndex] then 
            local tColor = __checkRGB ( r, g, b ) and { r, g, b } or { 255, 255, 255 };
            
            table.insert ( self.i[columnIndex], { id = #self.i[columnIndex] + 1, text = tostring( text ), data = data, color = tColor } );

            if #self.i[columnIndex] > self.r then
                self.r = #self.i[columnIndex];
            end

            return #self.i[columnIndex];
        end
        return false;
    end
end

function dxGrid1:RemoveItem ( column, itemID )
    -- bool Gridlist:RemoveItem ( int columnIndex, int itemIndex )

    if __checkParams ( "RemoveItem", "nn", column, itemID ) then
        if self.i[column] and self.i[column][itemID] then
            -- Recalculate the highest item count
            if self.r == #self.i[column] then
                local highest = -1;

                for _, v in ipairs ( self.i ) do
                    if #v > highest then
                        highest = ( #v - 1 );
                    end
                end

                self.r = highest;
            end

            -- Recalculate the scroll level (if necessary)
            if ( ( ( self.s + self.mi ) - 2 ) == self.r ) then
                self.s = ( self.r - self.mi ) + 1;
            end

            -- Reset the selected item if necessary²
            if itemID == self.se then
                local newItem   =   self.se - 1

                if newItem <= self.r then
                    self.se = math.max ( 0, newItem );
                else
                    self.se = -1
                end
            end

            table.remove ( self.i[column], itemID );

            return true;
        end
        return false
    end
end

function dxGrid1:GetItemCount ( columnID )
    -- int Gridlist:GetItemCount ( int columnIndex )

    if __checkParams ( "GetItemCount", "n", columnID ) then
        if self.i[columnID] then
            return #self.i[columnID]
        end
        return false
    end
end

function dxGrid1:Clear ()
    -- bool Gridlist:Clear()

    for k, v in ipairs ( self.i ) do
        self.i[k] = { info = v.info }
    end

    self.r = -1
    self.se = nil

    -- Recalculate the scroll level
    self.s = 1;

    return true
end

function dxGrid1:GetSelectedItem ( )
    -- int Gridlist:GetSelectedItem ()

    return self.se;
end

function dxGrid1:SetSelectedItem ( itemID )
    -- bool Gridlist:SetSelectedItem ( int itemIndex )

    if __checkParams ( "SetSelectedItem", "n", itemID ) then
        if itemID <= self.r then
            self.se = itemID;
            return self.se == itemID;
        end
        return false;
    end
end

function dxGrid1:GetItemDetails ( column, itemID )
    -- string, mixed Gridlist:GetItemDetails ( int columnIndex, int itemIndex )

    if __checkParams ( "GetItemDetails", "nn", columnID, itemID ) then
        if self.i[column] then
            if self.i[column][itemID] then
                return self.i[column][itemID].text, self.i[column][itemID].data
            end
        end
        return false
    end
end

--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- Core - render/move

addEventHandler ( "onClientRender", root,
    function ( )
        -- Is there any gridlist to render?
        if #dxGrid1.items > 0 then
            -- Loop through all grid lists
            for index, data in ipairs ( dxGrid1.items ) do
                -- Is the gridlist visible?
                if data.vis then
                    -- Draw the 'gridlist' itself                  
                    dxDrawRectangle (data.x, data.y, data.w, data.h, tocolor ( 0, 0, 0, 100), data.pg );

                    -- Draw the column bar
                    dxDrawRectangle ( data.x, data.y, data.w, 30 % data.h, tocolor (255, 0 , 0 , 255), data.pg );

                    -- Set cursorOn variable to the current gridlist, if it's selected
                    cursorOn = nil
                    if __isMouseInPosition ( data.x, data.y, data.w, data.h ) then
                        cursorOn = index;
                    end

                    -- Check if there's any selected item
                    local seeFrom   =   data.s;
                    local seeTo     =   ( data.s + data.mi ) - 1;

                    if data.se and data.se <= data.r and data.se >= seeFrom and data.se <= seeTo then
                        local index     =   data.se - ( data.s - 1 );
                        local y2        =   data.y + ( ( index - 1 ) * 25 );

                        -- Draw a rectangle to make it looks like selected
                        dxDrawRectangle ( data.x, ( 30 % data.h ) + y2, data.w, 25, tocolor ( 0, 0, 0, 110 ), data.pg );

                      --  dxDrawRectangle ( data.x, ( 30 % data.h ) + y2, data.w, 25, tocolor (0, 0, 0,  ), data.pg );
                    end

                    -- Is there any column?
                    if #data.i > 0 then
                    local cWidth = 0

                        -- Loop through all columns
                        for cIndex, cData in ipairs ( data.i ) do
                            -- we'll go beyond the gridlist width with this column ?
                            if ( ( cWidth + cData.info.width ) <= data.w ) then
                                local x = data.x + cWidth;

                                -- Draw the column title
                                dxDrawText ( cData.info.title, x + 10, data.y, cData.info.width + x, ( 30 % data.h ) + data.y, tocolor ( 0, 0, 0 , 220 ), FIT_MODE and ( 1 * SCALE ) or 1, font_10, "left", "center", true, true, data.pg, false, true );

                                -- Reset the selected item
                                cData.info.selected = -1;

                                -- Is there any item ?
                                if #cData > 0 then
                                    local seeFrom   =   data.s;
                                    local seeTo     =   ( data.s + data.mi ) - 1;

                                    -- Loop the items
                                    for iIndex = seeFrom, seeTo do
                                        -- There's a row with this index in the current column?
                                        if cData[iIndex] then
                                            local index     =   iIndex - ( data.s - 1 );
                                            local y         =   data.y + ( index * 25 );
                                            local y2        =   data.y + ( ( index - 1 ) * 25 );

                                            -- Check if cursor is on item position
                                            if __isMouseInPosition ( data.x, ( 30 % data.h ) + y2, data.w, 25 ) then
                                                -- Define the mouse-on variable
                                                data.mo = iIndex;
                                            end

                                            -- Draw the item text
                                            dxDrawText ( cData[iIndex]["text"], x + 10, y, cData.info.width + x, ( 30 % data.h ) + y + 5, tocolor ( 255, 255, 255, 255), FIT_MODE and ( 1 * SCALE ) or 1, font_11, "left", "center", true, true, data.pg, true, true );
                                        end
                                    end
                                end

                                -- Increase cWidth variable (to draw the columns correctly)
                                cWidth = cWidth + cData.info.width;
                            end
                        end
                    end
                end
            end
        end
    end
, true, "low-5")

--

addEventHandler ( "onClientKey", root,
    function ( button, press )
        -- Is cursor showing?
        if isCursorShowing () then
            -- Is there any gridlist?
            if #dxGrid1.items > 0 then
                -- Is there any selected gridlist?
                if cursorOn then
                    -- We pressed the scroll?
                    if press and #button > 6 then
                        -- Does the gridlist requires scroll?
                        if dxGrid1.items[cursorOn].r > dxGrid1.items[cursorOn].mi then
                            -- Define some variables
                            local index         =   cursorOn;
                            local currentValue  =   dxGrid1.items[index].s;
                            local newValue      =   math.max(1, button == "mouse_wheel_down" and currentValue + 2 or button == "arrow_d" and currentValue + 2 or button == "mouse_wheel_up" and currentValue - 1 or button == "arrow_u" and currentValue - 1)

                            -- Check if we have spent the row's limit with the new value
                            if ( ( newValue + dxGrid1.items[index].mi ) > dxGrid1.items[index].r ) then
                                newValue = ( dxGrid1.items[index].r - dxGrid1.items[index].mi ) + 1;
                            end



                            -- Set the new scroll level
                            dxGrid1.items[index].s = newValue;
                        end
                    elseif press and button == "mouse1" and dxGrid1.items[cursorOn].mo then
                        dxGrid1.items[cursorOn].se = dxGrid1.items[cursorOn].mo;
                    end
                end
            end
        end
    end
)

--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- Useful

function __calcMaxItems ( height )
    for i = 0, 9999 do
        if ( ( ( i + 1 ) * 25 ) >= math.floor ( height ) ) then
            return ( ( ( i + 1 ) * 25 ) > math.floor ( height ) and ( i - 1 ) or i );
        end
    end
    return false;
end

function __checkParams ( methodName, pattern, ... )
    local cTable = {
        ["string"] = "s";
        ["number"] = "n";
        ["boolean"] = "b";

        ["s"] = "string";
        ["n"] = "number";
        ["b"] = "boolean"
    };

    if #pattern > table.maxn ( { ... } ) then
        local index = table.maxn ( { ... } ) == 0 and 1 or table.maxn ( { ... } ) + 1
        --return false, error ( "Bad Argument @ '"..methodName.."' [Expected "..cTable[ pattern:sub ( index, index ) ].." at argument "..index..", got none]" )
    end

    for k, v in pairs ( { ... } ) do
        if cTable[ type ( v ) ] ~= pattern:sub ( k, k ) then
            ---return false, error ( "Bad Argument @ '"..methodName.."' [Expected "..cTable[ pattern:sub ( k, k ) ].." at argument "..k..", got "..( type ( v ) or "none" ).."]" )
        end
    end
    return true;
end

function __checkRGB ( r, g, b )
    -- Check if all parameters were passed
    if ( not r ) or ( not g ) or ( not b ) then
        return false;
    end
    
    for _, v in ipairs ( { r, g, b } ) do
        if ( type ( v ) ~= "number" ) or ( v < 0 ) or ( v > 255 ) then
            return false;
        end
    end
    
    return true;
end

function __isMouseInPosition ( x, y, w, h )
    if not isCursorShowing() then return false end

    local res   =   { guiGetScreenSize() };
    local cpos  =   { getCursorPosition() };
    local fpos  =   { res[1] * cpos[1], res[2] * cpos[2] };
    return ( fpos[1] >= x and fpos[1] <= x + w ) and ( fpos[2] >= y and fpos[2] <= y + h )
end

 

Link to comment

Você poderia me falar exatamente oque você editou ai ?

Apenas para saber mesmo para que problemas futuros assim eu não precise criar tópicos, ao mexer eu também gosto de aprender, irei testar aqui pra ver se funcionou

8 hours ago, ~#BlackSCR said:

local font1 = dxCreateFont("Files/fonte.ttf", 10)
local font_10 = dxCreateFont("Files/fonte.ttf", 10)
local font_11 = dxCreateFont("Files/fonte.ttf", 9)

dxGrid          =   { items = {} };
local cursorOn;

local NATIVE_RESOLUTION     =   { 1366, 768 } -- put your screen resolution here to fit the gridlists to all resolutions (ex: { 1366, 768 } )
if ( table.maxn ( NATIVE_RESOLUTION ) == 2 ) then
    FIT_MODE                =   true
    RES                     =   { guiGetScreenSize() };
    X,Y                     =   RES[1] / NATIVE_RESOLUTION[1], RES[2] / NATIVE_RESOLUTION[2];
    SCALE                   =   ( 1 / NATIVE_RESOLUTION[1] ) * RES[1];
end

--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- Core - functions

function dxGrid:Create ( x, y, width, height, postGUI )
    -- table dxGrid:Create ( int x, int y, int width, int height[, bool postGUI ] )

    if __checkParams ( "Create", "nnnn", x, y, width, height ) then
        local data = {
            x       =       FIT_MODE and ( x * X ) or x;                                -- X position
            y       =       FIT_MODE and ( y * Y ) or y;                                -- Y position
            w       =       FIT_MODE and ( width * X ) or width;                        -- Width
            h       =       FIT_MODE and ( height * Y ) or height;                      -- Height
            pg      =       postGUI or false;                                           -- PostGUI
            i       =       {};                                                         -- Items
            mi      =       __calcMaxItems ( FIT_MODE and ( height * Y ) or height );   -- Max items
            s       =       1;                                                          -- Scroll Level
            r       =       -1;                                                         -- Row count
            se      =       -1;                                                         -- Selected item
            mo      =       nil;                                                        -- Mouse-on item
            vis     =       true                                                        -- Visible
        };

        setmetatable ( data, { __index = dxGrid } );
        table.insert ( dxGrid.items, data );

        return data;
    end
end

function dxGrid:Destroy ()
    -- bool dxGrid:Destroy ()

    for k, v in pairs ( dxGrid.items ) do
        if v == self then
            dxGrid.items[k] = nil;
            return true;
        end
    end
    return false;
end

function dxGrid:SetItemText (itemID, column, new_text )

    if __checkParams ( "SetItemText", "nns", itemID, column, new_text ) then
        if self.i[column] and self.i[column][itemID] then
            self.i[column][itemID].text = new_text
            return self.i[column][itemID].text == new_text
        end
    end
    return false
end

function dxGrid:SetVisible ( visible )
    -- bool Gridlist:SetVisible ( bool state )
    
    if __checkParams ( "SetVisible", "b", visible ) then
        self.vis = visible

        return true
    else
        return false
    end
end

function dxGrid:IsVisible ( )
    -- bool Gridlist:IsVisible()

    return self.vis
end

function dxGrid:AddColumn ( title, width )
    -- int Gridlist:AddColumn ( string title, int width )

    if __checkParams ( "AddColumn", "sn", title, width ) then
        local data = {
            info    =   { title = title, width = FIT_MODE and ( width * X ) or width }
        };

        table.insert ( self.i, data );

        return #self.i;
    end
end

function dxGrid:RemoveColumn ( columnIndex )
    -- bool Gridlist:RemoveColumn ( int columnIndex )

    if __checkParams ( "RemoveColumn", "n", columnIndex ) then
        self.i[columnIndex] = nil;

        -- Recalculate the highest item count
        local highest = -1;

        for _, v in ipairs ( self.i ) do
            if #v > highest then
                highest = ( #v - 1 );
            end
        end

        self.r = highest;

        -- Recalculate the scroll level (if necessary)
        if ( ( ( self.s + self.mi ) - 2 ) == self.r ) then
            self.s = ( self.r - self.mi ) + 1;
        end

        return true
    end
    return false
end

function dxGrid:GetColumnCount ()
    -- int Gridlist:GetColumnCount()

    return #self.i
end

function dxGrid:AddItem ( columnIndex, text, data, r, g, b )
    -- int Gridlist:AddItem ( int columnIndex, string title[, mixed data, int r, int g, int b ] )

    if __checkParams ( "AddItem", "ns", columnIndex, text ) then
        if self.i[columnIndex] then 
            local tColor = __checkRGB ( r, g, b ) and { r, g, b } or { 255, 255, 255 };
            
            table.insert ( self.i[columnIndex], { id = #self.i[columnIndex] + 1, text = tostring( text ), data = data, color = tColor } );

            if #self.i[columnIndex] > self.r then
                self.r = #self.i[columnIndex];
            end

            return #self.i[columnIndex];
        end
        return false;
    end
end

function dxGrid:RemoveItem ( column, itemID )
    -- bool Gridlist:RemoveItem ( int columnIndex, int itemIndex )

    if __checkParams ( "RemoveItem", "nn", column, itemID ) then
        if self.i[column] and self.i[column][itemID] then
            -- Recalculate the highest item count
            if self.r == #self.i[column] then
                local highest = -1;

                for _, v in ipairs ( self.i ) do
                    if #v > highest then
                        highest = ( #v - 1 );
                    end
                end

                self.r = highest;
            end

            -- Recalculate the scroll level (if necessary)
            if ( ( ( self.s + self.mi ) - 2 ) == self.r ) then
                self.s = ( self.r - self.mi ) + 1;
            end

            -- Reset the selected item if necessary²
            if itemID == self.se then
                local newItem   =   self.se - 1

                if newItem <= self.r then
                    self.se = math.max ( 0, newItem );
                else
                    self.se = -1
                end
            end

            table.remove ( self.i[column], itemID );

            return true;
        end
        return false
    end
end

function dxGrid:GetItemCount ( columnID )
    -- int Gridlist:GetItemCount ( int columnIndex )

    if __checkParams ( "GetItemCount", "n", columnID ) then
        if self.i[columnID] then
            return #self.i[columnID]
        end
        return false
    end
end

function dxGrid:Clear ()
    -- bool Gridlist:Clear()

    for k, v in ipairs ( self.i ) do
        self.i[k] = { info = v.info }
    end

    self.r = -1
    self.se = nil

    -- Recalculate the scroll level
    self.s = 1;

    return true
end

function dxGrid:GetSelectedItem ( )
    -- int Gridlist:GetSelectedItem ()

    return self.se;
end

function dxGrid:SetSelectedItem ( itemID )
    -- bool Gridlist:SetSelectedItem ( int itemIndex )

    if __checkParams ( "SetSelectedItem", "n", itemID ) then
        if itemID <= self.r then
            self.se = itemID;
            return self.se == itemID;
        end
        return false;
    end
end

function dxGrid:GetItemDetails ( column, itemID )
    -- string, mixed Gridlist:GetItemDetails ( int columnIndex, int itemIndex )

    if __checkParams ( "GetItemDetails", "nn", columnID, itemID ) then
        if self.i[column] then
            if self.i[column][itemID] then
                return self.i[column][itemID].text, self.i[column][itemID].data
            end
        end
        return false
    end
end

--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- Core - render/move

addEventHandler ( "onClientRender", root,
    function ( )
        -- Is there any gridlist to render?
        if #dxGrid.items > 0 then
            -- Loop through all grid lists
            for index, data in ipairs ( dxGrid.items ) do
                -- Is the gridlist visible?
                if data.vis then
                    -- Draw the 'gridlist' itself                  
                    dxDrawRectangle (data.x, data.y, data.w, data.h, tocolor ( 0, 0, 0, 100), data.pg );

                    -- Draw the column bar
                    dxDrawRectangle ( data.x, data.y, data.w, 30 % data.h, tocolor (255, 0 , 0 , 255), data.pg );

                    -- Set cursorOn variable to the current gridlist, if it's selected
                    cursorOn = nil
                    if __isMouseInPosition ( data.x, data.y, data.w, data.h ) then
                        cursorOn = index;
                    end

                    -- Check if there's any selected item
                    local seeFrom   =   data.s;
                    local seeTo     =   ( data.s + data.mi ) - 1;

                    if data.se and data.se <= data.r and data.se >= seeFrom and data.se <= seeTo then
                        local index     =   data.se - ( data.s - 1 );
                        local y2        =   data.y + ( ( index - 1 ) * 25 );

                        -- Draw a rectangle to make it looks like selected
                        dxDrawRectangle ( data.x, ( 30 % data.h ) + y2, data.w, 25, tocolor ( 0, 0, 0, 110 ), data.pg );

                      --  dxDrawRectangle ( data.x, ( 30 % data.h ) + y2, data.w, 25, tocolor (0, 0, 0,  ), data.pg );
                    end

                    -- Is there any column?
                    if #data.i > 0 then
                    local cWidth = 0

                        -- Loop through all columns
                        for cIndex, cData in ipairs ( data.i ) do
                            -- we'll go beyond the gridlist width with this column ?
                            if ( ( cWidth + cData.info.width ) <= data.w ) then
                                local x = data.x + cWidth;

                                -- Draw the column title
                                dxDrawText ( cData.info.title, x + 10, data.y, cData.info.width + x, ( 30 % data.h ) + data.y, tocolor ( 255, 255, 255 , 200 ), FIT_MODE and ( 1 * SCALE ) or 1, font_10, "center", "center", true, true, data.pg, false, true );

                                -- Reset the selected item
                                cData.info.selected = -1;

                                -- Is there any item ?
                                if #cData > 0 then
                                    local seeFrom   =   data.s;
                                    local seeTo     =   ( data.s + data.mi ) - 1;

                                    -- Loop the items
                                    for iIndex = seeFrom, seeTo do
                                        -- There's a row with this index in the current column?
                                        if cData[iIndex] then
                                            local index     =   iIndex - ( data.s - 1 );
                                            local y         =   data.y + ( index * 25 );
                                            local y2        =   data.y + ( ( index - 1 ) * 25 );

                                            -- Check if cursor is on item position
                                            if __isMouseInPosition ( data.x, ( 30 % data.h ) + y2, data.w, 25 ) then
                                                -- Define the mouse-on variable
                                                data.mo = iIndex;
                                            end

                                            -- Draw the item text
                                            dxDrawText ( cData[iIndex]["text"], x + 10, y, cData.info.width + x, ( 30 % data.h ) + y + 5, tocolor ( 255, 255, 255, 255), FIT_MODE and ( 1 * SCALE ) or 1, font_11, "left", "center", true, true, data.pg, false, true );
                                        end
                                    end
                                end

                                -- Increase cWidth variable (to draw the columns correctly)
                                cWidth = cWidth + cData.info.width;
                            end
                        end
                    end
                end
            end
        end
    end
, true, "low-5")

--

addEventHandler ( "onClientKey", root,
    function ( button, press )
        -- Is cursor showing?
        if isCursorShowing () then
            -- Is there any gridlist?
            if #dxGrid.items > 0 then
                -- Is there any selected gridlist?
                if cursorOn then
                    -- We pressed the scroll?
                    if press and #button > 6 then
                        -- Does the gridlist requires scroll?
                        if dxGrid.items[cursorOn].r > dxGrid.items[cursorOn].mi then
                            -- Define some variables
                            local index         =   cursorOn;
                            local currentValue  =   dxGrid.items[index].s;
                            local newValue      =   math.max(1, button == "mouse_wheel_down" and currentValue + 2 or button == "arrow_d" and currentValue + 2 or button == "mouse_wheel_up" and currentValue - 1 or button == "arrow_u" and currentValue - 1)

                            -- Check if we have spent the row's limit with the new value
                            if ( ( newValue + dxGrid.items[index].mi ) > dxGrid.items[index].r ) then
                                newValue = ( dxGrid.items[index].r - dxGrid.items[index].mi ) + 1;
                            end



                            -- Set the new scroll level
                            dxGrid.items[index].s = newValue;
                        end
                    elseif press and button == "mouse1" and dxGrid.items[cursorOn].mo then
                        dxGrid.items[cursorOn].se = dxGrid.items[cursorOn].mo;
                    end
                end
            end
        end
    end
)

--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- Useful

function __calcMaxItems ( height )
    for i = 0, 9999 do
        if ( ( ( i + 1 ) * 25 ) >= math.floor ( height ) ) then
            return ( ( ( i + 1 ) * 25 ) > math.floor ( height ) and ( i - 1 ) or i );
        end
    end
    return false;
end

function __checkParams ( methodName, pattern, ... )
    local cTable = {
        ["string"] = "s";
        ["number"] = "n";
        ["boolean"] = "b";

        ["s"] = "string";
        ["n"] = "number";
        ["b"] = "boolean"
    };

    if #pattern > table.maxn ( { ... } ) then
        local index = table.maxn ( { ... } ) == 0 and 1 or table.maxn ( { ... } ) + 1
        --return false, error ( "Bad Argument @ '"..methodName.."' [Expected "..cTable[ pattern:sub ( index, index ) ].." at argument "..index..", got none]" )
    end

    for k, v in pairs ( { ... } ) do
        if cTable[ type ( v ) ] ~= pattern:sub ( k, k ) then
            ---return false, error ( "Bad Argument @ '"..methodName.."' [Expected "..cTable[ pattern:sub ( k, k ) ].." at argument "..k..", got "..( type ( v ) or "none" ).."]" )
        end
    end
    return true;
end

function __checkRGB ( r, g, b )
    -- Check if all parameters were passed
    if ( not r ) or ( not g ) or ( not b ) then
        return false;
    end
    
    for _, v in ipairs ( { r, g, b } ) do
        if ( type ( v ) ~= "number" ) or ( v < 0 ) or ( v > 255 ) then
            return false;
        end
    end
    
    return true;
end

function __isMouseInPosition ( x, y, w, h )
    if not isCursorShowing() then return false end

    local res   =   { guiGetScreenSize() };
    local cpos  =   { getCursorPosition() };
    local fpos  =   { res[1] * cpos[1], res[2] * cpos[2] };
    return ( fpos[1] >= x and fpos[1] <= x + w ) and ( fpos[2] >= y and fpos[2] <= y + h )
end


----------------------------------------------------------------------------------------------------------------------

dxGrid1          =   { items = {} };
local cursorOn;

local NATIVE_RESOLUTION     =   { nil } -- put your screen resolution here to fit the gridlists to all resolutions (ex: { 1366, 768 } )
if ( table.maxn ( NATIVE_RESOLUTION ) == 2 ) then
    FIT_MODE                =   true
    RES                     =   { guiGetScreenSize() };
    X,Y                     =   RES[1] / NATIVE_RESOLUTION[1], RES[2] / NATIVE_RESOLUTION[2];
    SCALE                   =   ( 1 / NATIVE_RESOLUTION[1] ) * RES[1];
end

--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- Core - functions

function dxGrid1:Create ( x, y, width, height, postGUI )
    -- table dxGrid:Create ( int x, int y, int width, int height[, bool postGUI ] )

    if __checkParams ( "Create", "nnnn", x, y, width, height ) then
        local data = {
            x       =       FIT_MODE and ( x * X ) or x;                                -- X position
            y       =       FIT_MODE and ( y * Y ) or y;                                -- Y position
            w       =       FIT_MODE and ( width * X ) or width;                        -- Width
            h       =       FIT_MODE and ( height * Y ) or height;                      -- Height
            pg      =       postGUI or false;                                           -- PostGUI
            i       =       {};                                                         -- Items
            mi      =       __calcMaxItems ( FIT_MODE and ( height * Y ) or height );   -- Max items
            s       =       1;                                                          -- Scroll Level
            r       =       -1;                                                         -- Row count
            se      =       -1;                                                         -- Selected item
            mo      =       nil;                                                        -- Mouse-on item
            vis     =       true                                                        -- Visible
        };

        setmetatable ( data, { __index = dxGrid1 } );
        table.insert ( dxGrid1.items, data );

        return data;
    end
end

function dxGrid1:Destroy ()
    -- bool dxGrid:Destroy ()

    for k, v in pairs ( dxGrid1.items ) do
        if v == self then
            dxGrid1.items[k] = nil;
            return true;
        end
    end
    return false;
end

function dxGrid1:SetItemText (itemID, column, new_text )

    if __checkParams ( "SetItemText", "nns", itemID, column, new_text ) then
        if self.i[column] and self.i[column][itemID] then
            self.i[column][itemID].text = new_text
            return self.i[column][itemID].text == new_text
        end
    end
    return false
end

function dxGrid1:SetVisible ( visible )
    -- bool Gridlist:SetVisible ( bool state )
    
    if __checkParams ( "SetVisible", "b", visible ) then
        self.vis = visible

        return true
    else
        return false
    end
end

function dxGrid1:IsVisible ( )
    -- bool Gridlist:IsVisible()

    return self.vis
end

function dxGrid1:AddColumn ( title, width )
    -- int Gridlist:AddColumn ( string title, int width )

    if __checkParams ( "AddColumn", "sn", title, width ) then
        local data = {
            info    =   { title = title, width = FIT_MODE and ( width * X ) or width }
        };

        table.insert ( self.i, data );

        return #self.i;
    end
end

function dxGrid1:RemoveColumn ( columnIndex )
    -- bool Gridlist:RemoveColumn ( int columnIndex )

    if __checkParams ( "RemoveColumn", "n", columnIndex ) then
        self.i[columnIndex] = nil;

        -- Recalculate the highest item count
        local highest = -1;

        for _, v in ipairs ( self.i ) do
            if #v > highest then
                highest = ( #v - 1 );
            end
        end

        self.r = highest;

        -- Recalculate the scroll level (if necessary)
        if ( ( ( self.s + self.mi ) - 2 ) == self.r ) then
            self.s = ( self.r - self.mi ) + 1;
        end

        return true
    end
    return false
end

function dxGrid1:GetColumnCount ()
    -- int Gridlist:GetColumnCount()

    return #self.i
end

function dxGrid1:AddItem ( columnIndex, text, data, r, g, b )
    -- int Gridlist:AddItem ( int columnIndex, string title[, mixed data, int r, int g, int b ] )

    if __checkParams ( "AddItem", "ns", columnIndex, text ) then
        if self.i[columnIndex] then 
            local tColor = __checkRGB ( r, g, b ) and { r, g, b } or { 255, 255, 255 };
            
            table.insert ( self.i[columnIndex], { id = #self.i[columnIndex] + 1, text = tostring( text ), data = data, color = tColor } );

            if #self.i[columnIndex] > self.r then
                self.r = #self.i[columnIndex];
            end

            return #self.i[columnIndex];
        end
        return false;
    end
end

function dxGrid1:RemoveItem ( column, itemID )
    -- bool Gridlist:RemoveItem ( int columnIndex, int itemIndex )

    if __checkParams ( "RemoveItem", "nn", column, itemID ) then
        if self.i[column] and self.i[column][itemID] then
            -- Recalculate the highest item count
            if self.r == #self.i[column] then
                local highest = -1;

                for _, v in ipairs ( self.i ) do
                    if #v > highest then
                        highest = ( #v - 1 );
                    end
                end

                self.r = highest;
            end

            -- Recalculate the scroll level (if necessary)
            if ( ( ( self.s + self.mi ) - 2 ) == self.r ) then
                self.s = ( self.r - self.mi ) + 1;
            end

            -- Reset the selected item if necessary²
            if itemID == self.se then
                local newItem   =   self.se - 1

                if newItem <= self.r then
                    self.se = math.max ( 0, newItem );
                else
                    self.se = -1
                end
            end

            table.remove ( self.i[column], itemID );

            return true;
        end
        return false
    end
end

function dxGrid1:GetItemCount ( columnID )
    -- int Gridlist:GetItemCount ( int columnIndex )

    if __checkParams ( "GetItemCount", "n", columnID ) then
        if self.i[columnID] then
            return #self.i[columnID]
        end
        return false
    end
end

function dxGrid1:Clear ()
    -- bool Gridlist:Clear()

    for k, v in ipairs ( self.i ) do
        self.i[k] = { info = v.info }
    end

    self.r = -1
    self.se = nil

    -- Recalculate the scroll level
    self.s = 1;

    return true
end

function dxGrid1:GetSelectedItem ( )
    -- int Gridlist:GetSelectedItem ()

    return self.se;
end

function dxGrid1:SetSelectedItem ( itemID )
    -- bool Gridlist:SetSelectedItem ( int itemIndex )

    if __checkParams ( "SetSelectedItem", "n", itemID ) then
        if itemID <= self.r then
            self.se = itemID;
            return self.se == itemID;
        end
        return false;
    end
end

function dxGrid1:GetItemDetails ( column, itemID )
    -- string, mixed Gridlist:GetItemDetails ( int columnIndex, int itemIndex )

    if __checkParams ( "GetItemDetails", "nn", columnID, itemID ) then
        if self.i[column] then
            if self.i[column][itemID] then
                return self.i[column][itemID].text, self.i[column][itemID].data
            end
        end
        return false
    end
end

--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- Core - render/move

addEventHandler ( "onClientRender", root,
    function ( )
        -- Is there any gridlist to render?
        if #dxGrid1.items > 0 then
            -- Loop through all grid lists
            for index, data in ipairs ( dxGrid1.items ) do
                -- Is the gridlist visible?
                if data.vis then
                    -- Draw the 'gridlist' itself                  
                    dxDrawRectangle (data.x, data.y, data.w, data.h, tocolor ( 0, 0, 0, 100), data.pg );

                    -- Draw the column bar
                    dxDrawRectangle ( data.x, data.y, data.w, 30 % data.h, tocolor (255, 0 , 0 , 255), data.pg );

                    -- Set cursorOn variable to the current gridlist, if it's selected
                    cursorOn = nil
                    if __isMouseInPosition ( data.x, data.y, data.w, data.h ) then
                        cursorOn = index;
                    end

                    -- Check if there's any selected item
                    local seeFrom   =   data.s;
                    local seeTo     =   ( data.s + data.mi ) - 1;

                    if data.se and data.se <= data.r and data.se >= seeFrom and data.se <= seeTo then
                        local index     =   data.se - ( data.s - 1 );
                        local y2        =   data.y + ( ( index - 1 ) * 25 );

                        -- Draw a rectangle to make it looks like selected
                        dxDrawRectangle ( data.x, ( 30 % data.h ) + y2, data.w, 25, tocolor ( 0, 0, 0, 110 ), data.pg );

                      --  dxDrawRectangle ( data.x, ( 30 % data.h ) + y2, data.w, 25, tocolor (0, 0, 0,  ), data.pg );
                    end

                    -- Is there any column?
                    if #data.i > 0 then
                    local cWidth = 0

                        -- Loop through all columns
                        for cIndex, cData in ipairs ( data.i ) do
                            -- we'll go beyond the gridlist width with this column ?
                            if ( ( cWidth + cData.info.width ) <= data.w ) then
                                local x = data.x + cWidth;

                                -- Draw the column title
                                dxDrawText ( cData.info.title, x + 10, data.y, cData.info.width + x, ( 30 % data.h ) + data.y, tocolor ( 0, 0, 0 , 220 ), FIT_MODE and ( 1 * SCALE ) or 1, font_10, "left", "center", true, true, data.pg, false, true );

                                -- Reset the selected item
                                cData.info.selected = -1;

                                -- Is there any item ?
                                if #cData > 0 then
                                    local seeFrom   =   data.s;
                                    local seeTo     =   ( data.s + data.mi ) - 1;

                                    -- Loop the items
                                    for iIndex = seeFrom, seeTo do
                                        -- There's a row with this index in the current column?
                                        if cData[iIndex] then
                                            local index     =   iIndex - ( data.s - 1 );
                                            local y         =   data.y + ( index * 25 );
                                            local y2        =   data.y + ( ( index - 1 ) * 25 );

                                            -- Check if cursor is on item position
                                            if __isMouseInPosition ( data.x, ( 30 % data.h ) + y2, data.w, 25 ) then
                                                -- Define the mouse-on variable
                                                data.mo = iIndex;
                                            end

                                            -- Draw the item text
                                            dxDrawText ( cData[iIndex]["text"], x + 10, y, cData.info.width + x, ( 30 % data.h ) + y + 5, tocolor ( 255, 255, 255, 255), FIT_MODE and ( 1 * SCALE ) or 1, font_11, "left", "center", true, true, data.pg, true, true );
                                        end
                                    end
                                end

                                -- Increase cWidth variable (to draw the columns correctly)
                                cWidth = cWidth + cData.info.width;
                            end
                        end
                    end
                end
            end
        end
    end
, true, "low-5")

--

addEventHandler ( "onClientKey", root,
    function ( button, press )
        -- Is cursor showing?
        if isCursorShowing () then
            -- Is there any gridlist?
            if #dxGrid1.items > 0 then
                -- Is there any selected gridlist?
                if cursorOn then
                    -- We pressed the scroll?
                    if press and #button > 6 then
                        -- Does the gridlist requires scroll?
                        if dxGrid1.items[cursorOn].r > dxGrid1.items[cursorOn].mi then
                            -- Define some variables
                            local index         =   cursorOn;
                            local currentValue  =   dxGrid1.items[index].s;
                            local newValue      =   math.max(1, button == "mouse_wheel_down" and currentValue + 2 or button == "arrow_d" and currentValue + 2 or button == "mouse_wheel_up" and currentValue - 1 or button == "arrow_u" and currentValue - 1)

                            -- Check if we have spent the row's limit with the new value
                            if ( ( newValue + dxGrid1.items[index].mi ) > dxGrid1.items[index].r ) then
                                newValue = ( dxGrid1.items[index].r - dxGrid1.items[index].mi ) + 1;
                            end



                            -- Set the new scroll level
                            dxGrid1.items[index].s = newValue;
                        end
                    elseif press and button == "mouse1" and dxGrid1.items[cursorOn].mo then
                        dxGrid1.items[cursorOn].se = dxGrid1.items[cursorOn].mo;
                    end
                end
            end
        end
    end
)

--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- Useful

function __calcMaxItems ( height )
    for i = 0, 9999 do
        if ( ( ( i + 1 ) * 25 ) >= math.floor ( height ) ) then
            return ( ( ( i + 1 ) * 25 ) > math.floor ( height ) and ( i - 1 ) or i );
        end
    end
    return false;
end

function __checkParams ( methodName, pattern, ... )
    local cTable = {
        ["string"] = "s";
        ["number"] = "n";
        ["boolean"] = "b";

        ["s"] = "string";
        ["n"] = "number";
        ["b"] = "boolean"
    };

    if #pattern > table.maxn ( { ... } ) then
        local index = table.maxn ( { ... } ) == 0 and 1 or table.maxn ( { ... } ) + 1
        --return false, error ( "Bad Argument @ '"..methodName.."' [Expected "..cTable[ pattern:sub ( index, index ) ].." at argument "..index..", got none]" )
    end

    for k, v in pairs ( { ... } ) do
        if cTable[ type ( v ) ] ~= pattern:sub ( k, k ) then
            ---return false, error ( "Bad Argument @ '"..methodName.."' [Expected "..cTable[ pattern:sub ( k, k ) ].." at argument "..k..", got "..( type ( v ) or "none" ).."]" )
        end
    end
    return true;
end

function __checkRGB ( r, g, b )
    -- Check if all parameters were passed
    if ( not r ) or ( not g ) or ( not b ) then
        return false;
    end
    
    for _, v in ipairs ( { r, g, b } ) do
        if ( type ( v ) ~= "number" ) or ( v < 0 ) or ( v > 255 ) then
            return false;
        end
    end
    
    return true;
end

function __isMouseInPosition ( x, y, w, h )
    if not isCursorShowing() then return false end

    local res   =   { guiGetScreenSize() };
    local cpos  =   { getCursorPosition() };
    local fpos  =   { res[1] * cpos[1], res[2] * cpos[2] };
    return ( fpos[1] >= x and fpos[1] <= x + w ) and ( fpos[2] >= y and fpos[2] <= y + h )
end

 

Quase foi mas não resolveu continua bugado...
FVmk2dm.png

Você poderia me falar exatamente oque você editou para eu estar tentando modificar eu mesmo

Edited by abrobinha
Explicação
Link to comment

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...