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_),
39 mouse_left_button = false;
43 ButtonGroup::~ButtonGroup()
48 ButtonGroup::add_button(Button button, int id, bool select)
50 button.pos.x = ((buttons.size()-buttons_pair_nb) % (int)buttons_box.x) * buttons_size.x;
51 button.pos.y = ((int)((buttons.size()-buttons_pair_nb) / buttons_box.x)) * buttons_size.y;
52 button.size = buttons_size;
57 buttons.push_back(button);
61 ButtonGroup::add_pair_of_buttons(Button button1, int id1, Button button2, int id2)
63 button1.pos.x = button2.pos.x = ((buttons.size()-buttons_pair_nb) % (int)buttons_box.x) * buttons_size.x;
64 button1.pos.y = button2.pos.y = ((int)((buttons.size()-buttons_pair_nb) / buttons_box.x)) * buttons_size.y;
65 button1.size.x = button2.size.x = buttons_size.x;
66 button1.size.y = button2.size.y = buttons_size.y / 2;
67 button2.pos.y += buttons_size.y / 2;
72 buttons.push_back(button1);
73 buttons.push_back(button2);
77 ButtonGroup::draw(DrawingContext &context)
79 context.draw_filled_rect(pos - Vector(12,4),
80 Vector(buttons_size.x*buttons_box.x + 16, buttons_size.y*buttons_box.y + 8),
81 Color (0,0,0, 128), LAYER_GUI-1);
83 context.push_transform();
84 context.set_translation(Vector(-pos.x, -pos.y + buttons_size.y*row));
85 for(Buttons::iterator i = buttons.begin(); i != buttons.end(); ++i)
87 if(i->pos.y < row*buttons_size.y ||
88 i->pos.y + i->size.y > (row + buttons_box.y) * buttons_size.y)
91 i->draw(context, i->id == button_selected);
93 context.pop_transform();
97 ButtonGroup::event(SDL_Event &event)
99 bool caught_event = false;
103 case SDL_MOUSEMOTION:
106 if(mouse_left_button)
108 pos.x += int(event.motion.xrel * float(SCREEN_WIDTH)/g_screen->w);
109 pos.y += int(event.motion.yrel * float(SCREEN_HEIGHT)/g_screen->h);
112 if(event.button.x > pos.x-12 && event.button.x < pos.x+16 + buttons_box.x*buttons_size.x &&
113 event.button.y > pos.y-4 && event.button.y < pos.y+8 + buttons_box.y*buttons_size.y)
116 case SDL_MOUSEBUTTONDOWN:
117 if(event.button.x < pos.x-12 || event.button.x > pos.x+16 +
118 buttons_box.x*buttons_size.x || event.button.y < pos.y-4 ||
119 event.button.y > pos.y+8 + buttons_box.y*buttons_size.y)
124 if(event.button.button == SDL_BUTTON_WHEELUP)
130 else if(event.button.button == SDL_BUTTON_WHEELDOWN)
133 if(row > (int)((buttons.size()-buttons_pair_nb)/buttons_box.x) - (int)buttons_box.y +
134 ((int)(buttons.size()-buttons_pair_nb)%(int)buttons_box.x != 0 ? 1 : 0))
135 row = (int)((buttons.size()-buttons_pair_nb)/buttons_box.x) - (int)buttons_box.y +
136 ((int)(buttons.size()-buttons_pair_nb)%(int)buttons_box.x != 0 ? 1 : 0);
138 else if(event.button.button == SDL_BUTTON_LEFT)
139 mouse_left_button = true;
141 caught_event = false;
143 case SDL_MOUSEBUTTONUP:
144 mouse_left_button = false;
153 for(Buttons::iterator i = buttons.begin(); i != buttons.end(); ++i)
155 if(i->pos.y < row*buttons_size.y ||
156 i->pos.y + i->size.y > (row + buttons_box.y) * buttons_size.y)
159 if(i->event(event, (int)pos.x,
160 (int)pos.y - row*(int)buttons_size.y) == BT_SELECTED)
162 button_selected = i->id;
172 ButtonGroup::selected_id()
174 return button_selected;
178 ButtonGroup::set_unselected()
180 button_selected = -1;
184 ButtonGroup::is_hover()