diff options
author | Lars Uebernickel <lars.uebernickel@canonical.com> | 2013-06-24 12:10:56 -0400 |
---|---|---|
committer | Lars Uebernickel <lars.uebernickel@canonical.com> | 2013-06-24 12:10:56 -0400 |
commit | bf4e73f64ddc76a8c1ed98bddcb665401adc5402 (patch) | |
tree | 58387418678e3b6c5cc6f4e49cb7bccdb7fca8d8 /libqmenumodel/src/unitymenumodel.cpp | |
parent | 45ffd9162f48bab8607a426b72b38f937f4b65f3 (diff) | |
download | qmenumodel-bf4e73f64ddc76a8c1ed98bddcb665401adc5402.tar.gz qmenumodel-bf4e73f64ddc76a8c1ed98bddcb665401adc5402.tar.bz2 qmenumodel-bf4e73f64ddc76a8c1ed98bddcb665401adc5402.zip |
Move unityqmlmenumodel's properties to unitymenumodel
This gets rid of the ad-hoc construct-only properties and ::init() vfunc. Names
and paths can now be changed after creating the menu model. This will probably
be used seldom in practice, but it makes the code a bit cleaner.
Unityqmlmenumodel doesn't do anything interesting right now.
Diffstat (limited to 'libqmenumodel/src/unitymenumodel.cpp')
-rw-r--r-- | libqmenumodel/src/unitymenumodel.cpp | 175 |
1 files changed, 115 insertions, 60 deletions
diff --git a/libqmenumodel/src/unitymenumodel.cpp b/libqmenumodel/src/unitymenumodel.cpp index 45cb9c4..ba1fac4 100644 --- a/libqmenumodel/src/unitymenumodel.cpp +++ b/libqmenumodel/src/unitymenumodel.cpp @@ -29,8 +29,8 @@ G_DEFINE_QUARK (UNITY_SUBMENU_MODEL, unity_submenu_model) class UnityMenuModelPrivate { public: - static UnityMenuModelPrivate * forBusMenu(UnityMenuModel *model, const QByteArray &busName, - const QByteArray &actionGroupObjectPath, const QByteArray &menuObjectPath); + UnityMenuModelPrivate(UnityMenuModel *model); + static UnityMenuModelPrivate * forSubMenu(UnityMenuModel *model, GtkMenuTrackerItem *item); ~UnityMenuModelPrivate(); @@ -39,14 +39,20 @@ public: void activate(int position); UnityMenuModel * submenu(int position); -private: - UnityMenuModelPrivate(UnityMenuModel *model); + void clearItems(bool resetModel=true); + void clearName(); + void updateActions(); + void updateMenuModel(); UnityMenuModel *model; GtkActionMuxer *muxer; GtkMenuTracker *menutracker; GSequence *items; - QByteArray actionGroupObjectPath; + GDBusConnection *connection; + QByteArray busName; + QByteArray nameOwner; + guint nameWatchId; + QByteArray actionObjectPath; QByteArray menuObjectPath; static void freeMenuItem(gpointer data, gpointer user_data); @@ -77,6 +83,7 @@ UnityMenuModelPrivate::UnityMenuModelPrivate(UnityMenuModel *model) { this->model = model; this->menutracker = NULL; + this->nameWatchId = 0; this->muxer = gtk_action_muxer_new (); g_object_set_qdata (G_OBJECT (this->muxer), unity_menu_model_quark (), model); @@ -84,20 +91,6 @@ UnityMenuModelPrivate::UnityMenuModelPrivate(UnityMenuModel *model) this->items = g_sequence_new (NULL); } -UnityMenuModelPrivate * UnityMenuModelPrivate::forBusMenu(UnityMenuModel *model, const QByteArray &busName, - const QByteArray &actionGroupObjectPath, const QByteArray &menuObjectPath) -{ - UnityMenuModelPrivate *priv = new UnityMenuModelPrivate(model); - - priv->actionGroupObjectPath = actionGroupObjectPath; - priv->menuObjectPath = menuObjectPath; - - g_bus_watch_name (G_BUS_TYPE_SESSION, busName.constData(), G_BUS_NAME_WATCHER_FLAGS_AUTO_START, - nameAppeared, nameVanished, priv, NULL); - - return priv; -} - UnityMenuModelPrivate * UnityMenuModelPrivate::forSubMenu(UnityMenuModel *model, GtkMenuTrackerItem *item) { UnityMenuModelPrivate *priv = new UnityMenuModelPrivate(model); @@ -109,17 +102,18 @@ UnityMenuModelPrivate * UnityMenuModelPrivate::forSubMenu(UnityMenuModel *model, UnityMenuModelPrivate::~UnityMenuModelPrivate() { - if (this->items) { - g_sequence_foreach_iter_range (g_sequence_get_begin_iter (this->items), g_sequence_get_end_iter (this->items), - freeMenuItem, NULL); - g_sequence_free (this->items); - } + this->clearItems(false); if (this->menutracker) gtk_menu_tracker_free (this->menutracker); if (this->muxer) g_object_unref (this->muxer); + + g_clear_object (&this->connection); + + if (this->nameWatchId) + g_bus_unwatch_name (this->nameWatchId); } int UnityMenuModelPrivate::nrItems() @@ -190,45 +184,81 @@ void UnityMenuModelPrivate::freeMenuItem (gpointer data, gpointer user_data) g_object_unref (item); } -void UnityMenuModelPrivate::nameAppeared(GDBusConnection *connection, const gchar *name, const gchar *owner, gpointer user_data) +void UnityMenuModelPrivate::clearItems(bool resetModel) { - UnityMenuModelPrivate *priv = (UnityMenuModelPrivate *)user_data; - GDBusActionGroup *actions; - GDBusMenuModel *menu; + GSequenceIter *begin; + GSequenceIter *end; + + if (resetModel) + model->beginResetModel(); - priv->model->beginResetModel(); + begin = g_sequence_get_begin_iter (this->items); + end = g_sequence_get_end_iter (this->items); + g_sequence_foreach_iter_range (begin, end, freeMenuItem, NULL); + g_sequence_remove_range (begin, end); - actions = g_dbus_action_group_get (connection, owner, priv->actionGroupObjectPath.constData()); - menu = g_dbus_menu_model_get (connection, owner, priv->menuObjectPath.constData()); + if (resetModel) + model->endResetModel(); +} - gtk_action_muxer_insert (priv->muxer, "indicator", G_ACTION_GROUP (actions)); - priv->menutracker = gtk_menu_tracker_new (GTK_ACTION_OBSERVABLE (priv->muxer), - G_MENU_MODEL (menu), TRUE, "indicator", - menuItemInserted, menuItemRemoved, priv); +void UnityMenuModelPrivate::clearName() +{ + this->clearItems(); - priv->model->endResetModel(); + this->nameOwner = QByteArray(); - g_object_unref (menu); - g_object_unref (actions); + this->updateActions(); + this->updateMenuModel(); } -void UnityMenuModelPrivate::nameVanished(GDBusConnection *connection, const gchar *name, gpointer user_data) +void UnityMenuModelPrivate::updateActions() +{ + if (!this->nameOwner.isEmpty()) { + GDBusActionGroup *actions; + + actions = g_dbus_action_group_get (this->connection, this->nameOwner, this->actionObjectPath.constData()); + gtk_action_muxer_insert (this->muxer, "indicator", G_ACTION_GROUP (actions)); + + g_object_unref (actions); + } + else { + gtk_action_muxer_remove (this->muxer, "indicator"); + } +} + +void UnityMenuModelPrivate::updateMenuModel() +{ + this->clearItems(); + g_clear_pointer (&this->menutracker, gtk_menu_tracker_free); + + if (!this->nameOwner.isEmpty()) { + GDBusMenuModel *menu; + + menu = g_dbus_menu_model_get (this->connection, this->nameOwner, this->menuObjectPath.constData()); + this->menutracker = gtk_menu_tracker_new (GTK_ACTION_OBSERVABLE (this->muxer), + G_MENU_MODEL (menu), TRUE, "indicator", + menuItemInserted, menuItemRemoved, this); + + g_object_unref (menu); + } +} + +void UnityMenuModelPrivate::nameAppeared(GDBusConnection *connection, const gchar *name, const gchar *owner, gpointer user_data) { UnityMenuModelPrivate *priv = (UnityMenuModelPrivate *)user_data; - GSequenceIter *begin; - GSequenceIter *end; - priv->model->beginResetModel(); + priv->connection = (GDBusConnection *) g_object_ref (connection); + priv->nameOwner = owner; - begin = g_sequence_get_begin_iter (priv->items); - end = g_sequence_get_end_iter (priv->items); - g_sequence_foreach_iter_range (begin, end, freeMenuItem, NULL); - g_sequence_remove_range (begin, end); + priv->updateActions(); + priv->updateMenuModel(); +} - gtk_action_muxer_remove (priv->muxer, "indicator"); - g_clear_pointer (&priv->menutracker, gtk_menu_tracker_free); +void UnityMenuModelPrivate::nameVanished(GDBusConnection *connection, const gchar *name, gpointer user_data) +{ + UnityMenuModelPrivate *priv = (UnityMenuModelPrivate *)user_data; - priv->model->endResetModel(); + priv->clearName(); } void UnityMenuModelPrivate::menuItemInserted(GtkMenuTrackerItem *item, gint position, gpointer user_data) @@ -278,26 +308,51 @@ void UnityMenuModelPrivate::menuItemChanged(GObject *object, GParamSpec *pspec, UnityMenuModel::UnityMenuModel(QObject *parent): QAbstractListModel(parent) { + priv = new UnityMenuModelPrivate(this); +} + +UnityMenuModel::~UnityMenuModel() +{ + delete priv; } -UnityMenuModel::UnityMenuModel(const QByteArray &busName, - const QByteArray &actionGroupObjectPath, - const QByteArray &menuObjectPath, - QObject *parent): - QAbstractListModel(parent), - priv(NULL) +QByteArray UnityMenuModel::busName() const { - init(busName, actionGroupObjectPath, menuObjectPath); + return priv->busName; } -void UnityMenuModel::init(const QByteArray &busName, const QByteArray &actionGroupObjectPath, const QByteArray &menuObjectPath) +void UnityMenuModel::setBusName(const QByteArray &name) { - priv = UnityMenuModelPrivate::forBusMenu(this, busName, actionGroupObjectPath, menuObjectPath); + priv->clearName(); + + if (priv->nameWatchId) + g_bus_unwatch_name (priv->nameWatchId); + + priv->nameWatchId = g_bus_watch_name (G_BUS_TYPE_SESSION, name.constData(), G_BUS_NAME_WATCHER_FLAGS_AUTO_START, + UnityMenuModelPrivate::nameAppeared, UnityMenuModelPrivate::nameVanished, + priv, NULL); } -UnityMenuModel::~UnityMenuModel() +QByteArray UnityMenuModel::actionObjectPath() const { - delete priv; + return priv->actionObjectPath; +} + +void UnityMenuModel::setActionObjectPath(const QByteArray &path) +{ + priv->actionObjectPath = path; + priv->updateActions(); +} + +QByteArray UnityMenuModel::menuObjectPath() const +{ + return priv->menuObjectPath; +} + +void UnityMenuModel::setMenuObjectPath(const QByteArray &path) +{ + priv->menuObjectPath = path; + priv->updateMenuModel(); } int UnityMenuModel::rowCount(const QModelIndex &parent) const |