示例#1
0
void HierarchyTreeWidget::RestoreTreeItemExpandedStateRecursive(QTreeWidgetItem* parentItem,
	const EXPANDEDITEMS& expandedItems)
{
	if (!parentItem )
	{
		return;
	}

	QVariant itemIDData = parentItem->data(ITEM_ID);
	if (itemIDData.type() != QVariant::Int)
	{
		return;
	}

	int itemID = itemIDData.toInt();
	if (expandedItems.find(itemID) != expandedItems.end() &&
		parentItem->childCount() > 0 && !parentItem->isExpanded())
	{
		parentItem->setExpanded(true);
	}

	// Repeat for all children.
	for (int i = 0; i < parentItem->childCount(); i ++)
	{
		RestoreTreeItemExpandedStateRecursive(parentItem->child(i), expandedItems);
	}
}
示例#2
0
void HierarchyTreeWidget::AddControlItem(QTreeWidgetItem* parent, const EXPANDEDITEMS& selectedItems, const EXPANDEDITEMS& expandedItems, const HierarchyTreeNode::HIERARCHYTREENODESLIST& items)
{
	for (HierarchyTreeNode::HIERARCHYTREENODESLIST::const_iterator iter = items.begin();
		 iter != items.end();
		 ++iter)
	{
		const HierarchyTreeControlNode* controlNode = (const HierarchyTreeControlNode*)(*iter);
		
		QTreeWidgetItem* controlItem = new QTreeWidgetItem();
		controlItem->setData(ITEM_ID, controlNode->GetId());
		controlItem->setText(0, controlNode->GetName());

		Decorate(controlItem, controlNode->GetUIObject());

		parent->insertChild(parent->childCount(), controlItem);
		
		AddControlItem(controlItem, selectedItems, expandedItems, controlNode->GetChildNodes());
		
		if (expandedItems.find(controlNode->GetId()) != expandedItems.end())
			controlItem->setExpanded(true);
		if (selectedItems.find(controlNode->GetId()) != selectedItems.end())
		{
			controlItem->setSelected(true);
		}
	}
}
示例#3
0
void HierarchyTreeWidget::OnTreeUpdated(bool needRestoreSelection)
{
	EXPANDEDITEMS expandedItems;
	EXPANDEDITEMS selectedItems;
	//save opened node
	TREEITEMS oldItems = GetAllItems();
	for (TREEITEMS::iterator iter = oldItems.begin(); iter != oldItems.end(); ++iter) {
		QTreeWidgetItem* item = iter->second;
		if (item->isExpanded())
		{
			QVariant data = item->data(ITEM_ID);
			expandedItems.insert(data.toInt());
		}
	}

	//save selected node
	for (TREEITEMS::iterator iter = oldItems.begin(); iter != oldItems.end(); ++iter) {
		QTreeWidgetItem* item = iter->second;
		if (item->isSelected())
		{
			QVariant data = item->data(ITEM_ID);
			selectedItems.insert(data.toInt());
			HierarchyTreeNode* baseNode = HierarchyTreeController::Instance()->GetTree().GetNode(data.toInt());
			HierarchyTreeControlNode* selectedControl = dynamic_cast<HierarchyTreeControlNode* >(baseNode);
			if(NULL != selectedControl)
			{
				internalSelectionChanged = true;
			}
		}
	}
	
	//reset tree
	ui->treeWidget->clear();

	const HierarchyTree& tree = HierarchyTreeController::Instance()->GetTree();
	const HierarchyTreeRootNode* rootNode = tree.GetRootNode();
	for (HierarchyTreeNode::HIERARCHYTREENODESLIST::const_iterator iter = rootNode->GetChildNodes().begin();
		 iter != rootNode->GetChildNodes().end();
		 ++iter)
	{
		//add platform node
		const HierarchyTreePlatformNode* platformNode = (const HierarchyTreePlatformNode*)(*iter);
		QTreeWidgetItem* platformItem = new QTreeWidgetItem();
		platformItem->setData(ITEM_ID, platformNode->GetId());

		QString platformName = platformNode->GetName();
		if (platformNode->IsNeedSave())
		{
			platformName += " *";
		}
		platformItem->setText(0, platformName);

		platformItem->setIcon(0, QIcon(IconHelper::GetPlatformIconPath()));

		ui->treeWidget->insertTopLevelItem(ui->treeWidget->topLevelItemCount(), platformItem);
		
		for (HierarchyTreeNode::HIERARCHYTREENODESLIST::const_iterator iter = platformNode->GetChildNodes().begin();
			 iter != platformNode->GetChildNodes().end();
			 ++iter)
		{
			const HierarchyTreeScreenNode* screenNode = dynamic_cast<const HierarchyTreeScreenNode*>(*iter);
			DVASSERT(screenNode);

			QTreeWidgetItem* screenItem = new QTreeWidgetItem();
			screenItem->setData(ITEM_ID, screenNode->GetId());

			// Check whether this screen was changed.
			QString screenItemText = screenNode->GetName();
			if (screenNode->IsNeedSave())
			{
				screenItemText += " *";
			}
			screenItem->setText(0, screenItemText);

			if (dynamic_cast<const HierarchyTreeAggregatorNode*>(screenNode))
				screenItem->setIcon(0, QIcon(IconHelper::GetAggregatorIconPath()));
			else
				screenItem->setIcon(0, QIcon(IconHelper::GetScreenIconPath()));
			platformItem->insertChild(platformItem->childCount(), screenItem);
			
			AddControlItem(screenItem, screenNode->GetChildNodes());
		}
	}

	// Restore the selected items only after the tree is fully built.
	int itemsCount = ui->treeWidget->topLevelItemCount();
	for (int i = 0; i < itemsCount; i ++)
	{
		QTreeWidgetItem* rootItem = ui->treeWidget->topLevelItem(i);
		RestoreTreeItemExpandedStateRecursive(rootItem, expandedItems);
		
		if (needRestoreSelection)
		{
			RestoreTreeItemSelectedStateRecursive(rootItem, selectedItems);
		}
	}

	internalSelectionChanged = false;
}
示例#4
0
void HierarchyTreeWidget::OnTreeUpdated()
{
	EXPANDEDITEMS expandedItems;
	EXPANDEDITEMS selectedItems;
	//save opened node
	TREEITEMS oldItems = GetAllItems();
	for (TREEITEMS::iterator iter = oldItems.begin(); iter != oldItems.end(); ++iter) {
		QTreeWidgetItem* item = iter->second;
		if (item->isExpanded())
		{
			QVariant data = item->data(ITEM_ID);
			expandedItems.insert(data.toInt());
		}
	}

	//save selected node
	
	for (TREEITEMS::iterator iter = oldItems.begin(); iter != oldItems.end(); ++iter) {
		QTreeWidgetItem* item = iter->second;
		if (item->isSelected())
		{
			QVariant data = item->data(ITEM_ID);
			selectedItems.insert(data.toInt());
			HierarchyTreeNode* baseNode = HierarchyTreeController::Instance()->GetTree().GetNode(data.toInt());
			HierarchyTreeControlNode* selectedControl = dynamic_cast<HierarchyTreeControlNode* >(baseNode);
			if(NULL != selectedControl)
			{
				internalSelectionChanged = true;
			}
		}
	}
	
	//reset tree
	ui->treeWidget->clear();
	
	const HierarchyTree& tree = HierarchyTreeController::Instance()->GetTree();
	const HierarchyTreeRootNode* rootNode = tree.GetRootNode();
	for (HierarchyTreeNode::HIERARCHYTREENODESLIST::const_iterator iter = rootNode->GetChildNodes().begin();
		 iter != rootNode->GetChildNodes().end();
		 ++iter)
	{
		//add platform node
		const HierarchyTreePlatformNode* platformNode = (const HierarchyTreePlatformNode*)(*iter);
		QTreeWidgetItem* platformItem = new QTreeWidgetItem();
		platformItem->setData(ITEM_ID, platformNode->GetId());
		platformItem->setText(0, platformNode->GetName());
		platformItem->setIcon(0, QIcon(":/Icons/079i.png"));
		ui->treeWidget->insertTopLevelItem(ui->treeWidget->topLevelItemCount(), platformItem);
		
		for (HierarchyTreeNode::HIERARCHYTREENODESLIST::const_iterator iter = platformNode->GetChildNodes().begin();
			 iter != platformNode->GetChildNodes().end();
			 ++iter)
		{
			const HierarchyTreeScreenNode* screenNode = dynamic_cast<const HierarchyTreeScreenNode*>(*iter);
			DVASSERT(screenNode);

			QTreeWidgetItem* screenItem = new QTreeWidgetItem();
			screenItem->setData(ITEM_ID, screenNode->GetId());

			// Check whether this screen was changed.
			QString screenItemText = screenNode->GetName();
			if (screenNode->GetUnsavedChanges() != 0)
			{
				screenItemText += " *";
			}
			screenItem->setText(0, screenItemText);

			if (dynamic_cast<const HierarchyTreeAggregatorNode*>(screenNode))
				screenItem->setIcon(0, QIcon(":/Icons/170.png"));
			else
				screenItem->setIcon(0, QIcon(":/Icons/068i.png"));
			platformItem->insertChild(platformItem->childCount(), screenItem);
			
			AddControlItem(screenItem, selectedItems, expandedItems, screenNode->GetChildNodes());
			
			if (expandedItems.find(screenNode->GetId()) != expandedItems.end())
				screenItem->setExpanded(true);

			if (selectedItems.find(screenNode->GetId()) != selectedItems.end())
			{
				screenItem->setSelected(true);
			}
		}
		
		if (expandedItems.find(platformNode->GetId()) != expandedItems.end())
			platformItem->setExpanded(true);

		if (selectedItems.find(platformNode->GetId()) != selectedItems.end())
		{
			platformItem->setSelected(true);
		}
	}

	internalSelectionChanged = false;
}