Norm C's patch for zooming, with a few mods from me. Allows more zooming-in and gives shift-right-click to return to 'normal' zoom on platforms that support it.

I note a number of 'zooming' bugs do still exist, but are ancient.
This commit is contained in:
martynshaw99 2013-11-28 01:11:09 +00:00
parent 127a8cc92e
commit f32e4918c0

View File

@ -221,6 +221,8 @@ is time to refresh some aspect of the screen.
#include <wx/arrimpl.cpp>
#define ZOOMLIMIT 0.001
WX_DEFINE_OBJARRAY(TrackClipArray);
//This loads the appropriate set of cursors, depending on platform.
@ -3490,10 +3492,11 @@ void TrackPanel::HandleVZoomButtonUp( wxMouseEvent & event )
}
}
else {
if (max - min < 0.2) {
c = (min+max)/2;
min = c-0.1;
max = c+0.1;
// Waveform view - allow zooming down to a range of ZOOMLIMIT
if (max - min < ZOOMLIMIT) { // if user attempts to go smaller...
c = (min+max)/2; // ...set centre of view to centre of dragged area and top/bottom to ZOOMLIMIT/2 above/below
min = c - ZOOMLIMIT/2.0;
max = c + ZOOMLIMIT/2.0;
}
}
}
@ -3504,40 +3507,63 @@ void TrackPanel::HandleVZoomButtonUp( wxMouseEvent & event )
// then, if they click again, allow one more
// zoom out.
if(spectrum) {
c = 0.5*(min+max);
l = (c - min);
if(c - 2*l <= 0) {
min = 0.0;
max = wxMin( rate/2., 2. * max);
}
if (event.ShiftDown() && event.RightUp()) {
// Zoom out full
min = 0.0;
max = rate/2.;
}
else {
min = wxMax( 0.0, c - 2*l);
max = wxMin( rate/2., c + 2*l);
// Zoom out
c = 0.5*(min+max);
l = (c - min);
if(c - 2*l <= 0) {
min = 0.0;
max = wxMin( rate/2., 2. * max);
}
else {
min = wxMax( 0.0, c - 2*l);
max = wxMin( rate/2., c + 2*l);
}
}
}
else {
if(spectrumLog)
{
float p1;
p1 = (mZoomStart - ypos) / (float)height;
c = 1.0-p1;
double xmin = c - 1.;
double xmax = c + 1.;
double lmin = log10(min), lmax = log10(max);
double d = lmax-lmin;
min = wxMax(1,pow(10, xmin*d+lmin));
max = wxMin(rate/2., pow(10, xmax*d+lmin));
}
else {
if (min <= -1.0 && max >= 1.0) {
min = -2.0;
max = 2.0;
if(spectrumLog) {
if (event.ShiftDown() && event.RightUp()) {
// Zoom out full
min = 1.0;
max = rate/2.;
}
else {
c = 0.5*(min+max);
l = (c - min);
min = wxMax( -1.0, c - 2*l);
max = wxMin( 1.0, c + 2*l);
// Zoom out
float p1;
p1 = (mZoomStart - ypos) / (float)height;
c = 1.0-p1;
double xmin = c - 1.;
double xmax = c + 1.;
double lmin = log10(min), lmax = log10(max);
double d = lmax-lmin;
min = wxMax(1,pow(10, xmin*d+lmin));
max = wxMin(rate/2., pow(10, xmax*d+lmin));
}
}
else {
if (event.ShiftDown() && event.RightUp()) {
// Zoom out full
min = -1.0;
max = 1.0;
}
else {
// Zoom out
if (min <= -1.0 && max >= 1.0) {
min = -2.0;
max = 2.0;
}
else {
c = 0.5*(min+max);
l = (c - min);
min = wxMax( -1.0, c - 2*l); // limit to +/-1 range
max = wxMin( 1.0, c + 2*l);
}
}
}
}
@ -3583,7 +3609,7 @@ void TrackPanel::HandleVZoomButtonUp( wxMouseEvent & event )
else {
c = 0.5*(min+max);
// Enforce maximum vertical zoom
l = wxMax( 0.1, (c - min));
l = wxMax( ZOOMLIMIT, (c - min));
p1 = (mZoomStart - ypos) / (float)height;
c = (max * (1.0-p1) + min * p1);