2021-04-19 16:06:08 +02:00
|
|
|
/*
|
|
|
|
* SPDX-License-Identifier: GPL-3.0-only
|
|
|
|
* MuseScore-CLA-applies
|
|
|
|
*
|
|
|
|
* MuseScore
|
|
|
|
* Music Composition & Notation
|
|
|
|
*
|
|
|
|
* Copyright (C) 2021 MuseScore BVBA and others
|
|
|
|
*
|
|
|
|
* This program is free software: you can redistribute it and/or modify
|
|
|
|
* it under the terms of the GNU General Public License version 3 as
|
|
|
|
* published by the Free Software Foundation.
|
|
|
|
*
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
|
|
*/
|
2021-03-19 21:06:21 +01:00
|
|
|
#include "folderspreferencesmodel.h"
|
|
|
|
|
|
|
|
#include "log.h"
|
|
|
|
#include "translation.h"
|
|
|
|
|
|
|
|
using namespace mu::appshell;
|
|
|
|
|
|
|
|
FoldersPreferencesModel::FoldersPreferencesModel(QObject* parent)
|
|
|
|
: QAbstractListModel(parent)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
int FoldersPreferencesModel::rowCount(const QModelIndex&) const
|
|
|
|
{
|
2022-04-07 20:06:37 +02:00
|
|
|
return m_folders.count();
|
2021-03-19 21:06:21 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
QVariant FoldersPreferencesModel::data(const QModelIndex& index, int role) const
|
|
|
|
{
|
2022-04-07 20:06:37 +02:00
|
|
|
const FolderInfo& folder = m_folders.at(index.row());
|
2021-03-19 21:06:21 +01:00
|
|
|
switch (role) {
|
2022-04-07 20:06:37 +02:00
|
|
|
case TitleRole: return folder.title;
|
|
|
|
case PathRole: return folder.value;
|
|
|
|
case DirRole: return folder.dir;
|
2022-05-15 16:35:32 +02:00
|
|
|
case IsMultiDirectoriesRole: return folder.valueType == FolderValueType::MultiDirectories;
|
2021-03-19 21:06:21 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
return QVariant();
|
|
|
|
}
|
|
|
|
|
|
|
|
bool FoldersPreferencesModel::setData(const QModelIndex& index, const QVariant& value, int role)
|
|
|
|
{
|
2022-04-07 20:06:37 +02:00
|
|
|
const FolderInfo& folder = m_folders.at(index.row());
|
2021-03-19 21:06:21 +01:00
|
|
|
|
|
|
|
switch (role) {
|
|
|
|
case PathRole:
|
2022-04-07 20:06:37 +02:00
|
|
|
if (folder.value == value.toString()) {
|
2021-03-19 21:06:21 +01:00
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2022-04-07 20:06:37 +02:00
|
|
|
saveFolderPaths(folder.type, value.toString());
|
2021-03-19 21:06:21 +01:00
|
|
|
return true;
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
QHash<int, QByteArray> FoldersPreferencesModel::roleNames() const
|
|
|
|
{
|
|
|
|
static const QHash<int, QByteArray> roles = {
|
|
|
|
{ TitleRole, "title" },
|
2022-03-25 16:02:43 +01:00
|
|
|
{ PathRole, "path" },
|
2022-04-07 09:45:27 +02:00
|
|
|
{ DirRole, "dir" },
|
2022-05-15 16:35:32 +02:00
|
|
|
{ IsMultiDirectoriesRole, "isMultiDirectories" }
|
2021-03-19 21:06:21 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
return roles;
|
|
|
|
}
|
|
|
|
|
|
|
|
void FoldersPreferencesModel::load()
|
|
|
|
{
|
|
|
|
beginResetModel();
|
|
|
|
|
2022-04-07 20:06:37 +02:00
|
|
|
m_folders = {
|
|
|
|
{ FolderType::Scores, qtrc("appshell", "Scores"), projectConfiguration()->userProjectsPath().toQString(),
|
2022-04-07 09:45:27 +02:00
|
|
|
projectConfiguration()->userProjectsPath().toQString() },
|
2022-04-07 20:06:37 +02:00
|
|
|
{ FolderType::Styles, qtrc("appshell", "Styles"), notationConfiguration()->userStylesPath().toQString(),
|
2022-04-07 09:45:27 +02:00
|
|
|
notationConfiguration()->userStylesPath().toQString() },
|
2022-04-07 20:06:37 +02:00
|
|
|
{ FolderType::Templates, qtrc("appshell", "Templates"), projectConfiguration()->userTemplatesPath().toQString(),
|
2022-04-07 09:45:27 +02:00
|
|
|
projectConfiguration()->userTemplatesPath().toQString() },
|
2022-04-07 20:06:37 +02:00
|
|
|
{ FolderType::Plugins, qtrc("appshell", "Plugins"), pluginsConfiguration()->userPluginsPath().toQString(),
|
2022-04-07 09:45:27 +02:00
|
|
|
pluginsConfiguration()->userPluginsPath().toQString() },
|
2022-04-07 20:06:37 +02:00
|
|
|
{ FolderType::SoundFonts, qtrc("appshell", "SoundFonts"), pathsToString(audioConfiguration()->userSoundFontDirectories()),
|
|
|
|
configuration()->userDataPath().toQString(), FolderValueType::MultiDirectories },
|
2022-04-08 14:53:48 +02:00
|
|
|
{ FolderType::VST3, qtrc("appshell", "VST3"), pathsToString(vstConfiguration()->userVstDirectories()),
|
|
|
|
configuration()->userDataPath().toQString(), FolderValueType::MultiDirectories },
|
2022-04-07 20:06:37 +02:00
|
|
|
{ FolderType::Images, qtrc("appshell", "Images"), "", "" } // todo: need implement
|
2021-03-19 21:06:21 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
endResetModel();
|
|
|
|
|
|
|
|
setupConnections();
|
|
|
|
}
|
|
|
|
|
|
|
|
void FoldersPreferencesModel::setupConnections()
|
|
|
|
{
|
2021-08-02 11:29:59 +02:00
|
|
|
projectConfiguration()->userProjectsPathChanged().onReceive(this, [this](const io::path& path) {
|
2022-04-07 20:06:37 +02:00
|
|
|
setFolderPaths(FolderType::Scores, path.toQString());
|
2021-03-19 21:06:21 +01:00
|
|
|
});
|
|
|
|
|
2021-06-29 13:34:19 +02:00
|
|
|
notationConfiguration()->userStylesPathChanged().onReceive(this, [this](const io::path& path) {
|
2022-04-07 20:06:37 +02:00
|
|
|
setFolderPaths(FolderType::Styles, path.toQString());
|
2021-03-19 21:06:21 +01:00
|
|
|
});
|
|
|
|
|
2021-08-02 11:03:01 +02:00
|
|
|
projectConfiguration()->userTemplatesPathChanged().onReceive(this, [this](const io::path& path) {
|
2022-04-07 20:06:37 +02:00
|
|
|
setFolderPaths(FolderType::Templates, path.toQString());
|
2021-03-19 21:06:21 +01:00
|
|
|
});
|
|
|
|
|
2021-06-29 13:52:16 +02:00
|
|
|
pluginsConfiguration()->userPluginsPathChanged().onReceive(this, [this](const io::path& path) {
|
2022-04-07 20:06:37 +02:00
|
|
|
setFolderPaths(FolderType::Plugins, path.toQString());
|
2022-03-25 16:02:43 +01:00
|
|
|
});
|
|
|
|
|
|
|
|
audioConfiguration()->soundFontDirectoriesChanged().onReceive(this, [this](const io::paths&) {
|
|
|
|
io::paths userSoundFontsPaths = audioConfiguration()->userSoundFontDirectories();
|
2022-04-07 20:06:37 +02:00
|
|
|
setFolderPaths(FolderType::SoundFonts, pathsToString(userSoundFontsPaths));
|
2021-03-19 21:06:21 +01:00
|
|
|
});
|
2022-04-08 14:53:48 +02:00
|
|
|
|
|
|
|
vstConfiguration()->userVstDirectoriesChanged().onReceive(this, [this](const io::paths& paths) {
|
|
|
|
setFolderPaths(FolderType::VST3, pathsToString(paths));
|
|
|
|
});
|
2021-03-19 21:06:21 +01:00
|
|
|
}
|
|
|
|
|
2022-04-07 20:06:37 +02:00
|
|
|
void FoldersPreferencesModel::saveFolderPaths(FoldersPreferencesModel::FolderType folderType, const QString& paths)
|
2021-03-19 21:06:21 +01:00
|
|
|
{
|
2022-04-07 20:06:37 +02:00
|
|
|
switch (folderType) {
|
|
|
|
case FolderType::Scores: {
|
|
|
|
io::path folderPath = paths.toStdString();
|
2021-08-02 11:29:59 +02:00
|
|
|
projectConfiguration()->setUserProjectsPath(folderPath);
|
2021-03-19 21:06:21 +01:00
|
|
|
break;
|
2022-03-25 16:02:43 +01:00
|
|
|
}
|
2022-04-07 20:06:37 +02:00
|
|
|
case FolderType::Styles: {
|
|
|
|
io::path folderPath = paths.toStdString();
|
2021-06-29 13:34:19 +02:00
|
|
|
notationConfiguration()->setUserStylesPath(folderPath);
|
2021-03-19 21:06:21 +01:00
|
|
|
break;
|
2022-03-25 16:02:43 +01:00
|
|
|
}
|
2022-04-07 20:06:37 +02:00
|
|
|
case FolderType::Templates: {
|
|
|
|
io::path folderPath = paths.toStdString();
|
2021-08-02 11:03:01 +02:00
|
|
|
projectConfiguration()->setUserTemplatesPath(folderPath);
|
2021-03-19 21:06:21 +01:00
|
|
|
break;
|
2022-03-25 16:02:43 +01:00
|
|
|
}
|
2022-04-07 20:06:37 +02:00
|
|
|
case FolderType::Plugins: {
|
|
|
|
io::path folderPath = paths.toStdString();
|
2021-06-29 13:52:16 +02:00
|
|
|
pluginsConfiguration()->setUserPluginsPath(folderPath);
|
2021-03-19 21:06:21 +01:00
|
|
|
break;
|
2022-03-25 16:02:43 +01:00
|
|
|
}
|
2022-04-07 20:06:37 +02:00
|
|
|
case FolderType::SoundFonts: {
|
|
|
|
audioConfiguration()->setUserSoundFontDirectories(pathsFromString(paths));
|
2021-03-19 21:06:21 +01:00
|
|
|
break;
|
2022-03-25 16:02:43 +01:00
|
|
|
}
|
2022-04-08 14:53:48 +02:00
|
|
|
case FolderType::VST3: {
|
|
|
|
vstConfiguration()->setUserVstDirectories(pathsFromString(paths));
|
|
|
|
break;
|
|
|
|
}
|
2022-04-07 20:06:37 +02:00
|
|
|
case FolderType::Images:
|
2021-03-19 21:06:21 +01:00
|
|
|
NOT_IMPLEMENTED;
|
|
|
|
break;
|
2022-04-07 20:06:37 +02:00
|
|
|
case FolderType::Undefined:
|
2022-03-25 16:02:43 +01:00
|
|
|
break;
|
2021-03-19 21:06:21 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-04-07 20:06:37 +02:00
|
|
|
void FoldersPreferencesModel::setFolderPaths(FoldersPreferencesModel::FolderType folderType, const QString& paths)
|
2021-03-19 21:06:21 +01:00
|
|
|
{
|
2022-04-07 20:06:37 +02:00
|
|
|
QModelIndex index = folderIndex(folderType);
|
2021-03-19 21:06:21 +01:00
|
|
|
if (!index.isValid()) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2022-04-07 20:06:37 +02:00
|
|
|
m_folders[index.row()].value = paths;
|
2021-03-19 21:06:21 +01:00
|
|
|
emit dataChanged(index, index, { PathRole });
|
|
|
|
}
|
|
|
|
|
2022-04-07 20:06:37 +02:00
|
|
|
QModelIndex FoldersPreferencesModel::folderIndex(FoldersPreferencesModel::FolderType folderType)
|
2021-03-19 21:06:21 +01:00
|
|
|
{
|
2022-04-07 20:06:37 +02:00
|
|
|
for (int i = 0; i < m_folders.count(); ++i) {
|
|
|
|
FolderInfo& folderInfo = m_folders[i];
|
|
|
|
if (folderInfo.type == folderType) {
|
2021-03-19 21:06:21 +01:00
|
|
|
return index(i, 0);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return QModelIndex();
|
|
|
|
}
|
2022-03-25 16:02:43 +01:00
|
|
|
|
|
|
|
QString FoldersPreferencesModel::pathsToString(const mu::io::paths& paths) const
|
|
|
|
{
|
|
|
|
return QString::fromStdString(io::pathsToString(paths));
|
|
|
|
}
|
|
|
|
|
|
|
|
mu::io::paths FoldersPreferencesModel::pathsFromString(const QString& pathsStr) const
|
|
|
|
{
|
|
|
|
return io::pathsFromString(pathsStr.toStdString());
|
|
|
|
}
|