summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMaximilian Albert <maximilian.albert@gmail.com>2007-12-17 14:42:10 +0000
committercilix42 <cilix42@users.sourceforge.net>2007-12-17 14:42:10 +0000
commit3441a69397c6967460b62f17bec6880c70399390 (patch)
tree53bdfd3ac4d9dda6204b60d34c2aaf7fc4c69f41 /src
parentCRLF fix (diff)
downloadinkscape-3441a69397c6967460b62f17bec6880c70399390.tar.gz
inkscape-3441a69397c6967460b62f17bec6880c70399390.zip
Use golden ratio as additional constrained ratio during Ctrl+dragging rectangles (fixes bug/RFE #170540)
(bzr r4248)
Diffstat (limited to 'src')
-rw-r--r--src/context-fns.cpp23
-rw-r--r--src/context-fns.h2
-rw-r--r--src/rect-context.cpp19
3 files changed, 40 insertions, 4 deletions
diff --git a/src/context-fns.cpp b/src/context-fns.cpp
index 8a131b081..c845fd275 100644
--- a/src/context-fns.cpp
+++ b/src/context-fns.cpp
@@ -13,6 +13,9 @@
#include "event-context.h"
#include "sp-namedview.h"
+static const double midpt_1_goldenratio = (1 + goldenratio) / 2;
+static const double midpt_goldenratio_2 = (goldenratio + 2) / 2;
+
/* FIXME: could probably use a template here */
/**
@@ -90,11 +93,25 @@ NR::Rect Inkscape::snap_rectangular_box(SPDesktop const *desktop, SPItem *item,
/* Vector from the centre of the box to the point we are dragging to */
NR::Point delta = pt - center;
- /* Round it so that we have an integer-ratio box */
+ /* Round it so that we have an integer-ratio (or golden ratio) box */
if (fabs(delta[NR::X]) > fabs(delta[NR::Y]) && (delta[NR::Y] != 0.0)) {
- delta[NR::X] = floor(delta[NR::X] / delta[NR::Y] + 0.5) * delta[NR::Y];
+ double ratio = delta[NR::X] / delta[NR::Y];
+ double ratioabs = fabs (ratio);
+ double sign = (ratio < 0 ? -1 : 1);
+ if (midpt_1_goldenratio < ratioabs && ratioabs < midpt_goldenratio_2) {
+ delta[NR::X] = sign * goldenratio * delta[NR::Y];
+ } else {
+ delta[NR::X] = floor(ratio + 0.5) * delta[NR::Y];
+ }
} else if (delta[NR::X] != 0.0) {
- delta[NR::Y] = floor(delta[NR::Y] / delta[NR::X] + 0.5) * delta[NR::X];
+ double ratio = delta[NR::Y] / delta[NR::X];
+ double ratioabs = fabs (ratio);
+ double sign = (ratio < 0 ? -1 : 1);
+ if (midpt_1_goldenratio < ratioabs && ratioabs < midpt_goldenratio_2) {
+ delta[NR::Y] = sign * goldenratio * delta[NR::X];
+ } else {
+ delta[NR::Y] = floor(delta[NR::Y] / delta[NR::X] + 0.5) * delta[NR::X];
+ }
}
/* p[1] is the dragged point with the integer-ratio constraint */
diff --git a/src/context-fns.h b/src/context-fns.h
index 522871e75..e295f8529 100644
--- a/src/context-fns.h
+++ b/src/context-fns.h
@@ -1,6 +1,8 @@
#include <gdk/gdkevents.h>
struct SPDesktop;
+const double goldenratio = 1.61803398874989484820; // golden ratio
+
namespace Inkscape
{
diff --git a/src/rect-context.cpp b/src/rect-context.cpp
index 3efc81596..5969c1fb2 100644
--- a/src/rect-context.cpp
+++ b/src/rect-context.cpp
@@ -40,6 +40,8 @@
#include "prefs-utils.h"
#include "context-fns.h"
+//static const double goldenratio = 1.61803398874989484820; // golden ratio
+
static void sp_rect_context_class_init(SPRectContextClass *klass);
static void sp_rect_context_init(SPRectContext *rect_context);
static void sp_rect_context_dispose(GObject *object);
@@ -507,14 +509,29 @@ static void sp_rect_drag(SPRectContext &rc, NR::Point const pt, guint state)
GString *ys = SP_PX_TO_METRIC_STRING(rdimy, desktop->namedview->getDefaultMetric());
if (state & GDK_CONTROL_MASK) {
int ratio_x, ratio_y;
+ bool is_golden_ratio = false;
if (fabs (rdimx) > fabs (rdimy)) {
+ if (fabs(rdimx / rdimy - goldenratio) < 1e-6) {
+ is_golden_ratio = true;
+ }
ratio_x = (int) rint (rdimx / rdimy);
ratio_y = 1;
} else {
+ if (fabs(rdimy / rdimx - goldenratio) < 1e-6) {
+ is_golden_ratio = true;
+ }
ratio_x = 1;
ratio_y = (int) rint (rdimy / rdimx);
}
- rc._message_context->setF(Inkscape::IMMEDIATE_MESSAGE, _("<b>Rectangle</b>: %s &#215; %s (constrained to ratio %d:%d); with <b>Shift</b> to draw around the starting point"), xs->str, ys->str, ratio_x, ratio_y);
+ if (!is_golden_ratio) {
+ rc._message_context->setF(Inkscape::IMMEDIATE_MESSAGE, _("<b>Rectangle</b>: %s &#215; %s (constrained to ratio %d:%d); with <b>Shift</b> to draw around the starting point"), xs->str, ys->str, ratio_x, ratio_y);
+ } else {
+ if (ratio_y == 1) {
+ rc._message_context->setF(Inkscape::IMMEDIATE_MESSAGE, _("<b>Rectangle</b>: %s &#215; %s (constrained to golden ratio 1.618 : 1); with <b>Shift</b> to draw around the starting point"), xs->str, ys->str);
+ } else {
+ rc._message_context->setF(Inkscape::IMMEDIATE_MESSAGE, _("<b>Rectangle</b>: %s &#215; %s (constrained to golden ratio 1 : 1.618); with <b>Shift</b> to draw around the starting point"), xs->str, ys->str);
+ }
+ }
} else {
rc._message_context->setF(Inkscape::IMMEDIATE_MESSAGE, _("<b>Rectangle</b>: %s &#215; %s; with <b>Ctrl</b> to make square or integer-ratio rectangle; with <b>Shift</b> to draw around the starting point"), xs->str, ys->str);
}