JUCE类库PropertyPanel详解

PropertyPanel

图 PropertyPanel属性面板与PropertyComponent属性组件

PropertyPanel属性面板和PreferencesPanel系统设置面板不是一回事。PropertyPanel属性面板容纳并显示一批PropertyComponent属性组件,专用于设置程序中所需的各类数值,包括布尔值,数值,字符串值等等。而PreferencesPanel系统设置面板则是顶部有一排按钮的组件,这些按钮用来切换不同的Component子组件(页面)。系统设置面板可将属性面板设置为子组件(页面),也可将任意Component组件设置为自己的子组件,但属性面板不能将系统设置面板设置为自己的子组件,也不能将PropertyComponent属性组件之外的其他任何组件设置为自己的子组件。

PropertyPanel属性面板所设置的值自动关联到每个属性组件的var对象,调整属性后,该对象自动获取当前的设置值,无需显式为其赋值。这一点很方便。

要使用该功能,需4个核心类与4个辅助类

  • PropertyPanel属性面板。核心类1。该类继承自Component,用于添加需显示和设置的属性组件集合,设置选区标题,初始状态下是否展开选区等等。内容组件类中创添显设删布局本类的对象,使用流程同其他基本控件。
  • Array<PropertyComponent*>数组,核心类2,临时使用。用于保存一批属性组件。该数组使用add()函数添加某个选区的所有PropertyComponent属性组件,供属性面板添加选区所用。
  • PropertyComponent属性组件。核心类3。该类是抽象基类,继承自Component和SettableTooltipClient(实时提示)。具体使用的是其派生类,有5个:
     BooleanPropertyComponent 布尔型属性组件(开关式按钮)
     ChoicePropertyComponent 选择型属性组件(组合框)
     SliderPropertyComponent 数值型属性组件(推子)
     TextPropertyComponent 文本型属性组件(文本框)
     ButtonPropertyComponent 综合型属性组件(按钮,点击后进行有关处理,抽象类)

如果情况特殊,还可自定义派生类。本类对象需用new的方式来创建堆中对象,所创建的每一个对象均无需指针,直接添加到Array数组中即可。其生命期由系统自动管理,无需显式销毁。

  • Value和var。即每个属性组件所关联的值。Value的构造参数为var对象。每个属性组件均需关联一个Value值。用户设置属性组件时,该值实时变化,程序员无需显式获取属性组件的值,这一点是JUCE属性设置功能最强悍之处。其核心就是通过Value和var来实现的。var是万用数据类型,可以是布尔值、整数、浮点数、字符、字符串等。还可以是任意类的指针或数组。
  • StringArray字符串数组和Array<var>数组。选择型属性组件(组合框)所用,临时使用即可。选择型属性组件的对象在构造时不仅需要所关联的Value值,还需1个字符串数组和1个var数组。字符串数组为组合框所显示的所有列表项的文本,var数组则是列表项所对应的数据。这两个数组的元素个数必须一致,且一一对应。
  • Value::Listener,用于捕获并处理每个属性组件所关联的Value值在变化时所产生的消息。

某个内容组件完成属性设置的流程有5:

1、该类继承Value::Listener,声明一堆Value对象,每个Value对象由一个属性组件所关联。

2、构造函数中:
 每个Value对象addListener(this)绑定捕获器
 利用ApplicationProperties程序属性技术读取和加载有关数据,所获取的数据赋值给本类中声明的每个Value值(具体流程参见3.5.7)。
 临时创建1到多个属性组件数组,即Array<PropertyComponent*>模板类的对象。需要几个选区,就声明几个数组。比如:
Array<PropertyComponent*> propertyComp1;
Array<PropertyComponent*> propertyComp2;
 创建属性组件数组后,该数组使用add()函数添加元素(每个元素为一个具体的属性组件):
propertyComp1.add (new TextPropertyComponent(textValue, “输入文本:”, 256, true));
propertyComp2.add (new SliderPropertyComponent(sliderValue2, L”推子组件: “,
0.0, 100.0, 1.0));

3、类中声明、创添显设删PropertyPanel属性面板。构造函数中,属性面板对象通过addProperties ()或addSection()添加属性组件数组。二者的区别是:addProperties()直接添加参数数组中的各个属性组件,这些属性组件直接位于属性面板中,不在某个选区内。而addSection()则可将参数数组中的属性组件添加到一个选区中,选区有标题,可折叠。此处,有几个属性组件数组则添加几次,如果添加到选区中,则可一并设置选区标题的文本和初始状态是否为展开:
propertyPanel->addSection (L”选区标题1″, propertyComp1, true);
propertyPanel->addSection (L”选区标题2”, propertyComp2, false);

4、在继承自基类的valueChanged()函数中,基于所产生消息的Value执行具体的操作处理。

5、析构函数中,将每个属性组件所关联的Value值保存到ApplicationProperties中。

示例代码(略)