KiCad PCB EDA Suite
Loading...
Searching...
No Matches
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-2022 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 ),
58 m_pcm( pcm )
59{
60 // correct the min size from wxfb with fromdip
61 SetMinSize( FromDIP( GetMinSize() ) );
62
63 SetDoubleBuffered( true );
64
65 m_defaultBitmap = KiBitmap( BITMAPS::icon_pcm );
66
67 m_pcm->SetDialogWindow( this );
68 m_pcm->StopBackgroundUpdate();
69
70 m_gridPendingActions->PushEventHandler( new GRID_TRICKS( m_gridPendingActions ) );
71
72 m_discardActionButton->SetBitmap( KiBitmapBundle( BITMAPS::small_trash ) );
73 m_panelPending->Layout();
74
75 m_actionCallback = [this]( const PACKAGE_VIEW_DATA& aData, PCM_PACKAGE_ACTION aAction,
76 const wxString& aVersion )
77 {
78 if( aAction == PPA_UPDATE && m_pcm->IsPackagePinned( aData.package.identifier ) )
79 {
80 if( wxMessageBox( wxString::Format( _( "Are you sure you want to update pinned package "
81 "from version %s to %s?" ),
82 aData.current_version, aVersion ),
83 _( "Confirm update" ), wxICON_QUESTION | wxYES_NO, this )
84 == wxNO )
85 {
86 return;
87 }
88 }
89
90 m_gridPendingActions->Freeze();
91
92 PCM_PACKAGE_STATE new_state;
93
94 m_gridPendingActions->AppendRows();
95 int row = m_gridPendingActions->GetNumberRows() - 1;
96
97 m_gridPendingActions->SetCellValue( row, PENDING_COL_NAME, aData.package.name );
99
100 switch( aAction )
101 {
102 default:
103 case PPA_INSTALL:
104 m_gridPendingActions->SetCellValue( row, PENDING_COL_ACTION, _( "Install" ) );
105 m_gridPendingActions->SetCellValue( row, PENDING_COL_VERSION, aVersion );
106 new_state = PPS_PENDING_INSTALL;
107 break;
108
109 case PPA_UPDATE:
110 m_gridPendingActions->SetCellValue( row, PENDING_COL_ACTION, _( "Update" ) );
111 m_gridPendingActions->SetCellValue(
113 wxString::Format( wxT( "%s \u279C %s" ), aData.current_version, aVersion ) );
114 new_state = PPS_PENDING_UPDATE;
115 break;
116
117 case PPA_UNINSTALL:
118 m_gridPendingActions->SetCellValue( row, PENDING_COL_ACTION, _( "Uninstall" ) );
119 m_gridPendingActions->SetCellValue(
121 m_pcm->GetInstalledPackageVersion( aData.package.identifier ) );
122 new_state = PPS_PENDING_UNINSTALL;
123 break;
124 }
125
126 m_pendingActions.emplace_back( aAction, aData.repository_id, aData.package, aVersion );
127
128 m_gridPendingActions->Thaw();
129
131
132 updatePackageState( aData.package.identifier, new_state );
133 };
134
136 [this]( const wxString& aPackageId, const PCM_PACKAGE_STATE aState, const bool aPinned )
137 {
138 m_pcm->SetPinned( aPackageId, aPinned );
139
140 updatePackageState( aPackageId, aState );
141 };
142
145 m_panelInstalledHolder->GetSizer()->Add( m_installedPanel, 1, wxEXPAND );
146 m_panelInstalledHolder->Layout();
147
148 for( const std::pair<PCM_PACKAGE_TYPE, wxString>& entry : PACKAGE_TYPE_LIST )
149 {
152 wxString label = wxGetTranslation( entry.second );
153 m_contentNotebook->AddPage( panel, wxString::Format( label, 0 ) );
154 m_repositoryContentPanels.insert( { entry.first, panel } );
155 }
156
157 m_dialogNotebook->SetPageText( 0, wxString::Format( _( "Repository (%d)" ), 0 ) );
158
161
162 m_dialogNotebook->SetSelection( 0 );
163
164 SetupStandardButtons( { { wxID_OK, _( "Close" ) },
165 { wxID_APPLY, _( "Apply Pending Changes" ) },
166 { wxID_CANCEL, _( "Discard Pending Changes" ) } } );
167
168 Bind( wxEVT_CLOSE_WINDOW, &DIALOG_PCM::OnCloseWindow, this );
169 m_sdbSizer1Cancel->Bind( wxEVT_UPDATE_UI, &DIALOG_PCM::OnUpdateEventButtons, this );
170 m_sdbSizer1Apply->Bind( wxEVT_UPDATE_UI, &DIALOG_PCM::OnUpdateEventButtons, this );
171
173
174 for( int col = 0; col < m_gridPendingActions->GetNumberCols(); col++ )
175 {
176 const wxString& heading = m_gridPendingActions->GetColLabelValue( col );
177 int headingWidth = GetTextExtent( heading ).x + 2 * GRID_CELL_MARGIN;
178
179 // Set the minimal width to the column label size.
180 m_gridPendingActions->SetColMinimalWidth( col, headingWidth );
181 }
182
183 // fix sizers now widgets are set.
185}
186
187
189{
190 Unbind( wxEVT_CLOSE_WINDOW, &DIALOG_PCM::OnCloseWindow, this );
191 m_sdbSizer1Cancel->Unbind( wxEVT_UPDATE_UI, &DIALOG_PCM::OnUpdateEventButtons, this );
192 m_sdbSizer1Apply->Unbind( wxEVT_UPDATE_UI, &DIALOG_PCM::OnUpdateEventButtons, this );
193
194 m_pcm->SaveInstalledPackages();
195 m_pcm->SetDialogWindow( nullptr );
196 m_pcm->RunBackgroundUpdate();
197
198 m_gridPendingActions->PopEventHandler( true );
199}
200
201
202void DIALOG_PCM::OnUpdateEventButtons( wxUpdateUIEvent& event )
203{
204 event.Enable( !m_pendingActions.empty() );
205}
206
207
208void DIALOG_PCM::OnCloseClicked( wxCommandEvent& event )
209{
210 if( m_pendingActions.size() == 0
211 || wxMessageBox( _( "Are you sure you want to close the package manager "
212 "and discard pending changes?" ),
213 _( "Plugin and Content Manager" ), wxICON_QUESTION | wxYES_NO, this )
214 == wxYES )
215 {
216 EndModal( wxID_OK );
217 }
218}
219
220
221void DIALOG_PCM::OnCloseWindow( wxCloseEvent& aEvent )
222{
223 wxCommandEvent dummy;
224
226}
227
228
229void DIALOG_PCM::OnManageRepositoriesClicked( wxCommandEvent& event )
230{
232
233 std::vector<std::pair<wxString, wxString>> dialog_data;
234 std::vector<std::tuple<wxString, wxString, wxString>> repo_list = m_pcm->GetRepositoryList();
235
236 for( const std::tuple<wxString, wxString, wxString>& repo : repo_list )
237 dialog_data.push_back( std::make_pair( std::get<1>( repo ), std::get<2>( repo ) ) );
238
239 dialog->SetData( dialog_data );
240
241 if( dialog->ShowModal() == wxID_SAVE )
242 {
243 dialog_data = dialog->GetData();
244 m_pcm->SetRepositoryList( dialog_data );
245
247 KICAD_SETTINGS* app_settings = mgr.GetAppSettings<KICAD_SETTINGS>();
248
249 app_settings->m_PcmRepositories = std::move( dialog_data );
250
252 }
253
254 dialog->Destroy();
255}
256
257
259{
260 std::vector<std::tuple<wxString, wxString, wxString>> repositories = m_pcm->GetRepositoryList();
261
262 m_choiceRepository->Clear();
263
264 for( const std::tuple<wxString, wxString, wxString>& entry : repositories )
265 {
266 m_choiceRepository->Append( std::get<1>( entry ),
267 new wxStringClientData( std::get<0>( entry ) ) );
268 }
269
270 if( repositories.size() > 0 )
271 {
272 m_choiceRepository->SetSelection( 0 );
273 m_selectedRepositoryId = std::get<0>( repositories[0] );
275 }
276 else
277 {
279 }
280}
281
282
283void DIALOG_PCM::OnRefreshClicked( wxCommandEvent& event )
284{
285 m_pcm->DiscardRepositoryCache( m_selectedRepositoryId );
287}
288
289
290void DIALOG_PCM::OnInstallFromFileClicked( wxCommandEvent& event )
291{
292 wxFileDialog open_file_dialog( this, _( "Install Package" ), wxEmptyString, wxEmptyString,
293 wxT( "Zip files (*.zip)|*.zip" ),
294 wxFD_OPEN | wxFD_FILE_MUST_EXIST );
295
296 if( open_file_dialog.ShowModal() == wxID_CANCEL )
297 return;
298
299 PCM_TASK_MANAGER task_manager( m_pcm );
300 task_manager.InstallFromFile( this, open_file_dialog.GetPath() );
301
302 m_changed_package_types.merge( task_manager.GetChangedPackageTypes() );
303
305
306 if( !m_selectedRepositoryId.IsEmpty() )
308}
309
310
311void DIALOG_PCM::OnRepositoryChoice( wxCommandEvent& event )
312{
313 wxStringClientData* data = static_cast<wxStringClientData*>(
314 m_choiceRepository->GetClientObject( m_choiceRepository->GetSelection() ) );
315
316 m_selectedRepositoryId = data->GetData();
317
319}
320
321
322void DIALOG_PCM::setRepositoryData( const wxString& aRepositoryId )
323{
324 m_dialogNotebook->Freeze();
325
326 if( m_pcm->CacheRepository( aRepositoryId ) )
327 {
328 for( const auto& [ packageType, packagesView ] : m_repositoryContentPanels )
329 packagesView->ClearData();
330
331 m_packageBitmaps = m_pcm->GetRepositoryPackageBitmaps( aRepositoryId );
332
333 const std::vector<PCM_PACKAGE> packages = m_pcm->GetRepositoryPackages( aRepositoryId );
334
335 std::unordered_map<PCM_PACKAGE_TYPE, std::vector<PACKAGE_VIEW_DATA>> data;
336
337 for( const PCM_PACKAGE& pkg : packages )
338 {
339 PACKAGE_VIEW_DATA package_data( pkg );
340
341 if( m_packageBitmaps.count( package_data.package.identifier ) > 0 )
342 package_data.bitmap = &m_packageBitmaps.at( package_data.package.identifier );
343 else
344 package_data.bitmap = &m_defaultBitmap;
345
346 package_data.state = m_pcm->GetPackageState( aRepositoryId, pkg.identifier );
347
348 if( package_data.state == PPS_INSTALLED || package_data.state == PPS_UPDATE_AVAILABLE )
349 {
350 package_data.current_version = m_pcm->GetInstalledPackageVersion( pkg.identifier );
351 package_data.pinned = m_pcm->IsPackagePinned( pkg.identifier );
352 }
353
354 if( package_data.state == PPS_UPDATE_AVAILABLE )
355 package_data.update_version = m_pcm->GetPackageUpdateVersion( pkg );
356
357
358 for( const PENDING_ACTION& action : m_pendingActions )
359 {
360 if( action.package.identifier != pkg.identifier )
361 continue;
362
363 switch( action.action )
364 {
365 case PPA_INSTALL: package_data.state = PPS_PENDING_INSTALL; break;
366 case PPA_UPDATE: package_data.state = PPS_PENDING_UPDATE; break;
367 case PPA_UNINSTALL: package_data.state = PPS_PENDING_UNINSTALL; break;
368 }
369
370 break;
371 }
372
373 package_data.repository_id = aRepositoryId;
374 package_data.repository_name = m_choiceRepository->GetStringSelection();
375
376 data[pkg.type].emplace_back( package_data );
377 }
378
379 for( size_t i = 0; i < PACKAGE_TYPE_LIST.size(); i++ )
380 {
381 PCM_PACKAGE_TYPE type = PACKAGE_TYPE_LIST[i].first;
382 const wxString& label = PACKAGE_TYPE_LIST[i].second;
383 m_repositoryContentPanels[type]->SetData( data[type] );
384 m_contentNotebook->SetPageText( i, wxString::Format( wxGetTranslation( label ),
385 (int) data[type].size() ) );
386 }
387
388 m_dialogNotebook->SetPageText( 0, wxString::Format( _( "Repository (%d)" ),
389 (int) packages.size() ) );
390 }
391
392 m_dialogNotebook->Thaw();
393}
394
395
397{
398 m_gridPendingActions->ClearSelection();
399 m_gridPendingActions->SelectRow( event.GetRow() );
400}
401
402
404{
405 m_dialogNotebook->SetPageText( 2, wxString::Format( _( "Pending (%d)" ),
406 (int) m_pendingActions.size() ) );
407
408 for( int col = 0; col < m_gridPendingActions->GetNumberCols(); col++ )
409 {
410 // Set the width to see the full contents
412 }
413}
414
415
417{
419
420 const std::vector<PCM_INSTALLATION_ENTRY> installed = m_pcm->GetInstalledPackages();
421 std::vector<PACKAGE_VIEW_DATA> package_list;
422
423 m_installedBitmaps = m_pcm->GetInstalledPackageBitmaps();
424
425 for( const PCM_INSTALLATION_ENTRY& entry : installed )
426 {
427 PACKAGE_VIEW_DATA package_data( entry );
428
429 if( m_installedBitmaps.count( package_data.package.identifier ) > 0 )
430 package_data.bitmap = &m_installedBitmaps.at( package_data.package.identifier );
431 else
432 package_data.bitmap = &m_defaultBitmap;
433
434 package_data.state = m_pcm->GetPackageState( entry.repository_id,
435 entry.package.identifier );
436
437 if( package_data.state == PPS_UPDATE_AVAILABLE )
438 package_data.update_version = m_pcm->GetPackageUpdateVersion( entry.package );
439
440 package_list.emplace_back( package_data );
441 }
442
443 m_installedPanel->SetData( package_list );
444
445 m_dialogNotebook->SetPageText( 1, wxString::Format( _( "Installed (%d)" ),
446 (int) package_list.size() ) );
447}
448
449
450void DIALOG_PCM::OnApplyChangesClicked( wxCommandEvent& event )
451{
452 if( m_pendingActions.size() == 0 )
453 return;
454
455 m_sdbSizer1OK->Disable();
456 m_sdbSizer1Apply->Disable();
457 m_sdbSizer1Cancel->Disable();
458
459 PCM_TASK_MANAGER task_manager( m_pcm );
460
461 for( const PENDING_ACTION& action : m_pendingActions )
462 {
463 if( action.action == PPA_UNINSTALL )
464 {
465 task_manager.Uninstall( action.package );
466 }
467 else
468 {
469 bool isUpdate = action.action == PPA_UPDATE;
470 task_manager.DownloadAndInstall( action.package, action.version, action.repository_id,
471 isUpdate );
472 }
473 }
474
475 task_manager.RunQueue( this );
476
477 m_changed_package_types.merge( task_manager.GetChangedPackageTypes() );
478
479 m_sdbSizer1OK->Enable();
480 m_sdbSizer1Apply->Enable();
481 m_sdbSizer1Cancel->Enable();
482
484 wxCommandEvent dummy;
486
487 if( !m_selectedRepositoryId.IsEmpty() )
489}
490
491
492void DIALOG_PCM::OnDiscardChangesClicked( wxCommandEvent& event )
493{
494 m_gridPendingActions->Freeze();
495
496 for( int i = m_pendingActions.size() - 1; i >= 0; i-- )
497 discardAction( i );
498
500 m_gridPendingActions->Thaw();
501}
502
503
504void DIALOG_PCM::OnDiscardActionClicked( wxCommandEvent& event )
505{
506 wxArrayInt rows = m_gridPendingActions->GetSelectedRows();
507
508 std::sort( rows.begin(), rows.end(),
509 []( const int& a, const int& b )
510 {
511 return a > b;
512 } );
513
514 m_gridPendingActions->Freeze();
515
516 for( int row : rows )
517 discardAction( row );
518
520 m_gridPendingActions->Thaw();
521}
522
523
525{
526 m_gridPendingActions->DeleteRows( aIndex );
527
528 PENDING_ACTION action = m_pendingActions[aIndex];
529
530 PCM_PACKAGE_STATE state = m_pcm->GetPackageState( action.repository_id,
531 action.package.identifier );
532
533 updatePackageState( action.package.identifier, state );
534
535 m_pendingActions.erase( m_pendingActions.begin() + aIndex );
536}
537
538
539void DIALOG_PCM::updatePackageState( const wxString& aPackageId, const PCM_PACKAGE_STATE aState )
540{
541 bool pinned = m_pcm->IsPackagePinned( aPackageId );
542
543 m_installedPanel->SetPackageState( aPackageId, aState, pinned );
544
545 for( const auto& [ packageType, packagesView ] : m_repositoryContentPanels )
546 packagesView->SetPackageState( aPackageId, aState, pinned );
547}
548
549
550void DIALOG_PCM::OnOpenPackageDirClicked( wxCommandEvent& event )
551{
552 LaunchExternal( m_pcm->Get3rdPartyPath() );
553}
wxBitmapBundle KiBitmapBundle(BITMAPS aBitmap)
Definition: bitmap.cpp:110
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:104
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:106
void OnDiscardChangesClicked(wxCommandEvent &event) override
Switches to another repository.
Definition: dialog_pcm.cpp:492
std::unordered_map< wxString, wxBitmap > m_installedBitmaps
Definition: dialog_pcm.h:112
std::unordered_map< wxString, wxBitmap > m_packageBitmaps
Definition: dialog_pcm.h:111
void OnManageRepositoriesClicked(wxCommandEvent &event) override
Discards current repo cache, fetches it anew and displays.
Definition: dialog_pcm.cpp:229
void updatePackageState(const wxString &aPackageId, const PCM_PACKAGE_STATE aState)
Discards specified pending action.
Definition: dialog_pcm.cpp:539
void OnApplyChangesClicked(wxCommandEvent &event) override
Discards all pending changes.
Definition: dialog_pcm.cpp:450
void OnDiscardActionClicked(wxCommandEvent &event) override
Handles modification of the buttons' status.
Definition: dialog_pcm.cpp:504
void OnUpdateEventButtons(wxUpdateUIEvent &event)
Returns types of packages that were installed/uninstalled.
Definition: dialog_pcm.cpp:202
std::unordered_map< PCM_PACKAGE_TYPE, PANEL_PACKAGES_VIEW * > m_repositoryContentPanels
Definition: dialog_pcm.h:109
void OnOpenPackageDirClicked(wxCommandEvent &event) override
Enqueues current pending actions in PCM_TASK_MANAGER and runs the queue.
Definition: dialog_pcm.cpp:550
PinCallback m_pinCallback
Definition: dialog_pcm.h:107
DIALOG_PCM(wxWindow *parent, std::shared_ptr< PLUGIN_CONTENT_MANAGER > pcm)
Constructor.
Definition: dialog_pcm.cpp:56
std::unordered_set< PCM_PACKAGE_TYPE > m_changed_package_types
Definition: dialog_pcm.h:114
void updatePendingActionsTab()
Gets installed packages list from PCM and displays it on installed tab.
Definition: dialog_pcm.cpp:403
std::vector< PENDING_ACTION > m_pendingActions
Definition: dialog_pcm.h:130
void setRepositoryListFromPcm()
Updates pending actions tab caption and content-fits the grid.
Definition: dialog_pcm.cpp:258
void OnInstallFromFileClicked(wxCommandEvent &event) override
Opens local directory where packages are installed in file manager.
Definition: dialog_pcm.cpp:290
@ PENDING_COL_NAME
Definition: dialog_pcm.h:135
@ PENDING_COL_REPOSITORY
Definition: dialog_pcm.h:137
@ PENDING_COL_VERSION
Definition: dialog_pcm.h:136
@ PENDING_COL_ACTION
Definition: dialog_pcm.h:134
void OnCloseWindow(wxCloseEvent &aEvent)
Opens repository management dialog, saves changes to PCM.
Definition: dialog_pcm.cpp:221
std::shared_ptr< PLUGIN_CONTENT_MANAGER > m_pcm
Definition: dialog_pcm.h:105
void OnRepositoryChoice(wxCommandEvent &event) override
Selects the whole row in the grid if a cell is clicked.
Definition: dialog_pcm.cpp:311
wxString m_selectedRepositoryId
Definition: dialog_pcm.h:110
PANEL_PACKAGES_VIEW * m_installedPanel
Definition: dialog_pcm.h:108
~DIALOG_PCM()
Closes the window, asks user confirmation if there are pending actions.
Definition: dialog_pcm.cpp:188
void setInstalledPackages()
Reflects new state of the package in all panels where it is displayed.
Definition: dialog_pcm.cpp:416
void OnPendingActionsCellClicked(wxGridEvent &event) override
Discards selected pending actions.
Definition: dialog_pcm.cpp:396
void setRepositoryData(const wxString &aRepositoryId)
Gets package data from PCM and displays it on repository tab.
Definition: dialog_pcm.cpp:322
void discardAction(int aIndex)
Definition: dialog_pcm.cpp:524
wxBitmap m_defaultBitmap
Definition: dialog_pcm.h:113
void OnRefreshClicked(wxCommandEvent &event) override
Opens file selection dialog and installs selected package archive.
Definition: dialog_pcm.cpp:283
void OnCloseClicked(wxCommandEvent &event) override
Definition: dialog_pcm.cpp:208
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...
int ShowModal() override
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.
std::unordered_set< PCM_PACKAGE_TYPE > & GetChangedPackageTypes()
PCM_TASK_MANAGER::STATUS 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.
PCM_TASK_MANAGER::STATUS Uninstall(const PCM_PACKAGE &aPackage)
Enqueue package uninstallation.
PCM_TASK_MANAGER::STATUS InstallFromFile(wxWindow *aParent, const wxString &aFilePath)
Installs package from an archive file on disk.
virtual SETTINGS_MANAGER & GetSettingsManager() const
Definition: pgm_base.h:142
T * GetAppSettings()
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:769
#define GRID_CELL_MARGIN
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:58
@ PPS_INSTALLED
Definition: pcm.h:61
@ PPS_PENDING_UPDATE
Definition: pcm.h:65
@ PPS_UPDATE_AVAILABLE
Definition: pcm.h:64
@ PPS_PENDING_UNINSTALL
Definition: pcm.h:63
@ PPS_PENDING_INSTALL
Definition: pcm.h:62
PCM_PACKAGE_ACTION
Definition: pcm.h:71
@ PPA_UNINSTALL
Definition: pcm.h:73
@ PPA_UPDATE
Definition: pcm.h:74
@ PPA_INSTALL
Definition: pcm.h:72
PCM_PACKAGE_TYPE
< Supported package types
Definition: pcm_data.h:42
@ PT_COLORTHEME
Definition: pcm_data.h:46
@ PT_PLUGIN
Definition: pcm_data.h:44
@ PT_LIBRARY
Definition: pcm_data.h:45
PGM_BASE & Pgm()
The global Program "get" accessor.
Definition: pgm_base.cpp:1060
see class PGM_BASE
std::vector< FAB_LAYER_COLOR > dummy
< 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:139
Repository reference to a resource.
Definition: pcm_data.h:96
wxString identifier
Definition: pcm_data.h:100
wxString name
Definition: pcm_data.h:97