KiCad PCB EDA Suite
HOTKEY_STORE Class Reference

A class that contains a set of hotkeys, arranged into "sections" and provides some book-keeping functions for them. More...

#include <hotkey_store.h>

Public Member Functions

 HOTKEY_STORE ()
 Construct a HOTKEY_STORE from a list of hotkey sections. More...
 
void Init (std::vector< TOOL_MANAGER * > aToolManagerList, bool aIncludeReadOnlyCmds)
 
std::vector< HOTKEY_SECTION > & GetSections ()
 Get the list of sections managed by this store. More...
 
void SaveAllHotkeys ()
 Persist all changes to hotkeys in the store to the underlying data structures. More...
 
void ResetAllHotkeysToDefault ()
 Reset every hotkey in the store to the default values. More...
 
void ResetAllHotkeysToOriginal ()
 Resets every hotkey to the original values. More...
 
bool CheckKeyConflicts (TOOL_ACTION *aAction, long aKey, HOTKEY **aConflict)
 Check whether the given key conflicts with anything in this store. More...
 

Static Public Member Functions

static wxString GetAppName (TOOL_ACTION *aAction)
 
static wxString GetSectionName (TOOL_ACTION *aAction)
 

Private Attributes

std::vector< TOOL_MANAGER * > m_toolManagers
 
std::vector< HOTKEY_SECTIONm_hk_sections
 

Detailed Description

A class that contains a set of hotkeys, arranged into "sections" and provides some book-keeping functions for them.

Definition at line 62 of file hotkey_store.h.

Constructor & Destructor Documentation

◆ HOTKEY_STORE()

HOTKEY_STORE::HOTKEY_STORE ( )

Construct a HOTKEY_STORE from a list of hotkey sections.

Parameters
aHotkeysthe hotkey configs that will be managed by this store.

Definition at line 88 of file hotkey_store.cpp.

89 {
90 }

Member Function Documentation

◆ CheckKeyConflicts()

bool HOTKEY_STORE::CheckKeyConflicts ( TOOL_ACTION aAction,
long  aKey,
HOTKEY **  aConflict 
)

Check whether the given key conflicts with anything in this store.

Parameters
aAction- the action the key is proposed to be assigned to. Only conflicts within the same section will be flagged.
aKey- key to check
aConflict- outparam getting the section this one conflicts with

Definition at line 203 of file hotkey_store.cpp.

204 {
205  wxString sectionName = GetSectionName( aAction );
206 
207  // Create a fake "TOOL_ACTION" so we can get the section name for "Common" through the API.
208  // Simply declaring a wxString with the value "Common" works, but the goal is to futureproof
209  // the code here as much as possible.
210  TOOL_ACTION commonAction( "common.Control.Fake", AS_GLOBAL, 0, "", "", "" );
211  wxString commonName = GetSectionName( &commonAction );
212 
213  for( HOTKEY_SECTION& section : m_hk_sections )
214  {
215  // We can have the same hotkey in multiple sections (i.e. Kicad programs), but if a hotkey
216  // is in "Common" it can't be in any other section and vice versa.
217 
218  if( !( section.m_SectionName == sectionName || section.m_SectionName == commonName ) )
219  continue;
220 
221  for( HOTKEY& hotkey : section.m_HotKeys )
222  {
223  if( hotkey.m_Actions[0] == aAction )
224  continue;
225 
226  if( hotkey.m_EditKeycode == aKey )
227  {
228  // We can use the same key for a different action if both actions are contextual and
229  // for different tools.
230  if( hotkey.m_Actions[0]->GetScope() == AS_CONTEXT &&
231  aAction->GetScope() == AS_CONTEXT &&
232  hotkey.m_Actions[0]->GetToolName() != aAction->GetToolName() )
233  {
234  continue;
235  }
236 
237  *aConflict = &hotkey;
238  return true;
239  }
240  }
241  }
242 
243  return false;
244 }
TOOL_ACTION_SCOPE GetScope() const
Definition: tool_action.h:147
Action belongs to a particular tool (i.e. a part of a pop-up menu)
std::string GetToolName() const
Return name of the tool associated with the action.
std::vector< TOOL_ACTION * > m_Actions
Definition: hotkey_store.h:36
Global action (toolbar/main menu event, global shortcut)
std::vector< HOTKEY_SECTION > m_hk_sections
Definition: hotkey_store.h:111
Represent a single user action.
Definition: tool_action.h:67
int m_EditKeycode
Definition: hotkey_store.h:37
static wxString GetSectionName(TOOL_ACTION *aAction)

References AS_CONTEXT, AS_GLOBAL, TOOL_ACTION::GetScope(), GetSectionName(), TOOL_ACTION::GetToolName(), HOTKEY::m_Actions, HOTKEY::m_EditKeycode, and m_hk_sections.

Referenced by WIDGET_HOTKEY_LIST::resolveKeyConflicts().

◆ GetAppName()

wxString HOTKEY_STORE::GetAppName ( TOOL_ACTION aAction)
static

Definition at line 61 of file hotkey_store.cpp.

62 {
63  wxString name( aAction->GetName() );
64  return name.BeforeFirst( '.' );
65 }
const char * name
Definition: DXF_plotter.cpp:56
const std::string & GetName() const
Return name of the action.
Definition: tool_action.h:101

References TOOL_ACTION::GetName(), and name.

Referenced by GetSectionName(), and Init().

◆ GetSectionName()

wxString HOTKEY_STORE::GetSectionName ( TOOL_ACTION aAction)
static

Definition at line 68 of file hotkey_store.cpp.

69 {
70  std::map<wxString, wxString> s_AppNames = {
71  { wxT( "common" ), _( "Common" ) },
72  { wxT( "kicad" ), _( "Project Manager" ) },
73  { wxT( "eeschema" ), _( "Schematic Editor" ) },
74  { wxT( "pcbnew" ), _( "PCB Editor" ) },
75  { wxT( "plEditor" ), _( "Drawing Sheet Editor" ), },
76  { wxT( "3DViewer" ), _( "3D Viewer" ) }
77  };
78 
79  wxString appName = GetAppName( aAction );
80 
81  if( s_AppNames.count( appName ) )
82  return s_AppNames[ appName ];
83  else
84  return appName;
85 }
static wxString GetAppName(TOOL_ACTION *aAction)
#define _(s)

References _, and GetAppName().

Referenced by CheckKeyConflicts(), Init(), and WIDGET_HOTKEY_LIST::resolveKeyConflicts().

◆ GetSections()

std::vector< HOTKEY_SECTION > & HOTKEY_STORE::GetSections ( )

Get the list of sections managed by this store.

Definition at line 164 of file hotkey_store.cpp.

165 {
166  return m_hk_sections;
167 }
std::vector< HOTKEY_SECTION > m_hk_sections
Definition: hotkey_store.h:111

References m_hk_sections.

Referenced by PANEL_HOTKEYS_EDITOR::dumpHotkeys(), PANEL_HOTKEYS_EDITOR::ImportHotKeys(), and WIDGET_HOTKEY_LIST::updateShownItems().

◆ Init()

void HOTKEY_STORE::Init ( std::vector< TOOL_MANAGER * >  aToolManagerList,
bool  aIncludeReadOnlyCmds 
)

Definition at line 93 of file hotkey_store.cpp.

94 {
95  m_toolManagers = std::move( aToolManagerList );
96 
97  // Collect all action maps into a single master map. This will re-group everything
98  // and collect duplicates together
99  std::map<std::string, HOTKEY> masterMap;
100 
101  for( TOOL_MANAGER* toolMgr : m_toolManagers )
102  {
103  for( const std::pair<const std::string, TOOL_ACTION*>& entry : toolMgr->GetActions() )
104  {
105  // Internal actions probably shouldn't be allowed hotkeys
106  if( entry.second->GetLabel().IsEmpty() )
107  continue;
108 
110  {
111  if( entry.second->GetName() == "pcbnew.Control.zoneDisplayOutlines"
112  || entry.second->GetName() == "pcbnew.Control.zoneDisplayTesselation" )
113  {
114  continue;
115  }
116  }
117 
118  HOTKEY& hotkey = masterMap[ entry.first ];
119  hotkey.m_Actions.push_back( entry.second );
120  hotkey.m_EditKeycode = entry.second->GetHotKey();
121  }
122  }
123 
124  wxString currentApp;
125  HOTKEY_SECTION* currentSection = nullptr;
126 
127  // If a previous list was built, ensure this previous list is cleared:
128  m_hk_sections.clear();
129 
130  for( const std::pair<const std::string, HOTKEY>& entry : masterMap )
131  {
132  TOOL_ACTION* entryAction = entry.second.m_Actions[ 0 ];
133  wxString entryApp = GetAppName( entryAction );
134 
135  if( !currentSection || entryApp != currentApp )
136  {
137  m_hk_sections.emplace_back( HOTKEY_SECTION() );
138  currentApp = entryApp;
139  currentSection = &m_hk_sections.back();
140  currentSection->m_SectionName = GetSectionName( entryAction );
141 
142  if( aIncludeReadOnlyCmds && currentApp == "common" )
143  {
144  for( TOOL_ACTION* command : g_standardPlatformCommands )
145  currentSection->m_HotKeys.emplace_back( HOTKEY( command ) );
146  }
147  }
148 
149  currentSection->m_HotKeys.emplace_back( HOTKEY( entry.second ) );
150  }
151 
152  if( aIncludeReadOnlyCmds )
153  {
154  m_hk_sections.emplace_back( HOTKEY_SECTION() );
155  currentSection = &m_hk_sections.back();
156  currentSection->m_SectionName = _( "Gestures" );
157 
158  for( TOOL_ACTION* gesture : g_gesturePseudoActions )
159  currentSection->m_HotKeys.emplace_back( HOTKEY( gesture ) );
160  }
161 }
std::vector< HOTKEY > m_HotKeys
Definition: hotkey_store.h:54
Master controller class:
Definition: tool_manager.h:54
bool m_ExtraZoneDisplayModes
When true, adds zone-diaplay-modes for stroking the zone fracture boundaries and the zone triangulati...
std::vector< TOOL_MANAGER * > m_toolManagers
Definition: hotkey_store.h:110
static PSEUDO_ACTION * g_gesturePseudoActions[]
static wxString GetAppName(TOOL_ACTION *aAction)
#define _(s)
std::vector< TOOL_ACTION * > m_Actions
Definition: hotkey_store.h:36
static PSEUDO_ACTION * g_standardPlatformCommands[]
std::vector< HOTKEY_SECTION > m_hk_sections
Definition: hotkey_store.h:111
Represent a single user action.
Definition: tool_action.h:67
static const ADVANCED_CFG & GetCfg()
Get the singleton instance's config, which is shared by all consumers.
int m_EditKeycode
Definition: hotkey_store.h:37
wxString m_SectionName
Definition: hotkey_store.h:53
static wxString GetSectionName(TOOL_ACTION *aAction)

References _, g_gesturePseudoActions, g_standardPlatformCommands, GetAppName(), ADVANCED_CFG::GetCfg(), GetSectionName(), HOTKEY::m_Actions, HOTKEY::m_EditKeycode, ADVANCED_CFG::m_ExtraZoneDisplayModes, m_hk_sections, HOTKEY_SECTION::m_HotKeys, HOTKEY_SECTION::m_SectionName, and m_toolManagers.

Referenced by PANEL_HOTKEYS_EDITOR::TransferDataToWindow().

◆ ResetAllHotkeysToDefault()

void HOTKEY_STORE::ResetAllHotkeysToDefault ( )

Reset every hotkey in the store to the default values.

Definition at line 183 of file hotkey_store.cpp.

184 {
185  for( HOTKEY_SECTION& section : m_hk_sections )
186  {
187  for( HOTKEY& hotkey : section.m_HotKeys )
188  hotkey.m_EditKeycode = hotkey.m_Actions[ 0 ]->GetDefaultHotKey();
189  }
190 }
std::vector< TOOL_ACTION * > m_Actions
Definition: hotkey_store.h:36
std::vector< HOTKEY_SECTION > m_hk_sections
Definition: hotkey_store.h:111
int m_EditKeycode
Definition: hotkey_store.h:37

References HOTKEY::m_Actions, HOTKEY::m_EditKeycode, and m_hk_sections.

Referenced by WIDGET_HOTKEY_LIST::ResetAllHotkeys().

◆ ResetAllHotkeysToOriginal()

void HOTKEY_STORE::ResetAllHotkeysToOriginal ( )

Resets every hotkey to the original values.

Definition at line 193 of file hotkey_store.cpp.

194 {
195  for( HOTKEY_SECTION& section : m_hk_sections )
196  {
197  for( HOTKEY& hotkey : section.m_HotKeys )
198  hotkey.m_EditKeycode = hotkey.m_Actions[ 0 ]->GetHotKey();
199  }
200 }
std::vector< TOOL_ACTION * > m_Actions
Definition: hotkey_store.h:36
std::vector< HOTKEY_SECTION > m_hk_sections
Definition: hotkey_store.h:111
int m_EditKeycode
Definition: hotkey_store.h:37

References HOTKEY::m_Actions, HOTKEY::m_EditKeycode, and m_hk_sections.

Referenced by WIDGET_HOTKEY_LIST::ResetAllHotkeys().

◆ SaveAllHotkeys()

void HOTKEY_STORE::SaveAllHotkeys ( )

Persist all changes to hotkeys in the store to the underlying data structures.

Definition at line 170 of file hotkey_store.cpp.

171 {
172  for( HOTKEY_SECTION& section : m_hk_sections )
173  {
174  for( HOTKEY& hotkey : section.m_HotKeys )
175  {
176  for( TOOL_ACTION* action : hotkey.m_Actions )
177  action->SetHotKey( hotkey.m_EditKeycode );
178  }
179  }
180 }
void SetHotKey(int aKeycode)
std::vector< TOOL_ACTION * > m_Actions
Definition: hotkey_store.h:36
std::vector< HOTKEY_SECTION > m_hk_sections
Definition: hotkey_store.h:111
Represent a single user action.
Definition: tool_action.h:67
int m_EditKeycode
Definition: hotkey_store.h:37

References HOTKEY::m_Actions, HOTKEY::m_EditKeycode, m_hk_sections, and TOOL_ACTION::SetHotKey().

Referenced by WIDGET_HOTKEY_LIST::TransferDataFromControl().

Member Data Documentation

◆ m_hk_sections

std::vector<HOTKEY_SECTION> HOTKEY_STORE::m_hk_sections
private

◆ m_toolManagers

std::vector<TOOL_MANAGER*> HOTKEY_STORE::m_toolManagers
private

Definition at line 110 of file hotkey_store.h.

Referenced by Init().


The documentation for this class was generated from the following files: