Subversion Repositories DIN Is Noise

Rev

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

Rev Author Line No. Line
964 jag 1
/*
2
* menu.cc
2302 jag 3
* DIN Is Noise is copyright (c) 2006-2025 Jagannathan Sampath
1713 jag 4
* DIN Is Noise is released under GNU Public License 2.0
1479 jag 5
* For more information, please visit https://dinisnoise.org/
964 jag 6
*/
7
 
8
#include "main.h"
9
#include "menu.h"
10
#include "ui_list.h"
11
#include "viewwin.h"
12
#include "din.h"
13
#include "keyboard_keyboard.h"
14
#include "mondrian.h"
15
#include "binaural_drones.h"
16
#include "tcl_interp.h"
17
#include "console.h"
18
#include "recorder.h"
19
#include "oscilloscope.h"
20
#include "ball.h"
1037 jag 21
#include "mesh.h"
1387 jag 22
#include "noiser.h"
1463 jag 23
#include "log.h"
1551 jag 24
#include "fft.h"
1757 jag 25
#include "file-utils.h"
1778 jag 26
#include "drawrrow.h"
1833 jag 27
#include "autorotator.h"
28
#include "autoflip.h"
29
#include "defvelaccel.h"
1897 jag 30
#include "color.h"
964 jag 31
#include <string>
32
#include <fstream>
1768 jag 33
 
2049 jag 34
#define DONT_MOUSE_WARP 0
35
 
964 jag 36
using namespace std;
37
 
38
extern int mousex, mousey;
39
extern beat2value octave_shift;
1473 jag 40
 
964 jag 41
extern std::string INSTRUMENT;
1450 jag 42
extern const char* INSTRUMENTS[];
1026 jag 43
extern int CURRENT_INSTRUMENT, LAST_INSTRUMENT, NUM_INSTRUMENTS;
1473 jag 44
 
964 jag 45
extern float VOICE_VOLUME;
46
extern int NUM_OCTAVES;
47
extern void setup_plugin_labels ();
48
extern oscilloscope scope;
49
extern const float PI_BY_180;
50
extern char BUFFER [];
1485 jag 51
extern int wheely;
964 jag 52
extern int line_height;
1438 jag 53
extern const char *ol_fixed_lbls [];
1551 jag 54
extern plugin_browser plugin__browser;
1436 jag 55
 
1677 jag 56
#define SECONDS " seconds"
1836 jag 57
#define DEGREES " degrees"
1677 jag 58
 
1450 jag 59
menu::menu () :
1688 jag 60
  diram (modulator::AM), dirfm (modulator::FM),
1450 jag 61
  bm_zoom_in(16), pb_zoom_in (16), bm_zoom_out(16), mb_zoom_out (16),
62
  abm_left (12), abm_right(12), abm_up(12), abm_down(12),
63
  abe_left (12), abe_right(12), abe_up(12), abe_down(12),
64
  abl_left (12, arrow_button::left), abl_right (12, arrow_button::right),
65
  gater_style_lis (ol_gater_style, "gr", " Style = "),
66
  am_style_lis (ol_am_style, "am", " AM style = "),
67
  fm_style_lis (ol_fm_style, "fm", " FM style = "),
68
  s_phrase_position (256, 16),
1468 jag 69
  td_tap_display (36),
70
  gc_top(0),
1472 jag 71
  gc_bottom(1)
72
  {
964 jag 73
  num_tabs = 0;
74
  am_depth = fm_depth = 0;
75
  dam_depth = dfm_depth = dam_bpm = dfm_bpm = 0;
1472 jag 76
 
964 jag 77
  cnl.id = 0;
78
  cnl.name = "Left Note";
79
  cnl.orient = mouse_slider_listener::X;
1472 jag 80
 
964 jag 81
  cnr.id = 1;
82
  cnr.name = "Right Note";
83
  cnr.orient = mouse_slider_listener::X;
1472 jag 84
 
964 jag 85
  arl.name = "Range Left";
86
  arl.orient = mouse_slider_listener::X;
1472 jag 87
 
964 jag 88
  arr.name = "Range Right";
89
  arr.orient = mouse_slider_listener::X;
1472 jag 90
 
964 jag 91
  arb.name = "Range Left & Right";
92
  arb.orient = mouse_slider_listener::Y;
1472 jag 93
 
964 jag 94
  rhl.name = "Range Height";
95
  rhl.orient = mouse_slider_listener::Y;
1461 jag 96
 
97
  s_phrase_position.sizer.visible = 1;
1680 jag 98
 
964 jag 99
}
100
 
101
void menu::setup_items () {
1450 jag 102
 
1489 jag 103
  b_close.visible = 0;
104
 
1449 jag 105
  button* inst_ed [] = {
2338 jag 106
    &b_keyboard_keyboard, // instruments 
964 jag 107
    &b_microtonal_keyboard,
108
    &b_mondrian,
109
    &b_binaural_drones,
1449 jag 110
    &b_microtonal_keyboard_waveform, // editors
964 jag 111
    &b_drone_waveform,
112
    &b_drone_modulation,
113
    &b_voice_modulation,
114
    &b_gater,
115
    &b_keyboard_keyboard_waveform,
116
    &b_attack,
117
    &b_decay,
118
    &b_midi_velocity,
119
    &b_delays,
120
    &b_octave_shift,
121
    &b_compressor,
122
    &b_morse_code,
123
    &b_mondrian_waveform,
124
    &b_mondrian_attack,
125
    &b_mondrian_decay,
126
    &b_binaural_drones_waveform,
127
    &b_range_modulation,
1026 jag 128
    &b_range_width_height,
1104 jag 129
    &b_range_pitch_vol,
1188 jag 130
    &b_point_modulation,
1404 jag 131
    &b_noise_interpolator,
1475 jag 132
    &b_drone_pend,
1883 jag 133
    &edlife2vel,
1449 jag 134
  };
1472 jag 135
 
136
  // all other menu items
1449 jag 137
  widget* mi [] = {
964 jag 138
    &b_exit_din,
139
    &l_octave_shift,
140
    &ab_octave_down,
141
    &ab_octave_up,
142
    &sp_octave_shift_bpm,
143
    &sp_gater_bpm,
144
    &sp_voice_volume,
145
    &cb_show_anchors,
146
    &sp_change_drone_handle_size,
147
    &sp_change_drone_trail_length,
148
    &sp_am_depth,
149
    &sp_fm_depth,
150
    &sp_am_bpm,
151
    &sp_fm_bpm,
152
    &cb_instrument,
153
    &cb_editors,
1449 jag 154
    &cb_mkb_drone_params,
964 jag 155
    &cb_file,
156
    &ol_gater_style,
157
    &l_gater,
158
    &ol_am_style,
159
    &ol_fm_style,
160
    &cb_mkb_drone_tools,
1674 jag 161
    &ol_add_wand,
1984 jag 162
    &moverailstrafe,
964 jag 163
    &b_delete_drones,
164
    &b_select_all_drones,
165
    &b_invert_drone_selection,
166
    &b_record_phrase,
167
    &b_clear_phrases,
168
    &l_phrase_position,
169
    &s_phrase_position,
170
    &ol_set_range,
171
    &b_default_to_selected,
1403 jag 172
    &b_default_to_all,
173
    &b_selected_to_all,
964 jag 174
    &b_key_to_pitch_at_cursor,
175
    &cb_scope,
176
    &sp_scope_height,
177
    &sp_scope_samples,
178
    &l_tap_bpm,
179
    &td_tap_display,
180
    &l_tap_bpm_value,
181
    &cb_am,
182
    &cb_fm,
183
    &cb_gater,
184
    &cb_octave_shift,
185
    &cb_auto_reset,
186
    &cb_ed_tools,
187
    &abe_left,
188
    &abe_right,
189
    &abe_up,
190
    &abe_down,
191
    &b_close,
1901 jag 192
    &b_snapx,
193
    &b_snapy,
194
    &b_snapboth,
195
    &b_snapnone,
964 jag 196
    &l_snap,
197
    &pb_zoom_in,
198
    &mb_zoom_out,
199
    &b_insert_vertex,
200
    &b_delete_vertex,
201
    &b_fold_tangents,
1128 jag 202
    &ol_mirror,
964 jag 203
    &ol_mirror_tangents,
1128 jag 204
    &cb_selection_only,
964 jag 205
    &b_undo,
206
    &b_redo,
207
    &b_copy,
208
    &b_paste,
209
    &b_draw_replacement_curve,
210
    &l_library,
211
    &abl_left,
212
    &abl_right,
213
    &lf_curve_name,
214
    &b_add_curve,
215
    &b_replace_curve,
216
    &b_delete_curve,
217
    &l_capture,
218
    &b_start_capture,
219
    &b_assign_capture,
220
    &cb_label_vertices,
221
    &cb_show_waveform_samples,
2039 jag 222
    &crvwav.hz,
964 jag 223
    &b_pick_curve,
224
    &sp_curve_limit,
2039 jag 225
    &crvwav.periods,
964 jag 226
    &ol_curve_style,
227
    &sp_curve_rpm,
228
    &b_stop_rotating,
229
    &cb_draw_curve,
230
    &cb_record,
231
    &b_clear_record,
232
    &lf_file,
233
    &b_save,
234
    &b_select_attractees,
235
    &b_select_attractors,
236
    &b_orbit_selected_drones,
237
    &cb_show_vel,
238
    &cb_show_accel,
239
    &sp_change_drone_vel,
240
    &sp_change_drone_accel,
241
    &cb_show_gravity,
1827 jag 242
    &balloon,
964 jag 243
    &sp_rotate_drone_vel,
244
    &sp_drones_per_min,
245
    &b_launch_drones,
246
    &b_stop_launching_drones,
1098 jag 247
    &ol_create_this,
964 jag 248
    &sp_mesh_rows,
249
    &sp_mesh_cols,
250
    &b_track_drones,
251
    &b_select_tracked_drones,
252
    &sp_bounces,
253
    &sp_rebound,
254
    &b_add_balls,
255
    &b_move_selected_balls,
256
    &b_delete_selected_targets,
257
    &b_delete_all_targets,
258
    &b_select_all_targets,
259
    &b_invert_selected_targets,
260
    &b_select_targets_in_box,
261
    &b_split_horizontal,
262
    &b_split_vertical,
263
    &b_delete_box,
264
    &sp_mondrian_min_voices,
265
    &sp_mondrian_change_attack_time,
266
    &sp_mondrian_change_decay_time,
267
    &sp_mondrian_change_speed,
268
    &b_freeze_balls,
269
    &b_thaw_balls,
270
    &abm_left,
271
    &abm_right,
272
    &abm_up,
273
    &abm_down,
274
    &bm_zoom_in,
275
    &bm_zoom_out,
276
    &b_turn_off_ui,
277
    &b_set_targets,
278
    &b_clear_targets,
279
    &sp_drone_lifetime,
280
    &sp_orbit_insertion_time,
281
    &b_clear_modulations,
282
    &b_modulate_balls_up,
283
    &b_modulate_balls_down,
284
    &cb_binaural_drones_tools,
285
    &lf_master_volume,
286
    &sp_bd_separation,
287
    &b_create_binaurals_on_notes,
288
    &b_create_binaurals_from_pitch,
289
    &lf_bd_start_pitch,
290
    &sp_bd_pairs,
291
    &lf_bd_spacing,
292
    &cb_close_octave,
293
    &lf_vol_fade_time,
294
    &sp_mondrian_change_dir,
295
    &sp_mondrian_change_trail_size,
296
    &sp_mondrian_change_note_poly_points,
297
    &sp_mondrian_change_note_poly_radius,
298
    &b_auto_change_direction_clockwise,
299
    &b_stop_auto_changing_direction,
300
    &b_auto_change_direction_anti_clockwise,
301
    &b_flip_direction,
302
    &b_make_random_color,
303
    &ol_justification,
304
    &cb_resize_separation,
305
    &ol_key_note,
306
    &b_add_remove_slits,
307
    &b_select_wreckers,
308
    &b_select_healers,
309
    &b_switch_ball_type,
310
    &b_toggle_wreckers,
311
    &b_toggle_healers,
312
    &b_toggle_bouncers,
313
    &sp_mondrian_change_slit_size,
314
    &b_remove_slits_on_edge,
315
    &b_toggle_slit_anim,
316
    &cb_mondrian_auto_adjust_voices,
317
    &sp_mondrian_change_vol,
318
    &cb_draw_boxes,
319
    &cb_fill_boxes,
320
    &cb_draw_notes,
321
    &cb_label_notes,
322
    &ol_ball_types,
323
    &ol_split_types_h,
324
    &ol_split_types_v,
325
    &sp_mondrian_num_boxes,
326
    &b_make_note_grid,
327
    &b_make_nxn_grid,
328
    &b_delete_all_boxes,
329
    &cb_mkb_voice,
330
    &cb_mkb_misc,
331
    &b_select_launchers,
1812 jag 332
    &seloncre,
964 jag 333
    &b_freeze_drones,
334
    &b_thaw_drones,
335
    &sp_dam_depth,
336
    &sp_dfm_depth,
337
    &sp_dam_bpm,
338
    &sp_dfm_bpm,
1430 jag 339
    &b_scale_drones,
340
    &b_rotate_drones,
964 jag 341
    &ol_selection_targets,
342
    &sp_mondrian_change_slit_anim_time,
343
    &cb_mark_segments,
344
    &cb_auto_split_box,
345
    &cb_auto_delete_box,
346
    &sp_auto_split_time,
347
    &sp_auto_delete_time,
348
    &ol_auto_pick_box_split,
349
    &ol_auto_split_at,
350
    &ol_auto_split_orient,
351
    &ol_auto_pick_box_delete,
352
    &sp_min_split_size,
353
    &cb_speed,
354
    &cb_turn,
355
    &cb_teleport,
356
    &sp_turn_every,
357
    &sp_turn_min,
358
    &sp_turn_max,
359
    &sp_speed_every,
360
    &sp_speed_min,
361
    &sp_speed_max,
362
    &sp_max_speed,
363
    &sp_tel_every,
364
    &sp_tel_radius,
365
    &cb_draw_ball_position,
366
    &cb_draw_ball_heading,
367
    &cb_draw_ball_trails,
368
    &l_draw_ball,
369
    &cb_turn_sync,
370
    &cb_speed_sync,
371
    &sp_clone_every,
372
    &sp_max_clones,
373
    &sp_clone_offset,
374
    &sp_max_balls,
375
    &cb_clone,
376
    &cb_clone_can_clone,
377
    &ol_browse_balls,
378
    &cb_mon_tools,
379
    &cb_mon_parameters,
380
    &cb_mon_ballops,
381
    &cb_mon_boxops,
382
    &cb_mon_misc,
383
    &cb_transform,
384
    &sp_transform_every,
385
    &ol_bouncer,
386
    &ol_healer,
387
    &ol_wrecker,
388
    &cb_label_hz_vol,
389
    &il_binaural_drones,
390
    &cb_binaural_drones_edit,
391
    &bbd_select_all,
392
    &bbd_select_none,
393
    &bbd_invert_select,
394
    &bbd_delete,
395
    &bbd_sync,
396
    &lf_pitch_fade_time,
397
    &lf_modulation_amount,
398
    &bd_modulate_up,
399
    &bd_modulate_down,
400
    &bbd_modulate,
401
    &bbd_select2,
402
    &ol_select_what,
403
    &ol_select_rule,
404
    &bdf_value,
405
    &lf_l,
406
    &lf_r,
407
    &lf_sep,
408
    &lf_vol,
409
    &ol_just,
410
    &bbd_flip,
411
    &b_adjust_board_height,
412
    &b_adjust_range_left,
413
    &b_adjust_range_right,
414
    &b_adjust_range_both,
415
    &sp_snap_left,
416
    &sp_snap_right,
417
    &ol_bounce_style,
418
    &cb_mod_ran,
419
    &sp_range,
420
    &sp_ran_mod_width,
421
    &sp_ran_mod_width_bpm,
422
    &cb_mark_ran,
423
    &l_ran_mod,
424
    &b_rm_pause_resume,
425
    &b_rm_start_all,
426
    &b_rm_stop_all,
427
    &b_rm_toggle,
428
    &b_get_cur_ran,
429
    &ol_snap_style,
430
    &sp_ran_mod_height,
431
    &sp_ran_mod_height_bpm,
432
    &cb_mkb_ranges,
433
    &l_adjust_range,
434
    &l_adjust_height,
435
    &b_adjust_range_height,
1768 jag 436
    &dronearrow.shoulder.position,
437
    &dronearrow.shoulder.width,
964 jag 438
    &l_drone_arrow,
439
    &sp_default_width,
440
    &sp_default_height,
441
    &b_change_note_left,
442
    &b_change_note_right,
443
    &ol_change_note_style,
444
    &ol_set_unset_toggle,
445
    &b_set,
446
    &b_unset,
447
    &b_toggle,
1037 jag 448
    &sp_browse_drone,
449
    &ol_drone_order,
450
    &l_drone_order,
451
    &ol_mesh_point,
1040 jag 452
    &f_mesh_xy,
453
    &cb_sync_rows_cols,
1049 jag 454
    &sp_mesh_dur,
455
    &b_flip_rows_cols,
1551 jag 456
    &cb_overlay,
1598 jag 457
    &dp_numdrones,
1096 jag 458
    &dp_bpm1,
1104 jag 459
    &dp_orient,
1137 jag 460
    &b_swap_curves,
461
    &cb_pitch_dis,
1140 jag 462
    &cb_vol_dis,
1144 jag 463
    &sp_lev_sz,
1397 jag 464
    &ol_change_note,
1235 jag 465
    &b_change_note_both,
1320 jag 466
    &sp_drone_master_vol,
1321 jag 467
    &l_use_drone_pend,
1320 jag 468
    &sp_drones_per_pend,
469
    &l_apply_to,
470
    &cb_am_bpm,
471
    &cb_fm_bpm,
472
    &b_set_to_mesh_rows,
1323 jag 473
    &b_set_to_mesh_cols,
1423 jag 474
    &ol_drone_is,
1429 jag 475
    &b_ball_trig,
1436 jag 476
    &ol_fixed,
1438 jag 477
    &cb_draw_mesh,
1467 jag 478
    &lf_conn_steps,
1461 jag 479
    &s_red_min,
480
    &s_green_min,
481
    &s_blue_min,
482
    &s_red_max,
483
    &s_green_max,
484
    &s_blue_max,
1463 jag 485
    &cb_conn_wrap,
1465 jag 486
    &separators.main,
1470 jag 487
    &separators.dp0,
1465 jag 488
    &cb_modulation,
489
    &cb_motion,
1467 jag 490
    &cb_visual,
491
    &b_connect,
1468 jag 492
    &b_disconnect,
1470 jag 493
    &ol_color,
494
    &separators.dp1,
1498 jag 495
    &b_abort_octave_shift,
1499 jag 496
    &sp_stiff,
1514 jag 497
    &b_arrow_reset,
1547 jag 498
    &b_mute,
499
    &b_unmute,
1819 jag 500
    &gabt,
1552 jag 501
    &sp_drone_vol,
1557 jag 502
    &drone2noise,
503
    &noise2drone,
1666 jag 504
    &b_set_xform_center,
1772 jag 505
    &autorotate.title,
506
    &autorotate.whichl,
507
    &autorotate.start,
508
    &autorotate.stop,
509
    &autorotate.toggle,
510
    &autorotate.clockwise,
511
    &autorotate.anticlockwise,
512
    &autorotate.rpm,
1675 jag 513
    &cb_defaults,
514
    &sp_wand_dist,
515
    &ol_drones_are,
1828 jag 516
    &riset,
517
    &fallt,
1677 jag 518
    &lifetime,
519
    &mortalize,
520
    &reincarnate,
521
    &immortalize,
1688 jag 522
    &diram.vert,
1682 jag 523
    &diram.hor,
524
    &diram.vel,
525
    &diram.accel,
1688 jag 526
    &dirfm.vert,
1682 jag 527
    &dirfm.hor,
528
    &dirfm.vel,
529
    &dirfm.accel,
530
    &diram.lbl,
531
    &dirfm.lbl,
1695 jag 532
    &cb_chuck,
533
    &chuck,
1697 jag 534
    &chspeed,
1695 jag 535
    &chflip,
1697 jag 536
    &chtog,
1695 jag 537
    &chlen,
1705 jag 538
    &chapt,
1702 jag 539
    &chtrail,
1708 jag 540
    &handlesize,
1715 jag 541
    &sva.lbl,
542
    &sva.whats,
1764 jag 543
    &sva.neg,
544
    &sva.zero,
1715 jag 545
    &sva.vert,
546
    &sva.hor,
547
    &sva.vel,
548
    &sva.accel,
1772 jag 549
    &autorotate.autoflip.lbl,
550
    &autorotate.autoflip.angle,
551
    &autorotate.autoflip.set,
552
    &autorotate.autoflip.unset,
553
    &autorotate.autoflip.toggle,
1836 jag 554
    &dva.whichl,\
1732 jag 555
    &dva.ldir,\
556
    &dva.odir,\
557
    &dva.neg,\
558
    &dva.randomize,\
1738 jag 559
    &dva.mag,\
1894 jag 560
    &dva.anticlockwise,\
1738 jag 561
    &dva.clockwise,\
1748 jag 562
    &choutline,
563
    &chautoresettrails,
1753 jag 564
    &anchored,
1756 jag 565
    &trailsize,
1804 jag 566
    &dronearrow.neck,
1768 jag 567
    &dronearrow.cap,
1773 jag 568
    &dronearrow.decap,
569
    &autorotate.deg,
570
    &autorotate.tps,
1807 jag 571
    &autorotate.mov,
1774 jag 572
    &autorotate.smooth,
573
    &autorotate.tick,
1776 jag 574
    &dronearrowdefaults.lbl,
1804 jag 575
    &dronearrowdefaults.neck,
1805 jag 576
    &dronearrowdefaults.shoulder.position,
1776 jag 577
    &dronearrowdefaults.shoulder.width,
578
    &dronearrowdefaults.cap,
1778 jag 579
    &dronearrowdefaults.arrow,
1797 jag 580
    &trackcon,
1806 jag 581
    &dva.autorotate.cb,
582
    &dva.autorotate.mov,
583
    &dva.autorotate.dir,
584
    &dva.autorotate.rpm,
585
    &dva.autorotate.dps,
586
    &dva.autorotate.tps,
587
    &dva.autoflip.cb,
588
    &dva.autoflip.deg,
2032 jag 589
    &vel0,
590
    &accel0,
1836 jag 591
    &dva.sync,
1851 jag 592
    &gens,
2106 jag 593
    &ddpm,
1871 jag 594
    &dva.autorotate.uet.deg,
595
    &dva.autorotate.uet.tps,
1892 jag 596
    &ddpl,
1893 jag 597
    &dpl,
1912 jag 598
    &sp_dam_pos,
599
    &sp_dfm_pos,
1913 jag 600
    &am2fm,
601
    &fm2am,
1920 jag 602
    &scopacity,
1941 jag 603
    &cb_ed_curves,
1950 jag 604
    &ed_flip_rotation,
605
    &cb_ed_autoflip,
606
    &sp_curve_every,
607
    &ed_autoflip_reset,
1970 jag 608
    &dva.autopause.cb,
609
    &dva.autopause.every,
610
    &dva.autopause.f0r,
1972 jag 611
    &autorotate.autopause.lbl,
612
    &autorotate.autopause.set,
613
    &autorotate.autopause.unset,
614
    &autorotate.autopause.toggle,
1973 jag 615
    &autorotate.autopause.every,
616
    &autorotate.autopause.f0r,
1976 jag 617
    &autorotate.rndflipause.whichl,
618
    &autorotate.rndflipause.set,
619
    &autorotate.rndflipause.unset,
620
    &autorotate.rndflipause.toggle,
1998 jag 621
    &damd0,
622
    &dfmd0,
2038 jag 623
    &dva.autopause.tar,
624
    &masvol0,
2039 jag 625
    &crvwav.time,
2049 jag 626
    &texture,
627
    &texstep,
628
    &text_ure,
2060 jag 629
    &revmod,
2076 jag 630
    &sva.perp,
2077 jag 631
    &rotaccel,
2078 jag 632
    &rdvel,
633
    &rdaccel,
2125 jag 634
    &size_tangent,
2126 jag 635
    &draweditables,
2206 jag 636
    &track_phrase_position,
2222 jag 637
    &viewtoo,
638
    &drawsnaps,
639
    &drawcursor,
2219 jag 640
    &pinunpin,
2273 jag 641
    &sep_bin,
2276 jag 642
    &sep0,
2306 jag 643
    &ancopa,
1677 jag 644
    // next item here
964 jag 645
  };
646
 
2078 jag 647
 
1449 jag 648
  int ii = 0;
1450 jag 649
  for (int i = 0; i < NUM_INSTRUMENTS; ++i) {
1449 jag 650
    button* ei = inst_ed[i];
1450 jag 651
    ei->id = i;
1645 jag 652
#ifndef __WIDGET_MOVE__
1472 jag 653
    ei->set_listener (&insl);
1645 jag 654
#endif
1449 jag 655
    items[ii++] = ei;
656
  }
1450 jag 657
  for (int i = NUM_INSTRUMENTS; i < n_inst_ed; ++i) {
658
    button* ei = inst_ed[i];
1502 jag 659
    ei->id = i + 1; // as 0 is instrument
1645 jag 660
#ifndef __WIDGET_MOVE__
1472 jag 661
    ei->set_listener (&edl);
1645 jag 662
#endif
1450 jag 663
    items[ii++] = ei;
664
  }
1472 jag 665
 
1757 jag 666
  for (int i = n_inst_ed, j = 0; i < nitems; ++i) items[ii++] = mi[j++];
1449 jag 667
 
1568 jag 668
  dlog << "+++ Items list setup +++ " << endl;
669
 
1645 jag 670
#ifndef __WIDGET_MOVE__
1321 jag 671
  {
1477 jag 672
    button* btns [] = {&b_set_to_mesh_rows, &b_set_to_mesh_cols, &b_set, &b_unset, &b_toggle};
673
    click_listener* cl [] = {&stmrl, &stmcl, &sutl, &sutl, &sutl};
1321 jag 674
    checkbutton* cbtns [] = {&cb_am_bpm, &cb_fm_bpm};
675
    state_listener* sl [] = {&abl, &fbl};
1477 jag 676
    for (int i = 0; i < 5; ++i) btns[i]->set_listener (cl[i]);
1449 jag 677
    for (int i = 0; i < 2; ++i) cbtns[i]->set_listener (sl[i]);
1323 jag 678
 
1321 jag 679
  }
1645 jag 680
#endif
1321 jag 681
 
964 jag 682
  // tabs
683
  num_tabs = 0;
1393 jag 684
  last_tab = next_tab = cur_tab = 0;
1406 jag 685
  next_tab_instr = 0;
1473 jag 686
  checkbutton* cb_tabs [] = {
687
    &cb_file,
688
    &cb_instrument,
689
    &cb_editors,
690
    &cb_mkb_voice,
691
    &cb_mkb_drone_tools,
692
    &cb_mkb_drone_params,
693
    &cb_mkb_ranges,
694
    &cb_mkb_misc,
964 jag 695
    &cb_ed_tools,
1473 jag 696
    &cb_mon_tools,
697
    &cb_mon_parameters,
698
    &cb_mon_ballops,
699
    &cb_mon_boxops,
700
    &cb_mon_misc,
964 jag 701
    &cb_binaural_drones_tools,
702
    &cb_binaural_drones_edit,
1941 jag 703
    &cb_ed_curves,
964 jag 704
  };
1319 jag 705
 
1473 jag 706
  static const char* const cb_tab_lbls [] = {
707
    "File",
708
    "Instrument",
709
    "Editors",
710
    "Voice",
711
    "Drone Tools",
712
    "Drone Params",
713
    "Ranges",
714
    "Misc",
964 jag 715
    "Tools",
1473 jag 716
    "Tools",
717
    "Params",
718
    "Ball Ops",
719
    "Box Ops",
720
    "Misc",
964 jag 721
    "Create",
1941 jag 722
    "Edit",
723
    "Curves",
964 jag 724
  };
1319 jag 725
 
1941 jag 726
  for (int i = 0; i < 17; ++i) {
1473 jag 727
    checkbutton* ci = cb_tabs[i];
728
    ci->set_text (cb_tab_lbls[i]);
729
    ci->set_listener (this);
964 jag 730
  }
731
 
732
  widget* wfile [] = {
1319 jag 733
    &b_exit_din,
964 jag 734
    &cb_record,
735
    &b_clear_record,
736
    &b_save,
1319 jag 737
    &lf_file,
964 jag 738
    &b_turn_off_ui,
739
    &cb_scope,
740
    &sp_scope_height,
1920 jag 741
    &sp_scope_samples,
742
    &scopacity,
1319 jag 743
  };
744
 
1645 jag 745
#ifndef __WIDGET_MOVE__
964 jag 746
  cb_record.set_listener (&recl);
747
  b_clear_record.set_listener (&recl);
748
  b_save.set_listener (&recl);
1319 jag 749
  b_exit_din.set_listener (&miscl);
750
  b_turn_off_ui.set_listener (&miscl);
1645 jag 751
  lf_file.fld.typing_lsnr = &recl;
752
#endif
1319 jag 753
 
964 jag 754
  lf_file.fld.set_text ("din.wav");
755
  lf_file.lbl.set_text ("File on Desktop?");
756
 
757
  widget* winst [] = {
758
    &b_microtonal_keyboard,
759
    &b_keyboard_keyboard,
760
    &b_mondrian,
761
    &b_binaural_drones
762
  };
763
 
764
  widget* weds [] = {
1931 jag 765
    &b_keyboard_keyboard_waveform,
766
    &b_attack,
767
    &b_decay,
768
    &b_midi_velocity,
964 jag 769
    &b_microtonal_keyboard_waveform,
770
    &b_drone_waveform,
771
    &b_drone_modulation,
772
    &b_voice_modulation,
773
    &b_range_modulation,
1026 jag 774
    &b_range_width_height,
1104 jag 775
    &b_range_pitch_vol,
964 jag 776
    &b_gater,
1930 jag 777
    &b_point_modulation,
778
    &b_drone_pend,
779
    &edlife2vel,
964 jag 780
    &b_mondrian_waveform,
781
    &b_mondrian_attack,
782
    &b_mondrian_decay,
783
    &b_binaural_drones_waveform,
784
    &b_delays,
785
    &b_octave_shift,
786
    &b_compressor,
787
    &b_morse_code,
1941 jag 788
    &b_noise_interpolator,
964 jag 789
  };
790
 
791
  widget* wvoice [] = {
792
    &sp_voice_volume,
793
    &b_record_phrase,
794
    &b_clear_phrases,
795
    &s_phrase_position,
796
    &l_phrase_position,
2206 jag 797
    &track_phrase_position,
964 jag 798
    &sp_am_depth,
799
    &sp_fm_depth,
800
    &sp_am_bpm,
801
    &sp_fm_bpm,
802
    &ol_am_style,
1438 jag 803
    &ol_fm_style,
964 jag 804
  };
805
 
1645 jag 806
#ifndef __WIDGET_MOVE__
964 jag 807
  for (int i = 1; i < 3; ++i) static_cast<button*>(wvoice[i])->set_listener (&pcl); // phrase commands listener
1645 jag 808
#endif
964 jag 809
 
810
  widget* wdrone_tools [] = {
1674 jag 811
    &ol_add_wand,
964 jag 812
    &b_delete_drones,
813
    &b_select_all_drones,
814
    &b_invert_drone_selection,
815
    &b_orbit_selected_drones,
816
    &b_select_attractees,
817
    &b_select_attractors,
818
    &b_launch_drones,
819
    &b_stop_launching_drones,
820
    &b_track_drones,
821
    &b_select_tracked_drones,
822
    &b_set_targets,
823
    &b_clear_targets,
824
    &b_select_launchers,
825
    &b_freeze_drones,
826
    &b_thaw_drones,
1049 jag 827
    &b_flip_rows_cols,
1098 jag 828
    &ol_create_this,
964 jag 829
    &sp_mesh_rows,
830
    &sp_mesh_cols,
1037 jag 831
    &sp_browse_drone,
832
    &ol_drone_order,
833
    &l_drone_order,
1046 jag 834
    &cb_sync_rows_cols,
1049 jag 835
    &sp_mesh_dur,
1598 jag 836
    &dp_numdrones,
1096 jag 837
    &dp_bpm1,
1320 jag 838
    &dp_orient,
1321 jag 839
    &l_use_drone_pend,
1320 jag 840
    &cb_am_bpm,
841
    &cb_fm_bpm,
842
    &sp_drones_per_pend,
843
    &l_apply_to,
844
    &b_set_to_mesh_rows,
845
    &b_set_to_mesh_cols,
1984 jag 846
    &moverailstrafe,
1496 jag 847
    &b_scale_drones,
848
    &b_rotate_drones,
1512 jag 849
    &b_connect,
850
    &b_disconnect,
851
    &lf_conn_steps,
852
    &cb_conn_wrap,
1547 jag 853
    &b_mute,
854
    &b_unmute,
1819 jag 855
    &gabt,
1557 jag 856
    &drone2noise,
857
    &noise2drone,
1666 jag 858
    &b_set_xform_center,
1677 jag 859
    &mortalize,
860
    &reincarnate,
861
    &immortalize,
1797 jag 862
    &chuck,
863
    &trackcon,
1827 jag 864
    &balloon,
865
    &b_set,\
866
    &b_unset,\
867
    &b_toggle,\
868
    &ol_set_unset_toggle,\
964 jag 869
  };
1320 jag 870
 
1686 jag 871
  LISTEN(ol_add_wand,&awdl)
872
  LISTEN(ol_add_wand.option,&dcl)
873
  LISTEN(ol_drones_are, &darl)
1675 jag 874
 
1645 jag 875
#ifndef __WIDGET_MOVE__
1473 jag 876
  LISTEN(b_scale_drones,&bsdl)
877
  LISTEN(b_rotate_drones,&brdl)
1984 jag 878
  LISTEN(moverailstrafe, &mrsl)
879
  LISTEN(moverailstrafe.option, &bmdl)
1827 jag 880
  LISTEN(balloon,&dugl)
1547 jag 881
  LISTEN(b_mute,&mul)
882
  LISTEN(b_unmute,&umul)
1557 jag 883
  LISTEN(drone2noise,&d2nl)
884
  LISTEN(noise2drone,&n2dl)
1812 jag 885
  LISTEN(seloncre,&dcl);
1646 jag 886
  LISTEN(cb_conn_wrap, &wrapl)
887
  LISTEN(b_connect, &bconl)
888
  LISTEN(b_disconnect, &bdconl)
1666 jag 889
  LISTEN(b_set_xform_center, &xcl);
1677 jag 890
  LISTEN(mortalize,&morl)
891
  LISTEN(immortalize,&immorl)
892
  LISTEN(reincarnate,&reinl)
1695 jag 893
  LISTEN(chuck, &chl)
894
  LISTEN(chflip,&flpl)
1697 jag 895
  LISTEN(chtog,&ctogl)
1749 jag 896
  LISTEN(chautoresettrails,&aurl)
1645 jag 897
#endif
1646 jag 898
 
1986 jag 899
  raill1.name = "Rail";
900
  strafel1.name = "Strafe";
901
 
1619 jag 902
  sp_stiff.set ("Connection stiffness", 0.001f, 0.0f, 1.0f, &stiffl);
2306 jag 903
  ancopa.set ("Opacity", 0.01f, 0.0f, 1.0f, &anchl);
904
 
1819 jag 905
  gabt.set (0.1f, 0, MILLION, &gabtl);
906
  gabt.set_text ("In", SECONDS);
1485 jag 907
  sp_drones_per_pend.set ("Drones Per Pendulum", 1, 2, MILLION, &dppl, 0);
1321 jag 908
  l_use_drone_pend.set_text ("Drone Pendulum's parameters?");
1320 jag 909
  l_apply_to.set_text ("Apply to");
910
 
1686 jag 911
  DECL_DRONE_PARAMS
1645 jag 912
 
1686 jag 913
  ol_drone_is.set_listener (this);
914
  diram.setup ("Set AM direction to: ");
915
  dirfm.setup ("Set FM direction to: ");
2105 jag 916
 
2106 jag 917
  sp_wand_dist.set ("Wand distance", 1, 0, MILLION, &wandl);
2105 jag 918
  riset.set ("Rise time", 0.1f, 0, MILLION, &rl);
919
  fallt.set ("Fall time", 0.1f, 0, MILLION, &fl);
920
  lifetime.set ("Lifetime", 0.1f, 0, MILLION, &lifel);
2106 jag 921
  handlesize.set ("Handle size", 1, 0, MILLION, &handl);
922
  trailsize.set ("Trail size", 1, 0, MILLION, &trll);
923
  ddpm.set ("Launches per minute", 1, 0, MILLION, &ddpml);
924
  ddpl.set ("Drones per launch", 1, 0, MILLION, &ddpll);
925
  gens.set ("Generations", 1, 1, MILLION, &gensl);
926
  gens.orient = mouse_slider_listener::NONE;
2105 jag 927
 
1772 jag 928
  autorotate.setup ();
1715 jag 929
  sva.setup ();
1732 jag 930
  dva.setup ();
1807 jag 931
 
1753 jag 932
  anchored.set_listener (&ancl);
1675 jag 933
 
2106 jag 934
  // chuck
1760 jag 935
  chspeed.set ("Speed", 1.0f, &spdl); chspeed.limits = 0;
1695 jag 936
  chlen.set ("Length", 1.0f, &lenl);
1760 jag 937
  chapt.set ("Angle per turn", 0.1f, &apfl); chapt.limits = 0;
1706 jag 938
  chtrail.set ("Trail length", 10000, &chtll);
1695 jag 939
 
1645 jag 940
#ifndef __WIDGET_MOVE__
1750 jag 941
  for (int i = 1; i < 17; ++i) dynamic_cast<button*>(wdrone_tools[i])->set_listener (&dcl);
1645 jag 942
  for (int i = 0, j = DRONE_PARAMS_N - 1; i < 4; ++i) dynamic_cast<checkbutton*>(wdrone_params[j--])->set_listener (&dcl);
943
#endif
944
 
1686 jag 945
  static const char* txt [] = {"AM Depth", "FM Depth", "AM BPM", "FM BPM"};
964 jag 946
  spinner<float>* spn [] = {&sp_am_depth, &sp_fm_depth, &sp_am_bpm, &sp_fm_bpm};
1686 jag 947
  change_listener<field>* vlis [] = {&amdl, &fmdl, &ambpml, &fmbpml};
964 jag 948
  spinner<float>* dspn [] = {&sp_dam_depth, &sp_dfm_depth, &sp_dam_bpm, &sp_dfm_bpm};
1451 jag 949
  change_listener<field>* dlis [] = {&damdl, &dfmdl, &dambpml, &dfmbpml};
964 jag 950
 
951
  for (int i = 0; i < 4; ++i) {
1686 jag 952
    const char* txti = txt[i];
964 jag 953
    spinner<float>* dspni = dspn[i];
1686 jag 954
    dspni->set (txti, 1.0f, dlis[i]);
964 jag 955
    spinner<float>* spni = spn[i];
1120 jag 956
    spni->set_text (txti);
1452 jag 957
    spni->set_listener (vlis[i]);
964 jag 958
  }
959
 
960
  for (int i = 1; i < 4; ++i) spn[i]->set_delta (1.0f);
2033 jag 961
  sp_am_depth.set_delta (0.01f);
964 jag 962
  sp_am_bpm.set_limits (0, MILLION);
963
  sp_fm_bpm.set_limits (0, MILLION);
964
 
2016 jag 965
  sp_dam_pos.set ("AM Position", 0.01f, &dampl);
966
  sp_dfm_pos.set ("FM Position", 0.01f, &dfmpl);
1912 jag 967
 
2027 jag 968
  sp_dam_depth.lim = &damd0;
969
  sp_dfm_depth.lim = &dfmd0;
970
 
2060 jag 971
  LISTEN(revmod,&revl)
972
  LISTEN(revmod.option,&revcl)
973
 
964 jag 974
  widget* wranges [] = {
975
    &b_selected_to_all,
976
    &b_default_to_selected,
977
    &b_default_to_all,
978
    &b_adjust_range_left,
979
    &b_adjust_range_right,
980
    &b_adjust_range_both,
981
    &b_adjust_range_height,
982
    &b_adjust_board_height,
983
    &b_rm_start_all,
984
    &b_rm_stop_all,
985
    &b_rm_toggle,
986
    &b_rm_pause_resume,
987
    &b_get_cur_ran,
988
    &cb_mod_ran,
989
    &cb_mark_ran,
990
    &sp_ran_mod_width,
991
    &sp_ran_mod_width_bpm,
992
    &sp_ran_mod_height,
993
    &sp_ran_mod_height_bpm,
994
    &sp_range,
995
    &l_ran_mod,
996
    &l_adjust_height,
997
    &l_adjust_range,
998
    &ol_set_range,
999
    &sp_default_width,
1000
    &sp_default_height,
1001
    &b_change_note_left,
1002
    &b_change_note_right,
1235 jag 1003
    &ol_change_note_style,
1397 jag 1004
    &ol_change_note,
1235 jag 1005
    &b_change_note_both,
1436 jag 1006
    &ol_fixed,
1827 jag 1007
    &sp_snap_left,
1008
    &sp_snap_right,
1009
    &ol_snap_style,
964 jag 1010
  };
1011
 
1645 jag 1012
#ifndef __WIDGET_MOVE__
964 jag 1013
  for (int i = 0; i < 3; ++i) static_cast<button*>(wranges[i])->set_listener (&sral);
1014
  for (int i = 3; i < 6; ++i) static_cast<button*>(wranges[i])->set_listener (&rwl);
1015
  b_adjust_range_height.set_listener (&rhl);
1016
  b_adjust_board_height.set_listener (&bhl);
1017
  for (int i = 8; i < 13; ++i) static_cast<button*>(wranges[i])->set_listener (&rml);
1018
  cb_mod_ran.set_listener (&rml);
1019
  cb_mark_ran.set_listener (&rml);
1020
  b_change_note_left.set_listener (&cnl);
1021
  b_change_note_right.set_listener (&cnr);
1235 jag 1022
  b_change_note_both.set_listener (&cnb);
1645 jag 1023
#endif
964 jag 1024
 
1675 jag 1025
  ol_change_note.set_listener (&cnol);
1026
  ol_change_note_style.set_listener (&cnsl);
964 jag 1027
 
1028
  widget* wmisc [] = {
1029
    &l_octave_shift,
1030
    &ab_octave_down,
1031
    &ab_octave_up,
1032
    &sp_octave_shift_bpm,
1033
    &l_gater,
1034
    &sp_gater_bpm,
1035
    &ol_gater_style,
1036
    &b_key_to_pitch_at_cursor,
1037
    &l_tap_bpm,
1038
    &td_tap_display,
1039
    &l_tap_bpm_value,
1040
    &cb_am,
1041
    &cb_fm,
1042
    &cb_gater,
1043
    &cb_octave_shift,
1044
    &cb_auto_reset,
1137 jag 1045
    &cb_pitch_dis,
1140 jag 1046
    &cb_vol_dis,
1438 jag 1047
    &sp_lev_sz,
1481 jag 1048
    &b_abort_octave_shift,
964 jag 1049
  };
1137 jag 1050
 
1645 jag 1051
#ifndef __WIDGET_MOVE__
1481 jag 1052
  LISTEN(b_abort_octave_shift, &aosl)
1438 jag 1053
  cb_draw_mesh.set_listener (&dml);
1137 jag 1054
  cb_pitch_dis.set_listener (&pvdl);
1055
  cb_vol_dis.set_listener (&pvdl);
1645 jag 1056
#endif
1137 jag 1057
 
1645 jag 1058
  sp_lev_sz.set ("Level size", 1, 1, MILLION, &pvdl);
964 jag 1059
 
1950 jag 1060
  widget* wedtools [] = { // curve editors tools
964 jag 1061
    &abe_left,
1062
    &abe_right,
1063
    &abe_up,
1064
    &abe_down,
1065
    &pb_zoom_in,
1066
    &mb_zoom_out,
1117 jag 1067
    &l_snap,
1901 jag 1068
    &b_snapx,
1069
    &b_snapy,
1070
    &b_snapboth,
1071
    &b_snapnone,
2222 jag 1072
    &drawsnaps,
964 jag 1073
    &b_pick_curve,
1074
    &b_insert_vertex,
1075
    &b_delete_vertex,
1117 jag 1076
    &b_draw_replacement_curve,
1077
    &b_undo,
1078
    &b_redo,
2222 jag 1079
    &viewtoo,
1117 jag 1080
    &b_copy,
1081
    &b_paste,
1128 jag 1082
    &b_swap_curves,
2239 jag 1083
    &size_tangent,
1117 jag 1084
    &b_fold_tangents,
2214 jag 1085
    &cb_selection_only,
1128 jag 1086
    &ol_mirror,
2219 jag 1087
    &pinunpin,
1117 jag 1088
    &ol_mirror_tangents,
1089
    &lf_curve_name,
1090
    &sp_curve_limit,
1091
    &ol_curve_style,
964 jag 1092
    &l_library,
1093
    &abl_left,
1094
    &abl_right,
1117 jag 1095
    &b_add_curve,
1096
    &b_replace_curve,
1097
    &b_delete_curve,
964 jag 1098
    &l_capture,
1099
    &b_start_capture,
1100
    &b_assign_capture,
1101
    &cb_draw_curve,
2126 jag 1102
    &draweditables,
1103
    &cb_mark_segments,
1117 jag 1104
    &cb_label_vertices,
964 jag 1105
    &cb_show_waveform_samples,
2039 jag 1106
    &crvwav.hz,
1107
    &crvwav.periods,
1108
    &crvwav.time,
964 jag 1109
    &sp_curve_rpm,
1110
    &b_stop_rotating,
1950 jag 1111
    &ed_flip_rotation,
1112
    &cb_ed_autoflip,
2039 jag 1113
    &ed_autoflip_reset,
1950 jag 1114
    &sp_curve_every,
2039 jag 1115
    &cb_overlay,
2222 jag 1116
    &drawcursor,
2219 jag 1117
    &pinunpin,
964 jag 1118
  };
1119
 
1120
  widget* wmon [] = { // mondrian tools
1121
    &b_add_balls,
1122
    &b_move_selected_balls,
1123
    &b_delete_selected_targets,
1124
    &b_delete_all_targets,
1125
    &b_select_all_targets,
1126
    &b_invert_selected_targets,
1127
    &b_split_horizontal,
1128
    &b_split_vertical,
1129
    &b_delete_box,
1130
    &b_select_targets_in_box,
1131
    &b_freeze_balls,
1132
    &b_thaw_balls,
1133
    &b_clear_modulations,
1134
    &b_modulate_balls_up,
1135
    &b_modulate_balls_down,
1136
    &b_auto_change_direction_clockwise,
1137
    &b_auto_change_direction_anti_clockwise,
1138
    &b_stop_auto_changing_direction,
1139
    &b_flip_direction,
1140
    &b_make_random_color,
1141
    &b_add_remove_slits,
1142
    &b_select_wreckers,
1143
    &b_select_healers,
1144
    &b_switch_ball_type,
1145
    &b_toggle_wreckers,
1146
    &b_toggle_healers,
1147
    &b_toggle_bouncers,
1148
    &b_remove_slits_on_edge,
1149
    &b_toggle_slit_anim,
1150
    &b_make_note_grid,
1151
    &b_make_nxn_grid,
1152
    &b_delete_all_boxes,
1423 jag 1153
    &b_ball_trig,
964 jag 1154
    &ol_ball_types,
1155
    &ol_split_types_h,
1156
    &ol_split_types_v,
1157
    &sp_mondrian_num_boxes,
1423 jag 1158
    &ol_selection_targets,
964 jag 1159
  };
1160
 
1161
 
1162
  arrow_button* mnav[] = {&abm_left, &abm_down, &abm_right, &abm_up};
1163
  int mdirs [] = {arrow_button::left, arrow_button::down, arrow_button::right, arrow_button::up};
1164
  for (int i = 0; i < 4; ++i) {
1165
    arrow_button* ab = mnav[i];
1015 jag 1166
    ab->set_dir (mdirs[i]);
964 jag 1167
  }
1168
 
1169
  widget* wmon_pars [] = { // mondrian parameters
1170
    &l_octave_shift,
1171
    &ab_octave_down,
1172
    &ab_octave_up,
1173
    &sp_octave_shift_bpm,
1519 jag 1174
    &b_abort_octave_shift,
964 jag 1175
    &sp_mondrian_min_voices,
1176
    &sp_mondrian_change_attack_time,
1177
    &sp_mondrian_change_decay_time,
1178
    &sp_mondrian_change_speed,
1179
    &sp_mondrian_change_dir,
1180
    &sp_mondrian_change_trail_size,
1181
    &sp_mondrian_change_note_poly_points,
1182
    &sp_mondrian_change_note_poly_radius,
1183
    &sp_mondrian_change_slit_size,
1184
    &sp_mondrian_change_slit_anim_time,
1185
    &cb_mondrian_auto_adjust_voices,
1186
    &sp_mondrian_change_vol
1187
  };
1188
 
1189
  widget* wmon_misc [] = { // mondrian misc
1190
    &l_draw_ball,
1191
    &abm_left,
1192
    &abm_right,
1193
    &abm_up,
1194
    &abm_down,
1195
    &bm_zoom_in,
1196
    &bm_zoom_out,
1197
    &cb_draw_boxes,
1198
    &cb_fill_boxes,
1199
    &cb_draw_notes,
1200
    &cb_label_notes,
1201
    &cb_label_hz_vol,
1202
    &cb_draw_ball_position,
1203
    &cb_draw_ball_heading,
2049 jag 1204
    &cb_draw_ball_trails,
1205
    &texture,
1206
    &texstep,
1207
    &text_ure,
964 jag 1208
  };
1209
 
1210
  widget* wmon_boxops [] = {
1211
    &cb_auto_split_box,
1212
    &cb_auto_delete_box,
1213
    &sp_auto_split_time,
1214
    &sp_auto_delete_time,
1215
    &ol_auto_pick_box_split,
1216
    &ol_auto_split_at,
1217
    &ol_auto_split_orient,
1218
    &ol_auto_pick_box_delete,
1219
    &sp_min_split_size
1220
  };
1221
 
1222
  widget* wmon_ballops [] = {
1223
    &cb_turn, &cb_speed, &cb_teleport, &cb_clone, &sp_turn_every, &sp_turn_min, &sp_turn_max,
1224
    &sp_speed_every, &sp_speed_min, &sp_speed_max, &sp_max_speed, &sp_tel_every, &sp_tel_radius,
1225
    &cb_turn_sync, &cb_speed_sync, &sp_clone_every, &sp_max_clones, &sp_clone_offset, &sp_max_balls,
1226
    &cb_clone_can_clone, &ol_browse_balls,
1227
    &cb_transform, &sp_transform_every, &ol_bouncer, &ol_healer, &ol_wrecker,
1228
  };
1229
 
1230
  spinner<float>* bospn [] = {&sp_turn_every, &sp_speed_every, &sp_tel_every, &sp_clone_every, &sp_transform_every};
1231
  float bodta [] = {0.01f, 0.01f, 1.0f, 1.0f, 1.0f};
1232
  for (int i = 0; i < ball_op::NUM_OPS; ++i) {
1233
    spinner<float>* spni = bospn[i];
1677 jag 1234
    spni->set_text ("Every", SECONDS);
1646 jag 1235
    spni->set (bodta[i], 0.0f, MILLION, &bolis);
964 jag 1236
  }
1836 jag 1237
  sp_turn_min.set_text ("Clockwise Max", DEGREES);
1646 jag 1238
  sp_turn_min.set (1, 0, MILLION, &bolis);
1836 jag 1239
  sp_turn_max.set_text ("Anti-clockwise Max", DEGREES);
1646 jag 1240
  sp_turn_max.set (1, 0, MILLION, &bolis);
1241
  sp_speed_min.set ("Brake", 0.1f, 0, MILLION, &bolis);
1242
  sp_speed_max.set ("Accelerate", 0.1f, 0, MILLION, &bolis);
1243
  sp_max_speed.set ("Max speed", 1, 0, MILLION, &bolis);
1244
  sp_tel_radius.set ("Max distance", 1, 0, MILLION, &bolis);
1245
  sp_clone_offset.set ("Offset", 1.0f, 0, MILLION, &bolis);
1246
  sp_max_clones.set ("Max clones", 1, 1, MILLION, &bolis);
1247
  sp_max_balls.set ("Max balls", 1, 0, MILLION,&bolis);
964 jag 1248
 
1646 jag 1249
#ifndef __WIDGET_MOVE__
2120 jag 1250
 
964 jag 1251
  checkbutton* bocbn [] = {&cb_turn, &cb_speed, &cb_teleport, &cb_clone, &cb_transform};
1252
  for (int i = 0; i < ball_op::NUM_OPS; ++i) bocbn[i]->set_listener (&bolis);
1253
  for (int i = 1; i < 7; ++i) static_cast<button*>(wmon_misc[i])->set_listener (&monl);
1254
  for (int i = 7; i < 15; ++i) static_cast<checkbutton*>(wmon_misc[i])->set_listener (&monl);
1646 jag 1255
  for (int i = 0; i < 33; ++i) static_cast<button*>(wmon[i])->set_listener (&monl);
2222 jag 1256
 
1950 jag 1257
  for (int i = 0; i < 6; ++i) static_cast<button*>(wedtools[i])->set_listener (&pzl);
1258
  for (int i = 7; i < 11; ++i) static_cast<button*>(wedtools[i])->set_listener (&snl);
2222 jag 1259
  drawsnaps.set_listener (&snl);
1260
  drawcursor.set_listener (&cursl);
1261
  viewtoo.set_listener (&urvl);
964 jag 1262
 
1263
  button* crvops [] = {
1646 jag 1264
    &b_pick_curve,
964 jag 1265
    &b_insert_vertex,
1266
    &b_delete_vertex,
1646 jag 1267
    &b_draw_replacement_curve,
964 jag 1268
    &b_fold_tangents,
1128 jag 1269
    &ol_mirror.option,
964 jag 1270
    &b_copy,
1271
    &b_paste,
1646 jag 1272
    &b_swap_curves,
964 jag 1273
    &b_undo,
1274
    &b_redo,
1275
    &abl_left,
1276
    &abl_right,
1277
    &b_add_curve,
1278
    &b_replace_curve,
1279
    &b_delete_curve,
1280
    &b_start_capture,
1281
    &b_assign_capture,
1948 jag 1282
    &b_stop_rotating,
1950 jag 1283
    &ed_flip_rotation,
1955 jag 1284
    &ed_autoflip_reset,
2125 jag 1285
    &size_tangent,
2219 jag 1286
    &pinunpin,
964 jag 1287
  };
1646 jag 1288
 
2238 jag 1289
  for (int i = 0; i < 23; ++i) crvops[i]->set_listener (&col);
2131 jag 1290
  col.name = "Tangent size"; // via mouse slider
964 jag 1291
 
1646 jag 1292
#endif
1293
 
1294
  options_list* oll [] = {&ol_ball_types, &ol_split_types_h, &ol_split_types_v, &ol_selection_targets,
1295
                          &ol_auto_pick_box_split, &ol_auto_split_at, &ol_auto_split_orient, &ol_auto_pick_box_delete};
1296
  for (int i = 0; i < 8; ++i) {
1297
    options_list* oli = oll[i];
1298
    oli->set_listener (&monl);
1299
  }
1300
  ol_split_types_h.set_text (mondrian_listener::split_types[monl.hsplit]);
1301
  ol_split_types_v.set_text (mondrian_listener::split_types[monl.vsplit]);
1302
  ol_selection_targets.set_text (mondrian_listener::selection_targets[mondrian0.sel_tar]);
1303
  ol_browse_balls.set_listener (&bolis);
1304
 
1305
  b_undo.click_repeat = b_redo.click_repeat = 1;
1306
  abl_left.click_repeat = abl_right.click_repeat = 1;
1307
 
1308
  ol_mirror.set_listener (this);
1309
  lf_curve_name.set_listener (&col);
1310
#ifndef __WIDGET_MOVE__
2126 jag 1311
  checkbutton* cbed [] = {&cb_label_vertices, &cb_mark_segments, &cb_overlay, &cb_draw_curve, &draweditables, &cb_ed_autoflip, &sp_curve_every.variance.cb, 0};
1950 jag 1312
  checkbutton** cp = cbed;
1313
  while (*cp != 0) {
1314
    (*cp)->set_listener (&col);
1315
    cp++;
1316
  }
1646 jag 1317
#endif
964 jag 1318
 
1319
  widget* wbd [] = { // binaural drones
1320
    &b_create_binaurals_on_notes,
1321
    &b_create_binaurals_from_pitch,
1322
    &sp_bd_separation,
1323
    &sp_bd_pairs,
1324
    &lf_bd_start_pitch,
1325
    &lf_bd_spacing,
1326
    &ol_justification,
1327
    &ol_key_note,
1328
    &cb_resize_separation,
1329
    &cb_close_octave,
1330
  };
1331
 
1332
  widget* wbde [] = {
1333
    &bbd_select_all,
1334
    &bbd_select_none,
1335
    &bbd_invert_select,
1336
    &bbd_delete,
1337
    &bbd_sync,
1338
    &bbd_select2,
1339
    &bd_modulate_up,
1340
    &bd_modulate_down,
1341
    &bbd_modulate,
1342
    &bbd_flip,
1343
    &il_binaural_drones,
1344
    &lf_vol_fade_time,
1345
    &lf_master_volume,
1346
    &lf_pitch_fade_time,
1347
    &lf_modulation_amount,
1348
    &ol_select_what,
1349
    &ol_select_rule,
1350
    &bdf_value,
1351
    &lf_l,
1352
    &lf_r,
1353
    &lf_sep,
1354
    &lf_vol,
1355
    &ol_just
1356
  };
1357
 
1358
  il_binaural_drones.sel_lis = &bdl;
1359
  lf_sep.fld.set_text (0.0f);
1360
  ol_just.set_text (binaural_drones_listener::justs[binaural_drone::CENTER]);
1361
  ol_just.set_listener (&bdl);
1362
 
1363
  bd_modulate_up.set_size (24);
1364
  bd_modulate_down.set_size (24);
1015 jag 1365
  bd_modulate_down.set_dir (arrow_button::left);
964 jag 1366
 
1646 jag 1367
#ifndef __WIDGET_MOVE__
964 jag 1368
  for (int i = 0; i < 10; ++i) static_cast<button*>(wbde[i])->set_listener (&bdl);
1369
  for (int i = 0; i < 2; ++i) static_cast<button*>(wbd[i])->set_listener (&bdl); // binaural drones commands
1370
  cb_close_octave.set_listener (&bdl);
1371
  cb_resize_separation.set_listener (&bdl);
1646 jag 1372
#endif
1373
 
1374
  ol_select_what.set_listener (&bdl);
1375
  ol_select_rule.set_listener (&bdl);
964 jag 1376
  ol_justification.set_listener (&bdl);
1377
  ol_key_note.set_listener (&bdl);
1378
 
1646 jag 1379
  label_field* lfb [] = {
1380
    &lf_bd_start_pitch, &lf_bd_spacing, &lf_master_volume, &lf_vol_fade_time,
1381
    &lf_pitch_fade_time, &lf_modulation_amount, &lf_l, &lf_r, &lf_sep, &lf_vol
1382
  };
1383
  string lfbs [] = {
1384
    "Start Pitch (Hz)", "Spacing (Hz)", "Master volume (%)", "Volume fade time (secs)",
1385
    "Pitch fade time (secs)", "Amount", "L (Hz)", "R (Hz)", "Separation (Hz)", "Volume (%)"
1386
  };
964 jag 1387
  for (int i = 0; i < 10; ++i) {
1388
    label_field* li = lfb[i];
1144 jag 1389
    li->set_label (lfbs[i]);
964 jag 1390
    li->set_listener (&bdl);
1391
  }
1521 jag 1392
 
1393
  sp_bd_separation.set ("Separation (Hz)", 1.0f, 0.0f, MILLION, 0, 0);
964 jag 1394
  sp_bd_separation.set_value (1.0f);
1395
  sp_bd_separation.orient = mouse_slider_listener::NONE;
1396
 
1521 jag 1397
  sp_bd_pairs.set ("Number of Pairs", 1, 1, MILLION, 0, 0);
964 jag 1398
  sp_bd_pairs.set_value (1);
1399
  sp_bd_pairs.orient = mouse_slider_listener::NONE;
1400
 
1883 jag 1401
  for (int i = 0; i < 24; ++i) {
1026 jag 1402
    editors.push_back (weds[i]);
1403
    //weds[i]->set_moveable(1);
1404
  }
964 jag 1405
 
1465 jag 1406
  widget** wmap [] = {
1407
    wfile,
1408
    winst,
1409
    weds,
1410
    wvoice,
1411
    wdrone_tools,
1412
    wdrone_params,
1413
    wranges,
1414
    wmisc,
1950 jag 1415
    wedtools,
1465 jag 1416
    wmon,
1417
    wmon_pars,
1418
    wmon_ballops,
1419
    wmon_boxops,
1420
    wmon_misc,
1421
    wbd,
1941 jag 1422
    wbde,
1423
 
1465 jag 1424
  };
1425
  int numw [] = {
1920 jag 1426
    10,
1465 jag 1427
    4,
1883 jag 1428
    24,
2206 jag 1429
    12,
1827 jag 1430
    58,
1474 jag 1431
    DRONE_PARAMS_N,
1827 jag 1432
    35,
1481 jag 1433
    20,
2238 jag 1434
    57,
1465 jag 1435
    38,
1519 jag 1436
    17,
1465 jag 1437
    26,
1438
    9,
2049 jag 1439
    18,
1465 jag 1440
    10,
1941 jag 1441
    23,
1442
 
1465 jag 1443
  };
964 jag 1444
 
1467 jag 1445
  lf_conn_steps.set_label ("Steps");
1512 jag 1446
  LISTEN(lf_conn_steps, &stepsl)
1447
  lf_conn_steps.fld.typing_lsnr = &stepsl;
1467 jag 1448
  lf_conn_steps.fld.expr = 0;
1460 jag 1449
 
1490 jag 1450
  DECL_COLOR_SLIDERS
1489 jag 1451
  color clrs [] = {color(1.0f, 0.0f, 0.0f), color(0.0f, 1.0f, 0.0f), color(0.0f, 0.0f, 1.0f),
1461 jag 1452
                    color(1.0f, 0.0f, 0.0f), color(0.0f, 1.0f, 0.0f), color(0.0f, 0.0f, 1.0f)};
1489 jag 1453
 
1490 jag 1454
  for (int i = 0; i < COLOR_SLIDERS_M; ++i) {
1455
    slider<float>& si = dynamic_cast<slider<float>&>(*slrs [i]);
1468 jag 1456
    si.set_width_height (128, si.extents.height);
1461 jag 1457
    color& ci = clrs [i];
1458
    si.set_color (ci.r, ci.g, ci.b);
1459
    si.set_limits (0.0f, 1.0f);
1646 jag 1460
#ifndef __WIDGET_MOVE__
1489 jag 1461
    si.set_listener (&cscl, &cssl);
1646 jag 1462
#endif
1461 jag 1463
  }
1464
 
1468 jag 1465
  colorer.schemes[0]=&gc_top;
1466
  colorer.schemes[1]=&gc_bottom;
1463 jag 1467
  colorer.schemes[2]=&gc_blend;
1468
  colorer.schemes[3]=&gc_rand;
1472 jag 1469
  colorer.i = colorer_t::RANDOM;
1463 jag 1470
 
1473 jag 1471
  LISTEN(ol_color,&ocoll)
1646 jag 1472
  LISTEN(ol_fixed,&fxl)
1473
  LISTEN(ol_snap_style,&sdl);
1468 jag 1474
 
1470 jag 1475
  separator* seps [] = {&separators.main, &separators.dp0, &separators.dp1};
1476
  const char* sepsn [] = {"main", "dp0", "dp1"};
1477
  for (int i = 0; i < 3; ++i) {
1478
    separator& si = *seps[i];
1479
    si.set_name (sepsn[i]);
1480
  }
1465 jag 1481
 
1941 jag 1482
  for (int i = 0; i < 17; ++i) {
1483
    vector<widget*>& vw = tab_members[cb_tabs[i]];
964 jag 1484
    int n = numw[i];
1485
    widget** wmi = wmap[i];
1486
    for (int m = 0; m < n; ++m) {
1487
      vw.push_back (wmi[m]);
1748 jag 1488
#ifdef __WIDGET_MOVE__
1489
      wmi[m]->set_moveable(1); // to move item
1490
#endif
964 jag 1491
    }
1465 jag 1492
    vw.push_back (&separators.main);
964 jag 1493
  }
1684 jag 1494
 
1619 jag 1495
  sp_voice_volume.set ("Volume", 0.001f, -MILLION, MILLION, &vvl);
1695 jag 1496
  sp_drone_master_vol.set ("Master volume", 0.001f, -MILLION, MILLION, &dmvol);
2039 jag 1497
  masvol0.set_state (1);
2102 jag 1498
  sp_drone_master_vol.lim = &masvol0;
1499
 
1695 jag 1500
  sp_drone_vol.set ("Volume", 0.01f, -MILLION, MILLION, &dvol);
1552 jag 1501
  sp_drone_vol.set_value (0.0f);
964 jag 1502
 
1503
  l_octave_shift.set_text ("Octave Shift");
1015 jag 1504
  ab_octave_down.set_dir (arrow_button::left);
1646 jag 1505
  ab_octave_up.set_dir (arrow_button::right);
1506
 
1507
#ifndef __WIDGET_MOVE__
964 jag 1508
  ab_octave_down.set_listener (&osl);
1509
  ab_octave_up.set_listener (&osl);
1646 jag 1510
#endif
964 jag 1511
  int arrow_size = 24;
1512
  ab_octave_up.set_size (arrow_size);
1513
  ab_octave_down.set_size (arrow_size);
1472 jag 1514
  sp_octave_shift_bpm.set ("BPM", 1, 0.0f, MILLION, &osl);
964 jag 1515
 
1472 jag 1516
  sp_gater_bpm.set ("BPM", 1, 0, MILLION, &gbl);
964 jag 1517
  ol_gater_style.set_text (" style = ");
1518
  ol_gater_style.set_listener (&gater_style_lis);
1472 jag 1519
 
2157 jag 1520
  l_gater.set_text ("Beater");
964 jag 1521
  l_gater.add_child (&sp_gater_bpm);
1522
  l_gater.add_child (&ol_gater_style);
1523
 
1403 jag 1524
#ifdef __WIDGET_MOVE__
1525
 
2239 jag 1526
  int wek [] = {8, 14, 2, 3, 7, 3, 4, 4, 6};
1403 jag 1527
  for (int i = 0, j = 4, k = 0; i < 9; ++i) {
1528
    k = wek[i];
1950 jag 1529
    makehier (&wedtools[j], k);
1403 jag 1530
    j += k;
1531
  }
1532
 
1828 jag 1533
  widget* osn [] = {&l_octave_shift, &ab_octave_down, &ab_octave_up, &b_abort_octave_shift, &sp_octave_shift_bpm, 0};
1682 jag 1534
  makefam (osn, 5);
964 jag 1535
 
1828 jag 1536
  widget* brs [] = {&ol_set_range, &b_default_to_selected, &b_default_to_all, &b_selected_to_all, 0};
1537
  makehier (brs);
964 jag 1538
 
1828 jag 1539
  widget* aht [] = {&l_adjust_height, &b_adjust_range_height, &b_adjust_board_height, 0};
1540
  makehier (aht);
964 jag 1541
 
1828 jag 1542
  widget* arb [] = {&l_adjust_range, &b_adjust_range_left, &b_adjust_range_right, &b_adjust_range_both, 0};
1543
  makehier (arb);
964 jag 1544
 
1828 jag 1545
  widget* brm [] = {&l_ran_mod, &b_rm_pause_resume, &b_rm_start_all, &b_rm_stop_all, &b_rm_toggle, 0};
1546
  makehier (brm);
964 jag 1547
 
1828 jag 1548
  widget* brc [] = {&ol_change_note, &b_change_note_left, &b_change_note_right, &b_change_note_both, &ol_change_note_style, 0};
1549
  makehier (brc);
964 jag 1550
 
1828 jag 1551
  widget* wmmv [] = {&cb_modulation, &cb_visual, &cb_motion, &cb_chuck, &cb_defaults, 0};
1552
  makehier (wmmv);
1465 jag 1553
 
1828 jag 1554
  widget* dpw0 [] = {&cb_show_vel, &cb_show_accel, &cb_show_gravity, &cb_show_anchors, 0};
1555
  makehier (dpw0);
964 jag 1556
 
2060 jag 1557
  widget* dpw3 [] = {&sp_dam_depth, &sp_dfm_depth, &sp_dam_bpm,  &sp_dfm_bpm, &damd0, &dfmd0, 0};
1828 jag 1558
  makehier (dpw3);
964 jag 1559
 
1893 jag 1560
  widget* dpw4 [] = { &sp_drones_per_min, &dpl, &sp_drone_lifetime, &sp_orbit_insertion_time,  0};
1828 jag 1561
  makehier (dpw4);
964 jag 1562
 
1828 jag 1563
  widget* dpw5 [] = {&sp_change_drone_trail_length, &sp_change_drone_handle_size, 0};
1564
  makehier (dpw5);
964 jag 1565
 
1828 jag 1566
  widget* dpw6 [] = {&ol_set_unset_toggle, &b_toggle, &b_set, &b_unset, 0};
1567
  makehier (dpw6);
964 jag 1568
 
1827 jag 1569
  widget* rmw [] = {&cb_mod_ran, &ol_fixed, &sp_ran_mod_width, &sp_ran_mod_width_bpm, &sp_ran_mod_height, &sp_ran_mod_height_bpm, 0};
1570
  makehier (rmw);
1403 jag 1571
 
1827 jag 1572
  widget* dpw [] = {&ol_create_this,&dp_orient,&dp_numdrones,&dp_bpm1, 0};
1573
  makehier (dpw);
1403 jag 1574
 
1828 jag 1575
  widget *rcw [] = {&ol_create_this, &sp_mesh_rows, &sp_mesh_cols, &cb_sync_rows_cols, &b_flip_rows_cols, 0};
1682 jag 1576
  makehier (rcw, 5);
1828 jag 1577
  widget* dow [] = {&l_drone_order, &ol_drone_order, &ol_mesh_point, &f_mesh_xy, 0};
1682 jag 1578
  makehier (dow, 4);
1828 jag 1579
  widget* mshw [] = {&sp_mesh_rows, &sp_mesh_dur, &l_use_drone_pend, 0,};
1682 jag 1580
  makehier (mshw, 3);
1827 jag 1581
  sp_mesh_rows.add_child (&l_drone_order);
1828 jag 1582
  widget* dpp [] = {&sp_drones_per_pend, &b_set_to_mesh_rows, &b_set_to_mesh_cols, 0};
1583
  makehier (dpp);
1584
  widget* apt [] = {&l_apply_to, &cb_am_bpm, &cb_fm_bpm, 0};
1585
  makehier (apt);
1586
  widget* udp [] = {&l_use_drone_pend, &sp_drones_per_pend, &l_apply_to, 0};
1587
  makehier (udp);
1588
  widget* wsp [] = {&sp_snap_left, &sp_snap_right, &ol_snap_style, 0};
1589
  makehier (wsp);
1590
  widget* wda [] = {&l_drone_arrow, &b_arrow_reset, &dronearrow.neck, &dronearrow.shoulder.width, &dronearrow.shoulder.position, &dronearrow.cap, &dronearrow.decap, 0};
1591
  makehier (wda);
1778 jag 1592
  widget* wda2 [] = {
1593
    &dronearrowdefaults.lbl,
1594
    &dronearrowdefaults.arrow,
1804 jag 1595
    &dronearrowdefaults.neck,
1778 jag 1596
    &dronearrowdefaults.shoulder.width,
1597
    &dronearrowdefaults.shoulder.position,
1598
    &dronearrowdefaults.cap,
1828 jag 1599
    0,
1778 jag 1600
  };
1828 jag 1601
  makehier (wda2);
1602
  widget* wbo [] = {&sp_bounces, &sp_rebound, &ol_bounce_style, 0};
1603
  makehier (wbo);
1827 jag 1604
  widget* wconn [] = {&b_disconnect, &b_connect, &lf_conn_steps, &cb_conn_wrap, &trackcon, 0};
1605
  makehier (wconn);
1828 jag 1606
  widget* wsl [] = {&s_red_min, &s_red_max, &s_green_min, &s_green_max, &s_blue_min, &s_blue_max, &ol_color, 0};
1607
  makehier (wsl);
1465 jag 1608
 
1548 jag 1609
  {
1610
    widget* w [] = {
1611
      &b_select_all_drones,
1612
      &b_invert_drone_selection,
1613
      &b_select_attractees,
1614
      &b_select_attractors,
1813 jag 1615
      &b_select_launchers,
1548 jag 1616
      &b_select_tracked_drones,
1828 jag 1617
      &sp_browse_drone, 0,
1548 jag 1618
    };
1828 jag 1619
    makehier (w);
1548 jag 1620
  }
1621
 
1622
  {
1623
    widget* w[] = {
1674 jag 1624
      &ol_add_wand,
1548 jag 1625
      &b_delete_drones,
1984 jag 1626
      &moverailstrafe,
2011 jag 1627
      &b_rotate_drones,
1548 jag 1628
      &b_scale_drones,
1666 jag 1629
      &b_set_xform_center,
1548 jag 1630
      &b_freeze_drones,
1828 jag 1631
      &b_thaw_drones, 0,
1557 jag 1632
    };
1828 jag 1633
    makehier (w);
1557 jag 1634
  }
1635
 
1636
  {
1637
    widget* w[] = {
1548 jag 1638
      &b_mute,
1639
      &b_unmute,
1557 jag 1640
      &drone2noise,
1641
      &noise2drone,
1828 jag 1642
      &gabt, 0,
1548 jag 1643
    };
1828 jag 1644
    makehier (w);
1548 jag 1645
  }
1646
 
1557 jag 1647
  {
1648
    widget* w[] = {
1649
      &b_launch_drones,
1650
      &b_stop_launching_drones,
1983 jag 1651
      &balloon,
1652
      &chuck,
1557 jag 1653
      &b_orbit_selected_drones,
1654
      &b_track_drones,
1655
      &b_set_targets,
1828 jag 1656
      &b_clear_targets, 0,
1557 jag 1657
    };
1983 jag 1658
    makehier(w);
1557 jag 1659
  }
1552 jag 1660
 
1674 jag 1661
  {
2106 jag 1662
    widget* w[] = {&riset, &fallt, &lifetime, &ddpm, &ddpl, &gens, 0};
1828 jag 1663
    makehier (w);
1676 jag 1664
  }
1665
 
1677 jag 1666
  {
1851 jag 1667
 
1668
    widget* w[] = {&handlesize, &trailsize, 0};
1669
    makehier (w);
1670
  }
1671
 
1672
  {
1828 jag 1673
    widget* w[] = {&mortalize, &reincarnate, &immortalize, 0};
1674
    makehier (w);
1677 jag 1675
  }
1676
 
1760 jag 1677
  {
1828 jag 1678
    widget* w[] = {&chflip, &chtog, &chspeed, &chlen, &chtrail, &chapt, &choutline, &chautoresettrails, 0};
1679
    makehier (w);
1760 jag 1680
  }
1681
 
2049 jag 1682
  {
1683
    widget* w[] = {
1684
      &l_draw_ball,
1685
      &cb_draw_ball_position,
1686
      &cb_draw_ball_heading,
1687
      &cb_draw_ball_trails,
1688
 
1689
    };
1690
    makehier(w);
1691
  }
1692
 
1693
  {
1694
    widget* w[] = {
1695
      &cb_draw_boxes,
1696
      &cb_fill_boxes,
1697
      &texture,
1698
      &text_ure,
1699
      &texstep,
1700
 
1701
    };
1702
    makehier(w);
1703
  }
1704
  {
1705
    widget* w[] = {
1706
      &abm_left,
1707
      &abm_right,
1708
      &abm_up,
1709
      &abm_down,
1710
      &bm_zoom_in,
1711
      &bm_zoom_out,
1712
 
1713
    };
1714
    makehier(w);
1715
  }
1716
  {
1717
    widget* w[] = {
1718
      &cb_draw_notes,
1719
      &cb_label_notes,
1720
      &cb_label_hz_vol,
1721
 
1722
    };
1723
    makehier(w);
1724
  }
1725
 
2060 jag 1726
 
1727
  {
1728
    widget* w[] = {
1729
      &am2fm,
1730
      &fm2am,
1731
      &sp_dam_pos,
1732
      &sp_dfm_pos,
1733
 
1734
    };
1735
    makehier(w);
1736
  }
1737
 
1557 jag 1738
  /*
1739
  {
1740
    widget* w[] = {
1741
    };
2049 jag 1742
    makehier(w);
1557 jag 1743
  }
1744
  */
1745
 
1403 jag 1746
#endif
1747
 
1452 jag 1748
  sp_range.set ("Range", 1, &ranl);
1755 jag 1749
  sp_range.draw_more = sp_range.variance.ui = 0;
964 jag 1750
 
1751
  const char* rms [] = {"Width", "BPM", "Height", "BPM"};
1752
  spinner<float>* srm [] = {&sp_ran_mod_width, &sp_ran_mod_width_bpm, &sp_ran_mod_height, &sp_ran_mod_height_bpm};
1753
  int srl [] = {-MILLION, 0, -MILLION, 0};
1754
  int sro[] = {mouse_slider_listener::X, mouse_slider_listener::X, mouse_slider_listener::Y, mouse_slider_listener::Y};
1452 jag 1755
  change_listener<field>* rlis[] = {&rmwl, &rmwbl, &rmhl, &rmhbl};
964 jag 1756
  for (int i = 0; i < 4; ++i) {
1757
    spinner<float>* sp = srm[i];
1452 jag 1758
    sp->set (rms[i], 1.0f, srl[i], MILLION, rlis[i]);
964 jag 1759
    sp->orient = sro[i];
1760
  }
1761
 
1762
  const char* rde [] = {"Default width", "Default height"};
1763
  spinner<int>* sde [] = {&sp_default_width, &sp_default_height};
1764
  int msd [] = {mouse_slider_listener::X, mouse_slider_listener::Y};
1765
  for (int i = 0; i < 2; ++i) {
1766
    spinner<int>& si = *sde[i];
1452 jag 1767
    si.set (rde[i], 1, 0, MILLION, &rdel);
964 jag 1768
    si.orient = msd[i];
1755 jag 1769
    si.draw_more = si.variance.ui = 0;
964 jag 1770
  }
1771
 
1772
  // drones
1773
  //
1472 jag 1774
  sp_change_drone_trail_length.set ("Trail length", 1, &dtl);
1060 jag 1775
  sp_change_drone_trail_length.set_value (0);
964 jag 1776
 
1472 jag 1777
  sp_change_drone_handle_size.set ("Handle size", 1, &dhsl);
1778
  sp_change_drone_handle_size.set_value (0);
964 jag 1779
 
1472 jag 1780
  sp_change_drone_vel.set ("Velocity", 0.1f, -MILLION, +MILLION, &dvl);
1634 jag 1781
  sp_change_drone_accel.set ("Acceleration", 0.01f, -MILLION, +MILLION, &dal);
2032 jag 1782
  sp_change_drone_vel.lim = &vel0;
1783
  sp_change_drone_accel.lim = &accel0;
964 jag 1784
 
1634 jag 1785
  sp_rotate_drone_vel.set ("Rotate velocity", 1.0f, &rdvl);
2077 jag 1786
  rotaccel.set ("Rotate acceleration", 1.0f, &rdvl);
1787
  sp_rotate_drone_vel.f_value.id = 0;
1788
  rotaccel.f_value.id = 1;
2078 jag 1789
  static const int rotdirsize = 12;
1790
  rdvel.set_size (rotdirsize);
1791
  rdaccel.set_size (rotdirsize);
964 jag 1792
 
1892 jag 1793
  sp_drones_per_min.set ("Launches per minute", 1.0f, &dpml);
1893 jag 1794
  dpl.set ("Drones per launch", 1.0f, &dpll);
1634 jag 1795
  sp_drone_lifetime.set ("Lifetime", 0.01f, &dlf);
964 jag 1796
 
1634 jag 1797
  sp_orbit_insertion_time.set ("Orbit insert time", 0.01f, &oil);
964 jag 1798
 
1472 jag 1799
  sp_browse_drone.set ("Browse drone", 1, &brwdl);
1755 jag 1800
  sp_browse_drone.draw_more = sp_browse_drone.variance.ui = 0;
964 jag 1801
 
1098 jag 1802
  ol_create_this.set_listener (this);
1096 jag 1803
 
1804
  dp_orient.set_listener (this);
1598 jag 1805
  dp_numdrones.set ("Number of Drones", 1, 2, MILLION, this);
1477 jag 1806
  dp_bpm1.set ("BPM", 1.0f, 0, MILLION, this);
1096 jag 1807
 
964 jag 1808
  spinner<int>* msh [] = {&sp_mesh_rows, &sp_mesh_cols};
1809
  static const char* const mlb [] = {"Rows", "Columns"};
1810
  for (int i = 0; i < 2; ++i) {
1811
    spinner<int>* sp = msh[i];
1485 jag 1812
    sp->set (mlb[i], 1, 2, MILLION, this, 0);
1040 jag 1813
    sp->set_value (2);
964 jag 1814
    sp->orient = mouse_slider_listener::NONE;
1755 jag 1815
    sp->draw_more = sp->variance.ui = 0;
964 jag 1816
  }
1472 jag 1817
 
1120 jag 1818
  cb_sync_rows_cols.set_text ("Sync");
1472 jag 1819
 
1037 jag 1820
  l_drone_order.set_text ("Create drones");
1821
  ol_drone_order.set_listener (this);
1822
  ol_mesh_point.set_listener (this);
1096 jag 1823
 
1037 jag 1824
  f_mesh_xy.set_text ("0 0");
1052 jag 1825
  f_mesh_xy.change_lsnr = this;
1037 jag 1826
 
1764 jag 1827
  sp_mesh_dur.set (0.1f, 0, MILLION, this);
1557 jag 1828
  sp_mesh_dur.set_value (1.0f);
1677 jag 1829
  sp_mesh_dur.set_text ("In", SECONDS);
1046 jag 1830
 
964 jag 1831
  ol_set_unset_toggle.set_listener (this);
1832
 
1833
  ol_am_style.set_listener (&am_style_lis); // voice am
1834
  ol_fm_style.set_listener (&fm_style_lis); // voice fm
1835
 
1836
  l_phrase_position.set_text ("Phrase position ");
1837
  s_phrase_position.set_limits (0.0f, 1.0f);
1646 jag 1838
 
1839
#ifndef __WIDGET_MOVE__
1840
  ol_create_this.option.set_listener (&dcl);
1841
  cb_sync_rows_cols.set_listener (&dcl);
964 jag 1842
  s_phrase_position.set_listener (this);
1646 jag 1843
  b_key_to_pitch_at_cursor.set_listener (&miscl);
1844
#endif
964 jag 1845
 
1400 jag 1846
  const char* lrs [] = {"Adjust Height?", "Adjust?", "Modulation?", "Change Note"};
1397 jag 1847
  label* lrm [] = {&l_adjust_height, &l_adjust_range, &l_ran_mod, &ol_change_note.option};
1235 jag 1848
  for (int i = 0; i < 4; ++i) lrm[i]->set_text (lrs[i]);
964 jag 1849
 
1850
  ol_set_range.set_listener (&sral);
1851
 
1852
  const char* snp [] = {"Snap left", "Snap right"};
1853
  spinner<float>* snsp [] = {&sp_snap_left, &sp_snap_right};
1804 jag 1854
  float snv [] = {din0.dinfo.snap.left, din0.dinfo.snap.right};
964 jag 1855
  for (int i = 0; i < 2; ++i) {
1856
    spinner<float>* si = snsp[i];
1472 jag 1857
    si->set (snp[i], 0.01f, &sdl);
964 jag 1858
    si->draw_more = 0;
1755 jag 1859
    si->variance.ui = 0;
1804 jag 1860
    si->set_value (snv[i]);
1861
    si->orient = mouse_slider_listener::X;
964 jag 1862
  }
1863
 
1512 jag 1864
  l_drone_arrow.set_text ("Drone Arrow");
1776 jag 1865
  dronearrowdefaults.lbl.set_text ("Drone Arrow");
1836 jag 1866
  spinner<float>* das [] = {&dronearrow.shoulder.position, &dronearrow.neck, &dronearrow.shoulder.width};
1867
  spinner2<float>* das2 [] = {&dronearrowdefaults.shoulder.position, &dronearrowdefaults.neck, &dronearrowdefaults.shoulder.width};
1868
  const char* dasl [] = {"Shoulder Position", "Neck", "Shoulder Width"};
1869
  float vals [] = {drone::arrowt::U, drone::arrowt::K, drone::arrowt::V};
1766 jag 1870
  for (int i = 0; i < 3; ++i) {
964 jag 1871
    spinner<float>& si = *das[i];
1776 jag 1872
    spinner2<float>& si2 = *das2[i];
1768 jag 1873
    si.set (dasl[i], 0.1f, -MILLION, MILLION, &arrowl);
1778 jag 1874
    si2.set (dasl[i], 0.1f, -MILLION, MILLION, &defarrowl, 0);
1776 jag 1875
    si2.set_value (vals[i]);
1779 jag 1876
    si2.orient = mouse_slider_listener::NONE;
964 jag 1877
  }
1836 jag 1878
  for (int i = 0; i < 2; ++i) {
1879
    spinner<float>& si = *das[i];
1880
    spinner2<float>& si2 = *das2[i];
1881
    si.updowndecinc ();
1882
    si2.updowndecinc ();
1883
  }
1778 jag 1884
  dronearrowdefaults.cap.set_listener (&defarrowl);
1885
  dronearrowdefaults.arrow.calc ();
964 jag 1886
 
1120 jag 1887
  cb_scope.set_text ("Show oscilloscope");
964 jag 1888
  cb_scope.set_listener (&scol);
1472 jag 1889
  sp_scope_height.set ("Height", 1, 0, MILLION, &scol);
1924 jag 1890
  sp_scope_samples.set ("Samples", 1, 1, MILLION, &scol);
1921 jag 1891
  scopacity.set ("Opacity", 0.01f, 0.0f, 1.0f, &scol);
964 jag 1892
 
1893
  l_tap_bpm.set_text ("Tap BPM");
1894
  checkbutton* cb_tars [] = {&cb_am, &cb_fm, &cb_gater, &cb_octave_shift, &cb_auto_reset};
2157 jag 1895
  static const char* const cb_text [] = {"AM", "FM", "Beater", "Octave Shift", "Auto reset"};
964 jag 1896
 
1897
  cb_auto_reset.turn_on ();
1898
  for (int i = 0; i < 5; ++i) {
1899
    checkbutton* cbi = cb_tars[i];
1472 jag 1900
    cbi->set (cb_text[i], &tbl);
964 jag 1901
    l_tap_bpm.add_child (cbi);
1902
  }
1647 jag 1903
  td_tap_display.set_listener (&tbl);
1472 jag 1904
 
964 jag 1905
  l_tap_bpm.add_child (&td_tap_display);
1906
  l_tap_bpm.add_child (&l_tap_bpm_value);
1907
 
1908
  const char* bpmstr [] = {"os", "fm", "am", "gr"};
1909
  spinner<float>* bpmspn [] = {&sp_octave_shift_bpm, &sp_fm_bpm, &sp_am_bpm, &sp_gater_bpm};
1910
  for (int i = 0; i < 4; ++i) bpm_map[bpmstr[i]] = bpmspn[i];
1911
 
1912
  // editor tools 
1913
  arrow_button* enav[] = {&abe_left, &abe_down, &abe_right, &abe_up};
1914
  int edirs [] = {arrow_button::left, arrow_button::down, arrow_button::right, arrow_button::up};
1915
  for (int i = 0; i < 4; ++i) {
1916
    arrow_button* ab = enav[i];
1015 jag 1917
    ab->set_dir (edirs[i]);
964 jag 1918
  }
1919
 
1920
  l_snap.set_text ("Snap?");
1921
  l_library.set_text ("Library");
1922
  lf_curve_name.set_label ("Curve name");
1507 jag 1923
  lf_curve_name.fld.expr = 0;
1117 jag 1924
  l_capture.set_text ("Mouse capture");
1647 jag 1925
 
964 jag 1926
  ol_mirror_tangents.set_listener (this);
1927
  ol_curve_style.set_listener (this);
1928
 
1472 jag 1929
  sp_curve_rpm.set ("RPM", 1.0f, 0.0f, MILLION, &col);
1930
  sp_curve_rpm.set_value (0.0f);
2103 jag 1931
 
1950 jag 1932
  sp_curve_every.set (1.0f, 0, MILLION, &col);
1959 jag 1933
  sp_curve_every.set_listener (&col, 2); // variance
1950 jag 1934
  sp_curve_every.set_text ("Every", DEGREES);
1117 jag 1935
 
1647 jag 1936
#ifndef __WIDGET_MOVE__
964 jag 1937
  cb_show_waveform_samples.set_listener (&col);
1647 jag 1938
#endif
1472 jag 1939
 
2039 jag 1940
  crvwav.hz.set ("Hz", 1.0f, 0.01f, MILLION, &col);
1941
  crvwav.periods.set ("Cycles", 1, 1, MILLION, &col);
1942
  crvwav.time.set ("Time", 1.0f, 1, MILLION, &col);
1943
  crvwav.hz.orient = crvwav.periods.orient = crvwav.time.orient = mouse_slider_listener::NONE;
1472 jag 1944
 
1945
  sp_curve_limit.set ("Curve roughness", 0.001f, 0.001f, MILLION, &col);
964 jag 1946
 
1947
  // button labels
1948
  const char* labels [] = {
1949
    "Menu",
1950
    "Microtonal Keyboard",
1368 jag 1951
    "Keyboard Keyboard",
964 jag 1952
    "Mondrian",
1953
    "Binaural Drones",
1954
    "Waveform",
1955
    "Drone Waveform",
1956
    "Drone Modulation",
1957
    "Voice Modulation",
2157 jag 1958
    "Beater",
964 jag 1959
    "Waveform",
1960
    "Attack",
1961
    "Decay",
1962
    "MIDI Velocity",
1963
    "Delays",
1964
    "Octave Shift",
1965
    "Compressor",
1966
    "Morse Code",
1967
    "Exit DIN Is Noise",
1968
    "Show anchors",
1984 jag 1969
    " Move",
964 jag 1970
    "Delete",
1971
    "Select all",
1972
    "Invert selected",
1973
    "Record a phrase",
1974
    "Clear phrase",
1975
    "Default to Selected",
1976
    "Default to all",
1403 jag 1977
    "Selected to all",
964 jag 1978
    "Set key to pitch at cursor",
1979
    "Insert vertex",
1980
    "Delete vertex",
1981
    "Fold tangents",
1982
    "Undo",
1983
    "Redo",
1984
    "Copy",
1985
    "Paste",
1986
    "Draw & replace curve",
1987
    "Add",
1988
    "Replace",
1989
    "Delete",
1990
    "Start",
1991
    "Assign",
1992
    "Label vertices",
2214 jag 1993
    "Selection only",
964 jag 1994
    "Show waveform",
1995
    "Pick curve",
1996
    "Stop",
2126 jag 1997
    "Draw curve",
964 jag 1998
    "Clear",
1999
    "Record",
2000
    "Select attractees",
2001
    "Select attractors",
2002
    "Orbit",
2003
    "Show velocity",
2004
    "Show acceleration",
1888 jag 2005
    "Show gravity",
1827 jag 2006
    "Balloon",
964 jag 2007
    "Launch",
2008
    "Stop launch",
2009
    "Track",
2010
    "Select tracked",
2011
    "Waveform",
2012
    "Attack",
2013
    "Decay",
2014
    "Add ",
2015
    "Move balls",
2016
    "Delete selected balls",
2017
    "Delete all balls",
2018
    "Select all balls",
2019
    "Invert ball selection",
2020
    "Select balls in box",
2021
    "Split box horizontally",
2022
    "Split box vertically",
2023
    "Delete box",
2024
    "Freeze balls",
2025
    "Thaw balls",
2026
    "Turn Off UI",
2027
    "Set targets",
2028
    "Clear targets",
2029
    "Clear modulations",
2030
    "Modulate balls up",
2031
    "Modulate balls down",
2032
    "Create binaural drones on the notes of the scale",
2033
    "Create binaural drones using parameters above",
2034
    "Waveform",
2035
    "Close octave",
2036
    "Auto-change ball direction clockwise",
2037
    "Auto-change ball direction anti-clockwise",
2038
    "Stop auto-changing ball direction",
2039
    "Flip ball direction",
2040
    "Randomize box color",
2041
    "Resize separation",
2042
    "Add / Remove slits",
2043
    "Toggle wreckers",
2044
    "Toggle healers",
2045
    "Toggle bouncers",
2046
    "Healers <> Wreckers",
2047
    "Select wreckers",
2048
    "Select healers",
2049
    "Remove slits on edge",
2050
    "Toggle slit animation",
2051
    "Auto adjust voices",
2052
    "Draw boxes",
2053
    "Fill boxes",
2054
    "Draw notes",
2055
    "Label notes",
2056
    "Position",
2057
    "Make note grid",
2058
    "Make N x N grid",
2059
    "Delete all boxes",
2060
    "Select launchers",
1812 jag 2061
    "Select on Creation",
964 jag 2062
    "Freeze",
2063
    "Thaw",
2064
    "Mark segments",
2065
    "Auto split box",
2066
    "Auto delete box",
2067
    "Speed",
2068
    "Turn",
2069
    "Teleport",
2070
    "Heading",
2071
    "Trails",
2072
    "Draw ball:",
2073
    "Sync",
2074
    "Sync",
2075
    "Clone",
2076
    "Clone can clone too",
2077
    "Transform",
2078
    "Label pitch and volume",
2079
    "All",
2080
    "None",
2081
    "Invert",
2082
    "Delete",
2083
    "Sync",
2084
    "Modulate",
2085
    "Select",
2086
    "Flip",
2087
    "All",
2088
    "Left",
2089
    "Right",
2090
    "Both",
2091
    "Modulate",
2092
    "Mark",
2093
    "Pause/Resume",
2094
    "Start",
2095
    "Stop",
2096
    "Toggle",
1629 jag 2097
    "Get",
964 jag 2098
    "Range modulation",
2099
    "Selected",
1235 jag 2100
    "Left",
2101
    "Right",
964 jag 2102
    "Set",
2103
    "Unset",
1026 jag 2104
    "Toggle",
1049 jag 2105
    "Range Width & Height",
1071 jag 2106
    "Flip",
1551 jag 2107
    "Overlay Instrument/Editor",
1104 jag 2108
    "Range Pitch & Volume",
1128 jag 2109
    "Swap",
1137 jag 2110
    "Overlay pitch distribution",
1188 jag 2111
    "Overlay volume distributon",
2112
    "Point Modulation",
1320 jag 2113
    "Both",
2114
    "AM BPM",
2115
    "FM BPM",
2116
    "Set to Rows",
1323 jag 2117
    "Set to Columns",
1423 jag 2118
    "Noise Interpolator",
2119
    "Ball triggers note <> Ball triggers noise",
1467 jag 2120
    "Scale",
2121
    "Rotate",
2122
    "Draw mesh outline",
1465 jag 2123
    "Modulation",
2124
    "Motion",
2125
    "Visual",
1467 jag 2126
    "Connect",
1469 jag 2127
    "Disconnect",
2128
    "Wrap",
1475 jag 2129
    "Drone Pendulum",
1481 jag 2130
    "Abort",
1499 jag 2131
    "Close",
1547 jag 2132
    "Reset",
2133
    "Mute",
1557 jag 2134
    "Unmute",
2135
    "Drone > Noise",
2136
    "Noise > Drone",
1677 jag 2137
    "Find center",
1675 jag 2138
    "Defaults",
1677 jag 2139
    "Mortalize",
2140
    "Reincarnate",
2141
    "Immortalize",
1695 jag 2142
    "Chuck",
2143
    "Chuck",
2144
    "Flip",
1697 jag 2145
    "Toggle",
1748 jag 2146
    "Draw chuck outline",
2147
    "Auto reset trails",
1768 jag 2148
    "Cap",
1776 jag 2149
    "Decap",
2150
    "Cap",
1797 jag 2151
    "Track",
1805 jag 2152
    "Auto rotate",
2153
    "Auto flip",
1809 jag 2154
    "-ve",
1818 jag 2155
    "Randomize",
2156
    "0",
2157
    "0",
1836 jag 2158
    "Sync",
1871 jag 2159
    "Reset every tick",
2160
    "Reset every tick",
1883 jag 2161
    "Drone velocity modulation",
1950 jag 2162
    "X",
2163
    "Y",
2164
    "Both",
2165
    "None",
1948 jag 2166
    "Set AM BPM to FM BPM",
2167
    "Set FM BPM to AM BPM",
2168
    "Flip",
1950 jag 2169
    "Autoflip",
2170
    "Reset",
1970 jag 2171
    "Auto pause",
1998 jag 2172
    "0",
2038 jag 2173
    "0",
2174
    "0",
2049 jag 2175
    "Texture",
2124 jag 2176
    "Size tangent",
2126 jag 2177
    "Draw vertices & tangents",
2206 jag 2178
    "Track",
2212 jag 2179
    "View too",
2219 jag 2180
    "Draw",
2181
    "Draw cursor",
2182
    "Pin / Unpin",
2276 jag 2183
    "0",
1695 jag 2184
    // next label
964 jag 2185
  };
2186
 
2187
  button* buttons [] = {
2188
    &b_menu,
2189
    &b_microtonal_keyboard,
2190
    &b_keyboard_keyboard,
2191
    &b_mondrian,
2192
    &b_binaural_drones,
2193
    &b_microtonal_keyboard_waveform,
2194
    &b_drone_waveform,
2195
    &b_drone_modulation,
2196
    &b_voice_modulation,
2197
    &b_gater,
2198
    &b_keyboard_keyboard_waveform,
2199
    &b_attack,
2200
    &b_decay,
2201
    &b_midi_velocity,
2202
    &b_delays,
2203
    &b_octave_shift,
2204
    &b_compressor,
2205
    &b_morse_code,
2206
    &b_exit_din,
2207
    &cb_show_anchors,
1984 jag 2208
    &moverailstrafe.option,
964 jag 2209
    &b_delete_drones,
2210
    &b_select_all_drones,
2211
    &b_invert_drone_selection,
2212
    &b_record_phrase,
2213
    &b_clear_phrases,
1403 jag 2214
    &b_default_to_selected,
2215
    &b_default_to_all,
964 jag 2216
    &b_selected_to_all,
2217
    &b_key_to_pitch_at_cursor,
2218
    &b_insert_vertex,
2219
    &b_delete_vertex,
2220
    &b_fold_tangents,
2221
    &b_undo,
2222
    &b_redo,
2223
    &b_copy,
2224
    &b_paste,
2225
    &b_draw_replacement_curve,
2226
    &b_add_curve,
2227
    &b_replace_curve,
2228
    &b_delete_curve,
2229
    &b_start_capture,
2230
    &b_assign_capture,
2231
    &cb_label_vertices,
1128 jag 2232
    &cb_selection_only,
964 jag 2233
    &cb_show_waveform_samples,
2234
    &b_pick_curve,
2235
    &b_stop_rotating,
2236
    &cb_draw_curve,
2237
    &b_clear_record,
2238
    &cb_record,
2239
    &b_select_attractees,
2240
    &b_select_attractors,
2241
    &b_orbit_selected_drones,
2242
    &cb_show_vel,
2243
    &cb_show_accel,
2244
    &cb_show_gravity,
1827 jag 2245
    &balloon,
964 jag 2246
    &b_launch_drones,
2247
    &b_stop_launching_drones,
2248
    &b_track_drones,
2249
    &b_select_tracked_drones,
2250
    &b_mondrian_waveform,
2251
    &b_mondrian_attack,
2252
    &b_mondrian_decay,
2253
    &b_add_balls,
2254
    &b_move_selected_balls,
2255
    &b_delete_selected_targets,
2256
    &b_delete_all_targets,
2257
    &b_select_all_targets,
2258
    &b_invert_selected_targets,
2259
    &b_select_targets_in_box,
2260
    &b_split_horizontal,
2261
    &b_split_vertical,
2262
    &b_delete_box,
2263
    &b_freeze_balls,
2264
    &b_thaw_balls,
2265
    &b_turn_off_ui,
2266
    &b_set_targets,
2267
    &b_clear_targets,
2268
    &b_clear_modulations,
2269
    &b_modulate_balls_up,
2270
    &b_modulate_balls_down,
2271
    &b_create_binaurals_on_notes,
2272
    &b_create_binaurals_from_pitch,
2273
    &b_binaural_drones_waveform,
2274
    &cb_close_octave,
2275
    &b_auto_change_direction_clockwise,
2276
    &b_auto_change_direction_anti_clockwise,
2277
    &b_stop_auto_changing_direction,
2278
    &b_flip_direction,
2279
    &b_make_random_color,
2280
    &cb_resize_separation,
2281
    &b_add_remove_slits,
2282
    &b_toggle_wreckers,
2283
    &b_toggle_healers,
2284
    &b_toggle_bouncers,
2285
    &b_switch_ball_type,
2286
    &b_select_wreckers,
2287
    &b_select_healers,
2288
    &b_remove_slits_on_edge,
2289
    &b_toggle_slit_anim,
2290
    &cb_mondrian_auto_adjust_voices,
2291
    &cb_draw_boxes,
2292
    &cb_fill_boxes,
2293
    &cb_draw_notes,
2294
    &cb_label_notes,
2295
    &cb_draw_ball_position,
2296
    &b_make_note_grid,
2297
    &b_make_nxn_grid,
2298
    &b_delete_all_boxes,
2299
    &b_select_launchers,
1812 jag 2300
    &seloncre,
964 jag 2301
    &b_freeze_drones,
2302
    &b_thaw_drones,
2303
    &cb_mark_segments,
2304
    &cb_auto_split_box,
2305
    &cb_auto_delete_box,
2306
    &cb_speed,
2307
    &cb_turn,
2308
    &cb_teleport,
2309
    &cb_draw_ball_heading,
2310
    &cb_draw_ball_trails,
2311
    &l_draw_ball,
2312
    &cb_turn_sync,
2313
    &cb_speed_sync,
2314
    &cb_clone,
2315
    &cb_clone_can_clone,
2316
    &cb_transform,
2317
    &cb_label_hz_vol,
2318
    &bbd_select_all,
2319
    &bbd_select_none,
2320
    &bbd_invert_select,
2321
    &bbd_delete,
2322
    &bbd_sync,
2323
    &bbd_modulate,
2324
    &bbd_select2,
2325
    &bbd_flip,
2326
    &b_adjust_board_height,
2327
    &b_adjust_range_left,
2328
    &b_adjust_range_right,
2329
    &b_adjust_range_both,
2330
    &cb_mod_ran,
2331
    &cb_mark_ran,
2332
    &b_rm_pause_resume,
2333
    &b_rm_start_all,
2334
    &b_rm_stop_all,
2335
    &b_rm_toggle,
2336
    &b_get_cur_ran,
2337
    &b_range_modulation,
2338
    &b_adjust_range_height,
2339
    &b_change_note_left,
2340
    &b_change_note_right,
2341
    &b_set,
2342
    &b_unset,
1026 jag 2343
    &b_toggle,
1049 jag 2344
    &b_range_width_height,
1071 jag 2345
    &b_flip_rows_cols,
1551 jag 2346
    &cb_overlay,
1104 jag 2347
    &b_range_pitch_vol,
1128 jag 2348
    &b_swap_curves,
1137 jag 2349
    &cb_pitch_dis,
1140 jag 2350
    &cb_vol_dis,
1235 jag 2351
    &b_point_modulation,
1320 jag 2352
    &b_change_note_both,
2353
    &cb_am_bpm,
2354
    &cb_fm_bpm,
2355
    &b_set_to_mesh_rows,
1323 jag 2356
    &b_set_to_mesh_cols,
1423 jag 2357
    &b_noise_interpolator,
2358
    &b_ball_trig,
1429 jag 2359
    &b_scale_drones,
1430 jag 2360
    &b_rotate_drones,
1438 jag 2361
    &cb_draw_mesh,
1465 jag 2362
    &cb_modulation,
2363
    &cb_motion,
1467 jag 2364
    &cb_visual,
2365
    &b_connect,
1469 jag 2366
    &b_disconnect,
2367
    &cb_conn_wrap,
1475 jag 2368
    &b_drone_pend,
1485 jag 2369
    &b_abort_octave_shift,
2370
    &b_close,
1514 jag 2371
    &b_arrow_reset,
1547 jag 2372
    &b_mute,
1557 jag 2373
    &b_unmute,
2374
    &drone2noise,
2375
    &noise2drone,
1666 jag 2376
    &b_set_xform_center,
1675 jag 2377
    &cb_defaults,
1677 jag 2378
    &mortalize,
2379
    &reincarnate,
2380
    &immortalize,
1695 jag 2381
    &cb_chuck,
2382
    &chuck,
2383
    &chflip,
1697 jag 2384
    &chtog,
1748 jag 2385
    &choutline,
2386
    &chautoresettrails,
1768 jag 2387
    &dronearrow.cap,
2388
    &dronearrow.decap,
1776 jag 2389
    &dronearrowdefaults.cap,
1797 jag 2390
    &trackcon,
1806 jag 2391
    &dva.autorotate.cb,
2392
    &dva.autoflip.cb,
1809 jag 2393
    &dva.neg,
2394
    &dva.randomize,
2032 jag 2395
    &vel0,
2396
    &accel0,
1836 jag 2397
    &dva.sync,
1871 jag 2398
    &dva.autorotate.uet.deg,
2399
    &dva.autorotate.uet.tps,
1883 jag 2400
    &edlife2vel,
1950 jag 2401
    &b_snapx,
2402
    &b_snapy,
2403
    &b_snapboth,
2404
    &b_snapnone,
1948 jag 2405
    &am2fm,
2406
    &fm2am,
1950 jag 2407
    &ed_flip_rotation,
2408
    &cb_ed_autoflip,
2409
    &ed_autoflip_reset,
1970 jag 2410
    &dva.autopause.cb,
1998 jag 2411
    &damd0,
2412
    &dfmd0,
2038 jag 2413
    &masvol0,
2049 jag 2414
    &texture,
2125 jag 2415
    &size_tangent,
2126 jag 2416
    &draweditables,
2206 jag 2417
    &track_phrase_position,
2222 jag 2418
    &viewtoo,
2419
    &drawsnaps,
2420
    &drawcursor,
2219 jag 2421
    &pinunpin,
2276 jag 2422
    &sep0
1677 jag 2423
    // next button
2424
  };
964 jag 2425
 
1970 jag 2426
  dlog << "+++ Labeling buttons +++" << endl;
2427
 
2276 jag 2428
  for (int i = 0; i < 235; ++i) {
964 jag 2429
    button* bi = buttons[i];
1120 jag 2430
    bi->set_text (labels[i]);
964 jag 2431
  }
2432
 
1568 jag 2433
  dlog << "+++ Labeled buttons +++" << endl;
2434
 
1913 jag 2435
  am2fm.id = modulator::AM;
2436
  fm2am.id = modulator::FM;
2437
  LISTEN(am2fm, &am2fm2aml)
2438
  LISTEN(fm2am, &am2fm2aml)
2439
 
1465 jag 2440
  LISTEN(cb_modulation,&cmod)
2441
  LISTEN(cb_motion,&cmot)
2442
  LISTEN(cb_visual,&cvis)
1675 jag 2443
  LISTEN(cb_defaults,&cdef)
1695 jag 2444
  LISTEN(cb_chuck,&cch)
1768 jag 2445
  LISTEN(dronearrow.cap,&arrowl)
2446
  LISTEN(dronearrow.decap,&arrowl)
1647 jag 2447
 
1768 jag 2448
 
1647 jag 2449
#ifndef __WIDGET_MOVE__
2450
  LISTEN (b_arrow_reset,&awl)
2451
#endif
1465 jag 2452
 
964 jag 2453
  ol_select_what.set_text ("L");
2454
  ol_select_rule.set_text (" >= ");
2455
  bdf_value.change_lsnr = &bdl;
2456
  bdf_value.set_text (bdl.val[binaural_drones_listener::GREATER_THAN_EQUAL]);
2457
 
1855 jag 2458
  sp_bounces.set ("Bounces", 1, -1, MILLION, &bol);
964 jag 2459
  ol_bounce_style.set_listener (this);
2460
 
2273 jag 2461
  sep_bin.set ("Binaural Separation (Hz)", 0.01f, -MILLION, MILLION, &sepbinl);
2272 jag 2462
 
1865 jag 2463
  sp_rebound.set ("Rebound Speed %", 1, 0, MILLION, &rebl);
964 jag 2464
 
1647 jag 2465
  sp_mondrian_min_voices.set ("Min Voices", 1, 1, MILLION, &monl);
964 jag 2466
  sp_mondrian_min_voices.draw_more = 0;
1755 jag 2467
  sp_mondrian_min_voices.variance.ui = 0;
1647 jag 2468
 
964 jag 2469
  cb_mondrian_auto_adjust_voices.set_listener (&monl);
1647 jag 2470
 
2471
  sp_mondrian_change_attack_time.set ("Ball attack time", 0.01f, &batl);
2472
  sp_mondrian_change_decay_time.set ("Ball decay time", 0.01f, &bdtl);
2473
 
1120 jag 2474
  sp_mondrian_change_speed.set_text ("Ball speed");
964 jag 2475
  sp_mondrian_change_speed.set_listener (&bsl);
2476
  sp_mondrian_change_speed.set_listener (&monl, 1);
1647 jag 2477
 
2478
  sp_mondrian_change_dir.set ("Ball direction", 1, &brl);
964 jag 2479
  sp_mondrian_change_dir.orient = mouse_slider_listener::X;
1063 jag 2480
  sp_mondrian_change_dir.draw_more = 0;
1755 jag 2481
  sp_mondrian_change_dir.variance.ui = 0;
1551 jag 2482
 
1647 jag 2483
  sp_mondrian_change_trail_size.set ("Ball trail length", 1, &tll);
2484
  sp_mondrian_change_note_poly_points.set ("Note polygon points", 1, 2, MILLION, &nppl);
2485
  sp_mondrian_change_note_poly_radius.set ("Note polygon radius", 1, 0, MILLION, &nprl);
2486
 
2487
  sp_mondrian_change_slit_size.set ("Slit size", 1.0f, &ssl);
2488
 
2489
  sp_mondrian_change_slit_anim_time.set ("Slit open/close time", 0.01f, &satl);
2490
  sp_mondrian_change_slit_anim_time.set_value (0.0f);
2491
 
1551 jag 2492
  sp_mondrian_change_vol.set ("Ball volume", 0.01f, -MILLION, MILLION, &bvl);
964 jag 2493
  sp_mondrian_change_vol.set_value (0);
1551 jag 2494
 
2495
  sp_mondrian_num_boxes.set ("N", 1, 0, MILLION, &monl);
964 jag 2496
  sp_mondrian_num_boxes.draw_more = 0;
1755 jag 2497
  sp_mondrian_num_boxes.variance.ui = 0;
964 jag 2498
 
1647 jag 2499
  sp_auto_split_time.set ("", 0.1f, 0.01f, MILLION, &monl);
1677 jag 2500
  sp_auto_split_time.set_text ("Every", SECONDS);
964 jag 2501
 
1647 jag 2502
  sp_auto_delete_time.set ("", 0.1f, 0.01f, MILLION, &monl);
1677 jag 2503
  sp_auto_delete_time.set_text ("Every", SECONDS);
964 jag 2504
 
1647 jag 2505
  sp_min_split_size.set ("Min split size", 1, 2, MILLION, &monl);
2049 jag 2506
 
2507
  texstep.set ("Step", 1, 1, 1023, &stepl, 0);
2508
  text_ure.set_text ("din is noise");
2509
  text_ure.typing_lsnr = &mondrian0;
2510
 
964 jag 2511
 
1647 jag 2512
#ifndef __WIDGET_MOVE__
964 jag 2513
  cb_auto_split_box.set_listener (&monl);
2514
  cb_auto_delete_box.set_listener (&monl);
1647 jag 2515
#endif
964 jag 2516
 
2517
  options_list* olt [] = {&ol_bouncer, &ol_wrecker, &ol_healer};
2518
  for (int i = 0; i < 3; ++i) olt[i]->set_listener (&bolis);
2519
 
1015 jag 2520
  button* pb[] = {&sp_mondrian_change_dir.inc, &sp_mondrian_change_dir.dec};
964 jag 2521
  set_repeat (pb, 2, 0.005);
2522
 
2523
  recl.typing (lf_file.fld);
1647 jag 2524
 
1686 jag 2525
  {
2526
 
2527
    nullt* sp [] = {
2528
      &sp_change_drone_handle_size,
2529
      &sp_change_drone_trail_length,
1772 jag 2530
      &autorotate.rpm,
1776 jag 2531
      &autorotate.deg,
2532
      &autorotate.tps,
1686 jag 2533
      &sp_mondrian_change_vol,
2534
      &sp_mondrian_change_attack_time,
2535
      &sp_mondrian_change_decay_time,
2536
      &sp_mondrian_change_speed,
2537
      &sp_mondrian_change_slit_size,
2538
      &sp_mondrian_change_slit_anim_time,
2539
      &sp_change_drone_vel,
2540
      &sp_change_drone_accel,
2541
      &sp_dam_depth,
2542
      &sp_dfm_depth,
2543
      &sp_dam_bpm,
2544
      &sp_dfm_bpm,
1689 jag 2545
      &sp_drone_vol,
1768 jag 2546
      &dronearrow.shoulder.position,
2547
      &dronearrow.shoulder.width,
1689 jag 2548
      &sp_rotate_drone_vel,
2549
      &sp_drones_per_min,
2550
      &sp_drone_lifetime,
2551
      &sp_orbit_insertion_time,
2552
      &sp_mondrian_change_attack_time,
2553
      &sp_mondrian_change_decay_time,
2554
      &sp_mondrian_change_speed,
2555
      &sp_mondrian_change_dir,
2556
      &sp_mondrian_change_trail_size,
2557
      &sp_mondrian_change_vol,
2558
      &sp_mondrian_change_slit_size,
2559
      &sp_mondrian_change_slit_anim_time,
1695 jag 2560
      &chspeed,
2561
      &chlen,
1705 jag 2562
      &chtrail,
1772 jag 2563
      &autorotate.autoflip.angle,
1804 jag 2564
      &dronearrow.neck,
1776 jag 2565
      &dronearrow.shoulder.width,
2566
      &dronearrow.shoulder.position,
1894 jag 2567
      &dpl,
1686 jag 2568
 
2569
    };
2570
 
2571
    int i = 0;
2572
    while (sp[i] != 0) sp[i++]->null = 1;
2573
 
2574
  }
2575
 
2576
 
2577
 
964 jag 2578
}
2579
 
2580
void menu::update () {
2581
  position_menu_items ();
2582
  position_tabs ();
2583
}
2584
 
2585
void menu::position_menu_items () {
2586
  static const int lines = 4;
2587
  int targety = view.ymax - lines * line_height;
2588
  int dy = targety - cb_file.extents.bottom;
2311 jag 2589
  for (int p = 0; p < nitems; ++p) items[p]->move (0, dy, 0);
964 jag 2590
}
2591
 
1757 jag 2592
void menu::loadspinners () {
2593
  file_in fi ("spinners");
2594
  ifstream& f = fi ();
1804 jag 2595
  f >> handlesize >> trailsize >> dva.mag >> lifetime >> dronearrowdefaults.neck >> dronearrowdefaults.shoulder.width >> dronearrowdefaults.shoulder.position;
1906 jag 2596
  f >> dva.autorotate.rpm >> dva.autorotate.dps >> dva.autorotate.tps >> dva.autoflip.deg >> gabt;
1828 jag 2597
  f >> riset >> fallt;
2598
  f >> sp_bounces >> sp_rebound;
2106 jag 2599
  f >> gens >> ddpm >> ddpl >> sp_curve_every >> dva.autopause.every >> dva.autopause.f0r;
2286 jag 2600
  f >> uis.settings_scr.binaural.sep;
1757 jag 2601
}
2602
 
2603
void menu::savespinners () {
2604
  file_out fo ("spinners");
2605
  ofstream& f = fo ();
1805 jag 2606
  f << handlesize << trailsize << dva.mag << lifetime << dronearrowdefaults.neck << dronearrowdefaults.shoulder.width << dronearrowdefaults.shoulder.position;
1906 jag 2607
  f << dva.autorotate.rpm << dva.autorotate.dps << dva.autorotate.tps << dva.autoflip.deg << gabt;
2286 jag 2608
  f << riset << fallt << sp_bounces << sp_rebound << gens << ddpm << ddpl << sp_curve_every << dva.autopause.every << dva.autopause.f0r << uis.settings_scr.binaural.sep << endl;
1757 jag 2609
}
2610
 
1828 jag 2611
 
964 jag 2612
void menu::setup () {
2613
  dlog << "*** setting up menu ***" << endl;
1757 jag 2614
  show = screen_mousex = screen_mousey = 0;
964 jag 2615
  setup_items ();
1757 jag 2616
  widget_load ("d_menu", items, nitems);
2617
  loadspinners ();
1897 jag 2618
  initcolorsliders ();
1450 jag 2619
  b_menu.set_listener (&mbl);
964 jag 2620
  dlog << "+++ menu setup complete +++" << endl;
2621
}
2622
 
2623
void menu::set_pos (int x, int y) {
2624
  b_menu.set_pos (x, y);
2625
}
2626
 
2627
void menu::draw () {
1494 jag 2628
 
964 jag 2629
  b_menu.draw ();
1494 jag 2630
 
964 jag 2631
  if (show) {
1486 jag 2632
 
1519 jag 2633
    // draw bg
964 jag 2634
    glEnable (GL_BLEND);
2635
    glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
1483 jag 2636
      glColor4f (0.0f, 0.0f, 0.0f, opacity);
964 jag 2637
      glRecti (bg_extents.left, bg_extents.bottom, bg_extents.right, bg_extents.top);
1483 jag 2638
    glDisable (GL_BLEND);
964 jag 2639
 
2640
    glPolygonMode (GL_FRONT, GL_LINE);
1476 jag 2641
    glColor3f (0.5f, 0.5f, 0.5f);
964 jag 2642
    glRecti (bg_extents.left, bg_extents.bottom, bg_extents.right, bg_extents.top);
2643
    glPolygonMode (GL_FRONT, GL_FILL);
2644
 
2645
    // draw items
2646
    for (int i = 0; i < num_tabs; ++i) tabs[i]->draw ();
2647
    if (cur_tab) {
2648
      vector<widget*>& ti = tab_members [cur_tab];
1040 jag 2649
      for (int i = 0, j = ti.size (); i < j; ++i) ti[i]->draw ();
964 jag 2650
      if (cur_tab == &cb_mkb_voice && din0.phrasor0.state == phrasor::playing) s_phrase_position.set_val (din0.phrasor0.amount);
2651
    }
2652
  }
2653
}
2654
 
2655
void menu::setup_tabs (ui* scr) {
1941 jag 2656
  checkbutton* com [] = {&cb_file, &cb_instrument, &cb_editors, 0};
2657
  checkbutton* mkb [] = {&cb_mkb_voice, &cb_mkb_drone_tools, &cb_mkb_drone_params, &cb_mkb_ranges, &cb_mkb_misc, 0};
2658
  checkbutton* eds [] = {&cb_ed_tools, &cb_ed_curves, 0};
2659
  checkbutton* mon [] = {&cb_mon_tools, &cb_mon_parameters, &cb_mon_ballops, &cb_mon_boxops, &cb_mon_misc, 0};
2660
  checkbutton* bd [] = {&cb_binaural_drones_tools, &cb_binaural_drones_edit, 0};
964 jag 2661
  int clear_existing_tabs = 1;
1941 jag 2662
  setup_tabs (com, clear_existing_tabs);
964 jag 2663
  if (scr == &din0) { // microtonal keyboard
1941 jag 2664
    setup_tabs (mkb);
964 jag 2665
  } else if (scr == &keybd2) { // keyboard-keyboard
2666
  } else if (scr == &mondrian0) { // mondrian
1941 jag 2667
    setup_tabs (mon);
964 jag 2668
  } else if (scr == &binaural_drones0) { // binaural drones
1941 jag 2669
    setup_tabs (bd);
964 jag 2670
  } else { // is an editor 
1941 jag 2671
    setup_tabs (com, clear_existing_tabs);
2672
    setup_tabs (eds);
1439 jag 2673
    next_tab = &cb_ed_tools;
2674
    next_tab_instr = get_current_instrument ();
964 jag 2675
  }
2676
  position_tabs ();
2677
}
2678
 
1941 jag 2679
void menu::setup_tabs (checkbutton** tlist, int clear) {
964 jag 2680
  if (clear) tabs.clear ();
1941 jag 2681
  int i = 0;
2682
  checkbutton* ci = tlist[i];
2683
  while (ci) {
2684
    tabs.push_back (ci);
2685
    ci = tlist[++i];
2686
  }
964 jag 2687
  num_tabs = tabs.size ();
2688
}
2689
 
2690
void menu::position_tabs () {
1470 jag 2691
 
964 jag 2692
  if (num_tabs) {
1470 jag 2693
 
2311 jag 2694
    int x = cb_file.posx, y = cb_file.posy, spacing = 2 * fnt.spacing.word;
964 jag 2695
    int i = 1, j = 0;
1408 jag 2696
    for (; i < num_tabs;) {
1095 jag 2697
      x = x + get_char_width (tabs[j]->text) + spacing;
964 jag 2698
      tabs[i]->set_pos (x, y);
1408 jag 2699
      ++i;
2700
      j = i - 1;
964 jag 2701
    }
2702
 
1465 jag 2703
    int ss = x + get_char_width (tabs[j]->text) - cb_file.posx;
2704
    separators.main.set_extents (ss);
1470 jag 2705
    separators.dp0.set_extents (ss);
2706
    separators.dp1.set_extents (ss);
2311 jag 2707
 
964 jag 2708
    calc_bg ();
2709
 
2710
    checkbutton* lt = tabs[num_tabs - 1];
2711
    menu_mousex = lt->extents.right + 1;
2712
    menu_mousey = view.ymax - lt->posy;
1470 jag 2713
 
964 jag 2714
  }
2715
}
2716
 
2717
void menu::remove_from_tab (checkbutton* cb, widget* w) {
2718
  vector<widget*>& tw = tab_members [cb];
2719
  vector<widget*>::iterator end = tw.end (), i = find (tw.begin(), end, w);
2720
  if (i != end) tw.erase (i);
2721
}
2722
 
2723
void menu::add_to_tab (checkbutton* cb, widget* w) {
2724
  vector<widget*>& tw = tab_members[cb];
2725
  vector<widget*>::iterator end = tw.end (), i = find (tw.begin(), end, w);
2726
  if (i == end) tw.push_back (w);
2727
}
2728
 
1941 jag 2729
void menu::populatecurvestab (curve_editor* ed) {
2730
  destroycurvestab ();
2731
  vector<curve_info>& cis = ed->curveinfo;
2732
  vector<widget*>& tc = tab_members [&cb_ed_curves];
2733
  int lh = line_height, x = cb_file.extents.left, y = separators.main.extents.bottom - lh;
1955 jag 2734
  for (int i = 0, j = ed->curves; i < j; ++i) {
1941 jag 2735
    curve_info& ci = cis[i];
2736
    checkbutton* cb = new checkbutton;
2737
    tc.push_back (cb);
2738
    cb->id = i;
2739
    cb->set_text (ci.curve->name);
2740
    cb->set_state (ci.visible, 0);
2741
    cb->set_pos (x, y);
2742
    cb->set_listener (&curvesl);
2743
    y -= lh;
2744
  }
2745
}
2746
 
2747
void menu::destroycurvestab () {
2748
  vector<widget*>& tw = tab_members [&cb_ed_curves];
2749
  for (int i = 1, j = tw.size (); i < j; ++i) {
2750
    widget* wi = tw[i];
2751
    delete wi;
2752
  }
2753
  tw.clear ();
2754
  tw.push_back (&separators.main);
2755
}
2756
 
1465 jag 2757
void menu::set_drone_params_items (int s, int e) {
2758
  vector<widget*>& tw = tab_members[&cb_mkb_drone_params];
2759
  tw.clear ();
2760
  tw.push_back (&separators.main);
2761
  DECL_DRONE_PARAMS
2038 jag 2762
  for (int i = 0; i < 10; ++i) {
1465 jag 2763
    add_to_tab (&cb_mkb_drone_params, wdrone_params[i]);
2764
  }
2765
  for (int i = s; i < e; ++i) {
2766
    add_to_tab (&cb_mkb_drone_params, wdrone_params[i]);
2767
  }
2768
  calc_bg ();
2769
}
2770
 
964 jag 2771
int menu::handle_input () {
2772
 
1368 jag 2773
  if (b_menu.handle_input ()) return 1;
964 jag 2774
 
2775
  if (show) {
2776
 
1804 jag 2777
    if (wheel && !widget::HOVER) move_items (0, wheel * wheely);
2778
 
1368 jag 2779
    // find current tab
964 jag 2780
    for (int i = 0; i < num_tabs; ++i) tabs[i]->handle_input ();
2781
 
2782
    if (cur_tab) { // handle tab's items
2783
      vector<widget*>& tm = tab_members [cur_tab];
1040 jag 2784
      for (int i = 0, j = tm.size (); i < j; ++i) if (tm[i]->handle_input ()) return 1;
964 jag 2785
    }
2786
 
2787
  }
1368 jag 2788
 
964 jag 2789
  return 0;
1368 jag 2790
 
964 jag 2791
}
2792
 
1485 jag 2793
void menu::toggle (int mouse_warp) {
964 jag 2794
 
1640 jag 2795
  static int removedpluginbrowser;
2796
 
964 jag 2797
  show = !show;
1945 jag 2798
 
964 jag 2799
  if (show) {
2800
 
1120 jag 2801
    b_menu.set_text ("Close menu");
1485 jag 2802
 
1568 jag 2803
    if (b_close.visible) b_close.call_listener ();
1489 jag 2804
 
1551 jag 2805
    if (uis.current->inst) {
1576 jag 2806
      if (uis.current == &din0) {
2201 jag 2807
        din0.dinfo.gravity.hide ();
1551 jag 2808
        uis.remove (&mkb_selector);
1576 jag 2809
      }
1551 jag 2810
      else if (uis.current == &mondrian0)
2811
        uis.remove (&mon_selector);
2812
    } else {
2813
      uis.remove (&CRVED->capturer);
2814
      uis.remove (&CRVED->pomo);
1640 jag 2815
      removedpluginbrowser = uis.remove (&uis.plugin__browser);
1551 jag 2816
      if (CRVED->fft_enabled) uis.remove (&fft0);
1945 jag 2817
      if (CRVED->curcrvchgd) CRVED->setup_tools_menu ();
1551 jag 2818
    }
2819
 
964 jag 2820
    style_listener* sl [] = {&gater_style_lis, &am_style_lis, &fm_style_lis};
2821
    for (int i = 0; i < 3; ++i) sl[i]->get_style ();
2822
 
2823
    screen_mousex = mousex;
2824
    screen_mousey = mousey;
2825
    ::warp_mouse (menu_mousex, menu_mousey);
2826
 
1406 jag 2827
    if (next_tab && (next_tab_instr == get_current_instrument())) {
1393 jag 2828
      changed (*next_tab);
2829
      cur_tab = next_tab;
2830
      next_tab = 0;
1439 jag 2831
      next_tab_instr = 0;
1393 jag 2832
    }
964 jag 2833
 
2834
  } else {
1120 jag 2835
    b_menu.set_text ("Menu");
964 jag 2836
    menu_mousex = mousex;
2837
    menu_mousey = mousey;
1551 jag 2838
    if (uis.current->inst) {
1760 jag 2839
      if (uis.current == &din0 ) {
2201 jag 2840
        if (MENU.cb_show_gravity.state) din0.dinfo.gravity.show ();
1760 jag 2841
        if (!din0.adding && !b_close.visible) uis.add (&din0, &mkb_selector);
1576 jag 2842
      }
1568 jag 2843
      else if (uis.current == &mondrian0)
1551 jag 2844
        uis.widgets_of [&mondrian0].push_back (&mon_selector);
2845
    } else {
2846
      uis.widgets_of[CRVED].push_back (&CRVED->capturer);
2847
      uis.widgets_of[CRVED].push_back (&CRVED->pomo);
1640 jag 2848
      if (removedpluginbrowser) uis.widgets_of[CRVED].push_back (&uis.plugin__browser);
1551 jag 2849
      if (CRVED->fft_enabled) uis.widgets_of[CRVED].push_back (&fft0);
1489 jag 2850
    }
1485 jag 2851
    if (mouse_warp) warp_mouse (screen_mousex, screen_mousey);
964 jag 2852
  }
2853
 
2854
  uis.update_bottom_line ();
2855
 
2856
}
2857
 
2858
void menu::set_ball_ops (ball* b) {
2859
 
2860
  ball_op* ops [ball_op::NUM_OPS] = {&b->op_turn, &b->op_speed, &b->op_teleport, &b->op_clone, &b->op_transform};
2861
  checkbutton* cbn [ball_op::NUM_OPS] = {&cb_turn, &cb_speed, &cb_teleport, &cb_clone, &cb_transform};
2862
  for (int i = 0; i < ball_op::NUM_OPS; ++i) cbn[i]->set_state (ops[i]->alarm.active, 0);
2863
 
2864
  turn& trn = b->op_turn;
2865
  sp_turn_min.set_value (-trn.rd.min);
2866
  sp_turn_max.set_value (trn.rd.max);
2867
 
2868
  speed& spd = b->op_speed;
2869
  sp_speed_min.set_value (-spd.rd.min);
2870
  sp_speed_max.set_value (spd.rd.max);
2871
  sp_max_speed.set_value (spd.max);
2872
 
2873
  teleport& tel = b->op_teleport;
2874
  sp_tel_radius.set_value (tel.radius);
2875
 
2876
  Clone& clo = b->op_clone;
2877
  sp_clone_offset.set_value (clo.offset);
2878
  sp_max_clones.set_value (clo.max);
2879
  sp_max_balls.set_value (Clone::max_balls);
2880
  cb_clone_can_clone.set_state (clo.clone_can_clone);
2881
 
2882
  Transform& tf = b->op_transform;
2883
 
2884
  ball_op* bpa [] = {&trn, &spd, &tel, &clo, &tf};
2885
  spinner<float>* spa [] = {&sp_turn_every, &sp_speed_every, &sp_tel_every, &sp_clone_every, &sp_transform_every};
2886
  for (int i = 0; i < ball_op::NUM_OPS; ++i) spa[i]->set_value (bpa[i]->alarm.triggert);
2887
 
2888
}
2889
 
2890
void menu::clear_ball_ops () {
2891
  checkbutton* cbn [ball_op::NUM_OPS] = {&cb_turn, &cb_speed, &cb_teleport, &cb_clone, &cb_transform};
2892
  for (int i = 0; i < ball_op::NUM_OPS; ++i) cbn[i]->set_state (0, 0);
2893
}
2894
 
1450 jag 2895
CLICKED_BUTTON(menu, b_menu_lis) {
2896
  cons << YELLOW << "You can use right click to open / close the menu and mouse wheel to scroll" << eol;
1784 jag 2897
  TOGGLEMENU
1450 jag 2898
}
2899
 
2900
CLICKED_BUTTON(menu, b_inst_lis) {
2901
  int i = b.id;
2902
  scope.save_current_instrument ();
2903
  CURRENT_INSTRUMENT = i;
2904
  INSTRUMENT = INSTRUMENTS[i];
2905
  load_instrument ();
2906
}
2907
 
2908
CLICKED_BUTTON(menu, b_ed_lis) {
1502 jag 2909
  int i = b.id;
1450 jag 2910
  ui* ed = uis.uis[i];
1517 jag 2911
  uis.load_editor (ed);
1450 jag 2912
  setup_plugin_labels ();
2913
  if (curve_picker.visible) curve_picker.hide();
2914
}
2915
 
964 jag 2916
void misc_listener::clicked (button& b) {
1450 jag 2917
  if (&b == MENUP.b_exit_din)
964 jag 2918
    try_quit ();
2919
  else if (&b == MENUP.b_turn_off_ui) {
2920
    turn_off_ui ();
2921
    return;
1475 jag 2922
  } else
2923
    din0.set_key_to_pitch_at_cursor ();
1828 jag 2924
  TOGGLEMENU
964 jag 2925
}
2926
 
2927
void menu::move_items (int dx, int dy) {
1757 jag 2928
  for (int i = 0; i < nitems; ++i) {
964 jag 2929
    widget* wi = items[i];
2930
    wi->move (dx, dy, 0);
2931
  }
1942 jag 2932
 
2933
  if (CRVED) {
2934
    vector<widget*>& vc = tab_members[&cb_ed_curves];
2935
    int n = vc.size ();
2936
    for (int i = 1; i < n; ++i) vc[i]->move (dx, dy, 0);
2937
  }
2938
 
964 jag 2939
  calc_bg ();
2940
}
2941
 
2942
void menu::changed (checkbutton& tb) { // current tab has changed
2943
 
2944
  cur_tab = &tb;
1687 jag 2945
  tb.turn_on (DONT_CALL_LISTENER); // must be always on
964 jag 2946
 
2947
  if (cur_tab == last_tab) return;
2948
 
1687 jag 2949
  if (last_tab) last_tab->turn_off (DONT_CALL_LISTENER);
964 jag 2950
 
2951
  last_tab = cur_tab;
2952
 
2953
  calc_bg ();
2954
 
1495 jag 2955
  opacity = 0.9f;
2956
  if (&tb == &cb_mon_ballops || &tb == &cb_mon_boxops || &tb == &cb_mon_misc) opacity = 0.5f;
1447 jag 2957
 
964 jag 2958
  // save last tab to reload when loading new instrument
2959
  extern checkbutton* LAST_TABS [];
1941 jag 2960
  checkbutton* com [] = {&cb_file, &cb_instrument, &cb_editors, &cb_ed_tools, &cb_ed_curves}; // ignore these tabs
2961
  for (int i = 0; i < 5; ++i) if (com[i] == cur_tab) return;
964 jag 2962
  LAST_TABS [CURRENT_INSTRUMENT] = cur_tab;
2963
 
2964
}
2965
 
2306 jag 2966
 
2967
VALUE_CHANGED(menu,ancopalis) {
2968
  drone::anchoropacity = MENU.ancopa.value;
2969
  cons << "Drone anchor opacity = " << drone::anchoropacity << eol;
2970
}
2971
 
1498 jag 2972
VALUE_CHANGED(menu,sp_stiff_lis) {
2104 jag 2973
  drone::STIFFNESS = MENU.sp_stiff.value;
1709 jag 2974
  clamp (0.0f, drone::STIFFNESS, 1.0f);
2975
  cons << "Connection stiffness = " << drone::STIFFNESS << eol;
1498 jag 2976
}
2977
 
1819 jag 2978
VALUE_CHANGED(menu,gabt_lis) {
2107 jag 2979
  drone::gabt = MENU.gabt.value;
1559 jag 2980
  din0.gab.setgabt ();
1677 jag 2981
  cons << YELLOW << "Mute/unmute and Drone <> Noise time = " << drone::gabt << SECONDS << eol;
1547 jag 2982
}
2983
 
1452 jag 2984
VALUE_CHANGED(menu,sp_dam_depth_lis) {
1451 jag 2985
  din0.change_drone_depth (modulator::AM, MENU.sp_dam_depth);
2986
}
2987
 
1452 jag 2988
VALUE_CHANGED(menu,sp_dfm_depth_lis) {
1451 jag 2989
  din0.change_drone_depth (modulator::FM, MENU.sp_dfm_depth);
2990
}
2991
 
1912 jag 2992
VALUE_CHANGED(menu,sp_dam_pos_lis) {
2110 jag 2993
  MENU.sp_dam_pos.set_value (f);
1912 jag 2994
  din0.change_drone_modpos (modulator::AM, MENU.sp_dam_pos);
2995
}
2996
 
2997
VALUE_CHANGED(menu,sp_dfm_pos_lis) {
2110 jag 2998
  MENU.sp_dfm_pos.set_value (f);
1912 jag 2999
  din0.change_drone_modpos (modulator::FM, MENU.sp_dfm_pos);
3000
}
3001
 
1452 jag 3002
VALUE_CHANGED(menu,sp_dam_bpm_lis) {
3003
  din0.change_drone_bpm (modulator::AM, MENU.sp_dam_bpm);
1451 jag 3004
}
3005
 
1452 jag 3006
VALUE_CHANGED(menu,sp_dfm_bpm_lis) {
3007
  din0.change_drone_bpm (modulator::FM, MENU.sp_dfm_bpm);
1451 jag 3008
}
3009
 
1452 jag 3010
VALUE_CHANGED(menu,sp_am_depth_lis) {
3011
  din0.change_depth (din::AM, MENU.sp_am_depth());
3012
}
3013
 
3014
VALUE_CHANGED(menu,sp_fm_depth_lis) {
3015
  din0.change_depth (din::FM, MENU.sp_fm_depth());
3016
}
3017
 
3018
VALUE_CHANGED(menu,sp_am_bpm_lis) {
2107 jag 3019
  float v = MENU.sp_am_bpm.value;
1452 jag 3020
  v = din0.am.set_bpm (v);
2334 jag 3021
  cons << YELLOW << "Voice AM bpm = " << v << " or " << v / 60.0f << " hz" << eol;
1452 jag 3022
}
3023
 
3024
VALUE_CHANGED(menu,sp_fm_bpm_lis) {
2107 jag 3025
  float v = MENU.sp_fm_bpm.value;
1452 jag 3026
  v = din0.fm.set_bpm (v);
2334 jag 3027
  cons << YELLOW << "Voice FM bpm = " << v << " or " << v / 60.0f << " hz" << eol;
1452 jag 3028
}
3029
 
1686 jag 3030
VALUE_CHANGED(menu,sp_browse_drone_lis) {
2107 jag 3031
  din0.browsed_drone = MENU.sp_browse_drone.value;
1686 jag 3032
  din0.browse_drone (0);
3033
}
3034
 
1827 jag 3035
VALUE_CHANGED (menu,sp_bounces_lis) {
1855 jag 3036
  int& n = din0.dinfo.bounce.n;
2107 jag 3037
  n = MENU.sp_bounces.value;
1894 jag 3038
  if (n == -1) {
3039
    cons << RED << "Drones will not bounce from bottom of the microtonal keyboard!" << eol;
3040
    checkbutton& cb = MENU.sp_bounces.variance.cb;
3041
    cb.set_state (0, 0);
3042
  } else cons << GREEN << "Max bounces = " << n << eol;
1452 jag 3043
}
3044
 
3045
VALUE_CHANGED(menu,sp_rebound_lis) {
2107 jag 3046
  din0.dinfo.bounce.speed = MENU.sp_rebound.value;
1865 jag 3047
  cons << GREEN << "Rebound Max Speed %  = " << din0.dinfo.bounce.speed << eol;
1452 jag 3048
}
3049
 
964 jag 3050
void menu::changed (field& f) {
1451 jag 3051
 
1452 jag 3052
  if (&f == &sp_mesh_rows.f_value) {
2104 jag 3053
    din0.dinfo.rows = sp_mesh_rows.value;
1040 jag 3054
    if (cb_sync_rows_cols.state) {
1370 jag 3055
      din0.dinfo.cols = din0.dinfo.mesh_vars.dpp = din0.dinfo.rows;
1040 jag 3056
      sp_mesh_cols.set_value (din0.dinfo.cols);
1370 jag 3057
      sp_drones_per_pend.set_value (din0.dinfo.mesh_vars.dpp);
1040 jag 3058
    }
1438 jag 3059
    mkb_selector.set_mesh (din0.meshh.create, din0.dinfo.rows, din0.dinfo.cols);
1049 jag 3060
    picked (ol_mesh_point.option, 0);
964 jag 3061
  } else if (&f == &sp_mesh_cols.f_value) {
2104 jag 3062
    din0.dinfo.cols = sp_mesh_cols.value;
1040 jag 3063
    if (cb_sync_rows_cols.state) {
1370 jag 3064
      din0.dinfo.rows = din0.dinfo.mesh_vars.dpp = din0.dinfo.cols;
1040 jag 3065
      sp_mesh_rows.set_value (din0.dinfo.rows);
1370 jag 3066
      sp_drones_per_pend.set_value (din0.dinfo.mesh_vars.dpp);
1040 jag 3067
    }
1438 jag 3068
    mkb_selector.set_mesh (din0.meshh.create, din0.dinfo.rows, din0.dinfo.cols);
1049 jag 3069
    picked (ol_mesh_point.option, 0);
1046 jag 3070
  } else if (&f == &sp_mesh_dur.f_value) {
2104 jag 3071
    float t = sp_mesh_dur.value;
1094 jag 3072
    din0.dinfo.mesh_vars.duration = t;
1677 jag 3073
    cons << "Make mesh in " << t << SECONDS << eol;
1052 jag 3074
  } else if (&f == &f_mesh_xy) {
3075
    int r, c;
3076
    tokenizer z (f.text);
3077
    z >> r >> c;
3078
    if (clamp (0, r, din0.dinfo.rows-1) || clamp (0, c, din0.dinfo.cols-1) ) {
3079
      sprintf (BUFFER, "%d %d", r, c);
3080
      f_mesh_xy.set_text(BUFFER);
3081
    }
3082
    proximity_orderer::ROW = r;
3083
    proximity_orderer::COL = c;
1598 jag 3084
  } else if (&f == &dp_numdrones.f_value) {
2108 jag 3085
    din0.dinfo.drone_pend.n = MENU.dp_numdrones.value;
1598 jag 3086
    cons << YELLOW << "Number of Drones = " << din0.dinfo.drone_pend.n << eol;
1096 jag 3087
  } else if (&f == &dp_bpm1.f_value) {
2108 jag 3088
    din0.dinfo.drone_pend.bpm = MENU.dp_bpm1.value;
1477 jag 3089
    cons << YELLOW << "Drone Pendulum BPM = " << din0.dinfo.drone_pend.bpm << eol;
3090
  }
964 jag 3091
}
3092
 
3093
void menu::changed (slider<float>& s) {
1461 jag 3094
  din0.phrasor0.set_cur (s());
964 jag 3095
}
3096
 
3097
void menu::picked (label& lbl, int dir) {
3098
  const static char* mit [] = {" Tangents are not mirrored", " Tangents are mirrored"};
1829 jag 3099
  const static char* bbs [] = {" Drones bounce ahead", " Drones bounce back", " Drones bounce ahead or back"};
2077 jag 3100
  const static char *sut [] = {" Snap drones to notes", " Position affects vectors"};
1049 jag 3101
  const static char *ofl [] = {" in ascending rows", " in descending rows"," in ascending columns", " in descending columns", " randomly", " nearest to", " farthest from" };
1052 jag 3102
  const static char *wpt [] = {"bottom left", "bottom right", "top left", "top right", "center", "random point", "custom point"};
1320 jag 3103
  const static char *cwt [] = {" Create Drone Mesh", " Create Drone Pendulum"};
1096 jag 3104
  const static char *ort [] = {" Orientation = Horizontal", " Orientation = Vertical"};
2214 jag 3105
  const static char *mir [] = {" Horizontal Flip ", " Vertical Flip ", " Horizontal Flip (Local) ", " Vertical Flip (Local) " };
2287 jag 3106
  const static char *dris [] = {" Drone is Drone", " Drone is Noise", " Drone is Drone or Noise"};
1096 jag 3107
 
1052 jag 3108
  static const int npt = 7, npt_1 = npt-1;
1096 jag 3109
  static widget* mshw [] = {
3110
    &sp_mesh_rows,
3111
    &sp_mesh_cols,
3112
    &cb_sync_rows_cols,
3113
    &l_drone_order,
1101 jag 3114
    &sp_mesh_dur,
3115
    &b_flip_rows_cols,
1096 jag 3116
    &ol_drone_order,
1322 jag 3117
    &l_use_drone_pend,
3118
    &sp_drones_per_pend,
3119
    &l_apply_to,
3120
    &cb_am_bpm,
3121
    &cb_fm_bpm,
3122
    &b_set_to_mesh_rows,
3123
    &b_set_to_mesh_cols,
1096 jag 3124
    &ol_mesh_point,
3125
    &f_mesh_xy,
3126
  };
3127
  static widget* dpw [] = {
3128
    &dp_orient,
1598 jag 3129
    &dp_numdrones,
1096 jag 3130
    &dp_bpm1,
3131
  };
1044 jag 3132
 
2217 jag 3133
  if (&lbl == &ol_mirror_tangents.option) {
1128 jag 3134
    CRVED->mirror_tangents = !CRVED->mirror_tangents;
3135
    lbl.set_text (mit[CRVED->mirror_tangents]);
964 jag 3136
  } else if (&lbl == &ol_curve_style.option) {
1128 jag 3137
    CRVED->toggle_curve_style ();
964 jag 3138
  } else if (&lbl == &ol_bounce_style.option) {
3139
    din0.dinfo.bounce.style += dir;
1829 jag 3140
    wrap<int> (din_info::bouncet::AHEAD, din0.dinfo.bounce.style, din_info::bouncet::RANDOM);
964 jag 3141
    lbl.set_text (bbs[din0.dinfo.bounce.style]);
3142
  } else if (&lbl == &ol_set_unset_toggle.option) {
3143
    din0.dinfo.set_unset_toggle = !din0.dinfo.set_unset_toggle;
3144
    lbl.set_text (sut[din0.dinfo.set_unset_toggle]);
1545 jag 3145
    b_toggle.set_pos (lbl.extents.right + 20, b_toggle.posy);
3146
    b_set.set_pos (b_toggle.extents.right + 10, b_toggle.posy);
3147
    b_unset.set_pos (b_set.extents.right + 10, b_toggle.posy);
1037 jag 3148
  } else if (&lbl == &ol_drone_order.option) {
1094 jag 3149
    din0.dinfo.mesh_vars.order += dir;
3150
    wrap (0, din0.dinfo.mesh_vars.order, LAST_ORDERER);
3151
    lbl.set_text (ofl[din0.dinfo.mesh_vars.order]);
3152
    if (din0.dinfo.mesh_vars.order > 4) {
1040 jag 3153
      add_to_tab (&cb_mkb_drone_tools, &ol_mesh_point);
3154
      add_to_tab (&cb_mkb_drone_tools, &f_mesh_xy);
1408 jag 3155
      ol_mesh_point.set_pos (lbl.extents.right + 10, lbl.extents.bottom);
3156
      f_mesh_xy.set_pos (ol_mesh_point.option.extents.right + 10, f_mesh_xy.extents.bottom);
1040 jag 3157
    } else {
3158
      remove_from_tab (&cb_mkb_drone_tools, &ol_mesh_point);
3159
      remove_from_tab (&cb_mkb_drone_tools, &f_mesh_xy);
3160
    }
1037 jag 3161
  } else if (&lbl == &ol_mesh_point.option) {
1094 jag 3162
    din0.dinfo.mesh_vars.point += dir;
3163
    wrap (0, din0.dinfo.mesh_vars.point, npt_1);
3164
    sprintf (BUFFER, " %s @ ", wpt[din0.dinfo.mesh_vars.point]);
1037 jag 3165
    lbl.set_text (BUFFER);
1044 jag 3166
    int cols_1 = din0.dinfo.cols - 1;
3167
    int rows_1 = din0.dinfo.rows - 1;
3168
    rnd<int> rdr (0, rows_1), rdc (0, cols_1);
1052 jag 3169
    int ROW [] = {0, 0, rows_1, rows_1, din0.dinfo.rows / 2, rdr(), proximity_orderer::ROW};
3170
    int COL [] = {0, cols_1, 0, cols_1, din0.dinfo.cols / 2, rdc(), proximity_orderer::COL};
1094 jag 3171
    proximity_orderer::ROW = ROW [din0.dinfo.mesh_vars.point];
3172
    proximity_orderer::COL = COL [din0.dinfo.mesh_vars.point];
1049 jag 3173
    sprintf (BUFFER, "%d %d", proximity_orderer::ROW, proximity_orderer::COL);
1044 jag 3174
    f_mesh_xy.set_text (BUFFER);
1408 jag 3175
    f_mesh_xy.set_pos (lbl.extents.right + 10, f_mesh_xy.extents.bottom);
1098 jag 3176
  } else if (&lbl == &ol_create_this.option) {
3177
    din0.dinfo.create_this += dir;
3178
    wrap (0, din0.dinfo.create_this, 1);
3179
    int cw = din0.dinfo.create_this;
1096 jag 3180
    lbl.set_text (cwt[cw]);
1101 jag 3181
    if (cw) { // drone pendulum
1322 jag 3182
      for (int i = 0; i < 16; ++i) remove_from_tab (&cb_mkb_drone_tools, mshw[i]);
1477 jag 3183
      for (int i = 0; i < 3; ++i) add_to_tab (&cb_mkb_drone_tools, dpw[i]);
1101 jag 3184
    } else { // mesh
1477 jag 3185
      for (int i = 0; i < 3; ++i) remove_from_tab (&cb_mkb_drone_tools, dpw[i]);
1322 jag 3186
      int j = 14; if (din0.dinfo.mesh_vars.order > 4) j = 16;
1101 jag 3187
      for (int i = 0; i < j; ++i) add_to_tab (&cb_mkb_drone_tools, mshw[i]);
1096 jag 3188
    }
1495 jag 3189
    calc_bg ();
1096 jag 3190
  } else if (&lbl == &dp_orient.option) {
3191
    din0.dinfo.drone_pend.orient += dir;
3192
    wrap (0, din0.dinfo.drone_pend.orient, 1);
3193
    int o = din0.dinfo.drone_pend.orient;
3194
    lbl.set_text (ort[o]);
1128 jag 3195
  } else if (&lbl == &ol_mirror.option) {
3196
    CRVED->axis += dir;
1453 jag 3197
    wrap<int> (curve_editor::MIRROR_X, CRVED->axis, curve_editor::MIRROR_BBY);
1128 jag 3198
    lbl.set_text (mir[CRVED->axis]);
1453 jag 3199
    calc_bg ();
1387 jag 3200
  } else if (&lbl == &ol_drone_is.option) {
1813 jag 3201
    drone::IS += dir;
2287 jag 3202
    wrap<int> (drone::DRONE, drone::IS, drone::RANDOM);
1687 jag 3203
    const char* di = dris [drone::IS];
1398 jag 3204
    lbl.set_text (di);
2286 jag 3205
  }
964 jag 3206
}
3207
 
3208
void menu::calc_bg () {
3209
  if (cur_tab && num_tabs) {
3210
    vector<widget*>& v = tab_members [cur_tab];
3211
    if (v.size () == 0) return;
3212
    widget* w0 = v[0];
3213
    bg_extents.left = cb_file.extents.left;
3214
    bg_extents.right = bg_extents.left;
3215
    bg_extents.bottom = w0->extents.bottom;
3216
    bg_extents.top = tabs[0]->extents.top;
3217
    for (int i = 0, j = v.size (); i < j; ++i) {
3218
      widget* wi = v[i];
3219
      if (wi->extents.left < bg_extents.left) bg_extents.left = wi->extents.left;
3220
      if (wi->extents.right > bg_extents.right) bg_extents.right = wi->extents.right;
3221
      if (wi->extents.bottom < bg_extents.bottom) bg_extents.bottom = wi->extents.bottom;
3222
      if (wi->extents.top > bg_extents.top) bg_extents.top = wi->extents.top;
3223
    }
3224
    static const int GUTTER = 5;
3225
    bg_extents.resize (GUTTER, GUTTER);
3226
  }
1319 jag 3227
 
964 jag 3228
}
3229
 
3230
void menu::show_editors (ui* inst) {
1935 jag 3231
  // refer to weds
1941 jag 3232
  int starts [] = {0, 4, 15, 18};
3233
  int ends [] = {4, 15, 18, 19};
964 jag 3234
  int starti = starts[CURRENT_INSTRUMENT], endi = ends[CURRENT_INSTRUMENT];
3235
  vector<widget*>& tw = tab_members [&cb_editors];
3236
  for (int i = starti; i < endi; ++i) {
3237
    widget* ei = editors[i];
3238
    tw.push_back (ei);
3239
  }
3240
}
3241
 
3242
void menu::hide_editors () {
3243
  vector<widget*>& tw = tab_members [&cb_editors];
1941 jag 3244
  for (int i = 0; i < 19; ++i) {
964 jag 3245
    widget* ei = editors[i];
3246
    vector<widget*>::iterator itr = find (tw.begin(), tw.end(), ei);
3247
    if (itr != tw.end()) tw.erase (itr);
3248
  }
3249
}
3250
 
3251
void menu::update_bpm (const string& name, float value) {
3252
  spinner<float>* psp = bpm_map [name];
3253
  if (psp) psp->set_value (value);
3254
}
3255
 
3256
void menu::mark_tap_target () {
3257
  interpreter ("set taptarget");
3258
  tokenizer tz (interpreter.result);
3259
  while (1) {
3260
    string target; tz >> target;
3261
    if (target == "") break;
1687 jag 3262
    if (target == "gr") cb_gater.turn_on (DONT_CALL_LISTENER);
3263
    else if (target == "am") cb_am.turn_on (DONT_CALL_LISTENER);
3264
    else if (target == "fm") cb_fm.turn_on (DONT_CALL_LISTENER);
3265
    else if (target == "os") cb_octave_shift.turn_on (DONT_CALL_LISTENER);
964 jag 3266
  }
3267
}
3268
 
3269
menu::~menu () {
3270
  dlog << "--- destroying menu ---" << endl;
2039 jag 3271
 
3272
#ifdef __WIDGET_MOVE__
1757 jag 3273
  widget_save ("d_menu", items, nitems);
2039 jag 3274
#endif
1757 jag 3275
  savespinners ();
1897 jag 3276
  savecolorsliders ();
1941 jag 3277
  destroycurvestab ();
2039 jag 3278
 
964 jag 3279
  dlog << "--- destroyed menu ---" << endl;
3280
}
3281
 
3282
void octave_shift_listener::clicked (button& b) {
3283
  if (&b == MENUP.ab_octave_up || &b == &uis.ab_octave_up) modulate_up (); else modulate_down ();
3284
}
3285
 
3286
void octave_shift_listener::changed (field& f) {
2233 jag 3287
  float v = 0.0f;
3288
  if (&f == MENUP.sp_octave_shift_bpm.f_value) {
3289
    v = MENU.sp_octave_shift_bpm.value;
3290
    uis.sp_octave_shift_bpm.set_value (v);
3291
  }
3292
  else {
3293
    v = uis.sp_octave_shift_bpm.value;
3294
    MENU.sp_octave_shift_bpm.set_value (v);
3295
  }
3296
  v = octave_shift.set_bpm (v);
964 jag 3297
  static const string los = "Octave shift BPM = ";
1368 jag 3298
  cons << YELLOW << los << v << eol;
964 jag 3299
}
3300
 
3301
void voice_volume_listener::changed (field& f) {
2108 jag 3302
  VOICE_VOLUME = MENU.sp_voice_volume.value;
1441 jag 3303
  static const string vv ("Volume = ");
964 jag 3304
  cons << YELLOW << vv << VOICE_VOLUME << eol;
3305
}
3306
 
1241 jag 3307
void drone_master_volume_listener::changed (field& f) {
2102 jag 3308
  din0.setdronemastervolume (MENU.sp_drone_master_vol.value);
1241 jag 3309
}
3310
 
964 jag 3311
void gater_bpm_listener::changed (field& f) {
2108 jag 3312
  float v = MENU.sp_gater_bpm.value;
964 jag 3313
  v = din0.gatr.set_bpm (v);
2157 jag 3314
  static const string gt = "Beater BPM = ";
964 jag 3315
  cons << YELLOW << gt << v << eol;
3316
}
3317
 
3318
void drone_handle_size_listener::changed (field& f) {
1060 jag 3319
  din0.change_drone_handle_size (MENU.sp_change_drone_handle_size);
964 jag 3320
}
3321
 
3322
void drone_trail_length_listener::changed (field& f) {
1060 jag 3323
  din0.change_drone_trail_points (MENU.sp_change_drone_trail_length);
964 jag 3324
}
3325
 
3326
void change_drone_vel_listener::changed (field& f) {
1019 jag 3327
  din0.change_drone_vel (MENU.sp_change_drone_vel);
964 jag 3328
}
3329
 
3330
void change_drone_accel_listener::changed (field& f) {
1058 jag 3331
  din0.change_drone_accel (MENU.sp_change_drone_accel);
964 jag 3332
}
3333
 
2077 jag 3334
void rotate_drone_vec_listener::changed (field& f) {
3335
  int id = f.id;
3336
  spinner<float>* sp [] = {MENUP.sp_rotate_drone_vel, MENUP.rotaccel};
2078 jag 3337
  rotdir* rd [] = {MENUP.rdvel, MENUP.rdaccel};
3338
  din0.rotate_drone_vec (id, *sp[id], rd[id]->val);
964 jag 3339
}
3340
 
3341
void drones_per_min_listener::changed (field& f) {
1058 jag 3342
  din0.change_drones_per_min (MENU.sp_drones_per_min);
964 jag 3343
}
3344
 
1893 jag 3345
void menu::dpllis::changed (field& f) {
3346
  din0.change_drones_per_launch (MENU.dpl);
3347
}
3348
 
964 jag 3349
void drone_lifetime_listener::changed (field& f) {
1058 jag 3350
  din0.change_drone_lifetime (MENU.sp_drone_lifetime);
964 jag 3351
}
3352
 
3353
void orbit_insertion_time_listener::changed (field& f) {
1058 jag 3354
  din0.change_orbit_insertion_time (MENU.sp_orbit_insertion_time);
964 jag 3355
}
3356
 
3357
void style_listener::set_style (const string& style) {
3358
  for (int i = 0; i < num_styles; ++i) {
3359
    if (styles[i] == style) {
3360
      id = i;
3361
      string command ("set-style " + what + " " + style);
3362
      interpreter (command);
3363
      oplist.set_text (prefix + style);
3364
    }
3365
  }
3366
}
3367
 
3368
void style_listener::get_style () {
3369
  string command ("get-style " + what);
3370
  interpreter (command);
3371
  oplist.set_text (prefix + interpreter.result);
3372
}
3373
 
3374
void style_listener::next_style (int dir) {
3375
  id += dir;
3376
  if (id < 0) id = last_style; else if (id >= num_styles) id = 0;
3377
  set_style (styles[id]);
3378
}
3379
 
3380
void style_listener::picked (label& lbl, int dir) {
3381
  next_style (dir);
3382
}
3383
 
3384
void drone_commands_listener::changed (checkbutton& cb) {
3385
  int state = cb.state;
3386
  if (&cb == MENUP.cb_show_vel) din0.dinfo.vel = state; else
3387
  if (&cb == MENUP.cb_show_accel) din0.dinfo.accel = state; else
1868 jag 3388
  if (&cb == MENUP.cb_show_gravity) {
3389
    gravity_t& gr = din0.dinfo.gravity;
2201 jag 3390
    if (state) uis.add (&din0, &gr); else uis.remove (&gr);
1868 jag 3391
  } else
964 jag 3392
  if (&cb == MENUP.cb_show_anchors) din0.dinfo.anchor = state; else
1812 jag 3393
  if (&cb == MENUP.seloncre) din0.dinfo.seloncre = state;
1094 jag 3394
  else din0.dinfo.mesh_vars.sync = cb.state;
964 jag 3395
}
3396
 
3397
void phrase_commands_listener::clicked (button& b) {
1784 jag 3398
  TOGGLEMENU
964 jag 3399
  if (&b == MENUP.b_record_phrase) din0.do_phrase_recording ();
3400
  else if (&b == MENUP.b_clear_phrases) din0.clear_all_phrases ();
3401
}
3402
 
3403
void range_data::read_mod () {
3404
  int& a = din0.ranges[din0.dinfo.sel_range].mod.active;
3405
  mod = a;
3406
  a = 0;
3407
}
3408
 
3409
void range_data::write_mod () {
3410
  din0.ranges[din0.dinfo.sel_range].mod.active = mod;
3411
}
3412
 
3413
void range_height_listener::clicked (button& b) {
3414
  mouse_slider0.add (MENUP.rhl);
3415
  MENU.rhl.read_mod ();
3416
  activate_mouse_slider ();
3417
}
3418
 
1566 jag 3419
void range_height_listener::moused (int dh, double scl) {
964 jag 3420
  din0.height_changed (din0.dinfo.sel_range, dh);
3421
}
3422
 
3423
void range_height_listener::after_slide () {
3424
  MENU.rhl.write_mod ();
3425
}
3426
 
3427
void board_height_listener::read_mod () {
3428
  int n = din0.num_ranges;
3429
  moda.resize (n);
3430
  for (int i = 0; i < n; ++i) {
3431
    int& a = din0.ranges[i].mod.active;
3432
    moda[i]=a;
3433
    a = 0;
3434
  }
3435
}
3436
 
3437
void board_height_listener::write_mod () {
3438
  int n = din0.num_ranges;
3439
  for (int i = 0; i < n; ++i) din0.ranges[i].mod.active = moda[i];
3440
}
3441
 
1566 jag 3442
void board_height_listener::moused (int dh, double scl) {
964 jag 3443
  din0.height_changed (-1, dh);
3444
}
3445
 
3446
void board_height_listener::clicked (button& b) {
3447
  MENU.bhl.name = "Board height";
3448
  MENU.bhl.orient = mouse_slider_listener::Y;
3449
  mouse_slider0.add (MENUP.bhl);
3450
  MENU.bhl.read_mod ();
3451
  activate_mouse_slider ();
3452
}
3453
 
3454
void board_height_listener::after_slide () {
3455
  MENU.bhl.write_mod ();
3456
}
3457
 
3458
void set_range_listener::clicked (button& b) {
3459
  if (&b == MENUP.b_selected_to_all) {
3460
    din0.selected_range_to_all (i);
3461
  } else if (&b == MENUP.b_default_to_selected) {
3462
    din0.default_range_to_selected (i);
3463
  } else if (&b == MENUP.b_default_to_all) {
3464
    din0.default_range_to_all (i);
3465
  }
3466
}
3467
 
3468
void set_range_listener::picked (label& lbl, int dir) {
3469
  i = !i;
3470
  static const char* opts [] = {" Set Width?", " Set Height?"};
3471
  lbl.set_text (opts[i]);
3472
}
3473
 
3474
void range_width_listener::clicked (button& b) {
3475
  if (&b == MENUP.b_adjust_range_left) {
3476
    MENU.arl.range = din0.dinfo.sel_range;
3477
    MENU.arl.read_mod ();
3478
    mouse_slider0.add (MENUP.arl);
3479
    activate_mouse_slider ();
3480
  } else if (&b == MENUP.b_adjust_range_right) {
3481
    MENU.arr.range = din0.dinfo.sel_range;
3482
    MENU.arr.read_mod ();
3483
    mouse_slider0.add (MENUP.arr);
3484
    activate_mouse_slider ();
3485
  } else {
3486
    MENU.arb.range = din0.dinfo.sel_range;
3487
    MENU.arb.read_mod ();
3488
    mouse_slider0.add (MENUP.arb);
3489
    activate_mouse_slider ();
3490
  }
1605 jag 3491
  din0.adjustranges.set ();
964 jag 3492
}
3493
 
1566 jag 3494
void adjust_range_left_listener::moused (int dir, double scl) {
964 jag 3495
  if (din0.range_left_changed (range, dir, 1)) {
1402 jag 3496
    din0.refresh_drones (0, range);
964 jag 3497
    din0.find_visible_ranges ();
3498
  }
3499
}
3500
 
3501
void adjust_range_left_listener::after_slide () {
3502
  MENU.arl.write_mod ();
1605 jag 3503
  din0.adjustranges.unset ();
964 jag 3504
}
3505
 
1566 jag 3506
void adjust_range_right_listener::moused (int dir, double scl) {
964 jag 3507
  if (din0.range_right_changed (range, dir, 1)) {
1402 jag 3508
    din0.refresh_drones (range, din0.last_range);
964 jag 3509
    din0.find_visible_ranges ();
3510
  }
3511
}
3512
 
3513
void adjust_range_right_listener::after_slide () {
3514
  MENU.arr.write_mod ();
1605 jag 3515
  din0.adjustranges.unset ();
964 jag 3516
}
3517
 
1566 jag 3518
void adjust_range_both_listener::moused (int dir, double scl) {
964 jag 3519
  int rl = din0.range_left_changed (range, -dir, 1);
3520
  int rr = din0.range_right_changed (range, dir, 1);
3521
  if (rl || rr) {
1402 jag 3522
    din0.refresh_all_drones ();
964 jag 3523
    din0.find_visible_ranges ();
3524
  }
3525
}
3526
 
3527
void adjust_range_both_listener::after_slide () {
3528
  MENU.arb.write_mod ();
1605 jag 3529
  din0.adjustranges.unset ();
964 jag 3530
}
1452 jag 3531
 
3532
VALUE_CHANGED(menu, sp_range_lis) {
2108 jag 3533
  din0.dinfo.sel_range = MENU.sp_range.value;
1764 jag 3534
  MENU.load_range_mod (din0.dinfo.sel_range);
1452 jag 3535
}
3536
 
3537
VALUE_CHANGED(menu, sp_ran_mod_width_lis) {
2108 jag 3538
  float v = MENU.sp_ran_mod_width.value;
3539
  din0.ranges [din0.dinfo.sel_range].mod.fm.depth = v;
1764 jag 3540
  sprintf (BUFFER, "Range %d, Modulation Width = %0.3f", din0.dinfo.sel_range, v);
3541
  cons << BUFFER << eol;
1452 jag 3542
}
3543
 
3544
VALUE_CHANGED(menu, sp_ran_mod_width_bpm_lis) {
2108 jag 3545
  float v = MENU.sp_ran_mod_width_bpm.value;
1764 jag 3546
  din0.ranges[din0.dinfo.sel_range].mod.fm.bv.set_bpm (v);
3547
  sprintf (BUFFER, "Range %d, Modulation Width BPM = %0.3f", din0.dinfo.sel_range, v);
3548
  cons << BUFFER << eol;
1452 jag 3549
}
3550
 
3551
VALUE_CHANGED(menu, sp_ran_mod_height_lis) {
2108 jag 3552
  float v = MENU.sp_ran_mod_height.value;
1764 jag 3553
  din0.ranges[din0.dinfo.sel_range].mod.am.depth = v;
3554
  sprintf (BUFFER, "Range %d, Modulation Height = %0.3f", din0.dinfo.sel_range, v);
3555
  cons << BUFFER << eol;
1452 jag 3556
}
3557
 
3558
VALUE_CHANGED(menu, sp_ran_mod_height_bpm_lis) {
2108 jag 3559
  float v = MENU.sp_ran_mod_height_bpm.value;
1764 jag 3560
  din0.ranges[din0.dinfo.sel_range].mod.am.bv.set_bpm (v);
3561
  sprintf (BUFFER, "Range %d, Modulation Height BPM = %0.3f", din0.dinfo.sel_range, v);
3562
  cons << BUFFER << eol;
964 jag 3563
}
3564
 
3565
void range_mod_lis::edited (curve_editor* ed, int i) {
3566
  din0.update_range_mod_solvers (i, ed->mix);
3567
  curve_listener::edited (ed, i);
3568
}
3569
 
3570
void menu::load_range (int r) {
3571
  sp_range.set_value (r);
1308 jag 3572
  load_range_mod (r);
964 jag 3573
}
3574
 
1308 jag 3575
void menu::load_range_mod (int r) {
3576
  range& ri = din0.ranges [r];
1760 jag 3577
  cb_mod_ran.set_state (ri.mod.active, 0);
964 jag 3578
  sp_ran_mod_width.set_value (ri.mod.fm.depth);
3579
  sp_ran_mod_width_bpm.set_value (ri.mod.fm.bv.bpm);
3580
  sp_ran_mod_height.set_value (ri.mod.am.depth);
3581
  sp_ran_mod_height_bpm.set_value (ri.mod.am.bv.bpm);
1436 jag 3582
  ol_fixed.set_text (ol_fixed_lbls [ri.fixed]);
1401 jag 3583
  print_range_info (ri);
964 jag 3584
}
3585
 
3586
void snap_drones_listener::picked (label& l, int dir) {
3587
  din0.dinfo.snap.style += dir;
1012 jag 3588
  static const char* ss [] = {" Free", " Slide", " Lock", " Mirror"};
964 jag 3589
  wrap<int> (din_info::snap_t::FREE, din0.dinfo.snap.style, din_info::snap_t::MIRROR);
3590
  l.set_text (ss[din0.dinfo.snap.style]);
3591
}
3592
 
3593
void snap_drones_listener::changed (field& f) {
2108 jag 3594
  float v;
964 jag 3595
  if (&f == MENUP.sp_snap_left.f_value) {
2108 jag 3596
    v = MENU.sp_snap_left.value;
1804 jag 3597
    float dl = v - din0.dinfo.snap.left;
3598
    din0.dinfo.snap.left = v;
964 jag 3599
    if (din0.dinfo.snap.style > din_info::snap_t::FREE) {
1012 jag 3600
      if (din0.dinfo.snap.style == din_info::snap_t::SLIDE) {
3601
        din0.dinfo.snap.right += dl;
3602
      }
3603
      else if (din0.dinfo.snap.style == din_info::snap_t::LOCK) {
964 jag 3604
        din0.dinfo.snap.right = din0.dinfo.snap.left;
1012 jag 3605
      }
3606
      else {
3607
        din0.dinfo.snap.right = 1.0f - din0.dinfo.snap.left;
964 jag 3608
      }
3609
      MENU.sp_snap_right.set_value (din0.dinfo.snap.right);
1804 jag 3610
    }
1012 jag 3611
  } else if (&f == MENUP.sp_snap_right.f_value) {
2108 jag 3612
    v = MENU.sp_snap_right.value;
1804 jag 3613
    float dr = v - din0.dinfo.snap.right;
3614
    din0.dinfo.snap.right = v;
964 jag 3615
    if (din0.dinfo.snap.style > din_info::snap_t::FREE) {
3616
      if (din0.dinfo.snap.style == din_info::snap_t::LOCK) {
3617
        din0.dinfo.snap.left = din0.dinfo.snap.right;
1012 jag 3618
      } else if (din0.dinfo.snap.style == din_info::snap_t::SLIDE) {
3619
        din0.dinfo.snap.left += dr;
964 jag 3620
      } else {
3621
        din0.dinfo.snap.left = 1.0f - din0.dinfo.snap.right; // mirror
3622
      }
3623
      MENU.sp_snap_left.set_value (din0.dinfo.snap.left);
3624
    }
3625
  }
3626
 
1804 jag 3627
  if (din0.dinfo.snap.left > din0.dinfo.snap.right || din0.dinfo.snap.left < 0.0f || din0.dinfo.snap.right > 1.0f)
3628
    cons << RED;
3629
  else
3630
    cons << GREEN;
964 jag 3631
  sprintf (BUFFER, "Snap left = %0.3f, Snap right = %0.3f", din0.dinfo.snap.left, din0.dinfo.snap.right);
3632
  cons << BUFFER << eol;
3633
}
3634
 
3635
void scope_listener::changed (field& f) {
2109 jag 3636
  int n = 0;
964 jag 3637
  if (&f == MENUP.sp_scope_height.f_value) {
2109 jag 3638
    n = MENU.sp_scope_height.value;
3639
    scope.set_height (n);
964 jag 3640
    static const string ht = "Height = ";
3641
    cons << YELLOW << ht << n << eol;
1920 jag 3642
  } else if (&f == MENUP.sp_scope_samples.f_value) {
2109 jag 3643
    n = MENU.sp_scope_samples.value;
2113 jag 3644
    n = scope.set_num_samples (n);
964 jag 3645
    static const string ns = "Samples = ";
3646
    cons << YELLOW << ns << n << eol;
1920 jag 3647
  } else {
2109 jag 3648
    float o = MENU.scopacity.value;
3649
    scope.setopacity (o);
1920 jag 3650
    static const string op = "Opacity = ";
1921 jag 3651
    cons << YELLOW << op << o << eol;
964 jag 3652
  }
3653
}
3654
 
3655
void scope_listener::changed (checkbutton& cb) {
3656
  scope.visible = cb.state;
3657
}
3658
 
3659
void scope_listener::setup () {
3660
  if (scope.visible) MENU.cb_scope.turn_on (0); else MENU.cb_scope.turn_off (0);
3661
  MENU.sp_scope_height.set_value (scope.height);
3662
  MENU.sp_scope_samples.set_value (scope.num_samples);
1921 jag 3663
  MENU.scopacity.set_value (scope.opacity);
964 jag 3664
}
3665
 
3666
void tap_bpm_listener::changed (tap_display& td) {
3667
  sprintf (BUFFER, "%.3f", td.bpm);
3668
  MENU.l_tap_bpm_value.set_text (BUFFER);
3669
  extern double TAP_BPM; TAP_BPM = td.bpm;
3670
  Tcl_UpdateLinkedVar (interpreter.interp, "tapbpm");
3671
}
3672
 
3673
void tap_bpm_listener::changed (checkbutton& cb) {
3674
  checkbutton* cbs [] = {MENUP.cb_am, MENUP.cb_fm, MENUP.cb_gater, MENUP.cb_octave_shift};
3675
  const char* targets [] = {"am", "fm", "gr", "os"};
3676
  for (int i = 0; i < 4; ++i) {
3677
    checkbutton* cbi = cbs[i];
3678
    if (&cb == cbi) {
3679
      if (cbi->state)
3680
        sprintf (BUFFER, "add-tap-target %s", targets[i]);
3681
      else
3682
        sprintf (BUFFER, "remove-tap-target %s", targets[i]);
3683
      interpreter (BUFFER);
3684
      return;
3685
    }
3686
  }
3687
  if (&cb == MENUP.cb_auto_reset) {
3688
    if (MENU.cb_auto_reset.state) interpreter ("set resetbeat 1"); else interpreter ("set resetbeat 0");
3689
  }
3690
}
3691
 
3692
void pan_zoom_listener::clicked (button& b) {
1128 jag 3693
  if (&b == MENUP.abe_left) {CRVED->do_panx (1); cons << YELLOW << "You can press a to move curves left" << eol;}
3694
  else if (&b == MENUP.abe_right) {CRVED->do_panx (-1); cons << YELLOW << "You can press d to move curves right"<< eol;}
3695
  else if (&b == MENUP.abe_up) {CRVED->do_pany (-1); cons << YELLOW << "You can press w to move curves up" << eol;}
3696
  else if (&b == MENUP.abe_down) {CRVED->do_pany (+1); cons << YELLOW << "You can press s to move curves down" << eol;}
3697
  else if (&b == MENUP.pb_zoom_in) {CRVED->do_zoom (-1); cons << YELLOW << "You can press e to zoom in" << eol;}
3698
  else {CRVED->do_zoom (+1);cons << YELLOW << "You can press q to zoom out" << eol;}
964 jag 3699
}
3700
 
1901 jag 3701
void snap_listener::clicked (button& b) {
3702
  static int xs [] = {0, 1, 0, 1};
3703
  static int ys [] = {0, 0, 1, 1};
3704
  static const char* mesgs [] = {
3705
    "You can press n to turn off snapping", "You can press x to snap X",
3706
    "You can press y to snap Y", "You can press b to snap both X and Y"
3707
  };
3708
  button* snaps [] = {MENUP.b_snapnone, MENUP.b_snapx, MENUP.b_snapy, MENUP.b_snapboth};
1225 jag 3709
  for (int i = 0; i < 4; ++i) {
1901 jag 3710
    if (&b == snaps[i]) {
1900 jag 3711
      CRVED->set_snap (xs[i], ys[i]);
964 jag 3712
      cons << YELLOW << mesgs[i] << eol;
1225 jag 3713
      break;
964 jag 3714
    }
3715
  }
3716
}
3717
 
2222 jag 3718
void snap_listener::changed (checkbutton& cb) {
3719
  toggle (CRVED->draww.snaps, basic_editor::drawt::snapss);
3720
}
3721
 
3722
void menu::undoredoviewlis::changed (checkbutton& cb) {
2223 jag 3723
  int& urw = CRVED->undo_redo_win;
3724
  urw = !urw;
3725
  static const char* urws[] = {"Wont", "Will"};
3726
  cons << YELLOW << urws[urw] << " change view on undo or redo" << eol;
2222 jag 3727
}
3728
 
3729
void menu::drawcursorlis::changed (checkbutton& cb) {
3730
  ::toggle (CRVED->draww.guide, basic_editor::drawt::guides);
3731
}
3732
 
964 jag 3733
void menu::set_mirror_tangents (int i) {
3734
  const static char* mit [] = {" Tangents are not mirrored", " Tangents are mirrored"};
3735
  ol_mirror_tangents.option.set_text (mit[i]);
3736
}
3737
 
3738
void menu::set_repeat (button** B, int n, double dt) {
3739
  for (int i = 0; i < n; ++i) {
3740
    button* bi = B[i];
3741
    bi->click_repeat = 1;
3742
    bi->first_repeat_time = bi->subsequent_repeat_time = dt;
3743
  }
3744
}
3745
 
3746
void menu::set_pan_repeat (double dt) {
3747
  button* ab [] = {&abe_left, &abe_right, &abe_up, &abe_down, &abm_left, &abm_right, &abm_up, &abm_down};
3748
  set_repeat (ab, 8, dt);
3749
}
3750
 
3751
void menu::set_zoom_repeat (double dt) {
3752
  button* zb [] = {&pb_zoom_in, &mb_zoom_out, &bm_zoom_in, &bm_zoom_out};
3753
  set_repeat (zb, 4, dt);
3754
}
3755
 
1685 jag 3756
void menu::curve_ops_listener::clicked (button& b) {
964 jag 3757
  int toggle = 1;
3758
  if (&b == MENUP.b_undo) {
3759
    cons << YELLOW << "You can press z to undo!" << eol;
1128 jag 3760
    CRVED->do_undo ();
964 jag 3761
    toggle = 0;
3762
  } else
3763
  if (&b == MENUP.b_redo) {
3764
    cons << YELLOW << "You can press LSHIFT + z to redo!" << eol;
1128 jag 3765
    CRVED->do_redo ();
964 jag 3766
    toggle = 0;
3767
  } else
3768
  if (&b == MENUP.abl_left) {
1117 jag 3769
    cons << YELLOW << "You can press 9 to load previous curve from library" << eol;
1128 jag 3770
    CRVED->do_load_curve (-1);
964 jag 3771
    toggle = 0;
3772
  } else
3773
  if (&b == MENUP.abl_right) {
1117 jag 3774
    cons << YELLOW << "You can press 0 to load next curve from library" << eol;
1128 jag 3775
    CRVED->do_load_curve (+1);
964 jag 3776
    toggle = 0;
3777
  }
3778
  if (&b == MENUP.b_insert_vertex) {
1128 jag 3779
    CRVED->insert_using_menu ();
964 jag 3780
  } else if (&b == MENUP.b_delete_vertex) {
1128 jag 3781
    CRVED->remove_using_menu ();
1950 jag 3782
  } else if (&b == MENUP.b_stop_rotating) {
3783
    MENU.sp_curve_rpm.set_value (0);
3784
    CRVED->set_rpm (0);
3785
    cons << "Stopped rotating curve" << eol;
3786
  } else if (&b == MENUP.ed_flip_rotation) {
1955 jag 3787
    int& dir = CRVED->curveinfo[CRVED->curcrv].dir;
3788
    dir *= -1;
1950 jag 3789
    static const char* cac [] = {"clockwise", "", "anti-clockwise"};
1955 jag 3790
    cons << "Curve rotation is " << cac[dir+1] << eol;
1950 jag 3791
  } else if (&b == MENUP.ed_autoflip_reset) {
1955 jag 3792
    CRVED->curveinfo[CRVED->curcrv].totang = 0.0f;
1950 jag 3793
    cons << "Autoflip reset on curve rotation" << eol;
964 jag 3794
  } else if (&b == MENUP.b_fold_tangents) {
1128 jag 3795
    CRVED->fold_tangents_using_menu ();
3796
  } else if (&b == MENUP.ol_mirror.option) {
3797
    CRVED->mirror_using_menu ();
964 jag 3798
  } else if (&b == MENUP.b_copy) {
1128 jag 3799
    CRVED->copy_using_menu ();
964 jag 3800
  } else if (&b == MENUP.b_paste) {
1128 jag 3801
    CRVED->paste_using_menu ();
3802
  } else if (&b == MENUP.b_swap_curves) {
3803
    CRVED->swap ();
3804
  } else if (&b == MENUP.b_pick_curve) {
3805
    CRVED->do_pick_curve ();
964 jag 3806
  }
3807
  // to library
3808
  else if (&b == MENUP.b_add_curve) {
1128 jag 3809
    CRVED->add_curve ();
964 jag 3810
  } else if (&b == MENUP.b_replace_curve) {
1128 jag 3811
    CRVED->replace_curve ();
964 jag 3812
  } else if (&b == MENUP.b_delete_curve) {
1128 jag 3813
    CRVED->delete_curve ();
964 jag 3814
  } else if (&b == MENUP.b_draw_replacement_curve) {
1128 jag 3815
    CRVED->draw_replacement_curve_using_menu ();
964 jag 3816
  } else if (&b == MENUP.b_start_capture) {
1128 jag 3817
    CRVED->start_mouse_capture_from_menu ();
964 jag 3818
  } else if (&b == MENUP.b_assign_capture) {
1128 jag 3819
    CRVED->assign_mouse_capture_from_menu ();
2125 jag 3820
  } else if (&b == MENUP.size_tangent) {
3821
    CRVED->try_sizing_tangent ();
2219 jag 3822
  } else if (&b == MENUP.pinunpin) {
3823
    CRVED->pinunpin_using_menu ();
964 jag 3824
  }
1784 jag 3825
  if (toggle) TOGGLEMENU
964 jag 3826
}
3827
 
2122 jag 3828
void menu::curve_ops_listener::moused (int dir, double scl) {
2125 jag 3829
  CRVED->size_tangent (dir * scl);
2122 jag 3830
}
3831
 
1685 jag 3832
void menu::curve_ops_listener::changed (checkbutton& cb) {
1117 jag 3833
  int tog = 0;
1950 jag 3834
  int cbstate = cb.state;
3835
  if (&cb == MENUP.cb_ed_autoflip) {
1955 jag 3836
    curve_info& ci = CRVED->curveinfo[CRVED->curcrv];
3837
    ci.autoflip = cbstate;
3838
    ci.totang = 0.0f;
1957 jag 3839
  } else if (&cb == MENUP.sp_curve_every.variance.cb) {
3840
    curve_info& ci = CRVED->curveinfo[CRVED->curcrv];
1958 jag 3841
    ci.randoflip = cbstate;
1950 jag 3842
  } else if (&cb == MENUP.cb_mark_segments) {
2126 jag 3843
    CRVED->marksegments = cbstate;
964 jag 3844
  } else if (&cb == MENUP.cb_label_vertices) {
1950 jag 3845
    CRVED->label_vertices = cbstate;
964 jag 3846
  } else if (&cb == MENUP.cb_show_waveform_samples) {
1128 jag 3847
    CRVED->toggle_waveform_samples_display ();
964 jag 3848
  } else if (&cb == MENUP.cb_draw_curve) {
2126 jag 3849
    CRVED->drawcurve = cbstate;
3850
  } else if (&cb == MENUP.draweditables) {
3851
    CRVED->draweditables = cbstate;
1071 jag 3852
  } else {
1950 jag 3853
    CRVED->overlay = cbstate;
1117 jag 3854
    string n (get_current_instrument()->name);
1950 jag 3855
    if (cbstate)
1117 jag 3856
      cons << GREEN << "Overlaid the " << n << eol;  
3857
    else
3858
      cons << RED << "Removed " << n << " from overlay." << eol;
3859
    tog = 1;
1071 jag 3860
  }
1784 jag 3861
  if (tog) TOGGLEMENU
964 jag 3862
}
3863
 
1685 jag 3864
void menu::curve_ops_listener::changed (field& f) {
1959 jag 3865
  if (&f == MENUP.sp_curve_rpm.f_value) {
2103 jag 3866
    CRVED->set_rpm (MENU.sp_curve_rpm.value);
1950 jag 3867
  } else if (&f == MENUP.sp_curve_every.f_value) {
1955 jag 3868
    curve_info& ci = CRVED->curveinfo[CRVED->curcrv];
2103 jag 3869
    ci.every0 = MENU.sp_curve_every.value;
1958 jag 3870
    ci.every = ci.every0.deg;
1950 jag 3871
    static const char* ae = "Autoflip every ", *deg = DEGREES;
1958 jag 3872
    cons << ae << ci.every0.deg << deg << eol;
1959 jag 3873
  } else if (&f == MENUP.sp_curve_every.variance.fld) {
3874
    curve_info& ci = CRVED->curveinfo[CRVED->curcrv];
3875
    ci.rd = MENU.sp_curve_every.variance.rd;
2039 jag 3876
  } else if (&f == MENUP.crvwav.hz.f_value) {
2106 jag 3877
    CRVED->set_hz (MENU.crvwav.hz.value);
2039 jag 3878
  } else if (&f == MENUP.crvwav.periods.f_value) {
2106 jag 3879
    CRVED->set_periods (MENU.crvwav.periods.value);
2039 jag 3880
  } else if (&f == MENUP.crvwav.time.f_value) {
2106 jag 3881
    curve_samples::nsec = MENU.crvwav.time.value;
964 jag 3882
  } else if (&f == MENUP.sp_curve_limit.f_value) {
2106 jag 3883
    CRVED->set_limit (MENU.sp_curve_limit.value);
964 jag 3884
  } else {
3885
    if (f.text == "") f.set_text ("nameless");
1128 jag 3886
    CRVED->set_picked_curve_name (f.text);
1945 jag 3887
    vector<widget*>& tc = MENU.tab_members [MENUP.cb_ed_curves];
3888
    widget* wcc = tc [1 + CRVED->curcrv]; // 0 = separator
3889
    checkbutton* cb = dynamic_cast<checkbutton*>(wcc);
3890
    cb->set_text (f.text);
964 jag 3891
  }
3892
}
3893
 
2121 jag 3894
void menu::curve_ops_listener::after_slide () {
2122 jag 3895
  CRVED->quick_nothing ();
2121 jag 3896
}
964 jag 3897
 
3898
void recording_listener::typing (field& f) {
3899
  string fname (recorder0.folder + f.text);
3900
  string cmd ("file exists " + fname);
3901
  interpreter (cmd); int result; stringstream ss; ss << interpreter.result; ss >> result;
1120 jag 3902
  if (result) MENU.b_save.set_text ("Overwrite"); else MENU.b_save.set_text ("Save");
964 jag 3903
  recorder0.fname = f.text;
3904
}
3905
 
3906
void recording_listener::changed (checkbutton& cb) {
3907
  int state = cb.state;
3908
  if (state == 0) { // show recording save section of file menu
3909
    MENU.changed (MENU.cb_file);
1784 jag 3910
    if (MENU.show == 0) TOGGLEMENU
964 jag 3911
  } else { // close file menu
1784 jag 3912
    if (MENU.show == 1) TOGGLEMENU
964 jag 3913
  }
2146 jag 3914
  justset (uis.cb_record, state);
3915
  justset (MENU.cb_record, state);
964 jag 3916
}
3917
 
3918
void mondrian_listener::handle_split (int& var, int dir, float t) {
3919
  switch (var) {
3920
    case 0: // into 2 boxes
3921
      mondrian0.split_rect (dir, t);
3922
      break;
3923
    case 1: // into notes
3924
      mondrian0.multi_split_rect (dir);
3925
      break;
3926
    case 2: // into n x n grid
3927
      mondrian0.multi_split_rect (mondrian0.num_boxes, dir);
3928
  }
3929
}
3930
 
3931
void mondrian_listener::clicked (button& b) {
3932
  int toggle = 1;
3933
  if (&b == MENUP.b_split_horizontal) handle_split (hsplit, split::HORIZONTAL, mondrian0.win.mousey);
3934
  else if (&b == MENUP.b_split_vertical) handle_split (vsplit, split::VERTICAL, mondrian0.win.mousex);
3935
  else if (&b == MENUP.b_add_balls) mondrian0.do_add_balls (mondrian0.added_ball_type);
3936
  else if (&b == MENUP.b_add_remove_slits) mondrian0.start_slitting ();
3937
  else if (&b == MENUP.b_modulate_balls_up) {if (!mondrian0.modulate_balls (+1)) cons << RED << "Please select some balls!" << eol;}
3938
  else if (&b == MENUP.b_modulate_balls_down) {if (!mondrian0.modulate_balls (-1)) cons << RED << "Please select some balls!" << eol;}
3939
  else if (&b == MENUP.b_select_all_targets) {mondrian0.select_all_targets ();toggle=0;}
3940
  else if (&b == MENUP.b_invert_selected_targets) {mondrian0.invert_selected_targets ();toggle=0;}
3941
  else if (&b == MENUP.b_select_targets_in_box) {mondrian0.select_box_targets ();toggle=0;}
3942
  else if (&b == MENUP.b_delete_box) mondrian0.delete_current_rect ();
3943
  else if (&b == MENUP.b_delete_all_boxes) mondrian0.delete_all_rects = 1;
3944
  else if (&b == MENUP.b_freeze_balls) mondrian0.freeze_balls (mondrian0.get_balls());
3945
  else if (&b == MENUP.b_thaw_balls) mondrian0.thaw_balls (mondrian0.get_balls());
3946
  else if (&b == MENUP.b_delete_all_targets) mondrian0.delete_all_targets ();
3947
  else if (&b == MENUP.b_delete_selected_targets) mondrian0.delete_selected_targets ();
3948
  else if (&b == MENUP.b_move_selected_balls) mondrian0.do_move_balls ();
3949
  else if (&b == MENUP.b_toggle_wreckers) mondrian0.toggle_balls_type (ball::WRECKER);
3950
  else if (&b == MENUP.b_toggle_healers) mondrian0.toggle_balls_type (ball::HEALER);
3951
  else if (&b == MENUP.b_toggle_bouncers) mondrian0.toggle_balls_type (ball::BOUNCER);
3952
  else if (&b == MENUP.b_switch_ball_type) mondrian0.switch_balls_type ();
3953
  else if (&b == MENUP.b_select_wreckers) mondrian0.select_type (ball::WRECKER);
3954
  else if (&b == MENUP.b_select_healers) mondrian0.select_type (ball::HEALER);
3955
  else if (&b == MENUP.b_remove_slits_on_edge) mondrian0.remove_slits_on_current_edge ();
3956
  else if (&b == MENUP.b_toggle_slit_anim) mondrian0.toggle_slit_anim ();
3957
  else if (&b == MENUP.b_clear_modulations) mondrian0.clear_modulations (mondrian0.get_balls());
3958
  else if (&b == MENUP.b_auto_change_direction_clockwise) {mondrian0.set_auto_rotate (-1);}
3959
  else if (&b == MENUP.b_auto_change_direction_anti_clockwise) {mondrian0.set_auto_rotate (1);}
3960
  else if (&b == MENUP.b_stop_auto_changing_direction) {mondrian0.set_auto_rotate (0);}
3961
  else if (&b == MENUP.b_flip_direction) {mondrian0.flip_velocity();}
3962
  else if (&b == MENUP.b_make_random_color) mondrian0.randomise_box_color();
3963
  else if (&b == MENUP.b_make_note_grid) mondrian0.make_note_grid ();
3964
  else if (&b == MENUP.b_make_nxn_grid) mondrian0.make_nxn_grid ();
1423 jag 3965
  else if (&b == MENUP.b_ball_trig) mondrian0.toggle_triggered_sound ();
964 jag 3966
  else if (&b == MENUP.abm_left) {mondrian0.do_panx (1); toggle=0;}
3967
  else if (&b == MENUP.abm_right) {mondrian0.do_panx (-1); toggle=0;}
3968
  else if (&b == MENUP.abm_up) {mondrian0.do_pany (+1);toggle=0;}
3969
  else if (&b == MENUP.abm_down) {mondrian0.do_pany (-1); toggle=0;}
3970
  else if (&b == MENUP.bm_zoom_in) {mondrian0.do_zoom(-1); toggle=0;}
3971
  else if (&b == MENUP.bm_zoom_out) {mondrian0.do_zoom(+1); toggle=0;}
1784 jag 3972
  if (toggle) TOGGLEMENU
964 jag 3973
}
3974
 
3975
void mondrian_listener::changed (checkbutton& cb) {
3976
  if (&cb == MENUP.cb_auto_split_box) {
3977
    mondrian0.auto_split_rect.active = cb.state;
1887 jag 3978
    if (cb.state) mondrian0.auto_split_rect.start ();
964 jag 3979
  } else if (&cb == MENUP.cb_auto_delete_box) {
3980
    mondrian0.auto_del_rect.active = cb.state;
1887 jag 3981
    if (cb.state) mondrian0.auto_del_rect.start ();
964 jag 3982
  } else if (&cb == MENUP.cb_draw_boxes) {
3983
    mondrian0.draw__boxes = cb.state;
3984
  } else if (&cb == MENUP.cb_fill_boxes) {
3985
    mondrian0.fill_boxes = cb.state;
3986
  } else if (&cb == MENUP.cb_draw_notes) {
3987
    mondrian0.draw__notes = cb.state;
3988
  } else if (&cb == MENUP.cb_label_notes) {
3989
    mondrian0.label_notes = cb.state;
3990
  } else if (&cb == MENUP.cb_label_hz_vol) {
3991
    mondrian0.label_hz_vol = cb.state;
3992
  } else if (&cb == MENUP.cb_draw_ball_position) {
3993
    mondrian0.draw_ball.position = cb.state;
3994
  } else if (&cb == MENUP.cb_draw_ball_heading) {
3995
    mondrian0.draw_ball.heading = cb.state;
3996
  } else if (&cb == MENUP.cb_draw_ball_trails) {
3997
    mondrian0.draw_ball.trails = cb.state;
3998
  } else if (&cb == MENUP.cb_mondrian_auto_adjust_voices) {
3999
    mondrian0.auto_adjust_voices = cb.state;
4000
  }
4001
}
4002
 
4003
void ball_speed_listener::changed (field& f) {
1063 jag 4004
  mondrian0.change_speed (MENU.sp_mondrian_change_speed, MENU.sp_mondrian_change_speed.dir_delta ());
964 jag 4005
}
4006
 
4007
void ball_direction_listener::changed (field& f) {
1063 jag 4008
  mondrian0.rotate_velocity (MENU.sp_mondrian_change_dir.dir);
964 jag 4009
}
4010
 
4011
void ball_volume_listener::changed (field& f) {
1069 jag 4012
  mondrian0.change_ball_vol_mult (MENU.sp_mondrian_change_vol);
964 jag 4013
}
4014
 
4015
void trail_length_listener:: changed (field& f) {
1063 jag 4016
  mondrian0.change_trail_size (MENU.sp_mondrian_change_trail_size);
964 jag 4017
}
4018
 
1063 jag 4019
void ball_attack_time_listener:: changed (field& f) {
4020
  mondrian0.change_attack_time_kb (MENU.sp_mondrian_change_attack_time);
964 jag 4021
}
4022
 
1063 jag 4023
void ball_decay_time_listener:: changed (field& f) {
4024
  mondrian0.change_decay_time_kb (MENU.sp_mondrian_change_decay_time);
964 jag 4025
}
4026
 
4027
void slit_size_listener:: changed (field& f) {
1063 jag 4028
  mondrian0.change_slit_size (MENU.sp_mondrian_change_slit_size);
964 jag 4029
}
4030
 
4031
void slit_anim_time_listener:: changed (field& f) {
1063 jag 4032
  mondrian0.change_slit_anim_time (MENU.sp_mondrian_change_slit_anim_time);
964 jag 4033
}
4034
 
4035
void note_poly_radius_listener::changed (field& f) {
2109 jag 4036
  mondrian0.set_note_poly_radius (MENU.sp_mondrian_change_note_poly_radius.value);
964 jag 4037
}
4038
 
4039
void note_poly_points_listener::changed (field& f) {
2109 jag 4040
  mondrian0.set_note_poly_points (MENU.sp_mondrian_change_note_poly_points.value);
964 jag 4041
}
4042
 
4043
void mondrian_listener::changed (field& f) {
2109 jag 4044
 
4045
  if (&f == MENUP.sp_mondrian_change_speed.f_delta) {
4046
    float ds = MENU.sp_mondrian_change_speed.value;
4047
    mondrian0.delta_speed = ds;
4048
  } else if (&f == MENUP.sp_mondrian_min_voices.f_value) {
4049
    int v = MENU.sp_mondrian_min_voices.value;
4050
    mondrian0.min_voices = v;
964 jag 4051
    uis.update_bottom_line ();
4052
    cons << YELLOW << "Min voices = " << mondrian0.min_voices << eol;
4053
  } else if (&f == MENUP.sp_mondrian_num_boxes.f_value) {
2109 jag 4054
    mondrian0.num_boxes = MENU.sp_mondrian_num_boxes.value;
964 jag 4055
    cons << YELLOW << "Number of boxes = " << mondrian0.num_boxes << eol;
4056
  } else if (&f == MENUP.sp_auto_split_time.f_value) {
2109 jag 4057
    float t = MENU.sp_auto_split_time.value;
4058
    mondrian0.auto_split_rect.triggert = t;
4059
    cons << YELLOW << "Split box every = " << t << " secs" << eol;
964 jag 4060
  } else if (&f == MENUP.sp_auto_delete_time.f_value) {
2109 jag 4061
    float t = MENU.sp_auto_delete_time.value;
4062
    mondrian0.auto_del_rect.triggert = t;
4063
    cons << YELLOW << "Delete box every = " << t << " secs" << eol;
964 jag 4064
  } else {
2109 jag 4065
    int mss = MENU.sp_min_split_size.value;
4066
    mondrian::min_split_size = mss;
4067
    cons << YELLOW << "Min split size = " << mss << eol;
964 jag 4068
  }
4069
}
4070
 
4071
void mondrian_listener::handle_auto_pick_box (options_list& ol, int dir, int& v) {
4072
  v += dir;
4073
  wrap<int> (rect::EARLIEST, v, rect::BALLED);
4074
  ol.set_text (pick_box_types[v]);
4075
}
4076
 
4077
void mondrian_listener::picked (label& lbl, int dir) {
4078
  if (&lbl == MENUP.ol_auto_pick_box_split.option) {
4079
    handle_auto_pick_box (MENU.ol_auto_pick_box_split, dir, mondrian0.split_leaf);
4080
  } else if (&lbl == MENUP.ol_auto_pick_box_delete.option) {
4081
    handle_auto_pick_box (MENU.ol_auto_pick_box_delete, dir, mondrian0.delete_leaf);
4082
  } else if (&lbl == MENUP.ol_auto_split_at.option) {
4083
    mondrian0.auto_split_at += dir;
4084
    if (mondrian0.auto_split_at < split::NOTES) mondrian0.auto_split_at = split::ANYWHERE;
4085
    else if (mondrian0.auto_split_at > split::ANYWHERE) mondrian0.auto_split_at = split::NOTES;
4086
    MENU.ol_auto_split_at.set_text (auto_split_at_types [mondrian0.auto_split_at]);
4087
  } else if (&lbl == MENUP.ol_auto_split_orient.option) {
4088
    mondrian0.auto_split_orient += dir;
4089
    if (mondrian0.auto_split_orient < split::HORIZONTAL) mondrian0.auto_split_orient = split::BOTH;
4090
    else if (mondrian0.auto_split_orient > split::BOTH) mondrian0.auto_split_orient = split::HORIZONTAL;
4091
    MENU.ol_auto_split_orient.set_text (auto_split_orient_types [mondrian0.auto_split_orient]);
4092
  } else if (&lbl == MENUP.ol_ball_types.option) {
4093
    mondrian0.added_ball_type += dir;
4094
    if (mondrian0.added_ball_type < ball::BOUNCER)
4095
      mondrian0.added_ball_type = ball::HEALER;
4096
    else if (mondrian0.added_ball_type > ball::HEALER)
4097
      mondrian0.added_ball_type = ball::BOUNCER;
4098
    MENU.ol_ball_types.set_text (ball::types_str[mondrian0.added_ball_type]);
4099
  } else if (&lbl == MENUP.ol_split_types_h.option) {
4100
    hsplit += dir;
4101
    check_split_type (MENU.ol_split_types_h, hsplit);
4102
  } else if (&lbl == MENUP.ol_split_types_v.option) {
4103
    vsplit += dir;
4104
    check_split_type (MENU.ol_split_types_v, vsplit);
4105
  } else if (&lbl == MENUP.ol_selection_targets.option) {
4106
    mondrian0.clear_selected_targets ();
4107
    mondrian0.sel_tar = !mondrian0.sel_tar;
4108
    MENU.ol_selection_targets.set_text (selection_targets[mondrian0.sel_tar]);
4109
    static const char* bb [] = {"Select all balls", "Select balls in box", "Invert selected balls", "Delete all balls", "Delete selected balls"};
4110
    static const char* bs [] = {"Select all slits", "Select slits in box", "Invert selected slits", "Remove all slits", "Remove selected slits"};
4111
    const char** pb [] = {bs, bb};
4112
    button* bt [] = {
4113
      MENUP.b_select_all_targets, MENUP.b_select_targets_in_box,
4114
      MENUP.b_invert_selected_targets, MENUP.b_delete_all_targets,
4115
      MENUP.b_delete_selected_targets
4116
    };
4117
    const char** cb = pb[mondrian0.sel_tar];
1120 jag 4118
    for (int i = 0; i < 5; ++i) bt[i]->set_text (cb[i]);
964 jag 4119
  }
4120
}
4121
 
4122
void mondrian_listener::check_split_type (options_list& ol, int& o) {
4123
  if (o < 0) o = MAX_SPLIT_TYPES; else if (o > MAX_SPLIT_TYPES) o = 0;
4124
  ol.set_text (split_types[o]);
4125
}
4126
 
4127
 
4128
binaural_drones_listener::binaural_drones_listener () : select_rule (GREATER_THAN_EQUAL), select_what (0) {
4129
  val[EQUAL] = "0";
4130
  val[GREATER_THAN_EQUAL] = val[LESSER_THAN_EQUAL]= "100";
4131
  val[ID] = "1 2 1";
4132
  val[RANGE] = "100 200";
4133
  just = binaural_drone::CENTER;
4134
}
4135
 
4136
void binaural_drones_listener::changed (field& f) {
2110 jag 4137
  float v = float (f);
964 jag 4138
  if (&f == MENUP.lf_bd_start_pitch.fld) {
4139
    binaural_drones0.starting_pitch = v;
4140
  } else if (&f == MENUP.lf_master_volume.fld) {
4141
    float ov = binaural_drones0.master_volume * 100.0f;
4142
    float mv = v / 100.0f;
4143
    binaural_drones0.master_volume = mv;
4144
    stringstream cmd;
4145
    cmd << "set-all-binaurals-volume " << mv;
4146
    interpreter (cmd.str());
4147
    sprintf (BUFFER, "Master Volume from %0.2f%% to %0.2f%% : please wait or ESC to abort", ov, v);
4148
    cons << YELLOW << BUFFER << eol;
4149
  } else if (&f == MENUP.lf_vol_fade_time.fld) {
4150
    binaural_drones0.vol_fader.set_duration (v);
4151
  } else if (&f == MENUP.lf_pitch_fade_time.fld) {
4152
    binaural_drones0.pitch_fader.set_duration (v);
4153
  } else if (&f == MENUP.lf_modulation_amount.fld) {
4154
    if (v < 1.0f) {
4155
      v = 1.0f;
4156
      MENU.lf_modulation_amount.fld.set_text (v);
4157
    }
4158
    binaural_drones0.modulation_amount = v;
4159
  } else if (&f == MENUP.lf_bd_spacing.fld) {
4160
    binaural_drones0.spacing = v;
4161
  } else if (&f == MENUP.bdf_value) {
4162
    val[select_rule] = MENU.bdf_value.text;
4163
    MENU.bdl.clicked (MENU.bbd_select2);
4164
  } else if (&f == MENUP.lf_vol.fld) {
4165
    float vp = v / 100.0f;
4166
    sprintf (BUFFER, "set-selected-binaurals-volume %f", vp);
4167
    interpreter (BUFFER);
4168
  } else if (&f == MENUP.lf_l.fld) {
4169
    set_hz (binaural_drone::LEFT, v);
4170
  } else if (&f == MENUP.lf_r.fld) {
4171
    set_hz (binaural_drone::RIGHT, v);
4172
  } else if (&f == MENUP.lf_sep.fld) {
4173
    int j = 0;
4174
    for (int i = 0; i < MENU.il_binaural_drones.n; ++i) {
1532 jag 4175
      if (MENU.il_binaural_drones.items[i].sel) {
964 jag 4176
        binaural_drone* bi = binaural_drones0.binaural_drones[i];
4177
        bi->set_sep (v);
4178
        ++j;
4179
      }
4180
    }
4181
    if (j)
4182
      binaural_drones0.pitch_fader.start ("Separation Hz set");
4183
    else
4184
      cons << RED << "Please select some binaural drone pairs" << eol;
4185
  }
4186
}
4187
 
4188
void binaural_drones_listener::set_hz (int w, float v) {
4189
 
4190
  int n = MENU.il_binaural_drones.num_selected ();
4191
  if (n == 0) {
4192
    cons << RED << "Please select some binaural drone pairs" << eol;
4193
    return;
4194
  }
4195
 
4196
  if (n == 1) {
4197
    int i = MENU.il_binaural_drones.get_first ();
4198
    binaural_drone* bi = binaural_drones0.binaural_drones[i];
4199
    bi->set_hz (w, v); // v is absolute
4200
    binaural_drones0.pitch_fader.start ("Hz set");
4201
  } else {
4202
    for (int i = 0; i < MENU.il_binaural_drones.n; ++i) {
1532 jag 4203
      if (MENU.il_binaural_drones.items[i].sel) {
964 jag 4204
        binaural_drone* bi = binaural_drones0.binaural_drones[i];
4205
        float ohz [] = {bi->l_hz, bi->r_hz};
4206
        bi->set_hz (w, ohz[w] + v); // v is relative
4207
      }
4208
    }
4209
    binaural_drones0.pitch_fader.start ("Hz change");
4210
  }
4211
}
4212
 
4213
void binaural_drones_listener::picked (label& lbl, int dir) {
4214
  if (&lbl == MENUP.ol_justification.option) {
4215
    int j = binaural_drones0.change_justification (dir);
4216
    MENU.ol_justification.set_text (justs[j]);
4217
  } else if (&lbl == MENUP.ol_key_note.option) {
4218
    int k = binaural_drones0.change_key_note (dir);
4219
    const string kn [] = {"start pitch", "from scale"};
4220
    MENU.ol_key_note.set_text (" Key note is " + kn[k]);
4221
  } else if (&lbl == MENUP.ol_select_what.option) {
4222
    select_what += dir;
4223
    wrap<int> (binaural_drone::LEFT, select_what, binaural_drone::VOLUME);
4224
    const string sc [] = {"L ", "R ", "Separation ", "Volume "};
4225
    MENU.ol_select_what.set_text (sc[select_what]);
4226
    MENU.ol_select_rule.set_pos (MENU.ol_select_what.extents.right, MENU.ol_select_rule.posy);
4227
    MENU.bdf_value.set_pos (MENU.ol_select_rule.extents.right, MENU.bdf_value.posy);
4228
  } else if (&lbl == MENUP.ol_select_rule.option) {
4229
    select_rule += dir;
4230
    wrap<int> (EQUAL, select_rule, ID);
4231
    const string sr [] = {" = ", " >= ", " <= ", " <> ", " id "};
4232
    MENU.ol_select_rule.set_text (sr[select_rule]);
4233
    MENU.bdf_value.set_text (val[select_rule]);
4234
    MENU.bdf_value.set_pos (MENU.ol_select_rule.extents.right, MENU.bdf_value.posy);
4235
  } else if (&lbl == MENUP.ol_just.option) {
4236
    just += dir;
4237
    wrap<int> (binaural_drone::LEFT, just, binaural_drone::CENTER);
4238
    MENU.ol_just.set_text (justs[just]);
4239
    for (int i = 0; i < MENU.il_binaural_drones.n; ++i) {
1532 jag 4240
      if (MENU.il_binaural_drones.items[i].sel) {
964 jag 4241
        binaural_drone* bi = binaural_drones0.binaural_drones[i];
4242
        bi->set_just (just);
4243
      }
4244
    }
4245
  }
4246
}
4247
 
4248
void binaural_drones_listener::selected (item_list& il, int s) {
4249
  int ns = il.num_selected ();
4250
  if (ns == 1) {
1301 jag 4251
    binaural_drone* bs = binaural_drones0.binaural_drones[il.get_first()];
964 jag 4252
    bs->sel = 1;
4253
    sprintf (BUFFER, "%0.3f", bs->vol*100.0);
4254
    MENU.lf_vol.set_text (BUFFER);
4255
    sprintf (BUFFER, "%0.3f", bs->l_hz);
4256
    MENU.lf_l.set_text (BUFFER);
4257
    sprintf (BUFFER, "%0.3f", bs->r_hz);
4258
    MENU.lf_r.set_text (BUFFER);
4259
    sprintf (BUFFER, "%0.3f", bs->sep);
4260
    MENU.lf_sep.set_text (BUFFER);
4261
    MENU.lf_l.set_label ("L (Hz) ");
4262
    MENU.lf_r.set_label ("R (Hz) ");
4263
    just = bs->just;
4264
    MENU.ol_just.set_text (justs[just]);
4265
  } else {
4266
    if (ns) {
4267
      MENU.lf_l.set_label ("dL (Hz) ");
4268
      MENU.lf_r.set_label ("dR (Hz) ");
4269
    }
4270
    MENU.lf_vol.fld.set_text (0.0f);
4271
    MENU.lf_l.fld.set_text (0.0f);
4272
    MENU.lf_r.fld.set_text (0.0f);
4273
    MENU.lf_sep.fld.set_text (0.0f);
4274
    just = binaural_drone::CENTER;
4275
    MENU.ol_just.set_text (justs[just]);
4276
    for (int i = 0, n = il.n; i < n; ++i) {
4277
      binaural_drone* bi = binaural_drones0.binaural_drones[i];
1532 jag 4278
      bi->sel = il.items[i].sel;
964 jag 4279
    }
4280
  }
4281
  cons << GREEN << "Selected " << ns << " binaural drone pairs" << eol;
4282
}
4283
 
4284
void binaural_drones_listener::changed (checkbutton& cb) {
4285
  binaural_drones0.close_octave = MENU.cb_close_octave.state;
4286
}
4287
 
4288
void menu::update_binaurals_list () {
1532 jag 4289
  il_binaural_drones.set_pos (cb_file.extents.left, bbd_select_all.extents.bottom);
964 jag 4290
  calc_bg ();
4291
}
4292
 
4293
ball_ops_listener::ball_ops_listener () {
4294
  op_id = 0;
4295
}
4296
 
4297
void ball_ops_listener::picked (label& lbl, int dir) {
1302 jag 4298
  if (&lbl == MENUP.ol_browse_balls.option) {
4299
    mondrian0.browse_ball (dir);
4300
    return;
4301
  } else {
4302
    label* olt [] = {MENUP.ol_bouncer.option, MENUP.ol_wrecker.option, MENUP.ol_healer.option};
4303
    for (int i = 0; i < 3; ++i) {
4304
      if (&lbl == olt[i]) {
4305
        int& t = Transform::rules [i];
4306
        t += dir;
4307
        if (t < ball::BOUNCER) t = ball::INVALID;
4308
        else if (t > ball::INVALID) t = ball::BOUNCER;
4309
        sprintf (BUFFER, "%s becomes %s", ball::types_str[i], ball::types_str[t]);
4310
        olt[i]->set_text (BUFFER);
4311
        return;
4312
      }
964 jag 4313
    }
4314
  }
4315
}
4316
 
4317
void ball_ops_listener::clicked (button& b) {
4318
}
4319
 
4320
void ball_ops_listener::changed (checkbutton& cb) {
4321
  ball* b = mondrian0.get_one_selected_ball ();
4322
  if (b) {
4323
    ball_op* ops [] = {&b->op_turn, &b->op_speed, &b->op_teleport, &b->op_clone, &b->op_transform};
4324
    checkbutton* cbn [] = {MENUP.cb_turn, MENUP.cb_speed, MENUP.cb_teleport, MENUP.cb_clone, MENUP.cb_transform};
4325
    for (int i = 0; i < ball_op::NUM_OPS; ++i) {
4326
      if (&cb == cbn[i]) {
4327
        ball_op* opi = ops[i];
1310 jag 4328
        // if (cb.state) opi->alarm.start (); else opi->alarm.stop ();
4329
        if (cb.state) opi->start (b); else opi->alarm.stop ();
4330
 
964 jag 4331
        break;
4332
      }
4333
    }
4334
 
1302 jag 4335
    /*if (cb.state && (&cb == MENUP.cb_speed)) {
964 jag 4336
      MENU.sp_max_speed.set_value (b->V);
4337
      b->op_speed.max = b->V;
1302 jag 4338
    }*/
964 jag 4339
 
4340
    b->op_clone.clone_can_clone = MENU.cb_clone_can_clone.state;
4341
 
4342
  } else {
4343
    cons << RED << "Please select a ball!" << eol;
4344
  }
4345
}
4346
 
4347
void ball_ops_listener::changed (field& f) {
4348
  if (&f == MENUP.sp_max_balls.f_value) {
2110 jag 4349
    int i = MENU.sp_max_balls.value;
964 jag 4350
    Clone::max_balls = i;
4351
    cons << YELLOW << "Max balls = " << Clone::max_balls << eol;
4352
  } else {
4353
    ball* b = mondrian0.get_one_selected_ball ();
4354
    if (b) {
4355
      if (&f == MENUP.sp_turn_every.f_value) {
2110 jag 4356
        float t = MENU.sp_turn_every.value;
964 jag 4357
        b->op_turn.alarm.triggert = t;
4358
        sprintf (BUFFER, "Turn every %0.3f seconds", t);
4359
        cons << YELLOW << BUFFER << eol;
4360
      } else
4361
      if (&f == MENUP.sp_turn_min.f_value) {
2110 jag 4362
        float minn = MENU.sp_turn_min.value, maxx;
964 jag 4363
        if (MENU.cb_turn_sync.state) {
4364
          maxx = minn;
4365
          MENU.sp_turn_max.set_value (maxx);
4366
        } else maxx = b->op_turn.rd.max;
4367
        b->op_turn.rd.set (-minn, maxx);
4368
        sprintf (BUFFER, "Turn Clockwise upto %0.3f degrees | Anti-clockwise upto %0.3f degrees", minn, maxx);
4369
        cons << YELLOW << BUFFER << eol;
4370
      } else
4371
      if (&f == MENUP.sp_turn_max.f_value) {
2110 jag 4372
        float minn, maxx = MENU.sp_turn_max.value;
964 jag 4373
        if (MENU.cb_turn_sync.state) {
4374
          MENU.sp_turn_min.set_value (maxx);
4375
          minn = -maxx;
4376
        } else minn = b->op_turn.rd.min;
4377
        b->op_turn.rd.set (minn, maxx);
4378
        sprintf (BUFFER, "Turn Clockwise upto %0.3f degrees | Anti-clockwise upto %0.3f degrees", -minn, maxx);
4379
        cons << YELLOW << BUFFER << eol;
4380
      } else
4381
      if (&f == MENUP.sp_speed_min.f_value) {
2110 jag 4382
        float minn = MENU.sp_speed_min.value, maxx;
964 jag 4383
        if (MENU.cb_speed_sync.state) {
4384
          maxx = minn;
4385
          MENU.sp_speed_max.set_value (maxx);
4386
        } else maxx = b->op_speed.rd.max;
4387
        b->op_speed.rd.set (-minn, maxx);
1310 jag 4388
        sprintf (BUFFER, "Accelerate = %0.3f | Brake = %0.3f", maxx, minn);
964 jag 4389
        cons << YELLOW << BUFFER << eol;
4390
      } else
4391
      if (&f == MENUP.sp_speed_max.f_value) {
2110 jag 4392
        float minn, maxx = MENU.sp_speed_max.value;
964 jag 4393
        if (MENU.cb_speed_sync.state) {
4394
          MENU.sp_speed_min.set_value (maxx);
4395
          minn = -maxx;
4396
        } else minn = b->op_speed.rd.min;
4397
        b->op_speed.rd.set (minn, maxx);
4398
        sprintf (BUFFER, "Accelerate = %0.3f | Brake = %0.3f", maxx, -minn);
4399
        cons << YELLOW << BUFFER << eol;
4400
      } else
4401
      if (&f == MENUP.sp_speed_every.f_value) {
2110 jag 4402
        float m = MENU.sp_speed_every.value;
964 jag 4403
        b->op_speed.alarm.triggert = m;
4404
        sprintf (BUFFER, "Speed every %0.3f seconds", m);
4405
        cons << YELLOW << BUFFER << eol;
4406
      } else
4407
      if (&f == MENUP.sp_max_speed.f_value) {
2110 jag 4408
        float m = MENU.sp_max_speed.value;
964 jag 4409
        b->op_speed.max = m;
4410
        sprintf (BUFFER, "Max speed = %0.3f", m);
4411
        cons << YELLOW << BUFFER << eol;
4412
      } else
4413
      if (&f == MENUP.sp_tel_every.f_value) {
2110 jag 4414
        float s = MENU.sp_tel_every.value;
964 jag 4415
        b->op_teleport.alarm.triggert = s;
4416
        sprintf (BUFFER, "Teleport every %0.3f seconds", s);
4417
        cons << YELLOW << BUFFER << eol;
4418
      } else
4419
      if (&f == MENUP.sp_tel_radius.f_value) {
2110 jag 4420
        float r = MENU.sp_tel_radius.value;
964 jag 4421
        b->op_teleport.radius = r;
4422
        sprintf (BUFFER, "Max Teleport distance = %0.3f", r);
4423
        cons << YELLOW << BUFFER << eol;
4424
      } else
4425
      if (&f == MENUP.sp_clone_every.f_value) {
2110 jag 4426
        float m = MENU.sp_clone_every.value;
964 jag 4427
        b->op_clone.alarm.triggert = m;
4428
        sprintf (BUFFER, "Clone every %0.3f seconds", m);
4429
        cons << YELLOW << BUFFER << eol;
4430
      } else
4431
      if (&f == MENUP.sp_max_clones.f_value) {
2110 jag 4432
        int i = MENU.sp_max_clones.value;
964 jag 4433
        b->op_clone.n = b->op_clone.max = i;
4434
        cons << "Max clones = " << i << eol;
4435
      } else
4436
      if (&f == MENUP.sp_clone_offset.f_value) {
2110 jag 4437
        float m = MENU.sp_clone_offset.value;
964 jag 4438
        b->op_clone.offset = m;
4439
        cons << YELLOW << "Clone offset = " << m << eol;
4440
      } else
4441
      if (&f == MENUP.sp_transform_every.f_value) {
2110 jag 4442
        float m = MENU.sp_transform_every.value;
964 jag 4443
        b->op_transform.alarm.triggert = m;
4444
        sprintf (BUFFER, "Transform every %0.3f seconds", m);
4445
        cons << YELLOW << BUFFER << eol;
4446
      }
4447
    } else {
4448
      cons << RED << "Please select a ball! " << eol;
4449
    }
4450
  }
4451
}
4452
 
1768 jag 4453
void arrowlis::changed (field& f) {
4454
  if (&f == MENUP.dronearrow.shoulder.position.f_value) {
4455
    din0.change_drone_arrow (MENU.dronearrow.shoulder.position, 0);
4456
  } else if (&f == MENUP.dronearrow.shoulder.width.f_value) {
4457
    din0.change_drone_arrow (MENU.dronearrow.shoulder.width, 1);
1499 jag 4458
  } else {
1804 jag 4459
    din0.change_drone_arrow (MENU.dronearrow.neck, 2);
1766 jag 4460
  }
964 jag 4461
}
4462
 
1778 jag 4463
void defarrowlis::changed (field& f) {
1792 jag 4464
  drone::arrowt::U = MENU.dronearrowdefaults.shoulder.position.value;
4465
  drone::arrowt::V = MENU.dronearrowdefaults.shoulder.width.value;
1804 jag 4466
  drone::arrowt::K = MENU.dronearrowdefaults.neck.value;
2106 jag 4467
  /*cons << GREEN <<
1804 jag 4468
    "Drone arrow defaults: Neck = " << drone::arrowt::K <<
1792 jag 4469
    ", Shoulder pos = " << drone::arrowt::U <<
2106 jag 4470
    ", Shoulder width = " << drone::arrowt::V << eol;*/
1778 jag 4471
  MENU.dronearrowdefaults.arrow.calc ();
4472
}
4473
 
4474
void defarrowlis::changed (checkbutton& cb) {
4475
  MENU.dronearrowdefaults.arrow.calc ();
4476
}
4477
 
4478
void drawrrow::calc () {
4479
  int cap = MENU.dronearrowdefaults.cap.state;
4480
  int n = 12;
4481
  make_arrow (pts, 0, cap, n, x, y, ux, uy, vx, vy,
4482
    MENU.dronearrowdefaults.shoulder.position.value,
4483
    MENU.dronearrowdefaults.shoulder.width.value,
1804 jag 4484
    MENU.dronearrowdefaults.neck.value);
1778 jag 4485
  npts = n / 2;
4486
}
4487
 
4488
void drone::arrowt::reset () {
4489
  u = MENU.dronearrowdefaults.shoulder.position ();
4490
  v = MENU.dronearrowdefaults.shoulder.width ();
1804 jag 4491
  t = MENU.dronearrowdefaults.neck ();
1778 jag 4492
  cap = MENU.dronearrowdefaults.cap.state;
4493
}
4494
 
1768 jag 4495
void arrowlis::clicked (button& b) {
4496
  if (&b == MENUP.dronearrow.cap)
4497
    din0.capdronearrows (1);
4498
  else
4499
    din0.capdronearrows (0);
1784 jag 4500
  TOGGLEMENU
1768 jag 4501
}
4502
 
1778 jag 4503
 
4504
 
964 jag 4505
void range_defaults_lis::changed (field& f) {
4506
  if (&f == MENUP.sp_default_width.f_value) {
4507
    extern int WIDTH;
2110 jag 4508
    WIDTH = MENU.sp_default_width.value;
964 jag 4509
    cons << "Default Range Width = " << WIDTH << eol;
4510
  } else {
4511
    extern int HEIGHT;
2110 jag 4512
    HEIGHT = MENU.sp_default_height.value;
964 jag 4513
    cons << "Default Range Height = " << HEIGHT << eol;
4514
  }
4515
}
4516
 
1566 jag 4517
void change_note_listener::moused (int dx, double scl) {
1607 jag 4518
  int dir = sign (dx);
4519
  din0.change_range_note (id, dir * scl * delta0);
964 jag 4520
}
4521
 
4522
void change_note_listener::clicked (button& b) {
4523
  if (&b == MENUP.b_change_note_left) {
4524
    mouse_slider0.add (MENUP.cnl);
4525
  } else {
4526
    mouse_slider0.add (MENUP.cnr);
4527
  }
1742 jag 4528
  activate_mouse_slider (0, 0);
964 jag 4529
}
4530
 
1235 jag 4531
void change_note_both_listener::clicked (button& b) {
4532
  mouse_slider0.add (MENUP.cnl);
4533
  mouse_slider0.add (MENUP.cnr);
1742 jag 4534
  activate_mouse_slider (0, 0);
1235 jag 4535
}
4536
 
1397 jag 4537
void change_note_options_listener::picked (label& lbl, int dir) {
4538
  if (&lbl == MENUP.ol_change_note.option) {
1400 jag 4539
    static const string chg (" Change "), nte ("Note > ");
1399 jag 4540
    din0.dinfo.change_note = !din0.dinfo.change_note;
1400 jag 4541
    if (din0.dinfo.change_note)
1401 jag 4542
      MENU.add_to_tab (MENUP.cb_mkb_ranges, MENUP.ol_change_note_style);
4543
    else
1400 jag 4544
      MENU.remove_from_tab (MENUP.cb_mkb_ranges, MENUP.ol_change_note_style);
1402 jag 4545
    string cn (din_info::cnno[din0.dinfo.change_note]);
1400 jag 4546
    lbl.set_text (chg+cn);
1401 jag 4547
    print_range_info (din0.ranges[din0.dinfo.sel_range]);
1397 jag 4548
  } else {
4549
    din0.dinfo.change_note_style = !din0.dinfo.change_note_style;
4550
    set (lbl, din0.dinfo.change_note_style);
4551
  }
964 jag 4552
}
4553
 
1397 jag 4554
void change_note_options_listener::set (label& lbl, int v) {
1402 jag 4555
  lbl.set_text (din_info::cnn_opts[v]);
964 jag 4556
  extern scale_info all_notes;
4557
  scale_info* ptr_si [] = {&din0.scaleinfo, &all_notes};
4558
  din0.ptr_scaleinfo = ptr_si[v];
4559
}
4560
 
1685 jag 4561
void menu::pitch_vol_dis_pix_lis::changed (checkbutton& cb) {
1137 jag 4562
  if (&cb == MENUP.cb_pitch_dis) {
4563
    din0.dinfo.dist.pitch = cb.state;
4564
  } else {
4565
    din0.dinfo.dist.vol = cb.state;
4566
  }
4567
}
1140 jag 4568
 
1685 jag 4569
void menu::pitch_vol_dis_pix_lis::changed (field& f) {
2110 jag 4570
  din0.dinfo.dist.pix = MENU.sp_lev_sz.value;
1140 jag 4571
  cons << "Pixels per level = " << din0.dinfo.dist.pix << eol;
4572
}
1320 jag 4573
 
1742 jag 4574
void prep_drone_xform (mouse_slider_listener* L, int shift = 0, int scalestyle = mouse_slider::scalet::CHANGING) {
1429 jag 4575
  din0.freeze_orbiters ();
1430 jag 4576
  mouse_slider0.add (L);
1742 jag 4577
  activate_mouse_slider (shift, scalestyle);
1429 jag 4578
}
4579
 
1984 jag 4580
CLICKED_BUTTON (menu, movlis) {
1679 jag 4581
  din0.start_moving_drones ();
1986 jag 4582
  TOGGLEMENU
1473 jag 4583
}
4584
 
1984 jag 4585
CLICKED_BUTTON (menu, raillis) {
1985 jag 4586
  _SELECTED_DRONES_EXIST_
1984 jag 4587
  mouse_slider0.add (MENUP.raill1);
4588
  activate_mouse_slider ();
4589
}
4590
 
4591
MOUSED (menu, raillis1) {
4592
  din0.rail (dir, scl);
4593
}
4594
 
4595
AFTER_SLIDE(menu, raillis1) {}
4596
 
4597
CLICKED_BUTTON (menu, strafelis) {
1985 jag 4598
  _SELECTED_DRONES_EXIST_
1984 jag 4599
  mouse_slider0.add (MENUP.strafel1);
4600
  activate_mouse_slider ();
4601
}
4602
 
4603
MOUSED (menu, strafelis1) {
4604
  din0.strafe (dir, scl);
4605
}
4606
 
4607
AFTER_SLIDE(menu, strafelis1) {}
4608
 
1666 jag 4609
CLICKED_BUTTON (menu, b_set_xform_center_lis) {
4610
  din0.calc_drones_centroid ();
1784 jag 4611
  TOGGLEMENU
1611 jag 4612
}
4613
 
1473 jag 4614
CLICKED_BUTTON (menu, b_move_drones_under_gravity_lis) {
4615
  din0.set_drones_under_gravity ();
1784 jag 4616
  TOGGLEMENU
1473 jag 4617
}
4618
 
1477 jag 4619
CLICKED_BUTTON (menu,b_scale_drones_lis) {
4620
  MENU.ms_sdl.name = "Scale";
1628 jag 4621
  if (din0.prep_scale_drones ()) {
4622
    int shift = -2; // for 0.01f scaling, assuming base = 10 on mouse slider
1742 jag 4623
    prep_drone_xform (MENUP.ms_sdl, shift, mouse_slider::scalet::CHANGING);
1628 jag 4624
  } else cons << RED_PSD << eol;
1477 jag 4625
}
4626
 
1429 jag 4627
AFTER_SLIDE (menu,ms_scale_drones_lis) {
4628
  din0.thaw_orbiters ();
4629
}
4630
 
4631
MOUSED (menu,ms_scale_drones_lis) {
1628 jag 4632
  din0.scale_drones (dir * scl);
1429 jag 4633
  din0.scale_drones ();
4634
}
4635
 
1430 jag 4636
CLICKED_BUTTON (menu,b_rotate_drones_lis) {
1477 jag 4637
  MENU.ms_rdl.name = "Rotate";
1430 jag 4638
  if (din0.prep_rotate_drones ()) prep_drone_xform (MENUP.ms_rdl); else cons << RED << "Please select some drones!" << eol;
4639
}
4640
 
4641
AFTER_SLIDE (menu,ms_rotate_drones_lis) {
4642
  din0.thaw_orbiters ();
4643
}
4644
 
4645
MOUSED (menu,ms_rotate_drones_lis) {
1628 jag 4646
  din0.angle += (dir * scl * PI_BY_180);
1430 jag 4647
  din0.rotate_drones ();
4648
}
4649
 
1328 jag 4650
CLICKED_BUTTON (menu,set_to_mesh_rows_lis) {
1320 jag 4651
  MENU.sp_drones_per_pend.set_value (din0.dinfo.rows);
4652
  MENU.dppl.changed (MENU.sp_drones_per_pend.f_value);
4653
}
4654
 
1328 jag 4655
CLICKED_BUTTON (menu,set_to_mesh_cols_lis) {
1320 jag 4656
  MENU.sp_drones_per_pend.set_value (din0.dinfo.cols);
4657
  MENU.dppl.changed (MENU.sp_drones_per_pend.f_value);
4658
}
4659
 
1328 jag 4660
CLICKED_CHECKBUTTON (menu,cb_am_bpm_lis) {
1438 jag 4661
  din0.dinfo.mesh_vars.apply_to.am = cb.state;
1321 jag 4662
  din0.dinfo.mesh_vars.apply_to.calc_active ();
4663
}
4664
 
1328 jag 4665
CLICKED_CHECKBUTTON (menu,cb_fm_bpm_lis) {
1438 jag 4666
  din0.dinfo.mesh_vars.apply_to.fm = cb.state;
1321 jag 4667
  din0.dinfo.mesh_vars.apply_to.calc_active ();
4668
}
1323 jag 4669
 
1328 jag 4670
CLICKED_BUTTON(menu,b_set_unset_toggle_lis) {
1326 jag 4671
  if (&b == MENUP.b_toggle) {
1619 jag 4672
    if (din0.dinfo.set_unset_toggle) din0.pos_afx_vel (-1); else din0.snap_drones (-1);
1326 jag 4673
  } else if (&b == MENUP.b_set) {
1619 jag 4674
    if (din0.dinfo.set_unset_toggle) din0.pos_afx_vel (1); else din0.snap_drones (1);
1326 jag 4675
  } else {
1619 jag 4676
    if (din0.dinfo.set_unset_toggle) din0.pos_afx_vel (0); else din0.snap_drones (0);
1326 jag 4677
  }
1827 jag 4678
  TOGGLEMENU
1326 jag 4679
}
4680
 
1452 jag 4681
VALUE_CHANGED (menu,drones_per_pend_lis) {
2110 jag 4682
  din0.dinfo.mesh_vars.dpp = MENU.sp_drones_per_pend.value;
1326 jag 4683
  cons << "Drones per pendulum = " << din0.dinfo.mesh_vars.dpp << eol;
4684
}
1402 jag 4685
 
1436 jag 4686
PICKED_OPTION (menu, ol_fixed_lis) {
4687
  range& rs = din0.ranges [din0.dinfo.sel_range];
4688
  rs.fixed += dir;
1802 jag 4689
  wrap<int> (range::LEFT, rs.fixed, range::RIGHT);
1436 jag 4690
  MENU.ol_fixed.set_text (ol_fixed_lbls[rs.fixed]);
4691
}
4692
 
1438 jag 4693
CLICKED_CHECKBUTTON (menu,cb_draw_mesh_lis) {
4694
  din0.meshh.draw = cb.state;
1784 jag 4695
  TOGGLEMENU
1438 jag 4696
}
4697
 
1469 jag 4698
VALUE_CHANGED (menu,lf_conn_steps_lis) {
1511 jag 4699
  din0.calc_stepz (f.text);
4700
  cons << YELLOW << "Click connect to connect drones" << eol;
1460 jag 4701
}
4702
 
1512 jag 4703
void menu::lf_conn_steps_lis::typing (field& f) {
4704
  static const int d = 12;
4705
  MENU.cb_conn_wrap.set_pos (f.extents.right + d, MENU.cb_conn_wrap.posy);
1797 jag 4706
  MENU.trackcon.set_pos (MENU.cb_conn_wrap.extents.right + d, MENU.trackcon.posy);
1512 jag 4707
}
4708
 
1469 jag 4709
CLICKED_CHECKBUTTON (menu, cb_conn_wrap_lis) {
1511 jag 4710
  cons << YELLOW << "Click connect to connect drones" << eol;
1469 jag 4711
}
4712
 
4713
CLICKED_BUTTON (menu, b_connect_lis) {
1784 jag 4714
  if (din0.connect_drones ()) TOGGLEMENU
1469 jag 4715
}
4716
 
4717
CLICKED_BUTTON (menu, b_disconnect_lis) {
1784 jag 4718
  if (din0.disconnect_drones ()) TOGGLEMENU
1469 jag 4719
}
4720
 
1468 jag 4721
void get_color::update_data () {
4722
  data.clr[0] = color (MENU.s_red_min(), MENU.s_green_min(), MENU.s_blue_min());
4723
  data.clr[1] = color (MENU.s_red_max(), MENU.s_green_max(), MENU.s_blue_max());
4724
}
4725
 
1489 jag 4726
SLIDER_CHANGED(menu,sc_color_lis) {
1468 jag 4727
  get_color::update_data ();
1461 jag 4728
  din0.color_selected_drones ();
1490 jag 4729
  MENU.b_close.set_pos (mousex, MENU.b_close.posy);
1461 jag 4730
}
4731
 
1489 jag 4732
START_SLIDE(menu, ss_color_lis, slider<float>) {
4733
  if (MENU.b_close.visible == 0) {
1490 jag 4734
    DECL_COLOR_SLIDERS
1489 jag 4735
    button& b_close = detach_from_menu (slrs, COLOR_SLIDERS_N, MENU.s_red_max.posx, MENU.s_red_max.posy);
4736
    LISTEN (b_close, MENUP.cscll)
4737
  }
4738
}
4739
 
4740
CLICKED_BUTTON(menu, sc_close_lis) {
1490 jag 4741
  DECL_COLOR_SLIDERS
1489 jag 4742
  attach_to_menu (slrs, COLOR_SLIDERS_N);
4743
}
4744
 
1468 jag 4745
PICKED_OPTION(menu,ol_color_lis) {
4746
  colorer_t& colorer = MENU.colorer;
4747
  colorer += dir;
1472 jag 4748
  l.set_text (colorer_t::s_schemes[colorer.i]);
1468 jag 4749
  din0.color_selected_drones ();
4750
}
4751
 
1998 jag 4752
 
4753
void menu::initdroneparamtabs (checkbutton& cb) {
4754
  MENU.cb_modulation.set_state (0,0);
1695 jag 4755
  MENU.cb_visual.set_state (0,0);
1675 jag 4756
  MENU.cb_motion.set_state (0,0);
1695 jag 4757
  MENU.cb_chuck.set_state (0,0);
1675 jag 4758
  MENU.cb_defaults.set_state (0,0);
1998 jag 4759
  cb.set_state (1, 0);
1465 jag 4760
}
1468 jag 4761
 
2027 jag 4762
//
4763
// drone params ui 
4764
//
4765
 
1998 jag 4766
CLICKED_CHECKBUTTON (menu,cb_modulation_lis) {
4767
  MENU.initdroneparamtabs (cb);
2276 jag 4768
  MENU.set_drone_params_items (9, 33);
1998 jag 4769
}
4770
 
1465 jag 4771
CLICKED_CHECKBUTTON (menu,cb_motion_lis) {
1998 jag 4772
  MENU.initdroneparamtabs (cb);
2276 jag 4773
  MENU.set_drone_params_items (33, 82);
1465 jag 4774
}
1468 jag 4775
 
1675 jag 4776
CLICKED_CHECKBUTTON (menu,cb_defaults_lis) {
1998 jag 4777
  MENU.initdroneparamtabs (cb);
2286 jag 4778
  MENU.set_drone_params_items (82, 127);
1675 jag 4779
}
4780
 
1695 jag 4781
CLICKED_CHECKBUTTON (menu,cb_chuck_lis) {
1998 jag 4782
  MENU.initdroneparamtabs (cb);
2286 jag 4783
  MENU.set_drone_params_items (127, 135);
1695 jag 4784
}
4785
 
1465 jag 4786
CLICKED_CHECKBUTTON (menu,cb_visual_lis) {
1998 jag 4787
  MENU.initdroneparamtabs (cb);
2286 jag 4788
  MENU.set_drone_params_items (135, DRONE_PARAMS_N);
1465 jag 4789
}
4790
 
1481 jag 4791
CLICKED_BUTTON (menu, b_abort_octave_shift_lis) {
4792
  abort_octave_shift (get_current_instrument());
4793
}
4794
 
1514 jag 4795
CLICKED_BUTTON (menu, b_arrow_reset_lis) {
4796
  din0.reset_drone_arrows ();
1499 jag 4797
}
4798
 
1441 jag 4799
void menu::handle_voice_tab_items (const char* viv) {
4800
 
4801
  cb_mkb_voice.set_text (viv);
4802
 
4803
  widget* wvoice [] = {
4804
    &sp_am_depth,
4805
    &sp_fm_depth,
4806
    &sp_am_bpm,
4807
    &sp_fm_bpm,
4808
    &ol_am_style,
4809
    &ol_fm_style,
4810
  };
4811
 
4812
  if (din0.dinfo.voice_is_voice) {
4813
    for (int i = 0; i < 6; ++i) add_to_tab (&cb_mkb_voice, wvoice[i]);
4814
  } else {
4815
    for (int i = 0; i < 6; ++i) remove_from_tab (&cb_mkb_voice, wvoice[i]);
4816
  }
4817
 
4818
  calc_bg ();
4819
 
4820
}
4821
 
1402 jag 4822
void print_range_info (range& ri) {
4823
  note& L = ri.notes[0];
4824
  note& R = ri.notes[1];
4825
  sprintf (BUFFER, "Note > %s | Left = %s @ %0.3f Hz, Right = %s @ %0.3f Hz | Range %d", din_info::cnno[din0.dinfo.change_note], L.name.c_str(), L.hz, R.name.c_str(), R.hz, din0.dinfo.sel_range);
4826
  cons << CYAN << BUFFER << eol;
4827
}
1436 jag 4828
 
1489 jag 4829
button& detach_from_menu (widget** wa, int n, int posx, int posy) {
4830
 
1485 jag 4831
  button& close = MENU.b_close;
1489 jag 4832
  close.set_pos (posx, posy - line_height);
1485 jag 4833
  close.show ();
1489 jag 4834
 
2049 jag 4835
  if (MENU.show) MENU.toggle (DONT_MOUSE_WARP);
1489 jag 4836
 
1485 jag 4837
  vector<widget*>& vw = uis.widgets_of [uis.current];
4838
  vw.insert (vw.begin(), &close);
1489 jag 4839
 
4840
  if (n == 1)
4841
    vw.insert (vw.begin(), wa[0]);
4842
  else
4843
    for (int i = 0; i < n; ++i) vw.insert (vw.begin(), wa[i]);
4844
 
1485 jag 4845
  warp_mouse (MENU.menu_mousex, MENU.menu_mousey);
1489 jag 4846
 
1485 jag 4847
  return close;
1489 jag 4848
 
1485 jag 4849
}
4850
 
1489 jag 4851
void attach_to_menu (widget** wa, int n) {
1485 jag 4852
  uis.remove (MENUP.b_close);
2049 jag 4853
  MENU.b_close.hide ();
1489 jag 4854
  if (n == 1) uis.remove (wa[0]); else for (int i = 0; i < n; ++i) uis.remove (wa[i]);
2049 jag 4855
  if (uis.current == &din0) uis.add (&din0, &mkb_selector);
1485 jag 4856
}
1547 jag 4857
 
4858
CLICKED_BUTTON (menu, b_mute_lis) {
1819 jag 4859
  din0.gab.set (&din0, 0.0f, "muting drones");
1784 jag 4860
  TOGGLEMENU
1547 jag 4861
}
4862
 
4863
CLICKED_BUTTON (menu, b_unmute_lis) {
1819 jag 4864
  din0.gab.set (&din0, 1.0f, "unmuting drones");
1784 jag 4865
  TOGGLEMENU
1547 jag 4866
}
1552 jag 4867
 
4868
VALUE_CHANGED (menu, sp_drone_vol_lis) {
4869
  din0.setdronevol (MENU.sp_drone_vol);
4870
}
1557 jag 4871
 
4872
CLICKED_BUTTON (menu, drone2noiselis) {
4873
  din0.drone2noise ();
1784 jag 4874
  TOGGLEMENU
1557 jag 4875
}
4876
 
4877
CLICKED_BUTTON (menu, noise2dronelis) {
4878
  din0.noise2drone ();
1784 jag 4879
  TOGGLEMENU
1557 jag 4880
}
1564 jag 4881
 
1732 jag 4882
void menu::setvelaccel::setup () {
1715 jag 4883
  lbl.set_text ("Set");
4884
  whats.option.set_text (" Velocity");
4885
  whats.set_listener (this);
2076 jag 4886
  button* b[] = {&zero, &vert, &hor, &vel, &accel, &zero};
4887
  const char* l[] = {"0", "Vertical", "Horizontal", "Velocity", "Acceleration"};
1764 jag 4888
  for (int i = 0; i < 5; ++i) {
1715 jag 4889
    button& bi = *b[i];
4890
    bi.id = i;
2076 jag 4891
#ifndef __WIDGET_MOVE__
1717 jag 4892
    bi.set_listener (this);
2076 jag 4893
#endif
1715 jag 4894
    bi.set_text (l[i]);
4895
  }
1739 jag 4896
  neg.set_text ("-ve");
2076 jag 4897
  perp.set_size (line_height / 2);
1728 jag 4898
#ifdef __WIDGET_MOVE__
2076 jag 4899
  widget* w[] = {&lbl, &whats, &neg, &perp, &zero, &vert, &hor, &vel, &accel};
4900
  makehier (w, 9);
4901
  for (int i = 0; i < 9; ++i) w[i]->set_moveable(1);
1728 jag 4902
#endif
1715 jag 4903
}
4904
 
1732 jag 4905
void menu::setvelaccel::clicked (button& b) {
2076 jag 4906
  din0.setvelaccel (what, b.id, neg.state, perp.state);
1784 jag 4907
  TOGGLEMENU
1715 jag 4908
}
4909
 
1732 jag 4910
void menu::setvelaccel::picked (label& l, int dir) {
1728 jag 4911
  static const char* lbl [] = {" Velocity", " Acceleration", " Both"};
4912
  what += dir;
4913
  wrap<int> (menu::autorott::VELOCITY, what, menu::autorott::BOTH);
1715 jag 4914
  l.set_text (lbl[what]);
4915
}
4916
 
1976 jag 4917
 
4918
void menu::autorott::clicked (button& b) {
4919
  if (&b == &smooth) {
4920
    mov.id = autorotator::SMOOTH;
4921
    din0.setautorotparam (MENU.autorotate.which, autorott::MOVEMENT);
4922
  } else {
4923
    mov.id = autorotator::TICK;
4924
    din0.setautorotparam (MENU.autorotate.which, autorott::MOVEMENT);
4925
  }
4926
  TOGGLEMENU
4927
}
4928
 
4929
void menu::autorott::picked (label& lbl, int dir) {
4930
  static const char* strs [] = {" Velocity", " Acceleration", " Both"};
4931
  which += dir;
4932
  wrap<int> (menu::autorott::VELOCITY, which, menu::autorott::BOTH);
4933
  lbl.set_text (strs[which]);
4934
}
4935
 
4936
void menu::defvelaccelui::checksync (float v, anglet& t, spinner<float>& sp) {
4937
  if (sync.state) {
4938
    t = v;
4939
    sp.set_value (v);
4940
  }
4941
}
4942
 
4943
 
1666 jag 4944
void menu::autorott::setup () {
1805 jag 4945
 
1666 jag 4946
  title.set_text ("Auto rotate");
1802 jag 4947
  which = VELOCITY;
1771 jag 4948
  whichl.option.set_text (" Velocity");
1861 jag 4949
  mov.set_text ("Movement?");
1771 jag 4950
  whichl.set_listener (this);
1972 jag 4951
  {
4952
    button* b[] = {&start, &stop, &toggle, &clockwise, &anticlockwise, &smooth, &tick};
4953
    static const char* l [] = {"Start", "Stop", "Toggle", "Clockwise", "Anti-clockwise", "Smooth", "Ticked"};
1982 jag 4954
    click_listener* clk [] = {&startl, &stopl, &togl, &clkl, &aclkl, this, this};
1972 jag 4955
    for (int i = 0; i < 7; ++i) {
4956
      button& bi = *b[i];
4957
      bi.set_text (l[i]);
1941 jag 4958
#ifndef __WIDGET_MOVE__
1972 jag 4959
      bi.set_listener (clk[i]);
1941 jag 4960
#endif
1972 jag 4961
    }
1666 jag 4962
  }
1972 jag 4963
  {
1982 jag 4964
    widget* af [] = {&autoflip.lbl, &autoflip.unset, &autoflip.set, &autoflip.toggle, &autoflip.angle, 0};
4965
    widget* ap [] = {&autopause.lbl, &autopause.unset, &autopause.set, &autopause.toggle, &autopause.every, &autopause.f0r, 0};
4966
    widget* rfp [] = {&rndflipause.whichl.option, &rndflipause.unset, &rndflipause.set, &rndflipause.toggle, 0};
4967
    static const char* l [] = {"Unset", "Set", "Toggle"};
1972 jag 4968
    for (int i = 0, j = 1; i < 3; ++i, ++j) {
4969
      button& bf = (button&) *af[j];
4970
      button& bp = (button&) *ap[j];
1976 jag 4971
      button& brfp = (button&) *rfp[j];
1972 jag 4972
      bf.set_text (l[i]);
4973
      bp.set_text (l[i]);
1976 jag 4974
      brfp.set_text (l[i]);
1972 jag 4975
#ifndef __WIDGET_MOVE__
1982 jag 4976
      bf.id = bp.id = brfp.id = i;
4977
      bf.set_listener (&autoflip.sutl);
4978
      bp.set_listener (&autopause.sutl);
4979
      brfp.set_listener (&rndflipause.sutl);
1972 jag 4980
#endif
4981
    }
4982
#ifdef __WIDGET_MOVE__
4983
    makehier (af);
4984
    makehier (ap);
1976 jag 4985
    makehier (rfp);
1972 jag 4986
#endif
1982 jag 4987
    rndflipause.optl.picked (rndflipause.whichl.option, 0);
1976 jag 4988
    rndflipause.whichl.set_listener (&rndflipause.optl);
1972 jag 4989
  }
4990
 
1732 jag 4991
  rpm.set ("RPM", 1.0f, 0.0f, MILLIONF, &rpml);
1856 jag 4992
  deg.set ("Degrees per Tick", 1.0f, -MILLIONF, MILLIONF, &degl);
1773 jag 4993
  tps.set ("Ticks per Second", 1.0f, -MILLIONF, MILLIONF, &tpsl);
1972 jag 4994
  autoflip.lbl.set_text ("Auto flip");
1732 jag 4995
  autoflip.angle.set (1.0f, 0.0f, MILLIONF, &autoflip.angl);
1836 jag 4996
  autoflip.angle.set_text ("Every", DEGREES);
1972 jag 4997
  autopause.lbl.set_text ("Auto pause");
1974 jag 4998
  autopause.every.set (0.1f, 0.0f, MILLIONF, &autopause.everyl);
4999
  autopause.f0r.set (0.1f, 0.0f, MILLIONF, &autopause.f0rl);
1973 jag 5000
  autopause.every.set_text ("Every", SECONDS);
5001
  autopause.f0r.set_text ("For", SECONDS);
1730 jag 5002
 
1668 jag 5003
#ifdef __WIDGET_MOVE__
1828 jag 5004
  widget* w[] = {
1861 jag 5005
    &title, &whichl,
5006
    &start, &stop, &toggle,
1973 jag 5007
    &mov,
5008
    &smooth, &tick, &clockwise, &anticlockwise,  
5009
    &rpm, &deg, &tps,
1828 jag 5010
 
5011
  };
5012
  makehier (w);
1668 jag 5013
#endif
1666 jag 5014
}
5015
 
1806 jag 5016
void menu::defvelaccelui::setup () {
1732 jag 5017
 
1836 jag 5018
  whichl.set_listener (this);
1732 jag 5019
 
1809 jag 5020
  spinner2<float>* sp [] = {
5021
    &mag,
5022
    &autorotate.rpm,
5023
    &autorotate.dps,
5024
    &autorotate.tps,
5025
    &autoflip.deg,
1970 jag 5026
    &autopause.every,
5027
    &autopause.f0r,
1809 jag 5028
  };
5029
 
5030
  const char* nam [] = {
5031
    "Magnitude",
5032
    "RPM",
1858 jag 5033
    "Degrees per Tick",
1809 jag 5034
    "Ticks Per Second",
1976 jag 5035
    "Every", // autoflip (degrees)
5036
    "Every", // autopause (seconds)
1970 jag 5037
    "For",
1809 jag 5038
  };
5039
 
5040
  change_listener<field>* chgl [] = {
5041
    &magl,
5042
    &rpml,
5043
    &dpsl,
5044
    &tpsl,
1970 jag 5045
    &degl,
1971 jag 5046
    &everyl,
5047
    &f0rl
1809 jag 5048
  };
5049
 
1970 jag 5050
  float mins [] = {0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f};
1976 jag 5051
  float dels [] = {1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 0.01f, 0.01f};
1864 jag 5052
 
1970 jag 5053
  int nsp = 7;
1809 jag 5054
  for (int i = 0; i < nsp; ++i) {
5055
    spinner2<float>& spi = *sp[i];
1976 jag 5056
    spi.set (nam[i], dels[i], mins[i], MILLIONF, chgl[i]);
1809 jag 5057
    spi.lis[2] = &varl;
5058
    spi.variance.cb.id = i;
5059
    spi.variance.fld.id = i;
5060
    spi.variance.cb.set_listener (&chkl);
5061
  }
5062
 
1836 jag 5063
  clockwise.set (1.0f, 0.0f, MILLIONF, &clockl);
5064
  anticlockwise.set (1.0f, 0.0f, MILLIONF, &aclockl);
5065
  clockwise.set_text ("Clockwise", DEGREES);
5066
  anticlockwise.set_text ("Anti-clockwise", DEGREES);
2106 jag 5067
 
1836 jag 5068
  autoflip.deg.set_text ("Every", DEGREES);
2106 jag 5069
 
1970 jag 5070
  autopause.every.set_text ("Every", SECONDS);
5071
  autopause.f0r.set_text ("For", SECONDS);
2027 jag 5072
  autopause.tar.set_listener (&tarl);
1732 jag 5073
 
5074
  ldir.set_text ("Direction");
1735 jag 5075
  odir.set_listener (&dirl);
5076
 
1809 jag 5077
  checkbutton* cb [] = {
5078
    &neg,
5079
    &randomize,
5080
    &autorotate.cb,
1871 jag 5081
    &autorotate.uet.deg,
5082
    &autorotate.uet.tps,
1970 jag 5083
    &autoflip.cb,
5084
    &autopause.cb,
1809 jag 5085
  };
1735 jag 5086
 
1971 jag 5087
  for (int i = 0, j = 7; i < 7; ++i, ++j) {
1809 jag 5088
    checkbutton& cbi = *cb[i];
5089
    cbi.id = j;
5090
    cbi.set_listener (&chkl);
5091
  }
1732 jag 5092
 
1807 jag 5093
  autorotate.setup ();
5094
 
1732 jag 5095
#ifdef __WIDGET_MOVE__
1828 jag 5096
  autoflip.setup ();
1971 jag 5097
  autopause.setup ();
1732 jag 5098
  widget* w[] = {
1836 jag 5099
    &whichl,
1756 jag 5100
    &mag,
1732 jag 5101
    &ldir, &neg, &odir,
1836 jag 5102
    &randomize, &clockwise, &anticlockwise, &sync,
1828 jag 5103
 
1732 jag 5104
  };
1828 jag 5105
  makehier (w);
1732 jag 5106
#endif
1808 jag 5107
 
1732 jag 5108
}
5109
 
1806 jag 5110
void menu::defvelaccelui::load () {
1810 jag 5111
 
1806 jag 5112
  defvelaccel* dval [] = {&drone::v0, &drone::a0};
1836 jag 5113
  cur = dval [which];
5114
  whichl.set_text (cur->name);
1810 jag 5115
 
1836 jag 5116
  neg.set_state (cur->neg, 0);
1810 jag 5117
  static const char* s [] = {" Horizontal", " Vertical", " Mouse"};
1836 jag 5118
  odir.set_text (s[cur->dir]);
1837 jag 5119
  MENU.dva.idir = cur->dir;
5120
 
1836 jag 5121
  randomize.set_state (cur->rndrot, 0);
5122
  clockwise.set_value (cur->clock.deg);
5123
  anticlockwise.set_value (cur->anticlock.deg);
5124
  sync.set_state (cur->sync, 0);
1810 jag 5125
 
5126
  spinner2<float>* sp [] = {
1971 jag 5127
    MENUP.dva.mag,
5128
    MENUP.dva.autorotate.rpm,
5129
    MENUP.dva.autorotate.dps,
5130
    MENUP.dva.autorotate.tps,
5131
    MENUP.dva.autoflip.deg,
5132
    MENUP.dva.autopause.every,
5133
    MENUP.dva.autopause.f0r,
1810 jag 5134
  };
5135
 
5136
  valt* vt [] = {
1836 jag 5137
    &cur->mag,
5138
    &cur->autos.rot.rpm,
5139
    &cur->autos.rot.dps,
5140
    &cur->autos.rot.tps,
5141
    &cur->autos.flip.deg,
1971 jag 5142
    &cur->autos.pause.every,
5143
    &cur->autos.pause.f0r,
1810 jag 5144
  };
5145
 
1971 jag 5146
  for (int i = 0; i < 7; ++i) {
1810 jag 5147
    spinner2<float>& spi = *sp[i];
5148
    valt& vti = *vt[i];
5149
    spi.set_value (vti.val);
5150
    spi.variance.rd = vti.rd;
5151
    spi.variance.setfld ();
5152
    spi.variance.cb.set_state (vti.rndrd, 0);
5153
  }
5154
 
1836 jag 5155
  autorotate.load ();
1971 jag 5156
 
1836 jag 5157
  autoflip.cb.set_state (cur->autos.flip.yes);
1810 jag 5158
 
1971 jag 5159
  autopause.cb.set_state (cur->autos.pause.yes);
2027 jag 5160
  autopause.tar.set_text (autopauset::tars[cur->autos.pause.tar]);
1810 jag 5161
 
1732 jag 5162
}
5163
 
1806 jag 5164
void menu::defvelaccelui::picked (label& lbl, int p) {
1836 jag 5165
  which = !which;
1758 jag 5166
  load ();
5167
}
1732 jag 5168
 
1806 jag 5169
VALUE_CHANGED (menu::defvelaccelui, varlis) {
1809 jag 5170
  spinner2<float>* sp [] = {
1971 jag 5171
    MENUP.dva.mag,
5172
    MENUP.dva.autorotate.rpm,
5173
    MENUP.dva.autorotate.dps,
5174
    MENUP.dva.autorotate.tps,
5175
    MENUP.dva.autoflip.deg,
5176
    MENUP.dva.autopause.every,
5177
    MENUP.dva.autopause.f0r,
1809 jag 5178
  };
5179
 
1836 jag 5180
  defvelaccel& dva = *MENU.dva.cur;
1809 jag 5181
  valt* vt [] = {
5182
    &dva.mag,
5183
    &dva.autos.rot.rpm,
5184
    &dva.autos.rot.dps,
5185
    &dva.autos.rot.tps,
5186
    &dva.autos.flip.deg,
1971 jag 5187
    &dva.autos.pause.every,
5188
    &dva.autos.pause.f0r,
1809 jag 5189
  };
5190
 
5191
  int id = f.id;
5192
  vt[id]->rd = sp[id]->variance.rd;
1732 jag 5193
}
5194
 
1809 jag 5195
defvelaccel& getdva () {
5196
  defvelaccel* dval [] = {&drone::v0, &drone::a0};
1836 jag 5197
  return *dval [MENU.dva.which];
1809 jag 5198
}
5199
 
2106 jag 5200
VALUE_CHANGED (menu::defvelaccelui, maglis) {
5201
  float v = MENU.dva.mag.value;
5202
  MENU.dva.cur->mag.val = v;
5203
  cons << "Magnitude of " << MENU.dva.cur->name << " = " << v << eol;
5204
}
5205
 
1809 jag 5206
VALUE_CHANGED (menu::defvelaccelui, rpmlis) {
5207
  defvelaccel& dva = getdva ();
2106 jag 5208
  float v = MENU.dva.autorotate.rpm.value;
1809 jag 5209
  dva.autos.rot.rpm = v;
5210
  cons << dva.name << " Auto rotate RPM = " << v << eol;
5211
}
5212
 
5213
VALUE_CHANGED (menu::defvelaccelui, dpslis) {
5214
  defvelaccel& dva = getdva ();
2106 jag 5215
  float v = MENU.dva.autorotate.dps.value;
1809 jag 5216
  dva.autos.rot.dps = v;
1856 jag 5217
  cons << dva.name << " Degrees per Tick = " << v << eol;
1809 jag 5218
}
5219
VALUE_CHANGED (menu::defvelaccelui, tpslis) {
5220
  defvelaccel& dva = getdva ();
2106 jag 5221
  float v = MENU.dva.autorotate.tps.value;
1809 jag 5222
  dva.autos.rot.tps = v;
5223
  cons << dva.name << " Ticks per Second = " << v << eol;
5224
}
5225
 
5226
VALUE_CHANGED (menu::defvelaccelui, deglis) {
5227
  defvelaccel& dva = getdva ();
2106 jag 5228
  float v = MENU.dva.autoflip.deg.value;
1809 jag 5229
  dva.autos.flip.deg = v;
1836 jag 5230
  cons << dva.name << " Auto flip every " << v << DEGREES << eol;
1809 jag 5231
}
5232
 
1971 jag 5233
VALUE_CHANGED (menu::defvelaccelui, everylis) {
5234
  defvelaccel& dva = getdva ();
2106 jag 5235
  float v = MENU.dva.autopause.every.value;
1971 jag 5236
  dva.autos.pause.every = v;
5237
  cons << dva.name << " Auto pause every " << v << SECONDS << eol;
5238
}
5239
 
5240
VALUE_CHANGED (menu::defvelaccelui, f0rlis) {
5241
  defvelaccel& dva = getdva ();
2106 jag 5242
  float v = MENU.dva.autopause.f0r.value;
1971 jag 5243
  dva.autos.pause.f0r = v;
5244
  cons << dva.name << " Auto pause for " << v << SECONDS << eol;
5245
}
5246
 
1806 jag 5247
VALUE_CHANGED (menu::defvelaccelui, clocklis) {
2106 jag 5248
  float v = MENU.dva.clockwise.value;
1836 jag 5249
  MENU.dva.cur->clock = v;
5250
  MENU.dva.checksync (v, MENU.dva.cur->anticlock, MENU.dva.anticlockwise);
5251
  MENU.dva.cur->setrotrd ();
2106 jag 5252
  cons << MENU.dva.cur->name << " Clockwise Rotation = " << v << DEGREES << eol;
1736 jag 5253
}
5254
 
1806 jag 5255
VALUE_CHANGED (menu::defvelaccelui, anticlocklis) {
2106 jag 5256
  float v = MENU.dva.anticlockwise.value;
1836 jag 5257
  MENU.dva.cur->anticlock = v;
5258
  MENU.dva.checksync (v, MENU.dva.cur->clock, MENU.dva.clockwise);
5259
  MENU.dva.cur->setrotrd ();
2106 jag 5260
  cons << MENU.dva.cur->name << " Anti-clockwise Rotation = " << v << DEGREES << eol;
1736 jag 5261
}
5262
 
2106 jag 5263
PICKED_OPTION (menu::defvelaccelui, tarlis) {
5264
  defvelaccel& dva = getdva ();
5265
  int& tar = dva.autos.pause.tar;
5266
  tar = !tar;
5267
  l.set_text (menu::defvelaccelui::autopauset::tars[tar]);
5268
}
5269
 
1806 jag 5270
PICKED_OPTION (menu::defvelaccelui, dirlis) {
1738 jag 5271
  int& idir = MENU.dva.idir;
5272
  idir += dir;
1806 jag 5273
  wrap<int> (menu::defvelaccelui::HORIZONTAL, idir, menu::defvelaccelui::MOUSE);
1836 jag 5274
  MENU.dva.cur->dir = idir;
1738 jag 5275
  static const char* s [] = {" Horizontal", " Vertical", " Mouse"};
2027 jag 5276
  l.set_text (s[idir]);
1738 jag 5277
}
5278
 
1858 jag 5279
int gethandlesize () { return MENU.handlesize(); }
1892 jag 5280
 
1858 jag 5281
int gettrailsize () {return MENU.trailsize(); }
1892 jag 5282
 
5283
void initlaunch (drone* pd) {
1877 jag 5284
  drone& d = *pd;
2106 jag 5285
  d.lpm = MENU.ddpm ();
1892 jag 5286
  d.launch_every.triggert = ppm2t (d.lpm);
5287
  d.dpl = MENU.ddpl ();
1877 jag 5288
}
1858 jag 5289
 
1806 jag 5290
void get (float& g, float& ux, float& uy, defvelaccel& dva) {
1758 jag 5291
  g = dva.mag ();
1750 jag 5292
  point<int> mous (din0.delta_mousex, din0.delta_mousey);
5293
  if (mous.x == 0 && mous.y == 0) {
5294
    ux = 0;
5295
    uy = 1;
5296
  } else {
5297
    unit_vector<float> (ux, uy, mous.x, -mous.y);
5298
  }
1736 jag 5299
  float dirxa [] = {1, 0, ux};
5300
  float dirya [] = {0, 1, uy};
5301
  float nega [] = {1, -1};
5302
  float neg = nega [dva.neg];
5303
  ux = neg * dirxa [dva.dir];
5304
  uy = neg * dirya [dva.dir];
1737 jag 5305
  if (dva.rndrot) rotate_vector (ux, uy, dva.rotrd());
1736 jag 5306
}
5307
 
1755 jag 5308
 
1806 jag 5309
CLICKED_CHECKBUTTON (menu::defvelaccelui, chklis) {
1836 jag 5310
  defvelaccel& dva = *MENU.dva.cur;
1809 jag 5311
  int* val [] = {
5312
    &dva.mag.rndrd,
5313
    &dva.autos.rot.rpm.rndrd,
5314
    &dva.autos.rot.dps.rndrd,
5315
    &dva.autos.rot.tps.rndrd,
5316
    &dva.autos.flip.deg.rndrd,
1971 jag 5317
    &dva.autos.pause.every.rndrd,
5318
    &dva.autos.pause.f0r.rndrd,
1809 jag 5319
    &dva.neg,
5320
    &dva.rndrot,
5321
    &dva.autos.rot.yes,
1871 jag 5322
    &dva.autos.rot.uet.deg,
5323
    &dva.autos.rot.uet.tps,
1809 jag 5324
    &dva.autos.flip.yes,
1971 jag 5325
    &dva.autos.pause.yes,
1809 jag 5326
  };
1735 jag 5327
  *val[cb.id] = cb.state;
5328
}
5329
 
1666 jag 5330
CLICKED_BUTTON (menu::autorott, startlis) {
1772 jag 5331
  din0.setautorot (MENU.autorotate.which, 1);
1666 jag 5332
}
5333
 
5334
CLICKED_BUTTON (menu::autorott, stoplis) {
1772 jag 5335
  din0.setautorot (MENU.autorotate.which, 0);
1666 jag 5336
}
5337
 
5338
CLICKED_BUTTON (menu::autorott, togglis) {
1772 jag 5339
  din0.setautorot (MENU.autorotate.which, 0, 1);
1666 jag 5340
}
5341
 
5342
CLICKED_BUTTON (menu::autorott, clockwiselis) {
1772 jag 5343
  din0.setautorotdir (MENU.autorotate.which, -1);
1666 jag 5344
}
5345
 
5346
CLICKED_BUTTON (menu::autorott, anticlockwiselis) {
1772 jag 5347
  din0.setautorotdir (MENU.autorotate.which, 1);
1666 jag 5348
}
1668 jag 5349
 
1730 jag 5350
VALUE_CHANGED (menu::autorott, rpmlis) {
1773 jag 5351
  din0.setautorotparam (MENU.autorotate.which, menu::autorott::RPM);
1730 jag 5352
}
5353
 
1773 jag 5354
VALUE_CHANGED (menu::autorott, deglis) {
5355
  din0.setautorotparam (MENU.autorotate.which, menu::autorott::DEG);
5356
}
5357
 
5358
VALUE_CHANGED (menu::autorott, tpslis) {
5359
  din0.setautorotparam (MENU.autorotate.which, menu::autorott::TPS);
5360
}
5361
 
1982 jag 5362
CLICKED_BUTTON (menu::autorott::autoflipt, sutlis) {
5363
  static int togs [] = {0, 0, 1};
5364
  din0.setautoflip (MENU.autorotate.which, b.id, togs[b.id]);
1730 jag 5365
}
5366
 
1771 jag 5367
VALUE_CHANGED (menu::autorott::autoflipt, anglis) {
1772 jag 5368
  din0.setautoflipangle (MENU.autorotate.which);
1771 jag 5369
}
5370
 
1974 jag 5371
VALUE_CHANGED (menu::autorott::autopauset, everylis) {
5372
  din0.setautopauseparam (MENU.autorotate.which, 0);
5373
}
5374
 
5375
VALUE_CHANGED (menu::autorott::autopauset, f0rlis) {
5376
  din0.setautopauseparam (MENU.autorotate.which, 1);
5377
}
5378
 
1982 jag 5379
CLICKED_BUTTON (menu::autorott::autopauset, sutlis) {
5380
  static int togs[] = {0, 0, 1};
5381
  din0.setautopause (MENU.autorotate.which, b.id, togs[b.id]);
1972 jag 5382
}
5383
 
1982 jag 5384
CLICKED_BUTTON (menu::autorott::rndflipauset, sutlis) {
5385
  static int togs[] = {0, 0, 1};
1976 jag 5386
  menu::autorott& ar = MENU.autorotate;
1982 jag 5387
  din0.setrndflipause (ar.which, ar.rndflipause.which, b.id, togs[b.id]);
1976 jag 5388
}
1972 jag 5389
 
1976 jag 5390
PICKED_OPTION (menu::autorott::rndflipauset, rndflipauselis) {
5391
  static const char* opts [] = {
1981 jag 5392
    " Randomize Auto Flip Degrees",
5393
    " Randomize Auto Pause : Every",
5394
    " Randomize Auto Pause : For"
1976 jag 5395
  };
5396
  int& which = MENU.autorotate.rndflipause.which;
5397
  which += dir;
5398
  wrap (0, which, 2);
5399
  MENU.autorotate.rndflipause.whichl.set_text (opts[which]);
5400
}
5401
 
1674 jag 5402
PICKED_OPTION (menu, ol_add_wand_lis) {
1675 jag 5403
  static const char* aws [] = {" Add", " Wand"};
1690 jag 5404
  din0.dinfo.wand = !din0.dinfo.wand;
5405
  MENU.ol_add_wand.set_text (aws[din0.dinfo.wand]);
1674 jag 5406
}
1675 jag 5407
 
5408
PICKED_OPTION (menu, ol_drones_are_lis) {
1677 jag 5409
  static const char* das [] = {"are immortal", "are mortal", "reincarnate"};
1731 jag 5410
  drone::ARE += dir;
5411
  wrap<int> (drone::IMMORTAL, drone::ARE, drone::REINCARNATE);
5412
  sprintf (BUFFER, " Drones %s", das[drone::ARE]);
1675 jag 5413
  MENU.ol_drones_are.set_text (BUFFER);
5414
}
1676 jag 5415
 
1828 jag 5416
VALUE_CHANGED (menu,risel) {
2105 jag 5417
  din0.dinfo.drone_rise_time = MENU.riset.value;
1829 jag 5418
  cons << "Drone rise time = " << din0.dinfo.drone_rise_time << eol;
1676 jag 5419
}
5420
 
1828 jag 5421
VALUE_CHANGED (menu,falll) {
2105 jag 5422
  din0.dinfo.drone_fall_time = MENU.fallt.value;
1829 jag 5423
  cons << "Drone fall time = " << din0.dinfo.drone_fall_time << eol;
1676 jag 5424
}
5425
 
1677 jag 5426
VALUE_CHANGED(menu,lifetimel) {
2105 jag 5427
  drone::LIFETIME = MENU.lifetime.value;
1687 jag 5428
  cons << "Drone life time = " << drone::LIFETIME << SECONDS << eol;
1677 jag 5429
}
5430
 
2106 jag 5431
VALUE_CHANGED(menu,handlesizel) {
5432
  drone::HANDLESIZE = MENU.handlesize.value;
5433
  cons << GREEN << "Default drone handle size = " << drone::HANDLESIZE << eol;
5434
}
5435
 
5436
VALUE_CHANGED(menu,trailsizel) {
5437
  TRAILSIZE = MENU.trailsize.value;
5438
  cons << GREEN << "Default Drone / Ball trail size = " << TRAILSIZE << eol;
5439
}
5440
 
5441
VALUE_CHANGED(menu,ddpmlis) {
5442
  int& ddpm = din0.dinfo.dpm;
5443
  ddpm = MENU.ddpm.value;
5444
  cons << GREEN << "Default drone launches per minute = " << ddpm << eol;
5445
}
5446
 
5447
VALUE_CHANGED(menu,ddpllis) {
5448
  int& ddpl = din0.dinfo.dpl;
5449
  ddpl = MENU.ddpl.value;
5450
  cons << GREEN << "Default drones per launch = " << ddpl << eol;
5451
}
5452
 
5453
VALUE_CHANGED (menu,sp_wand_dist_lis) {
5454
  int d = MENU.sp_wand_dist.value;
5455
  drone::wand.set (d);
5456
  cons << YELLOW << "Wand distance = " << d << eol;
5457
}
5458
 
1695 jag 5459
VALUE_CHANGED(menu,speedl) {
5460
  din0.changechuckspeed (MENU.chspeed);
5461
}
5462
 
5463
VALUE_CHANGED(menu,lengthl) {
5464
  din0.changechucklength (MENU.chlen);
5465
}
5466
 
1702 jag 5467
VALUE_CHANGED(menu,traill) {
5468
  din0.change_drone_trail_points (MENU.chtrail);
5469
}
5470
 
2105 jag 5471
VALUE_CHANGED(menu,angleperframel) {
5472
  drone::chuckt::apt += MENU.chapt();
5473
  RESETALLCHUCKTRAILS
5474
  cons << YELLOW << "Angle per turn = " << drone::chuckt::apt.deg << DEGREES << eol;
5475
}
5476
 
1708 jag 5477
 
1677 jag 5478
CLICKED_BUTTON(menu,mortalizel) {
5479
  din0.mortalize_drones ();
1784 jag 5480
  TOGGLEMENU
1677 jag 5481
}
5482
 
1731 jag 5483
CLICKED_BUTTON(menu,reincarnatel) {
5484
  #define REINCARNATE 1
5485
  din0.mortalize_drones (REINCARNATE);
1784 jag 5486
  TOGGLEMENU
1677 jag 5487
}
5488
 
1731 jag 5489
CLICKED_BUTTON(menu,immortalizel) {
5490
  din0.immortalize_drones ();
1784 jag 5491
  TOGGLEMENU
1677 jag 5492
}
1680 jag 5493
 
1695 jag 5494
CLICKED_BUTTON(menu,chuckl) {
5495
  din0.chuck ();
1784 jag 5496
  TOGGLEMENU
1695 jag 5497
}
5498
 
5499
CLICKED_BUTTON(menu,chflipl) {
5500
  din0.flipchuckspeed ();
1784 jag 5501
  TOGGLEMENU
1695 jag 5502
}
5503
 
1697 jag 5504
CLICKED_BUTTON(menu,chtogl) {
5505
  din0.togchuckspeed ();
1784 jag 5506
  TOGGLEMENU
1697 jag 5507
}
5508
 
1749 jag 5509
CLICKED_CHECKBUTTON(menu,autoresettrailslis) {
5510
  drone::chuckt::autoresettrails = cb.state;
5511
  RESETALLCHUCKTRAILS
5512
}
5513
 
1753 jag 5514
PICKED_OPTION(menu,anchoredl) {
5515
  drone::anchored = !drone::anchored;
5516
  static const char* lbl [] = {" Drone is launched", " Drone is anchored"};
5517
  MENU.anchored.set_text (lbl[drone::anchored]);
5518
}
5519
 
1682 jag 5520
void menu::moddirs::clicked (button& cb) {
5521
  DECL_BUTTONS
1693 jag 5522
  for (int i = 0; i < 4; ++i) {
1687 jag 5523
    if (&cb == b[i]) {
5524
      din0.setmoddir (what, i);
5525
      break;
5526
    }
1693 jag 5527
  }
1784 jag 5528
  TOGGLEMENU
1682 jag 5529
}
5530
 
5531
void menu::moddirs::setup (const string& l) {
5532
  DECL_BUTTONS
5533
  lbl.set_text (l);
2060 jag 5534
  const char* txt [] = {"Vertical", "Horizontal", "Velocity", "Acceleration"};
5535
  for (int i = 0; i < 4; ++i) b[i]->set_text (txt[i]);
1682 jag 5536
#ifdef __WIDGET_MOVE__
2060 jag 5537
  widget* u[] = {&lbl, &vert, &hor, &vel, &accel, 0};
5538
  makefam (u);
1682 jag 5539
#endif
5540
}
1769 jag 5541
 
1806 jag 5542
void menu::defvelaccelui::autorotatet::setup () {
1808 jag 5543
  dir.set_listener (&dirl);
5544
  mov.set_listener (&movl);
1828 jag 5545
#ifdef __WIDGET_MOVE__
5546
  widget* w[] = {
5547
    &cb,
5548
    &dir,
5549
    &mov,
5550
    &rpm,
5551
    &dps,
1892 jag 5552
    &uet.deg,
1828 jag 5553
    &tps,
1892 jag 5554
    &uet.tps,
1828 jag 5555
 
5556
  };
5557
  makehier (w);
5558
#endif
1805 jag 5559
}
1778 jag 5560
 
1836 jag 5561
void menu::defvelaccelui::autorotatet::load () {
5562
  defvelaccel& dva = getdva ();
5563
  defvelaccel::autost::rott& rot = dva.autos.rot;
5564
  cb.set_state (rot.yes, 0);
1871 jag 5565
  uet.deg.set_state (rot.uet.deg, 0);
5566
  uet.tps.set_state (rot.uet.tps, 0);
1980 jag 5567
  static const char* diropts [] = {" Clockwise", " Anti clockwise", " Clockwise or Anti-clockwise"};
5568
  static const char* movopts [] = {" Smooth", " Ticked", " Smooth or Ticked"};
1836 jag 5569
  dir.set_text (diropts[rot.dir]);
5570
  mov.set_text (movopts[rot.mov]);
5571
}
5572
 
1828 jag 5573
#ifdef __WIDGET_MOVE__
5574
void menu::defvelaccelui::autoflipt::setup () {
5575
  widget* w[] = {
5576
    &cb,
5577
    &deg,
5578
 
5579
  };
5580
  makehier (w);
5581
}
1971 jag 5582
 
5583
void menu::defvelaccelui::autopauset::setup () {
5584
  widget* w[] = {
5585
    &cb,
5586
    &every,
5587
    &f0r,
2027 jag 5588
    &tar,
1971 jag 5589
 
5590
  };
5591
  makehier (w);
5592
}
1828 jag 5593
#endif
5594
 
1806 jag 5595
PICKED_OPTION (menu::defvelaccelui::autorotatet, dirlis) {
1807 jag 5596
  defvelaccel& dva = getdva ();
1805 jag 5597
  dva.autos.rot.dir += dir;
1807 jag 5598
  wrap<int> (autorotator::CLOCKWISE, dva.autos.rot.dir, autorotator::RANDOM);
1805 jag 5599
  static const char* opts [] = {" Clockwise", " Anti clockwise", " Clockwise or Anti-clockwise"};
5600
  l.set_text (opts[dva.autos.rot.dir]);
5601
}
5602
 
1806 jag 5603
PICKED_OPTION (menu::defvelaccelui::autorotatet, movlis) {
1807 jag 5604
  defvelaccel& dva = getdva ();
1805 jag 5605
  dva.autos.rot.mov += dir;
1980 jag 5606
  wrap<int> (autorotator::SMOOTH, dva.autos.rot.mov, autorotator::RANDOM);
5607
  static const char* opts [] = {" Smooth", " Ticked", " Smooth or Ticked"};
1805 jag 5608
  l.set_text (opts[dva.autos.rot.mov]);
5609
}
5610
 
1807 jag 5611
CLICKED_CHECKBUTTON (menu::defvelaccelui::autorotatet, chklis) {
5612
  defvelaccel& dva = getdva ();
5613
  dva.autos.rot.yes = cb.state;
5614
}
5615
 
1828 jag 5616
drone::bouncet::bouncet () {
5617
  n = 0;
1855 jag 5618
  max = -1;
1828 jag 5619
}
1852 jag 5620
 
5621
drone::genn::genn () {
5622
  n = 0;
5623
  max = MENU.gens ();
5624
}
5625
 
1897 jag 5626
std::ostream& operator<< (std::ostream& f, colorer_t& clr) {
5627
  color_data_t& cd = clr.schemes[clr.i]->data;
5628
  color &c0 = cd.clr[0], &c1 = cd.clr[1];
5629
  f << c0.r << spc << c0.g << spc << c0.b << spc << c1.r << spc << c1.g << spc << c1.b;
5630
  return f;
5631
}
5632
 
5633
 
5634
std::istream& operator>> (std::istream& f, colorer_t& clr) {
5635
  color_data_t& cd = clr.schemes[0]->data;
5636
  color &c0 = cd.clr[0], &c1 = cd.clr[1];
5637
  f >> c0.r >> c0.g >> c0.b >> c1.r >> c1.g >> c1.b;
5638
  return f;
5639
}
5640
 
5641
void menu::initcolorsliders () {
5642
  file_in fi ("color-sliders");
5643
  ifstream& f = fi ();
5644
  f >> colorer;
5645
  color_data_t& cd = colorer.schemes[0]->data;
5646
  color &c0 = cd.clr[0], &c1 = cd.clr[1];
5647
  float c [] = {c0.r, c0.g, c0.b, c1.r, c1.g, c1.b};
5648
  slider<float>* s [] = {&s_red_min, &s_green_min, &s_blue_min, &s_red_max, &s_green_max, &s_blue_max};
5649
  for (int i = 0; i < COLOR_SLIDERS_M; ++i) s[i]->set_val (c[i]);
5650
}
5651
void menu::savecolorsliders () {
5652
  file_out fo ("color-sliders");
5653
  ofstream& f = fo ();
5654
  f << colorer << endl;
5655
}
1913 jag 5656
 
5657
CLICKED_BUTTON (menu, am2fm2amlis) {
5658
  din0.set_drone_am2fm2am_bpm (b.id);
5659
}
1941 jag 5660
 
5661
 
5662
CLICKED_CHECKBUTTON (menu, curveslistl) {
1942 jag 5663
  if (!CRVED->setcrvvis (cb.id, cb.state)) cb.turn_on (DONT_CALL_LISTENER);
1941 jag 5664
}
5665
 
1945 jag 5666
void curve_editor::setup_tools_menu () {
1955 jag 5667
  curve_info& ci = curveinfo [curcrv];
5668
  multi_curve* crv = ci.curve;
5669
  MENU.sp_curve_rpm.set_value (ci.lastrpm);
1958 jag 5670
  MENU.sp_curve_every.variance.cb.set_state (ci.randoflip);
1959 jag 5671
  MENU.sp_curve_every.variance.rd = ci.rd;
5672
  MENU.sp_curve_every.variance.setfld ();
1958 jag 5673
  MENU.sp_curve_every.set_value (ci.every0.deg);
1955 jag 5674
  MENU.cb_ed_autoflip.set_state (ci.autoflip);
1945 jag 5675
  MENU.lf_curve_name.set_text (crv->name);
5676
  MENU.sp_curve_limit.set_value (crv->limit);
5677
  MENU.picked (MENU.ol_mirror.option, 0);
5678
  set_curve_style (crv);
5679
  curcrvchgd = 0;
5680
}
1984 jag 5681
 
5682
 
5683
PICKED_OPTION (menu, moverailstrafelis) {
5684
  static const char* opts [] = {" Move", " Rail", " Strafe"};
5685
  click_listener* clk [] = {MENUP.bmdl, MENUP.raill, MENUP.strafel};
5686
  int& id = MENU.moverailstrafe.id;
5687
  button& option = MENU.moverailstrafe.option;
5688
  id += dir;
5689
  wrap (0, id, 2);
5690
  option.set_text (opts[id]);
5691
  LISTEN(option, clk[id]);
5692
}
1990 jag 5693
 
5694
float getlifetime () {
5695
  return MENU.lifetime ();
5696
}
2049 jag 5697
 
5698
VALUE_CHANGED (menu,texsteplis) {
5699
  mondrian0.patstep = MENU.texstep();
5700
  mondrian0.fillpatbuf ();
5701
  cons << GREEN << "Texture step = " <<  mondrian0.patstep << eol;
5702
}
2060 jag 5703
 
5704
PICKED_OPTION (menu, revmodl) {
5705
  static const char* opts [] = {"Both", "AM", "FM"};
5706
  int& revmod = din0.dinfo.revmod;
5707
  revmod += dir;
5708
  wrap (0, revmod, 2);
5709
  sprintf (BUFFER, " Reverse %s", opts[revmod]);
5710
  l.set_text (BUFFER);
5711
}
5712
 
5713
CLICKED_BUTTON (menu, revclkl) {
5714
  din0.reverse_drone_modulation ();
5715
}
2272 jag 5716
 
2273 jag 5717
VALUE_CHANGED (menu,sep_bin_lis) {
5718
  din0.change_drone_sep (MENU.sep_bin);
5719
}