From 1ac8eeee942d30d1a8462ba9f6fc3541a9a9792b Mon Sep 17 00:00:00 2001 From: abb128 Date: Thu, 15 Jul 2021 21:05:42 +0300 Subject: [PATCH 1/7] Add toolbar edit mode This adds an edit mode checkbox under View > Toolbars > Edit Mode, which hides the toolbar grabbers when off Signed-off-by: abb128 --- src/menus/ToolbarMenus.cpp | 18 ++++++++++++- src/toolbars/ToolBar.cpp | 50 +++++++++++++++++++++++++++++------- src/toolbars/ToolBar.h | 2 ++ src/toolbars/ToolManager.cpp | 4 +-- 4 files changed, 62 insertions(+), 12 deletions(-) diff --git a/src/menus/ToolbarMenus.cpp b/src/menus/ToolbarMenus.cpp index baa42aa63..32fbd8daf 100644 --- a/src/menus/ToolbarMenus.cpp +++ b/src/menus/ToolbarMenus.cpp @@ -21,6 +21,19 @@ void OnResetToolBars(const CommandContext &context) ToolManager::OnResetToolBars(context); } +void OnEditMode(const CommandContext &context) +{ + auto &project = context.project; + auto &commandManager = CommandManager::Get( project ); + + bool checked = !gPrefs->Read(wxT("/GUI/Toolbars/EditMode"), false); + gPrefs->Write(wxT("/GUI/Toolbars/EditMode"), checked); + gPrefs->Flush(); + commandManager.Check(wxT("EditMode"), checked); + + wxTheApp->AddPendingEvent(wxCommandEvent{ EVT_PREFS_UPDATE }); +} + }; // struct Handler @@ -48,8 +61,11 @@ BaseItemSharedPtr ToolbarsMenu() ( FinderScope{ findCommandHandler }, Section( wxT("Toolbars"), Menu( wxT("Toolbars"), XXO("&Toolbars"), - Section( "Reset", + Section( "Manage", /* i18n-hint: (verb)*/ + Command( wxT("EditMode"), XXO("&Edit Mode (on/off)"), + FN(OnEditMode), AlwaysEnabledFlag, + Options{}.CheckTest( wxT("/GUI/Toolbars/EditMode"), false ) ), Command( wxT("ResetToolbars"), XXO("Reset Toolb&ars"), FN(OnResetToolBars), AlwaysEnabledFlag ) ), diff --git a/src/toolbars/ToolBar.cpp b/src/toolbars/ToolBar.cpp index 067ad590f..b151e7db1 100644 --- a/src/toolbars/ToolBar.cpp +++ b/src/toolbars/ToolBar.cpp @@ -346,6 +346,7 @@ ToolBar::ToolBar( AudacityProject &project, mHSizer = NULL; mVisible = false; mPositioned = false; + mEditMode = false; mGrabber = NULL; mResizer = NULL; @@ -538,10 +539,14 @@ void ToolBar::ReCreateButtons() // Create the main sizer auto ms = std::make_unique(wxHORIZONTAL); - // Create the grabber and add it to the main sizer - mGrabber = safenew Grabber(this, mType); - ms->Add(mGrabber, 0, wxEXPAND | wxALIGN_LEFT | wxALIGN_TOP | wxRIGHT, 1); - + // Grabber is created only when editing, or when it's undocked + // (as otherwise the undocked toolbar can't be moved around) + if (mEditMode || !IsDocked()) + { + // Create the grabber and add it to the main sizer + mGrabber = safenew Grabber(this, mType); + ms->Add(mGrabber, 0, wxEXPAND | wxALIGN_LEFT | wxALIGN_TOP | wxRIGHT, 1); + } // Use a box sizer for laying out controls ms->Add((mHSizer = safenew wxBoxSizer(wxHORIZONTAL)), 1, wxEXPAND); @@ -549,7 +554,7 @@ void ToolBar::ReCreateButtons() Populate(); // Add some space for the resize border - if (IsResizable()) + if (mEditMode && IsResizable()) { // Create the resizer and add it to the main sizer mResizer = safenew ToolBarResizer(this); @@ -621,6 +626,21 @@ void ToolBar::UpdatePrefs() } #endif + bool updated = false; + bool editing = gPrefs->Read(wxT("/GUI/Toolbars/EditMode"), false); + + if ( editing != mEditMode ) + { + mEditMode = editing; + updated = true; + } + + if ( updated ) + { + ReCreateButtons(); + Updated(); + } + return; } @@ -632,6 +652,15 @@ ToolDock *ToolBar::GetDock() return dynamic_cast(GetParent()); } +// +// Returns whether or not edit mode is enabled +// +bool ToolBar::GetEditMode() +{ + return mEditMode; +} + + // // Toggle the docked/floating state // @@ -640,13 +669,16 @@ void ToolBar::SetDocked( ToolDock *dock, bool pushed ) // Remember it // mDock = dock; - // Change the tooltip of the grabber + if ( mGrabber ) + { + // Change the tooltip of the grabber #if wxUSE_TOOLTIPS - mGrabber->SetToolTip( GetTitle() ); + mGrabber->SetToolTip( GetTitle() ); #endif - // Set the grabber button state - mGrabber->PushButton( pushed ); + // Set the grabber button state + mGrabber->PushButton( pushed ); + } if (mResizer) { diff --git a/src/toolbars/ToolBar.h b/src/toolbars/ToolBar.h index 619732268..8b859e56c 100644 --- a/src/toolbars/ToolBar.h +++ b/src/toolbars/ToolBar.h @@ -121,6 +121,7 @@ class AUDACITY_DLL_API ToolBar /* not final */ TranslatableString GetLabel(); wxString GetSection(); ToolDock *GetDock(); + bool GetEditMode(); private: void SetLabel(const wxString & label) override; @@ -249,6 +250,7 @@ public: bool mVisible; bool mResizable; bool mPositioned; // true if position floating determined. + bool mEditMode; public: diff --git a/src/toolbars/ToolManager.cpp b/src/toolbars/ToolManager.cpp index a4516a10a..27431bf4c 100644 --- a/src/toolbars/ToolManager.cpp +++ b/src/toolbars/ToolManager.cpp @@ -1177,7 +1177,7 @@ void ToolManager::OnMouse( wxMouseEvent & event ) DoneDragging(); return; } - else if( mDragDock && !event.ShiftDown() ) + else if( mDragDock && !event.ShiftDown() && mDragBar->GetEditMode() ) { // Trip over...everyone ashore that's going ashore... mDragDock->Dock( mDragBar, true, mDragBefore ); @@ -1249,7 +1249,7 @@ void ToolManager::OnMouse( wxMouseEvent & event ) dock = mBotDock; // Looks like we have a winner... - if( dock ) + if( dock && mDragBar->GetEditMode() ) { wxPoint p; wxRect r; From 534da8b61772c8e5ed297395fe0740b0cc48a8f9 Mon Sep 17 00:00:00 2001 From: abb128 Date: Thu, 15 Jul 2021 21:05:57 +0300 Subject: [PATCH 2/7] Fix failed assertion bug Toggling edit mode while recording audio would cause a failed assertion error. Disabling the toggle while Audio IO is busy fixes this. Signed-off-by: abb128 --- src/menus/ToolbarMenus.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/menus/ToolbarMenus.cpp b/src/menus/ToolbarMenus.cpp index 32fbd8daf..88614f356 100644 --- a/src/menus/ToolbarMenus.cpp +++ b/src/menus/ToolbarMenus.cpp @@ -5,6 +5,7 @@ #include "../commands/CommandContext.h" #include "../commands/CommandManager.h" #include "../toolbars/ToolManager.h" +#include "../CommonCommandFlags.h" /// Namespace for functions for View Toolbar menu namespace ToolbarActions { @@ -64,7 +65,7 @@ BaseItemSharedPtr ToolbarsMenu() Section( "Manage", /* i18n-hint: (verb)*/ Command( wxT("EditMode"), XXO("&Edit Mode (on/off)"), - FN(OnEditMode), AlwaysEnabledFlag, + FN(OnEditMode), AudioIONotBusyFlag(), Options{}.CheckTest( wxT("/GUI/Toolbars/EditMode"), false ) ), Command( wxT("ResetToolbars"), XXO("Reset Toolb&ars"), FN(OnResetToolBars), AlwaysEnabledFlag ) From 21614a390cd3ef5ea1e1babe3ade510b13d82aea Mon Sep 17 00:00:00 2001 From: abb128 Date: Thu, 15 Jul 2021 21:06:04 +0300 Subject: [PATCH 3/7] Make AdornedRulerPanel respect toolbar edit mode AdornedRulerPanel also has a grabber, this commit makes it so that the grabber does not exist when edit mode is off. Signed-off-by: abb128 --- src/AdornedRulerPanel.cpp | 31 ++++++++++++++++++++++++------- src/AdornedRulerPanel.h | 4 ++++ 2 files changed, 28 insertions(+), 7 deletions(-) diff --git a/src/AdornedRulerPanel.cpp b/src/AdornedRulerPanel.cpp index ea8a8ed2e..87355267f 100644 --- a/src/AdornedRulerPanel.cpp +++ b/src/AdornedRulerPanel.cpp @@ -926,6 +926,9 @@ AdornedRulerPanel::AdornedRulerPanel(AudacityProject* project, mTracks = &TrackList::Get( *project ); mIsSnapped = false; + mEditMode = gPrefs->Read(wxT("/GUI/Toolbars/EditMode"), false); + + mGrabber = nullptr; mIsRecording = false; @@ -969,7 +972,13 @@ void AdornedRulerPanel::Refresh( bool eraseBackground, const wxRect *rect ) void AdornedRulerPanel::UpdatePrefs() { - if (mNeedButtonUpdate) { + bool mode = gPrefs->Read(wxT("/GUI/Toolbars/EditMode"), false); + + if ( mode != mEditMode ) + { + mEditMode = mode; + ReCreateButtons(); + }else if (mNeedButtonUpdate) { // Visit this block once only in the lifetime of this panel mNeedButtonUpdate = false; // Do this first time setting of button status texts @@ -1009,6 +1018,12 @@ void AdornedRulerPanel::ReCreateButtons() button = nullptr; } + if ( mGrabber ) + { + mGrabber->Destroy(); + mGrabber = nullptr; + } + size_t iButton = 0; // Make the short row of time ruler pushbottons. // Don't bother with sizers. Their sizes and positions are fixed. @@ -1017,12 +1032,14 @@ void AdornedRulerPanel::ReCreateButtons() wxPoint position( 1, 0 ); - Grabber * pGrabber = safenew Grabber(this, this->GetId()); - pGrabber->SetAsSpacer( true ); - //pGrabber->SetSize( 10, 27 ); // default is 10,27 - pGrabber->SetPosition( position ); - - position.x = 12; + if ( mEditMode ) + { + mGrabber = safenew Grabber(this, this->GetId()); + mGrabber->SetAsSpacer( true ); + //mGrabber->SetSize( 10, 27 ); // default is 10,27 + mGrabber->SetPosition( position ); + position.x = 12; + }else position.x = 0; auto size = theTheme.ImageSize( bmpRecoloredUpSmall ); size.y = std::min(size.y, GetRulerHeight(false)); diff --git a/src/AdornedRulerPanel.h b/src/AdornedRulerPanel.h index cecdb3357..f7ae89337 100644 --- a/src/AdornedRulerPanel.h +++ b/src/AdornedRulerPanel.h @@ -13,6 +13,7 @@ #include "CellularPanel.h" #include "widgets/Ruler.h" // member variable +#include "widgets/Grabber.h" // mGrabber #include "Prefs.h" #include "ViewInfo.h" // for PlayRegion @@ -142,6 +143,9 @@ private: double mQuickPlayPos; bool mIsSnapped; + bool mEditMode; + + Grabber *mGrabber; PlayRegion mOldPlayRegion; From 4e5330d05b04875c29ec39b93ebd65328cf2248b Mon Sep 17 00:00:00 2001 From: abb128 Date: Thu, 15 Jul 2021 21:06:07 +0300 Subject: [PATCH 4/7] Make ToolBar read edit mode pref during initialization Fixes an issue where the size of some toolbars is messed up when the program starts Signed-off-by: abb128 --- src/toolbars/ToolBar.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/toolbars/ToolBar.cpp b/src/toolbars/ToolBar.cpp index b151e7db1..98e2a33ef 100644 --- a/src/toolbars/ToolBar.cpp +++ b/src/toolbars/ToolBar.cpp @@ -346,7 +346,7 @@ ToolBar::ToolBar( AudacityProject &project, mHSizer = NULL; mVisible = false; mPositioned = false; - mEditMode = false; + mEditMode = gPrefs->Read(wxT("/GUI/Toolbars/EditMode"), false); mGrabber = NULL; mResizer = NULL; From 02000a97d5b26247956552de4379c444e6e0ae23 Mon Sep 17 00:00:00 2001 From: abb128 Date: Thu, 15 Jul 2021 21:06:09 +0300 Subject: [PATCH 5/7] Enable edit mode by default Signed-off-by: abb128 --- src/AdornedRulerPanel.cpp | 4 ++-- src/menus/ToolbarMenus.cpp | 4 ++-- src/toolbars/ToolBar.cpp | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/AdornedRulerPanel.cpp b/src/AdornedRulerPanel.cpp index 87355267f..acef793b6 100644 --- a/src/AdornedRulerPanel.cpp +++ b/src/AdornedRulerPanel.cpp @@ -926,7 +926,7 @@ AdornedRulerPanel::AdornedRulerPanel(AudacityProject* project, mTracks = &TrackList::Get( *project ); mIsSnapped = false; - mEditMode = gPrefs->Read(wxT("/GUI/Toolbars/EditMode"), false); + mEditMode = gPrefs->Read(wxT("/GUI/Toolbars/EditMode"), true); mGrabber = nullptr; @@ -972,7 +972,7 @@ void AdornedRulerPanel::Refresh( bool eraseBackground, const wxRect *rect ) void AdornedRulerPanel::UpdatePrefs() { - bool mode = gPrefs->Read(wxT("/GUI/Toolbars/EditMode"), false); + bool mode = gPrefs->Read(wxT("/GUI/Toolbars/EditMode"), true); if ( mode != mEditMode ) { diff --git a/src/menus/ToolbarMenus.cpp b/src/menus/ToolbarMenus.cpp index 88614f356..8554b99f6 100644 --- a/src/menus/ToolbarMenus.cpp +++ b/src/menus/ToolbarMenus.cpp @@ -27,7 +27,7 @@ void OnEditMode(const CommandContext &context) auto &project = context.project; auto &commandManager = CommandManager::Get( project ); - bool checked = !gPrefs->Read(wxT("/GUI/Toolbars/EditMode"), false); + bool checked = !gPrefs->Read(wxT("/GUI/Toolbars/EditMode"), true); gPrefs->Write(wxT("/GUI/Toolbars/EditMode"), checked); gPrefs->Flush(); commandManager.Check(wxT("EditMode"), checked); @@ -66,7 +66,7 @@ BaseItemSharedPtr ToolbarsMenu() /* i18n-hint: (verb)*/ Command( wxT("EditMode"), XXO("&Edit Mode (on/off)"), FN(OnEditMode), AudioIONotBusyFlag(), - Options{}.CheckTest( wxT("/GUI/Toolbars/EditMode"), false ) ), + Options{}.CheckTest( wxT("/GUI/Toolbars/EditMode"), true ) ), Command( wxT("ResetToolbars"), XXO("Reset Toolb&ars"), FN(OnResetToolBars), AlwaysEnabledFlag ) ), diff --git a/src/toolbars/ToolBar.cpp b/src/toolbars/ToolBar.cpp index 98e2a33ef..66c5bc854 100644 --- a/src/toolbars/ToolBar.cpp +++ b/src/toolbars/ToolBar.cpp @@ -346,7 +346,7 @@ ToolBar::ToolBar( AudacityProject &project, mHSizer = NULL; mVisible = false; mPositioned = false; - mEditMode = gPrefs->Read(wxT("/GUI/Toolbars/EditMode"), false); + mEditMode = gPrefs->Read(wxT("/GUI/Toolbars/EditMode"), true); mGrabber = NULL; mResizer = NULL; @@ -627,7 +627,7 @@ void ToolBar::UpdatePrefs() #endif bool updated = false; - bool editing = gPrefs->Read(wxT("/GUI/Toolbars/EditMode"), false); + bool editing = gPrefs->Read(wxT("/GUI/Toolbars/EditMode"), true); if ( editing != mEditMode ) { From 298ccd94d3b3f640a3fdfa18a543a386870780f0 Mon Sep 17 00:00:00 2001 From: abb128 Date: Thu, 15 Jul 2021 21:06:12 +0300 Subject: [PATCH 6/7] Fix whitespace inconsistencies Signed-off-by: abb128 --- src/AdornedRulerPanel.cpp | 4 ++-- src/menus/ToolbarMenus.cpp | 6 +++--- src/toolbars/ToolBar.cpp | 12 ++++++------ 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/AdornedRulerPanel.cpp b/src/AdornedRulerPanel.cpp index acef793b6..bfa90cff7 100644 --- a/src/AdornedRulerPanel.cpp +++ b/src/AdornedRulerPanel.cpp @@ -976,8 +976,8 @@ void AdornedRulerPanel::UpdatePrefs() if ( mode != mEditMode ) { - mEditMode = mode; - ReCreateButtons(); + mEditMode = mode; + ReCreateButtons(); }else if (mNeedButtonUpdate) { // Visit this block once only in the lifetime of this panel mNeedButtonUpdate = false; diff --git a/src/menus/ToolbarMenus.cpp b/src/menus/ToolbarMenus.cpp index 8554b99f6..010e7b574 100644 --- a/src/menus/ToolbarMenus.cpp +++ b/src/menus/ToolbarMenus.cpp @@ -64,9 +64,9 @@ BaseItemSharedPtr ToolbarsMenu() Menu( wxT("Toolbars"), XXO("&Toolbars"), Section( "Manage", /* i18n-hint: (verb)*/ - Command( wxT("EditMode"), XXO("&Edit Mode (on/off)"), - FN(OnEditMode), AudioIONotBusyFlag(), - Options{}.CheckTest( wxT("/GUI/Toolbars/EditMode"), true ) ), + Command( wxT("EditMode"), XXO("&Edit Mode (on/off)"), + FN(OnEditMode), AudioIONotBusyFlag(), + Options{}.CheckTest( wxT("/GUI/Toolbars/EditMode"), true ) ), Command( wxT("ResetToolbars"), XXO("Reset Toolb&ars"), FN(OnResetToolBars), AlwaysEnabledFlag ) ), diff --git a/src/toolbars/ToolBar.cpp b/src/toolbars/ToolBar.cpp index 66c5bc854..aae9b43ce 100644 --- a/src/toolbars/ToolBar.cpp +++ b/src/toolbars/ToolBar.cpp @@ -542,11 +542,11 @@ void ToolBar::ReCreateButtons() // Grabber is created only when editing, or when it's undocked // (as otherwise the undocked toolbar can't be moved around) if (mEditMode || !IsDocked()) - { + { // Create the grabber and add it to the main sizer mGrabber = safenew Grabber(this, mType); ms->Add(mGrabber, 0, wxEXPAND | wxALIGN_LEFT | wxALIGN_TOP | wxRIGHT, 1); - } + } // Use a box sizer for laying out controls ms->Add((mHSizer = safenew wxBoxSizer(wxHORIZONTAL)), 1, wxEXPAND); @@ -631,14 +631,14 @@ void ToolBar::UpdatePrefs() if ( editing != mEditMode ) { - mEditMode = editing; - updated = true; + mEditMode = editing; + updated = true; } if ( updated ) { - ReCreateButtons(); - Updated(); + ReCreateButtons(); + Updated(); } return; From fcd9c40495ddf9ea35905cf8fbba7f20e33ce4f2 Mon Sep 17 00:00:00 2001 From: abb128 Date: Thu, 15 Jul 2021 21:06:17 +0300 Subject: [PATCH 7/7] Fix menu accelerator in Edit Mode menu item The &E shortcut conflicts with Edit Toolbar. M is unique Signed-off-by: abb128 --- src/menus/ToolbarMenus.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/menus/ToolbarMenus.cpp b/src/menus/ToolbarMenus.cpp index 010e7b574..1260e160b 100644 --- a/src/menus/ToolbarMenus.cpp +++ b/src/menus/ToolbarMenus.cpp @@ -64,7 +64,7 @@ BaseItemSharedPtr ToolbarsMenu() Menu( wxT("Toolbars"), XXO("&Toolbars"), Section( "Manage", /* i18n-hint: (verb)*/ - Command( wxT("EditMode"), XXO("&Edit Mode (on/off)"), + Command( wxT("EditMode"), XXO("Edit &Mode (on/off)"), FN(OnEditMode), AudioIONotBusyFlag(), Options{}.CheckTest( wxT("/GUI/Toolbars/EditMode"), true ) ), Command( wxT("ResetToolbars"), XXO("Reset Toolb&ars"),