Пример #1
0
/****************************************************************************
**
** Copyright (C) 2016 - 2017
**
** 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 <QApplication>
#include <QDesktopWidget>
#include <QRect>
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QMessageBox>
#include <QHeaderView>
#include <QEvent>
#include <QPixmap>
#include <QImage>
#include <QMimeData>
#include <QTableWidgetItem>
#include <QTreeWidgetItem>
#include <QVector2D>
#include "constants.h"
#include "paintlayer_widget.h"
#include "paintlayer_dockwidget.h"
#include "paintlayer_dialog.h"

//****************************************************************************/
PaintLayerWidget::PaintLayerWidget(const QString& iconDir, PaintLayerDockWidget* paintLayerDockWidget, QWidget* parent) :
    QWidget(parent),
    mPaintLayerDockWidget(paintLayerDockWidget)
{
    setWindowTitle(QString("Layers"));
    QHBoxLayout* mainLayout = new QHBoxLayout;
    QVBoxLayout* tableLayout = new QVBoxLayout;
    mIconDir = iconDir;
    mLayerIdCounter = 1;
    mListenToSceneId = 0;
    mListenToDeleteEvents = true;
    helperIntVector.clear();

    // Create table
    mTable = new QTableWidget(0, 4, this);
    mTable->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
    mTable->setEditTriggers(QAbstractItemView::NoEditTriggers);
    mTable->setAcceptDrops(false);
    mTable->setShowGrid(false);
    mTable->viewport()->installEventFilter(this);
    QRect rect = QApplication::desktop()->screenGeometry();
    mTable->setColumnWidth(TOOL_LAYER_COLUMN_ICON, 2 * TOOL_LAYER_ICON_WIDTH);
    mTable->setColumnWidth(TOOL_LAYER_COLUMN_NAME, TOOL_LAYER_NAME_WIDTH);
    mTable->setColumnWidth(TOOL_LAYER_COLUMN_VISIBILITY, 2 * TOOL_LAYER_ICON_WIDTH);
    mTable->setColumnWidth(TOOL_LAYER_COLUMN_FILLER, rect.width());
    mTable->setSelectionBehavior(QAbstractItemView::SelectRows);
    setStyleSheet("QLineEdit{padding: 0 0px; margin-left: 0px; margin-right: 0px; max-height: 28px; height: 28px;}");
    connect(mTable, SIGNAL(clicked(QModelIndex)), this, SLOT(tableClicked(QModelIndex)));
    connect(mTable, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(handleTableDoubleClicked(QModelIndex)));

    // Set headers
    QStringList headers;
    headers << tr("Edit") << tr("Layer name") << tr("Visibility") << tr("");
    mTable->setHorizontalHeaderLabels(headers);
    QFont font;
    font.setBold(true);
    mTable->horizontalHeader()->setFont(font);
    mTable->horizontalHeader()->setDefaultAlignment(Qt::AlignLeft);

    // Contextmenu
    setContextMenuPolicy(Qt::CustomContextMenu);
    mContextMenu = new QMenu(mTable);
    mContextMenu->addAction(new QAction(TOOL_LAYER_ACTION_CREATE_LAYER, mTable));
    mContextMenu->addAction(new QAction(TOOL_LAYER_ACTION_EDIT_LAYER, mTable));
    mContextMenu->addAction(new QAction(TOOL_LAYER_ACTION_DELETE_LAYER, mTable));
    mContextMenu->addAction(new QAction(TOOL_LAYER_ACTION_RENAME_LAYER, mTable));
    mContextMenu->addAction(new QAction(TOOL_LAYER_ACTION_ALL_VISIBLE, mTable));
    //mContextMenu->addAction(new QAction(QString("TEST"), mTable));
    connect(mContextMenu, SIGNAL(triggered(QAction*)), this, SLOT(contextMenuItemSelected(QAction*)));

    // Layout
    tableLayout->addWidget(mTable);
    mainLayout->addLayout(tableLayout);
    setLayout(mainLayout);
}

//****************************************************************************/
PaintLayerWidget::~PaintLayerWidget(void)
{
    QVector<QtLayer*>::iterator it;
    for (it = mLayerVec.begin(); it != mLayerVec.end(); ++it)
        delete *it;

    mLayerVec.clear(); // The table is automatically deleted when this widget is deleted
}

//****************************************************************************/
bool PaintLayerWidget::eventFilter(QObject* object, QEvent* event)
{
    QMouseEvent* mouseEvent = (QMouseEvent*) event;
    switch ((int) event->type())
    {
        case QEvent::MouseButtonPress:
            mouseClickHandler(mouseEvent);
        break;

        case QEvent::MouseButtonDblClick:
            mouseDblClickHandler(mouseEvent);
        break;

        break;
    }
    return QObject::eventFilter(object, event);
}

//****************************************************************************/
void PaintLayerWidget::tableClicked(QModelIndex index)
{
    // Toggle visibility
    int row = index.row();
    int col = index.column();
    QtLayer* layer = mLayerVec.at(row);
    if (col == TOOL_LAYER_COLUMN_VISIBILITY)
    {
        if (layer->visible)
            updateVisibilityIcon(row, false);
        else
            updateVisibilityIcon(row, true);
    }

    // Signal that layer is selected
    emit layerSelected(layer->layerId, layer->name);
}

//****************************************************************************/
QVector<int> PaintLayerWidget::getSelectedLayerIds(void)
{
    helperIntVector.clear();
    QList<QTableWidgetItem*> itemList = mTable->selectedItems();
    foreach(QTableWidgetItem* item, itemList)
    {
        // Do not append all items, but only the rows; so only mark in case of a distinct column
        if (item->column() == TOOL_LAYER_COLUMN_ICON)
            helperIntVector.append(item->data(Qt::UserRole).toInt());
    }

    return helperIntVector;
}

//****************************************************************************/
void PaintLayerWidget::mouseClickHandler(QMouseEvent* event)
{
    switch ((int) event->button())
    {
        case Qt::LeftButton:
        {
            // TODO
        }
        break;

        case Qt::RightButton:
        {
            QPoint pos;
            pos.setX(event->screenPos().x());
            pos.setY(event->screenPos().y());
            mContextMenu->popup(pos);
        }
        break;
    }
}

//****************************************************************************/
void PaintLayerWidget::mouseDblClickHandler(QMouseEvent* event)
{
    switch ((int) event->button())
    {
        case Qt::LeftButton:
        {
            if (mTable->currentColumn() == TOOL_LAYER_COLUMN_NAME)
            {
                QTableWidgetItem* item = mTable->currentItem();
                if (item->column() == TOOL_LAYER_COLUMN_NAME)
                {
                    // Its the name; edit it
                    mTable->editItem(item);
                }
            }
        }
        break;
    }
}

//****************************************************************************/
void PaintLayerWidget::contextMenuItemSelected(QAction* action)
{
    // ---------------- Create layer action ----------------
    if (action->text() == TOOL_LAYER_ACTION_CREATE_LAYER)
    {
        createDefaultPaintLayer();
        return;
    }
    else if (action->text() == TOOL_LAYER_ACTION_EDIT_LAYER)
    {
        editSelectedPaintLayer();
        return;
    }
    else if (action->text() == TOOL_LAYER_ACTION_DELETE_LAYER)
    {
        deleteSelectedPaintLayer();
    }
    else if (action->text() == TOOL_LAYER_ACTION_RENAME_LAYER)
    {
        QTableWidgetItem* item = mTable->currentItem();
        if (item && item->column() == TOOL_LAYER_COLUMN_NAME)
        {
            // Its the name; edit it
            mTable->editItem(item);
        }
    }
    else if (action->text() == TOOL_LAYER_ACTION_ALL_VISIBLE)
    {
        int rows = mTable->rowCount();
        for(int row = 0; row < rows; ++row)
            if (mLayerVec.at(row)->visible == false)
                updateVisibilityIcon(row, true);
    }
    else if (action->text() == QString ("TEST"))
    {
        //setLayerName(3, QString("Test"));
        //deleteLayer(QString("New layer 4"));
    }
}

//****************************************************************************/
void PaintLayerWidget::updateVisibilityIcon(int row, bool visible, bool doEmit)
{
    QTableWidgetItem* item = mTable->item(row, TOOL_LAYER_COLUMN_VISIBILITY);
    if (!item)
        return;

    QtLayer* layer = mLayerVec.at(row);
    updateVisibilityIconForLayerId(layer->layerId, visible, doEmit);
}

//****************************************************************************/
void PaintLayerWidget::updateVisibilityIconForLayerId(int layerId, bool visible, bool doEmit)
{
    QtLayer* layer = getLayer(layerId);
    if (!layer)
        return;

    QTableWidgetItem* item = getItem(layerId, TOOL_LAYER_COLUMN_VISIBILITY);
    if (!item)
        return;

    QPixmap pixMap;
    layer->visible = visible;
    if (visible)
    {
        QImage image(mIconDir + TOOL_ICON_VIEW_VISIBLE);
        pixMap = QPixmap::fromImage(image).scaled(TOOL_LAYER_ICON_WIDTH, TOOL_LAYER_ICON_WIDTH);
        item->setData(Qt::DecorationRole, QVariant(pixMap));
    }
    else
    {
        QImage image(mIconDir + TOOL_ICON_VIEW_INVISIBLE);
        pixMap = QPixmap::fromImage(image).scaled(TOOL_LAYER_ICON_WIDTH, TOOL_LAYER_ICON_WIDTH);
        item->setData(Qt::DecorationRole, QVariant(pixMap));
    }

    if (doEmit)
        emit layerVisibiltyChanged(layer->layerId, item->text(), layer->visible);
}

//****************************************************************************/
int PaintLayerWidget::newLayerId(void)
{
    int maxId = 0;
    QtLayer* layer;
    QVector<QtLayer*>::iterator it;
    for (it = mLayerVec.begin(); it != mLayerVec.end(); ++it)
    {
        layer = *it;
        if (layer->layerId > maxId)
            maxId = layer->layerId;
    }

    ++maxId;
    return maxId;
}

//****************************************************************************/
void PaintLayerWidget::addLayer(QtLayer* layer)
{
    // Add the layer to the vector create a new row in the table
    int row = mTable->rowCount();
    mLayerVec.append(layer);
    mTable->insertRow(row);

    // Set the default brush icon
    QTableWidgetItem* item = new QTableWidgetItem();
    QImage image(DEFAULT_BRUSH_AND_PATH_QSTRING);
    QPixmap pixMapLayer = QPixmap::fromImage(image).scaled(TOOL_LAYER_ICON_WIDTH, TOOL_LAYER_ICON_WIDTH);
    item->setData(Qt::DecorationRole, QVariant(pixMapLayer));
    item->setData(Qt::UserRole, QVariant(layer->layerId));
    mTable->setItem(row, TOOL_LAYER_COLUMN_ICON, item);

    // Set the name
    item = new QTableWidgetItem();
    QString newName = layer->name;
    if (newName.size() == 0)
        newName = QString("Paint layer ") + QVariant(layer->layerId).toString();
    layer->name = newName;
    item->setText(newName);
    item->setFlags(Qt::ItemIsEditable | Qt::ItemIsSelectable | Qt::ItemIsEnabled);
    item->setData(Qt::UserRole, QVariant(layer->layerId));
    mTable->setItem(row, TOOL_LAYER_COLUMN_NAME, item);

    // Set the visibility icon
    item = new QTableWidgetItem();
    QImage imageVis(mIconDir + TOOL_ICON_VIEW_VISIBLE);
    QPixmap pixMapVis = QPixmap::fromImage(imageVis).scaled(TOOL_LAYER_ICON_WIDTH, TOOL_LAYER_ICON_WIDTH);
    item->setData(Qt::DecorationRole, QVariant(pixMapVis));
    item->setData(Qt::UserRole, QVariant(layer->layerId));
    mTable->setItem(row, TOOL_LAYER_COLUMN_VISIBILITY, item);

    // Set the layerId in the visibility icon
    //item->setData(Qt::UserRole, QVariant(layer->layerId));

    //mTable->resizeColumnToContents(0);

    // Set the item to selected
    mTable->resizeRowsToContents();
    mTable->selectRow(row);

    // Emit signal
    emit layerCreatedOrAdded(layer->layerId, layer->name);
}

//****************************************************************************/
void PaintLayerWidget::createDefaultPaintLayer (void)
{
    if (mPaintLayerDockWidget->currentDatablockExists())
    {
        if (mPaintLayerDockWidget->currentDatablockIsPbs())
        {
            createLayer(QString(""));
        }
        else
        {
            QMessageBox::information(0, QString("Warning"), QString("Painting on HLMS Unlit materials is not supported"));
        }
    }
    else
    {
        QMessageBox::information(0, QString("Warning"), QString("Create / load a hlms material before creating a paint layer.\n"
                                                                "Did you forget to generate (cog icon) or edit the hlms material?"));
    }
}

//****************************************************************************/
const QtLayer* PaintLayerWidget::createLayer(const QString& name)
{
    // Fill the layer object
    QtLayer* layer = new QtLayer();
    layer->layerId = newLayerId();
    layer->name = name;
    layer->visible = true;

    // Add the layer to the layer vector and the table
    addLayer(layer);
    return layer;
}


//****************************************************************************/
const QtLayer* PaintLayerWidget::createLayer(int layerId, const QString& name)
{
    // Fill the layer object
    QtLayer* layer = new QtLayer();
    layer->layerId = layerId;
    layer->name = name;
    layer->visible = true;

    // Add the layer to the layer vector and the table
    addLayer(layer);
    return layer;
}

//****************************************************************************/
int PaintLayerWidget::getRow(const QString& name)
{
    int rows = mTable->rowCount();
    QTableWidgetItem* item;
    for (int row = 0; row < rows; ++row)
    {
        item = mTable->item(row, TOOL_LAYER_COLUMN_NAME);
        if (item->text() == name)
            return row;
    }

    return -1; // Not found
}

//****************************************************************************/
int PaintLayerWidget::getRow(int layerId)
{
    int row = 0;
    QtLayer* layer;
    QVector<QtLayer*>::iterator it;
    for (it = mLayerVec.begin(); it != mLayerVec.end(); ++it)
    {
        layer = *it;
        if (layer->layerId == layerId)
            return row;

        ++row;
    }

    return -1; // Not found
}

//****************************************************************************/
void PaintLayerWidget::deleteLayer (const QString& name)
{
    int row = getRow(name);
    if (row != -1)
    {
        // Delete the layer from the table and the vector
        QString name = getName(row);
        mTable->removeRow(row);
        int layerId = removeFromLayerVec(row);

        emit layerDeleted(layerId, name);
    }
}

//****************************************************************************/
void PaintLayerWidget::deleteLayer (const QtLayer* layer)
{
    // Delete the layer
    int row = 0;
    QVector<QtLayer*>::iterator it;
    int layerId;
    QString name;
    for (it = mLayerVec.begin(); it != mLayerVec.end(); ++it)
    {
        if (layer == *it)
        {
            // Delete the layer from the table and the vector
            layerId = layer->layerId;
            mLayerVec.erase(it);
            name = getName(row);
            mTable->removeRow(row);
            delete layer;

            emit layerDeleted(layerId, name);
        }
        ++row;
    }
}

//****************************************************************************/
void PaintLayerWidget::deleteLayer (int layerId)
{
    int row = getRow(layerId);
    if (row != -1)
    {
        // Delete the layer from the table and the vector
        QString name = getName(row);
        mTable->removeRow(row);
        int layerId = removeFromLayerVec(row);

        emit layerDeleted(layerId, name);
    }
}

//****************************************************************************/
void PaintLayerWidget::deleteAllLayers (void)
{
    mTable->clearContents();
    mTable->setRowCount(0);
    mLayerVec.clear();
}

//****************************************************************************/
void PaintLayerWidget::deleteSelectedPaintLayer(void)
{
    int layerId = getCurrentLayerId();
    if (layerId < 0)
    {
        QMessageBox::information(0, QString("Warning"), QString("There is no layer to delete"));
        return;
    }

    deleteLayer(getCurrentLayerId());
}
Пример #2
0
void RDocumentVariables::print(QDebug dbg) const {
    dbg.nospace() << "RDocumentVariables(";
    RObject::print(dbg);
    dbg.nospace()
        << "\nunit: " << getUnit()
        << "\ncurrentLayerId: " << getCurrentLayerId()
        << "\npoint mode: " << getKnownVariable(RS::PDMODE)
        << "\ndimension font: " << getDimensionFont()
        << ")";
}
Пример #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 <QPixmap>
#include <QImage>
#include <QMimeData>
#include <QTableWidgetItem>
#include <QTreeWidgetItem>
#include "tool_layerwidget.h"

namespace Magus
{
    //****************************************************************************/
    QtLayerWidget::QtLayerWidget(const QString& iconDir, QtSceneViewWidget* sceneViewWidget, QWidget* parent) : QWidget(parent)
    {
        setWindowTitle(QString("Layers"));
        QHBoxLayout* mainLayout = new QHBoxLayout;
        QVBoxLayout* tableLayout = new QVBoxLayout;
        mIconDir = iconDir;
        mLayerIdCounter = 1;
        mSceneViewWidget = sceneViewWidget;
        mListenToSceneViewWidget = 0;
        mListenToSceneId = 0;
        mListenToDropEvents = true;
        mListenToDeleteEvents = true;

        // Create table
        mTable = new QTableWidget(0, 3, this);
        mTable->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
        mTable->setEditTriggers(QAbstractItemView::NoEditTriggers);
        mTable->setAcceptDrops(true);
        mTable->setShowGrid(false);
        mTable->viewport()->installEventFilter(this);
        mTable->setColumnWidth(TOOL_LAYER_COLUMN_ICON, 2 * TOOL_LAYER_ICON_WIDTH);
        mTable->setColumnWidth(TOOL_LAYER_COLUMN_NAME, TOOL_LAYER_NAME_WIDTH);
        mTable->setColumnWidth(TOOL_LAYER_COLUMN_VISIBILITY, 2 * TOOL_LAYER_ICON_WIDTH);
        mTable->setSelectionBehavior(QAbstractItemView::SelectRows);
        setStyleSheet("QLineEdit{padding: 0 0px; margin-left: 0px; margin-right: 0px; max-height: 28px; height: 28px;}");
        connect(mTable, SIGNAL(clicked(QModelIndex)), this, SLOT(tableClicked(QModelIndex)));

        // Set headers
        QStringList headers;
        headers << tr("Layer") << tr("") << tr("Visibility");
        mTable->setHorizontalHeaderLabels(headers);
        QFont font;
        font.setBold(true);
        mTable->horizontalHeader()->setFont(font);

        // Contextmenu
        setContextMenuPolicy(Qt::CustomContextMenu);
        mContextMenu = new QMenu(mTable);
        mContextMenu->addAction(new QAction(TOOL_LAYER_ACTION_CREATE_LAYER, mTable));
        mContextMenu->addAction(new QAction(TOOL_LAYER_ACTION_DELETE_LAYER, mTable));
        mContextMenu->addAction(new QAction(TOOL_LAYER_ACTION_RENAME_LAYER, mTable));
        mContextMenu->addAction(new QAction(TOOL_LAYER_ACTION_ALL_VISIBLE, mTable));
        //mContextMenu->addAction(new QAction(QString("TEST"), mTable));
        connect(mContextMenu, SIGNAL(triggered(QAction*)), this, SLOT(contextMenuItemSelected(QAction*)));

        // Layout
        tableLayout->addWidget(mTable);
        mainLayout->addLayout(tableLayout);
        setLayout(mainLayout);
    }

    //****************************************************************************/
    QtLayerWidget::~QtLayerWidget(void)
    {
        QVector<QtLayer*>::iterator it;
        for (it = mLayerVec.begin(); it != mLayerVec.end(); ++it)
            delete *it;

        mLayerVec.clear(); // The table is automatically deleted when this widget is deleted
    }

    //****************************************************************************/
    bool QtLayerWidget::eventFilter(QObject* object, QEvent* event)
    {
        QMouseEvent* mouseEvent = (QMouseEvent*) event;
        switch ((int) event->type())
        {
            case QEvent::MouseButtonPress:
                mouseClickHandler(mouseEvent);
            break;

            case QEvent::MouseButtonDblClick:
                mouseDblClickHandler(mouseEvent);
            break;

            case QEvent::Drop:
                dropHandler(object, event);
            break;
        }
        return QObject::eventFilter(object, event);
    }

    //****************************************************************************/
    void QtLayerWidget::tableClicked(QModelIndex index)
    {
        // Toggle visibility
        int row = index.row();
        int col = index.column();
        QtLayer* layer = mLayerVec.at(row);
        if (col == TOOL_LAYER_COLUMN_VISIBILITY)
        {
            if (layer->visible == true)
                updateVisibilityIcon(row, false);
            else
                updateVisibilityIcon(row, true);
        }

        // Set associated sceneview to visible (if mSceneView available)
        if (mSceneViewWidget)
            mSceneViewWidget->setSceneViewVisible(layer->layerId);

        // Signal that layer is selected
        emit layerSelected(layer->layerId, layer->name);
}

    //****************************************************************************/
    void QtLayerWidget::mouseClickHandler(QMouseEvent* event)
    {
        switch ((int) event->button())
        {
            case Qt::LeftButton:
            {
                // TODO
            }
            break;

            case Qt::RightButton:
            {
                QPoint pos;
                pos.setX(event->screenPos().x());
                pos.setY(event->screenPos().y());
                mContextMenu->popup(pos);
            }
            break;
        }
    }

    //****************************************************************************/
    void QtLayerWidget::mouseDblClickHandler(QMouseEvent* event)
    {
        switch ((int) event->button())
        {
            case Qt::LeftButton:
            {
                if (mTable->currentColumn() == TOOL_LAYER_COLUMN_NAME)
                {
                    QTableWidgetItem* item = mTable->currentItem();
                    if (item->column() == TOOL_LAYER_COLUMN_NAME)
                    {
                        // Its the name; edit it
                        mTable->editItem(item);
                    }
                }
            }
            break;
        }
    }

    //****************************************************************************/
    void QtLayerWidget::dropHandler(QObject* object, QEvent* event)
    {
        event->accept();

        if (!mListenToDropEvents)
            return;

        if (!mListenToSceneViewWidget)
            return;

        // Determine whether the data was from an abstractitem modellist
        QDropEvent* dropEvent = static_cast<QDropEvent*>(event);
        const QMimeData* mimeData = dropEvent->mimeData();
        QString mimeType("application/x-qabstractitemmodeldatalist");
        if (!mimeData->hasFormat(mimeType))
            return;

        // Do not use the mimeData to retrieve the sceneview tree item, because a standard model is used,
        // which does not return the data that is needed.
        // Use the data of the selected item in the sceneview (mListenToSceneId) as an alternative.
        if (mTable->rowCount() > 0 && mSceneViewWidget)
        {
            // Get the dropped item (this is the currently selected item of mListenToSceneId in widget mListenToSceneViewWidget)
            QTreeWidgetItem* item = mListenToSceneViewWidget->getCurrentItem(mListenToSceneId);
            if (item)
            {
                // The layerId of the selected layer = the sceneId of the visible sceneview tree in mSceneViewWidget
                // The currently selected group in the mListenToSceneViewWidget = the destination group of mSceneViewWidget
                int layerId = getCurrentLayerId();
                int groupId = mListenToSceneViewWidget->getCurrentGroupId(item);

                // 1. Add the group; this is ignored if the group is already available
                QtAssetGroup assetGroupInfo = mListenToSceneViewWidget->getGroupInfo(groupId);
                mSceneViewWidget->addGroupToSceneView(layerId,
                                                      assetGroupInfo.groupIcon,
                                                      groupId,
                                                      assetGroupInfo.groupName,
                                                      false);

                // 2. Determine the item type and add either the asset or all assets in a group
                if (mListenToSceneViewWidget->itemIsGroup(item))
                {
                    // The dropped item is a GROUP
                    // Add all the items of the source group to the destination group
                    QVector<QTreeWidgetItem*> assetVec = mListenToSceneViewWidget->getAssetItemsOfGroup(mListenToSceneId, groupId);
                    foreach (QTreeWidgetItem* assetItem, assetVec)
                    {
                        mSceneViewWidget->addAssetToSceneView(layerId,
                                                              groupId,
                                                              mSceneViewWidget->getAssetIdOfAssetItem(assetItem),
                                                              assetItem->text(0));
                    }
                }
Пример #4
0
/****************************************************************************
**
** Copyright (C) 2016 - 2017
**
** 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 <QApplication>
#include <QDesktopWidget>
#include <QRect>
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QMessageBox>
#include <QHeaderView>
#include <QEvent>
#include <QPixmap>
#include <QImage>
#include <QMimeData>
#include <QTableWidgetItem>
#include <QTreeWidgetItem>
#include <QVector2D>
#include "constants.h"
#include "paintlayer_widget.h"
#include "paintlayer_dockwidget.h"
#include "paintlayer_dialog.h"

//****************************************************************************/
PaintLayerWidget::PaintLayerWidget(const QString& iconDir, PaintLayerDockWidget* paintLayerDockWidget, QWidget* parent) :
    QWidget(parent),
    mPaintLayerDockWidget(paintLayerDockWidget)
{
    setWindowTitle(QString("Layers"));
    QHBoxLayout* mainLayout = new QHBoxLayout;
    QVBoxLayout* tableLayout = new QVBoxLayout;
    mIconDir = iconDir;
    mLayerIdCounter = 1;
    mListenToSceneId = 0;
    mListenToDeleteEvents = true;
    helperIntVector.clear();

    // Create table
    mTable = new QTableWidget(0, 4, this);
    mTable->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
    mTable->setEditTriggers(QAbstractItemView::NoEditTriggers);
    mTable->setAcceptDrops(false);
    mTable->setShowGrid(false);
    mTable->viewport()->installEventFilter(this);
    QRect rect = QApplication::desktop()->screenGeometry();
    mTable->setColumnWidth(TOOL_LAYER_COLUMN_ICON, 2 * TOOL_LAYER_ICON_WIDTH);
    mTable->setColumnWidth(TOOL_LAYER_COLUMN_NAME, TOOL_LAYER_NAME_WIDTH);
    mTable->setColumnWidth(TOOL_LAYER_COLUMN_VISIBILITY, 2 * TOOL_LAYER_ICON_WIDTH);
    mTable->setColumnWidth(TOOL_LAYER_COLUMN_FILLER, rect.width());
    mTable->setSelectionBehavior(QAbstractItemView::SelectRows);
    setStyleSheet("QLineEdit{padding: 0 0px; margin-left: 0px; margin-right: 0px; max-height: 28px; height: 28px;}");
    connect(mTable, SIGNAL(clicked(QModelIndex)), this, SLOT(tableClicked(QModelIndex)));
    connect(mTable, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(handleTableDoubleClicked(QModelIndex)));

    // Set headers
    QStringList headers;
    headers << tr("Edit") << tr("Layer name") << tr("Visibility") << tr("");
    mTable->setHorizontalHeaderLabels(headers);
    QFont font;
    font.setBold(true);
    mTable->horizontalHeader()->setFont(font);
    mTable->horizontalHeader()->setDefaultAlignment(Qt::AlignLeft);

    // Contextmenu
    setContextMenuPolicy(Qt::CustomContextMenu);
    mContextMenu = new QMenu(mTable);
    mContextMenu->addAction(new QAction(TOOL_LAYER_ACTION_CREATE_LAYER, mTable));
    mContextMenu->addAction(new QAction(TOOL_LAYER_ACTION_EDIT_LAYER, mTable));
    mContextMenu->addAction(new QAction(TOOL_LAYER_ACTION_DELETE_LAYER, mTable));
    mContextMenu->addAction(new QAction(TOOL_LAYER_ACTION_RENAME_LAYER, mTable));
    mContextMenu->addAction(new QAction(TOOL_LAYER_ACTION_ALL_VISIBLE, mTable));
    //mContextMenu->addAction(new QAction(QString("TEST"), mTable));
    connect(mContextMenu, SIGNAL(triggered(QAction*)), this, SLOT(contextMenuItemSelected(QAction*)));

    // Layout
    tableLayout->addWidget(mTable);
    mainLayout->addLayout(tableLayout);
    setLayout(mainLayout);
}

//****************************************************************************/
PaintLayerWidget::~PaintLayerWidget(void)
{
    QVector<QtLayer*>::iterator it;
    for (it = mLayerVec.begin(); it != mLayerVec.end(); ++it)
        delete *it;

    mLayerVec.clear(); // The table is automatically deleted when this widget is deleted
}

//****************************************************************************/
bool PaintLayerWidget::eventFilter(QObject* object, QEvent* event)
{
    QMouseEvent* mouseEvent = (QMouseEvent*) event;
    switch ((int) event->type())
    {
        case QEvent::MouseButtonPress:
            mouseClickHandler(mouseEvent);
        break;

        case QEvent::MouseButtonDblClick:
            mouseDblClickHandler(mouseEvent);
        break;

        break;
    }
    return QObject::eventFilter(object, event);
}

//****************************************************************************/
void PaintLayerWidget::tableClicked(QModelIndex index)
{
    // Toggle visibility
    int row = index.row();
    int col = index.column();
    QtLayer* layer = mLayerVec.at(row);
    if (col == TOOL_LAYER_COLUMN_VISIBILITY)
    {
        if (layer->visible)
            updateVisibilityIcon(row, false);
        else
            updateVisibilityIcon(row, true);
    }

    // Signal that layer is selected
    emit layerSelected(layer->layerId, layer->name);
}

//****************************************************************************/
QVector<int> PaintLayerWidget::getSelectedLayerIds(void)
{
    helperIntVector.clear();
    QList<QTableWidgetItem*> itemList = mTable->selectedItems();
    foreach(QTableWidgetItem* item, itemList)
    {
        // Do not append all items, but only the rows; so only mark in case of a distinct column
        if (item->column() == TOOL_LAYER_COLUMN_ICON)
            helperIntVector.append(item->data(Qt::UserRole).toInt());
    }

    return helperIntVector;
}

//****************************************************************************/
void PaintLayerWidget::mouseClickHandler(QMouseEvent* event)
{
    switch ((int) event->button())
    {
        case Qt::LeftButton:
        {
            // TODO
        }
        break;

        case Qt::RightButton:
        {
            QPoint pos;
            pos.setX(event->screenPos().x());
            pos.setY(event->screenPos().y());
            mContextMenu->popup(pos);
        }
        break;
    }
}

//****************************************************************************/
void PaintLayerWidget::mouseDblClickHandler(QMouseEvent* event)
{
    switch ((int) event->button())
    {
        case Qt::LeftButton:
        {
            if (mTable->currentColumn() == TOOL_LAYER_COLUMN_NAME)
            {
                QTableWidgetItem* item = mTable->currentItem();
                if (item->column() == TOOL_LAYER_COLUMN_NAME)
                {
                    // Its the name; edit it
                    mTable->editItem(item);
                }
            }
        }
        break;
    }
}

//****************************************************************************/
void PaintLayerWidget::contextMenuItemSelected(QAction* action)
{
    // ---------------- Create layer action ----------------
    if (action->text() == TOOL_LAYER_ACTION_CREATE_LAYER)
    {
        createDefaultPaintLayer();
        return;
    }
    else if (action->text() == TOOL_LAYER_ACTION_EDIT_LAYER)
    {
        editSelectedPaintLayer();
        return;
    }
    else if (action->text() == TOOL_LAYER_ACTION_DELETE_LAYER)
    {
        deleteSelectedPaintLayer();
    }
    else if (action->text() == TOOL_LAYER_ACTION_RENAME_LAYER)
    {
        QTableWidgetItem* item = mTable->currentItem();
        if (item && item->column() == TOOL_LAYER_COLUMN_NAME)
        {
            // Its the name; edit it
            mTable->editItem(item);
        }
    }
    else if (action->text() == TOOL_LAYER_ACTION_ALL_VISIBLE)
    {
        int rows = mTable->rowCount();
        for(int row = 0; row < rows; ++row)
            if (mLayerVec.at(row)->visible == false)
                updateVisibilityIcon(row, true);
    }
    else if (action->text() == QString ("TEST"))
    {
        //setLayerName(3, QString("Test"));
        //deleteLayer(QString("New layer 4"));
    }
}

//****************************************************************************/
void PaintLayerWidget::updateVisibilityIcon(int row, bool visible, bool doEmit)
{
    QTableWidgetItem* item = mTable->item(row, TOOL_LAYER_COLUMN_VISIBILITY);
    if (!item)
        return;

    QtLayer* layer = mLayerVec.at(row);
    updateVisibilityIconForLayerId(layer->layerId, visible, doEmit);
}

//****************************************************************************/
void PaintLayerWidget::updateVisibilityIconForLayerId(int layerId, bool visible, bool doEmit)
{
    QtLayer* layer = getLayer(layerId);
    if (!layer)
        return;

    QTableWidgetItem* item = getItem(layerId, TOOL_LAYER_COLUMN_VISIBILITY);
    if (!item)
        return;

    QPixmap pixMap;
    layer->visible = visible;
    if (visible)
    {
        QImage image(mIconDir + TOOL_ICON_VIEW_VISIBLE);
        pixMap = QPixmap::fromImage(image).scaled(TOOL_LAYER_ICON_WIDTH, TOOL_LAYER_ICON_WIDTH);
        item->setData(Qt::DecorationRole, QVariant(pixMap));
    }
    else
    {
        QImage image(mIconDir + TOOL_ICON_VIEW_INVISIBLE);
        pixMap = QPixmap::fromImage(image).scaled(TOOL_LAYER_ICON_WIDTH, TOOL_LAYER_ICON_WIDTH);
        item->setData(Qt::DecorationRole, QVariant(pixMap));
    }

    if (doEmit)
        emit layerVisibiltyChanged(layer->layerId, item->text(), layer->visible);
}

//****************************************************************************/
int PaintLayerWidget::newLayerId(void)
{
    int maxId = 0;
    QtLayer* layer;
    QVector<QtLayer*>::iterator it;
    for (it = mLayerVec.begin(); it != mLayerVec.end(); ++it)
    {
        layer = *it;
        if (layer->layerId > maxId)
            maxId = layer->layerId;
    }

    ++maxId;
    return maxId;
}

//****************************************************************************/
void PaintLayerWidget::addLayer(QtLayer* layer)
{
    // Add the layer to the vector create a new row in the table
    int row = mTable->rowCount();
    mLayerVec.append(layer);
    mTable->insertRow(row);

    // Set the default brush icon
    QTableWidgetItem* item = new QTableWidgetItem();
    QImage image(DEFAULT_BRUSH_AND_PATH_QSTRING);
    QPixmap pixMapLayer = QPixmap::fromImage(image).scaled(TOOL_LAYER_ICON_WIDTH, TOOL_LAYER_ICON_WIDTH);
    item->setData(Qt::DecorationRole, QVariant(pixMapLayer));
    item->setData(Qt::UserRole, QVariant(layer->layerId));
    mTable->setItem(row, TOOL_LAYER_COLUMN_ICON, item);

    // Set the name
    item = new QTableWidgetItem();
    QString newName = layer->name;
    if (newName.size() == 0)
        newName = QString("Paint layer ") + QVariant(layer->layerId).toString();
    layer->name = newName;
    item->setText(newName);
    item->setFlags(Qt::ItemIsEditable | Qt::ItemIsSelectable | Qt::ItemIsEnabled);
    item->setData(Qt::UserRole, QVariant(layer->layerId));
    mTable->setItem(row, TOOL_LAYER_COLUMN_NAME, item);

    // Set the visibility icon
    item = new QTableWidgetItem();
    QImage imageVis(mIconDir + TOOL_ICON_VIEW_VISIBLE);
    QPixmap pixMapVis = QPixmap::fromImage(imageVis).scaled(TOOL_LAYER_ICON_WIDTH, TOOL_LAYER_ICON_WIDTH);
    item->setData(Qt::DecorationRole, QVariant(pixMapVis));
    item->setData(Qt::UserRole, QVariant(layer->layerId));
    mTable->setItem(row, TOOL_LAYER_COLUMN_VISIBILITY, item);

    // Set the layerId in the visibility icon
    //item->setData(Qt::UserRole, QVariant(layer->layerId));

    //mTable->resizeColumnToContents(0);

    // Set the item to selected
    mTable->resizeRowsToContents();
    mTable->selectRow(row);

    // Emit signal
    emit layerCreatedOrAdded(layer->layerId, layer->name);
}

//****************************************************************************/
void PaintLayerWidget::createDefaultPaintLayer (void)
{
    if (mPaintLayerDockWidget->currentDatablockExists())
    {
        if (mPaintLayerDockWidget->currentDatablockIsPbs())
        {
            createLayer(QString(""));
        }
        else
        {
            QMessageBox::information(0, QString("Warning"), QString("Painting on HLMS Unlit materials is not supported"));
        }
    }
    else
    {
        QMessageBox::information(0, QString("Warning"), QString("Create / load a hlms material before creating a paint layer.\n"
                                                                "Did you forget to generate (cog icon) or edit the hlms material?"));
    }
}

//****************************************************************************/
const QtLayer* PaintLayerWidget::createLayer(const QString& name)
{
    // Fill the layer object
    QtLayer* layer = new QtLayer();
    layer->layerId = newLayerId();
    layer->name = name;
    layer->visible = true;

    // Add the layer to the layer vector and the table
    addLayer(layer);
    return layer;
}


//****************************************************************************/
const QtLayer* PaintLayerWidget::createLayer(int layerId, const QString& name)
{
    // Fill the layer object
    QtLayer* layer = new QtLayer();
    layer->layerId = layerId;
    layer->name = name;
    layer->visible = true;

    // Add the layer to the layer vector and the table
    addLayer(layer);
    return layer;
}

//****************************************************************************/
int PaintLayerWidget::getRow(const QString& name)
{
    int rows = mTable->rowCount();
    QTableWidgetItem* item;
    for (int row = 0; row < rows; ++row)
    {
        item = mTable->item(row, TOOL_LAYER_COLUMN_NAME);
        if (item->text() == name)
            return row;
    }

    return -1; // Not found
}

//****************************************************************************/
int PaintLayerWidget::getRow(int layerId)
{
    int row = 0;
    QtLayer* layer;
    QVector<QtLayer*>::iterator it;
    for (it = mLayerVec.begin(); it != mLayerVec.end(); ++it)
    {
        layer = *it;
        if (layer->layerId == layerId)
            return row;

        ++row;
    }

    return -1; // Not found
}

//****************************************************************************/
void PaintLayerWidget::deleteLayer (const QString& name)
{
    int row = getRow(name);
    if (row != -1)
    {
        // Delete the layer from the table and the vector
        QString name = getName(row);
        mTable->removeRow(row);
        int layerId = removeFromLayerVec(row);

        emit layerDeleted(layerId, name);
    }
}

//****************************************************************************/
void PaintLayerWidget::deleteLayer (const QtLayer* layer)
{
    // Delete the layer
    int row = 0;
    QVector<QtLayer*>::iterator it;
    int layerId;
    QString name;
    for (it = mLayerVec.begin(); it != mLayerVec.end(); ++it)
    {
        if (layer == *it)
        {
            // Delete the layer from the table and the vector
            layerId = layer->layerId;
            mLayerVec.erase(it);
            name = getName(row);
            mTable->removeRow(row);
            delete layer;

            emit layerDeleted(layerId, name);
        }
        ++row;
    }
}

//****************************************************************************/
void PaintLayerWidget::deleteLayer (int layerId)
{
    int row = getRow(layerId);
    if (row != -1)
    {
        // Delete the layer from the table and the vector
        QString name = getName(row);
        mTable->removeRow(row);
        int layerId = removeFromLayerVec(row);

        emit layerDeleted(layerId, name);
    }
}

//****************************************************************************/
void PaintLayerWidget::deleteAllLayers (void)
{
    mTable->clearContents();
    mTable->setRowCount(0);
    mLayerVec.clear();
}

//****************************************************************************/
void PaintLayerWidget::deleteSelectedPaintLayer(void)
{
    int layerId = getCurrentLayerId();
    if (layerId < 0)
    {
        QMessageBox::information(0, QString("Warning"), QString("There is no layer to delete"));
        return;
    }

    deleteLayer(getCurrentLayerId());
}

//****************************************************************************/
void PaintLayerWidget::editSelectedPaintLayer(void)
{
    // First check whether there is a paint layer
    int layerId = getCurrentLayerId();
    if (layerId < 0)
    {
        QMessageBox::information(0, QString("Warning"), QString("There is no layer to edit"));
        return;
    }

    // First set the correct column to current
    int currentRow = mTable->currentRow();
    mTable->setCurrentCell(currentRow, TOOL_LAYER_COLUMN_ICON); // Do this to set the correct column

    // Get the current index
    QModelIndex index = mTable->currentIndex();
    handleTableDoubleClicked(index);
}