/* GWEN Copyright (c) 2010 Facepunch Studios See license in Gwen.h */ #include "Gwen/Controls/WindowControl.h" #include "Gwen/Controls/ImagePanel.h" #include "Gwen/Controls/Label.h" #include "Gwen/Controls/Modal.h" using namespace Gwen; using namespace Gwen::Controls; using namespace Gwen::ControlsInternal; GWEN_CONTROL_CONSTRUCTOR( WindowControl ) { m_Modal = NULL; m_bInFocus = false; m_bDeleteOnClose = false; m_TitleBar = new Dragger( this ); m_TitleBar->Dock( Pos::Top ); m_TitleBar->SetHeight( 18 ); m_TitleBar->SetPadding( Padding( 0, 0, 0, 5 ) ); m_TitleBar->SetTarget( this ); m_Title = new Label( m_TitleBar ); m_Title->SetAlignment( Pos::Center ); m_Title->SetText( "Window" ); m_Title->SetTextColor(Gwen::Colors::White); m_Title->Dock( Pos::Fill ); m_CloseButton = new Button( m_TitleBar ); m_CloseButton->SetText( "" ); m_CloseButton->SetSize( m_TitleBar->Height(), m_TitleBar->Height() ); m_CloseButton->Dock(Pos::Right); m_CloseButton->onPress.Add( this, &WindowControl::CloseButtonPressed ); m_CloseButton->SetTabable( false ); m_CloseButton->SetName( "closeButton" ); //Create a blank content control, dock it to the top - Should this be a ScrollControl? m_InnerPanel = new Base( this ); m_InnerPanel->Dock( Pos::Fill ); BringToFront(); SetTabable( false ); Focus(); SetMinimumSize( Gwen::Point( 100, 40 ) ); SetClampMovement( true ); SetKeyboardInputEnabled( false ); } WindowControl::~WindowControl() { if ( m_Modal ) { m_Modal->DelayedDelete(); } } void WindowControl::MakeModal( bool invisible ) { if ( m_Modal ) return; m_Modal = new ControlsInternal::Modal( GetCanvas() ); SetParent( m_Modal ); if ( invisible ) { m_Modal->SetShouldDrawBackground( false ); } } bool WindowControl::IsOnTop() { for (Base::List::reverse_iterator iter = GetParent()->Children.rbegin(); iter != GetParent()->Children.rend(); ++iter) { if (!*iter) continue; WindowControl* pWindow = (*iter)->DynamicCastWindowControl(); if ( !pWindow ) continue; if ( pWindow == this ) return true; return false; } return false; } void WindowControl::Render( Skin::Base* skin ) { //This should use m_bInFocus but I need to figure out best way to make layout happen skin->DrawWindow( this, m_TitleBar->Bottom(), IsOnTop() ); } void WindowControl::RenderUnder( Skin::Base* skin ) { BaseClass::RenderUnder( skin ); skin->DrawShadow( this ); } void WindowControl::SetTitle(Gwen::UnicodeString title) { m_Title->SetText( title ); } void WindowControl::SetClosable(bool closeable) { m_CloseButton->SetHidden( !closeable ); } void WindowControl::SetHidden(bool hidden) { if ( !hidden ) BringToFront(); BaseClass::SetHidden(hidden); } void WindowControl::Touch() { BaseClass::Touch(); BringToFront(); m_bInFocus = IsOnTop(); //If Keyboard focus isn't one of our children, make it us } void WindowControl::CloseButtonPressed( Gwen::Controls::Base* /*pFromPanel*/ ) { SetHidden( true ); if ( m_bDeleteOnClose ) DelayedDelete(); } void WindowControl::RenderFocus( Gwen::Skin::Base* /*skin*/ ) { }