X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Fui%2Fcontext-menu.cpp;h=c544d1999491ad4b599803618baca6d241e9d11a;hb=ec12cb48c1da4c3029b9e8c2eea263499d319599;hp=442eb5ef63593f873715fde04c48438ccd8eea56;hpb=c13deb2864f592ee41c14855ec09dca84e13025f;p=inkscape.git diff --git a/src/ui/context-menu.cpp b/src/ui/context-menu.cpp index 442eb5ef6..c544d1999 100644 --- a/src/ui/context-menu.cpp +++ b/src/ui/context-menu.cpp @@ -1,10 +1,10 @@ -#define __CONTEXT_MENU_C__ - /* * Unser-interface related object extension * * Authors: * Lauris Kaplinski + * Jon A. Cruz + * Abhishek Sharma * * This code is in public domain */ @@ -18,8 +18,11 @@ #include "desktop.h" #include "document.h" #include "message-stack.h" +#include "preferences.h" #include "ui/dialog/dialog-manager.h" +using Inkscape::DocumentUndo; + static void sp_object_type_menu(GType type, SPObject *object, SPDesktop *desktop, GtkMenu *menu); /* Append object-specific part to context menu */ @@ -45,15 +48,20 @@ sp_object_menu(SPObject *object, SPDesktop *desktop, GtkMenu *menu) #include "sp-anchor.h" #include "sp-image.h" +#include "sp-text.h" #include "document.h" #include "desktop-handles.h" #include "selection.h" - +#include "selection-chemistry.h" #include "dialogs/item-properties.h" #include "dialogs/object-attributes.h" +#include "dialogs/text-edit.h" +#include "dialogs/spellcheck.h" #include "sp-path.h" +#include "sp-clippath.h" +#include "sp-mask.h" static void sp_item_menu(SPObject *object, SPDesktop *desktop, GtkMenu *menu); @@ -61,6 +69,7 @@ static void sp_group_menu(SPObject *object, SPDesktop *desktop, GtkMenu *menu); static void sp_anchor_menu(SPObject *object, SPDesktop *desktop, GtkMenu *menu); static void sp_image_menu(SPObject *object, SPDesktop *desktop, GtkMenu *menu); static void sp_shape_menu(SPObject *object, SPDesktop *desktop, GtkMenu *menu); +static void sp_text_menu(SPObject *object, SPDesktop *desktop, GtkMenu *menu); static void sp_object_type_menu(GType type, SPObject *object, SPDesktop *desktop, GtkMenu *menu) @@ -74,6 +83,7 @@ sp_object_type_menu(GType type, SPObject *object, SPDesktop *desktop, GtkMenu *m g_hash_table_insert(t2m, GUINT_TO_POINTER(SP_TYPE_ANCHOR), (void*)sp_anchor_menu); g_hash_table_insert(t2m, GUINT_TO_POINTER(SP_TYPE_IMAGE), (void*)sp_image_menu); g_hash_table_insert(t2m, GUINT_TO_POINTER(SP_TYPE_SHAPE), (void*)sp_shape_menu); + g_hash_table_insert(t2m, GUINT_TO_POINTER(SP_TYPE_TEXT), (void*)sp_text_menu); } handler = (void (*)(SPObject*, SPDesktop*, GtkMenu*))g_hash_table_lookup(t2m, GUINT_TO_POINTER(type)); if (handler) handler(object, desktop, menu); @@ -84,7 +94,10 @@ sp_object_type_menu(GType type, SPObject *object, SPDesktop *desktop, GtkMenu *m static void sp_item_properties(GtkMenuItem *menuitem, SPItem *item); static void sp_item_select_this(GtkMenuItem *menuitem, SPItem *item); static void sp_item_create_link(GtkMenuItem *menuitem, SPItem *item); - +static void sp_set_mask(GtkMenuItem *menuitem, SPItem *item); +static void sp_release_mask(GtkMenuItem *menuitem, SPItem *item); +static void sp_set_clip(GtkMenuItem *menuitem, SPItem *item); +static void sp_release_clip(GtkMenuItem *menuitem, SPItem *item); /* Generate context menu item section */ static void @@ -96,7 +109,7 @@ sp_item_menu(SPObject *object, SPDesktop *desktop, GtkMenu *m) item = (SPItem *) object; /* Item dialog */ - w = gtk_menu_item_new_with_mnemonic(_("Object _Properties")); + w = gtk_menu_item_new_with_mnemonic(_("_Object Properties...")); gtk_object_set_data(GTK_OBJECT(w), "desktop", desktop); gtk_signal_connect(GTK_OBJECT(w), "activate", GTK_SIGNAL_FUNC(sp_item_properties), item); gtk_widget_show(w); @@ -122,6 +135,51 @@ sp_item_menu(SPObject *object, SPDesktop *desktop, GtkMenu *m) gtk_widget_set_sensitive(w, !SP_IS_ANCHOR(item)); gtk_widget_show(w); gtk_menu_append(GTK_MENU(m), w); + /* Set mask */ + w = gtk_menu_item_new_with_mnemonic(_("Set Mask")); + gtk_object_set_data(GTK_OBJECT(w), "desktop", desktop); + gtk_signal_connect(GTK_OBJECT(w), "activate", GTK_SIGNAL_FUNC(sp_set_mask), item); + if ((item && item->mask_ref && item->mask_ref->getObject()) || (item->clip_ref && item->clip_ref->getObject())) { + gtk_widget_set_sensitive(w, FALSE); + } else { + gtk_widget_set_sensitive(w, TRUE); + } + gtk_widget_show(w); + gtk_menu_append(GTK_MENU(m), w); + /* Release mask */ + w = gtk_menu_item_new_with_mnemonic(_("Release Mask")); + gtk_object_set_data(GTK_OBJECT(w), "desktop", desktop); + gtk_signal_connect(GTK_OBJECT(w), "activate", GTK_SIGNAL_FUNC(sp_release_mask), item); + if (item && item->mask_ref && item->mask_ref->getObject()) { + gtk_widget_set_sensitive(w, TRUE); + } else { + gtk_widget_set_sensitive(w, FALSE); + } + gtk_widget_show(w); + gtk_menu_append(GTK_MENU(m), w); + /* Set Clip */ + w = gtk_menu_item_new_with_mnemonic(_("Set _Clip")); + gtk_object_set_data(GTK_OBJECT(w), "desktop", desktop); + gtk_signal_connect(GTK_OBJECT(w), "activate", GTK_SIGNAL_FUNC(sp_set_clip), item); + if ((item && item->mask_ref && item->mask_ref->getObject()) || (item->clip_ref && item->clip_ref->getObject())) { + gtk_widget_set_sensitive(w, FALSE); + } else { + gtk_widget_set_sensitive(w, TRUE); + } + gtk_widget_show(w); + gtk_menu_append(GTK_MENU(m), w); + /* Release Clip */ + w = gtk_menu_item_new_with_mnemonic(_("Release C_lip")); + gtk_object_set_data(GTK_OBJECT(w), "desktop", desktop); + gtk_signal_connect(GTK_OBJECT(w), "activate", GTK_SIGNAL_FUNC(sp_release_clip), item); + if (item && item->clip_ref && item->clip_ref->getObject()) { + gtk_widget_set_sensitive(w, TRUE); + } else { + gtk_widget_set_sensitive(w, FALSE); + } + gtk_widget_show(w); + gtk_menu_append(GTK_MENU(m), w); + } static void @@ -139,6 +197,63 @@ sp_item_properties(GtkMenuItem *menuitem, SPItem *item) sp_item_dialog(); } + +static void +sp_set_mask(GtkMenuItem *menuitem, SPItem *item) +{ + SPDesktop *desktop; + + g_assert(SP_IS_ITEM(item)); + + desktop = (SPDesktop*)gtk_object_get_data(GTK_OBJECT(menuitem), "desktop"); + g_return_if_fail(desktop != NULL); + + sp_selection_set_mask(desktop, false, false); +} + + +static void +sp_release_mask(GtkMenuItem *menuitem, SPItem *item) +{ + SPDesktop *desktop; + + g_assert(SP_IS_ITEM(item)); + + desktop = (SPDesktop*)gtk_object_get_data(GTK_OBJECT(menuitem), "desktop"); + g_return_if_fail(desktop != NULL); + + sp_selection_unset_mask(desktop, false); +} + + +static void +sp_set_clip(GtkMenuItem *menuitem, SPItem *item) +{ + SPDesktop *desktop; + + g_assert(SP_IS_ITEM(item)); + + desktop = (SPDesktop*)gtk_object_get_data(GTK_OBJECT(menuitem), "desktop"); + g_return_if_fail(desktop != NULL); + + sp_selection_set_mask(desktop, true, false); +} + + +static void +sp_release_clip(GtkMenuItem *menuitem, SPItem *item) +{ + SPDesktop *desktop; + + g_assert(SP_IS_ITEM(item)); + + desktop = (SPDesktop*)gtk_object_get_data(GTK_OBJECT(menuitem), "desktop"); + g_return_if_fail(desktop != NULL); + + sp_selection_unset_mask(desktop, true); +} + + static void sp_item_select_this(GtkMenuItem *menuitem, SPItem *item) { @@ -161,7 +276,7 @@ sp_item_create_link(GtkMenuItem *menuitem, SPItem *item) SPDesktop *desktop = (SPDesktop*)gtk_object_get_data(GTK_OBJECT(menuitem), "desktop"); g_return_if_fail(desktop != NULL); - Inkscape::XML::Document *xml_doc = sp_document_repr_doc(desktop->doc()); + Inkscape::XML::Document *xml_doc = desktop->doc()->getReprDoc(); Inkscape::XML::Node *repr = xml_doc->createElement("svg:a"); SP_OBJECT_REPR(SP_OBJECT_PARENT(item))->addChild(repr, SP_OBJECT_REPR(item)); SPObject *object = SP_OBJECT_DOCUMENT(item)->getObjectByRepr(repr); @@ -172,8 +287,12 @@ sp_item_create_link(GtkMenuItem *menuitem, SPItem *item) SP_OBJECT(item)->deleteObject(false); repr->addChild(child, NULL); child->setAttribute("id", id); - sp_document_done(SP_OBJECT_DOCUMENT(object), SP_VERB_NONE, - _("Create link")); + + Inkscape::GC::release(repr); + Inkscape::GC::release(child); + + DocumentUndo::done(SP_OBJECT_DOCUMENT(object), SP_VERB_NONE, + _("Create link")); sp_object_attributes_dialog(object, "SPAnchor"); @@ -231,7 +350,7 @@ sp_anchor_menu(SPObject *object, SPDesktop *desktop, GtkMenu *m) item = (SPItem *) object; /* Link dialog */ - w = gtk_menu_item_new_with_mnemonic(_("Link _Properties")); + w = gtk_menu_item_new_with_mnemonic(_("Link _Properties...")); gtk_object_set_data(GTK_OBJECT(w), "desktop", desktop); gtk_signal_connect(GTK_OBJECT(w), "activate", GTK_SIGNAL_FUNC(sp_anchor_link_properties), item); gtk_widget_show(w); @@ -290,13 +409,13 @@ sp_image_menu(SPObject *object, SPDesktop *desktop, GtkMenu *m) GtkWidget *w; /* Link dialog */ - w = gtk_menu_item_new_with_mnemonic(_("Image _Properties")); + w = gtk_menu_item_new_with_mnemonic(_("Image _Properties...")); gtk_object_set_data(GTK_OBJECT(w), "desktop", desktop); gtk_signal_connect(GTK_OBJECT(w), "activate", GTK_SIGNAL_FUNC(sp_image_image_properties), item); gtk_widget_show(w); gtk_menu_append(GTK_MENU(m), w); - w = gtk_menu_item_new_with_mnemonic(_("Edit Image...")); + w = gtk_menu_item_new_with_mnemonic(_("Edit Externally...")); gtk_object_set_data(GTK_OBJECT(w), "desktop", desktop); gtk_signal_connect(GTK_OBJECT(w), "activate", GTK_SIGNAL_FUNC(sp_image_image_edit), item); gtk_widget_show(w); @@ -314,8 +433,26 @@ sp_image_image_properties(GtkMenuItem */*menuitem*/, SPAnchor *anchor) sp_object_attributes_dialog(SP_OBJECT(anchor), "Image"); } -#define EDIT_APP "gimp" -//#define EDIT_APP "krita" +static gchar* getImageEditorName() { + Inkscape::Preferences *prefs = Inkscape::Preferences::get(); + gchar* value = 0; + Glib::ustring choices = prefs->getString("/options/bitmapeditor/choices"); + if (!choices.empty()) { + gchar** splits = g_strsplit(choices.data(), ",", 0); + gint numIems = g_strv_length(splits); + + int setting = prefs->getIntLimited("/options/bitmapeditor/value", 0, 0, numIems); + value = g_strdup(splits[setting]); + + g_strfreev(splits); + } + + if (!value) { + value = g_strdup("gimp"); + } + return value; +} + static void sp_image_image_edit(GtkMenuItem *menuitem, SPAnchor *anchor) { SPObject* obj = SP_OBJECT(anchor); @@ -323,7 +460,8 @@ static void sp_image_image_edit(GtkMenuItem *menuitem, SPAnchor *anchor) const gchar *href = ir->attribute("xlink:href"); GError* errThing = 0; - gchar const* args[] = {EDIT_APP, href, 0}; + gchar* editorBin = getImageEditorName(); + gchar const* args[] = {editorBin, href, 0}; g_spawn_async(0, // working dir const_cast(args), 0, //envp @@ -339,12 +477,13 @@ static void sp_image_image_edit(GtkMenuItem *menuitem, SPAnchor *anchor) g_error_free(errThing); errThing = 0; } + g_free(editorBin); } -/* SPShape */ +/* Fill and Stroke entry */ static void -sp_shape_fill_settings(GtkMenuItem *menuitem, SPItem *item) +sp_fill_settings(GtkMenuItem *menuitem, SPItem *item) { SPDesktop *desktop; @@ -360,6 +499,8 @@ sp_shape_fill_settings(GtkMenuItem *menuitem, SPItem *item) desktop->_dlg_mgr->showDialog("FillAndStroke"); } +/* SPShape */ + static void sp_shape_menu(SPObject *object, SPDesktop *desktop, GtkMenu *m) { @@ -369,14 +510,82 @@ sp_shape_menu(SPObject *object, SPDesktop *desktop, GtkMenu *m) item = (SPItem *) object; /* Item dialog */ - w = gtk_menu_item_new_with_mnemonic(_("_Fill and Stroke")); + w = gtk_menu_item_new_with_mnemonic(_("_Fill and Stroke...")); gtk_object_set_data(GTK_OBJECT(w), "desktop", desktop); - gtk_signal_connect(GTK_OBJECT(w), "activate", GTK_SIGNAL_FUNC(sp_shape_fill_settings), item); + gtk_signal_connect(GTK_OBJECT(w), "activate", GTK_SIGNAL_FUNC(sp_fill_settings), item); gtk_widget_show(w); gtk_menu_append(GTK_MENU(m), w); } +/* Edit Text entry */ + +static void +sp_text_settings(GtkMenuItem *menuitem, SPItem *item) +{ + SPDesktop *desktop; + + g_assert(SP_IS_ITEM(item)); + + desktop = (SPDesktop*)gtk_object_get_data(GTK_OBJECT(menuitem), "desktop"); + g_return_if_fail(desktop != NULL); + + if (sp_desktop_selection(desktop)->isEmpty()) { + sp_desktop_selection(desktop)->set(item); + } + + sp_text_edit_dialog(); +} + +/* Spellcheck entry */ + +static void +sp_spellcheck_settings(GtkMenuItem *menuitem, SPItem *item) +{ + SPDesktop *desktop; + + g_assert(SP_IS_ITEM(item)); + + desktop = (SPDesktop*)gtk_object_get_data(GTK_OBJECT(menuitem), "desktop"); + g_return_if_fail(desktop != NULL); + + if (sp_desktop_selection(desktop)->isEmpty()) { + sp_desktop_selection(desktop)->set(item); + } + + sp_spellcheck_dialog(); +} + +/* SPText */ +static void +sp_text_menu(SPObject *object, SPDesktop *desktop, GtkMenu *m) +{ + SPItem *item; + GtkWidget *w; + + item = (SPItem *) object; + + /* Fill and Stroke dialog */ + w = gtk_menu_item_new_with_mnemonic(_("_Fill and Stroke...")); + gtk_object_set_data(GTK_OBJECT(w), "desktop", desktop); + gtk_signal_connect(GTK_OBJECT(w), "activate", GTK_SIGNAL_FUNC(sp_fill_settings), item); + gtk_widget_show(w); + gtk_menu_append(GTK_MENU(m), w); + + /* Edit Text dialog */ + w = gtk_menu_item_new_with_mnemonic(_("_Text and Font...")); + gtk_object_set_data(GTK_OBJECT(w), "desktop", desktop); + gtk_signal_connect(GTK_OBJECT(w), "activate", GTK_SIGNAL_FUNC(sp_text_settings), item); + gtk_widget_show(w); + gtk_menu_append(GTK_MENU(m), w); + + /* Spellcheck dialog */ + w = gtk_menu_item_new_with_mnemonic(_("Check Spellin_g...")); + gtk_object_set_data(GTK_OBJECT(w), "desktop", desktop); + gtk_signal_connect(GTK_OBJECT(w), "activate", GTK_SIGNAL_FUNC(sp_spellcheck_settings), item); + gtk_widget_show(w); + gtk_menu_append(GTK_MENU(m), w); +} /* Local Variables: mode:c++ @@ -386,4 +595,4 @@ sp_shape_menu(SPObject *object, SPDesktop *desktop, GtkMenu *m) fill-column:99 End: */ -// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=99 : +// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :