51#include "QtSceneGraphWidget.hh"
52#include "QtMaterialDialog.hh"
53#include "QtTextureDialog.hh"
54#include "QtClippingDialog.hh"
55#include "QtCoordFrameDialog.hh"
56#include "QtShaderDialog.hh"
57#include <QActionGroup>
59#include "../Scenegraph/MaterialNode.hh"
60#include "../Scenegraph/TextureNode.hh"
61#include "../Scenegraph/ClippingNode.hh"
62#include "../Scenegraph/ShaderNode.hh"
63#include "../Scenegraph/CoordFrameNode.hh"
65#include "ui_QtMaterialDialogUi.h"
83SceneGraphWidgetGenerator::SceneGraphWidgetGenerator() {
88 std::cerr <<
"SceneGraphWidgetGenerator::getWidget not implemented!" << std::endl;
94 std::cerr <<
"SceneGraphWidgetGenerator::canHandle not implemented!" << _className << std::endl;
100 std::cerr <<
"SceneGraphWidgetGenerator::canHandle not implemented!" << std::endl;
101 return std::string(
"Unset Type");
106 std::cerr <<
"SceneGraphWidgetGenerator::contextMenuName not implemented!" << std::endl;
107 return QString(
"Context Menu name unset");
113 QTreeWidget( _parent ),
119 setRootIsDecorated(
true);
121 setSortingEnabled(
false );
123 setSelectionMode( QAbstractItemView::SingleSelection );
128 QStringList column_names;
129 column_names.append(
"Node" );
130 column_names.append(
"Type" );
131 column_names.append(
"Status" );
132 column_names.append(
"Mode" );
134 setHeaderLabels( column_names );
136 modeMenu_ =
new QMenu(
this );
143 statusActions_.menu_ =
new QMenu(
this );
145 QActionGroup * status_ag =
new QActionGroup( statusActions_.menu_ );
146 status_ag->setExclusive(
true );
148 statusActions_.actionActive_ =
new QAction(
"Active", status_ag );
149 statusActions_.actionActive_->setCheckable(
true );
152 statusActions_.actionHideNode_ =
new QAction(
"Hide Node", status_ag );
153 statusActions_.actionHideNode_->setCheckable(
true );
156 statusActions_.actionHideChildren_ =
new QAction(
"Hide Children", status_ag );
157 statusActions_.actionHideChildren_->setCheckable(
true );
160 statusActions_.actionHideSubtree_ =
new QAction(
"Hide Subtree", status_ag );
161 statusActions_.actionHideSubtree_->setCheckable(
true );
164 statusActions_.menu_->addActions( status_ag->actions() );
166 connect( status_ag, SIGNAL( triggered( QAction * ) ),
167 this, SLOT( slotStatusMenu( QAction * ) ) );
171 connect(
this, SIGNAL(itemPressed(QTreeWidgetItem*,
int) ),
172 this, SLOT(slotItemPressed(QTreeWidgetItem*,
int)) );
174 connect(
this, SIGNAL(itemExpanded(QTreeWidgetItem*) ),
175 this, SLOT(slotItemExpandedOrCollapsed(QTreeWidgetItem*)) );
176 connect(
this, SIGNAL(itemCollapsed(QTreeWidgetItem*) ),
177 this, SLOT(slotItemExpandedOrCollapsed(QTreeWidgetItem*)) );
181 setMinimumWidth( 600 );
182 setMinimumHeight( 400 );
198 Item * item =
new Item(
this, _node );
202 for (; cRIt != cREnd; ++cRIt)
207 resizeColumnToContents( 0 );
208 resizeColumnToContents( 1 );
209 resizeColumnToContents( 2 );
210 resizeColumnToContents( 3 );
212 setMinimumWidth( columnWidth(0) + columnWidth(1) + columnWidth(2) + columnWidth(3) );
224 Item* item =
new Item( _parent, _node );
229 for (; cRIt != cREnd; ++cRIt)
239slotItemExpandedOrCollapsed( QTreeWidgetItem* )
241 resizeColumnToContents( 0 );
250slotItemPressed( QTreeWidgetItem * _item,
256 curItem_ =
static_cast<Item*
>(_item);
263 statusActions_.actionActive_ ->setChecked(
false );
264 statusActions_.actionHideNode_ ->setChecked(
false );
265 statusActions_.actionHideChildren_->setChecked(
false );
266 statusActions_.actionHideSubtree_ ->setChecked(
false );
271 statusActions_.actionActive_->setChecked(
true );
274 statusActions_.actionHideNode_->setChecked(
true );
277 statusActions_.actionHideChildren_->setChecked(
true );
280 statusActions_.actionHideSubtree_->setChecked(
true );
283 statusActions_.menu_->popup( QCursor::pos() );
292 QActionGroup * modeGroup =
new QActionGroup( modeMenu_ );
293 modeGroup->setExclusive(
true );
294 connect( modeGroup, SIGNAL( triggered( QAction * ) ),
295 this, SLOT( slotModeMenu( QAction * ) ) );
302 std::vector< ACG::SceneGraph::DrawModes::DrawMode > available_modes( availDrawModes.getAtomicDrawModes() );
305 for (
unsigned int i = 0; i < available_modes.size(); ++i )
310 QAction * action =
new QAction( descr.c_str(), modeGroup );
311 action->setCheckable(
true );
312 action->setChecked ( currentDrawMode.containsAtomicDrawMode(
id ) ) ;
313 action->setData( QVariant( quint64(
id.getIndex()) ) );
316 modeMenu_->addActions( modeGroup->actions() );
320 modeMenu_->addSeparator();
321 QAction * action = modeMenu_->addAction(
"Edit material" );
322 connect( action, SIGNAL( triggered() ),
323 this, SLOT( slotEditMaterial() ) );
326 if (
dynamic_cast<SceneGraph::TextureNode*
>( node ) )
328 modeMenu_->addSeparator();
329 QAction * action = modeMenu_->addAction(
"Edit texture" );
330 connect( action, SIGNAL( triggered() ),
331 this, SLOT( slotEditTexture() ) );
336 modeMenu_->addSeparator();
337 QAction * action = modeMenu_->addAction(
"Edit shaders" );
338 connect( action, SIGNAL( triggered() ),
339 this, SLOT( slotEditShader() ) );
342 if (
dynamic_cast<SceneGraph::ClippingNode*
>( node ) )
344 modeMenu_->addSeparator();
345 QAction * action = modeMenu_->addAction(
"Edit clip planes" );
346 connect( action, SIGNAL( triggered() ),
347 this, SLOT( slotEditClipPlanes() ) );
350 if (
dynamic_cast<SceneGraph::CoordFrameNode*
>( node ) )
352 modeMenu_->addSeparator();
353 QAction * action = modeMenu_->addAction(
"Edit coord frame" );
354 connect( action, SIGNAL( triggered() ),
355 this, SLOT( slotEditCoordinateFrame() ) );
359 if ( generatorMap_.contains( node->
className() ) ) {
360 QWidget* widget = generatorMap_[node->
className()]->getWidget( node );
361 modeMenu_->addAction( generatorMap_[node->
className()]->contextMenuName() , widget, SLOT(show()) );
364 modeMenu_->popup( QCursor::pos() );
377void QtSceneGraphWidget::slotEditMaterial()
384 QtMaterialDialog* dialog =
new QtMaterialDialog(
this, node );
398void QtSceneGraphWidget::slotEditTexture()
402 SceneGraph::TextureNode * node =
403 dynamic_cast< SceneGraph::TextureNode *
>( curItem_->node() );
405 QtTextureDialog* dialog =
new QtTextureDialog(
this, node );
419void QtSceneGraphWidget::slotEditShader()
426 QtShaderDialog* dialog =
new QtShaderDialog(
this, node );
441void QtSceneGraphWidget::slotEditClipPlanes()
445 SceneGraph::ClippingNode * node =
446 dynamic_cast< SceneGraph::ClippingNode *
>( curItem_->node() );
448 QtClippingDialog * dialog =
new QtClippingDialog(
this, node );
463void QtSceneGraphWidget::slotEditCoordinateFrame()
467 SceneGraph::CoordFrameNode * node =
468 dynamic_cast< SceneGraph::CoordFrameNode *
>( curItem_->node() );
470 QtCoordFrameDialog * dialog =
new QtCoordFrameDialog(
this, node );
485void QtSceneGraphWidget::slotModeMenu( QAction * _action )
487 SceneGraph::DrawModes::DrawMode new_drawmode( _action->data().toUInt());
489 curItem_->node()->
drawMode( new_drawmode );
498void QtSceneGraphWidget::slotStatusMenu( QAction * _action )
502 unsigned int status = _action->data().toUInt();
517 switch(_event->key())
519 case Qt::Key_Shift: shiftPressed_ =
true;
break;
520 default : _event->ignore();
527 switch(_event->key())
529 case Qt::Key_Shift: shiftPressed_ =
false;
break;
530 default : _event->ignore();
537void QtSceneGraphWidget::expandAll() {
539 QTreeWidget::expandAll();
541 resizeColumnToContents(0);
544void QtSceneGraphWidget::updateAll() {
548 QTreeWidget::expandAll();
551 resizeColumnToContents(0);
567 if ( generatorMap_.contains( _generator->
handles() ) ) {
568 std::cerr <<
"Already handled" << std::endl;
573 generatorMap_[_generator->
handles() ] = _generator;
584QtSceneGraphWidget::Item::Item( QTreeWidget * _parent,
586 : QTreeWidgetItem(_parent), node_(_node)
595QtSceneGraphWidget::Item::Item( Item * _parent,
597 : QTreeWidgetItem(_parent), node_(_node)
607QtSceneGraphWidget::Item::update()
609 QString name = tr(
"%1 @ 0x%2")
610 .arg(node_->
name().c_str())
611 .arg(
reinterpret_cast<uintptr_t
>(node_), 0, 16);
612 setText( 0, name.toStdString().c_str());
631QtSceneGraphDialog( QWidget* _parent,
637 QVBoxLayout* l =
new QVBoxLayout(
this );
639 QWidget* buttons =
new QWidget(
this);
640 QHBoxLayout* butLayout =
new QHBoxLayout(buttons);
646 QPushButton* expAll =
new QPushButton(
"Expand all");
647 QPushButton* collAll =
new QPushButton(
"Collapse all");
648 QPushButton* updAll =
new QPushButton(
"Update all");
650 butLayout->addWidget(expAll);
651 butLayout->addWidget(collAll);
652 butLayout->addWidget(updAll);
654 l->addWidget(buttons);
662 connect(expAll, SIGNAL(pressed()), sgw_, SLOT(expandAll()));
663 connect(collAll, SIGNAL(pressed()), sgw_, SLOT(collapseAll()));
664 connect(updAll, SIGNAL(pressed()), sgw_, SLOT(updateAll()));
ACG::SceneGraph::MaterialNode MaterialNode
Materialnode.
ACG::SceneGraph::BaseNode BaseNode
Base Node.
ACG::SceneGraph::ShaderNode ShaderNode
Simple Name for ShaderNode.
std::vector< BaseNode * >::reverse_iterator ChildRIter
allows to reverse iterate over children
DrawModes::DrawMode drawMode() const
Return the own draw modes of this node.
@ HideNode
Hide this node, but draw children.
@ HideChildren
Draw this node, but hide children.
@ HideSubtree
Hide this node and its children.
@ Active
Draw node & children.
ChildRIter childrenREnd()
Returns: reverse end-iterator of children.
ChildRIter childrenRBegin()
Returns: reverse begin-iterator of children.
StatusMode status() const
Get node's status.
void set_status(StatusMode _s)
Set the status of this node.
virtual const std::string & className() const =0
Return class name (implemented by the ACG_CLASSNAME macro)
virtual DrawModes::DrawMode availableDrawModes() const
std::string name() const
Returns: name of node (needs not be unique)
std::string description() const
DrawMode DEFAULT
use the default (global) draw mode and not the node's own.
Namespace providing different geometric functions concerning angles.