Commit cf0f5b5e authored by David Rosca's avatar David Rosca

New Desktop Theme KCM

Differential Revision: https://phabricator.kde.org/D1113
parent 98873732
# KI18N Translation Domain for this library
add_definitions(-DTRANSLATION_DOMAIN=\"kcm_desktopthemedetails\")
add_definitions(-DTRANSLATION_DOMAIN=\"kcm_desktoptheme\")
set(kcmdesktoptheme_SRCS kcmdesktoptheme.cpp thememodel.cpp)
ki18n_wrap_ui(kcmdesktoptheme_SRCS DesktopTheme.ui)
add_library(kcm_desktoptheme MODULE ${kcmdesktoptheme_SRCS})
target_link_libraries(kcm_desktoptheme ${X11_LIBRARIES}
KF5::Archive
KF5::KCMUtils
KF5::I18n
KF5::Parts
KF5::Plasma
KF5::NewStuff
set(kcm_desktoptheme_SRCS
kcm.cpp
)
kcoreaddons_desktop_to_json(kcm_desktoptheme desktoptheme.desktop)
add_library(kcm_desktoptheme MODULE ${kcm_desktoptheme_SRCS})
target_link_libraries(kcm_desktoptheme
KF5::CoreAddons
KF5::KCMUtils
KF5::I18n
KF5::Plasma
KF5::Declarative
KF5::QuickAddons
KF5::NewStuff
)
install(TARGETS kcm_desktoptheme DESTINATION ${PLUGIN_INSTALL_DIR} )
install( FILES plasma-themes.knsrc DESTINATION ${CONFIG_INSTALL_DIR} )
kcoreaddons_desktop_to_json(kcm_desktoptheme "kcm_desktoptheme.desktop")
########### install files ###############
install( FILES desktoptheme.desktop DESTINATION ${SERVICES_INSTALL_DIR} )
#this desktop file is installed only for retrocompatibility with sycoca
install(FILES kcm_desktoptheme.desktop DESTINATION ${SERVICES_INSTALL_DIR})
install(TARGETS kcm_desktoptheme DESTINATION ${PLUGIN_INSTALL_DIR}/kcms)
kpackage_install_package(package kcm_desktoptheme kcms)
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>DesktopTheme</class>
<widget class="QWidget" name="DesktopTheme">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>669</width>
<height>460</height>
</rect>
</property>
<layout class="QGridLayout" name="gridLayout_2">
<item row="1" column="1">
<widget class="QListView" name="m_theme"/>
</item>
<item row="2" column="1">
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>462</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="m_fileInstallButton">
<property name="text">
<string>Insta&amp;ll from File</string>
</property>
<property name="icon">
<iconset theme="document-open">
<normaloff>.</normaloff>.</iconset>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="m_newThemeButton">
<property name="enabled">
<bool>true</bool>
</property>
<property name="text">
<string>Get New Themes...</string>
</property>
<property name="icon">
<iconset theme="document-open-remote">
<normaloff>.</normaloff>.</iconset>
</property>
</widget>
</item>
</layout>
</item>
<item row="0" column="1">
<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>
#! /bin/sh
$EXTRACTRC *.ui >> rc.cpp
$XGETTEXT *.cpp -o $podir/kcm_desktopthemedetails.pot
#! /usr/bin/env bash
$EXTRACTRC `find . -name "*.ui"` >> rc.cpp || exit 11
$XGETTEXT `find . -name "*.cpp" -o -name "*.qml"` -o $podir/kcm_desktoptheme.pot
rm -f rc.cpp
[Desktop Entry]
Exec=kcmshell5 desktoptheme
Icon=preferences-desktop
Type=Service
X-KDE-ServiceTypes=KCModule
X-KDE-Library=kcm_desktoptheme
X-KDE-ParentApp=kcontrol
X-KDE-System-Settings-Parent-Category=workspacetheme
X-DocPath=kcontrol/desktopthemedetails/index.html
X-KDE-Weight=40
Name=Desktop Theme
Name[ar]=سمة سطح المكتب
Name[ast]=Tema d'escritoriu
Name[bg]=Тема за работния плот
Name[bn]=ডেস্কটপ থীম
Name[bs]=Tema površi
Name[ca]=Tema d'escriptori
Name[ca@valencia]=Tema d'escriptori
Name[cs]=Motiv plochy
Name[da]=Skrivebordstema
Name[de]=Arbeitsflächen-Design
Name[el]=Θέμα επιφάνειας εργασίας
Name[en_GB]=Desktop Theme
Name[es]=Tema de escritorio
Name[et]=Töölauateema
Name[eu]=Mahaigaineko gaia
Name[fi]=Työpöytäteema
Name[fr]=Thème de bureau
Name[ga]=Téama Deisce
Name[gl]=Tema do escritorio
Name[gu]=ડેસ્કટોપ થીમ
Name[he]=ערכת־הנושא לשולחן־העבודה
Name[hi]=डेस्कटॉप प्रसंग
Name[hr]=Tema radne površine
Name[hu]=Asztali téma
Name[ia]=Thema de scriptorio
Name[id]=Tema Desktop
Name[is]=Skjáborðsþema
Name[it]=Tema del desktop
Name[ja]=デスクトップテーマ
Name[kk]=Үстел нақышы
Name[km]=ស្បែក​ផ្ទៃតុ
Name[kn]=ಗಣಕತೆರೆ ಪರಿಸರವಿನ್ಯಾಸ
Name[ko]=데스크톱 테마
Name[lt]=Darbalaukio apipavidalinimas
Name[lv]=Darbvirsmas tēma
Name[mr]=डेस्कटॉप शैली
Name[nb]=Skrivebordstema
Name[nds]=Schriefdischmuster
Name[nl]=Bureaubladthema
Name[nn]=Skrivebordstema
Name[pa]=ਡੈਸਕਟਾਪ ਥੀਮ
Name[pl]=Wystrój pulpitu
Name[pt]=Tema do Ambiente de Trabalho
Name[pt_BR]=Tema da área de trabalho
Name[ro]=Tematica de birou
Name[ru]=Тема рабочего стола
Name[si]=වැඩතල තේමාව
Name[sk]=Téma plochy
Name[sl]=Namizna tema
Name[sr]=Тема површи
Name[sr@ijekavian]=Тема површи
Name[sr@ijekavianlatin]=Tema površi
Name[sr@latin]=Tema površi
Name[sv]=Skrivbordstema
Name[tg]=Мавзӯъи мизи корӣ
Name[th]=ชุดตกแต่งพื้นที่ทำงาน
Name[tr]=Masaüstü Teması
Name[ug]=ئۈستەلئۈستى ئۆرنىكى
Name[uk]=Тема стільниці
Name[vi]=Sắc thái màn hình
Name[wa]=Tinme do scribanne
Name[x-test]=xxDesktop Themexx
Name[zh_CN]=桌面主题
Name[zh_TW]=桌面主題
Comment=Desktop Theme
Comment[ar]=سمة سطح المكتب
Comment[ast]=Tema d'escritoriu
Comment[bs]=Tema radne površine
Comment[ca]=Tema d'escriptori
Comment[ca@valencia]=Tema d'escriptori
Comment[cs]=Motiv plochy
Comment[da]=Skrivebordstema
Comment[de]=Arbeitsflächen-Design
Comment[el]=Θέμα επιφάνειας εργασίας
Comment[en_GB]=Desktop Theme
Comment[es]=Tema de escritorio
Comment[et]=Töölauateema
Comment[fi]=Työpöytäteema
Comment[fr]=Thème de bureau
Comment[gl]=Tema do escritorio
Comment[hu]=Asztali téma
Comment[id]=Tema Desktop
Comment[is]=Skjáborðsþema
Comment[it]=Tema del desktop
Comment[ja]=デスクトップテーマ
Comment[ko]=데스크톱 테마
Comment[lt]=Darbalaukio apipavidalinimas
Comment[mr]=डेस्कटॉप शैली
Comment[nb]=Skrivebordstema
Comment[nds]=Schriefdischmuster
Comment[nl]=Bureaubladthema
Comment[nn]=Skrivebordstema
Comment[pa]=ਡੈਸਕਟਾਪ ਥੀਮ
Comment[pl]=Wystrój pulpitu
Comment[pt]=Tema do Ambiente de Trabalho
Comment[pt_BR]=Tema da área de trabalho
Comment[ru]=Тема рабочего стола
Comment[sk]=Téma plochy
Comment[sl]=Namizna tema
Comment[sr]=Тема површи
Comment[sr@ijekavian]=Тема површи
Comment[sr@ijekavianlatin]=Tema površi
Comment[sr@latin]=Tema površi
Comment[sv]=Skrivbordstema
Comment[tr]=Masaüstü Teması
Comment[uk]=Тема стільниці
Comment[x-test]=xxDesktop Themexx
Comment[zh_CN]=桌面主题
Comment[zh_TW]=桌面主題
X-KDE-Keywords=Desktop Theme
X-KDE-Keywords[ar]=سمة سطح المكتب
X-KDE-Keywords[ast]=Tema d'escritoriu
X-KDE-Keywords[bs]=Tema površi
X-KDE-Keywords[ca]=Tema d'escriptori
X-KDE-Keywords[ca@valencia]=Tema d'escriptori
X-KDE-Keywords[cs]=Motiv plochy
X-KDE-Keywords[da]=Skrivebordstema
X-KDE-Keywords[de]=Arbeitsflächen-Design
X-KDE-Keywords[el]=Θέμα επιφάνειας εργασίας
X-KDE-Keywords[en_GB]=Desktop Theme
X-KDE-Keywords[es]=Tema de escritorio
X-KDE-Keywords[et]=Töölauateema
X-KDE-Keywords[eu]=Mahaigaineko gaia
X-KDE-Keywords[fi]=Työpöytäteema
X-KDE-Keywords[fr]=Thème du bureau
X-KDE-Keywords[ga]=Téama Deisce
X-KDE-Keywords[gl]=Tema do escritorio
X-KDE-Keywords[he]=ערכת־הנושא
X-KDE-Keywords[hu]=Asztali téma
X-KDE-Keywords[ia]=Thema de scriptorio
X-KDE-Keywords[id]=Tema Desktop
X-KDE-Keywords[is]=Skjáborðsþema
X-KDE-Keywords[it]=Tema del desktop
X-KDE-Keywords[ja]=デスクトップテーマ
X-KDE-Keywords[kk]=Desktop Theme,Үстел нақышы
X-KDE-Keywords[km]=រូបរាង​ផ្ទៃតុ
X-KDE-Keywords[ko]=데스크톱 테마
X-KDE-Keywords[lt]=Darbalaukio apipavidalinimas
X-KDE-Keywords[mr]=डेस्कटॉप शैली
X-KDE-Keywords[nb]=Skrivebordstema
X-KDE-Keywords[nds]=Schriefdischmuster
X-KDE-Keywords[nl]=Bureaubladthema
X-KDE-Keywords[nn]=Skrivebordstema
X-KDE-Keywords[pa]=ਡੈਸਕਟਾਪ ਥੀਮ
X-KDE-Keywords[pl]=Wystrój pulpitu
X-KDE-Keywords[pt]=Tema do Ambiente de Trabalho
X-KDE-Keywords[pt_BR]=Tema da área de trabalho
X-KDE-Keywords[ro]=Tematica de birou
X-KDE-Keywords[ru]=Тема рабочего стола
X-KDE-Keywords[sk]=Téma plochy
X-KDE-Keywords[sl]=Namizna tema
X-KDE-Keywords[sr]=Desktop Theme,тема површи
X-KDE-Keywords[sr@ijekavian]=Desktop Theme,тема површи
X-KDE-Keywords[sr@ijekavianlatin]=Desktop Theme,tema površi
X-KDE-Keywords[sr@latin]=Desktop Theme,tema površi
X-KDE-Keywords[sv]=Skrivbordstema
X-KDE-Keywords[tr]=Masaüstü Teması
X-KDE-Keywords[ug]=ئۈستەلئۈستى ئۆرنىكى
X-KDE-Keywords[uk]=тема,стільниця
X-KDE-Keywords[vi]=Sắc thái màn hình
X-KDE-Keywords[x-test]=xxDesktop Themexx
X-KDE-Keywords[zh_CN]=Desktop Theme,桌面主题
X-KDE-Keywords[zh_TW]=Desktop Theme
/* This file is part of the KDE Project
Copyright (c) 2014 Marco Martin <mart@kde.org>
Copyright (c) 2014 Vishesh Handa <me@vhanda.in>
Copyright (c) 2016 David Rosca <nowrep@gmail.com>
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License version 2 as published by the Free Software Foundation.
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 "kcm.h"
#include <KPluginFactory>
#include <KAboutData>
#include <KSharedConfig>
#include <KLocalizedString>
#include <KDesktopFile>
#include <Plasma/Theme>
#include <Plasma/Svg>
#include <QDebug>
#include <QProcess>
#include <QQuickItem>
#include <QStandardPaths>
#include <QStandardItemModel>
#include <KNewStuff3/KNS3/DownloadDialog>
Q_LOGGING_CATEGORY(KCM_DESKTOP_THEME, "kcm_desktoptheme")
K_PLUGIN_FACTORY_WITH_JSON(KCMDesktopThemeFactory, "kcm_desktoptheme.json", registerPlugin<KCMDesktopTheme>();)
KCMDesktopTheme::KCMDesktopTheme(QObject *parent, const QVariantList &args)
: KQuickAddons::ConfigModule(parent, args)
, m_defaultTheme(new Plasma::Theme(this))
{
//This flag seems to be needed in order for QQuickWidget to work
//see https://bugreports.qt-project.org/browse/QTBUG-40765
//also, it seems to work only if set in the kcm, not in the systemsettings' main
qApp->setAttribute(Qt::AA_DontCreateNativeWidgetSiblings);
qmlRegisterType<QStandardItemModel>();
KAboutData* about = new KAboutData(QStringLiteral("kcm_desktoptheme"), i18n("Configure Desktop Theme"),
QStringLiteral("0.1"), QString(), KAboutLicense::LGPL);
about->addAuthor(i18n("David Rosca"), QString(), QStringLiteral("nowrep@gmail.com"));
setAboutData(about);
setButtons(Apply | Default);
m_model = new QStandardItemModel(this);
QHash<int, QByteArray> roles = m_model->roleNames();
roles[PluginNameRole] = QByteArrayLiteral("pluginName");
roles[ThemeNameRole] = QByteArrayLiteral("themeName");
roles[IsLocalRole] = QByteArrayLiteral("isLocal");
m_model->setItemRoleNames(roles);
}
KCMDesktopTheme::~KCMDesktopTheme()
{
delete m_defaultTheme;
}
QStandardItemModel *KCMDesktopTheme::desktopThemeModel() const
{
return m_model;
}
QString KCMDesktopTheme::selectedPlugin() const
{
return m_selectedPlugin;
}
void KCMDesktopTheme::setSelectedPlugin(const QString &plugin)
{
if (m_selectedPlugin == plugin) {
return;
}
m_selectedPlugin = plugin;
Q_EMIT selectedPluginChanged(m_selectedPlugin);
updateNeedsSave();
}
void KCMDesktopTheme::getNewThemes()
{
KNS3::DownloadDialog *dialog = new KNS3::DownloadDialog(QStringLiteral("plasma-themes.knsrc"));
dialog->open();
connect(dialog, &QDialog::done, this, [this, dialog]() {
if (!dialog->changedEntries().isEmpty()) {
load();
}
});
}
void KCMDesktopTheme::installThemeFromFile(const QUrl &file)
{
qCDebug(KCM_DESKTOP_THEME) << "Installing ... " << file;
QString program = QStringLiteral("plasmapkg2");
QStringList arguments;
arguments << QStringLiteral("-t") << QStringLiteral("theme") << QStringLiteral("-i") << file.toLocalFile();
qCDebug(KCM_DESKTOP_THEME) << program << arguments.join(QStringLiteral(" "));
QProcess *myProcess = new QProcess(this);
connect(myProcess, static_cast<void (QProcess::*)(int, QProcess::ExitStatus)>(&QProcess::finished),
this, [this](int exitCode, QProcess::ExitStatus exitStatus) {
Q_UNUSED(exitStatus);
if (exitCode == 0) {
qCDebug(KCM_DESKTOP_THEME) << "Theme installed successfully :)";
load();
Q_EMIT showInfoMessage(i18n("Theme installed successfully."));
} else {
qCWarning(KCM_DESKTOP_THEME) << "Theme installation failed." << exitCode;
Q_EMIT showInfoMessage(i18n("Theme installation failed."));
}
});
connect(myProcess, static_cast<void (QProcess::*)(QProcess::ProcessError)>(&QProcess::error),
this, [this](QProcess::ProcessError e) {
qCWarning(KCM_DESKTOP_THEME) << "Theme installation failed: " << e;
Q_EMIT showInfoMessage(i18n("Theme installation failed."));
});
myProcess->start(program, arguments);
}
void KCMDesktopTheme::removeTheme(const QString &name)
{
Q_ASSERT(!m_pendingRemoval.contains(name));
Q_ASSERT(!m_model->findItems(name).isEmpty());
m_pendingRemoval.append(name);
m_model->removeRow(m_model->findItems(name).at(0)->row());
updateNeedsSave();
}
void KCMDesktopTheme::applyPlasmaTheme(QQuickItem *item, const QString &themeName)
{
if (!item) {
return;
}
Plasma::Theme *theme = m_themes[themeName];
if (!theme) {
theme = new Plasma::Theme(themeName, this);
m_themes[themeName] = theme;
}
Q_FOREACH (Plasma::Svg *svg, item->findChildren<Plasma::Svg*>()) {
svg->setTheme(theme);
svg->setUsingRenderingCache(false);
}
}
void KCMDesktopTheme::load()
{
m_pendingRemoval.clear();
// Get all desktop themes
QStringList themes;
const QStringList &packs = QStandardPaths::locateAll(QStandardPaths::GenericDataLocation, QStringLiteral("plasma/desktoptheme"), QStandardPaths::LocateDirectory);
Q_FOREACH (const QString &ppath, packs) {
const QDir cd(ppath);
const QStringList &entries = cd.entryList(QDir::Dirs | QDir::Hidden | QDir::NoDotAndDotDot);
Q_FOREACH (const QString &pack, entries) {
const QString _metadata = ppath + QLatin1Char('/') + pack + QStringLiteral("/metadata.desktop");
if (QFile::exists(_metadata)) {
themes << _metadata;
}
}
}
m_model->clear();
Q_FOREACH (const QString &theme, themes) {
int themeSepIndex = theme.lastIndexOf('/', -1);
const QString themeRoot = theme.left(themeSepIndex);
int themeNameSepIndex = themeRoot.lastIndexOf('/', -1);
const QString packageName = themeRoot.right(themeRoot.length() - themeNameSepIndex - 1);
KDesktopFile df(theme);
if (df.noDisplay()) {
continue;
}
QString name = df.readName();
if (name.isEmpty()) {
name = packageName;
}
const bool isLocal = QFileInfo(theme).isWritable();
if (m_model->findItems(packageName).isEmpty()) {
QStandardItem *item = new QStandardItem;
item->setText(packageName);
item->setData(packageName, PluginNameRole);
item->setData(name, ThemeNameRole);
item->setData(isLocal, IsLocalRole);
m_model->appendRow(item);
}
}
KConfigGroup cg(KSharedConfig::openConfig(QStringLiteral("plasmarc")), "Theme");
setSelectedPlugin(cg.readEntry("name", m_defaultTheme->themeName()));
updateNeedsSave();
}
void KCMDesktopTheme::save()
{
if (m_defaultTheme->themeName() == m_selectedPlugin) {
return;
}
m_defaultTheme->setThemeName(m_selectedPlugin);
removeThemes();
updateNeedsSave();
}
void KCMDesktopTheme::defaults()
{
setSelectedPlugin(QStringLiteral("default"));
}
void KCMDesktopTheme::updateNeedsSave()
{
setNeedsSave(!m_pendingRemoval.isEmpty() || m_selectedPlugin != m_defaultTheme->themeName());
}
void KCMDesktopTheme::removeThemes()
{
const QString program = QStringLiteral("plasmapkg2");
Q_FOREACH (const QString &name, m_pendingRemoval) {
const QStringList arguments = {QStringLiteral("-t"), QStringLiteral("theme"), QStringLiteral("-r"), name};
qCDebug(KCM_DESKTOP_THEME) << program << arguments.join(QStringLiteral(" "));
QProcess *process = new QProcess(this);
connect(process, static_cast<void (QProcess::*)(int, QProcess::ExitStatus)>(&QProcess::finished),
this, [this, process](int exitCode, QProcess::ExitStatus exitStatus) {
Q_UNUSED(exitStatus);
if (exitCode == 0) {
qCDebug(KCM_DESKTOP_THEME) << "Theme removed successfully :)";
load();
} else {
qCWarning(KCM_DESKTOP_THEME) << "Theme removal failed." << exitCode;
Q_EMIT showInfoMessage(i18n("Theme removal failed."));
}
process->deleteLater();
});
connect(process, static_cast<void (QProcess::*)(QProcess::ProcessError)>(&QProcess::error),
this, [this, process](QProcess::ProcessError e) {
qCWarning(KCM_DESKTOP_THEME) << "Theme removal failed: " << e;
Q_EMIT showInfoMessage(i18n("Theme removal failed."));
process->deleteLater();
});
process->start(program, arguments);
}
}
#include "kcm.moc"
/*
Copyright (c) 2014 Marco Martin <mart@kde.org>
Copyright (c) 2014 Vishesh Handa <me@vhanda.in>
Copyright (c) 2016 David Rosca <nowrep@gmail.com>
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License version 2 as published by the Free Software Foundation.
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 _KCM_DESKTOPTHEME_H
#define _KCM_DESKTOPTHEME_H
#include <KQuickAddons/ConfigModule>
namespace Plasma {
class Svg;
class Theme;
}
class QStandardItemModel;
class KCMDesktopTheme : public KQuickAddons::ConfigModule
{
Q_OBJECT
Q_PROPERTY(QStandardItemModel *desktopThemeModel READ desktopThemeModel CONSTANT)
Q_PROPERTY(QString selectedPlugin READ selectedPlugin WRITE setSelectedPlugin NOTIFY selectedPluginChanged)
public:
enum Roles {
PluginNameRole = Qt::UserRole + 1,
ThemeNameRole,
IsLocalRole
};
Q_ENUM(Roles)
KCMDesktopTheme(QObject *parent, const QVariantList &args);
~KCMDesktopTheme();
QStandardItemModel *desktopThemeModel() const;
QString selectedPlugin() const;
void setSelectedPlugin(const QString &plugin);
Q_INVOKABLE void getNewThemes();
Q_INVOKABLE void installThemeFromFile(const QUrl &file);
Q_INVOKABLE void removeTheme(const QString &name);
Q_INVOKABLE void applyPlasmaTheme(QQuickItem *item, const QString &themeName);
Q_SIGNALS:
void selectedPluginChanged(const QString &plugin);
void showInfoMessage(const QString &infoMessage);
public Q_SLOTS:
void load();