๐Ÿ“ฆ RobLoach / nuklear_console

๐Ÿ“„ nuklear_console_progress.h ยท 145 lines
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#ifndef NK_CONSOLE_PROGRESS_H__
#define NK_CONSOLE_PROGRESS_H__

#if defined(__cplusplus)
extern "C" {
#endif

typedef struct nk_console_progress_data {
    nk_size max_size;
    nk_size* value_size;
} nk_console_progress_data;

NK_API nk_console* nk_console_progress(nk_console* parent, const char* text, 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 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_onchange(console);
                }
                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_onchange(console);
                }
                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_active;
        }
    }

    // Display the widget
    if (nk_progress(console->ctx, data->value_size, data->max_size, nk_true)) {
        nk_console_onchange(console);
    }

    // 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, widget_bounds);
        nk_console_check_tooltip(console);
    }

    return widget_bounds;
}

#if defined(__cplusplus)
}
#endif

#endif  // NK_CONSOLE_PROGRESS_IMPLEMENTATION_ONCE
#endif  // NK_CONSOLE_IMPLEMENTATION