diff --git a/ChangeLog b/ChangeLog index 7a8d8e6724..6ac889438f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,19 @@ +2000-02-07 Kelly Lynn Martin + + * app/interface.c: restructured toolbox to use a single + gtk_hwrap_box with the added "forced break" functionality to make + the selector boxes not run in with the rest of the tool buttons. + The toolbox should now not cut things off, although if the user + selects a really small toolbox the buttons or selectors may be, + um, difficult to use... + + * app/gtkwrapbox.h: + * app/gtkwrapbox.c: + * app/gtkvwrapbox.c (reverse_list_col_children): + * app/gtkhwrapbox.c (reverse_list_row_children): support for + "forced break" functionality needed for toolbox -- will forward + patches to Tim Janik as well + Mon Feb 7 05:04:28 2000 Tim Janik * app/gtkhwrapbox.c: diff --git a/app/display/gimpdisplayshell-draw.c b/app/display/gimpdisplayshell-draw.c index 99862e3b4f..47ec63012a 100644 --- a/app/display/gimpdisplayshell-draw.c +++ b/app/display/gimpdisplayshell-draw.c @@ -256,7 +256,7 @@ create_indicator_area (GtkWidget *parent) frame = gtk_frame_new (NULL); gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_OUT); - gtk_wrap_box_pack (GTK_WRAP_BOX (parent), frame, FALSE, TRUE, FALSE, TRUE); + gtk_wrap_box_pack (GTK_WRAP_BOX (parent), frame, TRUE, TRUE, TRUE, TRUE); gtk_widget_realize (frame); alignment = gtk_alignment_new (0.5, 0.5, 0.0, 0.0); @@ -290,7 +290,8 @@ create_color_area (GtkWidget *parent) frame = gtk_frame_new (NULL); gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_OUT); - gtk_wrap_box_pack (GTK_WRAP_BOX (parent), frame, FALSE, TRUE, FALSE, TRUE); + gtk_wrap_box_pack (GTK_WRAP_BOX (parent), frame, TRUE, TRUE, TRUE, TRUE); + gtk_wrap_box_set_child_forced_break (GTK_WRAP_BOX (parent), frame, TRUE); gtk_widget_realize (frame); alignment = gtk_alignment_new (0.5, 0.5, 0.0, 0.0); @@ -346,11 +347,7 @@ create_tools (GtkWidget *parent) GSList *group; gint i, j; - /*create_logo (parent);*/ - wbox = gtk_hwrap_box_new (FALSE); - gtk_wrap_box_set_aspect_ratio (GTK_WRAP_BOX (wbox), .36); - gtk_container_set_border_width (GTK_CONTAINER (wbox), 0); - gtk_wrap_box_pack (GTK_WRAP_BOX (parent), wbox, TRUE, TRUE, TRUE, TRUE); + wbox = parent; gtk_widget_realize (gtk_widget_get_toplevel (wbox)); @@ -368,7 +365,7 @@ create_tools (GtkWidget *parent) gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (button), FALSE); gtk_wrap_box_pack (GTK_WRAP_BOX (wbox), button, - FALSE, TRUE, FALSE, TRUE); + FALSE, FALSE, FALSE, FALSE); alignment = gtk_alignment_new (0.5, 0.5, 0.0, 0.0); gtk_container_set_border_width (GTK_CONTAINER (alignment), 0); @@ -592,16 +589,20 @@ create_toolbox (void) gimp_standard_help_func, "toolbox/toolbox.html"); - wbox = gtk_vwrap_box_new (FALSE); - gtk_wrap_box_set_justify (GTK_WRAP_BOX (wbox), GTK_JUSTIFY_FILL); + wbox = gtk_hwrap_box_new (FALSE); + gtk_wrap_box_set_justify (GTK_WRAP_BOX (wbox), GTK_JUSTIFY_TOP); + gtk_wrap_box_set_line_justify (GTK_WRAP_BOX (wbox), GTK_JUSTIFY_LEFT); + gtk_wrap_box_set_aspect_ratio (GTK_WRAP_BOX (wbox), 20); gtk_container_set_border_width (GTK_CONTAINER (wbox), 0); gtk_box_pack_start (GTK_BOX (main_vbox), wbox, TRUE, TRUE, 0); gtk_widget_show (wbox); create_tools (wbox); + create_color_area (wbox); if (show_indicators) create_indicator_area (wbox); + gtk_widget_show (window); toolbox_set_drag_dest (window); diff --git a/app/display/gimpdisplayshell.c b/app/display/gimpdisplayshell.c index 99862e3b4f..47ec63012a 100644 --- a/app/display/gimpdisplayshell.c +++ b/app/display/gimpdisplayshell.c @@ -256,7 +256,7 @@ create_indicator_area (GtkWidget *parent) frame = gtk_frame_new (NULL); gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_OUT); - gtk_wrap_box_pack (GTK_WRAP_BOX (parent), frame, FALSE, TRUE, FALSE, TRUE); + gtk_wrap_box_pack (GTK_WRAP_BOX (parent), frame, TRUE, TRUE, TRUE, TRUE); gtk_widget_realize (frame); alignment = gtk_alignment_new (0.5, 0.5, 0.0, 0.0); @@ -290,7 +290,8 @@ create_color_area (GtkWidget *parent) frame = gtk_frame_new (NULL); gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_OUT); - gtk_wrap_box_pack (GTK_WRAP_BOX (parent), frame, FALSE, TRUE, FALSE, TRUE); + gtk_wrap_box_pack (GTK_WRAP_BOX (parent), frame, TRUE, TRUE, TRUE, TRUE); + gtk_wrap_box_set_child_forced_break (GTK_WRAP_BOX (parent), frame, TRUE); gtk_widget_realize (frame); alignment = gtk_alignment_new (0.5, 0.5, 0.0, 0.0); @@ -346,11 +347,7 @@ create_tools (GtkWidget *parent) GSList *group; gint i, j; - /*create_logo (parent);*/ - wbox = gtk_hwrap_box_new (FALSE); - gtk_wrap_box_set_aspect_ratio (GTK_WRAP_BOX (wbox), .36); - gtk_container_set_border_width (GTK_CONTAINER (wbox), 0); - gtk_wrap_box_pack (GTK_WRAP_BOX (parent), wbox, TRUE, TRUE, TRUE, TRUE); + wbox = parent; gtk_widget_realize (gtk_widget_get_toplevel (wbox)); @@ -368,7 +365,7 @@ create_tools (GtkWidget *parent) gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (button), FALSE); gtk_wrap_box_pack (GTK_WRAP_BOX (wbox), button, - FALSE, TRUE, FALSE, TRUE); + FALSE, FALSE, FALSE, FALSE); alignment = gtk_alignment_new (0.5, 0.5, 0.0, 0.0); gtk_container_set_border_width (GTK_CONTAINER (alignment), 0); @@ -592,16 +589,20 @@ create_toolbox (void) gimp_standard_help_func, "toolbox/toolbox.html"); - wbox = gtk_vwrap_box_new (FALSE); - gtk_wrap_box_set_justify (GTK_WRAP_BOX (wbox), GTK_JUSTIFY_FILL); + wbox = gtk_hwrap_box_new (FALSE); + gtk_wrap_box_set_justify (GTK_WRAP_BOX (wbox), GTK_JUSTIFY_TOP); + gtk_wrap_box_set_line_justify (GTK_WRAP_BOX (wbox), GTK_JUSTIFY_LEFT); + gtk_wrap_box_set_aspect_ratio (GTK_WRAP_BOX (wbox), 20); gtk_container_set_border_width (GTK_CONTAINER (wbox), 0); gtk_box_pack_start (GTK_BOX (main_vbox), wbox, TRUE, TRUE, 0); gtk_widget_show (wbox); create_tools (wbox); + create_color_area (wbox); if (show_indicators) create_indicator_area (wbox); + gtk_widget_show (window); toolbox_set_drag_dest (window); diff --git a/app/gtkhwrapbox.c b/app/gtkhwrapbox.c index e856dc3c7d..82788354fc 100644 --- a/app/gtkhwrapbox.c +++ b/app/gtkhwrapbox.c @@ -324,7 +324,8 @@ reverse_list_row_children (GtkWrapBox *wbox, if (GTK_WIDGET_VISIBLE (child->widget)) { get_child_requisition (wbox, child->widget, &child_requisition); - if (width + wbox->hspacing + child_requisition.width > row_width) + if (width + wbox->hspacing + child_requisition.width > row_width || + child->forced_break) break; width += wbox->hspacing + child_requisition.width; *max_child_size = MAX (*max_child_size, child_requisition.height); @@ -620,7 +621,7 @@ layout_rows (GtkWrapBox *wbox, line->children, children_per_line, line->expand); - + g_slist_free (line->children); g_free (line); line = next_line; diff --git a/app/gtkvwrapbox.c b/app/gtkvwrapbox.c index 448df995ee..0e71fa251e 100644 --- a/app/gtkvwrapbox.c +++ b/app/gtkvwrapbox.c @@ -324,7 +324,8 @@ reverse_list_col_children (GtkWrapBox *wbox, if (GTK_WIDGET_VISIBLE (child->widget)) { get_child_requisition (wbox, child->widget, &child_requisition); - if (height + wbox->vspacing + child_requisition.height > col_height) + if (height + wbox->vspacing + child_requisition.height > col_height || + child->forced_break) break; height += wbox->vspacing + child_requisition.height; *max_child_size = MAX (*max_child_size, child_requisition.width); diff --git a/app/gtkwrapbox.c b/app/gtkwrapbox.c index a5f2483f68..90da770add 100644 --- a/app/gtkwrapbox.c +++ b/app/gtkwrapbox.c @@ -42,7 +42,8 @@ enum { CHILD_ARG_HEXPAND, CHILD_ARG_HFILL, CHILD_ARG_VEXPAND, - CHILD_ARG_VFILL + CHILD_ARG_VFILL, + CHILD_ARG_FORCED_BREAK }; @@ -166,6 +167,8 @@ gtk_wrap_box_class_init (GtkWrapBoxClass *class) GTK_TYPE_BOOL, GTK_ARG_READWRITE, CHILD_ARG_VEXPAND); gtk_container_add_child_arg_type ("GtkWrapBox::vfill", GTK_TYPE_BOOL, GTK_ARG_READWRITE, CHILD_ARG_VFILL); + gtk_container_add_child_arg_type ("GtkWrapBox::forcebreak", + GTK_TYPE_BOOL, GTK_ARG_READWRITE, CHILD_ARG_FORCED_BREAK); } static void @@ -299,6 +302,10 @@ gtk_wrap_box_set_child_arg (GtkContainer *container, hexpand, hfill, vexpand, GTK_VALUE_BOOL (*arg)); break; + case CHILD_ARG_FORCED_BREAK: + gtk_wrap_box_set_child_forced_break (wbox, child, + GTK_VALUE_BOOL (*arg)); + break; default: break; } @@ -457,6 +464,7 @@ gtk_wrap_box_pack (GtkWrapBox *wbox, child_info->hfill = hfill ? TRUE : FALSE; child_info->vexpand = vexpand ? TRUE : FALSE; child_info->vfill = vfill ? TRUE : FALSE; + child_info->forced_break = FALSE; child_info->next = NULL; if (wbox->children) { @@ -565,6 +573,27 @@ gtk_wrap_box_query_child_packing (GtkWrapBox *wbox, } } +void +gtk_wrap_box_query_child_forced_break (GtkWrapBox *wbox, + GtkWidget *child, + gboolean *forced_break) +{ + GtkWrapBoxChild *child_info; + + g_return_if_fail (GTK_IS_WRAP_BOX (wbox)); + g_return_if_fail (GTK_IS_WIDGET (child)); + + for (child_info = wbox->children; child_info; child_info = child_info->next) + if (child_info->widget == child) + break; + + if (child_info) + { + if (forced_break) + *forced_break = child_info->forced_break; + } +} + void gtk_wrap_box_set_child_packing (GtkWrapBox *wbox, GtkWidget *child, @@ -601,6 +630,32 @@ gtk_wrap_box_set_child_packing (GtkWrapBox *wbox, } } +void +gtk_wrap_box_set_child_forced_break (GtkWrapBox *wbox, + GtkWidget *child, + gboolean forced_break) +{ + GtkWrapBoxChild *child_info; + + g_return_if_fail (GTK_IS_WRAP_BOX (wbox)); + g_return_if_fail (GTK_IS_WIDGET (child)); + + forced_break = forced_break != FALSE; + + for (child_info = wbox->children; child_info; child_info = child_info->next) + if (child_info->widget == child) + break; + + if (child_info && + (child_info->forced_break != forced_break)) + { + child_info->forced_break = forced_break; + + if (GTK_WIDGET_VISIBLE (child) && GTK_WIDGET_VISIBLE (wbox)) + gtk_widget_queue_resize (child); + } +} + guint* gtk_wrap_box_query_line_lengths (GtkWrapBox *wbox, guint *_n_lines) diff --git a/app/gtkwrapbox.h b/app/gtkwrapbox.h index 9d020c96d1..6b2266b83c 100644 --- a/app/gtkwrapbox.h +++ b/app/gtkwrapbox.h @@ -78,6 +78,7 @@ struct _GtkWrapBoxChild guint hfill : 1; guint vexpand : 1; guint vfill : 1; + guint forced_break : 1; GtkWrapBoxChild *next; }; @@ -114,12 +115,18 @@ void gtk_wrap_box_query_child_packing (GtkWrapBox *wbox, gboolean *hfill, gboolean *vexpand, gboolean *vfill); +void gtk_wrap_box_query_child_forced_break (GtkWrapBox *wbox, + GtkWidget *child, + gboolean *forced_break); void gtk_wrap_box_set_child_packing (GtkWrapBox *wbox, GtkWidget *child, gboolean hexpand, gboolean hfill, gboolean vexpand, gboolean vfill); +void gtk_wrap_box_set_child_forced_break (GtkWrapBox *wbox, + GtkWidget *child, + gboolean forced_break); guint* gtk_wrap_box_query_line_lengths (GtkWrapBox *wbox, guint *n_lines); diff --git a/app/interface.c b/app/interface.c index 99862e3b4f..47ec63012a 100644 --- a/app/interface.c +++ b/app/interface.c @@ -256,7 +256,7 @@ create_indicator_area (GtkWidget *parent) frame = gtk_frame_new (NULL); gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_OUT); - gtk_wrap_box_pack (GTK_WRAP_BOX (parent), frame, FALSE, TRUE, FALSE, TRUE); + gtk_wrap_box_pack (GTK_WRAP_BOX (parent), frame, TRUE, TRUE, TRUE, TRUE); gtk_widget_realize (frame); alignment = gtk_alignment_new (0.5, 0.5, 0.0, 0.0); @@ -290,7 +290,8 @@ create_color_area (GtkWidget *parent) frame = gtk_frame_new (NULL); gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_OUT); - gtk_wrap_box_pack (GTK_WRAP_BOX (parent), frame, FALSE, TRUE, FALSE, TRUE); + gtk_wrap_box_pack (GTK_WRAP_BOX (parent), frame, TRUE, TRUE, TRUE, TRUE); + gtk_wrap_box_set_child_forced_break (GTK_WRAP_BOX (parent), frame, TRUE); gtk_widget_realize (frame); alignment = gtk_alignment_new (0.5, 0.5, 0.0, 0.0); @@ -346,11 +347,7 @@ create_tools (GtkWidget *parent) GSList *group; gint i, j; - /*create_logo (parent);*/ - wbox = gtk_hwrap_box_new (FALSE); - gtk_wrap_box_set_aspect_ratio (GTK_WRAP_BOX (wbox), .36); - gtk_container_set_border_width (GTK_CONTAINER (wbox), 0); - gtk_wrap_box_pack (GTK_WRAP_BOX (parent), wbox, TRUE, TRUE, TRUE, TRUE); + wbox = parent; gtk_widget_realize (gtk_widget_get_toplevel (wbox)); @@ -368,7 +365,7 @@ create_tools (GtkWidget *parent) gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (button), FALSE); gtk_wrap_box_pack (GTK_WRAP_BOX (wbox), button, - FALSE, TRUE, FALSE, TRUE); + FALSE, FALSE, FALSE, FALSE); alignment = gtk_alignment_new (0.5, 0.5, 0.0, 0.0); gtk_container_set_border_width (GTK_CONTAINER (alignment), 0); @@ -592,16 +589,20 @@ create_toolbox (void) gimp_standard_help_func, "toolbox/toolbox.html"); - wbox = gtk_vwrap_box_new (FALSE); - gtk_wrap_box_set_justify (GTK_WRAP_BOX (wbox), GTK_JUSTIFY_FILL); + wbox = gtk_hwrap_box_new (FALSE); + gtk_wrap_box_set_justify (GTK_WRAP_BOX (wbox), GTK_JUSTIFY_TOP); + gtk_wrap_box_set_line_justify (GTK_WRAP_BOX (wbox), GTK_JUSTIFY_LEFT); + gtk_wrap_box_set_aspect_ratio (GTK_WRAP_BOX (wbox), 20); gtk_container_set_border_width (GTK_CONTAINER (wbox), 0); gtk_box_pack_start (GTK_BOX (main_vbox), wbox, TRUE, TRUE, 0); gtk_widget_show (wbox); create_tools (wbox); + create_color_area (wbox); if (show_indicators) create_indicator_area (wbox); + gtk_widget_show (window); toolbox_set_drag_dest (window); diff --git a/app/widgets/gtkhwrapbox.c b/app/widgets/gtkhwrapbox.c index e856dc3c7d..82788354fc 100644 --- a/app/widgets/gtkhwrapbox.c +++ b/app/widgets/gtkhwrapbox.c @@ -324,7 +324,8 @@ reverse_list_row_children (GtkWrapBox *wbox, if (GTK_WIDGET_VISIBLE (child->widget)) { get_child_requisition (wbox, child->widget, &child_requisition); - if (width + wbox->hspacing + child_requisition.width > row_width) + if (width + wbox->hspacing + child_requisition.width > row_width || + child->forced_break) break; width += wbox->hspacing + child_requisition.width; *max_child_size = MAX (*max_child_size, child_requisition.height); @@ -620,7 +621,7 @@ layout_rows (GtkWrapBox *wbox, line->children, children_per_line, line->expand); - + g_slist_free (line->children); g_free (line); line = next_line; diff --git a/app/widgets/gtkvwrapbox.c b/app/widgets/gtkvwrapbox.c index 448df995ee..0e71fa251e 100644 --- a/app/widgets/gtkvwrapbox.c +++ b/app/widgets/gtkvwrapbox.c @@ -324,7 +324,8 @@ reverse_list_col_children (GtkWrapBox *wbox, if (GTK_WIDGET_VISIBLE (child->widget)) { get_child_requisition (wbox, child->widget, &child_requisition); - if (height + wbox->vspacing + child_requisition.height > col_height) + if (height + wbox->vspacing + child_requisition.height > col_height || + child->forced_break) break; height += wbox->vspacing + child_requisition.height; *max_child_size = MAX (*max_child_size, child_requisition.width); diff --git a/app/widgets/gtkwrapbox.c b/app/widgets/gtkwrapbox.c index a5f2483f68..90da770add 100644 --- a/app/widgets/gtkwrapbox.c +++ b/app/widgets/gtkwrapbox.c @@ -42,7 +42,8 @@ enum { CHILD_ARG_HEXPAND, CHILD_ARG_HFILL, CHILD_ARG_VEXPAND, - CHILD_ARG_VFILL + CHILD_ARG_VFILL, + CHILD_ARG_FORCED_BREAK }; @@ -166,6 +167,8 @@ gtk_wrap_box_class_init (GtkWrapBoxClass *class) GTK_TYPE_BOOL, GTK_ARG_READWRITE, CHILD_ARG_VEXPAND); gtk_container_add_child_arg_type ("GtkWrapBox::vfill", GTK_TYPE_BOOL, GTK_ARG_READWRITE, CHILD_ARG_VFILL); + gtk_container_add_child_arg_type ("GtkWrapBox::forcebreak", + GTK_TYPE_BOOL, GTK_ARG_READWRITE, CHILD_ARG_FORCED_BREAK); } static void @@ -299,6 +302,10 @@ gtk_wrap_box_set_child_arg (GtkContainer *container, hexpand, hfill, vexpand, GTK_VALUE_BOOL (*arg)); break; + case CHILD_ARG_FORCED_BREAK: + gtk_wrap_box_set_child_forced_break (wbox, child, + GTK_VALUE_BOOL (*arg)); + break; default: break; } @@ -457,6 +464,7 @@ gtk_wrap_box_pack (GtkWrapBox *wbox, child_info->hfill = hfill ? TRUE : FALSE; child_info->vexpand = vexpand ? TRUE : FALSE; child_info->vfill = vfill ? TRUE : FALSE; + child_info->forced_break = FALSE; child_info->next = NULL; if (wbox->children) { @@ -565,6 +573,27 @@ gtk_wrap_box_query_child_packing (GtkWrapBox *wbox, } } +void +gtk_wrap_box_query_child_forced_break (GtkWrapBox *wbox, + GtkWidget *child, + gboolean *forced_break) +{ + GtkWrapBoxChild *child_info; + + g_return_if_fail (GTK_IS_WRAP_BOX (wbox)); + g_return_if_fail (GTK_IS_WIDGET (child)); + + for (child_info = wbox->children; child_info; child_info = child_info->next) + if (child_info->widget == child) + break; + + if (child_info) + { + if (forced_break) + *forced_break = child_info->forced_break; + } +} + void gtk_wrap_box_set_child_packing (GtkWrapBox *wbox, GtkWidget *child, @@ -601,6 +630,32 @@ gtk_wrap_box_set_child_packing (GtkWrapBox *wbox, } } +void +gtk_wrap_box_set_child_forced_break (GtkWrapBox *wbox, + GtkWidget *child, + gboolean forced_break) +{ + GtkWrapBoxChild *child_info; + + g_return_if_fail (GTK_IS_WRAP_BOX (wbox)); + g_return_if_fail (GTK_IS_WIDGET (child)); + + forced_break = forced_break != FALSE; + + for (child_info = wbox->children; child_info; child_info = child_info->next) + if (child_info->widget == child) + break; + + if (child_info && + (child_info->forced_break != forced_break)) + { + child_info->forced_break = forced_break; + + if (GTK_WIDGET_VISIBLE (child) && GTK_WIDGET_VISIBLE (wbox)) + gtk_widget_queue_resize (child); + } +} + guint* gtk_wrap_box_query_line_lengths (GtkWrapBox *wbox, guint *_n_lines) diff --git a/app/widgets/gtkwrapbox.h b/app/widgets/gtkwrapbox.h index 9d020c96d1..6b2266b83c 100644 --- a/app/widgets/gtkwrapbox.h +++ b/app/widgets/gtkwrapbox.h @@ -78,6 +78,7 @@ struct _GtkWrapBoxChild guint hfill : 1; guint vexpand : 1; guint vfill : 1; + guint forced_break : 1; GtkWrapBoxChild *next; }; @@ -114,12 +115,18 @@ void gtk_wrap_box_query_child_packing (GtkWrapBox *wbox, gboolean *hfill, gboolean *vexpand, gboolean *vfill); +void gtk_wrap_box_query_child_forced_break (GtkWrapBox *wbox, + GtkWidget *child, + gboolean *forced_break); void gtk_wrap_box_set_child_packing (GtkWrapBox *wbox, GtkWidget *child, gboolean hexpand, gboolean hfill, gboolean vexpand, gboolean vfill); +void gtk_wrap_box_set_child_forced_break (GtkWrapBox *wbox, + GtkWidget *child, + gboolean forced_break); guint* gtk_wrap_box_query_line_lengths (GtkWrapBox *wbox, guint *n_lines);