From 0d1d59a3dfe51740e7601dba044c9ed979e4c9f7 Mon Sep 17 00:00:00 2001 From: John Smith Date: Thu, 9 Aug 2012 16:23:35 +0900 Subject: Fix for 819671 : No visual indication for grid and snap being on/off (bzr r11600) --- src/desktop.cpp | 6 ++++ src/desktop.h | 1 + src/interface.cpp | 71 ++++++++++++++++++++++++++++++++----- src/menus-skeleton.h | 8 ++--- src/sp-namedview.cpp | 11 ++++++ src/sp-namedview.h | 1 + src/ui/view/edit-widget-interface.h | 3 ++ src/widgets/desktop-widget.cpp | 6 ++++ src/widgets/desktop-widget.h | 3 ++ 9 files changed, 97 insertions(+), 13 deletions(-) (limited to 'src') diff --git a/src/desktop.cpp b/src/desktop.cpp index ce1f4cda4..ca981a458 100644 --- a/src/desktop.cpp +++ b/src/desktop.cpp @@ -1430,6 +1430,11 @@ void SPDesktop::toggleColorProfAdjust() _widget->toggleColorProfAdjust(); } +bool SPDesktop::colorProfAdjustEnabled() +{ + return _widget->colorProfAdjustEnabled(); +} + void SPDesktop::toggleGrids() { if (namedview->grids) { @@ -1460,6 +1465,7 @@ void SPDesktop::toggleSnapGlobal() namedview->setSnapGlobal(!v); } + //---------------------------------------------------------------------- // Callback implementations. The virtual ones are connected by the view. diff --git a/src/desktop.h b/src/desktop.h index 7bc4ba463..919cd905e 100644 --- a/src/desktop.h +++ b/src/desktop.h @@ -358,6 +358,7 @@ public: bool isWaitingCursor() const { return waiting_cursor; }; void toggleColorProfAdjust(); + bool colorProfAdjustEnabled(); void toggleGrids(); void toggleSnapGlobal(); diff --git a/src/interface.cpp b/src/interface.cpp index 1d09f2b72..ac624f0e1 100644 --- a/src/interface.cpp +++ b/src/interface.cpp @@ -534,16 +534,34 @@ checkitem_toggled(GtkCheckMenuItem *menuitem, gpointer user_data) { gchar const *pref = (gchar const *) user_data; Inkscape::UI::View::View *view = (Inkscape::UI::View::View *) g_object_get_data(G_OBJECT(menuitem), "view"); + SPAction *action = (SPAction *) g_object_get_data(G_OBJECT(menuitem), "action"); + if (action) { + + sp_ui_menu_activate(menuitem, action); + + } else if (pref) { + // The Show/Hide menu items without actions + Glib::ustring pref_path = getLayoutPrefPath( view ); + pref_path += pref; + pref_path += "/state"; + + Inkscape::Preferences *prefs = Inkscape::Preferences::get(); + gboolean checked = gtk_check_menu_item_get_active(menuitem); + prefs->setBool(pref_path, checked); + + reinterpret_cast(view)->layoutWidget(); + } +} + +static bool getViewStateFromPref(Inkscape::UI::View::View *view, gchar const *pref) +{ Glib::ustring pref_path = getLayoutPrefPath( view ); pref_path += pref; pref_path += "/state"; Inkscape::Preferences *prefs = Inkscape::Preferences::get(); - gboolean checked = gtk_check_menu_item_get_active(menuitem); - prefs->setBool(pref_path, checked); - - reinterpret_cast(view)->layoutWidget(); + return prefs->getBool(pref_path, true); } #if GTK_CHECK_VERSION(3,0,0) @@ -556,13 +574,34 @@ static gboolean checkitem_update(GtkWidget *widget, GdkEventExpose * /*event*/, gchar const *pref = (gchar const *) user_data; Inkscape::UI::View::View *view = (Inkscape::UI::View::View *) g_object_get_data(G_OBJECT(menuitem), "view"); + SPAction *action = (SPAction *) g_object_get_data(G_OBJECT(menuitem), "action"); + SPDesktop *dt = static_cast(view); - Glib::ustring pref_path = getLayoutPrefPath( view ); - pref_path += pref; - pref_path += "/state"; + bool ison = false; + if (action) { - Inkscape::Preferences *prefs = Inkscape::Preferences::get(); - bool ison = prefs->getBool(pref_path, true); + if (!strcmp(action->id, "ToggleGrid")) { + ison = dt->gridsEnabled(); + } + if (!strcmp(action->id, "ToggleGuides")) { + ison = dt->namedview->getGuides(); + } + if (!strcmp(action->id, "ToggleSnapGlobal")) { + ison = dt->namedview->getSnapGlobal(); + } + if (!strcmp(action->id, "ViewCmsToggle")) { + ison = dt->colorProfAdjustEnabled(); + } + if (!strcmp(action->id, "ToggleRulers")) { + ison = getViewStateFromPref(view, pref); + } + if (!strcmp(action->id, "ToggleScrollbars")) { + ison = getViewStateFromPref(view, pref); + } + } else if (pref) { + // The Show/Hide menu items without actions + ison = getViewStateFromPref(view, pref); + } g_signal_handlers_block_by_func(G_OBJECT(menuitem), (gpointer)(GCallback)checkitem_toggled, user_data); gtk_check_menu_item_set_active(menuitem, ison); @@ -571,6 +610,7 @@ static gboolean checkitem_update(GtkWidget *widget, GdkEventExpose * /*event*/, return FALSE; } + static void taskToggled(GtkCheckMenuItem *menuitem, gpointer userData) { if ( gtk_check_menu_item_get_active(menuitem) ) { @@ -647,6 +687,7 @@ sp_ui_menu_append_check_item_from_verb(GtkMenu *menu, Inkscape::UI::View::View * SPAction *action = (verb) ? verb->get_action(view) : 0; GtkWidget *item = gtk_check_menu_item_new(); + if (verb && shortcut!=GDK_KEY_VoidSymbol) { gchar* c = sp_shortcut_get_label(shortcut); @@ -688,6 +729,7 @@ sp_ui_menu_append_check_item_from_verb(GtkMenu *menu, Inkscape::UI::View::View * gtk_menu_shell_append(GTK_MENU_SHELL(menu), item); g_object_set_data(G_OBJECT(item), "view", (gpointer) view); + g_object_set_data(G_OBJECT(item), "action", (gpointer) action); g_signal_connect( G_OBJECT(item), "toggled", (GCallback) callback_toggle, (void *) pref); @@ -697,8 +739,11 @@ sp_ui_menu_append_check_item_from_verb(GtkMenu *menu, Inkscape::UI::View::View * g_signal_connect( G_OBJECT(item), "expose_event", (GCallback) callback_update, (void *) pref); #endif + (*callback_update)(item, NULL, (void *)pref); + g_signal_connect( G_OBJECT(item), "select", G_CALLBACK(sp_ui_menu_select), (gpointer) (action ? action->tip : tip)); g_signal_connect( G_OBJECT(item), "deselect", G_CALLBACK(sp_ui_menu_deselect), NULL); + } static void @@ -912,6 +957,14 @@ void sp_ui_build_dyn_menus(Inkscape::XML::Node *menus, GtkWidget *menu, Inkscape g_signal_connect( G_OBJECT(item), "expose_event", (GCallback) update_view_menu, (void *) action); #endif } + } else if (menu_pntr->attribute("check") != NULL) { + SPAction *action = NULL; + if (verb->get_code() != SP_VERB_NONE) { + action = verb->get_action(view); + } + sp_ui_menu_append_check_item_from_verb(GTK_MENU(menu), view, action->name, action->tip, NULL, + checkitem_toggled, checkitem_update, verb); + } else { sp_ui_menu_append_item_from_verb(GTK_MENU(menu), verb, view); group = NULL; diff --git a/src/menus-skeleton.h b/src/menus-skeleton.h index 21e25c6dc..7ea720419 100644 --- a/src/menus-skeleton.h +++ b/src/menus-skeleton.h @@ -129,10 +129,10 @@ static char const menus_skeleton[] = //" \n" " \n" " \n" -" \n" -" \n" -" \n" -" \n" +" \n" +" \n" +" \n" +" \n" " \n" " \n" " \n" diff --git a/src/sp-namedview.cpp b/src/sp-namedview.cpp index d9c68f7fb..75c2f8343 100644 --- a/src/sp-namedview.cpp +++ b/src/sp-namedview.cpp @@ -1073,6 +1073,17 @@ void SPNamedView::setGuides(bool v) sp_repr_set_boolean(this->getRepr(), "inkscape:guide-bbox", v); } +bool SPNamedView::getGuides() +{ + g_assert(this->getRepr() != NULL); + unsigned int v; + unsigned int set = sp_repr_get_boolean(this->getRepr(), "showguides", &v); + if (!set) { // hide guides if not specified, for backwards compatibility + v = FALSE; + } + + return v; +} /** * Gets page fitting margin information from the namedview node in the XML. * \param nv_repr reference to this document's namedview diff --git a/src/sp-namedview.h b/src/sp-namedview.h index 69cc9c2b5..e83ead69e 100644 --- a/src/sp-namedview.h +++ b/src/sp-namedview.h @@ -89,6 +89,7 @@ struct SPNamedView : public SPObjectGroup { bool getSnapGlobal() const; void setSnapGlobal(bool v); void setGuides(bool v); + bool getGuides(); private: double getMarginLength(gchar const * const key,SPUnit const * const margin_units,SPUnit const * const return_units,double const width,double const height,bool const use_width); diff --git a/src/ui/view/edit-widget-interface.h b/src/ui/view/edit-widget-interface.h index 2426fa5b1..412c7ff8c 100644 --- a/src/ui/view/edit-widget-interface.h +++ b/src/ui/view/edit-widget-interface.h @@ -119,6 +119,9 @@ struct EditWidgetInterface /// Toggle CMS on/off and set preference value accordingly virtual void toggleColorProfAdjust() = 0; + /// Is CMS on/off + virtual bool colorProfAdjustEnabled() = 0; + /// Temporarily block signals and update zoom display virtual void updateZoom() = 0; diff --git a/src/widgets/desktop-widget.cpp b/src/widgets/desktop-widget.cpp index 50c87a9a8..81361f0f9 100644 --- a/src/widgets/desktop-widget.cpp +++ b/src/widgets/desktop-widget.cpp @@ -1924,6 +1924,12 @@ sp_desktop_widget_toggle_scrollbars (SPDesktopWidget *dtw) } } +bool sp_desktop_widget_color_prof_adj_enabled( SPDesktopWidget *dtw ) +{ + return gtk_widget_get_sensitive( dtw->cms_adjust ) && + SP_BUTTON_IS_DOWN(dtw->cms_adjust) ; +} + void sp_desktop_widget_toggle_color_prof_adj( SPDesktopWidget *dtw ) { diff --git a/src/widgets/desktop-widget.h b/src/widgets/desktop-widget.h index 4fd26d11d..73194304f 100644 --- a/src/widgets/desktop-widget.h +++ b/src/widgets/desktop-widget.h @@ -49,6 +49,7 @@ void sp_desktop_widget_toggle_rulers (SPDesktopWidget *dtw); void sp_desktop_widget_toggle_scrollbars (SPDesktopWidget *dtw); void sp_desktop_widget_update_scrollbars (SPDesktopWidget *dtw, double scale); void sp_desktop_widget_toggle_color_prof_adj( SPDesktopWidget *dtw ); +bool sp_desktop_widget_color_prof_adj_enabled( SPDesktopWidget *dtw ); void sp_dtw_desktop_activate (SPDesktopWidget *dtw); void sp_dtw_desktop_deactivate (SPDesktopWidget *dtw); @@ -179,6 +180,8 @@ struct SPDesktopWidget { { sp_desktop_widget_toggle_scrollbars (_dtw); } virtual void toggleColorProfAdjust() { sp_desktop_widget_toggle_color_prof_adj(_dtw); } + virtual bool colorProfAdjustEnabled() + { return sp_desktop_widget_color_prof_adj_enabled(_dtw); } virtual void updateZoom() { sp_desktop_widget_update_zoom (_dtw); } virtual void letZoomGrabFocus() -- cgit v1.2.3