sclass G22POIsPanel extends G22CRUDAndDetailPanel { SimpleCRUD_v2 makeCRUD() { var crud = new SimpleCRUD_v2<>(g22utils.concepts(), G22PointOfInterest); crud.entityName = -> "Point of interest"; crud.entityNamePlural = -> "Points of interest"; crud.itemToMap_inner2 = poi -> { var map = crud.itemToMap_inner2_base(poi); changeKeyAndModifyValue(map, "bnpSettings", "Blur & Posterize", bnp -> tok_extractRoundBracketBody(str(bnp))); changeKey(map, "imageMD5", "Image ID"); ret map; }; ret crud; } JComponent makeDetailView(G22PointOfInterest poi) { G22GalleryImage img = g22utils.galleryImageForMD5(poi.imageMD5); var is = g22utils.stdImageSurface(img); // mark point of interest in an animated way is.addOverlay(g -> { var p = scalePt(poi.pt, is.getZoomX(), is.getZoomY()); double blend = zeroToOneSine(frac(sysSeconds())); drawSquareAround(g, p, 1, blendColor(blend, Color.green, Color.red)); drawSquareAround(g, p, 2, blendColor(blend, Color.red, Color.green)); drawSquareAround(g, p, 3, blendColor(blend, Color.white, Color.black)); }); repaintEvery(is, 100); ret jCenteredSection("Full image", g22utils.wrapImageSurface(is)); } selfType g22utils(G22Utils g22utils) { super.g22utils(g22utils); this; } }