This repository was archived by the owner on Jan 16, 2021. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathuser_control.cpp
More file actions
103 lines (87 loc) · 4.31 KB
/
Copy pathuser_control.cpp
File metadata and controls
103 lines (87 loc) · 4.31 KB
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
#include <vector>
#include <xtd/xtd.forms>
using namespace std;
using namespace xtd;
using namespace xtd::drawing;
using namespace xtd::forms;
namespace examples {
enum class operation_status {
none,
running,
succeed,
failed
};
class operation : public user_control {
public:
operation() {size_ = default_size();}
operation_status status() const {return status_;}
void status(operation_status status) {
if (status_ != status) {
status_ = status;
invalidate();
}
}
protected:
void on_paint(paint_event_args& e) override {
user_control::on_paint(e);
auto status_rectangle = rectangle {1, 1, 28, 28};
e.graphics().fill_rectangle(solid_brush(color::dark(back_color())), status_rectangle);
auto status_string = std::map<operation_status, std::string> {{operation_status::none, u8""}, {operation_status::running, u8"☞"}, {operation_status::succeed, u8"√"}, {operation_status::failed, u8"X"}}[status()];
auto status_brush = solid_brush(std::map<operation_status, color> {{operation_status::none, fore_color()}, {operation_status::running, color::yellow}, {operation_status::succeed, color::green}, {operation_status::failed, color::red}}[status()]);
e.graphics().draw_string(status_string, drawing::font(default_font(), 18, font_style::italic), status_brush, status_rectangle, string_format().alignment(string_alignment::center).line_alignment(string_alignment::center));
e.graphics().draw_line(pen(color::dark(color::dark(back_color()))), status_rectangle.location(), point(status_rectangle.width(), 1));
e.graphics().draw_line(pen(color::dark(color::dark(back_color()))), status_rectangle.location(), point(1, status_rectangle.height()));
e.graphics().draw_line(pen(color::light(color::light(back_color()))), point(1, status_rectangle.height()), point(status_rectangle.width(), status_rectangle.height()));
e.graphics().draw_line(pen(color::light(color::light(back_color()))), point(status_rectangle.width(), 1), point(status_rectangle.width(), status_rectangle.height()));
e.graphics().draw_string(text(), default_font(), system_brushes::control_text(), 35, e.graphics().measure_string(text(), default_font()).height() / 2);
}
drawing::size default_size() const override {return {150, 30};}
private:
operation_status status_ = operation_status::none;
};
class form1 : public form {
public:
form1() {
text("User control example");
operations[0].parent(*this);
operations[0].status(operation_status::succeed);
operations[0].text("First operation");
operations[0].location({5, 5});
operations[0].click += {*this, &form1::on_operation_click};
operations[1].parent(*this);
operations[1].status(operation_status::failed);
operations[1].text("Second operation");
operations[1].location({5, 35});
operations[1].click += {*this, &form1::on_operation_click};
operations[2].parent(*this);
operations[2].status(operation_status::running);
operations[2].text("Third operation");
operations[2].location({5, 65});
operations[2].click += {*this, &form1::on_operation_click};
operations[3].parent(*this);
operations[3].status(operation_status::none);
operations[3].text("Fourth operation");
operations[3].location({5, 95});
operations[3].click += {*this, &form1::on_operation_click};
operations[4].parent(*this);
operations[4].status(operation_status::none);
operations[4].text("Fifth operation");
operations[4].location({5, 125});
operations[4].click += {*this, &form1::on_operation_click};
}
private:
void on_operation_click(control& sender, const event_args& e) {
examples::operation& operation = static_cast<examples::operation&>(sender);
switch (operation.status()) {
case operation_status::none: operation.status(operation_status::running); break;
case operation_status::running: operation.status(operation_status::succeed); break;
case operation_status::succeed: operation.status(operation_status::failed); break;
case operation_status::failed: operation.status(operation_status::none); break;
}
}
vector<operation> operations {5};
};
}
int main() {
application::run(examples::form1());
}