diff options
author | Joshua Lee <lee.son.wai@gmail.com> | 2021-11-09 23:16:13 +0000 |
---|---|---|
committer | António Fernandes <antoniojpfernandes@gmail.com> | 2021-11-11 19:23:29 +0000 |
commit | e1ade201dc4dae774f5f6cfd7b119949a320cd3a (patch) | |
tree | 2d6e2f048f4476e287d5f1863cdab63a1d50f8e6 /src/nautilus-file-conflict-dialog.c | |
parent | 2e5d113e59ca450a643ccaecdacb25b344bf860c (diff) | |
download | nautilus-e1ade201dc4dae774f5f6cfd7b119949a320cd3a.tar.gz |
file-conflict-dialog: Port to GtkBuilder
Modify the dialog to be built declarartively to enhance maintainability and aid
in porting to GTK 4.
This introduces a minor UI change with the 'Replace'/'Rename' and 'Skip'
buttons swapping places, with the suggested action now the endmost button as
is standard practice.
Diffstat (limited to 'src/nautilus-file-conflict-dialog.c')
-rw-r--r-- | src/nautilus-file-conflict-dialog.c | 195 |
1 files changed, 35 insertions, 160 deletions
diff --git a/src/nautilus-file-conflict-dialog.c b/src/nautilus-file-conflict-dialog.c index 5832dbfce..727b09806 100644 --- a/src/nautilus-file-conflict-dialog.c +++ b/src/nautilus-file-conflict-dialog.c @@ -41,9 +41,10 @@ struct _NautilusFileConflictDialog gchar *suggested_name; /* UI objects */ - GtkWidget *titles_vbox; - GtkWidget *first_hbox; - GtkWidget *second_hbox; + GtkWidget *primary_label; + GtkWidget *secondary_label; + GtkWidget *dest_label; + GtkWidget *src_label; GtkWidget *expander; GtkWidget *entry; GtkWidget *checkbox; @@ -56,38 +57,13 @@ struct _NautilusFileConflictDialog G_DEFINE_TYPE (NautilusFileConflictDialog, nautilus_file_conflict_dialog, GTK_TYPE_DIALOG); -#define MAX_LABEL_WIDTH 50 - void nautilus_file_conflict_dialog_set_text (NautilusFileConflictDialog *fcd, gchar *primary_text, gchar *secondary_text) { - GtkWidget *label; - PangoAttrList *attr_list; - - label = gtk_label_new (primary_text); - gtk_label_set_line_wrap (GTK_LABEL (label), TRUE); - gtk_label_set_line_wrap_mode (GTK_LABEL (label), PANGO_WRAP_WORD_CHAR); - gtk_label_set_xalign (GTK_LABEL (label), 0.0); - gtk_label_set_max_width_chars (GTK_LABEL (label), MAX_LABEL_WIDTH); - gtk_box_pack_start (GTK_BOX (fcd->titles_vbox), label, FALSE, FALSE, 0); - gtk_widget_show (label); - - attr_list = pango_attr_list_new (); - pango_attr_list_insert (attr_list, pango_attr_weight_new (PANGO_WEIGHT_BOLD)); - pango_attr_list_insert (attr_list, pango_attr_scale_new (PANGO_SCALE_LARGE)); - g_object_set (label, "attributes", attr_list, NULL); - - pango_attr_list_unref (attr_list); - - label = gtk_label_new (secondary_text); - gtk_label_set_line_wrap (GTK_LABEL (label), TRUE); - gtk_label_set_line_wrap_mode (GTK_LABEL (label), PANGO_WRAP_WORD_CHAR); - gtk_label_set_xalign (GTK_LABEL (label), 0.0); - gtk_label_set_max_width_chars (GTK_LABEL (label), MAX_LABEL_WIDTH); - gtk_box_pack_start (GTK_BOX (fcd->titles_vbox), label, FALSE, FALSE, 0); - gtk_widget_show (label); + gtk_label_set_text (GTK_LABEL (fcd->primary_label), primary_text); + gtk_label_set_text (GTK_LABEL (fcd->secondary_label), secondary_text); } void @@ -95,27 +71,8 @@ nautilus_file_conflict_dialog_set_images (NautilusFileConflictDialog *fcd, GdkPixbuf *destination_pixbuf, GdkPixbuf *source_pixbuf) { - if (fcd->dest_image == NULL) - { - fcd->dest_image = gtk_image_new_from_pixbuf (destination_pixbuf); - gtk_box_pack_start (GTK_BOX (fcd->first_hbox), fcd->dest_image, FALSE, FALSE, 0); - gtk_widget_show (fcd->dest_image); - } - else - { - gtk_image_set_from_pixbuf (GTK_IMAGE (fcd->dest_image), destination_pixbuf); - } - - if (fcd->src_image == NULL) - { - fcd->src_image = gtk_image_new_from_pixbuf (source_pixbuf); - gtk_box_pack_start (GTK_BOX (fcd->second_hbox), fcd->src_image, FALSE, FALSE, 0); - gtk_widget_show (fcd->src_image); - } - else - { - gtk_image_set_from_pixbuf (GTK_IMAGE (fcd->src_image), source_pixbuf); - } + gtk_image_set_from_pixbuf (GTK_IMAGE (fcd->dest_image), destination_pixbuf); + gtk_image_set_from_pixbuf (GTK_IMAGE (fcd->src_image), source_pixbuf); } void @@ -123,17 +80,8 @@ nautilus_file_conflict_dialog_set_file_labels (NautilusFileConflictDialog *fcd, gchar *destination_label, gchar *source_label) { - GtkWidget *label; - - label = gtk_label_new (NULL); - gtk_label_set_markup (GTK_LABEL (label), destination_label); - gtk_box_pack_start (GTK_BOX (fcd->first_hbox), label, FALSE, FALSE, 0); - gtk_widget_show (label); - - label = gtk_label_new (NULL); - gtk_label_set_markup (GTK_LABEL (label), source_label); - gtk_box_pack_start (GTK_BOX (fcd->second_hbox), label, FALSE, FALSE, 0); - gtk_widget_show (label); + gtk_label_set_markup (GTK_LABEL (fcd->dest_label), destination_label); + gtk_label_set_markup (GTK_LABEL (fcd->src_label), source_label); } void @@ -270,94 +218,7 @@ reset_button_clicked_cb (GtkButton *w, static void nautilus_file_conflict_dialog_init (NautilusFileConflictDialog *fcd) { - GtkWidget *hbox, *vbox, *vbox2; - GtkWidget *widget, *dialog_area; - GtkDialog *dialog; - - dialog = GTK_DIALOG (fcd); - - /* Setup the vbox containing the dialog body */ - vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 12); - dialog_area = gtk_dialog_get_content_area (dialog); - gtk_box_pack_start (GTK_BOX (dialog_area), vbox, FALSE, FALSE, 0); - - /* Setup the vbox for the dialog labels */ - widget = gtk_box_new (GTK_ORIENTATION_VERTICAL, 12); - gtk_box_pack_start (GTK_BOX (vbox), widget, FALSE, FALSE, 0); - fcd->titles_vbox = widget; - - /* Setup the hboxes to pack file infos into */ - vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 12); - gtk_widget_set_halign (vbox2, GTK_ALIGN_START); - gtk_box_pack_start (GTK_BOX (vbox), vbox2, FALSE, FALSE, 0); - - hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 12); - gtk_box_pack_start (GTK_BOX (vbox2), hbox, FALSE, FALSE, 0); - fcd->first_hbox = hbox; - - hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 12); - gtk_box_pack_start (GTK_BOX (vbox2), hbox, FALSE, FALSE, 0); - fcd->second_hbox = hbox; - - /* Setup the expander for the rename action */ - fcd->expander = gtk_expander_new_with_mnemonic (_("_Select a new name for the destination")); - gtk_box_pack_start (GTK_BOX (vbox2), fcd->expander, FALSE, FALSE, 0); - g_signal_connect (fcd->expander, "notify::expanded", - G_CALLBACK (on_expanded_notify), dialog); - - hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6); - gtk_container_add (GTK_CONTAINER (fcd->expander), hbox); - - widget = gtk_entry_new (); - gtk_box_pack_start (GTK_BOX (hbox), widget, TRUE, TRUE, 6); - fcd->entry = widget; - g_signal_connect (widget, "changed", - G_CALLBACK (entry_text_changed_cb), dialog); - gtk_entry_set_activates_default (GTK_ENTRY (widget), TRUE); - - widget = gtk_button_new_with_label (_("Reset")); - gtk_box_pack_start (GTK_BOX (hbox), widget, FALSE, FALSE, 6); - g_signal_connect (widget, "clicked", - G_CALLBACK (reset_button_clicked_cb), dialog); - - gtk_widget_show_all (vbox2); - - /* Setup the checkbox to apply the action to all files */ - widget = gtk_check_button_new_with_mnemonic (_("Apply this action to all files and folders")); - - gtk_box_pack_start (GTK_BOX (vbox), widget, FALSE, FALSE, 0); - fcd->checkbox = widget; - g_signal_connect (widget, "toggled", - G_CALLBACK (checkbox_toggled_cb), dialog); - - /* Add buttons */ - gtk_dialog_add_button (dialog, _("_Cancel"), GTK_RESPONSE_CANCEL); - - fcd->skip_button = gtk_dialog_add_button (dialog, - _("_Skip"), - CONFLICT_RESPONSE_SKIP); - - fcd->rename_button = gtk_dialog_add_button (dialog, - _("Re_name"), - CONFLICT_RESPONSE_RENAME); - gtk_widget_hide (fcd->rename_button); - gtk_widget_set_no_show_all (fcd->rename_button, TRUE); - - fcd->replace_button = gtk_dialog_add_button (dialog, - _("Re_place"), - CONFLICT_RESPONSE_REPLACE); - gtk_widget_grab_focus (fcd->replace_button); - - /* Setup HIG properties */ - g_object_set (dialog_area, - "margin-top", 18, - "margin-bottom", 18, - "margin-start", 18, - "margin-end", 18, - NULL); - gtk_window_set_resizable (GTK_WINDOW (dialog), FALSE); - - gtk_widget_show_all (dialog_area); + gtk_widget_init_template (GTK_WIDGET (fcd)); } static void @@ -374,6 +235,26 @@ do_finalize (GObject *self) static void nautilus_file_conflict_dialog_class_init (NautilusFileConflictDialogClass *klass) { + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); + + gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/nautilus/ui/nautilus-file-conflict-dialog.ui"); + gtk_widget_class_bind_template_child (widget_class, NautilusFileConflictDialog, primary_label); + gtk_widget_class_bind_template_child (widget_class, NautilusFileConflictDialog, secondary_label); + gtk_widget_class_bind_template_child (widget_class, NautilusFileConflictDialog, dest_label); + gtk_widget_class_bind_template_child (widget_class, NautilusFileConflictDialog, src_label); + gtk_widget_class_bind_template_child (widget_class, NautilusFileConflictDialog, expander); + gtk_widget_class_bind_template_child (widget_class, NautilusFileConflictDialog, entry); + gtk_widget_class_bind_template_child (widget_class, NautilusFileConflictDialog, checkbox); + gtk_widget_class_bind_template_child (widget_class, NautilusFileConflictDialog, rename_button); + gtk_widget_class_bind_template_child (widget_class, NautilusFileConflictDialog, replace_button); + gtk_widget_class_bind_template_child (widget_class, NautilusFileConflictDialog, skip_button); + gtk_widget_class_bind_template_child (widget_class, NautilusFileConflictDialog, dest_image); + gtk_widget_class_bind_template_child (widget_class, NautilusFileConflictDialog, src_image); + gtk_widget_class_bind_template_callback (widget_class, entry_text_changed_cb); + gtk_widget_class_bind_template_callback (widget_class, on_expanded_notify); + gtk_widget_class_bind_template_callback (widget_class, checkbox_toggled_cb); + gtk_widget_class_bind_template_callback (widget_class, reset_button_clicked_cb); + G_OBJECT_CLASS (klass)->finalize = do_finalize; } @@ -392,14 +273,8 @@ nautilus_file_conflict_dialog_get_apply_to_all (NautilusFileConflictDialog *dial NautilusFileConflictDialog * nautilus_file_conflict_dialog_new (GtkWindow *parent) { - NautilusFileConflictDialog *dialog; - - dialog = NAUTILUS_FILE_CONFLICT_DIALOG (g_object_new (NAUTILUS_TYPE_FILE_CONFLICT_DIALOG, - "use-header-bar", TRUE, - "modal", TRUE, - NULL)); - - gtk_window_set_transient_for (GTK_WINDOW (dialog), parent); - - return dialog; + return NAUTILUS_FILE_CONFLICT_DIALOG (g_object_new (NAUTILUS_TYPE_FILE_CONFLICT_DIALOG, + "transient-for", parent, + "use-header-bar", TRUE, + NULL)); } |