// Menu List // // Douglas Thrift // // $Id$ #ifndef _MenuList_hpp_ #define _MenuList_hpp_ #include #include #include #include "Display.hpp" #include "Filter.hpp" class MenuList { static MenuList *previous; 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; protected: struct MenuItem { protected: MenuList *list; MenuItem(MenuList *list); public: virtual MenuList *Select() = 0; virtual operator std::string() const = 0; }; private: inline MenuList *Select(MenuItem *item) { MenuList *list(item->Select()); if (list == NULL) delete this; return list; } protected: struct BoolItem { virtual operator bool() const = 0; }; struct SubItem {}; struct MusicItem { protected: Audacious::Audacious &audacious; bool &append; MusicItem(Audacious::Audacious &audacious, bool &append); }; std::vector list; public: MenuList(MenuList *parent, Display &display, size_t size); MenuList(MenuList *parent); virtual ~MenuList(); MenuList *Enter(); MenuList *Left(); MenuList *Right(); void Render(); MenuList &operator ++(); MenuList &operator --(); friend struct TopList; }; class 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, public MenuList::MusicItem { Music::Library &library; public: MusicItem(MenuList *list, Audacious::Audacious &audacious, bool &append, Music::Library &library); virtual MenuList *Select(); virtual operator std::string() const; }; public: TopList(Display &display, Audacious::Audacious &audacious, bool &append, Music::Library &library); }; class ArtistList : public MenuList { class AllItem : public MenuItem, public MusicItem { Music::Library &library; public: AllItem(MenuList *list, Audacious::Audacious &audacious, bool &append, Music::Library &library); virtual MenuList *Select(); virtual operator std::string() const; }; class ArtistItem : public MenuItem, public SubItem, public MusicItem { Music::Artist artist; public: ArtistItem(MenuList *list, Audacious::Audacious &audacious, bool append, Music::Artist artist); virtual ~ArtistItem() {} virtual MenuList *Select(); virtual operator std::string() const; }; public: ArtistList(MenuList *parent, Audacious::Audacious &audacious, bool &append, Music::Library &library); }; class AlbumList : public MenuList { /*struct AllItem : public MenuItem { }; struct AlbumItem : public MenuItem, public SubItem { };*/ public: AlbumList(MenuList *parent, Audacious::Audacious &audacious, bool &append); }; class SongList : public MenuList { /*struct AllItem : public MenuItem { }; struct SongItem : public MenuItem { };*/ public: SongList(MenuList *parent, Audacious::Audacious &audacious, bool &append); }; #endif//_MenuList_hpp_