]> git.localhorst.tv Git - l2e.git/blobdiff - src/graphics/Menu.h
added some information about menus
[l2e.git] / src / graphics / Menu.h
index f35a2bed2ce370cc8d19d8717a1e4de17eb1b6d7..1cdddcdb01467cb752ebc979913a55a7fd03a34e 100644 (file)
@@ -14,7 +14,6 @@
 #include "../geometry/Point.h"
 #include "../geometry/Vector.h"
 
-#include <iostream>
 #include <vector>
 #include <SDL.h>
 
@@ -28,14 +27,14 @@ class Menu {
 
 public:
        Menu();
-       Menu(const Font *font, const Font *disabledFont, const Sprite *cursor, int charsPerEntry, int rows, int rowGap = 0, int cols = 1, int colGap = 0);
-       Menu(const Menu &);
+       Menu(const Font *font, const Font *disabledFont, const Sprite *cursor, int charsPerEntry, int rows, int rowGap = 0, int iconSpace = 0, int cols = 1, int colGap = 0);
 
 public:
        int Width() const;
        int Height() const;
-       int ColWidth() const { return font->CharWidth() * charsPerEntry; }
+       int ColWidth() const { return iconSpace + font->CharWidth() * charsPerEntry; }
        int RowHeight() const { return font->CharHeight() + rowGap; }
+       int CharsPerEntry() const { return charsPerEntry; }
 
        T &Selected() { return entries[selected].value; }
        const T &Selected() const { return entries[selected].value; }
@@ -58,6 +57,7 @@ public:
        void Disable(int index) { entries[index].enabled = false; }
        void Enable(int index) { entries[index].enabled = true; }
        void Reserve(int n) { entries.reserve(n); }
+       void Clear() { entries.clear(); }
 
        void Draw(SDL_Surface *dest, geometry::Point<int> position) const;
 
@@ -81,6 +81,7 @@ private:
        int charsPerEntry;
        int rows;
        int rowGap;
+       int iconSpace;
        int cols;
        int colGap;
        int selected;
@@ -97,6 +98,7 @@ Menu<T>::Menu()
 , charsPerEntry(0)
 , rows(0)
 , rowGap(0)
+, iconSpace(0)
 , cols(0)
 , colGap(0)
 , selected(0)
@@ -105,13 +107,14 @@ Menu<T>::Menu()
 }
 
 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)
+Menu<T>::Menu(const Font *font, const Font *disabledFont, const Sprite *cursor, int charsPerEntry, int rows, int rowGap, int iconSpace, int cols, int colGap)
 : font(font)
 , disabledFont(disabledFont ? disabledFont : font)
 , cursor(cursor)
 , charsPerEntry(charsPerEntry)
 , rows(rows)
 , rowGap(rowGap)
+, iconSpace(iconSpace)
 , cols(cols)
 , colGap(colGap)
 , selected(0)
@@ -119,22 +122,6 @@ Menu<T>::Menu(const Font *font, const Font *disabledFont, const Sprite *cursor,
 
 }
 
-template<class T>
-Menu<T>::Menu(const Menu &other)
-: font(other.font)
-, disabledFont(other.disabledFont)
-, cursor(other.cursor)
-, entries(other.entries)
-, charsPerEntry(other.charsPerEntry)
-, rows(other.rows)
-, rowGap(other.rowGap)
-, cols(other.cols)
-, colGap(other.colGap)
-, selected(other.selected)
-, topRow(other.topRow) {
-       std::cout << "copied Menu" << std::endl;
-}
-
 
 template<class T>
 int Menu<T>::Width() const {
@@ -169,11 +156,10 @@ void Menu<T>::PreviousRow() {
 
 template<class T>
 void Menu<T>::SelectIndex(int index) {
-       if (index < 0 || int(entries.size()) < index) return;
-       std::cout << "selecting index " << index << std::endl;
+       if (index < 0 || int(entries.size()) <= index) return;
        selected = index;
-       if (GetRow(selected) - rows > topRow) {
-               topRow = GetRow(selected) - rows;
+       if (topRow <= GetRow(selected) - rows) {
+               topRow = GetRow(selected) - rows + 1;
        } else if (GetRow(selected) < topRow) {
                topRow = GetRow(selected);
        }
@@ -183,22 +169,26 @@ void Menu<T>::SelectIndex(int index) {
 template<class T>
 void Menu<T>::Draw(SDL_Surface *dest, geometry::Point<int> position) const {
        int start(topRow * cols);
-       int slots((topRow + rows) * cols);
+       int slots(rows * cols);
        int items(entries.size() - start);
-       int end(items < slots ? items : slots);
+       int end(start + (items < slots ? items : slots));
        for (int i(0), count(end - start); i < count; ++i) {
-               geometry::Vector<int> offset(
+               geometry::Vector<int> iconOffset(
                                (i % cols) * (ColWidth() + colGap),
                                (i / cols) * RowHeight());
+               if (entries[start + i].icon) {
+                       entries[start + i].icon->Draw(dest, position + iconOffset);
+               }
+               geometry::Vector<int> labelOffset(iconOffset.X() +  + iconSpace, iconOffset.Y());
                if (entries[start + i].enabled) {
-                       font->DrawString(entries[start + i].title, dest, position + offset, charsPerEntry);
+                       font->DrawString(entries[start + i].title, dest, position + labelOffset, charsPerEntry);
                } else {
-                       disabledFont->DrawString(entries[start + i].title, dest, position + offset, charsPerEntry);
+                       disabledFont->DrawString(entries[start + i].title, dest, position + labelOffset, charsPerEntry);
                }
        }
        geometry::Vector<int> cursorOffset(
                        (selected % cols) * (ColWidth() + colGap) - cursor->Width(),
-                       (selected / cols) * RowHeight());
+                       ((selected - start) / cols) * RowHeight());
        cursor->Draw(dest, position + cursorOffset);
 }