[gnome-builder] greeter: add selection checkboxes to recent projects
- From: Christian Hergert <chergert src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-builder] greeter: add selection checkboxes to recent projects
- Date: Fri, 22 May 2015 00:40:42 +0000 (UTC)
commit 08061aac3e55d7f6d9b720f860b235ab9d87c935
Author: Christian Hergert <christian hergert me>
Date: Thu May 21 17:40:34 2015 -0700
greeter: add selection checkboxes to recent projects
When in selection mode, show a checkbox for each row.
data/ui/gb-greeter-project-row.ui | 119 +++++++++++++++++++---------------
data/ui/gb-greeter-window.ui | 31 ++++++++-
src/greeter/gb-greeter-project-row.c | 27 +++++++-
src/greeter/gb-greeter-project-row.h | 6 +-
src/greeter/gb-greeter-window.c | 40 ++++++++++--
5 files changed, 159 insertions(+), 64 deletions(-)
---
diff --git a/data/ui/gb-greeter-project-row.ui b/data/ui/gb-greeter-project-row.ui
index 2c3cd32..2174f58 100644
--- a/data/ui/gb-greeter-project-row.ui
+++ b/data/ui/gb-greeter-project-row.ui
@@ -4,80 +4,93 @@
<template class="GbGreeterProjectRow" parent="GtkListBoxRow">
<child>
<object class="GtkBox">
- <property name="orientation">vertical</property>
- <property name="margin">12</property>
+ <property name="orientation">horizontal</property>
<property name="visible">true</property>
<child>
+ <object class="GtkCheckButton" id="checkbox">
+ <property name="margin-start">12</property>
+ <property name="valign">center</property>
+ <property name="vexpand">true</property>
+ </object>
+ </child>
+ <child>
<object class="GtkBox">
- <property name="orientation">horizontal</property>
+ <property name="orientation">vertical</property>
+ <property name="margin">12</property>
<property name="visible">true</property>
<child>
- <object class="GtkLabel" id="title_label">
+ <object class="GtkBox">
+ <property name="orientation">horizontal</property>
<property name="visible">true</property>
- <property name="hexpand">true</property>
- <property name="valign">baseline</property>
- <property name="xalign">0.0</property>
- <attributes>
- <attribute name="scale" value="1.2"/>
- <attribute name="weight" value="bold"/>
- </attributes>
+ <child>
+ <object class="GtkLabel" id="title_label">
+ <property name="visible">true</property>
+ <property name="hexpand">true</property>
+ <property name="valign">baseline</property>
+ <property name="xalign">0.0</property>
+ <attributes>
+ <attribute name="scale" value="1.2"/>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="date_label">
+ <property name="visible">true</property>
+ <property name="hexpand">true</property>
+ <property name="valign">baseline</property>
+ <property name="xalign">1.0</property>
+ <attributes>
+ <attribute name="scale" value="0.833333"/>
+ </attributes>
+ <style>
+ <class name="dim-label"/>
+ </style>
+ </object>
+ </child>
</object>
</child>
<child>
- <object class="GtkLabel" id="date_label">
- <property name="visible">true</property>
- <property name="hexpand">true</property>
+ <object class="GtkLabel" id="description_label">
+ <property name="single-line-mode">true</property>
+ <property name="ellipsize">end</property>
<property name="valign">baseline</property>
- <property name="xalign">1.0</property>
- <attributes>
- <attribute name="scale" value="0.833333"/>
- </attributes>
- <style>
- <class name="dim-label"/>
- </style>
- </object>
- </child>
- </object>
- </child>
- <child>
- <object class="GtkLabel" id="description_label">
- <property name="single-line-mode">true</property>
- <property name="ellipsize">end</property>
- <property name="valign">baseline</property>
- <property name="visible">true</property>
- <property name="xalign">0.0</property>
- </object>
- </child>
- <child>
- <object class="GtkBox">
- <property name="orientation">horizontal</property>
- <property name="visible">true</property>
- <property name="spacing">6</property>
- <child>
- <object class="GtkLabel" id="location_label">
- <property name="hexpand">true</property>
<property name="visible">true</property>
- <property name="valign">baseline</property>
<property name="xalign">0.0</property>
- <property name="ellipsize">middle</property>
- <style>
- <class name="dim-label"/>
- </style>
- <attributes>
- <attribute name="scale" value="0.833333"/>
- </attributes>
</object>
</child>
<child>
- <object class="GtkBox" id="languages_box">
- <property name="spacing">3</property>
+ <object class="GtkBox">
<property name="orientation">horizontal</property>
<property name="visible">true</property>
+ <property name="spacing">6</property>
+ <child>
+ <object class="GtkLabel" id="location_label">
+ <property name="hexpand">true</property>
+ <property name="visible">true</property>
+ <property name="valign">baseline</property>
+ <property name="xalign">0.0</property>
+ <property name="ellipsize">middle</property>
+ <style>
+ <class name="dim-label"/>
+ </style>
+ <attributes>
+ <attribute name="scale" value="0.833333"/>
+ </attributes>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox" id="languages_box">
+ <property name="spacing">3</property>
+ <property name="orientation">horizontal</property>
+ <property name="visible">true</property>
+ </object>
+ </child>
</object>
</child>
</object>
</child>
</object>
- </child>
+ </child>
</template>
</interface>
diff --git a/data/ui/gb-greeter-window.ui b/data/ui/gb-greeter-window.ui
index 1aef956..26b4e9e 100644
--- a/data/ui/gb-greeter-window.ui
+++ b/data/ui/gb-greeter-window.ui
@@ -113,8 +113,7 @@
</object>
</child>
<child>
- <object class="GtkScrolledWindow">
- <property name="expand">true</property>
+ <object class="GtkScrolledWindow" id="scrolled_window">
<property name="visible">true</property>
<child>
<object class="GtkViewport" id="viewport">
@@ -212,14 +211,30 @@
</object>
</child>
</object>
+ <packing>
+ <property name="expand">true</property>
+ <property name="fill">true</property>
+ </packing>
</child>
<child>
<object class="GtkRevealer" id="action_bar_revealer">
<property name="vexpand">false</property>
<property name="visible">true</property>
+ <property name="transition-type">slide-up</property>
<child>
<object class="GtkActionBar" id="action_bar">
<property name="visible">true</property>
+ <child>
+ <object class="GtkButton" id="remove_button">
+ <property name="label" translatable="yes">_Remove</property>
+ <property name="use-underline">true</property>
+ <property name="visible">true</property>
+ <property name="sensitive">false</property>
+ <style>
+ <class name="destructive-action"/>
+ </style>
+ </object>
+ </child>
</object>
</child>
</object>
@@ -246,6 +261,12 @@
<object id="new_button">
<property name="visible">true</property>
</object>
+ <object id="action_bar_revealer">
+ <property name="reveal-child">false</property>
+ </object>
+ <object id="other_projects_container">
+ <property name="visible">true</property>
+ </object>
</state>
<state name="selection">
<object id="header_bar">
@@ -254,6 +275,9 @@
<class name="selection-mode"/>
</style>
</object>
+ <object id="action_bar_revealer">
+ <property name="reveal-child">true</property>
+ </object>
<object id="title_stack">
<property name="visible-child">selection_title</property>
</object>
@@ -266,6 +290,9 @@
<object id="new_button">
<property name="visible">false</property>
</object>
+ <object id="other_projects_container">
+ <property name="visible">false</property>
+ </object>
</state>
</states>
</object>
diff --git a/src/greeter/gb-greeter-project-row.c b/src/greeter/gb-greeter-project-row.c
index 4556b30..a9677c8 100644
--- a/src/greeter/gb-greeter-project-row.c
+++ b/src/greeter/gb-greeter-project-row.c
@@ -40,6 +40,7 @@ struct _GbGreeterProjectRow
GtkBox *languages_box;
GtkLabel *location_label;
GtkLabel *title_label;
+ GtkLabel *checkbox;
};
G_DEFINE_TYPE (GbGreeterProjectRow, gb_greeter_project_row, GTK_TYPE_LIST_BOX_ROW)
@@ -47,12 +48,22 @@ G_DEFINE_TYPE (GbGreeterProjectRow, gb_greeter_project_row, GTK_TYPE_LIST_BOX_RO
enum {
PROP_0,
PROP_PROJECT_INFO,
+ PROP_SELECTION_MODE,
LAST_PROP
};
static GParamSpec *gParamSpecs [LAST_PROP];
static GFile *gHomeDir;
+void
+gb_greeter_project_row_set_selection_mode (GbGreeterProjectRow *self,
+ gboolean selection_mode)
+{
+ g_return_if_fail (GB_IS_GREETER_PROJECT_ROW (self));
+
+ gtk_widget_set_visible (GTK_WIDGET (self->checkbox), selection_mode);
+}
+
IdeProjectInfo *
gb_greeter_project_row_get_project_info (GbGreeterProjectRow *self)
{
@@ -254,6 +265,10 @@ gb_greeter_project_row_set_property (GObject *object,
switch (prop_id)
{
+ case PROP_SELECTION_MODE:
+ gb_greeter_project_row_set_selection_mode (self, g_value_get_boolean (value));
+ break;
+
case PROP_PROJECT_INFO:
gb_greeter_project_row_set_project_info (self, g_value_get_object (value));
break;
@@ -274,20 +289,28 @@ gb_greeter_project_row_class_init (GbGreeterProjectRowClass *klass)
object_class->set_property = gb_greeter_project_row_set_property;
gtk_widget_class_set_template_from_resource (widget_class,
"/org/gnome/builder/ui/gb-greeter-project-row.ui");
+ gtk_widget_class_bind_template_child (widget_class, GbGreeterProjectRow, checkbox);
gtk_widget_class_bind_template_child (widget_class, GbGreeterProjectRow, date_label);
gtk_widget_class_bind_template_child (widget_class, GbGreeterProjectRow, description_label);
gtk_widget_class_bind_template_child (widget_class, GbGreeterProjectRow, location_label);
gtk_widget_class_bind_template_child (widget_class, GbGreeterProjectRow, languages_box);
gtk_widget_class_bind_template_child (widget_class, GbGreeterProjectRow, title_label);
+ gParamSpecs [PROP_SELECTION_MODE] =
+ g_param_spec_boolean ("selection-mode",
+ _("Selection Mode"),
+ _("Selection Mode"),
+ FALSE,
+ (G_PARAM_WRITABLE | G_PARAM_STATIC_STRINGS));
+
gParamSpecs [PROP_PROJECT_INFO] =
g_param_spec_object ("project-info",
_("Project Information"),
_("The project information to render."),
IDE_TYPE_PROJECT_INFO,
(G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS));
- g_object_class_install_property (object_class, PROP_PROJECT_INFO,
- gParamSpecs [PROP_PROJECT_INFO]);
+
+ g_object_class_install_properties (object_class, LAST_PROP, gParamSpecs);
gHomeDir = g_file_new_for_path (g_get_home_dir ());
}
diff --git a/src/greeter/gb-greeter-project-row.h b/src/greeter/gb-greeter-project-row.h
index 0d424af..6920198 100644
--- a/src/greeter/gb-greeter-project-row.h
+++ b/src/greeter/gb-greeter-project-row.h
@@ -28,8 +28,10 @@ G_BEGIN_DECLS
G_DECLARE_FINAL_TYPE (GbGreeterProjectRow, gb_greeter_project_row, GB, GREETER_PROJECT_ROW, GtkListBoxRow)
-IdeProjectInfo *gb_greeter_project_row_get_project_info (GbGreeterProjectRow *self);
-const gchar *gb_greeter_project_row_get_search_text (GbGreeterProjectRow *self);
+IdeProjectInfo *gb_greeter_project_row_get_project_info (GbGreeterProjectRow *self);
+const gchar *gb_greeter_project_row_get_search_text (GbGreeterProjectRow *self);
+void gb_greeter_project_row_set_selection_mode (GbGreeterProjectRow *self,
+ gboolean selection_mode);
G_END_DECLS
diff --git a/src/greeter/gb-greeter-window.c b/src/greeter/gb-greeter-window.c
index c20db10..8b56ded 100644
--- a/src/greeter/gb-greeter-window.c
+++ b/src/greeter/gb-greeter-window.c
@@ -197,6 +197,25 @@ row_focus_in_event (GbGreeterWindow *self,
return GDK_EVENT_PROPAGATE;
}
+static gboolean
+selection_to_true (GBinding *binding,
+ const GValue *from_value,
+ GValue *to_value,
+ gpointer user_data)
+{
+ if (G_VALUE_HOLDS_STRING (from_value) && G_VALUE_HOLDS_BOOLEAN (to_value))
+ {
+ const gchar *str;
+
+ str = g_value_get_string (from_value);
+ g_value_set_boolean (to_value, ide_str_equal0 (str, "selection"));
+
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
static void
gb_greeter_window__recent_projects_items_changed (GbGreeterWindow *self,
guint position,
@@ -223,11 +242,6 @@ gb_greeter_window__recent_projects_items_changed (GbGreeterWindow *self,
project_info = g_list_model_get_item (list_model, position + i);
- if (ide_project_info_get_is_recent (project_info))
- list_box = self->my_projects_list_box;
- else
- list_box = self->other_projects_list_box;
-
row = g_object_new (GB_TYPE_GREETER_PROJECT_ROW,
"visible", TRUE,
"project-info", project_info,
@@ -237,6 +251,22 @@ gb_greeter_window__recent_projects_items_changed (GbGreeterWindow *self,
G_CALLBACK (row_focus_in_event),
self,
G_CONNECT_SWAPPED);
+
+
+ if (ide_project_info_get_is_recent (project_info))
+ {
+ list_box = self->my_projects_list_box;
+ g_object_bind_property_full (self->state_machine, "state",
+ row, "selection-mode",
+ G_BINDING_SYNC_CREATE,
+ selection_to_true, NULL,
+ NULL, NULL);
+ }
+ else
+ {
+ list_box = self->other_projects_list_box;
+ }
+
gtk_container_add (GTK_CONTAINER (list_box), GTK_WIDGET (row));
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]