- Reworked Surface class and drawing stuff:
[supertux.git] / src / gui / menu.cpp
index 88fffd5..5993bf4 100644 (file)
 #include <cassert>
 #include <stdexcept>
 
-#include "app/globals.h"
-#include "menu.h"
-#include "video/screen.h"
-#include "video/drawing_context.h"
-#include "app/setup.h"
-#include "app/gettext.h"
-#include "math/vector.h"
-#include "main.h"
-#include "control/joystickkeyboardcontroller.h"
+#include "menu.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;
-static const int FLICK_CURSOR_TIME=500;
+static const int FLICK_CURSOR_TIME = 500;
 
 extern SDL_Surface* screen;
 
-using namespace SuperTux;
-
 Surface* checkbox;
 Surface* checkbox_checked;
 Surface* back;
@@ -79,21 +76,21 @@ bool confirm_dialog(Surface *background, std::string text)
   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)
+          throw std::runtime_error("received window close event");
+        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);
 
       dialog->draw(context);
-      dialog->action();
+      dialog->update();
 
       switch (dialog->check())
         {
@@ -128,7 +125,7 @@ Menu::push_current(Menu* pmenu)
     last_menus.push_back(current_);
 
   current_ = pmenu;
-  current_->effect.start(500);
+  current_->effect_ticks = SDL_GetTicks();
 }
 
 void
@@ -136,9 +133,10 @@ Menu::pop_current()
 {
   if (last_menus.size() >= 1) {
     current_ = last_menus.back();
-    current_->effect.start(500);
-
+    current_->effect_ticks = SDL_GetTicks();
     last_menus.pop_back();
+  } else {
+    current_ = 0;
   }
 }
 
@@ -148,7 +146,7 @@ Menu::set_current(Menu* menu)
   last_menus.clear();
 
   if (menu)
-    menu->effect.start(500);
+    menu->effect_ticks = SDL_GetTicks();
 
   current_ = menu;
   // just to be sure...
@@ -161,9 +159,6 @@ MenuItem::MenuItem(MenuItemKind _kind, int _id)
   toggled = false;
   selected = false;
   target_menu = 0;
-  input_flickering = false;
-  input_flickering_timer.init(true);
-  input_flickering_timer.start(FLICK_CURSOR_TIME);
 }
 
 void
@@ -180,19 +175,11 @@ MenuItem::change_input(const  std::string& text_)
 
 std::string MenuItem::get_input_with_symbol(bool active_item)
 {
-  if(!active_item)
+  if(!active_item) {
     input_flickering = true;
-  else
-    {
-      if(input_flickering_timer.get_left() < 0)
-        {
-          if(input_flickering)
-            input_flickering = false;
-          else
-            input_flickering = true;
-          input_flickering_timer.start(FLICK_CURSOR_TIME);
-        }
-    }
+  } else {
+    input_flickering = (SDL_GetTicks() / FLICK_CURSOR_TIME) % 2;
+  }
 
   char str[1024];
   if(input_flickering)
@@ -223,9 +210,6 @@ Menu::Menu()
   pos_y        = SCREEN_HEIGHT/2;
   arrange_left = 0;
   active_item  = -1;
-  effect.init(false);
-
-  repeat_timer.init(true);
 }
 
 void Menu::set_pos(int x, int y, float rw, float rh)
@@ -331,24 +315,27 @@ Menu::clear()
 
 /* Process actions done on the menu */
 void
-Menu::action()
+Menu::update()
 {
   /** check main input controller... */
+  Uint32 ticks = SDL_GetTicks();
   if(main_controller->pressed(Controller::UP)) {
     menuaction = MENU_ACTION_UP;
-    repeat_timer.start(MENU_REPEAT_INITIAL);
+    menu_repeat_ticks = ticks + MENU_REPEAT_INITIAL;
   }
-  if(main_controller->hold(Controller::UP) && !repeat_timer.check()) {
+  if(main_controller->hold(Controller::UP) && 
+      menu_repeat_ticks != 0 && ticks > menu_repeat_ticks) {
     menuaction = MENU_ACTION_UP;
-    repeat_timer.start(MENU_REPEAT_RATE);
+    menu_repeat_ticks = ticks + MENU_REPEAT_RATE;
   } 
   if(main_controller->pressed(Controller::DOWN)) {
     menuaction = MENU_ACTION_DOWN;
-    repeat_timer.start(MENU_REPEAT_INITIAL);
+    menu_repeat_ticks = ticks + MENU_REPEAT_INITIAL;
   }
-  if(main_controller->hold(Controller::DOWN) && !repeat_timer.check()) {
+  if(main_controller->hold(Controller::DOWN) && 
+      menu_repeat_ticks != 0 && ticks > menu_repeat_ticks) {
     menuaction = MENU_ACTION_DOWN;
-    repeat_timer.start(MENU_REPEAT_RATE);
+    menu_repeat_ticks = ticks + MENU_REPEAT_RATE;
   }
   if(main_controller->pressed(Controller::JUMP)
      || main_controller->pressed(Controller::ACTION)
@@ -433,7 +420,7 @@ Menu::action()
         case MN_TEXTFIELD:
         case MN_NUMFIELD:
           menuaction = MENU_ACTION_DOWN;
-          action();
+          update();
           break;
           
         case MN_BACK:
@@ -505,13 +492,13 @@ Menu::draw_item(DrawingContext& context, int index)
   MenuItem& pitem = *(items[index]);
 
   int effect_offset = 0;
-  {
-    int effect_time = 0;
-
-    if(effect.check())
-      effect_time = effect.get_left() / 4;
-
-    effect_offset = (index % 2) ? effect_time : -effect_time;
+  if(effect_ticks != 0) {
+    if(SDL_GetTicks() - effect_ticks > 500) {
+      effect_ticks = 0;
+    } else {
+      Uint32 effect_time = (500 - (SDL_GetTicks() - effect_ticks)) / 4;
+      effect_offset = (index % 2) ? effect_time : -effect_time;
+    }
   }
 
   Font* text_font = default_font;
@@ -551,9 +538,11 @@ Menu::draw_item(DrawingContext& context, int index)
         int 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:
@@ -574,11 +563,11 @@ Menu::draw_item(DrawingContext& context, int index)
         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)
           {
@@ -621,11 +610,11 @@ Menu::draw_item(DrawingContext& context, int index)
         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)),
@@ -704,6 +693,10 @@ int Menu::get_height() const
 void
 Menu::draw(DrawingContext& context)
 {
+  if(MouseCursor::current()) {
+    MouseCursor::current()->draw(context);
+  }
+  
   int menu_height = get_height();
   int menu_width = get_width();  
 
@@ -711,7 +704,7 @@ Menu::draw(DrawingContext& context)
   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)
     {
@@ -762,7 +755,7 @@ Menu::is_toggled(int id) const
 void
 Menu::event(const SDL_Event& event)
 {
-  if(effect.started())
+  if(effect_ticks != 0)
     return;
 
   switch(event.type) {
@@ -818,12 +811,11 @@ Menu::event(const SDL_Event& event)
 void
 Menu::set_active_item(int id)
 {
-       for(int i = 0; i < items.size(); ++i) {
-               MenuItem* item = items[i];
-               if(item->id == id) {
-                       active_item = i;
-                       break;
-               }
-       }
+  for(size_t i = 0; i < items.size(); ++i) {
+    MenuItem* item = items[i];
+    if(item->id == id) {
+      active_item = i;
+      break;
+    }
+  }
 }
-