Problem with multiple GtkTextView in one ScrolledWindow
- From: "Till Harbaum" <lists harbaum org>
- To: gtk-app-devel-list gnome org
- Subject: Problem with multiple GtkTextView in one ScrolledWindow
- Date: Thu, 3 Apr 2008 08:50:58 +0200 (MEST)
Hi,
i have recently run into a layout problem i am unable to solve. I have a dialog with a notebook and one of
the notebooks
tabs is filled with the widget returned by the funktion below. This function creates a scrolled window, puts
a vbox inside and then add several textviews and some hboxes with additional info inside. The idea is to have
one long scrolling window with a bunch of texts seperated by those hboxes (it's a geocaching application and
this is a list of log entries wach with some info header).
The problem is that the textviews don't get scaled correctly. They don't display their full text but instead
are truncated after one or two lines. I can even scroll this truncated stuff. This only happens until i click
into on of the textviews. And although they aren't editable, they immediately scale to their correct size. I
can force the same thing to happen with the (now commented) gtk_widget_show_all in the function below. But
this causes a visible reconstruction of the scrolled_window and you actually see the wrong layout for a
fraction of a second. But more important it makes that tab the default open one which isn't what i want. This
tab should only become active once the user selects it.
I have the impression that there's something with the fact that the textviews don't know their size at the
time they are put into the vbox. The actual size gets known once the entire notebook is being put into the
dialog. But at that time the construction of the textviews/vboxes/scrolled_window is already done.
Asking the scrolled window to recalc its childrens sizes instead of calling gtk_widget_show_all doesn't seem
to have any effect.
Any help is really appreciated ...
Regards,
Till
static GtkWidget *cache_logs(log_t *log) {
if(!log)
return gtk_label_new("No logs\n");
/* put this inside a scrolled view */
GtkWidget *scrolled_window = gtk_scrolled_window_new(NULL, NULL);
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_window),
GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS);
GtkWidget *vbox = gtk_vbox_new(FALSE, 0);
/* add all logs to the vbox */
while(log) {
GtkWidget *hbox = gtk_hbox_new(FALSE, 0);
/* build header */
gtk_box_pack_start(GTK_BOX(hbox),
gtk_image_new_from_pixbuf(icons.log[log->type]), 1, 1, 0);
char date_str[32];
sprintf(date_str, sizeof(date_str), "%d/%d/%d",
log->year, log->month, log->day);
gtk_box_pack_start(GTK_BOX(hbox), gtk_label_new(date_str), 1, 1, 0);
gtk_box_pack_start(GTK_BOX(hbox), gtk_label_new(log->finder), 1, 1, 0);
gtk_box_pack_start(GTK_BOX(vbox), hbox, 1, 1, 0);
GtkTextBuffer *buffer = gtk_text_buffer_new(NULL);
gtk_text_buffer_set_text(buffer, log->text, strlen(log->text));
GtkWidget *textview = gtk_text_view_new_with_buffer(buffer);
gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(textview), GTK_WRAP_WORD);
gtk_text_view_set_editable(GTK_TEXT_VIEW(textview), FALSE);
gtk_text_view_set_cursor_visible(GTK_TEXT_VIEW(textview), FALSE);
gtk_box_pack_start(GTK_BOX(vbox), textview, 1, 1, 0);
log = log->next;
}
gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(scrolled_window),
vbox);
// gtk_widget_show_all(scrolled_window);
return scrolled_window;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]