From 8fc43bc0be963659d4e95609cb83eab9e5a91799 Mon Sep 17 00:00:00 2001 From: Jean Pierre Cimalando Date: Thu, 5 Mar 2020 15:53:01 +0100 Subject: [PATCH] Update of VST UI --- vst/CMakeLists.txt | 4 ++- vst/SfizzVstEditor.cpp | 79 ++++++++++++++++++++++++++++------------- vst/SfizzVstEditor.h | 1 + vst/resources/logo.png | Bin 0 -> 20594 bytes 4 files changed, 58 insertions(+), 26 deletions(-) create mode 100644 vst/resources/logo.png diff --git a/vst/CMakeLists.txt b/vst/CMakeLists.txt index 808660c0..b9217f22 100644 --- a/vst/CMakeLists.txt +++ b/vst/CMakeLists.txt @@ -59,7 +59,9 @@ endif() # Create the bundle (see "VST 3 Locations / Format") execute_process ( - COMMAND "${CMAKE_COMMAND}" -E make_directory "${CMAKE_CURRENT_BINARY_DIR}/${VSTPLUGIN_BUNDLE_NAME}/Contents") + COMMAND "${CMAKE_COMMAND}" -E make_directory "${CMAKE_CURRENT_BINARY_DIR}/${VSTPLUGIN_BUNDLE_NAME}/Contents/Resources") +file (COPY "${CMAKE_CURRENT_SOURCE_DIR}/resources/logo.png" + DESTINATION "${CMAKE_CURRENT_BINARY_DIR}/${VSTPLUGIN_BUNDLE_NAME}/Contents/Resources") if(WIN32) set_target_properties(${VSTPLUGIN_PRJ_NAME} PROPERTIES LIBRARY_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/${VSTPLUGIN_BUNDLE_NAME}/Contents/${VST3_PACKAGE_ARCHITECTURE}-win") diff --git a/vst/SfizzVstEditor.cpp b/vst/SfizzVstEditor.cpp index 46bd7139..adad6f6d 100644 --- a/vst/SfizzVstEditor.cpp +++ b/vst/SfizzVstEditor.cpp @@ -12,11 +12,9 @@ using namespace VSTGUI; -static constexpr int kEditorWidth = 800; -static constexpr int kEditorHeight = 40; - SfizzVstEditor::SfizzVstEditor(void *controller) - : VSTGUIEditor(controller) + : VSTGUIEditor(controller), + _logo("logo.png") { static_cast(getController())->addStateListener(this); } @@ -28,7 +26,7 @@ SfizzVstEditor::~SfizzVstEditor() bool PLUGIN_API SfizzVstEditor::open(void* parent, const VSTGUI::PlatformType& platformType) { - CRect wsize(0, 0, kEditorWidth, kEditorHeight); + CRect wsize(0, 0, _logo.getWidth(), _logo.getHeight()); CFrame *frame = new CFrame(wsize, this); this->frame = frame; @@ -67,8 +65,7 @@ void SfizzVstEditor::valueChanged(CControl* ctl) if (value != 1) break; - chooseSfzFile(); - + Call::later([this]() { chooseSfzFile(); }); break; } } @@ -95,18 +92,23 @@ void SfizzVstEditor::chooseSfzFile() void SfizzVstEditor::loadSfzFile(const std::string& filePath) { - _fileLabel->setText(filePath.c_str()); - Vst::EditController* ctl = getController(); + Vst::IMessage *msg = ctl->allocateMessage(); - if (msg) { - msg->setMessageID("LoadSfz"); - Vst::IAttributeList* attr = msg->getAttributes(); - attr->setString("File", Steinberg::String(filePath.c_str()).text()); - ctl->sendMessage(msg); - msg->release(); + if (!msg) { + fprintf(stderr, "[Sfizz] UI could not allocate message\n"); + return; } + + msg->setMessageID("LoadSfz"); + Vst::IAttributeList* attr = msg->getAttributes(); + attr->setString("File", Steinberg::String(filePath.c_str()).text()); + ctl->sendMessage(msg); + msg->release(); + + if (_fileLabel) + _fileLabel->setText(("File: " + filePath).c_str()); } /// @@ -156,17 +158,43 @@ void SfizzVstEditor::createFrameContents() CFrame* frame = this->frame; CRect bounds = frame->getViewSize(); - CTextLabel *label; - CRect rect; - CRect rect2; + frame->setBackgroundColor(CColor(0xff, 0xff, 0xff)); - rect = CRect(10.0, 10.0, 120.0, 30.0); - frame->addView(new SimpleButton(rect, this, kTagLoadSfzFile, "Load SFZ file")); + CKickButton* sfizzButton = new CKickButton(bounds, this, kTagLoadSfzFile, &_logo); + frame->addView(sfizzButton); - rect2 = CRect(150.0, 10.0, bounds.right - 10.0, 30.0); - frame->addView((label = new CTextLabel(rect2, "no file"))); - label->setHoriAlign(kLeftText); - _fileLabel = label; + CRect bottomRow = bounds; + bottomRow.top = bottomRow.bottom - 30; + + CRect topRow = bounds; + topRow.bottom = topRow.top + 30; + + CTextLabel* descLabel = new CTextLabel( + bottomRow, "Paul Ferrand and the SFZ Tools work group"); + descLabel->setFontColor(CColor(0x00, 0x00, 0x00)); + descLabel->setBackColor(CColor(0x00, 0x00, 0x00, 0x00)); + frame->addView(descLabel); + + CRect fileBox = topRow; + fileBox.right = fileBox.left + 400; + CTextLabel* fileLabel = new CTextLabel(fileBox, "No file loaded"); + fileLabel->setFontColor(CColor(0x00, 0x00, 0x00)); + fileLabel->setBackColor(CColor(0x00, 0x00, 0x00, 0x00)); + // fileLabel->setHoriAlign(kLeftText); + frame->addView(fileLabel); + _fileLabel = fileLabel; + + // CTextLabel *label; + // CRect rect; + // CRect rect2; + + // rect = CRect(10.0, 10.0, 120.0, 30.0); + // frame->addView(new SimpleButton(rect, this, kTagLoadSfzFile, "Load SFZ file")); + + // rect2 = CRect(150.0, 10.0, bounds.right - 10.0, 30.0); + // frame->addView((label = new CTextLabel(rect2, "no file"))); + // label->setHoriAlign(kLeftText); + // _fileLabel = label; } void SfizzVstEditor::updateStateDisplay() @@ -176,5 +204,6 @@ void SfizzVstEditor::updateStateDisplay() const SfizzVstState& state = static_cast(getController())->getSfizzState(); - _fileLabel->setText(state.sfzFile.c_str()); + if (_fileLabel) + _fileLabel->setText(("File: " + state.sfzFile).c_str()); } diff --git a/vst/SfizzVstEditor.h b/vst/SfizzVstEditor.h index 4c3c44c5..44839788 100644 --- a/vst/SfizzVstEditor.h +++ b/vst/SfizzVstEditor.h @@ -36,5 +36,6 @@ private: kTagLoadSfzFile, }; + CBitmap _logo; CTextLabel* _fileLabel = nullptr; }; diff --git a/vst/resources/logo.png b/vst/resources/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..e67a60a3b53ed37a95de6223ed33633d6f43107a GIT binary patch literal 20594 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 literal 0 HcmV?d00001