From 42ef3a821b1eef1bec167aefba4633f5b8347a8b Mon Sep 17 00:00:00 2001 From: guchigow Date: Wed, 18 Dec 2024 18:58:27 +0500 Subject: [PATCH] #4533 - After inserting a nucleotide in the Text-editing mode, the cursor blinks in the wrong place --- .../src/application/editor/modes/SequenceMode.ts | 10 ++++++++-- .../render/renderers/sequence/SequenceRenderer.ts | 4 ++++ .../ketcher-core/src/domain/entities/BaseMonomer.ts | 5 +++++ 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/packages/ketcher-core/src/application/editor/modes/SequenceMode.ts b/packages/ketcher-core/src/application/editor/modes/SequenceMode.ts index afebe22d5c..24ea7d2018 100644 --- a/packages/ketcher-core/src/application/editor/modes/SequenceMode.ts +++ b/packages/ketcher-core/src/application/editor/modes/SequenceMode.ts @@ -1040,8 +1040,7 @@ export class SequenceMode extends BaseMode { const currentSequence = SequenceRenderer.currentChain; const currentSequenceHasPhosphate = - currentSequence?.lastNonEmptyNode?.monomer?.monomerItem?.props?.Name === - 'Phosphate'; + currentSequence?.lastNonEmptyNode?.monomer?.isPhosphate; let nextCaretPosition = SequenceRenderer.caretPosition + chainsCollection.length; @@ -1050,6 +1049,13 @@ export class SequenceMode extends BaseMode { nextCaretPosition -= 1; } + const hasPhosphateAtChainEnd = + chainsCollection?.lastNode?.monomer?.isPhosphate; + + if (!SequenceRenderer.isCaretAtChainEnd && hasPhosphateAtChainEnd) { + nextCaretPosition -= 1; + } + const modelChanges = this.insertNewSequenceFragment(chainsCollection); modelChanges.addOperation(new ReinitializeModeOperation()); diff --git a/packages/ketcher-core/src/application/render/renderers/sequence/SequenceRenderer.ts b/packages/ketcher-core/src/application/render/renderers/sequence/SequenceRenderer.ts index 48f9448f73..02de9ed942 100644 --- a/packages/ketcher-core/src/application/render/renderers/sequence/SequenceRenderer.ts +++ b/packages/ketcher-core/src/application/render/renderers/sequence/SequenceRenderer.ts @@ -945,4 +945,8 @@ export class SequenceRenderer { SequenceRenderer.chainsCollection.firstNode instanceof EmptySequenceNode ); } + + public static get isCaretAtChainEnd() { + return SequenceRenderer.currentEdittingNode instanceof EmptySequenceNode; + } } diff --git a/packages/ketcher-core/src/domain/entities/BaseMonomer.ts b/packages/ketcher-core/src/domain/entities/BaseMonomer.ts index 6b9f4ede91..1c686bee69 100644 --- a/packages/ketcher-core/src/domain/entities/BaseMonomer.ts +++ b/packages/ketcher-core/src/domain/entities/BaseMonomer.ts @@ -13,6 +13,7 @@ import assert from 'assert'; import { IKetAttachmentPoint, IKetAttachmentPointType, + KetMonomerClass, } from 'application/formatters/types/ket'; import { RnaSubChain } from 'domain/entities/monomer-chains/RnaSubChain'; import { ChemSubChain } from 'domain/entities/monomer-chains/ChemSubChain'; @@ -329,6 +330,10 @@ export abstract class BaseMonomer extends DrawingEntity { return this.attachmentPointsToBonds[attachmentPointName] !== undefined; } + public get isPhosphate() { + return this.monomerItem?.props?.MonomerClass === KetMonomerClass.Phosphate; + } + public get usedAttachmentPointsNamesList() { const list: AttachmentPointName[] = [];