ResizableControl.cpp 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. /*
  2. GWEN
  3. Copyright (c) 2010 Facepunch Studios
  4. See license in Gwen.h
  5. */
  6. #include "Gwen/Controls/ImagePanel.h"
  7. #include "Gwen/Controls/Label.h"
  8. #include "Gwen/Controls/Resizer.h"
  9. #include "Gwen/Controls/ResizableControl.h"
  10. using namespace Gwen;
  11. using namespace Gwen::Controls;
  12. using namespace Gwen::ControlsInternal;
  13. GWEN_CONTROL_CONSTRUCTOR( ResizableControl )
  14. {
  15. m_bResizable = true;
  16. m_MinimumSize = Gwen::Point( 5, 5 );
  17. m_bClampMovement = false;
  18. Resizer* resizerBottom = new Resizer (this );
  19. resizerBottom->Dock( Pos::Bottom );
  20. resizerBottom->SetResizeDir( Pos::Bottom );
  21. resizerBottom->SetTarget( this );
  22. resizerBottom->onResize.Add( this, &ResizableControl::OnResizedInternal );
  23. Resizer* resizerBottomLeft = new Resizer( resizerBottom );
  24. resizerBottomLeft->Dock( Pos::Left );
  25. resizerBottomLeft->SetResizeDir( Pos::Bottom | Pos::Left );
  26. resizerBottomLeft->SetTarget(this );
  27. resizerBottomLeft->onResize.Add( this, &ResizableControl::OnResizedInternal );
  28. Resizer* resizerBottomRight = new Resizer( resizerBottom );
  29. resizerBottomRight->Dock( Pos::Right);
  30. resizerBottomRight->SetResizeDir( Pos::Bottom | Pos::Right );
  31. resizerBottomRight->SetTarget( this );
  32. resizerBottomRight->onResize.Add( this, &ResizableControl::OnResizedInternal );
  33. Resizer* resizerTop = new Resizer( this );
  34. resizerTop->Dock( Pos::Top );
  35. resizerTop->SetResizeDir( Pos::Top );
  36. resizerTop->SetTarget( this );
  37. resizerTop->onResize.Add( this, &ResizableControl::OnResizedInternal );
  38. Resizer* resizerTopLeft = new Resizer( resizerTop );
  39. resizerTopLeft->Dock( Pos::Left );
  40. resizerTopLeft->SetResizeDir( Pos::Top | Pos::Left );
  41. resizerTopLeft->SetTarget( this );
  42. resizerTopLeft->onResize.Add( this, &ResizableControl::OnResizedInternal );
  43. Resizer* resizerTopRight = new Resizer( resizerTop );
  44. resizerTopRight->Dock( Pos::Right );
  45. resizerTopRight->SetResizeDir( Pos::Top| Pos::Right );
  46. resizerTopRight->SetTarget( this );
  47. resizerTopRight->onResize.Add( this, &ResizableControl::OnResizedInternal );
  48. Resizer* resizerLeft = new Resizer( this );
  49. resizerLeft->Dock( Pos::Left );
  50. resizerLeft->SetResizeDir( Pos::Left );
  51. resizerLeft->SetTarget( this );
  52. resizerLeft->onResize.Add( this, &ResizableControl::OnResizedInternal );
  53. Resizer* resizerRight = new Resizer( this );
  54. resizerRight->Dock( Pos::Right );
  55. resizerRight->SetResizeDir( Pos::Right );
  56. resizerRight->SetTarget( this );
  57. resizerRight->onResize.Add( this, &ResizableControl::OnResizedInternal );
  58. }
  59. void ResizableControl::DisableResizing()
  60. {
  61. for ( Base::List::iterator it = Children.begin(); it != Children.end(); ++it )
  62. {
  63. Resizer* resizer = (*it)->DynamicCastResizer();
  64. if ( !resizer ) continue;
  65. resizer->SetMouseInputEnabled( false );
  66. resizer->SetHidden( true );
  67. SetPadding( Padding( resizer->Width(), resizer->Width(), resizer->Width(), resizer->Width() ) );
  68. }
  69. }
  70. bool ResizableControl::SetBounds( int x, int y, int w, int h )
  71. {
  72. Gwen::Point minSize = GetMinimumSize();
  73. // Clamp Minimum Size
  74. if ( w < minSize.x ) w = minSize.x;
  75. if ( h < minSize.y ) h = minSize.y;
  76. // Clamp to parent's window
  77. Base* pParent = GetParent();
  78. if ( pParent && m_bClampMovement )
  79. {
  80. if ( x + w > pParent->Width() ) x = pParent->Width() - w;
  81. if ( x < 0 ) x = 0;
  82. if ( y + h > pParent->Height() ) y = pParent->Height() - h;
  83. if ( y < 0 ) y = 0;
  84. }
  85. return BaseClass::SetBounds( x, y, w, h );
  86. }
  87. void ResizableControl::OnResizedInternal( Controls::Base* /*pControl*/ )
  88. {
  89. onResize.Call( this );
  90. OnResized();
  91. }