enum {
SIG_SELECTION_CHANGED,
+ SIG_ACTIVATE,
LAST_SIGNAL
};
EmpathyIndividualStore *store;
EmpathyIndividualView *view;
+ GtkWidget *search_entry;
GPtrArray *search_words;
gchar *search_str;
g_cclosure_marshal_generic,
G_TYPE_NONE,
1, FOLKS_TYPE_INDIVIDUAL);
+
+ signals[SIG_ACTIVATE] = g_signal_new ("activate",
+ G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_LAST,
+ 0,
+ NULL, NULL,
+ g_cclosure_marshal_generic,
+ G_TYPE_NONE,
+ 0);
}
static void
individual_store_add_individual_and_connect (self->priv->store, individual);
+ /* if nothing is selected, select the first matching node */
+ if (!gtk_tree_selection_get_selected (
+ gtk_tree_view_get_selection (GTK_TREE_VIEW (self->priv->view)),
+ NULL, NULL))
+ empathy_individual_view_select_first (self->priv->view);
+
g_clear_object (&persona_new);
g_clear_object (&personas);
g_object_unref (store);
empathy_individual_view_refilter (self->priv->view);
}
+static void
+search_activate_cb (GtkEntry *entry,
+ EmpathyContactChooser *self)
+{
+ g_signal_emit (self, signals[SIG_ACTIVATE], 0);
+}
+
+static void
+view_activate_cb (GtkTreeView *view,
+ GtkTreePath *path,
+ GtkTreeViewColumn *column,
+ EmpathyContactChooser *self)
+{
+ g_signal_emit (self, signals[SIG_ACTIVATE], 0);
+}
+
+static gboolean
+search_key_press_cb (GtkEntry *entry,
+ GdkEventKey *event,
+ EmpathyContactChooser *self)
+{
+ GtkTreeSelection *selection;
+ GtkTreeModel *model;
+ GtkTreeIter iter;
+
+ if (event->state != 0)
+ return FALSE;
+
+ switch (event->keyval)
+ {
+ case GDK_KEY_Down:
+ case GDK_KEY_KP_Down:
+ case GDK_KEY_Up:
+ case GDK_KEY_KP_Up:
+ break;
+
+ default:
+ return FALSE;
+ }
+
+ selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (self->priv->view));
+
+ if (!gtk_tree_selection_get_selected (selection, &model, &iter))
+ return TRUE;
+
+ switch (event->keyval)
+ {
+ case GDK_KEY_Down:
+ case GDK_KEY_KP_Down:
+ if (!gtk_tree_model_iter_next (model, &iter))
+ return TRUE;
+
+ break;
+
+ case GDK_KEY_Up:
+ case GDK_KEY_KP_Up:
+ if (!gtk_tree_model_iter_previous (model, &iter))
+ return TRUE;
+
+ break;
+
+ default:
+ g_assert_not_reached ();
+ }
+
+ gtk_tree_selection_select_iter (selection, &iter);
+
+ return TRUE;
+}
+
static void
empathy_contact_chooser_init (EmpathyContactChooser *self)
{
EmpathyIndividualManager *mgr;
GtkTreeSelection *selection;
GtkWidget *scroll;
- GtkWidget *search_entry;
GQuark features[] = { TP_ACCOUNT_MANAGER_FEATURE_CORE, 0 };
self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, EMPATHY_TYPE_CONTACT_CHOOSER,
tp_proxy_prepare_async (self->priv->account_mgr, features, NULL, NULL);
/* Search entry */
- search_entry = gtk_entry_new ();
- gtk_box_pack_start (GTK_BOX (self), search_entry, FALSE, TRUE, 6);
- gtk_widget_show (search_entry);
+ self->priv->search_entry = gtk_entry_new ();
+ gtk_box_pack_start (GTK_BOX (self), self->priv->search_entry, FALSE, TRUE, 6);
+ gtk_widget_show (self->priv->search_entry);
- g_signal_connect (search_entry, "changed",
+ g_signal_connect (self->priv->search_entry, "changed",
G_CALLBACK (search_text_changed), self);
+ g_signal_connect (self->priv->search_entry, "activate",
+ G_CALLBACK (search_activate_cb), self);
+ g_signal_connect (self->priv->search_entry, "key-press-event",
+ G_CALLBACK (search_key_press_cb), self);
/* Add the treeview */
mgr = empathy_individual_manager_dup_singleton ();
g_signal_connect (selection, "changed",
G_CALLBACK (view_selection_changed_cb), self);
+ g_signal_connect (self->priv->view, "row-activated",
+ G_CALLBACK (view_activate_cb), self);
scroll = gtk_scrolled_window_new (NULL, NULL);
self->priv->filter_func = func;
self->priv->filter_data = user_data;
}
+
+void
+empathy_contact_chooser_show_search_entry (EmpathyContactChooser *self,
+ gboolean show)
+{
+ gtk_widget_set_visible (self->priv->search_entry, show);
+}