File indexing completed on 2024-04-28 12:37:47

0001 /* AUDEX CDDA EXTRACTOR
0002  * SPDX-FileCopyrightText: Copyright (C) 2007 Marco Nelles
0003  * <https://userbase.kde.org/Audex>
0004  *
0005  * SPDX-License-Identifier: GPL-3.0-or-later
0006  */
0007 
0008 #ifndef PROFILEMODEL_HEADER
0009 #define PROFILEMODEL_HEADER
0010 
0011 #include <climits>
0012 
0013 #include <QAbstractTableModel>
0014 #include <QString>
0015 #include <QVariant>
0016 
0017 #include <KConfig>
0018 #include <KConfigGroup>
0019 #include <KLocalizedString>
0020 
0021 #include "utils/encoderassistant.h"
0022 #include "utils/error.h"
0023 
0024 #define DEFAULT_PROFILEINDEX -1
0025 #define DEFAULT_NAME ""
0026 #define DEFAULT_ICON "audio-x-generic"
0027 
0028 #define DEFAULT_ENCODER_SELECTED 0
0029 
0030 #define DEFAULT_ENCODER_PARAMETERS ""
0031 
0032 #define DEFAULT_SCHEME "$" VAR_ALBUM_ARTIST "/$" VAR_ALBUM_TITLE "/$" VAR_TRACK_NO " - $" VAR_TRACK_TITLE ".$" VAR_SUFFIX
0033 
0034 #define DEFAULT_FAT32 false
0035 #define DEFAULT_UNDERSCORE false
0036 #define DEFAULT_2DIGITSTRACKNUM true
0037 
0038 #define DEFAULT_SC true
0039 #define DEFAULT_SC_SCALE false
0040 #define DEFAULT_SC_SIZE QSize(600, 600)
0041 #define DEFAULT_SC_FORMAT "JPEG"
0042 #define DEFAULT_SC_NAME "$" VAR_ALBUM_TITLE ".$" VAR_SUFFIX
0043 
0044 #define DEFAULT_PL true
0045 #define DEFAULT_PL_FORMAT "M3U"
0046 #define DEFAULT_PL_NAME "$" VAR_ALBUM_TITLE ".$" VAR_SUFFIX
0047 #define DEFAULT_PL_ABS_FILE_PATH false
0048 #define DEFAULT_PL_UTF8 true
0049 
0050 #define DEFAULT_INF false
0051 #define DEFAULT_INF_TEXT QStringList()
0052 #define DEFAULT_INF_NAME "info"
0053 #define DEFAULT_INF_SUFFIX "nfo"
0054 
0055 #define DEFAULT_HL false
0056 #define DEFAULT_HL_FORMAT "SFV"
0057 #define DEFAULT_HL_NAME "checksums.$" VAR_SUFFIX
0058 
0059 #define DEFAULT_CUE false
0060 #define DEFAULT_CUE_NAME "$" VAR_ALBUM_ARTIST " - $" VAR_ALBUM_TITLE ".$" VAR_SUFFIX
0061 #define DEFAULT_CUE_ADD_MCN_AND_ISRC false
0062 
0063 #define DEFAULT_LOG false
0064 #define DEFAULT_LOG_NAME "$" VAR_ALBUM_ARTIST " - $" VAR_ALBUM_TITLE ".$" VAR_SUFFIX
0065 #define DEFAULT_LOG_WRITE_TIMESTAMPS false
0066 
0067 #define DEFAULT_SF false
0068 #define DEFAULT_SF_NAME "$" VAR_ALBUM_ARTIST "/$" VAR_ALBUM_TITLE "/$" VAR_ALBUM_ARTIST " - $" VAR_ALBUM_TITLE ".$" VAR_SUFFIX
0069 
0070 enum ProfileColumns {
0071 
0072     PROFILE_MODEL_COLUMN_PROFILEINDEX_INDEX = 0,
0073     PROFILE_MODEL_COLUMN_NAME_INDEX,
0074     PROFILE_MODEL_COLUMN_ICON_INDEX,
0075 
0076     PROFILE_MODEL_COLUMN_ENCODER_SELECTED_INDEX,
0077 
0078     PROFILE_MODEL_COLUMN_SCHEME_INDEX,
0079 
0080     PROFILE_MODEL_COLUMN_FAT32COMPATIBLE_INDEX,
0081     PROFILE_MODEL_COLUMN_UNDERSCORE_INDEX,
0082     PROFILE_MODEL_COLUMN_2DIGITSTRACKNUM_INDEX,
0083 
0084     PROFILE_MODEL_COLUMN_SC_INDEX,
0085     PROFILE_MODEL_COLUMN_SC_SCALE_INDEX,
0086     PROFILE_MODEL_COLUMN_SC_SIZE_INDEX,
0087     PROFILE_MODEL_COLUMN_SC_FORMAT_INDEX,
0088     PROFILE_MODEL_COLUMN_SC_NAME_INDEX,
0089 
0090     PROFILE_MODEL_COLUMN_PL_INDEX,
0091     PROFILE_MODEL_COLUMN_PL_FORMAT_INDEX,
0092     PROFILE_MODEL_COLUMN_PL_NAME_INDEX,
0093     PROFILE_MODEL_COLUMN_PL_ABS_FILE_PATH_INDEX,
0094     PROFILE_MODEL_COLUMN_PL_UTF8_INDEX,
0095 
0096     PROFILE_MODEL_COLUMN_INF_INDEX,
0097     PROFILE_MODEL_COLUMN_INF_TEXT_INDEX,
0098     PROFILE_MODEL_COLUMN_INF_NAME_INDEX,
0099     PROFILE_MODEL_COLUMN_INF_SUFFIX_INDEX,
0100 
0101     PROFILE_MODEL_COLUMN_HL_INDEX,
0102     PROFILE_MODEL_COLUMN_HL_FORMAT_INDEX,
0103     PROFILE_MODEL_COLUMN_HL_NAME_INDEX,
0104 
0105     PROFILE_MODEL_COLUMN_CUE_INDEX,
0106     PROFILE_MODEL_COLUMN_CUE_NAME_INDEX,
0107     PROFILE_MODEL_COLUMN_CUE_ADD_MCN_AND_ISRC_INDEX,
0108 
0109     PROFILE_MODEL_COLUMN_LOG_INDEX,
0110     PROFILE_MODEL_COLUMN_LOG_NAME_INDEX,
0111     PROFILE_MODEL_COLUMN_LOG_WRITE_TIMESTAMPS_INDEX,
0112 
0113     PROFILE_MODEL_COLUMN_SF_INDEX,
0114     PROFILE_MODEL_COLUMN_SF_NAME_INDEX,
0115 
0116     PROFILE_MODEL_COLUMN_ENCODER_LAME_PARAMETERS_INDEX,
0117     PROFILE_MODEL_COLUMN_ENCODER_OGGENC_PARAMETERS_INDEX,
0118     PROFILE_MODEL_COLUMN_ENCODER_OPUSENC_PARAMETERS_INDEX,
0119     PROFILE_MODEL_COLUMN_ENCODER_FLAC_PARAMETERS_INDEX,
0120     PROFILE_MODEL_COLUMN_ENCODER_FAAC_PARAMETERS_INDEX,
0121     PROFILE_MODEL_COLUMN_ENCODER_WAVE_PARAMETERS_INDEX,
0122     PROFILE_MODEL_COLUMN_ENCODER_CUSTOM_PARAMETERS_INDEX,
0123 
0124     PROFILE_MODEL_COLUMN_NUM
0125 
0126 };
0127 
0128 #define PROFILE_MODEL_PROFILEINDEX_KEY "profile_key"
0129 #define PROFILE_MODEL_NAME_KEY "name"
0130 #define PROFILE_MODEL_ICON_KEY "icon"
0131 #define PROFILE_MODEL_ENCODER_SELECTED_KEY "current_encoder"
0132 
0133 #define PROFILE_MODEL_SCHEME_KEY "scheme"
0134 
0135 #define PROFILE_MODEL_FAT32COMPATIBLE_KEY "fat32_compatible"
0136 #define PROFILE_MODEL_UNDERSCORE_KEY "underscore"
0137 #define PROFILE_MODEL_2DIGITSTRACKNUM_KEY "2_digits_tracknum"
0138 
0139 #define PROFILE_MODEL_SC_KEY "sc"
0140 #define PROFILE_MODEL_SC_SCALE_KEY "sc_scale"
0141 #define PROFILE_MODEL_SC_SIZE_KEY "sc_size"
0142 #define PROFILE_MODEL_SC_FORMAT_KEY "sc_format"
0143 #define PROFILE_MODEL_SC_NAME_KEY "sc_name"
0144 
0145 #define PROFILE_MODEL_PL_KEY "pl"
0146 #define PROFILE_MODEL_PL_FORMAT_KEY "pl_format"
0147 #define PROFILE_MODEL_PL_NAME_KEY "pl_name"
0148 #define PROFILE_MODEL_PL_ABS_FILE_PATH_KEY "pl_abs_file_path"
0149 #define PROFILE_MODEL_PL_UTF8_KEY "pl_utf8"
0150 
0151 #define PROFILE_MODEL_INF_KEY "inf"
0152 #define PROFILE_MODEL_INF_TEXT_KEY "inf_text"
0153 #define PROFILE_MODEL_INF_NAME_KEY "inf_name"
0154 #define PROFILE_MODEL_INF_SUFFIX_KEY "inf_suffix"
0155 
0156 #define PROFILE_MODEL_HL_KEY "hl"
0157 #define PROFILE_MODEL_HL_FORMAT_KEY "hl_format"
0158 #define PROFILE_MODEL_HL_NAME_KEY "hl_name"
0159 
0160 #define PROFILE_MODEL_CUE_KEY "cue"
0161 #define PROFILE_MODEL_CUE_NAME_KEY "cue_name"
0162 #define PROFILE_MODEL_CUE_ADD_MCN_AND_ISRC_KEY "cue_write_mcn_and_isrc"
0163 
0164 #define PROFILE_MODEL_LOG_KEY "log"
0165 #define PROFILE_MODEL_LOG_NAME_KEY "log_name"
0166 #define PROFILE_MODEL_LOG_WRITE_TIMESTAMPS_KEY "log_write_timestamps"
0167 
0168 #define PROFILE_MODEL_SF_KEY "sf"
0169 #define PROFILE_MODEL_SF_NAME_KEY "sf_name"
0170 
0171 #define PROFILE_MODEL_COLUMN_ENCODER_LAME_PARAMETERS_KEY "lame_parameters"
0172 #define PROFILE_MODEL_COLUMN_ENCODER_OGGENC_PARAMETERS_KEY "oggenc_parameters"
0173 #define PROFILE_MODEL_COLUMN_ENCODER_OPUSENC_PARAMETERS_KEY "opusenc_parameters"
0174 #define PROFILE_MODEL_COLUMN_ENCODER_FLAC_PARAMETERS_KEY "flac_parameters"
0175 #define PROFILE_MODEL_COLUMN_ENCODER_FAAC_PARAMETERS_KEY "faac_parameters"
0176 #define PROFILE_MODEL_COLUMN_ENCODER_WAVE_PARAMETERS_KEY "wave_parameters"
0177 #define PROFILE_MODEL_COLUMN_ENCODER_CUSTOM_PARAMETERS_KEY "custom_parameters"
0178 
0179 typedef QMap<QString, QVariant> Profile;
0180 
0181 /** audex profile model **/
0182 class ProfileModel : public QAbstractTableModel
0183 {
0184     Q_OBJECT
0185 public:
0186     explicit ProfileModel(QObject *parent = nullptr);
0187     ~ProfileModel() override;
0188 
0189     int rowCount(const QModelIndex &parent = QModelIndex()) const override;
0190     int columnCount(const QModelIndex &parent = QModelIndex()) const override;
0191     QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
0192     bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) override;
0193     bool removeRows(int row, int count, const QModelIndex &parent = QModelIndex()) override;
0194     bool insertRows(int row, int count, const QModelIndex &parent = QModelIndex()) override;
0195 
0196     bool validateData(const QModelIndex &index, const QVariant &value);
0197 
0198     int currentProfileIndex() const;
0199     int currentProfileRow() const;
0200     int getRowByIndex(int profile_index) const;
0201 
0202     void clear();
0203 
0204     bool nameExists(const QString &name) const;
0205     bool indexExists(int profile_index) const;
0206     int getNewIndex() const;
0207 
0208     void sortItems();
0209 
0210     /**BEGIN: EncoderAssistant related */
0211     void autoCreate(); // scans the system for encoders and create standard profiles
0212     EncoderAssistant::Encoder getSelectedEncoderFromCurrentIndex();
0213     const Parameters getSelectedEncoderParametersFromCurrentIndex();
0214     const QString getSelectedEncoderSchemeFromCurrentIndex();
0215     const QString getSelectedEncoderSuffixFromCurrentIndex();
0216     const QString getSelectedEncoderNameAndVersion();
0217     bool isSelectedEncoderWithEmbedCover();
0218     /**END: EncoderAssistant related */
0219 
0220     Error lastError() const;
0221 
0222 public Q_SLOTS:
0223     void commit();
0224     void revert() override;
0225 
0226     int copy(const int profileRow);
0227 
0228     bool saveProfilesToFile(const QString &filename);
0229     bool loadProfilesFromFile(const QString &filename);
0230 
0231     void setCurrentProfileIndex(int profile_index);
0232     int setRowAsCurrentProfileIndex(int row); // returns profile index
0233 
0234 Q_SIGNALS:
0235     void profilesRemovedOrInserted();
0236     void currentProfileIndexChanged(int index);
0237 
0238 private:
0239     const Profile p_new_profile();
0240     QList<Profile> p_cache;
0241     int p_current_profile_index;
0242 
0243     Error p_error;
0244 
0245     void p_new_name(QString &name);
0246 
0247     void p_save(KConfig *config);
0248     void p_load(KConfig *config);
0249 };
0250 
0251 #endif