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.

132 lines
4.1KB

  1. //***********************************************************************************************
  2. //Impromptu Modular: Modules for VCV Rack by Marc Boulé
  3. //
  4. //See ./LICENSE.md for all licenses
  5. //***********************************************************************************************
  6. #include "../ImpromptuModular/src/comp/PanelTheme.hpp"
  7. void loadThemeAndContrastFromDefault(int* panelTheme, float* panelContrast) {
  8. *panelTheme = 1;
  9. *panelContrast = panelContrastDefault;
  10. }
  11. void createPanelThemeMenu(ui::Menu* menu, int* panelTheme, float* panelContrast, SvgPanel* mainPanel) {
  12. struct PanelThemeItem : MenuItem {
  13. int* panelTheme = NULL;
  14. float* panelContrast = NULL;
  15. SvgPanel* mainPanel;
  16. Menu *createChildMenu() override {
  17. struct PanelThemeDarkItem : MenuItem {
  18. int* panelTheme = NULL;
  19. SvgPanel* mainPanel;
  20. void onAction(const event::Action &e) override {
  21. *panelTheme ^= 0x1;
  22. mainPanel->fb->dirty = true;
  23. e.unconsume();
  24. }
  25. };
  26. struct PanelContrastQuantity : Quantity {
  27. float* panelContrast;
  28. SvgPanel* mainPanel;
  29. PanelContrastQuantity(float* _panelContrast, SvgPanel* _mainPanel) {
  30. panelContrast = _panelContrast;
  31. mainPanel = _mainPanel;
  32. }
  33. void setValue(float value) override {
  34. *panelContrast = math::clamp(value, getMinValue(), getMaxValue());
  35. mainPanel->fb->dirty = true;
  36. }
  37. float getValue() override {
  38. return *panelContrast;
  39. }
  40. float getMinValue() override {return panelContrastMin;}
  41. float getMaxValue() override {return panelContrastMax;}
  42. float getDefaultValue() override {return panelContrastDefault;}
  43. float getDisplayValue() override {return *panelContrast;}
  44. std::string getDisplayValueString() override {
  45. return string::f("%.1f", rescale(*panelContrast, getMinValue(), getMaxValue(), 0.0f, 100.0f));
  46. }
  47. void setDisplayValue(float displayValue) override {setValue(displayValue);}
  48. std::string getLabel() override {return "Panel contrast";}
  49. std::string getUnit() override {return "";}
  50. };
  51. struct PanelContrastSlider : ui::Slider {
  52. PanelContrastSlider(float* panelContrast, SvgPanel* mainPanel) {
  53. quantity = new PanelContrastQuantity(panelContrast, mainPanel);
  54. }
  55. ~PanelContrastSlider() {
  56. delete quantity;
  57. }
  58. };
  59. Menu *menu = new Menu;
  60. PanelThemeDarkItem *ptdItem = createMenuItem<PanelThemeDarkItem>("Dark", CHECKMARK(*panelTheme));
  61. ptdItem->panelTheme = panelTheme;
  62. ptdItem->mainPanel = mainPanel;
  63. menu->addChild(ptdItem);
  64. PanelContrastSlider *cSlider = new PanelContrastSlider(panelContrast, mainPanel);
  65. cSlider->box.size.x = 200.0f;
  66. menu->addChild(cSlider);
  67. return menu;
  68. }
  69. };
  70. PanelThemeItem *ptItem = createMenuItem<PanelThemeItem>("Panel theme", RIGHT_ARROW);
  71. ptItem->panelTheme = panelTheme;
  72. ptItem->panelContrast = panelContrast;
  73. ptItem->mainPanel = mainPanel;
  74. menu->addChild(ptItem);
  75. }
  76. void PanelBaseWidget::draw(const DrawArgs& args) {
  77. nvgBeginPath(args.vg);
  78. NVGcolor baseColor;
  79. if (panelContrastSrc) {
  80. baseColor = nvgRGB(*panelContrastSrc, *panelContrastSrc, *panelContrastSrc);
  81. }
  82. else {
  83. int themeDefault;
  84. float contrastDefault;
  85. loadThemeAndContrastFromDefault(&themeDefault, &contrastDefault);
  86. baseColor = nvgRGB(contrastDefault, contrastDefault, contrastDefault);
  87. }
  88. nvgFillColor(args.vg, baseColor);
  89. nvgRect(args.vg, 0, 0, box.size.x, box.size.y);
  90. nvgFill(args.vg);
  91. TransparentWidget::draw(args);
  92. }
  93. void InverterWidget::draw(const DrawArgs& args) {
  94. TransparentWidget::draw(args);
  95. if (isDark(panelThemeSrc)) {
  96. // nvgSave(args.vg);
  97. nvgBeginPath(args.vg);
  98. nvgFillColor(args.vg, SCHEME_WHITE);// this is the source, the current framebuffer is the dest
  99. nvgRect(args.vg, 0, 0, box.size.x, box.size.y);
  100. nvgGlobalCompositeBlendFuncSeparate(args.vg,
  101. NVG_ONE_MINUS_DST_COLOR,// srcRGB
  102. NVG_ZERO,// dstRGB
  103. NVG_ONE_MINUS_DST_COLOR,// srcAlpha
  104. NVG_ONE);// dstAlpha
  105. // blend factor: https://github.com/memononen/nanovg/blob/master/src/nanovg.h#L86
  106. // OpenGL blend doc: https://www.khronos.org/opengl/wiki/Blending
  107. nvgFill(args.vg);
  108. nvgClosePath(args.vg);
  109. // nvgRestore(args.vg);
  110. }
  111. }