KiCad PCB EDA Suite
KIWAY Class Reference

KIWAY is a minimalistic software bus for communications between various DLLs/DSOs (DSOs) within the same KiCad process. More...

#include <kiway.h>

Inheritance diagram for KIWAY:

Public Types

enum  FACE_T {
  FACE_SCH, FACE_PCB, FACE_CVPCB, FACE_GERBVIEW,
  FACE_PL_EDITOR, FACE_PCB_CALCULATOR, FACE_BMP2CMP, KIWAY_FACE_COUNT
}
 Known KIFACE implementations. More...
 

Public Member Functions

 ~KIWAY () throw ()
 
VTBL_ENTRY KIFACEKiFACE (FACE_T aFaceId, bool doLoad=true)
 Function KiFACE returns the KIFACE* given a FACE_T. More...
 
VTBL_ENTRY KIWAY_PLAYERPlayer (FRAME_T aFrameType, bool doCreate=true, wxTopLevelWindow *aParent=NULL)
 Function Player returns the KIWAY_PLAYER* given a FRAME_T. More...
 
VTBL_ENTRY bool PlayerClose (FRAME_T aFrameType, bool doForce)
 Function PlayerClose calls the KIWAY_PLAYER::Close( bool force ) function on the window and if not vetoed, returns true, else false. More...
 
VTBL_ENTRY bool PlayersClose (bool doForce)
 Function PlayersClose calls the KIWAY_PLAYER::Close( bool force ) function on all the windows and if none are vetoed, returns true, else false. More...
 
VTBL_ENTRY void ExpressMail (FRAME_T aDestination, MAIL_T aCommand, std::string &aPayload, wxWindow *aSource=NULL)
 Function ExpressMail send aPayload to aDestination from aSource. More...
 
VTBL_ENTRY PROJECTPrj () const
 Function Prj returns the PROJECT associated with this KIWAY. More...
 
VTBL_ENTRY void SetLanguage (int aLanguage)
 Function SetLanguage changes the language and then calls ShowChangedLanguage() on all KIWAY_PLAYERs. More...
 
VTBL_ENTRY void CommonSettingsChanged (bool aEnvVarsChanged, bool aTextVarsChanged)
 Function CommonSettingsChanged Calls CommonSettingsChanged() on all KIWAY_PLAYERs. More...
 
VTBL_ENTRY void ProjectChanged ()
 Calls ProjectChanged() on all KIWAY_PLAYERs. More...
 
 KIWAY (PGM_BASE *aProgram, int aCtlBits, wxFrame *aTop=NULL)
 
void SetTop (wxFrame *aTop)
 Function SetTop tells this KIWAY about the top most frame in the program and optionally allows it to play the role of one of the KIWAY_PLAYERs if launched from single_top.cpp. More...
 
void OnKiCadExit ()
 
void OnKiwayEnd ()
 
bool ProcessEvent (wxEvent &aEvent) override
 

Static Public Member Functions

static FACE_T KifaceType (FRAME_T aFrameType)
 Function KifaceType is a simple mapping function which returns the FACE_T which is known to implement aFrameType. More...
 

Private Member Functions

const wxString dso_search_path (FACE_T aFaceId)
 Get the [path &] name of the DSO holding the requested FACE_T. More...
 
bool set_kiface (FACE_T aFaceType, KIFACE *aKiface)
 
KIWAY_PLAYERGetPlayerFrame (FRAME_T aFrameType)
 

Private Attributes

PGM_BASEm_program
 
int m_ctl
 
wxFrame * m_top
 
wxArrayString m_playerFrameName
 

Static Private Attributes

static KIFACEm_kiface [KIWAY_FACE_COUNT]
 
static int m_kiface_version [KIWAY_FACE_COUNT]
 

Friends

struct PGM_SINGLE_TOP
 

Detailed Description

KIWAY is a minimalistic software bus for communications between various DLLs/DSOs (DSOs) within the same KiCad process.

It makes it possible to call between DSOs without having to link them together, and without having to link to the top process module which houses the KIWAY(s). More importantly it makes it possible to send custom wxEvents between DSOs and from the top process module down into the DSOs. The latter capability is thought useful for driving the lower DSOs from a python test rig or for demo (automation) purposes.

Most all calls are via virtual functions, which means C++ vtables are used to hold function pointers and eliminate the need to link to specific object code libraries, speeding development and encouraging clearly defined interface design. Unlike Microsoft COM, which is a multi-vendor design supporting DLL's built at various points in time, the KIWAY alchemy is single project, with all components being built at the same time. So one should expect solid compatibility between all KiCad components, as long at they are compiled at the same time.

There is one KIWAY in the launching portion of the process for each open KiCad project. Each project has its own KIWAY. Available to each KIWAY is an actual PROJECT data structure. If you have a KIWAY, you can get to the PROJECT using KIWAY::Prj().

In summary, a KIWAY facilitates communicating between DSOs, where the topic of the communication is project specific. Here a "project" means a BOARD and a SCHEMATIC and a NETLIST, (anything relating to production of a single BOARD and added to class PROJECT.)

Definition at line 273 of file kiway.h.

Member Enumeration Documentation

◆ FACE_T

Known KIFACE implementations.

Enumerator
FACE_SCH 

eeschema DSO

FACE_PCB 

pcbnew DSO

FACE_CVPCB 
FACE_GERBVIEW 
FACE_PL_EDITOR 
FACE_PCB_CALCULATOR 
FACE_BMP2CMP 
KIWAY_FACE_COUNT 

Definition at line 279 of file kiway.h.

Constructor & Destructor Documentation

◆ ~KIWAY()

KIWAY::~KIWAY ( )
throw (
)
inline

Definition at line 292 of file kiway.h.

292 {}

◆ KIWAY()

KIWAY::KIWAY ( PGM_BASE aProgram,
int  aCtlBits,
wxFrame *  aTop = NULL 
)

Definition at line 48 of file kiway.cpp.

48  :
49  m_program( aProgram ), m_ctl( aCtlBits ), m_top( 0 )
50 {
51  SetTop( aTop ); // hook player_destroy_handler() into aTop.
52 
53 
54  // Prepare the room to store the frame names, once they will be created
55  // with FRAME_T type as index in this table.
56  // (note this is a list of frame names, but a non empty entry
57  // does not mean the frame still exists. It means only the frame was created
58  // at least once. It can be destroyed after. These entries are not cleared.
59  // the purpose is just to allow a call to wxWindow::FindWindowByName(), from
60  // a FRAME_T frame type
61  m_playerFrameName.Add( wxEmptyString, KIWAY_PLAYER_COUNT );
62 }
PGM_BASE * m_program
Definition: kiway.h:438
int m_ctl
Definition: kiway.h:439
int PGM_BASE * aProgram
Definition: cvpcb/cvpcb.cpp:97
void SetTop(wxFrame *aTop)
Function SetTop tells this KIWAY about the top most frame in the program and optionally allows it to ...
Definition: kiway.cpp:80
wxArrayString m_playerFrameName
Definition: kiway.h:449
wxFrame * m_top
Definition: kiway.h:441

References KIWAY_PLAYER_COUNT, m_playerFrameName, and SetTop().

Member Function Documentation

◆ CommonSettingsChanged()

void KIWAY::CommonSettingsChanged ( bool  aEnvVarsChanged,
bool  aTextVarsChanged 
)

Function CommonSettingsChanged Calls CommonSettingsChanged() on all KIWAY_PLAYERs.

Used after changing suite-wide options such as panning, autosave interval, etc.

Definition at line 515 of file kiway.cpp.

516 {
518  {
519  // A dynamic_cast could be better, but creates link issues
520  // (some basic_frame functions not found) on some platforms,
521  // so a static_cast is used.
522  EDA_BASE_FRAME* top = static_cast<EDA_BASE_FRAME*>( m_top );
523 
524  if( top )
525  top->CommonSettingsChanged( aEnvVarsChanged, aTextVarsChanged );
526  }
527 
528  for( unsigned i=0; i < KIWAY_PLAYER_COUNT; ++i )
529  {
530  KIWAY_PLAYER* frame = GetPlayerFrame( ( FRAME_T )i );
531 
532  if( frame )
533  frame->CommonSettingsChanged( aEnvVarsChanged, aTextVarsChanged );
534  }
535 }
#define KFCTL_CPP_PROJECT_SUITE
Am running under C++ project mgr, possibly with others.
Definition: kiway.h:159
KIWAY_PLAYER is a wxFrame capable of the OpenProjectFiles function, meaning it can load a portion of ...
Definition: kiway_player.h:61
KIWAY_PLAYER * GetPlayerFrame(FRAME_T aFrameType)
Definition: kiway.cpp:336
FRAME_T
Enum FRAME_T is the set of EDA_BASE_FRAME derivatives, typically stored in EDA_BASE_FRAME::m_Ident.
Definition: frame_type.h:34
int m_ctl
Definition: kiway.h:439
void CommonSettingsChanged(bool aEnvVarsChanged, bool aTextVarsChanged) override
Notification event that some of the common (suite-wide) settings have changed.
The base frame for deriving all KiCad main window classes.
wxFrame * m_top
Definition: kiway.h:441

References EDA_BASE_FRAME::CommonSettingsChanged(), GetPlayerFrame(), KFCTL_CPP_PROJECT_SUITE, KIWAY_PLAYER_COUNT, m_ctl, and m_top.

Referenced by COMMON_CONTROL::ConfigurePaths(), PCB::IFACE::CreateWindow(), EDA_BASE_FRAME::OnPreferences(), PCB_EDIT_FRAME::ShowBoardSetupDialog(), and SCH_EDIT_FRAME::ShowSchematicSetupDialog().

◆ dso_search_path()

const wxString KIWAY::dso_search_path ( FACE_T  aFaceId)
private

Get the [path &] name of the DSO holding the requested FACE_T.

Definition at line 98 of file kiway.cpp.

99 {
100  const char* name;
101 
102  switch( aFaceId )
103  {
104  case FACE_SCH: name = KIFACE_PREFIX "eeschema"; break;
105  case FACE_PCB: name = KIFACE_PREFIX "pcbnew"; break;
106  case FACE_CVPCB: name = KIFACE_PREFIX "cvpcb"; break;
107  case FACE_GERBVIEW: name = KIFACE_PREFIX "gerbview"; break;
108  case FACE_PL_EDITOR: name = KIFACE_PREFIX "pl_editor"; break;
109  case FACE_PCB_CALCULATOR: name = KIFACE_PREFIX "pcb_calculator"; break;
110  case FACE_BMP2CMP: name = KIFACE_PREFIX "bitmap2component"; break;
111 
112  default:
113  wxASSERT_MSG( 0, wxT( "caller has a bug, passed a bad aFaceId" ) );
114  return wxEmptyString;
115  }
116 
117 #ifndef __WXMAC__
118  wxString path;
119 
121  {
122  // The 2 *.cpp program launchers: single_top.cpp and kicad.cpp expect
123  // the *.kiface's to reside in same directory as their binaries do.
124  // Not so for python launcher, identified by KFCTL_PY_PROJECT_SUITE
125  path = wxStandardPaths::Get().GetExecutablePath();
126  }
127 
128  wxFileName fn = path;
129 #else
130  // we have the dso's in main OSX bundle kicad.app/Contents/PlugIns
131  wxFileName fn = Pgm().GetExecutablePath();
132  fn.AppendDir( wxT( "Contents" ) );
133  fn.AppendDir( wxT( "PlugIns" ) );
134 #endif
135 
136  fn.SetName( name );
137 
138 #ifdef DEBUG
139  // To speed up development, it's sometimes nice to run kicad from inside
140  // the build path. In that case, each program will be in a subdirectory.
141  // To find the DSOs, we need to go up one directory and then enter a subdirectory.
142 
143  if( wxGetEnv( wxT( "KICAD_RUN_FROM_BUILD_DIR" ), nullptr ) )
144  {
145 #ifdef __WXMAC__
146  fn = wxStandardPaths::Get().GetExecutablePath();
147  fn.RemoveLastDir();
148  fn.AppendDir( wxT( "PlugIns" ) );
149  fn.SetName( name );
150 #else
151  const char* dirName;
152 
153  // The subdirectories usually have the same name as the kiface
154  switch( aFaceId )
155  {
156  case FACE_PL_EDITOR: dirName = "pagelayout_editor"; break;
157  default: dirName = name + 1; break;
158  }
159 
160  fn.RemoveLastDir();
161  fn.AppendDir( dirName );
162 #endif
163  }
164 #endif
165 
166  // Here a "suffix" == an extension with a preceding '.',
167  // so skip the preceding '.' to get an extension
168  fn.SetExt( &KIFACE_SUFFIX[1] );
169 
170  return fn.GetFullPath();
171 }
#define KFCTL_CPP_PROJECT_SUITE
Am running under C++ project mgr, possibly with others.
Definition: kiway.h:159
KIWAY Kiway & Pgm(), KFCTL_STANDALONE
The global Program "get" accessor.
Definition: single_top.cpp:102
int m_ctl
Definition: kiway.h:439
pcbnew DSO
Definition: kiway.h:282
eeschema DSO
Definition: kiway.h:281
const char * name
Definition: DXF_plotter.cpp:59
#define KFCTL_STANDALONE
Am running as a standalone Top.
Definition: kiway.h:158

References FACE_BMP2CMP, FACE_CVPCB, FACE_GERBVIEW, FACE_PCB, FACE_PCB_CALCULATOR, FACE_PL_EDITOR, FACE_SCH, KFCTL_CPP_PROJECT_SUITE, KFCTL_STANDALONE, m_ctl, name, and Pgm().

Referenced by KiFACE().

◆ ExpressMail()

void KIWAY::ExpressMail ( FRAME_T  aDestination,
MAIL_T  aCommand,
std::string &  aPayload,
wxWindow *  aSource = NULL 
)

◆ GetPlayerFrame()

KIWAY_PLAYER * KIWAY::GetPlayerFrame ( FRAME_T  aFrameType)
private
Returns
the reference of the KIWAY_PLAYER having the type aFrameType if exists, or NULL if this KIWAY_PLAYER was not yet created, or was closed

Definition at line 336 of file kiway.cpp.

337 {
338  if( m_playerFrameName[aFrameType].IsEmpty() )
339  return NULL;
340 
341  return static_cast<KIWAY_PLAYER*>( wxWindow::FindWindowByName( m_playerFrameName[aFrameType] ) );
342 }
#define NULL
wxArrayString m_playerFrameName
Definition: kiway.h:449

References m_playerFrameName, and NULL.

Referenced by CommonSettingsChanged(), Player(), PlayerClose(), ProjectChanged(), and SetLanguage().

◆ KiFACE()

KIFACE * KIWAY::KiFACE ( FACE_T  aFaceId,
bool  doLoad = true 
)

Function KiFACE returns the KIFACE* given a FACE_T.

If it is not already loaded, the KIFACE is loaded and initialized with a call to KIFACE::OnKifaceStart()

Definition at line 180 of file kiway.cpp.

181 {
182  // Since this will be called from python, cannot assume that code will
183  // not pass a bad aFaceId.
184  if( (unsigned) aFaceId >= arrayDim( m_kiface ) )
185  {
186  // @todo : throw an exception here for python's benefit, at least that
187  // way it gets some explanatory text.
188 
189  wxASSERT_MSG( 0, wxT( "caller has a bug, passed a bad aFaceId" ) );
190  return NULL;
191  }
192 
193  // return the previously loaded KIFACE, if it was.
194  if( m_kiface[aFaceId] )
195  return m_kiface[aFaceId];
196 
197  wxString msg;
198 
199  // DSO with KIFACE has not been loaded yet, does caller want to load it?
200  if( doLoad )
201  {
202  wxString dname = dso_search_path( aFaceId );
203 
204  wxDynamicLibrary dso;
205 
206  void* addr = NULL;
207 
208  // For some reason wxDynamicLibrary::Load() crashes in some languages
209  // (chinese for instance) when loading the dynamic library.
210  // The crash happens for Eeschema.
211  // So switch to "C" locale during loading (LC_COLLATE is enough).
212  int lc_new_type = LC_COLLATE;
213  std::string user_locale = setlocale( lc_new_type, nullptr );
214  setlocale( lc_new_type, "C" );
215 
216  bool success = dso.Load( dname, wxDL_VERBATIM | wxDL_NOW | wxDL_GLOBAL );
217 
218  setlocale( lc_new_type, user_locale.c_str() );
219 
220  if( !success )
221  {
222  // Failure: error reporting UI was done via wxLogSysError().
223  // No further reporting required here. Apparently this is not true on all
224  // platforms and/or wxWidgets builds and KiCad will crash. Throwing the exception
225  // here and catching it in the KiCad launcher resolves the crash issue. See bug
226  // report https://bugs.launchpad.net/kicad/+bug/1577786.
227 
228  msg.Printf( _( "Failed to load kiface library \"%s\"." ),
229  dname );
230  THROW_IO_ERROR( msg );
231  }
232  else if( ( addr = dso.GetSymbol( wxT( KIFACE_INSTANCE_NAME_AND_VERSION ) ) ) == NULL )
233  {
234  // Failure: error reporting UI was done via wxLogSysError().
235  // No further reporting required here. Assume the same thing applies here as
236  // above with the Load() call. This has not been tested.
237  msg.Printf( _( "Could not read instance name and version symbol form kiface "
238  "library \"%s\"." ),
239  dname );
240  THROW_IO_ERROR( msg );
241  }
242  else
243  {
244  KIFACE_GETTER_FUNC* getter = (KIFACE_GETTER_FUNC*) addr;
245 
246  KIFACE* kiface = getter( &m_kiface_version[aFaceId], KIFACE_VERSION, m_program );
247 
248  // KIFACE_GETTER_FUNC function comment (API) says the non-NULL is unconditional.
249  wxASSERT_MSG( kiface,
250  wxT( "attempted DSO has a bug, failed to return a KIFACE*" ) );
251 
252  // Give the DSO a single chance to do its "process level" initialization.
253  // "Process level" specifically means stay away from any projects in there.
254  if( kiface->OnKifaceStart( m_program, m_ctl ) )
255  {
256  // Tell dso's wxDynamicLibrary destructor not to Unload() the program image.
257  (void) dso.Detach();
258 
259  return m_kiface[aFaceId] = kiface;
260  }
261  }
262 
263  // In any of the failure cases above, dso.Unload() should be called here
264  // by dso destructor.
265  // However:
266 
267  // There is a file installation bug. We only look for KIFACE_I's which we know
268  // to exist, and we did not find one. If we do not find one, this is an
269  // installation bug.
270 
271  msg = wxString::Format( _(
272  "Fatal Installation Bug. File:\n"
273  "\"%s\"\ncould not be loaded\n" ), dname );
274 
275  if( ! wxFileExists( dname ) )
276  msg << _( "It is missing.\n" );
277  else
278  msg << _( "Perhaps a shared library (.dll or .so) file is missing.\n" );
279 
280  msg << _( "From command line: argv[0]:\n'" );
281  msg << wxStandardPaths::Get().GetExecutablePath() << wxT( "'\n" );
282 
283  // This is a fatal error, one from which we cannot recover, nor do we want
284  // to protect against in client code which would require numerous noisy
285  // tests in numerous places. So we inform the user that the installation
286  // is bad. This exception will likely not get caught until way up in the
287  // wxApp derivative, at which point the process will exit gracefully.
288  THROW_IO_ERROR( msg );
289  }
290 
291  return NULL;
292 }
BITMAP2CMP_SETTINGS kiface
#define KIFACE_VERSION
Definition: kiway.h:111
PGM_BASE * m_program
Definition: kiway.h:438
#define KIFACE_INSTANCE_NAME_AND_VERSION
Definition: kiway.h:116
#define NULL
KIFACE * KIFACE_GETTER_FUNC(int *aKIFACEversion, int aKIWAYversion, PGM_BASE *aProgram)
Function Pointer KIFACE_GETTER_FUNC points to the one and only KIFACE export.
Definition: kiway.h:473
int m_ctl
Definition: kiway.h:439
constexpr std::size_t arrayDim(T const (&)[N]) noexcept
Returns # of elements in an array.
Definition: arraydim.h:31
const wxString dso_search_path(FACE_T aFaceId)
Get the [path &] name of the DSO holding the requested FACE_T.
Definition: kiway.cpp:98
void Format(OUTPUTFORMATTER *out, int aNestLevel, int aCtl, const CPTREE &aTree)
Function Format outputs a PTREE into s-expression format via an OUTPUTFORMATTER derivative.
Definition: ptree.cpp:200
#define _(s)
Definition: 3d_actions.cpp:33
KIFACE is used by a participant in the KIWAY alchemy.
Definition: kiway.h:150
static int m_kiface_version[KIWAY_FACE_COUNT]
Definition: kiway.h:436
#define THROW_IO_ERROR(msg)
Definition: ki_exception.h:38
static KIFACE * m_kiface[KIWAY_FACE_COUNT]
Definition: kiway.h:435

References _, arrayDim(), dso_search_path(), Format(), kiface, KIFACE_INSTANCE_NAME_AND_VERSION, KIFACE_VERSION, m_ctl, m_kiface, m_kiface_version, m_program, NULL, and THROW_IO_ERROR.

Referenced by COMMON_CONTROL::ConfigurePaths(), FOOTPRINT_PREVIEW_PANEL_BASE::Create(), get_instance_from_id(), SAVE_AS_TRAVERSER::OnFile(), PROJECT::PcbFootprintLibs(), Player(), and COMMON_CONTROL::ShowLibraryTable().

◆ KifaceType()

KIWAY::FACE_T KIWAY::KifaceType ( FRAME_T  aFrameType)
static

Function KifaceType is a simple mapping function which returns the FACE_T which is known to implement aFrameType.

Returns
KIWAY::FACE_T - a valid value or FACE_T(-1) if given a bad aFrameType.

Definition at line 295 of file kiway.cpp.

296 {
297  switch( aFrameType )
298  {
299  case FRAME_SCH:
301  case FRAME_SCH_VIEWER:
303  case FRAME_SIMULATOR:
304  return FACE_SCH;
305 
306  case FRAME_PCB_EDITOR:
311  case FRAME_PCB_DISPLAY3D:
312  return FACE_PCB;
313 
314  case FRAME_CVPCB:
315  case FRAME_CVPCB_DISPLAY:
316  return FACE_CVPCB;
317 
318  case FRAME_GERBER:
319  return FACE_GERBVIEW;
320 
321  case FRAME_PL_EDITOR:
322  return FACE_PL_EDITOR;
323 
324  case FRAME_CALC:
325  return FACE_PCB_CALCULATOR;
326 
327  case FRAME_BM2CMP:
328  return FACE_BMP2CMP;
329 
330  default:
331  return FACE_T( -1 );
332  }
333 }
pcbnew DSO
Definition: kiway.h:282
FACE_T
Known KIFACE implementations.
Definition: kiway.h:279
eeschema DSO
Definition: kiway.h:281

References FACE_BMP2CMP, FACE_CVPCB, FACE_GERBVIEW, FACE_PCB, FACE_PCB_CALCULATOR, FACE_PL_EDITOR, FACE_SCH, FRAME_BM2CMP, FRAME_CALC, FRAME_CVPCB, FRAME_CVPCB_DISPLAY, FRAME_FOOTPRINT_EDITOR, FRAME_FOOTPRINT_VIEWER, FRAME_FOOTPRINT_VIEWER_MODAL, FRAME_FOOTPRINT_WIZARD, FRAME_GERBER, FRAME_PCB_DISPLAY3D, FRAME_PCB_EDITOR, FRAME_PL_EDITOR, FRAME_SCH, FRAME_SCH_SYMBOL_EDITOR, FRAME_SCH_VIEWER, FRAME_SCH_VIEWER_MODAL, and FRAME_SIMULATOR.

Referenced by PGM_SINGLE_TOP::OnPgmInit(), and Player().

◆ OnKiCadExit()

void KIWAY::OnKiCadExit ( )

Definition at line 587 of file kiway.cpp.

588 {
590  {
591  // A dynamic_cast could be better, but creates link issues
592  // (some basic_frame functions not found) on some platforms,
593  // so a static_cast is used.
594  EDA_BASE_FRAME* top = static_cast<EDA_BASE_FRAME*>( m_top );
595 
596  if( top )
597  top->Close( false );
598  }
599 }
#define KFCTL_CPP_PROJECT_SUITE
Am running under C++ project mgr, possibly with others.
Definition: kiway.h:159
int m_ctl
Definition: kiway.h:439
The base frame for deriving all KiCad main window classes.
wxFrame * m_top
Definition: kiway.h:441

References KFCTL_CPP_PROJECT_SUITE, m_ctl, and m_top.

Referenced by PL_EDITOR_FRAME::OnExit(), SCH_EDIT_FRAME::OnExit(), FOOTPRINT_EDIT_FRAME::OnExitKiCad(), FOOTPRINT_VIEWER_FRAME::OnExitKiCad(), SYMBOL_EDIT_FRAME::OnExitKiCad(), and PCB_EDIT_FRAME::OnQuit().

◆ OnKiwayEnd()

void KIWAY::OnKiwayEnd ( )

Definition at line 602 of file kiway.cpp.

603 {
604  for( KIFACE* i : m_kiface )
605  {
606  if( i )
607  i->OnKifaceEnd();
608  }
609 }
KIFACE is used by a participant in the KIWAY alchemy.
Definition: kiway.h:150
static KIFACE * m_kiface[KIWAY_FACE_COUNT]
Definition: kiway.h:435

References m_kiface.

Referenced by CreateWindow(), PGM_KICAD::OnPgmExit(), PGM_SINGLE_TOP::OnPgmExit(), PGM_TEST_FRAME::OnPgmExit(), and PGM_MOCK_EESCHEMA_FRAME::OnPgmExit().

◆ Player()

KIWAY_PLAYER * KIWAY::Player ( FRAME_T  aFrameType,
bool  doCreate = true,
wxTopLevelWindow *  aParent = NULL 
)

Function Player returns the KIWAY_PLAYER* given a FRAME_T.

If it is not already created, the required KIFACE is found and loaded and initialized if necessary, then the KIWAY_PLAYER window is created but not shown. Caller must Show() it. If it is already created, then the existing KIWAY_PLAYER* pointer is returned.

Parameters
aFrameTypeis from enum FRAME_T.
doCreatewhen true asks that the player be created if it is not already created, false means do not create and maybe return NULL.
aParentis a parent for modal KIWAY_PLAYER frames, otherwise NULL used only when doCreate = true and by KIWAY_PLAYER frames created in modal form because the are using the wxFLOAT_ON_PARENT style
Returns
KIWAY_PLAYER* - a valid opened KIWAY_PLAYER or NULL if there is something wrong or doCreate was false and the player has yet to be created.
Exceptions
IO_ERRORif the *.kiface file could not be found, filled with text saying what.

Definition at line 345 of file kiway.cpp.

346 {
347  // Since this will be called from python, cannot assume that code will
348  // not pass a bad aFrameType.
349  if( (unsigned) aFrameType >= KIWAY_PLAYER_COUNT )
350  {
351  // @todo : throw an exception here for python's benefit, at least that
352  // way it gets some explanatory text.
353 
354  wxASSERT_MSG( 0, wxT( "caller has a bug, passed a bad aFrameType" ) );
355  return nullptr;
356  }
357 
358  // return the previously opened window
359  KIWAY_PLAYER* frame = GetPlayerFrame( aFrameType );
360 
361  if( frame )
362  return frame;
363 
364  if( doCreate )
365  {
366  try
367  {
368  FACE_T face_type = KifaceType( aFrameType );
369  KIFACE* kiface = KiFACE( face_type );
370 
371  frame = (KIWAY_PLAYER*) kiface->CreateWindow(
372  aParent, // Parent window of frame in modal mode,
373  // NULL in non modal mode
374  aFrameType,
375  this,
376  m_ctl // questionable need, these same flags
377  // were passed to KIFACE::OnKifaceStart()
378  );
379 
380  m_playerFrameName[aFrameType] = frame->GetName();
381  return frame;
382  }
383  catch( const IO_ERROR& ioe )
384  {
385  DisplayErrorMessage( nullptr, _( "Error loading editor" ), ioe.What() );
386  }
387  catch( const std::exception& e)
388  {
389  DisplayErrorMessage( nullptr, _( "Error loading editor" ), e.what() );
390  }
391  catch( ... )
392  {
393  DisplayErrorMessage( nullptr, _( "Error loading editor" ) );
394  }
395  }
396 
397  return nullptr;
398 }
BITMAP2CMP_SETTINGS kiface
KIWAY_PLAYER is a wxFrame capable of the OpenProjectFiles function, meaning it can load a portion of ...
Definition: kiway_player.h:61
static FACE_T KifaceType(FRAME_T aFrameType)
Function KifaceType is a simple mapping function which returns the FACE_T which is known to implement...
Definition: kiway.cpp:295
void DisplayErrorMessage(wxWindow *aParent, const wxString &aText, const wxString &aExtraInfo)
Display an error message with aMessage.
Definition: confirm.cpp:253
KIWAY_PLAYER * GetPlayerFrame(FRAME_T aFrameType)
Definition: kiway.cpp:336
virtual const wxString What() const
A composite of Problem() and Where()
Definition: exceptions.cpp:29
int m_ctl
Definition: kiway.h:439
VTBL_ENTRY KIFACE * KiFACE(FACE_T aFaceId, bool doLoad=true)
Function KiFACE returns the KIFACE* given a FACE_T.
Definition: kiway.cpp:180
FACE_T
Known KIFACE implementations.
Definition: kiway.h:279
#define _(s)
Definition: 3d_actions.cpp:33
KIFACE is used by a participant in the KIWAY alchemy.
Definition: kiway.h:150
wxArrayString m_playerFrameName
Definition: kiway.h:449
Struct IO_ERROR is a class used to hold an error message and may be used when throwing exceptions con...
Definition: ki_exception.h:76

References _, DisplayErrorMessage(), GetPlayerFrame(), kiface, KiFACE(), KifaceType(), KIWAY_PLAYER_COUNT, m_ctl, m_playerFrameName, and IO_ERROR::What().

Referenced by FOOTPRINT_VIEWER_FRAME::AddFootprintToPCB(), PCB_BASE_EDIT_FRAME::AddLibrary(), LIB_CONTROL::AddSymbolToSchematic(), SYMBOL_EDIT_FRAME::canCloseWindow(), SCH_EDIT_FRAME::canCloseWindow(), FOOTPRINT_EDITOR_TOOLS::CreateFootprint(), FIELDS_GRID_TRICKS::doPopupSelection(), FIELDS_EDITOR_GRID_TRICKS::doPopupSelection(), PCB_EDITOR_CONTROL::EditFpInFpEditor(), SCH_EDITOR_CONTROL::EditWithLibEdit(), BACK_ANNOTATE::FetchNetlistFromPCB(), KICAD_MANAGER_FRAME::ImportNonKiCadProject(), InvokePcbLibTableEditor(), InvokeSchEditSymbolLibTable(), DIALOG_CHANGE_SYMBOLS::launchMatchIdSymbolBrowser(), DIALOG_CHANGE_SYMBOLS::launchNewIdSymbolBrowser(), FOOTPRINT_EDIT_FRAME::LoadFootprintFromBoard(), TEXT_BUTTON_SYMBOL_CHOOSER::OnButtonClick(), TEXT_BUTTON_FP_CHOOSER::OnButtonClick(), SCH_EDIT_FRAME::OnOpenCvpcb(), SCH_EDIT_FRAME::OnOpenPcbnew(), PGM_SINGLE_TOP::OnPgmInit(), EDA_BASE_FRAME::OnPreferences(), DIALOG_SYMBOL_REMAP::OnRemapSymbols(), DIALOG_EDIT_ONE_FIELD::OnTextValueSelectButtonClick(), FOOTPRINT_EDIT_FRAME::OnUpdateLoadFootprintFromBoard(), SCH_EDIT_FRAME::OnUpdatePCB(), FOOTPRINT_EDIT_FRAME::OnUpdateSaveFootprintToBoard(), SCH_BASE_FRAME::PickSymbolFromLibBrowser(), ProcessEvent(), SCH_EDIT_TOOL::Properties(), SCH_EDITOR_CONTROL::rescueProject(), PCB_EDIT_FRAME::RunEeschema(), EE_INSPECTION_TOOL::RunSimulation(), FOOTPRINT_EDIT_FRAME::SaveFootprintToBoard(), PCB_BASE_FRAME::SelectFootprintFromLibBrowser(), PCB_EDIT_FRAME::ShowFootprintPropertiesDialog(), CVPCB_CONTROL::ShowFootprintViewer(), FOOTPRINT_SELECT_WIDGET::ShowPicker(), COMMON_CONTROL::ShowPlayer(), KICAD_MANAGER_CONTROL::ShowPlayer(), SIM_PLOT_FRAME::SIM_PLOT_FRAME(), PCB_EDIT_FRAME::TestStandalone(), PCB_EDITOR_CONTROL::UpdateSchematicFromPCB(), LIB_CONTROL::UpdateSymbolInSchematic(), and DIALOG_EXCHANGE_FOOTPRINTS::ViewAndSelectFootprint().

◆ PlayerClose()

bool KIWAY::PlayerClose ( FRAME_T  aFrameType,
bool  doForce 
)

Function PlayerClose calls the KIWAY_PLAYER::Close( bool force ) function on the window and if not vetoed, returns true, else false.

If window actually closes, then this KIWAY marks it as not opened internally.

Returns
bool - true the window is closed and not vetoed, else false.

Definition at line 401 of file kiway.cpp.

402 {
403  // Since this will be called from python, cannot assume that code will
404  // not pass a bad aFrameType.
405  if( (unsigned) aFrameType >= KIWAY_PLAYER_COUNT )
406  {
407  // @todo : throw an exception here for python's benefit, at least that
408  // way it gets some explanatory text.
409 
410  wxASSERT_MSG( 0, wxT( "caller has a bug, passed a bad aFrameType" ) );
411  return false;
412  }
413 
414  KIWAY_PLAYER* frame = GetPlayerFrame( aFrameType );
415 
416  if( frame == NULL ) // Already closed
417  return true;
418 
419  if( frame->NonUserClose( doForce ) )
420  return true;
421 
422  return false;
423 }
KIWAY_PLAYER is a wxFrame capable of the OpenProjectFiles function, meaning it can load a portion of ...
Definition: kiway_player.h:61
KIWAY_PLAYER * GetPlayerFrame(FRAME_T aFrameType)
Definition: kiway.cpp:336
#define NULL
bool NonUserClose(bool aForce)

References GetPlayerFrame(), KIWAY_PLAYER_COUNT, EDA_BASE_FRAME::NonUserClose(), and NULL.

Referenced by PlayersClose().

◆ PlayersClose()

bool KIWAY::PlayersClose ( bool  doForce)

Function PlayersClose calls the KIWAY_PLAYER::Close( bool force ) function on all the windows and if none are vetoed, returns true, else false.

If any window actually closes, then this KIWAY marks it as not opened internally.

Returns
bool - true indicates that all windows closed because none were vetoed, false means at least one cast a veto. Any that cast a veto are still open.

Definition at line 426 of file kiway.cpp.

427 {
428  bool ret = true;
429 
430  for( unsigned i=0; i < KIWAY_PLAYER_COUNT; ++i )
431  {
432  ret = ret && PlayerClose( FRAME_T( i ), doForce );
433  }
434 
435  return ret;
436 }
FRAME_T
Enum FRAME_T is the set of EDA_BASE_FRAME derivatives, typically stored in EDA_BASE_FRAME::m_Ident.
Definition: frame_type.h:34
VTBL_ENTRY bool PlayerClose(FRAME_T aFrameType, bool doForce)
Function PlayerClose calls the KIWAY_PLAYER::Close( bool force ) function on the window and if not ve...
Definition: kiway.cpp:401

References KIWAY_PLAYER_COUNT, and PlayerClose().

◆ Prj()

PROJECT & KIWAY::Prj ( ) const

Function Prj returns the PROJECT associated with this KIWAY.

This is here as an accessor, so that there is freedom to put the actual PROJECT storage in a place decided by the implementation, and not known to the caller.

Definition at line 174 of file kiway.cpp.

175 {
176  return Pgm().GetSettingsManager().Prj();
177 }
VTBL_ENTRY PROJECT & Prj() const
Function Prj returns the PROJECT associated with this KIWAY.
Definition: kiway.cpp:174
KIWAY Kiway & Pgm(), KFCTL_STANDALONE
The global Program "get" accessor.
Definition: single_top.cpp:102

References Pgm(), and Prj().

Referenced by PCB::IFACE::CreateWindow(), SYMBOL_PREVIEW_WIDGET::DisplaySymbol(), FOOTPRINT_LIST::GetInstance(), PCB_EDIT_FRAME::importFile(), InvokePcbLibTableEditor(), InvokeSchEditSymbolLibTable(), LIB_TREE_MODEL_ADAPTER::LIB_TREE_MODEL_ADAPTER(), KIWAY_HOLDER::Prj(), Prj(), Prj(), and LIB_TREE_MODEL_ADAPTER::SavePinnedItems().

◆ ProcessEvent()

bool KIWAY::ProcessEvent ( wxEvent &  aEvent)
override

Definition at line 561 of file kiway.cpp.

562 {
563  KIWAY_EXPRESS* mail = dynamic_cast<KIWAY_EXPRESS*>( &aEvent );
564 
565  if( mail )
566  {
567  FRAME_T dest = mail->Dest();
568 
569  // see if recipient is alive
570  KIWAY_PLAYER* alive = Player( dest, false );
571 
572  if( alive )
573  {
574 #if 1
575  return alive->ProcessEvent( aEvent );
576 #else
577  alive->KiwayMailIn( *mail );
578  return true;
579 #endif
580  }
581  }
582 
583  return false;
584 }
KIWAY_PLAYER is a wxFrame capable of the OpenProjectFiles function, meaning it can load a portion of ...
Definition: kiway_player.h:61
KIWAY_EXPRESS carries a payload from one KIWAY_PLAYER to another within a PROJECT.
Definition: kiway_express.h:39
FRAME_T
Enum FRAME_T is the set of EDA_BASE_FRAME derivatives, typically stored in EDA_BASE_FRAME::m_Ident.
Definition: frame_type.h:34
VTBL_ENTRY KIWAY_PLAYER * Player(FRAME_T aFrameType, bool doCreate=true, wxTopLevelWindow *aParent=NULL)
Function Player returns the KIWAY_PLAYER* given a FRAME_T.
Definition: kiway.cpp:345
virtual void KiwayMailIn(KIWAY_EXPRESS &aEvent)
Function KiwayMailIn receives KIWAY_EXPRESS messages from other players.
FRAME_T Dest()
Function Dest returns the destination player id of the message.
Definition: kiway_express.h:46
bool ProcessEvent(wxEvent &aEvent) override
Override the default process event handler to implement the auto save feature.

References KIWAY_EXPRESS::Dest(), KIWAY_PLAYER::KiwayMailIn(), Player(), and EDA_BASE_FRAME::ProcessEvent().

Referenced by ExpressMail().

◆ ProjectChanged()

void KIWAY::ProjectChanged ( )

Calls ProjectChanged() on all KIWAY_PLAYERs.

Used after changing the project to ensure all players are updated correctly.

Definition at line 538 of file kiway.cpp.

539 {
541  {
542  // A dynamic_cast could be better, but creates link issues
543  // (some basic_frame functions not found) on some platforms,
544  // so a static_cast is used.
545  EDA_BASE_FRAME* top = static_cast<EDA_BASE_FRAME*>( m_top );
546 
547  if( top )
548  top->ProjectChanged();
549  }
550 
551  for( unsigned i=0; i < KIWAY_PLAYER_COUNT; ++i )
552  {
553  KIWAY_PLAYER* frame = GetPlayerFrame( ( FRAME_T )i );
554 
555  if( frame )
556  frame->ProjectChanged();
557  }
558 }
#define KFCTL_CPP_PROJECT_SUITE
Am running under C++ project mgr, possibly with others.
Definition: kiway.h:159
KIWAY_PLAYER is a wxFrame capable of the OpenProjectFiles function, meaning it can load a portion of ...
Definition: kiway_player.h:61
KIWAY_PLAYER * GetPlayerFrame(FRAME_T aFrameType)
Definition: kiway.cpp:336
FRAME_T
Enum FRAME_T is the set of EDA_BASE_FRAME derivatives, typically stored in EDA_BASE_FRAME::m_Ident.
Definition: frame_type.h:34
int m_ctl
Definition: kiway.h:439
The base frame for deriving all KiCad main window classes.
virtual void ProjectChanged()
Notification event that the project has changed.
wxFrame * m_top
Definition: kiway.h:441

References GetPlayerFrame(), KFCTL_CPP_PROJECT_SUITE, KIWAY_PLAYER_COUNT, m_ctl, m_top, and EDA_BASE_FRAME::ProjectChanged().

Referenced by SETTINGS_MANAGER::LoadProject(), and SETTINGS_MANAGER::UnloadProject().

◆ set_kiface()

bool KIWAY::set_kiface ( FACE_T  aFaceType,
KIFACE aKiface 
)
inlineprivate

Definition at line 419 of file kiway.h.

420  {
421  if( (unsigned) aFaceType < (unsigned) KIWAY_FACE_COUNT )
422  {
423  m_kiface[aFaceType] = aKiface;
424  return true;
425  }
426  return false;
427  }
static KIFACE * m_kiface[KIWAY_FACE_COUNT]
Definition: kiway.h:435

References KIWAY_FACE_COUNT, and m_kiface.

Referenced by PGM_SINGLE_TOP::OnPgmInit().

◆ SetLanguage()

void KIWAY::SetLanguage ( int  aLanguage)

Function SetLanguage changes the language and then calls ShowChangedLanguage() on all KIWAY_PLAYERs.

Definition at line 447 of file kiway.cpp.

448 {
449  wxString errMsg;
450  bool ret = false;
451 
452  {
453  // Only allow the traces to be logged by wx. We use our own system to log when the
454  // OS doesn't support the language, so we want to hide the wx error.
455  WX_LOG_TRACE_ONLY logtraceOnly;
456  Pgm().SetLanguageIdentifier( aLanguage );
457  ret = Pgm().SetLanguage( errMsg );
458  }
459 
460  if( !ret )
461  {
462  wxString lang;
463 
464  for( unsigned ii = 0; LanguagesList[ii].m_KI_Lang_Identifier != 0; ii++ )
465  {
466  if( aLanguage == LanguagesList[ii].m_KI_Lang_Identifier )
467  {
468  if( LanguagesList[ii].m_DoNotTranslate )
469  lang = LanguagesList[ii].m_Lang_Label;
470  else
471  lang = wxGetTranslation( LanguagesList[ii].m_Lang_Label );
472 
473  break;
474  }
475  }
476 
477  DisplayErrorMessage( nullptr,
478  wxString::Format( _( "Unable to switch language to %s" ), lang ),
479  errMsg );
480  return;
481  }
482 
483 #if 1
484  // This is a risky hack that goes away if we allow the language to be
485  // set only from the top most frame if !Kiface.IsSingle()
486 
487  // Only for the C++ project manager, and not for the python one and not for
488  // single_top do we look for the EDA_BASE_FRAME as the top level window.
489  // For single_top this is not needed because that window is registered in
490  // the array below.
492  {
493  // A dynamic_cast could be better, but creates link issues
494  // (some basic_frame functions not found) on some platforms,
495  // so a static_cast is used.
496  EDA_BASE_FRAME* top = static_cast<EDA_BASE_FRAME*>( m_top );
497 
498  if( top )
499  top->ShowChangedLanguage();
500  }
501 #endif
502 
503  for( unsigned i=0; i < KIWAY_PLAYER_COUNT; ++i )
504  {
505  KIWAY_PLAYER* frame = GetPlayerFrame( ( FRAME_T )i );
506 
507  if( frame )
508  {
509  frame->ShowChangedLanguage();
510  }
511  }
512 }
#define KFCTL_CPP_PROJECT_SUITE
Am running under C++ project mgr, possibly with others.
Definition: kiway.h:159
LANGUAGE_DESCR LanguagesList[]
An array containing all the languages that KiCad supports.
Definition: pgm_base.cpp:72
KIWAY_PLAYER is a wxFrame capable of the OpenProjectFiles function, meaning it can load a portion of ...
Definition: kiway_player.h:61
void DisplayErrorMessage(wxWindow *aParent, const wxString &aText, const wxString &aExtraInfo)
Display an error message with aMessage.
Definition: confirm.cpp:253
KIWAY_PLAYER * GetPlayerFrame(FRAME_T aFrameType)
Definition: kiway.cpp:336
FRAME_T
Enum FRAME_T is the set of EDA_BASE_FRAME derivatives, typically stored in EDA_BASE_FRAME::m_Ident.
Definition: frame_type.h:34
int m_KI_Lang_Identifier
KiCad identifier used in menu selection (See id.h)
Definition: pgm_base.h:63
VTBL_ENTRY void SetLanguage(int aLanguage)
Function SetLanguage changes the language and then calls ShowChangedLanguage() on all KIWAY_PLAYERs.
Definition: kiway.cpp:447
KIWAY Kiway & Pgm(), KFCTL_STANDALONE
The global Program "get" accessor.
Definition: single_top.cpp:102
int m_ctl
Definition: kiway.h:439
wxString m_Lang_Label
Labels used in menus.
Definition: pgm_base.h:66
A logger class that filters out all log messages that are not generated by wxLogTrace and ignores the...
Definition: logging.h:31
void Format(OUTPUTFORMATTER *out, int aNestLevel, int aCtl, const CPTREE &aTree)
Function Format outputs a PTREE into s-expression format via an OUTPUTFORMATTER derivative.
Definition: ptree.cpp:200
#define _(s)
Definition: 3d_actions.cpp:33
The base frame for deriving all KiCad main window classes.
wxFrame * m_top
Definition: kiway.h:441
virtual void ShowChangedLanguage()
Redraw the menus and what not in current language.

References _, DisplayErrorMessage(), Format(), GetPlayerFrame(), KFCTL_CPP_PROJECT_SUITE, KIWAY_PLAYER_COUNT, LanguagesList, m_ctl, LANGUAGE_DESCR::m_KI_Lang_Identifier, LANGUAGE_DESCR::m_Lang_Label, m_top, Pgm(), SetLanguage(), and EDA_BASE_FRAME::ShowChangedLanguage().

Referenced by KICAD_MANAGER_FRAME::language_change(), KIWAY_PLAYER::language_change(), and SetLanguage().

◆ SetTop()

void KIWAY::SetTop ( wxFrame *  aTop)

Function SetTop tells this KIWAY about the top most frame in the program and optionally allows it to play the role of one of the KIWAY_PLAYERs if launched from single_top.cpp.

Parameters
aTopis the top most wxFrame in the entire program.

Definition at line 80 of file kiway.cpp.

81 {
82 #if 0
83  if( m_top )
84  {
85  m_top->Disconnect( wxEVT_DESTROY, wxWindowDestroyEventHandler( KIWAY::player_destroy_handler ), NULL, this );
86  }
87 
88  if( aTop )
89  {
90  aTop->Connect( wxEVT_DESTROY, wxWindowDestroyEventHandler( KIWAY::player_destroy_handler ), NULL, this );
91  }
92 #endif
93 
94  m_top = aTop;
95 }
#define NULL
wxFrame * m_top
Definition: kiway.h:441

References m_top, and NULL.

Referenced by KIWAY(), PGM_KICAD::OnPgmInit(), and PGM_SINGLE_TOP::OnPgmInit().

Friends And Related Function Documentation

◆ PGM_SINGLE_TOP

friend struct PGM_SINGLE_TOP
friend

Definition at line 275 of file kiway.h.

Member Data Documentation

◆ m_ctl

int KIWAY::m_ctl
private

◆ m_kiface

KIFACE * KIWAY::m_kiface
staticprivate

Definition at line 435 of file kiway.h.

Referenced by KiFACE(), OnKiwayEnd(), and set_kiface().

◆ m_kiface_version

int KIWAY::m_kiface_version
staticprivate

Definition at line 436 of file kiway.h.

Referenced by KiFACE().

◆ m_playerFrameName

wxArrayString KIWAY::m_playerFrameName
private

Definition at line 449 of file kiway.h.

Referenced by GetPlayerFrame(), KIWAY(), and Player().

◆ m_program

PGM_BASE* KIWAY::m_program
private

Definition at line 438 of file kiway.h.

Referenced by KiFACE().

◆ m_top

wxFrame* KIWAY::m_top
private

Definition at line 441 of file kiway.h.

Referenced by CommonSettingsChanged(), OnKiCadExit(), ProjectChanged(), SetLanguage(), and SetTop().


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