X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Fwidgets%2Fdesktop-widget.cpp;h=57e58cd5e4d4795f98c8eb8c9bd3017b7b7353aa;hb=b947b86feae33a7df233d6818a0b121611127cad;hp=1fdf1fceb632db1f942b659f03cb826e5d5fcb4b;hpb=6c3e745a94ef6b25a4ef9f018d350a7535aa45af;p=inkscape.git diff --git a/src/widgets/desktop-widget.cpp b/src/widgets/desktop-widget.cpp index 1fdf1fceb..57e58cd5e 100644 --- a/src/widgets/desktop-widget.cpp +++ b/src/widgets/desktop-widget.cpp @@ -1,5 +1,3 @@ -#define __SP_DESKTOP_WIDGET_C__ - /** \file * Desktop widget implementation */ @@ -10,6 +8,8 @@ * Ralf Stephan * John Bintz * Johan Engelen + * Jon A. Cruz + * Abhishek Sharma * * Copyright (C) 2007 Johan Engelen * Copyright (C) 2006 John Bintz @@ -27,44 +27,53 @@ #include #include -#include "macros.h" -#include "inkscape-private.h" -#include "desktop-handles.h" +#include "box3d-context.h" +#include "color-profile-fns.h" +#include "conn-avoid-ref.h" #include "desktop-events.h" -#include "document.h" +#include "desktop-handles.h" #include "desktop-widget.h" -#include "sp-namedview.h" -#include "interface.h" -#include "toolbox.h" -#include "preferences.h" -#include "file.h" #include "display/canvas-arena.h" #include "display/nr-arena.h" +#include "document.h" +#include "ege-color-prof-tracker.h" +#include "ege-select-one-action.h" #include +#include "file.h" #include "helper/units.h" -#include "widgets/button.h" -#include "widgets/ruler.h" -#include "widgets/widget-sizes.h" -#include "widgets/spw-utilities.h" -#include "widgets/spinbutton-events.h" -#include "widgets/layer-selector.h" +#include "helper/unit-tracker.h" +#include "inkscape-private.h" +#include "interface.h" +#include "macros.h" +#include "preferences.h" +#include "sp-image.h" +#include "sp-item.h" +#include "sp-namedview.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 "sp-item.h" -#include "dialogs/swatches.h" -#include "conn-avoid-ref.h" -#include "ege-select-one-action.h" -#include "ege-color-prof-tracker.h" -#include "color-profile-fns.h" -#include "box3d-context.h" -#include "sp-image.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::UnitTracker; +using Inkscape::UI::UXManager; +using Inkscape::UI::ToolboxFactory; + #ifdef WITH_INKBOARD #endif @@ -83,7 +92,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); @@ -95,7 +103,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); @@ -110,9 +117,34 @@ static void sp_dtw_zoom_200 (GtkMenuItem *item, gpointer data); static void sp_dtw_zoom_page (GtkMenuItem *item, gpointer data); static void sp_dtw_zoom_drawing (GtkMenuItem *item, gpointer data); static void sp_dtw_zoom_selection (GtkMenuItem *item, gpointer data); +static void sp_dtw_sticky_zoom_toggled (GtkMenuItem *item, gpointer data); SPViewWidgetClass *dtw_parent_class; +static GTimer *baseTimer = 0; +static bool timeReported = false; + +static void timeGoing(gchar const* id) +{ + if ( !baseTimer ) { + g_message("Starting time at point [%s]", id); + baseTimer = g_timer_new(); + } +} + +static void checkTime(gchar const* msg) +{ + if ( baseTimer && !timeReported ) { + timeReported = true; + g_timer_stop(baseTimer); + gulong msCount = 0; + gdouble secs = g_timer_elapsed( baseTimer, &msCount ); + g_message("Time ended at %2.3f with [%s]", secs, msg); + } +} + + + class CMSPrefWatcher { public: CMSPrefWatcher() : @@ -137,11 +169,11 @@ public: private: static void hook(EgeColorProfTracker *tracker, gint a, gint b, CMSPrefWatcher *watcher); - + class DisplayProfileWatcher : public Inkscape::Preferences::Observer { public: DisplayProfileWatcher(CMSPrefWatcher &pw) : Observer("/options/displayprofile"), _pw(pw) {} - virtual void notify(Inkscape::Preferences::Entry const &val) { + virtual void notify(Inkscape::Preferences::Entry const &/*val*/) { Inkscape::Preferences *prefs = Inkscape::Preferences::get(); _pw._setCmsSensitive(!prefs->getString("/options/displayprofile/uri").empty()); _pw._refreshAll(); @@ -149,9 +181,9 @@ private: private: CMSPrefWatcher &_pw; }; - + DisplayProfileWatcher _dpw; - + class SoftProofWatcher : public Inkscape::Preferences::Observer { public: SoftProofWatcher(CMSPrefWatcher &pw) : Observer("/options/softproof"), _pw(pw) {} @@ -161,15 +193,15 @@ private: private: CMSPrefWatcher &_pw; }; - + SoftProofWatcher _spw; - + void _refreshAll(); void _setCmsSensitive(bool value); std::list _widget_list; EgeColorProfTracker *_tracker; - + friend class DisplayProfileWatcher; friend class SoftproofWatcher; }; @@ -238,10 +270,11 @@ 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) { + timeGoing("SPDesktopWidget::getType"); GTypeInfo info = { sizeof(SPDesktopWidgetClass), 0, // base_init @@ -251,7 +284,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(0)); @@ -265,6 +298,7 @@ GType sp_desktop_widget_get_type(void) static void sp_desktop_widget_class_init (SPDesktopWidgetClass *klass) { + timeGoing("sp_desktop_widget_class_init"); dtw_parent_class = (SPViewWidgetClass*)gtk_type_class (SP_TYPE_VIEW_WIDGET); GtkObjectClass *object_class = (GtkObjectClass *) klass; @@ -279,17 +313,16 @@ 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 ) { + timeGoing("SPDesktopWidget::init"); GtkWidget *widget; GtkWidget *tbl; GtkWidget *canvas_tbl; - GtkWidget *hbox; GtkWidget *eventbox; GtkStyle *style; - + Inkscape::Preferences *prefs = Inkscape::Preferences::get(); new (&dtw->modified_connection) sigc::connection(); @@ -312,27 +345,31 @@ sp_desktop_widget_init (SPDesktopWidget *dtw) { using Inkscape::UI::Dialogs::SwatchesPanel; - SwatchesPanel* swatches = new SwatchesPanel("/embedded/swatches"); - swatches->setOrientation( Gtk::ANCHOR_SOUTH ); - dtw->panels = GTK_WIDGET(swatches->gobj()); - gtk_box_pack_end( GTK_BOX( dtw->vbox ), dtw->panels, FALSE, TRUE, 0 ); + dtw->panels = new SwatchesPanel("/embedded/swatches"); + dtw->panels->setOrientation( Gtk::ANCHOR_SOUTH ); + 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->aux_toolbox = sp_aux_toolbox_new (); + 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 = ToolboxFactory::createAuxToolbox(); gtk_box_pack_end (GTK_BOX (dtw->vbox), dtw->aux_toolbox, FALSE, TRUE, 0); - dtw->commands_toolbox = sp_commands_toolbox_new (); + 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 = 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); @@ -370,11 +407,12 @@ sp_desktop_widget_init (SPDesktopWidget *dtw) dtw->sticky_zoom = sp_button_new_from_data ( Inkscape::ICON_SIZE_DECORATION, SP_BUTTON_TYPE_TOGGLE, NULL, - "sticky_zoom", + INKSCAPE_ICON_ZOOM_ORIGINAL, _("Zoom drawing if window size changes"), dtw->tt); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (dtw->sticky_zoom), prefs->getBool("/options/stickyzoom/value")); gtk_box_pack_start (GTK_BOX (dtw->vscrollbar_box), dtw->sticky_zoom, FALSE, FALSE, 0); + g_signal_connect (G_OBJECT (dtw->sticky_zoom), "toggled", G_CALLBACK (sp_dtw_sticky_zoom_toggled), dtw); dtw->vadj = (GtkAdjustment *) gtk_adjustment_new (0.0, -4000.0, 4000.0, 10.0, 100.0, 4.0); dtw->vscrollbar = gtk_vscrollbar_new (GTK_ADJUSTMENT (dtw->vadj)); gtk_box_pack_start (GTK_BOX (dtw->vscrollbar_box), dtw->vscrollbar, TRUE, TRUE, 0); @@ -392,7 +430,7 @@ sp_desktop_widget_init (SPDesktopWidget *dtw) dtw->cms_adjust = sp_button_new_from_data( Inkscape::ICON_SIZE_DECORATION, SP_BUTTON_TYPE_TOGGLE, NULL, - "color_management", + INKSCAPE_ICON_COLOR_MANAGEMENT, tip, dtw->tt ); #if ENABLE_LCMS @@ -495,10 +533,10 @@ sp_desktop_widget_init (SPDesktopWidget *dtw) eventbox = gtk_event_box_new (); gtk_container_add (GTK_CONTAINER (eventbox), dtw->coord_status); gtk_tooltips_set_tip (dtw->tt, eventbox, _("Cursor coordinates"), NULL); - GtkWidget *label_x = gtk_label_new("X:"); + GtkWidget *label_x = gtk_label_new(_("X:")); gtk_misc_set_alignment (GTK_MISC(label_x), 0.0, 0.5); gtk_table_attach(GTK_TABLE(dtw->coord_status), label_x, 1,2, 0,1, GTK_FILL, GTK_FILL, 0, 0); - GtkWidget *label_y = gtk_label_new("Y:"); + GtkWidget *label_y = gtk_label_new(_("Y:")); gtk_misc_set_alignment (GTK_MISC(label_y), 0.0, 0.5); gtk_table_attach(GTK_TABLE(dtw->coord_status), label_y, 1,2, 1,2, GTK_FILL, GTK_FILL, 0, 0); dtw->coord_status_x = gtk_label_new(NULL); @@ -509,7 +547,7 @@ sp_desktop_widget_init (SPDesktopWidget *dtw) gtk_misc_set_alignment (GTK_MISC(dtw->coord_status_y), 1.0, 0.5); gtk_table_attach(GTK_TABLE(dtw->coord_status), dtw->coord_status_x, 2,3, 0,1, GTK_FILL, GTK_FILL, 0, 0); gtk_table_attach(GTK_TABLE(dtw->coord_status), dtw->coord_status_y, 2,3, 1,2, GTK_FILL, GTK_FILL, 0, 0); - gtk_table_attach(GTK_TABLE(dtw->coord_status), gtk_label_new("Z:"), 3,4, 0,2, GTK_FILL, GTK_FILL, 0, 0); + gtk_table_attach(GTK_TABLE(dtw->coord_status), gtk_label_new(_("Z:")), 3,4, 0,2, GTK_FILL, GTK_FILL, 0, 0); gtk_table_attach(GTK_TABLE(dtw->coord_status), dtw->zoom_status, 4,5, 0,2, GTK_FILL, GTK_FILL, 0, 0); sp_set_font_size_smaller (dtw->coord_status); gtk_box_pack_end (GTK_BOX (statusbar_tail), eventbox, FALSE, FALSE, 1); @@ -522,8 +560,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; @@ -549,6 +589,30 @@ sp_desktop_widget_init (SPDesktopWidget *dtw) gtk_box_pack_start (GTK_BOX (dtw->statusbar), dtw->select_status_eventbox, TRUE, TRUE, 0); gtk_widget_show_all (dtw->vbox); + + gtk_widget_grab_focus (GTK_WIDGET(dtw->canvas)); + + { + g_message("FIRE UP"); + + gtk_widget_add_events( eventbox, GDK_STRUCTURE_MASK ); + + gboolean fooMap(GtkWidget *widget, GdkEvent *event, gpointer userData); + g_signal_connect( G_OBJECT(eventbox), "map-event", G_CALLBACK(fooMap), dtw ); + + void fooReal(GtkWidget *widget, gpointer userData); + g_signal_connect( G_OBJECT(eventbox), "map-event", G_CALLBACK(fooReal), dtw ); + } +} + +gboolean fooMap(GtkWidget *widget, GdkEvent *event, gpointer userData) { + checkTime( "MAP"); + return FALSE; +} + +void fooReal(GtkWidget *widget, gpointer userData) +{ + checkTime("REALIZE"); } /** @@ -559,6 +623,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); @@ -605,12 +671,20 @@ SPDesktopWidget::updateTitle(gchar const* uri) if (this->desktop->number > 1) { if (this->desktop->getMode() == Inkscape::RENDERMODE_OUTLINE) { g_string_printf (name, _("%s: %d (outline) - Inkscape"), fname, this->desktop->number); + } else if (this->desktop->getMode() == Inkscape::RENDERMODE_NO_FILTERS) { + g_string_printf (name, _("%s: %d (no filters) - Inkscape"), fname, this->desktop->number); + } else if (this->desktop->getMode() == Inkscape::RENDERMODE_PRINT_COLORS_PREVIEW) { + g_string_printf (name, _("%s: %d (print colors preview) - Inkscape"), fname, this->desktop->number); } else { g_string_printf (name, _("%s: %d - Inkscape"), fname, this->desktop->number); } } else { if (this->desktop->getMode() == Inkscape::RENDERMODE_OUTLINE) { g_string_printf (name, _("%s (outline) - Inkscape"), fname); + } else if (this->desktop->getMode() == Inkscape::RENDERMODE_NO_FILTERS) { + g_string_printf (name, _("%s (no filters) - Inkscape"), fname); + } else if (this->desktop->getMode() == Inkscape::RENDERMODE_PRINT_COLORS_PREVIEW) { + g_string_printf (name, _("%s (print colors preview) - Inkscape"), fname); } else { g_string_printf (name, _("%s - Inkscape"), fname); } @@ -652,16 +726,14 @@ sp_desktop_widget_size_allocate (GtkWidget *widget, GtkAllocation *allocation) } if (SP_BUTTON_IS_DOWN(dtw->sticky_zoom)) { - /* Calculate zoom per pixel */ - double const zpsp = zoom / hypot (area.dimensions()[Geom::X], area.dimensions()[Geom::Y]); /* Find new visible area */ Geom::Rect newarea = dtw->desktop->get_display_area(); /* Calculate adjusted zoom */ - zoom = zpsp * hypot(newarea.dimensions()[Geom::X], newarea.dimensions()[Geom::Y]); - dtw->desktop->zoom_absolute(newarea.midpoint()[Geom::X], newarea.midpoint()[Geom::Y], zoom); - } else { - dtw->desktop->zoom_absolute(area.midpoint()[Geom::X], area.midpoint()[Geom::Y], zoom); + double oldshortside = MIN( area.width(), area.height()); + double newshortside = MIN(newarea.width(), newarea.height()); + zoom *= newshortside / oldshortside; } + dtw->desktop->zoom_absolute(area.midpoint()[Geom::X], area.midpoint()[Geom::Y], zoom); } else { if (GTK_WIDGET_CLASS (dtw_parent_class)->size_allocate) { @@ -686,30 +758,29 @@ sp_desktop_widget_realize (GtkWidget *widget) NRRect d; d.x0 = 0.0; d.y0 = 0.0; - d.x1 = sp_document_width (dtw->desktop->doc()); - d.y1 = sp_document_height (dtw->desktop->doc()); + d.x1 = (dtw->desktop->doc())->getWidth (); + d.y1 = (dtw->desktop->doc())->getHeight (); if ((fabs (d.x1 - d.x0) < 1.0) || (fabs (d.y1 - d.y0) < 1.0)) return; 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(); + + modified_connection = desktop->namedview->connectModified(sigc::mem_fun(*this, &SPDesktopWidget::namedviewModified)); + namedviewModified(desktop->namedview, SP_OBJECT_MODIFIED_FLAG); - dtw->updateTitle(SP_DOCUMENT_NAME (dtw->desktop->doc())); + updateTitle( desktop->doc()->getName() ); } /** @@ -776,6 +847,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 enabled in this window")); + } else { + dtw->setMessage (Inkscape::NORMAL_MESSAGE, _("Color-managed display is disabled in this window")); + } } #endif // ENABLE_LCMS } @@ -831,7 +907,7 @@ SPDesktopWidget::shutdown() GTK_BUTTONS_NONE, _("Save changes to document \"%s\" before closing?\n\n" "If you close without saving, your changes will be discarded."), - SP_DOCUMENT_NAME(doc)); + doc->getName()); // fix for bug 1767940: GTK_WIDGET_UNSET_FLAGS(GTK_WIDGET(GTK_MESSAGE_DIALOG(dialog)->label), GTK_CAN_FOCUS); @@ -853,11 +929,12 @@ SPDesktopWidget::shutdown() { Gtk::Window *window = (Gtk::Window*)gtk_object_get_data (GTK_OBJECT(this), "window"); - sp_document_ref(doc); + doc->doRef(); + sp_namedview_document_from_window(desktop); if (sp_file_save_document(*window, doc)) { - sp_document_unref(doc); + doc->doUnref(); } else { // save dialog cancelled or save failed - sp_document_unref(doc); + doc->doUnref(); return TRUE; } @@ -872,7 +949,7 @@ SPDesktopWidget::shutdown() } /* Code to check data loss */ bool allow_data_loss = FALSE; - while (sp_document_repr_root(doc)->attribute("inkscape:dataloss") != NULL && allow_data_loss == FALSE) { + while (doc->getReprRoot()->attribute("inkscape:dataloss") != NULL && allow_data_loss == FALSE) { GtkWidget *dialog; /** \todo @@ -885,9 +962,9 @@ SPDesktopWidget::shutdown() GTK_MESSAGE_WARNING, GTK_BUTTONS_NONE, _("The file \"%s\" was saved with a format (%s) that may cause data loss!\n\n" - "Do you want to save this file as an Inkscape SVG?"), - SP_DOCUMENT_NAME(doc), - Inkscape::Extension::db.get(sp_document_repr_root(doc)->attribute("inkscape:output_extension"))->get_name()); + "Do you want to save this file as Inkscape SVG?"), + doc->getName() ? doc->getName() : "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); @@ -910,14 +987,14 @@ SPDesktopWidget::shutdown() switch (response) { case GTK_RESPONSE_YES: { - sp_document_ref(doc); + doc->doRef(); Gtk::Window *window = (Gtk::Window*)gtk_object_get_data (GTK_OBJECT(this), "window"); - if (sp_file_save_dialog(*window, doc)) { - sp_document_unref(doc); + if (sp_file_save_dialog(*window, doc, Inkscape::Extension::FILE_SAVE_METHOD_INKSCAPE_SVG)) { + doc->doUnref(); } else { // save dialog cancelled or save failed - sp_document_unref(doc); + doc->doUnref(); return TRUE; } @@ -1065,9 +1142,10 @@ SPDesktopWidget::setWindowSize (gint w, gint h) void SPDesktopWidget::setWindowTransient (void *p, int transient_policy) { - GtkWindow *w =GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(this))); - if (w) + Gtk::Window *window = (Gtk::Window*)gtk_object_get_data (GTK_OBJECT(this), "window"); + if (window) { + GtkWindow *w = (GtkWindow *) window->gobj(); gtk_window_set_transient_for (GTK_WINDOW(p), w); /* @@ -1078,7 +1156,6 @@ SPDesktopWidget::setWindowTransient (void *p, int transient_policy) * (so that its transients also could raise) */ if (transient_policy == 2) - // without this, a transient window not always emerges on top gtk_window_present (w); } @@ -1184,25 +1261,27 @@ 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 if (!prefs->getBool(pref_root + "menu/state", true)) { gtk_widget_hide_all (dtw->menubar); } else { gtk_widget_show_all (dtw->menubar); } +#endif if (!prefs->getBool(pref_root + "commands/state", true)) { gtk_widget_hide_all (dtw->commands_toolbox); @@ -1210,12 +1289,18 @@ sp_desktop_widget_layout (SPDesktopWidget *dtw) gtk_widget_show_all (dtw->commands_toolbox); } + if (!prefs->getBool(pref_root + "snaptoolbox/state", true)) { + 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)) { @@ -1231,9 +1316,9 @@ sp_desktop_widget_layout (SPDesktopWidget *dtw) } if (!prefs->getBool(pref_root + "panels/state", true)) { - gtk_widget_hide_all( dtw->panels ); + gtk_widget_hide_all( GTK_WIDGET(dtw->panels->gobj()) ); } else { - gtk_widget_show_all( dtw->panels ); + gtk_widget_show_all( GTK_WIDGET(dtw->panels->gobj()) ); } if (!prefs->getBool(pref_root + "scrollbars/state", true)) { @@ -1268,11 +1353,19 @@ SPDesktopWidget::setToolboxFocusTo (const gchar* label) void SPDesktopWidget::setToolboxAdjustmentValue (gchar const *id, double value) { + GtkAdjustment *a = NULL; gpointer hb = sp_search_by_data_recursive (aux_toolbox, (gpointer) id); - if (hb && GTK_IS_WIDGET(hb) && GTK_IS_SPIN_BUTTON(hb)) { - GtkAdjustment *a = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON(hb)); - gtk_adjustment_set_value (a, value); + if (hb && GTK_IS_WIDGET(hb)) { + if (GTK_IS_SPIN_BUTTON(hb)) + a = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON(hb)); + else if (GTK_IS_RANGE(hb)) + a = gtk_range_get_adjustment (GTK_RANGE(hb)); } + + if (a) + gtk_adjustment_set_value (a, value); + else + g_warning ("Could not find GtkAdjustment for %s\n", id); } void @@ -1305,10 +1398,57 @@ SPDesktopWidget::isToolboxButtonActive (const gchar* id) return isActive; } -SPViewWidget * -sp_desktop_widget_new (SPNamedView *namedview) +void SPDesktopWidget::setToolboxPosition(Glib::ustring const& id, GtkPositionType pos) { - SPDesktopWidget *dtw = (SPDesktopWidget*)gtk_type_new (SP_TYPE_DESKTOP_WIDGET); + // 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); + + return SP_VIEW_WIDGET(dtw); +} + +SPDesktopWidget* SPDesktopWidget::createInstance(SPNamedView *namedview) +{ + SPDesktopWidget *dtw = (SPDesktopWidget*)g_object_new(SP_TYPE_DESKTOP_WIDGET, NULL); dtw->dt2r = 1.0 / namedview->doc_units->unittobase; @@ -1316,8 +1456,7 @@ sp_desktop_widget_new (SPNamedView *namedview) dtw->desktop = new SPDesktop(); dtw->stub = new SPDesktopWidget::WidgetStub (dtw); - dtw->desktop->registerEditWidget (dtw->stub); - dtw->desktop->init (namedview, dtw->canvas); + dtw->desktop->init (namedview, dtw->canvas, dtw->stub); inkscape_add_desktop (dtw->desktop); // Add the shape geometry to libavoid for autorouting connectors. @@ -1332,21 +1471,30 @@ 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); dtw->menubar = sp_ui_main_menubar (dtw->desktop); +#ifndef GDK_WINDOWING_QUARTZ gtk_widget_show_all (dtw->menubar); gtk_box_pack_start (GTK_BOX (dtw->vbox), dtw->menubar, FALSE, FALSE, 0); +#endif + + dtw->layoutWidgets(); + + std::vector 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); - sp_desktop_widget_layout (dtw); + dtw->panels->setDesktop( dtw->desktop ); - 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); + UXManager::getInstance()->addTrack(dtw); + UXManager::getInstance()->connectToDesktop( toolboxes, dtw->desktop ); - return SP_VIEW_WIDGET (dtw); + return dtw; } void @@ -1401,21 +1549,56 @@ 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? - - sp_ruler_set_metric (GTK_RULER (dtw->vruler), nv->getDefaultMetric()); - sp_ruler_set_metric (GTK_RULER (dtw->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); - sp_desktop_widget_update_rulers (dtw); + if (flags & SP_OBJECT_MODIFIED_FLAG) { + 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 (this->vruler), nv->getDefaultMetric()); + sp_ruler_set_metric(GTK_RULER (this->hruler), nv->getDefaultMetric()); + + /* This loops through all the grandchildren of aux toolbox, + * and for each that it finds, it performs an sp_search_by_data_recursive(), + * looking for widgets that hold some "tracker" data (this is used by + * all toolboxes to refer to the unit selector). The default document units + * is then selected within these unit selectors. + * + * Of course it would be nice to be able to refer to the toolbox and the + * unit selector directly by name, but I don't yet see a way to do that. + * + * This should solve: https://bugs.launchpad.net/inkscape/+bug/362995 + */ + if (GTK_IS_CONTAINER(aux_toolbox)) { + GList *ch = gtk_container_get_children (GTK_CONTAINER(aux_toolbox)); + for (GList *i = ch; i != NULL; i = i->next) { + if (GTK_IS_CONTAINER(i->data)) { + GList *grch = gtk_container_get_children (GTK_CONTAINER(i->data)); + for (GList *j = grch; j != NULL; j = j->next) { + if (!GTK_IS_WIDGET(j->data)) // wasn't a widget + continue; + + gpointer t = sp_search_by_data_recursive(GTK_WIDGET(j->data), (gpointer) "tracker"); + if (t == NULL) // didn't find any tracker data + continue; + + UnitTracker *tracker = reinterpret_cast( t ); + if (tracker == NULL) // it's null when inkscape is first opened + continue; + + tracker->setActiveUnit( nv->doc_units ); + } // grandchildren + } // if child is a container + } // children + } // if aux_toolbox is a container + + 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(this); + ToolboxFactory::updateSnapToolbox(this->desktop, 0, this->snap_toolbox); } } @@ -1441,7 +1624,7 @@ bool SPDesktopWidget::onFocusInEvent(GdkEventFocus*) { Inkscape::Preferences *prefs = Inkscape::Preferences::get(); if (prefs->getBool("/options/bitmapautoreload/value", true)) { - GSList const *imageList = sp_document_get_resource_list(desktop->doc(), "image"); + GSList const *imageList = (desktop->doc())->getResourceList("image"); for (GSList const *p = imageList; p; p = p->next) { SPImage* image = SP_IMAGE(p->data); sp_image_refresh_if_outdated( image ); @@ -1598,6 +1781,13 @@ sp_dtw_zoom_selection (GtkMenuItem */*item*/, gpointer data) static_cast(data)->zoom_selection(); } +static void +sp_dtw_sticky_zoom_toggled (GtkMenuItem *, gpointer data) +{ + SPDesktopWidget *dtw = SP_DESKTOP_WIDGET(data); + Inkscape::Preferences *prefs = Inkscape::Preferences::get(); + prefs->setBool("/options/stickyzoom/value", SP_BUTTON_IS_DOWN(dtw->sticky_zoom)); +} void @@ -1696,11 +1886,11 @@ sp_desktop_widget_update_scrollbars (SPDesktopWidget *dtw, double scale) /* The desktop region we always show unconditionally */ SPDocument *doc = dtw->desktop->doc(); - Geom::Rect darea ( Geom::Point(-sp_document_width(doc), -sp_document_height(doc)), - Geom::Point(2 * sp_document_width(doc), 2 * sp_document_height(doc)) ); + Geom::Rect darea ( Geom::Point(-doc->getWidth(), -doc->getHeight()), + Geom::Point(2 * doc->getWidth(), 2 * doc->getHeight()) ); SPObject* root = doc->root; SPItem* item = SP_ITEM(root); - Geom::OptRect deskarea = Geom::unify(darea, sp_item_bbox_desktop(item)); + Geom::OptRect deskarea = Geom::unify(darea, item->getBboxDesktop()); /* Canvas region we always show unconditionally */ Geom::Rect carea( Geom::Point(deskarea->min()[Geom::X] * scale - 64, deskarea->max()[Geom::Y] * -scale - 64),