File: gui_status_handler.h

package info (click to toggle)
freefilesync 13.7-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 9,044 kB
  • sloc: cpp: 66,712; ansic: 447; makefile: 216
file content (129 lines) | stat: -rw-r--r-- 5,427 bytes parent folder | download | duplicates (2)
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
// *****************************************************************************
// * This file is part of the FreeFileSync project. It is distributed under    *
// * GNU General Public License: https://www.gnu.org/licenses/gpl-3.0          *
// * Copyright (C) Zenju (zenju AT freefilesync DOT org) - All Rights Reserved *
// *****************************************************************************

#ifndef GUI_STATUS_HANDLER_H_0183247018545
#define GUI_STATUS_HANDLER_H_0183247018545

#include <zen/error_log.h>
#include <wx/event.h>
#include "progress_indicator.h"
#include "main_dlg.h"
#include "../status_handler.h"


namespace fff
{
//classes handling sync and compare errors as well as status feedback

//internally pumps window messages => disable GUI controls to avoid unexpected callbacks!
class StatusHandlerTemporaryPanel : private wxEvtHandler, public StatusHandler
{
public:
    StatusHandlerTemporaryPanel(MainDialog& dlg,
                                const std::chrono::system_clock::time_point& startTime,
                                bool ignoreErrors,
                                size_t autoRetryCount,
                                std::chrono::seconds autoRetryDelay,
                                const Zstring& soundFileAlertPending);
    ~StatusHandlerTemporaryPanel();

    void     initNewPhase    (int itemsTotal, int64_t bytesTotal, ProcessPhase phaseID) override; //
    void     logMessage      (const std::wstring& msg, MsgType type)                    override; //
    void     reportWarning   (const std::wstring& msg, bool& warningActive)             override; //throw CancelProcess
    Response reportError     (const ErrorInfo& errorInfo)                               override; //
    void     reportFatalError(const std::wstring& msg)                                  override; //
    ErrorStats getErrorStats() const override;

    void forceUiUpdateNoThrow() override;

    struct Result
    {
        ProcessSummary summary;
        zen::SharedRef<const zen::ErrorLog> errorLog;
    };
    Result prepareResult(); //noexcept!!

private:
    void onLocalKeyEvent(wxKeyEvent& event);
    void onAbortCompare(wxCommandEvent& event); //handle abort button click
    void showStatsPanel();

    MainDialog& mainDlg_;
    zen::ErrorLog errorLog_;
    mutable Statistics::ErrorStats errorStatsBuf_{};
    mutable size_t errorStatsRowsChecked_ = 0;
    const bool ignoreErrors_;
    const size_t autoRetryCount_;
    const std::chrono::seconds autoRetryDelay_;
    const Zstring soundFileAlertPending_;
    const std::chrono::system_clock::time_point startTime_;
    const std::chrono::steady_clock::time_point panelInitTime_ = std::chrono::steady_clock::now();
};


//StatusHandlerFloatingDialog(SyncProgressDialog) will internally process Window messages! disable GUI controls to avoid unexpected callbacks!
class StatusHandlerFloatingDialog : public StatusHandler
{
public:
    StatusHandlerFloatingDialog(wxFrame* parentDlg,
                                const std::vector<std::wstring>& jobNames,
                                const std::chrono::system_clock::time_point& startTime,
                                bool ignoreErrors,
                                size_t autoRetryCount,
                                std::chrono::seconds autoRetryDelay,
                                const Zstring& soundFileSyncComplete,
                                const Zstring& soundFileAlertPending,
                                const zen::WindowLayout::Dimensions& dim,
                                bool autoCloseDialog); //noexcept!
    ~StatusHandlerFloatingDialog();

    void     initNewPhase    (int itemsTotal, int64_t bytesTotal, ProcessPhase phaseID) override; //
    void     logMessage      (const std::wstring& msg, MsgType type)                    override; //
    void     reportWarning   (const std::wstring& msg, bool& warningActive)             override; //throw CancelProcess
    Response reportError     (const ErrorInfo& errorInfo)                               override; //
    void     reportFatalError(const std::wstring& msg)                                  override; //
    ErrorStats getErrorStats() const override;

    void updateDataProcessed(int itemsDelta, int64_t bytesDelta) override; //noexcept!!
    void forceUiUpdateNoThrow()                                  override; //

    struct Result
    {
        ProcessSummary summary;
        zen::SharedRef<zen::ErrorLog> errorLog;
    };
    Result prepareResult();

    enum class FinalRequest
    {
        none,
        exit,
        shutdown
    };
    struct DlgOptions
    {
        bool autoCloseSelected;
        zen::WindowLayout::Dimensions dim;
        FinalRequest finalRequest;
    };
    DlgOptions showResult();

private:
    const std::vector<std::wstring> jobNames_;
    const std::chrono::system_clock::time_point startTime_;
    const size_t autoRetryCount_;
    const std::chrono::seconds autoRetryDelay_;
    const Zstring soundFileSyncComplete_;
    const Zstring soundFileAlertPending_;
    SyncProgressDialog* progressDlg_; //managed to have the same lifetime as this handler!
    zen::SharedRef<zen::ErrorLog> errorLog_ = zen::makeSharedRef<zen::ErrorLog>();
    mutable Statistics::ErrorStats errorStatsBuf_{};
    mutable size_t errorStatsRowsChecked_ = 0;
    std::optional<TaskResult> syncResult_;
};
}

#endif //GUI_STATUS_HANDLER_H_0183247018545