File indexing completed on 2024-05-19 04:55:55

0001 /**
0002  * \file guiconfig.cpp
0003  * GUI related configuration.
0004  *
0005  * \b Project: Kid3
0006  * \author Urs Fleisch
0007  * \date 29 Jun 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 "guiconfig.h"
0028 #include <QStringList>
0029 #include "isettings.h"
0030 
0031 int GuiConfig::s_index = -1;
0032 
0033 /**
0034  * Constructor.
0035  */
0036 GuiConfig::GuiConfig()
0037   : StoredConfig(QLatin1String("GUI")),
0038     m_fileListSortColumn(0),
0039     m_fileListSortOrder(Qt::AscendingOrder),
0040     m_dirListSortColumn(0),
0041     m_dirListSortOrder(Qt::AscendingOrder),
0042     m_playToolBarArea(Qt::BottomToolBarArea),
0043     m_autoHideTags(true),
0044     m_hideFile(false),
0045     m_hidePicture(false),
0046     m_playOnDoubleClick(false),
0047     m_selectFileOnPlayEnabled(false),
0048     m_playToolBarVisible(false),
0049     m_fileListCustomColumnWidthsEnabled(true),
0050     m_dirListCustomColumnWidthsEnabled(true)
0051 {
0052   FOR_ALL_TAGS(tagNr) {
0053     m_hideTag[tagNr] = false;
0054   }
0055 }
0056 
0057 /**
0058  * Persist configuration.
0059  *
0060  * @param config configuration
0061  */
0062 void GuiConfig::writeToConfig(ISettings* config) const
0063 {
0064   config->beginGroup(m_group);
0065   config->setValue(QLatin1String("AutoHideTags"), QVariant(m_autoHideTags));
0066   config->setValue(QLatin1String("HideFile"), QVariant(m_hideFile));
0067   FOR_ALL_TAGS(tagNr) {
0068     config->setValue(QLatin1String("HideV") + Frame::tagNumberToString(tagNr),
0069                      QVariant(m_hideTag[tagNr]));
0070   }
0071   config->setValue(QLatin1String("HidePicture"), QVariant(m_hidePicture));
0072   config->setValue(QLatin1String("PlayOnDoubleClick"),
0073                    QVariant(m_playOnDoubleClick));
0074   config->setValue(QLatin1String("SelectFileOnPlayEnabled"),
0075                    QVariant(m_selectFileOnPlayEnabled));
0076   config->setValue(QLatin1String("PlayToolBarVisible"),
0077                    QVariant(m_playToolBarVisible));
0078   config->setValue(QLatin1String("PreferredAudioOutput"),
0079                    QVariant(m_preferredAudioOutput));
0080   config->setValue(QLatin1String("FileListVisibleColumns"),
0081                    QVariant(intListToStringList(m_fileListVisibleColumns)));
0082   config->setValue(QLatin1String("FileListCustomColumnWidthsEnabled"),
0083                    QVariant(m_fileListCustomColumnWidthsEnabled));
0084   config->setValue(QLatin1String("DirListVisibleColumns"),
0085                    QVariant(intListToStringList(m_dirListVisibleColumns)));
0086   config->setValue(QLatin1String("DirListCustomColumnWidthsEnabled"),
0087                    QVariant(m_dirListCustomColumnWidthsEnabled));
0088 
0089   config->endGroup();
0090   config->beginGroup(m_group, true);
0091   config->setValue(QLatin1String("FileListSortColumn"),
0092                    QVariant(m_fileListSortColumn));
0093   config->setValue(QLatin1String("FileListSortOrder"),
0094                    QVariant(m_fileListSortOrder));
0095   config->setValue(QLatin1String("FileListColumnWidths"),
0096                    QVariant(intListToStringList(m_fileListColumnWidths)));
0097   config->setValue(QLatin1String("DirListSortColumn"),
0098                    QVariant(m_dirListSortColumn));
0099   config->setValue(QLatin1String("DirListSortOrder"),
0100                    QVariant(m_dirListSortOrder));
0101   config->setValue(QLatin1String("DirListColumnWidths"),
0102                    QVariant(intListToStringList(m_dirListColumnWidths)));
0103   auto it = m_splitterSizes.constBegin();
0104   int i = 0;
0105   for (; it != m_splitterSizes.constEnd(); ++it, ++i) {
0106     config->setValue(QLatin1String("SplitterSize") + QString::number(i),
0107                      QVariant(*it));
0108   }
0109   for (it = m_vSplitterSizes.constBegin(), i = 0;
0110      it != m_vSplitterSizes.constEnd();
0111      ++it, ++i) {
0112     config->setValue(QLatin1String("VSplitterSize") + QString::number(i),
0113                      QVariant(*it));
0114   }
0115   config->setValue(QLatin1String("PlayToolBarArea"),
0116                    QVariant(m_playToolBarArea));
0117   config->setValue(QLatin1String("ConfigWindowGeometry"),
0118                    QVariant(m_configWindowGeometry));
0119   config->endGroup();
0120 }
0121 
0122 /**
0123  * Read persisted configuration.
0124  *
0125  * @param config configuration
0126  */
0127 void GuiConfig::readFromConfig(ISettings* config)
0128 {
0129   config->beginGroup(m_group);
0130   m_autoHideTags = config->value(QLatin1String("AutoHideTags"),
0131                                  m_autoHideTags).toBool();
0132   m_hideFile = config->value(QLatin1String("HideFile"),
0133                              m_hideFile).toBool();
0134   FOR_ALL_TAGS(tagNr) {
0135     m_hideTag[tagNr] = config->value(
0136           QLatin1String("HideV") + Frame::tagNumberToString(tagNr),
0137           m_hideTag[tagNr]).toBool();
0138   }
0139   m_hidePicture = config->value(QLatin1String("HidePicture"),
0140                                 m_hidePicture).toBool();
0141   m_playOnDoubleClick = config->value(QLatin1String("PlayOnDoubleClick"),
0142                                       m_playOnDoubleClick).toBool();
0143   m_selectFileOnPlayEnabled =
0144       config->value(QLatin1String("SelectFileOnPlayEnabled"),
0145                     m_selectFileOnPlayEnabled).toBool();
0146   m_playToolBarVisible = config->value(QLatin1String("PlayToolBarVisible"),
0147                                        m_playToolBarVisible).toBool();
0148   m_preferredAudioOutput = config->value(QLatin1String("PreferredAudioOutput"),
0149                                          m_preferredAudioOutput).toString();
0150   m_fileListVisibleColumns = stringListToIntList(
0151         config->value(QLatin1String("FileListVisibleColumns"), QStringList())
0152         .toStringList());
0153   if (m_fileListVisibleColumns.isEmpty()) {
0154     // Uninitialized, otherwise there is at least the value 0 in the list.
0155     m_fileListVisibleColumns << 0 << 1 << 3;
0156   }
0157   m_fileListCustomColumnWidthsEnabled =
0158       config->value(QLatin1String("FileListCustomColumnWidthsEnabled"),
0159                     m_fileListCustomColumnWidthsEnabled).toBool();
0160   m_dirListVisibleColumns = stringListToIntList(
0161         config->value(QLatin1String("DirListVisibleColumns"), QStringList())
0162         .toStringList());
0163   if (m_dirListVisibleColumns.isEmpty()) {
0164     // Uninitialized, otherwise there is at least the value 0 in the list.
0165     m_dirListVisibleColumns << 0 << 3;
0166   }
0167   m_dirListCustomColumnWidthsEnabled =
0168       config->value(QLatin1String("DirListCustomColumnWidthsEnabled"),
0169                     m_dirListCustomColumnWidthsEnabled).toBool();
0170 
0171   config->endGroup();
0172   config->beginGroup(m_group, true);
0173   m_fileListSortColumn = config->value(QLatin1String("FileListSortColumn"),
0174                                        m_fileListSortColumn).toInt();
0175   m_fileListSortOrder = static_cast<Qt::SortOrder>(
0176         config->value(QLatin1String("FileListSortOrder"),
0177                       static_cast<int>(m_fileListSortOrder)).toInt());
0178   m_fileListColumnWidths = stringListToIntList(
0179         config->value(QLatin1String("FileListColumnWidths"), QStringList())
0180         .toStringList());
0181   m_dirListSortColumn = config->value(QLatin1String("DirListSortColumn"),
0182                                        m_dirListSortColumn).toInt();
0183   m_dirListSortOrder = static_cast<Qt::SortOrder>(
0184         config->value(QLatin1String("DirListSortOrder"),
0185                       static_cast<int>(m_dirListSortOrder)).toInt());
0186   m_dirListColumnWidths = stringListToIntList(
0187         config->value(QLatin1String("DirListColumnWidths"), QStringList())
0188         .toStringList());
0189   m_splitterSizes.clear();
0190   for (int i = 0; i < 5; ++i) {
0191     if (int val = config->value(
0192           QLatin1String("SplitterSize") + QString::number(i),-1).toInt();
0193         val != -1) {
0194       m_splitterSizes.push_back(val);
0195     } else {
0196       break;
0197     }
0198   }
0199   m_vSplitterSizes.clear();
0200   for (int j = 0; j < 5; ++j) {
0201     if (int val = config->value(
0202           QLatin1String("VSplitterSize") + QString::number(j), -1).toInt();
0203         val != -1) {
0204       m_vSplitterSizes.push_back(val);
0205     } else {
0206       break;
0207     }
0208   }
0209   m_playToolBarArea = config->value(QLatin1String("PlayToolBarArea"),
0210                                     m_playToolBarArea).toInt();
0211   m_configWindowGeometry = config->value(QLatin1String("ConfigWindowGeometry"),
0212                                          m_configWindowGeometry).toByteArray();
0213   config->endGroup();
0214 }
0215 
0216 void GuiConfig::setFileListSortColumn(int fileListSortColumn)
0217 {
0218   if (m_fileListSortColumn != fileListSortColumn) {
0219     m_fileListSortColumn = fileListSortColumn;
0220     emit fileListSortColumnChanged(m_fileListSortColumn);
0221   }
0222 }
0223 
0224 void GuiConfig::setFileListSortOrder(Qt::SortOrder fileListSortOrder)
0225 {
0226   if (m_fileListSortOrder != fileListSortOrder) {
0227     m_fileListSortOrder = fileListSortOrder;
0228     emit fileListSortOrderChanged(m_fileListSortOrder);
0229   }
0230 }
0231 
0232 void GuiConfig::setFileListVisibleColumns(const QList<int>& fileListVisibleColumns)
0233 {
0234   if (m_fileListVisibleColumns != fileListVisibleColumns) {
0235     m_fileListVisibleColumns = fileListVisibleColumns;
0236     emit fileListVisibleColumnsChanged(m_fileListVisibleColumns);
0237   }
0238 }
0239 
0240 void GuiConfig::setFileListCustomColumnWidthsEnabled(bool enable)
0241 {
0242   if (m_fileListCustomColumnWidthsEnabled != enable) {
0243     m_fileListCustomColumnWidthsEnabled = enable;
0244     emit fileListCustomColumnWidthsEnabledChanged(
0245           m_fileListCustomColumnWidthsEnabled);
0246   }
0247 }
0248 
0249 void GuiConfig::setFileListColumnWidths(const QList<int>& fileListColumnWidths)
0250 {
0251   if (m_fileListColumnWidths != fileListColumnWidths) {
0252     m_fileListColumnWidths = fileListColumnWidths;
0253     emit fileListColumnWidthsChanged(m_fileListColumnWidths);
0254   }
0255 }
0256 
0257 void GuiConfig::setDirListSortColumn(int dirListSortColumn)
0258 {
0259   if (m_dirListSortColumn != dirListSortColumn) {
0260     m_dirListSortColumn = dirListSortColumn;
0261     emit dirListSortColumnChanged(m_dirListSortColumn);
0262   }
0263 }
0264 
0265 void GuiConfig::setDirListSortOrder(Qt::SortOrder dirListSortOrder)
0266 {
0267   if (m_dirListSortOrder != dirListSortOrder) {
0268     m_dirListSortOrder = dirListSortOrder;
0269     emit dirListSortOrderChanged(m_dirListSortOrder);
0270   }
0271 }
0272 
0273 void GuiConfig::setDirListVisibleColumns(const QList<int>& dirListVisibleColumns)
0274 {
0275   if (m_dirListVisibleColumns != dirListVisibleColumns) {
0276     m_dirListVisibleColumns = dirListVisibleColumns;
0277     emit dirListVisibleColumnsChanged(m_dirListVisibleColumns);
0278   }
0279 }
0280 
0281 void GuiConfig::setDirListCustomColumnWidthsEnabled(bool enable)
0282 {
0283   if (m_dirListCustomColumnWidthsEnabled != enable) {
0284     m_dirListCustomColumnWidthsEnabled = enable;
0285     emit dirListCustomColumnWidthsEnabledChanged(
0286           m_dirListCustomColumnWidthsEnabled);
0287   }
0288 }
0289 
0290 void GuiConfig::setDirListColumnWidths(const QList<int>& dirListColumnWidths)
0291 {
0292   if (m_dirListColumnWidths != dirListColumnWidths) {
0293     m_dirListColumnWidths = dirListColumnWidths;
0294     emit dirListColumnWidthsChanged(m_dirListColumnWidths);
0295   }
0296 }
0297 
0298 void GuiConfig::setSplitterSizes(const QList<int>& splitterSizes)
0299 {
0300   if (m_splitterSizes != splitterSizes) {
0301     m_splitterSizes = splitterSizes;
0302     emit splitterSizesChanged(m_splitterSizes);
0303   }
0304 }
0305 
0306 void GuiConfig::setVSplitterSizes(const QList<int>& vSplitterSizes)
0307 {
0308   if (m_vSplitterSizes != vSplitterSizes) {
0309     m_vSplitterSizes = vSplitterSizes;
0310     emit vSplitterSizesChanged(m_vSplitterSizes);
0311   }
0312 }
0313 
0314 void GuiConfig::setAutoHideTags(bool autoHideTags)
0315 {
0316   if (m_autoHideTags != autoHideTags) {
0317     m_autoHideTags = autoHideTags;
0318     emit autoHideTagsChanged(m_autoHideTags);
0319   }
0320 }
0321 
0322 void GuiConfig::setHideFile(bool hideFile)
0323 {
0324   if (m_hideFile != hideFile) {
0325     m_hideFile = hideFile;
0326     emit hideFileChanged(m_hideFile);
0327   }
0328 }
0329 
0330 void GuiConfig::setHideTag(Frame::TagNumber tagNr, bool hide)
0331 {
0332   if (m_hideTag[tagNr] != hide) {
0333     m_hideTag[tagNr] = hide;
0334     emit hideTagChanged();
0335   }
0336 }
0337 
0338 void GuiConfig::setHidePicture(bool hidePicture)
0339 {
0340   if (m_hidePicture != hidePicture) {
0341     m_hidePicture = hidePicture;
0342     emit hidePictureChanged(m_hidePicture);
0343   }
0344 }
0345 
0346 void GuiConfig::setPlayOnDoubleClick(bool playOnDoubleClick)
0347 {
0348   if (m_playOnDoubleClick != playOnDoubleClick) {
0349     m_playOnDoubleClick = playOnDoubleClick;
0350     emit playOnDoubleClickChanged(m_playOnDoubleClick);
0351   }
0352 }
0353 
0354 void GuiConfig::setSelectFileOnPlayEnabled(bool selectFileOnPlayEnabled)
0355 {
0356   if (m_selectFileOnPlayEnabled != selectFileOnPlayEnabled) {
0357     m_selectFileOnPlayEnabled = selectFileOnPlayEnabled;
0358     emit selectFileOnPlayEnabledChanged(m_selectFileOnPlayEnabled);
0359   }
0360 }
0361 
0362 void GuiConfig::setPlayToolBarVisible(bool playToolBarVisible)
0363 {
0364   if (m_playToolBarVisible != playToolBarVisible) {
0365     m_playToolBarVisible = playToolBarVisible;
0366     emit playToolBarVisibleChanged(m_playToolBarVisible);
0367   }
0368 }
0369 
0370 void GuiConfig::setPreferredAudioOutput(const QString& preferredAudioOutput)
0371 {
0372   if (m_preferredAudioOutput != preferredAudioOutput) {
0373     m_preferredAudioOutput = preferredAudioOutput;
0374     emit preferredAudioOutputChanged(m_preferredAudioOutput);
0375   }
0376 }
0377 
0378 void GuiConfig::setPlayToolBarArea(int playToolBarArea)
0379 {
0380   if (m_playToolBarArea != playToolBarArea) {
0381     m_playToolBarArea = playToolBarArea;
0382     emit playToolBarAreaChanged(m_playToolBarArea);
0383   }
0384 }
0385 
0386 void GuiConfig::setConfigWindowGeometry(const QByteArray& configWindowGeometry)
0387 {
0388   if (m_configWindowGeometry != configWindowGeometry) {
0389     m_configWindowGeometry = configWindowGeometry;
0390     emit configWindowGeometryChanged(m_configWindowGeometry);
0391   }
0392 }