tb_toggle_container.cpp 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. // ================================================================================
  2. // == This file is a part of Turbo Badger. (C) 2011-2014, Emil Segerås ==
  3. // == See tb_core.h for more information. ==
  4. // ================================================================================
  5. #include "tb_toggle_container.h"
  6. #include "tb_widgets_reader.h"
  7. #include "tb_node_tree.h"
  8. namespace tb {
  9. // == TBSectionHeader =====================================
  10. TBSectionHeader::TBSectionHeader()
  11. {
  12. SetSkinBg(TBIDC("TBSectionHeader"));
  13. SetGravity(WIDGET_GRAVITY_LEFT | WIDGET_GRAVITY_RIGHT);
  14. SetToggleMode(true);
  15. }
  16. bool TBSectionHeader::OnEvent(const TBWidgetEvent &ev)
  17. {
  18. if (ev.target == this && ev.type == EVENT_TYPE_CHANGED && GetParent()->GetParent())
  19. {
  20. if (TBSection *section = TBSafeCast<TBSection>(GetParent()->GetParent()))
  21. {
  22. section->GetContainer()->SetValue(GetValue());
  23. // Try to scroll the container into view when expanded
  24. section->SetPendingScrollIntoView(GetValue() ? true : false);
  25. }
  26. }
  27. return TBButton::OnEvent(ev);
  28. }
  29. // == TBSectionHeader =====================================
  30. TBSection::TBSection()
  31. : m_pending_scroll(false)
  32. {
  33. SetGravity(WIDGET_GRAVITY_LEFT | WIDGET_GRAVITY_RIGHT);
  34. SetSkinBg(TBIDC("TBSection"), WIDGET_INVOKE_INFO_NO_CALLBACKS);
  35. m_layout.SetSkinBg(TBIDC("TBSection.layout"), WIDGET_INVOKE_INFO_NO_CALLBACKS);
  36. m_toggle_container.SetSkinBg(TBIDC("TBSection.container"));
  37. m_toggle_container.SetToggle(TBToggleContainer::TOGGLE_EXPANDED);
  38. m_toggle_container.SetGravity(WIDGET_GRAVITY_ALL);
  39. m_layout.SetAxis(AXIS_Y);
  40. m_layout.SetGravity(WIDGET_GRAVITY_ALL);
  41. m_layout.SetLayoutSize(LAYOUT_SIZE_AVAILABLE);
  42. // ATOMIC BEGIN
  43. m_toggle_container_layout.SetSkinBg(TBIDC("TBSection.layout"), WIDGET_INVOKE_INFO_NO_CALLBACKS);
  44. m_toggle_container_layout.SetAxis(AXIS_Y);
  45. m_toggle_container_layout.SetGravity(WIDGET_GRAVITY_ALL);
  46. m_toggle_container_layout.SetLayoutSize(LAYOUT_SIZE_AVAILABLE);
  47. m_toggle_container.AddChild(&m_toggle_container_layout);
  48. // ATOMIC END
  49. AddChild(&m_layout);
  50. m_layout.AddChild(&m_header);
  51. m_layout.AddChild(&m_toggle_container);
  52. }
  53. TBSection::~TBSection()
  54. {
  55. // ATOMIC BEGIN
  56. while (TBWidget* child = m_toggle_container_layout.GetFirstChild())
  57. {
  58. m_toggle_container_layout.RemoveChild(child);
  59. }
  60. m_toggle_container.RemoveChild(&m_toggle_container_layout);
  61. // ATOMIC END
  62. m_layout.RemoveChild(&m_toggle_container);
  63. m_layout.RemoveChild(&m_header);
  64. RemoveChild(&m_layout);
  65. }
  66. void TBSection::SetValue(int value)
  67. {
  68. m_header.SetValue(value);
  69. m_toggle_container.SetValue(value);
  70. }
  71. // ATOMIC BEGIN
  72. void TBSection::AddToggleChild(TBWidget *child, WIDGET_Z z, WIDGET_INVOKE_INFO info)
  73. {
  74. m_toggle_container_layout.AddChild(child, z, info);
  75. }
  76. void TBSection::AddToggleChildRelative(TBWidget *child, WIDGET_Z_REL z, TBWidget *reference, WIDGET_INVOKE_INFO info)
  77. {
  78. m_toggle_container_layout.AddChildRelative(child, z, reference, info);
  79. }
  80. void TBSection::RemoveToggleChild(TBWidget* child)
  81. {
  82. m_toggle_container_layout.RemoveChild(child);
  83. }
  84. void TBSection::DeleteAllToggleChildren()
  85. {
  86. m_toggle_container_layout.DeleteAllChildren();
  87. }
  88. TBWidget* TBSection::GetFirstToggleChild()
  89. {
  90. return m_toggle_container_layout.GetFirstChild();
  91. }
  92. TBWidget* TBSection::GetToggleWidgetById(const TBID &id)
  93. {
  94. return m_toggle_container_layout.GetWidgetByTouchId(id);
  95. }
  96. // ATOMIC END
  97. void TBSection::OnProcessAfterChildren()
  98. {
  99. if (m_pending_scroll)
  100. {
  101. m_pending_scroll = false;
  102. ScrollIntoViewRecursive();
  103. }
  104. }
  105. PreferredSize TBSection::OnCalculatePreferredSize(const SizeConstraints &constraints)
  106. {
  107. PreferredSize ps = TBWidget::OnCalculatePreferredContentSize(constraints);
  108. // We should not grow larger than we are, when there's extra space available.
  109. ps.max_h = ps.pref_h;
  110. return ps;
  111. }
  112. // == TBToggleContainer ===================================
  113. TBToggleContainer::TBToggleContainer()
  114. : m_toggle(TOGGLE_NOTHING)
  115. , m_invert(false)
  116. , m_value(0)
  117. {
  118. SetSkinBg(TBIDC("TBToggleContainer"), WIDGET_INVOKE_INFO_NO_CALLBACKS);
  119. }
  120. void TBToggleContainer::SetToggle(TOGGLE toggle)
  121. {
  122. if (toggle == m_toggle)
  123. return;
  124. if (m_toggle == TOGGLE_EXPANDED)
  125. InvalidateLayout(INVALIDATE_LAYOUT_RECURSIVE);
  126. m_toggle = toggle;
  127. UpdateInternal();
  128. }
  129. void TBToggleContainer::SetInvert(bool invert)
  130. {
  131. if (invert == m_invert)
  132. return;
  133. m_invert = invert;
  134. UpdateInternal();
  135. }
  136. void TBToggleContainer::SetValue(int value)
  137. {
  138. if (value == m_value)
  139. return;
  140. m_value = value;
  141. UpdateInternal();
  142. InvalidateSkinStates();
  143. }
  144. void TBToggleContainer::UpdateInternal()
  145. {
  146. bool on = GetIsOn();
  147. switch (m_toggle)
  148. {
  149. case TOGGLE_NOTHING:
  150. break;
  151. case TOGGLE_ENABLED:
  152. SetState(WIDGET_STATE_DISABLED, !on);
  153. break;
  154. case TOGGLE_OPACITY:
  155. SetOpacity(on ? 1.f : 0);
  156. break;
  157. case TOGGLE_EXPANDED:
  158. SetVisibilility(on ? WIDGET_VISIBILITY_VISIBLE : WIDGET_VISIBILITY_GONE);
  159. // Also disable when collapsed so tab focus skips the children.
  160. SetState(WIDGET_STATE_DISABLED, !on);
  161. break;
  162. };
  163. }
  164. }; // namespace tb