diff --git a/src/AdornedRulerPanel.cpp b/src/AdornedRulerPanel.cpp index 07a088ad9..8f23eeb88 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"), true); + + 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"), true); + + 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 9a2349147..5c38b1223 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; diff --git a/src/menus/ToolbarMenus.cpp b/src/menus/ToolbarMenus.cpp index baa42aa63..1260e160b 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 { @@ -21,6 +22,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"), true); + gPrefs->Write(wxT("/GUI/Toolbars/EditMode"), checked); + gPrefs->Flush(); + commandManager.Check(wxT("EditMode"), checked); + + wxTheApp->AddPendingEvent(wxCommandEvent{ EVT_PREFS_UPDATE }); +} + }; // struct Handler @@ -48,8 +62,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), 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 067ad590f..aae9b43ce 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 = gPrefs->Read(wxT("/GUI/Toolbars/EditMode"), true); 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"), true); + + 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;