Ignore:
Timestamp:
2017-06-11T15:27:18+02:00 (7 years ago)
Author:
michael2402
Message:

Add GPS colors to layer visibility panel

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/gui/dialogs/layer/LayerVisibilityAction.java

    r12393 r12395  
    44import static org.openstreetmap.josm.tools.I18n.tr;
    55
     6import java.awt.BorderLayout;
     7import java.awt.Color;
    68import java.awt.Component;
     9import java.awt.Dimension;
    710import java.awt.GridBagLayout;
    811import java.awt.event.ActionEvent;
     12import java.awt.event.MouseAdapter;
     13import java.awt.event.MouseEvent;
    914import java.awt.event.MouseWheelEvent;
    1015import java.util.ArrayList;
    1116import java.util.Collection;
     17import java.util.HashMap;
    1218import java.util.List;
     19import java.util.stream.Collectors;
    1320
    1421import javax.swing.AbstractAction;
     
    2229import javax.swing.JPopupMenu;
    2330import javax.swing.JSlider;
     31import javax.swing.border.Border;
    2432
    2533import org.openstreetmap.josm.Main;
     
    2735import org.openstreetmap.josm.gui.dialogs.IEnabledStateUpdating;
    2836import org.openstreetmap.josm.gui.dialogs.LayerListDialog.LayerListModel;
     37import org.openstreetmap.josm.gui.layer.GpxLayer;
    2938import org.openstreetmap.josm.gui.layer.ImageryLayer;
    3039import org.openstreetmap.josm.gui.layer.Layer;
     
    8291        addContentEntry(new GammaFilterSlider());
    8392        addContentEntry(new SharpnessSlider());
     93        addContentEntry(new ColorSelector());
    8494    }
    8595
     
    505515        }
    506516    }
     517
     518    /**
     519     * Allows to select the color for the GPX layer
     520     * @author Michael Zangl
     521     */
     522    private class ColorSelector extends JPanel implements LayerVisibilityMenuEntry {
     523
     524        private final Border NORMAL_BORDER = BorderFactory.createEmptyBorder(2, 2, 2, 2);
     525        private final Border SELECTED_BORDER = BorderFactory.createLineBorder(Color.BLACK, 2);
     526
     527        // TODO: Nicer color palette
     528        private final Color[] COLORS = new Color[] {
     529                Color.RED,
     530                Color.ORANGE,
     531                Color.YELLOW,
     532                Color.GREEN,
     533                Color.BLUE,
     534                Color.CYAN,
     535                Color.GRAY,
     536        };
     537        private final HashMap<Color, JPanel> panels = new HashMap<>();
     538
     539        public ColorSelector() {
     540            super(new GridBagLayout());
     541            for (Color color : COLORS) {
     542                addPanelForColor(color);
     543            }
     544        }
     545
     546        private void addPanelForColor(Color color) {
     547            JPanel innerPanel = new JPanel();
     548            innerPanel.setBackground(color);
     549
     550            JPanel colorPanel = new JPanel(new BorderLayout());
     551            colorPanel.setBorder(NORMAL_BORDER);
     552            colorPanel.add(innerPanel);
     553            colorPanel.setMinimumSize(new Dimension(20, 20));
     554            colorPanel.addMouseListener(new MouseAdapter() {
     555                @Override
     556                public void mouseClicked(MouseEvent e) {
     557                    List<Layer> layers = model.getSelectedLayers();
     558                    for(Layer l : layers) {
     559                        if (l instanceof GpxLayer) {
     560                            l.getColorProperty().put(color);
     561                        }
     562                    }
     563                    highlightColor(color);
     564                }
     565            });
     566            add(colorPanel, GBC.std().weight(1, 1).fill().insets(5));
     567            panels.put(color, colorPanel);
     568        }
     569
     570        @Override
     571        public void updateLayers(List<Layer> layers, boolean allVisible, boolean allHidden) {
     572            List<Color> colors = layers.stream().filter(l -> l instanceof GpxLayer)
     573                    .map(l -> ((GpxLayer)l).getColorProperty().get())
     574                    .distinct()
     575                    .collect(Collectors.toList());
     576            if (colors.size() == 1) {
     577                setVisible(true);
     578                highlightColor(colors.get(0));
     579            } else if (colors.size() > 0) {
     580                setVisible(true);
     581                highlightColor(null);
     582            } else {
     583                // no GPX layer
     584                setVisible(false);
     585            }
     586        }
     587
     588        private void highlightColor(Color color) {
     589            panels.values().forEach(panel -> panel.setBorder(NORMAL_BORDER));
     590            if (color != null) {
     591                JPanel selected = panels.get(color);
     592                if (selected != null) {
     593                    selected.setBorder(SELECTED_BORDER);
     594                }
     595            }
     596            repaint();
     597        }
     598
     599        @Override
     600        public JComponent getPanel() {
     601            return this;
     602        }
     603    }
    507604}
Note: See TracChangeset for help on using the changeset viewer.