42#include <wx/filedlg.h>
46#define GRID_CELL_MARGIN 4
52 {
PT_FAB,
_(
"Fabrication plugins (%d)" ) },
65 SetMinSize( FromDIP( GetMinSize() ) );
67 SetDoubleBuffered(
true );
71 m_pcm->SetDialogWindow(
this );
72 m_pcm->StopBackgroundUpdate();
80 const wxString& aVersion )
84 if( wxMessageBox( wxString::Format(
_(
"Are you sure you want to update pinned package "
85 "from version %s to %s?" ),
87 _(
"Confirm update" ), wxICON_QUESTION | wxYES_NO,
this )
116 wxString::Format( wxT(
"%s \u279C %s" ),
140 [
this](
const wxString& aPackageId,
const PCM_PACKAGE_STATE aState,
const bool aPinned )
142 m_pcm->SetPinned( aPackageId, aPinned );
155 wxString label = wxGetTranslation( entry.second );
160 m_dialogNotebook->SetPageText( 0, wxString::Format(
_(
"Repository (%d)" ), 0 ) );
168 { wxID_APPLY,
_(
"Apply Pending Changes" ) },
169 { wxID_CANCEL,
_(
"Discard Pending Changes" ) } } );
202 m_pcm->SaveInstalledPackages();
203 m_pcm->SetDialogWindow(
nullptr );
204 m_pcm->RunBackgroundUpdate();
232 || wxMessageBox(
_(
"Are you sure you want to close the package manager "
233 "and discard pending changes?" ),
234 _(
"Plugin and Content Manager" ), wxICON_QUESTION | wxYES_NO,
this )
244 wxCommandEvent
dummy;
254 std::vector<std::pair<wxString, wxString>> dialog_data;
255 std::vector<std::tuple<wxString, wxString, wxString>> repo_list =
m_pcm->GetRepositoryList();
257 for(
const auto& [
id, url,
name] : repo_list )
258 dialog_data.push_back( std::make_pair( url,
name ) );
260 dialog->
SetData( dialog_data );
264 dialog_data = dialog->
GetData();
265 m_pcm->SetRepositoryList( dialog_data );
268 cfg->m_PcmRepositories = std::move( dialog_data );
280 std::vector<std::tuple<wxString, wxString, wxString>> repositories =
m_pcm->GetRepositoryList();
285 for(
const auto& [
id, url,
name] : repositories )
288 if( repositories.size() > 1 )
289 m_choiceRepository->Append(
_(
"-- All repositories --" ),
new wxStringClientData(
"ALL_REPOSITORIES" ) );
291 if( repositories.size() > 0 )
299 idx = repositories.size();
303 auto it = std::find_if( repositories.begin(), repositories.end(),
304 [&cfg](
const auto& repo )
306 return std::get<0>( repo ) == cfg->m_PcmLastSelectedRepoId;
309 if( it != repositories.end() )
310 idx = std::distance( repositories.begin(), it );
315 wxStringClientData* data =
static_cast<wxStringClientData*
>(
m_choiceRepository->GetClientObject( idx ) );
339 wxFileDialog open_file_dialog(
this,
_(
"Install Package" ), wxEmptyString, wxEmptyString,
340 wxT(
"Zip files (*.zip)|*.zip" ), wxFD_OPEN | wxFD_FILE_MUST_EXIST );
344 if( open_file_dialog.ShowModal() == wxID_CANCEL )
361 wxStringClientData* data =
static_cast<wxStringClientData*
>(
376 if( aRepositoryId ==
"ALL_REPOSITORIES" )
385 packagesView->ClearData();
387 std::unordered_map<wxString, PCM_PACKAGE> packagesMap;
388 std::unordered_map<wxString, wxString> repoIds;
389 std::unordered_map<wxString, wxString> repoNames;
391 if(
m_pcm->CacheRepository( aRepositoryId ) )
396 for(
const PCM_PACKAGE& pkg :
m_pcm->GetRepositoryPackages( aRepositoryId ) )
401 packagesMap[pkg.identifier] = pkg;
402 repoIds[pkg.identifier] = aRepositoryId;
403 repoNames[pkg.identifier] = repoName;
417 packagesView->ClearData();
419 std::unordered_map<wxString, PCM_PACKAGE> bestPackages;
420 std::unordered_map<wxString, wxString> bestRepositoryId;
421 std::unordered_map<wxString, wxString> bestRepositoryName;
425 for(
const auto& [repo_id, repo_url, repo_name] :
m_pcm->GetRepositoryList() )
427 if( !
m_pcm->CacheRepository( repo_id ) )
430 std::unordered_map<wxString, wxBitmap> repo_bitmaps =
m_pcm->GetRepositoryPackageBitmaps( repo_id );
431 const std::vector<PCM_PACKAGE> packages =
m_pcm->GetRepositoryPackages( repo_id );
438 bool isBetter =
false;
439 auto it = bestPackages.find( pkg.identifier );
441 if( it == bestPackages.end() )
448 if( !pkg.versions.empty() && !best.
versions.empty() )
450 if( pkg.versions[0].parsed_version > best.
versions[0].parsed_version )
457 bestPackages[pkg.identifier] = pkg;
458 bestRepositoryId[pkg.identifier] = repo_id;
459 bestRepositoryName[pkg.identifier] = repo_name;
461 if( repo_bitmaps.count( pkg.identifier ) > 0 )
474 const std::unordered_map<wxString, wxString>& aPackageRepoIds,
475 const std::unordered_map<wxString, wxString>& aPackageRepoNames )
477 std::unordered_map<PCM_PACKAGE_TYPE, std::vector<PACKAGE_VIEW_DATA>> data;
478 int totalPackages = 0;
480 for(
const auto& [pkg_id, best_pkg] : aPackages )
482 wxString repo_id = aPackageRepoIds.at( pkg_id );
483 wxString repo_name = aPackageRepoNames.at( pkg_id );
492 package_data.
state =
m_pcm->GetPackageState( repo_id, pkg_id );
497 package_data.
pinned =
m_pcm->IsPackagePinned( pkg_id );
500 else if( !best_pkg.versions.empty() )
502 package_data.
swig_warning =
m_pcm->UsesSWIGRuntime( best_pkg, best_pkg.versions[0].version );
510 if( action.package.identifier != pkg_id )
513 switch( action.action )
528 data[type].emplace_back( package_data );
537 m_contentNotebook->SetPageText( i, wxString::Format( wxGetTranslation( label ), (
int) data[type].size() ) );
540 m_dialogNotebook->SetPageText( 0, wxString::Format(
_(
"Repository (%d)" ), totalPackages ) );
570 m_pcm->ResolveInstalledPackageRepositories();
572 const std::vector<PCM_INSTALLATION_ENTRY> installed =
m_pcm->GetInstalledPackages();
573 std::vector<PACKAGE_VIEW_DATA> package_list;
586 package_data.
state =
m_pcm->GetPackageState( entry.repository_id,
587 entry.package.identifier );
589 package_data.
swig_warning =
m_pcm->UsesSWIGRuntime( entry.package, entry.current_version );
594 package_list.emplace_back( package_data );
600 (
int) package_list.size() ) );
619 task_manager.
Uninstall( action.package );
624 task_manager.
DownloadAndInstall( action.package, action.version, action.repository_id,
638 wxCommandEvent
dummy;
662 std::sort( rows.begin(), rows.end(),
663 [](
const int& a,
const int& b )
670 for(
int row : rows )
695 bool pinned =
m_pcm->IsPackagePinned( aPackageId );
700 packagesView->SetPackageState( aPackageId, aState, pinned );
wxBitmap KiBitmap(BITMAPS aBitmap, int aHeightTag)
Construct a wxBitmap from an image identifier Returns the image from the active theme if the image ha...
wxBitmapBundle KiBitmapBundle(BITMAPS aBitmap, int aMinHeight)
Implementing DIALOG_MANAGE_REPOSITORIES_BASE.
std::vector< std::pair< wxString, wxString > > GetData()
void SetData(const std::vector< std::pair< wxString, wxString > > &aData)
wxChoice * m_choiceRepository
wxNotebook * m_contentNotebook
WX_GRID * m_gridPendingActions
wxButton * m_sdbSizer1Cancel
wxBitmapButton * m_discardActionButton
DIALOG_PCM_BASE(wxWindow *parent, wxWindowID id=wxID_ANY, const wxString &title=_("Plugin And Content Manager"), const wxPoint &pos=wxDefaultPosition, const wxSize &size=wxSize(-1,-1), long style=wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER)
wxNotebook * m_dialogNotebook
wxButton * m_sdbSizer1Apply
wxPanel * m_panelInstalledHolder
ActionCallback m_actionCallback
void OnDiscardChangesClicked(wxCommandEvent &event) override
Switches to another repository.
std::unordered_map< wxString, wxBitmap > m_installedBitmaps
std::unordered_map< wxString, wxBitmap > m_packageBitmaps
void OnManageRepositoriesClicked(wxCommandEvent &event) override
Discards current repo cache, fetches it anew and displays.
void updatePackageState(const wxString &aPackageId, const PCM_PACKAGE_STATE aState)
Discards specified pending action.
void OnApplyChangesClicked(wxCommandEvent &event) override
Discards all pending changes.
void OnDiscardActionClicked(wxCommandEvent &event) override
Handles modification of the buttons' status.
void OnUpdateEventButtons(wxUpdateUIEvent &event)
Returns types of packages that were installed/uninstalled.
std::unordered_map< PCM_PACKAGE_TYPE, PANEL_PACKAGES_VIEW * > m_repositoryContentPanels
void OnOpenPackageDirClicked(wxCommandEvent &event) override
Enqueues current pending actions in PCM_TASK_MANAGER and runs the queue.
PinCallback m_pinCallback
void renderPackageGrids(const std::unordered_map< wxString, PCM_PACKAGE > &aPackages, const std::unordered_map< wxString, wxString > &aPackageRepoIds, const std::unordered_map< wxString, wxString > &aPackageRepoNames)
Shared logic to render a given set of packages to the UI notebooks.
std::unordered_set< PCM_PACKAGE_TYPE > m_changed_package_types
void SetActivePackageType(PCM_PACKAGE_TYPE aType)
EDA_BASE_FRAME * m_parentFrame
void setRepositoryDataMulti()
Aggregates and deduplicates packages from all configured repositories.
DIALOG_PCM(EDA_BASE_FRAME *parent, std::shared_ptr< PLUGIN_CONTENT_MANAGER > pcm)
Constructor.
void updatePendingActionsTab()
Gets installed packages list from PCM and displays it on installed tab.
std::vector< PENDING_ACTION > m_pendingActions
void setRepositoryListFromPcm()
Updates pending actions tab caption and content-fits the grid.
void OnInstallFromFileClicked(wxCommandEvent &event) override
Opens local directory where packages are installed in file manager.
void OnCloseWindow(wxCloseEvent &aEvent)
Opens repository management dialog, saves changes to PCM.
std::shared_ptr< PLUGIN_CONTENT_MANAGER > m_pcm
void OnRepositoryChoice(wxCommandEvent &event) override
Selects the whole row in the grid if a cell is clicked.
wxString m_selectedRepositoryId
PANEL_PACKAGES_VIEW * m_installedPanel
void setInstalledPackages()
Reflects new state of the package in all panels where it is displayed.
void OnPendingActionsCellClicked(wxGridEvent &event) override
Discards selected pending actions.
void setRepositoryData(const wxString &aRepositoryId)
Gets package data from PCM and displays it on repository tab.
void discardAction(int aIndex)
void OnRefreshClicked(wxCommandEvent &event) override
Opens file selection dialog and installs selected package archive.
void OnCloseClicked(wxCommandEvent &event) override
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...
The base frame for deriving all KiCad main window classes.
Add mouse and command handling (such as cut, copy, and paste) to a WX_GRID instance.
wxString m_PcmLastSelectedRepoId
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.
static std::vector< std::pair< PCM_PACKAGE_TYPE, wxString > > PACKAGE_TYPE_LIST
Base window classes and related definitions.
bool LaunchExternal(const wxString &aPath)
Launches the given file or folder in the host OS.
PCM_PACKAGE_TYPE
< Supported package types
T * GetAppSettings(const char *aFilename)
std::vector< FAB_LAYER_COLOR > dummy
< Collection of data relevant to the package display panelCallback for (un)install button
const PCM_PACKAGE package
Repository reference to a resource.
std::vector< PACKAGE_VERSION > versions