libzypp 17.34.1
progressobserver.h
Go to the documentation of this file.
1/*---------------------------------------------------------------------\
2| ____ _ __ __ ___ |
3| |__ / \ / / . \ . \ |
4| / / \ V /| _/ _/ |
5| / /__ | | | | | | |
6| /_____||_| |_| |_| |
7| |
8\---------------------------------------------------------------------*/
9#ifndef ZYPPNG_PROGRESSOBSERVER_H
10#define ZYPPNG_PROGRESSOBSERVER_H
11
12#include <zypp-core/zyppng/base/Base>
13#include <zypp-core/zyppng/base/Signals>
14#include <zypp-core/zyppng/pipelines/Expected>
15#include <optional>
16#include <string>
17
18// backwards compat
20
21
22namespace zyppng {
23
24 ZYPP_FWD_DECL_TYPE_WITH_REFS( ProgressObserver );
25 class ProgressObserverPrivate;
26
27 class ProgressObserver : public Base
28 {
31
32 public:
33 ZYPP_DECL_PRIVATE_CONSTR_ARGS(ProgressObserver, const std::string &label = std::string(), int steps = 100 );
34
35 void setBaseSteps( int steps );
36 int baseSteps ( ) const;
37 int steps ( ) const;
38
39 void reset ( );
40 void setCurrent ( double curr );
41 void setFinished ( );
42 void inc ( double inc = 1.0, const std::optional<std::string> &newLabel = {} );
43
44 double progress() const;
45 double current() const;
46
47 const std::vector<zyppng::ProgressObserverRef> &children();
48
49 void setLabel ( const std::string &label );
50 const std::string &label () const;
51
52 void registerSubTask ( const ProgressObserverRef& child, float weight = 1.0 );
53
55
56 SignalProxy<void ( ProgressObserver &sender, const std::string &str )> sigLabelChanged ();
57 SignalProxy<void ( ProgressObserver &sender, double steps )> sigStepsChanged();
58 SignalProxy<void ( ProgressObserver &sender, double current ) > sigValueChanged();
59 SignalProxy<void ( ProgressObserver &sender, double progress )> sigProgressChanged();
60 SignalProxy<void ( ProgressObserver &sender )> sigFinished();
61 SignalProxy<void ( ProgressObserver &sender, ProgressObserverRef child )> sigNewSubprogress();
62
63 };
64
65
66 namespace operators {
67
68 namespace detail {
69
72 Set
73 };
74
75 template <auto mode = progress_helper_mode::Increase>
77
78 progress_helper( ProgressObserverRef &&progressObserver, std::optional<std::string> &&newStr, double inc )
79 : _progressObserver( std::move(progressObserver) )
80 , _newString( std::move(newStr) )
81 , _progressInc( inc )
82 {}
83
84 template <typename T>
85 void operator() ( T && ) {
86 if ( _progressObserver ) {
87 if constexpr ( mode == progress_helper_mode::Increase ) {
89 } else {
90 _progressObserver->setCurrent ( _progressInc );
91 if ( _newString )
92 _progressObserver->setLabel ( *_newString );
93 }
94 }
95 }
96
97 private:
98 ProgressObserverRef _progressObserver;
99 std::optional<std::string> _newString;
101 };
102 }
103
108 inline auto incProgress( ProgressObserverRef progressObserver, double progrIncrease = 1.0, std::optional<std::string> newStr = {} ) {
109 return detail::progress_helper<detail::progress_helper_mode::Increase>( std::move(progressObserver), std::move(newStr), progrIncrease );
110 }
111
116 inline auto setProgress( ProgressObserverRef progressObserver, double progrValue, std::optional<std::string> newStr = {} ) {
117 return detail::progress_helper<detail::progress_helper_mode::Set>( std::move(progressObserver), std::move(newStr), progrValue );
118 }
119
123 inline auto setProgressLabel( ProgressObserverRef progressObserver, std::string &&newStr ) {
124 // use the Increase functor, it allows us to let the progress value untouched and just sets the strings
125 return detail::progress_helper<detail::progress_helper_mode::Increase>( std::move(progressObserver), std::move(newStr), 0.0 );
126 }
127
131 inline auto finishProgress( ProgressObserverRef progressObserver ) {
132 return [ progressObserver = std::move(progressObserver) ]( auto &&val ) {
133 if ( progressObserver ) progressObserver->setFinished ();
134 return std::forward<decltype(val)>(val);
135 };
136 }
137
138
139 }
140
141} // namespace zyppng
142
143#endif // ZYPPNG_PROGRESSOBSERVER_H
function< bool(const ProgressData &)> ReceiverFnc
Most simple version of progress reporting The percentage in most cases.
SignalProxy< void(ProgressObserver &sender, double current) > sigValueChanged()
void inc(double inc=1.0, const std::optional< std::string > &newLabel={})
ZYPP_DECL_PRIVATE_CONSTR_ARGS(ProgressObserver, const std::string &label=std::string(), int steps=100)
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)
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()
Definition Arch.h:364
String related utilities and Regular expression matching.
auto setProgress(ProgressObserverRef progressObserver, double progrValue, std::optional< std::string > newStr={})
auto setProgressLabel(ProgressObserverRef progressObserver, std::string &&newStr)
auto finishProgress(ProgressObserverRef progressObserver)
auto incProgress(ProgressObserverRef progressObserver, double progrIncrease=1.0, std::optional< std::string > newStr={})
std::optional< std::string > _newString
progress_helper(ProgressObserverRef &&progressObserver, std::optional< std::string > &&newStr, double inc)
#define ZYPP_ADD_CREATE_FUNC(Class)
Definition zyppglobal.h:196
#define ZYPP_DECLARE_PRIVATE(Class)
Definition zyppglobal.h:86
#define ZYPP_FWD_DECL_TYPE_WITH_REFS(T)
Definition zyppglobal.h:117