add initial examples, replacing the 'Demos/Demos3'. Will make it work cross-platform, OpenGL3/OpenGL2 and add more examples to it.
This commit is contained in:
181
examples/ThirdPartyLibs/Gwen/Controls/TabStrip.cpp
Normal file
181
examples/ThirdPartyLibs/Gwen/Controls/TabStrip.cpp
Normal file
@@ -0,0 +1,181 @@
|
||||
/*
|
||||
GWEN
|
||||
Copyright (c) 2010 Facepunch Studios
|
||||
See license in Gwen.h
|
||||
*/
|
||||
|
||||
|
||||
#include "Gwen/Gwen.h"
|
||||
#include "Gwen/Skin.h"
|
||||
#include "Gwen/Controls/TabStrip.h"
|
||||
#include "Gwen/Controls/TabControl.h"
|
||||
#include "Gwen/Controls/Highlight.h"
|
||||
#include "Gwen/DragAndDrop.h"
|
||||
#include "Gwen/Utility.h"
|
||||
|
||||
using namespace Gwen;
|
||||
using namespace Gwen::Controls;
|
||||
|
||||
|
||||
GWEN_CONTROL_CONSTRUCTOR( TabStrip )
|
||||
{
|
||||
m_TabDragControl = NULL;
|
||||
m_bAllowReorder = false;
|
||||
}
|
||||
|
||||
bool TabStrip::DragAndDrop_HandleDrop( Gwen::DragAndDrop::Package* /*pPackage*/, int x, int y )
|
||||
{
|
||||
Gwen::Point LocalPos = CanvasPosToLocal( Gwen::Point( x, y ) );
|
||||
|
||||
Base* el = DragAndDrop::SourceControl;
|
||||
|
||||
TabButton* pButton = el? el->DynamicCastTabButton() : 0;
|
||||
TabControl* pTabControl = GetParent()? GetParent()->DynamicCastTabControl() : 0;
|
||||
if ( pTabControl && pButton )
|
||||
{
|
||||
if ( pButton->GetTabControl() != pTabControl )
|
||||
{
|
||||
// We've moved tab controls!
|
||||
pTabControl->AddPage( pButton );
|
||||
}
|
||||
}
|
||||
|
||||
Base* DroppedOn = GetControlAt( LocalPos.x, LocalPos.y );
|
||||
if ( DroppedOn )
|
||||
{
|
||||
Gwen::Point DropPos = DroppedOn->CanvasPosToLocal( Gwen::Point( x, y ) );
|
||||
DragAndDrop::SourceControl->BringNextToControl( DroppedOn, DropPos.x > DroppedOn->Width() / 2 );
|
||||
}
|
||||
else
|
||||
{
|
||||
DragAndDrop::SourceControl->BringToFront();
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool TabStrip::DragAndDrop_CanAcceptPackage( Gwen::DragAndDrop::Package* pPackage )
|
||||
{
|
||||
if ( !m_bAllowReorder )
|
||||
return false;
|
||||
|
||||
if ( pPackage->name == "TabButtonMove" )
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void TabStrip::Layout( Skin::Base* skin )
|
||||
{
|
||||
Gwen::Point pLargestTab( 5, 5 );
|
||||
|
||||
int iNum = 0;
|
||||
for ( Base::List::iterator iter = Children.begin(); iter != Children.end(); ++iter )
|
||||
{
|
||||
if (!*iter)
|
||||
continue;
|
||||
|
||||
TabButton* pButton = (*iter)->DynamicCastTabButton();
|
||||
if ( !pButton ) continue;
|
||||
|
||||
pButton->SizeToContents();
|
||||
|
||||
Margin m;
|
||||
int iActive = pButton->IsActive() ? 0 : 2;
|
||||
int iNotFirst = iNum > 0 ? -1 : 0;
|
||||
int iControlOverhang = -3;
|
||||
|
||||
if ( m_iDock == Pos::Top )
|
||||
{
|
||||
m.top = iActive;
|
||||
m.left = iNotFirst;
|
||||
m.bottom = iControlOverhang;
|
||||
pButton->Dock( Pos::Left );
|
||||
}
|
||||
|
||||
if ( m_iDock == Pos::Left )
|
||||
{
|
||||
m.left = iActive * 2;
|
||||
m.right = iControlOverhang;
|
||||
m.top = iNotFirst;
|
||||
pButton->Dock( Pos::Top );
|
||||
}
|
||||
|
||||
if ( m_iDock == Pos::Right )
|
||||
{
|
||||
m.right = iActive * 2;
|
||||
m.left = iControlOverhang;
|
||||
m.top = iNotFirst;
|
||||
pButton->Dock( Pos::Top );
|
||||
}
|
||||
|
||||
if ( m_iDock == Pos::Bottom )
|
||||
{
|
||||
m.bottom = iActive;
|
||||
m.left = iNotFirst;
|
||||
m.top = iControlOverhang;
|
||||
pButton->Dock( Pos::Left );
|
||||
}
|
||||
|
||||
pLargestTab.x = Utility::Max( pLargestTab.x, pButton->Width() );
|
||||
pLargestTab.y = Utility::Max( pLargestTab.y, pButton->Height() );
|
||||
|
||||
pButton->SetMargin( m );
|
||||
iNum++;
|
||||
}
|
||||
|
||||
if ( m_iDock == Pos::Top || m_iDock == Pos::Bottom )
|
||||
SetSize( Width(), pLargestTab.y );
|
||||
|
||||
if ( m_iDock == Pos::Left || m_iDock == Pos::Right )
|
||||
SetSize( pLargestTab.x, Height() );
|
||||
|
||||
BaseClass::Layout( skin );
|
||||
}
|
||||
|
||||
void TabStrip::DragAndDrop_HoverEnter( Gwen::DragAndDrop::Package* /*pPackage*/, int /*x*/, int /*y*/ )
|
||||
{
|
||||
if ( m_TabDragControl )
|
||||
{
|
||||
Debug::Msg( "ERROR! TabStrip::DragAndDrop_HoverEnter\n" );
|
||||
}
|
||||
|
||||
m_TabDragControl = new ControlsInternal::Highlight( this );
|
||||
m_TabDragControl->SetMouseInputEnabled( false );
|
||||
m_TabDragControl->SetSize( 3, Height() );
|
||||
}
|
||||
|
||||
void TabStrip::DragAndDrop_HoverLeave( Gwen::DragAndDrop::Package* /*pPackage*/ )
|
||||
{
|
||||
delete m_TabDragControl;
|
||||
m_TabDragControl = NULL;
|
||||
}
|
||||
|
||||
void TabStrip::DragAndDrop_Hover( Gwen::DragAndDrop::Package* /*pPackage*/, int x, int y )
|
||||
{
|
||||
Gwen::Point LocalPos = CanvasPosToLocal( Gwen::Point( x, y ) );
|
||||
|
||||
Base* DroppedOn = GetControlAt( LocalPos.x, LocalPos.y );
|
||||
if ( DroppedOn && DroppedOn != this )
|
||||
{
|
||||
Gwen::Point DropPos = DroppedOn->CanvasPosToLocal( Gwen::Point( x, y ) );
|
||||
m_TabDragControl->SetBounds( Gwen::Rect( 0, 0, 3, Height() ) );
|
||||
m_TabDragControl->BringToFront();
|
||||
m_TabDragControl->SetPos( DroppedOn->X() - 1, 0 );
|
||||
|
||||
if ( DropPos.x > DroppedOn->Width() / 2 )
|
||||
{
|
||||
m_TabDragControl->MoveBy( DroppedOn->Width()-1, 0 );
|
||||
}
|
||||
m_TabDragControl->Dock( Pos::None );
|
||||
}
|
||||
else
|
||||
{
|
||||
m_TabDragControl->Dock( Pos::Left );
|
||||
m_TabDragControl->BringToFront();
|
||||
}
|
||||
}
|
||||
|
||||
void TabStrip::SetTabPosition( int iPos )
|
||||
{
|
||||
Dock( iPos );
|
||||
}
|
||||
Reference in New Issue
Block a user