new post | browse code | authors | help | about

LuaBin 2.0

Viewing file root / lua / vgui / SlideBar.lua

  1.  
  2. local PANEL = {}
  3.  
  4. /*---------------------------------------------------------
  5.    Name: Init
  6. ---------------------------------------------------------*/
  7. function PANEL:Init()
  8.  
  9.         self:SetEnabled( true )
  10.         self:SetScroll( 0 )
  11.         self:SetBarScale( 4 )
  12.        
  13.         self.Velocity = 0
  14.         self.HasChanged = true
  15.  
  16. end
  17.  
  18. /*---------------------------------------------------------
  19.    Name: SetEnabled
  20. ---------------------------------------------------------*/
  21. function PANEL:SetEnabled( b )
  22.        
  23.         self.Enabled = b       
  24.  
  25.         if ( !b ) then
  26.        
  27.                 self:SetScroll( 0 )
  28.                 self.HasChanged = true
  29.        
  30.         end
  31.        
  32.         self:SetMouseInputEnabled( b )
  33.        
  34. end
  35.  
  36.  
  37. /*---------------------------------------------------------
  38.    Name: SetScroll
  39. ---------------------------------------------------------*/
  40. function PANEL:SetScroll( _float_ )
  41.  
  42.         self.Pos = math.Clamp( _float_, 0, 1 )
  43. end
  44.  
  45. /*---------------------------------------------------------
  46.    Name: Value
  47. ---------------------------------------------------------*/
  48. function PANEL:Value()
  49.  
  50.         return self.Pos
  51.        
  52. end
  53.  
  54. /*---------------------------------------------------------
  55.    Name: SetPos
  56. ---------------------------------------------------------*/
  57. function PANEL:SetBarScale( _scale_ )
  58.  
  59.         self.BarScale = _scale_
  60.         self:SetEnabled( self.BarScale > 1 )
  61.                
  62. end
  63.  
  64. /*---------------------------------------------------------
  65.    Name: Rebuild
  66. ---------------------------------------------------------*/
  67. function PANEL:Rebuild( item )
  68.  
  69.         local Offset = 0
  70.        
  71.         if ( self.Horizontal ) then
  72.        
  73.                 local x, y = 0, 0;
  74.                 for k, panel in pairs( self.Items ) do
  75.                
  76.                         local w = panel:GetWide()
  77.                         local h = panel:GetTall()
  78.                        
  79.                         if ( x + w  > self:GetWide() ) then
  80.                        
  81.                                 x = 0
  82.                                 y = y + h + self.Spacing
  83.                        
  84.                         end
  85.                        
  86.                         panel:SetPos( x, y )
  87.                        
  88.                         x = x + w + self.Spacing
  89.                         Offset = y + h + self.Spacing
  90.                
  91.                 end
  92.        
  93.         else
  94.        
  95.                 for k, panel in pairs( self.Items ) do
  96.                
  97.                         panel:SetSize( self:GetCanvas():GetWide(), panel:GetTall() )
  98.                         panel:SetPos( 0, Offset )
  99.                         Offset = Offset + panel:GetTall() + self.Spacing
  100.                
  101.                 end
  102.                
  103.         end
  104.        
  105.         self:GetCanvas():SetSize( self:GetCanvas():GetWide(), Offset + self.Padding * 2 - self.Spacing )
  106.  
  107. end
  108.  
  109. /*---------------------------------------------------------
  110.    Name: OnMouseWheeled
  111. ---------------------------------------------------------*/
  112. function PANEL:OnMouseWheeled( dlta )
  113.  
  114.         if ( !self.Enabled ) then return end
  115.  
  116.         self:AddVelocity( dlta )
  117.         return true
  118.        
  119. end
  120.  
  121. /*---------------------------------------------------------
  122.    Name: AddVelocity
  123. ---------------------------------------------------------*/
  124. function PANEL:AddVelocity( vel )
  125.  
  126.         self.Velocity = self.Velocity + vel * -2
  127.        
  128. end
  129.  
  130. /*---------------------------------------------------------
  131.    Name: Changed
  132. ---------------------------------------------------------*/
  133. function PANEL:Changed()
  134.  
  135.         if ( self.HasChanged ) then
  136.                 self.HasChanged = nil
  137.                 return true
  138.         end
  139.        
  140.         return false
  141.        
  142. end
  143.  
  144. /*---------------------------------------------------------
  145.    Name: Changed
  146. ---------------------------------------------------------*/
  147. function PANEL:ScrollbarSize()
  148.  
  149.         return  self:GetTall() / self.BarScale
  150.        
  151. end
  152.  
  153. /*---------------------------------------------------------
  154.    Name: Think
  155. ---------------------------------------------------------*/
  156. function PANEL:Think()
  157.  
  158.         if ( self.Dragging ) then
  159.        
  160.                 // Accumulate Velocity
  161.                 local PixelDiff = (gui.MouseY() - self.StartDraggingPos) * self.DragDirection
  162.                 self.Velocity = (self.Velocity + PixelDiff ) / 2
  163.                
  164.                 // Scroll
  165.                 local Span = self:GetTall() - self:ScrollbarSize()
  166.                 self.Pos = self.Pos * Span + PixelDiff
  167.                 self:SetScroll( self.Pos / Span )
  168.                 self.HasChanged = true
  169.                
  170.                 self.StartDraggingPos = gui.MouseY()
  171.                 self.Dragging = 2
  172.                
  173.                 return
  174.         end
  175.  
  176.         if ( self.Velocity != 0 ) then
  177.        
  178.                 self.HasChanged = true
  179.                 self.Pos = self.Pos + ( self.Velocity/ self.BarScale ) * FrameTime()
  180.                 self.Velocity = math.Approach( self.Velocity, 0, FrameTime() * self.Velocity * 10 )
  181.                
  182.                 if ( self.Pos < 0 || self.Pos > 1 ) then
  183.                
  184.                         //self.Velocity = self.Velocity * -0.5
  185.                         self.Velocity = 0
  186.                         self.Pos = math.Clamp( self.Pos, 0, 1 )
  187.                
  188.                 end
  189.                
  190.         end
  191.        
  192. end
  193.  
  194. /*---------------------------------------------------------
  195.    Name: Paint
  196. ---------------------------------------------------------*/
  197. function PANEL:Paint()
  198.        
  199.         if ( !self.Enabled || self.BarScale <= 0 ) then return true     end
  200.        
  201.         draw.RoundedBox( 4, 0, 0, self:GetWide(), self:GetTall(), Color(200, 200, 200, 100) )
  202.        
  203.         local Pos = ( self:GetTall() - self:ScrollbarSize() ) * self.Pos
  204.         draw.RoundedBox( 4, 2, Pos+2, self:GetWide()-4, self:ScrollbarSize()-4, Color(0, 0, 0, 200) )
  205.        
  206.         return true
  207.        
  208. end
  209.  
  210.  
  211. /*---------------------------------------------------------
  212.    Name: Think
  213. ---------------------------------------------------------*/
  214. function PANEL:OnMousePressed()
  215.  
  216.         self:RequestFocus()
  217.         self:Grip( 1 )
  218.        
  219. end
  220.  
  221. /*---------------------------------------------------------
  222.    Name: Changed
  223. ---------------------------------------------------------*/
  224. function PANEL:Grip( direction )
  225.  
  226.         if ( !self.Enabled ) then return end
  227.        
  228.         self:MouseCapture( true )
  229.         self.DragDirection = direction or ( -1 / self.BarScale )
  230.         self.Dragging = 1
  231.         self.Velocity = 0
  232.         self.StartDraggingPos = gui.MouseY()
  233.        
  234. end
  235.  
  236. /*---------------------------------------------------------
  237.    Name: Think
  238. ---------------------------------------------------------*/
  239. function PANEL:OnMouseReleased()
  240.  
  241.         self:MouseCapture( false )
  242.         self.Dragging = nil
  243.        
  244. end
  245.  
  246. vgui.Register( "SlideBar", PANEL, "Panel" )
  247.