[Top][All Lists]
[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);
- [Pan-users] [0.97] PATCH: tree expanders,
Charles Kerr <=