From a679638f249d1c719c45894e7032b099cd72ddee Mon Sep 17 00:00:00 2001
From: qu1ck <anlutsenko@gmail.com>
Date: Thu, 16 Aug 2018 02:12:41 -0700
Subject: [PATCH 2/2] Add icons to action menu items as well

Fix backwards compatibility for plugins that don't define icon
---
 pcbnew/action_plugin.cpp              |  6 ++++++
 pcbnew/action_plugin.h                |  2 ++
 pcbnew/swig/pcbnew_action_plugins.cpp | 20 +++++++++++---------
 scripting/kicadplugins.i              |  4 ++--
 4 files changed, 21 insertions(+), 11 deletions(-)

diff --git a/pcbnew/action_plugin.cpp b/pcbnew/action_plugin.cpp
index e1f0f67..35fb22b 100644
--- a/pcbnew/action_plugin.cpp
+++ b/pcbnew/action_plugin.cpp
@@ -152,6 +152,12 @@ void ACTION_PLUGINS::register_action( ACTION_PLUGIN* aAction )
         }
     }
 
+    // Load icon if supplied
+    if (!aAction->GetIconFileName().IsEmpty())
+    {
+        aAction->iconBitmap.LoadFile( aAction->GetIconFileName() , wxBITMAP_TYPE_PNG );
+    }
+
     m_actionsList.push_back( aAction );
 }
 
diff --git a/pcbnew/action_plugin.h b/pcbnew/action_plugin.h
index 17ff2bb..726e3fe 100644
--- a/pcbnew/action_plugin.h
+++ b/pcbnew/action_plugin.h
@@ -46,6 +46,8 @@ public:
     int m_actionMenuId;
     // Same for button id
     int m_actionButtonId;
+    // Icon for the action button and menu entry
+    wxBitmap iconBitmap;
 
 public:
     ACTION_PLUGIN() : m_actionMenuId( 0 ), m_actionButtonId( 0 ) {}
diff --git a/pcbnew/swig/pcbnew_action_plugins.cpp b/pcbnew/swig/pcbnew_action_plugins.cpp
index c0b320f..b3ecff0 100644
--- a/pcbnew/swig/pcbnew_action_plugins.cpp
+++ b/pcbnew/swig/pcbnew_action_plugins.cpp
@@ -428,19 +428,22 @@ void PCB_EDIT_FRAME::RebuildActionPluginMenus()
     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( hammer_xpm );
 
         if( ii < (int) available_menus.size() )
         {
             item = available_menus[ii];
-            item->SetItemLabel( ACTION_PLUGINS::GetAction( ii )->GetName() );
-            item->SetHelp( ACTION_PLUGINS::GetAction( ii )->GetDescription() );
+            item->SetItemLabel( ap->GetName() );
+            item->SetHelp( ap->GetDescription() );
+            item->SetBitmap( bitmap, false );
         }
         else
         {
             item = AddMenuItem( actionMenu, wxID_ANY,
-                    ACTION_PLUGINS::GetAction( ii )->GetName(),
-                    ACTION_PLUGINS::GetAction( ii )->GetDescription(),
-                    KiBitmap( hammer_xpm ) );
+                    ap->GetName(),
+                    ap->GetDescription(),
+                    bitmap );
 
             Connect( item->GetId(), wxEVT_COMMAND_MENU_SELECTED,
                     (wxObjectEventFunction) (wxEventFunction) (wxCommandEventFunction) &
@@ -456,7 +459,7 @@ void PCB_EDIT_FRAME::AddActionPluginTools()
     bool need_separator = true;
     for( int ii = 0; ii < ACTION_PLUGINS::GetActionsCount(); ii++ )
     {
-        if( !ACTION_PLUGINS::GetAction( ii )->GetIconFileName().IsEmpty() )
+        if( ACTION_PLUGINS::GetAction( ii )->iconBitmap.IsOk() )
         {
             ACTION_PLUGIN* ap = ACTION_PLUGINS::GetAction( ii );
             if ( need_separator )
@@ -465,9 +468,8 @@ void PCB_EDIT_FRAME::AddActionPluginTools()
                 need_separator = false;
             }
             // Add button
-            // This should check if file exists
-            const wxBitmap icon = wxBitmap( ap->GetIconFileName() , wxBITMAP_TYPE_PNG );
-            wxAuiToolBarItem* button = m_mainToolBar->AddTool( wxID_ANY, wxEmptyString, icon, ap->GetName() );
+            wxAuiToolBarItem* button = m_mainToolBar->AddTool(
+                    wxID_ANY, wxEmptyString, ap->iconBitmap, ap->GetName() );
             Connect( button->GetId(), wxEVT_COMMAND_MENU_SELECTED,
                     (wxObjectEventFunction) (wxEventFunction) (wxCommandEventFunction) &
                     PCB_EDIT_FRAME::OnActionPlugin );
diff --git a/scripting/kicadplugins.i b/scripting/kicadplugins.i
index 966f4b8..e1d955e 100644
--- a/scripting/kicadplugins.i
+++ b/scripting/kicadplugins.i
@@ -260,7 +260,7 @@ def LoadPlugins(bundlepath=None):
             if module == '__init__.py' or module[-3:] != '.py':
                 continue
 
-            LoadOnePlugin(plugins_dir, module);
+            LoadOnePlugin(plugins_dir, module)
 
 
 class KiCadPlugin:
@@ -633,13 +633,13 @@ class FootprintWizardPlugin(KiCadPlugin, object):
 class ActionPlugin(KiCadPlugin, object):
     def __init__( self ):
         KiCadPlugin.__init__( self )
+        self.icon_file_name = ""
         self.defaults()
 
     def defaults( self ):
         self.name = "Undefined Action plugin"
         self.category = "Undefined"
         self.description = ""
-        self.icon_file_name = None
 
     def GetName( self ):
         return self.name
-- 
2.7.4

