filedialog: Add gtk_file_dialog_set_initial_name()
authorBenjamin Otte <otte@redhat.com>
Fri, 23 Dec 2022 02:43:01 +0000 (03:43 +0100)
committerMatthias Clasen <mclasen@redhat.com>
Sat, 24 Dec 2022 12:56:57 +0000 (07:56 -0500)
demos/constraint-editor/constraint-editor-window.c
demos/node-editor/node-editor-window.c
demos/print-editor/print-editor.c
gtk/gtkfiledialog.c
gtk/gtkfiledialog.h
gtk/gtkprinteroptionwidget.c
gtk/inspector/css-editor.c
gtk/inspector/recorder.c

index 6077ddd2f98203b0c5aac9c54ceb0e07c213c63b..1f81ac4a427616414b6641bec0afe720a3fe6d71 100644 (file)
@@ -342,7 +342,6 @@ save_cb (GtkWidget              *button,
   gtk_file_dialog_save (dialog,
                         GTK_WINDOW (gtk_widget_get_root (GTK_WIDGET (button))),
                         NULL, NULL,
-                        NULL,
                         save_response_cb, self);
   g_object_unref (dialog);
 }
index b6dc5eb8ce5d4b4e1ce648d9fc3e4a643f5c7d70..b790eda124281b6e70780816f858ac0ea927b7dd 100644 (file)
@@ -634,11 +634,11 @@ save_cb (GtkWidget        *button,
   gtk_file_dialog_set_title (dialog, "Save node");
   cwd = g_file_new_for_path (".");
   gtk_file_dialog_set_initial_folder (dialog, cwd);
+  gtk_file_dialog_set_initial_name (dialog, "demo.node");
   g_object_unref (cwd);
   gtk_file_dialog_save (dialog,
                         GTK_WINDOW (gtk_widget_get_root (GTK_WIDGET (button))),
                         NULL,
-                        "demo.node",
                         NULL,
                         save_response_cb, self);
   g_object_unref (dialog);
@@ -742,10 +742,10 @@ export_image_cb (GtkWidget        *button,
 
   dialog = gtk_file_dialog_new ();
   gtk_file_dialog_set_title (dialog, "");
+  gtk_file_dialog_set_initial_name (dialog, "example.png");
   gtk_file_dialog_save (dialog,
                         GTK_WINDOW (gtk_widget_get_root (GTK_WIDGET (button))),
                         NULL,
-                        "example.png",
                         NULL,
                         export_image_response_cb, texture);
   g_object_unref (dialog);
index 34ed5a894e9fb3117bfc94f2f3327f3ecf672469..daa95c0610974babf25d2dc4cd8c6e5eb1e055db 100644 (file)
@@ -509,7 +509,6 @@ activate_save_as (GSimpleAction *action,
                         GTK_WINDOW (main_window),
                         NULL,
                         NULL,
-                        NULL,
                         on_save_response, NULL);
   g_object_unref (dialog);
 }
index bd6e3f6bddb3f59407adf512c9dc8f26ae514237..c8242a1bc805d4d2736ee4c7ad30301528cabed5 100644 (file)
@@ -59,17 +59,20 @@ struct _GtkFileDialog
   GListModel *shortcut_folders;
   GtkFileFilter *current_filter;
   GFile *initial_folder;
+  char *initial_name;
 };
 
 enum
 {
-  PROP_TITLE = 1,
-  PROP_MODAL,
-  PROP_FILTERS,
-  PROP_SHORTCUT_FOLDERS,
+  PROP_0,
+  PROP_ACCEPT_LABEL,
   PROP_CURRENT_FILTER,
+  PROP_FILTERS,
   PROP_INITIAL_FOLDER,
-  PROP_ACCEPT_LABEL,
+  PROP_INITIAL_NAME,
+  PROP_MODAL,
+  PROP_SHORTCUT_FOLDERS,
+  PROP_TITLE,
 
   NUM_PROPERTIES
 };
@@ -95,6 +98,7 @@ gtk_file_dialog_finalize (GObject *object)
   g_clear_object (&self->shortcut_folders);
   g_clear_object (&self->current_filter);
   g_clear_object (&self->initial_folder);
+  g_free (self->initial_name);
 
   G_OBJECT_CLASS (gtk_file_dialog_parent_class)->finalize (object);
 }
@@ -133,6 +137,10 @@ gtk_file_dialog_get_property (GObject      *object,
       g_value_set_object (value, self->initial_folder);
       break;
 
+    case PROP_INITIAL_NAME:
+      g_value_set_string (value, self->initial_name);
+      break;
+
     case PROP_ACCEPT_LABEL:
       g_value_set_string (value, self->accept_label);
       break;
@@ -177,6 +185,10 @@ gtk_file_dialog_set_property (GObject      *object,
       gtk_file_dialog_set_initial_folder (self, g_value_get_object (value));
       break;
 
+    case PROP_INITIAL_NAME:
+      gtk_file_dialog_set_initial_name (self, g_value_get_string (value));
+      break;
+
     case PROP_ACCEPT_LABEL:
       gtk_file_dialog_set_accept_label (self, g_value_get_string (value));
       break;
@@ -271,6 +283,19 @@ gtk_file_dialog_class_init (GtkFileDialogClass *class)
                            G_TYPE_FILE,
                            G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS|G_PARAM_EXPLICIT_NOTIFY);
 
+  /**
+   * GtkFileDialog:initial-name: (attributes org.gtk.Property.get=gtk_file_dialog_get_initial_name org.gtk.Property.set=gtk_file_dialog_set_initial_name)
+   *
+   * The inital name, that is, the filename that is initially
+   * selected in the file chooser dialog.
+   *
+   * Since: 4.10
+   */
+  properties[PROP_INITIAL_NAME] =
+      g_param_spec_string ("initial-name", NULL, NULL,
+                           NULL,
+                           G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS|G_PARAM_EXPLICIT_NOTIFY);
+
   /**
    * GtkFileDialog:accept-label: (attributes org.gtk.Property.get=gtk_file_dialog_get_accept_label org.gtk.Property.set=gtk_file_dialog_set_accept_label)
    *
@@ -616,6 +641,49 @@ gtk_file_dialog_set_initial_folder (GtkFileDialog *self,
   g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_INITIAL_FOLDER]);
 }
 
+/**
+ * gtk_file_dialog_get_initial_name:
+ * @self: a `GtkFileDialog`
+ *
+ * Gets the name for the file that should be initially set.
+ *
+ * Returns: (nullable) (transfer none): the name
+ *
+ * Since: 4.10
+ */
+const char *
+gtk_file_dialog_get_initial_name (GtkFileDialog *self)
+{
+  g_return_val_if_fail (GTK_IS_FILE_DIALOG (self), NULL);
+
+  return self->initial_name;
+}
+
+/**
+ * gtk_file_dialog_set_initial_name:
+ * @self: a `GtkFileDialog`
+ * @name: (nullable): a UTF8 string
+ *
+ * Sets the name for the file that should be initially set.
+ * For saving dialogs, this will usually be pre-entered into the name field.
+ *
+ * If a file with this name already exists in the directory set via
+ * [property@Gtk.FileDialog:initial-folder], the dialog should preselect it.
+ *
+ * Since: 4.10
+ */
+void
+gtk_file_dialog_set_initial_name (GtkFileDialog *self,
+                                  const char    *name)
+{
+  g_return_if_fail (GTK_IS_FILE_DIALOG (self));
+
+  if (!g_set_str (&self->initial_name, name))
+    return;
+
+  g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_INITIAL_NAME]);
+}
+
 /* }}} */
 /* {{{ Async implementation */
 
@@ -676,7 +744,6 @@ create_file_chooser (GtkFileDialog        *self,
                      GtkWindow            *parent,
                      GtkFileChooserAction  action,
                      GFile                *current_file,
-                     const char           *current_name,
                      gboolean              select_multiple)
 {
   GtkFileChooserNative *chooser;
@@ -738,8 +805,8 @@ create_file_chooser (GtkFileDialog        *self,
     gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (chooser), self->initial_folder, NULL);
   if (current_file)
     gtk_file_chooser_set_file (GTK_FILE_CHOOSER (chooser), current_file, NULL);
-  else if (current_name)
-    gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER (chooser), current_name);
+  else if (self->initial_name)
+    gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER (chooser), self->initial_name);
 
   return chooser;
 }
@@ -815,7 +882,7 @@ gtk_file_dialog_open (GtkFileDialog       *self,
   g_return_if_fail (GTK_IS_FILE_DIALOG (self));
 
   chooser = create_file_chooser (self, parent, GTK_FILE_CHOOSER_ACTION_OPEN,
-                                 current_file, NULL, FALSE);
+                                 current_file, FALSE);
 
   task = g_task_new (self, cancellable, callback, user_data);
   g_task_set_check_cancellable (task, FALSE);
@@ -892,7 +959,7 @@ gtk_file_dialog_select_folder (GtkFileDialog       *self,
   g_return_if_fail (GTK_IS_FILE_DIALOG (self));
 
   chooser = create_file_chooser (self, parent, GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
-                                 initial_folder, NULL, FALSE);
+                                 initial_folder, FALSE);
 
   task = g_task_new (self, cancellable, callback, user_data);
   g_task_set_check_cancellable (task, FALSE);
@@ -938,7 +1005,6 @@ gtk_file_dialog_select_folder_finish (GtkFileDialog  *self,
  * @self: a `GtkFileDialog`
  * @parent: (nullable): the parent `GtkWindow`
  * @current_file: (nullable): the initial file
- * @current_name: (nullable): the initial filename to offer
  * @cancellable: (nullable): a `GCancellable` to cancel the operation
  * @callback: (scope async): a callback to call when the operation is complete
  * @user_data: (closure callback): data to pass to @callback
@@ -963,7 +1029,6 @@ void
 gtk_file_dialog_save (GtkFileDialog       *self,
                       GtkWindow           *parent,
                       GFile               *current_file,
-                      const char          *current_name,
                       GCancellable        *cancellable,
                       GAsyncReadyCallback  callback,
                       gpointer             user_data)
@@ -974,7 +1039,7 @@ gtk_file_dialog_save (GtkFileDialog       *self,
   g_return_if_fail (GTK_IS_FILE_DIALOG (self));
 
   chooser = create_file_chooser (self, parent, GTK_FILE_CHOOSER_ACTION_SAVE,
-                                 current_file, current_name, FALSE);
+                                 current_file, FALSE);
 
   task = g_task_new (self, cancellable, callback, user_data);
   g_task_set_check_cancellable (task, FALSE);
@@ -1048,7 +1113,7 @@ gtk_file_dialog_open_multiple (GtkFileDialog       *self,
   g_return_if_fail (GTK_IS_FILE_DIALOG (self));
 
   chooser = create_file_chooser (self, parent, GTK_FILE_CHOOSER_ACTION_OPEN,
-                                 NULL, NULL, TRUE);
+                                 NULL, TRUE);
 
   task = g_task_new (self, cancellable, callback, user_data);
   g_task_set_check_cancellable (task, FALSE);
@@ -1123,7 +1188,7 @@ gtk_file_dialog_select_multiple_folders (GtkFileDialog       *self,
   g_return_if_fail (GTK_IS_FILE_DIALOG (self));
 
   chooser = create_file_chooser (self, parent, GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
-                                 NULL, NULL, TRUE);
+                                 NULL, TRUE);
 
   task = g_task_new (self, cancellable, callback, user_data);
   g_task_set_check_cancellable (task, FALSE);
index 69123baacc45e685bcb92d4d12d5d9868e83c3d3..de5574972a29e52ae4da8ac55d27a5612f2b1dfc 100644 (file)
@@ -80,6 +80,13 @@ GDK_AVAILABLE_IN_4_10
 void             gtk_file_dialog_set_initial_folder  (GtkFileDialog        *self,
                                                       GFile                *folder);
 
+GDK_AVAILABLE_IN_4_10
+const char *     gtk_file_dialog_get_initial_name    (GtkFileDialog        *self);
+
+GDK_AVAILABLE_IN_4_10
+void             gtk_file_dialog_set_initial_name    (GtkFileDialog        *self,
+                                                      const char           *name);
+
 GDK_AVAILABLE_IN_4_10
 void             gtk_file_dialog_open                (GtkFileDialog        *self,
                                                       GtkWindow            *parent,
@@ -111,7 +118,6 @@ GDK_AVAILABLE_IN_4_10
 void             gtk_file_dialog_save                (GtkFileDialog        *self,
                                                       GtkWindow            *parent,
                                                       GFile                *current_file,
-                                                      const char           *current_name,
                                                       GCancellable         *cancellable,
                                                       GAsyncReadyCallback   callback,
                                                       gpointer              user_data);
index 1922e759d38dfdd9d2f27dbb5db5c1514516eb36..c84532b14d671b9e37c2569d623413eb45c85f83 100644 (file)
@@ -737,10 +737,10 @@ filesave_choose_cb (GtkWidget              *button,
 
   dialog = gtk_file_dialog_new ();
   gtk_file_dialog_set_title (dialog, _("Select a filename"));
+  gtk_file_dialog_set_initial_name (dialog, current_name);
   gtk_file_dialog_save (dialog,
                         GTK_WINDOW (gtk_widget_get_root (GTK_WIDGET (widget))),
                         current_folder,
-                        current_name,
                         NULL,
                         dialog_response_callback, widget);
 
index 6b866e27b81f5d6ff7f56b14d562e397b8fc681d..0f177add9dd21f5b00034280c1badca36bc64208 100644 (file)
@@ -243,10 +243,10 @@ save_clicked (GtkButton             *button,
   GtkFileDialog *dialog;
 
   dialog = gtk_file_dialog_new ();
+  gtk_file_dialog_set_initial_name (dialog, "custom.css");
   gtk_file_dialog_save (dialog,
                         GTK_WINDOW (gtk_widget_get_root (GTK_WIDGET (ce))),
-                        NULL, "custom.css",
-                        NULL,
+                        NULL, NULL,
                         save_response, ce);
   g_object_unref (dialog);
 }
index cb8b6b2ca82f70fbfe63938164b975be11bc5beb..f827e30108906d972a0c33cc5b9e03ae7e2db21d 100644 (file)
@@ -1859,12 +1859,14 @@ render_node_save (GtkButton            *button,
   filename = g_strdup_printf ("%s.node", nodename);
 
   dialog = gtk_file_dialog_new ();
+  gtk_file_dialog_set_initial_name (dialog, filename);
   gtk_file_dialog_save (dialog,
                         GTK_WINDOW (gtk_widget_get_root (GTK_WIDGET (recorder))),
-                        NULL, filename,
-                        NULL,
+                        NULL, NULL,
                         render_node_save_response, node);
   g_object_unref (dialog);
+  g_free (filename);
+  g_free (nodename);
 }
 
 static void