Advertisement
my_hat_stinks

dframe

May 13th, 2014
357
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 9.37 KB | None | 0 0
  1. --[[   _                                
  2.     ( )                              
  3.    _| |   __   _ __   ___ ___     _ _
  4.  /'_` | /'__`\( '__)/' _ ` _ `\ /'_` )
  5. ( (_| |(  ___/| |   | ( ) ( ) |( (_| |
  6. `\__,_)`\____)(_)   (_) (_) (_)`\__,_)
  7.  
  8.     DFrame
  9.    
  10.     A window.
  11.  
  12. --]]
  13.  
  14. PANEL = {}
  15.  
  16. AccessorFunc( PANEL, "m_bIsMenuComponent",      "IsMenu",           FORCE_BOOL )
  17. AccessorFunc( PANEL, "m_bDraggable",            "Draggable",        FORCE_BOOL )
  18. AccessorFunc( PANEL, "m_bSizable",              "Sizable",          FORCE_BOOL )
  19. AccessorFunc( PANEL, "m_bScreenLock",           "ScreenLock",       FORCE_BOOL )
  20. AccessorFunc( PANEL, "m_bDeleteOnClose",        "DeleteOnClose",    FORCE_BOOL )
  21. AccessorFunc( PANEL, "m_bPaintShadow",          "PaintShadow",      FORCE_BOOL )
  22.  
  23. AccessorFunc( PANEL, "m_iMinWidth",             "MinWidth" )
  24. AccessorFunc( PANEL, "m_iMinHeight",            "MinHeight" )
  25.  
  26. AccessorFunc( PANEL, "m_bBackgroundBlur",       "BackgroundBlur",   FORCE_BOOL )
  27.  
  28.  
  29. --[[---------------------------------------------------------
  30.  
  31. -----------------------------------------------------------]]
  32. function PANEL:Init()
  33.  
  34.     self:SetFocusTopLevel( true )
  35.  
  36. --  self:SetCursor( "sizeall" )
  37.  
  38.     self:SetPaintShadow( true )
  39.    
  40.     self.btnClose = vgui.Create( "DButton", self )
  41.     self.btnClose:SetText( "" )
  42.     self.btnClose.DoClick = function ( button ) self:Close() end
  43.     self.btnClose.Paint = function( panel, w, h ) derma.SkinHook( "Paint", "WindowCloseButton", panel, w, h ) end
  44.    
  45.     self.btnMaxim = vgui.Create( "DButton", self )
  46.     self.btnMaxim:SetText( "" )
  47.     self.btnMaxim.DoClick = function ( button ) if self.IsMaximized then self:Restore() else self:Maximize() end end
  48.     self.btnMaxim.Paint = function( panel, w, h ) derma.SkinHook( "Paint", "WindowMaximizeButton", panel, w, h ) end
  49.  
  50.     self.btnMinim = vgui.Create( "DButton", self )
  51.     self.btnMinim:SetText( "" )
  52.     self.btnMinim.DoClick = function ( button ) if self.IsMinimized then self:Restore() else self:Minimize() end end
  53.     self.btnMinim.Paint = function( panel, w, h ) derma.SkinHook( "Paint", "WindowMinimizeButton", panel, w, h ) end
  54.  
  55.     self.lblTitle = vgui.Create( "DLabel", self )
  56.     self.lblTitle.UpdateColours = function( label, skin )
  57.    
  58.         if ( self:IsActive() ) then return label:SetTextStyleColor( skin.Colours.Window.TitleActive ) end
  59.        
  60.         return label:SetTextStyleColor( skin.Colours.Window.TitleInactive )
  61.            
  62.         end
  63.    
  64.     self:SetDraggable( true )
  65.     self:SetSizable( false )
  66.     self:SetScreenLock( false )
  67.     self:SetDeleteOnClose( true )
  68.     self:SetTitle( "Window" )
  69.    
  70.     self:SetMinWidth( 50 );
  71.     self:SetMinHeight( 50 );
  72.    
  73.     -- This turns off the engine drawing
  74.     self:SetPaintBackgroundEnabled( false )
  75.     self:SetPaintBorderEnabled( false )
  76.    
  77.     self.m_fCreateTime = SysTime()
  78.    
  79.     self:DockPadding( 5, 24 + 5, 5, 5 )
  80.  
  81. end
  82.  
  83. --[[---------------------------------------------------------
  84.  
  85. -----------------------------------------------------------]]
  86. function PANEL:ShowCloseButton( bShow )
  87.  
  88.     self.btnClose:SetVisible( bShow );
  89.     self.btnMaxim:SetVisible( bShow );
  90.     self.btnMinim:SetVisible( bShow );
  91.  
  92. end
  93.  
  94. --[[---------------------------------------------------------
  95.  
  96. -----------------------------------------------------------]]
  97. function PANEL:SetTitle( strTitle )
  98.  
  99.     self.lblTitle:SetText( strTitle )
  100.  
  101. end
  102.  
  103.  
  104. --[[---------------------------------------------------------
  105.  
  106. -----------------------------------------------------------]]
  107. function PANEL:Close()
  108.  
  109.     self:SetVisible( false )
  110.  
  111.     if ( self:GetDeleteOnClose() ) then
  112.         self:Remove()
  113.     end
  114.  
  115.     self:OnClose()
  116.  
  117. end
  118.  
  119. --[[---------------------------------------------------------
  120.  
  121. -----------------------------------------------------------]]
  122. function PANEL:OnClose()
  123.  
  124. end
  125.  
  126. --[[---------------------------------------------------------
  127.  
  128. -----------------------------------------------------------]]
  129. function PANEL:Center()
  130.  
  131.     self:InvalidateLayout( true )
  132.     self:SetPos( ScrW()/2 - self:GetWide()/2, ScrH()/2 - self:GetTall()/2 )
  133.  
  134. end
  135.  
  136. --[[---------------------------------------------------------
  137.  
  138. -----------------------------------------------------------]]
  139. function PANEL:Maximize()
  140.    
  141.     if self.IsMaximized then return end
  142.     if self.IsMinimized then self:Restore() end
  143.    
  144.     self.Maximized_OldDock = self:GetDock()
  145.    
  146.     self:Dock( FILL )
  147.     self.IsMaximized = true
  148.    
  149. end
  150.  
  151. --[[---------------------------------------------------------
  152.  
  153. -----------------------------------------------------------]]
  154. function PANEL:Minimize()
  155.    
  156.     if self.IsMinimized then return end
  157.     if self.IsMaximized then self:Restore() end
  158.    
  159.     local x,y = self:GetPos()
  160.     self.Minimized_Restore = {size={self:GetWide(),self:GetTall()}, pos = {x,y}, parent=self:GetParent(), dock=self:GetDock()}
  161.     self.IsMinimized = true
  162.    
  163.     local parent = self:GetParent() or vgui.GetWorldPanel()
  164.     if not IsValid(parent.MinimizeDock) then
  165.        
  166.         parent.MinimizeDock = vgui.Create( "DPanel" )
  167.         parent.MinimizeDock.Paint = function() end
  168.         parent.MinimizeDock:SetTall( 22 )
  169.         parent.MinimizeDock:SetDockMargin( 1,1,1,1 )
  170.         parent.MinimizeDock:SetDockPadding( 1,1,1,1 )
  171.         parent.MinimizeDock:Dock( BOTTOM )
  172.        
  173.     end
  174.    
  175.     self:SetParent( parent.MinimizeDock )
  176.     self:Dock( RIGHT )
  177.     self:SetWide( 50 )
  178.    
  179. end
  180.  
  181. --[[---------------------------------------------------------
  182.  
  183. -----------------------------------------------------------]]
  184. function PANEL:Restore()
  185.    
  186.     if self.IsMaximized then
  187.        
  188.         self:Dock( self.Maximized_OldDock or NODOCK )
  189.         self.IsMaximized = false
  190.        
  191.     elseif self.IsMinimized and self.Minimized_Restore then
  192.        
  193.         self:SetParent( self.Minimized_Restore.parent )
  194.         self:Dock( self.Minimized_Restore.dock or NODOCK )
  195.         self:SetSize( self.Minimized_Restore.size[1], self.Minimized_Restore.size[2] )
  196.         self:SetPos( self.Minimized_Restore.pos[1], self.Minimized_Restore.pos[2] )
  197.        
  198.         self.IsMinimized = false
  199.        
  200.     end
  201.    
  202. end
  203.  
  204.  
  205. --[[---------------------------------------------------------
  206.  
  207. -----------------------------------------------------------]]
  208. function PANEL:Think()
  209.  
  210.     local mousex = math.Clamp( gui.MouseX(), 1, ScrW()-1 )
  211.     local mousey = math.Clamp( gui.MouseY(), 1, ScrH()-1 )
  212.        
  213.     if ( self.Dragging ) then
  214.        
  215.         local x = mousex - self.Dragging[1]
  216.         local y = mousey - self.Dragging[2]
  217.  
  218.         -- Lock to screen bounds if screenlock is enabled
  219.         if ( self:GetScreenLock() ) then
  220.        
  221.             x = math.Clamp( x, 0, ScrW() - self:GetWide() )
  222.             y = math.Clamp( y, 0, ScrH() - self:GetTall() )
  223.        
  224.         end
  225.        
  226.         self:SetPos( x, y )
  227.    
  228.     end
  229.    
  230.    
  231.     if ( self.Sizing ) then
  232.    
  233.         local x = mousex - self.Sizing[1]
  234.         local y = mousey - self.Sizing[2]  
  235.         local px, py = self:GetPos()
  236.        
  237.         if ( x < self.m_iMinWidth ) then x = self.m_iMinWidth elseif ( x > ScrW() - px and self:GetScreenLock() ) then x = ScrW() - px end
  238.         if ( y < self.m_iMinHeight ) then y = self.m_iMinHeight elseif ( y > ScrH() - py and self:GetScreenLock() ) then y = ScrH() - py end
  239.    
  240.         self:SetSize( x, y )
  241.         self:SetCursor( "sizenwse" )
  242.         return
  243.    
  244.     end
  245.    
  246.     if ( self.Hovered &&
  247.          self.m_bSizable &&
  248.          mousex > (self.x + self:GetWide() - 20) &&
  249.          mousey > (self.y + self:GetTall() - 20) ) then
  250.  
  251.         self:SetCursor( "sizenwse" )
  252.         return
  253.        
  254.     end
  255.    
  256.     if ( self.Hovered && self:GetDraggable() && mousey < (self.y + 24) ) then
  257.         self:SetCursor( "sizeall" )
  258.         return
  259.     end
  260.    
  261.     self:SetCursor( "arrow" )
  262.  
  263.     -- Don't allow the frame to go higher than 0
  264.     if ( self.y < 0 ) then
  265.         self:SetPos( self.x, 0 )
  266.     end
  267.    
  268. end
  269.  
  270.  
  271. --[[---------------------------------------------------------
  272.  
  273. -----------------------------------------------------------]]
  274. function PANEL:Paint( w, h )
  275.  
  276.     if ( self.m_bBackgroundBlur ) then
  277.         Derma_DrawBackgroundBlur( self, self.m_fCreateTime )
  278.     end
  279.  
  280.     derma.SkinHook( "Paint", "Frame", self, w, h )
  281.     return true
  282.  
  283. end
  284.  
  285.  
  286. --[[---------------------------------------------------------
  287.  
  288. -----------------------------------------------------------]]
  289. function PANEL:OnMousePressed()
  290.  
  291.     if ( self.m_bSizable ) then
  292.    
  293.         if ( gui.MouseX() > (self.x + self:GetWide() - 20) &&
  294.             gui.MouseY() > (self.y + self:GetTall() - 20) ) then           
  295.    
  296.             self.Sizing = { gui.MouseX() - self:GetWide(), gui.MouseY() - self:GetTall() }
  297.             self:MouseCapture( true )
  298.             return
  299.         end
  300.        
  301.     end
  302.    
  303.     if ( self:GetDraggable() && gui.MouseY() < (self.y + 24) ) then
  304.         self.Dragging = { gui.MouseX() - self.x, gui.MouseY() - self.y }
  305.         self:MouseCapture( true )
  306.         return
  307.     end
  308.    
  309.  
  310.  
  311. end
  312.  
  313.  
  314. --[[---------------------------------------------------------
  315.  
  316. -----------------------------------------------------------]]
  317. function PANEL:OnMouseReleased()
  318.  
  319.     self.Dragging = nil
  320.     self.Sizing = nil
  321.     self:MouseCapture( false )
  322.  
  323. end
  324.  
  325.  
  326. --[[---------------------------------------------------------
  327.  
  328. -----------------------------------------------------------]]
  329. function PANEL:PerformLayout()
  330.  
  331.     self.btnClose:SetPos( self:GetWide() - 31 - 4, 0 )
  332.     self.btnClose:SetSize( 31, 31 )
  333.  
  334.     self.btnMaxim:SetPos( self:GetWide() - 31*2 - 4, 0 )
  335.     self.btnMaxim:SetSize( 31, 31 )
  336.  
  337.     self.btnMinim:SetPos( self:GetWide() - 31*3 - 4, 0 )
  338.     self.btnMinim:SetSize( 31, 31 )
  339.    
  340.     self.lblTitle:SetPos( 8, 2 )
  341.     self.lblTitle:SetSize( self:GetWide() - 25, 20 )
  342.  
  343. end
  344.  
  345.  
  346. --[[---------------------------------------------------------
  347.  
  348. -----------------------------------------------------------]]
  349. function PANEL:IsActive()
  350.  
  351.     if ( self:HasFocus() ) then return true end
  352.     if ( vgui.FocusedHasParent( self ) ) then return true end
  353.    
  354.     return false
  355.  
  356. end
  357.  
  358.  
  359. derma.DefineControl( "DFrame", "A simpe window", PANEL, "EditablePanel" )
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement