1 /*
2 *	Copyright (C) 2008,2009,2010 Thorsten Liebig (Thorsten.Liebig@gmx.de)
3 *
4 *	This program is free software: you can redistribute it and/or modify
5 *	it under the terms of the GNU Lesser General Public License as published
6 *	by the Free Software Foundation, either version 3 of the License, or
7 *	(at your option) any later version.
8 *
9 *	This program is distributed in the hope that it will be useful,
10 *	but WITHOUT ANY WARRANTY; without even the implied warranty of
11 *	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 *	GNU Lesser General Public License for more details.
13 *
14 *	You should have received a copy of the GNU Lesser General Public License
15 *	along with this program.  If not, see <http://www.gnu.org/licenses/>.
16 */
17 
18 #include <QMenu>
19 #include <QContextMenuEvent>
20 
21 #include "QCSTreeWidget.h"
22 #include "QCSXCAD_Global.h"
23 
QCSTreeWidget(ContinuousStructure * CS,QWidget * parent)24 QCSTreeWidget::QCSTreeWidget(ContinuousStructure* CS, QWidget * parent) : QTreeWidget(parent)
25 {
26 	clCS=CS;
27 	setColumnCount(2);
28 	setColumnWidth(0,200);
29 //	setColumnWidth(1,16);
30 	setHeaderLabels(QStringList(tr("Properties / Primitives"))<<tr("Vis"));
31 //	setItemHidden(headerItem(),true);
32 //	qTree->setDragEnabled(true);
33 //	qTree->setAcceptDrops(true);
34 //	qTree->setDropIndicatorShown(true);
35 	QObject::connect(this,SIGNAL(itemDoubleClicked(QTreeWidgetItem*,int)),this,SLOT(Edit(QTreeWidgetItem*,int)));
36 	QObject::connect(this,SIGNAL(itemClicked(QTreeWidgetItem*,int)),this,SLOT(Clicked(QTreeWidgetItem*,int)));
37 }
38 
~QCSTreeWidget()39 QCSTreeWidget::~QCSTreeWidget()
40 {
41 }
42 
GetCurrentProperty()43 CSProperties* QCSTreeWidget::GetCurrentProperty()
44 {
45 	QTreeWidgetItem* curr=currentItem();
46 	if (curr==NULL) return NULL;
47 	if (curr->type()==PRIMTYPE) curr=curr->parent();
48 	if (curr==NULL) return NULL;
49 	return clCS->GetProperty(indexOfTopLevelItem(curr));
50 }
51 
GetCurrentPrimitive()52 CSPrimitives* QCSTreeWidget::GetCurrentPrimitive()
53 {
54 	QTreeWidgetItem* curr=currentItem();
55 	if (curr==NULL) return NULL;
56 	if (curr->type()!=PRIMTYPE) return NULL;
57 	return clCS->GetPrimitiveByID(curr->data(0,1).toInt());
58 }
59 
AddPrimItem(CSPrimitives * prim)60 void QCSTreeWidget::AddPrimItem(CSPrimitives* prim)
61 {
62 	if (prim==NULL)
63 		return;
64 	int propID=clCS->GetIndex(prim->GetProperty());
65 	if (propID<0)
66 		return;
67 	QTreeWidgetItem* parent = topLevelItem(propID);
68 	if (parent==NULL)
69 		return;
70 	QString str = QString(prim->GetTypeName().c_str());
71 
72 	str+=QString(" - ID: %1").arg(prim->GetID());
73 	QTreeWidgetItem* newPrimItem = new QTreeWidgetItem(parent,QStringList(str),1);
74 	newPrimItem->setData(0,1,QVariant(prim->GetID()));
75 	vPrimItems.push_back(newPrimItem);
76 }
77 
AddPropItem(CSProperties * prop)78 void QCSTreeWidget::AddPropItem(CSProperties* prop)
79 {
80 	QString str;
81 	if (prop==NULL) return;
82 	str=QString(prop->GetTypeXMLString().c_str())+"::";
83 	str+=QString::fromUtf8(prop->GetName().c_str());
84 
85 	QTreeWidgetItem* newItem = new QTreeWidgetItem(this,QStringList(str),0);
86 	newItem->setFont(0,QFont("Arial",10));
87 	if (prop->GetVisibility()) newItem->setIcon(1,QIcon(":/images/bulb.png"));
88 	else newItem->setIcon(1,QIcon(":/images/bulb_off.png"));
89 }
90 
91 
GetTreeItemByPrimID(int primID)92 QTreeWidgetItem* QCSTreeWidget::GetTreeItemByPrimID(int primID)
93 {
94 	for (int n=0;n<vPrimItems.size();++n)
95 		if (vPrimItems.at(n)->data(0,1).toInt()==primID)
96 			return vPrimItems.at(n);
97 	return NULL;
98 }
99 
GetTreeItemIndexByPrimID(int primID)100 int QCSTreeWidget::GetTreeItemIndexByPrimID(int primID)
101 {
102 	for (int n=0;n<vPrimItems.size();++n)
103 		if (vPrimItems.at(n)->data(0,1).toInt()==primID)
104 			return n;
105 	return -1;
106 }
107 
DeletePrimItem(CSPrimitives * prim)108 void QCSTreeWidget::DeletePrimItem(CSPrimitives* prim)
109 {
110 	int index=GetTreeItemIndexByPrimID(prim->GetID());
111 	QTreeWidgetItem* item;
112 	if ((index>=0) && (index<vPrimItems.size()))
113 		item=vPrimItems.at(index);
114 	else return;
115 	vPrimItems.remove(index);
116 	delete item;
117 }
118 
DeletePropItem(CSProperties * prop)119 void QCSTreeWidget::DeletePropItem(CSProperties* prop)
120 {
121 	int index=clCS->GetIndex(prop);
122 
123 	QTreeWidgetItem* parent = topLevelItem(index);
124 	if (parent==NULL) return;
125 
126 	delete parent;
127 }
128 
RefreshItem(int index)129 void QCSTreeWidget::RefreshItem(int index)
130 {
131 	CSProperties* prop=clCS->GetProperty(index);
132 	if (prop==NULL) return;
133 	QTreeWidgetItem* item = topLevelItem(index);
134 	if (item==NULL) return;
135 	QString str=QString(prop->GetTypeXMLString().c_str())+"::";
136 	str+=QString::fromUtf8(prop->GetName().c_str());
137 	item->setText(0,str);
138 	if (prop->GetVisibility()) item->setIcon(1,QIcon(":/images/bulb.png"));
139 	else item->setIcon(1,QIcon(":/images/bulb_off.png"));
140 }
141 
142 
contextMenuEvent(QContextMenuEvent * event)143 void QCSTreeWidget::contextMenuEvent(QContextMenuEvent *event)
144 {
145 	QMenu menu(this);
146 	if (QCSX_Settings.GetEdit())
147 	{
148 		QMenu* primM = menu.addMenu(QIcon(":/images/edit_add.png"),tr("New Primitive"));
149 		primM->addAction(tr("Box"),this,SIGNAL(NewBox()));
150 		primM->addAction(tr("Multi-Box"),this,SIGNAL(NewMultiBox()));
151 		primM->addAction(tr("Sphere"),this,SIGNAL(NewSphere()));
152 		primM->addAction(tr("Cylinder"),this,SIGNAL(NewCylinder()));
153 		primM->addAction(tr("User Defined"),this,SIGNAL(NewUserDefined()));
154 
155 		QMenu* propM = menu.addMenu(QIcon(":/images/edit_add.png"),tr("New Property"));
156 		propM->addAction(tr("Material"),this,SIGNAL(NewMaterial()));
157 		propM->addAction(tr("Metal"),this,SIGNAL(NewMetal()));
158 		propM->addAction(tr("Excitation"),this,SIGNAL(NewExcitation()));
159 		propM->addAction(tr("Probe-Box"),this,SIGNAL(NewChargeBox()));
160 		propM->addAction(tr("Res-Box"),this,SIGNAL(NewResBox()));
161 		propM->addAction(tr("Dump-Box"),this,SIGNAL(NewDumpBox()));
162 
163 		menu.addSeparator();
164 
165 		menu.addAction(QIcon(":/images/edit.png"),tr("Edit"),this,SIGNAL(Edit()));
166 		menu.addAction(QIcon(":/images/editcopy.png"),tr("Copy"),this,SIGNAL(Copy()));
167 		menu.addAction(QIcon(":/images/edit_remove.png"),tr("Delete"),this,SIGNAL(Delete()));
168 	}
169 	else
170 	{
171 		menu.addAction(QIcon(":/images/edit.png"),tr("View"),this,SIGNAL(Edit()));
172 	}
173 
174 	menu.exec(event->globalPos());
175 }
176 
UpdateTree()177 void QCSTreeWidget::UpdateTree()
178 {
179 	ClearTree();
180 	for (size_t i=0;i<clCS->GetQtyProperties();++i)
181 	{
182 		QString str;
183 		CSProperties* prop=clCS->GetProperty(i);
184 		if (prop==NULL) break;
185 		AddPropItem(prop);
186 	}
187 
188 	std::vector<CSPrimitives*> vPrims = clCS->GetAllPrimitives();
189 	for (size_t i=0;i<vPrims.size();++i)
190 		AddPrimItem(vPrims.at(i));
191 }
192 
ClearTree()193 void QCSTreeWidget::ClearTree()
194 {
195 	this->clear();
196 	vPrimItems.clear();
197 }
198 
SwitchProperty(CSPrimitives * prim,CSProperties * newProp)199 void QCSTreeWidget::SwitchProperty(CSPrimitives* prim, CSProperties* newProp)
200 {
201 	int index=GetTreeItemIndexByPrimID(prim->GetID());
202 	QTreeWidgetItem *item=NULL;
203 	if ((index>=0) && (index<vPrimItems.size()))
204 		item=vPrimItems.at(index);
205 	else
206 		return;
207 
208 	QTreeWidgetItem *parent=item->parent();
209 	if (parent==NULL)
210 		return;
211 	QTreeWidgetItem *newParent = topLevelItem(clCS->GetIndex(newProp));
212 	if (newParent==NULL)
213 		return;
214 
215 	parent->takeChild(parent->indexOfChild(item));
216 	newParent->addChild(item);
217 }
218 
collapseAll()219 void QCSTreeWidget::collapseAll()
220 {
221 	for (int i=0;i<topLevelItemCount();++i) collapseItem(topLevelItem(i));
222 }
223 
expandAll()224 void QCSTreeWidget::expandAll()
225 {
226 	for (int i=0;i<topLevelItemCount();++i) expandItem(topLevelItem(i));
227 }
228 
Edit(QTreeWidgetItem * item,int column)229 void QCSTreeWidget::Edit(QTreeWidgetItem * item, int column)
230 {
231 	UNUSED(column);
232 	if (item==NULL) return;
233 	if (item->type()!=PRIMTYPE) return;
234 	emit Edit();
235 }
236 
Clicked(QTreeWidgetItem * item,int column)237 void QCSTreeWidget::Clicked(QTreeWidgetItem * item, int column)
238 {
239 	if (item==NULL) return;
240 	if (item->type()!=PROPTYPE) return;
241 	if (column==1) {emit ShowHide();}
242 }
243