1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-11-24 06:10:09 +01:00

Popup menu table for wave track has member function to get the track

This commit is contained in:
Paul Licameli
2020-02-14 22:37:05 -05:00
parent cfd07af245
commit 4d7a9f00a1
3 changed files with 39 additions and 23 deletions

View File

@@ -30,7 +30,6 @@ Paul Licameli split from TrackPanel.cpp
#include "../../../../TrackPanelAx.h" #include "../../../../TrackPanelAx.h"
#include "../../../../TrackPanelMouseEvent.h" #include "../../../../TrackPanelMouseEvent.h"
#include "../../../../WaveTrack.h" #include "../../../../WaveTrack.h"
#include "../../../../widgets/PopupMenuTable.h"
#include "../../../../effects/RealtimeEffectManager.h" #include "../../../../effects/RealtimeEffectManager.h"
#include "../../../../ondemand/ODManager.h" #include "../../../../ondemand/ODManager.h"
#include "../../../../prefs/PrefsDialog.h" #include "../../../../prefs/PrefsDialog.h"
@@ -87,6 +86,11 @@ std::vector<UIHandlePtr> WaveTrackControls::HitTest
return PlayableTrackControls::HitTest(st, pProject); return PlayableTrackControls::HitTest(st, pProject);
} }
WaveTrack &WaveTrackPopupMenuTable::FindWaveTrack() const
{
return *static_cast< WaveTrack* >( mpData->pTrack );
};
enum { enum {
reserveDisplays = 100, reserveDisplays = 100,
@@ -550,12 +554,14 @@ void RateMenuTable::OnRateOther(wxCommandEvent &)
//============================================================================= //=============================================================================
// Class defining common command handlers for mono and stereo tracks // Class defining common command handlers for mono and stereo tracks
struct WaveTrackMenuTable : ComputedPopupMenuTable< WaveTrackMenuTable > struct WaveTrackMenuTable
: ComputedPopupMenuTable< WaveTrackMenuTable, WaveTrackPopupMenuTable >
{ {
static WaveTrackMenuTable &Instance(); static WaveTrackMenuTable &Instance();
WaveTrackMenuTable() WaveTrackMenuTable()
: ComputedPopupMenuTable< WaveTrackMenuTable >{ "WaveTrack" } : ComputedPopupMenuTable< WaveTrackMenuTable, WaveTrackPopupMenuTable >{
"WaveTrack" }
{} {}
void InitUserData(void *pUserData) override; void InitUserData(void *pUserData) override;
@@ -567,8 +573,6 @@ struct WaveTrackMenuTable : ComputedPopupMenuTable< WaveTrackMenuTable >
DECLARE_POPUP_MENU(WaveTrackMenuTable); DECLARE_POPUP_MENU(WaveTrackMenuTable);
PlayableTrackControls::InitMenuData *mpData{};
void OnMultiView(wxCommandEvent & event); void OnMultiView(wxCommandEvent & event);
void OnSetDisplay(wxCommandEvent & event); void OnSetDisplay(wxCommandEvent & event);
void OnSpectrogramSettings(wxCommandEvent & event); void OnSpectrogramSettings(wxCommandEvent & event);
@@ -608,15 +612,11 @@ static std::vector<WaveTrackSubViewType> AllTypes()
BEGIN_POPUP_MENU(WaveTrackMenuTable) BEGIN_POPUP_MENU(WaveTrackMenuTable)
// Functions usable in callbacks to check and disable items // Functions usable in callbacks to check and disable items
static const auto findTrack =
[]( PopupMenuHandler &handler ) -> WaveTrack & {
return *static_cast< WaveTrack* >(
static_cast< WaveTrackMenuTable& >( handler ).mpData->pTrack);
};
static const auto isMono = static const auto isMono =
[]( PopupMenuHandler &handler ) -> bool { []( PopupMenuHandler &handler ) -> bool {
return 1 == TrackList::Channels( &findTrack( handler ) ).size(); auto &track =
static_cast< WaveTrackMenuTable& >( handler ).FindWaveTrack();
return 1 == TrackList::Channels( &track ).size();
}; };
static const auto isUnsafe = static const auto isUnsafe =
@@ -637,7 +637,8 @@ BEGIN_POPUP_MENU(WaveTrackMenuTable)
POPUP_MENU_FN( OnMultiView ), POPUP_MENU_FN( OnMultiView ),
table, table,
[]( PopupMenuHandler &handler, wxMenu &menu, int id ){ []( PopupMenuHandler &handler, wxMenu &menu, int id ){
auto &track = findTrack( handler ); auto &table = static_cast< WaveTrackMenuTable& >( handler );
auto &track = table.FindWaveTrack();
const auto &view = WaveTrackView::Get( track ); const auto &view = WaveTrackView::Get( track );
menu.Check( id, view.GetMultiView() ); menu.Check( id, view.GetMultiView() );
} ); } );
@@ -662,7 +663,9 @@ BEGIN_POPUP_MENU(WaveTrackMenuTable)
(std::find( begin, allTypes.end(), type ) - begin); (std::find( begin, allTypes.end(), type ) - begin);
}; };
auto &track = findTrack( handler ); auto &table = static_cast< WaveTrackMenuTable& >( handler );
auto &track = table.FindWaveTrack();
const auto &view = WaveTrackView::Get( track ); const auto &view = WaveTrackView::Get( track );
const auto displays = view.GetDisplays(); const auto displays = view.GetDisplays();
@@ -680,7 +683,7 @@ BEGIN_POPUP_MENU(WaveTrackMenuTable)
}; };
}; };
Append( [type, id]( My &table ) -> Registry::BaseItemPtr { Append( [type, id]( My &table ) -> Registry::BaseItemPtr {
const auto pTrack = &findTrack( table ); const auto pTrack = &table.FindWaveTrack();
const auto &view = WaveTrackView::Get( *pTrack ); const auto &view = WaveTrackView::Get( *pTrack );
const auto itemType = const auto itemType =
view.GetMultiView() ? Entry::CheckItem : Entry::RadioItem; view.GetMultiView() ? Entry::CheckItem : Entry::RadioItem;
@@ -695,7 +698,7 @@ BEGIN_POPUP_MENU(WaveTrackMenuTable)
// Conditionally add sub-menu for wave color, if showing waveform // Conditionally add sub-menu for wave color, if showing waveform
Append( []( My &table ) -> Registry::BaseItemPtr { Append( []( My &table ) -> Registry::BaseItemPtr {
const auto pTrack = &findTrack( table ); const auto pTrack = &table.FindWaveTrack();
const auto &view = WaveTrackView::Get( *pTrack ); const auto &view = WaveTrackView::Get( *pTrack );
const auto displays = view.GetDisplays(); const auto displays = view.GetDisplays();
bool hasWaveform = (displays.end() != std::find( bool hasWaveform = (displays.end() != std::find(
@@ -712,7 +715,7 @@ BEGIN_POPUP_MENU(WaveTrackMenuTable)
// Conditionally add sub-menu for spectrogram settings, if showing spectrum // Conditionally add sub-menu for spectrogram settings, if showing spectrum
Append( []( My &table ) -> Registry::BaseItemPtr { Append( []( My &table ) -> Registry::BaseItemPtr {
const auto pTrack = &findTrack( table ); const auto pTrack = &table.FindWaveTrack();
const auto &view = WaveTrackView::Get( *pTrack ); const auto &view = WaveTrackView::Get( *pTrack );
const auto displays = view.GetDisplays(); const auto displays = view.GetDisplays();
bool hasSpectrum = (displays.end() != std::find( bool hasSpectrum = (displays.end() != std::find(
@@ -772,7 +775,8 @@ BEGIN_POPUP_MENU(WaveTrackMenuTable)
AudacityProject &project = AudacityProject &project =
static_cast< WaveTrackMenuTable& >( handler ).mpData->project; static_cast< WaveTrackMenuTable& >( handler ).mpData->project;
auto &tracks = TrackList::Get( project ); auto &tracks = TrackList::Get( project );
auto &track = findTrack( handler ); auto &table = static_cast< WaveTrackMenuTable& >( handler );
auto &track = table.FindWaveTrack();
auto next = * ++ tracks.Find(&track); auto next = * ++ tracks.Find(&track);
canMakeStereo = canMakeStereo =
(next && (next &&
@@ -786,8 +790,10 @@ BEGIN_POPUP_MENU(WaveTrackMenuTable)
AppendItem( "Swap", OnSwapChannelsID, XO("Swap Stereo &Channels"), AppendItem( "Swap", OnSwapChannelsID, XO("Swap Stereo &Channels"),
POPUP_MENU_FN( OnSwapChannels ), POPUP_MENU_FN( OnSwapChannels ),
[]( PopupMenuHandler &handler, wxMenu &menu, int id ){ []( PopupMenuHandler &handler, wxMenu &menu, int id ){
auto &track =
static_cast< WaveTrackMenuTable& >( handler ).FindWaveTrack();
bool isStereo = bool isStereo =
2 == TrackList::Channels( &findTrack( handler ) ).size(); 2 == TrackList::Channels( &track ).size();
menu.Enable( id, isStereo && !isUnsafe( handler ) ); menu.Enable( id, isStereo && !isUnsafe( handler ) );
} }
); );
@@ -1435,3 +1441,4 @@ auto GetDefaultWaveTrackHeight::Implementation() -> Function {
}; };
} }
static GetDefaultWaveTrackHeight registerGetDefaultWaveTrackHeight; static GetDefaultWaveTrackHeight registerGetDefaultWaveTrackHeight;

View File

@@ -68,4 +68,13 @@ private:
std::weak_ptr<PanSliderHandle> mPanHandle; std::weak_ptr<PanSliderHandle> mPanHandle;
}; };
#include "../../../../widgets/PopupMenuTable.h"
struct WaveTrackPopupMenuTable : public PopupMenuTable
{
using PopupMenuTable::PopupMenuTable;
PlayableTrackControls::InitMenuData *mpData{};
WaveTrack &FindWaveTrack () const;
};
#endif #endif

View File

@@ -187,12 +187,12 @@ protected:
// A "CRTP" class that injects a convenience function, which appends a menu item // A "CRTP" class that injects a convenience function, which appends a menu item
// computed lazily by a function that is passed the table (after it has stored // computed lazily by a function that is passed the table (after it has stored
// its user data) // its user data)
template< typename Derived > template< typename Derived, typename Base = PopupMenuTable >
class ComputedPopupMenuTable : public PopupMenuTable class ComputedPopupMenuTable : public Base
{ {
public: public:
using PopupMenuTable::PopupMenuTable; using Base::Base;
using PopupMenuTable::Append; using Base::Append;
// Appends a computed item, which may be omitted when function returns null // Appends a computed item, which may be omitted when function returns null
// and thus can be a conditional item // and thus can be a conditional item