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; } @Override S detailTitle(G22PointOfInterest poi) { ret str(poi); // crud.entityName() + " " + poi.id; } JComponent makeDetailView(G22PointOfInterest poi) { G22GalleryImage img = g22utils.galleryImageForMD5(poi.imageMD5); new L parts; if (img == null) ret jCenteredLabel("Image not found: " + poi.imageMD5); var is1 = g22utils.stdImageSurface(img); g22markPointAnimation(is1, poi.pt); parts.add(jCenteredSection("Original image", g22utils.wrap(is1))); new G22DataWrangler wrangler; wrangler.timings(g22utils.functionTimings()); wrangler.inputImage(img.getImage()); wrangler.importSettings(poi.bnpSettings); wrangler.stepUntilStage(wrangler.regionsStage); var is2 = g22utils.stdImageSurface(wrangler.posterizedImage); g22markPointAnimation(is2, poi.pt); parts.add(jCenteredSection("Blurred & Posterized", g22utils.wrap(is2))); ret hgridWithSpacing(parts); } selfType g22utils(G22Utils g22utils) { super.g22utils(g22utils); this; } }