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

fix(StyledText): add ability to unset style (issue #9578) #9597

Merged
merged 12 commits into from
Jan 21, 2024

Conversation

asturur
Copy link
Member

@asturur asturur commented Jan 14, 2024

Description

closes #9578

_setSelectionStyles is behaving in a very confusing way.

_getSelectionStyle is the culprit but i m not touching it right now.
_getSelectionStyle returns a reference to the style object or a new empty one. The reference can also be to an empty object as well. So when you get an empty object you don't really know if is an actual reference or the original one.

Because of this we were checking if the returned object was empty, if it was we were anyway setting there a new empty object once again, so we would know that the text call would return a reference to the one we just created ( really strange ).

At that point we would use Object.assign to modify it.

This wasn't the bug actually, the bug is that if i pass fontSize: undefined i want to remove fontSize from the current style section and not merge an undefined value that breaks rendering.

In Action

Copy link

codesandbox bot commented Jan 14, 2024

Review or Edit in CodeSandbox

Open the branch in Web EditorVS CodeInsiders

Open Preview

Copy link
Contributor

github-actions bot commented Jan 14, 2024

Build Stats

file / KB (diff) bundled minified
fabric 907.897 (+0.382) 304.552 (-0.018)

@ShaMan123
Copy link
Contributor

Review or Edit in CodeSandbox

Open the branch in Web EditorVS CodeInsiders

Open Preview

This WORKS! I think I once the PR closes the links die, that is why it didn't work when I tried

Copy link
Contributor

@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.

Minor changes

src/shapes/Text/StyledText.ts Outdated Show resolved Hide resolved
Comment on lines 257 to 260
* if not style is set for a pre determined line or char, return a new object.
* this is tricky and confusing because when you get an empty object you can't
* determine if is a reference or a new one.
* @TODO this should return always a reference or always a clone, and if necessary undefined.
Copy link
Contributor

Choose a reason for hiding this comment

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

typos

* @param {Number} lineIndex
* @param {Number} charIndex
* @private
* @return {TextStyleDeclaration} style object a REFERENCE to the existing one or a new empty object
Copy link
Contributor

Choose a reason for hiding this comment

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

rephrase

@ShaMan123
Copy link
Contributor

I would say that the name setselectionStyles is more than confusing because it is actually accepting a single style.
I used the codesandbox app to test the bug fix. So fun!

@asturur
Copy link
Member Author

asturur commented Jan 20, 2024

@ShaMan123 could you re-review this one? i would not rename the method at this point, but let me know how you feel strongly about that object code.

ShaMan123
ShaMan123 previously approved these changes Jan 20, 2024
Copy link
Contributor

@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 PR name is confusing
I would say:
add ability to unset style

Comment on lines 197 to 202
// then delete what is undefined in styles from newStyle
Object.keys(style).forEach((key) => {
if (style[key as keyof TextStyleDeclaration] === undefined) {
delete newStyle[key as keyof TextStyleDeclaration];
}
});
Copy link
Contributor

Choose a reason for hiding this comment

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

I still don't like this
Could we use pick? filter? And have newStyle created correctly?

I am not a fan of Text and definitely not of TextStyles, so I prefer adding more straight forward code.

However, if you feel/think differently that is fine, let's move on. I have more important things to persist upon.

Copy link
Member Author

Choose a reason for hiding this comment

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

so newStyle is created correctly right now, you don't like the shape of the code that creates it.

if i use filter, i have to:

  • mix the 2 object together, creating a new one
  • use Entries, that is a loop + creation of an array
  • filter that returns the new list of entries we want to keep
  • fromEntries that create a new object from the filtered list

this is more compact, but i can't call it more straight forward at all:

 Object.fromEntries(Object.entries({
    ...this._getStyleDeclaration(lineIndex, charIndex),
    ...style,
  }).filter(([key, value]) => value !== undefined));

I can change it but you didn't mention what is unpreferable about the actual code.

The original comment was:

Since you are creating a new object I think it is better to filter out undefined beforehand instead of creating it and then deleting stuff

We are still creating a new object with all the stuff ( the spread statement ), then we are creating an array of arrays with all entries, a new one filtered, then we are creating a new object once again.

Is that you don't want to carry over an object on which has been used the delete keyword?

Copy link
Member Author

@asturur asturur Jan 21, 2024

Choose a reason for hiding this comment

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

With pick is overly complicated, maybe pickBy?

Copy link
Member Author

Choose a reason for hiding this comment

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

pickby gives us a negative code size and probably the same speed, while the fromEntries <-> toEntries is definetely worse on both aspects

Copy link
Contributor

Choose a reason for hiding this comment

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

pickBy,yes

Copy link
Contributor

Choose a reason for hiding this comment

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

nice!

Comment on lines +256 to +260
* Get a reference, not a clone, to the style object for a given character,
* if no style is set for a line or char, return a new empty object.
* This is tricky and confusing because when you get an empty object you can't
* determine if it is a reference or a new one.
* @TODO this should always return a reference or always a clone or undefined when necessary.
Copy link
Contributor

Choose a reason for hiding this comment

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

good comment
bad design

Copy link
Member Author

Choose a reason for hiding this comment

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

yes we have a TODO to fix it. Fixing it now has a lot of subtle consequences i don't want to think of

@asturur asturur changed the title fix(StyledText): add ability to delete style (issue #9578) fix(StyledText): add ability to unset style (issue #9578) Jan 21, 2024
@asturur
Copy link
Member Author

asturur commented Jan 21, 2024

Addressed the comments that were added post approval

Copy link
Contributor

Coverage after merging set-selection-styles into master will be

82.76%

Coverage Report
FileStmtsBranchesFuncsLinesUncovered Lines
index.node.ts14.29%100%0%25%23, 26, 29, 41, 44, 47
src
   ClassRegistry.ts100%100%100%100%
   Collection.ts94.85%94.83%87.10%97.14%109, 112, 215–216, 241–242
   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.ts74.14%65%66.67%82.76%131, 139, 139, 139, 139, 139–141, 152–154, 30
   constants.ts100%100%100%100%
src/LayoutManager
   LayoutManager.ts87.50%89.29%76.92%90%133–134, 136–137, 137, 137, 137, 137, 231, 289–290, 301, 46
   constants.ts100%100%100%100%
src/LayoutManager/LayoutStrategies
   ClipPathLayout.ts82.05%72.22%100%88.89%30–31, 42, 54, 57–58, 65
   FitContentLayout.ts100%100%100%100%
   FixedLayout.ts20%0%0%40%20–21, 23, 23, 23, 23, 23
   LayoutStrategy.ts86%64.71%100%96.15%36, 43, 43, 43, 51, 71–72
   utils.ts91.67%85.71%100%100%28, 34
src/Pattern
   Pattern.ts90.54%93.94%80%90.32%119, 130, 139, 32, 36
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, 148, 148, 148–151, 153–156, 160–161, 163, 165–168, 17, 171, 178–179, 18, 181, 183–184, 186, 193–194, 196–197, 20, 200, 200, 207, 207, 21, 211, 22, 22, 22–24, 28, 32, 39, 46, 53, 60, 67, 84–86, 94–96, 98–99
src/canvas
   Canvas.ts78.66%77.04%82.14%79.33%1001–1003, 1006–1007, 1011–1012, 1123–1125, 1128–1129, 1202, 1314, 1435, 158, 183, 289, 289–294, 299, 322–323, 328–333, 353, 353, 353–354, 354, 354–355, 363, 368–369, 369, 369–370, 372, 381, 387–388, 388, 388, 42, 431, 439, 443, 443, 443–444, 446, 46, 528–529, 529, 529–530, 536, 536, 536–538, 558, 560, 560, 560–561, 561, 561, 564, 564, 564–565, 568, 577–578, 580–581, 583, 583–584, 586–587, 599–600, 600, 600–601, 603–608, 614, 621, 658, 658, 658, 660, 662–667, 673, 679, 679, 679–680, 682, 685, 690, 703, 731, 783–784, 784, 784, 784, 784, 784, 787–788, 791, 791–793, 796–797, 879, 886, 886, 886, 899, 928–929, 929, 929–931, 934–935, 935, 935, 937, 945, 945, 945–947, 947, 947, 954–955, 963–964, 964, 964–965, 971, 973
   CanvasOptions.ts100%100%100%100%
   SelectableCanvas.ts90.22%87.30%94.55%91.74%1004, 1012, 1123, 1125, 1127–1128, 1199, 1220–1221, 1239–1240, 460–461, 463–464, 464, 464, 513–514, 591, 596, 666, 671–672, 699–700, 724, 727–730, 730, 730–731, 731, 731, 737–738, 740, 760–761, 766–770, 772, 807–808, 811, 811, 811–812, 931, 931–932, 935, 955, 955
   StaticCanvas.ts96.51%93.04%98.91%98.28%1014, 1024, 1075–1077, 1080, 1115–1116, 1192, 1201, 1201, 1205, 1205, 1252–1253, 179–180, 196, 554, 566–567, 897–898, 898, 898–899
   StaticCanvasOptions.ts100%100%100%100%
   TextEditingManager.ts86%71.43%91.67%91.67%17, 17, 17–18, 18, 18
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.ts10.87%0%0%16.13%114, 114, 114, 114, 114, 116–119, 119, 122, 129, 24–26, 50–52, 58–59, 61, 71, 77–79, 79, 81, 84, 86, 90–92, 94, 99
   rotate.ts19.57%12.50%50%21.43%41, 45, 51, 51, 51–52, 55–57, 59, 59

@asturur asturur merged commit e758506 into master Jan 21, 2024
22 checks passed
@asturur asturur deleted the set-selection-styles branch January 21, 2024 15:32
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

[Bug]: SetSelectionStyles can't delete style properties
2 participants