ekiga r6495 - trunk/lib/engine/gui/gtk-frontend
- From: jpuydt svn gnome org
- To: svn-commits-list gnome org
- Subject: ekiga r6495 - trunk/lib/engine/gui/gtk-frontend
- Date: Thu, 24 Jul 2008 20:17:33 +0000 (UTC)
Author: jpuydt
Date: Thu Jul 24 20:17:33 2008
New Revision: 6495
URL: http://svn.gnome.org/viewvc/ekiga?rev=6495&view=rev
Log:
Refactored the code handling clicks in RosterViewGtk, to make it more readable and easier to extend
Modified:
trunk/lib/engine/gui/gtk-frontend/roster-view-gtk.cpp
Modified: trunk/lib/engine/gui/gtk-frontend/roster-view-gtk.cpp
==============================================================================
--- trunk/lib/engine/gui/gtk-frontend/roster-view-gtk.cpp (original)
+++ trunk/lib/engine/gui/gtk-frontend/roster-view-gtk.cpp Thu Jul 24 20:17:33 2008
@@ -108,6 +108,18 @@
* Helpers
*/
+/* DESCRIPTION : Set of functions called when the user clicks in a view
+ * BEHAVIOUR : Folds/unfolds, shows a menu or triggers default action
+ */
+static void on_clicked_show_heap_menu (Ekiga::Heap* heap,
+ GdkEventButton* event);
+static void on_clicked_show_presentity_menu (Ekiga::Presentity* presentity,
+ GdkEventButton* event);
+
+static void on_clicked_fold (RosterViewGtk* self,
+ GtkTreePath* path,
+ const gchar* name);
+
/* DESCRIPTION : Called whenever a (online/total) count has to be updated
* BEHAVIOUR : Updates things...
* PRE : Both arguments have to be correct
@@ -316,6 +328,80 @@
/* Implementation of the helpers */
static void
+on_clicked_show_heap_menu (Ekiga::Heap* heap,
+ GdkEventButton* event)
+{
+ MenuBuilderGtk builder;
+ heap->populate_menu (builder);
+ if (!builder.empty ()) {
+
+ gtk_widget_show_all (builder.menu);
+ gtk_menu_popup (GTK_MENU (builder.menu), NULL, NULL,
+ NULL, NULL, event->button, event->time);
+ g_signal_connect (G_OBJECT (builder.menu), "hide",
+ GTK_SIGNAL_FUNC (g_object_unref),
+ (gpointer) builder.menu);
+ }
+ g_object_ref_sink (G_OBJECT (builder.menu));
+
+}
+
+static void
+on_clicked_show_presentity_menu (Ekiga::Presentity* presentity,
+ GdkEventButton* event)
+{
+ MenuBuilderGtk builder;
+ presentity->populate_menu (builder);
+ if (!builder.empty ()) {
+
+ gtk_widget_show_all (builder.menu);
+ gtk_menu_popup (GTK_MENU (builder.menu), NULL, NULL,
+ NULL, NULL, event->button, event->time);
+ g_signal_connect (G_OBJECT (builder.menu), "hide",
+ GTK_SIGNAL_FUNC (g_object_unref),
+ (gpointer) builder.menu);
+ }
+ g_object_ref_sink (G_OBJECT (builder.menu));
+}
+
+static void
+on_clicked_fold (RosterViewGtk* self,
+ GtkTreePath* path,
+ const gchar* name)
+{
+ gboolean row_expanded = TRUE;
+ GSList* existing_group = NULL;
+
+ row_expanded
+ = gtk_tree_view_row_expanded (GTK_TREE_VIEW (self->priv->tree_view), path);
+
+ existing_group = g_slist_find_custom (self->priv->folded_groups,
+ name,
+ (GCompareFunc) g_ascii_strcasecmp);
+ if (!row_expanded) {
+
+ if (existing_group == NULL) {
+ self->priv->folded_groups = g_slist_append (self->priv->folded_groups,
+ g_strdup (name));
+ }
+ }
+ else {
+
+ if (existing_group != NULL) {
+
+ self->priv->folded_groups
+ = g_slist_remove_link (self->priv->folded_groups, existing_group);
+
+ g_free ((gchar *) existing_group->data);
+ g_slist_free_1 (existing_group);
+ }
+ }
+
+ gm_conf_set_string_list ("/apps/" PACKAGE_NAME "/contacts/roster_folded_groups",
+ self->priv->folded_groups);
+}
+
+static void
update_offline_count (RosterViewGtk* self,
GtkTreeIter* iter)
{
@@ -365,7 +451,7 @@
g_return_if_fail (data != NULL);
self = ROSTER_VIEW_GTK (data);
-
+
if (gm_conf_entry_get_type (entry) == GM_CONF_BOOL) {
show_offline_contacts = gm_conf_entry_get_bool (entry);
@@ -388,7 +474,7 @@
do {
update_offline_count (self, &iter);
- } while (gtk_tree_model_iter_next (model, &iter));
+ } while (gtk_tree_model_iter_next (model, &iter));
}
} while (gtk_tree_model_iter_next (model, &heap_iter));
}
@@ -404,127 +490,63 @@
{
RosterViewGtk *self = NULL;
GtkTreeModel *model = NULL;
-
GtkTreePath *path = NULL;
GtkTreeIter iter;
- gint column_type;
- gchar *name = NULL;
- gboolean row_expanded = TRUE;
- GSList *existing_group = NULL;
-
- Ekiga::Heap *heap = NULL;
- Ekiga::Presentity *presentity = NULL;
self = ROSTER_VIEW_GTK (data);
model = gtk_tree_view_get_model (self->priv->tree_view);
- if (event->type == GDK_BUTTON_PRESS || event->type == GDK_KEY_PRESS) {
-
-
- if (gtk_tree_view_get_path_at_pos (GTK_TREE_VIEW (tree_view),
- (gint) event->x, (gint) event->y,
- &path, NULL, NULL, NULL)) {
-
- if (gtk_tree_model_get_iter (model, &iter, path)) {
-
- gtk_tree_model_get (model, &iter,
- COLUMN_NAME, &name,
- COLUMN_TYPE, &column_type,
- COLUMN_HEAP, &heap,
- COLUMN_PRESENTITY, &presentity,
- -1);
-
- if (event->button == 3) {
-
- switch (column_type) {
-
- case TYPE_HEAP:
- {
- MenuBuilderGtk builder;
- heap->populate_menu (builder);
- if (!builder.empty ()) {
-
- gtk_widget_show_all (builder.menu);
- gtk_menu_popup (GTK_MENU (builder.menu), NULL, NULL,
- NULL, NULL, event->button, event->time);
- g_signal_connect (G_OBJECT (builder.menu), "hide",
- GTK_SIGNAL_FUNC (g_object_unref),
- (gpointer) builder.menu);
- }
- g_object_ref_sink (G_OBJECT (builder.menu));
- break;
- }
-
- case TYPE_GROUP:
-
- /* FIXME: what about making it possible for a heap to have actions on groups?
- * It would allow for example (and optional to each Heap) group renaming,
- * or group invitations to a MUC or anything collaborative!
- * What is needed is :
- * - store_set the &heap when adding a group so we have access to it here in heap
- * - in this function we should also store_get on COLUMN_NAME to have the group name
- * (don't forget the g_free!)
- * - add the proper populate_group_menu api to Ekiga::Heap
- */
- break;
-
- case TYPE_PRESENTITY:
- {
- MenuBuilderGtk builder;
- presentity->populate_menu (builder);
- if (!builder.empty ()) {
-
- gtk_widget_show_all (builder.menu);
- gtk_menu_popup (GTK_MENU (builder.menu), NULL, NULL,
- NULL, NULL, event->button, event->time);
- g_signal_connect (G_OBJECT (builder.menu), "hide",
- GTK_SIGNAL_FUNC (g_object_unref),
- (gpointer) builder.menu);
- }
- g_object_ref_sink (G_OBJECT (builder.menu));
- break;
- }
-
- default:
- break; // shouldn't happen
- }
- }
- else {
+ if (gtk_tree_view_get_path_at_pos (GTK_TREE_VIEW (tree_view),
+ (gint) event->x, (gint) event->y,
+ &path, NULL, NULL, NULL)) {
+
+ if (gtk_tree_model_get_iter (model, &iter, path)) {
+
+ gint column_type;
+ gchar *name = NULL;
+ Ekiga::Heap *heap = NULL;
+ Ekiga::Presentity *presentity = NULL;
+ gtk_tree_model_get (model, &iter,
+ COLUMN_NAME, &name,
+ COLUMN_TYPE, &column_type,
+ COLUMN_HEAP, &heap,
+ COLUMN_PRESENTITY, &presentity,
+ -1);
- if (event->button == 1
- && name
- && (column_type == TYPE_HEAP || column_type == TYPE_GROUP)) {
+ switch (column_type) {
- row_expanded = gtk_tree_view_row_expanded (GTK_TREE_VIEW (tree_view), path);
- existing_group = g_slist_find_custom (self->priv->folded_groups,
- name,
- (GCompareFunc) g_ascii_strcasecmp);
- if (!row_expanded) {
+ case TYPE_HEAP:
- if (existing_group == NULL) {
- self->priv->folded_groups = g_slist_append (self->priv->folded_groups, g_strdup (name));
- }
- }
- else {
-
- if (existing_group != NULL) {
-
- self->priv->folded_groups = g_slist_remove_link (self->priv->folded_groups, existing_group);
-
- g_free ((gchar *) existing_group->data);
- g_slist_free_1 (existing_group);
- }
- }
- }
+ if (event->type == GDK_BUTTON_PRESS && event->button == 1 && name)
+ on_clicked_fold (self, path, name);
+ if (event->type == GDK_BUTTON_PRESS && event->button == 3)
+ on_clicked_show_heap_menu (heap, event);
+ break;
+ case TYPE_GROUP:
+
+ if (event->type == GDK_BUTTON_PRESS && event->button == 1 && name)
+ on_clicked_fold (self, path, name);
+ /* FIXME: what about making it possible for a heap to have actions on groups?
+ * It would allow for example (and optional to each Heap) group renaming,
+ * or group invitations to a MUC or anything collaborative!
+ * What is needed is :
+ * - store_set the &heap when adding a group so we have access to it here in heap
+ * - in this function we should also store_get on COLUMN_NAME to have the group name
+ * (don't forget the g_free!)
+ * - add the proper populate_group_menu api to Ekiga::Heap
+ */
+ break;
+ case TYPE_PRESENTITY:
+
+ if (event->type == GDK_BUTTON_PRESS && event->button == 3)
+ on_clicked_show_presentity_menu (presentity, event);
+ break;
+ default:
- gm_conf_set_string_list ("/apps/" PACKAGE_NAME "/contacts/roster_folded_groups",
- self->priv->folded_groups);
- }
+ break; // shouldn't happen
}
-
g_free (name);
}
-
gtk_tree_path_free (path);
}
@@ -731,7 +753,7 @@
COLUMN_NAME, presentity.get_name ().c_str (),
COLUMN_STATUS, presentity.get_status ().c_str (),
COLUMN_PRESENCE, presentity.get_presence ().c_str (),
- COLUMN_ACTIVE, (!active || away) ? "gray" : "black",
+ COLUMN_ACTIVE, (!active || away) ? "gray" : "black",
-1);
}
@@ -746,7 +768,7 @@
COLUMN_NAME, presentity.get_name ().c_str (),
COLUMN_STATUS, presentity.get_status ().c_str (),
COLUMN_PRESENCE, presentity.get_presence ().c_str (),
- COLUMN_ACTIVE, active ? "black" : "gray",
+ COLUMN_ACTIVE, active ? "black" : "gray",
-1);
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]