summaryrefslogtreecommitdiff
path: root/vdr_menu.h
blob: ca6349a32fab23c50689c85ce2826f9ad739e38d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
/*!
 * \file   vdr_menu.h
 * \brief  Implements menu handling for broswing media libraries within VDR
 *
 * \version $Revision: 1.13 $
 * \date    $Date$
 * \author  Ralf Klueber, Lars von Wedel, Andreas Kellner, Wolfgang Rohdewald
 * \author  Responsible author: $Author$
 *
 *  $Id$
 */

#ifndef _VDR_MENU_H
#define _VDR_MENU_H

#include <string>
// #include <list>
#include <vector>

#include <vdr/osd.h>
#include <vdr/plugin.h>
#include <vdr/status.h>
#include "vdr_actions.h"
#include "mg_menu.h"

//! \brief play a selection, aborting what is currently played
//! \param select if true, play only what the current position selects
void Play(mgSelection *sel,const bool select=false);

void showmessage(int duration, const char *msg, ...);
void showimportcount(unsigned int count);

class cCommands;

class mgSelection;
class mgSelMenu;
class mgIncrementalSearch;
class mgPlayerControl;

//! \brief if a player is running, return it
mgPlayerControl * PlayerControl ();

/*!
 * \brief the muggle main OSD
 */

class mgSelOsd : public mgOsd
{
	private:
		mgSelection *m_playsel;
		mgSelection *m_collectionsel;
		vector<mgSelection*> selections;
		unsigned int m_current_selection;
		void DumpSelections(mgValmap& nv);
		void LoadSelections(mgValmap& nv);
	public:
		void AddSelection();
		void DeleteSelection();
		void AddOrderActions(mgSelMenu *m);
		unsigned int getCurrentSelection() { return m_current_selection; }
		void setSelection(unsigned int idx,mgSelection *s);
		mgSelection* getSelection(unsigned int idx);
		bool SwitchSelection();

		mgSelection *moveselection;

		//! \brief play the play selection, abort ongoing instant play
		void PlayQueue();

		//! \brief instant play the selection, abort ongoing queue playing
		void PlayInstant(const bool select=false);

		//! \brief true if we are browsing m_collectionsel
		bool UsingCollection;

		//! \brief true if an item from the "playing" selection is being played
		bool queue_playing;

		//! \brief true if an item is being instant played
		bool instant_playing;

		//! \brief default constructor
		mgSelOsd ();

		//! \brief default destructor
		~mgSelOsd ();

		//! \brief save the entire muggle state
		void SaveState();

		//! \brief adds a new mgMenu to the stack
		virtual void AddMenu (mgMenu * m,int position=0);

		//! \brief initializes using values from nv
		void InitMapFromSetup (mgValmap& nv);

		//! \brief main entry point, called from vdr
		eOSState ProcessKey (eKeys Key);

		//! \brief from now on use the normal selection
		void UseNormalSelection () {
			UsingCollection= false;
		}

		//! \brief from now on use the collection selection
		void UseCollectionSelection () {
			UsingCollection= true;
		}

		//! \brief this is the collection things will be added to
		string default_collection;

		/*! \brief this is the "now playing" collection translated in
		 * the current language. When changing the OSD language, this
		 * collection will NOT be renamed in the data base, but a new
		 * empty collection will be started. The collection for the
		 * previous language will stay, so the user can copy from the
		 * old one to the new one.
		 */
		string play_collection;

		/*! \brief selects a certain line on the OSD and displays the OSD
		 */
		//! \brief external commands
		cCommands *external_commands;

		//! \brief clears the screen, sets a title and the hotkey flag
		void InitOsd (string title,const bool hashotkeys);

#if VDRVERSNUM >= 10307
		//! \brief expose the protected DisplayMenu() from cOsdMenu
		cSkinDisplayMenu *DisplayMenu(void) {
			return cOsdMenu::DisplayMenu();
		}
#endif

		//! \brief expose the protected cOsdMenu::hk()
		const char *hk (const char *s) {
			return cOsdMenu::hk (s);
		}

		//! \brief the current selection
		mgSelection* selection () const
		{
			if (UsingCollection)
				return m_collectionsel;
			else
				return selections[m_current_selection];
		}

		//! \brief the collection selection
		mgSelection* collselection() const
		{
			return m_collectionsel;
		}

		//! \brief the "now playing" selection
		mgSelection* playselection () const
		{
			return m_playsel;
		}

		//! \brief true if the cursor is placed in the collection list
		bool ShowingCollections();

		//! \brief true if the cursor is placed on the default collection
		bool DefaultCollectionSelected();

		//! \brief true if the cursor is placed in the default collection
		bool CollectionEntered(string name);

		void CollectionChanged(string name,bool added);
};

//! \brief a generic muggle menu
class mgSelMenu : public mgMenu
{
	protected:
		bool m_prevUsingCollection;

		//! \brief adds entries for all selected data base items to the OSD menu.
		// If this is the list of collections, appends a command for collection
		// creation.
		void AddSelectionItems (mgSelection *sel,mgActions act = actEntry);
		//! \brief the name of the blue button depends of where we are
		mgActions ButtonAction(eKeys key);
	public:
		mgSelMenu ();

		void SetHotkeyAction(eKeys key,mgActions action);

		mgSelOsd * Selosd() const { return dynamic_cast<mgSelOsd *>(m_osd); }

		void setosd(mgOsd *osd);

		//! \brief the currently active selection of the owning mgSelOsd
		mgSelection* selection ()  const
		{
			return Selosd ()->selection ();
		}
		//! \brief the playselection of the owning mgSelOsd
		mgSelection* playselection () {
			return Selosd ()->playselection ();
		}

		/*! \brief Process() should be abstract but then we cannot compile.
		 * \return Process may decide that we want another screen to be displayed.
		 * If the mgSelMenu* returned is not "this", the caller will use the return
		 * value for a new display. If NULL is returned, the caller will display
		 * the previous menu.
		 */
		virtual eOSState Process (eKeys Key);

		//! \brief the ID of the action defined by the red button.
		mgActions CollRedAction;

		//! \brief the ID of the action defined by the green button.
		mgActions CollGreenAction;

		//! \brief the action defined by the yellow button.
		mgActions CollYellowAction;

		//! \brief the action defined by the blue button.
		mgActions CollBlueAction;
};

//! \brief an mgSelMenu class for navigating through the data base
class mgTree:public mgSelMenu
{
	public:

		mgTree();

		//! \brief computes the title
		string Title() const;

		bool UpdateIncrementalSearch( eKeys key );

		void TerminateIncrementalSearch( bool remain_on_current );

	protected:
		void BuildOsd ();

	private:

		void UpdateSearchPosition();

		mgIncrementalSearch *m_incsearch;

		string m_filter;

		int m_start_position;
};

//! \brief an mgSelMenu class for submenus
class mgSubmenu:public mgSelMenu
{
	public:
		mgSubmenu();
		//! \brief computes the title
		string Title() const;
	protected:
		void BuildOsd ();
};

//! \brief an mgSelMenu class for selecting a selection
class mgSelMenuOrders:public mgSelMenu
{
	public:
		//! \brief computes the title
		string Title() const;
	protected:
		void BuildOsd ();
};

class mgSelMenuOrder : public mgSelMenu
{
	public:
		mgSelMenuOrder();
		~mgSelMenuOrder();
		//! \brief computes the title
		string Title() const;
		bool ChangeSelection(eKeys key);
		void SaveSelection();
	protected:
		void BuildOsd ();
	private:
		void AddKeyActions(mgSelMenu *m,mgSelection *o);
		mgSelection * m_orgselection;
		mgSelection * m_selection;
		int m_orderbycount;
		vector<int> m_keytypes;
		vector < vector <const char*> > m_keynames;
};

//! \brief an mgSelMenu class for selecting a collection
class mgTreeCollSelector:public mgSelMenu
{
	public:
		mgTreeCollSelector();
		~mgTreeCollSelector();
		//! \brief computes the title
		string Title() const;
	protected:
		void BuildOsd ();
		virtual mgActions coll_action() = 0;
		string m_title;
};

class mgTreeAddToCollSelector:public mgTreeCollSelector
{
	public:
		//! \brief computes the title
		mgTreeAddToCollSelector(string title);
	protected:
		virtual mgActions coll_action() { return actAddCollEntry; }
};

//! \brief an mgSelMenu class for selecting a collection
class mgTreeRemoveFromCollSelector:public mgTreeCollSelector
{
	public:
		//! \brief computes the title
		mgTreeRemoveFromCollSelector(string title);
	protected:
		virtual mgActions coll_action() { return actRemoveCollEntry; }
};

mgSelection* GenerateSelection(const mgSelection *s=0);
#endif