UIMenubar.cpp 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  1. #include <TurboBadger/tb_menu_window.h>
  2. #include <TurboBadger/tb_select.h>
  3. #include "UIMenubar.h"
  4. using namespace tb;
  5. namespace tb {
  6. // THIS MUST MATCH TBSimpleLayoutItemWidget in tb_select_item.cpp
  7. class TBSimpleLayoutItemWidget : public TBLayout, private TBWidgetListener
  8. {
  9. public:
  10. TBSimpleLayoutItemWidget(TBID image, TBSelectItemSource *source, const char *str);
  11. ~TBSimpleLayoutItemWidget();
  12. virtual bool OnEvent(const TBWidgetEvent &ev);
  13. private:
  14. TBSelectItemSource *m_source;
  15. TBTextField m_textfield;
  16. TBSkinImage m_image;
  17. TBSkinImage m_image_arrow;
  18. TBMenuWindow *m_menu; ///< Points to the submenu window if opened
  19. virtual void OnWidgetDelete(TBWidget *widget);
  20. void OpenSubMenu();
  21. void CloseSubMenu();
  22. };
  23. }
  24. namespace Atomic
  25. {
  26. class MenubarItem : public TBGenericStringItem
  27. {
  28. public:
  29. MenubarItem(const char *str, const TBID &id = TBID((uint32)0), const String& shortcut = String::EMPTY)
  30. : TBGenericStringItem(str, id), shortcut_(shortcut)
  31. {
  32. }
  33. MenubarItem(const char *str, TBSelectItemSource *sub_source) : TBGenericStringItem(str, sub_source) {}
  34. String shortcut_;
  35. };
  36. class MenubarItemSource : public TBSelectItemSourceList<MenubarItem>
  37. {
  38. public:
  39. virtual bool Filter(int index, const char *filter);
  40. virtual TBWidget *CreateItemWidget(int index, TBSelectItemViewer *viewer);
  41. };
  42. class MenubarItemWidget : public TBLayout
  43. {
  44. public:
  45. MenubarItemWidget(MenubarItem *item, MenubarItemSource *source, TBSelectItemViewer *source_viewer, int index);
  46. virtual bool OnEvent(const TBWidgetEvent &ev);
  47. private:
  48. MenubarItemSource *m_source;
  49. TBSelectItemViewer *m_source_viewer;
  50. int m_index;
  51. };
  52. // UI IMPLEMENTATION
  53. UIMenuItem::UIMenuItem(Context* context, const String& str, const String& id, const String& shortcut, const String& skinBg):
  54. UISelectItem(context, str, id),
  55. shortcut_(shortcut),
  56. skinBg_(skinBg)
  57. {
  58. }
  59. UIMenuItem::~UIMenuItem()
  60. {
  61. }
  62. tb::TBGenericStringItem* UIMenuItem::GetTBItem()
  63. {
  64. MenubarItem* item;
  65. if (!subSource_)
  66. {
  67. item = new MenubarItem(str_.CString(), id_, shortcut_);
  68. }
  69. else
  70. {
  71. item = new MenubarItem(str_.CString(), subSource_->GetTBItemSource());
  72. }
  73. if (skinBg_.Length())
  74. {
  75. item->SetSkinImage(TBIDC(skinBg_.CString()));
  76. }
  77. return item;
  78. }
  79. tb::TBSelectItemSource* UIMenuItemSource::GetTBItemSource()
  80. {
  81. // caller's responsibility to clean up
  82. MenubarItemSource* src = new MenubarItemSource();
  83. for (List<SharedPtr<UISelectItem> >::Iterator itr = items_.Begin(); itr != items_.End(); itr++)
  84. {
  85. MenubarItem* tbitem = (MenubarItem*) (*itr)->GetTBItem();
  86. src->AddItem(tbitem);
  87. }
  88. return src;
  89. }
  90. UIMenuItemSource::UIMenuItemSource(Context* context) : UISelectItemSource(context)
  91. {
  92. }
  93. UIMenuItemSource::~UIMenuItemSource()
  94. {
  95. }
  96. // WIDGET IMPLEMENTATION
  97. MenubarItemWidget::MenubarItemWidget(MenubarItem *item, MenubarItemSource *source,
  98. TBSelectItemViewer *source_viewer, int index)
  99. : m_source(source)
  100. , m_source_viewer(source_viewer)
  101. , m_index(index)
  102. {
  103. SetSkinBg(TBIDC("TBSelectItem"));
  104. SetLayoutDistribution(LAYOUT_DISTRIBUTION_GRAVITY);
  105. SetLayoutDistributionPosition(LAYOUT_DISTRIBUTION_POSITION_LEFT_TOP);
  106. SetPaintOverflowFadeout(false);
  107. TBWidget* root = GetContentRoot();
  108. TBFontDescription fd;
  109. fd.SetID(TBIDC("Vera"));
  110. fd.SetSize(12);
  111. TBTextField* text = new TBTextField();
  112. text->SetIgnoreInput(true);
  113. text->SetText(item->str);
  114. text->SetFontDescription(fd);
  115. root->AddChild(text);
  116. if (item->shortcut_.Length())
  117. {
  118. TBWidget* spacer = new TBWidget();
  119. spacer->SetIgnoreInput(true);
  120. spacer->SetGravity(WIDGET_GRAVITY_LEFT_RIGHT);
  121. root->AddChild(spacer);
  122. TBTextField* shortcut = new TBTextField();
  123. shortcut->SetIgnoreInput(true);
  124. shortcut->SetText(item->shortcut_.CString());
  125. shortcut->SetFontDescription(fd);
  126. shortcut->SetGravity(WIDGET_GRAVITY_RIGHT);
  127. root->AddChild(shortcut);
  128. }
  129. }
  130. bool MenubarItemWidget::OnEvent(const TBWidgetEvent &ev)
  131. {
  132. if (m_source && ev.type == EVENT_TYPE_CLICK && ev.target == this)
  133. {
  134. return false;
  135. }
  136. return false;
  137. }
  138. bool MenubarItemSource::Filter(int index, const char *filter)
  139. {
  140. return true;
  141. }
  142. TBWidget *MenubarItemSource::CreateItemWidget(int index, TBSelectItemViewer *viewer)
  143. {
  144. const char *string = GetItemString(index);
  145. TBSelectItemSource *sub_source = GetItemSubSource(index);
  146. TBID image = GetItemImage(index);
  147. if (sub_source || image)
  148. {
  149. if (TBSimpleLayoutItemWidget *itemwidget = new TBSimpleLayoutItemWidget(image, sub_source, string))
  150. {
  151. itemwidget->SetID(GetItem(index)->id);
  152. return itemwidget;
  153. }
  154. }
  155. else if (string && *string == '-')
  156. {
  157. if (TBSeparator *separator = new TBSeparator)
  158. {
  159. separator->SetGravity(WIDGET_GRAVITY_ALL);
  160. separator->SetSkinBg(TBIDC("AESeparator"));
  161. return separator;
  162. }
  163. }
  164. else if (TBLayout *layout = new MenubarItemWidget(GetItem(index), this, viewer, index))
  165. {
  166. layout->SetID(GetItem(index)->id);
  167. return layout;
  168. }
  169. return NULL;
  170. }
  171. }