plot icon indicating copy to clipboard operation
plot copied to clipboard

Pointer should ignore clicks on other marks

Open mootari opened this issue 11 months ago • 3 comments

Consider the following example where a bar mark is used to highlight and pick selections, with a dot mark on top that has external links.

Clicking on any of the dots (either left click to open the link directly, or right click to open the context menu) will also pin the pointer selection.

Plot.plot({
  marks: [
    Plot.barY("abcd", Plot.pointerX({x: d => d, fill: "#eee", maxRadius: Infinity})),
    Plot.dotX("abcd", {r: 30, fill: d => d, href: d => `https://google.com/?q=${d}`})
  ],
})
Image

As an aside, the pointerdown handler should perhaps only respond to "pure" left clicks (button=0 and no modifier keys pressed).

mootari avatar Mar 14 '25 13:03 mootari

related: #1832

Fil avatar Mar 14 '25 13:03 Fil

... I guess this request is largely incompatible with how Pointer is currently implemented, given that it is point/proximity based and has no notion of event targets?

Workaround to exclude a single mark:

Plot.plot({
  marks: [
    Plot.barY("abcd", Plot.pointerX({x: d => d, fill: "#eee", maxRadius: Infinity})),
    Plot.dotX("abcd", {r: 30, fill: d => d, href: d => `https://google.com/?q=${d}`, render(...args) {
      const ret = args.pop().apply(this, args);
      ret.addEventListener("pointerdown", e => e.stopPropagation());
      return ret;
    }})
  ],
})

mootari avatar Mar 14 '25 13:03 mootari

Alternative workaround that's a bit more flexible: https://observablehq.com/@mootari/plot-group

mootari avatar Mar 14 '25 17:03 mootari