diff --git a/src/Bilder.qrc b/src/Bilder.qrc new file mode 100644 index 0000000..3e190f4 --- /dev/null +++ b/src/Bilder.qrc @@ -0,0 +1,13 @@ + + + icons/icon.png + icons/circle-tool.svg + icons/eraser-tool.svg + icons/flood-fill-tool.svg + icons/magic-wand-tool.svg + icons/pen-tool.svg + icons/polygon-tool.svg + icons/rectangle-tool.svg + icons/Wechselpfeile.png + + diff --git a/src/GUI/IntelliPhotoGui.cpp b/src/GUI/IntelliPhotoGui.cpp index 6901c10..6fb1e81 100644 --- a/src/GUI/IntelliPhotoGui.cpp +++ b/src/GUI/IntelliPhotoGui.cpp @@ -1,8 +1,5 @@ // ---------- IntelliPhotoGui.cpp ---------- -#include -#include - #include "IntelliPhotoGui.h" #include "Layer/PaintingArea.h" @@ -19,7 +16,7 @@ IntelliPhotoGui::IntelliPhotoGui(){ // Size the app resize(600,600); showMaximized(); - + setDefaultToolValue(); } // User tried to close the app @@ -84,7 +81,7 @@ void IntelliPhotoGui::slotCreateNewLayer(){ if (ok1&&ok2) { int layer = paintingArea->addLayer(width,height,0,0); - paintingArea->slotActivateLayer(layer); + UpdateGui(); } } @@ -98,10 +95,12 @@ void IntelliPhotoGui::slotDeleteLayer(){ // Define the standard Value, min, max, step and ok button int layerNumber = QInputDialog::getInt(this, tr("delete Layer"), tr("Number:"), - 1,0, 500, 1, &ok); + paintingArea->getNumberOfActiveLayer(),0, 500, 1, &ok); // Create New Layer - if (ok) + if (ok){ paintingArea->deleteLayer(layerNumber); + UpdateGui(); + } } void IntelliPhotoGui::slotSetActiveAlpha(){ @@ -121,6 +120,7 @@ void IntelliPhotoGui::slotSetActiveAlpha(){ if (ok1&&ok2) { paintingArea->setLayerAlpha(layer,alpha); + UpdateGui(); } } @@ -179,6 +179,7 @@ void IntelliPhotoGui::slotClearActiveLayer(){ if (ok1&&ok2&&ok3&&ok4) { paintingArea->floodFill(red, green, blue, alpha); + UpdateGui(); } } @@ -195,46 +196,57 @@ void IntelliPhotoGui::slotSetActiveLayer(){ if (ok1) { paintingArea->setLayerActive(layer); + UpdateGui(); } } void IntelliPhotoGui::slotSetFirstColor(){ paintingArea->colorPickerSetFirstColor(); + UpdateGui(); } void IntelliPhotoGui::slotSetSecondColor(){ paintingArea->colorPickerSetSecondColor(); + UpdateGui(); } void IntelliPhotoGui::slotSwapColor(){ paintingArea->colorPickerSwapColors(); + UpdateGui(); } void IntelliPhotoGui::slotCreatePenTool(){ + PenButton->setChecked(true); paintingArea->createPenTool(); } void IntelliPhotoGui::slotCreatePlainTool(){ + PlainButton->setChecked(true); paintingArea->createPlainTool(); } void IntelliPhotoGui::slotCreateLineTool(){ + LineButton->setChecked(true); paintingArea->createLineTool(); } void IntelliPhotoGui::slotCreateRectangleTool(){ + RectangleButton->setChecked(true); paintingArea->createRectangleTool(); } void IntelliPhotoGui::slotCreateCircleTool(){ + CircleButton->setChecked(true); paintingArea->createCircleTool(); } void IntelliPhotoGui::slotCreatePolygonTool(){ + PolygonButton->setChecked(true); paintingArea->createPolygonTool(); } void IntelliPhotoGui::slotCreateFloodFillTool(){ + FloodFillButton->setChecked(true); paintingArea->createFloodFillTool(); } @@ -245,6 +257,29 @@ void IntelliPhotoGui::slotAboutDialog(){ tr("

IntelliPhotoPretty basic editor.

")); } +void IntelliPhotoGui::slotEnterPressed(){ + QString string = EditLineWidth->text(); + if(string.toInt() > 50){ + EditLineWidth->setText("50"); + } + paintingArea->Toolsettings.setLineWidth(string.toInt()); + string = EditLineInnerAlpha->text(); + if(string.toInt() > 255){ + EditLineInnerAlpha->setText("255"); + } + paintingArea->Toolsettings.setInnerAlpha(string.toInt()); +} + +void IntelliPhotoGui::slotResetTools(){ + CircleButton->setChecked(false); + FloodFillButton->setChecked(false); + LineButton->setChecked(false); + PenButton->setChecked(false); + PlainButton->setChecked(false); + PolygonButton->setChecked(false); + RectangleButton->setChecked(false); +} + // Define menu actions that call functions void IntelliPhotoGui::createActions(){ // Get a list of the supported file formats @@ -324,34 +359,45 @@ void IntelliPhotoGui::createActions(){ //Create Color Actions here actionColorPickerFirstColor = new QAction(tr("&Main"), this); connect(actionColorPickerFirstColor, SIGNAL(triggered()), this, SLOT(slotSetFirstColor())); + connect(FirstColorButton, SIGNAL(clicked()), this, SLOT(slotSetFirstColor())); actionColorPickerSecondColor = new QAction(tr("&Secondary"), this); connect(actionColorPickerSecondColor, SIGNAL(triggered()), this, SLOT(slotSetSecondColor())); + connect(SecondColorButton, SIGNAL(clicked()), this, SLOT(slotSetSecondColor())); actionColorSwap = new QAction(tr("&Switch"), this); actionColorSwap->setShortcut(QKeySequence(Qt::CTRL + Qt::SHIFT + Qt::Key_S)); connect(actionColorSwap, SIGNAL(triggered()), this, SLOT(slotSwapColor())); + connect(SwitchColorButton, SIGNAL(clicked()), this, SLOT(slotSwapColor())); //Create Tool actions down here actionCreatePlainTool = new QAction(tr("&Plain"), this); + connect(actionCreatePlainTool, SIGNAL(triggered()), this, SLOT(slotResetTools())); connect(actionCreatePlainTool, SIGNAL(triggered()), this, SLOT(slotCreatePlainTool())); + actionCreatePenTool = new QAction(tr("&Pen"),this); - connect(actionCreatePenTool, SIGNAL(triggered()), this, SLOT(slotCreatePenTool())); + connect(actionCreatePenTool, SIGNAL(triggered()), this, SLOT(slotResetTools())); + connect(actionCreatePenTool, SIGNAL(triggered()), this, SLOT(slotCreatePenTool())); actionCreateLineTool = new QAction(tr("&Line"), this); + connect(actionCreateLineTool, SIGNAL(triggered()), this, SLOT(slotResetTools())); connect(actionCreateLineTool, SIGNAL(triggered()), this, SLOT(slotCreateLineTool())); actionCreateCircleTool = new QAction(tr("&Circle"), this); + connect(actionCreateCircleTool, SIGNAL(triggered()), this, SLOT(slotResetTools())); connect(actionCreateCircleTool, SIGNAL(triggered()), this, SLOT(slotCreateCircleTool())); actionCreateRectangleTool = new QAction(tr("&Rectangle"), this); + connect(actionCreateRectangleTool, SIGNAL(triggered()), this, SLOT(slotResetTools())); connect(actionCreateRectangleTool, SIGNAL(triggered()), this, SLOT(slotCreateRectangleTool())); actionCreatePolygonTool = new QAction(tr("&Polygon"), this); + connect(actionCreatePolygonTool, SIGNAL(triggered()), this, SLOT(slotResetTools())); connect(actionCreatePolygonTool, SIGNAL(triggered()), this, SLOT(slotCreatePolygonTool())); actionCreateFloodFillTool = new QAction(tr("&FloodFill"), this); + connect(actionCreateFloodFillTool, SIGNAL(triggered()), this, SLOT(slotResetTools())); connect(actionCreateFloodFillTool, SIGNAL(triggered()), this, SLOT(slotCreateFloodFillTool())); // Create about action and tie to IntelliPhotoGui::about() @@ -361,6 +407,30 @@ void IntelliPhotoGui::createActions(){ // Create about Qt action and tie to IntelliPhotoGui::aboutQt() actionAboutQtDialog = new QAction(tr("About &Qt"), this); connect(actionAboutQtDialog, SIGNAL(triggered()), qApp, SLOT(aboutQt())); + + connect(EditLineWidth, SIGNAL(returnPressed()), this, SLOT(slotEnterPressed())); + connect(EditLineInnerAlpha, SIGNAL(returnPressed()), this, SLOT(slotEnterPressed())); + + connect(CircleButton,SIGNAL(pressed()), this, SLOT(slotResetTools())); + connect(CircleButton, SIGNAL(clicked()), this, SLOT(slotCreateCircleTool())); + + connect(FloodFillButton,SIGNAL(pressed()), this, SLOT(slotResetTools())); + connect(FloodFillButton, SIGNAL(clicked()), this, SLOT(slotCreateFloodFillTool())); + + connect(LineButton,SIGNAL(pressed()), this, SLOT(slotResetTools())); + connect(LineButton, SIGNAL(clicked()), this, SLOT(slotCreateLineTool())); + + connect(PenButton,SIGNAL(pressed()), this, SLOT(slotResetTools())); + connect(PenButton, SIGNAL(clicked()), this, SLOT(slotCreatePenTool())); + + connect(PlainButton,SIGNAL(pressed()), this, SLOT(slotResetTools())); + connect(PlainButton, SIGNAL(clicked()), this, SLOT(slotCreatePlainTool())); + + connect(PolygonButton,SIGNAL(pressed()), this, SLOT(slotResetTools())); + connect(PolygonButton, SIGNAL(clicked()), this, SLOT(slotCreatePolygonTool())); + + connect(RectangleButton,SIGNAL(pressed()), this, SLOT(slotResetTools())); + connect(RectangleButton, SIGNAL(clicked()), this, SLOT(slotCreateRectangleTool())); } // Create the menubar @@ -436,18 +506,137 @@ void IntelliPhotoGui::createGui(){ // create Gui elements paintingArea = new PaintingArea(); + paintingArea->DumpyGui = this; + + p = QPixmap(":/Icons/Buttons/icons/circle-tool.svg"); + CircleButton = new QPushButton(); + CircleButton->setFixedSize(Buttonsize); + CircleButton->setIcon(p); + CircleButton->setIconSize(Buttonsize); + CircleButton->setCheckable(true); + + p = QPixmap(":/Icons/Buttons/icons/flood-fill-tool.svg"); + FloodFillButton = new QPushButton(); + FloodFillButton->setFixedSize(Buttonsize); + FloodFillButton->setIcon(p); + FloodFillButton->setIconSize(Buttonsize); + FloodFillButton->setCheckable(true); + + p = QPixmap(":/Icons/Buttons/icons/icon.png"); + LineButton = new QPushButton(); + LineButton->setFixedSize(Buttonsize); + LineButton->setIcon(p); + LineButton->setIconSize(Buttonsize); + LineButton->setCheckable(true); + + p = QPixmap(":/Icons/Buttons/icons/pen-tool.svg"); + PenButton = new QPushButton(); + PenButton->setFixedSize(Buttonsize); + PenButton->setIcon(p); + PenButton->setIconSize(Buttonsize); + PenButton->setCheckable(true); + + p = QPixmap(":/Icons/Buttons/icons/icon.png"); + PlainButton = new QPushButton(); + PlainButton->setFixedSize(Buttonsize); + PlainButton->setIcon(p); + PlainButton->setIconSize(Buttonsize); + PlainButton->setCheckable(true); + + p = QPixmap(":/Icons/Buttons/icons/polygon-tool.svg"); + PolygonButton = new QPushButton(); + PolygonButton->setFixedSize(Buttonsize); + PolygonButton->setIcon(p); + PolygonButton->setIconSize(Buttonsize); + PolygonButton->setCheckable(true); + + p = QPixmap(":/Icons/Buttons/icons/rectangle-tool.svg"); + RectangleButton = new QPushButton(); + RectangleButton->setFixedSize(Buttonsize); + RectangleButton->setIcon(p); + RectangleButton->setIconSize(Buttonsize); + RectangleButton->setCheckable(true); + + WidthLine = new QLabel(); + WidthLine->setText("Width"); + WidthLine->setFixedSize(Buttonsize.width(),Buttonsize.height()/3); + + EditLineWidth = new QLineEdit(); + EditLineWidth->setFixedSize(Buttonsize.width(),Buttonsize.height()/3); + EditLineWidth->setText("5"); + ValidatorLineWidth = new QIntValidator(); + ValidatorLineWidth->setTop(99); + ValidatorLineWidth->setBottom(1); + EditLineWidth->setValidator(ValidatorLineWidth); + + innerAlphaLine = new QLabel(); + innerAlphaLine->setText("Inner Alpha"); + innerAlphaLine->setFixedSize(Buttonsize.width(),Buttonsize.height()/3); + + EditLineInnerAlpha = new QLineEdit(); + EditLineInnerAlpha->setFixedSize(Buttonsize.width(),Buttonsize.height()/3); + EditLineInnerAlpha->setText("255"); + ValidatorInnerAlpha = new QIntValidator(); + ValidatorInnerAlpha->setTop(999); + ValidatorInnerAlpha->setBottom(0); + EditLineInnerAlpha->setValidator(ValidatorInnerAlpha); + + FirstColorButton = new QPushButton(); + FirstColorButton->setFixedSize(Buttonsize/2); + + SecondColorButton = new QPushButton(); + SecondColorButton->setFixedSize(Buttonsize/2); + + p = QPixmap(":/Icons/Buttons/icons/Wechselpfeile.png"); + SwitchColorButton = new QPushButton(); + SwitchColorButton->setFixedSize(Buttonsize.width(),Buttonsize.height()/2); + SwitchColorButton->setIcon(p); + SwitchColorButton->setIconSize(QSize(Buttonsize.width(),Buttonsize.height()/2)); + + ActiveLayerLine = new QLabel(); + QString string = QString("Active Layer: %1").arg(paintingArea->getNumberOfActiveLayer()); + ActiveLayerLine->setText(string); + ActiveLayerLine->setFixedSize(Buttonsize.width()+10,Buttonsize.height()/3); + + p = p.fromImage(paintingArea->getImageOfActiveLayer()->getImageData()); + + ActiveLayerImageButton = new QPushButton(); + ActiveLayerImageButton->setFixedSize(Buttonsize); + ActiveLayerImageButton->setIcon(p); + ActiveLayerImageButton->setIconSize(Buttonsize); // set gui elements - mainLayout->addWidget(paintingArea); + + mainLayout->addWidget(paintingArea,1,1,20,1); + mainLayout->addWidget(CircleButton,1,2,1,2); + mainLayout->addWidget(FloodFillButton,2,2,1,2); + mainLayout->addWidget(LineButton,3,2,1,2); + mainLayout->addWidget(PenButton,4,2,1,2); + mainLayout->addWidget(PlainButton,5,2,1,2); + mainLayout->addWidget(PolygonButton,6,2,1,2); + mainLayout->addWidget(RectangleButton,7,2,1,2); + mainLayout->addWidget(WidthLine,8,2,1,2); + mainLayout->addWidget(EditLineWidth,9,2,1,2); + mainLayout->addWidget(innerAlphaLine,10,2,1,2); + mainLayout->addWidget(EditLineInnerAlpha,11,2,1,2); + mainLayout->addWidget(FirstColorButton,12,2,1,1); + mainLayout->addWidget(SecondColorButton,12,3,1,1); + mainLayout->addWidget(SwitchColorButton,13,2,1,2); + mainLayout->addWidget(ActiveLayerLine,14,2,1,2); + mainLayout->addWidget(ActiveLayerImageButton,15,2,1,2); } void IntelliPhotoGui::setIntelliStyle(){ // Set the title setWindowTitle("IntelliPhoto Prototype"); // Set style sheet - this->setStyleSheet("background-color:rgb(64,64,64)"); - this->centralGuiWidget->setStyleSheet("color:rgb(255,255,255)"); + this->setStyleSheet("background-color:rgb(64,64,64)"); + this->centralGuiWidget->setStyleSheet("color:rgb(255,255,255)"); this->menuBar()->setStyleSheet("color:rgb(255,255,255)"); + QString string = QString("background-color: %1").arg(paintingArea->colorPicker.getFirstColor().name()); + FirstColorButton->setStyleSheet(string); + string = QString("background-color: %1").arg(paintingArea->colorPicker.getSecondColor().name()); + SecondColorButton->setStyleSheet(string); } bool IntelliPhotoGui::maybeSave(){ @@ -497,3 +686,20 @@ bool IntelliPhotoGui::saveFile(const QByteArray &fileFormat){ return paintingArea->save(fileName, fileFormat.constData()); } } + +void IntelliPhotoGui::setDefaultToolValue(){ + slotEnterPressed(); +} + +void IntelliPhotoGui::UpdateGui(){ + QString string = QString("Active Layer: %1").arg(paintingArea->getNumberOfActiveLayer()); + ActiveLayerLine->setText(string); + p = p.fromImage(paintingArea->getImageOfActiveLayer()->getImageData()); + ActiveLayerImageButton->setIcon(p); + ActiveLayerImageButton->setIconSize(Buttonsize); + + string = QString("background-color: %1").arg(paintingArea->colorPicker.getFirstColor().name()); + FirstColorButton->setStyleSheet(string); + string = QString("background-color: %1").arg(paintingArea->colorPicker.getSecondColor().name()); + SecondColorButton->setStyleSheet(string); +} diff --git a/src/GUI/IntelliPhotoGui.h b/src/GUI/IntelliPhotoGui.h index e76485c..3b478b6 100644 --- a/src/GUI/IntelliPhotoGui.h +++ b/src/GUI/IntelliPhotoGui.h @@ -1,6 +1,8 @@ #ifndef IntelliPhotoGui_H #define IntelliPhotoGui_H +#include +#include #include #include #include @@ -30,6 +32,8 @@ public: */ IntelliPhotoGui(); +void UpdateGui(); + protected: // Function used to close an event void closeEvent(QCloseEvent*event) override; @@ -69,6 +73,10 @@ void slotCreateFloodFillTool(); // slots for dialogs void slotAboutDialog(); +void slotEnterPressed(); + +void slotResetTools(); + private: // Will tie user actions to functions void createActions(); @@ -83,9 +91,34 @@ bool maybeSave(); // Opens the Save dialog and saves bool saveFile(const QByteArray &fileFormat); +void setDefaultToolValue(); + // What we'll draw on PaintingArea* paintingArea; +const QSize Buttonsize = QSize(70,70); +QPixmap p; +QPushButton* CircleButton; +QPushButton* FloodFillButton; +QPushButton* LineButton; +QPushButton* PenButton; +QPushButton* PlainButton; +QPushButton* PolygonButton; +QPushButton* RectangleButton; +QLabel* WidthLine; +QLabel* innerAlphaLine; +QLineEdit* EditLineWidth; +QLineEdit* EditLineInnerAlpha; +QIntValidator* ValidatorLineWidth; +QIntValidator* ValidatorInnerAlpha; + +QPushButton* FirstColorButton; +QPushButton* SecondColorButton; +QPushButton* SwitchColorButton; + +QLabel* ActiveLayerLine; +QPushButton* ActiveLayerImageButton; + // The menu widgets QMenu*saveAsMenu; QMenu*fileMenu; @@ -135,7 +168,7 @@ QList actionSaveAs; // main GUI elements QWidget* centralGuiWidget; -QGridLayout*mainLayout; +QGridLayout* mainLayout; }; #endif diff --git a/src/Image/IntelliImage.cpp b/src/Image/IntelliImage.cpp index 0a4b919..48deb91 100644 --- a/src/Image/IntelliImage.cpp +++ b/src/Image/IntelliImage.cpp @@ -81,3 +81,7 @@ void IntelliImage::drawPlain(const QColor& color){ QColor IntelliImage::getPixelColor(QPoint& point){ return imageData.pixelColor(point); } + +QImage IntelliImage::getImageData(){ + return imageData; +} diff --git a/src/Image/IntelliImage.h b/src/Image/IntelliImage.h index 04315c3..06edc4b 100644 --- a/src/Image/IntelliImage.h +++ b/src/Image/IntelliImage.h @@ -8,7 +8,8 @@ #include #include -#include "IntelliHelper/IntelliHelper.h" +#include "IntelliHelper/IntelliRenderSettings.h" +#include "IntelliHelper/IntelliTriangulation.h" class IntelliTool; @@ -140,6 +141,8 @@ virtual bool loadImage(const QString &filePath); * \return The color of the Pixel as QColor. */ virtual QColor getPixelColor(QPoint& point); + +QImage getImageData(); }; #endif diff --git a/src/Image/IntelliShapedImage.cpp b/src/Image/IntelliShapedImage.cpp index b61cb23..3bf94d5 100644 --- a/src/Image/IntelliShapedImage.cpp +++ b/src/Image/IntelliShapedImage.cpp @@ -1,5 +1,5 @@ #include "Image/IntelliShapedImage.h" -#include "IntelliHelper/IntelliHelper.h" +#include "IntelliHelper/IntelliTriangulation.h" #include #include #include @@ -42,7 +42,7 @@ void IntelliShapedImage::calculateVisiblity(){ for(int x=0; x& polygonData){ for(auto element:polygonData) { this->polygonData.push_back(QPoint(element.x(), element.y())); } - triangles = IntelliHelper::calculateTriangles(polygonData); + triangles = IntelliTriangulation::calculateTriangles(polygonData); } calculateVisiblity(); return; diff --git a/src/IntelliHelper/IntelliRenderSettings.cpp b/src/IntelliHelper/IntelliRenderSettings.cpp new file mode 100644 index 0000000..5673a2a --- /dev/null +++ b/src/IntelliHelper/IntelliRenderSettings.cpp @@ -0,0 +1,10 @@ +#include "IntelliRenderSettings.h" + +IntelliRenderSettings::IntelliRenderSettings() +{ + +} + +bool IntelliRenderSettings::getFastRenderer(){ + return fastRenderer; +} diff --git a/src/IntelliHelper/IntelliRenderSettings.h b/src/IntelliHelper/IntelliRenderSettings.h new file mode 100644 index 0000000..5763bb0 --- /dev/null +++ b/src/IntelliHelper/IntelliRenderSettings.h @@ -0,0 +1,20 @@ +#ifndef INTELLIRENDERSETTINGS_H +#define INTELLIRENDERSETTINGS_H + + +class IntelliRenderSettings +{ +public: + IntelliRenderSettings(); + + /*! + * \brief The getfastRenderer gets the value of the flag for the fastRenderer setting. + * \return Returns true if fastRenderer is active else false + */ + bool getFastRenderer(); + +private: + bool fastRenderer = true; +}; + +#endif // INTELLIRENDERSETTINGS_H diff --git a/src/IntelliHelper/IntelliToolsettings.cpp b/src/IntelliHelper/IntelliToolsettings.cpp new file mode 100644 index 0000000..6f95d1c --- /dev/null +++ b/src/IntelliHelper/IntelliToolsettings.cpp @@ -0,0 +1,53 @@ +#include "IntelliToolsettings.h" +#include + +IntelliToolsettings::IntelliToolsettings() +{ + lineWidth = 1; + innerAlpha = 255; + Linestyle = LineStyle::SOLID_LINE; +} + +IntelliToolsettings::~IntelliToolsettings(){ + +} + +int IntelliToolsettings::getLineWidth(){ + return lineWidth; +} + +void IntelliToolsettings::setLineWidth(){ + lineWidth = QInputDialog::getInt(nullptr,"Line Width Input", "Width",1,1,50,1); +} + +void IntelliToolsettings::setLineWidth(int LineWidth){ + if(LineWidth < 1){ + LineWidth = 1; + } + else if(LineWidth > 50){ + LineWidth = 50; + } + lineWidth = LineWidth; +} + +int IntelliToolsettings::getInnerAlpha(){ + return this->innerAlpha; +} + +void IntelliToolsettings::setInnerAlpha(){ + this->innerAlpha = QInputDialog::getInt(nullptr,"Inner Aplha Input", "Value",0,0,255,1); +} + +void IntelliToolsettings::setInnerAlpha(int innerAlpha){ + if(innerAlpha < 0){ + innerAlpha = 0; + } + else if(innerAlpha > 255){ + innerAlpha = 255; + } + this->innerAlpha = innerAlpha; +} + +IntelliToolsettings::LineStyle IntelliToolsettings::getLinestyle(){ + return Linestyle; +} diff --git a/src/IntelliHelper/IntelliToolsettings.h b/src/IntelliHelper/IntelliToolsettings.h new file mode 100644 index 0000000..3907bb1 --- /dev/null +++ b/src/IntelliHelper/IntelliToolsettings.h @@ -0,0 +1,29 @@ +#ifndef INTELLITOOLSETTINGS_H +#define INTELLITOOLSETTINGS_H + +class IntelliToolsettings { +public: + /*! + * \brief The LineStyle enum classifing all ways of drawing a line. + */ + enum class LineStyle { + SOLID_LINE, + DOTTED_LINE + }; + IntelliToolsettings(); + virtual ~IntelliToolsettings(); + int getLineWidth(); + void setLineWidth(); + void setLineWidth(int LineWidth); + int getInnerAlpha(); + void setInnerAlpha(); + void setInnerAlpha(int innerAlpha); + LineStyle getLinestyle(); + +private: + int lineWidth; + int innerAlpha; + LineStyle Linestyle; +}; + +#endif // INTELLITOOLSETTINGS_H diff --git a/src/IntelliHelper/IntelliHelper.cpp b/src/IntelliHelper/IntelliTriangulation.cpp similarity index 94% rename from src/IntelliHelper/IntelliHelper.cpp rename to src/IntelliHelper/IntelliTriangulation.cpp index 867a139..55ddd9a 100644 --- a/src/IntelliHelper/IntelliHelper.cpp +++ b/src/IntelliHelper/IntelliTriangulation.cpp @@ -1,10 +1,10 @@ -#include "IntelliHelper.h" +#include "IntelliTriangulation.h" #include #include #include #define pi 3.1415926535897932384626433832795 -std::vector IntelliHelper::calculateTriangles(std::vector polyPoints){ +std::vector IntelliTriangulation::calculateTriangles(std::vector polyPoints){ // helper for managing the triangle vertices and their state struct TriangleHelper { QPoint vertex; @@ -113,9 +113,9 @@ std::vector IntelliHelper::calculateTriangles(std::vector poly return Triangles; } -bool IntelliHelper::isInPolygon(std::vector &triangles, QPoint &point){ +bool IntelliTriangulation::isInPolygon(std::vector &triangles, QPoint &point){ for(auto triangle : triangles) { - if(IntelliHelper::isInTriangle(triangle, point)) { + if(IntelliTriangulation::isInTriangle(triangle, point)) { return true; } } diff --git a/src/IntelliHelper/IntelliHelper.h b/src/IntelliHelper/IntelliTriangulation.h similarity index 87% rename from src/IntelliHelper/IntelliHelper.h rename to src/IntelliHelper/IntelliTriangulation.h index 2af1748..cbc6024 100644 --- a/src/IntelliHelper/IntelliHelper.h +++ b/src/IntelliHelper/IntelliTriangulation.h @@ -1,5 +1,5 @@ -#ifndef INTELLIHELPER_H -#define INTELLIHELPER_H +#ifndef INTELLITRIANGULATION_H +#define INTELLITRIANGULATION_H #include #include @@ -11,7 +11,7 @@ struct Triangle { QPoint A,B,C; }; -namespace IntelliHelper { +namespace IntelliTriangulation { /*! * \brief A function to get the 2*area of a traingle, using its determinat. @@ -34,9 +34,9 @@ inline bool isInTriangle(Triangle& tri, QPoint& P){ float val1, val2, val3; bool neg, pos; - val1 = IntelliHelper::sign(P,tri.A,tri.B); - val2 = IntelliHelper::sign(P,tri.B,tri.C); - val3 = IntelliHelper::sign(P,tri.C,tri.A); + val1 = IntelliTriangulation::sign(P,tri.A,tri.B); + val2 = IntelliTriangulation::sign(P,tri.B,tri.C); + val3 = IntelliTriangulation::sign(P,tri.C,tri.A); neg = (val1<0.f) || (val2<0.f) || (val3<0.f); pos = (val1>0.f) || (val2>0.f) || (val3>0.f); diff --git a/src/IntelliPhoto.pro b/src/IntelliPhoto.pro index fe7264d..13b6975 100644 --- a/src/IntelliPhoto.pro +++ b/src/IntelliPhoto.pro @@ -21,7 +21,9 @@ SOURCES += \ Image/IntelliRasterImage.cpp \ Image/IntelliShapedImage.cpp \ IntelliHelper/IntelliColorPicker.cpp \ - IntelliHelper/IntelliHelper.cpp \ + IntelliHelper/IntelliRenderSettings.cpp \ + IntelliHelper/IntelliToolsettings.cpp \ + IntelliHelper/IntelliTriangulation.cpp \ Layer/PaintingArea.cpp \ Tool/IntelliTool.cpp \ Tool/IntelliToolCircle.cpp \ @@ -39,7 +41,9 @@ HEADERS += \ Image/IntelliRasterImage.h \ Image/IntelliShapedImage.h \ IntelliHelper/IntelliColorPicker.h \ - IntelliHelper/IntelliHelper.h \ + IntelliHelper/IntelliRenderSettings.h \ + IntelliHelper/IntelliToolsettings.h \ + IntelliHelper/IntelliTriangulation.h \ Layer/PaintingArea.h \ Tool/IntelliTool.h \ Tool/IntelliToolCircle.h \ @@ -63,3 +67,6 @@ ICON = icon.icns qnx: target.path = /tmp/$${TARGET}/bin else: unix:!android: target.path = /opt/$${TARGET}/bin !isEmpty(target.path): INSTALLS += target + +RESOURCES += \ + Bilder.qrc diff --git a/src/Layer/PaintingArea.cpp b/src/Layer/PaintingArea.cpp index 82380ec..0550c0d 100644 --- a/src/Layer/PaintingArea.cpp +++ b/src/Layer/PaintingArea.cpp @@ -66,14 +66,15 @@ int PaintingArea::addLayer(int width, int height, int widthOffset, int heightOff } newLayer.alpha = 255; this->layerBundle.push_back(newLayer); - return static_cast(layerBundle.size())-1; + activeLayer = static_cast(layerBundle.size())-1; + return activeLayer; } void PaintingArea::deleteLayer(int index){ if(index(layerBundle.size())) { this->layerBundle.erase(layerBundle.begin()+index); - if(activeLayer>=index) { + if(activeLayer>=index && activeLayer != 0) { activeLayer--; } } @@ -145,10 +146,12 @@ void PaintingArea::floodFill(int r, int g, int b, int a){ } void PaintingArea::movePositionActive(int x, int y){ - if(Tool->getIsDrawing()){ - IntelliTool* temp = copyActiveTool(); - delete this->Tool; - this->Tool = temp; + if(Tool!=nullptr){ + if(Tool->getIsDrawing()){ + IntelliTool* temp = copyActiveTool(); + delete this->Tool; + this->Tool = temp; + } } layerBundle[static_cast(activeLayer)].widthOffset += x; layerBundle[static_cast(activeLayer)].heightOffset += y; @@ -168,10 +171,12 @@ void PaintingArea::moveActiveLayer(int idx){ } void PaintingArea::slotActivateLayer(int a){ - if(Tool->getIsDrawing()){ - IntelliTool* temp = copyActiveTool(); - delete this->Tool; - this->Tool = temp; + if(Tool != nullptr){ + if(Tool->getIsDrawing()){ + IntelliTool* temp = copyActiveTool(); + delete this->Tool; + this->Tool = temp; + } } if(a>=0 && a < static_cast(layerBundle.size())) { this->setLayerActive(a); @@ -194,36 +199,36 @@ void PaintingArea::colorPickerSwapColors(){ void PaintingArea::createPenTool(){ delete this->Tool; - Tool = new IntelliToolPen(this, &colorPicker); + Tool = new IntelliToolPen(this, &colorPicker, &Toolsettings); } void PaintingArea::createPlainTool(){ delete this->Tool; - Tool = new IntelliToolPlainTool(this, &colorPicker); + Tool = new IntelliToolPlainTool(this, &colorPicker, &Toolsettings); } void PaintingArea::createLineTool(){ delete this->Tool; - Tool = new IntelliToolLine(this, &colorPicker); + Tool = new IntelliToolLine(this, &colorPicker, &Toolsettings); } void PaintingArea::createRectangleTool(){ delete this->Tool; - Tool = new IntelliToolRectangle(this, &colorPicker); + Tool = new IntelliToolRectangle(this, &colorPicker, &Toolsettings); } void PaintingArea::createCircleTool(){ delete this->Tool; - Tool = new IntelliToolCircle(this, &colorPicker); + Tool = new IntelliToolCircle(this, &colorPicker, &Toolsettings); } void PaintingArea::createPolygonTool(){ delete this->Tool; - Tool = new IntelliToolPolygon(this, &colorPicker); + Tool = new IntelliToolPolygon(this, &colorPicker, &Toolsettings); } void PaintingArea::createFloodFillTool(){ delete this->Tool; - Tool = new IntelliToolFloodFill(this, &colorPicker); + Tool = new IntelliToolFloodFill(this, &colorPicker, &Toolsettings); } int PaintingArea::getWidthOfActive(){ @@ -381,13 +386,21 @@ void PaintingArea::createTempTopLayer(int idx){ IntelliTool* PaintingArea::copyActiveTool(){ switch(Tool->getTooltype()){ - case IntelliTool::Tooltype::CIRCLE: return new IntelliToolCircle(this,&colorPicker); - case IntelliTool::Tooltype::FLOODFILL: return new IntelliToolFloodFill(this,&colorPicker); - case IntelliTool::Tooltype::LINE: return new IntelliToolLine(this,&colorPicker); - case IntelliTool::Tooltype::PEN: return new IntelliToolPen(this,&colorPicker); - case IntelliTool::Tooltype::PLAIN: return new IntelliToolPlainTool(this,&colorPicker); - case IntelliTool::Tooltype::POLYGON: return new IntelliToolPolygon(this,&colorPicker); - case IntelliTool::Tooltype::RECTANGLE: return new IntelliToolRectangle(this,&colorPicker); + case IntelliTool::Tooltype::CIRCLE: return new IntelliToolCircle(this,&colorPicker, &Toolsettings); + case IntelliTool::Tooltype::FLOODFILL: return new IntelliToolFloodFill(this,&colorPicker, &Toolsettings); + case IntelliTool::Tooltype::LINE: return new IntelliToolLine(this,&colorPicker, &Toolsettings); + case IntelliTool::Tooltype::PEN: return new IntelliToolPen(this,&colorPicker, &Toolsettings); + case IntelliTool::Tooltype::PLAIN: return new IntelliToolPlainTool(this,&colorPicker, &Toolsettings); + case IntelliTool::Tooltype::POLYGON: return new IntelliToolPolygon(this,&colorPicker, &Toolsettings); + case IntelliTool::Tooltype::RECTANGLE: return new IntelliToolRectangle(this,&colorPicker, &Toolsettings); default: return nullptr; } } + +int PaintingArea::getNumberOfActiveLayer(){ + return activeLayer; +} + +IntelliImage* PaintingArea::getImageOfActiveLayer(){ + return layerBundle[activeLayer].image; +} diff --git a/src/Layer/PaintingArea.h b/src/Layer/PaintingArea.h index 81e4af2..10d9ce2 100644 --- a/src/Layer/PaintingArea.h +++ b/src/Layer/PaintingArea.h @@ -7,6 +7,7 @@ #include #include #include +#include "GUI/IntelliPhotoGui.h" #include "Image/IntelliImage.h" #include "Image/IntelliRasterImage.h" #include "Image/IntelliShapedImage.h" @@ -40,6 +41,7 @@ class PaintingArea : public QWidget // QObjects handle events Q_OBJECT friend IntelliTool; + friend IntelliPhotoGui; public: /*! * \brief PaintingArea is the constructor of the PaintingArea class, which initiates the working environment @@ -165,6 +167,13 @@ public: std::vector getPolygonDataOfRealLayer(); + int getNumberOfActiveLayer(); + + IntelliImage* getImageOfActiveLayer(); + + IntelliToolsettings Toolsettings; + IntelliColorPicker colorPicker; + public slots: // Events to handle /*! @@ -200,8 +209,9 @@ private: int maxWidth; int maxHeight; + IntelliRenderSettings renderSettings; IntelliTool* Tool; - IntelliColorPicker colorPicker; + IntelliPhotoGui* DumpyGui; std::vector layerBundle; int activeLayer=-1; diff --git a/src/Tool/IntelliTool.cpp b/src/Tool/IntelliTool.cpp index fce3ff5..e75abdb 100644 --- a/src/Tool/IntelliTool.cpp +++ b/src/Tool/IntelliTool.cpp @@ -1,9 +1,10 @@ #include "IntelliTool.h" #include "Layer/PaintingArea.h" -IntelliTool::IntelliTool(PaintingArea* Area, IntelliColorPicker* colorPicker){ +IntelliTool::IntelliTool(PaintingArea* Area, IntelliColorPicker* colorPicker, IntelliToolsettings* Toolsettings){ this->Area=Area; this->colorPicker=colorPicker; + this->Toolsettings=Toolsettings; } @@ -73,6 +74,7 @@ void IntelliTool::mergeToolLayer(){ activeLayer->image->imageData.setPixelColor(x, y, clr_0); } } + Area->DumpyGui->UpdateGui(); } void IntelliTool::deleteToolLayer(){ diff --git a/src/Tool/IntelliTool.h b/src/Tool/IntelliTool.h index b7d86a5..ab4028a 100644 --- a/src/Tool/IntelliTool.h +++ b/src/Tool/IntelliTool.h @@ -2,6 +2,7 @@ #define Intelli_Tool_H #include "IntelliHelper/IntelliColorPicker.h" +#include "IntelliHelper/IntelliToolsettings.h" #include struct LayerObject; @@ -49,6 +50,8 @@ Tooltype ActiveType; */ IntelliColorPicker* colorPicker; +IntelliToolsettings* Toolsettings; + /*! * \brief A pointer to the underlying active Layer, do not work on this. This is used for data grabbing or previews. */ @@ -70,7 +73,7 @@ public: * \param Area - The general PaintingArea used by the project. * \param colorPicker - The general colorPicker used by the project. */ -IntelliTool(PaintingArea* Area, IntelliColorPicker* colorPicker); +IntelliTool(PaintingArea* Area, IntelliColorPicker* colorPicker, IntelliToolsettings* Toolsettings); /*! * \brief An abstract Destructor. diff --git a/src/Tool/IntelliToolCircle.cpp b/src/Tool/IntelliToolCircle.cpp index 67a7e16..6d22618 100644 --- a/src/Tool/IntelliToolCircle.cpp +++ b/src/Tool/IntelliToolCircle.cpp @@ -3,10 +3,8 @@ #include "QInputDialog" #include -IntelliToolCircle::IntelliToolCircle(PaintingArea* Area, IntelliColorPicker* colorPicker) - : IntelliTool(Area, colorPicker){ - this->innerAlpha = QInputDialog::getInt(nullptr,"Inner Alpha Value", "Value:", 0,0,255,1); - this->borderWidth = QInputDialog::getInt(nullptr,"Outer edge width", "Value:", 0,1,255,1); +IntelliToolCircle::IntelliToolCircle(PaintingArea* Area, IntelliColorPicker* colorPicker, IntelliToolsettings* Toolsettings) + : IntelliTool(Area, colorPicker, Toolsettings){ this->ActiveType = Tooltype::CIRCLE; } @@ -17,7 +15,7 @@ IntelliToolCircle::~IntelliToolCircle(){ void IntelliToolCircle::drawCircle(int radius){ int outer = radius+20; QColor inner = this->colorPicker->getSecondColor(); - inner.setAlpha(innerAlpha); + inner.setAlpha(Toolsettings->getInnerAlpha()); int yMin, yMax, xMin, xMax; yMin = centerPoint.y()-radius; yMax = centerPoint.y()+radius; @@ -29,14 +27,14 @@ void IntelliToolCircle::drawCircle(int radius){ } //TODO implement circle drawing algorithm bresenham - radius = static_cast(radius +(this->borderWidth/2.)-1.); + radius = static_cast(radius +(Toolsettings->getLineWidth()/2.)-1.); yMin = (centerPoint.y()-radius); yMax = (centerPoint.y()+radius); for(int i=yMin; i<=yMax; i++) { xMin = static_cast(centerPoint.x()-sqrt(pow(radius,2)-pow(i-centerPoint.y(),2))); xMax = static_cast(centerPoint.x()+sqrt(pow(radius,2)-pow(i-centerPoint.y(),2))); - this->Canvas->image->drawPoint(QPoint(xMin,i), colorPicker->getFirstColor(),borderWidth); - this->Canvas->image->drawPoint(QPoint(xMax,i), colorPicker->getFirstColor(),borderWidth); + this->Canvas->image->drawPoint(QPoint(xMin,i), colorPicker->getFirstColor(),Toolsettings->getLineWidth()); + this->Canvas->image->drawPoint(QPoint(xMax,i), colorPicker->getFirstColor(),Toolsettings->getLineWidth()); } xMin = (centerPoint.x()-radius); @@ -44,8 +42,8 @@ void IntelliToolCircle::drawCircle(int radius){ for(int i=xMin; i<=xMax; i++) { int yMin = static_cast(centerPoint.y()-sqrt(pow(radius,2)-pow(i-centerPoint.x(),2))); int yMax = static_cast(centerPoint.y()+sqrt(pow(radius,2)-pow(i-centerPoint.x(),2))); - this->Canvas->image->drawPoint(QPoint(i, yMin), colorPicker->getFirstColor(),borderWidth); - this->Canvas->image->drawPoint(QPoint(i, yMax), colorPicker->getFirstColor(),borderWidth); + this->Canvas->image->drawPoint(QPoint(i, yMin), colorPicker->getFirstColor(),Toolsettings->getLineWidth()); + this->Canvas->image->drawPoint(QPoint(i, yMax), colorPicker->getFirstColor(),Toolsettings->getLineWidth()); } } @@ -71,10 +69,7 @@ void IntelliToolCircle::onMouseLeftReleased(int x, int y){ void IntelliToolCircle::onWheelScrolled(int value){ IntelliTool::onWheelScrolled(value); - this->borderWidth+=value; - if(this->borderWidth<=0) { - this->borderWidth=1; - } + Toolsettings->setLineWidth(Toolsettings->getLineWidth()+value); } void IntelliToolCircle::onMouseMoved(int x, int y){ diff --git a/src/Tool/IntelliToolCircle.h b/src/Tool/IntelliToolCircle.h index 94f34e1..d75665d 100644 --- a/src/Tool/IntelliToolCircle.h +++ b/src/Tool/IntelliToolCircle.h @@ -19,22 +19,13 @@ void drawCircle(int radius); */ QPoint centerPoint; -/*! - * \brief The alpha value of the inner circle. - */ -int innerAlpha; - -/*! - * \brief The width of the outer circle edge. - */ -int borderWidth; public: /*! * \brief A constructor setting the general paintingArea and colorPicker. And reading in the inner alpha and edgeWidth. * \param Area - The general paintingArea used by the project. * \param colorPicker - The general colorPicker used by the project. */ -IntelliToolCircle(PaintingArea* Area, IntelliColorPicker* colorPicker); +IntelliToolCircle(PaintingArea* Area, IntelliColorPicker* colorPicker, IntelliToolsettings* Toolsettings); /*! * \brief A Destructor. diff --git a/src/Tool/IntelliToolFloodFill.cpp b/src/Tool/IntelliToolFloodFill.cpp index c91b961..ed14009 100644 --- a/src/Tool/IntelliToolFloodFill.cpp +++ b/src/Tool/IntelliToolFloodFill.cpp @@ -5,8 +5,8 @@ #include #include -IntelliToolFloodFill::IntelliToolFloodFill(PaintingArea* Area, IntelliColorPicker* colorPicker) - : IntelliTool(Area, colorPicker){ +IntelliToolFloodFill::IntelliToolFloodFill(PaintingArea* Area, IntelliColorPicker* colorPicker, IntelliToolsettings* Toolsettings) + : IntelliTool(Area, colorPicker, Toolsettings){ this->ActiveType = Tooltype::FLOODFILL; } diff --git a/src/Tool/IntelliToolFloodFill.h b/src/Tool/IntelliToolFloodFill.h index 81412ba..3e93699 100644 --- a/src/Tool/IntelliToolFloodFill.h +++ b/src/Tool/IntelliToolFloodFill.h @@ -14,7 +14,7 @@ public: * \param Area - The general paintingArea used by the project. * \param colorPicker - The general colorPicker used by the project. */ -IntelliToolFloodFill(PaintingArea* Area, IntelliColorPicker* colorPicker); +IntelliToolFloodFill(PaintingArea* Area, IntelliColorPicker* colorPicker, IntelliToolsettings* Toolsettings); /*! * \brief A Destructor. diff --git a/src/Tool/IntelliToolLine.cpp b/src/Tool/IntelliToolLine.cpp index e91af5d..0ccd9a1 100644 --- a/src/Tool/IntelliToolLine.cpp +++ b/src/Tool/IntelliToolLine.cpp @@ -3,12 +3,9 @@ #include "QColorDialog" #include "QInputDialog" -IntelliToolLine::IntelliToolLine(PaintingArea* Area, IntelliColorPicker* colorPicker) - : IntelliTool(Area, colorPicker){ - this->lineWidth = QInputDialog::getInt(nullptr,"Line Width Input", "Width",1,1,50,1); +IntelliToolLine::IntelliToolLine(PaintingArea* Area, IntelliColorPicker* colorPicker, IntelliToolsettings* Toolsettings) + : IntelliTool(Area, colorPicker, Toolsettings){ this->ActiveType = Tooltype::LINE; - //create checkbox or scroll dialog to get line style - this->lineStyle = LineStyle::SOLID_LINE; } IntelliToolLine::~IntelliToolLine(){ @@ -26,7 +23,7 @@ void IntelliToolLine::onMouseRightReleased(int x, int y){ void IntelliToolLine::onMouseLeftPressed(int x, int y){ IntelliTool::onMouseLeftPressed(x,y); this->lineStartingPoint=QPoint(x,y); - this->Canvas->image->drawPoint(lineStartingPoint, colorPicker->getFirstColor(),lineWidth); + this->Canvas->image->drawPoint(lineStartingPoint, colorPicker->getFirstColor(),Toolsettings->getLineWidth()); Canvas->image->calculateVisiblity(); } @@ -36,21 +33,18 @@ void IntelliToolLine::onMouseLeftReleased(int x, int y){ void IntelliToolLine::onWheelScrolled(int value){ IntelliTool::onWheelScrolled(value); - this->lineWidth+=value; - if(this->lineWidth<=0) { - this->lineWidth=1; - } + Toolsettings->setLineWidth(Toolsettings->getLineWidth()+value); } void IntelliToolLine::onMouseMoved(int x, int y){ if(this->isDrawing) { this->Canvas->image->drawPlain(Qt::transparent); QPoint next(x,y); - switch(lineStyle) { - case LineStyle::SOLID_LINE: - this->Canvas->image->drawLine(lineStartingPoint,next,colorPicker->getFirstColor(),lineWidth); + switch(Toolsettings->getLinestyle()) { + case IntelliToolsettings::LineStyle::SOLID_LINE: + this->Canvas->image->drawLine(lineStartingPoint,next,colorPicker->getFirstColor(),Toolsettings->getLineWidth()); break; - case LineStyle::DOTTED_LINE: + case IntelliToolsettings::LineStyle::DOTTED_LINE: QPoint p1 =lineStartingPoint.x() <= next.x() ? lineStartingPoint : next; QPoint p2 =lineStartingPoint.x() < next.x() ? next : lineStartingPoint; int m = static_cast(static_cast(p2.y()-p1.y())/static_cast(p2.x()-p1.x())+0.5f); diff --git a/src/Tool/IntelliToolLine.h b/src/Tool/IntelliToolLine.h index c134c34..1bae946 100644 --- a/src/Tool/IntelliToolLine.h +++ b/src/Tool/IntelliToolLine.h @@ -4,14 +4,6 @@ #include "QPoint" -/*! - * \brief The LineStyle enum classifing all ways of drawing a line. - */ -enum class LineStyle { - SOLID_LINE, - DOTTED_LINE -}; - /*! * \brief The IntelliToolFloodFill class represents a tool to draw a line. */ @@ -21,15 +13,6 @@ class IntelliToolLine : public IntelliTool { */ QPoint lineStartingPoint; -/*! - * \brief The width of the line to draw. - */ -int lineWidth; - -/*! - * \brief The style of the line. Apropriate to LineStyle. - */ -LineStyle lineStyle; public: /*! @@ -37,7 +20,7 @@ public: * \param Area - The general paintingArea used by the project. * \param colorPicker - The general colorPicker used by the project. */ -IntelliToolLine(PaintingArea* Area, IntelliColorPicker* colorPicker); +IntelliToolLine(PaintingArea* Area, IntelliColorPicker* colorPicker, IntelliToolsettings* Toolsettings); /*! * \brief An abstract Destructor. diff --git a/src/Tool/IntelliToolPen.cpp b/src/Tool/IntelliToolPen.cpp index 90146e0..61af1c4 100644 --- a/src/Tool/IntelliToolPen.cpp +++ b/src/Tool/IntelliToolPen.cpp @@ -4,9 +4,8 @@ #include "QColorDialog" #include "QInputDialog" -IntelliToolPen::IntelliToolPen(PaintingArea* Area, IntelliColorPicker* colorPicker) - : IntelliTool(Area, colorPicker){ - this->penWidth = QInputDialog::getInt(nullptr, "Pen width", "Width:", 1,0, 50, 1); +IntelliToolPen::IntelliToolPen(PaintingArea* Area, IntelliColorPicker* colorPicker, IntelliToolsettings* Toolsettings) + : IntelliTool(Area, colorPicker, Toolsettings){ this->ActiveType = Tooltype::PEN; } @@ -25,7 +24,7 @@ void IntelliToolPen::onMouseRightReleased(int x, int y){ void IntelliToolPen::onMouseLeftPressed(int x, int y){ IntelliTool::onMouseLeftPressed(x,y); this->previousPoint=QPoint(x,y); - this->Canvas->image->drawPoint(previousPoint, colorPicker->getFirstColor(), penWidth); + this->Canvas->image->drawPoint(previousPoint, colorPicker->getFirstColor(), Toolsettings->getLineWidth()); Canvas->image->calculateVisiblity(); } @@ -36,7 +35,7 @@ void IntelliToolPen::onMouseLeftReleased(int x, int y){ void IntelliToolPen::onMouseMoved(int x, int y){ if(this->isDrawing) { QPoint newPoint(x,y); - this->Canvas->image->drawLine(this->previousPoint, newPoint, colorPicker->getFirstColor(), penWidth); + this->Canvas->image->drawLine(this->previousPoint, newPoint, colorPicker->getFirstColor(), Toolsettings->getLineWidth()); this->previousPoint=newPoint; } IntelliTool::onMouseMoved(x,y); @@ -44,8 +43,5 @@ void IntelliToolPen::onMouseMoved(int x, int y){ void IntelliToolPen::onWheelScrolled(int value){ IntelliTool::onWheelScrolled(value); - this->penWidth+=value; - if(this->penWidth<=0) { - this->penWidth=1; - } + Toolsettings->setLineWidth(Toolsettings->getLineWidth()+value); } diff --git a/src/Tool/IntelliToolPen.h b/src/Tool/IntelliToolPen.h index 32d540a..39aab9e 100644 --- a/src/Tool/IntelliToolPen.h +++ b/src/Tool/IntelliToolPen.h @@ -9,10 +9,6 @@ * \brief The IntelliToolPen class represents a tool to draw a line. */ class IntelliToolPen : public IntelliTool { -/*! - * \brief penWidth - The width of the Pen while drawing. - */ -int penWidth; /*! * \brief point - Represents the previous point to help drawing a line. */ @@ -23,7 +19,7 @@ public: * \param Area - The general PaintingArea used by the project. * \param colorPicker - The general colorPicker used by the project. */ -IntelliToolPen(PaintingArea* Area, IntelliColorPicker* colorPicker); +IntelliToolPen(PaintingArea* Area, IntelliColorPicker* colorPicker, IntelliToolsettings* Toolsettings); /*! * \brief A Destructor. */ diff --git a/src/Tool/IntelliToolPlain.cpp b/src/Tool/IntelliToolPlain.cpp index f89e01c..51984a2 100644 --- a/src/Tool/IntelliToolPlain.cpp +++ b/src/Tool/IntelliToolPlain.cpp @@ -2,8 +2,8 @@ #include "Layer/PaintingArea.h" #include "QColorDialog" -IntelliToolPlainTool::IntelliToolPlainTool(PaintingArea* Area, IntelliColorPicker* colorPicker) - : IntelliTool(Area, colorPicker){ +IntelliToolPlainTool::IntelliToolPlainTool(PaintingArea* Area, IntelliColorPicker* colorPicker, IntelliToolsettings* Toolsettings) + : IntelliTool(Area, colorPicker, Toolsettings){ this->ActiveType = Tooltype::PLAIN; } diff --git a/src/Tool/IntelliToolPlain.h b/src/Tool/IntelliToolPlain.h index 08a79fc..c4b294c 100644 --- a/src/Tool/IntelliToolPlain.h +++ b/src/Tool/IntelliToolPlain.h @@ -13,7 +13,7 @@ public: * \param Area - The general paintingArea used by the project. * \param colorPicker - The general colorPicker used by the project. */ -IntelliToolPlainTool(PaintingArea*Area, IntelliColorPicker* colorPicker); +IntelliToolPlainTool(PaintingArea*Area, IntelliColorPicker* colorPicker, IntelliToolsettings* Toolsettings); /*! * \brief A Destructor. */ diff --git a/src/Tool/IntelliToolPolygon.cpp b/src/Tool/IntelliToolPolygon.cpp index 4eb3eb7..28dfd31 100644 --- a/src/Tool/IntelliToolPolygon.cpp +++ b/src/Tool/IntelliToolPolygon.cpp @@ -4,10 +4,8 @@ #include #include -IntelliToolPolygon::IntelliToolPolygon(PaintingArea* Area, IntelliColorPicker* colorPicker) - : IntelliTool(Area, colorPicker){ - this->innerAlpha = QInputDialog::getInt(nullptr,"Inner Alpha Value", "Value:", 255,0,255,1); - lineWidth = QInputDialog::getInt(nullptr,"Line Width Input", "Width",5,1,10,1); +IntelliToolPolygon::IntelliToolPolygon(PaintingArea* Area, IntelliColorPicker* colorPicker, IntelliToolsettings* Toolsettings) + : IntelliTool(Area, colorPicker, Toolsettings){ isPointNearStart = false; isDrawing = false; isInside = false; @@ -22,9 +20,9 @@ IntelliToolPolygon::~IntelliToolPolygon(){ void IntelliToolPolygon::onMouseLeftPressed(int x, int y){ if(!isDrawing && Area->getTypeOfImageRealLayer() == IntelliImage::ImageType::Shaped_Image && x > 0 && y > 0 && xgetWidthOfActive() && ygetHeightOfActive()){ - std::vector Triangles = IntelliHelper::calculateTriangles(Area->getPolygonDataOfRealLayer()); + std::vector Triangles = IntelliTriangulation::calculateTriangles(Area->getPolygonDataOfRealLayer()); QPoint Point(x,y); - isInside = IntelliHelper::isInPolygon(Triangles,Point); + isInside = IntelliTriangulation::isInPolygon(Triangles,Point); } else if(!isDrawing && Area->getTypeOfImageRealLayer() == IntelliImage::ImageType::Raster_Image && x > 0 && y > 0 && xgetWidthOfActive() && ygetHeightOfActive()){ isInside = true; @@ -37,13 +35,13 @@ void IntelliToolPolygon::onMouseLeftPressed(int x, int y){ isDrawing = true; QPointList.push_back(drawingPoint); - this->Canvas->image->drawPoint(QPointList.back(), colorPicker->getFirstColor(), lineWidth); + this->Canvas->image->drawPoint(QPointList.back(), colorPicker->getFirstColor(), Toolsettings->getLineWidth()); this->Canvas->image->calculateVisiblity(); } else if(isDrawing && isNearStart(x,y,QPointList.front())) { if(QPointList.size() > 2){ isPointNearStart = true; - this->Canvas->image->drawLine(QPointList.back(), QPointList.front(), colorPicker->getFirstColor(), lineWidth); + this->Canvas->image->drawLine(QPointList.back(), QPointList.front(), colorPicker->getFirstColor(), Toolsettings->getLineWidth()); this->Canvas->image->calculateVisiblity(); } else{ @@ -57,7 +55,7 @@ void IntelliToolPolygon::onMouseLeftPressed(int x, int y){ else if(isDrawing) { QPoint drawingPoint(x,y); QPointList.push_back(drawingPoint); - this->Canvas->image->drawLine(QPointList[QPointList.size() - 2], QPointList[QPointList.size() - 1], colorPicker->getFirstColor(), lineWidth); + this->Canvas->image->drawLine(QPointList[QPointList.size() - 2], QPointList[QPointList.size() - 1], colorPicker->getFirstColor(), Toolsettings->getLineWidth()); this->Canvas->image->calculateVisiblity(); } } @@ -75,21 +73,21 @@ void IntelliToolPolygon::onMouseLeftReleased(int x, int y){ isInside = false; isPointNearStart = false; isDrawing = false; - std::vector Triangles = IntelliHelper::calculateTriangles(QPointList); + std::vector Triangles = IntelliTriangulation::calculateTriangles(QPointList); QPoint Point; QColor colorTwo(colorPicker->getSecondColor()); - colorTwo.setAlpha(innerAlpha); + colorTwo.setAlpha(Toolsettings->getInnerAlpha()); for(int i = 0; i < activeLayer->width; i++) { for(int j = 0; j < activeLayer->height; j++) { Point = QPoint(i,j); - if(IntelliHelper::isInPolygon(Triangles,Point)) { + if(IntelliTriangulation::isInPolygon(Triangles,Point)) { this->Canvas->image->drawPixel(Point, colorTwo); } } } for(int i=0; i(QPointList.size()); i++) { int next = static_cast((i+static_cast(1))%static_cast(QPointList.size())); - this->Canvas->image->drawLine(QPointList[static_cast(i)], QPointList[static_cast(next)], colorPicker->getFirstColor(), lineWidth); + this->Canvas->image->drawLine(QPointList[static_cast(i)], QPointList[static_cast(next)], colorPicker->getFirstColor(), Toolsettings->getLineWidth()); } QPointList.clear(); IntelliTool::onMouseLeftReleased(x,y); @@ -103,12 +101,7 @@ void IntelliToolPolygon::onMouseRightReleased(int x, int y){ void IntelliToolPolygon::onWheelScrolled(int value){ IntelliTool::onWheelScrolled(value); if(!isDrawing) { - if(lineWidth + value < 10) { - lineWidth += value; - } - if(lineWidth < 1) { - lineWidth = 1; - } + Toolsettings->setLineWidth(Toolsettings->getLineWidth() + value); } } diff --git a/src/Tool/IntelliToolPolygon.h b/src/Tool/IntelliToolPolygon.h index baa68eb..920a556 100644 --- a/src/Tool/IntelliToolPolygon.h +++ b/src/Tool/IntelliToolPolygon.h @@ -2,7 +2,7 @@ #define INTELLITOOLPOLYGON_H #include "IntelliTool.h" -#include "IntelliHelper/IntelliHelper.h" +#include "IntelliHelper/IntelliTriangulation.h" #include #include /*! @@ -19,11 +19,6 @@ class IntelliToolPolygon : public IntelliTool */ bool isNearStart(int x, int y, QPoint Startpoint); -/*! - * \brief LineWidth of the drawing polygon. - */ -int lineWidth; - /*! * \brief IsDrawing true while drawing, else false. */ @@ -39,11 +34,6 @@ bool isInside; */ bool isPointNearStart; -/*! - * \brief The alpha value of the inner circle. - */ -int innerAlpha; - /*! * \brief QPointList list of all points of the polygon. */ @@ -54,7 +44,7 @@ public: * \param Area - The general paintingArea used by the project. * \param colorPicker - The general colorPicker used by the project. */ -IntelliToolPolygon(PaintingArea* Area, IntelliColorPicker* colorPicker); +IntelliToolPolygon(PaintingArea* Area, IntelliColorPicker* colorPicker, IntelliToolsettings* Toolsettings); /*! * \brief A Destructor. */ diff --git a/src/Tool/IntelliToolRectangle.cpp b/src/Tool/IntelliToolRectangle.cpp index 36f9ba5..e92eb10 100644 --- a/src/Tool/IntelliToolRectangle.cpp +++ b/src/Tool/IntelliToolRectangle.cpp @@ -2,10 +2,8 @@ #include "Layer/PaintingArea.h" #include "QInputDialog" -IntelliToolRectangle::IntelliToolRectangle(PaintingArea* Area, IntelliColorPicker* colorPicker) - : IntelliTool(Area, colorPicker){ - this->innerAlpha = QInputDialog::getInt(nullptr,"Inner Alpha Value", "Value:", 0,0,255,1); - this->borderWidth = QInputDialog::getInt(nullptr,"Outer edge width", "Value:", 0,1,255,1); +IntelliToolRectangle::IntelliToolRectangle(PaintingArea* Area, IntelliColorPicker* colorPicker, IntelliToolsettings* Toolsettings) + : IntelliTool(Area, colorPicker, Toolsettings){ this->ActiveType = Tooltype::RECTANGLE; } @@ -21,14 +19,14 @@ void IntelliToolRectangle::drawRectangle(QPoint otherCorner){ int yMax = std::max(originCorner.y(), otherCorner.y()); QColor clr = colorPicker->getSecondColor(); - clr.setAlpha(innerAlpha); + clr.setAlpha(Toolsettings->getInnerAlpha()); for(int y=yMin; y<=yMax; y++) { this->Canvas->image->drawLine(QPoint(xMin,y), QPoint(xMax, y), clr, 1); } - this->Canvas->image->drawLine(QPoint(xMin, yMin),QPoint(xMin, yMax), this->colorPicker->getFirstColor(), borderWidth); - this->Canvas->image->drawLine(QPoint(xMin, yMin),QPoint(xMax, yMin), this->colorPicker->getFirstColor(), borderWidth); - this->Canvas->image->drawLine(QPoint(xMax, yMax),QPoint(xMin, yMax), this->colorPicker->getFirstColor(), borderWidth); - this->Canvas->image->drawLine(QPoint(xMax, yMax),QPoint(xMax, yMin), this->colorPicker->getFirstColor(), borderWidth); + this->Canvas->image->drawLine(QPoint(xMin, yMin),QPoint(xMin, yMax), this->colorPicker->getFirstColor(), Toolsettings->getLineWidth()); + this->Canvas->image->drawLine(QPoint(xMin, yMin),QPoint(xMax, yMin), this->colorPicker->getFirstColor(), Toolsettings->getLineWidth()); + this->Canvas->image->drawLine(QPoint(xMax, yMax),QPoint(xMin, yMax), this->colorPicker->getFirstColor(), Toolsettings->getLineWidth()); + this->Canvas->image->drawLine(QPoint(xMax, yMax),QPoint(xMax, yMin), this->colorPicker->getFirstColor(), Toolsettings->getLineWidth()); } void IntelliToolRectangle::onMouseRightPressed(int x, int y){ @@ -61,8 +59,5 @@ void IntelliToolRectangle::onMouseMoved(int x, int y){ void IntelliToolRectangle::onWheelScrolled(int value){ IntelliTool::onWheelScrolled(value); - this->borderWidth+=value; - if(this->borderWidth<=0) { - this->borderWidth=1; - } + Toolsettings->setLineWidth(Toolsettings->getLineWidth()+value); } diff --git a/src/Tool/IntelliToolRectangle.h b/src/Tool/IntelliToolRectangle.h index 31d9edd..041e860 100644 --- a/src/Tool/IntelliToolRectangle.h +++ b/src/Tool/IntelliToolRectangle.h @@ -19,21 +19,13 @@ void drawRectangle(QPoint otherCorner); * \brief origincorner - The first corner point of the rectangle. */ QPoint originCorner; -/*! - * \brief alphaInner- Represents the alpha value of the inside. - */ -int innerAlpha; -/*! - * \brief edgeWidth - The width of the rectangle edges. - */ -int borderWidth; public: /*! * \brief A constructor setting the general paintingArea and colorPicker. And reading in the alphaInner and edgeWidth. * \param Area - The general paintingArea used by the project. * \param colorPicker - The general colorPicker used by the project. */ -IntelliToolRectangle(PaintingArea* Area, IntelliColorPicker* colorPicker); +IntelliToolRectangle(PaintingArea* Area, IntelliColorPicker* colorPicker, IntelliToolsettings* Toolsettings); /*! * \brief A Destructor. */ diff --git a/src/icons/Wechselpfeile.png b/src/icons/Wechselpfeile.png new file mode 100644 index 0000000..505fcdd Binary files /dev/null and b/src/icons/Wechselpfeile.png differ diff --git a/src/icons/circle-tool.svg b/src/icons/circle-tool.svg new file mode 100644 index 0000000..a6cc0e4 --- /dev/null +++ b/src/icons/circle-tool.svg @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + diff --git a/src/icons/eraser-tool.svg b/src/icons/eraser-tool.svg new file mode 100644 index 0000000..cdc518d --- /dev/null +++ b/src/icons/eraser-tool.svg @@ -0,0 +1,109 @@ + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + diff --git a/src/icons/flood-fill-tool.svg b/src/icons/flood-fill-tool.svg new file mode 100644 index 0000000..980bb7a --- /dev/null +++ b/src/icons/flood-fill-tool.svg @@ -0,0 +1,194 @@ + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + diff --git a/src/icons/icon.png b/src/icons/icon.png new file mode 100644 index 0000000..2829667 Binary files /dev/null and b/src/icons/icon.png differ diff --git a/src/icons/magic-wand-tool.svg b/src/icons/magic-wand-tool.svg new file mode 100644 index 0000000..71f019d --- /dev/null +++ b/src/icons/magic-wand-tool.svg @@ -0,0 +1,169 @@ + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + diff --git a/src/icons/pen-tool.svg b/src/icons/pen-tool.svg new file mode 100644 index 0000000..5dd9782 --- /dev/null +++ b/src/icons/pen-tool.svg @@ -0,0 +1,105 @@ + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/src/icons/polygon-tool.svg b/src/icons/polygon-tool.svg new file mode 100644 index 0000000..7602729 --- /dev/null +++ b/src/icons/polygon-tool.svg @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + diff --git a/src/icons/rectangle-tool.svg b/src/icons/rectangle-tool.svg new file mode 100644 index 0000000..3056a02 --- /dev/null +++ b/src/icons/rectangle-tool.svg @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/src/main.cpp b/src/main.cpp index bcd7ae6..30adab2 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,7 +1,6 @@ #include "GUI/IntelliPhotoGui.h" #include #include -#include "IntelliHelper/IntelliHelper.h" #include int main(int argc, char*argv[]){