summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnders Carlsson <andersca@gnome.org>2004-07-02 13:20:16 +0000
committerAnders Carlsson <andersca@src.gnome.org>2004-07-02 13:20:16 +0000
commitb107b5075bd2e8b74534bd25dbd6209dddfcf5e6 (patch)
tree88307be5dd098c6be0ad6a3aa3e81ea61cb8f593
parent5a79a611791887c18326d16fc8ca2ae28f7e8589 (diff)
downloadgtk+-b107b5075bd2e8b74534bd25dbd6209dddfcf5e6.tar.gz
Add markup column support.
2004-07-02 Anders Carlsson <andersca@gnome.org> * libegg/iconlist/eggiconlist.c: (egg_icon_list_class_init), (egg_icon_list_init), (egg_icon_list_set_property), (egg_icon_list_get_property), (egg_icon_list_calculate_item_size), (egg_icon_list_paint_item), (egg_icon_list_update_item_text), (egg_icon_list_get_text_column), (egg_icon_list_set_markup_column), (egg_icon_list_get_markup_column), (egg_icon_list_set_pixbuf_column), (egg_icon_list_get_pixbuf_column): * libegg/iconlist/eggiconlist.h: * libegg/iconlist/testiconlist.c: (fill_model), (create_model): Add markup column support.
-rw-r--r--gtk/gtkiconview.c210
-rw-r--r--gtk/gtkiconview.h3
2 files changed, 99 insertions, 114 deletions
diff --git a/gtk/gtkiconview.c b/gtk/gtkiconview.c
index 11967f9dc5..4682e9e793 100644
--- a/gtk/gtkiconview.c
+++ b/gtk/gtkiconview.c
@@ -64,6 +64,7 @@ struct _EggIconListPrivate
gint width, height;
gint text_column;
+ gint markup_column;
gint pixbuf_column;
GtkSelectionMode selection_mode;
@@ -125,6 +126,7 @@ enum
PROP_0,
PROP_PIXBUF_COLUMN,
PROP_TEXT_COLUMN,
+ PROP_MARKUP_COLUMN,
PROP_SELECTION_MODE,
PROP_MODEL,
};
@@ -163,8 +165,6 @@ static gboolean egg_icon_list_button_press (GtkWidget *widget,
GdkEventButton *event);
static gboolean egg_icon_list_button_release (GtkWidget *widget,
GdkEventButton *event);
-static gboolean egg_icon_list_key_press (GtkWidget *widget,
- GdkEventKey *event);
/* EggIconList signals */
static void egg_icon_list_set_adjustments (EggIconList *icon_list,
@@ -193,10 +193,6 @@ static void egg_icon_list_queue_draw_item (EggIconList *ic
static void egg_icon_list_queue_layout (EggIconList *icon_list);
static void egg_icon_list_set_cursor_item (EggIconList *icon_list,
EggIconListItem *item);
-static void egg_icon_list_append_typeahead_string (EggIconList *icon_list,
- const gchar *string);
-static void egg_icon_list_select_first_matching_item (EggIconList *icon_list,
- const char *pattern);
static void egg_icon_list_start_rubberbanding (EggIconList *icon_list,
gint x,
gint y);
@@ -236,7 +232,7 @@ static void egg_icon_list_scroll_to_item (EggIconList *ic
EggIconListItem *item);
static GdkPixbuf *egg_icon_list_get_item_icon (EggIconList *icon_list,
EggIconListItem *item);
-static gchar * egg_icon_list_get_item_text (EggIconList *icon_list,
+static void egg_icon_list_update_item_text (EggIconList *icon_list,
EggIconListItem *item);
static void egg_icon_list_select_item (EggIconList *icon_list,
EggIconListItem *item);
@@ -313,7 +309,6 @@ egg_icon_list_class_init (EggIconListClass *klass)
widget_class->motion_notify_event = egg_icon_list_motion;
widget_class->button_press_event = egg_icon_list_button_press;
widget_class->button_release_event = egg_icon_list_button_release;
- widget_class->key_press_event = egg_icon_list_key_press;
klass->set_scroll_adjustments = egg_icon_list_set_adjustments;
klass->select_all = egg_icon_list_real_select_all;
@@ -349,6 +344,14 @@ egg_icon_list_class_init (EggIconListClass *klass)
G_PARAM_READWRITE));
g_object_class_install_property (gobject_class,
+ PROP_MARKUP_COLUMN,
+ g_param_spec_int ("markup_column",
+ _("Markup column"),
+ _("Model column used to retrieve the text if using pango markup"),
+ -1, G_MAXINT, -1,
+ G_PARAM_READWRITE));
+
+ g_object_class_install_property (gobject_class,
PROP_MODEL,
g_param_spec_object ("model",
_("Icon List Model"),
@@ -562,6 +565,7 @@ egg_icon_list_init (EggIconList *icon_list)
icon_list->priv->press_start_x = -1;
icon_list->priv->press_start_y = -1;
icon_list->priv->text_column = -1;
+ icon_list->priv->markup_column = -1;
icon_list->priv->pixbuf_column = -1;
icon_list->priv->layout = gtk_widget_create_pango_layout (GTK_WIDGET (icon_list), NULL);
@@ -626,6 +630,9 @@ egg_icon_list_set_property (GObject *object,
case PROP_TEXT_COLUMN:
egg_icon_list_set_text_column (icon_list, g_value_get_int (value));
break;
+ case PROP_MARKUP_COLUMN:
+ egg_icon_list_set_markup_column (icon_list, g_value_get_int (value));
+ break;
case PROP_MODEL:
egg_icon_list_set_model (icon_list, g_value_get_object (value));
break;
@@ -657,6 +664,9 @@ egg_icon_list_get_property (GObject *object,
case PROP_TEXT_COLUMN:
g_value_set_int (value, icon_list->priv->text_column);
break;
+ case PROP_MARKUP_COLUMN:
+ g_value_set_int (value, icon_list->priv->markup_column);
+ break;
case PROP_MODEL:
g_value_set_object (value, icon_list->priv->model);
break;
@@ -1047,44 +1057,6 @@ egg_icon_list_button_release (GtkWidget *widget,
}
-static gboolean
-egg_icon_list_key_press (GtkWidget *widget,
- GdkEventKey *event)
-{
- if ((* GTK_WIDGET_CLASS (parent_class)->key_press_event) (widget, event))
- return TRUE;
-
- return FALSE;
-
- if ((event->state & (GDK_CONTROL_MASK | GDK_MOD1_MASK)) == 0)
- egg_icon_list_append_typeahead_string (EGG_ICON_LIST (widget), event->string);
-
- return TRUE;
-}
-
-static void
-egg_icon_list_select_first_matching_item (EggIconList *icon_list,
- const char *pattern)
-{
-#if 0
- GList *items;
-
- if (pattern == NULL)
- return;
-
- for (items = icon_list->priv->items; items; items = items->next)
- {
- EggIconListItem *item = items->data;
-
- if (strncmp (pattern, item->label, strlen (pattern)) == 0)
- {
- egg_icon_list_select_item (icon_list, item);
- break;
- }
- }
-#endif
-}
-
static void
rubberbanding (gpointer data)
{
@@ -1634,7 +1606,6 @@ egg_icon_list_calculate_item_size (EggIconList *icon_list,
int layout_width, layout_height;
int maximum_layout_width;
GdkPixbuf *pixbuf;
- char *label;
if (item->width != -1 && item->width != -1)
return;
@@ -1654,12 +1625,11 @@ egg_icon_list_calculate_item_size (EggIconList *icon_list,
maximum_layout_width = MAX (item->pixbuf_width, MINIMUM_ICON_ITEM_WIDTH);
- if (icon_list->priv->text_column != -1)
+ if (icon_list->priv->markup_column != 1 ||
+ icon_list->priv->text_column != -1)
{
- label = egg_icon_list_get_item_text (icon_list, item);
- pango_layout_set_text (icon_list->priv->layout, label, -1);
- g_free (label);
-
+ egg_icon_list_update_item_text (icon_list, item);
+
pango_layout_set_alignment (icon_list->priv->layout, PANGO_ALIGN_CENTER);
pango_layout_set_width (icon_list->priv->layout, maximum_layout_width * PANGO_SCALE);
@@ -1743,7 +1713,6 @@ egg_icon_list_paint_item (EggIconList *icon_list,
{
GdkPixbuf *pixbuf, *tmp;
GtkStateType state;
- char *label;
if (!VALID_MODEL_AND_COLUMNS (icon_list))
return;
@@ -1786,15 +1755,13 @@ egg_icon_list_paint_item (EggIconList *icon_list,
item->layout_width + 2 * ICON_TEXT_PADDING,
item->layout_height + 2 * ICON_TEXT_PADDING);
}
-
- label = egg_icon_list_get_item_text (icon_list, item);
- pango_layout_set_text (icon_list->priv->layout, label, -1);
+
+ egg_icon_list_update_item_text (icon_list, item);
gdk_draw_layout (icon_list->priv->bin_window,
GTK_WIDGET (icon_list)->style->text_gc[item->selected ? state : GTK_STATE_NORMAL],
item->layout_x - ((item->width - item->layout_width) / 2) - (MAX (item->pixbuf_width, MINIMUM_ICON_ITEM_WIDTH) - item->width) / 2,
item->layout_y,
icon_list->priv->layout);
- g_free (label);
if (GTK_WIDGET_HAS_FOCUS (icon_list) &&
item == icon_list->priv->cursor_item)
@@ -1925,34 +1892,6 @@ egg_icon_list_set_cursor_item (EggIconList *icon_list,
egg_icon_list_queue_draw_item (icon_list, item);
}
-static void
-egg_icon_list_append_typeahead_string (EggIconList *icon_list,
- const gchar *string)
-{
- int i;
- char *typeahead_string;
-
- if (strlen (string) == 0)
- return;
-
- for (i = 0; i < strlen (string); i++)
- {
- if (!g_ascii_isprint (string[i]))
- return;
- }
-
- typeahead_string = g_strconcat (icon_list->priv->typeahead_string ?
- icon_list->priv->typeahead_string : "",
- string, NULL);
- g_free (icon_list->priv->typeahead_string);
- icon_list->priv->typeahead_string = typeahead_string;
-
- egg_icon_list_select_first_matching_item (icon_list,
- icon_list->priv->typeahead_string);
-
- g_print ("wooo: \"%s\"\n", typeahead_string);
-}
-
/* Public API */
GtkWidget *
egg_icon_list_new (void)
@@ -2000,36 +1939,15 @@ egg_icon_list_item_unref (EggIconListItem *item)
}
-#if 0
-void
-egg_icon_list_item_set_icon (EggIconListItem *item,
- GdkPixbuf *icon)
-{
- g_return_if_fail (item != NULL);
-
- if (icon == item->icon)
- return;
-
- g_object_unref (item->icon);
- item->icon = g_object_ref (icon);
-
- egg_icon_list_item_invalidate_size (item);
-
- egg_icon_list_queue_layout (item->icon_list);
-}
-#endif
-
-static gchar *
-egg_icon_list_get_item_text (EggIconList *icon_list,
- EggIconListItem *item)
+static void
+egg_icon_list_update_item_text (EggIconList *icon_list,
+ EggIconListItem *item)
{
gboolean iters_persist;
GtkTreeIter iter;
GtkTreePath *path;
gchar *text;
- g_return_val_if_fail (item != NULL, NULL);
-
iters_persist = gtk_tree_model_get_flags (icon_list->priv->model) & GTK_TREE_MODEL_ITERS_PERSIST;
if (!iters_persist)
@@ -2040,12 +1958,23 @@ egg_icon_list_get_item_text (EggIconList *icon_list,
}
else
iter = item->iter;
-
- gtk_tree_model_get (icon_list->priv->model, &iter,
- icon_list->priv->text_column, &text,
- -1);
- return text;
+ if (icon_list->priv->markup_column != -1)
+ {
+ gtk_tree_model_get (icon_list->priv->model, &iter,
+ icon_list->priv->markup_column, &text,
+ -1);
+ pango_layout_set_markup (icon_list->priv->layout, text, -1);
+ }
+ else
+ {
+ gtk_tree_model_get (icon_list->priv->model, &iter,
+ icon_list->priv->text_column, &text,
+ -1);
+ pango_layout_set_text (icon_list->priv->layout, text, -1);
+ }
+
+ g_free (text);
}
static GdkPixbuf *
@@ -2575,6 +2504,51 @@ egg_icon_list_set_text_column (EggIconList *icon_list,
g_object_notify (G_OBJECT (icon_list), "text_column");
}
+gint
+egg_icon_list_get_text_column (EggIconList *icon_list)
+{
+ g_return_val_if_fail (EGG_IS_ICON_LIST (icon_list), -1);
+
+ return icon_list->priv->text_column;
+}
+
+void
+egg_icon_list_set_markup_column (EggIconList *icon_list,
+ int column)
+{
+ if (column == icon_list->priv->markup_column)
+ return;
+
+ if (column == -1)
+ icon_list->priv->markup_column = -1;
+ else
+ {
+ if (icon_list->priv->model != NULL)
+ {
+ GType column_type;
+
+ column_type = gtk_tree_model_get_column_type (icon_list->priv->model, column);
+
+ g_return_if_fail (column_type == G_TYPE_STRING);
+ }
+
+ icon_list->priv->markup_column = column;
+ }
+
+ egg_icon_list_invalidate_sizes (icon_list);
+ egg_icon_list_queue_layout (icon_list);
+
+ g_object_notify (G_OBJECT (icon_list), "markup_column");
+}
+
+gint
+egg_icon_list_get_markup_column (EggIconList *icon_list)
+{
+ g_return_val_if_fail (EGG_IS_ICON_LIST (icon_list), -1);
+
+ return icon_list->priv->markup_column;
+}
+
void
egg_icon_list_set_pixbuf_column (EggIconList *icon_list,
int column)
@@ -2605,6 +2579,14 @@ egg_icon_list_set_pixbuf_column (EggIconList *icon_list,
}
+gint
+egg_icon_list_get_pixbuf_column (EggIconList *icon_list)
+{
+ g_return_val_if_fail (EGG_IS_ICON_LIST (icon_list), -1);
+
+ return icon_list->priv->pixbuf_column;
+}
+
static void
egg_icon_list_add_move_binding (GtkBindingSet *binding_set,
guint keyval,
diff --git a/gtk/gtkiconview.h b/gtk/gtkiconview.h
index 6534ccd3f9..4a7af6c0be 100644
--- a/gtk/gtkiconview.h
+++ b/gtk/gtkiconview.h
@@ -77,6 +77,9 @@ GtkTreeModel *egg_icon_list_get_model (EggIconList *icon_list);
void egg_icon_list_set_text_column (EggIconList *icon_list,
gint column);
gint egg_icon_list_get_text_column (EggIconList *icon_list);
+void egg_icon_list_set_markup_column (EggIconList *icon_list,
+ int column);
+gint egg_icon_list_get_markup_column (EggIconList *icon_list);
void egg_icon_list_set_pixbuf_column (EggIconList *icon_list,
gint column);
gint egg_icon_list_get_pixbuf_column (EggIconList *icon_list);