Advertisement
Guest User

Untitled

a guest
Jan 22nd, 2020
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 49.71 KB | None | 0 0
  1. -- coded by TiM3
  2.  
  3. local dxElements = {}
  4.  
  5. ---------------
  6. -- Events
  7.  
  8. addEvent ( "onClientDxButtonClick" )
  9. addEvent ( "onDxEditChanged" )
  10. addEvent ( "onDxEditAccepted" )
  11. addEvent ( "onDxEditFocus" )
  12. addEvent ( "onClientDxGridListSelect" )
  13. addEvent ( "onClientDxGridListDeselect" )
  14. addEvent ( "onClientDxGridListDoubleClick" )
  15. addEvent ( "onDxImageMouseEnter" )
  16. addEvent ( "onDxImageMouseLeave" )
  17. addEvent ( "onDxImageMouseMove" )
  18. addEvent ( "onDxImageMouseDown" )
  19. addEvent ( "onDxImageMouseUp" )
  20. addEvent ( "onDxCheckBoxChange" )
  21. addEvent ( "onDxRadioButtonChange" )
  22.  
  23. -- ------------
  24. -- Creation functions
  25.  
  26. function dxCreateWindow ( x, y, w, h, title, parent, border, headColor, mainColor )
  27.     local element = createElement ( "dx_window" )
  28.     if parent then
  29.         local posX, posY = dxGetElementPosition ( parent )
  30.         table.insert ( dxElements, {element = element, x = x+posX, y = y+posY, w = w, h = h, title = title, parent = parent, hc = tocolor(51,51,51,255), mc = tocolor(65,65,65,255), border = false, alpha = 255, visible = true} )
  31.     else
  32.         table.insert ( dxElements, {element = element, x = x, y = y, w = w, h = h, title = title, parent = parent, hc = tocolor(51,51,51,255), mc = tocolor(65,65,65,255), border = false, alpha = 255, visible = true} )
  33.     end
  34.     return element
  35. end
  36.  
  37. function dxCreateLabel ( x, y, w, h, text, parent, font, fontHeight, horAlign, verAlign, colorCoded )
  38.     local element = createElement ( "dx_label" )
  39.    
  40.     if parent then
  41.         local posX, posY = dxGetElementPosition ( parent )
  42.         table.insert ( dxElements, {element = element, x = posX+x, y = posY+y, w = posX+x+w, h = posY+y+h, text = text, font = font, fontH = fontHeight, parent = parent, hor = horAlign, ver = verAlign, cc = colorCoded, alpha = 255, visible = dxIsElementVisible ( parent )} )
  43.     else
  44.         table.insert ( dxElements, {element = element, x = x, y = y, w = x+w, h = y+h, text = text, font = font, fontH = fontHeight, parent = parent, hor = horAlign, ver = verAlign, cc = colorCoded, alpha = 255, visible = true} )
  45.     end
  46.    
  47.     return element
  48. end
  49.  
  50. function dxCreateButton ( x, y, w, h, text, parent, color )
  51.     local element = createElement ( "dx_button" )
  52.    
  53.     if parent then
  54.         local posX, posY = dxGetElementPosition ( parent )
  55.         table.insert ( dxElements, {element = element, x = posX+x, y = posY+y, w = w, h = h, text = text, parent = parent, color = tocolor(67,205,243,255), originalColor = tocolor(67,205,243,255), alpha = 255, gui = guiCreateLabel ( posX+x, posY+y, w, h, "", false ), anim = {false,false,0}, visible = dxIsElementVisible ( parent )} ) -- anim < active, up, progress
  56.     else
  57.         table.insert ( dxElements, {element = element, x = x, y = y, w = w, h = h, text = text, parent = parent, color = tocolor(67,205,243,255), originalColor = tocolor(67,205,243,255), alpha = 255, gui = guiCreateLabel ( x, y, w, h, "", false ), anim = {false,false,0}, visible = true} ) -- anim < active, up, progress
  58.     end
  59.     addEventHandler ( "onClientMouseEnter", dxElements[#dxElements].gui, dxButtonMouseEnter, false )
  60.     addEventHandler ( "onClientMouseLeave", dxElements[#dxElements].gui, dxButtonMouseLeave, false )
  61.     addEventHandler ( "onClientGUIMouseDown", dxElements[#dxElements].gui, dxButtonMouseDown, false )
  62.     addEventHandler ( "onClientGUIMouseUp", dxElements[#dxElements].gui, dxButtonMouseUp, false )
  63.     addEventHandler ( "onClientGUIClick", dxElements[#dxElements].gui, dxButtonMouseClick, false )
  64.    
  65.     guiSetVisible ( dxElements[#dxElements].gui, dxElements[#dxElements].visible )
  66.    
  67.     return element
  68. end
  69.  
  70. function dxCreateEdit ( x, y, w, h, text, parent, masked )
  71.     local element = createElement ( "dx_edit" )
  72.    
  73.     if parent then
  74.         local posX, posY = dxGetElementPosition ( parent )
  75.         table.insert ( dxElements, {element = element, x = posX+x, y = posY+y, w = w, h = h, text = text, parent = parent, masked = masked, alpha = 255, gui = guiCreateEdit ( posX+x, posY+y, w, h, text, false ), visible = dxIsElementVisible ( parent )} )
  76.         guiSetAlpha ( dxElements[#dxElements].gui, 0 )
  77.         guiEditSetMasked ( dxElements[#dxElements].gui, masked or false )
  78.     else
  79.         table.insert ( dxElements, {element = element, x = x, y = y, w = w, h = h, text = text, parent = parent, masked = masked, alpha = 255, gui = guiCreateEdit ( x, y, w, h, text, false ), visible = true} )
  80.         guiSetAlpha ( dxElements[#dxElements].gui, 0 )
  81.         guiEditSetMasked ( dxElements[#dxElements].gui, masked or false )
  82.     end
  83.     addEventHandler ( "onClientGUIFocus", dxElements[#dxElements].gui, dxGuiFocus, false )
  84.     addEventHandler ( "onClientGUIBlur", dxElements[#dxElements].gui, dxGuiBlur, false )
  85.     addEventHandler ( "onClientGUIChanged", dxElements[#dxElements].gui, dxEditChanged, false )
  86.     addEventHandler ( "onClientGUIAccepted", dxElements[#dxElements].gui, dxEditAccepted, false )
  87.    
  88.     guiSetVisible ( dxElements[#dxElements].gui, dxElements[#dxElements].visible )
  89.    
  90.     return element
  91. end
  92.  
  93. function dxCreateTabPanel ( parent, height, color, width, x, y ) -- limit of 1 tab panel inside of another
  94.     local element = createElement ( "dx_tabpanel" )
  95.    
  96.     local posX, posY = dxGetElementPosition ( parent )
  97.     local w, h = dxGetElementSize ( parent )
  98.    
  99.     table.insert ( dxElements, {element = element, x = posX+(x or 7), y = posY+(y or 32), w = width or w-14, h = height or h-39, parent = parent, color = tocolor(0,0,0,25), visible = dxIsElementVisible ( parent )} )
  100.    
  101.     return element
  102. end
  103.  
  104. function dxCreateTab ( title, panel, color )
  105.     local element = createElement ( "dx_tab" )
  106.    
  107.     local posX, posY = dxGetElementPosition ( panel )
  108.     local w, h = dxGetElementSize ( window )
  109.     local prevW = dxTabGetPreviousWidth ( panel )
  110.    
  111.     table.insert ( dxElements, {element = element, x = posX, y = posY, w = w, h = h, title = title, parent = panel, bx = posX+prevW, bw = dxGetTextWidth ( title, 1, "default-bold" ) + 10, color = tocolor(140,140,140,255), gui = guiCreateLabel ( posX+prevW, posY, dxGetTextWidth ( title, 1, "default-bold" ) + 10, 25, "", false ), active = false, visible = dxIsElementVisible ( panel )} )
  112.    
  113.     addEventHandler ( "onClientMouseEnter", dxElements[#dxElements].gui, dxTabMouseEnter, false )
  114.     addEventHandler ( "onClientMouseLeave", dxElements[#dxElements].gui, dxTabMouseLeave, false )
  115.     addEventHandler ( "onClientGUIClick", dxElements[#dxElements].gui, dxTabMouseClick, false )
  116.    
  117.     dxActivateFirstTab ( panel )
  118.    
  119.     guiSetVisible ( dxElements[#dxElements].gui, dxElements[#dxElements].visible )
  120.    
  121.     return element
  122. end
  123.  
  124. function dxCreateCheckBox ( x, y, text, parent )
  125.     local element = createElement ( "dx_checkbox" )
  126.    
  127.     if parent then
  128.         local posX, posY = dxGetElementPosition ( parent )
  129.         table.insert ( dxElements, {element = element, x = posX+x, y = posY+y, text = text, tw = dxGetTextWidth ( text, 1, "default" ), parent = parent, ticked = false, alpha = 255, gui = guiCreateLabel ( posX+x, posY+y, dxGetTextWidth ( text, 1, "default" ), 13, "", false ), visible = dxIsElementVisible ( parent )} )
  130.         guiSetAlpha ( dxElements[#dxElements].gui, 0 )
  131.     else
  132.         table.insert ( dxElements, {element = element, x = x, y = y, text = text, tw = dxGetTextWidth ( text, 1, "default" ), parent = parent, ticked = false, alpha = 255, gui = guiCreateLabel ( x, y, dxGetTextWidth ( text, 1, "default" ), 13, "", false ), visible = true} )
  133.         guiSetAlpha ( dxElements[#dxElements].gui, 0 )
  134.     end
  135.     addEventHandler ( "onClientGUIClick", dxElements[#dxElements].gui, dxCheckBoxClick, false )
  136.    
  137.     guiSetVisible ( dxElements[#dxElements].gui, dxElements[#dxElements].visible )
  138.    
  139.     return element
  140. end
  141.  
  142. function dxCreateGridList ( x, y, w, h, parent, clickable, font, headerColor, color, childColor ) -- y must be in the form |20+visibleRows*15|
  143.     local element = createElement ( "dx_gridlist" )
  144.  
  145.     if parent then
  146.         local posX, posY = dxGetElementPosition ( parent )
  147.         table.insert ( dxElements, {element = element, x = posX+x, y = posY+y, w = w, h = h, by = posY+y+20, bh = h-20, parent = parent, font = font, alpha = 255, gui = guiCreateLabel ( posX+x, posY+y, w, h, "", false ), visible = dxIsElementVisible ( parent ), children = {}, clickable = clickable, headerColor = tocolor(140,140,140,255), color = tocolor(0,0,0,75), childColor = tocolor(255,255,255,25)} )
  148.         guiSetAlpha ( dxElements[#dxElements].gui, 0 )
  149.     else
  150.         table.insert ( dxElements, {element = element, x = x, y = y, w = w, h = h, by = y+20, bh = h-20, parent = parent, font = font, alpha = 255, gui = guiCreateLabel ( x, y, w, h, "", false ), visible = true, children = {}, clickable = clickable, headerColor = tocolor(140,140,140,255), color = tocolor(0,0,0,75), childColor = tocolor(255,255,255,25)} )
  151.         guiSetAlpha ( dxElements[#dxElements].gui, 0 )
  152.     end
  153.  
  154.     addEventHandler ( "onClientMouseEnter", dxElements[#dxElements].gui, dxGridListEnter, false )
  155.     addEventHandler ( "onClientMouseLeave", dxElements[#dxElements].gui, dxGridListLeave, false )
  156.     addEventHandler ( "onClientMouseMove", dxElements[#dxElements].gui, dxGridListMove, false )
  157.     addEventHandler ( "onClientGUIClick", dxElements[#dxElements].gui, dxGridListClick, false )
  158.     addEventHandler ( "onClientGUIMouseDown", dxElements[#dxElements].gui, dxGridListDown, false )
  159.     addEventHandler ( "onClientGUIBlur", dxElements[#dxElements].gui, dxGridListBlur, true )
  160.    
  161.     addEventHandler ( "onClientMouseWheel", dxElements[#dxElements].gui, dxGridListMouseWheel, false )
  162.    
  163.     guiSetVisible ( dxElements[#dxElements].gui, dxElements[#dxElements].visible )
  164.    
  165.     return element
  166. end
  167.  
  168. function dxCreateScrollBar ( x, y, s, pos, parent, color )
  169.     local element = createElement ( "dx_scrollbar" )
  170.    
  171.     if parent then
  172.         local posX, posY = dxGetElementPosition ( parent )
  173.         table.insert ( dxElements, {element = element, x = posX+x, y = posY+y, maxPos = (pos == "horizontal" and posX+x+s-30 or posY+y+s-30), range = s-30, s = s, p = (pos == "horizontal" and posX+x or posY+y), pos = pos, slidePos = (pos == "horizontal" and posX+x or posY+y), parent = parent, color = tocolor(0,0,0,25), alpha = 255, gui = guiCreateLabel ( posX+x, posY+y, (pos == "horizontal" and s or 15), (pos == "horizontal" and 15 or s), "", false ), visible = dxIsElementVisible ( parent )} )
  174.         guiSetAlpha ( dxElements[#dxElements].gui, 0 )
  175.     else
  176.         table.insert ( dxElements, {element = element, x = x, y = y, maxPos = (pos == "horizontal" and x+s-30 or y+s-30), range = s-30, s = s, p = (pos == "horizontal" and x or y), pos = pos, slidePos = (pos == "horizontal" and x or y), parent = parent, color = tocolor(0,0,0,25), alpha = 255, gui = guiCreateLabel ( x, y, (pos == "horizontal" and s or 15), (pos == "horizontal" and 15 or s), "", false ), visible = true} )
  177.         guiSetAlpha ( dxElements[#dxElements].gui, 0 )
  178.     end
  179.  
  180.     addEventHandler ( "onClientGUIMouseDown", dxElements[#dxElements].gui, dxScrollBarDown, false )
  181.    
  182.     guiSetVisible ( dxElements[#dxElements].gui, dxElements[#dxElements].visible )
  183.    
  184.     return element
  185. end
  186.  
  187. function dxCreateRadioButton ( x, y, text, parent )
  188.     local element = createElement ( "dx_radiobutton" )
  189.    
  190.     if parent then
  191.         local posX, posY = dxGetElementPosition ( parent )
  192.         table.insert ( dxElements, {element = element, x = posX+x, y = posY+y, text = text, tw = dxGetTextWidth ( text, 1, "default" ), parent = parent, ticked = false, alpha = 255, gui = guiCreateLabel ( posX+x, posY+y, dxGetTextWidth ( text, 1, "default" ), 13, "", false ), visible = dxIsElementVisible ( parent )} )
  193.         guiSetAlpha ( dxElements[#dxElements].gui, 0 )
  194.     else
  195.         table.insert ( dxElements, {element = element, x = x, y = y, text = text, tw = dxGetTextWidth ( text, 1, "default" ), parent = parent, ticked = false, alpha = 255, gui = guiCreateLabel ( x, y, dxGetTextWidth ( text, 1, "default" ), 13, "", false ), visible = true} )
  196.         guiSetAlpha ( dxElements[#dxElements].gui, 0 )
  197.     end
  198.     addEventHandler ( "onClientGUIClick", dxElements[#dxElements].gui, dxRadioButtonClick, false )
  199.    
  200.     guiSetVisible ( dxElements[#dxElements].gui, dxElements[#dxElements].visible )
  201.    
  202.     return element
  203. end
  204.  
  205. function dxCreateRectangle ( x, y, w, h, color, parent )
  206.     local element = createElement ( "dx_rectangle" )
  207.    
  208.     if parent then
  209.         local posX, posY = dxGetElementPosition ( parent )
  210.         table.insert ( dxElements, {element = element, x = posX+x, y = posY+y, w = w, h = h, color = color, parent = parent, alpha = 255, visible = dxIsElementVisible ( parent )} )
  211.     else
  212.         table.insert ( dxElements, {element = element, x = x, y = y, w = w, h = h, color = color, parent = parent, alpha = 255, visible = true} )
  213.     end
  214.    
  215.     return element
  216. end
  217.  
  218. function dxCreateImage ( x, y, w, h, path, parent, color, gui )
  219.     local element = createElement ( "dx_image" )
  220.    
  221.     if parent then
  222.         local posX, posY = dxGetElementPosition ( parent )
  223.         table.insert ( dxElements, {element = element, x = posX+x, y = posY+y, w = w, h = h, path = path, color = color, parent = parent, gui = guiCreateLabel ( posX+x, posY+y, w, h, "", false ), alpha = 255, visible = dxIsElementVisible ( parent )} )
  224.     else
  225.         table.insert ( dxElements, {element = element, x = x, y = y, w = w, h = h, path = path, color = color, parent = parent, gui = guiCreateLabel ( x, y, w, h, "", false ), alpha = 255, visible = true} )
  226.     end
  227.     if gui then
  228.         addEventHandler ( "onClientMouseEnter", dxElements[#dxElements].gui, dxImageMouseEnter, false )
  229.         addEventHandler ( "onClientMouseLeave", dxElements[#dxElements].gui, dxImageMouseLeave, false )
  230.         addEventHandler ( "onClientMouseMove", dxElements[#dxElements].gui, dxImageMouseMove, false )
  231.         addEventHandler ( "onClientGUIMouseDown", dxElements[#dxElements].gui, dxImageMouseDown, false )
  232.         addEventHandler ( "onClientGUIMouseUp", dxElements[#dxElements].gui, dxImageMouseUp, false )
  233.         guiSetVisible ( dxElements[#dxElements].gui, dxElements[#dxElements].visible )
  234.     end
  235.    
  236.     return element
  237. end
  238.  
  239. -- ------------
  240. -- Destroying functions
  241.  
  242. function dxDestroyElementsWithParent ( parent )
  243.     local a = {}
  244.     for k, v in pairs ( dxElements ) do
  245.         if v.parent == parent then
  246.        
  247.             table.insert ( a, k ) -- tabpanel
  248.            
  249.             for ke, va in pairs ( dxElements ) do
  250.                 if va.parent == v.element then -- tab
  251.                
  252.                     table.insert ( a, ke )
  253.                    
  254.                     for key, val in pairs ( dxElements ) do
  255.                         if val.parent == va.element then -- tab body
  256.                            
  257.                             table.insert ( a, key )
  258.                            
  259.                                 for kk, vv in pairs ( dxElements ) do
  260.                                     if vv.parent == val.element then -- tab
  261.                                        
  262.                                         table.insert ( a, kk )
  263.                                        
  264.                                         for kkk, vvv in pairs ( dxElements ) do
  265.                                             if vvv.parent == vv.element then -- tab body
  266.                                            
  267.                                                 table.insert ( a, kkk )
  268.                                                
  269.                                                 for kkkk, vvvv in pairs ( dxElements ) do
  270.                                                     if vvvv.parent == vvv.element then
  271.                                                        
  272.                                                         table.insert ( a, kkkk )
  273.                                                        
  274.                                                     end
  275.                                                 end
  276.                                                
  277.                                             end
  278.                                         end
  279.                                        
  280.                                     end
  281.                                 end
  282.                            
  283.                         end
  284.                     end
  285.                    
  286.                 end
  287.             end
  288.            
  289.  
  290.         end
  291.     end
  292.     for k, v in pairs ( a ) do
  293.         destroyElement ( dxElements[v].element )
  294.         if dxElements[v].gui then
  295.             destroyElement ( dxElements[v].gui )
  296.         end
  297.     end
  298.     --for k, v in pairs ( a ) do
  299.         --table.remove ( dxElements, v )
  300.     --end
  301. end
  302.  
  303. function dxDestroyElement ( element ) -- only destroys the element and not its children
  304.     local a
  305.     for k, v in pairs ( dxElements ) do
  306.         if v.element == element then
  307.             a = k
  308.             if v.gui then
  309.                 destroyElement ( v.gui )
  310.             end
  311.             break
  312.         end
  313.     end
  314.     table.remove ( dxElements, a )
  315.     destroyElement ( element )
  316. end
  317.  
  318. -- ------------
  319. -- Label functions
  320.  
  321. function dxLabelSetText ( element, text )
  322.     for key, val in pairs ( dxElements ) do
  323.         if val.element == element then
  324.             dxElements[key].text = text
  325.             break
  326.         end
  327.     end
  328. end
  329.  
  330. function dxLabelGetText ( element )
  331.     for key, val in pairs ( dxElements ) do
  332.         if val.element == element then
  333.             return val.text
  334.         end
  335.     end
  336.     return false
  337. end
  338.  
  339. -- ------------
  340. -- Button functions
  341.  
  342. function dxButtonMouseEnter ()
  343.     local key = dxGetElementKeyFromGUI ( source )
  344.     dxElements[key].color = tocolor(63,214,255,255)--(dxElements[key].originalColor and (dxElements[key].originalColor-656640) or tocolor(110,165,255,255))
  345. end
  346.  
  347. function dxButtonMouseLeave ()
  348.     local key = dxGetElementKeyFromGUI ( source )
  349.     dxElements[key].color = dxElements[key].originalColor or tocolor(95,160,255,255)
  350. end
  351.  
  352. function dxButtonMouseClick ( button, state )
  353.     if button ~= "left" or state ~= "up" then return end
  354.     -- play the sound
  355.     local key = dxGetElementKeyFromGUI ( source )
  356.     triggerEvent ( "onClientDxButtonClick", dxElements[key].element )
  357. end
  358.  
  359. function dxButtonMouseDown ( button )
  360.     if button ~= "left" then return end
  361.     local key = dxGetElementKeyFromGUI ( source )
  362.     dxElements[key].color = tocolor(55,55,55,255)
  363. end
  364.  
  365. function dxButtonMouseUp ( button )
  366.     if button ~= "left" then return end
  367.     local key = dxGetElementKeyFromGUI ( source )
  368.     dxElements[key].color = tocolor(63,214,255,255)--(dxElements[key].originalColor and (dxElements[key].originalColor-656640) or tocolor(110,165,255,255))
  369. end
  370.  
  371. function dxButtonSetText ( button, text )
  372.     for k, v in pairs ( dxElements ) do
  373.         if v.element == button then
  374.             dxElements[k].text = text
  375.             break
  376.         end
  377.     end
  378. end
  379.  
  380. -- ------------
  381. -- Edit functions
  382.  
  383. function dxEditSetReadOnly ( element, boolean )
  384.     for k, v in pairs ( dxElements ) do
  385.         if v.element == element then
  386.             guiEditSetReadOnly ( v.gui, boolean )
  387.             break
  388.         end
  389.     end
  390. end
  391.  
  392. function dxEditSetText ( element, text )
  393.     for k, v in pairs ( dxElements ) do
  394.         if v.element == element then
  395.             guiSetText ( v.gui, text )
  396.             break
  397.         end
  398.     end
  399. end
  400.  
  401. function dxEditGetText ( element )
  402.     for k, v in pairs ( dxElements ) do
  403.         if v.element == element then
  404.             return guiGetText ( v.gui )
  405.         end
  406.     end
  407. end
  408.  
  409. -- havent updated the original lib with this
  410. function dxEditSetMaxLength ( element, length )
  411.     for k, v in pairs ( dxElements ) do
  412.         if v.element == element then
  413.             guiEditSetMaxLength ( v.gui, length )
  414.             break
  415.         end
  416.     end
  417. end
  418.  
  419. function dxEditChanged ()
  420.     local key = dxGetElementKeyFromGUI ( source )
  421.     triggerEvent ( "onDxEditChanged", dxElements[key].element )
  422. end
  423.  
  424. function dxEditAccepted ()
  425.     local key = dxGetElementKeyFromGUI ( source )
  426.     triggerEvent ( "onDxEditAccepted", dxElements[key].element )
  427. end
  428.  
  429. -- ------------
  430. -- Tab functions
  431.  
  432. function dxClearTabs ( panel )
  433.     for k, v in pairs ( dxElements ) do
  434.    
  435.         if v.parent == panel then -- tab
  436.        
  437.             dxElements[k].active = false
  438.             dxElements[k].color = nil
  439.            
  440.             for key, val in pairs ( dxElements ) do
  441.                 if val.parent == v.element then -- tab panel
  442.                     dxElements[key].visible = false
  443.                    
  444.                     if val.gui then
  445.                         guiSetVisible ( val.gui, false )
  446.                     end
  447.                    
  448.                     for kk, vv in pairs ( dxElements ) do
  449.                         if vv.parent == val.element then -- tab
  450.                             dxElements[kk].visible = false
  451.                            
  452.                             if vv.gui then
  453.                                 guiSetVisible ( vv.gui, false )
  454.                             end
  455.                            
  456.                             for kkk, vvv in pairs ( dxElements ) do
  457.                                 if vvv.parent == vv.element then -- body
  458.                                     dxElements[kkk].visible = false
  459.                                    
  460.                                     if vvv.gui then
  461.                                         guiSetVisible ( vvv.gui, false )
  462.                                     end
  463.                                    
  464.                                     for kkkk, vvvv in pairs ( dxElements ) do
  465.                                         if vvvv.parent == vvv.element then -- inner body
  466.                                             dxElements[kkkk].visible = false
  467.                                            
  468.                                             if vvvv.gui then
  469.                                                 guiSetVisible ( vvvv.gui, false )
  470.                                             end
  471.                                            
  472.                                         end
  473.                                     end
  474.                                    
  475.                                 end
  476.                             end
  477.                            
  478.                         end
  479.                     end
  480.                    
  481.                     --[[
  482.                         if getElementType ( val.element ) == "dx_tabpanel" then
  483.                             for kaka, vava in pairs ( dxElements ) do
  484.                                 if vava.parent == val.element and vava.gui then
  485.                                     dxElements[kaka].visible = false
  486.                                     guiSetVisible ( vava.gui, false )
  487.                                     for keykey, valval in pairs ( dxElements ) do
  488.                                         if valval.parent == vava.element and valval.gui then
  489.                                             dxElements[keykey].visible = false
  490.                                             guiSetVisible ( valval.gui, false )
  491.                                         end
  492.                                     end
  493.                                 end
  494.                             end
  495.                         end
  496.                     --]]
  497.                 end
  498.             end
  499.         end
  500.        
  501.     end
  502. end
  503.  
  504. function dxActivateFirstTab ( panel )
  505.     for k, v in pairs ( dxElements ) do
  506.         if v.parent == panel then
  507.             triggerEvent ( "onClientGUIClick", v.gui, "left", "notup" )
  508.             break
  509.         end
  510.     end
  511. end
  512.  
  513. function dxTabGetPreviousWidth ( panel )
  514.     local width = 5
  515.     for k, v in pairs ( dxElements ) do
  516.         if v.parent == panel then
  517.             width = width + v.bw + 5
  518.         end
  519.     end
  520.     return width
  521. end
  522.  
  523. function dxTabMouseEnter ()
  524.     local key = dxGetElementKeyFromGUI ( source )
  525.     --if not dxdxIsElementVisible ( dxElements[key].element ) then return end
  526.     if dxElements[key].active then return end
  527.     dxElements[key].color = tocolor(150,150,150,255)--tocolor(95,160,255,255)--tocolor(110,165,255,255)--tocolor(70,163,255,255)
  528. end
  529.  
  530. function dxTabMouseLeave ()
  531.     local key = dxGetElementKeyFromGUI ( source )
  532.     --if not dxdxIsElementVisible ( dxElements[key].element ) then return end
  533.     if dxElements[key].active then return end
  534.     dxElements[key].color = tocolor(140,140,140,255)--tocolor(95,160,255,255)--tocolor(51,153,255,255)
  535. end
  536.  
  537. function dxTabMouseClick ( button, state )
  538.     if button ~= "left" then return end
  539.     -- play the sound
  540.     local key = dxGetElementKeyFromGUI ( source )
  541.     --if state == "up" and not dxdxIsElementVisible ( dxElements[key].element ) then return end
  542.     dxClearTabs ( dxElements[key].parent )
  543.  
  544.     dxElements[key].active = true
  545.     dxElements[key].color = tocolor(100,100,100,255)--tocolor(10,100,225,255)--tocolor(0,100,225,255)
  546.    
  547.     if not dxElements[key].visible then return end
  548.    
  549.     for k, v in pairs ( dxElements ) do
  550.         if v.parent == dxElements[key].element then -- tab panel
  551.             dxElements[k].visible = true
  552.            
  553.             if v.gui then
  554.                 guiSetVisible ( v.gui, true )
  555.             end
  556.                    
  557.                     for kk, vv in pairs ( dxElements ) do
  558.                         if vv.parent == v.element then -- tab
  559.                             dxElements[kk].visible = true
  560.                            
  561.                             if vv.gui then
  562.                                 guiSetVisible ( vv.gui, true )
  563.                             end
  564.                            
  565.                             if getElementType ( vv.element ) == "dx_tab" then
  566.                                 if vv.active then
  567.                                     for kkk, vvv in pairs ( dxElements ) do
  568.                                         if vvv.parent == vv.element then
  569.                                             dxElements[kkk].visible = true
  570.                                            
  571.                                             if vvv.gui then
  572.                                                 guiSetVisible ( vvv.gui, true )
  573.                                             end
  574.                                            
  575.                                             for kkkk, vvvv in pairs ( dxElements ) do
  576.                                                 if vvvv.parent == vvv.element then
  577.                                                     dxElements[kkkk].visible = true
  578.                                                    
  579.                                                     if vvvv.gui then
  580.                                                         guiSetVisible ( vvvv.gui, true )
  581.                                                     end
  582.                                                    
  583.                                                 end
  584.                                             end
  585.                                        
  586.                                         end
  587.                                     end
  588.                                 end
  589.                             else
  590.                                 for kkk, vvv in pairs ( dxElements ) do
  591.                                     if vvv.parent == vv.element then
  592.                                         dxElements[kkk].visible = true
  593.                                        
  594.                                         if vvv.gui then
  595.                                             guiSetVisible ( vvv.gui, true )
  596.                                         end
  597.                                        
  598.                                         for kkkk, vvvv in pairs ( dxElements ) do
  599.                                             if vvvv.parent == vvv.element then
  600.                                                 dxElements[kkkk].visible = true
  601.                                                    
  602.                                                 if vvvv.gui then
  603.                                                     guiSetVisible ( vvvv.gui, true )
  604.                                                 end
  605.                                                    
  606.                                             end
  607.                                         end
  608.                                    
  609.                                     end
  610.                                 end
  611.                             end
  612.                            
  613.                         end
  614.                     end
  615.            
  616.             --[[
  617.                 if getElementType ( v.element ) == "dx_tabpanel" then
  618.                     for kaka, vava in pairs ( dxElements ) do
  619.                         if vava.parent == v.element and vava.gui then
  620.                             dxElements[kaka].visible = true
  621.                             guiSetVisible ( vava.gui, true )
  622.                             for keykey, valval in pairs ( dxElements ) do
  623.                                 if valval.parent == vava.element and valval.gui and vava.active then
  624.                                     dxElements[keykey].visible = true
  625.                                     guiSetVisible ( valval.gui, true )
  626.                                 end
  627.                             end
  628.                         end
  629.                     end
  630.                 end
  631.                 --]]
  632.                
  633.         end
  634.     end
  635. end
  636.  
  637. function dxTabSetTitle ( tab, title )
  638.     for key, val in pairs ( dxElements ) do
  639.         if val.element == tab then
  640.             dxElements[key].title = title
  641.             break
  642.         end
  643.     end
  644. end
  645.  
  646. -- ------------
  647. -- CheckBox functions
  648.  
  649. function dxCheckBoxClick ( button, state )
  650.     if button ~= "left" then return end
  651.     local key = dxGetElementKeyFromGUI ( source )
  652.     dxElements[key].ticked = not dxElements[key].ticked
  653.     triggerEvent ( "onDxCheckBoxChange", dxElements[key].element, dxElements[key].ticked )
  654. end
  655.  
  656. function dxCheckBoxSetTicked ( element, boolean )
  657.     for k, v in pairs ( dxElements ) do
  658.         if v.element and v.element == element then
  659.             dxElements[k].ticked = boolean
  660.         end
  661.     end
  662. end
  663.  
  664. function dxCheckBoxIsTicked ( element )
  665.     for k, v in pairs ( dxElements ) do
  666.         if v.element and v.element == element then
  667.             return v.ticked
  668.         end
  669.     end
  670.     return false
  671. end
  672.  
  673. -- ------------
  674. -- RadioButton functions
  675.  
  676. function dxRadioButtonClick ( button, state )
  677.     if button ~= "left" then return end
  678.     local key = dxGetElementKeyFromGUI ( source )
  679.     if dxElements[key].parent then dxRadioButtonClearAll ( dxElements[key].parent ) end
  680.     dxElements[key].ticked = not dxElements[key].ticked
  681.     triggerEvent ( "onDxRadioButtonChange", dxElements[key].element, dxElements[key].ticked )
  682. end
  683.  
  684. function dxRadioButtonSetTicked ( element, boolean )
  685.     for k, v in pairs ( dxElements ) do
  686.         if v.element and v.element == element then
  687.             dxRadioButtonClearAll ( v.parent )
  688.             dxElements[k].ticked = boolean
  689.             break
  690.         end
  691.     end
  692. end
  693.  
  694. function dxRadioButtonClearAll ( parent )
  695.     for k, v in pairs ( dxElements ) do
  696.         if v.parent == parent and getElementType ( v.element ) == "dx_radiobutton" then
  697.             dxElements[k].ticked = false
  698.         end
  699.     end
  700. end
  701.  
  702. function dxRadioButtonIsTicked ( element )
  703.     for k, v in pairs ( dxElements ) do
  704.         if v.element and v.element == element then
  705.             return v.ticked
  706.         end
  707.     end
  708.     return false
  709. end
  710.  
  711. -- ------------
  712. -- GridList functions
  713.  
  714. function dxGridListAddColumn ( gridlist, title, w, noCC )
  715.     local key = dxGetKeyFromElement ( gridlist )
  716.     if noCC then noCC = nil else noCC = true end
  717.     if dxElements[key].children.columns then
  718.         table.insert ( dxElements[key].children.columns, {title = tostring(title), w = w, cc = noCC} )
  719.     else
  720.         dxElements[key].children.columns = {{title = tostring(title), w = w, cc = noCC}}
  721.     end
  722.     return #dxElements[key].children.columns
  723. end
  724.  
  725. function dxGridListAddRow ( gridlist, text )
  726.     local key = dxGetKeyFromElement ( gridlist )
  727.     table.insert ( dxElements[key].children, {tostring(text)} )
  728.     -- calculate sight
  729.     if #dxElements[key].children*15 > dxElements[key].bh then
  730.         dxElements[key].onSight = dxElements[key].bh/15
  731.         local invisibleRows = #dxElements[key].children-dxElements[key].onSight
  732.         local maxHeight = dxElements[key].bh - 15/2
  733.         local minHeight = 30
  734.         local difference = maxHeight-minHeight
  735.         local maxInvisibleRows = 60
  736.         local height = maxHeight - (difference*math.min(invisibleRows,maxInvisibleRows)/maxInvisibleRows)
  737.         dxElements[key].slider = {pos = dxElements[key].by, h = height, invRowsHeight = invisibleRows*15}
  738.         dxElements[key].bk = 0
  739.         -- other alternative:
  740.         -- take 0.5 from by-20 until there's no more rows or it reaches 30
  741.     end
  742.     return #dxElements[key].children
  743. end
  744.  
  745. function dxGridListClear ( gridlist )
  746.     local key = dxGetKeyFromElement ( gridlist )
  747.     dxElements[key].slider = nil
  748.     dxElements[key].children = { columns = dxElements[key].children.columns }
  749.     dxElements[key].bk = nil
  750.     dxElements[key].onSight = nil
  751. end
  752.  
  753. function dxGridListEnter ()
  754.     dxGridListHandleHoverOnPosition ( source, x, y )
  755. end
  756.  
  757. function dxGridListLeave ()
  758.     -- clean hovers
  759.     dxGridListClearHoveredRows ( dxGetElementKeyFromGUI ( source ) )
  760. end
  761.  
  762. function dxGridListMove ( x, y )
  763.     dxGridListHandleHoverOnPosition ( source, x, y )
  764. end
  765.  
  766. function dxGridListClick ( button, state, x, y )
  767.     if button ~= "left" then return end
  768.     dxGridListHandleClickOnPosition ( source, x, y )
  769. end
  770.  
  771. function dxGridListBlur ()
  772.     dxGridListClearHoveredRows ( dxGetElementKeyFromGUI ( source ) )
  773. end
  774.  
  775. function dxGridListHandleHoverOnPosition ( gui, x, y )
  776.     local k = dxGetElementKeyFromGUI ( gui )
  777.     --if not dxdxIsElementVisible ( dxElements[k].element ) then return end
  778.     local v = dxElements[k]
  779.    
  780.     -- clean hovers
  781.     dxGridListClearHoveredRows ( k )
  782.    
  783.     local baseWidth =v.w
  784.    
  785.     if v.slider then -- to be handled in onClientCursorMove
  786.         -- adjust the body's width
  787.         baseWidth = baseWidth-15
  788.     end
  789.  
  790.     local baseKey = v.bk or 0 --v.tk or #v.children
  791.  
  792.     -- rows
  793.     local entry = 0
  794.     for key = baseKey+1, (v.onSight and baseKey+v.onSight or #v.children) do
  795.        
  796.         -- background
  797.         if not v.children[key].selected and not v.children[key].hovered then
  798.             if dxIsPointOnTopOfArea ( x, y, v.x, v.by+entry*15, baseWidth, 15 ) then
  799.                 v.children[key].hovered = true
  800.                 -- since the cursor can't be pointing at two element at a time there's no point in carrying on
  801.                 return
  802.             end
  803.         end
  804.  
  805.         entry = entry + 1
  806.  
  807.     end
  808. end
  809.  
  810. function dxGridListHandleClickOnPosition ( gui, x, y )
  811.     local k = dxGetElementKeyFromGUI ( gui )
  812.     --if not dxdxIsElementVisible ( dxElements[k].element ) then return end
  813.     local v = dxElements[k]
  814.    
  815.     if not v.clickable then return end
  816.    
  817.     local row = dxGridListGetSelectedRow ( v.element )
  818.     -- clean hovers
  819.     dxGridListClearHoveredRows ( k, true )
  820.    
  821.     local baseWidth =v.w
  822.    
  823.     if v.slider then -- to be handled in onClientCursorMove
  824.         -- adjust the body's width
  825.         baseWidth = baseWidth-15
  826.     end
  827.  
  828.     local baseKey = v.bk or 0 --v.tk or #v.children
  829.  
  830.     -- rows
  831.     local entry = 0
  832.     for key = baseKey+1, (v.onSight and baseKey+v.onSight or #v.children) do
  833.        
  834.         -- background
  835.         if not v.children[key].selected then
  836.             if dxIsPointOnTopOfArea ( x, y, v.x, v.by+entry*15, baseWidth, 15 ) then
  837.                 v.children[key].selected = true
  838.                 triggerEvent ( "onClientDxGridListSelect", v.element, key )
  839.                 if row and row == key then
  840.                     triggerEvent ( "onClientDxGridListDoubleClick", v.element, key ) -- sort of
  841.                 end
  842.                 -- since the cursor can't be pointing at two element at a time there's no point in carrying on
  843.                 return
  844.             end
  845.         end
  846.  
  847.         entry = entry + 1
  848.  
  849.     end
  850. end
  851.  
  852. function dxGridListMouseWheel ( up )
  853.    
  854.     local key = dxGetElementKeyFromGUI ( source )
  855.     if not dxElements[key].slider then return end
  856.        
  857.     local push = math.floor (10*math.min(dxElements[key].slider.invRowsHeight/15, 60)/60)
  858.    
  859.     if up == 1 then -- up
  860.         dxElements[key].bk = math.max ( 0, dxElements[key].bk-push )
  861.     else -- down
  862.         dxElements[key].bk = math.min ( dxElements[key].slider.invRowsHeight/15, dxElements[key].bk+push )
  863.     end
  864.    
  865.     dxElements[key].slider.pos = dxElements[key].by + dxElements[key].bk*(dxElements[key].bh-dxElements[key].slider.h)/(dxElements[key].slider.invRowsHeight/15)
  866.    
  867.     --dxGridListHandleHoveringOnPosition ( dxElements[key].gui, getCursorPosition () )
  868.  
  869. end
  870.  
  871. function dxGridListClearHoveredRows ( key, selected )
  872.     if selected then
  873.         triggerEvent ( "onClientDxGridListDeselect", dxElements[key].element )
  874.     end
  875.     for k = 1, #dxElements[key].children do
  876.         dxElements[key].children[k].hovered = nil
  877.         if selected then
  878.             dxElements[key].children[k].selected = nil
  879.         end
  880.     end
  881. end
  882.  
  883. function dxGridListDown ( button, x, y )
  884.     if button ~= "left" then return end
  885.  
  886.     local key = dxGetElementKeyFromGUI ( source )
  887.    
  888.     if dxElements[key].slider and dxIsPointOnTopOfArea ( x, y, dxElements[key].x+dxElements[key].w-15, dxElements[key].slider.pos, 15, dxElements[key].slider.h ) then
  889.         dxElements[key].slider.active = { difToTop = y - dxElements[key].slider.pos, difToBot = dxElements[key].slider.pos + dxElements[key].slider.h - y }
  890.     end
  891. end
  892.  
  893. function dxGridListSelectRow ( gridlist, row )
  894.     for key, val in pairs ( dxElements ) do
  895.         if val.element == gridlist then
  896.              dxElements[key].children[row].selected = true
  897.              triggerEvent ( "onClientDxGridListSelect", val.element, row )
  898.             break
  899.         end
  900.     end
  901. end
  902.  
  903. function dxGridListGetSelectedRow ( gridlist )
  904.     for key, val in pairs ( dxElements ) do
  905.         if val.element == gridlist then
  906.             for k, v in pairs ( val.children ) do
  907.                 if v.selected then
  908.                     return k
  909.                 end
  910.             end
  911.         end
  912.     end
  913.     return false
  914. end
  915.  
  916. function dxGridListSetRowText ( gridlist, row, column, text )
  917.     local key = dxGetKeyFromElement ( gridlist )
  918.     dxElements[key].children[row][column] = tostring(text)
  919. end
  920.  
  921. function dxGridListGetRowText ( gridlist, column, row )
  922.     local key = dxGetKeyFromElement ( gridlist )
  923.     return dxElements[key].children[row][column]
  924. end
  925.  
  926. function dxGridListSetRowData ( gridlist, row, data )
  927.     local key = dxGetKeyFromElement ( gridlist )
  928.     dxElements[key].children[row].data = data
  929. end
  930.  
  931. function dxGridListGetRowData ( gridlist, row )
  932.     local key = dxGetKeyFromElement ( gridlist )
  933.     return dxElements[key].children[row].data
  934. end
  935.  
  936. -- ------------
  937. -- ScrollBar functions
  938.  
  939. function dxScrollBarDown ( button, x, y )
  940.     if button ~= "left" then return end
  941.    
  942.     local key = dxGetElementKeyFromGUI ( source )
  943.    
  944.     if dxElements[key].pos == "horizontal" then
  945.         if dxIsPointOnTopOfArea ( x, y, dxElements[key].p, dxElements[key].y, 30, 15 ) then
  946.             dxElements[key].active = {disLeft = x - dxElements[key].p, disRight = dxElements[key].p+30-x}
  947.         end
  948.     else
  949.         if dxIsPointOnTopOfArea ( x, y, dxElements[key].x, dxElements[key].p, 15, 30 ) then
  950.             dxElements[key].active = {disTop = y - dxElements[key].p, disBot = dxElements[key].p+30-y}
  951.         end
  952.     end
  953. end
  954.  
  955. function dxScrollBarSetPosition ( element, percentage )
  956.     local key = dxGetKeyFromElement ( element )
  957.     dxElements[key].p = (percentage*dxElements[key].range/100) + dxElements[key].maxPos-dxElements[key].range
  958. end
  959.  
  960. function dxScrollBarGetPosition ( element )
  961.     local key = dxGetKeyFromElement ( element )
  962.     return 100-(100*(dxElements[key].maxPos-dxElements[key].p)/dxElements[key].range)
  963. end
  964.  
  965. -- ------------
  966. -- Rectangle functions
  967.  
  968. function dxRectangleSetColor ( element, color )
  969.     dxElements[dxGetKeyFromElement (element)].color = color
  970. end
  971.  
  972. function dxRectangleGetColor ( element ) -- doesnt work
  973.     return getColorFromString ( "#"..DEC_HEX ( math.abs (dxElements[dxGetKeyFromElement (element)].color) ) )
  974. end
  975.  
  976. -- havent added this one to the original DX!!!
  977. function dxRectangleSetWidth ( element, width )
  978.     dxElements[dxGetKeyFromElement (element)].w = width
  979. end
  980.  
  981. -- ------------
  982. -- Image functions
  983.  
  984. function dxImageChangeImage ( element, path )
  985.     for key, val in pairs ( dxElements ) do
  986.         if val.element == element then
  987.             dxElements[key].path = path
  988.             break
  989.         end
  990.     end
  991. end
  992.  
  993. function dxImageMouseEnter ( x, y )
  994.     local key = dxGetElementKeyFromGUI ( source )
  995.     triggerEvent ( "onDxImageMouseEnter", dxElements[key].element, x, y )
  996. end
  997.  
  998. function dxImageMouseLeave ()
  999.     local key = dxGetElementKeyFromGUI ( source )
  1000.     triggerEvent ( "onDxImageMouseLeave", dxElements[key].element )
  1001. end
  1002.  
  1003. function dxImageMouseMove ( x, y )
  1004.     local key = dxGetElementKeyFromGUI ( source )
  1005.     triggerEvent ( "onDxImageMouseMove", dxElements[key].element, x, y )
  1006. end
  1007.  
  1008. function dxImageMouseDown ( button, x, y )
  1009.     if button ~= "left" then return end
  1010.     local key = dxGetElementKeyFromGUI ( source )
  1011.     triggerEvent ( "onDxImageMouseDown", dxElements[key].element, x, y )
  1012. end
  1013.  
  1014. function dxImageMouseUp ( button )
  1015.     if button ~= "left" then return end
  1016.     local key = dxGetElementKeyFromGUI ( source )
  1017.     triggerEvent ( "onDxImageMouseUp", dxElements[key].element )
  1018. end
  1019.  
  1020. -- ------------
  1021. -- General purpose
  1022.  
  1023. function dxMouseUp ( button, state )
  1024.    
  1025.     --guiMoveToBack ( source )
  1026.    
  1027.     if button ~= "left" or state ~= "up" or #dxElements == 0 then return end
  1028.    
  1029.     for k, v in pairs ( dxElements ) do
  1030.        
  1031.         if v.visible and isElement ( v.element ) then
  1032.            
  1033.             local type = getElementType ( v.element )
  1034.            
  1035.             if type == "dx_gridlist" then
  1036.                 -- gridlist slider
  1037.                 if v.slider and v.slider.active then
  1038.                     v.slider.active = nil
  1039.                 end
  1040.             elseif type == "dx_scrollbar" then
  1041.                 v.active = nil
  1042.             end
  1043.            
  1044.         end
  1045.     end
  1046.    
  1047. end
  1048. addEventHandler ( "onClientClick", getRootElement (), dxMouseUp )
  1049.  
  1050. function dxGuiFocus ()
  1051.     local key = dxGetElementKeyFromGUI ( source )
  1052.     dxElements[key].focus = true
  1053.     triggerEvent ( "onDxEditFocus", dxElements[key].element )
  1054. end
  1055.  
  1056. function dxGuiBlur ()
  1057.     local key = dxGetElementKeyFromGUI ( source )
  1058.     dxElements[key].focus = false
  1059. end
  1060.  
  1061. -- ------------
  1062. -- Set/Get/Is functions
  1063.  
  1064. function dxSetAlpha ( element, alpha )
  1065.     for k, v in pairs ( dxElements ) do
  1066.         if v.element and v.element == element then
  1067.             dxElements[k].alpha = alpha
  1068.         end
  1069.     end
  1070. end
  1071.  
  1072. function dxGetElementPosition ( element )
  1073.     for k, v in pairs ( dxElements ) do
  1074.         if v.element and v.element == element then
  1075.             return v.x, v.y
  1076.         end
  1077.     end
  1078.     return 0, 0
  1079. end
  1080.  
  1081. function dxGetElementSize ( element )
  1082.     for k, v in pairs ( dxElements ) do
  1083.         if v.element and v.element == element then
  1084.             return v.w, v.h
  1085.         end
  1086.     end
  1087.     return 0, 0
  1088. end
  1089.  
  1090. function dxGetElementFromGUI ( gui )
  1091.     for k, v in pairs ( dxElements )  do
  1092.         if v.gui and v.gui == gui then
  1093.             return v.element
  1094.         end
  1095.     end
  1096.     return nil
  1097. end
  1098.  
  1099. function dxGetElementKeyFromGUI ( gui )
  1100.     for k, v in pairs ( dxElements )  do
  1101.         if v.gui and v.gui == gui then
  1102.             return k
  1103.         end
  1104.     end
  1105.     return nil
  1106. end
  1107.  
  1108. function dxGetKeyFromElement ( element )
  1109.     for k, v in pairs ( dxElements ) do
  1110.         if v.element == element then
  1111.             return k
  1112.         end
  1113.     end
  1114.     return nil
  1115. end
  1116.  
  1117. function dxSetVisible ( element, value )
  1118.     for k, v in pairs ( dxElements ) do
  1119.    
  1120.         if v.element == element then -- tab
  1121.        
  1122.             dxElements[k].visible = value
  1123.            
  1124.             for key, val in pairs ( dxElements ) do
  1125.                 if val.parent == v.element then -- tab panel
  1126.                     dxElements[key].visible = value
  1127.                    
  1128.                     if val.gui then
  1129.                         guiSetVisible ( val.gui, value )
  1130.                     end
  1131.                    
  1132.                     for kk, vv in pairs ( dxElements ) do
  1133.                         if vv.parent == val.element then -- tab
  1134.                             dxElements[kk].visible = value
  1135.                            
  1136.                             if vv.gui then
  1137.                                 guiSetVisible ( vv.gui, value )
  1138.                             end
  1139.                            
  1140.                             for kkk, vvv in pairs ( dxElements ) do
  1141.                                 if vvv.parent == vv.element then -- body
  1142.                                     dxElements[kkk].visible = value
  1143.                                    
  1144.                                     if vvv.gui then
  1145.                                         guiSetVisible ( vvv.gui, value )
  1146.                                     end
  1147.                                    
  1148.                                     for kkkk, vvvv in pairs ( dxElements ) do
  1149.                                         if vvvv.parent == vvv.element then -- inner body
  1150.                                             dxElements[kkkk].visible = value
  1151.                                            
  1152.                                             if vvvv.gui then
  1153.                                                 guiSetVisible ( vvvv.gui, value )
  1154.                                             end
  1155.                                            
  1156.                                         end
  1157.                                     end
  1158.                                    
  1159.                                 end
  1160.                             end
  1161.                            
  1162.                         end
  1163.                     end
  1164.                 end
  1165.             end
  1166.         end
  1167.        
  1168.     end
  1169. end
  1170.  
  1171. function dxIsElementVisible ( element )
  1172.     for key, value in pairs ( dxElements ) do
  1173.         if value.element == element then
  1174.             local type = getElementType ( value.element )
  1175.             if type == "dx_tab" then
  1176.                 --if value.active then return value.visible end
  1177.                 --return false
  1178.                 return (value.visible and value.active)
  1179.             end
  1180.             return value.visible
  1181.         end
  1182.     end
  1183. end
  1184.  
  1185. function dxIsCursorOnTopOfArea ( x, y, w, h )
  1186.     -- assuming the cursor is showing
  1187.     local cx, cy = getCursorPosition ()
  1188.     cx, cy = x*cx, cy*y
  1189.     if cx >= x and cx <= x+w and cy >= y and cy <= y+h then return true end
  1190.     return false
  1191. end
  1192.  
  1193. function dxIsPointOnTopOfArea ( a, b, x, y, w, h )
  1194.     if a and b and x and y and w and h then
  1195.         if a >= x and a <= x+w and b >= y and b <= y+h then return true end
  1196.     end
  1197.     return false
  1198. end
  1199.  
  1200. function DEC_HEX(IN)
  1201.     local B,K,OUT,D=16,"0123456789ABCDEF",""
  1202.     while IN>0 do
  1203.         IN,D=math.floor(IN/B),math.mod(IN,B)+1
  1204.         OUT=string.sub(K,D,D)..OUT
  1205.     end
  1206.     return OUT
  1207. end
  1208.  
  1209. -- ------------
  1210. -- Drawing
  1211.  
  1212. function dxDrawElements ()
  1213.     local removeOne
  1214.     for k, v in pairs ( dxElements ) do
  1215.         -- check if  the element and its parent are visible
  1216.         if not v.element or not isElement ( v.element ) then
  1217.             removeOne = k
  1218.         else
  1219.            
  1220.             if v.visible then --dxdxIsElementVisible ( v.element ) then
  1221.                 -- assuming v.element is an element
  1222.                 local type = getElementType ( v.element )
  1223.                 if type == "dx_window" then
  1224.                
  1225.                     local posX, posY = v.x, v.y
  1226.                     local w, h = v.w, v.h
  1227.                     if v.border then
  1228.                         local borderColor = tocolor(16,16,16,255)
  1229.                         -- top
  1230.                         dxDrawRectangle ( posX, posY, w, 2, borderColor, true )
  1231.                         -- left
  1232.                         dxDrawRectangle ( posX, posY+2, 2, h-2, borderColor, true )
  1233.                         -- bot
  1234.                         dxDrawRectangle ( posX+2, posY+h-2, w-2, 2, borderColor, true )
  1235.                         -- right
  1236.                         dxDrawRectangle ( posX+w-2, posY+2, 2, h-4, borderColor, true )
  1237.                        
  1238.                         posX, posY, w, h = posX+2, posY+2, w-4, h-4
  1239.                     end
  1240.                    
  1241.                     -- head
  1242.                         dxDrawRectangle ( posX, posY, w, 30, v.hc or tocolor(20,25,35,255), true )
  1243.                         -- text
  1244.                         dxDrawText ( v.title, posX, posY, posX+w, posY+30, tocolor(255,255,255,255), 1, "default-bold", "center", "center", true, false, true )
  1245.                        
  1246.                     -- main
  1247.                         dxDrawRectangle ( posX, posY+30, w, h-30, v.mc or tocolor(35,40,50,255), true )
  1248.                    
  1249.                 elseif type == "dx_label" then
  1250.                    
  1251.                     dxDrawText ( getStringWithoutColorCode(v.text), v.x+1, v.y+1, v.w+1, v.h+1, tocolor(0,0,0,v.alpha or 255), v.fontH or 1, v.font or "default", v.hor or "left", v.ver or "top", true, false, true, v.cc )
  1252.                     dxDrawText ( v.text, v.x, v.y, v.w, v.h, tocolor(255,255,255,v.alpha or 255), v.fontH or 1, v.font or "default", v.hor or "left", v.ver or "top", true, false, true, v.cc )
  1253.                    
  1254.                 elseif type == "dx_button" then
  1255.  
  1256.                     dxDrawRectangle ( v.x+1, v.y+1, v.w, v.h, tocolor(0,0,0,255), true )
  1257.                     dxDrawRectangle ( v.x, v.y, v.w, v.h, v.color or tocolor(95,160,255,255), true )
  1258.                     dxDrawText ( v.text, v.x+1, v.y+1, v.x+v.w+1, v.y+v.h+1, tocolor(0,0,0,255), 1, "default-bold", "center", "center", true, false, true )
  1259.                     dxDrawText ( v.text, v.x, v.y, v.x+v.w, v.y+v.h, tocolor(255,255,255,255), 1, "default-bold", "center", "center", true, false, true )
  1260.                    
  1261.                 elseif type == "dx_edit" then
  1262.                    
  1263.                     dxDrawRectangle ( v.x, v.y, v.w, v.h, tocolor(223,223,223,255), true )
  1264.                     --dxDrawRectangle ( v.x, v.y, v.w, 1, tocolor(0,0,0,128), true )
  1265.                     --dxDrawRectangle ( v.x, v.y+1, 1, v.h-1, tocolor(0,0,0,128), true )
  1266.                    
  1267.                     local text = v.masked and string.rep ( "*", #guiGetText ( v.gui ) ) or guiGetText ( v.gui )
  1268.                    
  1269.                     if v.focus then
  1270.                         local index = guiEditGetCaretIndex ( v.gui )
  1271.                         text = string.sub ( text, 0, index ).."▌"..string.sub ( text, index+1 )
  1272.                         --text = text.."▎"
  1273.                     end
  1274.                     --while (getTextExtent ( text )) >= v.w-10 do
  1275.                     while (dxGetTextWidth ( text, 1, "default" )) >= v.w-8 do
  1276.                         text = string.sub ( text, 2, #text )
  1277.                     end
  1278.                     dxDrawText ( text, v.x+5, v.y+2, v.x+v.w-5, v.y+v.h, tocolor(0,0,0,255), 1, "default", "left", "center", true, false, true )
  1279.                    
  1280.                 elseif type == "dx_tabpanel" then
  1281.                    
  1282.                     dxDrawRectangle ( v.x, v.y, v.w, 30, tocolor(20,25,35,64), true )
  1283.                    
  1284.                     if v.color then
  1285.                         dxDrawRectangle ( v.x, v.y+30, v.w, v.h-30, v.color, true )
  1286.                     end
  1287.                    
  1288.                 elseif type == "dx_tab" then
  1289.                    
  1290.                     dxDrawRectangle ( v.bx+1, v.y+1, v.bw, 25, tocolor(0,0,0,255), true )
  1291.                     dxDrawRectangle ( v.bx, v.y, v.bw, 25, v.color or tocolor(135,135,135,255), true ) -- tocolor(95,160,255,255) tocolor(51,153,255,255)
  1292.                    
  1293.                     dxDrawText ( v.title, v.bx+1, v.y+1, v.bx+v.bw+1, v.y+24, tocolor(0,0,0,255), 1, "default-bold", "center", "center", true, false, true )
  1294.                     dxDrawText ( v.title, v.bx, v.y, v.bx+v.bw, v.y+23, tocolor(255,255,255,255), 1, "default-bold", "center", "center", true, false, true )
  1295.                    
  1296.                 elseif type == "dx_checkbox" then
  1297.                    
  1298.                     -- border
  1299.                     dxDrawRectangle ( v.x, v.y, 15, 1, tocolor(67,205,243,255), true )
  1300.                     dxDrawRectangle ( v.x, v.y+1, 1, 14, tocolor(67,205,243,255), true )
  1301.                     dxDrawRectangle ( v.x+1, v.y+14, 14, 1, tocolor(67,205,243,255), true )
  1302.                     dxDrawRectangle ( v.x+14, v.y+1, 1, 13, tocolor(67,205,243,255), true )
  1303.  
  1304.                     dxDrawRectangle ( v.x+1, v.y+1, 13, 13, tocolor(223,223,223,255), true )
  1305.                    
  1306.                     dxDrawText ( v.text, v.x+21, v.y+1, v.x+21+v.tw, v.y+16, tocolor (0,0,0,255), 1, "default", "left", "top", true, false, true )
  1307.                     dxDrawText ( v.text, v.x+20, v.y, v.x+20+v.tw, v.y+15, tocolor (255,255,255,255), 1, "default", "left", "top", true, false, true )
  1308.                    
  1309.                     if v.ticked then
  1310.                         --dxDrawRectangle ( v.x+2, v.y+2, 11, 11, tocolor(50,50,50,255), true )
  1311.                         --dxDrawText ( "✖", v.x, v.y, v.x+13, v.y+13, tocolor(0,0,0,255), 1, "default", "center", "center", true, false, true )
  1312.                         dxDrawImage ( v.x+1, v.y+1, 13, 13, "images/gui/check.png", 0, 0, 0, tocolor(255,255,255,255), true )
  1313.                     end
  1314.                
  1315.                 elseif type == "dx_gridlist" then
  1316.                    
  1317.                     -- header
  1318.                     if v.children.columns then
  1319.                         -- header
  1320.                         dxDrawRectangle ( v.x, v.y, v.w, 20, v.headerColor or tocolor(95,160,255,255), true ) -- tocolor(50,150,255,255)
  1321.                        
  1322.                         local c = 0
  1323.                         for key, val in pairs ( v.children.columns ) do
  1324.                             dxDrawText ( val.title, v.x+6+c, v.y+3, v.x+c+val.w, v.y+20, tocolor(0,0,0,255), 1, "default-bold", "left", "top", true, false, true )
  1325.                             dxDrawText ( val.title, v.x+5+c, v.y+2, v.x+c+val.w, v.y+20, tocolor(255,255,255,255), 1, "default-bold", "left", "top", true, false, true )
  1326.                             c = c + val.w
  1327.                         end
  1328.                     end
  1329.                    
  1330.                     -- body
  1331.                     dxDrawRectangle ( v.x, v.by, v.w, v.bh, v.color or tocolor(35,45,85,64), true )
  1332.                    
  1333.                     local baseWidth = v.w
  1334.                     --if #v.children*15 > v.bh then
  1335.                     if v.slider then
  1336.                        
  1337.                         -- adjust the body's width
  1338.                         baseWidth = baseWidth-15
  1339.                        
  1340.                         -- check if the slider is being used
  1341.                         if v.slider.active then
  1342.                             -- calcs
  1343.                             local cx, cy = getCursorPosition ()
  1344.                             cx, cy = cx*x, cy*y
  1345.                             local bodyEnd = v.by+v.bh
  1346.                             local minCursorPos, maxCursorPos = cy <= v.by+v.slider.active.difToTop, cy >= bodyEnd - v.slider.active.difToBot
  1347.                            
  1348.                             if minCursorPos then
  1349.                                 dxElements[k].slider.pos = v.by
  1350.                             elseif maxCursorPos then
  1351.                                 dxElements[k].slider.pos = bodyEnd - v.slider.h
  1352.                             else
  1353.                                 dxElements[k].slider.pos = cy - v.slider.active.difToTop
  1354.                             end
  1355.                            
  1356.                             -- calculate v.bk
  1357.                             --dxElements[key].slider.pos = dxElements[key].by + dxElements[key].bk*(dxElements[key].bh-dxElements[key].slider.h)/(dxElements[key].slider.invRowsHeight/15)
  1358.                             -- inverted function
  1359.                             dxElements[k].bk = math.floor ((dxElements[k].slider.pos-dxElements[k].by)*dxElements[k].slider.invRowsHeight/15/(dxElements[k].bh-dxElements[k].slider.h))
  1360.                        
  1361.                         end
  1362.                        
  1363.                         dxDrawRectangle ( v.x+baseWidth, v.slider.pos, 15, v.slider.h, v.slider.color or tocolor(255,255,255,255), true )
  1364.                        
  1365.                     end
  1366.                    
  1367.                     local baseKey = v.bk or 0 --v.tk or #v.children
  1368.                    
  1369.                     -- rows
  1370.                     local entry = 0
  1371.                     for key = baseKey+1, (v.onSight and baseKey+v.onSight or #v.children) do
  1372.                        
  1373.                         -- background
  1374.                         if v.children[key].selected then
  1375.                             dxDrawRectangle ( v.x, v.by+entry*15, baseWidth, 15, v.childColor or tocolor (160,190,235,64), true )
  1376.                         elseif v.children[key].hovered then
  1377.                             dxDrawRectangle ( v.x, v.by+entry*15, baseWidth, 15, v.childColor or tocolor (160,190,235,32), true )
  1378.                         end
  1379.                        
  1380.                         -- text
  1381.                         local cx = v.x + 6
  1382.                         for ck = 1, #v.children.columns do
  1383.                             dxDrawText ( v.children.columns[ck].cc and getStringWithoutColorCode(v.children[key][ck] or "") or (v.children[key][ck] or ""), cx+1, v.by+(entry*15)+1, cx+v.children.columns[ck].w+1, v.by+((entry+1)*15)+1, tocolor(0,0,0,255), 1, v.font or "default", "left", "top", true, false, true, v.children.columns[ck].cc )
  1384.                             dxDrawText ( v.children[key][ck] or "", cx, v.by+(entry*15), cx+v.children.columns[ck].w, v.by+((entry+1)*15), tocolor(255,255,255,255), 1, v.font or "default", "left", "top", true, false, true, v.children.columns[ck].cc )
  1385.                             cx = cx + v.children.columns[ck].w
  1386.                         end
  1387.                        
  1388.                         entry = entry + 1
  1389.                        
  1390.                     end
  1391.                    
  1392.                    
  1393.                 elseif type == "dx_scrollbar" then
  1394.                    
  1395.                     if v.pos == "horizontal" then
  1396.                         if v.active then
  1397.                            
  1398.                             local cx, cy = getCursorPosition ()
  1399.                             cx, cy = cx*x, cy*y
  1400.                            
  1401.                             if cx <= v.x+v.active.disLeft then
  1402.                                 dxElements[k].p = v.x
  1403.                             elseif cx >= v.x+v.s-v.active.disRight then
  1404.                                 dxElements[k].p = v.x+v.range
  1405.                             else
  1406.                                 dxElements[k].p = cx-v.active.disLeft
  1407.                             end
  1408.                            
  1409.                         end
  1410.                        
  1411.                         -- background
  1412.                         dxDrawRectangle ( v.x, v.y, v.s, 15, v.color or tocolor(20,25,35,64), true )
  1413.                        
  1414.                         dxDrawRectangle ( v.p, v.y, 30, 15, tocolor(255,255,255,255), true )
  1415.                     else
  1416.                         if v.active then
  1417.                            
  1418.                             local cx, cy = getCursorPosition ()
  1419.                             cx, cy = cx*x, cy*y
  1420.                            
  1421.                             if cy <= v.y+v.active.disTop then
  1422.                                 dxElements[k].p = v.y
  1423.                             elseif cy >= v.y+v.s-v.active.disBot then
  1424.                                 dxElements[k].p = v.y+v.range
  1425.                             else
  1426.                                 dxElements[k].p = cy-v.active.disTop
  1427.                             end
  1428.                            
  1429.                         end
  1430.                        
  1431.                         -- background
  1432.                         dxDrawRectangle ( v.x, v.y, 15, v.s, v.color or tocolor(20,25,35,64), true )
  1433.                        
  1434.                         dxDrawRectangle ( v.x, v.p, 15, 30, tocolor(255,255,255,255), true )
  1435.                     end
  1436.                    
  1437.                 elseif type == "dx_radiobutton" then
  1438.                    
  1439.                     -- border
  1440.                    
  1441.                     dxDrawRectangle ( v.x, v.y, 15, 1, tocolor(67,205,243,255), true )
  1442.                     dxDrawRectangle ( v.x, v.y+1, 1, 14, tocolor(67,205,243,255), true )
  1443.                     dxDrawRectangle ( v.x+1, v.y+14, 14, 1, tocolor(67,205,243,255), true )
  1444.                     dxDrawRectangle ( v.x+14, v.y+1, 1, 13, tocolor(67,205,243,255), true )
  1445.                    
  1446.                    
  1447.                     dxDrawRectangle ( v.x+1, v.y+1, 13, 13, tocolor(223,223,223,255), true )
  1448.                    
  1449.                     dxDrawText ( v.text, v.x+20+1, v.y, v.x+20+v.tw+1, v.y+15, tocolor(0,0,0,255), 1, "default", "left", "top", true, false, true )
  1450.                     dxDrawText ( v.text, v.x+20, v.y-1, v.x+20+v.tw, v.y+14, tocolor(255,255,255,255), 1, "default", "left", "top", true, false, true )
  1451.                    
  1452.                     if v.ticked then
  1453.                         dxDrawText ( "●", v.x+3, v.y-5, v.x+30, v.y+30, tocolor(20,25,35,220), 1.4, "default", "left", "top", true, false, true )
  1454.                     end
  1455.                
  1456.                 elseif type == "dx_rectangle" then
  1457.                    
  1458.                     dxDrawRectangle ( v.x, v.y, v.w, v.h, v.color, true )          
  1459.                    
  1460.                 elseif type == "dx_image" then
  1461.                    
  1462.                     dxDrawImage ( v.x, v.y, v.w, v.h, v.path, 0, 0, 0, v.color or tocolor(255,255,255,255), true )
  1463.                    
  1464.                 end
  1465.                
  1466.             end
  1467.        
  1468.         end
  1469.     end
  1470.    
  1471.     if removeOne then
  1472.         table.remove ( dxElements, removeOne )
  1473.     end
  1474. end
  1475. addEventHandler ( "onClientRender", getRootElement (), dxDrawElements )
  1476.  
  1477. function getStringWithoutColorCode(s)
  1478.     return string.gsub(s,"#%x%x%x%x%x%x","")
  1479. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement