Skip to content

Commit

Permalink
- added sync mode
Browse files Browse the repository at this point in the history
- fixed spacers nodes in sequence mode
  • Loading branch information
rrodionov91 committed Feb 27, 2025
1 parent 2d534f6 commit 04fc0ef
Show file tree
Hide file tree
Showing 9 changed files with 270 additions and 28 deletions.
18 changes: 18 additions & 0 deletions packages/ketcher-core/src/application/editor/Editor.ts
Original file line number Diff line number Diff line change
Expand Up @@ -391,6 +391,10 @@ export class CoreEditor {
this.events.changeSequenceTypeEnterMode.add((mode: SequenceType) =>
this.onChangeSequenceTypeEnterMode(mode),
);
this.events.toggleIsSequenceSyncEditMode.add(
(isSequenceSyncEditMode: boolean) =>
this.onChangeToggleIsSequenceSyncEditMode(isSequenceSyncEditMode),
);
this.events.createAntisenseChain.add(() => {
this.onCreateAntisenseChain();
});
Expand Down Expand Up @@ -455,6 +459,20 @@ export class CoreEditor {
this.sequenceTypeEnterMode = mode;
}

private onChangeToggleIsSequenceSyncEditMode(
isSequenceSyncEditMode: boolean,
) {
if (!(this.mode instanceof SequenceMode)) {
return;
}

if (isSequenceSyncEditMode) {
this.mode.turnOnIsSyncEditMode();
} else {
this.mode.turnOffIsSyncEditMode();
}
}

private onCreateAntisenseChain() {
const modelChanges = this.drawingEntitiesManager.createAntisenseChain();
const history = new EditorHistory(this);
Expand Down
2 changes: 2 additions & 0 deletions packages/ketcher-core/src/application/editor/editorEvents.ts
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ export interface IEditorEvents {
changeSequenceTypeEnterMode: Subscription;
toggleSequenceEditMode: Subscription;
toggleSequenceEditInRNABuilderMode: Subscription;
toggleIsSequenceSyncEditMode: Subscription;
clickOnSequenceItem: Subscription;
mousedownBetweenSequenceItems: Subscription;
mouseDownOnSequenceItem: Subscription;
Expand Down Expand Up @@ -106,6 +107,7 @@ export function resetEditorEvents() {
changeSequenceTypeEnterMode: new Subscription(),
toggleSequenceEditMode: new Subscription(),
toggleSequenceEditInRNABuilderMode: new Subscription(),
toggleIsSequenceSyncEditMode: new Subscription(),
clickOnSequenceItem: new Subscription(),
mousedownBetweenSequenceItems: new Subscription(),
mouseDownOnSequenceItem: new Subscription(),
Expand Down
49 changes: 32 additions & 17 deletions packages/ketcher-core/src/application/editor/modes/SequenceMode.ts
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,8 @@ interface PreservedHydrogenBonds {
export class SequenceMode extends BaseMode {
private _isEditMode = false;
private _isEditInRNABuilderMode = false;
private _isAntisenseSyncEditMode = false;
private _isAntisenseEditMode = false;
private _isSyncEditMode = true;
private selectionStarted = false;
private selectionStartCaretPosition = -1;
private mousemoveCounter = 0;
Expand All @@ -112,16 +113,28 @@ export class SequenceMode extends BaseMode {
this._isEditInRNABuilderMode = isEditInRNABuilderMode;
}

public get isAntisenseSyncEditMode() {
return this._isAntisenseSyncEditMode;
public get isAntisenseEditMode() {
return this._isAntisenseEditMode;
}

private turnOnAntisenseSyncEditMode() {
this._isAntisenseSyncEditMode = true;
public get isSyncEditMode() {
return this._isSyncEditMode;
}

private turnOffAntisenseSyncEditMode() {
this._isAntisenseSyncEditMode = false;
private turnOnAntisenseEditMode() {
this._isAntisenseEditMode = true;
}

private turnOffAntisenseEditMode() {
this._isAntisenseEditMode = false;
}

public turnOnIsSyncEditMode() {
this._isSyncEditMode = true;
}

public turnOffIsSyncEditMode() {
this._isSyncEditMode = false;
}

public initialize(
Expand Down Expand Up @@ -1106,10 +1119,10 @@ export class SequenceMode extends BaseMode {
const currentEdittingNode = SequenceRenderer.currentEdittingNode;

if (
this.isAntisenseSyncEditMode &&
this.isAntisenseEditMode &&
Boolean(currentEdittingNode?.antisenseNode)
) {
this.turnOffAntisenseSyncEditMode();
this.turnOffAntisenseEditMode();
SequenceRenderer.setCaretPosition(SequenceRenderer.caretPosition);

return;
Expand All @@ -1125,10 +1138,10 @@ export class SequenceMode extends BaseMode {
const currentEdittingNode = SequenceRenderer.currentEdittingNode;

if (
!this.isAntisenseSyncEditMode &&
!this.isAntisenseEditMode &&
Boolean(currentEdittingNode?.antisenseNode)
) {
this.turnOnAntisenseSyncEditMode();
this.turnOnAntisenseEditMode();
SequenceRenderer.setCaretPosition(SequenceRenderer.caretPosition);

return;
Expand Down Expand Up @@ -1196,13 +1209,15 @@ export class SequenceMode extends BaseMode {
)) ||
undefined;
let senseNodeToConnect = currentTwoStrandedNode?.senseNode;
const needToEditSense = true;
const needToEditAntisense = true;
const needToEditSense =
this.isSyncEditMode || !this.isAntisenseEditMode;
const needToEditAntisense =
this.isSyncEditMode || this.isAntisenseEditMode;

if (needToEditSense) {
const insertNewSequenceItemResult = this.insertNewSequenceItem(
editor,
this.isAntisenseSyncEditMode
this.isAntisenseEditMode
? DrawingEntitiesManager.getAntisenseBaseLabel(enteredSymbol)
: enteredSymbol,
currentTwoStrandedNode?.senseNode,
Expand All @@ -1227,7 +1242,7 @@ export class SequenceMode extends BaseMode {
) {
const antisenseNodeCreationResult = this.insertNewSequenceItem(
editor,
this.isAntisenseSyncEditMode
this.isAntisenseEditMode
? enteredSymbol
: DrawingEntitiesManager.getAntisenseBaseLabel(enteredSymbol),
previousTwoStrandedNodeInSameChain?.antisenseNode,
Expand All @@ -1238,11 +1253,11 @@ export class SequenceMode extends BaseMode {
modelChanges.merge(antisenseNodeCreationResult.modelChanges);
modelChanges.merge(
editor.drawingEntitiesManager.createPolymerBond(
senseNodeToConnect instanceof Nucleoside ||
senseNodeToConnect instanceof Nucleotide ||
senseNodeToConnect instanceof Nucleoside
? senseNodeToConnect?.rnaBase
: senseNodeToConnect.monomer,
antisenseNodeCreationResult.node instanceof Nucleoside ||
antisenseNodeCreationResult.node instanceof Nucleotide ||
antisenseNodeCreationResult.node instanceof Nucleoside
? antisenseNodeCreationResult.node?.rnaBase
: antisenseNodeCreationResult.node.monomer,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -118,12 +118,16 @@ export abstract class BaseSequenceItemRenderer extends BaseSequenceRenderer {
return CoreEditor.provideEditorInstance().isSequenceEditInRNABuilderMode;
}

private get isAntisenseSyncEditMode() {
private get isAntisenseEditMode() {
const editorMode = CoreEditor.provideEditorInstance().mode;

return (
editorMode instanceof SequenceMode && editorMode.isAntisenseSyncEditMode
);
return editorMode instanceof SequenceMode && editorMode.isAntisenseEditMode;
}

private get isSyncEditMode() {
const editorMode = CoreEditor.provideEditorInstance().mode;

return editorMode instanceof SequenceMode && editorMode.isSyncEditMode;
}

protected appendRootElement() {
Expand Down Expand Up @@ -290,9 +294,10 @@ export abstract class BaseSequenceItemRenderer extends BaseSequenceRenderer {
this.caretElement = this.spacerElement?.append('g');

if (
this.isAntisenseNode ||
(this.node instanceof BackBoneSequenceNode &&
this.node.firstConnectedNode.monomer.monomerItem.isAntisense)
this.isSyncEditMode &&
(this.isAntisenseNode ||
(this.node instanceof BackBoneSequenceNode &&
this.node.firstConnectedNode.monomer.monomerItem.isAntisense))
) {
this.caretElement
?.append('path')
Expand All @@ -315,9 +320,7 @@ export abstract class BaseSequenceItemRenderer extends BaseSequenceRenderer {
}

if (
this.isAntisenseSyncEditMode
? this.isAntisenseNode
: !this.isAntisenseNode
this.isAntisenseEditMode ? this.isAntisenseNode : !this.isAntisenseNode
) {
this.caretElement
?.append('line')
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -325,9 +325,39 @@ export class SequenceViewModel {
}
}

private fillAdditionalSpacesInAntisense() {
let index = 0;
let previousTwoStrandedNode: ITwoStrandedChainItem | undefined;

this.nodes.forEach((node) => {
if (
previousTwoStrandedNode &&
previousTwoStrandedNode.antisenseNode &&
node.antisenseNode &&
previousTwoStrandedNode.chain === node.chain &&
previousTwoStrandedNode.antisenseChain !== node.antisenseChain
) {
this.nodes.splice(index, 0, {
senseNode: new BackBoneSequenceNode(
previousTwoStrandedNode.senseNode as SubChainNode,
node.senseNode as SubChainNode,
),
senseNodeIndex: previousTwoStrandedNode.senseNodeIndex,
antisenseNode: new EmptySequenceNode(),
chain: node.chain,
});
index++;
}

previousTwoStrandedNode = node;
index++;
});
}

private fillNodes(chainsCollection: ChainsCollection) {
this.fillSenseNodes(chainsCollection);
this.fillAntisenseNodes(chainsCollection);
this.fillAdditionalSpacesInAntisense();
}

private fillChains() {
Expand Down
3 changes: 2 additions & 1 deletion packages/ketcher-macromolecules/src/Editor.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,7 @@ import { VerticalDivider } from 'components/menu/styles';
import { PolymerBondContextMenu } from 'components/contextMenu/PolymerBondContextMenu/PolymerBondContextMenu';
import { EditorEvents } from './EditorEvents';
import { SelectedMonomersContextMenu } from 'components/contextMenu/SelectedMonomersContextMenu/SelectedMonomersContextMenu';
import { SequenceSyncEditModeButton } from 'components/SequenceSyncEditModeButton';

const muiTheme = createTheme(muiOverrides);

Expand Down Expand Up @@ -237,8 +238,8 @@ function Editor({
>
<TopMenuComponent />
<TopMenuRightWrapper>
<SequenceSyncEditModeButton />
<LayoutModeButton />

<SequenceTypeGroupButton />
<TogglerComponentWrapper
className={
Expand Down
Loading

0 comments on commit 04fc0ef

Please sign in to comment.