summaryrefslogtreecommitdiff
path: root/libnautilus-extensions/nautilus-keep-last-vertical-box.c
diff options
context:
space:
mode:
authorJohn Sullivan <sullivan@src.gnome.org>2000-05-19 02:24:39 +0000
committerJohn Sullivan <sullivan@src.gnome.org>2000-05-19 02:24:39 +0000
commit68aacef7225c9d7c888447c0a62eaeb8f3626541 (patch)
tree89b032982fdcf3cdc305b996279ef70b4461f5e8 /libnautilus-extensions/nautilus-keep-last-vertical-box.c
parent0852d9c702bd4621b865c4563ced53fe5ff3f4a3 (diff)
downloadnautilus-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.c135
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;
+ }
+ }
+ }
+ }
+}