From 13cd170f5a77d39c214a092141ed1f83d1e73e25 Mon Sep 17 00:00:00 2001 From: Dhinesh Date: Mon, 25 Nov 2024 23:29:43 +0530 Subject: [PATCH] Add options for startup key handling Implements resetting default settings on startup. Fixes https://gitlab.com/kicad/code/kicad/-/issues/7273 --- common/CMakeLists.txt | 1 + common/startup_key_handler.cpp | 120 +++++++++++++++++++++++++++++++++ include/startup_key_handler.h | 63 +++++++++++++++++ kicad/kicad.cpp | 5 ++ 4 files changed, 189 insertions(+) create mode 100644 common/startup_key_handler.cpp create mode 100644 include/startup_key_handler.h diff --git a/common/CMakeLists.txt b/common/CMakeLists.txt index 1d5bf654d7..ab57ce5e0a 100644 --- a/common/CMakeLists.txt +++ b/common/CMakeLists.txt @@ -190,6 +190,7 @@ set( KICOMMON_SRCS trace_helpers.cpp wildcards_and_files_ext.cpp wx_filename.cpp + startup_key_handler.cpp pgm_base.cpp diff --git a/common/startup_key_handler.cpp b/common/startup_key_handler.cpp new file mode 100644 index 0000000000..611086f381 --- /dev/null +++ b/common/startup_key_handler.cpp @@ -0,0 +1,120 @@ +/* + * This program source code file is part of KiCad, a free EDA CAD application. + * + * Copyright The KiCad Developers, see AUTHORS.txt for contributors. + * + * This program is free software: you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see . + */ + +#include + +#include +#include +#include +#include +#include + + +StartupKeyHandler::StartupKeyHandler() +{ + //Setup Keys and required actions to perform + m_keyActions[{ WXK_CONTROL }] = { KEY_ACTION::RESET_TO_FACTORY_DEFAULTS }; +} + + +StartupKeyHandler::~StartupKeyHandler() +{ + m_keyActions.clear(); +} + + +void StartupKeyHandler::CheckStartupKeys() +{ + for( const auto& [keySequence, actions] : m_keyActions ) + { + // We can request multiple combinations of modifying keys + if( std::all_of( keySequence.begin(), keySequence.end(), + []( wxKeyCode keyCode ) + { + return isKeyActionRequested( keyCode ); + } ) ) + { + performKeyActions( actions ); + } + } +} + + +bool StartupKeyHandler::isKeyActionRequested( wxKeyCode aKeyCode ) +{ + return wxGetKeyState( aKeyCode ); +} + + +void StartupKeyHandler::performKeyActions( const std::vector& aActions ) +{ + for( const KEY_ACTION& action : aActions ) + { + switch( action ) + { + case KEY_ACTION::RESET_TO_FACTORY_DEFAULTS: + resetToFactoryDefaults(); + break; + + default: break; + } + } +} + + +void StartupKeyHandler::resetToFactoryDefaults() +{ + wxString errors; + + if( IsOK( nullptr, _( "Reset settings to default?" ) ) ) + { + wxString sourcePath = PATHS::GetUserSettingsPath(); + wxString destPath = sourcePath + ".backup"; + + // Remove existing backup if exists + if( !RmDirRecursive( destPath, &errors ) ) + { + if( !errors.empty() ) + { + DisplayErrorMessage( nullptr, errors ); + return; + } + } + + // Create backup before deleting + if( !CopyDirectory( sourcePath, destPath, errors ) ) + { + if( !errors.empty() ) + { + DisplayErrorMessage( nullptr, errors ); + return; + } + } + + //delete + if( !RmDirRecursive( sourcePath, &errors ) ) + { + if( !errors.empty() ) + { + DisplayErrorMessage( nullptr, errors ); + return; + } + } + } +} \ No newline at end of file diff --git a/include/startup_key_handler.h b/include/startup_key_handler.h new file mode 100644 index 0000000000..0d13dde6f0 --- /dev/null +++ b/include/startup_key_handler.h @@ -0,0 +1,63 @@ +/* + * This program source code file is part of KiCad, a free EDA CAD application. + * + * Copyright The KiCad Developers, see AUTHORS.txt for contributors. + * + * This program is free software: you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see . + */ + +#ifndef STARTUP_KEY_HANDLER_H +#define STARTUP_KEY_HANDLER_H + +#include +#include +#include +#include + + +// A class to handle key press detection and execute multiple actions at startup +class KICOMMON_API StartupKeyHandler +{ +public: + // Enum to define actions for key presses + enum class KEY_ACTION + { + RESET_TO_FACTORY_DEFAULTS + }; + + // Constructor to initialize key-action mappings + StartupKeyHandler(); + + ~StartupKeyHandler(); + + // Function to handle the startup key check + void CheckStartupKeys(); + +private: + // Function to check if a ctrl key is pressed + static bool isKeyActionRequested( wxKeyCode aKeyCode ); + + // Function to perform actions if ctrl key pressed + void performKeyActions( const std::vector& aActions ); + + // Resets all user-configurable settings to their original factory default values. + // This operation will erase any customized settings or preferences. + void resetToFactoryDefaults(); + +private: + // A map to store the combination of keys and their corresponding list of actions + std::map, std::vector> m_keyActions; +}; + +#endif // STARTUP_KEY_HANDLER_H diff --git a/kicad/kicad.cpp b/kicad/kicad.cpp index ae0a4fa1d3..c79dfdc2fb 100644 --- a/kicad/kicad.cpp +++ b/kicad/kicad.cpp @@ -62,6 +62,8 @@ #include #endif +#include "startup_key_handler.h" + // a dummy to quiet linking with EDA_BASE_FRAME::config(); #include KIFACE_BASE& Kiface() @@ -85,6 +87,9 @@ PGM_KICAD& PgmTop() bool PGM_KICAD::OnPgmInit() { + StartupKeyHandler keyHandler; + keyHandler.CheckStartupKeys(); + App().SetAppDisplayName( wxT( "KiCad" ) ); #if defined(DEBUG)