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