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
 
ToolManageroperator= (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)
 
ToolBarGetToolBar (const Identifier &type) const
 
ToolDockGetTopDock ()
 
const ToolDockGetTopDock () const
 
ToolDockGetBotDock ()
 
const ToolDockGetBotDock () 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 ToolManagerGet (AudacityProject &project)
 
static const ToolManagerGet (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

ToolBarFloat (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
 
AudacityProjectmParent
 
wxWindowRef mLastFocus {}
 
ToolFramemDragWindow
 
ToolDockmDragDock
 
ToolBarmDragBar {}
 
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
 
ToolDockmTopDock {}
 
ToolDockmBotDock {}
 
std::map< Identifier, ToolBar::HoldermBars
 map not unordered_map, for the promise made by ForEach More...
 
wxPoint mPrevPosition {}
 
ToolDockmPrevDock {}
 
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: