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:
parent
8ac5e318fb
commit
41619ebbe2
common
CMakeLists.txt
widgets
cvpcb
eeschema
gerbview
include
pagelayout_editor/tools
pcbnew
autorouter
connectivity
dialogs
drc
edit_zone_helpers.cppfiles.cppfootprint_edit_frame.cppfootprint_info_impl.cppload_select_footprint.cppplugins
altium
eagle
fabmaster
kicad
legacy
tools
zone_filler.cppzone_filler.hqa/drc_proto
@ -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
|
||||
|
@ -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>
|
||||
|
||||
|
141
common/widgets/progress_reporter_base.cpp
Normal file
141
common/widgets/progress_reporter_base.cpp
Normal 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;
|
||||
}
|
||||
}
|
||||
|
||||
|
127
common/widgets/progress_reporter_base.h
Normal file
127
common/widgets/progress_reporter_base.h
Normal 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
|
@ -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 )
|
||||
{
|
@ -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>
|
||||
|
||||
|
@ -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 );
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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 )
|
||||
{
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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>
|
||||
|
@ -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,
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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
112
include/progress_reporter.h
Normal 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
|
@ -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
|
99
include/widgets/wx_progress_reporters.h
Normal file
99
include/widgets/wx_progress_reporters.h
Normal 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
|
@ -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"
|
||||
|
@ -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"
|
||||
|
@ -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"
|
||||
|
@ -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
Loading…
Reference in New Issue
Block a user