diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/ephy-marshal.list | 1 | ||||
-rw-r--r-- | lib/widgets/ephy-node-view.c | 132 | ||||
-rw-r--r-- | lib/widgets/ephy-node-view.h | 5 |
3 files changed, 116 insertions, 22 deletions
diff --git a/lib/ephy-marshal.list b/lib/ephy-marshal.list index 425418825..a31b373fc 100644 --- a/lib/ephy-marshal.list +++ b/lib/ephy-marshal.list @@ -3,6 +3,7 @@ BOOLEAN:OBJECT BOOLEAN:STRING, STRING VOID:INT,INT VOID:POINTER,INT +VOID:POINTER,BOOLEAN VOID:POINTER,POINTER VOID:STRING,INT VOID:STRING,INT,INT diff --git a/lib/widgets/ephy-node-view.c b/lib/widgets/ephy-node-view.c index 2416f4101..fecb90799 100644 --- a/lib/widgets/ephy-node-view.c +++ b/lib/widgets/ephy-node-view.c @@ -26,6 +26,7 @@ #include <gtk/gtktreeviewcolumn.h> #include <gtk/gtkcellrenderertext.h> #include <gtk/gtkcellrendererpixbuf.h> +#include <gtk/gtkcellrenderertoggle.h> #include <gtk/gtktreemodelfilter.h> #include <gtk/gtkwindow.h> #include <gdk/gdkkeysyms.h> @@ -55,6 +56,7 @@ struct EphyNodeViewPrivate GtkCellRenderer *editable_renderer; GtkTreeViewColumn *editable_column; int editable_node_column; + int toggle_column; EphyNodeFilter *filter; @@ -65,7 +67,7 @@ struct EphyNodeViewPrivate guint priority_prop_id; int priority_column; - gboolean editing; + EphyNode *edited_node; int editable_property; int searchable_data_column; @@ -84,6 +86,7 @@ struct EphyNodeViewPrivate enum { + NODE_TOGGLED, NODE_ACTIVATED, NODE_SELECTED, NODE_DROPPED, @@ -588,6 +591,31 @@ ephy_node_view_row_activated_cb (GtkTreeView *treeview, g_signal_emit (G_OBJECT (view), ephy_node_view_signals[NODE_ACTIVATED], 0, node); } +static void +path_toggled (GtkTreeModel *dummy_model, GtkTreePath *path, + GtkTreeIter *dummy, gpointer data) +{ + EphyNodeView *view = EPHY_NODE_VIEW (data); + gboolean checked; + EphyNode *node; + GtkTreeIter iter, iter2; + GValue value = {0, }; + + gtk_tree_model_get_iter (view->priv->sortmodel, &iter, path); + gtk_tree_model_sort_convert_iter_to_child_iter + (GTK_TREE_MODEL_SORT (view->priv->sortmodel), &iter2, &iter); + gtk_tree_model_filter_convert_iter_to_child_iter + (GTK_TREE_MODEL_FILTER (view->priv->filtermodel), &iter, &iter2); + + node = ephy_tree_model_node_node_from_iter (view->priv->nodemodel, &iter); + gtk_tree_model_get_value (GTK_TREE_MODEL (view->priv->nodemodel), &iter, + view->priv->toggle_column, &value); + checked = !g_value_get_boolean (&value); + + g_signal_emit (G_OBJECT (view), ephy_node_view_signals[NODE_TOGGLED], 0, + node, checked); +} + static gboolean ephy_node_view_key_press_cb (GtkTreeView *treeview, GdkEventKey *event, @@ -597,8 +625,21 @@ ephy_node_view_key_press_cb (GtkTreeView *treeview, unicode = gdk_keyval_to_unicode (event->keyval); - if ((event->state & GDK_SHIFT_MASK) && - (event->keyval == GDK_F10)) + if (event->keyval == GDK_space || + event->keyval == GDK_Return || + event->keyval == GDK_KP_Enter) + { + if (view->priv->toggle_column >= 0) + { + GtkTreeSelection *selection; + + selection = gtk_tree_view_get_selection (treeview); + gtk_tree_selection_selected_foreach + (selection, path_toggled, view); + } + } + else if ((event->state & GDK_SHIFT_MASK) && + (event->keyval == GDK_F10)) { g_signal_emit (G_OBJECT (view), ephy_node_view_signals[SHOW_POPUP], 0); @@ -631,16 +672,13 @@ static GList * get_selection_refs (GtkTreeView *tree_view) { GtkTreeSelection *selection; - GList *ref_list; - - ref_list = NULL; - + GList *ref_list = NULL; + selection = gtk_tree_view_get_selection (tree_view); gtk_tree_selection_selected_foreach (selection, selection_foreach, &ref_list); - ref_list = g_list_reverse (ref_list); - + ref_list = g_list_reverse (ref_list); return ref_list; } @@ -827,10 +865,17 @@ ephy_node_view_button_press_cb (GtkWidget *treeview, } else if (event->button == 1) { - view->priv->drag_started = FALSE; - view->priv->drag_button = event->button; - view->priv->drag_x = event->x; - view->priv->drag_y = event->y; + if (view->priv->toggle_column >= 0) + { + path_toggled (NULL, path, NULL, view); + } + else + { + view->priv->drag_started = FALSE; + view->priv->drag_button = event->button; + view->priv->drag_x = event->x; + view->priv->drag_y = event->y; + } } gtk_tree_path_free (path); @@ -940,7 +985,7 @@ cell_renderer_edited (GtkCellRendererText *cell, GtkTreeIter iter, iter2; EphyNode *node; - view->priv->editing = FALSE; + view->priv->edited_node = NULL; g_object_set (G_OBJECT (view->priv->editable_renderer), "editable", FALSE, @@ -964,6 +1009,13 @@ cell_renderer_edited (GtkCellRendererText *cell, gtk_tree_path_free (path); } +static void +renderer_editing_canceled_cb (GtkCellRendererText *cell, + EphyNodeView *view) +{ + ephy_node_unref (view->priv->edited_node); +} + static inline int compare_string_values (const GValue *a_value, const GValue *b_value) { @@ -1198,7 +1250,11 @@ ephy_node_view_add_column (EphyNodeView *view, view->priv->editable_column = gcolumn; view->priv->editable_node_column = column; view->priv->editable_property = prop_id; - g_signal_connect (renderer, "edited", G_CALLBACK (cell_renderer_edited), view); + + g_signal_connect (renderer, "edited", + G_CALLBACK (cell_renderer_edited), view); + g_signal_connect (renderer, "editing-canceled", + G_CALLBACK (renderer_editing_canceled_cb), view); } if ((flags & EPHY_NODE_VIEW_SEARCHABLE) && @@ -1275,9 +1331,10 @@ ephy_node_view_init (EphyNodeView *view) { view->priv = EPHY_NODE_VIEW_GET_PRIVATE (view); + view->priv->toggle_column = -1; view->priv->filter = NULL; view->priv->editable_renderer = NULL; - view->priv->editing = TRUE; + view->priv->edited_node = NULL; view->priv->searchable_data_column = -1; view->priv->source_target_list = NULL; view->priv->priority_column = -1; @@ -1443,6 +1500,7 @@ ephy_node_view_enable_drag_source (EphyNodeView *view, void ephy_node_view_edit (EphyNodeView *view) { + GtkTreePath *path; GtkTreeSelection *selection; GList *rows; GtkTreeModel *model; @@ -1454,16 +1512,17 @@ ephy_node_view_edit (EphyNodeView *view) rows = gtk_tree_selection_get_selected_rows (selection, &model); if (rows == NULL) return; + path = rows->data; + g_object_set (G_OBJECT (view->priv->editable_renderer), "editable", TRUE, NULL); - gtk_tree_view_set_cursor (GTK_TREE_VIEW (view), - (GtkTreePath *)rows->data, + gtk_tree_view_set_cursor (GTK_TREE_VIEW (view), path, view->priv->editable_column, TRUE); - view->priv->editing = TRUE; + view->priv->edited_node = get_node_from_path (view, path); g_list_foreach (rows, (GFunc)gtk_tree_path_free, NULL); g_list_free (rows); @@ -1533,9 +1592,9 @@ ephy_node_view_constructor (GType type, guint n_construct_properties, g_signal_connect_object (object, "button_press_event", G_CALLBACK (ephy_node_view_button_press_cb), view, 0); - g_signal_connect_after (object, "key_press_event", - G_CALLBACK (ephy_node_view_key_press_cb), - view); + g_signal_connect (object, "key_press_event", + G_CALLBACK (ephy_node_view_key_press_cb), + view); g_signal_connect_object (object, "row_activated", G_CALLBACK (ephy_node_view_row_activated_cb), view, 0); @@ -1549,6 +1608,24 @@ ephy_node_view_constructor (GType type, guint n_construct_properties, return object; } +void +ephy_node_view_add_toggle (EphyNodeView *view, EphyTreeModelNodeValueFunc value_func, + gpointer data) +{ + GtkCellRenderer *renderer; + GtkTreeViewColumn *col; + int column; + + column = ephy_tree_model_node_add_func_column + (view->priv->nodemodel, G_TYPE_BOOLEAN, value_func, data); + view->priv->toggle_column = column; + + renderer = gtk_cell_renderer_toggle_new (); + col = gtk_tree_view_column_new_with_attributes + ("", renderer, "active", column, NULL); + gtk_tree_view_append_column (GTK_TREE_VIEW (view), col); +} + static void ephy_node_view_class_init (EphyNodeViewClass *klass) { @@ -1576,6 +1653,17 @@ ephy_node_view_class_init (EphyNodeViewClass *klass) EPHY_TYPE_NODE_FILTER, G_PARAM_READWRITE)); + ephy_node_view_signals[NODE_TOGGLED] = + g_signal_new ("node_toggled", + G_OBJECT_CLASS_TYPE (object_class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (EphyNodeViewClass, node_toggled), + NULL, NULL, + ephy_marshal_VOID__POINTER_BOOLEAN, + G_TYPE_NONE, + 2, + G_TYPE_POINTER, + G_TYPE_BOOLEAN); ephy_node_view_signals[NODE_ACTIVATED] = g_signal_new ("node_activated", G_OBJECT_CLASS_TYPE (object_class), diff --git a/lib/widgets/ephy-node-view.h b/lib/widgets/ephy-node-view.h index 1896eb233..91886dc67 100644 --- a/lib/widgets/ephy-node-view.h +++ b/lib/widgets/ephy-node-view.h @@ -65,6 +65,7 @@ typedef struct { GtkTreeViewClass parent; + void (*node_toggled) (EphyNodeView *view, EphyNode *node, gboolean checked); void (*node_activated) (EphyNodeView *view, EphyNode *node); void (*node_selected) (EphyNodeView *view, EphyNode *node); void (*node_dropped) (EphyNodeView *view, EphyNode *node, GList *uris); @@ -78,6 +79,10 @@ GtkWidget *ephy_node_view_new (EphyNode *root, void ephy_node_view_enable_dnd (EphyNodeView *view); +void ephy_node_view_add_toggle (EphyNodeView *view, + EphyTreeModelNodeValueFunc value_func, + gpointer data); + GtkTreeViewColumn *ephy_node_view_add_column (EphyNodeView *view, const char *title, GType value_type, |