15 void setLabel(
const std::string &label );
44 other._signalConns.clear ();
56 other._signalConns.clear ();
82 if ( _ignoreChildSigs )
85 double currProgressSteps = _baseValue;
86 double accumSteps = _baseSteps;
88 for (
auto i = 0; i < _children.size (); i++ ) {
89 const auto childPtr = _children[i].get();
90 const auto &childInfo = _childInfo[i];
91 const auto weight = childInfo._childWeight;
92 currProgressSteps += childPtr->current() * weight;
93 accumSteps += childPtr->steps()* weight;
96 bool notifyAccuMaxSteps = _counterSteps != accumSteps ;
97 bool notifyCurrSteps = _counterValue != currProgressSteps;
99 _counterSteps = accumSteps;
100 _counterValue = currProgressSteps;
102 if ( notifyAccuMaxSteps )
103 _sigStepsChanged.emit( *z_func(), _counterSteps );
104 if ( notifyCurrSteps) {
105 _sigValueChanged.emit( *z_func(), notifyCurrSteps );
106 _sigProgressChanged.emit( *z_func(), z_func()->progress() );
112 auto i = std::find_if(
_children.begin (),
_children.end (), [&](
const auto &elem ) { return ( &child == elem.get() ); } );
114 WAR <<
"Unknown child sent a finished message, ignoring" << std::endl;
118 const auto idx = std::distance (
_children.begin (), i );
127 d->_baseSteps = steps;
142 return d_func()->_counterSteps;
150 d->_ignoreChildSigs =
true;
151 std::for_each( d->_children.begin (), d->_children.end(), [](
auto &child ) { child->reset(); });
163 return d_func()->_counterValue;
168 return d_func()->_children;
173 return d_func()->_label;
178 return d_func()->_sigLabelChanged;
183 return d_func()->_sigStepsChanged;
188 return d_func()->_sigValueChanged;
193 return d_func()->_sigProgressChanged;
198 return d_func()->_sigFinished;
203 return d_func()->_sigNewSubprogress;
209 if ( d->_baseSteps ==
steps )
212 d->_baseSteps =
steps;
220 d_func()->setLabel(
label );
226 auto set = std::max<double>(0, std::min<double>( curr, d->_baseSteps ) );
227 if ( set == d->_baseValue )
237 return d_func()->_baseSteps;
245 while ( d->_children.size() )
246 d->_children.front()->setFinished();
249 d->_sigFinished.emit( *
this );
255 if ( newLabel )
setLabel ( *newLabel );
261 auto i = std::find( d->_children.begin(), d->_children.end(), child );
262 const auto adjustedWeight = std::min<float>( std::max<float>( 0.0, weight ), 1.0 );
263 if ( i != d->_children.end() ) {
264 const auto index = std::distance ( d->_children.begin (), i );
265 d->_childInfo[index]._childWeight = adjustedWeight;
267 d->_children.push_back( child );
268 d->_childInfo.push_back( {
275 d->_sigNewSubprogress.emit( *
this, child );
292 auto instance = sThis.get();
293 instance->setBaseSteps ( data.max () - data.min () );
294 instance->setCurrent ( data.val () - data.min () );
295 instance->setLabel ( data.name () );
296 if ( data.finalReport() )
297 instance->setFinished();
Assign a vaiable a certain value when going out of scope.
Maintain [min,max] and counter (value) for progress counting.
function< bool(const ProgressData &)> ReceiverFnc
Most simple version of progress reporting The percentage in most cases.
std::shared_ptr< T > shared_this() const
static auto connectFunc(typename internal::MemberFunction< SenderFunc >::ClassType &s, SenderFunc &&sFun, ReceiverFunc &&rFunc, const Tracker &...trackers)
static auto connect(typename internal::MemberFunction< SenderFunc >::ClassType &s, SenderFunc &&sFun, typename internal::MemberFunction< ReceiverFunc >::ClassType &recv, ReceiverFunc &&rFunc)
void setLabel(const std::string &label)
void onChildFinished(ProgressObserver &child)
Signal< void(ProgressObserver &sender, const std::string &str)> _sigLabelChanged
Signal< void(ProgressObserver &sender, ProgressObserverRef child)> _sigNewSubprogress
Signal< void(ProgressObserver &sender)> _sigFinished
Signal< void(ProgressObserver &sender, double steps) > _sigStepsChanged
std::vector< ChildInfo > _childInfo
Signal< void(ProgressObserver &sender, double steps) > _sigProgressChanged
std::vector< ProgressObserverRef > _children
ProgressObserverPrivate(ProgressObserver &p)
ProgressObserverWeakRef _parent
Signal< void(ProgressObserver &sender, double steps) > _sigValueChanged
SignalProxy< void(ProgressObserver &sender, double current) > sigValueChanged()
void inc(double inc=1.0, const std::optional< std::string > &newLabel={})
void setBaseSteps(int steps)
const std::vector< zyppng::ProgressObserverRef > & children()
SignalProxy< void(ProgressObserver &sender, double steps)> sigStepsChanged()
zypp::ProgressData::ReceiverFnc makeProgressDataReceiver()
const std::string & label() const
void setLabel(const std::string &label)
void setCurrent(double curr)
SignalProxy< void(ProgressObserver &sender, double progress)> sigProgressChanged()
SignalProxy< void(ProgressObserver &sender)> sigFinished()
SignalProxy< void(ProgressObserver &sender, ProgressObserverRef child)> sigNewSubprogress()
void registerSubTask(const ProgressObserverRef &child, float weight=1.0)
SignalProxy< void(ProgressObserver &sender, const std::string &str)> sigLabelChanged()
String related utilities and Regular expression matching.
ChildInfo(ChildInfo &&other) noexcept
ChildInfo(std::vector< connection > &&conns, float weight)
ChildInfo & operator=(ChildInfo &&other)
ChildInfo & operator=(const ChildInfo &)=delete
ChildInfo(const ChildInfo &other)=delete
std::vector< connection > _signalConns
#define ZYPP_IMPL_PRIVATE_CONSTR_ARGS(Class,...)
#define ZYPP_IMPL_PRIVATE(Class)
#define ZYPP_DECLARE_PUBLIC(Class)