Ticket #2028: JOSM.HeadArrow.patch

File JOSM.HeadArrow.patch, 7.4 KB (added by robome, 17 years ago)

proposed patch

  • src/org/openstreetmap/josm/data/osm/visitor/SimplePaintVisitor.java

     
    6363    protected Color backgroundColor;
    6464    protected boolean showDirectionArrow;
    6565    protected boolean showRelevantDirectionsOnly;
     66    protected boolean showHeadArrowOnly;
    6667    protected boolean showOrderNumber;
    6768    protected boolean fillSelectedNode;
    6869    protected boolean fillUnselectedNode;
     
    100101    protected void getSettings(Boolean virtual) {
    101102        showDirectionArrow = Main.pref.getBoolean("draw.segment.direction", true);
    102103        showRelevantDirectionsOnly = Main.pref.getBoolean("draw.segment.relevant_directions_only", true);
     104        showHeadArrowOnly = Main.pref.getBoolean("draw.segment.head_only", false);
    103105        showOrderNumber = Main.pref.getBoolean("draw.segment.order_number", false);
    104106        selectedNodeRadius = Main.pref.getInteger("mappaint.node.selected-size", 5) / 2;
    105107        selectedNodeSize = selectedNodeRadius * 2;
     
    291293
    292294        boolean showThisDirectionArrow = w.selected
    293295        || (showDirectionArrow && (!showRelevantDirectionsOnly || w.hasDirectionKeys));
     296        // head only takes over control if the option is true,
     297        // the direction should be shown at all and not only because it's selected
     298        boolean showOnlyHeadArrowOnly = showThisDirectionArrow && !w.selected && showHeadArrowOnly;
    294299        Color wayColor;
    295300
    296301        if (inactive) {
     
    306311            Point lastP = nc.getPoint(it.next().eastNorth);
    307312            for (int orderNumber = 1; it.hasNext(); orderNumber++) {
    308313                Point p = nc.getPoint(it.next().eastNorth);
    309                 drawSegment(lastP, p, w.selected && !inactive ? selectedColor : wayColor, showThisDirectionArrow);
     314                drawSegment(lastP, p, w.selected && !inactive ? selectedColor : wayColor,
     315                    showOnlyHeadArrowOnly ? !it.hasNext() : showThisDirectionArrow);
    310316                if (showOrderNumber)
    311317                    drawOrderNumber(lastP, p, orderNumber);
    312318                lastP = p;
  • src/org/openstreetmap/josm/data/osm/visitor/MapPaintVisitor.java

     
    1616import java.util.Collection;
    1717import java.util.LinkedList;
    1818import java.util.Locale;
     19import java.util.Iterator;
    1920
    2021import javax.swing.ImageIcon;
    2122
     
    196197        // (even if the tag is negated as in oneway=false) or the way is selected
    197198        boolean showDirection = w.selected || ((!useRealWidth) && (showDirectionArrow
    198199        && (!showRelevantDirectionsOnly || w.hasDirectionKeys)));
     200        // head only takes over control if the option is true,
     201        // the direction should be shown at all and not only because it's selected
     202        boolean showOnlyHeadArrowOnly = showDirection && !w.selected && showHeadArrowOnly;
    199203        int width = defaultSegmentWidth;
    200204        int realWidth = 0; //the real width of the element in meters
    201205        boolean dashed = false;
     
    241245
    242246        // draw the way
    243247        lastN = null;
    244         for(Node n : w.nodes)
     248        Iterator<Node> it = w.nodes.iterator();
     249        while (it.hasNext())
    245250        {
     251            Node n = it.next();
    246252            if(lastN != null)
    247                 drawSeg(lastN, n, color, showDirection, width, dashed);
     253                drawSeg(lastN, n, color,
     254                    showOnlyHeadArrowOnly ? !it.hasNext() : showDirection, width, dashed);
    248255            lastN = n;
    249256        }
    250257
  • src/org/openstreetmap/josm/gui/preferences/DrawingPreference.java

     
    3131    private JCheckBox drawGpsArrowsFast = new JCheckBox(tr("Fast drawing (looks uglier)"));
    3232    private JTextField drawGpsArrowsMinDist = new JTextField(8);
    3333    private JCheckBox interestingDirections = new JCheckBox(tr("Only interesting direction hints (e.g. with oneway tag)."));
     34    private JCheckBox headArrow = new JCheckBox(tr("Only on the head of a way."));
    3435    private JCheckBox segmentOrderNumber = new JCheckBox(tr("Draw segment order numbers"));
    3536    private JCheckBox sourceBounds = new JCheckBox(tr("Draw boundaries of downloaded data"));
    3637    private JCheckBox virtualNodes = new JCheckBox(tr("Draw virtual nodes in select mode"));
     
    116117        // directionHint
    117118        directionHint.addActionListener(new ActionListener(){
    118119            public void actionPerformed(ActionEvent e) {
    119                             if (directionHint.isSelected()){
    120                                 interestingDirections.setSelected(Main.pref.getBoolean("draw.segment.relevant_directions_only", true));
    121                             }else{
    122                                 interestingDirections.setSelected(false);
    123                             }
    124                             interestingDirections.setEnabled(directionHint.isSelected());
     120                if (directionHint.isSelected()){
     121                    interestingDirections.setSelected(Main.pref.getBoolean("draw.segment.relevant_directions_only", true));
     122                    headArrow.setSelected(Main.pref.getBoolean("draw.segment.head_only", false));
     123                }else{
     124                    interestingDirections.setSelected(false);
     125                    headArrow.setSelected(false);
     126                }
     127                interestingDirections.setEnabled(directionHint.isSelected());
     128                headArrow.setEnabled(directionHint.isSelected());
    125129            }
    126130        });
    127131        directionHint.setToolTipText(tr("Draw direction hints for way segments."));
     
    134138        interestingDirections.setEnabled(directionHint.isSelected());
    135139        panel.add(interestingDirections, GBC.eop().insets(40,0,0,0));
    136140
     141        // only on the head of a way
     142        headArrow.setToolTipText(tr("Only on the head of a way."));
     143        headArrow.setSelected(Main.pref.getBoolean("draw.segment.head_only", false));
     144        headArrow.setEnabled(directionHint.isSelected());
     145        panel.add(headArrow, GBC.eop().insets(40, 0, 0, 0));
     146
    137147        // segment order number
    138148        segmentOrderNumber.setToolTipText(tr("Draw the order numbers of all segments within their way."));
    139149        segmentOrderNumber.setSelected(Main.pref.getBoolean("draw.segment.order_number", false));
     
    176186        Main.pref.put("draw.rawgps.large", largeGpsPoints.isSelected());
    177187        Main.pref.put("draw.segment.direction", directionHint.isSelected());
    178188        Main.pref.put("draw.segment.relevant_directions_only", interestingDirections.isSelected());
     189        Main.pref.put("draw.segment.head_only", headArrow.isSelected());
    179190        Main.pref.put("draw.segment.order_number", segmentOrderNumber.isSelected());
    180191        Main.pref.put("draw.data.downloaded_area", sourceBounds.isSelected());
    181192        Main.pref.put("draw.data.inactive_color", inactive.isSelected());