DISTRHO Plugin Framework
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

233 lines
6.4KB

  1. /*
  2. * DISTRHO Plugin Framework (DPF)
  3. * Copyright (C) 2012-2022 Filipe Coelho <falktx@falktx.com>
  4. *
  5. * Permission to use, copy, modify, and/or distribute this software for any purpose with
  6. * or without fee is hereby granted, provided that the above copyright notice and this
  7. * permission notice appear in all copies.
  8. *
  9. * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD
  10. * TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN
  11. * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
  12. * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
  13. * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
  14. * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  15. */
  16. #include "WidgetPrivateData.hpp"
  17. #include "SubWidgetPrivateData.hpp"
  18. #include "../TopLevelWidget.hpp"
  19. START_NAMESPACE_DGL
  20. #define FOR_EACH_SUBWIDGET(it) \
  21. for (std::list<SubWidget*>::iterator it = subWidgets.begin(); it != subWidgets.end(); ++it)
  22. #define FOR_EACH_SUBWIDGET_INV(rit) \
  23. for (std::list<SubWidget*>::reverse_iterator rit = subWidgets.rbegin(); rit != subWidgets.rend(); ++rit)
  24. // -----------------------------------------------------------------------
  25. Widget::PrivateData::PrivateData(Widget* const s, TopLevelWidget* const tlw)
  26. : self(s),
  27. topLevelWidget(tlw),
  28. parentWidget(nullptr),
  29. id(0),
  30. name(nullptr),
  31. needsScaling(false),
  32. visible(true),
  33. size(0, 0),
  34. subWidgets() {}
  35. Widget::PrivateData::PrivateData(Widget* const s, Widget* const pw)
  36. : self(s),
  37. topLevelWidget(findTopLevelWidget(pw)),
  38. parentWidget(pw),
  39. id(0),
  40. name(nullptr),
  41. needsScaling(false),
  42. visible(true),
  43. size(0, 0),
  44. subWidgets() {}
  45. Widget::PrivateData::~PrivateData()
  46. {
  47. subWidgets.clear();
  48. std::free(name);
  49. }
  50. void Widget::PrivateData::displaySubWidgets(const uint width, const uint height, const double autoScaleFactor)
  51. {
  52. if (subWidgets.size() == 0)
  53. return;
  54. for (std::list<SubWidget*>::iterator it = subWidgets.begin(); it != subWidgets.end(); ++it)
  55. {
  56. SubWidget* const subwidget(*it);
  57. if (subwidget->isVisible())
  58. subwidget->pData->display(width, height, autoScaleFactor);
  59. }
  60. }
  61. // -----------------------------------------------------------------------
  62. bool Widget::PrivateData::giveKeyboardEventForSubWidgets(const KeyboardEvent& ev)
  63. {
  64. if (! visible)
  65. return false;
  66. if (subWidgets.size() == 0)
  67. return false;
  68. FOR_EACH_SUBWIDGET_INV(rit)
  69. {
  70. SubWidget* const widget(*rit);
  71. if (widget->isVisible() && widget->onKeyboard(ev))
  72. return true;
  73. }
  74. return false;
  75. }
  76. bool Widget::PrivateData::giveCharacterInputEventForSubWidgets(const CharacterInputEvent& ev)
  77. {
  78. if (! visible)
  79. return false;
  80. if (subWidgets.size() == 0)
  81. return false;
  82. FOR_EACH_SUBWIDGET_INV(rit)
  83. {
  84. SubWidget* const widget(*rit);
  85. if (widget->isVisible() && widget->onCharacterInput(ev))
  86. return true;
  87. }
  88. return false;
  89. }
  90. bool Widget::PrivateData::giveMouseEventForSubWidgets(MouseEvent& ev)
  91. {
  92. if (! visible)
  93. return false;
  94. if (subWidgets.size() == 0)
  95. return false;
  96. const double x = ev.absolutePos.getX();
  97. const double y = ev.absolutePos.getY();
  98. if (SubWidget* const selfw = dynamic_cast<SubWidget*>(self))
  99. {
  100. if (selfw->pData->needsViewportScaling)
  101. {
  102. ev.absolutePos.setX(x - selfw->getAbsoluteX() + selfw->getMargin().getX());
  103. ev.absolutePos.setY(y - selfw->getAbsoluteY() + selfw->getMargin().getY());
  104. }
  105. }
  106. FOR_EACH_SUBWIDGET_INV(rit)
  107. {
  108. SubWidget* const widget(*rit);
  109. if (! widget->isVisible())
  110. continue;
  111. ev.pos = Point<double>(x - widget->getAbsoluteX() + widget->getMargin().getX(),
  112. y - widget->getAbsoluteY() + widget->getMargin().getY());
  113. if (widget->onMouse(ev))
  114. return true;
  115. }
  116. return false;
  117. }
  118. bool Widget::PrivateData::giveMotionEventForSubWidgets(MotionEvent& ev)
  119. {
  120. if (! visible)
  121. return false;
  122. if (subWidgets.size() == 0)
  123. return false;
  124. const double x = ev.absolutePos.getX();
  125. const double y = ev.absolutePos.getY();
  126. if (SubWidget* const selfw = dynamic_cast<SubWidget*>(self))
  127. {
  128. if (selfw->pData->needsViewportScaling)
  129. {
  130. ev.absolutePos.setX(x - selfw->getAbsoluteX() + selfw->getMargin().getX());
  131. ev.absolutePos.setY(y - selfw->getAbsoluteY() + selfw->getMargin().getY());
  132. }
  133. }
  134. FOR_EACH_SUBWIDGET_INV(rit)
  135. {
  136. SubWidget* const widget(*rit);
  137. if (! widget->isVisible())
  138. continue;
  139. ev.pos = Point<double>(x - widget->getAbsoluteX() + widget->getMargin().getX(),
  140. y - widget->getAbsoluteY() + widget->getMargin().getY());
  141. if (widget->onMotion(ev))
  142. return true;
  143. }
  144. return false;
  145. }
  146. bool Widget::PrivateData::giveScrollEventForSubWidgets(ScrollEvent& ev)
  147. {
  148. if (! visible)
  149. return false;
  150. if (subWidgets.size() == 0)
  151. return false;
  152. const double x = ev.absolutePos.getX();
  153. const double y = ev.absolutePos.getY();
  154. if (SubWidget* const selfw = dynamic_cast<SubWidget*>(self))
  155. {
  156. if (selfw->pData->needsViewportScaling)
  157. {
  158. ev.absolutePos.setX(x - selfw->getAbsoluteX() + selfw->getMargin().getX());
  159. ev.absolutePos.setY(y - selfw->getAbsoluteY() + selfw->getMargin().getY());
  160. }
  161. }
  162. FOR_EACH_SUBWIDGET_INV(rit)
  163. {
  164. SubWidget* const widget(*rit);
  165. if (! widget->isVisible())
  166. continue;
  167. ev.pos = Point<double>(x - widget->getAbsoluteX() + widget->getMargin().getX(),
  168. y - widget->getAbsoluteY() + widget->getMargin().getY());
  169. if (widget->onScroll(ev))
  170. return true;
  171. }
  172. return false;
  173. }
  174. // -----------------------------------------------------------------------
  175. TopLevelWidget* Widget::PrivateData::findTopLevelWidget(Widget* const pw)
  176. {
  177. if (pw->pData->topLevelWidget != nullptr)
  178. return pw->pData->topLevelWidget;
  179. if (pw->pData->parentWidget != nullptr)
  180. return findTopLevelWidget(pw->pData->parentWidget);
  181. return nullptr;
  182. }
  183. // -----------------------------------------------------------------------
  184. END_NAMESPACE_DGL