X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;ds=inline;f=src%2Fverbs.cpp;h=1fb179660fe4187188e66c802f8195ae706a0466;hb=278a51c395d23b0b26988eebe801e7438c952810;hp=8d19bda550a6a20ce50c22d15c4aa69dde72c83c;hpb=2197aaeb5cbd6bb675e264602fc92b2d613be298;p=inkscape.git diff --git a/src/verbs.cpp b/src/verbs.cpp index 8d19bda55..1fb179660 100644 --- a/src/verbs.cpp +++ b/src/verbs.cpp @@ -17,18 +17,20 @@ * David Turner * bulia byak * + * Copyright (C) 2006 Johan Engelen + * Copyright (C) (date unspecified) Authors * This code is in public domain. */ - - -#include - #ifdef HAVE_CONFIG_H # include "config.h" #endif +#include +#include +#include + #include "helper/action.h" #include @@ -37,7 +39,6 @@ #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" @@ -53,6 +54,7 @@ #endif #include "extension/effect.h" +#include "bind/javabind.h" #include "tools-switch.h" #include "inkscape-private.h" @@ -74,6 +76,13 @@ #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" /** @@ -100,44 +109,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 { @@ -346,7 +319,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; @@ -395,7 +368,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; @@ -641,7 +614,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); } } @@ -654,6 +627,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) @@ -662,8 +641,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); } } } @@ -774,7 +753,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 @@ -782,40 +761,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(*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; @@ -832,16 +823,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)) { @@ -884,6 +875,12 @@ 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_DELETE: sp_selection_delete(); break; @@ -896,9 +893,15 @@ 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_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; @@ -910,39 +913,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(sp_desktop_document(dt)); + break; + + case SP_VERB_EDIT_NEXT_PATHEFFECT_PARAMETER: + sp_selection_next_patheffect_param(dt); + break; default: break; } @@ -951,13 +984,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(); @@ -1028,9 +1063,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: @@ -1043,6 +1080,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: @@ -1056,6 +1094,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: @@ -1066,7 +1105,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); @@ -1088,11 +1127,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, - /* TODO: annotate */ "verbs.cpp:1077"); - 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; } @@ -1100,11 +1139,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, - /* TODO: annotate */ "verbs.cpp:1089"); - 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; } @@ -1151,19 +1190,19 @@ LayerVerb::perform(SPAction *action, void *data, void *pdata) switch (verb) { case SP_VERB_LAYER_TO_TOP: message = g_strdup_printf(_("Raised layer %s."), layer->defaultLabel()); - description = _("Layer to Top"); + description = _("Layer to top"); break; case SP_VERB_LAYER_RAISE: message = g_strdup_printf(_("Raised layer %s."), layer->defaultLabel()); - description = _("Raise Layer"); + description = _("Raise layer"); break; case SP_VERB_LAYER_TO_BOTTOM: message = g_strdup_printf(_("Lowered layer %s."), layer->defaultLabel()); - description = _("Layer to Bottom"); + description = _("Layer to bottom"); break; case SP_VERB_LAYER_LOWER: message = g_strdup_printf(_("Lowered layer %s."), layer->defaultLabel()); - description = _("Lower Layer"); + description = _("Lower layer"); break; }; sp_document_done(sp_desktop_document(dt), verb, description); @@ -1199,7 +1238,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." @@ -1216,7 +1255,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) @@ -1229,7 +1268,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: @@ -1251,11 +1300,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)); } @@ -1263,8 +1327,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)); } @@ -1274,12 +1344,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; @@ -1291,7 +1367,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; @@ -1307,7 +1383,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) { @@ -1322,9 +1398,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; @@ -1358,6 +1440,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); @@ -1367,10 +1455,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"); @@ -1415,6 +1511,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; @@ -1424,7 +1528,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) @@ -1435,14 +1539,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); @@ -1455,14 +1560,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->last_bpath()) { + 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->last_bpath()) { + 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: @@ -1510,8 +1639,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: @@ -1527,23 +1659,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 @@ -1567,10 +1709,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"); @@ -1586,12 +1728,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"); @@ -1607,19 +1752,28 @@ 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; default: break; @@ -1628,25 +1782,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; } @@ -1658,6 +1806,7 @@ HelpVerb::perform(SPAction *action, void *data, void *pdata) */ case SP_VERB_HELP_MEMORY: + inkscape_dialogs_unhide(); dt->_dlg_mgr->showDialog("Memory"); break; default: @@ -1667,7 +1816,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: @@ -1826,7 +1975,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. */ @@ -1839,9 +1988,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; @@ -1896,13 +2044,13 @@ 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); @@ -1922,8 +2070,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" */ @@ -1943,19 +2163,21 @@ Verb *Verb::_base_verbs[] = { GTK_STOCK_SAVE ), new FileVerb(SP_VERB_FILE_SAVE_AS, "FileSaveAs", N_("Save _As..."), N_("Save document under a new name"), GTK_STOCK_SAVE_AS ), + new FileVerb(SP_VERB_FILE_SAVE_A_COPY, "FileSaveACopy", N_("Save a Cop_y..."), + N_("Save a copy of the document under a new name"), NULL ), new FileVerb(SP_VERB_FILE_PRINT, "FilePrint", N_("_Print..."), N_("Print document"), GTK_STOCK_PRINT ), // 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"), @@ -1991,6 +2213,10 @@ 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_DELETE, "EditDelete", N_("_Delete"), N_("Delete selection"), GTK_STOCK_DELETE), new EditVerb(SP_VERB_EDIT_DUPLICATE, "EditDuplicate", N_("Duplic_ate"), @@ -1999,8 +2225,14 @@ Verb *Verb::_base_verbs[] = { 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_("Select the object to which the selected clone is linked"), 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), @@ -2012,13 +2244,21 @@ Verb *Verb::_base_verbs[] = { new EditVerb(SP_VERB_EDIT_SELECT_ALL, "EditSelectAll", N_("Select Al_l"), N_("Select all objects or all nodes"), "selection_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"), NULL), + 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)"), NULL), + 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"), NULL), + 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"), @@ -2035,13 +2275,13 @@ Verb *Verb::_base_verbs[] = { N_("Ungroup selected groups"), "selection_ungroup"), new SelectionVerb(SP_VERB_SELECTION_TEXTTOPATH, "SelectionTextToPath", N_("_Put on Path"), - N_("Put text on path"), NULL), + N_("Put text on path"), "put_on_path"), new SelectionVerb(SP_VERB_SELECTION_TEXTFROMPATH, "SelectionTextFromPath", N_("_Remove from Path"), - N_("Remove text from path"), NULL), + N_("Remove text from path"), "remove_from_path"), new SelectionVerb(SP_VERB_SELECTION_REMOVE_KERNS, "SelectionTextRemoveKerns", N_("Remove Manual _Kerns"), // TRANSLATORS: "glyph": An image used in the visual representation of characters; // roughly speaking, how a character looks. A font is a set of glyphs. - N_("Remove all manual kerns and glyph rotations from a text object"), NULL), + N_("Remove all manual kerns and glyph rotations from a text object"), "remove_manual_kerns"), new SelectionVerb(SP_VERB_SELECTION_UNION, "SelectionUnion", N_("_Union"), N_("Create union of selected paths"), "union"), @@ -2102,8 +2342,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"), @@ -2130,19 +2370,23 @@ Verb *Verb::_base_verbs[] = { /* 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"), N_("Convert selected object to path"), "object_tocurve"), new ObjectVerb(SP_VERB_OBJECT_FLOW_TEXT, "ObjectFlowText", N_("_Flow into Frame"), - N_("Put text into a frame (path or shape), creating a flowed text linked to the frame object"), NULL), + N_("Put text into a frame (path or shape), creating a flowed text linked to the frame object"), "flow_into_frame"), new ObjectVerb(SP_VERB_OBJECT_UNFLOW_TEXT, "ObjectUnFlowText", N_("_Unflow"), - N_("Remove text from frame (creates a single-line text object)"), NULL), + N_("Remove text from frame (creates a single-line text object)"), "unflow"), new ObjectVerb(SP_VERB_OBJECT_FLOWTEXT_TO_TEXT, "ObjectFlowtextToText", N_("_Convert to Text"), - N_("Convert flowed text to regular text object (preserves appearance)"), NULL), + N_("Convert flowed text to regular text object (preserves appearance)"), "convert_to_text"), new ObjectVerb(SP_VERB_OBJECT_FLIP_HORIZONTAL, "ObjectFlipHorizontally", N_("Flip _Horizontal"), N_("Flip selected objects horizontally"), "object_flip_hor"), @@ -2151,10 +2395,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), @@ -2162,9 +2410,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"), @@ -2175,8 +2427,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"), @@ -2184,17 +2436,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"), @@ -2217,6 +2478,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"), @@ -2225,6 +2490,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)"), @@ -2246,11 +2512,18 @@ Verb *Verb::_base_verbs[] = { 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"), NULL/*"view_icon_preview"*/), + N_("Open a window to preview objects at different icon resolutions"), "view_icon_preview"), new ZoomVerb(SP_VERB_ZOOM_PAGE, "ZoomPage", N_("_Page"), N_("Zoom to fit page in window"), "zoom_page"), new ZoomVerb(SP_VERB_ZOOM_PAGE_WIDTH, "ZoomPageWidth", N_("Page _Width"), @@ -2266,9 +2539,9 @@ Verb *Verb::_base_verbs[] = { new DialogVerb(SP_VERB_DIALOG_NAMEDVIEW, "DialogDocumentProperties", N_("_Document Properties..."), N_("Edit properties of this document (to be saved with the document)"), GTK_STOCK_PROPERTIES ), new DialogVerb(SP_VERB_DIALOG_METADATA, "DialogMetadata", N_("Document _Metadata..."), - N_("Edit document metadata (to be saved with the document)"), NULL ), + 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), @@ -2285,14 +2558,13 @@ Verb *Verb::_base_verbs[] = { new DialogVerb(SP_VERB_DIALOG_FIND, "DialogFind", N_("_Find..."), N_("Find objects in document"), GTK_STOCK_FIND ), new DialogVerb(SP_VERB_DIALOG_DEBUG, "DialogDebug", N_("_Messages..."), - N_("View debug messages"), NULL), + N_("View debug messages"), "messages"), new DialogVerb(SP_VERB_DIALOG_SCRIPT, "DialogScript", N_("S_cripts..."), - N_("Run scripts"), NULL), + 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"), NULL), + 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..."), N_("Edit the ID, locked and visible status, and other object properties"), "dialog_item_properties"), #ifdef WITH_INKBOARD @@ -2300,19 +2572,23 @@ Verb *Verb::_base_verbs[] = { N_("_Instant Messaging..."), N_("Jabber Instant Messaging Client"), NULL), #endif new DialogVerb(SP_VERB_DIALOG_INPUT, "DialogInput", N_("_Input Devices..."), - N_("Configure extended input devices, such as a graphics tablet"), NULL), + 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"), NULL), + 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), /* 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"), - N_("Memory usage information"), NULL), + N_("Memory usage information"), "about_memory"), new HelpVerb(SP_VERB_HELP_ABOUT, "HelpAbout", N_("_About Inkscape"), N_("Inkscape version, authors, license"), /*"help_about"*/"inkscape_options"), //new HelpVerb(SP_VERB_SHOW_LICENSE, "ShowLicense", N_("_License"), @@ -2348,11 +2624,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 */ /*