From 3df50f81849962e4be3e31c154112e3277e23bc5 Mon Sep 17 00:00:00 2001 From: Paul Licameli Date: Fri, 10 Jun 2016 21:26:01 -0400 Subject: [PATCH] Define the default toolbar configuration (as a tree) --- src/toolbars/ToolDock.h | 6 ++++ src/toolbars/ToolManager.cpp | 53 ++++++++++++++++++++++++++++++++---- 2 files changed, 54 insertions(+), 5 deletions(-) diff --git a/src/toolbars/ToolDock.h b/src/toolbars/ToolDock.h index d86864a9d..0ae05c4f6 100644 --- a/src/toolbars/ToolDock.h +++ b/src/toolbars/ToolDock.h @@ -53,11 +53,17 @@ class ToolBarConfiguration using Forest = std::vector; public: + void Swap(ToolBarConfiguration &that) { mForest.swap(that.mForest); } + void Clear() + { + mForest.clear(); + } + struct Position { ToolBar *rightOf {}; ToolBar *below {}; diff --git a/src/toolbars/ToolManager.cpp b/src/toolbars/ToolManager.cpp index bb38712dc..fbf7361a3 100644 --- a/src/toolbars/ToolManager.cpp +++ b/src/toolbars/ToolManager.cpp @@ -498,16 +498,59 @@ ToolManager::~ToolManager() delete mDown; } +// This table describes the default configuration of the toolbars as +// a "tree" and must be kept in pre-order traversal. + +// In fact this tree is more of a broom -- nothing properly branches except +// at the root. + +// "Root" corresponds to left edge of the main window, and successive siblings +// go from top to bottom. But in practice layout may wrap this abstract +// configuration if the window size is narrow. + +static struct DefaultConfigEntry { + int barID; + int rightOf; // parent + int below; // preceding sibling +} DefaultConfigTable [] = { + // Top dock row, may wrap + { TransportBarID, NoBarID, NoBarID }, + { ToolsBarID, TransportBarID, NoBarID }, + { RecordMeterBarID, ToolsBarID, NoBarID }, + { PlayMeterBarID, RecordMeterBarID, NoBarID }, + { MixerBarID, PlayMeterBarID, NoBarID }, + { EditBarID, MixerBarID, NoBarID }, + { TranscriptionBarID, EditBarID, NoBarID }, + + // start another top dock row + { ScrubbingBarID, NoBarID, TransportBarID }, + { DeviceBarID, ScrubbingBarID, NoBarID }, + + // Hidden by default in top dock + { MeterBarID, NoBarID, NoBarID }, + + // Bottom dock + { SelectionBarID, NoBarID, NoBarID }, + + // Hidden by default in bottom dock + { SpectralSelectionBarID, NoBarID, NoBarID }, +}; + void ToolManager::Reset() { - int ndx; - // Disconnect all docked bars - for( ndx = 0; ndx < ToolBarCount; ndx++ ) + for ( const auto &entry : DefaultConfigTable ) { + int ndx = entry.barID; + ToolBar *bar = mBars[ ndx ]; + + ToolBarConfiguration::Position position { + (entry.rightOf == NoBarID) ? nullptr : mBars[ entry.rightOf ], + (entry.below == NoBarID) ? nullptr : mBars[ entry.below ] + }; + wxWindow *floater; ToolDock *dock; - ToolBar *bar = mBars[ ndx ]; bool expose = true; // Disconnect the bar @@ -558,7 +601,7 @@ void ToolManager::Reset() if( dock != NULL ) { // when we dock, we reparent, so bar is no longer a child of floater. - dock->Dock( bar, false ); + dock->Dock( bar, false, position ); Expose( ndx, expose ); //OK (and good) to DELETE floater, as bar is no longer in it. if( floater )