Commit 75e14498 authored by Guido Gunther's avatar Guido Gunther Committed by Guido Gunther

glade: Add a module so we can handle HdyHeaderGroup

parent b0098d60
/*
* Copyright (C) 2018 Purism SPC
*
* SPDX-License-Identifier: LGPL-2.1+
*
* Based on
* glade-gtk-size-group.c - GladeWidgetAdaptor for GtkSizeGroup
* Copyright (C) 2013 Tristan Van Berkom
*/
#include "glade-hdy-header-group.h"
#include <config.h>
#include <glib/gi18n-lib.h>
#include <gladeui/glade.h>
#define GLADE_TAG_HEADERGROUP_WIDGETS "headerbars"
#define GLADE_TAG_HEADERGROUP_WIDGET "headerbar"
static void
glade_hdy_header_group_read_widgets (GladeWidget *widget, GladeXmlNode *node)
{
GladeXmlNode *widgets_node;
GladeProperty *property;
gchar *string = NULL;
if ((widgets_node =
glade_xml_search_child (node, GLADE_TAG_HEADERGROUP_WIDGETS)) != NULL) {
GladeXmlNode *n;
for (n = glade_xml_node_get_children (widgets_node);
n; n = glade_xml_node_next (n)) {
gchar *widget_name, *tmp;
if (!glade_xml_node_verify (n, GLADE_TAG_HEADERGROUP_WIDGET))
continue;
widget_name = glade_xml_get_property_string_required
(n, GLADE_TAG_NAME, NULL);
if (string == NULL) {
string = widget_name;
} else if (widget_name != NULL) {
tmp =
g_strdup_printf ("%s%s%s", string, GPC_OBJECT_DELIMITER,
widget_name);
string = (g_free (string), tmp);
g_free (widget_name);
}
}
}
if (string) {
property = glade_widget_get_property (widget, "headerbars");
g_assert (property);
/* we must synchronize this directly after loading this project
* (i.e. lookup the actual objects after they've been parsed and
* are present).
*/
g_object_set_data_full (G_OBJECT (property),
"glade-loaded-object", string, g_free);
}
}
void
glade_hdy_header_group_read_widget (GladeWidgetAdaptor *adaptor,
GladeWidget *widget,
GladeXmlNode *node)
{
if (!(glade_xml_node_verify_silent (node, GLADE_XML_TAG_WIDGET) ||
glade_xml_node_verify_silent (node, GLADE_XML_TAG_TEMPLATE)))
return;
/* First chain up and read in all the normal properties.. */
GWA_GET_CLASS (G_TYPE_OBJECT)->read_widget (adaptor, widget, node);
glade_hdy_header_group_read_widgets (widget, node);
}
static void
glade_hdy_header_group_write_widgets (GladeWidget *widget,
GladeXmlContext *context,
GladeXmlNode *node)
{
GladeXmlNode *widgets_node, *widget_node;
GList *widgets = NULL, *list;
GladeWidget *awidget;
widgets_node = glade_xml_node_new (context, GLADE_TAG_HEADERGROUP_WIDGETS);
if (glade_widget_property_get (widget, "headerbars", &widgets)) {
for (list = widgets; list; list = list->next) {
awidget = glade_widget_get_from_gobject (list->data);
widget_node =
glade_xml_node_new (context, GLADE_TAG_HEADERGROUP_WIDGET);
glade_xml_node_append_child (widgets_node, widget_node);
glade_xml_node_set_property_string (widget_node, GLADE_TAG_NAME,
glade_widget_get_name (awidget));
}
}
if (!glade_xml_node_get_children (widgets_node))
glade_xml_node_delete (widgets_node);
else
glade_xml_node_append_child (node, widgets_node);
}
void
glade_hdy_header_group_write_widget (GladeWidgetAdaptor *adaptor,
GladeWidget *widget,
GladeXmlContext *context,
GladeXmlNode *node)
{
if (!(glade_xml_node_verify_silent (node, GLADE_XML_TAG_WIDGET) ||
glade_xml_node_verify_silent (node, GLADE_XML_TAG_TEMPLATE)))
return;
/* First chain up and read in all the normal properties.. */
GWA_GET_CLASS (G_TYPE_OBJECT)->write_widget (adaptor, widget, context, node);
glade_hdy_header_group_write_widgets (widget, context, node);
}
void
glade_hdy_header_group_set_property (GladeWidgetAdaptor *adaptor,
GObject *object,
const gchar *property_name,
const GValue *value)
{
if (!strcmp (property_name, "headerbars")) {
GSList *sg_widgets, *slist;
GList *widgets, *list;
/* remove old widgets */
if ((sg_widgets =
hdy_header_group_get_header_bars (HDY_HEADER_GROUP (object))) != NULL) {
/* copy since we are modifying an internal list */
sg_widgets = g_slist_copy (sg_widgets);
for (slist = sg_widgets; slist; slist = slist->next)
hdy_header_group_remove_header_bar (HDY_HEADER_GROUP (object),
GTK_HEADER_BAR (slist->data));
g_slist_free (sg_widgets);
}
/* add new widgets */
if ((widgets = g_value_get_boxed (value)) != NULL) {
for (list = widgets; list; list = list->next)
hdy_header_group_add_header_bar (HDY_HEADER_GROUP (object),
GTK_HEADER_BAR (list->data));
}
} else {
GWA_GET_CLASS (G_TYPE_OBJECT)->set_property (adaptor, object,
property_name, value);
}
}
/*
* Copyright (C) 2018 Purism SPC
*
* SPDX-License-Identifier: LGPL-2.1+
*/
#pragma once
#include <gladeui/glade.h>
#define HANDY_USE_UNSTABLE_API
#include <handy.h>
void glade_hdy_header_group_set_property (GladeWidgetAdaptor *adaptor,
GObject *object,
const gchar *property_name,
const GValue *value);
void glade_hdy_header_group_write_widget (GladeWidgetAdaptor *adaptor,
GladeWidget *widget,
GladeXmlContext *context,
GladeXmlNode *node);
void glade_hdy_header_group_read_widget (GladeWidgetAdaptor *adaptor,
GladeWidget *widget,
GladeXmlNode *node);
if get_option('glade_catalog')
gladeui_dep = dependency('gladeui-2.0')
module_dir = gladeui_dep.get_pkgconfig_variable('moduledir')
libglade_hdy_sources = [
'glade-hdy-header-group.c',
]
libglade_hdy_deps = [
libhandy_dep,
gladeui_dep,
]
libglade_hdy_args = []
libglade_hdy = shared_library(
'glade-handy',
libglade_hdy_sources,
c_args: libglade_hdy_args,
dependencies: libglade_hdy_deps,
include_directories: [ root_inc, src_inc ],
install: true,
install_dir: module_dir,
)
endif
......@@ -118,6 +118,7 @@ subdir('examples')
subdir('tests')
subdir('doc')
subdir('data')
subdir('glade')
run_data = configuration_data()
run_data.set('ABS_BUILDDIR', meson.current_build_dir())
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment