KiCad PCB EDA Suite
dialog_pcm.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) 2021 Andrew Lutsenko, anlutsenko at gmail dot com
5 * Copyright (C) 1992-2021 KiCad Developers, see AUTHORS.txt for contributors.
6 *
7 * This program is free software: you can redistribute it and/or modify it
8 * under the terms of the GNU General Public License as published by the
9 * Free Software Foundation, either version 3 of the License, or (at your
10 * option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful, but
13 * WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License along
18 * with this program. If not, see <http://www.gnu.org/licenses/>.
19 */
20
21// kicad_curl_easy.h **must be** included before any wxWidgets header to avoid conflicts
22// at least on Windows/msys2
24
25#include "bitmaps.h"
27#include "dialog_pcm.h"
28#include "grid_tricks.h"
29#include "ki_exception.h"
30#include "pcm_task_manager.h"
31#include "pgm_base.h"
34#include "thread"
35#include "widgets/wx_grid.h"
36
37#include <fstream>
38#include <launch_ext.h>
39#include <sstream>
40#include <vector>
41#include <wx/filedlg.h>
42#include <wx/msgdlg.h>
43
44
45#define GRID_CELL_MARGIN 4
46
47// Notes: These strings are static, so wxGetTranslation must be called to display the
48// transalted text
49static std::vector<std::pair<PCM_PACKAGE_TYPE, wxString>> PACKAGE_TYPE_LIST = {
50 { PT_PLUGIN, _( "Plugins (%d)" ) },
51 { PT_LIBRARY, _( "Libraries (%d)" ) },
52 { PT_COLORTHEME, _( "Color themes (%d)" ) },
53};
54
55
56DIALOG_PCM::DIALOG_PCM( wxWindow* parent, std::shared_ptr<PLUGIN_CONTENT_MANAGER> pcm ) :
57 DIALOG_PCM_BASE( parent ), m_pcm( pcm )
58{
60
61 m_pcm->SetDialogWindow( this );
62 m_pcm->StopBackgroundUpdate();
63
64 m_gridPendingActions->PushEventHandler( new GRID_TRICKS( m_gridPendingActions ) );
65
67 m_panelPending->Layout();
68
69 m_actionCallback = [this]( const PACKAGE_VIEW_DATA& aData, PCM_PACKAGE_ACTION aAction,
70 const wxString& aVersion )
71 {
72 if( aAction == PPA_UPDATE && m_pcm->IsPackagePinned( aData.package.identifier ) )
73 {
74 if( wxMessageBox( wxString::Format( _( "Are you sure you want to update pinned package "
75 "from version %s to %s?" ),
76 aData.current_version, aVersion ),
77 _( "Confirm update" ), wxICON_QUESTION | wxYES_NO, this )
78 == wxNO )
79 return;
80 }
81
82 m_gridPendingActions->Freeze();
83
84 PCM_PACKAGE_STATE new_state;
85
86 m_gridPendingActions->AppendRows();
87 int row = m_gridPendingActions->GetNumberRows() - 1;
88
89 m_gridPendingActions->SetCellValue( row, PENDING_COL_NAME, aData.package.name );
91
92 switch( aAction )
93 {
94 default:
95 case PPA_INSTALL:
96 m_gridPendingActions->SetCellValue( row, PENDING_COL_ACTION, _( "Install" ) );
97 m_gridPendingActions->SetCellValue( row, PENDING_COL_VERSION, aVersion );
98 new_state = PPS_PENDING_INSTALL;
99 break;
100
101 case PPA_UPDATE:
102 m_gridPendingActions->SetCellValue( row, PENDING_COL_ACTION, _( "Update" ) );
103 m_gridPendingActions->SetCellValue(
105 wxString::Format( wxT( "%s \u279C %s" ), aData.current_version, aVersion ) );
106 new_state = PPS_PENDING_UPDATE;
107 break;
108
109 case PPA_UNINSTALL:
110 m_gridPendingActions->SetCellValue( row, PENDING_COL_ACTION, _( "Uninstall" ) );
111 m_gridPendingActions->SetCellValue(
113 m_pcm->GetInstalledPackageVersion( aData.package.identifier ) );
114 new_state = PPS_PENDING_UNINSTALL;
115 break;
116 }
117
118 m_pendingActions.emplace_back( aAction, aData.repository_id, aData.package, aVersion );
119
120 m_gridPendingActions->Thaw();
121
123
124 updatePackageState( aData.package.identifier, new_state );
125 };
126
128 [this]( const wxString& aPackageId, const PCM_PACKAGE_STATE aState, const bool aPinned )
129 {
130 m_pcm->SetPinned( aPackageId, aPinned );
131
132 updatePackageState( aPackageId, aState );
133 };
134
137 m_panelInstalledHolder->GetSizer()->Add( m_installedPanel, 1, wxEXPAND );
138 m_panelInstalledHolder->Layout();
139
140 for( const std::pair<PCM_PACKAGE_TYPE, wxString>& entry : PACKAGE_TYPE_LIST )
141 {
144 wxString label = wxGetTranslation( entry.second );
145 m_contentNotebook->AddPage( panel, wxString::Format( label, 0 ) );
146 m_repositoryContentPanels.insert( { entry.first, panel } );
147 }
148
149 m_dialogNotebook->SetPageText( 0, wxString::Format( _( "Repository (%d)" ), 0 ) );
150
153
154 m_dialogNotebook->SetSelection( 0 );
155
156 SetupStandardButtons( { { wxID_OK, _( "Close" ) },
157 { wxID_APPLY, _( "Apply Pending Changes" ) },
158 { wxID_CANCEL, _( "Discard Pending Changes" ) } } );
159
160 Bind( wxEVT_CLOSE_WINDOW, &DIALOG_PCM::OnCloseWindow, this );
161 m_sdbSizer1Cancel->Bind( wxEVT_UPDATE_UI, &DIALOG_PCM::OnUpdateEventButtons, this );
162 m_sdbSizer1Apply->Bind( wxEVT_UPDATE_UI, &DIALOG_PCM::OnUpdateEventButtons, this );
163
165
166 for( int col = 0; col < m_gridPendingActions->GetNumberCols(); col++ )
167 {
168 const wxString& heading = m_gridPendingActions->GetColLabelValue( col );
169 int headingWidth = GetTextExtent( heading ).x + 2 * GRID_CELL_MARGIN;
170
171 // Set the minimal width to the column label size.
172 m_gridPendingActions->SetColMinimalWidth( col, headingWidth );
173 }
174
175 // fix sizers now widgets are set.
177}
178
179
181{
182 m_pcm->SaveInstalledPackages();
183 m_pcm->SetDialogWindow( nullptr );
184 m_pcm->RunBackgroundUpdate();
185
186 m_gridPendingActions->PopEventHandler( true );
187}
188
189
190void DIALOG_PCM::OnUpdateEventButtons( wxUpdateUIEvent& event )
191{
192 event.Enable( !m_pendingActions.empty() );
193}
194
195
196void DIALOG_PCM::OnCloseClicked( wxCommandEvent& event )
197{
198 if( m_pendingActions.size() == 0
199 || wxMessageBox( _( "Are you sure you want to close the package manager "
200 "and discard pending changes?" ),
201 _( "Plugin and Content Manager" ), wxICON_QUESTION | wxYES_NO, this )
202 == wxYES )
203 {
204 EndModal( wxID_OK );
205 }
206}
207
208
209void DIALOG_PCM::OnCloseWindow( wxCloseEvent& aEvent )
210{
211 wxCommandEvent dummy;
212
214}
215
216
217void DIALOG_PCM::OnManageRepositoriesClicked( wxCommandEvent& event )
218{
220
221 std::vector<std::pair<wxString, wxString>> dialog_data;
222 std::vector<std::tuple<wxString, wxString, wxString>> repo_list = m_pcm->GetRepositoryList();
223
224 for( const std::tuple<wxString, wxString, wxString>& repo : repo_list )
225 dialog_data.push_back( std::make_pair( std::get<1>( repo ), std::get<2>( repo ) ) );
226
227 dialog->SetData( dialog_data );
228
229 if( dialog->ShowModal() == wxID_SAVE )
230 {
231 dialog_data = dialog->GetData();
232 m_pcm->SetRepositoryList( dialog_data );
233
234 SETTINGS_MANAGER& mgr = Pgm().GetSettingsManager();
235 KICAD_SETTINGS* app_settings = mgr.GetAppSettings<KICAD_SETTINGS>();
236
237 app_settings->m_PcmRepositories = std::move( dialog_data );
238
240 }
241
242 dialog->Destroy();
243}
244
245
247{
248 std::vector<std::tuple<wxString, wxString, wxString>> repositories = m_pcm->GetRepositoryList();
249
250 m_choiceRepository->Clear();
251
252 for( const std::tuple<wxString, wxString, wxString>& entry : repositories )
253 {
254 m_choiceRepository->Append( std::get<1>( entry ),
255 new wxStringClientData( std::get<0>( entry ) ) );
256 }
257
258 if( repositories.size() > 0 )
259 {
260 m_choiceRepository->SetSelection( 0 );
261 m_selectedRepositoryId = std::get<0>( repositories[0] );
263 }
264 else
265 {
267 }
268}
269
270
271void DIALOG_PCM::OnRefreshClicked( wxCommandEvent& event )
272{
273 m_pcm->DiscardRepositoryCache( m_selectedRepositoryId );
275}
276
277
278void DIALOG_PCM::OnInstallFromFileClicked( wxCommandEvent& event )
279{
280 wxFileDialog open_file_dialog( this, _( "Choose package file" ), wxEmptyString, wxEmptyString,
281 "Zip files (*.zip)|*.zip", wxFD_OPEN | wxFD_FILE_MUST_EXIST );
282
283 if( open_file_dialog.ShowModal() == wxID_CANCEL )
284 return;
285
286 PCM_TASK_MANAGER task_manager( m_pcm );
287 task_manager.InstallFromFile( this, open_file_dialog.GetPath() );
288
290
291 if( !m_selectedRepositoryId.IsEmpty() )
293}
294
295
296void DIALOG_PCM::OnRepositoryChoice( wxCommandEvent& event )
297{
298 wxStringClientData* data = static_cast<wxStringClientData*>(
299 m_choiceRepository->GetClientObject( m_choiceRepository->GetSelection() ) );
300
301 m_selectedRepositoryId = data->GetData();
302
304}
305
306
307void DIALOG_PCM::setRepositoryData( const wxString& aRepositoryId )
308{
309 if( m_pcm->CacheRepository( aRepositoryId ) )
310 {
311 for( const auto& entry : m_repositoryContentPanels )
312 entry.second->ClearData();
313
314 m_packageBitmaps = m_pcm->GetRepositoryPackageBitmaps( aRepositoryId );
315
316 const std::vector<PCM_PACKAGE> packages = m_pcm->GetRepositoryPackages( aRepositoryId );
317
318 std::unordered_map<PCM_PACKAGE_TYPE, std::vector<PACKAGE_VIEW_DATA>> data;
319
320 for( const PCM_PACKAGE& pkg : packages )
321 {
322 PACKAGE_VIEW_DATA package_data( pkg );
323
324 if( m_packageBitmaps.count( package_data.package.identifier ) > 0 )
325 package_data.bitmap = &m_packageBitmaps.at( package_data.package.identifier );
326 else
327 package_data.bitmap = &m_defaultBitmap;
328
329 package_data.state = m_pcm->GetPackageState( aRepositoryId, pkg.identifier );
330
331 if( package_data.state == PPS_INSTALLED || package_data.state == PPS_UPDATE_AVAILABLE )
332 {
333 package_data.current_version = m_pcm->GetInstalledPackageVersion( pkg.identifier );
334 package_data.pinned = m_pcm->IsPackagePinned( pkg.identifier );
335 }
336
337 if( package_data.state == PPS_UPDATE_AVAILABLE )
338 package_data.update_version = m_pcm->GetPackageUpdateVersion( pkg );
339
340
341 for( const PENDING_ACTION& action : m_pendingActions )
342 {
343 if( action.package.identifier != pkg.identifier )
344 continue;
345
346 switch( action.action )
347 {
348 case PPA_INSTALL: package_data.state = PPS_PENDING_INSTALL; break;
349 case PPA_UPDATE: package_data.state = PPS_PENDING_UPDATE; break;
350 case PPA_UNINSTALL: package_data.state = PPS_PENDING_UNINSTALL; break;
351 }
352
353 break;
354 }
355
356 package_data.repository_id = aRepositoryId;
357 package_data.repository_name = m_choiceRepository->GetStringSelection();
358
359 data[pkg.type].emplace_back( package_data );
360 }
361
362 for( size_t i = 0; i < PACKAGE_TYPE_LIST.size(); i++ )
363 {
364 PCM_PACKAGE_TYPE type = PACKAGE_TYPE_LIST[i].first;
365 const wxString& label = PACKAGE_TYPE_LIST[i].second;
366 m_repositoryContentPanels[type]->SetData( data[type] );
367 m_contentNotebook->SetPageText(
368 i, wxString::Format( wxGetTranslation( label ), (int) data[type].size() ) );
369 }
370
371 m_dialogNotebook->SetPageText(
372 0, wxString::Format( _( "Repository (%d)" ), (int) packages.size() ) );
373 }
374}
375
376
378{
379 m_gridPendingActions->ClearSelection();
380 m_gridPendingActions->SelectRow( event.GetRow() );
381}
382
383
385{
386 m_dialogNotebook->SetPageText(
387 2, wxString::Format( _( "Pending (%d)" ), (int) m_pendingActions.size() ) );
388
389 for( int col = 0; col < m_gridPendingActions->GetNumberCols(); col++ )
390 {
391 // Set the width to see the full contents
393 }
394}
395
396
398{
400
401 const std::vector<PCM_INSTALLATION_ENTRY> installed = m_pcm->GetInstalledPackages();
402 std::vector<PACKAGE_VIEW_DATA> package_list;
403
404 m_installedBitmaps = m_pcm->GetInstalledPackageBitmaps();
405
406 for( const PCM_INSTALLATION_ENTRY& entry : installed )
407 {
408 PACKAGE_VIEW_DATA package_data( entry );
409
410 if( m_installedBitmaps.count( package_data.package.identifier ) > 0 )
411 package_data.bitmap = &m_installedBitmaps.at( package_data.package.identifier );
412 else
413 package_data.bitmap = &m_defaultBitmap;
414
415 package_data.state =
416 m_pcm->GetPackageState( entry.repository_id, entry.package.identifier );
417
418 if( package_data.state == PPS_UPDATE_AVAILABLE )
419 package_data.update_version = m_pcm->GetPackageUpdateVersion( entry.package );
420
421 package_list.emplace_back( package_data );
422 }
423
424 m_installedPanel->SetData( package_list );
425
426 m_dialogNotebook->SetPageText(
427 1, wxString::Format( _( "Installed (%d)" ), (int) package_list.size() ) );
428}
429
430
431void DIALOG_PCM::OnApplyChangesClicked( wxCommandEvent& event )
432{
433 if( m_pendingActions.size() == 0 )
434 return;
435
436 m_sdbSizer1OK->Disable();
437 m_sdbSizer1Apply->Disable();
438 m_sdbSizer1Cancel->Disable();
439
440 PCM_TASK_MANAGER task_manager( m_pcm );
441
442 for( const PENDING_ACTION& action : m_pendingActions )
443 {
444 if( action.action == PPA_UNINSTALL )
445 {
446 task_manager.Uninstall( action.package );
447 }
448 else
449 {
450 bool isUpdate = action.action == PPA_UPDATE;
451 task_manager.DownloadAndInstall( action.package, action.version, action.repository_id,
452 isUpdate );
453 }
454 }
455
456 task_manager.RunQueue( this );
457
458 m_sdbSizer1OK->Enable();
459 m_sdbSizer1Apply->Enable();
460 m_sdbSizer1Cancel->Enable();
461
463 wxCommandEvent dummy;
465
466 if( !m_selectedRepositoryId.IsEmpty() )
468}
469
470
471void DIALOG_PCM::OnDiscardChangesClicked( wxCommandEvent& event )
472{
473 m_gridPendingActions->Freeze();
474
475 for( int i = m_pendingActions.size() - 1; i >= 0; i-- )
476 discardAction( i );
477
479 m_gridPendingActions->Thaw();
480}
481
482
483void DIALOG_PCM::OnDiscardActionClicked( wxCommandEvent& event )
484{
485 wxArrayInt rows = m_gridPendingActions->GetSelectedRows();
486
487 std::sort( rows.begin(), rows.end(),
488 []( const int& a, const int& b )
489 {
490 return a > b;
491 } );
492
493 m_gridPendingActions->Freeze();
494
495 for( int row : rows )
496 discardAction( row );
497
499 m_gridPendingActions->Thaw();
500}
501
502
504{
505 m_gridPendingActions->DeleteRows( aIndex );
506
507 PENDING_ACTION action = m_pendingActions[aIndex];
508
509 PCM_PACKAGE_STATE state =
510 m_pcm->GetPackageState( action.repository_id, action.package.identifier );
511
512 updatePackageState( action.package.identifier, state );
513
514 m_pendingActions.erase( m_pendingActions.begin() + aIndex );
515}
516
517
518void DIALOG_PCM::updatePackageState( const wxString& aPackageId, const PCM_PACKAGE_STATE aState )
519{
520 bool pinned = m_pcm->IsPackagePinned( aPackageId );
521
522 m_installedPanel->SetPackageState( aPackageId, aState, pinned );
523
524 for( const auto& entry : m_repositoryContentPanels )
525 entry.second->SetPackageState( aPackageId, aState, pinned );
526}
527
528
529void DIALOG_PCM::OnOpenPackageDirClicked( wxCommandEvent& event )
530{
531 LaunchExternal( m_pcm->Get3rdPartyPath() );
532}
wxBitmap KiBitmap(BITMAPS aBitmap, int aHeightTag)
Construct a wxBitmap from an image identifier Returns the image from the active theme if the image ha...
Definition: bitmap.cpp:105
Implementing DIALOG_MANAGE_REPOSITORIES_BASE.
std::vector< std::pair< wxString, wxString > > GetData()
void SetData(const std::vector< std::pair< wxString, wxString > > &aData)
Class DIALOG_PCM_BASE.
wxChoice * m_choiceRepository
wxNotebook * m_contentNotebook
WX_GRID * m_gridPendingActions
wxButton * m_sdbSizer1OK
wxButton * m_sdbSizer1Cancel
wxBitmapButton * m_discardActionButton
wxNotebook * m_dialogNotebook
wxButton * m_sdbSizer1Apply
wxPanel * m_panelInstalledHolder
wxPanel * m_panelPending
ActionCallback m_actionCallback
Definition: dialog_pcm.h:100
void OnDiscardChangesClicked(wxCommandEvent &event) override
Switches to another repository.
Definition: dialog_pcm.cpp:471
std::unordered_map< wxString, wxBitmap > m_installedBitmaps
Definition: dialog_pcm.h:106
std::unordered_map< wxString, wxBitmap > m_packageBitmaps
Definition: dialog_pcm.h:105
void OnManageRepositoriesClicked(wxCommandEvent &event) override
Discards current repo cache, fetches it anew and displays.
Definition: dialog_pcm.cpp:217
void updatePackageState(const wxString &aPackageId, const PCM_PACKAGE_STATE aState)
Discards specified pending action.
Definition: dialog_pcm.cpp:518
void OnApplyChangesClicked(wxCommandEvent &event) override
Discards all pending changes.
Definition: dialog_pcm.cpp:431
void OnDiscardActionClicked(wxCommandEvent &event) override
Handles modification of the buttons' status.
Definition: dialog_pcm.cpp:483
void OnUpdateEventButtons(wxUpdateUIEvent &event)
Definition: dialog_pcm.cpp:190
std::unordered_map< PCM_PACKAGE_TYPE, PANEL_PACKAGES_VIEW * > m_repositoryContentPanels
Definition: dialog_pcm.h:103
void OnOpenPackageDirClicked(wxCommandEvent &event) override
Enqueues current pending actions in PCM_TASK_MANAGER and runs the queue.
Definition: dialog_pcm.cpp:529
PinCallback m_pinCallback
Definition: dialog_pcm.h:101
DIALOG_PCM(wxWindow *parent, std::shared_ptr< PLUGIN_CONTENT_MANAGER > pcm)
Constructor.
Definition: dialog_pcm.cpp:56
void updatePendingActionsTab()
Gets installed packages list from PCM and displays it on installed tab.
Definition: dialog_pcm.cpp:384
std::vector< PENDING_ACTION > m_pendingActions
Definition: dialog_pcm.h:123
void setRepositoryListFromPcm()
Updates pending actions tab caption and content-fits the grid.
Definition: dialog_pcm.cpp:246
void OnInstallFromFileClicked(wxCommandEvent &event) override
Opens local directory where packages are installed in file manager.
Definition: dialog_pcm.cpp:278
@ PENDING_COL_NAME
Definition: dialog_pcm.h:128
@ PENDING_COL_REPOSITORY
Definition: dialog_pcm.h:130
@ PENDING_COL_VERSION
Definition: dialog_pcm.h:129
@ PENDING_COL_ACTION
Definition: dialog_pcm.h:127
void OnCloseWindow(wxCloseEvent &aEvent)
Opens repository management dialog, saves changes to PCM.
Definition: dialog_pcm.cpp:209
std::shared_ptr< PLUGIN_CONTENT_MANAGER > m_pcm
Definition: dialog_pcm.h:99
void OnRepositoryChoice(wxCommandEvent &event) override
Selects the whole row in the grid if a cell is clicked.
Definition: dialog_pcm.cpp:296
wxString m_selectedRepositoryId
Definition: dialog_pcm.h:104
PANEL_PACKAGES_VIEW * m_installedPanel
Definition: dialog_pcm.h:102
~DIALOG_PCM()
Closes the window, asks user confirmation if there are pending actions.
Definition: dialog_pcm.cpp:180
void setInstalledPackages()
Reflects new state of the package in all panels where it is displayed.
Definition: dialog_pcm.cpp:397
void OnPendingActionsCellClicked(wxGridEvent &event) override
Discards selected pending actions.
Definition: dialog_pcm.cpp:377
void setRepositoryData(const wxString &aRepositoryId)
Gets package data from PCM and displays it on repository tab.
Definition: dialog_pcm.cpp:307
void discardAction(int aIndex)
Definition: dialog_pcm.cpp:503
wxBitmap m_defaultBitmap
Definition: dialog_pcm.h:107
void OnRefreshClicked(wxCommandEvent &event) override
Opens file selection dialog and installs selected package archive.
Definition: dialog_pcm.cpp:271
void OnCloseClicked(wxCommandEvent &event) override
Definition: dialog_pcm.cpp:196
void SetupStandardButtons(std::map< int, wxString > aLabels={})
void finishDialogSettings()
In all dialogs, we must call the same functions to fix minimal dlg size, the default position and per...
Add mouse and command handling (such as cut, copy, and paste) to a WX_GRID instance.
Definition: grid_tricks.h:61
std::vector< std::pair< wxString, wxString > > m_PcmRepositories
void ClearData()
Selects full row of the clicked cell.
void SetData(const std::vector< PACKAGE_VIEW_DATA > &aPackageData)
Recreates package panels and displays data.
void SetPackageState(const wxString &aPackageId, const PCM_PACKAGE_STATE aState, const bool aPinned)
Set the state of package.
Helper class that handles package (un)installation.
void InstallFromFile(wxWindow *aParent, const wxString &aFilePath)
Installs package from an archive file on disk.
void Uninstall(const PCM_PACKAGE &aPackage)
Enqueue package uninstallation.
void DownloadAndInstall(const PCM_PACKAGE &aPackage, const wxString &aVersion, const wxString &aRepositoryId, const bool isUpdate)
Enqueue package download and installation.
void RunQueue(wxWindow *aParent)
Run queue of pending actions.
T * GetAppSettings(bool aLoadNow=true)
Returns a handle to the a given settings by type If the settings have already been loaded,...
int GetVisibleWidth(int aCol, bool aHeader=true, bool aContents=true, bool aKeep=false)
Calculates the specified column based on the actual size of the text on screen.
Definition: wx_grid.cpp:282
#define GRID_CELL_MARGIN
Definition: dialog_pcm.cpp:45
static std::vector< std::pair< PCM_PACKAGE_TYPE, wxString > > PACKAGE_TYPE_LIST
Definition: dialog_pcm.cpp:49
#define _(s)
bool LaunchExternal(const wxString &aPath)
Launches the given file or folder in the host OS.
Definition: launch_ext.cpp:25
PCM_PACKAGE_STATE
Definition: pcm.h:55
@ PPS_INSTALLED
Definition: pcm.h:58
@ PPS_PENDING_UPDATE
Definition: pcm.h:62
@ PPS_UPDATE_AVAILABLE
Definition: pcm.h:61
@ PPS_PENDING_UNINSTALL
Definition: pcm.h:60
@ PPS_PENDING_INSTALL
Definition: pcm.h:59
PCM_PACKAGE_ACTION
Definition: pcm.h:68
@ PPA_UNINSTALL
Definition: pcm.h:70
@ PPA_UPDATE
Definition: pcm.h:71
@ PPA_INSTALL
Definition: pcm.h:69
PCM_PACKAGE_TYPE
< Supported package types
Definition: pcm_data.h:41
@ PT_COLORTHEME
Definition: pcm_data.h:45
@ PT_PLUGIN
Definition: pcm_data.h:43
@ PT_LIBRARY
Definition: pcm_data.h:44
see class PGM_BASE
void Format(OUTPUTFORMATTER *out, int aNestLevel, int aCtl, const CPTREE &aTree)
Output a PTREE into s-expression format via an OUTPUTFORMATTER derivative.
Definition: ptree.cpp:200
static LIB_SYMBOL * dummy()
Used to draw a dummy shape when a LIB_SYMBOL is not found in library.
Definition: sch_symbol.cpp:74
KIWAY Kiway & Pgm(), KFCTL_STANDALONE
The global Program "get" accessor.
Definition: single_top.cpp:111
< Collection of data relevant to the package display panel Callback for (un)install button
Definition: panel_package.h:31
wxString update_version
Definition: panel_package.h:39
wxString repository_id
Definition: panel_package.h:36
wxString current_version
Definition: panel_package.h:38
const PCM_PACKAGE package
Definition: panel_package.h:32
wxString repository_name
Definition: panel_package.h:37
wxBitmap * bitmap
Definition: panel_package.h:33
PCM_PACKAGE_STATE state
Definition: panel_package.h:34
Definition: pcm_data.h:138
Repository reference to a resource.
Definition: pcm_data.h:95
wxString identifier
Definition: pcm_data.h:99
wxString name
Definition: pcm_data.h:96