[gnome-builder] search: auto-select the first row



commit 7d7a581cf7f52cee8fdfb93a9ed22851e34a455e
Author: Christian Hergert <chergert redhat com>
Date:   Sat Dec 12 16:24:23 2015 -0800

    search: auto-select the first row

 libide/search/ide-omni-search-display.c |   71 +++++++------------------------
 libide/search/ide-omni-search-group.c   |    8 ++--
 libide/search/ide-omni-search-group.h   |   18 ++++----
 3 files changed, 28 insertions(+), 69 deletions(-)
---
diff --git a/libide/search/ide-omni-search-display.c b/libide/search/ide-omni-search-display.c
index 52b96c5..8596181 100644
--- a/libide/search/ide-omni-search-display.c
+++ b/libide/search/ide-omni-search-display.c
@@ -29,6 +29,8 @@ struct _IdeOmniSearchDisplay
 
   IdeSearchContext    *context;
   GPtrArray           *providers;
+
+  guint                do_autoselect : 1;
 };
 
 typedef struct
@@ -142,6 +144,8 @@ ide_omni_search_display_move_next_result (IdeOmniSearchDisplay *self)
 
   g_return_if_fail (IDE_IS_OMNI_SEARCH_DISPLAY (self));
 
+  self->do_autoselect = FALSE;
+
   for (i = 0; i < self->providers->len; i++)
     {
       ProviderEntry *ptr = g_ptr_array_index (self->providers, i);
@@ -181,6 +185,8 @@ ide_omni_search_display_move_previous_result (IdeOmniSearchDisplay *self)
 
   g_return_if_fail (IDE_IS_OMNI_SEARCH_DISPLAY (self));
 
+  self->do_autoselect = FALSE;
+
   for (i = self->providers->len - 1; i >= 0; i--)
     {
       ProviderEntry *ptr = g_ptr_array_index (self->providers, i);
@@ -212,57 +218,6 @@ ide_omni_search_display_move_previous_result (IdeOmniSearchDisplay *self)
     }
 }
 
-static gboolean
-ide_omni_search_display_keynav_failed (IdeOmniSearchDisplay *self,
-                                       GtkDirectionType      dir,
-                                       IdeOmniSearchGroup   *group)
-{
-  GList *list = NULL;
-  GList *iter;
-  gint position = -1;
-  gboolean ret = FALSE;
-
-  g_return_val_if_fail (IDE_IS_OMNI_SEARCH_DISPLAY (self), FALSE);
-  g_return_val_if_fail (IDE_IS_OMNI_SEARCH_GROUP (group), FALSE);
-
-  gtk_container_child_get (GTK_CONTAINER (self), GTK_WIDGET (group),
-                           "position", &position,
-                           NULL);
-
-  if (dir == GTK_DIR_DOWN)
-    {
-      list = gtk_container_get_children (GTK_CONTAINER (self));
-      iter = g_list_nth (list, position + 1);
-      for (; iter; iter = iter->next)
-        {
-          if (ide_omni_search_group_get_first (iter->data))
-            {
-              ide_omni_search_group_unselect (group);
-              ide_omni_search_group_focus_first (iter->data);
-              ret = TRUE;
-            }
-        }
-    }
-  else if (dir == GTK_DIR_UP && position > 0)
-    {
-      list = gtk_container_get_children (GTK_CONTAINER (self));
-      iter = g_list_nth (list, position - 1);
-      for (; iter; iter = iter->prev)
-        {
-          if (ide_omni_search_group_get_first (iter->data))
-            {
-              ide_omni_search_group_unselect (group);
-              ide_omni_search_group_focus_last (iter->data);
-              ret = TRUE;
-            }
-        }
-    }
-
-  g_list_free (list);
-
-  return ret;
-}
-
 static void
 ide_omni_search_display_activate (IdeOmniSearchDisplay *self)
 {
@@ -332,11 +287,6 @@ ide_omni_search_display_add_provider (IdeOmniSearchDisplay *self,
                            G_CALLBACK (ide_omni_search_display_result_selected),
                            self,
                            G_CONNECT_SWAPPED);
-  g_signal_connect_object (entry->group,
-                           "keynav-failed",
-                           G_CALLBACK (ide_omni_search_display_keynav_failed),
-                           self,
-                           G_CONNECT_SWAPPED);
   g_ptr_array_add (self->providers, entry);
   g_ptr_array_sort (self->providers, provider_entry_sort);
 
@@ -415,6 +365,13 @@ ide_omni_search_display_result_added (IdeOmniSearchDisplay *self,
             {
               ide_omni_search_group_add_result (ptr->group, result);
               gtk_widget_show (GTK_WIDGET (ptr->group));
+
+              /*
+               * If this is the first group and we are still auto-selecting
+               * the first row, we might need to update the selection.
+               */
+              if ((i == 0) && self->do_autoselect)
+                ide_omni_search_group_select_first (ptr->group);
             }
           break;
         }
@@ -488,6 +445,8 @@ ide_omni_search_display_connect_context (IdeOmniSearchDisplay *self,
   g_return_if_fail (IDE_IS_OMNI_SEARCH_DISPLAY (self));
   g_return_if_fail (IDE_IS_SEARCH_CONTEXT (context));
 
+  self->do_autoselect = TRUE;
+
   providers = ide_search_context_get_providers (context);
 
   for (iter = providers; iter; iter = iter->next)
diff --git a/libide/search/ide-omni-search-group.c b/libide/search/ide-omni-search-group.c
index a89ed46..187361b 100644
--- a/libide/search/ide-omni-search-group.c
+++ b/libide/search/ide-omni-search-group.c
@@ -236,23 +236,23 @@ ide_omni_search_group_row_selected (IdeOmniSearchGroup *self,
 }
 
 void
-ide_omni_search_group_focus_first (IdeOmniSearchGroup *self)
+ide_omni_search_group_select_first (IdeOmniSearchGroup *self)
 {
   GtkListBoxRow *row;
 
   g_return_if_fail (IDE_IS_OMNI_SEARCH_GROUP (self));
 
-  row = gtk_list_box_get_row_at_y (self->rows, 1);
+  row = gtk_list_box_get_row_at_index (self->rows, 0);
 
   if (row)
     {
       gtk_list_box_unselect_all (self->rows);
-      gtk_widget_child_focus (GTK_WIDGET (self->rows), GTK_DIR_DOWN);
+      gtk_list_box_select_row (self->rows, row);
     }
 }
 
 void
-ide_omni_search_group_focus_last (IdeOmniSearchGroup *self)
+ide_omni_search_group_select_last (IdeOmniSearchGroup *self)
 {
   GtkAllocation alloc;
   GtkListBoxRow *row;
diff --git a/libide/search/ide-omni-search-group.h b/libide/search/ide-omni-search-group.h
index 730c002..e612ae7 100644
--- a/libide/search/ide-omni-search-group.h
+++ b/libide/search/ide-omni-search-group.h
@@ -28,17 +28,17 @@ G_BEGIN_DECLS
 
 G_DECLARE_FINAL_TYPE (IdeOmniSearchGroup, ide_omni_search_group, IDE, OMNI_SEARCH_GROUP, GtkBox)
 
-void               ide_omni_search_group_clear         (IdeOmniSearchGroup *group);
-IdeSearchProvider *ide_omni_search_group_get_provider  (IdeOmniSearchGroup *group);
-void               ide_omni_search_group_add_result    (IdeOmniSearchGroup *group,
+void               ide_omni_search_group_clear         (IdeOmniSearchGroup *self);
+IdeSearchProvider *ide_omni_search_group_get_provider  (IdeOmniSearchGroup *self);
+void               ide_omni_search_group_add_result    (IdeOmniSearchGroup *self,
                                                         IdeSearchResult    *result);
-void               ide_omni_search_group_remove_result (IdeOmniSearchGroup *group,
+void               ide_omni_search_group_remove_result (IdeOmniSearchGroup *self,
                                                         IdeSearchResult    *result);
-void               ide_omni_search_group_unselect      (IdeOmniSearchGroup *group);
-void               ide_omni_search_group_focus_first   (IdeOmniSearchGroup *group);
-void               ide_omni_search_group_focus_last    (IdeOmniSearchGroup *group);
-IdeSearchResult   *ide_omni_search_group_get_first     (IdeOmniSearchGroup *group);
-gboolean           ide_omni_search_group_activate      (IdeOmniSearchGroup *group);
+void               ide_omni_search_group_unselect      (IdeOmniSearchGroup *self);
+void               ide_omni_search_group_select_first  (IdeOmniSearchGroup *self);
+void               ide_omni_search_group_select_last   (IdeOmniSearchGroup *self);
+IdeSearchResult   *ide_omni_search_group_get_first     (IdeOmniSearchGroup *self);
+gboolean           ide_omni_search_group_activate      (IdeOmniSearchGroup *self);
 guint64            ide_omni_search_group_get_count     (IdeOmniSearchGroup *self);
 gboolean           ide_omni_search_group_has_selection (IdeOmniSearchGroup *self);
 gboolean           ide_omni_search_group_move_next     (IdeOmniSearchGroup *self);


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]