diff options
author | Denys Vlasenko <dvlasenk@redhat.com> | 2011-04-14 15:42:35 +0200 |
---|---|---|
committer | Denys Vlasenko <dvlasenk@redhat.com> | 2011-04-14 15:42:35 +0200 |
commit | cb3cd8037414ef5d239ecc4e53edaa97a5749481 (patch) | |
tree | f00ce377baedbed0a86a3ff15bfb7d48b6108e73 /src | |
parent | be642e15c9d635a433dae3b3bb83b0e2a0079bad (diff) | |
download | abrt-cb3cd8037414ef5d239ecc4e53edaa97a5749481.tar.gz abrt-cb3cd8037414ef5d239ecc4e53edaa97a5749481.tar.xz abrt-cb3cd8037414ef5d239ecc4e53edaa97a5749481.zip |
wizard: robustify iteration through event GtkContainers; add utility function
Signed-off-by: Denys Vlasenko <dvlasenk@redhat.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/gtk-helpers/Makefile.am | 7 | ||||
-rw-r--r-- | src/gtk-helpers/autowrapped_label.c | 74 | ||||
-rw-r--r-- | src/gtk-helpers/libreport-gtk.h | 2 | ||||
-rw-r--r-- | src/gui-wizard-gtk/wizard.c | 50 |
4 files changed, 111 insertions, 22 deletions
diff --git a/src/gtk-helpers/Makefile.am b/src/gtk-helpers/Makefile.am index 90c9be7f..d60df6d5 100644 --- a/src/gtk-helpers/Makefile.am +++ b/src/gtk-helpers/Makefile.am @@ -3,9 +3,10 @@ lib_LTLIBRARIES = \ libreportgtk.la libreportgtk_la_SOURCES = \ - libreport-gtk.h \ - event_config_dialog.c \ - abrt-keyring.c + libreport-gtk.h \ + event_config_dialog.c \ + abrt-keyring.c \ + autowrapped_label.c libreportgtk_la_CPPFLAGS = \ -Wall -Wwrite-strings -Werror \ diff --git a/src/gtk-helpers/autowrapped_label.c b/src/gtk-helpers/autowrapped_label.c new file mode 100644 index 00000000..01d8856b --- /dev/null +++ b/src/gtk-helpers/autowrapped_label.c @@ -0,0 +1,74 @@ +/* + Copyright (C) 2011 ABRT Team + Copyright (C) 2011 RedHat inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ +#include <gtk/gtk.h> +#include "abrtlib.h" + +/* + * GTK doesn't re-wrap GtkLabels which have line wrapping set to true. + * The line wrapped label in VBox looks like this: + * |----------------------------------------| + * |----------------------------------------| + * | word word word word | + * | word word word word | + * | word word | + * |----------------------------------------| + * |----------------------------------------| + * So every project copy-pastes this code to make labels widen + * and shrink horizontally on resize. + */ + +static void rewrap_label_to_parent_size(GtkWidget *widget, + GtkAllocation *allocation, + gpointer data) +{ + GtkLabel *label = GTK_LABEL(widget); + PangoLayout *layout = gtk_label_get_layout(label); + + int lw_old, lh_old; + pango_layout_get_pixel_size(layout, &lw_old, &lh_old); + + /* Already right size? */ + if (lw_old == allocation->width) + return; + + /* Rewrap text to new width */ + pango_layout_set_width(layout, allocation->width * PANGO_SCALE); + + /* Did text height change as a result? */ + int lh; + pango_layout_get_pixel_size(layout, NULL, &lh); + if (lh != lh_old) /* yes, resize label height */ + gtk_widget_set_size_request(widget, -1, lh); +} + +void make_label_autowrap_on_resize(GtkLabel *label) +{ + // So far, only tested to work on labels which were set up as: + //gtk_label_set_justify(label, GTK_JUSTIFY_LEFT); + //gtk_misc_set_alignment(GTK_MISC(label), /*xalign:*/ 0.0, /*yalign:*/ 0.0); + + /* Makes no sense on non-wrapped labels, so we can as well + * set wrapping to "on" unconditionally, istead of making it a requirement + */ + gtk_label_set_line_wrap(label, TRUE); + g_signal_connect(G_OBJECT(label), "size-allocate", G_CALLBACK(rewrap_label_to_parent_size), NULL); + + // So far, only tested to work on labels which were set up as: + //gtk_box_pack_start(box, label, /*expand*/ false, /*fill*/ false, /*padding*/ 0); +} diff --git a/src/gtk-helpers/libreport-gtk.h b/src/gtk-helpers/libreport-gtk.h index e7cf4824..d2105c3a 100644 --- a/src/gtk-helpers/libreport-gtk.h +++ b/src/gtk-helpers/libreport-gtk.h @@ -17,5 +17,7 @@ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ void show_events_list_dialog(GtkWindow *parent); +void make_label_autowrap_on_resize(GtkLabel *label); + void abrt_keyring_save_settings(const char *event_name); void load_event_config_data_from_keyring(); diff --git a/src/gui-wizard-gtk/wizard.c b/src/gui-wizard-gtk/wizard.c index 04200fc6..863b9159 100644 --- a/src/gui-wizard-gtk/wizard.c +++ b/src/gui-wizard-gtk/wizard.c @@ -381,14 +381,17 @@ static void report_tb_was_toggled(GtkButton *button_unused, gpointer user_data_u { for (; li; li = li->next) { - if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(li->data)) == TRUE) + if (GTK_IS_TOGGLE_BUTTON(li->data)) { - const char *event_name = gtk_widget_get_tooltip_text(GTK_WIDGET(li->data)); - strbuf_append_strf(reporters_string, - "%s%s", - (reporters_string->len != 0 ? ", " : ""), - event_name - ); + if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(li->data)) == TRUE) + { + const char *event_name = gtk_widget_get_tooltip_text(GTK_WIDGET(li->data)); + strbuf_append_strf(reporters_string, + "%s%s", + (reporters_string->len != 0 ? ", " : ""), + event_name + ); + } } } } @@ -554,8 +557,11 @@ void update_gui_state_from_crash_data(void) GList *li; for (li = old_reporters; li; li = li->next) { - if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(li->data)) == TRUE) - li->data = xstrdup(gtk_button_get_label(GTK_BUTTON(li->data))); + if (GTK_IS_TOGGLE_BUTTON(li->data)) + { + if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(li->data)) == TRUE) + li->data = xstrdup(gtk_button_get_label(GTK_BUTTON(li->data))); + } else li->data = NULL; } @@ -567,15 +573,18 @@ void update_gui_state_from_crash_data(void) GList *li_new; for (li_new = new_reporters; li_new; li_new = li_new->next) { - const char *new_name = gtk_button_get_label(GTK_BUTTON(li_new->data)); - GList *li_old; - - for (li_old = old_reporters; li_old; li_old = li_old->next) + if (GTK_IS_TOGGLE_BUTTON(li_new->data)) { - if (strcmp(new_name, li_old->data) == 0) + const char *new_name = gtk_button_get_label(GTK_BUTTON(li_new->data)); + GList *li_old; + + for (li_old = old_reporters; li_old; li_old = li_old->next) { - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(li_new->data), true); - break; + if (strcmp(new_name, li_old->data) == 0) + { + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(li_new->data), true); + break; + } } } } @@ -1023,9 +1032,12 @@ static void next_page(GtkAssistant *assistant, gpointer user_data) GList *li; for (li = reporters; li; li = li->next) { - if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(li->data)) == TRUE) - /* Button's tooltip contains event_name */ - li->data = (gpointer)gtk_widget_get_tooltip_text(GTK_WIDGET(li->data)); + if (GTK_IS_TOGGLE_BUTTON(li->data)) + { + if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(li->data)) == TRUE) + /* Button's tooltip contains event_name */ + li->data = (gpointer)gtk_widget_get_tooltip_text(GTK_WIDGET(li->data)); + } else li->data = NULL; } |