File indexing completed on 2024-03-24 04:46:01
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 }