Ejemplo n.º 1
0
	void resize(int nb)
	{
		if (nb == -1)
			nb = list_traits::size(m_value);
		int prevNb = m_propertyWidgets.size();

		if (m_formLayout && nb == prevNb)
			return; // No need to recreate the same widgets

		bool visible = m_scrollArea->isVisible();
		m_scrollArea->setVisible(false);
		m_propertyWidgets.clear();

		list_traits::resize(m_value, nb);
			
		auto scrollAreaWidget = new QWidget;
		m_formLayout = new QFormLayout;
		m_formLayout->setContentsMargins(3, 3, 3, 3);

		auto name = m_property->name();
		const auto& metaProperties = m_propertyValue->metaContainer().properties();

		for (int i = 0; i < nb; ++i)
		{
			auto& value = list_traits::value(m_value, i);
			auto prop = property::createRefProperty(name, value);
			auto propValue = prop->value<base_type>();
			auto& metaContainer = propValue->metaContainer();
			for (auto& metaProp : metaProperties)
				metaContainer.addExisting(metaProp);

			std::shared_ptr<BasePropertyWidget> propWidget = m_widgetCreator->create(prop, scrollAreaWidget);
			propWidget->setParent(m_parent);
			m_propertyWidgets.push_back(propWidget);
			m_formLayout->addRow(QString::number(i), propWidget->createWidgets());
		}

		scrollAreaWidget->setLayout(m_formLayout);
		m_scrollArea->setWidget(scrollAreaWidget);
		if (visible)
			m_scrollArea->setVisible(true);
	}