The JUCE cross-platform C++ framework, with DISTRHO/KXStudio specific changes
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.

109 lines
3.8KB

  1. /*
  2. ==============================================================================
  3. This file is part of the JUCE library.
  4. Copyright (c) 2017 - ROLI Ltd.
  5. JUCE is an open source library subject to commercial or open-source
  6. licensing.
  7. By using JUCE, you agree to the terms of both the JUCE 5 End-User License
  8. Agreement and JUCE 5 Privacy Policy (both updated and effective as of the
  9. 27th April 2017).
  10. End User License Agreement: www.juce.com/juce-5-licence
  11. Privacy Policy: www.juce.com/juce-5-privacy-policy
  12. Or: You may also use this code under the terms of the GPL v3 (see
  13. www.gnu.org/licenses).
  14. JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
  15. EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
  16. DISCLAIMED.
  17. ==============================================================================
  18. */
  19. #pragma once
  20. #include "jucer_ElementSiblingComponent.h"
  21. #include "../UI/jucer_PaintRoutineEditor.h"
  22. //==============================================================================
  23. class PointComponent : public ElementSiblingComponent
  24. {
  25. public:
  26. PointComponent (PaintElement* const e)
  27. : ElementSiblingComponent (e)
  28. {
  29. setSize (11, 11);
  30. setMouseCursor (MouseCursor::UpDownLeftRightResizeCursor);
  31. }
  32. virtual RelativePositionedRectangle getPosition() = 0;
  33. virtual void setPosition (const RelativePositionedRectangle& newPos) = 0;
  34. void updatePosition() override
  35. {
  36. if (dynamic_cast<PaintRoutineEditor*> (getParentComponent()) != nullptr)
  37. {
  38. const Rectangle<int> area (((PaintRoutineEditor*) getParentComponent())->getComponentArea());
  39. const Rectangle<int> r (getPosition().getRectangle (area, owner->getDocument()->getComponentLayout()));
  40. setCentrePosition (r.getX(), r.getY());
  41. }
  42. }
  43. //==============================================================================
  44. void paint (Graphics& g) override
  45. {
  46. g.setColour (Colours::white);
  47. g.drawEllipse (2.0f, 2.0f, getWidth() - 4.0f, getHeight() - 4.0f, 2.0f);
  48. g.setColour (Colours::black);
  49. g.drawEllipse (1.0f, 1.0f, getWidth() - 2.0f, getHeight() - 2.0f, 2.0f);
  50. }
  51. //==============================================================================
  52. void mouseDown (const MouseEvent&) override
  53. {
  54. const Rectangle<int> area (((PaintRoutineEditor*) getParentComponent())->getComponentArea());
  55. dragX = getX() + getWidth() / 2 - area.getX();
  56. dragY = getY() + getHeight() / 2 - area.getY();
  57. }
  58. void mouseDrag (const MouseEvent& e) override
  59. {
  60. const Rectangle<int> area (((PaintRoutineEditor*) getParentComponent())->getComponentArea());
  61. int x = dragX + e.getDistanceFromDragStartX();
  62. int y = dragY + e.getDistanceFromDragStartY();
  63. if (JucerDocument* const document = owner->getDocument())
  64. {
  65. x = document->snapPosition (x);
  66. y = document->snapPosition (y);
  67. const RelativePositionedRectangle original (getPosition());
  68. RelativePositionedRectangle pr (original);
  69. Rectangle<int> r (pr.getRectangle (Rectangle<int> (0, 0, area.getWidth(), area.getHeight()),
  70. document->getComponentLayout()));
  71. r.setPosition (x, y);
  72. pr.updateFrom (r.getX(), r.getY(), r.getWidth(), r.getHeight(),
  73. Rectangle<int> (0, 0, area.getWidth(), area.getHeight()),
  74. document->getComponentLayout());
  75. if (pr != original)
  76. setPosition (pr);
  77. }
  78. }
  79. void mouseUp (const MouseEvent&) override
  80. {
  81. }
  82. private:
  83. int dragX, dragY;
  84. };