24#include <wx/aui/auibook.h>
28#include <wx/checkbox.h>
36#include <wx/dcclient.h>
67 int jobBmpColId =
m_jobList->AppendColumn( wxT(
"" ) );
68 int jobNoColId =
m_jobList->AppendColumn(
_(
"No." ) );
69 int jobDescColId =
m_jobList->AppendColumn(
_(
"Job Description" ) );
70 int jobSourceColId =
m_jobList->AppendColumn(
_(
"Source" ) );
71 m_jobList->SetColumnWidth( jobBmpColId, 26 );
72 m_jobList->SetColumnWidth( jobNoColId, GetTextExtent( wxT(
"XXXX" ) ).GetWidth() );
73 m_jobList->SetColumnWidth( jobSourceColId, GetTextExtent( wxT(
"XXXXXX" ) ).GetWidth() );
75 wxImageList* imageList =
new wxImageList( 16, 16,
true, 3 );
76 imageList->Add(
KiBitmapBundle( BITMAPS::ercerr ).GetBitmap( wxSize( 16, 16 ) ) );
77 imageList->Add(
KiBitmapBundle( BITMAPS::checked_ok ).GetBitmap( wxSize( 16, 16 ) ) );
78 m_jobList->SetImageList( imageList, wxIMAGE_LIST_SMALL );
96 m_jobList->SetItem( itemIndex, jobNoColId, wxString::Format(
"%d", num++ ) );
97 m_jobList->SetItem( itemIndex, jobDescColId, job.GetDescription() );
100 wxString source = wxEmptyString;
105 source = wxT(
"PCB" );
107 source = wxT(
"SCH" );
110 m_jobList->SetItem( itemIndex, jobSourceColId, source );
138 int itemIndex =
event.GetIndex();
146 if(
static_cast<size_t>( itemIndex ) < jobs.size() )
148 wxString jobId = jobs[itemIndex].m_id;
182 long style = GetWindowStyleFlag();
183 style &= ~wxBORDER_MASK;
184 style |= wxBORDER_SIMPLE;
185 SetWindowStyleFlag( style );
210 wxCHECK( destination, );
219 wxCHECK( destination, );
246 wxClientDC dc(
this );
247 int width = GetSize().GetWidth();
249 m_pathInfo->SetLabel( wxControl::Ellipsize( aMsg, dc, wxELLIPSIZE_MIDDLE, width ) );
263 wxFileName fn =
project.GetProjectFullName();
264 wxSetWorkingDirectory( fn.GetPath() );
285 wxCHECK( destination, );
294 wxCHECK( destination, );
297 menu.Append( wxID_EDIT,
_(
"Edit Destination Options..." ) );
298 menu.Append( wxID_DELETE,
_(
"Delete Destination" ) );
300 menu.AppendSeparator();
301 menu.Append( wxID_VIEW_DETAILS,
_(
"View Last Run Log..." ) );
303 menu.Enable( wxID_VIEW_DETAILS, destination->
m_lastRunSuccess.has_value() );
311 wxCHECK( destination, );
324 virtual void OnDelete( wxCommandEvent& aEvent )
override
343 switch( aEvent.GetId() )
347 wxCommandEvent
dummy;
354 wxCommandEvent
dummy;
359 case wxID_VIEW_DETAILS:
367 wxFAIL_MSG( wxT(
"Unknown ID in context menu event" ) );
382 m_doubleClickRow( -1 )
391 wxArrayInt selectedRows =
m_grid->GetSelectedRows();
395 menu.AppendSeparator();
396 menu.Append(
GRIDTRICKS_ID_COPY,
_(
"Copy" ) +
"\tCtrl+C",
_(
"Copy selected cells to clipboard" ) );
404 m_grid->PopupMenu( &menu );
410 wxArrayInt selectedRows =
m_grid->GetSelectedRows();
414 if( selectedRows.size() > 0 )
416 m_grid->SetGridCursor( selectedRows[0], 2 );
417 m_grid->EnableCellEditControl();
422 if( selectedRows.size() > 0 )
427 wxCommandEvent
dummy;
441 int curr_col = aEvent.GetCol();
442 int curr_row = aEvent.GetRow();
471 std::unique_ptr<JOBSET> aJobsFile ) :
473 m_parentBook( aParent ),
475 m_jobsFile(
std::
move( aJobsFile ) )
480 m_jobsGrid->SetSelectionMode( wxGrid::wxGridSelectRows );
538 wxString source = wxEmptyString;
543 source = wxT(
"PCB" );
545 source = wxT(
"SCH" );
557 panel->UpdateStatus();
566 tabName = wxS(
"*" ) + tabName;
581 m_outputListSizer->Add( destinationPanel, 0, wxEXPAND, 5 );
592 std::vector<PANEL_DESTINATION*> panels;
597 panels.push_back( panel );
619 bool success =
false;
631 if( job.
m_job->GetType() ==
"special_execute" )
641 else if( job.
m_job->GetType() ==
"special_copyfiles" )
666 int row = aEvent.GetRow();
667 int col = aEvent.GetCol();
679 m_jobsFile->SaveToFile( wxEmptyString,
true );
689 wxArrayString headers;
690 std::vector<wxArrayString> items;
692 headers.Add(
_(
"Job Types" ) );
696 for(
const std::pair<const wxString, JOB_REGISTRY_ENTRY>& entry : jobMap )
698 if( entry.second.deprecated )
702 item.Add( wxGetTranslation( entry.second.title ) );
703 items.emplace_back( item );
715 if( !selectedString.IsEmpty() )
717 for(
const std::pair<const wxString, JOB_REGISTRY_ENTRY>& entry : jobMap )
719 if( entry.second.deprecated )
722 if( wxGetTranslation( entry.second.title ) == selectedString )
724 jobKey = entry.first;
730 if( !jobKey.IsEmpty() )
734 JOB* job = JOB_REGISTRY::CreateInstance<JOB>( jobKey );
768 wxArrayString headers;
769 std::vector<wxArrayString> items;
771 headers.Add(
_(
"Destination Types" ) );
776 item.Add( wxGetTranslation( destinationTypeInfo.name ) );
777 items.emplace_back( item );
790 if( wxGetTranslation( destinationTypeInfo.name ) == selectedString )
817 wxFileName fileName =
m_jobsFile->GetFullFilename();
818 wxString msg =
_(
"Save changes to '%s' before closing?" );
823 return m_jobsFile->SaveToFile( wxEmptyString, true );
848 wxFileName boardfn =
project.GetProjectFullName();
849 boardfn.SetExt( FILEEXT::PcbFileExtension );
852 wxEventBlocker blocker(
this );
854 frame->
OpenProjectFiles( std::vector<wxString>( 1, boardfn.GetFullPath() ) );
856 if( !frame->IsVisible() )
871 wxFileName schFn =
project.GetProjectFullName();
874 wxEventBlocker blocker(
this );
878 if( !frame->IsVisible() )
922 if( item < m_jobsGrid->GetNumberRows() - 1 )
951 panel->ClearStatus();
961 wxFileName fn =
project.GetProjectFullName();
962 wxSetWorkingDirectory( fn.GetPath() );
972 panel->UpdateStatus();
wxBitmapBundle KiBitmapBundle(BITMAPS aBitmap, int aMinHeight)
Class DIALOG_JOBSET_RUN_LOG_BASE.
wxStaticText * m_staticTextOutputName
wxTextCtrl * m_textCtrlOutput
void OnJobListItemSelected(wxListEvent &event) override
DIALOG_JOBSET_RUN_LOG(wxWindow *aParent, JOBSET *aJobsFile, JOBSET_DESTINATION *aDestination)
JOBSET_DESTINATION * m_destination
virtual void OnUpdateUI(wxUpdateUIEvent &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...
wxString GetTextSelection(int aColumn=0)
Return the selected text from aColumn in the wxListCtrl in the dialog.
void SetListLabel(const wxString &aLabel)
Add mouse and command handling (such as cut, copy, and paste) to a WX_GRID instance.
bool m_multiCellEditEnabled
bool m_enableSingleClickEdit
virtual void doPopupSelection(wxCommandEvent &event)
WX_GRID * m_grid
I don't own the grid, but he owns me.
std::vector< JOBSET_DESTINATION > & GetDestinations()
void SetDirty(bool aFlag=true)
std::vector< JOBSET_JOB > GetJobsForDestination(JOBSET_DESTINATION *aDestination)
std::vector< JOBSET_JOB > & GetJobs()
void showPopupMenu(wxMenu &menu, wxGridEvent &aEvent) override
void doPopupSelection(wxCommandEvent &event) override
bool handleDoubleClick(wxGridEvent &aEvent) override
JOBS_GRID_TRICKS(PANEL_JOBSET *aParent, WX_GRID *aGrid)
bool RunJobsAllDestinations(bool aBail=false)
bool RunJobsForDestination(JOBSET_DESTINATION *aDestination, bool aBail=false)
static const REGISTRY_MAP_T & GetRegistry()
std::unordered_map< wxString, JOB_REGISTRY_ENTRY > REGISTRY_MAP_T
static KIWAY::FACE_T GetKifaceType(const wxString &aName)
An simple container class that lets us dispatch output jobs to kifaces.
The main KiCad project manager frame.
KIWAY & Kiway() const
Return a reference to the KIWAY that this object has an opportunity to participate in.
A wxFrame capable of the OpenProjectFiles function, meaning it can load a portion of a KiCad project.
virtual bool OpenProjectFiles(const std::vector< wxString > &aFileList, int aCtl=0)
Open a project or set of files given by aFileList.
bool ProcessJobConfigDialog(KIWAY::FACE_T aFace, JOB *aJob, wxWindow *aWindow)
virtual KIWAY_PLAYER * Player(FRAME_T aFrameType, bool doCreate=true, wxTopLevelWindow *aParent=nullptr)
Return the KIWAY_PLAYER* given a FRAME_T.
FACE_T
Known KIFACE implementations.
virtual PROJECT & Prj() const
Return the PROJECT associated with this KIWAY.
static REPORTER & GetInstance()
Class PANEL_DESTINATION_BASE.
wxStaticBitmap * m_statusBitmap
wxButton * m_buttonGenerate
wxStaticText * m_pathInfo
STD_BITMAP_BUTTON * m_buttonProperties
STD_BITMAP_BUTTON * m_buttonDelete
wxStaticBitmap * m_bitmapOutputType
wxStaticText * m_textOutputType
void onMenu(wxCommandEvent &aEvent)
JOBSET_DESTINATION * GetDestination()
void UpdatePathInfo(const wxString &aMsg)
PANEL_DESTINATION(wxWindow *aParent, PANEL_JOBSET *aPanelParent, KICAD_MANAGER_FRAME *aFrame, JOBSET *aFile, JOBSET_DESTINATION *aDestination)
virtual void OnDelete(wxCommandEvent &aEvent) override
virtual void OnLastStatusClick(wxMouseEvent &aEvent) override
virtual void OnGenerate(wxCommandEvent &event) override
void OnRightDown(wxMouseEvent &aEvent) override
KICAD_MANAGER_FRAME * m_frame
void OnProperties(wxCommandEvent &aEvent) override
PANEL_JOBSET * m_panelParent
STD_BITMAP_BUTTON * m_buttonAddDestination
STD_BITMAP_BUTTON * m_buttonDown
wxScrolledWindow * m_destinationList
wxBoxSizer * m_destinationListSizer
STD_BITMAP_BUTTON * m_buttonAddJob
STD_BITMAP_BUTTON * m_buttonDelete
STD_BITMAP_BUTTON * m_buttonUp
wxString GetFilePath() const
virtual void OnSaveButtonClick(wxCommandEvent &aEvent) override
void OnJobButtonDelete(wxCommandEvent &aEvent) override
virtual void OnJobButtonDown(wxCommandEvent &aEvent) override
void EnsurePcbSchFramesOpen()
bool GetCanClose() override
wxAuiNotebook * m_parentBook
void addDestinationPanel(JOBSET_DESTINATION *aDestination)
virtual void OnGenerateAllDestinationsClick(wxCommandEvent &event) override
bool OpenJobOptionsForListItem(size_t aItemIndex)
std::vector< PANEL_DESTINATION * > GetDestinationPanels()
void buildDestinationList()
KICAD_MANAGER_FRAME * m_frame
PANEL_JOBSET(wxAuiNotebook *aParent, KICAD_MANAGER_FRAME *aFrame, std::unique_ptr< JOBSET > aJobsFile)
virtual void OnAddDestinationClick(wxCommandEvent &aEvent) override
virtual void OnAddJobClick(wxCommandEvent &aEvent) override
std::unique_ptr< JOBSET > m_jobsFile
virtual void OnGridCellChange(wxGridEvent &aEvent) override
void RemoveDestination(PANEL_DESTINATION *aPanel)
virtual void OnJobButtonUp(wxCommandEvent &aEvent) override
virtual void OnSizeGrid(wxSizeEvent &aEvent) override
Container for project specific data.
void OverrideMinSize(double aXPct, double aYPct)
Grids that have column sizes automatically set to fill the available width don't want to shrink after...
bool CancelPendingChanges()
void CancelShowEditorOnMouseUp()
void OnDeleteRows(const std::function< void(int row)> &aDeleter)
Handles a row deletion event.
bool CommitPendingChanges(bool aQuietMode=false)
Close any open cell edit controls.
bool HandleUnsavedChanges(wxWindow *aParent, const wxString &aMessage, const std::function< bool()> &aSaveFunction)
Display a dialog with Save, Cancel and Discard Changes buttons.
void DisplayError(wxWindow *aParent, const wxString &aText)
Display an error or warning message box with aMessage.
This file is part of the common library.
static const std::string KiCadSchematicFileExtension
Some functions to handle hotkeys in KiCad.
KICOMMON_API std::map< JOBSET_DESTINATION_T, JOBSET_DESTINATION_T_INFO > JobsetDestinationTypeInfos
KICOMMON_API wxFont GetSmallInfoFont(wxWindow *aWindow)
KICOMMON_API std::map< JOBSET_DESTINATION_T, JOBSET_DESTINATION_T_INFO > JobsetDestinationTypeInfos
void Refresh()
Update the board display after modifying it by a python script (note: it is automatically called by a...
std::vector< FAB_LAYER_COLOR > dummy
std::unordered_map< wxString, std::shared_ptr< JOBSET_OUTPUT_REPORTER > > m_lastRunReporters
JOBSET_DESTINATION_T m_type
wxString GetPathInfo() const
wxString GetDescription() const
std::optional< bool > m_lastRunSuccess
std::unordered_map< wxString, std::optional< bool > > m_lastRunSuccessMap
std::shared_ptr< JOB > m_job
Definition of file extensions used in Kicad.