[gnome-software/wip/folders: 4/5] Begin to add a selection mode to the installed list



commit 97031b3a2258420571ab9c70087e3f12ddeefc4f
Author: Matthias Clasen <mclasen redhat com>
Date:   Sun Nov 3 01:48:19 2013 -0400

    Begin to add a selection mode to the installed list

 src/app-widget.ui        |    9 +++++++++
 src/gnome-software.ui    |   14 ++++++++++++++
 src/gs-app-widget.c      |   36 ++++++++++++++++++++++++++++++++++++
 src/gs-app-widget.h      |    5 +++++
 src/gs-shell-installed.c |   46 +++++++++++++++++++++++++++++++++++++++++++---
 src/gs-shell.c           |    2 ++
 6 files changed, 109 insertions(+), 3 deletions(-)
---
diff --git a/src/app-widget.ui b/src/app-widget.ui
index 1bdeb70..2a3ec92 100644
--- a/src/app-widget.ui
+++ b/src/app-widget.ui
@@ -10,6 +10,15 @@
         <property name="orientation">horizontal</property>
         <property name="spacing">3</property>
         <child>
+          <object class="GtkCheckButton" id="checkbox">
+            <property name="margin-right">9</property>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">False</property>
+          </packing>
+        </child>
+        <child>
           <object class="GtkImage" id="image">
             <property name="visible">True</property>
             <property name="pixel_size">64</property>
diff --git a/src/gnome-software.ui b/src/gnome-software.ui
index f7339ea..48ef35e 100644
--- a/src/gnome-software.ui
+++ b/src/gnome-software.ui
@@ -2,6 +2,11 @@
 <!-- Generated with glade 3.15.2 on Thu Aug 15 17:13:59 2013 -->
 <interface>
   <!-- interface-requires gtk+ 3.10 -->
+  <object class="GtkImage" id="button_select_image">
+    <property name="visible">True</property>
+    <property name="icon_name">object-select-symbolic</property>
+    <property name="icon_size">0</property>
+  </object>
   <object class="GtkApplicationWindow" id="window_software">
     <property name="can_focus">False</property>
     <property name="default-width">1200</property>
@@ -182,6 +187,15 @@
                 <property name="pack_type">end</property>
               </packing>
             </child>
+            <child>
+              <object class="GtkToggleButton" id="button_select">
+                <property name="image">button_select_image</property>
+                <property name="can_focus">True</property>
+              </object>
+              <packing>
+                <property name="pack_type">end</property>
+              </packing>
+            </child>
           </object>
           <packing>
             <property name="expand">False</property>
diff --git a/src/gs-app-widget.c b/src/gs-app-widget.c
index 10ad7cc..a6a13e8 100644
--- a/src/gs-app-widget.c
+++ b/src/gs-app-widget.c
@@ -41,8 +41,10 @@ struct _GsAppWidgetPrivate
        GtkWidget       *button;
        GtkWidget       *spinner;
        GtkWidget       *label;
+       GtkWidget       *checkbox;
        gboolean         colorful;
        gboolean         show_update;
+       gboolean         selectable;
 };
 
 G_DEFINE_TYPE_WITH_PRIVATE (GsAppWidget, gs_app_widget, GTK_TYPE_BIN)
@@ -179,6 +181,15 @@ gs_app_widget_refresh (GsAppWidget *app_widget)
        default:
                break;
        }
+
+       if (priv->selectable) {
+               if (gs_app_get_id_kind (priv->app) == GS_APP_ID_KIND_DESKTOP ||
+                   gs_app_get_id_kind (priv->app) == GS_APP_ID_KIND_WEBAPP)
+                       gtk_widget_set_visible (priv->checkbox, TRUE);
+               gtk_widget_set_sensitive (priv->button, FALSE);
+       } else {
+               gtk_widget_set_visible (priv->checkbox, FALSE);
+       }
 }
 
 /**
@@ -258,6 +269,7 @@ gs_app_widget_class_init (GsAppWidgetClass *klass)
        gtk_widget_class_bind_template_child_private (widget_class, GsAppWidget, button);
        gtk_widget_class_bind_template_child_private (widget_class, GsAppWidget, spinner);
        gtk_widget_class_bind_template_child_private (widget_class, GsAppWidget, label);
+       gtk_widget_class_bind_template_child_private (widget_class, GsAppWidget, checkbox);
 }
 
 static void
@@ -310,6 +322,30 @@ gs_app_widget_set_show_update (GsAppWidget *app_widget, gboolean show_update)
        app_widget->priv->show_update = show_update;
 }
 
+void
+gs_app_widget_set_selectable (GsAppWidget *app_widget, gboolean selectable)
+{
+       app_widget->priv->selectable = selectable;
+       gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (app_widget->priv->checkbox), FALSE);
+       gs_app_widget_refresh (app_widget);
+}
+
+void
+gs_app_widget_set_selected (GsAppWidget *app_widget, gboolean selected)
+{
+       if (app_widget->priv->selectable)
+               gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (app_widget->priv->checkbox), selected);
+}
+
+gboolean
+gs_app_widget_get_selected (GsAppWidget *app_widget)
+{
+       if (app_widget->priv->selectable)
+               return gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (app_widget->priv->checkbox));
+       else
+               return FALSE;
+}
+
 GtkWidget *
 gs_app_widget_new (void)
 {
diff --git a/src/gs-app-widget.h b/src/gs-app-widget.h
index 5c0324d..f6bff46 100644
--- a/src/gs-app-widget.h
+++ b/src/gs-app-widget.h
@@ -59,6 +59,11 @@ void          gs_app_widget_set_colorful             (GsAppWidget    *app_widget,
                                                         gboolean        colorful);
 void            gs_app_widget_set_show_update          (GsAppWidget    *app_widget,
                                                         gboolean        show_update);
+void            gs_app_widget_set_selectable           (GsAppWidget    *app_widget,
+                                                        gboolean        selectable);
+void            gs_app_widget_set_selected             (GsAppWidget    *app_widget,
+                                                        gboolean        selected);
+gboolean        gs_app_widget_get_selected             (GsAppWidget    *app_widget);
 GsApp          *gs_app_widget_get_app                  (GsAppWidget    *app_widget);
 void            gs_app_widget_set_app                  (GsAppWidget    *app_widget,
                                                         GsApp          *app);
diff --git a/src/gs-shell-installed.c b/src/gs-shell-installed.c
index f00ce5a..ad272bf 100644
--- a/src/gs-shell-installed.c
+++ b/src/gs-shell-installed.c
@@ -51,6 +51,7 @@ struct GsShellInstalledPrivate
        gboolean                 cache_valid;
        gboolean                 waiting;
        GsShell                 *shell;
+       gboolean                 selection_mode;
 };
 
 G_DEFINE_TYPE (GsShellInstalled, gs_shell_installed, G_TYPE_OBJECT)
@@ -73,11 +74,18 @@ gs_shell_installed_app_widget_activated_cb (GtkListBox *list_box,
                                            GsShellInstalled *shell_installed)
 {
        GsAppWidget *app_widget;
-       GsApp *app;
 
        app_widget = GS_APP_WIDGET (gtk_bin_get_child (GTK_BIN (row)));
-       app = gs_app_widget_get_app (app_widget);
-       gs_shell_show_app (shell_installed->priv->shell, app);
+
+       if (shell_installed->priv->selection_mode) {
+               gboolean selected;
+               selected = gs_app_widget_get_selected (app_widget);
+               gs_app_widget_set_selected (app_widget, !selected);
+       } else {
+               GsApp *app;
+               app = gs_app_widget_get_app (app_widget);
+               gs_shell_show_app (shell_installed->priv->shell, app);
+       }
 }
 
 typedef struct {
@@ -240,6 +248,10 @@ gs_shell_installed_add_app (GsShellInstalled *shell, GsApp *app)
        gs_app_widget_set_size_groups (GS_APP_WIDGET (widget),
                                       priv->sizegroup_image,
                                       priv->sizegroup_name);
+
+       gs_app_widget_set_selectable (GS_APP_WIDGET (widget),
+                                     priv->selection_mode);
+
        gtk_widget_show (widget);
 }
 
@@ -298,6 +310,9 @@ gs_shell_installed_refresh (GsShellInstalled *shell_installed, gboolean scroll_u
        if (gs_shell_get_mode (priv->shell) == GS_SHELL_MODE_INSTALLED) {
                widget = GTK_WIDGET (gtk_builder_get_object (priv->builder, "buttonbox_main"));
                gtk_widget_show (widget);
+
+               widget = GTK_WIDGET (gtk_builder_get_object (priv->builder, "button_select"));
+               gtk_widget_show (widget);
        }
 
        gtk_list_box_invalidate_sort (priv->list_box_installed);
@@ -542,6 +557,26 @@ gs_shell_installed_pending_apps_changed_cb (GsPluginLoader *plugin_loader,
        g_ptr_array_unref (pending);
 }
 
+static void
+selection_mode_cb (GtkToggleButton *button, GsShellInstalled *shell_installed)
+{
+       GsShellInstalledPrivate *priv = shell_installed->priv;
+       GList *children, *l;
+       GtkWidget *row;
+       GtkWidget *app_widget;
+       
+       priv->selection_mode = gtk_toggle_button_get_active (button);
+
+       children = gtk_container_get_children (GTK_CONTAINER (priv->list_box_installed));
+       for (l = children; l; l = l->next) {
+               row = l->data;
+               app_widget = gtk_bin_get_child (GTK_BIN (row));
+               gs_app_widget_set_selectable (GS_APP_WIDGET (app_widget),
+                                             priv->selection_mode);
+       }
+       g_list_free (children);
+}
+
 /**
  * gs_shell_installed_setup:
  */
@@ -553,6 +588,7 @@ gs_shell_installed_setup (GsShellInstalled *shell_installed,
                          GCancellable *cancellable)
 {
        GsShellInstalledPrivate *priv = shell_installed->priv;
+       GtkWidget *widget;
 
        g_return_if_fail (GS_IS_SHELL_INSTALLED (shell_installed));
 
@@ -575,6 +611,10 @@ gs_shell_installed_setup (GsShellInstalled *shell_installed,
        gtk_list_box_set_sort_func (priv->list_box_installed,
                                    gs_shell_installed_sort_func,
                                    shell_installed, NULL);
+       
+       widget = GTK_WIDGET (gtk_builder_get_object (priv->builder, "button_select"));
+       g_signal_connect (widget, "toggled",
+                         G_CALLBACK (selection_mode_cb), shell_installed);
 }
 
 /**
diff --git a/src/gs-shell.c b/src/gs-shell.c
index b060fcd..1eaa070 100644
--- a/src/gs-shell.c
+++ b/src/gs-shell.c
@@ -119,6 +119,8 @@ gs_shell_change_mode (GsShell *shell,
        gtk_widget_hide (widget);
        widget = GTK_WIDGET (gtk_builder_get_object (priv->builder, "button_remove"));
        gtk_widget_hide (widget);
+       widget = GTK_WIDGET (gtk_builder_get_object (priv->builder, "button_select"));
+       gtk_widget_hide (widget);
        widget = GTK_WIDGET (gtk_builder_get_object (priv->builder, "application_details_header"));
        gtk_widget_hide (widget);
        widget = GTK_WIDGET (gtk_builder_get_object (priv->builder, "button_back"));


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