gtk-demo: Add folders to the clipboard demo
authorMatthias Clasen <mclasen@redhat.com>
Thu, 17 Nov 2022 11:29:17 +0000 (06:29 -0500)
committerMatthias Clasen <mclasen@redhat.com>
Thu, 17 Nov 2022 11:31:09 +0000 (06:31 -0500)
This is handy for testing a case where folder
dnd does not work with the file transfer portal.

See #5348

demos/gtk-demo/clipboard.c
demos/gtk-demo/clipboard.ui

index 80825ce982708454ea03913bd6c6dc0ab4fcb532..fd103a676ce2c11c6fb16c5f5eada131e15bdda5 100644 (file)
@@ -248,6 +248,38 @@ open_file_cb (GtkWidget *button)
                         file_chooser_response, button);
 }
 
+static void
+folder_chooser_response (GObject *source,
+                         GAsyncResult *result,
+                         gpointer user_data)
+{
+  GtkFileDialog *dialog = GTK_FILE_DIALOG (source);
+  GtkButton *button = GTK_BUTTON (user_data);
+  GFile *file;
+
+  file = gtk_file_dialog_select_folder_finish (dialog, result, NULL);
+  if (file)
+    {
+      file_button_set_file (button, file);
+      g_object_unref (file);
+
+      update_copy_button_sensitivity (gtk_widget_get_ancestor (GTK_WIDGET (button), GTK_TYPE_STACK));
+    }
+}
+
+static void
+open_folder_cb (GtkWidget *button)
+{
+  GtkFileDialog *dialog;
+
+  dialog = gtk_file_dialog_new ();
+
+  gtk_file_dialog_select_folder (dialog,
+                                 GTK_WINDOW (gtk_widget_get_ancestor (button, GTK_TYPE_WINDOW)),
+                                 NULL,
+                                 NULL,
+                                 folder_chooser_response, button);
+}
 static void
 update_paste_button_sensitivity (GdkClipboard *clipboard,
                                  GtkWidget    *paste_button)
@@ -346,6 +378,7 @@ do_clipboard (GtkWidget *do_widget)
       gtk_builder_cscope_add_callback (scope, source_changed_cb);
       gtk_builder_cscope_add_callback (scope, text_changed_cb);
       gtk_builder_cscope_add_callback (scope, open_file_cb);
+      gtk_builder_cscope_add_callback (scope, open_folder_cb);
       gtk_builder_cscope_add_callback (scope, on_drop);
       gtk_builder_cscope_add_callback (scope, drag_prepare);
       builder = gtk_builder_new ();
index 6cc7ed4324e3bdad59e366deb55bb69f2fc8b015..a373537f6b10a4648749cc18ad8554b1667fbaad 100644 (file)
@@ -32,6 +32,7 @@
                       <item>Color</item>
                       <item>Image</item>
                       <item>File</item>
+                      <item>Folder</item>
                     </items>
                   </object>
                 </property>
                     </property>
                   </object>
                 </child>
+                <child>
+                  <object class="GtkStackPage">
+                    <property name="name">Folder</property>
+                    <property name="child">
+                      <object class="GtkButton" id="source_folder">
+                        <child>
+                          <object class="GtkDragSource">
+                            <property name="propagation-phase">capture</property>
+                            <signal name="prepare" handler="drag_prepare"/>
+                          </object>
+                        </child>
+                        <property name="valign">center</property>
+                        <property name="child">
+                          <object class="GtkLabel">
+                            <property name="label">—</property>
+                            <property name="xalign">0</property>
+                            <property name="ellipsize">start</property>
+                          </object>
+                        </property>
+                        <signal name="clicked" handler="open_folder_cb"/>
+                      </object>
+                    </property>
+                  </object>
+                </child>
               </object>
             </child>
             <child>