1
0
mirror of https://github.com/cookiengineer/audacity synced 2026-02-17 08:17:59 +01:00

Now have three varieties of the Meter Toolbar.

We have separate record and play meters.  The original kind of meter is now called a combined meter.  I've kept it because it can be useful when undocked if you do want both meters.  I've also fixed it so that if made very narrow the meters stack vertically just as they already did horizontally.
This commit is contained in:
james.k.crook@gmail.com
2014-10-24 16:42:46 +00:00
parent 0ce9f5ad16
commit fbbab2ce1b
10 changed files with 236 additions and 114 deletions

View File

@@ -47,9 +47,20 @@ BEGIN_EVENT_TABLE( MeterToolBar, ToolBar )
END_EVENT_TABLE()
//Standard contructor
MeterToolBar::MeterToolBar()
MeterToolBar::MeterToolBar(int WhichMeters)
: ToolBar(MeterBarID, _("Meter"), wxT("Meter"), true)
{
mWhichMeters = WhichMeters;
if( mWhichMeters == kWithRecordMeter ){
mType = RecordMeterBarID;
mLabel = _("Record Meter");
mSection = wxT("RecordMeter");
}
if( mWhichMeters == kWithPlayMeter ){
mType = PlayMeterBarID;
mLabel = _("Play Meter");
mSection = wxT("PlayMeter");
}
mSizer = NULL;
mPlayMeter = NULL;
mRecordMeter = NULL;
@@ -59,11 +70,6 @@ MeterToolBar::~MeterToolBar()
{
}
void MeterToolBar::Clear()
{
if (mPlayMeter) mPlayMeter->Clear();
if (mRecordMeter) mRecordMeter->Clear();
}
void MeterToolBar::Create(wxWindow * parent)
{
@@ -79,42 +85,48 @@ void MeterToolBar::Populate()
mSizer = new wxGridBagSizer();
Add( mSizer, 1, wxEXPAND );
//JKC: Record on left, playback on right. Left to right flow
//(maybe we should do it differently for Arabic language :-) )
mRecordMeter = new Meter( this,
wxID_ANY,
true,
wxDefaultPosition,
wxSize( 130, 55 ) );
/* i18n-hint: (noun) The meter that shows the loudness of the audio being recorded.*/
mRecordMeter->SetName( _("Record Meter"));
/* i18n-hint: (noun) The meter that shows the loudness of the audio being recorded.
This is the name used in screen reader software, where having 'Meter' first
apparently is helpful to partially sighted people. */
mRecordMeter->SetLabel( _("Meter-Record") );
mSizer->Add( mRecordMeter, wxGBPosition( 0, 0 ), wxDefaultSpan, wxEXPAND );
mPlayMeter = new Meter( this,
wxID_ANY,
false,
wxDefaultPosition,
wxSize( 130, 55 ) );
/* i18n-hint: (noun) The meter that shows the loudness of the audio playing.*/
mPlayMeter->SetName( _("Play Meter"));
/* i18n-hint: (noun) The meter that shows the loudness of the audio playing.
This is the name used in screen reader software, where having 'Meter' first
apparently is helpful to partially sighted people. */
mPlayMeter->SetLabel( _("Meter-Play"));
mSizer->Add( mPlayMeter, wxGBPosition( 0, 1 ), wxDefaultSpan, wxEXPAND );
if( mWhichMeters & kWithRecordMeter ){
//JKC: Record on left, playback on right. Left to right flow
//(maybe we should do it differently for Arabic language :-) )
mRecordMeter = new Meter( this,
wxID_ANY,
true,
wxDefaultPosition,
wxSize( 130, 55 ) );
/* i18n-hint: (noun) The meter that shows the loudness of the audio being recorded.*/
mRecordMeter->SetName( _("Record Meter"));
/* i18n-hint: (noun) The meter that shows the loudness of the audio being recorded.
This is the name used in screen reader software, where having 'Meter' first
apparently is helpful to partially sighted people. */
mRecordMeter->SetLabel( _("Meter-Record") );
mSizer->Add( mRecordMeter, wxGBPosition( 0, 0 ), wxDefaultSpan, wxEXPAND );
}
if( mWhichMeters & kWithPlayMeter ){
mPlayMeter = new Meter( this,
wxID_ANY,
false,
wxDefaultPosition,
wxSize( 130, 55 ) );
/* i18n-hint: (noun) The meter that shows the loudness of the audio playing.*/
mPlayMeter->SetName( _("Play Meter"));
/* i18n-hint: (noun) The meter that shows the loudness of the audio playing.
This is the name used in screen reader software, where having 'Meter' first
apparently is helpful to partially sighted people. */
mPlayMeter->SetLabel( _("Meter-Play"));
mSizer->Add( mPlayMeter, wxGBPosition( 0, 1 ), wxDefaultSpan, wxEXPAND );
}
if( IsVisible() )
MeterToolBars::AddMeters( mPlayMeter, mRecordMeter );
RegenerateTooltips();
}
void MeterToolBar::UpdatePrefs()
{
mPlayMeter->UpdatePrefs();
mRecordMeter->UpdatePrefs();
if( mPlayMeter )
mPlayMeter->UpdatePrefs();
if( mRecordMeter )
mRecordMeter->UpdatePrefs();
RegenerateTooltips();
@@ -128,13 +140,16 @@ void MeterToolBar::UpdatePrefs()
void MeterToolBar::RegenerateTooltips()
{
#if wxUSE_TOOLTIPS
mPlayMeter->SetToolTip( _("Playback Level") );
mRecordMeter->SetToolTip( _("Recording Level (Click to monitor.)") );
if( mPlayMeter )
mPlayMeter->SetToolTip( _("Playback Level") );
if( mRecordMeter )
mRecordMeter->SetToolTip( _("Recording Level (Click to monitor.)") );
#endif
}
bool MeterToolBar::DestroyChildren()
{
MeterToolBars::RemoveMeters( mPlayMeter, mRecordMeter );
mPlayMeter = NULL;
mRecordMeter = NULL;
@@ -151,8 +166,7 @@ void MeterToolBar::OnSize( wxSizeEvent & WXUNUSED(event) )
int width, height;
// We can be resized before populating...protect against it
if( !mSizer )
{
if( !mSizer ) {
return;
}
@@ -160,62 +174,91 @@ void MeterToolBar::OnSize( wxSizeEvent & WXUNUSED(event) )
Layout();
// Get the usable area
// GetClientSize( &width, &height );
// width -= mSizer->GetPosition().x;
wxSize sz = GetSizer()->GetSize();
width = sz.x; height = sz.y;
// Default location for play meter
wxGBPosition pos( 0, 1 );
int nMeters =
((mRecordMeter ==NULL) ? 0:1) +
((mPlayMeter ==NULL) ? 0:1);
// Two horizontal
if( width > height )
{
if( height > 120 )
{
// Stacked
mRecordMeter->SetMinSize( wxSize( width, ( height / 2 ) ) );
mPlayMeter->SetMinSize( wxSize( width, ( height / 2 ) ) );
pos.SetCol( 0 );
pos.SetRow( 1 );
}
else
{
// Side-by-side
mRecordMeter->SetMinSize( wxSize( ( width / 2 ), height ) );
mPlayMeter->SetMinSize( wxSize( ( width / 2 ), height ) );
}
bool bHorizontal = ( width > height );
bool bEndToEnd = ( nMeters > 1 ) && wxMin( width, height ) < (60 * nMeters);
mRecordMeter->SetStyle(Meter::HorizontalStereo);
mPlayMeter->SetStyle(Meter::HorizontalStereo);
}
else
{
// Two vertical, side-by-side
mRecordMeter->SetMinSize( wxSize( ( width / 2 ), height ) );
mPlayMeter->SetMinSize( wxSize( ( width / 2 ), height ) );
mRecordMeter->SetStyle(Meter::VerticalStereo);
mPlayMeter->SetStyle(Meter::VerticalStereo);
// Default location for second meter
wxGBPosition pos( 0, 0 );
// If 2 meters, share the height or width.
if( nMeters > 1 ){
if( bHorizontal ^ bEndToEnd ){
height /= nMeters;
pos = wxGBPosition( 1, 0 );
} else {
width /= nMeters;
pos = wxGBPosition( 0, 1 );
}
}
// Position the play meter
mSizer->SetItemPosition( mPlayMeter, pos );
if( mRecordMeter ) {
mRecordMeter->SetStyle(bHorizontal ? Meter::HorizontalStereo : Meter::VerticalStereo);
mRecordMeter->SetMinSize( wxSize( width, height ));
}
if( mPlayMeter ) {
mPlayMeter->SetStyle(bHorizontal ? Meter::HorizontalStereo : Meter::VerticalStereo);
mPlayMeter->SetMinSize( wxSize( width, height ));
mSizer->SetItemPosition( mPlayMeter, pos );
}
// And make it happen
Layout();
}
void MeterToolBar::GetMeters(Meter **playMeter, Meter **recordMeter)
bool MeterToolBar::Expose( bool show )
{
if( show )
MeterToolBars::AddMeters( mPlayMeter, mRecordMeter );
else
MeterToolBars::RemoveMeters( mPlayMeter, mRecordMeter );
return ToolBar::Expose( show );
}
// Locally defined - we can change implementation easily later.
namespace MeterToolBars {
Meter * mPlayMeter=NULL;
Meter * mRecordMeter=NULL;
}
void MeterToolBars::AddMeters(Meter *playMeter, Meter *recordMeter)
{
if( playMeter != NULL ) mPlayMeter = playMeter;
if( recordMeter != NULL ) mRecordMeter = recordMeter;
}
void MeterToolBars::RemoveMeters(Meter *playMeter, Meter *recordMeter)
{
if( mPlayMeter == playMeter ) mPlayMeter = NULL;
if( mRecordMeter == recordMeter ) mRecordMeter = NULL;
}
void MeterToolBars::GetMeters(Meter **playMeter, Meter **recordMeter)
{
*playMeter = mPlayMeter;
*recordMeter = mRecordMeter;
}
void MeterToolBar::StartMonitoring()
void MeterToolBars::StartMonitoring()
{
if( mRecordMeter == NULL )
return;
wxASSERT( mRecordMeter );
mRecordMeter->StartMonitoring();
//wxASSERT( mPlayMeter );
//mPlayMeter->StartMonitoring();
}
void MeterToolBars::Clear()
{
if (mPlayMeter) mPlayMeter->Clear();
if (mRecordMeter) mRecordMeter->Clear();
}