[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    KDE/kdebase/workspace/plasma/applets
From:       Marco Martin <notmart () gmail ! com>
Date:       2009-07-16 19:41:55
Message-ID: 1247773315.928422.14926.nullmailer () svn ! kde ! org
[Download RAW message or body]

SVN commit 997990 by mart:

add a configuration ui for adding plasmoids into the systray: only ones
marked X-Plasma-NotificationArea=true in their desktop file will show up
in the list


 M  +1 -0      battery/plasma-battery-default.desktop  
 M  +1 -0      devicenotifier/plasma-applet-devicenotifier.desktop  
 M  +2 -1      systemtray/CMakeLists.txt  
 M  +16 -1     systemtray/core/manager.cpp  
 M  +6 -0      systemtray/core/manager.h  
 M  +3 -1      systemtray/protocols/plasmoid/plasmoidtask.cpp  
 M  +30 -0     systemtray/protocols/plasmoid/plasmoidtaskprotocol.cpp  
 M  +5 -0      systemtray/protocols/plasmoid/plasmoidtaskprotocol.h  
 M  +40 -0     systemtray/ui/applet.cpp  
 A             systemtray/ui/plasmoidtasks.ui  
 M  +32 -2     tasks/taskgroupitem.cpp  


--- trunk/KDE/kdebase/workspace/plasma/applets/battery/plasma-battery-default.desktop \
#997989:997990 @@ -151,4 +151,5 @@
 
 X-Plasma-Requires-FileDialog=Unused
 X-Plasma-Requires-LaunchApp=Optional
+X-Plasma-NotificationArea=true
 
--- trunk/KDE/kdebase/workspace/plasma/applets/devicenotifier/plasma-applet-devicenotifier.desktop \
#997989:997990 @@ -135,4 +135,5 @@
 
 X-Plasma-Requires-FileDialog=Unused
 X-Plasma-Requires-LaunchApp=Required
+X-Plasma-NotificationArea=true
 
--- trunk/KDE/kdebase/workspace/plasma/applets/systemtray/CMakeLists.txt \
#997989:997990 @@ -42,7 +42,8 @@
 
 kde4_add_ui_files(systemtray_SRCS
                   ui/protocols.ui
-                  ui/autohide.ui )
+                  ui/autohide.ui
+                  ui/plasmoidtasks.ui)
 
 add_subdirectory(notificationitemwatcher)
 
--- trunk/KDE/kdebase/workspace/plasma/applets/systemtray/core/manager.cpp \
#997989:997990 @@ -241,10 +241,25 @@
 
 void Manager::loadApplets(const KConfigGroup &cg, Plasma::Applet *parent)
 {
-   d->plasmoidProtocol->loadFromConfig(cg, parent);
+    d->plasmoidProtocol->loadFromConfig(cg, parent);
 }
 
+void Manager::addApplet(const QString appletName, Plasma::Applet *parent)
+{
+    d->plasmoidProtocol->addApplet(appletName, parent);
 }
 
+void Manager::removeApplet(const QString appletName, Plasma::Applet *parent)
+{
+    d->plasmoidProtocol->removeApplet(appletName, parent);
+}
 
+QStringList Manager::applets() const
+{
+    return d->plasmoidProtocol->applets();
+}
+
+}
+
+
 #include "manager.moc"
--- trunk/KDE/kdebase/workspace/plasma/applets/systemtray/core/manager.h \
#997989:997990 @@ -102,6 +102,12 @@
 
     void loadApplets(const KConfigGroup &cg, Plasma::Applet *parent);
 
+    void addApplet(const QString appletName, Plasma::Applet *parent);
+
+    void removeApplet(const QString appletName, Plasma::Applet *parent);
+
+    QStringList applets() const;
+
 signals:
     /**
      * Emitted when a new task has been added
--- trunk/KDE/kdebase/workspace/plasma/applets/systemtray/protocols/plasmoid/plasmoidtask.cpp \
#997989:997990 @@ -104,7 +104,7 @@
 
 QGraphicsWidget* PlasmoidTask::createWidget(Plasma::Applet *host)
 {
-    if (host != d->host) {
+    if (host != d->host || !d->applet) {
         return 0;
     }
 
@@ -112,6 +112,8 @@
     d->applet->setParent(host);
     d->applet->setParentItem(host);
     d->applet->init();
+    d->applet->updateConstraints(Plasma::StartupCompletedConstraint);
+    d->applet->flushPendingConstraintsEvents();
     d->applet->updateConstraints(Plasma::AllConstraints);
     d->applet->flushPendingConstraintsEvents();
 
--- trunk/KDE/kdebase/workspace/plasma/applets/systemtray/protocols/plasmoid/plasmoidtaskprotocol.cpp \
#997989:997990 @@ -80,13 +80,43 @@
     }
 }
 
+void PlasmoidProtocol::addApplet(const QString appletName, Plasma::Applet *parent)
+{
+    kDebug() << "Registering task with the manager" << appletName;
 
+    PlasmoidTask *task = new PlasmoidTask(appletName, 0, this, parent);
+
+    if (!task->isValid()) {
+        // we failed to load our applet *sob*
+        delete task;
+        return;
+    }
+
+    m_tasks[appletName] = task;
+    connect(task, SIGNAL(taskDeleted(QString)), this, SLOT(cleanupTask(QString)));
+    emit taskCreated(task);
+}
+
+void PlasmoidProtocol::removeApplet(const QString appletName, Plasma::Applet \
*parent) +{
+    Plasma::Applet *applet = qobject_cast<Plasma::Applet \
*>(m_tasks[appletName]->widget(parent, true)); +
+    if (applet) {
+        applet->destroy();
+    }
+}
+
 void PlasmoidProtocol::cleanupTask(QString typeId)
 {
     kDebug() << "task with typeId" << typeId << "removed";
     m_tasks.remove(typeId);
 }
 
+QStringList PlasmoidProtocol::applets() const
+{
+    return m_tasks.keys();
 }
 
+}
+
 #include "plasmoidtaskprotocol.moc"
--- trunk/KDE/kdebase/workspace/plasma/applets/systemtray/protocols/plasmoid/plasmoidtaskprotocol.h \
#997989:997990 @@ -28,6 +28,7 @@
 #include <KConfigGroup>
 
 #include <QHash>
+#include <QStringList>
 
 namespace SystemTray
 {
@@ -46,11 +47,15 @@
 
     void forwardConstraintsEvent(Plasma::Constraints constraints);
     void loadFromConfig(const KConfigGroup &cg, Plasma::Applet *parent);
+    void addApplet(const QString appletName, Plasma::Applet *parent);
+    void removeApplet(const QString appletName, Plasma::Applet *parent);
+    QStringList applets() const;
 
 private slots:
     void cleanupTask(QString typeId);
 
 private:
+    //FIXME: applets must be indicized by name -and- parent
     QHash<QString, PlasmoidTask*> m_tasks;
 };
 
--- trunk/KDE/kdebase/workspace/plasma/applets/systemtray/ui/applet.cpp \
#997989:997990 @@ -34,6 +34,7 @@
 #include <QtGui/QX11Info>
 #include <QtCore/QProcess>
 
+
 #include <KActionSelector>
 #include <KConfigDialog>
 
@@ -62,6 +63,7 @@
 
 #include "ui_protocols.h"
 #include "ui_autohide.h"
+#include "ui_plasmoidtasks.h"
 
 namespace SystemTray
 {
@@ -107,6 +109,7 @@
     TaskArea *taskArea;
     QPointer<QWidget> notificationInterface;
     QPointer<QWidget> autoHideInterface;
+    QPointer<QWidget> plasmoidTasksInterface;
     QList<Job*> jobs;
     QSet<Task::Category> shownCategories;
     QDateTime lastActivity;
@@ -121,6 +124,7 @@
 
     Ui::ProtocolsConfig notificationUi;
     Ui::AutoHideConfig autoHideUi;
+    Ui::PlasmoidTasksConfig plasmoidTasksUi;
 };
 
 Manager *Applet::Private::s_manager = 0;
@@ -464,6 +468,7 @@
         KConfigGroup globalCg = globalConfig();
         d->notificationInterface = new QWidget();
         d->autoHideInterface = new QWidget();
+        d->plasmoidTasksInterface = new QWidget();
 
         d->notificationUi.setupUi(d->notificationInterface);
 
@@ -478,6 +483,9 @@
         d->autoHideUi.setupUi(d->autoHideInterface);
         d->autoHideUi.autoHide->setChecked(config().readEntry("AutoHidePopup", \
true));  
+        d->plasmoidTasksUi.setupUi(d->plasmoidTasksInterface);
+
+
         connect(parent, SIGNAL(applyClicked()), this, SLOT(configAccepted()));
         connect(parent, SIGNAL(okClicked()), this, SLOT(configAccepted()));
 
@@ -485,9 +493,11 @@
                         "preferences-desktop-notification",
                         i18n("Choose which information to show"));
         parent->addPage(d->autoHideInterface, i18n("Auto Hide"), \
"window-suppressed"); +        parent->addPage(d->plasmoidTasksInterface, \
i18n("Plasma widgets"), "plasma");  }
 
     d->autoHideUi.icons->clear();
+    d->plasmoidTasksUi.applets->clear();
 
     QMultiMap<QString, const Task *> sortedTasks;
     foreach (const Task *task, Private::s_manager->tasks()) {
@@ -511,6 +521,20 @@
         listItem->setCheckState((task->hidden() & Task::UserHidden) ? Qt::Unchecked \
: Qt::Checked);  d->autoHideUi.icons->addItem(listItem);
     }
+
+    foreach (const KPluginInfo &info, Plasma::Applet::listAppletInfo()) {
+        KService::Ptr service = info.service();
+        if (service->property("X-Plasma-NotificationArea", QVariant::Bool).toBool()) \
{ +            QListWidgetItem *listItem = new QListWidgetItem();
+            listItem->setText(service->name());
+            listItem->setIcon(KIcon(service->icon()));
+            listItem->setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsEnabled);
+            listItem->setData(Qt::UserRole, info.pluginName());
+            listItem->setCheckState((Private::s_manager->applets().contains(info.pluginName())) \
? Qt::Checked : Qt::Unchecked); +            \
d->plasmoidTasksUi.applets->addItem(listItem); +        }
+    }
+
 }
 
 void Applet::configAccepted()
@@ -594,6 +618,22 @@
     d->shownCategories.insert(Task::UnknownCategory);
 
     d->taskArea->syncTasks(manager()->tasks());
+
+    QStringList applets = Private::s_manager->applets();
+    for (int i = 0; i < d->plasmoidTasksUi.applets->count(); ++i) {
+        QListWidgetItem * item = d->plasmoidTasksUi.applets->item(i);
+        QString appletName = item->data(Qt::UserRole).toString();
+
+        if (item->checkState() == Qt::Checked) {
+            applets.removeAll(appletName);
+            Private::s_manager->addApplet(appletName, this);
+        }
+    }
+
+    foreach (QString appletName, applets) {
+        Private::s_manager->removeApplet(appletName, this);
+    }
+
     emit configNeedsSaving();
 }
 
--- trunk/KDE/kdebase/workspace/plasma/applets/tasks/taskgroupitem.cpp #997989:997990
@@ -29,6 +29,8 @@
 #include <QApplication>
 #include <QGraphicsLinearLayout>
 #include <QInputDialog>
+#include <QVarLengthArray>
+#include <QX11Info>
 
 // KDE
 #include <KAuthorized>
@@ -284,8 +286,8 @@
     }
 
     data.setWindowsToPreview(windows);
-    data.setClickable(true);
 
+
     Plasma::ToolTipManager::self()->setContent(this, data);
 }
 
@@ -538,7 +540,35 @@
 
 void TaskGroupItem::mousePressEvent(QGraphicsSceneMouseEvent *event)
 { //TODO add delay so we can still drag group items
-    if ((event->buttons() & Qt::LeftButton) && !m_popupLostFocus) {
+    if ((event->buttons() & Qt::LeftButton) && (event->modifiers() & \
Qt::Key_Control)) { + #ifdef Q_WS_X11
+        QList<WId> ids;
+        foreach (AbstractGroupableItem *groupable, m_group->members()) {
+            if (groupable->isGroupItem()) {
+                //TODO: recurse through sub-groups?
+            } else {
+                TaskItem * item = dynamic_cast<TaskItem*>(groupable);
+                if (item) {
+                    ids << item->task()->info().win();
+                }
+            }
+        }
+        const int numWindows = ids.count();
+        QVarLengthArray<long, 32> data(numWindows);
+
+        for (int i = 0; i < numWindows; ++i) {
+            data[i] = ids[i];
+        }
+
+        if (!data.isEmpty()) {
+            Display *dpy = QX11Info::display();
+            const WId winId = data[0];
+            Atom atom = XInternAtom(dpy, "_KDE_PRESENT_WINDOWS_GROUP", False);
+            XChangeProperty(dpy, winId, atom, atom, 32, PropModeReplace,
+                            reinterpret_cast<unsigned char *>(data.data()), \
data.size()); +        }
+#endif
+    } else if ((event->buttons() & Qt::LeftButton) && !m_popupLostFocus) {
         if (m_applet->groupManager().sortingStrategy() == \
                TaskManager::GroupManager::ManualSorting ||
             m_applet->groupManager().groupingStrategy() == \
TaskManager::GroupManager::ManualGrouping) {  if (!m_popupMenuTimer) {


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic