From ad8f6a1b17a145f6465a3ffbd4e5b71ff1de2fff Mon Sep 17 00:00:00 2001 From: Patrick McDermott Date: Mon, 23 Oct 2017 04:43:09 -0400 Subject: mq_notebook_insert_*(): New functions --- diff --git a/src/notebook.c b/src/notebook.c index 01b4666..cc9a17e 100644 --- a/src/notebook.c +++ b/src/notebook.c @@ -41,6 +41,7 @@ struct _MqNotebook { GtkNotebook parent_instance; MqWindow *window; MqTabTree *tree; + MqTabTree *found_node; }; enum { @@ -132,3 +133,77 @@ mq_notebook_new(MqWindow *window) "window", window, NULL); } + +static gboolean +find_node_compare(MqTree *node, va_list ap) +{ + MqNotebook *notebook; + MqTabPage *page; + + notebook = va_arg(ap, MqNotebook *); + page = va_arg(ap, MqTabPage *); + + if (MQ_TAB_TREE(node)->page == page) { + notebook->found_node = MQ_TAB_TREE(node); + return MQ_TREE_STOP; + } else { + return MQ_TREE_CONTINUE; + } +} + +static void +find_node(MqNotebook *notebook, MqTabPage *page) +{ + notebook->found_node = NULL; + mq_tree_foreach(MQ_TREE(notebook->tree), find_node_compare, notebook, + page); + g_assert(notebook->found_node); +} + +static void +insert_page(MqNotebook *notebook, MqTabTree *node, const gchar *uri) +{ + node->page = mq_tab_page_new(notebook->window, uri); + node->label = mq_tab_page_get_label(node->page); + + gtk_notebook_insert_page(GTK_NOTEBOOK(notebook), + GTK_WIDGET(node->page), GTK_WIDGET(node->label), + MQ_TREE(node)->position - 1); + gtk_notebook_set_tab_reorderable(GTK_NOTEBOOK(notebook), + GTK_WIDGET(node->page), + TRUE); + gtk_notebook_set_tab_detachable(GTK_NOTEBOOK(notebook), + GTK_WIDGET(node->page), TRUE); + gtk_widget_show_all(GTK_WIDGET(node->page)); + gtk_widget_show_all(GTK_WIDGET(node->label)); +} + +void +mq_notebook_insert_sibling(MqNotebook *notebook, const gchar *uri, + MqTabPage *sibling) +{ + MqTabTree *node; + + find_node(notebook, sibling); + node = MQ_TAB_TREE(mq_tree_insert_sibling_allocated( + MQ_TREE(g_new0(MqTabTree, 1)), + MQ_TREE(notebook->found_node), + NULL)); + + insert_page(notebook, node, uri); +} + +void +mq_notebook_insert_child(MqNotebook *notebook, const gchar *uri, + MqTabPage *child) +{ + MqTabTree *node; + + find_node(notebook, child); + node = MQ_TAB_TREE(mq_tree_insert_child_allocated( + MQ_TREE(g_new0(MqTabTree, 1)), + MQ_TREE(notebook->found_node), + NULL)); + + insert_page(notebook, node, uri); +} diff --git a/src/notebook.h b/src/notebook.h index a1071ec..970fb5a 100644 --- a/src/notebook.h +++ b/src/notebook.h @@ -53,6 +53,14 @@ mq_notebook_get_type(void); GtkWidget * mq_notebook_new(MqWindow *window); +void +mq_notebook_insert_sibling(MqNotebook *notebook, const gchar *uri, + MqTabPage *sibling); + +void +mq_notebook_insert_child(MqNotebook *notebook, const gchar *uri, + MqTabPage *child); + G_END_DECLS #endif /* MQ_NOTEBOOK_H */ -- cgit v0.9.1