mirror of
https://github.com/cookiengineer/audacity
synced 2025-08-07 23:51:14 +02:00
More abstract toolbar positioning types, to be generalized later
This commit is contained in:
parent
036c13149b
commit
dd327cd304
@ -48,6 +48,32 @@
|
|||||||
#include "../widgets/AButton.h"
|
#include "../widgets/AButton.h"
|
||||||
#include "../widgets/Grabber.h"
|
#include "../widgets/Grabber.h"
|
||||||
|
|
||||||
|
void ToolBarConfiguration::Insert(ToolBar *bar, Position position)
|
||||||
|
{
|
||||||
|
if (position >= size() || position == UnspecifiedPosition)
|
||||||
|
push_back(bar);
|
||||||
|
else
|
||||||
|
wxArrayPtrVoid::Insert(bar, position);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ToolBarConfiguration::Remove(const ToolBar *bar)
|
||||||
|
{
|
||||||
|
wxArrayPtrVoid::Remove(const_cast<ToolBar*>(bar));
|
||||||
|
}
|
||||||
|
|
||||||
|
void ToolBarConfiguration::Show(ToolBar *bar)
|
||||||
|
{
|
||||||
|
// Do not assume the bar is absent, though in practice that is always so
|
||||||
|
if (!Contains(bar))
|
||||||
|
Insert(bar);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ToolBarConfiguration::Hide(ToolBar *bar)
|
||||||
|
{
|
||||||
|
// Future: might hide a bar without eliminating it from the configuration
|
||||||
|
Remove(bar);
|
||||||
|
}
|
||||||
|
|
||||||
IMPLEMENT_CLASS( ToolDock, wxPanel );
|
IMPLEMENT_CLASS( ToolDock, wxPanel );
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////
|
||||||
@ -95,7 +121,7 @@ ToolDock::~ToolDock()
|
|||||||
//
|
//
|
||||||
int ToolDock::GetOrder( ToolBar *bar )
|
int ToolDock::GetOrder( ToolBar *bar )
|
||||||
{
|
{
|
||||||
int order = mDockedBars.Index( bar );
|
int order = mConfiguration.Index( bar );
|
||||||
|
|
||||||
if( order == wxNOT_FOUND )
|
if( order == wxNOT_FOUND )
|
||||||
{
|
{
|
||||||
@ -115,16 +141,17 @@ int ToolDock::GetOrder( ToolBar *bar )
|
|||||||
//
|
//
|
||||||
void ToolDock::Undock( ToolBar *bar )
|
void ToolDock::Undock( ToolBar *bar )
|
||||||
{
|
{
|
||||||
if( mDockedBars.Index( bar ) != wxNOT_FOUND )
|
if( mConfiguration.Contains( bar ) )
|
||||||
{
|
{
|
||||||
mDockedBars.Remove( bar );
|
mConfiguration.Remove( bar );
|
||||||
|
mBars[ bar->GetId() ] = nullptr;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Handle ToolDock events
|
// Handle ToolDock events
|
||||||
//
|
//
|
||||||
void ToolDock::Dock( ToolBar *bar, bool deflate, int before )
|
void ToolDock::Dock( ToolBar *bar, bool deflate, ToolBarConfiguration::Position position )
|
||||||
{
|
{
|
||||||
// Adopt the toolbar into our family
|
// Adopt the toolbar into our family
|
||||||
bar->Reparent( this );
|
bar->Reparent( this );
|
||||||
@ -139,14 +166,8 @@ void ToolDock::Dock( ToolBar *bar, bool deflate, int before )
|
|||||||
);
|
);
|
||||||
|
|
||||||
// Park the NEW bar in the correct berth
|
// Park the NEW bar in the correct berth
|
||||||
if( before >= 0 && before < (int)mDockedBars.GetCount() )
|
if (!mConfiguration.Contains(bar))
|
||||||
{
|
mConfiguration.Insert( bar, position );
|
||||||
mDockedBars.Insert( bar, before );
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
mDockedBars.Add( bar );
|
|
||||||
}
|
|
||||||
|
|
||||||
// Inform toolbar of change
|
// Inform toolbar of change
|
||||||
bar->SetDocked( this, false );
|
bar->SetDocked( this, false );
|
||||||
@ -165,7 +186,7 @@ void ToolDock::LayoutToolBars()
|
|||||||
|
|
||||||
wxRect stack[ ToolBarCount + 1 ];
|
wxRect stack[ ToolBarCount + 1 ];
|
||||||
int stkcnt = 0;
|
int stkcnt = 0;
|
||||||
int cnt = mDockedBars.GetCount();
|
int cnt = mConfiguration.GetCount();
|
||||||
int width, height;
|
int width, height;
|
||||||
|
|
||||||
// Get size of our parent since we haven't been sized yet
|
// Get size of our parent since we haven't been sized yet
|
||||||
@ -184,7 +205,7 @@ void ToolDock::LayoutToolBars()
|
|||||||
for( int ndx = 0; ndx < cnt; ndx++ )
|
for( int ndx = 0; ndx < cnt; ndx++ )
|
||||||
{
|
{
|
||||||
// Cache toolbar pointer
|
// Cache toolbar pointer
|
||||||
ToolBar *ct = (ToolBar *)mDockedBars[ ndx ];
|
ToolBar *ct = (ToolBar *)mConfiguration[ ndx ];
|
||||||
|
|
||||||
// Get and cache the toolbar sizes
|
// Get and cache the toolbar sizes
|
||||||
wxSize sz = ct->GetSize();
|
wxSize sz = ct->GetSize();
|
||||||
@ -253,16 +274,17 @@ void ToolDock::LayoutToolBars()
|
|||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Determine the location and bar before which a NEW bar would be placed
|
// Determine the position where a NEW bar would be placed
|
||||||
//
|
//
|
||||||
// 'rect' will be the rectangle for the dock marker.
|
// 'rect' will be the rectangle for the dock marker.
|
||||||
int ToolDock::PositionBar( ToolBar *t, const wxPoint & pos, wxRect & rect )
|
ToolBarConfiguration::Position
|
||||||
|
ToolDock::PositionBar( ToolBar *t, const wxPoint & pos, wxRect & rect )
|
||||||
{
|
{
|
||||||
int tindx = -1;
|
auto tindx = ToolBarConfiguration::UnspecifiedPosition;
|
||||||
|
|
||||||
wxRect stack[ ToolBarCount + 1 ];
|
wxRect stack[ ToolBarCount + 1 ];
|
||||||
int stkcnt = 0;
|
int stkcnt = 0;
|
||||||
int cnt = mDockedBars.GetCount();
|
int cnt = mConfiguration.GetCount();
|
||||||
int width, height;
|
int width, height;
|
||||||
|
|
||||||
// Get size of our parent since we haven't been sized yet
|
// Get size of our parent since we haven't been sized yet
|
||||||
@ -296,14 +318,14 @@ int ToolDock::PositionBar( ToolBar *t, const wxPoint & pos, wxRect & rect )
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Cache toolbar pointer
|
// Cache toolbar pointer
|
||||||
ToolBar *ct = (ToolBar *)mDockedBars[ndx];
|
ToolBar *ct = (ToolBar *)mConfiguration[ndx];
|
||||||
|
|
||||||
// Remember current bars' dimensions
|
// Remember current bars ' dimensions
|
||||||
sz = ct->GetSize();
|
sz = ct->GetSize();
|
||||||
|
|
||||||
// Maybe insert the NEW bar if it hasn't already been done
|
// Maybe insert the NEW bar if it hasn't already been done
|
||||||
// and is in the right place.
|
// and is in the right place.
|
||||||
if (tindx == -1)
|
if (tindx == ToolBarConfiguration::UnspecifiedPosition)
|
||||||
{
|
{
|
||||||
wxRect r;
|
wxRect r;
|
||||||
|
|
||||||
@ -351,7 +373,7 @@ int ToolDock::PositionBar( ToolBar *t, const wxPoint & pos, wxRect & rect )
|
|||||||
const auto cpos = stack[stkcnt].GetPosition();
|
const auto cpos = stack[stkcnt].GetPosition();
|
||||||
|
|
||||||
// If we've placed it, we're done.
|
// If we've placed it, we're done.
|
||||||
if (tindx != -1)
|
if (tindx != ToolBarConfiguration::UnspecifiedPosition)
|
||||||
{
|
{
|
||||||
rect.x = cpos.x;
|
rect.x = cpos.x;
|
||||||
rect.y = cpos.y;
|
rect.y = cpos.y;
|
||||||
@ -389,20 +411,11 @@ void ToolDock::Expose( int type, bool show )
|
|||||||
ToolBar *t = mBars[ type ];
|
ToolBar *t = mBars[ type ];
|
||||||
|
|
||||||
// Maintain the docked array
|
// Maintain the docked array
|
||||||
if( show )
|
const auto shown = mConfiguration.Shows( t );
|
||||||
{
|
if( show && !shown )
|
||||||
if( mDockedBars.Index( t ) == wxNOT_FOUND )
|
mConfiguration.Show( t );
|
||||||
{
|
else if( !show && shown )
|
||||||
mDockedBars.Add( t );
|
mConfiguration.Hide( t );
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if( mDockedBars.Index( t ) != wxNOT_FOUND )
|
|
||||||
{
|
|
||||||
mDockedBars.Remove( t );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Make it (dis)appear
|
// Make it (dis)appear
|
||||||
t->Expose( show );
|
t->Expose( show );
|
||||||
@ -412,11 +425,6 @@ void ToolDock::Expose( int type, bool show )
|
|||||||
Updated();
|
Updated();
|
||||||
}
|
}
|
||||||
|
|
||||||
int ToolDock::Find(ToolBar *bar) const
|
|
||||||
{
|
|
||||||
return mDockedBars.Index(bar);
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Queues an EVT_TOOLBAR_UPDATED command event to notify any
|
// Queues an EVT_TOOLBAR_UPDATED command event to notify any
|
||||||
// interested parties of an updated toolbar or dock layout
|
// interested parties of an updated toolbar or dock layout
|
||||||
@ -441,7 +449,7 @@ void ToolDock::OnGrabber( GrabberEvent & event )
|
|||||||
mManager->ProcessEvent( event );
|
mManager->ProcessEvent( event );
|
||||||
|
|
||||||
// We no longer have control
|
// We no longer have control
|
||||||
mDockedBars.Remove( t );
|
mConfiguration.Remove( t );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -489,10 +497,10 @@ void ToolDock::OnPaint( wxPaintEvent & WXUNUSED(event) )
|
|||||||
AColor::Line(dc, 0, 0, 0, sz.GetHeight() );
|
AColor::Line(dc, 0, 0, 0, sz.GetHeight() );
|
||||||
|
|
||||||
// Draw the gap between each bar
|
// Draw the gap between each bar
|
||||||
int ndx, cnt = mDockedBars.GetCount();
|
int ndx, cnt = mConfiguration.GetCount();
|
||||||
for( ndx = 0; ndx < cnt; ndx++ )
|
for( ndx = 0; ndx < cnt; ndx++ )
|
||||||
{
|
{
|
||||||
wxRect r = ( (ToolBar *)mDockedBars[ ndx ] )->GetRect();
|
wxRect r = ( (ToolBar *)mConfiguration[ ndx ] )->GetRect();
|
||||||
|
|
||||||
AColor::Line( dc,
|
AColor::Line( dc,
|
||||||
r.GetLeft(),
|
r.GetLeft(),
|
||||||
@ -505,7 +513,7 @@ void ToolDock::OnPaint( wxPaintEvent & WXUNUSED(event) )
|
|||||||
{
|
{
|
||||||
// ...and for bars that aren't the last in a row, draw an
|
// ...and for bars that aren't the last in a row, draw an
|
||||||
// horizontal gap line
|
// horizontal gap line
|
||||||
if( r.y == ( (ToolBar *)mDockedBars[ ndx + 1 ] )->GetRect().y )
|
if( r.y == ( (ToolBar *)mConfiguration[ ndx + 1 ] )->GetRect().y )
|
||||||
{
|
{
|
||||||
AColor::Line(dc,
|
AColor::Line(dc,
|
||||||
r.GetRight() + 1,
|
r.GetRight() + 1,
|
||||||
|
@ -45,6 +45,37 @@ enum
|
|||||||
DockCount = 2
|
DockCount = 2
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class ToolBarConfiguration : public wxArrayPtrVoid
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
using Position = int;
|
||||||
|
static const Position UnspecifiedPosition = -1;
|
||||||
|
|
||||||
|
Position Find(const ToolBar *bar) const
|
||||||
|
{
|
||||||
|
return Index(const_cast<ToolBar*>(bar));
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Contains(const ToolBar *bar) const
|
||||||
|
{
|
||||||
|
return Find(bar) != UnspecifiedPosition;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Default position inserts at the end
|
||||||
|
void Insert(ToolBar *bar,
|
||||||
|
Position position = UnspecifiedPosition);
|
||||||
|
void Remove(const ToolBar *bar);
|
||||||
|
|
||||||
|
// Future: might allow a state that the configuration remembers
|
||||||
|
// a hidden bar, but for now, it's equivalent to Contains():
|
||||||
|
bool Shows(const ToolBar *bar) const { return Contains(bar); }
|
||||||
|
|
||||||
|
void Show(ToolBar *bar);
|
||||||
|
void Hide(ToolBar *bar);
|
||||||
|
|
||||||
|
private:
|
||||||
|
};
|
||||||
|
|
||||||
class ToolDock final : public wxPanel
|
class ToolDock final : public wxPanel
|
||||||
{
|
{
|
||||||
|
|
||||||
@ -57,11 +88,16 @@ class ToolDock final : public wxPanel
|
|||||||
|
|
||||||
void LayoutToolBars();
|
void LayoutToolBars();
|
||||||
void Expose( int type, bool show );
|
void Expose( int type, bool show );
|
||||||
int Find(ToolBar *bar) const;
|
|
||||||
int GetOrder( ToolBar *bar );
|
int GetOrder( ToolBar *bar );
|
||||||
void Dock( ToolBar *bar, bool deflate, int ndx = -1 );
|
void Dock( ToolBar *bar, bool deflate,
|
||||||
|
ToolBarConfiguration::Position ndx
|
||||||
|
= ToolBarConfiguration::UnspecifiedPosition);
|
||||||
void Undock( ToolBar *bar );
|
void Undock( ToolBar *bar );
|
||||||
int PositionBar( ToolBar *t, const wxPoint & pos, wxRect & rect );
|
ToolBarConfiguration::Position
|
||||||
|
PositionBar( ToolBar *t, const wxPoint & pos, wxRect & rect );
|
||||||
|
|
||||||
|
ToolBarConfiguration &GetConfiguration()
|
||||||
|
{ return mConfiguration; }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
@ -80,7 +116,9 @@ class ToolDock final : public wxPanel
|
|||||||
|
|
||||||
ToolManager *mManager;
|
ToolManager *mManager;
|
||||||
|
|
||||||
wxArrayPtrVoid mDockedBars;
|
// Stores adjacency relations that we want to realize in the dock layout
|
||||||
|
ToolBarConfiguration mConfiguration;
|
||||||
|
|
||||||
ToolBar *mBars[ ToolBarCount ];
|
ToolBar *mBars[ ToolBarCount ];
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
@ -1253,7 +1253,7 @@ void ToolManager::OnGrabber( GrabberEvent & event )
|
|||||||
if (mDragBar->IsDocked()) {
|
if (mDragBar->IsDocked()) {
|
||||||
mPrevDock = dynamic_cast<ToolDock*>(mDragBar->GetParent());
|
mPrevDock = dynamic_cast<ToolDock*>(mDragBar->GetParent());
|
||||||
wxASSERT(mPrevDock);
|
wxASSERT(mPrevDock);
|
||||||
mPrevSlot = mPrevDock->Find(mDragBar);
|
mPrevSlot = mPrevDock->GetConfiguration().Find(mDragBar);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
mPrevPosition = mDragBar->GetParent()->GetPosition();
|
mPrevPosition = mDragBar->GetParent()->GetPosition();
|
||||||
|
@ -91,7 +91,7 @@ class ToolManager final : public wxEvtHandler
|
|||||||
ToolDock *mDragDock;
|
ToolDock *mDragDock;
|
||||||
ToolBar *mDragBar {};
|
ToolBar *mDragBar {};
|
||||||
wxPoint mDragOffset;
|
wxPoint mDragOffset;
|
||||||
int mDragBefore;
|
ToolBarConfiguration::Position mDragBefore {};
|
||||||
|
|
||||||
wxPoint mLastPos;
|
wxPoint mLastPos;
|
||||||
wxRect mBarPos;
|
wxRect mBarPos;
|
||||||
@ -115,7 +115,8 @@ class ToolManager final : public wxEvtHandler
|
|||||||
|
|
||||||
wxPoint mPrevPosition {};
|
wxPoint mPrevPosition {};
|
||||||
ToolDock *mPrevDock {};
|
ToolDock *mPrevDock {};
|
||||||
int mPrevSlot {-1};
|
ToolBarConfiguration::Position mPrevSlot
|
||||||
|
{ ToolBarConfiguration::UnspecifiedPosition };
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user