Subversion Repositories mdb

Rev

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