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