]> git.localhorst.tv Git - l2e.git/blobdiff - src/graphics/Menu.h
added cursor sprite for menu
[l2e.git] / src / graphics / Menu.h
index 576120e65b9e5bd881d231becb6231ec5989c9e8..ab661c7660a94f561ba394b5e35bab725b71f5fa 100644 (file)
@@ -9,6 +9,7 @@
 #define GRAPHICS_MENU_H_
 
 #include "Font.h"
+#include "Sprite.h"
 #include "../geometry/operators.h"
 #include "../geometry/Point.h"
 #include "../geometry/Vector.h"
@@ -20,14 +21,15 @@ namespace graphics {
 
 class Sprite;
 
-// TODO: disabled entries + alternate font for those
+// TODO: alternate font for disabled entries
 // TODO: sprite for the cursor
 // TODO: animation when top row changes
 template<class T>
 class Menu {
 
 public:
-       explicit Menu(const Font *font = NULL, int charsPerEntry = 16, int rows = 1, int rowGap = 0, int cols = 1, int colGap = 0);
+       Menu();
+       Menu(const Font *font, const Font *disabledFont, const Sprite *cursor, int charsPerEntry, int rows, int rowGap = 0, int cols = 1, int colGap = 0);
 
 public:
        int Width() const;
@@ -38,6 +40,7 @@ public:
        T &Selected() { return entries[selected].value; }
        const T &Selected() const { return entries[selected].value; }
        const char *SelectedTitle() const { return entries[selected].title; }
+       bool SelectedIsEnabled() const { return entries[selected].enabled; }
 
        void NextItem();
        void PreviousItem();
@@ -45,7 +48,13 @@ public:
        void PreviousRow();
        void SelectIndex(int index);
 
-       void Add(const char *title, const T &value, const Sprite *icon = 0) { entries.push_back(Entry(title, value, icon)); }
+       int EntryCount() const { return entries.size(); }
+       T &ValueAt(int index) { return entries[index].value; }
+       const T &ValueAt(int index) const { return entries[index].value; }
+
+       void Add(const char *title, const T &value, bool enabled = true, const Sprite *icon = 0) { entries.push_back(Entry(title, value, enabled, icon)); }
+       void Disable(int index) { entries[index].enabled = false; }
+       void Enable(int index) { entries[index].enabled = true; }
        void Reserve(int n) { entries.reserve(n); }
 
        void Draw(SDL_Surface *dest, geometry::Point<int> position) const;
@@ -56,13 +65,16 @@ private:
 
 private:
        struct Entry {
-               Entry(const char *title, const T &value, const Sprite *icon = 0)
-               : title(title), icon(icon), value(value) { }
+               Entry(const char *title, const T &value, bool enabled = true, const Sprite *icon = 0)
+               : title(title), icon(icon), value(value), enabled(enabled) { }
                const char *title;
                const Sprite *icon;
                T value;
+               bool enabled;
        };
        const Font *font;
+       const Font *disabledFont;
+       const Sprite *cursor;
        std::vector<Entry> entries;
        int charsPerEntry;
        int rows;
@@ -76,8 +88,25 @@ private:
 
 
 template<class T>
-Menu<T>::Menu(const Font *font, int charsPerEntry, int rows, int rowGap, int cols, int colGap)
+Menu<T>::Menu()
+: font(0)
+, disabledFont(0)
+, cursor(0)
+, charsPerEntry(0)
+, rows(0)
+, rowGap(0)
+, cols(0)
+, colGap(0)
+, selected(0)
+, topRow(0) {
+
+}
+
+template<class T>
+Menu<T>::Menu(const Font *font, const Font *disabledFont, const Sprite *cursor, int charsPerEntry, int rows, int rowGap, int cols, int colGap)
 : font(font)
+, disabledFont(disabledFont ? disabledFont : font)
+, cursor(cursor)
 , charsPerEntry(charsPerEntry)
 , rows(rows)
 , rowGap(rowGap)
@@ -139,9 +168,19 @@ void Menu<T>::Draw(SDL_Surface *dest, geometry::Point<int> position) const {
        int items(entries.size() - start);
        int end(items < slots ? items : slots);
        for (int i(0), count(end - start); i < count; ++i) {
-               geometry::Vector<int> offset((i % cols) * (ColWidth() + colGap), (i / cols) * RowHeight());
-               font->DrawString(entries[start + i].title, dest, position + offset, charsPerEntry);
+               geometry::Vector<int> offset(
+                               (i % cols) * (ColWidth() + colGap),
+                               (i / cols) * RowHeight());
+               if (entries[start + i].enabled) {
+                       font->DrawString(entries[start + i].title, dest, position + offset, charsPerEntry);
+               } else {
+                       disabledFont->DrawString(entries[start + i].title, dest, position + offset, charsPerEntry);
+               }
        }
+       geometry::Vector<int> cursorOffset(
+                       (selected % cols) * (ColWidth() + colGap) - cursor->Width(),
+                       (selected / cols) * RowHeight());
+       cursor->Draw(dest, position + cursorOffset);
 }
 
 }