/* GWEN Copyright (c) 2010 Facepunch Studios See license in Gwen.h */ #include "Gwen/Controls/ListBox.h" #include "Gwen/Controls/ScrollControl.h" #include "Gwen/InputHandler.h" using namespace Gwen; using namespace Gwen::Controls; class ListBoxRow : public Layout::TableRow { GWEN_CONTROL_INLINE(ListBoxRow, Layout::TableRow) { SetMouseInputEnabled(true); SetSelected(false); } void Render(Skin::Base* skin) { skin->DrawListBoxLine(this, IsSelected()); } bool IsSelected() const { return m_bSelected; } void OnMouseClickLeft(int /*x*/, int /*y*/, bool bDown) { if (bDown && !m_bSelected) { SetSelected(true); onRowSelected.Call(this); } } void SetSelected(bool b) { m_bSelected = b; // TODO: Get these values from the skin. if (b) SetTextColor(Gwen::Colors::White); else SetTextColor(Gwen::Colors::Black); } private: bool m_bSelected; }; GWEN_CONTROL_CONSTRUCTOR(ListBox) { m_ScrollControl = new ScrollControl(this); m_ScrollControl->Dock(Pos::Fill); m_ScrollControl->SetScroll(false, true); m_ScrollControl->SetAutoHideBars(true); m_ScrollControl->SetMargin(Margin(1, 1, 1, 1)); m_InnerPanel = m_ScrollControl; m_Table = new Controls::Layout::Table(this); m_Table->Dock(Pos::Top); m_Table->SetColumnCount(1); m_bMultiSelect = false; } void ListBox::OnChildBoundsChanged(Gwen::Rect /*oldChildBounds*/, Base* /*pChild*/) { m_ScrollControl->UpdateScrollBars(); } Layout::TableRow* ListBox::AddItem(const String& strLabel, const String& strName) { return AddItem(Utility::StringToUnicode(strLabel), strName); } Layout::TableRow* ListBox::AddItem(const UnicodeString& strLabel, const String& strName) { ListBoxRow* pRow = new ListBoxRow(this); m_Table->AddRow(pRow); pRow->SetCellText(0, strLabel); pRow->SetName(strName); pRow->onRowSelected.Add(this, &ListBox::OnRowSelected); m_Table->SizeToContents(); return pRow; } void ListBox::Render(Skin::Base* skin) { skin->DrawListBox(this); } void ListBox::UnselectAll() { std::list::iterator it = m_SelectedRows.begin(); while (it != m_SelectedRows.end()) { ListBoxRow* pRow = static_cast(*it); it = m_SelectedRows.erase(it); pRow->SetSelected(false); } } void ListBox::OnRowSelected(Base* pControl) { ListBoxRow* pRow = static_cast(pControl); if (!AllowMultiSelect() || !Gwen::Input::IsShiftDown()) { UnselectAll(); } m_SelectedRows.push_back(pRow); onRowSelected.Call(this); } Layout::TableRow* ListBox::GetSelectedRow() { if (m_SelectedRows.empty()) return NULL; return *m_SelectedRows.begin(); } void ListBox::Clear() { UnselectAll(); m_Table->Clear(); }