diff --git a/src/scriptengines/qml/CMakeLists.txt b/src/scriptengines/qml/CMakeLists.txt index 76cee98bb..d21c5d2ea 100644 --- a/src/scriptengines/qml/CMakeLists.txt +++ b/src/scriptengines/qml/CMakeLists.txt @@ -43,5 +43,6 @@ target_link_libraries(plasma_appletscript_declarative install(TARGETS plasma_appletscript_declarative DESTINATION ${PLUGIN_INSTALL_DIR}) install(FILES data/plasma-scriptengine-applet-declarative.desktop DESTINATION ${SERVICES_INSTALL_DIR}) +install(FILES data/plasma-wallpaper.desktop DESTINATION ${SERVICES_INSTALL_DIR}) diff --git a/src/scriptengines/qml/data/plasma-wallpaper.desktop b/src/scriptengines/qml/data/plasma-wallpaper.desktop new file mode 100644 index 000000000..7742f1c7a --- /dev/null +++ b/src/scriptengines/qml/data/plasma-wallpaper.desktop @@ -0,0 +1,89 @@ +[Desktop Entry] +Type=ServiceType +X-KDE-ServiceType=Plasma/Wallpaper + +Comment=Plasma wallpaper +Comment[ar]=خلفية شاشة بلازما +Comment[as]=Plasma wallpaper +Comment[ast]=Fondu d'escritoriu de Plasma +Comment[be@latin]=Špalery „Plasma” +Comment[bg]=Тапет за Plasma +Comment[bn]=প্লাসমা ওয়ালপেপার +Comment[bn_IN]=Plasma ওয়াল-পেপার +Comment[bs]=Plazma tapet +Comment[ca]=Fons d'escriptori del Plasma +Comment[ca@valencia]=Fons d'escriptori del Plasma +Comment[cs]=Tapeta Plasma +Comment[da]=Plasma-baggrundsbillede +Comment[de]=Plasma-Hintergrundbild +Comment[el]=Ταπετσαρία plasma +Comment[en_GB]=Plasma wallpaper +Comment[es]=Fondo de escritorio para Plasma +Comment[et]=Plasma taustapilt +Comment[eu]=Plasma horma papera +Comment[fi]=Plasma-taustakuva +Comment[fr]=Fond d'écran Plasma +Comment[fy]=Plasma eftergrûnôfbylding +Comment[ga]=Cúlbhrat Plasma +Comment[gl]=Fondo de escritorio do Plasma +Comment[gu]=પ્લાઝમા વોલપેપર +Comment[he]=תמונת רקע של Plasma +Comment[hi]=प्लाजमा वालपेपर +Comment[hne]=प्लाज्मा वालपेपर +Comment[hr]=Plasmina pozadinska slika +Comment[hsb]=Tapeta za Plasma +Comment[hu]=Plasma háttérkép +Comment[hy]=Պլազմա պաստառ +Comment[ia]=Tapete de papiro de Plasma +Comment[id]=Gambar belakang Plasma +Comment[is]=Plasma veggfóður +Comment[it]=Sfondo Plasma +Comment[ja]=Plasma 壁紙 +Comment[kk]=Plasma тұсқағазы +Comment[km]=ផ្ទាំង​រូបភាព​ប្លាស្មា +Comment[kn]=ಪ್ಲಾಸ್ಮಾ ಹಿನ್ನೆಲೆ ತೆರೆಚಿತ್ರ (ವಾಲ್ ಪೇಪರ್) +Comment[ko]=Plasma 배경 그림 +Comment[ku]=Wêne-rûerdê Plasma +Comment[lt]=Plasma apmušalas +Comment[lv]=Plasma ekrāntapete +Comment[mai]=प्लाजमा वालपेपर +Comment[ml]=പ്ലാസ്മ ചുമര്‍ച്ചിത്രം +Comment[mr]=प्लाज्मा वॉलपेपर +Comment[nb]=Plasma tapet +Comment[nds]=Plasma-Achtergrundbild +Comment[nl]=Plasma-bureaubladachtergrond +Comment[nn]=Plasmabakgrunn +Comment[pa]=ਪਲਾਜ਼ਮਾ ਵਾਲਪੇਪਰ +Comment[pl]=Tapeta Plazmy +Comment[pt]=Papel de parede do Plasma +Comment[pt_BR]=Papel de parede do Plasma +Comment[ro]=Fundal Plasma +Comment[ru]=Обои Plasma +Comment[se]=Plasma-duogášgovva +Comment[si]=Plasma පසුබිම්රූප +Comment[sk]=Tapeta Plasma +Comment[sl]=Slika ozadja za Plasmo +Comment[sq]=Tapetat plazma +Comment[sr]=Плазма тапет +Comment[sr@ijekavian]=Плазма тапет +Comment[sr@ijekavianlatin]=Plasma tapet +Comment[sr@latin]=Plasma tapet +Comment[sv]=Plasma skrivbordsunderlägg +Comment[ta]=பிளாஸ்மா திரைபின்னணி +Comment[tg]=Тасвири заминаи Plasma +Comment[th]=ภาพพื้นหลังของพลาสมา +Comment[tr]=Plasma duvar kağıdı +Comment[tt]=Плазма обое +Comment[ug]=Plasma تام قەغىزى +Comment[uk]=Тло стільниці Плазми +Comment[vi]=Hình nền Plasma +Comment[wa]=Tapisreye di Plasma +Comment[x-test]=xxPlasma wallpaperxx +Comment[zh_CN]=Plasma 壁纸 +Comment[zh_TW]=Plasma 桌布 + +[PropertyDef::X-Plasma-FormFactors] +Type=QStringList + +[PropertyDef::X-Plasma-DropMimeTypes] +Type=QStringList diff --git a/src/scriptengines/qml/plasmoid/containmentinterface.cpp b/src/scriptengines/qml/plasmoid/containmentinterface.cpp index 0fdb3936a..f31ad4fa4 100644 --- a/src/scriptengines/qml/plasmoid/containmentinterface.cpp +++ b/src/scriptengines/qml/plasmoid/containmentinterface.cpp @@ -402,13 +402,14 @@ void ContainmentInterface::mimeTypeRetrieved(KIO::Job *job, const QString &mimet appletList << Plasma::PluginLoader::self()->listAppletInfoForMimeType(mimetype); KPluginInfo::List wallpaperList; //TODO: how restore wallpaper dnd? - /*if (drawWallpaper) { - if (wallpaper && wallpaper->supportsMimetype(mimetype)) { - wallpaperList << wallpaper->d->wallpaperDescription; + + if (drawWallpaper()) { + if (m_wallpaperInterface && m_wallpaperInterface->supportsMimetype(mimetype)) { + wallpaperList << m_wallpaperInterface->package().metadata(); } else { - wallpaperList = Wallpaper::listWallpaperInfoForMimetype(mimetype); + wallpaperList = WallpaperInterface::listWallpaperInfoForMimetype(mimetype); } - }*/ + } if (!appletList.isEmpty() || !wallpaperList.isEmpty()) { choices->clear(); @@ -426,7 +427,7 @@ void ContainmentInterface::mimeTypeRetrieved(KIO::Job *job, const QString &mimet actionsToApplets.insert(action, info.pluginName()); qDebug() << info.pluginName(); } - actionsToApplets.insert(choices->addAction(i18n("Icon")), "icon"); + actionsToApplets.insert(choices->addAction(i18n("Icon")), "org.kde.icon"); QHash actionsToWallpapers; if (!wallpaperList.isEmpty()) { @@ -462,17 +463,9 @@ void ContainmentInterface::mimeTypeRetrieved(KIO::Job *job, const QString &mimet if (plugin.isEmpty()) { //set wallpapery stuff plugin = actionsToWallpapers.value(choice); - //TODO: wallpapers - /* - if (!wallpaper || plugin != wallpaper->pluginName()) { - qDebug() << "Wallpaper dropped:" << tjob->url(); - q->setWallpaper(plugin); + if (m_wallpaperInterface && tjob->url().isValid()) { + m_wallpaperInterface->setUrl(tjob->url()); } - - if (wallpaper) { - qDebug() << "Wallpaper dropped:" << tjob->url(); - wallpaper->setUrls(KUrl::List() << tjob->url()); - }*/ } else { addApplet(actionsToApplets[choice], args, posi); } @@ -482,7 +475,7 @@ void ContainmentInterface::mimeTypeRetrieved(KIO::Job *job, const QString &mimet } } else { // we can at least create an icon as a link to the URL - addApplet("icon", args, posi); + addApplet("org.kde.icon", args, posi); } } diff --git a/src/scriptengines/qml/plasmoid/wallpaperinterface.cpp b/src/scriptengines/qml/plasmoid/wallpaperinterface.cpp index 31931c66d..4004bd094 100644 --- a/src/scriptengines/qml/plasmoid/wallpaperinterface.cpp +++ b/src/scriptengines/qml/plasmoid/wallpaperinterface.cpp @@ -24,6 +24,8 @@ #include #include +#include +#include #include #include @@ -55,6 +57,17 @@ WallpaperInterface::WallpaperInterface(ContainmentInterface *parent) WallpaperInterface::~WallpaperInterface() {} +KPluginInfo::List WallpaperInterface::listWallpaperInfoForMimetype(const QString &mimetype, const QString &formFactor) +{ + QString constraint = QString("'%1' in [X-Plasma-DropMimeTypes]").arg(mimetype); + if (!formFactor.isEmpty()) { + constraint.append("[X-Plasma-FormFactors] ~~ '").append(formFactor).append("'"); + } + + KService::List offers = KServiceTypeTrader::self()->query("Plasma/Wallpaper", constraint); + qDebug() << offers.count() << constraint; + return KPluginInfo::fromServices(offers); +} Plasma::Package WallpaperInterface::package() const { @@ -100,7 +113,7 @@ void WallpaperInterface::syncWallpaperPackage() } m_actions->clear(); - m_pkg = Plasma::PluginLoader::self()->loadPackage("Plasma/QmlWallpaper"); + m_pkg = Plasma::PluginLoader::self()->loadPackage("Plasma/Wallpaper"); m_pkg.setPath(m_wallpaperPlugin); m_configLoader->deleteLater(); @@ -145,6 +158,20 @@ QList WallpaperInterface::contextualActions() const return m_actions->actions(); } +bool WallpaperInterface::supportsMimetype(const QString &mimetype) const +{ + //FIXME: a less brutal way? packages should have valid KService :/ + KDesktopFile desktop(m_pkg.path() + "/" + "metadata.desktop"); + return desktop.desktopGroup().readEntry("X-Plasma-DropMimeTypes", QStringList()).contains(mimetype); +} + +void WallpaperInterface::setUrl(const QUrl &url) +{ + if (m_qmlObject->rootObject()) { + QMetaObject::invokeMethod(m_qmlObject->rootObject(), QString("setUrl").toLatin1(), Qt::DirectConnection, Q_ARG(QVariant, QVariant::fromValue(url))); + } +} + void WallpaperInterface::setAction(const QString &name, const QString &text, const QString &icon, const QString &shortcut) { QAction *action = m_actions->action(name); diff --git a/src/scriptengines/qml/plasmoid/wallpaperinterface.h b/src/scriptengines/qml/plasmoid/wallpaperinterface.h index 45c93fcd3..8ff437fb0 100644 --- a/src/scriptengines/qml/plasmoid/wallpaperinterface.h +++ b/src/scriptengines/qml/plasmoid/wallpaperinterface.h @@ -46,6 +46,15 @@ public: WallpaperInterface(ContainmentInterface *parent = 0); ~WallpaperInterface(); + /** + * Returns a list of all known wallpapers that can accept the given mimetype + * @param mimetype the mimetype to search for + * @param formFactor the format of the wallpaper being search for (e.g. desktop) + * @return list of wallpapers + */ + static KPluginInfo::List listWallpaperInfoForMimetype(const QString &mimetype, + const QString &formFactor = QString()); + Plasma::Package package() const; ConfigPropertyMap *configuration() const; @@ -54,6 +63,10 @@ public: QList contextualActions() const; + bool supportsMimetype(const QString &mimetype) const; + + void setUrl(const QUrl &urls); + Q_INVOKABLE void setAction(const QString &name, const QString &text, const QString &icon = QString(), const QString &shortcut = QString()); diff --git a/src/shell/containmentconfigview.cpp b/src/shell/containmentconfigview.cpp index 7872578a5..4a64c8e12 100644 --- a/src/shell/containmentconfigview.cpp +++ b/src/shell/containmentconfigview.cpp @@ -52,7 +52,7 @@ ContainmentConfigView::ContainmentConfigView(Plasma::Containment *cont, QWindow engine()->rootContext()->setContextProperty("configDialog", this); setCurrentWallpaper(cont->containment()->wallpaper()); - Plasma::Package pkg = Plasma::PluginLoader::self()->loadPackage("Plasma/QmlWallpaper"); + Plasma::Package pkg = Plasma::PluginLoader::self()->loadPackage("Plasma/Wallpaper"); pkg.setPath(m_containment->wallpaper()); QFile file(pkg.filePath("config", "main.xml")); KConfigGroup cfg = m_containment->config(); diff --git a/src/shell/shellpluginloader.cpp b/src/shell/shellpluginloader.cpp index 49420352c..d863efbcb 100644 --- a/src/shell/shellpluginloader.cpp +++ b/src/shell/shellpluginloader.cpp @@ -38,7 +38,7 @@ Plasma::Package ShellPluginLoader::internalLoadPackage(const QString &packageFor if (packageFormat.endsWith("/LookAndFeel")) { Plasma::PackageStructure *structure = new LookAndFeelPackage(); return Plasma::Package(structure); - } else if (packageFormat.endsWith("/QmlWallpaper")) { + } else if (packageFormat.endsWith("/Wallpaper")) { Plasma::PackageStructure *structure = new QmlWallpaperPackage(); return Plasma::Package(structure); } else {