diff --git a/src/GUI/IntelliPhotoGui.cpp b/src/GUI/IntelliPhotoGui.cpp index 16c8074..2969434 100644 --- a/src/GUI/IntelliPhotoGui.cpp +++ b/src/GUI/IntelliPhotoGui.cpp @@ -8,6 +8,7 @@ // IntelliPhotoGui constructor IntelliPhotoGui::IntelliPhotoGui(){ + //create Gui elements and lay them out createGui(); // Create actions @@ -17,7 +18,9 @@ IntelliPhotoGui::IntelliPhotoGui(){ //set style of the gui setIntelliStyle(); // Size the app + resize(600,600); showMaximized(); + } // User tried to close the app @@ -102,14 +105,6 @@ void IntelliPhotoGui::slotDeleteLayer(){ paintingArea->deleteLayer(layerNumber); } -void slotCreatePenTool(){ - -} - -void slotCreateFloodFillTool(){ - -} - void IntelliPhotoGui::slotSetActiveAlpha(){ // Stores button value bool ok1, ok2; @@ -202,7 +197,7 @@ void IntelliPhotoGui::slotSetActiveLayer(){ { paintingArea->setLayerToActive(layer); } -}; +} void IntelliPhotoGui::slotSetFirstColor(){ paintingArea->colorPickerSetFirstColor(); diff --git a/src/GUI/IntelliPhotoGui.h b/src/GUI/IntelliPhotoGui.h index 3865c1f..ad8250a 100644 --- a/src/GUI/IntelliPhotoGui.h +++ b/src/GUI/IntelliPhotoGui.h @@ -68,7 +68,6 @@ private: //set style of the GUI void setIntelliStyle(); - // Will check if changes have occurred since last save bool maybeSave(); // Opens the Save dialog and saves diff --git a/src/IntelliPhoto.pro b/src/IntelliPhoto.pro index 9b0956d..37df2ff 100644 --- a/src/IntelliPhoto.pro +++ b/src/IntelliPhoto.pro @@ -28,6 +28,7 @@ SOURCES += \ Tool/IntelliToolLine.cpp \ Tool/IntelliToolPen.cpp \ Tool/IntelliToolPlain.cpp \ + Tool/IntelliToolPolygon.cpp \ Tool/IntelliToolRectangle.cpp \ main.cpp @@ -44,11 +45,11 @@ HEADERS += \ Tool/IntelliToolLine.h \ Tool/IntelliToolPen.h \ Tool/IntelliToolPlain.h \ - Tool/IntelliToolRectangle.h \ - Tool/intellitoolcircle.h + Tool/IntelliToolPolygon.h \ + Tool/IntelliToolRectangle.h FORMS += \ - widget.ui + mainwindow.ui QMAKE_CXXFLAGS QMAKE_LFLAGS diff --git a/src/Layer/PaintingArea.cpp b/src/Layer/PaintingArea.cpp index af9be56..d4b0700 100644 --- a/src/Layer/PaintingArea.cpp +++ b/src/Layer/PaintingArea.cpp @@ -15,15 +15,16 @@ #include "Tool/IntelliToolLine.h" #include "Tool/IntelliToolCircle.h" #include "Tool/IntelliToolRectangle.h" +#include "Tool/IntelliToolPolygon.h" PaintingArea::PaintingArea(int maxWidth, int maxHeight, QWidget *parent) :QWidget(parent){ //test yout tool here and reset after accomplished test - this->Tool = new IntelliToolRectangle(this, &colorPicker); + this->Tool = new IntelliToolPolygon(this, &colorPicker); this->setUp(maxWidth, maxHeight); //tetsing this->addLayer(200,200,0,0,ImageType::Shaped_Image); - layerBundle[0].image->drawPlain(QColor(255,0,0,255)); + layerBundle[0].image->drawPlain(QColor(0,0,255,255)); std::vector polygon; polygon.push_back(QPoint(100,000)); polygon.push_back(QPoint(200,100)); @@ -35,7 +36,7 @@ PaintingArea::PaintingArea(int maxWidth, int maxHeight, QWidget *parent) layerBundle[1].image->drawPlain(QColor(0,255,0,255)); layerBundle[1].alpha=200; - activeLayer=1; + activeLayer=0; } PaintingArea::~PaintingArea(){ @@ -192,6 +193,14 @@ void PaintingArea::createLineTool(){ Tool = new IntelliToolLine(this, &colorPicker); } +int PaintingArea::getWidthActiveLayer(){ + return layerBundle.operator[](activeLayer).width; +} + +int PaintingArea::getHeightActiveLayer(){ + return layerBundle.operator[](activeLayer).hight; +} + // If a mouse button is pressed check if it was the // left button and if so store the current position // Set that we are currently drawing diff --git a/src/Layer/PaintingArea.h b/src/Layer/PaintingArea.h index b6cebc1..d7c9282 100644 --- a/src/Layer/PaintingArea.h +++ b/src/Layer/PaintingArea.h @@ -32,7 +32,7 @@ class PaintingArea : public QWidget friend IntelliTool; public: PaintingArea(int maxWidth=600, int maxHeight=600, QWidget *parent = nullptr); - ~PaintingArea(); + ~PaintingArea() override; // Handles all events bool open(const QString &fileName); @@ -57,6 +57,10 @@ public: void createPlainTool(); void createLineTool(); + //get Width and Height of active Layer + int getWidthActiveLayer(); + int getHeightActiveLayer(); + public slots: // Events to handle diff --git a/src/Tool/IntelliToolLine.cpp b/src/Tool/IntelliToolLine.cpp index 0b088cd..83ed0c7 100644 --- a/src/Tool/IntelliToolLine.cpp +++ b/src/Tool/IntelliToolLine.cpp @@ -26,7 +26,7 @@ void IntelliToolLine::onMouseRightReleased(int x, int y){ void IntelliToolLine::onMouseLeftPressed(int x, int y){ IntelliTool::onMouseLeftPressed(x,y); this->start=QPoint(x,y); - this->Canvas->image->drawLine(start, start, colorPicker->getFirstColor(),lineWidth); + this->Canvas->image->drawPoint(start, colorPicker->getFirstColor(),lineWidth); Canvas->image->calculateVisiblity(); } @@ -43,7 +43,6 @@ void IntelliToolLine::onWheelScrolled(int value){ } void IntelliToolLine::onMouseMoved(int x, int y){ - IntelliTool::onMouseMoved(x,y); if(this->drawing){ this->Canvas->image->drawPlain(Qt::transparent); QPoint next(x,y); diff --git a/src/Tool/IntelliToolPolygon.cpp b/src/Tool/IntelliToolPolygon.cpp new file mode 100644 index 0000000..d075529 --- /dev/null +++ b/src/Tool/IntelliToolPolygon.cpp @@ -0,0 +1,106 @@ +#include "IntelliToolPolygon.h" +#include "Layer/PaintingArea.h" +#include +#include + +IntelliToolPolygon::IntelliToolPolygon(PaintingArea* Area, IntelliColorPicker* colorPicker) + :IntelliTool(Area, colorPicker){ + lineWidth = 5; + isDrawing = false; + PointIsNearStart = false; + drawingPoint.setX(0); + drawingPoint.setY(0); + Point.setX(0); + Point.setY(0); +} + +void IntelliToolPolygon::onMouseLeftPressed(int x, int y){ + if(!isDrawing){ + width = Area->getWidthActiveLayer(); + height = Area->getHeightActiveLayer(); + } + if(!isDrawing && x > 0 && y > 0 && x < width && y < height){ + isDrawing = true; + drawingPoint.setX(x); + drawingPoint.setY(y); + QPointList.push_back(drawingPoint); + IntelliTool::onMouseLeftPressed(x,y); + this->Canvas->image->drawPlain(Qt::transparent); + this->Canvas->image->drawPoint(QPointList.back(), colorPicker->getFirstColor(), lineWidth); + this->Canvas->image->calculateVisiblity(); + } + else if(isDrawing && isNearStart(x,y,QPointList.front())){ + PointIsNearStart = isNearStart(x,y,QPointList.front()); + this->Canvas->image->drawLine(QPointList.back(), QPointList.front(), colorPicker->getFirstColor(), lineWidth); + this->Canvas->image->calculateVisiblity(); + } + else if(isDrawing){ + drawingPoint.setX(x); + drawingPoint.setY(y); + QPointList.push_back(drawingPoint); + this->Canvas->image->drawLine(QPointList.operator[](QPointList.size() - 2), QPointList.back(), colorPicker->getFirstColor(), lineWidth); + this->Canvas->image->calculateVisiblity(); + } +} + +void IntelliToolPolygon::onMouseRightPressed(int x, int y){ + isDrawing = false; + PointIsNearStart = false; + QPointList.clear(); + IntelliTool::onMouseRightPressed(x,y); +} + +void IntelliToolPolygon::onMouseLeftReleased(int x, int y){ + if(PointIsNearStart && QPointList.size() > 1){ + this->Canvas->image->calculateVisiblity(); + PointIsNearStart = false; + isDrawing = false; + Triangles = IntelliHelper::calculateTriangles(QPointList); + for(int i = 0; i < width; i++){ + for(int j = 0; j < height; j++){ + Point.setX(i); + Point.setY(j); + if(IntelliHelper::isInPolygon(Triangles,Point)){ + this->Canvas->image->drawPixel(QPoint(i,j), colorPicker->getFirstColor()); + } + } + } + QPointList.clear(); + IntelliTool::onMouseLeftReleased(x,y); + } +} + +void IntelliToolPolygon::onMouseRightReleased(int x, int y){ + +} + +void IntelliToolPolygon::onWheelScrolled(int value){ + if(!isDrawing){ + if(lineWidth + value < 10){ + lineWidth += value; + } + if(lineWidth < 1){ + lineWidth = 1; + } + } +} + +void IntelliToolPolygon::onMouseMoved(int x, int y){ + +} + +bool IntelliToolPolygon::isNearStart(int x, int y, QPoint Startpoint){ + bool isNear = false; + int StartX = Startpoint.x(); + int StartY = Startpoint.y(); + int valueToNear = 10; + + for(int i = StartX - valueToNear; i < StartX + valueToNear; i++){ + for(int j = StartY - valueToNear; j < StartY + valueToNear; j++){ + if((i == x) && (j == y)){ + isNear = true; + } + } + } + return isNear; +} diff --git a/src/Tool/IntelliToolPolygon.h b/src/Tool/IntelliToolPolygon.h new file mode 100644 index 0000000..da9fa7c --- /dev/null +++ b/src/Tool/IntelliToolPolygon.h @@ -0,0 +1,79 @@ +#ifndef INTELLITOOLPOLYGON_H +#define INTELLITOOLPOLYGON_H + +#include "IntelliTool.h" +#include "IntelliHelper/IntelliHelper.h" +#include +#include +/*! + * \brief The IntelliToolPolygon managed the Drawing of Polygonforms + */ +class IntelliToolPolygon : public IntelliTool +{ +public: + /*! + * \brief IntelliToolPolygon Constructor Define the Tool-intern Parameters + * \param Area + * \param colorPicker + */ + IntelliToolPolygon(PaintingArea* Area, IntelliColorPicker* colorPicker); + + virtual void onMouseLeftPressed(int x, int y) override; + virtual void onMouseLeftReleased(int x, int y) override; + virtual void onMouseRightPressed(int x, int y) override; + virtual void onMouseRightReleased(int x, int y) override; + + virtual void onWheelScrolled(int value) override; + + virtual void onMouseMoved(int x, int y) override; + +private: + /*! + * \brief isNearStart + * \param x + * \param y + * \param Startpoint + * \return true : Near Startpoint, else false + */ + bool isNearStart(int x, int y, QPoint Startpoint); + + /*! + * \brief lineWidth of the Drawing Polygon + */ + int lineWidth; + /*! + * \brief width of the active Layer + */ + int width; + /*! + * \brief height of the active Layer + */ + int height; + /*! + * \brief isDrawing true while drawing, else false + */ + bool isDrawing; + /*! + * \brief PointIsNearStart true, when last click near Startpoint, else false + */ + bool PointIsNearStart; + /*! + * \brief drawingPoint Current Point after Left-Click + */ + QPoint drawingPoint; + /*! + * \brief Point Needed to look, if Point is in Polygon + */ + QPoint Point; + /*! + * \brief QPointList List of all Points of the Polygon + */ + std::vector QPointList; + /*! + * \brief Triangles Transformed QPointList into triangulated Form of the Polygon + */ + std::vector Triangles; + +}; + +#endif // INTELLITOOLPOLYGON_H diff --git a/src/mainwindow.ui b/src/mainwindow.ui new file mode 100644 index 0000000..433b697 --- /dev/null +++ b/src/mainwindow.ui @@ -0,0 +1,23 @@ + + + MainWindow + + + + 0 + 0 + 542 + 459 + + + + IntelliPhoto + + + true + + + + + + diff --git a/src/widget.ui b/src/widget.ui deleted file mode 100644 index b1d4c7b..0000000 --- a/src/widget.ui +++ /dev/null @@ -1,19 +0,0 @@ - - - Widget - - - - 0 - 0 - 360 - 206 - - - - Widget - - - - -