#include <cassert>
#include <stdexcept>
-#include "menu.h"
-#include "video/screen.h"
-#include "video/drawing_context.h"
-#include "gettext.h"
-#include "math/vector.h"
-#include "main.h"
-#include "resources.h"
-#include "control/joystickkeyboardcontroller.h"
+#include "menu.hpp"
+#include "mainloop.hpp"
+#include "video/screen.hpp"
+#include "video/drawing_context.hpp"
+#include "gettext.hpp"
+#include "math/vector.hpp"
+#include "main.hpp"
+#include "resources.hpp"
+#include "control/joystickkeyboardcontroller.hpp"
static const int MENU_REPEAT_INITIAL = 400;
static const int MENU_REPEAT_RATE = 200;
extern SDL_Surface* screen;
-Surface* checkbox;
-Surface* checkbox_checked;
-Surface* back;
-Surface* arrow_left;
-Surface* arrow_right;
-
std::vector<Menu*> Menu::last_menus;
Menu* Menu::current_ = 0;
Font* Menu::default_font;
DrawingContext context;
+ // TODO make this a screen and not another mainloop...
while(true)
{
SDL_Event event;
-
- if(event.type == SDL_QUIT)
- throw std::runtime_error("received window close event");
-
while (SDL_PollEvent(&event)) {
+ if(event.type == SDL_QUIT)
+ main_loop->quit();
+ main_controller->process_event(event);
dialog->event(event);
}
if(background == NULL)
- context.draw_gradient(Color(200,240,220), Color(200,200,220), LAYER_BACKGROUND0);
+ context.draw_gradient(Color(0.8, 0.95, 0.85), Color(0.8, 0.8, 0.8),
+ LAYER_BACKGROUND0);
else
context.draw_surface(background, Vector(0,0), LAYER_BACKGROUND0);
pos_y = SCREEN_HEIGHT/2;
arrange_left = 0;
active_item = -1;
+
+ checkbox.reset(new Surface("images/engine/menu/checkbox-unchecked.png"));
+ checkbox_checked.reset(new Surface("images/engine/menu/checkbox-checked.png"));
+ back.reset(new Surface("images/engine/menu/arrow-back.png"));
+ arrow_left.reset(new Surface("images/engine/menu/arrow-left.png"));
+ arrow_right.reset(new Surface("images/engine/menu/arrow-right.png"));
}
-void Menu::set_pos(int x, int y, float rw, float rh)
+void Menu::set_pos(float x, float y, float rw, float rh)
{
- pos_x = x + (int)((float)get_width() * rw);
- pos_y = y + (int)((float)get_height() * rh);
+ pos_x = x + get_width() * rw;
+ pos_y = y + get_height() * rh;
}
/* Add an item to a menu */
}
Font* text_font = default_font;
- int x_pos = pos_x;
- int y_pos = pos_y + 24*index - menu_height/2 + 12 + effect_offset;
+ float x_pos = pos_x;
+ float y_pos = pos_y + 24*index - menu_height/2 + 12 + effect_offset;
int shadow_size = 2;
int text_width = int(text_font->get_text_width(pitem.text));
int input_width = int(text_font->get_text_width(pitem.input) + 10);
case MN_HL:
{
// TODO
- int x = pos_x - menu_width/2;
- int y = y_pos - 12 - effect_offset;
+ float x = pos_x - menu_width/2;
+ float y = y_pos - 12 - effect_offset;
/* Draw a horizontal line with a little 3d effect */
context.draw_filled_rect(Vector(x, y + 6),
- Vector(menu_width, 4), Color(150,200,255,225), LAYER_GUI);
+ Vector(menu_width, 4),
+ Color(0.6f, 0.7f, 1.0f, 1.0f), LAYER_GUI);
context.draw_filled_rect(Vector(x, y + 6),
- Vector(menu_width, 2), Color(255,255,255,255), LAYER_GUI);
+ Vector(menu_width, 2),
+ Color(1.0f, 1.0f, 1.0f, 1.0f), LAYER_GUI);
break;
}
case MN_LABEL:
case MN_NUMFIELD:
case MN_CONTROLFIELD:
{
- int width = text_width + input_width + 5;
- int text_pos = SCREEN_WIDTH/2 - width/2;
- int input_pos = text_pos + text_width + 10;
+ float width = text_width + input_width + 5;
+ float text_pos = SCREEN_WIDTH/2 - width/2;
+ float input_pos = text_pos + text_width + 10;
context.draw_filled_rect(
Vector(input_pos - 5, y_pos - 10),
Vector(input_width + 10, 20),
- Color(255,255,255,255), LAYER_GUI-5);
+ Color(1.0f, 1.0f, 1.0f, 1.0f), LAYER_GUI-5);
context.draw_filled_rect(
Vector(input_pos - 4, y_pos - 9),
Vector(input_width + 8, 18),
- Color(0,0,0,128), LAYER_GUI-4);
+ Color(0, 0, 0, 0.5f), LAYER_GUI-4);
if(pitem.kind == MN_TEXTFIELD || pitem.kind == MN_NUMFIELD)
{
int text_pos = (text_width + 16)/2;
/* Draw arrows */
- context.draw_surface(arrow_left,
+ context.draw_surface(arrow_left.get(),
Vector(x_pos - list_pos + text_pos - 17, y_pos - 8),
LAYER_GUI);
- context.draw_surface(arrow_right,
+ context.draw_surface(arrow_right.get(),
Vector(x_pos - list_pos + text_pos - 1 + list_pos_2, y_pos - 8),
LAYER_GUI);
context.draw_filled_rect(
Vector(x_pos - list_pos + text_pos - 1, y_pos - 10),
Vector(list_pos_2 + 2, 20),
- Color(255,255,255,255), LAYER_GUI - 4);
+ Color(1.0f, 1.0f, 1.0f, 1.0f), LAYER_GUI - 4);
context.draw_filled_rect(
Vector(x_pos - list_pos + text_pos, y_pos - 9),
Vector(list_pos_2, 18),
- Color(0,0,0,128), LAYER_GUI - 5);
+ Color(0, 0, 0, 0.5f), LAYER_GUI - 5);
context.draw_text(text_font, pitem.list[pitem.selected],
Vector(SCREEN_WIDTH/2 + text_pos, y_pos - int(text_font->get_height()/2)),
context.draw_text(text_font, pitem.text,
Vector(SCREEN_WIDTH/2, y_pos - int(text_font->get_height()/2)),
CENTER_ALLIGN, LAYER_GUI);
- context.draw_surface(back,
+ context.draw_surface(back.get(),
Vector(x_pos + text_width/2 + 16, y_pos - 8),
LAYER_GUI);
break;
CENTER_ALLIGN, LAYER_GUI);
if(pitem.toggled)
- context.draw_surface(checkbox_checked,
+ context.draw_surface(checkbox_checked.get(),
Vector(x_pos + (text_width+16)/2, y_pos - 8),
LAYER_GUI + 1);
else
- context.draw_surface(checkbox,
+ context.draw_surface(checkbox.get(),
Vector(x_pos + (text_width+16)/2, y_pos - 8),
LAYER_GUI + 1);
break;
void
Menu::draw(DrawingContext& context)
{
+ if(MouseCursor::current()) {
+ MouseCursor::current()->draw(context);
+ }
+
int menu_height = get_height();
int menu_width = get_width();
context.draw_filled_rect(
Vector(pos_x - menu_width/2, pos_y - 24*items.size()/2 - 10),
Vector(menu_width,menu_height + 20),
- Color(150,180,200,125), LAYER_GUI-10);
+ Color(0.6f, 0.7f, 0.8f, 0.5f), LAYER_GUI-10);
for(unsigned int i = 0; i < items.size(); ++i)
{
case SDL_MOUSEMOTION:
{
- int x = int(event.motion.x * float(SCREEN_WIDTH)/screen->w);
- int y = int(event.motion.y * float(SCREEN_HEIGHT)/screen->h);
+ float x = event.motion.x * SCREEN_WIDTH/screen->w;
+ float y = event.motion.y * SCREEN_HEIGHT/screen->h;
if(x > pos_x - get_width()/2 &&
x < pos_x + get_width()/2 &&
y > pos_y - get_height()/2 &&
y < pos_y + get_height()/2)
{
- int new_active_item = (y - (pos_y - get_height()/2)) / 24;
+ 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)