ViewVC Help
View File | Revision Log | Show Annotations | Download File | View Changeset | Root Listing
root/truck/DashInterface/MenuList.cpp
Revision: 42
Committed: 2008-03-06T13:04:20-08:00 (17 years, 3 months ago) by douglas
File size: 3132 byte(s)
Log Message:
Beginnings of a menu?

File Contents

# User Rev Content
1 douglas 42 // Menu List
2     //
3     // Douglas Thrift
4     //
5     // $Id$
6    
7     #include <foreach.hpp>
8    
9     #include <sqlite3.h>
10    
11     #include "MenuList.hpp"
12    
13     MenuList *MenuList::previous;
14    
15     MenuList::MenuItem::MenuItem(MenuList *list) : list(list)
16     {
17     }
18    
19     MenuList::MenuList(MenuList *parent, Display &display, size_t size) : parent(parent), display(display), list(size)
20     {
21     }
22    
23     MenuList::~MenuList()
24     {
25     _foreach (std::vector<MenuItem *>, item, list)
26     delete *item;
27     }
28    
29     MenuList *MenuList::Enter()
30     {
31     return list[state.item]->Select();
32     }
33    
34     MenuList *MenuList::Right()
35     {
36     MenuItem *item(list[state.item]);
37    
38     if (dynamic_cast<SubItem *>(item))
39     return item->Select();
40    
41     return this;
42     }
43    
44     MenuList *MenuList::Left()
45     {
46     return parent;
47     }
48    
49     void MenuList::Render()
50     {
51     if (this != previous || state != old)
52     {
53     # define Cursor(index) (state.cursor == index ? _B("\x1f") : _B(" "))
54    
55     display.Set(0, 0, (state.bottom != 0 ? '\x1a' : ' ') + Cursor(0));
56     display.Set(0, 1, '\x12' + Cursor(1));
57     display.Set(0, 2, '\x13' + Cursor(2));
58     display.Set(0, 3, (state.top < list.size() ? '\x1b' : ' ') + Cursor(3));
59    
60     # undef Cursor
61    
62     _forall (size_t, index, state.bottom, state.top)
63     {
64     MenuItem *item(list[index]);
65     std::string value(*item);
66    
67     value.resize(17, ' ');
68    
69     if (BoolItem *item_ = dynamic_cast<BoolItem *>(item))
70     value += (*item_ ? '\x94' : '\xcf');
71     else if (dynamic_cast<SubItem *>(item))
72     value += '\x10';
73     else
74     value += ' ';
75    
76     display.Set(2, _index, value);
77     }
78     }
79     else
80     {
81     if (state.cursor != old.cursor)
82     {
83     display.Set(1, old.cursor, _B(" "));
84     display.Set(1, state.cursor, _B("\x1f"));
85     }
86    
87     _forall (size_t, index, state.bottom, state.top)
88     if (BoolItem *item = dynamic_cast<BoolItem *>(list[index]))
89     display.Set(19, _index, (*item ? _B("\x94") : _B("\xcf")));
90     }
91     }
92    
93     MenuList &MenuList::operator ++()
94     {
95     size_t next(state.item + 1);
96    
97     if (next != list.size())
98     {
99     if (next == state.bottom)
100     ++state.top, ++state.bottom;
101     else
102     ++state.cursor;
103    
104     state.item = next;
105     }
106    
107     return *this;
108     }
109    
110     MenuList &MenuList::operator --()
111     {
112     if (state.item != 0)
113     if (state.item-- == state.top)
114     --state.top, --state.bottom;
115     else
116     --state.cursor;
117    
118     return *this;
119     }
120    
121     TopList::AppendItem::AppendItem(MenuList *list, bool &append) : MenuItem(list), append(append)
122     {
123     }
124    
125     MenuList *TopList::AppendItem::Select()
126     {
127     append = !append;
128    
129     return list;
130     }
131    
132     TopList::AppendItem::operator std::string() const
133     {
134     return _B("Append");
135     }
136    
137     TopList::AppendItem::operator bool() const
138     {
139     return append;
140     }
141    
142     TopList::ShuffleItem::ShuffleItem(MenuList *list, Audacious::Audacious &audacious) : MenuItem(list), audacious(audacious)
143     {
144     }
145    
146     MenuList *TopList::ShuffleItem::Select()
147     {
148     if (audacious.IsRunning())
149     audacious.ToggleShuffle();
150    
151     return list;
152     }
153    
154     TopList::ShuffleItem::operator std::string() const
155     {
156     return _B("Shuffle");
157     }
158    
159     TopList::ShuffleItem::operator bool() const
160     {
161     return audacious.IsRunning() ? audacious.IsShuffle() : false;
162     }
163    
164     TopList::TopList(Audacious::Audacious &audacious, Display &display, bool &append) : MenuList(this, display, 3)
165     {
166     previous = NULL;
167     list[0] = new AppendItem(this, append);
168     list[1] = new ShuffleItem(this, audacious);
169     }

Properties

Name Value
svn:keywords Id