diff --git a/src/select-context.cpp b/src/select-context.cpp
index 0e35c6546fedb1accef8f3cd36ffdfc1125efd8b..febcc282d7b2f5a349b1cc893bd1dc948d5000f3 100644 (file)
--- a/src/select-context.cpp
+++ b/src/select-context.cpp
-#define __SP_SELECT_CONTEXT_C__
-
/*
* Selection and transformation context
*
* Authors:
* Lauris Kaplinski <lauris@kaplinski.com>
* bulia byak <buliabyak@users.sf.net>
+ * Abhishek Sharma
*
* Copyright (C) 2006 Johan Engelen <johan@shouraizou.nl>
* Copyright (C) 1999-2005 Authors
#include "seltrans.h"
#include "box3d.h"
+using Inkscape::DocumentUndo;
+
static void sp_select_context_class_init(SPSelectContextClass *klass);
static void sp_select_context_init(SPSelectContext *select_context);
static void sp_select_context_dispose(GObject *object);
event_context_class->set = sp_select_context_set;
event_context_class->root_handler = sp_select_context_root_handler;
event_context_class->item_handler = sp_select_context_item_handler;
+}
+
+static void
+sp_select_context_init(SPSelectContext *sc)
+{
+ sc->dragging = FALSE;
+ sc->moved = FALSE;
+ sc->button_press_shift = false;
+ sc->button_press_ctrl = false;
+ sc->button_press_alt = false;
+ sc->_seltrans = NULL;
+ sc->_describer = NULL;
// cursors in select context
CursorSelectMouseover = sp_cursor_new_from_xpm(cursor_select_m_xpm , 1, 1);
handles[10] = gdk_pixbuf_new_from_xpm_data((gchar const **)handle_rotate_sw_xpm);
handles[11] = gdk_pixbuf_new_from_xpm_data((gchar const **)handle_rotate_w_xpm);
handles[12] = gdk_pixbuf_new_from_xpm_data((gchar const **)handle_center_xpm);
-
-}
-
-static void
-sp_select_context_init(SPSelectContext *sc)
-{
- sc->dragging = FALSE;
- sc->moved = FALSE;
- sc->button_press_shift = false;
- sc->button_press_ctrl = false;
- sc->button_press_alt = false;
- sc->_seltrans = NULL;
- sc->_describer = NULL;
}
static void
SPDesktop *desktop = ec->desktop;
- select_context->_describer = new Inkscape::SelectionDescriber(desktop->selection, desktop->messageStack());
+ select_context->_describer = new Inkscape::SelectionDescriber(
+ desktop->selection,
+ desktop->messageStack(),
+ _("Click selection to toggle scale/rotation handles"),
+ _("No objects selected. Click, Shift+click, or drag around objects to select.")
+ );
select_context->_seltrans = new Inkscape::SelTrans(desktop);
seltrans->ungrab();
sc->moved = FALSE;
sc->dragging = FALSE;
+ sp_event_context_discard_delayed_snap_event(event_context);
drag_escaped = 1;
if (sc->item) {
// only undo if the item is still valid
if (SP_OBJECT_DOCUMENT( SP_OBJECT(sc->item))) {
- sp_document_undo(sp_desktop_document(desktop));
+ DocumentUndo::undo(sp_desktop_document(desktop));
}
sp_object_unref( SP_OBJECT(sc->item), NULL);
// NOTE: This is a workaround to a bug.
// When the ctrl key is held, sc->item is not defined
// so in this case (only), we skip the object doc check
- sp_document_undo(sp_desktop_document(desktop));
+ DocumentUndo::undo(sp_desktop_document(desktop));
}
sc->item = NULL;
@@ -325,6 +331,8 @@ sp_select_context_item_handler(SPEventContext *event_context, SPItem *item, GdkE
sc->dragging = TRUE;
sc->moved = FALSE;
+ gdk_window_set_cursor(GTK_WIDGET(sp_desktop_canvas(desktop))->window, CursorSelectDragging);
+
sp_canvas_force_full_redraw_after_interruptions(desktop->canvas, 5);
// remember the clicked item in sc->item:
@@ -360,16 +368,14 @@ sp_select_context_item_handler(SPEventContext *event_context, SPItem *item, GdkE
case GDK_ENTER_NOTIFY:
{
- if (!desktop->isWaitingCursor()) {
- GdkCursor *cursor = gdk_cursor_new(GDK_FLEUR);
- gdk_window_set_cursor(GTK_WIDGET(sp_desktop_canvas(desktop))->window, cursor);
- gdk_cursor_destroy(cursor);
+ if (!desktop->isWaitingCursor() && !sc->dragging) {
+ gdk_window_set_cursor(GTK_WIDGET(sp_desktop_canvas(desktop))->window, CursorSelectMouseover);
}
break;
}
case GDK_LEAVE_NOTIFY:
- if (!desktop->isWaitingCursor())
+ if (!desktop->isWaitingCursor() && !sc->dragging)
gdk_window_set_cursor(GTK_WIDGET(sp_desktop_canvas(desktop))->window, event_context->cursor);
break;
Inkscape::Selection *selection = sp_desktop_selection(desktop);
Inkscape::Preferences *prefs = Inkscape::Preferences::get();
- gdouble const nudge = prefs->getDoubleLimited("/options/nudgedistance/value", 2, 0, 1000); // in px
- gdouble const offset = prefs->getDoubleLimited("/options/defaultscale/value", 2, 0, 1000);
- tolerance = prefs->getIntLimited("/options/dragtolerance/value", 0, 0, 100);
- int const snaps = prefs->getInt("/options/rotationsnapsperpi/value", 12);
-
// make sure we still have valid objects to move around
if (sc->item && SP_OBJECT_DOCUMENT( SP_OBJECT(sc->item))==NULL) {
sp_select_context_abort(event_context);
desktop->setCurrentLayer(reinterpret_cast<SPObject *>(clicked_item));
sp_desktop_selection(desktop)->clear();
sc->dragging = false;
+ sp_event_context_discard_delayed_snap_event(event_context);
sp_canvas_end_forced_full_redraws(desktop->canvas);
} else { // switch tool
break;
case GDK_MOTION_NOTIFY:
- if (event->motion.state & GDK_BUTTON1_MASK && !event_context->space_panning) {
+ tolerance = prefs->getIntLimited("/options/dragtolerance/value", 0, 0, 100);
+ if (event->motion.state & GDK_BUTTON1_MASK && !event_context->space_panning) {
Geom::Point const motion_pt(event->motion.x, event->motion.y);
Geom::Point const p(desktop->w2d(motion_pt));
if (sc->button_press_ctrl || (sc->button_press_alt && !sc->button_press_shift && !selection->isEmpty())) {
// if it's not click and ctrl or alt was pressed (the latter with some selection
// but not with shift) we want to drag rather than rubberband
- sc->dragging = TRUE;
+ sc->dragging = TRUE;
+ gdk_window_set_cursor(GTK_WIDGET(sp_desktop_canvas(desktop))->window, CursorSelectDragging);
sp_canvas_force_full_redraw_after_interruptions(desktop->canvas, 5);
}
@@ -507,14 +511,16 @@ sp_select_context_root_handler(SPEventContext *event_context, GdkEvent *event)
// and also when we started within tolerance, but trespassed tolerance outside of item
Inkscape::Rubberband::get(desktop)->stop();
SP_EVENT_CONTEXT(sc)->defaultMessageContext()->clear();
- item_at_point = desktop->item_at_point(Geom::Point(event->button.x, event->button.y), FALSE);
+ item_at_point = desktop->getItemAtPoint(Geom::Point(event->button.x, event->button.y), FALSE);
if (!item_at_point) // if no item at this point, try at the click point (bug 1012200)
- item_at_point = desktop->item_at_point(Geom::Point(xp, yp), FALSE);
+ item_at_point = desktop->getItemAtPoint(Geom::Point(xp, yp), FALSE);
if (item_at_point || sc->moved || sc->button_press_alt) {
// drag only if starting from an item, or if something is already grabbed, or if alt-dragging
if (!sc->moved) {
- item_in_group = desktop->item_at_point(Geom::Point(event->button.x, event->button.y), TRUE);
- group_at_point = desktop->group_at_point(Geom::Point(event->button.x, event->button.y));
+ item_in_group = desktop->getItemAtPoint(Geom::Point(event->button.x, event->button.y), TRUE);
+ group_at_point = desktop->getGroupAtPoint(Geom::Point(event->button.x, event->button.y));
+ if (SP_IS_LAYER(selection->single()))
+ group_at_point = SP_GROUP(selection->single());
// group-at-point is meant to be topmost item if it's a group,
// not topmost group of all items at point
if (item_at_point && !selection->includes(item_at_point))
selection->set(item_at_point);
} // otherwise, do not change selection so that dragging selected-within-group items, as well as alt-dragging, is possible
- seltrans->grab(p, -1, -1, FALSE);
+ seltrans->grab(p, -1, -1, FALSE, TRUE);
sc->moved = TRUE;
}
if (!seltrans->isEmpty())
ret = TRUE;
} else {
sc->dragging = FALSE;
-
+ sp_event_context_discard_delayed_snap_event(event_context);
sp_canvas_end_forced_full_redraws(desktop->canvas);
}
} else {
seltrans->resetState();
selection->toggle(sc->item);
} else {
+ SPObject* single = selection->single();
// without shift, increase state (i.e. toggle scale/rotation handles)
if (selection->includes(sc->item)) {
seltrans->increaseState();
+ } else if (SP_IS_LAYER(single) && single->isAncestorOf(sc->item)) {
+ seltrans->increaseState();
} else {
seltrans->resetState();
selection->set(sc->item);
}
}
sc->dragging = FALSE;
-
+ gdk_window_set_cursor(GTK_WIDGET(sp_desktop_canvas(desktop))->window, CursorSelectMouseover);
+ sp_event_context_discard_delayed_snap_event(event_context);
sp_canvas_end_forced_full_redraws(desktop->canvas);
if (sc->item) {
@@ -599,15 +609,15 @@ sp_select_context_root_handler(SPEventContext *event_context, GdkEvent *event)
}
sc->item = NULL;
} else {
- Inkscape::Rubberband::Rubberband *r = Inkscape::Rubberband::get(desktop);
+ Inkscape::Rubberband *r = Inkscape::Rubberband::get(desktop);
if (r->is_started() && !within_tolerance) {
// this was a rubberband drag
GSList *items = NULL;
if (r->getMode() == RUBBERBAND_MODE_RECT) {
Geom::OptRect const b = r->getRectangle();
- items = sp_document_items_in_box(sp_desktop_document(desktop), desktop->dkey, *b);
+ items = sp_desktop_document(desktop)->getItemsInBox(desktop->dkey, *b);
} else if (r->getMode() == RUBBERBAND_MODE_TOUCHPATH) {
- items = sp_document_items_at_points(sp_desktop_document(desktop), desktop->dkey, r->getPoints());
+ items = sp_desktop_document(desktop)->getItemsAtPoints(desktop->dkey, r->getPoints());
}
seltrans->resetState();
case GDK_KEY_PRESS: // keybindings for select context
- {
- guint keyval = get_group0_keyval(&event->key);
+ {
+ {
+ guint keyval = get_group0_keyval(&event->key);
bool alt = ( MOD__ALT
|| (keyval == GDK_Alt_L)
|| (keyval == GDK_Alt_R)
@@ -719,16 +730,18 @@ sp_select_context_root_handler(SPEventContext *event_context, GdkEvent *event)
_("<b>Alt</b>: click to select under; drag to move selected or select by touch"));
// if Alt and nonempty selection, show moving cursor ("move selected"):
if (alt && !selection->isEmpty() && !desktop->isWaitingCursor()) {
- GdkCursor *cursor = gdk_cursor_new(GDK_FLEUR);
- gdk_window_set_cursor(GTK_WIDGET(sp_desktop_canvas(desktop))->window, cursor);
- gdk_cursor_destroy(cursor);
+ gdk_window_set_cursor(GTK_WIDGET(sp_desktop_canvas(desktop))->window, CursorSelectDragging);
}
//*/
break;
}
- }
+ }
+
+ gdouble const nudge = prefs->getDoubleLimited("/options/nudgedistance/value", 2, 0, 1000); // in px
+ gdouble const offset = prefs->getDoubleLimited("/options/defaultscale/value", 2, 0, 1000);
+ int const snaps = prefs->getInt("/options/rotationsnapsperpi/value", 12);
- switch (get_group0_keyval (&event->key)) {
+ switch (get_group0_keyval (&event->key)) {
case GDK_Left: // move selection left
case GDK_KP_Left:
case GDK_KP_4:
break;
}
break;
-
+ }
case GDK_KEY_RELEASE:
{
guint keyval = get_group0_keyval(&event->key);
}
}
// set cursor to default.
- if (!desktop->isWaitingCursor())
+ if (!desktop->isWaitingCursor()) {
gdk_window_set_cursor(GTK_WIDGET(sp_desktop_canvas(desktop))->window, event_context->cursor);
+ }
break;
default:
break;