diff --git a/gtk/Makefile.am b/gtk/Makefile.am index b892518dcd..99acbebfce 100644 --- a/gtk/Makefile.am +++ b/gtk/Makefile.am @@ -1097,6 +1097,7 @@ DND_CURSORS = \ COMPOSITE_TEMPLATES = \ gtkaboutdialog.ui \ + gtkappchooserdialog.ui \ gtkappchooserwidget.ui \ gtkassistant.ui \ gtkdialog.ui \ diff --git a/gtk/gtk.gresource.xml b/gtk/gtk.gresource.xml index d9c7a8d712..9361124d95 100644 --- a/gtk/gtk.gresource.xml +++ b/gtk/gtk.gresource.xml @@ -12,6 +12,7 @@ cursor_dnd_move.png cursor_dnd_copy.png gtkaboutdialog.ui + gtkappchooserdialog.ui gtkappchooserwidget.ui gtkassistant.ui gtkdialog.ui diff --git a/gtk/gtkappchooserdialog.c b/gtk/gtkappchooserdialog.c index 00882d5584..e55eac33e7 100644 --- a/gtk/gtkappchooserdialog.c +++ b/gtk/gtkappchooserdialog.c @@ -68,6 +68,7 @@ struct _GtkAppChooserDialogPrivate { GtkWidget *label; GtkWidget *button; GtkWidget *online_button; + GtkWidget *inner_box; GtkWidget *open_label; @@ -450,35 +451,14 @@ widget_populate_popup_cb (GtkAppChooserWidget *widget, } static void -build_dialog_ui (GtkAppChooserDialog *self) +construct_appchooser_widget (GtkAppChooserDialog *self) { - GtkWidget *vbox; - GtkWidget *vbox2; - GtkWidget *button, *w; GAppInfo *info; - gtk_container_set_border_width (GTK_CONTAINER (self), 5); - - vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 12); - gtk_container_set_border_width (GTK_CONTAINER (vbox), 5); - gtk_box_pack_start (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (self))), vbox, TRUE, TRUE, 0); - gtk_widget_show (vbox); - - vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6); - gtk_box_pack_start (GTK_BOX (vbox), vbox2, TRUE, TRUE, 0); - gtk_widget_show (vbox2); - - self->priv->label = gtk_label_new (""); - gtk_widget_set_halign (self->priv->label, GTK_ALIGN_START); - gtk_widget_set_valign (self->priv->label, GTK_ALIGN_CENTER); - gtk_label_set_line_wrap (GTK_LABEL (self->priv->label), TRUE); - gtk_box_pack_start (GTK_BOX (vbox2), self->priv->label, - FALSE, FALSE, 0); - gtk_widget_show (self->priv->label); - + /* Need to build the appchooser widget after, because of the content-type construct-only property */ self->priv->app_chooser_widget = gtk_app_chooser_widget_new (self->priv->content_type); - gtk_box_pack_start (GTK_BOX (vbox2), self->priv->app_chooser_widget, TRUE, TRUE, 0); + gtk_box_pack_start (GTK_BOX (self->priv->inner_box), self->priv->app_chooser_widget, TRUE, TRUE, 0); gtk_widget_show (self->priv->app_chooser_widget); g_signal_connect (self->priv->app_chooser_widget, "application-selected", @@ -490,32 +470,14 @@ build_dialog_ui (GtkAppChooserDialog *self) g_signal_connect (self->priv->app_chooser_widget, "populate-popup", G_CALLBACK (widget_populate_popup_cb), self); - button = gtk_button_new_with_label (_("Show other applications")); - self->priv->show_more_button = button; - w = gtk_image_new_from_stock (GTK_STOCK_ADD, - GTK_ICON_SIZE_BUTTON); - gtk_button_set_image (GTK_BUTTON (button), w); - gtk_box_pack_start (GTK_BOX (self->priv->app_chooser_widget), button, FALSE, FALSE, 6); - gtk_widget_show_all (button); - - g_signal_connect (button, "clicked", - G_CALLBACK (show_more_button_clicked_cb), self); - - gtk_dialog_add_button (GTK_DIALOG (self), - GTK_STOCK_CANCEL, - GTK_RESPONSE_CANCEL); - - self->priv->button = gtk_dialog_add_button (GTK_DIALOG (self), - _("_Select"), - GTK_RESPONSE_OK); + /* Add the custom button to the new appchooser */ + gtk_box_pack_start (GTK_BOX (self->priv->app_chooser_widget), + self->priv->show_more_button, FALSE, FALSE, 6); info = gtk_app_chooser_get_app_info (GTK_APP_CHOOSER (self->priv->app_chooser_widget)); gtk_widget_set_sensitive (self->priv->button, info != NULL); if (info) g_object_unref (info); - - gtk_dialog_set_default_response (GTK_DIALOG (self), - GTK_RESPONSE_OK); } static void @@ -560,7 +522,7 @@ gtk_app_chooser_dialog_constructed (GObject *object) if (G_OBJECT_CLASS (gtk_app_chooser_dialog_parent_class)->constructed != NULL) G_OBJECT_CLASS (gtk_app_chooser_dialog_parent_class)->constructed (object); - build_dialog_ui (self); + construct_appchooser_widget (self); set_dialog_properties (self); ensure_online_button (self); } @@ -650,6 +612,7 @@ gtk_app_chooser_dialog_iface_init (GtkAppChooserIface *iface) static void gtk_app_chooser_dialog_class_init (GtkAppChooserDialogClass *klass) { + GtkWidgetClass *widget_class; GObjectClass *gobject_class; GParamSpec *pspec; @@ -690,6 +653,16 @@ gtk_app_chooser_dialog_class_init (GtkAppChooserDialogClass *klass) G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); g_object_class_install_property (gobject_class, PROP_HEADING, pspec); + /* Bind class to template + */ + widget_class = GTK_WIDGET_CLASS (klass); + gtk_widget_class_set_template_from_resource (widget_class, + "/org/gtk/libgtk/gtkappchooserdialog.ui"); + gtk_widget_class_bind_child (widget_class, GtkAppChooserDialogPrivate, label); + gtk_widget_class_bind_child (widget_class, GtkAppChooserDialogPrivate, button); + gtk_widget_class_bind_child (widget_class, GtkAppChooserDialogPrivate, show_more_button); + gtk_widget_class_bind_child (widget_class, GtkAppChooserDialogPrivate, inner_box); + gtk_widget_class_bind_callback (widget_class, show_more_button_clicked_cb); g_type_class_add_private (klass, sizeof (GtkAppChooserDialogPrivate)); } @@ -700,11 +673,16 @@ gtk_app_chooser_dialog_init (GtkAppChooserDialog *self) self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, GTK_TYPE_APP_CHOOSER_DIALOG, GtkAppChooserDialogPrivate); + gtk_widget_init_template (GTK_WIDGET (self)); + /* we can't override the class signal handler here, as it's a RUN_LAST; * we want our signal handler instead to be executed before any user code. */ g_signal_connect (self, "response", G_CALLBACK (gtk_app_chooser_dialog_response), NULL); + + gtk_dialog_set_default_response (GTK_DIALOG (self), + GTK_RESPONSE_OK); } static void diff --git a/gtk/gtkappchooserdialog.ui b/gtk/gtkappchooserdialog.ui new file mode 100644 index 0000000000..720cde1871 --- /dev/null +++ b/gtk/gtkappchooserdialog.ui @@ -0,0 +1,123 @@ + + + + + + True + False + gtk-add + + + Show Other Applications + True + True + True + show_more_image + + + diff --git a/gtk/tests/templates.c b/gtk/tests/templates.c index 290037f11e..ea7b3065cd 100644 --- a/gtk/tests/templates.c +++ b/gtk/tests/templates.c @@ -129,6 +129,16 @@ test_app_chooser_widget_basic (void) gtk_widget_destroy (widget); } +static void +test_app_chooser_dialog_basic (void) +{ + GtkWidget *widget; + + widget = gtk_app_chooser_dialog_new_for_content_type (NULL, 0, "text/plain"); + g_assert (GTK_IS_APP_CHOOSER_DIALOG (widget)); + gtk_widget_destroy (widget); +} + int main (int argc, char **argv) { @@ -151,6 +161,7 @@ main (int argc, char **argv) g_test_add_func ("/Template/GtkScaleButton/Basic", test_scale_button_basic); g_test_add_func ("/Template/GtkStatusBar/Basic", test_statusbar_basic); g_test_add_func ("/Template/GtkAppChooserWidget/Basic", test_app_chooser_widget_basic); + g_test_add_func ("/Template/GtkAppChooserDialog/Basic", test_app_chooser_dialog_basic); return g_test_run(); }