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.

257 lines
6.0KB

  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::setEndPos(const Point<int>& endPos)
  58. {
  59. fEndPos = endPos;
  60. _recheckArea();
  61. }
  62. void ImageSlider::setRange(float min, float max)
  63. {
  64. if (fValue < min)
  65. {
  66. fValue = min;
  67. repaint();
  68. if (fCallback != nullptr)
  69. fCallback->imageSliderValueChanged(this, fValue);
  70. }
  71. else if (fValue > max)
  72. {
  73. fValue = max;
  74. repaint();
  75. if (fCallback != nullptr)
  76. fCallback->imageSliderValueChanged(this, fValue);
  77. }
  78. fMinimum = min;
  79. fMaximum = max;
  80. }
  81. void ImageSlider::setValue(float value, bool sendCallback)
  82. {
  83. if (fValue == value)
  84. return;
  85. fValue = value;
  86. repaint();
  87. if (sendCallback && fCallback != nullptr)
  88. fCallback->imageSliderValueChanged(this, fValue);
  89. }
  90. void ImageSlider::setCallback(Callback* callback)
  91. {
  92. fCallback = callback;
  93. }
  94. void ImageSlider::onDisplay()
  95. {
  96. #if 0 // DEBUG, paints slider area
  97. glColor3f(0.4f, 0.5f, 0.1f);
  98. glRecti(fSliderArea.getX(), fSliderArea.getY(), fSliderArea.getX()+fSliderArea.getWidth(), fSliderArea.getY()+fSliderArea.getHeight());
  99. #endif
  100. float normValue = (fValue - fMinimum) / (fMaximum - fMinimum);
  101. int x, y;
  102. if (fStartPos.getX() == fEndPos.getX())
  103. {
  104. x = fStartPos.getX();
  105. y = fEndPos.getY() - normValue*(fEndPos.getY()-fStartPos.getY());
  106. }
  107. else if (fStartPos.getY() == fEndPos.getY())
  108. {
  109. x = fEndPos.getX() - normValue*(fEndPos.getX()-fStartPos.getX());
  110. y = fStartPos.getY();
  111. }
  112. else
  113. return;
  114. fImage.draw(x, y);
  115. }
  116. bool ImageSlider::onMouse(int button, bool press, int x, int y)
  117. {
  118. if (button != 1)
  119. return false;
  120. if (press)
  121. {
  122. if (! fSliderArea.contains(x, y))
  123. return false;
  124. float vper;
  125. if (fStartPos.getX() == fEndPos.getX())
  126. {
  127. // vertical
  128. vper = float(y - fSliderArea.getY()) / float(fSliderArea.getHeight());
  129. }
  130. else if (fStartPos.getY() == fEndPos.getY())
  131. {
  132. // horizontal
  133. vper = float(x - fSliderArea.getX()) / float(fSliderArea.getWidth());
  134. }
  135. else
  136. return false;
  137. float value = fMaximum - vper * (fMaximum - fMinimum);
  138. if (value < fMinimum)
  139. value = fMinimum;
  140. else if (value > fMaximum)
  141. value = fMaximum;
  142. fDragging = true;
  143. fStartedX = x;
  144. fStartedY = y;
  145. if (fCallback != nullptr)
  146. fCallback->imageSliderDragStarted(this);
  147. setValue(value, true);
  148. return true;
  149. }
  150. else if (fDragging)
  151. {
  152. if (fCallback != nullptr)
  153. fCallback->imageSliderDragFinished(this);
  154. fDragging = false;
  155. return true;
  156. }
  157. return false;
  158. }
  159. bool ImageSlider::onMotion(int x, int y)
  160. {
  161. if (! fDragging)
  162. return false;
  163. bool horizontal = fStartPos.getY() == fEndPos.getY();
  164. if ((horizontal && fSliderArea.containsX(x)) || (fSliderArea.containsY(y) && ! horizontal))
  165. {
  166. float vper;
  167. if (horizontal)
  168. {
  169. // horizontal
  170. vper = float(x - fSliderArea.getX()) / float(fSliderArea.getWidth());
  171. }
  172. else
  173. {
  174. // vertical
  175. vper = float(y - fSliderArea.getY()) / float(fSliderArea.getHeight());
  176. }
  177. float value = fMaximum - vper * (fMaximum - fMinimum);
  178. if (value < fMinimum)
  179. value = fMinimum;
  180. else if (value > fMaximum)
  181. value = fMaximum;
  182. setValue(value, true);
  183. }
  184. else if (y < fSliderArea.getY())
  185. {
  186. setValue(fMaximum, true);
  187. }
  188. else
  189. {
  190. setValue(fMinimum, true);
  191. }
  192. return true;
  193. }
  194. void ImageSlider::_recheckArea()
  195. {
  196. if (fStartPos.getX() == fEndPos.getX())
  197. {
  198. fSliderArea = Rectangle<int>(fStartPos.getX(),
  199. fStartPos.getY(),
  200. fImage.getWidth(),
  201. fEndPos.getY() + fImage.getHeight() - fStartPos.getY());
  202. }
  203. else if (fStartPos.getY() == fEndPos.getY())
  204. {
  205. fSliderArea = Rectangle<int>(fStartPos.getX(),
  206. fStartPos.getY(),
  207. fEndPos.getX() + fImage.getWidth() - fStartPos.getX(),
  208. fImage.getHeight());
  209. }
  210. }
  211. // -------------------------------------------------
  212. END_NAMESPACE_DGL