[nautilus/wip/apoos-maximus/gsoc2020: 3/25] properties-window: Define icon widget in template




commit d1774e846506f0ad9be3b656438724285c0a5149
Author: Apoorv Sachan <apoorv 99 sachan gmail com>
Date:   Wed Jun 10 04:18:55 2020 +0530

    properties-window: Define icon widget in template
    
    The GtkImage that displays the window icon may or may not be contained
    by a GtkButton, depending on whether we were able to set a custom icon.
    
    In GtkBuilder UI definitions we cannot do this anymore, as we have to
    set a parent for the image widget from the start.
    
    So, define both a simple image and a button with an image, and pack
    them in a GtkStack to only show the button when appropriate.

 src/nautilus-properties-window.c               | 55 +++++++++++---------------
 src/resources/ui/nautilus-properties-window.ui | 42 ++++++++++++++++----
 2 files changed, 57 insertions(+), 40 deletions(-)
---
diff --git a/src/nautilus-properties-window.c b/src/nautilus-properties-window.c
index 76989936c..b48d364d8 100644
--- a/src/nautilus-properties-window.c
+++ b/src/nautilus-properties-window.c
@@ -84,13 +84,14 @@ struct _NautilusPropertiesWindow
 
     /* Basic tab widgets */
 
-    GtkBox *image_box;
-    GtkGrid *basic_grid;
-
-    GtkWidget *icon_button;
+    GtkStack *icon_stack;
     GtkWidget *icon_image;
+    GtkWidget *icon_button;
+    GtkWidget *icon_button_image;
     GtkWidget *icon_chooser;
 
+    GtkGrid *basic_grid;
+
     GtkLabel *name_label;
     GtkWidget *name_field;
     unsigned int name_row;
@@ -410,6 +411,7 @@ update_properties_window_icon (NautilusPropertiesWindow *window)
     surface = gdk_cairo_surface_create_from_pixbuf (pixbuf, gtk_widget_get_scale_factor (GTK_WIDGET 
(window)),
                                                     gtk_widget_get_window (GTK_WIDGET (window)));
     gtk_image_set_from_surface (GTK_IMAGE (window->icon_image), surface);
+    gtk_image_set_from_surface (GTK_IMAGE (window->icon_button_image), surface);
 
     g_free (name);
     g_object_unref (pixbuf);
@@ -518,40 +520,30 @@ nautilus_properties_window_drag_data_received (GtkWidget        *widget,
     g_strfreev (uris);
 }
 
-static GtkWidget *
-create_image_widget (NautilusPropertiesWindow *window,
-                     gboolean                  is_customizable)
+static void
+setup_image_widget (NautilusPropertiesWindow *window,
+                    gboolean                  is_customizable)
 {
-    GtkWidget *button;
-    GtkWidget *image;
-
-    image = gtk_image_new ();
-    window->icon_image = image;
-
     update_properties_window_icon (window);
-    gtk_widget_show (image);
 
-    button = NULL;
     if (is_customizable)
     {
-        button = gtk_button_new ();
-        gtk_container_add (GTK_CONTAINER (button), image);
-
         /* prepare the image to receive dropped objects to assign custom images */
-        gtk_drag_dest_set (GTK_WIDGET (image),
+        gtk_drag_dest_set (window->icon_button_image,
                            GTK_DEST_DEFAULT_MOTION | GTK_DEST_DEFAULT_HIGHLIGHT | GTK_DEST_DEFAULT_DROP,
                            target_table, G_N_ELEMENTS (target_table),
                            GDK_ACTION_COPY | GDK_ACTION_MOVE);
 
-        g_signal_connect (image, "drag-data-received",
+        g_signal_connect (window->icon_button_image, "drag-data-received",
                           G_CALLBACK (nautilus_properties_window_drag_data_received), NULL);
-        g_signal_connect (button, "clicked",
+        g_signal_connect (window->icon_button, "clicked",
                           G_CALLBACK (select_image_button_callback), window);
+        gtk_stack_set_visible_child (window->icon_stack, window->icon_button);
+    }
+    else
+    {
+        gtk_stack_set_visible_child (window->icon_stack, window->icon_image);
     }
-
-    window->icon_button = button;
-
-    return button != NULL ? button : image;
 }
 
 static void
@@ -3148,18 +3140,12 @@ static void
 create_basic_page (NautilusPropertiesWindow *window)
 {
     GtkGrid *grid;
-    GtkWidget *icon_pixmap_widget;
     GtkWidget *volume_usage;
     GtkWidget *button;
 
     /* Icon pixmap */
 
-    icon_pixmap_widget = create_image_widget (
-        window, should_show_custom_icon_buttons (window));
-    gtk_widget_set_valign (icon_pixmap_widget, GTK_ALIGN_START);
-    gtk_widget_show (icon_pixmap_widget);
-
-    gtk_box_pack_start (window->image_box, icon_pixmap_widget, FALSE, FALSE, 0);
+    setup_image_widget (window, should_show_custom_icon_buttons (window));
 
     window->icon_chooser = NULL;
 
@@ -5779,7 +5765,10 @@ nautilus_properties_window_class_init (NautilusPropertiesWindowClass *klass)
     gtk_widget_class_set_template_from_resource (widget_class, 
"/org/gnome/nautilus/ui/nautilus-properties-window.ui");
 
     gtk_widget_class_bind_template_child (widget_class, NautilusPropertiesWindow, notebook);
-    gtk_widget_class_bind_template_child (widget_class, NautilusPropertiesWindow, image_box);
+    gtk_widget_class_bind_template_child (widget_class, NautilusPropertiesWindow, icon_stack);
+    gtk_widget_class_bind_template_child (widget_class, NautilusPropertiesWindow, icon_image);
+    gtk_widget_class_bind_template_child (widget_class, NautilusPropertiesWindow, icon_button);
+    gtk_widget_class_bind_template_child (widget_class, NautilusPropertiesWindow, icon_button_image);
     gtk_widget_class_bind_template_child (widget_class, NautilusPropertiesWindow, basic_grid);
 }
 
diff --git a/src/resources/ui/nautilus-properties-window.ui b/src/resources/ui/nautilus-properties-window.ui
index 5b6a62f34..b3bacba78 100644
--- a/src/resources/ui/nautilus-properties-window.ui
+++ b/src/resources/ui/nautilus-properties-window.ui
@@ -1,14 +1,11 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- Generated with glade 3.22.2 -->
+<!-- Generated with glade 3.36.0 -->
 <interface>
   <requires lib="gtk+" version="3.20"/>
   <template class="NautilusPropertiesWindow" parent="GtkWindow">
     <property name="can_focus">False</property>
     <property name="modal">True</property>
     <property name="type_hint">dialog</property>
-    <child type="titlebar">
-      <placeholder/>
-    </child>
     <child>
       <object class="GtkBox" id="content_box">
         <property name="visible">True</property>
@@ -25,12 +22,37 @@
                 <property name="border_width">12</property>
                 <property name="spacing">12</property>
                 <child>
-                  <object class="GtkBox" id="image_box">
+                  <object class="GtkStack" id="icon_stack">
                     <property name="visible">True</property>
                     <property name="can_focus">False</property>
-                    <property name="orientation">vertical</property>
+                    <property name="valign">start</property>
                     <child>
-                      <placeholder/>
+                      <object class="GtkImage" id="icon_image">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="stock">gtk-missing-image</property>
+                      </object>
+                      <packing>
+                        <property name="name">icon_image</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkButton" id="icon_button">
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">True</property>
+                        <child>
+                          <object class="GtkImage" id="icon_button_image">
+                            <property name="visible">True</property>
+                            <property name="can_focus">False</property>
+                            <property name="stock">gtk-missing-image</property>
+                          </object>
+                        </child>
+                      </object>
+                      <packing>
+                        <property name="name">icon_button</property>
+                        <property name="position">1</property>
+                      </packing>
                     </child>
                   </object>
                   <packing>
@@ -76,6 +98,9 @@
                         <child>
                           <placeholder/>
                         </child>
+                        <child>
+                          <placeholder/>
+                        </child>
                       </object>
                       <packing>
                         <property name="expand">False</property>
@@ -126,5 +151,8 @@
         </child>
       </object>
     </child>
+    <child type="titlebar">
+      <placeholder/>
+    </child>
   </template>
 </interface>


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