====== UIProxy ====== **//Inherited from//** [[class::qobject|QObject]], **//Inherited by//** NULL **//Friend class//** MainFrame, **//Description//** 在XT架构中UIProxy为文档提供界面定制功能,界面代理的设计是为了降低应用层与界面层的耦合。在XT中每一个文档都有自己匹配的界面代理,它必须先通过XDocument的静态接口registerUIProxy注册之后才能使用。一般来说,为一个文档定制界面框架主要需要定制文档主视图(可以是用于3D渲染的GLDrawer,也可以是其他控件)、文档导航树模型(TreeModel)以及文档导航树右键菜单、主视图右键菜单(如GLContextMenu,可选项)。 UIProxy提供了一系列的接口函数以定制文档的界面交互方式。在打开或者导入文档时,XT会调用UIProxy的resetFrame接口重置文档的界面框架;在切换文档时,XT会调用updateFrame接口更新界面框架,在文档视图数据需要更新时,可调用接口updateDocView完成;用户从导航树上单击某个数据对象时,XT会调用listProperty接口列举该对象的属性表单,修改属性则通过接口changeProperty实现;用户导航树的右键菜单由接口setObjectContextMenu实现,双击事件由接口onObjectTreeEvent实现;对功能命令的可用性检查通过接口isCommandEnabled完成;onApplicationEvent接口负责处理属于该文档的应用事件;handleFrameAction接口负责处理面向该文档的框架命令;setWorkScene接口实现文档不同视图的切换(如三维渲染切换到曲线绘制,适用于文档有多个视图的场合,当前的视图类型存放在ViewData中);onUIResize接口实现对尺寸调整事件的响应以调整对文档框架各子控件的尺寸。开发者在定制自己的框架代理时需要重新实现上述接口。 **//Members//** * MainFrame * [[uiproxy#m_pframe|m_pFrame]] * vector * [[uiproxy#m_pdocviews|m_pDocViews]] * QWidget * [[uiproxy#m_pcurrentdocview|m_pCurrentDocView]] * XTreeModel * [[uiproxy#m_pdoctreemdl|m_pDocTreeMdl]] * XDocument * [[uiproxy#m_pdoc|m_pDoc]] * XName [[uiproxy#m_strname|m_strName]] * XPath [[uiproxy#m_strconfigfile|m_strConfigFile]] **//Public interface//** * [[uiproxy#uiproxy1|UIProxy]](MainFrame * frame,XDocument * doc) * virtual [[uiproxy#~uiproxy|~UIProxy]]() * const char * [[uiproxy#getname|getName]]() const * void [[uiproxy#setname|setName]](const char * name) * virtual void [[uiproxy#oncmdcommit|onCmdCommit]]() * virtual void [[uiproxy#activate|activate]]() * virtual void [[uiproxy#deactivate|deactivate]]() * virtual void [[uiproxy#ondocloaded|onDocLoaded]]() * void [[uiproxy#setworkscene|setWorkScene]](TypeID wid) * virtual void [[uiproxy#updatedocview|updateDocView]](intptr_t updateFlag = 0) * virtual void [[uiproxy#oncurrentdocviewchange|onCurrentDocViewChange]]() * virtual bool [[uiproxy#handleframeaction|handleFrameAction]](int cid, XWord param) * virtual bool [[uiproxy#onapplicationevent|onApplicationEvent]](EventTypeID et, XWord param) * vector * [[uiproxy#getdocviews|getDocViews]]() * int [[uiproxy#getdocviewcount|getDocViewCount]]() * QWidget * [[uiproxy#getcurrentdocview|getCurrentDocView]]() * void [[uiproxy#setcurrentdocview|setCurrentDocView]](QWidget * w) * XTreeModel * [[uiproxy#gettreemodel|getTreeModel]]() * XDocument * [[uiproxy#getdocument|getDocument]]() * virtual ulong [[uiproxy#getitemcommandid|getItemCommandID]](int type, const XItem * pi) * virtual PreferenceDialog * [[uiproxy#createpreferencedialog|createPreferenceDialog]]() * virtual AboutDialog * [[uiproxy#createaboutdialog|createAboutDialog]]() * void [[uiproxy#registerenumstring|registerEnumString]]() * virtual XRender * [[uiproxy#getrender|getRender]]() * virtual void [[uiproxy#onuiresize|onUIResize]]() * virtual void [[uiproxy#listproperty|listProperty]](TypeID type, const XItem * item, TypeID domainType) * virtual void [[uiproxy#changeproperty|changeProperty]](const XItem * item, ulong cid, const QVariant * v) * virtual bool [[uiproxy#iscommandenabled|isCommandEnabled]](ulong cid) * virtual void [[uiproxy#setobjectcontextmenu|setObjectContextMenu]](TreeNode * obj, QMenu * menu) * virtual void [[uiproxy#onobjecttreeevent|onObjectTreeEvent]](QEvent * e, EventType eventType) * virtual bool [[uiproxy#filterobjectcontext|filterObjectContext]](TreeNode * obj, const char * filterString) ---- {{anchor:m_pframe}} **MainFrame * m_pFrame** {{anchor:m_pdocviews}} **vector * m_pDocViews** {{anchor:m_pcurrentdocview}} **QWidget * m_pCurrentDocView** {{anchor:m_pdoctreemdl}} **XTreeModel * m_pDocTreeMdl** {{anchor:m_pdoc}} **XDocument * m_pDoc** {{anchor:m_strname}} **XName m_strName** {{anchor:m_strconfigfile}} **XPath m_strConfigFile** ---- {{anchor:uiproxy1}} **UIProxy(MainFrame * frame,XDocument * doc)** *function: 构造函数 *parameters: - [i]MainFrame * frame: 主框架指针 - [i]XDocument * doc: 文档指针 *return value: 无 {{anchor:~uiproxy}} **virtual ~UIProxy()** *function: 析构函数 *parameters: NULL *return value: 无 {{anchor:getname}} **const char * getName() const** *function: 获取该代理的名字 *parameters: NULL *return value: 代理名字符串 {{anchor:setname}} **void setName(const char * name)** *function: 设置代理名 *parameters: - [i]const char * name: 代理名字符串 *return value: 无 {{anchor:oncmdcommit}} **virtual void onCmdCommit()** *function: 命令提交之后完成视图的切换 *parameters: NULL *return value: 无 {{anchor:activate}} **virtual void activate()** *function: 将该界面代理激活 *parameters: NULL *return value: 无 {{anchor:deactivate}} **virtual void deactivate()** *function: 将该界面代理停用 *parameters: NULL *return value: 无 {{anchor:ondocloaded}} **virtual void onDocLoaded()** *function: 当文档载入数据时调用此函数更新界面 *parameters: NULL *return value: 无 {{anchor:updatedocview}} **virtual void updateDocView(intptr_t updateFlag = 0)** *function: 按照指定标志更新文档视图 *parameters: - [i]intptr_t updateFlag = 0: 更新标志 *return value: 无 {{anchor:oncurrentdocviewchange}} **virtual void onCurrentDocViewChange()** *function: 当前文档切换视图时调用此函数更新界面(同一个文档可能有多个视图) *parameters: NULL *return value: 无 {{anchor:onapplicationevent}} **virtual bool onApplicationEvent(EventTypeID et, XWord param)** *function: 响应应用层发生的事件,如在该代理中处理返回true,否则返回false,交由MainFrame处理 *parameters: - [i]EventTypeID et: 应用事件类型 - [i] XWord param: 应用事件参数 *return value: 如在该代理中处理返回true,否则返回false {{anchor:getdocviews}} **vector * getDocViews()** *function: 获取该代理的文档视图列表 *parameters: NULL *return value: 该代理的文档视图数组 {{anchor:getdocviewcount}} **int getDocViewCount()** *function: 获取该代理的文档视图个数 *parameters: NULL *return value: 该代理的文档视图个数 {{anchor:getcurrentdocview}} **QWidget * getCurrentDocView()** *function: 获取代理的当前视图 *parameters: NULL *return value: 当前文档视图的指针 {{anchor:setcurrentdocview}} **void setCurrentDocView(QWidget * w)** *function: 设置代理的当前视图指针 *parameters: - [i]QWidget * w: 视图指针 *return value: 无 {{anchor:gettreemodel}} **XTreeModel * getTreeModel()** *function: 获取文档的模型树Model指针(用于构建模型树视图) *parameters: NULL *return value: 模型树Model指针 {{anchor:getdocument}} **XDocument * getDocument()** *function: 获取文档指针 *parameters: NULL *return value: 文档指针 {{anchor:registerenumstring}} **void registerEnumString()** *function: 注册枚举变量字符串 *parameters: NULL *return value: 无 {{anchor:getrender}} **virtual XRender * getRender()** *function: 获取图形渲染器 *parameters: NULL *return value: 图形渲染器指针 {{anchor:onuiresize}} **virtual void onUIResize()** *function: 界面调整尺寸时调整各部分控件尺寸 *parameters: NULL *return value: 无 {{anchor:listproperty}} **virtual void listProperty(TypeID type, const XItem * item, TypeID domainType)** *function: 列举对象树节点属性 *parameters: - [i]TypeID type: 节点类型 - [i] const XItem * item:数据对象指针 - [i] TypeID domainType: 数据对象所属域 *return value: 无 {{anchor:changeproperty}} **virtual void changeProperty(const XItem * item, ulong cid, const QVariant * v)** *function: 修改对象属性 *parameters: - [i]const XItem * item: 数据对象指针 - [i] ulong cid: 修改属性所用到的命令ID - [i] const QVariant * v: 属性值 *return value: 无 {{anchor:iscommandenabled}} **virtual bool isCommandEnabled(ulong cid)** *function: 返回ID为cid的命令是否可用,在某些情况下根据文档的数据和状态,某些命令需要禁用 *parameters: - [i]ulong cid: 命令ID *return value: 如命令可用返回true,否则返回false