Skip to content

Commit

Permalink
Merge pull request #2748 from microsoft/u/juliaroldi/add-image-edit
Browse files Browse the repository at this point in the history
Add LegacyImageSelection
  • Loading branch information
juliaroldi authored Jul 18, 2024
2 parents f704988 + 2ed1610 commit 2db36de
Show file tree
Hide file tree
Showing 3 changed files with 90 additions and 26 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,11 @@ import type {
TableSelectionInfo,
TableCellCoordinate,
RangeSelection,
MouseUpEvent,
} from 'roosterjs-content-model-types';

const MouseLeftButton = 0;
const MouseMiddleButton = 1;
const MouseRightButton = 2;
const Up = 'ArrowUp';
const Down = 'ArrowDown';
Expand Down Expand Up @@ -140,7 +142,7 @@ class SelectionPlugin implements PluginWithState<SelectionPluginState> {
break;

case 'mouseUp':
this.onMouseUp();
this.onMouseUp(this.editor, event);
break;

case 'keyDown':
Expand All @@ -164,30 +166,46 @@ class SelectionPlugin implements PluginWithState<SelectionPluginState> {
let image: HTMLImageElement | null;

// Image selection
if (
selection?.type == 'image' &&
(rawEvent.button == MouseLeftButton ||
(rawEvent.button == MouseRightButton &&
!this.getClickingImage(rawEvent) &&
!this.getContainedTargetImage(rawEvent, selection)))
) {
this.setDOMSelection(null /*domSelection*/, null /*tableSelection*/);
}
if (editor.isExperimentalFeatureEnabled('LegacyImageSelection')) {
if (
rawEvent.button === MouseRightButton &&
(image =
this.getClickingImage(rawEvent) ??
this.getContainedTargetImage(rawEvent, selection)) &&
image.isContentEditable
) {
this.selectImageWithRange(image, rawEvent);
return;
} else if (selection?.type == 'image' && selection.image !== rawEvent.target) {
this.selectBeforeOrAfterElement(editor, selection.image);
return;
}
} else {
if (
selection?.type == 'image' &&
(rawEvent.button == MouseLeftButton ||
(rawEvent.button == MouseRightButton &&
!this.getClickingImage(rawEvent) &&
!this.getContainedTargetImage(rawEvent, selection)))
) {
this.setDOMSelection(null /*domSelection*/, null /*tableSelection*/);
}

if (
(image =
this.getClickingImage(rawEvent) ??
this.getContainedTargetImage(rawEvent, selection)) &&
image.isContentEditable
) {
this.setDOMSelection(
{
type: 'image',
image: image,
},
null
);
return;
if (
(image =
this.getClickingImage(rawEvent) ??
this.getContainedTargetImage(rawEvent, selection)) &&
image.isContentEditable
) {
this.setDOMSelection(
{
type: 'image',
image: image,
},
null
);
return;
}
}

// Table selection
Expand Down Expand Up @@ -228,6 +246,25 @@ class SelectionPlugin implements PluginWithState<SelectionPluginState> {
}
}

private selectImageWithRange(image: HTMLImageElement, event: Event) {
const range = image.ownerDocument.createRange();
range.selectNode(image);

const domSelection = this.editor?.getDOMSelection();
if (domSelection?.type == 'image' && image == domSelection.image) {
event.preventDefault();
} else {
this.setDOMSelection(
{
type: 'range',
isReverted: false,
range,
},
null
);
}
}

private onMouseMove = (event: Event) => {
if (this.editor && this.state.tableSelection) {
const hasTableSelection = !!this.state.tableSelection.lastCo;
Expand Down Expand Up @@ -288,7 +325,21 @@ class SelectionPlugin implements PluginWithState<SelectionPluginState> {
}
};

private onMouseUp() {
private onMouseUp(editor: IEditor, event: MouseUpEvent) {
let image: HTMLImageElement | null;

if (
editor.isExperimentalFeatureEnabled('LegacyImageSelection') &&
(image = this.getClickingImage(event.rawEvent)) &&
image.isContentEditable &&
event.rawEvent.button != MouseMiddleButton &&
(event.rawEvent.button ==
MouseRightButton /* it's not possible to drag using right click */ ||
event.isClicking)
) {
this.selectImageWithRange(image, event.rawEvent);
}

this.detachMouseEvent();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -370,6 +370,9 @@ describe('SelectionPlugin handle image selection', () => {
getColorManager: () => ({
getDarkColor: (color: string) => `${DEFAULT_DARK_COLOR_SUFFIX_COLOR}${color}`,
}),
isExperimentalFeatureEnabled: () => {
return false;
},
} as any;
plugin = createSelectionPlugin({});
plugin.initialize(editor);
Expand Down Expand Up @@ -765,6 +768,9 @@ describe('SelectionPlugin handle table selection', () => {
}
},
announce: announceSpy,
isExperimentalFeatureEnabled: () => {
return false;
},
} as any;
plugin = createSelectionPlugin({});
plugin.initialize(editor);
Expand Down Expand Up @@ -2246,6 +2252,9 @@ describe('SelectionPlugin on Safari', () => {
getColorManager: () => ({
getDarkColor: (color: string) => `${DEFAULT_DARK_COLOR_SUFFIX_COLOR}${color}`,
}),
isExperimentalFeatureEnabled: () => {
return false;
},
} as any) as IEditor;
});

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,8 @@ export type ExperimentalFeature =
* When this feature is enabled, we will persist a content model in memory as long as we can,
* and use cached element when write back if it is not changed.
*/
'PersistCache';
| 'PersistCache'
/**
* Workaround for the Legacy Image Edit
*/
| 'LegacyImageSelection';

0 comments on commit 2db36de

Please sign in to comment.