1 /* Signal Processing - Filter Menu
2
3 * Copyright (C) 1998 J.A. Bezemer
4 *
5 * Licensed under the terms of the GNU General Public License.
6 * ABSOLUTELY NO WARRANTY.
7 * See the file `COPYING' in this directory.
8 */
9
10 #include "signpr_filtmenu.h"
11 #include "signpr_general.h"
12 #include "buttons.h"
13 #include "boxes.h"
14 #include "helpline.h"
15 #include "clrscr.h"
16 #include "errorwindow.h"
17 #include "stringinput.h"
18 #include "secshms.h"
19 #include <stdlib.h>
20 #include <string.h>
21 #ifndef OLD_CURSES
22 #include <ncurses.h>
23 #else
24 #include <curses.h>
25 #endif
26
27
28 int
signproc_select_filters(scrollmenu_t * filtlist,int * filtnumbers,char ** helptexts,scrollmenu_t * selectedfilts,int * usetracktimes,int * usebeginendtime,double * begintime,double * endtime)29 signproc_select_filters (scrollmenu_t * filtlist,
30 int *filtnumbers,
31 char **helptexts,
32 scrollmenu_t * selectedfilts,
33 int *usetracktimes, int *usebeginendtime,
34 double *begintime, double *endtime)
35 /* Returns 0: canceled, 1: PrevScreen, 2: NextScreen */
36 {
37 button_t next_button, cancel_button, prev_button;
38 button_t beginend_check, tracktimes_check;
39 stringinput_t begintimestring, endtimestring;
40 int dont_stop = TRUE;
41 int returnval = 0;
42 int focus = 0;
43 int in_ch;
44 int i;
45 double tempdouble = 0;
46 char tempstring[250];
47
48 char *emptyhelpline =
49 " TAB: Next field";
50
51 int maxhelplength = 62;
52 char helphelpline[100];
53
54 char *helplines[9] =
55 {
56 " Enter: Add selected filter. TAB: Next field",
57 " Enter: Parameters U/D: Move R/Del: Delete TAB: Next field",
58 " Use the .tracks file to split tracks. TAB: Next field",
59 " Process only the specified part of the sound. TAB: Next field",
60 " Enter begin time of part to be processed. TAB: Next field",
61 " Enter end time of part to be processed. TAB: Next field",
62 " To Signal Processing - Source File. TAB: Next field",
63 " Back to main menu. TAB: Next field",
64 " To Signal Processing - Destination File. TAB: Next field"};
65
66 char *helpcharptr;
67 int helpint;
68 parampointer_t helpparampointer;
69
70
71 filtlist->y = 3;
72 filtlist->x = 5;
73 filtlist->h = 12;
74 filtlist->w = 32;
75 filtlist->firstonscreen = 0;
76 filtlist->selected = 0;
77
78 selectedfilts->y = 3;
79 selectedfilts->x = 43;
80 selectedfilts->h = 12;
81 selectedfilts->w = 32;
82 selectedfilts->firstonscreen = 0;
83 selectedfilts->selected = 0;
84
85
86 begintimestring.maxlen = 500;
87 begintimestring.string = (char *) malloc (
88 begintimestring.maxlen * sizeof (char));
89 fsec2hmsf (*begintime, begintimestring.string);
90 begintimestring.y = 17;
91 begintimestring.x = 59;
92 begintimestring.w = 18;
93 begintimestring.cursorpos = strlen (begintimestring.string);
94 begintimestring.firstcharonscreen = 0;
95
96 endtimestring.maxlen = 500;
97 endtimestring.string = (char *) malloc (
98 endtimestring.maxlen * sizeof (char));
99 fsec2hmsf (*endtime, endtimestring.string);
100 endtimestring.y = 18;
101 endtimestring.x = 59;
102 endtimestring.w = 18;
103 endtimestring.cursorpos = strlen (endtimestring.string);
104 endtimestring.firstcharonscreen = 0;
105
106 prev_button.text = " < Previous screen ";
107 prev_button.y = 20;
108 prev_button.x = 5;
109 prev_button.selected = FALSE;
110
111 next_button.text = " Next screen > ";
112 next_button.y = 20;
113 next_button.x = 60;
114 next_button.selected = FALSE;
115
116 cancel_button.text = " Cancel ";
117 cancel_button.y = 20;
118 cancel_button.x = 36;
119 cancel_button.selected = FALSE;
120
121 tracktimes_check.text = ""; /* see below */
122 tracktimes_check.y = 16;
123 tracktimes_check.x = 4;
124 tracktimes_check.selected = FALSE;
125
126 beginend_check.text = ""; /* see below */
127 beginend_check.y = 16;
128 beginend_check.x = 42;
129 beginend_check.selected = FALSE;
130
131 clearscreen (SIGNPR_FILTMENU_HEADERTEXT);
132
133 do
134 {
135 header (SIGNPR_FILTMENU_HEADERTEXT);
136
137 if (*usetracktimes)
138 tracktimes_check.text = "[X] Split tracks";
139 else
140 tracktimes_check.text = "[ ] Split tracks";
141
142 if (*usebeginendtime)
143 beginend_check.text = "[X] Use begin and end times";
144 else
145 beginend_check.text = "[ ] Use begin and end times";
146
147 if (focus == 2)
148 tracktimes_check.selected = TRUE;
149 else
150 tracktimes_check.selected = FALSE;
151
152 if (focus == 3)
153 beginend_check.selected = TRUE;
154 else
155 beginend_check.selected = FALSE;
156
157 if (focus == 6)
158 prev_button.selected = TRUE;
159 else
160 prev_button.selected = FALSE;
161
162 if (focus == 7)
163 cancel_button.selected = TRUE;
164 else
165 cancel_button.selected = FALSE;
166
167 if (focus == 8)
168 next_button.selected = TRUE;
169 else
170 next_button.selected = FALSE;
171
172 filtlist->hasfocus = (focus == 0);
173 selectedfilts->hasfocus = (focus == 1);
174
175 scrollmenu_display (filtlist);
176 mybox (filtlist->y - 1, filtlist->x - 1,
177 filtlist->h + 2, filtlist->w + 2);
178 mvprintw (filtlist->y - 1, filtlist->x + 1,
179 "Available filters:");
180
181 scrollmenu_display (selectedfilts);
182 mybox (selectedfilts->y - 1, selectedfilts->x - 1,
183 selectedfilts->h + 2, selectedfilts->w + 2);
184 mvprintw (selectedfilts->y - 1, selectedfilts->x + 1,
185 "Selected filters:");
186
187 stringinput_display (&begintimestring);
188 mvprintw (begintimestring.y, begintimestring.x - 12,
189 "Begin time:");
190
191 stringinput_display (&endtimestring);
192 mvprintw (endtimestring.y, endtimestring.x - 12,
193 "End time :");
194
195 button_display (&prev_button);
196 mybox (prev_button.y - 1, prev_button.x - 1,
197 3, strlen (prev_button.text) + 2);
198 button_display (&cancel_button);
199 mybox (cancel_button.y - 1, cancel_button.x - 1,
200 3, strlen (cancel_button.text) + 2);
201 button_display (&next_button);
202 mybox (next_button.y - 1, next_button.x - 1,
203 3, strlen (next_button.text) + 2);
204
205 button_display (&tracktimes_check);
206 button_display (&beginend_check);
207
208 if (focus == 0)
209 {
210 strcpy (helphelpline, emptyhelpline);
211
212 i = 0;
213 while (i < strlen (helptexts[filtlist->selected])
214 && i < maxhelplength)
215 {
216 helphelpline[i + 1] = helptexts[filtlist->selected][i];
217 i++;
218 }
219
220 helpline (helphelpline);
221 }
222 else
223 helpline (helplines[focus]);
224
225 if (focus == 4)
226 stringinput_display (&begintimestring);
227 else if (focus == 5)
228 stringinput_display (&endtimestring);
229 else
230 move (0, 79);
231
232 refresh ();
233
234 in_ch = getch ();
235
236 switch (focus)
237 {
238 case 0: /* filtlist */
239 if (scrollmenu_stdkeys (in_ch, filtlist) >= 0)
240 {
241 if (selectedfilts->number < MAX_FILTERS)
242 {
243 selectedfilts->items[number_of_filters] =
244 filtlist->items[filtlist->selected];
245 filter_type[number_of_filters] =
246 filtnumbers[filtlist->selected];
247 parampointerarray[number_of_filters] =
248 (parampointer_t) malloc (
249 sizeof (param_t));
250 param_defaults (
251 parampointerarray[number_of_filters],
252 filtnumbers[filtlist->selected]);
253 number_of_filters++;
254 selectedfilts->number = number_of_filters;
255 selectedfilts->selected = number_of_filters - 1;
256 }
257 else
258 error_window ("The maximum number of filters has been \
259 reached. No more filters can be added.");
260 }
261 else
262 switch (in_ch)
263 {
264 case KEY_LEFT:
265 focus--;
266 break;
267 case KEY_RIGHT:
268 focus++;
269 break;
270 }
271 break;
272
273 case 1: /* selectedfilts */
274 if (scrollmenu_stdkeys (in_ch, selectedfilts) >= 0)
275 {
276 if (number_of_filters > 0)
277 ;
278 param_screen (
279 parampointerarray[selectedfilts->selected],
280 filter_type[selectedfilts->selected]);
281 }
282 else
283 switch (in_ch)
284 {
285 case 'u':
286 case 'U':
287 if (selectedfilts->selected > 0)
288 {
289 helpcharptr = selectedfilts->items[
290 selectedfilts->selected - 1];
291 selectedfilts->items[selectedfilts->selected - 1] =
292 selectedfilts->items[selectedfilts->selected];
293 selectedfilts->items[selectedfilts->selected] =
294 helpcharptr;
295
296 helpint = filter_type[selectedfilts->selected - 1];
297 filter_type[selectedfilts->selected - 1] =
298 filter_type[selectedfilts->selected];
299 filter_type[selectedfilts->selected] =
300 helpint;
301
302 helpparampointer = parampointerarray[
303 selectedfilts->selected - 1];
304 parampointerarray[selectedfilts->selected - 1] =
305 parampointerarray[selectedfilts->selected];
306 parampointerarray[selectedfilts->selected] =
307 helpparampointer;
308
309 selectedfilts->selected--;
310 }
311 break;
312
313 case 'd':
314 case 'D':
315 if (selectedfilts->selected <
316 number_of_filters - 1)
317 {
318 helpcharptr = selectedfilts->items[
319 selectedfilts->selected + 1];
320 selectedfilts->items[selectedfilts->selected + 1] =
321 selectedfilts->items[selectedfilts->selected];
322 selectedfilts->items[selectedfilts->selected] =
323 helpcharptr;
324
325 helpint = filter_type[selectedfilts->selected + 1];
326 filter_type[selectedfilts->selected + 1] =
327 filter_type[selectedfilts->selected];
328 filter_type[selectedfilts->selected] =
329 helpint;
330
331 helpparampointer = parampointerarray[
332 selectedfilts->selected + 1];
333 parampointerarray[selectedfilts->selected + 1] =
334 parampointerarray[selectedfilts->selected];
335 parampointerarray[selectedfilts->selected] =
336 helpparampointer;
337
338 selectedfilts->selected++;
339 }
340 break;
341
342 case KEY_BACKSPACE:
343 case 127:
344 case 'r':
345 case 'R':
346 if (number_of_filters > 0)
347 {
348 free (parampointerarray[selectedfilts->selected]);
349
350 for (i = selectedfilts->selected;
351 i < number_of_filters - 1; i++)
352 {
353 selectedfilts->items[i] =
354 selectedfilts->items[i + 1];
355
356 filter_type[i] = filter_type[i + 1];
357
358 parampointerarray[i] =
359 parampointerarray[i + 1];
360 }
361 number_of_filters--;
362 selectedfilts->number = number_of_filters;
363 }
364 break;
365
366 case KEY_LEFT:
367 focus--;
368 break;
369 case KEY_RIGHT:
370 focus++;
371 break;
372 }
373 break;
374
375 case 2: /* Use tracksplitting data */
376 switch (in_ch)
377 {
378 case KEY_ENTER:
379 case 13:
380 case ' ':
381 case 'x':
382 case 'X':
383 *usetracktimes = 1 - *usetracktimes;
384 if (*usetracktimes)
385 *usebeginendtime = 0;
386 break;
387
388 case KEY_LEFT:
389 case KEY_UP:
390 focus--;
391 break;
392 case KEY_RIGHT:
393 case KEY_DOWN:
394 focus++;
395 break;
396 }
397 break;
398
399 case 3: /* Use begin/end times */
400 switch (in_ch)
401 {
402 case KEY_ENTER:
403 case 13:
404 case ' ':
405 case 'x':
406 case 'X':
407 *usebeginendtime = 1 - *usebeginendtime;
408 if (*usebeginendtime)
409 *usetracktimes = 0;
410 break;
411
412 case KEY_LEFT:
413 case KEY_UP:
414 focus--;
415 break;
416 case KEY_RIGHT:
417 case KEY_DOWN:
418 focus++;
419 break;
420 }
421 break;
422
423 case 4: /* begin time */
424 stringinput_stdkeys (in_ch, &begintimestring);
425 switch (in_ch)
426 {
427 case KEY_ENTER:
428 case 13:
429 strcpy (tempstring, begintimestring.string);
430 if (!hmsf2fsec (tempstring, &tempdouble))
431 {
432 error_window ("Enter the time in the format hours:\
433 minutes:seconds.fractions, for example 0:04:26.740");
434 begintimestring.cursorpos =
435 strlen (begintimestring.string);
436 }
437 else
438 {
439 *begintime = tempdouble;
440 fsec2hmsf (tempdouble, begintimestring.string);
441 begintimestring.cursorpos =
442 strlen (begintimestring.string);
443 focus++;
444 }
445 break;
446
447 case KEY_UP:
448 focus--;
449 break;
450 case KEY_DOWN:
451 focus++;
452 break;
453 }
454 break;
455
456 case 5: /* end time */
457 stringinput_stdkeys (in_ch, &endtimestring);
458 switch (in_ch)
459 {
460 case KEY_ENTER:
461 case 13:
462 strcpy (tempstring, endtimestring.string);
463 if (!hmsf2fsec (tempstring, &tempdouble))
464 {
465 error_window ("Enter the time in the format hours:\
466 minutes:seconds.fractions, for example 0:04:26.740");
467 endtimestring.cursorpos =
468 strlen (endtimestring.string);
469 }
470 else
471 {
472 *endtime = tempdouble;
473 fsec2hmsf (tempdouble, endtimestring.string);
474 endtimestring.cursorpos =
475 strlen (endtimestring.string);
476 focus = 8;
477 }
478 break;
479
480 case KEY_UP:
481 focus--;
482 break;
483 case KEY_DOWN:
484 focus++;
485 break;
486 }
487 break;
488
489
490 case 6: /* < Previous */
491 if (in_ch == KEY_ENTER || in_ch == 13)
492 {
493 returnval = 1;
494 dont_stop = FALSE;
495 }
496 else
497 switch (in_ch)
498 {
499 case KEY_LEFT:
500 case KEY_UP:
501 focus--;
502 break;
503 case KEY_RIGHT:
504 case KEY_DOWN:
505 focus++;
506 break;
507 }
508 break;
509
510 case 7: /* Cancel */
511 if (in_ch == KEY_ENTER || in_ch == 13)
512 {
513 returnval = 0;
514 dont_stop = FALSE;
515 }
516 else
517 switch (in_ch)
518 {
519 case KEY_LEFT:
520 case KEY_UP:
521 focus--;
522 break;
523 case KEY_RIGHT:
524 case KEY_DOWN:
525 focus++;
526 break;
527 }
528 break;
529
530 case 8: /* Next > */
531 if (in_ch == KEY_ENTER || in_ch == 13)
532 {
533 if (number_of_filters < 1)
534 {
535 error_window ("No filters have been selected.");
536 focus = 0;
537 break;
538 }
539
540 strcpy (tempstring, begintimestring.string);
541 if (!hmsf2fsec (tempstring, &tempdouble))
542 {
543 error_window ("Enter the begin time in the format hours:\
544 minutes:seconds.fractions, for example 0:04:26.740");
545 begintimestring.cursorpos =
546 strlen (begintimestring.string);
547 focus = 4;
548 break;
549 }
550
551 *begintime = tempdouble;
552
553 strcpy (tempstring, endtimestring.string);
554 if (!hmsf2fsec (tempstring, &tempdouble))
555 {
556 error_window ("Enter the end time in the format hours:\
557 minutes:seconds.fractions, for example 0:04:26.740");
558 endtimestring.cursorpos =
559 strlen (endtimestring.string);
560 focus = 5;
561 break;
562 }
563
564 *endtime = tempdouble;
565
566 if (*begintime > *endtime)
567 {
568 error_window ("The begin time is larger than the end time.");
569 fsec2hmsf (*begintime, begintimestring.string);
570 begintimestring.cursorpos =
571 strlen (begintimestring.string);
572 fsec2hmsf (*endtime, endtimestring.string);
573 endtimestring.cursorpos =
574 strlen (endtimestring.string);
575 focus = 4;
576 break;
577 }
578
579 returnval = 2;
580 dont_stop = FALSE;
581 }
582 else
583 switch (in_ch)
584 {
585 case KEY_LEFT:
586 case KEY_UP:
587 focus--;
588 break;
589 case KEY_RIGHT:
590 case KEY_DOWN:
591 focus++;
592 break;
593 }
594 break;
595
596 } /* switch(focus) */
597
598 if (in_ch == 9) /* TAB */
599 focus++;
600
601 if (in_ch == 27)
602 dont_stop = FALSE;
603
604 if (focus > 8)
605 focus -= 9;
606 if (focus < 0)
607 focus += 9;
608 }
609 while (dont_stop);
610
611 return returnval;
612 }
613