gnome-control-center/shell/list-box-helper.c
Timm Bäder fe77d8020a list-box-helper: Unset row header if unneeded
The usual implementation of the header func adds headers to all rows but
the first one. If the first row then gets removed, the second row
becomes the first and keeps its header, since nothing ever removes it.
Fix this by also removing the header if we are looking at the first row.

https://bugzilla.gnome.org/show_bug.cgi?id=743441
2015-01-28 12:15:10 +01:00

110 lines
3.4 KiB
C

/*
* Copyright (C) 2014 Red Hat, 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, see <http://www.gnu.org/licenses/>.
*
*/
#include "list-box-helper.h"
#define MAX_ROWS_VISIBLE 5
void
cc_list_box_update_header_func (GtkListBoxRow *row,
GtkListBoxRow *before,
gpointer user_data)
{
GtkWidget *current;
if (before == NULL)
{
gtk_list_box_row_set_header (row, NULL);
return;
}
current = gtk_list_box_row_get_header (row);
if (current == NULL)
{
current = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
gtk_widget_show (current);
gtk_list_box_row_set_header (row, current);
}
}
void
cc_list_box_adjust_scrolling (GtkListBox *listbox)
{
GtkWidget *scrolled_window;
GList *children;
guint n_rows, num_max_rows;
scrolled_window = g_object_get_data (G_OBJECT (listbox), "cc-scrolling-scrolled-window");
if (!scrolled_window)
return;
children = gtk_container_get_children (GTK_CONTAINER (listbox));
n_rows = g_list_length (children);
num_max_rows = GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (listbox), "cc-max-rows-visible"));
if (n_rows >= num_max_rows)
{
gint total_row_height = 0;
GList *l;
guint i;
for (l = children, i = 0; l != NULL && i < num_max_rows; l = l->next, i++) {
gint row_height;
gtk_widget_get_preferred_height (GTK_WIDGET (l->data), &row_height, NULL);
total_row_height += row_height;
}
gtk_scrolled_window_set_min_content_height (GTK_SCROLLED_WINDOW (scrolled_window), total_row_height);
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
}
else
{
gtk_scrolled_window_set_min_content_height (GTK_SCROLLED_WINDOW (scrolled_window), -1);
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
GTK_POLICY_NEVER, GTK_POLICY_NEVER);
}
g_list_free (children);
}
void
cc_list_box_setup_scrolling (GtkListBox *listbox,
guint num_max_rows)
{
GtkWidget *parent;
GtkWidget *scrolled_window;
parent = gtk_widget_get_parent (GTK_WIDGET (listbox));
scrolled_window = gtk_scrolled_window_new (NULL, NULL);
gtk_widget_show (scrolled_window);
g_object_ref (listbox);
gtk_container_remove (GTK_CONTAINER (parent), GTK_WIDGET (listbox));
gtk_container_add (GTK_CONTAINER (scrolled_window), GTK_WIDGET (listbox));
g_object_unref (listbox);
gtk_container_add (GTK_CONTAINER (parent), scrolled_window);
if (num_max_rows == 0)
num_max_rows = MAX_ROWS_VISIBLE;
g_object_set_data (G_OBJECT (listbox), "cc-scrolling-scrolled-window", scrolled_window);
g_object_set_data (G_OBJECT (listbox), "cc-max-rows-visible", GUINT_TO_POINTER (num_max_rows));
}