summaryrefslogtreecommitdiffstats
path: root/panels/common/list-box-helper.c
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-27 14:36:24 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-27 14:36:24 +0000
commit9b6d8e63db85c30007b463e91f91a791969fa83f (patch)
tree0899af51d73c1bf986f73ae39a03c4436083018a /panels/common/list-box-helper.c
parentInitial commit. (diff)
downloadgnome-control-center-9b6d8e63db85c30007b463e91f91a791969fa83f.tar.xz
gnome-control-center-9b6d8e63db85c30007b463e91f91a791969fa83f.zip
Adding upstream version 1:3.38.4.upstream/1%3.38.4upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'panels/common/list-box-helper.c')
-rw-r--r--panels/common/list-box-helper.c151
1 files changed, 151 insertions, 0 deletions
diff --git a/panels/common/list-box-helper.c b/panels/common/list-box-helper.c
new file mode 100644
index 0000000..77b1f65
--- /dev/null
+++ b/panels/common/list-box-helper.c
@@ -0,0 +1,151 @@
+/*
+ * 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
+
+struct _CcListBoxRow
+{
+ GtkListBoxRow parent_instance;
+};
+G_DEFINE_TYPE (CcListBoxRow, cc_list_box_row, GTK_TYPE_LIST_BOX_ROW)
+enum
+{
+ BOX_ROW_ACTIVATED,
+ LAST_BOX_ROW_SIGNAL
+};
+static guint cc_list_box_row_signals[LAST_BOX_ROW_SIGNAL] = { 0 };
+static void
+cc_list_box_row_class_init (CcListBoxRowClass *klass)
+{
+ cc_list_box_row_signals[BOX_ROW_ACTIVATED] =
+ g_signal_new ("activated",
+ CC_TYPE_LIST_BOX_ROW,
+ G_SIGNAL_RUN_LAST,
+ 0, NULL, NULL, NULL,
+ G_TYPE_NONE, 0);
+}
+static void cc_list_box_row_init (CcListBoxRow *self) {}
+
+struct _CcListBox
+{
+ GtkListBox parent_instance;
+};
+G_DEFINE_TYPE (CcListBox, cc_list_box, GTK_TYPE_LIST_BOX)
+static void
+cc_list_box_row_activated (GtkListBox *box, GtkListBoxRow *row)
+{
+ if (CC_IS_LIST_BOX_ROW (row))
+ g_signal_emit (row, cc_list_box_row_signals[BOX_ROW_ACTIVATED], 0);
+}
+static void
+cc_list_box_class_init (CcListBoxClass *klass)
+{
+ GtkListBoxClass *parent_class = GTK_LIST_BOX_CLASS (klass);
+ parent_class->row_activated = cc_list_box_row_activated;
+}
+static void cc_list_box_init (CcListBox *self) {}
+
+
+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;
+ g_autoptr(GList) children = NULL;
+ 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);
+ }
+}
+
+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));
+}