diff options
| author | Ted Gould <ted@gould.cx> | 2010-03-26 04:34:25 +0000 |
|---|---|---|
| committer | Ted Gould <ted@gould.cx> | 2010-03-26 04:34:25 +0000 |
| commit | 9e023a3aa964a0d3fa1e31e46d33657367ba68aa (patch) | |
| tree | 33f1392a340737e4eeefca6fd031f96c29befd2b /src/widgets | |
| parent | Installing the pkgconfig file (diff) | |
| parent | Adding in shape-record.h (diff) | |
| download | inkscape-9e023a3aa964a0d3fa1e31e46d33657367ba68aa.tar.gz inkscape-9e023a3aa964a0d3fa1e31e46d33657367ba68aa.zip | |
Merge from trunk
(bzr r8254.1.53)
Diffstat (limited to 'src/widgets')
| -rw-r--r-- | src/widgets/CMakeLists.txt | 3 | ||||
| -rw-r--r-- | src/widgets/Makefile_insert | 2 | ||||
| -rw-r--r-- | src/widgets/desktop-widget.cpp | 195 | ||||
| -rw-r--r-- | src/widgets/desktop-widget.h | 36 | ||||
| -rw-r--r-- | src/widgets/fill-style.cpp | 137 | ||||
| -rw-r--r-- | src/widgets/gradient-selector.cpp | 101 | ||||
| -rw-r--r-- | src/widgets/gradient-selector.h | 49 | ||||
| -rw-r--r-- | src/widgets/gradient-toolbar.cpp | 158 | ||||
| -rw-r--r-- | src/widgets/gradient-vector.cpp | 847 | ||||
| -rw-r--r-- | src/widgets/gradient-vector.h | 7 | ||||
| -rw-r--r-- | src/widgets/icon.cpp | 20 | ||||
| -rw-r--r-- | src/widgets/paint-selector.cpp | 481 | ||||
| -rw-r--r-- | src/widgets/paint-selector.h | 138 | ||||
| -rw-r--r-- | src/widgets/select-toolbar.cpp | 10 | ||||
| -rw-r--r-- | src/widgets/sp-color-notebook.cpp | 598 | ||||
| -rw-r--r-- | src/widgets/sp-color-selector.cpp | 9 | ||||
| -rw-r--r-- | src/widgets/sp-color-selector.h | 2 | ||||
| -rw-r--r-- | src/widgets/stroke-style.cpp | 78 | ||||
| -rw-r--r-- | src/widgets/swatch-selector.cpp | 203 | ||||
| -rw-r--r-- | src/widgets/swatch-selector.h | 59 | ||||
| -rw-r--r-- | src/widgets/toolbox.cpp | 858 | ||||
| -rw-r--r-- | src/widgets/toolbox.h | 44 |
22 files changed, 2321 insertions, 1714 deletions
diff --git a/src/widgets/CMakeLists.txt b/src/widgets/CMakeLists.txt index 45f013f16..9af325926 100644 --- a/src/widgets/CMakeLists.txt +++ b/src/widgets/CMakeLists.txt @@ -29,8 +29,9 @@ spw-utilities.cpp sp-xmlview-attr-list.cpp sp-xmlview-content.cpp sp-xmlview-tree.cpp +swatch-selector.cpp toolbox.cpp ) ADD_LIBRARY(widgets STATIC ${widgets_SRC}) TARGET_LINK_LIBRARIES(widgets -2geom ${INKSCAPE_LIBS})
\ No newline at end of file +2geom ${INKSCAPE_LIBS}) diff --git a/src/widgets/Makefile_insert b/src/widgets/Makefile_insert index 08b2433ea..5d327d8a3 100644 --- a/src/widgets/Makefile_insert +++ b/src/widgets/Makefile_insert @@ -67,6 +67,8 @@ ink_common_sources += \ widgets/sp-xmlview-tree.h \ widgets/stroke-style.cpp \ widgets/stroke-style.h \ + widgets/swatch-selector.cpp \ + widgets/swatch-selector.h \ widgets/toolbox.cpp \ widgets/toolbox.h \ widgets/widget-sizes.h diff --git a/src/widgets/desktop-widget.cpp b/src/widgets/desktop-widget.cpp index b63992afe..ab440595f 100644 --- a/src/widgets/desktop-widget.cpp +++ b/src/widgets/desktop-widget.cpp @@ -48,25 +48,31 @@ #include "sp-image.h" #include "sp-item.h" #include "sp-namedview.h" -#include "toolbox.h" #include "ui/dialog/dialog-manager.h" #include "ui/dialog/swatches.h" #include "ui/icon-names.h" #include "ui/widget/dock.h" #include "ui/widget/layer-selector.h" #include "ui/widget/selected-style.h" -#include "widgets/button.h" -#include "widgets/ruler.h" -#include "widgets/spinbutton-events.h" -#include "widgets/spw-utilities.h" -#include "widgets/toolbox.h" -#include "widgets/widget-sizes.h" +#include "ui/uxmanager.h" + +// We're in the "widgets" directory, so no need to explicitly prefix these: +#include "button.h" +#include "ruler.h" +#include "spinbutton-events.h" +#include "spw-utilities.h" +#include "toolbox.h" +#include "widget-sizes.h" #if defined (SOLARIS) && (SOLARIS == 8) #include "round.h" using Inkscape::round; #endif + +using Inkscape::UI::UXManager; +using Inkscape::UI::ToolboxFactory; + #ifdef WITH_INKBOARD #endif @@ -85,7 +91,6 @@ enum { /* SPDesktopWidget */ static void sp_desktop_widget_class_init (SPDesktopWidgetClass *klass); -static void sp_desktop_widget_init (SPDesktopWidget *widget); static void sp_desktop_widget_destroy (GtkObject *object); static void sp_desktop_widget_size_allocate (GtkWidget *widget, GtkAllocation *allocation); @@ -97,7 +102,6 @@ static void sp_dtw_color_profile_event(EgeColorProfTracker *widget, SPDesktopWid static void cms_adjust_toggled( GtkWidget *button, gpointer data ); static void cms_adjust_set_sensitive( SPDesktopWidget *dtw, bool enabled ); static void sp_desktop_widget_adjustment_value_changed (GtkAdjustment *adj, SPDesktopWidget *dtw); -static void sp_desktop_widget_namedview_modified (SPObject *obj, guint flags, SPDesktopWidget *dtw); static gdouble sp_dtw_zoom_value_to_display (gdouble value); static gdouble sp_dtw_zoom_display_to_value (gdouble value); @@ -241,7 +245,7 @@ SPDesktopWidget::window_get_pointer() /** * Registers SPDesktopWidget class and returns its type number. */ -GType sp_desktop_widget_get_type(void) +GType SPDesktopWidget::getType(void) { static GtkType type = 0; if (!type) { @@ -254,7 +258,7 @@ GType sp_desktop_widget_get_type(void) 0, // class_data sizeof(SPDesktopWidget), 0, // n_preallocs - (GInstanceInitFunc)sp_desktop_widget_init, + (GInstanceInitFunc)SPDesktopWidget::init, 0 // value_table }; type = g_type_register_static(SP_TYPE_VIEW_WIDGET, "SPDesktopWidget", &info, static_cast<GTypeFlags>(0)); @@ -282,14 +286,12 @@ sp_desktop_widget_class_init (SPDesktopWidgetClass *klass) /** * Callback for SPDesktopWidget object initialization. */ -static void -sp_desktop_widget_init (SPDesktopWidget *dtw) +void SPDesktopWidget::init( SPDesktopWidget *dtw ) { GtkWidget *widget; GtkWidget *tbl; GtkWidget *canvas_tbl; - GtkWidget *hbox; GtkWidget *eventbox; GtkStyle *style; @@ -320,24 +322,26 @@ sp_desktop_widget_init (SPDesktopWidget *dtw) gtk_box_pack_end( GTK_BOX( dtw->vbox ), GTK_WIDGET(dtw->panels->gobj()), FALSE, TRUE, 0 ); } - hbox = gtk_hbox_new (FALSE, 0); - gtk_box_pack_end (GTK_BOX (dtw->vbox), hbox, TRUE, TRUE, 0); - gtk_widget_show (hbox); + dtw->hbox = gtk_hbox_new(FALSE, 0); + gtk_box_pack_end( GTK_BOX (dtw->vbox), dtw->hbox, TRUE, TRUE, 0 ); + gtk_widget_show(dtw->hbox); - dtw->aux_toolbox = sp_aux_toolbox_new (); + dtw->aux_toolbox = ToolboxFactory::createAuxToolbox(); gtk_box_pack_end (GTK_BOX (dtw->vbox), dtw->aux_toolbox, FALSE, TRUE, 0); - dtw->snap_toolbox = sp_snap_toolbox_new (); - gtk_box_pack_end (GTK_BOX (dtw->vbox), dtw->snap_toolbox, FALSE, TRUE, 0); + dtw->snap_toolbox = ToolboxFactory::createSnapToolbox(); + ToolboxFactory::setOrientation( dtw->snap_toolbox, GTK_ORIENTATION_VERTICAL ); + gtk_box_pack_end( GTK_BOX(dtw->hbox), dtw->snap_toolbox, FALSE, TRUE, 0 ); - dtw->commands_toolbox = sp_commands_toolbox_new (); + dtw->commands_toolbox = ToolboxFactory::createCommandsToolbox(); gtk_box_pack_end (GTK_BOX (dtw->vbox), dtw->commands_toolbox, FALSE, TRUE, 0); - dtw->tool_toolbox = sp_tool_toolbox_new (); - gtk_box_pack_start (GTK_BOX (hbox), dtw->tool_toolbox, FALSE, TRUE, 0); + dtw->tool_toolbox = ToolboxFactory::createToolToolbox(); + ToolboxFactory::setOrientation( dtw->tool_toolbox, GTK_ORIENTATION_VERTICAL ); + gtk_box_pack_start( GTK_BOX(dtw->hbox), dtw->tool_toolbox, FALSE, TRUE, 0 ); tbl = gtk_table_new (2, 3, FALSE); - gtk_box_pack_start (GTK_BOX (hbox), tbl, TRUE, TRUE, 1); + gtk_box_pack_start( GTK_BOX(dtw->hbox), tbl, TRUE, TRUE, 1 ); canvas_tbl = gtk_table_new (3, 3, FALSE); @@ -528,8 +532,10 @@ sp_desktop_widget_init (SPDesktopWidget *dtw) dtw->_tracker = ege_color_prof_tracker_new(GTK_WIDGET(dtw->layer_selector->gobj())); #if ENABLE_LCMS - { + bool fromDisplay = prefs->getBool( "/options/displayprofile/from_display"); + if ( fromDisplay ) { Glib::ustring id = Inkscape::colorprofile_get_display_id( 0, 0 ); + bool enabled = false; if ( dtw->canvas->cms_key ) { *(dtw->canvas->cms_key) = id; @@ -567,6 +573,8 @@ sp_desktop_widget_destroy (GtkObject *object) { SPDesktopWidget *dtw = SP_DESKTOP_WIDGET (object); + UXManager::getInstance()->delTrack(dtw); + if (dtw->desktop) { if ( watcher ) { watcher->remove(dtw); @@ -707,23 +715,22 @@ sp_desktop_widget_realize (GtkWidget *widget) dtw->desktop->set_display_area (d.x0, d.y0, d.x1, d.y1, 10); - sp_desktop_widget_update_namedview(dtw); + dtw->updateNamedview(); } /* This is just to provide access to common functionality from sp_desktop_widget_realize() above as well as from SPDesktop::change_document() */ -void -sp_desktop_widget_update_namedview (SPDesktopWidget *dtw) { - g_return_if_fail(dtw); - - /* Listen on namedview modification */ +void SPDesktopWidget::updateNamedview() +{ + // Listen on namedview modification // originally (prior to the sigc++ conversion) the signal was simply // connected twice rather than disconnecting the first connection - dtw->modified_connection.disconnect(); - dtw->modified_connection = dtw->desktop->namedview->connectModified(sigc::bind<2>(sigc::ptr_fun(&sp_desktop_widget_namedview_modified), dtw)); - sp_desktop_widget_namedview_modified (dtw->desktop->namedview, SP_OBJECT_MODIFIED_FLAG, dtw); + modified_connection.disconnect(); - dtw->updateTitle(SP_DOCUMENT_NAME (dtw->desktop->doc())); + modified_connection = desktop->namedview->connectModified(sigc::mem_fun(*this, &SPDesktopWidget::namedviewModified)); + namedviewModified(desktop->namedview, SP_OBJECT_MODIFIED_FLAG); + + updateTitle(SP_DOCUMENT_NAME (desktop->doc())); } /** @@ -790,6 +797,11 @@ void cms_adjust_toggled( GtkWidget */*button*/, gpointer data ) dtw->requestCanvasUpdate(); Inkscape::Preferences *prefs = Inkscape::Preferences::get(); prefs->setBool("/options/displayprofile/enable", down); + if (down) { + dtw->setMessage (Inkscape::NORMAL_MESSAGE, _("Color-managed display is <b>enabled</b> in this window")); + } else { + dtw->setMessage (Inkscape::NORMAL_MESSAGE, _("Color-managed display is <b>disabled</b> in this window")); + } } #endif // ENABLE_LCMS } @@ -900,8 +912,8 @@ SPDesktopWidget::shutdown() GTK_MESSAGE_WARNING, GTK_BUTTONS_NONE, _("<span weight=\"bold\" size=\"larger\">The file \"%s\" was saved with a format (%s) that may cause data loss!</span>\n\n" - "Do you want to save this file as an Inkscape SVG?"), - SP_DOCUMENT_NAME(doc), + "Do you want to save this file as Inkscape SVG?"), + SP_DOCUMENT_NAME(doc)? SP_DOCUMENT_NAME(doc) : "Unnamed", SP_MODULE_KEY_OUTPUT_SVG_INKSCAPE); // fix for bug 1767940: GTK_WIDGET_UNSET_FLAGS(GTK_WIDGET(GTK_MESSAGE_DIALOG(dialog)->label), GTK_CAN_FOCUS); @@ -1199,18 +1211,18 @@ sp_desktop_widget_fullscreen(SPDesktopWidget *dtw) /** * Hide whatever the user does not want to see in the window */ -void -sp_desktop_widget_layout (SPDesktopWidget *dtw) +void SPDesktopWidget::layoutWidgets() { + SPDesktopWidget *dtw = this; Glib::ustring pref_root; Inkscape::Preferences *prefs = Inkscape::Preferences::get(); if (dtw->desktop->is_focusMode()) { - pref_root = "/focus/"; + pref_root = "/focus/"; } else if (dtw->desktop->is_fullscreen()) { - pref_root = "/fullscreen/"; + pref_root = "/fullscreen/"; } else { - pref_root = "/window/"; + pref_root = "/window/"; } #ifndef GDK_WINDOWING_QUARTZ @@ -1228,17 +1240,17 @@ sp_desktop_widget_layout (SPDesktopWidget *dtw) } if (!prefs->getBool(pref_root + "snaptoolbox/state", true)) { - gtk_widget_hide_all (dtw->snap_toolbox); - } else { - gtk_widget_show_all (dtw->snap_toolbox); - } + gtk_widget_hide_all (dtw->snap_toolbox); + } else { + gtk_widget_show_all (dtw->snap_toolbox); + } if (!prefs->getBool(pref_root + "toppanel/state", true)) { gtk_widget_hide_all (dtw->aux_toolbox); } else { // we cannot just show_all because that will show all tools' panels; // this is a function from toolbox.cpp that shows only the current tool's panel - show_aux_toolbox (dtw->aux_toolbox); + ToolboxFactory::showAuxToolbox(dtw->aux_toolbox); } if (!prefs->getBool(pref_root + "toolbox/state", true)) { @@ -1336,8 +1348,57 @@ SPDesktopWidget::isToolboxButtonActive (const gchar* id) return isActive; } -SPViewWidget * -sp_desktop_widget_new (SPNamedView *namedview) +void SPDesktopWidget::setToolboxPosition(Glib::ustring const& id, GtkPositionType pos) +{ + // Note - later on these won't be individual member variables. + GtkWidget* toolbox = 0; + if (id == "ToolToolbar") { + toolbox = tool_toolbox; + } else if (id == "AuxToolbar") { + toolbox = aux_toolbox; + } else if (id == "CommandsToolbar") { + toolbox = commands_toolbox; + } else if (id == "SnapToolbar") { + toolbox = snap_toolbox; + } + + + if (toolbox) { + switch(pos) { + case GTK_POS_TOP: + case GTK_POS_BOTTOM: + if ( gtk_widget_is_ancestor(toolbox, hbox) ) { + gtk_widget_reparent( toolbox, vbox ); + gtk_box_set_child_packing(GTK_BOX(vbox), toolbox, FALSE, TRUE, 0, GTK_PACK_START); + } + ToolboxFactory::setOrientation(toolbox, GTK_ORIENTATION_HORIZONTAL); + break; + case GTK_POS_LEFT: + case GTK_POS_RIGHT: + if ( !gtk_widget_is_ancestor(toolbox, hbox) ) { + gtk_widget_reparent( toolbox, hbox ); + gtk_box_set_child_packing(GTK_BOX(hbox), toolbox, FALSE, TRUE, 0, GTK_PACK_START); + if (pos == GTK_POS_LEFT) { + gtk_box_reorder_child( GTK_BOX(hbox), toolbox, 0 ); + } + } + ToolboxFactory::setOrientation(toolbox, GTK_ORIENTATION_VERTICAL); + break; + } + } +} + + +SPViewWidget *sp_desktop_widget_new( SPNamedView *namedview ) +{ + SPDesktopWidget* dtw = SPDesktopWidget::createInstance(namedview); + + UXManager::getInstance()->addTrack(dtw); + + return SP_VIEW_WIDGET(dtw); +} + +SPDesktopWidget* SPDesktopWidget::createInstance(SPNamedView *namedview) { SPDesktopWidget *dtw = (SPDesktopWidget*)g_object_new(SP_TYPE_DESKTOP_WIDGET, NULL); @@ -1362,7 +1423,7 @@ sp_desktop_widget_new (SPNamedView *namedview) sp_view_widget_set_view (SP_VIEW_WIDGET (dtw), dtw->desktop); /* Listen on namedview modification */ - dtw->modified_connection = namedview->connectModified(sigc::bind<2>(sigc::ptr_fun(&sp_desktop_widget_namedview_modified), dtw)); + dtw->modified_connection = namedview->connectModified(sigc::mem_fun(*dtw, &SPDesktopWidget::namedviewModified)); dtw->layer_selector->setDesktop(dtw->desktop); @@ -1372,16 +1433,18 @@ sp_desktop_widget_new (SPNamedView *namedview) gtk_box_pack_start (GTK_BOX (dtw->vbox), dtw->menubar, FALSE, FALSE, 0); #endif - sp_desktop_widget_layout (dtw); + dtw->layoutWidgets(); - sp_tool_toolbox_set_desktop (dtw->tool_toolbox, dtw->desktop); - sp_aux_toolbox_set_desktop (dtw->aux_toolbox, dtw->desktop); - sp_commands_toolbox_set_desktop (dtw->commands_toolbox, dtw->desktop); - sp_snap_toolbox_set_desktop (dtw->snap_toolbox, dtw->desktop); + std::vector<GtkWidget *> toolboxes; + toolboxes.push_back(dtw->tool_toolbox); + toolboxes.push_back(dtw->aux_toolbox); + toolboxes.push_back(dtw->commands_toolbox); + toolboxes.push_back(dtw->snap_toolbox); + UXManager::getInstance()->connectToDesktop( toolboxes, dtw->desktop ); dtw->panels->setDesktop( dtw->desktop ); - return SP_VIEW_WIDGET (dtw); + return dtw; } void @@ -1436,22 +1499,22 @@ sp_desktop_widget_update_vruler (SPDesktopWidget *dtw) } -static void -sp_desktop_widget_namedview_modified (SPObject *obj, guint flags, SPDesktopWidget *dtw) +void SPDesktopWidget::namedviewModified(SPObject *obj, guint flags) { SPNamedView *nv=SP_NAMEDVIEW(obj); + if (flags & SP_OBJECT_MODIFIED_FLAG) { - dtw->dt2r = 1.0 / nv->doc_units->unittobase; - dtw->ruler_origin = Geom::Point(0,0); //nv->gridorigin; Why was the grid origin used here? + this->dt2r = 1.0 / nv->doc_units->unittobase; + this->ruler_origin = Geom::Point(0,0); //nv->gridorigin; Why was the grid origin used here? - sp_ruler_set_metric (GTK_RULER (dtw->vruler), nv->getDefaultMetric()); - sp_ruler_set_metric (GTK_RULER (dtw->hruler), nv->getDefaultMetric()); + sp_ruler_set_metric(GTK_RULER (this->vruler), nv->getDefaultMetric()); + sp_ruler_set_metric(GTK_RULER (this->hruler), nv->getDefaultMetric()); - gtk_tooltips_set_tip (dtw->tt, dtw->hruler_box, gettext(sp_unit_get_plural (nv->doc_units)), NULL); - gtk_tooltips_set_tip (dtw->tt, dtw->vruler_box, gettext(sp_unit_get_plural (nv->doc_units)), NULL); + gtk_tooltips_set_tip(this->tt, this->hruler_box, gettext(sp_unit_get_plural (nv->doc_units)), NULL); + gtk_tooltips_set_tip(this->tt, this->vruler_box, gettext(sp_unit_get_plural (nv->doc_units)), NULL); - sp_desktop_widget_update_rulers (dtw); - update_snap_toolbox(dtw->desktop, NULL, dtw->snap_toolbox); + sp_desktop_widget_update_rulers(this); + ToolboxFactory::updateSnapToolbox(this->desktop, 0, this->snap_toolbox); } } diff --git a/src/widgets/desktop-widget.h b/src/widgets/desktop-widget.h index 04146cac6..33f2a6ae7 100644 --- a/src/widgets/desktop-widget.h +++ b/src/widgets/desktop-widget.h @@ -5,6 +5,7 @@ * SPDesktopWidget: handling Gtk events on a desktop. * * Authors: + * Jon A. Cruz <jon@joncruz.org> (c) 2010 * John Bintz <jcoswell@coswellproductions.org> (c) 2006 * Ralf Stephan <ralf@ark.in-berlin.de> (c) 2005, distrib. under GPL2 * ? -2004 @@ -26,28 +27,23 @@ typedef struct _EgeColorProfTracker EgeColorProfTracker; -#define SP_TYPE_DESKTOP_WIDGET (sp_desktop_widget_get_type ()) +#define SP_TYPE_DESKTOP_WIDGET SPDesktopWidget::getType() #define SP_DESKTOP_WIDGET(o) (GTK_CHECK_CAST ((o), SP_TYPE_DESKTOP_WIDGET, SPDesktopWidget)) #define SP_DESKTOP_WIDGET_CLASS(k) (GTK_CHECK_CLASS_CAST ((k), SP_TYPE_DESKTOP_WIDGET, SPDesktopWidgetClass)) #define SP_IS_DESKTOP_WIDGET(o) (GTK_CHECK_TYPE ((o), SP_TYPE_DESKTOP_WIDGET)) #define SP_IS_DESKTOP_WIDGET_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), SP_TYPE_DESKTOP_WIDGET)) -GtkType sp_desktop_widget_get_type(); - void sp_desktop_widget_destroy (SPDesktopWidget* dtw); void sp_desktop_widget_show_decorations(SPDesktopWidget *dtw, gboolean show); void sp_desktop_widget_iconify(SPDesktopWidget *dtw); void sp_desktop_widget_maximize(SPDesktopWidget *dtw); void sp_desktop_widget_fullscreen(SPDesktopWidget *dtw); -void sp_desktop_widget_layout(SPDesktopWidget *dtw); void sp_desktop_widget_update_zoom(SPDesktopWidget *dtw); void sp_desktop_widget_update_rulers (SPDesktopWidget *dtw); void sp_desktop_widget_update_hruler (SPDesktopWidget *dtw); void sp_desktop_widget_update_vruler (SPDesktopWidget *dtw); -void sp_desktop_widget_update_namedview (SPDesktopWidget *dtw); - /* Show/hide rulers & scrollbars */ void sp_desktop_widget_toggle_rulers (SPDesktopWidget *dtw); void sp_desktop_widget_toggle_scrollbars (SPDesktopWidget *dtw); @@ -80,14 +76,14 @@ struct SPDesktopWidget { // The root vbox of the window layout. GtkWidget *vbox; + GtkWidget *hbox; + GtkWidget *menubar, *statusbar; Inkscape::UI::Dialogs::SwatchesPanel *panels; GtkWidget *hscrollbar, *vscrollbar, *vscrollbar_box; - GtkWidget *tool_toolbox, *aux_toolbox, *commands_toolbox, *snap_toolbox; - /* Rulers */ GtkWidget *hruler, *vruler; GtkWidget *hruler_box, *vruler_box; // eventboxes for setting tooltips @@ -129,8 +125,11 @@ struct SPDesktopWidget { { _dtw->updateTitle (uri); } virtual Gtk::Window* getWindow() { return _dtw->window; } - virtual void layout() - { sp_desktop_widget_layout (_dtw); } + + virtual void layout() { + _dtw->layoutWidgets(); + } + virtual void present() { _dtw->presentWindow(); } virtual void getGeometry (gint &x, gint &y, gint &w, gint &h) @@ -221,6 +220,7 @@ struct SPDesktopWidget { void setToolboxAdjustmentValue (gchar const * id, double value); void setToolboxSelectOneValue (gchar const * id, gint value); bool isToolboxButtonActive (gchar const *id); + void setToolboxPosition(Glib::ustring const& id, GtkPositionType pos); void setCoordinateStatus(Geom::Point p); void requestCanvasUpdate(); void requestCanvasUpdateAndWait(); @@ -231,6 +231,22 @@ struct SPDesktopWidget { Inkscape::UI::Widget::Dock* getDock(); + static GtkType getType(); + static SPDesktopWidget* createInstance(SPNamedView *namedview); + + void updateNamedview(); + +private: + GtkWidget *tool_toolbox; + GtkWidget *aux_toolbox; + GtkWidget *commands_toolbox,; + GtkWidget *snap_toolbox; + + static void init(SPDesktopWidget *widget); + void layoutWidgets(); + + void namedviewModified(SPObject *obj, guint flags); + }; /// The SPDesktopWidget vtable diff --git a/src/widgets/fill-style.cpp b/src/widgets/fill-style.cpp index 5e9d30bcd..3f2018b91 100644 --- a/src/widgets/fill-style.cpp +++ b/src/widgets/fill-style.cpp @@ -58,12 +58,12 @@ static void sp_fill_style_widget_change_selection ( SPWidget *spw, static void sp_fill_style_widget_update (SPWidget *spw); -static void sp_fill_style_widget_paint_mode_changed ( SPPaintSelector *psel, - SPPaintSelectorMode mode, - SPWidget *spw ); -static void sp_fill_style_widget_fillrule_changed ( SPPaintSelector *psel, - SPPaintSelectorFillRule mode, - SPWidget *spw ); +static void sp_fill_style_widget_paint_mode_changed( SPPaintSelector *psel, + SPPaintSelector::Mode mode, + SPWidget *spw ); +static void sp_fill_style_widget_fillrule_changed( SPPaintSelector *psel, + SPPaintSelector::FillRule mode, + SPWidget *spw ); static void sp_fill_style_widget_paint_dragged (SPPaintSelector *psel, SPWidget *spw ); static void sp_fill_style_widget_paint_changed (SPPaintSelector *psel, SPWidget *spw ); @@ -124,8 +124,8 @@ static void sp_fill_style_widget_construct( SPWidget *spw, SPPaintSelector */*psel*/ ) { #ifdef SP_FS_VERBOSE - g_print ( "Fill style widget constructed: inkscape %p repr %p\n", - spw->inkscape, spw->repr ); + g_print ( "Fill style widget constructed: inkscape %p\n", + spw->inkscape ); #endif if (spw->inkscape) { sp_fill_style_widget_update (spw); @@ -143,6 +143,9 @@ sp_fill_style_widget_modify_selection( SPWidget *spw, SP_OBJECT_PARENT_MODIFIED_FLAG | SP_OBJECT_STYLE_MODIFIED_FLAG) ) { +#ifdef SP_FS_VERBOSE + g_message("sp_fill_style_widget_modify_selection()"); +#endif sp_fill_style_widget_update (spw); } } @@ -184,51 +187,52 @@ sp_fill_style_widget_update (SPWidget *spw) // create temporary style SPStyle *query = sp_style_new (SP_ACTIVE_DOCUMENT); // query style from desktop into it. This returns a result flag and fills query with the style of subselection, if any, or selection - int result = sp_desktop_query_style (SP_ACTIVE_DESKTOP, query, QUERY_STYLE_PROPERTY_FILL); + int result = sp_desktop_query_style (SP_ACTIVE_DESKTOP, query, QUERY_STYLE_PROPERTY_FILL); switch (result) { case QUERY_STYLE_NOTHING: { /* No paint at all */ - sp_paint_selector_set_mode (psel, SP_PAINT_SELECTOR_MODE_EMPTY); + psel->setMode(SPPaintSelector::MODE_EMPTY); break; } case QUERY_STYLE_SINGLE: case QUERY_STYLE_MULTIPLE_AVERAGED: // TODO: treat this slightly differently, e.g. display "averaged" somewhere in paint selector - case QUERY_STYLE_MULTIPLE_SAME: + case QUERY_STYLE_MULTIPLE_SAME: { - SPPaintSelectorMode pselmode = sp_style_determine_paint_selector_mode (query, true); - sp_paint_selector_set_mode (psel, pselmode); + SPPaintSelector::Mode pselmode = SPPaintSelector::getModeForStyle(*query, true); + psel->setMode(pselmode); - sp_paint_selector_set_fillrule (psel, query->fill_rule.computed == ART_WIND_RULE_NONZERO? - SP_PAINT_SELECTOR_FILLRULE_NONZERO : SP_PAINT_SELECTOR_FILLRULE_EVENODD); + psel->setFillrule(query->fill_rule.computed == ART_WIND_RULE_NONZERO? + SPPaintSelector::FILLRULE_NONZERO : SPPaintSelector::FILLRULE_EVENODD); if (query->fill.set && query->fill.isColor()) { - sp_paint_selector_set_color_alpha (psel, &query->fill.value.color, SP_SCALE24_TO_FLOAT (query->fill_opacity.value)); + psel->setColorAlpha(query->fill.value.color, SP_SCALE24_TO_FLOAT(query->fill_opacity.value)); } else if (query->fill.set && query->fill.isPaintserver()) { - SPPaintServer *server = SP_STYLE_FILL_SERVER (query); + SPPaintServer *server = query->getFillPaintServer(); - if (SP_IS_LINEARGRADIENT (server)) { - SPGradient *vector = sp_gradient_get_vector (SP_GRADIENT (server), FALSE); - sp_paint_selector_set_gradient_linear (psel, vector); + if (server && SP_IS_GRADIENT(server) && SP_GRADIENT(server)->getVector()->isSwatch()) { + SPGradient *vector = SP_GRADIENT(server)->getVector(); + psel->setSwatch( vector ); + } else if (SP_IS_LINEARGRADIENT (server)) { + SPGradient *vector = SP_GRADIENT(server)->getVector(); + psel->setGradientLinear( vector ); SPLinearGradient *lg = SP_LINEARGRADIENT (server); - sp_paint_selector_set_gradient_properties (psel, - SP_GRADIENT_UNITS (lg), - SP_GRADIENT_SPREAD (lg)); + psel->setGradientProperties( SP_GRADIENT_UNITS(lg), + SP_GRADIENT_SPREAD(lg) ); } else if (SP_IS_RADIALGRADIENT (server)) { - SPGradient *vector = sp_gradient_get_vector (SP_GRADIENT (server), FALSE); - sp_paint_selector_set_gradient_radial (psel, vector); + SPGradient *vector = SP_GRADIENT(server)->getVector(); + psel->setGradientRadial( vector ); SPRadialGradient *rg = SP_RADIALGRADIENT (server); - sp_paint_selector_set_gradient_properties (psel, - SP_GRADIENT_UNITS (rg), - SP_GRADIENT_SPREAD (rg)); + psel->setGradientProperties( SP_GRADIENT_UNITS (rg), + SP_GRADIENT_SPREAD (rg) ); } else if (SP_IS_PATTERN (server)) { SPPattern *pat = pattern_getroot (SP_PATTERN (server)); - sp_update_pattern_list (psel, pat); + psel->updatePatternList( pat ); } } break; @@ -236,7 +240,7 @@ sp_fill_style_widget_update (SPWidget *spw) case QUERY_STYLE_MULTIPLE_DIFFERENT: { - sp_paint_selector_set_mode (psel, SP_PAINT_SELECTOR_MODE_MULTIPLE); + psel->setMode(SPPaintSelector::MODE_MULTIPLE); break; } } @@ -249,23 +253,26 @@ sp_fill_style_widget_update (SPWidget *spw) static void -sp_fill_style_widget_paint_mode_changed ( SPPaintSelector *psel, - SPPaintSelectorMode /*mode*/, - SPWidget *spw ) +sp_fill_style_widget_paint_mode_changed( SPPaintSelector *psel, + SPPaintSelector::Mode /*mode*/, + SPWidget *spw ) { if (g_object_get_data (G_OBJECT (spw), "update")) return; +#ifdef SP_FS_VERBOSE + g_message("sp_fill_style_widget_paint_mode_changed(psel:%p, mode, spw:%p)", psel, spw); +#endif + /* TODO: Does this work? */ /* TODO: Not really, here we have to get old color back from object */ /* Instead of relying on paint widget having meaningful colors set */ sp_fill_style_widget_paint_changed (psel, spw); } -static void -sp_fill_style_widget_fillrule_changed ( SPPaintSelector */*psel*/, - SPPaintSelectorFillRule mode, - SPWidget *spw ) +static void sp_fill_style_widget_fillrule_changed( SPPaintSelector */*psel*/, + SPPaintSelector::FillRule mode, + SPWidget *spw ) { if (g_object_get_data (G_OBJECT (spw), "update")) return; @@ -273,13 +280,13 @@ sp_fill_style_widget_fillrule_changed ( SPPaintSelector */*psel*/, SPDesktop *desktop = SP_ACTIVE_DESKTOP; SPCSSAttr *css = sp_repr_css_attr_new (); - sp_repr_css_set_property (css, "fill-rule", mode == SP_PAINT_SELECTOR_FILLRULE_EVENODD? "evenodd":"nonzero"); + sp_repr_css_set_property(css, "fill-rule", mode == SPPaintSelector::FILLRULE_EVENODD? "evenodd":"nonzero"); sp_desktop_set_style (desktop, css); sp_repr_css_attr_unref (css); - sp_document_done (SP_ACTIVE_DOCUMENT, SP_VERB_DIALOG_FILL_STROKE, + sp_document_done (SP_ACTIVE_DOCUMENT, SP_VERB_DIALOG_FILL_STROKE, _("Change fill rule")); } @@ -305,8 +312,8 @@ sp_fill_style_widget_paint_dragged (SPPaintSelector *psel, SPWidget *spw) } if (g_object_get_data (G_OBJECT (spw), "local")) { - // previous local flag not cleared yet; - // this means dragged events come too fast, so we better skip this one to speed up display + // previous local flag not cleared yet; + // this means dragged events come too fast, so we better skip this one to speed up display // (it's safe to do this in any case) return; } @@ -315,11 +322,11 @@ sp_fill_style_widget_paint_dragged (SPPaintSelector *psel, SPWidget *spw) switch (psel->mode) { - case SP_PAINT_SELECTOR_MODE_COLOR_RGB: - case SP_PAINT_SELECTOR_MODE_COLOR_CMYK: + case SPPaintSelector::MODE_COLOR_RGB: + case SPPaintSelector::MODE_COLOR_CMYK: { - sp_paint_selector_set_flat_color (psel, SP_ACTIVE_DESKTOP, "fill", "fill-opacity"); - sp_document_maybe_done (sp_desktop_document(SP_ACTIVE_DESKTOP), undo_label, SP_VERB_DIALOG_FILL_STROKE, + psel->setFlatColor( SP_ACTIVE_DESKTOP, "fill", "fill-opacity" ); + sp_document_maybe_done (sp_desktop_document(SP_ACTIVE_DESKTOP), undo_label, SP_VERB_DIALOG_FILL_STROKE, _("Set fill color")); g_object_set_data (G_OBJECT (spw), "local", GINT_TO_POINTER (TRUE)); // local change, do not update from selection break; @@ -346,6 +353,9 @@ static void sp_fill_style_widget_paint_changed ( SPPaintSelector *psel, SPWidget *spw ) { +#ifdef SP_FS_VERBOSE + g_message("sp_fill_style_widget_paint_changed(psel:%p, spw:%p)", psel, spw); +#endif if (g_object_get_data (G_OBJECT (spw), "update")) { return; } @@ -362,17 +372,17 @@ sp_fill_style_widget_paint_changed ( SPPaintSelector *psel, switch (psel->mode) { - case SP_PAINT_SELECTOR_MODE_EMPTY: + case SPPaintSelector::MODE_EMPTY: // This should not happen. g_warning ( "file %s: line %d: Paint %d should not emit 'changed'", __FILE__, __LINE__, psel->mode); break; - case SP_PAINT_SELECTOR_MODE_MULTIPLE: + case SPPaintSelector::MODE_MULTIPLE: // This happens when you switch multiple objects with different gradients to flat color; // nothing to do here. break; - case SP_PAINT_SELECTOR_MODE_NONE: + case SPPaintSelector::MODE_NONE: { SPCSSAttr *css = sp_repr_css_attr_new (); sp_repr_css_set_property (css, "fill", "none"); @@ -381,18 +391,18 @@ sp_fill_style_widget_paint_changed ( SPPaintSelector *psel, sp_repr_css_attr_unref (css); - sp_document_done (document, SP_VERB_DIALOG_FILL_STROKE, + sp_document_done (document, SP_VERB_DIALOG_FILL_STROKE, _("Remove fill")); break; } - case SP_PAINT_SELECTOR_MODE_COLOR_RGB: - case SP_PAINT_SELECTOR_MODE_COLOR_CMYK: + case SPPaintSelector::MODE_COLOR_RGB: + case SPPaintSelector::MODE_COLOR_CMYK: { // FIXME: fix for GTK breakage, see comment in SelectedStyle::on_opacity_changed; here it results in losing release events sp_canvas_force_full_redraw_after_interruptions(sp_desktop_canvas(desktop), 0); - sp_paint_selector_set_flat_color (psel, desktop, "fill", "fill-opacity"); + psel->setFlatColor( desktop, "fill", "fill-opacity" ); sp_document_maybe_done (sp_desktop_document(desktop), undo_label, SP_VERB_DIALOG_FILL_STROKE, _("Set fill color")); // resume interruptibility @@ -407,10 +417,11 @@ sp_fill_style_widget_paint_changed ( SPPaintSelector *psel, break; } - case SP_PAINT_SELECTOR_MODE_GRADIENT_LINEAR: - case SP_PAINT_SELECTOR_MODE_GRADIENT_RADIAL: + case SPPaintSelector::MODE_GRADIENT_LINEAR: + case SPPaintSelector::MODE_GRADIENT_RADIAL: + case SPPaintSelector::MODE_SWATCH: if (items) { - SPGradientType const gradient_type = ( psel->mode == SP_PAINT_SELECTOR_MODE_GRADIENT_LINEAR + SPGradientType const gradient_type = ( psel->mode != SPPaintSelector::MODE_GRADIENT_RADIAL ? SP_GRADIENT_TYPE_LINEAR : SP_GRADIENT_TYPE_RADIAL ); @@ -418,7 +429,7 @@ sp_fill_style_widget_paint_changed ( SPPaintSelector *psel, SPCSSAttr *css = sp_repr_css_attr_new(); sp_repr_css_set_property(css, "fill-opacity", "1.0"); - SPGradient *vector = sp_paint_selector_get_gradient_vector(psel); + SPGradient *vector = psel->getGradientVector(); if (!vector) { /* No vector in paint selector should mean that we just changed mode */ @@ -456,22 +467,22 @@ sp_fill_style_widget_paint_changed ( SPPaintSelector *psel, sp_repr_css_change_recursive (SP_OBJECT_REPR (i->data), css, "style"); SPGradient *gr = sp_item_set_gradient(SP_ITEM(i->data), vector, gradient_type, true); - sp_gradient_selector_attrs_to_gradient (gr, psel); + psel->pushAttrsToGradient( gr ); } } sp_repr_css_attr_unref (css); - sp_document_done (document, SP_VERB_DIALOG_FILL_STROKE, + sp_document_done (document, SP_VERB_DIALOG_FILL_STROKE, _("Set gradient on fill")); } break; - case SP_PAINT_SELECTOR_MODE_PATTERN: + case SPPaintSelector::MODE_PATTERN: if (items) { - SPPattern *pattern = sp_paint_selector_get_pattern (psel); + SPPattern *pattern = psel->getPattern(); if (!pattern) { /* No Pattern in paint selector should mean that we just @@ -509,14 +520,14 @@ sp_fill_style_widget_paint_changed ( SPPaintSelector *psel, } // end if - sp_document_done (document, SP_VERB_DIALOG_FILL_STROKE, + sp_document_done (document, SP_VERB_DIALOG_FILL_STROKE, _("Set pattern on fill")); } // end if break; - case SP_PAINT_SELECTOR_MODE_UNSET: + case SPPaintSelector::MODE_UNSET: if (items) { SPCSSAttr *css = sp_repr_css_attr_new (); sp_repr_css_unset_property (css, "fill"); @@ -524,7 +535,7 @@ sp_fill_style_widget_paint_changed ( SPPaintSelector *psel, sp_desktop_set_style (desktop, css); sp_repr_css_attr_unref (css); - sp_document_done (document, SP_VERB_DIALOG_FILL_STROKE, + sp_document_done (document, SP_VERB_DIALOG_FILL_STROKE, _("Unset fill")); } break; diff --git a/src/widgets/gradient-selector.cpp b/src/widgets/gradient-selector.cpp index f24a6781b..bc2413730 100644 --- a/src/widgets/gradient-selector.cpp +++ b/src/widgets/gradient-selector.cpp @@ -4,9 +4,11 @@ * Authors: * Lauris Kaplinski <lauris@kaplinski.com> * bulia byak <buliabyak@users.sf.net> + * Jon A. Cruz <jon@joncruz.org> * * Copyright (C) 2001-2002 Lauris Kaplinski * Copyright (C) 2001 Ximian, Inc. + * Copyright (C) 2010 Jon A. Cruz * * Released under GNU GPL, read the file 'COPYING' for more information */ @@ -118,9 +120,9 @@ sp_gradient_selector_class_init (SPGradientSelectorClass *klass) static void sp_gradient_selector_init (SPGradientSelector *sel) { - GtkWidget *hb, *l, *m, *mi; + GtkWidget *hb, *m, *mi; - sel->mode = SP_GRADIENT_SELECTOR_MODE_LINEAR; + sel->mode = SPGradientSelector::MODE_LINEAR; sel->gradientUnits = SP_GRADIENT_UNITS_USERSPACEONUSE; sel->gradientSpread = SP_GRADIENT_SPREAD_PAD; @@ -180,9 +182,9 @@ sp_gradient_selector_init (SPGradientSelector *sel) gtk_option_menu_set_menu (GTK_OPTION_MENU (sel->spread), m); - l = gtk_label_new (_("Repeat:")); - gtk_widget_show (l); - gtk_box_pack_end (GTK_BOX (hb), l, FALSE, FALSE, 4); + sel->spreadLbl = gtk_label_new (_("Repeat:")); + gtk_widget_show(sel->spreadLbl); + gtk_box_pack_end(GTK_BOX(hb), sel->spreadLbl, FALSE, FALSE, 4); } static void @@ -206,77 +208,78 @@ sp_gradient_selector_new (void) return (GtkWidget *) sel; } -void -sp_gradient_selector_set_mode (SPGradientSelector *sel, guint mode) +void SPGradientSelector::setMode(SelectorMode mode) { - g_return_if_fail (sel != NULL); - g_return_if_fail (SP_IS_GRADIENT_SELECTOR (sel)); - - sel->mode = mode; + if (mode != this->mode) { + this->mode = mode; + if (mode == MODE_SWATCH) { + if (spread) { + GtkWidget *parent = gtk_widget_get_parent(spread); + if (parent) { + gtk_container_remove(GTK_CONTAINER(parent), spread); + spread = 0; + } + } + if (spreadLbl) { + GtkWidget *parent = gtk_widget_get_parent(spreadLbl); + if (parent) { + gtk_container_remove(GTK_CONTAINER(parent), spreadLbl); + spreadLbl = 0; + } + } + + SPGradientVectorSelector* vs = SP_GRADIENT_VECTOR_SELECTOR(vectors); + vs->setSwatched(); + } + } } -void -sp_gradient_selector_set_units (SPGradientSelector *sel, guint units) +void SPGradientSelector::setUnits(SPGradientUnits units) { - g_return_if_fail (sel != NULL); - g_return_if_fail (SP_IS_GRADIENT_SELECTOR (sel)); - - sel->gradientUnits = (SPGradientUnits)units; + gradientUnits = units; } -void -sp_gradient_selector_set_spread (SPGradientSelector *sel, guint spread) +void SPGradientSelector::setSpread(SPGradientSpread spread) { - g_return_if_fail (sel != NULL); - g_return_if_fail (SP_IS_GRADIENT_SELECTOR (sel)); + gradientSpread = spread; - sel->gradientSpread = (SPGradientSpread)spread; - - gtk_option_menu_set_history (GTK_OPTION_MENU (sel->spread), sel->gradientSpread); + gtk_option_menu_set_history(GTK_OPTION_MENU(this->spread), gradientSpread); } -SPGradientUnits -sp_gradient_selector_get_units (SPGradientSelector *sel) +SPGradientUnits SPGradientSelector::getUnits() { - return (SPGradientUnits) sel->gradientUnits; + return gradientUnits; } -SPGradientSpread -sp_gradient_selector_get_spread (SPGradientSelector *sel) +SPGradientSpread SPGradientSelector::getSpread() { - return (SPGradientSpread) sel->gradientSpread; + return gradientSpread; } -void -sp_gradient_selector_set_vector (SPGradientSelector *sel, SPDocument *doc, SPGradient *vector) +void SPGradientSelector::setVector(SPDocument *doc, SPGradient *vector) { - g_return_if_fail (sel != NULL); - g_return_if_fail (SP_IS_GRADIENT_SELECTOR (sel)); - g_return_if_fail (!vector || SP_IS_GRADIENT (vector)); - g_return_if_fail (!vector || (SP_OBJECT_DOCUMENT (vector) == doc)); + g_return_if_fail(!vector || SP_IS_GRADIENT(vector)); + g_return_if_fail(!vector || (SP_OBJECT_DOCUMENT(vector) == doc)); - if (vector && !SP_GRADIENT_HAS_STOPS (vector)) + if (vector && !SP_GRADIENT_HAS_STOPS(vector)) { return; + } - sp_gradient_vector_selector_set_gradient (SP_GRADIENT_VECTOR_SELECTOR (sel->vectors), doc, vector); + sp_gradient_vector_selector_set_gradient(SP_GRADIENT_VECTOR_SELECTOR(vectors), doc, vector); if (vector) { - gtk_widget_set_sensitive (sel->edit, TRUE); - gtk_widget_set_sensitive (sel->add, TRUE); + gtk_widget_set_sensitive(edit, TRUE); + gtk_widget_set_sensitive(add, TRUE); } else { - gtk_widget_set_sensitive (sel->edit, FALSE); - gtk_widget_set_sensitive (sel->add, (doc != NULL)); + gtk_widget_set_sensitive(edit, FALSE); + gtk_widget_set_sensitive(add, (doc != NULL)); } } -SPGradient * -sp_gradient_selector_get_vector (SPGradientSelector *sel) +SPGradient *SPGradientSelector::getVector() { - if (sel == NULL || !SP_IS_GRADIENT_SELECTOR (sel)) - return NULL; - /* fixme: */ - return SP_GRADIENT_VECTOR_SELECTOR (sel->vectors)->gr; + return SP_GRADIENT_VECTOR_SELECTOR(vectors)->gr; } static void @@ -287,7 +290,7 @@ sp_gradient_selector_vector_set (SPGradientVectorSelector */*gvs*/, SPGradient * if (!blocked) { blocked = TRUE; gr = sp_gradient_ensure_vector_normalized (gr); - sp_gradient_selector_set_vector (sel, (gr) ? SP_OBJECT_DOCUMENT (gr) : NULL, gr); + sel->setVector((gr) ? SP_OBJECT_DOCUMENT (gr) : 0, gr); g_signal_emit (G_OBJECT (sel), signals[CHANGED], 0, gr); blocked = FALSE; } diff --git a/src/widgets/gradient-selector.h b/src/widgets/gradient-selector.h index e68dfecfc..25f561a6e 100644 --- a/src/widgets/gradient-selector.h +++ b/src/widgets/gradient-selector.h @@ -6,16 +6,21 @@ * * Authors: * Lauris Kaplinski <lauris@kaplinski.com> + * Jon A. Cruz <jon@joncruz.org> * * Copyright (C) 2001-2002 Lauris Kaplinski * Copyright (C) 2001 Ximian, Inc. + * Copyright (C) 2010 Jon A. Cruz * * Released under GNU GPL, read the file 'COPYING' for more information */ #include <glib.h> +#include <gtk/gtkvbox.h> +#include "sp-gradient.h" #include "sp-gradient-spread.h" #include "sp-gradient-units.h" + class SPGradient; #define SP_TYPE_GRADIENT_SELECTOR (sp_gradient_selector_get_type ()) @@ -24,32 +29,43 @@ class SPGradient; #define SP_IS_GRADIENT_SELECTOR(o) (GTK_CHECK_TYPE ((o), SP_TYPE_GRADIENT_SELECTOR)) #define SP_IS_GRADIENT_SELECTOR_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), SP_TYPE_GRADIENT_SELECTOR)) -#include <libnr/nr-forward.h> -#include <gtk/gtkvbox.h> -#include "../forward.h" -#include <sp-gradient.h> -enum { - SP_GRADIENT_SELECTOR_MODE_LINEAR, - SP_GRADIENT_SELECTOR_MODE_RADIAL -}; struct SPGradientSelector { GtkVBox vbox; - guint mode : 1; + enum SelectorMode { + MODE_LINEAR, + MODE_RADIAL, + MODE_SWATCH + }; + + SelectorMode mode; - SPGradientUnits gradientUnits : 1; - SPGradientSpread gradientSpread : 2; + SPGradientUnits gradientUnits; + SPGradientSpread gradientSpread; /* Vector selector */ GtkWidget *vectors; + /* Editing buttons */ - GtkWidget *edit, *add; + GtkWidget *edit; + GtkWidget *add; + /* Position widget */ GtkWidget *position; + /* Spread selector */ GtkWidget *spread; + GtkWidget *spreadLbl; + + void setMode(SelectorMode mode); + void setUnits(SPGradientUnits units); + void setSpread(SPGradientSpread spread); + void setVector(SPDocument *doc, SPGradient *vector); + SPGradientUnits getUnits(); + SPGradientSpread getSpread(); + SPGradient *getVector(); }; struct SPGradientSelectorClass { @@ -65,17 +81,8 @@ GType sp_gradient_selector_get_type(void); GtkWidget *sp_gradient_selector_new (void); -void sp_gradient_selector_set_mode (SPGradientSelector *sel, guint mode); -void sp_gradient_selector_set_units (SPGradientSelector *sel, guint units); -void sp_gradient_selector_set_spread (SPGradientSelector *sel, guint spread); -void sp_gradient_selector_set_vector (SPGradientSelector *sel, SPDocument *doc, SPGradient *vector); void sp_gradient_selector_set_bbox (SPGradientSelector *sel, gdouble x0, gdouble y0, gdouble x1, gdouble y1); -SPGradientUnits sp_gradient_selector_get_units (SPGradientSelector *sel); -SPGradientSpread sp_gradient_selector_get_spread (SPGradientSelector *sel); - -SPGradient *sp_gradient_selector_get_vector (SPGradientSelector *sel); - #endif // SEEN_GRADIENT_SELECTOR_H diff --git a/src/widgets/gradient-toolbar.cpp b/src/widgets/gradient-toolbar.cpp index ddd9fd96a..077e038e7 100644 --- a/src/widgets/gradient-toolbar.cpp +++ b/src/widgets/gradient-toolbar.cpp @@ -164,8 +164,7 @@ gr_prepare_label (SPObject *obj) return g_strdup_printf ("<small>%s</small>", id); } -GtkWidget * -gr_vector_list (SPDesktop *desktop, bool selection_empty, SPGradient *gr_selected, bool gr_multi) +GtkWidget *gr_vector_list(SPDesktop *desktop, bool selection_empty, SPGradient *gr_selected, bool gr_multi) { SPDocument *document = sp_desktop_document (desktop); @@ -175,7 +174,8 @@ gr_vector_list (SPDesktop *desktop, bool selection_empty, SPGradient *gr_selecte GSList *gl = NULL; const GSList *gradients = sp_document_get_resource_list (document, "gradient"); for (const GSList *i = gradients; i != NULL; i = i->next) { - if (SP_GRADIENT_HAS_STOPS (i->data)) { + SPGradient *grad = SP_GRADIENT(i->data); + if (SP_GRADIENT_HAS_STOPS(grad) && !grad->isSolid()) { gl = g_slist_prepend (gl, i->data); } } @@ -185,6 +185,7 @@ gr_vector_list (SPDesktop *desktop, bool selection_empty, SPGradient *gr_selecte guint idx = 0; if (!gl) { + // The document has no gradients GtkWidget *l = gtk_label_new(""); gtk_label_set_markup (GTK_LABEL(l), _("<small>No gradients</small>")); GtkWidget *i = gtk_menu_item_new (); @@ -194,6 +195,7 @@ gr_vector_list (SPDesktop *desktop, bool selection_empty, SPGradient *gr_selecte gtk_menu_append (GTK_MENU (m), i); gtk_widget_set_sensitive (om, FALSE); } else if (selection_empty) { + // Document has gradients, but nothing is currently selected. GtkWidget *l = gtk_label_new(""); gtk_label_set_markup (GTK_LABEL(l), _("<small>Nothing selected</small>")); GtkWidget *i = gtk_menu_item_new (); @@ -268,29 +270,37 @@ gr_vector_list (SPDesktop *desktop, bool selection_empty, SPGradient *gr_selecte } -void -gr_read_selection (Inkscape::Selection *selection, GrDrag *drag, SPGradient **gr_selected, bool *gr_multi, SPGradientSpread *spr_selected, bool *spr_multi) +void gr_read_selection( Inkscape::Selection *selection, + GrDrag *drag, + SPGradient *&gr_selected, + bool &gr_multi, + SPGradientSpread &spr_selected, + bool &spr_multi ) { if (drag && drag->selected) { // GRADIENTFIXME: make this work for more than one selected dragger? - GrDragger *dragger = (GrDragger*) drag->selected->data; - for (GSList const* i = dragger->draggables; i != NULL; i = i->next) { // for all draggables of dragger - GrDraggable *draggable = (GrDraggable *) i->data; - SPGradient *gradient = sp_item_gradient_get_vector (draggable->item, draggable->fill_or_stroke); - SPGradientSpread spread = sp_item_gradient_get_spread (draggable->item, draggable->fill_or_stroke); + GrDragger *dragger = static_cast<GrDragger*>(drag->selected->data); + for (GSList const* i = dragger->draggables; i; i = i->next) { // for all draggables of dragger + GrDraggable *draggable = static_cast<GrDraggable *>(i->data); + SPGradient *gradient = sp_item_gradient_get_vector(draggable->item, draggable->fill_or_stroke); + SPGradientSpread spread = sp_item_gradient_get_spread(draggable->item, draggable->fill_or_stroke); + + if (gradient && gradient->isSolid()) { + gradient = 0; + } - if (gradient != *gr_selected) { - if (*gr_selected != NULL) { - *gr_multi = true; + if (gradient && (gradient != gr_selected)) { + if (gr_selected) { + gr_multi = true; } else { - *gr_selected = gradient; + gr_selected = gradient; } } - if (spread != *spr_selected) { - if (*spr_selected != INT_MAX) { - *spr_multi = true; + if (spread != spr_selected) { + if (spr_selected != INT_MAX) { + spr_multi = true; } else { - *spr_selected = spread; + spr_selected = spread; } } } @@ -298,48 +308,59 @@ gr_read_selection (Inkscape::Selection *selection, GrDrag *drag, SPGradient **gr } // If no selected dragger, read desktop selection - for (GSList const* i = selection->itemList(); i != NULL; i = i->next) { + for (GSList const* i = selection->itemList(); i; i = i->next) { SPItem *item = SP_ITEM(i->data); SPStyle *style = SP_OBJECT_STYLE (item); if (style && (style->fill.isPaintserver())) { SPObject *server = SP_OBJECT_STYLE_FILL_SERVER (item); - if (SP_IS_GRADIENT (server)) { - SPGradient *gradient = sp_gradient_get_vector (SP_GRADIENT (server), false); + if (SP_IS_GRADIENT(server)) { + SPGradient *gradient = SP_GRADIENT(server)->getVector(); SPGradientSpread spread = sp_gradient_get_spread (SP_GRADIENT (server)); - if (gradient != *gr_selected) { - if (*gr_selected != NULL) { - *gr_multi = true; + + if (gradient && gradient->isSolid()) { + gradient = 0; + } + + if (gradient && (gradient != gr_selected)) { + if (gr_selected) { + gr_multi = true; } else { - *gr_selected = gradient; + gr_selected = gradient; } } - if (spread != *spr_selected) { - if (*spr_selected != INT_MAX) { - *spr_multi = true; + if (spread != spr_selected) { + if (spr_selected != INT_MAX) { + spr_multi = true; } else { - *spr_selected = spread; + spr_selected = spread; } } } } if (style && (style->stroke.isPaintserver())) { SPObject *server = SP_OBJECT_STYLE_STROKE_SERVER (item); - if (SP_IS_GRADIENT (server)) { - SPGradient *gradient = sp_gradient_get_vector (SP_GRADIENT (server), false); + if (SP_IS_GRADIENT(server)) { + SPGradient *gradient = SP_GRADIENT(server)->getVector(); SPGradientSpread spread = sp_gradient_get_spread (SP_GRADIENT (server)); - if (gradient != *gr_selected) { - if (*gr_selected != NULL) { - *gr_multi = true; + + if (gradient && gradient->isSolid()) { + gradient = 0; + + } + + if (gradient && (gradient != gr_selected)) { + if (gr_selected) { + gr_multi = true; } else { - *gr_selected = gradient; + gr_selected = gradient; } } - if (spread != *spr_selected) { - if (*spr_selected != INT_MAX) { - *spr_multi = true; + if (spread != spr_selected) { + if (spr_selected != INT_MAX) { + spr_multi = true; } else { - *spr_selected = spread; + spr_selected = spread; } } } @@ -347,41 +368,41 @@ gr_read_selection (Inkscape::Selection *selection, GrDrag *drag, SPGradient **gr } } -static void -gr_tb_selection_changed (Inkscape::Selection *, gpointer data) +static void gr_tb_selection_changed(Inkscape::Selection * /*selection*/, gpointer data) { - GtkWidget *widget = (GtkWidget *) data; - - SPDesktop *desktop = (SPDesktop *) g_object_get_data (G_OBJECT(widget), "desktop"); - if (!desktop) - return; + GtkWidget *widget = GTK_WIDGET(data); + + SPDesktop *desktop = static_cast<SPDesktop *>(g_object_get_data(G_OBJECT(widget), "desktop")); + if (desktop) { + Inkscape::Selection *selection = sp_desktop_selection(desktop); // take from desktop, not from args + if (selection) { + SPEventContext *ev = sp_desktop_event_context(desktop); + + GtkWidget *om = (GtkWidget *) g_object_get_data(G_OBJECT(widget), "menu"); + if (om) { + gtk_widget_destroy(om); + om = 0; + } - Inkscape::Selection *selection = sp_desktop_selection (desktop); // take from desktop, not from args - if (!selection) - return; + SPGradient *gr_selected = 0; + bool gr_multi = false; - SPEventContext *ev = sp_desktop_event_context (desktop); + SPGradientSpread spr_selected = static_cast<SPGradientSpread>(INT_MAX); // meaning undefined + bool spr_multi = false; - GtkWidget *om = (GtkWidget *) g_object_get_data (G_OBJECT (widget), "menu"); - if (om) gtk_widget_destroy (om); + gr_read_selection(selection, ev ? ev->get_drag() : 0, gr_selected, gr_multi, spr_selected, spr_multi); - SPGradient *gr_selected = NULL; - bool gr_multi = false; + om = gr_vector_list(desktop, selection->isEmpty(), gr_selected, gr_multi); + g_object_set_data(G_OBJECT(widget), "menu", om); - SPGradientSpread spr_selected = (SPGradientSpread) INT_MAX; // meaning undefined - bool spr_multi = false; + GtkWidget *buttons = (GtkWidget *) g_object_get_data(G_OBJECT(widget), "buttons"); + gtk_widget_set_sensitive(buttons, (gr_selected && !gr_multi)); - gr_read_selection (selection, ev? ev->get_drag() : NULL, &gr_selected, &gr_multi, &spr_selected, &spr_multi); - - om = gr_vector_list (desktop, selection->isEmpty(), gr_selected, gr_multi); - g_object_set_data (G_OBJECT (widget), "menu", om); + gtk_box_pack_start(GTK_BOX(widget), om, TRUE, TRUE, 0); - GtkWidget *buttons = (GtkWidget *) g_object_get_data (G_OBJECT(widget), "buttons"); - gtk_widget_set_sensitive (buttons, (gr_selected && !gr_multi)); - - gtk_box_pack_start (GTK_BOX (widget), om, TRUE, TRUE, 0); - - gtk_widget_show_all (widget); + gtk_widget_show_all(widget); + } + } } static void @@ -431,8 +452,7 @@ gr_edit (GtkWidget */*button*/, GtkWidget *widget) } } -GtkWidget * -gr_change_widget (SPDesktop *desktop) +GtkWidget * gr_change_widget(SPDesktop *desktop) { Inkscape::Selection *selection = sp_desktop_selection (desktop); SPDocument *document = sp_desktop_document (desktop); @@ -446,7 +466,7 @@ gr_change_widget (SPDesktop *desktop) GtkTooltips *tt = gtk_tooltips_new(); - gr_read_selection (selection, ev? ev->get_drag() : NULL, &gr_selected, &gr_multi, &spr_selected, &spr_multi); + gr_read_selection (selection, ev? ev->get_drag() : 0, gr_selected, gr_multi, spr_selected, spr_multi); GtkWidget *widget = gtk_hbox_new(FALSE, FALSE); gtk_object_set_data(GTK_OBJECT(widget), "dtw", desktop->canvas); diff --git a/src/widgets/gradient-vector.cpp b/src/widgets/gradient-vector.cpp index c884604a2..7bfe27310 100644 --- a/src/widgets/gradient-vector.cpp +++ b/src/widgets/gradient-vector.cpp @@ -5,12 +5,14 @@ * Lauris Kaplinski <lauris@kaplinski.com> * bulia byak <buliabyak@users.sf.net> * MenTaLguY <mental@rydia.net> + * Jon A. Cruz <jon@joncruz.org> * * Copyright (C) 2001-2002 Lauris Kaplinski * Copyright (C) 2001 Ximian, Inc. * Copyright (C) 2004 Monash University * Copyright (C) 2004 David Turner * Copyright (C) 2006 MenTaLguY + * Copyright (C) 2010 Jon A. Cruz * * Released under GNU GPL, read the file 'COPYING' for more information * @@ -46,16 +48,16 @@ enum { LAST_SIGNAL }; -static void sp_gradient_vector_selector_class_init (SPGradientVectorSelectorClass *klass); -static void sp_gradient_vector_selector_init (SPGradientVectorSelector *gvs); -static void sp_gradient_vector_selector_destroy (GtkObject *object); +static void sp_gradient_vector_selector_class_init(SPGradientVectorSelectorClass *klass); +static void sp_gradient_vector_selector_init(SPGradientVectorSelector *gvs); +static void sp_gradient_vector_selector_destroy(GtkObject *object); -static void sp_gvs_gradient_release (SPObject *obj, SPGradientVectorSelector *gvs); -static void sp_gvs_defs_release (SPObject *defs, SPGradientVectorSelector *gvs); -static void sp_gvs_defs_modified (SPObject *defs, guint flags, SPGradientVectorSelector *gvs); +static void sp_gvs_gradient_release(SPObject *obj, SPGradientVectorSelector *gvs); +static void sp_gvs_defs_release(SPObject *defs, SPGradientVectorSelector *gvs); +static void sp_gvs_defs_modified(SPObject *defs, guint flags, SPGradientVectorSelector *gvs); -static void sp_gvs_rebuild_gui_full (SPGradientVectorSelector *gvs); -static void sp_gvs_gradient_activate (GtkMenuItem *mi, SPGradientVectorSelector *gvs); +static void sp_gvs_rebuild_gui_full(SPGradientVectorSelector *gvs); +static void sp_gvs_gradient_activate(GtkMenuItem *mi, SPGradientVectorSelector *gvs); static GtkVBoxClass *parent_class; static guint signals[LAST_SIGNAL] = {0}; @@ -74,36 +76,35 @@ GType sp_gradient_vector_selector_get_type(void) sizeof(SPGradientVectorSelectorClass), NULL, /* base_init */ NULL, /* base_finalize */ - (GClassInitFunc) sp_gradient_vector_selector_class_init, + reinterpret_cast<GClassInitFunc>(sp_gradient_vector_selector_class_init), NULL, /* class_finalize */ NULL, /* class_data */ sizeof(SPGradientVectorSelector), 0, /* n_preallocs */ - (GInstanceInitFunc) sp_gradient_vector_selector_init, + reinterpret_cast<GInstanceInitFunc>(sp_gradient_vector_selector_init), 0, /* value_table */ }; type = g_type_register_static( GTK_TYPE_VBOX, "SPGradientVectorSelector", &info, - static_cast< GTypeFlags > (0) ); + static_cast< GTypeFlags >(0) ); } return type; } -static void -sp_gradient_vector_selector_class_init (SPGradientVectorSelectorClass *klass) +static void sp_gradient_vector_selector_class_init(SPGradientVectorSelectorClass *klass) { GtkObjectClass *object_class; - object_class = GTK_OBJECT_CLASS (klass); + object_class = GTK_OBJECT_CLASS(klass); - parent_class = (GtkVBoxClass*)gtk_type_class (GTK_TYPE_VBOX); + parent_class = static_cast<GtkVBoxClass*>(gtk_type_class(GTK_TYPE_VBOX)); - signals[VECTOR_SET] = gtk_signal_new ("vector_set", + signals[VECTOR_SET] = gtk_signal_new( "vector_set", GTK_RUN_LAST, GTK_CLASS_TYPE(object_class), - GTK_SIGNAL_OFFSET (SPGradientVectorSelectorClass, vector_set), + GTK_SIGNAL_OFFSET(SPGradientVectorSelectorClass, vector_set), gtk_marshal_NONE__POINTER, GTK_TYPE_NONE, 1, GTK_TYPE_POINTER); @@ -111,11 +112,12 @@ sp_gradient_vector_selector_class_init (SPGradientVectorSelectorClass *klass) object_class->destroy = sp_gradient_vector_selector_destroy; } -static void -sp_gradient_vector_selector_init (SPGradientVectorSelector *gvs) +static void sp_gradient_vector_selector_init(SPGradientVectorSelector *gvs) { gvs->idlabel = TRUE; + gvs->swatched = false; + gvs->doc = NULL; gvs->gr = NULL; @@ -123,17 +125,14 @@ sp_gradient_vector_selector_init (SPGradientVectorSelector *gvs) new (&gvs->defs_release_connection) sigc::connection(); new (&gvs->defs_modified_connection) sigc::connection(); - gvs->menu = gtk_option_menu_new (); - gtk_widget_show (gvs->menu); - gtk_box_pack_start (GTK_BOX (gvs), gvs->menu, TRUE, TRUE, 0); + gvs->menu = gtk_option_menu_new(); + gtk_widget_show(gvs->menu); + gtk_box_pack_start(GTK_BOX(gvs), gvs->menu, TRUE, TRUE, 0); } -static void -sp_gradient_vector_selector_destroy (GtkObject *object) +static void sp_gradient_vector_selector_destroy(GtkObject *object) { - SPGradientVectorSelector *gvs; - - gvs = SP_GRADIENT_VECTOR_SELECTOR (object); + SPGradientVectorSelector *gvs = SP_GRADIENT_VECTOR_SELECTOR(object); if (gvs->gr) { gvs->gradient_release_connection.disconnect(); @@ -150,40 +149,39 @@ sp_gradient_vector_selector_destroy (GtkObject *object) gvs->defs_release_connection.~connection(); gvs->defs_modified_connection.~connection(); - if (((GtkObjectClass *) (parent_class))->destroy) - (* ((GtkObjectClass *) (parent_class))->destroy) (object); + if ((reinterpret_cast<GtkObjectClass *>(parent_class))->destroy) { + (* (reinterpret_cast<GtkObjectClass *>(parent_class))->destroy) (object); + } } -GtkWidget * -sp_gradient_vector_selector_new (SPDocument *doc, SPGradient *gr) +GtkWidget *sp_gradient_vector_selector_new(SPDocument *doc, SPGradient *gr) { GtkWidget *gvs; - g_return_val_if_fail (!gr || SP_IS_GRADIENT (gr), NULL); - g_return_val_if_fail (!gr || (SP_OBJECT_DOCUMENT (gr) == doc), NULL); + g_return_val_if_fail(!gr || SP_IS_GRADIENT(gr), NULL); + g_return_val_if_fail(!gr || (SP_OBJECT_DOCUMENT(gr) == doc), NULL); - gvs = (GtkWidget*)gtk_type_new (SP_TYPE_GRADIENT_VECTOR_SELECTOR); + gvs = static_cast<GtkWidget*>(gtk_type_new(SP_TYPE_GRADIENT_VECTOR_SELECTOR)); if (doc) { - sp_gradient_vector_selector_set_gradient (SP_GRADIENT_VECTOR_SELECTOR (gvs), doc, gr); + sp_gradient_vector_selector_set_gradient(SP_GRADIENT_VECTOR_SELECTOR(gvs), doc, gr); } else { - sp_gvs_rebuild_gui_full (SP_GRADIENT_VECTOR_SELECTOR (gvs)); + sp_gvs_rebuild_gui_full(SP_GRADIENT_VECTOR_SELECTOR(gvs)); } return gvs; } -void -sp_gradient_vector_selector_set_gradient (SPGradientVectorSelector *gvs, SPDocument *doc, SPGradient *gr) +void sp_gradient_vector_selector_set_gradient(SPGradientVectorSelector *gvs, SPDocument *doc, SPGradient *gr) { static gboolean suppress = FALSE; - g_return_if_fail (gvs != NULL); - g_return_if_fail (SP_IS_GRADIENT_VECTOR_SELECTOR (gvs)); - g_return_if_fail (!gr || (doc != NULL)); - g_return_if_fail (!gr || SP_IS_GRADIENT (gr)); - g_return_if_fail (!gr || (SP_OBJECT_DOCUMENT (gr) == doc)); - g_return_if_fail (!gr || SP_GRADIENT_HAS_STOPS (gr)); + g_return_if_fail(gvs != NULL); + g_return_if_fail(SP_IS_GRADIENT_VECTOR_SELECTOR(gvs)); + g_return_if_fail(!gr || (doc != NULL)); + g_return_if_fail(!gr || SP_IS_GRADIENT(gr)); + g_return_if_fail(!gr || (SP_OBJECT_DOCUMENT(gr) == doc)); + g_return_if_fail(!gr || SP_GRADIENT_HAS_STOPS(gr)); if (doc != gvs->doc) { /* Disconnect signals */ @@ -196,7 +194,8 @@ sp_gradient_vector_selector_set_gradient (SPGradientVectorSelector *gvs, SPDocum gvs->defs_modified_connection.disconnect(); gvs->doc = NULL; } - /* Connect signals */ + + // Connect signals if (doc) { gvs->defs_release_connection = SP_DOCUMENT_DEFS(doc)->connectRelease(sigc::bind<1>(sigc::ptr_fun(&sp_gvs_defs_release), gvs)); gvs->defs_modified_connection = SP_DOCUMENT_DEFS(doc)->connectModified(sigc::bind<2>(sigc::ptr_fun(&sp_gvs_defs_modified), gvs)); @@ -206,145 +205,144 @@ sp_gradient_vector_selector_set_gradient (SPGradientVectorSelector *gvs, SPDocum } gvs->doc = doc; gvs->gr = gr; - sp_gvs_rebuild_gui_full (gvs); - if (!suppress) g_signal_emit (G_OBJECT (gvs), signals[VECTOR_SET], 0, gr); + sp_gvs_rebuild_gui_full(gvs); + if (!suppress) g_signal_emit(G_OBJECT(gvs), signals[VECTOR_SET], 0, gr); } else if (gr != gvs->gr) { - /* Harder case - keep document, rebuild menus and stuff */ - /* fixme: (Lauris) */ + // Harder case - keep document, rebuild menus and stuff + // fixme: (Lauris) suppress = TRUE; - sp_gradient_vector_selector_set_gradient (gvs, NULL, NULL); - sp_gradient_vector_selector_set_gradient (gvs, doc, gr); + sp_gradient_vector_selector_set_gradient(gvs, NULL, NULL); + sp_gradient_vector_selector_set_gradient(gvs, doc, gr); suppress = FALSE; - g_signal_emit (G_OBJECT (gvs), signals[VECTOR_SET], 0, gr); + g_signal_emit(G_OBJECT(gvs), signals[VECTOR_SET], 0, gr); } /* The case of setting NULL -> NULL is not very interesting */ } -SPDocument * -sp_gradient_vector_selector_get_document (SPGradientVectorSelector *gvs) +SPDocument *sp_gradient_vector_selector_get_document(SPGradientVectorSelector *gvs) { - g_return_val_if_fail (gvs != NULL, NULL); - g_return_val_if_fail (SP_IS_GRADIENT_VECTOR_SELECTOR (gvs), NULL); + g_return_val_if_fail(gvs != NULL, NULL); + g_return_val_if_fail(SP_IS_GRADIENT_VECTOR_SELECTOR(gvs), NULL); return gvs->doc; } -SPGradient * -sp_gradient_vector_selector_get_gradient (SPGradientVectorSelector *gvs) +SPGradient *sp_gradient_vector_selector_get_gradient(SPGradientVectorSelector *gvs) { - g_return_val_if_fail (gvs != NULL, NULL); - g_return_val_if_fail (SP_IS_GRADIENT_VECTOR_SELECTOR (gvs), NULL); + g_return_val_if_fail(gvs != NULL, NULL); + g_return_val_if_fail(SP_IS_GRADIENT_VECTOR_SELECTOR(gvs), NULL); return gvs->gr; } -static void -sp_gvs_rebuild_gui_full (SPGradientVectorSelector *gvs) +static void sp_gvs_rebuild_gui_full(SPGradientVectorSelector *gvs) { /* Clear old menu, if there is any */ - if (gtk_option_menu_get_menu (GTK_OPTION_MENU (gvs->menu))) { - gtk_option_menu_remove_menu (GTK_OPTION_MENU (gvs->menu)); + if (gtk_option_menu_get_menu(GTK_OPTION_MENU(gvs->menu))) { + gtk_option_menu_remove_menu(GTK_OPTION_MENU(gvs->menu)); } /* Create new menu widget */ - GtkWidget *m = gtk_menu_new (); - gtk_widget_show (m); + GtkWidget *m = gtk_menu_new(); + gtk_widget_show(m); /* Pick up all gradients with vectors */ GSList *gl = NULL; if (gvs->gr) { - const GSList *gradients = sp_document_get_resource_list (SP_OBJECT_DOCUMENT (gvs->gr), "gradient"); - for (const GSList *l = gradients; l != NULL; l = l->next) { - if (SP_GRADIENT_HAS_STOPS (l->data)) { - gl = g_slist_prepend (gl, l->data); + const GSList *gradients = sp_document_get_resource_list(SP_OBJECT_DOCUMENT(gvs->gr), "gradient"); + for (const GSList *curr = gradients; curr; curr = curr->next) { + SPGradient* grad = SP_GRADIENT(curr->data); + if (SP_GRADIENT_HAS_STOPS(grad) && (grad->isSwatch() == gvs->swatched)) { + gl = g_slist_prepend(gl, curr->data); } } } - gl = g_slist_reverse (gl); + gl = g_slist_reverse(gl); gint pos = 0; gint idx = 0; if (!gvs->doc) { GtkWidget *i; - i = gtk_menu_item_new_with_label (_("No document selected")); - gtk_widget_show (i); - gtk_menu_append (GTK_MENU (m), i); - gtk_widget_set_sensitive (gvs->menu, FALSE); + i = gtk_menu_item_new_with_label(_("No document selected")); + gtk_widget_show(i); + gtk_menu_append(GTK_MENU(m), i); + gtk_widget_set_sensitive(gvs->menu, FALSE); } else if (!gl) { GtkWidget *i; - i = gtk_menu_item_new_with_label (_("No gradients in document")); - gtk_widget_show (i); - gtk_menu_append (GTK_MENU (m), i); - gtk_widget_set_sensitive (gvs->menu, FALSE); + i = gtk_menu_item_new_with_label(_("No gradients in document")); + gtk_widget_show(i); + gtk_menu_append(GTK_MENU(m), i); + gtk_widget_set_sensitive(gvs->menu, FALSE); } else if (!gvs->gr) { GtkWidget *i; - i = gtk_menu_item_new_with_label (_("No gradient selected")); - gtk_widget_show (i); - gtk_menu_append (GTK_MENU (m), i); - gtk_widget_set_sensitive (gvs->menu, FALSE); + i = gtk_menu_item_new_with_label(_("No gradient selected")); + gtk_widget_show(i); + gtk_menu_append(GTK_MENU(m), i); + gtk_widget_set_sensitive(gvs->menu, FALSE); } else { while (gl) { SPGradient *gr; GtkWidget *i, *w; - gr = SP_GRADIENT (gl->data); - gl = g_slist_remove (gl, gr); + gr = SP_GRADIENT(gl->data); + gl = g_slist_remove(gl, gr); /* We have to know: */ /* Gradient destroy */ /* Gradient name change */ - i = gtk_menu_item_new (); - gtk_widget_show (i); - g_object_set_data (G_OBJECT (i), "gradient", gr); - g_signal_connect (G_OBJECT (i), "activate", G_CALLBACK (sp_gvs_gradient_activate), gvs); + i = gtk_menu_item_new(); + gtk_widget_show(i); + g_object_set_data(G_OBJECT(i), "gradient", gr); + g_signal_connect(G_OBJECT(i), "activate", G_CALLBACK(sp_gvs_gradient_activate), gvs); - w = sp_gradient_image_new (gr); - gtk_widget_show (w); + w = sp_gradient_image_new(gr); + gtk_widget_show(w); if (gvs->idlabel) { GtkWidget *hb, *l; - hb = gtk_hbox_new (FALSE, 4); - gtk_widget_show (hb); - l = gtk_label_new (SP_OBJECT_ID (gr)); - gtk_widget_show (l); - gtk_misc_set_alignment (GTK_MISC (l), 1.0, 0.5); - gtk_box_pack_start (GTK_BOX (hb), l, TRUE, TRUE, 0); - gtk_box_pack_start (GTK_BOX (hb), w, FALSE, FALSE, 0); + hb = gtk_hbox_new(FALSE, 4); + gtk_widget_show(hb); + l = gtk_label_new(gr->getId()); + gtk_widget_show(l); + gtk_misc_set_alignment(GTK_MISC(l), 1.0, 0.5); + gtk_box_pack_start(GTK_BOX(hb), l, TRUE, TRUE, 0); + gtk_box_pack_start(GTK_BOX(hb), w, FALSE, FALSE, 0); w = hb; } - gtk_container_add (GTK_CONTAINER (i), w); + gtk_container_add(GTK_CONTAINER(i), w); - gtk_menu_append (GTK_MENU (m), i); + gtk_menu_append(GTK_MENU(m), i); - if (gr == gvs->gr) pos = idx; + if (gr == gvs->gr) { + pos = idx; + } idx += 1; } - gtk_widget_set_sensitive (gvs->menu, TRUE); + gtk_widget_set_sensitive(gvs->menu, TRUE); } - gtk_option_menu_set_menu (GTK_OPTION_MENU (gvs->menu), m); + gtk_option_menu_set_menu(GTK_OPTION_MENU(gvs->menu), m); /* Set history */ - gtk_option_menu_set_history (GTK_OPTION_MENU (gvs->menu), pos); + gtk_option_menu_set_history(GTK_OPTION_MENU(gvs->menu), pos); } -static void -sp_gvs_gradient_activate (GtkMenuItem *mi, SPGradientVectorSelector *gvs) +static void sp_gvs_gradient_activate(GtkMenuItem *mi, SPGradientVectorSelector *gvs) { SPGradient *gr, *norm; - gr = (SPGradient*)g_object_get_data (G_OBJECT (mi), "gradient"); + gr = (SPGradient*)g_object_get_data(G_OBJECT(mi), "gradient"); /* Hmmm... bad things may happen here, if actual gradient is something new */ /* Namely - menuitems etc. will be fucked up */ /* Hmmm - probably we can just re-set it as menuitem data (Lauris) */ - //g_print ("SPGradientVectorSelector: gradient %s activated\n", SP_OBJECT_ID (gr)); + //g_print("SPGradientVectorSelector: gradient %s activated\n", SP_OBJECT_ID(gr)); - norm = sp_gradient_ensure_vector_normalized (gr); + norm = sp_gradient_ensure_vector_normalized(gr); if (norm != gr) { - //g_print ("SPGradientVectorSelector: become %s after normalization\n", SP_OBJECT_ID (norm)); + //g_print("SPGradientVectorSelector: become %s after normalization\n", SP_OBJECT_ID(norm)); /* But be careful that we do not have gradient saved anywhere else */ - g_object_set_data (G_OBJECT (mi), "gradient", norm); + g_object_set_data(G_OBJECT(mi), "gradient", norm); } /* fixme: Really we would want to use _set_vector */ @@ -359,19 +357,18 @@ sp_gvs_gradient_activate (GtkMenuItem *mi, SPGradientVectorSelector *gvs) gvs->gr = norm; } - g_signal_emit (G_OBJECT (gvs), signals[VECTOR_SET], 0, norm); + g_signal_emit(G_OBJECT(gvs), signals[VECTOR_SET], 0, norm); if (norm != gr) { /* We do extra undo push here */ /* If handler has already done it, it is just NOP */ // FIXME: looks like this is never a valid undo step, consider removing this - sp_document_done (SP_OBJECT_DOCUMENT (norm), SP_VERB_CONTEXT_GRADIENT, + sp_document_done(SP_OBJECT_DOCUMENT(norm), SP_VERB_CONTEXT_GRADIENT, /* TODO: annotate */ "gradient-vector.cpp:350"); } } -static void -sp_gvs_gradient_release (SPObject */*obj*/, SPGradientVectorSelector *gvs) +static void sp_gvs_gradient_release(SPObject */*obj*/, SPGradientVectorSelector *gvs) { /* Disconnect gradient */ if (gvs->gr) { @@ -380,11 +377,10 @@ sp_gvs_gradient_release (SPObject */*obj*/, SPGradientVectorSelector *gvs) } /* Rebuild GUI */ - sp_gvs_rebuild_gui_full (gvs); + sp_gvs_rebuild_gui_full(gvs); } -static void -sp_gvs_defs_release (SPObject */*defs*/, SPGradientVectorSelector *gvs) +static void sp_gvs_defs_release(SPObject */*defs*/, SPGradientVectorSelector *gvs) { gvs->doc = NULL; @@ -398,15 +394,20 @@ sp_gvs_defs_release (SPObject */*defs*/, SPGradientVectorSelector *gvs) } /* Rebuild GUI */ - sp_gvs_rebuild_gui_full (gvs); + sp_gvs_rebuild_gui_full(gvs); } -static void -sp_gvs_defs_modified (SPObject */*defs*/, guint /*flags*/, SPGradientVectorSelector *gvs) +static void sp_gvs_defs_modified(SPObject */*defs*/, guint /*flags*/, SPGradientVectorSelector *gvs) { /* fixme: We probably have to check some flags here (Lauris) */ - sp_gvs_rebuild_gui_full (gvs); + sp_gvs_rebuild_gui_full(gvs); +} + +void SPGradientVectorSelector::setSwatched() +{ + swatched = true; + sp_gvs_rebuild_gui_full(this); } /*################################################################## @@ -422,27 +423,27 @@ sp_gvs_defs_modified (SPObject */*defs*/, guint /*flags*/, SPGradientVectorSelec #define PAD 4 -static GtkWidget *sp_gradient_vector_widget_new (SPGradient *gradient, SPStop *stop); +static GtkWidget *sp_gradient_vector_widget_new(SPGradient *gradient, SPStop *stop); -static void sp_gradient_vector_widget_load_gradient (GtkWidget *widget, SPGradient *gradient); -static gint sp_gradient_vector_dialog_delete (GtkWidget *widget, GdkEvent *event, GtkWidget *dialog); -static void sp_gradient_vector_dialog_destroy (GtkObject *object, gpointer data); +static void sp_gradient_vector_widget_load_gradient(GtkWidget *widget, SPGradient *gradient); +static gint sp_gradient_vector_dialog_delete(GtkWidget *widget, GdkEvent *event, GtkWidget *dialog); +static void sp_gradient_vector_dialog_destroy(GtkObject *object, gpointer data); -static void sp_gradient_vector_widget_destroy (GtkObject *object, gpointer data); -static void sp_gradient_vector_gradient_release (SPObject *obj, GtkWidget *widget); -static void sp_gradient_vector_gradient_modified (SPObject *obj, guint flags, GtkWidget *widget); -static void sp_gradient_vector_color_dragged (SPColorSelector *csel, GtkObject *object); -static void sp_gradient_vector_color_changed (SPColorSelector *csel, GtkObject *object); +static void sp_gradient_vector_widget_destroy(GtkObject *object, gpointer data); +static void sp_gradient_vector_gradient_release(SPObject *obj, GtkWidget *widget); +static void sp_gradient_vector_gradient_modified(SPObject *obj, guint flags, GtkWidget *widget); +static void sp_gradient_vector_color_dragged(SPColorSelector *csel, GtkObject *object); +static void sp_gradient_vector_color_changed(SPColorSelector *csel, GtkObject *object); static void update_stop_list( GtkWidget *mnu, SPGradient *gradient, SPStop *new_stop); static gboolean blocked = FALSE; -static void grad_edit_dia_stop_added_or_removed (Inkscape::XML::Node */*repr*/, Inkscape::XML::Node */*child*/, Inkscape::XML::Node */*ref*/, gpointer data) +static void grad_edit_dia_stop_added_or_removed(Inkscape::XML::Node */*repr*/, Inkscape::XML::Node */*child*/, Inkscape::XML::Node */*ref*/, gpointer data) { GtkWidget *vb = GTK_WIDGET(data); - GtkWidget *mnu = (GtkWidget *)g_object_get_data (G_OBJECT(vb), "stopmenu"); - SPGradient *gradient = (SPGradient *)g_object_get_data (G_OBJECT(vb), "gradient"); - update_stop_list (mnu, gradient, NULL); + GtkWidget *mnu = (GtkWidget *)g_object_get_data(G_OBJECT(vb), "stopmenu"); + SPGradient *gradient = (SPGradient *)g_object_get_data(G_OBJECT(vb), "gradient"); + update_stop_list(mnu, gradient, NULL); } //FIXME!!! We must also listen to attr changes on all children (i.e. stops) too, @@ -457,14 +458,13 @@ static Inkscape::XML::NodeEventVector grad_edit_dia_repr_events = NULL /* order_changed */ }; -static void -verify_grad(SPGradient *gradient) +static void verify_grad(SPGradient *gradient) { int i = 0; SPStop *stop = NULL; /* count stops */ for ( SPObject *ochild = sp_object_first_child(SP_OBJECT(gradient)) ; ochild != NULL ; ochild = SP_OBJECT_NEXT(ochild) ) { - if (SP_IS_STOP (ochild)) { + if (SP_IS_STOP(ochild)) { i++; stop = SP_STOP(ochild); } @@ -475,7 +475,7 @@ verify_grad(SPGradient *gradient) if (i < 1) { gchar c[64]; - sp_svg_write_color (c, sizeof(c), 0x00000000); + sp_svg_write_color(c, sizeof(c), 0x00000000); Inkscape::CSSOStringStream os; os << "stop-color:" << c << ";stop-opacity:" << 1.0 << ";"; @@ -485,32 +485,31 @@ verify_grad(SPGradient *gradient) child = xml_doc->createElement("svg:stop"); sp_repr_set_css_double(child, "offset", 0.0); child->setAttribute("style", os.str().c_str()); - SP_OBJECT_REPR (gradient)->addChild(child, NULL); + SP_OBJECT_REPR(gradient)->addChild(child, NULL); Inkscape::GC::release(child); child = xml_doc->createElement("svg:stop"); sp_repr_set_css_double(child, "offset", 1.0); child->setAttribute("style", os.str().c_str()); - SP_OBJECT_REPR (gradient)->addChild(child, NULL); + SP_OBJECT_REPR(gradient)->addChild(child, NULL); Inkscape::GC::release(child); } if (i < 2) { sp_repr_set_css_double(SP_OBJECT_REPR(stop), "offset", 0.0); Inkscape::XML::Node *child = SP_OBJECT_REPR(stop)->duplicate(SP_OBJECT_REPR(gradient)->document()); sp_repr_set_css_double(child, "offset", 1.0); - SP_OBJECT_REPR(gradient)->addChild(child, SP_OBJECT_REPR (stop)); + SP_OBJECT_REPR(gradient)->addChild(child, SP_OBJECT_REPR(stop)); Inkscape::GC::release(child); } } -static void -select_stop_in_list( GtkWidget *mnu, SPGradient *gradient, SPStop *new_stop) +static void select_stop_in_list( GtkWidget *mnu, SPGradient *gradient, SPStop *new_stop) { int i = 0; for ( SPObject *ochild = sp_object_first_child(SP_OBJECT(gradient)) ; ochild != NULL ; ochild = SP_OBJECT_NEXT(ochild) ) { - if (SP_IS_STOP (ochild)) { - if (SP_OBJECT (ochild) == SP_OBJECT(new_stop)) { - gtk_option_menu_set_history (GTK_OPTION_MENU (mnu), i); + if (SP_IS_STOP(ochild)) { + if (SP_OBJECT(ochild) == SP_OBJECT(new_stop)) { + gtk_option_menu_set_history(GTK_OPTION_MENU(mnu), i); break; } i++; @@ -518,104 +517,103 @@ select_stop_in_list( GtkWidget *mnu, SPGradient *gradient, SPStop *new_stop) } } -static void -update_stop_list( GtkWidget *mnu, SPGradient *gradient, SPStop *new_stop) +static void update_stop_list( GtkWidget *mnu, SPGradient *gradient, SPStop *new_stop) { - if (!SP_IS_GRADIENT (gradient)) + if (!SP_IS_GRADIENT(gradient)) { return; + } blocked = TRUE; /* Clear old menu, if there is any */ - if (gtk_option_menu_get_menu (GTK_OPTION_MENU (mnu))) { - gtk_option_menu_remove_menu (GTK_OPTION_MENU (mnu)); + if (gtk_option_menu_get_menu(GTK_OPTION_MENU(mnu))) { + gtk_option_menu_remove_menu(GTK_OPTION_MENU(mnu)); } /* Create new menu widget */ - GtkWidget *m = gtk_menu_new (); - gtk_widget_show (m); + GtkWidget *m = gtk_menu_new(); + gtk_widget_show(m); GSList *sl = NULL; if (gradient->has_stops) { - for ( SPObject *ochild = sp_object_first_child (SP_OBJECT(gradient)) ; ochild != NULL ; ochild = SP_OBJECT_NEXT(ochild) ) { - if (SP_IS_STOP (ochild)) { - sl = g_slist_append (sl, ochild); + for ( SPObject *ochild = sp_object_first_child(SP_OBJECT(gradient)) ; ochild != NULL ; ochild = SP_OBJECT_NEXT(ochild) ) { + if (SP_IS_STOP(ochild)) { + sl = g_slist_append(sl, ochild); } } } if (!sl) { - GtkWidget *i = gtk_menu_item_new_with_label (_("No stops in gradient")); - gtk_widget_show (i); - gtk_menu_append (GTK_MENU (m), i); - gtk_widget_set_sensitive (mnu, FALSE); + GtkWidget *i = gtk_menu_item_new_with_label(_("No stops in gradient")); + gtk_widget_show(i); + gtk_menu_append(GTK_MENU(m), i); + gtk_widget_set_sensitive(mnu, FALSE); } else { for (; sl != NULL; sl = sl->next){ SPStop *stop; GtkWidget *i; if (SP_IS_STOP(sl->data)){ - stop = SP_STOP (sl->data); - i = gtk_menu_item_new (); - gtk_widget_show (i); - g_object_set_data (G_OBJECT (i), "stop", stop); - GtkWidget *hb = gtk_hbox_new (FALSE, 4); + stop = SP_STOP(sl->data); + i = gtk_menu_item_new(); + gtk_widget_show(i); + g_object_set_data(G_OBJECT(i), "stop", stop); + GtkWidget *hb = gtk_hbox_new(FALSE, 4); GtkWidget *cpv = sp_color_preview_new(sp_stop_get_rgba32(stop)); - gtk_widget_show (cpv); - gtk_container_add ( GTK_CONTAINER (hb), cpv ); - g_object_set_data ( G_OBJECT (i), "preview", cpv ); + gtk_widget_show(cpv); + gtk_container_add( GTK_CONTAINER(hb), cpv ); + g_object_set_data( G_OBJECT(i), "preview", cpv ); Inkscape::XML::Node *repr = SP_OBJECT_REPR((SPItem *) sl->data); - GtkWidget *l = gtk_label_new (repr->attribute("id")); - gtk_widget_show (l); - gtk_misc_set_alignment (GTK_MISC (l), 1.0, 0.5); - gtk_box_pack_start (GTK_BOX (hb), l, TRUE, TRUE, 0); - gtk_widget_show (hb); - gtk_container_add (GTK_CONTAINER (i), hb); - gtk_menu_append (GTK_MENU (m), i); + GtkWidget *l = gtk_label_new(repr->attribute("id")); + gtk_widget_show(l); + gtk_misc_set_alignment(GTK_MISC(l), 1.0, 0.5); + gtk_box_pack_start(GTK_BOX(hb), l, TRUE, TRUE, 0); + gtk_widget_show(hb); + gtk_container_add(GTK_CONTAINER(i), hb); + gtk_menu_append(GTK_MENU(m), i); } } - gtk_widget_set_sensitive (mnu, TRUE); + gtk_widget_set_sensitive(mnu, TRUE); } - gtk_option_menu_set_menu (GTK_OPTION_MENU (mnu), m); + gtk_option_menu_set_menu(GTK_OPTION_MENU(mnu), m); /* Set history */ if (new_stop == NULL) { - gtk_option_menu_set_history (GTK_OPTION_MENU (mnu), 0); + gtk_option_menu_set_history(GTK_OPTION_MENU(mnu), 0); } else { - select_stop_in_list (mnu, gradient, new_stop); + select_stop_in_list(mnu, gradient, new_stop); } blocked = FALSE; } -/*user selected existing stop from list*/ -static void -sp_grad_edit_select (GtkOptionMenu *mnu, GtkWidget *tbl) +// user selected existing stop from list +static void sp_grad_edit_select(GtkOptionMenu *mnu, GtkWidget *tbl) { - SPGradient *gradient = (SPGradient *)g_object_get_data (G_OBJECT(tbl), "gradient"); - - GObject *item = G_OBJECT(gtk_menu_get_active (GTK_MENU(gtk_option_menu_get_menu (mnu)))); - SPStop *stop = SP_STOP (g_object_get_data (item, "stop")); - if (!stop) return; + GObject *item = G_OBJECT(gtk_menu_get_active(GTK_MENU(gtk_option_menu_get_menu(mnu)))); + SPStop *stop = SP_STOP(g_object_get_data(item, "stop")); + if (!stop) { + return; + } blocked = TRUE; - SPColorSelector *csel = (SPColorSelector*)g_object_get_data (G_OBJECT (tbl), "cselector"); + SPColorSelector *csel = (SPColorSelector*)g_object_get_data(G_OBJECT(tbl), "cselector"); guint32 const c = sp_stop_get_rgba32(stop); - csel->base->setAlpha(SP_RGBA32_A_F (c)); - SPColor color( SP_RGBA32_R_F (c), SP_RGBA32_G_F (c), SP_RGBA32_B_F (c) ); + csel->base->setAlpha(SP_RGBA32_A_F(c)); + SPColor color( SP_RGBA32_R_F(c), SP_RGBA32_G_F(c), SP_RGBA32_B_F(c) ); // set its color, from the stored array csel->base->setColor( color ); - GtkWidget *offspin = GTK_WIDGET (g_object_get_data (G_OBJECT (tbl), "offspn")); - GtkWidget *offslide =GTK_WIDGET (g_object_get_data (G_OBJECT (tbl), "offslide")); + GtkWidget *offspin = GTK_WIDGET(g_object_get_data(G_OBJECT(tbl), "offspn")); + GtkWidget *offslide =GTK_WIDGET(g_object_get_data(G_OBJECT(tbl), "offslide")); - GtkAdjustment *adj = (GtkAdjustment*)gtk_object_get_data (GTK_OBJECT (tbl), "offset"); + GtkAdjustment *adj = static_cast<GtkAdjustment*>(gtk_object_get_data(GTK_OBJECT(tbl), "offset")); bool isEndStop = false; SPStop *prev = NULL; - prev = sp_prev_stop(stop, gradient); + prev = stop->getPrevStop(); if (prev != NULL ) { adj->lower = prev->offset; } else { @@ -624,7 +622,7 @@ sp_grad_edit_select (GtkOptionMenu *mnu, GtkWidget *tbl) } SPStop *next = NULL; - next = sp_next_stop(stop); + next = stop->getNextStop(); if (next != NULL ) { adj->upper = next->offset; } else { @@ -634,16 +632,16 @@ sp_grad_edit_select (GtkOptionMenu *mnu, GtkWidget *tbl) //fixme: does this work on all possible input gradients? if (!isEndStop) { - gtk_widget_set_sensitive (offslide, TRUE); - gtk_widget_set_sensitive (GTK_WIDGET (offspin), TRUE); + gtk_widget_set_sensitive(offslide, TRUE); + gtk_widget_set_sensitive(GTK_WIDGET(offspin), TRUE); } else { - gtk_widget_set_sensitive (offslide, FALSE); - gtk_widget_set_sensitive (GTK_WIDGET (offspin), FALSE); + gtk_widget_set_sensitive(offslide, FALSE); + gtk_widget_set_sensitive(GTK_WIDGET(offspin), FALSE); } - gtk_adjustment_set_value (adj, stop->offset); + gtk_adjustment_set_value(adj, stop->offset); - gtk_adjustment_changed (adj); + gtk_adjustment_changed(adj); blocked = FALSE; } @@ -651,57 +649,58 @@ sp_grad_edit_select (GtkOptionMenu *mnu, GtkWidget *tbl) -static void -offadjustmentChanged( GtkAdjustment *adjustment, GtkWidget *vb) +static void offadjustmentChanged( GtkAdjustment *adjustment, GtkWidget *vb) { - if (blocked) + if (blocked) { return; + } blocked = TRUE; - GtkOptionMenu *mnu = (GtkOptionMenu *)g_object_get_data (G_OBJECT(vb), "stopmenu"); - if (!g_object_get_data (G_OBJECT(gtk_menu_get_active (GTK_MENU(gtk_option_menu_get_menu (mnu)))), "stop")) return; - SPStop *stop = SP_STOP(g_object_get_data (G_OBJECT(gtk_menu_get_active (GTK_MENU(gtk_option_menu_get_menu (mnu)))), "stop")); + GtkOptionMenu *mnu = static_cast<GtkOptionMenu *>(g_object_get_data(G_OBJECT(vb), "stopmenu")); + if (!g_object_get_data(G_OBJECT(gtk_menu_get_active(GTK_MENU(gtk_option_menu_get_menu(mnu)))), "stop")) { + return; + } + SPStop *stop = SP_STOP(g_object_get_data(G_OBJECT(gtk_menu_get_active(GTK_MENU(gtk_option_menu_get_menu(mnu)))), "stop")); stop->offset = adjustment->value; sp_repr_set_css_double(SP_OBJECT_REPR(stop), "offset", stop->offset); - sp_document_done (SP_OBJECT_DOCUMENT (stop), SP_VERB_CONTEXT_GRADIENT, + sp_document_done(SP_OBJECT_DOCUMENT(stop), SP_VERB_CONTEXT_GRADIENT, _("Change gradient stop offset")); blocked = FALSE; } -guint32 -sp_average_color (guint32 c1, guint32 c2, gdouble p = 0.5) +guint32 sp_average_color(guint32 c1, guint32 c2, gdouble p = 0.5) { - guint32 r = (guint32) (SP_RGBA32_R_U (c1) * p + SP_RGBA32_R_U (c2) * (1 - p)); - guint32 g = (guint32) (SP_RGBA32_G_U (c1) * p + SP_RGBA32_G_U (c2) * (1 - p)); - guint32 b = (guint32) (SP_RGBA32_B_U (c1) * p + SP_RGBA32_B_U (c2) * (1 - p)); - guint32 a = (guint32) (SP_RGBA32_A_U (c1) * p + SP_RGBA32_A_U (c2) * (1 - p)); + guint32 r = (guint32) (SP_RGBA32_R_U(c1) * p + SP_RGBA32_R_U(c2) * (1 - p)); + guint32 g = (guint32) (SP_RGBA32_G_U(c1) * p + SP_RGBA32_G_U(c2) * (1 - p)); + guint32 b = (guint32) (SP_RGBA32_B_U(c1) * p + SP_RGBA32_B_U(c2) * (1 - p)); + guint32 a = (guint32) (SP_RGBA32_A_U(c1) * p + SP_RGBA32_A_U(c2) * (1 - p)); - return SP_RGBA32_U_COMPOSE (r, g, b, a); + return SP_RGBA32_U_COMPOSE(r, g, b, a); } -static void -sp_grd_ed_add_stop (GtkWidget */*widget*/, GtkWidget *vb) +static void sp_grd_ed_add_stop(GtkWidget */*widget*/, GtkWidget *vb) { - SPGradient *gradient = (SPGradient *) g_object_get_data (G_OBJECT(vb), "gradient"); - verify_grad (gradient); - GtkOptionMenu *mnu = (GtkOptionMenu *)g_object_get_data (G_OBJECT(vb), "stopmenu"); + SPGradient *gradient = static_cast<SPGradient *>(g_object_get_data(G_OBJECT(vb), "gradient")); + verify_grad(gradient); + GtkOptionMenu *mnu = static_cast<GtkOptionMenu *>(g_object_get_data(G_OBJECT(vb), "stopmenu")); - SPStop *stop = (SPStop *) g_object_get_data (G_OBJECT(gtk_menu_get_active (GTK_MENU(gtk_option_menu_get_menu (mnu)))), "stop"); + SPStop *stop = static_cast<SPStop *>(g_object_get_data(G_OBJECT(gtk_menu_get_active(GTK_MENU(gtk_option_menu_get_menu(mnu)))), "stop")); - if (stop == NULL) + if (stop == NULL) { return; + } Inkscape::XML::Node *new_stop_repr = NULL; - SPStop *next = sp_next_stop (stop); + SPStop *next = stop->getNextStop(); if (next == NULL) { - SPStop *prev = sp_prev_stop (stop, gradient); + SPStop *prev = stop->getPrevStop(); if (prev != NULL) { next = stop; stop = prev; @@ -713,8 +712,8 @@ sp_grd_ed_add_stop (GtkWidget */*widget*/, GtkWidget *vb) SP_OBJECT_REPR(gradient)->addChild(new_stop_repr, SP_OBJECT_REPR(stop)); } else { next = stop; - new_stop_repr = SP_OBJECT_REPR(sp_prev_stop(stop, gradient))->duplicate(SP_OBJECT_REPR(gradient)->document()); - SP_OBJECT_REPR(gradient)->addChild(new_stop_repr, SP_OBJECT_REPR(sp_prev_stop(stop, gradient))); + new_stop_repr = SP_OBJECT_REPR(stop->getPrevStop())->duplicate(SP_OBJECT_REPR(gradient)->document()); + SP_OBJECT_REPR(gradient)->addChild(new_stop_repr, SP_OBJECT_REPR(stop->getPrevStop())); } SPStop *newstop = (SPStop *) SP_OBJECT_DOCUMENT(gradient)->getObjectByRepr(new_stop_repr); @@ -723,186 +722,184 @@ sp_grd_ed_add_stop (GtkWidget */*widget*/, GtkWidget *vb) guint32 const c1 = sp_stop_get_rgba32(stop); guint32 const c2 = sp_stop_get_rgba32(next); - guint32 cnew = sp_average_color (c1, c2); + guint32 cnew = sp_average_color(c1, c2); Inkscape::CSSOStringStream os; gchar c[64]; - sp_svg_write_color (c, sizeof(c), cnew); - gdouble opacity = (gdouble) SP_RGBA32_A_F (cnew); + sp_svg_write_color(c, sizeof(c), cnew); + gdouble opacity = static_cast<gdouble>(SP_RGBA32_A_F(cnew)); os << "stop-color:" << c << ";stop-opacity:" << opacity <<";"; SP_OBJECT_REPR (newstop)->setAttribute("style", os.str().c_str()); sp_repr_set_css_double( SP_OBJECT_REPR(newstop), "offset", (double)newstop->offset); - sp_gradient_vector_widget_load_gradient (vb, gradient); + sp_gradient_vector_widget_load_gradient(vb, gradient); Inkscape::GC::release(new_stop_repr); update_stop_list(GTK_WIDGET(mnu), gradient, newstop); - GtkWidget *offspin = GTK_WIDGET (g_object_get_data (G_OBJECT (vb), "offspn")); - GtkWidget *offslide =GTK_WIDGET (g_object_get_data (G_OBJECT (vb), "offslide")); - gtk_widget_set_sensitive (offslide, TRUE); - gtk_widget_set_sensitive (GTK_WIDGET (offspin), TRUE); - sp_document_done (SP_OBJECT_DOCUMENT (gradient), SP_VERB_CONTEXT_GRADIENT, + GtkWidget *offspin = GTK_WIDGET(g_object_get_data(G_OBJECT(vb), "offspn")); + GtkWidget *offslide =GTK_WIDGET(g_object_get_data(G_OBJECT(vb), "offslide")); + gtk_widget_set_sensitive(offslide, TRUE); + gtk_widget_set_sensitive(GTK_WIDGET(offspin), TRUE); + sp_document_done(SP_OBJECT_DOCUMENT(gradient), SP_VERB_CONTEXT_GRADIENT, _("Add gradient stop")); } -static void -sp_grd_ed_del_stop (GtkWidget */*widget*/, GtkWidget *vb) +static void sp_grd_ed_del_stop(GtkWidget */*widget*/, GtkWidget *vb) { - SPGradient *gradient = (SPGradient *)g_object_get_data (G_OBJECT(vb), "gradient"); + SPGradient *gradient = static_cast<SPGradient *>(g_object_get_data(G_OBJECT(vb), "gradient")); - GtkOptionMenu *mnu = (GtkOptionMenu *)g_object_get_data (G_OBJECT(vb), "stopmenu"); - if (!g_object_get_data (G_OBJECT(gtk_menu_get_active (GTK_MENU(gtk_option_menu_get_menu (mnu)))), "stop")) return; - SPStop *stop = SP_STOP(g_object_get_data (G_OBJECT(gtk_menu_get_active (GTK_MENU(gtk_option_menu_get_menu (mnu)))), "stop")); + GtkOptionMenu *mnu = static_cast<GtkOptionMenu *>(g_object_get_data(G_OBJECT(vb), "stopmenu")); + if (!g_object_get_data(G_OBJECT(gtk_menu_get_active(GTK_MENU(gtk_option_menu_get_menu(mnu)))), "stop")) return; + SPStop *stop = SP_STOP(g_object_get_data(G_OBJECT(gtk_menu_get_active(GTK_MENU(gtk_option_menu_get_menu(mnu)))), "stop")); if (gradient->vector.stops.size() > 2) { // 2 is the minimum // if we delete first or last stop, move the next/previous to the edge if (stop->offset == 0) { - SPStop *next = sp_next_stop (stop); + SPStop *next = stop->getNextStop(); if (next) { next->offset = 0; - sp_repr_set_css_double (SP_OBJECT_REPR (next), "offset", 0); + sp_repr_set_css_double(SP_OBJECT_REPR(next), "offset", 0); } } else if (stop->offset == 1) { - SPStop *prev = sp_prev_stop (stop, gradient); + SPStop *prev = stop->getPrevStop(); if (prev) { prev->offset = 1; - sp_repr_set_css_double (SP_OBJECT_REPR (prev), "offset", 1); + sp_repr_set_css_double(SP_OBJECT_REPR(prev), "offset", 1); } } SP_OBJECT_REPR(gradient)->removeChild(SP_OBJECT_REPR(stop)); - sp_gradient_vector_widget_load_gradient (vb, gradient); + sp_gradient_vector_widget_load_gradient(vb, gradient); update_stop_list(GTK_WIDGET(mnu), gradient, NULL); - sp_document_done (SP_OBJECT_DOCUMENT (gradient), SP_VERB_CONTEXT_GRADIENT, + sp_document_done(SP_OBJECT_DOCUMENT(gradient), SP_VERB_CONTEXT_GRADIENT, _("Delete gradient stop")); } } -static GtkWidget * -sp_gradient_vector_widget_new (SPGradient *gradient, SPStop *select_stop) +static GtkWidget * sp_gradient_vector_widget_new(SPGradient *gradient, SPStop *select_stop) { GtkWidget *vb, *w, *f, *csel; - g_return_val_if_fail (!gradient || SP_IS_GRADIENT (gradient), NULL); + g_return_val_if_fail(!gradient || SP_IS_GRADIENT(gradient), NULL); - vb = gtk_vbox_new (FALSE, PAD); - g_signal_connect (G_OBJECT (vb), "destroy", G_CALLBACK (sp_gradient_vector_widget_destroy), NULL); + vb = gtk_vbox_new(FALSE, PAD); + g_signal_connect(G_OBJECT(vb), "destroy", G_CALLBACK(sp_gradient_vector_widget_destroy), NULL); - w = sp_gradient_image_new (gradient); - g_object_set_data (G_OBJECT (vb), "preview", w); - gtk_widget_show (w); - gtk_box_pack_start (GTK_BOX (vb), w, TRUE, TRUE, PAD); + w = sp_gradient_image_new(gradient); + g_object_set_data(G_OBJECT(vb), "preview", w); + gtk_widget_show(w); + gtk_box_pack_start(GTK_BOX(vb), w, TRUE, TRUE, PAD); - sp_repr_add_listener (SP_OBJECT_REPR(gradient), &grad_edit_dia_repr_events, vb); - GtkTooltips *tt = gtk_tooltips_new (); + sp_repr_add_listener(SP_OBJECT_REPR(gradient), &grad_edit_dia_repr_events, vb); + GtkTooltips *tt = gtk_tooltips_new(); /* Stop list */ - GtkWidget *mnu = gtk_option_menu_new (); + GtkWidget *mnu = gtk_option_menu_new(); /* Create new menu widget */ - update_stop_list (GTK_WIDGET(mnu), gradient, NULL); - gtk_signal_connect (GTK_OBJECT (mnu), "changed", GTK_SIGNAL_FUNC (sp_grad_edit_select), vb); - gtk_widget_show (mnu); - gtk_object_set_data (GTK_OBJECT (vb), "stopmenu", mnu); - gtk_box_pack_start (GTK_BOX (vb), mnu, FALSE, FALSE, 0); + update_stop_list(GTK_WIDGET(mnu), gradient, NULL); + gtk_signal_connect(GTK_OBJECT(mnu), "changed", GTK_SIGNAL_FUNC(sp_grad_edit_select), vb); + gtk_widget_show(mnu); + gtk_object_set_data(GTK_OBJECT(vb), "stopmenu", mnu); + gtk_box_pack_start(GTK_BOX(vb), mnu, FALSE, FALSE, 0); /* Add and Remove buttons */ - GtkWidget *hb = gtk_hbox_new (FALSE, 1); + GtkWidget *hb = gtk_hbox_new(FALSE, 1); // TRANSLATORS: "Stop" means: a "phase" of a gradient - GtkWidget *b = gtk_button_new_with_label (_("Add stop")); - gtk_widget_show (b); - gtk_container_add (GTK_CONTAINER (hb), b); - gtk_tooltips_set_tip (tt, b, _("Add another control stop to gradient"), NULL); - gtk_signal_connect (GTK_OBJECT (b), "clicked", GTK_SIGNAL_FUNC (sp_grd_ed_add_stop), vb); - b = gtk_button_new_with_label (_("Delete stop")); - gtk_widget_show (b); - gtk_container_add (GTK_CONTAINER (hb), b); - gtk_tooltips_set_tip (tt, b, _("Delete current control stop from gradient"), NULL); - gtk_signal_connect (GTK_OBJECT (b), "clicked", GTK_SIGNAL_FUNC (sp_grd_ed_del_stop), vb); + GtkWidget *b = gtk_button_new_with_label(_("Add stop")); + gtk_widget_show(b); + gtk_container_add(GTK_CONTAINER(hb), b); + gtk_tooltips_set_tip(tt, b, _("Add another control stop to gradient"), NULL); + gtk_signal_connect(GTK_OBJECT(b), "clicked", GTK_SIGNAL_FUNC(sp_grd_ed_add_stop), vb); + b = gtk_button_new_with_label(_("Delete stop")); + gtk_widget_show(b); + gtk_container_add(GTK_CONTAINER(hb), b); + gtk_tooltips_set_tip(tt, b, _("Delete current control stop from gradient"), NULL); + gtk_signal_connect(GTK_OBJECT(b), "clicked", GTK_SIGNAL_FUNC(sp_grd_ed_del_stop), vb); - gtk_widget_show (hb); - gtk_box_pack_start (GTK_BOX (vb),hb, FALSE, FALSE, AUX_BETWEEN_BUTTON_GROUPS); + gtk_widget_show(hb); + gtk_box_pack_start(GTK_BOX(vb),hb, FALSE, FALSE, AUX_BETWEEN_BUTTON_GROUPS); /* Offset Slider and stuff */ - hb = gtk_hbox_new (FALSE, 0); + hb = gtk_hbox_new(FALSE, 0); /* Label */ - GtkWidget *l = gtk_label_new (_("Offset:")); - gtk_misc_set_alignment (GTK_MISC (l), 1.0, 0.5); - gtk_box_pack_start (GTK_BOX (hb),l, FALSE, FALSE, AUX_BETWEEN_BUTTON_GROUPS); - gtk_widget_show (l); + GtkWidget *l = gtk_label_new(_("Offset:")); + gtk_misc_set_alignment(GTK_MISC(l), 1.0, 0.5); + gtk_box_pack_start(GTK_BOX(hb),l, FALSE, FALSE, AUX_BETWEEN_BUTTON_GROUPS); + gtk_widget_show(l); /* Adjustment */ GtkAdjustment *Offset_adj = NULL; - Offset_adj= (GtkAdjustment *) gtk_adjustment_new (0.0, 0.0, 1.0, 0.01, 0.01, 0.0); - gtk_object_set_data (GTK_OBJECT (vb), "offset", Offset_adj); - GtkMenu *m = GTK_MENU(gtk_option_menu_get_menu (GTK_OPTION_MENU(mnu))); - SPStop *stop = SP_STOP (g_object_get_data (G_OBJECT (gtk_menu_get_active (m)), "stop")); - gtk_adjustment_set_value (Offset_adj, stop->offset); + Offset_adj= (GtkAdjustment *) gtk_adjustment_new(0.0, 0.0, 1.0, 0.01, 0.01, 0.0); + gtk_object_set_data(GTK_OBJECT(vb), "offset", Offset_adj); + GtkMenu *m = GTK_MENU(gtk_option_menu_get_menu(GTK_OPTION_MENU(mnu))); + SPStop *stop = SP_STOP(g_object_get_data(G_OBJECT(gtk_menu_get_active(m)), "stop")); + gtk_adjustment_set_value(Offset_adj, stop->offset); /* Slider */ GtkWidget *slider = gtk_hscale_new(Offset_adj); gtk_scale_set_draw_value( GTK_SCALE(slider), FALSE ); - gtk_widget_show (slider); - gtk_box_pack_start (GTK_BOX (hb),slider, TRUE, TRUE, AUX_BETWEEN_BUTTON_GROUPS); - gtk_object_set_data (GTK_OBJECT (vb), "offslide", slider); + gtk_widget_show(slider); + gtk_box_pack_start(GTK_BOX(hb),slider, TRUE, TRUE, AUX_BETWEEN_BUTTON_GROUPS); + gtk_object_set_data(GTK_OBJECT(vb), "offslide", slider); /* Spinbutton */ - GtkWidget *sbtn = gtk_spin_button_new (GTK_ADJUSTMENT (Offset_adj), 0.01, 2); - sp_dialog_defocus_on_enter (sbtn); - gtk_widget_show (sbtn); - gtk_box_pack_start (GTK_BOX (hb),sbtn, FALSE, TRUE, AUX_BETWEEN_BUTTON_GROUPS); - gtk_object_set_data (GTK_OBJECT (vb), "offspn", sbtn); + GtkWidget *sbtn = gtk_spin_button_new(GTK_ADJUSTMENT(Offset_adj), 0.01, 2); + sp_dialog_defocus_on_enter(sbtn); + gtk_widget_show(sbtn); + gtk_box_pack_start(GTK_BOX(hb),sbtn, FALSE, TRUE, AUX_BETWEEN_BUTTON_GROUPS); + gtk_object_set_data(GTK_OBJECT(vb), "offspn", sbtn); if (stop->offset>0 && stop->offset<1) { - gtk_widget_set_sensitive (slider, TRUE); - gtk_widget_set_sensitive (GTK_WIDGET (sbtn), TRUE); + gtk_widget_set_sensitive(slider, TRUE); + gtk_widget_set_sensitive(GTK_WIDGET(sbtn), TRUE); } else { - gtk_widget_set_sensitive (slider, FALSE); - gtk_widget_set_sensitive (GTK_WIDGET (sbtn), FALSE); + gtk_widget_set_sensitive(slider, FALSE); + gtk_widget_set_sensitive(GTK_WIDGET(sbtn), FALSE); } /* Signals */ - gtk_signal_connect (GTK_OBJECT (Offset_adj), "value_changed", - GTK_SIGNAL_FUNC (offadjustmentChanged), vb); + gtk_signal_connect(GTK_OBJECT(Offset_adj), "value_changed", + GTK_SIGNAL_FUNC(offadjustmentChanged), vb); - // gtk_signal_connect (GTK_OBJECT (slider), "changed", GTK_SIGNAL_FUNC (offsliderChanged), vb); - gtk_widget_show (hb); - gtk_box_pack_start (GTK_BOX (vb), hb, FALSE, FALSE, PAD); + // gtk_signal_connect(GTK_OBJECT(slider), "changed", GTK_SIGNAL_FUNC(offsliderChanged), vb); + gtk_widget_show(hb); + gtk_box_pack_start(GTK_BOX(vb), hb, FALSE, FALSE, PAD); // TRANSLATORS: "Stop" means: a "phase" of a gradient - f = gtk_frame_new (_("Stop Color")); - gtk_widget_show (f); - gtk_box_pack_start (GTK_BOX (vb), f, TRUE, TRUE, PAD); - csel = (GtkWidget*)sp_color_selector_new (SP_TYPE_COLOR_NOTEBOOK); - g_object_set_data (G_OBJECT (vb), "cselector", csel); - gtk_widget_show (csel); - gtk_container_add (GTK_CONTAINER (f), csel); - g_signal_connect (G_OBJECT (csel), "dragged", G_CALLBACK (sp_gradient_vector_color_dragged), vb); - g_signal_connect (G_OBJECT (csel), "changed", G_CALLBACK (sp_gradient_vector_color_changed), vb); - - gtk_widget_show (vb); - - sp_gradient_vector_widget_load_gradient (vb, gradient); - - if (select_stop) - select_stop_in_list (GTK_WIDGET(mnu), gradient, select_stop); + f = gtk_frame_new(_("Stop Color")); + gtk_widget_show(f); + gtk_box_pack_start(GTK_BOX(vb), f, TRUE, TRUE, PAD); + csel = static_cast<GtkWidget*>(sp_color_selector_new(SP_TYPE_COLOR_NOTEBOOK)); + g_object_set_data(G_OBJECT(vb), "cselector", csel); + gtk_widget_show(csel); + gtk_container_add(GTK_CONTAINER(f), csel); + g_signal_connect(G_OBJECT(csel), "dragged", G_CALLBACK(sp_gradient_vector_color_dragged), vb); + g_signal_connect(G_OBJECT(csel), "changed", G_CALLBACK(sp_gradient_vector_color_changed), vb); + + gtk_widget_show(vb); + + sp_gradient_vector_widget_load_gradient(vb, gradient); + + if (select_stop) { + select_stop_in_list(GTK_WIDGET(mnu), gradient, select_stop); + } return vb; } -GtkWidget * -sp_gradient_vector_editor_new (SPGradient *gradient, SPStop *stop) +GtkWidget * sp_gradient_vector_editor_new(SPGradient *gradient, SPStop *stop) { GtkWidget *wid; if (dlg == NULL) { Inkscape::Preferences *prefs = Inkscape::Preferences::get(); - dlg = sp_window_new (_("Gradient editor"), TRUE); + dlg = sp_window_new(_("Gradient editor"), TRUE); if (x == -1000 || y == -1000) { x = prefs->getInt(prefs_path + "x", -1000); y = prefs->getInt(prefs_path + "y", -1000); @@ -912,32 +909,39 @@ sp_gradient_vector_editor_new (SPGradient *gradient, SPStop *stop) h = prefs->getInt(prefs_path + "h", 0); } - if (x<0) x=0; - if (y<0) y=0; + if (x<0) { + x=0; + } + if (y<0) { + y=0; + } - if (x != 0 || y != 0) - gtk_window_move ((GtkWindow *) dlg, x, y); - else + if (x != 0 || y != 0) { + gtk_window_move(reinterpret_cast<GtkWindow *>(dlg), x, y); + } else { gtk_window_set_position(GTK_WINDOW(dlg), GTK_WIN_POS_CENTER); - if (w && h) gtk_window_resize ((GtkWindow *) dlg, w, h); - sp_transientize (dlg); + } + if (w && h) { + gtk_window_resize(reinterpret_cast<GtkWindow *>(dlg), w, h); + } + sp_transientize(dlg); wd.win = dlg; wd.stop = 0; - g_signal_connect (G_OBJECT (INKSCAPE), "activate_desktop", G_CALLBACK (sp_transientize_callback), &wd); - gtk_signal_connect (GTK_OBJECT (dlg), "event", GTK_SIGNAL_FUNC (sp_dialog_event_handler), dlg); - gtk_signal_connect (GTK_OBJECT (dlg), "destroy", G_CALLBACK (sp_gradient_vector_dialog_destroy), dlg); - gtk_signal_connect (GTK_OBJECT (dlg), "delete_event", G_CALLBACK (sp_gradient_vector_dialog_delete), dlg); - g_signal_connect (G_OBJECT (INKSCAPE), "shut_down", G_CALLBACK (sp_gradient_vector_dialog_delete), dlg); - g_signal_connect ( G_OBJECT (INKSCAPE), "dialogs_hide", G_CALLBACK (sp_dialog_hide), dlg ); - g_signal_connect ( G_OBJECT (INKSCAPE), "dialogs_unhide", G_CALLBACK (sp_dialog_unhide), dlg ); - - gtk_container_set_border_width (GTK_CONTAINER (dlg), PAD); - - wid = (GtkWidget*)sp_gradient_vector_widget_new (gradient, stop); - g_object_set_data (G_OBJECT (dlg), "gradient-vector-widget", wid); + g_signal_connect(G_OBJECT(INKSCAPE), "activate_desktop", G_CALLBACK(sp_transientize_callback), &wd); + gtk_signal_connect(GTK_OBJECT(dlg), "event", GTK_SIGNAL_FUNC(sp_dialog_event_handler), dlg); + gtk_signal_connect(GTK_OBJECT(dlg), "destroy", G_CALLBACK(sp_gradient_vector_dialog_destroy), dlg); + gtk_signal_connect(GTK_OBJECT(dlg), "delete_event", G_CALLBACK(sp_gradient_vector_dialog_delete), dlg); + g_signal_connect(G_OBJECT(INKSCAPE), "shut_down", G_CALLBACK(sp_gradient_vector_dialog_delete), dlg); + g_signal_connect( G_OBJECT(INKSCAPE), "dialogs_hide", G_CALLBACK(sp_dialog_hide), dlg ); + g_signal_connect( G_OBJECT(INKSCAPE), "dialogs_unhide", G_CALLBACK(sp_dialog_unhide), dlg ); + + gtk_container_set_border_width(GTK_CONTAINER(dlg), PAD); + + wid = static_cast<GtkWidget*>(sp_gradient_vector_widget_new(gradient, stop)); + g_object_set_data(G_OBJECT(dlg), "gradient-vector-widget", wid); /* Connect signals */ - gtk_widget_show (wid); - gtk_container_add (GTK_CONTAINER (dlg), wid); + gtk_widget_show(wid); + gtk_container_add(GTK_CONTAINER(dlg), wid); } else { // FIXME: temp fix for 0.38 // Simply load_gradient into the editor does not work for multi-stop gradients, @@ -946,29 +950,28 @@ sp_gradient_vector_editor_new (SPGradient *gradient, SPStop *stop) // and call sp_gradient_vector_editor_new again, so it creates the window anew. GdkEventAny event; - GtkWidget *widget = (GtkWidget *) dlg; + GtkWidget *widget = static_cast<GtkWidget *>(dlg); event.type = GDK_DELETE; event.window = widget->window; event.send_event = TRUE; - g_object_ref (G_OBJECT (event.window)); - gtk_main_do_event ((GdkEvent*)&event); - g_object_unref (G_OBJECT (event.window)); + g_object_ref(G_OBJECT(event.window)); + gtk_main_do_event(reinterpret_cast<GdkEvent*>(&event)); + g_object_unref(G_OBJECT(event.window)); - g_assert (dlg == NULL); - sp_gradient_vector_editor_new (gradient, stop); + g_assert(dlg == NULL); + sp_gradient_vector_editor_new(gradient, stop); } return dlg; } -static void -sp_gradient_vector_widget_load_gradient (GtkWidget *widget, SPGradient *gradient) +static void sp_gradient_vector_widget_load_gradient(GtkWidget *widget, SPGradient *gradient) { blocked = TRUE; SPGradient *old; - old = (SPGradient*)g_object_get_data (G_OBJECT (widget), "gradient"); + old = (SPGradient*)g_object_get_data(G_OBJECT(widget), "gradient"); if (old != gradient) { sigc::connection *release_connection; @@ -982,7 +985,7 @@ sp_gradient_vector_widget_load_gradient (GtkWidget *widget, SPGradient *gradient g_assert( modified_connection != NULL ); release_connection->disconnect(); modified_connection->disconnect(); - sp_signal_disconnect_by_data (old, widget); + sp_signal_disconnect_by_data(old, widget); } if (gradient) { @@ -1009,62 +1012,64 @@ sp_gradient_vector_widget_load_gradient (GtkWidget *widget, SPGradient *gradient g_object_set_data(G_OBJECT(widget), "gradient_modified_connection", modified_connection); } - g_object_set_data (G_OBJECT (widget), "gradient", gradient); + g_object_set_data(G_OBJECT(widget), "gradient", gradient); if (gradient) { - gtk_widget_set_sensitive (widget, TRUE); + gtk_widget_set_sensitive(widget, TRUE); - sp_gradient_ensure_vector (gradient); + sp_gradient_ensure_vector(gradient); - GtkOptionMenu *mnu = (GtkOptionMenu *)g_object_get_data (G_OBJECT(widget), "stopmenu"); - SPStop *stop = SP_STOP(g_object_get_data (G_OBJECT(gtk_menu_get_active (GTK_MENU(gtk_option_menu_get_menu (mnu)))), "stop")); + GtkOptionMenu *mnu = static_cast<GtkOptionMenu *>(g_object_get_data(G_OBJECT(widget), "stopmenu")); + SPStop *stop = SP_STOP(g_object_get_data(G_OBJECT(gtk_menu_get_active(GTK_MENU(gtk_option_menu_get_menu(mnu)))), "stop")); guint32 const c = sp_stop_get_rgba32(stop); /// get the color selector - SPColorSelector *csel = SP_COLOR_SELECTOR(g_object_get_data (G_OBJECT (widget), "cselector")); + SPColorSelector *csel = SP_COLOR_SELECTOR(g_object_get_data(G_OBJECT(widget), "cselector")); // set alpha - csel->base->setAlpha(SP_RGBA32_A_F (c)); - SPColor color( SP_RGBA32_R_F (c), SP_RGBA32_G_F (c), SP_RGBA32_B_F (c) ); + csel->base->setAlpha(SP_RGBA32_A_F(c)); + SPColor color( SP_RGBA32_R_F(c), SP_RGBA32_G_F(c), SP_RGBA32_B_F(c) ); // set color csel->base->setColor( color ); /* Fill preview */ GtkWidget *w = static_cast<GtkWidget *>(g_object_get_data(G_OBJECT(widget), "preview")); - sp_gradient_image_set_gradient (SP_GRADIENT_IMAGE (w), gradient); + sp_gradient_image_set_gradient(SP_GRADIENT_IMAGE(w), gradient); - update_stop_list (GTK_WIDGET(mnu), gradient, NULL); + update_stop_list(GTK_WIDGET(mnu), gradient, NULL); // Once the user edits a gradient, it stops being auto-collectable if (SP_OBJECT_REPR(gradient)->attribute("inkscape:collect")) { - SPDocument *document = SP_OBJECT_DOCUMENT (gradient); + SPDocument *document = SP_OBJECT_DOCUMENT(gradient); bool saved = sp_document_get_undo_sensitive(document); - sp_document_set_undo_sensitive (document, false); + sp_document_set_undo_sensitive(document, false); SP_OBJECT_REPR(gradient)->setAttribute("inkscape:collect", NULL); - sp_document_set_undo_sensitive (document, saved); + sp_document_set_undo_sensitive(document, saved); } } else { // no gradient, disable everything - gtk_widget_set_sensitive (widget, FALSE); + gtk_widget_set_sensitive(widget, FALSE); } blocked = FALSE; } -static void -sp_gradient_vector_dialog_destroy (GtkObject */*object*/, gpointer /*data*/) +static void sp_gradient_vector_dialog_destroy(GtkObject */*object*/, gpointer /*data*/) { - sp_signal_disconnect_by_data (INKSCAPE, dlg); + sp_signal_disconnect_by_data(INKSCAPE, dlg); wd.win = dlg = NULL; wd.stop = 0; } -static gboolean -sp_gradient_vector_dialog_delete (GtkWidget */*widget*/, GdkEvent */*event*/, GtkWidget */*dialog*/) +static gboolean sp_gradient_vector_dialog_delete(GtkWidget */*widget*/, GdkEvent */*event*/, GtkWidget */*dialog*/) { - gtk_window_get_position ((GtkWindow *) dlg, &x, &y); - gtk_window_get_size ((GtkWindow *) dlg, &w, &h); + gtk_window_get_position(GTK_WINDOW(dlg), &x, &y); + gtk_window_get_size(GTK_WINDOW(dlg), &w, &h); - if (x<0) x=0; - if (y<0) y=0; + if (x<0) { + x=0; + } + if (y<0) { + y=0; + } Inkscape::Preferences *prefs = Inkscape::Preferences::get(); prefs->setInt(prefs_path + "x", x); @@ -1077,12 +1082,11 @@ sp_gradient_vector_dialog_delete (GtkWidget */*widget*/, GdkEvent */*event*/, Gt /* Widget destroy handler */ -static void -sp_gradient_vector_widget_destroy (GtkObject *object, gpointer /*data*/) +static void sp_gradient_vector_widget_destroy(GtkObject *object, gpointer /*data*/) { GObject *gradient; - gradient = (GObject*)g_object_get_data (G_OBJECT (object), "gradient"); + gradient = (GObject*)g_object_get_data(G_OBJECT(object), "gradient"); sigc::connection *release_connection = (sigc::connection *)g_object_get_data(G_OBJECT(object), "gradient_release_connection"); sigc::connection *modified_connection = (sigc::connection *)g_object_get_data(G_OBJECT(object), "gradient_modified_connection"); @@ -1092,27 +1096,25 @@ sp_gradient_vector_widget_destroy (GtkObject *object, gpointer /*data*/) g_assert( modified_connection != NULL ); release_connection->disconnect(); modified_connection->disconnect(); - sp_signal_disconnect_by_data (gradient, object); + sp_signal_disconnect_by_data(gradient, object); } if (gradient && SP_OBJECT_REPR(gradient)) { - sp_repr_remove_listener_by_data (SP_OBJECT_REPR(gradient), object); + sp_repr_remove_listener_by_data(SP_OBJECT_REPR(gradient), object); } } -static void -sp_gradient_vector_gradient_release (SPObject */*object*/, GtkWidget *widget) +static void sp_gradient_vector_gradient_release(SPObject */*object*/, GtkWidget *widget) { - sp_gradient_vector_widget_load_gradient (widget, NULL); + sp_gradient_vector_widget_load_gradient(widget, NULL); } -static void -sp_gradient_vector_gradient_modified (SPObject *object, guint /*flags*/, GtkWidget *widget) +static void sp_gradient_vector_gradient_modified(SPObject *object, guint /*flags*/, GtkWidget *widget) { SPGradient *gradient=SP_GRADIENT(object); if (!blocked) { blocked = TRUE; - sp_gradient_vector_widget_load_gradient (widget, gradient); + sp_gradient_vector_widget_load_gradient(widget, gradient); blocked = FALSE; } } @@ -1121,79 +1123,86 @@ static void sp_gradient_vector_color_dragged(SPColorSelector *csel, GtkObject *o { SPGradient *gradient, *ngr; - if (blocked) return; + if (blocked) { + return; + } - gradient = (SPGradient*)g_object_get_data (G_OBJECT (object), "gradient"); - if (!gradient) return; + gradient = static_cast<SPGradient*>(g_object_get_data(G_OBJECT(object), "gradient")); + if (!gradient) { + return; + } blocked = TRUE; - ngr = sp_gradient_ensure_vector_normalized (gradient); + ngr = sp_gradient_ensure_vector_normalized(gradient); if (ngr != gradient) { /* Our master gradient has changed */ - sp_gradient_vector_widget_load_gradient (GTK_WIDGET (object), ngr); + sp_gradient_vector_widget_load_gradient(GTK_WIDGET(object), ngr); } - sp_gradient_ensure_vector (ngr); + sp_gradient_ensure_vector(ngr); - GtkOptionMenu *mnu = (GtkOptionMenu *)g_object_get_data (G_OBJECT(object), "stopmenu"); - SPStop *stop = SP_STOP(g_object_get_data (G_OBJECT(gtk_menu_get_active (GTK_MENU(gtk_option_menu_get_menu (mnu)))), "stop")); + GtkOptionMenu *mnu = static_cast<GtkOptionMenu *>(g_object_get_data(G_OBJECT(object), "stopmenu")); + SPStop *stop = SP_STOP(g_object_get_data(G_OBJECT(gtk_menu_get_active(GTK_MENU(gtk_option_menu_get_menu(mnu)))), "stop")); - csel->base->getColorAlpha(stop->specified_color, &stop->opacity); + csel->base->getColorAlpha(stop->specified_color, stop->opacity); stop->currentColor = false; blocked = FALSE; } -static void -sp_gradient_vector_color_changed (SPColorSelector *csel, GtkObject *object) +static void sp_gradient_vector_color_changed(SPColorSelector *csel, GtkObject *object) { SPColor color; float alpha; guint32 rgb; - if (blocked) return; + if (blocked) { + return; + } - SPGradient *gradient = (SPGradient*)g_object_get_data (G_OBJECT (object), "gradient"); - if (!gradient) return; + SPGradient *gradient = static_cast<SPGradient*>(g_object_get_data(G_OBJECT(object), "gradient")); + if (!gradient) { + return; + } blocked = TRUE; - SPGradient *ngr = sp_gradient_ensure_vector_normalized (gradient); + SPGradient *ngr = sp_gradient_ensure_vector_normalized(gradient); if (ngr != gradient) { /* Our master gradient has changed */ - sp_gradient_vector_widget_load_gradient (GTK_WIDGET (object), ngr); + sp_gradient_vector_widget_load_gradient(GTK_WIDGET(object), ngr); } - sp_gradient_ensure_vector (ngr); + sp_gradient_ensure_vector(ngr); /* Set start parameters */ /* We rely on normalized vector, i.e. stops HAVE to exist */ - g_return_if_fail (sp_first_stop(ngr) != NULL); + g_return_if_fail(ngr->getFirstStop() != NULL); - GtkOptionMenu *mnu = (GtkOptionMenu *)g_object_get_data (G_OBJECT(object), "stopmenu"); - SPStop *stop = SP_STOP(g_object_get_data (G_OBJECT(gtk_menu_get_active (GTK_MENU(gtk_option_menu_get_menu (mnu)))), "stop")); + GtkOptionMenu *mnu = static_cast<GtkOptionMenu *>(g_object_get_data(G_OBJECT(object), "stopmenu")); + SPStop *stop = SP_STOP(g_object_get_data(G_OBJECT(gtk_menu_get_active(GTK_MENU(gtk_option_menu_get_menu(mnu)))), "stop")); - csel = (SPColorSelector*)g_object_get_data (G_OBJECT (object), "cselector"); - csel->base->getColorAlpha( color, &alpha ); + csel = static_cast<SPColorSelector*>(g_object_get_data(G_OBJECT(object), "cselector")); + csel->base->getColorAlpha( color, alpha ); rgb = color.toRGBA32( 0x00 ); - sp_repr_set_css_double (SP_OBJECT_REPR (stop), "offset", stop->offset); + sp_repr_set_css_double(SP_OBJECT_REPR(stop), "offset", stop->offset); Inkscape::CSSOStringStream os; gchar c[64]; - sp_svg_write_color (c, sizeof(c), rgb); - os << "stop-color:" << c << ";stop-opacity:" << (gdouble) alpha <<";"; - SP_OBJECT_REPR (stop)->setAttribute("style", os.str().c_str()); - // g_snprintf (c, 256, "stop-color:#%06x;stop-opacity:%g;", rgb >> 8, (gdouble) alpha); - //SP_OBJECT_REPR (stop)->setAttribute("style", c); + sp_svg_write_color(c, sizeof(c), rgb); + os << "stop-color:" << c << ";stop-opacity:" << static_cast<gdouble>(alpha) <<";"; + SP_OBJECT_REPR(stop)->setAttribute("style", os.str().c_str()); + // g_snprintf(c, 256, "stop-color:#%06x;stop-opacity:%g;", rgb >> 8, static_cast<gdouble>(alpha)); + //SP_OBJECT_REPR(stop)->setAttribute("style", c); - sp_document_done (SP_OBJECT_DOCUMENT (ngr), SP_VERB_CONTEXT_GRADIENT, + sp_document_done(SP_OBJECT_DOCUMENT(ngr), SP_VERB_CONTEXT_GRADIENT, _("Change gradient stop color")); blocked = FALSE; - SPColorPreview *cpv = (SPColorPreview *)g_object_get_data (G_OBJECT(gtk_menu_get_active (GTK_MENU(gtk_option_menu_get_menu (mnu)))), "preview"); + SPColorPreview *cpv = static_cast<SPColorPreview *>(g_object_get_data(G_OBJECT(gtk_menu_get_active(GTK_MENU(gtk_option_menu_get_menu(mnu)))), "preview")); sp_color_preview_set_rgba32(cpv, sp_stop_get_rgba32(stop)); } diff --git a/src/widgets/gradient-vector.h b/src/widgets/gradient-vector.h index ea1f5159f..ceca9158c 100644 --- a/src/widgets/gradient-vector.h +++ b/src/widgets/gradient-vector.h @@ -6,7 +6,9 @@ * * Author: * Lauris Kaplinski <lauris@kaplinski.com> + * Jon A. Cruz <jon@joncruz.org> * + * Copyright (C) 2010 Jon A. Cruz * Copyright (C) 2001-2002 Lauris Kaplinski * Copyright (C) 2001 Ximian, Inc. * @@ -31,6 +33,8 @@ struct SPGradientVectorSelector { guint idlabel : 1; + bool swatched; + SPDocument *doc; SPGradient *gr; @@ -40,6 +44,9 @@ struct SPGradientVectorSelector { sigc::connection gradient_release_connection; sigc::connection defs_release_connection; sigc::connection defs_modified_connection; + + + void setSwatched(); }; struct SPGradientVectorSelectorClass { diff --git a/src/widgets/icon.cpp b/src/widgets/icon.cpp index 743502d27..5d91d3532 100644 --- a/src/widgets/icon.cpp +++ b/src/widgets/icon.cpp @@ -1115,6 +1115,26 @@ static guchar *load_svg_pixels(gchar const *name, /* Create ArenaItem and set transform */ unsigned visionkey = sp_item_display_key_new(1); /* fixme: Memory manage root if needed (Lauris) */ + // This needs to be fixed indeed; this leads to a memory leak of a few megabytes these days + // because shapes are being rendered which are not being freed + // Valgrind output: + /*==7014== 1,548,344 bytes in 599 blocks are possibly lost in loss record 20,361 of 20,362 + ==7014== at 0x4A05974: operator new(unsigned long) (vg_replace_malloc.c:220) + ==7014== by 0x4F1015: __gnu_cxx::new_allocator<Shape::point_data>::allocate(unsigned long, void const*) (new_allocator.h:89) + ==7014== by 0x4F02AC: std::_Vector_base<Shape::point_data, std::allocator<Shape::point_data> >::_M_allocate(unsigned long) (stl_vector.h:140) + ==7014== by 0xCF62D7: std::vector<Shape::point_data, std::allocator<Shape::point_data> >::_M_fill_insert(__gnu_cxx::__normal_iterator<Shape::point_data*, std::vector<Shape::point_data, std::allocator<Shape::point_data> > >, unsigned long, Shape::point_data const&) (vector.tcc:414) + ==7014== by 0xCF4D45: std::vector<Shape::point_data, std::allocator<Shape::point_data> >::insert(__gnu_cxx::__normal_iterator<Shape::point_data*, std::vector<Shape::point_data, std::allocator<Shape::point_data> > >, unsigned long, Shape::point_data const&) (stl_vector.h:851) + ==7014== by 0xCF3DCD: std::vector<Shape::point_data, std::allocator<Shape::point_data> >::resize(unsigned long, Shape::point_data) (stl_vector.h:557) + ==7014== by 0xCEA771: Shape::AddPoint(Geom::Point) (Shape.cpp:326) + ==7014== by 0xD0F413: Shape::ConvertToShape(Shape*, fill_typ, bool) (ShapeSweep.cpp:257) + ==7014== by 0x5ECD4F: nr_arena_shape_update_stroke(NRArenaShape*, NRGC*, NRRectL*) (nr-arena-shape.cpp:651) + ==7014== by 0x5EE0DA: nr_arena_shape_render(_cairo*, NRArenaItem*, NRRectL*, NRPixBlock*, unsigned int) (nr-arena-shape.cpp:862) + ==7014== by 0x5E72FB: nr_arena_item_invoke_render(_cairo*, NRArenaItem*, NRRectL const*, NRPixBlock*, unsigned int) (nr-arena-item.cpp:578) + ==7014== by 0x5E9DDE: nr_arena_group_render(_cairo*, NRArenaItem*, NRRectL*, NRPixBlock*, unsigned int) (nr-arena-group.cpp:228) + ==7014== by 0x5E72FB: nr_arena_item_invoke_render(_cairo*, NRArenaItem*, NRRectL const*, NRPixBlock*, unsigned int) (nr-arena-item.cpp:578) + ==7014== by 0x5E9DDE: nr_arena_group_render(_cairo*, NRArenaItem*, NRRectL*, NRPixBlock*, unsigned int) (nr-arena-group.cpp:228) + ==7014== by 0x5E72FB: nr_arena_item_invoke_render(_cairo*, NRArenaItem*, NRRectL const*, NRPixBlock*, unsigned int) (nr-arena-item.cpp:578) + */ root = sp_item_invoke_show( SP_ITEM(SP_DOCUMENT_ROOT(doc)), arena, visionkey, SP_ITEM_SHOW_DISPLAY ); diff --git a/src/widgets/paint-selector.cpp b/src/widgets/paint-selector.cpp index a101b9eeb..288764177 100644 --- a/src/widgets/paint-selector.cpp +++ b/src/widgets/paint-selector.cpp @@ -1,13 +1,16 @@ -#define __SP_PAINT_SELECTOR_C__ - /** \file * SPPaintSelector: Generic paint selector widget. */ /* - * Copyright (C) Lauris Kaplinski 2002 + * Authors: + * Lauris Kaplinski * bulia byak <buliabyak@users.sf.net> * John Cliff <simarilius@yahoo.com> + * Jon A. Cruz <jon@joncruz.org> + * + * Copyright (C) Lauris Kaplinski 2002 + * Copyright (C) 2010 Authors */ #define noSP_PS_VERBOSE @@ -49,6 +52,7 @@ #include "io/sys.h" #include "helper/stock-items.h" #include "ui/icon-names.h" +#include "widgets/swatch-selector.h" #include "paint-selector.h" @@ -56,6 +60,9 @@ #include "svg/svg-icc-color.h" #endif // SP_PS_VERBOSE + +using Inkscape::Widgets::SwatchSelector; + enum { MODE_CHANGED, GRABBED, @@ -70,16 +77,17 @@ static void sp_paint_selector_class_init(SPPaintSelectorClass *klass); static void sp_paint_selector_init(SPPaintSelector *slider); static void sp_paint_selector_destroy(GtkObject *object); -static GtkWidget *sp_paint_selector_style_button_add(SPPaintSelector *psel, gchar const *px, SPPaintSelectorMode mode, GtkTooltips *tt, gchar const *tip); +static GtkWidget *sp_paint_selector_style_button_add(SPPaintSelector *psel, gchar const *px, SPPaintSelector::Mode mode, GtkTooltips *tt, gchar const *tip); static void sp_paint_selector_style_button_toggled(GtkToggleButton *tb, SPPaintSelector *psel); static void sp_paint_selector_fillrule_toggled(GtkToggleButton *tb, SPPaintSelector *psel); static void sp_paint_selector_set_mode_empty(SPPaintSelector *psel); static void sp_paint_selector_set_mode_multiple(SPPaintSelector *psel); static void sp_paint_selector_set_mode_none(SPPaintSelector *psel); -static void sp_paint_selector_set_mode_color(SPPaintSelector *psel, SPPaintSelectorMode mode); -static void sp_paint_selector_set_mode_gradient(SPPaintSelector *psel, SPPaintSelectorMode mode); -static void sp_paint_selector_set_mode_pattern(SPPaintSelector *psel, SPPaintSelectorMode mode); +static void sp_paint_selector_set_mode_color(SPPaintSelector *psel, SPPaintSelector::Mode mode); +static void sp_paint_selector_set_mode_gradient(SPPaintSelector *psel, SPPaintSelector::Mode mode); +static void sp_paint_selector_set_mode_pattern(SPPaintSelector *psel, SPPaintSelector::Mode mode); +static void sp_paint_selector_set_mode_swatch(SPPaintSelector *psel, SPPaintSelector::Mode mode); static void sp_paint_selector_set_mode_unset(SPPaintSelector *psel); @@ -88,6 +96,48 @@ static void sp_paint_selector_set_style_buttons(SPPaintSelector *psel, GtkWidget static GtkVBoxClass *parent_class; static guint psel_signals[LAST_SIGNAL] = {0}; +#ifdef SP_PS_VERBOSE +static gchar const* modeStrings[] = { + "MODE_EMPTY", + "MODE_MULTIPLE", + "MODE_NONE", + "MODE_COLOR_RGB", + "MODE_COLOR_CMYK", + "MODE_GRADIENT_LINEAR", + "MODE_GRADIENT_RADIAL", + "MODE_PATTERN", + "MODE_SWATCH", + "MODE_UNSET", + ".", + ".", + ".", +}; +#endif + + +static bool isPaintModeGradient( SPPaintSelector::Mode mode ) +{ + bool isGrad = (mode == SPPaintSelector::MODE_GRADIENT_LINEAR) || + (mode == SPPaintSelector::MODE_GRADIENT_RADIAL) || + (mode == SPPaintSelector::MODE_SWATCH); + + return isGrad; +} + +static SPGradientSelector *getGradientFromData(SPPaintSelector const *psel) +{ + SPGradientSelector *grad = 0; + if (psel->mode == SPPaintSelector::MODE_SWATCH) { + SwatchSelector *swatchsel = static_cast<SwatchSelector*>(g_object_get_data(G_OBJECT(psel->selector), "swatch-selector")); + if (swatchsel) { + grad = swatchsel->getGradientSelector(); + } + } else { + grad = reinterpret_cast<SPGradientSelector*>(gtk_object_get_data(GTK_OBJECT(psel->selector), "gradient-selector")); + } + return grad; +} + GType sp_paint_selector_get_type(void) { static GtkType type = 0; @@ -168,7 +218,7 @@ sp_paint_selector_init(SPPaintSelector *psel) { GtkTooltips *tt = gtk_tooltips_new(); - psel->mode = (SPPaintSelectorMode)-1; // huh? do you mean 0xff? -- I think this means "not in the enum" + psel->mode = static_cast<SPPaintSelector::Mode>(-1); // huh? do you mean 0xff? -- I think this means "not in the enum" /* Paint style button box */ psel->style = gtk_hbox_new(FALSE, 0); @@ -178,17 +228,19 @@ sp_paint_selector_init(SPPaintSelector *psel) /* Buttons */ psel->none = sp_paint_selector_style_button_add(psel, INKSCAPE_ICON_PAINT_NONE, - SP_PAINT_SELECTOR_MODE_NONE, tt, _("No paint")); + SPPaintSelector::MODE_NONE, tt, _("No paint")); psel->solid = sp_paint_selector_style_button_add(psel, INKSCAPE_ICON_PAINT_SOLID, - SP_PAINT_SELECTOR_MODE_COLOR_RGB, tt, _("Flat color")); + SPPaintSelector::MODE_COLOR_RGB, tt, _("Flat color")); psel->gradient = sp_paint_selector_style_button_add(psel, INKSCAPE_ICON_PAINT_GRADIENT_LINEAR, - SP_PAINT_SELECTOR_MODE_GRADIENT_LINEAR, tt, _("Linear gradient")); + SPPaintSelector::MODE_GRADIENT_LINEAR, tt, _("Linear gradient")); psel->radial = sp_paint_selector_style_button_add(psel, INKSCAPE_ICON_PAINT_GRADIENT_RADIAL, - SP_PAINT_SELECTOR_MODE_GRADIENT_RADIAL, tt, _("Radial gradient")); + SPPaintSelector::MODE_GRADIENT_RADIAL, tt, _("Radial gradient")); psel->pattern = sp_paint_selector_style_button_add(psel, INKSCAPE_ICON_PAINT_PATTERN, - SP_PAINT_SELECTOR_MODE_PATTERN, tt, _("Pattern")); + SPPaintSelector::MODE_PATTERN, tt, _("Pattern")); + psel->swatch = sp_paint_selector_style_button_add(psel, INKSCAPE_ICON_PAINT_SWATCH, + SPPaintSelector::MODE_SWATCH, tt, _("Swatch")); psel->unset = sp_paint_selector_style_button_add(psel, INKSCAPE_ICON_PAINT_UNKNOWN, - SP_PAINT_SELECTOR_MODE_UNSET, tt, _("Unset paint (make it undefined so it can be inherited)")); + SPPaintSelector::MODE_UNSET, tt, _("Unset paint (make it undefined so it can be inherited)")); /* Fillrule */ { @@ -201,7 +253,7 @@ sp_paint_selector_init(SPPaintSelector *psel) gtk_toggle_button_set_mode(GTK_TOGGLE_BUTTON(psel->evenodd), FALSE); // TRANSLATORS: for info, see http://www.w3.org/TR/2000/CR-SVG-20000802/painting.html#FillRuleProperty gtk_tooltips_set_tip(tt, psel->evenodd, _("Any path self-intersections or subpaths create holes in the fill (fill-rule: evenodd)"), NULL); - gtk_object_set_data(GTK_OBJECT(psel->evenodd), "mode", GUINT_TO_POINTER(SP_PAINT_SELECTOR_FILLRULE_EVENODD)); + gtk_object_set_data(GTK_OBJECT(psel->evenodd), "mode", GUINT_TO_POINTER(SPPaintSelector::FILLRULE_EVENODD)); w = sp_icon_new(Inkscape::ICON_SIZE_DECORATION, INKSCAPE_ICON_FILL_RULE_EVEN_ODD); gtk_container_add(GTK_CONTAINER(psel->evenodd), w); gtk_box_pack_start(GTK_BOX(psel->fillrulebox), psel->evenodd, FALSE, FALSE, 0); @@ -212,7 +264,7 @@ sp_paint_selector_init(SPPaintSelector *psel) gtk_toggle_button_set_mode(GTK_TOGGLE_BUTTON(psel->nonzero), FALSE); // TRANSLATORS: for info, see http://www.w3.org/TR/2000/CR-SVG-20000802/painting.html#FillRuleProperty gtk_tooltips_set_tip(tt, psel->nonzero, _("Fill is solid unless a subpath is counterdirectional (fill-rule: nonzero)"), NULL); - gtk_object_set_data(GTK_OBJECT(psel->nonzero), "mode", GUINT_TO_POINTER(SP_PAINT_SELECTOR_FILLRULE_NONZERO)); + gtk_object_set_data(GTK_OBJECT(psel->nonzero), "mode", GUINT_TO_POINTER(SPPaintSelector::FILLRULE_NONZERO)); w = sp_icon_new(Inkscape::ICON_SIZE_DECORATION, INKSCAPE_ICON_FILL_RULE_NONZERO); gtk_container_add(GTK_CONTAINER(psel->nonzero), w); gtk_box_pack_start(GTK_BOX(psel->fillrulebox), psel->nonzero, FALSE, FALSE, 0); @@ -242,10 +294,9 @@ sp_paint_selector_destroy(GtkObject *object) (* ((GtkObjectClass *) parent_class)->destroy)(object); } -static GtkWidget * -sp_paint_selector_style_button_add(SPPaintSelector *psel, - gchar const *pixmap, SPPaintSelectorMode mode, - GtkTooltips *tt, gchar const *tip) +static GtkWidget *sp_paint_selector_style_button_add(SPPaintSelector *psel, + gchar const *pixmap, SPPaintSelector::Mode mode, + GtkTooltips *tt, gchar const *tip) { GtkWidget *b, *w; @@ -274,7 +325,7 @@ static void sp_paint_selector_style_button_toggled(GtkToggleButton *tb, SPPaintSelector *psel) { if (!psel->update && gtk_toggle_button_get_active(tb)) { - sp_paint_selector_set_mode(psel, (SPPaintSelectorMode)GPOINTER_TO_UINT(gtk_object_get_data(GTK_OBJECT(tb), "mode"))); + psel->setMode(static_cast<SPPaintSelector::Mode>(GPOINTER_TO_UINT(gtk_object_get_data(GTK_OBJECT(tb), "mode")))); } } @@ -282,7 +333,7 @@ static void sp_paint_selector_fillrule_toggled(GtkToggleButton *tb, SPPaintSelector *psel) { if (!psel->update && gtk_toggle_button_get_active(tb)) { - SPPaintSelectorFillRule fr = (SPPaintSelectorFillRule)GPOINTER_TO_UINT(gtk_object_get_data(GTK_OBJECT(tb), "mode")); + SPPaintSelector::FillRule fr = static_cast<SPPaintSelector::FillRule>(GPOINTER_TO_UINT(g_object_get_data(G_OBJECT(tb), "mode"))); gtk_signal_emit(GTK_OBJECT(psel), psel_signals[FILLRULE_CHANGED], fr); } } @@ -304,11 +355,9 @@ sp_paint_selector_show_fillrule(SPPaintSelector *psel, bool is_fill) GtkWidget * sp_paint_selector_new(bool is_fill) { - SPPaintSelector *psel; + SPPaintSelector *psel = static_cast<SPPaintSelector*>(gtk_type_new(SP_TYPE_PAINT_SELECTOR)); - psel = (SPPaintSelector*)gtk_type_new(SP_TYPE_PAINT_SELECTOR); - - sp_paint_selector_set_mode(psel, SP_PAINT_SELECTOR_MODE_MULTIPLE); + psel->setMode(SPPaintSelector::MODE_MULTIPLE); // This silliness is here because I don't know how to pass a parameter to the // GtkObject "constructor" (sp_paint_selector_init). Remove it when paint_selector @@ -318,63 +367,64 @@ sp_paint_selector_new(bool is_fill) return GTK_WIDGET(psel); } -void -sp_paint_selector_set_mode(SPPaintSelector *psel, SPPaintSelectorMode mode) +void SPPaintSelector::setMode(Mode mode) { - if (psel->mode != mode) { - psel->update = TRUE; + if (this->mode != mode) { + update = TRUE; #ifdef SP_PS_VERBOSE - g_print("Mode change %d -> %d\n", psel->mode, mode); + g_print("Mode change %d -> %d %s -> %s\n", this->mode, mode, modeStrings[this->mode], modeStrings[mode]); #endif switch (mode) { - case SP_PAINT_SELECTOR_MODE_EMPTY: - sp_paint_selector_set_mode_empty(psel); + case MODE_EMPTY: + sp_paint_selector_set_mode_empty(this); break; - case SP_PAINT_SELECTOR_MODE_MULTIPLE: - sp_paint_selector_set_mode_multiple(psel); + case MODE_MULTIPLE: + sp_paint_selector_set_mode_multiple(this); break; - case SP_PAINT_SELECTOR_MODE_NONE: - sp_paint_selector_set_mode_none(psel); + case MODE_NONE: + sp_paint_selector_set_mode_none(this); break; - case SP_PAINT_SELECTOR_MODE_COLOR_RGB: - case SP_PAINT_SELECTOR_MODE_COLOR_CMYK: - sp_paint_selector_set_mode_color(psel, mode); + case MODE_COLOR_RGB: + case MODE_COLOR_CMYK: + sp_paint_selector_set_mode_color(this, mode); break; - case SP_PAINT_SELECTOR_MODE_GRADIENT_LINEAR: - case SP_PAINT_SELECTOR_MODE_GRADIENT_RADIAL: - sp_paint_selector_set_mode_gradient(psel, mode); + case MODE_GRADIENT_LINEAR: + case MODE_GRADIENT_RADIAL: + sp_paint_selector_set_mode_gradient(this, mode); break; - case SP_PAINT_SELECTOR_MODE_PATTERN: - sp_paint_selector_set_mode_pattern(psel, mode); + case MODE_PATTERN: + sp_paint_selector_set_mode_pattern(this, mode); break; - case SP_PAINT_SELECTOR_MODE_UNSET: - sp_paint_selector_set_mode_unset(psel); + case MODE_SWATCH: + sp_paint_selector_set_mode_swatch(this, mode); + break; + case MODE_UNSET: + sp_paint_selector_set_mode_unset(this); break; default: g_warning("file %s: line %d: Unknown paint mode %d", __FILE__, __LINE__, mode); break; } - psel->mode = mode; - gtk_signal_emit(GTK_OBJECT(psel), psel_signals[MODE_CHANGED], psel->mode); - psel->update = FALSE; + this->mode = mode; + gtk_signal_emit(GTK_OBJECT(this), psel_signals[MODE_CHANGED], this->mode); + update = FALSE; } } -void -sp_paint_selector_set_fillrule(SPPaintSelector *psel, SPPaintSelectorFillRule fillrule) +void SPPaintSelector::setFillrule(FillRule fillrule) { - if (psel->fillrulebox) { - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(psel->evenodd), (fillrule == SP_PAINT_SELECTOR_FILLRULE_EVENODD)); - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(psel->nonzero), (fillrule == SP_PAINT_SELECTOR_FILLRULE_NONZERO)); + if (fillrulebox) { + // TODO this flips widgets but does not use a member to store state. Revisit + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(evenodd), (fillrule == FILLRULE_EVENODD)); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(nonzero), (fillrule == FILLRULE_NONZERO)); } } -void -sp_paint_selector_set_color_alpha(SPPaintSelector *psel, SPColor const *color, float alpha) +void SPPaintSelector::setColorAlpha(SPColor const &color, float alpha) { g_return_if_fail( ( 0.0 <= alpha ) && ( alpha <= 1.0 ) ); - SPColorSelector *csel; - guint32 rgba; + SPColorSelector *csel = 0; + guint32 rgba = 0; /* if ( sp_color_get_colorspace_type(color) == SP_COLORSPACE_TYPE_CMYK ) @@ -382,7 +432,7 @@ sp_paint_selector_set_color_alpha(SPPaintSelector *psel, SPColor const *color, f #ifdef SP_PS_VERBOSE g_print("PaintSelector set CMYKA\n"); #endif - sp_paint_selector_set_mode(psel, SP_PAINT_SELECTOR_MODE_COLOR_CMYK); + sp_paint_selector_set_mode(psel, MODE_COLOR_CMYK); } else */ @@ -390,104 +440,105 @@ sp_paint_selector_set_color_alpha(SPPaintSelector *psel, SPColor const *color, f #ifdef SP_PS_VERBOSE g_print("PaintSelector set RGBA\n"); #endif - sp_paint_selector_set_mode(psel, SP_PAINT_SELECTOR_MODE_COLOR_RGB); + setMode(MODE_COLOR_RGB); } - csel = (SPColorSelector*)gtk_object_get_data(GTK_OBJECT(psel->selector), "color-selector"); - rgba = color->toRGBA32( alpha ); - csel->base->setColorAlpha( *color, alpha ); + csel = reinterpret_cast<SPColorSelector*>(gtk_object_get_data(GTK_OBJECT(selector), "color-selector")); + rgba = color.toRGBA32( alpha ); + csel->base->setColorAlpha( color, alpha ); } -void -sp_paint_selector_set_gradient_linear(SPPaintSelector *psel, SPGradient *vector) +void SPPaintSelector::setSwatch(SPGradient *vector ) +{ +#ifdef SP_PS_VERBOSE + g_print("PaintSelector set SWATCH\n"); +#endif + setMode(MODE_SWATCH); + + SwatchSelector *swatchsel = static_cast<SwatchSelector*>(g_object_get_data(G_OBJECT(selector), "swatch-selector")); + if (swatchsel) { + swatchsel->setVector( (vector) ? SP_OBJECT_DOCUMENT(vector) : 0, vector ); + } +} + +void SPPaintSelector::setGradientLinear(SPGradient *vector) { - SPGradientSelector *gsel; #ifdef SP_PS_VERBOSE g_print("PaintSelector set GRADIENT LINEAR\n"); #endif - sp_paint_selector_set_mode(psel, SP_PAINT_SELECTOR_MODE_GRADIENT_LINEAR); + setMode(MODE_GRADIENT_LINEAR); - gsel = (SPGradientSelector*)gtk_object_get_data(GTK_OBJECT(psel->selector), "gradient-selector"); + SPGradientSelector *gsel = getGradientFromData(this); - sp_gradient_selector_set_mode(gsel, SP_GRADIENT_SELECTOR_MODE_LINEAR); - sp_gradient_selector_set_vector(gsel, (vector) ? SP_OBJECT_DOCUMENT(vector) : NULL, vector); + gsel->setMode(SPGradientSelector::MODE_LINEAR); + gsel->setVector((vector) ? SP_OBJECT_DOCUMENT(vector) : 0, vector); } -void -sp_paint_selector_set_gradient_radial(SPPaintSelector *psel, SPGradient *vector) +void SPPaintSelector::setGradientRadial(SPGradient *vector) { - SPGradientSelector *gsel; #ifdef SP_PS_VERBOSE g_print("PaintSelector set GRADIENT RADIAL\n"); #endif - sp_paint_selector_set_mode(psel, SP_PAINT_SELECTOR_MODE_GRADIENT_RADIAL); + setMode(MODE_GRADIENT_RADIAL); - gsel = (SPGradientSelector*)gtk_object_get_data(GTK_OBJECT(psel->selector), "gradient-selector"); + SPGradientSelector *gsel = getGradientFromData(this); - sp_gradient_selector_set_mode(gsel, SP_GRADIENT_SELECTOR_MODE_RADIAL); - sp_gradient_selector_set_vector(gsel, (vector) ? SP_OBJECT_DOCUMENT(vector) : NULL, vector); + gsel->setMode(SPGradientSelector::MODE_RADIAL); + + gsel->setVector((vector) ? SP_OBJECT_DOCUMENT(vector) : 0, vector); } -void -sp_paint_selector_set_gradient_properties(SPPaintSelector *psel, SPGradientUnits units, SPGradientSpread spread) +void SPPaintSelector::setGradientProperties( SPGradientUnits units, SPGradientSpread spread ) { - SPGradientSelector *gsel; - g_return_if_fail(SP_IS_PAINT_SELECTOR(psel)); - g_return_if_fail((psel->mode == SP_PAINT_SELECTOR_MODE_GRADIENT_LINEAR) || - (psel->mode == SP_PAINT_SELECTOR_MODE_GRADIENT_RADIAL)); - gsel = (SPGradientSelector*)gtk_object_get_data(GTK_OBJECT(psel->selector), "gradient-selector"); - sp_gradient_selector_set_units(gsel, units); - sp_gradient_selector_set_spread(gsel, spread); + g_return_if_fail(isPaintModeGradient(mode)); + + SPGradientSelector *gsel = getGradientFromData(this); + gsel->setUnits(units); + gsel->setSpread(spread); } -void -sp_paint_selector_get_gradient_properties(SPPaintSelector *psel, SPGradientUnits *units, SPGradientSpread *spread) +void SPPaintSelector::getGradientProperties( SPGradientUnits &units, SPGradientSpread &spread) const { - SPGradientSelector *gsel; - g_return_if_fail(SP_IS_PAINT_SELECTOR(psel)); - g_return_if_fail((psel->mode == SP_PAINT_SELECTOR_MODE_GRADIENT_LINEAR) || - (psel->mode == SP_PAINT_SELECTOR_MODE_GRADIENT_RADIAL)); - gsel = (SPGradientSelector*)gtk_object_get_data(GTK_OBJECT(psel->selector), "gradient-selector"); - if (units) *units = sp_gradient_selector_get_units(gsel); - if (spread) *spread = sp_gradient_selector_get_spread(gsel); + g_return_if_fail(isPaintModeGradient(mode)); + + SPGradientSelector *gsel = getGradientFromData(this); + units = gsel->getUnits(); + spread = gsel->getSpread(); } /** * \post (alpha == NULL) || (*alpha in [0.0, 1.0]). */ -void -sp_paint_selector_get_color_alpha(SPPaintSelector *psel, SPColor *color, gfloat *alpha) +void SPPaintSelector::getColorAlpha(SPColor &color, gfloat &alpha) const { SPColorSelector *csel; - csel = (SPColorSelector*)gtk_object_get_data(GTK_OBJECT(psel->selector), "color-selector"); + csel = reinterpret_cast<SPColorSelector*>(g_object_get_data(G_OBJECT(selector), "color-selector")); - csel->base->getColorAlpha( *color, alpha ); + csel->base->getColorAlpha( color, alpha ); - g_assert( !alpha - || ( ( 0.0 <= *alpha ) - && ( *alpha <= 1.0 ) ) ); + g_assert( ( 0.0 <= alpha ) + && ( alpha <= 1.0 ) ); } -SPGradient * -sp_paint_selector_get_gradient_vector(SPPaintSelector *psel) +SPGradient *SPPaintSelector::getGradientVector() { - SPGradientSelector *gsel; + SPGradient* vect = 0; - g_return_val_if_fail((psel->mode == SP_PAINT_SELECTOR_MODE_GRADIENT_LINEAR) || - (psel->mode == SP_PAINT_SELECTOR_MODE_GRADIENT_RADIAL), NULL); - - gsel = (SPGradientSelector*)gtk_object_get_data(GTK_OBJECT(psel->selector), "gradient-selector"); + if (isPaintModeGradient(mode)) { + SPGradientSelector *gsel = getGradientFromData(this); + vect = gsel->getVector(); + } - return sp_gradient_selector_get_vector(gsel); + return vect; } -void -sp_gradient_selector_attrs_to_gradient(SPGradient *gr, SPPaintSelector *psel) + +void SPPaintSelector::pushAttrsToGradient( SPGradient *gr ) const { - SPGradientUnits units; - SPGradientSpread spread; - sp_paint_selector_get_gradient_properties(psel, &units, &spread); + SPGradientUnits units = SP_GRADIENT_UNITS_OBJECTBOUNDINGBOX; + SPGradientSpread spread = SP_GRADIENT_SPREAD_PAD; + getGradientProperties( units, spread ); sp_gradient_set_units(gr, units); sp_gradient_set_spread(gr, spread); SP_OBJECT(gr)->updateRepr(); @@ -566,45 +617,37 @@ sp_paint_selector_set_mode_none(SPPaintSelector *psel) /* Color paint */ -static void -sp_paint_selector_color_grabbed(SPColorSelector *csel, SPPaintSelector *psel) +static void sp_paint_selector_color_grabbed(SPColorSelector * /*csel*/, SPPaintSelector *psel) { - (void)csel; gtk_signal_emit(GTK_OBJECT(psel), psel_signals[GRABBED]); } -static void -sp_paint_selector_color_dragged(SPColorSelector *csel, SPPaintSelector *psel) +static void sp_paint_selector_color_dragged(SPColorSelector * /*csel*/, SPPaintSelector *psel) { - (void)csel; gtk_signal_emit(GTK_OBJECT(psel), psel_signals[DRAGGED]); } -static void -sp_paint_selector_color_released(SPColorSelector *csel, SPPaintSelector *psel) +static void sp_paint_selector_color_released(SPColorSelector * /*csel*/, SPPaintSelector *psel) { - (void)csel; gtk_signal_emit(GTK_OBJECT(psel), psel_signals[RELEASED]); } static void sp_paint_selector_color_changed(SPColorSelector *csel, SPPaintSelector *psel) { - csel->base->getColorAlpha( psel->color, &psel->alpha ); + csel->base->getColorAlpha( psel->color, psel->alpha ); gtk_signal_emit(GTK_OBJECT(psel), psel_signals[CHANGED]); } -static void -sp_paint_selector_set_mode_color(SPPaintSelector *psel, SPPaintSelectorMode mode) +static void sp_paint_selector_set_mode_color(SPPaintSelector *psel, SPPaintSelector::Mode /*mode*/) { - (void)mode; GtkWidget *csel; sp_paint_selector_set_style_buttons(psel, psel->solid); gtk_widget_set_sensitive(psel->style, TRUE); - if ((psel->mode == SP_PAINT_SELECTOR_MODE_COLOR_RGB) || (psel->mode == SP_PAINT_SELECTOR_MODE_COLOR_CMYK)) { + if ((psel->mode == SPPaintSelector::MODE_COLOR_RGB) || (psel->mode == SPPaintSelector::MODE_COLOR_CMYK)) { /* Already have color selector */ csel = (GtkWidget*)gtk_object_get_data(GTK_OBJECT(psel->selector), "color-selector"); } else { @@ -641,49 +684,40 @@ sp_paint_selector_set_mode_color(SPPaintSelector *psel, SPPaintSelectorMode mode /* Gradient */ -static void -sp_paint_selector_gradient_grabbed(SPColorSelector *csel, SPPaintSelector *psel) +static void sp_paint_selector_gradient_grabbed(SPColorSelector * /*csel*/, SPPaintSelector *psel) { - (void)csel; gtk_signal_emit(GTK_OBJECT(psel), psel_signals[GRABBED]); } -static void -sp_paint_selector_gradient_dragged(SPColorSelector *csel, SPPaintSelector *psel) +static void sp_paint_selector_gradient_dragged(SPColorSelector * /*csel*/, SPPaintSelector *psel) { - (void)csel; gtk_signal_emit(GTK_OBJECT(psel), psel_signals[DRAGGED]); } -static void -sp_paint_selector_gradient_released(SPColorSelector *csel, SPPaintSelector *psel) +static void sp_paint_selector_gradient_released(SPColorSelector * /*csel*/, SPPaintSelector *psel) { - (void)csel; gtk_signal_emit(GTK_OBJECT(psel), psel_signals[RELEASED]); } -static void -sp_paint_selector_gradient_changed(SPColorSelector *csel, SPPaintSelector *psel) +static void sp_paint_selector_gradient_changed(SPColorSelector * /*csel*/, SPPaintSelector *psel) { - (void)csel; gtk_signal_emit(GTK_OBJECT(psel), psel_signals[CHANGED]); } -static void -sp_paint_selector_set_mode_gradient(SPPaintSelector *psel, SPPaintSelectorMode mode) +static void sp_paint_selector_set_mode_gradient(SPPaintSelector *psel, SPPaintSelector::Mode mode) { GtkWidget *gsel; /* fixme: We do not need function-wide gsel at all */ - if (mode == SP_PAINT_SELECTOR_MODE_GRADIENT_LINEAR) { + if (mode == SPPaintSelector::MODE_GRADIENT_LINEAR) { sp_paint_selector_set_style_buttons(psel, psel->gradient); } else { sp_paint_selector_set_style_buttons(psel, psel->radial); } gtk_widget_set_sensitive(psel->style, TRUE); - if ((psel->mode == SP_PAINT_SELECTOR_MODE_GRADIENT_LINEAR) || (psel->mode == SP_PAINT_SELECTOR_MODE_GRADIENT_RADIAL)) { + if ((psel->mode == SPPaintSelector::MODE_GRADIENT_LINEAR) || (psel->mode == SPPaintSelector::MODE_GRADIENT_RADIAL)) { /* Already have gradient selector */ gsel = (GtkWidget*)gtk_object_get_data(GTK_OBJECT(psel->selector), "gradient-selector"); } else { @@ -702,11 +736,12 @@ sp_paint_selector_set_mode_gradient(SPPaintSelector *psel, SPPaintSelectorMode m } /* Actually we have to set option menu history here */ - if (mode == SP_PAINT_SELECTOR_MODE_GRADIENT_LINEAR) { - sp_gradient_selector_set_mode(SP_GRADIENT_SELECTOR(gsel), SP_GRADIENT_SELECTOR_MODE_LINEAR); + if (mode == SPPaintSelector::MODE_GRADIENT_LINEAR) { + SP_GRADIENT_SELECTOR(gsel)->setMode(SPGradientSelector::MODE_LINEAR); + //sp_gradient_selector_set_mode(SP_GRADIENT_SELECTOR(gsel), SP_GRADIENT_SELECTOR_MODE_LINEAR); gtk_frame_set_label(GTK_FRAME(psel->frame), _("Linear gradient")); } else { - sp_gradient_selector_set_mode(SP_GRADIENT_SELECTOR(gsel), SP_GRADIENT_SELECTOR_MODE_RADIAL); + SP_GRADIENT_SELECTOR(gsel)->setMode(SPGradientSelector::MODE_RADIAL); gtk_frame_set_label(GTK_FRAME(psel->frame), _("Radial gradient")); } #ifdef SP_PS_VERBOSE @@ -722,21 +757,18 @@ sp_paint_selector_set_style_buttons(SPPaintSelector *psel, GtkWidget *active) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(psel->gradient), (active == psel->gradient)); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(psel->radial), (active == psel->radial)); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(psel->pattern), (active == psel->pattern)); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(psel->swatch), (active == psel->swatch)); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(psel->unset), (active == psel->unset)); } -static void -sp_psel_pattern_destroy(GtkWidget *widget, SPPaintSelector *psel) +static void sp_psel_pattern_destroy(GtkWidget *widget, SPPaintSelector * /*psel*/) { - (void)psel; // drop our reference to the pattern menu widget g_object_unref( G_OBJECT(widget) ); } -static void -sp_psel_pattern_change(GtkWidget *widget, SPPaintSelector *psel) +static void sp_psel_pattern_change(GtkWidget * /*widget*/, SPPaintSelector *psel) { - (void)widget; gtk_signal_emit(GTK_OBJECT(psel), psel_signals[CHANGED]); } @@ -812,17 +844,15 @@ sp_pattern_menu_build (GtkWidget *m, GSList *pattern_list, SPDocument */*source* * current_doc (if non-NULL), and add items to the pattern menu * */ -static void -sp_pattern_list_from_doc (GtkWidget *m, SPDocument *current_doc, SPDocument *source, SPDocument *pattern_doc) +static void sp_pattern_list_from_doc (GtkWidget *m, SPDocument * /*current_doc*/, SPDocument *source, SPDocument * /*pattern_doc*/) { - (void)current_doc; - (void)pattern_doc; GSList *pl = ink_pattern_list_get(source); GSList *clean_pl = NULL; for (; pl != NULL; pl = pl->next) { - if (!SP_IS_PATTERN(pl->data)) + if (!SP_IS_PATTERN(pl->data)) { continue; + } // Add to the list of patterns we really do wish to show clean_pl = g_slist_prepend (clean_pl, pl->data); @@ -901,11 +931,12 @@ ink_pattern_menu(GtkWidget *mnu) /*update pattern list*/ -void -sp_update_pattern_list( SPPaintSelector *psel, SPPattern *pattern) +void SPPaintSelector::updatePatternList( SPPattern *pattern ) { - if (psel->update) return; - GtkWidget *mnu = (GtkWidget *)g_object_get_data(G_OBJECT(psel), "patternmenu"); + if (update) { + return; + } + GtkWidget *mnu = GTK_WIDGET(g_object_get_data(G_OBJECT(this), "patternmenu")); g_assert( mnu != NULL ); /* Clear existing menu if any */ @@ -944,17 +975,17 @@ sp_update_pattern_list( SPPaintSelector *psel, SPPattern *pattern) //gtk_option_menu_set_history(GTK_OPTION_MENU(mnu), 0); } -static void -sp_paint_selector_set_mode_pattern(SPPaintSelector *psel, SPPaintSelectorMode mode) +static void sp_paint_selector_set_mode_pattern(SPPaintSelector *psel, SPPaintSelector::Mode mode) { - if (mode == SP_PAINT_SELECTOR_MODE_PATTERN) + if (mode == SPPaintSelector::MODE_PATTERN) { sp_paint_selector_set_style_buttons(psel, psel->pattern); + } gtk_widget_set_sensitive(psel->style, TRUE); GtkWidget *tbl = NULL; - if (psel->mode == SP_PAINT_SELECTOR_MODE_PATTERN){ + if (psel->mode == SPPaintSelector::MODE_PATTERN) { /* Already have pattern menu */ tbl = (GtkWidget*)gtk_object_get_data(GTK_OBJECT(psel->selector), "pattern-selector"); } else { @@ -1001,13 +1032,12 @@ sp_paint_selector_set_mode_pattern(SPPaintSelector *psel, SPPaintSelectorMode mo #endif } -SPPattern * -sp_paint_selector_get_pattern(SPPaintSelector *psel) +SPPattern *SPPaintSelector::getPattern() { - SPPattern *pat; - g_return_val_if_fail((psel->mode == SP_PAINT_SELECTOR_MODE_PATTERN) , NULL); + SPPattern *pat = 0; + g_return_val_if_fail((mode == MODE_PATTERN) , NULL); - GtkWidget *patmnu = (GtkWidget *) g_object_get_data(G_OBJECT(psel), "patternmenu"); + GtkWidget *patmnu = (GtkWidget *) g_object_get_data(G_OBJECT(this), "patternmenu"); /* no pattern menu if we were just selected */ if ( patmnu == NULL ) return NULL; @@ -1019,34 +1049,73 @@ sp_paint_selector_get_pattern(SPPaintSelector *psel) return NULL; } gchar *patid = (gchar *) g_object_get_data(G_OBJECT(gtk_menu_get_active(m)), - "pattern"); + "pattern"); //gchar *pattern = ""; if (strcmp(patid, "none")){ - gchar *stockid = (gchar *) g_object_get_data(G_OBJECT(gtk_menu_get_active(m)), - "stockid"); - gchar *paturn = patid; - if (!strcmp(stockid,"true")) paturn = g_strconcat("urn:inkscape:pattern:",patid,NULL); - SPObject *pat_obj = get_stock_item(paturn); - if (pat_obj) { + gchar *stockid = (gchar *) g_object_get_data(G_OBJECT(gtk_menu_get_active(m)), + "stockid"); + gchar *paturn = patid; + if (!strcmp(stockid,"true")) paturn = g_strconcat("urn:inkscape:pattern:",patid,NULL); + SPObject *pat_obj = get_stock_item(paturn); + if (pat_obj) { pat = SP_PATTERN(pat_obj); } } else { - pat = pattern_getroot(SP_PATTERN(g_object_get_data(G_OBJECT(gtk_menu_get_active(m)), "pattern"))); + pat = pattern_getroot(SP_PATTERN(g_object_get_data(G_OBJECT(gtk_menu_get_active(m)), "pattern"))); } - if SP_IS_PATTERN(pat) return pat; - return NULL; + if (pat && !SP_IS_PATTERN(pat)) { + pat = 0; + } + + return pat; } -void -sp_paint_selector_set_flat_color(SPPaintSelector *psel, SPDesktop *desktop, gchar const *color_property, gchar const *opacity_property) +static void sp_paint_selector_set_mode_swatch(SPPaintSelector *psel, SPPaintSelector::Mode mode) +{ + if (mode == SPPaintSelector::MODE_SWATCH) { + sp_paint_selector_set_style_buttons(psel, psel->swatch); + } + + gtk_widget_set_sensitive(psel->style, TRUE); + + SwatchSelector *swatchsel = 0; + + if (psel->mode == SPPaintSelector::MODE_SWATCH){ + /* Already have pattern menu */ + swatchsel = static_cast<SwatchSelector*>(g_object_get_data(G_OBJECT(psel->selector), "swatch-selector")); + } else { + sp_paint_selector_clear_frame(psel); + /* Create new gradient selector */ + SwatchSelector *swatchsel = new SwatchSelector(); + swatchsel->show(); + + swatchsel->connectGrabbedHandler( G_CALLBACK(sp_paint_selector_gradient_grabbed), psel ); + swatchsel->connectDraggedHandler( G_CALLBACK(sp_paint_selector_gradient_dragged), psel ); + swatchsel->connectReleasedHandler( G_CALLBACK(sp_paint_selector_gradient_released), psel ); + swatchsel->connectchangedHandler( G_CALLBACK(sp_paint_selector_gradient_changed), psel ); + + // Pack everything to frame + gtk_container_add(GTK_CONTAINER(psel->frame), GTK_WIDGET(swatchsel->gobj())); + psel->selector = GTK_WIDGET(swatchsel->gobj()); + gtk_object_set_data(GTK_OBJECT(psel->selector), "swatch-selector", swatchsel); + + gtk_frame_set_label(GTK_FRAME(psel->frame), _("Swatch fill")); + } +#ifdef SP_PS_VERBOSE + g_print("Swatch req\n"); +#endif +} + +// TODO this seems very bad to be taking in a desktop pointer to muck with. Logic probably belongs elsewhere +void SPPaintSelector::setFlatColor( SPDesktop *desktop, gchar const *color_property, gchar const *opacity_property ) { SPCSSAttr *css = sp_repr_css_attr_new(); SPColor color; - gfloat alpha; - sp_paint_selector_get_color_alpha(psel, &color, &alpha); + gfloat alpha = 0; + getColorAlpha( color, alpha ); std::string colorStr = color.toString(); @@ -1055,7 +1124,7 @@ sp_paint_selector_set_flat_color(SPPaintSelector *psel, SPDesktop *desktop, gcha g_message("sp_paint_selector_set_flat_color() to '%s' from 0x%08x::%s", colorStr.c_str(), rgba, - (color.icc?color.icc->colorProfile.c_str():"<null>") ); + (color.icc ? color.icc->colorProfile.c_str():"<null>") ); #endif // SP_PS_VERBOSE sp_repr_css_set_property(css, color_property, colorStr.c_str()); @@ -1068,34 +1137,42 @@ sp_paint_selector_set_flat_color(SPPaintSelector *psel, SPDesktop *desktop, gcha sp_repr_css_attr_unref(css); } -SPPaintSelectorMode -sp_style_determine_paint_selector_mode(SPStyle *style, bool isfill) +SPPaintSelector::Mode SPPaintSelector::getModeForStyle(SPStyle const & style, bool isfill) { - SPPaintSelectorMode mode = SP_PAINT_SELECTOR_MODE_UNSET; - SPIPaint& target = isfill ? style->fill : style->stroke; + Mode mode = MODE_UNSET; + SPIPaint const & target = isfill ? style.fill : style.stroke; if ( !target.set ) { - mode = SP_PAINT_SELECTOR_MODE_UNSET; + mode = MODE_UNSET; } else if ( target.isPaintserver() ) { - SPPaintServer *server = isfill? SP_STYLE_FILL_SERVER(style) : SP_STYLE_STROKE_SERVER(style); + SPPaintServer const *server = isfill ? style.getFillPaintServer() : style.getStrokePaintServer(); + +#ifdef SP_PS_VERBOSE + g_message("SPPaintSelector::getModeForStyle(%p, %d)", &style, isfill); + g_message("==== server:%p %s grad:%s swatch:%s", server, server->getId(), (SP_IS_GRADIENT(server)?"Y":"n"), (SP_IS_GRADIENT(server) && SP_GRADIENT(server)->getVector()->isSwatch()?"Y":"n")); +#endif // SP_PS_VERBOSE + - if (SP_IS_LINEARGRADIENT(server)) { - mode = SP_PAINT_SELECTOR_MODE_GRADIENT_LINEAR; + if (server && SP_IS_GRADIENT(server) && SP_GRADIENT(server)->getVector()->isSwatch()) { + mode = MODE_SWATCH; + } else if (SP_IS_LINEARGRADIENT(server)) { + mode = MODE_GRADIENT_LINEAR; } else if (SP_IS_RADIALGRADIENT(server)) { - mode = SP_PAINT_SELECTOR_MODE_GRADIENT_RADIAL; + mode = MODE_GRADIENT_RADIAL; } else if (SP_IS_PATTERN(server)) { - mode = SP_PAINT_SELECTOR_MODE_PATTERN; + mode = MODE_PATTERN; } else { g_warning( "file %s: line %d: Unknown paintserver", __FILE__, __LINE__ ); - mode = SP_PAINT_SELECTOR_MODE_NONE; + mode = MODE_NONE; } } else if ( target.isColor() ) { - mode = SP_PAINT_SELECTOR_MODE_COLOR_RGB; // so far only rgb can be read from svg + // TODO this is no longer a valid assertion: + mode = MODE_COLOR_RGB; // so far only rgb can be read from svg } else if ( target.isNone() ) { - mode = SP_PAINT_SELECTOR_MODE_NONE; + mode = MODE_NONE; } else { g_warning( "file %s: line %d: Unknown paint type", __FILE__, __LINE__ ); - mode = SP_PAINT_SELECTOR_MODE_NONE; + mode = MODE_NONE; } return mode; diff --git a/src/widgets/paint-selector.h b/src/widgets/paint-selector.h index de8bbf46a..a3c4cb973 100644 --- a/src/widgets/paint-selector.h +++ b/src/widgets/paint-selector.h @@ -1,16 +1,22 @@ -#ifndef __SP_PAINT_SELECTOR_H__ -#define __SP_PAINT_SELECTOR_H__ +#ifndef SEEN_SP_PAINT_SELECTOR_H +#define SEEN_SP_PAINT_SELECTOR_H /** \file * Generic paint selector widget * + * Authors: + * Lauris + * Jon A. Cruz <jon@joncruz.org> + * * Copyright (C) Lauris 2002 + * Copyright (C) 2010 Authors * */ #include <glib.h> #include "sp-gradient-spread.h" #include "sp-gradient-units.h" + class SPGradient; #define SP_TYPE_PAINT_SELECTOR (sp_paint_selector_get_type ()) @@ -25,86 +31,102 @@ class SPGradient; #include <color.h> #include <libnr/nr-forward.h> -typedef enum { - SP_PAINT_SELECTOR_MODE_EMPTY, - SP_PAINT_SELECTOR_MODE_MULTIPLE, - SP_PAINT_SELECTOR_MODE_NONE, - SP_PAINT_SELECTOR_MODE_COLOR_RGB, - SP_PAINT_SELECTOR_MODE_COLOR_CMYK, - SP_PAINT_SELECTOR_MODE_GRADIENT_LINEAR, - SP_PAINT_SELECTOR_MODE_GRADIENT_RADIAL, - SP_PAINT_SELECTOR_MODE_PATTERN, - SP_PAINT_SELECTOR_MODE_UNSET -} SPPaintSelectorMode; - -typedef enum { - SP_PAINT_SELECTOR_FILLRULE_NONZERO, - SP_PAINT_SELECTOR_FILLRULE_EVENODD -} SPPaintSelectorFillRule; /// Generic paint selector widget struct SPPaintSelector { - GtkVBox vbox; + GtkVBox vbox; - guint update : 1; + enum Mode { + MODE_EMPTY, + MODE_MULTIPLE, + MODE_NONE, + MODE_COLOR_RGB, + MODE_COLOR_CMYK, + MODE_GRADIENT_LINEAR, + MODE_GRADIENT_RADIAL, + MODE_PATTERN, + MODE_SWATCH, + MODE_UNSET + } ; - SPPaintSelectorMode mode; + enum FillRule { + FILLRULE_NONZERO, + FILLRULE_EVENODD + } ; - GtkWidget *style; - GtkWidget *none, *solid, *gradient, *radial, *pattern, *unset; + guint update : 1; - GtkWidget *fillrulebox; - GtkWidget *evenodd, *nonzero; + Mode mode; - GtkWidget *frame, *selector; + GtkWidget *style; + GtkWidget *none; + GtkWidget *solid; + GtkWidget *gradient; + GtkWidget *radial; + GtkWidget *pattern; + GtkWidget *swatch; + GtkWidget *unset; - SPColor color; - float alpha; -}; + GtkWidget *fillrulebox; + GtkWidget *evenodd, *nonzero; -/// The SPPaintSelector vtable -struct SPPaintSelectorClass { - GtkVBoxClass parent_class; + GtkWidget *frame, *selector; - void (* mode_changed) (SPPaintSelector *psel, SPPaintSelectorMode mode); + SPColor color; + float alpha; - void (* grabbed) (SPPaintSelector *psel); - void (* dragged) (SPPaintSelector *psel); - void (* released) (SPPaintSelector *psel); - void (* changed) (SPPaintSelector *psel); - void (* fillrule_changed) (SPPaintSelector *psel, SPPaintSelectorFillRule fillrule); -}; + static Mode getModeForStyle(SPStyle const & style, bool isfill); -GtkType sp_paint_selector_get_type (void); + void setMode( Mode mode ); + void setFillrule( FillRule fillrule ); -GtkWidget *sp_paint_selector_new (bool is_fill); + void setColorAlpha( SPColor const &color, float alpha ); + void getColorAlpha( SPColor &color, gfloat &alpha ) const; -void sp_paint_selector_set_mode (SPPaintSelector *psel, SPPaintSelectorMode mode); -void sp_paint_selector_set_fillrule (SPPaintSelector *psel, SPPaintSelectorFillRule fillrule); + void setGradientLinear( SPGradient *vector ); + void setGradientRadial( SPGradient *vector ); + void setSwatch( SPGradient *vector ); -void sp_paint_selector_set_color_alpha (SPPaintSelector *psel, const SPColor *color, float alpha); + void setGradientProperties( SPGradientUnits units, SPGradientSpread spread ); + void getGradientProperties( SPGradientUnits &units, SPGradientSpread &spread ) const; -void sp_paint_selector_set_gradient_linear (SPPaintSelector *psel, SPGradient *vector); + void pushAttrsToGradient( SPGradient *gr ) const; + SPGradient *getGradientVector(); + SPPattern * getPattern(); + void updatePatternList( SPPattern *pat ); -void sp_paint_selector_set_gradient_radial (SPPaintSelector *psel, SPGradient *vector); - -void sp_paint_selector_set_gradient_properties (SPPaintSelector *psel, SPGradientUnits units, SPGradientSpread spread); -void sp_paint_selector_get_gradient_properties (SPPaintSelector *psel, SPGradientUnits *units, SPGradientSpread *spread); + // TODO move this elsewhere: + void setFlatColor( SPDesktop *desktop, const gchar *color_property, const gchar *opacity_property ); +}; -void sp_gradient_selector_attrs_to_gradient (SPGradient *gr, SPPaintSelector *psel); +/// The SPPaintSelector vtable +struct SPPaintSelectorClass { + GtkVBoxClass parent_class; -void sp_paint_selector_get_color_alpha (SPPaintSelector *psel, SPColor *color, gfloat *alpha); + void (* mode_changed) (SPPaintSelector *psel, SPPaintSelector::Mode mode); -SPGradient *sp_paint_selector_get_gradient_vector (SPPaintSelector *psel); + void (* grabbed) (SPPaintSelector *psel); + void (* dragged) (SPPaintSelector *psel); + void (* released) (SPPaintSelector *psel); + void (* changed) (SPPaintSelector *psel); + void (* fillrule_changed) (SPPaintSelector *psel, SPPaintSelector::FillRule fillrule); +}; -void sp_paint_selector_system_color_set (SPPaintSelector *psel, const SPColor *color, float opacity); +GtkType sp_paint_selector_get_type (void); -SPPattern * sp_paint_selector_get_pattern (SPPaintSelector *psel); +GtkWidget *sp_paint_selector_new (bool is_fill); -void sp_update_pattern_list ( SPPaintSelector *psel, SPPattern *pat); -void sp_paint_selector_set_flat_color (SPPaintSelector *psel, SPDesktop *desktop, const gchar *color_property, const gchar *opacity_property); -SPPaintSelectorMode sp_style_determine_paint_selector_mode (SPStyle *style, bool isfill); +#endif // SEEN_SP_PAINT_SELECTOR_H -#endif +/* + Local Variables: + mode:c++ + c-file-style:"stroustrup" + c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +)) + indent-tabs-mode:nil + fill-column:99 + End: +*/ +// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=99 : diff --git a/src/widgets/select-toolbar.cpp b/src/widgets/select-toolbar.cpp index f168cedeb..e2ad61e2d 100644 --- a/src/widgets/select-toolbar.cpp +++ b/src/widgets/select-toolbar.cpp @@ -390,7 +390,7 @@ static GtkAction* create_action_for_verb( Inkscape::Verb* verb, Inkscape::UI::Vi void sp_select_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions, GObject* holder) { Inkscape::UI::View::View *view = desktop; - Inkscape::IconSize secondarySize = prefToSize("/toolbox/secondary", 1); + Inkscape::IconSize secondarySize = Inkscape::UI::ToolboxFactory::prefToSize("/toolbox/secondary", 1); Inkscape::Preferences *prefs = Inkscape::Preferences::get(); GtkAction* act = 0; @@ -457,7 +457,7 @@ void sp_select_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions, GOb //TRANSLATORS: only translate "string" in "context|string". // For more details, see http://developer.gnome.org/doc/API/2.0/glib/glib-I18N.html#Q-:CAPS - eact = create_adjustment_action( "XAction", _("select_toolbar|X position"), _("select_toolbar|X"), "X", + eact = create_adjustment_action( "XAction", _("select toolbar|X position"), _("select toolbar|X"), "X", -1e6, GTK_WIDGET(desktop->canvas), tracker, spw, _("Horizontal coordinate of selection"), TRUE ); gtk_action_group_add_action( selectionActions, GTK_ACTION(eact) ); @@ -465,7 +465,7 @@ void sp_select_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions, GOb //TRANSLATORS: only translate "string" in "context|string". // For more details, see http://developer.gnome.org/doc/API/2.0/glib/glib-I18N.html#Q-:CAPS - eact = create_adjustment_action( "YAction", _("select_toolbar|Y position"), _("select_toolbar|Y"), "Y", + eact = create_adjustment_action( "YAction", _("select toolbar|Y position"), _("select toolbar|Y"), "Y", -1e6, GTK_WIDGET(desktop->canvas), tracker, spw, _("Vertical coordinate of selection"), FALSE ); gtk_action_group_add_action( selectionActions, GTK_ACTION(eact) ); @@ -473,7 +473,7 @@ void sp_select_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions, GOb //TRANSLATORS: only translate "string" in "context|string". // For more details, see http://developer.gnome.org/doc/API/2.0/glib/glib-I18N.html#Q-:CAPS - eact = create_adjustment_action( "WidthAction", _("select_toolbar|Width"), _("select_toolbar|W"), "width", + eact = create_adjustment_action( "WidthAction", _("select toolbar|Width"), _("select toolbar|W"), "width", 1e-3, GTK_WIDGET(desktop->canvas), tracker, spw, _("Width of selection"), FALSE ); gtk_action_group_add_action( selectionActions, GTK_ACTION(eact) ); @@ -494,7 +494,7 @@ void sp_select_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions, GOb //TRANSLATORS: only translate "string" in "context|string". // For more details, see http://developer.gnome.org/doc/API/2.0/glib/glib-I18N.html#Q-:CAPS - eact = create_adjustment_action( "HeightAction", _("select_toolbar|Height"), _("select_toolbar|H"), "height", + eact = create_adjustment_action( "HeightAction", _("select toolbar|Height"), _("select toolbar|H"), "height", 1e-3, GTK_WIDGET(desktop->canvas), tracker, spw, _("Height of selection"), FALSE ); gtk_action_group_add_action( selectionActions, GTK_ACTION(eact) ); diff --git a/src/widgets/sp-color-notebook.cpp b/src/widgets/sp-color-notebook.cpp index 3ba39dd30..a249786ff 100644 --- a/src/widgets/sp-color-notebook.cpp +++ b/src/widgets/sp-color-notebook.cpp @@ -4,7 +4,7 @@ * A notebook with RGB, CMYK, CMS, HSL, and Wheel pages * * Author: - * Lauris Kaplinski <lauris@kaplinski.com> + * Lauris Kaplinski <lauris@kaplinski.com> * bulia byak <buliabyak@users.sf.net> * * Copyright (C) 2001-2002 Lauris Kaplinski @@ -38,13 +38,13 @@ #include "../profile-manager.h" struct SPColorNotebookTracker { - const gchar* name; - const gchar* className; - GType type; - guint submode; - gboolean enabledFull; - gboolean enabledBrief; - SPColorNotebook *backPointer; + const gchar* name; + const gchar* className; + GType type; + guint submode; + gboolean enabledFull; + gboolean enabledBrief; + SPColorNotebook *backPointer; }; static void sp_color_notebook_class_init (SPColorNotebookClass *klass); @@ -83,20 +83,20 @@ GType sp_color_notebook_get_type(void) static void sp_color_notebook_class_init (SPColorNotebookClass *klass) { - GtkObjectClass *object_class; - GtkWidgetClass *widget_class; - SPColorSelectorClass *selector_class; + GtkObjectClass *object_class; + GtkWidgetClass *widget_class; + SPColorSelectorClass *selector_class; - object_class = (GtkObjectClass *) klass; - widget_class = (GtkWidgetClass *) klass; - selector_class = SP_COLOR_SELECTOR_CLASS (klass); + object_class = (GtkObjectClass *) klass; + widget_class = (GtkWidgetClass *) klass; + selector_class = SP_COLOR_SELECTOR_CLASS (klass); - parent_class = SP_COLOR_SELECTOR_CLASS (g_type_class_peek_parent (klass)); + parent_class = SP_COLOR_SELECTOR_CLASS (g_type_class_peek_parent (klass)); - object_class->destroy = sp_color_notebook_destroy; + object_class->destroy = sp_color_notebook_destroy; - widget_class->show_all = sp_color_notebook_show_all; - widget_class->hide_all = sp_color_notebook_hide_all; + widget_class->show_all = sp_color_notebook_show_all; + widget_class->hide_all = sp_color_notebook_hide_all; } static void @@ -126,7 +126,7 @@ void ColorNotebook::switchPage(GtkNotebook*, if ( gtk_notebook_get_current_page (GTK_NOTEBOOK (_book)) >= 0 ) { csel = getCurrentSelector(); - csel->base->getColorAlpha(_color, &_alpha); + csel->base->getColorAlpha(_color, _alpha); } widget = gtk_notebook_get_nth_page (GTK_NOTEBOOK (_book), page_num); if ( widget && SP_IS_COLOR_SELECTOR (widget) ) @@ -165,21 +165,21 @@ gint ColorNotebook::menuHandler( GdkEvent* event ) static void sp_color_notebook_menuitem_response (GtkMenuItem *menuitem, gpointer user_data) { - gboolean active = FALSE; - - active = gtk_check_menu_item_get_active (GTK_CHECK_MENU_ITEM (menuitem)); - SPColorNotebookTracker *entry = reinterpret_cast< SPColorNotebookTracker* > (user_data); - if ( entry ) - { - if ( active ) - { - ((ColorNotebook*)(SP_COLOR_SELECTOR(entry->backPointer)->base))->addPage(entry->type, entry->submode); - } - else - { - ((ColorNotebook*)(SP_COLOR_SELECTOR(entry->backPointer)->base))->removePage(entry->type, entry->submode); - } - } + gboolean active = FALSE; + + active = gtk_check_menu_item_get_active (GTK_CHECK_MENU_ITEM (menuitem)); + SPColorNotebookTracker *entry = reinterpret_cast< SPColorNotebookTracker* > (user_data); + if ( entry ) + { + if ( active ) + { + ((ColorNotebook*)(SP_COLOR_SELECTOR(entry->backPointer)->base))->addPage(entry->type, entry->submode); + } + else + { + ((ColorNotebook*)(SP_COLOR_SELECTOR(entry->backPointer)->base))->removePage(entry->type, entry->submode); + } + } } static void @@ -195,249 +195,249 @@ sp_color_notebook_init (SPColorNotebook *colorbook) void ColorNotebook::init() { - GtkWidget* table = 0; - guint row = 0; - guint i = 0; - guint j = 0; - GType *selector_types = 0; - guint selector_type_count = 0; - - GtkTooltips *tt = gtk_tooltips_new (); - - /* tempory hardcoding to get types loaded */ - SP_TYPE_COLOR_SCALES; - SP_TYPE_COLOR_WHEEL_SELECTOR; + GtkWidget* table = 0; + guint row = 0; + guint i = 0; + guint j = 0; + GType *selector_types = 0; + guint selector_type_count = 0; + + GtkTooltips *tt = gtk_tooltips_new (); + + /* tempory hardcoding to get types loaded */ + SP_TYPE_COLOR_SCALES; + SP_TYPE_COLOR_WHEEL_SELECTOR; #if ENABLE_LCMS - SP_TYPE_COLOR_ICC_SELECTOR; + SP_TYPE_COLOR_ICC_SELECTOR; #endif // ENABLE_LCMS - /* REJON: Comment out the next line to not use the normal GTK Color + /* REJON: Comment out the next line to not use the normal GTK Color wheel. */ // SP_TYPE_COLOR_GTKSELECTOR; - _updating = FALSE; - _updatingrgba = FALSE; - _btn = 0; - _popup = 0; - _trackerList = g_ptr_array_new (); - - _book = gtk_notebook_new (); - gtk_widget_show (_book); - - selector_types = g_type_children (SP_TYPE_COLOR_SELECTOR, &selector_type_count); - - for ( i = 0; i < selector_type_count; i++ ) - { - if (!g_type_is_a (selector_types[i], SP_TYPE_COLOR_NOTEBOOK)) - { - guint howmany = 1; - gpointer klass = gtk_type_class (selector_types[i]); - if ( klass && SP_IS_COLOR_SELECTOR_CLASS (klass) ) - { - SPColorSelectorClass *ck = SP_COLOR_SELECTOR_CLASS (klass); - howmany = MAX (1, ck->submode_count); - for ( j = 0; j < howmany; j++ ) - { - SPColorNotebookTracker *entry = reinterpret_cast< SPColorNotebookTracker* > (malloc(sizeof(SPColorNotebookTracker))); - if ( entry ) - { - memset( entry, 0, sizeof(SPColorNotebookTracker) ); - entry->name = ck->name[j]; - entry->type = selector_types[i]; - entry->submode = j; - entry->enabledFull = TRUE; - entry->enabledBrief = TRUE; - entry->backPointer = SP_COLOR_NOTEBOOK(_csel); - - g_ptr_array_add (_trackerList, entry); - } - } - } - } - } - - for ( i = 0; i < _trackerList->len; i++ ) - { - SPColorNotebookTracker *entry = - reinterpret_cast< SPColorNotebookTracker* > (g_ptr_array_index (_trackerList, i)); - if ( entry ) - { - addPage(entry->type, entry->submode); - } - } - - table = gtk_table_new (2, 3, FALSE); - gtk_widget_show (table); - - gtk_box_pack_start (GTK_BOX (_csel), table, TRUE, TRUE, 0); - - gtk_table_attach (GTK_TABLE (table), _book, 0, 2, row, row + 1, + _updating = FALSE; + _updatingrgba = FALSE; + _btn = 0; + _popup = 0; + _trackerList = g_ptr_array_new (); + + _book = gtk_notebook_new (); + gtk_widget_show (_book); + + selector_types = g_type_children (SP_TYPE_COLOR_SELECTOR, &selector_type_count); + + for ( i = 0; i < selector_type_count; i++ ) + { + if (!g_type_is_a (selector_types[i], SP_TYPE_COLOR_NOTEBOOK)) + { + guint howmany = 1; + gpointer klass = gtk_type_class (selector_types[i]); + if ( klass && SP_IS_COLOR_SELECTOR_CLASS (klass) ) + { + SPColorSelectorClass *ck = SP_COLOR_SELECTOR_CLASS (klass); + howmany = MAX (1, ck->submode_count); + for ( j = 0; j < howmany; j++ ) + { + SPColorNotebookTracker *entry = reinterpret_cast< SPColorNotebookTracker* > (malloc(sizeof(SPColorNotebookTracker))); + if ( entry ) + { + memset( entry, 0, sizeof(SPColorNotebookTracker) ); + entry->name = ck->name[j]; + entry->type = selector_types[i]; + entry->submode = j; + entry->enabledFull = TRUE; + entry->enabledBrief = TRUE; + entry->backPointer = SP_COLOR_NOTEBOOK(_csel); + + g_ptr_array_add (_trackerList, entry); + } + } + } + } + } + + for ( i = 0; i < _trackerList->len; i++ ) + { + SPColorNotebookTracker *entry = + reinterpret_cast< SPColorNotebookTracker* > (g_ptr_array_index (_trackerList, i)); + if ( entry ) + { + addPage(entry->type, entry->submode); + } + } + + table = gtk_table_new (2, 3, FALSE); + gtk_widget_show (table); + + gtk_box_pack_start (GTK_BOX (_csel), table, TRUE, TRUE, 0); + + gtk_table_attach (GTK_TABLE (table), _book, 0, 2, row, row + 1, static_cast<GtkAttachOptions>(GTK_EXPAND|GTK_FILL), static_cast<GtkAttachOptions>(GTK_EXPAND|GTK_FILL), XPAD, YPAD); - // restore the last active page - Inkscape::Preferences *prefs = Inkscape::Preferences::get(); - gtk_notebook_set_current_page (GTK_NOTEBOOK (_book), prefs->getInt("/colorselector/page", 0)); - - { - gboolean found = FALSE; + // restore the last active page + Inkscape::Preferences *prefs = Inkscape::Preferences::get(); + gtk_notebook_set_current_page (GTK_NOTEBOOK (_book), prefs->getInt("/colorselector/page", 0)); - _popup = gtk_menu_new(); - GtkMenu *menu = GTK_MENU (_popup); + { + gboolean found = FALSE; - for ( i = 0; i < _trackerList->len; i++ ) - { - SPColorNotebookTracker *entry = reinterpret_cast< SPColorNotebookTracker* > (g_ptr_array_index (_trackerList, i)); - if ( entry ) - { - GtkWidget *item = gtk_check_menu_item_new_with_label (_(entry->name)); - gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), entry->enabledFull); - gtk_widget_show (item); - gtk_menu_append (menu, item); + _popup = gtk_menu_new(); + GtkMenu *menu = GTK_MENU (_popup); - g_signal_connect (G_OBJECT (item), "activate", - G_CALLBACK (sp_color_notebook_menuitem_response), - reinterpret_cast< gpointer > (entry) ); - found = TRUE; - } - } + for ( i = 0; i < _trackerList->len; i++ ) + { + SPColorNotebookTracker *entry = reinterpret_cast< SPColorNotebookTracker* > (g_ptr_array_index (_trackerList, i)); + if ( entry ) + { + GtkWidget *item = gtk_check_menu_item_new_with_label (_(entry->name)); + gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), entry->enabledFull); + gtk_widget_show (item); + gtk_menu_append (menu, item); + + g_signal_connect (G_OBJECT (item), "activate", + G_CALLBACK (sp_color_notebook_menuitem_response), + reinterpret_cast< gpointer > (entry) ); + found = TRUE; + } + } - GtkWidget *arrow = gtk_arrow_new(GTK_ARROW_RIGHT, GTK_SHADOW_NONE); - gtk_widget_show (arrow); + GtkWidget *arrow = gtk_arrow_new(GTK_ARROW_RIGHT, GTK_SHADOW_NONE); + gtk_widget_show (arrow); - _btn = gtk_button_new (); - gtk_widget_show (_btn); - gtk_container_add (GTK_CONTAINER (_btn), arrow); + _btn = gtk_button_new (); + gtk_widget_show (_btn); + gtk_container_add (GTK_CONTAINER (_btn), arrow); - GtkWidget *align = gtk_alignment_new (1.0, 0.0, 0.0, 0.0); - gtk_widget_show (align); - gtk_container_add (GTK_CONTAINER (align), _btn); + GtkWidget *align = gtk_alignment_new (1.0, 0.0, 0.0, 0.0); + gtk_widget_show (align); + gtk_container_add (GTK_CONTAINER (align), _btn); - // uncomment to reenable the "show/hide modes" menu, - // but first fix it so it remembers its settings in prefs and does not take that much space (entire vertical column!) - //gtk_table_attach (GTK_TABLE (table), align, 2, 3, row, row + 1, GTK_FILL, GTK_FILL, XPAD, YPAD); + // uncomment to reenable the "show/hide modes" menu, + // but first fix it so it remembers its settings in prefs and does not take that much space (entire vertical column!) + //gtk_table_attach (GTK_TABLE (table), align, 2, 3, row, row + 1, GTK_FILL, GTK_FILL, XPAD, YPAD); - gtk_signal_connect_object(GTK_OBJECT(_btn), "event", GTK_SIGNAL_FUNC (sp_color_notebook_menu_handler), GTK_OBJECT(_csel)); - if ( !found ) - { - gtk_widget_set_sensitive (_btn, FALSE); - } - } + gtk_signal_connect_object(GTK_OBJECT(_btn), "event", GTK_SIGNAL_FUNC (sp_color_notebook_menu_handler), GTK_OBJECT(_csel)); + if ( !found ) + { + gtk_widget_set_sensitive (_btn, FALSE); + } + } - row++; + row++; - GtkWidget *rgbabox = gtk_hbox_new (FALSE, 0); + GtkWidget *rgbabox = gtk_hbox_new (FALSE, 0); #if ENABLE_LCMS - /* Create color management icons */ - _box_colormanaged = gtk_event_box_new (); - GtkWidget *colormanaged = gtk_image_new_from_icon_name ("color-management-icon", GTK_ICON_SIZE_SMALL_TOOLBAR); - gtk_container_add (GTK_CONTAINER (_box_colormanaged), colormanaged); - GtkTooltips *tooltips_colormanaged = gtk_tooltips_new (); - gtk_tooltips_set_tip (tooltips_colormanaged, _box_colormanaged, _("Color Managed"), ""); - gtk_widget_set_sensitive (_box_colormanaged, false); - gtk_box_pack_start(GTK_BOX(rgbabox), _box_colormanaged, FALSE, FALSE, 2); - - _box_outofgamut = gtk_event_box_new (); - GtkWidget *outofgamut = gtk_image_new_from_icon_name ("out-of-gamut-icon", GTK_ICON_SIZE_SMALL_TOOLBAR); - gtk_container_add (GTK_CONTAINER (_box_outofgamut), outofgamut); - GtkTooltips *tooltips_outofgamut = gtk_tooltips_new (); - gtk_tooltips_set_tip (tooltips_outofgamut, _box_outofgamut, _("Out of gamut!"), ""); - gtk_widget_set_sensitive (_box_outofgamut, false); - gtk_box_pack_start(GTK_BOX(rgbabox), _box_outofgamut, FALSE, FALSE, 2); - - _box_toomuchink = gtk_event_box_new (); - GtkWidget *toomuchink = gtk_image_new_from_icon_name ("too-much-ink-icon", GTK_ICON_SIZE_SMALL_TOOLBAR); - gtk_container_add (GTK_CONTAINER (_box_toomuchink), toomuchink); - GtkTooltips *tooltips_toomuchink = gtk_tooltips_new (); - gtk_tooltips_set_tip (tooltips_toomuchink, _box_toomuchink, _("Too much ink!"), ""); - gtk_widget_set_sensitive (_box_toomuchink, false); - gtk_box_pack_start(GTK_BOX(rgbabox), _box_toomuchink, FALSE, FALSE, 2); + /* Create color management icons */ + _box_colormanaged = gtk_event_box_new (); + GtkWidget *colormanaged = gtk_image_new_from_icon_name ("color-management-icon", GTK_ICON_SIZE_SMALL_TOOLBAR); + gtk_container_add (GTK_CONTAINER (_box_colormanaged), colormanaged); + GtkTooltips *tooltips_colormanaged = gtk_tooltips_new (); + gtk_tooltips_set_tip (tooltips_colormanaged, _box_colormanaged, _("Color Managed"), ""); + gtk_widget_set_sensitive (_box_colormanaged, false); + gtk_box_pack_start(GTK_BOX(rgbabox), _box_colormanaged, FALSE, FALSE, 2); + + _box_outofgamut = gtk_event_box_new (); + GtkWidget *outofgamut = gtk_image_new_from_icon_name ("out-of-gamut-icon", GTK_ICON_SIZE_SMALL_TOOLBAR); + gtk_container_add (GTK_CONTAINER (_box_outofgamut), outofgamut); + GtkTooltips *tooltips_outofgamut = gtk_tooltips_new (); + gtk_tooltips_set_tip (tooltips_outofgamut, _box_outofgamut, _("Out of gamut!"), ""); + gtk_widget_set_sensitive (_box_outofgamut, false); + gtk_box_pack_start(GTK_BOX(rgbabox), _box_outofgamut, FALSE, FALSE, 2); + + _box_toomuchink = gtk_event_box_new (); + GtkWidget *toomuchink = gtk_image_new_from_icon_name ("too-much-ink-icon", GTK_ICON_SIZE_SMALL_TOOLBAR); + gtk_container_add (GTK_CONTAINER (_box_toomuchink), toomuchink); + GtkTooltips *tooltips_toomuchink = gtk_tooltips_new (); + gtk_tooltips_set_tip (tooltips_toomuchink, _box_toomuchink, _("Too much ink!"), ""); + gtk_widget_set_sensitive (_box_toomuchink, false); + gtk_box_pack_start(GTK_BOX(rgbabox), _box_toomuchink, FALSE, FALSE, 2); #endif //ENABLE_LCMS - /* Create RGBA entry and color preview */ - _rgbal = gtk_label_new_with_mnemonic (_("RGBA_:")); - gtk_misc_set_alignment (GTK_MISC (_rgbal), 1.0, 0.5); - gtk_box_pack_start(GTK_BOX(rgbabox), _rgbal, TRUE, TRUE, 2); + /* Create RGBA entry and color preview */ + _rgbal = gtk_label_new_with_mnemonic (_("RGBA_:")); + gtk_misc_set_alignment (GTK_MISC (_rgbal), 1.0, 0.5); + gtk_box_pack_start(GTK_BOX(rgbabox), _rgbal, TRUE, TRUE, 2); - _rgbae = gtk_entry_new (); - sp_dialog_defocus_on_enter (_rgbae); - gtk_entry_set_max_length (GTK_ENTRY (_rgbae), 8); - gtk_entry_set_width_chars (GTK_ENTRY (_rgbae), 8); - gtk_tooltips_set_tip (tt, _rgbae, _("Hexadecimal RGBA value of the color"), NULL); - gtk_box_pack_start(GTK_BOX(rgbabox), _rgbae, FALSE, FALSE, 0); - gtk_label_set_mnemonic_widget (GTK_LABEL(_rgbal), _rgbae); + _rgbae = gtk_entry_new (); + sp_dialog_defocus_on_enter (_rgbae); + gtk_entry_set_max_length (GTK_ENTRY (_rgbae), 8); + gtk_entry_set_width_chars (GTK_ENTRY (_rgbae), 8); + gtk_tooltips_set_tip (tt, _rgbae, _("Hexadecimal RGBA value of the color"), NULL); + gtk_box_pack_start(GTK_BOX(rgbabox), _rgbae, FALSE, FALSE, 0); + gtk_label_set_mnemonic_widget (GTK_LABEL(_rgbal), _rgbae); - sp_set_font_size_smaller (rgbabox); - gtk_widget_show_all (rgbabox); + sp_set_font_size_smaller (rgbabox); + gtk_widget_show_all (rgbabox); #if ENABLE_LCMS - //the "too much ink" icon is initially hidden - gtk_widget_hide(GTK_WIDGET(_box_toomuchink)); + //the "too much ink" icon is initially hidden + gtk_widget_hide(GTK_WIDGET(_box_toomuchink)); #endif //ENABLE_LCMS - gtk_table_attach (GTK_TABLE (table), rgbabox, 0, 2, row, row + 1, GTK_FILL, GTK_SHRINK, XPAD, YPAD); + gtk_table_attach (GTK_TABLE (table), rgbabox, 0, 2, row, row + 1, GTK_FILL, GTK_SHRINK, XPAD, YPAD); #ifdef SPCS_PREVIEW - _p = sp_color_preview_new (0xffffffff); - gtk_widget_show (_p); - gtk_table_attach (GTK_TABLE (table), _p, 2, 3, row, row + 1, GTK_FILL, GTK_FILL, XPAD, YPAD); + _p = sp_color_preview_new (0xffffffff); + gtk_widget_show (_p); + gtk_table_attach (GTK_TABLE (table), _p, 2, 3, row, row + 1, GTK_FILL, GTK_FILL, XPAD, YPAD); #endif - _switchId = g_signal_connect(GTK_OBJECT (_book), "switch-page", - GTK_SIGNAL_FUNC (sp_color_notebook_switch_page), SP_COLOR_NOTEBOOK(_csel)); + _switchId = g_signal_connect(GTK_OBJECT (_book), "switch-page", + GTK_SIGNAL_FUNC (sp_color_notebook_switch_page), SP_COLOR_NOTEBOOK(_csel)); - _entryId = gtk_signal_connect (GTK_OBJECT (_rgbae), "changed", GTK_SIGNAL_FUNC (ColorNotebook::_rgbaEntryChangedHook), _csel); + _entryId = gtk_signal_connect (GTK_OBJECT (_rgbae), "changed", GTK_SIGNAL_FUNC (ColorNotebook::_rgbaEntryChangedHook), _csel); } static void sp_color_notebook_destroy (GtkObject *object) { - if (((GtkObjectClass *) (parent_class))->destroy) - (* ((GtkObjectClass *) (parent_class))->destroy) (object); + if (((GtkObjectClass *) (parent_class))->destroy) + (* ((GtkObjectClass *) (parent_class))->destroy) (object); } ColorNotebook::~ColorNotebook() { - if ( _trackerList ) - { - g_ptr_array_free (_trackerList, TRUE); - _trackerList = 0; - } - - if ( _switchId ) - { - if ( _book ) - { - g_signal_handler_disconnect (_book, _switchId); - _switchId = 0; - } - } + if ( _trackerList ) + { + g_ptr_array_free (_trackerList, TRUE); + _trackerList = 0; + } + + if ( _switchId ) + { + if ( _book ) + { + g_signal_handler_disconnect (_book, _switchId); + _switchId = 0; + } + } } static void sp_color_notebook_show_all (GtkWidget *widget) { - gtk_widget_show (widget); + gtk_widget_show (widget); } static void sp_color_notebook_hide_all (GtkWidget *widget) { - gtk_widget_hide (widget); + gtk_widget_hide (widget); } GtkWidget * sp_color_notebook_new (void) { - SPColorNotebook *colorbook; + SPColorNotebook *colorbook; - colorbook = (SPColorNotebook*)gtk_type_new (SP_TYPE_COLOR_NOTEBOOK); + colorbook = (SPColorNotebook*)gtk_type_new (SP_TYPE_COLOR_NOTEBOOK); - return GTK_WIDGET (colorbook); + return GTK_WIDGET (colorbook); } ColorNotebook::ColorNotebook( SPColorSelector* csel ) @@ -523,7 +523,7 @@ void ColorNotebook::_updateRgbaEntry( const SPColor& color, gfloat alpha ) { g_return_if_fail( ( 0.0 <= alpha ) && ( alpha <= 1.0 ) ); -#if ENABLE_LCMS +#if ENABLE_LCMS /* update color management icon*/ gtk_widget_set_sensitive (_box_colormanaged, color.icc != NULL); @@ -584,15 +584,15 @@ void ColorNotebook::_entryGrabbed (SPColorSelector *, SPColorNotebook *colorbook void ColorNotebook::_entryDragged (SPColorSelector *csel, SPColorNotebook *colorbook) { - gboolean oldState; + gboolean oldState; ColorNotebook* nb = (ColorNotebook*)(SP_COLOR_SELECTOR(colorbook)->base); - oldState = nb->_dragging; + oldState = nb->_dragging; - nb->_dragging = TRUE; - nb->_entryModified( csel, colorbook ); + nb->_dragging = TRUE; + nb->_entryModified( csel, colorbook ); - nb->_dragging = oldState; + nb->_dragging = oldState; } void ColorNotebook::_entryReleased (SPColorSelector *, SPColorNotebook *colorbook) @@ -603,116 +603,116 @@ void ColorNotebook::_entryReleased (SPColorSelector *, SPColorNotebook *colorboo void ColorNotebook::_entryChanged (SPColorSelector *csel, SPColorNotebook *colorbook) { - gboolean oldState; + gboolean oldState; ColorNotebook* nb = (ColorNotebook*)(SP_COLOR_SELECTOR(colorbook)->base); - oldState = nb->_dragging; + oldState = nb->_dragging; - nb->_dragging = FALSE; - nb->_entryModified( csel, colorbook ); + nb->_dragging = FALSE; + nb->_entryModified( csel, colorbook ); - nb->_dragging = oldState; + nb->_dragging = oldState; } void ColorNotebook::_entryModified (SPColorSelector *csel, SPColorNotebook *colorbook) { - g_return_if_fail (colorbook != NULL); - g_return_if_fail (SP_IS_COLOR_NOTEBOOK (colorbook)); - g_return_if_fail (csel != NULL); - g_return_if_fail (SP_IS_COLOR_SELECTOR (csel)); + g_return_if_fail (colorbook != NULL); + g_return_if_fail (SP_IS_COLOR_NOTEBOOK (colorbook)); + g_return_if_fail (csel != NULL); + g_return_if_fail (SP_IS_COLOR_SELECTOR (csel)); ColorNotebook* nb = (ColorNotebook*)(SP_COLOR_SELECTOR(colorbook)->base); SPColor color; gfloat alpha = 1.0; - csel->base->getColorAlpha( color, &alpha ); + csel->base->getColorAlpha( color, alpha ); nb->_updateRgbaEntry( color, alpha ); nb->_updateInternals( color, alpha, nb->_dragging ); } GtkWidget* ColorNotebook::addPage(GType page_type, guint submode) { - GtkWidget *page; - - page = sp_color_selector_new( page_type ); - if ( page ) - { - GtkWidget* tab_label = 0; - SPColorSelector* csel; - - csel = SP_COLOR_SELECTOR (page); - if ( submode > 0 ) - { - csel->base->setSubmode( submode ); - } - gtk_widget_show (page); + GtkWidget *page; + + page = sp_color_selector_new( page_type ); + if ( page ) + { + GtkWidget* tab_label = 0; + SPColorSelector* csel; + + csel = SP_COLOR_SELECTOR (page); + if ( submode > 0 ) + { + csel->base->setSubmode( submode ); + } + gtk_widget_show (page); int index = csel->base ? csel->base->getSubmode() : 0; const gchar* str = _(SP_COLOR_SELECTOR_GET_CLASS (csel)->name[index]); // g_message( "Hitting up for tab for '%s'", str ); - tab_label = gtk_label_new(_(str)); - gtk_notebook_append_page( GTK_NOTEBOOK (_book), page, tab_label ); - gtk_signal_connect (GTK_OBJECT (page), "grabbed", GTK_SIGNAL_FUNC (_entryGrabbed), _csel); - gtk_signal_connect (GTK_OBJECT (page), "dragged", GTK_SIGNAL_FUNC (_entryDragged), _csel); - gtk_signal_connect (GTK_OBJECT (page), "released", GTK_SIGNAL_FUNC (_entryReleased), _csel); - gtk_signal_connect (GTK_OBJECT (page), "changed", GTK_SIGNAL_FUNC (_entryChanged), _csel); - } - - return page; + tab_label = gtk_label_new(_(str)); + gtk_notebook_append_page( GTK_NOTEBOOK (_book), page, tab_label ); + gtk_signal_connect (GTK_OBJECT (page), "grabbed", GTK_SIGNAL_FUNC (_entryGrabbed), _csel); + gtk_signal_connect (GTK_OBJECT (page), "dragged", GTK_SIGNAL_FUNC (_entryDragged), _csel); + gtk_signal_connect (GTK_OBJECT (page), "released", GTK_SIGNAL_FUNC (_entryReleased), _csel); + gtk_signal_connect (GTK_OBJECT (page), "changed", GTK_SIGNAL_FUNC (_entryChanged), _csel); + } + + return page; } GtkWidget* ColorNotebook::getPage(GType page_type, guint submode) { - gint count = 0; - gint i = 0; - GtkWidget* page = 0; - -// count = gtk_notebook_get_n_pages (_book); - count = 200; - for ( i = 0; i < count && !page; i++ ) - { - page = gtk_notebook_get_nth_page (GTK_NOTEBOOK (_book), i); - if ( page ) - { - SPColorSelector* csel; - guint pagemode; - csel = SP_COLOR_SELECTOR (page); - pagemode = csel->base->getSubmode(); - if ( G_TYPE_FROM_INSTANCE (page) == page_type - && pagemode == submode ) - { - // found it. - break; - } - else - { - page = 0; - } - } - else - { - break; - } - } - return page; + gint count = 0; + gint i = 0; + GtkWidget* page = 0; + +// count = gtk_notebook_get_n_pages (_book); + count = 200; + for ( i = 0; i < count && !page; i++ ) + { + page = gtk_notebook_get_nth_page (GTK_NOTEBOOK (_book), i); + if ( page ) + { + SPColorSelector* csel; + guint pagemode; + csel = SP_COLOR_SELECTOR (page); + pagemode = csel->base->getSubmode(); + if ( G_TYPE_FROM_INSTANCE (page) == page_type + && pagemode == submode ) + { + // found it. + break; + } + else + { + page = 0; + } + } + else + { + break; + } + } + return page; } void ColorNotebook::removePage( GType page_type, guint submode ) { - GtkWidget *page = 0; - - page = getPage(page_type, submode); - if ( page ) - { - gint where = gtk_notebook_page_num (GTK_NOTEBOOK (_book), page); - if ( where >= 0 ) - { - if ( gtk_notebook_get_current_page (GTK_NOTEBOOK (_book)) == where ) - { + GtkWidget *page = 0; + + page = getPage(page_type, submode); + if ( page ) + { + gint where = gtk_notebook_page_num (GTK_NOTEBOOK (_book), page); + if ( where >= 0 ) + { + if ( gtk_notebook_get_current_page (GTK_NOTEBOOK (_book)) == where ) + { // getColorAlpha(_color, &_alpha); - } - gtk_notebook_remove_page (GTK_NOTEBOOK (_book), where); - } - } + } + gtk_notebook_remove_page (GTK_NOTEBOOK (_book), where); + } + } } /* diff --git a/src/widgets/sp-color-selector.cpp b/src/widgets/sp-color-selector.cpp index 312128781..203bc3c2a 100644 --- a/src/widgets/sp-color-selector.cpp +++ b/src/widgets/sp-color-selector.cpp @@ -318,15 +318,12 @@ void ColorSelector::_colorChanged() { } -void ColorSelector::getColorAlpha( SPColor& color, gfloat* alpha ) const +void ColorSelector::getColorAlpha( SPColor &color, gfloat &alpha ) const { gint i = 0; color = _color; - if ( alpha ) - { - *alpha = _alpha; - } + alpha = _alpha; // Try to catch uninitialized value usage if ( color.v.c[0] ) @@ -345,7 +342,7 @@ void ColorSelector::getColorAlpha( SPColor& color, gfloat* alpha ) const { i++; } - if ( alpha && *alpha ) + if ( alpha ) { i++; } diff --git a/src/widgets/sp-color-selector.h b/src/widgets/sp-color-selector.h index 40446fe0a..a2ad87dd5 100644 --- a/src/widgets/sp-color-selector.h +++ b/src/widgets/sp-color-selector.h @@ -26,7 +26,7 @@ public: gfloat getAlpha() const; void setColorAlpha( const SPColor& color, gfloat alpha, bool emit = false ); - void getColorAlpha( SPColor& color, gfloat* alpha ) const; + void getColorAlpha( SPColor &color, gfloat &alpha ) const; virtual void setSubmode( guint submode ); virtual guint getSubmode() const; diff --git a/src/widgets/stroke-style.cpp b/src/widgets/stroke-style.cpp index f502f87d3..ddd1c92d3 100644 --- a/src/widgets/stroke-style.cpp +++ b/src/widgets/stroke-style.cpp @@ -63,7 +63,7 @@ static void sp_stroke_style_paint_selection_modified (SPWidget *spw, Inkscape::S static void sp_stroke_style_paint_selection_changed (SPWidget *spw, Inkscape::Selection *selection, SPPaintSelector *psel); static void sp_stroke_style_paint_update(SPWidget *spw); -static void sp_stroke_style_paint_mode_changed(SPPaintSelector *psel, SPPaintSelectorMode mode, SPWidget *spw); +static void sp_stroke_style_paint_mode_changed(SPPaintSelector *psel, SPPaintSelector::Mode mode, SPWidget *spw); static void sp_stroke_style_paint_dragged(SPPaintSelector *psel, SPWidget *spw); static void sp_stroke_style_paint_changed(SPPaintSelector *psel, SPWidget *spw); @@ -189,7 +189,7 @@ sp_stroke_style_paint_update (SPWidget *spw) case QUERY_STYLE_NOTHING: { /* No paint at all */ - sp_paint_selector_set_mode (psel, SP_PAINT_SELECTOR_MODE_EMPTY); + psel->setMode(SPPaintSelector::MODE_EMPTY); break; } @@ -197,43 +197,43 @@ sp_stroke_style_paint_update (SPWidget *spw) case QUERY_STYLE_MULTIPLE_AVERAGED: // TODO: treat this slightly differently, e.g. display "averaged" somewhere in paint selector case QUERY_STYLE_MULTIPLE_SAME: { - SPPaintSelectorMode pselmode = sp_style_determine_paint_selector_mode (query, false); - sp_paint_selector_set_mode (psel, pselmode); + SPPaintSelector::Mode pselmode = SPPaintSelector::getModeForStyle(*query, false); + psel->setMode(pselmode); if (query->stroke.set && query->stroke.isPaintserver()) { SPPaintServer *server = SP_STYLE_STROKE_SERVER (query); - if (SP_IS_LINEARGRADIENT (server)) { - SPGradient *vector = sp_gradient_get_vector (SP_GRADIENT (server), FALSE); - sp_paint_selector_set_gradient_linear (psel, vector); + if (server && server->isSwatch()) { + SPGradient *vector = SP_GRADIENT(server)->getVector(); + psel->setSwatch( vector ); + } else if (SP_IS_LINEARGRADIENT (server)) { + SPGradient *vector = SP_GRADIENT(server)->getVector(); + psel->setGradientLinear( vector ); SPLinearGradient *lg = SP_LINEARGRADIENT (server); - sp_paint_selector_set_gradient_properties (psel, - SP_GRADIENT_UNITS (lg), - SP_GRADIENT_SPREAD (lg)); + psel->setGradientProperties( SP_GRADIENT_UNITS(lg), + SP_GRADIENT_SPREAD(lg) ); } else if (SP_IS_RADIALGRADIENT (server)) { - SPGradient *vector = sp_gradient_get_vector (SP_GRADIENT (server), FALSE); - sp_paint_selector_set_gradient_radial (psel, vector); + SPGradient *vector = SP_GRADIENT(server)->getVector(); + psel->setGradientRadial( vector ); SPRadialGradient *rg = SP_RADIALGRADIENT (server); - sp_paint_selector_set_gradient_properties (psel, - SP_GRADIENT_UNITS (rg), - SP_GRADIENT_SPREAD (rg)); + psel->setGradientProperties( SP_GRADIENT_UNITS(rg), + SP_GRADIENT_SPREAD(rg) ); } else if (SP_IS_PATTERN (server)) { SPPattern *pat = pattern_getroot (SP_PATTERN (server)); - sp_update_pattern_list (psel, pat); + psel->updatePatternList( pat ); } } else if (query->stroke.set && query->stroke.isColor()) { - sp_paint_selector_set_color_alpha (psel, &query->stroke.value.color, SP_SCALE24_TO_FLOAT (query->stroke_opacity.value)); - + psel->setColorAlpha(query->stroke.value.color, SP_SCALE24_TO_FLOAT(query->stroke_opacity.value)); } break; } case QUERY_STYLE_MULTIPLE_DIFFERENT: { - sp_paint_selector_set_mode (psel, SP_PAINT_SELECTOR_MODE_MULTIPLE); + psel->setMode(SPPaintSelector::MODE_MULTIPLE); break; } } @@ -248,7 +248,7 @@ sp_stroke_style_paint_update (SPWidget *spw) */ static void sp_stroke_style_paint_mode_changed( SPPaintSelector *psel, - SPPaintSelectorMode /*mode*/, + SPPaintSelector::Mode /*mode*/, SPWidget *spw ) { if (gtk_object_get_data(GTK_OBJECT(spw), "update")) { @@ -278,10 +278,10 @@ sp_stroke_style_paint_dragged(SPPaintSelector *psel, SPWidget *spw) } switch (psel->mode) { - case SP_PAINT_SELECTOR_MODE_COLOR_RGB: - case SP_PAINT_SELECTOR_MODE_COLOR_CMYK: + case SPPaintSelector::MODE_COLOR_RGB: + case SPPaintSelector::MODE_COLOR_CMYK: { - sp_paint_selector_set_flat_color (psel, SP_ACTIVE_DESKTOP, "stroke", "stroke-opacity"); + psel->setFlatColor( SP_ACTIVE_DESKTOP, "stroke", "stroke-opacity" ); sp_document_maybe_done (sp_desktop_document(SP_ACTIVE_DESKTOP), undo_label, SP_VERB_DIALOG_FILL_STROKE, _("Set stroke color")); break; @@ -313,17 +313,17 @@ sp_stroke_style_paint_changed(SPPaintSelector *psel, SPWidget *spw) GSList const *items = selection->itemList(); switch (psel->mode) { - case SP_PAINT_SELECTOR_MODE_EMPTY: + case SPPaintSelector::MODE_EMPTY: // This should not happen. g_warning ( "file %s: line %d: Paint %d should not emit 'changed'", __FILE__, __LINE__, psel->mode); break; - case SP_PAINT_SELECTOR_MODE_MULTIPLE: + case SPPaintSelector::MODE_MULTIPLE: // This happens when you switch multiple objects with different gradients to flat color; // nothing to do here. break; - case SP_PAINT_SELECTOR_MODE_NONE: + case SPPaintSelector::MODE_NONE: { SPCSSAttr *css = sp_repr_css_attr_new(); sp_repr_css_set_property(css, "stroke", "none"); @@ -337,10 +337,10 @@ sp_stroke_style_paint_changed(SPPaintSelector *psel, SPWidget *spw) break; } - case SP_PAINT_SELECTOR_MODE_COLOR_RGB: - case SP_PAINT_SELECTOR_MODE_COLOR_CMYK: + case SPPaintSelector::MODE_COLOR_RGB: + case SPPaintSelector::MODE_COLOR_CMYK: { - sp_paint_selector_set_flat_color (psel, desktop, "stroke", "stroke-opacity"); + psel->setFlatColor(desktop, "stroke", "stroke-opacity"); sp_document_maybe_done (sp_desktop_document(desktop), undo_label, SP_VERB_DIALOG_FILL_STROKE, _("Set stroke color")); @@ -353,13 +353,13 @@ sp_stroke_style_paint_changed(SPPaintSelector *psel, SPWidget *spw) break; } - case SP_PAINT_SELECTOR_MODE_GRADIENT_LINEAR: - case SP_PAINT_SELECTOR_MODE_GRADIENT_RADIAL: + case SPPaintSelector::MODE_GRADIENT_LINEAR: + case SPPaintSelector::MODE_GRADIENT_RADIAL: if (items) { - SPGradientType const gradient_type = ( psel->mode == SP_PAINT_SELECTOR_MODE_GRADIENT_LINEAR + SPGradientType const gradient_type = ( psel->mode == SPPaintSelector::MODE_GRADIENT_LINEAR ? SP_GRADIENT_TYPE_LINEAR : SP_GRADIENT_TYPE_RADIAL ); - SPGradient *vector = sp_paint_selector_get_gradient_vector(psel); + SPGradient *vector = psel->getGradientVector(); if (!vector) { /* No vector in paint selector should mean that we just changed mode */ @@ -389,7 +389,7 @@ sp_stroke_style_paint_changed(SPPaintSelector *psel, SPWidget *spw) vector = sp_gradient_ensure_vector_normalized(vector); for (GSList const *i = items; i != NULL; i = i->next) { SPGradient *gr = sp_item_set_gradient(SP_ITEM(i->data), vector, gradient_type, false); - sp_gradient_selector_attrs_to_gradient(gr, psel); + psel->pushAttrsToGradient( gr ); } } @@ -398,11 +398,11 @@ sp_stroke_style_paint_changed(SPPaintSelector *psel, SPWidget *spw) } break; - case SP_PAINT_SELECTOR_MODE_PATTERN: + case SPPaintSelector::MODE_PATTERN: if (items) { - SPPattern *pattern = sp_paint_selector_get_pattern (psel); + SPPattern *pattern = psel->getPattern(); if (!pattern) { /* No Pattern in paint selector should mean that we just @@ -443,7 +443,11 @@ sp_stroke_style_paint_changed(SPPaintSelector *psel, SPWidget *spw) break; - case SP_PAINT_SELECTOR_MODE_UNSET: + case SPPaintSelector::MODE_SWATCH: + // TODO + break; + + case SPPaintSelector::MODE_UNSET: if (items) { SPCSSAttr *css = sp_repr_css_attr_new (); sp_repr_css_unset_property (css, "stroke"); diff --git a/src/widgets/swatch-selector.cpp b/src/widgets/swatch-selector.cpp new file mode 100644 index 000000000..a6f5133b7 --- /dev/null +++ b/src/widgets/swatch-selector.cpp @@ -0,0 +1,203 @@ + + +#include <glibmm/i18n.h> + +#include "swatch-selector.h" + +#include "document.h" +#include "gradient-chemistry.h" +#include "gradient-selector.h" +#include "sp-color-notebook.h" +#include "sp-stop.h" +#include "svg/css-ostringstream.h" +#include "svg/svg-color.h" +#include "verbs.h" +#include "xml/node.h" + +namespace Inkscape +{ +namespace Widgets +{ + +SwatchSelector::SwatchSelector() : + Gtk::VBox(), + _gsel(0), + _csel(0) +{ + GtkWidget *gsel = sp_gradient_selector_new(); + _gsel = SP_GRADIENT_SELECTOR(gsel); + g_object_set_data( G_OBJECT(gobj()), "base", this ); + _gsel->setMode(SPGradientSelector::MODE_SWATCH); + + gtk_widget_show(gsel); + + pack_start(*Gtk::manage(Glib::wrap(gsel))); + + + GtkWidget *csel = sp_color_selector_new( SP_TYPE_COLOR_NOTEBOOK ); + _csel = SP_COLOR_SELECTOR(csel); + Gtk::Widget *wrappedCSel = Glib::wrap(csel); + wrappedCSel->show(); + //gtk_widget_show(csel); + + + GObject *obj = G_OBJECT(csel); + + g_signal_connect(obj, "grabbed", G_CALLBACK(_grabbedCb), this); + g_signal_connect(obj, "dragged", G_CALLBACK(_draggedCb), this); + g_signal_connect(obj, "released", G_CALLBACK(_releasedCb), this); + g_signal_connect(obj, "changed", G_CALLBACK(_changedCb), this); + + pack_start(*Gtk::manage(wrappedCSel)); +} + +SwatchSelector::~SwatchSelector() +{ + _csel = 0; // dtor should be handled by Gtk::manage() + _gsel = 0; +} + +SPGradientSelector *SwatchSelector::getGradientSelector() +{ + return _gsel; +} + +void SwatchSelector::_grabbedCb(SPColorSelector * /*csel*/, void * /*data*/) +{ +} + +void SwatchSelector::_draggedCb(SPColorSelector * /*csel*/, void *data) +{ + if (data) { + //SwatchSelector *swsel = reinterpret_cast<SwatchSelector*>(data); + + // TODO might have to block cycles + + // Copied from gradient-vector.cpp, but does not appear to cause visible changes: + /* + if (swsel->_gsel) { + SPGradient *gradient = swsel->_gsel->getVector(); + SPGradient *ngr = sp_gradient_ensure_vector_normalized(gradient); + if (ngr != gradient) { + // Our master gradient has changed + // TODO replace with proper - sp_gradient_vector_widget_load_gradient(GTK_WIDGET(swsel->_gsel), ngr); + } + + sp_gradient_ensure_vector(ngr); + + + SPStop* stop = ngr->getFirstStop(); + if (stop) { + swsel->_csel->base->getColorAlpha(stop->specified_color, &stop->opacity); + stop->currentColor = false; + // TODO push refresh + } + } + */ + } +} + +void SwatchSelector::_releasedCb(SPColorSelector * /*csel*/, void * /*data*/) +{ +} + +void SwatchSelector::_changedCb(SPColorSelector */*csel*/, void *data) +{ + if (data) { + SwatchSelector *swsel = reinterpret_cast<SwatchSelector*>(data); + + // TODO might have to block cycles + + if (swsel->_gsel && swsel->_gsel->getVector()) { + SPGradient *gradient = swsel->_gsel->getVector(); + SPGradient *ngr = sp_gradient_ensure_vector_normalized(gradient); + if (ngr != gradient) { + /* Our master gradient has changed */ + // TODO replace with proper - sp_gradient_vector_widget_load_gradient(GTK_WIDGET(swsel->_gsel), ngr); + } + + sp_gradient_ensure_vector(ngr); + + + SPStop* stop = ngr->getFirstStop(); + if (stop) { + SPColor color; + float alpha = 0; + guint32 rgb = 0; + + swsel->_csel->base->getColorAlpha( color, alpha ); + rgb = color.toRGBA32( 0x00 ); + + // TODO replace with generic shared code that also handles icc-color + Inkscape::CSSOStringStream os; + gchar c[64]; + sp_svg_write_color(c, sizeof(c), rgb); + os << "stop-color:" << c << ";stop-opacity:" << static_cast<gdouble>(alpha) <<";"; + SP_OBJECT_REPR(stop)->setAttribute("style", os.str().c_str()); + + sp_document_done(SP_OBJECT_DOCUMENT(ngr), SP_VERB_CONTEXT_GRADIENT, + _("Change swatch color")); + } + } + } +} + +void SwatchSelector::connectGrabbedHandler( GCallback handler, void *data ) +{ + GObject* obj = G_OBJECT(_gsel); + g_signal_connect( obj, "grabbed", handler, data ); +} + +void SwatchSelector::connectDraggedHandler( GCallback handler, void *data ) +{ + GObject* obj = G_OBJECT(_gsel); + g_signal_connect( obj, "dragged", handler, data ); +} + +void SwatchSelector::connectReleasedHandler( GCallback handler, void *data ) +{ + GObject* obj = G_OBJECT(_gsel); + g_signal_connect( obj, "released", handler, data ); +} + +void SwatchSelector::connectchangedHandler( GCallback handler, void *data ) +{ + GObject* obj = G_OBJECT(_gsel); + g_signal_connect( obj, "changed", handler, data ); +} + +void SwatchSelector::setVector(SPDocument */*doc*/, SPGradient *vector) +{ + //GtkVBox * box = gobj(); + + _gsel->setVector((vector) ? SP_OBJECT_DOCUMENT(vector) : 0, vector); + + if (vector) { + SPStop* stop = vector->getFirstStop(); + + guint32 const colorVal = sp_stop_get_rgba32(stop); + _csel->base->setAlpha(SP_RGBA32_A_F(colorVal)); + SPColor color( SP_RGBA32_R_F(colorVal), SP_RGBA32_G_F(colorVal), SP_RGBA32_B_F(colorVal) ); + // set its color, from the stored array + _csel->base->setColor( color ); + } + +/* +*/ +} + +} // namespace Widgets +} // namespace Inkscape + + + +/* + Local Variables: + mode:c++ + c-file-style:"stroustrup" + c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +)) + indent-tabs-mode:nil + fill-column:99 + End: +*/ +// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=99 : diff --git a/src/widgets/swatch-selector.h b/src/widgets/swatch-selector.h new file mode 100644 index 000000000..83acf9fda --- /dev/null +++ b/src/widgets/swatch-selector.h @@ -0,0 +1,59 @@ +#ifndef SEEN_SP_SWATCH_SELECTOR_H +#define SEEN_SP_SWATCH_SELECTOR_H + + + +#include <gtkmm/box.h> + +class SPDocument; +class SPGradient; +class SPColorSelector; +class SPGradientSelector; + +namespace Inkscape +{ +namespace Widgets +{ + +class SwatchSelector : public Gtk::VBox +{ +public: + SwatchSelector(); + virtual ~SwatchSelector(); + + void connectGrabbedHandler( GCallback handler, void *data ); + void connectDraggedHandler( GCallback handler, void *data ); + void connectReleasedHandler( GCallback handler, void *data ); + void connectchangedHandler( GCallback handler, void *data ); + + void setVector(SPDocument *doc, SPGradient *vector); + + SPGradientSelector *getGradientSelector(); + +private: + static void _grabbedCb(SPColorSelector *csel, void *data); + static void _draggedCb(SPColorSelector *csel, void *data); + static void _releasedCb(SPColorSelector *csel, void *data); + static void _changedCb(SPColorSelector *csel, void *data); + + SPGradientSelector *_gsel; + SPColorSelector *_csel; +}; + + +} // namespace Widgets +} // namespace Inkscape + +#endif // SEEN_SP_SWATCH_SELECTOR_H + +/* + Local Variables: + mode:c++ + c-file-style:"stroustrup" + c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +)) + indent-tabs-mode:nil + fill-column:99 + End: +*/ +// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=99 : + diff --git a/src/widgets/toolbox.cpp b/src/widgets/toolbox.cpp index 9fc077778..4b0d84d90 100644 --- a/src/widgets/toolbox.cpp +++ b/src/widgets/toolbox.cpp @@ -9,7 +9,7 @@ * Frank Felfe <innerspace@iname.com> * John Cliff <simarilius@yahoo.com> * David Turner <novalis@gnu.org> - * Josh Andler <scislac@users.sf.net> + * Josh Andler <scislac@scislac.com> * Jon A. Cruz <jon@joncruz.org> * Maximilian Albert <maximilian.albert@gmail.com> * @@ -50,7 +50,7 @@ #include "../ege-select-one-action.h" #include "../flood-context.h" #include "gradient-toolbar.h" -#include "../graphlayout/graphlayout.h" +#include "../graphlayout.h" #include "../helper/unit-menu.h" #include "../helper/units.h" #include "../helper/unit-tracker.h" @@ -65,7 +65,6 @@ #include "../live_effects/lpe-line_segment.h" #include "../lpe-tool-context.h" #include "../mod360.h" -#include "../node-context.h" #include "../pen-context.h" #include "../preferences.h" #include "../selection-chemistry.h" @@ -89,6 +88,9 @@ #include "../spray-context.h" #include "../ui/dialog/calligraphic-profile-rename.h" #include "../ui/icon-names.h" +#include "../ui/tool/control-point-selection.h" +#include "../ui/tool/node-tool.h" +#include "../ui/tool/multi-path-manipulator.h" #include "../ui/widget/style-swatch.h" #include "../verbs.h" #include "../widgets/button.h" @@ -98,14 +100,28 @@ #include "../xml/attribute-record.h" #include "../xml/node-event-vector.h" #include "../xml/repr.h" +#include "ui/uxmanager.h" #include "toolbox.h" +#define ENABLE_TASK_SUPPORT 1 + using Inkscape::UnitTracker; +using Inkscape::UI::UXManager; typedef void (*SetupFunction)(GtkWidget *toolbox, SPDesktop *desktop); typedef void (*UpdateFunction)(SPDesktop *desktop, SPEventContext *eventcontext, GtkWidget *toolbox); +enum BarId { + BAR_TOOL = 0, + BAR_AUX, + BAR_COMMANDS, + BAR_SNAP, +}; + +#define BAR_ID_KEY "BarIdValue" +#define HANDLE_POS_MARK "x-inkscape-pos" + static void sp_node_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions, GObject* holder); static void sp_tweak_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions, GObject* holder); static void sp_spray_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions, GObject* holder); @@ -128,7 +144,18 @@ static void sp_lpetool_toolbox_prep(SPDesktop *desktop, GtkActionGroup* ma namespace { GtkWidget *sp_text_toolbox_new (SPDesktop *desktop); } -Inkscape::IconSize prefToSize( Glib::ustring const &path, int base ) { +#if ENABLE_TASK_SUPPORT +static void fireTaskChange( EgeSelectOneAction *act, SPDesktop *dt ) +{ + gint selected = ege_select_one_action_get_active( act ); + UXManager::getInstance()->setTask(dt, selected); +} +#endif // ENABLE_TASK_SUPPORT + +using Inkscape::UI::ToolboxFactory; + + +Inkscape::IconSize ToolboxFactory::prefToSize( Glib::ustring const &path, int base ) { static Inkscape::IconSize sizeChoices[] = { Inkscape::ICON_SIZE_LARGE_TOOLBAR, Inkscape::ICON_SIZE_SMALL_TOOLBAR, @@ -146,7 +173,7 @@ static struct { sp_verb_t doubleclick_verb; } const tools[] = { { "SPSelectContext", "select_tool", SP_VERB_CONTEXT_SELECT, SP_VERB_CONTEXT_SELECT_PREFS}, - { "SPNodeContext", "node_tool", SP_VERB_CONTEXT_NODE, SP_VERB_CONTEXT_NODE_PREFS }, + { "InkNodeTool", "node_tool", SP_VERB_CONTEXT_NODE, SP_VERB_CONTEXT_NODE_PREFS }, { "SPTweakContext", "tweak_tool", SP_VERB_CONTEXT_TWEAK, SP_VERB_CONTEXT_TWEAK_PREFS }, { "SPSprayContext", "spray_tool", SP_VERB_CONTEXT_SPRAY, SP_VERB_CONTEXT_SPRAY_PREFS }, { "SPZoomContext", "zoom_tool", SP_VERB_CONTEXT_ZOOM, SP_VERB_CONTEXT_ZOOM_PREFS }, @@ -180,7 +207,7 @@ static struct { } const aux_toolboxes[] = { { "SPSelectContext", "select_toolbox", 0, sp_select_toolbox_prep, "SelectToolbar", SP_VERB_INVALID, 0, 0}, - { "SPNodeContext", "node_toolbox", 0, sp_node_toolbox_prep, "NodeToolbar", + { "InkNodeTool", "node_toolbox", 0, sp_node_toolbox_prep, "NodeToolbar", SP_VERB_INVALID, 0, 0}, { "SPTweakContext", "tweak_toolbox", 0, sp_tweak_toolbox_prep, "TweakToolbar", SP_VERB_CONTEXT_TWEAK_PREFS, "/tools/tweak", N_("Color/opacity used for color tweaking")}, @@ -255,6 +282,7 @@ static gchar const * ui_descr = " </toolbar>" " <toolbar name='NodeToolbar'>" + " <separator />" " <toolitem action='NodeInsertAction' />" " <toolitem action='NodeDeleteAction' />" " <separator />" @@ -283,6 +311,7 @@ static gchar const * ui_descr = " <toolitem action='ObjectEditMaskPathAction' />" " <toolitem action='EditNextLPEParameterAction' />" " <separator />" + " <toolitem action='NodesShowTransformHandlesAction' />" " <toolitem action='NodesShowHandlesAction' />" " <toolitem action='NodesShowHelperpath' />" " </toolbar>" @@ -470,7 +499,7 @@ static gchar const * ui_descr = " </toolbar>" " <toolbar name='ConnectorToolbar'>" - " <toolitem action='ConnectorEditModeAction' />" +// " <toolitem action='ConnectorEditModeAction' />" " <toolitem action='ConnectorAvoidAction' />" " <toolitem action='ConnectorIgnoreAction' />" " <toolitem action='ConnectorOrthogonalAction' />" @@ -480,8 +509,8 @@ static gchar const * ui_descr = " <toolitem action='ConnectorLengthAction' />" " <toolitem action='ConnectorDirectedAction' />" " <toolitem action='ConnectorOverlapAction' />" - " <toolitem action='ConnectorNewConnPointAction' />" - " <toolitem action='ConnectorRemoveConnPointAction' />" +// " <toolitem action='ConnectorNewConnPointAction' />" +// " <toolitem action='ConnectorRemoveConnPointAction' />" " </toolbar>" "</ui>" @@ -489,7 +518,7 @@ static gchar const * ui_descr = static Glib::RefPtr<Gtk::ActionGroup> create_or_fetch_actions( SPDesktop* desktop ); -static void toolbox_set_desktop (GtkWidget *toolbox, SPDesktop *desktop, SetupFunction setup_func, UpdateFunction update_func, sigc::connection*); +void setup_snap_toolbox (GtkWidget *toolbox, SPDesktop *desktop); static void setup_tool_toolbox (GtkWidget *toolbox, SPDesktop *desktop); static void update_tool_toolbox (SPDesktop *desktop, SPEventContext *eventcontext, GtkWidget *toolbox); @@ -572,7 +601,7 @@ Gtk::Widget* VerbAction::create_menu_item_vfunc() Gtk::Widget* VerbAction::create_tool_item_vfunc() { // Gtk::Widget* widg = Gtk::Action::create_tool_item_vfunc(); - Inkscape::IconSize toolboxSize = prefToSize("/toolbox/tools/small"); + Inkscape::IconSize toolboxSize = ToolboxFactory::prefToSize("/toolbox/tools/small"); GtkWidget* toolbox = 0; GtkWidget *button = sp_toolbox_button_new_from_verb_with_doubleclick( toolbox, toolboxSize, SP_BUTTON_TYPE_TOGGLE, @@ -780,7 +809,7 @@ Glib::RefPtr<Gtk::ActionGroup> create_or_fetch_actions( SPDesktop* desktop ) SP_VERB_ZOOM_SELECTION, }; - Inkscape::IconSize toolboxSize = prefToSize("/toolbox/small"); + Inkscape::IconSize toolboxSize = ToolboxFactory::prefToSize("/toolbox/small"); static std::map<SPDesktop*, Glib::RefPtr<Gtk::ActionGroup> > groups; Glib::RefPtr<Gtk::ActionGroup> mainActions; @@ -816,6 +845,43 @@ Glib::RefPtr<Gtk::ActionGroup> create_or_fetch_actions( SPDesktop* desktop ) } } +#if ENABLE_TASK_SUPPORT + if ( !mainActions->get_action("TaskSetAction") ) { + GtkListStore* model = gtk_list_store_new( 2, G_TYPE_STRING, G_TYPE_STRING ); + + GtkTreeIter iter; + gtk_list_store_append( model, &iter ); + gtk_list_store_set( model, &iter, + 0, _("Default"), + 1, _("Default interface setup"), + -1 ); + + gtk_list_store_append( model, &iter ); + gtk_list_store_set( model, &iter, + 0, _("Custom"), + 1, _("Set the custom task"), + -1 ); + + gtk_list_store_append( model, &iter ); + gtk_list_store_set( model, &iter, + 0, _("Wide"), + 1, _("Setup for widescreen work"), + -1 ); + + EgeSelectOneAction* act = ege_select_one_action_new( "TaskSetAction", _("Task"), (""), NULL, GTK_TREE_MODEL(model) ); + g_object_set( act, "short_label", _("Task:"), NULL ); + mainActions->add(Glib::wrap(GTK_ACTION(act))); + //g_object_set_data( holder, "mode_action", act ); + + ege_select_one_action_set_appearance( act, "minimal" ); + ege_select_one_action_set_radio_action_type( act, INK_RADIO_ACTION_TYPE ); + //ege_select_one_action_set_icon_size( act, secondarySize ); + ege_select_one_action_set_tooltip_column( act, 1 ); + + //ege_select_one_action_set_active( act, mode ); + g_signal_connect_after( G_OBJECT(act), "changed", G_CALLBACK(fireTaskChange), desktop ); + } +#endif // ENABLE_TASK_SUPPORT return mainActions; } @@ -833,25 +899,21 @@ void handlebox_attached(GtkHandleBox* /*handlebox*/, GtkWidget* widget, gpointer gtk_widget_set_size_request( widget, -1, -1 ); } - - -GtkWidget * -sp_tool_toolbox_new() +static GtkWidget* toolboxNewCommon( GtkWidget* tb, BarId id, GtkPositionType handlePos ) { - GtkTooltips *tt = gtk_tooltips_new(); - GtkWidget* tb = gtk_toolbar_new(); - gtk_toolbar_set_orientation(GTK_TOOLBAR(tb), GTK_ORIENTATION_VERTICAL); - gtk_toolbar_set_show_arrow(GTK_TOOLBAR(tb), TRUE); - g_object_set_data(G_OBJECT(tb), "desktop", NULL); - g_object_set_data(G_OBJECT(tb), "tooltips", tt); gtk_widget_set_sensitive(tb, FALSE); - GtkWidget *hb = gtk_handle_box_new(); - gtk_handle_box_set_handle_position(GTK_HANDLE_BOX(hb), GTK_POS_TOP); - gtk_handle_box_set_shadow_type(GTK_HANDLE_BOX(hb), GTK_SHADOW_OUT); - gtk_handle_box_set_snap_edge(GTK_HANDLE_BOX(hb), GTK_POS_LEFT); + GtkWidget *hb = 0; + if ( UXManager::getInstance()->isFloatWindowProblem() ) { + hb = gtk_event_box_new(); // A simple, neutral container. + } else { + hb = gtk_handle_box_new(); + gtk_handle_box_set_handle_position(GTK_HANDLE_BOX(hb), handlePos); + gtk_handle_box_set_shadow_type(GTK_HANDLE_BOX(hb), GTK_SHADOW_OUT); + gtk_handle_box_set_snap_edge(GTK_HANDLE_BOX(hb), GTK_POS_LEFT); + } gtk_container_add(GTK_CONTAINER(hb), tb); gtk_widget_show(GTK_WIDGET(tb)); @@ -859,96 +921,47 @@ sp_tool_toolbox_new() sigc::connection* conn = new sigc::connection; g_object_set_data(G_OBJECT(hb), "event_context_connection", conn); - g_signal_connect(G_OBJECT(hb), "child_detached", G_CALLBACK(handlebox_detached), static_cast<gpointer>(0)); - g_signal_connect(G_OBJECT(hb), "child_attached", G_CALLBACK(handlebox_attached), static_cast<gpointer>(0)); + if ( GTK_IS_HANDLE_BOX(hb) ) { + g_signal_connect(G_OBJECT(hb), "child_detached", G_CALLBACK(handlebox_detached), static_cast<gpointer>(0)); + g_signal_connect(G_OBJECT(hb), "child_attached", G_CALLBACK(handlebox_attached), static_cast<gpointer>(0)); + } + + gpointer val = GINT_TO_POINTER(id); + g_object_set_data(G_OBJECT(hb), BAR_ID_KEY, val); return hb; } -GtkWidget * -sp_aux_toolbox_new() +GtkWidget *ToolboxFactory::createToolToolbox() { GtkWidget *tb = gtk_vbox_new(FALSE, 0); - gtk_box_set_spacing(GTK_BOX(tb), AUX_SPACING); - - g_object_set_data(G_OBJECT(tb), "desktop", NULL); - - gtk_widget_set_sensitive(tb, FALSE); - - GtkWidget *hb = gtk_handle_box_new(); - gtk_handle_box_set_handle_position(GTK_HANDLE_BOX(hb), GTK_POS_LEFT); - gtk_handle_box_set_shadow_type(GTK_HANDLE_BOX(hb), GTK_SHADOW_OUT); - gtk_handle_box_set_snap_edge(GTK_HANDLE_BOX(hb), GTK_POS_LEFT); - - gtk_container_add(GTK_CONTAINER(hb), tb); - gtk_widget_show(GTK_WIDGET(tb)); - - sigc::connection* conn = new sigc::connection; - g_object_set_data(G_OBJECT(hb), "event_context_connection", conn); + return toolboxNewCommon( tb, BAR_TOOL, GTK_POS_TOP ); +} - g_signal_connect(G_OBJECT(hb), "child_detached", G_CALLBACK(handlebox_detached), static_cast<gpointer>(0)); - g_signal_connect(G_OBJECT(hb), "child_attached", G_CALLBACK(handlebox_attached), static_cast<gpointer>(0)); +GtkWidget *ToolboxFactory::createAuxToolbox() +{ + GtkWidget *tb = gtk_vbox_new(FALSE, 0); - return hb; + return toolboxNewCommon( tb, BAR_AUX, GTK_POS_LEFT ); } //#################################### //# Commands Bar //#################################### -GtkWidget * -sp_commands_toolbox_new() +GtkWidget *ToolboxFactory::createCommandsToolbox() { - GtkWidget *tb = gtk_toolbar_new(); - - g_object_set_data(G_OBJECT(tb), "desktop", NULL); - gtk_widget_set_sensitive(tb, FALSE); - - GtkWidget *hb = gtk_handle_box_new(); - gtk_handle_box_set_handle_position(GTK_HANDLE_BOX(hb), GTK_POS_LEFT); - gtk_handle_box_set_shadow_type(GTK_HANDLE_BOX(hb), GTK_SHADOW_OUT); - gtk_handle_box_set_snap_edge(GTK_HANDLE_BOX(hb), GTK_POS_LEFT); - - gtk_container_add(GTK_CONTAINER(hb), tb); - gtk_widget_show(GTK_WIDGET(tb)); - - sigc::connection* conn = new sigc::connection; - g_object_set_data(G_OBJECT(hb), "event_context_connection", conn); - - g_signal_connect(G_OBJECT(hb), "child_detached", G_CALLBACK(handlebox_detached), static_cast<gpointer>(0)); - g_signal_connect(G_OBJECT(hb), "child_attached", G_CALLBACK(handlebox_attached), static_cast<gpointer>(0)); + GtkWidget *tb = gtk_vbox_new(FALSE, 0); - return hb; + return toolboxNewCommon( tb, BAR_COMMANDS, GTK_POS_LEFT ); } -GtkWidget * -sp_snap_toolbox_new() +GtkWidget *ToolboxFactory::createSnapToolbox() { GtkWidget *tb = gtk_vbox_new(FALSE, 0); - gtk_box_set_spacing(GTK_BOX(tb), AUX_SPACING); - g_object_set_data(G_OBJECT(tb), "desktop", NULL); - - //GtkWidget *tb = gtk_toolbar_new(); - //g_object_set_data(G_OBJECT(tb), "desktop", NULL); - - gtk_widget_set_sensitive(tb, FALSE); - GtkWidget *hb = gtk_handle_box_new(); - gtk_handle_box_set_handle_position(GTK_HANDLE_BOX(hb), GTK_POS_LEFT); - gtk_handle_box_set_shadow_type(GTK_HANDLE_BOX(hb), GTK_SHADOW_OUT); - gtk_handle_box_set_snap_edge(GTK_HANDLE_BOX(hb), GTK_POS_LEFT); - - gtk_container_add(GTK_CONTAINER(hb), tb); - gtk_widget_show(GTK_WIDGET(tb)); - - sigc::connection* conn = new sigc::connection; - g_object_set_data(G_OBJECT(hb), "event_context_connection", conn); - - g_signal_connect(G_OBJECT(hb), "child_detached", G_CALLBACK(handlebox_detached), static_cast<gpointer>(0)); - g_signal_connect(G_OBJECT(hb), "child_attached", G_CALLBACK(handlebox_attached), static_cast<gpointer>(0)); - - return hb; + return toolboxNewCommon( tb, BAR_SNAP, GTK_POS_LEFT ); } static EgeAdjustmentAction * create_adjustment_action( gchar const *name, @@ -1006,135 +1019,157 @@ static EgeAdjustmentAction * create_adjustment_action( gchar const *name, //# node editing callbacks //#################################### -/** - * FIXME: Returns current shape_editor in context. // later eliminate this function at all! - */ -static ShapeEditor *get_current_shape_editor() +/** Temporary hack: Returns the node tool in the active desktop. + * Will go away during tool refactoring. */ +static InkNodeTool *get_node_tool() { - if (!SP_ACTIVE_DESKTOP) { - return NULL; - } - - SPEventContext *event_context = (SP_ACTIVE_DESKTOP)->event_context; - - if (!SP_IS_NODE_CONTEXT(event_context)) { - return NULL; - } - - return event_context->shape_editor; + if (!SP_ACTIVE_DESKTOP) return NULL; + SPEventContext *ec = SP_ACTIVE_DESKTOP->event_context; + if (!INK_IS_NODE_TOOL(ec)) return NULL; + return static_cast<InkNodeTool*>(ec); } - void sp_node_path_edit_add(void) { - ShapeEditor *shape_editor = get_current_shape_editor(); - if (shape_editor) shape_editor->add_node(); + InkNodeTool *nt = get_node_tool(); + if (nt) { + nt->_multipath->insertNodes(); + } } void sp_node_path_edit_delete(void) { - ShapeEditor *shape_editor = get_current_shape_editor(); - if (shape_editor) shape_editor->delete_nodes_preserving_shape(); + InkNodeTool *nt = get_node_tool(); + if (nt) { + Inkscape::Preferences *prefs = Inkscape::Preferences::get(); + nt->_multipath->deleteNodes(prefs->getBool("/tools/nodes/delete_preserves_shape", true)); + } } void sp_node_path_edit_delete_segment(void) { - ShapeEditor *shape_editor = get_current_shape_editor(); - if (shape_editor) shape_editor->delete_segment(); + InkNodeTool *nt = get_node_tool(); + if (nt) { + nt->_multipath->deleteSegments(); + } } void sp_node_path_edit_break(void) { - ShapeEditor *shape_editor = get_current_shape_editor(); - if (shape_editor) shape_editor->break_at_nodes(); + InkNodeTool *nt = get_node_tool(); + if (nt) { + nt->_multipath->breakNodes(); + } } void sp_node_path_edit_join(void) { - ShapeEditor *shape_editor = get_current_shape_editor(); - if (shape_editor) shape_editor->join_nodes(); + InkNodeTool *nt = get_node_tool(); + if (nt) { + nt->_multipath->joinNodes(); + } } void sp_node_path_edit_join_segment(void) { - ShapeEditor *shape_editor = get_current_shape_editor(); - if (shape_editor) shape_editor->join_segments(); + InkNodeTool *nt = get_node_tool(); + if (nt) { + nt->_multipath->joinSegments(); + } } void sp_node_path_edit_toline(void) { - ShapeEditor *shape_editor = get_current_shape_editor(); - if (shape_editor) shape_editor->set_type_of_segments(NR_LINETO); + InkNodeTool *nt = get_node_tool(); + if (nt) { + nt->_multipath->setSegmentType(Inkscape::UI::SEGMENT_STRAIGHT); + } } void sp_node_path_edit_tocurve(void) { - ShapeEditor *shape_editor = get_current_shape_editor(); - if (shape_editor) shape_editor->set_type_of_segments(NR_CURVETO); + InkNodeTool *nt = get_node_tool(); + if (nt) { + nt->_multipath->setSegmentType(Inkscape::UI::SEGMENT_CUBIC_BEZIER); + } } void sp_node_path_edit_cusp(void) { - ShapeEditor *shape_editor = get_current_shape_editor(); - if (shape_editor) shape_editor->set_node_type(Inkscape::NodePath::NODE_CUSP); + InkNodeTool *nt = get_node_tool(); + if (nt) { + nt->_multipath->setNodeType(Inkscape::UI::NODE_CUSP); + } } void sp_node_path_edit_smooth(void) { - ShapeEditor *shape_editor = get_current_shape_editor(); - if (shape_editor) shape_editor->set_node_type(Inkscape::NodePath::NODE_SMOOTH); + InkNodeTool *nt = get_node_tool(); + if (nt) { + nt->_multipath->setNodeType(Inkscape::UI::NODE_SMOOTH); + } } void sp_node_path_edit_symmetrical(void) { - ShapeEditor *shape_editor = get_current_shape_editor(); - if (shape_editor) shape_editor->set_node_type(Inkscape::NodePath::NODE_SYMM); + InkNodeTool *nt = get_node_tool(); + if (nt) { + nt->_multipath->setNodeType(Inkscape::UI::NODE_SYMMETRIC); + } } void sp_node_path_edit_auto(void) { - ShapeEditor *shape_editor = get_current_shape_editor(); - if (shape_editor) shape_editor->set_node_type(Inkscape::NodePath::NODE_AUTO); + InkNodeTool *nt = get_node_tool(); + if (nt) { + nt->_multipath->setNodeType(Inkscape::UI::NODE_AUTO); + } +} + +static void toggle_show_transform_handles (GtkToggleAction *act, gpointer /*data*/) { + Inkscape::Preferences *prefs = Inkscape::Preferences::get(); + bool show = gtk_toggle_action_get_active( act ); + prefs->setBool("/tools/nodes/show_transform_handles", show); } static void toggle_show_handles (GtkToggleAction *act, gpointer /*data*/) { Inkscape::Preferences *prefs = Inkscape::Preferences::get(); bool show = gtk_toggle_action_get_active( act ); prefs->setBool("/tools/nodes/show_handles", show); - ShapeEditor *shape_editor = get_current_shape_editor(); - if (shape_editor) shape_editor->show_handles(show); } static void toggle_show_helperpath (GtkToggleAction *act, gpointer /*data*/) { Inkscape::Preferences *prefs = Inkscape::Preferences::get(); bool show = gtk_toggle_action_get_active( act ); - prefs->setBool("/tools/nodes/show_helperpath", show); - ShapeEditor *shape_editor = get_current_shape_editor(); - if (shape_editor) shape_editor->show_helperpath(show); + prefs->setBool("/tools/nodes/show_outline", show); } void sp_node_path_edit_nextLPEparam (GtkAction */*act*/, gpointer data) { sp_selection_next_patheffect_param( reinterpret_cast<SPDesktop*>(data) ); } -void sp_node_path_edit_clippath (GtkAction */*act*/, gpointer data) { - sp_selection_edit_clip_or_mask( reinterpret_cast<SPDesktop*>(data), true); +void toggle_edit_clip (GtkToggleAction *act, gpointer /*data*/) { + Inkscape::Preferences *prefs = Inkscape::Preferences::get(); + bool edit = gtk_toggle_action_get_active( act ); + prefs->setBool("/tools/nodes/edit_clipping_paths", edit); } -void sp_node_path_edit_maskpath (GtkAction */*act*/, gpointer data) { - sp_selection_edit_clip_or_mask( reinterpret_cast<SPDesktop*>(data), false); +void toggle_edit_mask (GtkToggleAction *act, gpointer /*data*/) { + Inkscape::Preferences *prefs = Inkscape::Preferences::get(); + bool edit = gtk_toggle_action_get_active( act ); + prefs->setBool("/tools/nodes/edit_masks", edit); } /* is called when the node selection is modified */ @@ -1157,54 +1192,29 @@ sp_node_toolbox_coord_changed(gpointer /*shape_editor*/, GObject *tbl) UnitTracker* tracker = reinterpret_cast<UnitTracker*>( g_object_get_data( tbl, "tracker" ) ); SPUnit const *unit = tracker->getActiveUnit(); - ShapeEditor *shape_editor = get_current_shape_editor(); - if (shape_editor && shape_editor->has_nodepath()) { - Inkscape::NodePath::Path *nodepath = shape_editor->get_nodepath(); - int n_selected = 0; - if (nodepath) { - n_selected = nodepath->numSelected(); - } - - if (n_selected == 0) { - gtk_action_set_sensitive(xact, FALSE); - gtk_action_set_sensitive(yact, FALSE); - } else { - gtk_action_set_sensitive(xact, TRUE); - gtk_action_set_sensitive(yact, TRUE); - Geom::Coord oldx = sp_units_get_pixels(gtk_adjustment_get_value(xadj), *unit); - Geom::Coord oldy = sp_units_get_pixels(gtk_adjustment_get_value(xadj), *unit); - - if (n_selected == 1) { - Geom::Point sel_node = nodepath->singleSelectedCoords(); - if (oldx != sel_node[Geom::X] || oldy != sel_node[Geom::Y]) { - gtk_adjustment_set_value(xadj, sp_pixels_get_units(sel_node[Geom::X], *unit)); - gtk_adjustment_set_value(yadj, sp_pixels_get_units(sel_node[Geom::Y], *unit)); - } - } else { - boost::optional<Geom::Coord> x = sp_node_selected_common_coord(nodepath, Geom::X); - boost::optional<Geom::Coord> y = sp_node_selected_common_coord(nodepath, Geom::Y); - if ((x && ((*x) != oldx)) || (y && ((*y) != oldy))) { - /* Note: Currently x and y will always have a value, even if the coordinates of the - selected nodes don't coincide (in this case we use the coordinates of the center - of the bounding box). So the entries are never set to zero. */ - // FIXME: Maybe we should clear the entry if several nodes are selected - // instead of providing a kind of average value - gtk_adjustment_set_value(xadj, sp_pixels_get_units(x ? (*x) : 0.0, *unit)); - gtk_adjustment_set_value(yadj, sp_pixels_get_units(y ? (*y) : 0.0, *unit)); - } - } - } - } else { - // no shape-editor or nodepath yet (when we just switched to the tool); coord entries must be inactive + InkNodeTool *nt = get_node_tool(); + if (!nt || nt->_selected_nodes->empty()) { + // no path selected gtk_action_set_sensitive(xact, FALSE); gtk_action_set_sensitive(yact, FALSE); + } else { + gtk_action_set_sensitive(xact, TRUE); + gtk_action_set_sensitive(yact, TRUE); + Geom::Coord oldx = sp_units_get_pixels(gtk_adjustment_get_value(xadj), *unit); + Geom::Coord oldy = sp_units_get_pixels(gtk_adjustment_get_value(xadj), *unit); + Geom::Point mid = nt->_selected_nodes->pointwiseBounds()->midpoint(); + + if (oldx != mid[Geom::X]) + gtk_adjustment_set_value(xadj, sp_pixels_get_units(mid[Geom::X], *unit)); + if (oldy != mid[Geom::Y]) + gtk_adjustment_set_value(yadj, sp_pixels_get_units(mid[Geom::Y], *unit)); } g_object_set_data( tbl, "freeze", GINT_TO_POINTER(FALSE) ); } static void -sp_node_path_value_changed(GtkAdjustment *adj, GObject *tbl, gchar const *value_name) +sp_node_path_value_changed(GtkAdjustment *adj, GObject *tbl, Geom::Dim2 d) { SPDesktop *desktop = (SPDesktop *) g_object_get_data( tbl, "desktop" ); Inkscape::Preferences *prefs = Inkscape::Preferences::get(); @@ -1213,7 +1223,8 @@ sp_node_path_value_changed(GtkAdjustment *adj, GObject *tbl, gchar const *value_ SPUnit const *unit = tracker->getActiveUnit(); if (sp_document_get_undo_sensitive(sp_desktop_document(desktop))) { - prefs->setDouble(Glib::ustring("/tools/nodes/") + value_name, sp_units_get_pixels(adj->value, *unit)); + prefs->setDouble(Glib::ustring("/tools/nodes/") + (d == Geom::X ? "x" : "y"), + sp_units_get_pixels(adj->value, *unit)); } // quit if run by the attr_changed listener @@ -1224,15 +1235,13 @@ sp_node_path_value_changed(GtkAdjustment *adj, GObject *tbl, gchar const *value_ // in turn, prevent listener from responding g_object_set_data( tbl, "freeze", GINT_TO_POINTER(TRUE)); - ShapeEditor *shape_editor = get_current_shape_editor(); - if (shape_editor && shape_editor->has_nodepath()) { + InkNodeTool *nt = get_node_tool(); + if (nt && !nt->_selected_nodes->empty()) { double val = sp_units_get_pixels(gtk_adjustment_get_value(adj), *unit); - if (!strcmp(value_name, "x")) { - sp_node_selected_move_absolute(shape_editor->get_nodepath(), val, Geom::X); - } - if (!strcmp(value_name, "y")) { - sp_node_selected_move_absolute(shape_editor->get_nodepath(), val, Geom::Y); - } + double oldval = nt->_selected_nodes->pointwiseBounds()->midpoint()[d]; + Geom::Point delta(0,0); + delta[d] = val - oldval; + nt->_multipath->move(delta); } g_object_set_data( tbl, "freeze", GINT_TO_POINTER(FALSE) ); @@ -1241,13 +1250,13 @@ sp_node_path_value_changed(GtkAdjustment *adj, GObject *tbl, gchar const *value_ static void sp_node_path_x_value_changed(GtkAdjustment *adj, GObject *tbl) { - sp_node_path_value_changed(adj, tbl, "x"); + sp_node_path_value_changed(adj, tbl, Geom::X); } static void sp_node_path_y_value_changed(GtkAdjustment *adj, GObject *tbl) { - sp_node_path_value_changed(adj, tbl, "y"); + sp_node_path_value_changed(adj, tbl, Geom::Y); } void @@ -1266,26 +1275,6 @@ sp_node_toolbox_sel_changed (Inkscape::Selection *selection, GObject *tbl) gtk_action_set_sensitive(w, FALSE); } } - - { - GtkAction* w = GTK_ACTION( g_object_get_data( tbl, "nodes_clippathedit" ) ); - SPItem *item = selection->singleItem(); - if (item && item->clip_ref && item->clip_ref->getObject()) { - gtk_action_set_sensitive(w, TRUE); - } else { - gtk_action_set_sensitive(w, FALSE); - } - } - - { - GtkAction* w = GTK_ACTION( g_object_get_data( tbl, "nodes_maskedit" ) ); - SPItem *item = selection->singleItem(); - if (item && item->mask_ref && item->mask_ref->getObject()) { - gtk_action_set_sensitive(w, TRUE); - } else { - gtk_action_set_sensitive(w, FALSE); - } - } } void @@ -1307,7 +1296,7 @@ static void sp_node_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions tracker->setActiveUnit( sp_desktop_namedview(desktop)->doc_units ); g_object_set_data( holder, "tracker", tracker ); - Inkscape::IconSize secondarySize = prefToSize("/toolbox/secondary", 1); + Inkscape::IconSize secondarySize = ToolboxFactory::prefToSize("/toolbox/secondary", 1); { InkAction* inky = ink_action_new( "NodeInsertAction", @@ -1333,8 +1322,8 @@ static void sp_node_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions { InkAction* inky = ink_action_new( "NodeJoinAction", - _("Join endnodes"), - _("Join selected endnodes"), + _("Join nodes"), + _("Join selected nodes"), INKSCAPE_ICON_NODE_JOIN, secondarySize ); g_object_set( inky, "short_label", _("Join"), NULL ); @@ -1434,11 +1423,22 @@ static void sp_node_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions } { + InkToggleAction* act = ink_toggle_action_new( "NodesShowTransformHandlesAction", + _("Show Transform Handles"), + _("Show node transformation handles"), + "node-transform", + secondarySize ); + gtk_action_group_add_action( mainActions, GTK_ACTION( act ) ); + g_signal_connect_after( G_OBJECT(act), "toggled", G_CALLBACK(toggle_show_transform_handles), desktop ); + gtk_toggle_action_set_active( GTK_TOGGLE_ACTION(act), prefs->getBool("/tools/nodes/show_transform_handles", false) ); + } + + { InkToggleAction* act = ink_toggle_action_new( "NodesShowHandlesAction", _("Show Handles"), _("Show the Bezier handles of selected nodes"), INKSCAPE_ICON_SHOW_NODE_HANDLES, - Inkscape::ICON_SIZE_DECORATION ); + secondarySize ); gtk_action_group_add_action( mainActions, GTK_ACTION( act ) ); g_signal_connect_after( G_OBJECT(act), "toggled", G_CALLBACK(toggle_show_handles), desktop ); gtk_toggle_action_set_active( GTK_TOGGLE_ACTION(act), prefs->getBool("/tools/nodes/show_handles", true) ); @@ -1449,10 +1449,10 @@ static void sp_node_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions _("Show Outline"), _("Show the outline of the path"), INKSCAPE_ICON_SHOW_PATH_OUTLINE, - Inkscape::ICON_SIZE_DECORATION ); + secondarySize ); gtk_action_group_add_action( mainActions, GTK_ACTION( act ) ); g_signal_connect_after( G_OBJECT(act), "toggled", G_CALLBACK(toggle_show_helperpath), desktop ); - gtk_toggle_action_set_active( GTK_TOGGLE_ACTION(act), prefs->getBool("/tools/nodes/show_helperpath", false) ); + gtk_toggle_action_set_active( GTK_TOGGLE_ACTION(act), prefs->getBool("/tools/nodes/show_outline", false) ); } { @@ -1460,32 +1460,32 @@ static void sp_node_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions _("Next path effect parameter"), _("Show next path effect parameter for editing"), INKSCAPE_ICON_PATH_EFFECT_PARAMETER_NEXT, - Inkscape::ICON_SIZE_DECORATION ); + secondarySize ); g_signal_connect_after( G_OBJECT(inky), "activate", G_CALLBACK(sp_node_path_edit_nextLPEparam), desktop ); gtk_action_group_add_action( mainActions, GTK_ACTION(inky) ); g_object_set_data( holder, "nodes_lpeedit", inky); } { - InkAction* inky = ink_action_new( "ObjectEditClipPathAction", - _("Edit clipping path"), - _("Edit the clipping path of the object"), + InkToggleAction* inky = ink_toggle_action_new( "ObjectEditClipPathAction", + _("Edit clipping paths"), + _("Show editing controls for clipping paths of selected objects"), INKSCAPE_ICON_PATH_CLIP_EDIT, - Inkscape::ICON_SIZE_DECORATION ); - g_signal_connect_after( G_OBJECT(inky), "activate", G_CALLBACK(sp_node_path_edit_clippath), desktop ); + secondarySize ); gtk_action_group_add_action( mainActions, GTK_ACTION(inky) ); - g_object_set_data( holder, "nodes_clippathedit", inky); + g_signal_connect_after( G_OBJECT(inky), "toggled", G_CALLBACK(toggle_edit_clip), desktop ); + gtk_toggle_action_set_active( GTK_TOGGLE_ACTION(inky), prefs->getBool("/tools/nodes/edit_clipping_paths") ); } { - InkAction* inky = ink_action_new( "ObjectEditMaskPathAction", - _("Edit mask path"), - _("Edit the mask of the object"), + InkToggleAction* inky = ink_toggle_action_new( "ObjectEditMaskPathAction", + _("Edit masks"), + _("Show editing controls for masks of selected objects"), INKSCAPE_ICON_PATH_MASK_EDIT, - Inkscape::ICON_SIZE_DECORATION ); - g_signal_connect_after( G_OBJECT(inky), "activate", G_CALLBACK(sp_node_path_edit_maskpath), desktop ); + secondarySize ); gtk_action_group_add_action( mainActions, GTK_ACTION(inky) ); - g_object_set_data( holder, "nodes_maskedit", inky); + g_signal_connect_after( G_OBJECT(inky), "toggled", G_CALLBACK(toggle_edit_mask), desktop ); + gtk_toggle_action_set_active( GTK_TOGGLE_ACTION(inky), prefs->getBool("/tools/nodes/edit_masks") ); } /* X coord of selected node(s) */ @@ -1566,55 +1566,41 @@ static void sp_zoom_toolbox_prep(SPDesktop */*desktop*/, GtkActionGroup* /*mainA // no custom GtkAction setup needed } // end of sp_zoom_toolbox_prep() -void -sp_tool_toolbox_set_desktop(GtkWidget *toolbox, SPDesktop *desktop) +void ToolboxFactory::setToolboxDesktop(GtkWidget *toolbox, SPDesktop *desktop) { - toolbox_set_desktop(toolbox, - desktop, - setup_tool_toolbox, - update_tool_toolbox, - static_cast<sigc::connection*>(g_object_get_data(G_OBJECT(toolbox), - "event_context_connection"))); -} + sigc::connection *conn = static_cast<sigc::connection*>(g_object_get_data(G_OBJECT(toolbox), + "event_context_connection")); + BarId id = static_cast<BarId>( GPOINTER_TO_INT(g_object_get_data(G_OBJECT(toolbox), BAR_ID_KEY)) ); -void -sp_aux_toolbox_set_desktop(GtkWidget *toolbox, SPDesktop *desktop) -{ - toolbox_set_desktop(gtk_bin_get_child(GTK_BIN(toolbox)), - desktop, - setup_aux_toolbox, - update_aux_toolbox, - static_cast<sigc::connection*>(g_object_get_data(G_OBJECT(toolbox), - "event_context_connection"))); -} + SetupFunction setup_func = 0; + UpdateFunction update_func = 0; -void -sp_commands_toolbox_set_desktop(GtkWidget *toolbox, SPDesktop *desktop) -{ - toolbox_set_desktop(toolbox, - desktop, - setup_commands_toolbox, - update_commands_toolbox, - static_cast<sigc::connection*>(g_object_get_data(G_OBJECT(toolbox), - "event_context_connection"))); -} + switch (id) { + case BAR_TOOL: + setup_func = setup_tool_toolbox; + update_func = update_tool_toolbox; + break; -void -sp_snap_toolbox_set_desktop(GtkWidget *toolbox, SPDesktop *desktop) -{ - toolbox_set_desktop(toolbox, - desktop, - setup_snap_toolbox, - update_snap_toolbox, - static_cast<sigc::connection*>(g_object_get_data(G_OBJECT(toolbox), - "event_context_connection"))); -} + case BAR_AUX: + toolbox = gtk_bin_get_child(GTK_BIN(toolbox)); + setup_func = setup_aux_toolbox; + update_func = update_aux_toolbox; + break; + case BAR_COMMANDS: + setup_func = setup_commands_toolbox; + update_func = update_commands_toolbox; + break; + + case BAR_SNAP: + setup_func = setup_snap_toolbox; + update_func = updateSnapToolbox; + break; + default: + g_warning("Unexpected toolbox id encountered."); + } -static void -toolbox_set_desktop(GtkWidget *toolbox, SPDesktop *desktop, SetupFunction setup_func, UpdateFunction update_func, sigc::connection *conn) -{ gpointer ptr = g_object_get_data(G_OBJECT(toolbox), "desktop"); SPDesktop *old_desktop = static_cast<SPDesktop*>(ptr); @@ -1630,19 +1616,156 @@ toolbox_set_desktop(GtkWidget *toolbox, SPDesktop *desktop, SetupFunction setup_ g_object_set_data(G_OBJECT(toolbox), "desktop", (gpointer)desktop); - if (desktop) { + if (desktop && setup_func && update_func) { gtk_widget_set_sensitive(toolbox, TRUE); setup_func(toolbox, desktop); update_func(desktop, desktop->event_context, toolbox); - *conn = desktop->connectEventContextChanged - (sigc::bind (sigc::ptr_fun(update_func), toolbox)); + *conn = desktop->connectEventContextChanged(sigc::bind (sigc::ptr_fun(update_func), toolbox)); } else { gtk_widget_set_sensitive(toolbox, FALSE); } -} // end of toolbox_set_desktop() +} // end of sp_toolbox_set_desktop() +static void setupToolboxCommon( GtkWidget *toolbox, + SPDesktop *desktop, + gchar const *descr, + gchar const* toolbarName, + gchar const* sizePref ) +{ + Glib::RefPtr<Gtk::ActionGroup> mainActions = create_or_fetch_actions( desktop ); + Inkscape::Preferences *prefs = Inkscape::Preferences::get(); + + GtkUIManager* mgr = gtk_ui_manager_new(); + GError* errVal = 0; + + GtkOrientation orientation = GTK_ORIENTATION_HORIZONTAL; + + gtk_ui_manager_insert_action_group( mgr, mainActions->gobj(), 0 ); + gtk_ui_manager_add_ui_from_string( mgr, descr, -1, &errVal ); + + GtkWidget* toolBar = gtk_ui_manager_get_widget( mgr, toolbarName ); + if ( prefs->getBool("/toolbox/icononly", true) ) { + gtk_toolbar_set_style( GTK_TOOLBAR(toolBar), GTK_TOOLBAR_ICONS ); + } + + Inkscape::IconSize toolboxSize = ToolboxFactory::prefToSize(sizePref); + gtk_toolbar_set_icon_size( GTK_TOOLBAR(toolBar), static_cast<GtkIconSize>(toolboxSize) ); + + if (GTK_IS_HANDLE_BOX(toolbox)) { + // g_message("GRABBING ORIENTATION [%s]", toolbarName); + GtkPositionType pos = gtk_handle_box_get_handle_position(GTK_HANDLE_BOX(toolbox)); + orientation = ((pos == GTK_POS_LEFT) || (pos == GTK_POS_RIGHT)) ? GTK_ORIENTATION_HORIZONTAL : GTK_ORIENTATION_VERTICAL; + } else { + GtkPositionType pos = static_cast<GtkPositionType>(GPOINTER_TO_INT(g_object_get_data( G_OBJECT(toolbox), HANDLE_POS_MARK ))); + orientation = ((pos == GTK_POS_LEFT) || (pos == GTK_POS_RIGHT)) ? GTK_ORIENTATION_HORIZONTAL : GTK_ORIENTATION_VERTICAL; + } + gtk_toolbar_set_orientation(GTK_TOOLBAR(toolBar), orientation); + gtk_toolbar_set_show_arrow(GTK_TOOLBAR(toolBar), TRUE); + + g_object_set_data(G_OBJECT(toolBar), "desktop", NULL); + + GtkWidget* child = gtk_bin_get_child(GTK_BIN(toolbox)); + if ( child ) { + gtk_container_remove( GTK_CONTAINER(toolbox), child ); + } + + gtk_container_add( GTK_CONTAINER(toolbox), toolBar ); +} + +#define noDUMP_DETAILS 1 + +void ToolboxFactory::setOrientation(GtkWidget* toolbox, GtkOrientation orientation) +{ +#if DUMP_DETAILS + g_message("Set orientation for %p to be %d", toolbox, orientation); + GType type = GTK_WIDGET_TYPE(toolbox); + g_message(" [%s]", g_type_name(type)); + g_message(" %p", g_object_get_data(G_OBJECT(toolbox), BAR_ID_KEY)); +#endif + + GtkPositionType pos = (orientation == GTK_ORIENTATION_HORIZONTAL) ? GTK_POS_LEFT : GTK_POS_TOP; + GtkHandleBox* handleBox = 0; + + if (GTK_IS_BIN(toolbox)) { +#if DUMP_DETAILS + g_message(" is a BIN"); +#endif // DUMP_DETAILS + GtkWidget* child = gtk_bin_get_child(GTK_BIN(toolbox)); + if (child) { +#if DUMP_DETAILS + GType type2 = GTK_WIDGET_TYPE(child); + g_message(" child [%s]", g_type_name(type2)); +#endif // DUMP_DETAILS + + if (GTK_IS_BOX(child)) { +#if DUMP_DETAILS + g_message(" is a BOX"); +#endif // DUMP_DETAILS + + GList* children = gtk_container_get_children(GTK_CONTAINER(child)); + if (children) { + for (GList* curr = children; curr; curr = g_list_next(curr)) { + GtkWidget* child2 = GTK_WIDGET(curr->data); +#if DUMP_DETAILS + GType type3 = GTK_WIDGET_TYPE(child2); + g_message(" child2 [%s]", g_type_name(type3)); +#endif // DUMP_DETAILS + + if (GTK_IS_CONTAINER(child2)) { + GList* children2 = gtk_container_get_children(GTK_CONTAINER(child2)); + if (children2) { + for (GList* curr2 = children2; curr2; curr2 = g_list_next(curr2)) { + GtkWidget* child3 = GTK_WIDGET(curr2->data); +#if DUMP_DETAILS + GType type4 = GTK_WIDGET_TYPE(child3); + g_message(" child3 [%s]", g_type_name(type4)); +#endif // DUMP_DETAILS + if (GTK_IS_TOOLBAR(child3)) { + GtkToolbar* childBar = GTK_TOOLBAR(child3); + gtk_toolbar_set_orientation(childBar, orientation); + } + } + g_list_free(children2); + } + } + + + if (GTK_IS_TOOLBAR(child2)) { + GtkToolbar* childBar = GTK_TOOLBAR(child2); + gtk_toolbar_set_orientation(childBar, orientation); + if (GTK_IS_HANDLE_BOX(toolbox)) { + handleBox = GTK_HANDLE_BOX(toolbox); + } + } else { + g_message("need to add dynamic switch"); + } + } + g_list_free(children); + } else { + // The call is being made before the toolbox proper has been setup. + if (GTK_IS_HANDLE_BOX(toolbox)) { + handleBox = GTK_HANDLE_BOX(toolbox); + } else { + g_object_set_data(G_OBJECT(toolbox), HANDLE_POS_MARK, GINT_TO_POINTER(pos)); + } + } + } else if (GTK_IS_TOOLBAR(child)) { + GtkToolbar* toolbar = GTK_TOOLBAR(child); + gtk_toolbar_set_orientation( toolbar, orientation ); + if (GTK_IS_HANDLE_BOX(toolbox)) { + handleBox = GTK_HANDLE_BOX(toolbox); + } + } + } + } + + if (handleBox) { + gtk_handle_box_set_handle_position(handleBox, pos); + } +} + static void setup_tool_toolbox(GtkWidget *toolbox, SPDesktop *desktop) { @@ -1671,36 +1794,12 @@ setup_tool_toolbox(GtkWidget *toolbox, SPDesktop *desktop) " <toolitem action='ToolDropper' />" " </toolbar>" "</ui>"; - Glib::RefPtr<Gtk::ActionGroup> mainActions = create_or_fetch_actions( desktop ); - GtkUIManager* mgr = gtk_ui_manager_new(); - GError* errVal = 0; - Inkscape::Preferences *prefs = Inkscape::Preferences::get(); - - gtk_ui_manager_insert_action_group( mgr, mainActions->gobj(), 0 ); - gtk_ui_manager_add_ui_from_string( mgr, descr, -1, &errVal ); - GtkWidget* toolBar = gtk_ui_manager_get_widget( mgr, "/ui/ToolToolbar" ); - if ( prefs->getBool("/toolbox/icononly", true) ) { - gtk_toolbar_set_style( GTK_TOOLBAR(toolBar), GTK_TOOLBAR_ICONS ); - } - Inkscape::IconSize toolboxSize = prefToSize("/toolbox/tools/small"); - gtk_toolbar_set_icon_size( GTK_TOOLBAR(toolBar), (GtkIconSize)toolboxSize ); - - gtk_toolbar_set_orientation(GTK_TOOLBAR(toolBar), GTK_ORIENTATION_VERTICAL); - gtk_toolbar_set_show_arrow(GTK_TOOLBAR(toolBar), TRUE); - - g_object_set_data(G_OBJECT(toolBar), "desktop", NULL); - - GtkWidget* child = gtk_bin_get_child(GTK_BIN(toolbox)); - if ( child ) { - gtk_container_remove( GTK_CONTAINER(toolbox), child ); - } - - gtk_container_add( GTK_CONTAINER(toolbox), toolBar ); -// Inkscape::IconSize toolboxSize = prefToSize("/toolbox/tools/small"); + setupToolboxCommon( toolbox, desktop, descr, + "/ui/ToolToolbar", + "/toolbox/tools/small"); } - static void update_tool_toolbox( SPDesktop *desktop, SPEventContext *eventcontext, GtkWidget */*toolbox*/ ) { @@ -1746,9 +1845,9 @@ setup_aux_toolbox(GtkWidget *toolbox, SPDesktop *desktop) } else { GtkWidget *sub_toolbox = 0; - if (aux_toolboxes[i].create_func == NULL) + if (aux_toolboxes[i].create_func == NULL) { sub_toolbox = sp_empty_toolbox_new(desktop); - else { + } else { sub_toolbox = aux_toolboxes[i].create_func(desktop); } @@ -1779,7 +1878,7 @@ setup_aux_toolbox(GtkWidget *toolbox, SPDesktop *desktop) gtk_toolbar_set_style( GTK_TOOLBAR(toolBar), GTK_TOOLBAR_ICONS ); } - Inkscape::IconSize toolboxSize = prefToSize("/toolbox/small"); + Inkscape::IconSize toolboxSize = ToolboxFactory::prefToSize("/toolbox/small"); gtk_toolbar_set_icon_size( GTK_TOOLBAR(toolBar), static_cast<GtkIconSize>(toolboxSize) ); gtk_table_attach( GTK_TABLE(holder), toolBar, 0, 1, 0, 1, (GtkAttachOptions)(GTK_EXPAND | GTK_FILL), (GtkAttachOptions)(GTK_EXPAND | GTK_FILL), 0, 0 ); @@ -1863,37 +1962,16 @@ setup_commands_toolbox(GtkWidget *toolbox, SPDesktop *desktop) " <separator />" " <toolitem action='DialogPreferences' />" " <toolitem action='DialogDocumentProperties' />" +#if ENABLE_TASK_SUPPORT + " <separator />" + " <toolitem action='TaskSetAction' />" +#endif // ENABLE_TASK_SUPPORT " </toolbar>" "</ui>"; - Glib::RefPtr<Gtk::ActionGroup> mainActions = create_or_fetch_actions( desktop ); - Inkscape::Preferences *prefs = Inkscape::Preferences::get(); - GtkUIManager* mgr = gtk_ui_manager_new(); - GError* errVal = 0; - - gtk_ui_manager_insert_action_group( mgr, mainActions->gobj(), 0 ); - gtk_ui_manager_add_ui_from_string( mgr, descr, -1, &errVal ); - - GtkWidget* toolBar = gtk_ui_manager_get_widget( mgr, "/ui/CommandsToolbar" ); - if ( prefs->getBool("/toolbox/icononly", true) ) { - gtk_toolbar_set_style( GTK_TOOLBAR(toolBar), GTK_TOOLBAR_ICONS ); - } - - Inkscape::IconSize toolboxSize = prefToSize("/toolbox/small"); - gtk_toolbar_set_icon_size( GTK_TOOLBAR(toolBar), (GtkIconSize)toolboxSize ); - - gtk_toolbar_set_orientation(GTK_TOOLBAR(toolBar), GTK_ORIENTATION_HORIZONTAL); - gtk_toolbar_set_show_arrow(GTK_TOOLBAR(toolBar), TRUE); - - - g_object_set_data(G_OBJECT(toolBar), "desktop", NULL); - - GtkWidget* child = gtk_bin_get_child(GTK_BIN(toolbox)); - if ( child ) { - gtk_container_remove( GTK_CONTAINER(toolbox), child ); - } - - gtk_container_add( GTK_CONTAINER(toolbox), toolBar ); + setupToolboxCommon( toolbox, desktop, descr, + "/ui/CommandsToolbar", + "/toolbox/small" ); } static void @@ -2017,7 +2095,6 @@ void toggle_snap_callback (GtkToggleAction *act, gpointer data) { //data points void setup_snap_toolbox(GtkWidget *toolbox, SPDesktop *desktop) { - Inkscape::Preferences *prefs = Inkscape::Preferences::get(); Glib::RefPtr<Gtk::ActionGroup> mainActions = create_or_fetch_actions(desktop); gchar const * descr = @@ -2047,7 +2124,7 @@ void setup_snap_toolbox(GtkWidget *toolbox, SPDesktop *desktop) " </toolbar>" "</ui>"; - Inkscape::IconSize secondarySize = prefToSize("/toolbox/secondary", 1); + Inkscape::IconSize secondarySize = ToolboxFactory::prefToSize("/toolbox/secondary", 1); { InkToggleAction* act = ink_toggle_action_new("ToggleSnapGlobal", @@ -2212,42 +2289,41 @@ void setup_snap_toolbox(GtkWidget *toolbox, SPDesktop *desktop) g_signal_connect_after( G_OBJECT(act), "toggled", G_CALLBACK(toggle_snap_callback), toolbox ); }*/ - GtkUIManager* mgr = gtk_ui_manager_new(); - GError* errVal = 0; - - gtk_ui_manager_insert_action_group( mgr, mainActions->gobj(), 0 ); - gtk_ui_manager_add_ui_from_string( mgr, descr, -1, &errVal ); - - GtkWidget* toolBar = gtk_ui_manager_get_widget( mgr, "/ui/SnapToolbar" ); - if ( prefs->getBool("/toolbox/icononly", true) ) { - gtk_toolbar_set_style( GTK_TOOLBAR(toolBar), GTK_TOOLBAR_ICONS ); - } - - Inkscape::IconSize toolboxSize = prefToSize("/toolbox/secondary"); - gtk_toolbar_set_icon_size( GTK_TOOLBAR(toolBar), static_cast<GtkIconSize>(toolboxSize) ); - - gtk_toolbar_set_orientation(GTK_TOOLBAR(toolBar), GTK_ORIENTATION_HORIZONTAL); - gtk_toolbar_set_show_arrow(GTK_TOOLBAR(toolBar), TRUE); - - g_object_set_data(G_OBJECT(toolBar), "desktop", NULL); + setupToolboxCommon( toolbox, desktop, descr, + "/ui/SnapToolbar", + "/toolbox/secondary" ); +} - GtkWidget* child = gtk_bin_get_child(GTK_BIN(toolbox)); - if ( child ) { - gtk_container_remove( GTK_CONTAINER(toolbox), child ); +Glib::ustring ToolboxFactory::getToolboxName(GtkWidget* toolbox) +{ + Glib::ustring name; + BarId id = static_cast<BarId>( GPOINTER_TO_INT(g_object_get_data(G_OBJECT(toolbox), BAR_ID_KEY)) ); + switch(id) { + case BAR_TOOL: + name = "ToolToolbar"; + break; + case BAR_AUX: + name = "AuxToolbar"; + break; + case BAR_COMMANDS: + name = "CommandsToolbar"; + break; + case BAR_SNAP: + name = "SnapToolbar"; + break; } - gtk_container_add( GTK_CONTAINER(toolbox), toolBar ); - + return name; } -void update_snap_toolbox(SPDesktop *desktop, SPEventContext */*eventcontext*/, GtkWidget *toolbox) +void ToolboxFactory::updateSnapToolbox(SPDesktop *desktop, SPEventContext */*eventcontext*/, GtkWidget *toolbox) { g_assert(desktop != NULL); g_assert(toolbox != NULL); SPNamedView *nv = sp_desktop_namedview(desktop); if (nv == NULL) { - g_warning("Namedview cannot be retrieved (in update_snap_toolbox)!"); + g_warning("Namedview cannot be retrieved (in updateSnapToolbox)!"); return; } @@ -2332,7 +2408,7 @@ void update_snap_toolbox(SPDesktop *desktop, SPEventContext */*eventcontext*/, G g_object_set_data(G_OBJECT(toolbox), "freeze", GINT_TO_POINTER(FALSE)); // unfreeze (see above) } -void show_aux_toolbox(GtkWidget *toolbox_toplevel) +void ToolboxFactory::showAuxToolbox(GtkWidget *toolbox_toplevel) { gtk_widget_show(toolbox_toplevel); GtkWidget *toolbox = gtk_bin_get_child(GTK_BIN(toolbox_toplevel)); @@ -2346,8 +2422,7 @@ void show_aux_toolbox(GtkWidget *toolbox_toplevel) gtk_widget_show_all(shown_toolbox); } -static GtkWidget * -sp_empty_toolbox_new(SPDesktop *desktop) +static GtkWidget *sp_empty_toolbox_new(SPDesktop *desktop) { GtkWidget *tbl = gtk_toolbar_new(); gtk_object_set_data(GTK_OBJECT(tbl), "dtw", desktop->canvas); @@ -2728,7 +2803,7 @@ sp_toolbox_add_label(GtkWidget *tbl, gchar const *title, bool wide) static void sp_star_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions, GObject* holder) { - Inkscape::IconSize secondarySize = prefToSize("/toolbox/secondary", 1); + Inkscape::IconSize secondarySize = ToolboxFactory::prefToSize("/toolbox/secondary", 1); { EgeOutputAction* act = ege_output_action_new( "StarStateAction", _("<b>New:</b>"), "", 0 ); @@ -3097,7 +3172,7 @@ sp_rect_toolbox_selection_changed(Inkscape::Selection *selection, GObject *tbl) static void sp_rect_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions, GObject* holder) { EgeAdjustmentAction* eact = 0; - Inkscape::IconSize secondarySize = prefToSize("/toolbox/secondary", 1); + Inkscape::IconSize secondarySize = ToolboxFactory::prefToSize("/toolbox/secondary", 1); { EgeOutputAction* act = ege_output_action_new( "RectStateAction", _("<b>New:</b>"), "", 0 ); @@ -3461,7 +3536,7 @@ static void box3d_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions, box3d_angle_x = eact; } - if (!persp3d_VP_is_finite(persp_impl, Proj::X)) { + if (!persp_impl || !persp3d_VP_is_finite(persp_impl, Proj::X)) { gtk_action_set_sensitive( GTK_ACTION(eact), TRUE ); } else { gtk_action_set_sensitive( GTK_ACTION(eact), FALSE ); @@ -3501,7 +3576,7 @@ static void box3d_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions, box3d_angle_y = eact; } - if (!persp3d_VP_is_finite(persp_impl, Proj::Y)) { + if (!persp_impl || !persp3d_VP_is_finite(persp_impl, Proj::Y)) { gtk_action_set_sensitive( GTK_ACTION(eact), TRUE ); } else { gtk_action_set_sensitive( GTK_ACTION(eact), FALSE ); @@ -3540,7 +3615,7 @@ static void box3d_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions, box3d_angle_z = eact; } - if (!persp3d_VP_is_finite(persp_impl, Proj::Z)) { + if (!persp_impl || !persp3d_VP_is_finite(persp_impl, Proj::Z)) { gtk_action_set_sensitive( GTK_ACTION(eact), TRUE ); } else { gtk_action_set_sensitive( GTK_ACTION(eact), FALSE ); @@ -3739,7 +3814,7 @@ sp_spiral_toolbox_selection_changed(Inkscape::Selection *selection, GObject *tbl static void sp_spiral_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions, GObject* holder) { EgeAdjustmentAction* eact = 0; - Inkscape::IconSize secondarySize = prefToSize("/toolbox/secondary", 1); + Inkscape::IconSize secondarySize = ToolboxFactory::prefToSize("/toolbox/secondary", 1); { EgeOutputAction* act = ege_output_action_new( "SpiralStateAction", _("<b>New:</b>"), "", 0 ); @@ -3846,7 +3921,7 @@ static void sp_add_freehand_mode_toggle(GtkActionGroup* mainActions, GObject* ho { Inkscape::Preferences *prefs = Inkscape::Preferences::get(); guint freehandMode = prefs->getInt(( tool_is_pencil ? "/tools/freehand/pencil/freehand-mode" : "/tools/freehand/pen/freehand-mode" ), 0); - Inkscape::IconSize secondarySize = prefToSize("/toolbox/secondary", 1); + Inkscape::IconSize secondarySize = ToolboxFactory::prefToSize("/toolbox/secondary", 1); { GtkListStore* model = gtk_list_store_new( 3, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING ); @@ -4140,7 +4215,7 @@ static void tweak_toggle_doo (GtkToggleAction *act, gpointer /*data*/) { static void sp_tweak_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions, GObject* holder) { - Inkscape::IconSize secondarySize = prefToSize("/toolbox/secondary", 1); + Inkscape::IconSize secondarySize = ToolboxFactory::prefToSize("/toolbox/secondary", 1); Inkscape::Preferences *prefs = Inkscape::Preferences::get(); { @@ -4454,7 +4529,7 @@ static void sp_spray_scale_value_changed( GtkAdjustment *adj, GObject */*tbl*/ ) static void sp_spray_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions, GObject* holder) { - Inkscape::IconSize secondarySize = prefToSize("/toolbox/secondary", 1); + Inkscape::IconSize secondarySize = ToolboxFactory::prefToSize("/toolbox/secondary", 1); Inkscape::Preferences *prefs = Inkscape::Preferences::get(); { @@ -4561,6 +4636,7 @@ static void sp_spray_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainAction 1, 100, 1.0, 10.0, labels, values, G_N_ELEMENTS(labels), sp_spray_population_value_changed, 1, 0 ); + ege_adjustment_action_set_appearance( eact, TOOLBAR_SLIDER_HINT ); gtk_action_group_add_action( mainActions, GTK_ACTION(eact) ); gtk_action_set_sensitive( GTK_ACTION(eact), TRUE ); g_object_set_data( holder, "spray_population", eact ); @@ -4583,12 +4659,14 @@ static void sp_spray_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainAction gdouble values[] = {10, 25, 35, 50, 60, 80, 100}; EgeAdjustmentAction *eact = create_adjustment_action( "SprayRotationAction", _("Rotation"), _("Rotation:"), + // xgettext:no-c-format _("Variation of the rotation of the sprayed objects. 0% for the same rotation than the original object."), "/tools/spray/rotation_variation", 0, GTK_WIDGET(desktop->canvas), NULL, holder, TRUE, "spray-rotation", 0, 100, 1.0, 10.0, labels, values, G_N_ELEMENTS(labels), sp_spray_rotation_value_changed, 1, 0 ); + ege_adjustment_action_set_appearance( eact, TOOLBAR_SLIDER_HINT ); gtk_action_group_add_action( mainActions, GTK_ACTION(eact) ); gtk_action_set_sensitive( GTK_ACTION(eact), TRUE ); g_object_set_data( holder, "spray_rotation", eact ); @@ -4599,12 +4677,14 @@ static void sp_spray_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainAction gdouble values[] = {10, 25, 35, 50, 60, 80, 100}; EgeAdjustmentAction *eact = create_adjustment_action( "SprayScaleAction", _("Scale"), _("Scale:"), + // xgettext:no-c-format _("Variation in the scale of the sprayed objects. 0% for the same scale than the original object."), "/tools/spray/scale_variation", 0, GTK_WIDGET(desktop->canvas), NULL, holder, TRUE, "spray-scale", 0, 100, 1.0, 10.0, labels, values, G_N_ELEMENTS(labels), sp_spray_scale_value_changed, 1, 0 ); + ege_adjustment_action_set_appearance( eact, TOOLBAR_SLIDER_HINT ); gtk_action_group_add_action( mainActions, GTK_ACTION(eact) ); gtk_action_set_sensitive( GTK_ACTION(eact), TRUE ); g_object_set_data( holder, "spray_scale", eact ); @@ -5396,7 +5476,7 @@ static void sp_arc_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions, Inkscape::Preferences *prefs = Inkscape::Preferences::get(); EgeAdjustmentAction* eact = 0; - Inkscape::IconSize secondarySize = prefToSize("/toolbox/secondary", 1); + Inkscape::IconSize secondarySize = ToolboxFactory::prefToSize("/toolbox/secondary", 1); { @@ -6660,10 +6740,10 @@ sp_text_toolbox_family_keypress (GtkWidget */*w*/, GdkEventKey *event, GObject * case GDK_Return: // unfreeze and update, which will defocus g_object_set_data( tbl, "freeze", GINT_TO_POINTER(FALSE) ); - sp_text_toolbox_family_changed (NULL, tbl); + sp_text_toolbox_family_changed (NULL, tbl); return TRUE; // I consumed the event break; - case GDK_Escape: + case GDK_Escape: // defocus gtk_widget_grab_focus (GTK_WIDGET(desktop->canvas)); return TRUE; // I consumed the event @@ -6939,10 +7019,10 @@ void sp_text_toolbox_family_popnotify(GtkComboBox *widget, } // update - sp_text_toolbox_family_changed (NULL, tbl); + sp_text_toolbox_family_changed (NULL, tbl); break; } - } + } } } @@ -6954,11 +7034,10 @@ void sp_text_toolbox_family_popnotify(GtkComboBox *widget, } } -GtkWidget* -sp_text_toolbox_new (SPDesktop *desktop) +GtkWidget *sp_text_toolbox_new (SPDesktop *desktop) { GtkToolbar *tbl = GTK_TOOLBAR(gtk_toolbar_new()); - GtkIconSize secondarySize = static_cast<GtkIconSize>(prefToSize("/toolbox/secondary", 1)); + GtkIconSize secondarySize = static_cast<GtkIconSize>(ToolboxFactory::prefToSize("/toolbox/secondary", 1)); gtk_object_set_data(GTK_OBJECT(tbl), "dtw", desktop->canvas); gtk_object_set_data(GTK_OBJECT(tbl), "desktop", desktop); @@ -6981,7 +7060,7 @@ sp_text_toolbox_new (SPDesktop *desktop) g_signal_connect (G_OBJECT (font_sel->gobj()), "key-press-event", G_CALLBACK(sp_text_toolbox_family_list_keypress), tbl); cbe_add_completion(font_sel->gobj(), G_OBJECT(tbl)); - + gtk_toolbar_append_widget( tbl, (GtkWidget*) font_sel->gobj(), "", ""); g_object_set_data (G_OBJECT (tbl), "family-entry-combo", font_sel); @@ -6994,7 +7073,7 @@ sp_text_toolbox_new (SPDesktop *desktop) g_signal_connect (G_OBJECT (entry), "activate", G_CALLBACK (sp_text_toolbox_family_changed), tbl); g_signal_connect (G_OBJECT (font_sel->gobj()), "changed", G_CALLBACK (sp_text_toolbox_family_changed), tbl); - g_signal_connect (G_OBJECT (font_sel->gobj()), "notify::popup-shown", + g_signal_connect (G_OBJECT (font_sel->gobj()), "notify::popup-shown", G_CALLBACK (sp_text_toolbox_family_popnotify), tbl); g_signal_connect (G_OBJECT (entry), "key-press-event", G_CALLBACK(sp_text_toolbox_family_keypress), tbl); g_signal_connect (G_OBJECT (entry), "focus-in-event", G_CALLBACK (sp_text_toolbox_entry_focus_in), tbl); @@ -7317,7 +7396,7 @@ static void connector_spacing_changed(GtkAdjustment *adj, GObject* tbl) if ( !repr->attribute("inkscape:connector-spacing") && ( adj->value == defaultConnSpacing )) { - // Don't need to update the repr if the attribute doesn't + // Don't need to update the repr if the attribute doesn't // exist and it is being set to the default value -- as will // happen at startup. return; @@ -7455,7 +7534,7 @@ static void sp_connector_toolbox_selection_changed(Inkscape::Selection *selectio static void sp_connector_toolbox_prep( SPDesktop *desktop, GtkActionGroup* mainActions, GObject* holder ) { Inkscape::Preferences *prefs = Inkscape::Preferences::get(); - Inkscape::IconSize secondarySize = prefToSize("/toolbox/secondary", 1); + Inkscape::IconSize secondarySize = ToolboxFactory::prefToSize("/toolbox/secondary", 1); // Editing mode toggle button { @@ -7567,8 +7646,7 @@ static void sp_connector_toolbox_prep( SPDesktop *desktop, GtkActionGroup* mainA gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(act), ( tbuttonstate ? TRUE : FALSE )); g_signal_connect_after( G_OBJECT(act), "toggled", G_CALLBACK(sp_directed_graph_layout_toggled), holder ); - sigc::connection *connection = new sigc::connection(sp_desktop_selection(desktop)->connectChanged(sigc::bind(sigc::ptr_fun(sp_connector_toolbox_selection_changed), (GObject *)holder)) - ); + sp_desktop_selection(desktop)->connectChanged(sigc::bind(sigc::ptr_fun(sp_connector_toolbox_selection_changed), (GObject *)holder)); } // Avoid overlaps toggle button diff --git a/src/widgets/toolbox.h b/src/widgets/toolbox.h index 4bc417e8f..2e4b2958a 100644 --- a/src/widgets/toolbox.h +++ b/src/widgets/toolbox.h @@ -7,6 +7,7 @@ * Authors: * Lauris Kaplinski <lauris@kaplinski.com> * Frank Felfe <innerspace@iname.com> + * Jon A. Cruz <jon@joncruz.org> * * Copyright (C) 1999-2002 Authors * Copyright (C) 2001-2002 Ximian, Inc. @@ -16,38 +17,45 @@ #include <gtk/gtkstyle.h> #include <gtk/gtktooltips.h> +#include <glibmm/ustring.h> #include "forward.h" #include "icon-size.h" -GtkWidget *sp_tool_toolbox_new (); -void sp_tool_toolbox_set_desktop(GtkWidget *toolbox, SPDesktop *desktop); +namespace Inkscape { +namespace UI { -GtkWidget *sp_aux_toolbox_new (); -void sp_aux_toolbox_set_desktop(GtkWidget *toolbox, SPDesktop *desktop); +class ToolboxFactory +{ +public: + static void setToolboxDesktop(GtkWidget *toolbox, SPDesktop *desktop); + static void setOrientation(GtkWidget* toolbox, GtkOrientation orientation); + static void showAuxToolbox(GtkWidget* toolbox); -GtkWidget *sp_commands_toolbox_new (); -void sp_commands_toolbox_set_desktop(GtkWidget *toolbox, SPDesktop *desktop); + static GtkWidget *createToolToolbox(); + static GtkWidget *createAuxToolbox(); + static GtkWidget *createCommandsToolbox(); + static GtkWidget *createSnapToolbox(); -GtkWidget *sp_snap_toolbox_new (); -void sp_snap_toolbox_set_desktop(GtkWidget *toolbox, SPDesktop *desktop); -void update_snap_toolbox(SPDesktop *desktop, SPEventContext *eventcontext, GtkWidget *toolbox); -void setup_snap_toolbox (GtkWidget *toolbox, SPDesktop *desktop); + static Glib::ustring getToolboxName(GtkWidget* toolbox); -void show_aux_toolbox(GtkWidget *toolbox); + static void updateSnapToolbox(SPDesktop *desktop, SPEventContext *eventcontext, GtkWidget *toolbox); -GtkWidget *sp_toolbox_button_normal_new_from_verb(GtkWidget *t, - Inkscape::IconSize size, - Inkscape::Verb * verb, - Inkscape::UI::View::View *view, - GtkTooltips *tt); + static Inkscape::IconSize prefToSize(Glib::ustring const &path, int base = 0 ); + +private: + ToolboxFactory(); +}; + +} // namespace UI +} // namespace Inkscape -void aux_toolbox_space(GtkWidget *tb, gint space); // utility + +// TODO remove this: void sp_toolbox_add_label(GtkWidget *tbl, gchar const *title, bool wide = true); -Inkscape::IconSize prefToSize(Glib::ustring const &path, int base = 0 ); #endif /* !SEEN_TOOLBOX_H */ |
