summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDmitry Shachnev <mitya57@gmail.com>2016-01-22 10:46:05 +0300
committerDmitry Shachnev <mitya57@gmail.com>2016-02-09 16:54:58 +0000
commit488cf78e44947efffcf3ebde62d7fb2d4fbf4345 (patch)
treee8857d0de4d8eb21f57df5a8ed358709f70ef656
parentb30edc51535c389bdee9f676c4b5003d37242092 (diff)
dbusmenu: Use proper toggle-type for items that are part of group
To achieve that, add a new virtual setHasExclusiveGroup() method to QPlatformMenuItem class (optional because we don't want to break existing platform themes), call it when converting QActions into platform menu items, and use it when exporting the menu items over D-Bus. Also, send ActionChanged event for actions when their group is changed, so that the platform menus are updated too. Change-Id: I8d951ace8c4097decec2a0154163e3672214effb Reviewed-by: Shawn Rutledge <shawn.rutledge@theqtcompany.com>
-rw-r--r--src/gui/kernel/qplatformmenu.h1
-rw-r--r--src/platformsupport/dbusmenu/qdbusmenutypes.cpp5
-rw-r--r--src/platformsupport/dbusmenu/qdbusplatformmenu.cpp6
-rw-r--r--src/platformsupport/dbusmenu/qdbusplatformmenu_p.h5
-rw-r--r--src/widgets/kernel/qaction.cpp1
-rw-r--r--src/widgets/kernel/qactiongroup.cpp1
-rw-r--r--src/widgets/widgets/qmenu.cpp1
7 files changed, 16 insertions, 4 deletions
diff --git a/src/gui/kernel/qplatformmenu.h b/src/gui/kernel/qplatformmenu.h
index 38481b4372..22848fcff6 100644
--- a/src/gui/kernel/qplatformmenu.h
+++ b/src/gui/kernel/qplatformmenu.h
@@ -87,6 +87,7 @@ public:
virtual void setEnabled(bool enabled) = 0;
virtual void setIconSize(int size) = 0;
virtual void setNativeContents(WId item) { Q_UNUSED(item); }
+ virtual void setHasExclusiveGroup(bool hasExclusiveGroup) { Q_UNUSED(hasExclusiveGroup); }
Q_SIGNALS:
void activated();
diff --git a/src/platformsupport/dbusmenu/qdbusmenutypes.cpp b/src/platformsupport/dbusmenu/qdbusmenutypes.cpp
index 03e14c57b2..fbd487aec7 100644
--- a/src/platformsupport/dbusmenu/qdbusmenutypes.cpp
+++ b/src/platformsupport/dbusmenu/qdbusmenutypes.cpp
@@ -184,9 +184,8 @@ QDBusMenuItem::QDBusMenuItem(const QDBusPlatformMenuItem *item)
m_properties.insert(QLatin1String("children-display"), QLatin1String("submenu"));
m_properties.insert(QLatin1String("enabled"), item->isEnabled());
if (item->isCheckable()) {
- // dbusmenu supports "radio" too, but QPlatformMenuItem doesn't seem to
- // (QAction would have an exclusive actionGroup)
- m_properties.insert(QLatin1String("toggle-type"), QLatin1String("checkmark"));
+ QString toggleType = item->hasExclusiveGroup() ? QLatin1String("radio") : QLatin1String("checkmark");
+ m_properties.insert(QLatin1String("toggle-type"), toggleType);
m_properties.insert(QLatin1String("toggle-state"), item->isChecked() ? 1 : 0);
}
/* TODO support shortcuts
diff --git a/src/platformsupport/dbusmenu/qdbusplatformmenu.cpp b/src/platformsupport/dbusmenu/qdbusplatformmenu.cpp
index c813d8255b..70a908a9d6 100644
--- a/src/platformsupport/dbusmenu/qdbusplatformmenu.cpp
+++ b/src/platformsupport/dbusmenu/qdbusplatformmenu.cpp
@@ -61,6 +61,7 @@ QDBusPlatformMenuItem::QDBusPlatformMenuItem(quintptr tag)
, m_isCheckable(false)
, m_isChecked(false)
, m_dbusID(nextDBusID++)
+ , m_hasExclusiveGroup(false)
{
menuItemsByID.insert(m_dbusID, this);
}
@@ -124,6 +125,11 @@ void QDBusPlatformMenuItem::setChecked(bool isChecked)
m_isChecked = isChecked;
}
+void QDBusPlatformMenuItem::setHasExclusiveGroup(bool hasExclusiveGroup)
+{
+ m_hasExclusiveGroup = hasExclusiveGroup;
+}
+
void QDBusPlatformMenuItem::setShortcut(const QKeySequence &shortcut)
{
m_shortcut = shortcut;
diff --git a/src/platformsupport/dbusmenu/qdbusplatformmenu_p.h b/src/platformsupport/dbusmenu/qdbusplatformmenu_p.h
index 0ff424ec9a..f8316ef89d 100644
--- a/src/platformsupport/dbusmenu/qdbusplatformmenu_p.h
+++ b/src/platformsupport/dbusmenu/qdbusplatformmenu_p.h
@@ -97,6 +97,8 @@ public:
void setCheckable(bool checkable) Q_DECL_OVERRIDE;
bool isChecked() const { return m_isChecked; }
void setChecked(bool isChecked) Q_DECL_OVERRIDE;
+ bool hasExclusiveGroup() const { return m_hasExclusiveGroup; }
+ void setHasExclusiveGroup(bool hasExclusiveGroup) Q_DECL_OVERRIDE;
QKeySequence shortcut() const { return m_shortcut; }
void setShortcut(const QKeySequence& shortcut) Q_DECL_OVERRIDE;
void setIconSize(int size) Q_DECL_OVERRIDE { Q_UNUSED(size); }
@@ -123,7 +125,8 @@ private:
bool m_isCheckable : 1;
bool m_isChecked : 1;
int m_dbusID : 16;
- int m_reserved : 7;
+ bool m_hasExclusiveGroup : 1;
+ int m_reserved : 6;
QKeySequence m_shortcut;
};
diff --git a/src/widgets/kernel/qaction.cpp b/src/widgets/kernel/qaction.cpp
index 72d6fffefd..718ecffcc9 100644
--- a/src/widgets/kernel/qaction.cpp
+++ b/src/widgets/kernel/qaction.cpp
@@ -612,6 +612,7 @@ void QAction::setActionGroup(QActionGroup *group)
d->group = group;
if(group)
group->addAction(this);
+ d->sendDataChanged();
}
/*!
diff --git a/src/widgets/kernel/qactiongroup.cpp b/src/widgets/kernel/qactiongroup.cpp
index 98ed132e95..7934ae1d90 100644
--- a/src/widgets/kernel/qactiongroup.cpp
+++ b/src/widgets/kernel/qactiongroup.cpp
@@ -196,6 +196,7 @@ QAction *QActionGroup::addAction(QAction* a)
if (oldGroup)
oldGroup->removeAction(a);
a->d_func()->group = this;
+ a->d_func()->sendDataChanged();
}
return a;
}
diff --git a/src/widgets/widgets/qmenu.cpp b/src/widgets/widgets/qmenu.cpp
index ae20159473..514cb1a8c9 100644
--- a/src/widgets/widgets/qmenu.cpp
+++ b/src/widgets/widgets/qmenu.cpp
@@ -3231,6 +3231,7 @@ static void copyActionToPlatformItem(const QAction *action, QPlatformMenuItem *i
item->setShortcut(action->shortcut());
item->setCheckable(action->isCheckable());
item->setChecked(action->isChecked());
+ item->setHasExclusiveGroup(action->actionGroup() && action->actionGroup()->isExclusive());
item->setFont(action->font());
item->setRole((QPlatformMenuItem::MenuRole) action->menuRole());
item->setEnabled(action->isEnabled());