Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Adding file/folder drop support #91

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Feb 28, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 8 additions & 2 deletions src/ProjectMSDLApplication.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,6 @@ void ProjectMSDLApplication::initialize(Poco::Util::Application& self)
{
loadConfiguration(configFilePath.toString(), PRIO_DEFAULT);
}

}
}
}
Expand Down Expand Up @@ -202,6 +201,14 @@ void ProjectMSDLApplication::defineOptions(Poco::Util::OptionSet& options)
false, "<0/1>", true)
.binding("projectM.shuffleEnabled", _commandLineOverrides));

options.addOption(Option("skipToDropped", "", "Skip to drag & dropped presets",
false, "<0/1>", true)
.binding("projectM.skipToDropped", _commandLineOverrides));

options.addOption(Option("droppedFolderOverride", "", "When dropping a folder, clear the playlist and add all presets from the folder.",
false, "<0/1>", true)
.binding("projectM.droppedFolderOverride", _commandLineOverrides));

options.addOption(Option("presetDuration", "", "Preset duration. Any number > 1, default 30.",
false, "<number>", true)
.binding("projectM.displayDuration", _commandLineOverrides));
Expand Down Expand Up @@ -273,4 +280,3 @@ void ProjectMSDLApplication::ListAudioDevices(POCO_UNUSED const std::string& nam
{
_commandLineOverrides->setBool("audio.listDevices", true);
}

91 changes: 91 additions & 0 deletions src/RenderLoop.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,16 @@

#include <SDL2/SDL.h>

#include "ProjectMSDLApplication.h"

RenderLoop::RenderLoop()
: _audioCapture(Poco::Util::Application::instance().getSubsystem<AudioCapture>())
, _projectMWrapper(Poco::Util::Application::instance().getSubsystem<ProjectMWrapper>())
, _sdlRenderingWindow(Poco::Util::Application::instance().getSubsystem<SDLRenderingWindow>())
, _projectMHandle(_projectMWrapper.ProjectM())
, _playlistHandle(_projectMWrapper.Playlist())
, _projectMGui(Poco::Util::Application::instance().getSubsystem<ProjectMGUI>())
, _userConfig(ProjectMSDLApplication::instance().UserConfiguration())
{
}

Expand Down Expand Up @@ -103,6 +106,94 @@ void RenderLoop::PollEvents()

break;

case SDL_DROPFILE: {
char* droppedFilePath = event.drop.file;

// first we want to get the config settings that are relevant ehre
// namely skipToDropped and droppedFolderOverride
// we can get them from the projectMWrapper, in the _projectMConfigView available on it
bool skipToDropped = _userConfig->getBool("projectM.skipToDropped", true);
bool droppedFolderOverride = _userConfig->getBool("projectM.droppedFolderOverride", false);


bool shuffle = projectm_playlist_get_shuffle(_playlistHandle);
if (shuffle && skipToDropped)
{
// if shuffle is enabled, we disable it temporarily, so the dropped preset is played next
// if skipToDropped is false, we also keep shuffle enabled, as it doesn't matter since the current preset is unaffected
projectm_playlist_set_shuffle(_playlistHandle, false);
}

int index = projectm_playlist_get_position(_playlistHandle) + 1;

do
{
Poco::File droppedFile(droppedFilePath);
if (!droppedFile.isDirectory())
{
// handle dropped preset file
Poco::Path droppedFileP(droppedFilePath);
if (!droppedFile.exists() || (droppedFileP.getExtension() != "milk" && droppedFileP.getExtension() != "prjm"))
{
std::string toastMessage = std::string("Invalid preset file: ") + droppedFilePath;
Poco::NotificationCenter::defaultCenter().postNotification(new DisplayToastNotification(toastMessage));
poco_information_f1(_logger, "%s", toastMessage);
break; // exit the block and go to the shuffle check
}

if (projectm_playlist_insert_preset(_playlistHandle, droppedFilePath, index, true))
{
if (skipToDropped)
{
projectm_playlist_play_next(_playlistHandle, true);
}
poco_information_f1(_logger, "Added preset: %s", std::string(droppedFilePath));
// no need to toast single presets, as its obvious if a preset was loaded.
}
}
else
{
// handle dropped directory

// if droppedFolderOverride is enabled, we clear the playlist first
// current edge case: if the dropped directory is invalid or contains no presets, then it still clears the playlist
if (droppedFolderOverride)
{
projectm_playlist_clear(_playlistHandle);
index = 0;
}

uint32_t addedFilesCount = projectm_playlist_insert_path(_playlistHandle, droppedFilePath, index, true, true);
if (addedFilesCount > 0)
{
std::string toastMessage = "Added " + std::to_string(addedFilesCount) + " presets from " + droppedFilePath;
poco_information_f1(_logger, "%s", toastMessage);
if (skipToDropped || droppedFolderOverride)
{
// if skip to dropped is true, or if a folder was dropped and it overrode the playlist, we skip to the next preset
projectm_playlist_play_next(_playlistHandle, true);
}
Poco::NotificationCenter::defaultCenter().postNotification(new DisplayToastNotification(toastMessage));
}
else
{
std::string toastMessage = std::string("No presets found in: ") + droppedFilePath;
Poco::NotificationCenter::defaultCenter().postNotification(new DisplayToastNotification(toastMessage));
poco_information_f1(_logger, "%s", toastMessage);
}
}
} while (false);

if (shuffle && skipToDropped)
{
projectm_playlist_set_shuffle(_playlistHandle, true);
}

SDL_free(droppedFilePath);
break;
}


case SDL_QUIT:
_wantsToQuit = true;
break;
Expand Down
2 changes: 2 additions & 0 deletions src/RenderLoop.h
Original file line number Diff line number Diff line change
Expand Up @@ -87,5 +87,7 @@ class RenderLoop

ModifierKeyStates _keyStates; //!< Current "pressed" states of modifier keys

Poco::AutoPtr<Poco::Util::AbstractConfiguration> _userConfig; //!< View of the "projectM" configuration subkey in the "user" configuration.

Poco::Logger& _logger{Poco::Logger::get("RenderLoop")}; //!< The class logger.
};
8 changes: 8 additions & 0 deletions src/gui/SettingsWindow.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,14 @@ void SettingsWindow::DrawProjectMSettingsTab()
LabelWithTooltip("Shuffle Presets", "Selects presets randomly from the current playlist.");
BooleanSetting("projectM.shuffleEnabled", true);

ImGui::TableNextRow();
LabelWithTooltip("Skip To Dropped Presets", "If enabled, will skip to the new presets when preset(s) are dropped onto the window and added to the playlist");
BooleanSetting("projectM.skipToDropped", true);

ImGui::TableNextRow();
LabelWithTooltip("Dropped Folder Overrides Playlist", "When dropping a folder, clear the playlist and add all presets from the folder.");
BooleanSetting("projectM.droppedFolderOverride", false);

ImGui::TableNextRow();
LabelWithTooltip("Preset Display Duration", "Time in seconds a preset will be displayed before it's switched.");
DoubleSetting("projectM.displayDuration", 30.0, 1.0, 240.0);
Expand Down
Loading