Gered
c5cdddbeaa
current versions of all of my basic framework sources, build configurations/scripts, and supporting assets
140 lines
3 KiB
C++
140 lines
3 KiB
C++
/*
|
|
GWEN
|
|
Copyright (c) 2012 Facepunch Studios
|
|
See license in Gwen.h
|
|
*/
|
|
|
|
#pragma once
|
|
#ifndef GWEN_CONTROLS_SPLITTERS_H
|
|
#define GWEN_CONTROLS_SPLITTERS_H
|
|
|
|
#include "gwen_base.h"
|
|
|
|
namespace Gwen
|
|
{
|
|
namespace Controls
|
|
{
|
|
class GWEN_EXPORT SplitterVertical : public Controls::Base
|
|
{
|
|
GWEN_CONTROL_INLINE( SplitterVertical, Controls::Base )
|
|
{
|
|
m_Panels[0] = new Controls::Base( this );
|
|
m_Panels[1] = new Controls::Base( this );
|
|
|
|
m_pSplitter = new Controls::SplitterBar( this );
|
|
|
|
m_SplitterSize = 6;
|
|
|
|
m_pSplitter->SetPos( 0, 100 );
|
|
m_pSplitter->SetCursor( Gwen::CursorType::SizeNS );
|
|
|
|
m_pSplitter->onDragged.Add( this, &ThisClass::OnSplitterMoved );
|
|
|
|
SetScaling( false, 100 );
|
|
}
|
|
|
|
virtual void PostLayout( Skin::Base* skin )
|
|
{
|
|
RefreshContainers();
|
|
}
|
|
|
|
void SetPanels( Controls::Base* pA, Controls::Base* pB )
|
|
{
|
|
if ( pA ) pA->SetParent( m_Panels[0] );
|
|
if ( pB ) pB->SetParent( m_Panels[1] );
|
|
}
|
|
|
|
void SetScaling( bool Right, int iSize )
|
|
{
|
|
m_RightSided = Right;
|
|
m_Size = iSize;
|
|
}
|
|
|
|
virtual int SplitterPos()
|
|
{
|
|
return m_pSplitter->Y();
|
|
}
|
|
|
|
protected:
|
|
|
|
virtual void RefreshContainers()
|
|
{
|
|
const Gwen::Rect& inner = GetInnerBounds();
|
|
|
|
int iOffset = m_Size;
|
|
if ( m_RightSided ) iOffset = Height() - m_Size;
|
|
|
|
m_pSplitter->SetSize( inner.w, m_SplitterSize );
|
|
m_pSplitter->SetPos( 0, iOffset );
|
|
|
|
m_Panels[0]->SetPos( inner.x, inner.y );
|
|
m_Panels[0]->SetSize( inner.w, iOffset );
|
|
|
|
m_Panels[1]->SetPos( inner.x, (iOffset + m_SplitterSize) );
|
|
m_Panels[1]->SetSize( inner.w, (inner.y + inner.h) - (iOffset + m_SplitterSize) );
|
|
}
|
|
|
|
virtual void OnSplitterMoved()
|
|
{
|
|
if ( m_RightSided )
|
|
m_Size = Height() - m_pSplitter->Y();
|
|
else
|
|
m_Size = m_pSplitter->Y();
|
|
|
|
RefreshContainers();
|
|
Invalidate();
|
|
}
|
|
|
|
Controls::Base* m_Panels[2];
|
|
bool m_RightSided;
|
|
int m_Size;
|
|
Controls::SplitterBar* m_pSplitter;
|
|
unsigned int m_SplitterSize;
|
|
};
|
|
|
|
class GWEN_EXPORT SplitterHorizontal : public SplitterVertical
|
|
{
|
|
GWEN_CONTROL_INLINE( SplitterHorizontal, SplitterVertical )
|
|
{
|
|
m_pSplitter->SetCursor( Gwen::CursorType::SizeWE );
|
|
m_pSplitter->SetPos( 100, 0 );
|
|
}
|
|
|
|
virtual void RefreshContainers()
|
|
{
|
|
const Gwen::Rect& inner = GetInnerBounds();
|
|
|
|
int iOffset = m_Size;
|
|
if ( m_RightSided ) iOffset = Width() - m_Size;
|
|
|
|
m_pSplitter->SetSize( m_SplitterSize, inner.h );
|
|
m_pSplitter->SetPos( iOffset, 0 );
|
|
|
|
m_Panels[0]->SetPos( inner.x, inner.y );
|
|
m_Panels[0]->SetSize( iOffset, inner.h );
|
|
|
|
m_Panels[1]->SetPos( (iOffset + m_SplitterSize), inner.y );
|
|
m_Panels[1]->SetSize( (inner.x + inner.w) - (iOffset + m_SplitterSize), inner.h );
|
|
}
|
|
|
|
virtual void OnSplitterMoved()
|
|
{
|
|
if ( m_RightSided )
|
|
m_Size = Width() - m_pSplitter->X();
|
|
else
|
|
m_Size = m_pSplitter->X();
|
|
|
|
RefreshContainers();
|
|
Invalidate();
|
|
}
|
|
|
|
virtual int SplitterPos()
|
|
{
|
|
return m_pSplitter->X();
|
|
}
|
|
};
|
|
}
|
|
}
|
|
|
|
#endif
|