mirror of
https://github.com/cookiengineer/audacity
synced 2025-05-01 16:19:43 +02:00
static AdornedRulerPanel::Get()...
... not member functions of AudacityProject
This commit is contained in:
parent
d1ad8f55e0
commit
7bb71257ed
@ -190,7 +190,7 @@ AdornedRulerPanel::QuickPlayRulerOverlay::QuickPlayRulerOverlay(
|
||||
|
||||
AdornedRulerPanel *AdornedRulerPanel::QuickPlayRulerOverlay::GetRuler() const
|
||||
{
|
||||
return mPartner.mProject->GetRulerPanel();
|
||||
return &Get( *mPartner.mProject );
|
||||
}
|
||||
|
||||
void AdornedRulerPanel::QuickPlayRulerOverlay::Update()
|
||||
@ -840,6 +840,40 @@ std::vector<UIHandlePtr> AdornedRulerPanel::ScrubbingCell::HitTest
|
||||
return results;
|
||||
}
|
||||
|
||||
namespace{
|
||||
AudacityProject::AttachedWindows::RegisteredFactory sKey{
|
||||
[]( AudacityProject &project ) -> wxWeakRef< wxWindow > {
|
||||
auto &viewInfo = ViewInfo::Get( project );
|
||||
auto &window = project;
|
||||
|
||||
return safenew AdornedRulerPanel( &project, window.GetTopPanel(),
|
||||
wxID_ANY,
|
||||
wxDefaultPosition,
|
||||
wxSize( -1, AdornedRulerPanel::GetRulerHeight(false) ),
|
||||
&viewInfo );
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
AdornedRulerPanel &AdornedRulerPanel::Get( AudacityProject &project )
|
||||
{
|
||||
return project.AttachedWindows::Get< AdornedRulerPanel >( sKey );
|
||||
}
|
||||
|
||||
const AdornedRulerPanel &AdornedRulerPanel::Get( const AudacityProject &project )
|
||||
{
|
||||
return Get( const_cast< AudacityProject & >( project ) );
|
||||
}
|
||||
|
||||
void AdornedRulerPanel::Destroy( AudacityProject &project )
|
||||
{
|
||||
auto *pPanel = project.AttachedWindows::Find( sKey );
|
||||
if (pPanel) {
|
||||
pPanel->wxWindow::Destroy();
|
||||
project.AttachedWindows::Assign( sKey, nullptr );
|
||||
}
|
||||
}
|
||||
|
||||
AdornedRulerPanel::AdornedRulerPanel(AudacityProject* project,
|
||||
wxWindow *parent,
|
||||
wxWindowID id,
|
||||
@ -849,6 +883,8 @@ AdornedRulerPanel::AdornedRulerPanel(AudacityProject* project,
|
||||
: CellularPanel(parent, id, pos, size, viewinfo)
|
||||
, mProject(project)
|
||||
{
|
||||
SetLayoutDirection(wxLayout_LeftToRight);
|
||||
|
||||
mQPCell = std::make_shared<QPCell>( this );
|
||||
mScrubbingCell = std::make_shared<ScrubbingCell>( this );
|
||||
|
||||
|
@ -26,6 +26,10 @@ class AUDACITY_DLL_API AdornedRulerPanel final
|
||||
, private PrefsListener
|
||||
{
|
||||
public:
|
||||
static AdornedRulerPanel &Get( AudacityProject &project );
|
||||
static const AdornedRulerPanel &Get( const AudacityProject &project );
|
||||
static void Destroy( AudacityProject &project );
|
||||
|
||||
AdornedRulerPanel(AudacityProject *project,
|
||||
wxWindow* parent,
|
||||
wxWindowID id,
|
||||
|
@ -382,7 +382,7 @@ CommandFlag MenuManager::GetFocusedFrame(AudacityProject &project)
|
||||
return TopDockHasFocus;
|
||||
}
|
||||
|
||||
if (w == project.GetRulerPanel())
|
||||
if (w == &AdornedRulerPanel::Get( project ))
|
||||
return RulerHasFocus;
|
||||
|
||||
if (dynamic_cast<NonKeystrokeInterceptingWindow*>(w)) {
|
||||
|
@ -1137,12 +1137,7 @@ AudacityProject::AudacityProject(wxWindow * parent, wxWindowID id,
|
||||
//
|
||||
// Create the horizontal ruler
|
||||
//
|
||||
mRuler = safenew AdornedRulerPanel( this, window.GetTopPanel(),
|
||||
wxID_ANY,
|
||||
wxDefaultPosition,
|
||||
wxSize( -1, AdornedRulerPanel::GetRulerHeight(false) ),
|
||||
&viewInfo );
|
||||
mRuler->SetLayoutDirection(wxLayout_LeftToRight);
|
||||
auto &ruler = AdornedRulerPanel::Get( project );
|
||||
|
||||
//
|
||||
// Create the TrackPanel and the scrollbars
|
||||
@ -1189,7 +1184,7 @@ AudacityProject::AudacityProject(wxWindow * parent, wxWindowID id,
|
||||
{
|
||||
auto ubs = std::make_unique<wxBoxSizer>(wxVERTICAL);
|
||||
ubs->Add( ToolManager::Get( project ).GetTopDock(), 0, wxEXPAND | wxALIGN_TOP );
|
||||
ubs->Add(mRuler, 0, wxEXPAND);
|
||||
ubs->Add(&ruler, 0, wxEXPAND);
|
||||
mTopPanel->SetSizer(ubs.release());
|
||||
}
|
||||
|
||||
@ -1282,7 +1277,7 @@ AudacityProject::AudacityProject(wxWindow * parent, wxWindowID id,
|
||||
|
||||
InitialState();
|
||||
FixScrollbars();
|
||||
mRuler->SetLeftOffset(trackPanel.GetLeftOffset()); // bevel on AdornedRuler
|
||||
ruler.SetLeftOffset(trackPanel.GetLeftOffset()); // bevel on AdornedRuler
|
||||
|
||||
//
|
||||
// Set the Icon
|
||||
@ -1450,12 +1445,7 @@ void AudacityProject::OnThemeChange(wxCommandEvent& evt)
|
||||
if( pToolBar )
|
||||
pToolBar->ReCreateButtons();
|
||||
}
|
||||
GetRulerPanel()->ReCreateButtons();
|
||||
}
|
||||
|
||||
AdornedRulerPanel *AudacityProject::GetRulerPanel()
|
||||
{
|
||||
return mRuler;
|
||||
AdornedRulerPanel::Get( project ).ReCreateButtons();
|
||||
}
|
||||
|
||||
int AudacityProject::GetAudioIOToken() const
|
||||
@ -2582,8 +2572,7 @@ void AudacityProject::OnCloseWindow(wxCloseEvent & event)
|
||||
// Some of the AdornedRulerPanel functions refer to the TrackPanel, so destroy this
|
||||
// before the TrackPanel is destroyed. This change was needed to stop Audacity
|
||||
// crashing when running with Jaws on Windows 10 1703.
|
||||
if (mRuler)
|
||||
mRuler->Destroy();
|
||||
AdornedRulerPanel::Destroy( project );
|
||||
|
||||
// Destroy the TrackPanel early so it's not around once we start
|
||||
// deleting things like tracks and such out from underneath it.
|
||||
@ -2660,7 +2649,6 @@ void AudacityProject::OnCloseWindow(wxCloseEvent & event)
|
||||
|
||||
// Destroys this
|
||||
pSelf.reset();
|
||||
mRuler = nullptr;
|
||||
}
|
||||
|
||||
void AudacityProject::OnOpenAudioFile(wxCommandEvent & event)
|
||||
@ -4995,18 +4983,16 @@ void AudacityProject::TP_DisplayStatusMessage(const wxString &msg)
|
||||
void AudacityProject::TP_DisplaySelection()
|
||||
{
|
||||
auto &project = *this;
|
||||
auto &ruler = AdornedRulerPanel::Get(project);
|
||||
auto &viewInfo = ViewInfo::Get( project );
|
||||
const auto &selectedRegion = viewInfo.selectedRegion;
|
||||
double audioTime;
|
||||
|
||||
if (mRuler) {
|
||||
if (!gAudioIO->IsBusy() && !mLockPlayRegion)
|
||||
mRuler->SetPlayRegion(selectedRegion.t0(),
|
||||
selectedRegion.t1());
|
||||
else
|
||||
// Cause ruler redraw anyway, because we may be zooming or scrolling
|
||||
mRuler->Refresh();
|
||||
}
|
||||
if (!gAudioIO->IsBusy() && !mLockPlayRegion)
|
||||
ruler.SetPlayRegion( selectedRegion.t0(), selectedRegion.t1() );
|
||||
else
|
||||
// Cause ruler redraw anyway, because we may be zooming or scrolling
|
||||
ruler.Refresh();
|
||||
|
||||
if (gAudioIO->IsBusy())
|
||||
audioTime = gAudioIO->GetStreamTime();
|
||||
@ -5051,10 +5037,9 @@ void AudacityProject::TP_HandleResize()
|
||||
void AudacityProject::GetPlayRegion(double* playRegionStart,
|
||||
double *playRegionEnd)
|
||||
{
|
||||
if (mRuler)
|
||||
mRuler->GetPlayRegion(playRegionStart, playRegionEnd);
|
||||
else
|
||||
*playRegionEnd = *playRegionStart = 0;
|
||||
auto &project = *this;
|
||||
AdornedRulerPanel::Get( project ).GetPlayRegion(
|
||||
playRegionStart, playRegionEnd);
|
||||
}
|
||||
|
||||
void AudacityProject::AutoSave()
|
||||
|
@ -207,7 +207,6 @@ class AUDACITY_DLL_API AudacityProject final : public wxFrame,
|
||||
void SetPlayRegionLocked(bool value) { mLockPlayRegion = value; }
|
||||
|
||||
wxString GetProjectName() const;
|
||||
AdornedRulerPanel *GetRulerPanel();
|
||||
int GetAudioIOToken() const;
|
||||
bool IsAudioActive() const;
|
||||
void SetAudioIOToken(int token);
|
||||
@ -540,7 +539,6 @@ private:
|
||||
std::unique_ptr<wxTimer> mTimer;
|
||||
void RestartTimer();
|
||||
|
||||
AdornedRulerPanel *mRuler{};
|
||||
wxPanel *mTopPanel{};
|
||||
wxWindow * mMainPage;
|
||||
wxPanel * mMainPanel;
|
||||
|
@ -213,7 +213,7 @@ namespace{
|
||||
|
||||
AudacityProject::AttachedWindows::RegisteredFactory sKey{
|
||||
[]( AudacityProject &project ) -> wxWeakRef< wxWindow > {
|
||||
auto &ruler = *project.GetRulerPanel();
|
||||
auto &ruler = AdornedRulerPanel::Get( project );
|
||||
auto &viewInfo = ViewInfo::Get( project );
|
||||
auto &window = project;
|
||||
auto mainPage = window.GetMainPage();
|
||||
|
@ -289,7 +289,7 @@ void OnCut(const CommandContext &context)
|
||||
auto &tracks = TrackList::Get( project );
|
||||
auto &trackPanel = TrackPanel::Get( project );
|
||||
auto &selectedRegion = ViewInfo::Get( project ).selectedRegion;
|
||||
auto ruler = project.GetRulerPanel();
|
||||
auto &ruler = AdornedRulerPanel::Get( project );
|
||||
|
||||
// This doesn't handle cutting labels, it handles
|
||||
// cutting the _text_ inside of labels, i.e. if you're
|
||||
@ -364,7 +364,7 @@ void OnCut(const CommandContext &context)
|
||||
|
||||
// Bug 1663
|
||||
//mRuler->ClearPlayRegion();
|
||||
ruler->DrawOverlays( true );
|
||||
ruler.DrawOverlays( true );
|
||||
|
||||
project.RedrawProject();
|
||||
}
|
||||
|
@ -270,7 +270,7 @@ void MoveWhenAudioInactive
|
||||
auto &viewInfo = ViewInfo::Get( project );
|
||||
auto &trackPanel = TrackPanel::Get( project );
|
||||
auto &tracks = TrackList::Get( project );
|
||||
auto ruler = project.GetRulerPanel();
|
||||
auto &ruler = AdornedRulerPanel::Get( project );
|
||||
|
||||
// If TIME_UNIT_SECONDS, snap-to will be off.
|
||||
int snapToTime = project.GetSnapTo();
|
||||
@ -296,7 +296,7 @@ void MoveWhenAudioInactive
|
||||
|
||||
// Move the visual cursor, avoiding an unnecessary complete redraw
|
||||
trackPanel.DrawOverlays(false);
|
||||
ruler->DrawOverlays(false);
|
||||
ruler.DrawOverlays(false);
|
||||
|
||||
// This updates the selection shown on the selection bar, and the play
|
||||
// region
|
||||
|
@ -297,7 +297,7 @@ void DoRecord( AudacityProject &project )
|
||||
void DoLockPlayRegion( AudacityProject &project )
|
||||
{
|
||||
auto &tracks = TrackList::Get( project );
|
||||
auto ruler = project.GetRulerPanel();
|
||||
auto &ruler = AdornedRulerPanel::Get( project );
|
||||
|
||||
double start, end;
|
||||
project.GetPlayRegion(&start, &end);
|
||||
@ -307,16 +307,16 @@ void DoLockPlayRegion( AudacityProject &project )
|
||||
}
|
||||
else {
|
||||
project.SetPlayRegionLocked( true );
|
||||
ruler->Refresh(false);
|
||||
ruler.Refresh(false);
|
||||
}
|
||||
}
|
||||
|
||||
void DoUnlockPlayRegion( AudacityProject &project )
|
||||
{
|
||||
auto ruler = project.GetRulerPanel();
|
||||
auto &ruler = AdornedRulerPanel::Get( project );
|
||||
|
||||
project.SetPlayRegionLocked( false );
|
||||
ruler->Refresh(false);
|
||||
ruler.Refresh(false);
|
||||
}
|
||||
|
||||
void DoTogglePinnedHead( AudacityProject &project )
|
||||
@ -330,10 +330,9 @@ void DoTogglePinnedHead( AudacityProject &project )
|
||||
if (ctb)
|
||||
ctb->StartScrollingIfPreferred();
|
||||
|
||||
auto ruler = project.GetRulerPanel();
|
||||
if (ruler)
|
||||
// Update button image
|
||||
ruler->UpdateButtonStates();
|
||||
auto &ruler = AdornedRulerPanel::Get( project );
|
||||
// Update button image
|
||||
ruler.UpdateButtonStates();
|
||||
|
||||
auto &scrubber = Scrubber::Get( project );
|
||||
if (scrubber.HasMark())
|
||||
|
@ -731,7 +731,7 @@ int ControlToolBar::PlayPlayRegion(const SelectedRegion &selectedRegion,
|
||||
|
||||
// Let other UI update appearance
|
||||
if (p)
|
||||
p->GetRulerPanel()->DrawBothOverlays();
|
||||
AdornedRulerPanel::Get( *p ).DrawBothOverlays();
|
||||
|
||||
return token;
|
||||
}
|
||||
|
@ -34,7 +34,6 @@
|
||||
#include "../AudioIO.h"
|
||||
#include "../ImageManipulation.h"
|
||||
#include "../Prefs.h"
|
||||
#include "../Project.h"
|
||||
#include "../UndoManager.h"
|
||||
#include "../widgets/AButton.h"
|
||||
#include "../tracks/ui/Scrubbing.h"
|
||||
@ -171,7 +170,7 @@ void ScrubbingToolBar::RegenerateTooltips()
|
||||
fn(*seekButton, label, wxT("Seek"));
|
||||
|
||||
label = (
|
||||
project->GetRulerPanel()->ShowingScrubRuler()
|
||||
AdornedRulerPanel::Get( *project ).ShowingScrubRuler()
|
||||
? _("Hide Scrub Ruler")
|
||||
: _("Show Scrub Ruler")
|
||||
);
|
||||
@ -244,7 +243,7 @@ void ScrubbingToolBar::EnableDisableButtons()
|
||||
|
||||
const auto barButton = mButtons[STBRulerID];
|
||||
barButton->Enable();
|
||||
if (p->GetRulerPanel()->ShowingScrubRuler())
|
||||
if (AdornedRulerPanel::Get( *p ).ShowingScrubRuler())
|
||||
barButton->PushDown();
|
||||
else
|
||||
barButton->PopUp();
|
||||
|
@ -77,11 +77,9 @@ std::pair<wxRect, bool> EditCursorOverlay::DoGetRectangle(wxSize size)
|
||||
void EditCursorOverlay::Draw(OverlayPanel &panel, wxDC &dc)
|
||||
{
|
||||
if (mIsMaster && !mPartner) {
|
||||
auto ruler = mProject->GetRulerPanel();
|
||||
if (ruler) {
|
||||
mPartner = std::make_shared<EditCursorOverlay>(mProject, false);
|
||||
ruler->AddOverlay( mPartner );
|
||||
}
|
||||
auto &ruler = AdornedRulerPanel::Get( *mProject );
|
||||
mPartner = std::make_shared<EditCursorOverlay>(mProject, false);
|
||||
ruler.AddOverlay( mPartner );
|
||||
}
|
||||
|
||||
mLastCursorX = mNewCursorX;
|
||||
|
@ -74,9 +74,9 @@ void PlayIndicatorOverlayBase::Draw(OverlayPanel &panel, wxDC &dc)
|
||||
&& mLastIsCapturing != mNewIsCapturing) {
|
||||
// Detect transition to recording during punch and roll; make ruler
|
||||
// change its button color too
|
||||
const auto ruler = mProject->GetRulerPanel();
|
||||
ruler->UpdateButtonStates();
|
||||
ruler->Refresh();
|
||||
auto &ruler = AdornedRulerPanel::Get( *mProject );
|
||||
ruler.UpdateButtonStates();
|
||||
ruler.Refresh();
|
||||
}
|
||||
mLastIsCapturing = mNewIsCapturing;
|
||||
|
||||
@ -138,11 +138,9 @@ void PlayIndicatorOverlay::OnTimer(wxCommandEvent &event)
|
||||
|
||||
// Ensure that there is an overlay attached to the ruler
|
||||
if (!mPartner) {
|
||||
auto ruler = mProject->GetRulerPanel();
|
||||
if (ruler) {
|
||||
mPartner = std::make_shared<PlayIndicatorOverlayBase>(mProject, false);
|
||||
ruler->AddOverlay( mPartner );
|
||||
}
|
||||
auto &ruler = AdornedRulerPanel::Get( *mProject );
|
||||
mPartner = std::make_shared<PlayIndicatorOverlayBase>(mProject, false);
|
||||
ruler.AddOverlay( mPartner );
|
||||
}
|
||||
|
||||
auto &trackPanel = TrackPanel::Get( *mProject );
|
||||
|
@ -708,13 +708,13 @@ void Scrubber::StopScrubbing()
|
||||
ctb->SetPlay(false, ControlToolBar::PlayAppearance::Straight);
|
||||
}
|
||||
|
||||
mProject->GetRulerPanel()->DrawBothOverlays();
|
||||
AdornedRulerPanel::Get( *mProject ).DrawBothOverlays();
|
||||
CheckMenuItems();
|
||||
}
|
||||
|
||||
bool Scrubber::ShowsBar() const
|
||||
{
|
||||
return mProject->GetRulerPanel()->ShowingScrubRuler();
|
||||
return AdornedRulerPanel::Get( *mProject ).ShowingScrubRuler();
|
||||
}
|
||||
|
||||
bool Scrubber::IsScrubbing() const
|
||||
@ -749,9 +749,8 @@ bool Scrubber::MayDragToSeek() const
|
||||
const auto &state = ::wxGetMouseState();
|
||||
const auto &position = state.GetPosition();
|
||||
|
||||
auto ruler = mProject->GetRulerPanel();
|
||||
if (ruler &&
|
||||
ruler->GetScreenRect().Contains(position))
|
||||
auto &ruler = AdornedRulerPanel::Get( *mProject );
|
||||
if (ruler.GetScreenRect().Contains(position))
|
||||
return true;
|
||||
|
||||
/*
|
||||
@ -953,7 +952,7 @@ void ScrubbingOverlay::OnTimer(wxCommandEvent &event)
|
||||
|
||||
Scrubber &scrubber = GetScrubber();
|
||||
const auto isScrubbing = scrubber.IsScrubbing();
|
||||
const auto ruler = mProject->GetRulerPanel();
|
||||
auto &ruler = AdornedRulerPanel::Get( *mProject );
|
||||
auto position = ::wxGetMousePosition();
|
||||
|
||||
if (scrubber.IsSpeedPlaying())
|
||||
@ -961,8 +960,8 @@ void ScrubbingOverlay::OnTimer(wxCommandEvent &event)
|
||||
|
||||
{
|
||||
if(scrubber.HasMark()) {
|
||||
auto xx = ruler->ScreenToClient(position).x;
|
||||
ruler->UpdateQuickPlayPos( xx, false );
|
||||
auto xx = ruler.ScreenToClient(position).x;
|
||||
ruler.UpdateQuickPlayPos( xx, false );
|
||||
|
||||
if (!isScrubbing)
|
||||
// Really start scrub if motion is far enough
|
||||
@ -974,7 +973,7 @@ void ScrubbingOverlay::OnTimer(wxCommandEvent &event)
|
||||
return;
|
||||
}
|
||||
else
|
||||
ruler->DrawBothOverlays();
|
||||
ruler.DrawBothOverlays();
|
||||
}
|
||||
|
||||
if (!scrubber.ShouldDrawScrubSpeed()) {
|
||||
@ -1078,10 +1077,9 @@ void Scrubber::OnScrubOrSeek(bool seek)
|
||||
mSeeking = seek;
|
||||
CheckMenuItems();
|
||||
|
||||
auto ruler = mProject->GetRulerPanel();
|
||||
if (ruler)
|
||||
// Update button images
|
||||
ruler->UpdateButtonStates();
|
||||
auto &ruler = AdornedRulerPanel::Get( *mProject );
|
||||
// Update button images
|
||||
ruler.UpdateButtonStates();
|
||||
|
||||
auto scrubbingToolBar = mProject->GetScrubbingToolBar();
|
||||
scrubbingToolBar->EnableDisableButtons();
|
||||
@ -1102,7 +1100,8 @@ void Scrubber::OnSeek(const CommandContext&)
|
||||
|
||||
void Scrubber::OnToggleScrubRuler(const CommandContext&)
|
||||
{
|
||||
mProject->GetRulerPanel()->OnToggleScrubRuler();
|
||||
auto &ruler = AdornedRulerPanel::Get( *mProject );
|
||||
ruler.OnToggleScrubRuler();
|
||||
const auto toolbar =
|
||||
ToolManager::Get( *mProject ).GetToolBar( ScrubbingBarID );
|
||||
toolbar->EnableDisableButtons();
|
||||
|
Loading…
x
Reference in New Issue
Block a user