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 }