/* GWEN Copyright (c) 2010 Facepunch Studios See license in Gwen.h */ #include "gwen_windowcontrol.h" #include "gwen_imagepanel.h" #include "gwen_label.h" #include "gwen_modal.h" using namespace Gwen; using namespace Gwen::Controls; using namespace Gwen::ControlsInternal; GWEN_CONTROL_CONSTRUCTOR( WindowControl ) { m_Modal = NULL; m_bDeleteOnClose = false; m_TitleBar = new Dragger( this ); m_TitleBar->SetHeight( 24 ); m_TitleBar->SetPadding( Padding( 0, 0, 0, 0 ) ); m_TitleBar->SetMargin( Margin( 0, 0, 0, 4 ) ); m_TitleBar->SetTarget( this ); m_TitleBar->Dock( Pos::Top ); m_Title = new Label( m_TitleBar ); m_Title->SetAlignment( Pos::Left | Pos::CenterV ); m_Title->SetText( "Window" ); m_Title->Dock( Pos::Fill ); m_Title->SetPadding( Padding( 8, 0, 0, 0 ) ); m_Title->SetTextColor( GetSkin()->Colors.Window.TitleInactive ); m_CloseButton = new Gwen::Controls::WindowCloseButton( m_TitleBar ); m_CloseButton->SetText( "" ); m_CloseButton->Dock( Pos::Right ); m_CloseButton->onPress.Add( this, &WindowControl::CloseButtonPressed ); m_CloseButton->SetTabable( false ); m_CloseButton->SetName( "closeButton" ); m_CloseButton->SetWindow( this ); //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 ); GetResizer( 8 )->Hide(); BringToFront(); SetTabable( false ); Focus(); SetMinimumSize( Gwen::Point( 100, 40 ) ); SetClampMovement( true ); SetKeyboardInputEnabled( false ); } WindowControl::~WindowControl() { DestroyModal(); } void WindowControl::MakeModal( bool bDrawBackground ) { if ( m_Modal ) return; m_Modal = new ControlsInternal::Modal( GetCanvas() ); SetParent( m_Modal ); m_Modal->SetShouldDrawBackground( bDrawBackground ); } void WindowControl::DestroyModal() { if ( !m_Modal ) return; // Really should be restoring our parent here.. but we don't know who it is. // Assume it's the canvas. SetParent( GetCanvas() ); m_Modal->DelayedDelete(); m_Modal = NULL; } bool WindowControl::IsOnTop() { for (Base::List::reverse_iterator iter = GetParent()->Children.rbegin(); iter != GetParent()->Children.rend(); ++iter) { WindowControl* pWindow = gwen_cast(*iter); if ( !pWindow ) continue; if ( pWindow == this ) return true; return false; } return false; } void WindowControl::Render( Skin::Base* skin ) { bool bHasFocus = IsOnTop(); if ( bHasFocus ) m_Title->SetTextColor( GetSkin()->Colors.Window.TitleActive ); else m_Title->SetTextColor( GetSkin()->Colors.Window.TitleInactive ); skin->DrawWindow( this, m_TitleBar->Bottom(), bHasFocus ); } void WindowControl::RenderUnder( Skin::Base* skin ) { BaseClass::RenderUnder( skin ); skin->DrawShadow( this ); } void WindowControl::SetTitle(Gwen::String 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(); } void WindowControl::CloseButtonPressed() { DestroyModal(); onWindowClosed.Call( this ); SetHidden( true ); if ( m_bDeleteOnClose ) DelayedDelete(); } void WindowControl::RenderFocus( Gwen::Skin::Base* /*skin*/ ) { }