X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Fverbs.cpp;h=e40ffe1d69b3cc0e61af7c37504b68ce18e4c3d0;hb=9c2b2f3c7ba0cafbcc47dc92bff67662b7e4ab2f;hp=da843bbe841b35e5a1eb01c4ae7c3d944c3d5f55;hpb=d4f91ea738aa8792b638263055134f6bd7a40949;p=inkscape.git diff --git a/src/verbs.cpp b/src/verbs.cpp index da843bbe8..e40ffe1d6 100644 --- a/src/verbs.cpp +++ b/src/verbs.cpp @@ -23,23 +23,23 @@ */ - - -#include - #ifdef HAVE_CONFIG_H # include "config.h" #endif +#include +#include +#include + #include "helper/action.h" #include #include #include +#include "layer-manager.h" #include "dialogs/text-edit.h" #include "dialogs/xml-tree.h" -#include "dialogs/object-properties.h" #include "dialogs/item-properties.h" #include "dialogs/find.h" #include "dialogs/layer-properties.h" @@ -55,6 +55,7 @@ #endif #include "extension/effect.h" +#include "bind/javabind.h" #include "tools-switch.h" #include "inkscape-private.h" @@ -76,7 +77,14 @@ #include "sp-flowtext.h" #include "layer-fns.h" #include "node-context.h" - +#include "select-context.h" +#include "seltrans.h" +#include "gradient-context.h" +#include "shape-editor.h" +#include "draw-context.h" +#include "gradient-drag.h" +#include "sp-guide.h" +#include "display/curve.h" /** * \brief Return the name without underscores and ellipsis, for use in dialog @@ -102,44 +110,8 @@ sp_action_get_title(SPAction const *action) } // end of sp_action_get_title() - namespace Inkscape { -/// \todo !!!FIXME:: kill this, use DialogManager instead!!! - -class PanelDialog : public Inkscape::UI::Dialog::Dialog -{ -public: - PanelDialog(char const *prefs_path, int const verb_num) : Dialog(prefs_path, verb_num) {} -/* - virtual Glib::ustring getName() const {return "foo";} - virtual Glib::ustring getDesc() const {return "bar";} -*/ -}; - -/** \brief Utility function to get a panel displayed. */ -static void show_panel( Inkscape::UI::Widget::Panel &panel, char const *prefs_path, int const verb_num ) -{ - Gtk::Container *container = panel.get_toplevel(); - if ( &panel == container ) { // safe check? - //g_message("Creating new dialog to hold it"); - PanelDialog *dia = new PanelDialog(prefs_path, verb_num); - Gtk::VBox *mainVBox = dia->get_vbox(); - mainVBox->pack_start(panel); - dia->show_all_children(); - dia->present(); - dia->read_geometry(); - } else { - Gtk::Dialog *dia = dynamic_cast(container); - if ( dia ) { - //g_message("Found an existing dialog"); - dia->present(); - } else { - g_message("Failed to find an existing dialog"); - } - } -} - /** \brief A class to encompass all of the verbs which deal with file operations. */ class FileVerb : public Verb { @@ -348,7 +320,7 @@ public: gchar const *image) : Verb(code, id, name, tip, image) { } -}; //TextVerb : public Verb +}; //TextVerb : public Verb Verb::VerbTable Verb::_verbs; Verb::VerbIDTable Verb::_verb_ids; @@ -397,7 +369,7 @@ Verb::~Verb(void) \return NULL to represent error (this function shouldn't ever be called) */ SPAction * -Verb::make_action(Inkscape::UI::View::View *view) +Verb::make_action(Inkscape::UI::View::View */*view*/) { //std::cout << "make_action" << std::endl; return NULL; @@ -643,7 +615,7 @@ Verb::sensitive(SPDocument *in_doc, bool in_sensitive) for (ActionTable::iterator cur_action = _actions->begin(); cur_action != _actions->end(); cur_action++) { - if (in_doc == NULL || (cur_action->first != NULL && cur_action->first->doc() == in_doc)) { + if (in_doc == NULL || (cur_action->first != NULL && cur_action->first->doc() == in_doc)) { sp_action_set_sensitive(cur_action->second, in_sensitive ? 1 : 0); } } @@ -656,6 +628,12 @@ Verb::sensitive(SPDocument *in_doc, bool in_sensitive) return; } +/** \brief Accessor to get the tooltip for verb as localised string */ +gchar const * +Verb::get_tip (void) +{ + return _(_tip); +} void Verb::name(SPDocument *in_doc, Glib::ustring in_name) @@ -664,8 +642,8 @@ Verb::name(SPDocument *in_doc, Glib::ustring in_name) for (ActionTable::iterator cur_action = _actions->begin(); cur_action != _actions->end(); cur_action++) { - if (in_doc == NULL || (cur_action->first != NULL && cur_action->first->doc() == in_doc)) { - sp_action_set_name(cur_action->second, in_name); + if (in_doc == NULL || (cur_action->first != NULL && cur_action->first->doc() == in_doc)) { + sp_action_set_name(cur_action->second, in_name); } } } @@ -776,7 +754,7 @@ Verb::getbyid(gchar const *id) /** \brief Decode the verb code and take appropriate action */ void -FileVerb::perform(SPAction *action, void *data, void *pdata) +FileVerb::perform(SPAction *action, void *data, void */*pdata*/) { #if 0 /* These aren't used, but are here to remind people not to use @@ -784,43 +762,52 @@ FileVerb::perform(SPAction *action, void *data, void *pdata) Inkscape::UI::View::View *current_view = sp_action_get_view(action); SPDocument *current_document = current_view->doc(); #endif + + SPDesktop *desktop = dynamic_cast(sp_action_get_view(action)); + g_assert(desktop != NULL); + Gtk::Window *parent = desktop->getToplevel(); + g_assert(parent != NULL); + switch ((long) data) { case SP_VERB_FILE_NEW: sp_file_new_default(); break; case SP_VERB_FILE_OPEN: - sp_file_open_dialog(NULL, NULL); + sp_file_open_dialog(*parent, NULL, NULL); break; case SP_VERB_FILE_REVERT: sp_file_revert_dialog(); break; case SP_VERB_FILE_SAVE: - sp_file_save(NULL, NULL); + sp_file_save(*parent, NULL, NULL); break; case SP_VERB_FILE_SAVE_AS: - sp_file_save_as(NULL, NULL); + sp_file_save_as(*parent, NULL, NULL); break; case SP_VERB_FILE_SAVE_A_COPY: - sp_file_save_a_copy(NULL, NULL); + sp_file_save_a_copy(*parent, NULL, NULL); break; case SP_VERB_FILE_PRINT: - sp_file_print(); + sp_file_print(*parent); break; case SP_VERB_FILE_VACUUM: sp_file_vacuum(); break; - case SP_VERB_FILE_PRINT_DIRECT: - sp_file_print_direct(); - break; case SP_VERB_FILE_PRINT_PREVIEW: sp_file_print_preview(NULL, NULL); break; case SP_VERB_FILE_IMPORT: - sp_file_import(NULL); + sp_file_import(*parent); break; case SP_VERB_FILE_EXPORT: sp_file_export_dialog(NULL); break; + case SP_VERB_FILE_IMPORT_FROM_OCAL: + sp_file_import_from_ocal(*parent); + break; + case SP_VERB_FILE_EXPORT_TO_OCAL: + sp_file_export_to_ocal(*parent); + break; case SP_VERB_FILE_NEXT_DESKTOP: inkscape_switch_desktops_next(); break; @@ -837,16 +824,16 @@ FileVerb::perform(SPAction *action, void *data, void *pdata) break; } + } // end of sp_verb_action_file_perform() /** \brief Decode the verb code and take appropriate action */ void -EditVerb::perform(SPAction *action, void *data, void *pdata) +EditVerb::perform(SPAction *action, void *data, void */*pdata*/) { SPDesktop *dt = static_cast(sp_action_get_view(action)); if (!dt) return; - SPEventContext *ec = dt->event_context; switch (reinterpret_cast(data)) { @@ -889,6 +876,15 @@ EditVerb::perform(SPAction *action, void *data, void *pdata) case SP_VERB_EDIT_PASTE_IN_PLACE: sp_selection_paste(true); break; + case SP_VERB_EDIT_PASTE_LIVEPATHEFFECT: + sp_selection_paste_livepatheffect(); + break; + case SP_VERB_EDIT_REMOVE_LIVEPATHEFFECT: + sp_selection_remove_livepatheffect(); + break; + case SP_VERB_EDIT_REMOVE_FILTER: + sp_selection_remove_filter(); + break; case SP_VERB_EDIT_DELETE: sp_selection_delete(); break; @@ -901,9 +897,18 @@ EditVerb::perform(SPAction *action, void *data, void *pdata) case SP_VERB_EDIT_UNLINK_CLONE: sp_selection_unlink(); break; - case SP_VERB_EDIT_CLONE_ORIGINAL: + case SP_VERB_EDIT_RELINK_CLONE: + sp_selection_relink(); + break; + case SP_VERB_EDIT_CLONE_SELECT_ORIGINAL: sp_select_clone_original(); break; + case SP_VERB_EDIT_SELECTION_2_MARKER: + sp_selection_to_marker(); + break; + case SP_VERB_EDIT_SELECTION_2_GUIDES: + sp_selection_to_guides(); + break; case SP_VERB_EDIT_TILE: sp_selection_tile(); break; @@ -915,39 +920,69 @@ EditVerb::perform(SPAction *action, void *data, void *pdata) break; case SP_VERB_EDIT_SELECT_ALL: if (tools_isactive(dt, TOOLS_NODES)) { - sp_nodepath_select_all_from_subpath(SP_NODE_CONTEXT(ec)->nodepath, false); + SP_NODE_CONTEXT(ec)->shape_editor->select_all_from_subpath(false); } else { sp_edit_select_all(); } break; case SP_VERB_EDIT_INVERT: if (tools_isactive(dt, TOOLS_NODES)) { - sp_nodepath_select_all_from_subpath(SP_NODE_CONTEXT(ec)->nodepath, true); + SP_NODE_CONTEXT(ec)->shape_editor->select_all_from_subpath(true); } else { sp_edit_invert(); } break; case SP_VERB_EDIT_SELECT_ALL_IN_ALL_LAYERS: if (tools_isactive(dt, TOOLS_NODES)) { - sp_nodepath_select_all(SP_NODE_CONTEXT(ec)->nodepath, false); + SP_NODE_CONTEXT(ec)->shape_editor->select_all(false); } else { sp_edit_select_all_in_all_layers(); } break; case SP_VERB_EDIT_INVERT_IN_ALL_LAYERS: if (tools_isactive(dt, TOOLS_NODES)) { - sp_nodepath_select_all(SP_NODE_CONTEXT(ec)->nodepath, true); + SP_NODE_CONTEXT(ec)->shape_editor->select_all(true); } else { sp_edit_invert_in_all_layers(); } break; + + case SP_VERB_EDIT_SELECT_NEXT: + if (tools_isactive(dt, TOOLS_NODES)) { + SP_NODE_CONTEXT(ec)->shape_editor->select_next(); + } else if (tools_isactive(dt, TOOLS_GRADIENT) + && ec->_grdrag->isNonEmpty()) { + sp_gradient_context_select_next (ec); + } else { + sp_selection_item_next(); + } + break; + case SP_VERB_EDIT_SELECT_PREV: + if (tools_isactive(dt, TOOLS_NODES)) { + SP_NODE_CONTEXT(ec)->shape_editor->select_prev(); + } else if (tools_isactive(dt, TOOLS_GRADIENT) + && ec->_grdrag->isNonEmpty()) { + sp_gradient_context_select_prev (ec); + } else { + sp_selection_item_prev(); + } + break; + case SP_VERB_EDIT_DESELECT: if (tools_isactive(dt, TOOLS_NODES)) { - sp_nodepath_deselect(SP_NODE_CONTEXT(ec)->nodepath); + SP_NODE_CONTEXT(ec)->shape_editor->deselect(); } else { sp_desktop_selection(dt)->clear(); } break; + + case SP_VERB_EDIT_GUIDES_AROUND_PAGE: + sp_guide_create_guides_around_page(dt); + break; + + case SP_VERB_EDIT_NEXT_PATHEFFECT_PARAMETER: + sp_selection_next_patheffect_param(dt); + break; default: break; } @@ -956,13 +991,15 @@ EditVerb::perform(SPAction *action, void *data, void *pdata) /** \brief Decode the verb code and take appropriate action */ void -SelectionVerb::perform(SPAction *action, void *data, void *pdata) +SelectionVerb::perform(SPAction *action, void *data, void */*pdata*/) { SPDesktop *dt = static_cast(sp_action_get_view(action)); if (!dt) return; + g_assert(dt->_dlg_mgr != NULL); + switch (reinterpret_cast(data)) { case SP_VERB_SELECTION_TO_FRONT: sp_selection_raise_to_top(); @@ -1033,9 +1070,11 @@ SelectionVerb::perform(SPAction *action, void *data, void *pdata) break; case SP_VERB_SELECTION_DYNAMIC_OFFSET: sp_selected_path_create_offset_object_zero(); + tools_switch_current(TOOLS_NODES); break; case SP_VERB_SELECTION_LINKED_OFFSET: sp_selected_path_create_updating_offset_object_zero(); + tools_switch_current(TOOLS_NODES); break; case SP_VERB_SELECTION_OUTLINE: @@ -1048,6 +1087,7 @@ SelectionVerb::perform(SPAction *action, void *data, void *pdata) sp_selected_path_reverse(); break; case SP_VERB_SELECTION_TRACE: + inkscape_dialogs_unhide(); dt->_dlg_mgr->showDialog("Trace"); break; case SP_VERB_SELECTION_CREATE_BITMAP: @@ -1061,6 +1101,7 @@ SelectionVerb::perform(SPAction *action, void *data, void *pdata) sp_selected_path_break_apart(); break; case SP_VERB_SELECTION_GRIDTILE: + inkscape_dialogs_unhide(); dt->_dlg_mgr->showDialog("TileDialog"); break; default: @@ -1071,7 +1112,7 @@ SelectionVerb::perform(SPAction *action, void *data, void *pdata) /** \brief Decode the verb code and take appropriate action */ void -LayerVerb::perform(SPAction *action, void *data, void *pdata) +LayerVerb::perform(SPAction *action, void *data, void */*pdata*/) { SPDesktop *dt = static_cast(sp_action_get_view(action)); unsigned int verb = reinterpret_cast(data); @@ -1093,11 +1134,11 @@ LayerVerb::perform(SPAction *action, void *data, void *pdata) SPObject *next=Inkscape::next_layer(dt->currentRoot(), dt->currentLayer()); if (next) { dt->setCurrentLayer(next); - sp_document_done(sp_desktop_document(dt), SP_VERB_LAYER_NEXT, - _("Move to next layer")); - dt->messageStack()->flash(Inkscape::NORMAL_MESSAGE, _("Moved to next layer.")); + sp_document_done(sp_desktop_document(dt), SP_VERB_LAYER_NEXT, + _("Switch to next layer")); + dt->messageStack()->flash(Inkscape::NORMAL_MESSAGE, _("Switched to next layer.")); } else { - dt->messageStack()->flash(Inkscape::WARNING_MESSAGE, _("Cannot move past last layer.")); + dt->messageStack()->flash(Inkscape::WARNING_MESSAGE, _("Cannot go past last layer.")); } break; } @@ -1105,11 +1146,11 @@ LayerVerb::perform(SPAction *action, void *data, void *pdata) SPObject *prev=Inkscape::previous_layer(dt->currentRoot(), dt->currentLayer()); if (prev) { dt->setCurrentLayer(prev); - sp_document_done(sp_desktop_document(dt), SP_VERB_LAYER_PREV, - _("Move to previous layer")); - dt->messageStack()->flash(Inkscape::NORMAL_MESSAGE, _("Moved to previous layer.")); + sp_document_done(sp_desktop_document(dt), SP_VERB_LAYER_PREV, + _("Switch to previous layer")); + dt->messageStack()->flash(Inkscape::NORMAL_MESSAGE, _("Switched to previous layer.")); } else { - dt->messageStack()->flash(Inkscape::WARNING_MESSAGE, _("Cannot move past first layer.")); + dt->messageStack()->flash(Inkscape::WARNING_MESSAGE, _("Cannot go before first layer.")); } break; } @@ -1182,6 +1223,31 @@ LayerVerb::perform(SPAction *action, void *data, void *pdata) break; } + case SP_VERB_LAYER_DUPLICATE: { + if ( dt->currentLayer() != dt->currentRoot() ) { + SPObject *new_layer = Inkscape::create_layer(dt->currentRoot(), dt->currentLayer(), LPOS_BELOW); + if ( dt->currentLayer()->label() ) { + gchar* name = g_strdup_printf(_("%s copy"), dt->currentLayer()->label()); + dt->layer_manager->renameLayer( new_layer, name ); + g_free(name); + } + + sp_edit_select_all(); + sp_selection_duplicate(true); + sp_selection_to_prev_layer(true); + dt->setCurrentLayer(new_layer); + sp_edit_select_all(); + + sp_document_done(sp_desktop_document(dt), SP_VERB_LAYER_DUPLICATE, + _("Duplicate layer")); + + // TRANSLATORS: this means "The layer has been duplicated." + dt->messageStack()->flash(Inkscape::NORMAL_MESSAGE, _("Duplicated layer.")); + } else { + dt->messageStack()->flash(Inkscape::ERROR_MESSAGE, _("No current layer.")); + } + break; + } case SP_VERB_LAYER_DELETE: { if ( dt->currentLayer() != dt->currentRoot() ) { sp_desktop_selection(dt)->clear(); @@ -1204,7 +1270,7 @@ LayerVerb::perform(SPAction *action, void *data, void *pdata) dt->setCurrentLayer(survivor); } - sp_document_done(sp_desktop_document(dt), SP_VERB_LAYER_DELETE, + sp_document_done(sp_desktop_document(dt), SP_VERB_LAYER_DELETE, _("Delete layer")); // TRANSLATORS: this means "The layer has been deleted." @@ -1214,6 +1280,15 @@ LayerVerb::perform(SPAction *action, void *data, void *pdata) } break; } + case SP_VERB_LAYER_SOLO: { + if ( dt->currentLayer() == dt->currentRoot() ) { + dt->messageStack()->flash(Inkscape::ERROR_MESSAGE, _("No current layer.")); + } else { + dt->toggleLayerSolo( dt->currentLayer() ); + sp_document_maybe_done(sp_desktop_document(dt), "layer:solo", SP_VERB_LAYER_SOLO, _("Toggle layer solo")); + } + break; + } } return; @@ -1221,7 +1296,7 @@ LayerVerb::perform(SPAction *action, void *data, void *pdata) /** \brief Decode the verb code and take appropriate action */ void -ObjectVerb::perform( SPAction *action, void *data, void *pdata ) +ObjectVerb::perform( SPAction *action, void *data, void */*pdata*/ ) { SPDesktop *dt = static_cast(sp_action_get_view(action)); if (!dt) @@ -1234,7 +1309,17 @@ ObjectVerb::perform( SPAction *action, void *data, void *pdata ) if (sel->isEmpty()) return; - NR::Point const center(sel->bounds().midpoint()); + NR::Maybe bbox = sel->bounds(); + if (!bbox) { + return; + } + // If the rotation center of the selection is visible, choose it as reference point + // for horizontal and vertical flips. Otherwise, take the center of the bounding box. + NR::Point center; + if (tools_isactive(dt, TOOLS_SELECT) && sel->center() && SP_SELECT_CONTEXT(ec)->_seltrans->centerIsVisible()) + center = *sel->center(); + else + center = bbox->midpoint(); switch (reinterpret_cast(data)) { case SP_VERB_OBJECT_ROTATE_90_CW: @@ -1256,11 +1341,26 @@ ObjectVerb::perform( SPAction *action, void *data, void *pdata ) text_unflow(); break; case SP_VERB_OBJECT_FLOWTEXT_TO_TEXT: - SPFlowtext::convert_to_text(); + flowtext_to_text(); break; case SP_VERB_OBJECT_FLIP_HORIZONTAL: + // When working with the node tool ... if (tools_isactive(dt, TOOLS_NODES)) { - sp_nodepath_flip(SP_NODE_CONTEXT(ec)->nodepath, NR::X); + Inkscape::NodePath::Node *active_node = Inkscape::NodePath::Path::active_node; + + // ... and one of the nodes is currently mouseovered ... + if (active_node) { + + // ... flip the selected nodes about that node + SP_NODE_CONTEXT(ec)->shape_editor->flip(NR::X, active_node->pos); + } else { + + // ... or else about the center of their bounding box. + SP_NODE_CONTEXT(ec)->shape_editor->flip(NR::X); + } + + // When working with the selector tool, flip the selection about its rotation center + // (if it is visible) or about the center of the bounding box. } else { sp_selection_scale_relative(sel, center, NR::scale(-1.0, 1.0)); } @@ -1268,8 +1368,14 @@ ObjectVerb::perform( SPAction *action, void *data, void *pdata ) _("Flip horizontally")); break; case SP_VERB_OBJECT_FLIP_VERTICAL: + // The behaviour is analogous to flipping horizontally if (tools_isactive(dt, TOOLS_NODES)) { - sp_nodepath_flip(SP_NODE_CONTEXT(ec)->nodepath, NR::Y); + Inkscape::NodePath::Node *active_node = Inkscape::NodePath::Path::active_node; + if (active_node) { + SP_NODE_CONTEXT(ec)->shape_editor->flip(NR::Y, active_node->pos); + } else { + SP_NODE_CONTEXT(ec)->shape_editor->flip(NR::Y); + } } else { sp_selection_scale_relative(sel, center, NR::scale(1.0, -1.0)); } @@ -1279,12 +1385,18 @@ ObjectVerb::perform( SPAction *action, void *data, void *pdata ) case SP_VERB_OBJECT_SET_MASK: sp_selection_set_mask(false, false); break; + case SP_VERB_OBJECT_EDIT_MASK: + sp_selection_edit_clip_or_mask(dt, false); + break; case SP_VERB_OBJECT_UNSET_MASK: sp_selection_unset_mask(false); break; case SP_VERB_OBJECT_SET_CLIPPATH: sp_selection_set_mask(true, false); break; + case SP_VERB_OBJECT_EDIT_CLIPPATH: + sp_selection_edit_clip_or_mask(dt, true); + break; case SP_VERB_OBJECT_UNSET_CLIPPATH: sp_selection_unset_mask(true); break; @@ -1296,7 +1408,7 @@ ObjectVerb::perform( SPAction *action, void *data, void *pdata ) /** \brief Decode the verb code and take appropriate action */ void -ContextVerb::perform(SPAction *action, void *data, void *pdata) +ContextVerb::perform(SPAction *action, void *data, void */*pdata*/) { SPDesktop *dt; sp_verb_t verb; @@ -1312,7 +1424,7 @@ ContextVerb::perform(SPAction *action, void *data, void *pdata) /** \todo !!! hopefully this can go away soon and actions can look after * themselves */ - for (vidx = SP_VERB_CONTEXT_SELECT; vidx <= SP_VERB_CONTEXT_DROPPER_PREFS; vidx++) + for (vidx = SP_VERB_CONTEXT_SELECT; vidx <= SP_VERB_CONTEXT_PAINTBUCKET_PREFS; vidx++) { SPAction *tool_action= get((sp_verb_t)vidx)->get_action(dt); if (tool_action) { @@ -1327,9 +1439,15 @@ ContextVerb::perform(SPAction *action, void *data, void *pdata) case SP_VERB_CONTEXT_NODE: tools_switch_current(TOOLS_NODES); break; + case SP_VERB_CONTEXT_TWEAK: + tools_switch_current(TOOLS_TWEAK); + break; case SP_VERB_CONTEXT_RECT: tools_switch_current(TOOLS_SHAPES_RECT); break; + case SP_VERB_CONTEXT_3DBOX: + tools_switch_current(TOOLS_SHAPES_3DBOX); + break; case SP_VERB_CONTEXT_ARC: tools_switch_current(TOOLS_SHAPES_ARC); break; @@ -1363,6 +1481,12 @@ ContextVerb::perform(SPAction *action, void *data, void *pdata) case SP_VERB_CONTEXT_CONNECTOR: tools_switch_current (TOOLS_CONNECTOR); break; + case SP_VERB_CONTEXT_PAINTBUCKET: + tools_switch_current(TOOLS_PAINTBUCKET); + break; + case SP_VERB_CONTEXT_ERASER: + tools_switch_current(TOOLS_ERASER); + break; case SP_VERB_CONTEXT_SELECT_PREFS: prefs_set_int_attribute("dialogs.preferences", "page", PREFS_PAGE_TOOLS_SELECTOR); @@ -1372,10 +1496,18 @@ ContextVerb::perform(SPAction *action, void *data, void *pdata) prefs_set_int_attribute("dialogs.preferences", "page", PREFS_PAGE_TOOLS_NODE); dt->_dlg_mgr->showDialog("InkscapePreferences"); break; + case SP_VERB_CONTEXT_TWEAK_PREFS: + prefs_set_int_attribute("dialogs.preferences", "page", PREFS_PAGE_TOOLS_TWEAK); + dt->_dlg_mgr->showDialog("InkscapePreferences"); + break; case SP_VERB_CONTEXT_RECT_PREFS: prefs_set_int_attribute("dialogs.preferences", "page", PREFS_PAGE_TOOLS_SHAPES_RECT); dt->_dlg_mgr->showDialog("InkscapePreferences"); break; + case SP_VERB_CONTEXT_3DBOX_PREFS: + prefs_set_int_attribute("dialogs.preferences", "page", PREFS_PAGE_TOOLS_SHAPES_3DBOX); + dt->_dlg_mgr->showDialog("InkscapePreferences"); + break; case SP_VERB_CONTEXT_ARC_PREFS: prefs_set_int_attribute("dialogs.preferences", "page", PREFS_PAGE_TOOLS_SHAPES_ELLIPSE); dt->_dlg_mgr->showDialog("InkscapePreferences"); @@ -1420,6 +1552,14 @@ ContextVerb::perform(SPAction *action, void *data, void *pdata) prefs_set_int_attribute ("dialogs.preferences", "page", PREFS_PAGE_TOOLS_CONNECTOR); dt->_dlg_mgr->showDialog("InkscapePreferences"); break; + case SP_VERB_CONTEXT_PAINTBUCKET_PREFS: + prefs_set_int_attribute ("dialogs.preferences", "page", PREFS_PAGE_TOOLS_PAINTBUCKET); + dt->_dlg_mgr->showDialog("InkscapePreferences"); + break; + case SP_VERB_CONTEXT_ERASER_PREFS: + prefs_set_int_attribute("dialogs.preferences", "page", PREFS_PAGE_TOOLS_ERASER); + dt->_dlg_mgr->showDialog("InkscapePreferences"); + break; default: break; @@ -1429,7 +1569,7 @@ ContextVerb::perform(SPAction *action, void *data, void *pdata) /** \brief Decode the verb code and take appropriate action */ void -TextVerb::perform(SPAction *action, void *data, void *pdata) +TextVerb::perform(SPAction *action, void */*data*/, void */*pdata*/) { SPDesktop *dt = static_cast(sp_action_get_view(action)); if (!dt) @@ -1440,14 +1580,15 @@ TextVerb::perform(SPAction *action, void *data, void *pdata) Inkscape::XML::Node *repr = SP_OBJECT_REPR(dt->namedview); (void)repr; } - + /** \brief Decode the verb code and take appropriate action */ void -ZoomVerb::perform(SPAction *action, void *data, void *pdata) +ZoomVerb::perform(SPAction *action, void *data, void */*pdata*/) { SPDesktop *dt = static_cast(sp_action_get_view(action)); if (!dt) return; + SPEventContext *ec = dt->event_context; SPDocument *doc = sp_desktop_document(dt); @@ -1460,14 +1601,38 @@ ZoomVerb::perform(SPAction *action, void *data, void *pdata) switch (GPOINTER_TO_INT(data)) { case SP_VERB_ZOOM_IN: { + gint mul = 1 + gobble_key_events( + GDK_KP_Add, 0); // with any mask + // While drawing with the pen/pencil tool, zoom towards the end of the unfinished path + if (tools_isactive(dt, TOOLS_FREEHAND_PENCIL) || tools_isactive(dt, TOOLS_FREEHAND_PEN)) { + SPCurve *rc = SP_DRAW_CONTEXT(ec)->red_curve; + if (!rc->is_empty()) { + NR::Point const zoom_to (rc->last_point()); + dt->zoom_relative_keep_point(zoom_to, mul*zoom_inc); + break; + } + } + NR::Rect const d = dt->get_display_area(); - dt->zoom_relative( d.midpoint()[NR::X], d.midpoint()[NR::Y], zoom_inc); + dt->zoom_relative( d.midpoint()[NR::X], d.midpoint()[NR::Y], mul*zoom_inc); break; } case SP_VERB_ZOOM_OUT: { + gint mul = 1 + gobble_key_events( + GDK_KP_Subtract, 0); // with any mask + // While drawing with the pen/pencil tool, zoom away from the end of the unfinished path + if (tools_isactive(dt, TOOLS_FREEHAND_PENCIL) || tools_isactive(dt, TOOLS_FREEHAND_PEN)) { + SPCurve *rc = SP_DRAW_CONTEXT(ec)->red_curve; + if (!rc->is_empty()) { + NR::Point const zoom_to (rc->last_point()); + dt->zoom_relative_keep_point(zoom_to, 1 / (mul*zoom_inc)); + break; + } + } + NR::Rect const d = dt->get_display_area(); - dt->zoom_relative( d.midpoint()[NR::X], d.midpoint()[NR::Y], 1 / zoom_inc ); + dt->zoom_relative( d.midpoint()[NR::X], d.midpoint()[NR::Y], 1 / (mul*zoom_inc) ); break; } case SP_VERB_ZOOM_1_1: @@ -1515,8 +1680,11 @@ ZoomVerb::perform(SPAction *action, void *data, void *pdata) case SP_VERB_TOGGLE_GUIDES: sp_namedview_toggle_guides(doc, repr); break; + case SP_VERB_TOGGLE_SNAPPING: + dt->toggleSnapping(); + break; case SP_VERB_TOGGLE_GRID: - sp_namedview_toggle_grid(doc, repr); + dt->toggleGrids(); break; #ifdef HAVE_GTK_WINDOW_FULLSCREEN case SP_VERB_FULLSCREEN: @@ -1532,26 +1700,33 @@ ZoomVerb::perform(SPAction *action, void *data, void *pdata) case SP_VERB_VIEW_MODE_NORMAL: dt->setDisplayModeNormal(); break; + case SP_VERB_VIEW_MODE_NO_FILTERS: + dt->setDisplayModeNoFilters(); + break; case SP_VERB_VIEW_MODE_OUTLINE: dt->setDisplayModeOutline(); break; case SP_VERB_VIEW_MODE_TOGGLE: dt->displayModeToggle(); break; + case SP_VERB_VIEW_CMS_TOGGLE: + dt->toggleColorProfAdjust(); + break; case SP_VERB_VIEW_ICON_PREVIEW: - show_panel( Inkscape::UI::Dialogs::IconPreviewPanel::getInstance(), "dialogs.iconpreview", SP_VERB_VIEW_ICON_PREVIEW ); + inkscape_dialogs_unhide(); + dt->_dlg_mgr->showDialog("IconPreviewPanel"); break; default: break; } - + dt->updateNow(); } // end of sp_verb_action_zoom_perform() /** \brief Decode the verb code and take appropriate action */ void -DialogVerb::perform(SPAction *action, void *data, void *pdata) +DialogVerb::perform(SPAction *action, void *data, void */*pdata*/) { if (reinterpret_cast(data) != SP_VERB_DIALOG_TOGGLE) { // unhide all when opening a new dialog @@ -1575,10 +1750,10 @@ DialogVerb::perform(SPAction *action, void *data, void *pdata) dt->_dlg_mgr->showDialog("DocumentProperties"); break; case SP_VERB_DIALOG_FILL_STROKE: - sp_object_properties_dialog(); + dt->_dlg_mgr->showDialog("FillAndStroke"); break; case SP_VERB_DIALOG_SWATCHES: - show_panel( Inkscape::UI::Dialogs::SwatchesPanel::getInstance(), "dialogs.swatches", SP_VERB_DIALOG_SWATCHES); + dt->_dlg_mgr->showDialog("Swatches"); break; case SP_VERB_DIALOG_TRANSFORM: dt->_dlg_mgr->showDialog("Transformation"); @@ -1594,12 +1769,15 @@ DialogVerb::perform(SPAction *action, void *data, void *pdata) break; case SP_VERB_DIALOG_FIND: sp_find_dialog(); +// Please test the new find dialog if you have time: +// dt->_dlg_mgr->showDialog("Find"); break; case SP_VERB_DIALOG_DEBUG: dt->_dlg_mgr->showDialog("Messages"); break; case SP_VERB_DIALOG_SCRIPT: - dt->_dlg_mgr->showDialog("Script"); + //dt->_dlg_mgr->showDialog("Script"); + Inkscape::Bind::JavaBindery::getInstance()->showConsole(); break; case SP_VERB_DIALOG_UNDO_HISTORY: dt->_dlg_mgr->showDialog("UndoHistory"); @@ -1615,19 +1793,31 @@ DialogVerb::perform(SPAction *action, void *data, void *pdata) break; #ifdef WITH_INKBOARD case SP_VERB_XMPP_CLIENT: - { + { Inkscape::Whiteboard::SessionManager::showClient(); - break; - } + break; + } #endif case SP_VERB_DIALOG_INPUT: sp_input_dialog(); break; + case SP_VERB_DIALOG_INPUT2: + dt->_dlg_mgr->showDialog("InputDevices"); + break; case SP_VERB_DIALOG_EXTENSIONEDITOR: dt->_dlg_mgr->showDialog("ExtensionEditor"); break; case SP_VERB_DIALOG_LAYERS: - show_panel( Inkscape::UI::Dialogs::LayersPanel::getInstance(), "dialogs.layers", SP_VERB_DIALOG_LAYERS ); + dt->_dlg_mgr->showDialog("LayersPanel"); + break; + case SP_VERB_DIALOG_LIVE_PATH_EFFECT: + dt->_dlg_mgr->showDialog("LivePathEffect"); + break; + case SP_VERB_DIALOG_FILTER_EFFECTS: + dt->_dlg_mgr->showDialog("FilterEffectsDialog"); + break; + case SP_VERB_DIALOG_SVG_FONTS: + dt->_dlg_mgr->showDialog("SvgFontsDialog"); break; default: break; @@ -1636,25 +1826,19 @@ DialogVerb::perform(SPAction *action, void *data, void *pdata) /** \brief Decode the verb code and take appropriate action */ void -HelpVerb::perform(SPAction *action, void *data, void *pdata) +HelpVerb::perform(SPAction *action, void *data, void */*pdata*/) { SPDesktop *dt = static_cast(sp_action_get_view(action)); g_assert(dt->_dlg_mgr != NULL); switch (reinterpret_cast(data)) { - case SP_VERB_HELP_KEYS: - /* TRANSLATORS: If you have translated the keys.svg file to your language, then - translate this string as "keys.LANG.svg" (where LANG is your language code); - otherwise leave as "keys.svg". */ - sp_help_open_screen(_("keys.svg")); - break; case SP_VERB_HELP_ABOUT: sp_help_about(); break; case SP_VERB_HELP_ABOUT_EXTENSIONS: { - Inkscape::UI::Dialogs::ExtensionsPanel *panel = new Inkscape::UI::Dialogs::ExtensionsPanel(); - panel->set_full(true); - show_panel( *panel, "dialogs.aboutextensions", SP_VERB_HELP_ABOUT_EXTENSIONS ); + // Inkscape::UI::Dialogs::ExtensionsPanel *panel = new Inkscape::UI::Dialogs::ExtensionsPanel(); + // panel->set_full(true); + // show_panel( *panel, "dialogs.aboutextensions", SP_VERB_HELP_ABOUT_EXTENSIONS ); break; } @@ -1666,6 +1850,7 @@ HelpVerb::perform(SPAction *action, void *data, void *pdata) */ case SP_VERB_HELP_MEMORY: + inkscape_dialogs_unhide(); dt->_dlg_mgr->showDialog("Memory"); break; default: @@ -1675,7 +1860,7 @@ HelpVerb::perform(SPAction *action, void *data, void *pdata) /** \brief Decode the verb code and take appropriate action */ void -TutorialVerb::perform(SPAction *action, void *data, void *pdata) +TutorialVerb::perform(SPAction */*action*/, void *data, void */*pdata*/) { switch (reinterpret_cast(data)) { case SP_VERB_TUTORIAL_BASIC: @@ -1834,7 +2019,7 @@ EffectLastVerb::make_action(Inkscape::UI::View::View *view) /** \brief Decode the verb code and take appropriate action */ void -EffectLastVerb::perform(SPAction *action, void *data, void *pdata) +EffectLastVerb::perform(SPAction *action, void *data, void */*pdata*/) { /* These aren't used, but are here to remind people not to use the CURRENT_DOCUMENT macros unless they really have to. */ @@ -1847,9 +2032,8 @@ EffectLastVerb::perform(SPAction *action, void *data, void *pdata) switch ((long) data) { case SP_VERB_EFFECT_LAST_PREF: - if (!effect->prefs(current_view)) - return; - /* Note: fall through */ + effect->prefs(current_view); + break; case SP_VERB_EFFECT_LAST: effect->effect(current_view); break; @@ -1904,19 +2088,19 @@ FitCanvasVerb::make_action(Inkscape::UI::View::View *view) /** \brief Decode the verb code and take appropriate action */ void -FitCanvasVerb::perform(SPAction *action, void *data, void *pdata) +FitCanvasVerb::perform(SPAction *action, void *data, void */*pdata*/) { SPDesktop *dt = static_cast(sp_action_get_view(action)); if (!dt) return; SPDocument *doc = sp_desktop_document(dt); if (!doc) return; - + switch ((long) data) { case SP_VERB_FIT_CANVAS_TO_SELECTION: - fit_canvas_to_selection(dt); + verb_fit_canvas_to_selection(dt); break; case SP_VERB_FIT_CANVAS_TO_DRAWING: - fit_canvas_to_drawing(doc); + verb_fit_canvas_to_drawing(dt); break; case SP_VERB_FIT_CANVAS_TO_SELECTION_OR_DRAWING: fit_canvas_to_selection_or_drawing(dt); @@ -1930,8 +2114,80 @@ FitCanvasVerb::perform(SPAction *action, void *data, void *pdata) /* *********** End Fit Canvas ********** */ +/* *********** Lock'N'Hide ********** */ + +/** \brief A class to represent the object unlocking and unhiding verbs */ +class LockAndHideVerb : public Verb { +private: + static void perform(SPAction *action, void *mydata, void *otherdata); + static SPActionEventVector vector; +protected: + virtual SPAction *make_action(Inkscape::UI::View::View *view); +public: + /** \brief Use the Verb initializer with the same parameters. */ + LockAndHideVerb(unsigned int const code, + gchar const *id, + gchar const *name, + gchar const *tip, + gchar const *image) : + Verb(code, id, name, tip, image) + { + set_default_sensitive(true); + } +}; /* LockAndHideVerb class */ + +/** + * The vector to attach in the lock'n'hide verb. + */ +SPActionEventVector LockAndHideVerb::vector = + {{NULL},LockAndHideVerb::perform, NULL, NULL, NULL, NULL}; + +/** \brief Create an action for a \c LockAndHideVerb + \param view Which view the action should be created for + \return The built action. + + Calls \c make_action_helper with the \c vector. +*/ +SPAction * +LockAndHideVerb::make_action(Inkscape::UI::View::View *view) +{ + SPAction *action = make_action_helper(view, &vector); + return action; +} + +/** \brief Decode the verb code and take appropriate action */ +void +LockAndHideVerb::perform(SPAction *action, void *data, void */*pdata*/) +{ + SPDesktop *dt = static_cast(sp_action_get_view(action)); + if (!dt) return; + SPDocument *doc = sp_desktop_document(dt); + if (!doc) return; + switch ((long) data) { + case SP_VERB_UNLOCK_ALL: + unlock_all(dt); + sp_document_done(doc, SP_VERB_UNLOCK_ALL, _("Unlock all objects in the current layer")); + break; + case SP_VERB_UNLOCK_ALL_IN_ALL_LAYERS: + unlock_all_in_all_layers(dt); + sp_document_done(doc, SP_VERB_UNLOCK_ALL_IN_ALL_LAYERS, _("Unlock all objects in all layers")); + break; + case SP_VERB_UNHIDE_ALL: + unhide_all(dt); + sp_document_done(doc, SP_VERB_UNHIDE_ALL, _("Unhide all objects in the current layer")); + break; + case SP_VERB_UNHIDE_ALL_IN_ALL_LAYERS: + unhide_all_in_all_layers(dt); + sp_document_done(doc, SP_VERB_UNHIDE_ALL_IN_ALL_LAYERS, _("Unhide all objects in all layers")); + break; + default: + return; + } + return; +} +/* *********** End Lock'N'Hide ********** */ /* these must be in the same order as the SP_VERB_* enum in "verbs.h" */ @@ -1958,14 +2214,14 @@ Verb *Verb::_base_verbs[] = { // TRANSLATORS: "Vacuum Defs" means "Clean up defs" (so as to remove unused definitions) new FileVerb(SP_VERB_FILE_VACUUM, "FileVacuum", N_("Vac_uum Defs"), N_("Remove unused definitions (such as gradients or clipping paths) from the <defs> of the document"), "file_vacuum" ), - new FileVerb(SP_VERB_FILE_PRINT_DIRECT, "FilePrintDirect", N_("Print _Direct"), - N_("Print directly without prompting to a file or pipe"), NULL ), new FileVerb(SP_VERB_FILE_PRINT_PREVIEW, "FilePrintPreview", N_("Print Previe_w"), N_("Preview document printout"), GTK_STOCK_PRINT_PREVIEW ), new FileVerb(SP_VERB_FILE_IMPORT, "FileImport", N_("_Import..."), N_("Import a bitmap or SVG image into this document"), "file_import"), new FileVerb(SP_VERB_FILE_EXPORT, "FileExport", N_("_Export Bitmap..."), N_("Export this document or a selection as a bitmap image"), "file_export"), + new FileVerb(SP_VERB_FILE_IMPORT_FROM_OCAL, "FileImportFromOCAL", N_("Import From Open Clip Art Library"), N_("Import a document from Open Clip Art Library"), "ocal_import"), + new FileVerb(SP_VERB_FILE_EXPORT_TO_OCAL, "FileExportToOCAL", N_("Export To Open Clip Art Library"), N_("Export this document to Open Clip Art Library"), "ocal_export"), new FileVerb(SP_VERB_FILE_NEXT_DESKTOP, "NextWindow", N_("N_ext Window"), N_("Switch to the next document window"), "window_next"), new FileVerb(SP_VERB_FILE_PREV_DESKTOP, "PrevWindow", N_("P_revious Window"), @@ -2001,6 +2257,12 @@ Verb *Verb::_base_verbs[] = { N_("Scale each selected object vertically to match the height of the copied object"), NULL), new EditVerb(SP_VERB_EDIT_PASTE_IN_PLACE, "EditPasteInPlace", N_("Paste _In Place"), N_("Paste objects from clipboard to the original location"), "selection_paste_in_place"), + new EditVerb(SP_VERB_EDIT_PASTE_LIVEPATHEFFECT, "PasteLivePathEffect", N_("Paste Path _Effect"), + N_("Apply the path effect of the copied object to selection"), NULL), + new EditVerb(SP_VERB_EDIT_REMOVE_LIVEPATHEFFECT, "RemoveLivePathEffect", N_("Remove Path _Effect"), + N_("Remove any path effects from selected objects"), NULL), + new EditVerb(SP_VERB_EDIT_REMOVE_FILTER, "RemoveFilter", N_("Remove Filter"), + N_("Remove any filters from selected objects"), NULL), new EditVerb(SP_VERB_EDIT_DELETE, "EditDelete", N_("_Delete"), N_("Delete selection"), GTK_STOCK_DELETE), new EditVerb(SP_VERB_EDIT_DUPLICATE, "EditDuplicate", N_("Duplic_ate"), @@ -2008,9 +2270,17 @@ Verb *Verb::_base_verbs[] = { new EditVerb(SP_VERB_EDIT_CLONE, "EditClone", N_("Create Clo_ne"), N_("Create a clone (a copy linked to the original) of selected object"), "edit_clone"), new EditVerb(SP_VERB_EDIT_UNLINK_CLONE, "EditUnlinkClone", N_("Unlin_k Clone"), - N_("Cut the selected clone's link to its original, turning it into a standalone object"), "edit_unlink_clone"), - new EditVerb(SP_VERB_EDIT_CLONE_ORIGINAL, "EditCloneOriginal", N_("Select _Original"), + N_("Cut the selected clones' links to the originals, turning them into standalone objects"), "edit_unlink_clone"), + new EditVerb(SP_VERB_EDIT_RELINK_CLONE, "EditRelinkClone", N_("Relink to Copied"), + N_("Relink the selected clones to the object currently on the clipboard"), NULL), + new EditVerb(SP_VERB_EDIT_CLONE_SELECT_ORIGINAL, "EditCloneSelectOriginal", N_("Select _Original"), N_("Select the object to which the selected clone is linked"), "edit_select_original"), + // TRANSLATORS: Convert selection to a line marker + new EditVerb(SP_VERB_EDIT_SELECTION_2_MARKER, "ObjectsToMarker", N_("Objects to _Marker"), + N_("Convert selection to a line marker"), NULL), + // TRANSLATORS: Convert selection to a collection of guidelines + new EditVerb(SP_VERB_EDIT_SELECTION_2_GUIDES, "ObjectsToGuides", N_("Objects to Gu_ides"), + N_("Convert selected objects to a collection of guidelines aligned with their edges"), NULL), // TRANSLATORS: Convert selection to a rectangle with tiled pattern fill new EditVerb(SP_VERB_EDIT_TILE, "ObjectsToPattern", N_("Objects to Patter_n"), N_("Convert selection to a rectangle with tiled pattern fill"), NULL), @@ -2020,15 +2290,23 @@ Verb *Verb::_base_verbs[] = { new EditVerb(SP_VERB_EDIT_CLEAR_ALL, "EditClearAll", N_("Clea_r All"), N_("Delete all objects from document"), NULL), new EditVerb(SP_VERB_EDIT_SELECT_ALL, "EditSelectAll", N_("Select Al_l"), - N_("Select all objects or all nodes"), "selection_select_all"), + N_("Select all objects or all nodes"), "edit-select-all"), new EditVerb(SP_VERB_EDIT_SELECT_ALL_IN_ALL_LAYERS, "EditSelectAllInAllLayers", N_("Select All in All La_yers"), N_("Select all objects in all visible and unlocked layers"), "selection_select_all_in_all_layers"), new EditVerb(SP_VERB_EDIT_INVERT, "EditInvert", N_("In_vert Selection"), N_("Invert selection (unselect what is selected and select everything else)"), "selection_invert"), new EditVerb(SP_VERB_EDIT_INVERT_IN_ALL_LAYERS, "EditInvertInAllLayers", N_("Invert in All Layers"), N_("Invert selection in all visible and unlocked layers"), NULL), + new EditVerb(SP_VERB_EDIT_SELECT_NEXT, "EditSelectNext", N_("Select Next"), + N_("Select next object or node"), NULL), + new EditVerb(SP_VERB_EDIT_SELECT_PREV, "EditSelectPrev", N_("Select Previous"), + N_("Select previous object or node"), NULL), new EditVerb(SP_VERB_EDIT_DESELECT, "EditDeselect", N_("D_eselect"), N_("Deselect any selected objects or nodes"), "selection_deselect"), + new EditVerb(SP_VERB_EDIT_GUIDES_AROUND_PAGE, "EditGuidesAroundPage", N_("_Guides around page"), + N_("Create four guides aligned with the page borders"), NULL), + new EditVerb(SP_VERB_EDIT_NEXT_PATHEFFECT_PARAMETER, "EditNextPathEffectParameter", N_("Next Path Effect Parameter"), + N_("Show next Path Effect parameter for editing"), "edit_next_parameter"), /* Selection */ new SelectionVerb(SP_VERB_SELECTION_TO_FRONT, "SelectionToFront", N_("Raise to _Top"), @@ -2112,8 +2390,8 @@ Verb *Verb::_base_verbs[] = { // Advanced tutorial for more info new SelectionVerb(SP_VERB_SELECTION_BREAK_APART, "SelectionBreakApart", N_("Break _Apart"), N_("Break selected paths into subpaths"), "selection_break"), - new SelectionVerb(SP_VERB_SELECTION_GRIDTILE, "DialogGridArrange", N_("Gri_d Arrange..."), - N_("Arrange selected objects in a grid pattern"), "grid_arrange"), + new SelectionVerb(SP_VERB_SELECTION_GRIDTILE, "DialogGridArrange", N_("Rows and Columns..."), + N_("Arrange selected objects in a table"), "grid_arrange"), /* Layer */ new LayerVerb(SP_VERB_LAYER_NEW, "LayerNew", N_("_Add Layer..."), N_("Create a new layer"), "new_layer"), @@ -2135,14 +2413,22 @@ Verb *Verb::_base_verbs[] = { N_("Raise the current layer"), "raise_layer"), new LayerVerb(SP_VERB_LAYER_LOWER, "LayerLower", N_("_Lower Layer"), N_("Lower the current layer"), "lower_layer"), + new LayerVerb(SP_VERB_LAYER_DUPLICATE, "LayerDuplicate", N_("Duplicate Current Layer..."), + N_("Duplicate an existing layer"), 0), new LayerVerb(SP_VERB_LAYER_DELETE, "LayerDelete", N_("_Delete Current Layer"), N_("Delete the current layer"), "delete_layer"), + new LayerVerb(SP_VERB_LAYER_SOLO, "LayerSolo", N_("_Show/hide other layers"), + N_("Solo the current layer"), 0), /* Object */ new ObjectVerb(SP_VERB_OBJECT_ROTATE_90_CW, "ObjectRotate90", N_("Rotate _90° CW"), - N_("Rotate selection 90° clockwise"), "object_rotate_90_CW"), + // This is shared between tooltips and statusbar, so they + // must use UTF-8, not HTML entities for special characters. + N_("Rotate selection 90\xc2\xb0 clockwise"), "object_rotate_90_CW"), new ObjectVerb(SP_VERB_OBJECT_ROTATE_90_CCW, "ObjectRotate90CCW", N_("Rotate 9_0° CCW"), - N_("Rotate selection 90° counter-clockwise"), "object_rotate_90_CCW"), + // This is shared between tooltips and statusbar, so they + // must use UTF-8, not HTML entities for special characters. + N_("Rotate selection 90\xc2\xb0 counter-clockwise"), "object_rotate_90_CCW"), new ObjectVerb(SP_VERB_OBJECT_FLATTEN, "ObjectRemoveTransform", N_("Remove _Transformations"), N_("Remove transformations from object"), "object_reset"), new ObjectVerb(SP_VERB_OBJECT_TO_CURVE, "ObjectToPath", N_("_Object to Path"), @@ -2161,10 +2447,14 @@ Verb *Verb::_base_verbs[] = { "object_flip_ver"), new ObjectVerb(SP_VERB_OBJECT_SET_MASK, "ObjectSetMask", N_("_Set"), N_("Apply mask to selection (using the topmost object as mask)"), NULL), + new ObjectVerb(SP_VERB_OBJECT_EDIT_MASK, "ObjectEditMask", N_("_Edit"), + N_("Edit mask"), "nodeedit-mask"), new ObjectVerb(SP_VERB_OBJECT_UNSET_MASK, "ObjectUnSetMask", N_("_Release"), N_("Remove mask from selection"), NULL), new ObjectVerb(SP_VERB_OBJECT_SET_CLIPPATH, "ObjectSetClipPath", N_("_Set"), N_("Apply clipping path to selection (using the topmost object as clipping path)"), NULL), + new ObjectVerb(SP_VERB_OBJECT_EDIT_CLIPPATH, "ObjectEditClipPath", N_("_Edit"), + N_("Edit clipping path"), "nodeedit-clippath"), new ObjectVerb(SP_VERB_OBJECT_UNSET_CLIPPATH, "ObjectUnSetClipPath", N_("_Release"), N_("Remove clipping path from selection"), NULL), @@ -2172,9 +2462,13 @@ Verb *Verb::_base_verbs[] = { new ContextVerb(SP_VERB_CONTEXT_SELECT, "ToolSelector", N_("Select"), N_("Select and transform objects"), "draw_select"), new ContextVerb(SP_VERB_CONTEXT_NODE, "ToolNode", N_("Node Edit"), - N_("Edit path nodes or control handles"), "draw_node"), + N_("Edit paths by nodes"), "draw_node"), + new ContextVerb(SP_VERB_CONTEXT_TWEAK, "ToolTweak", N_("Tweak"), + N_("Tweak objects by sculpting or painting"), "draw_tweak"), new ContextVerb(SP_VERB_CONTEXT_RECT, "ToolRect", N_("Rectangle"), N_("Create rectangles and squares"), "draw_rect"), + new ContextVerb(SP_VERB_CONTEXT_3DBOX, "Tool3DBox", N_("3D Box"), + N_("Create 3D boxes"), "draw_3dbox"), new ContextVerb(SP_VERB_CONTEXT_ARC, "ToolArc", N_("Ellipse"), N_("Create circles, ellipses, and arcs"), "draw_arc"), new ContextVerb(SP_VERB_CONTEXT_STAR, "ToolStar", N_("Star"), @@ -2185,8 +2479,8 @@ Verb *Verb::_base_verbs[] = { N_("Draw freehand lines"), "draw_freehand"), new ContextVerb(SP_VERB_CONTEXT_PEN, "ToolPen", N_("Pen"), N_("Draw Bezier curves and straight lines"), "draw_pen"), - new ContextVerb(SP_VERB_CONTEXT_CALLIGRAPHIC, "ToolCalligrphic", N_("Calligraphy"), - N_("Draw calligraphic lines"), "draw_calligraphic"), + new ContextVerb(SP_VERB_CONTEXT_CALLIGRAPHIC, "ToolCalligraphic", N_("Calligraphy"), + N_("Draw calligraphic or brush strokes"), "draw_calligraphic"), new ContextVerb(SP_VERB_CONTEXT_TEXT, "ToolText", N_("Text"), N_("Create and edit text objects"), "draw_text"), new ContextVerb(SP_VERB_CONTEXT_GRADIENT, "ToolGradient", N_("Gradient"), @@ -2194,17 +2488,26 @@ Verb *Verb::_base_verbs[] = { new ContextVerb(SP_VERB_CONTEXT_ZOOM, "ToolZoom", N_("Zoom"), N_("Zoom in or out"), "draw_zoom"), new ContextVerb(SP_VERB_CONTEXT_DROPPER, "ToolDropper", N_("Dropper"), - N_("Pick averaged colors from image"), "draw_dropper"), + N_("Pick colors from image"), "draw_dropper"), new ContextVerb(SP_VERB_CONTEXT_CONNECTOR, "ToolConnector", N_("Connector"), - N_("Create connectors"), "draw_connector"), - + N_("Create diagram connectors"), "draw_connector"), + new ContextVerb(SP_VERB_CONTEXT_PAINTBUCKET, "ToolPaintBucket", N_("Paint Bucket"), + N_("Fill bounded areas"), "draw_paintbucket"), + new ContextVerb(SP_VERB_CONTEXT_LPE, "ToolLPE", N_("LPE Edit"), + N_("Edit Live Path Effect parameters"), "draw_lpe"), + new ContextVerb(SP_VERB_CONTEXT_ERASER, "ToolEraser", N_("Eraser"), + N_("Erase existing paths"), "draw_erase"), /* Tool prefs */ new ContextVerb(SP_VERB_CONTEXT_SELECT_PREFS, "SelectPrefs", N_("Selector Preferences"), N_("Open Preferences for the Selector tool"), NULL), new ContextVerb(SP_VERB_CONTEXT_NODE_PREFS, "NodePrefs", N_("Node Tool Preferences"), N_("Open Preferences for the Node tool"), NULL), + new ContextVerb(SP_VERB_CONTEXT_TWEAK_PREFS, "TweakPrefs", N_("Tweak Tool Preferences"), + N_("Open Preferences for the Tweak tool"), NULL), new ContextVerb(SP_VERB_CONTEXT_RECT_PREFS, "RectPrefs", N_("Rectangle Preferences"), N_("Open Preferences for the Rectangle tool"), NULL), + new ContextVerb(SP_VERB_CONTEXT_3DBOX_PREFS, "3DBoxPrefs", N_("3D Box Preferences"), + N_("Open Preferences for the 3D Box tool"), NULL), new ContextVerb(SP_VERB_CONTEXT_ARC_PREFS, "ArcPrefs", N_("Ellipse Preferences"), N_("Open Preferences for the Ellipse tool"), NULL), new ContextVerb(SP_VERB_CONTEXT_STAR_PREFS, "StarPrefs", N_("Star Preferences"), @@ -2227,6 +2530,10 @@ Verb *Verb::_base_verbs[] = { N_("Open Preferences for the Dropper tool"), NULL), new ContextVerb(SP_VERB_CONTEXT_CONNECTOR_PREFS, "ConnectorPrefs", N_("Connector Preferences"), N_("Open Preferences for the Connector tool"), NULL), + new ContextVerb(SP_VERB_CONTEXT_PAINTBUCKET_PREFS, "PaintBucketPrefs", N_("Paint Bucket Preferences"), + N_("Open Preferences for the Paint Bucket tool"), NULL), + new ContextVerb(SP_VERB_CONTEXT_ERASER_PREFS, "EraserPrefs", N_("Eraser Preferences"), + N_("Open Preferences for the Eraser tool"), NULL), /* Zoom/View */ new ZoomVerb(SP_VERB_ZOOM_IN, "ZoomIn", N_("Zoom In"), N_("Zoom in"), "zoom_in"), @@ -2235,6 +2542,7 @@ Verb *Verb::_base_verbs[] = { new ZoomVerb(SP_VERB_TOGGLE_SCROLLBARS, "ToggleScrollbars", N_("Scroll_bars"), N_("Show or hide the canvas scrollbars"), "scrollbars"), new ZoomVerb(SP_VERB_TOGGLE_GRID, "ToggleGrid", N_("_Grid"), N_("Show or hide the grid"), "grid"), new ZoomVerb(SP_VERB_TOGGLE_GUIDES, "ToggleGuides", N_("G_uides"), N_("Show or hide guides (drag from a ruler to create a guide)"), "guides"), + new ZoomVerb(SP_VERB_TOGGLE_SNAPPING, "ToggleSnapping", N_("Snap"), N_("Toggle snapping on or off"), NULL), new ZoomVerb(SP_VERB_ZOOM_NEXT, "ZoomNext", N_("Nex_t Zoom"), N_("Next zoom (from the history of zooms)"), "zoom_next"), new ZoomVerb(SP_VERB_ZOOM_PREV, "ZoomPrev", N_("Pre_vious Zoom"), N_("Previous zoom (from the history of zooms)"), @@ -2247,20 +2555,25 @@ Verb *Verb::_base_verbs[] = { "zoom_2_to_1"), #ifdef HAVE_GTK_WINDOW_FULLSCREEN new ZoomVerb(SP_VERB_FULLSCREEN, "FullScreen", N_("_Fullscreen"), N_("Stretch this document window to full screen"), - "fullscreen"), + "view-fullscreen"), #endif /* HAVE_GTK_WINDOW_FULLSCREEN */ new ZoomVerb(SP_VERB_VIEW_NEW, "ViewNew", N_("Duplic_ate Window"), N_("Open a new window with the same document"), - "view_new"), + "window-new"), new ZoomVerb(SP_VERB_VIEW_NEW_PREVIEW, "ViewNewPreview", N_("_New View Preview"), N_("New View Preview"), NULL/*"view_new_preview"*/), new ZoomVerb(SP_VERB_VIEW_MODE_NORMAL, "ViewModeNormal", N_("_Normal"), N_("Switch to normal display mode"), NULL), + new ZoomVerb(SP_VERB_VIEW_MODE_NO_FILTERS, "ViewModeNoFilters", N_("No _Filters"), + N_("Switch to normal display without filters"), NULL), new ZoomVerb(SP_VERB_VIEW_MODE_OUTLINE, "ViewModeOutline", N_("_Outline"), N_("Switch to outline (wireframe) display mode"), NULL), new ZoomVerb(SP_VERB_VIEW_MODE_TOGGLE, "ViewModeToggle", N_("_Toggle"), N_("Toggle between normal and outline display modes"), NULL), + new ZoomVerb(SP_VERB_VIEW_CMS_TOGGLE, "ViewCmsToggle", N_("Color-managed view"), + N_("Toggle color-managed display for this document window"), "color_management"), + new ZoomVerb(SP_VERB_VIEW_ICON_PREVIEW, "ViewIconPreview", N_("Ico_n Preview..."), N_("Open a window to preview objects at different icon resolutions"), "view_icon_preview"), new ZoomVerb(SP_VERB_ZOOM_PAGE, "ZoomPage", N_("_Page"), @@ -2280,7 +2593,7 @@ Verb *Verb::_base_verbs[] = { new DialogVerb(SP_VERB_DIALOG_METADATA, "DialogMetadata", N_("Document _Metadata..."), N_("Edit document metadata (to be saved with the document)"), "document_metadata" ), new DialogVerb(SP_VERB_DIALOG_FILL_STROKE, "DialogFillStroke", N_("_Fill and Stroke..."), - N_("Edit objects' style, such as color or stroke width"), "fill_and_stroke"), + N_("Edit objects' colors, gradients, stroke width, arrowheads, dash patterns..."), "fill_and_stroke"), // TRANSLATORS: "Swatches" means: color samples new DialogVerb(SP_VERB_DIALOG_SWATCHES, "DialogSwatches", N_("S_watches..."), N_("Select colors from a swatches palette"), GTK_STOCK_SELECT_COLOR), @@ -2302,7 +2615,6 @@ Verb *Verb::_base_verbs[] = { N_("Run scripts"), "scripts"), new DialogVerb(SP_VERB_DIALOG_TOGGLE, "DialogsToggle", N_("Show/Hide D_ialogs"), N_("Show or hide all open dialogs"), "dialog_toggle"), - // TRANSLATORS: "Tile Clones" means: "Create tiled clones" new DialogVerb(SP_VERB_DIALOG_CLONETILER, "DialogClonetiler", N_("Create Tiled Clones..."), N_("Create multiple clones of selected object, arranging them into a pattern or scattering"), "edit_create_tiled_clones"), new DialogVerb(SP_VERB_DIALOG_ITEM, "DialogObjectProperties", N_("_Object Properties..."), @@ -2313,14 +2625,20 @@ Verb *Verb::_base_verbs[] = { #endif new DialogVerb(SP_VERB_DIALOG_INPUT, "DialogInput", N_("_Input Devices..."), N_("Configure extended input devices, such as a graphics tablet"), "input_devices"), + new DialogVerb(SP_VERB_DIALOG_INPUT2, "DialogInput2", N_("_Input Devices (new)..."), + N_("Configure extended input devices, such as a graphics tablet"), "input_devices"), new DialogVerb(SP_VERB_DIALOG_EXTENSIONEDITOR, "org.inkscape.dialogs.extensioneditor", N_("_Extensions..."), N_("Query information about extensions"), NULL), new DialogVerb(SP_VERB_DIALOG_LAYERS, "DialogLayers", N_("Layer_s..."), N_("View Layers"), "layers"), + new DialogVerb(SP_VERB_DIALOG_LIVE_PATH_EFFECT, "DialogLivePathEffect", N_("Path Effects..."), + N_("Manage path effects"), NULL), + new DialogVerb(SP_VERB_DIALOG_FILTER_EFFECTS, "DialogFilterEffects", N_("Filter Effects..."), + N_("Manage SVG filter effects"), NULL), + new DialogVerb(SP_VERB_DIALOG_SVG_FONTS, "DialogSVGFonts", N_("SVG Fonts..."), + N_("Manage SVG fonts"), NULL), /* Help */ - new HelpVerb(SP_VERB_HELP_KEYS, "HelpKeys", N_("_Keys and Mouse"), - N_("Keys and mouse shortcuts reference"), "help_keys"), new HelpVerb(SP_VERB_HELP_ABOUT_EXTENSIONS, "HelpAboutExtensions", N_("About E_xtensions"), N_("Information on Inkscape extensions"), NULL), new HelpVerb(SP_VERB_HELP_MEMORY, "HelpAboutMemory", N_("About _Memory"), @@ -2360,11 +2678,37 @@ Verb *Verb::_base_verbs[] = { N_("Fit the page to the drawing"), NULL), new FitCanvasVerb(SP_VERB_FIT_CANVAS_TO_SELECTION_OR_DRAWING, "FitCanvasToSelectionOrDrawing", N_("Fit Page to Selection or Drawing"), N_("Fit the page to the current selection or the drawing if there is no selection"), NULL), + /* LockAndHide */ + new LockAndHideVerb(SP_VERB_UNLOCK_ALL, "UnlockAll", N_("Unlock All"), + N_("Unlock all objects in the current layer"), NULL), + new LockAndHideVerb(SP_VERB_UNLOCK_ALL_IN_ALL_LAYERS, "UnlockAllInAllLayers", N_("Unlock All in All Layers"), + N_("Unlock all objects in all layers"), NULL), + new LockAndHideVerb(SP_VERB_UNHIDE_ALL, "UnhideAll", N_("Unhide All"), + N_("Unhide all objects in the current layer"), NULL), + new LockAndHideVerb(SP_VERB_UNHIDE_ALL_IN_ALL_LAYERS, "UnhideAllInAllLayers", N_("Unhide All in All Layers"), + N_("Unhide all objects in all layers"), NULL), /* Footer */ new Verb(SP_VERB_LAST, " '\"invalid id", NULL, NULL, NULL) }; +void +Verb::list (void) { + // Go through the dynamic verb table + for (VerbTable::iterator iter = _verbs.begin(); iter != _verbs.end(); iter++) { + Verb * verb = iter->second; + if (verb->get_code() == SP_VERB_INVALID || + verb->get_code() == SP_VERB_NONE || + verb->get_code() == SP_VERB_LAST) { + continue; + } + + printf("%s: %s\n", verb->get_id(), verb->get_tip()? verb->get_tip() : verb->get_name()); + } + + return; +}; + } /* namespace Inkscape */ /*