|
Packit |
1e8aac |
/*
|
|
Packit |
1e8aac |
* glade-gtk-grid.c - GladeWidgetAdaptor for GtkGrid widget
|
|
Packit |
1e8aac |
*
|
|
Packit |
1e8aac |
* Copyright (C) 2011 Openismus GmbH
|
|
Packit |
1e8aac |
*
|
|
Packit |
1e8aac |
* Authors:
|
|
Packit |
1e8aac |
* Tristan Van Berkom <tristanvb@openismus.com>
|
|
Packit |
1e8aac |
*
|
|
Packit |
1e8aac |
* This library is free software; you can redistribute it and/or modify it
|
|
Packit |
1e8aac |
* under the terms of the GNU Lesser General Public License as
|
|
Packit |
1e8aac |
* published by the Free Software Foundation; either version 2.1 of
|
|
Packit |
1e8aac |
* the License, or (at your option) any later version.
|
|
Packit |
1e8aac |
*
|
|
Packit |
1e8aac |
* This library is distributed in the hope that it will be useful, but
|
|
Packit |
1e8aac |
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit |
1e8aac |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Packit |
1e8aac |
* Lesser General Public License for more details.
|
|
Packit |
1e8aac |
*
|
|
Packit |
1e8aac |
* You should have received a copy of the GNU Lesser General Public
|
|
Packit |
1e8aac |
* License along with this program; if not, write to the Free Software
|
|
Packit |
1e8aac |
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
#include <config.h>
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
#include <gtk/gtk.h>
|
|
Packit |
1e8aac |
#include <glib/gi18n-lib.h>
|
|
Packit |
1e8aac |
#include <string.h>
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
#include "glade-fixed.h"
|
|
Packit |
1e8aac |
#include "glade-grid-editor.h"
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
typedef struct
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
gint left_attach;
|
|
Packit |
1e8aac |
gint top_attach;
|
|
Packit |
1e8aac |
gint width;
|
|
Packit |
1e8aac |
gint height;
|
|
Packit |
1e8aac |
} GladeGridAttachments;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
typedef enum {
|
|
Packit |
1e8aac |
GROUP_ACTION_INSERT_ROW,
|
|
Packit |
1e8aac |
GROUP_ACTION_INSERT_COLUMN,
|
|
Packit |
1e8aac |
GROUP_ACTION_REMOVE_COLUMN,
|
|
Packit |
1e8aac |
GROUP_ACTION_REMOVE_ROW
|
|
Packit |
1e8aac |
} GroupAction;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static gboolean glade_gtk_grid_configure_begin (GladeFixed *fixed,
|
|
Packit |
1e8aac |
GladeWidget *child,
|
|
Packit |
1e8aac |
GtkWidget *grid);
|
|
Packit |
1e8aac |
static gboolean glade_gtk_grid_configure_end (GladeFixed *fixed,
|
|
Packit |
1e8aac |
GladeWidget *child,
|
|
Packit |
1e8aac |
GtkWidget *grid);
|
|
Packit |
1e8aac |
static gboolean glade_gtk_grid_configure_child (GladeFixed *fixed,
|
|
Packit |
1e8aac |
GladeWidget *child,
|
|
Packit |
1e8aac |
GdkRectangle *rect,
|
|
Packit |
1e8aac |
GtkWidget *grid);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
GladeEditable *
|
|
Packit |
1e8aac |
glade_gtk_grid_create_editable (GladeWidgetAdaptor * adaptor,
|
|
Packit |
1e8aac |
GladeEditorPageType type)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
if (type == GLADE_PAGE_GENERAL)
|
|
Packit |
1e8aac |
return (GladeEditable *) glade_grid_editor_new ();
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
return GWA_GET_CLASS (GTK_TYPE_CONTAINER)->create_editable (adaptor, type);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
glade_gtk_grid_get_child_attachments (GtkWidget *grid,
|
|
Packit |
1e8aac |
GtkWidget *child,
|
|
Packit |
1e8aac |
GladeGridAttachments *grid_child)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
gtk_container_child_get (GTK_CONTAINER (grid), child,
|
|
Packit |
1e8aac |
"left-attach", &grid_child->left_attach,
|
|
Packit |
1e8aac |
"width", &grid_child->width,
|
|
Packit |
1e8aac |
"top-attach", &grid_child->top_attach,
|
|
Packit |
1e8aac |
"height", &grid_child->height,
|
|
Packit |
1e8aac |
NULL);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static gboolean
|
|
Packit |
1e8aac |
glade_gtk_grid_has_child (GtkGrid *grid,
|
|
Packit |
1e8aac |
GList *children,
|
|
Packit |
1e8aac |
guint left_attach,
|
|
Packit |
1e8aac |
guint top_attach)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
gboolean ret = FALSE;
|
|
Packit |
1e8aac |
GList *list;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
for (list = children; list && list->data; list = list->next)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeGridAttachments attach;
|
|
Packit |
1e8aac |
GtkWidget *widget = list->data;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
glade_gtk_grid_get_child_attachments (GTK_WIDGET (grid), widget, &attach);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (left_attach >= attach.left_attach && left_attach < attach.left_attach + attach.width &&
|
|
Packit |
1e8aac |
top_attach >= attach.top_attach && top_attach < attach.top_attach + attach.height)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
ret = TRUE;
|
|
Packit |
1e8aac |
break;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
return ret;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
glade_gtk_grid_refresh_placeholders (GtkGrid *grid,
|
|
Packit |
1e8aac |
gboolean load_finished)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeWidget *widget;
|
|
Packit |
1e8aac |
GladeProject *project;
|
|
Packit |
1e8aac |
GtkContainer *container;
|
|
Packit |
1e8aac |
GList *list, *children;
|
|
Packit |
1e8aac |
guint n_columns, n_rows;
|
|
Packit |
1e8aac |
gint i, j;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
widget = glade_widget_get_from_gobject (grid);
|
|
Packit |
1e8aac |
project = glade_widget_get_project (widget);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* Wait for project to finish loading */
|
|
Packit |
1e8aac |
if ((project && glade_project_is_loading (project)) && !load_finished)
|
|
Packit |
1e8aac |
return;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
glade_widget_property_get (widget, "n-columns", &n_columns);
|
|
Packit |
1e8aac |
glade_widget_property_get (widget, "n-rows", &n_rows);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
container = GTK_CONTAINER (grid);
|
|
Packit |
1e8aac |
children = gtk_container_get_children (container);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
for (list = children; list && list->data; list = list->next)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GtkWidget *child = list->data;
|
|
Packit |
1e8aac |
if (GLADE_IS_PLACEHOLDER (child))
|
|
Packit |
1e8aac |
gtk_container_remove (container, child);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
g_list_free (children);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
children = gtk_container_get_children (container);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
for (i = 0; i < n_columns; i++)
|
|
Packit |
1e8aac |
for (j = 0; j < n_rows; j++)
|
|
Packit |
1e8aac |
if (glade_gtk_grid_has_child (grid, children, i, j) == FALSE)
|
|
Packit |
1e8aac |
gtk_grid_attach (grid, glade_placeholder_new (), i, j, 1, 1);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (gtk_widget_get_realized (GTK_WIDGET (grid)))
|
|
Packit |
1e8aac |
gtk_container_check_resize (container);
|
|
Packit |
1e8aac |
g_list_free (children);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
glade_gtk_grid_parse_finished (GladeProject *project, GObject *container)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeWidget *gwidget = glade_widget_get_from_gobject (container);
|
|
Packit |
1e8aac |
GladeGridAttachments attach;
|
|
Packit |
1e8aac |
GList *list, *children;
|
|
Packit |
1e8aac |
gint row = 0, column = 0, n_row = 0, n_column = 0;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
children = gtk_container_get_children (GTK_CONTAINER (container));
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
for (list = children; list; list = list->next)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GtkWidget *widget = list->data;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (GLADE_IS_PLACEHOLDER (widget)) continue;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
glade_gtk_grid_get_child_attachments (GTK_WIDGET (container), widget, &attach);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
n_row = attach.top_attach + attach.height;
|
|
Packit |
1e8aac |
n_column = attach.left_attach + attach.width;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (row < n_row) row = n_row;
|
|
Packit |
1e8aac |
if (column < n_column) column = n_column;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (column) glade_widget_property_set (gwidget, "n-columns", column);
|
|
Packit |
1e8aac |
if (row) glade_widget_property_set (gwidget, "n-rows", row);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_list_free (children);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* Refresh placeholders only once after the project is finished parsing */
|
|
Packit |
1e8aac |
glade_gtk_grid_refresh_placeholders (GTK_GRID (container), TRUE);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
void
|
|
Packit |
1e8aac |
glade_gtk_grid_post_create (GladeWidgetAdaptor *adaptor,
|
|
Packit |
1e8aac |
GObject *container,
|
|
Packit |
1e8aac |
GladeCreateReason reason)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeWidget *gwidget = glade_widget_get_from_gobject (container);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_signal_connect (G_OBJECT (gwidget), "configure-child",
|
|
Packit |
1e8aac |
G_CALLBACK (glade_gtk_grid_configure_child), container);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_signal_connect (G_OBJECT (gwidget), "configure-begin",
|
|
Packit |
1e8aac |
G_CALLBACK (glade_gtk_grid_configure_begin), container);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_signal_connect (G_OBJECT (gwidget), "configure-end",
|
|
Packit |
1e8aac |
G_CALLBACK (glade_gtk_grid_configure_end), container);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (reason == GLADE_CREATE_LOAD)
|
|
Packit |
1e8aac |
g_signal_connect (glade_widget_get_project (gwidget), "parse-finished",
|
|
Packit |
1e8aac |
G_CALLBACK (glade_gtk_grid_parse_finished),
|
|
Packit |
1e8aac |
container);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
void
|
|
Packit |
1e8aac |
glade_gtk_grid_destroy_object (GladeWidgetAdaptor *adaptor,
|
|
Packit |
1e8aac |
GObject *object)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeWidget *widget = glade_widget_get_from_gobject (object);
|
|
Packit |
1e8aac |
GladeProject *project = glade_widget_get_project (widget);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (project)
|
|
Packit |
1e8aac |
g_signal_handlers_disconnect_by_func (project, glade_gtk_grid_parse_finished, object);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static gboolean
|
|
Packit |
1e8aac |
glade_gtk_grid_widget_exceeds_bounds (GtkGrid *grid, gint n_rows, gint n_cols)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GList *list, *children;
|
|
Packit |
1e8aac |
gboolean ret = FALSE;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
children = gtk_container_get_children (GTK_CONTAINER (grid));
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
for (list = children; list && list->data; list = g_list_next (list))
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeGridAttachments attach;
|
|
Packit |
1e8aac |
GtkWidget *widget = list->data;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (GLADE_IS_PLACEHOLDER (widget)) continue;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
glade_gtk_grid_get_child_attachments (GTK_WIDGET (grid), widget, &attach);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (attach.left_attach + attach.width > n_cols ||
|
|
Packit |
1e8aac |
attach.top_attach + attach.height > n_rows)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
ret = TRUE;
|
|
Packit |
1e8aac |
break;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_list_free (children);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
return ret;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
gtk_grid_children_callback (GtkWidget *widget, gpointer client_data)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GList **children;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
children = (GList **) client_data;
|
|
Packit |
1e8aac |
*children = g_list_prepend (*children, widget);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
GList *
|
|
Packit |
1e8aac |
glade_gtk_grid_get_children (GladeWidgetAdaptor *adaptor,
|
|
Packit |
1e8aac |
GtkContainer *container)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GList *children = NULL;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_return_val_if_fail (GTK_IS_GRID (container), NULL);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gtk_container_forall (container, gtk_grid_children_callback, &children);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* GtkGrid has the children list already reversed */
|
|
Packit |
1e8aac |
return children;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
void
|
|
Packit |
1e8aac |
glade_gtk_grid_add_child (GladeWidgetAdaptor *adaptor,
|
|
Packit |
1e8aac |
GObject *object,
|
|
Packit |
1e8aac |
GObject *child)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
g_return_if_fail (GTK_IS_GRID (object));
|
|
Packit |
1e8aac |
g_return_if_fail (GTK_IS_WIDGET (child));
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gtk_container_add (GTK_CONTAINER (object), GTK_WIDGET (child));
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
glade_gtk_grid_refresh_placeholders (GTK_GRID (object), FALSE);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
void
|
|
Packit |
1e8aac |
glade_gtk_grid_remove_child (GladeWidgetAdaptor *adaptor,
|
|
Packit |
1e8aac |
GObject *object,
|
|
Packit |
1e8aac |
GObject *child)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
g_return_if_fail (GTK_IS_GRID (object));
|
|
Packit |
1e8aac |
g_return_if_fail (GTK_IS_WIDGET (child));
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gtk_container_remove (GTK_CONTAINER (object), GTK_WIDGET (child));
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
glade_gtk_grid_refresh_placeholders (GTK_GRID (object), FALSE);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
void
|
|
Packit |
1e8aac |
glade_gtk_grid_replace_child (GladeWidgetAdaptor *adaptor,
|
|
Packit |
1e8aac |
GObject *container,
|
|
Packit |
1e8aac |
GObject *current,
|
|
Packit |
1e8aac |
GObject *new_widget)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
g_return_if_fail (GTK_IS_GRID (container));
|
|
Packit |
1e8aac |
g_return_if_fail (GTK_IS_WIDGET (current));
|
|
Packit |
1e8aac |
g_return_if_fail (GTK_IS_WIDGET (new_widget));
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* Chain Up */
|
|
Packit |
1e8aac |
GWA_GET_CLASS (GTK_TYPE_CONTAINER)->replace_child (adaptor,
|
|
Packit |
1e8aac |
container,
|
|
Packit |
1e8aac |
current,
|
|
Packit |
1e8aac |
new_widget);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* If we are replacing a GladeWidget, we must refresh placeholders
|
|
Packit |
1e8aac |
* because the widget may have spanned multiple rows/columns, we must
|
|
Packit |
1e8aac |
* not do so in the case we are pasting multiple widgets into a grid,
|
|
Packit |
1e8aac |
* where destroying placeholders results in default packing properties
|
|
Packit |
1e8aac |
* (since the remaining placeholder templates no longer exist, only the
|
|
Packit |
1e8aac |
* first pasted widget would have proper packing properties).
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
if (!GLADE_IS_PLACEHOLDER (new_widget))
|
|
Packit |
1e8aac |
glade_gtk_grid_refresh_placeholders (GTK_GRID (container), FALSE);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
glade_gtk_grid_set_n_common (GObject *object,
|
|
Packit |
1e8aac |
const GValue *value,
|
|
Packit |
1e8aac |
gboolean for_rows)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeWidget *widget;
|
|
Packit |
1e8aac |
GtkGrid *grid;
|
|
Packit |
1e8aac |
guint new_size, n_columns, n_rows;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
grid = GTK_GRID (object);
|
|
Packit |
1e8aac |
widget = glade_widget_get_from_gobject (GTK_WIDGET (grid));
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
glade_widget_property_get (widget, "n-columns", &n_columns);
|
|
Packit |
1e8aac |
glade_widget_property_get (widget, "n-rows", &n_rows);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
new_size = g_value_get_uint (value);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (new_size < 1)
|
|
Packit |
1e8aac |
return;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (glade_gtk_grid_widget_exceeds_bounds
|
|
Packit |
1e8aac |
(grid, for_rows ? new_size : n_rows, for_rows ? n_columns : new_size))
|
|
Packit |
1e8aac |
/* Refuse to shrink if it means orphaning widgets */
|
|
Packit |
1e8aac |
return;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* Fill grid with placeholders */
|
|
Packit |
1e8aac |
glade_gtk_grid_refresh_placeholders (grid, FALSE);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
void
|
|
Packit |
1e8aac |
glade_gtk_grid_set_property (GladeWidgetAdaptor *adaptor,
|
|
Packit |
1e8aac |
GObject *object,
|
|
Packit |
1e8aac |
const gchar *id,
|
|
Packit |
1e8aac |
const GValue *value)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
if (!strcmp (id, "n-rows"))
|
|
Packit |
1e8aac |
glade_gtk_grid_set_n_common (object, value, TRUE);
|
|
Packit |
1e8aac |
else if (!strcmp (id, "n-columns"))
|
|
Packit |
1e8aac |
glade_gtk_grid_set_n_common (object, value, FALSE);
|
|
Packit |
1e8aac |
else
|
|
Packit |
1e8aac |
GWA_GET_CLASS (GTK_TYPE_CONTAINER)->set_property (adaptor, object,
|
|
Packit |
1e8aac |
id, value);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static gboolean
|
|
Packit |
1e8aac |
glade_gtk_grid_verify_n_common (GObject *object,
|
|
Packit |
1e8aac |
const GValue *value,
|
|
Packit |
1e8aac |
gboolean for_rows)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GtkGrid *grid = GTK_GRID (object);
|
|
Packit |
1e8aac |
GladeWidget *widget;
|
|
Packit |
1e8aac |
guint n_columns, n_rows, new_size = g_value_get_uint (value);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
widget = glade_widget_get_from_gobject (GTK_WIDGET (grid));
|
|
Packit |
1e8aac |
glade_widget_property_get (widget, "n-columns", &n_columns);
|
|
Packit |
1e8aac |
glade_widget_property_get (widget, "n-rows", &n_rows);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (glade_gtk_grid_widget_exceeds_bounds
|
|
Packit |
1e8aac |
(grid, for_rows ? new_size : n_rows, for_rows ? n_columns : new_size))
|
|
Packit |
1e8aac |
/* Refuse to shrink if it means orphaning widgets */
|
|
Packit |
1e8aac |
return FALSE;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
return TRUE;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gboolean
|
|
Packit |
1e8aac |
glade_gtk_grid_verify_property (GladeWidgetAdaptor *adaptor,
|
|
Packit |
1e8aac |
GObject *object,
|
|
Packit |
1e8aac |
const gchar *id,
|
|
Packit |
1e8aac |
const GValue *value)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
if (!strcmp (id, "n-rows"))
|
|
Packit |
1e8aac |
return glade_gtk_grid_verify_n_common (object, value, TRUE);
|
|
Packit |
1e8aac |
else if (!strcmp (id, "n-columns"))
|
|
Packit |
1e8aac |
return glade_gtk_grid_verify_n_common (object, value, FALSE);
|
|
Packit |
1e8aac |
else if (GWA_GET_CLASS (GTK_TYPE_CONTAINER)->verify_property)
|
|
Packit |
1e8aac |
GWA_GET_CLASS (GTK_TYPE_CONTAINER)->verify_property (adaptor, object,
|
|
Packit |
1e8aac |
id, value);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
return TRUE;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
void
|
|
Packit |
1e8aac |
glade_gtk_grid_set_child_property (GladeWidgetAdaptor *adaptor,
|
|
Packit |
1e8aac |
GObject *container,
|
|
Packit |
1e8aac |
GObject *child,
|
|
Packit |
1e8aac |
const gchar *property_name,
|
|
Packit |
1e8aac |
GValue *value)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
g_return_if_fail (GTK_IS_GRID (container));
|
|
Packit |
1e8aac |
g_return_if_fail (GTK_IS_WIDGET (child));
|
|
Packit |
1e8aac |
g_return_if_fail (property_name != NULL && value != NULL);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
GWA_GET_CLASS
|
|
Packit |
1e8aac |
(GTK_TYPE_CONTAINER)->child_set_property (adaptor,
|
|
Packit |
1e8aac |
container, child,
|
|
Packit |
1e8aac |
property_name, value);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (strcmp (property_name, "left-attach") == 0 ||
|
|
Packit |
1e8aac |
strcmp (property_name, "top-attach") == 0 ||
|
|
Packit |
1e8aac |
strcmp (property_name, "width") == 0 ||
|
|
Packit |
1e8aac |
strcmp (property_name, "height") == 0)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
/* Refresh placeholders */
|
|
Packit |
1e8aac |
glade_gtk_grid_refresh_placeholders (GTK_GRID (container), FALSE);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static gboolean
|
|
Packit |
1e8aac |
glade_gtk_grid_verify_attach_common (GObject *object,
|
|
Packit |
1e8aac |
GValue *value,
|
|
Packit |
1e8aac |
const gchar *prop,
|
|
Packit |
1e8aac |
const gchar *parent_prop)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeWidget *widget, *parent;
|
|
Packit |
1e8aac |
guint parent_val;
|
|
Packit |
1e8aac |
gint val, prop_val;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
widget = glade_widget_get_from_gobject (object);
|
|
Packit |
1e8aac |
g_return_val_if_fail (GLADE_IS_WIDGET (widget), TRUE);
|
|
Packit |
1e8aac |
parent = glade_widget_get_parent (widget);
|
|
Packit |
1e8aac |
g_return_val_if_fail (GLADE_IS_WIDGET (parent), TRUE);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
val = g_value_get_int (value);
|
|
Packit |
1e8aac |
glade_widget_property_get (widget, prop, &prop_val);
|
|
Packit |
1e8aac |
glade_widget_property_get (parent, parent_prop, &parent_val);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (val < 0 || (val+prop_val) > parent_val)
|
|
Packit |
1e8aac |
return FALSE;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
return TRUE;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gboolean
|
|
Packit |
1e8aac |
glade_gtk_grid_child_verify_property (GladeWidgetAdaptor *adaptor,
|
|
Packit |
1e8aac |
GObject *container,
|
|
Packit |
1e8aac |
GObject *child,
|
|
Packit |
1e8aac |
const gchar *id,
|
|
Packit |
1e8aac |
GValue *value)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
if (!strcmp (id, "left-attach"))
|
|
Packit |
1e8aac |
return glade_gtk_grid_verify_attach_common (child, value, "width", "n-columns");
|
|
Packit |
1e8aac |
else if (!strcmp (id, "width"))
|
|
Packit |
1e8aac |
return glade_gtk_grid_verify_attach_common (child, value, "left-attach", "n-columns");
|
|
Packit |
1e8aac |
else if (!strcmp (id, "top-attach"))
|
|
Packit |
1e8aac |
return glade_gtk_grid_verify_attach_common (child, value, "height", "n-rows");
|
|
Packit |
1e8aac |
else if (!strcmp (id, "height"))
|
|
Packit |
1e8aac |
return glade_gtk_grid_verify_attach_common (child, value, "top-attach", "n-rows");
|
|
Packit |
1e8aac |
else if (GWA_GET_CLASS (GTK_TYPE_CONTAINER)->child_verify_property)
|
|
Packit |
1e8aac |
GWA_GET_CLASS
|
|
Packit |
1e8aac |
(GTK_TYPE_CONTAINER)->child_verify_property (adaptor,
|
|
Packit |
1e8aac |
container, child,
|
|
Packit |
1e8aac |
id, value);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
return TRUE;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
glade_gtk_grid_child_insert_remove_action (GladeWidgetAdaptor *adaptor,
|
|
Packit |
1e8aac |
GObject *container,
|
|
Packit |
1e8aac |
GObject *object,
|
|
Packit |
1e8aac |
GroupAction group_action,
|
|
Packit |
1e8aac |
const gchar *n_row_col,
|
|
Packit |
1e8aac |
const gchar *attach1, /* should be smaller (top/left) attachment */
|
|
Packit |
1e8aac |
const gchar *attach2, /* should be larger (bot/right) attachment */
|
|
Packit |
1e8aac |
gboolean remove,
|
|
Packit |
1e8aac |
gboolean after)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeWidget *parent;
|
|
Packit |
1e8aac |
GList *children, *l;
|
|
Packit |
1e8aac |
gint child_pos, size, offset;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gtk_container_child_get (GTK_CONTAINER (container),
|
|
Packit |
1e8aac |
GTK_WIDGET (object),
|
|
Packit |
1e8aac |
attach1, &child_pos, NULL);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
parent = glade_widget_get_from_gobject (container);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
switch (group_action)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
case GROUP_ACTION_INSERT_ROW:
|
|
Packit |
1e8aac |
glade_command_push_group (_("Insert Row on %s"), glade_widget_get_name (parent));
|
|
Packit |
1e8aac |
break;
|
|
Packit |
1e8aac |
case GROUP_ACTION_INSERT_COLUMN:
|
|
Packit |
1e8aac |
glade_command_push_group (_("Insert Column on %s"), glade_widget_get_name (parent));
|
|
Packit |
1e8aac |
break;
|
|
Packit |
1e8aac |
case GROUP_ACTION_REMOVE_COLUMN:
|
|
Packit |
1e8aac |
glade_command_push_group (_("Remove Column on %s"), glade_widget_get_name (parent));
|
|
Packit |
1e8aac |
break;
|
|
Packit |
1e8aac |
case GROUP_ACTION_REMOVE_ROW:
|
|
Packit |
1e8aac |
glade_command_push_group (_("Remove Row on %s"), glade_widget_get_name (parent));
|
|
Packit |
1e8aac |
break;
|
|
Packit |
1e8aac |
default:
|
|
Packit |
1e8aac |
g_assert_not_reached ();
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
children = glade_widget_adaptor_get_children (adaptor, container);
|
|
Packit |
1e8aac |
/* Make sure widgets does not get destroyed */
|
|
Packit |
1e8aac |
g_list_foreach (children, (GFunc) g_object_ref, NULL);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
glade_widget_property_get (parent, n_row_col, &size);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (remove)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GList *del = NULL;
|
|
Packit |
1e8aac |
/* Remove children first */
|
|
Packit |
1e8aac |
for (l = children; l; l = g_list_next (l))
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeWidget *gchild = glade_widget_get_from_gobject (l->data);
|
|
Packit |
1e8aac |
gint pos1, pos2;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* Skip placeholders */
|
|
Packit |
1e8aac |
if (gchild == NULL)
|
|
Packit |
1e8aac |
continue;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
glade_widget_pack_property_get (gchild, attach1, &pos1);
|
|
Packit |
1e8aac |
glade_widget_pack_property_get (gchild, attach2, &pos2);
|
|
Packit |
1e8aac |
pos2 += pos1;
|
|
Packit |
1e8aac |
if ((pos1 + 1 == pos2) && ((after ? pos2 : pos1) == child_pos))
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
del = g_list_prepend (del, gchild);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
if (del)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
glade_command_delete (del);
|
|
Packit |
1e8aac |
g_list_free (del);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
offset = -1;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
else
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
/* Expand the grid */
|
|
Packit |
1e8aac |
glade_command_set_property (glade_widget_get_property (parent, n_row_col),
|
|
Packit |
1e8aac |
size + 1);
|
|
Packit |
1e8aac |
offset = 1;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* Reorder children */
|
|
Packit |
1e8aac |
for (l = children; l; l = g_list_next (l))
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeWidget *gchild = glade_widget_get_from_gobject (l->data);
|
|
Packit |
1e8aac |
gint pos;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* Skip placeholders */
|
|
Packit |
1e8aac |
if (gchild == NULL)
|
|
Packit |
1e8aac |
continue;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* if removing, do top/left before bot/right */
|
|
Packit |
1e8aac |
if (remove)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
/* adjust top-left attachment */
|
|
Packit |
1e8aac |
glade_widget_pack_property_get (gchild, attach1, &pos;;
|
|
Packit |
1e8aac |
if (pos > child_pos || (after && pos == child_pos))
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
glade_command_set_property (glade_widget_get_pack_property
|
|
Packit |
1e8aac |
(gchild, attach1), pos + offset);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
/* if inserting, do bot/right before top/left */
|
|
Packit |
1e8aac |
else
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
/* adjust top-left attachment */
|
|
Packit |
1e8aac |
glade_widget_pack_property_get (gchild, attach1, &pos;;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if ((after && pos > child_pos) || (!after && pos >= child_pos))
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
glade_command_set_property (glade_widget_get_pack_property
|
|
Packit |
1e8aac |
(gchild, attach1), pos + offset);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (remove)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
/* Shrink the grid */
|
|
Packit |
1e8aac |
glade_command_set_property (glade_widget_get_property (parent, n_row_col),
|
|
Packit |
1e8aac |
size - 1);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_list_foreach (children, (GFunc) g_object_unref, NULL);
|
|
Packit |
1e8aac |
g_list_free (children);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
glade_command_pop_group ();
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
void
|
|
Packit |
1e8aac |
glade_gtk_grid_child_action_activate (GladeWidgetAdaptor *adaptor,
|
|
Packit |
1e8aac |
GObject *container,
|
|
Packit |
1e8aac |
GObject *object,
|
|
Packit |
1e8aac |
const gchar *action_path)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
if (strcmp (action_path, "insert_row/after") == 0)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
glade_gtk_grid_child_insert_remove_action (adaptor, container, object,
|
|
Packit |
1e8aac |
GROUP_ACTION_INSERT_ROW,
|
|
Packit |
1e8aac |
"n-rows", "top-attach",
|
|
Packit |
1e8aac |
"height", FALSE, TRUE);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
else if (strcmp (action_path, "insert_row/before") == 0)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
glade_gtk_grid_child_insert_remove_action (adaptor, container, object,
|
|
Packit |
1e8aac |
GROUP_ACTION_INSERT_ROW,
|
|
Packit |
1e8aac |
"n-rows", "top-attach",
|
|
Packit |
1e8aac |
"height",
|
|
Packit |
1e8aac |
FALSE, FALSE);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
else if (strcmp (action_path, "insert_column/after") == 0)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
glade_gtk_grid_child_insert_remove_action (adaptor, container, object,
|
|
Packit |
1e8aac |
GROUP_ACTION_INSERT_COLUMN,
|
|
Packit |
1e8aac |
"n-columns", "left-attach",
|
|
Packit |
1e8aac |
"width", FALSE, TRUE);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
else if (strcmp (action_path, "insert_column/before") == 0)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
glade_gtk_grid_child_insert_remove_action (adaptor, container, object,
|
|
Packit |
1e8aac |
GROUP_ACTION_INSERT_COLUMN,
|
|
Packit |
1e8aac |
"n-columns", "left-attach",
|
|
Packit |
1e8aac |
"width", FALSE, FALSE);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
else if (strcmp (action_path, "remove_column") == 0)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
glade_gtk_grid_child_insert_remove_action (adaptor, container, object,
|
|
Packit |
1e8aac |
GROUP_ACTION_REMOVE_COLUMN,
|
|
Packit |
1e8aac |
"n-columns", "left-attach",
|
|
Packit |
1e8aac |
"width", TRUE, FALSE);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
else if (strcmp (action_path, "remove_row") == 0)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
glade_gtk_grid_child_insert_remove_action (adaptor, container, object,
|
|
Packit |
1e8aac |
GROUP_ACTION_REMOVE_ROW,
|
|
Packit |
1e8aac |
"n-rows", "top-attach",
|
|
Packit |
1e8aac |
"height", TRUE, FALSE);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
else
|
|
Packit |
1e8aac |
GWA_GET_CLASS (GTK_TYPE_CONTAINER)->child_action_activate (adaptor,
|
|
Packit |
1e8aac |
container,
|
|
Packit |
1e8aac |
object,
|
|
Packit |
1e8aac |
action_path);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/***************************************************************
|
|
Packit |
1e8aac |
* GladeFixed drag/resize *
|
|
Packit |
1e8aac |
***************************************************************/
|
|
Packit |
1e8aac |
typedef struct
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeWidget *widget;
|
|
Packit |
1e8aac |
gint left_attach;
|
|
Packit |
1e8aac |
gint top_attach;
|
|
Packit |
1e8aac |
gint width;
|
|
Packit |
1e8aac |
gint height;
|
|
Packit |
1e8aac |
} GladeGridChild;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
typedef enum
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
DIR_UP,
|
|
Packit |
1e8aac |
DIR_DOWN,
|
|
Packit |
1e8aac |
DIR_LEFT,
|
|
Packit |
1e8aac |
DIR_RIGHT
|
|
Packit |
1e8aac |
} GladeGridDir;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static GladeGridChild grid_edit = { 0, };
|
|
Packit |
1e8aac |
static GladeGridChild grid_cur_attach = { 0, };
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* Takes a point (x or y depending on 'row') relative to
|
|
Packit |
1e8aac |
* grid, and returns the row or column in which the point
|
|
Packit |
1e8aac |
* was found.
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
static gint
|
|
Packit |
1e8aac |
glade_gtk_grid_get_row_col_from_point (GtkGrid *grid, gboolean row, gint point)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeGridAttachments attach;
|
|
Packit |
1e8aac |
GtkAllocation allocation;
|
|
Packit |
1e8aac |
GList *list, *children;
|
|
Packit |
1e8aac |
gint span, trans_point, size, base, end;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
children = gtk_container_get_children (GTK_CONTAINER (grid));
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
for (list = children; list; list = list->next)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GtkWidget *widget = list->data;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
glade_gtk_grid_get_child_attachments (GTK_WIDGET (grid), widget, &attach);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (row)
|
|
Packit |
1e8aac |
gtk_widget_translate_coordinates (GTK_WIDGET (grid), widget, 0, point, NULL, &trans_point);
|
|
Packit |
1e8aac |
else
|
|
Packit |
1e8aac |
gtk_widget_translate_coordinates (GTK_WIDGET (grid), widget, point, 0, &trans_point, NULL);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gtk_widget_get_allocation (widget, &allocation);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* Find any widget in our row/column
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
end = row ? allocation.height : allocation.width;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (trans_point >= 0 &&
|
|
Packit |
1e8aac |
/* should be trans_point < end ... test FIXME ! */
|
|
Packit |
1e8aac |
trans_point < end)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
base = row ? attach.top_attach : attach.left_attach;
|
|
Packit |
1e8aac |
size = row ? allocation.height : allocation.width;
|
|
Packit |
1e8aac |
span = row ? attach.height : attach.width;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
return base + (trans_point * span / size);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_list_free (children);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
return -1;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static gboolean
|
|
Packit |
1e8aac |
glade_gtk_grid_point_crosses_threshold (GtkGrid *grid,
|
|
Packit |
1e8aac |
gboolean row,
|
|
Packit |
1e8aac |
gint num,
|
|
Packit |
1e8aac |
GladeGridDir dir,
|
|
Packit |
1e8aac |
gint point)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeGridAttachments attach;
|
|
Packit |
1e8aac |
GtkAllocation allocation;
|
|
Packit |
1e8aac |
GList *list, *children;
|
|
Packit |
1e8aac |
gint span, trans_point, size, rowcol_size, base;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
children = gtk_container_get_children (GTK_CONTAINER (grid));
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
for (list = children; list; list = list->next)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GtkWidget *widget = list->data;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
glade_gtk_grid_get_child_attachments (GTK_WIDGET (grid), widget, &attach);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* Find any widget in our row/column
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
if ((row && num >= attach.top_attach && num < attach.top_attach + attach.height) ||
|
|
Packit |
1e8aac |
(!row && num >= attach.left_attach && num < attach.left_attach + attach.width))
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (row)
|
|
Packit |
1e8aac |
gtk_widget_translate_coordinates (GTK_WIDGET (grid), widget, 0, point, NULL, &trans_point);
|
|
Packit |
1e8aac |
else
|
|
Packit |
1e8aac |
gtk_widget_translate_coordinates (GTK_WIDGET (grid), widget, point, 0, &trans_point, NULL);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
span = row ? attach.height : attach.width;
|
|
Packit |
1e8aac |
gtk_widget_get_allocation (widget, &allocation);
|
|
Packit |
1e8aac |
size = row ? allocation.height : allocation.width;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
base = row ? attach.top_attach : attach.left_attach;
|
|
Packit |
1e8aac |
rowcol_size = size / span;
|
|
Packit |
1e8aac |
trans_point -= (num - base) * rowcol_size;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
#if 0
|
|
Packit |
1e8aac |
g_print ("dir: %s, widget size: %d, rowcol size: %d, "
|
|
Packit |
1e8aac |
"requested rowcol: %d, widget base rowcol: %d, trim: %d, "
|
|
Packit |
1e8aac |
"widget point: %d, thresh: %d\n",
|
|
Packit |
1e8aac |
dir == DIR_UP ? "up" : dir == DIR_DOWN ? "down" :
|
|
Packit |
1e8aac |
dir == DIR_LEFT ? "left" : "right",
|
|
Packit |
1e8aac |
size, rowcol_size, num, base, (num - base) * rowcol_size,
|
|
Packit |
1e8aac |
trans_point,
|
|
Packit |
1e8aac |
dir == DIR_UP || dir == DIR_LEFT ?
|
|
Packit |
1e8aac |
(rowcol_size / 2) : (rowcol_size / 2));
|
|
Packit |
1e8aac |
#endif
|
|
Packit |
1e8aac |
switch (dir)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
case DIR_UP:
|
|
Packit |
1e8aac |
case DIR_LEFT:
|
|
Packit |
1e8aac |
return trans_point <= (rowcol_size / 2);
|
|
Packit |
1e8aac |
case DIR_DOWN:
|
|
Packit |
1e8aac |
case DIR_RIGHT:
|
|
Packit |
1e8aac |
return trans_point >= (rowcol_size / 2);
|
|
Packit |
1e8aac |
default:
|
|
Packit |
1e8aac |
break;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_list_free (children);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
return FALSE;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static gboolean
|
|
Packit |
1e8aac |
glade_gtk_grid_get_attachments (GladeFixed *fixed,
|
|
Packit |
1e8aac |
GtkGrid *grid,
|
|
Packit |
1e8aac |
GdkRectangle *rect,
|
|
Packit |
1e8aac |
GladeGridChild *configure)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeWidget *widget = GLADE_WIDGET (fixed);
|
|
Packit |
1e8aac |
gint center_x, center_y, row, column;
|
|
Packit |
1e8aac |
guint n_columns, n_rows;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
center_x = rect->x + (rect->width / 2);
|
|
Packit |
1e8aac |
center_y = rect->y + (rect->height / 2);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
column = glade_gtk_grid_get_row_col_from_point (grid, FALSE, center_x);
|
|
Packit |
1e8aac |
row = glade_gtk_grid_get_row_col_from_point (grid, TRUE, center_y);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* its a start, now try to grow when the rect extents
|
|
Packit |
1e8aac |
* reach at least half way into the next row/column
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
configure->left_attach = column;
|
|
Packit |
1e8aac |
configure->width = 1;
|
|
Packit |
1e8aac |
configure->top_attach = row;
|
|
Packit |
1e8aac |
configure->height = 1;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
glade_widget_property_get (widget, "n-columns", &n_columns);
|
|
Packit |
1e8aac |
glade_widget_property_get (widget, "n-rows", &n_rows);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (column >= 0 && row >= 0)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
/* Check and expand left
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
while (configure->left_attach > 0)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
if (rect->x < fixed->child_x_origin &&
|
|
Packit |
1e8aac |
fixed->operation != GLADE_CURSOR_DRAG &&
|
|
Packit |
1e8aac |
GLADE_FIXED_CURSOR_LEFT (fixed->operation) == FALSE)
|
|
Packit |
1e8aac |
break;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (glade_gtk_grid_point_crosses_threshold
|
|
Packit |
1e8aac |
(grid, FALSE, configure->left_attach - 1,
|
|
Packit |
1e8aac |
DIR_LEFT, rect->x) == FALSE)
|
|
Packit |
1e8aac |
break;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
configure->left_attach--;
|
|
Packit |
1e8aac |
configure->width++;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* Check and expand right
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
while (configure->left_attach + configure->width < n_columns)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
if (rect->x + rect->width >
|
|
Packit |
1e8aac |
fixed->child_x_origin + fixed->child_width_origin &&
|
|
Packit |
1e8aac |
fixed->operation != GLADE_CURSOR_DRAG &&
|
|
Packit |
1e8aac |
GLADE_FIXED_CURSOR_RIGHT (fixed->operation) == FALSE)
|
|
Packit |
1e8aac |
break;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (glade_gtk_grid_point_crosses_threshold
|
|
Packit |
1e8aac |
(grid, FALSE, configure->left_attach + configure->width,
|
|
Packit |
1e8aac |
DIR_RIGHT, rect->x + rect->width) == FALSE)
|
|
Packit |
1e8aac |
break;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
configure->width++;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* Check and expand top
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
while (configure->top_attach > 0)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
if (rect->y < fixed->child_y_origin &&
|
|
Packit |
1e8aac |
fixed->operation != GLADE_CURSOR_DRAG &&
|
|
Packit |
1e8aac |
GLADE_FIXED_CURSOR_TOP (fixed->operation) == FALSE)
|
|
Packit |
1e8aac |
break;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (glade_gtk_grid_point_crosses_threshold
|
|
Packit |
1e8aac |
(grid, TRUE, configure->top_attach - 1,
|
|
Packit |
1e8aac |
DIR_UP, rect->y) == FALSE)
|
|
Packit |
1e8aac |
break;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
configure->top_attach--;
|
|
Packit |
1e8aac |
configure->height++;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* Check and expand bottom
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
while (configure->top_attach + configure->height < n_rows)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
if (rect->y + rect->height >
|
|
Packit |
1e8aac |
fixed->child_y_origin + fixed->child_height_origin &&
|
|
Packit |
1e8aac |
fixed->operation != GLADE_CURSOR_DRAG &&
|
|
Packit |
1e8aac |
GLADE_FIXED_CURSOR_BOTTOM (fixed->operation) == FALSE)
|
|
Packit |
1e8aac |
break;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (glade_gtk_grid_point_crosses_threshold
|
|
Packit |
1e8aac |
(grid, TRUE, configure->top_attach + configure->height,
|
|
Packit |
1e8aac |
DIR_DOWN, rect->y + rect->height) == FALSE)
|
|
Packit |
1e8aac |
break;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
configure->height++;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
return column >= 0 && row >= 0;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static gboolean
|
|
Packit |
1e8aac |
glade_gtk_grid_configure_child (GladeFixed *fixed,
|
|
Packit |
1e8aac |
GladeWidget *child,
|
|
Packit |
1e8aac |
GdkRectangle *rect,
|
|
Packit |
1e8aac |
GtkWidget *grid)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeGridChild configure = { child, };
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* Sometimes we are unable to find a widget in the appropriate column,
|
|
Packit |
1e8aac |
* usually because a placeholder hasnt had its size allocation yet.
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
if (glade_gtk_grid_get_attachments (fixed, GTK_GRID (grid), rect, &configure))
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
if (memcmp (&configure, &grid_cur_attach, sizeof (GladeGridChild)) != 0)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
glade_property_push_superuser ();
|
|
Packit |
1e8aac |
glade_widget_pack_property_set (child, "left-attach",
|
|
Packit |
1e8aac |
configure.left_attach);
|
|
Packit |
1e8aac |
glade_widget_pack_property_set (child, "width",
|
|
Packit |
1e8aac |
configure.width);
|
|
Packit |
1e8aac |
glade_widget_pack_property_set (child, "top-attach",
|
|
Packit |
1e8aac |
configure.top_attach);
|
|
Packit |
1e8aac |
glade_widget_pack_property_set (child, "height",
|
|
Packit |
1e8aac |
configure.height);
|
|
Packit |
1e8aac |
glade_property_pop_superuser ();
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
memcpy (&grid_cur_attach, &configure, sizeof (GladeGridChild));
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
return TRUE;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static gboolean
|
|
Packit |
1e8aac |
glade_gtk_grid_configure_begin (GladeFixed *fixed,
|
|
Packit |
1e8aac |
GladeWidget *child,
|
|
Packit |
1e8aac |
GtkWidget *grid)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
grid_edit.widget = child;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
glade_widget_pack_property_get (child, "left-attach", &grid_edit.left_attach);
|
|
Packit |
1e8aac |
glade_widget_pack_property_get (child, "width", &grid_edit.width);
|
|
Packit |
1e8aac |
glade_widget_pack_property_get (child, "top-attach", &grid_edit.top_attach);
|
|
Packit |
1e8aac |
glade_widget_pack_property_get (child, "height", &grid_edit.height);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
memcpy (&grid_cur_attach, &grid_edit, sizeof (GladeGridChild));
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
return TRUE;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static gboolean
|
|
Packit |
1e8aac |
glade_gtk_grid_configure_end (GladeFixed *fixed,
|
|
Packit |
1e8aac |
GladeWidget *child,
|
|
Packit |
1e8aac |
GtkWidget *grid)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeGridChild new_child = { child, };
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
glade_widget_pack_property_get (child, "left-attach", &new_child.left_attach);
|
|
Packit |
1e8aac |
glade_widget_pack_property_get (child, "width", &new_child.width);
|
|
Packit |
1e8aac |
glade_widget_pack_property_get (child, "top-attach", &new_child.top_attach);
|
|
Packit |
1e8aac |
glade_widget_pack_property_get (child, "height", &new_child.height);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* Compare the meaningfull part of the current edit. */
|
|
Packit |
1e8aac |
if (memcmp (&new_child, &grid_edit, sizeof (GladeGridChild)) != 0)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GValue left_attach_value = { 0, };
|
|
Packit |
1e8aac |
GValue width_attach_value = { 0, };
|
|
Packit |
1e8aac |
GValue top_attach_value = { 0, };
|
|
Packit |
1e8aac |
GValue height_attach_value = { 0, };
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
GValue new_left_attach_value = { 0, };
|
|
Packit |
1e8aac |
GValue new_width_attach_value = { 0, };
|
|
Packit |
1e8aac |
GValue new_top_attach_value = { 0, };
|
|
Packit |
1e8aac |
GValue new_height_attach_value = { 0, };
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
GladeProperty *left_attach_prop, *width_attach_prop,
|
|
Packit |
1e8aac |
*top_attach_prop, *height_attach_prop;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
left_attach_prop = glade_widget_get_pack_property (child, "left-attach");
|
|
Packit |
1e8aac |
width_attach_prop = glade_widget_get_pack_property (child, "width");
|
|
Packit |
1e8aac |
top_attach_prop = glade_widget_get_pack_property (child, "top-attach");
|
|
Packit |
1e8aac |
height_attach_prop = glade_widget_get_pack_property (child, "height");
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_return_val_if_fail (GLADE_IS_PROPERTY (left_attach_prop), FALSE);
|
|
Packit |
1e8aac |
g_return_val_if_fail (GLADE_IS_PROPERTY (width_attach_prop), FALSE);
|
|
Packit |
1e8aac |
g_return_val_if_fail (GLADE_IS_PROPERTY (top_attach_prop), FALSE);
|
|
Packit |
1e8aac |
g_return_val_if_fail (GLADE_IS_PROPERTY (height_attach_prop), FALSE);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
glade_property_get_value (left_attach_prop, &new_left_attach_value);
|
|
Packit |
1e8aac |
glade_property_get_value (width_attach_prop, &new_width_attach_value);
|
|
Packit |
1e8aac |
glade_property_get_value (top_attach_prop, &new_top_attach_value);
|
|
Packit |
1e8aac |
glade_property_get_value (height_attach_prop, &new_height_attach_value);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_value_init (&left_attach_value, G_TYPE_INT);
|
|
Packit |
1e8aac |
g_value_init (&width_attach_value, G_TYPE_INT);
|
|
Packit |
1e8aac |
g_value_init (&top_attach_value, G_TYPE_INT);
|
|
Packit |
1e8aac |
g_value_init (&height_attach_value, G_TYPE_INT);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_value_set_int (&left_attach_value, grid_edit.left_attach);
|
|
Packit |
1e8aac |
g_value_set_int (&width_attach_value, grid_edit.width);
|
|
Packit |
1e8aac |
g_value_set_int (&top_attach_value, grid_edit.top_attach);
|
|
Packit |
1e8aac |
g_value_set_int (&height_attach_value, grid_edit.height);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
glade_command_push_group (_("Placing %s inside %s"),
|
|
Packit |
1e8aac |
glade_widget_get_name (child),
|
|
Packit |
1e8aac |
glade_widget_get_name (GLADE_WIDGET (fixed)));
|
|
Packit |
1e8aac |
glade_command_set_properties
|
|
Packit |
1e8aac |
(left_attach_prop, &left_attach_value, &new_left_attach_value,
|
|
Packit |
1e8aac |
width_attach_prop, &width_attach_value, &new_width_attach_value,
|
|
Packit |
1e8aac |
top_attach_prop, &top_attach_value, &new_top_attach_value,
|
|
Packit |
1e8aac |
height_attach_prop, &height_attach_value, &new_height_attach_value,
|
|
Packit |
1e8aac |
NULL);
|
|
Packit |
1e8aac |
glade_command_pop_group ();
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_value_unset (&left_attach_value);
|
|
Packit |
1e8aac |
g_value_unset (&width_attach_value);
|
|
Packit |
1e8aac |
g_value_unset (&top_attach_value);
|
|
Packit |
1e8aac |
g_value_unset (&height_attach_value);
|
|
Packit |
1e8aac |
g_value_unset (&new_left_attach_value);
|
|
Packit |
1e8aac |
g_value_unset (&new_width_attach_value);
|
|
Packit |
1e8aac |
g_value_unset (&new_top_attach_value);
|
|
Packit |
1e8aac |
g_value_unset (&new_height_attach_value);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
return TRUE;
|
|
Packit |
1e8aac |
}
|