[gtk/suggestion-entry: 30/31] testentrycompletion: Add a suggestion entry
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk/suggestion-entry: 30/31] testentrycompletion: Add a suggestion entry
- Date: Fri, 26 Jun 2020 14:18:53 +0000 (UTC)
commit fb64e62ecf97d8bf3aea1d9512c8ac37f91ffe25
Author: Matthias Clasen <mclasen redhat com>
Date: Thu Jun 25 13:58:23 2020 -0400
testentrycompletion: Add a suggestion entry
Add two examples for GtkSuggestionEntry. One
minimal one, using a GtkStringList with defaults,
and one using a GtkDirectoryList with a custom
factory and expression.
tests/testentrycompletion.c | 116 ++++++++++++++++++++++++++++++++++++++++++--
1 file changed, 112 insertions(+), 4 deletions(-)
---
diff --git a/tests/testentrycompletion.c b/tests/testentrycompletion.c
index 68985d7383..b7ec97dd4c 100644
--- a/tests/testentrycompletion.c
+++ b/tests/testentrycompletion.c
@@ -207,7 +207,8 @@ static const char *dynamic_completions[] = {
"total eclipse",
"Totipresence",
"Totipalmi",
- "zombie"
+ "zombie",
+ NULL
};
static gint
@@ -246,9 +247,11 @@ animation_timer (GtkEntryCompletion *completion)
if ((timer_count / n_completions) % 2 == 0)
{
n = timer_count % n_completions;
- gtk_list_store_append (store, &iter);
- gtk_list_store_set (store, &iter, 0, dynamic_completions[n], -1);
-
+ if (dynamic_completions[n])
+ {
+ gtk_list_store_append (store, &iter);
+ gtk_list_store_set (store, &iter, 0, dynamic_completions[n], -1);
+ }
}
else
{
@@ -289,6 +292,51 @@ quit_cb (GtkWidget *widget,
g_main_context_wakeup (NULL);
}
+static char *
+get_file_name (gpointer item)
+{
+ return g_strdup (g_file_info_get_display_name (G_FILE_INFO (item)));
+}
+
+static void
+setup_item (GtkSignalListItemFactory *factory,
+ GtkListItem *item)
+{
+ GtkWidget *box;
+ GtkWidget *icon;
+ GtkWidget *label;
+
+ box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 10);
+ icon = gtk_image_new ();
+ label = gtk_label_new ("");
+ gtk_label_set_xalign (GTK_LABEL (label), 0);
+ gtk_box_append (GTK_BOX (box), icon);
+ gtk_box_append (GTK_BOX (box), label);
+ gtk_list_item_set_child (item, box);
+}
+
+static void
+bind_item (GtkSignalListItemFactory *factory,
+ GtkListItem *item)
+{
+ GFileInfo *info = G_FILE_INFO (gtk_list_item_get_item (item));
+ GtkWidget *box = gtk_list_item_get_child (item);
+ GtkWidget *icon = gtk_widget_get_first_child (box);
+ GtkWidget *label = gtk_widget_get_last_child (box);
+
+ gtk_image_set_from_gicon (GTK_IMAGE (icon), g_file_info_get_icon (info));
+ gtk_label_set_label (GTK_LABEL (label), g_file_info_get_display_name (info));
+}
+
+static void
+button_clicked (GtkButton *button,
+ GtkWidget *entry)
+{
+ gtk_widget_grab_focus (entry);
+ gtk_editable_set_position (GTK_EDITABLE (entry), -1);
+ gtk_widget_activate_action (entry, "popup.show", NULL);
+}
+
int
main (int argc, char *argv[])
{
@@ -299,6 +347,12 @@ main (int argc, char *argv[])
GtkTreeModel *completion_model;
GtkCellRenderer *cell;
gboolean done = FALSE;
+ GtkStringList *strings;
+ char *cwd;
+ GFile *file;
+ GListModel *dir;
+ GtkExpression *expression;
+ GtkListItemFactory *factory;
gtk_init ();
@@ -409,6 +463,60 @@ main (int argc, char *argv[])
gtk_box_append (GTK_BOX (vbox), entry);
+ strings = gtk_string_list_new (dynamic_completions);
+ entry = gtk_suggestion_entry_new ();
+
+ gtk_suggestion_entry_set_model (GTK_SUGGESTION_ENTRY (entry),
+ G_LIST_MODEL (strings));
+
+ gtk_suggestion_entry_set_insert_prefix (GTK_SUGGESTION_ENTRY (entry), TRUE);
+ gtk_suggestion_entry_set_insert_selection (GTK_SUGGESTION_ENTRY (entry), TRUE);
+
+ gtk_box_append (GTK_BOX (vbox), entry);
+
+ entry = gtk_suggestion_entry_new ();
+
+ cwd = g_get_current_dir ();
+ file = g_file_new_for_path (cwd);
+ dir = G_LIST_MODEL (gtk_directory_list_new
("standard::display-name,standard::content-type,standard::icon,standard::size", file));
+ gtk_suggestion_entry_set_model (GTK_SUGGESTION_ENTRY (entry), dir);
+ g_object_unref (dir);
+ g_object_unref (file);
+ g_free (cwd);
+
+ expression = gtk_cclosure_expression_new (G_TYPE_STRING, NULL,
+ 0, NULL,
+ (GCallback)get_file_name,
+ NULL, NULL);
+ gtk_suggestion_entry_set_expression (GTK_SUGGESTION_ENTRY (entry), expression);
+ gtk_expression_unref (expression);
+
+ factory = gtk_signal_list_item_factory_new ();
+ g_signal_connect (factory, "setup", G_CALLBACK (setup_item), NULL);
+ g_signal_connect (factory, "bind", G_CALLBACK (bind_item), NULL);
+
+ gtk_suggestion_entry_set_factory (GTK_SUGGESTION_ENTRY (entry), factory);
+ g_object_unref (factory);
+
+ gtk_suggestion_entry_set_use_filter (GTK_SUGGESTION_ENTRY (entry), FALSE);
+ gtk_suggestion_entry_set_insert_selection (GTK_SUGGESTION_ENTRY (entry), TRUE);
+ {
+ GtkWidget *hbox, *button;
+
+ gtk_widget_set_hexpand (entry, TRUE);
+
+ hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
+ gtk_widget_add_css_class (hbox, "linked");
+ gtk_box_append (GTK_BOX (hbox), entry);
+
+ button = gtk_button_new_from_icon_name ("pan-down-symbolic");
+ gtk_widget_set_focus_on_click (button, FALSE);
+ g_signal_connect (button, "clicked", G_CALLBACK (button_clicked), entry);
+ gtk_box_append (GTK_BOX (hbox), button);
+
+ gtk_box_append (GTK_BOX (vbox), hbox);
+ }
+
gtk_widget_show (window);
while (!done)
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]