summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJabiertxof <jabier.arraiza@marker.es>2018-11-10 16:14:35 +0000
committerJabier Arraiza <jabier.arraiza@marker.es>2018-12-01 16:17:15 +0000
commitb178486308886f52dce6f628f49060211312edcf (patch)
tree528b8f888864f06602d5d6b2518fe8ac9c1f34df /src
parentAllow to redraw on drag (diff)
downloadinkscape-b178486308886f52dce6f628f49060211312edcf.tar.gz
inkscape-b178486308886f52dce6f628f49060211312edcf.zip
working on events
Diffstat (limited to 'src')
-rw-r--r--src/display/sp-canvas.cpp85
-rw-r--r--src/display/sp-canvas.h2
2 files changed, 78 insertions, 9 deletions
diff --git a/src/display/sp-canvas.cpp b/src/display/sp-canvas.cpp
index 1df261875..f987a4ddf 100644
--- a/src/display/sp-canvas.cpp
+++ b/src/display/sp-canvas.cpp
@@ -616,6 +616,10 @@ int sp_canvas_item_grab(SPCanvasItem *item, guint event_mask, GdkCursor *cursor,
return -1;
}
+ /* if (item->canvas->_oversplit) {
+ return -1;
+ } */
+
// This test disallows grabbing events by an invisible item, which may be useful
// sometimes. An example is the hidden control point used for the selector component,
// where it is used for object selection and rubberbanding. There seems to be nothing
@@ -982,6 +986,7 @@ static void sp_canvas_init(SPCanvas *canvas)
canvas->_forced_redraw_limit = -1;
canvas->_oversplit = false;
canvas->_spliter = Geom::OptIntRect();
+ canvas->_splitpressed = false;
#if defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2)
canvas->_enable_cms_display_adj = false;
@@ -1243,18 +1248,41 @@ int SPCanvas::emitEvent(GdkEvent *event)
// offsets of the fields in the event structures.
GdkEvent *ev = gdk_event_copy(event);
-
+ static unsigned next_canvas_doubleclick = 0;
switch (ev->type) {
case GDK_ENTER_NOTIFY:
case GDK_LEAVE_NOTIFY:
ev->crossing.x += _x0;
ev->crossing.y += _y0;
break;
- case GDK_MOTION_NOTIFY:
+ /* case GDK_MOTION_NOTIFY:
+ ev->motion.x += _x0;
+ ev->motion.y += _y0;
+ break;
case GDK_BUTTON_PRESS:
+ next_canvas_doubleclick = 0;
+ ev->motion.x += _x0;
+ ev->motion.y += _y0;
+ break;
case GDK_2BUTTON_PRESS:
+ next_canvas_doubleclick = ev->button.button;
+ ev->motion.x += _x0;
+ ev->motion.y += _y0;
+ break;
case GDK_3BUTTON_PRESS:
+ ev->motion.x += _x0;
+ ev->motion.y += _y0;
+ break;
case GDK_BUTTON_RELEASE:
+ if (next_canvas_doubleclick) {
+ GdkEventButton* event2 = reinterpret_cast<GdkEventButton*>(event);
+ handle_doubleclick(GTK_WIDGET(this), event2);
+ } */
+ case GDK_MOTION_NOTIFY:
+ case GDK_BUTTON_PRESS:
+ case GDK_2BUTTON_PRESS:
+ case GDK_3BUTTON_PRESS:
+ case GDK_BUTTON_RELEASE:
ev->motion.x += _x0;
ev->motion.y += _y0;
break;
@@ -1439,6 +1467,30 @@ int SPCanvas::pickCurrentItem(GdkEvent *event)
return retval;
}
+gint SPCanvas::handle_doubleclick(GtkWidget *widget, GdkEventButton *event) {
+ SPCanvas *canvas = SP_CANVAS (widget);
+ if(canvas->_oversplit) {
+ std::cout << "aaaaaaaaaaaaaaaaaaaaa" << std::endl;
+ Inkscape::Preferences *prefs = Inkscape::Preferences::get();
+ bool inverse = prefs->getBool("/window/splitcanvas/inverse", false);
+ bool vertical = prefs->getBool("/window/splitcanvas/vertical", true);
+ if(!inverse && vertical) {
+ prefs->setBool("/window/splitcanvas/vertical", false);
+ } else if (!inverse && !vertical) {
+ prefs->setBool("/window/splitcanvas/vertical", true);
+ prefs->setBool("/window/splitcanvas/inverse", true);
+ } else if (inverse && vertical) {
+ prefs->setBool("/window/splitcanvas/vertical", false);
+ } else {
+ prefs->setBool("/window/splitcanvas/vertical", true);
+ prefs->setBool("/window/splitcanvas/inverse", false);
+ }
+ canvas->dirtyAll();
+ canvas->paint();
+ }
+ return 0;
+}
+
gint SPCanvas::handle_button(GtkWidget *widget, GdkEventButton *event)
{
SPCanvas *canvas = SP_CANVAS (widget);
@@ -1480,7 +1532,11 @@ gint SPCanvas::handle_button(GtkWidget *widget, GdkEventButton *event)
// then process the event.
//
canvas->_state = event->state;
- canvas->pickCurrentItem(reinterpret_cast<GdkEvent *>(event));
+ if (!canvas->_oversplit) {
+ canvas->pickCurrentItem(reinterpret_cast<GdkEvent *>(event));
+ } else {
+ canvas->_splitpressed = true;
+ }
canvas->_state ^= mask;
retval = canvas->emitEvent((GdkEvent *) event);
break;
@@ -1489,11 +1545,14 @@ gint SPCanvas::handle_button(GtkWidget *widget, GdkEventButton *event)
// Process the event as if the button were pressed, then repick
// after the button has been released
//
+ canvas->_splitpressed = false;
canvas->_state = event->state;
retval = canvas->emitEvent((GdkEvent *) event);
event->state ^= mask;
canvas->_state = event->state;
- canvas->pickCurrentItem(reinterpret_cast<GdkEvent *>(event));
+ //if (!canvas->_oversplit) {
+ canvas->pickCurrentItem(reinterpret_cast<GdkEvent *>(event));
+ //}
event->state ^= mask;
break;
@@ -1533,10 +1592,11 @@ int SPCanvas::handle_motion(GtkWidget *widget, GdkEventMotion *event)
Geom::IntPoint cursor_pos = Geom::IntPoint(event->x,event->y);
GdkDisplay *display = gdk_display_get_default();
+ Inkscape::Preferences *prefs = Inkscape::Preferences::get();
+ bool vertical = prefs->getBool("/window/splitcanvas/vertical", true);
+
if (canvas->_spliter && (*canvas->_spliter).contains(cursor_pos) && !canvas->_is_dragging) {
if (!canvas->_oversplit) {
- Inkscape::Preferences *prefs = Inkscape::Preferences::get();
- bool vertical = prefs->getBool("/window/splitcanvas/vertical", true);
GdkCursor *cursor = nullptr;
if(vertical) {
cursor = gdk_cursor_new_from_name (display, "ew-resize");
@@ -1549,7 +1609,7 @@ int SPCanvas::handle_motion(GtkWidget *widget, GdkEventMotion *event)
}
}
canvas->_oversplit = true;
- std::cout << "overoverover" << std::endl;
+ std::cout << *canvas->_spliter << "----" << canvas->_splitpressed << "overoverover" << std::endl;
} else {
if (canvas->_oversplit) {
GdkCursorType cursor_type = GDK_HAND1;
@@ -1561,6 +1621,12 @@ int SPCanvas::handle_motion(GtkWidget *widget, GdkEventMotion *event)
}
canvas->_oversplit = false;
}
+ /* if (canvas->_splitpressed) {
+ GtkAllocation allocation;
+ gtk_widget_get_allocation(GTK_WIDGET(canvas), &allocation);
+ guint value = vertical ? 1/(allocation.width/cursor_pos[Geom::X]) : 1/(allocation.height/cursor_pos[Geom::Y]);
+ prefs->setDouble("/window/splitcanvas/value", value);
+ } */
canvas->_state = event->state;
canvas->pickCurrentItem(reinterpret_cast<GdkEvent *>(event));
status = canvas->emitEvent(reinterpret_cast<GdkEvent *>(event));
@@ -1999,7 +2065,7 @@ int SPCanvas::paint()
Geom::IntCoord coord2y = allocation.y + (int(allocation.height * split_y)) + 1 - hruler_gap;
_spliter = Geom::OptIntRect(coord1x, coord1y, coord2x, coord2y);
} else {
- canvas->_spliter = Geom::OptIntRect();
+ _spliter = Geom::OptIntRect();
}
cairo_rectangle_int_t crect = { _x0, _y0, int(allocation.width * split_x), int(allocation.height * split_y)};
cairo_rectangle_int_t crect_outline = { _x0 + int(allocation.width * (1-split_x)), _y0 + int(allocation.height * (1-split_y)), int(allocation.width * split_x), int(allocation.height * split_y)};
@@ -2195,7 +2261,8 @@ void SPCanvas::scrollTo( Geom::Point const &c, unsigned int clear, bool is_scrol
_y0 = iy;
// Adjust the clean region
- if (clear || _spliter) {
+ //if (clear || _spliter) {
+ if (clear ) {
dirtyAll();
} else {
cairo_rectangle_int_t crect = { _x0, _y0, allocation.width, allocation.height };
diff --git a/src/display/sp-canvas.h b/src/display/sp-canvas.h
index 05443cb85..64fd77896 100644
--- a/src/display/sp-canvas.h
+++ b/src/display/sp-canvas.h
@@ -151,6 +151,7 @@ public:
static void handle_get_preferred_height(GtkWidget *widget, gint *min_h, gint *nat_h);
static void handle_size_allocate(GtkWidget *widget, GtkAllocation *allocation);
static gint handle_button(GtkWidget *widget, GdkEventButton *event);
+ static gint handle_doubleclick(GtkWidget *widget, GdkEventButton *event);
/**
* Scroll event handler for the canvas.
@@ -175,6 +176,7 @@ public:
bool _is_dragging;
bool _oversplit;
+ bool _splitpressed;
Geom::OptIntRect _spliter;
double _dx0;
double _dy0;