/
MapFileProgressHandler.h
77 lines (65 loc) · 1.6 KB
/
MapFileProgressHandler.h
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
#pragma once
#include "imap.h"
#include "iradiant.h"
#include <sigc++/functors/mem_fun.h>
#include "messages/MapFileOperation.h"
#include "wxutil/ModalProgressDialog.h"
#include "wxutil/dialog/MessageBox.h"
#include "registry/registry.h"
namespace ui
{
class MapFileProgressHandler
{
private:
std::size_t _msgSubscription;
wxutil::ModalProgressDialogPtr _dialog;
public:
MapFileProgressHandler()
{
_msgSubscription = GlobalRadiantCore().getMessageBus().addListener(
radiant::TypeListener<map::FileOperation>(
sigc::mem_fun(this, &MapFileProgressHandler::handleFileOperation)));
}
~MapFileProgressHandler()
{
GlobalRadiantCore().getMessageBus().removeListener(_msgSubscription);
}
private:
void handleFileOperation(map::FileOperation& msg)
{
try
{
switch (msg.getMessageType())
{
case map::FileOperation::Started:
if (GlobalMainFrame().isActiveApp() && !registry::getValue<bool>(RKEY_MAP_SUPPRESS_LOAD_STATUS_DIALOG))
{
_dialog.reset(new wxutil::ModalProgressDialog(
msg.getOperationType() == map::FileOperation::Type::Export ? _("Writing map") : _("Loading map")));
}
break;
case map::FileOperation::Progress:
if (!_dialog) break;
if (msg.canCalculateProgress())
{
_dialog->setTextAndFraction(msg.getText(), msg.getProgressFraction());
}
else
{
_dialog->setText(msg.getText());
_dialog->Pulse();
}
break;
case map::FileOperation::Finished:
_dialog.reset();
break;
};
}
catch (const wxutil::ModalProgressDialog::OperationAbortedException&)
{
_dialog.reset();
msg.cancelOperation();
}
}
};
}