העתקה והדבקה

‫Blockly תומך בפעולות של העתקה, גזירה והדבקה למספר רכיבים מובנים, כמו בלוקים, תגובות בסביבת העבודה ובועות.

התנהגות ברירת המחדל של לוח העריכה

ליבת Blockly כוללת מקשי קיצור שאפשר להשתמש בהם כדי לגזור, להעתיק או להדביק בלוקים, הערות במרחב העבודה וכל רכיב אחר שמיישם את הממשקים ICopyable, IDraggable ו-IDeletable. יש גם אפשרות בתפריט ההקשר לשכפול של בלוק. אפשר לשנות או להסיר את קיצורי הדרך ופריטי התפריט שמוגדרים כברירת מחדל לפי הצורך.

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

העתקה והדבקה בין סביבות עבודה וכרטיסיות

אם רוצים לאפשר למשתמשים להעתיק בלוקים מסביבת עבודה אחת ולהדביק אותם בסביבת עבודה אחרת, או אפילו בסביבת עבודה בעותק של האפליקציה שפועל בכרטיסייה אחרת, אפשר להתקין את הפלאגין @blockly/plugin-cross-tab-copy-paste.

התנהגות מותאמת אישית של לוח העריכה

אם רוצים התנהגות שונה, אפשר להטמיע לוח הדבקה בהתאמה אישית על ידי הסרת מקשי הקיצור שמגיעים עם Blockly והתקנה של מקשי קיצור אחרים שפועלים בצורה שונה. כדי לעשות את זה, אפשר להשתמש בשיטות במרחב השמות Blockly.clipboard להעתקה, להדבקה או לשליטה מדויקת יותר, כמו הגדרת סביבת העבודה שממנה הועתק אובייקט.

אובייקטים מותאמים אישית שאפשר להעתיק

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

כל אובייקט שמטמיע את ICopyable,IDraggable ו-IDeletable ושכולל IPaster ו-ICopyData תואמים, יעבוד אוטומטית עם מערכת ברירת המחדל של לוח העריכה.

יש מעט מאוד מקרים שבהם כדאי להטמיע אובייקט מותאם אישית שאפשר להעתיק או להדביק (למשל, תוסף לבחירת כמה פריטים), כי אובייקטים שאפשר להעתיק עוברים עיבוד, ואי אפשר להוסיף אובייקטים מעובדים חדשים ל-Blockly. האובייקטים המעובדים היחידים שיכולים להיות במרחב עבודה הם בלוקים, בועות ותגובות במרחב העבודה.

הטמעה של copyable

כדי ליצור אובייקט שאפשר להעתיק, צריך להטמיע את הממשקים ICopyable,‏ IDraggable ו-IDeletable. שני הממשקים האחרונים נדרשים כדי שאפשר יהיה לשנות ולמחוק אובייקט שהודבק.

ניתן לבחירה

ממשק 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,
    };
  }
}

ICopyable כוללת גם שיטה אופציונלית, isCopyable, שמחזירה אם אפשר להעתיק אובייקט כרגע.

ניתן לגרירה ולמחיקה

מידע על הטמעה של IDraggable ו-IDeletable זמין במאמר רכיבים שניתנים לגרירה בהתאמה אישית.

הטמעה של כלי להדבקה

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