-
-
Notifications
You must be signed in to change notification settings - Fork 1.9k
Allow toggling legend to show just 1 series (or group) by double clicking #1432
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 1 commit
afeaf5e
895ba89
afcf4f4
c5a2ff8
fb37088
1fe3b08
edc30ac
a927b9f
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -329,9 +329,31 @@ module.exports = function draw(gd) { | |
xf = dragElement.align(newX, 0, gs.l, gs.l + gs.w, opts.xanchor); | ||
yf = dragElement.align(newY, 0, gs.t + gs.h, gs.t, opts.yanchor); | ||
}, | ||
doneFn: function(dragged) { | ||
doneFn: function(dragged, numClicks, e) { | ||
if(dragged && xf !== undefined && yf !== undefined) { | ||
Plotly.relayout(gd, {'legend.x': xf, 'legend.y': yf}); | ||
} else { | ||
var traces = [], | ||
clickedTrace; | ||
fullLayout._infolayer.selectAll('g.traces').each(function() { d3.select(this).call(function() { traces.push(this); }); }); | ||
for(var i = 0; i < traces.length; i++) { | ||
var tracei = traces[i]; | ||
var p = tracei[0][0].getBoundingClientRect(); | ||
if(e.clientX >= p.left && e.clientX <= p.right && e.clientY >= p.top && e.clientY <= p.bottom) { | ||
clickedTrace = tracei; | ||
break; | ||
} | ||
} | ||
if(clickedTrace) { | ||
if(numClicks === 1) { | ||
legend._clickTimeout = setTimeout(function() { handleClick(clickedTrace, gd, numClicks); }, 300); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Caught again. Didn't have it in the right scope, hardcoded to unblock for a bit and forgot all about it. |
||
} else if(numClicks === 2) { | ||
if(legend._clickTimeout) { | ||
clearTimeout(legend._clickTimeout); | ||
} | ||
handleClick(clickedTrace, gd, numClicks); | ||
} | ||
} | ||
} | ||
} | ||
}); | ||
|
@@ -426,7 +448,7 @@ function setupTraceToggle(g, gd) { | |
} | ||
}); | ||
traceToggle.on('mouseup', function() { | ||
if(gd._dragged) return; | ||
if(gd._dragged || gd._editing) return; | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I'd like to get @etpinard 's take on this, but my feeling is we don't want to introduce another Also it's not clear to me that the right course of action is to quit the new handler if we're editing something else. I wonder if it would work to instead make a helper to ensure the edit box's blur handler gets called as it should? Honestly I don't understand why that's not already happening, but what if we just made a helper (as an export of
If what the user did was clicked on the editable item accidentally, then wanted to move on to the interaction they really intended, quitting here will just add an extra click for them, and I guess there could be weird side-effects if you type something in an edit box, then go click somewhere else, such that before the new handler can execute the plot has to redraw. The most extreme case I think would be if you have the legend off the right side, then you edit some legend text and make it longer, and we auto-expand the plot margin to accommodate it. That results in a very aggressive redraw that might actually delete and recreate the whole rest of the plot (not very d3-idiomatic, I know... we're working on it!). Would need a bit of playing around to see if that would cause any problems... There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I'll admit that blocking other interactions while the edit to go on was more of a secondary benefit to introducing this - the primary motivation was that it served as a way to prevent the When the traceToggle use to use If there's a suggestion on how to prevent both actions from firing, I can remove this flag and leave the question on how interactions should be dealt with generally to another ticket. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @alexcjohnson made some valid points above. But as With regards to adding another There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Good call @etpinard - we'll dig into this a little more with #1437 but @rpaskowitz lets keep it as is for this PR. |
||
var legend = gd._fullLayout.legend; | ||
|
||
if((new Date()).getTime() - gd._legendMouseDownTime > DBLCLICKDELAY) { | ||
|
@@ -445,6 +467,7 @@ function setupTraceToggle(g, gd) { | |
} | ||
|
||
function handleClick(g, gd, numClicks) { | ||
if(gd._dragged || gd._editing) return; | ||
var hiddenSlices = gd._fullLayout.hiddenlabels ? | ||
gd._fullLayout.hiddenlabels.slice() : | ||
[]; | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This is a funny pattern... the two
this
's got me totally confused at first. Can't you just do something like:There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I wrestled with this piece for a while. Your way definitely looks cleaner, but I think may need a slight adjustment since what comes back from the
selectAll
isn't the full object and would still need to be passed tod3.select()
in order to get the rightg
that works withinhandleClick()