Skip to content

Commit

Permalink
add/remove custom preset folder
Browse files Browse the repository at this point in the history
  • Loading branch information
iurienistor committed Mar 2, 2024
1 parent 333ae7f commit 441a6ed
Show file tree
Hide file tree
Showing 17 changed files with 503 additions and 209 deletions.
439 changes: 250 additions & 189 deletions data/design/geonkick3.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
47 changes: 46 additions & 1 deletion src/GeonkickConfig.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,8 @@ void GeonkickConfig::loadConfig(const std::string &data)
midiChannelForced = m.value.GetInt();
if (m.name == "bookmarkedPaths" && m.value.IsArray())
parseBookmarkedPaths(m.value);
if (m.name == "customPresetFolders" && m.value.IsArray())
parseCustomPresetFolders(m.value);
}
}

Expand All @@ -116,6 +118,18 @@ void GeonkickConfig::parseBookmarkedPaths(const auto &value)

}

void GeonkickConfig::parseCustomPresetFolders(const auto &value)
{
if (!value.IsArray())
return;

for (const auto &el: value.GetArray()) {
if (el.IsString())
customPresetFolders.push_back(el.GetString());
}

}

bool GeonkickConfig::save()
{
try {
Expand Down Expand Up @@ -161,7 +175,7 @@ bool GeonkickConfig::removeBookmarkedPath(const std::filesystem::path &path)
if (isPathBookmarked(path)) {
bookmarkedPaths.erase(std::remove_if(bookmarkedPaths.begin(),
bookmarkedPaths.end(),
[&path](std::filesystem::path & p)
[&path](const auto & p)
{ return p == path; }),
bookmarkedPaths.end());
return true;
Expand All @@ -174,6 +188,28 @@ const std::vector<std::filesystem::path>& GeonkickConfig::getBookmarkedPaths() c
return bookmarkedPaths;
}

bool GeonkickConfig::addCustomPresetFolder(const std::filesystem::path &folder)
{
customPresetFolders.push_back(folder);
return true;
}

bool GeonkickConfig::removeCustomPresetFolder(const std::filesystem::path &folder)
{
auto it = customPresetFolders.erase(std::remove_if(customPresetFolders.begin(),
customPresetFolders.end(),
[&folder](const auto &p)
{ return p == folder; }),
customPresetFolders.end());
return it != customPresetFolders.end();
}

const std::vector<std::filesystem::path>&
GeonkickConfig::getCustomPresetFolders() const
{
return customPresetFolders;
}

std::string GeonkickConfig::toJson() const
{
std::ostringstream jsonStream;
Expand All @@ -191,6 +227,15 @@ std::string GeonkickConfig::toJson() const
addComma = true;
jsonStream << "\"" << path.string() << "\"";
}
jsonStream << "]," << std::endl;
jsonStream << "\"customPresetFolders\": [";
addComma = false;
for (const auto &path: customPresetFolders) {
if (addComma)
jsonStream << ", ";
addComma = true;
jsonStream << "\"" << path.string() << "\"";
}
jsonStream << "]" << std::endl;
jsonStream << "}" << std::endl;
return jsonStream.str();
Expand Down
5 changes: 5 additions & 0 deletions src/GeonkickConfig.h
Original file line number Diff line number Diff line change
Expand Up @@ -41,10 +41,14 @@ class GeonkickConfig {
bool isPathBookmarked(const std::filesystem::path &path) const;
bool removeBookmarkedPath(const std::filesystem::path &path);
const std::vector<std::filesystem::path> & getBookmarkedPaths() const;
bool addCustomPresetFolder(const std::filesystem::path &folder);
bool removeCustomPresetFolder(const std::filesystem::path &folder);
const std::vector<std::filesystem::path>& getCustomPresetFolders() const;

protected:
void loadConfig(const std::string &data);
void parseBookmarkedPaths(const auto &value);
void parseCustomPresetFolders(const auto &value);
std::string toJson() const;

private:
Expand All @@ -53,6 +57,7 @@ class GeonkickConfig {
bool midiChannelForced;
std::filesystem::path configFile;
std::vector<std::filesystem::path> bookmarkedPaths;
std::vector<std::filesystem::path> customPresetFolders;
};

#endif // GEONGKICK_CONFIG_H
8 changes: 4 additions & 4 deletions src/file_dialog.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ RK_DECLARE_IMAGE_RC(save_active);
RK_DECLARE_IMAGE_RC(cancel);
RK_DECLARE_IMAGE_RC(scrollbar_button_up);
RK_DECLARE_IMAGE_RC(scrollbar_button_down);
RK_DECLARE_IMAGE_RC(new_directory);
RK_DECLARE_IMAGE_RC(add_button_16x16);
RK_DECLARE_IMAGE_RC(bookmark_16x16_unpressed);
RK_DECLARE_IMAGE_RC(bookmark_16x16_pressed);
RK_DECLARE_IMAGE_RC(bookmark_16x16_hover);
Expand Down Expand Up @@ -418,7 +418,7 @@ FileDialog::FileDialog(GeonkickWidget *parent,
RK_ACT_ARGS(RkModelItem item),
filesView,
setCurrentPath(std::get<std::string>(item.data(static_cast<int>(PathListModel::PathListDataType::Path)))));

shortcutDirectoriesView->setBorderColor(40, 40, 40);
shortcutDirectoriesView->setBorderWidth(1);
shortcutDirectoriesView->setBackgroundColor({50, 50, 50});
Expand All @@ -427,7 +427,7 @@ FileDialog::FileDialog(GeonkickWidget *parent,
shortcutDirectoriesView->show();

createBookmarkDirectoryControls(topContainer);
createNewDirectoryControls(topContainer);
// createNewDirectoryControls(topContainer);

auto buttomContainer = new RkContainer(this);
buttomContainer->setSize({mainContainer->width(), 30});
Expand Down Expand Up @@ -503,7 +503,7 @@ void FileDialog::createNewDirectoryControls(RkContainer *container)
auto createDirectoryButton = new GeonkickButton(this);
createDirectoryButton->setSize(16, 16);
createDirectoryButton->setImage(RkImage(createDirectoryButton->size(),
RK_IMAGE_RC(new_directory)),
RK_IMAGE_RC(add_button_16x16)),
RkButton::State::Unpressed);
createDirectoryButton->show();
container->addWidget(createDirectoryButton);
Expand Down
53 changes: 45 additions & 8 deletions src/geonkick_api.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
* File name: geonkick_api.cpp
* Project: Geonkick (A kick synthesizer)
*
* Copyright (C) 2017 Iurie Nistor
* Copyright (C) 2017 Iurie Nistor
*
* This file is part of Geonkick.
*
Expand Down Expand Up @@ -1439,7 +1439,7 @@ bool GeonkickApi::setPercussionMidiChannel(int index, size_t channel)
auto res = geonkick_set_midi_channel(geonkickApi,
index,
channel);
return res == GEONKICK_OK;
return res == GEONKICK_OK;
}

int GeonkickApi::getPercussionMidiChannel(int index) const
Expand All @@ -1465,7 +1465,7 @@ bool GeonkickApi::isMidiChannelForced() const
geonkick_ged_forced_midi_channel(geonkickApi, nullptr, &forced);
return forced;
}

bool GeonkickApi::setPercussionName(int index, const std::string &name)
{
auto res = geonkick_set_percussion_name(geonkickApi,
Expand Down Expand Up @@ -1812,6 +1812,14 @@ void GeonkickApi::loadPresets()
GEONKICK_LOG_ERROR("error on reading path: " << path << ": " << e.what());
}
}

// Load custom preset folders.
GeonkickConfig cfg;
for (const auto &folder: cfg.getCustomPresetFolders()) {
auto presetFolder = std::make_unique<PresetFolder>(folder);
presetFolder->setAsCustom();
presetsFoldersList.emplace_back(std::move(presetFolder));
}
}

void GeonkickApi::loadPresetsFolders(const std::filesystem::path &path)
Expand All @@ -1820,12 +1828,8 @@ void GeonkickApi::loadPresetsFolders(const std::filesystem::path &path)
for (const auto &entry : std::filesystem::directory_iterator(path)) {
if (!entry.path().empty() && std::filesystem::is_directory(entry.path())) {
auto presetFolder = std::make_unique<PresetFolder>(entry.path());
GEONKICK_LOG_DEBUG("preset folder " << presetFolder->path());
if (!presetFolder->loadPresets()) {
GEONKICK_LOG_ERROR("can't load preset from folder " << presetFolder->path());
} else if (presetFolder->numberOfPresets() > 0) {
if (presetFolder->numberOfPresets() > 0)
presetsFoldersList.push_back(std::move(presetFolder));
}
}
}
} catch(...) {
Expand Down Expand Up @@ -1866,6 +1870,39 @@ PresetFolder* GeonkickApi::getPresetFolder(size_t index) const
return nullptr;
}

PresetFolder* GeonkickApi::addPresetFolder(const std::filesystem::path &folder, bool custom)
{
auto it = std::find_if(presetsFoldersList.cbegin(),
presetsFoldersList.cend(), [&folder](const auto &e)
{
return e->path() == folder;
});
if (it == presetsFoldersList.cend()) {
auto presetFolder = std::make_unique<PresetFolder>(folder);
presetFolder->setAsCustom(custom);
GeonkickConfig cfg;
cfg.addCustomPresetFolder(presetFolder->path());
cfg.save();
return presetsFoldersList.emplace_back(std::move(presetFolder)).get();
}
return nullptr;
}

bool GeonkickApi::removePresetFolder(const PresetFolder *folder)
{
auto folderPath = folder->path();
presetsFoldersList.erase(std::remove_if(presetsFoldersList.begin(),
presetsFoldersList.end(),
[&folder](const auto &p)
{ return p->path() == folder->path(); }),
presetsFoldersList.end());

GeonkickConfig cfg;
cfg.removeCustomPresetFolder(folderPath);
cfg.save();
return true;
}

size_t GeonkickApi::numberOfPresetFolders() const
{
return presetsFoldersList.size();
Expand Down
2 changes: 2 additions & 0 deletions src/geonkick_api.h
Original file line number Diff line number Diff line change
Expand Up @@ -333,6 +333,8 @@ class GeonkickApi : public RkObject {
void clearOrderedPercussionIds();
bool moveOrdrepedPercussionId(int index, int n);
PresetFolder* getPresetFolder(size_t index) const;
PresetFolder* addPresetFolder(const std::filesystem::path &folder, bool custom = false);
bool removePresetFolder(const PresetFolder *folder);
size_t numberOfPresetFolders() const;
UiSettings* getUiSettings() const;
void setState(const std::string &data);
Expand Down
44 changes: 43 additions & 1 deletion src/preset_browser_model.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
* File name: preset_browser_model.cpp
* Project: Geonkick (A percussion synthesizer)
*
* Copyright (C) 2020 Iurie Nistor
* Copyright (C) 2020 Iurie Nistor
*
* This file is part of Geonkick.
*
Expand All @@ -27,6 +27,7 @@
#include "geonkick_api.h"
#include "percussion_state.h"
#include "kit_state.h"
#include "GeonkickConfig.h"

PresetBrowserModel::PresetBrowserModel(RkObject *parent, GeonkickApi *api)
: RkObject(parent)
Expand Down Expand Up @@ -180,6 +181,15 @@ bool PresetBrowserModel::isSelected(size_t row, size_t column) const
return false;
}

bool PresetBrowserModel::isCustomFolder(size_t row, size_t column) const
{
if (column == 0) {
auto presetFolder = getPresetFolder(row);
return presetFolder && presetFolder->isCustom();
}
return false;
}

bool PresetBrowserModel::setPreset(Preset* preset)
{
if (preset->type() == Preset::PresetType::Percussion) {
Expand Down Expand Up @@ -208,3 +218,35 @@ bool PresetBrowserModel::setPreset(Preset* preset)
}
return false;
}

bool PresetBrowserModel::addFolder(const std::filesystem::path &folder, bool custom)
{
auto presetFolder = geonkickApi->addPresetFolder(folder, custom);
if (presetFolder) {
action presetFolderAdded(presetFolder);
return true;
}
return false;
}

PresetFolder* PresetBrowserModel::currentSelectedFolder() const
{
return selectedFolder;
}

bool PresetBrowserModel::removeSelectedFolder()
{
if (selectedFolder && geonkickApi->removePresetFolder(selectedFolder)) {
selectedFolder = geonkickApi->getPresetFolder(0);
folderPageIndex = 0;
presetPageIndex = 0;
action presetFolderRemoved();
return true;
}
return false;
}

GeonkickApi* PresetBrowserModel::getGeonkickApi() const
{
return geonkickApi;
}
16 changes: 15 additions & 1 deletion src/preset_browser_model.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,8 @@
#include <RkObject.h>

class GeonkickApi;
class PresetFolder;
class Preset;
class PresetFolder;

class PresetBrowserModel : public RkObject {
public:
Expand All @@ -50,7 +50,12 @@ class PresetBrowserModel : public RkObject {
size_t rows() const;
void select(size_t row, size_t column);
bool isSelected(size_t row, size_t column) const;
bool isCustomFolder(size_t row, size_t column) const;
bool isKit(int row, int column) const;
bool addFolder(const std::filesystem::path &folder, bool custom = false);
bool removeSelectedFolder();
PresetFolder* currentSelectedFolder() const;
GeonkickApi* getGeonkickApi() const;
RK_DECL_ACT(folderSelected,
folderSelected(PresetFolder* folder),
RK_ARG_TYPE(PresetFolder*),
Expand All @@ -67,6 +72,15 @@ class PresetBrowserModel : public RkObject {
presetPageChanged(),
RK_ARG_TYPE(),
RK_ARG_VAL());
RK_DECL_ACT(presetFolderAdded,
presetFolderAdded(PresetFolder* folder),
RK_ARG_TYPE(PresetFolder*),
RK_ARG_VAL(folder));
RK_DECL_ACT(presetFolderRemoved,
presetFolderRemoved(),
RK_ARG_TYPE(),
RK_ARG_VAL());

protected:
PresetFolder* getPresetFolder(int row) const;
Preset* getPreset(int row, int column) const;
Expand Down
Loading

0 comments on commit 441a6ed

Please sign in to comment.