Beispiel #1
0
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();
}
Beispiel #2
0
/****************************************************************************
**
** 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);
}
Beispiel #3
0
/****************************************************************************
**
** 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;
    }
}
Beispiel #4
0
/****************************************************************************
**
** 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);
}