[plasma-desktop] /: Remove phonon KCM

Nicolas Fella null at kde.org
Wed Aug 28 11:06:05 BST 2019


Git commit 973306c7bb7df2f9be19c1417484361511a87c67 by Nicolas Fella.
Committed on 28/08/2019 at 10:05.
Pushed by nicolasfella into branch 'master'.

Remove phonon KCM

Summary:
Most of the Phonon KCM settings have been moved to plasma-pa. The remaining settings server very specific use cases that are mostl likely not worth exposing them front and center.

@sitter said he has a version of the settings to be integtated into phonon so the remaining three users can still access them

See T9091

Test Plan: builds

Reviewers: sitter

Reviewed By: sitter

Subscribers: kde-doc-english, ngraham, pino, plasma-devel, sitter

Tags: #plasma, #documentation

Differential Revision: https://phabricator.kde.org/D22616

M  +1    -5    CMakeLists.txt
M  +0    -1    doc/kcontrol/CMakeLists.txt
D  +0    -2    doc/kcontrol/phonon/CMakeLists.txt
D  +0    -93   doc/kcontrol/phonon/index.docbook
M  +0    -1    kcms/CMakeLists.txt
D  +0    -27   kcms/phonon/CMakeLists.txt
D  +0    -18   kcms/phonon/Messages.sh
D  +0    -227  kcms/phonon/backendselection.cpp
D  +0    -73   kcms/phonon/backendselection.h
D  +0    -232  kcms/phonon/backendselection.ui
D  +0    -993  kcms/phonon/devicepreference.cpp
D  +0    -95   kcms/phonon/devicepreference.h
D  +0    -219  kcms/phonon/devicepreference.ui
D  +0    -160  kcms/phonon/kcm_phonon.desktop
D  +-    --    kcms/phonon/listview-background.png
D  +0    -84   kcms/phonon/main.cpp
D  +0    -48   kcms/phonon/main.h
D  +0    -1    plasma-desktop.categories

https://commits.kde.org/plasma-desktop/973306c7bb7df2f9be19c1417484361511a87c67

diff --git a/CMakeLists.txt b/CMakeLists.txt
index ebb2a906..2123faba 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -192,9 +192,5 @@ if(X11_Xkb_FOUND AND XCB_XKB_FOUND)
     add_subdirectory(kaccess)
 endif()
 install(FILES org.kde.plasmashell.metainfo.xml DESTINATION ${KDE_INSTALL_METAINFODIR})
-if (${ECM_VERSION} STRGREATER "5.58.0")
-    install(FILES plasma-desktop.categories  DESTINATION  ${KDE_INSTALL_LOGGINGCATEGORIESDIR})
-else()
-    install(FILES plasma-desktop.categories  DESTINATION ${KDE_INSTALL_CONFDIR})
-endif()
+
 feature_summary(WHAT ALL INCLUDE_QUIET_PACKAGES FATAL_ON_MISSING_REQUIRED_PACKAGES)
diff --git a/doc/kcontrol/CMakeLists.txt b/doc/kcontrol/CMakeLists.txt
index 793a0c6d..7fbbc9d6 100644
--- a/doc/kcontrol/CMakeLists.txt
+++ b/doc/kcontrol/CMakeLists.txt
@@ -27,6 +27,5 @@ ecm_optional_add_subdirectory(spellchecking)
 ecm_optional_add_subdirectory(componentchooser)
 ecm_optional_add_subdirectory(kded)
 ecm_optional_add_subdirectory(solid-device-automounter)
-ecm_optional_add_subdirectory(phonon)
 ecm_optional_add_subdirectory(workspaceoptions)
 
diff --git a/doc/kcontrol/phonon/CMakeLists.txt b/doc/kcontrol/phonon/CMakeLists.txt
deleted file mode 100644
index 5ada3afc..00000000
--- a/doc/kcontrol/phonon/CMakeLists.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-########### install files ###############
-kdoctools_create_handbook(index.docbook INSTALL_DESTINATION ${KDE_INSTALL_DOCBUNDLEDIR}/en SUBDIR kcontrol/phonon)
diff --git a/doc/kcontrol/phonon/index.docbook b/doc/kcontrol/phonon/index.docbook
deleted file mode 100644
index b6215d96..00000000
--- a/doc/kcontrol/phonon/index.docbook
+++ /dev/null
@@ -1,93 +0,0 @@
-<?xml version="1.0" ?>
-<!DOCTYPE article PUBLIC "-//KDE//DTD DocBook XML V4.5-Based Variant V1.1//EN"
-"dtd/kdedbx45.dtd" [
-  <!ENTITY % addindex "IGNORE">
-  <!ENTITY % English "INCLUDE">
-]>
-<article id="phonon" lang="&language;">
-<title>Audio and Video Settings</title>
-<articleinfo>
-<authorgroup>
-<author><firstname>Matthias</firstname><surname>Kretz</surname></author>
-<!-- TRANS:ROLES_OF_TRANSLATORS -->
-</authorgroup>
-
-<date>2013-12-05</date>
-<releaseinfo>&kde; 4.12</releaseinfo>
-
-<keywordset>
-<keyword>KDE</keyword>
-<keyword>Systemsettings</keyword>
-<keyword>hardware</keyword>
-<keyword>multimedia</keyword>
-<keyword>sound</keyword>
-<keyword>video</keyword>
-<keyword>backend</keyword>
-</keywordset>
-</articleinfo>
-
-<para>
-This &systemsettings; module allows you to configure the sound and video device
-preference and the backends used by Phonon.
-</para>
-
-<variablelist>
-<varlistentry><term><guilabel>Device Preference</guilabel> tab</term>
-<listitem><para>
-On the left you are presented a tree list with various categories of playback and recording. 
-For each category you may choose what device you wish to use.</para>
-<para>The <guilabel>Audio Playback</guilabel> and <guilabel>Audio Recording</guilabel>
-items define the default ordering of devices which can be overridden by 
-each sub items.</para>
-<para>Clicking the <guibutton>Apply Device List To</guibutton> button shows a dialog 
-which enables you to copy the selected setting from one category to many others.</para>
-<para>Highlight a category and the available devices for this category are displayed in the 
-list on the right. The order in this list determines the preference of the output and capture 
-devices. If for some reason the first device cannot be used Phonon will try to use the second, &etc;</para>
-<para>Use the <guibutton>Prefer</guibutton> and <guibutton>Defer</guibutton> buttons to change the order 
-and the <guibutton>Test</guibutton> button to play a test sound on the selected device.
-</para></listitem>
-</varlistentry>
-
-<varlistentry><term><guilabel>Audio Hardware Setup</guilabel> tab</term>
-<listitem><para>
-The various drop down boxes in this tab allow full control over all cards that are attached 
-to the system.</para>
-
-<variablelist>
-<varlistentry><term><guilabel>Hardware</guilabel></term>
-<listitem><para>Select the <guilabel>Sound Card</guilabel> and an available 
-<guilabel>Profile</guilabel> to be used.</para>
-</listitem></varlistentry>
-
-<varlistentry><term><guilabel>Device Configuration</guilabel></term>
-<listitem><para>Select the <guilabel>Sound Device</guilabel> and a <guilabel>Connector</guilabel>.</para>
-</listitem></varlistentry>
-
-<varlistentry><term><guilabel>Speaker Placement and Testing</guilabel> or <guilabel>Input Levels</guilabel></term>
-<listitem>
-<para>For a playback device: The buttons on this pane allow you to test each speaker separately.
-</para>
-<para>For a recording device: A slider shows the <guilabel>Input Levels</guilabel> 
-of the selected <guilabel>Connector</guilabel>.
-</para>
-</listitem></varlistentry>
-</variablelist>
-
-
-
-</listitem>
-</varlistentry>
-
-<varlistentry><term><guilabel>Backend</guilabel> tab</term>
-<listitem><para>
-On the left side of this module a list of Phonon backends found on your system is shown. 
-The order here determines the order Phonon will use the backends.
-Use the <guibutton>Prefer</guibutton> and <guibutton>Defer</guibutton> buttons 
-to change this order.</para>
-</listitem>
-</varlistentry>
-
-</variablelist>
-
-</article>
diff --git a/kcms/CMakeLists.txt b/kcms/CMakeLists.txt
index e7db0e43..cef84688 100644
--- a/kcms/CMakeLists.txt
+++ b/kcms/CMakeLists.txt
@@ -44,7 +44,6 @@ add_subdirectory(icons)
 add_subdirectory(kded)
 add_subdirectory(formats)
 add_subdirectory(notifications)
-add_subdirectory(phonon)
 add_subdirectory(runners)
 add_subdirectory(spellchecking)
 add_subdirectory(qtquicksettings)
diff --git a/kcms/phonon/CMakeLists.txt b/kcms/phonon/CMakeLists.txt
deleted file mode 100644
index 7920b3ea..00000000
--- a/kcms/phonon/CMakeLists.txt
+++ /dev/null
@@ -1,27 +0,0 @@
-find_package(Phonon4Qt5 4.6.60 NO_MODULE)
-include_directories(BEFORE ${PHONON_INCLUDES})
-add_definitions(-DPHONON_LIB_SONAME=\"${PHONON_LIB_SONAME}\")
-# KI18N Translation Domain for this library
-add_definitions(-DTRANSLATION_DOMAIN=\"kcm5_phonon\")
-
-
-set(kcmphonon_SRCS main.cpp devicepreference.cpp backendselection.cpp)
-ki18n_wrap_ui(kcmphonon_SRCS devicepreference.ui backendselection.ui)
-set(kcmphonon_LIBS
-    KF5::ConfigWidgets
-    KF5::I18n
-    KF5::IconThemes
-    KF5::KCMUtils
-    KF5::KIOWidgets
-    ${PHONON_LIBRARY})
-
-ecm_qt_declare_logging_category(kcmphonon_SRCS HEADER phonon_debug.h IDENTIFIER KCM_PHONON_LOG CATEGORY_NAME org.kde.kcm.phonon)
-
-add_library(kcm_phonon MODULE ${kcmphonon_SRCS})
-target_link_libraries(kcm_phonon ${kcmphonon_LIBS} KF5::ConfigWidgets)
-
-install(TARGETS kcm_phonon  DESTINATION ${KDE_INSTALL_PLUGINDIR} )
-
-########### install files ###############
-install( FILES kcm_phonon.desktop  DESTINATION  ${KDE_INSTALL_KSERVICES5DIR} )
-install(FILES listview-background.png DESTINATION ${KDE_INSTALL_DATADIR}/kcm_phonon)
diff --git a/kcms/phonon/Messages.sh b/kcms/phonon/Messages.sh
deleted file mode 100644
index 5d45ba85..00000000
--- a/kcms/phonon/Messages.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#! /usr/bin/env bash
-$EXTRACTRC *.ui >> rc.cpp
-find . -type d | fgrep -v '.svn' | sed -e 's,$,/,' > dirs
-msh=`find . -name Messages.sh`
-for dir in $msh; do
-  dir=`dirname $dir`
-  if test "$dir" != "."; then
-    egrep -v "^$dir" dirs > dirs.new && mv dirs.new dirs
-  fi
-done
-fgrep -v "/tests" dirs > dirs.new && mv dirs.new dirs
-dirs=`cat dirs`
-find $dirs -maxdepth 1 -name "*.cpp" -print > files
-find $dirs -maxdepth 1 -name "*.cc" -print >> files
-find $dirs -maxdepth 1 -name "*.h" -print >> files
-$XGETTEXT --files-from=files -o $podir/kcm5_phonon.pot
-rm -f dirs
-rm -f files
diff --git a/kcms/phonon/backendselection.cpp b/kcms/phonon/backendselection.cpp
deleted file mode 100644
index 88825427..00000000
--- a/kcms/phonon/backendselection.cpp
+++ /dev/null
@@ -1,227 +0,0 @@
-/*  This file is part of the KDE project
-    Copyright (C) 2004-2007 Matthias Kretz <kretz at kde.org>
-    Copyright (C) 2011-2014 Harald Sitter <sitter at kde.org>
-
-    This program is free software; you can redistribute it and/or
-    modify it under the terms of the GNU Library General Public
-    License as published by the Free Software Foundation; either
-    version 2 of the License, or (at your option) version 3.
-
-    This library is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-    Library General Public License for more details.
-
-    You should have received a copy of the GNU Library General Public License
-    along with this library; see the file COPYING.LIB.  If not, write to
-    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-    Boston, MA 02110-1301, USA.
-*/
-
-#include "backendselection.h"
-
-#include <KConfig>
-#include <KIconLoader>
-#include <KRun>
-#include <KLocalizedString>
-
-#include "phonon_debug.h"
-#include <QDir>
-#include <QFileInfo>
-#include <QListWidget>
-#include <QPluginLoader>
-#include <QSettings>
-
-BackendDescriptor::BackendDescriptor(const QString &path)
-    : isValid(false)
-{
-    QPluginLoader loader(path);
-
-    iid = loader.metaData().value(QLatin1Literal("IID")).toString();
-
-    const QJsonObject metaData = loader.metaData().value(QLatin1Literal("MetaData")).toObject();
-    name = metaData.value(QLatin1Literal("Name")).toString();
-    icon = metaData.value(QLatin1Literal("Icon")).toString();
-    version = metaData.value(QLatin1Literal("Version")).toString();
-    website = metaData.value(QLatin1Literal("Website")).toString();
-    preference = metaData.value(QLatin1Literal("InitialPreference")).toDouble();
-
-    pluginPath = path;
-
-    if (name.isEmpty())
-        name = QFileInfo(path).baseName();
-
-    if (iid.isEmpty())
-        return; // Not valid.
-
-    isValid = true;
-}
-
-bool BackendDescriptor::operator <(const BackendDescriptor &rhs) const
-{
-    return this->preference < rhs.preference;
-}
-
-BackendSelection::BackendSelection(QWidget *parent)
-    : QWidget(parent)
-{
-    setupUi(this);
-
-    m_messageWidget->setVisible(false);
-    m_messageWidget->setCloseButtonVisible(false);
-    m_messageWidget->setMessageType(KMessageWidget::Information);
-    m_messageWidget->setText(i18nc("@info User changed Phonon backend",
-                                   "To apply the backend change you will have "
-                                   "to log out and back in again."));
-
-    m_down->setIcon(QIcon::fromTheme(QStringLiteral("go-down")));
-    m_up->setIcon(QIcon::fromTheme(QStringLiteral("go-up")));
-    m_comment->setWordWrap(true);
-
-    m_emptyPage = stackedWidget->addWidget(new QWidget());
-
-    connect(m_select, &QListWidget::itemSelectionChanged, this, &BackendSelection::selectionChanged);
-    connect(m_up, &QToolButton::clicked, this, &BackendSelection::up);
-    connect(m_down, &QToolButton::clicked, this, &BackendSelection::down);
-}
-
-void BackendSelection::load()
-{
-    // NOTE: for phonon5 this should move into the library in some form.
-    m_backends.clear();
-
-    // Read already configured order.
-    QList<QString> iidPreference;
-    QSettings settings("kde.org", "libphonon");
-    const int size = settings.beginReadArray("Backends");
-    qCDebug(KCM_PHONON_LOG) << settings.fileName();
-    for (int i = 0; i < size; ++i) {
-        settings.setArrayIndex(i);
-        iidPreference.append(settings.value(QLatin1String("iid")).toString());
-    }
-    settings.endArray();
-
-    const QLatin1Literal suffix("/" PHONON_LIB_SONAME "_backend/");
-    const QStringList paths = QCoreApplication::libraryPaths();
-    qCDebug(KCM_PHONON_LOG) << "libpaths" << paths;
-
-    QList<struct BackendDescriptor> backendList;
-
-    foreach (const QString &path, paths) {
-        const QString libPath = path + suffix;
-        const QDir dir(libPath);
-        if (!dir.exists()) {
-            qCDebug(KCM_PHONON_LOG) << Q_FUNC_INFO << dir.absolutePath() << "does not exist";
-            continue;
-        }
-
-        const QStringList plugins(dir.entryList(QDir::Files));
-
-        for (const QString &plugin : plugins) {
-            BackendDescriptor bd = BackendDescriptor(libPath + plugin);
-            if (bd.isValid) {
-                int preference = iidPreference.indexOf(bd.iid);
-                if (preference != -1)
-                    bd.preference = preference;
-                backendList.append(bd);
-            }
-        }
-
-        std::sort(backendList.begin(), backendList.end());
-    }
-
-    /// -------------- LOAD
-
-    m_select->clear();
-
-    foreach (const struct BackendDescriptor &bd, backendList) {
-        m_select->addItem(bd.name);
-        m_backends.insert(bd.name, bd);
-    }
-    m_select->item(0)->setSelected(true);
-}
-
-void BackendSelection::save()
-{
-    qCDebug(KCM_PHONON_LOG) << Q_FUNC_INFO;
-    qCDebug(KCM_PHONON_LOG) << "~~~~~~~~~~~~~~";
-    QSettings settings("kde.org", "libphonon");
-    settings.beginWriteArray("Backends", m_select->count());
-    for (int i = 0; i < m_select->count(); ++i) {
-        settings.setArrayIndex(i);
-        const QListWidgetItem *item = m_select->item(i);
-        const BackendDescriptor backend = m_backends.value(item->text());
-        settings.setValue("iid", backend.iid);
-    }
-    settings.endArray();
-    settings.sync();
-
-    qCDebug(KCM_PHONON_LOG) << settings.fileName();
-}
-
-void BackendSelection::defaults()
-{
-    load();
-}
-
-void BackendSelection::selectionChanged()
-{
-    qCDebug(KCM_PHONON_LOG) << "qooooooooo";
-    if (m_select->selectedItems().isEmpty()) {
-        m_up->setEnabled(false);
-        m_down->setEnabled(false);
-    } else {
-        const QListWidgetItem *const item = m_select->selectedItems().first();
-        m_up->setEnabled(m_select->row(item) > 0);
-        m_down->setEnabled(m_select->row(item) < m_select->count() - 1);
-        BackendDescriptor backend = m_backends[item->text()];
-
-        // Have some icon other than "unknown" for backends which don't install an icon.
-        QIcon icon = QIcon::fromTheme(backend.icon);
-        if (icon.isNull()) {
-            QPixmap iconPixmap = KIconLoader::global()->loadIcon("preferences-desktop-sound", KIconLoader::NoGroup, 128);
-            m_icon->setPixmap(iconPixmap);
-        } else {
-            m_icon->setPixmap(icon.pixmap(128, 128));
-        }
-
-        m_name->setText(backend.name);
-        m_website->setText(QString("<a href=\"%1\">%1</a>").arg(backend.website));
-        connect(m_website, &QLabel::linkActivated, this, &BackendSelection::openWebsite, Qt::UniqueConnection);
-        m_version->setText(backend.version);
-    }
-}
-
-void BackendSelection::openWebsite(const QString &url)
-{
-    new KRun(QUrl(url), window());
-}
-
-void BackendSelection::up()
-{
-    QList<QListWidgetItem *> selectedList = m_select->selectedItems();
-    foreach (QListWidgetItem *selected, selectedList) {
-        const int row = m_select->row(selected);
-        if (row > 0) {
-            QListWidgetItem *taken = m_select->takeItem(row - 1);
-            m_select->insertItem(row, taken);
-            emit changed();
-            selectionChanged();
-        }
-    }
-}
-
-void BackendSelection::down()
-{
-    QList<QListWidgetItem *> selectedList = m_select->selectedItems();
-    foreach (QListWidgetItem *selected, selectedList) {
-        const int row = m_select->row(selected);
-        if (row + 1 < m_select->count()) {
-            QListWidgetItem *taken = m_select->takeItem(row + 1);
-            m_select->insertItem(row, taken);
-            emit changed();
-            selectionChanged();
-        }
-    }
-}
-
diff --git a/kcms/phonon/backendselection.h b/kcms/phonon/backendselection.h
deleted file mode 100644
index 9621f7da..00000000
--- a/kcms/phonon/backendselection.h
+++ /dev/null
@@ -1,73 +0,0 @@
-/*  This file is part of the KDE project
-    Copyright (C) 2004-2007 Matthias Kretz <kretz at kde.org>
-    Copyright (C) 2011-2014 Harald Sitter <sitter at kde.org>
-
-    This program is free software; you can redistribute it and/or
-    modify it under the terms of the GNU Library General Public
-    License as published by the Free Software Foundation; either
-    version 2 of the License, or (at your option) version 3.
-
-    This library is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-    Library General Public License for more details.
-
-    You should have received a copy of the GNU Library General Public License
-    along with this library; see the file COPYING.LIB.  If not, write to
-    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-    Boston, MA 02110-1301, USA.
-*/
-
-#ifndef BACKENDSELECTION_H
-#define BACKENDSELECTION_H
-
-#include "ui_backendselection.h"
-
-#include <QHash>
-#include <QWidget>
-
-
-struct BackendDescriptor {
-    explicit BackendDescriptor(const QString &path = QString());
-
-    bool isValid;
-
-    QString iid;
-
-    QString name;
-    QString icon;
-    QString version;
-    QString website;
-    int preference;
-
-    QString pluginPath;
-
-    /** Implemented for qSort(QList) */
-    bool operator <(const BackendDescriptor &rhs) const;
-};
-
-class BackendSelection : public QWidget, private Ui::BackendSelection
-{
-    Q_OBJECT
-public:
-    explicit BackendSelection(QWidget *parent = nullptr);
-
-    void load();
-    void save();
-    void defaults();
-
-private Q_SLOTS:
-    void selectionChanged();
-    void up();
-    void down();
-    void openWebsite(const QString &url);
-
-Q_SIGNALS:
-    void changed();
-
-private:
-    QHash<QString, struct BackendDescriptor> m_backends;
-    int m_emptyPage;
-};
-
-#endif // BACKENDSELECTION_H
diff --git a/kcms/phonon/backendselection.ui b/kcms/phonon/backendselection.ui
deleted file mode 100644
index a4017a8d..00000000
--- a/kcms/phonon/backendselection.ui
+++ /dev/null
@@ -1,232 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ui version="4.0">
- <author>Matthias Kretz <kretz at kde.org></author>
- <class>BackendSelection</class>
- <widget class="QWidget" name="BackendSelection">
-  <property name="geometry">
-   <rect>
-    <x>0</x>
-    <y>0</y>
-    <width>510</width>
-    <height>362</height>
-   </rect>
-  </property>
-  <layout class="QGridLayout">
-   <property name="margin">
-    <number>9</number>
-   </property>
-   <property name="spacing">
-    <number>6</number>
-   </property>
-   <item row="2" column="0">
-    <layout class="QGridLayout">
-     <property name="margin">
-      <number>0</number>
-     </property>
-     <property name="spacing">
-      <number>6</number>
-     </property>
-     <item row="0" column="0" colspan="3">
-      <widget class="QListWidget" name="m_select">
-       <property name="sizePolicy">
-        <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
-         <horstretch>0</horstretch>
-         <verstretch>0</verstretch>
-        </sizepolicy>
-       </property>
-       <property name="toolTip">
-        <string>A list of Phonon Backends found on your system.  The order here determines the order Phonon will use them in.</string>
-       </property>
-       <property name="whatsThis">
-        <string>A list of Phonon Backends found on your system.  The order here determines the order Phonon will use them in.</string>
-       </property>
-       <property name="dragEnabled">
-        <bool>true</bool>
-       </property>
-       <property name="dragDropMode">
-        <enum>QAbstractItemView::InternalMove</enum>
-       </property>
-      </widget>
-     </item>
-     <item row="1" column="1">
-      <widget class="QToolButton" name="m_up">
-       <property name="enabled">
-        <bool>false</bool>
-       </property>
-       <property name="text">
-        <string>Prefer</string>
-       </property>
-       <property name="toolButtonStyle">
-        <enum>Qt::ToolButtonTextBesideIcon</enum>
-       </property>
-      </widget>
-     </item>
-     <item row="1" column="2">
-      <widget class="QToolButton" name="m_down">
-       <property name="enabled">
-        <bool>false</bool>
-       </property>
-       <property name="text">
-        <string>Defer</string>
-       </property>
-       <property name="toolButtonStyle">
-        <enum>Qt::ToolButtonTextBesideIcon</enum>
-       </property>
-      </widget>
-     </item>
-     <item row="1" column="0">
-      <spacer>
-       <property name="orientation">
-        <enum>Qt::Horizontal</enum>
-       </property>
-       <property name="sizeHint" stdset="0">
-        <size>
-         <width>81</width>
-         <height>20</height>
-        </size>
-       </property>
-      </spacer>
-     </item>
-    </layout>
-   </item>
-   <item row="3" column="0">
-    <widget class="QFrame" name="frame">
-     <property name="frameShape">
-      <enum>QFrame::StyledPanel</enum>
-     </property>
-     <property name="frameShadow">
-      <enum>QFrame::Raised</enum>
-     </property>
-     <layout class="QVBoxLayout">
-      <property name="spacing">
-       <number>6</number>
-      </property>
-      <property name="margin">
-       <number>9</number>
-      </property>
-      <item>
-       <layout class="QHBoxLayout">
-        <property name="spacing">
-         <number>6</number>
-        </property>
-        <property name="margin">
-         <number>0</number>
-        </property>
-        <item>
-         <widget class="QLabel" name="m_icon">
-          <property name="sizePolicy">
-           <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
-            <horstretch>0</horstretch>
-            <verstretch>0</verstretch>
-           </sizepolicy>
-          </property>
-          <property name="text">
-           <string/>
-          </property>
-         </widget>
-        </item>
-        <item>
-         <widget class="QLabel" name="m_name">
-          <property name="sizePolicy">
-           <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
-            <horstretch>0</horstretch>
-            <verstretch>0</verstretch>
-           </sizepolicy>
-          </property>
-          <property name="text">
-           <string/>
-          </property>
-          <property name="alignment">
-           <set>Qt::AlignVCenter</set>
-          </property>
-         </widget>
-        </item>
-       </layout>
-      </item>
-      <item>
-       <widget class="Line" name="line1">
-        <property name="frameShape">
-         <enum>QFrame::HLine</enum>
-        </property>
-        <property name="frameShadow">
-         <enum>QFrame::Sunken</enum>
-        </property>
-        <property name="orientation">
-         <enum>Qt::Horizontal</enum>
-        </property>
-       </widget>
-      </item>
-      <item>
-       <widget class="QLabel" name="m_comment">
-        <property name="text">
-         <string/>
-        </property>
-        <property name="alignment">
-         <set>Qt::AlignVCenter</set>
-        </property>
-       </widget>
-      </item>
-      <item>
-       <widget class="QLabel" name="m_website">
-        <property name="text">
-         <string/>
-        </property>
-       </widget>
-      </item>
-      <item>
-       <widget class="QLabel" name="m_version">
-        <property name="text">
-         <string/>
-        </property>
-        <property name="alignment">
-         <set>Qt::AlignVCenter</set>
-        </property>
-       </widget>
-      </item>
-      <item>
-       <spacer>
-        <property name="orientation">
-         <enum>Qt::Vertical</enum>
-        </property>
-        <property name="sizeType">
-         <enum>QSizePolicy::Expanding</enum>
-        </property>
-        <property name="sizeHint" stdset="0">
-         <size>
-          <width>20</width>
-          <height>20</height>
-         </size>
-        </property>
-       </spacer>
-      </item>
-     </layout>
-    </widget>
-   </item>
-   <item row="2" column="1" rowspan="2">
-    <widget class="QStackedWidget" name="stackedWidget">
-     <property name="sizePolicy">
-      <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
-       <horstretch>0</horstretch>
-       <verstretch>0</verstretch>
-      </sizepolicy>
-     </property>
-     <widget class="QWidget" name="page"/>
-     <widget class="QWidget" name="page_2"/>
-    </widget>
-   </item>
-   <item row="1" column="0" colspan="2">
-    <widget class="KMessageWidget" name="m_messageWidget" native="true"/>
-   </item>
-  </layout>
- </widget>
- <customwidgets>
-  <customwidget>
-   <class>KMessageWidget</class>
-   <extends>QWidget</extends>
-   <header location="global">KMessageWidget</header>
-   <container>1</container>
-  </customwidget>
- </customwidgets>
- <resources/>
- <connections/>
-</ui>
diff --git a/kcms/phonon/devicepreference.cpp b/kcms/phonon/devicepreference.cpp
deleted file mode 100644
index 5a849b32..00000000
--- a/kcms/phonon/devicepreference.cpp
+++ /dev/null
@@ -1,993 +0,0 @@
-/*  This file is part of the KDE project
-    Copyright (C) 2006-2008 Matthias Kretz <kretz at kde.org>
-    Copyright (C) 2011 Casian Andrei <skeletk13 at gmail.com>
-    Copyright (C) 2014 Harald Sitter <sitter at kde.org>
-
-    This program is free software; you can redistribute it and/or
-    modify it under the terms of the GNU Library General Public
-    License as published by the Free Software Foundation; either
-    version 2 of the License, or (at your option) version 3.
-
-    This library is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-    Library General Public License for more details.
-
-    You should have received a copy of the GNU Library General Public License
-    along with this library; see the file COPYING.LIB.  If not, write to
-    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-    Boston, MA 02110-1301, USA.
-*/
-
-#include "devicepreference.h"
-
-#include <QDialogButtonBox>
-#include <QListWidget>
-#include <QLabel>
-#include <QPointer>
-#include <QStandardPaths>
-
-#include <phonon/AudioOutput>
-#include <phonon/BackendCapabilities>
-#include <phonon/MediaObject>
-#include <phonon/VideoWidget>
-#include <phonon/globalconfig.h>
-#include <phonon/phononnamespace.h>
-
-#include <KLocalizedString>
-#include <KMessageBox>
-
-#ifndef METATYPE_QLIST_INT_DEFINED
-#define METATYPE_QLIST_INT_DEFINED
-// Want this exactly once, see phonondefs_p.h kcm/devicepreference.cpp
-Q_DECLARE_METATYPE(QList<int>)
-#endif
-
-namespace Phonon {
-
-/*
- * Lists of categories for every device type
- */
-static const Category audioOutCategories[] = {
-    NoCategory,
-    NotificationCategory,
-    MusicCategory,
-    VideoCategory,
-    CommunicationCategory,
-    GameCategory,
-    AccessibilityCategory,
-};
-
-static const CaptureCategory audioCapCategories[] = {
-    NoCaptureCategory,
-    CommunicationCaptureCategory,
-    RecordingCaptureCategory,
-    ControlCaptureCategory
-};
-
-static const CaptureCategory videoCapCategories[] = {
-    NoCaptureCategory,
-    CommunicationCaptureCategory,
-    RecordingCaptureCategory,
-};
-
-static const int audioOutCategoriesCount = sizeof(audioOutCategories) / sizeof(Category);
-static const int audioCapCategoriesCount = sizeof(audioCapCategories) / sizeof(CaptureCategory);
-static const int videoCapCategoriesCount = sizeof(videoCapCategories) / sizeof(CaptureCategory);
-
-void operator++(Category &c)
-{
-    c = static_cast<Category>(1 + static_cast<int>(c));
-    //Q_ASSERT(c <= LastCategory);
-}
-
-class CategoryItem : public QStandardItem {
-public:
-    CategoryItem(Category cat)
-        : QStandardItem(),
-          m_cat(cat),
-          m_odtype(AudioOutputDeviceType)
-    {
-        if (cat == NoCategory) {
-            setText(i18n("Audio Playback"));
-        } else {
-            setText(categoryToString(cat));
-        }
-    }
-
-    CategoryItem(CaptureCategory cat, ObjectDescriptionType t = AudioCaptureDeviceType)
-        : QStandardItem(),
-          m_capcat(cat),
-          m_odtype(t)
-    {
-        if (cat == NoCaptureCategory) {
-            switch(t) {
-            case AudioCaptureDeviceType:
-                setText(i18n("Audio Recording"));
-                break;
-            case VideoCaptureDeviceType:
-                setText(i18n("Video Recording"));
-                break;
-            default:
-                setText(i18n("Invalid"));
-            }
-        } else {
-            setText(categoryToString(cat));
-        }
-    }
-
-    int type() const override { return 1001; }
-    Category category() const { return m_cat; }
-    CaptureCategory captureCategory() const { return m_capcat; }
-    ObjectDescriptionType odtype() const { return m_odtype; }
-
-private:
-    Category m_cat;
-    CaptureCategory m_capcat;
-    ObjectDescriptionType m_odtype;
-};
-
-/**
- * Need this to change the colors of the ListView if the Palette changed. With CSS set this won't
- * change automatically
- */
-void DevicePreference::changeEvent(QEvent *e)
-{
-    QWidget::changeEvent(e);
-    if (e->type() == QEvent::PaletteChange) {
-        deviceList->setStyleSheet(deviceList->styleSheet());
-    }
-}
-
-DevicePreference::DevicePreference(QWidget *parent)
-    : QWidget(parent),
-      m_headerModel(0, 1, nullptr),
-      m_media(nullptr), m_audioOutput(nullptr), m_videoWidget(nullptr)
-{
-    setupUi(this);
-
-    // Setup the buttons
-    testPlaybackButton->setIcon(QIcon::fromTheme(QStringLiteral("media-playback-start")));
-    testPlaybackButton->setEnabled(false);
-    testPlaybackButton->setToolTip(i18n("Test the selected device"));
-    deferButton->setIcon(QIcon::fromTheme(QStringLiteral("go-down")));
-    preferButton->setIcon(QIcon::fromTheme(QStringLiteral("go-up")));
-
-    // Configure the device list
-    deviceList->setDragDropMode(QAbstractItemView::InternalMove);
-    deviceList->setStyleSheet(QStringLiteral("QTreeView {"
-                                      "background-color: palette(base);"
-                                      "background-image: url(%1);"
-                                      "background-position: bottom left;"
-                                      "background-attachment: fixed;"
-                                      "background-repeat: no-repeat;"
-                                      "background-clip: padding;"
-                                      "}")
-                              .arg(QStandardPaths::locate(QStandardPaths::GenericDataLocation, "kcm_phonon/listview-background.png")));
-    deviceList->setAlternatingRowColors(false);
-
-    // The root item for the categories
-    QStandardItem *parentItem = m_categoryModel.invisibleRootItem();
-
-    // Audio Output Parent
-    QStandardItem *aOutputItem = new CategoryItem(NoCategory);
-    m_audioOutputModel[NoCategory] = new AudioOutputDeviceModel(this);
-    aOutputItem->setEditable(false);
-    aOutputItem->setToolTip(i18n("Defines the default ordering of devices which can be overridden by individual categories."));
-    parentItem->appendRow(aOutputItem);
-
-    // Audio Capture Parent
-    QStandardItem *aCaptureItem = new CategoryItem(NoCaptureCategory, AudioCaptureDeviceType);
-    m_audioCaptureModel[NoCaptureCategory] = new AudioCaptureDeviceModel(this);
-    aCaptureItem->setEditable(false);
-    aCaptureItem->setToolTip(i18n("Defines the default ordering of devices which can be overridden by individual categories."));
-    parentItem->appendRow(aCaptureItem);
-
-    // Video Capture Parent
-    QStandardItem *vCaptureItem = new CategoryItem(NoCaptureCategory, VideoCaptureDeviceType);
-    m_videoCaptureModel[NoCaptureCategory] = new VideoCaptureDeviceModel(this);
-    vCaptureItem->setEditable(false);
-    vCaptureItem->setToolTip(i18n("Defines the default ordering of devices which can be overridden by individual categories."));
-    parentItem->appendRow(vCaptureItem);
-
-    // Audio Output Children
-    parentItem = aOutputItem;
-    for (int i = 1; i < audioOutCategoriesCount; ++i) { // i == 1 to skip NoCategory
-        m_audioOutputModel[audioOutCategories[i]] = new AudioOutputDeviceModel(this);
-        QStandardItem *item = new CategoryItem(audioOutCategories[i]);
-        item->setEditable(false);
-        parentItem->appendRow(item);
-    }
-
-    // Audio Capture Children
-    parentItem = aCaptureItem;
-    for (int i = 1; i < audioCapCategoriesCount; ++i) { // i == 1 to skip NoCategory
-        m_audioCaptureModel[audioCapCategories[i]] = new AudioCaptureDeviceModel(this);
-        QStandardItem *item = new CategoryItem(audioCapCategories[i], AudioCaptureDeviceType);
-        item->setEditable(false);
-        parentItem->appendRow(item);
-    }
-
-    // Video Capture Children
-    parentItem = vCaptureItem;
-    for (int i = 1; i < videoCapCategoriesCount; ++i) { // i == 1 to skip NoCategory
-        m_videoCaptureModel[videoCapCategories[i]] = new VideoCaptureDeviceModel(this);
-        QStandardItem *item = new CategoryItem(videoCapCategories[i], VideoCaptureDeviceType);
-        item->setEditable(false);
-        parentItem->appendRow(item);
-    }
-
-    // Configure the category tree
-    categoryTree->setModel(&m_categoryModel);
-    if (categoryTree->header()) {
-        categoryTree->header()->hide();
-    }
-    categoryTree->expandAll();
-
-    connect(categoryTree->selectionModel(), SIGNAL(currentChanged(const QModelIndex &,const QModelIndex &)),
-            SLOT(updateDeviceList()));
-
-    // Connect all model data change signals to the changed slot
-    for (int i = -1; i <= LastCategory; ++i) {
-        connect(m_audioOutputModel[i], SIGNAL(rowsInserted(QModelIndex, int, int)), this, SIGNAL(changed()));
-        connect(m_audioOutputModel[i], SIGNAL(rowsRemoved(QModelIndex, int, int)), this, SIGNAL(changed()));
-        connect(m_audioOutputModel[i], SIGNAL(layoutChanged()), this, SIGNAL(changed()));
-        connect(m_audioOutputModel[i], SIGNAL(dataChanged(QModelIndex, QModelIndex)), this, SIGNAL(changed()));
-        if (m_audioCaptureModel.contains(i)) {
-            connect(m_audioCaptureModel[i], SIGNAL(rowsInserted(QModelIndex, int, int)), this, SIGNAL(changed()));
-            connect(m_audioCaptureModel[i], SIGNAL(rowsRemoved(QModelIndex , int, int)), this, SIGNAL(changed()));
-            connect(m_audioCaptureModel[i], SIGNAL(layoutChanged()), this, SIGNAL(changed()));
-            connect(m_audioCaptureModel[i], SIGNAL(dataChanged(QModelIndex, QModelIndex)), this, SIGNAL(changed()));
-        }
-        if (m_videoCaptureModel.contains(i)) {
-            connect(m_videoCaptureModel[i], SIGNAL(rowsInserted(QModelIndex, int, int)), this, SIGNAL(changed()));
-            connect(m_videoCaptureModel[i], SIGNAL(rowsRemoved(QModelIndex, int, int)), this, SIGNAL(changed()));
-            connect(m_videoCaptureModel[i], SIGNAL(layoutChanged()), this, SIGNAL(changed()));
-            connect(m_videoCaptureModel[i], SIGNAL(dataChanged(QModelIndex, QModelIndex)), this, SIGNAL(changed()));
-        }
-    }
-
-    connect(showAdvancedDevicesCheckBox, &QCheckBox::stateChanged, this, &DevicePreference::changed);
-
-    // Connect the signals from Phonon that notify changes in the device lists
-    connect(BackendCapabilities::notifier(), SIGNAL(availableAudioOutputDevicesChanged()), SLOT(updateAudioOutputDevices()));
-    connect(BackendCapabilities::notifier(), SIGNAL(availableAudioCaptureDevicesChanged()), SLOT(updateAudioCaptureDevices()));
-    connect(BackendCapabilities::notifier(), SIGNAL(availableVideoCaptureDevicesChanged()), SLOT(updateVideoCaptureDevices()));
-    connect(BackendCapabilities::notifier(), SIGNAL(capabilitiesChanged()), SLOT(updateAudioOutputDevices()));
-    connect(BackendCapabilities::notifier(), SIGNAL(capabilitiesChanged()), SLOT(updateAudioCaptureDevices()));
-    connect(BackendCapabilities::notifier(), SIGNAL(capabilitiesChanged()), SLOT(updateVideoCaptureDevices()));
-
-    if (!categoryTree->currentIndex().isValid()) {
-        categoryTree->setCurrentIndex(m_categoryModel.index(0, 0).child(1, 0));
-    }
-}
-
-DevicePreference::~DevicePreference()
-{
-    // Ensure that the video widget is destroyed, if it remains active
-    delete m_videoWidget;
-}
-
-void DevicePreference::updateDeviceList()
-{
-    // Temporarily disconnect the device list selection model
-    if (deviceList->selectionModel()) {
-        disconnect(deviceList->selectionModel(),
-                   SIGNAL(currentRowChanged(const QModelIndex &,const QModelIndex &)),
-                   this, SLOT(updateButtonsEnabled()));
-    }
-
-    // Get the current selected category item
-    QStandardItem *currentItem = m_categoryModel.itemFromIndex(categoryTree->currentIndex());
-    if (currentItem && currentItem->type() == 1001) {
-        CategoryItem *catItem = static_cast<CategoryItem *>(currentItem);
-        bool cap = catItem->odtype() != AudioOutputDeviceType;
-        const Category cat = catItem->category();
-        const CaptureCategory capcat = catItem->captureCategory();
-
-        // Update the device list, by setting it's model to the one for the corresponding category
-        switch (catItem->odtype()) {
-        case AudioOutputDeviceType:
-            deviceList->setModel(m_audioOutputModel[cat]);
-            break;
-        case AudioCaptureDeviceType:
-            deviceList->setModel(m_audioCaptureModel[capcat]);
-            break;
-        case VideoCaptureDeviceType:
-            deviceList->setModel(m_videoCaptureModel[capcat]);
-            break;
-        default: ;
-        }
-
-        // Update the header
-        if (cap ? capcat == NoCaptureCategory : cat == NoCategory) {
-            switch (catItem->odtype()) {
-            case AudioOutputDeviceType:
-                m_headerModel.setHeaderData(0, Qt::Horizontal, i18n("Default Audio Playback Device Preference"), Qt::DisplayRole);
-                break;
-            case AudioCaptureDeviceType:
-                m_headerModel.setHeaderData(0, Qt::Horizontal, i18n("Default Audio Recording Device Preference"), Qt::DisplayRole);
-                break;
-            case VideoCaptureDeviceType:
-                m_headerModel.setHeaderData(0, Qt::Horizontal, i18n("Default Video Recording Device Preference"), Qt::DisplayRole);
-                break;
-            default: ;
-            }
-        } else {
-            switch (catItem->odtype()) {
-            case AudioOutputDeviceType:
-                m_headerModel.setHeaderData(0, Qt::Horizontal, i18n("Audio Playback Device Preference for the '%1' Category",
-                                                                    categoryToString(cat)), Qt::DisplayRole);
-                break;
-            case AudioCaptureDeviceType:
-                m_headerModel.setHeaderData(0, Qt::Horizontal, i18n("Audio Recording Device Preference for the '%1' Category",
-                                                                    categoryToString(capcat)), Qt::DisplayRole);
-                break;
-            case VideoCaptureDeviceType:
-                m_headerModel.setHeaderData(0, Qt::Horizontal, i18n("Video Recording Device Preference for the '%1' Category",
-                                                                    categoryToString(capcat)), Qt::DisplayRole);
-                break;
-            default: ;
-            }
-        }
-    } else {
-        // No valid category selected
-        m_headerModel.setHeaderData(0, Qt::Horizontal, QString(), Qt::DisplayRole);
-        deviceList->setModel(nullptr);
-    }
-
-    // Update the header, the buttons enabled state
-    deviceList->header()->setModel(&m_headerModel);
-    updateButtonsEnabled();
-
-    // Reconnect the device list selection model
-    if (deviceList->selectionModel()) {
-        connect(deviceList->selectionModel(), SIGNAL(currentRowChanged(const QModelIndex &,const QModelIndex &)),
-                this, SLOT(updateButtonsEnabled()));
-    }
-
-    deviceList->resizeColumnToContents(0);
-}
-
-void DevicePreference::updateAudioCaptureDevices()
-{
-    const QList<AudioCaptureDevice> list = availableAudioCaptureDevices();
-    QHash<int, AudioCaptureDevice> hash;
-    foreach (const AudioCaptureDevice &dev, list) {
-        hash.insert(dev.index(), dev);
-    }
-
-    for (int catIndex = 0; catIndex < audioCapCategoriesCount; ++ catIndex) {
-        const int i = audioCapCategories[catIndex];
-        AudioCaptureDeviceModel *model = m_audioCaptureModel.value(i);
-        Q_ASSERT(model);
-
-        QHash<int, AudioCaptureDevice> hashCopy(hash);
-        QList<AudioCaptureDevice> orderedList;
-
-        if (model->rowCount() > 0) {
-            QList<int> order = model->tupleIndexOrder();
-            foreach (int idx, order) {
-                if (hashCopy.contains(idx)) {
-                    orderedList << hashCopy.take(idx);
-                }
-            }
-
-            if (hashCopy.size() > 1) {
-                // keep the order of the original list
-                foreach (const AudioCaptureDevice &dev, list) {
-                    if (hashCopy.contains(dev.index())) {
-                        orderedList << hashCopy.take(dev.index());
-                    }
-                }
-            } else if (hashCopy.size() == 1) {
-                orderedList += hashCopy.values();
-            }
-
-            model->setModelData(orderedList);
-        } else {
-            model->setModelData(list);
-        }
-    }
-
-    deviceList->resizeColumnToContents(0);
-}
-
-void DevicePreference::updateVideoCaptureDevices()
-{
-    const QList<VideoCaptureDevice> list = availableVideoCaptureDevices();
-    QHash<int, VideoCaptureDevice> hash;
-    foreach (const VideoCaptureDevice &dev, list) {
-        hash.insert(dev.index(), dev);
-    }
-
-    for (int catIndex = 0; catIndex < videoCapCategoriesCount; ++ catIndex) {
-        const int i = videoCapCategories[catIndex];
-        VideoCaptureDeviceModel *model = m_videoCaptureModel.value(i);
-        Q_ASSERT(model);
-
-        QHash<int, VideoCaptureDevice> hashCopy(hash);
-        QList<VideoCaptureDevice> orderedList;
-
-        if (model->rowCount() > 0) {
-            QList<int> order = model->tupleIndexOrder();
-            foreach (int idx, order) {
-                if (hashCopy.contains(idx)) {
-                    orderedList << hashCopy.take(idx);
-                }
-            }
-
-            if (hashCopy.size() > 1) {
-                // keep the order of the original list
-                foreach (const VideoCaptureDevice &dev, list) {
-                    if (hashCopy.contains(dev.index())) {
-                        orderedList << hashCopy.take(dev.index());
-                    }
-                }
-            } else if (hashCopy.size() == 1) {
-                orderedList += hashCopy.values();
-            }
-
-            model->setModelData(orderedList);
-        } else {
-            model->setModelData(list);
-        }
-    }
-
-    deviceList->resizeColumnToContents(0);
-}
-
-void DevicePreference::updateAudioOutputDevices()
-{
-    const QList<AudioOutputDevice> list = availableAudioOutputDevices();
-    QHash<int, AudioOutputDevice> hash;
-    foreach (const AudioOutputDevice &dev, list) {
-        hash.insert(dev.index(), dev);
-    }
-
-    for (int catIndex = 0; catIndex < audioOutCategoriesCount; ++ catIndex) {
-        const int i = audioOutCategories[catIndex];
-        AudioOutputDeviceModel *model = m_audioOutputModel.value(i);
-        Q_ASSERT(model);
-
-        QHash<int, AudioOutputDevice> hashCopy(hash);
-        QList<AudioOutputDevice> orderedList;
-
-        if (model->rowCount() > 0) {
-            QList<int> order = model->tupleIndexOrder();
-            foreach (int idx, order) {
-                if (hashCopy.contains(idx)) {
-                    orderedList << hashCopy.take(idx);
-                }
-            }
-
-            if (hashCopy.size() > 1) {
-                // keep the order of the original list
-                foreach (const AudioOutputDevice &dev, list) {
-                    if (hashCopy.contains(dev.index())) {
-                        orderedList << hashCopy.take(dev.index());
-                    }
-                }
-            } else if (hashCopy.size() == 1) {
-                orderedList += hashCopy.values();
-            }
-
-            model->setModelData(orderedList);
-        } else {
-            model->setModelData(list);
-        }
-    }
-
-    deviceList->resizeColumnToContents(0);
-}
-
-QList<AudioOutputDevice> DevicePreference::availableAudioOutputDevices() const
-{
-    return BackendCapabilities::availableAudioOutputDevices();
-}
-
-QList<AudioCaptureDevice> DevicePreference::availableAudioCaptureDevices() const
-{
-#ifndef PHONON_NO_AUDIOCAPTURE
-    return BackendCapabilities::availableAudioCaptureDevices();
-#else
-    return QList<AudioCaptureDevice>();
-#endif
-}
-
-QList<VideoCaptureDevice> DevicePreference::availableVideoCaptureDevices() const
-{
-#ifndef PHONON_NO_VIDEOCAPTURE
-    return BackendCapabilities::availableVideoCaptureDevices();
-#else
-    return QList<VideoCaptureDevice>();
-#endif
-}
-
-void DevicePreference::load()
-{
-    showAdvancedDevicesCheckBox->setChecked(!GlobalConfig().hideAdvancedDevices());
-    loadCategoryDevices();
-}
-
-void DevicePreference::loadCategoryDevices()
-{
-    // "Load" the settings from the backend.
-    for (int i = 0; i < audioOutCategoriesCount; ++ i) {
-        const Category cat = audioOutCategories[i];
-        QList<AudioOutputDevice> list;
-        const QList<int> deviceIndexes = GlobalConfig().audioOutputDeviceListFor(cat);
-        foreach (int i, deviceIndexes) {
-            list.append(AudioOutputDevice::fromIndex(i));
-        }
-
-        m_audioOutputModel[cat]->setModelData(list);
-    }
-
-#ifndef PHONON_NO_AUDIOCAPTURE
-    for (int i = 0; i < audioCapCategoriesCount; ++ i) {
-        const CaptureCategory cat = audioCapCategories[i];
-        QList<AudioCaptureDevice> list;
-        const QList<int> deviceIndexes = GlobalConfig().audioCaptureDeviceListFor(cat);
-        foreach (int i, deviceIndexes) {
-            list.append(AudioCaptureDevice::fromIndex(i));
-        }
-
-        m_audioCaptureModel[cat]->setModelData(list);
-    }
-#endif
-
-#ifndef PHONON_NO_VIDEOCAPTURE
-    for (int i = 0; i < videoCapCategoriesCount; ++ i) {
-        const CaptureCategory cat = videoCapCategories[i];
-        QList<VideoCaptureDevice> list;
-        const QList<int> deviceIndexes = GlobalConfig().videoCaptureDeviceListFor(cat);
-        foreach (int i, deviceIndexes) {
-            list.append(VideoCaptureDevice::fromIndex(i));
-        }
-
-        m_videoCaptureModel[cat]->setModelData(list);
-    }
-#endif
-
-    deviceList->resizeColumnToContents(0);
-}
-
-void DevicePreference::save()
-{
-    for (int i = 0; i < audioOutCategoriesCount; ++i) {
-        const Category cat = audioOutCategories[i];
-        Q_ASSERT(m_audioOutputModel.value(cat));
-        const QList<int> order = m_audioOutputModel.value(cat)->tupleIndexOrder();
-        GlobalConfig().setAudioOutputDeviceListFor(cat, order);
-    }
-
-#ifndef PHONON_NO_AUDIOCAPTURE
-    for (int i = 0; i < audioCapCategoriesCount; ++i) {
-        const CaptureCategory cat = audioCapCategories[i];
-        Q_ASSERT(m_audioCaptureModel.value(cat));
-        const QList<int> order = m_audioCaptureModel.value(cat)->tupleIndexOrder();
-        GlobalConfig().setAudioCaptureDeviceListFor(cat, order);
-    }
-#endif
-
-#ifndef PHONON_NO_VIDEOCAPTURE
-    for (int i = 0; i < videoCapCategoriesCount; ++i) {
-        const CaptureCategory cat = videoCapCategories[i];
-        Q_ASSERT(m_videoCaptureModel.value(cat));
-        const QList<int> order = m_videoCaptureModel.value(cat)->tupleIndexOrder();
-        GlobalConfig().setVideoCaptureDeviceListFor(cat, order);
-    }
-#endif
-}
-
-void DevicePreference::defaults()
-{
-    {
-        const QList<AudioOutputDevice> list = availableAudioOutputDevices();
-        for (int i = 0; i < audioOutCategoriesCount; ++i) {
-            m_audioOutputModel[audioOutCategories[i]]->setModelData(list);
-        }
-    }
-    {
-        const QList<AudioCaptureDevice> list = availableAudioCaptureDevices();
-        for (int i = 0; i < audioCapCategoriesCount; ++i) {
-            m_audioCaptureModel[audioCapCategories[i]]->setModelData(list);
-        }
-    }
-    {
-        const QList<VideoCaptureDevice> list = availableVideoCaptureDevices();
-        for (int i = 0; i < videoCapCategoriesCount; ++i) {
-            m_videoCaptureModel[videoCapCategories[i]]->setModelData(list);
-        }
-    }
-
-    /*
-     * Save this list (that contains even hidden devices) to GlobaConfig, and then
-     * load them back. All devices that should be hidden will be hidden
-     */
-    save();
-    loadCategoryDevices();
-
-    deviceList->resizeColumnToContents(0);
-}
-
-void DevicePreference::pulseAudioEnabled()
-{
-    showAdvancedDevicesContainer->removeItem(showAdvancedDevicesSpacer);
-    delete showAdvancedDevicesSpacer;
-    showAdvancedDevicesCheckBox->setVisible(false);
-}
-
-void DevicePreference::on_preferButton_clicked()
-{
-    QAbstractItemModel *model = deviceList->model();
-    {
-        AudioOutputDeviceModel *deviceModel = dynamic_cast<AudioOutputDeviceModel *>(model);
-        if (deviceModel) {
-            deviceModel->moveUp(deviceList->currentIndex());
-            updateButtonsEnabled();
-            emit changed();
-        }
-    }
-    {
-        AudioCaptureDeviceModel *deviceModel = dynamic_cast<AudioCaptureDeviceModel *>(model);
-        if (deviceModel) {
-            deviceModel->moveUp(deviceList->currentIndex());
-            updateButtonsEnabled();
-            emit changed();
-        }
-    }
-    {
-        VideoCaptureDeviceModel *deviceModel = dynamic_cast<VideoCaptureDeviceModel *>(model);
-        if (deviceModel) {
-            deviceModel->moveUp(deviceList->currentIndex());
-            updateButtonsEnabled();
-            emit changed();
-        }
-    }
-}
-
-void DevicePreference::on_deferButton_clicked()
-{
-    QAbstractItemModel *model = deviceList->model();
-    {
-        AudioOutputDeviceModel *deviceModel = dynamic_cast<AudioOutputDeviceModel *>(model);
-        if (deviceModel) {
-            deviceModel->moveDown(deviceList->currentIndex());
-            updateButtonsEnabled();
-            emit changed();
-        }
-    }
-    {
-        AudioCaptureDeviceModel *deviceModel = dynamic_cast<AudioCaptureDeviceModel *>(model);
-        if (deviceModel) {
-            deviceModel->moveDown(deviceList->currentIndex());
-            updateButtonsEnabled();
-            emit changed();
-        }
-    }
-    {
-        VideoCaptureDeviceModel *deviceModel = dynamic_cast<VideoCaptureDeviceModel *>(model);
-        if (deviceModel) {
-            deviceModel->moveDown(deviceList->currentIndex());
-            updateButtonsEnabled();
-            emit changed();
-        }
-    }
-}
-
-
-DevicePreference::DeviceType DevicePreference::shownModelType() const
-{
-    const QStandardItem *item = m_categoryModel.itemFromIndex(categoryTree->currentIndex());
-    if (!item)
-        return dtInvalidDevice;
-    Q_ASSERT(item->type() == 1001);
-
-    const CategoryItem *catItem = static_cast<const CategoryItem *>(item);
-    if (!catItem)
-        return dtInvalidDevice;
-
-    switch (catItem->odtype()) {
-    case AudioOutputDeviceType:
-        return dtAudioOutput;
-    case AudioCaptureDeviceType:
-        return dtAudioCapture;
-    case VideoCaptureDeviceType:
-        return dtVideoCapture;
-    default:
-        return dtInvalidDevice;
-    }
-}
-
-void DevicePreference::on_applyPreferencesButton_clicked()
-{
-    const QModelIndex idx = categoryTree->currentIndex();
-    const QStandardItem *item = m_categoryModel.itemFromIndex(idx);
-    if (!item)
-        return;
-    Q_ASSERT(item->type() == 1001);
-
-    const CategoryItem *catItem = static_cast<const CategoryItem *>(item);
-
-    QList<AudioOutputDevice> aoPreferredList;
-    QList<AudioCaptureDevice> acPreferredList;
-    QList<VideoCaptureDevice> vcPreferredList;
-    const Category *categoryList = nullptr;
-    const CaptureCategory *capCategoryList = nullptr;
-    int categoryListCount;
-    int catIndex;
-    bool cap = false;
-
-    switch (catItem->odtype()) {
-    case AudioOutputDeviceType:
-        aoPreferredList = m_audioOutputModel.value(catItem->category())->modelData();
-        categoryList = audioOutCategories;
-        categoryListCount = audioOutCategoriesCount;
-        cap = false;
-        break;
-
-    case AudioCaptureDeviceType:
-        acPreferredList = m_audioCaptureModel.value(catItem->captureCategory())->modelData();
-        capCategoryList = audioCapCategories;
-        categoryListCount = audioCapCategoriesCount;
-        cap = true;
-        break;
-
-    case VideoCaptureDeviceType:
-        vcPreferredList = m_videoCaptureModel.value(catItem->captureCategory())->modelData();
-        capCategoryList = videoCapCategories;
-        categoryListCount = videoCapCategoriesCount;
-        cap = true;
-        break;
-
-    default:
-        return;
-    }
-
-    QPointer<QDialog> dialog = new QDialog(this);
-
-    QLabel *label = new QLabel(dialog);
-    label->setText(i18n("Apply the currently shown device preference list to the following other "
-                        "audio playback categories:"));
-    label->setWordWrap(true);
-
-    QListWidget *list = new QListWidget(dialog);
-
-    for (catIndex = 0; catIndex < categoryListCount; catIndex ++) {
-        Category cat = cap ? NoCategory : categoryList[catIndex];
-        CaptureCategory capcat = cap ? capCategoryList[catIndex] : NoCaptureCategory;
-
-        QListWidgetItem *item = nullptr;
-        if (cap) {
-            if (capcat == NoCaptureCategory) {
-                item = new QListWidgetItem(i18n("Default/Unspecified Category"), list, capcat);
-            } else {
-                item = new QListWidgetItem(categoryToString(capcat), list, capcat);
-            }
-        } else {
-            if (cat == NoCategory) {
-                item = new QListWidgetItem(i18n("Default/Unspecified Category"), list, cat);
-            } else {
-                item = new QListWidgetItem(categoryToString(cat), list, cat);
-            }
-        }
-
-        item->setCheckState(Qt::Checked);
-        if (cat == catItem->category()) {
-            item->setFlags(item->flags() & ~Qt::ItemIsEnabled);
-        }
-    }
-
-    QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok
-                                                       | QDialogButtonBox::Cancel, dialog);
-    connect(buttonBox, &QDialogButtonBox::accepted, dialog.data(), &QDialog::accept);
-    connect(buttonBox, &QDialogButtonBox::rejected, dialog.data(), &QDialog::reject);
-
-    QVBoxLayout *layout = new QVBoxLayout(dialog);
-    layout->addWidget(label);
-    layout->addWidget(list);
-    layout->addWidget(buttonBox);
-
-    switch (dialog->exec()) {
-    case QDialog::Accepted:
-        for (catIndex = 0; catIndex < categoryListCount; catIndex ++) {
-            Category cat = cap ? NoCategory : categoryList[catIndex];
-            CaptureCategory capcat = cap ? capCategoryList[catIndex] : NoCaptureCategory;
-
-            if (cap ? capcat != catItem->captureCategory() : cat != catItem->category()) {
-                QListWidgetItem *item = list->item(catIndex);
-                Q_ASSERT(item->type() == cap ? (int) capcat : (int) cat);
-                if (item->checkState() == Qt::Checked) {
-                    switch (catItem->odtype()) {
-                    case AudioOutputDeviceType:
-                        m_audioOutputModel.value(cat)->setModelData(aoPreferredList);
-                        break;
-
-                    case AudioCaptureDeviceType:
-                        m_audioCaptureModel.value(capcat)->setModelData(acPreferredList);
-                        break;
-
-                    case VideoCaptureDeviceType:
-                        m_videoCaptureModel.value(capcat)->setModelData(vcPreferredList);
-                        break;
-
-                    default: ;
-                    }
-                }
-            }
-        }
-
-        emit changed();
-        break;
-
-    case QDialog::Rejected:
-        // nothing to do
-        break;
-    }
-
-    delete dialog;
-}
-
-void DevicePreference::on_showAdvancedDevicesCheckBox_toggled()
-{
-    // In order to get the right list from the backend, we need to update the settings now
-    // before calling availableAudio{Output,Capture}Devices()
-    GlobalConfig().setHideAdvancedDevices(!showAdvancedDevicesCheckBox->isChecked());
-    loadCategoryDevices();
-}
-
-void DevicePreference::on_testPlaybackButton_toggled(bool down)
-{
-    if (down) {
-        QModelIndex idx = deviceList->currentIndex();
-        if (!idx.isValid()) {
-            return;
-        }
-
-        // Shouldn't happen, but better to be on the safe side
-        if (m_testingType != dtInvalidDevice) {
-            delete m_media;
-            m_media = nullptr;
-            delete m_audioOutput;
-            m_audioOutput = nullptr;
-            delete m_videoWidget;
-            m_videoWidget = nullptr;
-        }
-
-        // Setup the Phonon objects according to the testing type
-        m_testingType = shownModelType();
-        switch (m_testingType) {
-        case dtAudioOutput: {
-            // Create an audio output with the selected device
-            m_media = new MediaObject(this);
-            const AudioOutputDeviceModel *model = static_cast<const AudioOutputDeviceModel *>(idx.model());
-            const AudioOutputDevice &device = model->modelData(idx);
-            m_audioOutput = new AudioOutput(this);
-            if (!m_audioOutput->setOutputDevice(device)) {
-                KMessageBox::error(this, i18n("Failed to set the selected audio output device"));
-                break;
-            }
-
-            // Just to be very sure that nothing messes our test sound up
-            m_audioOutput->setVolume(1.0);
-            m_audioOutput->setMuted(false);
-
-            createPath(m_media, m_audioOutput);
-            static QUrl testUrl = QUrl::fromLocalFile(QStandardPaths::locate(
-                                                          QStandardPaths::GenericDataLocation,
-                                                          QStringLiteral("sounds/Oxygen-Sys-Log-In.ogg")));
-            m_media->setCurrentSource(testUrl);
-            connect(m_media, &MediaObject::finished, testPlaybackButton, &QToolButton::toggle);
-
-            break;
-        }
-
-#ifndef PHONON_NO_AUDIOCAPTURE
-        case dtAudioCapture: {
-            // Create a media object and an audio output
-            m_media = new MediaObject(this);
-            m_audioOutput = new AudioOutput(NoCategory, this);
-
-            // Just to be very sure that nothing messes our test sound up
-            m_audioOutput->setVolume(1.0);
-            m_audioOutput->setMuted(false);
-
-            // Try to create a path
-            if (!createPath(m_media, m_audioOutput).isValid()) {
-                KMessageBox::error(this, i18n("Your backend may not support audio recording"));
-                break;
-            }
-
-            // Determine the selected device
-            const AudioCaptureDeviceModel *model = static_cast<const AudioCaptureDeviceModel *>(idx.model());
-            const AudioCaptureDevice &device = model->modelData(idx);
-            m_media->setCurrentSource(device);
-
-            break;
-        }
-#endif
-
-#ifndef PHONON_NO_VIDEOCAPTURE
-        case dtVideoCapture: {
-            // Create a media object and a video output
-            m_media = new MediaObject(this);
-            m_videoWidget = new VideoWidget(nullptr);
-
-            // Try to create a path
-            if (!createPath(m_media, m_videoWidget).isValid()) {
-                KMessageBox::error(this, i18n("Your backend may not support video recording"));
-                break;
-            }
-
-            // Determine the selected device
-            const VideoCaptureDeviceModel *model = static_cast<const VideoCaptureDeviceModel *>(idx.model());
-            const VideoCaptureDevice &device = model->modelData(idx);
-            m_media->setCurrentSource(device);
-
-            // Set up the testing video widget
-            m_videoWidget->setWindowTitle(i18n("Testing %1", device.name()));
-            m_videoWidget->setWindowFlags(Qt::WindowStaysOnTopHint | Qt::WindowTitleHint | Qt::WindowMinMaxButtonsHint);
-            if (device.property("icon").canConvert(QVariant::String))
-                m_videoWidget->setWindowIcon(QIcon::fromTheme(device.property("icon").toString()));
-            m_videoWidget->move(QCursor::pos() - QPoint(250, 295));
-            m_videoWidget->resize(320, 240);
-            m_videoWidget->show();
-
-            break;
-        }
-#endif
-
-        default:
-            return;
-        }
-
-        m_media->play();
-    } else {
-        // Uninitialize the Phonon objects according to the testing type
-        switch (m_testingType) {
-        case dtAudioOutput:
-            disconnect(m_media, &MediaObject::finished, testPlaybackButton, &QToolButton::toggle);
-            delete m_media;
-            delete m_audioOutput;
-            break;
-
-        case dtAudioCapture:
-            delete m_media;
-            delete m_audioOutput;
-            break;
-
-        case dtVideoCapture:
-            delete m_media;
-            delete m_videoWidget;
-            break;
-
-        default:
-            return;
-        }
-
-        m_media = nullptr;
-        m_videoWidget = nullptr;
-        m_audioOutput = nullptr;
-        m_testingType = dtInvalidDevice;
-    }
-}
-
-void DevicePreference::updateButtonsEnabled()
-{
-    if (deviceList->model()) {
-        QModelIndex idx = deviceList->currentIndex();
-        preferButton->setEnabled(idx.isValid() && idx.row() > 0);
-        deferButton->setEnabled(idx.isValid() && idx.row() < deviceList->model()->rowCount() - 1);
-        testPlaybackButton->setEnabled(idx.isValid() && (idx.flags() & Qt::ItemIsEnabled));
-    } else {
-        preferButton->setEnabled(false);
-        deferButton->setEnabled(false);
-        testPlaybackButton->setEnabled(false);
-    }
-}
-
-} // Phonon namespace
-
-#include "moc_devicepreference.cpp"
diff --git a/kcms/phonon/devicepreference.h b/kcms/phonon/devicepreference.h
deleted file mode 100644
index 2ed8f368..00000000
--- a/kcms/phonon/devicepreference.h
+++ /dev/null
@@ -1,95 +0,0 @@
-/*  This file is part of the KDE project
-    Copyright (C) 2006-2008 Matthias Kretz <kretz at kde.org>
-    Copyright (C) 2011 Casian Andrei <skeletk13 at gmail.com>
-
-    This program is free software; you can redistribute it and/or
-    modify it under the terms of the GNU Library General Public
-    License as published by the Free Software Foundation; either
-    version 2 of the License, or (at your option) version 3.
-
-    This library is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-    Library General Public License for more details.
-
-    You should have received a copy of the GNU Library General Public License
-    along with this library; see the file COPYING.LIB.  If not, write to
-    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-    Boston, MA 02110-1301, USA.
-*/
-
-#ifndef DEVICEPREFERENCE_H_STUPID_UIC
-#define DEVICEPREFERENCE_H_STUPID_UIC
-
-#include "ui_devicepreference.h"
-
-#include <QMap>
-#include <QStandardItem>
-
-#include <phonon/objectdescription.h>
-#include <phonon/objectdescriptionmodel.h>
-
-namespace Phonon {
-
-class MediaObject;
-class AudioOutput;
-class VideoWidget;
-
-class DevicePreference : public QWidget, private Ui::DevicePreference
-{
-    Q_OBJECT
-public:
-    explicit DevicePreference(QWidget *parent = nullptr);
-    ~DevicePreference() override;
-
-    void load();
-    void save();
-    void defaults();
-    void pulseAudioEnabled();
-
-Q_SIGNALS:
-    void changed();
-
-protected:
-    void changeEvent(QEvent *) override;
-
-private Q_SLOTS:
-    void on_preferButton_clicked();
-    void on_deferButton_clicked();
-    void on_showAdvancedDevicesCheckBox_toggled();
-    void on_applyPreferencesButton_clicked();
-    void on_testPlaybackButton_toggled(bool down);
-    void updateButtonsEnabled();
-    void updateDeviceList();
-    void updateAudioOutputDevices();
-    void updateAudioCaptureDevices();
-    void updateVideoCaptureDevices();
-
-private:
-    enum DeviceType {dtInvalidDevice, dtAudioOutput, dtAudioCapture, dtVideoCapture};
-
-private:
-    template<ObjectDescriptionType T> void removeDevice(const ObjectDescription<T> &deviceToRemove,
-                                                        QMap<int, ObjectDescriptionModel<T> *> *modelMap);
-    void loadCategoryDevices();
-    QList<AudioOutputDevice> availableAudioOutputDevices() const;
-    QList<AudioCaptureDevice> availableAudioCaptureDevices() const;
-    QList<VideoCaptureDevice> availableVideoCaptureDevices() const;
-    DeviceType shownModelType() const;
-
-private:
-    QMap<int, AudioOutputDeviceModel *> m_audioOutputModel;
-    QMap<int, AudioCaptureDeviceModel *> m_audioCaptureModel;
-    QMap<int, VideoCaptureDeviceModel *> m_videoCaptureModel;
-    QStandardItemModel m_categoryModel;
-    QStandardItemModel m_headerModel;
-    DeviceType m_testingType;
-
-    MediaObject *m_media;
-    AudioOutput *m_audioOutput;
-    VideoWidget *m_videoWidget;
-};
-
-} // namespace Phonon
-
-#endif // DEVICEPREFERENCE_H_STUPID_UIC
diff --git a/kcms/phonon/devicepreference.ui b/kcms/phonon/devicepreference.ui
deleted file mode 100644
index 30fc7079..00000000
--- a/kcms/phonon/devicepreference.ui
+++ /dev/null
@@ -1,219 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ui version="4.0">
- <author>Matthias Kretz <kretz at kde.org></author>
- <class>DevicePreference</class>
- <widget class="QWidget" name="DevicePreference">
-  <property name="geometry">
-   <rect>
-    <x>0</x>
-    <y>0</y>
-    <width>600</width>
-    <height>400</height>
-   </rect>
-  </property>
-  <layout class="QGridLayout">
-   <item row="0" column="0" rowspan="2">
-    <layout class="QVBoxLayout">
-     <item>
-      <widget class="QTreeView" name="categoryTree">
-       <property name="sizePolicy">
-        <sizepolicy hsizetype="Preferred" vsizetype="Expanding">
-         <horstretch>0</horstretch>
-         <verstretch>0</verstretch>
-        </sizepolicy>
-       </property>
-       <property name="contextMenuPolicy">
-        <enum>Qt::CustomContextMenu</enum>
-       </property>
-       <property name="toolTip">
-        <string>Various categories of media use cases.  For each category, you may choose what device you prefer to be used by the Phonon applications.</string>
-       </property>
-       <property name="whatsThis">
-        <string>Various categories of media use cases.  For each category, you may choose what device you prefer to be used by the Phonon applications.</string>
-       </property>
-       <property name="itemsExpandable">
-        <bool>false</bool>
-       </property>
-      </widget>
-     </item>
-     <item>
-      <layout class="QHBoxLayout" name="showAdvancedDevicesContainer">
-       <property name="spacing">
-        <number>0</number>
-       </property>
-       <item>
-        <widget class="QCheckBox" name="showAdvancedDevicesCheckBox">
-         <property name="text">
-          <string>Show advanced devices</string>
-         </property>
-        </widget>
-       </item>
-       <item>
-        <spacer name="showAdvancedDevicesSpacer">
-         <property name="orientation">
-          <enum>Qt::Horizontal</enum>
-         </property>
-         <property name="sizeType">
-          <enum>QSizePolicy::Preferred</enum>
-         </property>
-         <property name="sizeHint" stdset="0">
-          <size>
-           <width>0</width>
-           <height>20</height>
-          </size>
-         </property>
-        </spacer>
-       </item>
-      </layout>
-     </item>
-     <item>
-      <layout class="QHBoxLayout">
-       <property name="spacing">
-        <number>0</number>
-       </property>
-       <item>
-        <widget class="QPushButton" name="applyPreferencesButton">
-         <property name="toolTip">
-          <string>Use the currently shown device list for more categories.</string>
-         </property>
-         <property name="whatsThis">
-          <string>Use the currently shown device list for more categories.</string>
-         </property>
-         <property name="text">
-          <string>Apply Device List To...</string>
-         </property>
-        </widget>
-       </item>
-       <item>
-        <spacer>
-         <property name="orientation">
-          <enum>Qt::Horizontal</enum>
-         </property>
-         <property name="sizeType">
-          <enum>QSizePolicy::Minimum</enum>
-         </property>
-         <property name="sizeHint" stdset="0">
-          <size>
-           <width>0</width>
-           <height>20</height>
-          </size>
-         </property>
-        </spacer>
-       </item>
-      </layout>
-     </item>
-    </layout>
-   </item>
-   <item row="0" column="1">
-    <widget class="QTreeView" name="deviceList">
-     <property name="acceptDrops">
-      <bool>true</bool>
-     </property>
-     <property name="toolTip">
-      <string>Devices found on your system, suitable for the selected category.  Choose the device that you wish to be used by the applications.</string>
-     </property>
-     <property name="whatsThis">
-      <string>The order determines the preference of the devices. If for some reason the first device cannot be used Phonon will try to use the second, and so on.</string>
-     </property>
-     <property name="horizontalScrollBarPolicy">
-      <enum>Qt::ScrollBarAsNeeded</enum>
-     </property>
-     <property name="dragEnabled">
-      <bool>true</bool>
-     </property>
-     <property name="dragDropMode">
-      <enum>QAbstractItemView::InternalMove</enum>
-     </property>
-     <property name="selectionBehavior">
-      <enum>QAbstractItemView::SelectRows</enum>
-     </property>
-     <property name="iconSize">
-      <size>
-       <width>32</width>
-       <height>32</height>
-      </size>
-     </property>
-     <property name="textElideMode">
-      <enum>Qt::ElideNone</enum>
-     </property>
-     <property name="verticalScrollMode">
-      <enum>QAbstractItemView::ScrollPerPixel</enum>
-     </property>
-     <property name="horizontalScrollMode">
-      <enum>QAbstractItemView::ScrollPerPixel</enum>
-     </property>
-     <property name="rootIsDecorated">
-      <bool>false</bool>
-     </property>
-     <property name="itemsExpandable">
-      <bool>false</bool>
-     </property>
-    </widget>
-   </item>
-   <item row="1" column="1">
-    <layout class="QHBoxLayout">
-     <item>
-      <spacer>
-       <property name="orientation">
-        <enum>Qt::Horizontal</enum>
-       </property>
-       <property name="sizeHint" stdset="0">
-        <size>
-         <width>16</width>
-         <height>29</height>
-        </size>
-       </property>
-      </spacer>
-     </item>
-     <item>
-      <widget class="QToolButton" name="testPlaybackButton">
-       <property name="text">
-        <string>Test</string>
-       </property>
-       <property name="checkable">
-        <bool>true</bool>
-       </property>
-       <property name="toolButtonStyle">
-        <enum>Qt::ToolButtonTextBesideIcon</enum>
-       </property>
-      </widget>
-     </item>
-     <item>
-      <widget class="QToolButton" name="preferButton">
-       <property name="enabled">
-        <bool>false</bool>
-       </property>
-       <property name="toolTip">
-        <string>prefer the selected device</string>
-       </property>
-       <property name="text">
-        <string>Prefer</string>
-       </property>
-       <property name="toolButtonStyle">
-        <enum>Qt::ToolButtonTextBesideIcon</enum>
-       </property>
-      </widget>
-     </item>
-     <item>
-      <widget class="QToolButton" name="deferButton">
-       <property name="enabled">
-        <bool>false</bool>
-       </property>
-       <property name="toolTip">
-        <string>no preference for the selected device</string>
-       </property>
-       <property name="text">
-        <string>Defer</string>
-       </property>
-       <property name="toolButtonStyle">
-        <enum>Qt::ToolButtonTextBesideIcon</enum>
-       </property>
-      </widget>
-     </item>
-    </layout>
-   </item>
-  </layout>
- </widget>
- <resources/>
- <connections/>
-</ui>
diff --git a/kcms/phonon/kcm_phonon.desktop b/kcms/phonon/kcm_phonon.desktop
deleted file mode 100644
index 79ac4476..00000000
--- a/kcms/phonon/kcm_phonon.desktop
+++ /dev/null
@@ -1,160 +0,0 @@
-[Desktop Entry]
-Exec=kcmshell5 kcm_phonon
-Icon=preferences-desktop-sound
-Type=Service
-X-KDE-ServiceTypes=KCModule
-
-X-KDE-Library=kcm_phonon
-X-KDE-FactoryName=kcm_phonon
-X-KDE-ParentApp=kcontrol
-X-KDE-System-Settings-Parent-Category=audio-and-video
-X-DocPath=kcontrol/phonon/index.html
-
-Name=Audio and Video
-Name[ar]=الصّوت والفيديو
-Name[bs]=Audio i video
-Name[ca]=Àudio i vídeo
-Name[ca at valencia]=Àudio i vídeo
-Name[cs]=Audio a video
-Name[da]=Lyd og video
-Name[de]=Audio und Video
-Name[el]=Ήχος και βίντεο
-Name[en_GB]=Audio and Video
-Name[es]=Audio y vídeo
-Name[et]=Heli ja video
-Name[eu]=Audioa eta bideoa
-Name[fi]=Ääni ja video
-Name[fr]=Audio et vidéo
-Name[gl]=Son e vídeo
-Name[he]=שמע ווידאו
-Name[hu]=Hang és videó
-Name[id]=Audio dan Video
-Name[is]=Hljóð og mynd
-Name[it]=Audio e video
-Name[ja]=オーディオとビデオ
-Name[ko]=오디오 및 비디오
-Name[lt]=Garsas ir vaizdas
-Name[mr]=ऑडिओ व व्हिडिओ
-Name[nb]=Lyd og video
-Name[nds]=Video un Klang
-Name[nl]=Audio en video
-Name[nn]=Lyd og video
-Name[pa]=ਆਡੀਓ ਅਤੇ ਵੀਡੀਓ
-Name[pl]=Dźwięk i obraz
-Name[pt]=Áudio e Vídeo
-Name[pt_BR]=Áudio e vídeo
-Name[ru]=Звук и видео
-Name[sk]=Zvuk a video
-Name[sl]=Zvok in video
-Name[sr]=Аудио и видео
-Name[sr at ijekavian]=Аудио и видео
-Name[sr at ijekavianlatin]=Audio i video
-Name[sr at latin]=Audio i video
-Name[sv]=Ljud- och video
-Name[tr]=Ses ve Video
-Name[uk]=Звук та відео
-Name[x-test]=xxAudio and Videoxx
-Name[zh_CN]=音频和视频
-Name[zh_TW]=音效和視訊
-Comment=Phonon Audio and Video
-Comment[ar]=صوت وفيديو فنون
-Comment[bs]=Audio i Video fonona
-Comment[ca]=Àudio i vídeo del Phonon
-Comment[ca at valencia]=Àudio i vídeo del Phonon
-Comment[cs]=Audio a video - Phonon
-Comment[da]=Phonon lyd og video
-Comment[de]=Phonon - Audio und Video
-Comment[el]=Ήχος και βίντεο Phonon
-Comment[en_GB]=Phonon Audio and Video
-Comment[es]=Audio y vídeo de Phonon
-Comment[et]=Phononi heli ja video
-Comment[eu]=Phonon audioa eta bideoa
-Comment[fi]=Phononin ääni ja video
-Comment[fr]=Audio et vidéo de Phonon
-Comment[gl]=Son e vídeo de Phonon
-Comment[he]=שמע ווידאו של Phonon
-Comment[hu]=Phonon hang és videó
-Comment[id]=Phonon Audio dan Video
-Comment[is]=Phonon hljóð og mynd
-Comment[it]=Audio e video di Phonon
-Comment[ja]=Phonon オーディオとビデオ
-Comment[ko]=Phonon 오디오 및 비디오
-Comment[lt]=Phonon audio ir video
-Comment[mr]=फोनोन ऑडिओ व व्हिडिओ
-Comment[nb]=Phonon lyd og video
-Comment[nds]=Phonon-Instellen för Video un Klang
-Comment[nl]=Phonon audio en video
-Comment[nn]=Phonon lyd og video
-Comment[pa]=ਫੋਨੋਨ ਆਡੀਓ ਅਤੇ ਵੀਡੀਓ
-Comment[pl]=Phonon - dźwięk i obraz
-Comment[pt]=Áudio e Vídeo do Phonon
-Comment[pt_BR]=Áudio e vídeo do Phonon
-Comment[ru]=Настройка мультимедийной платформы Phonon
-Comment[sk]=Zvuk a video Phonon
-Comment[sl]=Phonon: zvok in video
-Comment[sr]=Аудио и видео са Фононом
-Comment[sr at ijekavian]=Аудио и видео са Фононом
-Comment[sr at ijekavianlatin]=Audio i video sa Phononom
-Comment[sr at latin]=Audio i video sa Phononom
-Comment[sv]=Phonon ljud- och video
-Comment[tr]=Phonon Ses ve Görüntü
-Comment[uk]=Звук та відео Phonon
-Comment[x-test]=xxPhonon Audio and Videoxx
-Comment[zh_CN]=Phonon 音频和视频
-Comment[zh_TW]=Phonon 音效和視訊
-X-KDE-Keywords=Sound,Phonon,Audio,Video,Output,Device,Notification,Music,Communication,Media,NMM,GStreamer,Xine
-X-KDE-Keywords[bg]=Sound,Phonon,Audio,Video,Output,Device,Notification,Music,Communication,Media,NMM,GStreamer,Xine,Звук,Видео,Изход,Устройство,Уведомление,Музика,Общуване,Медия
-X-KDE-Keywords[bn]=Sound,Phonon,Audio,Video,Output,Device,Notification,Music,Communication,Media,NMM,GStreamer,Xine
-X-KDE-Keywords[bs]=Sound,Phonon,Audio,Video,Output,Device,Notification,Music,Communication,Media,NMM,GStreamer,Xine,zvuk,izlaz,uređaj,informacija,muzika,komunikacija,mediji
-X-KDE-Keywords[ca]=So,Phonon,Àudio,Vídeo,Sortida,Dispositiu,Notificació,Música,Comunicació,Suport,NMM,GStreamer,Xine
-X-KDE-Keywords[ca at valencia]=So,Phonon,Àudio,Vídeo,Eixida,Dispositiu,Notificació,Música,Comunicació,Suport,NMM,GStreamer,Xine
-X-KDE-Keywords[cs]=Zvuk,Phonon,Audio,Video,Výstup,Zařízení,Upozornění,Hudba,Komunikace,Média,NMM,GStreamer,Xine
-X-KDE-Keywords[da]=Lyd,Phonon,Audio,Video,Output,Enhed,Bekendtgørelse,Musik,Kommunikation,Medie,NMM,GStreamer,Xine,VLC
-X-KDE-Keywords[de]=Klänge,Sound,Phonon,Audio,Video,Ausgabe,Gerät,Benachrichtigung,Notification,Musik,Kommunikation,Media,NMM,GStreamer,Xine
-X-KDE-Keywords[el]=Sound,Phonon,Audio,Video,Output,Device,Notification,Music,Communication,Media,NMM,GStreamer,Xine
-X-KDE-Keywords[en_GB]=Sound,Phonon,Audio,Video,Output,Device,Notification,Music,Communication,Media,NMM,GStreamer,Xine
-X-KDE-Keywords[eo]=Sono,Phonon,Sono,Video,Eligo,Aparato,Atentigo,Muziko,Komunikado,Aŭdvido,NMM,GStreamer,Xine
-X-KDE-Keywords[es]=Sonido,Phonom,Audio,Video,Salida,Dispositivo,Notificación,Música,Comunicación,Media,NMM,GStreamer,Xine
-X-KDE-Keywords[et]=heli,Phonon,audio,video,väljund,seade,märguanne,muusika,suhtlemine,meedia,NMM,GStreamer,Xine
-X-KDE-Keywords[eu]=Soinua,Phonon,Audioa,Bideoa,Irteera,Gailua,Jakinarazpena,Musika,Komunikazioa,Media,NMM,GStreamer,Xine
-X-KDE-Keywords[fi]=Ääni,Phonon,Audio,Video,Ulostulo,Lähtö,Tuloste,Laite,Huomautukset,Huomautus,Ilmoitukset,Ilmoitus,Musiikki,Viestintä,Media,NMM,GStreamer,Xine
-X-KDE-Keywords[fr]=son, phonon, audio, vidéo, sortie, périphérique, notification, musique, communication, média, NMM, GStreamer, Xine
-X-KDE-Keywords[ga]=Fuaim,Phonon,Fís,Aschur,Gléas,Fógairt,Fógra,Ceol,Cumarsáid,Meán,Meáin,NMM,GStreamer,Xine
-X-KDE-Keywords[gl]=Son,Phonon,Audio,Vídeo,Saída,Dispositivo,Notificación,Música,Comunicación,Medio,NMM,GStreamer,Xine
-X-KDE-Keywords[hi]=ध्वनि, फ़ोनॉन, श्रव्य, वीडियो, आउटपुट, डिवाइस, अधिसूचना, संगीत, संचार,मीडिया, NMM, GStreamer, Xine
-X-KDE-Keywords[hu]=Hang,Phonon,Hang,Videó,Kimenet,Eszköz,Értesítés,Zene,Kommunikáció,Média,NMM,GStreamer,Xine
-X-KDE-Keywords[ia]=Sono,Phonon,Audio,Video,Exito,Dispositivo,Notification,Musica,Communication,Medios,NMM,GStreamer,Xine
-X-KDE-Keywords[id]=Suara,Phonon,Audio,Video,Output,Perangkat,Notifikasi,Musik,Komunikasi,Media,NMM,GStreamer,Xine
-X-KDE-Keywords[is]=Hljóð,Phonon,Audio,Vídeó,Úttak,Tæki,Tilkynningar,Tónlist,Samskipti,Miðlar,NMM,GStreamer,Xine
-X-KDE-Keywords[it]=suono,Phonon,audio,video,output,dispositivo,notifica,musica,comunicazione,media,NMM,GStreamer,Xine
-X-KDE-Keywords[kk]=Sound,Phonon,Audio,Video,Output,Device,Notification,Music,Communication,Media,NMM,GStreamer,Xine
-X-KDE-Keywords[km]=សំឡេង Phonon អូឌីយ៉ូ វីដេអូ លទ្ធផល ឧបករណ៍ ការ​ជូនដំណឹង តន្ត្រី ការ​ទាក់ទង មេឌៀ NMM GStreamer Xine
-X-KDE-Keywords[ko]=Sound,Phonon,Audio,Video,Output,Device,Notification,Music,Communication,Media,NMM,GStreamer,Xine,소리,사운드,오디오,비디오,동영상,음악,출력,장치,알림,대화,미디어
-X-KDE-Keywords[lv]=skaņa,phonon,audio,video,izvade,ierīce,paziņojums,mūzika,saziņa,mēdiji,NMM,GStreamer,Xine
-X-KDE-Keywords[mr]=Sound,फोनॉन,Audio,Video,Output,Device,Notification,Music,Communication,Media,NMM,GStreamer,Xine
-X-KDE-Keywords[nb]=Lyd,Phonon,Audio,Video,Utgang,Enhet,Varsling,Musikk,Kommunikasjon,Media,NMM,GStreamer,Xine
-X-KDE-Keywords[nds]=Klang,Phonon,Audio,Video,Utgaav,Reedschap,Bescheed,Musik,Kommunikatschoon,Mediendatei,NMM,GStreamer,Xine
-X-KDE-Keywords[nl]=Geluid,Phonon,audio,video,uitvoer,apparaat,melding,muziek,communicatie,medium,NMM,GStreamer,Xine
-X-KDE-Keywords[nn]=lyd,Phonon,audio,lyd,video,film,utdata,utgang,eining,varsling,musikk,kommunikasjon,media,NMM,GStreamer,Xine
-X-KDE-Keywords[pa]=ਸਾਊਂਡ,ਫੋਨੋਨ,ਆਡੀਓ,ਵਿਡੀਓ,ਵੀਡਿਓ,ਆਉਟਪੁੱਟ,ਜੰਤਰ,ਨੋਟੀਫਿਕੇਸ਼ਨ,ਸੂਚਨਾ,ਸੰਗੀਤ,ਮਿਊਜ਼ਕ,ਕਮਿਊਨੀਕੇਸ਼ਨ,ਸੰਚਾਰ, ਮੀਡਿਆ,NMM,ਜੀਸਟਰੀਮਰ,ਜ਼ਾਇਨ
-X-KDE-Keywords[pl]=Dźwięk,Phonon,Audio,Video,Wyjście,Urządzenie,Powiadomienia,Muzyka,Komunikacja,Multimedia,NMM,GStreamer,Xine
-X-KDE-Keywords[pt]=Som,Phonon,Áudio,Vídeo,Saída,Dispositivo,Notificação,Música,Comunicações,Multimédia,NMM,GStreamer,Xine
-X-KDE-Keywords[pt_BR]=Som,Phonon,Áudio,Vídeo,Saída,Dispositivo,Notificação,Música,Comunicações,Multimídia,NMM,GStreamer,Xine
-X-KDE-Keywords[ro]=sunet,phonon,audio,video,ieșire,dispozitiv,notificare,muzică,comunicare,media,NMM,GStreamer,Xine
-X-KDE-Keywords[ru]=Sound,Phonon,Audio,Video,Output,Device,Notification,Music,Communication,Media,NMM,GStreamer,Xine,звук,аудио,видео,вывод,устройство,уведомления,музыка,связь,общение,медиа
-X-KDE-Keywords[sk]=Zvuk,Phonon,Audio,Video,Output,Zariadenie,Notifikácia,Hudba,Komunikácia,Mádia,NMM,GStreamer,Xine
-X-KDE-Keywords[sl]=zvok,phonon,audio,video,predvajanje,naprava,naprave,obvestila,glasba,komunikacija,igre,snemanje,predstavnost,nmm,gstreamer,xine,vlc
-X-KDE-Keywords[sr]=Sound,Phonon,Audio,Video,Output,Device,Notification,Music,Communication,Media,NMM,GStreamer,Xine,звук,Фонон,аудио,видео,излаз,уређај,обавештење,музика,комуникација,медија,НММ,Гстример,Ксин
-X-KDE-Keywords[sr at ijekavian]=Sound,Phonon,Audio,Video,Output,Device,Notification,Music,Communication,Media,NMM,GStreamer,Xine,звук,Фонон,аудио,видео,излаз,уређај,обавештење,музика,комуникација,медија,НММ,Гстример,Ксин
-X-KDE-Keywords[sr at ijekavianlatin]=Sound,Phonon,Audio,Video,Output,Device,Notification,Music,Communication,Media,NMM,GStreamer,Xine,zvuk,Phonon,audio,video,izlaz,uređaj,obaveštenje,muzika,komunikacija,medija,NMM,GStreamer,Xine
-X-KDE-Keywords[sr at latin]=Sound,Phonon,Audio,Video,Output,Device,Notification,Music,Communication,Media,NMM,GStreamer,Xine,zvuk,Phonon,audio,video,izlaz,uređaj,obaveštenje,muzika,komunikacija,medija,NMM,GStreamer,Xine
-X-KDE-Keywords[sv]=Ljud,Phonon,Video,Utgång,Enhet,Underrättelse,Musik,Kommunikation,Media,NMM,GStreamer,Xine
-X-KDE-Keywords[tg]=Овоз,Phonon,Аудио,Видео,Барориш,Дастгоҳ,Огоҳӣ,Мусиқӣ,Паёмнависӣ,Медиа,NMM,GStreamer,Xine
-X-KDE-Keywords[tr]=Ses,Phonon,Ses,Video,Çıkış,Aygıt,Bildirim,Müzik,İletişim,Ortam,NMM,GStreamer,Xine
-X-KDE-Keywords[ug]=ئاۋاز،Phonon،ئۈن،سىن،چىقىرىش،ئۈسكۈنە،ئۇقتۇرۇش،مۇزىكا،ئالاقە،ۋاسىتە،NMM،GStreamer،Xine
-X-KDE-Keywords[uk]=Sound,Phonon,Audio,Video,Output,Device,Notification,Music,Communication,Media,NMM,GStreamer,Xine,звук,фонон,аудіо,відео,виведення,показ,відтворення,пристрій,сповіщення,музика,спілкування,мультимедіа
-X-KDE-Keywords[vi]=Sound,Phonon,Audio,Video,Output,Device,Notification,Music,Communication,Media,NMM,GStreamer,Xine,âm thanh,phim ảnh,thiết bị,thông báo,nhạc,giao tiếp, phương tiện
-X-KDE-Keywords[wa]=Son,Phonon,Odio,Videyo,rexhowe,éndjin,notifiaedje,muzike,comunicåcion,media,NMM,GStreamer,Xine
-X-KDE-Keywords[x-test]=xxSoundxx,xxPhononxx,xxAudioxx,xxVideoxx,xxOutputxx,xxDevicexx,xxNotificationxx,xxMusicxx,xxCommunicationxx,xxMediaxx,xxNMMxx,xxGStreamerxx,xxXinexx
-X-KDE-Keywords[zh_CN]=Sound,Phonon,Audio,Video,Output,Device,Notification,Music,Communication,Media,NMM,GStreamer,Xine,声音,音效,视频,输出,设备,提醒,音乐,通信,媒体
-X-KDE-Keywords[zh_TW]=Sound,Phonon,Audio,Video,Output,Device,Notification,Music,Communication,Media,NMM,GStreamer,Xine
diff --git a/kcms/phonon/listview-background.png b/kcms/phonon/listview-background.png
deleted file mode 100644
index a4a31840..00000000
Binary files a/kcms/phonon/listview-background.png and /dev/null differ
diff --git a/kcms/phonon/main.cpp b/kcms/phonon/main.cpp
deleted file mode 100644
index 612357c4..00000000
--- a/kcms/phonon/main.cpp
+++ /dev/null
@@ -1,84 +0,0 @@
-/*  This file is part of the KDE project
-    Copyright (C) 2006-2007 Matthias Kretz <kretz at kde.org>
-    Copyright (C) 2010 Colin Guthrie <cguthrie at mandriva.org>
-
-    This program is free software; you can redistribute it and/or
-    modify it under the terms of the GNU Library General Public
-    License as published by the Free Software Foundation; either
-    version 2 of the License, or (at your option) version 3.
-
-    This library is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-    Library General Public License for more details.
-
-    You should have received a copy of the GNU Library General Public License
-    along with this library; see the file COPYING.LIB.  If not, write to
-    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-    Boston, MA 02110-1301, USA.
-*/
-
-#include "main.h"
-
-#include <QTabWidget>
-
-#include <KAboutData>
-#include <KPluginFactory>
-#include <KLocalizedString>
-
-#include "backendselection.h"
-#include "devicepreference.h"
-
-#include "config-workspace.h"
-
-K_PLUGIN_FACTORY(PhononKcmFactory, registerPlugin<PhononKcm>();)
-
-PhononKcm::PhononKcm(QWidget *parent, const QVariantList &args)
-    : KCModule(parent, args)
-{
-    KAboutData *about = new KAboutData(
-            "kcm_phonon", i18n("Phonon Configuration Module"),
-            WORKSPACE_VERSION_STRING, QString(), KAboutLicense::GPL,
-            i18n("Copyright 2006 Matthias Kretz"));
-    about->addAuthor(i18n("Matthias Kretz"), QString(), "kretz at kde.org");
-    about->addAuthor(i18n("Colin Guthrie"), QString(), "colin at mageia.org");
-    setAboutData(about);
-
-    setLayout(new QHBoxLayout);
-    layout()->setContentsMargins(0, 0, 0, 0);
-    layout()->setSpacing(0);
-
-    m_tabs = new QTabWidget(this);
-    layout()->addWidget(m_tabs);
-
-    m_devicePreferenceWidget = new Phonon::DevicePreference(this);
-    m_tabs->addTab(m_devicePreferenceWidget, i18n("Device Preference"));
-    m_backendSelection = new BackendSelection(this);
-    m_tabs->addTab(m_backendSelection, i18n("Backend"));
-
-    load();
-    connect(m_backendSelection, SIGNAL(changed()), SLOT(changed()));
-    connect(m_devicePreferenceWidget, SIGNAL(changed()), SLOT(changed()));
-
-    setButtons( KCModule::Default|KCModule::Apply|KCModule::Help );
-}
-
-void PhononKcm::load()
-{
-    m_devicePreferenceWidget->load();
-    m_backendSelection->load();
-}
-
-void PhononKcm::save()
-{
-    m_devicePreferenceWidget->save();
-    m_backendSelection->save();
-}
-
-void PhononKcm::defaults()
-{
-    m_devicePreferenceWidget->defaults();
-    m_backendSelection->defaults();
-}
-
-#include "main.moc"
diff --git a/kcms/phonon/main.h b/kcms/phonon/main.h
deleted file mode 100644
index 9e07cce6..00000000
--- a/kcms/phonon/main.h
+++ /dev/null
@@ -1,48 +0,0 @@
-/*  This file is part of the KDE project
-    Copyright (C) 2006-2007 Matthias Kretz <kretz at kde.org>
-
-    This program is free software; you can redistribute it and/or
-    modify it under the terms of the GNU Library General Public
-    License as published by the Free Software Foundation; either
-    version 2 of the License, or (at your option) version 3.
-
-    This library is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-    Library General Public License for more details.
-
-    You should have received a copy of the GNU Library General Public License
-    along with this library; see the file COPYING.LIB.  If not, write to
-    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-    Boston, MA 02110-1301, USA.
-*/
-
-#ifndef MAIN_H
-#define MAIN_H
-
-#include <KCModule>
-
-namespace Phonon {
-class DevicePreference;
-}
-class BackendSelection;
-
-class QTabWidget;
-
-class PhononKcm : public KCModule
-{
-    Q_OBJECT
-public:
-    PhononKcm(QWidget *parent, const QVariantList &);
-
-    void load() override;
-    void save() override;
-    void defaults() override;
-
-private:
-    QTabWidget* m_tabs;
-    Phonon::DevicePreference *m_devicePreferenceWidget;
-    BackendSelection *m_backendSelection;
-};
-
-#endif // MAIN_H
diff --git a/plasma-desktop.categories b/plasma-desktop.categories
deleted file mode 100644
index f4316b5a..00000000
--- a/plasma-desktop.categories
+++ /dev/null
@@ -1 +0,0 @@
-org.kde.kcm.phonon kcm module phonon IDENTIFIER [KCM_PHONON_LOG]


More information about the kde-doc-english mailing list