نسخ ولصق

تم إنشاء نظام النسخ واللصق من ثلاثة عناصر، وهي عناصر ICopyable، وICopyData تمثّل العناصر المنسوخة، وكائنات IPaster التي يمكنها تحويل البيانات إلى كائنات قابلة للنسخ. يحتاج كل نوع من أنواع ICopyable إلى IPaster مرتبط يمكنه لصق تلك البيانات.

يتم عرض هذه الأنظمة للمستخدم من خلال خيارات قائمة السياق واختصارات لوحة المفاتيح.

هناك حالات قليلة جدًا تحتاج فيها إلى استخدام أداة لصق مخصّصة أو قابلة للنسخ (مثل المكوِّن الإضافي للتحديد المتعدد أو المكوِّن الإضافي واللصق بين علامات التبويب)، لأنّه يتم عادةً عرض عناصر قابلة للنسخ ولا يمكنك إضافة كائنات معروضة جديدة إلى بشكل "Blockly". الكائنات الوحيدة المعروضة التي يمكن أن توجد داخل مساحة العمل هي الكتل والفقاعات التفسيرية وتعليقات مساحة العمل.

تنفيذ نسخة قابلة للنسخ

لإنشاء كائن قابل للنسخ، عليك تنفيذ واجهة 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 التي تحتوي على اسم السلسلة المُسجَّل والمرتبط بجهة اللصق التي يجب أن تلصق بيانات النسخ هذه. لمزيد من المعلومات حول أدوات اللصق، يمكنك الاطّلاع على استخدام أداة اللصق.

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());