// Menu List // // Douglas Thrift // // $Id$ #ifndef _MenuList_hpp_ #define _MenuList_hpp_ #include #include #include "Display.hpp" struct MenuList { protected: static MenuList *previous; private: MenuList *parent; Display &display; size_t cursor; struct State { size_t item, top, bottom; State() : item(0), top(0), bottom(4) {} bool operator !=(const State &state) const { return top != state.top; } } state, old; public: struct MenuItem { protected: MenuList *list; public: MenuItem(MenuList *list); virtual MenuList *Select() = 0; virtual operator std::string() const = 0; }; struct BoolItem { virtual operator bool() const = 0; }; struct SubItem {}; protected: std::vector list; public: MenuList(MenuList *parent, Display &display, size_t size = 0); virtual ~MenuList(); MenuList *Enter(); MenuList *Left(); MenuList *Right(); void Render(); MenuList &operator ++(); MenuList &operator --(); }; struct TopList : public MenuList { class AppendItem : public MenuItem, public BoolItem { bool &append; public: AppendItem(MenuList *list, bool &append); virtual MenuList *Select(); virtual operator std::string() const; virtual operator bool() const; }; class ShuffleItem : public MenuItem, public BoolItem { Audacious::Audacious &audacious; public: ShuffleItem(MenuList *list, Audacious::Audacious &audacious); virtual MenuList *Select(); virtual operator std::string() const; virtual operator bool() const; }; class MusicItem : public MenuItem, public SubItem { Audacious::Audacious &audacious; public: MusicItem(MenuList *list, Audacious::Audacious &audacious); virtual MenuList *Select(); virtual operator std::string() const; }; TopList(Display &display, Audacious::Audacious &audacious, bool &append); }; struct ArtistList : public MenuList { /*class AllItem : public MenuItem { }; class ArtistItem : public MenuItem, public SubItem { };*/ ArtistList(Display &display, Audacious::Audacious &audacious, bool &append); }; struct AlbumList : public MenuList { /*class AllItem : public MenuItem { }; class AlbumItem : public MenuItem, public SubItem { };*/ AlbumList(Display &display, Audacious::Audacious &audacious, bool &append); }; struct SongList : public MenuList { /*class AllItem : public MenuItem { }; class SongItem : public MenuItem { };*/ SongList(Display &display, Audacious::Audacious &audacious, bool &append); }; #endif//_MenuList_hpp_