aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRenato Araujo Oliveira Filho <renato.filho@canonical.com>2012-09-11 17:57:08 -0300
committerRenato Araujo Oliveira Filho <renato.filho@canonical.com>2012-09-11 17:57:08 -0300
commit6bacc0d5db885a72202cb7f80e505642a36052d4 (patch)
tree608aa95f959b9e362d7813476e59d37c6c07ddf6 /src
parent31f8103187d2e27b1bb76eaed10dc9c9be226c90 (diff)
downloadqmenumodel-6bacc0d5db885a72202cb7f80e505642a36052d4.tar.gz
qmenumodel-6bacc0d5db885a72202cb7f80e505642a36052d4.tar.bz2
qmenumodel-6bacc0d5db885a72202cb7f80e505642a36052d4.zip
Splitted qmenumodel plugin in two libraries to make it testable.
Create unit test for qmenumodel library.
Diffstat (limited to 'src')
-rw-r--r--src/CMakeLists.txt1
-rw-r--r--src/QMenuModel/CMakeLists.txt13
-rw-r--r--src/common/CMakeLists.txt42
-rw-r--r--src/common/qdbusactiongroup.cpp (renamed from src/QMenuModel/qdbusactiongroup.cpp)4
-rw-r--r--src/common/qdbusactiongroup.h (renamed from src/QMenuModel/qdbusactiongroup.h)2
-rw-r--r--src/common/qdbusmenumodel.cpp (renamed from src/QMenuModel/qdbusmenumodel.cpp)6
-rw-r--r--src/common/qdbusmenumodel.h (renamed from src/QMenuModel/qdbusmenumodel.h)12
-rw-r--r--src/common/qdbusobject.cpp (renamed from src/QMenuModel/qdbusobject.cpp)62
-rw-r--r--src/common/qdbusobject.h (renamed from src/QMenuModel/qdbusobject.h)6
-rw-r--r--src/common/qmenumodel.cpp (renamed from src/QMenuModel/qmenumodel.cpp)97
-rw-r--r--src/common/qmenumodel.h (renamed from src/QMenuModel/qmenumodel.h)7
11 files changed, 194 insertions, 58 deletions
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index e2c06cb..7215efc 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -1,3 +1,4 @@
project(src)
+add_subdirectory(common)
add_subdirectory(QMenuModel)
diff --git a/src/QMenuModel/CMakeLists.txt b/src/QMenuModel/CMakeLists.txt
index ee3f28c..bf3bb5a 100644
--- a/src/QMenuModel/CMakeLists.txt
+++ b/src/QMenuModel/CMakeLists.txt
@@ -1,16 +1,11 @@
+
+project(qmenumodelqmlplugin)
+
set(QMENUMODEL_SRC
- qmenumodel.cpp
- qdbusobject.cpp
- qdbusmenumodel.cpp
- qdbusactiongroup.cpp
plugin.cpp
)
set(QMENUMODEL_HEADERS
- qmenumodel.h
- qdbusobject.h
- qdbusmenumodel.h
- qdbusactiongroup.h
plugin.h
)
@@ -25,6 +20,7 @@ add_library(qmenumodel MODULE
include_directories(
${CMAKE_CURRENT_SOURCE_DIR}
+ ${qmenumodelcommon_SOURCE_DIR}
${QT_INCLUDE_DIR}
${QT_QTCORE_INCLUDE_DIR}
${QT_QTGUI_INCLUDE_DIR}
@@ -34,6 +30,7 @@ include_directories(
)
target_link_libraries(qmenumodel
+ qmenumodelcommon
${QT_QTCORE_LIBRARY}
${QT_QTGUI_LIBRARY}
${QT_QTDCLARATIVE_LIBRARY}
diff --git a/src/common/CMakeLists.txt b/src/common/CMakeLists.txt
new file mode 100644
index 0000000..1428000
--- /dev/null
+++ b/src/common/CMakeLists.txt
@@ -0,0 +1,42 @@
+project(qmenumodelcommon)
+
+set(QMENUMODELCOMMON_SRC
+ qmenumodel.cpp
+ qdbusobject.cpp
+ qdbusmenumodel.cpp
+ qdbusactiongroup.cpp
+)
+
+set(QMENUMODELCOMMON_HEADERS
+ qmenumodel.h
+ qdbusobject.h
+ qdbusmenumodel.h
+ qdbusactiongroup.h
+)
+
+qt4_wrap_cpp(QMENUMODELCOMMON_MOC
+ ${QMENUMODELCOMMON_HEADERS}
+)
+
+add_library(qmenumodelcommon STATIC
+ ${QMENUMODELCOMMON_SRC}
+ ${QMENUMODELCOMMON_MOC}
+)
+
+set_target_properties(qmenumodelcommon PROPERTIES COMPILE_FLAGS -fPIC)
+
+include_directories(
+ ${CMAKE_CURRENT_SOURCE_DIR}
+ ${QT_INCLUDE_DIR}
+ ${QT_QTCORE_INCLUDE_DIR}
+ ${QT_QTGUI_INCLUDE_DIR}
+ ${GLIB_INCLUDE_DIRS}
+ ${GIO_INCLUDE_DIRS}
+)
+
+target_link_libraries(qmenumodelcommon
+ ${QT_QTCORE_LIBRARY}
+ ${QT_QTGUI_LIBRARY}
+ ${GLIB_LDFLAGS}
+ ${GIO_LDFLAGS}
+)
diff --git a/src/QMenuModel/qdbusactiongroup.cpp b/src/common/qdbusactiongroup.cpp
index ca430fb..8475c29 100644
--- a/src/QMenuModel/qdbusactiongroup.cpp
+++ b/src/common/qdbusactiongroup.cpp
@@ -44,12 +44,12 @@ void QDBusActionGroup::serviceAppear(GDBusConnection *connection)
void QDBusActionGroup::start()
{
- QDbusObject::connect();
+ QDBusObject::connect();
}
void QDBusActionGroup::stop()
{
- QDbusObject::disconnect();
+ QDBusObject::disconnect();
}
void QDBusActionGroup::busTypeChanged(BusType)
diff --git a/src/QMenuModel/qdbusactiongroup.h b/src/common/qdbusactiongroup.h
index a32b03e..fe743b6 100644
--- a/src/QMenuModel/qdbusactiongroup.h
+++ b/src/common/qdbusactiongroup.h
@@ -7,7 +7,7 @@
#include <QAction>
#include <QSet>
-class QDBusActionGroup : public QObject, public QDbusObject
+class QDBusActionGroup : public QObject, public QDBusObject
{
Q_OBJECT
Q_PROPERTY(int busType READ busType WRITE setIntBusType NOTIFY busTypeChanged)
diff --git a/src/QMenuModel/qdbusmenumodel.cpp b/src/common/qdbusmenumodel.cpp
index c551464..6e35c85 100644
--- a/src/QMenuModel/qdbusmenumodel.cpp
+++ b/src/common/qdbusmenumodel.cpp
@@ -12,12 +12,12 @@ QDBusMenuModel::~QDBusMenuModel()
void QDBusMenuModel::start()
{
- QDbusObject::connect();
+ QDBusObject::connect();
}
void QDBusMenuModel::stop()
{
- QDbusObject::disconnect();
+ QDBusObject::disconnect();
}
void QDBusMenuModel::serviceVanish(GDBusConnection *)
@@ -36,6 +36,7 @@ void QDBusMenuModel::serviceAppear(GDBusConnection *connection)
}
}
+/*
void QDBusMenuModel::busTypeChanged(BusType)
{
busTypeChanged();
@@ -55,6 +56,7 @@ void QDBusMenuModel::statusChanged(ConnectionStatus status)
{
statusChanged();
}
+*/
void QDBusMenuModel::setIntBusType(int busType)
{
diff --git a/src/QMenuModel/qdbusmenumodel.h b/src/common/qdbusmenumodel.h
index 975e72d..4fc439d 100644
--- a/src/QMenuModel/qdbusmenumodel.h
+++ b/src/common/qdbusmenumodel.h
@@ -6,7 +6,7 @@
#include <gio/gio.h>
-class QDBusMenuModel : public QMenuModel, public QDbusObject
+class QDBusMenuModel : public QMenuModel, public QDBusObject
{
Q_OBJECT
Q_PROPERTY(int busType READ busType WRITE setIntBusType NOTIFY busTypeChanged)
@@ -19,10 +19,10 @@ public:
~QDBusMenuModel();
Q_SIGNALS:
- void busTypeChanged();
- void busNameChanged();
- void objectPathChanged();
- void statusChanged();
+ void busTypeChanged(BusType type);
+ void busNameChanged(const QString &busNameChanged);
+ void objectPathChanged(const QString &objectPath);
+ void statusChanged(QDBusObject::ConnectionStatus status);
public Q_SLOTS:
void start();
@@ -32,10 +32,12 @@ protected:
virtual void serviceAppear(GDBusConnection *connection);
virtual void serviceVanish(GDBusConnection *connection);
+ /*
virtual void busTypeChanged(BusType type);
virtual void busNameChanged(const QString &busNameChanged);
virtual void objectPathChanged(const QString &objectPath);
virtual void statusChanged(ConnectionStatus status);
+ */
private:
// workaround to support int as bustType
diff --git a/src/QMenuModel/qdbusobject.cpp b/src/common/qdbusobject.cpp
index 9f11813..6dec6d9 100644
--- a/src/QMenuModel/qdbusobject.cpp
+++ b/src/common/qdbusobject.cpp
@@ -2,14 +2,18 @@
#include <QDebug>
-QDbusObject::QDbusObject()
+
+
+QDBusObject::QDBusObject()
:m_watchId(0),
m_busType(None),
- m_status(QDbusObject::Disconnected)
+ m_status(QDBusObject::Disconnected)
{
+ qDebug() << "DBUS CREATED";
+ qRegisterMetaType<QDBusObject::ConnectionStatus>("QDBusObject::ConnectionStatus");
}
-QDbusObject::~QDbusObject()
+QDBusObject::~QDBusObject()
{
if (m_watchId != 0) {
g_bus_unwatch_name (m_watchId);
@@ -17,52 +21,52 @@ QDbusObject::~QDbusObject()
}
}
-QDbusObject::BusType QDbusObject::busType() const
+QDBusObject::BusType QDBusObject::busType() const
{
return m_busType;
}
-void QDbusObject::setBusType(QDbusObject::BusType type)
+void QDBusObject::setBusType(QDBusObject::BusType type)
{
if (m_busType != type) {
- if (m_status != QDbusObject::Disconnected)
+ if (m_status != QDBusObject::Disconnected)
disconnect();
m_busType = type;
busTypeChanged(m_busType);
}
}
-QString QDbusObject::busName() const
+QString QDBusObject::busName() const
{
return m_busName;
}
-void QDbusObject::setBusName(const QString &busName)
+void QDBusObject::setBusName(const QString &busName)
{
if (m_busName != busName) {
- if (m_status != QDbusObject::Disconnected)
+ if (m_status != QDBusObject::Disconnected)
disconnect();
m_busName = busName;
busNameChanged(m_busName);
}
}
-QString QDbusObject::objectPath() const
+QString QDBusObject::objectPath() const
{
return m_objectPath;
}
-void QDbusObject::setObjectPath(const QString &objectPath)
+void QDBusObject::setObjectPath(const QString &objectPath)
{
if (m_objectPath != objectPath) {
- if (m_status != QDbusObject::Disconnected)
+ if (m_status != QDBusObject::Disconnected)
disconnect();
m_objectPath = objectPath;
objectPathChanged(m_objectPath);
}
}
-void QDbusObject::setStatus(QDbusObject::ConnectionStatus status)
+void QDBusObject::setStatus(QDBusObject::ConnectionStatus status)
{
if (m_status != status) {
m_status = status;
@@ -70,52 +74,54 @@ void QDbusObject::setStatus(QDbusObject::ConnectionStatus status)
}
}
-QDbusObject::ConnectionStatus QDbusObject::status() const
+QDBusObject::ConnectionStatus QDBusObject::status() const
{
return m_status;
}
-void QDbusObject::connect()
+void QDBusObject::connect()
{
- if (m_status != QDbusObject::Disconnected) {
+ if (m_status != QDBusObject::Disconnected) {
return;
} else if ((m_busType > None) && !m_objectPath.isEmpty() && !m_busName.isEmpty()) {
GBusType type = m_busType == SessionBus ? G_BUS_TYPE_SESSION : G_BUS_TYPE_SYSTEM;
m_watchId = g_bus_watch_name (type,
m_busName.toLatin1(),
G_BUS_NAME_WATCHER_FLAGS_NONE,
- QDbusObject::onServiceAppeared,
- QDbusObject::onServiceFanished,
+ QDBusObject::onServiceAppeared,
+ QDBusObject::onServiceFanished,
this,
NULL);
- setStatus(QDbusObject::Connecting);
+ setStatus(QDBusObject::Connecting);
} else {
qWarning() << "Invalid dbus connection args";
}
}
-void QDbusObject::disconnect()
+void QDBusObject::disconnect()
{
- if (m_status != QDbusObject::Disconnected) {
+ if (m_status != QDBusObject::Disconnected) {
g_bus_unwatch_name (m_watchId);
m_watchId = 0;
- setStatus(QDbusObject::Disconnected);
+ setStatus(QDBusObject::Disconnected);
}
}
-void QDbusObject::onServiceAppeared(GDBusConnection *connection, const gchar *, const gchar *, gpointer data)
+void QDBusObject::onServiceAppeared(GDBusConnection *connection, const gchar *, const gchar *, gpointer data)
{
- QDbusObject *self = reinterpret_cast<QDbusObject*>(data);
+ QDBusObject *self = reinterpret_cast<QDBusObject*>(data);
+ qDebug() << "service appear";
- self->setStatus(QDbusObject::Connected);
+ self->setStatus(QDBusObject::Connected);
self->serviceAppear(connection);
}
-void QDbusObject::onServiceFanished(GDBusConnection *connection, const gchar *, gpointer data)
+void QDBusObject::onServiceFanished(GDBusConnection *connection, const gchar *, gpointer data)
{
- QDbusObject *self = reinterpret_cast<QDbusObject*>(data);
+ QDBusObject *self = reinterpret_cast<QDBusObject*>(data);
+ qDebug() << "service disappear";
- self->setStatus(QDbusObject::Connecting);
+ self->setStatus(QDBusObject::Connecting);
self->serviceVanish(connection);
}
diff --git a/src/QMenuModel/qdbusobject.h b/src/common/qdbusobject.h
index 0b17ae1..a2dc91c 100644
--- a/src/QMenuModel/qdbusobject.h
+++ b/src/common/qdbusobject.h
@@ -5,7 +5,7 @@
#include <gio/gio.h>
-class QDbusObject
+class QDBusObject
{
public:
enum BusType {
@@ -21,8 +21,8 @@ public:
Connected
};
- QDbusObject();
- ~QDbusObject();
+ QDBusObject();
+ ~QDBusObject();
BusType busType() const;
void setBusType(BusType type);
diff --git a/src/QMenuModel/qmenumodel.cpp b/src/common/qmenumodel.cpp
index c7ccf56..6e7483c 100644
--- a/src/QMenuModel/qmenumodel.cpp
+++ b/src/common/qmenumodel.cpp
@@ -1,4 +1,5 @@
#include "qmenumodel.h"
+
#include <QDebug>
QMenuModel::QMenuModel(GMenuModel *other, QObject *parent)
@@ -12,6 +13,7 @@ QMenuModel::QMenuModel(GMenuModel *other, QObject *parent)
rolesNames[Label] = "label";
rolesNames[LinkSection] = "linkSection";
rolesNames[LinkSubMenu] = "linkSubMenu";
+ rolesNames[Extra] = "extra";
}
setRoleNames(rolesNames);
setMenuModel(other);
@@ -36,17 +38,19 @@ void QMenuModel::setMenuModel(GMenuModel *other)
g_object_unref(m_menuModel);
}
- m_menuModel = other;
-
- endResetModel();
+ m_menuModel = other;
if (m_menuModel) {
- qDebug() << "Menu size:" << g_menu_model_get_n_items(m_menuModel);
+ // this will trigger the menu load
+ (void) g_menu_model_get_n_items(m_menuModel);
+ //qDebug() << "Menu size:" << g_menu_model_get_n_items(m_menuModel);
m_signalChangedId = g_signal_connect(m_menuModel,
"items-changed",
G_CALLBACK(QMenuModel::onItemsChanged),
this);
}
+
+ endResetModel();
}
GMenuModel *QMenuModel::menuModel() const
@@ -67,8 +71,7 @@ QVariant QMenuModel::data(const QModelIndex &index, int role) const
if ((rowCountValue > 0) && (index.row() >= 0) && (index.row() < rowCountValue)) {
if (m_menuModel) {
- switch (role)
- {
+ switch (role) {
case Action:
attribute = getStringAttribute(index, G_MENU_ATTRIBUTE_ACTION);
break;
@@ -81,6 +84,9 @@ QVariant QMenuModel::data(const QModelIndex &index, int role) const
case LinkSubMenu:
attribute = getLink(index, G_MENU_LINK_SUBMENU);
break;
+ case Extra:
+ attribute = getExtraProperties(index);
+ break;
default:
break;
}
@@ -135,6 +141,27 @@ QVariant QMenuModel::getLink(const QModelIndex &index,
return QVariant();
}
+QVariant QMenuModel::getExtraProperties(const QModelIndex &index) const
+{
+ GMenuAttributeIter *iter = g_menu_model_iterate_item_attributes(m_menuModel, index.row());
+ if (iter == NULL) {
+ return QVariant();
+ }
+
+ QObject *extra = new QObject(const_cast<QMenuModel*>(this));
+ const gchar *attrName = NULL;
+ GVariant *value = NULL;
+ while (g_menu_attribute_iter_get_next (iter, &attrName, &value)) {
+ qDebug() << "Set property:" << attrName;
+ if (strncmp("x-", attrName, 2) == 0) {
+ extra->setProperty(attrName, parseGVariant(value));
+ }
+ }
+
+ return QVariant::fromValue<QObject*>(extra);
+}
+
+
void QMenuModel::onItemsChanged(GMenuModel *,
gint position,
gint removed,
@@ -142,6 +169,7 @@ void QMenuModel::onItemsChanged(GMenuModel *,
gpointer data)
{
QMenuModel *self = reinterpret_cast<QMenuModel*>(data);
+ //qDebug() << "Item Changed" << position << removed << added;
if (removed > 0) {
self->beginRemoveRows(QModelIndex(), position, position + removed - 1);
@@ -154,3 +182,60 @@ void QMenuModel::onItemsChanged(GMenuModel *,
}
}
+QVariant QMenuModel::parseGVariant(GVariant *value)
+{
+ QVariant result;
+ if (value == NULL) {
+ return result;
+ }
+
+ const GVariantType *type = g_variant_get_type(value);
+ if (g_variant_type_equal(type, G_VARIANT_TYPE_BOOLEAN)) {
+ result.setValue((bool)g_variant_get_boolean(value));
+ } else if (g_variant_type_equal(type, G_VARIANT_TYPE_BYTE)) {
+ result.setValue(g_variant_get_byte(value));
+ } else if (g_variant_type_equal(type, G_VARIANT_TYPE_INT16)) {
+ result.setValue(g_variant_get_int16(value));
+ } else if (g_variant_type_equal(type, G_VARIANT_TYPE_UINT16)) {
+ result.setValue(g_variant_get_uint16(value));
+ } else if (g_variant_type_equal(type, G_VARIANT_TYPE_INT32)) {
+ result.setValue(g_variant_get_int32(value));
+ } else if (g_variant_type_equal(type, G_VARIANT_TYPE_UINT32)) {
+ result.setValue(g_variant_get_uint32(value));
+ } else if (g_variant_type_equal(type, G_VARIANT_TYPE_INT64)) {
+ result.setValue(g_variant_get_int64(value));
+ } else if (g_variant_type_equal(type, G_VARIANT_TYPE_UINT64)) {
+ result.setValue(g_variant_get_uint64(value));
+ } else if (g_variant_type_equal(type, G_VARIANT_TYPE_DOUBLE)) {
+ result.setValue(g_variant_get_double(value));
+ } else if (g_variant_type_equal(type, G_VARIANT_TYPE_STRING)) {
+ gsize size = 0;
+ const gchar *v = g_variant_get_string(value, &size);
+ result.setValue(QString::fromLatin1(v, size));
+ } else {
+ qWarning() << "Unsupported GVariant value";
+ }
+
+ /* TODO: implement convertions to others types
+ * G_VARIANT_TYPE_HANDLE
+ * G_VARIANT_TYPE_OBJECT_PATH
+ * G_VARIANT_TYPE_SIGNATURE
+ * G_VARIANT_TYPE_VARIANT
+ * G_VARIANT_TYPE_ANY
+ * 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
+ * G_VARIANT_TYPE_STRING_ARRAY
+ * G_VARIANT_TYPE_BYTESTRING
+ * G_VARIANT_TYPE_OBJECT_PATH_ARRAY
+ * G_VARIANT_TYPE_BYTESTRING_ARRAY
+ * G_VARIANT_TYPE_VARDICT
+ */
+
+ return result;
+}
+
diff --git a/src/QMenuModel/qmenumodel.h b/src/common/qmenumodel.h
index 18ad21c..f1e0b61 100644
--- a/src/QMenuModel/qmenumodel.h
+++ b/src/common/qmenumodel.h
@@ -4,7 +4,6 @@
#include <QAbstractListModel>
#include <gio/gio.h>
-
class QMenuModel : public QAbstractListModel
{
Q_OBJECT
@@ -14,7 +13,8 @@ public:
Action = 0,
Label,
LinkSection,
- LinkSubMenu
+ LinkSubMenu,
+ Extra
};
~QMenuModel();
@@ -36,9 +36,10 @@ private:
QVariant getStringAttribute(const QModelIndex &index, const QString &attribute) const;
QVariant getLink(const QModelIndex &index, const QString &linkName) const;
+ QVariant getExtraProperties(const QModelIndex &index) const;
static void onItemsChanged(GMenuModel *model, gint position, gint removed, gint added, gpointer data);
-
+ static QVariant parseGVariant(GVariant *value);
};
#endif