Files
bullet3/examples/ThirdPartyLibs/Gwen/Controls/ScrollControl.cpp
erwincoumans ab8f16961e Code-style consistency improvement:
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
2018-09-23 14:17:31 -07:00

244 lines
6.1 KiB
C++

/*
GWEN
Copyright (c) 2010 Facepunch Studios
See license in Gwen.h
*/
#include "Gwen/Controls/ScrollControl.h"
#include "Gwen/Controls/ScrollBar.h"
#include "Gwen/Controls/VerticalScrollBar.h"
#include "Gwen/Controls/HorizontalScrollBar.h"
#include "Gwen/Utility.h"
using namespace Gwen;
using namespace Gwen::Controls;
using namespace Gwen::ControlsInternal;
GWEN_CONTROL_CONSTRUCTOR(ScrollControl)
{
SetMouseInputEnabled(false);
m_VerticalScrollBar = new VerticalScrollBar(this);
m_VerticalScrollBar->Dock(Pos::Right);
m_VerticalScrollBar->onBarMoved.Add(this, &ScrollControl::VBarMoved);
m_VerticalScrollBar->SetNudgeAmount(30);
m_bCanScrollV = true;
m_HorizontalScrollBar = new HorizontalScrollBar(this);
m_HorizontalScrollBar->Dock(Pos::Bottom);
m_HorizontalScrollBar->onBarMoved.Add(this, &ScrollControl::HBarMoved);
m_bCanScrollH = true;
m_HorizontalScrollBar->SetNudgeAmount(30);
m_InnerPanel = new Base(this);
m_InnerPanel->SetPos(0, 0);
m_InnerPanel->SetMargin(Margin(5, 5, 5, 5));
m_InnerPanel->SendToBack();
m_InnerPanel->SetMouseInputEnabled(false);
m_bAutoHideBars = false;
}
void ScrollControl::SetScroll(bool h, bool v)
{
m_bCanScrollV = v;
m_bCanScrollH = h;
m_VerticalScrollBar->SetHidden(!m_bCanScrollV);
m_HorizontalScrollBar->SetHidden(!m_bCanScrollH);
}
void ScrollControl::SetInnerSize(int w, int h)
{
m_InnerPanel->SetSize(w, h);
}
void ScrollControl::VBarMoved(Controls::Base* /*control*/)
{
Invalidate();
}
void ScrollControl::HBarMoved(Controls::Base* /*control*/)
{
Invalidate();
}
void ScrollControl::OnChildBoundsChanged(Gwen::Rect /*oldChildBounds*/, Base* /*pChild*/)
{
UpdateScrollBars();
}
void ScrollControl::Layout(Skin::Base* skin)
{
UpdateScrollBars();
BaseClass::Layout(skin);
}
bool ScrollControl::OnMouseWheeled(int iDelta)
{
if (CanScrollV() && m_VerticalScrollBar->Visible())
{
if (m_VerticalScrollBar->SetScrolledAmount(m_VerticalScrollBar->GetScrolledAmount() - m_VerticalScrollBar->GetNudgeAmount() * ((float)iDelta / 60.0f), true))
return true;
}
if (CanScrollH() && m_HorizontalScrollBar->Visible())
{
if (m_HorizontalScrollBar->SetScrolledAmount(m_HorizontalScrollBar->GetScrolledAmount() - m_HorizontalScrollBar->GetNudgeAmount() * ((float)iDelta / 60.0f), true))
return true;
}
return false;
}
void ScrollControl::Render(Skin::Base* skin)
{
#if 0
// Debug render - this shouldn't render ANYTHING REALLY - it should be up to the parent!
Gwen::Rect rect = GetRenderBounds();
Gwen::Renderer::Base* render = skin->GetRender();
render->SetDrawColor( Gwen::Color( 255, 255, 0, 100 ) );
render->DrawFilledRect( rect );
render->SetDrawColor( Gwen::Color( 255, 0, 0, 100 ) );
render->DrawFilledRect( m_InnerPanel->GetBounds() );
render->RenderText( skin->GetDefaultFont(), Gwen::Point( 0, 0 ), Utility::Format( L"Offset: %i %i", m_InnerPanel->X(), m_InnerPanel->Y() ) );
#else //0
(void)skin;
#endif //0
}
void ScrollControl::UpdateScrollBars()
{
if (!m_InnerPanel)
return;
int childrenWidth = 0;
int childrenHeight = 0;
//Get the max size of all our children together
for (Base::List::iterator iter = m_InnerPanel->Children.begin(); iter != m_InnerPanel->Children.end(); ++iter)
{
Base* pChild = *iter;
childrenWidth = Utility::Max(childrenWidth, pChild->Right());
childrenHeight = Utility::Max(childrenHeight, pChild->Bottom());
}
m_InnerPanel->SetSize(Utility::Max(Width(), childrenWidth), Utility::Max(Height(), childrenHeight));
float hg = (float)(childrenWidth + (m_VerticalScrollBar->Hidden() ? 0 : m_VerticalScrollBar->Width()));
if (hg == 0.f)
hg = 0.00001f;
float wPercent = (float)Width() / hg;
hg = (float)(childrenHeight + (m_HorizontalScrollBar->Hidden() ? 0 : m_HorizontalScrollBar->Height()));
if (hg == 0.f)
hg = 0.00001f;
float hPercent = (float)Height() / hg;
if (m_bCanScrollV)
SetVScrollRequired(hPercent >= 1);
else
m_VerticalScrollBar->SetHidden(true);
if (m_bCanScrollH)
SetHScrollRequired(wPercent >= 1);
else
m_HorizontalScrollBar->SetHidden(true);
m_VerticalScrollBar->SetContentSize(m_InnerPanel->Height());
m_VerticalScrollBar->SetViewableContentSize(Height() - (m_HorizontalScrollBar->Hidden() ? 0 : m_HorizontalScrollBar->Height()));
m_HorizontalScrollBar->SetContentSize(m_InnerPanel->Width());
m_HorizontalScrollBar->SetViewableContentSize(Width() - (m_VerticalScrollBar->Hidden() ? 0 : m_VerticalScrollBar->Width()));
int newInnerPanelPosX = 0;
int newInnerPanelPosY = 0;
if (CanScrollV() && !m_VerticalScrollBar->Hidden())
{
newInnerPanelPosY = -((m_InnerPanel->Height()) - Height() + (m_HorizontalScrollBar->Hidden() ? 0 : m_HorizontalScrollBar->Height())) * m_VerticalScrollBar->GetScrolledAmount();
}
if (CanScrollH() && !m_HorizontalScrollBar->Hidden())
{
newInnerPanelPosX = -((m_InnerPanel->Width()) - Width() + (m_VerticalScrollBar->Hidden() ? 0 : m_VerticalScrollBar->Width())) * m_HorizontalScrollBar->GetScrolledAmount();
}
m_InnerPanel->SetPos(newInnerPanelPosX, newInnerPanelPosY);
}
void ScrollControl::SetVScrollRequired(bool req)
{
if (req)
{
m_VerticalScrollBar->SetScrolledAmount(0, true);
m_VerticalScrollBar->SetDisabled(true);
if (m_bAutoHideBars)
m_VerticalScrollBar->SetHidden(true);
}
else
{
m_VerticalScrollBar->SetHidden(false);
m_VerticalScrollBar->SetDisabled(false);
}
}
void ScrollControl::SetHScrollRequired(bool req)
{
if (req)
{
m_HorizontalScrollBar->SetScrolledAmount(0, true);
m_HorizontalScrollBar->SetDisabled(true);
if (m_bAutoHideBars)
m_HorizontalScrollBar->SetHidden(true);
}
else
{
m_HorizontalScrollBar->SetHidden(false);
m_HorizontalScrollBar->SetDisabled(true);
}
}
void ScrollControl::ScrollToBottom()
{
if (CanScrollV())
{
UpdateScrollBars();
m_VerticalScrollBar->ScrollToBottom();
}
}
void ScrollControl::ScrollToTop()
{
if (CanScrollV())
{
UpdateScrollBars();
m_VerticalScrollBar->ScrollToTop();
}
}
void ScrollControl::ScrollToLeft()
{
if (CanScrollH())
{
UpdateScrollBars();
m_HorizontalScrollBar->ScrollToLeft();
}
}
void ScrollControl::ScrollToRight()
{
if (CanScrollH())
{
UpdateScrollBars();
m_HorizontalScrollBar->ScrollToRight();
}
}
void ScrollControl::Clear()
{
m_InnerPanel->RemoveAllChildren();
}