/* GWEN Copyright (c) 2010 Facepunch Studios See license in Gwen.h */ #include "Gwen/Controls/ImagePanel.h" #include "Gwen/Controls/Label.h" #include "Gwen/Controls/Resizer.h" #include "Gwen/Controls/ResizableControl.h" using namespace Gwen; using namespace Gwen::Controls; using namespace Gwen::ControlsInternal; GWEN_CONTROL_CONSTRUCTOR(ResizableControl) { m_bResizable = true; m_MinimumSize = Gwen::Point(5, 5); m_bClampMovement = false; Resizer* resizerBottom = new Resizer(this); resizerBottom->Dock(Pos::Bottom); resizerBottom->SetResizeDir(Pos::Bottom); resizerBottom->SetTarget(this); resizerBottom->onResize.Add(this, &ResizableControl::OnResizedInternal); Resizer* resizerBottomLeft = new Resizer(resizerBottom); resizerBottomLeft->Dock(Pos::Left); resizerBottomLeft->SetResizeDir(Pos::Bottom | Pos::Left); resizerBottomLeft->SetTarget(this); resizerBottomLeft->onResize.Add(this, &ResizableControl::OnResizedInternal); Resizer* resizerBottomRight = new Resizer(resizerBottom); resizerBottomRight->Dock(Pos::Right); resizerBottomRight->SetResizeDir(Pos::Bottom | Pos::Right); resizerBottomRight->SetTarget(this); resizerBottomRight->onResize.Add(this, &ResizableControl::OnResizedInternal); Resizer* resizerTop = new Resizer(this); resizerTop->Dock(Pos::Top); resizerTop->SetResizeDir(Pos::Top); resizerTop->SetTarget(this); resizerTop->onResize.Add(this, &ResizableControl::OnResizedInternal); Resizer* resizerTopLeft = new Resizer(resizerTop); resizerTopLeft->Dock(Pos::Left); resizerTopLeft->SetResizeDir(Pos::Top | Pos::Left); resizerTopLeft->SetTarget(this); resizerTopLeft->onResize.Add(this, &ResizableControl::OnResizedInternal); Resizer* resizerTopRight = new Resizer(resizerTop); resizerTopRight->Dock(Pos::Right); resizerTopRight->SetResizeDir(Pos::Top | Pos::Right); resizerTopRight->SetTarget(this); resizerTopRight->onResize.Add(this, &ResizableControl::OnResizedInternal); Resizer* resizerLeft = new Resizer(this); resizerLeft->Dock(Pos::Left); resizerLeft->SetResizeDir(Pos::Left); resizerLeft->SetTarget(this); resizerLeft->onResize.Add(this, &ResizableControl::OnResizedInternal); Resizer* resizerRight = new Resizer(this); resizerRight->Dock(Pos::Right); resizerRight->SetResizeDir(Pos::Right); resizerRight->SetTarget(this); resizerRight->onResize.Add(this, &ResizableControl::OnResizedInternal); } void ResizableControl::DisableResizing() { for (Base::List::iterator it = Children.begin(); it != Children.end(); ++it) { Resizer* resizer = (*it)->DynamicCastResizer(); if (!resizer) continue; resizer->SetMouseInputEnabled(false); resizer->SetHidden(true); SetPadding(Padding(resizer->Width(), resizer->Width(), resizer->Width(), resizer->Width())); } } bool ResizableControl::SetBounds(int x, int y, int w, int h) { Gwen::Point minSize = GetMinimumSize(); // Clamp Minimum Size if (w < minSize.x) w = minSize.x; if (h < minSize.y) h = minSize.y; // Clamp to parent's window Base* pParent = GetParent(); if (pParent && m_bClampMovement) { if (x + w > pParent->Width()) x = pParent->Width() - w; if (x < 0) x = 0; if (y + h > pParent->Height()) y = pParent->Height() - h; if (y < 0) y = 0; } return BaseClass::SetBounds(x, y, w, h); } void ResizableControl::OnResizedInternal(Controls::Base* /*pControl*/) { onResize.Call(this); OnResized(); }