File indexing completed on 2024-05-26 04:57:45

0001 /**
0002  * \file isettings.h
0003  * Interface for application settings.
0004  *
0005  * \b Project: Kid3
0006  * \author Urs Fleisch
0007  * \date 07 Apr 2013
0008  *
0009  * Copyright (C) 2013-2024  Urs Fleisch
0010  *
0011  * This file is part of Kid3.
0012  *
0013  * Kid3 is free software; you can redistribute it and/or modify
0014  * it under the terms of the GNU General Public License as published by
0015  * the Free Software Foundation; either version 2 of the License, or
0016  * (at your option) any later version.
0017  *
0018  * Kid3 is distributed in the hope that it will be useful,
0019  * but WITHOUT ANY WARRANTY; without even the implied warranty of
0020  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
0021  * GNU General Public License for more details.
0022  *
0023  * You should have received a copy of the GNU General Public License
0024  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
0025  */
0026 
0027 #include "isettings.h"
0028 #include <QVariant>
0029 #include <QStringList>
0030 
0031 /**
0032  * Destructor.
0033  */
0034 ISettings::~ISettings()
0035 {
0036 }
0037 
0038 /**
0039  * Migrate from an old settings version.
0040  * Can be called from the constructor of derived classes to automatically
0041  * convert old settings.
0042  */
0043 void ISettings::migrateOldSettings()
0044 {
0045   beginGroup(QLatin1String("Tags"));
0046   bool isOld = !contains(QLatin1String("MarkTruncations"));
0047   endGroup();
0048   if (isOld) {
0049     bool migrated = false;
0050 #if QT_VERSION >= 0x060000
0051     static const struct {
0052       const char* oldKey;
0053       const char* newKey;
0054       QMetaType::Type type;
0055     } mappings[] = {
0056       { "Id3Format/FormatWhileEditing", "TagFormat/FormatWhileEditing", QMetaType::Bool },
0057       { "Id3Format/CaseConversion", "TagFormat/CaseConversion", QMetaType::Int },
0058       { "Id3Format/LocaleName", "TagFormat/LocaleName", QMetaType::QString },
0059       { "Id3Format/StrRepEnabled", "TagFormat/StrRepEnabled", QMetaType::Bool },
0060       { "Id3Format/StrRepMapKeys", "TagFormat/StrRepMapKeys", QMetaType::QStringList },
0061       { "Id3Format/StrRepMapValues", "TagFormat/StrRepMapValues", QMetaType::QStringList },
0062       { "General Options/HideToolBar", "MainWindow/HideToolBar", QMetaType::Bool },
0063       { "General Options/HideStatusBar", "MainWindow/HideStatusBar", QMetaType::Bool },
0064       { "General Options/Geometry", "MainWindow/Geometry", QMetaType::QByteArray },
0065       { "General Options/WindowState", "MainWindow/WindowState", QMetaType::QByteArray },
0066       { "General Options/UseFont", "MainWindow/UseFont", QMetaType::Bool },
0067       { "General Options/FontFamily", "MainWindow/FontFamily", QMetaType::QString },
0068       { "General Options/FontSize", "MainWindow/FontSize", QMetaType::Int },
0069       { "General Options/Style", "MainWindow/Style", QMetaType::QString },
0070       { "General Options/DontUseNativeDialogs", "MainWindow/DontUseNativeDialogs", QMetaType::Bool },
0071       { "General Options/MarkTruncations", "Tags/MarkTruncations", QMetaType::Bool },
0072       { "General Options/EnableTotalNumberOfTracks", "Tags/EnableTotalNumberOfTracks", QMetaType::Bool },
0073       { "General Options/GenreNotNumeric", "Tags/GenreNotNumeric", QMetaType::Bool },
0074       { "General Options/CommentName", "Tags/CommentName", QMetaType::QString },
0075       { "General Options/PictureNameItem", "Tags/PictureNameItem", QMetaType::Int },
0076       { "General Options/CustomGenres", "Tags/CustomGenres", QMetaType::QStringList },
0077       { "General Options/ID3v2Version", "Tags/ID3v2Version", QMetaType::Int },
0078       { "General Options/TextEncodingV1", "Tags/TextEncodingV1", QMetaType::QString },
0079       { "General Options/TextEncoding", "Tags/TextEncoding", QMetaType::Int },
0080       { "General Options/QuickAccessFrames", "Tags/QuickAccessFrames", QMetaType::UInt },
0081       { "General Options/TrackNumberDigits", "Tags/TrackNumberDigits", QMetaType::Int },
0082       { "General Options/OnlyCustomGenres", "Tags/OnlyCustomGenres", QMetaType::Bool },
0083       { "General Options/NameFilter3", "Files/NameFilter", QMetaType::QString },
0084       { "General Options/FormatItem", "Files/FormatItem", QMetaType::Int },
0085       { "General Options/FormatItems", "Files/FormatItems", QMetaType::QStringList },
0086       { "General Options/FormatText2", "Files/FormatText", QMetaType::QString },
0087       { "General Options/FormatFromFilenameItem", "Files/FormatFromFilenameItem", QMetaType::Int },
0088       { "General Options/FormatFromFilenameItems", "Files/FormatFromFilenameItems", QMetaType::QStringList },
0089       { "General Options/FormatFromFilenameText", "Files/FormatFromFilenameText", QMetaType::QString },
0090       { "General Options/PreserveTime", "Files/PreserveTime", QMetaType::Bool },
0091       { "General Options/MarkChanges", "Files/MarkChanges", QMetaType::Bool },
0092       { "General Options/LoadLastOpenedFile", "Files/LoadLastOpenedFile", QMetaType::Bool },
0093       { "General Options/LastOpenedFile", "Files/LastOpenedFile", QMetaType::QString },
0094       { "General Options/DefaultCoverFileName", "Files/DefaultCoverFileName", QMetaType::QString },
0095       { "General Options/DirFormatItem", "RenameDirectory/DirFormatItem", QMetaType::Int },
0096       { "General Options/DirFormatText", "RenameDirectory/DirFormatText", QMetaType::QString },
0097       { "General Options/RenameDirectorySource", "RenameDirectory/RenameDirectorySource", QMetaType::Int },
0098       { "General Options/NumberTracksDestination", "NumberTracks/NumberTracksDestination", QMetaType::Int },
0099       { "General Options/NumberTracksStartNumber", "NumberTracks/NumberTracksStartNumber", QMetaType::Int },
0100       { "General Options/AutoHideTags", "GUI/AutoHideTags", QMetaType::Bool },
0101       { "General Options/HideFile", "GUI/HideFile", QMetaType::Bool },
0102       { "General Options/HideV1", "GUI/HideV1", QMetaType::Bool },
0103       { "General Options/HideV2", "GUI/HideV2", QMetaType::Bool },
0104       { "General Options/HidePicture", "GUI/HidePicture", QMetaType::Bool },
0105       { "General Options/PlayOnDoubleClick", "GUI/PlayOnDoubleClick", QMetaType::Bool },
0106       { "General Options/SplitterSize0", "GUI/SplitterSize0", QMetaType::Int },
0107       { "General Options/SplitterSize1", "GUI/SplitterSize1", QMetaType::Int },
0108       { "General Options/VSplitterSize0", "GUI/VSplitterSize0", QMetaType::Int },
0109       { "General Options/VSplitterSize1", "GUI/VSplitterSize1", QMetaType::Int },
0110       { "General Options/UseProxy", "Network/UseProxy", QMetaType::Bool },
0111       { "General Options/Proxy", "Network/Proxy", QMetaType::QString },
0112       { "General Options/UseProxyAuthentication", "Network/UseProxyAuthentication", QMetaType::Bool },
0113       { "General Options/ProxyUserName", "Network/ProxyUserName", QMetaType::QString },
0114       { "General Options/ProxyPassword", "Network/ProxyPassword", QMetaType::QString },
0115       { "General Options/Browser", "Network/Browser", QMetaType::QString },
0116       { "General Options/ImportServer", "Import/ImportServer", QMetaType::Int },
0117       { "General Options/ImportDestination", "Import/ImportDestination", QMetaType::Int },
0118       { "General Options/ImportFormatNames", "Import/ImportFormatNames", QMetaType::QStringList },
0119       { "General Options/ImportFormatHeaders", "Import/ImportFormatHeaders", QMetaType::QStringList },
0120       { "General Options/ImportFormatTracks", "Import/ImportFormatTracks", QMetaType::QStringList },
0121       { "General Options/ImportFormatIdx", "Import/ImportFormatIdx", QMetaType::Int },
0122       { "General Options/EnableTimeDifferenceCheck", "Import/EnableTimeDifferenceCheck", QMetaType::Bool },
0123       { "General Options/MaxTimeDifference", "Import/MaxTimeDifference", QMetaType::Int },
0124       { "General Options/ImportVisibleColumns", "Import/ImportVisibleColumns", QMetaType::ULongLong },
0125       { "General Options/ImportWindowGeometry", "Import/ImportWindowGeometry", QMetaType::QByteArray },
0126       { "General Options/ImportTagsNames", "Import/ImportTagsNames", QMetaType::QStringList },
0127       { "General Options/ImportTagsSources", "Import/ImportTagsSources", QMetaType::QStringList },
0128       { "General Options/ImportTagsExtractions", "Import/ImportTagsExtractions", QMetaType::QStringList },
0129       { "General Options/ImportTagsIdx", "Import/ImportTagsIdx", QMetaType::Int },
0130       { "General Options/PictureSourceNames", "Import/PictureSourceNames", QMetaType::QStringList },
0131       { "General Options/PictureSourceUrls", "Import/PictureSourceUrls", QMetaType::QStringList },
0132       { "General Options/PictureSourceIdx", "Import/PictureSourceIdx", QMetaType::Int },
0133       { "General Options/MatchPictureUrlMapKeys", "Import/MatchPictureUrlMapKeys", QMetaType::QStringList },
0134       { "General Options/MatchPictureUrlMapValues", "Import/MatchPictureUrlMapValues", QMetaType::QStringList },
0135       { "General Options/BrowseCoverArtWindowGeometry", "Import/BrowseCoverArtWindowGeometry", QMetaType::QByteArray },
0136       { "General Options/ExportSourceV1", "Export/ExportSourceV1", QMetaType::Bool },
0137       { "General Options/ExportFormatNames", "Export/ExportFormatNames", QMetaType::QStringList },
0138       { "General Options/ExportFormatHeaders", "Export/ExportFormatHeaders", QMetaType::QStringList },
0139       { "General Options/ExportFormatTracks", "Export/ExportFormatTracks", QMetaType::QStringList },
0140       { "General Options/ExportFormatTrailers", "Export/ExportFormatTrailers", QMetaType::QStringList },
0141       { "General Options/ExportFormatIdx", "Export/ExportFormatIdx", QMetaType::Int },
0142       { "General Options/ExportWindowGeometry", "Export/ExportWindowGeometry", QMetaType::QByteArray }
0143     };
0144     for (const auto& mapping : mappings) {
0145       QStringList groupKey = QString::fromLatin1(mapping.oldKey)
0146           .split(QLatin1Char('/'));
0147       beginGroup(groupKey.at(0));
0148       if (contains(groupKey.at(1))) {
0149         QVariant val = value(groupKey.at(1), QVariant(QMetaType(mapping.type)));
0150         remove(groupKey.at(1));
0151         endGroup();
0152         groupKey = QString::fromLatin1(mapping.newKey)
0153             .split(QLatin1Char('/'));
0154         beginGroup(groupKey.at(0));
0155         setValue(groupKey.at(1), val);
0156         migrated = true;
0157       }
0158       endGroup();
0159     }
0160 #else
0161     static const struct {
0162       const char* oldKey;
0163       const char* newKey;
0164       QVariant::Type type;
0165     } mappings[] = {
0166       { "Id3Format/FormatWhileEditing", "TagFormat/FormatWhileEditing", QVariant::Bool },
0167       { "Id3Format/CaseConversion", "TagFormat/CaseConversion", QVariant::Int },
0168       { "Id3Format/LocaleName", "TagFormat/LocaleName", QVariant::String },
0169       { "Id3Format/StrRepEnabled", "TagFormat/StrRepEnabled", QVariant::Bool },
0170       { "Id3Format/StrRepMapKeys", "TagFormat/StrRepMapKeys", QVariant::StringList },
0171       { "Id3Format/StrRepMapValues", "TagFormat/StrRepMapValues", QVariant::StringList },
0172       { "General Options/HideToolBar", "MainWindow/HideToolBar", QVariant::Bool },
0173       { "General Options/HideStatusBar", "MainWindow/HideStatusBar", QVariant::Bool },
0174       { "General Options/Geometry", "MainWindow/Geometry", QVariant::ByteArray },
0175       { "General Options/WindowState", "MainWindow/WindowState", QVariant::ByteArray },
0176       { "General Options/UseFont", "MainWindow/UseFont", QVariant::Bool },
0177       { "General Options/FontFamily", "MainWindow/FontFamily", QVariant::String },
0178       { "General Options/FontSize", "MainWindow/FontSize", QVariant::Int },
0179       { "General Options/Style", "MainWindow/Style", QVariant::String },
0180       { "General Options/DontUseNativeDialogs", "MainWindow/DontUseNativeDialogs", QVariant::Bool },
0181       { "General Options/MarkTruncations", "Tags/MarkTruncations", QVariant::Bool },
0182       { "General Options/EnableTotalNumberOfTracks", "Tags/EnableTotalNumberOfTracks", QVariant::Bool },
0183       { "General Options/GenreNotNumeric", "Tags/GenreNotNumeric", QVariant::Bool },
0184       { "General Options/CommentName", "Tags/CommentName", QVariant::String },
0185       { "General Options/PictureNameItem", "Tags/PictureNameItem", QVariant::Int },
0186       { "General Options/CustomGenres", "Tags/CustomGenres", QVariant::StringList },
0187       { "General Options/ID3v2Version", "Tags/ID3v2Version", QVariant::Int },
0188       { "General Options/TextEncodingV1", "Tags/TextEncodingV1", QVariant::String },
0189       { "General Options/TextEncoding", "Tags/TextEncoding", QVariant::Int },
0190       { "General Options/QuickAccessFrames", "Tags/QuickAccessFrames", QVariant::UInt },
0191       { "General Options/TrackNumberDigits", "Tags/TrackNumberDigits", QVariant::Int },
0192       { "General Options/OnlyCustomGenres", "Tags/OnlyCustomGenres", QVariant::Bool },
0193       { "General Options/NameFilter3", "Files/NameFilter", QVariant::String },
0194       { "General Options/FormatItem", "Files/FormatItem", QVariant::Int },
0195       { "General Options/FormatItems", "Files/FormatItems", QVariant::StringList },
0196       { "General Options/FormatText2", "Files/FormatText", QVariant::String },
0197       { "General Options/FormatFromFilenameItem", "Files/FormatFromFilenameItem", QVariant::Int },
0198       { "General Options/FormatFromFilenameItems", "Files/FormatFromFilenameItems", QVariant::StringList },
0199       { "General Options/FormatFromFilenameText", "Files/FormatFromFilenameText", QVariant::String },
0200       { "General Options/PreserveTime", "Files/PreserveTime", QVariant::Bool },
0201       { "General Options/MarkChanges", "Files/MarkChanges", QVariant::Bool },
0202       { "General Options/LoadLastOpenedFile", "Files/LoadLastOpenedFile", QVariant::Bool },
0203       { "General Options/LastOpenedFile", "Files/LastOpenedFile", QVariant::String },
0204       { "General Options/DefaultCoverFileName", "Files/DefaultCoverFileName", QVariant::String },
0205       { "General Options/DirFormatItem", "RenameDirectory/DirFormatItem", QVariant::Int },
0206       { "General Options/DirFormatText", "RenameDirectory/DirFormatText", QVariant::String },
0207       { "General Options/RenameDirectorySource", "RenameDirectory/RenameDirectorySource", QVariant::Int },
0208       { "General Options/NumberTracksDestination", "NumberTracks/NumberTracksDestination", QVariant::Int },
0209       { "General Options/NumberTracksStartNumber", "NumberTracks/NumberTracksStartNumber", QVariant::Int },
0210       { "General Options/AutoHideTags", "GUI/AutoHideTags", QVariant::Bool },
0211       { "General Options/HideFile", "GUI/HideFile", QVariant::Bool },
0212       { "General Options/HideV1", "GUI/HideV1", QVariant::Bool },
0213       { "General Options/HideV2", "GUI/HideV2", QVariant::Bool },
0214       { "General Options/HidePicture", "GUI/HidePicture", QVariant::Bool },
0215       { "General Options/PlayOnDoubleClick", "GUI/PlayOnDoubleClick", QVariant::Bool },
0216       { "General Options/SplitterSize0", "GUI/SplitterSize0", QVariant::Int },
0217       { "General Options/SplitterSize1", "GUI/SplitterSize1", QVariant::Int },
0218       { "General Options/VSplitterSize0", "GUI/VSplitterSize0", QVariant::Int },
0219       { "General Options/VSplitterSize1", "GUI/VSplitterSize1", QVariant::Int },
0220       { "General Options/UseProxy", "Network/UseProxy", QVariant::Bool },
0221       { "General Options/Proxy", "Network/Proxy", QVariant::String },
0222       { "General Options/UseProxyAuthentication", "Network/UseProxyAuthentication", QVariant::Bool },
0223       { "General Options/ProxyUserName", "Network/ProxyUserName", QVariant::String },
0224       { "General Options/ProxyPassword", "Network/ProxyPassword", QVariant::String },
0225       { "General Options/Browser", "Network/Browser", QVariant::String },
0226       { "General Options/ImportServer", "Import/ImportServer", QVariant::Int },
0227       { "General Options/ImportDestination", "Import/ImportDestination", QVariant::Int },
0228       { "General Options/ImportFormatNames", "Import/ImportFormatNames", QVariant::StringList },
0229       { "General Options/ImportFormatHeaders", "Import/ImportFormatHeaders", QVariant::StringList },
0230       { "General Options/ImportFormatTracks", "Import/ImportFormatTracks", QVariant::StringList },
0231       { "General Options/ImportFormatIdx", "Import/ImportFormatIdx", QVariant::Int },
0232       { "General Options/EnableTimeDifferenceCheck", "Import/EnableTimeDifferenceCheck", QVariant::Bool },
0233       { "General Options/MaxTimeDifference", "Import/MaxTimeDifference", QVariant::Int },
0234       { "General Options/ImportVisibleColumns", "Import/ImportVisibleColumns", QVariant::ULongLong },
0235       { "General Options/ImportWindowGeometry", "Import/ImportWindowGeometry", QVariant::ByteArray },
0236       { "General Options/ImportTagsNames", "Import/ImportTagsNames", QVariant::StringList },
0237       { "General Options/ImportTagsSources", "Import/ImportTagsSources", QVariant::StringList },
0238       { "General Options/ImportTagsExtractions", "Import/ImportTagsExtractions", QVariant::StringList },
0239       { "General Options/ImportTagsIdx", "Import/ImportTagsIdx", QVariant::Int },
0240       { "General Options/PictureSourceNames", "Import/PictureSourceNames", QVariant::StringList },
0241       { "General Options/PictureSourceUrls", "Import/PictureSourceUrls", QVariant::StringList },
0242       { "General Options/PictureSourceIdx", "Import/PictureSourceIdx", QVariant::Int },
0243       { "General Options/MatchPictureUrlMapKeys", "Import/MatchPictureUrlMapKeys", QVariant::StringList },
0244       { "General Options/MatchPictureUrlMapValues", "Import/MatchPictureUrlMapValues", QVariant::StringList },
0245       { "General Options/BrowseCoverArtWindowGeometry", "Import/BrowseCoverArtWindowGeometry", QVariant::ByteArray },
0246       { "General Options/ExportSourceV1", "Export/ExportSourceV1", QVariant::Bool },
0247       { "General Options/ExportFormatNames", "Export/ExportFormatNames", QVariant::StringList },
0248       { "General Options/ExportFormatHeaders", "Export/ExportFormatHeaders", QVariant::StringList },
0249       { "General Options/ExportFormatTracks", "Export/ExportFormatTracks", QVariant::StringList },
0250       { "General Options/ExportFormatTrailers", "Export/ExportFormatTrailers", QVariant::StringList },
0251       { "General Options/ExportFormatIdx", "Export/ExportFormatIdx", QVariant::Int },
0252       { "General Options/ExportWindowGeometry", "Export/ExportWindowGeometry", QVariant::ByteArray }
0253     };
0254     for (const auto& [oldKey, newKey, type] : mappings) {
0255       QStringList groupKey = QString::fromLatin1(oldKey)
0256           .split(QLatin1Char('/'));
0257       beginGroup(groupKey.at(0));
0258       if (contains(groupKey.at(1))) {
0259         QVariant val = value(groupKey.at(1), QVariant(type));
0260         remove(groupKey.at(1));
0261         endGroup();
0262         groupKey = QString::fromLatin1(newKey)
0263             .split(QLatin1Char('/'));
0264         beginGroup(groupKey.at(0));
0265         setValue(groupKey.at(1), val);
0266         migrated = true;
0267       }
0268       endGroup();
0269     }
0270 #endif
0271     if (migrated) {
0272       qDebug("Migrated old settings");
0273     }
0274   }
0275 }