Fix scaling of action plugin icons.

Fixes https://gitlab.com/kicad/code/kicad/-/issues/22804
This commit is contained in:
Alex Shvartzkop
2026-01-25 20:08:53 +03:00
parent 10553720bf
commit f6c3627e66
@@ -483,15 +483,36 @@ void PCB_EDIT_FRAME::buildActionPluginMenus( ACTION_MENU* actionMenu )
if( !actionMenu ) // Should not occur.
return;
int iconSize = Pgm().GetCommonSettings()->m_Appearance.toolbar_icon_size;
for( int ii = 0; ii < ACTION_PLUGINS::GetActionsCount(); ii++ )
{
wxMenuItem* item;
ACTION_PLUGIN* ap = ACTION_PLUGINS::GetAction( ii );
const wxBitmap& bitmap = ap->iconBitmap.IsOk() ? ap->iconBitmap :
KiBitmap( BITMAPS::puzzle_piece );
item = KIUI::AddMenuItem( actionMenu, wxID_ANY, ap->GetName(), ap->GetDescription(),
bitmap );
wxBitmapBundle bundle;
if( ap->iconBitmap.IsOk() && ap->iconBitmap.GetHeight() > 0 )
{
wxBitmap bmp = ap->iconBitmap;
wxSize size = bmp.GetSize();
double defScale = (double) iconSize / size.GetHeight();
wxSize defSize( iconSize, wxRound( size.GetWidth() * defScale ) );
wxBitmap bmp1 = bmp;
wxBitmapHelpers::Rescale( bmp1, defSize );
wxBitmap bmp2 = bmp;
wxBitmapHelpers::Rescale( bmp2, defSize * 2 );
bundle = wxBitmapBundle::FromBitmaps( bmp1, bmp2 );
}
else
{
bundle = KiBitmapBundleDef( BITMAPS::puzzle_piece, iconSize );
}
item = KIUI::AddMenuItem( actionMenu, wxID_ANY, ap->GetName(), ap->GetDescription(), bundle );
Connect( item->GetId(), wxEVT_COMMAND_MENU_SELECTED,
wxCommandEventHandler( PCB_EDIT_FRAME::OnActionPluginMenu ) );
@@ -503,9 +524,11 @@ void PCB_EDIT_FRAME::buildActionPluginMenus( ACTION_MENU* actionMenu )
void PCB_EDIT_FRAME::addActionPluginTools( ACTION_TOOLBAR* aToolbar )
{
bool need_separator = true;
bool need_separator = true;
const std::vector<LEGACY_OR_API_PLUGIN>& orderedPlugins = GetOrderedActionPlugins();
int iconSize = Pgm().GetCommonSettings()->m_Appearance.toolbar_icon_size;
for( const auto& entry : orderedPlugins )
{
// API plugins are handled by EDA_BASE_FRAME
@@ -523,15 +546,29 @@ void PCB_EDIT_FRAME::addActionPluginTools( ACTION_TOOLBAR* aToolbar )
}
// Add button
wxBitmap bitmap;
wxBitmapBundle bundle;
if ( ap->iconBitmap.IsOk() )
bitmap = KiScaledBitmap( ap->iconBitmap, this );
if( ap->iconBitmap.IsOk() && ap->iconBitmap.GetHeight() > 0 )
{
wxBitmap bmp = ap->iconBitmap;
wxSize size = bmp.GetSize();
double defScale = (double) iconSize / size.GetHeight();
wxSize defSize( iconSize, wxRound( size.GetWidth() * defScale ) );
wxBitmap bmp1 = bmp;
wxBitmapHelpers::Rescale( bmp1, defSize );
wxBitmap bmp2 = bmp;
wxBitmapHelpers::Rescale( bmp2, defSize * 2 );
bundle = wxBitmapBundle::FromBitmaps( bmp1, bmp2 );
}
else
bitmap = KiScaledBitmap( BITMAPS::puzzle_piece, this );
{
bundle = KiBitmapBundleDef( BITMAPS::puzzle_piece, iconSize );
}
wxAuiToolBarItem* button = aToolbar->AddTool( wxID_ANY, wxEmptyString,
bitmap, ap->GetName() );
wxAuiToolBarItem* button = aToolbar->AddTool( wxID_ANY, wxEmptyString, bundle, ap->GetName() );
Connect( button->GetId(), wxEVT_COMMAND_MENU_SELECTED,
wxCommandEventHandler( PCB_EDIT_FRAME::OnActionPluginButton ) );