void OsgNav::myInit() { //The top level nodes of the tree mRootNode = new osg::Group(); mNoNav = new osg::Group(); mNavTrans = new osg::MatrixTransform(); cameraMT = new osg::MatrixTransform(); mNavigator.init(); mRootNode->addChild(mNoNav.get()); // run optimization over the scene graph osgUtil::Optimizer optimizer; optimizer.optimize(mRootNode.get()); osg::notify( osg::ALWAYS ) << "my init" << std::endl; moduleRegistry->registerSceneView(getSceneView()); moduleRegistry->registerRootNode(cameraMT.get()); moduleRegistry->getScene()->createScene(); osg::Matrix cameraMatrix; cameraMatrix.makeLookAt(osg::Vec3f(140, -400, 50), osg::Vec3f(140, 0, 50), osg::Vec3f(0, 0, 1)); cameraMT->setMatrix(cameraMatrix); mNavTrans->addChild(cameraMT.get()); mRootNode->addChild(mNavTrans.get()); debugText = moduleRegistry->getText2D()->print(); }
/**************************************************************************** ** ** Copyright (C) 2015 ** ** This file is generated by the Magus toolkit ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ****************************************************************************/ // Include #include <QHBoxLayout> #include <QVBoxLayout> #include <QMessageBox> #include <QHeaderView> #include <QEvent> #include <QImage> #include <QPixmap> #include <QTreeWidgetItem> #include "tool_sceneviewwidget.h" namespace Magus { //****************************************************************************/ QtSceneViewWidget::QtSceneViewWidget(const QString& iconDir, QWidget* parent) : QWidget(parent) { setWindowTitle(QString("Scene view")); mIconDir = iconDir; QVBoxLayout* mainLayout = new QVBoxLayout; mSearchLayout = new QHBoxLayout; mTreeLayout = new QVBoxLayout; // Create edit mSearchLine = new QLineEdit(); connect(mSearchLine, SIGNAL(textChanged(QString)), this, SLOT(searchLineTextChanged(QString))); // Create findbutton QImage imageSearch(mIconDir + TOOL_SCENEVIEW_ICON_SEARCH); QPixmap pixMapSearch = QPixmap::fromImage(imageSearch).scaled(TOOL_SCENEVIEW_ICON_WIDTH, TOOL_SCENEVIEW_ICON_WIDTH); mSearchLabel = new QLabel(); mSearchLabel->setPixmap(pixMapSearch); mSearchLabel->setContentsMargins(-8, -8, -8, -8); // Create clearbutton QImage imageClear(mIconDir + TOOL_SCENEVIEW_ICON_CLOSE); QPixmap pixMapClear = QPixmap::fromImage(imageClear).scaled(TOOL_SCENEVIEW_ICON_WIDTH, TOOL_SCENEVIEW_ICON_WIDTH); mSearchClearButton = new QPushButton(); mSearchClearButton->setStyleSheet(QString("QPushButton {border: none; background: transparent;} QPushButton:hover {background: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 #565656, stop:1 #464646);}")); mSearchClearButton->setIcon(QIcon(pixMapClear)); mSearchClearButton->setIconSize(QSize(TOOL_SCENEVIEW_ICON_WIDTH, TOOL_SCENEVIEW_ICON_WIDTH)); mSearchClearButton->setContentsMargins(-8, -8, -8, -8); connect(mSearchClearButton, SIGNAL(clicked()), this, SLOT(clearSearchLine())); // Misc mVisibilityIconVisibleForGroups = true; mVisibilityIconVisibleForAssets = true; mDeletionIconVisibleForGroups = true; mDeletionIconVisibleForAssets = true; // Layout mSearchLayout->addWidget(mSearchLabel, 1); mSearchLayout->addWidget(mSearchLine, 2000); mSearchLayout->addWidget(mSearchClearButton, 1); setVisibilitySearchWidgets(false); mainLayout->addLayout(mSearchLayout, 1); mainLayout->addLayout(mTreeLayout, 2000); setLayout(mainLayout); } //****************************************************************************/ QtSceneViewWidget::~QtSceneViewWidget(void) { // Delete all QtAssetGroups in mAssetGroupMap foreach (QtAssetGroup* group, mAssetGroupMap) delete group; mAssetGroupMap.clear(); } //****************************************************************************/ bool QtSceneViewWidget::eventFilter(QObject* object, QEvent* event) { QMouseEvent* mouseEvent = (QMouseEvent*) event; switch ((int) event->type()) { case QEvent::MouseButtonPress: mouseClickHandler(mouseEvent); break; } return QObject::eventFilter(object, event); } //****************************************************************************/ void QtSceneViewWidget::mouseClickHandler(QMouseEvent* event) { switch ((int) event->button()) { case Qt::LeftButton: { // Get the selected item of the visible sceneview QTreeWidget* sceneView = getCurrentVisibleScene(); if (sceneView) { QTreeWidgetItem* item = sceneView->itemAt(event->pos()); int col = sceneView->columnAt(event->pos().x()); if (itemIsGroup(item)) { if (col == TOOL_SCENEVIEW_COLUMN_GROUP_CLOSE) { handleDeletionOfGroup(sceneView, item); return; } else if (col == TOOL_SCENEVIEW_COLUMN_GROUP_VISIBILITY) { // Toggle visibility toggleVisibilityOfGroup(item); } int groupId = getGroupIdOfGroupItem(item); emit groupSelected(sceneView, groupId); } else if (itemIsAsset(item)) { if (col == TOOL_SCENEVIEW_COLUMN_ASSET_CLOSE) { handleDeletionOfAsset(sceneView, item); return; } else if (col == TOOL_SCENEVIEW_COLUMN_ASSET_VISIBILITY) { // Toggle visibility toggleVisibilityOfAsset(item); } int groupId = getGroupIdOfAssetItem(item); int assetId = getAssetIdOfAssetItem(item); emit assetSelected(sceneView, groupId, assetId); } } } break; case Qt::RightButton: { // TODO } break; } } //****************************************************************************/ bool QtSceneViewWidget::groupIsVisible(QTreeWidgetItem* groupItem) { if (itemIsGroup(groupItem)) { return (groupItem->data(TOOL_SCENEVIEW_KEY_VISIBLE, Qt::UserRole)).toBool(); } return false; } //****************************************************************************/ bool QtSceneViewWidget::groupOfAssetItemIsVisible(QTreeWidgetItem* assetItem) { if (itemIsAsset(assetItem)) { QTreeWidgetItem* groupItem = assetItem->parent(); if (groupItem) { return (groupItem->data(TOOL_SCENEVIEW_KEY_VISIBLE, Qt::UserRole)).toBool(); } } return false; } //****************************************************************************/ bool QtSceneViewWidget::assetIsVisible(QTreeWidgetItem* assetItem) { if (itemIsAsset(assetItem)) { return (assetItem->data(TOOL_SCENEVIEW_KEY_VISIBLE, Qt::UserRole)).toBool(); } return false; } //****************************************************************************/ void QtSceneViewWidget::toggleVisibilityOfGroup(QTreeWidgetItem* groupItem) { if (!groupItem) return; bool visible = groupIsVisible(groupItem); setVisibilityOfGroup(groupItem, !visible); } //****************************************************************************/ void QtSceneViewWidget::setVisibilityOfGroup(int sceneId, int groupId, bool visible) { QTreeWidgetItem* groupItem = getGroupItem(sceneId, groupId); setVisibilityOfGroup(groupItem, visible); } //****************************************************************************/ void QtSceneViewWidget::setVisibilityOfAllGroups(int sceneId, bool visible) { QTreeWidget* sceneView = getSceneView(sceneId); QTreeWidgetItemIterator it(sceneView); while (*it) { if (itemIsGroup(*it)) setVisibilityOfGroup(*it, visible); ++it; } } //****************************************************************************/ void QtSceneViewWidget::setVisibilityOfGroup(QTreeWidgetItem* groupItem, bool visible) { if (!mVisibilityIconVisibleForGroups) return; if (!groupItem) return; // Set the icon QImage imageVis; if (visible) imageVis = QImage(mIconDir + TOOL_SCENEVIEW_ICON_VISIBLE); else imageVis = QImage(mIconDir + TOOL_SCENEVIEW_ICON_INVISIBLE); QPixmap pixMapVis = QPixmap::fromImage(imageVis).scaled(TOOL_SCENEVIEW_ICON_WIDTH, TOOL_SCENEVIEW_ICON_WIDTH); groupItem->setData(TOOL_SCENEVIEW_COLUMN_GROUP_VISIBILITY, Qt::DecorationRole, QVariant(pixMapVis)); // Set the visibility flag groupItem->setData(TOOL_SCENEVIEW_KEY_VISIBLE, Qt::UserRole, QVariant(visible)); // Signal that visibility of a group is changed emit groupVisibiltyChanged(getCurrentVisibleScene(), getGroupIdOfGroupItem(groupItem)); // Set visibility of the children QTreeWidgetItemIterator it(groupItem); while (*it) { if (itemIsAsset(*it) && (*it)->parent() == groupItem) setVisibilityOfAsset(*it, visible); ++it; } } //****************************************************************************/ void QtSceneViewWidget::toggleVisibilityOfAsset(QTreeWidgetItem* assetItem) { if (!assetItem) return; // Make asset only visisble/invisible if the parent group is visible; // if the group is not visible, the assets cannot be toggled. if (!groupOfAssetItemIsVisible(assetItem)) return; bool visible = assetIsVisible(assetItem); setVisibilityOfAsset(assetItem, !visible); } //****************************************************************************/ void QtSceneViewWidget::setVisibilityOfAsset(int sceneId, int assetId, bool visible) { QTreeWidgetItem* assetItem = getAssetItem(sceneId, assetId); setVisibilityOfAsset(assetItem, visible); } //****************************************************************************/ void QtSceneViewWidget::setVisibilityOfAsset(QTreeWidgetItem* assetItem, bool visible) { if (!mVisibilityIconVisibleForAssets) return; if (!assetItem) return; // Set the icon QImage imageVis; if (visible) imageVis = QImage(mIconDir + TOOL_SCENEVIEW_ICON_VISIBLE); else imageVis = QImage(mIconDir + TOOL_SCENEVIEW_ICON_INVISIBLE); QPixmap pixMapVis = QPixmap::fromImage(imageVis).scaled(TOOL_SCENEVIEW_ICON_WIDTH, TOOL_SCENEVIEW_ICON_WIDTH); assetItem->setData(TOOL_SCENEVIEW_COLUMN_ASSET_VISIBILITY, Qt::DecorationRole, QVariant(pixMapVis)); // Set the visibility flag assetItem->setData(TOOL_SCENEVIEW_KEY_VISIBLE, Qt::UserRole, QVariant(visible)); // Signal that visibility of a group is changed emit groupVisibiltyChanged(getCurrentVisibleScene(), getGroupIdOfGroupItem(assetItem)); } //****************************************************************************/ void QtSceneViewWidget::handleDeletionOfGroup(QTreeWidget* sceneView, QTreeWidgetItem* groupItem) { if (!mDeletionIconVisibleForGroups) return; if (!groupItem) return; int groupId = getGroupIdOfGroupItem(groupItem); handleDeletionOfItem(sceneView, groupItem); // Emit signal emit groupDeleted(sceneView, groupId); emit groupDeleted(getSceneId(sceneView), groupId); } //****************************************************************************/ void QtSceneViewWidget::handleDeletionOfAsset(QTreeWidget* sceneView, QTreeWidgetItem* assetItem) { if (!mDeletionIconVisibleForAssets) return; if (!assetItem) return; int groupId = getGroupIdOfAssetItem(assetItem); int assetId = getAssetIdOfAssetItem(assetItem); handleDeletionOfItem(sceneView, assetItem); // Emit signal emit assetDeleted(sceneView, groupId, assetId); emit assetDeleted(getSceneId(sceneView), groupId, assetId); } //****************************************************************************/ void QtSceneViewWidget::handleDeletionOfItem(QTreeWidget* sceneView, QTreeWidgetItem* item) { if (!item) return; int index = sceneView->indexOfTopLevelItem(item); sceneView->takeTopLevelItem(index); delete item; } //****************************************************************************/ QTreeWidget* QtSceneViewWidget::createSceneView (int sceneId) { // Create tree QTreeWidget* sceneView = new QTreeWidget(this); sceneView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); sceneView->setAnimated(true); sceneView->setEditTriggers(QAbstractItemView::NoEditTriggers); sceneView->setDragEnabled(true); sceneView->viewport()->installEventFilter(this); // Set headers QStringList headers; headers << tr("") << tr("Asset Group") << tr("Visibility") << tr("Remove"); sceneView->setHeaderLabels(headers); QFont font; font.setBold(true); sceneView->header()->setFont(font); // Add it to the map mSceneViewMap[sceneId] = sceneView; // Add the groups foreach (QtAssetGroup* group , mAssetGroupMap) addGroupToSceneView (sceneView, group->groupIcon, group->groupId, group->groupName); // Layout mTreeLayout->addWidget(sceneView); setVisibilitySearchWidgets(true); return sceneView; } //****************************************************************************/ void QtSceneViewWidget::deleteSceneView (int sceneId) { QTreeWidget* sceneView = mSceneViewMap[sceneId]; // If the sceneView is the one that is currently visible, the search widgets are set to non-visible if (sceneView == getCurrentVisibleScene()) setVisibilitySearchWidgets(false); // Delete it mSceneViewMap.remove(sceneId); //sceneView->close(); delete sceneView; // If no more sceneViews left, the seach widgets become invisible if (mSceneViewMap.count() == 0) setVisibilitySearchWidgets(false); } //****************************************************************************/ void QtSceneViewWidget::setSceneViewVisible (int sceneId, bool visible) { QTreeWidget* sceneView = getSceneView (sceneId); if (!sceneView) return; sceneView->setVisible(visible); // If the sceneView is the one that is currently visible, the search widgets get the same visisbility if (sceneView == getCurrentVisibleScene()) setVisibilitySearchWidgets(visible); }
/**************************************************************************** ** ** Copyright (C) 2015 ** ** This file is generated by the Magus toolkit ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ****************************************************************************/ // Include #include <QHBoxLayout> #include <QVBoxLayout> #include <QMessageBox> #include <QHeaderView> #include <QEvent> #include <QImage> #include <QPixmap> #include <QTreeWidgetItem> #include "tool_sceneviewwidget.h" namespace Magus { //****************************************************************************/ QtSceneViewWidget::QtSceneViewWidget(const QString& iconDir, QWidget* parent) : QWidget(parent) { setWindowTitle(QString("Scene view")); mIconDir = iconDir; QVBoxLayout* mainLayout = new QVBoxLayout; mSearchLayout = new QHBoxLayout; mTreeLayout = new QVBoxLayout; // Create edit mSearchLine = new QLineEdit(); connect(mSearchLine, SIGNAL(textChanged(QString)), this, SLOT(searchLineTextChanged(QString))); // Create findbutton QImage imageSearch(mIconDir + TOOL_SCENEVIEW_ICON_SEARCH); QPixmap pixMapSearch = QPixmap::fromImage(imageSearch).scaled(TOOL_SCENEVIEW_ICON_WIDTH, TOOL_SCENEVIEW_ICON_WIDTH); mSearchLabel = new QLabel(); mSearchLabel->setPixmap(pixMapSearch); mSearchLabel->setContentsMargins(-8, -8, -8, -8); // Create clearbutton QImage imageClear(mIconDir + TOOL_SCENEVIEW_ICON_CLOSE); QPixmap pixMapClear = QPixmap::fromImage(imageClear).scaled(TOOL_SCENEVIEW_ICON_WIDTH, TOOL_SCENEVIEW_ICON_WIDTH); mSearchClearButton = new QPushButton(); mSearchClearButton->setStyleSheet(QString("QPushButton {border: none; background: transparent;} QPushButton:hover {background: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 #565656, stop:1 #464646);}")); mSearchClearButton->setIcon(QIcon(pixMapClear)); mSearchClearButton->setIconSize(QSize(TOOL_SCENEVIEW_ICON_WIDTH, TOOL_SCENEVIEW_ICON_WIDTH)); mSearchClearButton->setContentsMargins(-8, -8, -8, -8); connect(mSearchClearButton, SIGNAL(clicked()), this, SLOT(clearSearchLine())); // Misc mVisibilityIconVisibleForGroups = true; mVisibilityIconVisibleForAssets = true; mDeletionIconVisibleForGroups = true; mDeletionIconVisibleForAssets = true; // Layout mSearchLayout->addWidget(mSearchLabel, 1); mSearchLayout->addWidget(mSearchLine, 2000); mSearchLayout->addWidget(mSearchClearButton, 1); setVisibilitySearchWidgets(false); mainLayout->addLayout(mSearchLayout, 1); mainLayout->addLayout(mTreeLayout, 2000); setLayout(mainLayout); } //****************************************************************************/ QtSceneViewWidget::~QtSceneViewWidget(void) { // Delete all QtAssetGroups in mAssetGroupMap foreach (QtAssetGroup* group, mAssetGroupMap) delete group; mAssetGroupMap.clear(); } //****************************************************************************/ bool QtSceneViewWidget::eventFilter(QObject* object, QEvent* event) { QMouseEvent* mouseEvent = (QMouseEvent*) event; switch ((int) event->type()) { case QEvent::MouseButtonPress: mouseClickHandler(mouseEvent); break; } return QObject::eventFilter(object, event); } //****************************************************************************/ void QtSceneViewWidget::mouseClickHandler(QMouseEvent* event) { switch ((int) event->button()) { case Qt::LeftButton: { // Get the selected item of the visible sceneview QTreeWidget* sceneView = getCurrentVisibleScene(); if (sceneView) { QTreeWidgetItem* item = sceneView->itemAt(event->pos()); int col = sceneView->columnAt(event->pos().x()); if (itemIsGroup(item)) { if (col == TOOL_SCENEVIEW_COLUMN_GROUP_CLOSE) { handleDeletionOfGroup(sceneView, item); return; } else if (col == TOOL_SCENEVIEW_COLUMN_GROUP_VISIBILITY) { // Toggle visibility toggleVisibilityOfGroup(item); } int groupId = getGroupIdOfGroupItem(item); emit groupSelected(sceneView, groupId); } else if (itemIsAsset(item)) { if (col == TOOL_SCENEVIEW_COLUMN_ASSET_CLOSE) { handleDeletionOfAsset(sceneView, item); return; } else if (col == TOOL_SCENEVIEW_COLUMN_ASSET_VISIBILITY) { // Toggle visibility toggleVisibilityOfAsset(item); } int groupId = getGroupIdOfAssetItem(item); int assetId = getAssetIdOfAssetItem(item); emit assetSelected(sceneView, groupId, assetId); } } } break; case Qt::RightButton: { // TODO } break; } } //****************************************************************************/ bool QtSceneViewWidget::groupIsVisible(QTreeWidgetItem* groupItem) { if (itemIsGroup(groupItem)) { return (groupItem->data(TOOL_SCENEVIEW_KEY_VISIBLE, Qt::UserRole)).toBool(); } return false; } //****************************************************************************/ bool QtSceneViewWidget::groupOfAssetItemIsVisible(QTreeWidgetItem* assetItem) { if (itemIsAsset(assetItem)) { QTreeWidgetItem* groupItem = assetItem->parent(); if (groupItem) { return (groupItem->data(TOOL_SCENEVIEW_KEY_VISIBLE, Qt::UserRole)).toBool(); } } return false; } //****************************************************************************/ bool QtSceneViewWidget::assetIsVisible(QTreeWidgetItem* assetItem) { if (itemIsAsset(assetItem)) { return (assetItem->data(TOOL_SCENEVIEW_KEY_VISIBLE, Qt::UserRole)).toBool(); } return false; } //****************************************************************************/ void QtSceneViewWidget::toggleVisibilityOfGroup(QTreeWidgetItem* groupItem) { if (!groupItem) return; bool visible = groupIsVisible(groupItem); setVisibilityOfGroup(groupItem, !visible); } //****************************************************************************/ void QtSceneViewWidget::setVisibilityOfGroup(int sceneId, int groupId, bool visible) { QTreeWidgetItem* groupItem = getGroupItem(sceneId, groupId); setVisibilityOfGroup(groupItem, visible); } //****************************************************************************/ void QtSceneViewWidget::setVisibilityOfAllGroups(int sceneId, bool visible) { QTreeWidget* sceneView = getSceneView(sceneId); QTreeWidgetItemIterator it(sceneView); while (*it) { if (itemIsGroup(*it)) setVisibilityOfGroup(*it, visible); ++it; } }
/**************************************************************************** ** ** Copyright (C) 2015 ** ** This file is generated by the Magus toolkit ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ****************************************************************************/ // Include #include <QHBoxLayout> #include <QVBoxLayout> #include <QMessageBox> #include <QHeaderView> #include <QEvent> #include <QImage> #include <QPixmap> #include <QTreeWidgetItem> #include "tool_sceneviewwidget.h" namespace Magus { //****************************************************************************/ QtSceneViewWidget::QtSceneViewWidget(const QString& iconDir, QWidget* parent) : QWidget(parent) { setWindowTitle(QString("Scene view")); mIconDir = iconDir; QVBoxLayout* mainLayout = new QVBoxLayout; mSearchLayout = new QHBoxLayout; mTreeLayout = new QVBoxLayout; // Create edit mSearchLine = new QLineEdit(); connect(mSearchLine, SIGNAL(textChanged(QString)), this, SLOT(searchLineTextChanged(QString))); // Create findbutton QImage imageSearch(mIconDir + TOOL_SCENEVIEW_ICON_SEARCH); QPixmap pixMapSearch = QPixmap::fromImage(imageSearch).scaled(TOOL_SCENEVIEW_ICON_WIDTH, TOOL_SCENEVIEW_ICON_WIDTH); mSearchLabel = new QLabel(); mSearchLabel->setPixmap(pixMapSearch); mSearchLabel->setContentsMargins(-8, -8, -8, -8); // Create clearbutton QImage imageClear(mIconDir + TOOL_SCENEVIEW_ICON_CLOSE); QPixmap pixMapClear = QPixmap::fromImage(imageClear).scaled(TOOL_SCENEVIEW_ICON_WIDTH, TOOL_SCENEVIEW_ICON_WIDTH); mSearchClearButton = new QPushButton(); mSearchClearButton->setStyleSheet(QString("QPushButton {border: none; background: transparent;} QPushButton:hover {background: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 #565656, stop:1 #464646);}")); mSearchClearButton->setIcon(QIcon(pixMapClear)); mSearchClearButton->setIconSize(QSize(TOOL_SCENEVIEW_ICON_WIDTH, TOOL_SCENEVIEW_ICON_WIDTH)); mSearchClearButton->setContentsMargins(-8, -8, -8, -8); connect(mSearchClearButton, SIGNAL(clicked()), this, SLOT(clearSearchLine())); // Misc mVisibilityIconVisibleForGroups = true; mVisibilityIconVisibleForAssets = true; mDeletionIconVisibleForGroups = true; mDeletionIconVisibleForAssets = true; // Layout mSearchLayout->addWidget(mSearchLabel, 1); mSearchLayout->addWidget(mSearchLine, 2000); mSearchLayout->addWidget(mSearchClearButton, 1); setVisibilitySearchWidgets(false); mainLayout->addLayout(mSearchLayout, 1); mainLayout->addLayout(mTreeLayout, 2000); setLayout(mainLayout); } //****************************************************************************/ QtSceneViewWidget::~QtSceneViewWidget(void) { // Delete all QtAssetGroups in mAssetGroupMap foreach (QtAssetGroup* group, mAssetGroupMap) delete group; mAssetGroupMap.clear(); } //****************************************************************************/ bool QtSceneViewWidget::eventFilter(QObject* object, QEvent* event) { QMouseEvent* mouseEvent = (QMouseEvent*) event; switch ((int) event->type()) { case QEvent::MouseButtonPress: mouseClickHandler(mouseEvent); break; } return QObject::eventFilter(object, event); } //****************************************************************************/ void QtSceneViewWidget::mouseClickHandler(QMouseEvent* event) { switch ((int) event->button()) { case Qt::LeftButton: { // Get the selected item of the visible sceneview QTreeWidget* sceneView = getCurrentVisibleScene(); if (sceneView) { QTreeWidgetItem* item = sceneView->itemAt(event->pos()); int col = sceneView->columnAt(event->pos().x()); if (itemIsGroup(item)) { if (col == TOOL_SCENEVIEW_COLUMN_GROUP_CLOSE) { handleDeletionOfGroup(sceneView, item); return; } else if (col == TOOL_SCENEVIEW_COLUMN_GROUP_VISIBILITY) { // Toggle visibility toggleVisibilityOfGroup(item); } int groupId = getGroupIdOfGroupItem(item); emit groupSelected(sceneView, groupId); } else if (itemIsAsset(item)) { if (col == TOOL_SCENEVIEW_COLUMN_ASSET_CLOSE) { handleDeletionOfAsset(sceneView, item); return; } else if (col == TOOL_SCENEVIEW_COLUMN_ASSET_VISIBILITY) { // Toggle visibility toggleVisibilityOfAsset(item); } int groupId = getGroupIdOfAssetItem(item); int assetId = getAssetIdOfAssetItem(item); emit assetSelected(sceneView, groupId, assetId); } } } break; case Qt::RightButton: { // TODO } break; } } //****************************************************************************/ bool QtSceneViewWidget::groupIsVisible(QTreeWidgetItem* groupItem) { if (itemIsGroup(groupItem)) { return (groupItem->data(TOOL_SCENEVIEW_KEY_VISIBLE, Qt::UserRole)).toBool(); } return false; } //****************************************************************************/ bool QtSceneViewWidget::groupOfAssetItemIsVisible(QTreeWidgetItem* assetItem) { if (itemIsAsset(assetItem)) { QTreeWidgetItem* groupItem = assetItem->parent(); if (groupItem) { return (groupItem->data(TOOL_SCENEVIEW_KEY_VISIBLE, Qt::UserRole)).toBool(); } } return false; } //****************************************************************************/ bool QtSceneViewWidget::assetIsVisible(QTreeWidgetItem* assetItem) { if (itemIsAsset(assetItem)) { return (assetItem->data(TOOL_SCENEVIEW_KEY_VISIBLE, Qt::UserRole)).toBool(); } return false; } //****************************************************************************/ void QtSceneViewWidget::toggleVisibilityOfGroup(QTreeWidgetItem* groupItem) { if (!groupItem) return; bool visible = groupIsVisible(groupItem); setVisibilityOfGroup(groupItem, !visible); } //****************************************************************************/ void QtSceneViewWidget::setVisibilityOfGroup(int sceneId, int groupId, bool visible) { QTreeWidgetItem* groupItem = getGroupItem(sceneId, groupId); setVisibilityOfGroup(groupItem, visible); } //****************************************************************************/ void QtSceneViewWidget::setVisibilityOfAllGroups(int sceneId, bool visible) { QTreeWidget* sceneView = getSceneView(sceneId); QTreeWidgetItemIterator it(sceneView); while (*it) { if (itemIsGroup(*it)) setVisibilityOfGroup(*it, visible); ++it; } } //****************************************************************************/ void QtSceneViewWidget::setVisibilityOfGroup(QTreeWidgetItem* groupItem, bool visible) { if (!mVisibilityIconVisibleForGroups) return; if (!groupItem) return; // Set the icon QImage imageVis; if (visible) imageVis = QImage(mIconDir + TOOL_SCENEVIEW_ICON_VISIBLE); else imageVis = QImage(mIconDir + TOOL_SCENEVIEW_ICON_INVISIBLE); QPixmap pixMapVis = QPixmap::fromImage(imageVis).scaled(TOOL_SCENEVIEW_ICON_WIDTH, TOOL_SCENEVIEW_ICON_WIDTH); groupItem->setData(TOOL_SCENEVIEW_COLUMN_GROUP_VISIBILITY, Qt::DecorationRole, QVariant(pixMapVis)); // Set the visibility flag groupItem->setData(TOOL_SCENEVIEW_KEY_VISIBLE, Qt::UserRole, QVariant(visible)); // Signal that visibility of a group is changed emit groupVisibiltyChanged(getCurrentVisibleScene(), getGroupIdOfGroupItem(groupItem)); // Set visibility of the children QTreeWidgetItemIterator it(groupItem); while (*it) { if (itemIsAsset(*it) && (*it)->parent() == groupItem) setVisibilityOfAsset(*it, visible); ++it; } } //****************************************************************************/ void QtSceneViewWidget::toggleVisibilityOfAsset(QTreeWidgetItem* assetItem) { if (!assetItem) return; // Make asset only visisble/invisible if the parent group is visible; // if the group is not visible, the assets cannot be toggled. if (!groupOfAssetItemIsVisible(assetItem)) return; bool visible = assetIsVisible(assetItem); setVisibilityOfAsset(assetItem, !visible); } //****************************************************************************/ void QtSceneViewWidget::setVisibilityOfAsset(int sceneId, int assetId, bool visible) { QTreeWidgetItem* assetItem = getAssetItem(sceneId, assetId); setVisibilityOfAsset(assetItem, visible); } //****************************************************************************/ void QtSceneViewWidget::setVisibilityOfAsset(QTreeWidgetItem* assetItem, bool visible) { if (!mVisibilityIconVisibleForAssets) return; if (!assetItem) return; // Set the icon QImage imageVis; if (visible) imageVis = QImage(mIconDir + TOOL_SCENEVIEW_ICON_VISIBLE); else imageVis = QImage(mIconDir + TOOL_SCENEVIEW_ICON_INVISIBLE); QPixmap pixMapVis = QPixmap::fromImage(imageVis).scaled(TOOL_SCENEVIEW_ICON_WIDTH, TOOL_SCENEVIEW_ICON_WIDTH); assetItem->setData(TOOL_SCENEVIEW_COLUMN_ASSET_VISIBILITY, Qt::DecorationRole, QVariant(pixMapVis)); // Set the visibility flag assetItem->setData(TOOL_SCENEVIEW_KEY_VISIBLE, Qt::UserRole, QVariant(visible)); // Signal that visibility of a group is changed emit groupVisibiltyChanged(getCurrentVisibleScene(), getGroupIdOfGroupItem(assetItem)); } //****************************************************************************/ void QtSceneViewWidget::handleDeletionOfGroup(QTreeWidget* sceneView, QTreeWidgetItem* groupItem) { if (!mDeletionIconVisibleForGroups) return; if (!groupItem) return; int groupId = getGroupIdOfGroupItem(groupItem); handleDeletionOfItem(sceneView, groupItem); // Emit signal emit groupDeleted(sceneView, groupId); emit groupDeleted(getSceneId(sceneView), groupId); } //****************************************************************************/ void QtSceneViewWidget::handleDeletionOfAsset(QTreeWidget* sceneView, QTreeWidgetItem* assetItem) { if (!mDeletionIconVisibleForAssets) return; if (!assetItem) return; int groupId = getGroupIdOfAssetItem(assetItem); int assetId = getAssetIdOfAssetItem(assetItem); handleDeletionOfItem(sceneView, assetItem); // Emit signal emit assetDeleted(sceneView, groupId, assetId); emit assetDeleted(getSceneId(sceneView), groupId, assetId); } //****************************************************************************/ void QtSceneViewWidget::handleDeletionOfItem(QTreeWidget* sceneView, QTreeWidgetItem* item) { if (!item) return; int index = sceneView->indexOfTopLevelItem(item); sceneView->takeTopLevelItem(index); delete item; } //****************************************************************************/ QTreeWidget* QtSceneViewWidget::createSceneView (int sceneId) { // Create tree QTreeWidget* sceneView = new QTreeWidget(this); sceneView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); sceneView->setAnimated(true); sceneView->setEditTriggers(QAbstractItemView::NoEditTriggers); sceneView->setDragEnabled(true); sceneView->viewport()->installEventFilter(this); // Set headers QStringList headers; headers << tr("") << tr("Asset Group") << tr("Visibility") << tr("Remove"); sceneView->setHeaderLabels(headers); QFont font; font.setBold(true); sceneView->header()->setFont(font); // Add it to the map mSceneViewMap[sceneId] = sceneView; // Add the groups foreach (QtAssetGroup* group , mAssetGroupMap) addGroupToSceneView (sceneView, group->groupIcon, group->groupId, group->groupName); // Layout mTreeLayout->addWidget(sceneView); setVisibilitySearchWidgets(true); return sceneView; } //****************************************************************************/ void QtSceneViewWidget::deleteSceneView (int sceneId) { QTreeWidget* sceneView = mSceneViewMap[sceneId]; // If the sceneView is the one that is currently visible, the search widgets are set to non-visible if (sceneView == getCurrentVisibleScene()) setVisibilitySearchWidgets(false); // Delete it mSceneViewMap.remove(sceneId); //sceneView->close(); delete sceneView; // If no more sceneViews left, the seach widgets become invisible if (mSceneViewMap.count() == 0) setVisibilitySearchWidgets(false); } //****************************************************************************/ void QtSceneViewWidget::setSceneViewVisible (int sceneId, bool visible) { QTreeWidget* sceneView = getSceneView (sceneId); if (!sceneView) return; sceneView->setVisible(visible); // If the sceneView is the one that is currently visible, the search widgets get the same visisbility if (sceneView == getCurrentVisibleScene()) setVisibilitySearchWidgets(visible); } //****************************************************************************/ void QtSceneViewWidget::setVisibilitySearchWidgets(bool visible) { mSearchLabel->setVisible(visible); mSearchLine->setVisible(visible); mSearchClearButton->setVisible(visible); } //****************************************************************************/ void QtSceneViewWidget::setSceneViewVisible (int sceneId) { QTreeWidget* sceneView = getSceneView (sceneId); if (!sceneView) return; // Set all other sceneviews invisible foreach (QTreeWidget* sv, mSceneViewMap) if (sv != sceneView) sv->setVisible(false); // Set the selected one visible sceneView->setVisible(true); setVisibilitySearchWidgets(true); }