pan-users
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Pan-users] [0.97] PATCH: tree expanders


From: Charles Kerr
Subject: [Pan-users] [0.97] PATCH: tree expanders
Date: Mon, 15 May 2006 14:34:28 -0500
User-agent: Mozilla Thunderbird 1.0.8-1.4.1 (X11/20060420)

This seems to fix the tree expander bugs reported yesterday by
walt, doktorseven and Duncan.

Charles
diff -u pan/gui-bak/group-pane.cc pan/gui/group-pane.cc
--- pan/gui-bak/group-pane.cc   2006-05-15 14:22:21.000000000 -0500
+++ pan/gui/group-pane.cc       2006-05-15 14:22:41.000000000 -0500
@@ -251,13 +251,56 @@
   g_idle_add (on_row_activated_idle, pane_g);
 }
 
+namespace
+{
+  bool row_collapsed_or_expanded (false);
+
+  void row_collapsed_or_expanded_cb (GtkTreeView *view, GtkTreeIter *iter, 
GtkTreePath *path, gpointer unused)
+  {
+    row_collapsed_or_expanded = true;
+  }
+
+  struct Blah
+  {
+    GtkTreeView * view;
+    GtkTreePath * path;
+    GtkTreeViewColumn * col;
+  };
+
+  gboolean maybe_activate_on_idle_idle (gpointer blah_gpointer)
+  {
+    Blah * blah = (Blah*) blah_gpointer;
+    if (!row_collapsed_or_expanded)
+      gtk_tree_view_row_activated (blah->view, blah->path, blah->col);
+    gtk_tree_path_free (blah->path);
+    g_free (blah);
+    return false;
+  }
+
+  /**
+   * There doesn't seem to be any way to see if a mouse click in a tree view
+   * happened on the expander or elsewhere in a row, so when deciding whether 
or
+   * not to activate a row on single click, let's wait and see if a row 
expands or
+   * collapses.
+   */
+  void maybe_activate_on_idle (GtkTreeView *view, GtkTreePath *path, 
GtkTreeViewColumn *col)
+  {
+    row_collapsed_or_expanded = false;
+    Blah * blah = (Blah*) g_new (Blah, 1);
+    blah->view = view;
+    blah->path = path;
+    blah->col = col;
+    g_idle_add (maybe_activate_on_idle_idle, blah);
+  } 
+}
+
 gboolean
 GroupPane :: on_button_pressed (GtkWidget *treeview, GdkEventButton *event, 
gpointer userdata)
 {
   GroupPane * pane (static_cast<GroupPane*>(userdata));
 
   // single click with the right mouse button?
-  if (event->type == GDK_BUTTON_PRESS  &&  event->button == 3)
+  if (event->type == GDK_BUTTON_PRESS && event->button == 3)
   {
     GtkTreeSelection * selection = 
gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview));
     GtkTreePath * path;
@@ -271,20 +314,21 @@
     do_popup_menu (treeview, event, userdata);
     return true;
   }
-  else if (pane->_prefs.get_flag("single-click-activates-group", true)
-           && event->type == GDK_BUTTON_PRESS
-           && event->button == 1)
+  else if (pane->_prefs.get_flag("single-click-activates-group",true)
+           && (event->type == GDK_BUTTON_RELEASE)
+           && (event->button == 1)
+           && (event->send_event == false)
+           && (event->window == gtk_tree_view_get_bin_window 
(GTK_TREE_VIEW(treeview)))
+           && !(event->state & 
(GDK_SHIFT_MASK|GDK_CONTROL_MASK|GDK_MOD1_MASK)))
   {
     GtkTreePath * path;
     GtkTreeViewColumn * col;
+    gint cell_x(0), cell_y(0);
     if (gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(treeview),
-                                      (gint) event->x, 
+                                      (gint) event->x,
                                       (gint) event->y,
-                                      &path, &col, NULL, NULL))
-    {
-      gtk_tree_view_row_activated (GTK_TREE_VIEW(treeview), path, col);
-      gtk_tree_path_free(path);
-    }
+                                      &path, &col, &cell_x, &cell_y))
+      maybe_activate_on_idle (GTK_TREE_VIEW(treeview), path, col);
   }
 
   return false;
@@ -704,7 +748,10 @@
   gtk_tree_view_set_fixed_height_mode (GTK_TREE_VIEW(_tree_view), true);
 #endif
 
+  g_signal_connect (_tree_view, "row_collapsed", 
G_CALLBACK(row_collapsed_or_expanded_cb), 0);
+  g_signal_connect (_tree_view, "row_expanded", 
G_CALLBACK(row_collapsed_or_expanded_cb), 0);
   g_signal_connect (_tree_view, "button-press-event", 
G_CALLBACK(on_button_pressed), this);
+  g_signal_connect (_tree_view, "button-release-event", 
G_CALLBACK(on_button_pressed), this);
   g_signal_connect (_tree_view, "popup-menu", G_CALLBACK(on_popup_menu), this);
   g_signal_connect (_tree_view, "row-activated", G_CALLBACK(on_row_activated), 
this);
   g_object_unref (G_OBJECT(_tree_store));
diff -u pan/gui-bak/header-pane.cc pan/gui/header-pane.cc
--- pan/gui-bak/header-pane.cc  2006-05-15 14:22:22.000000000 -0500
+++ pan/gui/header-pane.cc      2006-05-15 14:27:50.000000000 -0500
@@ -1013,7 +1013,48 @@
     return true;
   }
 }
+namespace
+{
+  bool row_collapsed_or_expanded (false);
+
+  void row_collapsed_or_expanded_cb (GtkTreeView *view, GtkTreeIter *iter, 
GtkTreePath *path, gpointer unused)
+  {
+    row_collapsed_or_expanded = true;
+  }
+
+  struct Blah
+  {
+    GtkTreeView * view;
+    GtkTreePath * path;
+    GtkTreeViewColumn * col;
+  };
 
+  gboolean maybe_activate_on_idle_idle (gpointer blah_gpointer)
+  {
+    Blah * blah = (Blah*) blah_gpointer;
+    if (!row_collapsed_or_expanded)
+      gtk_tree_view_row_activated (blah->view, blah->path, blah->col);
+    gtk_tree_path_free (blah->path);
+    g_free (blah);
+    return false;
+  }
+
+  /**
+   * There doesn't seem to be any way to see if a mouse click in a tree view
+   * happened on the expander or elsewhere in a row, so when deciding whether 
or
+   * not to activate a row on single click, let's wait and see if a row 
expands or
+   * collapses.
+   */
+  void maybe_activate_on_idle (GtkTreeView *view, GtkTreePath *path, 
GtkTreeViewColumn *col)
+  {
+    row_collapsed_or_expanded = false;
+    Blah * blah = (Blah*) g_new (Blah, 1);
+    blah->view = view;
+    blah->path = path;
+    blah->col = col;
+    g_idle_add (maybe_activate_on_idle_idle, blah);
+  }
+}
 
 gboolean
 HeaderPane :: on_button_pressed (GtkWidget * treeview, GdkEventButton *event, 
gpointer userdata)
@@ -1044,6 +1085,7 @@
            && (event->type == GDK_BUTTON_RELEASE)
            && (event->button == 1)
            && (event->window == gtk_tree_view_get_bin_window 
(GTK_TREE_VIEW(treeview)))
+           && (event->send_event == false)
            && !(event->state & 
(GDK_SHIFT_MASK|GDK_CONTROL_MASK|GDK_MOD1_MASK)))
   {
     GtkTreePath * path;
@@ -1053,14 +1095,7 @@
                                       (gint) event->x,
                                       (gint) event->y,
                                       &path, &col, &cell_x, &cell_y))
-    {
-      // get the cell area to make sure they didn't click on an expander.
-  //    GdkRectangle rect;
-  //    gtk_tree_view_get_cell_area (GTK_TREE_VIEW(treeview), path, col, 
&rect);
-  //    if (rect.x<=cell_x && cell_x<(rect.x+rect.width) && rect.y<=cell_y && 
cell_y<(rect.y+rect.height))
-        gtk_tree_view_row_activated (GTK_TREE_VIEW(treeview), path, col);
-      gtk_tree_path_free(path);
-    }
+      maybe_activate_on_idle (GTK_TREE_VIEW(treeview), path, col);
   }
 
   return false;
@@ -1602,6 +1637,8 @@
 
   g_signal_connect (_tree_view, "button-release-event", 
G_CALLBACK(on_button_pressed), this);
   g_signal_connect (_tree_view, "button-press-event", 
G_CALLBACK(on_button_pressed), this);
+  g_signal_connect (_tree_view, "row-collapsed", 
G_CALLBACK(row_collapsed_or_expanded_cb), NULL);
+  g_signal_connect (_tree_view, "row-expanded", 
G_CALLBACK(row_collapsed_or_expanded_cb), NULL);
   g_signal_connect (_tree_view, "popup-menu", G_CALLBACK(on_popup_menu), this);
   g_signal_connect (_tree_view, "row-activated", G_CALLBACK(on_row_activated), 
this);
   GtkWidget * scroll = gtk_scrolled_window_new (0, 0);

reply via email to

[Prev in Thread] Current Thread [Next in Thread]