[gnome-builder] greeter: add selection checkboxes to recent projects



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]