| @@ -1750,8 +1750,8 @@ struct IldaeilModuleWidget : ModuleWidgetWithSideScrews<26> { | |||||
| if (module == nullptr || module->pcontext != nullptr) | if (module == nullptr || module->pcontext != nullptr) | ||||
| { | { | ||||
| ildaeilWidget = new IldaeilWidget(module); | 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); | addChild(ildaeilWidget); | ||||
| } | } | ||||
| @@ -32,6 +32,7 @@ | |||||
| struct ImGuiTextEditor::PrivateData { | struct ImGuiTextEditor::PrivateData { | ||||
| TextEditor editor; | TextEditor editor; | ||||
| std::string file; | std::string file; | ||||
| bool darkMode = true; | |||||
| }; | }; | ||||
| // -------------------------------------------------------------------------------------------------------------------- | // -------------------------------------------------------------------------------------------------------------------- | ||||
| @@ -230,3 +231,15 @@ void ImGuiTextEditor::onHoverScroll(const HoverScrollEvent& e) | |||||
| // if there is a scrollbar, handle the event | // if there is a scrollbar, handle the event | ||||
| ImGuiWidget::onHoverScroll(e); | 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(); | |||||
| } | |||||
| @@ -73,4 +73,5 @@ protected: | |||||
| void drawImGui() override; | void drawImGui() override; | ||||
| void onButton(const ButtonEvent& e) override; | void onButton(const ButtonEvent& e) override; | ||||
| void onHoverScroll(const HoverScrollEvent& e) override; | void onHoverScroll(const HoverScrollEvent& e) override; | ||||
| void step() override; | |||||
| }; | }; | ||||
| @@ -16,6 +16,7 @@ | |||||
| */ | */ | ||||
| #include "ImGuiWidget.hpp" | #include "ImGuiWidget.hpp" | ||||
| #include "DearImGui/imgui.h" | |||||
| #include "DistrhoUtils.hpp" | #include "DistrhoUtils.hpp" | ||||
| #ifndef DGL_NO_SHARED_RESOURCES | #ifndef DGL_NO_SHARED_RESOURCES | ||||
| @@ -75,6 +76,7 @@ static void setupIO() | |||||
| struct ImGuiWidget::PrivateData { | struct ImGuiWidget::PrivateData { | ||||
| ImGuiContext* context = nullptr; | ImGuiContext* context = nullptr; | ||||
| bool created = false; | bool created = false; | ||||
| bool darkMode = true; | |||||
| bool fontGenerated = false; | bool fontGenerated = false; | ||||
| bool useMonospacedFont = false; | bool useMonospacedFont = false; | ||||
| float originalScaleFactor = 0.0f; | float originalScaleFactor = 0.0f; | ||||
| @@ -205,13 +207,13 @@ struct ImGuiWidget::PrivateData { | |||||
| style.FrameRounding = 4; | style.FrameRounding = 4; | ||||
| style.ScaleAllSizes(scaleFactor); | 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; | 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_FrameBg] = ImVec4(0.20f, 0.21f, 0.22f, 0.54f); | ||||
| colors[ImGuiCol_FrameBgHovered] = ImVec4(0.40f, 0.40f, 0.40f, 0.40f); | colors[ImGuiCol_FrameBgHovered] = ImVec4(0.40f, 0.40f, 0.40f, 0.40f); | ||||
| colors[ImGuiCol_FrameBgActive] = ImVec4(0.18f, 0.18f, 0.18f, 0.67f); | 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_ButtonHovered] = color_Cardinal; | ||||
| colors[ImGuiCol_ButtonActive] = color_Cardinal; | colors[ImGuiCol_ButtonActive] = color_Cardinal; | ||||
| colors[ImGuiCol_TextSelectedBg] = ImVec4(0.87f, 0.87f, 0.87f, 0.35f); | 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_HeaderHovered] = color_DimCardinal; | ||||
| colors[ImGuiCol_HeaderActive] = color_Cardinal; | 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); | e.consume(this); | ||||
| } | } | ||||
| void ImGuiWidget::step() | |||||
| { | |||||
| if (imData->darkMode != settings::darkMode) | |||||
| { | |||||
| imData->darkMode = settings::darkMode; | |||||
| imData->resetEverything(true); | |||||
| } | |||||
| OpenGlWidgetWithBrowserPreview::step(); | |||||
| } | |||||
| void ImGuiWidget::drawFramebuffer() | void ImGuiWidget::drawFramebuffer() | ||||
| { | { | ||||
| const float scaleFactor = APP->window->pixelRatio * std::max(1.0f, APP->scene->rack->getAbsoluteZoom()); | const float scaleFactor = APP->window->pixelRatio * std::max(1.0f, APP->scene->rack->getAbsoluteZoom()); | ||||
| @@ -39,6 +39,7 @@ protected: | |||||
| void onButton(const ButtonEvent& e) override; | void onButton(const ButtonEvent& e) override; | ||||
| void onSelectKey(const SelectKeyEvent& e) override; | void onSelectKey(const SelectKeyEvent& e) override; | ||||
| void onSelectText(const SelectTextEvent& e) override; | void onSelectText(const SelectTextEvent& e) override; | ||||
| void step() override; | |||||
| void setAsCurrentContext(); | void setAsCurrentContext(); | ||||
| void setUseMonospaceFont(bool useMonoFont = true); | void setUseMonospaceFont(bool useMonoFont = true); | ||||
| @@ -17,9 +17,7 @@ | |||||
| #pragma once | #pragma once | ||||
| #include "color.hpp" | |||||
| #include "rack.hpp" | #include "rack.hpp" | ||||
| #include "settings.hpp" | |||||
| #ifdef NDEBUG | #ifdef NDEBUG | ||||
| # undef DEBUG | # undef DEBUG | ||||
| @@ -324,7 +324,7 @@ struct ModuleResizeHandle : OpaqueWidget { | |||||
| nvgMoveTo(args.vg, x + 0.5, margin + 0.5); | nvgMoveTo(args.vg, x + 0.5, margin + 0.5); | ||||
| nvgLineTo(args.vg, x + 0.5, box.size.y - margin + 0.5); | nvgLineTo(args.vg, x + 0.5, box.size.y - margin + 0.5); | ||||
| nvgStrokeWidth(args.vg, 1.0); | 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); | nvgStroke(args.vg); | ||||
| } | } | ||||
| } | } | ||||
| @@ -349,8 +349,8 @@ struct TextEditorModuleWidget : ModuleWidget { | |||||
| textEditorModule = module; | textEditorModule = module; | ||||
| textEditorWidget = new ImGuiTextEditor(); | 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); | addChild(textEditorWidget); | ||||
| if (module != nullptr) | if (module != nullptr) | ||||
| @@ -384,7 +384,8 @@ struct TextEditorModuleWidget : ModuleWidget { | |||||
| { | { | ||||
| nvgBeginPath(args.vg); | nvgBeginPath(args.vg); | ||||
| nvgRect(args.vg, 0.0, 0.0, box.size.x, box.size.y); | 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); | nvgFill(args.vg); | ||||
| ModuleWidget::draw(args); | ModuleWidget::draw(args); | ||||
| } | } | ||||
| @@ -2777,5 +2777,26 @@ void destroyStaticPlugins() | |||||
| plugins.clear(); | plugins.clear(); | ||||
| } | } | ||||
| void updateStaticPluginsDarkMode() | |||||
| { | |||||
| #ifndef NOPLUGINS | |||||
| const bool darkMode = settings::darkMode; | |||||
| // bogaudio | |||||
| { | |||||
| Skins& skins(Skins::skins()); | |||||
| skins._default = darkMode ? "dark" : "light"; | |||||
| std::lock_guard<std::mutex> lock(skins._defaultSkinListenersLock); | |||||
| for (auto listener : skins._defaultSkinListeners) { | |||||
| listener->defaultSkinChanged(skins._default); | |||||
| } | |||||
| } | |||||
| // meander | |||||
| { | |||||
| panelTheme = darkMode ? 1 : 0; | |||||
| } | |||||
| #endif | |||||
| } | |||||
| } | } | ||||
| } | } | ||||
| @@ -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) | if (dst.type == NSVG_PAINT_LINEAR_GRADIENT || dst.type == NSVG_PAINT_RADIAL_GRADIENT) | ||||
| { | { | ||||
| dst.gradient = static_cast<NSVGgradient*>(malloc(sizeof(NSVGgradient))); | dst.gradient = static_cast<NSVGgradient*>(malloc(sizeof(NSVGgradient))); | ||||
| std::memcpy(dst.gradient, src.gradient, sizeof(NSVGgradient)); | |||||
| std::memcpy(dst.gradient, src.gradient, sizeof(NSVGgradient)); | |||||
| } | } | ||||
| } | } | ||||
| @@ -68,6 +68,10 @@ namespace asset { | |||||
| std::string patchesPath(); | std::string patchesPath(); | ||||
| } | } | ||||
| namespace plugin { | |||||
| void updateStaticPluginsDarkMode(); | |||||
| } | |||||
| namespace app { | namespace app { | ||||
| namespace menuBar { | namespace menuBar { | ||||
| @@ -522,6 +526,7 @@ struct ViewButton : MenuButton { | |||||
| darkModeText = CHECKMARK_STRING; | darkModeText = CHECKMARK_STRING; | ||||
| menu->addChild(createMenuItem("Dark Mode", darkModeText, []() { | menu->addChild(createMenuItem("Dark Mode", darkModeText, []() { | ||||
| switchDarkMode(!settings::darkMode); | switchDarkMode(!settings::darkMode); | ||||
| plugin::updateStaticPluginsDarkMode(); | |||||
| setAllFramebufferWidgetsDirty(APP->scene); | setAllFramebufferWidgetsDirty(APP->scene); | ||||
| })); | })); | ||||