/**************************************************************************** ** ** 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 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() << ")"; }
/**************************************************************************** ** ** 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)); } }
/**************************************************************************** ** ** 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); }