From d0c4677ab1bfbd515c0b50d4957c35b99d671d86 Mon Sep 17 00:00:00 2001 From: Paul Licameli Date: Wed, 26 Jun 2019 10:10:11 -0400 Subject: [PATCH] Move most of ProjectWindow initialization into nonmember function --- src/ProjectManager.cpp | 2 +- src/ProjectWindow.cpp | 79 ++++++++++++++++++++++++------------------ src/ProjectWindow.h | 10 ++++-- 3 files changed, 53 insertions(+), 38 deletions(-) diff --git a/src/ProjectManager.cpp b/src/ProjectManager.cpp index f181851f3..988fdc2b6 100644 --- a/src/ProjectManager.cpp +++ b/src/ProjectManager.cpp @@ -363,7 +363,7 @@ AudacityProject *ProjectManager::New() auto &projectHistory = ProjectHistory::Get( project ); auto &projectManager = Get( project ); auto &window = ProjectWindow::Get( *p ); - window.Init(); + InitProjectWindow( window ); ProjectFileIO::Get( *p ).SetProjectTitle(); diff --git a/src/ProjectWindow.cpp b/src/ProjectWindow.cpp index 7b8d42fb0..5aa6e42a8 100644 --- a/src/ProjectWindow.cpp +++ b/src/ProjectWindow.cpp @@ -641,15 +641,37 @@ ProjectWindow::ProjectWindow(wxWindow * parent, wxWindowID id, mPlaybackScroller = std::make_unique( &project ); + // PRL: Old comments below. No longer observing the ordering that it + // recommends. ProjectWindow::OnActivate puts the focus directly into + // the TrackPanel, which avoids the problems. + // LLL: When Audacity starts or becomes active after returning from + // another application, the first window that can accept focus + // will be given the focus even if we try to SetFocus(). By + // creating the scrollbars after the TrackPanel, we resolve + // several focus problems. + + mHsbar = safenew ScrollBar(pPage, HSBarID, wxSB_HORIZONTAL); + mVsbar = safenew ScrollBar(pPage, VSBarID, wxSB_VERTICAL); +#if wxUSE_ACCESSIBILITY + // so that name can be set on a standard control + mHsbar->SetAccessible(safenew WindowAccessible(mHsbar)); + mVsbar->SetAccessible(safenew WindowAccessible(mVsbar)); +#endif + mHsbar->SetLayoutDirection(wxLayout_LeftToRight); + mHsbar->SetName(_("Horizontal Scrollbar")); + mVsbar->SetName(_("Vertical Scrollbar")); + project.Bind( EVT_UNDO_MODIFIED, &ProjectWindow::OnUndoPushedModified, this ); project.Bind( EVT_UNDO_PUSHED, &ProjectWindow::OnUndoPushedModified, this ); project.Bind( EVT_UNDO_OR_REDO, &ProjectWindow::OnUndoRedo, this ); project.Bind( EVT_UNDO_RESET, &ProjectWindow::OnUndoReset, this ); + + wxTheApp->Bind(EVT_THEME_CHANGE, &ProjectWindow::OnThemeChange, this); } -void ProjectWindow::Init() +void InitProjectWindow( ProjectWindow &window ) { - auto &project = mProject; + auto &project = window.GetProject(); #ifdef EXPERIMENTAL_DA2 SetBackgroundColour(theTheme.Colour( clrMedium )); @@ -661,7 +683,7 @@ void ProjectWindow::Init() // In addition, the help strings of menu items are by default sent to the first // field. Currently there are no such help strings, but it they were introduced, then // there would need to be an event handler to send them to the appropriate field. - auto statusBar = CreateStatusBar(4); + auto statusBar = window.CreateStatusBar(4); #if wxUSE_ACCESSIBILITY // so that name can be set on a standard control statusBar->SetAccessible(safenew WindowAccessible(statusBar)); @@ -695,57 +717,47 @@ void ProjectWindow::Init() // Create the TrackPanel and the scrollbars // + auto topPanel = window.GetTopPanel(); + { auto ubs = std::make_unique(wxVERTICAL); ubs->Add( ToolManager::Get( project ).GetTopDock(), 0, wxEXPAND | wxALIGN_TOP ); ubs->Add(&ruler, 0, wxEXPAND); - mTopPanel->SetSizer(ubs.release()); + topPanel->SetSizer(ubs.release()); } // Ensure that the topdock comes before the ruler in the tab order, // irrespective of the order in which they were created. ToolManager::Get(project).GetTopDock()->MoveBeforeInTabOrder(&ruler); - const auto pPage = GetMainPage(); + const auto pPage = window.GetMainPage(); wxBoxSizer *bs; { auto ubs = std::make_unique(wxVERTICAL); bs = ubs.get(); - bs->Add(mTopPanel, 0, wxEXPAND | wxALIGN_TOP); + bs->Add(topPanel, 0, wxEXPAND | wxALIGN_TOP); bs->Add(pPage, 1, wxEXPAND); bs->Add( ToolManager::Get( project ).GetBotDock(), 0, wxEXPAND ); - SetAutoLayout(true); - SetSizer(ubs.release()); + window.SetAutoLayout(true); + window.SetSizer(ubs.release()); } bs->Layout(); auto &trackPanel = TrackPanel::Get( project ); - // LLL: When Audacity starts or becomes active after returning from - // another application, the first window that can accept focus - // will be given the focus even if we try to SetFocus(). By - // creating the scrollbars after the TrackPanel, we resolve - // several focus problems. - mHsbar = safenew ScrollBar(pPage, HSBarID, wxSB_HORIZONTAL); - mVsbar = safenew ScrollBar(pPage, VSBarID, wxSB_VERTICAL); -#if wxUSE_ACCESSIBILITY - // so that name can be set on a standard control - mHsbar->SetAccessible(safenew WindowAccessible(mHsbar)); - mVsbar->SetAccessible(safenew WindowAccessible(mVsbar)); -#endif - mHsbar->SetLayoutDirection(wxLayout_LeftToRight); - mHsbar->SetName(_("Horizontal Scrollbar")); - mVsbar->SetName(_("Vertical Scrollbar")); // LLL: When Audacity starts or becomes active after returning from // another application, the first window that can accept focus // will be given the focus even if we try to SetFocus(). By // making the TrackPanel that first window, we resolve several // keyboard focus problems. - pPage->MoveBeforeInTabOrder(mTopPanel); + pPage->MoveBeforeInTabOrder(topPanel); bs = (wxBoxSizer *)pPage->GetSizer(); + auto vsBar = &window.GetVerticalScrollBar(); + auto hsBar = &window.GetHorizontalScrollBar(); + { // Top horizontal grouping auto hs = std::make_unique(wxHORIZONTAL); @@ -758,7 +770,7 @@ void ProjectWindow::Init() auto vs = std::make_unique(wxVERTICAL); // Vertical scroll bar - vs->Add(mVsbar, 1, wxEXPAND | wxALIGN_TOP); + vs->Add(vsBar, 1, wxEXPAND | wxALIGN_TOP); hs->Add(vs.release(), 0, wxEXPAND | wxALIGN_TOP); } @@ -771,8 +783,8 @@ void ProjectWindow::Init() // Bottom scrollbar hs->Add(viewInfo.GetLeftOffset() - 1, 0); - hs->Add(mHsbar, 1, wxALIGN_BOTTOM); - hs->Add(mVsbar->GetSize().GetWidth(), 0); + hs->Add(hsBar, 1, wxALIGN_BOTTOM); + hs->Add(vsBar->GetSize().GetWidth(), 0); bs->Add(hs.release(), 0, wxEXPAND | wxALIGN_LEFT); } @@ -784,14 +796,16 @@ void ProjectWindow::Init() AddPages(this, Factory, pNotebook); #endif - mMainPanel->Layout(); + auto mainPanel = window.GetMainPanel(); + + mainPanel->Layout(); wxASSERT( trackPanel.GetProject() == &project ); // MM: Give track panel the focus to ensure keyboard commands work trackPanel.SetFocus(); - FixScrollbars(); + window.FixScrollbars(); ruler.SetLeftOffset(viewInfo.GetLeftOffset()); // bevel on AdornedRuler // @@ -809,18 +823,15 @@ void ProjectWindow::Init() wxIcon ic{}; ic.CopyFromBitmap(theTheme.Bitmap(bmpAudacityLogo48x48)); #endif - SetIcon(ic); + window.SetIcon(ic); } #endif - mIconized = false; - UpdateStatusWidths(); + window.UpdateStatusWidths(); wxString msg = wxString::Format(_("Welcome to Audacity version %s"), AUDACITY_VERSION_STRING); statusBar->SetStatusText(msg, mainStatusBarField); - wxTheApp->Bind(EVT_THEME_CHANGE, &ProjectWindow::OnThemeChange, this); - #ifdef EXPERIMENTAL_DA2 ClearBackground();// For wxGTK. #endif diff --git a/src/ProjectWindow.h b/src/ProjectWindow.h index dbb8866df..1bc3873b7 100644 --- a/src/ProjectWindow.h +++ b/src/ProjectWindow.h @@ -22,6 +22,9 @@ class Track; class wxScrollBar; class wxPanel; +class ProjectWindow; +void InitProjectWindow( ProjectWindow &window ); + ///\brief A top-level window associated with a project, and handling scrollbars /// and zooming class ProjectWindow final : public wxFrame @@ -34,6 +37,7 @@ public: static ProjectWindow *Find( AudacityProject *pProject ); static const ProjectWindow *Find( const AudacityProject *pProject ); AudacityProject &GetProject() { return mProject; } + const AudacityProject &GetProject() const { return mProject; } explicit ProjectWindow( wxWindow * parent, wxWindowID id, @@ -44,8 +48,6 @@ public: // Next available ID for sub-windows int NextWindowID(); - void Init(); - bool IsActive() override; bool IsIconized() const override; @@ -53,6 +55,7 @@ public: void SetIsBeingDeleted() { mIsDeleting = true; } wxWindow *GetMainPage() { return mMainPage; } + wxPanel *GetMainPanel() { return mMainPanel; } wxPanel *GetTopPanel() { return mTopPanel; } void UpdateStatusWidths(); @@ -101,6 +104,7 @@ public: // Scrollbars wxScrollBar &GetVerticalScrollBar() { return *mVsbar; } + wxScrollBar &GetHorizontalScrollBar() { return *mHsbar; } void ScrollIntoView(double pos); void ScrollIntoView(int x); @@ -185,7 +189,7 @@ private: bool mAutoScrolling{ false }; bool mActive{ true }; - bool mIconized; + bool mIconized{ false }; bool mShownOnce{ false };