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.

160 lines
5.1KB

  1. /*
  2. * DISTRHO Plugin Framework (DPF)
  3. * Copyright (C) 2019-2021 Jean Pierre Cimalando <jp-dev@inbox.ru>
  4. * Copyright (C) 2012-2026 Filipe Coelho <falktx@falktx.com>
  5. *
  6. * Permission to use, copy, modify, and/or distribute this software for any purpose with
  7. * or without fee is hereby granted, provided that the above copyright notice and this
  8. * permission notice appear in all copies.
  9. *
  10. * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD
  11. * TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN
  12. * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
  13. * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
  14. * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
  15. * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  16. */
  17. #include "DistrhoUI.hpp"
  18. #include "Artwork.hpp"
  19. #include "DemoWidgetBanner.hpp"
  20. #include "DemoWidgetClickable.hpp"
  21. START_NAMESPACE_DISTRHO
  22. // We need a few classes from DGL.
  23. using DGL_NAMESPACE::CairoGraphicsContext;
  24. using DGL_NAMESPACE::CairoImage;
  25. using DGL_NAMESPACE::CairoImageKnob;
  26. using DGL_NAMESPACE::CairoImageSwitch;
  27. // And from ourselves
  28. using DGL_NAMESPACE::DemoWidgetBanner;
  29. class CairoExampleUI : public UI,
  30. public CairoImageKnob::Callback,
  31. public CairoImageSwitch::Callback,
  32. public DemoWidgetClickable::Callback
  33. {
  34. ScopedPointer<CairoImageKnob> fKnob;
  35. ScopedPointer<CairoImageSwitch> fButton;
  36. ScopedPointer<DemoWidgetBanner> fWidgetBanner;
  37. ScopedPointer<DemoWidgetClickable> fWidgetClickable;
  38. public:
  39. CairoExampleUI()
  40. {
  41. CairoImage knobSkin;
  42. knobSkin.loadFromPNG(Artwork::knobData, Artwork::knobDataSize);
  43. fWidgetBanner = new DemoWidgetBanner(this);
  44. fWidgetBanner->setAbsolutePos(10, 10);
  45. fWidgetBanner->setSize(180, 80);
  46. fWidgetClickable = new DemoWidgetClickable(this);
  47. fWidgetClickable->setAbsolutePos(100, 100);
  48. fWidgetClickable->setSize(50, 50);
  49. fWidgetClickable->setCallback(this);
  50. fWidgetClickable->setId(kParameterTriState);
  51. fKnob = new CairoImageKnob(this, knobSkin);
  52. fKnob->setAbsolutePos(10, 100);
  53. fKnob->setSize(80, 80);
  54. fKnob->setCallback(this);
  55. fKnob->setId(kParameterKnob);
  56. CairoImage buttonOn, buttonOff;
  57. buttonOn.loadFromPNG(Artwork::buttonOnData, Artwork::buttonOnDataSize);
  58. buttonOff.loadFromPNG(Artwork::buttonOffData, Artwork::buttonOffDataSize);
  59. fButton = new CairoImageSwitch(this, buttonOff, buttonOn);
  60. fButton->setAbsolutePos(100, 160);
  61. fButton->setSize(60, 35);
  62. fButton->setCallback(this);
  63. fButton->setId(kParameterButton);
  64. // set minimum UI size
  65. const double scaleFactor = getScaleFactor();
  66. setGeometryConstraints(DISTRHO_UI_DEFAULT_WIDTH * scaleFactor, DISTRHO_UI_DEFAULT_HEIGHT * scaleFactor, true);
  67. }
  68. protected:
  69. void onCairoDisplay(const CairoGraphicsContext& context) override
  70. {
  71. cairo_t* const cr = context.handle;
  72. cairo_set_source_rgb(cr, 1.0, 0.8, 0.5);
  73. cairo_paint(cr);
  74. }
  75. #if 0
  76. // we can use this if/when our resources are scalable, for now they are PNGs
  77. void onResize(const ResizeEvent& ev) override
  78. {
  79. UI::onResize(ev);
  80. const double scaleFactor = getScaleFactor();
  81. fWidgetClickable->setSize(50*scaleFactor, 50*scaleFactor);
  82. fWidgetClickable->setAbsolutePos(100*scaleFactor, 100*scaleFactor);
  83. fWidgetBanner->setSize(180*scaleFactor, 80*scaleFactor);
  84. fWidgetBanner->setAbsolutePos(10*scaleFactor, 10*scaleFactor);
  85. fKnob->setSize(80*scaleFactor, 80*scaleFactor);
  86. fKnob->setAbsolutePos(10*scaleFactor, 100*scaleFactor);
  87. fButton->setSize(60*scaleFactor, 35*scaleFactor);
  88. fButton->setAbsolutePos(100*scaleFactor, 160*scaleFactor);
  89. }
  90. #endif
  91. void parameterChanged(const uint32_t index, const float value) override
  92. {
  93. switch (index)
  94. {
  95. case kParameterKnob:
  96. fKnob->setValue(value);
  97. break;
  98. case kParameterTriState:
  99. fWidgetClickable->setColorId(static_cast<int>(value + 0.5f));
  100. break;
  101. case kParameterButton:
  102. fButton->setDown(value > 0.5f);
  103. break;
  104. }
  105. }
  106. void demoWidgetClicked(DemoWidgetClickable*, const uint8_t colorId) override
  107. {
  108. setParameterValue(kParameterTriState, colorId);
  109. }
  110. void imageKnobDragStarted(CairoImageKnob*) override
  111. {
  112. editParameter(kParameterKnob, true);
  113. }
  114. void imageKnobDragFinished(CairoImageKnob*) override
  115. {
  116. editParameter(kParameterKnob, false);
  117. }
  118. void imageKnobValueChanged(CairoImageKnob*, const float value) override
  119. {
  120. setParameterValue(kParameterKnob, value);
  121. }
  122. void imageSwitchClicked(CairoImageSwitch*, bool down) override
  123. {
  124. setParameterValue(kParameterButton, down ? 1.f : 0.f);
  125. }
  126. };
  127. UI* createUI()
  128. {
  129. return new CairoExampleUI;
  130. }
  131. END_NAMESPACE_DISTRHO