2 // Copyright (C) 2006 Matthias Braun <matze@braunis.de>
4 // This program is free software: you can redistribute it and/or modify
5 // it under the terms of the GNU General Public License as published by
6 // the Free Software Foundation, either version 3 of the License, or
7 // (at your option) any later version.
9 // This program is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 // GNU General Public License for more details.
14 // You should have received a copy of the GNU General Public License
15 // along with this program. If not, see <http://www.gnu.org/licenses/>.
17 #include "gui/button_group.hpp"
19 #include "supertux/main.hpp"
20 #include "video/drawing_context.hpp"
22 extern SDL_Surface* g_screen;
24 ButtonGroup::ButtonGroup(Vector pos_, Vector buttons_size_, Vector buttons_box_) :
26 buttons_size(buttons_size_),
27 buttons_box(buttons_box_)
33 mouse_left_button = false;
37 ButtonGroup::~ButtonGroup()
42 ButtonGroup::add_button(Button button, int id, bool select)
44 button.pos.x = ((buttons.size()-buttons_pair_nb) % (int)buttons_box.x) * buttons_size.x;
45 button.pos.y = ((int)((buttons.size()-buttons_pair_nb) / buttons_box.x)) * buttons_size.y;
46 button.size = buttons_size;
51 buttons.push_back(button);
55 ButtonGroup::add_pair_of_buttons(Button button1, int id1, Button button2, int id2)
57 button1.pos.x = button2.pos.x = ((buttons.size()-buttons_pair_nb) % (int)buttons_box.x) * buttons_size.x;
58 button1.pos.y = button2.pos.y = ((int)((buttons.size()-buttons_pair_nb) / buttons_box.x)) * buttons_size.y;
59 button1.size.x = button2.size.x = buttons_size.x;
60 button1.size.y = button2.size.y = buttons_size.y / 2;
61 button2.pos.y += buttons_size.y / 2;
66 buttons.push_back(button1);
67 buttons.push_back(button2);
71 ButtonGroup::draw(DrawingContext &context)
73 context.draw_filled_rect(pos - Vector(12,4),
74 Vector(buttons_size.x*buttons_box.x + 16, buttons_size.y*buttons_box.y + 8),
75 Color (0,0,0, 128), LAYER_GUI-1);
77 context.push_transform();
78 context.set_translation(Vector(-pos.x, -pos.y + buttons_size.y*row));
79 for(Buttons::iterator i = buttons.begin(); i != buttons.end(); ++i)
81 if(i->pos.y < row*buttons_size.y ||
82 i->pos.y + i->size.y > (row + buttons_box.y) * buttons_size.y)
85 i->draw(context, i->id == button_selected);
87 context.pop_transform();
91 ButtonGroup::event(SDL_Event &event)
93 bool caught_event = false;
100 if(mouse_left_button)
102 pos.x += int(event.motion.xrel * float(SCREEN_WIDTH)/g_screen->w);
103 pos.y += int(event.motion.yrel * float(SCREEN_HEIGHT)/g_screen->h);
106 if(event.button.x > pos.x-12 && event.button.x < pos.x+16 + buttons_box.x*buttons_size.x &&
107 event.button.y > pos.y-4 && event.button.y < pos.y+8 + buttons_box.y*buttons_size.y)
110 case SDL_MOUSEBUTTONDOWN:
111 if(event.button.x < pos.x-12 || event.button.x > pos.x+16 +
112 buttons_box.x*buttons_size.x || event.button.y < pos.y-4 ||
113 event.button.y > pos.y+8 + buttons_box.y*buttons_size.y)
118 if(event.button.button == SDL_BUTTON_WHEELUP)
124 else if(event.button.button == SDL_BUTTON_WHEELDOWN)
127 if(row > (int)((buttons.size()-buttons_pair_nb)/buttons_box.x) - (int)buttons_box.y +
128 ((int)(buttons.size()-buttons_pair_nb)%(int)buttons_box.x != 0 ? 1 : 0))
129 row = (int)((buttons.size()-buttons_pair_nb)/buttons_box.x) - (int)buttons_box.y +
130 ((int)(buttons.size()-buttons_pair_nb)%(int)buttons_box.x != 0 ? 1 : 0);
132 else if(event.button.button == SDL_BUTTON_LEFT)
133 mouse_left_button = true;
135 caught_event = false;
137 case SDL_MOUSEBUTTONUP:
138 mouse_left_button = false;
147 for(Buttons::iterator i = buttons.begin(); i != buttons.end(); ++i)
149 if(i->pos.y < row*buttons_size.y ||
150 i->pos.y + i->size.y > (row + buttons_box.y) * buttons_size.y)
153 if(i->event(event, (int)pos.x,
154 (int)pos.y - row*(int)buttons_size.y) == BT_SELECTED)
156 button_selected = i->id;
166 ButtonGroup::selected_id()
168 return button_selected;
172 ButtonGroup::set_unselected()
174 button_selected = -1;
178 ButtonGroup::is_hover()