1 /*
2     SPDX-FileCopyrightText: 2008 Jean-Baptiste Mardelle <jb@kdenlive.org>
3 
4 SPDX-License-Identifier: GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
5 */
6 
7 #include "encodingprofilesdialog.h"
8 
9 #include "kdenlivesettings.h"
10 
11 #include "klocalizedstring.h"
12 #include <QLineEdit>
13 #include <QPlainTextEdit>
14 #include <QStandardPaths>
15 #include <QVBoxLayout>
16 
EncodingProfilesDialog(int profileType,QWidget * parent)17 EncodingProfilesDialog::EncodingProfilesDialog(int profileType, QWidget *parent)
18     : QDialog(parent)
19     , m_configGroup(nullptr)
20 {
21     setupUi(this);
22     setWindowTitle(i18n("Manage Encoding Profiles"));
23     profile_type->addItem(i18n("Proxy clips"), 0);
24     profile_type->addItem(i18n("Timeline preview"), 1);
25     profile_type->addItem(i18n("Video4Linux capture"), 2);
26     profile_type->addItem(i18n("Screen capture"), 3);
27     profile_type->addItem(i18n("Decklink capture"), 4);
28 
29     button_add->setIcon(QIcon::fromTheme(QStringLiteral("list-add")));
30     button_edit->setIcon(QIcon::fromTheme(QStringLiteral("document-edit")));
31     button_delete->setIcon(QIcon::fromTheme(QStringLiteral("list-remove")));
32     button_download->setIcon(QIcon::fromTheme(QStringLiteral("download")));
33 
34     m_configFile = new KConfig(QStringLiteral("encodingprofiles.rc"), KConfig::CascadeConfig, QStandardPaths::AppDataLocation);
35     profile_type->setCurrentIndex(profileType);
36     connect(profile_type, static_cast<void (KComboBox::*)(int)>(&KComboBox::currentIndexChanged), this, &EncodingProfilesDialog::slotLoadProfiles);
37     connect(profile_list, &QListWidget::currentRowChanged, this, &EncodingProfilesDialog::slotShowParams);
38     connect(button_delete, &QAbstractButton::clicked, this, &EncodingProfilesDialog::slotDeleteProfile);
39     connect(button_add, &QAbstractButton::clicked, this, &EncodingProfilesDialog::slotAddProfile);
40     connect(button_edit, &QAbstractButton::clicked, this, &EncodingProfilesDialog::slotEditProfile);
41     profile_parameters->setMaximumHeight(QFontMetrics(font()).lineSpacing() * 5);
42     slotLoadProfiles();
43 }
44 
~EncodingProfilesDialog()45 EncodingProfilesDialog::~EncodingProfilesDialog()
46 {
47     delete m_configGroup;
48     delete m_configFile;
49 }
50 
slotLoadProfiles()51 void EncodingProfilesDialog::slotLoadProfiles()
52 {
53     profile_list->blockSignals(true);
54     profile_list->clear();
55     QString group;
56     switch (profile_type->currentIndex()) {
57     case 0:
58         group = QStringLiteral("proxy");
59         break;
60     case 2:
61         group = QStringLiteral("video4linux");
62         break;
63     case 3:
64         group = QStringLiteral("screengrab");
65         break;
66     case 4:
67         group = QStringLiteral("decklink");
68         break;
69     case 1:
70     default:
71         group = QStringLiteral("timelinepreview");
72         break;
73     }
74 
75     delete m_configGroup;
76     m_configGroup = new KConfigGroup(m_configFile, group);
77     QMap<QString, QString> values = m_configGroup->entryMap();
78     QMapIterator<QString, QString> i(values);
79     while (i.hasNext()) {
80         i.next();
81         auto *item = new QListWidgetItem(i.key(), profile_list);
82         item->setData(Qt::UserRole, i.value());
83         // cout << i.key() << ": " << i.value() << endl;
84     }
85     profile_list->blockSignals(false);
86     profile_list->setCurrentRow(0);
87     const bool multiProfile(profile_list->count() > 0);
88     button_delete->setEnabled(multiProfile);
89     button_edit->setEnabled(multiProfile);
90 }
91 
slotShowParams()92 void EncodingProfilesDialog::slotShowParams()
93 {
94     profile_parameters->clear();
95     QListWidgetItem *item = profile_list->currentItem();
96     if (!item) {
97         return;
98     }
99     profile_parameters->setPlainText(item->data(Qt::UserRole).toString().section(QLatin1Char(';'), 0, 0));
100 }
101 
slotDeleteProfile()102 void EncodingProfilesDialog::slotDeleteProfile()
103 {
104     QListWidgetItem *item = profile_list->currentItem();
105     if (!item) {
106         return;
107     }
108     QString profile = item->text();
109     m_configGroup->deleteEntry(profile);
110     slotLoadProfiles();
111 }
112 
slotAddProfile()113 void EncodingProfilesDialog::slotAddProfile()
114 {
115     QPointer<QDialog> d = new QDialog(this);
116     auto *l = new QVBoxLayout;
117     l->addWidget(new QLabel(i18n("Profile name:")));
118     auto *pname = new QLineEdit;
119     l->addWidget(pname);
120     l->addWidget(new QLabel(i18n("Parameters:")));
121     auto *pparams = new QPlainTextEdit;
122     l->addWidget(pparams);
123     l->addWidget(new QLabel(i18n("File extension:")));
124     auto *pext = new QLineEdit;
125     l->addWidget(pext);
126     QDialogButtonBox *box = new QDialogButtonBox(QDialogButtonBox::Save | QDialogButtonBox::Cancel);
127     connect(box, &QDialogButtonBox::accepted, d.data(), &QDialog::accept);
128     connect(box, &QDialogButtonBox::rejected, d.data(), &QDialog::reject);
129     l->addWidget(box);
130     d->setLayout(l);
131 
132     QListWidgetItem *item = profile_list->currentItem();
133     if (item) {
134         QString profilestr = item->data(Qt::UserRole).toString();
135         pparams->setPlainText(profilestr.section(QLatin1Char(';'), 0, 0));
136         pext->setText(profilestr.section(QLatin1Char(';'), 1, 1));
137     }
138     if (d->exec() == QDialog::Accepted) {
139         m_configGroup->writeEntry(pname->text(), pparams->toPlainText() + QLatin1Char(';') + pext->text());
140         slotLoadProfiles();
141     }
142     delete d;
143 }
144 
slotEditProfile()145 void EncodingProfilesDialog::slotEditProfile()
146 {
147     QPointer<QDialog> d = new QDialog(this);
148     auto *l = new QVBoxLayout;
149     l->addWidget(new QLabel(i18n("Profile name:")));
150     auto *pname = new QLineEdit;
151     l->addWidget(pname);
152     l->addWidget(new QLabel(i18n("Parameters:")));
153     auto *pparams = new QPlainTextEdit;
154     l->addWidget(pparams);
155     l->addWidget(new QLabel(i18n("File extension:")));
156     auto *pext = new QLineEdit;
157     l->addWidget(pext);
158     QDialogButtonBox *box = new QDialogButtonBox(QDialogButtonBox::Save | QDialogButtonBox::Cancel);
159     connect(box, &QDialogButtonBox::accepted, d.data(), &QDialog::accept);
160     connect(box, &QDialogButtonBox::rejected, d.data(), &QDialog::reject);
161     l->addWidget(box);
162     d->setLayout(l);
163 
164     QListWidgetItem *item = profile_list->currentItem();
165     if (item) {
166         pname->setText(item->text());
167         QString profilestr = item->data(Qt::UserRole).toString();
168         pparams->setPlainText(profilestr.section(QLatin1Char(';'), 0, 0));
169         pext->setText(profilestr.section(QLatin1Char(';'), 1, 1));
170         pparams->setFocus();
171     }
172     if (d->exec() == QDialog::Accepted) {
173         m_configGroup->writeEntry(pname->text(), pparams->toPlainText().simplified() + QLatin1Char(';') + pext->text());
174         slotLoadProfiles();
175     }
176     delete d;
177 }
178