-
Notifications
You must be signed in to change notification settings - Fork 4
Expand file tree
/
Copy pathnuklear_console_progress.h
More file actions
160 lines (132 loc) · 5.25 KB
/
nuklear_console_progress.h
File metadata and controls
160 lines (132 loc) · 5.25 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
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
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
#ifndef NK_CONSOLE_PROGRESS_H__
#define NK_CONSOLE_PROGRESS_H__
typedef struct nk_console_progress_data {
nk_size max_size;
nk_size* value_size;
} nk_console_progress_data;
#if defined(__cplusplus)
extern "C" {
#endif
NK_API nk_console* nk_console_progress(nk_console* parent, const char* text, nk_size* current, nk_size max);
NK_API void nk_console_progress_update(nk_console* progress, const char* label, nk_size* current, nk_size max);
NK_API struct nk_rect nk_console_progress_render(nk_console* console);
#if defined(__cplusplus)
}
#endif
#endif // NK_CONSOLE_PROGRESS_H__
#if defined(NK_CONSOLE_IMPLEMENTATION) && !defined(NK_CONSOLE_HEADER_ONLY)
#ifndef NK_CONSOLE_PROGRESS_IMPLEMENTATION_ONCE
#define NK_CONSOLE_PROGRESS_IMPLEMENTATION_ONCE
#if defined(__cplusplus)
extern "C" {
#endif
NK_API nk_console* nk_console_progress(nk_console* parent, const char* text, nk_size* current, nk_size max) {
NK_ASSERT(current != NULL);
NK_ASSERT(max > 0);
// Create the widget data.
nk_console_progress_data* data = (nk_console_progress_data*)NK_CONSOLE_MALLOC(nk_handle_id(0), NULL, sizeof(nk_console_progress_data));
nk_zero(data, sizeof(nk_console_progress_data));
nk_console* progress = nk_console_label(parent, text);
progress->render = nk_console_progress_render;
progress->type = NK_CONSOLE_PROGRESS;
progress->selectable = nk_true;
data->value_size = current;
data->max_size = max;
progress->columns = text != NULL ? 2 : 1;
progress->data = (void*)data;
if (*current > max) {
*current = max;
}
return progress;
}
NK_API void nk_console_progress_update(nk_console* progress, const char* label, nk_size* current, nk_size max) {
if (!progress || !progress->data) return;
nk_console_progress_data* data = (nk_console_progress_data*)progress->data;
progress->label = label;
progress->label_length = nk_strlen(label);
progress->columns = label != NULL ? 2 : 1;
data->value_size = current;
data->max_size = max;
if (current != NULL && *current > max) {
*current = max;
}
}
NK_API struct nk_rect nk_console_progress_render(nk_console* console) {
nk_console_progress_data* data = (nk_console_progress_data*)console->data;
if (data == NULL) {
return nk_rect(0, 0, 0, 0);
}
nk_console_layout_widget(console);
nk_console* top = nk_console_get_top(console);
// Allow changing the value.
nk_bool active = nk_false;
if (!console->disabled && nk_console_is_active_widget(console)) {
nk_console_top_data* top_data = (nk_console_top_data*)top->data;
if (!top_data->input_processed) {
if (nk_console_button_pushed(top, NK_GAMEPAD_BUTTON_LEFT)) {
if (data->value_size != NULL && *data->value_size > 0) {
*data->value_size = *data->value_size - 1;
nk_console_trigger_event(console, NK_CONSOLE_EVENT_CHANGED);
}
active = nk_true;
top_data->input_processed = nk_true;
}
else if (nk_console_button_pushed(top, NK_GAMEPAD_BUTTON_RIGHT)) {
if (data->value_size != NULL && *data->value_size < data->max_size) {
*data->value_size = *data->value_size + 1;
nk_console_trigger_event(console, NK_CONSOLE_EVENT_CHANGED);
}
active = nk_true;
top_data->input_processed = nk_true;
}
}
}
// Display the label
if (nk_strlen(console->label) > 0) {
if (!nk_console_is_active_widget(console)) {
nk_widget_disable_begin(console->ctx);
}
nk_label(console->ctx, console->label, NK_TEXT_LEFT);
if (!nk_console_is_active_widget(console)) {
nk_widget_disable_end(console->ctx);
}
}
struct nk_rect widget_bounds = nk_layout_widget_bounds(console->ctx);
if (console->disabled) {
nk_widget_disable_begin(console->ctx);
}
// Progress
struct nk_style_item cursor_normal = console->ctx->style.progress.cursor_normal;
struct nk_style_item cursor_hover = console->ctx->style.progress.cursor_hover;
struct nk_style_item cursor_active = console->ctx->style.progress.cursor_active;
if (nk_console_is_active_widget(console)) {
if (active) {
console->ctx->style.progress.cursor_normal = cursor_active;
}
else {
console->ctx->style.progress.cursor_normal = cursor_hover;
}
}
// Display the widget
if (nk_progress(console->ctx, data->value_size, data->max_size, nk_true)) {
nk_console_trigger_event(console, NK_CONSOLE_EVENT_CHANGED);
}
// Restore the styles
console->ctx->style.progress.cursor_normal = cursor_normal;
console->ctx->style.progress.cursor_hover = cursor_hover;
console->ctx->style.progress.cursor_active = cursor_active;
if (console->disabled) {
nk_widget_disable_end(console->ctx);
}
// Allow switching up/down in widgets
if (nk_console_is_active_widget(console)) {
nk_console_check_up_down(console);
nk_console_check_tooltip(console);
}
return widget_bounds;
}
#if defined(__cplusplus)
}
#endif
#endif // NK_CONSOLE_PROGRESS_IMPLEMENTATION_ONCE
#endif // NK_CONSOLE_IMPLEMENTATION