Browse Source

Remember last used filename dir when using requestStateFile

pull/421/head
falkTX 2 years ago
parent
commit
82b7841a24
1 changed files with 34 additions and 21 deletions
  1. +34
    -21
      distrho/src/DistrhoUIPrivateData.hpp

+ 34
- 21
distrho/src/DistrhoUIPrivateData.hpp View File

@@ -32,6 +32,11 @@
# include "../../dgl/src/pugl.hpp" # include "../../dgl/src/pugl.hpp"
#endif #endif


#if DISTRHO_PLUGIN_WANT_STATE && DISTRHO_UI_FILE_BROWSER && !DISTRHO_PLUGIN_HAS_EXTERNAL_UI
# include <map>
# include <string>
#endif

#if defined(DISTRHO_PLUGIN_TARGET_JACK) || defined(DISTRHO_PLUGIN_TARGET_DSSI) #if defined(DISTRHO_PLUGIN_TARGET_JACK) || defined(DISTRHO_PLUGIN_TARGET_DSSI)
# define DISTRHO_UI_IS_STANDALONE 1 # define DISTRHO_UI_IS_STANDALONE 1
#else #else
@@ -326,9 +331,10 @@ struct UI::PrivateData {
uint fgColor; uint fgColor;
double scaleFactor; double scaleFactor;
uintptr_t winId; 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; char* uiStateFileKeyRequest;
#endif
std::map<std::string,std::string> lastUsedDirnames;
#endif
char* bundlePath; char* bundlePath;


// Ignore initial resize events while initializing // Ignore initial resize events while initializing
@@ -353,9 +359,9 @@ struct UI::PrivateData {
fgColor(0xffffffff), fgColor(0xffffffff),
scaleFactor(1.0), scaleFactor(1.0),
winId(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), uiStateFileKeyRequest(nullptr),
#endif
#endif
bundlePath(nullptr), bundlePath(nullptr),
initializing(true), initializing(true),
callbacksPtr(nullptr), callbacksPtr(nullptr),
@@ -366,32 +372,32 @@ struct UI::PrivateData {
setSizeCallbackFunc(nullptr), setSizeCallbackFunc(nullptr),
fileRequestCallbackFunc(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; parameterOffset += DISTRHO_PLUGIN_NUM_INPUTS + DISTRHO_PLUGIN_NUM_OUTPUTS;
# if DISTRHO_PLUGIN_WANT_LATENCY
#if DISTRHO_PLUGIN_WANT_LATENCY
parameterOffset += 1; 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; 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; parameterOffset += 1;
# endif
#endif
#endif
#endif


#ifdef DISTRHO_PLUGIN_TARGET_VST3
#ifdef DISTRHO_PLUGIN_TARGET_VST3
parameterOffset += kVst3InternalParameterCount; parameterOffset += kVst3InternalParameterCount;
#endif
#endif
} }


~PrivateData() noexcept ~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); std::free(uiStateFileKeyRequest);
#endif
#endif
std::free(bundlePath); std::free(bundlePath);
} }


@@ -444,7 +450,7 @@ inline bool UI::PrivateData::fileRequestCallback(const char* const key)
if (fileRequestCallbackFunc != nullptr) if (fileRequestCallbackFunc != nullptr)
return fileRequestCallbackFunc(callbacksPtr, key); 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); std::free(uiStateFileKeyRequest);
uiStateFileKeyRequest = strdup(key); uiStateFileKeyRequest = strdup(key);
DISTRHO_SAFE_ASSERT_RETURN(uiStateFileKeyRequest != nullptr, false); DISTRHO_SAFE_ASSERT_RETURN(uiStateFileKeyRequest != nullptr, false);
@@ -455,8 +461,10 @@ inline bool UI::PrivateData::fileRequestCallback(const char* const key)


DGL_NAMESPACE::FileBrowserOptions opts; DGL_NAMESPACE::FileBrowserOptions opts;
opts.title = title; opts.title = title;
if (lastUsedDirnames.count(key))
opts.startDir = lastUsedDirnames[key].c_str();
return window->openFileBrowser(opts); return window->openFileBrowser(opts);
#endif
#endif


return false; return false;
} }
@@ -472,7 +480,7 @@ inline void PluginWindow::onFileSelected(const char* const filename)
if (initializing) if (initializing)
return; 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) if (char* const key = ui->uiData->uiStateFileKeyRequest)
{ {
ui->uiData->uiStateFileKeyRequest = nullptr; ui->uiData->uiStateFileKeyRequest = nullptr;
@@ -480,8 +488,13 @@ inline void PluginWindow::onFileSelected(const char* const filename)
{ {
// notify DSP // notify DSP
ui->setState(key, filename); ui->setState(key, filename);

// notify UI // notify UI
ui->stateChanged(key, filename); 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); std::free(key);
return; return;


Loading…
Cancel
Save