On Tuesday 27 October 2009 17:19:24 Aaron J. Seigo wrote: > On October 27, 2009, Sebastian Kügler wrote: > > Is this something I should pursue? It sounds simple enough ... > > sure; i don't see any downside to it and the results could be interesting; > worst case is we'd have a failed experimnt on our hands and one more way > not to do it (in the words of Edison ;) but i think this could work out > very well..
The attached patch seems to work. I've not really tested it, just confirmed that it works at least in one case (emailmessage, added X-Plasma-DropUrlPatterns=akonadi:* to its desktop file) -- it's late and I should sleep. If it's conceptually OK, I'll clean it up and submit it to review board. Cheers, -- sebas http://www.kde.org | http://vizZzion.org | GPG Key ID: 9119 0EF9
Index: applet.h =================================================================== --- applet.h (revision 1041410) +++ applet.h (working copy) @@ -306,6 +306,13 @@ static KPluginInfo::List listAppletInfoForMimetype(const QString &mimetype); /** + * Returns a list of all known applets associated with a certain URL. + * + * @return list of applets + **/ + static KPluginInfo::List listAppletInfoForUrl(const QUrl &url); + + /** * Returns a list of all the categories used by installed applets. * * @param parentApp the application to filter applets on. Uses the Index: applet.cpp =================================================================== --- applet.cpp (revision 1041410) +++ applet.cpp (working copy) @@ -37,6 +37,7 @@ #include <QList> #include <QGraphicsLinearLayout> #include <QPainter> +#include <QRegExp> #include <QSize> #include <QStyleOptionGraphicsItem> #include <QTextDocument> @@ -2074,6 +2075,32 @@ return KPluginInfo::fromServices(offers); } +KPluginInfo::List Applet::listAppletInfoForUrl(const QUrl &url) +{ + QString constraint; + //kDebug() << "listAppletInfoForMimetype with" << mimetype << constraint; + KService::List offers = KServiceTypeTrader::self()->query("Plasma/Applet", constraint); + offers << KServiceTypeTrader::self()->query("Plasma/PopupApplet", constraint); + + KPluginInfo::List allApplets = KPluginInfo::fromServices(offers); + KPluginInfo::List filtered; + foreach (const KPluginInfo &info, allApplets) { + kDebug() << "=========>URL" << info.name() << info.property("X-Plasma-DropUrlPatterns").toStringList(); + QStringList urlPatterns = info.property("X-Plasma-DropUrlPatterns").toStringList(); + foreach (const QString &glob, urlPatterns) { + QRegExp rx(glob); + rx.setPatternSyntax(QRegExp::Wildcard); + if (rx.exactMatch(url.toString())) { + kDebug() << "showing (match) ..." << glob << url; + filtered << info; + } else { + kDebug() << "No Match:" << glob << url; + } + } + } + return filtered; +} + QStringList Applet::listCategories(const QString &parentApp, bool visibleOnly) { QString constraint = "exist [X-KDE-PluginInfo-Category]"; Index: private/containment_p.h =================================================================== --- private/containment_p.h (revision 1041410) +++ private/containment_p.h (working copy) @@ -161,6 +161,7 @@ Containment::Type type; QHash<KJob*, QPointF> dropPoints; QHash<KJob*, KMenu*> dropMenus; + QHash<KJob*, KPluginInfo::List> dropPlugins; QTimer *showDropZoneDelayTimer; bool drawWallpaper; }; Index: data/servicetypes/plasma-applet.desktop =================================================================== --- data/servicetypes/plasma-applet.desktop (revision 1041410) +++ data/servicetypes/plasma-applet.desktop (working copy) @@ -76,6 +76,9 @@ [PropertyDef::X-Plasma-DropMimeTypes] Type=QStringList +[PropertyDef::X-Plasma-DropUrlPatterns] +Type=QStringList + [PropertyDef::X-Plasma-DefaultSize] Type=QSize Index: containment.cpp =================================================================== --- containment.cpp (revision 1041410) +++ containment.cpp (working copy) @@ -1296,6 +1296,7 @@ kDebug() << "can decode" << mimeName << args; kDebug() << "protocol:" << url.protocol(); KPluginInfo::List appletList = Applet::listAppletInfoForMimetype(mimeName); + appletList << Applet::listAppletInfoForUrl(url.url()); KPluginInfo::List wallpaperList; if (q->drawWallpaper()) { wallpaperList = Wallpaper::listWallpaperInfoForMimetype(mimeName); @@ -1305,6 +1306,7 @@ KIO::JobFlags flags = KIO::HideProgressInfo; KIO::TransferJob *job = KIO::get(url, KIO::NoReload, flags); dropPoints[job] = dropEvent->pos(); + dropPlugins[job] = appletList; QObject::connect(job, SIGNAL(result(KJob*)), q, SLOT(dropJobResult(KJob*))); QObject::connect(job, SIGNAL(mimetype(KIO::Job *, const QString&)), q, SLOT(mimeTypeRetrieved(KIO::Job *, const QString&))); @@ -1420,26 +1422,39 @@ { if (job->error()) { // TODO: error feedback - clearDataForMimeJob(qobject_cast<KIO::Job *>(job)); kDebug() << "ERROR" << job->error() << ' ' << job->errorString(); + KIO::TransferJob* tjob = dynamic_cast<KIO::TransferJob*>(job); + if (!tjob) { + kDebug() << "job should be a TransferJob, but isn't"; + clearDataForMimeJob(qobject_cast<KIO::Job *>(job)); + return; + } + if (!dropPlugins.value(tjob).count()) { + kDebug() << "Cleaning up, no other plugins"; + clearDataForMimeJob(qobject_cast<KIO::Job *>(job)); + return; + } + mimeTypeRetrieved(qobject_cast<KIO::Job *>(job), QString()); } } void ContainmentPrivate::mimeTypeRetrieved(KIO::Job *job, const QString &mimetype) { kDebug() << "Mimetype Job returns." << mimetype; - if (job->error()) { + KIO::TransferJob* tjob = dynamic_cast<KIO::TransferJob*>(job); + if (!tjob) { + kDebug() << "job should be a TransferJob, but isn't"; + clearDataForMimeJob(job); + return; + } + KPluginInfo::List al = dropPlugins.value(tjob); + kDebug() << "plugins found already:" << al.count(); + if (job->error() && !al.count()) { // TODO: error feedback clearDataForMimeJob(job); kDebug() << "ERROR" << job->error() << ' ' << job->errorString(); return; } else { - KIO::TransferJob* tjob = dynamic_cast<KIO::TransferJob*>(job); - if (!tjob) { - kDebug() << "job should be a TransferJob, but isn't"; - clearDataForMimeJob(job); - return; - } QPointF posi; // will be overwritten with the event's position if (dropPoints.keys().contains(tjob)) { @@ -1463,8 +1478,11 @@ args << tjob->url().url() << mimetype; kDebug() << "Creating menu for:" << mimetype << posi << args; - KPluginInfo::List appletList = Applet::listAppletInfoForMimetype(mimetype); + KPluginInfo::List appletList = dropPlugins.value(tjob); + appletList << Applet::listAppletInfoForMimetype(mimetype); + //appletList << Applet::listAppletInfoForUrl(tjob->url().url()); + KPluginInfo::List wallpaperList; if (q->drawWallpaper()) { wallpaperList = Wallpaper::listWallpaperInfoForMimetype(mimetype); @@ -1514,9 +1532,10 @@ // Put the job on hold so it can be recycled to fetch the actual content, // which is to be expected when something's dropped onto the desktop and // an applet is to be created with this URL - tjob->putOnHold(); - KIO::Scheduler::publishSlaveOnHold(); - + if (!tjob->error()) { + tjob->putOnHold(); + KIO::Scheduler::publishSlaveOnHold(); + } QString plugin = actionsToApplets.value(choice); if (plugin.isEmpty()) { //set wallpapery stuff
signature.asc
Description: This is a digitally signed message part.
_______________________________________________ Plasma-devel mailing list Plasma-devel@kde.org https://mail.kde.org/mailman/listinfo/plasma-devel