aboutsummaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorClaudio Saavedra <csaavedra@igalia.com>2012-05-25 17:05:02 +0800
committerClaudio Saavedra <csaavedra@igalia.com>2012-09-01 02:34:00 +0800
commit8ddda2707becfbf0fa90159c99f5c7a89a961b79 (patch)
treee9dd2fee127db98b15525c329006996797013344 /lib
parent9eb6bdb143a1dc91f36d92899fa68358e2b47fe4 (diff)
downloadgsoc2013-epiphany-8ddda2707becfbf0fa90159c99f5c7a89a961b79.tar
gsoc2013-epiphany-8ddda2707becfbf0fa90159c99f5c7a89a961b79.tar.gz
gsoc2013-epiphany-8ddda2707becfbf0fa90159c99f5c7a89a961b79.tar.bz2
gsoc2013-epiphany-8ddda2707becfbf0fa90159c99f5c7a89a961b79.tar.lz
gsoc2013-epiphany-8ddda2707becfbf0fa90159c99f5c7a89a961b79.tar.xz
gsoc2013-epiphany-8ddda2707becfbf0fa90159c99f5c7a89a961b79.tar.zst
gsoc2013-epiphany-8ddda2707becfbf0fa90159c99f5c7a89a961b79.zip
gd-main-view: add a "item-deleted" signal to handle user-triggered item deletions
GdMainView connects to GdMainViewGeneric:delete-item-clicked and emits its :item-deleted signal which, if unhandled, simply removes the item in question from the underlying model. Users of GdMainView can handle this signal and stop the default handler from being invoked, thus avoiding removal of the item.
Diffstat (limited to 'lib')
-rw-r--r--lib/widgets/gd-main-view.c56
-rw-r--r--lib/widgets/gd-main-view.h5
2 files changed, 61 insertions, 0 deletions
diff --git a/lib/widgets/gd-main-view.c b/lib/widgets/gd-main-view.c
index 8c3545e99..66984267f 100644
--- a/lib/widgets/gd-main-view.c
+++ b/lib/widgets/gd-main-view.c
@@ -47,6 +47,7 @@ enum {
enum {
ITEM_ACTIVATED = 1,
+ ITEM_DELETED,
SELECTION_MODE_REQUEST,
VIEW_SELECTION_CHANGED,
NUM_SIGNALS
@@ -148,6 +149,27 @@ gd_main_view_set_property (GObject *object,
}
}
+static gboolean
+gd_main_view_real_item_deleted (GdMainView *self,
+ const gchar *path)
+{
+#if 0
+ /* Handling this breaks the logic of the models used. I think
+ we shouldn't handle this at all. */
+ GtkTreePath *tree_path = gtk_tree_path_new_from_string (path);
+ GtkTreeIter iter;
+
+ if (!gtk_tree_model_get_iter (self->priv->model, &iter, tree_path)) {
+ gtk_tree_path_free (tree_path);
+ return FALSE;
+ }
+
+ gtk_list_store_remove (GTK_LIST_STORE (self->priv->model), &iter);
+ gtk_tree_path_free (tree_path);
+#endif
+ return TRUE;
+}
+
static void
gd_main_view_class_init (GdMainViewClass *klass)
{
@@ -158,6 +180,8 @@ gd_main_view_class_init (GdMainViewClass *klass)
oclass->dispose = gd_main_view_dispose;
oclass->finalize = gd_main_view_finalize;
+ klass->item_deleted = gd_main_view_real_item_deleted;
+
properties[PROP_VIEW_TYPE] =
g_param_spec_int ("view-type",
"View type",
@@ -195,6 +219,16 @@ gd_main_view_class_init (GdMainViewClass *klass)
G_TYPE_STRING,
GTK_TYPE_TREE_PATH);
+ signals[ITEM_DELETED] =
+ g_signal_new ("item-deleted",
+ GD_TYPE_MAIN_VIEW,
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (GdMainViewClass, item_deleted),
+ g_signal_accumulator_true_handled, NULL,
+ g_cclosure_marshal_generic,
+ G_TYPE_BOOLEAN, 1,
+ G_TYPE_STRING | G_SIGNAL_TYPE_STATIC_SCOPE);
+
signals[SELECTION_MODE_REQUEST] =
g_signal_new ("selection-mode-request",
GD_TYPE_MAIN_VIEW,
@@ -527,6 +561,17 @@ on_drag_begin (GdMainViewGeneric *generic,
}
static void
+on_delete_item_clicked (GdMainViewGeneric *generic,
+ const gchar *path,
+ GdMainView *self)
+{
+ g_free (self->priv->button_press_item_path);
+ self->priv->button_press_item_path = NULL;
+
+ gd_main_view_item_deleted (self, path);
+}
+
+static void
gd_main_view_apply_model (GdMainView *self)
{
GdMainViewGeneric *generic = get_generic (self);
@@ -587,6 +632,8 @@ gd_main_view_rebuild (GdMainView *self)
G_CALLBACK (on_button_release_event), self);
g_signal_connect_after (self->priv->current_view, "drag-begin",
G_CALLBACK (on_drag_begin), self);
+ g_signal_connect (self->priv->current_view, "delete-item-clicked",
+ G_CALLBACK (on_delete_item_clicked), self);
gd_main_view_apply_selection_mode (self);
gd_main_view_apply_model (self);
@@ -723,3 +770,12 @@ gd_main_view_get_selection (GdMainView *self)
return g_list_reverse (retval);
}
+
+void
+gd_main_view_item_deleted (GdMainView *self,
+ const gchar *path)
+{
+ gboolean result;
+
+ g_signal_emit (self, signals [ITEM_DELETED], 0, path, &result);
+}
diff --git a/lib/widgets/gd-main-view.h b/lib/widgets/gd-main-view.h
index b6906a10f..7a082ad9f 100644
--- a/lib/widgets/gd-main-view.h
+++ b/lib/widgets/gd-main-view.h
@@ -77,6 +77,9 @@ struct _GdMainView {
struct _GdMainViewClass {
GtkScrolledWindowClass parent_class;
+
+ gboolean (* item_deleted) (GdMainView *self,
+ const gchar *path);
};
GType gd_main_view_get_type (void) G_GNUC_CONST;
@@ -98,6 +101,8 @@ void gd_main_view_set_model (GdMainView *self,
GtkWidget * gd_main_view_get_generic_view (GdMainView *self);
+void gd_main_view_item_deleted (GdMainView *self, const gchar *path);
+
G_END_DECLS
#endif /* __GD_MAIN_VIEW_H__ */