diff --git a/Implementation/GUI/LayerDock.cpp b/Implementation/GUI/LayerDock.cpp new file mode 100644 index 0000000000000000000000000000000000000000..aede84fb99e0b6a23edac62c31d3c8e680713226 --- /dev/null +++ b/Implementation/GUI/LayerDock.cpp @@ -0,0 +1,188 @@ +#include "LayerDock.h" + +LayerDock::LayerDock(InteractionTool *interaction){ + interactionTool = interaction; + createLayerDock(); +} +LayerDock::~LayerDock(){ + +} +void LayerDock::updateLayers(){ + for (unsigned int i = 0; i < interactionTool->getPicture()->getLayerCount(); i++) { + QPixmap pic; + pic.convertFromImage(*interactionTool->getPicture()->getLayerAsQ(i)); + layerButtons[i*5+1]->setIcon(pic); + layerButtons[i*5+1]->setChecked(false); + } + layerButtons[interactionTool->getPicture()->getCurrentLayerIndex()*5+1]->setChecked(true); + if(interactionTool->getPicture()->getLayerCount()>1){ + layerButtons[interactionTool->getPicture()->getCurrentLayerIndex()*5+3]->setEnabled(false); + } + +} +void LayerDock::updateLayerCount(){ + layerButtons = std::vector<QPushButton*>(); //TODO vector zu Qvector ändern + layerCheckboxes = std::vector<QCheckBox*>(); + layerDock->close(); + + layerDock = new QDockWidget(tr("Layers")); + layerDock->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea); + layerLayout = new QGridLayout(); + layerButtons.push_back(new QPushButton("+")); + layerLayout->addWidget(layerButtons[0],0,0,2,2); + layerButtons[0]->setMaximumWidth(25); + layerButtons[0]->setCheckable(true); + connect(layerButtons[0], SIGNAL(clicked()),this, SLOT(changeCurrentLayer())); + for (unsigned int i = 0; i < interactionTool->getPicture()->getLayerCount(); i++) { + layerButtons.push_back(new QPushButton); + //layerButtons[i]->setStyleSheet("width: 100px;height: 100px;"); + QPixmap pic(100,100); + pic.convertFromImage(*interactionTool->getPicture()->getLayerAsQ(i)); + layerButtons[i*5+1]->setIconSize(QSize(100,100)); + layerButtons[i*5+1]->setIcon(pic); + //layerButtons[i]->setMask(pic); + layerLayout->addWidget(layerButtons[i*5+1],i*5+1,2,5,1); + layerButtons[i*5+1]->setCheckable(true); + connect(layerButtons[i*5+1], SIGNAL(clicked()),this, SLOT(changeCurrentLayer())); + layerButtons.push_back(new QPushButton("^")); + layerLayout->addWidget(layerButtons[i*5+2],i*5+2,0,1,2); + layerButtons[i*5+2]->setMaximumWidth(25); + layerButtons[i*5+2]->setCheckable(true); + if (i==0){ + layerButtons[i*5+2]->setEnabled(false); + } + connect(layerButtons[i*5+2], SIGNAL(clicked()),this, SLOT(changeCurrentLayer())); + layerButtons.push_back(new QPushButton("-")); + layerLayout->addWidget(layerButtons[i*5+3],i*5+3,0,1,1); + layerButtons[i*5+3]->setMaximumWidth(25); + layerButtons[i*5+3]->setCheckable(true); + connect(layerButtons[i*5+3], SIGNAL(clicked()),this, SLOT(changeCurrentLayer())); + layerCheckboxes.push_back(new QCheckBox()); + layerLayout->addWidget(layerCheckboxes[i],i*5+3,1,1,1); + layerCheckboxes[i]->setChecked(true); + connect(layerCheckboxes[i], SIGNAL(clicked()),this, SLOT(updateVisible())); + layerButtons.push_back(new QPushButton("v")); + layerLayout->addWidget(layerButtons[i*5+4],i*5+4,0,1,2); + layerButtons[i*5+4]->setMaximumWidth(25); + layerButtons[i*5+4]->setCheckable(true); + if (i+1==interactionTool->getPicture()->getLayerCount()){ + layerButtons[i*5+4]->setEnabled(false); + } + connect(layerButtons[i*5+4], SIGNAL(clicked()),this, SLOT(changeCurrentLayer())); + layerButtons.push_back(new QPushButton("+")); + layerLayout->addWidget(layerButtons[i*5+5],i*5+5,0,2,2); + layerButtons[i*5+5]->setMaximumWidth(25); + layerButtons[i*5+5]->setCheckable(true); + connect(layerButtons[i*5+5], SIGNAL(clicked()),this, SLOT(changeCurrentLayer())); + } + layerButtons[interactionTool->getPicture()->getCurrentLayerIndex()*5+1]->setChecked(true); + if(interactionTool->getPicture()->getLayerCount()>1){ + layerButtons[interactionTool->getPicture()->getCurrentLayerIndex()*5+3]->setEnabled(false); + } + layers = new QWidget(layerDock); + layers->setLayout(layerLayout); + layerScrollArea = new QScrollArea(); + layerScrollArea->setWidget(layers); + layerDock->setWidget(layerScrollArea); + //addDockWidget(Qt::RightDockWidgetArea, layerDock); + emit updateLayerDock(); + layerDock->setFeatures(QDockWidget::DockWidgetMovable|QDockWidget::DockWidgetFloatable); +} +void LayerDock::changeCurrentLayer(){ + if (layerButtons[0]->isChecked()){ + emit newLayer(); + //interactionTool->getPicture()->moveLayer(0,interactionTool->getPicture()->getLayerCount()-1); + //updateLayers(); + layerButtons[0]->setChecked(false); + } + for (int i = 0; i < interactionTool->getPicture()->getLayerCount(); i++) { + if (layerButtons[i*5+1]->isChecked()&&i!=interactionTool->getPicture()->getCurrentLayerIndex()){ + layerButtons[interactionTool->getPicture()->getCurrentLayerIndex()*5+1]->setChecked(false); + layerButtons[interactionTool->getPicture()->getCurrentLayerIndex()*5+3]->setEnabled(true); + interactionTool->getPicture()->setCurrentLayer(i); + //setImage(*interactionTool->getPicture()->getCurrentLayerAsQ()); + //updateVisible(); + //updateColors(); + emit update(); + layerButtons[interactionTool->getPicture()->getCurrentLayerIndex()*5+3]->setEnabled(false); + } else if(layerButtons[i*5+2]->isChecked()){ + interactionTool->getPicture()->moveLayer(i,i-1); + updateLayers(); + layerButtons[i*5+2]->setChecked(false); + //updateVisible(); + emit update(); + } else if(layerButtons[i*5+3]->isChecked()){ + layerButtons[i*5+3]->setChecked(false); + interactionTool->getPicture()->removeLayer(i); + if(interactionTool->getPicture()->getLayerCount()==0){//TODO + //hasLayer=false; + //imageLabel = new QLabel(); + //imageLabel->setBackgroundRole(QPalette::Dark); + //imageLabel->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored); + //imageLabel->setScaledContents(true); + } + updateLayerCount(); + //updateVisible(); + emit update(); + } else if(layerButtons[i*5+4]->isChecked()){ + interactionTool->getPicture()->moveLayer(i+1,i); + updateLayers(); + layerButtons[i*5+4]->setChecked(false); + //updateVisible(); + emit update(); + } else if(layerButtons[i*5+5]->isChecked()&&i+1!=interactionTool->getPicture()->getLayerCount()){ + layerButtons[i*5+5]->setChecked(false); + param = new toolParameters_t; + param->tool = merge; + param->layerIndex1 = i; + param->layerIndex2 = i+1; + this->i=i; + + emit getParams(param); + + } else if(layerButtons[i*5+5]->isChecked()&&i+1==interactionTool->getPicture()->getLayerCount()){ + newLayer(); + //interactionTool->getPicture()->moveLayer(i+1,i); + //updateLayers(); + layerButtons[i*5+5]->setChecked(false); + } + } +} +void LayerDock::createLayerDock(){ + layerDock = new QDockWidget(tr("Layers")); + layerDock->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea); + layerLayout = new QGridLayout(); + layerButtons.push_back(new QPushButton("+")); + layerLayout->addWidget(layerButtons[0],0,0,2,1); + layerButtons[0]->setMaximumWidth(25); + layerButtons[0]->setCheckable(true); + connect(layerButtons[0], SIGNAL(clicked()),this, SLOT(changeCurrentLayer())); + layers = new QWidget(layerDock); + layers->setLayout(layerLayout); + layerScrollArea = new QScrollArea(); + layerScrollArea->setWidget(layers); + layerDock->setWidget(layerScrollArea); + //addDockWidget(Qt::RightDockWidgetArea, layerDock); + layerDock->setFeatures(QDockWidget::DockWidgetMovable|QDockWidget::DockWidgetFloatable); +} + +QDockWidget *LayerDock::getDockWidget(){ + return layerDock; +} +bool LayerDock::isLayerCheckboxChecked(int i){ + return layerCheckboxes[i]->isChecked(); +} +void LayerDock::doMergeII(toolParameters_t *param){ + interactionTool->useTool(param); + interactionTool->getPicture()->removeLayer(i+1); + interactionTool->getPicture()->removeLayer(i); + param = nullptr; + updateLayerCount(); + //updateColors(); + //setImage(*interactionTool->getPicture()->getCurrentLayerAsQ()); + //updateVisible(); + emit update(); +} +void LayerDock::updateVisible(){ + emit update(); +} diff --git a/Implementation/GUI/LayerDock.h b/Implementation/GUI/LayerDock.h new file mode 100644 index 0000000000000000000000000000000000000000..9a22452f97dcbd8c03e860e9a5b06e1bc3ed764c --- /dev/null +++ b/Implementation/GUI/LayerDock.h @@ -0,0 +1,48 @@ +#ifndef LAYERDOCK_H +#define LAYERDOCK_H +#include "InteractionTool.h" +#include <QDockWidget> +#include <QScrollArea> +#include <QGridLayout> +#include <QPushButton> +#include <QCheckBox> + +class LayerDock : public QObject +{ + Q_OBJECT + +public: + LayerDock(InteractionTool *interaction); + ~LayerDock(); + void updateLayers(); + void updateLayerCount(); + QDockWidget *getDockWidget(); + bool isLayerCheckboxChecked(int i); + void doMergeII(toolParameters_t *param); + +signals: + void updateLayerDock(); + void newLayer(); + void update(); + void getParams(toolParameters_t *param); + +private slots: + void changeCurrentLayer(); + void updateVisible(); + +private: + void createLayerDock(); + + QScrollArea *layerScrollArea; + QWidget *layers; + QDockWidget *layerDock; + QGridLayout* layerLayout; + std::vector<QPushButton*> layerButtons; + std::vector<QCheckBox*> layerCheckboxes; + toolParameters_t *param; + InteractionTool *interactionTool; + int i; + +}; + +#endif // LAYERDOCK_H diff --git a/Implementation/GUI/imageviewer.cpp b/Implementation/GUI/imageviewer.cpp index 1d60c47316ca1e29d9b6799314fffd7a873d93b8..9eaf33ab12cc6f9b509a2284ee34a1814db17ed0 100644 --- a/Implementation/GUI/imageviewer.cpp +++ b/Implementation/GUI/imageviewer.cpp @@ -134,7 +134,15 @@ ImageViewer::ImageViewer(QWidget *parent) newLayerDock->setColorVect(colorVect); drawDock->setColorVect(colorVect); createColorDock(); - createLayerDock(); + //createLayerDock(); + + layerDock = new LayerDock(interactionTool); + connect(layerDock,&LayerDock::updateLayerDock,this,&ImageViewer::updateLayerDock); + connect(layerDock,&LayerDock::newLayer,this,&ImageViewer::newLayer); + connect(layerDock,&LayerDock::update,this,&ImageViewer::updateWithoutLayer); + connect(layerDock,QOverload<toolParameters_t*>::of(&LayerDock::getParams),this,&ImageViewer::setMergeParams); + addDockWidget(Qt::RightDockWidgetArea, layerDock->getDockWidget()); + resize(QGuiApplication::primaryScreen()->availableSize() * 3 / 5); } @@ -187,7 +195,7 @@ void ImageViewer::createColorDock(){ // } - +/* void ImageViewer::createLayerDock(){ layerDock = new QDockWidget(tr("Layers"), this); @@ -206,7 +214,7 @@ void ImageViewer::createLayerDock(){ addDockWidget(Qt::RightDockWidgetArea, layerDock); layerDock->setFeatures(QDockWidget::DockWidgetMovable|QDockWidget::DockWidgetFloatable); } - +*/ bool ImageViewer::loadFile(const QString &fileName) { @@ -263,7 +271,7 @@ bool ImageViewer::saveFile(const QString &fileName) QPixmap *px = new QPixmap(interactionTool->getPicture()->getMaxSize()); QPainter *painter= new QPainter(px); for (int i = 0; i < interactionTool->getPicture()->getLayerCount(); i++) { - if (layerCheckboxes[i]->isChecked()){ + if (layerDock->isLayerCheckboxChecked(i)){ painter->drawImage(interactionTool->getPicture()->xOffset(i),interactionTool->getPicture()->yOffset(i),*interactionTool->getPicture()->getLayerAsQ(i)); //painter->drawI } @@ -310,7 +318,8 @@ void ImageViewer::open() while (dialog.exec() == QDialog::Accepted && !loadFile(dialog.selectedFiles().first())) {} updateColors(); - updateLayerCount(); + //updateLayerCount(); + layerDock->updateLayerCount(); updateVisible(); } //! [1] @@ -619,6 +628,7 @@ void ImageViewer::updateColors(){ } //colorButton->setMenu(colorMenu); } +/* void ImageViewer::changeCurrentLayer(){ if (layerButtons[0]->isChecked()){ newLayer(); @@ -680,7 +690,7 @@ void ImageViewer::changeCurrentLayer(){ layerButtons[i*5+5]->setChecked(false); } } -} +}*/ void ImageViewer::addColor(QColor col, int pos){ QPixmap px(20, 20); colorVect[pos]=col.rgba(); @@ -699,7 +709,8 @@ void ImageViewer::addColor(QColor col, int pos){ if (hasLayer){ interactionTool->getPicture()->getCurrentLayerAsQ()->setColor(pos,colorVect[pos]); //setImage(*interactionTool->getPicture()->getCurrentLayerAsQ()); - updateLayers(); + //updateLayers(); + layerDock->updateLayers(); updateVisible(); } @@ -732,7 +743,8 @@ void ImageViewer::changeColor(){ if (hasLayer){ interactionTool->getPicture()->getCurrentLayerAsQ()->setColor(i,colorVect[i]); //setImage(*interactionTool->getPicture()->getCurrentLayerAsQ()); - updateLayers(); + //updateLayers(); + layerDock->updateLayers(); updateVisible(); } @@ -740,6 +752,7 @@ void ImageViewer::changeColor(){ } } } +/* void ImageViewer::updateLayerCount(){ layerButtons = std::vector<QPushButton*>(); //TODO vector zu Qvector ändern layerCheckboxes = std::vector<QCheckBox*>(); @@ -818,7 +831,7 @@ void ImageViewer::updateLayers(){ if(interactionTool->getPicture()->getLayerCount()>1){ layerButtons[interactionTool->getPicture()->getCurrentLayerIndex()*5+3]->setEnabled(false); } -} +}*/ void ImageViewer::newLayer(){ //param = new toolParameters_t; //param->tool=tools_e::newLayer; @@ -856,7 +869,7 @@ void ImageViewer::calculateVisible(){ } } for (int i = 0; i < interactionTool->getPicture()->getLayerCount(); i++) { - if (layerCheckboxes[i]->isChecked()){ + if (layerDock->isLayerCheckboxChecked(i)){ painter->drawImage(interactionTool->getPicture()->xOffset(i),interactionTool->getPicture()->yOffset(i),*interactionTool->getPicture()->getLayerAsQ(i)); //painter->drawI } @@ -883,7 +896,8 @@ void ImageViewer::setTranslationParams(toolParameters_t *param){ transLationDock->doTranslationII(param); } void ImageViewer::updateall(){ - updateLayerCount(); + //updateLayerCount(); + layerDock->updateLayerCount(); updateColors(); //setImage(*interactionTool.getPicture()->getCurrentLayerAsQ()); updateVisible(); @@ -910,3 +924,15 @@ void ImageViewer::drawShowII(para2 p){ painter->fillPath(path,*pen); imageLabel->setPixmap(*px); } +void ImageViewer::updateLayerDock(){ + addDockWidget(Qt::RightDockWidgetArea, layerDock->getDockWidget()); +} +void ImageViewer::setMergeParams(toolParameters_t *param){ + param->colorVect = colorVect; + layerDock->doMergeII(param); +} +void ImageViewer::updateWithoutLayer(){ + updateColors(); + //setImage(*interactionTool.getPicture()->getCurrentLayerAsQ()); + updateVisible(); +} diff --git a/Implementation/GUI/imageviewer.h b/Implementation/GUI/imageviewer.h index 23bdf6ef4ec4103b867c62d7fddfdbe5a92c652c..3a39db35a8a613e54319fd98ceddb0bca2abed11 100644 --- a/Implementation/GUI/imageviewer.h +++ b/Implementation/GUI/imageviewer.h @@ -51,6 +51,7 @@ #include "TranslationDock.h" #include "NewLayerDock.h" #include "DrawDock.h" +#include "LayerDock.h" #ifndef IMAGEVIEWER_H #define IMAGEVIEWER_H @@ -93,12 +94,13 @@ public: bool loadFile(const QString &); bool getHasLayer(); void updateColors(); - void updateLayers(); - void updateLayerCount(); + //void updateLayers(); + //void updateLayerCount(); QVector<QRgb> getColorVect(); public slots: void updateVisible(); + //void newLayer(); protected: void mousePressEvent(QMouseEvent *event) override; @@ -121,8 +123,10 @@ private slots: //void calcTranslation(); //void doTranslation(); void setTranslationParams(toolParameters_t * param); + void setMergeParams(toolParameters_t * param); void updateHasLayer(bool b); void updateall(); + void updateWithoutLayer(); //void pencil(); //void startDraw(); //void lines(); @@ -137,7 +141,7 @@ private slots: //void setNewColor(); //void setDrawColor(); void changeColor(); - void changeCurrentLayer(); + //void changeCurrentLayer(); //void updateVisible(); void makeShaped(); void newLayer(); @@ -148,11 +152,12 @@ private slots: //void scrollAreaChanged(); void drawShowI(para1 p); void drawShowII(para2 p); + void updateLayerDock(); private: void createActions(); void createColorDock(); - void createLayerDock(); + //void createLayerDock(); //void createTranslateDock(); //void createDrawDock(); void createMenus(); @@ -170,17 +175,17 @@ private: QLabel *imageLabel; QScrollArea *scrollArea; QScrollArea *ColorScrollArea; - QScrollArea *layerScrollArea; + //QScrollArea *layerScrollArea; QWidget *colors; - QWidget *layers; + //QWidget *layers; QMenu *viewMenu; QDockWidget *colorDock; - QDockWidget *layerDock; + //QDockWidget *layerDock; QGridLayout* colorLayout; - QGridLayout* layerLayout; + //QGridLayout* layerLayout; std::vector<QToolButton*> colorButtons; - std::vector<QPushButton*> layerButtons; - std::vector<QCheckBox*> layerCheckboxes; + //std::vector<QPushButton*> layerButtons; + //std::vector<QCheckBox*> layerCheckboxes; QVector<QRgb> colorVect; QVector<QRgb> newColorVect; //QList<QAction*> colorAct; @@ -228,6 +233,8 @@ private: TranslationDock *transLationDock; NewLayerDock *newLayerDock; DrawDock *drawDock; + LayerDock *layerDock; + #ifndef QT_NO_PRINTER QPrinter printer; diff --git a/Implementation/GUI/imageviewer.pro b/Implementation/GUI/imageviewer.pro index f838fad9e499591de786b60a6552850d5a064a96..91de5648f5459acbdb109b3ab362464910dfe568 100644 --- a/Implementation/GUI/imageviewer.pro +++ b/Implementation/GUI/imageviewer.pro @@ -5,6 +5,7 @@ qtHaveModule(printsupport): QT += printsupport HEADERS = imageviewer.h \ DrawDock.h \ InteractionTool.h \ + LayerDock.h \ ManipulationTool.h \ NewLayerDock.h \ Picture.h \ @@ -21,6 +22,7 @@ HEADERS = imageviewer.h \ SOURCES = imageviewer.cpp \ DrawDock.cpp \ InteractionTool.cpp \ + LayerDock.cpp \ ManipulationTool.cpp \ NewLayerDock.cpp \ Picture.cpp \