#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"
const Font *disabledFont;
const Sprite *cursor;
const Sprite *selectedCursor;
+ const Animation *cursorAnimation;
+ const Animation *selectedCursorAnimation;
int charsPerEntry;
int rows;
int rowGap;
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)
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<int> &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<int> &) const;
+ void DrawSelectedCursor(SDL_Surface *, const math::Vector<int> &) 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)
T value;
bool enabled;
};
+ AnimationRunner animation;
+ AnimationRunner selectedAnimation;
std::vector<Entry> entries;
int selected;
int secondarySelection;
template<class T>
Menu<T>::Menu(const MenuProperties &p)
: MenuProperties(p)
+, animation(cursorAnimation)
+, selectedAnimation(selectedCursorAnimation)
, selected(0)
, secondarySelection(0)
, topRow(0)
}
+template<class T>
+void Menu<T>::StartAnimation(app::Application &ctrl) {
+ if (cursorAnimation) {
+ animation.Start(ctrl);
+ }
+ if (selectedCursorAnimation) {
+ selectedAnimation.Start(ctrl);
+ }
+}
+
+template<class T>
+void Menu<T>::StartAnimation(app::State &ctrl) {
+ if (cursorAnimation) {
+ animation.Start(ctrl);
+ }
+ if (selectedCursorAnimation) {
+ selectedAnimation.Start(ctrl);
+ }
+}
+
+template<class T>
+void Menu<T>::StopAnimation() {
+ animation.Stop();
+ selectedAnimation.Stop();
+}
+
+
template<class T>
void Menu<T>::Draw(SDL_Surface *dest, const math::Vector<int> &position) const {
int start(topRow * cols);
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<int>(selectedCursor->Width(), 0));
if (secondarySelection >= start && secondarySelection <= end) {
math::Vector<int> secondaryOffset(
(secondarySelection % cols) * (ColWidth() + colGap) - cursor->Width(),
((secondarySelection - start) / cols) * RowHeight());
- selectedCursor->Draw(dest, position + secondaryOffset);
+ DrawSelectedCursor(dest, position + secondaryOffset);
}
break;
}
}
+template<class T>
+void Menu<T>::DrawCursor(
+ SDL_Surface *dest,
+ const math::Vector<int> &position) const {
+ if (animation.Running()) {
+ animation.Draw(dest, position);
+ } else {
+ cursor->Draw(dest, position);
+ }
+}
+
+template<class T>
+void Menu<T>::DrawSelectedCursor(
+ SDL_Surface *dest,
+ const math::Vector<int> &position) const {
+ if (selectedAnimation.Running()) {
+ selectedAnimation.Draw(dest, position);
+ } else {
+ selectedCursor->Draw(dest, position);
+ }
+}
+
}
-#endif /* GRAPHICS_MENU_H_ */
+#endif