From 9ae76fd3e89fecb79d382ad6e42a877d6e5c29f5 Mon Sep 17 00:00:00 2001
From: passscod <passscoed@gmail.com>
Date: Fri, 31 Jan 2020 21:35:16 +0100
Subject: [PATCH] neu
---
Implementation/GUI/LayerDock.cpp | 188 +++++++++++++++++++++++++++++
Implementation/GUI/LayerDock.h | 48 ++++++++
Implementation/GUI/imageviewer.cpp | 48 ++++++--
Implementation/GUI/imageviewer.h | 27 +++--
Implementation/GUI/imageviewer.pro | 2 +
5 files changed, 292 insertions(+), 21 deletions(-)
create mode 100644 Implementation/GUI/LayerDock.cpp
create mode 100644 Implementation/GUI/LayerDock.h
diff --git a/Implementation/GUI/LayerDock.cpp b/Implementation/GUI/LayerDock.cpp
new file mode 100644
index 0000000..aede84f
--- /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 0000000..9a22452
--- /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 1d60c47..9eaf33a 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 23bdf6e..3a39db3 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 f838fad..91de564 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 \
--
GitLab