[gnome-builder] greeter: add basic state transition for object selection



commit c31d3002da375219b763b9ba231c6012361630b8
Author: Christian Hergert <christian hergert me>
Date:   Thu May 21 00:15:37 2015 -0700

    greeter: add basic state transition for object selection
    
    We still need to plumb the object selection in the rows, and deal with
    removal, but this gets the basic state machine in place.

 data/ui/gb-greeter-window.ui    |   84 ++++++++++++++++++++++++++++++++++++--
 src/greeter/gb-greeter-window.c |   14 ++++++-
 2 files changed, 91 insertions(+), 7 deletions(-)
---
diff --git a/data/ui/gb-greeter-window.ui b/data/ui/gb-greeter-window.ui
index 25392e2..1aef956 100644
--- a/data/ui/gb-greeter-window.ui
+++ b/data/ui/gb-greeter-window.ui
@@ -6,11 +6,27 @@
     <property name="default-height">800</property>
     <child type="titlebar">
       <object class="GtkHeaderBar" id="header_bar">
-        <property name="show-close-button">true</property>
-        <property name="title" translatable="yes">Select a Project</property>
         <property name="visible">true</property>
+        <child type="title">
+          <object class="GtkStack" id="title_stack">
+            <property name="visible">true</property>
+            <property name="transition-type">crossfade</property>
+            <child>
+              <object class="GtkLabel" id="browse_title">
+                <property name="visible">true</property>
+                <property name="label" translatable="yes">Select a Project</property>
+              </object>
+            </child>
+            <child>
+              <object class="GtkLabel" id="selection_title">
+                <property name="visible">true</property>
+                <property name="label" translatable="yes">Click an item to select</property>
+              </object>
+            </child>
+          </object>
+        </child>
         <child>
-          <object class="GtkButton">
+          <object class="GtkButton" id="new_button">
             <property name="action-name">app.new-project</property>
             <property name="visible">true</property>
             <property name="label" translatable="yes">_New</property>
@@ -38,13 +54,14 @@
             </child>
           </object>
           <packing>
-            <property name="position">1</property>
+            <property name="position">2</property>
             <property name="pack-type">end</property>
           </packing>
         </child>
         <child>
           <object class="GtkToggleButton" id="selection_button">
-            <property name="visible">false</property>
+            <property name="action-name">win.state</property>
+            <property name="action-target">'selection'</property>
             <style>
               <class name="image-button"/>
             </style>
@@ -56,6 +73,21 @@
             </child>
           </object>
           <packing>
+            <property name="position">1</property>
+            <property name="pack-type">end</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkButton" id="cancel_button">
+            <property name="label" translatable="yes">_Cancel</property>
+            <property name="use-underline">true</property>
+            <property name="action-name">win.state</property>
+            <property name="action-target">'browse'</property>
+            <style>
+              <class name="text-button"/>
+            </style>
+          </object>
+          <packing>
             <property name="position">0</property>
             <property name="pack-type">end</property>
           </packing>
@@ -195,6 +227,48 @@
       </object>
     </child>
   </template>
+  <object class="EggStateMachine" id="state_machine">
+    <property name="state">browse</property>
+    <states>
+      <state name="browse">
+        <object id="header_bar">
+          <property name="show-close-button">true</property>
+        </object>
+        <object id="title_stack">
+          <property name="visible-child">browse_title</property>
+        </object>
+        <object id="cancel_button">
+          <property name="visible">false</property>
+        </object>
+        <object id="selection_button">
+          <property name="visible">true</property>
+        </object>
+        <object id="new_button">
+          <property name="visible">true</property>
+        </object>
+      </state>
+      <state name="selection">
+        <object id="header_bar">
+          <property name="show-close-button">false</property>
+          <style>
+            <class name="selection-mode"/>
+          </style>
+        </object>
+        <object id="title_stack">
+          <property name="visible-child">selection_title</property>
+        </object>
+        <object id="cancel_button">
+          <property name="visible">true</property>
+        </object>
+        <object id="selection_button">
+          <property name="visible">false</property>
+        </object>
+        <object id="new_button">
+          <property name="visible">false</property>
+        </object>
+      </state>
+    </states>
+  </object>
   <object class="GtkSizeGroup">
     <property name="mode">horizontal</property>
     <widgets>
diff --git a/src/greeter/gb-greeter-window.c b/src/greeter/gb-greeter-window.c
index 98979a4..c20db10 100644
--- a/src/greeter/gb-greeter-window.c
+++ b/src/greeter/gb-greeter-window.c
@@ -22,6 +22,7 @@
 #include <ide.h>
 
 #include "egg-signal-group.h"
+#include "egg-state-machine.h"
 
 #include "gb-application.h"
 #include "gb-greeter-project-row.h"
@@ -45,6 +46,7 @@ struct _GbGreeterWindow
   GtkBox               *other_projects_container;
   GtkListBox           *other_projects_list_box;
   GtkSearchEntry       *search_entry;
+  EggStateMachine      *state_machine;
 };
 
 G_DEFINE_TYPE (GbGreeterWindow, gb_greeter_window, GTK_TYPE_APPLICATION_WINDOW)
@@ -448,8 +450,8 @@ gb_greeter_window_class_init (GbGreeterWindowClass *klass)
                          _("The recent projects that have been mined."),
                          IDE_TYPE_RECENT_PROJECTS,
                          (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
-  g_object_class_install_property (object_class, PROP_RECENT_PROJECTS,
-                                   gParamSpecs [PROP_RECENT_PROJECTS]);
+
+  g_object_class_install_properties (object_class, LAST_PROP, gParamSpecs);
 
   gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/builder/ui/gb-greeter-window.ui");
   gtk_widget_class_bind_template_child (widget_class, GbGreeterWindow, header_bar);
@@ -458,8 +460,10 @@ gb_greeter_window_class_init (GbGreeterWindowClass *klass)
   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, search_entry);
+  gtk_widget_class_bind_template_child (widget_class, GbGreeterWindow, state_machine);
   gtk_widget_class_bind_template_child (widget_class, GbGreeterWindow, viewport);
 
+  g_type_ensure (EGG_TYPE_STATE_MACHINE);
   g_type_ensure (GB_TYPE_GREETER_PROJECT_ROW);
   g_type_ensure (GB_TYPE_SCROLLED_WINDOW);
 }
@@ -467,6 +471,8 @@ gb_greeter_window_class_init (GbGreeterWindowClass *klass)
 static void
 gb_greeter_window_init (GbGreeterWindow *self)
 {
+  GAction *action;
+
   self->signal_group = egg_signal_group_new (IDE_TYPE_RECENT_PROJECTS);
   egg_signal_group_connect_object (self->signal_group,
                                    "items-changed",
@@ -525,4 +531,8 @@ gb_greeter_window_init (GbGreeterWindow *self)
   gtk_list_box_set_filter_func (self->other_projects_list_box,
                                 gb_greeter_window_filter_row,
                                 self, NULL);
+
+  action = egg_state_machine_create_action (self->state_machine, "state");
+  g_action_map_add_action (G_ACTION_MAP (self), action);
+  g_object_unref (action);
 }


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]