Subversion Repositories mdb

Rev

Rev 26 | 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
 
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
{
369
stack_var integer secA;
370
stack_var integer secB;
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));
380
		sec = atoi(mid_string(sTimeA, 7, 1));
381
		secA = hour * 3600 + min * 60 + sec;
382
	}
383
	else
384
	{
385
		min = atoi(mid_string(sTimeA, 1, 2));
386
		sec = atoi(mid_string(sTimeA, 4, 1));
387
		secA = min * 60 + sec;
388
	}
389
 
390
	if (length_string(sTimeB) > 5)
391
	{
392
		hour = atoi(left_string(sTimeB, 2));
393
		min = atoi(mid_string(sTimeB, 4, 2));
394
		sec = atoi(mid_string(sTimeB, 7, 1));
395
		secB = hour * 3600 + min * 60 + sec;
396
	}
397
	else
398
	{
399
		min = atoi(mid_string(sTimeB, 1, 2));
400
		sec = atoi(mid_string(sTimeB, 4, 1));
401
		secB = min * 60 + sec;
402
	}
403
 
404
	pos = type_cast(100.0 / type_cast(secB) * type_cast(secA));
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'";
660
			send_command dvTPs, "'^TXT-',itoa(BTN_MENU3),',0,Open folder'";
661
		break;
662
 
663
		case TOK_PLAYLIST:
26 andreas 664
			setPopup(DIR_OPEN, sPopupMenu);
24 andreas 665
			send_command dvTPs, "'^TXT-',itoa(BTN_MENU1),'.',itoa(BTN_MENU1+MAX_LINES-1),',0,'";	// Clear all lines
666
			send_command dvTPs, "'^TXT-',itoa(BTN_MENU1),',0,Move to queue and play'";
667
			send_command dvTPs, "'^TXT-',itoa(BTN_MENU2),',0,Add to queue'";
26 andreas 668
 
669
			if (!nFolder)
670
				send_command dvTPs, "'^TXT-',itoa(BTN_MENU3),',0,Show content'";
671
			else
672
				send_command dvTPs, "'^TXT-',itoa(BTN_MENU3),',0,Delete playlist'";
24 andreas 673
		break;
674
 
675
		case TOK_QUEUE:
26 andreas 676
			setPopup(DIR_OPEN, sPopupMenu);
24 andreas 677
			send_command dvTPs, "'^TXT-',itoa(BTN_MENU1),'.',itoa(BTN_MENU1+MAX_LINES-1),',0,'";	// Clear all lines
678
			send_command dvTPs, "'^TXT-',itoa(BTN_MENU1),',0,Play this now'";
679
			send_command dvTPs, "'^TXT-',itoa(BTN_MENU2),',0,Save this to a playlist'";
680
			send_command dvTPs, "'^TXT-',itoa(BTN_MENU3),',0,Delete from queue'";
681
		break;
26 andreas 682
 
683
		case TOK_SEARCH:
684
			setPopup(DIR_OPEN, sPopupMenu);
685
			send_command dvTPs, "'^TXT-',itoa(BTN_MENU1),'.',itoa(BTN_MENU1+MAX_LINES-1),',0,'";	// Clear all lines
686
			send_command dvTPs, "'^TXT-',itoa(BTN_MENU1),',0,Move to queue and play'";
687
			send_command dvTPs, "'^TXT-',itoa(BTN_MENU2),',0,Add to queue'";
688
		break;
24 andreas 689
	}
690
 
691
	switch(nPage)
692
	{
693
		case TOK_TITLE:		send_command dvTPs, "'^TXT-',itoa(TEXT_MENU_TITLE),',0,Title menu'";
694
		case TOK_ARTIST:	send_command dvTPs, "'^TXT-',itoa(TEXT_MENU_TITLE),',0,Artist menu'";
695
		case TOK_ALBUM:		send_command dvTPs, "'^TXT-',itoa(TEXT_MENU_TITLE),',0,Album menu'";
696
		case TOK_GENRE:		send_command dvTPs, "'^TXT-',itoa(TEXT_MENU_TITLE),',0,Genre menu'";
697
		case TOK_QUEUE:		send_command dvTPs, "'^TXT-',itoa(TEXT_MENU_TITLE),',0,Queue menu'";
698
		case TOK_PLAYLIST:	send_command dvTPs, "'^TXT-',itoa(TEXT_MENU_TITLE),',0,Playlist menu'";
26 andreas 699
		case TOK_SEARCH:	send_command dvTPs, "'^TXT-',itoa(TEXT_MENU_TITLE),',0,Search menu'";
24 andreas 700
	}
701
}
702
 
23 andreas 703
DEFINE_START
704
	nStart = 1;
705
	nPage = TOK_NONE;
706
 
707
DEFINE_EVENT
708
	data_event[dvTPs]
709
	{
24 andreas 710
		/*
711
		 * Whenever a panel comes online, it'll be initialized. The actual
712
		 * popup is shown and the pressed (or not pressed) button stated
713
		 * are set.
714
		 */
23 andreas 715
		online:
716
		{
717
			stack_var integer pan;
718
 
719
			pan = get_last(dvTPs);
720
 
721
			switch(nPage)
722
			{
723
				case TOK_TITLE:
25 andreas 724
				case TOK_PLAYLIST:
725
					send_command dvTPs[pan], "'@PPN-',sPopupAudio";
726
					send_command vdvMDB, "'LIST:',requestActualPage(),':',itoa(nStart),':',itoa(MAX_LINES),';'";
727
				break;
728
 
23 andreas 729
				case TOK_ALBUM:
730
				case TOK_ARTIST:
731
				case TOK_GENRE:
732
					send_command dvTPs[pan], "'@PPN-',sPopupAudio";
25 andreas 733
					send_command vdvMDB, "'FOLDER:',requestActualPage(),':',itoa(nStart),':',itoa(MAX_LINES),';'";
23 andreas 734
				break;
735
 
736
				case TOK_QUEUE:
737
					send_command dvTPs[pan], "'@PPN-',sPopupList";
738
					send_command vdvMDB, "'LIST:',requestActualPage(),':',itoa(nStart),':',itoa(MAX_LINES),';'";
739
				break;
25 andreas 740
 
741
				default:
742
					send_command dvTPs[pan], "'@PPN-',sPopupAudio";
743
					nStart = 1;
744
					send_command vdvMDB, "'LIST:TITLE:',itoa(nStart),':',itoa(MAX_LINES),';'";
23 andreas 745
			}
746
		}
747
	}
748
 
24 andreas 749
	/*
750
	 * The navigation buttons are for setting the wanted views.
751
	 */
23 andreas 752
	button_event[dvTPs, nNavigation]
753
	{
754
		push:
755
		{
25 andreas 756
		stack_var integer pan;
757
 
758
			pan = get_last(dvTPs);
759
 
23 andreas 760
			switch(BUTTON.INPUT.CHANNEL)
761
			{
25 andreas 762
				case BTN_TITLE:		
763
					send_command vdvMDB, "'LIST:TITLE:1:',itoa(MAX_LINES),';'"; 
764
					nFolder = 0; 
765
					nStart = 1;
26 andreas 766
					nSearch = 0;
25 andreas 767
					nPage = TOK_TITLE;
768
				break;
769
 
770
				case BTN_ARTIST:	
771
					send_command vdvMDB, "'FOLDER:ARTIST:1:',itoa(MAX_LINES),';'"; 
772
					nFolder = 0; 
773
					nStart = 1;
26 andreas 774
					nSearch = 0;
25 andreas 775
					nPage = TOK_ARTIST;
776
				break;
777
 
778
				case BTN_ALBUM:		
779
					send_command vdvMDB, "'FOLDER:ALBUM:1:',itoa(MAX_LINES),';'"; 
780
					nFolder = 0; 
781
					nStart = 1;
26 andreas 782
					nSearch = 0;
25 andreas 783
					nPage = TOK_ALBUM;
784
				break;
785
 
786
				case BTN_GENRE:		
787
					send_command vdvMDB, "'FOLDER:GENRE:1:',itoa(MAX_LINES),';'"; 
788
					nFolder = 0; 
789
					nStart = 1;
26 andreas 790
					nSearch = 0;
25 andreas 791
					nPage = TOK_GENRE;
792
				break;
793
 
794
				case BTN_QUEUE: 
795
					send_command vdvMDB, "'LIST:QUEUE:1:',itoa(MAX_LINES),';'"; 
796
					nFolder = 0; 
797
					nStart = 1;
26 andreas 798
					nSearch = 0;
25 andreas 799
					nPage = TOK_QUEUE;
800
				break;
801
 
802
				case BTN_PLAYLIST:
28 andreas 803
					send_command dvTPs[pan], "'@PPN-',sPopupSelUser";
804
 
25 andreas 805
					if (!length_string(sActUser))
806
					{
807
						send_command dvTPs[pan], "'@AKB-',sActUser,';Enter name of user'";
808
						nKeyboard[pan] = TEXT_INPUT_UNAME;
809
					}
810
					else
811
					{
28 andreas 812
						send_command dvTPs[pan], "'@AKB-',sActPlaylist,';Enter name of playlist'";
813
						nKeyboard[pan] = TEXT_INPUT_PLAYLIST;
25 andreas 814
					}
28 andreas 815
 
816
					nToDo = TODO_USER_SELECT;
25 andreas 817
				break;
818
 
819
				case BTN_NOW_PLAYING:
820
					if (nPlayStatus == PLAYER_PLAY || nPlayStatus == PLAYER_PAUSE)
26 andreas 821
						setPopup(DIR_OPEN, sPopupDetail);
25 andreas 822
				break;
823
 
824
				case BTN_SAVE:
825
					send_command dvTPs[pan], "'@PPN-',sPopupSelUser";
826
					sInputUser = sActUser;
827
					sInputPlaylist = '';
828
					send_command dvTPs[pan], "'^TXT-',itoa(TEXT_INPUT_UNAME),',0,',sActUser";
829
					send_command dvTPs[pan], "'^TXT-',itoa(TEXT_INPUT_UNAME),',0,'";
830
					send_command dvTPs[pan], "'@AKB-',sActPlaylist,';Enter name of playlist'";
831
					nToDo = TODO_USER_SAVE_PLAYLIST;
832
					nKeyboard[pan] = TEXT_INPUT_PLAYLIST;
833
				break;
834
 
835
				case BTN_DELETE:
836
					send_command vdvMDB, "'DELETE:QUEUE:-1;'";
837
				break;
26 andreas 838
 
839
				case BTN_SEARCH:
28 andreas 840
					if (!nSearch)
841
					{
842
						send_command dvTPs[pan], "'@AKB-;Search for a ',requestActualPage()";
843
						nToDo = TODO_SEARCH;
844
						nKeyboard[pan] = TEXT_INPUT_SEARCH;
845
					}
26 andreas 846
				break;
28 andreas 847
 
848
				case BTN_RESET:
849
					send_command vdvMDB, 'RESET;';
850
				break;
23 andreas 851
			}
852
		}
853
	}
854
 
24 andreas 855
	/*
856
	 * This buttons control mostly the player. With them you can play, stop
857
	 * pause, etc. the player and scroll through lists.
858
	 * Common to this buttons is, that they conform to the AMX SNAPI standard.
859
	 * All of them are declared in the file "mSNAPI.axi".
860
	 */
23 andreas 861
	button_event[dvTPs, nBtns]
862
	{
863
		push:
864
		{
865
			switch(BUTTON.INPUT.CHANNEL)
866
			{
867
				case PLAY:			send_command vdvMDB, 'PLAY;';
25 andreas 868
				case PAUSE:			send_command vdvMDB, 'PLAYPAUSE;';
23 andreas 869
				case STOP:			send_command vdvMDB, 'STOP;';
870
				case FFWD:			send_command vdvMDB, 'FORWARD;';
871
				case REW:			send_command vdvMDB, 'REWIND;';
872
				case SREV:			send_command vdvMDB, 'SKIPREW;';
873
				case SFWD:			send_command vdvMDB, 'SKIPFWD;';
874
				case MEDIA_RANDOM:	send_command vdvMDB, 'RANDOM;';
875
				case MEDIA_REPEAT:	send_command vdvMDB, 'REPEAT;';
876
 
25 andreas 877
				case MENU_THUMBS_UP:
23 andreas 878
					if (nStart > MAX_LINES)
879
					{
880
						nStart = nStart - MAX_LINES;
25 andreas 881
 
882
						if (nPage == TOK_TITLE || nPage == TOK_QUEUE || nPage == TOK_PLAYLIST)
883
							send_command vdvMDB, "'LIST:',requestActualPage(),':',itoa(nStart),':',itoa(MAX_LINES),';'";
28 andreas 884
						else if (nPage == TOK_SEARCH)
885
							send_command vdvMDB, "'SEARCH:',requestPage(nOldPage),':',EncodeURL(sSearchFor),':',itoa(nStart),':',itoa(MAX_LINES),';'";
25 andreas 886
						else
887
							send_command vdvMDB, "'FOLDER:',requestActualPage(),':',itoa(nStart),':',itoa(MAX_LINES),';'";
23 andreas 888
					}
889
				break;
890
 
25 andreas 891
				case MENU_THUMBS_DN:
23 andreas 892
					if (nTotal && (nStart+MAX_LINES) <= nTotal)
893
					{
894
						nStart = nStart + MAX_LINES;
25 andreas 895
 
896
						if (nPage == TOK_TITLE || nPage == TOK_QUEUE || nPage == TOK_PLAYLIST)
897
							send_command vdvMDB, "'LIST:',requestActualPage(),':',itoa(nStart),':',itoa(MAX_LINES),';'";
28 andreas 898
						else if (nPage == TOK_SEARCH)
899
							send_command vdvMDB, "'SEARCH:',requestPage(nOldPage),':',EncodeURL(sSearchFor),':',itoa(nStart),':',itoa(MAX_LINES),';'";
25 andreas 900
						else
901
							send_command vdvMDB, "'FOLDER:',requestActualPage(),':',itoa(nStart),':',itoa(MAX_LINES),';'";
23 andreas 902
					}
903
				break;
24 andreas 904
 
905
				case MENU_BACK:
25 andreas 906
				case BTN_RETURN:
24 andreas 907
					if (nFolder)
25 andreas 908
					{
909
						nStart = nOldStart;
910
						nFolder = 0;
911
					}
26 andreas 912
					else if (nSearch)
913
					{
914
						nStart = nOldStart;
915
						nPage = nOldPage;
916
						nSearch = 0;
917
					}
25 andreas 918
 
919
					if (nPage == TOK_TITLE || nPage == TOK_QUEUE || nPage == TOK_PLAYLIST)
24 andreas 920
						send_command vdvMDB, "'LIST:',requestActualPage(),':',itoa(nStart),':',itoa(MAX_LINES),';'";
25 andreas 921
					else
922
						send_command vdvMDB, "'FOLDER:',requestActualPage(),':',itoa(nStart),':',itoa(MAX_LINES),';'";
24 andreas 923
				break;
23 andreas 924
			}
925
		}
24 andreas 926
 
927
		hold[2,repeat]:
928
		{
929
			switch(BUTTON.INPUT.CHANNEL)
930
			{
931
				case FFWD:			send_command vdvMDB, 'FORWARD;';
932
				case REW:			send_command vdvMDB, 'REWIND;';
933
			}
934
		}
23 andreas 935
	}
936
 
24 andreas 937
	button_event[dvTPs,nLines]
938
	{
939
		push:
940
		{
941
			switch(BUTTON.INPUT.CHANNEL)
942
			{
943
				case BTN_LINE1_PIC:
944
				case BTN_LINE1_LINE:
945
					nLastPressedLine = 1;
946
					askMenuList();
947
				break;
948
 
949
				case BTN_LINE2_PIC:
950
				case BTN_LINE2_LINE:
951
					nLastPressedLine = 2;
952
					askMenuList();
953
				break;
954
 
955
				case BTN_LINE3_PIC:
956
				case BTN_LINE3_LINE:
957
					nLastPressedLine = 3;
958
					askMenuList();
959
				break;
960
 
961
				case BTN_LINE4_PIC:
962
				case BTN_LINE4_LINE:
963
					nLastPressedLine = 4;
964
					askMenuList();
965
				break;
966
 
967
				case BTN_LINE5_PIC:
968
				case BTN_LINE5_LINE:
969
					nLastPressedLine = 5;
970
					askMenuList();
971
				break;
972
 
973
				case BTN_LINE6_PIC:
974
				case BTN_LINE6_LINE:
975
					nLastPressedLine = 6;
976
					askMenuList();
977
				break;
978
 
979
				case BTN_LINE7_PIC:
980
				case BTN_LINE7_LINE:
981
					nLastPressedLine = 7;
982
					askMenuList();
983
				break;
984
 
985
				case BTN_LINE8_PIC:
986
				case BTN_LINE8_LINE:
987
					nLastPressedLine = 8;
988
					askMenuList();
989
				break;
990
 
991
				case BTN_LINE9_PIC:
992
				case BTN_LINE9_LINE:
993
					nLastPressedLine = 9;
994
					askMenuList();
995
				break;
996
 
997
				case BTN_LINE10_PIC:
998
				case BTN_LINE10_LINE:
999
					nLastPressedLine = 10;
1000
					askMenuList();
1001
				break;
1002
			}
1003
		}
1004
	}
1005
 
1006
	button_event[dvTPs,nMenu]
1007
	{
1008
		push:
1009
		{
1010
		stack_var integer pan;
1011
 
1012
			pan = get_last(dvTPs);
1013
 
1014
			switch(BUTTON.INPUT.CHANNEL)
1015
			{
1016
				case BTN_MENU1:
1017
					if (nPage != TOK_PLAYLIST && nPage != TOK_QUEUE)	// Move to queue and play
1018
					{
1019
						if (nPlayStatus == PLAYER_PLAY || nPlayStatus == PLAYER_PAUSE)
1020
							send_command vdvMDB, 'STOP;';
1021
 
1022
						send_command vdvMDB, 'DELETE:QUEUE:-1;';
25 andreas 1023
 
26 andreas 1024
						if (nPage == TOK_TITLE || nPage == TOK_SEARCH)
25 andreas 1025
							send_command vdvMDB, "'PLAY:ID:',itoa(stSong[nLastPressedLine].nID),';'";
1026
						else
1027
							send_command vdvMDB, "'PLAY:',requestActualPage(),':',stSong[nLastPressedLine].sTitle,';'";
24 andreas 1028
					}
1029
					else if (nPage == TOK_PLAYLIST)
1030
					{
1031
						if (length_string(sActUser) && length_string(sActPlaylist))
1032
						{
1033
							if (nPlayStatus == PLAYER_PLAY || nPlayStatus == PLAYER_PAUSE)
1034
								send_command vdvMDB, 'STOP;';
1035
 
1036
							send_command vdvMDB, 'DELETE:QUEUE:-1;';
1037
							send_command vdvMDB, "'PLAY:PLAYLIST:',EncodeURL(sActPlaylist),';'";
1038
						}
1039
					}
1040
					else if (nPage == TOK_QUEUE)
1041
						send_command vdvMDB, "'PLAY:QUEUE:',itoa(nStart+nLastPressedLine-1),';'";
1042
				break;
1043
 
1044
				case BTN_MENU2:
1045
					if (nPage != TOK_PLAYLIST && nPage != TOK_QUEUE)	// Add to queue
25 andreas 1046
					{
26 andreas 1047
						if (nPage == TOK_TITLE || nPage == TOK_SEARCH)
25 andreas 1048
							send_command vdvMDB, "'ADD:ID:',itoa(stSong[nLastPressedLine].nID),';'";
1049
						else
1050
							send_command vdvMDB, "'ADD:',requestActualPage(),':',stSong[nLastPressedLine].sTitle,';'";
1051
					}
24 andreas 1052
					else if (nPage == TOK_PLAYLIST)
1053
						send_command vdvMDB, "'ADD:PLAYLIST:',EncodeURL(sActPlaylist),';'";
1054
					else if (nPage == TOK_QUEUE)
1055
					{
26 andreas 1056
						setPopup(DIR_OPEN, sPopupSelUser);
25 andreas 1057
						sInputUser = sActUser;
1058
						sInputPlaylist = '';
24 andreas 1059
						send_command dvTPs[pan], "'^TXT-',itoa(TEXT_INPUT_UNAME),',0,',sActUser";
1060
						send_command dvTPs[pan], "'@AKB-',sActPlaylist,';Enter name of playlist'";
25 andreas 1061
						nToDo = TODO_USER_PLAYLIST_QUEUE;
24 andreas 1062
						nKeyboard[pan] = TEXT_INPUT_PLAYLIST;
1063
					}
1064
				break;
1065
 
1066
				case BTN_MENU3:
26 andreas 1067
					if (nPage != TOK_PLAYLIST && nPage != TOK_QUEUE && nPage != TOK_SEARCH)	// Open folder
24 andreas 1068
					{
25 andreas 1069
						sActFolder = stSong[nLastPressedLine].sTitle;	// Get name of folder
1070
						nFolder = true;									// Set marker for folder
1071
						nOldStart = nStart;								// Save current position
1072
						nStart = 1;										// Reset start position
1073
						send_command vdvMDB, "'LISTFOLDER:',requestActualPage(),':',stSong[nLastPressedLine].sTitle,':1:',itoa(MAX_LINES),';'";
24 andreas 1074
					}
1075
					else if (nPage == TOK_PLAYLIST)
1076
					{
25 andreas 1077
						nOldStart = nStart;
1078
						nFolder = 1;
1079
						nStart = 1;
1080
						send_command vdvMDB, "'PLIST:',EncodeURL(sActUser),':',EncodeURL(stSong[nLastPressedLine].sTitle),':',itoa(nStart),':',itoa(MAX_LINES),';'";
24 andreas 1081
					}
1082
					else if (nPage == TOK_QUEUE)
1083
						send_command vdvMDB, "'DELETE:QUEUE:',itoa(stSong[nLastPressedLine].nID),';'";
1084
				break;
1085
			}
25 andreas 1086
 
1087
			if (nPage != TOK_QUEUE)
26 andreas 1088
				setPopup(DIR_OPEN, sPopupAudio);
25 andreas 1089
			else
26 andreas 1090
				setPopup(DIR_OPEN, sPopupList);
24 andreas 1091
		}
1092
	}
1093
 
25 andreas 1094
	button_event[dvTPs,nBtnUser]
24 andreas 1095
	{
1096
		push:
1097
		{
1098
			stack_var integer pan;
1099
 
1100
			pan = get_last(dvTPs);
1101
 
25 andreas 1102
			switch(BUTTON.INPUT.CHANNEL)
24 andreas 1103
			{
25 andreas 1104
				case TEXT_INPUT_UNAME:
1105
					if (!nKeyboard[pan])
1106
					{
1107
						nKeyboard[pan] = TEXT_INPUT_UNAME;
1108
						send_command dvTPs[pan],"'@AKB-',sActUser,';Enter user name'";
1109
					}
1110
				break;
24 andreas 1111
 
25 andreas 1112
				case TEXT_INPUT_PLAYLIST:
1113
					if (!nKeyboard[pan])
1114
					{
1115
						nKeyboard[pan] = TEXT_INPUT_PLAYLIST;
1116
						send_command dvTPs[pan],"'@AKB-',sActPlaylist,';Enter name of playlist'";
1117
					}
1118
				break;
24 andreas 1119
 
25 andreas 1120
				case BTN_USER_OK:
1121
					send_command dvTPs[pan],"'@PPF-',sPopupSelUser";
24 andreas 1122
 
25 andreas 1123
					switch(nToDo)
1124
					{
1125
						case TODO_USER_SELECT:
1126
							sActUser = sInputUser;
1127
							send_command vdvMDB, "'USER:',EncodeURL(sInputUser),':;'";
1128
						break;
1129
 
1130
						case TODO_USER_LIST_PLAYLIST:
1131
							sActPlaylist = sInputPlaylist;
1132
							nOldStart = nStart;
1133
							nFolder = 1;
1134
							nStart = 1;
1135
							send_command vdvMDB, "'PLIST:',EncodeURL(sActUser),':',EncodeURL(stSong[nLastPressedLine].sTitle),':',itoa(nStart),':',itoa(MAX_LINES),';'";
1136
						break;
1137
 
1138
						case TODO_USER_SAVE_PLAYLIST:
1139
							sActUser = sInputUser;
1140
							sActPlaylist = sInputPlaylist;
1141
 
1142
							if (length_string(sActUser) && length_string(sActPlaylist))
1143
								send_command vdvMDB, "'SAVEQUEUE:',EncodeURL(sActUser),':',EncodeURL(sActPlaylist),';'";
1144
						break;
1145
 
1146
						case TODO_USER_PLAYLIST_QUEUE:
1147
							sActUser = sInputUser;
1148
							sActPlaylist = sInputPlaylist;
1149
 
1150
							if (length_string(sActUser) && length_string(sActPlaylist))
1151
								send_command vdvMDB, "'ADD:PLAYLIST:',EncodeURL(sActPlaylist),';'";
1152
						break;
1153
					}
1154
 
1155
					nToDo = 0;
1156
				break;
1157
 
1158
				case BTN_USER_CANCEL:
1159
					nToDo = 0;
1160
					send_command dvTPs[pan],"'@PPF-',sPopupSelUser";
1161
				break;
1162
 
1163
				case BTN_DETAIL_BACK:
1164
					if (nPage == TOK_QUEUE)
26 andreas 1165
						setPopup(DIR_OPEN, sPopupAudio);
25 andreas 1166
					else
26 andreas 1167
						setPopup(DIR_OPEN, sPopupList);
25 andreas 1168
				break;
24 andreas 1169
			}
1170
		}
1171
	}
1172
 
1173
	/*
1174
	 * This event catches everything comming from the COMM - module. Here the
1175
	 * AMX part of the COMM - module only makes a network connection to the
1176
	 * player. The API of the player is made to replace a heavy AMX COMM -
1177
	 * module. Everything normally is done inside an AMX COMM - module, is
1178
	 * done by the player itself, running on a Linux platform. This makes the
1179
	 * communication with it fairly easy.
1180
	 */
23 andreas 1181
	data_event[vdvMDB]
1182
	{
1183
		string:
1184
		{
1185
			stack_var char buf[8192];
1186
 
1187
			while (find_string(DATA.TEXT, ';', 1))
1188
			{
1189
				buf = remove_string(DATA.TEXT, ';', 1);
1190
				set_length_string(buf, length_string(buf) - 1);
1191
 
1192
				select
1193
				{
24 andreas 1194
					/*
1195
					 * This is send by the player whenever the UI should
1196
					 * display a list with song details.
1197
					 * The correct popup must be displayed and the contents
1198
					 * should be filled with the data from the player.
1199
					 */
25 andreas 1200
					active(find_string(buf, 'LINE:', 1)):
23 andreas 1201
					{
1202
					stack_var char sPg[32];
1203
					stack_var integer nSongID;
1204
					stack_var integer nLine;
1205
					stack_var integer anz;
1206
					stack_var integer i;
1207
 
25 andreas 1208
						remove_string(buf, 'LINE:', 1);
23 andreas 1209
						anz = strtok(buf, ':');
25 andreas 1210
 
23 andreas 1211
						for (i = 1; i <= anz; i++)
1212
						{
1213
							switch (i)
1214
							{
1215
								case 1: sPg = getStrTok(i);
1216
								case 2: nSongID = atoi(getStrTok(i));
26 andreas 1217
 
1218
								case 3:
1219
									nLine = atoi(getStrTok(i));
1220
									clearPageLine(nLine);
1221
									stSong[nLine].nID = nSongID;
1222
								break;
1223
 
25 andreas 1224
								case 4: stSong[nLine].sTitle = DecodeURL(getStrTok(i));
1225
								case 5: stSong[nLine].sArtist = DecodeURL(getStrTok(i));
1226
								case 6: stSong[nLine].sAlbum = DecodeURL(getStrTok(i));
1227
								case 7: stSong[nLine].sGenre = DecodeURL(getStrTok(i));
1228
								case 8: stSong[nLine].sCover = DecodeURL(getStrTok(i));
23 andreas 1229
							}
1230
						}
1231
 
1232
						if (nLine == 1)
1233
						{
1234
							setActualPage(sPg);
1235
							clearPage();
1236
						}
1237
 
1238
						displaySong(nLine);
1239
					}
1240
 
25 andreas 1241
					active(find_string(buf, 'FOLDER:', 1)):
1242
					{
1243
					stack_var char sPg[32];
1244
					stack_var integer nLine;
1245
					stack_var integer anz;
1246
					stack_var integer i;
1247
 
1248
						remove_string(buf, 'FOLDER:', 1);
1249
						anz = strtok(buf, ':');
1250
 
1251
						for (i = 1; i <= anz; i++)
1252
						{
1253
							switch(i)
1254
							{
1255
								case 1: sPg = getStrTok(i);
26 andreas 1256
 
1257
								case 2:
1258
									nLine = atoi(getStrTok(i));
1259
									clearPageLine(nLine);
1260
								break;
1261
 
25 andreas 1262
								case 3: stSong[nLine].sTitle = DecodeURL(getStrTok(i));
1263
								case 4: stSong[nLine].sCover = DecodeURL(getStrTok(i));
1264
							}
1265
						}
1266
 
1267
						stSong[nLine].nID = 0;
1268
						stSong[nLine].sAlbum = '';
1269
						stSong[nLine].sArtist = '';
1270
						stSong[nLine].sGenre = '';
1271
 
1272
						if (nLine == 1)
1273
						{
1274
							setActualPage(sPg);
1275
							clearPage();
1276
						}
1277
 
1278
						displaySong(nLine);
1279
					}
1280
 
1281
					active(find_string(buf, 'PLAYLIST:', 1)):
1282
					{
1283
					stack_var integer nLine;
1284
					stack_var integer anz;
1285
					stack_var integer i;
1286
 
1287
						remove_string(buf, 'PLAYLIST:', 1);
1288
						anz = strtok(buf, ':');
1289
 
1290
						for (i = 1; i <= anz; i++)
1291
						{
1292
							switch(i)
1293
							{
26 andreas 1294
								case 1: 
1295
									nLine = atoi(getStrTok(i));
1296
									clearPageLine(nLine);
1297
								break;
1298
 
25 andreas 1299
								case 2: sActUser = DecodeURL(getStrTok(i));
1300
								case 3: stSong[nLine].sTitle = DecodeURL(getStrTok(i));
1301
							}
1302
						}
1303
 
26 andreas 1304
						if (nLine == 1)
1305
						{
1306
							setActualPage(TOK_TXT_PLAYLIST);
1307
							clearPage();
1308
						}
25 andreas 1309
 
26 andreas 1310
						displaySong(nLine);
1311
					}
1312
 
1313
					// SEARCH:<type>:<id>:<line>:<title>:<artist>:<album>:<genre>;
1314
					active(find_string(buf, 'SEARCH:', 1)):
1315
					{
1316
					stack_var char sPg[32];
1317
					stack_var integer id;
1318
					stack_var integer nLine;
1319
					stack_var integer anz;
1320
					stack_var integer i;
1321
 
1322
						remove_string(buf, 'SEARCH:', 1);
1323
						anz = strtok(buf, ':');
1324
 
1325
						for (i = 1; i <= anz; i++)
1326
						{
1327
							switch(i)
1328
							{
1329
								case 1: sPg = getStrTok(i);
1330
								case 2: id = atoi(getStrTok(i));
1331
 
1332
								case 3:
1333
									nLine = atoi(getStrTok(i));
1334
									clearPageLine(nLine);
1335
									stSong[nLine].nID = id;
1336
								break;
1337
 
1338
								case 4: stSong[nLine].sTitle = DecodeURL(getStrTok(i));
1339
								case 5: stSong[nLine].sArtist = DecodeURL(getStrTok(i));
1340
								case 6: stSong[nLine].sAlbum = DecodeURL(getStrTok(i));
1341
								case 7: stSong[nLine].sGenre = DecodeURL(getStrTok(i));
1342
								case 8: stSong[nLine].sCover = DecodeURL(getStrTok(i));
1343
							}
1344
						}
1345
 
25 andreas 1346
						if (nLine == 1)
1347
						{
26 andreas 1348
							setActualPage(TOK_TXT_SEARCH);
25 andreas 1349
							clearPage();
1350
						}
1351
 
1352
						displaySong(nLine);
1353
					}
1354
 
1355
					active(find_string(buf, 'FOLDERNAME:', 1)):
1356
					{
1357
						remove_string(buf, 'FOLDERNAME:', 1);
1358
						sActFolder = buf;
1359
						nFolder = 1;
1360
					}
1361
 
24 andreas 1362
					active(find_string(buf, 'PLAYING:', 1)):
1363
					{
1364
					stack_var integer nSongID;
1365
					stack_var char sTitle[256];
1366
					stack_var char sArtist[256];
1367
					stack_var char sAlbum[256];
1368
					stack_var char sGenre[256];
1369
					stack_var char sCover[256];
1370
					stack_var integer anz;
1371
					stack_var integer i;
1372
 
1373
						remove_string(buf, 'PLAYING:', 1);
1374
						anz = strtok(buf, ':');
1375
 
1376
						for (i = 1; i <= anz; i++)
1377
						{
1378
							switch (i)
1379
							{
1380
								case 1: nSongID = atoi(getStrTok(i));
1381
								case 2: sTitle = DecodeURL(getStrTok(i));
1382
								case 3: sArtist = DecodeURL(getStrTok(i));
1383
								case 4: sAlbum = DecodeURL(getStrTok(i));
1384
								case 5: sGenre = DecodeURL(getStrTok(i));
1385
								case 6: sCover = DecodeURL(getStrTok(i));
1386
							}
1387
						}
1388
 
1389
						// Initialize detail fields
25 andreas 1390
						send_command dvTPs, "'^TXT-',itoa(TEXT_DETAIL_TITLE),',0,',sTitle";
1391
						send_command dvTPs, "'^TXT-',itoa(TEXT_DETAIL_ARTIST),',0,',sArtist";
1392
						send_command dvTPs, "'^TXT-',itoa(TEXT_DETAIL_ALBUM),',0,',sAlbum";
1393
						send_command dvTPs, "'^TXT-',itoa(TEXT_DETAIL_GENRE),',0,',sGenre";
24 andreas 1394
						setLogo(sCover, 0);
1395
					}
1396
 
28 andreas 1397
					active(find_string(buf, 'POSITION:', 1)):
1398
					{
1399
						stack_var char sTimeA[16];
1400
						stack_var char sTimeB[16];
1401
						stack_var char sTimeC[16];
1402
						stack_var integer anz;
1403
						stack_var integer i;
1404
 
1405
						remove_string(buf, 'POSITION:', 1);
1406
						anz = strtok(buf, ':');
1407
 
1408
						for (i = 1; i <= anz; i++)
1409
						{
1410
							switch(i)
1411
							{
1412
								case 1: sTimeA = DecodeURL(getStrTok(i));
1413
								case 2: sTimeB = DecodeURL(getStrTok(i));
1414
								case 3: sTimeC = DecodeURL(getStrTok(i));
1415
							}
1416
						}
1417
 
1418
						send_command dvTPs, "'^TXT-',itoa(TEXT_DETAIL_TIME_PROG),',0,',sTimeA";
1419
						send_command dvTPs, "'^TXT-',itoa(TEXT_DETAIL_TIME_TOTAL),',0,',sTimeC";
1420
						displayProgresBar(sTimeA, sTimeC);
1421
					}
1422
 
25 andreas 1423
					active(find_string(buf, 'USER:', 1)):
1424
					{
1425
						remove_string(buf, 'USER:', 1);
1426
						sActUser = DecodeURL(buf);
1427
					}
1428
 
23 andreas 1429
					active(find_string(buf, 'TOTAL:', 1)):
1430
					{
1431
						remove_string(buf, 'TOTAL:', 1);
1432
						nTotal = atoi(buf);
24 andreas 1433
						displayPageInfo(nStart, nTotal);
23 andreas 1434
					}
1435
 
1436
					active(find_string(buf, 'PAGE:', 1)):
1437
					{
1438
						remove_string(buf, 'PAGE:', 1);
1439
						setActualPage(buf);
24 andreas 1440
						displayPageInfo(nStart, nTotal);
23 andreas 1441
					}
24 andreas 1442
 
25 andreas 1443
					active(find_string(buf, 'PLAYER:', 1)):
24 andreas 1444
					{
1445
						remove_string(buf, 'PLAYER:', 1);
1446
 
1447
						if (buf == 'PLAY')
1448
						{
1449
							nPlayStatus = PLAYER_PLAY;
1450
							on[dvTPs,PLAY];
1451
							off[dvTPs,STOP];
1452
							off[dvTPs,PAUSE];
1453
						}
1454
						else if (buf == 'STOP')
1455
						{
1456
							nPlayStatus = PLAYER_STOP;
1457
							off[dvTPs,PLAY];
1458
							on[dvTPs,STOP];
1459
							off[dvTPs,PAUSE];
1460
						}
1461
						else if (buf == 'PAUSE')
1462
						{
1463
							nPlayStatus = PLAYER_PAUSE;
1464
							off[dvTPs,PLAY];
1465
							off[dvTPs,STOP];
1466
							on[dvTPs,PAUSE];
1467
						}
1468
						else
1469
						{
1470
							nPlayStatus = 0;
1471
							off[dvTPs,PLAY];
1472
							off[dvTPs,STOP];
1473
							off[dvTPs,PAUSE];
1474
						}
1475
					}
1476
 
25 andreas 1477
					active(find_string(buf, 'RANDOM:', 1)):
1478
					{
1479
						remove_string(buf, 'RANDOM:', 1);
1480
 
1481
						if (buf == 'TRUE')
1482
							nRandom = 1;
1483
						else
1484
							nRandom = 0;
1485
					}
1486
 
1487
					active(find_string(buf, 'REPEAT:', 1)):
1488
					{
1489
						remove_string(buf, 'REPEAT:', 1);
1490
 
1491
						if (buf == 'TRUE')
1492
							nRepeat = 1;
1493
						else
1494
							nRepeat = 0;
1495
					}
1496
 
1497
					active(find_string(buf, 'ERROR:PLAYLIST:No user selected', 1)):
1498
					{
1499
						sActUser = '';
1500
						nKeyboard[get_last(dvTPs)] = TEXT_INPUT_UNAME;
1501
						send_command dvTPs[get_last(dvTPs)],"'@AKB-',sActUser,';Enter user name'";
1502
					}
1503
 
24 andreas 1504
					active(find_string(buf, 'KEYBOARD:', 1)):
1505
					{
1506
					stack_var integer pan;
1507
 
1508
						remove_string(buf, 'KEYBOARD:', 1);
1509
						pan = atoi(buf);
1510
						remove_string(buf, ':', 1);
1511
 
1512
						if (nKeyboard[pan] == TEXT_INPUT_UNAME)
1513
						{
25 andreas 1514
							sInputUser = buf;
1515
							send_command dvTPs[pan], "'^TXT-',itoa(TEXT_INPUT_UNAME),',0,',sInputUser";
24 andreas 1516
							nKeyboard[pan] = 0;
1517
						}
1518
						else if (nKeyboard[pan] == TEXT_INPUT_PLAYLIST)
1519
						{
25 andreas 1520
							sInputPlaylist = buf;
1521
							send_command dvTPs, "'^TXT-',itoa(TEXT_INPUT_PLAYLIST),',0,',sInputPlaylist";
24 andreas 1522
							nKeyboard[pan] = 0;
1523
						}
26 andreas 1524
						else if (nKeyboard[pan] == TEXT_INPUT_SEARCH)
1525
						{
1526
							setPopup(DIR_OPEN, sPopupAudio);
1527
							nOldStart = nStart;
1528
							nStart = 1;
1529
							nSearch = 1;
1530
							nOldPage = nPage;
28 andreas 1531
							sSearchFor = buf;
26 andreas 1532
							send_command vdvMDB, "'SEARCH:',requestActualPage(),':',EncodeURL(buf),':1:',itoa(MAX_LINES),';'";
1533
						}
24 andreas 1534
					}
23 andreas 1535
				}
1536
			}
1537
		}
1538
	}
25 andreas 1539
 
1540
	button_event[dvTPs,BTN_SCROLLBAR]
1541
	{
1542
		push:
1543
		{
1544
		stack_var integer pan;
1545
 
1546
			pan = get_last(dvTPs)
1547
			nScrollbarPressed[pan] = 1;
1548
		}
1549
 
1550
		release:
1551
		{
1552
		stack_var integer pan;
1553
 
1554
			pan = get_last(dvTPs)
1555
			nScrollbarPressed[pan] = 0;
1556
 
1557
			if (nTotal)
1558
			{
1559
				nStart = type_cast(nTotal / 100.0 * nScrollbarLvl);
1560
				send_command vdvMDB, "'LIST:',requestActualPage(),':',itoa(nStart),':',itoa(MAX_LINES),';'";
1561
			}
1562
		}
1563
	}
1564
 
1565
	level_event[dvTPs,LVL_SCROLLBAR]
1566
	{
1567
	stack_var integer pan;
1568
 
1569
		pan = get_last(dvTPs);
1570
 
1571
		if (nScrollbarPressed[pan])
1572
			nScrollbarLvl = LEVEL.VALUE;
1573
	}
1574
 
1575
DEFINE_PROGRAM
1576
	[dvTPs,MEDIA_RANDOM] = nRandom;
1577
	[dvTPs,MEDIA_REPEAT] = nRepeat;