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:9
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:74
void SetIndex(int index)
Set a value used for computing cascading positions of undocked bars.
Definition: ToolBar.h:114
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:1047

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 1484 of file ToolManager.cpp.

1485{
1486 // Done dragging - ensure grabber button isn't pushed
1487 if( mDragBar )
1488 {
1489 mDragBar->SetDocked( mDragBar->GetDock(), false );
1490 }
1491
1492 // Release capture
1493 auto &window = GetProjectFrame( *mParent );
1494 if( window.HasCapture() )
1495 {
1496 window.ReleaseMouse();
1497 }
1498
1499 // Hide the indicator
1500 mIndicator->Hide();
1501
1502 mDragWindow = NULL;
1503 mDragDock = NULL;
1504 mDragBar = NULL;
1505 mPrevDock = NULL;
1508 mLastPos.x = mBarPos.x = -1;
1509 mLastPos.y = mBarPos.y = -1;
1510 mTimer.Stop();
1511 mDidDrag = false;
1512 mClicked = false;
1513
1514 RestoreFocus();
1515}
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 1062 of file ToolManager.cpp.

1063{
1064 ToolBar *t = mBars[type].get();
1065
1066 // Handle docked and floaters differently
1067 if( t->IsDocked() )
1068 {
1069 t->GetDock()->Expose( t->GetSection(), show );
1070 }
1071 else
1072 {
1073 t->Expose( show );
1074 }
1075}
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 687 of file ToolManager.cpp.

688{
689 // Snoop the global event stream for changes of focused window. Remember
690 // the last one of our own that is not a grabber.
691
692 if (event.GetEventType() == wxEVT_KILL_FOCUS) {
693 auto &focusEvent = static_cast<wxFocusEvent&>(event);
694 auto window = focusEvent.GetWindow();
695 auto top = wxGetTopLevelParent(window);
696 if(auto toolFrame = dynamic_cast<ToolFrame*>(top))
697 top = toolFrame->GetParent();
698 // window is that which will GET the focus
699 if ( window &&
700 !dynamic_cast<Grabber*>( window ) &&
701 !dynamic_cast<ToolFrame*>( window ) &&
702 top == FindProjectFrame( mParent ) )
703 // Note this is a dangle-proof wxWindowRef:
704 mLastFocus = window;
705 }
706
707 return Event_Skip;
708}
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 997 of file ToolManager.cpp.

998{
999 return mBotDock;
1000}

References mBotDock.

◆ GetBotDock() [2/2]

const ToolDock * ToolManager::GetBotDock ( ) const

Definition at line 1002 of file ToolManager.cpp.

1003{
1004 return mBotDock;
1005}

References mBotDock.

◆ GetToolBar()

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

Definition at line 975 of file ToolManager.cpp.

976{
977 auto end = mBars.end(), iter = mBars.find(type);
978 return (iter == end) ? nullptr : iter->second.get();
979}

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 984 of file ToolManager.cpp.

985{
986 return mTopDock;
987}

References mTopDock.

◆ GetTopDock() [2/2]

const ToolDock * ToolManager::GetTopDock ( ) const

Definition at line 989 of file ToolManager.cpp.

990{
991 return mTopDock;
992}

References mTopDock.

◆ HandleEscapeKey()

void ToolManager::HandleEscapeKey ( )
private

Definition at line 1455 of file ToolManager.cpp.

1456{
1457 if (mDragBar) {
1458 if(mPrevDock) {
1459 // Sheriff John Stone,
1460 // Why don't you leave me alone?
1461 // Well, I feel so break up
1462 // I want to go home.
1464 mPrevDock->Dock( mDragBar, true, mPrevSlot );
1465 Updated();
1466
1467 // Done with the floater
1469 mDragWindow->Destroy();
1470 mDragWindow = nullptr;
1471 mDragBar->Refresh(false);
1472 }
1473 else {
1474 // Floater remains, and returns to where it begain
1475 auto parent = mDragBar->GetParent();
1476 parent->SetPosition(mPrevPosition);
1477 mDragBar->SetDocked(NULL, false);
1478 }
1479
1480 DoneDragging();
1481 }
1482}
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 1021 of file ToolManager.cpp.

1022{
1023 if (auto pBar = GetToolBar(type))
1024 return pBar->IsDocked();
1025 return false;
1026}
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 1031 of file ToolManager.cpp.

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

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 1080 of file ToolManager.cpp.

1081{
1082 // Update the layout
1083 if (mTopDock)
1084 {
1086 }
1087
1088 if (mBotDock)
1089 {
1091 }
1092}
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 1529 of file ToolManager.cpp.

1530{
1531 for (auto pProject : AllProjects{}) {
1532 auto &project = *pProject;
1534 }
1535}
static void ModifyToolbarMenus(AudacityProject &project)

References ModifyToolbarMenus(), and project.

Referenced by 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 1538 of file ToolManager.cpp.

1539{
1540 // Refreshes can occur during shutdown and the toolmanager may already
1541 // be deleted, so protect against it.
1542 auto &toolManager = ToolManager::Get( project );
1543
1544 // Now, go through each toolbar, and call EnableDisableButtons()
1545 toolManager.ForEach([](auto bar){
1546 if (bar)
1547 bar->EnableDisableButtons();
1548 });
1549
1550 // These don't really belong here, but it's easier and especially so for
1551 // the Edit toolbar and the sync-lock menu item.
1552 bool active = SyncLockTracks.Read();
1554
1556}
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 1284 of file ToolManager.cpp.

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

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 1407 of file ToolManager.cpp.

1408{
1409 // No need to propagate any further
1410 event.Skip( false );
1411
1412 if(event.IsEscaping())
1413 return HandleEscapeKey();
1414
1415 // Remember which bar we're dragging
1416 mDragBar = GetToolBar(event.BarId());
1417
1418 // Remember state, in case of ESCape key later
1419 if (mDragBar->IsDocked()) {
1420 mPrevDock = dynamic_cast<ToolDock*>(mDragBar->GetParent());
1421 wxASSERT(mPrevDock);
1424 }
1425 else
1426 mPrevPosition = mDragBar->GetParent()->GetPosition();
1427
1428 // Calculate the drag offset
1429 wxPoint mp = event.GetPosition();
1430 mDragOffset = mp -
1431 mDragBar->GetParent()->ClientToScreen( mDragBar->GetPosition() ) +
1432 wxPoint( 1, 1 );
1433
1434 mClicked = true;
1435 if( mPrevDock )
1436 {
1437 mDragWindow = nullptr;
1438 }
1439 else
1440 {
1441 mDragWindow = (ToolFrame *) mDragBar->GetParent();
1442 }
1443
1444 // We want all mouse events from this point on
1445 auto &window = GetProjectFrame( *mParent );
1446 if( !window.HasCapture() )
1447 window.CaptureMouse();
1448
1449 // Start monitoring shift key changes
1450 mLastState = wxGetKeyState( WXK_SHIFT );
1451 mTimer.Start( 100 );
1452}
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 1366 of file ToolManager.cpp.

1367{
1368#if defined(__WXGTK__)
1369 mIndicator->SetShape( *mCurrent );
1370#endif
1371 event.Skip();
1372}
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 1349 of file ToolManager.cpp.

1350{
1351 // TODO: Better to use a bitmap than a triangular region.
1352 wxWindow *w = (wxWindow *)event.GetEventObject();
1353 wxPaintDC dc( w );
1354 // TODO: Better (faster) to use the existing spare brush.
1355 wxBrush brush( theTheme.Colour( clrTrackPanelText ) );
1356 dc.SetBackground( brush );
1357 dc.Clear();
1358}
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 1301 of file ToolManager.cpp.

1302{
1304}

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 1097 of file ToolManager.cpp.

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

564{
565 auto &project = context.project;
566 auto &toolManager = ToolManager::Get( project );
567
568 toolManager.Reset();
570}
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 1309 of file ToolManager.cpp.

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

References mDragWindow, mIndicator, mLastState, and mTransition.

◆ operator=()

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

◆ ReadConfig()

void ToolManager::ReadConfig ( )
private

Definition at line 713 of file ToolManager.cpp.

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

680{
681 ForEach([](auto bar){
682 if (bar)
683 bar->RegenerateTooltips();
684 });
685}

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 573 of file ToolManager.cpp.

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

1518{
1519 if (mLastFocus) {
1520 auto temp1 = AButton::TemporarilyAllowFocus();
1521 auto temp2 = ASlider::TemporarilyAllowFocus();
1523 mLastFocus->SetFocus();
1524 return true;
1525 }
1526 return false;
1527}
static TempAllowFocus TemporarilyAllowFocus()
Definition: AButton.cpp:658
static TempAllowFocus TemporarilyAllowFocus()
Definition: ASlider.cpp:1884
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 1053 of file ToolManager.cpp.

1054{
1055 Expose( type, !mBars[type]->IsVisible() );
1056 Updated();
1057}
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 1374 of file ToolManager.cpp.

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

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 1011 of file ToolManager.cpp.

1012{
1013 // Queue an update event
1014 wxCommandEvent e( EVT_TOOLBAR_UPDATED );
1015 GetProjectFrame( *mParent ).GetEventHandler()->AddPendingEvent( e );
1016}

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 926 of file ToolManager.cpp.

927{
928 if( !gPrefs )
929 {
930 return;
931 }
932
933 auto toolbarsGroup = gPrefs->BeginGroup("/GUI/ToolBars");
934
935 // Save state of each bar
936 ForEach([this](ToolBar *bar){
937 // Change to the bar subkey
938 auto sectionGroup = gPrefs->BeginGroup(bar->GetSection().GET());
939
940 // Search both docks for toolbar order
941 bool to = mTopDock->GetConfiguration().Contains( bar );
942 bool bo = mBotDock->GetConfiguration().Contains( bar );
943
944 // Save
945 // Note that DockV2 was introduced in 2.2.2 to fix bug #1554. Dock is retained so that
946 // the toolbar layout is not changed when opening a version before 2.2.2, and in particular
947 // its value is compatible with versions 2.1.3 to 2.2.1 which have this bug.
948 ToolDock* dock = bar->GetDock(); // dock for both shown and hidden toolbars
949 gPrefs->Write( wxT("DockV2"), static_cast<int>(dock == mTopDock ? TopDockID : dock == mBotDock ? BotDockID : NoDockID ));
950
951 gPrefs->Write( wxT("Dock"), static_cast<int>( to ? TopDockID : bo ? BotDockID : NoDockID));
952
953 dock = to ? mTopDock : bo ? mBotDock : nullptr; // dock for shown toolbars
955 (dock ? &dock->GetConfiguration() : nullptr, bar);
956
957 wxPoint pos( -1, -1 );
958 wxSize sz = bar->GetSize();
959 if( !bar->IsDocked() && bar->IsPositioned() )
960 {
961 pos = bar->GetParent()->GetPosition();
962 sz = bar->GetParent()->GetSize();
963 }
964 gPrefs->Write( wxT("X"), pos.x );
965 gPrefs->Write( wxT("Y"), pos.y );
966 gPrefs->Write( wxT("W"), sz.x );
967 gPrefs->Write( wxT("H"), sz.y );
968 });
969 gPrefs->Flush();
970}
@ 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:138
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: