[gtk/suggestion-entry: 30/31] testentrycompletion: Add a suggestion entry



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]