[gnome-builder/wip/device-selection] workbench: stub out a primitive device selector



commit c732dedb3d66592bde00dfbff4a89bb81dc9ce00
Author: Christian Hergert <christian hergert me>
Date:   Tue Apr 28 20:25:03 2015 -0700

    workbench: stub out a primitive device selector
    
    ** NOTE **
    
    This ins't a real branch, nor is it the design we would be going with to
    do this. I just wanted to see what it would take to map this stuff to
    GListModel and, as you can see, it's quite easy.
    
    Saving for later.

 data/ui/gb-workbench.ui              |   51 ++++++++++++++++++++++++++++++++++
 src/workbench/gb-workbench-private.h |    1 +
 src/workbench/gb-workbench.c         |   50 +++++++++++++++++++++++++++++++++
 3 files changed, 102 insertions(+), 0 deletions(-)
---
diff --git a/data/ui/gb-workbench.ui b/data/ui/gb-workbench.ui
index fb42fec..3f5b693 100644
--- a/data/ui/gb-workbench.ui
+++ b/data/ui/gb-workbench.ui
@@ -16,6 +16,33 @@
           </object>
         </child>
         <child>
+          <object class="GtkMenuButton">
+            <property name="visible">true</property>
+            <property name="popover">device_popover</property>
+            <child>
+              <object class="GtkBox">
+                <property name="visible">true</property>
+                <property name="orientation">horizontal</property>
+                <property name="spacing">6</property>
+                <child>
+                  <object class="GtkLabel">
+                    <property name="label">stardust - x86_64-linux-gnu</property>
+                    <property name="visible">true</property>
+                    <property name="valign">baseline</property>
+                  </object>
+                </child>
+                <child>
+                  <object class="GtkArrow">
+                    <property name="arrow-type">down</property>
+                    <property name="valign">baseline</property>
+                    <property name="visible">true</property>
+                  </object>
+                </child>
+              </object>
+            </child>
+          </object>
+        </child>
+        <child>
           <object class="GtkMenuButton" id="gear_menu_button">
             <property name="visible">true</property>
             <style>
@@ -59,4 +86,28 @@
       </object>
     </child>
   </template>
+  <object class="GtkPopover" id="device_popover">
+    <child>
+      <object class="GtkBox">
+        <property name="margin">12</property>
+        <property name="visible">true</property>
+        <property name="orientation">vertical</property>
+        <child>
+          <object class="GbScrolledWindow">
+            <property name="shadow-type">in</property>
+            <property name="min-content-width">100</property>
+            <property name="max-content-width">500</property>
+            <property name="min-content-height">1</property>
+            <property name="max-content-height">500</property>
+            <property name="visible">true</property>
+            <child>
+              <object class="GtkListBox" id="devices_list_box">
+                <property name="visible">true</property>
+              </object>
+            </child>
+          </object>
+        </child>
+      </object>
+    </child>
+  </object>
 </interface>
diff --git a/src/workbench/gb-workbench-private.h b/src/workbench/gb-workbench-private.h
index 3d99018..66532da 100644
--- a/src/workbench/gb-workbench-private.h
+++ b/src/workbench/gb-workbench-private.h
@@ -50,6 +50,7 @@ struct _GbWorkbench
   GeditMenuStackSwitcher *gear_menu_button;
   GbSearchBox            *search_box;
   GtkStack               *stack;
+  GtkListBox             *devices_list_box;
 
   gulong                  project_notify_name_handler;
 
diff --git a/src/workbench/gb-workbench.c b/src/workbench/gb-workbench.c
index 2a90fb2..a11f829 100644
--- a/src/workbench/gb-workbench.c
+++ b/src/workbench/gb-workbench.c
@@ -103,10 +103,52 @@ gb_workbench__context_restore_cb (GObject      *object,
   gtk_widget_grab_focus (GTK_WIDGET (self->editor_workspace));
 }
 
+static GtkWidget *
+create_device_widget (gpointer item,
+                      gpointer user_data)
+{
+  GbWorkbench *self = user_data;
+  IdeDevice *device = item;
+  GtkWidget *row;
+  GtkWidget *name;
+  GtkWidget *desc;
+
+  g_assert (IDE_IS_DEVICE (device));
+  g_assert (GB_IS_WORKBENCH (self));
+
+  row = g_object_new (GTK_TYPE_BOX,
+                      "orientation", GTK_ORIENTATION_HORIZONTAL,
+                      "visible", TRUE,
+                      "spacing", 6,
+                      "margin", 6,
+                      NULL);
+
+  name = g_object_new (GTK_TYPE_LABEL,
+                      "visible", TRUE,
+                      "hexpand", TRUE,
+                      "xalign", 0.0f,
+                      "valign", GTK_ALIGN_BASELINE,
+                      NULL);
+  g_object_bind_property (device, "display-name", name, "label", G_BINDING_SYNC_CREATE);
+  gtk_container_add (GTK_CONTAINER (row), name);
+
+  desc = g_object_new (GTK_TYPE_LABEL,
+                       "visible", TRUE,
+                       "valign", GTK_ALIGN_BASELINE,
+                       "xalign", 1.0f,
+                       NULL);
+  gtk_style_context_add_class (gtk_widget_get_style_context (desc), "dim-label");
+  g_object_bind_property (device, "system-type", desc, "label", G_BINDING_SYNC_CREATE);
+  gtk_container_add (GTK_CONTAINER (row), desc);
+
+  return row;
+}
+
 static void
 gb_workbench_connect_context (GbWorkbench *self,
                               IdeContext  *context)
 {
+  IdeDeviceManager *device_manager;
   IdeProject *project;
 
   g_assert (GB_IS_WORKBENCH (self));
@@ -121,6 +163,13 @@ gb_workbench_connect_context (GbWorkbench *self,
                              self,
                              G_CONNECT_SWAPPED);
   gb_workbench__project_notify_name_cb (self, NULL, project);
+
+  device_manager = ide_context_get_device_manager (context);
+  gtk_list_box_bind_model (self->devices_list_box,
+                           G_LIST_MODEL (device_manager),
+                           create_device_widget,
+                           self,
+                           NULL);
 }
 
 static void
@@ -492,6 +541,7 @@ gb_workbench_class_init (GbWorkbenchClass *klass)
 
   GB_WIDGET_CLASS_TEMPLATE (klass, "gb-workbench.ui");
   GB_WIDGET_CLASS_BIND (klass, GbWorkbench, command_bar);
+  GB_WIDGET_CLASS_BIND (klass, GbWorkbench, devices_list_box);
   GB_WIDGET_CLASS_BIND (klass, GbWorkbench, editor_workspace);
   GB_WIDGET_CLASS_BIND (klass, GbWorkbench, gear_menu_button);
   GB_WIDGET_CLASS_BIND (klass, GbWorkbench, search_box);


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