העתקה והדבקה

מערכת ההעתקה וההדבקה מורכבת משלושה דברים: אובייקטים מסוג ICopyable, ICopyData שמייצגים אובייקטים מועתקים, ואובייקטים מסוג IPaster שיכולים להפוך נתונים מועתקים שוב לאובייקטים שאפשר להעתיק. לכל סוג של ICopyable נדרש IPaster משויך שיכול להדביק את הנתונים האלה.

המערכות האלה מוצגות למשתמשים באמצעות האפשרויות בתפריט ההקשר ומקשי הקיצור.

במקרים מעטים מאוד כדאי להשתמש בפלאגין מותאם אישית שניתן להעתיק או בפסטר מותאם אישית (למשל בפלאגין מרובה בחירה, או בהפלאגין להעתקה בין כרטיסיות), כי בדרך כלל ניתן לבצע רינדור אובייקטים שניתן להעתיק, ואי אפשר לחסום אובייקטים חדשים. האובייקטים היחידים שאפשר להציג בסביבת העבודה הם בלוקים, בועות ותגובות בסביבת העבודה.

הטמעת רכיב שניתן להעתקה

כדי ליצור אובייקט שניתן להעתיק, צריך להטמיע את הממשק 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,
    };
  }
}

הטמעת paster

כדי ליצור מקודד, צריך להטמיע את הממשק 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());