Skip to content
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

feat(Canvas): provide correctly named canvas pointer methods. BREAKING: rm _normalizePointer, restorePointerVpt #9175

Merged
merged 34 commits into from
Nov 4, 2023

Conversation

ShaMan123
Copy link
Contributor

@ShaMan123 ShaMan123 commented Aug 25, 2023

Motivation

This PR adds 2 new methods to get a point from a mouse event and tries to remove the confusion about pointer and absolutePointer.

After much discussion we ended up renaming:

-scenePoint (before absolutePointer) a point that is the fabricCanvas plane, the one in which you measure object.top and object.left of an object added in the canvas.

-viewportPoint (before pointer) a point in the viewport coordinate, for which the point 0,0 is the top left corner of the canvas container, while canvas.width, canvas.height is the bottom right corner of the canvas container ( because of retina scaling i avoid on purpose of talking about the HTMLCanvasElement )

canvas.getPointer(event, ignoreVpt) becomes canvas.getPointer(event, fromViewport) and becomes deprecated, will be moved to protected or private next major version.
Developers are directed to use:
canvas.getViewportPoint(event) for canvas.getPointer(event, true)
and
canvas.getScenePoint(event) for canvas.getPointer(event, false)

All the events that were emitted with pointer and absolutePointer still are doing so, those event properties are deprecated and the new scenePoint takes the place of absolutePointer and viewportPoint takes the place of pointer.

restorePointerVpt has been removed and also transformPointRelativeToCanvas in favor of sendPointToPlane

@github-actions
Copy link
Contributor

github-actions bot commented Aug 25, 2023

Build Stats

file / KB (diff) bundled minified
fabric 910.338 (-1.419) 305.076 (-0.369)

not a single test to account for
@ShaMan123 ShaMan123 changed the title patch(Canvas): rm _normalizePointer, restorePointerVpt fix(Canvas): getPointer bug, rm _normalizePointer, restorePointerVpt Aug 25, 2023
@ShaMan123 ShaMan123 requested a review from asturur August 25, 2023 09:34
@ShaMan123 ShaMan123 changed the title fix(Canvas): getPointer bug, rm _normalizePointer, restorePointerVpt fix(Canvas): getPointer usage bugs, rm _normalizePointer, restorePointerVpt Aug 25, 2023
Copy link
Contributor Author

@ShaMan123 ShaMan123 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

OMG that slipped under the radar
@jiayihu could this be the reason for the very strange outputs in tests?

Comment on lines 933 to 934
pointer: this.getHTMLPointFromEvent(e),
absolutePointer: this.getCanvasPointFromEvent(e),
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

an example of the bug

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Comment on lines 779 to 781
// http://www.geog.ubc.ca/courses/klink/gis.notes/ncgia/u32.html
// http://idav.ucdavis.edu/~okreylos/TAship/Spring2000/PointInPolygon.html
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

link are DEAD

Comment on lines 796 to 801
? sendPointToPlane(
pointer,
invertTransform(this.viewportTransform),
objToCheck.group.calcTransformMatrix()
)
: pointer;
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

look at this
sending a pointer in the canvas/object plane if under group or sending a pointer in the HTML plane if not
BUG BUG BUG
I remembered when rewriting group I could not grasp containsPoint, now I do. A complete mess.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

How the bug manifest? The fact that the code is not your liking doesn't mean is bugged.

Copy link
Contributor Author

@ShaMan123 ShaMan123 Aug 26, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It does.
The method accepts points in different cases, under group with viewportTransform removed from the point and if not under group then the point in the html plane.
If that is not a bug in design I do not now what a bug is.
I do not plan to touch this because #8767 fixed that and I am tired of getting back to things I fixed

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It is a bug because I can't use containsPoint, no one can without copying this code because it makes no sense

Update SelectableCanvas.ts

Update SelectableCanvas.ts
Copy link
Contributor Author

@ShaMan123 ShaMan123 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@asturur this is critical before v6
I imagine we should add tests

src/canvas/Canvas.ts Outdated Show resolved Hide resolved
@jiayihu
Copy link
Contributor

jiayihu commented Aug 25, 2023

I imagine we should add tests

Yes, tests for something so important should be there. This is the base of many interactions an application can build on top of the canvas.

Copy link
Contributor Author

@ShaMan123 ShaMan123 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

the sanpshot show clearly we need to expose a method that prepares the event data for consistency

leanup

Update eventData.test.ts
Copy link
Contributor Author

@ShaMan123 ShaMan123 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

event data is TESTED
This PR can merge

src/util/dom_misc.ts Outdated Show resolved Hide resolved
jest.setup.ts Outdated Show resolved Hide resolved
@asturur
Copy link
Member

asturur commented Aug 25, 2023

Please add a description showcase of the bug. What the bug was? how did you find it?
containspoint was doing stuff that you assumed was other stuff, and now we scream BUG BUG BUG MESS MESS MESS the code is not understandable.
The truth is that all the changes that have been done in the name of improving something else changed the meaning of those functions, containsPoint was strictly used for checking targets on mouse.

* the same plane as the plane {@link FabricObject#getCenterPoint} exists in
* @return {Point}
*/
protected getPointer(e: TPointerEvent, inHTMLPlane = false): Point {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

please restore getPointer as normal method, we are not adding another migration headache to devs.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

you mean remove the protected keyword?

Copy link
Contributor Author

@ShaMan123 ShaMan123 Aug 26, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I can do that.
As I see it it is a present for the dev.
TS will warn them about it. Then they can read the comment and decide if to change it or not. It is not a must. But it might help devs when debugging a hard bug.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

image

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Apart from saving the devs, having it protected saves fabric devs - I care about that a lot.
But it is not a must if you disapprove

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

we can let it public and deprecated and later it will be protected with an internal name. we can't remove it now, i think i have hundreds of getPointer usage and so have others.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Very well

@ShaMan123
Copy link
Contributor Author

renamed.
final thing I need to understand - I will add a test for it.
Seems the calculation of the scene point is wrong because in getPointer it skips the last part of the retina normalization whereas in _cacheTransformEventData it does not

Copy link
Contributor Author

@ShaMan123 ShaMan123 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

renamed, rm transformPointRelativeToCanvas which is related to this mess

Update eventData.test.ts

Update Canvas.ts
Copy link
Contributor Author

@ShaMan123 ShaMan123 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

seems ready apart for the useless tests

@@ -855,7 +855,7 @@ export class Canvas extends SelectableCanvas implements CanvasOptions {
transform.target,
originalControl
);
pointer = pointer || this.getPointer(e);
pointer = pointer || this.getScenePoint(e);
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

seems redundant since we cache getScenePoint

Comment on lines 987 to 990
// this is an absolute pointer, the naming is wrong
const pointer = this.getPointer(e);
const pointer = this.getScenePoint(e);
this.freeDrawingBrush &&
this.freeDrawingBrush.onMouseDown(pointer, { e, pointer });
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

we should rename this as well when doing the absolutePointer rename

Comment on lines +1153 to +1154
this._pointer = this.getViewportPoint(e);
this._absolutePointer = sendPointToPlane(
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

also these should be renamed and maybe put into an object

src/canvas/Canvas.ts Outdated Show resolved Hide resolved
Copy link
Contributor Author

@ShaMan123 ShaMan123 Nov 3, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this test does not seem very useful

@ShaMan123
Copy link
Contributor Author

and now I pushed a regression

Copy link
Contributor Author

@ShaMan123 ShaMan123 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

test should pass now

Comment on lines +767 to +769
obj.containsPoint(
sendPointToPlane(pointer, undefined, this.viewportTransform),
true
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

keep this in mind for conflict resolution with #9395

@asturur
Copy link
Member

asturur commented Nov 4, 2023

ok i m merging.

@asturur asturur merged commit 7d0e39d into master Nov 4, 2023
9 checks passed
@asturur asturur deleted the rm-vpt-methods branch November 4, 2023 00:28
Copy link
Contributor

github-actions bot commented Nov 4, 2023

Coverage after merging rm-vpt-methods into master will be

82.92%

Coverage Report
FileStmtsBranchesFuncsLinesUncovered Lines
index.node.ts7.69%100%0%14.29%17, 20, 23, 35, 38, 41
src
   ClassRegistry.ts100%100%100%100%
   Collection.ts94.71%94.64%86.67%97.09%101, 104, 207–208, 233–234
   CommonMethods.ts96.55%87.50%100%100%9
   Intersection.ts100%100%100%100%
   Observable.ts87.76%85.29%87.50%89.58%134–135, 160–161, 32–33, 41, 50, 78, 89
   Point.ts100%100%100%100%
   Shadow.ts98.36%95.65%100%100%178
   cache.ts97.06%90%100%100%57
   config.ts75%66.67%66.67%82.76%130, 138, 138, 138, 138, 138–140, 151–153
   constants.ts100%100%100%100%
src/Pattern
   Pattern.ts92.31%91.89%90%93.55%119, 130, 139, 32, 95
src/brushes
   BaseBrush.ts100%100%100%100%
   CircleBrush.ts0%0%0%0%108, 108, 108, 110, 112, 114–116, 118–121, 128–129, 13, 136, 138, 23–24, 32–36, 40–44, 51–54, 62–66, 68, 76, 76, 76, 76, 76–77, 79, 79, 79–82, 84, 92–93, 95, 97–99
   PatternBrush.ts97.06%87.50%100%100%21
   PencilBrush.ts91.06%82.35%100%93.81%122–123, 152, 152–154, 176, 176, 276, 280, 285–286, 68–69, 84–85
   SprayBrush.ts0%0%0%0%107, 107, 107, 107, 107–108, 110–111, 118–119, 121, 123–127, 136, 140–141, 141, 149, 149, 149–152, 154–157, 161–162, 164, 166–169, 17, 172, 179, 18, 180, 182, 184–185, 187, 194–195, 197–198, 20, 201, 201, 208, 208, 21, 212, 22, 22, 22–24, 28, 32, 39, 46, 53, 60, 67, 84–86, 94–96, 98–99
src/canvas
   Canvas.ts78.99%76.67%83.05%80.04%1007, 1007, 1007–1009, 1009, 1009, 1016–1017, 1025–1026, 1026, 1026–1027, 1033, 1035, 1063–1065, 1068–1069, 1073–1074, 1197–1199, 1202–1203, 1276, 1393, 1515, 159, 184, 291–292, 295–299, 304, 327–328, 333–338, 358, 358, 358–359, 359, 359–360, 368, 373–374, 374, 374–375, 377, 386, 392–393, 393, 393, 43, 436, 444, 448, 448, 448–449, 451, 47, 533–534, 534, 534–535, 541, 541, 541–543, 563, 565, 565, 565–566, 566, 566, 569, 569, 569–570, 573, 582–583, 585–586, 588, 588–589, 591–592, 604–605, 605, 605–606, 608–613, 619, 626, 663, 663, 663, 665, 667–672, 678, 684, 684, 684–685, 687, 690, 695, 708, 736, 736, 797–798, 798, 798, 798, 798, 798, 801–802, 805, 805–807, 810–811, 887, 899, 906, 906, 906, 919, 952, 973–974, 990–991, 991, 991–993, 996–997, 997, 997, 999
   CanvasOptions.ts100%100%100%100%
   SelectableCanvas.ts94.34%91.94%94.34%96.21%1096, 1098, 1100–1101, 300, 470–471, 473–474, 474, 474, 523–524, 585–586, 599, 639–641, 673, 678–679, 706–707, 896, 896–897, 900, 920, 920, 969, 977
   StaticCanvas.ts96.78%93.09%100%98.53%1031, 1041, 1093–1094, 1097, 1132–1133, 1209, 1218, 1218, 1222, 1222, 1269–1270, 187–188, 204, 571, 583–584, 914–915, 915, 915–916
   StaticCanvasOptions.ts100%100%100%100%
   TextEditingManager.ts84.31%71.43%91.67%88%17–18, 18, 18–19, 19, 19
src/canvas/DOMManagers
   CanvasDOMManager.ts95.52%70%100%100%21–22, 29
   StaticCanvasDOMManager.ts97.50%88.89%100%100%33
   util.ts86.67%80.56%83.33%93.94%14, 26, 63–64, 67, 67, 74, 93–94
src/color
   Color.ts94.96%91.67%96.30%96.05%233, 258–259, 267–268, 48
   color_map.ts100%100%100%100%
   constants.ts100%100%100%100%
   util.ts85.71%76.92%100%89.74%55–56, 56, 58, 58, 58–59, 61–62, 89
src/controls
   Control.ts94.44%93.10%91.67%96.77%183, 249, 354
   changeWidth.ts100%100%100%100%
   commonControls.ts100%100%100%100%
   controlRendering.ts81.63%78%100%84.78%106, 111, 121, 121, 45, 50, 61, 61, 65–72, 81–82
   drag.ts100%100%100%100%
   fireEvent.ts88.89%75%100%100%13
   polyControl.ts7.25%0%0%13.51%103, 108, 120, 120, 120, 120, 120, 122–125, 125, 128, 135, 17, 25–29, 29, 29, 29, 29, 29, 29, 29, 50–56, 56, 56, 56, 56, 58, 63–64, 66, 76, 82–84, 84, 86, 89–90, 90, 90, 90, 90, 92, 97
   rotate.ts19.57%12.50%50%21.43%41, 45, 51, 51, 51–52, 55–57, 59, 59, 59, 59, 59–61, 61, 61–63, 65, 65, 65–67, 67, 67–68, 73, 73, 73–74, 76, 78, 80–81
   scale.ts93.57%92.94%100%93.67%129–130, 132–134, 148–149, 181–183, 42
   scaleSkew.ts78.79%64.29%100%85.71%27, 29, 29, 29, 31, 33, 35
   skew.ts91.03%79.31%100%97.67%131–132, 163–164, 171, 177, 179
   util.ts100%100%100%100%
   wrapWithFireEvent.ts100%100%100%100%
   wrapWithFixedAnchor.ts100%100%100%100%
src/env
   

Comment on lines +133 to +146
/**
* @deprecated
* use viewportPoint instead.
* Kept for compatibility
*/
pointer: Point;
/**
* @deprecated
* use scenePoint instead.
* Kept for compatibility
*/
absolutePointer: Point;
scenePoint: Point;
viewportPoint: Point;
Copy link
Contributor Author

@ShaMan123 ShaMan123 Nov 4, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

the order is confusing

should have been

pointer,
absolutePointer,
viewportPoint,
scenePoint

OR

pointer,
viewportPoint,
absolutePointer,
scenePoint

It might seem petty or insignificant but IMO it isn't
A dev reading this code will be confused

Copy link
Contributor Author

@ShaMan123 ShaMan123 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You forgot the brushes

Comment on lines +27 to +35
const getEventPoints = (canvas: Canvas, e: TPointerEvent) => {
const viewportPoint = canvas.getViewportPoint(e);
const scenePoint = canvas.getScenePoint(e);
return {
viewportPoint,
scenePoint,
pointer: viewportPoint,
absolutePointer: scenePoint,
};
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

there is anotherthing I have been thinking of lately
Since we cache the points an event can do

scenePoint.x += 5

And cause a bug all across fabric so we should return a clone
I will PR

@jiayihu
Copy link
Contributor

jiayihu commented Nov 9, 2023

FWIW I think the final decision to use scene/viewport as names adds confusion because other parts of the codebase will use a different terminology. So at least another PR is needed so that the whole codebase uses a consistent naming for the same concept.

Screenshot 2023-11-09 at 11 40 18

@ShaMan123
Copy link
Contributor Author

#9483 has some jsdocs fixes including what you pointed out
After searching there are 4 usages of canvas plane that can be turned into scene plane but that seems minor

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants