diff --git a/src/NumberScale.h b/src/NumberScale.h index b68a557f5..653977354 100644 --- a/src/NumberScale.h +++ b/src/NumberScale.h @@ -241,10 +241,14 @@ public: case nstErb: case nstUndertone: return Iterator - (mType, (mValue1 - mValue0) / nPositions, mValue0, mUnit); + (mType, + nPositions == 1 ? 0 : (mValue1 - mValue0) / (nPositions - 1), + mValue0, mUnit); case nstLogarithmic: return Iterator - (mType, exp((mValue1 - mValue0) / nPositions), exp(mValue0), mUnit); + (mType, + nPositions == 1 ? 1 : exp((mValue1 - mValue0) / (nPositions - 1)), + exp(mValue0), mUnit); } } diff --git a/src/TrackArtist.cpp b/src/TrackArtist.cpp index bad6f11b1..361513171 100644 --- a/src/TrackArtist.cpp +++ b/src/TrackArtist.cpp @@ -571,8 +571,8 @@ void TrackArtist::DrawVRuler(Track *t, wxDC * dc, wxRect & rect) bev.height--; dc->DrawRectangle(bev); - rect.y += 2; - rect.height -= 2; + rect.y += 1; + rect.height -= 1; //int bottom = GetBottom((NoteTrack *) t, rect); NoteTrack *track = (NoteTrack *) t; @@ -671,7 +671,7 @@ void TrackArtist::UpdateVRuler(Track *t, wxRect & rect) min = tt->GetRangeLower() * 100.0; max = tt->GetRangeUpper() * 100.0; - vruler->SetBounds(rect.x, rect.y+1, rect.x + rect.width, rect.y + rect.height-1); + vruler->SetBounds(rect.x, rect.y, rect.x + rect.width, rect.y + rect.height-1); vruler->SetOrientation(wxVERTICAL); vruler->SetRange(max, min); vruler->SetFormat((tt->GetDisplayLog()) ? Ruler::RealLogFormat : Ruler::RealFormat); @@ -720,7 +720,7 @@ void TrackArtist::UpdateVRuler(Track *t, wxRect & rect) wt->SetDisplayBounds(min, max); } - vruler->SetBounds(rect.x, rect.y + 1, rect.x + rect.width, rect.y + rect.height - 1); + vruler->SetBounds(rect.x, rect.y, rect.x + rect.width, rect.y + rect.height - 1); vruler->SetOrientation(wxVERTICAL); vruler->SetRange(max, min); vruler->SetFormat(Ruler::RealFormat); @@ -782,7 +782,7 @@ void TrackArtist::UpdateVRuler(Track *t, wxRect & rect) botval = -((1 - min) * dBRange); } - vruler->SetBounds(rect.x, rect.y + top + 1, rect.x + rect.width, rect.y + bot - 1); + vruler->SetBounds(rect.x, rect.y + top, rect.x + rect.width, rect.y + bot - 1); vruler->SetOrientation(wxVERTICAL); vruler->SetRange(topval, botval); } @@ -815,7 +815,7 @@ void TrackArtist::UpdateVRuler(Track *t, wxRect & rect) we will use Hz if maxFreq is < 2000, otherwise we represent kHz, and append to the numbers a "k" */ - vruler->SetBounds(rect.x, rect.y + 1, rect.x + rect.width, rect.y + rect.height - 1); + vruler->SetBounds(rect.x, rect.y, rect.x + rect.width, rect.y + rect.height - 1); vruler->SetOrientation(wxVERTICAL); vruler->SetFormat(Ruler::RealFormat); vruler->SetLabelEdges(true); @@ -853,7 +853,7 @@ void TrackArtist::UpdateVRuler(Track *t, wxRect & rect) we will use Hz if maxFreq is < 2000, otherwise we represent kHz, and append to the numbers a "k" */ - vruler->SetBounds(rect.x, rect.y + 1, rect.x + rect.width, rect.y + rect.height - 1); + vruler->SetBounds(rect.x, rect.y, rect.x + rect.width, rect.y + rect.height - 1); vruler->SetOrientation(wxVERTICAL); vruler->SetFormat(Ruler::IntFormat); vruler->SetLabelEdges(true); @@ -873,7 +873,7 @@ void TrackArtist::UpdateVRuler(Track *t, wxRect & rect) // The note track isn't drawing a ruler at all! // But it needs to! else if (t->GetKind() == Track::Note) { - vruler->SetBounds(rect.x, rect.y+1, rect.x + 1, rect.y + rect.height-1); + vruler->SetBounds(rect.x, rect.y, rect.x + 1, rect.y + rect.height-1); vruler->SetOrientation(wxVERTICAL); } #endif // USE_MIDI @@ -946,7 +946,10 @@ float ValueOfPixel(int yy, int height, bool offset, bool dB, double dBRange, float zoomMin, float zoomMax) { wxASSERT(height > 0); - float v = zoomMax - (yy / (float)height) * (zoomMax - zoomMin); + // Map 0 to max and height - 1 (not height) to min + float v = + height == 1 ? (zoomMin + zoomMax) / 2 : + zoomMax - (yy / (float)(height - 1)) * (zoomMax - zoomMin); if (offset) { if (v > 0.0) v += .5; diff --git a/src/TrackPanel.cpp b/src/TrackPanel.cpp index 405f10983..ae958580f 100644 --- a/src/TrackPanel.cpp +++ b/src/TrackPanel.cpp @@ -2540,6 +2540,8 @@ void TrackPanel::SelectionHandleClick(wxMouseEvent & event, { Track *rightTrack = NULL; mCapturedTrack = pTrack; + rect.y += kTopMargin; + rect.height -= kTopMargin + kBottomMargin; mCapturedRect = rect; mMouseCapture=IsSelecting; @@ -3414,9 +3416,11 @@ void TrackPanel::SelectionHandleDrag(wxMouseEvent & event, Track *clickedTrack) wxRect rect = mCapturedRect; Track *pTrack = mCapturedTrack; - // AS: Note that FindTrack will replace rect's value. - if (!pTrack) + if (!pTrack) { pTrack = FindTrack(event.m_x, event.m_y, false, false, &rect); + rect.y += kTopMargin; + rect.height -= kTopMargin + kBottomMargin; + } // Also fuhggeddaboudit if not in a track. if (!pTrack) @@ -3705,8 +3709,8 @@ void TrackPanel::HandleEnvelope(wxMouseEvent & event) } mCapturedRect = rect; - mCapturedRect.y += kTopInset; - mCapturedRect.height -= kTopInset; + mCapturedRect.y += kTopMargin; + mCapturedRect.height -= kTopMargin + kBottomMargin; } // AS: if there's actually a selected track, then forward all of the // mouse events to its envelope. @@ -3732,8 +3736,6 @@ void TrackPanel::ForwardEventToTimeTrackEnvelope(wxMouseEvent & event) Envelope *pspeedenvelope = ptimetrack->GetEnvelope(); wxRect envRect = mCapturedRect; - envRect.y++; - envRect.height -= 2; double lower = ptimetrack->GetRangeLower(), upper = ptimetrack->GetRangeUpper(); const double dBRange = mViewInfo->dBr; if (ptimetrack->GetDisplayLog()) { @@ -3775,8 +3777,6 @@ void TrackPanel::ForwardEventToWaveTrackEnvelope(wxMouseEvent & event) // AS: Then forward our mouse event to the envelope. // It'll recalculate and then tell us whether or not to redraw. wxRect envRect = mCapturedRect; - envRect.y++; - envRect.height -= 2; float zoomMin, zoomMax; pwavetrack->GetDisplayBounds(&zoomMin, &zoomMax); needUpdate = penvelope->MouseEvent( @@ -3794,8 +3794,6 @@ void TrackPanel::ForwardEventToWaveTrackEnvelope(wxMouseEvent & event) bool updateNeeded = false; if (e2) { wxRect envRect = mCapturedRect; - envRect.y++; - envRect.height -= 2; float zoomMin, zoomMax; pwavetrack->GetDisplayBounds(&zoomMin, &zoomMax); updateNeeded = e2->MouseEvent(event, envRect, @@ -3808,8 +3806,6 @@ void TrackPanel::ForwardEventToWaveTrackEnvelope(wxMouseEvent & event) if( (e2 = link->GetActiveEnvelope()) != 0 ) // search for any active DragPoint { wxRect envRect = mCapturedRect; - envRect.y++; - envRect.height -= 2; float zoomMin, zoomMax; pwavetrack->GetDisplayBounds(&zoomMin, &zoomMax); needUpdate |= e2->MouseEvent(event, envRect, @@ -4663,8 +4659,8 @@ void TrackPanel::HandleWaveTrackVZoom bool fixedMousePoint) { WaveTrack *const partner = static_cast(tracks->GetLink(track)); - int height = track->GetHeight(); - int ypos = rect.y; + int height = track->GetHeight() - (kTopMargin + kBottomMargin); + int ypos = rect.y + kBorderThickness; // Ensure start and end are in order (swap if not). if (zoomEnd < zoomStart) @@ -4955,7 +4951,7 @@ float TrackPanel::FindSampleEditingLevel(wxMouseEvent &event, double dBRange, do mDrawingTrack->GetDisplayBounds(&zoomMin, &zoomMax); const int y = event.m_y - mDrawingTrackTop; - const int height = mDrawingTrack->GetHeight(); + const int height = mDrawingTrack->GetHeight() - (kTopMargin + kBottomMargin); const bool dB = !mDrawingTrack->GetWaveformSettings().isLinear(); float newLevel = ::ValueOfPixel(y, height, false, dB, dBRange, zoomMin, zoomMax); @@ -4996,7 +4992,7 @@ void TrackPanel::HandleSampleEditingClick( wxMouseEvent & event ) /// \todo Should mCapturedTrack take the place of mDrawingTrack?? mDrawingTrack = static_cast(t); - mDrawingTrackTop=rect.y; + mDrawingTrackTop=rect.y + kTopMargin; //If we are still around, we are drawing in earnest. Set some member data structures up: //First, calculate the starting sample. To get this, we need the time @@ -7395,9 +7391,9 @@ void TrackPanel::DrawEverythingElse(wxDC * dc, if (region.Contains(0, trackRect.y, GetLeftOffset(), trackRect.height)) { wxRect rect = trackRect; rect.x += GetVRulerOffset(); - rect.y += kTopInset; + rect.y += kTopMargin; rect.width = GetVRulerWidth(); - rect.height -= (kTopInset + 2); + rect.height -= (kTopMargin + kBottomMargin); mTrackArtist->DrawVRuler(t, dc, rect); } @@ -7408,9 +7404,9 @@ void TrackPanel::DrawEverythingElse(wxDC * dc, if (region.Contains(0, trackRect.y, GetLeftOffset(), trackRect.height)) { wxRect rect = trackRect; rect.x += GetVRulerOffset(); - rect.y += kTopInset; + rect.y += kTopMargin; rect.width = GetVRulerWidth(); - rect.height -= (kTopInset + 2); + rect.height -= (kTopMargin + kBottomMargin); mTrackArtist->DrawVRuler(t, dc, rect); } } @@ -7953,20 +7949,20 @@ void TrackPanel::UpdateTrackVRuler(Track *t) return; wxRect rect(GetVRulerOffset(), - kTopInset, + kTopMargin, GetVRulerWidth(), - t->GetHeight() - (kTopInset + 2)); + t->GetHeight() - (kTopMargin + kBottomMargin)); mTrackArtist->UpdateVRuler(t, rect); Track *l = t->GetLink(); if (l) { - rect.height = l->GetHeight() - (kTopInset + 2); + rect.height = l->GetHeight() - (kTopMargin + kBottomMargin); mTrackArtist->UpdateVRuler(l, rect); } #ifdef EXPERIMENTAL_OUTPUT_DISPLAY else if(MONO_WAVE_PAN(t)){ - rect.height = t->GetHeight(true) - (kTopInset + 2); + rect.height = t->GetHeight(true) - (kTopMargin + kBottomMargin); mTrackArtist->UpdateVRuler(t, rect); } #endif