package magic.ui.screen.duel.player.avatar; import java.awt.Color; import java.awt.Cursor; import java.io.IOException; import java.nio.file.DirectoryStream; import java.nio.file.Files; import java.nio.file.Path; import java.util.ArrayList; import java.util.List; import javax.swing.BorderFactory; import javax.swing.JList; import javax.swing.JScrollPane; import javax.swing.SwingUtilities; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import magic.ui.FontsAndBorders; import magic.ui.screen.interfaces.IThemeStyle; import magic.ui.theme.Theme; import magic.ui.utility.MagicStyle; import magic.ui.widget.TexturedPanel; import magic.utility.MagicFileSystem; import net.miginfocom.swing.MigLayout; @SuppressWarnings("serial") class ImageSetsPanel extends TexturedPanel implements IThemeStyle { ImageSetsPanel(final AvatarImagesScreen screen) { // List of avatar image sets. final JList<AvatarImageSet> imageSetsList = new JList<>(getAvatarImageSetsArray()); imageSetsList.setOpaque(false); imageSetsList.addListSelectionListener(new ListSelectionListener() { @Override public void valueChanged(ListSelectionEvent e) { if (!e.getValueIsAdjusting()) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); screen.displayImageSetIcons(imageSetsList.getSelectedValue()); setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); } }); } } }); imageSetsList.setSelectedIndex(0); final AvatarListCellRenderer renderer = new AvatarListCellRenderer(); imageSetsList.setCellRenderer(renderer); final JScrollPane scrollPane = new JScrollPane(); scrollPane.setViewportView(imageSetsList); scrollPane.setBorder(BorderFactory.createEmptyBorder()); scrollPane.setOpaque(false); scrollPane.getViewport().setOpaque(false); setLayout(new MigLayout("insets 0, gap 0, flowy")); setBorder(FontsAndBorders.BLACK_BORDER); add(scrollPane, "w 100%, h 100%"); refreshStyle(); } private static class DirectoriesOnlyFilter implements DirectoryStream.Filter<Path> { @Override public boolean accept(Path entry) throws IOException { return Files.isDirectory(entry); } } private List<Path> getSortedDirectoryPaths(final Path rootDirectory) { final List<Path> paths = new ArrayList<>(); try (DirectoryStream<Path> ds = Files.newDirectoryStream( rootDirectory, new DirectoriesOnlyFilter())) { for (Path p : ds) { paths.add(p); } } catch (IOException ex) { System.err.println(ex); } paths.sort((p1, p2) -> p1.getFileName().compareTo(p2.getFileName())); return paths; } private AvatarImageSet loadImageSet(final Path imageSetDirectory) { final AvatarImageSet imageSet = new AvatarImageSet(imageSetDirectory); return imageSet; } private List<AvatarImageSet> getAvatarImageSetsList() { final List<AvatarImageSet> imageSets = new ArrayList<>(); List<Path> directoryPaths = getSortedDirectoryPaths(MagicFileSystem.getDataPath(MagicFileSystem.DataPath.AVATARS)); for (Path path : directoryPaths) { imageSets.add(loadImageSet(path)); } return imageSets; } private AvatarImageSet[] getAvatarImageSetsArray() { final List<AvatarImageSet> imageSetsList = getAvatarImageSetsList(); return imageSetsList.toArray(new AvatarImageSet[0]); } @Override public final void refreshStyle() { final Color refBG = MagicStyle.getTheme().getColor(Theme.COLOR_TITLE_BACKGROUND); final Color thisBG = MagicStyle.getTranslucentColor(refBG, 200); setBackground(thisBG); } }