Advertisement
Guest User

Untitled

a guest
Jul 15th, 2018
211
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.71 KB | None | 0 0
  1.  
  2. local PANEL = {}
  3.  
  4. AccessorFunc( PANEL, "m_pPropertySheet", "PropertySheet" )
  5. AccessorFunc( PANEL, "m_pPanel", "Panel" )
  6.  
  7. Derma_Hook( PANEL, "Paint", "Paint", "Tab" )
  8.  
  9. function PANEL:Init()
  10.  
  11. self:SetMouseInputEnabled( true )
  12. self:SetContentAlignment( 7 )
  13. self:SetTextInset( 0, 4 )
  14.  
  15. end
  16.  
  17. function PANEL:Setup( label, pPropertySheet, pPanel, strMaterial )
  18.  
  19. self:SetText( label )
  20. self:SetPropertySheet( pPropertySheet )
  21. self:SetPanel( pPanel )
  22.  
  23. if ( strMaterial ) then
  24.  
  25. self.Image = vgui.Create( "DImage", self )
  26. self.Image:SetImage( strMaterial )
  27. self.Image:SizeToContents()
  28. self:InvalidateLayout()
  29.  
  30. end
  31.  
  32. end
  33.  
  34. function PANEL:IsActive()
  35. return self:GetPropertySheet():GetActiveTab() == self
  36. end
  37.  
  38. function PANEL:DoClick()
  39.  
  40. self:GetPropertySheet():SetActiveTab( self )
  41.  
  42. end
  43.  
  44. function PANEL:PerformLayout()
  45.  
  46. self:ApplySchemeSettings()
  47.  
  48. if ( !self.Image ) then return end
  49.  
  50. self.Image:SetPos( 7, 3 )
  51.  
  52. if ( !self:IsActive() ) then
  53. self.Image:SetImageColor( Color( 255, 255, 255, 155 ) )
  54. else
  55. self.Image:SetImageColor( Color( 255, 255, 255, 255 ) )
  56. end
  57.  
  58. end
  59.  
  60. function PANEL:UpdateColours( skin )
  61.  
  62. if ( self:IsActive() ) then
  63.  
  64. if ( self:GetDisabled() ) then return self:SetTextStyleColor( skin.Colours.Tab.Active.Disabled ) end
  65. if ( self:IsDown() ) then return self:SetTextStyleColor( skin.Colours.Tab.Active.Down ) end
  66. if ( self.Hovered ) then return self:SetTextStyleColor( skin.Colours.Tab.Active.Hover ) end
  67.  
  68. return self:SetTextStyleColor( skin.Colours.Tab.Active.Normal )
  69.  
  70. end
  71.  
  72. if ( self:GetDisabled() ) then return self:SetTextStyleColor( skin.Colours.Tab.Inactive.Disabled ) end
  73. if ( self:IsDown() ) then return self:SetTextStyleColor( skin.Colours.Tab.Inactive.Down ) end
  74. if ( self.Hovered ) then return self:SetTextStyleColor( skin.Colours.Tab.Inactive.Hover ) end
  75.  
  76. return self:SetTextStyleColor( skin.Colours.Tab.Inactive.Normal )
  77.  
  78. end
  79.  
  80. function PANEL:GetTabHeight()
  81.  
  82. if ( self:IsActive() ) then
  83. return 28
  84. else
  85. return 20
  86. end
  87.  
  88. end
  89.  
  90. function PANEL:ApplySchemeSettings()
  91.  
  92. local ExtraInset = 10
  93.  
  94. if ( self.Image ) then
  95. ExtraInset = ExtraInset + self.Image:GetWide()
  96. end
  97.  
  98. self:SetTextInset( ExtraInset, 4 )
  99. local w, h = self:GetContentSize()
  100. h = self:GetTabHeight()
  101.  
  102. self:SetSize( w + 10, h )
  103.  
  104. DLabel.ApplySchemeSettings( self )
  105.  
  106. end
  107.  
  108. --
  109. -- DragHoverClick
  110. --
  111. function PANEL:DragHoverClick( HoverTime )
  112.  
  113. self:DoClick()
  114.  
  115. end
  116.  
  117. function PANEL:GenerateExample()
  118.  
  119. -- Do nothing!
  120.  
  121. end
  122.  
  123. derma.DefineControl( "DTab", "A Tab for use on the PropertySheet", PANEL, "DButton" )
  124.  
  125. --[[---------------------------------------------------------
  126. DPropertySheet
  127. -----------------------------------------------------------]]
  128.  
  129. local PANEL = {}
  130.  
  131. Derma_Hook( PANEL, "Paint", "Paint", "PropertySheet" )
  132.  
  133. AccessorFunc( PANEL, "m_pActiveTab", "ActiveTab" )
  134. AccessorFunc( PANEL, "m_iPadding", "Padding" )
  135. AccessorFunc( PANEL, "m_fFadeTime", "FadeTime" )
  136.  
  137. AccessorFunc( PANEL, "m_bShowIcons", "ShowIcons" )
  138.  
  139. function PANEL:Init()
  140.  
  141. self:SetShowIcons( true )
  142.  
  143. self.tabScroller = vgui.Create( "DHorizontalScroller", self )
  144. self.tabScroller:SetOverlap( 5 )
  145. self.tabScroller:Dock( TOP )
  146. self.tabScroller:DockMargin( 3, 0, 3, 0 )
  147.  
  148. self:SetFadeTime( 0.1 )
  149. self:SetPadding( 8 )
  150.  
  151. self.animFade = Derma_Anim( "Fade", self, self.CrossFade )
  152.  
  153. self.Items = {}
  154.  
  155. end
  156.  
  157. function PANEL:AddSheet( label, panel, material, NoStretchX, NoStretchY, Tooltip )
  158.  
  159. if ( !IsValid( panel ) ) then
  160. ErrorNoHalt( "DPropertySheet:AddSheet tried to add invalid panel!" )
  161. debug.Trace()
  162. return
  163. end
  164.  
  165. local Sheet = {}
  166.  
  167. Sheet.Name = label
  168.  
  169. Sheet.Tab = vgui.Create( "DTab", self )
  170. Sheet.Tab:SetTooltip( Tooltip )
  171. Sheet.Tab:Setup( label, self, panel, material )
  172.  
  173. Sheet.Panel = panel
  174. Sheet.Panel.NoStretchX = NoStretchX
  175. Sheet.Panel.NoStretchY = NoStretchY
  176. Sheet.Panel:SetPos( self:GetPadding(), 20 + self:GetPadding() )
  177. Sheet.Panel:SetVisible( false )
  178.  
  179. panel:SetParent( self )
  180.  
  181. table.insert( self.Items, Sheet )
  182.  
  183. if ( !self:GetActiveTab() ) then
  184. self:SetActiveTab( Sheet.Tab )
  185. Sheet.Panel:SetVisible( true )
  186. end
  187.  
  188. self.tabScroller:AddPanel( Sheet.Tab )
  189.  
  190. return Sheet
  191.  
  192. end
  193.  
  194. function PANEL:SetActiveTab( active )
  195.  
  196. if ( !IsValid( active ) || self.m_pActiveTab == active ) then return end
  197.  
  198. if ( IsValid( self.m_pActiveTab ) ) then
  199.  
  200. -- Only run this callback when we actually switch a tab, not when a tab is initially set active
  201. self:OnActiveTabChanged( self.m_pActiveTab, active )
  202.  
  203. if ( self:GetFadeTime() > 0 ) then
  204.  
  205. self.animFade:Start( self:GetFadeTime(), { OldTab = self.m_pActiveTab, NewTab = active } )
  206.  
  207. else
  208.  
  209. self.m_pActiveTab:GetPanel():SetVisible( false )
  210.  
  211. end
  212.  
  213. end
  214.  
  215. self.m_pActiveTab = active
  216. self:InvalidateLayout()
  217.  
  218. end
  219.  
  220. function PANEL:OnActiveTabChanged( old, new )
  221. -- For override
  222. end
  223.  
  224. function PANEL:Think()
  225.  
  226. self.animFade:Run()
  227.  
  228. end
  229.  
  230. function PANEL:GetItems()
  231.  
  232. return self.Items
  233.  
  234. end
  235.  
  236. function PANEL:CrossFade( anim, delta, data )
  237.  
  238. if ( !data || !IsValid( data.OldTab ) || !IsValid( data.NewTab ) ) then return end
  239.  
  240. local old = data.OldTab:GetPanel()
  241. local new = data.NewTab:GetPanel()
  242.  
  243. if ( !IsValid( old ) && !IsValid( new ) ) then return end
  244.  
  245. if ( anim.Finished ) then
  246. if ( IsValid( old ) ) then
  247. old:SetAlpha( 255 )
  248. old:SetZPos( 0 )
  249. old:SetVisible( false )
  250. end
  251.  
  252. if ( IsValid( new ) ) then
  253. new:SetAlpha( 255 )
  254. new:SetZPos( 0 )
  255. new:SetVisible( true ) // In case new == old
  256. end
  257.  
  258. return
  259. end
  260.  
  261. if ( anim.Started ) then
  262. if ( IsValid( old ) ) then
  263. old:SetAlpha( 255 )
  264. old:SetZPos( 0 )
  265. end
  266.  
  267. if ( IsValid( new ) ) then
  268. new:SetAlpha( 0 )
  269. new:SetZPos( 1 )
  270. end
  271.  
  272. end
  273.  
  274. if ( IsValid( old ) ) then
  275. old:SetVisible( true )
  276. if ( !IsValid( new ) ) then old:SetAlpha( 255 * ( 1 - delta ) ) end
  277. end
  278.  
  279. if ( IsValid( new ) ) then
  280. new:SetVisible( true )
  281. new:SetAlpha( 255 * delta )
  282. end
  283.  
  284. end
  285.  
  286. function PANEL:PerformLayout()
  287.  
  288. local ActiveTab = self:GetActiveTab()
  289. local Padding = self:GetPadding()
  290.  
  291. if ( !IsValid( ActiveTab ) ) then return end
  292.  
  293. -- Update size now, so the height is definitiely right.
  294. ActiveTab:InvalidateLayout( true )
  295.  
  296. --self.tabScroller:StretchToParent( Padding, 0, Padding, nil )
  297. self.tabScroller:SetTall( ActiveTab:GetTall() )
  298.  
  299. local ActivePanel = ActiveTab:GetPanel()
  300.  
  301. for k, v in pairs( self.Items ) do
  302.  
  303. if ( v.Tab:GetPanel() == ActivePanel ) then
  304.  
  305. if ( IsValid( v.Tab:GetPanel() ) ) then v.Tab:GetPanel():SetVisible( true ) end
  306. v.Tab:SetZPos( 100 )
  307.  
  308. else
  309.  
  310. if ( IsValid( v.Tab:GetPanel() ) ) then v.Tab:GetPanel():SetVisible( false ) end
  311. v.Tab:SetZPos( 1 )
  312.  
  313. end
  314.  
  315. v.Tab:ApplySchemeSettings()
  316.  
  317. end
  318.  
  319. if ( IsValid( ActivePanel ) ) then
  320. if ( !ActivePanel.NoStretchX ) then
  321. ActivePanel:SetWide( self:GetWide() - Padding * 2 )
  322. else
  323. ActivePanel:CenterHorizontal()
  324. end
  325.  
  326. if ( !ActivePanel.NoStretchY ) then
  327. local _, y = ActivePanel:GetPos()
  328. ActivePanel:SetTall( self:GetTall() - y - Padding )
  329. else
  330. ActivePanel:CenterVertical()
  331. end
  332.  
  333. ActivePanel:InvalidateLayout()
  334. end
  335.  
  336. -- Give the animation a chance
  337. self.animFade:Run()
  338.  
  339. end
  340.  
  341. function PANEL:SizeToContentWidth()
  342.  
  343. local wide = 0
  344.  
  345. for k, v in pairs( self.Items ) do
  346.  
  347. if ( IsValid( v.Panel ) ) then
  348. v.Panel:InvalidateLayout( true )
  349. wide = math.max( wide, v.Panel:GetWide() + self:GetPadding() * 2 )
  350. end
  351.  
  352. end
  353.  
  354. self:SetWide( wide )
  355.  
  356. end
  357.  
  358. function PANEL:SwitchToName( name )
  359.  
  360. for k, v in pairs( self.Items ) do
  361.  
  362. if ( v.Name == name ) then
  363. v.Tab:DoClick()
  364. return true
  365. end
  366.  
  367. end
  368.  
  369. return false
  370.  
  371. end
  372.  
  373. function PANEL:SetupCloseButton( func )
  374.  
  375. self.CloseButton = self.tabScroller:Add( "DImageButton" )
  376. self.CloseButton:SetImage( "icon16/circlecross.png" )
  377. self.CloseButton:SetColor( Color( 10, 10, 10, 200 ) )
  378. self.CloseButton:DockMargin( 1, 1, 1, 9 )
  379. self.CloseButton:SetWide( 18 )
  380. self.CloseButton:Dock( RIGHT )
  381. self.CloseButton.DoClick = function()
  382. if ( func ) then func() end
  383. end
  384.  
  385. end
  386.  
  387. function PANEL:CloseTab( tab, bRemovePanelToo )
  388.  
  389. for k, v in pairs( self.Items ) do
  390.  
  391. if ( v.Tab != tab ) then continue end
  392.  
  393. table.remove( self.Items, k )
  394.  
  395. end
  396.  
  397. for k, v in pairs( self.tabScroller.Panels ) do
  398.  
  399. if ( v != tab ) then continue end
  400.  
  401. table.remove( self.tabScroller.Panels, k )
  402.  
  403. end
  404.  
  405. self.tabScroller:InvalidateLayout( true )
  406.  
  407. if ( tab == self:GetActiveTab() ) then
  408. self.m_pActiveTab = self.Items[ #self.Items ].Tab
  409. end
  410.  
  411. local pnl = tab:GetPanel()
  412.  
  413. if ( bRemovePanelToo ) then
  414. pnl:Remove()
  415. end
  416.  
  417. tab:Remove()
  418.  
  419. self:InvalidateLayout( true )
  420.  
  421. return pnl
  422.  
  423. end
  424.  
  425. derma.DefineControl( "DPropertySheet", "", PANEL, "Panel" )
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement