Копировать вставить

Система копирования и вставки состоит из трех объектов: объектов ICopyable , ICopyData представляющих скопированные объекты, и объектов IPaster , которые могут превращать данные копирования обратно в копируемые объекты. Каждому типу ICopyable необходим связанный IPaster , который может вставлять эти данные.

Эти системы доступны пользователю через параметры контекстного меню и сочетания клавиш .

Существует очень мало обстоятельств, при которых вы захотите реализовать пользовательское копирование или пользовательскую вставку (например, плагин multiselect или плагин копирования и вставки с помощью перекрестных таблиц ), поскольку обычно копируемые объекты визуализируются, и вы не можете добавлять новые визуализированные объекты. к Блокли. Единственные визуализированные объекты, которые могут существовать в рабочей области, — это блоки, пузырьки и комментарии к рабочей области.

Реализуйте копируемый

Чтобы создать копируемый объект, вам необходимо реализовать интерфейс ICopyable .

Выбираемый

Интерфейс ICopyable расширяет интерфейс ISelectable , а это означает, что вам также необходимо реализовать эти методы и свойства.

Возможность выбора необходима, поскольку сочетания клавиш смотрят на выбранный объект, чтобы определить, что копировать.

class MyCopyable implements ISelectable {
  constructor(workspace) {
    this.id = Blockly.utils.idGenerator.genUid();
    this.workspace = workspace;
  }

  select() {
    // Visually indicate this draggable is selected.
  }

  unselect() {
    // Visually indicate this draggable is not selected.
  }
}

Копируемый

Сам интерфейс ICopyable имеет только один метод, toCopyData , который возвращает сериализуемое в формате JSON представление состояния копируемого объекта, которое можно использовать для воссоздания копируемого объекта.

Данные копирования также должны включать свойство paster , которое содержит зарегистрированное имя строки, связанное с программой Paster, которая должна вставить эти данные копии. Дополнительные сведения о вставках см. в разделе Реализация вставки .

class MyCopyable implements ICopyable {
  constructor(workspace, state) {
    this.workspace = workspace;
    this.myState = state;
  }

  toCopyData() {
    return {
      // This string matches the string used to register the paster.
      paster: 'MY_PASTER',
      state: this.myState,
    };
  }
}

Реализуйте пастер

Для создания пасты необходимо реализовать интерфейс IPaster . У него есть только один метод paste , который принимает данные копии объекта, который он вставляет, рабочую область, в которую нужно вставить объект, и необязательную координату, которая является местом для вставки объекта.

class MyPaster implements IPaster {
  paste(copyData, workspace, coordinate) {
    return new MyCopyable(workspace, copyData.state);
    // Optionally position the copyable at the passed coordinate.
    // Optionally select the copyable after it is pasted.
  }
}

Регистрация

После того, как вы реализовали вставку, вам необходимо зарегистрировать ее, чтобы можно было найти вставку, связанную с заданными данными копии, из ее свойства paster .

// This string matches the string assigned to the 'paster' property.
Blockly.clipboard.registry.register('MY_PASTER', new MyPaster());