aboutsummaryrefslogtreecommitdiff
path: root/deps/uber-graph/uber-window.c
diff options
context:
space:
mode:
authorLucas de Castro Borges <lucas@gnuabordo.com.br>2024-04-22 00:35:53 -0300
committerLucas de Castro Borges <lucas@gnuabordo.com.br>2024-04-22 00:35:53 -0300
commit5f01c706267c595de92406a32e7f31ef5056c2d0 (patch)
treed1e74ef54efc41ada622900fe3e2a50dee44a237 /deps/uber-graph/uber-window.c
parent09fcc751ef158898c315ebc9299a0fa3a722d914 (diff)
New upstream version 2.0.3preupstream/2.0.3pre
Diffstat (limited to 'deps/uber-graph/uber-window.c')
-rw-r--r--deps/uber-graph/uber-window.c330
1 files changed, 330 insertions, 0 deletions
diff --git a/deps/uber-graph/uber-window.c b/deps/uber-graph/uber-window.c
new file mode 100644
index 00000000..989f3374
--- /dev/null
+++ b/deps/uber-graph/uber-window.c
@@ -0,0 +1,330 @@
+/* uber-window.c
+ *
+ * Copyright (C) 2010 Christian Hergert <chris@dronelabs.com>
+ *
+ * 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 3 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/>.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "uber-window.h"
+
+/**
+ * SECTION:uber-window.h
+ * @title: UberWindow
+ * @short_description:
+ *
+ * Section overview.
+ */
+
+
+struct _UberWindowPrivate
+{
+ gint graph_count;
+ GList *graphs;
+ GtkWidget *notebook;
+ GtkWidget *table;
+};
+G_DEFINE_TYPE_WITH_PRIVATE(UberWindow, uber_window, GTK_TYPE_WINDOW)
+
+/**
+ * uber_window_new:
+ *
+ * Creates a new instance of #UberWindow.
+ *
+ * Returns: the newly created instance of #UberWindow.
+ * Side effects: None.
+ */
+GtkWidget*
+uber_window_new (void)
+{
+ UberWindow *window;
+
+ window = g_object_new(UBER_TYPE_WINDOW, NULL);
+ return GTK_WIDGET(window);
+}
+
+/**
+ * uber_window_show_labels:
+ * @window: A #UberWindow.
+ *
+ * XXX
+ *
+ * Returns: None.
+ * Side effects: None.
+ */
+void
+uber_window_show_labels (UberWindow *window, /* IN */
+ UberGraph *graph) /* IN */
+{
+ UberWindowPrivate *priv;
+ GtkWidget *labels;
+ GtkWidget *align;
+ GList *list;
+ gboolean show;
+
+ g_return_if_fail(UBER_IS_WINDOW(window));
+ g_return_if_fail(UBER_IS_GRAPH(graph));
+
+ priv = window->priv;
+ /*
+ * Get the widgets labels.
+ */
+ labels = uber_graph_get_labels(graph);
+ /*
+ * Show/hide ticks and labels.
+ */
+ show = !!labels;
+ if (labels) {
+ align = gtk_bin_get_child(GTK_BIN(labels));
+ list = gtk_container_get_children(GTK_CONTAINER(align));
+ if (list) {
+ gtk_widget_show(labels);
+ } else {
+ gtk_widget_hide(labels);
+ show = FALSE;
+ }
+ g_list_free(list);
+ }
+ if (graph == (gpointer)g_list_last(priv->graphs)) {
+ show = TRUE;
+ }
+ uber_graph_set_show_xlabels(graph, show);
+ /*
+ * Hide labels/xlabels for other graphs.
+ */
+ for (list = priv->graphs; list && list->next; list = list->next) {
+ if (list->data != graph) {
+ uber_graph_set_show_xlabels(list->data, FALSE);
+ labels = uber_graph_get_labels(list->data);
+ if (labels) {
+ gtk_widget_hide(labels);
+ }
+ }
+ }
+ /*
+ * Ensure the last graph always has labels.
+ */
+ if (list) {
+ uber_graph_set_show_xlabels(UBER_GRAPH(list->data), TRUE);
+ }
+}
+
+/**
+ * uber_window_hide_labels:
+ * @window: A #UberWindow.
+ *
+ * XXX
+ *
+ * Returns: None.
+ * Side effects: None.
+ */
+void
+uber_window_hide_labels (UberWindow *window, /* IN */
+ UberGraph *graph) /* IN */
+{
+ UberWindowPrivate *priv;
+ GtkWidget *labels;
+ gboolean show;
+
+ g_return_if_fail(UBER_IS_WINDOW(window));
+ g_return_if_fail(UBER_IS_GRAPH(graph));
+
+ priv = window->priv;
+ labels = uber_graph_get_labels(graph);
+ if (labels) {
+ gtk_widget_hide(labels);
+ }
+ show = g_list_last(priv->graphs) == (gpointer)graph;
+ uber_graph_set_show_xlabels(graph, show);
+}
+
+static gboolean
+uber_window_graph_button_press_event (GtkWidget *widget, /* IN */
+ GdkEventButton *button, /* IN */
+ UberWindow *window) /* IN */
+{
+ GtkWidget *labels;
+
+ g_return_val_if_fail(UBER_IS_WINDOW(window), FALSE);
+ g_return_val_if_fail(UBER_IS_GRAPH(widget), FALSE);
+
+ switch (button->button) {
+ case 1: /* Left click */
+ labels = uber_graph_get_labels(UBER_GRAPH(widget));
+ if (gtk_widget_get_visible(labels)) {
+ uber_window_hide_labels(window, UBER_GRAPH(widget));
+ } else {
+ uber_window_show_labels(window, UBER_GRAPH(widget));
+ }
+ break;
+ default:
+ break;
+ }
+ return FALSE;
+}
+
+/**
+ * uber_window_add_graph:
+ * @window: A #UberWindow.
+ *
+ * XXX
+ *
+ * Returns: None.
+ * Side effects: None.
+ */
+void
+uber_window_add_graph (UberWindow *window, /* IN */
+ UberGraph *graph, /* IN */
+ const gchar *title) /* IN */
+{
+ UberWindowPrivate *priv;
+ GtkWidget *vbox;
+ GtkWidget *hbox;
+ GtkWidget *label;
+ GtkWidget *labels;
+ gchar *formatted;
+ gint left_attach;
+ gint top_attach;
+
+ g_return_if_fail(UBER_IS_WINDOW(window));
+
+ priv = window->priv;
+ /*
+ * Format title string.
+ */
+ formatted = g_markup_printf_escaped("<b>%s</b>", title);
+ /*
+ * Create container for graph.
+ */
+ vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
+ hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 3);
+ label = gtk_label_new(NULL);
+ labels = uber_graph_get_labels(graph);
+ gtk_label_set_markup(GTK_LABEL(label), formatted);
+ gtk_label_set_angle(GTK_LABEL(label), -270.);
+ gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, TRUE, 0);
+ gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET(graph), TRUE, TRUE, 0);
+ gtk_box_pack_start(GTK_BOX(hbox), vbox, TRUE, TRUE, 0);
+ if (labels) {
+ gtk_box_pack_start(GTK_BOX(vbox), labels, FALSE, TRUE, 0);
+ }
+ gtk_widget_show(label);
+ gtk_widget_show(hbox);
+ gtk_widget_show(vbox);
+ /*
+ * Append graph to table.
+ */
+ left_attach = 0;
+ top_attach = priv->graph_count; // % 4;
+ gtk_grid_attach(GTK_GRID(priv->table), hbox,
+ left_attach,
+ top_attach,
+ 1,
+ 1);
+ /*
+ * Attach signal to show ticks when label is shown.
+ */
+ g_signal_connect_after(graph,
+ "button-press-event",
+ G_CALLBACK(uber_window_graph_button_press_event),
+ window);
+ priv->graphs = g_list_append(priv->graphs, graph);
+ /*
+ * Cleanup.
+ */
+ g_free(formatted);
+ priv->graph_count++;
+}
+
+/**
+ * uber_window_finalize:
+ * @object: A #UberWindow.
+ *
+ * Finalizer for a #UberWindow instance. Frees any resources held by
+ * the instance.
+ *
+ * Returns: None.
+ * Side effects: None.
+ */
+static void
+uber_window_finalize (GObject *object) /* IN */
+{
+ UberWindowPrivate *priv;
+
+ priv = UBER_WINDOW(object)->priv;
+ g_list_free(priv->graphs);
+ G_OBJECT_CLASS(uber_window_parent_class)->finalize(object);
+}
+
+/**
+ * uber_window_class_init:
+ * @klass: A #UberWindowClass.
+ *
+ * Initializes the #UberWindowClass and prepares the vtable.
+ *
+ * Returns: None.
+ * Side effects: None.
+ */
+static void
+uber_window_class_init (UberWindowClass *klass) /* IN */
+{
+ GObjectClass *object_class;
+
+ object_class = G_OBJECT_CLASS(klass);
+ object_class->finalize = uber_window_finalize;
+}
+
+/**
+ * uber_window_init:
+ * @window: A #UberWindow.
+ *
+ * Initializes the newly created #UberWindow instance.
+ *
+ * Returns: None.
+ * Side effects: None.
+ */
+static void
+uber_window_init (UberWindow *window) /* IN */
+{
+ UberWindowPrivate *priv;
+
+ window->priv = uber_window_get_instance_private(window);
+
+ /*
+ * Initialize defaults.
+ */
+ priv = window->priv;
+ gtk_window_set_title(GTK_WINDOW(window), "Uber Graph");
+ gtk_window_set_default_size(GTK_WINDOW(window), 750, 550);
+ gtk_container_set_border_width(GTK_CONTAINER(window), 12);
+ /*
+ * Create notebook container for pages.
+ */
+ priv->notebook = gtk_notebook_new();
+ gtk_notebook_set_show_border(GTK_NOTEBOOK(priv->notebook), FALSE);
+ gtk_notebook_set_show_tabs(GTK_NOTEBOOK(priv->notebook), FALSE);
+ gtk_container_add(GTK_CONTAINER(window), priv->notebook);
+ gtk_widget_show(priv->notebook);
+ /*
+ * Create table for graphs.
+ */
+ priv->table = gtk_grid_new();
+ gtk_grid_set_row_homogeneous(GTK_GRID(priv->table), TRUE);
+ gtk_grid_set_column_homogeneous(GTK_GRID(priv->table), TRUE);
+ gtk_notebook_append_page(GTK_NOTEBOOK(priv->notebook), priv->table, NULL);
+ gtk_widget_show(priv->table);
+}