Make zoom tool more gentle

This commit is contained in:
David Capello 2015-01-04 16:52:16 -03:00
parent f1f24cbcdd
commit e40d8e8cfe
3 changed files with 21 additions and 13 deletions

View File

@ -76,23 +76,16 @@ bool ZoomingState::onMouseUp(Editor* editor, MouseMessage* msg)
bool ZoomingState::onMouseMove(Editor* editor, MouseMessage* msg)
{
gfx::Point pt = (msg->position() - m_startPos);
int length = ABS(pt.x);
render::Zoom zoom = m_startZoom;
if (length > 0) {
if (pt.x > 0) {
while (length--)
zoom.in();
}
else {
while (length--)
zoom.out();
}
}
render::Zoom zoom(1, 1);
double scale = m_startZoom.scale() + pt.x / 16.0;
if (scale < 1.0)
scale = 1.0 / -(scale-2.0);
zoom = render::Zoom::fromScale(scale);
editor->setZoomAndCenterInMouse(zoom,
m_startPos, Editor::kDontCenterOnZoom);
m_moved = true;
return true;
}

View File

@ -32,4 +32,15 @@ void Zoom::out()
}
}
// static
Zoom Zoom::fromScale(double scale)
{
if (scale >= 1.0) {
return Zoom(int(scale), 1);
}
else {
return Zoom(1, int(1.0 / scale));
}
}
} // namespace render

View File

@ -16,6 +16,8 @@ namespace render {
public:
Zoom(int num, int den)
: m_num(num), m_den(den) {
ASSERT(m_num > 0);
ASSERT(m_den > 0);
}
double scale() const { return static_cast<double>(m_num) / static_cast<double>(m_den); }
@ -50,6 +52,8 @@ namespace render {
return !operator==(other);
}
static Zoom fromScale(double scale);
private:
int m_num;
int m_den;