#include "timer.hpp"
#include "control/joystickkeyboardcontroller.hpp"
-static const float MENU_REPEAT_INITIAL = 0.4;
-static const float MENU_REPEAT_RATE = 0.2;
-static const float FLICK_CURSOR_TIME = 0.5;
+static const float MENU_REPEAT_INITIAL = 0.4f;
+static const float MENU_REPEAT_RATE = 0.2f;
+static const float FLICK_CURSOR_TIME = 0.5f;
extern SDL_Surface* screen;
dialog->add_entry(true, _("Yes"));
dialog->add_entry(false, _("No"));
dialog->add_hl();
-
+
Menu::set_current(dialog);
DrawingContext context;
}
if(background == NULL)
- context.draw_gradient(Color(0.8, 0.95, 0.85), Color(0.8, 0.8, 0.8),
+ context.draw_gradient(Color(0.8f, 0.95f, 0.85f), Color(0.8f, 0.8f, 0.8f),
LAYER_BACKGROUND0);
else
context.draw_surface(background, Vector(0,0), LAYER_BACKGROUND0);
char str[1024];
if(input_flickering)
- sprintf(str,"%s ",input.c_str());
+ snprintf(str, sizeof(str), "%s ",input.c_str());
else
- sprintf(str,"%s_",input.c_str());
+ snprintf(str, sizeof(str), "%s_",input.c_str());
std::string string = str;
* selectable item added
*/
if (active_item == -1
- && item->kind != MN_HL
+ && item->kind != MN_HL
&& item->kind != MN_LABEL
&& item->kind != MN_DEACTIVE) {
active_item = items.size() - 1;
menuaction = MENU_ACTION_UP;
menu_repeat_time = real_time + MENU_REPEAT_INITIAL;
}
- if(main_controller->hold(Controller::UP) &&
+ if(main_controller->hold(Controller::UP) &&
menu_repeat_time != 0 && real_time > menu_repeat_time) {
menuaction = MENU_ACTION_UP;
menu_repeat_time = real_time + MENU_REPEAT_RATE;
- }
+ }
if(main_controller->pressed(Controller::DOWN)) {
menuaction = MENU_ACTION_DOWN;
menu_repeat_time = real_time + MENU_REPEAT_INITIAL;
}
- if(main_controller->hold(Controller::DOWN) &&
+ if(main_controller->hold(Controller::DOWN) &&
menu_repeat_time != 0 && real_time > menu_repeat_time) {
menuaction = MENU_ACTION_DOWN;
menu_repeat_time = real_time + MENU_REPEAT_RATE;
}
- if(main_controller->pressed(Controller::JUMP)
- || main_controller->pressed(Controller::ACTION)
+ if(main_controller->pressed(Controller::ACTION)
|| main_controller->pressed(Controller::MENU_SELECT)) {
menuaction = MENU_ACTION_HIT;
}
hit_item = -1;
if(items.size() == 0)
return;
-
+
int last_active_item = active_item;
switch(menuaction) {
case MENU_ACTION_UP:
--active_item;
else
active_item = int(items.size())-1;
- } while ((items[active_item]->kind == MN_HL
+ } while ((items[active_item]->kind == MN_HL
|| items[active_item]->kind == MN_LABEL
|| items[active_item]->kind == MN_DEACTIVE)
&& (active_item != last_active_item));
-
+
break;
-
+
case MENU_ACTION_DOWN:
do {
if(active_item < int(items.size())-1 )
|| items[active_item]->kind == MN_LABEL
|| items[active_item]->kind == MN_DEACTIVE)
&& (active_item != last_active_item));
-
+
break;
-
+
case MENU_ACTION_LEFT:
if(items[active_item]->kind == MN_STRINGSELECT) {
if(items[active_item]->selected > 0)
items[active_item]->selected = items[active_item]->list.size()-1;
}
break;
-
+
case MENU_ACTION_RIGHT:
if(items[active_item]->kind == MN_STRINGSELECT) {
if(items[active_item]->selected+1 < items[active_item]->list.size())
items[active_item]->selected = 0;
}
break;
-
+
case MENU_ACTION_HIT: {
hit_item = active_item;
switch (items[active_item]->kind) {
assert(items[active_item]->target_menu != 0);
Menu::push_current(items[active_item]->target_menu);
break;
-
+
case MN_TOGGLE:
items[active_item]->toggled = !items[active_item]->toggled;
menu_action(items[active_item]);
break;
-
+
case MN_CONTROLFIELD:
menu_action(items[active_item]);
break;
-
+
case MN_ACTION:
menu_action(items[active_item]);
break;
-
+
case MN_TEXTFIELD:
case MN_NUMFIELD:
menuaction = MENU_ACTION_DOWN;
update();
break;
-
+
case MN_BACK:
Menu::pop_current();
break;
}
break;
}
-
+
case MENU_ACTION_REMOVE:
if(items[active_item]->kind == MN_TEXTFIELD
|| items[active_item]->kind == MN_NUMFIELD)
if(!items[active_item]->input.empty())
{
int i = items[active_item]->input.size();
-
+
while(delete_character > 0) /* remove charactes */
{
items[active_item]->input.resize(i-1);
}
}
break;
-
+
case MENU_ACTION_INPUT:
if(items[active_item]->kind == MN_TEXTFIELD
- || (items[active_item]->kind == MN_NUMFIELD
+ || (items[active_item]->kind == MN_NUMFIELD
&& mn_input_char >= '0' && mn_input_char <= '9'))
{
items[active_item]->input.push_back(mn_input_char);
}
break;
-
+
case MENU_ACTION_BACK:
Menu::pop_current();
break;
Menu::draw_item(DrawingContext& context, int index)
{
float menu_height = get_height();
- float menu_width = get_width();
+ float menu_width = get_width();
MenuItem& pitem = *(items[index]);
if(pitem.list.size() > 0) {
list_width = (int) text_font->get_text_width(pitem.list[pitem.selected]);
}
-
+
if (arrange_left)
x_pos += 24 - menu_width/2 + (text_width + input_width + list_width)/2;
{
context.draw_text(deactive_font, pitem.text,
Vector(SCREEN_WIDTH/2, y_pos - int(deactive_font->get_height()/2)),
- CENTER_ALLIGN, LAYER_GUI);
+ ALIGN_CENTER, LAYER_GUI);
break;
}
{
context.draw_text(label_font, pitem.text,
Vector(SCREEN_WIDTH/2, y_pos - int(label_font->get_height()/2)),
- CENTER_ALLIGN, LAYER_GUI);
+ ALIGN_CENTER, LAYER_GUI);
break;
}
case MN_TEXTFIELD:
context.draw_text(field_font,
pitem.get_input_with_symbol(true),
Vector(input_pos, y_pos - int(field_font->get_height()/2)),
- LEFT_ALLIGN, LAYER_GUI);
+ ALIGN_LEFT, LAYER_GUI);
else
context.draw_text(field_font,
pitem.get_input_with_symbol(false),
Vector(input_pos, y_pos - int(field_font->get_height()/2)),
- LEFT_ALLIGN, LAYER_GUI);
+ ALIGN_LEFT, LAYER_GUI);
}
else
context.draw_text(field_font, pitem.input,
Vector(input_pos, y_pos - int(field_font->get_height()/2)),
- LEFT_ALLIGN, LAYER_GUI);
+ ALIGN_LEFT, LAYER_GUI);
context.draw_text(text_font, pitem.text,
Vector(text_pos, y_pos - int(text_font->get_height()/2)),
- LEFT_ALLIGN, LAYER_GUI);
+ ALIGN_LEFT, LAYER_GUI);
break;
}
case MN_STRINGSELECT:
context.draw_text(text_font, pitem.list[pitem.selected],
Vector(SCREEN_WIDTH/2 + text_pos, y_pos - int(text_font->get_height()/2)),
- CENTER_ALLIGN, LAYER_GUI);
+ ALIGN_CENTER, LAYER_GUI);
context.draw_text(text_font, pitem.text,
Vector(SCREEN_WIDTH/2 + list_pos_2/2, y_pos - int(text_font->get_height()/2)),
- CENTER_ALLIGN, LAYER_GUI);
+ ALIGN_CENTER, LAYER_GUI);
break;
}
case MN_BACK:
{
context.draw_text(text_font, pitem.text,
Vector(SCREEN_WIDTH/2, y_pos - int(text_font->get_height()/2)),
- CENTER_ALLIGN, LAYER_GUI);
+ ALIGN_CENTER, LAYER_GUI);
context.draw_surface(back.get(),
Vector(x_pos + text_width/2 + 16, y_pos - 8),
LAYER_GUI);
{
context.draw_text(text_font, pitem.text,
Vector(SCREEN_WIDTH/2, y_pos - (text_font->get_height()/2)),
- CENTER_ALLIGN, LAYER_GUI);
+ ALIGN_CENTER, LAYER_GUI);
if(pitem.toggled)
context.draw_surface(checkbox_checked.get(),
case MN_ACTION:
context.draw_text(text_font, pitem.text,
Vector(SCREEN_WIDTH/2, y_pos - int(text_font->get_height()/2)),
- CENTER_ALLIGN, LAYER_GUI);
+ ALIGN_CENTER, LAYER_GUI);
break;
case MN_GOTO:
context.draw_text(text_font, pitem.text,
Vector(SCREEN_WIDTH/2, y_pos - int(text_font->get_height()/2)),
- CENTER_ALLIGN, LAYER_GUI);
+ ALIGN_CENTER, LAYER_GUI);
break;
}
}
label_font->get_text_width(items[i]->input) + 16;
if(items[i]->kind == MN_TOGGLE)
w += 32;
-
+
if(w > menu_width)
menu_width = w;
}
-
+
return menu_width + 24;
}
if(MouseCursor::current()) {
MouseCursor::current()->draw(context);
}
-
+
float menu_height = get_height();
- float menu_width = get_width();
+ float menu_width = get_width();
/* Draw a transparent background */
context.draw_filled_rect(
for(std::vector<MenuItem*>::iterator i = items.begin();
i != items.end(); ++i) {
MenuItem& item = **i;
-
+
if(item.id == id)
return item;
}
for(std::vector<MenuItem*>::const_iterator i = items.begin();
i != items.end(); ++i) {
const MenuItem& item = **i;
-
+
if(item.id == id)
return item;
}
y > pos_y - get_height()/2 &&
y < pos_y + get_height()/2)
{
- int new_active_item
+ int new_active_item
= static_cast<int> ((y - (pos_y - get_height()/2)) / 24);
-
+
/* only change the mouse focus to a selectable item */
if ((items[new_active_item]->kind != MN_HL)
&& (items[new_active_item]->kind != MN_LABEL)
&& (items[new_active_item]->kind != MN_DEACTIVE))
active_item = new_active_item;
-
+
if(MouseCursor::current())
MouseCursor::current()->set_state(MC_LINK);
}