Changeset 19657 in josm


Ignore:
Timestamp:
2026-10-23T16:00:18+02:00 (4 hours ago)
Author:
gaben
Message:

fix #21208, fix #21207 - center icons and align text in preference and preset lists

Use padded icons for tagging preset icons and for list entry/label icons in the preset dialog, so non-square icons are centered and the texts line up. List entries without an icon get a blank one if other entries of the list have an icon.

Location:
trunk
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/gui/preferences/SourceEditor.java

    r19629 r19657  
    13371337                }
    13381338                final ImageSizes size = ImageSizes.TABLE;
    1339                 setIcon(value.icon == null ? ImageProvider.getEmpty(size) : value.icon.getImageIconBounded(size.getImageDimension()));
     1339                setIcon(value.icon == null ? ImageProvider.getEmpty(size) : value.icon.getPaddedIcon(size.getImageDimension()));
    13401340            }
    13411341            return this;
  • trunk/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPreset.java

    r19553 r19657  
    291291                if (result != null) {
    292292                    // Pre-render off EDT to avoid flooding the event queue with expensive SVG rendering
    293                     ImageIcon small = result.getImageIcon(ImageProvider.ImageSizes.SMALLICON.getImageDimension());
    294                     ImageIcon large = result.getImageIcon(ImageProvider.ImageSizes.LARGEICON.getImageDimension());
     293                    ImageIcon small = result.getPaddedIcon(ImageProvider.ImageSizes.SMALLICON.getImageDimension());
     294                    ImageIcon large = result.getPaddedIcon(ImageProvider.ImageSizes.LARGEICON.getImageDimension());
    295295                    GuiHelper.runInEDT(() -> {
    296296                        try {
  • trunk/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPresetItem.java

    r19286 r19657  
    55import static org.openstreetmap.josm.tools.I18n.trc;
    66
     7import java.awt.Dimension;
    78import java.io.File;
    89import java.util.Arrays;
    … …  
    2930import org.openstreetmap.josm.gui.util.LruCache;
    3031import org.openstreetmap.josm.tools.ImageProvider;
     32import org.openstreetmap.josm.tools.ImageProvider.ImageSizes;
     33import org.openstreetmap.josm.tools.ImageResource;
    3134import org.openstreetmap.josm.tools.Logging;
    3235import org.openstreetmap.josm.tools.Utils;
    … …  
    151154     * @param iconName the icon name
    152155     * @param zipIcons zip file where the image is located
    153      * @param maxSize maximum image size (or null)
    154      * @return the requested image or null if the request failed
     156     * @param maxSize maximum image size (or null for the default small icon size)
     157     * @return the requested image, centered in a square of {@code maxSize}, or null if the request failed
    155158     */
    156159    public static ImageIcon loadImageIcon(String iconName, File zipIcons, Integer maxSize) {
    157160        final Collection<String> s = TaggingPresets.ICON_SOURCES.get();
    158         ImageProvider imgProv = new ImageProvider(iconName).setDirs(s).setId("presets").setArchive(zipIcons).setOptional(true);
    159         if (maxSize != null && maxSize > 0) {
    160             imgProv.setMaxSize(maxSize);
    161         }
    162         return imgProv.get();
     161        final int size = (maxSize != null && maxSize > 0) ? maxSize : ImageSizes.SMALLICON.getVirtualWidth();
     162        ImageResource resource = new ImageProvider(iconName).setDirs(s).setId("presets").setArchive(zipIcons).setOptional(true)
     163                .getResource();
     164        return resource == null ? null : resource.getPaddedIcon(new Dimension(size, size));
    163165    }
    164166
  • trunk/src/org/openstreetmap/josm/gui/tagging/presets/items/ComboMultiSelect.java

    r19597 r19657  
    66import java.awt.Component;
    77import java.awt.Font;
     8import java.awt.image.BufferedImage;
    89import java.lang.reflect.Method;
    910import java.lang.reflect.Modifier;
    … …  
    1415import java.util.List;
    1516import java.util.Map;
     17import java.util.Objects;
    1618import java.util.TreeMap;
    1719import java.util.stream.Collectors;
    1820
     21import javax.swing.Icon;
     22import javax.swing.ImageIcon;
    1923import javax.swing.JLabel;
    2024import javax.swing.JList;
    … …  
    143147                l.setFont(l.getFont().deriveFont(Font.ITALIC + Font.BOLD));
    144148            }
    145             l.setIcon(value.getIcon());
     149            Icon icon = value.getIcon();
     150            if (icon == null && value.cms != null) {
     151                // use a blank icon if other entries have one, so that all texts line up
     152                icon = value.cms.presetListEntries.stream().map(PresetListEntry::getIcon).filter(Objects::nonNull).findFirst()
     153                        .map(i -> new ImageIcon(new BufferedImage(i.getIconWidth(), i.getIconHeight(), BufferedImage.TYPE_INT_ARGB)))
     154                        .orElse(null);
     155            }
     156            l.setIcon(icon);
    146157            l.setToolTipText(value.getToolTipText(key));
    147158            return l;
  • trunk/src/org/openstreetmap/josm/tools/ImageResizeMode.java

    r19519 r19657  
    9595            renderer.accept(g);
    9696        } else if (sourceIcon != null) {
    97             sourceIcon = sourceIcon.getScaledInstance(real.width, real.height, Image.SCALE_SMOOTH);
    98             g.drawImage(sourceIcon, 0, 0, null);
     97            final Dimension scaled = (this == PADDED) ? AUTO.computeDimension(real, icon) : real;
     98            sourceIcon = sourceIcon.getScaledInstance(scaled.width, scaled.height, Image.SCALE_SMOOTH);
     99            g.drawImage(sourceIcon, (real.width - scaled.width) / 2, (real.height - scaled.height) / 2, null);
    99100        } else {
    100101            throw new IllegalArgumentException("renderer or sourceIcon");
  • trunk/test/unit/org/openstreetmap/josm/gui/tagging/presets/items/ComboTest.java

    r18918 r19657  
    77import java.awt.Color;
    88
     9import javax.swing.JLabel;
     10import javax.swing.JList;
    911import javax.swing.JPanel;
    1012
    … …  
    1719import org.openstreetmap.josm.testutils.annotations.I18n;
    1820import org.openstreetmap.josm.testutils.annotations.Main;
     21import org.openstreetmap.josm.tools.ImageProvider.ImageSizes;
    1922
    2023/**
    … …  
    124127    }
    125128
     129    /**
     130     * Entry icons are centered in a square and entries without an icon get a blank one, so that the texts line up.
     131     */
     132    @Test
     133    void testIconAlignment() {
     134        final Combo combo = getInstance();
     135        combo.key = "highway";
     136        PresetListEntry trunk = new PresetListEntry("trunk", combo);
     137        trunk.icon = "presets/transport/way/way_trunk.svg";
     138        combo.addListEntry(trunk);
     139        combo.addListEntry(new PresetListEntry("busway", combo));
     140        combo.addToPanel(new JPanel(), TaggingPresetItemGuiSupport.create(false));
     141        JList<PresetListEntry> list = new JList<>();
     142        for (PresetListEntry entry : combo.presetListEntries) {
     143            JLabel label = (JLabel) combo.combobox.getRenderer().getListCellRendererComponent(list, entry, 0, false, false);
     144            assertEquals(ImageSizes.SMALLICON.getAdjustedWidth(), label.getIcon().getIconWidth(), entry.value);
     145            assertEquals(ImageSizes.SMALLICON.getAdjustedHeight(), label.getIcon().getIconHeight(), entry.value);
     146        }
     147    }
     148
    126149    @Test
    127150    void testColor() {
  • trunk/test/unit/org/openstreetmap/josm/tools/ImageResizeModeTest.java

    r19519 r19657  
    77
    88import java.awt.Dimension;
     9import java.awt.image.BufferedImage;
    910
    1011import org.junit.jupiter.api.Test;
    … …  
    6970
    7071    /**
     72     * Test method for {@link ImageResizeMode#createBufferedImage} using {@link ImageResizeMode#PADDED} on a raster image
     73     */
     74    @Test
     75    void testCreateBufferedImagePaddedRaster() {
     76        BufferedImage source = new BufferedImage(16, 4, BufferedImage.TYPE_INT_RGB); // opaque black
     77        BufferedImage padded = ImageResizeMode.PADDED.createBufferedImage(new Dimension(32, 32), new Dimension(16, 4), null, source);
     78        assertEquals(32, padded.getWidth());
     79        assertEquals(32, padded.getHeight());
     80        // aspect ratio is kept: a 32x8 bar centered vertically
     81        assertEquals(0, padded.getRGB(16, 11) >>> 24);
     82        assertEquals(0xff, padded.getRGB(16, 12) >>> 24);
     83        assertEquals(0xff, padded.getRGB(16, 19) >>> 24);
     84        assertEquals(0, padded.getRGB(16, 20) >>> 24);
     85    }
     86
     87    /**
    7188     * Test method for {@link ImageResizeMode#cacheKey}
    7289     */
Note: See TracChangeset for help on using the changeset viewer.