Условные операции перетаскивания в дереве Flex / AS3 - PullRequest
2 голосов
/ 25 марта 2010

Добрый день всем.

В настоящее время я работаю с иерархической древовидной структурой в AS3 / Flex и хочу включить возможности перетаскивания при определенных условиях:

  1. Можно перемещать только узлы родительского / верхнего уровня
  2. Узлы родительского / верхнего уровня должны оставаться на этом уровне; их нельзя переместить в дочерние узлы других родительских узлов

Используя событие dragEnter дерева, я могу легко обработать условие 1.

private function onDragEnter(event:DragEvent):void
{
    // only parent nodes (map layers) are moveable
    event.preventDefault();
    if(toc.selectedItem.hasOwnProperty("layer"))
        DragManager.acceptDragDrop(event.target as UIComponent);
    else
        DragManager.showFeedback(DragManager.NONE);
}

Обработка второго условия оказывается немного сложнее. Я уверен, что событие dragOver - место для логики. Я экспериментировал с CalculateDropIndex, но это всегда дает мне индекс родительского узла, который не помогает проверить, является ли место потенциального отбрасывания приемлемым или нет. Ниже приведен псевдокод того, чего я хочу достичь.

private function onDragOver(e:DragEvent):void
{
    // if potential drop location has parents
        // dont allow drop
    // else
        // allow drop
}

Может кто-нибудь дать совет, как это реализовать?

1 Ответ

1 голос
/ 25 марта 2010

Хорошо, не уверен, поможет ли вам этот лакомый кусочек, но когда я сделал это с XML, я бы получил объект цели перетаскивания с:

var r:int = dropTarget.calculateDropIndex(evt);
var node:XML = treeCurTemplate.indexToItemRenderer(r).data as XML;

Тогда я бы сравнил localName цели с localName элемента, который я перетаскивал. LocalName был тем, что я использовал для управления ветвлением дерева, так что это имело смысл. Может быть, вы можете использовать это, чтобы найти какой-то способ сделать это с вашими объектами.

...