Marcin Zareba
Marcin Zareba

Reputation: 509

Hide navigator's top outline outside of selection

I'm working on a Highchart plot using a navigator and I've noticed that my outline color is applied to the whole navigator's top, not just the selected data range.

To visualize: enter image description here I'm talking about the purple line going through the whole chart, while I'd like it to be just a part of the selection box, the rest of the top outline should have different color/width. How can I achieve that?

Here's a snippet for reference, found it online and it's rather simple but it shows exactly what's happening:

Highcharts.stockChart('container', {

    navigator: {
        outlineColor: 'blue',
        outlineWidth: 2,
        series: {
            lineWidth: 3,
          fillOpacity: 0.3
        }
    },

    rangeSelector: {
        selected: 1
    },

    series: [{
        name: 'USD to EUR',
        data: usdeur
    }]
});
<div id="container" style="height: 400px; min-width: 600px"></div>

<script src="https://code.highcharts.com/stock/highstock.js"></script>
<script src="https://code.highcharts.com/stock/modules/exporting.js"></script>
<script type="text/javascript" src="https://www.highcharts.com/samples/data/usdeur.js"></script>

Upvotes: 0

Views: 207

Answers (1)

ppotaczek
ppotaczek

Reputation: 39069

All the blue lines are created by one svg path element. The only way to change a navigator outline is to wrap the function responsible for drawing it and change its path.

For example:

(function(H) {
  H.wrap(H.Navigator.prototype, 'drawOutline', function(procced, zoomedMin, zoomedMax, inverted, verb) {
    var navigator = this,
      maskInside = navigator.navigatorOptions.maskInside,
      outlineWidth = navigator.outline.strokeWidth(),
      halfOutline = outlineWidth / 2,
      outlineCorrection = (outlineWidth % 2) / 2, // #5800
      outlineHeight = navigator.outlineHeight,
      scrollbarHeight = navigator.scrollbarHeight,
      navigatorSize = navigator.size,
      left = navigator.left - scrollbarHeight,
      navigatorTop = navigator.top,
      verticalMin,
      path;

    if (inverted) {
      left -= halfOutline;
      verticalMin = navigatorTop + zoomedMax + outlineCorrection;
      zoomedMax = navigatorTop + zoomedMin + outlineCorrection;

      path = [
        'M',
        left + outlineHeight,
        navigatorTop - scrollbarHeight - outlineCorrection, // top edge
        'L',
        left + outlineHeight,
        verticalMin, // top right of zoomed range
        'L',
        left,
        verticalMin, // top left of z.r.
        'L',
        left,
        zoomedMax, // bottom left of z.r.
        'L',
        left + outlineHeight,
        zoomedMax, // bottom right of z.r.
        'L',
        left + outlineHeight,
        navigatorTop + navigatorSize + scrollbarHeight // bottom edge
      ].concat(maskInside ? [
        'M',
        left + outlineHeight,
        verticalMin - halfOutline, // upper left of zoomed range
        'L',
        left + outlineHeight,
        zoomedMax + halfOutline // upper right of z.r.
      ] : []);
    } else {
      zoomedMin += left + scrollbarHeight - outlineCorrection;
      zoomedMax += left + scrollbarHeight - outlineCorrection;
      navigatorTop += halfOutline;

      path = [
        'M',
        zoomedMin,
        navigatorTop, // upper left of zoomed range
        'L',
        zoomedMin,
        navigatorTop + outlineHeight, // lower left of z.r.
        'L',
        zoomedMax,
        navigatorTop + outlineHeight, // lower right of z.r.
        'L',
        zoomedMax,
        navigatorTop, // upper right of z.r.
      ].concat(maskInside ? [
        'M',
        zoomedMin - halfOutline,
        navigatorTop, // upper left of zoomed range
        'L',
        zoomedMax + halfOutline,
        navigatorTop // upper right of z.r.
      ] : []);
    }
    navigator.outline[verb]({
      d: path
    });

  });
}(Highcharts));

Live example: https://jsfiddle.net/BlackLabel/Lrgok19a/

Useful thread: https://www.highcharts.com/forum/viewtopic.php?t=41155

Upvotes: 2

Related Questions