1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-05-01 16:19:43 +02:00

Move drawing code specific to Wave or to Note track controls...

... making cycles of some TrackControls subclasses with their handles, which
perhaps means those files should be fused, but that's for later
This commit is contained in:
Paul Licameli 2019-06-18 10:49:25 -04:00
parent 52844d9200
commit 627213cb74
13 changed files with 304 additions and 316 deletions

View File

@ -81,71 +81,8 @@ const TCPLines &CommonTrackControls::StaticTCPLines()
return commonTrackTCPLines();
}
#include "tracks/playabletrack/wavetrack/ui/WaveTrackControls.h"
#include "tracks/playabletrack/notetrack/ui/NoteTrackControls.h"
namespace {
static const struct WaveTrackTCPLines : TCPLines { WaveTrackTCPLines() {
(TCPLines&)*this = CommonTrackControls::StaticTCPLines();
insert( end(), {
#ifdef EXPERIMENTAL_DA
// DA: Has Mute and Solo on separate lines.
{ TCPLine::kItemMute, kTrackInfoBtnSize + 1, 1,
&TrackInfo::WideMuteDrawFunction },
{ TCPLine::kItemSolo, kTrackInfoBtnSize + 1, 2,
&TrackInfo::WideSoloDrawFunction },
#else
{ TCPLine::kItemMute | TCPLine::kItemSolo, kTrackInfoBtnSize + 1, 2,
&TrackInfo::MuteAndSoloDrawFunction },
#endif
{ TCPLine::kItemGain, kTrackInfoSliderHeight, kTrackInfoSliderExtra,
&TrackInfo::GainSliderDrawFunction },
{ TCPLine::kItemPan, kTrackInfoSliderHeight, kTrackInfoSliderExtra,
&TrackInfo::PanSliderDrawFunction },
#ifdef EXPERIMENTAL_DA
// DA: Does not have status information for a track.
#else
{ TCPLine::kItemStatusInfo1, 12, 0,
&TrackInfo::Status1DrawFunction },
{ TCPLine::kItemStatusInfo2, 12, 0,
&TrackInfo::Status2DrawFunction },
#endif
} );
} } waveTrackTCPLines;
#ifdef USE_MIDI
enum : int {
// PRL: was it correct to include the margin?
kMidiCellWidth = ( ( kTrackInfoWidth + kLeftMargin ) / 4) - 2,
kMidiCellHeight = kTrackInfoBtnSize
};
#endif
static const struct NoteTrackTCPLines : TCPLines { NoteTrackTCPLines() {
(TCPLines&)*this = CommonTrackControls::StaticTCPLines();
insert( end(), {
#ifdef EXPERIMENTAL_DA
// DA: Has Mute and Solo on separate lines.
{ TCPLine::kItemMute, kTrackInfoBtnSize + 1, 1,
&TrackInfo::WideMuteDrawFunction },
{ TCPLine::kItemSolo, kTrackInfoBtnSize + 1, 0,
&TrackInfo::WideSoloDrawFunction },
#else
{ TCPLine::kItemMute | TCPLine::kItemSolo, kTrackInfoBtnSize + 1, 0,
&TrackInfo::MuteAndSoloDrawFunction },
#endif
{ TCPLine::kItemMidiControlsRect, kMidiCellHeight * 4, 0,
&TrackInfo::MidiControlsDrawFunction },
{ TCPLine::kItemVelocity, kTrackInfoSliderHeight, kTrackInfoSliderExtra,
&TrackInfo::VelocitySliderDrawFunction },
} );
} } noteTrackTCPLines;
int totalTCPLines( const TCPLines &lines, bool omitLastExtra )
{
int total = 0;
@ -212,16 +149,6 @@ const TCPLines &CommonTrackControls::GetTCPLines() const
return commonTrackTCPLines();
}
const TCPLines &NoteTrackControls::GetTCPLines() const
{
return noteTrackTCPLines;
};
const TCPLines &WaveTrackControls::GetTCPLines() const
{
return waveTrackTCPLines;
}
unsigned TrackInfo::MinimumTrackHeight()
{
unsigned height = 0;
@ -475,78 +402,6 @@ void TrackInfo::MinimizeSyncLockDrawFunction
}
}
#include "tracks/playabletrack/notetrack/ui/NoteTrackButtonHandle.h"
void TrackInfo::MidiControlsDrawFunction
( TrackPanelDrawingContext &context,
const wxRect &rect, const Track *pTrack )
{
#ifdef EXPERIMENTAL_MIDI_OUT
auto target = dynamic_cast<NoteTrackButtonHandle*>( context.target.get() );
bool hit = target && target->GetTrack().get() == pTrack;
auto channel = hit ? target->GetChannel() : -1;
auto &dc = context.dc;
wxRect midiRect = rect;
GetMidiControlsHorizontalBounds(rect, midiRect);
NoteTrack::DrawLabelControls
( static_cast<const NoteTrack *>(pTrack), dc, midiRect, channel );
#endif // EXPERIMENTAL_MIDI_OUT
}
template<typename TrackClass>
void TrackInfo::SliderDrawFunction
( LWSlider *(*Selector)
(const wxRect &sliderRect, const TrackClass *t, bool captured, wxWindow*),
wxDC *dc, const wxRect &rect, const Track *pTrack,
bool captured, bool highlight )
{
wxRect sliderRect = rect;
TrackInfo::GetSliderHorizontalBounds( rect.GetTopLeft(), sliderRect );
auto wt = static_cast<const TrackClass*>( pTrack );
Selector( sliderRect, wt, captured, nullptr )->OnPaint(*dc, highlight);
}
#include "tracks/playabletrack/wavetrack/ui/WaveTrackSliderHandles.h"
void TrackInfo::PanSliderDrawFunction
( TrackPanelDrawingContext &context,
const wxRect &rect, const Track *pTrack )
{
auto target = dynamic_cast<PanSliderHandle*>( context.target.get() );
auto dc = &context.dc;
bool hit = target && target->GetTrack().get() == pTrack;
bool captured = hit && target->IsClicked();
SliderDrawFunction<WaveTrack>
( &TrackInfo::PanSlider, dc, rect, pTrack, captured, hit);
}
void TrackInfo::GainSliderDrawFunction
( TrackPanelDrawingContext &context,
const wxRect &rect, const Track *pTrack )
{
auto target = dynamic_cast<GainSliderHandle*>( context.target.get() );
auto dc = &context.dc;
bool hit = target && target->GetTrack().get() == pTrack;
if( hit )
hit=hit;
bool captured = hit && target->IsClicked();
SliderDrawFunction<WaveTrack>
( &TrackInfo::GainSlider, dc, rect, pTrack, captured, hit);
}
#ifdef EXPERIMENTAL_MIDI_OUT
#include "tracks/playabletrack/notetrack/ui/NoteTrackSliderHandles.h"
void TrackInfo::VelocitySliderDrawFunction
( TrackPanelDrawingContext &context,
const wxRect &rect, const Track *pTrack )
{
auto dc = &context.dc;
auto target = dynamic_cast<VelocitySliderHandle*>( context.target.get() );
bool hit = target && target->GetTrack().get() == pTrack;
bool captured = hit && target->IsClicked();
SliderDrawFunction<NoteTrack>
( &TrackInfo::VelocitySlider, dc, rect, pTrack, captured, hit);
}
#endif
void TrackInfo::MuteOrSoloDrawFunction
( wxDC *dc, const wxRect &bev, const Track *pTrack, bool down,
bool WXUNUSED(captured),
@ -660,53 +515,6 @@ void TrackInfo::MuteAndSoloDrawFunction
}
}
void TrackInfo::StatusDrawFunction
( const wxString &string, wxDC *dc, const wxRect &rect )
{
static const int offset = 3;
dc->DrawText(string, rect.x + offset, rect.y);
}
void TrackInfo::Status1DrawFunction
( TrackPanelDrawingContext &context,
const wxRect &rect, const Track *pTrack )
{
auto dc = &context.dc;
auto wt = static_cast<const WaveTrack*>(pTrack);
/// Returns the string to be displayed in the track label
/// indicating whether the track is mono, left, right, or
/// stereo and what sample rate it's using.
auto rate = wt ? wt->GetRate() : 44100.0;
wxString s;
if (!pTrack || TrackList::Channels(pTrack).size() > 1)
// TODO: more-than-two-channels-message
// more appropriate strings
s = _("Stereo, %dHz");
else {
if (wt->GetChannel() == Track::MonoChannel)
s = _("Mono, %dHz");
else if (wt->GetChannel() == Track::LeftChannel)
s = _("Left, %dHz");
else if (wt->GetChannel() == Track::RightChannel)
s = _("Right, %dHz");
}
s = wxString::Format( s, (int) (rate + 0.5) );
StatusDrawFunction( s, dc, rect );
}
void TrackInfo::Status2DrawFunction
( TrackPanelDrawingContext &context,
const wxRect &rect, const Track *pTrack )
{
auto dc = &context.dc;
auto wt = static_cast<const WaveTrack*>(pTrack);
auto format = wt ? wt->GetSampleFormat() : floatSample;
auto s = GetSampleFormatStr(format);
StatusDrawFunction( s, dc, rect );
}
namespace {
wxFont gFont;
@ -724,10 +532,12 @@ std::unique_ptr<LWSlider>
}
#include "tracks/playabletrack/notetrack/ui/NoteTrackControls.h"
#include "tracks/playabletrack/wavetrack/ui/WaveTrackControls.h"
void TrackInfo::ReCreateSliders(){
const wxPoint point{ 0, 0 };
wxRect sliderRect;
GetGainRect(point, sliderRect);
WaveTrackControls::GetGainRect(point, sliderRect);
float defPos = 1.0;
/* i18n-hint: Title of the Gain slider, used to adjust the volume */
@ -743,7 +553,7 @@ void TrackInfo::ReCreateSliders(){
DB_SLIDER);
gGainCaptured->SetDefaultValue(defPos);
GetPanRect(point, sliderRect);
WaveTrackControls::GetPanRect(point, sliderRect);
defPos = 0.0;
/* i18n-hint: Title of the Pan slider, used to move the sound left or right */
@ -760,7 +570,7 @@ void TrackInfo::ReCreateSliders(){
gPanCaptured->SetDefaultValue(defPos);
#ifdef EXPERIMENTAL_MIDI_OUT
GetVelocityRect(point, sliderRect);
NoteTrackControls::GetVelocityRect(point, sliderRect);
/* i18n-hint: Title of the Velocity slider, used to adjust the volume of note tracks */
gVelocity = std::make_unique<LWSlider>(nullptr, _("Velocity"),
@ -871,31 +681,6 @@ void TrackInfo::GetSliderHorizontalBounds( const wxPoint &topleft, wxRect &dest
dest.width = kTrackInfoSliderWidth;
}
void TrackInfo::GetGainRect(const wxPoint &topleft, wxRect & dest)
{
GetSliderHorizontalBounds( topleft, dest );
auto results = CalcItemY( waveTrackTCPLines, TCPLine::kItemGain );
dest.y = topleft.y + results.first;
dest.height = results.second;
}
void TrackInfo::GetPanRect(const wxPoint &topleft, wxRect & dest)
{
GetGainRect( topleft, dest );
auto results = CalcItemY( waveTrackTCPLines, TCPLine::kItemPan );
dest.y = topleft.y + results.first;
}
#ifdef EXPERIMENTAL_MIDI_OUT
void TrackInfo::GetVelocityRect(const wxPoint &topleft, wxRect & dest)
{
GetSliderHorizontalBounds( topleft, dest );
auto results = CalcItemY( noteTrackTCPLines, TCPLine::kItemVelocity );
dest.y = topleft.y + results.first;
dest.height = results.second;
}
#endif
void TrackInfo::GetMinimizeHorizontalBounds( const wxRect &rect, wxRect &dest )
{
const int space = 0;// was 3.
@ -960,27 +745,6 @@ void TrackInfo::GetSyncLockIconRect(const wxRect & rect, wxRect &dest)
dest.height = results.second;
}
#ifdef USE_MIDI
void TrackInfo::GetMidiControlsHorizontalBounds
( const wxRect &rect, wxRect &dest )
{
dest.x = rect.x + 1; // To center slightly
// PRL: TODO: kMidiCellWidth is defined in terms of the other constant
// kTrackInfoWidth but I am trying to avoid use of that constant.
// Can cell width be computed from dest.width instead?
dest.width = kMidiCellWidth * 4;
}
void TrackInfo::GetMidiControlsRect(const wxRect & rect, wxRect & dest)
{
GetMidiControlsHorizontalBounds( rect, dest );
auto results = CalcItemY( noteTrackTCPLines, TCPLine::kItemMidiControlsRect );
dest.y = rect.y + results.first;
dest.height = results.second;
}
#endif
/// \todo Probably should move to 'Utils.cpp'.
void TrackInfo::SetTrackInfoFont(wxDC * dc)
{
@ -1088,16 +852,6 @@ unsigned TrackInfo::DefaultTrackHeight( const TCPLines &topLines )
return (unsigned) std::max( needed, (int) TrackView::DefaultHeight );
}
unsigned TrackInfo::DefaultNoteTrackHeight()
{
return DefaultTrackHeight( noteTrackTCPLines );
}
unsigned TrackInfo::DefaultWaveTrackHeight()
{
return DefaultTrackHeight( waveTrackTCPLines );
}
LWSlider * TrackInfo::GainSlider
(const wxRect &sliderRect, const WaveTrack *t, bool captured, wxWindow *pParent)
{

View File

@ -89,32 +89,6 @@ namespace TrackInfo
( TrackPanelDrawingContext &context,
const wxRect &rect, const Track *pTrack );
void MidiControlsDrawFunction
( TrackPanelDrawingContext &context,
const wxRect &rect, const Track *pTrack );
template<typename TrackClass>
void SliderDrawFunction
( LWSlider *(*Selector)
(const wxRect &sliderRect, const TrackClass *t, bool captured,
wxWindow*),
wxDC *dc, const wxRect &rect, const Track *pTrack,
bool captured, bool highlight );
void PanSliderDrawFunction
( TrackPanelDrawingContext &context,
const wxRect &rect, const Track *pTrack );
void GainSliderDrawFunction
( TrackPanelDrawingContext &context,
const wxRect &rect, const Track *pTrack );
#ifdef EXPERIMENTAL_MIDI_OUT
void VelocitySliderDrawFunction
( TrackPanelDrawingContext &context,
const wxRect &rect, const Track *pTrack );
#endif
void MuteOrSoloDrawFunction
( wxDC *dc, const wxRect &rect, const Track *pTrack, bool down,
bool captured, bool solo, bool hit );
@ -131,17 +105,6 @@ namespace TrackInfo
( TrackPanelDrawingContext &context,
const wxRect &rect, const Track *pTrack );
void StatusDrawFunction
( const wxString &string, wxDC *dc, const wxRect &rect );
void Status1DrawFunction
( TrackPanelDrawingContext &context,
const wxRect &rect, const Track *pTrack );
void Status2DrawFunction
( TrackPanelDrawingContext &context,
const wxRect &rect, const Track *pTrack );
void SetTrackInfoFont(wxDC *dc);
@ -168,14 +131,6 @@ namespace TrackInfo
void GetSliderHorizontalBounds( const wxPoint &topleft, wxRect &dest );
void GetGainRect(const wxPoint & topLeft, wxRect &dest);
void GetPanRect(const wxPoint & topLeft, wxRect &dest);
#ifdef EXPERIMENTAL_MIDI_OUT
void GetVelocityRect(const wxPoint & topLeft, wxRect &dest);
#endif
void GetMinimizeHorizontalBounds( const wxRect &rect, wxRect &dest );
void GetMinimizeRect(const wxRect & rect, wxRect &dest);
@ -185,18 +140,9 @@ namespace TrackInfo
void GetSyncLockHorizontalBounds( const wxRect &rect, wxRect &dest );
void GetSyncLockIconRect(const wxRect & rect, wxRect &dest);
#ifdef USE_MIDI
void GetMidiControlsHorizontalBounds
( const wxRect &rect, wxRect &dest );
void GetMidiControlsRect(const wxRect & rect, wxRect &dest);
#endif
bool HideTopItem( const wxRect &rect, const wxRect &subRect,
int allowance = 0 );
unsigned DefaultNoteTrackHeight();
unsigned DefaultWaveTrackHeight();
LWSlider * GainSlider
(const wxRect &sliderRect, const WaveTrack *t, bool captured,
wxWindow *pParent);

View File

@ -73,8 +73,10 @@ is time to refresh some aspect of the screen.
#include "TrackInfo.h"
#include "TrackPanelAx.h"
#include "WaveTrack.h"
#include "tracks/playabletrack/wavetrack/ui/WaveTrackControls.h"
#ifdef EXPERIMENTAL_MIDI_OUT
#include "NoteTrack.h"
#include "tracks/playabletrack/notetrack/ui/NoteTrackControls.h"
#endif
#include "ondemand/ODManager.h"
@ -325,7 +327,7 @@ LWSlider *TrackPanel::GainSlider( const WaveTrack *wt )
auto pControls = &TrackControls::Get( *wt );
auto rect = FindRect( *pControls );
wxRect sliderRect;
TrackInfo::GetGainRect( rect.GetTopLeft(), sliderRect );
WaveTrackControls::GetGainRect( rect.GetTopLeft(), sliderRect );
return TrackInfo::GainSlider(sliderRect, wt, false, this);
}
@ -334,7 +336,7 @@ LWSlider *TrackPanel::PanSlider( const WaveTrack *wt )
auto pControls = &TrackControls::Get( *wt );
auto rect = FindRect( *pControls );
wxRect sliderRect;
TrackInfo::GetPanRect( rect.GetTopLeft(), sliderRect );
WaveTrackControls::GetPanRect( rect.GetTopLeft(), sliderRect );
return TrackInfo::PanSlider(sliderRect, wt, false, this);
}
@ -344,7 +346,7 @@ LWSlider *TrackPanel::VelocitySlider( const NoteTrack *nt )
auto pControls = &TrackControls::Get( *nt );
auto rect = FindRect( *pControls );
wxRect sliderRect;
TrackInfo::GetVelocityRect( rect.GetTopLeft(), sliderRect );
NoteTrackControls::GetVelocityRect( rect.GetTopLeft(), sliderRect );
return TrackInfo::VelocitySlider(sliderRect, nt, false, this);
}
#endif

View File

@ -3124,3 +3124,4 @@ void WaveTrack::DoZoom
if( pProject )
ProjectHistory::Get( *pProject ).ModifyState(true);
}

View File

@ -13,6 +13,7 @@ Paul Licameli split from TrackPanel.cpp
#ifdef USE_MIDI
#include "NoteTrackButtonHandle.h"
#include "NoteTrackControls.h"
#include "../../../../TrackPanelMouseEvent.h"
#include "../../../../NoteTrack.h"
#include "../../../../ProjectHistory.h"
@ -53,7 +54,7 @@ UIHandlePtr NoteTrackButtonHandle::HitTest
const std::shared_ptr<NoteTrack> &pTrack)
{
wxRect midiRect;
TrackInfo::GetMidiControlsRect(rect, midiRect);
NoteTrackControls::GetMidiControlsRect(rect, midiRect);
if ( TrackInfo::HideTopItem( rect, midiRect ) )
return {};
if (midiRect.Contains(state.m_x, state.m_y)) {

View File

@ -137,4 +137,122 @@ PopupMenuTable *NoteTrackControls::GetMenuExtension(Track *)
#endif
}
// drawing related
#include "../../../../widgets/ASlider.h"
#include "../../../../TrackInfo.h"
#include "../../../../TrackPanelDrawingContext.h"
#include "../../../../ViewInfo.h"
using TCPLine = TrackInfo::TCPLine;
#ifdef USE_MIDI
enum : int {
// PRL: was it correct to include the margin?
kMidiCellWidth = ( ( kTrackInfoWidth + kLeftMargin ) / 4) - 2,
kMidiCellHeight = kTrackInfoBtnSize
};
#endif
#include "tracks/playabletrack/notetrack/ui/NoteTrackButtonHandle.h"
#include "tracks/playabletrack/notetrack/ui/NoteTrackSliderHandles.h"
namespace {
void GetMidiControlsHorizontalBounds( const wxRect &rect, wxRect &dest )
{
dest.x = rect.x + 1; // To center slightly
// PRL: TODO: kMidiCellWidth is defined in terms of the other constant
// kTrackInfoWidth but I am trying to avoid use of that constant.
// Can cell width be computed from dest.width instead?
dest.width = kMidiCellWidth * 4;
}
void SliderDrawFunction
( LWSlider *(*Selector)
(const wxRect &sliderRect, const NoteTrack *t, bool captured, wxWindow*),
wxDC *dc, const wxRect &rect, const Track *pTrack,
bool captured, bool highlight )
{
wxRect sliderRect = rect;
TrackInfo::GetSliderHorizontalBounds( rect.GetTopLeft(), sliderRect );
auto nt = static_cast<const NoteTrack*>( pTrack );
Selector( sliderRect, nt, captured, nullptr )->OnPaint(*dc, highlight);
}
void VelocitySliderDrawFunction
( TrackPanelDrawingContext &context,
const wxRect &rect, const Track *pTrack )
{
auto dc = &context.dc;
auto target = dynamic_cast<VelocitySliderHandle*>( context.target.get() );
bool hit = target && target->GetTrack().get() == pTrack;
bool captured = hit && target->IsClicked();
SliderDrawFunction(
&TrackInfo::VelocitySlider, dc, rect, pTrack, captured, hit);
}
void MidiControlsDrawFunction
( TrackPanelDrawingContext &context,
const wxRect &rect, const Track *pTrack )
{
auto target = dynamic_cast<NoteTrackButtonHandle*>( context.target.get() );
bool hit = target && target->GetTrack().get() == pTrack;
auto channel = hit ? target->GetChannel() : -1;
auto &dc = context.dc;
wxRect midiRect = rect;
GetMidiControlsHorizontalBounds(rect, midiRect);
NoteTrack::DrawLabelControls
( static_cast<const NoteTrack *>(pTrack), dc, midiRect, channel );
}
}
static const struct NoteTrackTCPLines
: TCPLines { NoteTrackTCPLines() {
(TCPLines&)*this =
CommonTrackControls::StaticTCPLines();
insert( end(), {
#ifdef EXPERIMENTAL_DA
// DA: Has Mute and Solo on separate lines.
{ TCPLine::kItemMute, kTrackInfoBtnSize + 1, 1,
TrackInfo::WideMuteDrawFunction },
{ TCPLine::kItemSolo, kTrackInfoBtnSize + 1, 0,
TrackInfo::WideSoloDrawFunction },
#else
{ TCPLine::kItemMute | TCPLine::kItemSolo, kTrackInfoBtnSize + 1, 0,
TrackInfo::MuteAndSoloDrawFunction },
#endif
{ TCPLine::kItemMidiControlsRect, kMidiCellHeight * 4, 0,
MidiControlsDrawFunction },
{ TCPLine::kItemVelocity, kTrackInfoSliderHeight, kTrackInfoSliderExtra,
VelocitySliderDrawFunction },
} );
} } noteTrackTCPLines;
void NoteTrackControls::GetVelocityRect(const wxPoint &topleft, wxRect & dest)
{
TrackInfo::GetSliderHorizontalBounds( topleft, dest );
auto results = CalcItemY( noteTrackTCPLines, TCPLine::kItemVelocity );
dest.y = topleft.y + results.first;
dest.height = results.second;
}
void NoteTrackControls::GetMidiControlsRect(const wxRect & rect, wxRect & dest)
{
GetMidiControlsHorizontalBounds( rect, dest );
auto results = TrackInfo::CalcItemY(
noteTrackTCPLines, TCPLine::kItemMidiControlsRect );
dest.y = rect.y + results.first;
dest.height = results.second;
}
unsigned NoteTrackControls::DefaultNoteTrackHeight()
{
return TrackInfo::DefaultTrackHeight( noteTrackTCPLines );
}
const TCPLines &NoteTrackControls::GetTCPLines() const
{
return noteTrackTCPLines;
};
#endif

View File

@ -42,6 +42,10 @@ public:
PopupMenuTable *GetMenuExtension(Track *pTrack) override;
const TCPLines& GetTCPLines() const override;
static unsigned DefaultNoteTrackHeight();
static void GetMidiControlsRect(const wxRect & rect, wxRect & dest);
static void GetVelocityRect(const wxPoint &topleft, wxRect & dest);
};
#endif

View File

@ -15,6 +15,7 @@
#ifdef EXPERIMENTAL_MIDI_OUT
#include "NoteTrackControls.h"
#include "../../../../ProjectHistory.h"
#include "../../../../RefreshCode.h"
#include "../../../../TrackInfo.h"
@ -79,7 +80,7 @@ UIHandlePtr VelocitySliderHandle::HitTest
return {};
wxRect sliderRect;
TrackInfo::GetVelocityRect(rect.GetTopLeft(), sliderRect);
NoteTrackControls::GetVelocityRect(rect.GetTopLeft(), sliderRect);
if ( TrackInfo::HideTopItem( rect, sliderRect, kTrackInfoSliderAllowance ) )
return {};
if (sliderRect.Contains(state.m_x, state.m_y)) {

View File

@ -23,12 +23,11 @@ Paul Licameli split from TrackPanel.cpp
#include "../../../../TrackPanelMouseEvent.h"
#include "../../../ui/SelectHandle.h"
#include "StretchHandle.h"
#include "../../../../TrackInfo.h"
NoteTrackView::NoteTrackView( const std::shared_ptr<Track> &pTrack )
: CommonTrackView{ pTrack }
{
DoSetHeight( TrackInfo::DefaultNoteTrackHeight() );
DoSetHeight( NoteTrackControls::DefaultNoteTrackHeight() );
}
NoteTrackView::~NoteTrackView()

View File

@ -1011,3 +1011,160 @@ PopupMenuTable *WaveTrackControls::GetMenuExtension(Track * pTrack)
WaveTrackMenuTable & result = WaveTrackMenuTable::Instance( pTrack );
return &result;
}
// drawing related
#include "../../../../widgets/ASlider.h"
#include "../../../../TrackInfo.h"
#include "../../../../TrackPanelDrawingContext.h"
#include "../../../../ViewInfo.h"
namespace {
void SliderDrawFunction
( LWSlider *(*Selector)
(const wxRect &sliderRect, const WaveTrack *t, bool captured, wxWindow*),
wxDC *dc, const wxRect &rect, const Track *pTrack,
bool captured, bool highlight )
{
wxRect sliderRect = rect;
TrackInfo::GetSliderHorizontalBounds( rect.GetTopLeft(), sliderRect );
auto wt = static_cast<const WaveTrack*>( pTrack );
Selector( sliderRect, wt, captured, nullptr )->OnPaint(*dc, highlight);
}
#include "tracks/playabletrack/wavetrack/ui/WaveTrackSliderHandles.h"
void PanSliderDrawFunction
( TrackPanelDrawingContext &context,
const wxRect &rect, const Track *pTrack )
{
auto target = dynamic_cast<PanSliderHandle*>( context.target.get() );
auto dc = &context.dc;
bool hit = target && target->GetTrack().get() == pTrack;
bool captured = hit && target->IsClicked();
SliderDrawFunction
( &TrackInfo::PanSlider, dc, rect, pTrack, captured, hit);
}
void GainSliderDrawFunction
( TrackPanelDrawingContext &context,
const wxRect &rect, const Track *pTrack )
{
auto target = dynamic_cast<GainSliderHandle*>( context.target.get() );
auto dc = &context.dc;
bool hit = target && target->GetTrack().get() == pTrack;
if( hit )
hit=hit;
bool captured = hit && target->IsClicked();
SliderDrawFunction
( &TrackInfo::GainSlider, dc, rect, pTrack, captured, hit);
}
void StatusDrawFunction
( const wxString &string, wxDC *dc, const wxRect &rect )
{
static const int offset = 3;
dc->DrawText(string, rect.x + offset, rect.y);
}
void Status1DrawFunction
( TrackPanelDrawingContext &context,
const wxRect &rect, const Track *pTrack )
{
auto dc = &context.dc;
auto wt = static_cast<const WaveTrack*>(pTrack);
/// Returns the string to be displayed in the track label
/// indicating whether the track is mono, left, right, or
/// stereo and what sample rate it's using.
auto rate = wt ? wt->GetRate() : 44100.0;
wxString s;
if (!pTrack || TrackList::Channels(pTrack).size() > 1)
// TODO: more-than-two-channels-message
// more appropriate strings
s = _("Stereo, %dHz");
else {
if (wt->GetChannel() == Track::MonoChannel)
s = _("Mono, %dHz");
else if (wt->GetChannel() == Track::LeftChannel)
s = _("Left, %dHz");
else if (wt->GetChannel() == Track::RightChannel)
s = _("Right, %dHz");
}
s = wxString::Format( s, (int) (rate + 0.5) );
StatusDrawFunction( s, dc, rect );
}
void Status2DrawFunction
( TrackPanelDrawingContext &context,
const wxRect &rect, const Track *pTrack )
{
auto dc = &context.dc;
auto wt = static_cast<const WaveTrack*>(pTrack);
auto format = wt ? wt->GetSampleFormat() : floatSample;
auto s = GetSampleFormatStr(format);
StatusDrawFunction( s, dc, rect );
}
}
using TCPLine = TrackInfo::TCPLine;
static const struct WaveTrackTCPLines
: TCPLines { WaveTrackTCPLines() {
(TCPLines&)*this =
CommonTrackControls::StaticTCPLines();
insert( end(), {
#ifdef EXPERIMENTAL_DA
// DA: Has Mute and Solo on separate lines.
{ TCPLine::kItemMute, kTrackInfoBtnSize + 1, 1,
TrackInfo::WideMuteDrawFunction },
{ TCPLine::kItemSolo, kTrackInfoBtnSize + 1, 2,
TrackInfo::WideSoloDrawFunction },
#else
{ TCPLine::kItemMute | TCPLine::kItemSolo, kTrackInfoBtnSize + 1, 2,
TrackInfo::MuteAndSoloDrawFunction },
#endif
{ TCPLine::kItemGain, kTrackInfoSliderHeight, kTrackInfoSliderExtra,
GainSliderDrawFunction },
{ TCPLine::kItemPan, kTrackInfoSliderHeight, kTrackInfoSliderExtra,
PanSliderDrawFunction },
#ifdef EXPERIMENTAL_DA
// DA: Does not have status information for a track.
#else
{ TCPLine::kItemStatusInfo1, 12, 0,
Status1DrawFunction },
{ TCPLine::kItemStatusInfo2, 12, 0,
Status2DrawFunction },
#endif
} );
} } waveTrackTCPLines;
void WaveTrackControls::GetGainRect(const wxPoint &topleft, wxRect & dest)
{
TrackInfo::GetSliderHorizontalBounds( topleft, dest );
auto results = CalcItemY( waveTrackTCPLines, TCPLine::kItemGain );
dest.y = topleft.y + results.first;
dest.height = results.second;
}
void WaveTrackControls::GetPanRect(const wxPoint &topleft, wxRect & dest)
{
GetGainRect( topleft, dest );
auto results = CalcItemY( waveTrackTCPLines, TCPLine::kItemPan );
dest.y = topleft.y + results.first;
}
unsigned WaveTrackControls::DefaultWaveTrackHeight()
{
return TrackInfo::DefaultTrackHeight( waveTrackTCPLines );
}
const TCPLines &WaveTrackControls::GetTCPLines() const
{
return waveTrackTCPLines;
}

View File

@ -37,6 +37,10 @@ public:
const TCPLines& GetTCPLines() const override;
static unsigned DefaultWaveTrackHeight();
static void GetGainRect(const wxPoint & topLeft, wxRect &dest);
static void GetPanRect(const wxPoint & topLeft, wxRect &dest);
private:
std::weak_ptr<MuteButtonHandle> mMuteHandle;
std::weak_ptr<SoloButtonHandle> mSoloHandle;

View File

@ -11,6 +11,7 @@ Paul Licameli split from TrackPanel.cpp
#include "../../../../Audacity.h"
#include "WaveTrackSliderHandles.h"
#include "WaveTrackControls.h"
#include "../../../../ProjectHistory.h"
#include "../../../../RefreshCode.h"
#include "../../../../TrackInfo.h"
@ -72,12 +73,12 @@ UIHandlePtr GainSliderHandle::HitTest
return {};
wxRect sliderRect;
TrackInfo::GetGainRect(rect.GetTopLeft(), sliderRect);
WaveTrackControls::GetGainRect(rect.GetTopLeft(), sliderRect);
if ( TrackInfo::HideTopItem( rect, sliderRect))
return {};
if (sliderRect.Contains(state.m_x, state.m_y)) {
wxRect sliderRect2;
TrackInfo::GetGainRect(rect.GetTopLeft(), sliderRect2);
WaveTrackControls::GetGainRect(rect.GetTopLeft(), sliderRect2);
auto sliderFn =
[]( AudacityProject *pProject, const wxRect &sliderRect, Track *pTrack ) {
return TrackInfo::GainSlider
@ -151,7 +152,7 @@ UIHandlePtr PanSliderHandle::HitTest
return {};
wxRect sliderRect;
TrackInfo::GetPanRect(rect.GetTopLeft(), sliderRect);
WaveTrackControls::GetPanRect(rect.GetTopLeft(), sliderRect);
if ( TrackInfo::HideTopItem( rect, sliderRect))
return {};
if (sliderRect.Contains(state.m_x, state.m_y)) {

View File

@ -33,7 +33,7 @@ Paul Licameli split from TrackPanel.cpp
WaveTrackView::WaveTrackView( const std::shared_ptr<Track> &pTrack )
: CommonTrackView{ pTrack }
{
DoSetHeight( TrackInfo::DefaultWaveTrackHeight() );
DoSetHeight( WaveTrackControls::DefaultWaveTrackHeight() );
}
WaveTrackView::~WaveTrackView()