diff --git a/plugins/Cardinal/src/Ildaeil.cpp b/plugins/Cardinal/src/Ildaeil.cpp index 568f657..db574aa 100644 --- a/plugins/Cardinal/src/Ildaeil.cpp +++ b/plugins/Cardinal/src/Ildaeil.cpp @@ -1750,8 +1750,8 @@ struct IldaeilModuleWidget : ModuleWidgetWithSideScrews<26> { if (module == nullptr || module->pcontext != nullptr) { ildaeilWidget = new IldaeilWidget(module); - ildaeilWidget->box.pos = Vec(3 * RACK_GRID_WIDTH, 0); - ildaeilWidget->box.size = Vec(box.size.x - 6 * RACK_GRID_WIDTH, box.size.y); + ildaeilWidget->box.pos = Vec(3 * RACK_GRID_WIDTH + 1, 1); + ildaeilWidget->box.size = Vec(box.size.x - 6 * RACK_GRID_WIDTH - 2, box.size.y - 2); addChild(ildaeilWidget); } diff --git a/plugins/Cardinal/src/ImGuiTextEditor.cpp b/plugins/Cardinal/src/ImGuiTextEditor.cpp index dff0720..be713d5 100644 --- a/plugins/Cardinal/src/ImGuiTextEditor.cpp +++ b/plugins/Cardinal/src/ImGuiTextEditor.cpp @@ -32,6 +32,7 @@ struct ImGuiTextEditor::PrivateData { TextEditor editor; std::string file; + bool darkMode = true; }; // -------------------------------------------------------------------------------------------------------------------- @@ -230,3 +231,15 @@ void ImGuiTextEditor::onHoverScroll(const HoverScrollEvent& e) // if there is a scrollbar, handle the event ImGuiWidget::onHoverScroll(e); } + +void ImGuiTextEditor::step() +{ + if (pData->darkMode != settings::darkMode) + { + pData->darkMode = settings::darkMode; + pData->editor.SetPalette(settings::darkMode ? TextEditor::GetDarkPalette() + : TextEditor::GetLightPalette()); + } + + ImGuiWidget::step(); +} diff --git a/plugins/Cardinal/src/ImGuiTextEditor.hpp b/plugins/Cardinal/src/ImGuiTextEditor.hpp index 4dbdf36..74bd043 100644 --- a/plugins/Cardinal/src/ImGuiTextEditor.hpp +++ b/plugins/Cardinal/src/ImGuiTextEditor.hpp @@ -73,4 +73,5 @@ protected: void drawImGui() override; void onButton(const ButtonEvent& e) override; void onHoverScroll(const HoverScrollEvent& e) override; + void step() override; }; diff --git a/plugins/Cardinal/src/ImGuiWidget.cpp b/plugins/Cardinal/src/ImGuiWidget.cpp index 65d129b..ec88a82 100644 --- a/plugins/Cardinal/src/ImGuiWidget.cpp +++ b/plugins/Cardinal/src/ImGuiWidget.cpp @@ -16,6 +16,7 @@ */ #include "ImGuiWidget.hpp" +#include "DearImGui/imgui.h" #include "DistrhoUtils.hpp" #ifndef DGL_NO_SHARED_RESOURCES @@ -75,6 +76,7 @@ static void setupIO() struct ImGuiWidget::PrivateData { ImGuiContext* context = nullptr; bool created = false; + bool darkMode = true; bool fontGenerated = false; bool useMonospacedFont = false; float originalScaleFactor = 0.0f; @@ -205,13 +207,13 @@ struct ImGuiWidget::PrivateData { style.FrameRounding = 4; style.ScaleAllSizes(scaleFactor); - const ImVec4 color_Cardinal(0.76f, 0.11f, 0.22f, 1.00f); - const ImVec4 color_DimCardinal(171.0 / 255.0, 54.0 / 255.0, 73.0 / 255.0, 1.00f); + const ImVec4 color_Cardinal(0.76f, 0.11f, 0.22f, 1.f); + const ImVec4 color_DimCardinal(171.f / 255.f, 54.f / 255.f, 73.f / 255.f, 1.f); ImVec4* const colors = style.Colors; - colors[ImGuiCol_Text] = ImVec4(1.00f, 1.00f, 1.00f, 1.00f); - colors[ImGuiCol_TextDisabled] = ImVec4(0.50f, 0.50f, 0.50f, 1.00f); - colors[ImGuiCol_WindowBg] = ImVec4(0.101f, 0.101f, 0.101f, 0.94f); + colors[ImGuiCol_Text] = ImVec4(1.f, 1.f, 1.f, 1.f); + colors[ImGuiCol_TextDisabled] = ImVec4(0.5f, 0.5f, 0.5f, 1.f); + colors[ImGuiCol_WindowBg] = ImVec4(0.099f, 0.099f, 0.099f, 1.f); colors[ImGuiCol_FrameBg] = ImVec4(0.20f, 0.21f, 0.22f, 0.54f); colors[ImGuiCol_FrameBgHovered] = ImVec4(0.40f, 0.40f, 0.40f, 0.40f); colors[ImGuiCol_FrameBgActive] = ImVec4(0.18f, 0.18f, 0.18f, 0.67f); @@ -223,9 +225,21 @@ struct ImGuiWidget::PrivateData { colors[ImGuiCol_ButtonHovered] = color_Cardinal; colors[ImGuiCol_ButtonActive] = color_Cardinal; colors[ImGuiCol_TextSelectedBg] = ImVec4(0.87f, 0.87f, 0.87f, 0.35f); - colors[ImGuiCol_Header] = ImVec4(0.44f, 0.44f, 0.44f, 0.40f); + colors[ImGuiCol_Header] = ImVec4(0.44f, 0.44f, 0.44f, 0.4f); colors[ImGuiCol_HeaderHovered] = color_DimCardinal; colors[ImGuiCol_HeaderActive] = color_Cardinal; + + if (!settings::darkMode) + { + for (int c = 0; c < ImGuiCol_COUNT; ++c) + { + if (std::memcmp(&colors[c], &color_Cardinal, sizeof(color_Cardinal)) == 0) + continue; + if (std::memcmp(&colors[c], &color_DimCardinal, sizeof(color_DimCardinal)) == 0) + continue; + colors[c] = ImVec4(1.f - colors[c].x, 1.f - colors[c].y, 1.f - colors[c].z, colors[c].w); + } + } } }; @@ -416,6 +430,17 @@ void ImGuiWidget::onSelectText(const SelectTextEvent& e) e.consume(this); } +void ImGuiWidget::step() +{ + if (imData->darkMode != settings::darkMode) + { + imData->darkMode = settings::darkMode; + imData->resetEverything(true); + } + + OpenGlWidgetWithBrowserPreview::step(); +} + void ImGuiWidget::drawFramebuffer() { const float scaleFactor = APP->window->pixelRatio * std::max(1.0f, APP->scene->rack->getAbsoluteZoom()); diff --git a/plugins/Cardinal/src/ImGuiWidget.hpp b/plugins/Cardinal/src/ImGuiWidget.hpp index c24d506..5ceddc8 100644 --- a/plugins/Cardinal/src/ImGuiWidget.hpp +++ b/plugins/Cardinal/src/ImGuiWidget.hpp @@ -39,6 +39,7 @@ protected: void onButton(const ButtonEvent& e) override; void onSelectKey(const SelectKeyEvent& e) override; void onSelectText(const SelectTextEvent& e) override; + void step() override; void setAsCurrentContext(); void setUseMonospaceFont(bool useMonoFont = true); diff --git a/plugins/Cardinal/src/ModuleWidgets.hpp b/plugins/Cardinal/src/ModuleWidgets.hpp index 2045540..7766712 100644 --- a/plugins/Cardinal/src/ModuleWidgets.hpp +++ b/plugins/Cardinal/src/ModuleWidgets.hpp @@ -17,9 +17,7 @@ #pragma once -#include "color.hpp" #include "rack.hpp" -#include "settings.hpp" #ifdef NDEBUG # undef DEBUG diff --git a/plugins/Cardinal/src/TextEditor.cpp b/plugins/Cardinal/src/TextEditor.cpp index f8a67cd..ba03cc1 100644 --- a/plugins/Cardinal/src/TextEditor.cpp +++ b/plugins/Cardinal/src/TextEditor.cpp @@ -324,7 +324,7 @@ struct ModuleResizeHandle : OpaqueWidget { nvgMoveTo(args.vg, x + 0.5, margin + 0.5); nvgLineTo(args.vg, x + 0.5, box.size.y - margin + 0.5); nvgStrokeWidth(args.vg, 1.0); - nvgStrokeColor(args.vg, nvgRGBAf(0.5, 0.5, 0.5, 0.5)); + nvgStrokeColor(args.vg, nvgRGBAf(0.5f, 0.5f, 0.5f, 0.5f)); nvgStroke(args.vg); } } @@ -349,8 +349,8 @@ struct TextEditorModuleWidget : ModuleWidget { textEditorModule = module; textEditorWidget = new ImGuiTextEditor(); - textEditorWidget->box.pos = Vec(RACK_GRID_WIDTH, 0); - textEditorWidget->box.size = Vec(box.size.x - 2 * RACK_GRID_WIDTH, box.size.y); + textEditorWidget->box.pos = Vec(RACK_GRID_WIDTH + 1, 1); + textEditorWidget->box.size = Vec(box.size.x - 2 * RACK_GRID_WIDTH - 2, box.size.y - 2); addChild(textEditorWidget); if (module != nullptr) @@ -384,7 +384,8 @@ struct TextEditorModuleWidget : ModuleWidget { { nvgBeginPath(args.vg); nvgRect(args.vg, 0.0, 0.0, box.size.x, box.size.y); - nvgFillColor(args.vg, nvgRGB(0x20, 0x20, 0x20)); + nvgFillColor(args.vg, settings::darkMode ? nvgRGB(0x20, 0x20, 0x20) + : nvgRGB(0xe6, 0xe6, 0xe6)); nvgFill(args.vg); ModuleWidget::draw(args); } diff --git a/plugins/plugins.cpp b/plugins/plugins.cpp index 64c04d9..25807db 100644 --- a/plugins/plugins.cpp +++ b/plugins/plugins.cpp @@ -2777,5 +2777,26 @@ void destroyStaticPlugins() plugins.clear(); } +void updateStaticPluginsDarkMode() +{ +#ifndef NOPLUGINS + const bool darkMode = settings::darkMode; + // bogaudio + { + Skins& skins(Skins::skins()); + skins._default = darkMode ? "dark" : "light"; + + std::lock_guard lock(skins._defaultSkinListenersLock); + for (auto listener : skins._defaultSkinListeners) { + listener->defaultSkinChanged(skins._default); + } + } + // meander + { + panelTheme = darkMode ? 1 : 0; + } +#endif +} + } } diff --git a/src/custom/dep.cpp b/src/custom/dep.cpp index b250136..ba2322b 100644 --- a/src/custom/dep.cpp +++ b/src/custom/dep.cpp @@ -617,7 +617,7 @@ static void nsvg__duplicatePaint(NSVGpaint& dst, NSVGpaint& src) if (dst.type == NSVG_PAINT_LINEAR_GRADIENT || dst.type == NSVG_PAINT_RADIAL_GRADIENT) { dst.gradient = static_cast(malloc(sizeof(NSVGgradient))); - std::memcpy(dst.gradient, src.gradient, sizeof(NSVGgradient)); + std::memcpy(dst.gradient, src.gradient, sizeof(NSVGgradient)); } } diff --git a/src/override/MenuBar.cpp b/src/override/MenuBar.cpp index 711e765..56d7b71 100644 --- a/src/override/MenuBar.cpp +++ b/src/override/MenuBar.cpp @@ -68,6 +68,10 @@ namespace asset { std::string patchesPath(); } +namespace plugin { +void updateStaticPluginsDarkMode(); +} + namespace app { namespace menuBar { @@ -522,6 +526,7 @@ struct ViewButton : MenuButton { darkModeText = CHECKMARK_STRING; menu->addChild(createMenuItem("Dark Mode", darkModeText, []() { switchDarkMode(!settings::darkMode); + plugin::updateStaticPluginsDarkMode(); setAllFramebufferWidgetsDirty(APP->scene); }));