X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;ds=sidebyside;f=src%2Fmain%2Fjava%2Fnet%2Fpterodactylus%2Fsone%2Fdata%2FAlbum.java;h=ab5822b02b36dc5a4db696e6a11737c051a3dd3d;hb=b50dc71166ed2e9e7274fdfe545b21db614f820d;hp=89823a81786f4158e8bc0eff21a411f3fa06217a;hpb=e71cce762443757a193067b13a82fb7ae92b28b2;p=Sone.git diff --git a/src/main/java/net/pterodactylus/sone/data/Album.java b/src/main/java/net/pterodactylus/sone/data/Album.java index 89823a8..ab5822b 100644 --- a/src/main/java/net/pterodactylus/sone/data/Album.java +++ b/src/main/java/net/pterodactylus/sone/data/Album.java @@ -18,11 +18,13 @@ package net.pterodactylus.sone.data; import java.util.ArrayList; -import java.util.LinkedHashMap; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.UUID; +import net.pterodactylus.util.collection.Mapper; +import net.pterodactylus.util.collection.Mappers; import net.pterodactylus.util.validation.Validation; /** @@ -41,8 +43,11 @@ public class Album implements Fingerprintable { /** Nested albums. */ private final List albums = new ArrayList(); + /** The image IDs in order. */ + private final List imageIds = new ArrayList(); + /** The images in this album. */ - private final Map images = new LinkedHashMap(); + private final Map images = new HashMap(); /** The parent album. */ private Album parent; @@ -151,7 +156,15 @@ public class Album implements Fingerprintable { * @return The images in this album */ public List getImages() { - return new ArrayList(images.values()); + return Mappers.mappedList(imageIds, new Mapper() { + + @Override + @SuppressWarnings("synthetic-access") + public Image map(String imageId) { + return images.get(imageId); + } + + }); } /** @@ -166,10 +179,11 @@ public class Album implements Fingerprintable { image.getAlbum().removeImage(image); } image.setAlbum(this); - if (images.isEmpty()) { + if (imageIds.isEmpty()) { albumImage = image.getId(); } - if (!images.containsKey(image.getId())) { + if (!imageIds.contains(image.getId())) { + imageIds.add(image.getId()); images.put(image.getId(), image); } } @@ -182,7 +196,8 @@ public class Album implements Fingerprintable { */ public void removeImage(Image image) { Validation.begin().isNotNull("Image", image).check().isEqual("Image Owner", image.getSone(), sone).check(); - images.remove(image); + imageIds.remove(image.getId()); + images.remove(image.getId()); if (image.getId().equals(albumImage)) { if (images.isEmpty()) { albumImage = null; @@ -193,6 +208,40 @@ public class Album implements Fingerprintable { } /** + * Moves the given image up in this album’s images. If the image is already + * the first image, nothing happens. + * + * @param image + * The image to move up + */ + public void moveImageUp(Image image) { + Validation.begin().isNotNull("Image", image).check().isEqual("Image Album", image.getAlbum(), this).isEqual("Album Owner", image.getAlbum().getSone(), sone).check(); + int oldIndex = imageIds.indexOf(image.getId()); + if (oldIndex <= 0) { + return; + } + imageIds.remove(image.getId()); + imageIds.add(oldIndex - 1, image.getId()); + } + + /** + * Move the given image down in this album’s images. If the image is already + * the last image, nothing happens. + * + * @param image + * The image to move down + */ + public void moveImageDown(Image image) { + Validation.begin().isNotNull("Image", image).check().isEqual("Image Album", image.getAlbum(), this).isEqual("Album Owner", image.getAlbum().getSone(), sone).check(); + int oldIndex = imageIds.indexOf(image.getId()); + if ((oldIndex == -1) || (oldIndex >= (imageIds.size() - 1))) { + return; + } + imageIds.remove(image.getId()); + imageIds.add(oldIndex + 1, image.getId()); + } + + /** * Returns the album image of this album, or {@code null} if no album image * has been set. *