File: progress_bar.hpp

package info (click to toggle)
dnf5 5.4.0.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 17,960 kB
  • sloc: cpp: 94,312; python: 3,370; xml: 1,073; ruby: 600; sql: 250; ansic: 232; sh: 104; perl: 62; makefile: 30
file content (134 lines) | stat: -rw-r--r-- 4,005 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
// Copyright Contributors to the DNF5 project.
// Copyright Contributors to the libdnf project.
// SPDX-License-Identifier: LGPL-2.1-or-later
//
// This file is part of libdnf: https://github.com/rpm-software-management/libdnf/
//
// Libdnf is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 2.1 of the License, or
// (at your option) any later version.
//
// Libdnf 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 Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with libdnf.  If not, see <https://www.gnu.org/licenses/>.


#ifndef LIBDNF5_CLI_PROGRESSBAR_PROGRESS_BAR_HPP
#define LIBDNF5_CLI_PROGRESSBAR_PROGRESS_BAR_HPP

#include "libdnf5-cli/defs.h"

#include "libdnf5/common/impl_ptr.hpp"

#include <chrono>
#include <string>
#include <vector>


namespace libdnf5::cli::progressbar {


enum class ProgressBarState : int {
    READY,    // no color
    STARTED,  // no color
    SUCCESS,  // green
    WARNING,  // yellow
    ERROR,    // red
};


enum class MessageType : int {
    INFO,     // no color
    SUCCESS,  // green
    WARNING,  // yellow
    ERROR,    // red
};


class LIBDNF_CLI_API ProgressBar {
public:
    using Message = std::pair<MessageType, std::string>;

    explicit ProgressBar(int64_t total_ticks);
    explicit ProgressBar(int64_t total_ticks, const std::string & description);
    virtual ~ProgressBar();
    ProgressBar(const ProgressBar & src);
    ProgressBar & operator=(const ProgressBar & src);
    ProgressBar(ProgressBar && src) noexcept;
    ProgressBar & operator=(ProgressBar && src) noexcept;

    void reset();

    // ticks
    int64_t get_ticks() const noexcept;
    void set_ticks(int64_t value);
    void add_ticks(int64_t value);

    // total ticks
    int64_t get_total_ticks() const noexcept;
    void set_total_ticks(int64_t value);

    // number
    int32_t get_number() const noexcept;
    void set_number(int32_t value);

    // total
    int32_t get_total() const noexcept;
    void set_total(int32_t value);

    // workflow
    void start();
    ProgressBarState get_state() const noexcept;
    void set_state(ProgressBarState value);
    bool is_finished() const noexcept;
    bool is_failed() const noexcept;

    // description
    std::string get_description() const noexcept;
    void set_description(const std::string & value);

    // messages
    void add_message(MessageType type, const std::string & message);
    /// remove the last message
    void pop_message();
    const std::vector<Message> & get_messages() const noexcept;
    const std::string & get_message_prefix() const noexcept;

    /// Calculate number of lines occupied by messages when printed on terminal of the given width.
    /// Takes new lines and wide utf characters into account.
    std::size_t calculate_messages_terminal_lines(std::size_t terminal_width);

    // auto-finish feature; turn off if you want to handle state manually
    bool get_auto_finish() const noexcept;
    void set_auto_finish(bool value);

    // stats
    void update();
    int32_t get_percent_done() const noexcept;
    int64_t get_current_speed() const noexcept;
    int64_t get_average_speed() const noexcept;
    int64_t get_elapsed_seconds() const noexcept;
    int64_t get_remaining_seconds() const noexcept;

    std::chrono::time_point<std::chrono::system_clock> get_begin();

    LIBDNF_CLI_API friend std::ostream & operator<<(std::ostream & os, ProgressBar & bar);

protected:
    virtual void to_stream(std::ostream & stream) = 0;

private:
    class LIBDNF_CLI_LOCAL Impl;
    ImplPtr<Impl> p_impl;
};


}  // namespace libdnf5::cli::progressbar


#endif  // #define LIBDNF5_CLI_PROGRESSBAR_PROGRESS_BAR_HPP