Project

General

Profile

Statistics
| Revision:

root / proj / libs / graph / src / menu.c @ 291

History | View | Annotate | Download (5.42 KB)

1
#include <lcom/lcf.h>
2

    
3
#include "menu.h"
4

    
5
#include "graph.h"
6
#include "rectangle.h"
7
#include "proj_func.h"
8
#include "proj_macros.h"
9

    
10
struct menu {
11
    size_t sz;
12
    rectangle_t **r;
13
    text_t      **t;
14
    rectangle_t *frame;
15
};
16

    
17
menu_t* (menu_ctor)(const font_t *fnt){
18
    if(fnt == NULL) return NULL;
19
    menu_t *ret = (menu_t*)malloc(sizeof(menu_t));
20
    if (ret == NULL) return NULL;
21
    ret->sz = 0;
22
    ret->r = NULL;
23
    ret->t = NULL;
24

    
25
    ret->frame = rectangle_ctor(0, 0, 800, 500);
26
    rectangle_set_fill_color(ret->frame, GRAPH_BLACK);
27
    rectangle_set_outline_width(ret->frame, 6);
28
    rectangle_set_outline_color(ret->frame, GRAPH_WHITE);
29
    rectangle_set_fill_trans(ret->frame, GRAPH_TRANSPARENT);
30

    
31

    
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");
41

    
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);
50

    
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);
55

    
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);
60

    
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);
64

    
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;
100
}
101

    
102
static int highlighted = -1;
103

    
104
int (menu_update_state)(menu_t *menu, int click) {
105

    
106
    if (rectangle_collide_point(menu->r[0], *get_mouse_X(), *get_mouse_Y())) {
107
        highlighted = GAME;
108
        if (click) return GAME;
109
    } else if (rectangle_collide_point(menu->r[1], *get_mouse_X(), *get_mouse_Y())) {
110
        highlighted = TEST;
111
        if (click) return TEST;
112
    } else if (rectangle_collide_point(menu->r[2], *get_mouse_X(), *get_mouse_Y())) {
113
        highlighted = EXIT;
114
        if (click) return EXIT;
115
    } else {
116
        highlighted = -1;
117
    }
118
    return MENU;
119
}
120

    
121
void (menu_draw)(menu_t *menu) {
122
    rectangle_draw(menu->frame);
123
    switch (highlighted) {
124
    case GAME:
125
        rectangle_set_fill_color(menu->r[0], HIGHLIGHT_COLOR);
126
        rectangle_draw(menu->r[0]);
127
        rectangle_draw(menu->r[1]);
128
        rectangle_draw(menu->r[2]);
129
        rectangle_set_fill_color(menu->r[0], GRAPH_BLACK);
130
        break;
131
    case TEST:
132
        rectangle_set_fill_color(menu->r[1], HIGHLIGHT_COLOR);
133
        rectangle_draw(menu->r[0]);
134
        rectangle_draw(menu->r[1]);
135
        rectangle_draw(menu->r[2]);
136
        rectangle_set_fill_color(menu->r[1], GRAPH_BLACK);
137
        break;
138
    case EXIT:
139
        rectangle_set_fill_color(menu->r[2], HIGHLIGHT_COLOR);
140
        rectangle_draw(menu->r[0]);
141
        rectangle_draw(menu->r[1]);
142
        rectangle_draw(menu->r[2]);
143
        rectangle_set_fill_color(menu->r[2], GRAPH_BLACK);
144
        break;
145
    default:
146
        rectangle_draw(menu->r[0]);
147
        rectangle_draw(menu->r[1]);
148
        rectangle_draw(menu->r[2]);
149
        break;
150
    }
151
    for(size_t i = 0; i < menu->sz; ++i)
152
        text_draw(menu->t[i]);
153
}
154

    
155
void (menu_dtor)(menu_t *p){
156
    for(size_t i = 0; i < p->sz; ++i){
157
        rectangle_dtor(p->r[i]);
158
        text_dtor     (p->t[i]);
159
    }
160
    rectangle_dtor(p->frame);
161
    free(p);
162
}