srecord noeq G22ChallengePanel(G22Challenge challenge) is Swingable { transient int randomSeed = randomInt(); transient JPanel imagesPanel = jline(); transient L images = syncL(); transient GazelleV_LeftArrowScript.Script parsedScript; transient settable new G22Utils g22utils; settable double timeoutPerImage = 10.0; settable int imagesToPaint = 3; settable int interval = 1000; visualize { awtCalcEvery(imagesPanel, interval, r _paintAnImage); ret withCenteredBoldTitle(str(challenge), withTopMargin(jvsplit( northAndCenterWithMargin( jRightAlignedLine(withLabel("Random seed:", jlabel(intToHex_upper(randomSeed)))), jCenteredRaisedSection("Images", jscrollHorizontal(imagesPanel)) ), jCenteredSection("Analysis", jTodo() ) ))); } void _paintAnImage { if (l(images) >= imagesToPaint) ret; try { if (parsedScript == null) { var parser = g22utils.leftArrowParser(); parsedScript = parser.parse(challenge.code); } new VarContext ctx; var result = evalWithTimeout(timeoutPerImage, -> parsedScript.get(ctx)); if (result.isA()) { var returnedObject = result.a(); if (returnedObject instanceof MakesBufferedImage || returnedObject instanceof Image) returnedObject = toBufferedImage(returnedObject); if (returnedObject cast BufferedImage) { images.add(returnedObject); addToContainer(imagesPanel, g22utils.stdImageSurface(returnedObject)); } else { images.add(null); addToContainer(imagesPanel, jcenteredlabel("Script did not return an image but instead " + aOrAn(className(returnedObject)))); } } else { images.add(null); addToContainer(imagesPanel, jcenteredlabel("Script timed out after " + nSeconds(iceil(timeoutPerImage)))); } } catch print e { images.add(null); addToContainer(imagesPanel, jError(e)); } } }