Developer Documentation

objectPickDialog.cc
1 /*===========================================================================*\
2 * *
3 * OpenFlipper *
4 * Copyright (c) 2001-2015, RWTH-Aachen University *
5 * Department of Computer Graphics and Multimedia *
6 * All rights reserved. *
7 * www.openflipper.org *
8 * *
9 *---------------------------------------------------------------------------*
10 * This file is part of OpenFlipper. *
11 *---------------------------------------------------------------------------*
12 * *
13 * Redistribution and use in source and binary forms, with or without *
14 * modification, are permitted provided that the following conditions *
15 * are met: *
16 * *
17 * 1. Redistributions of source code must retain the above copyright notice, *
18 * this list of conditions and the following disclaimer. *
19 * *
20 * 2. Redistributions in binary form must reproduce the above copyright *
21 * notice, this list of conditions and the following disclaimer in the *
22 * documentation and/or other materials provided with the distribution. *
23 * *
24 * 3. Neither the name of the copyright holder nor the names of its *
25 * contributors may be used to endorse or promote products derived from *
26 * this software without specific prior written permission. *
27 * *
28 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS *
29 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED *
30 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A *
31 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER *
32 * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, *
33 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, *
34 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR *
35 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF *
36 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING *
37 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS *
38 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
39 * *
40 \*===========================================================================*/
41
42
43
44 //== INCLUDES =================================================================
45 #include <QHBoxLayout>
46 #include <QPushButton>
47 #include <QTreeView>
48 #include <QMouseEvent>
49
50 #include <OpenFlipper/BasePlugin/PluginFunctions.hh>
51 #include <OpenFlipper/widgets/glWidget/simpleViewer.hh>
52 #include <OpenFlipper/widgets/glWidget/QtBaseViewer.hh>
53
54 #include "objectPickDialog.hh"
55 #include "TreeModel.hh"
56
57 //== NAMESPACES ===============================================================
58 namespace VSI {
59
60 //=============================================================================
61 //
62 // CLASS VSI::ObjectPickDialog - IMPLEMENTATION
63 //
64 //=============================================================================
65
67 ObjectPickDialog::ObjectPickDialog(QWidget* parent, QStringList _flags, QStringList _types, bool _withGroups) :
68 QDialog (parent),
69 selectedId_(0)
70 {
71 QHBoxLayout *hL = new QHBoxLayout;
72 QHBoxLayout *bL = new QHBoxLayout;
73 QVBoxLayout *vL = new QVBoxLayout;
74
75 model_ = new TreeModel ();
76
77 treeView_ = new QTreeView;
78 treeView_->setModel (model_);
79 treeView_->resizeColumnToContents (0);
80 treeView_->setSelectionMode (QAbstractItemView::SingleSelection);
81 treeView_->setSelectionBehavior (QAbstractItemView::SelectRows);
82
83 viewer_ = new SimpleViewer ();
84 viewer_->properties ().objectMarker (&marker_);
85
86 okButton_ = new QPushButton (tr("OK"));
87 cancelButton_ = new QPushButton (tr("Cancel"));
88
89 connect (okButton_, SIGNAL (pressed()), this, SLOT (accept()));
90 connect (cancelButton_, SIGNAL (pressed()), this, SLOT (reject()));
91
92 hL->addWidget (viewer_);
93 hL->setStretchFactor (viewer_, 1);
94 hL->addWidget (treeView_);
95
96 bL->addStretch (1);
97 bL->addWidget (okButton_);
98 bL->addWidget (cancelButton_);
99
100 vL->addLayout(hL);
101 vL->addLayout(bL);
102
103 setLayout (vL);
104
105 resize (700, 400);
106
107 setWindowTitle(tr("Click on object or select from list..."));
108
109 connect (treeView_, SIGNAL (activated( const QModelIndex& )),
110 this, SLOT (activated(const QModelIndex&)));
111 connect (viewer_->viewer(), SIGNAL (signalMouseEventClick(QMouseEvent*, bool)),
112 this, SLOT (slotMouseEventClick(QMouseEvent*, bool)));
113
114 for (PluginFunctions::BaseObjectIterator o_it; o_it != PluginFunctions::baseObjectsEnd(); ++o_it) {
115
116 bool ok = true;
117
118 if (!_flags.empty ())
119 {
120 bool found = false;
121 foreach (QString flag, _flags)
122 if (o_it->flag (flag))
123 {
124 found = true;
125 break;
126 }
127
128 if (!found)
129 ok = false;
130 }
131
132 if (!_types.empty ())
133 {
134 if (!_types.contains (typeName (o_it->dataType())))
135 ok = false;
136 }
137
138 if (o_it->isGroup() && !_withGroups)
139 continue;
140
141 if (ok)
142 {
143 if (!_withGroups)
144 model_->objectAdded(o_it, PluginFunctions::objectRoot());
145 else
146 model_->objectAdded (o_it);
147 }
148 }
149 }
150
151 //------------------------------------------------------------------------------
152
154 ObjectPickDialog::~ ObjectPickDialog()
155 {
156 for (PluginFunctions::BaseObjectIterator o_it; o_it != PluginFunctions::baseObjectsEnd(); ++o_it) {
157 o_it->setFlag("vsi_objectId_selected", false);
158 }
159
160 delete model_;
161 }
162
163 //------------------------------------------------------------------------------
164
165 void ObjectPickDialog::activated(const QModelIndex & _index)
166 {
167 if (_index.isValid()) {
168
169 TreeItem *item = static_cast<TreeItem*>(_index.internalPointer());
170 if (item)
171 {
172 selectedId (item->id());
173 }
174 }
175 }
176
177 //------------------------------------------------------------------------------
178
179 void ObjectPickDialog::slotMouseEventClick(QMouseEvent * _event, bool /*_double*/)
180 {
181 size_t nodeIdx, targetIdx;
182
183 if (viewer_->viewer()->pick(ACG::SceneGraph::PICK_ANYTHING, _event->pos(), nodeIdx, targetIdx))
184 {
185
186 BaseObjectData *obj;
187
188 if (PluginFunctions::getPickedObject (nodeIdx, obj))
189 {
190 if (!obj->flag ("vsi_objectId_disabled"))
191 {
192 selectedId (obj->id());
193 }
194 }
195 }
196 }
197
198 //------------------------------------------------------------------------------
199
200 unsigned int VSI::ObjectPickDialog::selectedId()
201 {
202 return selectedId_;
203 }
204
205 //------------------------------------------------------------------------------
206
207 void VSI::ObjectPickDialog::selectedId(unsigned int _id)
208 {
209 BaseObject *obj = 0;
210
211 if (PluginFunctions::getObject(_id, obj))
212 {
213 BaseObject* obj2 = 0;
214
215 if (selectedId_ != _id && PluginFunctions::getObject(selectedId_, obj2))
216 {
217 obj2->setFlag ("vsi_objectId_selected", false);
218 if (obj2->isGroup())
219 setForGroup (obj2, "vsi_objectId_selected", false);
220 }
221 obj->setFlag ("vsi_objectId_selected", true);
222 if (obj->isGroup())
223 setForGroup (obj, "vsi_objectId_selected", true);
224
225 selectedId_ = _id;
226 viewer_->viewer()->updateGL ();
227 treeView_->setCurrentIndex (model_->getModelIndex(_id, 0));
228 }
229 }
230
231 //------------------------------------------------------------------------------
232
233 void VSI::ObjectPickDialog::setForGroup(BaseObject *_obj, QString _flag, bool _enabled)
234 {
235 for (PluginFunctions::BaseObjectIterator o_it; o_it != PluginFunctions::baseObjectsEnd(); ++o_it) {
236 if (o_it->id () == _obj->id ())
237 continue;
238 if (o_it->isInGroup (_obj->id ()))
239 {
240 o_it->setFlag(_flag, _enabled);
241 if (o_it->isGroup())
242 setForGroup (o_it, _flag, _enabled);
243 }
244 }
245 }
246
247 //------------------------------------------------------------------------------
248 }
249
250
BaseObject::isGroup
bool isGroup() const
Check if object is a group.
Definition: BaseObject.cc:619
VSI::ObjectPickDialog::selectedId
unsigned int selectedId()
Current selected object.
Definition: objectPickDialog.cc:200
typeName
DLLEXPORT QString typeName(DataType _id)
Get the name of a type with given id.
Definition: Types.cc:154
PluginFunctions::baseObjectsEnd
DLLEXPORT BaseObjectIterator baseObjectsEnd()
Return Iterator to Object End.
Definition: PluginFunctionsBaseIterator.cc:186
ACG::SceneGraph::PICK_ANYTHING
pick any of the prior targets (should be implemented for all nodes)
Definition: PickTarget.hh:84
BaseObject::flag
bool flag(QString _flag)
Definition: BaseObject.cc:299
BaseObject::id
int id() const
Definition: BaseObject.cc:190
PluginFunctions::getPickedObject
bool getPickedObject(const size_t _node_idx, BaseObjectData *&_object)
Get the picked mesh.
Definition: PluginFunctions.cc:259
PluginFunctions.hh
VSI::ObjectPickDialog::ObjectPickDialog
ObjectPickDialog(QWidget *parent, QStringList _flags, QStringList _types, bool _withGroups)
Constructor.
Definition: objectPickDialog.cc:67
TreeModel::getModelIndex
QModelIndex getModelIndex(TreeItem *_object, int _column)
Return the ModelIndex corresponding to a given TreeItem and Column.
Definition: TreeModel.cc:562
TreeItem
Definition: TreeItem.hh:52
PluginFunctions::getObject
bool getObject(const int _identifier, BaseObject *&_object)
Get the object which has the given identifier.
Definition: PluginFunctions.cc:294
PluginFunctions::objectRoot
BaseObject *& objectRoot()
Get the root of the object structure.
Definition: PluginFunctions.cc:1099
BaseObject::setFlag
void setFlag(QString _flag, bool _set)
Definition: BaseObject.cc:304
TreeItem::id
int id()
id
Definition: TreeItem.cc:78
glViewer::updateGL
virtual void updateGL()
Redraw scene. Triggers paint event for updating the view (cf. drawNow()).
Definition: QtBaseViewer.cc:524
Viewer::ViewerProperties::objectMarker
void objectMarker(ViewObjectMarker *_marker)
set object marker for viewer
Definition: ViewerProperties.cc:330
BaseObject
Definition: BaseObject.hh:82
VSI
Definition: baseWidget.cc:72
SimpleViewer::viewer
glViewer * viewer()
Viewer.
Definition: simpleViewer.cc:166
SimpleViewer
Definition: simpleViewer.hh:80
TreeModel
Definition: TreeModel.hh:53
BaseObjectData
Definition: BaseObjectData.hh:102
SimpleViewer::properties
Viewer::ViewerProperties & properties()
Viewer properties.
Definition: simpleViewer.cc:161
glViewer::pick
bool pick(ACG::SceneGraph::PickTarget _pickTarget, const QPoint &_mousePos, size_t &_nodeIdx, size_t &_targetIdx, ACG::Vec3d *_hitPointPtr=0)
Definition: QtBaseViewerPicking.cc:71
TreeModel::objectAdded
void objectAdded(BaseObject *_object)
The object with the given id has been added. add it to the internal tree.
Definition: TreeModel.cc:426
PluginFunctions::BaseObjectIterator
Core Data Iterator used to iterate over all objects (Including groups)
Definition: PluginFunctions.hh:675