123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182 |
- #include "Gwen/Gwen.h"
- #include "Gwen/Controls/CrossSplitter.h"
- #include "Gwen/Controls/Button.h"
- using namespace Gwen;
- using namespace Controls;
- GWEN_CONTROL_CONSTRUCTOR( CrossSplitter )
- {
- m_VSplitter = new SplitterBar( this );
- m_VSplitter->SetPos( 0, 128 );
- m_VSplitter->onDragged.Add( this, &CrossSplitter::OnVerticalMoved );
- m_VSplitter->SetCursor( Gwen::CursorType::SizeNS );
- m_HSplitter = new SplitterBar( this );
- m_HSplitter->SetPos( 128, 0 );
- m_HSplitter->onDragged.Add( this, &CrossSplitter::OnHorizontalMoved );
- m_HSplitter->SetCursor( Gwen::CursorType::SizeWE );
- m_CSplitter = new SplitterBar( this );
- m_CSplitter->SetPos( 128, 128 );
- m_CSplitter->onDragged.Add( this, &CrossSplitter::OnCenterMoved );
- m_CSplitter->SetCursor( Gwen::CursorType::SizeAll );
- m_fHVal = 0.5f;
- m_fVVal = 0.5f;
- SetPanel( 0, NULL );
- SetPanel( 1, NULL );
- SetPanel( 2, NULL );
- SetPanel( 3, NULL );
- SetSplitterSize( 5 );
- SetSplittersVisible( false );
- m_iZoomedSection = -1;
- }
- void CrossSplitter::UpdateVSplitter()
- {
- m_VSplitter->MoveTo( m_VSplitter->X(), ( Height() - m_VSplitter->Height() ) * ( m_fVVal ));
- }
- void CrossSplitter::UpdateHSplitter()
- {
- m_HSplitter->MoveTo( ( Width() - m_HSplitter->Width() ) * ( m_fHVal ), m_HSplitter->Y() );
- }
- void CrossSplitter::OnCenterMoved( Controls::Base * /*control*/ )
- {
- //Move the other two bars into position
- CalculateValueCenter();
- Invalidate();
- }
- void CrossSplitter::UpdateCSplitter()
- {
- m_CSplitter->MoveTo( ( Width() - m_CSplitter->Width() ) * ( m_fHVal ), ( Height() - m_CSplitter->Height() ) * ( m_fVVal ));
- }
- void CrossSplitter::OnHorizontalMoved( Controls::Base * /*control*/ )
- {
- m_fHVal = CalculateValueHorizontal();
- Invalidate();
- }
- void CrossSplitter::OnVerticalMoved( Controls::Base * /*control*/ )
- {
- m_fVVal = CalculateValueVertical();
- Invalidate();
- }
- void CrossSplitter::CalculateValueCenter()
- {
- m_fHVal = (float)m_CSplitter->X() / (float)( Width() - m_CSplitter->Width() );
- m_fVVal = (float)m_CSplitter->Y() / (float)( Height() - m_CSplitter->Height() );
- }
- float CrossSplitter::CalculateValueHorizontal()
- {
- return (float)m_HSplitter->X() / (float)( Width() - m_HSplitter->Width() );
- }
- float CrossSplitter::CalculateValueVertical()
- {
- return (float)m_VSplitter->Y() / (float)( Height() - m_VSplitter->Height() );
- }
- void CrossSplitter::Layout( Skin::Base* /*skin*/ )
- {
- m_VSplitter->SetSize( Width(), m_fBarSize );
- m_HSplitter->SetSize( m_fBarSize, Height() );
- m_CSplitter->SetSize( m_fBarSize, m_fBarSize );
- UpdateVSplitter();
- UpdateHSplitter();
- UpdateCSplitter();
- if ( m_iZoomedSection == -1 )
- {
- if ( m_Sections[0] )
- m_Sections[0]->SetBounds( 0, 0, m_HSplitter->X(), m_VSplitter->Y() );
- if ( m_Sections[1] )
- m_Sections[1]->SetBounds( m_HSplitter->X() + m_fBarSize, 0, Width() - ( m_HSplitter->X() + m_fBarSize ), m_VSplitter->Y() );
- if ( m_Sections[2] )
- m_Sections[2]->SetBounds( 0, m_VSplitter->Y() + m_fBarSize, m_HSplitter->X(), Height() - ( m_VSplitter->Y() + m_fBarSize ) );
- if ( m_Sections[3] )
- m_Sections[3]->SetBounds( m_HSplitter->X() + m_fBarSize, m_VSplitter->Y() + m_fBarSize, Width() - ( m_HSplitter->X() + m_fBarSize ), Height() - ( m_VSplitter->Y() + m_fBarSize ) );
- }
- else
- {
- //This should probably use Fill docking instead
- m_Sections[(int)m_iZoomedSection]->SetBounds( 0, 0, Width(), Height() );
- }
- }
- void CrossSplitter::SetPanel( int index, Controls::Base* pPanel)
- {
- Debug::AssertCheck( index >= 0 && index <= 3, "CrossSplitter::SetPanel out of range" );
- m_Sections[index] = pPanel;
- if ( pPanel )
- {
- pPanel->Dock( Pos::None );
- pPanel->SetParent( this );
- }
- Invalidate();
- }
- Controls::Base* CrossSplitter::GetPanel( int i )
- {
- return m_Sections[i];
- }
- void CrossSplitter::ZoomChanged()
- {
- onZoomChange.Call( this );
- if ( m_iZoomedSection == -1 )
- {
- onUnZoomed.Call( this );
- }
- else
- {
- onZoomed.Call( this );
- }
- }
- void CrossSplitter::Zoom( int section )
- {
- UnZoom();
- if ( m_Sections[section] )
- {
- for (int i = 0; i < 4; i++)
- {
- if ( i != section && m_Sections[i] )
- m_Sections[i]->SetHidden( true );
- }
- m_iZoomedSection = section;
- Invalidate();
- }
- ZoomChanged();
- }
- void CrossSplitter::UnZoom()
- {
- m_iZoomedSection = -1;
- for ( int i = 0; i < 4; i++ )
- {
- if ( m_Sections[i] )
- m_Sections[i]->SetHidden( false );
- }
- Invalidate();
- ZoomChanged();
- }
|