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