Decouple PROGRESS_REPORTER interface from implementations.

This commit is contained in:
Jeff Young 2021-08-14 21:05:21 +01:00
parent 8ac5e318fb
commit 41619ebbe2
49 changed files with 567 additions and 388 deletions

View File

@ -229,7 +229,7 @@ set( COMMON_WIDGET_SRCS
widgets/msgpanel.cpp
widgets/number_badge.cpp
widgets/paged_dialog.cpp
widgets/progress_reporter.cpp
widgets/progress_reporter_base.cpp
widgets/split_button.cpp
widgets/stepped_slider.cpp
widgets/text_ctrl_eval.cpp
@ -241,6 +241,7 @@ set( COMMON_WIDGET_SRCS
widgets/wx_busy_indicator.cpp
widgets/wx_ellipsized_static_text.cpp
widgets/wx_grid.cpp
widgets/wx_progress_reporters.cpp
)
set( COMMON_DRAWING_SHEET_SRCS

View File

@ -23,7 +23,7 @@
#include <project.h>
#include <widgets/footprint_choice.h>
#include <widgets/footprint_select_widget.h>
#include <widgets/progress_reporter.h>
#include <progress_reporter.h>
#include <footprint_info_impl.h>
#include <wx/wupdlock.h>

View File

@ -0,0 +1,141 @@
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2017 CERN
* Copyright (C) 2021 KiCad Developers, see AUTHORS.txt for contributors.
*
* Author: Tomasz Wlostowski <tomasz.wlostowski@cern.ch>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, you may find one here:
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
* or you may search the http://www.gnu.org website for the version 2 license,
* or you may write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include <wx/evtloop.h>
#include <thread>
#include <widgets/progress_reporter_base.h>
PROGRESS_REPORTER_BASE::PROGRESS_REPORTER_BASE( int aNumPhases ) :
PROGRESS_REPORTER(),
m_msgChanged( false ),
m_phase( 0 ),
m_numPhases( aNumPhases ),
m_progress( 0 ),
m_maxProgress( 1000 ),
m_cancelled( false )
{
}
void PROGRESS_REPORTER_BASE::BeginPhase( int aPhase )
{
m_phase.store( aPhase );
m_progress.store( 0 );
}
void PROGRESS_REPORTER_BASE::AdvancePhase()
{
m_phase.fetch_add( 1 );
m_progress.store( 0 );
}
void PROGRESS_REPORTER_BASE::AdvancePhase( const wxString& aMessage )
{
AdvancePhase();
Report( aMessage );
}
void PROGRESS_REPORTER_BASE::Report( const wxString& aMessage )
{
std::lock_guard<std::mutex> guard( m_mutex );
m_rptMessage = aMessage;
m_msgChanged = true;
}
void PROGRESS_REPORTER_BASE::SetMaxProgress( int aMaxProgress )
{
m_maxProgress.store( aMaxProgress );
}
void PROGRESS_REPORTER_BASE::SetCurrentProgress( double aProgress )
{
m_maxProgress.store( 1000 );
m_progress.store( (int) ( aProgress * 1000.0 ) );
}
void PROGRESS_REPORTER_BASE::AdvanceProgress()
{
m_progress.fetch_add( 1 );
}
void PROGRESS_REPORTER_BASE::SetNumPhases( int aNumPhases )
{
m_numPhases = aNumPhases;
}
void PROGRESS_REPORTER_BASE::AddPhases( int aNumPhases )
{
m_numPhases += aNumPhases;
}
int PROGRESS_REPORTER_BASE::currentProgress() const
{
double current = ( 1.0 / (double) m_numPhases ) *
( (double) m_phase + ( (double) m_progress.load() / (double) m_maxProgress ) );
return (int)( current * 1000 );
}
bool PROGRESS_REPORTER_BASE::KeepRefreshing( bool aWait )
{
if( aWait )
{
while( m_progress.load() < m_maxProgress && m_maxProgress > 0 )
{
if( !updateUI() )
{
m_cancelled.store( true );
return false;
}
wxMilliSleep( 20 );
}
return true;
}
else
{
if( !updateUI() )
{
m_cancelled.store( true );
return false;
}
return true;
}
}

View File

@ -0,0 +1,127 @@
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2017 CERN
* Copyright (C) 2021 KiCad Developers, see AUTHORS.txt for contributors.
*
* Author: Tomasz Wlostowski <tomasz.wlostowski@cern.ch>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, you may find one here:
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
* or you may search the http://www.gnu.org website for the version 2 license,
* or you may write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
#ifndef GENERIC_PROGRESS_REPORTER_H
#define GENERIC_PROGRESS_REPORTER_H
#include <mutex>
#include <atomic>
#include <progress_reporter.h>
/**
* This implements all the tricky bits for thread safety, but the GUI is left to derived classes.
*/
class PROGRESS_REPORTER_BASE : public PROGRESS_REPORTER
{
public:
PROGRESS_REPORTER_BASE( int aNumPhases );
PROGRESS_REPORTER_BASE( const PROGRESS_REPORTER_BASE& ) = delete;
virtual ~PROGRESS_REPORTER_BASE()
{
}
/**
* Set the number of phases.
*/
void SetNumPhases( int aNumPhases ) override;
void AddPhases( int aNumPhases ) override;
/**
* Initialize the \a aPhase virtual zone of the dialog progress bar.
*/
virtual void BeginPhase( int aPhase ) override;
/**
* Use the next available virtual zone of the dialog progress bar.
*/
virtual void AdvancePhase() override;
/**
* Use the next available virtual zone of the dialog progress bar and updates the message.
*/
virtual void AdvancePhase( const wxString& aMessage ) override;
/**
* Display \a aMessage in the progress bar dialog.
*/
virtual void Report( const wxString& aMessage ) override;
/**
* Set the progress value to aProgress (0..1).
*/
virtual void SetCurrentProgress( double aProgress ) override;
/**
* Fix the value that gives the 100 percent progress bar length
* (inside the current virtual zone).
*/
void SetMaxProgress( int aMaxProgress ) override;
/**
* Increment the progress bar length (inside the current virtual zone).
*/
void AdvanceProgress() override;
/**
* Update the UI dialog.
*
* @warning This should only be called from the main thread.
*
* @return false if the user clicked Cancel.
*/
bool KeepRefreshing( bool aWait = false ) override;
/**
* Change the title displayed on the window caption.
*
* Has meaning only for some reporters. Does nothing for others.
*
* @warning This should only be called from the main thread.
*/
void SetTitle( const wxString& aTitle ) override { }
bool IsCancelled() const override { return m_cancelled; }
protected:
int currentProgress() const;
virtual bool updateUI() = 0;
wxString m_rptMessage;
bool m_msgChanged; // true after change in m_rptMessage
mutable std::mutex m_mutex;
std::atomic_int m_phase;
std::atomic_int m_numPhases;
std::atomic_int m_progress;
std::atomic_int m_maxProgress;
std::atomic_bool m_cancelled;
};
#endif

View File

@ -24,124 +24,16 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include <widgets/progress_reporter.h>
#include <wx/evtloop.h>
#include <thread>
PROGRESS_REPORTER::PROGRESS_REPORTER( int aNumPhases ) :
m_msgChanged( false ),
m_phase( 0 ),
m_numPhases( aNumPhases ),
m_progress( 0 ),
m_maxProgress( 1000 ),
m_cancelled( false )
{
}
void PROGRESS_REPORTER::BeginPhase( int aPhase )
{
m_phase.store( aPhase );
m_progress.store( 0 );
}
void PROGRESS_REPORTER::AdvancePhase()
{
m_phase.fetch_add( 1 );
m_progress.store( 0 );
}
void PROGRESS_REPORTER::AdvancePhase( const wxString& aMessage )
{
AdvancePhase();
Report( aMessage );
}
void PROGRESS_REPORTER::Report( const wxString& aMessage )
{
std::lock_guard<std::mutex> guard( m_mutex );
m_rptMessage = aMessage;
m_msgChanged = true;
}
void PROGRESS_REPORTER::SetMaxProgress( int aMaxProgress )
{
m_maxProgress.store( aMaxProgress );
}
void PROGRESS_REPORTER::SetCurrentProgress( double aProgress )
{
m_maxProgress.store( 1000 );
m_progress.store( (int) ( aProgress * 1000.0 ) );
}
void PROGRESS_REPORTER::AdvanceProgress()
{
m_progress.fetch_add( 1 );
}
void PROGRESS_REPORTER::SetNumPhases( int aNumPhases )
{
m_numPhases = aNumPhases;
}
void PROGRESS_REPORTER::AddPhases( int aNumPhases )
{
m_numPhases += aNumPhases;
}
int PROGRESS_REPORTER::currentProgress() const
{
double current = ( 1.0 / (double) m_numPhases ) *
( (double) m_phase + ( (double) m_progress.load() / (double) m_maxProgress ) );
return (int)( current * 1000 );
}
bool PROGRESS_REPORTER::KeepRefreshing( bool aWait )
{
if( aWait )
{
while( m_progress.load() < m_maxProgress && m_maxProgress > 0 )
{
if( !updateUI() )
{
m_cancelled.store( true );
return false;
}
wxMilliSleep( 20 );
}
return true;
}
else
{
if( !updateUI() )
{
m_cancelled.store( true );
return false;
}
return true;
}
}
#include <widgets/wx_progress_reporters.h>
WX_PROGRESS_REPORTER::WX_PROGRESS_REPORTER( wxWindow* aParent, const wxString& aTitle,
int aNumPhases, bool aCanAbort,
bool aReserveSpaceForMessage ) :
PROGRESS_REPORTER( aNumPhases ),
wxProgressDialog( aTitle, ( aReserveSpaceForMessage ? wxT( " " ) : wxT( "" ) ), 1, aParent,
PROGRESS_REPORTER_BASE( aNumPhases ),
wxProgressDialog( aTitle, ( aReserveSpaceForMessage ? wxT( " " ) : wxT( "" ) ), 1, aParent,
// wxPD_APP_MODAL | // Don't use; messes up OSX when called from
// quasi-modal dialog
wxPD_AUTO_HIDE | // *MUST* use; otherwise wxWidgets will spin
@ -151,7 +43,7 @@ WX_PROGRESS_REPORTER::WX_PROGRESS_REPORTER( wxWindow* aParent, const wxString& a
wxPD_ELAPSED_TIME )
#if wxCHECK_VERSION( 3, 1, 0 )
,
m_appProgressIndicator( aParent )
m_appProgressIndicator( aParent )
#endif
{
#if wxCHECK_VERSION( 3, 1, 0 )
@ -196,7 +88,7 @@ bool WX_PROGRESS_REPORTER::updateUI()
GAUGE_PROGRESS_REPORTER::GAUGE_PROGRESS_REPORTER( wxWindow* aParent, int aNumPhases ) :
PROGRESS_REPORTER( aNumPhases ),
PROGRESS_REPORTER_BASE( aNumPhases ),
wxGauge( aParent, wxID_ANY, 1000, wxDefaultPosition, wxDefaultSize, wxGA_HORIZONTAL,
wxDefaultValidator, wxGaugeNameStr )
{

View File

@ -39,7 +39,7 @@
#include <tool/editor_conditions.h>
#include <tool/tool_dispatcher.h>
#include <tool/tool_manager.h>
#include <widgets/progress_reporter.h>
#include <widgets/wx_progress_reporters.h>
#include <wx/statline.h>
#include <wx/stattext.h>

View File

@ -54,7 +54,7 @@
DIALOG_ERC::DIALOG_ERC( SCH_EDIT_FRAME* parent ) :
DIALOG_ERC_BASE( parent ),
PROGRESS_REPORTER( 1 ),
PROGRESS_REPORTER_BASE( 1 ),
m_parent( parent ),
m_running( false ),
m_ercRun( false ),
@ -143,7 +143,7 @@ bool DIALOG_ERC::updateUI()
void DIALOG_ERC::AdvancePhase( const wxString& aMessage )
{
// Will also call Report( aMessage ):
PROGRESS_REPORTER::AdvancePhase( aMessage );
PROGRESS_REPORTER_BASE::AdvancePhase( aMessage );
SetCurrentProgress( 0.0 );
}

View File

@ -30,17 +30,17 @@
#include <lib_pin.h> // For PINTYPE_COUNT definition
#include <dialog_erc_base.h>
#include <widgets/progress_reporter.h>
#include <widgets/progress_reporter_base.h>
#include <erc_settings.h>
class DIALOG_ERC : public DIALOG_ERC_BASE, PROGRESS_REPORTER
class DIALOG_ERC : public DIALOG_ERC_BASE, PROGRESS_REPORTER_BASE
{
public:
DIALOG_ERC( SCH_EDIT_FRAME* parent );
~DIALOG_ERC();
// PROGRESS_REPORTER calls
// PROGRESS_REPORTER_BASE calls
bool updateUI() override;
void AdvancePhase( const wxString& aMessage ) override;
void Report( const wxString& aMessage ) override;

View File

@ -61,7 +61,7 @@
#include <tools/ee_inspection_tool.h>
#include <paths.h>
#include <wx_filename.h> // For ::ResolvePossibleSymlinks
#include <widgets/progress_reporter.h>
#include <widgets/wx_progress_reporters.h>
bool SCH_EDIT_FRAME::SaveEEFile( SCH_SHEET* aSheet, bool aSaveUnderNewName )
{

View File

@ -61,7 +61,7 @@
#include <schematic.h>
#include <symbol_lib_table.h>
#include <wildcards_and_files_ext.h>
#include <widgets/progress_reporter.h>
#include <progress_reporter.h>
// Eagle schematic axes are aligned with x increasing left to right and Y increasing bottom to top

View File

@ -55,7 +55,7 @@
#include <sch_plugins/kicad/sch_sexpr_parser.h>
#include <template_fieldnames.h>
#include <trigo.h>
#include <widgets/progress_reporter.h>
#include <progress_reporter.h>
using namespace TSCHEMATIC_T;

View File

@ -61,7 +61,7 @@
#include <ee_selection.h>
#include <string_utils.h>
#include <wx_filename.h> // for ::ResolvePossibleSymlinks()
#include <widgets/progress_reporter.h>
#include <progress_reporter.h>
using namespace TSCHEMATIC_T;

View File

@ -39,7 +39,7 @@
#include <richio.h>
#include <trace_helpers.h>
#include <trigo.h>
#include <widgets/progress_reporter.h>
#include <progress_reporter.h>
#include <general.h>
#include <sch_bitmap.h>
#include <sch_bus_entry.h>

View File

@ -23,7 +23,7 @@
#include <core/wx_stl_compat.h>
#include <symbol_async_loader.h>
#include <symbol_lib_table.h>
#include <widgets/progress_reporter.h>
#include <progress_reporter.h>
SYMBOL_ASYNC_LOADER::SYMBOL_ASYNC_LOADER( const std::vector<wxString>& aNicknames,

View File

@ -67,7 +67,7 @@
#include <widgets/app_progress_dialog.h>
#include <widgets/infobar.h>
#include <widgets/lib_tree.h>
#include <widgets/progress_reporter.h>
#include <widgets/wx_progress_reporters.h>
#include <widgets/symbol_tree_pane.h>
#include <wildcards_and_files_ext.h>
#include <panel_sym_lib_table.h>

View File

@ -35,7 +35,7 @@
#include <sch_plugins/legacy/sch_legacy_plugin.h>
#include <symbol_lib_table.h>
#include <symbol_async_loader.h>
#include <widgets/progress_reporter.h>
#include <progress_reporter.h>
#include <list>
#include <locale_io.h>
#include <wx/log.h>

View File

@ -22,8 +22,7 @@
#include <wx/log.h>
#include <wx/tokenzr.h>
#include <wx/window.h>
#include <widgets/progress_reporter.h>
#include <widgets/wx_progress_reporters.h>
#include <dialogs/html_messagebox.h>
#include <eda_pattern_match.h>
#include <generate_alias_info.h>

View File

@ -33,7 +33,7 @@
#include <gerber_file_image_list.h>
#include <excellon_image.h>
#include <wildcards_and_files_ext.h>
#include <widgets/progress_reporter.h>
#include <widgets/wx_progress_reporters.h>
#include "widgets/gerbview_layer_widget.h"
// HTML Messages used more than one time:

112
include/progress_reporter.h Normal file
View File

@ -0,0 +1,112 @@
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2017 CERN
* Copyright (C) 2021 KiCad Developers, see AUTHORS.txt for contributors.
*
* Author: Tomasz Wlostowski <tomasz.wlostowski@cern.ch>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, you may find one here:
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
* or you may search the http://www.gnu.org website for the version 2 license,
* or you may write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
#ifndef PROGRESS_REPORTER_H
#define PROGRESS_REPORTER_H
/**
* A progress reporter interface for use in multi-threaded environments. The various advancement
* and message methods can be called from sub-threads. The KeepRefreshing method *MUST* be called
* only from the main thread (primarily a MSW requirement, which won't allow access to UI objects
* allocated from a separate thread).
*/
class PROGRESS_REPORTER
{
public:
PROGRESS_REPORTER()
{ }
PROGRESS_REPORTER( const PROGRESS_REPORTER& ) = delete;
virtual ~PROGRESS_REPORTER()
{ }
/**
* Set the number of phases.
*/
virtual void SetNumPhases( int aNumPhases ) = 0;
virtual void AddPhases( int aNumPhases ) = 0;
/**
* Initialize the \a aPhase virtual zone of the dialog progress bar.
*/
virtual void BeginPhase( int aPhase ) = 0;
/**
* Use the next available virtual zone of the dialog progress bar.
*/
virtual void AdvancePhase() = 0;
/**
* Use the next available virtual zone of the dialog progress bar and updates the message.
*/
virtual void AdvancePhase( const wxString& aMessage ) = 0;
/**
* Display \a aMessage in the progress bar dialog.
*/
virtual void Report( const wxString& aMessage ) = 0;
/**
* Set the progress value to aProgress (0..1).
*/
virtual void SetCurrentProgress( double aProgress ) = 0;
/**
* Fix the value that gives the 100 percent progress bar length
* (inside the current virtual zone).
*/
virtual void SetMaxProgress( int aMaxProgress ) = 0;
/**
* Increment the progress bar length (inside the current virtual zone).
*/
virtual void AdvanceProgress() = 0;
/**
* Update the UI (if any).
*
* @warning This should only be called from the main thread.
*
* @return false if the user cancelled.
*/
virtual bool KeepRefreshing( bool aWait = false ) = 0;
/**
* Change the title displayed on the window caption.
*
* Has meaning only for some reporters. Does nothing for others.
*
* @warning This should only be called from the main thread.
*/
virtual void SetTitle( const wxString& aTitle ) = 0;
virtual bool IsCancelled() const = 0;
};
#endif

View File

@ -1,198 +0,0 @@
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2017 CERN
* Copyright (C) 2021 KiCad Developers, see AUTHORS.txt for contributors.
*
* Author: Tomasz Wlostowski <tomasz.wlostowski@cern.ch>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, you may find one here:
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
* or you may search the http://www.gnu.org website for the version 2 license,
* or you may write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
#ifndef __PROGRESS_REPORTER
#define __PROGRESS_REPORTER
#include <mutex>
#include <atomic>
#include <wx/progdlg.h>
#include <wx/gauge.h>
#if wxCHECK_VERSION( 3, 1, 0 )
#include <wx/appprogress.h>
#endif
/**
* A progress reporter for use in multi-threaded environments. The various advancement
* and message methods can be called from sub-threads. The KeepRefreshing method *MUST*
* be called only from the main thread (primarily a MSW requirement, which won't allow
* access to UI objects allocated from a separate thread).
*/
class PROGRESS_REPORTER
{
public:
PROGRESS_REPORTER( int aNumPhases );
PROGRESS_REPORTER( const PROGRESS_REPORTER& ) = delete;
virtual ~PROGRESS_REPORTER()
{
}
/**
* Set the number of phases.
*/
void SetNumPhases( int aNumPhases );
void AddPhases( int aNumPhases );
/**
* Initialize the \a aPhase virtual zone of the dialog progress bar.
*/
virtual void BeginPhase( int aPhase );
/**
* Use the next available virtual zone of the dialog progress bar.
*/
virtual void AdvancePhase();
/**
* Use the next available virtual zone of the dialog progress bar and updates
* the message.
*/
virtual void AdvancePhase( const wxString& aMessage );
/**
* Display \a aMessage in the progress bar dialog.
*/
virtual void Report( const wxString& aMessage );
/**
* Set the progress value to aProgress (0..1).
*/
virtual void SetCurrentProgress( double aProgress );
/**
* Fix the value that gives the 100 percent progress bar length
* (inside the current virtual zone).
*/
void SetMaxProgress( int aMaxProgress );
/**
* Increment the progress bar length (inside the current virtual zone).
*/
void AdvanceProgress();
/**
* Update the UI dialog.
*
* @warning This should only be called from the main thread.
*
* @return false if the user clicked Cancel.
*/
bool KeepRefreshing( bool aWait = false );
/**
* Change the title displayed on the window caption.
*
* Has meaning only for some reporters. Does nothing for others.
*
* @warning This should only be called from the main thread.
*/
virtual void SetTitle( const wxString& aTitle ) {}
bool IsCancelled() const { return m_cancelled.load(); }
protected:
int currentProgress() const;
virtual bool updateUI() = 0;
wxString m_rptMessage;
bool m_msgChanged; // true after change in m_rptMessage
// the dialog needs perhaps a resize
mutable std::mutex m_mutex;
std::atomic_int m_phase;
std::atomic_int m_numPhases;
std::atomic_int m_progress;
std::atomic_int m_maxProgress;
std::atomic_bool m_cancelled;
};
/**
* Multi-thread safe progress reporter dialog, intended for use of tasks that parallel reporting
* back of work status.
*
* @see PROGRESS_REPORTER.
*/
class WX_PROGRESS_REPORTER : public PROGRESS_REPORTER, public wxProgressDialog
{
public:
/**
* The #PROGRESS_REPORTER will stay on top of \a aParent.
*
* The style is wxPD_AUTO_HIDE | wxPD_CAN_ABORT | wxPD_ELAPSED_TIME.
*
* @param aParent is the wxDialog of Frame that manage this.
* @param aTitle is the dialog progress title
* @param aNumPhases is the number of "virtual sections" of the progress bar
* aNumPhases = 1 is the usual progress bar
* aNumPhases = n creates n virtual progress bar zones: a 0 to 100 percent width
* of a virtual zone fills 0 to 1/n progress bar full size of the nth virtual zone index
* @param aCanAbort is true if the abort button should be shown
* @param aReserveSpaceForMessage will ensure that the dialog is laid out for status messages,
* preventing layout issues on Windows when reporting a message after the initial layout
*/
WX_PROGRESS_REPORTER( wxWindow* aParent, const wxString& aTitle, int aNumPhases,
bool aCanAbort = true, bool aReserveSpaceForMessage = true );
~WX_PROGRESS_REPORTER();
/**
* Change the title displayed on the window caption.
*/
virtual void SetTitle( const wxString& aTitle ) override
{
wxProgressDialog::SetTitle( aTitle );
}
private:
#if wxCHECK_VERSION( 3, 1, 0 )
wxAppProgressIndicator m_appProgressIndicator;
#endif
virtual bool updateUI() override;
};
class GAUGE_PROGRESS_REPORTER : public PROGRESS_REPORTER, public wxGauge
{
public:
/**
* @param aParent is the parent of the wxGauge control
* @param aNumPhases is the number of "virtual sections" of the progress bar
* aNumPhases = 1 is the usual progress bar
* aNumPhases = n creates n virtual progress bar zones: a 0 to 100 percent width
* of a virtual zone fills 0 to 1/n progress bar full size of the nth virtual zone index
*/
GAUGE_PROGRESS_REPORTER( wxWindow* aParent, int aNumPhases );
private:
bool updateUI() override;
};
#endif

View File

@ -0,0 +1,99 @@
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2017 CERN
* Copyright (C) 2021 KiCad Developers, see AUTHORS.txt for contributors.
*
* Author: Tomasz Wlostowski <tomasz.wlostowski@cern.ch>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, you may find one here:
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
* or you may search the http://www.gnu.org website for the version 2 license,
* or you may write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
#ifndef WX_PROGRESS_REPORTERS_H
#define WX_PROGRESS_REPORTERS_H
#include <wx/progdlg.h>
#include <wx/gauge.h>
#if wxCHECK_VERSION( 3, 1, 0 )
#include <wx/appprogress.h>
#endif
#include <widgets/progress_reporter_base.h>
/**
* Multi-thread safe progress reporter dialog, intended for use of tasks that parallel reporting
* back of work status.
*
* @see PROGRESS_REPORTER.
*/
class WX_PROGRESS_REPORTER : public PROGRESS_REPORTER_BASE, public wxProgressDialog
{
public:
/**
* The #PROGRESS_REPORTER will stay on top of \a aParent.
*
* The style is wxPD_AUTO_HIDE | wxPD_CAN_ABORT | wxPD_ELAPSED_TIME.
*
* @param aParent is the wxDialog of Frame that manage this.
* @param aTitle is the dialog progress title
* @param aNumPhases is the number of "virtual sections" of the progress bar
* aNumPhases = 1 is the usual progress bar
* aNumPhases = n creates n virtual progress bar zones: a 0 to 100 percent width
* of a virtual zone fills 0 to 1/n progress bar full size of the nth virtual zone index
* @param aCanAbort is true if the abort button should be shown
* @param aReserveSpaceForMessage will ensure that the dialog is laid out for status messages,
* preventing layout issues on Windows when reporting a message after the initial layout
*/
WX_PROGRESS_REPORTER( wxWindow* aParent, const wxString& aTitle, int aNumPhases,
bool aCanAbort = true, bool aReserveSpaceForMessage = true );
~WX_PROGRESS_REPORTER();
/**
* Change the title displayed on the window caption.
*/
void SetTitle( const wxString& aTitle ) override
{
wxProgressDialog::SetTitle( aTitle );
}
private:
#if wxCHECK_VERSION( 3, 1, 0 )
wxAppProgressIndicator m_appProgressIndicator;
#endif
bool updateUI() override;
};
class GAUGE_PROGRESS_REPORTER : public PROGRESS_REPORTER_BASE, public wxGauge
{
public:
/**
* @param aParent is the parent of the wxGauge control
* @param aNumPhases is the number of "virtual sections" of the progress bar
* aNumPhases = 1 is the usual progress bar
* aNumPhases = n creates n virtual progress bar zones: a 0 to 100 percent width
* of a virtual zone fills 0 to 1/n progress bar full size of the nth virtual zone index
*/
GAUGE_PROGRESS_REPORTER( wxWindow* aParent, int aNumPhases );
private:
bool updateUI() override;
};
#endif

View File

@ -36,7 +36,7 @@ using namespace std::placeholders;
#include <status_popup.h>
#include <drawing_sheet/ds_draw_item.h>
#include <drawing_sheet/ds_data_item.h>
#include <widgets/progress_reporter.h>
#include <progress_reporter.h>
#include "pl_editor_frame.h"
#include "pl_editor_id.h"

View File

@ -35,7 +35,7 @@
#include <pad.h>
#include <board_commit.h>
#include <connectivity/connectivity_data.h>
#include <widgets/progress_reporter.h>
#include <progress_reporter.h>
#include "ar_autoplacer.h"
#include "ar_matrix.h"

View File

@ -25,7 +25,7 @@
#include <board_commit.h>
#include <tools/pcb_actions.h>
#include <widgets/infobar.h>
#include <widgets/progress_reporter.h>
#include <widgets/wx_progress_reporters.h>
#include "ar_autoplacer.h"
#include "autoplace_tool.h"

View File

@ -25,7 +25,7 @@
*/
#include <connectivity/connectivity_algo.h>
#include <widgets/progress_reporter.h>
#include <progress_reporter.h>
#include <geometry/geometry_utils.h>
#include <board_commit.h>

View File

@ -38,7 +38,7 @@
#include <settings/settings_manager.h>
#include <widgets/infobar.h>
#include <widgets/resettable_panel.h>
#include <widgets/progress_reporter.h>
#include <widgets/wx_progress_reporters.h>
#include <wildcards_and_files_ext.h>
#include "dialog_board_setup.h"

View File

@ -39,7 +39,7 @@
#include <wx/wupdlock.h>
#include <widgets/appearance_controls.h>
#include <widgets/ui_common.h>
#include <widgets/progress_reporter.h>
#include <widgets/progress_reporter_base.h>
#include <dialogs/wx_html_report_box.h>
#include <dialogs/panel_setup_rules_base.h>
#include <tools/drc_tool.h>
@ -49,7 +49,7 @@
DIALOG_DRC::DIALOG_DRC( PCB_EDIT_FRAME* aEditorFrame, wxWindow* aParent ) :
DIALOG_DRC_BASE( aParent ),
PROGRESS_REPORTER( 1 ),
PROGRESS_REPORTER_BASE( 1 ),
m_running( false ),
m_cancelled( false ),
m_drcRun( false ),
@ -167,7 +167,7 @@ bool DIALOG_DRC::updateUI()
void DIALOG_DRC::AdvancePhase( const wxString& aMessage )
{
PROGRESS_REPORTER::AdvancePhase( aMessage );
PROGRESS_REPORTER_BASE::AdvancePhase( aMessage );
SetCurrentProgress( 0.0 );
m_messages->Report( aMessage );

View File

@ -32,7 +32,7 @@
#include <pcb_marker.h>
#include <board.h>
#include <dialog_drc_base.h>
#include <widgets/progress_reporter.h>
#include <widgets/progress_reporter_base.h>
class BOARD_DESIGN_SETTINGS;
@ -41,7 +41,7 @@ class BOARD_DESIGN_SETTINGS;
#define DIALOG_DRC_WINDOW_NAME "DialogDrcWindowName"
class
DIALOG_DRC: public DIALOG_DRC_BASE, PROGRESS_REPORTER
DIALOG_DRC: public DIALOG_DRC_BASE, PROGRESS_REPORTER_BASE
{
public:
/// Constructors

View File

@ -24,7 +24,7 @@
*/
#include <reporter.h>
#include <widgets/progress_reporter.h>
#include <progress_reporter.h>
#include <string_utils.h>
#include <board_design_settings.h>
#include <drc/drc_engine.h>

View File

@ -33,7 +33,7 @@
#include <zones.h>
#include <zones_functions_for_undo_redo.h>
#include <connectivity/connectivity_data.h>
#include <widgets/progress_reporter.h>
#include <widgets/wx_progress_reporters.h>
#include <zone_filler.h>
@ -136,7 +136,10 @@ void PCB_EDIT_FRAME::Edit_Zone_Params( ZONE* aZone )
ZONE_FILLER filler( GetBoard(), &commit );
wxString title = wxString::Format( _( "Refill %d Zones" ),
(int) zones_to_refill.size() );
filler.InstallNewProgressReporter( this, title, 4 );
std::unique_ptr<WX_PROGRESS_REPORTER> reporter;
reporter = std::make_unique<WX_PROGRESS_REPORTER>( this, title, 4 );
filler.SetProgressReporter( reporter.get() );
if( !filler.Fill( zones_to_refill ) )
{

View File

@ -47,7 +47,7 @@
#include <kiplatform/app.h>
#include <widgets/appearance_controls.h>
#include <widgets/infobar.h>
#include <widgets/progress_reporter.h>
#include <widgets/wx_progress_reporters.h>
#include <settings/settings_manager.h>
#include <paths.h>
#include <project/project_file.h>

View File

@ -75,7 +75,7 @@
#include <widgets/lib_tree.h>
#include <widgets/paged_dialog.h>
#include <widgets/panel_selection_filter.h>
#include <widgets/progress_reporter.h>
#include <widgets/wx_progress_reporters.h>
#include <wildcards_and_files_ext.h>
#include <wx/filedlg.h>
#include <wx/treebook.h>

View File

@ -31,7 +31,7 @@
#include <kiway.h>
#include <lib_id.h>
#include <wildcards_and_files_ext.h>
#include <widgets/progress_reporter.h>
#include <progress_reporter.h>
#include <wx/textfile.h>
#include <wx/txtstrm.h>
#include <wx/wfstream.h>

View File

@ -47,7 +47,7 @@ using namespace std::placeholders;
#include <pcbnew_settings.h>
#include <view/view_controls.h>
#include <widgets/lib_tree.h>
#include <widgets/progress_reporter.h>
#include <widgets/wx_progress_reporters.h>
#include <dialog_pad_properties.h>
#include "fp_tree_model_adapter.h"

View File

@ -52,7 +52,7 @@
#include <wx/mstream.h>
#include <wx/wfstream.h>
#include <wx/zstream.h>
#include <widgets/progress_reporter.h>
#include <progress_reporter.h>
void ParseAltiumPcb( BOARD* aBoard, const wxString& aFileName, PROGRESS_REPORTER* aProgressReporter,

View File

@ -67,7 +67,7 @@ Load() TODO's
#include <properties.h>
#include <trigo.h>
#include <math/util.h> // for KiROUND
#include <widgets/progress_reporter.h>
#include <progress_reporter.h>
#include <board.h>
#include <board_design_settings.h>

View File

@ -29,7 +29,7 @@
#include "fabmaster_plugin.h"
#include <board.h>
#include <widgets/progress_reporter.h>
#include <progress_reporter.h>
#include <common.h>
#include <macros.h>

View File

@ -53,7 +53,7 @@
#include <common.h>
#include <geometry/shape_arc.h>
#include <string_utils.h>
#include <widgets/progress_reporter.h>
#include <progress_reporter.h>
#include <math/util.h>
#include <wx/filename.h>

View File

@ -47,7 +47,7 @@
#include <plugins/kicad/pcb_parser.h>
#include <trace_helpers.h>
#include <pcb_track.h>
#include <widgets/progress_reporter.h>
#include <progress_reporter.h>
#include <wildcards_and_files_ext.h>
#include <wx/dir.h>
#include <wx/log.h>

View File

@ -57,7 +57,7 @@
#include <math/util.h> // KiROUND, Clamp
#include <string_utils.h>
#include <wx/log.h>
#include <widgets/progress_reporter.h>
#include <progress_reporter.h>
using namespace PCB_KEYS_T;

View File

@ -88,7 +88,7 @@
#include <trigo.h>
#include <confirm.h>
#include <math/util.h> // for KiROUND
#include <widgets/progress_reporter.h>
#include <progress_reporter.h>
typedef LEGACY_PLUGIN::BIU BIU;

View File

@ -32,7 +32,7 @@
#include <dialog_drc.h>
#include <board_commit.h>
#include <board_design_settings.h>
#include <widgets/progress_reporter.h>
#include <progress_reporter.h>
#include <drc/drc_engine.h>
#include <drc/drc_results_provider.h>
#include <netlist_reader/pcb_netlist.h>

View File

@ -55,7 +55,7 @@
#include <tool/tool_manager.h>
#include <footprint_viewer_frame.h>
#include <footprint_edit_frame.h>
#include <widgets/progress_reporter.h>
#include <widgets/wx_progress_reporters.h>
#include <widgets/infobar.h>
#include <wx/hyperlink.h>

View File

@ -45,7 +45,7 @@ using namespace std::placeholders;
#include <pad.h>
#include <zone.h>
#include <connectivity/connectivity_data.h>
#include <widgets/progress_reporter.h>
#include <progress_reporter.h>
// Few constants to avoid using bare numbers for point indices

View File

@ -28,8 +28,9 @@
#include <connectivity/connectivity_data.h>
#include <board_commit.h>
#include <board_design_settings.h>
#include <widgets/progress_reporter.h>
#include <progress_reporter.h>
#include <widgets/infobar.h>
#include <widgets/wx_progress_reporters.h>
#include <wx/event.h>
#include <wx/hyperlink.h>
#include <tool/tool_manager.h>
@ -67,14 +68,19 @@ void ZONE_FILLER_TOOL::CheckAllZones( wxWindow* aCaller, PROGRESS_REPORTER* aRep
for( ZONE* zone : board()->Zones() )
toFill.push_back(zone);
BOARD_COMMIT commit( this );
ZONE_FILLER filler( frame()->GetBoard(), &commit );
BOARD_COMMIT commit( this );
std::unique_ptr<WX_PROGRESS_REPORTER> reporter;
ZONE_FILLER filler( frame()->GetBoard(), &commit );
if( aReporter )
{
filler.SetProgressReporter( aReporter );
}
else
filler.InstallNewProgressReporter( aCaller, _( "Checking Zones" ), 4 );
{
reporter = std::make_unique<WX_PROGRESS_REPORTER>( aCaller, _( "Checking Zones" ), 4 );
filler.SetProgressReporter( reporter.get() );
}
std::lock_guard<KISPINLOCK> lock( board()->GetConnectivity()->GetLock() );
@ -103,7 +109,6 @@ void ZONE_FILLER_TOOL::singleShotRefocus( wxIdleEvent& )
void ZONE_FILLER_TOOL::FillAllZones( wxWindow* aCaller, PROGRESS_REPORTER* aReporter )
{
PCB_EDIT_FRAME* frame = getEditFrame<PCB_EDIT_FRAME>();
BOARD_COMMIT commit( this );
std::vector<ZONE*> toFill;
if( m_fillInProgress )
@ -116,7 +121,9 @@ void ZONE_FILLER_TOOL::FillAllZones( wxWindow* aCaller, PROGRESS_REPORTER* aRepo
board()->IncrementTimeStamp(); // Clear caches
ZONE_FILLER filler( board(), &commit );
BOARD_COMMIT commit( this );
std::unique_ptr<WX_PROGRESS_REPORTER> reporter;
ZONE_FILLER filler( board(), &commit );
if( !board()->GetDesignSettings().m_DRCEngine->RulesValid() )
{
@ -139,9 +146,14 @@ void ZONE_FILLER_TOOL::FillAllZones( wxWindow* aCaller, PROGRESS_REPORTER* aRepo
}
if( aReporter )
{
filler.SetProgressReporter( aReporter );
}
else
filler.InstallNewProgressReporter( aCaller, _( "Fill All Zones" ), 3 );
{
reporter = std::make_unique<WX_PROGRESS_REPORTER>( aCaller, _( "Fill All Zones" ), 3 );
filler.SetProgressReporter( reporter.get() );
}
std::lock_guard<KISPINLOCK> lock( board()->GetConnectivity()->GetLock() );
@ -179,8 +191,6 @@ int ZONE_FILLER_TOOL::ZoneFill( const TOOL_EVENT& aEvent )
std::vector<ZONE*> toFill;
BOARD_COMMIT commit( this );
if( ZONE* passedZone = aEvent.Parameter<ZONE*>() )
{
toFill.push_back( passedZone );
@ -194,8 +204,12 @@ int ZONE_FILLER_TOOL::ZoneFill( const TOOL_EVENT& aEvent )
}
}
ZONE_FILLER filler( board(), &commit );
filler.InstallNewProgressReporter( frame(), _( "Fill Zone" ), 4 );
BOARD_COMMIT commit( this );
std::unique_ptr<WX_PROGRESS_REPORTER> reporter;
ZONE_FILLER filler( board(), &commit );
reporter = std::make_unique<WX_PROGRESS_REPORTER>( frame(), _( "Fill Zone" ), 4 );
filler.SetProgressReporter( reporter.get() );
std::lock_guard<KISPINLOCK> lock( board()->GetConnectivity()->GetLock() );

View File

@ -39,7 +39,7 @@
#include <connectivity/connectivity_data.h>
#include <convert_basic_shapes_to_polygon.h>
#include <board_commit.h>
#include <widgets/progress_reporter.h>
#include <progress_reporter.h>
#include <geometry/shape_poly_set.h>
#include <geometry/convex_hull.h>
#include <geometry/geometry_utils.h>
@ -69,14 +69,6 @@ ZONE_FILLER::~ZONE_FILLER()
}
void ZONE_FILLER::InstallNewProgressReporter( wxWindow* aParent, const wxString& aTitle,
int aNumPhases )
{
m_uniqueReporter = std::make_unique<WX_PROGRESS_REPORTER>( aParent, aTitle, aNumPhases );
SetProgressReporter( m_uniqueReporter.get() );
}
void ZONE_FILLER::SetProgressReporter( PROGRESS_REPORTER* aReporter )
{
m_progressReporter = aReporter;

View File

@ -23,13 +23,13 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
#ifndef __ZONE_FILLER_H
#define __ZONE_FILLER_H
#ifndef ZONE_FILLER_H
#define ZONE_FILLER_H
#include <vector>
#include <zone.h>
class WX_PROGRESS_REPORTER;
class PROGRESS_REPORTER;
class BOARD;
class COMMIT;
class SHAPE_POLY_SET;
@ -43,7 +43,6 @@ public:
~ZONE_FILLER();
void SetProgressReporter( PROGRESS_REPORTER* aReporter );
void InstallNewProgressReporter( wxWindow* aParent, const wxString& aTitle, int aNumPhases );
/**
* Fills the given list of zones. Invalidates connectivity - it is up to the caller to obtain
@ -127,8 +126,6 @@ private:
COMMIT* m_commit;
PROGRESS_REPORTER* m_progressReporter;
std::unique_ptr<WX_PROGRESS_REPORTER> m_uniqueReporter;
int m_maxError;
int m_worstClearance;

View File

@ -44,7 +44,7 @@
#include <connectivity/connectivity_algo.h>
#include <reporter.h>
#include <widgets/progress_reporter.h>
#include <widgets/progress_reporter_base.h>
#include <project.h>
#include <settings/settings_manager.h>

View File

@ -26,7 +26,7 @@
#include <string>
#include <widgets/progress_reporter.h>
#include <widgets/progress_reporter_base.h>
#include <reporter.h>
#include <core/optional.h>
#include <netlist_reader/pcb_netlist.h>
@ -94,11 +94,11 @@ private:
std::mutex m_lock;
};
class CONSOLE_PROGRESS_REPORTER : public PROGRESS_REPORTER
class CONSOLE_PROGRESS_REPORTER : public PROGRESS_REPORTER_BASE
{
public:
CONSOLE_PROGRESS_REPORTER( CONSOLE_LOG* log ) :
PROGRESS_REPORTER( 0 ),
PROGRESS_REPORTER_BASE( 0 ),
m_log( log ) {};
~CONSOLE_PROGRESS_REPORTER() {};