1
0
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:
Paul Licameli 2019-01-24 10:27:20 -05:00
parent d1ad8f55e0
commit 7bb71257ed
14 changed files with 93 additions and 77 deletions

View File

@ -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 );

View File

@ -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,

View File

@ -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)) {

View File

@ -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()

View File

@ -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;

View File

@ -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();

View File

@ -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();
}

View File

@ -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

View File

@ -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())

View File

@ -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;
}

View File

@ -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();

View File

@ -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;

View File

@ -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 );

View File

@ -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();