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

0001 /**
0002  * \file guiconfig.h
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 #pragma once
0028 
0029 #include "generalconfig.h"
0030 #include "frame.h"
0031 #include "kid3api.h"
0032 
0033 /**
0034  * GUI related configuration.
0035  */
0036 class KID3_CORE_EXPORT GuiConfig : public StoredConfig<GuiConfig> {
0037   Q_OBJECT
0038   /** sorted column in file list */
0039   Q_PROPERTY(int fileListSortColumn READ fileListSortColumn
0040              WRITE setFileListSortColumn NOTIFY fileListSortColumnChanged)
0041   /** sort order in file list */
0042   Q_PROPERTY(Qt::SortOrder fileListSortOrder READ fileListSortOrder
0043              WRITE setFileListSortOrder NOTIFY fileListSortOrderChanged)
0044   /** visible columns in file list */
0045   Q_PROPERTY(QList<int> fileListVisibleColumns READ fileListVisibleColumns
0046              WRITE setFileListVisibleColumns NOTIFY fileListVisibleColumnsChanged)
0047   /** true to enable custom column widths in file list */
0048   Q_PROPERTY(bool fileListCustomColumnWidthsEnabled
0049              READ fileListCustomColumnWidthsEnabled
0050              WRITE setFileListCustomColumnWidthsEnabled
0051              NOTIFY fileListCustomColumnWidthsEnabledChanged)
0052   /** column widths in file list */
0053   Q_PROPERTY(QList<int> fileListColumnWidths READ fileListColumnWidths
0054              WRITE setFileListColumnWidths NOTIFY fileListColumnWidthsChanged)
0055   /** sorted column in directory list */
0056   Q_PROPERTY(int dirListSortColumn READ dirListSortColumn
0057              WRITE setDirListSortColumn NOTIFY dirListSortColumnChanged)
0058   /** sort order in directory list */
0059   Q_PROPERTY(Qt::SortOrder dirListSortOrder READ dirListSortOrder
0060              WRITE setDirListSortOrder NOTIFY dirListSortOrderChanged)
0061   /** visible columns in directory list */
0062   Q_PROPERTY(QList<int> dirListVisibleColumns READ dirListVisibleColumns
0063              WRITE setDirListVisibleColumns NOTIFY dirListVisibleColumnsChanged)
0064   /** true to enable custom column widths in directory list */
0065   Q_PROPERTY(bool dirListCustomColumnWidthsEnabled
0066              READ dirListCustomColumnWidthsEnabled
0067              WRITE setDirListCustomColumnWidthsEnabled
0068              NOTIFY dirListCustomColumnWidthsEnabledChanged)
0069   /** column widths in directory list */
0070   Q_PROPERTY(QList<int> dirListColumnWidths READ dirListColumnWidths
0071              WRITE setDirListColumnWidths NOTIFY dirListColumnWidthsChanged)
0072   /** size of splitter in main window */
0073   Q_PROPERTY(QList<int> splitterSizes READ splitterSizes
0074              WRITE setSplitterSizes NOTIFY splitterSizesChanged)
0075   /** size of file/dirlist splitter */
0076   Q_PROPERTY(QList<int> vSplitterSizes READ vSplitterSizes
0077              WRITE setVSplitterSizes NOTIFY vSplitterSizesChanged)
0078   /** true to automatically hide unused tags */
0079   Q_PROPERTY(bool autoHideTags READ autoHideTags WRITE setAutoHideTags
0080              NOTIFY autoHideTagsChanged)
0081   /** true to hide file controls */
0082   Q_PROPERTY(bool hideFile READ hideFile WRITE setHideFile
0083              NOTIFY hideFileChanged)
0084   /** true to hide picture preview */
0085   Q_PROPERTY(bool hidePicture READ hidePicture WRITE setHidePicture
0086              NOTIFY hidePictureChanged)
0087   /** true to play file on double click */
0088   Q_PROPERTY(bool playOnDoubleClick READ playOnDoubleClick
0089              WRITE setPlayOnDoubleClick NOTIFY playOnDoubleClickChanged)
0090   /** true to select file on play */
0091   Q_PROPERTY(bool selectFileOnPlayEnabled READ selectFileOnPlayEnabled
0092              WRITE setSelectFileOnPlayEnabled NOTIFY selectFileOnPlayEnabledChanged)
0093   /** true if play tool bar is visible */
0094   Q_PROPERTY(bool playToolBarVisible READ playToolBarVisible
0095              WRITE setPlayToolBarVisible NOTIFY playToolBarVisibleChanged)
0096   /** preferred audio output description and ID */
0097   Q_PROPERTY(QString preferredAudioOutput READ preferredAudioOutput
0098              WRITE setPreferredAudioOutput NOTIFY preferredAudioOutputChanged)
0099   /** play tool bar docked area */
0100   Q_PROPERTY(int playToolBarArea READ playToolBarArea
0101              WRITE setPlayToolBarArea NOTIFY playToolBarAreaChanged)
0102   /** config window geometry */
0103   Q_PROPERTY(QByteArray configWindowGeometry READ configWindowGeometry
0104              WRITE setConfigWindowGeometry NOTIFY configWindowGeometryChanged)
0105 
0106 public:
0107   /**
0108    * Constructor.
0109    */
0110   GuiConfig();
0111 
0112   /**
0113    * Destructor.
0114    */
0115   ~GuiConfig() override = default;
0116 
0117   /**
0118    * Persist configuration.
0119    *
0120    * @param config configuration
0121    */
0122   void writeToConfig(ISettings* config) const override;
0123 
0124   /**
0125    * Read persisted configuration.
0126    *
0127    * @param config configuration
0128    */
0129   void readFromConfig(ISettings* config) override;
0130 
0131   /** Get sorted column in file list. */
0132   int fileListSortColumn() const { return m_fileListSortColumn; }
0133 
0134   /** Set sorted column in file list. */
0135   void setFileListSortColumn(int fileListSortColumn);
0136 
0137   /** Get sort order in file list. */
0138   Qt::SortOrder fileListSortOrder() const { return m_fileListSortOrder; }
0139 
0140   /** Set sort order in file list. */
0141   void setFileListSortOrder(Qt::SortOrder fileListSortOrder);
0142 
0143   /** Get visible columns in file list. */
0144   QList<int> fileListVisibleColumns() const { return m_fileListVisibleColumns; }
0145 
0146   /** Set visible columns in file list. */
0147   void setFileListVisibleColumns(const QList<int>& fileListVisibleColumns);
0148 
0149   /** Check if custom column widths are enabled in file list. */
0150   bool fileListCustomColumnWidthsEnabled() const {
0151     return m_fileListCustomColumnWidthsEnabled;
0152   }
0153 
0154   /** Set if custom column widths are enabled in file list. */
0155   void setFileListCustomColumnWidthsEnabled(bool enable);
0156 
0157   /** Get column widths in file list. */
0158   QList<int> fileListColumnWidths() const { return m_fileListColumnWidths; }
0159 
0160   /** Set column widths in file list. */
0161   void setFileListColumnWidths(const QList<int>& fileListColumnWidths);
0162 
0163   /** Get sorted column in directory list. */
0164   int dirListSortColumn() const { return m_dirListSortColumn; }
0165 
0166   /** Set sorted column in directory list. */
0167   void setDirListSortColumn(int dirListSortColumn);
0168 
0169   /** Get sort order in directory list. */
0170   Qt::SortOrder dirListSortOrder() const { return m_dirListSortOrder; }
0171 
0172   /** Set sort order in directory list. */
0173   void setDirListSortOrder(Qt::SortOrder dirListSortOrder);
0174 
0175   /** Get visible columns in directory list. */
0176   QList<int> dirListVisibleColumns() const { return m_dirListVisibleColumns; }
0177 
0178   /** Set visible columns in directory list. */
0179   void setDirListVisibleColumns(const QList<int>& dirListVisibleColumns);
0180 
0181   /** Check if custom column widths are enabled in directory list. */
0182   bool dirListCustomColumnWidthsEnabled() const {
0183     return m_dirListCustomColumnWidthsEnabled;
0184   }
0185 
0186   /** Set if custom column widths are enabled in directory list. */
0187   void setDirListCustomColumnWidthsEnabled(bool enable);
0188 
0189   /** Get column widths in directory list. */
0190   QList<int> dirListColumnWidths() const { return m_dirListColumnWidths; }
0191 
0192   /** Set column widths in directory list. */
0193   void setDirListColumnWidths(const QList<int>& dirListColumnWidths);
0194 
0195   /** Get size of splitter in main window. */
0196   QList<int> splitterSizes() const { return m_splitterSizes; }
0197 
0198   /** Set size of splitter in main window. */
0199   void setSplitterSizes(const QList<int>& splitterSizes);
0200 
0201   /** Get size of file/dirlist splitter. */
0202   QList<int> vSplitterSizes() const { return m_vSplitterSizes; }
0203 
0204   /** Set size of file/dirlist splitter. */
0205   void setVSplitterSizes(const QList<int>& vSplitterSizes);
0206 
0207   /** Check if unused tags are automatically hidden. */
0208   bool autoHideTags() const { return m_autoHideTags; }
0209 
0210   /** Set if unused tags are automatically hidden. */
0211   void setAutoHideTags(bool autoHideTags);
0212 
0213   /** Check if file controls are hidden. */
0214   bool hideFile() const { return m_hideFile; }
0215 
0216   /** Set if file controls are hidden. */
0217   void setHideFile(bool hideFile);
0218 
0219   /** Check if tag controls are hidden. */
0220   bool hideTag(Frame::TagNumber tagNr) const { return m_hideTag[tagNr]; }
0221 
0222   /** Set if tag controls are hidden. */
0223   void setHideTag(Frame::TagNumber tagNr, bool hide);
0224 
0225   /** Check if the picture preview is hidden. */
0226   bool hidePicture() const { return m_hidePicture; }
0227 
0228   /** Set if the picture preview is hidden. */
0229   void setHidePicture(bool hidePicture);
0230 
0231   /** Check if play file on double click is enabled. */
0232   bool playOnDoubleClick() const { return m_playOnDoubleClick; }
0233 
0234   /** Set if play file on double click is enabled. */
0235   void setPlayOnDoubleClick(bool playOnDoubleClick);
0236 
0237   /** Check if select file on play is enabled. */
0238   bool selectFileOnPlayEnabled() const { return m_selectFileOnPlayEnabled; }
0239 
0240   /** Enable select file on play. */
0241   void setSelectFileOnPlayEnabled(bool selectFileOnPlayEnabled);
0242 
0243   /** Check if play tool bar is visible. */
0244   bool playToolBarVisible() const { return m_playToolBarVisible; }
0245 
0246   /** Set if play tool bar is visible. */
0247   void setPlayToolBarVisible(bool playToolBarVisible);
0248 
0249   /** Get name and ID of preferred audio output. */
0250   QString preferredAudioOutput() const { return m_preferredAudioOutput; }
0251 
0252   /** Set name and ID of preferred audio output. */
0253   void setPreferredAudioOutput(const QString& preferredAudioOutput);
0254 
0255   /** Get play tool bar docked area. */
0256   int playToolBarArea() const { return m_playToolBarArea; }
0257 
0258   /** Set play tool bar docked area. */
0259   void setPlayToolBarArea(int playToolBarArea);
0260 
0261   /** Get config window geometry. */
0262   QByteArray configWindowGeometry() const { return m_configWindowGeometry; }
0263 
0264   /** Set import window geometry. */
0265   void setConfigWindowGeometry(const QByteArray& configWindowGeometry);
0266 
0267 signals:
0268   /** Emitted when @a fileListSortColumn changed. */
0269   void fileListSortColumnChanged(int fileListSortColumn);
0270 
0271   /** Emitted when @a fileListSortOrder changed. */
0272   void fileListSortOrderChanged(Qt::SortOrder fileListSortOrder);
0273 
0274   /** Emitted when @a fileListVisibleColumns changed. */
0275   void fileListVisibleColumnsChanged(const QList<int>& fileListVisibleColumns);
0276 
0277   /** Emitted when @a fileListCustomColumnWidthsEnabled changed. */
0278   void fileListCustomColumnWidthsEnabledChanged(bool fileListCustomColumnWidthsEnabled);
0279 
0280   /** Emitted when @a fileListColumnWidths changed. */
0281   void fileListColumnWidthsChanged(const QList<int>& fileListColumnWidths);
0282 
0283   /** Emitted when @a dirListSortColumn changed. */
0284   void dirListSortColumnChanged(int dirListSortColumn);
0285 
0286   /** Emitted when @a dirListSortOrder changed. */
0287   void dirListSortOrderChanged(Qt::SortOrder dirListSortOrder);
0288 
0289   /** Emitted when @a dirListVisibleColumns changed. */
0290   void dirListVisibleColumnsChanged(const QList<int>& dirListVisibleColumns);
0291 
0292   /** Emitted when @a dirListCustomColumnWidthsEnabled changed. */
0293   void dirListCustomColumnWidthsEnabledChanged(bool dirListCustomColumnWidthsEnabled);
0294 
0295   /** Emitted when @a dirListColumnWidths changed. */
0296   void dirListColumnWidthsChanged(const QList<int>& dirListColumnWidths);
0297 
0298   /** Emitted when @a splitterSizes changed. */
0299   void splitterSizesChanged(const QList<int>& splitterSizes);
0300 
0301   /** Emitted when @a vSplitterSizes changed. */
0302   void vSplitterSizesChanged(const QList<int>& vSplitterSizes);
0303 
0304   /** Emitted when @a autoHideTags changed. */
0305   void autoHideTagsChanged(bool autoHideTags);
0306 
0307   /** Emitted when @a hideFile changed. */
0308   void hideFileChanged(bool hideFile);
0309 
0310   /** Emitted when @a hideTag changed. */
0311   void hideTagChanged();
0312 
0313   /** Emitted when @a hidePicture changed. */
0314   void hidePictureChanged(bool hidePicture);
0315 
0316   /** Emitted when @a playOnDoubleClick changed. */
0317   void playOnDoubleClickChanged(bool playOnDoubleClick);
0318 
0319   /** Emitted when @a selectFileOnPlayEnabled changed. */
0320   void selectFileOnPlayEnabledChanged(bool selectFileOnPlayEnabled);
0321 
0322   /** Emitted when @a playToolBarVisible changed. */
0323   void playToolBarVisibleChanged(bool playToolBarVisible);
0324 
0325   /** Emitted when @a preferredAudioOutput changed. */
0326   void preferredAudioOutputChanged(const QString& preferredAudioOutput);
0327 
0328   /** Emitted when @a playToolBarArea changed. */
0329   void playToolBarAreaChanged(int playToolBarArea);
0330 
0331   /** Emitted when @a configWindowGeometry changed. */
0332   void configWindowGeometryChanged(const QByteArray& configWindowGeometry);
0333 
0334 private:
0335   friend GuiConfig& StoredConfig<GuiConfig>::instance();
0336 
0337   int m_fileListSortColumn;
0338   Qt::SortOrder m_fileListSortOrder;
0339   QList<int> m_fileListVisibleColumns;
0340   QList<int> m_fileListColumnWidths;
0341   int m_dirListSortColumn;
0342   Qt::SortOrder m_dirListSortOrder;
0343   QList<int> m_dirListVisibleColumns;
0344   QList<int> m_dirListColumnWidths;
0345   QList<int> m_splitterSizes;
0346   QList<int> m_vSplitterSizes;
0347   QByteArray m_configWindowGeometry;
0348   QString m_preferredAudioOutput;
0349   int m_playToolBarArea;
0350   bool m_autoHideTags;
0351   bool m_hideFile;
0352   bool m_hideTag[Frame::Tag_NumValues];
0353   bool m_hidePicture;
0354   bool m_playOnDoubleClick;
0355   bool m_selectFileOnPlayEnabled;
0356   bool m_playToolBarVisible;
0357   bool m_fileListCustomColumnWidthsEnabled;
0358   bool m_dirListCustomColumnWidthsEnabled;
0359 
0360   /** Index in configuration storage */
0361   static int s_index;
0362 };