Audio plugin host https://kx.studio/carla
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.

267 lines
6.2KB

  1. /*
  2. * DISTRHO Plugin Toolkit (DPT)
  3. * Copyright (C) 2012-2013 Filipe Coelho <falktx@falktx.com>
  4. *
  5. * This program is free software; you can redistribute it and/or
  6. * modify it under the terms of the GNU Lesser General Public
  7. * License as published by the Free Software Foundation.
  8. *
  9. * This program is distributed in the hope that it will be useful,
  10. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. * GNU Lesser General Public License for more details.
  13. *
  14. * For a full copy of the license see the LGPL.txt file
  15. */
  16. #include "../ImageSlider.hpp"
  17. START_NAMESPACE_DGL
  18. // -------------------------------------------------
  19. ImageSlider::ImageSlider(Window* parent, const Image& image)
  20. : Widget(parent),
  21. fImage(image),
  22. fMinimum(0.0f),
  23. fMaximum(1.0f),
  24. fValue(0.5f),
  25. fDragging(false),
  26. fStartedX(0),
  27. fStartedY(0),
  28. fCallback(nullptr)
  29. {
  30. setSize(fImage.getSize());
  31. }
  32. ImageSlider::ImageSlider(const ImageSlider& imageSlider)
  33. : Widget(imageSlider.getParent()),
  34. fImage(imageSlider.fImage),
  35. fMinimum(imageSlider.fMinimum),
  36. fMaximum(imageSlider.fMaximum),
  37. fValue(imageSlider.fValue),
  38. fDragging(false),
  39. fStartedX(0),
  40. fStartedY(0),
  41. fCallback(imageSlider.fCallback),
  42. fStartPos(imageSlider.fStartPos),
  43. fEndPos(imageSlider.fEndPos),
  44. fSliderArea(imageSlider.fSliderArea)
  45. {
  46. setSize(fImage.getSize());
  47. }
  48. float ImageSlider::getValue() const
  49. {
  50. return fValue;
  51. }
  52. void ImageSlider::setStartPos(const Point<int>& startPos)
  53. {
  54. fStartPos = startPos;
  55. _recheckArea();
  56. }
  57. void ImageSlider::setStartPos(int x, int y)
  58. {
  59. setStartPos(Point<int>(x, y));
  60. }
  61. void ImageSlider::setEndPos(const Point<int>& endPos)
  62. {
  63. fEndPos = endPos;
  64. _recheckArea();
  65. }
  66. void ImageSlider::setEndPos(int x, int y)
  67. {
  68. setEndPos(Point<int>(x, y));
  69. }
  70. void ImageSlider::setRange(float min, float max)
  71. {
  72. if (fValue < min)
  73. {
  74. fValue = min;
  75. repaint();
  76. if (fCallback != nullptr)
  77. fCallback->imageSliderValueChanged(this, fValue);
  78. }
  79. else if (fValue > max)
  80. {
  81. fValue = max;
  82. repaint();
  83. if (fCallback != nullptr)
  84. fCallback->imageSliderValueChanged(this, fValue);
  85. }
  86. fMinimum = min;
  87. fMaximum = max;
  88. }
  89. void ImageSlider::setValue(float value, bool sendCallback)
  90. {
  91. if (fValue == value)
  92. return;
  93. fValue = value;
  94. repaint();
  95. if (sendCallback && fCallback != nullptr)
  96. fCallback->imageSliderValueChanged(this, fValue);
  97. }
  98. void ImageSlider::setCallback(Callback* callback)
  99. {
  100. fCallback = callback;
  101. }
  102. void ImageSlider::onDisplay()
  103. {
  104. #if 0 // DEBUG, paints slider area
  105. glColor3f(0.4f, 0.5f, 0.1f);
  106. glRecti(fSliderArea.getX(), fSliderArea.getY(), fSliderArea.getX()+fSliderArea.getWidth(), fSliderArea.getY()+fSliderArea.getHeight());
  107. #endif
  108. float normValue = (fValue - fMinimum) / (fMaximum - fMinimum);
  109. int x, y;
  110. if (fStartPos.getX() == fEndPos.getX())
  111. {
  112. x = fStartPos.getX();
  113. y = fEndPos.getY() - normValue*(fEndPos.getY()-fStartPos.getY());
  114. }
  115. else if (fStartPos.getY() == fEndPos.getY())
  116. {
  117. x = fEndPos.getX() - normValue*(fEndPos.getX()-fStartPos.getX());
  118. y = fStartPos.getY();
  119. }
  120. else
  121. return;
  122. fImage.draw(x, y);
  123. }
  124. bool ImageSlider::onMouse(int button, bool press, int x, int y)
  125. {
  126. if (button != 1)
  127. return false;
  128. if (press)
  129. {
  130. if (! fSliderArea.contains(x, y))
  131. return false;
  132. float vper;
  133. if (fStartPos.getX() == fEndPos.getX())
  134. {
  135. // vertical
  136. vper = float(y - fSliderArea.getY()) / float(fSliderArea.getHeight());
  137. }
  138. else if (fStartPos.getY() == fEndPos.getY())
  139. {
  140. // horizontal
  141. vper = float(x - fSliderArea.getX()) / float(fSliderArea.getWidth());
  142. }
  143. else
  144. return false;
  145. float value = fMaximum - vper * (fMaximum - fMinimum);
  146. if (value < fMinimum)
  147. value = fMinimum;
  148. else if (value > fMaximum)
  149. value = fMaximum;
  150. fDragging = true;
  151. fStartedX = x;
  152. fStartedY = y;
  153. if (fCallback != nullptr)
  154. fCallback->imageSliderDragStarted(this);
  155. setValue(value, true);
  156. return true;
  157. }
  158. else if (fDragging)
  159. {
  160. if (fCallback != nullptr)
  161. fCallback->imageSliderDragFinished(this);
  162. fDragging = false;
  163. return true;
  164. }
  165. return false;
  166. }
  167. bool ImageSlider::onMotion(int x, int y)
  168. {
  169. if (! fDragging)
  170. return false;
  171. bool horizontal = fStartPos.getY() == fEndPos.getY();
  172. if ((horizontal && fSliderArea.containsX(x)) || (fSliderArea.containsY(y) && ! horizontal))
  173. {
  174. float vper;
  175. if (horizontal)
  176. {
  177. // horizontal
  178. vper = float(x - fSliderArea.getX()) / float(fSliderArea.getWidth());
  179. }
  180. else
  181. {
  182. // vertical
  183. vper = float(y - fSliderArea.getY()) / float(fSliderArea.getHeight());
  184. }
  185. float value = fMaximum - vper * (fMaximum - fMinimum);
  186. if (value < fMinimum)
  187. value = fMinimum;
  188. else if (value > fMaximum)
  189. value = fMaximum;
  190. setValue(value, true);
  191. }
  192. else if (y < fSliderArea.getY())
  193. {
  194. setValue(fMaximum, true);
  195. }
  196. else
  197. {
  198. setValue(fMinimum, true);
  199. }
  200. return true;
  201. }
  202. void ImageSlider::_recheckArea()
  203. {
  204. if (fStartPos.getX() == fEndPos.getX())
  205. {
  206. fSliderArea = Rectangle<int>(fStartPos.getX(),
  207. fStartPos.getY(),
  208. fImage.getWidth(),
  209. fEndPos.getY() + fImage.getHeight() - fStartPos.getY());
  210. }
  211. else if (fStartPos.getY() == fEndPos.getY())
  212. {
  213. fSliderArea = Rectangle<int>(fStartPos.getX(),
  214. fStartPos.getY(),
  215. fEndPos.getX() + fImage.getWidth() - fStartPos.getX(),
  216. fImage.getHeight());
  217. }
  218. }
  219. // -------------------------------------------------
  220. END_NAMESPACE_DGL