我有一个包含多个视图的程序。有些视图本身包含不同的对象,有些只是以类似表格的方式显示数据。
所有这些视图以及某些显示的对象都有不同的选项。
我现在拥有的是以下内容:
我有一个对话框类,它为每个对象/视图提供不同的选项卡以显示/更改选项。我有不同的处理程序类,用作将选项传递到属性对话框的指针。
我想做的是将视图/对象传递到处理程序类中以更改选项。
我考虑过使用模板,但后来意识到我不能真正做到这一点,因为每个视图/对象类都有不同的选项,因此应用它们将取决于对象本身。
使用
is_same
实际上会违背模板的目的。
更好的解决方案是什么?
一些代码:
std::unique_ptr<PropertiesHandler> propertiesPtr;
#if __cplusplus > 201300
auto ptr = std::make_unique<Handler>( m_conf->m_dbOptions, m_canvas );
#else
auto ptr = std::unique_ptr<Handler>( new Handler( m_conf->m_dbOptions, m_canvas ) );
#endif
propertiesPtr = std::move( ptr );
propertiesPtr->SetType( m_type == View ? ViewProperties : ObjectProperties );
这就是我将选项传递到属性对话框的方式。
编辑:
在属性对话框中,我有以下代码:
auto type = handler->GetType() )
switch( type )
{
case ViewProperties:
Handler *propHandler = dynamic_cast<>( handler );
// create pages relevant for the view 1
}
反射是这个问题的标准解决方案。
对象具有属性。 这些属性可以在运行时由其他对象通过某种反射机制进行检查。
视图又都具有属性,并且可以修改它们所包含的对象的哪些属性被公开(以及如何公开)。
一旦获得视图的属性(以及对象的过滤器属性),您就可以使用数据驱动设计来填充属性对话框。
属性的结构以及您所公开的内容成为这里的关键。 例如,将两个属性“x”和“y”公开为数字是一回事,将这两个属性公开为名为“location”的子属性的同级属性是另一回事。 并且用元信息标记“位置”子属性,说明它是坐标,这更加详细。
在属性对话框中,当您看到标记为坐标的子属性时,您可以生成一对 x/y 旋转框,甚至可能是一个允许您选择位置的十字线控件。
您最终要么在属性级别添加元信息,要么教属性对话框为每种视图/对象使用自定义布局(通过一些数据)。 第一个是更多的代码,第二个是更多的用户体验工作。
这两种情况的核心是,您不手写 C++ 来决定每个控件存在的确切位置以及文本是什么。 您确实希望像这样的 UX 是数据驱动的,无论是直接来自反射还是来自某种非 C++ 布局语言。 (我想 ASL 就可以了)