CEGUI自定义控件及适配CEED编辑器

CEGUI自定义控件及适配CEED编辑器

 

<一>. 自定义控件


首先大致描述一下我理解的自定义控件。
a. CEGUI自带的控件不能满足自己需求
b. 我们通常从CEGUI::Window派生

这个是伪代码(cxx范本, 本文尽量只列出关键部分, 讲诉原理,可能存在部分错误)
我们这里使用CEGUI::Button做派生例子,CEGUI::Window因为无需Falagard资源映射,没有代表性.

widget_name.h

#include "CEGUI/Window.h"

class widget_name : public CEGUI::Button
{
public:
    static const CEGUI::String WidgetTypeName;
    //! MemberValue PropertyName.
    static const CEGUI::String MemberValuePropertyName;
private:
    float d_member_value;
public:
    widget_name(const CEGUI::String& type, const CEGUI::String& name);
public:
    void set_member_value(float _v);
    float get_member_value() const;
private:
    void add_widget_name_properties();
};

widget_name.cpp

const CEGUI::String widget_name::WidgetTypeName("mm/widget_name");
const CEGUI::String widget_name::MemberValuePropertyName("MemberValue");
widget_name::widget_name(const CEGUI::String& type, const CEGUI::String& name)
    : CEGUI::Window(type, name)
    , d_member_value(1.0f)
{
    this->add_widget_name_properties();
}
void widget_name::set_member_value(float _v)
{
    this->d_member_value = _v;
}
float widget_name::get_member_value() const
{
    return this->d_member_value;
}
void widget_name::add_widget_name_properties()
{
    const CEGUI::String propertyOrigin("widget_name");

    CEGUI_DEFINE_PROPERTY
    (
        widget_name, float,
        MemberValuePropertyName, "Property to get/set the window member_value. Value is a float.",
        &widget_name::set_member_value, &widget_name::get_member_value, 1.0f
    );
}


factory_register.cpp

#include "CEGUI/WindowFactoryManager.h"

#include "widget_name.h"

void mm_widget_factory_register()
{
    CEGUI::WindowFactoryManager& _WindowFactoryManager = CEGUI::WindowFactoryManager::getSingleton();

    _WindowFactoryManager.addWindowType<widget_name>();
}
void mm_widget_factory_unregister()
{
    CEGUI::WindowFactoryManager& _WindowFactoryManager = CEGUI::WindowFactoryManager::getSingleton();

    _WindowFactoryManager.removeFactory(widget_name::WidgetTypeName);
}

详细描述
派生这一步网上大多数资料都有说明, 有一下几点需要注意
(1) 派生自某控件, 最小通常是CEGUI::Window, 也能是如CEGUI::ScrollablePane
(2) static const CEGUI::String WidgetTypeName;// 这个是新控件的类型名称
(3) 如果有附加属性如float d_member_value;// 那么要想支持CEED编辑器需要加上形如add_widget_name_properties的属性注册流程。
(4) 控件窗口工厂注册。

属性的定义通常使用以下形式CEGUI/PropertySet.h

#define CEGUI_DEFINE_PROPERTY(class_type, property_native_type, name, help, setter, getter, default_value)\

内建属性可以方便的在datafiles/xml_schemas/Falagard.xsd看到

常用的USize, float, double, CEGUI::String都有定义.

如果要加自定义属性的串化, 可以仿照CEGUI/PropertyHelper.h

 

<二>. 自定义控件适配界面编辑器


1. 主题文件datafiles/schemes/mm_widgets.scheme


这份文件这里主要是要添加Falagard资源映射
我们将
"mm_widgets/widget_name"  映射名字,也能对应CEGUI::WindowManager创建控件的名字
"mm/widget_name"                 对应CEGUI::WindowManager创建控件的名字
"Core/Button"                          渲染组件, 这里对应CEGUI/WindowRendererSets/Core/Button.h
"TaharezLook/Button"             lookNFeel名字, 这里对应TaharezLook.looknfeel中的TaharezLook/Button

<?xml version="1.0" ?>
<GUIScheme version="5" name="mm_widgets">
    <FalagardMapping windowType="mm_widgets/widget_name" targetType="mm/widget_name" renderer="Core/Button" lookNFeel="TaharezLook/Button" />
</GUIScheme>


2. 主题别名文件datafiles/scheme/mm_widgets_alias.scheme

 

请注意FalagardMapping中的最后一项是lookNFeel="mm_widgets/Button"而不是lookNFeel="TaharezLook/Button"

<?xml version="1.0" ?>
<GUIScheme version="5" name="mm_widgets_alias">
    <LookNFeel filename="mm_widgets.looknfeel" />
    <WindowAlias alias="mm/widget_name" target="CEGUI/Button" />
    <FalagardMapping windowType="mm_widgets/widget_name" targetType="mm/widget_name" renderer="Core/Button" lookNFeel="mm_widgets/Button" />
</GUIScheme>


3. 样式文件datafiles/looknfeel/mm_widgets.looknfeel

<?xml version="1.0" ?>
<Falagard version="7">
    <!--
    ***************************************************
        mm_widgets/Button
    ***************************************************
    -->
    <WidgetLook name="mm_widgets/Button">
        <PropertyDefinition name="MemberValue" initialValue="1.0" redrawOnWrite="true" type="float" />
        <...拷贝TaharezLook/Button的其余属性...>
</Falagard>

 

<三>.如何使用


1. 在自己的程序中


这里注意没有加载mm_widgets_alias.scheme

    CEGUI::SchemeManager::getSingleton().createFromFile("TaharezLook.scheme");
    CEGUI::SchemeManager::getSingleton().createFromFile("mm_widgets.scheme");

 

2. 在CEED工程中添加的scheme只包括

这里注意没有包含mm_widgets.scheme

"TaharezLook.scheme"
"mm_widgets_alias.scheme"

 

<四>.为什么这样能工作


其实主要是在CEED中并不需要完整的模拟控件的所有行为


我们一般模拟和配置的是
1. 布局
2. 默认属性的赋值
3. 自定义属性的赋值

所以我们只要在CEED中展示一个形状相似的控件. 

    <...拷贝TaharezLook/Button的其余属性...>


并且能在编辑器中配置自定义属性就满足要求了.

    <PropertyDefinition name="MemberValue" initialValue="1.0" redrawOnWrite="true" type="float" />

在我们的CEED中因为没有Falagard资源映射mm_widgets.scheme,注意这里的功能控件依然是CEGUI/Button。

	<WindowAlias alias="mm/widget_name" target="CEGUI/Button" />


这样就能使用CEED生成我们需要的layout文件,有意思的是里面还携带了我们的自定义属性MemberValue

    <Property name="MaxIndex" value="20.0" />

在我们的程序中因为没有别名映射mm_widgets_alias.scheme,注意这里的功能控件将是mm/widget_name。

	<FalagardMapping windowType="mm_widgets/widget_name" targetType="mm/widget_name" renderer="Core/Button" lookNFeel="TaharezLook/Button" />


所以我们的程序将使用mm_widgets.scheme中的Falagard资源映射


targetType="mm/widget_name"而这将生成一个功能完整的控件。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值