Audacity 3.2.0
Classes | Public Member Functions | Static Public Member Functions | Private Types | Private Member Functions | Private Attributes | List of all members
ToolManager Class Referencefinal

class ToolManager More...

#include <ToolManager.h>

Inheritance diagram for ToolManager:
[legend]
Collaboration diagram for ToolManager:
[legend]

Classes

struct  TopPanelHook
 

Public Member Functions

 ToolManager (AudacityProject *parent)
 
 ToolManager (const ToolManager &)=delete
 
ToolManager & operator= (const ToolManager &)=delete
 
 ~ToolManager ()
 
void CreateWindows ()
 
void LayoutToolBars ()
 
bool IsDocked (Identifier type) const
 
bool IsVisible (Identifier type) const
 
void ShowHide (Identifier type)
 
void Expose (Identifier type, bool show)
 
ToolBar * GetToolBar (const Identifier &type) const
 
ToolDock * GetTopDock ()
 
const ToolDock * GetTopDock () const
 
ToolDock * GetBotDock ()
 
const ToolDock * GetBotDock () const
 
void Reset ()
 
void Destroy ()
 
void RegenerateTooltips ()
 
int FilterEvent (wxEvent &event) override
 
bool RestoreFocus ()
 
template<typename F >
void ForEach (F &&fun)
 Visit bars, lexicographically by their textual ids. More...
 
size_t CountBars () const
 
- Public Member Functions inherited from ClientData::Base
virtual ~Base ()
 

Static Public Member Functions

static ToolManager & Get (AudacityProject &project)
 
static const ToolManager & Get (const AudacityProject &project)
 
static void OnResetToolBars (const CommandContext &context)
 
static void ModifyToolbarMenus (AudacityProject &project)
 
static void ModifyAllProjectToolbarMenus ()
 

Private Types

using FramePtr = Destroy_ptr< wxFrame >
 

Private Member Functions

ToolBar * Float (ToolBar *t, wxPoint &pos)
 
void OnMenuUpdate (struct MenuUpdateMessage)
 
void OnTimer (wxTimerEvent &event)
 
void OnMouse (wxMouseEvent &event)
 
void OnCaptureLost (wxMouseCaptureLostEvent &event)
 
void UndockBar (wxPoint mp)
 
void OnGrabber (GrabberEvent &event)
 
void HandleEscapeKey ()
 
void DoneDragging ()
 
void OnIndicatorCreate (wxWindowCreateEvent &event)
 
void OnIndicatorPaint (wxPaintEvent &event)
 
void ReadConfig ()
 
void WriteConfig ()
 
void Updated ()
 

Private Attributes

Observer::Subscription mMenuManagerSubscription
 
AudacityProject * mParent
 
wxWindowRef mLastFocus {}
 
ToolFrame * mDragWindow
 
ToolDock * mDragDock
 
ToolBar * mDragBar {}
 
wxPoint mDragOffset
 
ToolBarConfiguration::Position mDragBefore {}
 
wxPoint mLastPos
 
wxRect mBarPos
 
FramePtr mIndicator
 
std::unique_ptr< wxRegion > mLeft
 
std::unique_ptr< wxRegion > mDown
 
wxRegion * mCurrent
 
wxTimer mTimer
 
bool mLastState
 
bool mTransition
 
ToolDock * mTopDock {}
 
ToolDock * mBotDock {}
 
std::map< Identifier, ToolBar::Holder > mBars
 map not unordered_map, for the promise made by ForEach More...
 
wxPoint mPrevPosition {}
 
ToolDock * mPrevDock {}
 
ToolBarConfiguration::Position mPrevSlot { ToolBarConfiguration::UnspecifiedPosition }
 
ToolBarConfiguration mPrevConfiguration
 
bool mDidDrag {}
 
bool mClicked {}
 

Detailed Description

class ToolManager

Manages the ToolDocks and handles the dragging, floating, and docking of ToolBars.

Definition at line 51 of file ToolManager.h.

Member Typedef Documentation

◆ FramePtr

using ToolManager::FramePtr = Destroy_ptr<wxFrame>
private

Definition at line 151 of file ToolManager.h.

Constructor & Destructor Documentation

◆ ToolManager() [1/2]

ToolManager::ToolManager ( AudacityProject *  parent)

Definition at line 352 of file ToolManager.cpp.

353: wxEvtHandler()
354{
355 wxPoint pt[ 3 ];
356
357#if defined(__WXMAC__)
358 // Save original transition
359 mTransition = wxSystemOptions::GetOptionInt( wxMAC_WINDOW_PLAIN_TRANSITION );
360#endif
361
362 // Initialize everything
363 mParent = parent;
364 mLastPos.x = mBarPos.x = -1;
365 mLastPos.y = mBarPos.y = -1;
366 mDragWindow = NULL;
367 mDragDock = NULL;
368 mDragBar = NULL;
369
370 // Create the down arrow
371 pt[ 0 ].x = 0;
372 pt[ 0 ].y = 0;
373 pt[ 1 ].x = 9;
374 pt[ 1 ].y = 9;
375 pt[ 2 ].x = 18;
376 pt[ 2 ].y = 0;
377
378 // Create the shaped region
379 mDown = std::make_unique<wxRegion>( 3, &pt[0] );
380
381 // Create the down arrow
382 pt[ 0 ].x = 9;
383 pt[ 0 ].y = 0;
384 pt[ 1 ].x = 0;
385 pt[ 1 ].y = 9;
386 pt[ 2 ].x = 9;
387 pt[ 2 ].y = 18;
388
389 // Create the shaped region
390 mLeft = std::make_unique<wxRegion>( 3, &pt[0] );
391
392 // Create the indicator frame
393 // parent is null but FramePtr ensures destruction
394 mIndicator = FramePtr{ safenew wxFrame( NULL,
395 wxID_ANY,
396 wxEmptyString,
397 wxDefaultPosition,
398 wxSize( 32, 32 ),
399 wxFRAME_TOOL_WINDOW |
400 wxFRAME_SHAPED |
401 wxNO_BORDER |
402 wxFRAME_NO_TASKBAR |
403 wxSTAY_ON_TOP )
404 };
405
406 // Hook the creation event...only needed on GTK, but doesn't hurt for all
407 mIndicator->Bind( wxEVT_CREATE,
409 this );
410
411 // Hook the paint event...needed for all
412 mIndicator->Bind( wxEVT_PAINT,
414 this );
415
416 // It's a little shy
417 mIndicator->Hide();
418}
#define safenew
Definition: MemoryX.h:10
void OnIndicatorCreate(wxWindowCreateEvent &event)
ToolBar * mDragBar
Definition: ToolManager.h:144
bool mTransition
Definition: ToolManager.h:160
ToolFrame * mDragWindow
Definition: ToolManager.h:142
std::unique_ptr< wxRegion > mLeft
Definition: ToolManager.h:153
AudacityProject * mParent
Definition: ToolManager.h:139
void OnIndicatorPaint(wxPaintEvent &event)
std::unique_ptr< wxRegion > mDown
Definition: ToolManager.h:153
ToolDock * mDragDock
Definition: ToolManager.h:143
Destroy_ptr< wxFrame > FramePtr
Definition: ToolManager.h:151
wxRect mBarPos
Definition: ToolManager.h:149
FramePtr mIndicator
Definition: ToolManager.h:152
wxPoint mLastPos
Definition: ToolManager.h:148

References mBarPos, mDown, mDragBar, mDragDock, mDragWindow, mIndicator, mLastPos, mLeft, mParent, mTransition, OnIndicatorCreate(), OnIndicatorPaint(), and safenew.

Here is the call graph for this function:

◆ ToolManager() [2/2]

ToolManager::ToolManager ( const ToolManager &  )
delete

◆ ~ToolManager()

ToolManager::~ToolManager ( )

Definition at line 509 of file ToolManager.cpp.

510{
511 Destroy();
512}
void Destroy()

References Destroy().

Here is the call graph for this function:

Member Function Documentation

◆ CountBars()

size_t ToolManager::CountBars ( ) const
inline

Definition at line 109 of file ToolManager.h.

110 {
111 return mBars.size();
112 }
std::map< Identifier, ToolBar::Holder > mBars
map not unordered_map, for the promise made by ForEach
Definition: ToolManager.h:167

◆ CreateWindows()

void ToolManager::CreateWindows ( )

Assign (non-persistent!) sequential ids to the toolbars

Definition at line 420 of file ToolManager.cpp.

421{
422 auto parent = mParent;
423 auto &window = GetProjectFrame( *parent );
424
425 // Hook the parents mouse events...using the parent helps greatly
426 // under GTK
427 window.Bind( wxEVT_LEFT_UP,
429 this );
430 window.Bind( wxEVT_MOTION,
432 this );
433 window.Bind( wxEVT_MOUSE_CAPTURE_LOST,
435 this );
436
437 wxWindow *topDockParent = TopPanelHook::Call( window );
438 wxASSERT(topDockParent);
439
440 // Create the top and bottom docks
441 mTopDock = safenew ToolDock( this, topDockParent, TopDockID );
442 mBotDock = safenew ToolDock( this, &window, BotDockID );
443
444 // Create all of the toolbars
445 // All have the project as parent window
446 wxASSERT(parent);
447
448 for (const auto &factory : RegisteredToolbarFactory::GetFactories()) {
449 if (factory) {
450 auto bar = factory( *parent );
451 if (bar) {
452 auto &slot = mBars[bar->GetSection()];
453 if (slot) {
454 // Oh no, name collision of registered toolbars
455 assert(false);
456 bar->Destroy();
457 continue;
458 }
459 slot = std::move(bar);
460 }
461 }
462 else
463 wxASSERT( false );
464 }
465
467 ForEach([ii = 0](ToolBar *bar) mutable { bar->SetIndex(ii++); });
468
469 // We own the timer
470 mTimer.SetOwner( this );
471
472 // Process the toolbar config settings
473 ReadConfig();
474
475 wxEvtHandler::AddFilter(this);
476
479}
static RegisteredToolbarFactory factory
AUDACITY_DLL_API wxFrame & GetProjectFrame(AudacityProject &project)
Get the top-level window associated with the project (as a wxFrame only, when you do not need to use ...
@ BotDockID
Definition: ToolDock.h:44
@ TopDockID
Definition: ToolDock.h:43
static CommandManager & Get(AudacityProject &project)
static result_type Call(Arguments &&...arguments)
Null check of the installed function is done for you.
Subscription Subscribe(Callback callback)
Connect a callback to the Publisher; later-connected are called earlier.
Definition: Observer.h:199
Works with ToolManager and ToolDock to provide a dockable window in which buttons can be placed.
Definition: ToolBar.h:73
void SetIndex(int index)
Set a value used for computing cascading positions of undocked bars.
Definition: ToolBar.h:113
A dynamic panel where a ToolBar can be docked.
Definition: ToolDock.h:292
void OnMenuUpdate(struct MenuUpdateMessage)
void ReadConfig()
void OnCaptureLost(wxMouseCaptureLostEvent &event)
ToolDock * mTopDock
Definition: ToolManager.h:163
wxTimer mTimer
Definition: ToolManager.h:156
Observer::Subscription mMenuManagerSubscription
Definition: ToolManager.h:138
void ForEach(F &&fun)
Visit bars, lexicographically by their textual ids.
Definition: ToolManager.h:102
void OnMouse(wxMouseEvent &event)
ToolDock * mBotDock
Definition: ToolManager.h:164
static const Functions & GetFactories()
Definition: ToolBar.cpp:1011

References BotDockID, GlobalHook< TopPanelHook, wxWindow *(wxWindow &) >::Call(), factory, ForEach(), CommandManager::Get(), RegisteredToolbarFactory::GetFactories(), GetProjectFrame(), mBars, mBotDock, mMenuManagerSubscription, mParent, mTimer, mTopDock, OnCaptureLost(), OnMenuUpdate(), OnMouse(), ReadConfig(), safenew, ToolBar::SetIndex(), Observer::Publisher< Message, NotifyAll >::Subscribe(), and TopDockID.

Referenced by InitProjectWindow().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ Destroy()

void ToolManager::Destroy ( )

Definition at line 485 of file ToolManager.cpp.

486{
487 if ( mTopDock || mBotDock ) { // destroy at most once
488 wxEvtHandler::RemoveFilter(this);
489
490 // Save the toolbar states
491 WriteConfig();
492
493 // This function causes the toolbars to be destroyed, so
494 // clear the configuration of the ToolDocks which refer to
495 // these toolbars. This change was needed to stop Audacity
496 // crashing when running with Jaws on Windows 10 1703.
499
500 mTopDock = mBotDock = nullptr; // indicate that it has been destroyed
501
502 for (auto &pair : mBars)
503 pair.second.reset();
504
505 mIndicator.reset();
506 }
507}
ToolBarConfiguration & GetConfiguration()
Definition: ToolDock.h:311
void WriteConfig()

References ToolBarConfiguration::Clear(), ToolDock::GetConfiguration(), mBars, mBotDock, mIndicator, mTopDock, and WriteConfig().

Referenced by ProjectManager::OnCloseWindow(), and ~ToolManager().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ DoneDragging()

void ToolManager::DoneDragging ( )
private

Definition at line 1487 of file ToolManager.cpp.

1488{
1489 // Done dragging - ensure grabber button isn't pushed
1490 if( mDragBar )
1491 {
1492 mDragBar->SetDocked( mDragBar->GetDock(), false );
1493 }
1494
1495 // Release capture
1496 auto &window = GetProjectFrame( *mParent );
1497 if( window.HasCapture() )
1498 {
1499 window.ReleaseMouse();
1500 }
1501
1502 // Hide the indicator
1503 mIndicator->Hide();
1504
1505 mDragWindow = NULL;
1506 mDragDock = NULL;
1507 mDragBar = NULL;
1508 mPrevDock = NULL;
1511 mLastPos.x = mBarPos.x = -1;
1512 mLastPos.y = mBarPos.y = -1;
1513 mTimer.Stop();
1514 mDidDrag = false;
1515 mClicked = false;
1516
1517 RestoreFocus();
1518}
static const Position UnspecifiedPosition
Definition: ToolDock.h:106
virtual void SetDocked(ToolDock *dock, bool pushed)
Definition: ToolBar.cpp:661
ToolDock * GetDock()
Definition: ToolBar.cpp:647
ToolBarConfiguration mPrevConfiguration
Definition: ToolManager.h:173
ToolDock * mPrevDock
Definition: ToolManager.h:170
ToolBarConfiguration::Position mPrevSlot
Definition: ToolManager.h:172
bool RestoreFocus()

References ToolBarConfiguration::Clear(), ToolBar::GetDock(), GetProjectFrame(), mBarPos, mClicked, mDidDrag, mDragBar, mDragDock, mDragWindow, mIndicator, mLastPos, mParent, mPrevConfiguration, mPrevDock, mPrevSlot, mTimer, RestoreFocus(), ToolBar::SetDocked(), and ToolBarConfiguration::UnspecifiedPosition.

Referenced by HandleEscapeKey(), and OnMouse().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ Expose()

void ToolManager::Expose ( Identifier  type,
bool  show 
)

Definition at line 1065 of file ToolManager.cpp.

1066{
1067 ToolBar *t = mBars[type].get();
1068
1069 // Handle docked and floaters differently
1070 if( t->IsDocked() )
1071 {
1072 t->GetDock()->Expose( t->GetSection(), show );
1073 }
1074 else
1075 {
1076 t->Expose( show );
1077 }
1078}
bool IsDocked() const
Definition: ToolBar.cpp:433
Identifier GetSection()
Definition: ToolBar.cpp:400
virtual bool Expose(bool show=true)
Definition: ToolBar.cpp:459
void Expose(Identifier type, bool show)
Definition: ToolDock.cpp:858

References ToolBar::Expose(), ToolDock::Expose(), ToolBar::GetDock(), ToolBar::GetSection(), ToolBar::IsDocked(), and mBars.

Referenced by ReadConfig(), Reset(), and ShowHide().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ FilterEvent()

int ToolManager::FilterEvent ( wxEvent &  event)
override

Definition at line 690 of file ToolManager.cpp.

691{
692 // Snoop the global event stream for changes of focused window. Remember
693 // the last one of our own that is not a grabber.
694
695 if (event.GetEventType() == wxEVT_KILL_FOCUS) {
696 auto &focusEvent = static_cast<wxFocusEvent&>(event);
697 auto window = focusEvent.GetWindow();
698 auto top = wxGetTopLevelParent(window);
699 if(auto toolFrame = dynamic_cast<ToolFrame*>(top))
700 top = toolFrame->GetParent();
701 // window is that which will GET the focus
702 if ( window &&
703 !dynamic_cast<Grabber*>( window ) &&
704 !dynamic_cast<ToolFrame*>( window ) &&
705 top == FindProjectFrame( mParent ) )
706 // Note this is a dangle-proof wxWindowRef:
707 mLastFocus = window;
708 }
709
710 return Event_Skip;
711}
wxFrame * FindProjectFrame(AudacityProject *project)
Get a pointer to the window associated with a project, or null if the given pointer is null,...
The widget to the left of a ToolBar that allows it to be dragged around to NEW positions.
Definition: Grabber.h:107
class ToolFrame
Definition: ToolManager.h:189
wxWindowRef mLastFocus
Definition: ToolManager.h:140

References FindProjectFrame(), mLastFocus, and mParent.

Here is the call graph for this function:

◆ Float()

ToolBar * ToolManager::Float ( ToolBar *  t,
wxPoint &  pos 
)
private

◆ ForEach()

template<typename F >
void ToolManager::ForEach ( F &&  fun)
inline

Visit bars, lexicographically by their textual ids.

Definition at line 102 of file ToolManager.h.

103 {
104 std::for_each(std::begin(mBars), std::end(mBars), [&fun](auto &pair){
105 fun(pair.second.get());
106 });
107 }
const char * end(const char *str) noexcept
Definition: StringUtils.h:106
const char * begin(const char *str) noexcept
Definition: StringUtils.h:101

References details::begin(), and details::end().

Referenced by CreateWindows(), ReadConfig(), RegenerateTooltips(), Reset(), and WriteConfig().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ Get() [1/2]

ToolManager & ToolManager::Get ( AudacityProject &  project)
static

◆ Get() [2/2]

const ToolManager & ToolManager::Get ( const AudacityProject &  project)
static

Definition at line 344 of file ToolManager.cpp.

345{
346 return Get( const_cast< AudacityProject & >( project ) );
347}
The top-level handle to an Audacity project. It serves as a source of events that other objects can b...
Definition: Project.h:90
static ToolManager & Get(AudacityProject &project)

References Get(), and project.

Here is the call graph for this function:

◆ GetBotDock() [1/2]

ToolDock * ToolManager::GetBotDock ( )

Definition at line 1000 of file ToolManager.cpp.

1001{
1002 return mBotDock;
1003}

References mBotDock.

◆ GetBotDock() [2/2]

const ToolDock * ToolManager::GetBotDock ( ) const

Definition at line 1005 of file ToolManager.cpp.

1006{
1007 return mBotDock;
1008}

References mBotDock.

◆ GetToolBar()

ToolBar * ToolManager::GetToolBar ( const Identifier &  type) const

Definition at line 978 of file ToolManager.cpp.

979{
980 auto end = mBars.end(), iter = mBars.find(type);
981 return (iter == end) ? nullptr : iter->second.get();
982}

References details::end(), and mBars.

Referenced by IsDocked(), IsVisible(), OnGrabber(), ReadConfig(), and Reset().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GetTopDock() [1/2]

ToolDock * ToolManager::GetTopDock ( )

Definition at line 987 of file ToolManager.cpp.

988{
989 return mTopDock;
990}

References mTopDock.

◆ GetTopDock() [2/2]

const ToolDock * ToolManager::GetTopDock ( ) const

Definition at line 992 of file ToolManager.cpp.

993{
994 return mTopDock;
995}

References mTopDock.

◆ HandleEscapeKey()

void ToolManager::HandleEscapeKey ( )
private

Definition at line 1458 of file ToolManager.cpp.

1459{
1460 if (mDragBar) {
1461 if(mPrevDock) {
1462 // Sheriff John Stone,
1463 // Why don't you leave me alone?
1464 // Well, I feel so break up
1465 // I want to go home.
1467 mPrevDock->Dock( mDragBar, true, mPrevSlot );
1468 Updated();
1469
1470 // Done with the floater
1472 mDragWindow->Destroy();
1473 mDragWindow = nullptr;
1474 mDragBar->Refresh(false);
1475 }
1476 else {
1477 // Floater remains, and returns to where it begain
1478 auto parent = mDragBar->GetParent();
1479 parent->SetPosition(mPrevPosition);
1480 mDragBar->SetDocked(NULL, false);
1481 }
1482
1483 DoneDragging();
1484 }
1485}
void RestoreConfiguration(ToolBarConfiguration &backup)
Definition: ToolDock.cpp:848
void Dock(ToolBar *bar, bool deflate, ToolBarConfiguration::Position ndx=ToolBarConfiguration::UnspecifiedPosition)
Definition: ToolDock.cpp:438
void ClearBar()
Definition: ToolManager.h:197
wxPoint mPrevPosition
Definition: ToolManager.h:169
void DoneDragging()

References ToolFrame::ClearBar(), ToolDock::Dock(), DoneDragging(), mDragBar, mDragWindow, mPrevConfiguration, mPrevDock, mPrevPosition, mPrevSlot, ToolDock::RestoreConfiguration(), ToolBar::SetDocked(), and Updated().

Referenced by OnGrabber().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ IsDocked()

bool ToolManager::IsDocked ( Identifier  type) const

Definition at line 1024 of file ToolManager.cpp.

1025{
1026 if (auto pBar = GetToolBar(type))
1027 return pBar->IsDocked();
1028 return false;
1029}
ToolBar * GetToolBar(const Identifier &type) const

References GetToolBar().

Here is the call graph for this function:

◆ IsVisible()

bool ToolManager::IsVisible ( Identifier  type) const

Definition at line 1034 of file ToolManager.cpp.

1035{
1036 if (auto pBar = GetToolBar(type))
1037 return pBar->IsVisible();
1038 return false;
1039
1040#if 0
1041 // If toolbar is floating
1042 if( !t->IsDocked() )
1043 {
1044 // Must return state of floater window
1045 return t->GetParent()->IsShown();
1046 }
1047
1048 // Return state of docked toolbar
1049 return t->IsShown();
1050#endif
1051}

References GetToolBar().

Referenced by ShowHide().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ LayoutToolBars()

void ToolManager::LayoutToolBars ( )

Definition at line 1083 of file ToolManager.cpp.

1084{
1085 // Update the layout
1086 if (mTopDock)
1087 {
1089 }
1090
1091 if (mBotDock)
1092 {
1094 }
1095}
void LayoutToolBars()
Definition: ToolDock.cpp:687

References ToolDock::LayoutToolBars(), mBotDock, and mTopDock.

Referenced by InitProjectWindow(), and OnMouse().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ ModifyAllProjectToolbarMenus()

void ToolManager::ModifyAllProjectToolbarMenus ( )
static

Definition at line 1532 of file ToolManager.cpp.

1533{
1534 for (auto pProject : AllProjects{}) {
1535 auto &project = *pProject;
1537 }
1538}
static void ModifyToolbarMenus(AudacityProject &project)

References ModifyToolbarMenus(), and project.

Referenced by anonymous_namespace{ViewMenus.cpp}::OnShowRMS(), anonymous_namespace{TrackMenus.cpp}::OnSyncLock(), anonymous_namespace{TransportMenus.cpp}::OnTogglePlayRecording(), anonymous_namespace{TransportMenus.cpp}::OnToggleSoundActivated(), anonymous_namespace{TransportMenus.cpp}::OnToggleSWPlaythrough(), anonymous_namespace{LabelMenus.cpp}::OnToggleTypeToCreateLabel(), and AdornedRulerPanel::TogglePinnedHead().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ ModifyToolbarMenus()

void ToolManager::ModifyToolbarMenus ( AudacityProject &  project)
static

Definition at line 1541 of file ToolManager.cpp.

1542{
1543 // Refreshes can occur during shutdown and the toolmanager may already
1544 // be deleted, so protect against it.
1545 auto &toolManager = ToolManager::Get( project );
1546
1547 // Now, go through each toolbar, and call EnableDisableButtons()
1548 toolManager.ForEach([](auto bar){
1549 if (bar)
1550 bar->EnableDisableButtons();
1551 });
1552
1553 // These don't really belong here, but it's easier and especially so for
1554 // the Edit toolbar and the sync-lock menu item.
1555 bool active = SyncLockTracks.Read();
1557
1559}
BoolSetting SyncLockTracks
Definition: SyncLock.cpp:163
bool Read(T *pVar) const
overload of Read returning a boolean that is true if the value was previously defined *‍/
Definition: Prefs.h:207
void SetSyncLock(bool flag)
Definition: SyncLock.cpp:49
static SyncLockState & Get(AudacityProject &project)
Definition: SyncLock.cpp:27

References CommandManager::Get(), SyncLockState::Get(), Get(), project, Setting< T >::Read(), SyncLockState::SetSyncLock(), SyncLockTracks, and CommandManager::UpdateCheckmarks().

Referenced by ModifyAllProjectToolbarMenus(), anonymous_namespace{ExtraMenus.cpp}::OnFullScreen(), OnMenuUpdate(), OnResetToolBars(), and AttachedToolBarMenuItem::OnShowToolBar().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ OnCaptureLost()

void ToolManager::OnCaptureLost ( wxMouseCaptureLostEvent &  event)
private

Definition at line 1287 of file ToolManager.cpp.

1288{
1289 // Can't do anything if we're not dragging. This also prevents
1290 // us from intercepting events that don't belong to us from the
1291 // parent since we're Connect()ed to a couple.
1292 if( !mDragWindow )
1293 {
1294 event.Skip();
1295 return;
1296 }
1297
1298 // Simulate button up
1299 wxMouseEvent e(wxEVT_LEFT_UP);
1300 e.SetEventObject(mParent);
1301 OnMouse(e);
1302}

References mDragWindow, mParent, and OnMouse().

Referenced by CreateWindows().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ OnGrabber()

void ToolManager::OnGrabber ( GrabberEvent &  event)
private

Definition at line 1410 of file ToolManager.cpp.

1411{
1412 // No need to propagate any further
1413 event.Skip( false );
1414
1415 if(event.IsEscaping())
1416 return HandleEscapeKey();
1417
1418 // Remember which bar we're dragging
1419 mDragBar = GetToolBar(event.BarId());
1420
1421 // Remember state, in case of ESCape key later
1422 if (mDragBar->IsDocked()) {
1423 mPrevDock = dynamic_cast<ToolDock*>(mDragBar->GetParent());
1424 wxASSERT(mPrevDock);
1427 }
1428 else
1429 mPrevPosition = mDragBar->GetParent()->GetPosition();
1430
1431 // Calculate the drag offset
1432 wxPoint mp = event.GetPosition();
1433 mDragOffset = mp -
1434 mDragBar->GetParent()->ClientToScreen( mDragBar->GetPosition() ) +
1435 wxPoint( 1, 1 );
1436
1437 mClicked = true;
1438 if( mPrevDock )
1439 {
1440 mDragWindow = nullptr;
1441 }
1442 else
1443 {
1444 mDragWindow = (ToolFrame *) mDragBar->GetParent();
1445 }
1446
1447 // We want all mouse events from this point on
1448 auto &window = GetProjectFrame( *mParent );
1449 if( !window.HasCapture() )
1450 window.CaptureMouse();
1451
1452 // Start monitoring shift key changes
1453 mLastState = wxGetKeyState( WXK_SHIFT );
1454 mTimer.Start( 100 );
1455}
bool IsEscaping() const
Definition: Grabber.h:75
Identifier BarId() const
Definition: Grabber.h:77
Position Find(const ToolBar *bar) const
Definition: ToolDock.cpp:87
void WrapConfiguration(ToolBarConfiguration &backup)
Definition: ToolDock.cpp:841
bool mLastState
Definition: ToolManager.h:157
void HandleEscapeKey()
wxPoint mDragOffset
Definition: ToolManager.h:145

References GrabberEvent::BarId(), ToolBarConfiguration::Find(), ToolDock::GetConfiguration(), GetProjectFrame(), GetToolBar(), HandleEscapeKey(), ToolBar::IsDocked(), GrabberEvent::IsEscaping(), mClicked, mDragBar, mDragOffset, mDragWindow, mLastState, mParent, mPrevConfiguration, mPrevDock, mPrevPosition, mPrevSlot, mTimer, and ToolDock::WrapConfiguration().

Here is the call graph for this function:

◆ OnIndicatorCreate()

void ToolManager::OnIndicatorCreate ( wxWindowCreateEvent &  event)
private

Definition at line 1369 of file ToolManager.cpp.

1370{
1371#if defined(__WXGTK__)
1372 mIndicator->SetShape( *mCurrent );
1373#endif
1374 event.Skip();
1375}
wxRegion * mCurrent
Definition: ToolManager.h:154

References mCurrent, and mIndicator.

Referenced by ToolManager().

Here is the caller graph for this function:

◆ OnIndicatorPaint()

void ToolManager::OnIndicatorPaint ( wxPaintEvent &  event)
private

Definition at line 1352 of file ToolManager.cpp.

1353{
1354 // TODO: Better to use a bitmap than a triangular region.
1355 wxWindow *w = (wxWindow *)event.GetEventObject();
1356 wxPaintDC dc( w );
1357 // TODO: Better (faster) to use the existing spare brush.
1358 wxBrush brush( theTheme.Colour( clrTrackPanelText ) );
1359 dc.SetBackground( brush );
1360 dc.Clear();
1361}
THEME_API Theme theTheme
Definition: Theme.cpp:82
wxColour & Colour(int iIndex)

References ThemeBase::Colour(), and theTheme.

Referenced by ToolManager().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ OnMenuUpdate()

void ToolManager::OnMenuUpdate ( struct MenuUpdateMessage  )
private

Definition at line 1304 of file ToolManager.cpp.

1305{
1307}

References ModifyToolbarMenus(), and mParent.

Referenced by CreateWindows().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ OnMouse()

void ToolManager::OnMouse ( wxMouseEvent &  event)
private

Definition at line 1100 of file ToolManager.cpp.

1101{
1102 // Go ahead and set the event to propagate
1103 event.Skip();
1104
1105 // Can't do anything if we're not dragging. This also prevents
1106 // us from intercepting events that don't belong to us from the
1107 // parent since we're Connect()ed to a couple.
1108 if( !mClicked )
1109 {
1110 return;
1111 }
1112
1113#if defined(__WXMAC__)
1114 // Disable window animation
1115 wxSystemOptions::SetOption( wxMAC_WINDOW_PLAIN_TRANSITION, 1 );
1116#endif
1117
1118 // Retrieve the event position
1119 wxPoint pos =
1120 ( (wxWindow *)event.GetEventObject() )->ClientToScreen( event.GetPosition() ) - mDragOffset;
1121
1122
1123 if( !event.LeftIsDown() )
1124 {
1125 // Button was released...finish the drag
1126 // Transition the bar to a dock
1127 if (!mDidDrag) {
1128 if (mPrevDock)
1130 DoneDragging();
1131 return;
1132 }
1133 else if( mDragDock && !event.ShiftDown() )
1134 {
1135 // Trip over...everyone ashore that's going ashore...
1137 Updated();
1139
1140 // Done with the floater
1141 mDragWindow->Destroy();
1142 mDragWindow = nullptr;
1143 mDragBar->Refresh(false);
1144 }
1145 else
1146 {
1147 // Calling SetDocked() to force the grabber button to popup
1148 mDragBar->SetDocked( NULL, false );
1149 }
1150
1151 DoneDragging();
1152 }
1153 else if( event.Dragging() && pos != mLastPos )
1154 {
1155 if (!mDidDrag) {
1156 // Must set the bar afloat if it's currently docked
1157 mDidDrag = true;
1158 wxPoint mp = event.GetPosition();
1159 mp = GetProjectFrame( *mParent ).ClientToScreen(mp);
1160 if (!mDragWindow) {
1161 // We no longer have control
1162 if (mPrevDock)
1164 UndockBar(mp);
1165 // Rearrange the remaining toolbars before trying to re-insert this one.
1167 }
1168 }
1169
1170 // Make toolbar follow the mouse
1171 mDragWindow->Move( pos );
1172
1173 // Remember to prevent excessive movement
1174 mLastPos = pos;
1175
1176 // Calc the top dock hittest rectangle
1177 wxRect tr = mTopDock->GetRect();
1178 tr.SetBottom( tr.GetBottom() + 10 );
1179 tr.SetPosition( mTopDock->GetParent()->ClientToScreen( tr.GetPosition() ) );
1180
1181 // Calc the bottom dock hittest rectangle
1182 wxRect br = mBotDock->GetRect();
1183 br.SetTop( br.GetTop() - 10 );
1184 br.SetBottom( br.GetBottom() + 20 );
1185 br.SetPosition( mBotDock->GetParent()->ClientToScreen( br.GetPosition() ) );
1186
1187
1188 // Add half the bar height. We could use the actual bar height, but that would be confusing as a
1189 // bar removed at a place might not dock back there if just let go.
1190 // Also add 5 pixels in horizontal direction, so that a click without a move (or a very small move)
1191 // lands back where we started.
1192 pos += wxPoint( 5, 20 );
1193
1194
1195 // To find which dock, rather than test against pos, test against the whole dragger rect.
1196 // This means it is enough to overlap the dock to dock with it.
1197 wxRect barRect = mDragWindow->GetRect();
1198 ToolDock *dock = NULL;
1199 if( tr.Intersects( barRect ) )
1200 dock = mTopDock;
1201 else if( br.Intersects( barRect ) )
1202 dock = mBotDock;
1203
1204 // Looks like we have a winner...
1205 if( dock )
1206 {
1207 wxPoint p;
1208 wxRect r;
1209
1210 // Calculate where the bar would be placed
1211 mDragBefore = dock->PositionBar( mDragBar, pos, r );
1212
1213 // If different than the last time, the indicator must be moved
1214 if( r != mBarPos )
1215 {
1216 wxRect dr = dock->GetRect();
1217
1218 // Hide the indicator before changing the shape
1219 mIndicator->Hide();
1220
1221 // Decide which direction the arrow should point
1222 if( r.GetTop() >= dr.GetHeight() )
1223 {
1224 const auto &box = mDown->GetBox();
1225 p.x = dr.GetLeft() + ( dr.GetWidth() / 2 )
1226 - (box.GetWidth() / 2);
1227 p.y = dr.GetBottom() - box.GetHeight();
1228 mCurrent = mDown.get();
1229 }
1230 else
1231 {
1232 // r is the rectangle of the toolbar being dragged.
1233 // A tall undocked toolbar will become at most 2 tbs
1234 // high when docked, so the triangular drop indicator
1235 // needs to use that height, h, not the bar height
1236 // for calculating where to be drawn.
1237 const int tbs = toolbarSingle + toolbarGap;
1238 int h = wxMin(r.GetHeight(), 2*tbs-1);
1239 p.x = dr.GetLeft() + r.GetLeft();
1240 p.y = dr.GetTop() + r.GetTop() +
1241 ( ( h - mLeft->GetBox().GetHeight() ) / 2 );
1242 mCurrent = mLeft.get();
1243 }
1244
1245 // Change the shape while hidden and then show it if okay
1246 mIndicator->SetShape( *mCurrent );
1247 if( !event.ShiftDown() )
1248 {
1249 mIndicator->Show();
1250 mIndicator->Update();
1251 }
1252
1253 // Move it into position
1254 // LL: Do this after the Show() since KDE doesn't move the window
1255 // if it's not shown. (Do it outside if the previous IF as well)
1256 mIndicator->Move( dock->GetParent()->ClientToScreen( p ) );
1257
1258 // Remember for next go round
1259 mBarPos = r;
1260 }
1261 }
1262 else
1263 {
1264 // Hide the indicator if it's still shown
1265 if( mBarPos.x != -1 )
1266 {
1267 // Hide any
1268 mIndicator->Hide();
1269 mBarPos.x = -1;
1270 mBarPos.y = -1;
1271 }
1272 }
1273
1274 // Remember to which dock the drag bar belongs.
1275 mDragDock = dock;
1276 }
1277
1278#if defined(__WXMAC__)
1279 // Reinstate original transition
1280 wxSystemOptions::SetOption( wxMAC_WINDOW_PLAIN_TRANSITION, mTransition );
1281#endif
1282}
static constexpr auto toolbarSingle
Height of a single line toolbar.
Definition: ToolBar.h:53
#define toolbarGap
Definition: ToolBar.h:63
void Remove(const ToolBar *bar)
Definition: ToolDock.cpp:224
ToolBarConfiguration::Position PositionBar(ToolBar *t, const wxPoint &pos, wxRect &rect)
Definition: ToolDock.cpp:744
void UndockBar(wxPoint mp)
void LayoutToolBars()
ToolBarConfiguration::Position mDragBefore
Definition: ToolManager.h:146

References ToolFrame::ClearBar(), ToolDock::Dock(), DoneDragging(), ToolDock::GetConfiguration(), GetProjectFrame(), LayoutToolBars(), mBarPos, mBotDock, mClicked, mCurrent, mDidDrag, mDown, mDragBar, mDragBefore, mDragDock, mDragOffset, mDragWindow, mIndicator, mLastPos, mLeft, mPrevConfiguration, mPrevDock, mTopDock, mTransition, ToolDock::PositionBar(), ToolBarConfiguration::Remove(), ToolDock::RestoreConfiguration(), ToolBar::SetDocked(), toolbarGap, toolbarSingle, UndockBar(), and Updated().

Referenced by CreateWindows(), and OnCaptureLost().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ OnResetToolBars()

void ToolManager::OnResetToolBars ( const CommandContext &  context)
static

Definition at line 566 of file ToolManager.cpp.

567{
568 auto &project = context.project;
569 auto &toolManager = ToolManager::Get( project );
570
571 toolManager.Reset();
573}
AudacityProject & project

References Get(), ModifyToolbarMenus(), CommandContext::project, and project.

Referenced by anonymous_namespace{PluginMenus.cpp}::OnResetConfig(), and anonymous_namespace{ToolbarMenus.cpp}::ToolbarsMenu().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ OnTimer()

void ToolManager::OnTimer ( wxTimerEvent &  event)
private

Definition at line 1312 of file ToolManager.cpp.

1313{
1314 // Go ahead and set the event to propagate
1315 event.Skip();
1316
1317 // Can't do anything if we're not dragging. This also prevents
1318 // us from intercepting events that don't belong to us from the
1319 // parent since we're Connect()ed to a couple.
1320 if( !mDragWindow )
1321 {
1322 return;
1323 }
1324
1325 bool state = wxGetKeyState( WXK_SHIFT );
1326 if( mLastState != state )
1327 {
1328 mLastState = state;
1329
1330#if defined(__WXMAC__)
1331 // Disable window animation
1332 wxSystemOptions::SetOption( wxMAC_WINDOW_PLAIN_TRANSITION, 1 );
1333#endif
1334
1335 mIndicator->Show( !state );
1336
1337#if defined(__WXMAC__)
1338 // Disable window animation
1339 wxSystemOptions::SetOption( wxMAC_WINDOW_PLAIN_TRANSITION, mTransition );
1340#endif
1341 }
1342
1343 return;
1344}

References mDragWindow, mIndicator, mLastState, and mTransition.

◆ operator=()

ToolManager & ToolManager::operator= ( const ToolManager &  )
delete

◆ ReadConfig()

void ToolManager::ReadConfig ( )
private

Definition at line 716 of file ToolManager.cpp.

717{
718 std::vector<Identifier> unordered[ DockCount ];
719 std::vector<ToolBar*> dockedAndHidden;
720 std::map<Identifier, bool> show;
721 std::map<Identifier, int> width;
722 std::map<Identifier, int> height;
723 int x, y;
724 int dock;
725 bool someFound { false };
726
727#if defined(__WXMAC__)
728 // Disable window animation
729 wxSystemOptions::SetOption( wxMAC_WINDOW_PLAIN_TRANSITION, 1 );
730#endif
731
732 // Change to the bar root
733 auto toolbarsGroup = gPrefs->BeginGroup("/GUI/ToolBars");
734
735 ToolBarConfiguration::Legacy topLegacy, botLegacy;
736
737 int vMajor, vMinor, vMicro;
738 GetPreferencesVersion(vMajor, vMinor, vMicro);
739 bool useLegacyDock = false;
740 // note that vMajor, vMinor, and vMicro will all be zero if either it's a new audacity.cfg file
741 // or the version is less than 1.3.13 (when there were no version keys according to the comments in
742 // InitPreferences()). So for new audacity.cfg
743 // file useLegacyDock will be true, but this doesn't matter as there are no Dock or DockV2 keys in the file yet.
744 if (vMajor <= 1 ||
745 (vMajor == 2 && (vMinor <= 1 || (vMinor == 2 && vMicro <= 1)))) // version <= 2.2.1
746 useLegacyDock = true;
747
748
749 // Load and apply settings for each bar
750 ForEach([&](ToolBar *bar){
751 //wxPoint Center = mParent->GetPosition() + (mParent->GetSize() * 0.33);
752 //wxPoint Center(
753 // wxSystemSettings::GetMetric( wxSYS_SCREEN_X ) /2 ,
754 // wxSystemSettings::GetMetric( wxSYS_SCREEN_Y ) /2 );
755
756 // Change to the bar subkey
757 auto ndx = bar->GetSection();
758 auto barGroup = gPrefs->BeginGroup(ndx.GET());
759
760 const bool bShownByDefault = bar->ShownByDefault();
761 const int defaultDock = bar->DefaultDockID();
762
763 // Read in all the settings
764
765 if (useLegacyDock)
766 gPrefs->Read( wxT("Dock"), &dock, -1); // legacy version of DockV2
767 else
768 gPrefs->Read( wxT("DockV2"), &dock, -1);
769
770 const bool found = (dock != -1);
771 if (found)
772 someFound = true;
773 if (!found)
774 dock = defaultDock;
775
776 ToolDock *d;
778 switch(dock)
779 {
780 case TopDockID: d = mTopDock; pLegacy = &topLegacy; break;
781 case BotDockID: d = mBotDock; pLegacy = &botLegacy; break;
782 default: d = nullptr; pLegacy = nullptr; break;
783 }
784
785 bool ordered = ToolBarConfiguration::Read(
786 d ? &d->GetConfiguration() : nullptr,
787 pLegacy,
788 bar, show[ ndx ], bShownByDefault)
789 && found;
790
791 gPrefs->Read( wxT("X"), &x, -1 );
792 gPrefs->Read( wxT("Y"), &y, -1 );
793 gPrefs->Read( wxT("W"), &width[ ndx ], -1 );
794 gPrefs->Read( wxT("H"), &height[ ndx ], -1 );
795
796 bar->SetVisible( show[ ndx ] );
797
798 // Docked or floating?
799 if( dock )
800 {
801 // Default to top dock if the ID isn't valid
802 if( dock < NoDockID || dock > DockCount ) {
803 dock = TopDockID;
804 }
805
806 // Create the bar with the correct parent
807 if( dock == TopDockID )
808 {
809 bar->Create( mTopDock );
810 }
811 else
812 {
813 bar->Create( mBotDock );
814 }
815
816 // Set the width and height
817 if( width[ ndx ] != -1 && height[ ndx ] != -1 )
818 {
819 wxSize sz( width[ ndx ], height[ ndx ] );
820 bar->SetSize( sz );
821 bar->ResizingDone();
822 }
823
824 // Set the width
825 if( width[ ndx ] >= bar->GetSize().x )
826 {
827 wxSize sz( width[ ndx ], bar->GetSize().y );
828 bar->SetSize( sz );
829 bar->Layout();
830 }
831
832 // make a note of docked and hidden toolbars
833 if (!show[ndx])
834 dockedAndHidden.push_back(bar);
835
836 if (!ordered)
837 {
838 // These must go at the end
839 unordered[ dock - 1 ].push_back( ndx );
840 }
841 }
842 else
843 {
844 // Create the bar (with the top dock being temporary parent)
845 bar->Create( mTopDock );
846
847 // Construct a NEW floater
848 wxASSERT(mParent);
849 ToolFrame *f = safenew ToolFrame( mParent, this, bar, wxPoint( x, y ) );
850
851 // Set the width and height
852 if( width[ ndx ] != -1 && height[ ndx ] != -1 )
853 {
854 wxSize sz( width[ ndx ], height[ ndx ] );
855 f->SetSizeHints( sz );
856 f->SetSize( sz );
857 f->Layout();
858 if( (x!=-1) && (y!=-1) )
859 bar->SetPositioned();
860 }
861
862 // Required on Linux Xfce
863 wxSize msz(width[ndx],height[ndx]-1);
864 bar->GetParent()->SetMinSize(msz);
865
866 // Inform toolbar of change
867 bar->SetDocked( NULL, false );
868
869 // Show or hide it
870 Expose( bar->GetSection(), show[ ndx ] );
871 }
872 });
873
874 mTopDock->GetConfiguration().PostRead(topLegacy);
875 mBotDock->GetConfiguration().PostRead(botLegacy);
876
877 // Add all toolbars to their target dock
878 for( dock = 0; dock < DockCount; dock++ )
879 {
880 ToolDock *d = ( dock + 1 == TopDockID ? mTopDock : mBotDock );
881
882 d->LoadConfig();
883
884 // Add all unordered toolbars
885 for( int ord = 0; ord < (int) unordered[ dock ].size(); ord++ )
886 {
887 ToolBar *t = mBars[unordered[dock][ord]].get();
888
889 // Dock it
890 d->Dock( t, false );
891
892 // Show or hide the bar
893 Expose( t->GetSection(), show[ t->GetSection() ] );
894 }
895 }
896
897 // hidden docked toolbars
898 for (auto bar : dockedAndHidden) {
899 bar->SetVisible(false );
900 bar->GetDock()->Dock(bar, false);
901 bar->Expose(false);
902 }
903
904 toolbarsGroup.Reset();
905
906#if defined(__WXMAC__)
907 // Reinstate original transition
908 wxSystemOptions::SetOption( wxMAC_WINDOW_PLAIN_TRANSITION, mTransition );
909#endif
910
911 // Setup the neighbors according to the
912 // default config
913
914 for (const auto& entry : DefaultConfigTable)
915 {
916 const auto &ndx = entry.barID;
917 const auto bar = GetToolBar(ndx);
918 if (bar != nullptr)
919 bar->SetPreferredNeighbors(entry.rightOf, entry.below);
920 }
921
922 if (!someFound)
923 Reset();
924}
wxT("CloseDown"))
static ProjectFileIORegistry::AttributeWriterEntry entry
audacity::BasicSettings * gPrefs
Definition: Prefs.cpp:68
void GetPreferencesVersion(int &vMajor, int &vMinor, int &vMicro)
Definition: Prefs.cpp:239
@ DockCount
Definition: ToolDock.h:45
static struct DefaultConfigEntry DefaultConfigTable[]
static bool Read(ToolBarConfiguration *pConfiguration, Legacy *pLegacy, ToolBar *bar, bool &visible, bool defaultVisible)
Definition: ToolDock.cpp:281
void PostRead(Legacy &legacy)
Definition: ToolDock.cpp:334
void SetVisible(bool bVisible)
Definition: ToolBar.cpp:446
virtual void ResizingDone()
Definition: ToolBar.h:196
void SetPositioned()
Definition: ToolBar.h:139
void SetPreferredNeighbors(Identifier left, Identifier top={})
Definition: ToolBar.cpp:652
virtual bool ShownByDefault() const
Whether the toolbar should be shown by default. Default implementation returns true.
Definition: ToolBar.cpp:365
virtual void Create(wxWindow *parent)
Definition: ToolBar.cpp:492
virtual DockID DefaultDockID() const
Which dock the toolbar defaults into. Default implementation chooses the top dock.
Definition: ToolBar.cpp:375
void LoadConfig()
Definition: ToolDock.cpp:466
void Expose(Identifier type, bool show)
GroupScope BeginGroup(const wxString &prefix)
Appends a prefix to the current group or sets a new absolute path. Group that was set as current befo...
virtual bool Read(const wxString &key, bool *value) const =0

References audacity::BasicSettings::BeginGroup(), BotDockID, ToolBar::Create(), DefaultConfigTable, ToolBar::DefaultDockID(), ToolDock::Dock(), DockCount, entry, ToolBar::Expose(), Expose(), ForEach(), ToolDock::GetConfiguration(), ToolBar::GetDock(), GetPreferencesVersion(), ToolBar::GetSection(), GetToolBar(), gPrefs, ToolDock::LoadConfig(), mBars, mBotDock, mParent, mTopDock, mTransition, ToolBarConfiguration::PostRead(), audacity::BasicSettings::Read(), ToolBarConfiguration::Read(), Reset(), ToolBar::ResizingDone(), safenew, ToolBar::SetDocked(), ToolBar::SetPositioned(), ToolBar::SetPreferredNeighbors(), ToolBar::SetVisible(), ToolBar::ShownByDefault(), size, TopDockID, and wxT().

Referenced by CreateWindows().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ RegenerateTooltips()

void ToolManager::RegenerateTooltips ( )

Definition at line 682 of file ToolManager.cpp.

683{
684 ForEach([](auto bar){
685 if (bar)
686 bar->RegenerateTooltips();
687 });
688}

References ForEach().

Referenced by ProjectManager::New().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ Reset()

void ToolManager::Reset ( )

Definition at line 576 of file ToolManager.cpp.

577{
578 // Disconnect all docked bars
579 for ( const auto &entry : DefaultConfigTable )
580 {
581 const auto &ndx = entry.barID;
582 ToolBar *bar = GetToolBar(ndx);
583 if (!bar)
584 continue;
585
587 (entry.rightOf == Identifier{}) ? nullptr : GetToolBar(entry.rightOf),
588 (entry.below == Identifier{}) ? nullptr : GetToolBar(entry.below)
589 };
590
591 bar->SetSize( 20,20 );
592
593 wxWindow *floater;
594 ToolDock *dock;
595 bool expose = true;
596
597 // Disconnect the bar
598 if( bar->IsDocked() )
599 {
600 bar->GetDock()->Undock( bar );
601 floater = NULL;
602 }
603 else
604 {
605 floater = bar->GetParent();
606 }
607
608 // Decide which dock.
609 dock = (bar->DefaultDockID() == ToolBar::TopDockID)
610 ? mTopDock : mBotDock;
611
612 // PRL: Destroy the tool frame before recreating buttons.
613 // This fixes some subtle sizing problems on macOs.
614 bar->Reparent( dock );
615 //OK (and good) to DELETE floater, as bar is no longer in it.
616 if( floater )
617 floater->Destroy();
618
619 // Recreate bar buttons (and resize it)
620 bar->SetToDefaultSize();
621 bar->ReCreateButtons();
623
624#if 0
625 if( bar->IsResizable() )
626 {
627 bar->SetSize(bar->GetBestFittingSize());
628 }
629#endif
630
631 // Hide some bars.
632 expose = bar->ShownByDefault() || bar->HideAfterReset();
633
634 // Next condition will always (?) be true, as the reset configuration is
635 // with no floating toolbars.
636 if( dock != NULL )
637 {
638 // when we dock, we reparent, so bar is no longer a child of floater.
639 dock->Dock( bar, false, position );
640 Expose( bar->GetSection(), expose );
641 }
642 else
643 {
644 // The (tool)bar has a dragger window round it, the floater.
645 // in turn floater will have mParent (the entire App) as its
646 // parent.
647
648 // Maybe construct a NEW floater
649 // this happens if we have just been bounced out of a dock.
650 if( floater == NULL ) {
651 wxASSERT(mParent);
652 floater = safenew ToolFrame( mParent, this, bar, wxPoint(-1,-1) );
653 bar->Reparent( floater );
654 }
655
656 // This bar is undocked and invisible.
657 // We are doing a reset toolbars, so even the invisible undocked bars should
658 // be moved somewhere sensible. Put bar near center of window.
659 // If there were multiple hidden toobars the * 10 adjustment means
660 // they won't overlap too much.
661 floater->CentreOnParent( );
662 const auto index = bar->GetIndex();
663 floater->Move(
664 floater->GetPosition() + wxSize{ index * 10 - 200, index * 10 });
665 bar->SetDocked( NULL, false );
666 Expose( bar->GetSection(), false );
667 }
668 }
669
670 ForEach([this](auto bar){
671 if (bar && bar->HideAfterReset())
672 Expose(bar->GetSection(), false);
673 });
674 // TODO:??
675 // If audio was playing, we stopped the VU meters,
676 // It would be nice to show them again, but hardly essential as
677 // they will show up again on the next play.
678 // SetVUMeters(AudacityProject *p);
679 Updated();
680}
An explicitly nonlocalized string, not meant for the user to see.
Definition: Identifier.h:22
virtual void EnableDisableButtons()=0
@ TopDockID
Definition: ToolBar.h:92
virtual void ReCreateButtons()
Definition: ToolBar.cpp:533
bool IsResizable() const
Definition: ToolBar.cpp:425
int GetIndex() const
Get a value used for computing cascading positions of undocked bars.
Definition: ToolBar.h:111
virtual void SetToDefaultSize()
Definition: ToolBar.cpp:513
virtual bool HideAfterReset() const
Default implementation returns false.
Definition: ToolBar.cpp:370
void Undock(ToolBar *bar)
Definition: ToolDock.cpp:426

References DefaultConfigTable, ToolBar::DefaultDockID(), ToolDock::Dock(), ToolBar::EnableDisableButtons(), entry, Expose(), ForEach(), ToolBar::GetDock(), ToolBar::GetIndex(), ToolBar::GetSection(), GetToolBar(), ToolBar::HideAfterReset(), ToolBar::IsDocked(), ToolBar::IsResizable(), mBotDock, mParent, mTopDock, ToolBar::ReCreateButtons(), safenew, ToolBar::SetDocked(), ToolBar::SetToDefaultSize(), ToolBar::ShownByDefault(), ToolBar::TopDockID, ToolDock::Undock(), and Updated().

Referenced by ReadConfig().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ RestoreFocus()

bool ToolManager::RestoreFocus ( )

Definition at line 1520 of file ToolManager.cpp.

1521{
1522 if (mLastFocus) {
1523 auto temp1 = AButton::TemporarilyAllowFocus();
1524 auto temp2 = ASlider::TemporarilyAllowFocus();
1526 mLastFocus->SetFocus();
1527 return true;
1528 }
1529 return false;
1530}
static TempAllowFocus TemporarilyAllowFocus()
Definition: AButton.cpp:764
static TempAllowFocus TemporarilyAllowFocus()
Definition: ASlider.cpp:1908
static TempAllowFocus TemporarilyAllowFocus()

References mLastFocus, AButton::TemporarilyAllowFocus(), ASlider::TemporarilyAllowFocus(), and MeterPanelBase::TemporarilyAllowFocus().

Referenced by DoneDragging().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ ShowHide()

void ToolManager::ShowHide ( Identifier  type)

Definition at line 1056 of file ToolManager.cpp.

1057{
1058 Expose( type, !mBars[type]->IsVisible() );
1059 Updated();
1060}
bool IsVisible(Identifier type) const

References Expose(), IsVisible(), mBars, and Updated().

Here is the call graph for this function:

◆ UndockBar()

void ToolManager::UndockBar ( wxPoint  mp)
private

Definition at line 1377 of file ToolManager.cpp.

1378{
1379#if defined(__WXMAC__)
1380 // Disable window animation
1381 wxSystemOptions::SetOption( wxMAC_WINDOW_PLAIN_TRANSITION, 1 );
1382#endif
1383
1384 // Adjust the starting position
1385 mp -= mDragOffset;
1386
1387 // Inform toolbar of change
1388 mDragBar->SetDocked( NULL, true );
1390
1391 // Construct a NEW floater
1392 wxASSERT(mParent);
1394 mDragWindow->SetLayoutDirection(wxLayout_LeftToRight);
1395 // Make sure the ferry is visible
1396 mDragWindow->Show();
1397
1398 // Notify parent of change
1399 Updated();
1400
1401#if defined(__WXMAC__)
1402 // Reinstate original transition
1403 wxSystemOptions::SetOption( wxMAC_WINDOW_PLAIN_TRANSITION, mTransition );
1404#endif
1405}

References mDragBar, mDragOffset, mDragWindow, mParent, mTransition, safenew, ToolBar::SetDocked(), ToolBar::SetPositioned(), and Updated().

Referenced by OnMouse().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ Updated()

void ToolManager::Updated ( )
private

Definition at line 1014 of file ToolManager.cpp.

1015{
1016 // Queue an update event
1017 wxCommandEvent e( EVT_TOOLBAR_UPDATED );
1018 GetProjectFrame( *mParent ).GetEventHandler()->AddPendingEvent( e );
1019}

References GetProjectFrame().

Referenced by HandleEscapeKey(), OnMouse(), Reset(), ShowHide(), and UndockBar().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ WriteConfig()

void ToolManager::WriteConfig ( )
private

Definition at line 929 of file ToolManager.cpp.

930{
931 if( !gPrefs )
932 {
933 return;
934 }
935
936 auto toolbarsGroup = gPrefs->BeginGroup("/GUI/ToolBars");
937
938 // Save state of each bar
939 ForEach([this](ToolBar *bar){
940 // Change to the bar subkey
941 auto sectionGroup = gPrefs->BeginGroup(bar->GetSection().GET());
942
943 // Search both docks for toolbar order
944 bool to = mTopDock->GetConfiguration().Contains( bar );
945 bool bo = mBotDock->GetConfiguration().Contains( bar );
946
947 // Save
948 // Note that DockV2 was introduced in 2.2.2 to fix bug #1554. Dock is retained so that
949 // the toolbar layout is not changed when opening a version before 2.2.2, and in particular
950 // its value is compatible with versions 2.1.3 to 2.2.1 which have this bug.
951 ToolDock* dock = bar->GetDock(); // dock for both shown and hidden toolbars
952 gPrefs->Write( wxT("DockV2"), static_cast<int>(dock == mTopDock ? TopDockID : dock == mBotDock ? BotDockID : NoDockID ));
953
954 gPrefs->Write( wxT("Dock"), static_cast<int>( to ? TopDockID : bo ? BotDockID : NoDockID));
955
956 dock = to ? mTopDock : bo ? mBotDock : nullptr; // dock for shown toolbars
958 (dock ? &dock->GetConfiguration() : nullptr, bar);
959
960 wxPoint pos( -1, -1 );
961 wxSize sz = bar->GetSize();
962 if( !bar->IsDocked() && bar->IsPositioned() )
963 {
964 pos = bar->GetParent()->GetPosition();
965 sz = bar->GetParent()->GetSize();
966 }
967 gPrefs->Write( wxT("X"), pos.x );
968 gPrefs->Write( wxT("Y"), pos.y );
969 gPrefs->Write( wxT("W"), sz.x );
970 gPrefs->Write( wxT("H"), sz.y );
971 });
972 gPrefs->Flush();
973}
@ NoDockID
Definition: ToolDock.h:42
const wxString & GET() const
Explicit conversion to wxString, meant to be ugly-looking and demanding of a comment why it's correct...
Definition: Identifier.h:66
bool Contains(const ToolBar *bar) const
Definition: ToolDock.h:235
static void Write(const ToolBarConfiguration *pConfiguration, const ToolBar *bar)
Definition: ToolDock.cpp:355
bool IsPositioned()
Definition: ToolBar.h:137
virtual bool Flush() noexcept=0
virtual bool Write(const wxString &key, bool value)=0

References audacity::BasicSettings::BeginGroup(), BotDockID, ToolBarConfiguration::Contains(), audacity::BasicSettings::Flush(), ForEach(), Identifier::GET(), ToolDock::GetConfiguration(), ToolBar::GetDock(), ToolBar::GetSection(), gPrefs, ToolBar::IsDocked(), ToolBar::IsPositioned(), mBotDock, mTopDock, NoDockID, TopDockID, ToolBarConfiguration::Write(), audacity::BasicSettings::Write(), and wxT().

Referenced by Destroy().

Here is the call graph for this function:
Here is the caller graph for this function:

Member Data Documentation

◆ mBarPos

wxRect ToolManager::mBarPos
private

Definition at line 149 of file ToolManager.h.

Referenced by DoneDragging(), OnMouse(), and ToolManager().

◆ mBars

std::map<Identifier, ToolBar::Holder> ToolManager::mBars
private

map not unordered_map, for the promise made by ForEach

Definition at line 167 of file ToolManager.h.

Referenced by CreateWindows(), Destroy(), Expose(), GetToolBar(), ReadConfig(), and ShowHide().

◆ mBotDock

ToolDock* ToolManager::mBotDock {}
private

◆ mClicked

bool ToolManager::mClicked {}
private

Definition at line 175 of file ToolManager.h.

Referenced by DoneDragging(), OnGrabber(), and OnMouse().

◆ mCurrent

wxRegion* ToolManager::mCurrent
private

Definition at line 154 of file ToolManager.h.

Referenced by OnIndicatorCreate(), and OnMouse().

◆ mDidDrag

bool ToolManager::mDidDrag {}
private

Definition at line 174 of file ToolManager.h.

Referenced by DoneDragging(), and OnMouse().

◆ mDown

std::unique_ptr<wxRegion> ToolManager::mDown
private

Definition at line 153 of file ToolManager.h.

Referenced by OnMouse(), and ToolManager().

◆ mDragBar

ToolBar* ToolManager::mDragBar {}
private

Definition at line 144 of file ToolManager.h.

Referenced by DoneDragging(), HandleEscapeKey(), OnGrabber(), OnMouse(), ToolManager(), and UndockBar().

◆ mDragBefore

ToolBarConfiguration::Position ToolManager::mDragBefore {}
private

Definition at line 146 of file ToolManager.h.

Referenced by OnMouse().

◆ mDragDock

ToolDock* ToolManager::mDragDock
private

Definition at line 143 of file ToolManager.h.

Referenced by DoneDragging(), OnMouse(), and ToolManager().

◆ mDragOffset

wxPoint ToolManager::mDragOffset
private

Definition at line 145 of file ToolManager.h.

Referenced by OnGrabber(), OnMouse(), and UndockBar().

◆ mDragWindow

ToolFrame* ToolManager::mDragWindow
private

◆ mIndicator

FramePtr ToolManager::mIndicator
private

Definition at line 152 of file ToolManager.h.

Referenced by Destroy(), DoneDragging(), OnIndicatorCreate(), OnMouse(), OnTimer(), and ToolManager().

◆ mLastFocus

wxWindowRef ToolManager::mLastFocus {}
private

Definition at line 140 of file ToolManager.h.

Referenced by FilterEvent(), and RestoreFocus().

◆ mLastPos

wxPoint ToolManager::mLastPos
private

Definition at line 148 of file ToolManager.h.

Referenced by DoneDragging(), OnMouse(), and ToolManager().

◆ mLastState

bool ToolManager::mLastState
private

Definition at line 157 of file ToolManager.h.

Referenced by OnGrabber(), and OnTimer().

◆ mLeft

std::unique_ptr<wxRegion> ToolManager::mLeft
private

Definition at line 153 of file ToolManager.h.

Referenced by OnMouse(), and ToolManager().

◆ mMenuManagerSubscription

Observer::Subscription ToolManager::mMenuManagerSubscription
private

Definition at line 138 of file ToolManager.h.

Referenced by CreateWindows().

◆ mParent

AudacityProject* ToolManager::mParent
private

◆ mPrevConfiguration

ToolBarConfiguration ToolManager::mPrevConfiguration
private

Definition at line 173 of file ToolManager.h.

Referenced by DoneDragging(), HandleEscapeKey(), OnGrabber(), and OnMouse().

◆ mPrevDock

ToolDock* ToolManager::mPrevDock {}
private

Definition at line 170 of file ToolManager.h.

Referenced by DoneDragging(), HandleEscapeKey(), OnGrabber(), and OnMouse().

◆ mPrevPosition

wxPoint ToolManager::mPrevPosition {}
private

Definition at line 169 of file ToolManager.h.

Referenced by HandleEscapeKey(), and OnGrabber().

◆ mPrevSlot

Definition at line 171 of file ToolManager.h.

Referenced by DoneDragging(), HandleEscapeKey(), and OnGrabber().

◆ mTimer

wxTimer ToolManager::mTimer
private

Definition at line 156 of file ToolManager.h.

Referenced by CreateWindows(), DoneDragging(), and OnGrabber().

◆ mTopDock

ToolDock* ToolManager::mTopDock {}
private

◆ mTransition

bool ToolManager::mTransition
private

Definition at line 160 of file ToolManager.h.

Referenced by OnMouse(), OnTimer(), ReadConfig(), ToolManager(), and UndockBar().


The documentation for this class was generated from the following files: