mirror of
https://github.com/cookiengineer/audacity
synced 2025-06-25 08:38:39 +02:00
... Problem with static initialization order of ReservedCommandFlags, caused wrong enablement of menu items (at least on Mac), such as Plot Spectrum or Contrast enabled when there was no selection
143 lines
3.7 KiB
C++
143 lines
3.7 KiB
C++
/**********************************************************************
|
|
|
|
Audacity: A Digital Audio Editor
|
|
|
|
SelectUtilities.cpp
|
|
|
|
Paul Licameli split from SelectMenus.cpp
|
|
|
|
**********************************************************************/
|
|
|
|
#include "SelectUtilities.h"
|
|
|
|
#include <wx/frame.h>
|
|
|
|
#include "CommonCommandFlags.h"
|
|
#include "Menus.h"
|
|
#include "Project.h"
|
|
#include "ProjectHistory.h"
|
|
#include "ProjectSettings.h"
|
|
#include "SelectionState.h"
|
|
#include "TrackPanelAx.h"
|
|
#include "TrackPanel.h"
|
|
#include "ViewInfo.h"
|
|
#include "WaveTrack.h"
|
|
|
|
namespace {
|
|
|
|
// Temporal selection (not TimeTrack selection)
|
|
// potentially for all wave tracks.
|
|
void DoSelectTimeAndAudioTracks
|
|
(AudacityProject &project, bool bAllTime, bool bAllTracks)
|
|
{
|
|
auto &tracks = TrackList::Get( project );
|
|
auto &selectedRegion = ViewInfo::Get( project ).selectedRegion;
|
|
|
|
if( bAllTime )
|
|
selectedRegion.setTimes(
|
|
tracks.GetMinOffset(), tracks.GetEndTime());
|
|
|
|
if( bAllTracks ) {
|
|
// Unselect all tracks before selecting audio.
|
|
for (auto t : tracks.Any())
|
|
t->SetSelected(false);
|
|
for (auto t : tracks.Any<WaveTrack>())
|
|
t->SetSelected(true);
|
|
|
|
ProjectHistory::Get( project ).ModifyState(false);
|
|
}
|
|
}
|
|
|
|
}
|
|
namespace SelectUtilities {
|
|
|
|
void DoSelectTimeAndTracks
|
|
(AudacityProject &project, bool bAllTime, bool bAllTracks)
|
|
{
|
|
auto &tracks = TrackList::Get( project );
|
|
auto &selectedRegion = ViewInfo::Get( project ).selectedRegion;
|
|
|
|
if( bAllTime )
|
|
selectedRegion.setTimes(
|
|
tracks.GetMinOffset(), tracks.GetEndTime());
|
|
|
|
if( bAllTracks ) {
|
|
for (auto t : tracks.Any())
|
|
t->SetSelected(true);
|
|
|
|
ProjectHistory::Get( project ).ModifyState(false);
|
|
}
|
|
}
|
|
|
|
void SelectNone( AudacityProject &project )
|
|
{
|
|
auto &tracks = TrackList::Get( project );
|
|
for (auto t : tracks.Any())
|
|
t->SetSelected(false);
|
|
|
|
auto &trackPanel = TrackPanel::Get( project );
|
|
trackPanel.Refresh(false);
|
|
}
|
|
|
|
// Select the full time range, if no
|
|
// time range is selected.
|
|
void SelectAllIfNone( AudacityProject &project )
|
|
{
|
|
auto &viewInfo = ViewInfo::Get( project );
|
|
auto flags = MenuManager::Get( project ).GetUpdateFlags();
|
|
if((flags & TracksSelectedFlag()).none() ||
|
|
viewInfo.selectedRegion.isPoint())
|
|
DoSelectAllAudio( project );
|
|
}
|
|
|
|
void DoListSelection
|
|
(AudacityProject &project, Track *t, bool shift, bool ctrl, bool modifyState)
|
|
{
|
|
auto &tracks = TrackList::Get( project );
|
|
auto &selectionState = SelectionState::Get( project );
|
|
const auto &settings = ProjectSettings::Get( project );
|
|
auto &viewInfo = ViewInfo::Get( project );
|
|
auto &window = GetProjectFrame( project );
|
|
|
|
auto isSyncLocked = settings.IsSyncLocked();
|
|
|
|
selectionState.HandleListSelection(
|
|
tracks, viewInfo, *t,
|
|
shift, ctrl, isSyncLocked );
|
|
|
|
if (! ctrl )
|
|
TrackFocus::Get( project ).Set( t );
|
|
window.Refresh(false);
|
|
if (modifyState)
|
|
ProjectHistory::Get( project ).ModifyState(true);
|
|
}
|
|
|
|
void DoSelectAll(AudacityProject &project)
|
|
{
|
|
DoSelectTimeAndTracks( project, true, true );
|
|
}
|
|
|
|
void DoSelectAllAudio(AudacityProject &project)
|
|
{
|
|
DoSelectTimeAndAudioTracks( project, true, true );
|
|
}
|
|
|
|
// This function selects all tracks if no tracks selected,
|
|
// and all time if no time selected.
|
|
// There is an argument for making it just count wave tracks,
|
|
// However you could then not select a label and cut it,
|
|
// without this function selecting all tracks.
|
|
void DoSelectSomething(AudacityProject &project)
|
|
{
|
|
auto &tracks = TrackList::Get( project );
|
|
auto &selectedRegion = ViewInfo::Get( project ).selectedRegion;
|
|
|
|
bool bTime = selectedRegion.isPoint();
|
|
bool bTracks = tracks.Selected().empty();
|
|
|
|
if( bTime || bTracks )
|
|
DoSelectTimeAndTracks( project, bTime, bTracks );
|
|
}
|
|
|
|
}
|