diff --git a/distrho/src/DistrhoUIPrivateData.hpp b/distrho/src/DistrhoUIPrivateData.hpp index c1683735..2dffd15e 100644 --- a/distrho/src/DistrhoUIPrivateData.hpp +++ b/distrho/src/DistrhoUIPrivateData.hpp @@ -32,6 +32,11 @@ # include "../../dgl/src/pugl.hpp" #endif +#if DISTRHO_PLUGIN_WANT_STATE && DISTRHO_UI_FILE_BROWSER && !DISTRHO_PLUGIN_HAS_EXTERNAL_UI +# include +# include +#endif + #if defined(DISTRHO_PLUGIN_TARGET_JACK) || defined(DISTRHO_PLUGIN_TARGET_DSSI) # define DISTRHO_UI_IS_STANDALONE 1 #else @@ -326,9 +331,10 @@ struct UI::PrivateData { uint fgColor; double scaleFactor; uintptr_t winId; -#if DISTRHO_UI_FILE_BROWSER && !DISTRHO_PLUGIN_HAS_EXTERNAL_UI + #if DISTRHO_PLUGIN_WANT_STATE && DISTRHO_UI_FILE_BROWSER && !DISTRHO_PLUGIN_HAS_EXTERNAL_UI char* uiStateFileKeyRequest; -#endif + std::map lastUsedDirnames; + #endif char* bundlePath; // Ignore initial resize events while initializing @@ -353,9 +359,9 @@ struct UI::PrivateData { fgColor(0xffffffff), scaleFactor(1.0), winId(0), -#if DISTRHO_UI_FILE_BROWSER && !DISTRHO_PLUGIN_HAS_EXTERNAL_UI + #if DISTRHO_PLUGIN_WANT_STATE && DISTRHO_UI_FILE_BROWSER && !DISTRHO_PLUGIN_HAS_EXTERNAL_UI uiStateFileKeyRequest(nullptr), -#endif + #endif bundlePath(nullptr), initializing(true), callbacksPtr(nullptr), @@ -366,32 +372,32 @@ struct UI::PrivateData { setSizeCallbackFunc(nullptr), fileRequestCallbackFunc(nullptr) { -#if defined(DISTRHO_PLUGIN_TARGET_DSSI) || defined(DISTRHO_PLUGIN_TARGET_LV2) + #if defined(DISTRHO_PLUGIN_TARGET_DSSI) || defined(DISTRHO_PLUGIN_TARGET_LV2) parameterOffset += DISTRHO_PLUGIN_NUM_INPUTS + DISTRHO_PLUGIN_NUM_OUTPUTS; -# if DISTRHO_PLUGIN_WANT_LATENCY + #if DISTRHO_PLUGIN_WANT_LATENCY parameterOffset += 1; -# endif -#endif + #endif + #endif -#ifdef DISTRHO_PLUGIN_TARGET_LV2 -# if (DISTRHO_PLUGIN_WANT_MIDI_INPUT || DISTRHO_PLUGIN_WANT_TIMEPOS || DISTRHO_PLUGIN_WANT_STATE) + #ifdef DISTRHO_PLUGIN_TARGET_LV2 + #if (DISTRHO_PLUGIN_WANT_MIDI_INPUT || DISTRHO_PLUGIN_WANT_TIMEPOS || DISTRHO_PLUGIN_WANT_STATE) parameterOffset += 1; -# endif -# if (DISTRHO_PLUGIN_WANT_MIDI_OUTPUT || DISTRHO_PLUGIN_WANT_STATE) + #endif + #if (DISTRHO_PLUGIN_WANT_MIDI_OUTPUT || DISTRHO_PLUGIN_WANT_STATE) parameterOffset += 1; -# endif -#endif + #endif + #endif -#ifdef DISTRHO_PLUGIN_TARGET_VST3 + #ifdef DISTRHO_PLUGIN_TARGET_VST3 parameterOffset += kVst3InternalParameterCount; -#endif + #endif } ~PrivateData() noexcept { -#if DISTRHO_UI_FILE_BROWSER && !DISTRHO_PLUGIN_HAS_EXTERNAL_UI + #if DISTRHO_PLUGIN_WANT_STATE && DISTRHO_UI_FILE_BROWSER && !DISTRHO_PLUGIN_HAS_EXTERNAL_UI std::free(uiStateFileKeyRequest); -#endif + #endif std::free(bundlePath); } @@ -444,7 +450,7 @@ inline bool UI::PrivateData::fileRequestCallback(const char* const key) if (fileRequestCallbackFunc != nullptr) return fileRequestCallbackFunc(callbacksPtr, key); -#if DISTRHO_PLUGIN_WANT_STATE && DISTRHO_UI_FILE_BROWSER && !DISTRHO_PLUGIN_HAS_EXTERNAL_UI + #if DISTRHO_PLUGIN_WANT_STATE && DISTRHO_UI_FILE_BROWSER && !DISTRHO_PLUGIN_HAS_EXTERNAL_UI std::free(uiStateFileKeyRequest); uiStateFileKeyRequest = strdup(key); DISTRHO_SAFE_ASSERT_RETURN(uiStateFileKeyRequest != nullptr, false); @@ -455,8 +461,10 @@ inline bool UI::PrivateData::fileRequestCallback(const char* const key) DGL_NAMESPACE::FileBrowserOptions opts; opts.title = title; + if (lastUsedDirnames.count(key)) + opts.startDir = lastUsedDirnames[key].c_str(); return window->openFileBrowser(opts); -#endif + #endif return false; } @@ -472,7 +480,7 @@ inline void PluginWindow::onFileSelected(const char* const filename) if (initializing) return; - #if DISTRHO_PLUGIN_WANT_STATE + #if DISTRHO_PLUGIN_WANT_STATE && DISTRHO_UI_FILE_BROWSER && !DISTRHO_PLUGIN_HAS_EXTERNAL_UI if (char* const key = ui->uiData->uiStateFileKeyRequest) { ui->uiData->uiStateFileKeyRequest = nullptr; @@ -480,8 +488,13 @@ inline void PluginWindow::onFileSelected(const char* const filename) { // notify DSP ui->setState(key, filename); + // notify UI ui->stateChanged(key, filename); + + // save dirname for next time + if (const char* const lastsep = std::strrchr(filename, DISTRHO_OS_SEP)) + ui->uiData->lastUsedDirnames[key] = std::string(filename, lastsep-filename); } std::free(key); return;