/* * glade-gtk-fixed-layout.c - GladeWidgetAdaptor for GtkFixed and GtkLayout * * Copyright (C) 2013 Tristan Van Berkom * * Authors: * Tristan Van Berkom * * This library is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include "glade-layout-editor.h" GladeEditable * glade_gtk_layout_create_editable (GladeWidgetAdaptor * adaptor, GladeEditorPageType type) { if (type == GLADE_PAGE_GENERAL) { return (GladeEditable *)glade_layout_editor_new (); } return GWA_GET_CLASS (GTK_TYPE_CONTAINER)->create_editable (adaptor, type); } static void glade_gtk_fixed_layout_sync_size_requests (GtkWidget * widget) { GList *children, *l; if ((children = gtk_container_get_children (GTK_CONTAINER (widget))) != NULL) { for (l = children; l; l = l->next) { GtkWidget *child = l->data; GladeWidget *gchild = glade_widget_get_from_gobject (child); gint width = -1, height = -1; if (!gchild) continue; glade_widget_property_get (gchild, "width-request", &width); glade_widget_property_get (gchild, "height-request", &height); gtk_widget_set_size_request (child, width, height); } g_list_free (children); } } static cairo_pattern_t * get_fixed_layout_pattern (void) { static cairo_pattern_t *static_pattern = NULL; if (!static_pattern) { gchar *path = g_build_filename (glade_app_get_pixmaps_dir (), "fixed-bg.png", NULL); cairo_surface_t *surface = cairo_image_surface_create_from_png (path); if (surface) { static_pattern = cairo_pattern_create_for_surface (surface); cairo_pattern_set_extend (static_pattern, CAIRO_EXTEND_REPEAT); } else g_warning ("Failed to create surface for %s\n", path); g_free (path); } return static_pattern; } static void glade_gtk_fixed_layout_draw (GtkWidget *widget, cairo_t *cr) { GtkAllocation allocation; gtk_widget_get_allocation (widget, &allocation); cairo_save (cr); cairo_rectangle (cr, 0, 0, allocation.width, allocation.height); cairo_set_source (cr, get_fixed_layout_pattern ()); cairo_fill (cr); cairo_restore (cr); } void glade_gtk_fixed_layout_post_create (GladeWidgetAdaptor * adaptor, GObject * object, GladeCreateReason reason) { /* Set a minimun size so you can actually see it if you added to a box */ gtk_widget_set_size_request (GTK_WIDGET (object), 32, 32); gtk_widget_set_has_window (GTK_WIDGET (object), TRUE); /* Sync up size request at project load time */ if (reason == GLADE_CREATE_LOAD) g_signal_connect_after (object, "realize", G_CALLBACK (glade_gtk_fixed_layout_sync_size_requests), NULL); g_signal_connect (object, "draw", G_CALLBACK (glade_gtk_fixed_layout_draw), NULL); } void glade_gtk_fixed_layout_add_child (GladeWidgetAdaptor * adaptor, GObject * object, GObject * child) { g_return_if_fail (GTK_IS_CONTAINER (object)); g_return_if_fail (GTK_IS_WIDGET (child)); gtk_container_add (GTK_CONTAINER (object), GTK_WIDGET (child)); } void glade_gtk_fixed_layout_remove_child (GladeWidgetAdaptor * adaptor, GObject * object, GObject * child) { g_return_if_fail (GTK_IS_CONTAINER (object)); g_return_if_fail (GTK_IS_WIDGET (child)); gtk_container_remove (GTK_CONTAINER (object), GTK_WIDGET (child)); }