mirror of
https://gitlab.gnome.org/GNOME/gtk.git
synced 2024-11-10 10:50:10 +00:00
Modernize the app chooser dialog
This is according to suggestions in https://bugzilla.gnome.org/show_bug.cgi?id=724218
This commit is contained in:
parent
3e02f52031
commit
6578c9d876
@ -66,13 +66,13 @@ struct _GtkAppChooserDialogPrivate {
|
||||
char *heading;
|
||||
|
||||
GtkWidget *label;
|
||||
GtkWidget *software_button;
|
||||
GtkWidget *inner_box;
|
||||
|
||||
GtkWidget *open_label;
|
||||
|
||||
GtkWidget *app_chooser_widget;
|
||||
GtkWidget *show_more_button;
|
||||
GtkWidget *software_button;
|
||||
|
||||
gboolean show_more_clicked;
|
||||
gboolean dismissed;
|
||||
@ -165,18 +165,18 @@ get_extension (const char *basename)
|
||||
static void
|
||||
set_dialog_properties (GtkAppChooserDialog *self)
|
||||
{
|
||||
gchar *label;
|
||||
gchar *name;
|
||||
gchar *extension;
|
||||
gchar *description;
|
||||
gchar *default_text;
|
||||
gchar *string;
|
||||
gboolean unknown;
|
||||
PangoFontDescription *font_desc;
|
||||
gchar *title;
|
||||
gchar *subtitle;
|
||||
gboolean use_header;
|
||||
GtkWidget *header;
|
||||
|
||||
name = NULL;
|
||||
extension = NULL;
|
||||
label = NULL;
|
||||
description = NULL;
|
||||
unknown = TRUE;
|
||||
|
||||
@ -192,48 +192,54 @@ set_dialog_properties (GtkAppChooserDialog *self)
|
||||
unknown = g_content_type_is_unknown (self->priv->content_type);
|
||||
}
|
||||
|
||||
gtk_window_set_title (GTK_WINDOW (self), "");
|
||||
|
||||
if (name != NULL)
|
||||
{
|
||||
title = g_strdup (_("Select Application"));
|
||||
/* Translators: %s is a filename */
|
||||
label = g_strdup_printf (_("Select an application to open “%s”"), name);
|
||||
string = g_strdup_printf (_("No applications available to open “%s”"),
|
||||
name);
|
||||
subtitle = g_strdup_printf (_("Opening “%s”."), name);
|
||||
string = g_strdup_printf (_("No applications found for “%s”"), name);
|
||||
}
|
||||
else
|
||||
{
|
||||
title = g_strdup (_("Select Application"));
|
||||
/* Translators: %s is a file type description */
|
||||
label = g_strdup_printf (_("Select an application for “%s” files"),
|
||||
unknown ? self->priv->content_type : description);
|
||||
string = g_strdup_printf (_("No applications available to open “%s” files"),
|
||||
unknown ? self->priv->content_type : description);
|
||||
subtitle = g_strdup_printf (_("Opening “%s” files."),
|
||||
unknown ? self->priv->content_type : description);
|
||||
string = g_strdup_printf (_("No applications found for “%s” files"),
|
||||
unknown ? self->priv->content_type : description);
|
||||
}
|
||||
|
||||
font_desc = pango_font_description_new ();
|
||||
pango_font_description_set_weight (font_desc, PANGO_WEIGHT_BOLD);
|
||||
gtk_widget_override_font (self->priv->label, font_desc);
|
||||
pango_font_description_free (font_desc);
|
||||
g_object_get (self, "use-header-bar", &use_header, NULL);
|
||||
if (use_header)
|
||||
{
|
||||
header = gtk_dialog_get_header_bar (GTK_DIALOG (self));
|
||||
gtk_header_bar_set_title (GTK_HEADER_BAR (header), title);
|
||||
gtk_header_bar_set_subtitle (GTK_HEADER_BAR (header), subtitle);
|
||||
}
|
||||
else
|
||||
{
|
||||
gtk_window_set_title (GTK_WINDOW (self), _("Select Application"));
|
||||
}
|
||||
|
||||
if (self->priv->heading != NULL)
|
||||
gtk_label_set_markup (GTK_LABEL (self->priv->label), self->priv->heading);
|
||||
{
|
||||
gtk_label_set_markup (GTK_LABEL (self->priv->label), self->priv->heading);
|
||||
gtk_widget_show (self->priv->label);
|
||||
}
|
||||
else
|
||||
gtk_label_set_markup (GTK_LABEL (self->priv->label), label);
|
||||
|
||||
default_text = g_strdup_printf ("<big><b>%s</b></big>\n%s",
|
||||
string,
|
||||
_("Click \"Show other applications\", for more options, or "
|
||||
"\"Software\" to install a new application"));
|
||||
{
|
||||
gtk_widget_hide (self->priv->label);
|
||||
}
|
||||
|
||||
gtk_app_chooser_widget_set_default_text (GTK_APP_CHOOSER_WIDGET (self->priv->app_chooser_widget),
|
||||
default_text);
|
||||
string);
|
||||
|
||||
g_free (label);
|
||||
g_free (title);
|
||||
g_free (subtitle);
|
||||
g_free (name);
|
||||
g_free (extension);
|
||||
g_free (description);
|
||||
g_free (string);
|
||||
g_free (default_text);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -323,8 +329,7 @@ construct_appchooser_widget (GtkAppChooserDialog *self)
|
||||
GAppInfo *info;
|
||||
|
||||
/* 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);
|
||||
self->priv->app_chooser_widget = gtk_app_chooser_widget_new (self->priv->content_type);
|
||||
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);
|
||||
|
||||
@ -338,8 +343,11 @@ construct_appchooser_widget (GtkAppChooserDialog *self)
|
||||
G_CALLBACK (widget_populate_popup_cb), self);
|
||||
|
||||
/* 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);
|
||||
gtk_box_pack_start (GTK_BOX (self->priv->inner_box),
|
||||
self->priv->show_more_button, FALSE, FALSE, 0);
|
||||
|
||||
gtk_box_pack_start (GTK_BOX (self->priv->inner_box),
|
||||
self->priv->software_button, FALSE, FALSE, 0);
|
||||
|
||||
info = gtk_app_chooser_get_app_info (GTK_APP_CHOOSER (self->priv->app_chooser_widget));
|
||||
gtk_dialog_set_response_sensitive (GTK_DIALOG (self), GTK_RESPONSE_OK, info != NULL);
|
||||
@ -434,34 +442,9 @@ static void
|
||||
ensure_software_button (GtkAppChooserDialog *self)
|
||||
{
|
||||
if (g_find_program_in_path ("gnome-software"))
|
||||
{
|
||||
GtkWidget *parent;
|
||||
gboolean use_header;
|
||||
|
||||
self->priv->software_button = gtk_button_new_with_label (_("Software"));
|
||||
|
||||
gtk_button_set_always_show_image (GTK_BUTTON (self->priv->software_button), TRUE);
|
||||
gtk_button_set_image (GTK_BUTTON (self->priv->software_button), gtk_image_new_from_icon_name ("gnome-software", GTK_ICON_SIZE_BUTTON));
|
||||
gtk_widget_set_valign (self->priv->software_button, GTK_ALIGN_CENTER);
|
||||
g_signal_connect (self->priv->software_button, "clicked",
|
||||
G_CALLBACK (software_button_clicked_cb), self);
|
||||
gtk_widget_show (self->priv->software_button);
|
||||
|
||||
g_object_get (self, "use-header-bar", &use_header, NULL);
|
||||
if (use_header)
|
||||
{
|
||||
parent = gtk_dialog_get_header_bar (GTK_DIALOG (self));
|
||||
gtk_header_bar_pack_end (GTK_HEADER_BAR (parent), self->priv->software_button);
|
||||
}
|
||||
else
|
||||
{
|
||||
G_GNUC_BEGIN_IGNORE_DEPRECATIONS
|
||||
parent = gtk_dialog_get_action_area (GTK_DIALOG (self));
|
||||
gtk_container_add (GTK_CONTAINER (parent), self->priv->software_button);
|
||||
gtk_button_box_set_child_secondary (GTK_BUTTON_BOX (parent), self->priv->software_button, TRUE);
|
||||
G_GNUC_END_IGNORE_DEPRECATIONS
|
||||
}
|
||||
}
|
||||
gtk_widget_show (self->priv->software_button);
|
||||
else
|
||||
gtk_widget_hide (self->priv->software_button);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -611,8 +594,10 @@ gtk_app_chooser_dialog_class_init (GtkAppChooserDialogClass *klass)
|
||||
"/org/gtk/libgtk/ui/gtkappchooserdialog.ui");
|
||||
gtk_widget_class_bind_template_child_private (widget_class, GtkAppChooserDialog, label);
|
||||
gtk_widget_class_bind_template_child_private (widget_class, GtkAppChooserDialog, show_more_button);
|
||||
gtk_widget_class_bind_template_child_private (widget_class, GtkAppChooserDialog, software_button);
|
||||
gtk_widget_class_bind_template_child_private (widget_class, GtkAppChooserDialog, inner_box);
|
||||
gtk_widget_class_bind_template_callback (widget_class, show_more_button_clicked_cb);
|
||||
gtk_widget_class_bind_template_callback (widget_class, software_button_clicked_cb);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -754,8 +739,18 @@ gtk_app_chooser_dialog_set_heading (GtkAppChooserDialog *self,
|
||||
g_free (self->priv->heading);
|
||||
self->priv->heading = g_strdup (heading);
|
||||
|
||||
if (self->priv->label && self->priv->heading)
|
||||
gtk_label_set_markup (GTK_LABEL (self->priv->label), self->priv->heading);
|
||||
if (self->priv->label)
|
||||
{
|
||||
if (self->priv->heading)
|
||||
{
|
||||
gtk_label_set_markup (GTK_LABEL (self->priv->label), self->priv->heading);
|
||||
gtk_widget_show (self->priv->label);
|
||||
}
|
||||
else
|
||||
{
|
||||
gtk_widget_hide (self->priv->label);
|
||||
}
|
||||
}
|
||||
|
||||
g_object_notify (G_OBJECT (self), "heading");
|
||||
}
|
||||
|
@ -38,6 +38,7 @@
|
||||
#include "gtktreemodelsort.h"
|
||||
#include "gtkorientable.h"
|
||||
#include "gtkscrolledwindow.h"
|
||||
#include "gtklabel.h"
|
||||
|
||||
#include <string.h>
|
||||
#include <glib/gi18n-lib.h>
|
||||
@ -81,6 +82,8 @@ struct _GtkAppChooserWidgetPrivate {
|
||||
|
||||
GtkWidget *program_list;
|
||||
GtkListStore *program_list_store;
|
||||
GtkWidget *no_apps_label;
|
||||
GtkWidget *no_apps;
|
||||
|
||||
GtkTreeViewColumn *column;
|
||||
GtkCellRenderer *padding_renderer;
|
||||
@ -438,7 +441,7 @@ gtk_app_chooser_sort_func (GtkTreeModel *model,
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* they're both recommended/falback or not, so if one is a heading, wins */
|
||||
/* they're both recommended/fallback or not, so if one is a heading, wins */
|
||||
if (a_heading)
|
||||
{
|
||||
retval = -1;
|
||||
@ -660,15 +663,13 @@ add_no_applications_label (GtkAppChooserWidget *self)
|
||||
{
|
||||
gchar *text = NULL, *desc = NULL;
|
||||
const gchar *string;
|
||||
GtkTreeIter iter;
|
||||
|
||||
if (self->priv->default_text == NULL)
|
||||
{
|
||||
if (self->priv->content_type)
|
||||
desc = g_content_type_get_description (self->priv->content_type);
|
||||
|
||||
string = text = g_strdup_printf (_("No applications available to open “%s”"),
|
||||
desc);
|
||||
string = text = g_strdup_printf (_("No applications found for “%s”."), desc);
|
||||
g_free (desc);
|
||||
}
|
||||
else
|
||||
@ -676,11 +677,7 @@ add_no_applications_label (GtkAppChooserWidget *self)
|
||||
string = self->priv->default_text;
|
||||
}
|
||||
|
||||
gtk_list_store_append (self->priv->program_list_store, &iter);
|
||||
gtk_list_store_set (self->priv->program_list_store, &iter,
|
||||
COLUMN_HEADING_TEXT, string,
|
||||
COLUMN_HEADING, TRUE,
|
||||
-1);
|
||||
gtk_label_set_text (GTK_LABEL (self->priv->no_apps_label), string);
|
||||
|
||||
g_free (text);
|
||||
}
|
||||
@ -693,7 +690,8 @@ gtk_app_chooser_widget_select_first (GtkAppChooserWidget *self)
|
||||
GtkTreeModel *model;
|
||||
|
||||
model = gtk_tree_view_get_model (GTK_TREE_VIEW (self->priv->program_list));
|
||||
gtk_tree_model_get_iter_first (model, &iter);
|
||||
if (!gtk_tree_model_get_iter_first (model, &iter))
|
||||
return;
|
||||
|
||||
while (info == NULL)
|
||||
{
|
||||
@ -791,7 +789,14 @@ gtk_app_chooser_widget_real_add_items (GtkAppChooserWidget *self)
|
||||
}
|
||||
|
||||
if (!apps_added)
|
||||
add_no_applications_label (self);
|
||||
{
|
||||
add_no_applications_label (self);
|
||||
gtk_widget_show (self->priv->no_apps);
|
||||
}
|
||||
else
|
||||
{
|
||||
gtk_widget_hide (self->priv->no_apps);
|
||||
}
|
||||
|
||||
gtk_app_chooser_widget_select_first (self);
|
||||
|
||||
@ -1110,6 +1115,8 @@ gtk_app_chooser_widget_class_init (GtkAppChooserWidgetClass *klass)
|
||||
gtk_widget_class_bind_template_child_private (widget_class, GtkAppChooserWidget, column);
|
||||
gtk_widget_class_bind_template_child_private (widget_class, GtkAppChooserWidget, padding_renderer);
|
||||
gtk_widget_class_bind_template_child_private (widget_class, GtkAppChooserWidget, secondary_padding);
|
||||
gtk_widget_class_bind_template_child_private (widget_class, GtkAppChooserWidget, no_apps_label);
|
||||
gtk_widget_class_bind_template_child_private (widget_class, GtkAppChooserWidget, no_apps);
|
||||
gtk_widget_class_bind_template_callback (widget_class, refresh_and_emit_app_selected);
|
||||
gtk_widget_class_bind_template_callback (widget_class, program_list_selection_activated);
|
||||
gtk_widget_class_bind_template_callback (widget_class, widget_button_press_event_cb);
|
||||
|
@ -40,7 +40,7 @@
|
||||
<object class="GtkLabel" id="label">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="halign">start</property>
|
||||
<property name="halign">center</property>
|
||||
<property name="valign">center</property>
|
||||
<property name="label" translatable="yes">label</property>
|
||||
<property name="wrap">True</property>
|
||||
@ -74,17 +74,20 @@
|
||||
</object>
|
||||
</child>
|
||||
</template>
|
||||
<object class="GtkImage" id="show_more_image">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="icon_name">list-add-symbolic</property>
|
||||
</object>
|
||||
<object class="GtkButton" id="show_more_button">
|
||||
<property name="label" translatable="yes">Show Other Applications</property>
|
||||
<property name="label" translatable="yes">_View All Application</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="use_underline">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="receives_default">True</property>
|
||||
<property name="image">show_more_image</property>
|
||||
<signal name="clicked" handler="show_more_button_clicked_cb" swapped="no"/>
|
||||
</object>
|
||||
<object class="GtkButton" id="software_button">
|
||||
<property name="label" translatable="yes">_Find Applications in Software </property>
|
||||
<property name="visible">True</property>
|
||||
<property name="use_underline">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="receives_default">True</property>
|
||||
<signal name="clicked" handler="software_button_clicked_cb" swapped="no"/>
|
||||
</object>
|
||||
</interface>
|
||||
|
@ -1,3 +1,4 @@
|
||||
N_("Select Application");
|
||||
N_("label");
|
||||
N_("Show Other Applications");
|
||||
N_("_View All Application");
|
||||
N_("_Find Applications in Software ");
|
||||
|
@ -32,60 +32,97 @@
|
||||
<property name="can_focus">False</property>
|
||||
<property name="orientation">vertical</property>
|
||||
<child>
|
||||
<object class="GtkScrolledWindow" id="scrolled_window">
|
||||
<property name="width_request">400</property>
|
||||
<property name="height_request">300</property>
|
||||
<object class="GtkOverlay" id="overlay">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="hscrollbar_policy">never</property>
|
||||
<property name="shadow_type">in</property>
|
||||
<child>
|
||||
<object class="GtkTreeView" id="program_list">
|
||||
<object class="GtkScrolledWindow" id="scrolled_window">
|
||||
<property name="width_request">400</property>
|
||||
<property name="height_request">300</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="model">program_list_sort</property>
|
||||
<property name="headers_visible">False</property>
|
||||
<signal name="button-press-event" handler="widget_button_press_event_cb" swapped="no"/>
|
||||
<signal name="row-activated" handler="program_list_selection_activated" swapped="no"/>
|
||||
<child internal-child="selection">
|
||||
<object class="GtkTreeSelection" id="treeview-selection2">
|
||||
<property name="mode">browse</property>
|
||||
<signal name="changed" handler="refresh_and_emit_app_selected" object="GtkAppChooserWidget" swapped="yes"/>
|
||||
<property name="hscrollbar_policy">never</property>
|
||||
<property name="shadow_type">in</property>
|
||||
<child>
|
||||
<object class="GtkTreeView" id="program_list">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="model">program_list_sort</property>
|
||||
<property name="headers_visible">False</property>
|
||||
<signal name="button-press-event" handler="widget_button_press_event_cb" swapped="no"/>
|
||||
<signal name="row-activated" handler="program_list_selection_activated" swapped="no"/>
|
||||
<child internal-child="selection">
|
||||
<object class="GtkTreeSelection" id="treeview-selection2">
|
||||
<property name="mode">browse</property>
|
||||
<signal name="changed" handler="refresh_and_emit_app_selected" object="GtkAppChooserWidget" swapped="yes"/>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkTreeViewColumn" id="column">
|
||||
<child>
|
||||
<object class="GtkCellRendererText" id="padding_renderer"/>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkCellRendererText" id="heading">
|
||||
<property name="ypad">6</property>
|
||||
<property name="wrap_mode">word</property>
|
||||
<property name="wrap_width">350</property>
|
||||
</object>
|
||||
<attributes>
|
||||
<attribute name="visible">6</attribute>
|
||||
<attribute name="markup">7</attribute>
|
||||
</attributes>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkCellRendererText" id="secondary_padding"/>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkCellRendererPixbuf" id="app_icon"/>
|
||||
<attributes>
|
||||
<attribute name="gicon">1</attribute>
|
||||
</attributes>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkCellRendererText" id="app_name">
|
||||
<property name="ellipsize">end</property>
|
||||
</object>
|
||||
<attributes>
|
||||
<attribute name="markup">3</attribute>
|
||||
</attributes>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
<child type="overlay">
|
||||
<object class="GtkBox" id="no_apps">
|
||||
<property name="orientation">vertical</property>
|
||||
<property name="halign">center</property>
|
||||
<property name="valign">center</property>
|
||||
<child>
|
||||
<object class="GtkImage">
|
||||
<property name="visible">True</property>
|
||||
<property name="icon-name">gnome-software-symbolic</property>
|
||||
<property name="pixel-size">48</property>
|
||||
<property name="margin">12</property>
|
||||
<style>
|
||||
<class name="dim-label"/>
|
||||
</style>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkTreeViewColumn" id="column">
|
||||
<child>
|
||||
<object class="GtkCellRendererText" id="padding_renderer"/>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkCellRendererText" id="heading">
|
||||
<property name="ypad">6</property>
|
||||
<property name="wrap_mode">word</property>
|
||||
<property name="wrap_width">350</property>
|
||||
</object>
|
||||
<attributes>
|
||||
<attribute name="visible">6</attribute>
|
||||
<attribute name="markup">7</attribute>
|
||||
</attributes>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkCellRendererText" id="secondary_padding"/>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkCellRendererPixbuf" id="app_icon"/>
|
||||
<attributes>
|
||||
<attribute name="gicon">1</attribute>
|
||||
</attributes>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkCellRendererText" id="app_name">
|
||||
<property name="ellipsize">end</property>
|
||||
</object>
|
||||
<attributes>
|
||||
<attribute name="markup">3</attribute>
|
||||
</attributes>
|
||||
</child>
|
||||
<object class="GtkLabel" id="no_apps_label">
|
||||
<property name="visible">True</property>
|
||||
<property name="label" translatable="yes">No applications found.</property>
|
||||
<property name="halign">center</property>
|
||||
<property name="valign">center</property>
|
||||
<attributes>
|
||||
<attribute name="scale" value="1.2"/>
|
||||
</attributes>
|
||||
<style>
|
||||
<class name="dim-label"/>
|
||||
</style>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
|
@ -0,0 +1 @@
|
||||
N_("No applications found.");
|
Loading…
Reference in New Issue
Block a user