expose the child widgets in here (gtk_text_view_realize): set parent
2001-11-05 Havoc Pennington <hp@redhat.com> * gtk/gtktextview.c (gtk_text_view_paint): expose the child widgets in here (gtk_text_view_realize): set parent window of child widgets (gtk_text_view_size_request): use child req to decide whether to invalidate layout, not widget->requisition * gtk/gtktextdisplay.c (render_layout_line): set shaped_width_pixels for NULL shape objects, so that we properly draw the "missing pixbuf/widget" thing (render_layout_line): don't draw the widget here (gtk_text_layout_draw): pass out a list of widgets that need exposing * demos/gtk-demo/textview.c (insert_text): add demo of child widgets * gtk/gtktextlayout.c (add_child_attrs): remove debug spew * gtk/gtktextdisplay.c (render_layout_line): remove debug spew * gtk/gtktextview.c (gtk_text_view_update_child_allocation): add scroll offsets (gtk_text_view_value_changed): poke new X and Y into child allocations
This commit is contained in:
committed by
Havoc Pennington
parent
9af1351da5
commit
604eebd380
@ -8,36 +8,7 @@
|
||||
*/
|
||||
|
||||
#include <gtk/gtk.h>
|
||||
|
||||
/* Don't copy this bad example; inline RGB data is always a better
|
||||
* idea than inline XPMs.
|
||||
*/
|
||||
static char *book_closed_xpm[] = {
|
||||
"16 16 6 1",
|
||||
" c None s None",
|
||||
". c black",
|
||||
"X c red",
|
||||
"o c yellow",
|
||||
"O c #808080",
|
||||
"# c white",
|
||||
" ",
|
||||
" .. ",
|
||||
" ..XX. ",
|
||||
" ..XXXXX. ",
|
||||
" ..XXXXXXXX. ",
|
||||
".ooXXXXXXXXX. ",
|
||||
"..ooXXXXXXXXX. ",
|
||||
".X.ooXXXXXXXXX. ",
|
||||
".XX.ooXXXXXX.. ",
|
||||
" .XX.ooXXX..#O ",
|
||||
" .XX.oo..##OO. ",
|
||||
" .XX..##OO.. ",
|
||||
" .X.#OO.. ",
|
||||
" ..O.. ",
|
||||
" .. ",
|
||||
" "
|
||||
};
|
||||
|
||||
#include <stdlib.h> /* for exit() */
|
||||
|
||||
#define gray50_width 2
|
||||
#define gray50_height 2
|
||||
@ -71,7 +42,7 @@ create_tags (GtkTextBuffer *buffer)
|
||||
|
||||
gtk_text_buffer_create_tag (buffer, "heading",
|
||||
"weight", PANGO_WEIGHT_BOLD,
|
||||
"size", 20 * PANGO_SCALE,
|
||||
"size", 15 * PANGO_SCALE,
|
||||
NULL);
|
||||
|
||||
gtk_text_buffer_create_tag (buffer, "italic",
|
||||
@ -82,7 +53,7 @@ create_tags (GtkTextBuffer *buffer)
|
||||
|
||||
gtk_text_buffer_create_tag (buffer, "big",
|
||||
/* points times the PANGO_SCALE factor */
|
||||
"size", 30 * PANGO_SCALE, NULL);
|
||||
"size", 20 * PANGO_SCALE, NULL);
|
||||
|
||||
gtk_text_buffer_create_tag (buffer, "xx-small",
|
||||
"scale", PANGO_SCALE_XX_SMALL, NULL);
|
||||
@ -176,8 +147,22 @@ insert_text (GtkTextBuffer *buffer)
|
||||
GtkTextIter iter;
|
||||
GtkTextIter start, end;
|
||||
GdkPixbuf *pixbuf;
|
||||
GdkPixbuf *scaled;
|
||||
GtkTextChildAnchor *anchor;
|
||||
|
||||
pixbuf = gdk_pixbuf_new_from_xpm_data ((const char **) book_closed_xpm);
|
||||
pixbuf = gdk_pixbuf_new_from_file ("./gtk-logo-rgb.gif", NULL);
|
||||
if (pixbuf == NULL)
|
||||
gdk_pixbuf_new_from_file (DEMOCODEDIR"/gtk-logo-rgb.gif", NULL);
|
||||
|
||||
if (pixbuf == NULL)
|
||||
{
|
||||
g_printerr ("Failed to load image file gtk-logo-rgb.gif\n");
|
||||
exit (1);
|
||||
}
|
||||
|
||||
scaled = gdk_pixbuf_scale_simple (pixbuf, 32, 32, GDK_INTERP_BILINEAR);
|
||||
g_object_unref (G_OBJECT (pixbuf));
|
||||
pixbuf = scaled;
|
||||
|
||||
/* get start of buffer; each insertion will revalidate the
|
||||
* iterator to point to just after the inserted text.
|
||||
@ -336,9 +321,21 @@ insert_text (GtkTextBuffer *buffer)
|
||||
gtk_text_buffer_insert (buffer, &iter,
|
||||
"You can put all sorts of Unicode text in the buffer.\n\nGerman (Deutsch Süd) Grüß Gott\nGreek (Ελληνικά) Γειά σας\nHebrew שלום\nJapanese (日本語)\n\nThe widget properly handles bidirectional text, word wrapping, DOS/UNIX/Unicode paragraph separators, grapheme boundaries, and so on using the Pango internationalization framework.\n", -1);
|
||||
|
||||
gtk_text_buffer_insert (buffer, &iter, "Here's a word-wrapped quote in a right-to-left language:\n", -1);
|
||||
gtk_text_buffer_insert_with_tags_by_name (buffer, &iter, "وقد بدأ ثلاث من أكثر المؤسسات تقدما في شبكة اكسيون برامجها كمنظمات لا تسعى للربح، ثم تحولت في السنوات الخمس الماضية إلى مؤسسات مالية منظمة، وباتت جزءا من النظام المالي في بلدانها، ولكنها تتخصص في خدمة قطاع المشروعات الصغيرة. وأحد أكثر هذه المؤسسات نجاحا هو »بانكوسول« في بوليفيا.\n\n", -1,
|
||||
gtk_text_buffer_insert (buffer, &iter, "Here's a word-wrapped quote in a right-to-left language:\n", -1);
|
||||
gtk_text_buffer_insert_with_tags_by_name (buffer, &iter, "وقد بدأ ثلاث من أكثر المؤسسات تقدما في شبكة اكسيون برامجها كمنظمات لا تسعى للربح، ثم تحولت في السنوات الخمس الماضية إلى مؤسسات مالية منظمة، وباتت جزءا من النظام المالي في بلدانها، ولكنها تتخصص في خدمة قطاع المشروعات الصغيرة. وأحد أكثر هذه المؤسسات نجاحا هو »بانكوسول« في بوليفيا.\n\n", -1,
|
||||
"rtl_quote", NULL);
|
||||
|
||||
gtk_text_buffer_insert (buffer, &iter, "You can put widgets in the buffer: Here's a button: ", -1);
|
||||
anchor = gtk_text_buffer_create_child_anchor (buffer, &iter);
|
||||
gtk_text_buffer_insert (buffer, &iter, " and a menu: ", -1);
|
||||
anchor = gtk_text_buffer_create_child_anchor (buffer, &iter);
|
||||
gtk_text_buffer_insert (buffer, &iter, " and a scale: ", -1);
|
||||
anchor = gtk_text_buffer_create_child_anchor (buffer, &iter);
|
||||
gtk_text_buffer_insert (buffer, &iter, " and an animation: ", -1);
|
||||
anchor = gtk_text_buffer_create_child_anchor (buffer, &iter);
|
||||
gtk_text_buffer_insert (buffer, &iter, " finally a text entry: ", -1);
|
||||
anchor = gtk_text_buffer_create_child_anchor (buffer, &iter);
|
||||
gtk_text_buffer_insert (buffer, &iter, ".\n", -1);
|
||||
|
||||
gtk_text_buffer_insert (buffer, &iter, "\n\nThis demo doesn't demonstrate all the GtkTextBuffer features; it leaves out, for example: invisible/hidden text (doesn't work in GTK 2, but planned), tab stops, application-drawn areas on the sides of the widget for displaying breakpoints and such...", -1);
|
||||
|
||||
@ -349,6 +346,91 @@ insert_text (GtkTextBuffer *buffer)
|
||||
g_object_unref (G_OBJECT (pixbuf));
|
||||
}
|
||||
|
||||
static gboolean
|
||||
find_anchor (GtkTextIter *iter)
|
||||
{
|
||||
while (gtk_text_iter_forward_char (iter))
|
||||
{
|
||||
if (gtk_text_iter_get_child_anchor (iter))
|
||||
return TRUE;
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static void
|
||||
attach_widgets (GtkTextView *text_view)
|
||||
{
|
||||
GtkTextIter iter;
|
||||
GtkTextBuffer *buffer;
|
||||
int i;
|
||||
|
||||
buffer = gtk_text_view_get_buffer (text_view);
|
||||
|
||||
gtk_text_buffer_get_start_iter (buffer, &iter);
|
||||
|
||||
i = 0;
|
||||
while (find_anchor (&iter))
|
||||
{
|
||||
GtkTextChildAnchor *anchor;
|
||||
GtkWidget *widget;
|
||||
|
||||
anchor = gtk_text_iter_get_child_anchor (&iter);
|
||||
|
||||
if (i == 0)
|
||||
{
|
||||
widget = gtk_button_new_with_label ("Click Me");
|
||||
}
|
||||
else if (i == 1)
|
||||
{
|
||||
GtkWidget *menu_item;
|
||||
GtkWidget *menu;
|
||||
|
||||
menu = gtk_menu_new ();
|
||||
|
||||
widget = gtk_option_menu_new ();
|
||||
|
||||
menu_item = gtk_menu_item_new_with_label ("Option 1");
|
||||
gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_item);
|
||||
menu_item = gtk_menu_item_new_with_label ("Option 2");
|
||||
gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_item);
|
||||
menu_item = gtk_menu_item_new_with_label ("Option 3");
|
||||
gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_item);
|
||||
|
||||
gtk_option_menu_set_menu (GTK_OPTION_MENU (widget), menu);
|
||||
}
|
||||
else if (i == 2)
|
||||
{
|
||||
widget = gtk_hscale_new (NULL);
|
||||
gtk_range_set_range (GTK_RANGE (widget), 0, 100);
|
||||
gtk_widget_set_size_request (widget, 70, -1);
|
||||
}
|
||||
else if (i == 3)
|
||||
{
|
||||
if (g_file_test ("./floppybuddy.gif", G_FILE_TEST_EXISTS))
|
||||
widget = gtk_image_new_from_file ("./floppybuddy.gif");
|
||||
else
|
||||
widget = gtk_image_new_from_file (DEMOCODEDIR"/floppybuddy.gif");
|
||||
}
|
||||
else if (i == 4)
|
||||
{
|
||||
widget = gtk_entry_new ();
|
||||
}
|
||||
else
|
||||
{
|
||||
widget = NULL; /* avoids a compiler warning */
|
||||
g_assert_not_reached ();
|
||||
}
|
||||
|
||||
gtk_text_view_add_child_at_anchor (text_view,
|
||||
widget,
|
||||
anchor);
|
||||
|
||||
gtk_widget_show_all (widget);
|
||||
|
||||
++i;
|
||||
}
|
||||
}
|
||||
|
||||
GtkWidget *
|
||||
do_textview (void)
|
||||
{
|
||||
@ -403,6 +485,9 @@ do_textview (void)
|
||||
|
||||
create_tags (buffer);
|
||||
insert_text (buffer);
|
||||
|
||||
attach_widgets (GTK_TEXT_VIEW (view1));
|
||||
attach_widgets (GTK_TEXT_VIEW (view2));
|
||||
|
||||
gtk_widget_show_all (vpaned);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user