diff options
| author | Martin Owens <doctormo@gmail.com> | 2014-03-27 01:33:44 +0000 |
|---|---|---|
| committer | Martin Owens <doctormo@gmail.com> | 2014-03-27 01:33:44 +0000 |
| commit | 5a4fb2325f60d292b47330f540b26a3279341c90 (patch) | |
| tree | d2aa7967be25450b83e625025366c618101ae49f /src/widgets/sp-widget.cpp | |
| parent | The Polar Arrange Tab of the Arrange Dialog now hides the parametric (diff) | |
| parent | Remove Snap menu item and improve grid menu item text (diff) | |
| download | inkscape-5a4fb2325f60d292b47330f540b26a3279341c90.tar.gz inkscape-5a4fb2325f60d292b47330f540b26a3279341c90.zip | |
Commit a merge to trunk, with probabal errors
(bzr r11073.1.36)
Diffstat (limited to 'src/widgets/sp-widget.cpp')
| -rw-r--r-- | src/widgets/sp-widget.cpp | 479 |
1 files changed, 263 insertions, 216 deletions
diff --git a/src/widgets/sp-widget.cpp b/src/widgets/sp-widget.cpp index c0ee44f83..0e2295e36 100644 --- a/src/widgets/sp-widget.cpp +++ b/src/widgets/sp-widget.cpp @@ -1,313 +1,360 @@ -#define __SP_WIDGET_C__ - /* * Abstract base class for dynamic control widgets * * Authors: * Lauris Kaplinski <lauris@kaplinski.com> * bulia byak <buliabyak@users.sf.net> + * Jon A. Cruz <jon@joncruz.org> * * Copyright (C) 1999-2002 Lauris Kaplinski * Copyright (C) 2000-2001 Ximian, Inc. + * Copyright (C) 2012 Authors * * Released under GNU GPL, read the file 'COPYING' for more information */ #include "macros.h" -#include "../document.h" +#include "document.h" #include "sp-widget.h" #include "helper/sp-marshal.h" +using Inkscape::SPWidgetImpl; + enum { - CONSTRUCT, - MODIFY_SELECTION, - CHANGE_SELECTION, - SET_SELECTION, - LAST_SIGNAL + CONSTRUCT, + MODIFY_SELECTION, + CHANGE_SELECTION, + SET_SELECTION, + LAST_SIGNAL }; -static void sp_widget_class_init (SPWidgetClass *klass); -static void sp_widget_init (SPWidget *widget); +namespace Inkscape { -static void sp_widget_destroy (GtkObject *object); +class SPWidgetImpl +{ +public: + SPWidgetImpl(SPWidget &target); + ~SPWidgetImpl(); -static void sp_widget_show (GtkWidget *widget); -static void sp_widget_hide (GtkWidget *widget); -static gint sp_widget_expose (GtkWidget *widget, GdkEventExpose *event); -static void sp_widget_size_request (GtkWidget *widget, GtkRequisition *requisition); + static void classInit(SPWidgetClass *klass); + static void init(SPWidget *widget); + static void dispose(GObject *object); + static void show(GtkWidget *widget); + static void hide(GtkWidget *widget); #if GTK_CHECK_VERSION(3,0,0) -static void sp_widget_get_preferred_width(GtkWidget *widget, - gint *minimal_width, - gint *natural_width); - -static void sp_widget_get_preferred_height(GtkWidget *widget, - gint *minimal_height, - gint *natural_height); + static void getPreferredWidth(GtkWidget *widget, + gint *minimal_width, + gint *natural_width); + + static void getPreferredHeight(GtkWidget *widget, + gint *minimal_height, + gint *natural_height); + static gboolean draw(GtkWidget *widget, cairo_t *cr); +#else + static void sizeRequest(GtkWidget *widget, GtkRequisition *requisition); + static gboolean expose(GtkWidget *widget, GdkEventExpose *event); #endif -static void sp_widget_size_allocate (GtkWidget *widget, GtkAllocation *allocation); + static void sizeAllocate(GtkWidget *widget, GtkAllocation *allocation); + static void modifySelectionCB(Application *inkscape, Selection *selection, guint flags, SPWidget *spw); + static void changeSelectionCB(Application *inkscape, Selection *selection, SPWidget *spw); + static void setSelectionCB(Application *inkscape, Selection *selection, SPWidget *spw); + + static GtkWidget *constructGlobal(SPWidget *spw, Inkscape::Application *inkscape); -static void sp_widget_modify_selection (Inkscape::Application *inkscape, Inkscape::Selection *selection, guint flags, SPWidget *spw); -static void sp_widget_change_selection (Inkscape::Application *inkscape, Inkscape::Selection *selection, SPWidget *spw); -static void sp_widget_set_selection (Inkscape::Application *inkscape, Inkscape::Selection *selection, SPWidget *spw); + void modifySelection(Application *inkscape, Selection *selection, guint flags); + void changeSelection(Application *inkscape, Selection *selection); + void setSelection(Application *inkscape, Selection *selection); -static GtkBinClass *parent_class; -static guint signals[LAST_SIGNAL] = {0}; +private: + static GtkBinClass *parentClass; + static guint signals[LAST_SIGNAL]; -GType -sp_widget_get_type (void) + SPWidget &_target; +}; + +GtkBinClass *SPWidgetImpl::parentClass = 0; +guint SPWidgetImpl::signals[LAST_SIGNAL] = {0}; + +} // namespace Inkscape + +GType SPWidget::getType() { - static GType type = 0; - if (!type) { - static const GTypeInfo info = { - sizeof (SPWidgetClass), - NULL, NULL, - (GClassInitFunc) sp_widget_class_init, - NULL, NULL, - sizeof (SPWidget), - 0, - (GInstanceInitFunc) sp_widget_init, - NULL - }; - type = g_type_register_static (GTK_TYPE_BIN, - "SPWidget", - &info, - (GTypeFlags)0); - } - return type; + static GType type = 0; + if (!type) { + static GTypeInfo const info = { + sizeof(SPWidgetClass), + NULL, NULL, + reinterpret_cast<GClassInitFunc>(SPWidgetImpl::classInit), + NULL, NULL, + sizeof(SPWidget), + 0, + reinterpret_cast<GInstanceInitFunc>(SPWidgetImpl::init), + NULL + }; + type = g_type_register_static(GTK_TYPE_BIN, + "SPWidget", + &info, + static_cast<GTypeFlags>(0)); + } + return type; } -static void -sp_widget_class_init (SPWidgetClass *klass) +namespace Inkscape { + +SPWidgetImpl::SPWidgetImpl(SPWidget &target) : + _target(target) { - GtkObjectClass *object_class; - GtkWidgetClass *widget_class; - - object_class = (GtkObjectClass *) klass; - widget_class = (GtkWidgetClass *) klass; - - parent_class = (GtkBinClass*)g_type_class_peek_parent (klass); - - object_class->destroy = sp_widget_destroy; - - signals[CONSTRUCT] = g_signal_new ("construct", - G_TYPE_FROM_CLASS(object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (SPWidgetClass, construct), - NULL, NULL, - g_cclosure_marshal_VOID__VOID, - G_TYPE_NONE, 0); - signals[CHANGE_SELECTION] = g_signal_new ("change_selection", - G_TYPE_FROM_CLASS(object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (SPWidgetClass, change_selection), - NULL, NULL, - g_cclosure_marshal_VOID__POINTER, - G_TYPE_NONE, 1, - G_TYPE_POINTER); - signals[MODIFY_SELECTION] = g_signal_new ("modify_selection", - G_TYPE_FROM_CLASS(object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (SPWidgetClass, modify_selection), - NULL, NULL, - sp_marshal_VOID__POINTER_UINT, - G_TYPE_NONE, 2, - G_TYPE_POINTER, G_TYPE_UINT); - signals[SET_SELECTION] = g_signal_new ("set_selection", - G_TYPE_FROM_CLASS(object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (SPWidgetClass, set_selection), - NULL, NULL, - g_cclosure_marshal_VOID__POINTER, - G_TYPE_NONE, 1, - G_TYPE_POINTER); - - widget_class->show = sp_widget_show; - widget_class->hide = sp_widget_hide; - widget_class->expose_event = sp_widget_expose; -#if GTK_CHECK_VERSION(3,0,0) - widget_class->get_preferred_width = sp_widget_get_preferred_width; - widget_class->get_preferred_height = sp_widget_get_preferred_height; -#else - widget_class->size_request = sp_widget_size_request; -#endif - widget_class->size_allocate = sp_widget_size_allocate; } -static void -sp_widget_init (SPWidget *spw) +SPWidgetImpl::~SPWidgetImpl() { - spw->inkscape = NULL; } -static void -sp_widget_destroy (GtkObject *object) +void SPWidgetImpl::classInit(SPWidgetClass *klass) { - SPWidget *spw; - - spw = (SPWidget *) object; + GObjectClass *object_class = reinterpret_cast<GObjectClass *>(klass); + GtkWidgetClass *widget_class = reinterpret_cast<GtkWidgetClass *>(klass); + + parentClass = reinterpret_cast<GtkBinClass *>(g_type_class_peek_parent(klass)); + + object_class->dispose = SPWidgetImpl::dispose; + + signals[CONSTRUCT] = g_signal_new ("construct", + G_TYPE_FROM_CLASS(object_class), + G_SIGNAL_RUN_FIRST, + G_STRUCT_OFFSET(SPWidgetClass, construct), + NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); + + signals[CHANGE_SELECTION] = g_signal_new ("change_selection", + G_TYPE_FROM_CLASS(object_class), + G_SIGNAL_RUN_FIRST, + G_STRUCT_OFFSET(SPWidgetClass, change_selection), + NULL, NULL, + g_cclosure_marshal_VOID__POINTER, + G_TYPE_NONE, 1, + G_TYPE_POINTER); + + signals[MODIFY_SELECTION] = g_signal_new ("modify_selection", + G_TYPE_FROM_CLASS(object_class), + G_SIGNAL_RUN_FIRST, + G_STRUCT_OFFSET(SPWidgetClass, modify_selection), + NULL, NULL, + sp_marshal_VOID__POINTER_UINT, + G_TYPE_NONE, 2, + G_TYPE_POINTER, G_TYPE_UINT); + + signals[SET_SELECTION] = g_signal_new ("set_selection", + G_TYPE_FROM_CLASS(object_class), + G_SIGNAL_RUN_FIRST, + G_STRUCT_OFFSET(SPWidgetClass, set_selection), + NULL, NULL, + g_cclosure_marshal_VOID__POINTER, + G_TYPE_NONE, 1, + G_TYPE_POINTER); + + widget_class->show = SPWidgetImpl::show; + widget_class->hide = SPWidgetImpl::hide; +#if GTK_CHECK_VERSION(3,0,0) + widget_class->get_preferred_width = SPWidgetImpl::getPreferredWidth; + widget_class->get_preferred_height = SPWidgetImpl::getPreferredHeight; + widget_class->draw = SPWidgetImpl::draw; +#else + widget_class->size_request = SPWidgetImpl::sizeRequest; + widget_class->expose_event = SPWidgetImpl::expose; +#endif + widget_class->size_allocate = SPWidgetImpl::sizeAllocate; +} - if (spw->inkscape) { - /* Disconnect signals */ - // the checks are necessary because when destroy is caused by the the program shutting down, - // the inkscape object may already be (partly?) invalid --bb - if (G_IS_OBJECT(spw->inkscape) && G_OBJECT_GET_CLASS(G_OBJECT(spw->inkscape))) - sp_signal_disconnect_by_data (spw->inkscape, spw); - spw->inkscape = NULL; - } +void SPWidgetImpl::init(SPWidget *spw) +{ + spw->inkscape = NULL; - if (((GtkObjectClass *) parent_class)->destroy) - (* ((GtkObjectClass *) parent_class)->destroy) (object); + spw->_impl = new SPWidgetImpl(*spw); // ctor invoked after all other init } -static void -sp_widget_show (GtkWidget *widget) +void SPWidgetImpl::dispose(GObject *object) { - SPWidget *spw; + SPWidget *spw = reinterpret_cast<SPWidget *>(object); + + if (spw->inkscape) { + // Disconnect signals - spw = SP_WIDGET (widget); + // the checks are necessary because when destroy is caused by the program shutting down, + // the inkscape object may already be (partly?) invalid --bb + if (G_IS_OBJECT(spw->inkscape) && G_OBJECT_GET_CLASS(spw->inkscape)) { + sp_signal_disconnect_by_data(spw->inkscape, spw); + } + spw->inkscape = NULL; + } - if (spw->inkscape) { - /* Connect signals */ - g_signal_connect (G_OBJECT (spw->inkscape), "modify_selection", G_CALLBACK (sp_widget_modify_selection), spw); - g_signal_connect (G_OBJECT (spw->inkscape), "change_selection", G_CALLBACK (sp_widget_change_selection), spw); - g_signal_connect (G_OBJECT (spw->inkscape), "set_selection", G_CALLBACK (sp_widget_set_selection), spw); - } + delete spw->_impl; + spw->_impl = 0; - if (((GtkWidgetClass *) parent_class)->show) - (* ((GtkWidgetClass *) parent_class)->show) (widget); + if (reinterpret_cast<GObjectClass *>(parentClass)->dispose) { + (*reinterpret_cast<GObjectClass *>(parentClass)->dispose)(object); + } } -static void -sp_widget_hide (GtkWidget *widget) +void SPWidgetImpl::show(GtkWidget *widget) { - SPWidget *spw; + SPWidget *spw = SP_WIDGET(widget); + + if (spw->inkscape) { + // Connect signals + g_signal_connect(spw->inkscape, "modify_selection", G_CALLBACK(SPWidgetImpl::modifySelectionCB), spw); + g_signal_connect(spw->inkscape, "change_selection", G_CALLBACK(SPWidgetImpl::changeSelectionCB), spw); + g_signal_connect(spw->inkscape, "set_selection", G_CALLBACK(SPWidgetImpl::setSelectionCB), spw); + } + + if (reinterpret_cast<GtkWidgetClass *>(parentClass)->show) { + (*reinterpret_cast<GtkWidgetClass *>(parentClass)->show)(widget); + } +} - spw = SP_WIDGET (widget); +void SPWidgetImpl::hide(GtkWidget *widget) +{ + SPWidget *spw = SP_WIDGET (widget); - if (spw->inkscape) { - /* Disconnect signals */ - sp_signal_disconnect_by_data (spw->inkscape, spw); - } + if (spw->inkscape) { + // Disconnect signals + sp_signal_disconnect_by_data(spw->inkscape, spw); + } - if (((GtkWidgetClass *) parent_class)->hide) - (* ((GtkWidgetClass *) parent_class)->hide) (widget); + if (reinterpret_cast<GtkWidgetClass *>(parentClass)->hide) { + (*reinterpret_cast<GtkWidgetClass *>(parentClass)->hide)(widget); + } } -static gint -sp_widget_expose (GtkWidget *widget, GdkEventExpose *event) +#if GTK_CHECK_VERSION(3,0,0) +gboolean SPWidgetImpl::draw(GtkWidget *widget, cairo_t *cr) +#else +gboolean SPWidgetImpl::expose(GtkWidget *widget, GdkEventExpose *event) +#endif { - GtkBin *bin; - GtkWidget *child; + GtkBin *bin = GTK_BIN(widget); + GtkWidget *child = gtk_bin_get_child(bin); - bin = GTK_BIN (widget); - child = gtk_bin_get_child (bin); + if (child) { +#if GTK_CHECK_VERSION(3,0,0) + gtk_container_propagate_draw(GTK_CONTAINER(widget), child, cr); +#else + gtk_container_propagate_expose(GTK_CONTAINER(widget), child, event); +#endif + } - if (child) { - gtk_container_propagate_expose (GTK_CONTAINER(widget), child, event); - } - /* - if ((bin->child) && (!gtk_widget_get_has_window (bin->child))) { - GdkEventExpose ce; - ce = *event; - gtk_widget_event (bin->child, (GdkEvent *) &ce); - } - */ - - return FALSE; + return FALSE; } -static void -sp_widget_size_request (GtkWidget *widget, GtkRequisition *requisition) +#if GTK_CHECK_VERSION(3,0,0) +void SPWidgetImpl::getPreferredWidth(GtkWidget *widget, gint *minimal_width, gint *natural_width) { - GtkBin *bin = GTK_BIN (widget); - GtkWidget *child = gtk_bin_get_child (bin); + GtkBin *bin = GTK_BIN(widget); + GtkWidget *child = gtk_bin_get_child(bin); - if (child) - gtk_widget_size_request (child, requisition); + if(child) { + gtk_widget_get_preferred_width(child, minimal_width, natural_width); + } } -#if GTK_CHECK_VERSION(3,0,0) -static void sp_widget_get_preferred_width(GtkWidget *widget, gint *minimal_width, gint *natural_width) +void SPWidgetImpl::getPreferredHeight(GtkWidget *widget, gint *minimal_height, gint *natural_height) { - GtkRequisition requisition; - sp_widget_size_request(widget, &requisition); - *minimal_width = *natural_width = requisition.width; -} + GtkBin *bin = GTK_BIN(widget); + GtkWidget *child = gtk_bin_get_child(bin); -static void sp_widget_get_preferred_height(GtkWidget *widget, gint *minimal_height, gint *natural_height) + if(child) { + gtk_widget_get_preferred_height(child, minimal_height, natural_height); + } +} +#else +void SPWidgetImpl::sizeRequest(GtkWidget *widget, GtkRequisition *requisition) { - GtkRequisition requisition; - sp_widget_size_request(widget, &requisition); - *minimal_height = *natural_height = requisition.height; + GtkBin *bin = GTK_BIN(widget); + GtkWidget *child = gtk_bin_get_child(bin); + + if (child) { + gtk_widget_size_request(child, requisition); + } } #endif -static void -sp_widget_size_allocate (GtkWidget *widget, GtkAllocation *allocation) +void SPWidgetImpl::sizeAllocate(GtkWidget *widget, GtkAllocation *allocation) { - GtkBin *bin = GTK_BIN (widget); - GtkWidget *child = gtk_bin_get_child (bin); + gtk_widget_set_allocation(widget, allocation); - gtk_widget_set_allocation (widget, allocation); + GtkBin *bin = GTK_BIN(widget); + GtkWidget *child = gtk_bin_get_child(bin); - if (child) - gtk_widget_size_allocate (child, allocation); + if (child) { + gtk_widget_size_allocate(child, allocation); + } } -/* Methods */ - -GtkWidget * -sp_widget_new_global (Inkscape::Application *inkscape) +GtkWidget *SPWidgetImpl::constructGlobal(SPWidget *spw, Inkscape::Application *inkscape) { - SPWidget *spw; + g_return_val_if_fail(!spw->inkscape, NULL); - spw = (SPWidget*)g_object_new (SP_TYPE_WIDGET, NULL); + spw->inkscape = inkscape; + if (gtk_widget_get_visible(GTK_WIDGET(spw))) { + g_signal_connect(inkscape, "modify_selection", G_CALLBACK(SPWidgetImpl::modifySelectionCB), spw); + g_signal_connect(inkscape, "change_selection", G_CALLBACK(SPWidgetImpl::changeSelectionCB), spw); + g_signal_connect(inkscape, "set_selection", G_CALLBACK(SPWidgetImpl::setSelectionCB), spw); + } - if (!sp_widget_construct_global (spw, inkscape)) { - g_object_unref (spw); - return NULL; - } + g_signal_emit(spw, signals[CONSTRUCT], 0); - return (GtkWidget *) spw; + return GTK_WIDGET(spw); } -GtkWidget * -sp_widget_construct_global (SPWidget *spw, Inkscape::Application *inkscape) +void SPWidgetImpl::modifySelectionCB(Application *inkscape, Selection *selection, guint flags, SPWidget *spw) { - g_return_val_if_fail (!spw->inkscape, NULL); + spw->_impl->modifySelection(inkscape, selection, flags); +} - spw->inkscape = inkscape; - if (gtk_widget_get_visible (GTK_WIDGET(spw))) { - g_signal_connect (G_OBJECT (inkscape), "modify_selection", G_CALLBACK (sp_widget_modify_selection), spw); - g_signal_connect (G_OBJECT (inkscape), "change_selection", G_CALLBACK (sp_widget_change_selection), spw); - g_signal_connect (G_OBJECT (inkscape), "set_selection", G_CALLBACK (sp_widget_set_selection), spw); - } +void SPWidgetImpl::changeSelectionCB(Application *inkscape, Selection *selection, SPWidget *spw) +{ + spw->_impl->changeSelection(inkscape, selection); +} - g_signal_emit (G_OBJECT (spw), signals[CONSTRUCT], 0); +void SPWidgetImpl::setSelectionCB(Application *inkscape, Selection *selection, SPWidget *spw) +{ + spw->_impl->setSelection(inkscape, selection); +} - return (GtkWidget *) spw; +void SPWidgetImpl::modifySelection(Application * /*inkscape*/, Selection *selection, guint flags) +{ + g_signal_emit(&_target, signals[MODIFY_SELECTION], 0, selection, flags); } -static void -sp_widget_modify_selection (Inkscape::Application */*inkscape*/, Inkscape::Selection *selection, guint flags, SPWidget *spw) +void SPWidgetImpl::changeSelection(Application * /*inkscape*/, Selection *selection) { - g_signal_emit (G_OBJECT (spw), signals[MODIFY_SELECTION], 0, selection, flags); + g_signal_emit(&_target, signals[CHANGE_SELECTION], 0, selection); } -static void -sp_widget_change_selection (Inkscape::Application */*inkscape*/, Inkscape::Selection *selection, SPWidget *spw) +void SPWidgetImpl::setSelection(Application * /*inkscape*/, Selection *selection) { - g_signal_emit (G_OBJECT (spw), signals[CHANGE_SELECTION], 0, selection); + // Emit "set_selection" signal + g_signal_emit(&_target, signals[SET_SELECTION], 0, selection); + // Inkscape will force "change_selection" anyways } -static void -sp_widget_set_selection (Inkscape::Application */*inkscape*/, Inkscape::Selection *selection, SPWidget *spw) +} // namespace Inkscape + +// Methods + +GtkWidget *sp_widget_new_global(Inkscape::Application *inkscape) { - /* Emit "set_selection" signal */ - g_signal_emit (G_OBJECT (spw), signals[SET_SELECTION], 0, selection); - /* Inkscape will force "change_selection" anyways */ + SPWidget *spw = reinterpret_cast<SPWidget*>(g_object_new(SP_TYPE_WIDGET, NULL)); + + if (!SPWidgetImpl::constructGlobal(spw, inkscape)) { + g_object_unref(spw); + spw = 0; + } + + return reinterpret_cast<GtkWidget *>(spw); } /* |
