Code

Filter effects dialog:
[inkscape.git] / src / verbs.cpp
index 172b5220c321fd070d76a2827129e26e04ede083..5a05407762a7d4f3e8f262f4fad141c44345a07c 100644 (file)
 #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"
 
 
 /**
@@ -1262,7 +1265,13 @@ ObjectVerb::perform( SPAction *action, void *data, void *pdata )
     if (!bbox) {
         return;
     }
-    NR::Point const center(bbox->midpoint());
+    // 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<std::size_t>(data)) {
         case SP_VERB_OBJECT_ROTATE_90_CW:
@@ -1287,8 +1296,23 @@ ObjectVerb::perform( SPAction *action, void *data, void *pdata )
             flowtext_to_text();
             break;
         case SP_VERB_OBJECT_FLIP_HORIZONTAL:
+            // When working with the node tool ...
             if (tools_isactive(dt, TOOLS_NODES)) {
-                SP_NODE_CONTEXT(ec)->shape_editor->flip(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));
             }
@@ -1296,8 +1320,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_NODE_CONTEXT(ec)->shape_editor->flip(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));
             }
@@ -1358,6 +1388,9 @@ ContextVerb::perform(SPAction *action, void *data, void *pdata)
         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;
@@ -1407,6 +1440,10 @@ ContextVerb::perform(SPAction *action, void *data, void *pdata)
             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");
@@ -1483,6 +1520,7 @@ ZoomVerb::perform(SPAction *action, void *data, void *pdata)
     SPDesktop *dt = static_cast<SPDesktop*>(sp_action_get_view(action));
     if (!dt)
         return;
+    SPEventContext *ec = dt->event_context;
 
     SPDocument *doc = sp_desktop_document(dt);
 
@@ -1495,12 +1533,32 @@ ZoomVerb::perform(SPAction *action, void *data, void *pdata)
     switch (GPOINTER_TO_INT(data)) {
         case SP_VERB_ZOOM_IN:
         {
+            // 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 (sp_curve_last_bpath(rc)) {
+                    NR::Point const zoom_to (sp_curve_last_point(rc));
+                    dt->zoom_relative_keep_point(zoom_to, zoom_inc);
+                    break;
+                }
+            }
+
             NR::Rect const d = dt->get_display_area();
             dt->zoom_relative( d.midpoint()[NR::X], d.midpoint()[NR::Y], zoom_inc);
             break;
         }
         case SP_VERB_ZOOM_OUT:
         {
+            // 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 (sp_curve_last_bpath(rc)) {
+                    NR::Point const zoom_to (sp_curve_last_point(rc));
+                    dt->zoom_relative_keep_point(zoom_to, 1 / 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 );
             break;
@@ -1551,7 +1609,6 @@ ZoomVerb::perform(SPAction *action, void *data, void *pdata)
             sp_namedview_toggle_guides(doc, repr);
             break;
         case SP_VERB_TOGGLE_GRID:
-            sp_namedview_toggle_grid(doc, repr);
             dt->toggleGrid();
             break;
 #ifdef HAVE_GTK_WINDOW_FULLSCREEN
@@ -1612,6 +1669,7 @@ DialogVerb::perform(SPAction *action, void *data, void *pdata)
             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);
@@ -1667,6 +1725,9 @@ DialogVerb::perform(SPAction *action, void *data, void *pdata)
         case SP_VERB_DIALOG_LAYERS:
             show_panel( Inkscape::UI::Dialogs::LayersPanel::getInstance(), "dialogs.layers", SP_VERB_DIALOG_LAYERS );
             break;
+        case SP_VERB_DIALOG_FILTER_EFFECTS:
+            dt->_dlg_mgr->showDialog("FilterEffectsDialog");
+            break;
         default:
             break;
     }
@@ -2293,6 +2354,8 @@ Verb *Verb::_base_verbs[] = {
                     N_("Edit path nodes or control handles"), "draw_node"),
     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"),
@@ -2303,7 +2366,7 @@ 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"),
+    new ContextVerb(SP_VERB_CONTEXT_CALLIGRAPHIC, "ToolCalligraphic", N_("Calligraphy"),
                     N_("Draw calligraphic lines"), "draw_calligraphic"),
     new ContextVerb(SP_VERB_CONTEXT_TEXT, "ToolText", N_("Text"),
                     N_("Create and edit text objects"), "draw_text"),
@@ -2325,6 +2388,8 @@ Verb *Verb::_base_verbs[] = {
                     N_("Open Preferences for the Node 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"),
@@ -2438,6 +2503,8 @@ Verb *Verb::_base_verbs[] = {
                    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_FILTER_EFFECTS, "DialogFilterEffects", N_("Filter Effects..."),
+                   N_("Manage SVG filter effects"), NULL),
 
     /* Help */
     new HelpVerb(SP_VERB_HELP_KEYS, "HelpKeys", N_("_Keys and Mouse"),