diff options
author | John Sullivan <sullivan@src.gnome.org> | 2000-05-19 02:24:39 +0000 |
---|---|---|
committer | John Sullivan <sullivan@src.gnome.org> | 2000-05-19 02:24:39 +0000 |
commit | 68aacef7225c9d7c888447c0a62eaeb8f3626541 (patch) | |
tree | 89b032982fdcf3cdc305b996279ef70b4461f5e8 /libnautilus-extensions/nautilus-keep-last-vertical-box.c | |
parent | 0852d9c702bd4621b865c4563ced53fe5ff3f4a3 (diff) | |
download | nautilus-68aacef7225c9d7c888447c0a62eaeb8f3626541.tar.gz |
Finished task 598 (Command button layout should account
for window height)
* libnautilus-extensions/nautilus-keep-last-vertical-box.h,
* libnautilus-extensions/nautilus-keep-last-vertical-box.c:
New files, subclass of GtkVBox that truncates contents to
fit, except last item which is always kept. (GtkVBox in the
same situation just merrily places its child widgets outside
of its allocation.)
* libnautilus-extensions/Makefile.am: Build the new files.
* src/ntl-index-panel.c:
(make_button_box): Use NautilusKeepLastVerticalBox so only
as many command buttons appear as fit, and the "Open with ..."
button always appears; also embed this box in a GtkHBox to
get horizontal sizing the way we want it.
(add_command_buttons): Add (not yet active) "Open with ..."
button.
(nautilus_index_panel_update_buttons): Throw away the
GtkHBox containing the button box instead of the button
box itself.
Diffstat (limited to 'libnautilus-extensions/nautilus-keep-last-vertical-box.c')
-rw-r--r-- | libnautilus-extensions/nautilus-keep-last-vertical-box.c | 135 |
1 files changed, 135 insertions, 0 deletions
diff --git a/libnautilus-extensions/nautilus-keep-last-vertical-box.c b/libnautilus-extensions/nautilus-keep-last-vertical-box.c new file mode 100644 index 000000000..291d2ccc2 --- /dev/null +++ b/libnautilus-extensions/nautilus-keep-last-vertical-box.c @@ -0,0 +1,135 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ + +/* nautilus-keep-last-vertical-box.c: Subclass of GtkVBox that clips off + items that don't fit, except the last one. + + Copyright (C) 2000 Eazel, Inc. + + The Gnome Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The Gnome Library 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the Gnome Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. + + Author: John Sullivan <sullivan@eazel.com>, + */ + +#include <config.h> +#include "nautilus-keep-last-vertical-box.h" + +#include "nautilus-gtk-macros.h" + +static void nautilus_keep_last_vertical_box_initialize_class (NautilusKeepLastVerticalBoxClass *class); +static void nautilus_keep_last_vertical_box_initialize (NautilusKeepLastVerticalBox *box); +static void nautilus_keep_last_vertical_box_size_allocate (GtkWidget *widget, + GtkAllocation *allocation); + +NAUTILUS_DEFINE_CLASS_BOILERPLATE (NautilusKeepLastVerticalBox, nautilus_keep_last_vertical_box, GTK_TYPE_VBOX) + +/* Standard class initialization function */ +static void +nautilus_keep_last_vertical_box_initialize_class (NautilusKeepLastVerticalBoxClass *klass) +{ + GtkWidgetClass *widget_class; + + widget_class = (GtkWidgetClass *) klass; + + widget_class->size_allocate = nautilus_keep_last_vertical_box_size_allocate; +} + +/* Standard object initialization function */ +static void +nautilus_keep_last_vertical_box_initialize (NautilusKeepLastVerticalBox *box) +{ +} + + +/* nautilus_keep_last_vertical_box_new: + * + * Create a new vertical box that clips off items from the end that don't + * fit, except the last item, which is always kept. When packing this widget + * into another vbox, use TRUE for expand and TRUE for fill or this class's + * special clipping magic won't work because this widget's allocation might + * be larger than the available space. + * + * @spacing: Vertical space between items. + * + * Return value: A new NautilusKeepLastVerticalBox + */ +GtkWidget * +nautilus_keep_last_vertical_box_new (gint spacing) +{ + NautilusKeepLastVerticalBox *box; + + box = gtk_type_new (nautilus_keep_last_vertical_box_get_type ()); + + GTK_BOX (box)->spacing = spacing; + GTK_BOX (box)->homogeneous = FALSE; + + return GTK_WIDGET (box); +} + +static void +nautilus_keep_last_vertical_box_size_allocate (GtkWidget *widget, + GtkAllocation *allocation) +{ + GtkBox *box; + GtkBoxChild *last_child, *child; + GList *children; + GtkAllocation last_child_allocation, child_allocation, tiny_allocation; + + g_return_if_fail (NAUTILUS_IS_KEEP_LAST_VERTICAL_BOX (widget)); + g_return_if_fail (allocation != NULL); + + NAUTILUS_CALL_PARENT_CLASS (GTK_WIDGET_CLASS, size_allocate, (widget, allocation)); + + box = GTK_BOX (widget); + children = g_list_last (box->children); + + if (children != NULL) { + last_child = children->data; + children = children->prev; + + last_child_allocation = last_child->widget->allocation; + + /* If last child doesn't fit vertically, prune items from the end of the + * list one at a time until it does. + */ + if (last_child_allocation.y + last_child_allocation.height > + allocation->y + allocation->height) { + + while (children != NULL) { + child = children->data; + children = children->prev; + + child_allocation = child->widget->allocation; + + /* Reposition this child so that it does not appear. + * Setting the width & height to 0 is not enough, as + * one pixel is still drawn. Must also move it outside + * visible range. + */ + tiny_allocation.x = tiny_allocation.y = -1; + tiny_allocation.height = tiny_allocation.width = 0; + gtk_widget_size_allocate (child->widget, &tiny_allocation); + + /* We're done if the special last item fits now. */ + if (child_allocation.y + last_child_allocation.height <= + allocation->y + allocation->height) { + last_child_allocation.y = child_allocation.y; + gtk_widget_size_allocate (last_child->widget, &last_child_allocation); + break; + } + } + } + } +} |