Использование [Inspectable] для построения инспектора объектов в flex - PullRequest
0 голосов
/ 07 февраля 2012

Я создаю небольшой инструмент, который позволяет пользователю размещать на экране несколько геометрических фигур, а затем перемещать их и изменять их свойства.Я совсем новичок в as3 / flex.

Рисунки представлены в виде объектов в as3.Итак, у нас есть классы Circle, Triangle, Rectangle с различными свойствами.

Что мне нравится делать, так это отображать своего рода «инспектор объектов», когда пользователь выбирает фигуру.Это окно инспектора будет похоже на то, что можно найти во многих IDE.

Теперь вопрос: возможно ли воспользоваться тегом as3 [Inspectable] для получения списка свойств и включения их изменения во время выполнения?

Если это невозможно, то как бы вы подошли к этой проблеме, не написав специфический для типа код для редактирования каждого объекта?

Редактировать:

Просто для пояснения.Рассмотрим следующий пример:

public class Shape { /* ... */ }

public class Triangle extends Shape { 
  public var a:Number;
  public var h:Number;
  //...
}

public class Circle extends Shape {
  public var r:Number;
  public var name:String;
  //...
}

Я хочу дать пользователю возможность редактировать a, h из Triangle и r, name из Circle.

Из того, что я представляю сейчас, я мог бы следовать двум путям:

  1. Сделать Triangle и Circle реализовать IMyInspectable и написать пользовательские getProperties():Dictionary, getProperty(name:String):Object иsetProperty(name:String, value:Object):void методов для каждого типа.Это может быть связано с совершенно нелегальным переключением спагетти.

  2. Я забыл, когда печатал решение номер один.: (

1 Ответ

1 голос
/ 07 февраля 2012

Я думаю, вы можете использовать descriptionType для анализа объектов. Я бы, наверное, выбрал совершенно другой подход.

Создайте интерфейс, что-то вроде IObjectIWantToCreatePropertyWindowFor, и ваши соответствующие объекты формы реализуют это. Интерфейс может как-то определять список свойств, которые вы хотите редактировать на объекте. Я мог бы даже сделать это массивом объектов-значений, которые содержат имя свойства, отображаемое имя и тип редактора, который он должен иметь. Каждый объект может жестко закодировать этот список свойств в нем.

Окно свойств может быть записано для перерисовки на основе значений интерфейса. Скорее всего, я бы сделал это, используя класс List с функцией itemRenderer каким-либо образом.

То, что вы хотите сделать, звучит не сложно, но и не тривиально.


Нуга попросил более подробного объяснения. Это весь код псевдо, но:

1) Создать интерфейс:

package com.propertyInspector
{

    public interface IPropertyInspectable
    {

        function get inspectableProperties(  ):array;
    }
}

2) Создайте класс, который реализует IPropertyInspectable

package com.propertyInspector
{

    public class myClass implements IPropertyInspectable
    {

        public var property1 :String
        public var property2 : Int

        public function get inspectableProperties():Array{
          return [{name:'property1',type:'String'},{name:'property2',type:'String'}, ]
        }
    }
}

3) Создайте инспектора собственности.

<s:List dataProvider="{someSelectedObjectThatImplementsIPropertyInspectable.inspectableProperties}">
 <s:itemRenderer>
   <s:Label text="data.name"/><s:TextInput />
 </s:itemRenderer>
</s:List>

Вы должны выяснить, как передать объекты в инспектор свойств. И объектам свойств в inspectableProperties, вероятно, потребуется ссылка на фактический объект, на который они ссылаются, чтобы в List могли отображаться значения по умолчанию.

И вы можете использовать функцию itemRenderer для отображения различных редактируемых подходов, основанных на типе. TextInput для строк, NumericStepper для чисел и т. д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...