tb_widget_skin_condition_context.cpp 3.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  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_widget_skin_condition_context.h"
  6. #include "tb_widgets_common.h"
  7. #include "tb_window.h"
  8. #include "tb_tab_container.h"
  9. namespace tb {
  10. // == TBWidgetSkinConditionContext ======================================================
  11. bool TBWidgetSkinConditionContext::GetCondition(TBSkinCondition::TARGET target, const TBSkinCondition::CONDITION_INFO &info)
  12. {
  13. switch (target)
  14. {
  15. case TBSkinCondition::TARGET_THIS:
  16. return GetCondition(m_widget, info);
  17. case TBSkinCondition::TARGET_PARENT:
  18. return m_widget->GetParent() && GetCondition(m_widget->GetParent(), info);
  19. case TBSkinCondition::TARGET_ANCESTORS:
  20. {
  21. TBWidget *widget = m_widget->GetParent();
  22. while (widget)
  23. {
  24. if (GetCondition(widget, info))
  25. return true;
  26. widget = widget->GetParent();
  27. }
  28. }
  29. case TBSkinCondition::TARGET_PREV_SIBLING:
  30. return m_widget->GetPrev() && GetCondition(m_widget->GetPrev(), info);
  31. case TBSkinCondition::TARGET_NEXT_SIBLING:
  32. return m_widget->GetNext() && GetCondition(m_widget->GetNext(), info);
  33. }
  34. return false;
  35. }
  36. bool TBWidgetSkinConditionContext::GetCondition(TBWidget *widget, const TBSkinCondition::CONDITION_INFO &info)
  37. {
  38. switch (info.prop)
  39. {
  40. case TBSkinCondition::PROPERTY_SKIN:
  41. return widget->GetSkinBg() == info.value;
  42. case TBSkinCondition::PROPERTY_WINDOW_ACTIVE:
  43. if (TBWindow *window = widget->GetParentWindow())
  44. return window->IsActive();
  45. return false;
  46. case TBSkinCondition::PROPERTY_AXIS:
  47. return TBID(widget->GetAxis() == AXIS_X ? "x" : "y") == info.value;
  48. case TBSkinCondition::PROPERTY_ALIGN:
  49. if (TBTabContainer *tc = TBSafeCast<TBTabContainer>(widget))
  50. {
  51. TBID widget_align;
  52. if (tc->GetAlignment() == TB_ALIGN_LEFT) widget_align = TBIDC("left");
  53. else if (tc->GetAlignment() == TB_ALIGN_TOP) widget_align = TBIDC("top");
  54. else if (tc->GetAlignment() == TB_ALIGN_RIGHT) widget_align = TBIDC("right");
  55. else if (tc->GetAlignment() == TB_ALIGN_BOTTOM) widget_align = TBIDC("bottom");
  56. return widget_align == info.value;
  57. }
  58. return false;
  59. case TBSkinCondition::PROPERTY_ID:
  60. return widget->GetID() == info.value;
  61. case TBSkinCondition::PROPERTY_STATE:
  62. return !!(widget->GetAutoState() & info.value);
  63. case TBSkinCondition::PROPERTY_VALUE:
  64. return widget->GetValue() == (int) info.value;
  65. case TBSkinCondition::PROPERTY_HOVER:
  66. return TBWidget::hovered_widget && widget->IsAncestorOf(TBWidget::hovered_widget);
  67. case TBSkinCondition::PROPERTY_CAPTURE:
  68. return TBWidget::captured_widget && widget->IsAncestorOf(TBWidget::captured_widget);
  69. case TBSkinCondition::PROPERTY_FOCUS:
  70. return TBWidget::focused_widget && widget->IsAncestorOf(TBWidget::focused_widget);
  71. case TBSkinCondition::PROPERTY_CUSTOM:
  72. return widget->GetCustomSkinCondition(info);
  73. }
  74. return false;
  75. }
  76. }; // namespace tb