diff options
author | Shaun McCance <shaunm@gnome.org> | 2010-03-11 14:20:29 -0600 |
---|---|---|
committer | Shaun McCance <shaunm@gnome.org> | 2010-03-11 14:20:29 -0600 |
commit | 3ff836b8eb9e12675928db278bec676d3dafca67 (patch) | |
tree | 03fa3a5f208b7940467709da8cef6d453b19a831 | |
parent | e62374600bfae078ae7ac5a350416f852705b139 (diff) | |
download | yelp-3ff836b8eb9e12675928db278bec676d3dafca67.tar.gz |
[yelp-location-entry] New two-line location drop-down entries, with desc
-rw-r--r-- | libyelp/yelp-location-entry.c | 80 | ||||
-rw-r--r-- | libyelp/yelp-location-entry.h | 1 | ||||
-rw-r--r-- | tests/test-location-entry.c | 47 |
3 files changed, 120 insertions, 8 deletions
diff --git a/libyelp/yelp-location-entry.c b/libyelp/yelp-location-entry.c index 0dcbeae8..52e6b3de 100644 --- a/libyelp/yelp-location-entry.c +++ b/libyelp/yelp-location-entry.c @@ -25,6 +25,7 @@ #include <glib/gi18n.h> #include "yelp-location-entry.h" +#include "yelp-settings.h" /** * SECTION:yelp-location-entry @@ -36,8 +37,9 @@ * searches. * * The #GtkTreeModel used by a #YelpLocationEntry is expected to have at least - * three columns: #GtkComboBoxEntry::text-column contains the displayed name - * of the location, #YelpLocationEntry::icon-column contains an icon name for + * four columns: #GtkComboBoxEntry::text-column contains the displayed name + * of the location, #YelpLocationEntry::desc-column contains a description + * for each entry, #YelpLocationEntry::icon-column contains an icon name for * the location, and #YelpLocationEntry::flags-column contains a bit field * of #YelpLocationEntryFlags. These columns are specified when creating a * #YelpLocationEntry widget with yelp_location_entry_new_with_model(). @@ -102,11 +104,19 @@ static gboolean entry_key_press_cb (GtkWidget *widget, GdkEventKey *event, gpointer user_data); +/* GtkCellLayout callbacks */ +static void cell_set_text_cell (GtkCellLayout *layout, + GtkCellRenderer *cell, + GtkTreeModel *model, + GtkTreeIter *iter, + YelpLocationEntry *entry); + typedef struct _YelpLocationEntryPrivate YelpLocationEntryPrivate; struct _YelpLocationEntryPrivate { GtkWidget *text_entry; + gint desc_column; gint icon_column; gint flags_column; gboolean enable_search; @@ -126,6 +136,7 @@ enum { enum { PROP_0, + PROP_DESC_COLUMN, PROP_ICON_COLUMN, PROP_FLAGS_COLUMN, PROP_ENABLE_SEARCH @@ -184,6 +195,21 @@ yelp_location_entry_class_init (YelpLocationEntryClass *klass) G_TYPE_STRING); /** + * YelpLocationEntry:desc-column + * + * The column in the #GtkTreeModel containing a description for each row. + **/ + g_object_class_install_property (object_class, + PROP_DESC_COLUMN, + g_param_spec_int ("desc-column", + N_("Description Column"), + N_("A column in the model to descriptions from"), + -1, + G_MAXINT, + -1, + G_PARAM_READWRITE | G_PARAM_STATIC_NAME | + G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB)); + /** * YelpLocationEntry:icon-column * * The column in the #GtkTreeModel containing an icon name for each row. @@ -261,10 +287,16 @@ static void yelp_location_entry_init (YelpLocationEntry *entry) */ cells = gtk_cell_layout_get_cells (GTK_CELL_LAYOUT (entry)); g_object_set (cells->data, "xpad", 4, NULL); + gtk_cell_layout_set_cell_data_func (GTK_CELL_LAYOUT (entry), + GTK_CELL_RENDERER (cells->data), + cell_set_text_cell, + entry, NULL); g_list_free (cells); priv->icon_cell = gtk_cell_renderer_pixbuf_new (); + g_object_set (priv->icon_cell, "yalign", 0.2, NULL); gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (entry), priv->icon_cell, FALSE); + gtk_cell_layout_reorder (GTK_CELL_LAYOUT (entry), priv->icon_cell, 0); g_signal_connect (entry, "changed", @@ -291,6 +323,9 @@ location_entry_get_property (GObject *object, YelpLocationEntryPrivate *priv = GET_PRIV (object); switch (prop_id) { + case PROP_DESC_COLUMN: + g_value_set_int (value, priv->desc_column); + break; case PROP_ICON_COLUMN: g_value_set_int (value, priv->icon_column); break; @@ -315,6 +350,9 @@ location_entry_set_property (GObject *object, YelpLocationEntryPrivate *priv = GET_PRIV (object); switch (prop_id) { + case PROP_DESC_COLUMN: + priv->desc_column = g_value_get_int (value); + break; case PROP_ICON_COLUMN: priv->icon_column = g_value_get_int (value); gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (object), @@ -611,10 +649,46 @@ entry_key_press_cb (GtkWidget *widget, return FALSE; } +static void +cell_set_text_cell (GtkCellLayout *layout, + GtkCellRenderer *cell, + GtkTreeModel *model, + GtkTreeIter *iter, + YelpLocationEntry *entry) +{ + gint text_col; + gchar *title, *desc, *color, *text; + YelpLocationEntryPrivate *priv = GET_PRIV (entry); + + g_object_get (entry, "text-column", &text_col, NULL); + if (text_col >= 0) { + gtk_tree_model_get (model, iter, + text_col, &title, + priv->desc_column, &desc, + -1); + if (desc) { + color = yelp_settings_get_color (yelp_settings_get_default (), + YELP_SETTINGS_COLOR_TEXT_LIGHT); + text = g_markup_printf_escaped ("<span size='larger'>%s</span>\n<span color='%s'>%s</span>", + title, color, desc); + g_free (color); + g_free (desc); + } + else { + text = g_markup_printf_escaped ("<span size='larger'>%s</span>", title); + } + + g_object_set (cell, "markup", text, NULL); + g_free (text); + g_free (title); + } +} + /** * yelp_location_entry_new_with_model: * @model: A #GtkTreeModel. * @text_column: The column in @model containing the title of each entry. + * @desc_column: The column in @model containing the description of each entry. * @icon_column: The column in @model containing the icon name of each entry. * @flags_column: The column in @model containing #YelpLocationEntryFlags. * @@ -625,6 +699,7 @@ entry_key_press_cb (GtkWidget *widget, GtkWidget* yelp_location_entry_new_with_model (GtkTreeModel *model, gint text_column, + gint desc_column, gint icon_column, gint flags_column) { @@ -634,6 +709,7 @@ yelp_location_entry_new_with_model (GtkTreeModel *model, ret = GTK_WIDGET (g_object_new (YELP_TYPE_LOCATION_ENTRY, "model", model, "text-column", text_column, + "desc-column", desc_column, "icon-column", icon_column, "flags-column", flags_column, NULL)); diff --git a/libyelp/yelp-location-entry.h b/libyelp/yelp-location-entry.h index fc736835..6d6e3061 100644 --- a/libyelp/yelp-location-entry.h +++ b/libyelp/yelp-location-entry.h @@ -82,6 +82,7 @@ typedef enum { GType yelp_location_entry_get_type (void); GtkWidget* yelp_location_entry_new_with_model (GtkTreeModel *model, gint text_column, + gint desc_column, gint icon_column, gint flags_column); diff --git a/tests/test-location-entry.c b/tests/test-location-entry.c index 37200dfe..ed80abf9 100644 --- a/tests/test-location-entry.c +++ b/tests/test-location-entry.c @@ -2,8 +2,9 @@ #include "yelp-location-entry.h" enum { - COL_ICON, COL_TITLE, + COL_DESC, + COL_ICON, COL_FLAGS, COL_URI, COL_TERMS @@ -24,8 +25,9 @@ loading_callback (gpointer data) gtk_tree_model_get_iter (model, &iter, path); gtk_list_store_set (GTK_LIST_STORE (model), &iter, - COL_ICON, "gnome-main-menu", COL_TITLE, "Desktop Help", + COL_DESC, "Get help with your desktop", + COL_ICON, "gnome-main-menu", COL_FLAGS, YELP_LOCATION_ENTRY_CAN_BOOKMARK, -1); gtk_tree_path_free (path); @@ -54,29 +56,33 @@ button_clicked (GtkButton *button, gpointer user_data) GtkListStore *model = GTK_LIST_STORE (user_data); const gchar *label = gtk_button_get_label (button); GtkTreeIter iter; - gchar *uri = NULL, *icon, *title; + gchar *uri = NULL, *icon, *title, *desc; gboolean loading = FALSE; if (g_str_equal (label, "Empathy")) { uri = "help:empathy"; icon = "empathy"; + desc = "Send and receive messages"; } else if (g_str_equal (label, "Calculator")) { uri = "help:gcalctool"; icon = "accessories-calculator"; + desc = "Perform calculations"; } else if (g_str_equal (label, "Terminal")) { uri = "help:gnome-terminal"; icon = "gnome-terminal"; + desc = "Use the command line"; } else if (g_str_equal (label, "Slow-loading document")) { uri = "help:gnumeric"; icon = NULL; loading = TRUE; + desc = NULL; } if (uri) @@ -124,8 +130,9 @@ button_clicked (GtkButton *button, gpointer user_data) g_timeout_add_seconds (5, loading_callback, row); } gtk_list_store_set (model, &iter, - COL_ICON, icon, COL_TITLE, title, + COL_DESC, desc, + COL_ICON, icon, COL_FLAGS, YELP_LOCATION_ENTRY_CAN_BOOKMARK | (loading ? YELP_LOCATION_ENTRY_IS_LOADING : 0), COL_URI, uri, -1); @@ -167,16 +174,41 @@ search_activated_cb (GtkEntry *entry, gchar *text, gpointer user_data) { GtkTreeModel *model; GtkTreeIter iter; + gchar *curtitle = NULL; model = gtk_combo_box_get_model (GTK_COMBO_BOX (entry)); + + if (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (model), &iter)) { + gchar *uri; + gtk_tree_model_get (model, &iter, + COL_URI, &uri, + -1); + if (uri) { + if (g_str_equal (uri, "search:")) + gtk_tree_model_get (model, &iter, + COL_DESC, &curtitle, + -1); + else + gtk_tree_model_get (model, &iter, + COL_TITLE, &curtitle, + -1); + g_free (uri); + } + } + + if (curtitle == NULL) + curtitle = g_strdup ("in all documents"); + gtk_list_store_prepend (GTK_LIST_STORE (model), &iter); gtk_list_store_set (GTK_LIST_STORE (model), &iter, COL_ICON, "folder-saved-search", COL_TITLE, text, + COL_DESC, curtitle, COL_FLAGS, 0, COL_URI, "search:", -1); gtk_combo_box_set_active_iter (GTK_COMBO_BOX (entry), &iter); + g_free (curtitle); } int @@ -188,6 +220,7 @@ main (int argc, char **argv) GtkListStore *model; GtkTreeIter iter; + g_thread_init (NULL); gtk_init (&argc, &argv); window = gtk_window_new (GTK_WINDOW_TOPLEVEL); @@ -197,9 +230,10 @@ main (int argc, char **argv) vbox = gtk_vbox_new (FALSE, 6); gtk_container_add (GTK_CONTAINER (window), vbox); - model = gtk_list_store_new (5, - G_TYPE_STRING, /* icon name */ + model = gtk_list_store_new (6, G_TYPE_STRING, /* title */ + G_TYPE_STRING, /* desc */ + G_TYPE_STRING, /* icon */ G_TYPE_INT, /* flags */ G_TYPE_STRING, /* uri */ G_TYPE_STRING /* search terms */ @@ -217,6 +251,7 @@ main (int argc, char **argv) entry = (YelpLocationEntry *) yelp_location_entry_new_with_model (GTK_TREE_MODEL (model), COL_TITLE, + COL_DESC, COL_ICON, COL_FLAGS); g_signal_connect (entry, "location-selected", |