1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-07-24 00:18:07 +02:00

MixerBoard listens for events for track sliders, mute, solo, name

This commit is contained in:
Paul Licameli 2018-02-11 17:17:31 -05:00
parent 5ab2faceea
commit ccc2bbe3ef
7 changed files with 33 additions and 208 deletions

View File

@ -212,7 +212,7 @@ MixerTrackCluster::MixerTrackCluster(wxWindow* parent,
.Style( DB_SLIDER ) .Style( DB_SLIDER )
.Orientation( wxVERTICAL )); .Orientation( wxVERTICAL ));
mSlider_Gain->SetName(_("Gain")); mSlider_Gain->SetName(_("Gain"));
this->UpdateGain();
#ifdef EXPERIMENTAL_MIDI_OUT #ifdef EXPERIMENTAL_MIDI_OUT
mSlider_Velocity = mSlider_Velocity =
safenew MixerTrackSlider( safenew MixerTrackSlider(
@ -224,7 +224,6 @@ MixerTrackCluster::MixerTrackCluster(wxWindow* parent,
.Style( VEL_SLIDER ) .Style( VEL_SLIDER )
.Orientation( wxVERTICAL )); .Orientation( wxVERTICAL ));
mSlider_Velocity->SetName(_("Velocity")); mSlider_Velocity->SetName(_("Velocity"));
this->UpdateVelocity();
#endif #endif
// other controls and meter at right // other controls and meter at right
@ -260,8 +259,6 @@ MixerTrackCluster::MixerTrackCluster(wxWindow* parent,
ASlider::Options{}.Style( PAN_SLIDER )); ASlider::Options{}.Style( PAN_SLIDER ));
mSlider_Pan->SetName(_("Pan")); mSlider_Pan->SetName(_("Pan"));
this->UpdatePan();
// mute/solo buttons stacked below Pan slider // mute/solo buttons stacked below Pan slider
ctrlPos.y += PAN_HEIGHT + kDoubleInset; ctrlPos.y += PAN_HEIGHT + kDoubleInset;
ctrlSize.Set(mMixerBoard->mMuteSoloWidth, MUTE_SOLO_HEIGHT); ctrlSize.Set(mMixerBoard->mMuteSoloWidth, MUTE_SOLO_HEIGHT);
@ -278,7 +275,6 @@ MixerTrackCluster::MixerTrackCluster(wxWindow* parent,
*(mMixerBoard->mImageMuteUp), *(mMixerBoard->mImageMuteOver), *(mMixerBoard->mImageMuteUp), *(mMixerBoard->mImageMuteOver),
*(mMixerBoard->mImageMuteDown), *(mMixerBoard->mImageMuteDown), *(mMixerBoard->mImageMuteDown), *(mMixerBoard->mImageMuteDown),
*(mMixerBoard->mImageMuteDisabled)); *(mMixerBoard->mImageMuteDisabled));
this->UpdateMute();
ctrlPos.y += MUTE_SOLO_HEIGHT; ctrlPos.y += MUTE_SOLO_HEIGHT;
mToggleButton_Solo = mToggleButton_Solo =
@ -289,7 +285,6 @@ MixerTrackCluster::MixerTrackCluster(wxWindow* parent,
*(mMixerBoard->mImageSoloDisabled), *(mMixerBoard->mImageSoloDisabled),
true); // toggle button true); // toggle button
mToggleButton_Solo->SetName(_("Solo")); mToggleButton_Solo->SetName(_("Solo"));
this->UpdateSolo();
bool bSoloNone = mProject->IsSoloNone(); bool bSoloNone = mProject->IsSoloNone();
mToggleButton_Solo->Show(!bSoloNone); mToggleButton_Solo->Show(!bSoloNone);
@ -322,11 +317,12 @@ MixerTrackCluster::MixerTrackCluster(wxWindow* parent,
mMeter->SetToolTip(_("Signal Level Meter")); mMeter->SetToolTip(_("Signal Level Meter"));
#endif // wxUSE_TOOLTIPS #endif // wxUSE_TOOLTIPS
UpdateForStateChange();
#ifdef __WXMAC__ #ifdef __WXMAC__
wxSizeEvent event(GetSize(), GetId()); wxSizeEvent event(GetSize(), GetId());
event.SetEventObject(this); event.SetEventObject(this);
GetEventHandler()->ProcessEvent(event); GetEventHandler()->ProcessEvent(event);
UpdateGain();
#endif #endif
} }
@ -450,77 +446,51 @@ void MixerTrackCluster::ResetMeter(const bool bResetClipping)
} }
// These are used by TrackPanel for synchronizing control states, etc. // Update appearance to match the state of the track
// Update the controls that can be affected by state change.
void MixerTrackCluster::UpdateForStateChange() void MixerTrackCluster::UpdateForStateChange()
{
this->UpdateName();
this->UpdatePan();
this->UpdateGain();
}
void MixerTrackCluster::UpdateName()
{ {
const wxString newName = mTrack->GetName(); const wxString newName = mTrack->GetName();
SetName(newName); if (newName != GetName()) {
mStaticText_TrackName->SetLabel(newName); SetName(newName);
mStaticText_TrackName->SetName(newName); mStaticText_TrackName->SetLabel(newName);
#if wxUSE_TOOLTIPS mStaticText_TrackName->SetName(newName);
mStaticText_TrackName->SetToolTip(newName); #if wxUSE_TOOLTIPS
#endif mStaticText_TrackName->SetToolTip(newName);
mBitmapButton_MusicalInstrument->SetBitmapLabel( #endif
*(mMixerBoard->GetMusicalInstrumentBitmap(mTrack.get()))); mBitmapButton_MusicalInstrument->SetBitmapLabel(
Refresh(); *(mMixerBoard->GetMusicalInstrumentBitmap(mTrack.get())));
} }
void MixerTrackCluster::UpdateMute()
{
mToggleButton_Mute->SetAlternateIdx(mTrack->GetSolo() ? 1 : 0); mToggleButton_Mute->SetAlternateIdx(mTrack->GetSolo() ? 1 : 0);
if (mTrack->GetMute()) if (mTrack->GetMute())
mToggleButton_Mute->PushDown(); mToggleButton_Mute->PushDown();
else else
mToggleButton_Mute->PopUp(); mToggleButton_Mute->PopUp();
}
void MixerTrackCluster::UpdateSolo()
{
bool bIsSolo = mTrack->GetSolo(); bool bIsSolo = mTrack->GetSolo();
if (bIsSolo) if (bIsSolo)
mToggleButton_Solo->PushDown(); mToggleButton_Solo->PushDown();
else else
mToggleButton_Solo->PopUp(); mToggleButton_Solo->PopUp();
mToggleButton_Mute->SetAlternateIdx(bIsSolo ? 1 : 0); mToggleButton_Mute->SetAlternateIdx(bIsSolo ? 1 : 0);
}
void MixerTrackCluster::UpdatePan() if (!GetWave())
{
if (!GetWave()) {
mSlider_Pan->Hide(); mSlider_Pan->Hide();
return; else
} mSlider_Pan->Set(GetWave()->GetPan());
mSlider_Pan->Set(GetWave()->GetPan());
}
void MixerTrackCluster::UpdateGain() if (!GetWave())
{
if (!GetWave()) {
mSlider_Gain->Hide(); mSlider_Gain->Hide();
return; else
} mSlider_Gain->Set(GetWave()->GetGain());
mSlider_Gain->Set(GetWave()->GetGain());
}
#ifdef EXPERIMENTAL_MIDI_OUT #ifdef EXPERIMENTAL_MIDI_OUT
void MixerTrackCluster::UpdateVelocity() if (!GetNote())
{
if (!GetNote()) {
mSlider_Velocity->Hide(); mSlider_Velocity->Hide();
return; else
} mSlider_Velocity->Set(GetNote()->GetVelocity());
mSlider_Velocity->Set(GetNote()->GetVelocity());
}
#endif #endif
}
void MixerTrackCluster::UpdateMeter(const double t0, const double t1) void MixerTrackCluster::UpdateMeter(const double t0, const double t1)
{ {
@ -704,6 +674,8 @@ void MixerTrackCluster::OnMouseEvent(wxMouseEvent& event)
void MixerTrackCluster::OnPaint(wxPaintEvent & WXUNUSED(event)) void MixerTrackCluster::OnPaint(wxPaintEvent & WXUNUSED(event))
{ {
UpdateForStateChange();
auto selected = mTrack->GetSelected(); auto selected = mTrack->GetSelected();
wxColour col = theTheme.Colour(selected ? clrTrackInfoSelected : clrTrackInfo) ; wxColour col = theTheme.Colour(selected ? clrTrackInfoSelected : clrTrackInfo) ;
@ -773,8 +745,6 @@ void MixerTrackCluster::OnButton_Mute(wxCommandEvent& WXUNUSED(event))
// Update the TrackPanel correspondingly. // Update the TrackPanel correspondingly.
if (mProject->IsSoloSimple()) if (mProject->IsSoloSimple())
{ {
// Have to refresh all tracks.
mMixerBoard->UpdateSolo();
mProject->RedrawProject(); mProject->RedrawProject();
} }
else else
@ -789,12 +759,6 @@ void MixerTrackCluster::OnButton_Solo(wxCommandEvent& WXUNUSED(event))
mToggleButton_Mute->SetAlternateIdx(bIsSolo ? 1 : 0); mToggleButton_Mute->SetAlternateIdx(bIsSolo ? 1 : 0);
// Update the TrackPanel correspondingly. // Update the TrackPanel correspondingly.
if (mProject->IsSoloSimple())
{
// Have to refresh all tracks.
mMixerBoard->UpdateMute();
mMixerBoard->UpdateSolo();
}
// Bug 509: Must repaint all, as many tracks can change with one Solo change. // Bug 509: Must repaint all, as many tracks can change with one Solo change.
mProject->RedrawProject(); mProject->RedrawProject();
} }
@ -957,6 +921,10 @@ MixerBoard::MixerBoard(AudacityProject* pProject,
mProject->GetTracks()->Bind(EVT_TRACKLIST_DELETION, mProject->GetTracks()->Bind(EVT_TRACKLIST_DELETION,
&MixerBoard::OnTrackSetChanged, &MixerBoard::OnTrackSetChanged,
this); this);
mProject->GetTracks()->Bind(EVT_TRACKLIST_TRACK_DATA_CHANGE,
&MixerBoard::OnTrackChanged,
this);
} }
@ -1157,80 +1125,6 @@ void MixerBoard::ResetMeters(const bool bResetClipping)
mMixerTrackClusters[i]->ResetMeter(bResetClipping); mMixerTrackClusters[i]->ResetMeter(bResetClipping);
} }
void MixerBoard::UpdateName(const PlayableTrack* pTrack)
{
MixerTrackCluster* pMixerTrackCluster;
this->FindMixerTrackCluster(pTrack, &pMixerTrackCluster);
if (pMixerTrackCluster)
pMixerTrackCluster->UpdateName();
}
void MixerBoard::UpdateMute(const PlayableTrack* pTrack /*= NULL*/) // NULL means update for all tracks.
{
if (pTrack == NULL)
{
for (unsigned int i = 0; i < mMixerTrackClusters.size(); i++)
mMixerTrackClusters[i]->UpdateMute();
}
else
{
MixerTrackCluster* pMixerTrackCluster;
FindMixerTrackCluster(pTrack, &pMixerTrackCluster);
if (pMixerTrackCluster)
pMixerTrackCluster->UpdateMute();
}
}
void MixerBoard::UpdateSolo(const PlayableTrack* pTrack /*= NULL*/) // NULL means update for all tracks.
{
if (pTrack == NULL)
{
for (unsigned int i = 0; i < mMixerTrackClusters.size(); i++)
mMixerTrackClusters[i]->UpdateSolo();
}
else
{
MixerTrackCluster* pMixerTrackCluster;
FindMixerTrackCluster(pTrack, &pMixerTrackCluster);
if (pMixerTrackCluster)
pMixerTrackCluster->UpdateSolo();
}
}
void MixerBoard::UpdatePan(const PlayableTrack* pTrack)
{
if (pTrack == NULL)
{
for (unsigned int i = 0; i < mMixerTrackClusters.size(); i++)
mMixerTrackClusters[i]->UpdatePan();
}
else
{
MixerTrackCluster* pMixerTrackCluster;
FindMixerTrackCluster(pTrack, &pMixerTrackCluster);
if (pMixerTrackCluster)
pMixerTrackCluster->UpdatePan();
}
}
void MixerBoard::UpdateGain(const PlayableTrack* pTrack)
{
MixerTrackCluster* pMixerTrackCluster;
FindMixerTrackCluster(pTrack, &pMixerTrackCluster);
if (pMixerTrackCluster)
pMixerTrackCluster->UpdateGain();
}
#ifdef EXPERIMENTAL_MIDI_OUT
void MixerBoard::UpdateVelocity(const PlayableTrack* pTrack)
{
MixerTrackCluster* pMixerTrackCluster;
FindMixerTrackCluster(pTrack, &pMixerTrackCluster);
if (pMixerTrackCluster)
pMixerTrackCluster->UpdateVelocity();
}
#endif
void MixerBoard::UpdateMeters(const double t1, const bool bLoopedPlay) void MixerBoard::UpdateMeters(const double t1, const bool bLoopedPlay)
{ {
if (!this->IsShown() || (t1 == BAD_STREAM_TIME)) if (!this->IsShown() || (t1 == BAD_STREAM_TIME))

View File

@ -98,16 +98,7 @@ public:
void ResetMeter(const bool bResetClipping); void ResetMeter(const bool bResetClipping);
// These are used by TrackPanel for synchronizing control states. void UpdateForStateChange();
void UpdateForStateChange(); // Update the controls that can be affected by state change.
void UpdateName();
void UpdateMute();
void UpdateSolo();
void UpdatePan();
void UpdateGain();
#ifdef EXPERIMENTAL_MIDI_OUT
void UpdateVelocity();
#endif
void UpdateMeter(const double t0, const double t1); void UpdateMeter(const double t0, const double t1);
private: private:
@ -225,15 +216,6 @@ public:
void ResetMeters(const bool bResetClipping); void ResetMeters(const bool bResetClipping);
void UpdateName(const PlayableTrack* pTrack);
void UpdateMute(const PlayableTrack* pTrack = NULL); // NULL means update for all tracks.
void UpdateSolo(const PlayableTrack* pTrack = NULL); // NULL means update for all tracks.
void UpdatePan(const PlayableTrack* pTrack = NULL); // NULL means update for all tracks.
void UpdateGain(const PlayableTrack* pTrack);
#ifdef EXPERIMENTAL_MIDI_OUT
void UpdateVelocity(const PlayableTrack* pTrack);
#endif
void UpdateMeters(const double t1, const bool bLoopedPlay); void UpdateMeters(const double t1, const bool bLoopedPlay);
void UpdateWidth(); void UpdateWidth();
@ -254,7 +236,6 @@ private:
void OnTrackSetChanged(wxEvent &event); void OnTrackSetChanged(wxEvent &event);
void OnTrackChanged(TrackListEvent &event); void OnTrackChanged(TrackListEvent &event);
public: public:
// mute & solo button images: Create once and store on MixerBoard for use in all MixerTrackClusters. // mute & solo button images: Create once and store on MixerBoard for use in all MixerTrackClusters.
std::unique_ptr<wxImage> mImageMuteUp, mImageMuteOver, mImageMuteDown, std::unique_ptr<wxImage> mImageMuteUp, mImageMuteOver, mImageMuteDown,

View File

@ -5524,14 +5524,6 @@ void AudacityProject::DoTrackMute(Track *t, bool exclusive)
{ {
HandleTrackMute(t, exclusive); HandleTrackMute(t, exclusive);
// Update mixer board, too.
MixerBoard* pMixerBoard = this->GetMixerBoard();
if (pMixerBoard)
{
pMixerBoard->UpdateMute(); // Update for all tracks.
pMixerBoard->UpdateSolo(); // Update for all tracks.
}
mTrackPanel->UpdateAccessibility(); mTrackPanel->UpdateAccessibility();
mTrackPanel->Refresh(false); mTrackPanel->Refresh(false);
} }
@ -5540,14 +5532,6 @@ void AudacityProject::DoTrackSolo(Track *t, bool exclusive)
{ {
HandleTrackSolo(t, exclusive); HandleTrackSolo(t, exclusive);
// Update mixer board, too.
MixerBoard* pMixerBoard = this->GetMixerBoard();
if (pMixerBoard)
{
pMixerBoard->UpdateMute(); // Update for all tracks.
pMixerBoard->UpdateSolo(); // Update for all tracks.
}
mTrackPanel->UpdateAccessibility(); mTrackPanel->UpdateAccessibility();
mTrackPanel->Refresh(false); mTrackPanel->Refresh(false);
} }

View File

@ -3,7 +3,7 @@
#include "../LabelTrack.h" #include "../LabelTrack.h"
#include "../Menus.h" #include "../Menus.h"
#include "../Mix.h" #include "../Mix.h"
#include "../MixerBoard.h"
#include "../Prefs.h" #include "../Prefs.h"
#include "../Project.h" #include "../Project.h"
#include "../ShuttleGui.h" #include "../ShuttleGui.h"
@ -13,6 +13,7 @@
#include "../WaveTrack.h" #include "../WaveTrack.h"
#include "../commands/CommandContext.h" #include "../commands/CommandContext.h"
#include "../commands/CommandManager.h" #include "../commands/CommandManager.h"
#include "../widgets/ASlider.h"
#include <wx/combobox.h> #include <wx/combobox.h>
@ -103,7 +104,6 @@ void DoMixAndRender
void DoPanTracks(AudacityProject &project, float PanValue) void DoPanTracks(AudacityProject &project, float PanValue)
{ {
auto tracks = project.GetTracks(); auto tracks = project.GetTracks();
auto mixerBoard = project.GetMixerBoard();
// count selected wave tracks // count selected wave tracks
const auto range = tracks->Any< WaveTrack >(); const auto range = tracks->Any< WaveTrack >();
@ -115,8 +115,6 @@ void DoPanTracks(AudacityProject &project, float PanValue)
left->SetPan( PanValue ); left->SetPan( PanValue );
project.RedrawProject(); project.RedrawProject();
if (mixerBoard)
mixerBoard->UpdatePan();
auto flags = UndoPush::AUTOSAVE; auto flags = UndoPush::AUTOSAVE;
/*i18n-hint: One or more audio tracks have been panned*/ /*i18n-hint: One or more audio tracks have been panned*/
@ -832,7 +830,6 @@ void OnMuteAllTracks(const CommandContext &context)
auto tracks = project.GetTracks(); auto tracks = project.GetTracks();
auto soloSimple = project.IsSoloSimple(); auto soloSimple = project.IsSoloSimple();
auto soloNone = project.IsSoloNone(); auto soloNone = project.IsSoloNone();
auto mixerBoard = project.GetMixerBoard();
for (auto pt : tracks->Any<PlayableTrack>()) for (auto pt : tracks->Any<PlayableTrack>())
{ {
@ -843,11 +840,6 @@ void OnMuteAllTracks(const CommandContext &context)
project.ModifyState(true); project.ModifyState(true);
project.RedrawProject(); project.RedrawProject();
if (mixerBoard) {
mixerBoard->UpdateMute();
if (soloSimple || soloNone)
mixerBoard->UpdateSolo();
}
} }
void OnUnmuteAllTracks(const CommandContext &context) void OnUnmuteAllTracks(const CommandContext &context)
@ -856,7 +848,6 @@ void OnUnmuteAllTracks(const CommandContext &context)
auto tracks = project.GetTracks(); auto tracks = project.GetTracks();
auto soloSimple = project.IsSoloSimple(); auto soloSimple = project.IsSoloSimple();
auto soloNone = project.IsSoloNone(); auto soloNone = project.IsSoloNone();
auto mixerBoard = project.GetMixerBoard();
for (auto pt : tracks->Any<PlayableTrack>()) for (auto pt : tracks->Any<PlayableTrack>())
{ {
@ -867,11 +858,6 @@ void OnUnmuteAllTracks(const CommandContext &context)
project.ModifyState(true); project.ModifyState(true);
project.RedrawProject(); project.RedrawProject();
if (mixerBoard) {
mixerBoard->UpdateMute();
if (soloSimple || soloNone)
mixerBoard->UpdateSolo();
}
} }
void OnPanLeft(const CommandContext &context) void OnPanLeft(const CommandContext &context)

View File

@ -14,7 +14,6 @@
#ifdef EXPERIMENTAL_MIDI_OUT #ifdef EXPERIMENTAL_MIDI_OUT
#include "../../../../HitTestResult.h" #include "../../../../HitTestResult.h"
#include "../../../../MixerBoard.h"
#include "../../../../Project.h" #include "../../../../Project.h"
#include "../../../../RefreshCode.h" #include "../../../../RefreshCode.h"
#include "../../../../TrackPanel.h" // for TrackInfo #include "../../../../TrackPanel.h" // for TrackInfo
@ -51,10 +50,6 @@ UIHandle::Result VelocitySliderHandle::SetValue
if (pTrack) { if (pTrack) {
pTrack->SetVelocity(newValue); pTrack->SetVelocity(newValue);
MixerBoard *const pMixerBoard = pProject->GetMixerBoard();
if (pMixerBoard)
pMixerBoard->UpdateVelocity(pTrack.get());
} }
return RefreshCode::RefreshCell; return RefreshCode::RefreshCell;

View File

@ -12,7 +12,6 @@ Paul Licameli split from TrackPanel.cpp
#include "WaveTrackSliderHandles.h" #include "WaveTrackSliderHandles.h"
#include "../../../../HitTestResult.h" #include "../../../../HitTestResult.h"
#include "../../../../MixerBoard.h"
#include "../../../../Project.h" #include "../../../../Project.h"
#include "../../../../RefreshCode.h" #include "../../../../RefreshCode.h"
#include "../../../../TrackPanel.h" #include "../../../../TrackPanel.h"
@ -50,10 +49,6 @@ UIHandle::Result GainSliderHandle::SetValue
for (auto channel : for (auto channel :
TrackList::Channels(pTrack.get())) TrackList::Channels(pTrack.get()))
channel->SetGain(newValue); channel->SetGain(newValue);
MixerBoard *const pMixerBoard = pProject->GetMixerBoard();
if (pMixerBoard)
pMixerBoard->UpdateGain(pTrack.get());
} }
return RefreshCode::RefreshNone; return RefreshCode::RefreshNone;
@ -131,10 +126,6 @@ UIHandle::Result PanSliderHandle::SetValue(AudacityProject *pProject, float newV
for (auto channel : for (auto channel :
TrackList::Channels(pTrack.get())) TrackList::Channels(pTrack.get()))
channel->SetPan(newValue); channel->SetPan(newValue);
MixerBoard *const pMixerBoard = pProject->GetMixerBoard();
if (pMixerBoard)
pMixerBoard->UpdatePan(pTrack.get());
} }
return result; return result;

View File

@ -15,7 +15,6 @@ Paul Licameli split from TrackPanel.cpp
#include "../../HitTestResult.h" #include "../../HitTestResult.h"
#include "../../RefreshCode.h" #include "../../RefreshCode.h"
#include "../../Menus.h" #include "../../Menus.h"
#include "../../MixerBoard.h"
#include "../../Project.h" #include "../../Project.h"
#include "../../TrackPanel.h" // for TrackInfo #include "../../TrackPanel.h" // for TrackInfo
#include "../../TrackPanelMouseEvent.h" #include "../../TrackPanelMouseEvent.h"
@ -214,11 +213,6 @@ void TrackMenuTable::OnSetName(wxCommandEvent &)
for (auto channel : TrackList::Channels(pTrack)) for (auto channel : TrackList::Channels(pTrack))
channel->SetName(newName); channel->SetName(newName);
MixerBoard *const pMixerBoard = proj->GetMixerBoard();
auto pt = dynamic_cast<PlayableTrack*>(pTrack);
if (pt && pMixerBoard)
pMixerBoard->UpdateName(pt);
proj->PushState(wxString::Format(_("Renamed '%s' to '%s'"), proj->PushState(wxString::Format(_("Renamed '%s' to '%s'"),
oldName, oldName,
newName), newName),