Subversion Repositories mdb

Rev

Rev 29 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
23 andreas 1
/*
2
 * Copyright (C) 2015 by Andreas Theofilu <andreas@theosys.at>
3
 *
4
 * All rights reserved. No warranty, explicit or implicit, provided.
5
 *
6
 * NOTICE:  All information contained herein is, and remains
7
 * the property of Andreas Theofilu and his suppliers, if any.
8
 * The intellectual and technical concepts contained
9
 * herein are proprietary to Andreas Theofilu and its suppliers and
10
 * may be covered by European and Foreign Patents, patents in process,
11
 * and are protected by trade secret or copyright law.
12
 * Dissemination of this information or reproduction of this material
13
 * is strictly forbidden unless prior written permission is obtained
14
 * from Andreas Theofilu.
15
 */
26 andreas 16
MODULE_NAME='MDB_UI'	(dev dvTPs[], dev vdvMDB, char IP[], char path[], integer nIndex[])
23 andreas 17
 
18
#include 'mSNAPI'
19
 
20
DEFINE_TYPE
21
	struct ST_SONG
22
	{
23
		integer nID;
24
		char sTitle[128];
25
		char sArtist[128];
26
		char sAlbum[128];
27
		char sGenre[128];
28
		char sCover[64];
29
	};
30
 
31
DEFINE_CONSTANT
32
	constant integer MAX_LINES =		5;
33
 
34
	constant char sPopupList[] = 		'MFp_MDB_list';
35
	constant char sPopupAudio[] = 		'MFp_MDB_audio';
36
	constant char sPopupDetail[] = 		'MFp_MDB_detail';
37
	constant char sPopupMenu[] = 		'MFp_MDB_menu';
24 andreas 38
	constant char sPopupUsers[] =		'MFp_MDB_users';
39
	constant char sPopupSelUser[] =		'MFp_MDB_select_user';
23 andreas 40
 
25 andreas 41
	constant integer BTN_SCROLLBAR =	256;
42
 
23 andreas 43
	constant integer BTN_SAVE =			340;
44
	constant integer BTN_DELETE =		341;
45
	constant integer BTN_NOW_PLAYING =	342;
26 andreas 46
	constant integer BTN_SEARCH =		343;
25 andreas 47
	constant integer BTN_QUEUE =		349;
23 andreas 48
 
49
	constant integer BTN_TITLE = 		350;
50
	constant integer BTN_ARTIST =		351;
51
	constant integer BTN_GENRE =		352;
52
	constant integer BTN_ALBUM =		353;
53
	constant integer BTN_PLAYLIST =		354;
25 andreas 54
	constant integer BTN_RETURN =		355;
28 andreas 55
	constant integer BTN_RESET =		356;
23 andreas 56
 
57
	constant integer BTN_LINE1_PIC =	301;
58
	constant integer BTN_LINE1_LINE =	321;
59
	constant integer BTN_LINE2_PIC =	302;
60
	constant integer BTN_LINE2_LINE =	322;
61
	constant integer BTN_LINE3_PIC =	303;
62
	constant integer BTN_LINE3_LINE =	323;
63
	constant integer BTN_LINE4_PIC =	304;
64
	constant integer BTN_LINE4_LINE =	324;
65
	constant integer BTN_LINE5_PIC =	305;
66
	constant integer BTN_LINE5_LINE =	325;
67
	constant integer BTN_LINE6_PIC =	306;
68
	constant integer BTN_LINE6_LINE =	326;
69
	constant integer BTN_LINE7_PIC =	307;
70
	constant integer BTN_LINE7_LINE =	327;
71
	constant integer BTN_LINE8_PIC =	308;
72
	constant integer BTN_LINE8_LINE =	328;
73
	constant integer BTN_LINE9_PIC =	309;
74
	constant integer BTN_LINE9_LINE =	329;
75
	constant integer BTN_LINE10_PIC =	310;
76
	constant integer BTN_LINE10_LINE =	330;
77
 
78
	constant integer BTN_MENU1 =		261;
79
	constant integer BTN_MENU2 =		262;
80
	constant integer BTN_MENU3 =		263;
81
	constant integer BTN_MENU4 =		264;
82
	constant integer BTN_MENU5 =		265;
83
	constant integer BTN_MENU6 =		266;
84
	constant integer BTN_MENU7 =		267;
85
	constant integer BTN_MENU8 =		268;
86
	constant integer BTN_MENU9 =		269;
87
	constant integer BTN_MENU10 =		270;
88
 
25 andreas 89
	constant integer BTN_DETAIL_BACK =	400;
90
	constant integer BTN_USER_OK =		401;
91
	constant integer BTN_USER_CANCEL =	402;
92
 
23 andreas 93
	constant integer TEXT_TITLE =		1001;
94
	constant integer TEXT_PROGRES =		1002;
95
	constant integer TEXT_MENU_TITLE =	1003;
96
 
97
	constant integer TEXT_DETAIL_TITLE =	1011;
98
	constant integer TEXT_DETAIL_ARTIST =	1012;
99
	constant integer TEXT_DETAIL_ALBUM =	1013;
100
	constant integer TEXT_DETAIL_GENRE =	1014;
101
	constant integer TEXT_DETAIL_TIME_PROG =1015;
102
	constant integer TEXT_DETAIL_TIME_TOTAL=1016;
103
 
24 andreas 104
	constant integer TEXT_INPUT_UNAME =		1021;
105
	constant integer TEXT_INPUT_PLAYLIST =	1022;
26 andreas 106
	constant integer TEXT_INPUT_SEARCH =	1023;
24 andreas 107
 
30 andreas 108
	constant integer PIC_COVER =			300;
109
	constant integer PIC_BASE =				300;
110
 
28 andreas 111
	constant integer LVL_PROGRES =			1;
25 andreas 112
	constant integer LVL_SCROLLBAR =		7;
23 andreas 113
 
25 andreas 114
	constant char TOK_TXT_NONE[] =			'NONE';
115
	constant char TOK_TXT_TITLE[] =			'TITLE';
116
	constant char TOK_TXT_ARTIST[] =		'ARTIST';
117
	constant char TOK_TXT_ALBUM[] =			'ALBUM';
118
	constant char TOK_TXT_GENRE[] =			'GENRE';
119
	constant char TOK_TXT_QUEUE[] =			'QUEUE';
120
	constant char TOK_TXT_PLAYLIST[] =		'PLAYLIST';
26 andreas 121
	constant char TOK_TXT_SEARCH[] =		'SEARCH';
23 andreas 122
 
25 andreas 123
	constant integer TOK_NONE =				0;
124
	constant integer TOK_TITLE =			1;
125
	constant integer TOK_ARTIST =			2;
126
	constant integer TOK_ALBUM =			3;
127
	constant integer TOK_GENRE =			4;
128
	constant integer TOK_QUEUE =			5;
129
	constant integer TOK_PLAYLIST =			6;
26 andreas 130
	constant integer TOK_SEARCH =			7;
25 andreas 131
 
132
	constant integer TODO_USER_SELECT = 		1;		// select a user
133
	constant integer TODO_USER_LIST_PLAYLIST =	2;		// List the playlist
134
	constant integer TODO_USER_SAVE_PLAYLIST =	3;		// Save queue to playlist
135
	constant integer TODO_USER_PLAYLIST_QUEUE = 4;		// Move a playlist to the queue
26 andreas 136
	constant integer TODO_SEARCH =				5;		// Search for titles, artists, ...
137
 
138
	constant integer DIR_OPEN =				1;
139
	constant integer DIR_CLOSE =			2;
140
 
23 andreas 141
	constant integer nNavigation[] =
142
	{
143
		BTN_SAVE,
144
		BTN_DELETE,
145
		BTN_NOW_PLAYING,
25 andreas 146
		BTN_QUEUE,
23 andreas 147
		BTN_TITLE,
148
		BTN_ARTIST,
149
		BTN_GENRE,
150
		BTN_ALBUM,
26 andreas 151
		BTN_PLAYLIST,
28 andreas 152
		BTN_SEARCH,
153
		BTN_RESET
23 andreas 154
	};
155
 
156
	constant integer nMenu[] =
157
	{
158
		BTN_MENU1,
159
		BTN_MENU2,
160
		BTN_MENU3,
161
		BTN_MENU4,
162
		BTN_MENU5,
163
		BTN_MENU6,
164
		BTN_MENU7,
165
		BTN_MENU8,
166
		BTN_MENU9,
167
		BTN_MENU10
168
	};
169
 
170
	constant integer nBtns[] =
171
	{
172
		PLAY,
173
		STOP,
174
		PAUSE,
175
		FFWD,						// Jump forward
176
		REW,						// jump backward
177
		SREV,						// Skip backward
178
		SFWD,						// Skip forward
179
		MENU_THUMBS_DN,
180
		MENU_THUMBS_UP,
181
		MEDIA_RANDOM,
24 andreas 182
		MEDIA_REPEAT,
25 andreas 183
		MENU_BACK,
184
		BTN_RETURN
23 andreas 185
	};
186
 
25 andreas 187
	constant integer nBtnUser[] =
188
	{
189
		BTN_DETAIL_BACK,
190
		BTN_USER_OK,
191
		BTN_USER_CANCEL,
192
		TEXT_INPUT_UNAME,
193
		TEXT_INPUT_PLAYLIST
194
	};
195
 
23 andreas 196
	constant integer nLines[] =
197
	{
198
		BTN_LINE1_PIC,
199
		BTN_LINE1_LINE,
200
		BTN_LINE2_PIC,
201
		BTN_LINE2_LINE,
202
		BTN_LINE3_PIC,
203
		BTN_LINE3_LINE,
204
		BTN_LINE4_PIC,
205
		BTN_LINE4_LINE,
206
		BTN_LINE5_PIC,
207
		BTN_LINE5_LINE,
208
		BTN_LINE6_PIC,
209
		BTN_LINE6_LINE,
210
		BTN_LINE7_PIC,
211
		BTN_LINE7_LINE,
212
		BTN_LINE8_PIC,
213
		BTN_LINE8_LINE,
214
		BTN_LINE9_PIC,
215
		BTN_LINE9_LINE,
216
		BTN_LINE10_PIC,
217
		BTN_LINE10_LINE
218
	};
219
 
24 andreas 220
	constant integer PLAYER_PLAY =		1;
221
	constant integer PLAYER_STOP =		2;
222
	constant integer PLAYER_PAUSE =		3;
223
 
23 andreas 224
	constant char sIconTitle[] = 'Song_45x45';
225
	constant char sIconAlbum[] = 'Album_45x45';
226
	constant char sIconGenre[] = 'Genre_45x45';
227
	constant char sIconArtist[] = 'Artist_45x45';
228
	constant char sIconQueue[] = 'Queue_45x45';
229
	constant char sIconPlaylist[] = 'Playlist_45x45';
230
 
30 andreas 231
/*	constant char sIconsMusic[7][24] =
23 andreas 232
	{
233
		sIconTitle,
234
		sIconArtist,
235
		sIconAlbum,
236
		sIconGenre,
237
		sIconQueue,
30 andreas 238
		sIconPlaylist,
239
		sIconTitle
23 andreas 240
	};
30 andreas 241
*/
242
	constant char sIconsMusic[7][24] =
243
	{
244
		'Song_45x45',
245
		'Artist_45x45',
246
		'Album_45x45',
247
		'Genre_45x45',
248
		'Queue_45x45',
249
		'Playlist_45x45',
250
		'Song_45x45'
251
	};
23 andreas 252
 
253
DEFINE_VARIABLE
254
	volatile integer nStart;				// Index position of current position in list.
25 andreas 255
	volatile integer nOldStart;				// Saves the previous value of nStart if a folder is opened
23 andreas 256
	volatile integer nTotal;				// Total number of data
257
	volatile integer nPage;					// The type of the page: TOK_TITLE, ...
26 andreas 258
	volatile integer nOldPage;				// The type of the previous page. Needed for search.
259
	volatile integer nSearch;				// 1 = Search is active
28 andreas 260
	volatile char    sSearchFor[128];		// The expression to search for
24 andreas 261
	volatile integer nPlayStatus;			// Status of the player
23 andreas 262
	volatile ST_SONG stSong[MAX_LINES];		// The register of currently showed songs
263
	volatile integer nSongIdx;				// The index of the song pointer
25 andreas 264
	volatile char    sActPlaylist[128];		// The name of the actual playlist
24 andreas 265
	volatile integer nLastPressedLine;		// The number of the line pressed last
266
	volatile integer nLastPressedMenu;		// The number of the menu line pressed last
267
	volatile integer nKeyboard[50];			// 1 = Keyboard active
25 andreas 268
	volatile char    sActUser[128];			// The name of the actual loaded user
269
	volatile char    sInputUser[128];		// Username in user dialog popup
270
	volatile char    sInputPlaylist[128];	// Name of playlist in user dialog popup
24 andreas 271
	volatile integer nFolder;				// 0 = Top level of list, 1 = Folder opened
25 andreas 272
	volatile char    sActFolder[128];		// The name of the actual selected folder
273
	volatile integer nScrollbarPressed[50];	// 1 = User is sliding the scrollbar
274
	volatile integer nScrollbarLvl;			// The level of the scrollbar when user releases the scrollbar
275
	volatile integer nRepeat;				// 1 = repeat on, 0 = repeat off
276
	volatile integer nRandom;				// 1 = random on, 0 = random off
277
	volatile integer nToDo;					// What to do next
23 andreas 278
	volatile char _strTok[10][256];
279
 
280
 
281
// DecodeURL: Undo URL encoding on a data segment as necessary for CLI protocol
282
//	(Note: Distructive for input; copy str before call if needed)
283
//   str: String to be decoded
284
define_function char[1024] DecodeURL(char oldStr[])
285
{
286
stack_var char str[1024];
287
stack_var char newStr[1024];
288
stack_var char strSegment[1024];
289
stack_var char strHex[2];
290
 
291
    str = oldStr;
292
    // Loop through string looking for '%' prefix characters
293
    strSegment = remove_string(str, '%', 1);
294
 
295
    while (length_array(strSegment) != 0) 
296
	{
297
		// Strip off '%' character from string segment, fetch HEX ASCII byte, reconstruct
298
		set_length_array(strSegment, length_array(strSegment) - 1);
299
		strHex = Left_String(str, 2);
300
		str = Right_String(str, length_array(str) - 2);
301
		newStr = "newStr,strSegment,HexToI(strHex)";
302
 
303
		strSegment = remove_string(str, '%', 1);
304
    }
305
 
306
    newStr = "newStr,str";
307
    return newStr;
308
}
309
 
24 andreas 310
define_function char[1024] EncodeURL(char oldStr[])
311
{
312
stack_var char str[1024];
25 andreas 313
stack_var char replace[64];
24 andreas 314
stack_var integer len;
315
stack_var integer i;
25 andreas 316
stack_var integer j;
317
stack_var integer flag;
24 andreas 318
 
25 andreas 319
	replace = "':;<>"% ',$27";
24 andreas 320
	len = length_string(oldStr);
321
	str = '';
322
 
323
	for (i = 1; i <= len; i++)
324
	{
25 andreas 325
		flag = false;
326
 
327
		for (j = 1; j <= length_string(replace); j++)
328
		{
329
			if (oldStr[i] == replace[j])
330
			{
331
				str = "str,'%',format('%02X', oldStr[i])";
332
				flag = true;
333
				break;
334
			}
335
		}
336
 
337
		if (!flag)
24 andreas 338
			str = "str,mid_string(oldStr, i, 1)";
339
	}
340
 
341
	return str;
342
}
343
 
23 andreas 344
define_function integer strtok(char str[], char tok[])
345
{
346
stack_var integer i;
347
stack_var integer idx;
348
 
25 andreas 349
	idx = 1;
350
 
351
	for (i = 1; i <= 10; i++)
352
		_strTok[i] = '';
353
 
23 andreas 354
	i = find_string(str, tok, 1);
355
 
356
	while (i && idx <= 10)
357
	{
25 andreas 358
		if (i > 1)
359
			_strTok[idx] = left_string(str, i - length_string(tok));
360
		else
361
			_strTok[idx] = '';
362
 
363
		remove_string(str, tok, 1);
364
		i = find_string(str, tok, 1);
23 andreas 365
		idx++;
366
	}
367
 
25 andreas 368
	if (idx <= 10)
369
		_strTok[idx] = str;
370
 
23 andreas 371
	return idx;
372
}
373
 
374
define_function char[256] getStrTok(integer idx)
375
{
376
	if (idx && idx <= 10)
377
		return _strTok[idx];
378
 
379
	return '';
380
}
381
 
28 andreas 382
define_function displayProgresBar(char sTimeA[], char sTimeB[])
383
{
29 andreas 384
stack_var double secA;
385
stack_var double secB;
28 andreas 386
stack_var integer pos;
387
stack_var integer hour;
388
stack_var integer min;
389
stack_var integer sec;
390
 
391
	if (length_string(sTimeA) > 5)
392
	{
393
		hour = atoi(left_string(sTimeA, 2));
394
		min = atoi(mid_string(sTimeA, 4, 2));
29 andreas 395
		sec = atoi(mid_string(sTimeA, 7, 2));
396
		secA = type_cast(hour * 3600 + min * 60 + sec);
28 andreas 397
	}
398
	else
399
	{
400
		min = atoi(mid_string(sTimeA, 1, 2));
29 andreas 401
		sec = atoi(mid_string(sTimeA, 4, 2));
402
		secA = type_cast(min * 60 + sec);
28 andreas 403
	}
404
 
405
	if (length_string(sTimeB) > 5)
406
	{
407
		hour = atoi(left_string(sTimeB, 2));
408
		min = atoi(mid_string(sTimeB, 4, 2));
29 andreas 409
		sec = atoi(mid_string(sTimeB, 7, 2));
410
		secB = type_cast(hour * 3600 + min * 60 + sec);
28 andreas 411
	}
412
	else
413
	{
414
		min = atoi(mid_string(sTimeB, 1, 2));
29 andreas 415
		sec = atoi(mid_string(sTimeB, 4, 2));
416
		secB = type_cast(min * 60 + sec);
28 andreas 417
	}
418
 
29 andreas 419
	pos = type_cast(100.0 / secB * secA);
28 andreas 420
	send_level dvTPs, LVL_PROGRES, pos;
421
}
422
 
26 andreas 423
define_function setPopup(integer dir, char sPg[])
424
{
425
stack_var char pop[16];
426
stack_var integer i;
427
stack_var integer anz;
428
 
429
	if (DIR_OPEN)
430
		pop = '@PPN-';
431
	else
432
		pop = '@PPF-';
433
 
434
	anz = max_length_string(nIndex);
435
 
436
	for (i = 1; i <= anz; i++)
437
	{
438
		if (nIndex[i])
439
			send_command dvTPs[i],"pop,sPg";
440
	}
441
}
442
 
23 andreas 443
define_function clearAllLogos()
444
{
445
	send_command dvTPs,"'^SHO-',itoa(BTN_LINE1_PIC),'.',itoa(BTN_LINE1_PIC+MAX_LINES-1),',0'";
446
}
447
 
448
define_function clearLogo(integer pos)
449
{
450
	if (!pos || pos > MAX_LINES)
451
		return;
452
 
453
	send_command dvTPs,"'^SHO-',itoa(BTN_LINE1_PIC+pos-1),',0'";
454
}
455
 
456
define_function setLogo(char sFile[], integer pos)
457
{
458
stack_var char sHost[64];
459
stack_var char sPath[512];
460
stack_var integer i;
461
 
462
	if (pos > MAX_LINES)
463
		return;
464
 
465
	sHost = IP;
25 andreas 466
	sPath = path;
30 andreas 467
	send_command dvTPs,"'^SHO-',itoa(PIC_BASE+pos),',1'";
23 andreas 468
 
469
	if (!length_string(sFile))
470
	{
30 andreas 471
		if (nPage && pos && nPage != TOK_QUEUE)
472
			send_command dvTPs,"'^BBR-',itoa(PIC_BASE+pos),',0,',sIconsMusic[nPage]";
473
		else if (nPage && pos)
474
			send_command dvTPs,"'^BBR-',itoa(PIC_BASE+pos),',0,',sIconsMusic[1]";
475
		else
476
			send_command dvTPs,"'^BBR-',itoa(PIC_COVER),',0,',sIconsMusic[1]";
23 andreas 477
 
478
		return;
479
	}
480
 
481
	if (pos && pos <= MAX_LINES)
482
	{
30 andreas 483
		send_command dvTPs,"'^RMF-XBMC_Audio',itoa(pos),',%H',sHost,'%A',sPath,'%F',sFile";
484
		send_command dvTPs,"'^BBR-',itoa(PIC_BASE+pos),',0,XBMC_Audio',itoa(pos)";
23 andreas 485
	}
486
	else
487
	{
30 andreas 488
		send_command dvTPs,"'^RMF-XBMC_AudioCover,%H',sHost,'%A',sPath,'%F',sFile";
489
		send_command dvTPs,"'^BBR-',itoa(PIC_COVER),',0,XBMC_AudioCover'";
23 andreas 490
	}
491
}
492
 
493
define_function clearPage()
494
{
495
	clearAllLogos();
25 andreas 496
	send_command dvTPs,"'^TXT-',itoa(BTN_LINE1_LINE),'.',itoa(BTN_LINE1_LINE+MAX_LINES-1),',0,'";
23 andreas 497
}
498
 
499
define_function char[32] requestActualPage()
500
{
28 andreas 501
	return requestPage(nPage);
502
}
503
 
504
define_function char[32] requestPage(integer pg)
505
{
23 andreas 506
stack_var char sPage[32];
507
 
508
	sPage = '';
509
 
28 andreas 510
	if (pg == TOK_NONE)
23 andreas 511
		return sPage;
512
 
28 andreas 513
	switch(pg)
23 andreas 514
	{
515
		case TOK_TITLE:		sPage = TOK_TXT_TITLE;
516
		case TOK_ALBUM:		sPage = TOK_TXT_ALBUM;
517
		case TOK_ARTIST:	sPage = TOK_TXT_ARTIST;
518
		case TOK_GENRE:		sPage = TOK_TXT_GENRE;
519
		case TOK_QUEUE:		sPage = TOK_TXT_QUEUE;
520
		case TOK_PLAYLIST:	sPage = TOK_TXT_PLAYLIST;
26 andreas 521
		case TOK_SEARCH:	sPage = TOK_TXT_SEARCH;
23 andreas 522
	}
523
 
524
	return sPage;
525
}
526
 
26 andreas 527
define_function char[32] requestTitle(integer tok)
528
{
529
stack_var char sPage[32];
530
 
531
	sPage = '';
532
 
533
	switch(nPage)
534
	{
535
		case TOK_NONE:		sPage = 'No list';
536
		case TOK_TITLE:		sPage = 'Title list';
537
		case TOK_ALBUM:		sPage = 'Album list';
538
		case TOK_ARTIST:	sPage = 'Artist list';
539
		case TOK_GENRE:		sPage = 'Genre list';
540
		case TOK_QUEUE:		sPage = 'Queue';
541
		case TOK_PLAYLIST:	sPage = 'Playlists';
542
		case TOK_SEARCH:	sPage = "'Search for ',sSearchFor";
543
	}
544
 
545
	return sPage;
546
}
547
 
24 andreas 548
define_function char[256] getPageLine(integer line)
549
{
550
	if (!line || line > MAX_LINES)
551
		return '';
552
 
553
	switch(nPage)
554
	{
555
		case TOK_TITLE:		return stSong[line].sTitle;
556
		case TOK_ARTIST:	return stSong[line].sArtist;
557
		case TOK_ALBUM:		return stSong[line].sAlbum;
558
		case TOK_GENRE:		return stSong[line].sGenre;
559
	}
560
 
561
	return '';
562
}
563
 
26 andreas 564
define_function setPageLine(integer line, char str[])
565
{
566
	if (!line || line > MAX_LINES)
567
		return;
568
 
569
	switch(nPage)
570
	{
571
		case TOK_TITLE:		stSong[line].sTitle = str;
572
		case TOK_ARTIST:	stSong[line].sArtist = str;
573
		case TOK_ALBUM:		stSong[line].sAlbum = str;
574
		case TOK_GENRE:		stSong[line].sGenre = str;
575
	}
576
}
577
 
578
define_function clearPageLine(integer line)
579
{
580
	if (!line || line > MAX_LINES)
581
		return;
582
 
583
	stSong[line].nID = 0;
584
	stSong[line].sTitle = '';
585
	stSong[line].sArtist = '';
586
	stSong[line].sAlbum = '';
587
	stSong[line].sGenre = '';
588
	stSong[line].sCover = '';
589
}
590
 
23 andreas 591
define_function integer setActualPage(char pg[])
592
{
593
	nPage = TOK_NONE;
594
 
595
	select
596
	{
597
		active (pg == TOK_TXT_TITLE):		nPage = TOK_TITLE;
598
		active (pg == TOK_TXT_ARTIST):		nPage = TOK_ARTIST;
599
		active (pg == TOK_TXT_ALBUM):		nPage = TOK_ALBUM;
600
		active (pg == TOK_TXT_GENRE):		nPage = TOK_GENRE;
601
		active (pg == TOK_TXT_QUEUE):		nPage = TOK_QUEUE;
602
		active (pg == TOK_TXT_PLAYLIST):	nPage = TOK_PLAYLIST;
26 andreas 603
		active (pg == TOK_TXT_SEARCH):		nPage = TOK_SEARCH;
23 andreas 604
	}
605
 
606
	switch(nPage)
607
	{
608
		case TOK_TITLE:
609
		case TOK_ALBUM:
610
		case TOK_ARTIST:
611
		case TOK_GENRE:
612
		case TOK_PLAYLIST:
26 andreas 613
		case TOK_SEARCH:
614
			setPopup(DIR_OPEN, sPopupAudio);
23 andreas 615
		break;
616
 
617
		case TOK_QUEUE:
26 andreas 618
			setPopup(DIR_OPEN, sPopupList);
23 andreas 619
		break;
620
	}
621
 
24 andreas 622
	switch(nPage)
623
	{
624
		case TOK_TITLE:		send_command dvTPs, "'^TXT-',itoa(TEXT_TITLE),',0,Titles'";
625
		case TOK_ARTIST:	send_command dvTPs, "'^TXT-',itoa(TEXT_TITLE),',0,Artists'";
626
		case TOK_ALBUM:		send_command dvTPs, "'^TXT-',itoa(TEXT_TITLE),',0,Albums'";
627
		case TOK_GENRE:		send_command dvTPs, "'^TXT-',itoa(TEXT_TITLE),',0,Genres'";
628
		case TOK_QUEUE:		send_command dvTPs, "'^TXT-',itoa(TEXT_TITLE),',0,Queue'";
629
		case TOK_PLAYLIST:	send_command dvTPs, "'^TXT-',itoa(TEXT_TITLE),',0,Playlist'";
26 andreas 630
		case TOK_SEARCH:	send_command dvTPs, "'^TXT-',itoa(TEXT_TITLE),',0,Search for ',sSearchFor";
24 andreas 631
	}
632
 
23 andreas 633
	return nPage;
634
}
635
 
24 andreas 636
define_function displayPageInfo(integer st, integer tot)
637
{
638
stack_var integer bis;
639
 
640
	if (st)
641
	{
642
		bis = st + MAX_LINES - 1;
643
		send_command dvTPs, "'^TXT-',itoa(TEXT_PROGRES),',0,',itoa(st),' to ',itoa(bis),' of ',itoa(tot)";
644
	}
645
	else
646
		send_command dvTPs, "'^TXT-',itoa(TEXT_PROGRES),',0,'";
25 andreas 647
 
648
	// Scrollbar initialisieren
649
	if (tot && st <= tot)
650
		bis = type_cast(100.0 / tot * st);
651
	else
652
		bis = 0;
653
 
654
	send_level dvTPs, LVL_SCROLLBAR, bis;
24 andreas 655
}
656
 
23 andreas 657
define_function displaySong(integer idx)
658
{
659
	if (!idx || idx > MAX_LINES)
660
		return;
661
 
25 andreas 662
	send_command dvTPs, "'^TXT-',itoa(BTN_LINE1_LINE+idx-1),',0,',stSong[idx].sTitle,$0d,$0a,stSong[idx].sArtist";
23 andreas 663
}
664
 
24 andreas 665
define_function askMenuList()
666
{
667
	switch(nPage)
668
	{
669
		case TOK_TITLE:
670
		case TOK_ARTIST:
671
		case TOK_ALBUM:
672
		case TOK_GENRE:
26 andreas 673
			setPopup(DIR_OPEN, sPopupMenu);
24 andreas 674
			send_command dvTPs, "'^TXT-',itoa(BTN_MENU1),'.',itoa(BTN_MENU1+MAX_LINES-1),',0,'";	// Clear all lines
675
			send_command dvTPs, "'^TXT-',itoa(BTN_MENU1),',0,Move to queue and play'";
676
			send_command dvTPs, "'^TXT-',itoa(BTN_MENU2),',0,Add to queue'";
29 andreas 677
 
30 andreas 678
			if (nPage != TOK_TITLE && !nFolder)
29 andreas 679
				send_command dvTPs, "'^TXT-',itoa(BTN_MENU3),',0,Open folder'";
24 andreas 680
		break;
681
 
682
		case TOK_PLAYLIST:
26 andreas 683
			setPopup(DIR_OPEN, sPopupMenu);
24 andreas 684
			send_command dvTPs, "'^TXT-',itoa(BTN_MENU1),'.',itoa(BTN_MENU1+MAX_LINES-1),',0,'";	// Clear all lines
685
			send_command dvTPs, "'^TXT-',itoa(BTN_MENU1),',0,Move to queue and play'";
686
			send_command dvTPs, "'^TXT-',itoa(BTN_MENU2),',0,Add to queue'";
26 andreas 687
 
688
			if (!nFolder)
29 andreas 689
			{
26 andreas 690
				send_command dvTPs, "'^TXT-',itoa(BTN_MENU3),',0,Show content'";
29 andreas 691
				send_command dvTPs, "'^TXT-',itoa(BTN_MENU4),',0,Delete playlist'";
692
			}
26 andreas 693
			else
29 andreas 694
				send_command dvTPs, "'^TXT-',itoa(BTN_MENU3),',0,Delete entry'";
24 andreas 695
		break;
696
 
697
		case TOK_QUEUE:
26 andreas 698
			setPopup(DIR_OPEN, sPopupMenu);
24 andreas 699
			send_command dvTPs, "'^TXT-',itoa(BTN_MENU1),'.',itoa(BTN_MENU1+MAX_LINES-1),',0,'";	// Clear all lines
700
			send_command dvTPs, "'^TXT-',itoa(BTN_MENU1),',0,Play this now'";
701
			send_command dvTPs, "'^TXT-',itoa(BTN_MENU2),',0,Save this to a playlist'";
702
			send_command dvTPs, "'^TXT-',itoa(BTN_MENU3),',0,Delete from queue'";
703
		break;
26 andreas 704
 
705
		case TOK_SEARCH:
706
			setPopup(DIR_OPEN, sPopupMenu);
707
			send_command dvTPs, "'^TXT-',itoa(BTN_MENU1),'.',itoa(BTN_MENU1+MAX_LINES-1),',0,'";	// Clear all lines
708
			send_command dvTPs, "'^TXT-',itoa(BTN_MENU1),',0,Move to queue and play'";
709
			send_command dvTPs, "'^TXT-',itoa(BTN_MENU2),',0,Add to queue'";
710
		break;
24 andreas 711
	}
712
 
713
	switch(nPage)
714
	{
715
		case TOK_TITLE:		send_command dvTPs, "'^TXT-',itoa(TEXT_MENU_TITLE),',0,Title menu'";
716
		case TOK_ARTIST:	send_command dvTPs, "'^TXT-',itoa(TEXT_MENU_TITLE),',0,Artist menu'";
717
		case TOK_ALBUM:		send_command dvTPs, "'^TXT-',itoa(TEXT_MENU_TITLE),',0,Album menu'";
718
		case TOK_GENRE:		send_command dvTPs, "'^TXT-',itoa(TEXT_MENU_TITLE),',0,Genre menu'";
719
		case TOK_QUEUE:		send_command dvTPs, "'^TXT-',itoa(TEXT_MENU_TITLE),',0,Queue menu'";
720
		case TOK_PLAYLIST:	send_command dvTPs, "'^TXT-',itoa(TEXT_MENU_TITLE),',0,Playlist menu'";
26 andreas 721
		case TOK_SEARCH:	send_command dvTPs, "'^TXT-',itoa(TEXT_MENU_TITLE),',0,Search menu'";
24 andreas 722
	}
723
}
724
 
29 andreas 725
define_function lineSelect(integer pl)
726
{
727
	nLastPressedLine = pl;
728
	askMenuList();
729
}
730
 
23 andreas 731
DEFINE_START
732
	nStart = 1;
733
	nPage = TOK_NONE;
734
 
735
DEFINE_EVENT
736
	data_event[dvTPs]
737
	{
24 andreas 738
		/*
739
		 * Whenever a panel comes online, it'll be initialized. The actual
740
		 * popup is shown and the pressed (or not pressed) button stated
741
		 * are set.
742
		 */
23 andreas 743
		online:
744
		{
745
			stack_var integer pan;
746
 
747
			pan = get_last(dvTPs);
748
 
749
			switch(nPage)
750
			{
751
				case TOK_TITLE:
25 andreas 752
				case TOK_PLAYLIST:
753
					send_command dvTPs[pan], "'@PPN-',sPopupAudio";
754
					send_command vdvMDB, "'LIST:',requestActualPage(),':',itoa(nStart),':',itoa(MAX_LINES),';'";
755
				break;
756
 
23 andreas 757
				case TOK_ALBUM:
758
				case TOK_ARTIST:
759
				case TOK_GENRE:
760
					send_command dvTPs[pan], "'@PPN-',sPopupAudio";
25 andreas 761
					send_command vdvMDB, "'FOLDER:',requestActualPage(),':',itoa(nStart),':',itoa(MAX_LINES),';'";
23 andreas 762
				break;
763
 
764
				case TOK_QUEUE:
765
					send_command dvTPs[pan], "'@PPN-',sPopupList";
766
					send_command vdvMDB, "'LIST:',requestActualPage(),':',itoa(nStart),':',itoa(MAX_LINES),';'";
767
				break;
25 andreas 768
 
769
				default:
770
					send_command dvTPs[pan], "'@PPN-',sPopupAudio";
771
					nStart = 1;
772
					send_command vdvMDB, "'LIST:TITLE:',itoa(nStart),':',itoa(MAX_LINES),';'";
23 andreas 773
			}
774
		}
775
	}
776
 
24 andreas 777
	/*
778
	 * The navigation buttons are for setting the wanted views.
779
	 */
23 andreas 780
	button_event[dvTPs, nNavigation]
781
	{
782
		push:
783
		{
25 andreas 784
		stack_var integer pan;
785
 
786
			pan = get_last(dvTPs);
787
 
23 andreas 788
			switch(BUTTON.INPUT.CHANNEL)
789
			{
25 andreas 790
				case BTN_TITLE:		
791
					send_command vdvMDB, "'LIST:TITLE:1:',itoa(MAX_LINES),';'"; 
792
					nFolder = 0; 
793
					nStart = 1;
26 andreas 794
					nSearch = 0;
25 andreas 795
					nPage = TOK_TITLE;
796
				break;
797
 
798
				case BTN_ARTIST:	
799
					send_command vdvMDB, "'FOLDER:ARTIST:1:',itoa(MAX_LINES),';'"; 
800
					nFolder = 0; 
801
					nStart = 1;
26 andreas 802
					nSearch = 0;
25 andreas 803
					nPage = TOK_ARTIST;
804
				break;
805
 
806
				case BTN_ALBUM:		
807
					send_command vdvMDB, "'FOLDER:ALBUM:1:',itoa(MAX_LINES),';'"; 
808
					nFolder = 0; 
809
					nStart = 1;
26 andreas 810
					nSearch = 0;
25 andreas 811
					nPage = TOK_ALBUM;
812
				break;
813
 
814
				case BTN_GENRE:		
815
					send_command vdvMDB, "'FOLDER:GENRE:1:',itoa(MAX_LINES),';'"; 
816
					nFolder = 0; 
817
					nStart = 1;
26 andreas 818
					nSearch = 0;
25 andreas 819
					nPage = TOK_GENRE;
820
				break;
821
 
822
				case BTN_QUEUE: 
823
					send_command vdvMDB, "'LIST:QUEUE:1:',itoa(MAX_LINES),';'"; 
824
					nFolder = 0; 
825
					nStart = 1;
26 andreas 826
					nSearch = 0;
25 andreas 827
					nPage = TOK_QUEUE;
828
				break;
829
 
830
				case BTN_PLAYLIST:
28 andreas 831
					send_command dvTPs[pan], "'@PPN-',sPopupSelUser";
832
 
25 andreas 833
					if (!length_string(sActUser))
834
					{
835
						send_command dvTPs[pan], "'@AKB-',sActUser,';Enter name of user'";
836
						nKeyboard[pan] = TEXT_INPUT_UNAME;
837
					}
838
					else
839
					{
28 andreas 840
						send_command dvTPs[pan], "'@AKB-',sActPlaylist,';Enter name of playlist'";
841
						nKeyboard[pan] = TEXT_INPUT_PLAYLIST;
25 andreas 842
					}
28 andreas 843
 
844
					nToDo = TODO_USER_SELECT;
25 andreas 845
				break;
846
 
847
				case BTN_NOW_PLAYING:
848
					if (nPlayStatus == PLAYER_PLAY || nPlayStatus == PLAYER_PAUSE)
26 andreas 849
						setPopup(DIR_OPEN, sPopupDetail);
25 andreas 850
				break;
851
 
852
				case BTN_SAVE:
853
					send_command dvTPs[pan], "'@PPN-',sPopupSelUser";
854
					sInputUser = sActUser;
855
					sInputPlaylist = '';
856
					send_command dvTPs[pan], "'^TXT-',itoa(TEXT_INPUT_UNAME),',0,',sActUser";
29 andreas 857
					send_command dvTPs[pan], "'^TXT-',itoa(TEXT_INPUT_PLAYLIST),',0,'";
25 andreas 858
					send_command dvTPs[pan], "'@AKB-',sActPlaylist,';Enter name of playlist'";
859
					nToDo = TODO_USER_SAVE_PLAYLIST;
860
					nKeyboard[pan] = TEXT_INPUT_PLAYLIST;
861
				break;
862
 
863
				case BTN_DELETE:
864
					send_command vdvMDB, "'DELETE:QUEUE:-1;'";
29 andreas 865
					nStart = 1;
866
					send_command vdvMDB, "'LIST:QUEUE:',itoa(nStart),':',itoa(MAX_LINES),';'";
25 andreas 867
				break;
26 andreas 868
 
869
				case BTN_SEARCH:
28 andreas 870
					if (!nSearch)
871
					{
872
						send_command dvTPs[pan], "'@AKB-;Search for a ',requestActualPage()";
873
						nToDo = TODO_SEARCH;
874
						nKeyboard[pan] = TEXT_INPUT_SEARCH;
875
					}
26 andreas 876
				break;
28 andreas 877
 
878
				case BTN_RESET:
879
					send_command vdvMDB, 'RESET;';
880
				break;
23 andreas 881
			}
882
		}
883
	}
884
 
24 andreas 885
	/*
886
	 * This buttons control mostly the player. With them you can play, stop
887
	 * pause, etc. the player and scroll through lists.
888
	 * Common to this buttons is, that they conform to the AMX SNAPI standard.
889
	 * All of them are declared in the file "mSNAPI.axi".
890
	 */
23 andreas 891
	button_event[dvTPs, nBtns]
892
	{
893
		push:
894
		{
895
			switch(BUTTON.INPUT.CHANNEL)
896
			{
897
				case PLAY:			send_command vdvMDB, 'PLAY;';
25 andreas 898
				case PAUSE:			send_command vdvMDB, 'PLAYPAUSE;';
23 andreas 899
				case STOP:			send_command vdvMDB, 'STOP;';
900
				case FFWD:			send_command vdvMDB, 'FORWARD;';
901
				case REW:			send_command vdvMDB, 'REWIND;';
902
				case SREV:			send_command vdvMDB, 'SKIPREW;';
903
				case SFWD:			send_command vdvMDB, 'SKIPFWD;';
904
				case MEDIA_RANDOM:	send_command vdvMDB, 'RANDOM;';
905
				case MEDIA_REPEAT:	send_command vdvMDB, 'REPEAT;';
906
 
25 andreas 907
				case MENU_THUMBS_UP:
23 andreas 908
					if (nStart > MAX_LINES)
909
					{
910
						nStart = nStart - MAX_LINES;
25 andreas 911
 
29 andreas 912
						if (nPage == TOK_TITLE || nPage == TOK_QUEUE)
25 andreas 913
							send_command vdvMDB, "'LIST:',requestActualPage(),':',itoa(nStart),':',itoa(MAX_LINES),';'";
28 andreas 914
						else if (nPage == TOK_SEARCH)
915
							send_command vdvMDB, "'SEARCH:',requestPage(nOldPage),':',EncodeURL(sSearchFor),':',itoa(nStart),':',itoa(MAX_LINES),';'";
29 andreas 916
						else if (nPage == TOK_PLAYLIST)
917
						{
918
							if (!nFolder)
919
								send_command vdvMDB, "'LIST:',requestActualPage(),':',itoa(nStart),':',itoa(MAX_LINES),';'";
920
							else
921
								send_command vdvMDB, "'PLIST:',EncodeURL(sActUser),':',EncodeURL(sActPlaylist),':',itoa(nStart),':',itoa(MAX_LINES),';'";
922
						}
25 andreas 923
						else
29 andreas 924
						{
925
							if (!nFolder)
926
								send_command vdvMDB, "'FOLDER:',requestActualPage(),':',itoa(nStart),':',itoa(MAX_LINES),';'";
927
							else
928
								send_command vdvMDB, "'LISTFOLDER:',requestActualPage(),':',EncodeURL(sActFolder),':',itoa(nStart),':',itoa(MAX_LINES),';'";
929
						}
23 andreas 930
					}
931
				break;
932
 
25 andreas 933
				case MENU_THUMBS_DN:
23 andreas 934
					if (nTotal && (nStart+MAX_LINES) <= nTotal)
935
					{
936
						nStart = nStart + MAX_LINES;
25 andreas 937
 
29 andreas 938
						if (nPage == TOK_TITLE || nPage == TOK_QUEUE)
25 andreas 939
							send_command vdvMDB, "'LIST:',requestActualPage(),':',itoa(nStart),':',itoa(MAX_LINES),';'";
28 andreas 940
						else if (nPage == TOK_SEARCH)
941
							send_command vdvMDB, "'SEARCH:',requestPage(nOldPage),':',EncodeURL(sSearchFor),':',itoa(nStart),':',itoa(MAX_LINES),';'";
29 andreas 942
						else if (nPage == TOK_PLAYLIST)
943
						{
944
							if (!nFolder)
945
								send_command vdvMDB, "'LIST:',requestActualPage(),':',itoa(nStart),':',itoa(MAX_LINES),';'";
946
							else
947
								send_command vdvMDB, "'PLIST:',EncodeURL(sActUser),':',EncodeURL(sActPlaylist),':',itoa(nStart),':',itoa(MAX_LINES),';'";
948
						}
25 andreas 949
						else
29 andreas 950
						{
951
							if (!nFolder)
952
								send_command vdvMDB, "'FOLDER:',requestActualPage(),':',itoa(nStart),':',itoa(MAX_LINES),';'";
953
							else
954
								send_command vdvMDB, "'LISTFOLDER:',requestActualPage(),':',EncodeURL(sActFolder),':',itoa(nStart),':',itoa(MAX_LINES),';'";
955
						}
23 andreas 956
					}
957
				break;
24 andreas 958
 
959
				case MENU_BACK:
25 andreas 960
				case BTN_RETURN:
24 andreas 961
					if (nFolder)
25 andreas 962
					{
963
						nStart = nOldStart;
964
						nFolder = 0;
965
					}
26 andreas 966
					else if (nSearch)
967
					{
968
						nStart = nOldStart;
969
						nPage = nOldPage;
970
						nSearch = 0;
971
					}
25 andreas 972
 
973
					if (nPage == TOK_TITLE || nPage == TOK_QUEUE || nPage == TOK_PLAYLIST)
24 andreas 974
						send_command vdvMDB, "'LIST:',requestActualPage(),':',itoa(nStart),':',itoa(MAX_LINES),';'";
25 andreas 975
					else
976
						send_command vdvMDB, "'FOLDER:',requestActualPage(),':',itoa(nStart),':',itoa(MAX_LINES),';'";
24 andreas 977
				break;
23 andreas 978
			}
979
		}
24 andreas 980
 
981
		hold[2,repeat]:
982
		{
983
			switch(BUTTON.INPUT.CHANNEL)
984
			{
985
				case FFWD:			send_command vdvMDB, 'FORWARD;';
986
				case REW:			send_command vdvMDB, 'REWIND;';
987
			}
988
		}
23 andreas 989
	}
990
 
24 andreas 991
	button_event[dvTPs,nLines]
992
	{
993
		push:
994
		{
995
			switch(BUTTON.INPUT.CHANNEL)
996
			{
997
				case BTN_LINE1_PIC:
998
				case BTN_LINE1_LINE:
29 andreas 999
					lineSelect(1);
24 andreas 1000
				break;
1001
 
1002
				case BTN_LINE2_PIC:
1003
				case BTN_LINE2_LINE:
29 andreas 1004
					lineSelect(2);
24 andreas 1005
				break;
1006
 
1007
				case BTN_LINE3_PIC:
1008
				case BTN_LINE3_LINE:
29 andreas 1009
					lineSelect(3);
24 andreas 1010
				break;
1011
 
1012
				case BTN_LINE4_PIC:
1013
				case BTN_LINE4_LINE:
29 andreas 1014
					lineSelect(4);
24 andreas 1015
				break;
1016
 
1017
				case BTN_LINE5_PIC:
1018
				case BTN_LINE5_LINE:
29 andreas 1019
					lineSelect(5);
24 andreas 1020
				break;
1021
 
1022
				case BTN_LINE6_PIC:
1023
				case BTN_LINE6_LINE:
29 andreas 1024
					lineSelect(6);
24 andreas 1025
				break;
1026
 
1027
				case BTN_LINE7_PIC:
1028
				case BTN_LINE7_LINE:
29 andreas 1029
					lineSelect(7);
24 andreas 1030
				break;
1031
 
1032
				case BTN_LINE8_PIC:
1033
				case BTN_LINE8_LINE:
29 andreas 1034
					lineSelect(8);
24 andreas 1035
				break;
1036
 
1037
				case BTN_LINE9_PIC:
1038
				case BTN_LINE9_LINE:
29 andreas 1039
					lineSelect(9);
24 andreas 1040
				break;
1041
 
1042
				case BTN_LINE10_PIC:
1043
				case BTN_LINE10_LINE:
29 andreas 1044
					lineSelect(10);
24 andreas 1045
				break;
1046
			}
1047
		}
1048
	}
1049
 
1050
	button_event[dvTPs,nMenu]
1051
	{
1052
		push:
1053
		{
1054
		stack_var integer pan;
1055
 
1056
			pan = get_last(dvTPs);
1057
 
1058
			switch(BUTTON.INPUT.CHANNEL)
1059
			{
1060
				case BTN_MENU1:
1061
					if (nPage != TOK_PLAYLIST && nPage != TOK_QUEUE)	// Move to queue and play
1062
					{
1063
						if (nPlayStatus == PLAYER_PLAY || nPlayStatus == PLAYER_PAUSE)
1064
							send_command vdvMDB, 'STOP;';
1065
 
1066
						send_command vdvMDB, 'DELETE:QUEUE:-1;';
25 andreas 1067
 
26 andreas 1068
						if (nPage == TOK_TITLE || nPage == TOK_SEARCH)
25 andreas 1069
							send_command vdvMDB, "'PLAY:ID:',itoa(stSong[nLastPressedLine].nID),';'";
1070
						else
1071
							send_command vdvMDB, "'PLAY:',requestActualPage(),':',stSong[nLastPressedLine].sTitle,';'";
24 andreas 1072
					}
1073
					else if (nPage == TOK_PLAYLIST)
1074
					{
1075
						if (length_string(sActUser) && length_string(sActPlaylist))
1076
						{
1077
							if (nPlayStatus == PLAYER_PLAY || nPlayStatus == PLAYER_PAUSE)
1078
								send_command vdvMDB, 'STOP;';
1079
 
1080
							send_command vdvMDB, 'DELETE:QUEUE:-1;';
1081
							send_command vdvMDB, "'PLAY:PLAYLIST:',EncodeURL(sActPlaylist),';'";
1082
						}
1083
					}
1084
					else if (nPage == TOK_QUEUE)
1085
						send_command vdvMDB, "'PLAY:QUEUE:',itoa(nStart+nLastPressedLine-1),';'";
1086
				break;
1087
 
1088
				case BTN_MENU2:
1089
					if (nPage != TOK_PLAYLIST && nPage != TOK_QUEUE)	// Add to queue
25 andreas 1090
					{
26 andreas 1091
						if (nPage == TOK_TITLE || nPage == TOK_SEARCH)
25 andreas 1092
							send_command vdvMDB, "'ADD:ID:',itoa(stSong[nLastPressedLine].nID),';'";
1093
						else
1094
							send_command vdvMDB, "'ADD:',requestActualPage(),':',stSong[nLastPressedLine].sTitle,';'";
1095
					}
24 andreas 1096
					else if (nPage == TOK_PLAYLIST)
1097
						send_command vdvMDB, "'ADD:PLAYLIST:',EncodeURL(sActPlaylist),';'";
1098
					else if (nPage == TOK_QUEUE)
1099
					{
26 andreas 1100
						setPopup(DIR_OPEN, sPopupSelUser);
25 andreas 1101
						sInputUser = sActUser;
1102
						sInputPlaylist = '';
24 andreas 1103
						send_command dvTPs[pan], "'^TXT-',itoa(TEXT_INPUT_UNAME),',0,',sActUser";
1104
						send_command dvTPs[pan], "'@AKB-',sActPlaylist,';Enter name of playlist'";
25 andreas 1105
						nToDo = TODO_USER_PLAYLIST_QUEUE;
24 andreas 1106
						nKeyboard[pan] = TEXT_INPUT_PLAYLIST;
1107
					}
1108
				break;
1109
 
1110
				case BTN_MENU3:
29 andreas 1111
					if (nPage != TOK_TITLE && nPage != TOK_PLAYLIST && nPage != TOK_QUEUE && nPage != TOK_SEARCH)	// Open folder
24 andreas 1112
					{
25 andreas 1113
						sActFolder = stSong[nLastPressedLine].sTitle;	// Get name of folder
1114
						nFolder = true;									// Set marker for folder
1115
						nOldStart = nStart;								// Save current position
1116
						nStart = 1;										// Reset start position
1117
						send_command vdvMDB, "'LISTFOLDER:',requestActualPage(),':',stSong[nLastPressedLine].sTitle,':1:',itoa(MAX_LINES),';'";
24 andreas 1118
					}
1119
					else if (nPage == TOK_PLAYLIST)
1120
					{
29 andreas 1121
						if (!nFolder)
1122
						{
1123
							sActUser = sInputUser;
1124
							sActPlaylist = stSong[nLastPressedLine].sTitle;
1125
							nOldStart = nStart;
1126
							nFolder = 1;
1127
							nStart = 1;
1128
							send_command vdvMDB, "'PLIST:',EncodeURL(sActUser),':',EncodeURL(stSong[nLastPressedLine].sTitle),':',itoa(nStart),':',itoa(MAX_LINES),';'";
1129
						}
1130
						else		// Delete entry
1131
						{
1132
							send_command vdvMDB, "'DELETE:PTITLE:',itoa(stSong[nLastPressedLine].nID),';'";
1133
							nStart = 1;
1134
							send_command vdvMDB, "'PLIST:',EncodeURL(sActUser),':',EncodeURL(stSong[nLastPressedLine].sTitle),':',itoa(nStart),':',itoa(MAX_LINES),';'";
1135
						}
24 andreas 1136
					}
1137
					else if (nPage == TOK_QUEUE)
29 andreas 1138
					{
24 andreas 1139
						send_command vdvMDB, "'DELETE:QUEUE:',itoa(stSong[nLastPressedLine].nID),';'";
29 andreas 1140
						nStart = 1;
1141
						send_command vdvMDB, "'LIST:QUEUE:',itoa(nStart),':',itoa(MAX_LINES),';'";
1142
					}
24 andreas 1143
				break;
29 andreas 1144
 
1145
				case BTN_MENU4:
1146
					if (nPage == TOK_PLAYLIST && !nFolder)
1147
					{
1148
						send_command vdvMDB, "'DELETE:PLAYLIST:',itoa(stSong[nLastPressedLine].nID),';'";
1149
						nStart = 1;
1150
						send_command vdvMDB, "'LIST:PLAYLIST:',itoa(nStart),':',itoa(MAX_LINES),';'";
1151
					}
1152
				break;
24 andreas 1153
			}
25 andreas 1154
 
1155
			if (nPage != TOK_QUEUE)
26 andreas 1156
				setPopup(DIR_OPEN, sPopupAudio);
25 andreas 1157
			else
26 andreas 1158
				setPopup(DIR_OPEN, sPopupList);
24 andreas 1159
		}
1160
	}
1161
 
25 andreas 1162
	button_event[dvTPs,nBtnUser]
24 andreas 1163
	{
1164
		push:
1165
		{
1166
			stack_var integer pan;
1167
 
1168
			pan = get_last(dvTPs);
1169
 
25 andreas 1170
			switch(BUTTON.INPUT.CHANNEL)
24 andreas 1171
			{
25 andreas 1172
				case TEXT_INPUT_UNAME:
1173
					if (!nKeyboard[pan])
1174
					{
1175
						nKeyboard[pan] = TEXT_INPUT_UNAME;
1176
						send_command dvTPs[pan],"'@AKB-',sActUser,';Enter user name'";
1177
					}
1178
				break;
24 andreas 1179
 
25 andreas 1180
				case TEXT_INPUT_PLAYLIST:
1181
					if (!nKeyboard[pan])
1182
					{
1183
						nKeyboard[pan] = TEXT_INPUT_PLAYLIST;
1184
						send_command dvTPs[pan],"'@AKB-',sActPlaylist,';Enter name of playlist'";
1185
					}
1186
				break;
24 andreas 1187
 
25 andreas 1188
				case BTN_USER_OK:
1189
					send_command dvTPs[pan],"'@PPF-',sPopupSelUser";
24 andreas 1190
 
25 andreas 1191
					switch(nToDo)
1192
					{
1193
						case TODO_USER_SELECT:
1194
							sActUser = sInputUser;
1195
							send_command vdvMDB, "'USER:',EncodeURL(sInputUser),':;'";
29 andreas 1196
							nStart = 1;
1197
							nPage = TOK_PLAYLIST;
1198
							nFolder = 0;
1199
							nSearch = 0;
1200
							send_command vdvMDB, "'LIST:PLAYLIST:',itoa(nStart),':',itoa(MAX_LINES),';'";
25 andreas 1201
						break;
1202
 
1203
						case TODO_USER_LIST_PLAYLIST:
1204
							sActPlaylist = sInputPlaylist;
1205
							nOldStart = nStart;
1206
							nFolder = 1;
1207
							nStart = 1;
1208
							send_command vdvMDB, "'PLIST:',EncodeURL(sActUser),':',EncodeURL(stSong[nLastPressedLine].sTitle),':',itoa(nStart),':',itoa(MAX_LINES),';'";
1209
						break;
1210
 
1211
						case TODO_USER_SAVE_PLAYLIST:
1212
							sActUser = sInputUser;
1213
							sActPlaylist = sInputPlaylist;
1214
 
1215
							if (length_string(sActUser) && length_string(sActPlaylist))
1216
								send_command vdvMDB, "'SAVEQUEUE:',EncodeURL(sActUser),':',EncodeURL(sActPlaylist),';'";
1217
						break;
1218
 
1219
						case TODO_USER_PLAYLIST_QUEUE:
1220
							sActUser = sInputUser;
29 andreas 1221
							sActPlaylist = stSong[nLastPressedLine].sTitle;
25 andreas 1222
 
1223
							if (length_string(sActUser) && length_string(sActPlaylist))
29 andreas 1224
								send_command vdvMDB, "'ADD:PLAYLIST:',EncodeURL(stSong[nLastPressedLine].sTitle),';'";
25 andreas 1225
						break;
1226
					}
1227
 
1228
					nToDo = 0;
1229
				break;
1230
 
1231
				case BTN_USER_CANCEL:
1232
					nToDo = 0;
1233
					send_command dvTPs[pan],"'@PPF-',sPopupSelUser";
1234
				break;
1235
 
1236
				case BTN_DETAIL_BACK:
1237
					if (nPage == TOK_QUEUE)
26 andreas 1238
						setPopup(DIR_OPEN, sPopupAudio);
25 andreas 1239
					else
26 andreas 1240
						setPopup(DIR_OPEN, sPopupList);
25 andreas 1241
				break;
24 andreas 1242
			}
1243
		}
1244
	}
1245
 
1246
	/*
1247
	 * This event catches everything comming from the COMM - module. Here the
1248
	 * AMX part of the COMM - module only makes a network connection to the
1249
	 * player. The API of the player is made to replace a heavy AMX COMM -
1250
	 * module. Everything normally is done inside an AMX COMM - module, is
1251
	 * done by the player itself, running on a Linux platform. This makes the
1252
	 * communication with it fairly easy.
1253
	 */
23 andreas 1254
	data_event[vdvMDB]
1255
	{
1256
		string:
1257
		{
1258
			stack_var char buf[8192];
1259
 
1260
			while (find_string(DATA.TEXT, ';', 1))
1261
			{
1262
				buf = remove_string(DATA.TEXT, ';', 1);
1263
				set_length_string(buf, length_string(buf) - 1);
1264
 
1265
				select
1266
				{
24 andreas 1267
					/*
1268
					 * This is send by the player whenever the UI should
1269
					 * display a list with song details.
1270
					 * The correct popup must be displayed and the contents
1271
					 * should be filled with the data from the player.
1272
					 */
25 andreas 1273
					active(find_string(buf, 'LINE:', 1)):
23 andreas 1274
					{
1275
					stack_var char sPg[32];
1276
					stack_var integer nSongID;
1277
					stack_var integer nLine;
1278
					stack_var integer anz;
1279
					stack_var integer i;
1280
 
25 andreas 1281
						remove_string(buf, 'LINE:', 1);
23 andreas 1282
						anz = strtok(buf, ':');
25 andreas 1283
 
23 andreas 1284
						for (i = 1; i <= anz; i++)
1285
						{
1286
							switch (i)
1287
							{
1288
								case 1: sPg = getStrTok(i);
1289
								case 2: nSongID = atoi(getStrTok(i));
26 andreas 1290
 
1291
								case 3:
1292
									nLine = atoi(getStrTok(i));
1293
									clearPageLine(nLine);
1294
									stSong[nLine].nID = nSongID;
1295
								break;
1296
 
25 andreas 1297
								case 4: stSong[nLine].sTitle = DecodeURL(getStrTok(i));
1298
								case 5: stSong[nLine].sArtist = DecodeURL(getStrTok(i));
1299
								case 6: stSong[nLine].sAlbum = DecodeURL(getStrTok(i));
1300
								case 7: stSong[nLine].sGenre = DecodeURL(getStrTok(i));
1301
								case 8: stSong[nLine].sCover = DecodeURL(getStrTok(i));
23 andreas 1302
							}
1303
						}
1304
 
1305
						if (nLine == 1)
1306
						{
1307
							setActualPage(sPg);
1308
							clearPage();
1309
						}
1310
 
1311
						displaySong(nLine);
30 andreas 1312
						setLogo(stSong[nline].sCover, nLine);
23 andreas 1313
					}
1314
 
25 andreas 1315
					active(find_string(buf, 'FOLDER:', 1)):
1316
					{
1317
					stack_var char sPg[32];
1318
					stack_var integer nLine;
1319
					stack_var integer anz;
1320
					stack_var integer i;
1321
 
1322
						remove_string(buf, 'FOLDER:', 1);
1323
						anz = strtok(buf, ':');
1324
 
1325
						for (i = 1; i <= anz; i++)
1326
						{
1327
							switch(i)
1328
							{
1329
								case 1: sPg = getStrTok(i);
26 andreas 1330
 
1331
								case 2:
1332
									nLine = atoi(getStrTok(i));
1333
									clearPageLine(nLine);
1334
								break;
1335
 
25 andreas 1336
								case 3: stSong[nLine].sTitle = DecodeURL(getStrTok(i));
1337
								case 4: stSong[nLine].sCover = DecodeURL(getStrTok(i));
1338
							}
1339
						}
1340
 
1341
						stSong[nLine].nID = 0;
1342
						stSong[nLine].sAlbum = '';
1343
						stSong[nLine].sArtist = '';
1344
						stSong[nLine].sGenre = '';
1345
 
1346
						if (nLine == 1)
1347
						{
1348
							setActualPage(sPg);
1349
							clearPage();
1350
						}
1351
 
1352
						displaySong(nLine);
30 andreas 1353
						setLogo(stSong[nline].sCover, nLine);
25 andreas 1354
					}
1355
 
1356
					active(find_string(buf, 'PLAYLIST:', 1)):
1357
					{
1358
					stack_var integer nLine;
29 andreas 1359
					stack_var integer id;
25 andreas 1360
					stack_var integer anz;
1361
					stack_var integer i;
1362
 
1363
						remove_string(buf, 'PLAYLIST:', 1);
1364
						anz = strtok(buf, ':');
1365
 
1366
						for (i = 1; i <= anz; i++)
1367
						{
1368
							switch(i)
1369
							{
26 andreas 1370
								case 1: 
1371
									nLine = atoi(getStrTok(i));
1372
									clearPageLine(nLine);
1373
								break;
1374
 
29 andreas 1375
								case 2: stSong[nLine].nID = atoi(getStrTok(i));
1376
								case 3: sActUser = DecodeURL(getStrTok(i));
1377
								case 4: stSong[nLine].sTitle = DecodeURL(getStrTok(i));
25 andreas 1378
							}
1379
						}
1380
 
26 andreas 1381
						if (nLine == 1)
1382
						{
1383
							setActualPage(TOK_TXT_PLAYLIST);
1384
							clearPage();
1385
						}
25 andreas 1386
 
26 andreas 1387
						displaySong(nLine);
1388
					}
1389
 
1390
					// SEARCH:<type>:<id>:<line>:<title>:<artist>:<album>:<genre>;
1391
					active(find_string(buf, 'SEARCH:', 1)):
1392
					{
1393
					stack_var char sPg[32];
1394
					stack_var integer id;
1395
					stack_var integer nLine;
1396
					stack_var integer anz;
1397
					stack_var integer i;
1398
 
1399
						remove_string(buf, 'SEARCH:', 1);
1400
						anz = strtok(buf, ':');
1401
 
1402
						for (i = 1; i <= anz; i++)
1403
						{
1404
							switch(i)
1405
							{
1406
								case 1: sPg = getStrTok(i);
1407
								case 2: id = atoi(getStrTok(i));
1408
 
1409
								case 3:
1410
									nLine = atoi(getStrTok(i));
1411
									clearPageLine(nLine);
1412
									stSong[nLine].nID = id;
1413
								break;
1414
 
1415
								case 4: stSong[nLine].sTitle = DecodeURL(getStrTok(i));
1416
								case 5: stSong[nLine].sArtist = DecodeURL(getStrTok(i));
1417
								case 6: stSong[nLine].sAlbum = DecodeURL(getStrTok(i));
1418
								case 7: stSong[nLine].sGenre = DecodeURL(getStrTok(i));
1419
								case 8: stSong[nLine].sCover = DecodeURL(getStrTok(i));
1420
							}
1421
						}
1422
 
25 andreas 1423
						if (nLine == 1)
1424
						{
26 andreas 1425
							setActualPage(TOK_TXT_SEARCH);
25 andreas 1426
							clearPage();
1427
						}
1428
 
1429
						displaySong(nLine);
1430
					}
1431
 
1432
					active(find_string(buf, 'FOLDERNAME:', 1)):
1433
					{
1434
						remove_string(buf, 'FOLDERNAME:', 1);
1435
						sActFolder = buf;
1436
						nFolder = 1;
1437
					}
1438
 
24 andreas 1439
					active(find_string(buf, 'PLAYING:', 1)):
1440
					{
1441
					stack_var integer nSongID;
1442
					stack_var char sTitle[256];
1443
					stack_var char sArtist[256];
1444
					stack_var char sAlbum[256];
1445
					stack_var char sGenre[256];
1446
					stack_var char sCover[256];
1447
					stack_var integer anz;
1448
					stack_var integer i;
1449
 
1450
						remove_string(buf, 'PLAYING:', 1);
1451
						anz = strtok(buf, ':');
1452
 
1453
						for (i = 1; i <= anz; i++)
1454
						{
1455
							switch (i)
1456
							{
1457
								case 1: nSongID = atoi(getStrTok(i));
1458
								case 2: sTitle = DecodeURL(getStrTok(i));
1459
								case 3: sArtist = DecodeURL(getStrTok(i));
1460
								case 4: sAlbum = DecodeURL(getStrTok(i));
1461
								case 5: sGenre = DecodeURL(getStrTok(i));
1462
								case 6: sCover = DecodeURL(getStrTok(i));
1463
							}
1464
						}
1465
 
1466
						// Initialize detail fields
25 andreas 1467
						send_command dvTPs, "'^TXT-',itoa(TEXT_DETAIL_TITLE),',0,',sTitle";
1468
						send_command dvTPs, "'^TXT-',itoa(TEXT_DETAIL_ARTIST),',0,',sArtist";
1469
						send_command dvTPs, "'^TXT-',itoa(TEXT_DETAIL_ALBUM),',0,',sAlbum";
1470
						send_command dvTPs, "'^TXT-',itoa(TEXT_DETAIL_GENRE),',0,',sGenre";
24 andreas 1471
						setLogo(sCover, 0);
1472
					}
1473
 
28 andreas 1474
					active(find_string(buf, 'POSITION:', 1)):
1475
					{
1476
						stack_var char sTimeA[16];
1477
						stack_var char sTimeB[16];
1478
						stack_var char sTimeC[16];
1479
						stack_var integer anz;
1480
						stack_var integer i;
1481
 
1482
						remove_string(buf, 'POSITION:', 1);
1483
						anz = strtok(buf, ':');
1484
 
1485
						for (i = 1; i <= anz; i++)
1486
						{
1487
							switch(i)
1488
							{
1489
								case 1: sTimeA = DecodeURL(getStrTok(i));
1490
								case 2: sTimeB = DecodeURL(getStrTok(i));
1491
								case 3: sTimeC = DecodeURL(getStrTok(i));
1492
							}
1493
						}
1494
 
1495
						send_command dvTPs, "'^TXT-',itoa(TEXT_DETAIL_TIME_PROG),',0,',sTimeA";
1496
						send_command dvTPs, "'^TXT-',itoa(TEXT_DETAIL_TIME_TOTAL),',0,',sTimeC";
1497
						displayProgresBar(sTimeA, sTimeC);
1498
					}
1499
 
25 andreas 1500
					active(find_string(buf, 'USER:', 1)):
1501
					{
1502
						remove_string(buf, 'USER:', 1);
1503
						sActUser = DecodeURL(buf);
1504
					}
1505
 
23 andreas 1506
					active(find_string(buf, 'TOTAL:', 1)):
1507
					{
1508
						remove_string(buf, 'TOTAL:', 1);
1509
						nTotal = atoi(buf);
24 andreas 1510
						displayPageInfo(nStart, nTotal);
29 andreas 1511
 
1512
						if (nTotal == 0)
1513
							clearPage();
23 andreas 1514
					}
1515
 
1516
					active(find_string(buf, 'PAGE:', 1)):
1517
					{
1518
						remove_string(buf, 'PAGE:', 1);
1519
						setActualPage(buf);
24 andreas 1520
						displayPageInfo(nStart, nTotal);
23 andreas 1521
					}
24 andreas 1522
 
25 andreas 1523
					active(find_string(buf, 'PLAYER:', 1)):
24 andreas 1524
					{
1525
						remove_string(buf, 'PLAYER:', 1);
1526
 
1527
						if (buf == 'PLAY')
1528
						{
1529
							nPlayStatus = PLAYER_PLAY;
1530
							on[dvTPs,PLAY];
1531
							off[dvTPs,STOP];
1532
							off[dvTPs,PAUSE];
1533
						}
1534
						else if (buf == 'STOP')
1535
						{
1536
							nPlayStatus = PLAYER_STOP;
1537
							off[dvTPs,PLAY];
1538
							on[dvTPs,STOP];
1539
							off[dvTPs,PAUSE];
1540
						}
1541
						else if (buf == 'PAUSE')
1542
						{
1543
							nPlayStatus = PLAYER_PAUSE;
1544
							off[dvTPs,PLAY];
1545
							off[dvTPs,STOP];
1546
							on[dvTPs,PAUSE];
1547
						}
1548
						else
1549
						{
1550
							nPlayStatus = 0;
1551
							off[dvTPs,PLAY];
1552
							off[dvTPs,STOP];
1553
							off[dvTPs,PAUSE];
1554
						}
1555
					}
1556
 
25 andreas 1557
					active(find_string(buf, 'RANDOM:', 1)):
1558
					{
1559
						remove_string(buf, 'RANDOM:', 1);
1560
 
1561
						if (buf == 'TRUE')
1562
							nRandom = 1;
1563
						else
1564
							nRandom = 0;
1565
					}
1566
 
1567
					active(find_string(buf, 'REPEAT:', 1)):
1568
					{
1569
						remove_string(buf, 'REPEAT:', 1);
1570
 
1571
						if (buf == 'TRUE')
1572
							nRepeat = 1;
1573
						else
1574
							nRepeat = 0;
1575
					}
1576
 
1577
					active(find_string(buf, 'ERROR:PLAYLIST:No user selected', 1)):
1578
					{
1579
						sActUser = '';
1580
						nKeyboard[get_last(dvTPs)] = TEXT_INPUT_UNAME;
1581
						send_command dvTPs[get_last(dvTPs)],"'@AKB-',sActUser,';Enter user name'";
1582
					}
1583
 
24 andreas 1584
					active(find_string(buf, 'KEYBOARD:', 1)):
1585
					{
1586
					stack_var integer pan;
1587
 
1588
						remove_string(buf, 'KEYBOARD:', 1);
1589
						pan = atoi(buf);
1590
						remove_string(buf, ':', 1);
1591
 
1592
						if (nKeyboard[pan] == TEXT_INPUT_UNAME)
1593
						{
25 andreas 1594
							sInputUser = buf;
1595
							send_command dvTPs[pan], "'^TXT-',itoa(TEXT_INPUT_UNAME),',0,',sInputUser";
24 andreas 1596
							nKeyboard[pan] = 0;
1597
						}
1598
						else if (nKeyboard[pan] == TEXT_INPUT_PLAYLIST)
1599
						{
25 andreas 1600
							sInputPlaylist = buf;
1601
							send_command dvTPs, "'^TXT-',itoa(TEXT_INPUT_PLAYLIST),',0,',sInputPlaylist";
24 andreas 1602
							nKeyboard[pan] = 0;
1603
						}
26 andreas 1604
						else if (nKeyboard[pan] == TEXT_INPUT_SEARCH)
1605
						{
1606
							setPopup(DIR_OPEN, sPopupAudio);
1607
							nOldStart = nStart;
1608
							nStart = 1;
1609
							nSearch = 1;
1610
							nOldPage = nPage;
28 andreas 1611
							sSearchFor = buf;
26 andreas 1612
							send_command vdvMDB, "'SEARCH:',requestActualPage(),':',EncodeURL(buf),':1:',itoa(MAX_LINES),';'";
1613
						}
24 andreas 1614
					}
23 andreas 1615
				}
1616
			}
1617
		}
1618
	}
25 andreas 1619
 
1620
	button_event[dvTPs,BTN_SCROLLBAR]
1621
	{
1622
		push:
1623
		{
1624
		stack_var integer pan;
1625
 
1626
			pan = get_last(dvTPs)
1627
			nScrollbarPressed[pan] = 1;
1628
		}
1629
 
1630
		release:
1631
		{
1632
		stack_var integer pan;
1633
 
1634
			pan = get_last(dvTPs)
1635
			nScrollbarPressed[pan] = 0;
1636
 
1637
			if (nTotal)
1638
			{
1639
				nStart = type_cast(nTotal / 100.0 * nScrollbarLvl);
1640
				send_command vdvMDB, "'LIST:',requestActualPage(),':',itoa(nStart),':',itoa(MAX_LINES),';'";
1641
			}
1642
		}
1643
	}
1644
 
1645
	level_event[dvTPs,LVL_SCROLLBAR]
1646
	{
1647
	stack_var integer pan;
1648
 
1649
		pan = get_last(dvTPs);
1650
 
1651
		if (nScrollbarPressed[pan])
1652
			nScrollbarLvl = LEVEL.VALUE;
1653
	}
1654
 
1655
DEFINE_PROGRAM
1656
	[dvTPs,MEDIA_RANDOM] = nRandom;
1657
	[dvTPs,MEDIA_REPEAT] = nRepeat;