]> git.localhorst.tv Git - l2e.git/blobdiff - src/graphics/Menu.h
hook alternate cursor in inventory menu
[l2e.git] / src / graphics / Menu.h
index 7aa2e9448794754d57024e36e16252bbba6f0389..68deef8da0814c98144fb656c02560f5813852c6 100644 (file)
@@ -9,6 +9,7 @@
 #define GRAPHICS_MENU_H_
 
 #include "Font.h"
+#include "fwd.h"
 #include "Sprite.h"
 #include "../geometry/Vector.h"
 
 
 namespace graphics {
 
-class Sprite;
-
 struct MenuProperties {
+       static const int TYPE_ID = 407;
+
        const Font *font;
        const Font *disabledFont;
        const Sprite *cursor;
+       const Sprite *selectedCursor;
        int charsPerEntry;
        int rows;
        int rowGap;
@@ -33,18 +35,20 @@ struct MenuProperties {
        int charsPerAdditionalText;
        int additionalTextGap;
        char delimiter;
+       bool wrapX;
+       bool wrapY;
 
        MenuProperties()
-       : font(0), disabledFont(0), cursor(0)
-       , charsPerEntry(0), rows(0), rowGap(0)
-       , iconSpace(0), cols(0), colGap(0)
+       : font(0), disabledFont(0), cursor(0), selectedCursor(0)
+       , charsPerEntry(0), rows(1), rowGap(0)
+       , iconSpace(0), cols(1), colGap(0)
        , charsPerNumber(0), charsPerAdditionalText(0)
-       , additionalTextGap(0), delimiter(':') { }
-
-       MenuProperties(const Font *font, const Font *disabledFont, const Sprite *cursor, int charsPerEntry, int rows, int rowGap, int iconSpace, int cols, int colGap, int charsPerNumber, char delimiter, int charsPerAdditionalText, int additionalTextGap)
-       : font(font), disabledFont(disabledFont), cursor(cursor), charsPerEntry(charsPerEntry), rows(rows), rowGap(rowGap), iconSpace(iconSpace), cols(cols), colGap(colGap), charsPerNumber(charsPerNumber), charsPerAdditionalText(charsPerAdditionalText), additionalTextGap(additionalTextGap), delimiter(delimiter) { }
+       , additionalTextGap(0), delimiter(':')
+       , wrapX(false), wrapY(false) { }
 
        static void CreateTypeDescription();
+       static void Construct(void *);
+
 };
 
 template<class T>
@@ -54,9 +58,14 @@ class Menu
 public:
        Menu();
        Menu(const MenuProperties &);
-       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, int charsPerNumber = 0, char delimiter = ':', int charsPerAdditionalText = 0, int additionalTextGap = 0);
 
 public:
+       void SetInactive() { state = STATE_INACTIVE; }
+       void SetActive() { state = STATE_ACTIVE; }
+       void SetSelected() { state = STATE_SELECTED; }
+       bool IsActive() const { return state == STATE_ACTIVE; }
+       bool HasSelected() const { return state == STATE_SELECTED; }
+
        int Width() const;
        int Height() const;
        int ColWidth() const;
@@ -108,6 +117,12 @@ private:
        std::vector<Entry> entries;
        int selected;
        int topRow;
+       enum State {
+               STATE_INACTIVE,
+               STATE_ACTIVE,
+               STATE_SELECTED,
+       };
+       State state;
 
 };
 
@@ -116,7 +131,8 @@ template<class T>
 Menu<T>::Menu()
 : MenuProperties()
 , selected(0)
-, topRow(0) {
+, topRow(0)
+, state(STATE_ACTIVE) {
 
 }
 
@@ -124,22 +140,8 @@ template<class T>
 Menu<T>::Menu(const MenuProperties &p)
 : MenuProperties(p)
 , 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 iconSpace, int cols, int colGap, int charsPerNumber, char delimiter, int charsPerAdditionalText, int additionalTextGap)
-: MenuProperties(
-               font, disabledFont ? disabledFont : font,
-               cursor, charsPerEntry,
-               rows, rowGap, iconSpace,
-               cols, colGap, charsPerNumber,
-               delimiter,
-               charsPerAdditionalText,
-               additionalTextGap)
-, selected(0)
-, topRow(0) {
+, topRow(0)
+, state(STATE_ACTIVE) {
 
 }
 
@@ -170,22 +172,38 @@ int Menu<T>::Height() const {
 
 template<class T>
 void Menu<T>::NextItem() {
-       SelectIndex(selected + 1);
+       int index(selected + 1);
+       if (wrapX && index % cols == 0) {
+               index -= cols;
+       }
+       SelectIndex(index);
 }
 
 template<class T>
 void Menu<T>::PreviousItem() {
-       SelectIndex(selected - 1);
+       int index(selected - 1);
+       if (wrapX && selected % cols == 0) {
+               index += cols;
+       }
+       SelectIndex(index);
 }
 
 template<class T>
 void Menu<T>::NextRow() {
-       SelectIndex(selected + cols);
+       int index(selected + cols);
+       if (wrapY && index >= int(entries.size())) {
+               index -= entries.size();
+       }
+       SelectIndex(index);
 }
 
 template<class T>
 void Menu<T>::PreviousRow() {
-       SelectIndex(selected - cols);
+       int index(selected - cols);
+       if (wrapY && index < 0) {
+               index += entries.size();
+       }
+       SelectIndex(index);
 }
 
 template<class T>
@@ -211,6 +229,13 @@ void Menu<T>::Draw(SDL_Surface *dest, const geometry::Vector<int> &position) con
                geometry::Vector<int> iconOffset(
                                (i % cols) * (ColWidth() + colGap),
                                (i / cols) * RowHeight());
+
+               // Third column hack!
+               // This fixes the position of the "DROP" item in the inventory menu.
+               if (i % cols == 2) {
+                       iconOffset += geometry::Vector<int>(font->CharWidth(), 0);
+               }
+
                if (entries[start + i].icon) {
                        entries[start + i].icon->Draw(dest, position + iconOffset);
                }
@@ -231,13 +256,22 @@ void Menu<T>::Draw(SDL_Surface *dest, const geometry::Vector<int> &position) con
                if (charsPerNumber) {
                        usedFont->DrawChar(delimiter, dest, position + textOffset);
                        textOffset += geometry::Vector<int>(usedFont->CharWidth(), 0);
-                       usedFont->DrawNumber(entries[start + i].number, dest, position + textOffset);
+                       usedFont->DrawNumber(entries[start + i].number, dest, position + textOffset, charsPerNumber);
                }
        }
        geometry::Vector<int> cursorOffset(
                        (selected % cols) * (ColWidth() + colGap) - cursor->Width(),
                        ((selected - start) / cols) * RowHeight());
-       cursor->Draw(dest, position + cursorOffset);
+       switch (state) {
+               case STATE_INACTIVE:
+                       break;
+               case STATE_ACTIVE:
+                       cursor->Draw(dest, position + cursorOffset);
+                       break;
+               case STATE_SELECTED:
+                       selectedCursor->Draw(dest, position + cursorOffset);
+                       break;
+       }
 }
 
 }