dblclick()

in packages/ketcher-react/src/script/editor/tool/select/select.ts [421:545]


  dblclick(event) {
    const editor = this.editor;
    const struct = editor.render.ctab;
    const { molecule, sgroups } = struct;
    const functionalGroups = molecule.functionalGroups;
    const ci = editor.findItem(
      event,
      ['atoms', 'bonds', 'sgroups', 'functionalGroups', 'sgroupData', 'texts'],
      null,
    );

    const atomResult: any[] = [];
    const bondResult: any[] = [];
    const result: any[] = [];
    if (ci && functionalGroups && ci.map === 'atoms') {
      const atomId = FunctionalGroup.atomsInFunctionalGroup(
        functionalGroups,
        ci.id,
      );
      const atomFromStruct = atomId !== null && struct.atoms.get(atomId)?.a;
      if (
        atomFromStruct &&
        !FunctionalGroup.isAtomInContractedFunctionalGroup(
          // TODO: examine if this code is really needed, seems like its a hack
          atomFromStruct,
          sgroups,
          functionalGroups,
          true,
        )
      )
        atomResult.push(atomId);
    }
    if (ci && functionalGroups && ci.map === 'bonds') {
      const bondId = FunctionalGroup.bondsInFunctionalGroup(
        molecule,
        functionalGroups,
        ci.id,
      );
      const bondFromStruct = bondId !== null && struct.bonds.get(bondId)?.b;
      if (
        bondFromStruct &&
        !FunctionalGroup.isBondInContractedFunctionalGroup(
          // TODO: examine if this code is really needed, seems like its a hack
          bondFromStruct,
          sgroups,
          functionalGroups,
        )
      )
        bondResult.push(bondId);
    }
    if (atomResult.length > 0) {
      for (const id of atomResult) {
        const fgId = FunctionalGroup.findFunctionalGroupByAtom(
          functionalGroups,
          id,
        );
        if (fgId !== null && !result.includes(fgId)) {
          result.push(fgId);
        }
      }
      editor.event.removeFG.dispatch({ fgIds: result });
      return;
    } else if (bondResult.length > 0) {
      for (const id of bondResult) {
        const fgId = FunctionalGroup.findFunctionalGroupByBond(
          molecule,
          functionalGroups,
          id,
        );
        if (fgId !== null && !result.includes(fgId)) {
          result.push(fgId);
        }
      }
      this.editor.event.removeFG.dispatch({ fgIds: result });
      return;
    }
    if (!ci) return;

    const selection = this.editor.selection();

    if (ci.map === 'atoms') {
      const atoms = getSelectedAtoms(selection, molecule);
      const changeAtomPromise = editor.event.elementEdit.dispatch(atoms);
      updateSelectedAtoms({
        atoms: selection?.atoms || [],
        editor,
        changeAtomPromise,
      });
    } else if (ci.map === 'bonds') {
      const bonds = getSelectedBonds(selection, molecule);
      const changeBondPromise = editor.event.bondEdit.dispatch(bonds);
      updateSelectedBonds({
        bonds: selection?.bonds || [],
        changeBondPromise,
        editor,
      });
    } else if (
      (ci.map === 'sgroups' &&
        !FunctionalGroup.isFunctionalGroup(molecule.sgroups.get(ci.id))) ||
      ci.map === 'sgroupData'
    ) {
      editor.selection(closestToSel(ci));
      SGroupTool.sgroupDialog(editor, ci.id);
    } else if (ci.map === 'texts') {
      editor.selection(closestToSel(ci));
      const text = molecule.texts.get(ci.id);
      const dialog = editor.event.elementEdit.dispatch({
        ...text,
        type: 'text',
      });

      dialog
        .then(({ content }) => {
          if (!content) {
            editor.update(fromTextDeletion(struct, ci.id));
          } else if (content !== text?.content) {
            editor.update(fromTextUpdating(struct, ci.id, content));
          }
        })
        .catch((e) => {
          KetcherLogger.error('select.ts::SelectTool::dblclick', e);
        });
    }
    return true;
  }