1
/****************************************************************************
3
GLUI User Interface Toolkit
4
---------------------------
6
glui_add_controls.cpp - Routines for adding controls to a GLUI window
9
--------------------------------------------------
11
Copyright (c) 1998 Paul Rademacher
13
This program is freely distributable without licensing fees and is
14
provided without guarantee or warrantee expressed or implied. This
15
program is -not- in the public domain.
17
*****************************************************************************/
24
/*********************************** GLUI:: add_checkbox() ************/
26
GLUI_Checkbox *GLUI:: add_checkbox( char *name, int *value_ptr,
27
int id, GLUI_Update_CB callback )
29
return add_checkbox_to_panel( main_panel,
30
name, value_ptr, id, callback );
34
/*********************************** GLUI:: add_checkbox_to_panel() **********/
36
GLUI_Checkbox *GLUI::add_checkbox_to_panel( GLUI_Panel *panel,
37
char *name, int *value_ptr,
39
GLUI_Update_CB callback )
41
GLUI_Checkbox *control;
43
control = new GLUI_Checkbox;
46
control->set_ptr_val( value_ptr );
47
control->user_id = id;
48
control->set_name( name );
49
control->callback = callback;
51
add_control( panel, control );
64
/************************************ GLUI_Main::add_control() **************/
66
int GLUI_Main::add_control( GLUI_Node *parent, GLUI_Control *control )
68
GLUI_Control *parent_control;
70
/*** Collapsible nodes have to be handled differently, b/c the first and
71
last children are swapped in and out ***/
72
parent_control = ((GLUI_Control*)parent);
73
if ( parent_control->collapsible == true ) {
74
if ( NOT parent_control->is_open ) {
75
/** Swap in the original first and last children **/
76
parent_control->child_head = parent_control->collapsed_node.child_head;
77
parent_control->child_tail = parent_control->collapsed_node.child_tail;
79
/*** Link this control ***/
80
control->link_this_to_parent_last( parent );
82
/** Swap the children back out ***/
83
parent_control->collapsed_node.child_head = parent_control->child_head;
84
parent_control->collapsed_node.child_tail = parent_control->child_tail;
85
parent_control->child_head = NULL;
86
parent_control->child_tail = NULL;
89
control->link_this_to_parent_last( parent );
93
control->link_this_to_parent_last( parent );
95
control->glui = (GLUI*) this;
96
control->update_size();
97
control->enabled = ((GLUI_Control*) parent)->enabled;
98
control->glui->refresh();
100
/** Now set the 'hidden' var based on the parent **/
101
if ( parent_control->hidden OR
102
(parent_control->collapsible AND NOT parent_control->is_open ) )
104
control->hidden = true;
111
/********************************************* GLUI::add_panel() *************/
113
GLUI_Panel *GLUI::add_panel( char *name, int type )
115
return add_panel_to_panel( main_panel, name, type );
119
/**************************************** GLUI::add_panel_to_panel() *********/
121
GLUI_Panel *GLUI::add_panel_to_panel( GLUI_Panel *parent_panel,
122
char *name, int type )
126
panel = new GLUI_Panel;
129
panel->set_name( name );
131
panel->int_val = type;
133
add_control( parent_panel, panel );
143
/***************************** GLUI::add_radiogroup() ***************/
145
GLUI_RadioGroup *GLUI::add_radiogroup( int *value_ptr,
146
int user_id, GLUI_Update_CB callback)
148
return add_radiogroup_to_panel( main_panel, value_ptr,
153
/***************************** GLUI::add_radiogroup_to_panel() ***************/
155
GLUI_RadioGroup *GLUI::add_radiogroup_to_panel( GLUI_Panel *panel,
157
int user_id, GLUI_Update_CB callback)
159
GLUI_RadioGroup *control;
162
control = new GLUI_RadioGroup;
165
control->set_ptr_val( value_ptr );
167
control->int_val = *value_ptr; /** Can't call set_int_val(), b/c that
168
function will try to call the
170
/** Actually, maybe not **/
171
control->last_live_int = *value_ptr;
174
control->user_id = user_id;
175
sprintf( buf, "RadioGroup: %p", control );
176
control->set_name( buf );
177
control->callback = callback;
179
add_control( panel, control );
181
control->init_live();
192
/***************************** GLUI::add_radiobutton_to_group() *************/
194
GLUI_RadioButton *GLUI::add_radiobutton_to_group( GLUI_RadioGroup *group,
197
GLUI_RadioButton *control;
199
if ( group->type != GLUI_CONTROL_RADIOGROUP ) {
200
/*fprintf( stderr, "ERROR: Trying to add radiobutton to non-radiogroup\n" ); */
201
/*fflush( stderr ); */
205
control = new GLUI_RadioButton;
208
control->set_int_val( 0 );
211
/** A radio button's user id is always its ordinal number (zero-indexed)
213
control->user_id = group->num_buttons;
214
group->num_buttons++; /* Increments radiogroup's button count */
215
control->set_name( name );
216
control->group = group;
218
add_control( group, control );
220
/*** Now update button states ***/
221
group->set_int_val( group->int_val ); /* This tells the group to
223
current value, thereby
224
updating all its buttons */
235
/********************************** GLUI::add_statictext() ************/
237
GLUI_StaticText *GLUI::add_statictext( char *name )
239
return add_statictext_to_panel( main_panel, name );
243
/******************************* GLUI::add_statictext_to_panel() **********/
245
GLUI_StaticText *GLUI::
246
add_statictext_to_panel( GLUI_Panel *panel, char *name )
248
GLUI_StaticText *control;
250
control = new GLUI_StaticText;
253
control->set_name( name );
254
add_control( panel, control );
265
/***************************************** GLUI:: add_button() ************/
267
GLUI_Button *GLUI:: add_button( char *name,
268
int id, GLUI_Update_CB callback )
270
return add_button_to_panel( main_panel,
271
name, id, callback );
275
/*********************************** GLUI:: add_button_to_panel() **********/
277
GLUI_Button *GLUI::add_button_to_panel( GLUI_Panel *panel,
280
GLUI_Update_CB callback )
282
GLUI_Button *control;
284
control = new GLUI_Button;
287
/* control->set_ptr_val( value_ptr );
289
control->set_int_val( *value_ptr );
292
control->user_id = id;
293
control->callback = callback;
294
control->set_name( name );
296
add_control( panel, control );
307
/********************************** GLUI::add_separator() ************/
309
void GLUI::add_separator( void )
311
add_separator_to_panel( main_panel );
315
/******************************* GLUI::add_separator_to_panel() **********/
317
void GLUI::add_separator_to_panel( GLUI_Panel *panel )
319
GLUI_Separator *control = new GLUI_Separator;
322
add_control( panel, control );
327
/********************************** GLUI::add_edittext() ************/
329
GLUI_EditText *GLUI::add_edittext( char *name,
330
int data_type, void *data,
331
int id, GLUI_Update_CB callback)
333
return add_edittext_to_panel( main_panel, name, data_type, data,
338
/******************************* GLUI::add_edittext_to_panel() **********/
340
GLUI_EditText *GLUI::
341
add_edittext_to_panel( GLUI_Panel *panel, char *name,
342
int data_type, void *data,
343
int id, GLUI_Update_CB callback)
345
GLUI_EditText *control;
347
control = new GLUI_EditText;
350
control->set_name( name );
352
control->data_type = data_type;
353
control->ptr_val = data;
354
control->user_id = id;
355
control->callback = callback;
357
if ( data_type == GLUI_EDITTEXT_TEXT ) {
358
control->live_type = GLUI_LIVE_TEXT;
360
else if ( data_type == GLUI_EDITTEXT_INT ) {
361
control->live_type = GLUI_LIVE_INT;
363
control->set_int_val(control->int_val); /** Set to some default, in case of no live var **/
365
else if ( data_type == GLUI_EDITTEXT_FLOAT ) {
366
control->live_type = GLUI_LIVE_FLOAT;
367
control->num_periods = 1;
369
control->set_float_val(control->float_val); /** Set to some default, in case of no live var **/
372
return NULL; /* Did not pass in a valid data type */
375
add_control( panel, control );
377
control->init_live();
388
/********************************** GLUI::add_spinner() ************/
390
GLUI_Spinner *GLUI::add_spinner( char *name,
391
int data_type, void *data,
392
int id, GLUI_Update_CB callback)
394
return add_spinner_to_panel( main_panel, name, data_type, data,
399
/******************************* GLUI::add_spinner_to_panel() **********/
402
add_spinner_to_panel( GLUI_Panel *panel, char *name,
403
int data_type, void *data,
404
int id, GLUI_Update_CB callback)
406
GLUI_Spinner *control;
409
control = new GLUI_Spinner;
411
if ( NOT strcmp( name, "Spinner Test" ))
416
if ( data_type == GLUI_SPINNER_INT ) {
417
text_type = GLUI_EDITTEXT_INT;
418
/* control->live_type = GLUI_LIVE_INT; */
420
else if ( data_type == GLUI_SPINNER_FLOAT ) {
421
text_type = GLUI_EDITTEXT_FLOAT;
422
/* control->live_type = GLUI_LIVE_FLOAT; */
425
return NULL; /* Did not pass in a valid data type */
428
GLUI_EditText *edittext =
429
add_edittext_to_panel( (GLUI_Panel*) control, name, text_type, data,
433
control->set_name( name );
434
control->edittext = edittext; /* Link the edittext to the spinner */
435
/* control->ptr_val = data; */
436
control->user_id = id;
437
control->data_type = data_type;
438
control->callback = callback;
440
edittext->spinner = control; /* Link the spinner to the edittext */
442
add_control( panel, control );
457
/********************************** GLUI::add_column() ************/
459
void GLUI::add_column( int draw_bar )
461
add_column_to_panel( main_panel, draw_bar );
465
/******************************* GLUI::add_column_to_panel() **********/
467
void GLUI::add_column_to_panel( GLUI_Panel *panel, int draw_bar )
469
GLUI_Column *control = new GLUI_Column;
472
control->int_val = draw_bar; /* Whether to draw vertical bar or not */
474
add_control( panel, control );
481
/*********************************** GLUI:: add_listbox() ************/
483
GLUI_Listbox *GLUI:: add_listbox( char *name, int *value_ptr,
484
int id, GLUI_Update_CB callback )
486
return add_listbox_to_panel( main_panel,
487
name, value_ptr, id, callback );
491
/*********************************** GLUI:: add_listbox_to_panel() **********/
493
GLUI_Listbox *GLUI::add_listbox_to_panel( GLUI_Panel *panel,
494
char *name, int *value_ptr,
496
GLUI_Update_CB callback )
498
GLUI_Listbox *control;
500
control = new GLUI_Listbox;
503
control->set_ptr_val( value_ptr );
504
control->user_id = id;
505
control->set_name( name );
506
control->callback = callback;
508
add_control( panel, control );
510
control->init_live();
520
/*********************************** GLUI:: add_rotation() ************/
522
GLUI_Rotation *GLUI:: add_rotation( char *name, float *value_ptr,
523
int id, GLUI_Update_CB callback )
525
return add_rotation_to_panel( main_panel,
526
name, value_ptr, id, callback );
530
/*********************************** GLUI:: add_rotation_to_panel() **********/
532
GLUI_Rotation *GLUI::add_rotation_to_panel( GLUI_Panel *panel,
533
char *name, float *value_ptr,
535
GLUI_Update_CB callback )
537
GLUI_Rotation *control;
539
control = new GLUI_Rotation;
542
control->set_ptr_val( value_ptr );
543
control->user_id = id;
544
control->set_name( name );
545
control->callback = callback;
546
add_control( panel, control );
547
control->init_live();
549
/*** Init the live 4x4 matrix. This is different than the standard
550
live variable behavior, since the original value of the 4x4 matrix
551
is ignored and reset to Identity ***/
552
if ( value_ptr != NULL ) {
554
for( i=0; i<4; i++ ) {
555
for( j=0; j<4; j++ ) {
558
value_ptr[index] = 1.0;
560
value_ptr[index] = 0.0;
575
/*********************************** GLUI:: add_translation() ************/
578
*GLUI:: add_translation( char *name, int trans_type,
579
float *value_ptr, int id, GLUI_Update_CB callback )
581
return add_translation_to_panel( main_panel,name,trans_type,
582
value_ptr, id, callback );
586
/*********************************** GLUI:: add_translation_to_panel() **********/
589
*GLUI::add_translation_to_panel(
590
GLUI_Panel *panel, char *name,
591
int trans_type, float *value_ptr,
592
int id, GLUI_Update_CB callback )
594
GLUI_Translation *control;
596
control = new GLUI_Translation;
599
control->set_ptr_val( value_ptr );
600
control->user_id = id;
601
control->set_name( name );
602
control->callback = callback;
603
add_control( panel, control );
604
control->init_live();
606
control->trans_type = trans_type;
608
if ( trans_type == GLUI_TRANSLATION_XY ) {
609
control->float_array_size = 2;
611
else if ( trans_type == GLUI_TRANSLATION_X ) {
612
control->float_array_size = 1;
614
else if ( trans_type == GLUI_TRANSLATION_Y ) {
615
control->float_array_size = 1;
617
else if ( trans_type == GLUI_TRANSLATION_Z ) {
618
control->float_array_size = 1;
629
/********************************** GLUI::add_rollout() **************/
631
GLUI_Rollout *GLUI::add_rollout( char *name, int open )
633
return add_rollout_to_panel( main_panel, name, open );
637
/****************************** GLUI::add_rollout_to_panel() *********/
639
GLUI_Rollout *GLUI::add_rollout_to_panel(GLUI_Panel *panel,char *name,int open)
641
GLUI_Rollout *rollout;
643
rollout = new GLUI_Rollout;
646
rollout->set_name( name );
647
rollout->user_id = -1;
648
rollout->int_val = GLUI_PANEL_EMBOSSED;
651
rollout->is_open = false;
652
rollout->h = GLUI_DEFAULT_CONTROL_HEIGHT + 7;
655
add_control( panel, rollout );