diff options
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 | 75 |
4 files changed, 128 insertions, 30 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..6bef08d3 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 + ); + } } } } @@ -431,19 +434,20 @@ static GtkWidget *add_event_buttons(GtkBox *box, char *event_name, GCallback fun event_screen_name = cfg->screen_name; event_description = cfg->description; } - char *event_label = xasprintf("%s%s%s", - event_screen_name, - (event_description ? " - " : ""), - event_description ? event_description : "" - ); + //char *event_label = xasprintf("%s%s%s", + // event_screen_name, + // (event_description ? " - " : ""), + // event_description ? event_description : "" + //); //VERB2 log("adding button '%s' to box %p", event_name, box); GtkWidget *button = radio - ? gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(first_button), event_label) - : gtk_check_button_new_with_label(event_label); + ? gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(first_button), event_screen_name) + : gtk_check_button_new_with_label(event_screen_name); + //free(event_label); + if (!first_button) first_button = button; - free(event_label); /* Important: tooltip isn't used merely as decoration. We retrieve event name in the toggle handlers! */ gtk_widget_set_tooltip_text(button, event_name); @@ -458,6 +462,14 @@ static GtkWidget *add_event_buttons(GtkBox *box, char *event_name, GCallback fun event_name = event_name_end + 1; gtk_box_pack_start(box, button, /*expand*/ false, /*fill*/ false, /*padding*/ 0); + if (event_description) + { + GtkWidget *label = gtk_label_new(event_description); + gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_LEFT); + gtk_misc_set_alignment(GTK_MISC(label), /*xalign:*/ 0.0, /*yalign:*/ 0.0); + make_label_autowrap_on_resize(GTK_LABEL(label)); + gtk_box_pack_start(box, label, /*expand*/ false, /*fill*/ false, /*padding*/ 0); + } if (func) g_signal_connect(G_OBJECT(button), "toggled", func, NULL); @@ -554,8 +566,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 +582,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 +1041,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; } |
