summaryrefslogtreecommitdiffstats
path: root/src/measure-context.cpp
diff options
context:
space:
mode:
authorSebastian Wüst <sebi@timewaster.de>2013-10-20 15:32:08 +0000
committerSebastian Wüst <sebi@timewaster.de>2013-10-20 15:32:08 +0000
commit82908f949129e1fcbf62002799ee7b1b77986eed (patch)
treec02098dd7720cdf424f2793ecd3ddac2ea86b969 /src/measure-context.cpp
parentchanged text (diff)
parentFix build errors with clang 3.3 and c++11 enabled. (diff)
downloadinkscape-82908f949129e1fcbf62002799ee7b1b77986eed.tar.gz
inkscape-82908f949129e1fcbf62002799ee7b1b77986eed.zip
merge from trunk
(bzr r12417.1.24)
Diffstat (limited to 'src/measure-context.cpp')
-rw-r--r--src/measure-context.cpp164
1 files changed, 75 insertions, 89 deletions
diff --git a/src/measure-context.cpp b/src/measure-context.cpp
index dc23cf5c6..7570e36e7 100644
--- a/src/measure-context.cpp
+++ b/src/measure-context.cpp
@@ -13,7 +13,7 @@
#include <gdk/gdkkeysyms.h>
#include <boost/none_t.hpp>
-#include "helper/units.h"
+#include "util/units.h"
#include "macros.h"
#include "display/curve.h"
#include "sp-shape.h"
@@ -46,25 +46,26 @@
using Inkscape::ControlManager;
using Inkscape::CTLINE_SECONDARY;
+using Inkscape::Util::unit_table;
-static void sp_measure_context_setup(SPEventContext *ec);
-static void sp_measure_context_finish(SPEventContext *ec);
+std::vector<Inkscape::Display::TemporaryItem*> measure_tmp_items;
-static gint sp_measure_context_root_handler(SPEventContext *event_context, GdkEvent *event);
-static gint sp_measure_context_item_handler(SPEventContext *event_context, SPItem *item, GdkEvent *event);
-static gint xp = 0; // where drag started
-static gint yp = 0;
-static gint tolerance = 0;
-static bool within_tolerance = false;
+#include "tool-factory.h"
-Geom::Point start_point;
-boost::optional<Geom::Point> explicitBase;
-boost::optional<Geom::Point> lastEnd;
+namespace {
+ SPEventContext* createMeasureContext() {
+ return new SPMeasureContext();
+ }
-std::vector<Inkscape::Display::TemporaryItem*> measure_tmp_items;
+ bool measureContextRegistered = ToolFactory::instance().registerObject("/tools/measure", createMeasureContext);
+}
+
+const std::string& SPMeasureContext::getPrefsPath() {
+ return SPMeasureContext::prefsPath;
+}
-G_DEFINE_TYPE(SPMeasureContext, sp_measure_context, SP_TYPE_EVENT_CONTEXT);
+const std::string SPMeasureContext::prefsPath = "/tools/measure";
namespace
{
@@ -231,55 +232,46 @@ void createAngleDisplayCurve(SPDesktop *desktop, Geom::Point const &center, Geom
} // namespace
-static void sp_measure_context_class_init(SPMeasureContextClass *klass)
-{
- SPEventContextClass *event_context_class = reinterpret_cast<SPEventContextClass *>(klass);
- event_context_class->setup = sp_measure_context_setup;
- event_context_class->finish = sp_measure_context_finish;
+SPMeasureContext::SPMeasureContext() : SPEventContext() {
+ this->grabbed = 0;
- event_context_class->root_handler = sp_measure_context_root_handler;
- event_context_class->item_handler = sp_measure_context_item_handler;
+ this->cursor_shape = cursor_measure_xpm;
+ this->hot_x = 4;
+ this->hot_y = 4;
}
-static void sp_measure_context_init(SPMeasureContext *measure_context)
-{
- SPEventContext *event_context = SP_EVENT_CONTEXT(measure_context);
-
- event_context->cursor_shape = cursor_measure_xpm;
- event_context->hot_x = 4;
- event_context->hot_y = 4;
+SPMeasureContext::~SPMeasureContext() {
}
-static void sp_measure_context_finish(SPEventContext *ec)
-{
- SPMeasureContext *mc = SP_MEASURE_CONTEXT(ec);
+void SPMeasureContext::finish() {
+ this->enableGrDrag(false);
- ec->enableGrDrag(false);
-
- if (mc->grabbed) {
- sp_canvas_item_ungrab(mc->grabbed, GDK_CURRENT_TIME);
- mc->grabbed = NULL;
- }
-}
-
-static void sp_measure_context_setup(SPEventContext *ec)
-{
- if (SP_EVENT_CONTEXT_CLASS(sp_measure_context_parent_class)->setup) {
- SP_EVENT_CONTEXT_CLASS(sp_measure_context_parent_class)->setup(ec);
+ if (this->grabbed) {
+ sp_canvas_item_ungrab(this->grabbed, GDK_CURRENT_TIME);
+ this->grabbed = NULL;
}
}
-static gint sp_measure_context_item_handler(SPEventContext *event_context, SPItem *item, GdkEvent *event)
-{
- gint ret = FALSE;
-
- if (SP_EVENT_CONTEXT_CLASS(sp_measure_context_parent_class)->item_handler) {
- ret = SP_EVENT_CONTEXT_CLASS(sp_measure_context_parent_class)->item_handler(event_context, item, event);
- }
-
- return ret;
-}
+//void SPMeasureContext::setup() {
+// SPEventContext* ec = this;
+//
+//// if (SP_EVENT_CONTEXT_CLASS(sp_measure_context_parent_class)->setup) {
+//// SP_EVENT_CONTEXT_CLASS(sp_measure_context_parent_class)->setup(ec);
+//// }
+// SPEventContext::setup();
+//}
+
+//gint SPMeasureContext::item_handler(SPItem* item, GdkEvent* event) {
+// gint ret = FALSE;
+//
+//// if (SP_EVENT_CONTEXT_CLASS(sp_measure_context_parent_class)->item_handler) {
+//// ret = SP_EVENT_CONTEXT_CLASS(sp_measure_context_parent_class)->item_handler(event_context, item, event);
+//// }
+// ret = SPEventContext::item_handler(item, event);
+//
+// return ret;
+//}
static bool GeomPointSortPredicate(const Geom::Point& p1, const Geom::Point& p2)
{
@@ -316,23 +308,20 @@ static void calculate_intersections(SPDesktop * /*desktop*/, SPItem* item, Geom:
}
}
-static gint sp_measure_context_root_handler(SPEventContext *event_context, GdkEvent *event)
-{
- SPDesktop *desktop = event_context->desktop;
+bool SPMeasureContext::root_handler(GdkEvent* event) {
Inkscape::Preferences *prefs = Inkscape::Preferences::get();
tolerance = prefs->getIntLimited("/options/dragtolerance/value", 0, 0, 100);
- SPMeasureContext *mc = SP_MEASURE_CONTEXT(event_context);
gint ret = FALSE;
switch (event->type) {
- case GDK_BUTTON_PRESS:
- {
+ case GDK_BUTTON_PRESS: {
Geom::Point const button_w(event->button.x, event->button.y);
explicitBase = boost::none;
lastEnd = boost::none;
start_point = desktop->w2d(button_w);
- if (event->button.button == 1 && !event_context->space_panning) {
+
+ if (event->button.button == 1 && !this->space_panning) {
// save drag origin
xp = static_cast<gint>(event->button.x);
yp = static_cast<gint>(event->button.y);
@@ -349,12 +338,10 @@ static gint sp_measure_context_root_handler(SPEventContext *event_context, GdkEv
sp_canvas_item_grab(SP_CANVAS_ITEM(desktop->acetate),
GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK | GDK_BUTTON_RELEASE_MASK | GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK,
NULL, event->button.time);
- mc->grabbed = SP_CANVAS_ITEM(desktop->acetate);
+ this->grabbed = SP_CANVAS_ITEM(desktop->acetate);
break;
}
-
- case GDK_KEY_PRESS:
- {
+ case GDK_KEY_PRESS: {
if ((event->key.keyval == GDK_KEY_Shift_L) || (event->key.keyval == GDK_KEY_Shift_R)) {
if (lastEnd) {
explicitBase = lastEnd;
@@ -362,10 +349,8 @@ static gint sp_measure_context_root_handler(SPEventContext *event_context, GdkEv
}
break;
}
-
- case GDK_MOTION_NOTIFY:
- {
- if (!((event->motion.state & GDK_BUTTON1_MASK) && !event_context->space_panning)) {
+ case GDK_MOTION_NOTIFY: {
+ if (!((event->motion.state & GDK_BUTTON1_MASK) && !this->space_panning)) {
if (!(event->motion.state & GDK_SHIFT_MASK)) {
Geom::Point const motion_w(event->motion.x, event->motion.y);
Geom::Point const motion_dt(desktop->w2d(motion_w));
@@ -396,6 +381,7 @@ static gint sp_measure_context_root_handler(SPEventContext *event_context, GdkEv
for (size_t idx = 0; idx < measure_tmp_items.size(); ++idx) {
desktop->remove_temporary_canvasitem(measure_tmp_items[idx]);
}
+
measure_tmp_items.clear();
Geom::Point const motion_w(event->motion.x, event->motion.y);
@@ -403,7 +389,7 @@ static gint sp_measure_context_root_handler(SPEventContext *event_context, GdkEv
Geom::Point end_point = motion_dt;
if (event->motion.state & GDK_CONTROL_MASK) {
- spdc_endpoint_snap_rotation(event_context, end_point, start_point, event->motion.state);
+ spdc_endpoint_snap_rotation(this, end_point, start_point, event->motion.state);
} else {
if (!(event->motion.state & GDK_SHIFT_MASK)) {
SnapManager &m = desktop->namedview->snap_manager;
@@ -416,7 +402,6 @@ static gint sp_measure_context_root_handler(SPEventContext *event_context, GdkEv
}
}
-
Geom::PathVector lineseg;
Geom::Path p;
p.start(desktop->dt2doc(start_point));
@@ -434,6 +419,7 @@ static gint sp_measure_context_root_handler(SPEventContext *event_context, GdkEv
baseAngle = atan2(deltay2, deltax2);
angle -= baseAngle;
+
if (angle < -M_PI) {
angle += 2 * M_PI;
} else if (angle > M_PI) {
@@ -446,6 +432,7 @@ static gint sp_measure_context_root_handler(SPEventContext *event_context, GdkEv
#define NPOINTS 800
std::vector<Geom::Point> points;
+
for (double i = 0; i < NPOINTS; i++) {
points.push_back(desktop->d2w(start_point + (i / NPOINTS) * (end_point - start_point)));
}
@@ -494,7 +481,6 @@ static gint sp_measure_context_root_handler(SPEventContext *event_context, GdkEv
}
curve->transform(item->i2doc_affine());
- Geom::PathVector pathv = curve->get_pathvector();
calculate_intersections(desktop, item, lineseg, curve, intersections);
@@ -515,8 +501,10 @@ static gint sp_measure_context_root_handler(SPEventContext *event_context, GdkEv
std::sort(intersections.begin(), intersections.end(), GeomPointSortPredicate);
}
- SPUnitId unitid = static_cast<SPUnitId>(prefs->getInt("/tools/measure/unitid", SP_UNIT_PX));
- SPUnit unit = sp_unit_get_by_id(unitid);
+ Glib::ustring unit_name = prefs->getString("/tools/measure/unit");
+ if (!unit_name.compare("")) {
+ unit_name = "px";
+ }
double fontsize = prefs->getInt("/tools/measure/fontsize");
@@ -527,7 +515,7 @@ static gint sp_measure_context_root_handler(SPEventContext *event_context, GdkEv
for (size_t idx = 1; idx < intersections.size(); ++idx) {
LabelPlacement placement;
placement.lengthVal = (intersections[idx] - intersections[idx - 1]).length();
- sp_convert_distance(&placement.lengthVal, &sp_unit_get_by_id(SP_UNIT_PX), &unit);
+ placement.lengthVal = Inkscape::Util::Quantity::convert(placement.lengthVal, "px", unit_name);
placement.offset = DIMENSION_OFFSET;
placement.start = desktop->doc2dt( (intersections[idx - 1] + intersections[idx]) / 2 );
placement.end = placement.start - (normal * placement.offset);
@@ -543,7 +531,7 @@ static gint sp_measure_context_root_handler(SPEventContext *event_context, GdkEv
LabelPlacement &place = *it;
// TODO cleanup memory, Glib::ustring, etc.:
- gchar *measure_str = g_strdup_printf("%.2f %s", place.lengthVal, unit.abbr);
+ gchar *measure_str = g_strdup_printf("%.2f %s", place.lengthVal, unit_name.c_str());
SPCanvasText *canvas_tooltip = sp_canvastext_new(sp_desktop_tempgroup(desktop),
desktop,
place.end,
@@ -584,10 +572,10 @@ static gint sp_measure_context_root_handler(SPEventContext *event_context, GdkEv
{
double totallengthval = (end_point - start_point).length();
- sp_convert_distance(&totallengthval, &sp_unit_get_by_id(SP_UNIT_PX), &unit);
+ totallengthval = Inkscape::Util::Quantity::convert(totallengthval, "px", unit_name);
// TODO cleanup memory, Glib::ustring, etc.:
- gchar *totallength_str = g_strdup_printf("%.2f %s", totallengthval, unit.abbr);
+ gchar *totallength_str = g_strdup_printf("%.2f %s", totallengthval, unit_name.c_str());
SPCanvasText *canvas_tooltip = sp_canvastext_new(sp_desktop_tempgroup(desktop),
desktop,
end_point + desktop->w2d(Geom::Point(3*fontsize, -fontsize)),
@@ -605,10 +593,10 @@ static gint sp_measure_context_root_handler(SPEventContext *event_context, GdkEv
if (intersections.size() > 2) {
double totallengthval = (intersections[intersections.size()-1] - intersections[0]).length();
- sp_convert_distance(&totallengthval, &sp_unit_get_by_id(SP_UNIT_PX), &unit);
+ totallengthval = Inkscape::Util::Quantity::convert(totallengthval, "px", unit_name);
// TODO cleanup memory, Glib::ustring, etc.:
- gchar *total_str = g_strdup_printf("%.2f %s", totallengthval, unit.abbr);
+ gchar *total_str = g_strdup_printf("%.2f %s", totallengthval, unit_name.c_str());
SPCanvasText *canvas_tooltip = sp_canvastext_new(sp_desktop_tempgroup(desktop),
desktop,
desktop->doc2dt((intersections[0] + intersections[intersections.size()-1])/2) + normal * 60,
@@ -738,10 +726,8 @@ static gint sp_measure_context_root_handler(SPEventContext *event_context, GdkEv
}
break;
}
-
- case GDK_BUTTON_RELEASE:
- {
- sp_event_context_discard_delayed_snap_event(event_context);
+ case GDK_BUTTON_RELEASE: {
+ sp_event_context_discard_delayed_snap_event(this);
explicitBase = boost::none;
lastEnd = boost::none;
@@ -749,12 +735,14 @@ static gint sp_measure_context_root_handler(SPEventContext *event_context, GdkEv
for (size_t idx = 0; idx < measure_tmp_items.size(); ++idx) {
desktop->remove_temporary_canvasitem(measure_tmp_items[idx]);
}
+
measure_tmp_items.clear();
- if (mc->grabbed) {
- sp_canvas_item_ungrab(mc->grabbed, event->button.time);
- mc->grabbed = NULL;
+ if (this->grabbed) {
+ sp_canvas_item_ungrab(this->grabbed, event->button.time);
+ this->grabbed = NULL;
}
+
xp = 0;
yp = 0;
break;
@@ -764,9 +752,7 @@ static gint sp_measure_context_root_handler(SPEventContext *event_context, GdkEv
}
if (!ret) {
- if (SP_EVENT_CONTEXT_CLASS(sp_measure_context_parent_class)->root_handler) {
- ret = SP_EVENT_CONTEXT_CLASS(sp_measure_context_parent_class)->root_handler(event_context, event);
- }
+ ret = SPEventContext::root_handler(event);
}
return ret;