From ddefffea0e3b8d8f327e5fab75169a8f7aabaddb Mon Sep 17 00:00:00 2001 From: Jean Pierre Cimalando Date: Thu, 25 Feb 2021 08:59:13 +0100 Subject: [PATCH] Prevent window input while file dialog is open --- plugins/editor/CMakeLists.txt | 2 + plugins/editor/src/editor/Editor.cpp | 30 ++++++++++++-- plugins/editor/src/editor/GUIHelpers.cpp | 53 ++++++++++++++++++++++++ plugins/editor/src/editor/GUIHelpers.h | 30 ++++++++++++++ 4 files changed, 111 insertions(+), 4 deletions(-) create mode 100644 plugins/editor/src/editor/GUIHelpers.cpp create mode 100644 plugins/editor/src/editor/GUIHelpers.h diff --git a/plugins/editor/CMakeLists.txt b/plugins/editor/CMakeLists.txt index d2153d32..f7c8904e 100644 --- a/plugins/editor/CMakeLists.txt +++ b/plugins/editor/CMakeLists.txt @@ -34,6 +34,8 @@ add_library(sfizz_editor STATIC EXCLUDE_FROM_ALL src/editor/EditorController.h src/editor/GUIComponents.h src/editor/GUIComponents.cpp + src/editor/GUIHelpers.h + src/editor/GUIHelpers.cpp src/editor/GUIPiano.h src/editor/GUIPiano.cpp src/editor/ColorHelpers.h diff --git a/plugins/editor/src/editor/Editor.cpp b/plugins/editor/src/editor/Editor.cpp index e8fb16c3..72013cca 100644 --- a/plugins/editor/src/editor/Editor.cpp +++ b/plugins/editor/src/editor/Editor.cpp @@ -8,6 +8,7 @@ #include "EditorController.h" #include "EditIds.h" #include "GUIComponents.h" +#include "GUIHelpers.h" #include "GUIPiano.h" #include "NativeHelpers.h" #include "BitArray.h" @@ -40,6 +41,7 @@ const int Editor::viewHeight { 475 }; struct Editor::Impl : EditorController::Receiver, IControlListener { EditorController* ctrl_ = nullptr; CFrame* frame_ = nullptr; + SharedPointer frameDisabler_; SharedPointer mainView_; std::string currentSfzFile_; @@ -227,6 +229,8 @@ void Editor::open(CFrame& frame) impl.frame_ = &frame; frame.addView(impl.mainView_.get()); + impl.frameDisabler_ = makeOwned(&frame); + impl.memQueryTimer_ = makeOwned([this](CVSTGUITimer*) { impl_->sendQueuedOSC("/mem/buffers", "", nullptr); }, 1000, true); @@ -245,6 +249,8 @@ void Editor::close() impl.memQueryTimer_ = nullptr; + impl.frameDisabler_ = nullptr; + if (impl.frame_) { impl.frame_->removeView(impl.mainView_.get(), false); impl.frame_ = nullptr; @@ -966,7 +972,11 @@ void Editor::Impl::chooseSfzFile() if (!initialDir.empty()) fs->setInitialDirectory(initialDir.c_str()); - if (fs->runModal()) { + frameDisabler_->disable(); + bool runOk = fs->runModal(); + frameDisabler_->enable(); + + if (runOk) { UTF8StringPtr file = fs->getSelectedFile(0); if (file) changeSfzFile(file); @@ -996,7 +1006,11 @@ void Editor::Impl::createNewSfzFile() if (!initialDir.empty()) fs->setInitialDirectory(initialDir.c_str()); - if (fs->runModal()) { + frameDisabler_->disable(); + bool runOk = fs->runModal(); + frameDisabler_->enable(); + + if (runOk) { UTF8StringPtr file = fs->getSelectedFile(0); std::string fileStr; if (file && !absl::EndsWithIgnoreCase(file, ".sfz")) { @@ -1084,7 +1098,11 @@ void Editor::Impl::chooseScalaFile() if (!initialDir.empty()) fs->setInitialDirectory(initialDir.c_str()); - if (fs->runModal()) { + frameDisabler_->disable(); + bool runOk = fs->runModal(); + frameDisabler_->enable(); + + if (runOk) { UTF8StringPtr file = fs->getSelectedFile(0); if (file) changeScalaFile(file); @@ -1105,7 +1123,11 @@ void Editor::Impl::chooseUserFilesDir() fs->setTitle("Set user files directory"); - if (fs->runModal()) { + frameDisabler_->disable(); + bool runOk = fs->runModal(); + frameDisabler_->enable(); + + if (runOk) { UTF8StringPtr dir = fs->getSelectedFile(0); if (dir) { userFilesDir_ = std::string(dir); diff --git a/plugins/editor/src/editor/GUIHelpers.cpp b/plugins/editor/src/editor/GUIHelpers.cpp new file mode 100644 index 00000000..b5da7443 --- /dev/null +++ b/plugins/editor/src/editor/GUIHelpers.cpp @@ -0,0 +1,53 @@ +// SPDX-License-Identifier: BSD-2-Clause + +// This code is part of the sfizz library and is licensed under a BSD 2-clause +// license. You should have receive a LICENSE.md file along with the code. +// If not, contact the sfizz maintainers at https://github.com/sfztools/sfizz + +#include "GUIHelpers.h" + +class SFrameDisabler::KeyAndMouseHook : public CBaseObject, + public IKeyboardHook, + public IMouseObserver { +public: + void setEnabled(bool value) { enabled_ = value; } + +protected: + int32_t onKeyDown(const VstKeyCode&, CFrame*) { return enabled_ ? -1 : 1; } + int32_t onKeyUp(const VstKeyCode&, CFrame*) { return enabled_ ? -1 : 1; } + void onMouseEntered(CView*, CFrame*) {} + void onMouseExited(CView*, CFrame*) {} + CMouseEventResult onMouseMoved(CFrame*, const CPoint&, const CButtonState&) { return enabled_ ? kMouseEventNotHandled : kMouseEventHandled; } + CMouseEventResult onMouseDown(CFrame*, const CPoint&, const CButtonState&) { return enabled_ ? kMouseEventNotHandled : kMouseEventHandled; } + +private: + bool enabled_ = true; +}; + +SFrameDisabler::SFrameDisabler(CFrame* frame) + : frame_(frame), hook_(makeOwned()) +{ + frame->registerKeyboardHook(hook_); + frame->registerMouseObserver(hook_); + + delayedEnabler_ = makeOwned( + [this](CVSTGUITimer* t) { hook_->setEnabled(true); t->stop(); }, + 1, false); +} + +SFrameDisabler::~SFrameDisabler() +{ + frame_->unregisterKeyboardHook(hook_); + frame_->unregisterMouseObserver(hook_); +} + +void SFrameDisabler::enable() +{ + delayedEnabler_->start(); +} + +void SFrameDisabler::disable() +{ + hook_->setEnabled(false); + delayedEnabler_->stop(); +} diff --git a/plugins/editor/src/editor/GUIHelpers.h b/plugins/editor/src/editor/GUIHelpers.h new file mode 100644 index 00000000..86f43df7 --- /dev/null +++ b/plugins/editor/src/editor/GUIHelpers.h @@ -0,0 +1,30 @@ +// SPDX-License-Identifier: BSD-2-Clause + +// This code is part of the sfizz library and is licensed under a BSD 2-clause +// license. You should have receive a LICENSE.md file along with the code. +// If not, contact the sfizz maintainers at https://github.com/sfztools/sfizz + +#pragma once +#include "utility/vstgui_before.h" +#include +#include +#include "utility/vstgui_after.h" + +using namespace VSTGUI; + +class SFrameDisabler : public CBaseObject { +public: + explicit SFrameDisabler(CFrame* frame); + ~SFrameDisabler(); + + void enable(); + void disable(); + +private: + class KeyAndMouseHook; + +private: + CFrame* frame_ = nullptr; + SharedPointer hook_; + SharedPointer delayedEnabler_; +};