|
Packit |
1e8aac |
/*
|
|
Packit |
1e8aac |
* glade-design-view.c
|
|
Packit |
1e8aac |
*
|
|
Packit |
1e8aac |
* Copyright (C) 2006 Vincent Geddes
|
|
Packit |
1e8aac |
* 2011-2016 Juan Pablo Ugarte
|
|
Packit |
1e8aac |
*
|
|
Packit |
1e8aac |
* Authors:
|
|
Packit |
1e8aac |
* Vincent Geddes <vincent.geddes@gmail.com>
|
|
Packit |
1e8aac |
* Juan Pablo Ugarte <juanpablougarte@gmail.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 |
|
|
Packit |
1e8aac |
/**
|
|
Packit |
1e8aac |
* SECTION:glade-design-view
|
|
Packit |
1e8aac |
* @Title: GladeDesignView
|
|
Packit |
1e8aac |
* @Short_Description: A widget to embed the workspace.
|
|
Packit |
1e8aac |
*
|
|
Packit |
1e8aac |
* Use this widget to embed toplevel widgets in a given #GladeProject.
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
#include "config.h"
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
#include "glade.h"
|
|
Packit |
1e8aac |
#include "glade-dnd.h"
|
|
Packit |
1e8aac |
#include "glade-utils.h"
|
|
Packit |
1e8aac |
#include "glade-design-view.h"
|
|
Packit |
1e8aac |
#include "glade-design-layout.h"
|
|
Packit |
1e8aac |
#include "glade-design-private.h"
|
|
Packit |
1e8aac |
#include "glade-path.h"
|
|
Packit |
1e8aac |
#include "glade-adaptor-chooser-widget.h"
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
#include <glib.h>
|
|
Packit |
1e8aac |
#include <glib/gi18n.h>
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
#define GLADE_DESIGN_VIEW_KEY "GLADE_DESIGN_VIEW_KEY"
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
enum
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
PROP_0,
|
|
Packit |
1e8aac |
PROP_PROJECT
|
|
Packit |
1e8aac |
};
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
struct _GladeDesignViewPrivate
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeProject *project;
|
|
Packit |
1e8aac |
GtkWidget *scrolled_window; /* Main scrolled window */
|
|
Packit |
1e8aac |
GtkWidget *layout_box; /* Box to pack a GladeDesignLayout for each toplevel in project */
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
_GladeDrag *drag_target;
|
|
Packit |
1e8aac |
GObject *drag_data;
|
|
Packit |
1e8aac |
gboolean drag_highlight;
|
|
Packit |
1e8aac |
};
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static GtkVBoxClass *parent_class = NULL;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void glade_design_view_drag_init (_GladeDragInterface *iface);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
G_DEFINE_TYPE_WITH_CODE (GladeDesignView, glade_design_view, GTK_TYPE_BOX,
|
|
Packit |
1e8aac |
G_ADD_PRIVATE (GladeDesignView)
|
|
Packit |
1e8aac |
G_IMPLEMENT_INTERFACE (GLADE_TYPE_DRAG,
|
|
Packit |
1e8aac |
glade_design_view_drag_init))
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
glade_design_layout_scroll (GladeDesignView *view, gint x, gint y, gint w, gint h)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
gdouble vadj_val, hadj_val, vpage_end, hpage_end;
|
|
Packit |
1e8aac |
GtkAdjustment *vadj, *hadj;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
vadj = gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (view->priv->scrolled_window));
|
|
Packit |
1e8aac |
hadj = gtk_scrolled_window_get_hadjustment (GTK_SCROLLED_WINDOW (view->priv->scrolled_window));
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
vadj_val = gtk_adjustment_get_value (vadj);
|
|
Packit |
1e8aac |
hadj_val = gtk_adjustment_get_value (hadj);
|
|
Packit |
1e8aac |
vpage_end = gtk_adjustment_get_page_size (vadj) + vadj_val;
|
|
Packit |
1e8aac |
hpage_end = gtk_adjustment_get_page_size (hadj) + hadj_val;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* TODO: we could set this value in increments in a timeout callback
|
|
Packit |
1e8aac |
* to make it look like its scrolling instead of jumping.
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
if (y < vadj_val || y > vpage_end || (y + h) > vpage_end)
|
|
Packit |
1e8aac |
gtk_adjustment_set_value (vadj, y);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (x < hadj_val || x > hpage_end || (x + w) > hpage_end)
|
|
Packit |
1e8aac |
gtk_adjustment_set_value (hadj, x);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
on_layout_size_allocate (GtkWidget *widget, GtkAllocation *alloc, GladeDesignView *view)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
glade_design_layout_scroll (view, alloc->x, alloc->y, alloc->width, alloc->height);
|
|
Packit |
1e8aac |
g_signal_handlers_disconnect_by_func (widget, on_layout_size_allocate, view);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
glade_design_view_update_state (GList *objects, GtkStateFlags state)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GList *l;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
for (l = objects; l && l->data; l = g_list_next (l))
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GtkWidget *view, *widget = l->data;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (GTK_IS_WIDGET (widget) &&
|
|
Packit |
1e8aac |
gtk_widget_get_visible (widget) &&
|
|
Packit |
1e8aac |
(view = gtk_widget_get_ancestor (widget, GLADE_TYPE_DESIGN_LAYOUT)))
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
gtk_widget_set_state_flags (view, state, TRUE);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
glade_design_view_selection_changed (GladeProject *project, GladeDesignView *view)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GtkWidget *layout;
|
|
Packit |
1e8aac |
GList *selection;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
glade_design_view_update_state (glade_project_toplevels (project),
|
|
Packit |
1e8aac |
GTK_STATE_FLAG_NORMAL);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (!(selection = glade_project_selection_get (project)))
|
|
Packit |
1e8aac |
return;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
glade_design_view_update_state (selection, GTK_STATE_FLAG_SELECTED);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* Check if its only one widget selected and scroll viewport to show toplevel */
|
|
Packit |
1e8aac |
if (g_list_next (selection) == NULL &&
|
|
Packit |
1e8aac |
GTK_IS_WIDGET (selection->data) &&
|
|
Packit |
1e8aac |
(layout = gtk_widget_get_ancestor (selection->data, GLADE_TYPE_DESIGN_LAYOUT)))
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GtkAllocation alloc;
|
|
Packit |
1e8aac |
gtk_widget_get_allocation (layout, &alloc);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (alloc.x < 0)
|
|
Packit |
1e8aac |
g_signal_connect (layout, "size-allocate", G_CALLBACK (on_layout_size_allocate), view);
|
|
Packit |
1e8aac |
else
|
|
Packit |
1e8aac |
glade_design_layout_scroll (view, alloc.x, alloc.y, alloc.width, alloc.height);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
glade_design_view_add_toplevel (GladeDesignView *view, GladeWidget *widget)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GtkWidget *layout;
|
|
Packit |
1e8aac |
GList *toplevels;
|
|
Packit |
1e8aac |
GObject *object;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (glade_widget_get_parent (widget) ||
|
|
Packit |
1e8aac |
(object = glade_widget_get_object (widget)) == NULL ||
|
|
Packit |
1e8aac |
!GTK_IS_WIDGET (object) ||
|
|
Packit |
1e8aac |
gtk_widget_get_parent (GTK_WIDGET (object)))
|
|
Packit |
1e8aac |
return;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* Create a GladeDesignLayout and add the toplevel widget to the view */
|
|
Packit |
1e8aac |
layout = _glade_design_layout_new (view);
|
|
Packit |
1e8aac |
gtk_widget_set_halign (layout, GTK_ALIGN_START);
|
|
Packit |
1e8aac |
gtk_box_pack_start (GTK_BOX (view->priv->layout_box), layout, FALSE, FALSE, 0);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if ((toplevels = glade_project_toplevels (view->priv->project)))
|
|
Packit |
1e8aac |
gtk_box_reorder_child (GTK_BOX (view->priv->layout_box), layout,
|
|
Packit |
1e8aac |
g_list_index (toplevels, GTK_WIDGET (object)));
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gtk_container_add (GTK_CONTAINER (layout), GTK_WIDGET (object));
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gtk_widget_show (GTK_WIDGET (object));
|
|
Packit |
1e8aac |
gtk_widget_show (layout);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
glade_design_view_remove_toplevel (GladeDesignView *view, GladeWidget *widget)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GtkWidget *layout;
|
|
Packit |
1e8aac |
GObject *object;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (glade_widget_get_parent (widget) ||
|
|
Packit |
1e8aac |
(object = glade_widget_get_object (widget)) == NULL ||
|
|
Packit |
1e8aac |
!GTK_IS_WIDGET (object)) return;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* Remove toplevel widget from the view */
|
|
Packit |
1e8aac |
if ((layout = gtk_widget_get_parent (GTK_WIDGET (object))) &&
|
|
Packit |
1e8aac |
gtk_widget_is_ancestor (layout, GTK_WIDGET (view)))
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
gtk_container_remove (GTK_CONTAINER (layout), GTK_WIDGET (object));
|
|
Packit |
1e8aac |
gtk_container_remove (GTK_CONTAINER (view->priv->layout_box), layout);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
glade_design_view_widget_visibility_changed (GladeProject *project,
|
|
Packit |
1e8aac |
GladeWidget *widget,
|
|
Packit |
1e8aac |
gboolean visible,
|
|
Packit |
1e8aac |
GladeDesignView *view)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
if (visible)
|
|
Packit |
1e8aac |
glade_design_view_add_toplevel (view, widget);
|
|
Packit |
1e8aac |
else
|
|
Packit |
1e8aac |
glade_design_view_remove_toplevel (view, widget);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
on_project_add_widget (GladeProject *project, GladeWidget *widget, GladeDesignView *view)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
glade_design_view_add_toplevel (view, widget);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
on_project_remove_widget (GladeProject *project, GladeWidget *widget, GladeDesignView *view)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
glade_design_view_remove_toplevel (view, widget);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
glade_design_view_set_project (GladeDesignView *view, GladeProject *project)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeDesignViewPrivate *priv;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
priv = view->priv;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (priv->project)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
g_signal_handlers_disconnect_by_func (priv->project,
|
|
Packit |
1e8aac |
on_project_add_widget,
|
|
Packit |
1e8aac |
view);
|
|
Packit |
1e8aac |
g_signal_handlers_disconnect_by_func (priv->project,
|
|
Packit |
1e8aac |
on_project_remove_widget,
|
|
Packit |
1e8aac |
view);
|
|
Packit |
1e8aac |
g_signal_handlers_disconnect_by_func (priv->project,
|
|
Packit |
1e8aac |
gtk_widget_hide,
|
|
Packit |
1e8aac |
priv->scrolled_window);
|
|
Packit |
1e8aac |
g_signal_handlers_disconnect_by_func (priv->project,
|
|
Packit |
1e8aac |
gtk_widget_show,
|
|
Packit |
1e8aac |
priv->scrolled_window);
|
|
Packit |
1e8aac |
g_signal_handlers_disconnect_by_func (priv->project,
|
|
Packit |
1e8aac |
glade_design_view_selection_changed,
|
|
Packit |
1e8aac |
view);
|
|
Packit |
1e8aac |
g_signal_handlers_disconnect_by_func (priv->project,
|
|
Packit |
1e8aac |
glade_design_view_widget_visibility_changed,
|
|
Packit |
1e8aac |
view);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_object_set_data (G_OBJECT (priv->project), GLADE_DESIGN_VIEW_KEY, NULL);
|
|
Packit |
1e8aac |
g_clear_object (&priv->project);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (!project)
|
|
Packit |
1e8aac |
return;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
priv->project = g_object_ref (project);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_signal_connect (project, "add-widget",
|
|
Packit |
1e8aac |
G_CALLBACK (on_project_add_widget), view);
|
|
Packit |
1e8aac |
g_signal_connect (project, "remove-widget",
|
|
Packit |
1e8aac |
G_CALLBACK (on_project_remove_widget), view);
|
|
Packit |
1e8aac |
g_signal_connect_swapped (project, "parse-began",
|
|
Packit |
1e8aac |
G_CALLBACK (gtk_widget_hide),
|
|
Packit |
1e8aac |
priv->scrolled_window);
|
|
Packit |
1e8aac |
g_signal_connect_swapped (project, "parse-finished",
|
|
Packit |
1e8aac |
G_CALLBACK (gtk_widget_show),
|
|
Packit |
1e8aac |
priv->scrolled_window);
|
|
Packit |
1e8aac |
g_signal_connect (project, "selection-changed",
|
|
Packit |
1e8aac |
G_CALLBACK (glade_design_view_selection_changed), view);
|
|
Packit |
1e8aac |
g_signal_connect (project, "widget-visibility-changed",
|
|
Packit |
1e8aac |
G_CALLBACK (glade_design_view_widget_visibility_changed), view);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_object_set_data (G_OBJECT (project), GLADE_DESIGN_VIEW_KEY, view);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
glade_design_view_set_property (GObject *object,
|
|
Packit |
1e8aac |
guint prop_id,
|
|
Packit |
1e8aac |
const GValue *value, GParamSpec *pspec)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
switch (prop_id)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
case PROP_PROJECT:
|
|
Packit |
1e8aac |
glade_design_view_set_project (GLADE_DESIGN_VIEW (object),
|
|
Packit |
1e8aac |
g_value_get_object (value));
|
|
Packit |
1e8aac |
break;
|
|
Packit |
1e8aac |
default:
|
|
Packit |
1e8aac |
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
|
Packit |
1e8aac |
break;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
glade_design_view_get_property (GObject *object,
|
|
Packit |
1e8aac |
guint prop_id,
|
|
Packit |
1e8aac |
GValue *value,
|
|
Packit |
1e8aac |
GParamSpec *pspec)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
switch (prop_id)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
case PROP_PROJECT:
|
|
Packit |
1e8aac |
g_value_set_object (value, GLADE_DESIGN_VIEW (object)->priv->project);
|
|
Packit |
1e8aac |
break;
|
|
Packit |
1e8aac |
default:
|
|
Packit |
1e8aac |
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
|
Packit |
1e8aac |
break;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
logo_draw (GtkWidget *widget, cairo_t *cr, GdkRGBA *c)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GtkAllocation alloc;
|
|
Packit |
1e8aac |
gdouble scale;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gtk_widget_get_allocation (widget, &alloc);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
cairo_save (cr);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
cairo_set_source_rgba (cr, c->red, c->green, c->blue, .06);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
scale = MIN ((alloc.width/1.5)/(glade_path_WIDTH), (alloc.height/1.5)/(glade_path_HEIGHT));
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
cairo_scale (cr, scale, scale);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
cairo_translate (cr, (alloc.width / scale) - glade_path_WIDTH,
|
|
Packit |
1e8aac |
(alloc.height / scale) - glade_path_HEIGHT);
|
|
Packit |
1e8aac |
cairo_append_path (cr, &glade_path);
|
|
Packit |
1e8aac |
cairo_fill (cr);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
cairo_restore (cr);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
on_chooser_adaptor_widget_selected (_GladeAdaptorChooserWidget *chooser,
|
|
Packit |
1e8aac |
GladeWidgetAdaptor *adaptor,
|
|
Packit |
1e8aac |
GladeProject *project)
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
glade_command_create (adaptor, NULL, NULL, project);
|
|
Packit |
1e8aac |
gtk_widget_destroy (gtk_widget_get_ancestor (GTK_WIDGET (chooser), GTK_TYPE_POPOVER));
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static gboolean
|
|
Packit |
1e8aac |
glade_design_view_viewport_button_press (GtkWidget *widget,
|
|
Packit |
1e8aac |
GdkEventButton *event,
|
|
Packit |
1e8aac |
GladeDesignView *view)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeDesignViewPrivate *priv = view->priv;
|
|
Packit |
1e8aac |
GdkRectangle rect = {event->x, event->y, 8, 8};
|
|
Packit |
1e8aac |
GtkWidget *pop, *chooser;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (event->type != GDK_2BUTTON_PRESS)
|
|
Packit |
1e8aac |
return FALSE;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
pop = gtk_popover_new (widget);
|
|
Packit |
1e8aac |
gtk_popover_set_pointing_to (GTK_POPOVER (pop), &rect);
|
|
Packit |
1e8aac |
gtk_popover_set_position (GTK_POPOVER (pop), GTK_POS_BOTTOM);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
chooser = _glade_adaptor_chooser_widget_new (GLADE_ADAPTOR_CHOOSER_WIDGET_TOPLEVEL |
|
|
Packit |
1e8aac |
GLADE_ADAPTOR_CHOOSER_WIDGET_WIDGET |
|
|
Packit |
1e8aac |
GLADE_ADAPTOR_CHOOSER_WIDGET_SKIP_DEPRECATED,
|
|
Packit |
1e8aac |
priv->project);
|
|
Packit |
1e8aac |
_glade_adaptor_chooser_widget_populate (GLADE_ADAPTOR_CHOOSER_WIDGET (chooser));
|
|
Packit |
1e8aac |
g_signal_connect (chooser, "adaptor-selected",
|
|
Packit |
1e8aac |
G_CALLBACK (on_chooser_adaptor_widget_selected),
|
|
Packit |
1e8aac |
priv->project);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gtk_container_add (GTK_CONTAINER (pop), chooser);
|
|
Packit |
1e8aac |
gtk_widget_show (chooser);
|
|
Packit |
1e8aac |
gtk_popover_popup (GTK_POPOVER (pop));
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
return TRUE;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static gboolean
|
|
Packit |
1e8aac |
glade_design_view_viewport_draw (GtkWidget *widget, cairo_t *cr, GladeDesignView *view)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeDesignViewPrivate *priv = GLADE_DESIGN_VIEW (view)->priv;
|
|
Packit |
1e8aac |
GtkStyleContext *context = gtk_widget_get_style_context (widget);
|
|
Packit |
1e8aac |
GdkRGBA fg_color;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gtk_style_context_get_color (context, gtk_style_context_get_state (context),
|
|
Packit |
1e8aac |
&fg_color);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
logo_draw (widget, cr, &fg_color);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (priv->drag_highlight)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GdkRGBA c;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gtk_style_context_save (context);
|
|
Packit |
1e8aac |
gtk_style_context_get_background_color (context,
|
|
Packit |
1e8aac |
gtk_style_context_get_state (context) |
|
|
Packit |
1e8aac |
GTK_STATE_FLAG_SELECTED |
|
|
Packit |
1e8aac |
GTK_STATE_FLAG_FOCUSED, &c);
|
|
Packit |
1e8aac |
gtk_style_context_restore (context);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
cairo_set_line_width (cr, 2);
|
|
Packit |
1e8aac |
gdk_cairo_set_source_rgba (cr, &c);
|
|
Packit |
1e8aac |
cairo_rectangle (cr, 0, 0,
|
|
Packit |
1e8aac |
gtk_widget_get_allocated_width (widget),
|
|
Packit |
1e8aac |
gtk_widget_get_allocated_height (widget));
|
|
Packit |
1e8aac |
cairo_stroke (cr);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
return FALSE;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
glade_design_view_init (GladeDesignView *view)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GtkWidget *viewport;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
view->priv = glade_design_view_get_instance_private (view);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gtk_widget_set_no_show_all (GTK_WIDGET (view), TRUE);
|
|
Packit |
1e8aac |
gtk_orientable_set_orientation (GTK_ORIENTABLE (view),
|
|
Packit |
1e8aac |
GTK_ORIENTATION_VERTICAL);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
view->priv->project = NULL;
|
|
Packit |
1e8aac |
view->priv->layout_box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
|
|
Packit |
1e8aac |
gtk_widget_set_valign (view->priv->layout_box, GTK_ALIGN_START);
|
|
Packit |
1e8aac |
gtk_container_set_border_width (GTK_CONTAINER (view->priv->layout_box), 0);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
view->priv->scrolled_window = gtk_scrolled_window_new (NULL, NULL);
|
|
Packit |
1e8aac |
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW
|
|
Packit |
1e8aac |
(view->priv->scrolled_window),
|
|
Packit |
1e8aac |
GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
viewport = gtk_viewport_new (NULL, NULL);
|
|
Packit |
1e8aac |
gtk_widget_add_events (viewport, GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK);
|
|
Packit |
1e8aac |
g_signal_connect (viewport, "button-press-event",
|
|
Packit |
1e8aac |
G_CALLBACK (glade_design_view_viewport_button_press),
|
|
Packit |
1e8aac |
view);
|
|
Packit |
1e8aac |
g_signal_connect (viewport, "draw",
|
|
Packit |
1e8aac |
G_CALLBACK (glade_design_view_viewport_draw),
|
|
Packit |
1e8aac |
view);
|
|
Packit |
1e8aac |
gtk_viewport_set_shadow_type (GTK_VIEWPORT (viewport), GTK_SHADOW_NONE);
|
|
Packit |
1e8aac |
gtk_container_add (GTK_CONTAINER (viewport), view->priv->layout_box);
|
|
Packit |
1e8aac |
gtk_container_add (GTK_CONTAINER (view->priv->scrolled_window), viewport);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gtk_widget_show (view->priv->scrolled_window);
|
|
Packit |
1e8aac |
gtk_widget_show (viewport);
|
|
Packit |
1e8aac |
gtk_widget_show_all (view->priv->layout_box);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gtk_box_pack_start (GTK_BOX (view), view->priv->scrolled_window, TRUE, TRUE, 0);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gtk_container_set_border_width (GTK_CONTAINER (view), 0);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gtk_style_context_add_class (gtk_widget_get_style_context (GTK_WIDGET (view)),
|
|
Packit |
1e8aac |
GTK_STYLE_CLASS_VIEW);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
_glade_dnd_dest_set (GTK_WIDGET (view));
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
glade_design_view_finalize (GObject *object)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeDesignView *view = GLADE_DESIGN_VIEW (object);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
glade_design_view_set_project (view, NULL);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
G_OBJECT_CLASS (parent_class)->finalize (object);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
typedef struct
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GtkWidget *child;
|
|
Packit |
1e8aac |
gint x, y;
|
|
Packit |
1e8aac |
} FindInContainerData;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
find_inside_container (GtkWidget *widget, FindInContainerData *data)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GtkAllocation alloc;
|
|
Packit |
1e8aac |
gint x, y;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (data->child || !gtk_widget_get_mapped (widget))
|
|
Packit |
1e8aac |
return;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
x = data->x;
|
|
Packit |
1e8aac |
y = data->y;
|
|
Packit |
1e8aac |
gtk_widget_get_allocation (widget, &alloc);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (x >= alloc.x && x <= (alloc.x + alloc.width) &&
|
|
Packit |
1e8aac |
y >= alloc.y && y <= (alloc.y + alloc.height))
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
data->child = widget;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
glade_design_view_drag_highlight (_GladeDrag *dest,
|
|
Packit |
1e8aac |
gint x,
|
|
Packit |
1e8aac |
gint y)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
if (GLADE_IS_WIDGET (dest))
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GObject *obj = glade_widget_get_object (GLADE_WIDGET (dest));
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (GTK_IS_WIDGET (obj))
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GtkWidget *layout = gtk_widget_get_ancestor (GTK_WIDGET (obj),
|
|
Packit |
1e8aac |
GLADE_TYPE_DESIGN_LAYOUT);
|
|
Packit |
1e8aac |
if (layout)
|
|
Packit |
1e8aac |
_glade_design_layout_set_highlight (GLADE_DESIGN_LAYOUT (layout),
|
|
Packit |
1e8aac |
(x<0 || y<0) ? NULL : GLADE_WIDGET (dest));
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
_glade_drag_highlight (dest, x, y);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static gboolean
|
|
Packit |
1e8aac |
glade_design_view_drag_motion (GtkWidget *widget,
|
|
Packit |
1e8aac |
GdkDragContext *context,
|
|
Packit |
1e8aac |
gint x, gint y,
|
|
Packit |
1e8aac |
guint time)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeDesignView *view = GLADE_DESIGN_VIEW (widget);
|
|
Packit |
1e8aac |
GladeDesignViewPrivate *priv = view->priv;
|
|
Packit |
1e8aac |
FindInContainerData data;
|
|
Packit |
1e8aac |
_GladeDrag *drag = NULL;
|
|
Packit |
1e8aac |
gint xx, yy;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (!priv->drag_data)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GdkAtom target = gtk_drag_dest_find_target (widget, context, NULL);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (target)
|
|
Packit |
1e8aac |
gtk_drag_get_data (widget, context, target, time);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
data.child = NULL;
|
|
Packit |
1e8aac |
gtk_widget_translate_coordinates (widget, GTK_WIDGET (priv->layout_box),
|
|
Packit |
1e8aac |
x, y, &data.x, &data.y);
|
|
Packit |
1e8aac |
gtk_container_forall (GTK_CONTAINER (priv->layout_box),
|
|
Packit |
1e8aac |
(GtkCallback) find_inside_container,
|
|
Packit |
1e8aac |
&data);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (data.child)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeDesignLayout *layout = GLADE_DESIGN_LAYOUT (data.child);
|
|
Packit |
1e8aac |
GladeWidget *gchild = _glade_design_layout_get_child (layout);
|
|
Packit |
1e8aac |
GtkWidget *child = GTK_WIDGET (glade_widget_get_object (gchild));
|
|
Packit |
1e8aac |
GtkWidget *drag_target;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gtk_widget_translate_coordinates (widget, child, x, y, &xx, &yy;;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
drag_target = _glade_design_layout_get_child_at_position (child, xx, yy);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (drag_target)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeWidget *gwidget;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (GLADE_IS_PLACEHOLDER (drag_target))
|
|
Packit |
1e8aac |
drag = GLADE_DRAG (drag_target);
|
|
Packit |
1e8aac |
else if ((gwidget = glade_widget_get_from_gobject (drag_target)))
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
while (gwidget && !_glade_drag_can_drop (GLADE_DRAG (gwidget),
|
|
Packit |
1e8aac |
xx, yy, priv->drag_data))
|
|
Packit |
1e8aac |
gwidget = glade_widget_get_parent (gwidget);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (gwidget)
|
|
Packit |
1e8aac |
drag = GLADE_DRAG (gwidget);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
else if (_glade_drag_can_drop (GLADE_DRAG (widget), x, y, priv->drag_data))
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
drag = GLADE_DRAG (widget);
|
|
Packit |
1e8aac |
xx = x;
|
|
Packit |
1e8aac |
yy = y;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (priv->drag_target && priv->drag_target != drag)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
glade_design_view_drag_highlight (priv->drag_target, -1, -1);
|
|
Packit |
1e8aac |
g_clear_object (&priv->drag_target);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (drag)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
priv->drag_target = g_object_ref (drag);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
glade_design_view_drag_highlight (drag, xx, yy);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gdk_drag_status (context, GDK_ACTION_COPY, time);
|
|
Packit |
1e8aac |
return TRUE;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gdk_drag_status (context, 0, time);
|
|
Packit |
1e8aac |
return FALSE;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
glade_design_view_drag_leave (GtkWidget *widget,
|
|
Packit |
1e8aac |
GdkDragContext *context,
|
|
Packit |
1e8aac |
guint time)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeDesignViewPrivate *priv = GLADE_DESIGN_VIEW (widget)->priv;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (priv->drag_target)
|
|
Packit |
1e8aac |
glade_design_view_drag_highlight (priv->drag_target, -1, -1);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
on_source_drag_end (GtkWidget *widget,
|
|
Packit |
1e8aac |
GdkDragContext *context,
|
|
Packit |
1e8aac |
GladeDesignView *view)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeDesignViewPrivate *priv = view->priv;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (priv->drag_target)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
glade_design_view_drag_highlight (priv->drag_target, -1, -1);
|
|
Packit |
1e8aac |
g_clear_object (&priv->drag_target);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_clear_object (&priv->drag_data);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
glade_design_view_drag_data_received (GtkWidget *widget,
|
|
Packit |
1e8aac |
GdkDragContext *context,
|
|
Packit |
1e8aac |
gint x,
|
|
Packit |
1e8aac |
gint y,
|
|
Packit |
1e8aac |
GtkSelectionData *selection,
|
|
Packit |
1e8aac |
guint info,
|
|
Packit |
1e8aac |
guint time)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GtkWidget *source = gtk_drag_get_source_widget (context);
|
|
Packit |
1e8aac |
GladeDesignView *view = GLADE_DESIGN_VIEW (widget);
|
|
Packit |
1e8aac |
GladeDesignViewPrivate *priv = view->priv;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_signal_handlers_disconnect_by_func (source, on_source_drag_end, view);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_clear_object (&priv->drag_data);
|
|
Packit |
1e8aac |
priv->drag_data = _glade_dnd_get_data (context, selection, info);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (priv->drag_data)
|
|
Packit |
1e8aac |
g_object_ref (priv->drag_data);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_signal_connect_object (source, "drag-end", G_CALLBACK (on_source_drag_end), view, 0);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static gboolean
|
|
Packit |
1e8aac |
glade_design_view_drag_drop (GtkWidget *widget,
|
|
Packit |
1e8aac |
GdkDragContext *context,
|
|
Packit |
1e8aac |
gint x,
|
|
Packit |
1e8aac |
gint y,
|
|
Packit |
1e8aac |
guint time)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeDesignViewPrivate *priv = GLADE_DESIGN_VIEW (widget)->priv;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (priv->drag_data && priv->drag_target)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GtkWidget *target;
|
|
Packit |
1e8aac |
gint xx, yy;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (GLADE_IS_WIDGET (priv->drag_target))
|
|
Packit |
1e8aac |
target = GTK_WIDGET (glade_widget_get_object (GLADE_WIDGET (priv->drag_target)));
|
|
Packit |
1e8aac |
else
|
|
Packit |
1e8aac |
target = GTK_WIDGET (priv->drag_target);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gtk_widget_translate_coordinates (widget, target, x, y, &xx, &yy;;
|
|
Packit |
1e8aac |
_glade_drag_drop (GLADE_DRAG (priv->drag_target), xx, yy, priv->drag_data);
|
|
Packit |
1e8aac |
gtk_drag_finish (context, TRUE, FALSE, time);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
else
|
|
Packit |
1e8aac |
gtk_drag_finish (context, FALSE, FALSE, time);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
return TRUE;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static gboolean
|
|
Packit |
1e8aac |
glade_design_view_drag_iface_can_drop (_GladeDrag *drag,
|
|
Packit |
1e8aac |
gint x, gint y,
|
|
Packit |
1e8aac |
GObject *data)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeWidget *gwidget;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (GLADE_IS_WIDGET_ADAPTOR (data) ||
|
|
Packit |
1e8aac |
((gwidget = glade_widget_get_from_gobject (data)) &&
|
|
Packit |
1e8aac |
glade_widget_get_parent (gwidget)))
|
|
Packit |
1e8aac |
return TRUE;
|
|
Packit |
1e8aac |
else
|
|
Packit |
1e8aac |
return FALSE;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static gboolean
|
|
Packit |
1e8aac |
glade_design_view_drag_iface_drop (_GladeDrag *drag,
|
|
Packit |
1e8aac |
gint x, gint y,
|
|
Packit |
1e8aac |
GObject *data)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeDesignViewPrivate *priv = GLADE_DESIGN_VIEW (drag)->priv;
|
|
Packit |
1e8aac |
GladeWidget *gsource;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (GLADE_IS_WIDGET_ADAPTOR (data))
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
glade_command_create (GLADE_WIDGET_ADAPTOR (data),
|
|
Packit |
1e8aac |
NULL, NULL, priv->project);
|
|
Packit |
1e8aac |
return TRUE;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
else if ((gsource = glade_widget_get_from_gobject (data)))
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GList widgets = {gsource, NULL, NULL};
|
|
Packit |
1e8aac |
glade_command_dnd (&widgets, NULL, NULL);
|
|
Packit |
1e8aac |
return TRUE;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
return FALSE;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
glade_design_view_drag_iface_highlight (_GladeDrag *drag, gint x, gint y)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeDesignViewPrivate *priv = GLADE_DESIGN_VIEW (drag)->priv;
|
|
Packit |
1e8aac |
gboolean highlight = !(x < 0 || y < 0);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (priv->drag_highlight == highlight)
|
|
Packit |
1e8aac |
return;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
priv->drag_highlight = highlight;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gtk_widget_queue_draw (priv->scrolled_window);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
glade_design_view_drag_init (_GladeDragInterface *iface)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
iface->can_drag = NULL;
|
|
Packit |
1e8aac |
iface->can_drop = glade_design_view_drag_iface_can_drop;
|
|
Packit |
1e8aac |
iface->drop = glade_design_view_drag_iface_drop;
|
|
Packit |
1e8aac |
iface->highlight = glade_design_view_drag_iface_highlight;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
glade_design_view_class_init (GladeDesignViewClass *klass)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GObjectClass *object_class;
|
|
Packit |
1e8aac |
GtkWidgetClass *widget_class;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
parent_class = g_type_class_peek_parent (klass);
|
|
Packit |
1e8aac |
object_class = G_OBJECT_CLASS (klass);
|
|
Packit |
1e8aac |
widget_class = GTK_WIDGET_CLASS (klass);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
object_class->finalize = glade_design_view_finalize;
|
|
Packit |
1e8aac |
object_class->get_property = glade_design_view_get_property;
|
|
Packit |
1e8aac |
object_class->set_property = glade_design_view_set_property;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
widget_class->drag_motion = glade_design_view_drag_motion;
|
|
Packit |
1e8aac |
widget_class->drag_leave = glade_design_view_drag_leave;
|
|
Packit |
1e8aac |
widget_class->drag_data_received = glade_design_view_drag_data_received;
|
|
Packit |
1e8aac |
widget_class->drag_drop = glade_design_view_drag_drop;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_object_class_install_property (object_class,
|
|
Packit |
1e8aac |
PROP_PROJECT,
|
|
Packit |
1e8aac |
g_param_spec_object ("project",
|
|
Packit |
1e8aac |
"Project",
|
|
Packit |
1e8aac |
"The project for this view",
|
|
Packit |
1e8aac |
GLADE_TYPE_PROJECT,
|
|
Packit |
1e8aac |
G_PARAM_READWRITE |
|
|
Packit |
1e8aac |
G_PARAM_CONSTRUCT_ONLY));
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* Public API */
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
GladeProject *
|
|
Packit |
1e8aac |
glade_design_view_get_project (GladeDesignView *view)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
g_return_val_if_fail (GLADE_IS_DESIGN_VIEW (view), NULL);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
return view->priv->project;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
GtkWidget *
|
|
Packit |
1e8aac |
glade_design_view_new (GladeProject *project)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeDesignView *view;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_return_val_if_fail (GLADE_IS_PROJECT (project), NULL);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
view = g_object_new (GLADE_TYPE_DESIGN_VIEW, "project", project, NULL);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
return GTK_WIDGET (view);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
GladeDesignView *
|
|
Packit |
1e8aac |
glade_design_view_get_from_project (GladeProject *project)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
gpointer p;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_return_val_if_fail (GLADE_IS_PROJECT (project), NULL);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
p = g_object_get_data (G_OBJECT (project), GLADE_DESIGN_VIEW_KEY);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
return (p != NULL) ? GLADE_DESIGN_VIEW (p) : NULL;
|
|
Packit |
1e8aac |
}
|