aboutsummaryrefslogtreecommitdiff
path: root/libqmenumodel
diff options
context:
space:
mode:
authorRenato Araujo Oliveira Filho <renato.filho@canonical.com>2012-11-28 20:07:56 -0300
committerRenato Araujo Oliveira Filho <renato.filho@canonical.com>2012-11-28 20:07:56 -0300
commit98ed17ed5c2ebab3a396906d4219af2e99988370 (patch)
tree526d7f52989723d623e426862393890c60b6cece /libqmenumodel
parent53dfc2a919fd03f5570cb106d71d3989a3f528d9 (diff)
parentda5a0437d57df35409fedb568b7ebf4e3d6af0da (diff)
downloadqmenumodel-98ed17ed5c2ebab3a396906d4219af2e99988370.tar.gz
qmenumodel-98ed17ed5c2ebab3a396906d4219af2e99988370.tar.bz2
qmenumodel-98ed17ed5c2ebab3a396906d4219af2e99988370.zip
Merged mainline.
Diffstat (limited to 'libqmenumodel')
-rw-r--r--libqmenumodel/src/CMakeLists.txt2
-rw-r--r--libqmenumodel/src/converter.cpp28
-rw-r--r--libqmenumodel/src/qdbusactiongroup.cpp4
-rw-r--r--libqmenumodel/src/qdbusmenumodel.cpp11
-rw-r--r--libqmenumodel/src/qmenumodel.cpp31
-rw-r--r--libqmenumodel/src/qmenumodel.h2
-rw-r--r--libqmenumodel/src/qstateaction.cpp42
-rw-r--r--libqmenumodel/src/qstateaction.h14
8 files changed, 92 insertions, 42 deletions
diff --git a/libqmenumodel/src/CMakeLists.txt b/libqmenumodel/src/CMakeLists.txt
index 8edb3e1..fe7d433 100644
--- a/libqmenumodel/src/CMakeLists.txt
+++ b/libqmenumodel/src/CMakeLists.txt
@@ -31,7 +31,7 @@ target_link_libraries(${SHAREDLIBNAME}
${GIO_LDFLAGS}
)
-qt5_use_modules(${SHAREDLIBNAME} Core Widgets)
+qt5_use_modules(${SHAREDLIBNAME} Core)
install(TARGETS ${SHAREDLIBNAME} LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR})
diff --git a/libqmenumodel/src/converter.cpp b/libqmenumodel/src/converter.cpp
index 75733ce..6c2411c 100644
--- a/libqmenumodel/src/converter.cpp
+++ b/libqmenumodel/src/converter.cpp
@@ -51,8 +51,21 @@ QVariant Converter::toQVariant(GVariant *value)
}
result.setValue(qmap);
+ } else if (g_variant_type_is_tuple(type)) {
+ gsize size = g_variant_n_children(value);
+ QVariantList vlist;
+
+ for (gsize i=0; i < size; i++) {
+ GVariant *v = g_variant_get_child_value(value, i);
+ if (v) {
+ vlist << toQVariant(v);
+ g_variant_unref(v);
+ }
+ }
+
+ result.setValue(vlist);
} else {
- qWarning() << "Unsupported GVariant value";
+ qWarning() << "Unsupported GVariant value" << (char*) type;
}
/* TODO: implement convertions to others types
@@ -64,7 +77,6 @@ QVariant Converter::toQVariant(GVariant *value)
* G_VARIANT_TYPE_BASIC
* G_VARIANT_TYPE_MAYBE
* G_VARIANT_TYPE_ARRAY
- * G_VARIANT_TYPE_TUPLE
* G_VARIANT_TYPE_UNIT
* G_VARIANT_TYPE_DICT_ENTRY
* G_VARIANT_TYPE_DICTIONARY
@@ -72,7 +84,6 @@ QVariant Converter::toQVariant(GVariant *value)
* G_VARIANT_TYPE_BYTESTRING
* G_VARIANT_TYPE_OBJECT_PATH_ARRAY
* G_VARIANT_TYPE_BYTESTRING_ARRAY
- * G_VARIANT_TYPE_VARDICT
*/
return result;
@@ -137,6 +148,17 @@ GVariant* Converter::toGVariant(const QVariant &value)
g_variant_builder_unref(b);
break;
}
+ case QVariant::List:
+ {
+ QVariantList lst = value.toList();
+ GVariant **vars = g_new(GVariant*, lst.size());
+ for (int i=0; i < lst.size(); i++) {
+ vars[i] = toGVariant(lst[i]);
+ }
+ result = g_variant_new_tuple(vars, lst.size());
+ g_free(vars);
+ break;
+ }
default:
result = ::toGVariant(value.typeName(), value);
}
diff --git a/libqmenumodel/src/qdbusactiongroup.cpp b/libqmenumodel/src/qdbusactiongroup.cpp
index 756bb76..824b5f0 100644
--- a/libqmenumodel/src/qdbusactiongroup.cpp
+++ b/libqmenumodel/src/qdbusactiongroup.cpp
@@ -104,7 +104,7 @@ bool QDBusActionGroup::hasAction(const QString &name)
QStateAction *QDBusActionGroup::actionImpl(const QString &name)
{
Q_FOREACH(QStateAction *act, this->findChildren<QStateAction*>()) {
- if (act->text() == name) {
+ if (act->name() == name) {
return act;
}
}
@@ -194,7 +194,7 @@ void QDBusActionGroup::setActionGroup(GDBusActionGroup *ag)
void QDBusActionGroup::clear()
{
Q_FOREACH(QStateAction *act, this->findChildren<QStateAction*>()) {
- Q_EMIT actionVanish(act->text());
+ Q_EMIT actionVanish(act->name());
}
if (m_actionGroup != NULL) {
diff --git a/libqmenumodel/src/qdbusmenumodel.cpp b/libqmenumodel/src/qdbusmenumodel.cpp
index 97990b4..b404d0b 100644
--- a/libqmenumodel/src/qdbusmenumodel.cpp
+++ b/libqmenumodel/src/qdbusmenumodel.cpp
@@ -95,13 +95,12 @@ void QDBusMenuModel::serviceVanish(GDBusConnection *)
/*! \internal */
void QDBusMenuModel::serviceAppear(GDBusConnection *connection)
{
- GMenuModel *model = reinterpret_cast<GMenuModel*>(g_dbus_menu_model_get(connection,
- busName().toUtf8().data(),
- objectPath().toUtf8().data()));
+ GMenuModel *model = G_MENU_MODEL(g_dbus_menu_model_get(connection,
+ busName().toUtf8().data(),
+ objectPath().toUtf8().data()));
setMenuModel(model);
- if (model == NULL) {
- stop();
- }
+ //setModel take care of the ref
+ g_object_unref(model);
}
/*! \internal */
diff --git a/libqmenumodel/src/qmenumodel.cpp b/libqmenumodel/src/qmenumodel.cpp
index a704d85..5bf740d 100644
--- a/libqmenumodel/src/qmenumodel.cpp
+++ b/libqmenumodel/src/qmenumodel.cpp
@@ -41,15 +41,6 @@ QMenuModel::QMenuModel(GMenuModel *other, QObject *parent)
m_menuModel(0),
m_signalChangedId(0)
{
- static QHash<int, QByteArray> rolesNames;
- if (rolesNames.empty()) {
- rolesNames[Action] = "action";
- rolesNames[Label] = "label";
- rolesNames[LinkSection] = "linkSection";
- rolesNames[LinkSubMenu] = "linkSubMenu";
- rolesNames[Extra] = "extra";
- }
- setRoleNames(rolesNames);
setMenuModel(other);
QObject::connect(this, SIGNAL(rowsInserted(const QModelIndex &, int, int)), this, SIGNAL(countChanged()));
@@ -113,6 +104,7 @@ void QMenuModel::setMenuModel(GMenuModel *other)
m_menuModel = other;
if (m_menuModel) {
+ g_object_ref(m_menuModel);
// this will trigger the menu load
(void) g_menu_model_get_n_items(m_menuModel);
m_signalChangedId = g_signal_connect(m_menuModel,
@@ -139,6 +131,25 @@ void QMenuModel::clearModel()
g_object_unref(m_menuModel);
m_menuModel = NULL;
}
+
+ QList<QMenuModel*> list = findChildren<QMenuModel*>(QString(), Qt::FindDirectChildrenOnly);
+ Q_FOREACH(QMenuModel *model, list) {
+ delete model;
+ }
+}
+
+/*! \internal */
+QHash<int, QByteArray> QMenuModel::roleNames() const
+{
+ static QHash<int, QByteArray> roles;
+ if (roles.isEmpty()) {
+ roles[Action] = "action";
+ roles[Label] = "label";
+ roles[LinkSection] = "linkSection";
+ roles[LinkSubMenu] = "linkSubMenu";
+ roles[Extra] = "extra";
+ }
+ return roles;
}
/*! \internal */
@@ -215,7 +226,7 @@ QVariant QMenuModel::getLink(const QModelIndex &index,
index.row(),
linkName.toUtf8().data());
- if (link) {
+ if (link) {
QMenuModel *other = new QMenuModel(link, const_cast<QMenuModel*>(this));
return QVariant::fromValue<QObject*>(other);
}
diff --git a/libqmenumodel/src/qmenumodel.h b/libqmenumodel/src/qmenumodel.h
index ac40db5..f923658 100644
--- a/libqmenumodel/src/qmenumodel.h
+++ b/libqmenumodel/src/qmenumodel.h
@@ -26,6 +26,7 @@ typedef int gint;
typedef unsigned int guint;
typedef void* gpointer;
typedef struct _GMenuModel GMenuModel;
+typedef struct _GObject GObject;
class QMenuModel : public QAbstractListModel
{
@@ -47,6 +48,7 @@ public:
int count() const;
/* QAbstractItemModel */
+ QHash<int, QByteArray> roleNames() const;
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
QModelIndex parent (const QModelIndex &index) const;
int rowCount(const QModelIndex &parent = QModelIndex()) const;
diff --git a/libqmenumodel/src/qstateaction.cpp b/libqmenumodel/src/qstateaction.cpp
index dd4e541..1861aea 100644
--- a/libqmenumodel/src/qstateaction.cpp
+++ b/libqmenumodel/src/qstateaction.cpp
@@ -47,11 +47,10 @@
/*! \internal */
QStateAction::QStateAction(QDBusActionGroup *group, const QString &name)
- : QAction(name, group),
- m_group(group)
+ : QObject(group),
+ m_group(group),
+ m_name(name)
{
- QObject::connect(this, SIGNAL(triggered()), this, SLOT(onTriggered()));
-
// This keep the code clean
// But maybe we need move the action state control to QActionGroup to optimizations
QObject::connect(m_group, SIGNAL(actionAppear(QString)),
@@ -89,9 +88,28 @@ bool QStateAction::isValid() const
return m_valid;
}
-void QStateAction::updateState(const QVariant &state)
+/*!
+ Request for the state of action to be changed to \a paramenter.
+ This call merely requests a change. The action may refuse to change its state or may change its state to something other than \a paramenter.
+*/
+void QStateAction::updateState(const QVariant &parameter)
+{
+ m_group->updateActionState(m_name, parameter);
+}
+
+/*!
+ Activates the action passing \a parameter.
+ \a parameter must be the correct type of parameter for the action
+*/
+void QStateAction::activate(const QVariant &parameter)
+{
+ m_group->activateAction(m_name, parameter);
+}
+
+/*! \internal */
+QString QStateAction::name() const
{
- m_group->updateActionState(text(), state);
+ return m_name;
}
/*! \internal */
@@ -113,15 +131,9 @@ void QStateAction::setState(const QVariant &state)
}
/*! \internal */
-void QStateAction::onTriggered()
-{
- m_group->activateAction(text(), QVariant());
-}
-
-/*! \internal */
void QStateAction::onActionAppear(const QString &name)
{
- if (text() == name) {
+ if (m_name == name) {
setState(m_group->actionState(name));
setValid(true);
}
@@ -130,7 +142,7 @@ void QStateAction::onActionAppear(const QString &name)
/*! \internal */
void QStateAction::onActionVanish(const QString &name)
{
- if (text() == name) {
+ if (m_name == name) {
setState(QVariant());
setValid(false);
}
@@ -139,7 +151,7 @@ void QStateAction::onActionVanish(const QString &name)
/*! \internal */
void QStateAction::onActionStateChanged(const QString &name, const QVariant &state)
{
- if (text() == name) {
+ if (m_name == name) {
setState(state);
}
}
diff --git a/libqmenumodel/src/qstateaction.h b/libqmenumodel/src/qstateaction.h
index 85f207a..0fc68c2 100644
--- a/libqmenumodel/src/qstateaction.h
+++ b/libqmenumodel/src/qstateaction.h
@@ -20,21 +20,23 @@
#ifndef QDBUSACTION_H
#define QDBUSACTION_H
-#include <QAction>
+#include <QObject>
#include <QVariant>
class QDBusActionGroup;
-class QStateAction : public QAction
+class QStateAction : public QObject
{
Q_OBJECT
- Q_PROPERTY(QVariant state READ state WRITE setState NOTIFY stateChanged)
+ Q_PROPERTY(QString name READ name)
+ Q_PROPERTY(QVariant state READ state NOTIFY stateChanged)
Q_PROPERTY(bool valid READ isValid NOTIFY validChanged)
public:
QVariant state() const;
bool isValid() const;
- Q_INVOKABLE void updateState(const QVariant &state);
+ Q_INVOKABLE void activate(const QVariant &parameter = QVariant());
+ Q_INVOKABLE void updateState(const QVariant &parameter);
Q_SIGNALS:
void stateChanged(QVariant state);
@@ -44,16 +46,18 @@ private Q_SLOTS:
void onActionAppear(const QString &name);
void onActionVanish(const QString &name);
void onActionStateChanged(const QString &name, const QVariant &state);
- void onTriggered();
private:
QDBusActionGroup *m_group;
QVariant m_state;
bool m_valid;
+ QString m_name;
QStateAction(QDBusActionGroup *group, const QString &name);
+
void setValid(bool valid);
void setState(const QVariant &state);
+ QString name() const;
friend class QDBusActionGroup;
};