Project

General

Profile

Revision 293

generalized menu

View differences:

proj/include/proj_macros.h
50 50
#define MAX_SCALE       10.0                 /** @brief Maximum zoom */
51 51

  
52 52
// Colors
53
#define TEXT_COLOR              0x888888
54
#define HIGHLIGHT_COLOR         0xA0A0A0
53
#define TEXT_COLOR              0xFFFFFF
54
#define HIGHLIGHT_COLOR         0x404040
55 55
#define DELIMITER_COLOR         0x404040
56 56

  
57 57
#endif /* end of include guard: PROJ_MACROS_H_INCLUDED */
proj/libs/graph/include/menu.h
7 7

  
8 8
menu_t* (menu_ctor)(const font_t *fnt);
9 9

  
10
int (menu_add_item)(menu_t *menu, const char *s);
11

  
10 12
int (menu_update_state)(menu_t *menu, int click);
11 13

  
12 14
void (menu_draw)(menu_t *menu);
proj/libs/graph/src/font.c
168 168
        if(alp_new_buf == NULL) return ALLOC_ERROR;
169 169

  
170 170
        for(size_t newy = 0; newy < newH; ++newy){
171
            size_t y = newy/factor;
171
            size_t y = newy/factor+0.5;
172 172
            for(size_t newx = 0; newx < newW; ++newx){
173
                size_t x = newx/factor;
173
                size_t x = newx/factor+0.5;
174 174
                *(alp_new_buf+newx+newy*newW) = *(alp_buf+x+y*W);
175 175
            }
176 176
        }
177 177
        free(alp_buf);
178

  
179

  
180 178
    }
181 179
    // Get initial value of x
182 180
    int16_t initx;{
proj/libs/graph/src/menu.c
6 6
#include "rectangle.h"
7 7
#include "proj_func.h"
8 8
#include "proj_macros.h"
9
#include "errors.h"
9 10

  
11
const int W  = 400;
12
const int H  = 60;
13
const int W1 = 40;
14
const int H1 = 40;
15
const int H2 = 20;
16

  
10 17
struct menu {
18
    const font_t *fnt;
11 19
    size_t sz;
12 20
    rectangle_t **r;
13 21
    text_t      **t;
......
18 26
    if(fnt == NULL) return NULL;
19 27
    menu_t *ret = (menu_t*)malloc(sizeof(menu_t));
20 28
    if (ret == NULL) return NULL;
29
    ret->fnt = fnt;
21 30
    ret->sz = 0;
22 31
    ret->r = NULL;
23 32
    ret->t = NULL;
......
28 37
    rectangle_set_outline_color(ret->frame, GRAPH_WHITE);
29 38
    rectangle_set_fill_trans(ret->frame, GRAPH_TRANSPARENT);
30 39

  
40
    menu_add_item(ret, "Play");
41
    menu_add_item(ret, "Test");
42
    menu_add_item(ret, "Exit");
31 43

  
32
    ret->sz = 3;
33
    ret->r = realloc(ret->r, ret->sz*sizeof(rectangle_t*));
34
    ret->t = realloc(ret->t, ret->sz*sizeof(text_t     *));
35
    ret->r[0] = rectangle_ctor(0, 0, 400, 100);
36
    ret->r[1] = rectangle_ctor(0, 0, 400, 100);
37
    ret->r[2] = rectangle_ctor(0, 0, 400, 100);
38
    ret->t[0] = text_ctor(fnt, "Play");
39
    ret->t[1] = text_ctor(fnt, "Test");
40
    ret->t[2] = text_ctor(fnt, "Exit");
44
    return ret;
45
}
41 46

  
42
    if (ret->r[0] == NULL || ret->r[1] == NULL || ret->r[2] == NULL ||
43
        ret->t[0] == NULL || ret->t[1] == NULL || ret->t[2] == NULL ||
44
        ret->frame == NULL) return NULL;
45
    // VISUAL
46
    rectangle_set_fill_color(ret->r[0], GRAPH_BLACK);
47
    rectangle_set_outline_width(ret->r[0], 2);
48
    rectangle_set_outline_color(ret->r[0], GRAPH_WHITE);
49
    rectangle_set_fill_trans(ret->r[0], GRAPH_TRANSPARENT);
47
static int menu_recalculate(menu_t *menu){
48
    const int Wtotal = 2*W1+W;
49
    const int Htotal = 2*H1+menu->sz*H+(menu->sz-1)*H2;
50
    int x = graph_get_XRes()/2-Wtotal/2;
51
    int y = graph_get_YRes()/2-Htotal/2;
52
    rectangle_set_pos (menu->frame, x, y);
53
    rectangle_set_size(menu->frame, Wtotal, Htotal);
54
    x += W1; y += H1;
55
    for(size_t i = 0; i < menu->sz; ++i, y+=H+H2){
56
        rectangle_set_pos(menu->r[i], x, y);
57
        text_set_pos     (menu->t[i], x+W/2, y+H/2);
58
    }
59
    return SUCCESS;
60
}
50 61

  
51
    rectangle_set_fill_color(ret->r[1], GRAPH_BLACK);
52
    rectangle_set_outline_width(ret->r[1], 2);
53
    rectangle_set_outline_color(ret->r[1], GRAPH_WHITE);
54
    rectangle_set_fill_trans(ret->r[1], GRAPH_TRANSPARENT);
62
int (menu_add_item)(menu_t *menu, const char *s){
63
    rectangle_t *r = rectangle_ctor(0, 0, W, H);
64
    text_t      *t = text_ctor(menu->fnt, s);
65
    if(r == NULL || t == NULL){
66
        rectangle_dtor(r);
67
        text_dtor(t);
68
        return NULL_PTR;
69
    }
70
    rectangle_set_fill_color   (r, GRAPH_BLACK);
71
    rectangle_set_outline_width(r, 2);
72
    rectangle_set_outline_color(r, GRAPH_WHITE);
55 73

  
56
    rectangle_set_fill_color(ret->r[2], GRAPH_BLACK);
57
    rectangle_set_outline_width(ret->r[2], 2);
58
    rectangle_set_outline_color(ret->r[2], GRAPH_WHITE);
59
    rectangle_set_fill_trans(ret->r[2], GRAPH_TRANSPARENT);
74
    text_set_valign(t, text_valign_center);
75
    text_set_halign(t, text_halign_center);
76
    text_set_color (t, TEXT_COLOR);
60 77

  
61
    text_set_valign(ret->t[0], text_valign_center);
62
    text_set_halign(ret->t[0], text_halign_center);
63
    text_set_color(ret->t[0], TEXT_COLOR);
78
    ++menu->sz;
79
    menu->r = realloc(menu->r, menu->sz*sizeof(rectangle_t*));
80
    menu->t = realloc(menu->t, menu->sz*sizeof(text_t     *));
81
    menu->r[menu->sz-1] = r;
82
    menu->t[menu->sz-1] = t;
64 83

  
65
    text_set_valign(ret->t[1], text_valign_center);
66
    text_set_halign(ret->t[1], text_halign_center);
67
    text_set_color(ret->t[1], TEXT_COLOR);
68

  
69
    text_set_valign(ret->t[2], text_valign_center);
70
    text_set_halign(ret->t[2], text_halign_center);
71
    text_set_color(ret->t[2], TEXT_COLOR);
72
    // POSITIONS
73
    rectangle_set_pos(ret->r[0],
74
                      graph_get_XRes()/2    - rectangle_get_w(ret->r[0])/2,
75
                      graph_get_YRes()*0.35 - rectangle_get_h(ret->r[0])/2);
76

  
77

  
78
    rectangle_set_pos(ret->r[1],
79
                    graph_get_XRes()/2    - rectangle_get_w(ret->r[1])/2,
80
                    graph_get_YRes()*0.5 - rectangle_get_h(ret->r[1])/2);
81

  
82

  
83
    rectangle_set_pos(ret->r[2],
84
                  graph_get_XRes()/2    - rectangle_get_w(ret->r[2])/2,
85
                  graph_get_YRes()*0.65 - rectangle_get_h(ret->r[2])/2);
86

  
87
    text_set_pos(ret->t[0], rectangle_get_x(ret->r[0])+rectangle_get_w(ret->r[0])/2,
88
                          rectangle_get_y(ret->r[0])+rectangle_get_h(ret->r[0])/2);
89

  
90
    text_set_pos(ret->t[1], rectangle_get_x(ret->r[1])+rectangle_get_w(ret->r[1])/2,
91
                          rectangle_get_y(ret->r[1])+rectangle_get_h(ret->r[1])/2);
92

  
93
    text_set_pos(ret->t[2], rectangle_get_x(ret->r[2])+rectangle_get_w(ret->r[2])/2,
94
                          rectangle_get_y(ret->r[2])+rectangle_get_h(ret->r[2])/2);
95

  
96
    rectangle_set_pos(ret->frame,
97
                  graph_get_XRes()/2    - rectangle_get_w(ret->frame)/2,
98
                  graph_get_YRes()*0.5 - rectangle_get_h(ret->frame)/2);
99
    return ret;
84
    return menu_recalculate(menu);
100 85
}
101 86

  
102 87
int (menu_update_state)(menu_t *menu, int click) {
103

  
104
    if (rectangle_collide_point(menu->r[0], *get_mouse_X(), *get_mouse_Y())) {
105
        highlighted = GAME;
106
        if (click) return GAME;
107
    } else if (rectangle_collide_point(menu->r[1], *get_mouse_X(), *get_mouse_Y())) {
108
        highlighted = TEST;
109
        if (click) return TEST;
110
    } else if (rectangle_collide_point(menu->r[2], *get_mouse_X(), *get_mouse_Y())) {
111
        highlighted = EXIT;
112
        if (click) return EXIT;
113
    } else {
114
        highlighted = -1;
115
    }
116
    return MENU;
88
    if(!click) return -1;
89
    for(size_t i = 0; i < menu->sz; ++i)
90
        if(rectangle_collide_point(menu->r[i], *get_mouse_X(), *get_mouse_Y()))
91
            return i;
92
    return -1;
117 93
}
118 94

  
119 95
void (menu_draw)(menu_t *menu) {
120 96
    rectangle_draw(menu->frame);
121
    switch (highlighted) {
122
    case GAME:
123
        rectangle_set_fill_color(menu->r[0], HIGHLIGHT_COLOR);
124
        rectangle_draw(menu->r[0]);
125
        rectangle_draw(menu->r[1]);
126
        rectangle_draw(menu->r[2]);
127
        rectangle_set_fill_color(menu->r[0], GRAPH_BLACK);
128
        break;
129
    case TEST:
130
        rectangle_set_fill_color(menu->r[1], HIGHLIGHT_COLOR);
131
        rectangle_draw(menu->r[0]);
132
        rectangle_draw(menu->r[1]);
133
        rectangle_draw(menu->r[2]);
134
        rectangle_set_fill_color(menu->r[1], GRAPH_BLACK);
135
        break;
136
    case EXIT:
137
        rectangle_set_fill_color(menu->r[2], HIGHLIGHT_COLOR);
138
        rectangle_draw(menu->r[0]);
139
        rectangle_draw(menu->r[1]);
140
        rectangle_draw(menu->r[2]);
141
        rectangle_set_fill_color(menu->r[2], GRAPH_BLACK);
142
        break;
143
    default:
144
        rectangle_draw(menu->r[0]);
145
        rectangle_draw(menu->r[1]);
146
        rectangle_draw(menu->r[2]);
147
        break;
97
    int x = *get_mouse_X(), y = *get_mouse_Y();
98
    for(size_t i = 0; i < menu->sz; ++i){
99
        if(rectangle_collide_point(menu->r[i], x, y))
100
            rectangle_set_fill_color(menu->r[i], HIGHLIGHT_COLOR);
101
        rectangle_draw(menu->r[i]);
102
        text_draw     (menu->t[i]);
148 103
    }
149 104
    for(size_t i = 0; i < menu->sz; ++i)
150
        text_draw(menu->t[i]);
105
        if(rectangle_collide_point(menu->r[i], x, y))
106
            rectangle_set_fill_color(menu->r[i], GRAPH_BLACK);
151 107
}
152 108

  
153 109
void (menu_dtor)(menu_t *p){
proj/src/proj.c
161 161
                                switch (game_state) {
162 162
                                case MENU:
163 163
                                    graph_clear_screen();
164
                                    game_state = menu_update_state(main_menu, click);
164
                                    switch(menu_update_state(main_menu, click)){
165
                                        case -1: game_state = MENU; break;
166
                                        case  0: game_state = GAME; break;
167
                                        case  1: game_state = TEST; break;
168
                                        case  2: game_state = EXIT; break;
169
                                    }
165 170
                                    menu_draw(main_menu);
166 171

  
167 172
                                    click = 0;

Also available in: Unified diff