Блин в правильном порядке - проблема посетителя - PullRequest
0 голосов
/ 11 октября 2010

Я разрабатываю простой графический интерфейс.У меня есть виджеты, у которых есть дети и один родитель.Каждый виджет является составным объектом с вектором объектов WidgetComposite.Одним из таких WidgetComposites является PaintingBehaviour, но виджет не знает его как таковой.

Для отображения моего окна я использую Visitor, который называется ScreenVisitor.Когда вызывается посетитель, происходит следующее:

Первый виджет, WidgetScene, выполняет итерацию для каждого из своих виджетов и вызывает метод accept (Visitor * v).Затем каждый виджет принимает посетителя, а затем выполняет итерацию по своим дочерним элементам.

Например, это список объектов (в порядке, в котором он будет происходить), который посетитель должен будет принять.1008 *

Теперь моя проблема проста: я хочу, чтобы каждый виджет был нарисован на его родителе.Как бы вы поступили?Я пробовал с деревом, но у меня всегда одна и та же проблема: когда мне нужно подняться в иерархии (например, после отображения child3, когда мне нужно отобразить child4), я не знаю, как получитьправый родитель.

Я пишу на C ++, но эта проблема не зависит от языка.

У вас есть идеи?Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 12 октября 2010

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

Посетитель создает дерево объектов "DisplayNodes", которые в основном представляют собой класс, состоящий в основном из указателей.Вот атрибуты класса:

class DisplayNode
{
   private:
     Widget* myWidget;
     PaintingBehaviour* myPB;
     DisplayNode* myParent;
     vector <DisplayNode*>myChildren;
};

Каждый DisplayNode хранится в векторе у моего посетителя.

Затем для каждого PaintingBehaviour я проверяю родителя подключенного виджета ипроверьте, является ли один из моих «myWidget» этого узла этим родителем.Так что я могу найти, где все.После этого это довольно просто, простой метод рисования в DisplayNode с рекурсивными вызовами для детей, вызываемый с первым DisplayNode сцены ...

Поскольку он немного тяжел, я создаю только дерево DisplayNodeодин раз (хотя я делаю это снова, если PaintingBehaviour или виджеты добавлены / удалены).Если дерево уже существует, я сразу перейду к рекурсивному рисованию.

Это немного искажено (и, вероятно, не совсем оптимизировано), я признаю, но это работает!Но если у кого-то есть лучшее решение, я буду очень рад его услышать.

0 голосов
/ 11 октября 2010

Вопрос мне не очень понятен. Если вам просто нужно, чтобы они были нарисованы в правильном порядке. Родителю до детей это было бы довольно просто:

accept(Visitor v)
  paint() //paint parent first
  v.visit()
  foreach child
    child.accept(v) //then paint children

Если вам нужен родитель (почему?), Вы можете изменить метод accept, чтобы (необязательно) взять родительский узел.

accept(Visitor v,Element parent = null)
  paint()
  v.visit()
  parent.foo()
  foreach child
    child.accept(v,this)
...