Change action plugin settings storage to preserve hidden buttons

This commit is contained in:
Jon Evans 2020-02-20 10:59:45 -05:00
parent 4f555e7794
commit 1a216f3703
6 changed files with 63 additions and 45 deletions

View File

@ -144,17 +144,27 @@ public:
try try
{ {
val = aSettings->Get<ValueType>( m_path ); if( std::is_same<ValueType, nlohmann::json>::value )
val = aSettings->GetJson( m_path );
else
val = aSettings->Get<ValueType>( m_path );
} }
catch( ... ) catch( ... )
{} {
}
m_setter( val ); m_setter( val );
} }
void Store( JSON_SETTINGS* aSettings) const override void Store( JSON_SETTINGS* aSettings) const override
{ {
aSettings->Set<ValueType>( m_path, m_getter() ); try
{
aSettings->Set<ValueType>( m_path, m_getter() );
}
catch( ... )
{
}
} }
ValueType GetDefault() const ValueType GetDefault() const

View File

@ -18,7 +18,9 @@
* with this program. If not, see <http://www.gnu.org/licenses/>. * with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
#include <kiface_i.h>
#include <pcb_edit_frame.h> #include <pcb_edit_frame.h>
#include <pcbnew_settings.h>
#include <panel_pcbnew_action_plugins.h> #include <panel_pcbnew_action_plugins.h>
#include <widgets/paged_dialog.h> #include <widgets/paged_dialog.h>
#include <widgets/grid_icon_text_helpers.h> #include <widgets/grid_icon_text_helpers.h>
@ -136,17 +138,15 @@ void PANEL_PCBNEW_ACTION_PLUGINS::OnReloadButtonClick( wxCommandEvent& event )
bool PANEL_PCBNEW_ACTION_PLUGINS::TransferDataFromWindow() bool PANEL_PCBNEW_ACTION_PLUGINS::TransferDataFromWindow()
{ {
std::vector<wxString> pluginSettings; auto settings = dynamic_cast<PCBNEW_SETTINGS*>( Kiface().KifaceSettings() );
wxASSERT( settings );
pluginSettings.reserve( m_grid->GetNumberRows() ); settings->m_VisibleActionPlugins.clear();
for( int ii = 0; ii < m_grid->GetNumberRows(); ii++ ) for( int ii = 0; ii < m_grid->GetNumberRows(); ii++ )
{ settings->m_VisibleActionPlugins.emplace_back( std::make_pair(
if( m_grid->GetCellValue( ii, COLUMN_VISIBLE ) == wxT( "1" ) ) m_grid->GetCellValue( ii, COLUMN_PATH ),
pluginSettings.emplace_back( m_grid->GetCellValue( ii, COLUMN_PATH ) ); m_grid->GetCellValue( ii, COLUMN_VISIBLE ) == wxT( "1" ) ) );
}
m_frame->SetActionPluginSettings( pluginSettings );
return true; return true;
} }

View File

@ -369,17 +369,6 @@ public:
#if defined(KICAD_SCRIPTING) && defined(KICAD_SCRIPTING_ACTION_MENU) #if defined(KICAD_SCRIPTING) && defined(KICAD_SCRIPTING_ACTION_MENU)
/**
* Set a set of plugins that have visible buttons on toolbar
* Plugins are identified by their module path
*/
void SetActionPluginSettings( const std::vector<wxString>& aPluginsWithButtons );
/**
* Get a set of plugins that have visible buttons on toolbar
*/
std::vector<wxString> GetActionPluginSettings();
/** /**
* Function GetActionPluginButtonVisible * Function GetActionPluginButtonVisible
* Returns true if button visibility action plugin setting was set to true * Returns true if button visibility action plugin setting was set to true

View File

@ -352,7 +352,33 @@ PCBNEW_SETTINGS::PCBNEW_SETTINGS() : APP_SETTINGS_BASE( "pcbnew", pcbnewSchemaVe
#if defined(KICAD_SCRIPTING) && defined(KICAD_SCRIPTING_ACTION_MENU) #if defined(KICAD_SCRIPTING) && defined(KICAD_SCRIPTING_ACTION_MENU)
m_params.emplace_back( m_params.emplace_back(
new PARAM_LIST<wxString>( "action_plugins.visible", &m_VisibleActionPlugins, {} ) ); new PARAM_LAMBDA<nlohmann::json>( "action_plugins", [&]() -> nlohmann::json {
nlohmann::json js = nlohmann::json::array();
for( const auto& pair : m_VisibleActionPlugins )
js.push_back( nlohmann::json( { { pair.first.ToUTF8(), pair.second } } ) );
return js;
}, [&]( const nlohmann::json& aObj ) {
m_VisibleActionPlugins.clear();
if( !aObj.is_array() )
{
return;
}
for( const auto& entry : aObj )
{
if( entry.empty() || !entry.is_object() )
continue;
for( const auto& pair : entry.items() )
{
m_VisibleActionPlugins.emplace_back( std::make_pair(
wxString( pair.key().c_str(), wxConvUTF8 ), pair.value() ) );
}
}
}, nlohmann::json::array() ) );
#endif #endif
addParamsForWindow( &m_FootprintViewer, "footprint_viewer" ); addParamsForWindow( &m_FootprintViewer, "footprint_viewer" );
@ -476,6 +502,7 @@ bool PCBNEW_SETTINGS::MigrateFromLegacy( wxConfigBase* aCfg )
while( pluginSettingsTokenizer.HasMoreTokens() ) while( pluginSettingsTokenizer.HasMoreTokens() )
{ {
nlohmann::json row;
wxString plugin = pluginSettingsTokenizer.GetNextToken(); wxString plugin = pluginSettingsTokenizer.GetNextToken();
wxStringTokenizer pluginTokenizer = wxStringTokenizer( plugin, "=" ); wxStringTokenizer pluginTokenizer = wxStringTokenizer( plugin, "=" );
@ -485,14 +512,14 @@ bool PCBNEW_SETTINGS::MigrateFromLegacy( wxConfigBase* aCfg )
continue; continue;
} }
plugin = pluginTokenizer.GetNextToken(); std::string key( pluginTokenizer.GetNextToken().ToUTF8() );
if( pluginTokenizer.GetNextToken().Cmp( wxT( "Visible" ) ) == 0 ) js.push_back( nlohmann::json( {
js.push_back( plugin.ToUTF8() ); { key, pluginTokenizer.GetNextToken().Cmp( wxT( "Visible" ) ) == 0 } } ) );
} }
} }
( *this )[PointerFromString( "action_plugins.visible" ) ] = js; ( *this )[PointerFromString( "action_plugins" ) ] = js;
} }
ret &= fromLegacy<int>( aCfg, "VrmlExportUnit", "export_vrml.units" ); ret &= fromLegacy<int>( aCfg, "VrmlExportUnit", "export_vrml.units" );

View File

@ -36,6 +36,10 @@ enum class MAGNETIC_OPTIONS
CAPTURE_ALWAYS CAPTURE_ALWAYS
}; };
#if defined(KICAD_SCRIPTING) && defined(KICAD_SCRIPTING_ACTION_MENU)
typedef std::vector<std::pair<wxString, bool>> ACTION_PLUGIN_SETTINGS_LIST;
#endif
class PCBNEW_SETTINGS : public APP_SETTINGS_BASE class PCBNEW_SETTINGS : public APP_SETTINGS_BASE
{ {
@ -257,7 +261,7 @@ public:
PNS::ROUTING_SETTINGS* m_PnsSettings; PNS::ROUTING_SETTINGS* m_PnsSettings;
#if defined(KICAD_SCRIPTING) && defined(KICAD_SCRIPTING_ACTION_MENU) #if defined(KICAD_SCRIPTING) && defined(KICAD_SCRIPTING_ACTION_MENU)
std::vector<wxString> m_VisibleActionPlugins; ACTION_PLUGIN_SETTINGS_LIST m_VisibleActionPlugins;
#endif #endif
protected: protected:

View File

@ -423,18 +423,6 @@ void PCB_EDIT_FRAME::AddActionPluginTools()
} }
void PCB_EDIT_FRAME::SetActionPluginSettings( const std::vector<wxString>& aPluginSettings )
{
m_Settings->m_VisibleActionPlugins = aPluginSettings;
}
std::vector<wxString> PCB_EDIT_FRAME::GetActionPluginSettings()
{
return m_Settings->m_VisibleActionPlugins;
}
std::vector<ACTION_PLUGIN*> PCB_EDIT_FRAME::GetOrderedActionPlugins() std::vector<ACTION_PLUGIN*> PCB_EDIT_FRAME::GetOrderedActionPlugins()
{ {
std::vector<ACTION_PLUGIN*> plugins; std::vector<ACTION_PLUGIN*> plugins;
@ -444,12 +432,12 @@ std::vector<ACTION_PLUGIN*> PCB_EDIT_FRAME::GetOrderedActionPlugins()
plugins.push_back( ACTION_PLUGINS::GetAction( i ) ); plugins.push_back( ACTION_PLUGINS::GetAction( i ) );
// First add plugins that have entries in settings // First add plugins that have entries in settings
for( auto visble_plugin : GetActionPluginSettings() ) for( const auto& pair : m_Settings->m_VisibleActionPlugins )
{ {
auto loc = std::find_if( plugins.begin(), plugins.end(), auto loc = std::find_if( plugins.begin(), plugins.end(),
[visble_plugin] ( ACTION_PLUGIN* plugin ) [pair] ( ACTION_PLUGIN* plugin )
{ {
return plugin->GetPluginPath().ToStdString() == visble_plugin; return plugin->GetPluginPath() == pair.first;
} ); } );
if( loc != plugins.end() ) if( loc != plugins.end() )
@ -473,8 +461,8 @@ bool PCB_EDIT_FRAME::GetActionPluginButtonVisible( const wxString& aPluginPath,
for( const auto& entry : settings ) for( const auto& entry : settings )
{ {
if( entry == aPluginPath.ToStdString() ) if( entry.first == aPluginPath )
return true; return entry.second;
} }
// Plugin is not in settings, return default. // Plugin is not in settings, return default.