Commit aa659330 authored by Jonathan Wilkes's avatar Jonathan Wilkes

Merge branch 'hyperlinked-print'

parents cd9cd9cb ab4741da
Pipeline #1287 failed with stage
in 0 seconds
......@@ -659,30 +659,50 @@ var last_child = {};
var last_object_id = "";
var duplicate = 0;
function do_post(string, type) {
var myp, span, text, printout;
current_string += string;
myp = pd_window.document.getElementById("p1");
function do_post(object_id, selector, string, type, loglevel) {
var my_p, my_a, span, text, sel_span, printout, dup_span;
current_string = current_string + (selector ? selector : "") + string;
my_p = pd_window.document.getElementById("p1");
// We can get posts from Pd that are build incrementally, with the final
// message having a "\n" at the end. So we test for that.
if (string.slice(-1) === "\n") {
if (current_string === last_string) {
last_child.textContent = "[" + (duplicate + 2) + "] " + last_string;
duplicate++;
if (current_string === last_string
&& object_id === last_object_id) {
duplicate += 1;
dup_span = last_child.firstElementChild;
dup_span.textContent = "[" + (duplicate + 1) + "] ";
current_string = "";
if (myp.lastChild !== last_child) {
myp.appendChild(last_child);
if (my_p.lastChild !== last_child) {
my_p.appendChild(last_child);
}
} else {
span = pd_window.document.createElement("span");
if (type) {
span.classList.add(type);
}
text = pd_window.document.createTextNode(current_string);
dup_span = pd_window.document.createElement("span");
sel_span = pd_window.document.createTextNode(
selector ? selector : "");
text = pd_window.document.createTextNode(
(selector && selector !== "") ? ": " + string : current_string);
if (object_id && object_id.length > 0) {
my_a = pd_window.document.createElement("a");
my_a.href = "javascript:pdgui.pd_error_select_by_id('" +
object_id + "')";
my_a.appendChild(sel_span);
span.appendChild(dup_span); // duplicate tally
span.appendChild(my_a);
} else {
span.appendChild(dup_span);
span.appendChild(sel_span);
my_p.appendChild(span);
}
span.appendChild(text);
myp.appendChild(span);
my_p.appendChild(span);
last_string = current_string;
current_string = "";
last_child = span;
last_object_id = "";
last_object_id = object_id;
duplicate = 0;
// update the scrollbars to the bottom, but throttle it
// since it is expensive
......@@ -693,14 +713,14 @@ function do_post(string, type) {
// print message to console-- add a newline for convenience
function post(string, type) {
do_post(string + "\n", type);
do_post(null, null, string + "\n", type, null);
}
exports.post = post;
// print message to console from Pd-- don't add newline
function gui_post(string, type) {
do_post(string, type);
do_post(null, "", string, type, null);
}
function pd_error_select_by_id(objectid) {
......@@ -709,46 +729,21 @@ function pd_error_select_by_id(objectid) {
}
}
exports.pd_error_select_by_id = pd_error_select_by_id
exports.pd_error_select_by_id = pd_error_select_by_id;
function gui_post_error(objectid, loglevel, errormsg) {
var my_p, error_span, error_title, my_a, rest, printout, dup_span;
if (last_object_id === objectid
&& last_string === errormsg)
{
dup_span = last_child.firstElementChild;
dup_span.textContent = "[" + (duplicate + 2) + "] ";
duplicate++;
} else {
my_p = pd_window.document.getElementById("p1");
// if we have an object id, make a friendly link...
error_span = pd_window.document.createElement("span");
error_span.classList.add("error");
dup_span = pd_window.document.createElement("span");
last_child = error_span;
error_title = pd_window.document.createTextNode("error");
if (objectid.length > 0) {
my_a = pd_window.document.createElement("a");
my_a.href =
"javascript:pdgui.pd_error_select_by_id('" + objectid + "')";
my_a.appendChild(error_title);
error_span.appendChild(dup_span); // for duplicate tally
error_span.appendChild(my_a);
my_p.appendChild(error_span);
} else {
error_span.appendChild(dup_span);
error_span.appendChild(error_title);
my_p.appendChild(error_span);
}
rest = pd_window.document.createTextNode(": " + errormsg);
error_span.appendChild(rest);
printout = pd_window.document.getElementById("console_bottom");
printout.scrollTop = printout.scrollHeight;
last_string = errormsg;
last_object_id = objectid;
current_string = "";
duplicate = 0;
}
function gui_post_error(objectid, loglevel, error_msg) {
do_post(objectid, "error", error_msg, "error", loglevel);
}
// This is used specifically by [print] so that we can receive the full
// message in a single call. This way we can call do_post with a single
// string message and track the object id with the selector.
function gui_print(object_id, selector, array_of_strings) {
// Unfortunately the instance finder still uses a "." prefix, so we
// have to add that here
do_post("." + object_id, selector, array_of_strings.join(" ") + "\n",
null, null);
}
function gui_legacy_tcl_command(file, line_number, text) {
......
......@@ -167,8 +167,6 @@ static void canvas_objtext(t_glist *gl, int xpix, int ypix,
return;
}
}
binbuf_print(b);
post("... couldn't create");
x = 0;
}
else if (!(x = pd_checkobject(newest)))
......@@ -182,7 +180,16 @@ static void canvas_objtext(t_glist *gl, int xpix, int ypix,
{
/* LATER make the color reflect this */
x = (t_text *)pd_new(text_class);
//fprintf(stderr,"creating blank object %lx\n", x);
if (binbuf_getnatom(b))
{
int bufsize;
char *buf;
binbuf_gettext(b, &buf, &bufsize);
buf = t_resizebytes(buf, bufsize, bufsize+1);
buf[bufsize] = 0;
pd_error(x, "couldn't create \"%s\"", buf);
t_freebytes(buf, bufsize + 1);
}
}
/* special case: an object, like preset_hub, hides its arguments
beyond the first n, so we modify its binbuf here */
......
......@@ -244,7 +244,7 @@ void pd_error(void *object, const char *fmt, ...)
{
/* move this to a function in the GUI so that we can change the
message without having to recompile */
post("... you might be able to track this down from the 'Find Last Error' item in the Edit menu, or by clicking the error link above.");
post("... click the link above to track it down, or click the 'Find Last Error' item in the Edit menu.");
saidit = 1;
}
}
......
......@@ -56,39 +56,55 @@ static void *print_new(t_symbol *sel, int argc, t_atom *argv)
static void print_bang(t_print *x)
{
post("%s%sbang", x->x_sym->s_name, (*x->x_sym->s_name ? ": " : ""));
gui_start_vmess("gui_print", "xs", x, x->x_sym->s_name);
gui_start_array();
gui_s(s_bang.s_name);
gui_end_array();
gui_end_vmess();
}
static void print_pointer(t_print *x, t_gpointer *gp)
{
post("%s%s(gpointer)", x->x_sym->s_name, (*x->x_sym->s_name ? ": " : ""));
gui_start_vmess("gui_print", "xs", x, x->x_sym->s_name);
gui_start_array();
gui_s("(gpointer)");
gui_end_array();
gui_end_vmess();
}
static void print_float(t_print *x, t_float f)
static void print_float(t_print *x, t_floatarg f)
{
post("%s%s%g", x->x_sym->s_name, (*x->x_sym->s_name ? ": " : ""), f);
gui_start_vmess("gui_print", "xs", x, x->x_sym->s_name);
gui_start_array();
gui_f(f);
gui_end_array();
gui_end_vmess();
}
static void print_list(t_print *x, t_symbol *s, int argc, t_atom *argv)
static void print_symbol(t_print *x, t_symbol *s)
{
if (argc && argv->a_type != A_SYMBOL)
startpost("%s%s%g", x->x_sym->s_name,
(*x->x_sym->s_name ? ": " : ""),
atom_getfloatarg(0, argc--, argv++));
else startpost("%s%s%s", x->x_sym->s_name,
(*x->x_sym->s_name ? ": " : ""),
(argc > 1 ? s_list.s_name : (argc == 1 ? s_symbol.s_name :
s_bang.s_name)));
postatom(argc, argv);
endpost();
gui_start_vmess("gui_print", "xs", x, x->x_sym->s_name);
gui_start_array();
gui_s(s_symbol.s_name);
gui_s(s->s_name);
gui_end_array();
gui_end_vmess();
}
static void print_anything(t_print *x, t_symbol *s, int argc, t_atom *argv)
{
startpost("%s%s%s", x->x_sym->s_name, (*x->x_sym->s_name ? ": " : ""),
s->s_name);
postatom(argc, argv);
endpost();
char buf[MAXPDSTRING];
gui_start_vmess("gui_print", "xs", x, x->x_sym->s_name);
gui_start_array();
if (s && (s != &s_list || (argc && argv->a_type != A_FLOAT)))
gui_s(s->s_name);
for(; argc; argv++, argc--)
{
atom_string(argv, buf, MAXPDSTRING);
gui_s(buf);
}
gui_end_array();
gui_end_vmess();
}
static void print_setup(void)
......@@ -98,7 +114,7 @@ static void print_setup(void)
class_addbang(print_class, print_bang);
class_addfloat(print_class, print_float);
class_addpointer(print_class, print_pointer);
class_addlist(print_class, print_list);
class_addsymbol(print_class, print_symbol);
class_addanything(print_class, print_anything);
}
......
#N canvas 3 60 508 425 10;
#X msg 21 41 \; \$1;
#X msg 21 131 \; \$0;
#X msg 21 220 42;
#X msg 21 251 \; \$1;
#X text 21 11 1) dollar target is out of range;
#X text 21 101 2) dollar target is dollar zero;
#X text 21 191 3) dollar target isn't a symbol;
#X text 251 11 4) not enough args to dollsym;
#X msg 251 67 \; \$1-foo;
#X msg 251 36 bang;
#X text 299 59 ERROR: double doll sign;
#X msg 251 130 bang;
#X text 251 101 5) no such object;
#X msg 251 161 \; 42;
#X msg 251 230 bang;
#X msg 251 261 \; foo \$1;
#X obj 329 228 r foo;
#X obj 329 250 == 0;
#X floatatom 329 272 5 0 0 0 - - -, f 5;
#X msg 251 340 bang;
#X text 251 201 6) dollar argument number out of range;
#X text 251 311 7) dollsym argument number out of range;
#X obj 379 360 sel 0-foo;
#X obj 379 338 r seven;
#X msg 251 371 \; seven symbol \$1-foo;
#X obj 430 382 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144
#N canvas 3 60 508 497 10;
#X msg 21 101 \; \$1;
#X msg 21 191 \; \$0;
#X msg 21 280 42;
#X msg 21 311 \; \$1;
#X text 21 71 1) dollar target is out of range;
#X text 21 161 2) dollar target is dollar zero;
#X text 21 251 3) dollar target isn't a symbol;
#X text 251 71 4) not enough args to dollsym;
#X msg 251 127 \; \$1-foo;
#X msg 251 96 bang;
#X text 299 119 ERROR: double doll sign;
#X msg 251 190 bang;
#X text 251 161 5) no such object;
#X msg 251 221 \; 42;
#X msg 251 290 bang;
#X msg 251 321 \; foo \$1;
#X obj 329 288 r foo;
#X obj 329 310 == 0;
#X floatatom 329 332 5 0 0 0 - - -, f 5;
#X msg 251 400 bang;
#X text 251 261 6) dollar argument number out of range;
#X text 251 371 7) dollsym argument number out of range;
#X obj 379 420 sel 0-foo;
#X obj 379 398 r seven;
#X msg 251 431 \; seven symbol \$1-foo;
#X obj 430 442 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144
-1 -1;
#X text 21 19 All of these should output an error with a link back
to the relevant message box.;
#X connect 2 0 3 0;
#X connect 9 0 8 0;
#X connect 11 0 13 0;
......
#N canvas 3 60 731 585 12;
#X msg 19 64 0;
#X obj 19 549 print;
#X text 130 63 "print: 0";
#X msg 31 101 foo bar;
#X obj 31 126 list split 1;
#X text 130 100 "print: symbol foo";
#X msg 46 160 list 0;
#X text 130 160 "print: 0";
#X msg 57 199 foo bar;
#X text 130 199 "print: foo bar";
#X msg 77 234 list;
#X msg 79 284 bang;
#X msg 85 325 bang;
#X obj 85 350 symbol;
#X msg 85 375 \$1;
#X text 130 234 "print: bang";
#X text 131 284 "print: bang";
#X text 131 324 "print: ";
#X msg 416 161 a 2;
#X text 529 161 "print: a 2";
#X msg 416 455 pointer;
#X obj 416 480 canvasinfo;
#X text 529 455 "print: (gpointer)";
#X msg 416 213 grapes;
#X obj 416 238 list;
#X text 529 213 "print: symbol grapes";
#X msg 416 125 symbol grapes;
#X text 529 125 "print: symbol grapes";
#X msg 416 279 pointer;
#X obj 416 304 canvasinfo;
#X msg 416 329 grapes \$1;
#X obj 416 505 pointer;
#X text 529 279 "print: grapes (pointer)";
#X msg 416 370 pointer;
#X obj 416 395 canvasinfo;
#X text 19 14 These should output the same text as Pd Vanilla which
is written in the comments.;
#X msg 416 75 2 a b;
#X text 529 75 "print: 2 a b";
#X msg 416 420 list \$1 \$1;
#X text 489 369 "print: list (pointer) (pointer)";
#X connect 0 0 1 0;
#X connect 3 0 4 0;
#X connect 4 0 1 0;
#X connect 6 0 1 0;
#X connect 8 0 1 0;
#X connect 10 0 1 0;
#X connect 11 0 1 0;
#X connect 12 0 13 0;
#X connect 13 0 14 0;
#X connect 14 0 1 0;
#X connect 18 0 1 0;
#X connect 20 0 21 0;
#X connect 21 0 31 0;
#X connect 23 0 24 0;
#X connect 24 0 1 0;
#X connect 26 0 1 0;
#X connect 28 0 29 0;
#X connect 29 0 30 0;
#X connect 30 0 1 0;
#X connect 31 0 1 0;
#X connect 33 0 34 0;
#X connect 34 0 38 0;
#X connect 36 0 1 0;
#X connect 38 0 1 0;
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment