summaryrefslogtreecommitdiffstats
path: root/src/select-context.cpp
diff options
context:
space:
mode:
authorJabier Arraiza Cenoz <jabier.arraiza@marker.es>2013-05-06 00:57:18 +0000
committerJabiertxo Arraiza Zenotz <jtx@jtx.marker.es>2013-05-06 00:57:18 +0000
commit658579b7ba73d404953808a0b399c747d7724804 (patch)
tree8032e88a23b043b876e19eb7ac99663ff96d0a4e /src/select-context.cpp
parentRemoved auto select nodes, not decide for the user. Added auto update all sel... (diff)
parentFix for 1171434 : trunk: INX <optiongroup> broken^ (diff)
downloadinkscape-658579b7ba73d404953808a0b399c747d7724804.tar.gz
inkscape-658579b7ba73d404953808a0b399c747d7724804.zip
update to trunk
(bzr r11950.1.112)
Diffstat (limited to 'src/select-context.cpp')
-rw-r--r--src/select-context.cpp128
1 files changed, 83 insertions, 45 deletions
diff --git a/src/select-context.cpp b/src/select-context.cpp
index 9a88bcf20..1dd3b08d7 100644
--- a/src/select-context.cpp
+++ b/src/select-context.cpp
@@ -26,6 +26,7 @@
#include "document-undo.h"
#include "selection.h"
#include "sp-cursor.h"
+#include "style.h"
#include "pixmaps/cursor-select-m.xpm"
#include "pixmaps/cursor-select-d.xpm"
#include "pixmaps/handles.xpm"
@@ -57,6 +58,7 @@ static void sp_select_context_setup(SPEventContext *ec);
static void sp_select_context_set(SPEventContext *ec, Inkscape::Preferences::Entry *val);
static gint sp_select_context_root_handler(SPEventContext *event_context, GdkEvent *event);
static gint sp_select_context_item_handler(SPEventContext *event_context, SPItem *item, GdkEvent *event);
+static void sp_select_context_reset_opacities(SPEventContext *event_context);
static GdkCursor *CursorSelectMouseover = NULL;
static GdkCursor *CursorSelectDragging = NULL;
@@ -68,6 +70,10 @@ static gint drag_escaped = 0; // if non-zero, drag was canceled by esc
static gint xp = 0, yp = 0; // where drag started
static gint tolerance = 0;
static bool within_tolerance = false;
+static bool is_cycling = false;
+static bool moved_while_cycling = false;
+SPEventContext *prev_event_context = NULL;
+
G_DEFINE_TYPE(SPSelectContext, sp_select_context, SP_TYPE_EVENT_CONTEXT);
@@ -534,6 +540,11 @@ sp_select_context_root_handler(SPEventContext *event_context, GdkEvent *event)
case GDK_MOTION_NOTIFY:
{
+ if (is_cycling)
+ {
+ moved_while_cycling = true;
+ prev_event_context = event_context;
+ }
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);
@@ -765,6 +776,15 @@ sp_select_context_root_handler(SPEventContext *event_context, GdkEvent *event)
GdkEventScroll *scroll_event = (GdkEventScroll*) event;
if (scroll_event->state & GDK_MOD1_MASK) { // alt modified pressed
+ if (moved_while_cycling)
+ {
+ moved_while_cycling = false;
+ sp_select_context_reset_opacities(prev_event_context);
+ prev_event_context = NULL;
+ }
+
+ is_cycling = true;
+
bool shift_pressed = scroll_event->state & GDK_SHIFT_MASK;
/* Rebuild list of items underneath the mouse pointer */
@@ -840,6 +860,13 @@ sp_select_context_root_handler(SPEventContext *event_context, GdkEvent *event)
sp_select_context_cycle_through_items(sc, selection, scroll_event, shift_pressed);
ret = TRUE;
+
+ GtkWindow *w =GTK_WINDOW(gtk_widget_get_toplevel( GTK_WIDGET(desktop->canvas) ));
+ if (w)
+ {
+ gtk_window_present(w);
+ gtk_widget_grab_focus (GTK_WIDGET(desktop->canvas));
+ }
}
break;
}
@@ -849,7 +876,7 @@ sp_select_context_root_handler(SPEventContext *event_context, GdkEvent *event)
{
{
guint keyval = get_group0_keyval(&event->key);
- bool alt = ( MOD__ALT
+ bool alt = ( MOD__ALT(event)
|| (keyval == GDK_KEY_Alt_L)
|| (keyval == GDK_KEY_Alt_R)
|| (keyval == GDK_KEY_Meta_L)
@@ -890,15 +917,15 @@ sp_select_context_root_handler(SPEventContext *event_context, GdkEvent *event)
switch (get_group0_keyval (&event->key)) {
case GDK_KEY_Left: // move selection left
case GDK_KEY_KP_Left:
- if (!MOD__CTRL) { // not ctrl
+ if (!MOD__CTRL(event)) { // not ctrl
gint mul = 1 + gobble_key_events(
get_group0_keyval(&event->key), 0); // with any mask
- if (MOD__ALT) { // alt
- if (MOD__SHIFT) sp_selection_move_screen(desktop, mul*-10, 0); // shift
+ if (MOD__ALT(event)) { // alt
+ if (MOD__SHIFT(event)) sp_selection_move_screen(desktop, mul*-10, 0); // shift
else sp_selection_move_screen(desktop, mul*-1, 0); // no shift
}
else { // no alt
- if (MOD__SHIFT) sp_selection_move(desktop, mul*-10*nudge, 0); // shift
+ if (MOD__SHIFT(event)) sp_selection_move(desktop, mul*-10*nudge, 0); // shift
else sp_selection_move(desktop, mul*-nudge, 0); // no shift
}
ret = TRUE;
@@ -906,15 +933,15 @@ sp_select_context_root_handler(SPEventContext *event_context, GdkEvent *event)
break;
case GDK_KEY_Up: // move selection up
case GDK_KEY_KP_Up:
- if (!MOD__CTRL) { // not ctrl
+ if (!MOD__CTRL(event)) { // not ctrl
gint mul = 1 + gobble_key_events(
get_group0_keyval(&event->key), 0); // with any mask
- if (MOD__ALT) { // alt
- if (MOD__SHIFT) sp_selection_move_screen(desktop, 0, mul*10); // shift
+ if (MOD__ALT(event)) { // alt
+ if (MOD__SHIFT(event)) sp_selection_move_screen(desktop, 0, mul*10); // shift
else sp_selection_move_screen(desktop, 0, mul*1); // no shift
}
else { // no alt
- if (MOD__SHIFT) sp_selection_move(desktop, 0, mul*10*nudge); // shift
+ if (MOD__SHIFT(event)) sp_selection_move(desktop, 0, mul*10*nudge); // shift
else sp_selection_move(desktop, 0, mul*nudge); // no shift
}
ret = TRUE;
@@ -922,15 +949,15 @@ sp_select_context_root_handler(SPEventContext *event_context, GdkEvent *event)
break;
case GDK_KEY_Right: // move selection right
case GDK_KEY_KP_Right:
- if (!MOD__CTRL) { // not ctrl
+ if (!MOD__CTRL(event)) { // not ctrl
gint mul = 1 + gobble_key_events(
get_group0_keyval(&event->key), 0); // with any mask
- if (MOD__ALT) { // alt
- if (MOD__SHIFT) sp_selection_move_screen(desktop, mul*10, 0); // shift
+ if (MOD__ALT(event)) { // alt
+ if (MOD__SHIFT(event)) sp_selection_move_screen(desktop, mul*10, 0); // shift
else sp_selection_move_screen(desktop, mul*1, 0); // no shift
}
else { // no alt
- if (MOD__SHIFT) sp_selection_move(desktop, mul*10*nudge, 0); // shift
+ if (MOD__SHIFT(event)) sp_selection_move(desktop, mul*10*nudge, 0); // shift
else sp_selection_move(desktop, mul*nudge, 0); // no shift
}
ret = TRUE;
@@ -938,15 +965,15 @@ sp_select_context_root_handler(SPEventContext *event_context, GdkEvent *event)
break;
case GDK_KEY_Down: // move selection down
case GDK_KEY_KP_Down:
- if (!MOD__CTRL) { // not ctrl
+ if (!MOD__CTRL(event)) { // not ctrl
gint mul = 1 + gobble_key_events(
get_group0_keyval(&event->key), 0); // with any mask
- if (MOD__ALT) { // alt
- if (MOD__SHIFT) sp_selection_move_screen(desktop, 0, mul*-10); // shift
+ if (MOD__ALT(event)) { // alt
+ if (MOD__SHIFT(event)) sp_selection_move_screen(desktop, 0, mul*-10); // shift
else sp_selection_move_screen(desktop, 0, mul*-1); // no shift
}
else { // no alt
- if (MOD__SHIFT) sp_selection_move(desktop, 0, mul*-10*nudge); // shift
+ if (MOD__SHIFT(event)) sp_selection_move(desktop, 0, mul*-10*nudge); // shift
else sp_selection_move(desktop, 0, mul*-nudge); // no shift
}
ret = TRUE;
@@ -960,7 +987,7 @@ sp_select_context_root_handler(SPEventContext *event_context, GdkEvent *event)
case GDK_KEY_a:
case GDK_KEY_A:
- if (MOD__CTRL_ONLY) {
+ if (MOD__CTRL_ONLY(event)) {
sp_edit_select_all(desktop);
ret = TRUE;
}
@@ -975,17 +1002,17 @@ sp_select_context_root_handler(SPEventContext *event_context, GdkEvent *event)
break;
case GDK_KEY_x:
case GDK_KEY_X:
- if (MOD__ALT_ONLY) {
+ if (MOD__ALT_ONLY(event)) {
desktop->setToolboxFocusTo ("altx");
ret = TRUE;
}
break;
case GDK_KEY_bracketleft:
- if (MOD__ALT) {
+ if (MOD__ALT(event)) {
gint mul = 1 + gobble_key_events(
get_group0_keyval(&event->key), 0); // with any mask
sp_selection_rotate_screen(selection, mul*1);
- } else if (MOD__CTRL) {
+ } else if (MOD__CTRL(event)) {
sp_selection_rotate(selection, 90);
} else if (snaps) {
sp_selection_rotate(selection, 180.0/snaps);
@@ -993,11 +1020,11 @@ sp_select_context_root_handler(SPEventContext *event_context, GdkEvent *event)
ret = TRUE;
break;
case GDK_KEY_bracketright:
- if (MOD__ALT) {
+ if (MOD__ALT(event)) {
gint mul = 1 + gobble_key_events(
get_group0_keyval(&event->key), 0); // with any mask
sp_selection_rotate_screen(selection, -1*mul);
- } else if (MOD__CTRL) {
+ } else if (MOD__CTRL(event)) {
sp_selection_rotate(selection, -90);
} else if (snaps) {
sp_selection_rotate(selection, -180.0/snaps);
@@ -1006,11 +1033,11 @@ sp_select_context_root_handler(SPEventContext *event_context, GdkEvent *event)
break;
case GDK_KEY_less:
case GDK_KEY_comma:
- if (MOD__ALT) {
+ if (MOD__ALT(event)) {
gint mul = 1 + gobble_key_events(
get_group0_keyval(&event->key), 0); // with any mask
sp_selection_scale_screen(selection, -2*mul);
- } else if (MOD__CTRL) {
+ } else if (MOD__CTRL(event)) {
sp_selection_scale_times(selection, 0.5);
} else {
gint mul = 1 + gobble_key_events(
@@ -1021,11 +1048,11 @@ sp_select_context_root_handler(SPEventContext *event_context, GdkEvent *event)
break;
case GDK_KEY_greater:
case GDK_KEY_period:
- if (MOD__ALT) {
+ if (MOD__ALT(event)) {
gint mul = 1 + gobble_key_events(
get_group0_keyval(&event->key), 0); // with any mask
sp_selection_scale_screen(selection, 2*mul);
- } else if (MOD__CTRL) {
+ } else if (MOD__CTRL(event)) {
sp_selection_scale_times(selection, 2);
} else {
gint mul = 1 + gobble_key_events(
@@ -1035,7 +1062,7 @@ sp_select_context_root_handler(SPEventContext *event_context, GdkEvent *event)
ret = TRUE;
break;
case GDK_KEY_Return:
- if (MOD__CTRL_ONLY) {
+ if (MOD__CTRL_ONLY(event)) {
if (selection->singleItem()) {
SPItem *clicked_item = selection->singleItem();
if ( SP_IS_GROUP(clicked_item) ||
@@ -1050,14 +1077,14 @@ sp_select_context_root_handler(SPEventContext *event_context, GdkEvent *event)
}
break;
case GDK_KEY_BackSpace:
- if (MOD__CTRL_ONLY) {
+ if (MOD__CTRL_ONLY(event)) {
sp_select_context_up_one_layer(desktop);
ret = TRUE;
}
break;
case GDK_KEY_s:
case GDK_KEY_S:
- if (MOD__SHIFT_ONLY) {
+ if (MOD__SHIFT_ONLY(event)) {
if (!selection->isEmpty()) {
seltrans->increaseState();
}
@@ -1066,7 +1093,7 @@ sp_select_context_root_handler(SPEventContext *event_context, GdkEvent *event)
break;
case GDK_KEY_g:
case GDK_KEY_G:
- if (MOD__SHIFT_ONLY) {
+ if (MOD__SHIFT_ONLY(event)) {
sp_selection_to_guides(desktop);
ret = true;
}
@@ -1082,7 +1109,7 @@ sp_select_context_root_handler(SPEventContext *event_context, GdkEvent *event)
if (key_is_a_modifier (keyval))
event_context->defaultMessageContext()->clear();
- bool alt = ( MOD__ALT
+ bool alt = ( MOD__ALT(event)
|| (keyval == GDK_KEY_Alt_L)
|| (keyval == GDK_KEY_Alt_R)
|| (keyval == GDK_KEY_Meta_L)
@@ -1096,19 +1123,11 @@ sp_select_context_root_handler(SPEventContext *event_context, GdkEvent *event)
} else {
if (alt) { // TODO: Should we have a variable like is_cycling or is it harmless to run this piece of code each time?
// quit cycle-selection and reset opacities
- SPSelectContext *sc = SP_SELECT_CONTEXT(event_context);
- Inkscape::DrawingItem *arenaitem;
- for (GList *l = sc->cycling_items; l != NULL; l = g_list_next(l)) {
- arenaitem = SP_ITEM(l->data)->get_arenaitem(desktop->dkey);
- arenaitem->setOpacity(1.0);
- }
- g_list_free(sc->cycling_items);
- g_list_free(sc->cycling_items_selected_before);
- g_list_free(sc->cycling_items_cmp);
- sc->cycling_items = NULL;
- sc->cycling_items_selected_before = NULL;
- sc->cycling_cur_item = NULL;
- sc->cycling_items_cmp = NULL;
+ if (is_cycling)
+ {
+ sp_select_context_reset_opacities(event_context);
+ is_cycling = false;
+ }
}
}
@@ -1132,6 +1151,25 @@ sp_select_context_root_handler(SPEventContext *event_context, GdkEvent *event)
return ret;
}
+static void
+sp_select_context_reset_opacities(SPEventContext *event_context)
+{
+ // SPDesktop *desktop = event_context->desktop;
+ SPSelectContext *sc = SP_SELECT_CONTEXT(event_context);
+ Inkscape::DrawingItem *arenaitem;
+ for (GList *l = sc->cycling_items; l != NULL; l = g_list_next(l)) {
+ arenaitem = SP_ITEM(l->data)->get_arenaitem(event_context->desktop->dkey);
+ arenaitem->setOpacity(SP_SCALE24_TO_FLOAT(SP_ITEM(l->data)->style->opacity.value));
+ }
+ g_list_free(sc->cycling_items);
+ g_list_free(sc->cycling_items_selected_before);
+ g_list_free(sc->cycling_items_cmp);
+ sc->cycling_items = NULL;
+ sc->cycling_items_selected_before = NULL;
+ sc->cycling_cur_item = NULL;
+ sc->cycling_items_cmp = NULL;
+}
+
/*
Local Variables: