Make the toolbar palettes open at a right angle to the toolbar

This opening is easier when using the drag-to-open system.
This commit is contained in:
Ian McInerney 2020-09-27 23:19:03 +01:00
parent 6dfe7b6eb0
commit 4ec46dabf8
1 changed files with 56 additions and 41 deletions

View File

@ -566,16 +566,68 @@ void ACTION_TOOLBAR::popupPalette( wxAuiToolBarItem* aItem )
ACTION_GROUP* group = it->second;
m_palette = new ACTION_TOOLBAR_PALETTE( parent, true );
wxAuiPaneInfo& pane = m_auiManager->GetPane( this );
// We use the size of the toolbar items for our palette buttons
wxRect toolRect = GetToolRect( aItem->GetId() );
// The position for the palette window must be in screen coordinates
wxPoint pos( ClientToScreen( toolRect.GetPosition() ) );
// True for vertical buttons, false for horizontal
bool dir = true;
size_t numActions = group->m_actions.size();
// The size of the palette in the long dimension
int paletteLongDim = ( 2 * PALETTE_BORDER ) // The border on all sides of the buttons
+ ( BUTTON_BORDER ) // The border on the start of the buttons
+ ( numActions * BUTTON_BORDER ) // The other button borders
+ ( numActions * toolRect.GetHeight() ); // The size of the buttons
// Determine the position of the top left corner of the palette window
switch( pane.dock_direction )
{
case wxAUI_DOCK_TOP:
// Top toolbars need to shift the palette window down by the toolbar padding
dir = true; // Buttons are vertical in the palette
pos = ClientToScreen( toolRect.GetBottomLeft() );
pos += wxPoint( -PALETTE_BORDER, // Shift left to align the button edges
m_bottomPadding ); // Shift down to move away from the toolbar
break;
case wxAUI_DOCK_BOTTOM:
// Bottom toolbars need to shift the palette window up by its height (all buttons + border + toolbar padding)
dir = true; // Buttons are vertical in the palette
pos = ClientToScreen( toolRect.GetTopLeft() );
pos += wxPoint( -PALETTE_BORDER, // Shift left to align the button
-( paletteLongDim + m_topPadding ) ); // Shift up by the entire length of the palette
break;
case wxAUI_DOCK_LEFT:
// Left toolbars need to shift the palette window up by the toolbar padding
dir = false; // Buttons are horizontal in the palette
pos = ClientToScreen( toolRect.GetTopRight() );
pos += wxPoint( m_rightPadding, // Shift right to move away from the toolbar
-( PALETTE_BORDER + BUTTON_BORDER ) ); // Shift up to align the button tops
break;
case wxAUI_DOCK_RIGHT:
// Right toolbars need to shift the palette window left by its width (all buttons + border + toolbar padding)
dir = false; // Buttons are horizontal in the palette
pos = ClientToScreen( toolRect.GetTopLeft() );
pos += wxPoint( -( paletteLongDim + m_leftPadding ), // Shift left by the entire length of the palette
-( PALETTE_BORDER + BUTTON_BORDER ) ); // Shift up to align the button
break;
}
m_palette = new ACTION_TOOLBAR_PALETTE( parent, dir );
// We handle the button events in the toolbar class, so connect the right handler
m_palette->SetGroup( group );
m_palette->SetButtonSize( toolRect );
m_palette->Connect( wxEVT_BUTTON, wxCommandEventHandler( ACTION_TOOLBAR::onPaletteEvent ),
NULL, this );
// This button size is used for all buttons on the palette
wxRect toolRect = GetToolRect( aItem->GetId() );
m_palette->SetButtonSize( toolRect );
// Add the actions in the group to the palette and update their state
for( const TOOL_ACTION* action : group->m_actions )
@ -593,43 +645,6 @@ void ACTION_TOOLBAR::popupPalette( wxAuiToolBarItem* aItem )
m_palette->EnableAction( *action, evt.GetEnabled() );
}
wxAuiPaneInfo& pane = m_auiManager->GetPane( this );
// The position for the palette window must be in screen coordinates
wxPoint pos( ClientToScreen( toolRect.GetPosition() ) );
// Determine the position of the top left corner of the palette window
switch( pane.dock_direction )
{
case wxAUI_DOCK_TOP:
// Top toolbars need to shift the palette window down by the toolbar padding
pos = ClientToScreen( toolRect.GetBottomLeft() );
pos += wxPoint( -( PALETTE_BORDER + BUTTON_BORDER ), // Shift left to align the button
GetToolBorderPadding() ); // Shift down to move away from the toolbar
break;
case wxAUI_DOCK_BOTTOM:
// Bottom toolbars need to shift the palette window up by its height (1 button + border + toolbar padding)
pos = ClientToScreen( toolRect.GetTopLeft() );
pos -= wxPoint( ( PALETTE_BORDER + BUTTON_BORDER ), // Shift left to align the button
2*PALETTE_BORDER + toolRect.GetHeight() + GetToolBorderPadding() );
break;
case wxAUI_DOCK_LEFT:
// Left toolbars need to shift the palette window up by the toolbar padding
pos = ClientToScreen( toolRect.GetTopRight() );
pos += wxPoint( GetToolBorderPadding(), // Shift right to move away from the toolbar
-( PALETTE_BORDER + BUTTON_BORDER ) ); // Shift up to align the button
break;
case wxAUI_DOCK_RIGHT:
// Right toolbars need to shift the palette window left by its width (1 button + border + toolbar padding)
pos = ClientToScreen( toolRect.GetTopLeft() );
pos -= wxPoint( 2*PALETTE_BORDER + toolRect.GetHeight() + GetToolBorderPadding(),
( PALETTE_BORDER + BUTTON_BORDER ) ); // Shift up to align the button
break;
}
m_palette->SetPosition( pos );
m_palette->Popup();
}