diff options
author | Přemysl Janouch <p.janouch@gmail.com> | 2011-06-13 11:10:39 +0200 |
---|---|---|
committer | Přemysl Janouch <p.janouch@gmail.com> | 2012-10-08 00:12:58 +0200 |
commit | a18b6d6f35bdb808d704a532f4e34b98733bb2e1 (patch) | |
tree | a7e607f7babf4183297c97cb072f59ffe8695478 /liblogdiag/ld-library-pane.c | |
parent | 6a24ede141b5168ba80b928941f00aa5eed871ea (diff) | |
download | logdiag-a18b6d6f35bdb808d704a532f4e34b98733bb2e1.tar.gz logdiag-a18b6d6f35bdb808d704a532f4e34b98733bb2e1.tar.xz logdiag-a18b6d6f35bdb808d704a532f4e34b98733bb2e1.zip |
Start making a replacement for LdLibraryToolbar.
The main advantages are the lack of need to create an icon
for each category there is in the library and faster workflow.
Diffstat (limited to 'liblogdiag/ld-library-pane.c')
-rw-r--r-- | liblogdiag/ld-library-pane.c | 227 |
1 files changed, 227 insertions, 0 deletions
diff --git a/liblogdiag/ld-library-pane.c b/liblogdiag/ld-library-pane.c new file mode 100644 index 0000000..6d4f84e --- /dev/null +++ b/liblogdiag/ld-library-pane.c @@ -0,0 +1,227 @@ +/* + * ld-library-pane.c + * + * This file is a part of logdiag. + * Copyright Přemysl Janouch 2011. All rights reserved. + * + * See the file LICENSE for licensing information. + * + */ + +#include "liblogdiag.h" +#include "config.h" + + +/** + * SECTION:ld-library-pane + * @short_description: A library pane + * @see_also: #LdLibrary + * + * #LdLibraryPane enables the user to drag symbols from an #LdLibrary + * onto #LdDiagramView. + */ + +/* + * LdLibraryPanePrivate: + * @library: a library object assigned as a model. + */ +struct _LdLibraryPanePrivate +{ + LdLibrary *library; +}; + +enum +{ + PROP_0, + PROP_LIBRARY +}; + +static void ld_library_pane_get_property (GObject *object, guint property_id, + GValue *value, GParamSpec *pspec); +static void ld_library_pane_set_property (GObject *object, guint property_id, + const GValue *value, GParamSpec *pspec); +static void ld_library_pane_dispose (GObject *gobject); + +static void reload_library (LdLibraryPane *self); +static void load_category_cb (gpointer data, gpointer user_data); + + +G_DEFINE_TYPE (LdLibraryPane, ld_library_pane, GTK_TYPE_VBOX); + +static void +ld_library_pane_class_init (LdLibraryPaneClass *klass) +{ + GObjectClass *object_class; + GParamSpec *pspec; + + object_class = G_OBJECT_CLASS (klass); + object_class->get_property = ld_library_pane_get_property; + object_class->set_property = ld_library_pane_set_property; + object_class->dispose = ld_library_pane_dispose; + +/** + * LdLibraryPane:library: + * + * The #LdLibrary that this toolbar retrieves symbols from. + */ + pspec = g_param_spec_object ("library", "Library", + "The library that this toolbar retrieves symbols from.", + LD_TYPE_LIBRARY, G_PARAM_READWRITE); + g_object_class_install_property (object_class, PROP_LIBRARY, pspec); + + g_type_class_add_private (klass, sizeof (LdLibraryPanePrivate)); +} + +static void +ld_library_pane_init (LdLibraryPane *self) +{ + self->priv = G_TYPE_INSTANCE_GET_PRIVATE + (self, LD_TYPE_LIBRARY_PANE, LdLibraryPanePrivate); +} + +static void +ld_library_pane_dispose (GObject *gobject) +{ + LdLibraryPane *self; + + self = LD_LIBRARY_PANE (gobject); + + ld_library_pane_set_library (self, NULL); + + /* Chain up to the parent class. */ + G_OBJECT_CLASS (ld_library_pane_parent_class)->dispose (gobject); +} + +static void +ld_library_pane_get_property (GObject *object, guint property_id, + GValue *value, GParamSpec *pspec) +{ + LdLibraryPane *self; + + self = LD_LIBRARY_PANE (object); + switch (property_id) + { + case PROP_LIBRARY: + g_value_set_object (value, ld_library_pane_get_library (self)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + } +} + +static void +ld_library_pane_set_property (GObject *object, guint property_id, + const GValue *value, GParamSpec *pspec) +{ + LdLibraryPane *self; + + self = LD_LIBRARY_PANE (object); + switch (property_id) + { + case PROP_LIBRARY: + ld_library_pane_set_library (self, + LD_LIBRARY (g_value_get_object (value))); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + } +} + + +/** + * ld_library_pane_new: + * + * Create an instance. + */ +GtkWidget * +ld_library_pane_new (void) +{ + return g_object_new (LD_TYPE_LIBRARY_PANE, NULL); +} + +/** + * ld_library_pane_set_library: + * @self: an #LdLibraryPane object. + * @library: (allow-none): the library to be assigned to the pane. + * + * Assign an #LdLibrary object to the pane. + */ +void +ld_library_pane_set_library (LdLibraryPane *self, LdLibrary *library) +{ + g_return_if_fail (LD_IS_LIBRARY_PANE (self)); + g_return_if_fail (LD_IS_LIBRARY (library) || library == NULL); + + if (self->priv->library) + { + g_signal_handlers_disconnect_by_func (self->priv->library, + reload_library, self); + g_object_unref (self->priv->library); + } + + self->priv->library = library; + + if (library) + { + g_signal_connect_data (library, "changed", + G_CALLBACK (reload_library), self, + NULL, G_CONNECT_AFTER | G_CONNECT_SWAPPED); + g_object_ref (library); + } + reload_library (self); + g_object_notify (G_OBJECT (self), "library"); +} + +/** + * ld_library_pane_get_library: + * @self: an #LdLibraryPane object. + * + * Return value: (transfer none): the #LdLibrary object + * assigned to the pane. + */ +LdLibrary * +ld_library_pane_get_library (LdLibraryPane *self) +{ + g_return_val_if_fail (LD_IS_LIBRARY_PANE (self), NULL); + return self->priv->library; +} + +static void +reload_library (LdLibraryPane *self) +{ + g_return_if_fail (LD_IS_LIBRARY_PANE (self)); + + /* Clear the toolbar first, if there was already something in it. */ + gtk_container_foreach (GTK_CONTAINER (self), + (GtkCallback) gtk_widget_destroy, NULL); + + if (self->priv->library) + { + GSList *categories; + + categories = (GSList *) ld_library_get_categories (self->priv->library); + g_slist_foreach (categories, load_category_cb, self); + } +} + +static void +load_category_cb (gpointer data, gpointer user_data) +{ + LdLibraryPane *self; + LdSymbolCategory *cat; + GtkExpander *expander; + const gchar *human_name; + + g_return_if_fail (LD_IS_LIBRARY_PANE (user_data)); + g_return_if_fail (LD_IS_SYMBOL_CATEGORY (data)); + + self = user_data; + cat = data; + + /* TODO: Set a child for the expander, recurse into category children. */ + human_name = ld_symbol_category_get_human_name (cat); + expander = GTK_EXPANDER (gtk_expander_new (human_name)); + + gtk_box_pack_start (GTK_BOX (self), GTK_WIDGET (expander), FALSE, FALSE, 0); +} + |