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 (C) 2021-2022 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
46#define URL_GET_INVOLVED wxS( "https://kicad.org/contribute/" )
47#define URL_DONATE wxS( "https://go.kicad.org/app-donate" )
48#define URL_DOCUMENTATION wxS( "https://docs.kicad.org/" )
49
50
53 wxS( "https://gitlab.com/kicad/code/kicad/-/issues/new?issuable_template=bare&issue[description]=%s" );
54
55
58 "```\n"
59 "%s\n"
60 "```" );
61
62
64{
65 m_frame = getEditFrame<EDA_BASE_FRAME>();
66}
67
68
70{
71 m_frame->ShowPreferences( wxEmptyString, wxEmptyString );
72 return 0;
73}
74
75
77{
78 // If _pcbnew.kiface is running have it put up the dialog so the 3D paths can also
79 // be edited
81
82 if( pcbnew )
83 {
84 try
85 {
86 pcbnew->CreateKiWindow( m_frame, DIALOG_CONFIGUREPATHS, &m_frame->Kiway() );
87 }
88 catch( ... )
89 {
90 // Do nothing here.
91 // A error message is displayed after trying to load _pcbnew.kiface.
92 }
93 }
94 else
95 {
97
98 if( dlg.ShowModal() == wxID_OK )
99 m_frame->Kiway().CommonSettingsChanged( true, false );
100 }
101
102 return 0;
103}
104
105
107{
109 {
110 try // Sch frame was not available, try to start it
111 {
113
114 if( kiface )
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 {
129
130 if( kiface )
132 }
133 catch( ... )
134 {
135 // _pcbnew.kiface is not available: it contains the library table dialog.
136 // Do nothing here.
137 // A error message is displayed after trying to load _pcbnew.kiface.
138 }
139 }
140 else if( aEvent.IsAction( &ACTIONS::showDesignBlockLibTable ) )
141 {
142 try // Kicad frame was not available, try to start it
143 {
145
146 if( kiface )
148 }
149 catch( ... )
150 {
151 // _eeschema.kiface is not available: it contains the library table dialog.
152 // Do nothing here.
153 // A error message is displayed after trying to load _eeschema.kiface.
154 }
155 }
156
157 return 0;
158}
159
160
162{
163 // Needed on Windows, other platforms do not use it, but it creates no issue
164 if( aFrame->IsIconized() )
165 aFrame->Iconize( false );
166
167 aFrame->Raise();
168
169 // Raising the window does not set the focus on Linux. This should work on
170 // any platform.
171 if( wxWindow::FindFocus() != aFrame )
172 aFrame->SetFocus();
173
174 // If the player is currently blocked, focus the user attention on the correct window
175 if( wxWindow* blocking_win = aFrame->Kiway().GetBlockingDialog() )
176 {
177 blocking_win->Raise();
178 blocking_win->SetFocus();
179 }
180}
181
182
184{
185 FRAME_T playerType = aEvent.Parameter<FRAME_T>();
186 KIWAY_PLAYER* editor = m_frame->Kiway().Player( playerType, true );
187
188 // editor can be null if Player() fails:
189 wxCHECK_MSG( editor != nullptr, 0, wxT( "Cannot open/create the editor frame" ) );
190
191 showFrame( editor );
192
193 return 0;
194}
195
196
198{
199 // Note: dynamic_cast doesn't work over the Kiway() on MacOS. We have to use static_cast
200 // here.
201 EDA_BASE_FRAME* top = static_cast<EDA_BASE_FRAME*>( m_frame->Kiway().GetTop() );
202
203 if( top && top->GetFrameType() == KICAD_MAIN_FRAME_T )
204 {
205 showFrame( top );
206 }
207 else
208 {
209 wxMessageDialog( m_frame, _( "Can not switch to project manager in stand-alone mode." ) );
210 }
211
212 return 0;
213}
214
215
217{
218 wxString helpFile;
219 wxString msg;
220
221 // the URL of help files is "https://docs.kicad.org/<version>/<language>/<name>/"
222 const wxString baseUrl = URL_DOCUMENTATION + GetMajorMinorVersion() + wxT( "/" )
223 + Pgm().GetLocale()->GetName().BeforeLast( '_' ) + wxT( "/" );
224
225 /* We have to get document for beginners,
226 * or the full specific doc
227 * if event id is wxID_INDEX, we want the document for beginners.
228 * else the specific doc file (its name is in Kiface().GetHelpFileName())
229 * The document for beginners is the same for all KiCad utilities
230 */
231 if( aEvent.IsAction( &ACTIONS::gettingStarted ) )
232 {
233 // List of possible names for Getting Started in KiCad
234 const wxChar* names[2] = {
235 wxT( "getting_started_in_kicad" ),
236 wxT( "Getting_Started_in_KiCad" )
237 };
238
239 // Search for "getting_started_in_kicad.html" or "getting_started_in_kicad.pdf"
240 // or "Getting_Started_in_KiCad.html" or "Getting_Started_in_KiCad.pdf"
241 for( auto& name : names )
242 {
243 helpFile = SearchHelpFileFullPath( name );
244
245 if( !helpFile.IsEmpty() )
246 break;
247 }
248
249 if( !helpFile )
250 {
251 msg = wxString::Format( _( "Help file '%s' or\n'%s' could not be found.\n"
252 "Do you want to access the KiCad online help?" ),
253 names[0], names[1] );
254 wxMessageDialog dlg( nullptr, msg, _( "File Not Found" ),
255 wxYES_NO | wxNO_DEFAULT | wxCANCEL );
256
257 if( dlg.ShowModal() != wxID_YES )
258 return -1;
259
260 helpFile = baseUrl + names[0] + wxS( "/" );
261 }
262 }
263 else
264 {
265 wxString base_name = m_frame->help_name();
266
267 helpFile = SearchHelpFileFullPath( base_name );
268
269 if( !helpFile )
270 {
271 msg = wxString::Format( _( "Help file '%s' could not be found.\n"
272 "Do you want to access the KiCad online help?" ),
273 base_name );
274 wxMessageDialog dlg( nullptr, msg, _( "File Not Found" ),
275 wxYES_NO | wxNO_DEFAULT | wxCANCEL );
276
277 if( dlg.ShowModal() != wxID_YES )
278 return -1;
279
280 helpFile = baseUrl + base_name + wxS( "/" );
281 }
282 }
283
284 GetAssociatedDocument( m_frame, helpFile, &m_frame->Prj() );
285 return 0;
286}
287
288
290{
291 void ShowAboutDialog( EDA_BASE_FRAME * aParent ); // See AboutDialog_main.cpp
293 return 0;
294}
295
296
298{
300 return 0;
301}
302
303
305{
306 if( !wxLaunchDefaultBrowser( URL_GET_INVOLVED ) )
307 {
308 wxString msg;
309 msg.Printf( _( "Could not launch the default browser.\n"
310 "For information on how to help the KiCad project, visit %s" ),
312 wxMessageBox( msg, _( "Get involved with KiCad" ), wxOK, m_frame );
313 }
314
315 return 0;
316}
317
318
320{
321 if( !wxLaunchDefaultBrowser( URL_DONATE ) )
322 {
323 wxString msg;
324 msg.Printf( _( "Could not launch the default browser.\n"
325 "To donate to the KiCad project, visit %s" ),
326 URL_DONATE );
327 wxMessageBox( msg, _( "Donate to KiCad" ), wxOK, m_frame );
328 }
329
330 return 0;
331}
332
333
335{
337 return 0;
338
339 wxString version = GetVersionInfoData( m_frame->GetUntranslatedAboutTitle(), false, true );
340
341 wxString message;
342 message.Printf( m_bugReportTemplate, version );
343
344 KICAD_CURL_EASY kcurl;
345 wxString url_string;
346 url_string.Printf( m_bugReportUrl, kcurl.Escape( std::string( message.utf8_str() ) ) );
347
348 wxLaunchDefaultBrowser( url_string );
349
350 return 0;
351}
352
353
355{
366
373 Go( &COMMON_CONTROL::About, ACTIONS::about.MakeEvent() );
374}
375
376
void ShowAboutDialog(EDA_BASE_FRAME *aParent)
const char * name
Definition: DXF_plotter.cpp:57
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 about
Definition: actions.h:234
static TOOL_ACTION reportBug
Definition: actions.h:238
static TOOL_ACTION showSymbolLibTable
Definition: actions.h:229
static TOOL_ACTION showSymbolEditor
Definition: actions.h:211
static TOOL_ACTION showSymbolBrowser
Definition: actions.h:210
static TOOL_ACTION donate
Definition: actions.h:236
static TOOL_ACTION listHotKeys
Definition: actions.h:235
static TOOL_ACTION openPreferences
Definition: actions.h:227
static TOOL_ACTION getInvolved
Definition: actions.h:237
static TOOL_ACTION showFootprintLibTable
Definition: actions.h:230
static TOOL_ACTION showDesignBlockLibTable
Definition: actions.h:231
static TOOL_ACTION showFootprintEditor
Definition: actions.h:213
static TOOL_ACTION configurePaths
Definition: actions.h:228
static TOOL_ACTION showProjectManager
Definition: actions.h:208
static TOOL_ACTION gettingStarted
Definition: actions.h:232
static TOOL_ACTION showFootprintBrowser
Definition: actions.h:212
static TOOL_ACTION help
Definition: actions.h:233
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 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)
Displays the preferences and settings of all opened editors paged dialog, starting with a particular ...
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 void CommonSettingsChanged(bool aEnvVarsChanged, bool aTextVarsChanged)
Call CommonSettingsChanged() on all KIWAY_PLAYERs.
Definition: kiway.cpp:617
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:669
wxFrame * GetTop()
Definition: kiway.h:426
virtual KIFACE * KiFACE(FACE_T aFaceId, bool doLoad=true)
Return the KIFACE* given a FACE_T.
Definition: kiway.cpp:202
@ FACE_SCH
eeschema DSO
Definition: kiway.h:291
@ FACE_PCB
pcbnew DSO
Definition: kiway.h:292
virtual wxLocale * GetLocale()
Definition: pgm_base.h:185
RESET_REASON
Determine the reason of reset for a tool.
Definition: tool_base.h:78
Generic, UI-independent tool event.
Definition: tool_event.h:167
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:460
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:696
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, EMBEDDED_FILES *aFiles)
Open a document (file) with the suitable browser.
Definition: eda_doc.cpp:62
This file is part of the common library.
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:117
@ DIALOG_SCH_LIBRARY_TABLE
Definition: frame_type.h:116
@ DIALOG_CONFIGUREPATHS
Definition: frame_type.h:114
@ DIALOG_DESIGN_BLOCK_LIBRARY_TABLE
Definition: frame_type.h:115
@ KICAD_MAIN_FRAME_T
Definition: frame_type.h:68
void DisplayHotkeyList(EDA_BASE_FRAME *aParent)
Display the current hotkey list.
PGM_BASE & Pgm()
The global Program "get" accessor.
Definition: pgm_base.cpp:1060
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:151
IFACE KIFACE_BASE kiface("pcb_test_frame", KIWAY::FACE_PCB)