7
mirror of https://gitlab.com/kicad/code/kicad.git synced 2025-04-07 23:05:33 +00:00

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>

Some files were not shown because too many files have changed in this diff Show More