KiCad PCB EDA Suite
Loading...
Searching...
No Matches
common_control.cpp
Go to the documentation of this file.
1/*
2 * This program source code file is part of KiCad, a free EDA CAD application.
3 *
4 * Copyright (C) 2014-2016 CERN
5 * Copyright The KiCad Developers, see AUTHORS.txt for contributors.
6 * @author Maciej Suminski <[email protected]>
7 *
8 * This program is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public License
10 * as published by the Free Software Foundation; either version 2
11 * of the License, or (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, you may find one here:
20 * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
21 * or you may search the http://www.gnu.org website for the version 2 license,
22 * or you may write to the Free Software Foundation, Inc.,
23 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
24 */
25// kicad_curl_easy.h must be included before wxWidgets because on Windows (msys2), there are
26// collision with wx headers and curl.h defs
28
29#include <bitmaps.h>
30#include <build_version.h>
31#include <common.h> // for SearchHelpFileFullPath
32#include <pgm_base.h>
33#include <tool/actions.h>
34#include <tool/tool_manager.h>
35#include <eda_draw_frame.h>
36#include <view/view.h>
38#include <base_screen.h>
39#include <tool/common_control.h>
40#include <id.h>
41#include <kiface_base.h>
43#include <eda_doc.h>
44#include <wx/msgdlg.h>
45#include <executable_names.h>
46#include <gestfich.h>
48
49#define URL_GET_INVOLVED wxS( "https://go.kicad.org/contribute/" )
50#define URL_DONATE wxS( "https://go.kicad.org/app-donate" )
51#define URL_DOCUMENTATION wxS( "https://go.kicad.org/docs/" )
52
53
56 wxS( "https://gitlab.com/kicad/code/kicad/-/issues/new?issuable_template=bare&issue"
57 "[description]=%s" );
58
59
62 "```\n"
63 "%s\n"
64 "```" );
65
66
68{
69 m_frame = getEditFrame<EDA_BASE_FRAME>();
70}
71
72
74{
75 m_frame->ShowPreferences( wxEmptyString, wxEmptyString );
76 return 0;
77}
78
79
81{
82 // If _pcbnew.kiface is running have it put up the dialog so the 3D paths can also
83 // be edited
84 if( KIFACE* pcbnew = m_frame->Kiway().KiFACE( KIWAY::FACE_PCB, false ) )
85 {
86 try
87 {
88 pcbnew->CreateKiWindow( m_frame, DIALOG_CONFIGUREPATHS, &m_frame->Kiway() );
89 }
90 catch( ... )
91 {
92 // Do nothing here.
93 // A error message is displayed after trying to load _pcbnew.kiface.
94 }
95 }
96 else
97 {
99
100 if( dlg.ShowModal() == wxID_OK )
102 }
103
104 return 0;
105}
106
107
109{
111 {
112 try // Sch frame was not available, try to start it
113 {
116 }
117 catch( ... )
118 {
119 // _eeschema.kiface is not available: it contains the library table dialog.
120 // Do nothing here.
121 // A error message is displayed after trying to load _eeschema.kiface.
122 }
123 }
124 else if( aEvent.IsAction( &ACTIONS::showFootprintLibTable ) )
125 {
126 try // Pcb frame was not available, try to start it
127 {
130 }
131 catch( ... )
132 {
133 // _pcbnew.kiface is not available: it contains the library table dialog.
134 // Do nothing here.
135 // A error message is displayed after trying to load _pcbnew.kiface.
136 }
137 }
138 else if( aEvent.IsAction( &ACTIONS::showDesignBlockLibTable ) )
139 {
140 try // Kicad frame was not available, try to start it
141 {
144 &m_frame->Kiway() );
145 }
146 catch( ... )
147 {
148 // _eeschema.kiface is not available: it contains the library table dialog.
149 // Do nothing here.
150 // A error message is displayed after trying to load _eeschema.kiface.
151 }
152 }
153
154 return 0;
155}
156
157
159{
160 // Needed on Windows, other platforms do not use it, but it creates no issue
161 if( aFrame->IsIconized() )
162 aFrame->Iconize( false );
163
164 aFrame->Raise();
165
166 // Raising the window does not set the focus on Linux. This should work on
167 // any platform.
168 if( wxWindow::FindFocus() != aFrame )
169 aFrame->SetFocus();
170
171 // If the player is currently blocked, focus the user attention on the correct window
172 if( wxWindow* blocking_win = aFrame->Kiway().GetBlockingDialog() )
173 {
174 blocking_win->Raise();
175 blocking_win->SetFocus();
176 }
177}
178
179
181{
182 FRAME_T playerType = aEvent.Parameter<FRAME_T>();
183 KIWAY_PLAYER* editor = m_frame->Kiway().Player( playerType, true );
184
185 // editor can be null if Player() fails:
186 wxCHECK_MSG( editor != nullptr, 0, wxT( "Cannot open/create the editor frame" ) );
187
188 showFrame( editor );
189
190 return 0;
191}
192
193
194class TERMINATE_HANDLER : public wxProcess
195{
196public:
197 TERMINATE_HANDLER( const wxString& appName )
198 { }
199
200 void OnTerminate( int pid, int status ) override
201 {
202 delete this;
203 }
204};
205
206
207int COMMON_CONTROL::Execute( const wxString& aExecutible, const wxString& aParam )
208{
209 TERMINATE_HANDLER* callback = new TERMINATE_HANDLER( aExecutible );
210
211 long pid = ExecuteFile( aExecutible, aParam, callback );
212
213 if( pid > 0 )
214 {
215#ifdef __WXMAC__
216 wxString script;
217
218 script.Printf( wxS( "tell application \"System Events\" to tell application process \"%s\"\n"
219 " set frontmost to true\n"
220 "end tell" ),
221 aExecutible );
222
223 // This non-parameterized use of wxExecute is fine because script is not derived
224 // from user input.
225 wxExecute( wxString::Format( "osascript -e '%s'", script ) );
226#endif
227 }
228 else
229 {
230 delete callback;
231 }
232
233 return 0;
234}
235
236
238{
239 wxString execFile;
240 wxString param;
241
243 execFile = PCB_CALCULATOR_EXE;
244 else
245 wxFAIL_MSG( "Execute(): unexpected request" );
246
247 if( execFile.IsEmpty() )
248 return 0;
249
250 if( aEvent.Parameter<wxString*>() )
251 param = *aEvent.Parameter<wxString*>();
252
253 return Execute( execFile, param );
254}
255
256
258{
259 // Note: dynamic_cast doesn't work over the Kiway() on MacOS. We have to use static_cast
260 // here.
261 EDA_BASE_FRAME* top = static_cast<EDA_BASE_FRAME*>( m_frame->Kiway().GetTop() );
262
263 if( top && top->GetFrameType() == KICAD_MAIN_FRAME_T )
264 {
265 showFrame( top );
266 }
267 else
268 {
269 wxMessageDialog( m_frame, _( "Can not switch to project manager in stand-alone mode." ) );
270 }
271
272 return 0;
273}
274
275
277{
278 wxString helpFile;
279 wxString msg;
280
281 // the URL of help files is "https://go.kicad.org/docs/<version>/<language>/<name>/"
282 const wxString baseUrl = URL_DOCUMENTATION + GetMajorMinorVersion() + wxT( "/" )
283 + Pgm().GetLocale()->GetName().BeforeLast( '_' ) + wxT( "/" );
284
285 /* We have to get document for beginners,
286 * or the full specific doc
287 * if event id is wxID_INDEX, we want the document for beginners.
288 * else the specific doc file (its name is in Kiface().GetHelpFileName())
289 * The document for beginners is the same for all KiCad utilities
290 */
291 if( aEvent.IsAction( &ACTIONS::gettingStarted ) )
292 {
293 // List of possible names for Getting Started in KiCad
294 const wxChar* names[2] = {
295 wxT( "getting_started_in_kicad" ),
296 wxT( "Getting_Started_in_KiCad" )
297 };
298
299 // Search for "getting_started_in_kicad.html" or "getting_started_in_kicad.pdf"
300 // or "Getting_Started_in_KiCad.html" or "Getting_Started_in_KiCad.pdf"
301 for( auto& name : names )
302 {
303 helpFile = SearchHelpFileFullPath( name );
304
305 if( !helpFile.IsEmpty() )
306 break;
307 }
308
309 if( !helpFile )
310 {
311 msg = wxString::Format( _( "Help file '%s' or\n'%s' could not be found.\n"
312 "Do you want to access the KiCad online help?" ),
313 names[0], names[1] );
314 wxMessageDialog dlg( nullptr, msg, _( "File Not Found" ),
315 wxYES_NO | wxNO_DEFAULT | wxCANCEL );
316
317 if( dlg.ShowModal() != wxID_YES )
318 return -1;
319
320 helpFile = baseUrl + names[0] + wxS( "/" );
321 }
322 }
323 else
324 {
325 wxString base_name = m_frame->help_name();
326
327 helpFile = SearchHelpFileFullPath( base_name );
328
329 if( !helpFile )
330 {
331 msg = wxString::Format( _( "Help file '%s' could not be found.\n"
332 "Do you want to access the KiCad online help?" ),
333 base_name );
334 wxMessageDialog dlg( nullptr, msg, _( "File Not Found" ),
335 wxYES_NO | wxNO_DEFAULT | wxCANCEL );
336
337 if( dlg.ShowModal() != wxID_YES )
338 return -1;
339
340 helpFile = baseUrl + base_name + wxS( "/" );
341 }
342 }
343
344 GetAssociatedDocument( m_frame, helpFile, &m_frame->Prj() );
345 return 0;
346}
347
348
350{
351 void ShowAboutDialog( EDA_BASE_FRAME * aParent ); // See AboutDialog_main.cpp
353 return 0;
354}
355
356
358{
360 return 0;
361}
362
363
365{
366 if( !wxLaunchDefaultBrowser( URL_GET_INVOLVED ) )
367 {
368 wxString msg;
369 msg.Printf( _( "Could not launch the default browser.\n"
370 "For information on how to help the KiCad project, visit %s" ),
372 wxMessageBox( msg, _( "Get involved with KiCad" ), wxOK, m_frame );
373 }
374
375 return 0;
376}
377
378
380{
381 if( !wxLaunchDefaultBrowser( URL_DONATE ) )
382 {
383 wxString msg;
384 msg.Printf( _( "Could not launch the default browser.\n"
385 "To donate to the KiCad project, visit %s" ),
386 URL_DONATE );
387 wxMessageBox( msg, _( "Donate to KiCad" ), wxOK, m_frame );
388 }
389
390 return 0;
391}
392
393
395{
397 return 0;
398
399 wxString version = GetVersionInfoData( m_frame->GetUntranslatedAboutTitle(), false, true );
400
401 wxString message;
402 message.Printf( m_bugReportTemplate, version );
403
404 KICAD_CURL_EASY kcurl;
405 wxString url_string;
406 url_string.Printf( m_bugReportUrl, kcurl.Escape( std::string( message.utf8_str() ) ) );
407
408 wxLaunchDefaultBrowser( url_string );
409
410 return 0;
411}
412
413
415{
427
434 Go( &COMMON_CONTROL::About, ACTIONS::about.MakeEvent() );
435}
436
437
void ShowAboutDialog(EDA_BASE_FRAME *aParent)
const char * name
Definition: DXF_plotter.cpp:62
BASE_SCREEN class implementation.
wxString GetMajorMinorVersion()
Get only the major and minor version in a string major.minor.
wxString GetVersionInfoData(const wxString &aTitle, bool aHtml, bool aBrief)
Create a version info string for bug reports and the about dialog.
static TOOL_ACTION showCalculatorTools
Definition: actions.h:259
static TOOL_ACTION about
Definition: actions.h:283
static TOOL_ACTION reportBug
Definition: actions.h:287
static TOOL_ACTION showSymbolLibTable
Definition: actions.h:278
static TOOL_ACTION showSymbolEditor
Definition: actions.h:256
static TOOL_ACTION showSymbolBrowser
Definition: actions.h:255
static TOOL_ACTION donate
Definition: actions.h:285
static TOOL_ACTION listHotKeys
Definition: actions.h:284
static TOOL_ACTION openPreferences
Definition: actions.h:276
static TOOL_ACTION getInvolved
Definition: actions.h:286
static TOOL_ACTION showFootprintLibTable
Definition: actions.h:279
static TOOL_ACTION showDesignBlockLibTable
Definition: actions.h:280
static TOOL_ACTION showFootprintEditor
Definition: actions.h:258
static TOOL_ACTION configurePaths
Definition: actions.h:277
static TOOL_ACTION showProjectManager
Definition: actions.h:253
static TOOL_ACTION gettingStarted
Definition: actions.h:281
static TOOL_ACTION showFootprintBrowser
Definition: actions.h:257
static TOOL_ACTION help
Definition: actions.h:282
int ConfigurePaths(const TOOL_EVENT &aEvent)
int ShowHelp(const TOOL_EVENT &aEvent)
EDA_BASE_FRAME * m_frame
< Pointer to the currently used edit frame.
int ShowLibraryTable(const TOOL_EVENT &aEvent)
int About(const TOOL_EVENT &aEvent)
int ListHotKeys(const TOOL_EVENT &aEvent)
static wxString m_bugReportUrl
URL to launch a new issue with pre-populated description.
int GetInvolved(const TOOL_EVENT &aEvent)
int ShowProjectManager(const TOOL_EVENT &aEvent)
int Execute(const TOOL_EVENT &aEvent)
int ReportBug(const TOOL_EVENT &aEvent)
Sets up handlers for various events.
int ShowPlayer(const TOOL_EVENT &aEvent)
int Donate(const TOOL_EVENT &aEvent)
void Reset(RESET_REASON aReason) override
Bring the tool to a known, initial state.
int OpenPreferences(const TOOL_EVENT &aEvent)
static wxString m_bugReportTemplate
Issue template to use for reporting bugs (this should not be translated)
void setTransitions() override
This method is meant to be overridden in order to specify handlers for events.
int ShowModal() override
The base frame for deriving all KiCad main window classes.
virtual wxString help_name()
FRAME_T GetFrameType() const
const wxString & GetUntranslatedAboutTitle() const
void ShowPreferences(wxString aStartPage, wxString aStartParentPage)
Display the preferences and settings of all opened editors paged dialog, starting with a particular p...
std::string Escape(const std::string &aUrl)
Escapes a string for use as a URL.
PROJECT & Prj() const
Return a reference to the PROJECT associated with this KIWAY.
KIWAY & Kiway() const
Return a reference to the KIWAY that this object has an opportunity to participate in.
Definition: kiway_holder.h:55
A wxFrame capable of the OpenProjectFiles function, meaning it can load a portion of a KiCad project.
Definition: kiway_player.h:65
virtual KIWAY_PLAYER * Player(FRAME_T aFrameType, bool doCreate=true, wxTopLevelWindow *aParent=nullptr)
Return the KIWAY_PLAYER* given a FRAME_T.
Definition: kiway.cpp:406
wxWindow * GetBlockingDialog()
Gets the window pointer to the blocking dialog (to send it signals)
Definition: kiway.cpp:670
wxFrame * GetTop()
Definition: kiway.h:427
virtual KIFACE * KiFACE(FACE_T aFaceId, bool doLoad=true)
Return the KIFACE* given a FACE_T.
Definition: kiway.cpp:201
@ FACE_SCH
eeschema DSO
Definition: kiway.h:292
@ FACE_PCB
pcbnew DSO
Definition: kiway.h:293
virtual void CommonSettingsChanged(int aFlags=0)
Call CommonSettingsChanged() on all KIWAY_PLAYERs.
Definition: kiway.cpp:617
virtual wxLocale * GetLocale()
Definition: pgm_base.h:174
void OnTerminate(int pid, int status) override
TERMINATE_HANDLER(const wxString &appName)
RESET_REASON
Determine the reason of reset for a tool.
Definition: tool_base.h:78
Generic, UI-independent tool event.
Definition: tool_event.h:168
bool IsAction(const TOOL_ACTION *aAction) const
Test if the event contains an action issued upon activation of the given TOOL_ACTION.
Definition: tool_event.cpp:82
T Parameter() const
Return a parameter assigned to the event.
Definition: tool_event.h:465
void Go(int(T::*aStateFunc)(const TOOL_EVENT &), const TOOL_EVENT_LIST &aConditions=TOOL_EVENT(TC_ANY, TA_ANY))
Define which state (aStateFunc) to go when a certain event arrives (aConditions).
bool WarnUserIfOperatingSystemUnsupported()
Checks if the operating system is explicitly unsupported and displays a disclaimer message box.
Definition: common.cpp:701
The common library.
#define URL_DONATE
#define URL_DOCUMENTATION
void showFrame(EDA_BASE_FRAME *aFrame)
#define URL_GET_INVOLVED
#define _(s)
bool GetAssociatedDocument(wxWindow *aParent, const wxString &aDocName, PROJECT *aProject, SEARCH_STACK *aPaths, std::vector< EMBEDDED_FILES * > aFilesStack)
Open a document (file) with the suitable browser.
Definition: eda_doc.cpp:62
This file is part of the common library.
KiCad executable names.
const wxString PCB_CALCULATOR_EXE
FRAME_T
The set of EDA_BASE_FRAME derivatives, typically stored in EDA_BASE_FRAME::m_Ident.
Definition: frame_type.h:33
@ DIALOG_PCB_LIBRARY_TABLE
Definition: frame_type.h:125
@ DIALOG_SCH_LIBRARY_TABLE
Definition: frame_type.h:124
@ DIALOG_CONFIGUREPATHS
Definition: frame_type.h:122
@ DIALOG_DESIGN_BLOCK_LIBRARY_TABLE
Definition: frame_type.h:123
@ KICAD_MAIN_FRAME_T
Definition: frame_type.h:68
int ExecuteFile(const wxString &aEditorName, const wxString &aFileName, wxProcess *aCallback, bool aFileForKicad)
Call the executable file aEditorName with the parameter aFileName.
Definition: gestfich.cpp:143
void DisplayHotkeyList(EDA_BASE_FRAME *aParent)
Display the current hotkey list.
Common command IDs shared by more than one of the KiCad applications.
PGM_BASE & Pgm()
The global program "get" accessor.
Definition: pgm_base.cpp:1071
see class PGM_BASE
wxString SearchHelpFileFullPath(const wxString &aBaseName)
Return the help file's full path.
wxWindow * CreateKiWindow(wxWindow *aParent, int aClassId, KIWAY *aKiway, int aCtlBits=0) override
Create a wxWindow for the current project.
Implement a participant in the KIWAY alchemy.
Definition: kiway.h:152
IFACE KIFACE_BASE kiface("pcb_test_frame", KIWAY::FACE_PCB)
#define ENVVARS_CHANGED
Definition: tools_holder.h:152