21 static t_class *s_ui_class = NULL;
23 static t_jrgba s_color_background_button = {0.2, 0.2, 0.2, 1.0};
24 static t_jrgba s_color_border_button = {0.4, 0.4, 0.4, 1.0};
25 static t_jrgba s_color_text_button_on = {0.7, 0.7, 0.7, 1.0};
26 static t_jrgba s_color_text_button_off = {0.6, 0.6, 0.6, 1.0};
28 static t_jrgba s_color_blue_button = {0.2, 0.2, 0.7, 1.0};
29 static t_jrgba s_color_blue_ring = {0.45, 0.45, 1.0, 1.0};
30 static t_jrgba s_color_darkblue = {0.1, 0.1, 0.5, 1.0};
32 static t_jrgba s_color_orange_button = {0.8, 0.6, 0.2, 1.0};
33 static t_jrgba s_color_red_button = {0.6, 0.2, 0.2, 1.0};
35 static t_jrgba s_color_green_button = {0.2, 0.7, 0.2, 1.0};
36 static t_jrgba s_color_green_ring = {0.25, 0.75, 0.25, 1.0};
37 static t_jrgba s_color_darkgreen = {0.05, 0.4, 0.05, 1.0};
39 static t_jrgba s_color_selected = {0.62, 0., 0.36, 0.70};
43 #pragma mark life cycle
45 int JAMOMA_EXPORT_MAXOBJ
main(
void)
51 common_symbols_init();
53 TTUiInfo::registerClass();
64 flags = JBOX_TEXTFIELD;
65 jbox_initclass(c, flags);
66 c->c_flags |= CLASS_FLAG_NEWDICTIONARY;
68 class_addmethod(c, (method)ui_notify,
"notify", A_CANT, 0);
69 class_addmethod(c, (method)ui_paint,
"paint", A_CANT, 0);
70 class_addmethod(c, (method)ui_mousedown,
"mousedown", A_CANT, 0);
71 class_addmethod(c, (method)ui_mousedragdelta,
"mousedragdelta", A_CANT, 0);
72 class_addmethod(c, (method)ui_mouseup,
"mouseup", A_CANT, 0);
73 class_addmethod(c, (method)ui_mousemove,
"mousemove", A_CANT, 0);
74 class_addmethod(c, (method)ui_mouseleave,
"mouseleave", A_CANT, 0);
75 class_addmethod(c, (method)ui_oksize,
"oksize", A_CANT, 0);
77 class_addmethod(c, (method)ui_edit_state,
"dblclick", A_CANT, 0);
78 class_addmethod(c, (method)ui_edclose,
"edclose", A_CANT, 0);
80 class_addmethod(c, (method)ui_modelParamExplorer_callback,
"return_modelParamExploration", A_CANT, 0);
81 class_addmethod(c, (method)ui_modelMessExplorer_callback,
"return_modelMessExploration", A_CANT, 0);
82 class_addmethod(c, (method)ui_modelRetExplorer_callback,
"return_modelRetExploration", A_CANT, 0);
84 class_addmethod(c, (method)ui_return_model_address,
"return_model_address", A_CANT, 0);
86 class_addmethod(c, (method)ui_return_model_init,
"return_model_init", A_CANT, 0);
88 class_addmethod(c, (method)ui_return_model_content,
"return_model_content", A_CANT, 0);
90 class_addmethod(c, (method)ui_return_mute,
"return_mute", A_CANT, 0);
91 class_addmethod(c, (method)ui_return_bypass,
"return_bypass", A_CANT, 0);
92 class_addmethod(c, (method)ui_return_mix,
"return_mix", A_CANT, 0);
93 class_addmethod(c, (method)ui_return_gain,
"return_gain", A_CANT, 0);
94 class_addmethod(c, (method)ui_return_freeze,
"return_freeze", A_CANT, 0);
95 class_addmethod(c, (method)ui_return_active,
"return_active", A_CANT, 0);
96 class_addmethod(c, (method)ui_return_preset_names,
"return_preset_names", A_CANT, 0);
98 CLASS_ATTR_DEFAULT(c,
"patching_rect", 0,
"0. 0. 300. 70.");
99 CLASS_ATTR_DEFAULT(c,
"fontname", 0, JAMOMA_DEFAULT_FONT);
100 CLASS_ATTR_DEFAULT(c,
"fontsize", 0,
"11");
102 CLASS_STICKY_ATTR(c,
"category", 0,
"Color");
104 CLASS_ATTR_RGBA(c,
"bgcolor", 0, t_ui, bgcolor);
105 CLASS_ATTR_DEFAULTNAME_SAVE_PAINT(c,
"bgcolor", 0,
"0.93 0.93 0.93 1.0");
106 CLASS_ATTR_STYLE(c,
"bgcolor", 0,
"rgba");
108 CLASS_ATTR_RGBA(c,
"bordercolor", 0, t_ui, bordercolor);
109 CLASS_ATTR_DEFAULTNAME_SAVE_PAINT(c,
"bordercolor", 0,
"0.6 0.6 0.6 1.0");
110 CLASS_ATTR_STYLE(c,
"bordercolor", 0,
"rgba");
112 CLASS_ATTR_RGBA(c,
"headercolor", 0, t_ui, headercolor);
113 CLASS_ATTR_DEFAULTNAME_SAVE_PAINT(c,
"headercolor", 0,
"0.82 0.82 0.82 1.0");
114 CLASS_ATTR_STYLE(c,
"headercolor", 0,
"rgba");
116 CLASS_ATTR_RGBA(c,
"textcolor", 0, t_ui, textcolor);
117 CLASS_ATTR_DEFAULTNAME_SAVE_PAINT(c,
"textcolor", 0,
"0. 0. 0. 1.0");
118 CLASS_ATTR_STYLE(c,
"textcolor", 0,
"rgba");
120 CLASS_ATTR_RGBA(c,
"highlightcolor", 0, t_ui, highlightcolor);
121 CLASS_ATTR_DEFAULTNAME_SAVE_PAINT(c,
"highlightcolor", 0,
"0. 0. 0. 1.0");
122 CLASS_ATTR_STYLE(c,
"highlightcolor", 0,
"rgba");
124 CLASS_STICKY_ATTR_CLEAR(c,
"category");
125 CLASS_STICKY_ATTR(c,
"category", 0,
"Jamoma");
127 CLASS_STICKY_ATTR_CLEAR(c,
"category");
129 class_register(CLASS_BOX, c);
134 t_ui* ui_new(t_symbol *s,
long argc, t_atom *argv)
137 t_dictionary *d = NULL;
141 if (!(d=object_dictionaryarg(argc, argv)))
144 x = (t_ui*)object_alloc(s_ui_class);
153 | JBOX_MOUSEDRAGDELTA
157 jbox_new(&x->box, flags, argc, argv);
158 x->box.b_firstin = (t_object *)x;
161 x->outlets = (TTHandle)sysmem_newptr(
sizeof(
TTPtr) * 1);
162 x->outlets[panel_out] = outlet_new(x, NULL);
166 x->menu_items = NULL;
167 x->refmenu_items = NULL;
168 x->hash_datas =
new TTHash();
169 x->hash_viewers =
new TTHash();
170 x->hash_receivers =
new TTHash();
171 x->preset_names = NULL;
176 x->menu_items = (t_linklist *)linklist_new();
177 x->menu_qelem = qelem_new(x, (method)ui_menu_qfn);
179 x->refmenu_items = (t_linklist *)linklist_new();
180 x->refmenu_qelem = qelem_new(x, (method)ui_refmenu_qfn);
182 x->viewAddress = kTTAdrsEmpty;
183 x->modelAddress = kTTAdrsEmpty;
184 x->patcherPtr = NULL;
185 x->patcherContext = kTTSymEmpty;
186 x->patcherClass = kTTSymEmpty;
187 x->patcherName = kTTSymEmpty;
189 x->highlight =
false;
192 x->has_preset =
false;
193 x->has_model =
false;
194 x->has_panel =
false;
197 x->has_bypass =
false;
199 x->has_active =
false;
200 x->has_freeze =
false;
202 x->highlight_mute =
false;
203 x->highlight_gain =
false;
204 x->highlight_bypass =
false;
205 x->highlight_mix =
false;
206 x->highlight_active =
false;
207 x->highlight_freeze =
false;
210 x->textEditor = NULL;
211 x->textHandler = NULL;
214 x->patcher_panel = NULL;
216 attr_dictionary_process(x, d);
221 defer_low((t_object*)x, (method)ui_register_info, NULL, 0, 0);
226 defer_low((t_object*)x, (method)ui_build, NULL, 0, 0);
231 defer_low((t_object*)x, (method)ui_view_panel_attach, NULL, 0, 0);
236 void ui_free(t_ui *x)
240 qelem_free(x->menu_qelem);
241 x->menu_qelem = NULL;
242 object_free(x->menu_items);
244 qelem_free(x->refmenu_qelem);
245 x->refmenu_qelem = NULL;
246 object_free(x->refmenu_items);
249 sysmem_freeptr(x->preset_names);
251 ui_receiver_destroy_all(x);
253 ui_unregister_info(x);
254 ui_viewer_destroy_all(x);
261 t_max_err ui_notify(t_ui *x, t_symbol *s, t_symbol *msg,
void *sender,
void *data)
266 if ((msg == _sym_attr_modified) && (sender == x)) {
267 attrname = (t_symbol *)object_method((t_object *)data, gensym(
"getname"));
268 textfield = jbox_get_textfield((t_object*) x);
270 textfield_set_textcolor(textfield, &x->textcolor);
272 if (attrname == gensym(
"address"))
273 object_method(textfield, gensym(
"settext"), x->modelAddress.c_str());
275 jbox_redraw(&x->box);
277 return jbox_notify((t_jbox*)x, s, msg, sender, data);
280 void ui_subscribe(t_ui *x, t_symbol *address)
288 if ((x->modelAddress == kTTAdrsEmpty && adrs != kTTAdrsEmpty) || adrs != x->modelAddress) {
290 x->modelAddress = adrs;
293 ui_viewer_destroy_all(x);
294 x->hash_viewers =
new TTHash();
296 x->has_preset =
false;
297 x->has_model =
false;
300 x->has_bypass =
false;
302 x->has_active =
false;
303 x->has_freeze =
false;
305 if (x->preset_names) {
306 sysmem_freeptr(x->preset_names);
307 x->preset_names = NULL;
310 if (x->hash_receivers->lookup(kTTSym_initialized, v))
313 ui_receiver_create(x, aReceiver, gensym(
"return_model_init"), kTTSym_initialized, x->modelAddress, NO, YES);
319 aReceiver.
set(kTTSym_address, x->modelAddress.appendAttribute(kTTSym_initialized));
323 if (!x->state.valid()) {
325 x->state.set(kTTSym_Flatten, YES);
329 if (!x->textHandler.valid()) {
330 x->textHandler =
TTObject(kTTSym_TextHandler);
331 x->textHandler.set(kTTSym_object, x->state);
335 x->state.set(kTTSym_address, x->modelAddress);
340 defer_low((t_object*)x, (method)ui_build, NULL, 0, 0);
343 void ui_build(t_ui *x)
346 t_symbol *hierarchy, *moduleHierarchy;
347 t_object *box, *textfield;
348 t_object *modulePatcher, *moduleBox;
357 box = object_attr_getobj(x->patcherPtr, gensym(
"box"));
358 object_attr_get_rect((t_object*)x, _sym_presentation_rect, &uiRect);
360 if (hierarchy == _sym_bpatcher) {
363 object_attr_get_rect(box, _sym_patching_rect, &boxRect);
364 boxRect.width = uiRect.width;
365 boxRect.height = uiRect.height;
366 object_attr_set_rect(box, _sym_patching_rect, &boxRect);
367 object_attr_get_rect(box, _sym_presentation_rect, &boxRect);
368 boxRect.width = uiRect.width;
369 boxRect.height = uiRect.height;
370 object_attr_set_rect(box, _sym_presentation_rect, &boxRect);
376 moduleBox = object_attr_getobj(modulePatcher, gensym(
"box"));
378 if (moduleHierarchy == _sym_bpatcher) {
384 object_attr_get_rect(moduleBox, _sym_patching_rect, &boxRect);
385 boxRect.width = uiRect.width;
386 boxRect.height = uiRect.height;
387 object_attr_set_rect(moduleBox, _sym_patching_rect, &boxRect);
388 object_attr_get_rect(moduleBox, _sym_presentation_rect, &boxRect);
389 boxRect.width = uiRect.width;
390 boxRect.height = uiRect.height;
391 object_attr_set_rect(moduleBox, _sym_presentation_rect, &boxRect);
395 else if (hierarchy == _sym_subpatcher) {
396 object_attr_get_rect(x->patcherPtr, _sym_defrect, &boxRect);
397 boxRect.width = uiRect.width;
398 boxRect.height = uiRect.height;
399 object_attr_set_rect(x->patcherPtr, _sym_defrect, &boxRect);
400 object_attr_setchar(x->patcherPtr, _sym_toolbarvisible, 0);
401 object_method_parse(x->patcherPtr, _sym_window,
"flags nogrow", NULL);
402 object_method_parse(x->patcherPtr, _sym_window,
"flags nozoom", NULL);
403 object_method_parse(x->patcherPtr, _sym_window,
"exec", NULL);
406 if (x->patcherClass != kTTSymEmpty)
407 object_attr_setsym(x->patcherPtr, _sym_title, gensym((
char*)x->patcherClass.c_str()));
409 object_attr_setsym(x->patcherPtr, _sym_title, gensym(
"No class"));
411 object_attr_setchar(x->patcherPtr, _sym_enablehscroll, 0);
412 object_attr_setchar(x->patcherPtr, _sym_enablevscroll, 0);
416 textfield = jbox_get_textfield((t_object*) x);
418 ui_paint_address(x, textfield);
421 jbox_redraw(&x->box);
424 t_object *ui_get_model_object(t_ui *x)
428 t_object *modelObject = NULL;
429 t_symbol *_sym_jclass, *_sym_jmodel = gensym(
"j.model");
437 obj = object_attr_getobj((t_object*)patcherNode->
getContext(), _sym_firstobject);
441 _sym_jclass = object_attr_getsym(obj, _sym_maxclass);
442 if (_sym_jclass == _sym_jmodel) {
444 modelObject = object_attr_getobj(obj, _sym_object);
447 obj = object_attr_getobj(obj, _sym_nextobject);
456 #pragma mark drawing and appearance
458 void ui_paint(t_ui *x, t_object *view)
464 double border_thickness = 0.5;
465 double cornersize = 12.0;
471 g = (t_jgraphics*) patcherview_get_jgraphics(view);
472 jbox_get_rect_for_view((t_object*) &x->box, view, &rect);
475 if (x->uiInfo.valid()) {
476 x->uiInfo.get(
"highlight", v);
480 if (highlight == kTTSym_none) {
481 headercolor = x->headercolor;
482 bgcolor = x->bgcolor;
483 bordercolor = x->bordercolor;
486 headercolor.red = 0.8*x->headercolor.red + 0.2*x->highlightcolor.red;
487 headercolor.green = 0.8*x->headercolor.green + 0.2*x->highlightcolor.green;
488 headercolor.blue = 0.8*x->headercolor.blue + 0.2*x->highlightcolor.blue;
489 headercolor.alpha = x->headercolor.alpha;
491 bgcolor.red = 0.8*x->bgcolor.red + 0.2*x->highlightcolor.red;
492 bgcolor.green = 0.8*x->bgcolor.green + 0.2*x->highlightcolor.green;
493 bgcolor.blue = 0.8*x->bgcolor.blue + 0.2*x->highlightcolor.blue;
494 bgcolor.alpha = x->bgcolor.alpha;
496 bordercolor.red = 0.8*x->bordercolor.red + 0.2*x->highlightcolor.red;
497 bordercolor.green = 0.8*x->bordercolor.green + 0.2*x->highlightcolor.green;
498 bordercolor.blue = 0.8*x->bordercolor.blue + 0.2*x->highlightcolor.blue;
499 bordercolor.alpha = x->bordercolor.alpha;
503 jgraphics_rectangle_rounded(g, border_thickness,
505 rect.width - ((border_thickness) * 2.0),
506 rect.height - ((border_thickness) * 2.0),
507 cornersize, cornersize);
508 jgraphics_set_source_jrgba(g, &bgcolor);
512 jgraphics_rectangle_rounded(g, border_thickness,
514 rect.width - (border_thickness * 2.0 + 1.0),
516 cornersize, cornersize);
517 jgraphics_set_source_jrgba(g, &headercolor);
520 jgraphics_rectangle_fill_fast(g, border_thickness,
522 rect.width - (border_thickness * 2.0 + 1.0),
526 jgraphics_rectangle_rounded(g, border_thickness,
528 rect.width - (border_thickness * 2.0),
529 rect.height - (border_thickness * 2.0),
530 cornersize, cornersize);
531 jgraphics_set_source_jrgba(g, &bordercolor);
532 jgraphics_set_line_width(g, 1.0);
535 jgraphics_set_line_width(g, 1.0);
536 jgraphics_move_to(g, border_thickness, 19.5);
537 jgraphics_line_to(g, rect.width - (border_thickness * 1.0), 19.5);
541 jgraphics_set_line_width(g, 1.5);
542 jgraphics_arc(g, 9.5, 9.5, 6.5, 0., JGRAPHICS_2PI);
545 jgraphics_set_source_jrgba(g, &s_color_border_button);
546 jgraphics_arc(g, 9.5, 9.5, 6.5, 0., JGRAPHICS_2PI);
550 jgraphics_move_to(g, 9.5, middle + 4.0);
551 jgraphics_line_to(g, 13.5, middle);
552 jgraphics_line_to(g, 5.5, middle);
553 jgraphics_close_path(g);
558 long right_side = rect.width - 16.0;
559 float gain = x->gain;
560 TTLimit(gain, 0.0f, 127.0f);
575 jgraphics_set_source_jrgba(g, &s_color_background_button);
577 x->rect_gain.x = right_side;
578 x->rect_gain.width = 13.0;
580 jgraphics_set_line_width(g, 1.5);
581 jgraphics_arc(g, right_side+6.5, 9.5, 6.5, 0., JGRAPHICS_2PI);
584 if (x->highlight && x->highlight_gain)
585 jgraphics_set_source_jrgba(g, &s_color_selected);
587 jgraphics_set_source_jrgba(g, &s_color_border_button);
588 jgraphics_arc(g, right_side+6.5, 9.5, 6.5, 0., JGRAPHICS_2PI);
591 jgraphics_set_source_jrgba(g, &s_color_darkgreen);
593 jgraphics_arc(g, right_side+6.5, 3.0+6.5, 6.5, PI / 2, ((gain / 127.0) * TWOPI) + (PI/2));
594 jgraphics_line_to(g, right_side+6.5, 3.0+6.5);
595 jgraphics_close_path(g);
598 jgraphics_set_source_jrgba(g, &s_color_green_ring);
599 jgraphics_arc(g, right_side+6.5, 3.0+6.5, 6.5, PI / 2, ((gain / 127.0) * TWOPI) + (PI/2));
600 jgraphics_line_to(g, right_side+6.5, 3.0+6.5);
603 jgraphics_arc(g, right_side+6.5, 3.0+6.5, 1.5, 0, TWOPI);
609 long right_side = rect.width - 16.0;
611 TTLimit(mix, 0.0f, 100.0f);
624 jgraphics_set_source_jrgba(g, &s_color_background_button);
626 x->rect_mix.x = right_side;
627 x->rect_mix.width = 13.0;
629 jgraphics_set_line_width(g, 1.5);
630 jgraphics_arc(g, right_side+6.5, 9.5, 6.5, 0., JGRAPHICS_2PI);
633 if (x->highlight && x->highlight_mix)
634 jgraphics_set_source_jrgba(g, &s_color_selected);
636 jgraphics_set_source_jrgba(g, &s_color_border_button);
637 jgraphics_arc(g, right_side+6.5, 9.5, 6.5, 0., JGRAPHICS_2PI);
640 jgraphics_set_source_jrgba(g, &s_color_darkblue);
642 jgraphics_arc(g, right_side+6.5, 3.0+6.5, 6.5, PI / 2, ((mix / 100.0) * TWOPI) + (PI/2));
643 jgraphics_line_to(g, right_side+6.5, 3.0+6.5);
644 jgraphics_close_path(g);
647 jgraphics_set_source_jrgba(g, &s_color_blue_ring);
648 jgraphics_arc(g, right_side+6.5, 3.0+6.5, 6.5, PI / 2, ((mix / 100.0) * TWOPI) + (PI/2));
649 jgraphics_line_to(g, right_side+6.5, 3.0+6.5);
652 jgraphics_arc(g, right_side+6.5, 3.0+6.5, 1.5, 0, TWOPI);
658 long right_side = rect.width - 16.0;
670 jgraphics_set_source_jrgba(g, &s_color_red_button);
672 jgraphics_set_source_jrgba(g, &s_color_background_button);
674 x->rect_mute.x = right_side;
675 x->rect_mute.width = 13.0;
677 jgraphics_set_line_width(g, 1.5);
678 jgraphics_arc(g, right_side+6.5, 9.5, 6.5, 0., JGRAPHICS_2PI);
681 if (x->highlight && x->highlight_mute)
682 jgraphics_set_source_jrgba(g, &s_color_selected);
684 jgraphics_set_source_jrgba(g, &s_color_border_button);
685 jgraphics_arc(g, right_side+6.5, 9.5, 6.5, 0., JGRAPHICS_2PI);
690 jgraphics_set_source_jrgba(g, &s_color_text_button_on);
692 jgraphics_set_source_jrgba(g, &s_color_text_button_off);
694 jgraphics_set_line_width(g, 2.0);
695 jgraphics_move_to(g, right_side + 2.5, 13.0);
696 jgraphics_select_font_face(g, JAMOMA_BUTTON_FONT, JGRAPHICS_FONT_SLANT_NORMAL, JGRAPHICS_FONT_WEIGHT_BOLD);
697 jgraphics_set_font_size(g, 7.0);
698 jgraphics_show_text(g,
"m");
703 long right_side = rect.width - 16.0;
713 jgraphics_set_source_jrgba(g, &s_color_blue_button);
715 jgraphics_set_source_jrgba(g, &s_color_background_button);
717 x->rect_bypass.x = right_side;
718 x->rect_bypass.width = 13.0;
720 jgraphics_set_line_width(g, 1.5);
721 jgraphics_arc(g, right_side+6.5, 9.5, 6.5, 0., JGRAPHICS_2PI);
724 if (x->highlight && x->highlight_bypass)
725 jgraphics_set_source_jrgba(g, &s_color_selected);
727 jgraphics_set_source_jrgba(g, &s_color_border_button);
728 jgraphics_arc(g, right_side+6.5, 9.5, 6.5, 0., JGRAPHICS_2PI);
733 jgraphics_set_source_jrgba(g, &s_color_text_button_on);
735 jgraphics_set_source_jrgba(g, &s_color_text_button_off);
736 jgraphics_set_line_width(g, 2.0);
737 jgraphics_move_to(g, right_side + 4.0, 13.0);
738 jgraphics_select_font_face(g, JAMOMA_BUTTON_FONT, JGRAPHICS_FONT_SLANT_NORMAL, JGRAPHICS_FONT_WEIGHT_BOLD);
739 jgraphics_set_font_size(g, 7.0);
740 jgraphics_show_text(g,
"b");
745 long right_side = rect.width - 16.0;
753 jgraphics_set_source_jrgba(g, &s_color_orange_button);
755 jgraphics_set_source_jrgba(g, &s_color_background_button);
757 x->rect_freeze.x = right_side;
758 x->rect_freeze.width = 13.0;
760 jgraphics_set_line_width(g, 1.5);
761 jgraphics_arc(g, right_side+6.5, 9.5, 6.5, 0., JGRAPHICS_2PI);
764 if (x->highlight && x->highlight_freeze)
765 jgraphics_set_source_jrgba(g, &s_color_selected);
767 jgraphics_set_source_jrgba(g, &s_color_border_button);
768 jgraphics_arc(g, right_side+6.5, 9.5, 6.5, 0., JGRAPHICS_2PI);
773 jgraphics_set_source_jrgba(g, &s_color_text_button_on);
775 jgraphics_set_source_jrgba(g, &s_color_text_button_off);
776 jgraphics_set_line_width(g, 2.0);
777 jgraphics_move_to(g, right_side + 5.0, 13.0);
778 jgraphics_select_font_face(g, JAMOMA_BUTTON_FONT, JGRAPHICS_FONT_SLANT_NORMAL, JGRAPHICS_FONT_WEIGHT_BOLD);
779 jgraphics_set_font_size(g, 7.0);
780 jgraphics_show_text(g,
"f");
785 long right_side = rect.width - 16.0;
791 jgraphics_set_source_jrgba(g, &s_color_green_button);
793 jgraphics_set_source_jrgba(g, &s_color_background_button);
795 x->rect_active.x = right_side;
796 x->rect_active.width = 13.0;
798 jgraphics_set_line_width(g, 1.5);
799 jgraphics_arc(g, right_side+6.5, 9.5, 6.5, 0., JGRAPHICS_2PI);
802 if (x->highlight && x->highlight_active)
803 jgraphics_set_source_jrgba(g, &s_color_selected);
805 jgraphics_set_source_jrgba(g, &s_color_border_button);
806 jgraphics_arc(g, right_side+6.5, 9.5, 6.5, 0., JGRAPHICS_2PI);
811 jgraphics_set_source_jrgba(g, &s_color_text_button_on);
813 jgraphics_set_source_jrgba(g, &s_color_text_button_off);
814 jgraphics_set_line_width(g, 2.0);
815 jgraphics_move_to(g, right_side + 4.0, 12.0);
816 jgraphics_select_font_face(g, JAMOMA_BUTTON_FONT, JGRAPHICS_FONT_SLANT_NORMAL, JGRAPHICS_FONT_WEIGHT_BOLD);
817 jgraphics_set_font_size(g, 7.0);
818 jgraphics_show_text(g,
"a");
823 long right_side = rect.width - 16.0;
825 x->rect_panel.x = right_side;
826 x->rect_panel.width = 13.0;
828 jgraphics_set_source_jrgba(g, &s_color_background_button);
829 jgraphics_set_line_width(g, 1.5);
830 jgraphics_arc(g, right_side+6.5, 9.5, 6.5, 0., JGRAPHICS_2PI);
833 jgraphics_set_source_jrgba(g, &s_color_border_button);
834 jgraphics_arc(g, right_side+6.5, 9.5, 6.5, 0., JGRAPHICS_2PI);
838 jgraphics_set_source_jrgba(g, &s_color_text_button_off);
839 jgraphics_set_line_width(g, 2.0);
840 jgraphics_move_to(g, right_side + 2.0, 13.0);
841 jgraphics_select_font_face(g, JAMOMA_BUTTON_FONT, JGRAPHICS_FONT_SLANT_NORMAL, JGRAPHICS_FONT_WEIGHT_BOLD);
842 jgraphics_set_font_size(g, 10.0);
843 jgraphics_show_text(g,
"+");
847 void ui_paint_address(t_ui *x, t_object *textfield)
850 if (x->modelAddress == kTTAdrsEmpty) {
852 object_method(textfield, gensym(
"settext"), NO_MODEL_STRING);
859 object_attr_get_rect((t_object*)x, _sym_presentation_rect, &uiRect);
860 textfield_get_textmargins(textfield, &r, &t, &l, &b);
862 TTUInt32 maxLetter = (uiRect.width - l - r) / 6;
864 if (strlen(x->modelAddress.c_str()) >= maxLetter) {
867 TTString modelAddress = x->modelAddress.string();
868 TTStringIter begin = modelAddress.begin();
869 TTStringIter end = modelAddress.end();
871 croppedAddress =
TTString(begin, begin+(maxLetter/2)-1);
872 croppedAddress +=
"..";
873 croppedAddress +=
TTString(end-(maxLetter/2)+1, end);
874 object_method(textfield, gensym(
"settext"), croppedAddress.
c_str());
877 object_method(textfield, gensym(
"settext"), x->modelAddress.c_str());
882 void ui_mousedown(t_ui *x, t_object *patcherview, t_pt px,
long modifiers)
890 jbox_set_mousedragdelta((t_object *)x, 0);
892 jbox_get_rect_for_view((t_object *)x, patcherview, &rect);
898 if (modifiers & eShiftKey) {
902 objclass = object_attr_getsym(obj, _sym_maxclass);
903 if (objclass == gensym(
"j.remote")) {
909 object_method(object_attr_getobj(obj, _sym_object), gensym(
"mousedown"), patcherview, px.x, px.y, modifiers);
912 obj = object_attr_getobj(obj, _sym_nextobject);
916 ui_mousemove(x, patcherview, px, modifiers);
922 if (px.x > 18 && px.y < 20.0) {
924 if (x->has_gain && px.x >= x->rect_gain.x && px.x <= (x->rect_gain.x + x->rect_gain.width)) {
926 x->highlight_gain = !x->highlight_gain;
927 ui_viewer_highlight(x,
TTSymbol(
"audio/gain"), x->highlight_gain);
930 x->gainDragging =
true;
931 x->anchor.x = x->anchor.y = 0.0;
932 x->anchorValue = x->gain;
933 jbox_set_mousedragdelta((t_object *)x, 1);
936 else if (x->has_mix && px.x >= x->rect_mix.x && px.x <= (x->rect_mix.x + x->rect_mix.width)) {
938 x->highlight_mix = !x->highlight_mix;
939 ui_viewer_highlight(x,
TTSymbol(
"audio/mix"), x->highlight_mix);
942 x->mixDragging =
true;
943 x->anchor.x = x->anchor.y = 0.0;
944 x->anchorValue = x->mix;
945 jbox_set_mousedragdelta((t_object *)x, 1);
948 else if (x->has_panel && px.x >= x->rect_panel.x && px.x <= (x->rect_panel.x + x->rect_panel.width))
949 x->uiInfo.send(
"Panel");
951 else if (x->has_active && px.x >= x->rect_active.x && px.x <= (x->rect_active.x + x->rect_active.width)) {
953 x->highlight_active = !x->highlight_active;
954 ui_viewer_highlight(x,
TTSymbol(
"data/active"), x->highlight_active);
959 else if (x->has_freeze && px.x >= x->rect_freeze.x && px.x <= (x->rect_freeze.x + x->rect_freeze.width)) {
961 x->highlight_freeze = !x->highlight_freeze;
962 ui_viewer_highlight(x,
TTSymbol(
"data/freeze"), x->highlight_freeze);
967 else if (x->has_bypass && px.x >= x->rect_bypass.x && px.x <= (x->rect_bypass.x + x->rect_bypass.width)) {
969 x->highlight_bypass = !x->highlight_bypass;
970 ui_viewer_highlight(x,
TTSymbol(
"*.*/bypass"), x->highlight_bypass);
975 else if (x->has_mute && px.x >= x->rect_mute.x && px.x <= (x->rect_mute.x + x->rect_mute.width)) {
977 x->highlight_mute = !x->highlight_mute;
978 ui_viewer_highlight(x,
TTSymbol(
"*.*/mute"), x->highlight_mute);
985 ui_refmenu_do(x, patcherview, px, modifiers);
988 ui_menu_do(x, patcherview, px, modifiers);
992 void ui_mousedragdelta(t_ui *x, t_object *patcherview, t_pt pt,
long modifiers)
994 t_object* textfield = jbox_get_textfield((t_object*) x);
999 jbox_get_rect_for_view((t_object *)x, patcherview, &rect);
1001 if (modifiers & eShiftKey)
1005 textfield_set_textcolor(textfield, &x->textcolor);
1007 if (x->mixDragging) {
1008 x->anchorValue = x->anchorValue - (pt.y * factor);
1009 TTLimit(x->anchorValue, 0.0f, 100.0f);
1012 snprintf(str,
sizeof(str),
"%f", x->mix);
1013 object_method(textfield, gensym(
"settext"), str);
1015 else if (x->gainDragging) {
1016 x->anchorValue = x->anchorValue - (pt.y * factor);
1017 TTLimit(x->anchorValue, 0.0f, 127.0f);
1020 snprintf(str,
sizeof(str),
"%f", x->gain);
1021 object_method(textfield, gensym(
"settext"), str);
1025 void ui_mouseup(t_ui *x, t_object *patcherview)
1027 x->mixDragging =
false;
1028 x->gainDragging =
false;
1031 t_object *textfield = jbox_get_textfield((t_object*) x);
1033 ui_paint_address(x, textfield);
1035 jbox_redraw(&x->box);
1038 void ui_mousemove(t_ui *x, t_object *patcherview, t_pt pt,
long modifiers)
1041 t_object *obj = object_attr_getobj(
jamoma_patcher_get((t_object*)x), _sym_firstobject);
1047 if (modifiers & eShiftKey) {
1049 x->highlight =
true;
1054 x->uiInfo.set(
"highlight",
TTSymbol(
"jamoma"));
1059 x->highlight =
false;
1063 x->uiInfo.set(
"highlight", kTTSym_none);
1068 objclass = object_attr_getsym(obj, _sym_maxclass);
1069 if (objclass == gensym(
"j.remote")) {
1075 object_method(object_attr_getobj(obj, _sym_object), gensym(
"mousemove"), patcherview, pt.x, pt.y, modifiers);
1078 obj = object_attr_getobj(obj, _sym_nextobject);
1082 void ui_mouseleave(t_ui *x, t_object *patcherview, t_pt pt,
long modifiers)
1085 t_object *obj = object_attr_getobj(
jamoma_patcher_get((t_object*)x), _sym_firstobject);
1091 if ( pt.x <= x->box.b_presentation_rect.x || pt.x >= (x->box.b_presentation_rect.x + x->box.b_presentation_rect.width)
1092 || pt.y <= x->box.b_presentation_rect.y || pt.y >= (x->box.b_presentation_rect.y + x->box.b_presentation_rect.height)) {
1094 x->highlight =
false;
1097 if (x->uiInfo.valid())
1098 x->uiInfo.set(
"highlight", kTTSym_none);
1102 objclass = object_attr_getsym(obj, _sym_maxclass);
1103 if (objclass == gensym(
"j.remote")) {
1109 object_method(object_attr_getobj(obj, _sym_object), gensym(
"mouseleave"), patcherview, pt.x, pt.y, modifiers*x->hover);
1112 obj = object_attr_getobj(obj, _sym_nextobject);
1119 void ui_menu_do(t_ui *x, t_object *patcherview, t_pt px,
long modifiers)
1126 int coord_x=0, coord_y=0;
1131 jbox_set_mousedragdelta((t_object *)x, 0);
1132 p = jpopupmenu_create();
1134 font = jfont_create(JAMOMA_MENU_FONT,
1135 JGRAPHICS_FONT_SLANT_NORMAL,
1136 JGRAPHICS_FONT_WEIGHT_NORMAL,
1137 JAMOMA_MENU_FONTSIZE);
1138 jpopupmenu_setfont(p, font);
1139 jfont_destroy(font);
1140 size = linklist_getsize(x->menu_items);
1141 for (i=0; i<size; i++) {
1142 item = (t_symobject *)linklist_getindex(x->menu_items, i);
1143 if (!item->sym || (item->sym->s_name[0] ==
'\0') || item->sym->s_name[0] ==
'-')
1144 jpopupmenu_addseperator(p);
1146 if (item->sym == gensym(
"Defeat Signal Meters")) {
1147 if (x->is_metersdefeated)
1148 jpopupmenu_additem(p, i+1, item->sym->s_name, NULL, 1, 0, NULL);
1150 jpopupmenu_additem(p, i+1, item->sym->s_name, NULL, 0, item->flags, NULL);
1152 else if (item->sym == gensym(
"Disable UI Updates")) {
1154 jpopupmenu_additem(p, i+1, item->sym->s_name, NULL, 1, 0, NULL);
1156 jpopupmenu_additem(p, i+1, item->sym->s_name, NULL, 0, item->flags, NULL);
1159 jpopupmenu_additem(p, i+1, item->sym->s_name, NULL, 0, item->flags, NULL);
1163 object_method(patcherview, gensym(
"canvastoscreen"), 0.0, 0.0, &coord_x, &coord_y);
1164 coord_x += x->box.b_presentation_rect.x;
1165 coord_y += x->box.b_presentation_rect.y;
1168 selectedId = jpopupmenu_popup(p, pt, x->menu_selection+1);
1170 x->menu_selection = selectedId -1;
1171 qelem_set(x->menu_qelem);
1173 jpopupmenu_destroy(p);
1176 void ui_menu_qfn(t_ui *x)
1178 t_symobject *item = (t_symobject *)linklist_getindex(x->menu_items, x->menu_selection);
1182 t_object *modelObject = ui_get_model_object(x);
1186 if (item->sym == gensym(
"Open Model Reference Page"))
1187 object_method(modelObject, _sym_anything, gensym(
"model:reference/open"), 0, NULL);
1189 else if (item->sym == gensym(
"Open Model Help Patch"))
1190 object_method(modelObject, _sym_anything, gensym(
"model:help/open"), 0, NULL);
1192 else if (item->sym == gensym(
"Open Model Internal"))
1193 object_method(modelObject, _sym_anything, gensym(
"model:internal/open"), 0, NULL);
1195 else if (item->sym == gensym(
"Edit Current State"))
1198 else if (item->sym == gensym(
"Load Presets File"))
1199 object_method(modelObject, gensym(
"preset:read"), 0, NULL);
1201 else if (item->sym == gensym(
"Save Presets File"))
1202 object_method(modelObject, gensym(
"preset:write/again"), 0, NULL);
1204 else if (item->sym == gensym(
"Save Presets File As"))
1205 object_method(modelObject, gensym(
"preset:write"), 0, NULL);
1207 else if (item->sym == gensym(
"Edit Presets File"))
1208 object_method(modelObject, gensym(
"preset:edit"), 0, NULL);
1210 else if (item->sym == gensym(
"Create New Preset")) {
1216 strcpy(buf,
"Château de Preset");
1218 result = jdialog_showtext(
"Provide a name for this Preset", buf, 0, &text);
1222 atom_setsym(&a, gensym(text));
1223 object_method(modelObject, _sym_anything, gensym(
"preset:new"), 1, &a);
1226 else if (item->sym == gensym(
"Update Current Preset"))
1227 object_method(modelObject, _sym_anything, gensym(
"preset:update"), 0, NULL);
1229 else if (item->sym == gensym(
"Delete Current Preset"))
1230 object_method(modelObject, _sym_anything, gensym(
"preset:delete"), 0, NULL);
1232 else if (item->sym == gensym(
"Open Preset Interface"))
1233 ui_preset_interface(x);
1237 atom_setsym(&a, item->sym);
1238 object_method(modelObject, _sym_anything, gensym(
"preset:recall"), 1, &a);
1242 void ui_menu_build(t_ui *x)
1244 t_symobject* item = NULL;
1250 linklist_clear(x->menu_items);
1255 item = (t_symobject *)symobject_new(gensym(
"Open Model Reference Page"));
1256 linklist_append(x->menu_items, item);
1257 item = (t_symobject *)symobject_new(gensym(
"Open Model Help Patch"));
1258 linklist_append(x->menu_items, item);
1259 item = (t_symobject *)symobject_new(gensym(
"Open Model Internal"));
1260 linklist_append(x->menu_items, item);
1261 item = (t_symobject *)symobject_new(gensym(
"Edit Current State"));
1262 linklist_append(x->menu_items, item);
1266 if (x->has_preset) {
1268 item = (t_symobject *)symobject_new(gensym(
"-"));
1269 linklist_append(x->menu_items, item);
1271 item = (t_symobject *)symobject_new(gensym(
"Load Presets File"));
1272 linklist_append(x->menu_items, item);
1273 item = (t_symobject *)symobject_new(gensym(
"Save Presets File"));
1274 linklist_append(x->menu_items, item);
1275 item = (t_symobject *)symobject_new(gensym(
"Save Presets File As"));
1276 linklist_append(x->menu_items, item);
1277 item = (t_symobject *)symobject_new(gensym(
"Edit Presets File"));
1278 linklist_append(x->menu_items, item);
1279 item = (t_symobject *)symobject_new(gensym(
"Create New Preset"));
1280 linklist_append(x->menu_items, item);
1281 item = (t_symobject *)symobject_new(gensym(
"Update Current Preset"));
1282 linklist_append(x->menu_items, item);
1283 item = (t_symobject *)symobject_new(gensym(
"Delete Current Preset"));
1284 linklist_append(x->menu_items, item);
1285 item = (t_symobject *)symobject_new(gensym(
"Open Preset Interface"));
1289 if (x->preset_names) {
1291 item = (t_symobject *)symobject_new(gensym(
"-"));
1292 linklist_append(x->menu_items, item);
1294 for (i=0; i<x->preset_num; i++) {
1295 item = (t_symobject *)symobject_new(atom_getsym(&x->preset_names[i]));
1296 linklist_append(x->menu_items, item);
1301 void ui_refmenu_do(t_ui *x, t_object *patcherview, t_pt px,
long modifiers)
1308 int coord_x=0, coord_y=0;
1311 ui_refmenu_build(x);
1313 jbox_set_mousedragdelta((t_object *)x, 0);
1314 p = jpopupmenu_create();
1316 font = jfont_create(JAMOMA_MENU_FONT,
1317 JGRAPHICS_FONT_SLANT_NORMAL,
1318 JGRAPHICS_FONT_WEIGHT_NORMAL,
1319 JAMOMA_MENU_FONTSIZE);
1320 jpopupmenu_setfont(p, font);
1321 jfont_destroy(font);
1322 size = linklist_getsize(x->refmenu_items);
1323 for (i=0; i<size; i++) {
1324 item = (t_symobject *)linklist_getindex(x->refmenu_items, i);
1325 if (!item->sym || (item->sym->s_name[0] ==
'\0') || item->sym->s_name[0] ==
'-')
1326 jpopupmenu_addseperator(p);
1329 jpopupmenu_additem(p, i+1, item->sym->s_name, NULL, 0, item->flags, NULL);
1338 object_method(patcherview, gensym(
"canvastoscreen"), 0.0, 0.0, &coord_x, &coord_y);
1339 coord_x += x->box.b_presentation_rect.x;
1340 coord_y += x->box.b_presentation_rect.y;
1341 pt.x = coord_x + 20.0;
1344 selectedId = jpopupmenu_popup(p, pt, x->refmenu_selection+1);
1346 x->refmenu_selection = selectedId -1;
1347 qelem_set(x->refmenu_qelem);
1349 jpopupmenu_destroy(p);
1352 void ui_refmenu_qfn(t_ui *x)
1354 t_symobject *item = (t_symobject *)linklist_getindex(x->refmenu_items, x->refmenu_selection);
1356 ui_data_interface(x,
TTSymbol(item->sym->s_name));
1359 void ui_refmenu_build(t_ui *x)
1361 t_symobject *item = NULL;
1365 if (!x->refmenu_items)
1369 linklist_clear(x->refmenu_items);
1372 if (x->modelAddress != kTTSymEmpty)
1373 snprintf(tempStr, 512,
"Model: %s", x->modelAddress.c_str());
1375 strncpy_zero(tempStr,
"Model: ?", 512);
1377 item = (t_symobject *)symobject_new(gensym(tempStr));
1378 linklist_append(x->refmenu_items, item);
1382 item = (t_symobject *)symobject_new(gensym(
"-"));
1383 linklist_append(x->refmenu_items, item);
1384 item = (t_symobject *)symobject_new(gensym(
"User-Defined Parameters"));
1385 linklist_append(x->refmenu_items, item);
1388 ui_explorer_create((t_object*)x, x->modelParamExplorer, gensym(
"return_modelParamExploration"));
1390 filters =
TTValue(kTTSym_parameter);
1392 x->modelParamExplorer.set(
"filterList", filters);
1394 x->modelParamExplorer.set(kTTSym_address, x->modelAddress);
1395 x->modelParamExplorer.send(
"Explore");
1398 item = (t_symobject *)symobject_new(gensym(
"-"));
1399 linklist_append(x->refmenu_items, item);
1400 item = (t_symobject *)symobject_new(gensym(
"User-Defined Messages"));
1401 linklist_append(x->refmenu_items, item);
1404 ui_explorer_create((t_object*)x, x->modelMessExplorer, gensym(
"return_modelMessExploration"));
1406 filters =
TTValue(kTTSym_message);
1408 x->modelMessExplorer.set(
"filterList", filters);
1410 x->modelMessExplorer.set(kTTSym_address, x->modelAddress);
1411 x->modelMessExplorer.send(
"Explore");
1414 item = (t_symobject *)symobject_new(gensym(
"-"));
1415 linklist_append(x->refmenu_items, item);
1416 item = (t_symobject *)symobject_new(gensym(
"User-Defined Returns"));
1417 linklist_append(x->refmenu_items, item);
1420 ui_explorer_create((t_object*)x, x->modelRetExplorer, gensym(
"return_modelRetExploration"));
1422 filters =
TTValue(kTTSym_return);
1424 x->modelRetExplorer.set(
"filterList", filters);
1426 x->modelRetExplorer.set(kTTSym_address, x->modelAddress);
1427 x->modelRetExplorer.send(
"Explore");
1430 item = (t_symobject *)symobject_new(gensym(
"-"));
1431 linklist_append(x->refmenu_items, item);
1432 item = (t_symobject *)symobject_new(gensym(
"Generic Parameters"));
1433 linklist_append(x->refmenu_items, item);
1436 filters =
TTValue(kTTSym_parameter);
1438 x->modelParamExplorer.set(
"filterList", filters);
1440 x->modelParamExplorer.set(kTTSym_address, x->modelAddress);
1441 x->modelParamExplorer.send(
"Explore");
1444 item = (t_symobject *)symobject_new(gensym(
"-"));
1445 linklist_append(x->refmenu_items, item);
1446 item = (t_symobject *)symobject_new(gensym(
"Generic Messages"));
1447 linklist_append(x->refmenu_items, item);
1450 filters =
TTValue(kTTSym_message);
1452 x->modelMessExplorer.set(
"filterList", filters);
1454 x->modelMessExplorer.set(kTTSym_address, x->modelAddress);
1455 x->modelMessExplorer.send(
"Explore");
1458 item = (t_symobject *)symobject_new(gensym(
"-"));
1459 linklist_append(x->refmenu_items, item);
1460 item = (t_symobject *)symobject_new(gensym(
"Generic Returns"));
1461 linklist_append(x->refmenu_items, item);
1464 filters =
TTValue(kTTSym_return);
1466 x->modelRetExplorer.set(
"filterList", filters);
1468 x->modelRetExplorer.set(kTTSym_address, x->modelAddress);
1469 x->modelRetExplorer.send(
"Explore");
1471 x->modelParamExplorer =
TTObject();
1476 void* ui_oksize(t_ui *x, t_rect *rect)
1478 long unitHeight = 0;
1480 double unitFrac= 0.0;
1481 t_object *textfield = NULL;
1483 unitHeight = rect->height / JAMOMA_UNIT_HEIGHT;
1484 unitFrac = rect->height - (unitHeight * JAMOMA_UNIT_HEIGHT);
1485 if (unitFrac > (JAMOMA_UNIT_HEIGHT/2))
1489 rect->height = unitHeight * JAMOMA_UNIT_HEIGHT;
1491 unitWidth = rect->width / JAMOMA_UNIT_WIDTH;
1492 unitFrac = rect->width - (unitWidth * JAMOMA_UNIT_WIDTH);
1493 if (unitFrac > (JAMOMA_UNIT_WIDTH/2))
1497 rect->width = unitWidth * JAMOMA_UNIT_WIDTH;
1500 textfield = jbox_get_textfield((t_object*) x);
1501 textfield_set_noactivate(textfield, 1);
1502 textfield_set_readonly(textfield, 1);
1503 textfield_set_editonclick(textfield, 0);
1504 textfield_set_wordwrap(textfield, 0);
1505 textfield_set_useellipsis(textfield, 0);
1506 textfield_set_textcolor(textfield, &x->textcolor);
1507 textfield_set_textmargins(textfield, 20.0, 2.0, 60.0, rect->height - 19.0);
1512 void ui_edit_state(t_ui *x)
1515 char title[MAX_FILENAME_CHARS];
1520 if (!x->textEditor) {
1522 x->textEditor = (t_object*)object_new(_sym_nobox, _sym_jed, x, 0);
1526 x->state.send(
"Store");
1529 x->textHandler.send(kTTSym_Write, (
TTPtr)buffer, none);
1533 object_method(x->textEditor, _sym_settext, buffer->c_str(), _sym_utf_8);
1534 object_attr_setchar(x->textEditor, gensym(
"scratch"), 1);
1536 snprintf(title, MAX_FILENAME_CHARS,
"%s state editor", x->patcherClass.c_str());
1537 object_attr_setsym(x->textEditor, _sym_title, gensym(title));
1545 void ui_edclose(t_ui *x,
char **text,
long size)
1548 x->textEditor = NULL;
1550 defer_low((t_object*)x, (method)ui_doedit, NULL, 0, NULL);
1553 void ui_doedit(t_ui *x)
1558 x->textHandler.send(kTTSym_Read, (
TTPtr)x->text, none);
1562 x->state.send(kTTSym_Recall);
1566 x->textEditor = NULL;
We build a directory of TTNodes, and you can request a pointer for any TTNode, or add an observer to ...
TTPtr getContext()
Get a pointer to the context of this node.
const char * c_str() const
Return a pointer to the internal C-string.
The TTAddress class is used to represent a string and efficiently pass and compare that string...
Create and use Jamoma object instances.
This class represents a single attribute, as used by the TTObjectBase class.
Maintain a collection of TTValue objects indexed by TTSymbol pointers.
int JAMOMA_EXPORT_MAXOBJ main(void)
Set up this class as a Max external the first time an object of this kind is instantiated.
void append(const T &anElementValueToAppend)
Insert a single TTElement at the end.
void * TTPtr
A generic pointer.
TTErr set(const TTSymbol aName, T aValue)
Set an attribute value for an object.
The TTSymbol class is used to represent a string and efficiently pass and compare that string...
A base class for j.ui info.
TTErr
Jamoma Error Codes Enumeration of error codes that might be returned by any of the TTBlue functions a...
std::uint32_t TTUInt32
32 bit unsigned integer
The TTString class is used to represent a string.
#define accessApplicationLocalDirectory
Access to the local application directory.
[doxygenAppendixC_copyExample]
j.ui : Provide standard user interface component for modules