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.

75 lines
2.7KB

  1. /*
  2. Copyright (C) 2017 Xenakios
  3. This program is free software; you can redistribute it and/or modify
  4. it under the terms of version 3 of the GNU General Public License
  5. as published by the Free Software Foundation.
  6. This program is distributed in the hope that it will be useful,
  7. but WITHOUT ANY WARRANTY; without even the implied warranty of
  8. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  9. GNU General Public License (version 3) for more details.
  10. www.gnu.org/licenses
  11. */
  12. #pragma once
  13. #include "../JuceLibraryCode/JuceHeader.h"
  14. #include <memory>
  15. #include <functional>
  16. #include <future>
  17. #include "jcdp_envelope.h"
  18. class EnvelopeComponent : public Component,
  19. public ChangeListener,
  20. public MultiTimer
  21. //public TooltipClient
  22. {
  23. public:
  24. EnvelopeComponent(CriticalSection* cs);
  25. ~EnvelopeComponent();
  26. void paint(Graphics& g) override;
  27. void set_envelope(std::shared_ptr<breakpoint_envelope> env, String name = String());
  28. std::shared_ptr<breakpoint_envelope> get_envelope() { return m_envelope; }
  29. String get_name() { return m_name; }
  30. void mouseMove(const MouseEvent& ev) override;
  31. void mouseDown(const MouseEvent& ev) override;
  32. void mouseDrag(const MouseEvent& ev) override;
  33. void mouseUp(const MouseEvent& ev) override;
  34. bool keyPressed(const KeyPress& ev) override;
  35. double get_view_start_time() const { return m_view_start_time; }
  36. double get_view_end_time() const { return m_view_end_time; }
  37. void set_view_start_time(double t) { m_view_start_time = t; repaint(); }
  38. void set_view_end_time(double t) { m_view_end_time = t; repaint(); }
  39. std::function<void(EnvelopeComponent*, Graphics&)> EnvelopeUnderlayDraw;
  40. std::function<void(EnvelopeComponent*, Graphics&)> EnvelopeOverlayDraw;
  41. std::function<void(breakpoint_envelope*)> OnEnvelopeEdited;
  42. std::function<double(double)> YFromNormalized;
  43. std::function<double(double)> XFromNormalized;
  44. void changeListenerCallback(ChangeBroadcaster*) override;
  45. void timerCallback(int id) override;
  46. //String getTooltip() override;
  47. private:
  48. std::shared_ptr<breakpoint_envelope> m_envelope;
  49. String m_name;
  50. Colour m_env_color{ Colours::yellow };
  51. double m_view_start_time = 0.0;
  52. double m_view_end_time = 1.0;
  53. double m_view_start_value = 0.0;
  54. double m_view_end_value = 1.0;
  55. int find_hot_envelope_point(double xcor, double ycor);
  56. int findHotEnvelopeSegment(double xcor, double ycor, bool detectsegment);
  57. bool m_mouse_down = false;
  58. int m_node_to_drag = -1;
  59. std::pair<int, bool> m_segment_drag_info{ -1,false };
  60. int m_node_that_was_dragged = -1;
  61. String m_last_tip;
  62. BubbleMessageComponent m_bubble;
  63. void show_bubble(int x, int y, const envelope_point &node);
  64. CriticalSection* m_cs = nullptr;
  65. JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(EnvelopeComponent)
  66. };