XaskeL

DXButton for DNaumov

May 9th, 2021 (edited)
267
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. -- Author: XaskeL
  2. -- Created at 09/05/2021
  3.  
  4. local table_getn = table.getn;
  5. local vecScreen  = Vector2(guiGetScreenSize());
  6.  
  7. local CDXButton  =
  8. {
  9.     m_aList      = { };
  10.    
  11.     Create       = function ( self, iX, iY, iWidth, iHeight, iColor, iAnimationTime, vHoverCallBack, vAnimationCallBack )
  12.         local pObject = setmetatable(
  13.         {
  14.             m_iX                    = iX;
  15.             m_iY                    = iY;
  16.             m_iWidth                = iWidth;
  17.             m_iHeight               = iHeight;
  18.             m_iColor                = iColor or 0xFFFFFFFF;
  19.             m_bShow                 = true;
  20.             m_bHover                = false;
  21.             m_bEnabled              = true;
  22.             m_iHoverTime            = 0;
  23.             m_iAnimationTime        = iAnimationTime or 0;
  24.             m_vHoverCallBack        = vHoverCallBack;
  25.             m_vAnimationCallBack    = vAnimationCallBack;
  26.         }, { __index = self } );
  27.    
  28.         table.insert( self.m_aList, pObject );
  29.        
  30.         return pObject;
  31.     end;
  32.    
  33.     SetShow     = function ( self, bState )
  34.         self.m_bShow = bState;
  35.        
  36.         return self;
  37.     end;
  38.    
  39.     SetHover    = function ( self, bState )
  40.         if ( self.m_bHover ~= bState ) then
  41.             self.m_iHoverTime = getTickCount( );
  42.            
  43.             self.m_bHover = bState;
  44.            
  45.             if ( self.m_vHoverCallBack ) then
  46.                 self:m_vHoverCallBack( bState );
  47.             end
  48.         end
  49.        
  50.         return self;
  51.     end;
  52.    
  53.     SetEnabled  = function ( self, bState )
  54.         self.m_bEnabled = bState;
  55.        
  56.         return self;
  57.     end;
  58.    
  59.     SetPosition = function ( self, iX, iY )
  60.         self.m_iX = iX;
  61.        
  62.         self.m_iY = iY;
  63.        
  64.         return self;
  65.     end;
  66.    
  67.     SetScale    = function ( self, iWidth, iHeight )
  68.         self.m_iWidth   = iWidth;
  69.        
  70.         self.m_iHeight  = iHeight;
  71.        
  72.         return self;
  73.     end;
  74.  
  75.     OnDraw      = function ( self )
  76.         local iTick = getTickCount( );
  77.  
  78.         for i = 1, table_getn( self.m_aList ) do
  79.             local pObject = self.m_aList[ i ];
  80.            
  81.             if ( pObject and pObject.m_bShow ) then
  82.                 dxDrawRectangle( pObject.m_iX, pObject.m_iY, pObject.m_iWidth, pObject.m_iHeight, pObject.m_iColor, false );
  83.  
  84.                 if ( pObject.m_vAnimationCallBack ) then
  85.                     local iElapsedTime  = iTick - pObject.m_iHoverTime;
  86.                     local fProgress     = math.min( iElapsedTime / pObject.m_iAnimationTime, pObject.m_iAnimationTime );
  87.                    
  88.                     if ( iElapsedTime < pObject.m_iAnimationTime ) then
  89.                         pObject:m_vAnimationCallBack( pObject.m_bHover, fProgress );
  90.                     end
  91.                 end
  92.             end
  93.         end
  94.     end;
  95. }; CDXButton.__call = CDXButton.Create;
  96.  
  97. setmetatable( CDXButton, CDXButton );
  98.  
  99. -- По хорошему это потом под базовый класс переписать
  100. -- И тупо наследоваться от него, потом описывать свои методы и прочее.
  101. -- Ну и попробовать написать циклы без самих циклов за счет цепочек в __index
  102. addEventHandler( "onClientRender", root, function ( )
  103.     CDXButton:OnDraw( );
  104. end );
  105.  
  106. addEventHandler( "onClientCursorMove", root, function ( fX, fY )
  107.     if ( not isCursorShowing ( ) ) then
  108.         return;
  109.     end
  110.  
  111.     fX = fX * vecScreen.x;
  112.     fY = fY * vecScreen.y;
  113.  
  114.     for i = table_getn( CDXButton.m_aList ), 1, -1 do
  115.         local pObject = CDXButton.m_aList[ i ];
  116.  
  117.         if ( fX >= pObject.m_iX and fY >= pObject.m_iY and fX <= pObject.m_iX + pObject.m_iWidth and fY <= pObject.m_iY + pObject.m_iHeight ) then
  118.             pObject:SetHover( true );
  119.         else
  120.             pObject:SetHover( false );
  121.         end
  122.     end
  123. end );
  124.  
  125. -- other
  126.  
  127. addEventHandler( "onClientResourceStart", resourceRoot, function ( )
  128.     local pObject = CDXButton( 256, 256, 64, 64, tocolor( 0, 255, 255, 255 ), 1000, function ( self, bState )
  129.         iprint( "hover set state to", bState, "at", self.m_iHoverTime );
  130.     end,
  131.    
  132.     function ( self, bState, fProgress )
  133.         dxDrawText( "progress: " .. fProgress .. "\n" .. self.m_iColor, 600, 600, 600, 600, tocolor( 0, 0, 0, 255), 2.0, "bankgothic" );
  134.         if ( bState ) then
  135.             self.m_iColor = tocolor( 255 * fProgress, 255, 255, 255 );
  136.         else
  137.             self.m_iColor = tocolor( 255 - ( 255 * fProgress), 255, 255, 255 );
  138.         end
  139.     end );
  140. end );
RAW Paste Data