Система копирования и вставки состоит из трех элементов: объектов 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());