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;