Apply clang-format-all.sh using the _clang-format file through all the cpp/.h files. make sure not to apply it to certain serialization structures, since some parser expects the * as part of the name, instead of type. This commit contains no other changes aside from adding and applying clang-format-all.sh
179 lines
4.0 KiB
C++
179 lines
4.0 KiB
C++
/*
|
|
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);
|
|
} |