X-Git-Url: http://git.localhorst.tv/?a=blobdiff_plain;f=src%2Fgraphics%2FMenu.h;h=19ad9071541ebbac673d8b6f97b89c0647e3a3d8;hb=ec824200aec12d6870b70304bcd2e2aeadba767b;hp=ac986466c8be2408b87542d54b837c00f2294dc1;hpb=092a2dd175a4001a495c84ee85211734fb928c83;p=l2e.git diff --git a/src/graphics/Menu.h b/src/graphics/Menu.h index ac98646..19ad907 100644 --- a/src/graphics/Menu.h +++ b/src/graphics/Menu.h @@ -1,6 +1,12 @@ #ifndef GRAPHICS_MENU_H_ #define GRAPHICS_MENU_H_ +namespace app { + class Application; + class State; +} + +#include "Animation.h" #include "Font.h" #include "Sprite.h" #include "../math/Vector.h" @@ -18,6 +24,8 @@ struct MenuProperties { const Font *disabledFont; const Sprite *cursor; const Sprite *selectedCursor; + const Animation *cursorAnimation; + const Animation *selectedCursorAnimation; int charsPerEntry; int rows; int rowGap; @@ -34,6 +42,7 @@ struct MenuProperties { MenuProperties() : font(0), disabledFont(0), cursor(0), selectedCursor(0) + , cursorAnimation(0), selectedCursorAnimation(0) , charsPerEntry(0), rows(1), rowGap(0) , iconSpace(0), cols(1), colGap(0) , charsPerNumber(0), charsPerAdditionalText(0) @@ -104,12 +113,19 @@ public: void Clear() { entries.clear(); } void ClearEntry(int at) { entries[at] = Entry(0, T(), false); } + void StartAnimation(app::Application &ctrl); + void StartAnimation(app::State &ctrl); + void StopAnimation(); + void Draw(SDL_Surface *dest, const math::Vector &position) const; private: int GetRow(int index) const { return index / cols; } int GetCol(int index) const { return index % cols; } + void DrawCursor(SDL_Surface *, const math::Vector &) const; + void DrawSelectedCursor(SDL_Surface *, const math::Vector &) const; + private: struct Entry { Entry(const char *title, const T &value, bool enabled = true, const Sprite *icon = 0, int number = 0, const char *additionalText = 0) @@ -121,6 +137,8 @@ private: T value; bool enabled; }; + AnimationRunner animation; + AnimationRunner selectedAnimation; std::vector entries; int selected; int secondarySelection; @@ -149,6 +167,8 @@ Menu::Menu() template Menu::Menu(const MenuProperties &p) : MenuProperties(p) +, animation(cursorAnimation) +, selectedAnimation(selectedCursorAnimation) , selected(0) , secondarySelection(0) , topRow(0) @@ -229,6 +249,33 @@ void Menu::SelectIndex(int index) { } +template +void Menu::StartAnimation(app::Application &ctrl) { + if (cursorAnimation) { + animation.Start(ctrl); + } + if (selectedCursorAnimation) { + selectedAnimation.Start(ctrl); + } +} + +template +void Menu::StartAnimation(app::State &ctrl) { + if (cursorAnimation) { + animation.Start(ctrl); + } + if (selectedCursorAnimation) { + selectedAnimation.Start(ctrl); + } +} + +template +void Menu::StopAnimation() { + animation.Stop(); + selectedAnimation.Stop(); +} + + template void Menu::Draw(SDL_Surface *dest, const math::Vector &position) const { int start(topRow * cols); @@ -280,24 +327,46 @@ void Menu::Draw(SDL_Surface *dest, const math::Vector &position) const { case STATE_INACTIVE: break; case STATE_ACTIVE: - cursor->Draw(dest, position + cursorOffset); + DrawCursor(dest, position + cursorOffset); break; case STATE_SELECTED: - selectedCursor->Draw(dest, position + cursorOffset); + DrawSelectedCursor(dest, position + cursorOffset); break; case STATE_DUAL: - cursor->Draw(dest, position + cursorOffset + DrawCursor(dest, position + cursorOffset - math::Vector(selectedCursor->Width(), 0)); if (secondarySelection >= start && secondarySelection <= end) { math::Vector secondaryOffset( (secondarySelection % cols) * (ColWidth() + colGap) - cursor->Width(), ((secondarySelection - start) / cols) * RowHeight()); - selectedCursor->Draw(dest, position + secondaryOffset); + DrawSelectedCursor(dest, position + secondaryOffset); } break; } } +template +void Menu::DrawCursor( + SDL_Surface *dest, + const math::Vector &position) const { + if (animation.Running()) { + animation.Draw(dest, position); + } else { + cursor->Draw(dest, position); + } +} + +template +void Menu::DrawSelectedCursor( + SDL_Surface *dest, + const math::Vector &position) const { + if (selectedAnimation.Running()) { + selectedAnimation.Draw(dest, position); + } else { + selectedCursor->Draw(dest, position); + } +} + } -#endif /* GRAPHICS_MENU_H_ */ +#endif