00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include "scenedock.h"
00021
00022 #include <QtGui/QTreeView>
00023
00024 #include <core/debughelper.h>
00025 #include <engine/game.h>
00026 #include <engine/gameobject.h>
00027 #include <engine/scene.h>
00028
00029 #include <selectionmanager.h>
00030 #include <models/scenemodel.h>
00031
00032 #include <KAction>
00033 #include <KLocalizedString>
00034 #include <QMenu>
00035 #include <historymanager.h>
00036 #include <objectmanager.h>
00037
00038 using namespace GluonCreator;
00039
00040 class SceneDock::SceneDockPrivate
00041 {
00042 public:
00043 SceneDockPrivate()
00044 {
00045 model = 0;
00046 view = 0;
00047 }
00048 SceneModel* model;
00049 QTreeView* view;
00050 };
00051
00052
00053 SceneDock::SceneDock( const QString& title, QWidget* parent, Qt::WindowFlags flags )
00054 : QDockWidget( title, parent, flags )
00055 {
00056 setObjectName( "SceneDock" );
00057
00058 d = new SceneDockPrivate;
00059 d->view = new QTreeView( this );
00060 d->model = new SceneModel( d->view );
00061 setWidget( d->view );
00062
00063 if( GluonEngine::Game::instance()->currentScene() )
00064 d->model->setRootGameObject( GluonEngine::Game::instance()->currentScene()->sceneContents() );
00065
00066 connect( GluonEngine::Game::instance(), SIGNAL( currentSceneChanged( GluonEngine::Scene* ) ), SLOT( sceneChanged( GluonEngine::Scene* ) ) );
00067 connect( GluonEngine::Game::instance(), SIGNAL( updated( int ) ), d->model, SIGNAL( layoutChanged() ) );
00068
00069 d->view->setModel( d->model );
00070 d->view->setHeaderHidden( true );
00071 d->view->setDragEnabled( true );
00072 d->view->setAcceptDrops( true );
00073 d->view->setDropIndicatorShown( true );
00074 d->view->setDragDropMode( QAbstractItemView::DragDrop );
00075 d->view->setSelectionMode( QAbstractItemView::ExtendedSelection );
00076 d->view->setContextMenuPolicy( Qt::ActionsContextMenu );
00077 connect( d->view->selectionModel(), SIGNAL( selectionChanged( QItemSelection, QItemSelection ) ), SLOT( selectionChanged( QItemSelection, QItemSelection ) ) );
00078
00079 setupActions();
00080 }
00081
00082 SceneDock::~SceneDock()
00083 {
00084 delete d;
00085 }
00086
00087 void SceneDock::setupActions()
00088 {
00089 KAction* deleteAction = new KAction( KIcon( "edit-delete" ), i18n( "Delete Object(s)" ), d->view );
00090 d->view->addAction( deleteAction );
00091 deleteAction->setShortcut( KShortcut( Qt::Key_Delete ), KAction::DefaultShortcut );
00092 connect( deleteAction, SIGNAL( triggered( bool ) ), SLOT( deleteSelection() ) );
00093
00094 KAction* separator = new KAction( d->view );
00095 d->view->addAction( separator );
00096 separator->setSeparator( true );
00097
00098 KAction* newGameObject = new KAction( KIcon( "file-new" ), i18n( "New GameObject" ), d->view );
00099 d->view->addAction( newGameObject );
00100 connect( newGameObject, SIGNAL( triggered( bool ) ), SLOT( newGameObjectAction() ) );
00101 }
00102
00103 void SceneDock::selectionChanged( QItemSelection selected, QItemSelection deselected )
00104 {
00105 Q_UNUSED( deselected )
00106 DEBUG_FUNC_NAME
00107
00108 SelectionManager::SelectionList selection;
00109 foreach( const QItemSelectionRange & range, selected )
00110 {
00111 foreach( const QModelIndex & index, range.indexes() )
00112 {
00113 GluonCore::GluonObject* obj = static_cast<GluonCore::GluonObject*>( index.internalPointer() );
00114 selection.append( obj );
00115 }
00116 }
00117 SelectionManager::instance()->setSelection( selection );
00118 }
00119
00120 void SceneDock::sceneChanged( GluonEngine::Scene* obj )
00121 {
00122 if( obj )
00123 {
00124 d->model->setRootGameObject( obj->sceneContents() );
00125 SelectionManager::instance()->clearSelection();
00126 d->view->expandAll();
00127 }
00128 }
00129
00130 void SceneDock::deleteSelection()
00131 {
00132 if( d->view->selectionModel()->hasSelection() )
00133 {
00134 QItemSelection currentSelection = d->view->selectionModel()->selection();
00135 foreach( const QItemSelectionRange & range, currentSelection )
00136 {
00137 foreach( const QModelIndex & index, range.indexes() )
00138 {
00139 GluonEngine::GameObject* obj = static_cast<GluonEngine::GameObject*>( index.internalPointer() );
00140 if( obj && obj->parentGameObject() )
00141 {
00142 ObjectManager::instance()->deleteGameObject( obj );
00143 }
00144 }
00145
00146 d->view->reset();
00147 SelectionManager::instance()->setSelection( SelectionManager::SelectionList() );
00148 }
00149 }
00150 }
00151
00152 void GluonCreator::SceneDock::newGameObjectAction()
00153 {
00154 GluonEngine::GameObject* newChild = ObjectManager::instance()->createNewGameObject();
00155 if( newChild )
00156 d->view->reset();
00157 }