Вибір - Rete.js

Вибір

Цей гайд базується на гайді Базовий редактор. Рекомендується переглянути його для повного розуміння цього гайду.

БазовийВибір ласо/шатромЗ'єднанняКоментаріЗміна маршрутуПлагін області

Вибір вузлів

Як пояснюється в гайді Базовий редактор, ви можете включити вибір вузла за допомогою розширення selectableNodes

ts
const selector = AreaExtensions.selector()
const accumulating = AreaExtensions.accumulateOnCtrl()

AreaExtensions.selectableNodes(area, selector, { accumulating });

Код вказує, що користувачі можуть вибирати кілька вузлів, утримуючи натиснутою клавішу Ctrl, а потім ці вузли можна переміщувати разом

Вибір або відміна вибору

Окрім дій користувача, вибрати або відмінити вибір вузла можна через вбудовані методи selectableNodes

ts
const selectableNodes = AreaExtensions.selectableNodes(area, selector, { accumulating });

selectableNodes.select(nodeId) // вибір одного вузла, попередній вибір буде скинуто
selectableNodes.select(nodeId, true) // вибір вузла, не скидаючи вибір попередніх
selectableNodes.unselect(nodeId) // видалити вузол з вибраних

Вибір кастомних елементів

Усі елементи, додані до області, можна додати до селектора. Вони можуть діяти як вузли: їх можна вибирати та переміщувати разом з іншими елементами, які наразі виділено

Давайте розглянемо приклад додавання елемента до селектора

ts
const id = 'element-id'
const label = 'element-type'

selector.add({
  id,
  label,
  translate(dx, dy) {
    // змінити положення поточного елемента на dx,dy
  },
  unselect() {
    // запускається при видаленні з селектора
    // тут ви можете виконати оновлення стилів
  },
}, accumulating.active())

Після завершення цього кроку функція translate буде викликатися кожного разу, коли буде переміщено вибраний вузол або інший елемент.

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

ts
selector.pick({ id, label })

Коли на вашому елементі запускається така подія, як pointermove, важливо переконатися, що це захоплений елемент, а потім застосувати зміщення до всіх інших.

ts
if (selector.isPicked({ id, label })) selector.translate(dx, dy)

де dx, dy є зміщенням вашого елемента в межах координат області. Майте на увазі, якщо transform.k не дорівнює 1, значення будуть відхилятися від екранних координат.

Цей підхід pick + isPicked запобігає зацикленню під час виклику selector.translate не лише для події pointermove, але й для будь-яких змін позиції елемента іншими способами.

Видалити елемент із селектора можна легко наступним чином:

ts
selector.remove({ id, label })

Розширення селектора

Окрім функції AreaExtensions.selector(), у вас є можливість безпосередньо використовувати клас AreaExtensions.Selector.

ts
const selector = new AreaExtensions.Selector()

Перевага використання селектора на основі класу полягає в тому, що його можна розширити та налаштувати, щоб включити необхідні функції, наприклад відстеження вибраних або скасування вибору елементів

ts
import type { SelectorEntity } from 'rete-area-plugin/_types/extensions/selectable'

class MySelector<E extends SelectorEntity> extends AreaExtensions.Selector<E> {
  add(entity: E, accumulate: boolean): void {
    super.add(entity, accumulate)
    console.log('додано', entity)
  }
  remove(entity: E): void {
    super.remove(entity)
    console.log('видалено', entity)
  }
}

Інші випадки застосування