srecord noeq G22ChallengePanel(G22Challenge challenge) is Swingable { transient int randomSeed = randomInt(); //transient JPanel imagesPanel = jline(); transient new DynamicHStack imagesPanel; transient L images = syncL(); transient JComponent imagesSection; transient GazelleV_LeftArrowScript.Script parsedScript; transient settable new G22Utils g22utils; settable double timeoutPerImage = 10.0; settable int imagesToPaint = 3; settable int interval = 1000; settable int imageDisplayHeight = 150; visualize { awtCalcEvery(imagesPanel, interval, r _paintAnImage); ret withCenteredBoldTitle(str(challenge), withTopMargin(jvsplit( northAndCenterWithMargin( jRightAlignedLine(withLabel("Random seed:", jlabel(intToHex_upper(randomSeed)))), imagesSection = 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) { addImage(returnedObject); } else { addImage(null, jcenteredlabel("Script did not return an image but instead " + aOrAn(className(returnedObject)))); } } else { addImage(null, jcenteredlabel("Script timed out after " + nSeconds(iceil(timeoutPerImage)))); } } catch print e { addImage(null, jError(e)); } } void addImage(BufferedImage image, JComponent component) { images.add(image); addAndRevalidate(imagesPanel, component); setSectionTitle(imagesSection, firstToUpper(nImages(images))); } void addImage(BufferedImage image) { // image to component // var is = g22utils.stdImageSurface(image); // jFixedSize(image.getWidth(), image.getHeight(), is); Button b = jImageButton(image); resizeImageButtonToMax(b, imageDisplayHeight); setMargin(10, b); ret b; } }