UIListView.cpp 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. // Copyright (c) 2014-2015, THUNDERBEAST GAMES LLC All rights reserved
  2. // Please see LICENSE.md in repository root for license information
  3. // https://github.com/AtomicGameEngine/AtomicGameEngine
  4. #include "AtomicEditor.h"
  5. #include <Atomic/UI/UI.h>
  6. #include <Atomic/IO/Log.h>
  7. #include "UIListView.h"
  8. using namespace tb;
  9. namespace AtomicEditor
  10. {
  11. ListViewItem* ListViewItem::AddChild(const char *text, const char* icon, const TBID &id)
  12. {
  13. ListViewItem* child = new ListViewItem(text, id, icon, source_);
  14. child->parent_ = this;
  15. child->depth_ = depth_ + 1;
  16. source_->AddItem(child);
  17. children_.Push(child);
  18. return child;
  19. }
  20. ListViewItemWidget::ListViewItemWidget(ListViewItem *item, ListViewItemSource *source,
  21. TBSelectItemViewer *sourceviewer, int index)
  22. : source_(source)
  23. , sourceviewer_(sourceviewer)
  24. , index_(index)
  25. , item_(item)
  26. {
  27. SetLayoutDistribution(LAYOUT_DISTRIBUTION_GRAVITY);
  28. SetLayoutDistributionPosition(LAYOUT_DISTRIBUTION_POSITION_LEFT_TOP);
  29. SetPaintOverflowFadeout(false);
  30. item_->widget_ = this;
  31. for (int i = 0; i < item->depth_; i++)
  32. {
  33. LayoutParams lp;
  34. lp.SetWidth(6);
  35. lp.SetHeight(4);
  36. TBWidget* spacer = new TBWidget();
  37. spacer->SetLayoutParams(lp);
  38. GetContentRoot()->AddChild(spacer);
  39. }
  40. if (item->icon_.Length())
  41. {
  42. TBSkinImage* skinImage = new TBSkinImage(TBIDC(item->icon_.CString()));
  43. skinImage->SetIgnoreInput(true);
  44. GetContentRoot()->AddChild(skinImage);
  45. }
  46. TBFontDescription fd;
  47. fd.SetID(TBIDC("Vera"));
  48. fd.SetSize(11);
  49. TBTextField* tfield = new TBTextField();
  50. tfield->SetIgnoreInput(true);
  51. tfield->SetSkinBg(TBIDC("Folder"));
  52. tfield->SetText(item->str);
  53. tfield->SetFontDescription(fd);
  54. SetSkinBg(TBIDC("TBSelectItem"));
  55. GetContentRoot()->AddChild(tfield);
  56. SetID(item->id);
  57. }
  58. bool ListViewItemWidget::OnEvent(const TBWidgetEvent &ev)
  59. {
  60. if (ev.type == EVENT_TYPE_WHEEL)
  61. {
  62. return false;
  63. }
  64. // get clicks this way, not sure we want to
  65. if (ev.type == EVENT_TYPE_CLICK && ev.target->GetID() == item_->id)
  66. {
  67. item_->SetExpanded(!item_->GetExpanded());
  68. source_->list_->InvalidateList();
  69. // want to bubble
  70. return false;
  71. }
  72. return TBLayout::OnEvent(ev);
  73. }
  74. bool ListViewItemSource::Filter(int index, const char *filter)
  75. {
  76. ListViewItem* item = GetItem(index);
  77. if (!item->parent_)
  78. return true;
  79. if (item->parent_->GetExpanded())
  80. return true;
  81. return false;
  82. }
  83. TBWidget *ListViewItemSource::CreateItemWidget(int index, TBSelectItemViewer *viewer)
  84. {
  85. ListViewItem* item = GetItem(index);
  86. if (TBLayout *layout = new ListViewItemWidget(item, this, viewer, index))
  87. return layout;
  88. return nullptr;
  89. }
  90. ListView::ListView(Context* context, const TBID& id) :
  91. AEWidget(context),
  92. rootList_(0),
  93. source_(0)
  94. {
  95. rootList_ = new TBSelectList();
  96. rootList_->SetID(id);
  97. // dummy filter so filter is called
  98. rootList_->SetFilter(" ");
  99. delegate_->SetGravity(WIDGET_GRAVITY_ALL);
  100. rootList_->SetGravity(WIDGET_GRAVITY_ALL);
  101. source_ = new ListViewItemSource(rootList_);
  102. rootList_->SetSource(source_);
  103. delegate_->AddChild(rootList_);
  104. }
  105. ListView::~ListView()
  106. {
  107. }
  108. void ListView::SelectItemByID(const TBID &id)
  109. {
  110. for (int i = 0; i < source_->GetNumItems(); i++)
  111. {
  112. ListViewItem* item = source_->GetItem(i);
  113. if (id == item->id)
  114. {
  115. item->SetExpanded(true);
  116. rootList_->SetValue(i);
  117. rootList_->InvalidateList();
  118. return;
  119. }
  120. }
  121. }
  122. bool ListView::OnEvent(const TBWidgetEvent &ev)
  123. {
  124. return false;
  125. }
  126. }