summaryrefslogtreecommitdiffstats
path: root/src/display
diff options
context:
space:
mode:
authorJabiertxof <jabier.arraiza@marker.es>2018-11-14 12:10:13 +0000
committerJabier Arraiza <jabier.arraiza@marker.es>2018-12-01 16:17:15 +0000
commitd804ebac2eeb9a1ff52746fc0300a473af3b025f (patch)
treeab2f1ab95537df74dcf9ce0b21c664fed151a2a9 /src/display
parentAdd some Martin fixes and UX improvements (diff)
downloadinkscape-d804ebac2eeb9a1ff52746fc0300a473af3b025f.tar.gz
inkscape-d804ebac2eeb9a1ff52746fc0300a473af3b025f.zip
Allow drag controller on split
Diffstat (limited to 'src/display')
-rw-r--r--src/display/sp-canvas.cpp35
-rw-r--r--src/display/sp-canvas.h3
2 files changed, 32 insertions, 6 deletions
diff --git a/src/display/sp-canvas.cpp b/src/display/sp-canvas.cpp
index d61489863..e6823a86c 100644
--- a/src/display/sp-canvas.cpp
+++ b/src/display/sp-canvas.cpp
@@ -53,7 +53,7 @@ using Inkscape::Debug::GdkEventLatencyTracker;
// gtk_check_version returns non-NULL on failure
static bool const HAS_BROKEN_MOTION_HINTS =
true || gtk_check_version(2, 12, 0) != nullptr;
-
+
// Define this to visualize the regions to be redrawn
//#define DEBUG_REDRAW 1;
@@ -992,7 +992,10 @@ static void sp_canvas_init(SPCanvas *canvas)
canvas->_spliter_left = Geom::OptIntRect();
canvas->_splitpressed = false;
canvas->_splitdragging = false;
+ canvas->_splitcontrolpressed = false;
canvas->_changecursor = 0;
+ canvas->_splitercontolpos = Geom::Point();
+ canvas->_spliterincontrolpos = Geom::Point();
#if defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2)
canvas->_enable_cms_display_adj = false;
@@ -1501,6 +1504,11 @@ gint SPCanvas::handle_button(GtkWidget *widget, GdkEventButton *event)
retval = canvas->emitEvent((GdkEvent *) event);
} else {
canvas->_splitpressed = true;
+ Geom::IntPoint cursor_pos = Geom::IntPoint(event->x,event->y);
+ canvas->_spliterincontrolpos = cursor_pos - (*canvas->_spliter_control).midpoint();
+ if (canvas->_spliter && canvas->_spliter_control.contains(cursor_pos) && !canvas->_is_dragging) {
+ canvas->_splitcontrolpressed = true;
+ }
retval = TRUE;
}
break;
@@ -1549,25 +1557,33 @@ gint SPCanvas::handle_button(GtkWidget *widget, GdkEventButton *event)
bool spliter_clicked = false;
bool reset = false;
if (!canvas->_splitdragging) {
+ GtkAllocation allocation;
+ gtk_widget_get_allocation(GTK_WIDGET(canvas), &allocation);
+ Geom::Point pos = canvas->_splitercontolpos;
+ double value = vertical ? 1/(allocation.height/(double)pos[Geom::Y]) : 1/(allocation.width/(double)pos[Geom::X]) ;
if(canvas->_oversplit_vertical) {
prefs->setBool("/window/splitcanvas/inverse", !inverse);
prefs->setBool("/window/splitcanvas/vertical", false);
- reset = vertical? true: false;
spliter_clicked = true;
+ reset = vertical? true: false;
+ if (reset) {
+ prefs->setDouble("/window/splitcanvas/value", value);
+ }
} else if (canvas->_oversplit_horizontal) {
prefs->setBool("/window/splitcanvas/inverse", !inverse);
prefs->setBool("/window/splitcanvas/vertical", true);
- reset = !vertical? true: false;
spliter_clicked = true;
- }
- if (spliter_clicked) {
+ reset = !vertical? true: false;
if (reset) {
- prefs->setDouble("/window/splitcanvas/value", 0.5);
+ prefs->setDouble("/window/splitcanvas/value", value);
}
+ }
+ if (spliter_clicked) {
canvas->dirtyAll();
canvas->addIdle();
}
}
+ canvas->_splitcontrolpressed = false;
canvas->_splitdragging = false;
} else {
canvas->_state = event->state;
@@ -1707,6 +1723,9 @@ int SPCanvas::handle_motion(GtkWidget *widget, GdkEventMotion *event)
}
} else {
prefs->setDouble("/window/splitcanvas/value", value);
+ if (canvas->_splitcontrolpressed && !canvas->_is_dragging) {
+ canvas->_splitercontolpos = cursor_pos - canvas->_spliterincontrolpos;
+ }
}
canvas->dirtyAll();
canvas->addIdle();
@@ -1857,6 +1876,10 @@ void SPCanvas::paintSpliter()
Geom::Point start = vertical ? Geom::middle_point(c0, c1) : Geom::middle_point(c0, c3) ;
Geom::Point end = vertical ? Geom::middle_point(c2, c3) : Geom::middle_point(c1, c2) ;
Geom::Point middle = Geom::middle_point(start, end) ;
+ if(canvas->_splitercontolpos != Geom::Point()) {
+ middle[Geom::X] = vertical ? middle[Geom::X] : canvas->_splitercontolpos[Geom::X];
+ middle[Geom::Y] = vertical ? canvas->_splitercontolpos[Geom::Y] : middle[Geom::Y];
+ }
canvas->_spliter_control = Geom::OptIntRect(Geom::IntPoint(int(middle[0] - (25 * ds)), int(middle[1] - (25 * ds))), Geom::IntPoint(int(middle[0] + (25 * ds)), int(middle[1] + (25 * ds))));
canvas->_spliter_top = Geom::OptIntRect(Geom::IntPoint(int(middle[0] - (25 * ds)), int(middle[1] - (25 * ds))), Geom::IntPoint(int(middle[0] + (25 * ds)), int(middle[1] - (10 * ds))));
canvas->_spliter_bottom = Geom::OptIntRect(Geom::IntPoint(int(middle[0] - (25 * ds)), int(middle[1] + (25 * ds))), Geom::IntPoint(int(middle[0] + (25 * ds)), int(middle[1] + (10 * ds))));
diff --git a/src/display/sp-canvas.h b/src/display/sp-canvas.h
index d58a93dc0..d86c0136a 100644
--- a/src/display/sp-canvas.h
+++ b/src/display/sp-canvas.h
@@ -188,7 +188,10 @@ public:
bool _is_dragging;
bool _oversplit;
bool _splitpressed;
+ bool _splitcontrolpressed;
bool _splitdragging;
+ Geom::Point _splitercontolpos;
+ Geom::Point _spliterincontrolpos;
guint _changecursor;
double _dx0;
double _dy0;