aboutsummaryrefslogtreecommitdiff
path: root/src/zen/progressbar.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/zen/progressbar.cpp')
-rw-r--r--src/zen/progressbar.cpp73
1 files changed, 14 insertions, 59 deletions
diff --git a/src/zen/progressbar.cpp b/src/zen/progressbar.cpp
index 83606df67..b758c061b 100644
--- a/src/zen/progressbar.cpp
+++ b/src/zen/progressbar.cpp
@@ -8,16 +8,12 @@
#include <zencore/logging.h>
#include <zencore/windows.h>
#include <zenremotestore/operationlogoutput.h>
+#include <zenutil/consoletui.h>
ZEN_THIRD_PARTY_INCLUDES_START
#include <gsl/gsl-lite.hpp>
ZEN_THIRD_PARTY_INCLUDES_END
-#if ZEN_PLATFORM_LINUX || ZEN_PLATFORM_MAC
-# include <sys/ioctl.h>
-# include <unistd.h>
-#endif
-
//////////////////////////////////////////////////////////////////////////
namespace zen {
@@ -31,35 +27,12 @@ GetConsoleHandle()
}
#endif
-static bool
-CheckStdoutTty()
-{
-#if ZEN_PLATFORM_WINDOWS
- HANDLE hStdOut = GetConsoleHandle();
- DWORD dwMode = 0;
- static bool IsConsole = ::GetConsoleMode(hStdOut, &dwMode);
- return IsConsole;
-#else
- return isatty(fileno(stdout));
-#endif
-}
-
-static bool
-IsStdoutTty()
-{
- static bool StdoutIsTty = CheckStdoutTty();
- return StdoutIsTty;
-}
-
static void
OutputToConsoleRaw(const char* String, size_t Length)
{
#if ZEN_PLATFORM_WINDOWS
HANDLE hStdOut = GetConsoleHandle();
-#endif
-
-#if ZEN_PLATFORM_WINDOWS
- if (IsStdoutTty())
+ if (TuiIsStdoutTty())
{
WriteConsoleA(hStdOut, String, (DWORD)Length, 0, 0);
}
@@ -85,26 +58,6 @@ OutputToConsoleRaw(const StringBuilderBase& SB)
}
uint32_t
-GetConsoleColumns(uint32_t Default)
-{
-#if ZEN_PLATFORM_WINDOWS
- HANDLE hStdOut = GetConsoleHandle();
- CONSOLE_SCREEN_BUFFER_INFO csbi;
- if (GetConsoleScreenBufferInfo(hStdOut, &csbi) == TRUE)
- {
- return (uint32_t)(csbi.srWindow.Right - csbi.srWindow.Left + 1);
- }
-#else
- struct winsize w;
- if (ioctl(STDOUT_FILENO, TIOCGWINSZ, &w) == 0)
- {
- return (uint32_t)w.ws_col;
- }
-#endif
- return Default;
-}
-
-uint32_t
GetUpdateDelayMS(ProgressBar::Mode InMode)
{
switch (InMode)
@@ -165,7 +118,7 @@ ProgressBar::PopLogOperation(Mode InMode)
}
ProgressBar::ProgressBar(Mode InMode, std::string_view InSubTask)
-: m_Mode((!IsStdoutTty() && InMode == Mode::Pretty) ? Mode::Plain : InMode)
+: m_Mode((!TuiIsStdoutTty() && InMode == Mode::Pretty) ? Mode::Plain : InMode)
, m_LastUpdateMS((uint64_t)-1)
, m_PausedMS(0)
, m_SubTask(InSubTask)
@@ -245,6 +198,7 @@ ProgressBar::UpdateState(const State& NewState, bool DoLinebreak)
const std::string Details = (!NewState.Details.empty()) ? fmt::format(": {}", NewState.Details) : "";
const std::string Output = fmt::format("{} {}% ({}){}\n", Task, PercentDone, NiceTimeSpanMs(ElapsedTimeMS), Details);
OutputToConsoleRaw(Output);
+ m_State = NewState;
}
else if (m_Mode == Mode::Pretty)
{
@@ -253,10 +207,11 @@ ProgressBar::UpdateState(const State& NewState, bool DoLinebreak)
size_t ProgressBarCount = (ProgressBarSize * PercentDone) / 100;
uint64_t Completed = NewState.TotalCount - NewState.RemainingCount;
uint64_t ETAElapsedMS = ElapsedTimeMS -= m_PausedMS;
- uint64_t ETAMS =
- (NewState.Status == State::EStatus::Running) && (PercentDone > 5) ? (ETAElapsedMS * NewState.RemainingCount) / Completed : 0;
+ uint64_t ETAMS = ((m_State.TotalCount == NewState.TotalCount) && (NewState.Status == State::EStatus::Running)) && (PercentDone > 5)
+ ? (ETAElapsedMS * NewState.RemainingCount) / Completed
+ : 0;
- uint32_t ConsoleColumns = GetConsoleColumns(1024);
+ uint32_t ConsoleColumns = TuiConsoleColumns(1024);
const std::string PercentString = fmt::format("{:#3}%", PercentDone);
@@ -435,19 +390,19 @@ class ConsoleOpLogOutput : public OperationLogOutput
{
public:
ConsoleOpLogOutput(zen::ProgressBar::Mode InMode) : m_Mode(InMode) {}
- virtual void EmitLogMessage(int LogLevel, std::string_view Format, fmt::format_args Args)
+ virtual void EmitLogMessage(const logging::LogPoint& Point, fmt::format_args Args) override
{
- logging::EmitConsoleLogMessage(LogLevel, Format, Args);
+ logging::EmitConsoleLogMessage(Point, Args);
}
- virtual void SetLogOperationName(std::string_view Name) { zen::ProgressBar::SetLogOperationName(m_Mode, Name); }
- virtual void SetLogOperationProgress(uint32_t StepIndex, uint32_t StepCount)
+ virtual void SetLogOperationName(std::string_view Name) override { zen::ProgressBar::SetLogOperationName(m_Mode, Name); }
+ virtual void SetLogOperationProgress(uint32_t StepIndex, uint32_t StepCount) override
{
zen::ProgressBar::SetLogOperationProgress(m_Mode, StepIndex, StepCount);
}
- virtual uint32_t GetProgressUpdateDelayMS() { return GetUpdateDelayMS(m_Mode); }
+ virtual uint32_t GetProgressUpdateDelayMS() override { return GetUpdateDelayMS(m_Mode); }
- virtual ProgressBar* CreateProgressBar(std::string_view InSubTask) { return new ConsoleOpLogProgressBar(m_Mode, InSubTask); }
+ virtual ProgressBar* CreateProgressBar(std::string_view InSubTask) override { return new ConsoleOpLogProgressBar(m_Mode, InSubTask); }
private:
zen::ProgressBar::Mode m_Mode;