[gnome-builder] greeter: implement delete project row plumbing
- From: Christian Hergert <chergert src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-builder] greeter: implement delete project row plumbing
- Date: Fri, 29 May 2015 18:59:22 +0000 (UTC)
commit 9d37737ffaf789ce26694f87badfb4ff69a9c4c7
Author: Christian Hergert <christian hergert me>
Date: Fri May 29 11:59:14 2015 -0700
greeter: implement delete project row plumbing
data/ui/gb-greeter-window.ui | 1 +
src/greeter/gb-greeter-window.c | 84 ++++++++++++++++++++++++++++++++++++++-
2 files changed, 84 insertions(+), 1 deletions(-)
---
diff --git a/data/ui/gb-greeter-window.ui b/data/ui/gb-greeter-window.ui
index 26b4e9e..b9138b0 100644
--- a/data/ui/gb-greeter-window.ui
+++ b/data/ui/gb-greeter-window.ui
@@ -226,6 +226,7 @@
<property name="visible">true</property>
<child>
<object class="GtkButton" id="remove_button">
+ <property name="action-name">win.delete-selected-rows</property>
<property name="label" translatable="yes">_Remove</property>
<property name="use-underline">true</property>
<property name="visible">true</property>
diff --git a/src/greeter/gb-greeter-window.c b/src/greeter/gb-greeter-window.c
index f62d522..d858e0a 100644
--- a/src/greeter/gb-greeter-window.c
+++ b/src/greeter/gb-greeter-window.c
@@ -45,8 +45,11 @@ struct _GbGreeterWindow
GtkListBox *my_projects_list_box;
GtkBox *other_projects_container;
GtkListBox *other_projects_list_box;
+ GtkButton *remove_button;
GtkSearchEntry *search_entry;
EggStateMachine *state_machine;
+
+ gint selected_count;
};
G_DEFINE_TYPE (GbGreeterWindow, gb_greeter_window, GTK_TYPE_APPLICATION_WINDOW)
@@ -217,6 +220,25 @@ selection_to_true (GBinding *binding,
}
static void
+gb_greeter_window__row_notify_selected (GbGreeterWindow *self,
+ GParamSpec *pspec,
+ GbGreeterProjectRow *row)
+{
+ gboolean selected = FALSE;
+ GAction *action;
+
+ g_assert (GB_IS_GREETER_WINDOW (self));
+ g_assert (pspec != NULL);
+ g_assert (GB_IS_GREETER_PROJECT_ROW (row));
+
+ g_object_get (row, "selected", &selected, NULL);
+ self->selected_count += selected ? 1 : -1;
+
+ action = g_action_map_lookup_action (G_ACTION_MAP (self), "delete-selected-rows");
+ g_simple_action_set_enabled (G_SIMPLE_ACTION (action), (self->selected_count > 0));
+}
+
+static void
gb_greeter_window__recent_projects_items_changed (GbGreeterWindow *self,
guint position,
guint removed,
@@ -251,7 +273,11 @@ gb_greeter_window__recent_projects_items_changed (GbGreeterWindow *self,
G_CALLBACK (row_focus_in_event),
self,
G_CONNECT_SWAPPED);
-
+ g_signal_connect_object (row,
+ "notify::selected",
+ G_CALLBACK (gb_greeter_window__row_notify_selected),
+ self,
+ G_CONNECT_SWAPPED);
if (ide_project_info_get_is_recent (project_info))
{
@@ -413,6 +439,53 @@ gb_greeter_window__keynav_failed (GbGreeterWindow *self,
}
static void
+gb_greeter_window_remove_project (GbGreeterWindow *self,
+ IdeProjectInfo *info)
+{
+ g_assert (GB_IS_GREETER_WINDOW (self));
+ g_assert (IDE_IS_PROJECT_INFO (info));
+
+ /* TODO: Actually remove project from bookmarks */
+}
+
+static void
+delete_selected_rows (GSimpleAction *action,
+ GVariant *parameter,
+ gpointer user_data)
+{
+ GbGreeterWindow *self = user_data;
+ GList *rows;
+ GList *iter;
+
+ g_assert (GB_IS_GREETER_WINDOW (self));
+ g_assert (G_IS_SIMPLE_ACTION (action));
+
+ rows = gtk_container_get_children (GTK_CONTAINER (self->my_projects_list_box));
+
+ for (iter = rows; iter; iter = iter->next)
+ {
+ GbGreeterProjectRow *row = iter->data;
+ gboolean selected = FALSE;
+
+ g_object_get (row, "selected", &selected, NULL);
+
+ if (selected)
+ {
+ IdeProjectInfo *info;
+
+ info = gb_greeter_project_row_get_project_info (row);
+ gb_greeter_window_remove_project (self, info);
+ gtk_container_remove (GTK_CONTAINER (self->my_projects_list_box), iter->data);
+ }
+ }
+
+ g_list_free (rows);
+
+ self->selected_count = 0;
+ g_simple_action_set_enabled (G_SIMPLE_ACTION (action), FALSE);
+}
+
+static void
gb_greeter_window_constructed (GObject *object)
{
GbGreeterWindow *self = (GbGreeterWindow *)object;
@@ -498,6 +571,7 @@ gb_greeter_window_class_init (GbGreeterWindowClass *klass)
gtk_widget_class_bind_template_child (widget_class, GbGreeterWindow, my_projects_list_box);
gtk_widget_class_bind_template_child (widget_class, GbGreeterWindow, other_projects_container);
gtk_widget_class_bind_template_child (widget_class, GbGreeterWindow, other_projects_list_box);
+ gtk_widget_class_bind_template_child (widget_class, GbGreeterWindow, remove_button);
gtk_widget_class_bind_template_child (widget_class, GbGreeterWindow, search_entry);
gtk_widget_class_bind_template_child (widget_class, GbGreeterWindow, state_machine);
gtk_widget_class_bind_template_child (widget_class, GbGreeterWindow, viewport);
@@ -510,6 +584,9 @@ gb_greeter_window_class_init (GbGreeterWindowClass *klass)
static void
gb_greeter_window_init (GbGreeterWindow *self)
{
+ GActionEntry actions[] = {
+ { "delete-selected-rows", delete_selected_rows },
+ };
GAction *action;
self->signal_group = egg_signal_group_new (IDE_TYPE_RECENT_PROJECTS);
@@ -574,4 +651,9 @@ gb_greeter_window_init (GbGreeterWindow *self)
action = egg_state_machine_create_action (self->state_machine, "state");
g_action_map_add_action (G_ACTION_MAP (self), action);
g_object_unref (action);
+
+ g_action_map_add_action_entries (G_ACTION_MAP (self), actions, G_N_ELEMENTS (actions), self);
+
+ action = g_action_map_lookup_action (G_ACTION_MAP (self), "delete-selected-rows");
+ g_simple_action_set_enabled (G_SIMPLE_ACTION (action), FALSE);
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]