diff --git a/plugins/Cardinal/src/Ildaeil.cpp b/plugins/Cardinal/src/Ildaeil.cpp index 231b85c..81afb68 100644 --- a/plugins/Cardinal/src/Ildaeil.cpp +++ b/plugins/Cardinal/src/Ildaeil.cpp @@ -66,6 +66,9 @@ static const char* host_ui_open_file(NativeHostHandle handle, bool isDir, const static const char* host_ui_save_file(NativeHostHandle handle, bool isDir, const char* title, const char* filter); static intptr_t host_dispatcher(NativeHostHandle handle, NativeHostDispatcherOpcode opcode, int32_t index, intptr_t value, void* ptr, float opt); +static void ildaeilParameterChangeForUI(void* ui, uint32_t index, float value); +static const char* ildaeilOpenFileForUI(void* ui, bool isDir, const char* title, const char* filter); + // -------------------------------------------------------------------------------------------------------------------- struct IldaeilModule : Module { @@ -95,6 +98,8 @@ struct IldaeilModule : Module { mutable NativeTimeInfo fCarlaTimeInfo; // mutable water::MemoryOutputStream fLastProjectState; + void* fUI = nullptr; + float audioDataIn1[BUFFER_SIZE]; float audioDataIn2[BUFFER_SIZE]; float audioDataOut1[BUFFER_SIZE]; @@ -279,7 +284,7 @@ static bool host_write_midi_event(const NativeHostHandle handle, const NativeMid static void host_ui_parameter_changed(const NativeHostHandle handle, const uint32_t index, const float value) { - // ildaeilParameterChangeForUI(static_cast(handle)->fUI, index, value); + ildaeilParameterChangeForUI(static_cast(handle)->fUI, index, value); } static void host_ui_midi_program_changed(NativeHostHandle handle, uint8_t channel, uint32_t bank, uint32_t program) @@ -299,8 +304,7 @@ static void host_ui_closed(NativeHostHandle handle) static const char* host_ui_open_file(const NativeHostHandle handle, const bool isDir, const char* const title, const char* const filter) { - // return ildaeilOpenFileForUI(static_cast(handle)->fUI, isDir, title, filter); - return nullptr; + return ildaeilOpenFileForUI(static_cast(handle)->fUI, isDir, title, filter); } static const char* host_ui_save_file(NativeHostHandle, bool, const char*, const char*) @@ -316,7 +320,7 @@ static intptr_t host_dispatcher(const NativeHostHandle handle, const NativeHostD // -------------------------------------------------------------------------------------------------------------------- -struct IldaeilWidget : ImGuiWidget, public Thread { +struct IldaeilWidget : ImGuiWidget, Thread { static constexpr const uint kButtonHeight = 20; struct PluginInfoCache { @@ -432,15 +436,15 @@ struct IldaeilWidget : ImGuiWidget, public Thread { fDrawingState = kDrawingPluginPendingFromInit; fPluginHasCustomUI = hints & PLUGIN_HAS_CUSTOM_UI; } + + module->fUI = this; } ~IldaeilWidget() override { if (module != nullptr && module->fCarlaHostHandle != nullptr) { - /* module->fUI = nullptr; - */ carla_set_engine_option(module->fCarlaHostHandle, ENGINE_OPTION_FRONTEND_WIN_ID, 0, "0"); } @@ -473,15 +477,15 @@ struct IldaeilWidget : ImGuiWidget, public Thread { } } - /* const char* openFileFromDSP(const bool isDir, const char* const title, const char* const filter) { + /* Window::FileBrowserOptions opts; opts.title = title; getWindow().openFileBrowser(opts); + */ return nullptr; } - */ void showPluginUI(const CarlaHostHandle handle) { @@ -618,8 +622,10 @@ struct IldaeilWidget : ImGuiWidget, public Thread { return false; } - void onContextCreate(const ContextCreateEvent&) override + void onContextCreate(const ContextCreateEvent& e) override { + ImGuiWidget::onContextCreate(e); + /* if (module == nullptr || module->fCarlaHostHandle == nullptr) return; @@ -632,9 +638,11 @@ struct IldaeilWidget : ImGuiWidget, public Thread { carla_set_engine_option(module->fCarlaHostHandle, ENGINE_OPTION_FRONTEND_WIN_ID, 0, winIdStr); } - void onContextDestroy(const ContextDestroyEvent&) override + void onContextDestroy(const ContextDestroyEvent& e) override { carla_set_engine_option(module->fCarlaHostHandle, ENGINE_OPTION_FRONTEND_WIN_ID, 0, "0"); + + ImGuiWidget::onContextDestroy(e); } void step() override @@ -1090,6 +1098,22 @@ struct IldaeilWidget : ImGuiWidget, public Thread { // -------------------------------------------------------------------------------------------------------------------- +static void ildaeilParameterChangeForUI(void* const ui, const uint32_t index, const float value) +{ + DISTRHO_SAFE_ASSERT_RETURN(ui != nullptr,); + + static_cast(ui)->changeParameterFromDSP(index, value); +} + +static const char* ildaeilOpenFileForUI(void* const ui, const bool isDir, const char* const title, const char* const filter) +{ + DISTRHO_SAFE_ASSERT_RETURN(ui != nullptr, nullptr); + + return static_cast(ui)->openFileFromDSP(isDir, title, filter); +} + +// -------------------------------------------------------------------------------------------------------------------- + struct IldaeilModuleWidget : ModuleWidget { IldaeilWidget* ildaeilWidget = nullptr; @@ -1098,7 +1122,8 @@ struct IldaeilModuleWidget : ModuleWidget { setModule(module); setPanel(APP->window->loadSvg(asset::plugin(pluginInstance, "res/glBars.svg"))); - ildaeilWidget = new IldaeilWidget(module, reinterpret_cast(APP)->nativeWindowId); + ildaeilWidget = new IldaeilWidget(static_cast(module), + reinterpret_cast(APP)->nativeWindowId); ildaeilWidget->box.pos = Vec(2 * RACK_GRID_WIDTH, 0); ildaeilWidget->box.size = Vec(box.size.x - 2 * RACK_GRID_WIDTH, box.size.y); addChild(ildaeilWidget); diff --git a/plugins/Cardinal/src/ImGuiWidget.cpp b/plugins/Cardinal/src/ImGuiWidget.cpp index d7d3972..9d67358 100644 --- a/plugins/Cardinal/src/ImGuiWidget.cpp +++ b/plugins/Cardinal/src/ImGuiWidget.cpp @@ -30,7 +30,6 @@ struct ImGuiWidget::PrivateData { { IMGUI_CHECKVERSION(); context = ImGui::CreateContext(); - ImGui::SetCurrentContext(context); ImGuiIO& io(ImGui::GetIO()); io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; @@ -74,28 +73,38 @@ struct ImGuiWidget::PrivateData { io.KeyMap[ImGuiKey_X] = GLFW_KEY_X; io.KeyMap[ImGuiKey_Y] = GLFW_KEY_Y; io.KeyMap[ImGuiKey_Z] = GLFW_KEY_Z; - - ImGui_ImplOpenGL2_Init(); } ~PrivateData() { - ImGui::SetCurrentContext(context); - ImGui_ImplOpenGL2_Shutdown(); ImGui::DestroyContext(context); } }; ImGuiWidget::ImGuiWidget() - : imData(new PrivateData()) -{ -} + : imData(new PrivateData()) {} ImGuiWidget::~ImGuiWidget() { delete imData; } +void ImGuiWidget::onContextCreate(const ContextCreateEvent& e) +{ + OpenGlWidget::onContextCreate(e); + + ImGui::SetCurrentContext(imData->context); + ImGui_ImplOpenGL2_Init(); +} + +void ImGuiWidget::onContextDestroy(const ContextDestroyEvent& e) +{ + ImGui::SetCurrentContext(imData->context); + ImGui_ImplOpenGL2_Shutdown(); + + OpenGlWidget::onContextDestroy(e); +} + void ImGuiWidget::drawFramebuffer() { const math::Vec fbSize = getFramebufferSize(); @@ -195,28 +204,30 @@ void ImGuiWidget::onButton(const ButtonEvent& e) void ImGuiWidget::onSelectKey(const SelectKeyEvent& e) { + if (e.key < 0 || e.key >= IM_ARRAYSIZE(ImGuiIO::KeysDown)) + return; + ImGui::SetCurrentContext(imData->context); ImGuiIO& io(ImGui::GetIO()); + switch (e.action) + { + case GLFW_PRESS: + io.KeysDown[e.key] = true; + break; + case GLFW_RELEASE: + io.KeysDown[e.key] = false; + break; + default: + return; + } + io.KeyCtrl = e.mods & GLFW_MOD_CTRL; io.KeyShift = e.mods & GLFW_MOD_SHIFT; io.KeyAlt = e.mods & GLFW_MOD_ALT; io.KeySuper = e.mods & GLFW_MOD_SUPER; - if (e.key >= 0 && e.key < IM_ARRAYSIZE(io.KeysDown)) - { - switch (e.action) - { - case GLFW_PRESS: - io.KeysDown[e.key] = true; - break; - case GLFW_RELEASE: - io.KeysDown[e.key] = false; - break; - } - } - if (io.WantCaptureKeyboard) e.consume(this); } diff --git a/plugins/Cardinal/src/ImGuiWidget.hpp b/plugins/Cardinal/src/ImGuiWidget.hpp index c997f11..bdeb331 100644 --- a/plugins/Cardinal/src/ImGuiWidget.hpp +++ b/plugins/Cardinal/src/ImGuiWidget.hpp @@ -34,6 +34,10 @@ struct ImGuiWidget : OpenGlWidget { ImGui::ShowDemoWindow(); } +protected: + void onContextCreate(const ContextCreateEvent& e) override; + void onContextDestroy(const ContextDestroyEvent& e) override; + private: void drawFramebuffer() override; void onHover(const HoverEvent& e) override;