github.com/piotrnar/gocoin@v0.0.0-20240512203912-faa0448c5e96/client/www/resources/jquery.flot.crosshair.js (about)

     1  /* Flot plugin for showing crosshairs when the mouse hovers over the plot.
     2  
     3  Copyright (c) 2007-2014 IOLA and Ole Laursen.
     4  Licensed under the MIT license.
     5  
     6  The plugin supports these options:
     7  
     8  	crosshair: {
     9  		mode: null or "x" or "y" or "xy"
    10  		color: color
    11  		lineWidth: number
    12  	}
    13  
    14  Set the mode to one of "x", "y" or "xy". The "x" mode enables a vertical
    15  crosshair that lets you trace the values on the x axis, "y" enables a
    16  horizontal crosshair and "xy" enables them both. "color" is the color of the
    17  crosshair (default is "rgba(170, 0, 0, 0.80)"), "lineWidth" is the width of
    18  the drawn lines (default is 1).
    19  
    20  The plugin also adds four public methods:
    21  
    22    - setCrosshair( pos )
    23  
    24      Set the position of the crosshair. Note that this is cleared if the user
    25      moves the mouse. "pos" is in coordinates of the plot and should be on the
    26      form { x: xpos, y: ypos } (you can use x2/x3/... if you're using multiple
    27      axes), which is coincidentally the same format as what you get from a
    28      "plothover" event. If "pos" is null, the crosshair is cleared.
    29  
    30    - clearCrosshair()
    31  
    32      Clear the crosshair.
    33  
    34    - lockCrosshair(pos)
    35  
    36      Cause the crosshair to lock to the current location, no longer updating if
    37      the user moves the mouse. Optionally supply a position (passed on to
    38      setCrosshair()) to move it to.
    39  
    40      Example usage:
    41  
    42  	var myFlot = $.plot( $("#graph"), ..., { crosshair: { mode: "x" } } };
    43  	$("#graph").bind( "plothover", function ( evt, position, item ) {
    44  		if ( item ) {
    45  			// Lock the crosshair to the data point being hovered
    46  			myFlot.lockCrosshair({
    47  				x: item.datapoint[ 0 ],
    48  				y: item.datapoint[ 1 ]
    49  			});
    50  		} else {
    51  			// Return normal crosshair operation
    52  			myFlot.unlockCrosshair();
    53  		}
    54  	});
    55  
    56    - unlockCrosshair()
    57  
    58      Free the crosshair to move again after locking it.
    59  */
    60  
    61  (function ($) {
    62      var options = {
    63          crosshair: {
    64              mode: null, // one of null, "x", "y" or "xy",
    65              color: "rgba(170, 0, 0, 0.80)",
    66              lineWidth: 1
    67          }
    68      };
    69      
    70      function init(plot) {
    71          // position of crosshair in pixels
    72          var crosshair = { x: -1, y: -1, locked: false };
    73  
    74          plot.setCrosshair = function setCrosshair(pos) {
    75              if (!pos)
    76                  crosshair.x = -1;
    77              else {
    78                  var o = plot.p2c(pos);
    79                  crosshair.x = Math.max(0, Math.min(o.left, plot.width()));
    80                  crosshair.y = Math.max(0, Math.min(o.top, plot.height()));
    81              }
    82              
    83              plot.triggerRedrawOverlay();
    84          };
    85          
    86          plot.clearCrosshair = plot.setCrosshair; // passes null for pos
    87          
    88          plot.lockCrosshair = function lockCrosshair(pos) {
    89              if (pos)
    90                  plot.setCrosshair(pos);
    91              crosshair.locked = true;
    92          };
    93  
    94          plot.unlockCrosshair = function unlockCrosshair() {
    95              crosshair.locked = false;
    96          };
    97  
    98          function onMouseOut(e) {
    99              if (crosshair.locked)
   100                  return;
   101  
   102              if (crosshair.x != -1) {
   103                  crosshair.x = -1;
   104                  plot.triggerRedrawOverlay();
   105              }
   106          }
   107  
   108          function onMouseMove(e) {
   109              if (crosshair.locked)
   110                  return;
   111                  
   112              if (plot.getSelection && plot.getSelection()) {
   113                  crosshair.x = -1; // hide the crosshair while selecting
   114                  return;
   115              }
   116                  
   117              var offset = plot.offset();
   118              crosshair.x = Math.max(0, Math.min(e.pageX - offset.left, plot.width()));
   119              crosshair.y = Math.max(0, Math.min(e.pageY - offset.top, plot.height()));
   120              plot.triggerRedrawOverlay();
   121          }
   122          
   123          plot.hooks.bindEvents.push(function (plot, eventHolder) {
   124              if (!plot.getOptions().crosshair.mode)
   125                  return;
   126  
   127              eventHolder.mouseout(onMouseOut);
   128              eventHolder.mousemove(onMouseMove);
   129          });
   130  
   131          plot.hooks.drawOverlay.push(function (plot, ctx) {
   132              var c = plot.getOptions().crosshair;
   133              if (!c.mode)
   134                  return;
   135  
   136              var plotOffset = plot.getPlotOffset();
   137              
   138              ctx.save();
   139              ctx.translate(plotOffset.left, plotOffset.top);
   140  
   141              if (crosshair.x != -1) {
   142                  var adj = plot.getOptions().crosshair.lineWidth % 2 ? 0.5 : 0;
   143  
   144                  ctx.strokeStyle = c.color;
   145                  ctx.lineWidth = c.lineWidth;
   146                  ctx.lineJoin = "round";
   147  
   148                  ctx.beginPath();
   149                  if (c.mode.indexOf("x") != -1) {
   150                      var drawX = Math.floor(crosshair.x) + adj;
   151                      ctx.moveTo(drawX, 0);
   152                      ctx.lineTo(drawX, plot.height());
   153                  }
   154                  if (c.mode.indexOf("y") != -1) {
   155                      var drawY = Math.floor(crosshair.y) + adj;
   156                      ctx.moveTo(0, drawY);
   157                      ctx.lineTo(plot.width(), drawY);
   158                  }
   159                  ctx.stroke();
   160              }
   161              ctx.restore();
   162          });
   163  
   164          plot.hooks.shutdown.push(function (plot, eventHolder) {
   165              eventHolder.unbind("mouseout", onMouseOut);
   166              eventHolder.unbind("mousemove", onMouseMove);
   167          });
   168      }
   169      
   170      $.plot.plugins.push({
   171          init: init,
   172          options: options,
   173          name: 'crosshair',
   174          version: '1.0'
   175      });
   176  })(jQuery);