Files
bullet3/examples/ThirdPartyLibs/Gwen/Controls/ComboBox.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

197 lines
3.7 KiB
C++

/*
GWEN
Copyright (c) 2010 Facepunch Studios
See license in Gwen.h
*/
#include "Gwen/Controls/ComboBox.h"
#include "Gwen/Controls/Menu.h"
using namespace Gwen;
using namespace Gwen::Controls;
using namespace Gwen::ControlsInternal;
class GWEN_EXPORT DownArrow : public Controls::Base
{
public:
GWEN_CONTROL_INLINE(DownArrow, Controls::Base)
{
SetMouseInputEnabled(true);
SetSize(15, 15);
}
void Render(Skin::Base* skin)
{
skin->DrawArrowDown(this->m_Bounds);
}
void SetComboBox(ComboBox* p) { m_ComboBox = p; }
protected:
ComboBox* m_ComboBox;
};
GWEN_CONTROL_CONSTRUCTOR(ComboBox)
{
SetSize(100, 20);
SetMouseInputEnabled(true);
m_Menu = new Menu(this);
m_Menu->SetHidden(true);
m_Menu->SetDisableIconMargin(true);
m_Menu->SetTabable(false);
ComboBoxButton* m_OpenButton = new ComboBoxButton(this);
m_OpenButton->onDown.Add(this, &ComboBox::OpenButtonPressed);
m_OpenButton->Dock(Pos::Right);
m_OpenButton->SetMargin(Margin(2, 2, 2, 2));
m_OpenButton->SetWidth(16);
m_OpenButton->SetTabable(false);
m_SelectedItem = NULL;
SetAlignment(Gwen::Pos::Left | Gwen::Pos::CenterV);
SetText(L"");
SetMargin(Margin(3, 0, 0, 0));
SetTabable(true);
}
MenuItem* ComboBox::AddItem(const UnicodeString& strLabel, const String& strName, Gwen::Event::Handler* pHandler, Gwen::Event::Handler::Function fn)
{
MenuItem* pItem = m_Menu->AddItem(strLabel, L"", pHandler, fn);
pItem->SetName(strName);
pItem->onMenuItemSelected.Add(this, &ComboBox::OnItemSelected);
//Default
if (m_SelectedItem == NULL)
OnItemSelected(pItem);
return pItem;
}
void ComboBox::Render(Skin::Base* skin)
{
skin->DrawComboBox(this);
}
void ComboBox::OpenButtonPressed(Controls::Base* /*pControl*/)
{
OnPress();
}
void ComboBox::OnPress()
{
bool bWasMenuHidden = m_Menu->Hidden();
GetCanvas()->CloseMenus();
if (bWasMenuHidden)
{
OpenList();
}
else
{
m_Menu->SetHidden(true);
}
}
void ComboBox::ClearItems()
{
if (m_Menu)
{
m_Menu->ClearItems();
}
}
void ComboBox::OnItemSelected(Controls::Base* pControl)
{
//Convert selected to a menu item
MenuItem* pItem = pControl->DynamicCastMenuItem();
if (!pItem) return;
m_SelectedItem = pItem;
SetText(m_SelectedItem->GetText());
m_Menu->SetHidden(true);
onSelection.Call(this);
Focus();
Invalidate();
}
void ComboBox::OnLostKeyboardFocus()
{
SetTextColor(Color(0, 0, 0, 255));
}
void ComboBox::OnKeyboardFocus()
{
//Until we add the blue highlighting again
SetTextColor(Color(0, 0, 0, 255));
//m_SelectedText->SetTextColor( Color( 255, 255, 255, 255 ) );
}
Gwen::Controls::Label* ComboBox::GetSelectedItem()
{
return m_SelectedItem;
}
bool ComboBox::IsMenuOpen()
{
return m_Menu && !m_Menu->Hidden();
}
void ComboBox::OpenList()
{
if (!m_Menu) return;
m_Menu->SetParent(GetCanvas());
m_Menu->SetHidden(false);
m_Menu->BringToFront();
Gwen::Point p = LocalPosToCanvas(Gwen::Point(0, 0));
m_Menu->SetBounds(Gwen::Rect(p.x, p.y + Height(), Width(), m_Menu->Height()));
}
void ComboBox::CloseList()
{
}
bool ComboBox::OnKeyUp(bool bDown)
{
if (bDown)
{
Base::List& children = m_Menu->GetChildren();
Base::List::reverse_iterator it = std::find(children.rbegin(), children.rend(), m_SelectedItem);
if (it != children.rend() && (++it != children.rend()))
{
Base* pUpElement = *it;
OnItemSelected(pUpElement);
}
}
return true;
}
bool ComboBox::OnKeyDown(bool bDown)
{
if (bDown)
{
Base::List& children = m_Menu->GetChildren();
Base::List::iterator it = std::find(children.begin(), children.end(), m_SelectedItem);
if (it != children.end() && (++it != children.end()))
{
Base* pDownElement = *it;
OnItemSelected(pDownElement);
}
}
return true;
}
void ComboBox::RenderFocus(Gwen::Skin::Base* /*skin*/)
{
}