File indexing completed on 2024-04-28 08:34:58

0001 /*
0002     Copyright (C) 2004-2007 Matthias Kretz <kretz@kde.org>
0003     Copyright (C) 2011-2019 Harald Sitter <sitter@kde.org>
0004 
0005     This program is free software; you can redistribute it and/or
0006     modify it under the terms of the GNU Library General Public
0007     License as published by the Free Software Foundation; either
0008     version 2 of the License, or (at your option) version 3.
0009 
0010     This library is distributed in the hope that it will be useful,
0011     but WITHOUT ANY WARRANTY; without even the implied warranty of
0012     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
0013     Library General Public License for more details.
0014 
0015     You should have received a copy of the GNU Library General Public License
0016     along with this library; see the file COPYING.LIB.  If not, write to
0017     the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
0018     Boston, MA 02110-1301, USA.
0019 */
0020 
0021 #include "backendselection.h"
0022 
0023 #include <QList>
0024 #include <QStringList>
0025 #include <QListWidget>
0026 
0027 #include <QDebug>
0028 #include <QDesktopServices>
0029 #include <QDir>
0030 #include <QJsonArray>
0031 #include <QJsonObject>
0032 #include <QPluginLoader>
0033 #include <QSettings>
0034 #include <QUrl>
0035 
0036 BackendSelection::BackendSelection(QWidget *parent)
0037     : QWidget(parent)
0038 {
0039     setupUi(this);
0040 
0041     m_down->setIcon(QIcon::fromTheme("go-down"));
0042     m_up->setIcon(QIcon::fromTheme("go-up"));
0043     m_comment->setWordWrap(true);
0044 
0045     m_emptyPage = stackedWidget->addWidget(new QWidget());
0046 
0047     connect(m_select, &QListWidget::itemSelectionChanged,
0048             this, &BackendSelection::selectionChanged);
0049     connect(m_up, &QToolButton::clicked,
0050             this, &BackendSelection::up);
0051     connect(m_down, &QToolButton::clicked,
0052             this, &BackendSelection::down);
0053 
0054     connect(m_website, &QLabel::linkActivated,
0055             this, [=](const QString &url) { QDesktopServices::openUrl(QUrl(url)); });
0056 }
0057 
0058 void BackendSelection::load()
0059 {
0060     // NOTE: for phonon5 this should move into the library in some form.
0061     m_backends.clear();
0062 
0063     const auto backends = Phonon::Factory::findBackends();
0064 
0065     m_select->clear();
0066 
0067     for (const auto &bd : backends) {
0068         m_select->addItem(bd.name);
0069         m_backends.insert(bd.name, bd);
0070     }
0071     m_select->item(0)->setSelected(true);
0072 }
0073 
0074 void BackendSelection::save()
0075 {
0076     QSettings settings("kde.org", "libphonon");
0077     settings.beginWriteArray("Backends", m_select->count());
0078     for (int i = 0; i < m_select->count(); ++i) {
0079         settings.setArrayIndex(i);
0080         const QListWidgetItem *item = m_select->item(i);
0081         const auto backend = m_backends.value(item->text());
0082         settings.setValue("iid", backend.iid);
0083     }
0084     settings.endArray();
0085     settings.sync();
0086 }
0087 
0088 void BackendSelection::selectionChanged()
0089 {
0090     if (m_select->selectedItems().isEmpty()) {
0091         m_up->setEnabled(false);
0092         m_down->setEnabled(false);
0093         return;
0094     }
0095 
0096     const QListWidgetItem *const item = m_select->selectedItems().first();
0097     m_up->setEnabled(m_select->row(item) > 0);
0098     m_down->setEnabled(m_select->row(item) < m_select->count() - 1);
0099     const auto backend = m_backends[item->text()];
0100     m_icon->setPixmap(QIcon::fromTheme(backend.icon).pixmap(128, 128));
0101     m_name->setText(backend.name);
0102     m_website->setText(QString("<a href=\"%1\">%1</a>").arg(backend.website));
0103     m_version->setText(backend.version);
0104 }
0105 
0106 void BackendSelection::up()
0107 {
0108     const QList<QListWidgetItem *> selectedList = m_select->selectedItems();
0109     for (const QListWidgetItem *selected : selectedList) {
0110         const int row = m_select->row(selected);
0111         if (row <= 0) {
0112             continue;
0113         }
0114         QListWidgetItem *taken = m_select->takeItem(row - 1);
0115         m_select->insertItem(row, taken);
0116         selectionChanged();
0117     }
0118 }
0119 
0120 void BackendSelection::down()
0121 {
0122     const QList<QListWidgetItem *> selectedList = m_select->selectedItems();
0123     for (const QListWidgetItem *selected : selectedList) {
0124         const int row = m_select->row(selected);
0125         if (row + 1 >= m_select->count()) {
0126             continue;
0127         }
0128         QListWidgetItem *taken = m_select->takeItem(row + 1);
0129         m_select->insertItem(row, taken);
0130         selectionChanged();
0131     }
0132 }