Aaron J. Seigo 写道:
On Friday 10 July 2009, 潘卫平(Peter Pan) wrote:
I still think that hiding the popup automatically is more convenient
than rejecting showing tooltip and context menu.

for context menus, i agree. if a context menu i shown, the task group popup should also go away. that's a general issues, though (any right click menu on any widget will not hide the group popup). so looks like there's a bug in the code that decides when to hide the group popup in those cases.

this is probably made a bit trickier because you can pull up a context menu on items _inside_ the group popup!

however, for tooltips, i really don't think they are important enough to be shown when a group is already open.



------------------------------------------------------------------------

_______________________________________________
Plasma-devel mailing list
Plasma-devel@kde.org
https://mail.kde.org/mailman/listinfo/plasma-devel

Since the problem is too complicated, maybe we should divide and conquer it.

For context menus, maybe it's a bug in Qt? I'll look into it later.

For tooltips, I agree that they are less important than the popup dialog, so I made another patch to reject showing tooltips when a popup dialog is showing.

Regards!

--
潘卫平(Peter Pan)
Red Flag Software Co., Ltd
Index: taskgroupitem.cpp
===================================================================
--- taskgroupitem.cpp	(revision 997661)
+++ taskgroupitem.cpp	(working copy)
@@ -188,6 +188,7 @@
     //close the popup if the group is removed
     if (m_popupDialog) {
         m_popupDialog->hide();
+        disconnect(m_popupDialog, 0, 0, 0);
         m_popupDialog->deleteLater();
         m_popupDialog = 0;
     }
@@ -263,6 +264,13 @@
         return;
     }
 
+    QWidget * dialog = m_applet->popupDialog();
+
+    if (dialog && dialog->isVisible()) {
+        Plasma::ToolTipManager::self()->clearContent(this);
+        return;
+    }
+
     Plasma::ToolTipContent data(m_group->name(),
                                 i18nc("Which virtual desktop a window is currently on", "On %1",
                                        KWindowSystem::desktopName(m_group->desktop())));
@@ -598,6 +606,7 @@
     if (!m_popupDialog) {
         // Initialize popup dialog
         m_popupDialog = new Plasma::Dialog();
+        connect(m_popupDialog, SIGNAL(dialogVisible(bool)), m_applet, SLOT(setPopupDialog(bool)));
         KWindowSystem::setState(m_popupDialog->winId(), NET::SkipTaskbar| NET::SkipPager);
         m_popupDialog->setWindowFlags(Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint);
         //TODO in the future it may be possible to use the Qt::Popup flag instead of the eventFilter, but for now the focus works better with the eventFilter
Index: windowtaskitem.cpp
===================================================================
--- windowtaskitem.cpp	(revision 997661)
+++ windowtaskitem.cpp	(working copy)
@@ -185,21 +185,41 @@
 {
     if (!m_task) {
         return;
-    }
+    } 
+   
+    bool showToolTip = true;
+    TaskGroupItem *group = parentGroup();
 
-    QPixmap p = m_task->task()->icon(KIconLoader::SizeLarge, KIconLoader::SizeLarge, false);
-    if (p.height() > KIconLoader::SizeLarge) {
-        p = p.scaled(QSize(KIconLoader::SizeLarge, KIconLoader::SizeLarge),
-                     Qt::KeepAspectRatio, Qt::SmoothTransformation);
-    }
+    if (group) {
+        QWidget *groupPopupDialog = parentGroup()->popupDialog();
+        QWidget *dialog = m_applet->popupDialog();
 
-    Plasma::ToolTipContent data(m_task->name(),
-                                i18nc("Which virtual desktop a window is currently on", "On %1",
-                                      KWindowSystem::desktopName(m_task->desktop())), p);
-    data.setWindowToPreview(m_task->task()->window());
-    data.setClickable(true);
+        if (dialog && dialog->isVisible()) {
+            if (groupPopupDialog && groupPopupDialog == dialog) {
+                showToolTip = true;
+            } else {
+                showToolTip = false;
+            }
+        }
+    } 
+    
+    if (showToolTip) {
+        QPixmap p = m_task->task()->icon(KIconLoader::SizeLarge, KIconLoader::SizeLarge, false);
+        if (p.height() > KIconLoader::SizeLarge) {
+            p = p.scaled(QSize(KIconLoader::SizeLarge, KIconLoader::SizeLarge),
+                                Qt::KeepAspectRatio, Qt::SmoothTransformation);
+        }
 
-    Plasma::ToolTipManager::self()->setContent(this, data);
+        Plasma::ToolTipContent data(m_task->name(),
+                                    i18nc("Which virtual desktop a window is currently on", "On %1",
+                                    KWindowSystem::desktopName(m_task->desktop())), p);
+        data.setWindowToPreview(m_task->task()->window());
+        data.setClickable(true);
+
+        Plasma::ToolTipManager::self()->setContent(this, data);
+    } else {
+        Plasma::ToolTipManager::self()->clearContent(this);
+    }
 }
 
 void WindowTaskItem::setStartupTask(TaskItem *task)
Index: tasks.cpp
===================================================================
--- tasks.cpp	(revision 997661)
+++ tasks.cpp	(working copy)
@@ -52,7 +52,8 @@
        m_bottomMargin(0),
        m_rootGroupItem(0),
        m_groupManager(0),
-       m_groupModifierKey(Qt::AltModifier)
+       m_groupModifierKey(Qt::AltModifier),
+       m_popupDialog(0)
 {
     setHasConfigurationInterface(true);
     setAspectRatioMode(Plasma::IgnoreAspectRatio);
@@ -391,7 +392,20 @@
     return m_rootGroupItem;
 }
 
+QWidget *Tasks::popupDialog() const
+{
+    return m_popupDialog;
+}
 
+void Tasks::setPopupDialog(bool status)
+{
+    QWidget *widget = qobject_cast<QWidget *>(sender());
+    
+    if (widget->isVisible()) {
+        m_popupDialog = widget;
+    }
+}
+
 K_EXPORT_PLASMA_APPLET(tasks, Tasks)
 
 #include "tasks.moc"
Index: tasks.h
===================================================================
--- tasks.h	(revision 997661)
+++ tasks.h	(working copy)
@@ -105,8 +105,8 @@
         bool showToolTip() const;
 
         void needsVisualFocus();
-
-
+        // return a pointer referring to the popup dialog which is showing
+        QWidget *popupDialog() const;
 signals:
     /**
     * emitted whenever we receive a constraintsEvent
@@ -116,6 +116,7 @@
 
 protected slots:
         void configAccepted();
+        void setPopupDialog(bool status);
 
 protected:
         void createConfigurationInterface(KConfigDialog *parent);
@@ -156,7 +157,8 @@
         Qt::KeyboardModifier m_groupModifierKey;
 
         int m_currentDesktop;
-
+        // a pointer referring to the popup dialog which is showing
+        QWidget *m_popupDialog;
 };
 
 #endif
_______________________________________________
Plasma-devel mailing list
Plasma-devel@kde.org
https://mail.kde.org/mailman/listinfo/plasma-devel

Reply via email to