diff options
Diffstat (limited to 'src/QMenuModel')
-rw-r--r-- | src/QMenuModel/CMakeLists.txt | 13 | ||||
-rw-r--r-- | src/QMenuModel/qdbusactiongroup.cpp | 193 | ||||
-rw-r--r-- | src/QMenuModel/qdbusactiongroup.h | 63 | ||||
-rw-r--r-- | src/QMenuModel/qdbusmenumodel.cpp | 64 | ||||
-rw-r--r-- | src/QMenuModel/qdbusmenumodel.h | 45 | ||||
-rw-r--r-- | src/QMenuModel/qdbusobject.cpp | 121 | ||||
-rw-r--r-- | src/QMenuModel/qdbusobject.h | 65 | ||||
-rw-r--r-- | src/QMenuModel/qmenumodel.cpp | 156 | ||||
-rw-r--r-- | src/QMenuModel/qmenumodel.h | 44 |
9 files changed, 5 insertions, 759 deletions
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/QMenuModel/qdbusactiongroup.cpp b/src/QMenuModel/qdbusactiongroup.cpp deleted file mode 100644 index ca430fb..0000000 --- a/src/QMenuModel/qdbusactiongroup.cpp +++ /dev/null @@ -1,193 +0,0 @@ -#include "qdbusactiongroup.h" - -#include <QDebug> - -#include <gio/gio.h> - -QDBusActionGroup::QDBusActionGroup(QObject *parent) - :QObject(parent), - m_actionGroup(NULL) -{ -} - -QDBusActionGroup::~QDBusActionGroup() -{ - clear(); -} - -QAction *QDBusActionGroup::getAction(const QString &actionName) -{ - Q_FOREACH(QAction *act, m_actions) { - if (act->text() == actionName) { - return act; - } - } - - return NULL; -} - -void QDBusActionGroup::serviceVanish(GDBusConnection *) -{ - clear(); -} - -void QDBusActionGroup::serviceAppear(GDBusConnection *connection) -{ - GDBusActionGroup *ag = g_dbus_action_group_get(connection, - busName().toLatin1(), - objectPath().toLatin1()); - setActionGroup(ag); - if (ag == NULL) { - stop(); - } -} - -void QDBusActionGroup::start() -{ - QDbusObject::connect(); -} - -void QDBusActionGroup::stop() -{ - QDbusObject::disconnect(); -} - -void QDBusActionGroup::busTypeChanged(BusType) -{ - busTypeChanged(); -} - -void QDBusActionGroup::busNameChanged(const QString &) -{ - busNameChanged(); -} - -void QDBusActionGroup::objectPathChanged(const QString &objectPath) -{ - objectPathChanged(); -} - -void QDBusActionGroup::statusChanged(ConnectionStatus status) -{ - statusChanged(); -} - -void QDBusActionGroup::setIntBusType(int busType) -{ - if ((busType > None) && (busType < LastBusType)) { - setBusType(static_cast<BusType>(busType)); - } -} - -void QDBusActionGroup::setActionGroup(GDBusActionGroup *ag) -{ - if (m_actionGroup == reinterpret_cast<GActionGroup*>(ag)) { - return; - } - - if (m_actionGroup) { - g_signal_handler_disconnect(m_actionGroup, m_signalActionAddId); - g_signal_handler_disconnect(m_actionGroup, m_signalActionRemovedId); - m_signalActionAddId = m_signalActionRemovedId = 0; - g_object_unref(m_actionGroup); - } - - m_actionGroup = reinterpret_cast<GActionGroup*>(ag); - - if (m_actionGroup) { - - m_signalActionAddId = g_signal_connect(m_actionGroup, - "action-add", - G_CALLBACK(QDBusActionGroup::onActionAdded), - this); - - m_signalActionRemovedId = g_signal_connect(m_actionGroup, - "action-removed", - G_CALLBACK(QDBusActionGroup::onActionRemoved), - this); - - gchar **actionNames = g_action_group_list_actions(m_actionGroup); - for(int i=0; actionNames[i] != NULL; i++) { - addAction(actionNames[i]); - } - g_strfreev(actionNames); - } -} - -void QDBusActionGroup::addAction(const char *actionName) -{ - QAction *act = new QAction(actionName, this); - - act->setEnabled(g_action_group_get_action_enabled(m_actionGroup, actionName)); - - const GVariantType *stateType = g_action_group_get_action_state_type(m_actionGroup, actionName); - if (stateType == G_VARIANT_TYPE_BOOLEAN) { - act->setCheckable(true); - - GVariant *actState = g_action_group_get_action_state(m_actionGroup, actionName); - if (actState != NULL) { - act->setChecked(g_variant_get_boolean(actState)); - g_variant_unref(actState); - } - } - - // remove any older action with the same name - removeAction(actionName); - - m_actions.insert(act); -} - -void QDBusActionGroup::removeAction(const char *actionName) -{ - Q_FOREACH(QAction *act, m_actions) { - if (act->text() == actionName) { - m_actions.remove(act); - delete act; - break; - } - } -} - -void QDBusActionGroup::updateAction(const char *actionName, GVariant *state) -{ - QAction *action = getAction(actionName); - if ((action != NULL) && (state != NULL)) { - - const GVariantType *stateType = g_variant_get_type(state); - if (stateType == G_VARIANT_TYPE_BOOLEAN) { - action->setChecked(g_variant_get_boolean(state)); - } - } -} - -void QDBusActionGroup::clear() -{ - Q_FOREACH(QAction *act, m_actions) { - delete act; - } - m_actions.clear(); - - if (m_actionGroup != NULL) { - g_object_unref(m_actionGroup); - m_actionGroup = NULL; - } -} - -void QDBusActionGroup::onActionAdded(GDBusActionGroup *, gchar *actionName, gpointer data) -{ - QDBusActionGroup *self = reinterpret_cast<QDBusActionGroup*>(data); - self->addAction(actionName); -} - -void QDBusActionGroup::onActionRemoved(GDBusActionGroup *, gchar *actionName, gpointer data) -{ - QDBusActionGroup *self = reinterpret_cast<QDBusActionGroup*>(data); - self->removeAction(actionName); - -} - -void QDBusActionGroup::onActionStateChanged(GDBusActionGroup *ag, gchar *actionName, GVariant *value, gpointer data) -{ - QDBusActionGroup *self = reinterpret_cast<QDBusActionGroup*>(data); - self->updateAction(actionName, value); -} diff --git a/src/QMenuModel/qdbusactiongroup.h b/src/QMenuModel/qdbusactiongroup.h deleted file mode 100644 index a32b03e..0000000 --- a/src/QMenuModel/qdbusactiongroup.h +++ /dev/null @@ -1,63 +0,0 @@ -#ifndef QDBUSACTIONGROUP_H -#define QDBUSACTIONGROUP_H - -#include "qdbusobject.h" - -#include <QObject> -#include <QAction> -#include <QSet> - -class QDBusActionGroup : public QObject, public QDbusObject -{ - Q_OBJECT - Q_PROPERTY(int busType READ busType WRITE setIntBusType NOTIFY busTypeChanged) - Q_PROPERTY(QString busName READ busName WRITE setBusName NOTIFY busNameChanged) - Q_PROPERTY(QString objectPath READ objectPath WRITE setObjectPath NOTIFY objectPathChanged) - Q_PROPERTY(int status READ status NOTIFY statusChanged) - -public: - QDBusActionGroup(QObject *parent=0); - ~QDBusActionGroup(); - -Q_SIGNALS: - void busTypeChanged(); - void busNameChanged(); - void objectPathChanged(); - void statusChanged(); - -public Q_SLOTS: - void start(); - void stop(); - QAction *getAction(const QString &actionName); - -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: - GActionGroup *m_actionGroup; - QSet<QAction*> m_actions; - int m_signalActionAddId; - int m_signalActionRemovedId; - - // workaround to support int as bustType - void setIntBusType(int busType); - - void setActionGroup(GDBusActionGroup *ag); - void addAction(const char *actionName); - void removeAction(const char *actionName); - void updateAction(const char *actionName, GVariant *state); - void clear(); - - // glib slots - static void onActionAdded(GDBusActionGroup *ag, gchar *actionName, gpointer data); - static void onActionRemoved(GDBusActionGroup *ag, gchar *actionName, gpointer data); - static void onActionStateChanged(GDBusActionGroup *ag, gchar *actionName, GVariant *value, gpointer data); -}; - -#endif diff --git a/src/QMenuModel/qdbusmenumodel.cpp b/src/QMenuModel/qdbusmenumodel.cpp deleted file mode 100644 index c551464..0000000 --- a/src/QMenuModel/qdbusmenumodel.cpp +++ /dev/null @@ -1,64 +0,0 @@ -#include "qdbusmenumodel.h" -#include <QDebug> - -QDBusMenuModel::QDBusMenuModel(QObject *parent) - :QMenuModel(0, parent) -{ -} - -QDBusMenuModel::~QDBusMenuModel() -{ -} - -void QDBusMenuModel::start() -{ - QDbusObject::connect(); -} - -void QDBusMenuModel::stop() -{ - QDbusObject::disconnect(); -} - -void QDBusMenuModel::serviceVanish(GDBusConnection *) -{ - setMenuModel(NULL); -} - -void QDBusMenuModel::serviceAppear(GDBusConnection *connection) -{ - GMenuModel *model = reinterpret_cast<GMenuModel*>(g_dbus_menu_model_get(connection, - busName().toLatin1(), - objectPath().toLatin1())); - setMenuModel(model); - if (model == NULL) { - stop(); - } -} - -void QDBusMenuModel::busTypeChanged(BusType) -{ - busTypeChanged(); -} - -void QDBusMenuModel::busNameChanged(const QString &) -{ - busNameChanged(); -} - -void QDBusMenuModel::objectPathChanged(const QString &objectPath) -{ - objectPathChanged(); -} - -void QDBusMenuModel::statusChanged(ConnectionStatus status) -{ - statusChanged(); -} - -void QDBusMenuModel::setIntBusType(int busType) -{ - if ((busType > None) && (busType < LastBusType)) { - setBusType(static_cast<BusType>(busType)); - } -} diff --git a/src/QMenuModel/qdbusmenumodel.h b/src/QMenuModel/qdbusmenumodel.h deleted file mode 100644 index 975e72d..0000000 --- a/src/QMenuModel/qdbusmenumodel.h +++ /dev/null @@ -1,45 +0,0 @@ -#ifndef QDBUSMENUMODEL_H -#define QDBUSMENUMODEL_H - -#include "qdbusobject.h" -#include "qmenumodel.h" - -#include <gio/gio.h> - -class QDBusMenuModel : public QMenuModel, public QDbusObject -{ - Q_OBJECT - Q_PROPERTY(int busType READ busType WRITE setIntBusType NOTIFY busTypeChanged) - Q_PROPERTY(QString busName READ busName WRITE setBusName NOTIFY busNameChanged) - Q_PROPERTY(QString objectPath READ objectPath WRITE setObjectPath NOTIFY objectPathChanged) - Q_PROPERTY(int status READ status NOTIFY statusChanged) - -public: - QDBusMenuModel(QObject *parent=0); - ~QDBusMenuModel(); - -Q_SIGNALS: - void busTypeChanged(); - void busNameChanged(); - void objectPathChanged(); - void statusChanged(); - -public Q_SLOTS: - void start(); - void stop(); - -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 - void setIntBusType(int busType); -}; - -#endif diff --git a/src/QMenuModel/qdbusobject.cpp b/src/QMenuModel/qdbusobject.cpp deleted file mode 100644 index 9f11813..0000000 --- a/src/QMenuModel/qdbusobject.cpp +++ /dev/null @@ -1,121 +0,0 @@ -#include "qdbusobject.h" - -#include <QDebug> - -QDbusObject::QDbusObject() - :m_watchId(0), - m_busType(None), - m_status(QDbusObject::Disconnected) -{ -} - -QDbusObject::~QDbusObject() -{ - if (m_watchId != 0) { - g_bus_unwatch_name (m_watchId); - m_watchId = 0; - } -} - -QDbusObject::BusType QDbusObject::busType() const -{ - return m_busType; -} - -void QDbusObject::setBusType(QDbusObject::BusType type) -{ - if (m_busType != type) { - if (m_status != QDbusObject::Disconnected) - disconnect(); - m_busType = type; - busTypeChanged(m_busType); - } -} - -QString QDbusObject::busName() const -{ - return m_busName; -} - -void QDbusObject::setBusName(const QString &busName) -{ - if (m_busName != busName) { - if (m_status != QDbusObject::Disconnected) - disconnect(); - m_busName = busName; - busNameChanged(m_busName); - } -} - -QString QDbusObject::objectPath() const -{ - return m_objectPath; -} - -void QDbusObject::setObjectPath(const QString &objectPath) -{ - if (m_objectPath != objectPath) { - if (m_status != QDbusObject::Disconnected) - disconnect(); - m_objectPath = objectPath; - objectPathChanged(m_objectPath); - } -} - -void QDbusObject::setStatus(QDbusObject::ConnectionStatus status) -{ - if (m_status != status) { - m_status = status; - statusChanged(m_status); - } -} - -QDbusObject::ConnectionStatus QDbusObject::status() const -{ - return m_status; -} - -void QDbusObject::connect() -{ - 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, - this, - NULL); - - setStatus(QDbusObject::Connecting); - } else { - qWarning() << "Invalid dbus connection args"; - } -} - -void QDbusObject::disconnect() -{ - if (m_status != QDbusObject::Disconnected) { - g_bus_unwatch_name (m_watchId); - m_watchId = 0; - setStatus(QDbusObject::Disconnected); - } -} - -void QDbusObject::onServiceAppeared(GDBusConnection *connection, const gchar *, const gchar *, gpointer data) -{ - QDbusObject *self = reinterpret_cast<QDbusObject*>(data); - - self->setStatus(QDbusObject::Connected); - self->serviceAppear(connection); -} - -void QDbusObject::onServiceFanished(GDBusConnection *connection, const gchar *, gpointer data) -{ - QDbusObject *self = reinterpret_cast<QDbusObject*>(data); - - self->setStatus(QDbusObject::Connecting); - self->serviceVanish(connection); -} diff --git a/src/QMenuModel/qdbusobject.h b/src/QMenuModel/qdbusobject.h deleted file mode 100644 index 0b17ae1..0000000 --- a/src/QMenuModel/qdbusobject.h +++ /dev/null @@ -1,65 +0,0 @@ -#ifndef QDBUSOBJECT_H -#define QDBUSOBJECT_H - -#include <QObject> - -#include <gio/gio.h> - -class QDbusObject -{ -public: - enum BusType { - None = 0, - SessionBus, - SystemBus, - LastBusType - }; - - enum ConnectionStatus { - Disconnected = 0, - Connecting, - Connected - }; - - QDbusObject(); - ~QDbusObject(); - - BusType busType() const; - void setBusType(BusType type); - - QString busName() const; - void setBusName(const QString &busName); - - QString objectPath() const; - void setObjectPath(const QString &busName); - - ConnectionStatus status() const; - - void connect(); - void disconnect(); - -protected: - virtual void serviceAppear(GDBusConnection *connection) = 0; - virtual void serviceVanish(GDBusConnection *connection) = 0; - - // notify functions - virtual void busTypeChanged(BusType type) = 0; - virtual void busNameChanged(const QString &busNameChanged) = 0; - virtual void objectPathChanged(const QString &objectPath) = 0; - virtual void statusChanged(ConnectionStatus status) = 0; - -private: - guint m_watchId; - BusType m_busType; - QString m_busName; - QString m_objectPath; - ConnectionStatus m_status; - - void setStatus(ConnectionStatus status); - - // glib slots - static void onServiceAppeared(GDBusConnection *connection, const gchar *name, const gchar *name_owner, gpointer data); - static void onServiceFanished(GDBusConnection *connection, const gchar *name, gpointer data); -}; - -#endif diff --git a/src/QMenuModel/qmenumodel.cpp b/src/QMenuModel/qmenumodel.cpp deleted file mode 100644 index c7ccf56..0000000 --- a/src/QMenuModel/qmenumodel.cpp +++ /dev/null @@ -1,156 +0,0 @@ -#include "qmenumodel.h" -#include <QDebug> - -QMenuModel::QMenuModel(GMenuModel *other, QObject *parent) - : QAbstractListModel(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"; - } - setRoleNames(rolesNames); - setMenuModel(other); -} - -QMenuModel::~QMenuModel() -{ - setMenuModel(NULL); -} - -void QMenuModel::setMenuModel(GMenuModel *other) -{ - if (m_menuModel == other) { - return; - } - - beginResetModel(); - - if (m_menuModel) { - g_signal_handler_disconnect(m_menuModel, m_signalChangedId); - m_signalChangedId = 0; - g_object_unref(m_menuModel); - } - - m_menuModel = other; - - endResetModel(); - - if (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); - } -} - -GMenuModel *QMenuModel::menuModel() const -{ - return m_menuModel; -} - -/* QAbstractItemModel */ -int QMenuModel::columnCount(const QModelIndex &) const -{ - return 1; -} - -QVariant QMenuModel::data(const QModelIndex &index, int role) const -{ - QVariant attribute; - int rowCountValue = rowCount(); - - if ((rowCountValue > 0) && (index.row() >= 0) && (index.row() < rowCountValue)) { - if (m_menuModel) { - switch (role) - { - case Action: - attribute = getStringAttribute(index, G_MENU_ATTRIBUTE_ACTION); - break; - case Label: - attribute = getStringAttribute(index, G_MENU_ATTRIBUTE_LABEL); - break; - case LinkSection: - attribute = getLink(index, G_MENU_LINK_SECTION); - break; - case LinkSubMenu: - attribute = getLink(index, G_MENU_LINK_SUBMENU); - break; - default: - break; - } - } - } - return attribute; -} - -QModelIndex QMenuModel::parent(const QModelIndex &index) const -{ - return QModelIndex(); -} - -int QMenuModel::rowCount(const QModelIndex &) const -{ - if (m_menuModel) { - return g_menu_model_get_n_items(m_menuModel); - } - return 0; -} - -QVariant QMenuModel::getStringAttribute(const QModelIndex &index, - const QString &attribute) const -{ - QVariant result; - gchar* value = NULL; - g_menu_model_get_item_attribute(m_menuModel, - index.row(), - attribute.toLatin1(), - "s", &value); - if (value) { - result = QVariant(QString::fromLatin1(value)); - g_free(value); - } - return result; -} - -QVariant QMenuModel::getLink(const QModelIndex &index, - const QString &linkName) const -{ - GMenuModel *link; - - link = g_menu_model_get_item_link(m_menuModel, - index.row(), - linkName.toLatin1()); - - if (link) { - QMenuModel *other = new QMenuModel(link, const_cast<QMenuModel*>(this)); - return QVariant::fromValue<QObject*>(other); - } - - return QVariant(); -} - -void QMenuModel::onItemsChanged(GMenuModel *, - gint position, - gint removed, - gint added, - gpointer data) -{ - QMenuModel *self = reinterpret_cast<QMenuModel*>(data); - - if (removed > 0) { - self->beginRemoveRows(QModelIndex(), position, position + removed - 1); - self->endRemoveRows(); - } - - if (added > 0) { - self->beginInsertRows(QModelIndex(), position, position + added - 1); - self->endInsertRows(); - } -} - diff --git a/src/QMenuModel/qmenumodel.h b/src/QMenuModel/qmenumodel.h deleted file mode 100644 index 18ad21c..0000000 --- a/src/QMenuModel/qmenumodel.h +++ /dev/null @@ -1,44 +0,0 @@ -#ifndef QMENUMODEL_H -#define QMENUMODEL_H - -#include <QAbstractListModel> -#include <gio/gio.h> - - -class QMenuModel : public QAbstractListModel -{ - Q_OBJECT - -public: - enum MenuRoles { - Action = 0, - Label, - LinkSection, - LinkSubMenu - }; - - ~QMenuModel(); - - /* QAbstractItemModel */ - int columnCount(const QModelIndex &parent = QModelIndex()) const; - QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const; - QModelIndex parent (const QModelIndex &index) const; - int rowCount(const QModelIndex &parent = QModelIndex()) const; - -protected: - QMenuModel(GMenuModel *other=0, QObject *parent=0); - void setMenuModel(GMenuModel *model); - GMenuModel *menuModel() const; - -private: - GMenuModel *m_menuModel; - guint m_signalChangedId; - - QVariant getStringAttribute(const QModelIndex &index, const QString &attribute) const; - QVariant getLink(const QModelIndex &index, const QString &linkName) const; - - static void onItemsChanged(GMenuModel *model, gint position, gint removed, gint added, gpointer data); - -}; - -#endif |