Remove all "infinite scroll" stuff to avoid changing mouse position (fixes #350)

Changing the mouse position isn't user-friendly in desktop apps, and
has several problems in some platforms (Mac OS X). In this way we've
changed the approach to handle the mouse position when it goes outside
the ui::Editor viewport.
This commit is contained in:
David Capello 2014-08-25 22:49:19 -03:00
parent 8e44e0fbab
commit 58b3e09d86
11 changed files with 20 additions and 103 deletions

View File

@ -31,7 +31,6 @@
<vbox id="section_editor"> <vbox id="section_editor">
<separator text="Editor" horizontal="true" /> <separator text="Editor" horizontal="true" />
<check text="Zoom with Scroll Wheel" id="wheel_zoom" /> <check text="Zoom with Scroll Wheel" id="wheel_zoom" />
<check text="Smooth auto-scroll" id="smooth" />
<check text="Show scroll-bars in sprite editor" id="show_scrollbars" tooltip="Show scroll-bars in all sprite editors." /> <check text="Show scroll-bars in sprite editor" id="show_scrollbars" tooltip="Show scroll-bars in all sprite editors." />
<hbox> <hbox>
<label text="Right-click:" /> <label text="Right-click:" />

View File

@ -71,9 +71,6 @@ public:
pixelGridColorBox()->addChild(m_pixelGridColor); pixelGridColorBox()->addChild(m_pixelGridColor);
// Others // Others
if (get_config_bool("Options", "MoveSmooth", true))
smooth()->setSelected(true);
if (get_config_bool("Options", "AutoShowTimeline", true)) if (get_config_bool("Options", "AutoShowTimeline", true))
autotimeline()->setSelected(true); autotimeline()->setSelected(true);
@ -144,7 +141,6 @@ public:
m_docSettings->setGridColor(m_gridColor->getColor()); m_docSettings->setGridColor(m_gridColor->getColor());
m_docSettings->setPixelGridColor(m_pixelGridColor->getColor()); m_docSettings->setPixelGridColor(m_pixelGridColor->getColor());
set_config_bool("Options", "MoveSmooth", smooth()->isSelected());
set_config_bool("Options", "AutoShowTimeline", autotimeline()->isSelected()); set_config_bool("Options", "AutoShowTimeline", autotimeline()->isSelected());
m_settings->setShowSpriteEditorScrollbars(showScrollbars()->isSelected()); m_settings->setShowSpriteEditorScrollbars(showScrollbars()->isSelected());

View File

@ -132,7 +132,7 @@ bool DrawingState::onMouseMove(Editor* editor, MouseMessage* msg)
editor->hideDrawingCursor(); editor->hideDrawingCursor();
// Infinite scroll // Infinite scroll
gfx::Point mousePos = editor->controlInfiniteScroll(msg); gfx::Point mousePos = editor->autoScroll(msg);
// Hide the cursor again // Hide the cursor again
editor->hideDrawingCursor(); editor->hideDrawingCursor();

View File

@ -705,31 +705,24 @@ void Editor::flashCurrentLayer()
#endif #endif
} }
gfx::Point Editor::controlInfiniteScroll(MouseMessage* msg) gfx::Point Editor::autoScroll(MouseMessage* msg)
{ {
View* view = View::getView(this); View* view = View::getView(this);
gfx::Rect vp = view->getViewportBounds(); gfx::Rect vp = view->getViewportBounds();
gfx::Point mousePos = msg->position(); gfx::Point mousePos = msg->position();
gfx::Point delta = ui::get_delta_outside_box(vp, mousePos); if (!vp.contains(mousePos)) {
if (delta != gfx::Point(0, 0)) {
// Scrolling-by-steps (non-smooth), this is better for high
// resolutions: scroll movement by big steps.
if (!get_config_bool("Options", "MoveSmooth", true)) {
gfx::Point newPos = mousePos;
if (delta.x != 0) newPos.x = (mousePos.x-delta.x+(vp.x+vp.w/2))/2;
if (delta.y != 0) newPos.y = (mousePos.y-delta.y+(vp.y+vp.h/2))/2;
delta = mousePos - newPos;
}
mousePos.x -= delta.x;
mousePos.y -= delta.y;
ui::set_mouse_position(mousePos);
gfx::Point scroll = view->getViewScroll(); gfx::Point scroll = view->getViewScroll();
scroll += delta; scroll += (mousePos - m_oldPos);
setEditorScroll(scroll.x, scroll.y, true); setEditorScroll(scroll.x, scroll.y, true);
m_oldPos = mousePos;
mousePos = gfx::Point(
MID(vp.x, mousePos.x, vp.x+vp.w-1),
MID(vp.y, mousePos.y, vp.y+vp.h-1));
} }
else
m_oldPos = mousePos;
return mousePos; return mousePos;
} }

View File

@ -165,8 +165,8 @@ namespace app {
void updateStatusBar(); void updateStatusBar();
// Control scroll when cursor goes out of the editor. // Control scroll when cursor goes out of the editor viewport.
gfx::Point controlInfiniteScroll(ui::MouseMessage* msg); gfx::Point autoScroll(ui::MouseMessage* msg);
tools::Tool* getCurrentEditorTool(); tools::Tool* getCurrentEditorTool();
tools::Ink* getCurrentEditorInk(); tools::Ink* getCurrentEditorInk();

View File

@ -252,7 +252,7 @@ bool MovingPixelsState::onMouseMove(Editor* editor, MouseMessage* msg)
// If there is a button pressed // If there is a button pressed
if (m_pixelsMovement->isDragging()) { if (m_pixelsMovement->isDragging()) {
// Infinite scroll // Infinite scroll
gfx::Point mousePos = editor->controlInfiniteScroll(msg); gfx::Point mousePos = editor->autoScroll(msg);
// Get the position of the mouse in the sprite // Get the position of the mouse in the sprite
int x, y; int x, y;

View File

@ -62,15 +62,11 @@ bool ScrollingState::onMouseMove(Editor* editor, MouseMessage* msg)
{ {
View* view = View::getView(editor); View* view = View::getView(editor);
gfx::Point scroll = view->getViewScroll(); gfx::Point scroll = view->getViewScroll();
gfx::Point newPos = msg->position(); gfx::Point newPos = msg->position();
scroll -= newPos - m_oldPos;
m_oldPos = newPos;
scroll += m_oldPos - newPos;
editor->setEditorScroll(scroll.x, scroll.y, true); editor->setEditorScroll(scroll.x, scroll.y, true);
gfx::Rect vp = view->getViewportBounds();
m_oldPos = ui::control_infinite_scroll(editor, vp, newPos);
return true; return true;
} }

View File

@ -445,10 +445,10 @@ bool Timeline::onProcessMessage(Message* msg)
case STATE_SCROLLING: { case STATE_SCROLLING: {
gfx::Point absMousePos = static_cast<MouseMessage*>(msg)->position(); gfx::Point absMousePos = static_cast<MouseMessage*>(msg)->position();
setScroll( setScroll(
m_scroll_x + m_oldPos.x - absMousePos.x, m_scroll_x - (absMousePos.x - m_oldPos.x),
m_scroll_y + m_oldPos.y - absMousePos.y); m_scroll_y - (absMousePos.y - m_oldPos.y));
m_oldPos = ui::control_infinite_scroll(this, getBounds(), absMousePos); m_oldPos = absMousePos;
return true; return true;
} }

View File

@ -354,19 +354,6 @@ gfx::Point get_mouse_position()
return gfx::Point(jmouse_x(0), jmouse_y(0)); return gfx::Point(jmouse_x(0), jmouse_y(0));
} }
void set_mouse_position(const gfx::Point& newPos)
{
moved = true;
if (mouse_display)
mouse_display->setMousePosition(newPos);
update_mouse_position(newPos);
m_x[1] = m_x[0];
m_y[1] = m_y[0];
}
MouseButtons jmouse_b(int antique) MouseButtons jmouse_b(int antique)
{ {
return (MouseButtons)m_b[antique & 1]; return (MouseButtons)m_b[antique & 1];
@ -376,56 +363,6 @@ int jmouse_x(int antique) { return m_x[antique & 1]; }
int jmouse_y(int antique) { return m_y[antique & 1]; } int jmouse_y(int antique) { return m_y[antique & 1]; }
int jmouse_z(int antique) { return m_z[antique & 1]; } int jmouse_z(int antique) { return m_z[antique & 1]; }
gfx::Point get_delta_outside_box(const gfx::Rect& rect, const gfx::Point& mousePoint)
{
gfx::Point delta(0, 0);
if (mousePoint.x < rect.x)
delta.x = mousePoint.x - rect.x;
else if (mousePoint.x >= rect.x+rect.w)
delta.x = mousePoint.x - (rect.x+rect.w);
if (mousePoint.y < rect.y)
delta.y = mousePoint.y - rect.y;
else if (mousePoint.y > rect.y+rect.h)
delta.y = mousePoint.y - (rect.y+rect.h);
return delta;
}
gfx::Point control_infinite_scroll(Widget* widget, const gfx::Rect& rect, const gfx::Point& mousePoint)
{
gfx::Point newPoint = mousePoint;
gfx::Point delta = get_delta_outside_box(rect, newPoint);
if (delta.x < 0) {
newPoint.x = rect.x+rect.w+delta.x;
if (newPoint.x < rect.x)
newPoint.x = rect.x;
}
else if (delta.x > 0) {
newPoint.x = rect.x+delta.x;
if (newPoint.x >= rect.x+rect.w)
newPoint.x = rect.x+rect.w-1;
}
if (delta.y < 0) {
newPoint.y = rect.y+rect.h+delta.y;
if (newPoint.y < rect.y)
newPoint.y = rect.y;
}
else if (delta.y > 0) {
newPoint.y = rect.y+delta.y;
if (newPoint.y >= rect.y+rect.h)
newPoint.y = rect.y+rect.h-1;
}
if (mousePoint != newPoint)
ui::set_mouse_position(newPoint);
return newPoint;
}
static void update_mouse_position(const gfx::Point& pt) static void update_mouse_position(const gfx::Point& pt)
{ {
m_x[0] = pt.x; m_x[0] = pt.x;

View File

@ -63,16 +63,12 @@ namespace ui {
void _internal_set_mouse_buttons(MouseButtons buttons); void _internal_set_mouse_buttons(MouseButtons buttons);
gfx::Point get_mouse_position(); gfx::Point get_mouse_position();
void set_mouse_position(const gfx::Point& newPos);
MouseButtons jmouse_b(int antique); MouseButtons jmouse_b(int antique);
int jmouse_x(int antique); int jmouse_x(int antique);
int jmouse_y(int antique); int jmouse_y(int antique);
int jmouse_z(int antique); int jmouse_z(int antique);
gfx::Point get_delta_outside_box(const gfx::Rect& rect, const gfx::Point& mousePoint);
gfx::Point control_infinite_scroll(Widget* widget, const gfx::Rect& rect, const gfx::Point& mousePoint);
} // namespace ui } // namespace ui
#endif #endif

View File

@ -114,7 +114,7 @@ bool TextBox::onProcessMessage(Message* msg)
scroll += m_oldPos - newPos; scroll += m_oldPos - newPos;
view->setViewScroll(scroll); view->setViewScroll(scroll);
m_oldPos = ui::control_infinite_scroll(this, vp, newPos); m_oldPos = newPos;
} }
break; break;
} }