|
From: Tapio V. <aa...@us...> - 2011-02-08 08:45:09
|
Module: editor
Branch: master
Commit: 388fe6dd8e930a4e806c1b21d61642c1d151613e
Author: Tapio Vierros <tap...@gm...>
Date: Tue Feb 8 10:44:32 2011 +0200
Zooming now maintains the viewport position.
---
notegraphwidget.cc | 6 +++---
notelabelmanager.cc | 35 ++++++++++++++++++++++++++++++++---
2 files changed, 35 insertions(+), 6 deletions(-)
diff --git a/notegraphwidget.cc b/notegraphwidget.cc
index a616f24..b3b0e90 100644
--- a/notegraphwidget.cc
+++ b/notegraphwidget.cc
@@ -334,8 +334,8 @@ void NoteGraphWidget::wheelEvent(QWheelEvent *event)
{
// Ctrl + Wheel = Zoom
if (event->modifiers() & Qt::ControlModifier && event->orientation() == Qt::Vertical) {
- float numDegrees = event->delta() / 8;
- float numSteps = numDegrees / 15;
+ float numDegrees = event->delta() / 8; // Qt resolution is 8th of a degree
+ float numSteps = numDegrees / 15; // Usually mice have 15 degree steps
zoom(numSteps);
event->accept();
return;
@@ -531,7 +531,7 @@ void SeekHandle::moveEvent(QMoveEvent*)
QScrollBar *scrollVer = scrollArea->verticalScrollBar();
int y = 0;
if (scrollVer) y = scrollVer->value();
- scrollArea->ensureVisible(x() + scrollArea->width()/3, y, scrollArea->width()/3, 0);
+ scrollArea->ensureVisible(x() + scrollArea->width()/3, y, scrollArea->width()/3, 0);
}
}
}
diff --git a/notelabelmanager.cc b/notelabelmanager.cc
index 79ae309..d23ee67 100644
--- a/notelabelmanager.cc
+++ b/notelabelmanager.cc
@@ -2,6 +2,8 @@
#include <QString>
#include <QInputDialog>
#include <QLineEdit>
+#include <QScrollArea>
+#include <QScrollBar>
#include "notegraphwidget.hh"
#include "notelabel.hh"
#include "operation.hh"
@@ -244,15 +246,42 @@ void NoteLabelManager::doOperation(const Operation& op, Operation::OperationFlag
}
void NoteLabelManager::zoom(float steps) {
- m_pixelsPerSecond += steps * 20;
- if (m_pixelsPerSecond < 100) m_pixelsPerSecond = 100;
- else if (m_pixelsPerSecond > 300) m_pixelsPerSecond = 300;
+ // Limits
+ const float ppsstep = 20.0f;
+ const float minpps = 100;
+ const float maxpps = 300;
+ if (m_pixelsPerSecond <= minpps && steps < 0) return;
+ else if (m_pixelsPerSecond >= maxpps && steps > 0) return;
+
+ // Get scrollArea position
+ QScrollArea *scrollArea = NULL;
+ double scrollSecs = -1;
+ if (parentWidget()) {
+ scrollArea = qobject_cast<QScrollArea*>(parentWidget()->parent());
+ if (scrollArea) scrollSecs = px2s(scrollArea->horizontalScrollBar()->value() + scrollArea->width()/2);
+ }
+
+ // Update zoom factor
+ m_pixelsPerSecond += steps * ppsstep;
+ if (m_pixelsPerSecond < minpps) m_pixelsPerSecond = minpps;
+ else if (m_pixelsPerSecond > maxpps) m_pixelsPerSecond = maxpps;
+
+ // Update scroll bar position
+ if (scrollArea && scrollSecs >= 0) {
+ QScrollBar *scrollVer = scrollArea->verticalScrollBar();
+ int y = 0;
+ if (scrollVer) y = scrollVer->value();
+ scrollArea->ensureVisible(s2px(scrollSecs), y, scrollArea->width()/2, 0);
+ std::cout << "YEAH" << std::endl;
+ }
+ // Update notes
for (int i = 0; i < m_notes.size(); ++i) {
const Note &n = m_notes[i]->note();
m_notes[i]->setGeometry(s2px(n.begin), m_notes[i]->y(), s2px(n.length()), m_notes[i]->height());
}
+ // Update pitch visualization
update();
std::cout << "pixPerSec: " << m_pixelsPerSecond << std::endl;
}
|