From ef65bcd983707dfb6b225d443f205a9e343fda4a Mon Sep 17 00:00:00 2001 From: Jan Schuffenhauer Date: Thu, 5 Dec 2019 17:30:41 +0100 Subject: [PATCH] Muckes zeug --- IntelliPhoto/Painting/GUI/IntelliPhotoGui.cpp | 412 ++++++++++++++++++ IntelliPhoto/Painting/GUI/IntelliPhotoGui.h | 125 ++++++ IntelliPhoto/Painting/Image/IntelliImage.cpp | 81 ++++ IntelliPhoto/Painting/Image/IntelliImage.h | 46 ++ .../Painting/Image/IntelliRasterImage.cpp | 34 ++ .../Painting/Image/IntelliRasterImage.h | 21 + .../Painting/Image/IntelliShapedImage.cpp | 71 +++ .../Painting/Image/IntelliShapedImage.h | 22 + .../Painting/IntelliHelper/IntelliHelper.cpp | 39 ++ .../Painting/IntelliHelper/IntelliHelper.h | 22 + IntelliPhoto/Painting/IntelliPhoto.87de10b | 337 ++++++++++++++ IntelliPhoto/Painting/IntelliPhoto.pro | 47 ++ IntelliPhoto/Painting/IntelliPhoto.pro.user | 337 ++++++++++++++ .../Painting/IntelliPhoto.pro.user.2eff11b | 337 ++++++++++++++ .../Painting/IntelliPhoto.pro.user.426164d | 342 +++++++++++++++ .../Painting/IntelliPhoto.pro.user.87de10b | 337 ++++++++++++++ IntelliPhoto/Painting/IntelliPhoto.user | 337 ++++++++++++++ IntelliPhoto/Painting/Layer/PaintingArea.cpp | 320 ++++++++++++++ IntelliPhoto/Painting/Layer/PaintingArea.h | 110 +++++ .../Painting/Scribble.pro.user.426164d | 337 ++++++++++++++ IntelliPhoto/Painting/icon.ico | Bin 0 -> 51620 bytes IntelliPhoto/Painting/main.cpp | 20 + IntelliPhoto/Painting/widget.ui | 19 + 23 files changed, 3753 insertions(+) create mode 100644 IntelliPhoto/Painting/GUI/IntelliPhotoGui.cpp create mode 100644 IntelliPhoto/Painting/GUI/IntelliPhotoGui.h create mode 100644 IntelliPhoto/Painting/Image/IntelliImage.cpp create mode 100644 IntelliPhoto/Painting/Image/IntelliImage.h create mode 100644 IntelliPhoto/Painting/Image/IntelliRasterImage.cpp create mode 100644 IntelliPhoto/Painting/Image/IntelliRasterImage.h create mode 100644 IntelliPhoto/Painting/Image/IntelliShapedImage.cpp create mode 100644 IntelliPhoto/Painting/Image/IntelliShapedImage.h create mode 100644 IntelliPhoto/Painting/IntelliHelper/IntelliHelper.cpp create mode 100644 IntelliPhoto/Painting/IntelliHelper/IntelliHelper.h create mode 100644 IntelliPhoto/Painting/IntelliPhoto.87de10b create mode 100644 IntelliPhoto/Painting/IntelliPhoto.pro create mode 100644 IntelliPhoto/Painting/IntelliPhoto.pro.user create mode 100644 IntelliPhoto/Painting/IntelliPhoto.pro.user.2eff11b create mode 100644 IntelliPhoto/Painting/IntelliPhoto.pro.user.426164d create mode 100644 IntelliPhoto/Painting/IntelliPhoto.pro.user.87de10b create mode 100644 IntelliPhoto/Painting/IntelliPhoto.user create mode 100644 IntelliPhoto/Painting/Layer/PaintingArea.cpp create mode 100644 IntelliPhoto/Painting/Layer/PaintingArea.h create mode 100644 IntelliPhoto/Painting/Scribble.pro.user.426164d create mode 100644 IntelliPhoto/Painting/icon.ico create mode 100644 IntelliPhoto/Painting/main.cpp create mode 100644 IntelliPhoto/Painting/widget.ui diff --git a/IntelliPhoto/Painting/GUI/IntelliPhotoGui.cpp b/IntelliPhoto/Painting/GUI/IntelliPhotoGui.cpp new file mode 100644 index 0000000..097055d --- /dev/null +++ b/IntelliPhoto/Painting/GUI/IntelliPhotoGui.cpp @@ -0,0 +1,412 @@ +// ---------- IntelliPhotoGui.cpp ---------- + +#include +#include + +#include "IntelliPhotoGui.h" +#include "Layer/PaintingArea.h" + +// IntelliPhotoGui constructor +IntelliPhotoGui::IntelliPhotoGui() +{ + //create Gui elemnts and lay them out + createGui(); + // Create actions + createActions(); + //create Menus + createMenus(); + //set style of the gui + setIntelliStyle(); + + // Size the app + resize(500, 500); +} + + +// User tried to close the app +void IntelliPhotoGui::closeEvent(QCloseEvent *event) +{ + // If they try to close maybeSave() returns true + // if no changes have been made and the app closes + if (maybeSave()) { + event->accept(); + } else { + + // If there have been changes ignore the event + event->ignore(); + } +} + +// Check if the current image has been changed and then +// open a dialog to open a file +void IntelliPhotoGui::open() +{ + // Check if changes have been made since last save + // maybeSave() returns true if no changes have been made + if (maybeSave()) { + + // Get the file to open from a dialog + // tr sets the window title to Open File + // QDir opens the current dirctory + QString fileName = QFileDialog::getOpenFileName(this, + tr("Open File"), QDir::currentPath()); + + // If we have a file name load the image and place + // it in the paintingArea + if (!fileName.isEmpty()) + paintingArea->openImage(fileName); + } +} + +// Called when the user clicks Save As in the menu +void IntelliPhotoGui::save() +{ + // A QAction represents the action of the user clicking + QAction *action = qobject_cast(sender()); + + // Stores the array of bytes of the users data + QByteArray fileFormat = action->data().toByteArray(); + + // Pass it to be saved + saveFile(fileFormat); +} + +// Opens a dialog to change the pen color +void IntelliPhotoGui::penColor() +{ + // Store the chosen color from the dialog + QColor newColor = QColorDialog::getColor(paintingArea->penColor()); + + // If a valid color set it + if (newColor.isValid()) + paintingArea->setPenColor(newColor); +} + +// Opens a dialog that allows the user to change the pen width +void IntelliPhotoGui::penWidth() +{ + // Stores button value + bool ok; + + // tr("Painting") is the title + // the next tr is the text to display + // Get the current pen width + // Define the min, max, step and ok button + int newWidth = QInputDialog::getInt(this, tr("Painting"), + tr("Select pen width:"), + paintingArea->penWidth(), + 1, 500, 1, &ok); + // Change the pen width + if (ok) + paintingArea->setPenWidth(newWidth); +} + +// Open an about dialog +void IntelliPhotoGui::about() +{ + // Window title and text to display + QMessageBox::about(this, tr("About Painting"), + tr("

IntelliPhoto Some nice ass looking software

")); +} + +void IntelliPhotoGui::onSetAlpha(){ + int a = this->setAlphaEdit->text().toInt(); + emit this->sendAlpha(a); +} + +void IntelliPhotoGui::onMoveUp(){ + int a = 5; + emit this->moveUp(a); +} + +void IntelliPhotoGui::onMoveDown(){ + int a = 5; + emit this->moveDown(a); +} + +void IntelliPhotoGui::onMoveLeft(){ + int a = 5; + emit this->moveLeft(a); +} + +void IntelliPhotoGui::onMoveRight(){ + int a = 5; + emit this->moveRight(a); +} + +void IntelliPhotoGui::onMoveLayerUp(){ + emit this->moveLayerUp(); +} + +void IntelliPhotoGui::onMoveLayerDown(){ + emit this->moveLayerDown(); +} + +void IntelliPhotoGui::onClearedPressed(){ + int r = this->RedEdit->text().toInt(); + int g = this->GreenEdit->text().toInt(); + int b = this->BlueEdit->text().toInt(); + emit this->sendClearColor(r,g,b); +} + +void IntelliPhotoGui::onActivePressed(){ + int a = this->selectActiveEdit->text().toInt(); + emit this->sendActiveLayer(a); +}; + + + +// Define menu actions that call functions +void IntelliPhotoGui::createActions() +{ + //connect signal and slots of gui element + connect(this->clearButton, SIGNAL(clicked()), this, SLOT(onClearedPressed())); + connect(this, SIGNAL(sendClearColor(int,int,int)), paintingArea, SLOT(clearImage(int, int, int))); + + connect(this->selectActiveButton, SIGNAL(clicked()), this, SLOT(onActivePressed())); + connect(this, SIGNAL(sendActiveLayer(int)),paintingArea, SLOT(activate(int))); + + connect(this->setAlphaButton, SIGNAL(clicked()), this, SLOT(onSetAlpha())); + connect(this, SIGNAL(sendAlpha(int)), paintingArea, SLOT(setAlpha(int))); + + connect(this->moveActiveUpButton, SIGNAL(clicked()), this, SLOT(onMoveUp())); + connect(this, SIGNAL(moveUp(int)), paintingArea, SLOT(getMoveUp(int))); + + connect(this->moveActiveDownButton, SIGNAL(clicked()), this, SLOT(onMoveDown())); + connect(this, SIGNAL(moveDown(int)), paintingArea, SLOT(getMoveDown(int))); + + connect(this->moveActiveLeftButton, SIGNAL(clicked()), this, SLOT(onMoveLeft())); + connect(this, SIGNAL(moveLeft(int)), paintingArea, SLOT(getMoveLeft(int))); + + connect(this->moveActiveRightButton, SIGNAL(clicked()), this, SLOT(onMoveRight())); + connect(this, SIGNAL(moveRight(int)), paintingArea, SLOT(getMoveRight(int))); + + connect(this->layerMoveActiveDownButton, SIGNAL(clicked()), this, SLOT(onMoveLayerDown())); + connect(this, SIGNAL(moveLayerDown()), paintingArea, SLOT(getMoveLayerDown())); + + connect(this->layerMoveActiveUpButton, SIGNAL(clicked()), this, SLOT(onMoveLayerUp())); + connect(this, SIGNAL(moveLayerUp()), paintingArea, SLOT(getMoveLayerUp())); + + + + // Create the action tied to the menu + openAct = new QAction(tr("&Open..."), this); + + // Define the associated shortcut key + openAct->setShortcuts(QKeySequence::Open); + + // Tie the action to IntelliPhotoGui::open() + connect(openAct, SIGNAL(triggered()), this, SLOT(open())); + + // Get a list of the supported file formats + // QImageWriter is used to write images to files + foreach (QByteArray format, QImageWriter::supportedImageFormats()) { + QString text = tr("%1...").arg(QString(format).toUpper()); + + // Create an action for each file format + QAction *action = new QAction(text, this); + + // Set an action for each file format + action->setData(format); + + // When clicked call IntelliPhotoGui::save() + connect(action, SIGNAL(triggered()), this, SLOT(save())); + + // Attach each file format option menu item to Save As + saveAsActs.append(action); + } + + + // Create exit action and tie to IntelliPhotoGui::close() + exitAct = new QAction(tr("&Exit"), this); + exitAct->setShortcuts(QKeySequence::Quit); + connect(exitAct, SIGNAL(triggered()), this, SLOT(close())); + + // Create pen color action and tie to IntelliPhotoGui::penColor() + penColorAct = new QAction(tr("&Pen Color..."), this); + connect(penColorAct, SIGNAL(triggered()), this, SLOT(penColor())); + + // Create pen width action and tie to IntelliPhotoGui::penWidth() + penWidthAct = new QAction(tr("Pen &Width..."), this); + connect(penWidthAct, SIGNAL(triggered()), this, SLOT(penWidth())); + + // Create clear screen action and tie to IntelliPhotoGui::clearImage() + clearScreenAct = new QAction(tr("&Clear Screen"), this); + clearScreenAct->setShortcut(tr("Ctrl+L")); + connect(clearScreenAct, SIGNAL(triggered()), + paintingArea, SLOT(clearImage())); + + // Create about action and tie to IntelliPhotoGui::about() + aboutAct = new QAction(tr("&About"), this); + connect(aboutAct, SIGNAL(triggered()), this, SLOT(about())); + + // Create about Qt action and tie to IntelliPhotoGui::aboutQt() + aboutQtAct = new QAction(tr("About &Qt"), this); + connect(aboutQtAct, SIGNAL(triggered()), qApp, SLOT(aboutQt())); +} + +// Create the menubar +void IntelliPhotoGui::createMenus() +{ + // Create Save As option and the list of file types + saveAsMenu = new QMenu(tr("&Save As"), this); + foreach (QAction *action, saveAsActs) + saveAsMenu->addAction(action); + + + // Attach all actions to File + fileMenu = new QMenu(tr("&File"), this); + fileMenu->addAction(openAct); + fileMenu->addMenu(saveAsMenu); + fileMenu->addSeparator(); + fileMenu->addAction(exitAct); + + // Attach all actions to Options + optionMenu = new QMenu(tr("&Options"), this); + optionMenu->addAction(penColorAct); + optionMenu->addAction(penWidthAct); + optionMenu->addSeparator(); + optionMenu->addAction(clearScreenAct); + + // Attach all actions to Help + helpMenu = new QMenu(tr("&Help"), this); + helpMenu->addAction(aboutAct); + helpMenu->addAction(aboutQtAct); + + // Add menu items to the menubar + menuBar()->addMenu(fileMenu); + menuBar()->addMenu(optionMenu); + menuBar()->addMenu(helpMenu); +} + +void IntelliPhotoGui::createGui(){ + //create a central widget to work on + centralGuiWidget = new QWidget(this); + setCentralWidget(centralGuiWidget); + + //create the grid for the layout + mainLayout = new QGridLayout(centralGuiWidget); + centralGuiWidget->setLayout(mainLayout); + + //create Gui elements + clearButton = new QPushButton("set Color"); + paintingArea = new PaintingArea(); + + + RedLabel = new QLabel("Red:"); + GreenLabel = new QLabel("Green"); + BlueLabel = new QLabel("Blue:"); + RedEdit = new QLineEdit("255"); + GreenEdit = new QLineEdit("255"); + BlueEdit = new QLineEdit("255");; + RedEdit->setMaximumSize(150,20); + GreenEdit->setMaximumSize(150,20); + BlueEdit->setMaximumSize(150,20); + + selectActiveButton = new QPushButton("select Active"); + selectActiveLabel = new QLabel("Active:"); + selectActiveEdit = new QLineEdit("0"); + selectActiveLabel->setMaximumSize(150,20); + selectActiveEdit->setMaximumSize(150,20); + + setAlphaButton = new QPushButton("set Alpha"); + setAlphaLabel = new QLabel("Alpha:"); + setAlphaEdit = new QLineEdit("255"); + setAlphaEdit->setMaximumSize(150,20); + + moveActiveUpButton = new QPushButton("move 5 Up"); + moveActiveDownButton = new QPushButton("move 5 Down"); + moveActiveLeftButton = new QPushButton("move 5 Left"); + moveActiveRightButton = new QPushButton("move 5 Right"); + + layerMoveActiveDownButton = new QPushButton("Active Layer Down"); + layerMoveActiveUpButton = new QPushButton("Active Layer Up"); + + //set gui elemtns position + mainLayout->addWidget(clearButton,0,25,1,1); + mainLayout->addWidget(paintingArea,0,0,25,25); + + mainLayout->addWidget(RedLabel,1,25,1,1); + mainLayout->addWidget(RedEdit,2,25,1,1); + mainLayout->addWidget(GreenLabel,3,25,1,1); + mainLayout->addWidget(GreenEdit,4,25,1,1); + mainLayout->addWidget(BlueLabel,5,25,1,1); + mainLayout->addWidget(BlueEdit,6,25,1,1); + + mainLayout->addWidget(selectActiveButton,7,25,1,1); + mainLayout->addWidget(selectActiveLabel,8,25,1,1); + mainLayout->addWidget(selectActiveEdit,9,25,1,1); + + mainLayout->addWidget(setAlphaButton,10,25,1,1); + mainLayout->addWidget(setAlphaLabel,11,25,1,1); + mainLayout->addWidget(setAlphaEdit,12,25,1,1); + + mainLayout->addWidget(moveActiveUpButton,13,25,1,1); + mainLayout->addWidget(moveActiveDownButton,14,25,1,1); + mainLayout->addWidget(moveActiveLeftButton,15,25,1,1); + mainLayout->addWidget(moveActiveRightButton,16,25,1,1); + + mainLayout->addWidget(layerMoveActiveDownButton,17,25,1,1); + mainLayout->addWidget(layerMoveActiveUpButton,18,25,1,1); + + +} + +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->menuBar()->setStyleSheet("color:rgb(255,255,255)"); +} + +bool IntelliPhotoGui::maybeSave() +{ + // Check for changes since last save + if (paintingArea->isModified()) { + QMessageBox::StandardButton ret; + + // Painting is the title + // Add text and the buttons + ret = QMessageBox::warning(this, tr("Painting"), + tr("The image has been modified.\n" + "Do you want to save your changes?"), + QMessageBox::Save | QMessageBox::Discard + | QMessageBox::Cancel); + + // If save button clicked call for file to be saved + if (ret == QMessageBox::Save) { + return saveFile("png"); + + // If cancel do nothing + } else if (ret == QMessageBox::Cancel) { + return false; + } + } + return true; +} + +bool IntelliPhotoGui::saveFile(const QByteArray &fileFormat) +{ + // Define path, name and default file type + QString initialPath = QDir::currentPath() + "/untitled." + fileFormat; + + // Get selected file from dialog + // Add the proper file formats and extensions + QString fileName = QFileDialog::getSaveFileName(this, tr("Save As"), + initialPath, + tr("%1 Files (*.%2);;All Files (*)") + .arg(QString::fromLatin1(fileFormat.toUpper())) + .arg(QString::fromLatin1(fileFormat))); + + // If no file do nothing + if (fileName.isEmpty()) { + return false; + } else { + + // Call for the file to be saved + return paintingArea->saveImage(fileName, fileFormat.constData()); + } +} + diff --git a/IntelliPhoto/Painting/GUI/IntelliPhotoGui.h b/IntelliPhoto/Painting/GUI/IntelliPhotoGui.h new file mode 100644 index 0000000..79f2cf9 --- /dev/null +++ b/IntelliPhoto/Painting/GUI/IntelliPhotoGui.h @@ -0,0 +1,125 @@ +#ifndef IntelliPhotoGui_H +#define IntelliPhotoGui_H + +#include +#include +#include +#include +#include +#include +#include + +// PaintingArea used to paint the image +class PaintingArea; + +class IntelliPhotoGui : public QMainWindow +{ + // Declares our class as a QObject which is the base class + // for all Qt objects + // QObjects handle events + Q_OBJECT +signals: + void sendClearColor(int r, int g, int b); + void sendActiveLayer(int a); + void sendAlpha(int a); + void moveUp(int a); + void moveDown(int a); + void moveRight(int a); + void moveLeft(int a); + void moveLayerUp(); + void moveLayerDown(); + +public: + IntelliPhotoGui(); +protected: + // Function used to close an event + void closeEvent(QCloseEvent *event) override; + +// The events that can be triggered +private slots: + void open(); + void save(); + void penColor(); + void penWidth(); + void about(); + + void onClearedPressed(); + void onActivePressed(); + void onSetAlpha(); + void onMoveUp(); + void onMoveDown(); + void onMoveLeft(); + void onMoveRight(); + void onMoveLayerUp(); + void onMoveLayerDown(); + +private: + // Will tie user actions to functions + void createActions(); + void createMenus(); + + //setup GUI elements + void createGui(); + + //set style of the GUI + void setIntelliStyle(); + + // Will check if changes have occurred since last save + bool maybeSave(); + + // Opens the Save dialog and saves + bool saveFile(const QByteArray &fileFormat); + + // What we'll draw on + PaintingArea *paintingArea; + + // The menu widgets + QMenu *saveAsMenu; + QMenu *fileMenu; + QMenu *optionMenu; + QMenu *helpMenu; + + + // All the actions that can occur + QAction *openAct; + + // Actions tied to specific file formats + QList saveAsActs; + QAction *exitAct; + QAction *penColorAct; + QAction *penWidthAct; + QAction *clearScreenAct; + QAction *aboutAct; + QAction *aboutQtAct; + + //main GUI elements + QWidget* centralGuiWidget; + QGridLayout *mainLayout; + QPushButton *clearButton; + + QLabel *RedLabel; + QLabel *GreenLabel; + QLabel *BlueLabel; + QLineEdit *RedEdit; + QLineEdit *GreenEdit; + QLineEdit *BlueEdit; + + QPushButton *selectActiveButton; + QLabel *selectActiveLabel; + QLineEdit *selectActiveEdit; + + QPushButton *setAlphaButton; + QLabel *setAlphaLabel; + QLineEdit *setAlphaEdit; + + QPushButton *moveActiveUpButton; + QPushButton *moveActiveDownButton; + QPushButton *moveActiveLeftButton; + QPushButton *moveActiveRightButton; + + QPushButton *layerMoveActiveDownButton; + QPushButton *layerMoveActiveUpButton; + +}; + +#endif diff --git a/IntelliPhoto/Painting/Image/IntelliImage.cpp b/IntelliPhoto/Painting/Image/IntelliImage.cpp new file mode 100644 index 0000000..879e8c7 --- /dev/null +++ b/IntelliPhoto/Painting/Image/IntelliImage.cpp @@ -0,0 +1,81 @@ +#include"Image/IntelliImage.h" +#include +#include + +IntelliImage::IntelliImage(int weight, int height) + :imageData(QSize(weight, height), QImage::Format_ARGB32){ + imageData.fill(QColor(255,255,255,255)); +} + +IntelliImage::~IntelliImage(){ + +} + +bool IntelliImage::loadImage(const QString &fileName){ + // Holds the image + QImage loadedImage; + + // If the image wasn't loaded leave this function + if (!loadedImage.load(fileName)) + return false; + + // scaled Image to size of Layer + // loadedImage = loadedImage.scaled(imageData.size(),Qt::IgnoreAspectRatio); + + imageData = loadedImage.convertToFormat(QImage::Format_ARGB32); + return true; +} + +void IntelliImage::resizeImage(QImage *image, const QSize &newSize){ + // Check if we need to redraw the image + if (image->size() == newSize) + return; + + // Create a new image to display and fill it with white + QImage newImage(newSize, QImage::Format_ARGB32); + newImage.fill(qRgb(255, 255, 255)); + + // Draw the image + QPainter painter(&newImage); + painter.drawImage(QPoint(0, 0), *image); + *image = newImage; +} + +void IntelliImage::drawPixel(const QPoint &p1, const QColor& color){ + // Used to draw on the widget + QPainter painter(&imageData); + + // Set the current settings for the pen + painter.setPen(QPen(color, 1, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin)); + + // Draw a line from the last registered point to the current + painter.drawPoint(p1); + + // Call to update the rectangular space where we drew + //update(QRect(p1, p2)); +} + +void IntelliImage::drawLine(const QPoint &p1, const QPoint& p2, const QColor& color, const int& penWidth){ + // Used to draw on the widget + QPainter painter(&imageData); + + // Set the current settings for the pen + painter.setPen(QPen(color, penWidth, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin)); + + // Draw a line from the last registered point to the current + painter.drawLine(p1, p2); + +} + +void IntelliImage::floodFill(const QColor& color){ + imageData.fill(color); + +} + +int IntelliImage::x(){ + return imageData.size().width(); +} + +int IntelliImage::y(){ + return imageData.size().height(); +} diff --git a/IntelliPhoto/Painting/Image/IntelliImage.h b/IntelliPhoto/Painting/Image/IntelliImage.h new file mode 100644 index 0000000..a2fb3c0 --- /dev/null +++ b/IntelliPhoto/Painting/Image/IntelliImage.h @@ -0,0 +1,46 @@ +#ifndef INTELLIIMAGE_H +#define INTELLIIMAGE_H + +#include +#include +#include +#include +#include +#include + +enum class ImageType{ + Raster_Image, + Shaped_Image +}; + +class IntelliImage{ + +protected: + void resizeImage(QImage *image, const QSize &newSize); + + QImage imageData; +public: + IntelliImage(int weight, int height); + virtual ~IntelliImage() = 0; + + //start on top left + virtual void drawPixel(const QPoint &p1, const QColor& color); + virtual void drawLine(const QPoint &p1, const QPoint& p2, const QColor& color, const int& penWidth); + virtual void floodFill(const QColor& color); + + //returns the filtered output + virtual QImage getDisplayable(const QSize& displaySize, int alpha)=0; + virtual QImage getDisplayable(int alpha=255)=0; + + //returns the filtered output + + //sets the data for the visible image + virtual void setPolygon(const std::vector& polygonData)=0; + + virtual bool loadImage(const QString &fileName); + + int x(); + int y(); +}; + +#endif diff --git a/IntelliPhoto/Painting/Image/IntelliRasterImage.cpp b/IntelliPhoto/Painting/Image/IntelliRasterImage.cpp new file mode 100644 index 0000000..b73c264 --- /dev/null +++ b/IntelliPhoto/Painting/Image/IntelliRasterImage.cpp @@ -0,0 +1,34 @@ +#include"Image/IntelliRasterImage.h" +#include +#include +#include + +IntelliRasterImage::IntelliRasterImage(int weight, int height) + :IntelliImage(weight, height){ + +} + +IntelliRasterImage::~IntelliRasterImage(){ + +} + +QImage IntelliRasterImage::getDisplayable(int alpha){ + return getDisplayable(imageData.size(), alpha); +} + +QImage IntelliRasterImage::getDisplayable(const QSize& displaySize, int alpha){ + QImage copy = imageData; + for(int y = 0; y& polygonData){ + qDebug() << "Raster Image has no polygon data " << polygonData.size() <<"\n"; + return; +} diff --git a/IntelliPhoto/Painting/Image/IntelliRasterImage.h b/IntelliPhoto/Painting/Image/IntelliRasterImage.h new file mode 100644 index 0000000..3b3e600 --- /dev/null +++ b/IntelliPhoto/Painting/Image/IntelliRasterImage.h @@ -0,0 +1,21 @@ +#ifndef INTELLIRASTER_H +#define INTELLIRASTER_H + +#include"Image/IntelliImage.h" + +class IntelliRasterImage : public IntelliImage{ + +public: + IntelliRasterImage(int weight, int height); + virtual ~IntelliRasterImage() override; + + //returns the filtered output + virtual QImage getDisplayable(const QSize& displaySize,int alpha) override; + virtual QImage getDisplayable(int alpha=255) override; + + + //sets the data for the visible image + virtual void setPolygon(const std::vector& polygonData) override; +}; + +#endif diff --git a/IntelliPhoto/Painting/Image/IntelliShapedImage.cpp b/IntelliPhoto/Painting/Image/IntelliShapedImage.cpp new file mode 100644 index 0000000..6b7a829 --- /dev/null +++ b/IntelliPhoto/Painting/Image/IntelliShapedImage.cpp @@ -0,0 +1,71 @@ +#include"Image/IntelliShapedImage.h" +#include"IntelliHelper/IntelliHelper.h" +#include +#include +#include + +IntelliShapedImage::IntelliShapedImage(int weight, int height) + :IntelliImage(weight, height){ +} + +IntelliShapedImage::~IntelliShapedImage(){ + +} + +QImage IntelliShapedImage::getDisplayable(int alpha){ + return getDisplayable(imageData.size()); +} + +QImage IntelliShapedImage::getDisplayable(const QSize& displaySize, int alpha){ + if(polygonData.size()==0){ + QImage copy = imageData; + for(int y = 0; y not in Polygon + if(!(cutNumberX&1)){ + QColor tmpColor(0,0,0); + tmpColor.setAlpha(0); + copy.setPixelColor(startPoint,tmpColor); + }else{ + QColor clr = copy.pixelColor(x,y); + clr.setAlpha(alpha); + copy.setPixelColor(x,y,clr); + } + } + } + + return copy.scaled(displaySize,Qt::IgnoreAspectRatio); +} + +void IntelliShapedImage::setPolygon(const std::vector& polygonData){ + if(polygonData.size()<3){ + return; + } + for(auto element:polygonData){ + this->polygonData.push_back(QPoint(element.x(), element.y())); + } + return; +} diff --git a/IntelliPhoto/Painting/Image/IntelliShapedImage.h b/IntelliPhoto/Painting/Image/IntelliShapedImage.h new file mode 100644 index 0000000..6c38366 --- /dev/null +++ b/IntelliPhoto/Painting/Image/IntelliShapedImage.h @@ -0,0 +1,22 @@ +#ifndef INTELLISHAPE_H +#define INTELLISHAPE_H + +#include"Image/IntelliImage.h" + +class IntelliShapedImage : public IntelliImage{ + +protected: + std::vector polygonData; +public: + IntelliShapedImage(int weight, int height); + virtual ~IntelliShapedImage() override; + + //returns the filtered output + virtual QImage getDisplayable(const QSize& displaySize, int alpha=255) override; + virtual QImage getDisplayable(int alpha=255) override; + + //sets the data for the visible image + virtual void setPolygon(const std::vector& polygonData) override; +}; + +#endif diff --git a/IntelliPhoto/Painting/IntelliHelper/IntelliHelper.cpp b/IntelliPhoto/Painting/IntelliHelper/IntelliHelper.cpp new file mode 100644 index 0000000..ef0e8fb --- /dev/null +++ b/IntelliPhoto/Painting/IntelliHelper/IntelliHelper.cpp @@ -0,0 +1,39 @@ +#include"IntelliHelper.h" +#include + +int IntelliHelper::orientation(QPoint& p, QPoint& q, QPoint& r){ + int value = (q.y()-p.y())*(r.x()-q.x())- + (q.x()-p.x())*(r.y()-q.y()); + if(value==0) return 0; + return (value>0)?1:2; +} + +bool IntelliHelper::onSegment(QPoint& p1, QPoint& q, QPoint& p2){ + return (q.x() >= std::min(p1.x(),p2.x()) && q.x() <= std::max(p1.x(), p2.x()) && + q.y() >= std::min(p1.y(),p2.y()) && q.y() <= std::max(p1.y(), p2.y())); +} + +bool IntelliHelper::hasIntersection(QPoint& p1, QPoint& q1, QPoint& p2, QPoint& q2){ + int o1 = IntelliHelper::orientation(p1,q1,p2); + int o2 = IntelliHelper::orientation(p1,q1,q2); + int o3 = IntelliHelper::orientation(p2,q2,p1); + int o4 = IntelliHelper::orientation(p2,q2,q1); + + // General case + if (o1 != o2 && o3 != o4) + return true; + + // p1, q1 and p2 are colinear and p2 lies on segment p1q1 + if (o1 == 0 && onSegment(p1, p2, q1)) return true; + + // p1, q1 and q2 are colinear and q2 lies on segment p1q1 + if (o2 == 0 && onSegment(p1, q2, q1)) return true; + + // p2, q2 and p1 are colinear and p1 lies on segment p2q2 + if (o3 == 0 && onSegment(p2, p1, q2)) return true; + + // p2, q2 and q1 are colinear and q1 lies on segment p2q2 + if (o4 == 0 && onSegment(p2, q1, q2)) return true; + + return false; // Doesn't fall in any of the above cases +} diff --git a/IntelliPhoto/Painting/IntelliHelper/IntelliHelper.h b/IntelliPhoto/Painting/IntelliHelper/IntelliHelper.h new file mode 100644 index 0000000..9e273f6 --- /dev/null +++ b/IntelliPhoto/Painting/IntelliHelper/IntelliHelper.h @@ -0,0 +1,22 @@ +#ifndef INTELLIHELPER_H +#define INTELLIHELPER_H + +#include + + +class IntelliHelper{ +public: + //checks for orientation: + // 0 - colinear + // 1 - clockwise + // 2 - counter clockwise + static int orientation(QPoint& p1, QPoint& p2, QPoint& p3); + + //checks if q is on segment p1-p2 + static bool onSegment(QPoint& p1, QPoint& q, QPoint& p2); + + //cheks if p1-q1 intersects with p2-q2 + static bool hasIntersection(QPoint& p1, QPoint& q1, QPoint& p2, QPoint& q2); +}; + +#endif diff --git a/IntelliPhoto/Painting/IntelliPhoto.87de10b b/IntelliPhoto/Painting/IntelliPhoto.87de10b new file mode 100644 index 0000000..934c6c1 --- /dev/null +++ b/IntelliPhoto/Painting/IntelliPhoto.87de10b @@ -0,0 +1,337 @@ + + + + + + EnvironmentId + {87de10b7-9dd6-4379-8674-fd04613e186e} + + + ProjectExplorer.Project.ActiveTarget + 0 + + + ProjectExplorer.Project.EditorSettings + + true + false + true + + Cpp + + CppGlobal + + + + QmlJS + + QmlJSGlobal + + + 2 + UTF-8 + false + 4 + false + 80 + true + true + 1 + true + false + 0 + true + true + 0 + 8 + true + 1 + true + true + true + false + + + + ProjectExplorer.Project.PluginSettings + + + -fno-delayed-template-parsing + + true + + + + ProjectExplorer.Project.Target.0 + + Desktop Qt 5.12.5 MinGW 64-bit + Desktop Qt 5.12.5 MinGW 64-bit + qt.qt5.5125.win64_mingw73_kit + 0 + 0 + 0 + + C:/Users/Jonas/Documents/QML/build-Scribble-Desktop_Qt_5_12_5_MinGW_64_bit-Debug + + + true + qmake + + QtProjectManager.QMakeBuildStep + true + + false + false + false + + + true + Make + + Qt4ProjectManager.MakeStep + + false + + + false + + 2 + Erstellen + + ProjectExplorer.BuildSteps.Build + + + + true + Make + + Qt4ProjectManager.MakeStep + + true + clean + + false + + 1 + Bereinigen + + ProjectExplorer.BuildSteps.Clean + + 2 + false + + Debug + Debug + Qt4ProjectManager.Qt4BuildConfiguration + 2 + true + + + C:/Users/Jonas/Documents/QML/build-Scribble-Desktop_Qt_5_12_5_MinGW_64_bit-Release + + + true + qmake + + QtProjectManager.QMakeBuildStep + false + + false + false + true + + + true + Make + + Qt4ProjectManager.MakeStep + + false + + + false + + 2 + Erstellen + + ProjectExplorer.BuildSteps.Build + + + + true + Make + + Qt4ProjectManager.MakeStep + + true + clean + + false + + 1 + Bereinigen + + ProjectExplorer.BuildSteps.Clean + + 2 + false + + Release + Release + Qt4ProjectManager.Qt4BuildConfiguration + 0 + true + + + C:/Users/Jonas/Documents/QML/build-Scribble-Desktop_Qt_5_12_5_MinGW_64_bit-Profile + + + true + qmake + + QtProjectManager.QMakeBuildStep + true + + false + true + true + + + true + Make + + Qt4ProjectManager.MakeStep + + false + + + false + + 2 + Erstellen + + ProjectExplorer.BuildSteps.Build + + + + true + Make + + Qt4ProjectManager.MakeStep + + true + clean + + false + + 1 + Bereinigen + + ProjectExplorer.BuildSteps.Clean + + 2 + false + + Profile + Profile + Qt4ProjectManager.Qt4BuildConfiguration + 0 + true + + 3 + + + 0 + Deployment + + ProjectExplorer.BuildSteps.Deploy + + 1 + Deployment-Konfiguration + + ProjectExplorer.DefaultDeployConfiguration + + 1 + + + dwarf + + cpu-cycles + + + 250 + -F + true + 4096 + false + false + 1000 + + true + + false + false + false + false + true + 0.01 + 10 + true + kcachegrind + 1 + 25 + + 1 + true + false + true + valgrind + + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + + 2 + + Scribble + + Qt4ProjectManager.Qt4RunConfiguration:C:/Users/Jonas/Documents/QML/Scribble/Scribble.pro + + 3768 + false + true + true + false + false + true + + C:/Users/Jonas/Documents/QML/build-Scribble-Desktop_Qt_5_12_5_MinGW_64_bit-Debug + + 1 + + + + ProjectExplorer.Project.TargetCount + 1 + + + ProjectExplorer.Project.Updater.FileVersion + 22 + + + Version + 22 + + diff --git a/IntelliPhoto/Painting/IntelliPhoto.pro b/IntelliPhoto/Painting/IntelliPhoto.pro new file mode 100644 index 0000000..3d35323 --- /dev/null +++ b/IntelliPhoto/Painting/IntelliPhoto.pro @@ -0,0 +1,47 @@ +QT += core gui + +greaterThan(QT_MAJOR_VERSION, 4): QT += widgets + +CONFIG += c++11 + +# The following define makes your compiler emit warnings if you use +# any Qt feature that has been marked deprecated (the exact warnings +# depend on your compiler). Please consult the documentation of the +# deprecated API in order to know how to port your code away from it. +DEFINES += QT_DEPRECATED_WARNINGS + +# You can also make your code fail to compile if it uses deprecated APIs. +# In order to do so, uncomment the following line. +# You can also select to disable deprecated APIs only up to a certain version of Qt. +#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 + +SOURCES += \ + GUI/IntelliPhotoGui.cpp \ + Image/IntelliImage.cpp \ + Image/IntelliRasterImage.cpp \ + Image/IntelliShapedImage.cpp \ + IntelliHelper/IntelliHelper.cpp \ + Layer/PaintingArea.cpp \ + main.cpp + +HEADERS += \ + GUI/IntelliPhotoGui.h \ + Image/IntelliImage.h \ + Image/IntelliRasterImage.h \ + Image/IntelliShapedImage.h \ + IntelliHelper/IntelliHelper.h \ + Layer/PaintingArea.h + +FORMS += \ + widget.ui + + +QMAKE_CXXFLAGS += -fopenmp +QMAKE_LFLAGS += -fopenmp + +RC_ICONS = icon.ico + +# Default rules for deployment. +qnx: target.path = /tmp/$${TARGET}/bin +else: unix:!android: target.path = /opt/$${TARGET}/bin +!isEmpty(target.path): INSTALLS += target diff --git a/IntelliPhoto/Painting/IntelliPhoto.pro.user b/IntelliPhoto/Painting/IntelliPhoto.pro.user new file mode 100644 index 0000000..17ebfb2 --- /dev/null +++ b/IntelliPhoto/Painting/IntelliPhoto.pro.user @@ -0,0 +1,337 @@ + + + + + + EnvironmentId + {d22feba4-9460-41e9-9ac3-cddcd407714c} + + + ProjectExplorer.Project.ActiveTarget + 0 + + + ProjectExplorer.Project.EditorSettings + + true + false + true + + Cpp + + CppGlobal + + + + QmlJS + + QmlJSGlobal + + + 2 + UTF-8 + false + 4 + false + 80 + true + true + 1 + true + false + 0 + true + true + 0 + 8 + true + 1 + true + true + true + false + + + + ProjectExplorer.Project.PluginSettings + + + -fno-delayed-template-parsing + + true + + + + ProjectExplorer.Project.Target.0 + + Desktop (x86-windows-msvc2017-pe-64bit) + Desktop (x86-windows-msvc2017-pe-64bit) + {39c3549a-728d-484f-a9ec-e2904e3853e7} + 0 + 0 + 0 + + Z:/Uni/ws 19_20/mathe/intelliphoto/IntelliPhoto/build-IntelliPhoto-Desktop_x86_windows_msvc2017_pe_64bit-Debug + + + true + qmake + + QtProjectManager.QMakeBuildStep + true + + false + false + false + + + true + Make + + Qt4ProjectManager.MakeStep + + false + + + false + + 2 + Erstellen + + ProjectExplorer.BuildSteps.Build + + + + true + Make + + Qt4ProjectManager.MakeStep + + true + clean + + false + + 1 + Bereinigen + + ProjectExplorer.BuildSteps.Clean + + 2 + false + + Debug + Debug + Qt4ProjectManager.Qt4BuildConfiguration + 2 + true + + + Z:/Uni/ws 19_20/mathe/intelliphoto/IntelliPhoto/build-IntelliPhoto-Desktop_x86_windows_msvc2017_pe_64bit-Release + + + true + qmake + + QtProjectManager.QMakeBuildStep + false + + false + false + true + + + true + Make + + Qt4ProjectManager.MakeStep + + false + + + false + + 2 + Erstellen + + ProjectExplorer.BuildSteps.Build + + + + true + Make + + Qt4ProjectManager.MakeStep + + true + clean + + false + + 1 + Bereinigen + + ProjectExplorer.BuildSteps.Clean + + 2 + false + + Release + Release + Qt4ProjectManager.Qt4BuildConfiguration + 0 + true + + + Z:/Uni/ws 19_20/mathe/intelliphoto/IntelliPhoto/build-IntelliPhoto-Desktop_x86_windows_msvc2017_pe_64bit-Profile + + + true + qmake + + QtProjectManager.QMakeBuildStep + true + + false + true + true + + + true + Make + + Qt4ProjectManager.MakeStep + + false + + + false + + 2 + Erstellen + + ProjectExplorer.BuildSteps.Build + + + + true + Make + + Qt4ProjectManager.MakeStep + + true + clean + + false + + 1 + Bereinigen + + ProjectExplorer.BuildSteps.Clean + + 2 + false + + Profile + Profile + Qt4ProjectManager.Qt4BuildConfiguration + 0 + true + + 3 + + + 0 + Deployment + + ProjectExplorer.BuildSteps.Deploy + + 1 + Deployment-Konfiguration + + ProjectExplorer.DefaultDeployConfiguration + + 1 + + + dwarf + + cpu-cycles + + + 250 + -F + true + 4096 + false + false + 1000 + + true + + false + false + false + false + true + 0.01 + 10 + true + kcachegrind + 1 + 25 + + 1 + true + false + true + valgrind + + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + + 2 + + IntelliPhoto + + Qt4ProjectManager.Qt4RunConfiguration:Z:/Uni/ws 19_20/mathe/intelliphoto/IntelliPhoto/Painting/IntelliPhoto.pro + + 3768 + false + true + true + false + false + true + + Z:/Uni/ws 19_20/mathe/intelliphoto/IntelliPhoto/build-IntelliPhoto-Desktop_x86_windows_msvc2017_pe_64bit-Debug + + 1 + + + + ProjectExplorer.Project.TargetCount + 1 + + + ProjectExplorer.Project.Updater.FileVersion + 22 + + + Version + 22 + + diff --git a/IntelliPhoto/Painting/IntelliPhoto.pro.user.2eff11b b/IntelliPhoto/Painting/IntelliPhoto.pro.user.2eff11b new file mode 100644 index 0000000..06819e8 --- /dev/null +++ b/IntelliPhoto/Painting/IntelliPhoto.pro.user.2eff11b @@ -0,0 +1,337 @@ + + + + + + EnvironmentId + {2eff11b9-2504-4003-b4ce-30c119b76df9} + + + ProjectExplorer.Project.ActiveTarget + 0 + + + ProjectExplorer.Project.EditorSettings + + true + false + true + + Cpp + + CppGlobal + + + + QmlJS + + QmlJSGlobal + + + 2 + UTF-8 + false + 4 + false + 80 + true + true + 1 + true + false + 0 + true + true + 0 + 8 + true + 1 + true + true + true + false + + + + ProjectExplorer.Project.PluginSettings + + + -fno-delayed-template-parsing + + true + + + + ProjectExplorer.Project.Target.0 + + Desktop Qt 5.12.5 MSVC2017 64bit + Desktop Qt 5.12.5 MSVC2017 64bit + qt.qt5.5125.win64_msvc2017_64_kit + 0 + 0 + 0 + + C:/Users/Basti/OneDrive/Documents/Uni/Softwaretechnologie/IntelliPhoto/build-IntelliPhoto-Desktop_Qt_5_12_5_MSVC2017_64bit-Debug + + + true + qmake + + QtProjectManager.QMakeBuildStep + true + + false + false + false + + + true + Make + + Qt4ProjectManager.MakeStep + + false + + + false + + 2 + Erstellen + + ProjectExplorer.BuildSteps.Build + + + + true + Make + + Qt4ProjectManager.MakeStep + + true + clean + + false + + 1 + Bereinigen + + ProjectExplorer.BuildSteps.Clean + + 2 + false + + Debug + Debug + Qt4ProjectManager.Qt4BuildConfiguration + 2 + true + + + C:/Users/Basti/OneDrive/Documents/Uni/Softwaretechnologie/IntelliPhoto/build-IntelliPhoto-Desktop_Qt_5_12_5_MSVC2017_64bit-Release + + + true + qmake + + QtProjectManager.QMakeBuildStep + false + + false + false + true + + + true + Make + + Qt4ProjectManager.MakeStep + + false + + + false + + 2 + Erstellen + + ProjectExplorer.BuildSteps.Build + + + + true + Make + + Qt4ProjectManager.MakeStep + + true + clean + + false + + 1 + Bereinigen + + ProjectExplorer.BuildSteps.Clean + + 2 + false + + Release + Release + Qt4ProjectManager.Qt4BuildConfiguration + 0 + true + + + C:/Users/Basti/OneDrive/Documents/Uni/Softwaretechnologie/IntelliPhoto/build-IntelliPhoto-Desktop_Qt_5_12_5_MSVC2017_64bit-Profile + + + true + qmake + + QtProjectManager.QMakeBuildStep + true + + false + true + true + + + true + Make + + Qt4ProjectManager.MakeStep + + false + + + false + + 2 + Erstellen + + ProjectExplorer.BuildSteps.Build + + + + true + Make + + Qt4ProjectManager.MakeStep + + true + clean + + false + + 1 + Bereinigen + + ProjectExplorer.BuildSteps.Clean + + 2 + false + + Profile + Profile + Qt4ProjectManager.Qt4BuildConfiguration + 0 + true + + 3 + + + 0 + Deployment + + ProjectExplorer.BuildSteps.Deploy + + 1 + Deployment-Konfiguration + + ProjectExplorer.DefaultDeployConfiguration + + 1 + + + dwarf + + cpu-cycles + + + 250 + -F + true + 4096 + false + false + 1000 + + true + + false + false + false + false + true + 0.01 + 10 + true + kcachegrind + 1 + 25 + + 1 + true + false + true + valgrind + + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + + 2 + + IntelliPhoto + + Qt4ProjectManager.Qt4RunConfiguration:C:/Users/Basti/OneDrive/Documents/Uni/Softwaretechnologie/IntelliPhoto/Painting/IntelliPhoto.pro + + 3768 + false + true + true + false + false + true + + C:/Users/Basti/OneDrive/Documents/Uni/Softwaretechnologie/IntelliPhoto/build-IntelliPhoto-Desktop_Qt_5_12_5_MSVC2017_64bit-Debug + + 1 + + + + ProjectExplorer.Project.TargetCount + 1 + + + ProjectExplorer.Project.Updater.FileVersion + 22 + + + Version + 22 + + diff --git a/IntelliPhoto/Painting/IntelliPhoto.pro.user.426164d b/IntelliPhoto/Painting/IntelliPhoto.pro.user.426164d new file mode 100644 index 0000000..7a6a7ab --- /dev/null +++ b/IntelliPhoto/Painting/IntelliPhoto.pro.user.426164d @@ -0,0 +1,342 @@ + + + + + + EnvironmentId + {426164d9-3771-4235-8f83-cb0b49423ffc} + + + ProjectExplorer.Project.ActiveTarget + 0 + + + ProjectExplorer.Project.EditorSettings + + true + false + true + + Cpp + + CppGlobal + + + + QmlJS + + QmlJSGlobal + + + 2 + UTF-8 + false + 4 + false + 80 + true + true + 1 + true + false + 0 + true + true + 0 + 8 + true + 1 + true + true + true + false + + + + ProjectExplorer.Project.PluginSettings + + + -fno-delayed-template-parsing + + true + true + + + + true + + + + ProjectExplorer.Project.Target.0 + + Desktop Qt 5.12.5 MinGW 64-bit + Desktop Qt 5.12.5 MinGW 64-bit + qt.qt5.5125.win64_mingw73_kit + 1 + 0 + 0 + + C:/Users/jonas/OneDrive/Documents/GitHub/intelliphoto/IntelliPhoto/build-IntelliPhoto-Desktop_Qt_5_12_5_MinGW_64_bit-Debug + + + true + qmake + + QtProjectManager.QMakeBuildStep + true + + false + false + false + + + true + Make + + Qt4ProjectManager.MakeStep + + false + + + false + + 2 + Erstellen + + ProjectExplorer.BuildSteps.Build + + + + true + Make + + Qt4ProjectManager.MakeStep + + true + clean + + false + + 1 + Bereinigen + + ProjectExplorer.BuildSteps.Clean + + 2 + false + + Debug + Debug + Qt4ProjectManager.Qt4BuildConfiguration + 2 + true + + + C:/Users/jonas/OneDrive/Documents/GitHub/intelliphoto/IntelliPhoto/build-IntelliPhoto-Desktop_Qt_5_12_5_MinGW_64_bit-Release + + + true + qmake + + QtProjectManager.QMakeBuildStep + false + + false + false + true + + + true + Make + + Qt4ProjectManager.MakeStep + + false + + + false + + 2 + Erstellen + + ProjectExplorer.BuildSteps.Build + + + + true + Make + + Qt4ProjectManager.MakeStep + + true + clean + + false + + 1 + Bereinigen + + ProjectExplorer.BuildSteps.Clean + + 2 + false + + Release + Release + Qt4ProjectManager.Qt4BuildConfiguration + 0 + true + + + C:/Users/jonas/OneDrive/Documents/GitHub/intelliphoto/IntelliPhoto/build-IntelliPhoto-Desktop_Qt_5_12_5_MinGW_64_bit-Profile + + + true + qmake + + QtProjectManager.QMakeBuildStep + true + + false + true + true + + + true + Make + + Qt4ProjectManager.MakeStep + + false + + + false + + 2 + Erstellen + + ProjectExplorer.BuildSteps.Build + + + + true + Make + + Qt4ProjectManager.MakeStep + + true + clean + + false + + 1 + Bereinigen + + ProjectExplorer.BuildSteps.Clean + + 2 + false + + Profile + Profile + Qt4ProjectManager.Qt4BuildConfiguration + 0 + true + + 3 + + + 0 + Deployment + + ProjectExplorer.BuildSteps.Deploy + + 1 + Deployment-Konfiguration + + ProjectExplorer.DefaultDeployConfiguration + + 1 + + + dwarf + + cpu-cycles + + + 250 + -F + true + 4096 + false + false + 1000 + + true + + false + false + false + false + true + 0.01 + 10 + true + kcachegrind + 1 + 25 + + 1 + true + false + true + valgrind + + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + + 2 + + IntelliPhoto + + Qt4ProjectManager.Qt4RunConfiguration:C:/Users/jonas/OneDrive/Documents/GitHub/intelliphoto/IntelliPhoto/Painting/IntelliPhoto.pro + + 3768 + false + true + true + false + false + true + + C:/Users/jonas/OneDrive/Documents/GitHub/intelliphoto/IntelliPhoto/build-IntelliPhoto-Desktop_Qt_5_12_5_MinGW_64_bit-Release + + 1 + + + + ProjectExplorer.Project.TargetCount + 1 + + + ProjectExplorer.Project.Updater.FileVersion + 22 + + + Version + 22 + + diff --git a/IntelliPhoto/Painting/IntelliPhoto.pro.user.87de10b b/IntelliPhoto/Painting/IntelliPhoto.pro.user.87de10b new file mode 100644 index 0000000..fe52988 --- /dev/null +++ b/IntelliPhoto/Painting/IntelliPhoto.pro.user.87de10b @@ -0,0 +1,337 @@ + + + + + + EnvironmentId + {87de10b7-9dd6-4379-8674-fd04613e186e} + + + ProjectExplorer.Project.ActiveTarget + 0 + + + ProjectExplorer.Project.EditorSettings + + true + false + true + + Cpp + + CppGlobal + + + + QmlJS + + QmlJSGlobal + + + 2 + UTF-8 + false + 4 + false + 80 + true + true + 1 + true + false + 0 + true + true + 0 + 8 + true + 1 + true + true + true + false + + + + ProjectExplorer.Project.PluginSettings + + + -fno-delayed-template-parsing + + true + + + + ProjectExplorer.Project.Target.0 + + Desktop Qt 5.12.5 MinGW 64-bit + Desktop Qt 5.12.5 MinGW 64-bit + qt.qt5.5125.win64_mingw73_kit + 0 + 0 + 0 + + C:/Users/Jonas/Documents/GitHub/intelliphoto/IntelliPhoto/build-IntelliPhoto-Desktop_Qt_5_12_5_MinGW_64_bit-Debug + + + true + qmake + + QtProjectManager.QMakeBuildStep + true + + false + false + false + + + true + Make + + Qt4ProjectManager.MakeStep + + false + + + false + + 2 + Erstellen + + ProjectExplorer.BuildSteps.Build + + + + true + Make + + Qt4ProjectManager.MakeStep + + true + clean + + false + + 1 + Bereinigen + + ProjectExplorer.BuildSteps.Clean + + 2 + false + + Debug + Debug + Qt4ProjectManager.Qt4BuildConfiguration + 2 + true + + + C:/Users/Jonas/Documents/GitHub/intelliphoto/IntelliPhoto/build-IntelliPhoto-Desktop_Qt_5_12_5_MinGW_64_bit-Release + + + true + qmake + + QtProjectManager.QMakeBuildStep + false + + false + false + true + + + true + Make + + Qt4ProjectManager.MakeStep + + false + + + false + + 2 + Erstellen + + ProjectExplorer.BuildSteps.Build + + + + true + Make + + Qt4ProjectManager.MakeStep + + true + clean + + false + + 1 + Bereinigen + + ProjectExplorer.BuildSteps.Clean + + 2 + false + + Release + Release + Qt4ProjectManager.Qt4BuildConfiguration + 0 + true + + + C:/Users/Jonas/Documents/GitHub/intelliphoto/IntelliPhoto/build-IntelliPhoto-Desktop_Qt_5_12_5_MinGW_64_bit-Profile + + + true + qmake + + QtProjectManager.QMakeBuildStep + true + + false + true + true + + + true + Make + + Qt4ProjectManager.MakeStep + + false + + + false + + 2 + Erstellen + + ProjectExplorer.BuildSteps.Build + + + + true + Make + + Qt4ProjectManager.MakeStep + + true + clean + + false + + 1 + Bereinigen + + ProjectExplorer.BuildSteps.Clean + + 2 + false + + Profile + Profile + Qt4ProjectManager.Qt4BuildConfiguration + 0 + true + + 3 + + + 0 + Deployment + + ProjectExplorer.BuildSteps.Deploy + + 1 + Deployment-Konfiguration + + ProjectExplorer.DefaultDeployConfiguration + + 1 + + + dwarf + + cpu-cycles + + + 250 + -F + true + 4096 + false + false + 1000 + + true + + false + false + false + false + true + 0.01 + 10 + true + kcachegrind + 1 + 25 + + 1 + true + false + true + valgrind + + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + + 2 + + IntelliPhoto + + Qt4ProjectManager.Qt4RunConfiguration:C:/Users/Jonas/Documents/GitHub/intelliphoto/IntelliPhoto/Painting/IntelliPhoto.pro + + 3768 + false + true + true + false + false + true + + C:/Users/Jonas/Documents/GitHub/intelliphoto/IntelliPhoto/build-IntelliPhoto-Desktop_Qt_5_12_5_MinGW_64_bit-Debug + + 1 + + + + ProjectExplorer.Project.TargetCount + 1 + + + ProjectExplorer.Project.Updater.FileVersion + 22 + + + Version + 22 + + diff --git a/IntelliPhoto/Painting/IntelliPhoto.user b/IntelliPhoto/Painting/IntelliPhoto.user new file mode 100644 index 0000000..574e287 --- /dev/null +++ b/IntelliPhoto/Painting/IntelliPhoto.user @@ -0,0 +1,337 @@ + + + + + + EnvironmentId + {39e188fc-db7d-4dae-b6b7-f93e7e62e580} + + + ProjectExplorer.Project.ActiveTarget + 0 + + + ProjectExplorer.Project.EditorSettings + + true + false + true + + Cpp + + CppGlobal + + + + QmlJS + + QmlJSGlobal + + + 2 + UTF-8 + false + 4 + false + 80 + true + true + 1 + true + false + 0 + true + true + 0 + 8 + true + 1 + true + true + true + false + + + + ProjectExplorer.Project.PluginSettings + + + -fno-delayed-template-parsing + + true + + + + ProjectExplorer.Project.Target.0 + + Desktop Qt 5.12.6 MinGW 32-bit + Desktop Qt 5.12.6 MinGW 32-bit + qt.qt5.5126.win32_mingw73_kit + 0 + 0 + 0 + + E:/Users/pauln/Documents/intelliphoto/IntelliPhoto/build-Scribble-Desktop_Qt_5_12_6_MinGW_32_bit-Debug + + + true + qmake + + QtProjectManager.QMakeBuildStep + true + + false + false + false + + + true + Make + + Qt4ProjectManager.MakeStep + + false + + + false + + 2 + Erstellen + + ProjectExplorer.BuildSteps.Build + + + + true + Make + + Qt4ProjectManager.MakeStep + + true + clean + + false + + 1 + Bereinigen + + ProjectExplorer.BuildSteps.Clean + + 2 + false + + Debug + Debug + Qt4ProjectManager.Qt4BuildConfiguration + 2 + true + + + E:/Users/pauln/Documents/intelliphoto/IntelliPhoto/build-Scribble-Desktop_Qt_5_12_6_MinGW_32_bit-Release + + + true + qmake + + QtProjectManager.QMakeBuildStep + false + + false + false + true + + + true + Make + + Qt4ProjectManager.MakeStep + + false + + + false + + 2 + Erstellen + + ProjectExplorer.BuildSteps.Build + + + + true + Make + + Qt4ProjectManager.MakeStep + + true + clean + + false + + 1 + Bereinigen + + ProjectExplorer.BuildSteps.Clean + + 2 + false + + Release + Release + Qt4ProjectManager.Qt4BuildConfiguration + 0 + true + + + E:/Users/pauln/Documents/intelliphoto/IntelliPhoto/build-Scribble-Desktop_Qt_5_12_6_MinGW_32_bit-Profile + + + true + qmake + + QtProjectManager.QMakeBuildStep + true + + false + true + true + + + true + Make + + Qt4ProjectManager.MakeStep + + false + + + false + + 2 + Erstellen + + ProjectExplorer.BuildSteps.Build + + + + true + Make + + Qt4ProjectManager.MakeStep + + true + clean + + false + + 1 + Bereinigen + + ProjectExplorer.BuildSteps.Clean + + 2 + false + + Profile + Profile + Qt4ProjectManager.Qt4BuildConfiguration + 0 + true + + 3 + + + 0 + Deployment + + ProjectExplorer.BuildSteps.Deploy + + 1 + Deployment-Konfiguration + + ProjectExplorer.DefaultDeployConfiguration + + 1 + + + dwarf + + cpu-cycles + + + 250 + -F + true + 4096 + false + false + 1000 + + true + + false + false + false + false + true + 0.01 + 10 + true + kcachegrind + 1 + 25 + + 1 + true + false + true + valgrind + + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + + 2 + + Scribble + + Qt4ProjectManager.Qt4RunConfiguration:E:/Users/pauln/Documents/intelliphoto/IntelliPhoto/Scribble/Scribble.pro + + 3768 + false + true + true + false + false + true + + E:/Users/pauln/Documents/intelliphoto/IntelliPhoto/build-Scribble-Desktop_Qt_5_12_6_MinGW_32_bit-Debug + + 1 + + + + ProjectExplorer.Project.TargetCount + 1 + + + ProjectExplorer.Project.Updater.FileVersion + 22 + + + Version + 22 + + diff --git a/IntelliPhoto/Painting/Layer/PaintingArea.cpp b/IntelliPhoto/Painting/Layer/PaintingArea.cpp new file mode 100644 index 0000000..f1a228d --- /dev/null +++ b/IntelliPhoto/Painting/Layer/PaintingArea.cpp @@ -0,0 +1,320 @@ +// ---------- PaintingArea.cpp ---------- + +#include +#include +#include "PaintingArea.h" +#include "Image/IntelliRasterImage.h" +#include "Image/IntelliShapedImage.h" + +#include +#include + +PaintingArea::PaintingArea(int maxWidth, int maxHeight, QWidget *parent) + :QWidget(parent){ + this->setUp(maxWidth, maxHeight); + + //tetsing + this->addLayer(200,200,0,0,ImageType::Shaped_Image); + layerStructure[0].image->floodFill(QColor(255,0,0,255)); + std::vector polygon; + polygon.push_back(QPoint(100,0)); + polygon.push_back(QPoint(200,200)); + polygon.push_back(QPoint(0,200)); + polygon.push_back(QPoint(100,0)); + layerStructure[0].image->setPolygon(polygon); + + this->addLayer(200,200,150,150); + layerStructure[1].image->floodFill(QColor(0,255,0,255)); + layerStructure[1].alpha=200; + activeLayer=1; +} + + + + +void PaintingArea::setUp(int maxWidth, int maxHeight){ + + //set standart parameter + this->maxWidth = maxWidth; + this->maxHeight = maxHeight; + Canvas = new QImage(maxWidth,maxHeight, QImage::Format_ARGB32); + Canvas->fill(Qt::GlobalColor::white); + + // Roots the widget to the top left even if resized + setAttribute(Qt::WA_StaticContents); + + // Set defaults for the monitored variables + scribbling = false; + myPenWidth = 1; + myPenColor = Qt::blue; +} + +void PaintingArea::addLayer(int width, int height, int widthOffset, int heightOffset, ImageType type){ + LayerObject newLayer; + newLayer.width = width; + newLayer.height = height; + newLayer.widthOffset = widthOffset; + newLayer.heightOffset = heightOffset; + if(type==ImageType::Raster_Image){ + newLayer.image = new IntelliRasterImage(width,height); + }else if(type==ImageType::Shaped_Image){ + newLayer.image = new IntelliShapedImage(width, height); + } + newLayer.alpha = 255; + this->layerStructure.push_back(newLayer); + +} + +void PaintingArea::deleteLayer(int index){ + if(indexlayerStructure.erase(layerStructure.begin()+index); + if(activeLayer>=index){ + activeLayer--; + } + } +} + +void PaintingArea::setLayerToActive(int index) { + if(indexactiveLayer=index; + } +} + +void PaintingArea::setAlphaToLayer(int index, int alpha){ + if(indexactiveLayer==-1){ + return false; + } + IntelliImage* active = layerStructure[activeLayer].image; + bool open = active->loadImage(fileName); + update(); + return open; +} + +// Save the current image +bool PaintingArea::saveImage(const QString &fileName, const char *fileFormat) +{ + if(layerStructure.size()==0){ + return false; + } + this->assembleLayers(true); + + if (Canvas->save(fileName, fileFormat)) { + return true; + } else { + return false; + } +} + +// Used to change the pen color +void PaintingArea::setPenColor(const QColor &newColor) +{ + myPenColor = newColor; +} + +// Used to change the pen width +void PaintingArea::setPenWidth(int newWidth) +{ + myPenWidth = newWidth; +} + +// Color the image area with white +void PaintingArea::clearImage(int r, int g, int b){ + if(this->activeLayer==-1){ + return; + } + IntelliImage* active = layerStructure[activeLayer].image; + active->floodFill(QColor(r, g, b, 255)); + + update(); +} + +void PaintingArea::activate(int a){ + this->setLayerToActive(a); +} + +void PaintingArea::setAlpha(int a){ + if(activeLayer>=0){ + layerStructure[activeLayer].alpha=a; + } +} + +void PaintingArea::getMoveUp(int a){ + layerStructure[activeLayer].heightOffset-=a; +} + +void PaintingArea::getMoveDown(int a){ + layerStructure[activeLayer].heightOffset+=a; +} + +void PaintingArea::getMoveRight(int a){ + layerStructure[activeLayer].widthOffset+=a; +} + +void PaintingArea::getMoveLeft(int a){ + layerStructure[activeLayer].widthOffset-=a; +} + +void PaintingArea::getMoveLayerUp(){ + if(activeLayer=0){ + std::swap(layerStructure[activeLayer], layerStructure[activeLayer+1]); + activeLayer++; + } +} + +void PaintingArea::getMoveLayerDown(){ + if(activeLayer>0){ + std::swap(layerStructure[activeLayer], layerStructure[activeLayer-1]); + activeLayer--; + } +} + +// 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 +void PaintingArea::mousePressEvent(QMouseEvent *event) +{ + if (event->button() == Qt::LeftButton) { + if(this->activeLayer==-1){ + return; + } + LayerObject& active = layerStructure[activeLayer]; + + int x = event->x()-active.widthOffset; + int y = event->y()-active.heightOffset; + //TODO CALCULATE LAST POINT + lastPoint=QPoint(x,y); + scribbling = true; + } +} + + +// When the mouse moves if the left button is clicked +// we call the drawline function which draws a line +// from the last position to the current +void PaintingArea::mouseMoveEvent(QMouseEvent *event) +{ + + if ((event->buttons() & Qt::LeftButton) && scribbling){ + if(this->activeLayer==-1){ + return; + } + LayerObject& active = layerStructure[activeLayer]; + + int x = event->x()-active.widthOffset; + int y = event->y()-active.heightOffset; + + //TODO CALCULATE NEW POINT + drawLineTo(QPoint(x,y)); + update(); + } +} + +// If the button is released we set variables to stop drawing +void PaintingArea::mouseReleaseEvent(QMouseEvent *event) +{ + if (event->button() == Qt::LeftButton && scribbling) { + if(this->activeLayer==-1){ + return; + } + LayerObject& active = layerStructure[activeLayer]; + + int x = event->x()-active.widthOffset; + int y = event->y()-active.heightOffset; + + //TODO CALCULATE NEW POINT + drawLineTo(QPoint(x,y)); + update(); + scribbling = false; + } +} + +// QPainter provides functions to draw on the widget +// The QPaintEvent is sent to widgets that need to +// update themselves +void PaintingArea::paintEvent(QPaintEvent *event) +{ + this->assembleLayers(); + + QPainter painter(this); + QRect dirtyRec = event->rect(); + painter.drawImage(dirtyRec, *Canvas, dirtyRec); + update(); +} + +// Resize the image to slightly larger then the main window +// to cut down on the need to resize the image +void PaintingArea::resizeEvent(QResizeEvent *event) +{ + if(this->activeLayer==-1){ + return; + } + LayerObject active = layerStructure[activeLayer]; + + QPainter painter(this); + QRect dirtyRec(QPoint(0,0), event->size()); + painter.drawImage(dirtyRec, active.image->getDisplayable(event->size(), active.alpha), dirtyRec); + update(); +} + +void PaintingArea::drawLineTo(const QPoint &endPoint) +{ + //// Used to draw on the widget + if(this->activeLayer==-1){ + return; + } + LayerObject active = layerStructure[activeLayer]; + + active.image->drawLine(lastPoint, endPoint,myPenColor, myPenWidth); + lastPoint = endPoint; + update(); +} + +void PaintingArea::resizeImage(QImage *image_res, const QSize &newSize){ + image_res->scaled(newSize,Qt::IgnoreAspectRatio); +} + +void PaintingArea::assembleLayers(bool forSaving){ + if(forSaving){ + Canvas->fill(Qt::GlobalColor::transparent); + }else{ + Canvas->fill(Qt::GlobalColor::black); + } + //TODO interpolation of alpha for saving + for(size_t i=0; igetDisplayable(layer.alpha); + QColor clr_0; + QColor clr_1; + for(int y=0; ypixelColor(layer.widthOffset+x, layer.heightOffset+y); + clr_1=cpy.pixelColor(x,y); + float t = (float)clr_1.alpha()/255.f; + int r =(float)clr_1.red()*(t)+(float)clr_0.red()*(1.-t); + int g =(float)clr_1.green()*(t)+(float)clr_0.green()*(1.-t); + int b =(float)clr_1.blue()*(t)+(float)clr_0.blue()*(1.-t); + int a =std::min(clr_0.alpha()+clr_1.alpha(), 255); + clr_0.setRed(r); + clr_0.setGreen(g); + clr_0.setBlue(b); + clr_0.setAlpha(a); + + Canvas->setPixelColor(layer.widthOffset+x, layer.heightOffset+y, clr_0); + } + } + } +} + diff --git a/IntelliPhoto/Painting/Layer/PaintingArea.h b/IntelliPhoto/Painting/Layer/PaintingArea.h new file mode 100644 index 0000000..6346687 --- /dev/null +++ b/IntelliPhoto/Painting/Layer/PaintingArea.h @@ -0,0 +1,110 @@ + +#ifndef PaintingArea_H +#define PaintingArea_H + +#include +#include +#include"Image/IntelliImage.h" +#include +#include +#include + +class PaintingArea : public QWidget +{ + // Declares our class as a QObject which is the base class + // for all Qt objects + // QObjects handle events + Q_OBJECT + +public: + PaintingArea(int maxWidth=1000, int maxHeight=800, QWidget *parent = nullptr); + + // Handles all events + bool openImage(const QString &fileName); + bool saveImage(const QString &fileName, const char *fileFormat); + + void addLayer(int width, int height, int widthOffset=0, int heightOffset=0, ImageType type = ImageType::Raster_Image); + void deleteLayer(int index); + void setLayerToActive(int index); + void setAlphaToLayer(int index, int alpha); + + // Has the image been modified since last save + bool isModified() const { return modified; } + + void setPenColor(const QColor &newColor); + QColor penColor() const { return myPenColor; } + + void setPenWidth(int newWidth); + int penWidth() const { return myPenWidth; } + + + QPixmap getAsPixmap(); +public slots: + + // Events to handle + void clearImage(int r, int g, int b); + void activate(int a); + + void setAlpha(int a); + void getMoveUp(int a); + void getMoveDown(int a); + void getMoveRight(int a); + void getMoveLeft(int a); + void getMoveLayerUp(); + void getMoveLayerDown(); + //void setUp helper for konstruktor + void setUp(int maxWidth, int maxHeight); +protected: + void mousePressEvent(QMouseEvent *event) override; + void mouseMoveEvent(QMouseEvent *event) override; + void mouseReleaseEvent(QMouseEvent *event) override; + + // Updates the painting area where we are painting + void paintEvent(QPaintEvent *event) override; + + // Makes sure the area we are drawing on remains + // as large as the widget + void resizeEvent(QResizeEvent *event) override; + +private: + struct LayerObject{ + IntelliImage* image; + int width; + int height; + int widthOffset; + int heightOffset; + int alpha=255; + }; + + QImage* Canvas; + int maxWidth; + int maxHeight; + + std::vector layerStructure; + int activeLayer=-1; + + void assembleLayers(bool forSaving=false); + + void drawLineTo(const QPoint &endPoint); + void resizeImage(QImage *image_res, const QSize &newSize); + + // Will be marked true or false depending on if + // we have saved after a change + bool modified=false; + + // Marked true or false depending on if the user + // is drawing + bool scribbling; + + // Holds the current pen width & color + int myPenWidth; + QColor myPenColor; + + // Stores the image being drawn + + // Stores the location at the current mouse event + QPoint lastPoint; +}; + +#endif + diff --git a/IntelliPhoto/Painting/Scribble.pro.user.426164d b/IntelliPhoto/Painting/Scribble.pro.user.426164d new file mode 100644 index 0000000..572799d --- /dev/null +++ b/IntelliPhoto/Painting/Scribble.pro.user.426164d @@ -0,0 +1,337 @@ + + + + + + EnvironmentId + {426164d9-3771-4235-8f83-cb0b49423ffc} + + + ProjectExplorer.Project.ActiveTarget + 0 + + + ProjectExplorer.Project.EditorSettings + + true + false + true + + Cpp + + CppGlobal + + + + QmlJS + + QmlJSGlobal + + + 2 + UTF-8 + false + 4 + false + 80 + true + true + 1 + true + false + 0 + true + true + 0 + 8 + true + 1 + true + true + true + false + + + + ProjectExplorer.Project.PluginSettings + + + -fno-delayed-template-parsing + + true + + + + ProjectExplorer.Project.Target.0 + + Desktop Qt 5.12.5 MinGW 64-bit + Desktop Qt 5.12.5 MinGW 64-bit + qt.qt5.5125.win64_mingw73_kit + 0 + 0 + 0 + + C:/Users/jonas/OneDrive/Desktop/build-Scribble-Desktop_Qt_5_12_5_MinGW_64_bit-Debug + + + true + qmake + + QtProjectManager.QMakeBuildStep + true + + false + false + false + + + true + Make + + Qt4ProjectManager.MakeStep + + false + + + false + + 2 + Erstellen + + ProjectExplorer.BuildSteps.Build + + + + true + Make + + Qt4ProjectManager.MakeStep + + true + clean + + false + + 1 + Bereinigen + + ProjectExplorer.BuildSteps.Clean + + 2 + false + + Debug + Debug + Qt4ProjectManager.Qt4BuildConfiguration + 2 + true + + + C:/Users/jonas/OneDrive/Desktop/build-Scribble-Desktop_Qt_5_12_5_MinGW_64_bit-Release + + + true + qmake + + QtProjectManager.QMakeBuildStep + false + + false + false + true + + + true + Make + + Qt4ProjectManager.MakeStep + + false + + + false + + 2 + Erstellen + + ProjectExplorer.BuildSteps.Build + + + + true + Make + + Qt4ProjectManager.MakeStep + + true + clean + + false + + 1 + Bereinigen + + ProjectExplorer.BuildSteps.Clean + + 2 + false + + Release + Release + Qt4ProjectManager.Qt4BuildConfiguration + 0 + true + + + C:/Users/jonas/OneDrive/Desktop/build-Scribble-Desktop_Qt_5_12_5_MinGW_64_bit-Profile + + + true + qmake + + QtProjectManager.QMakeBuildStep + true + + false + true + true + + + true + Make + + Qt4ProjectManager.MakeStep + + false + + + false + + 2 + Erstellen + + ProjectExplorer.BuildSteps.Build + + + + true + Make + + Qt4ProjectManager.MakeStep + + true + clean + + false + + 1 + Bereinigen + + ProjectExplorer.BuildSteps.Clean + + 2 + false + + Profile + Profile + Qt4ProjectManager.Qt4BuildConfiguration + 0 + true + + 3 + + + 0 + Deployment + + ProjectExplorer.BuildSteps.Deploy + + 1 + Deployment-Konfiguration + + ProjectExplorer.DefaultDeployConfiguration + + 1 + + + dwarf + + cpu-cycles + + + 250 + -F + true + 4096 + false + false + 1000 + + true + + false + false + false + false + true + 0.01 + 10 + true + kcachegrind + 1 + 25 + + 1 + true + false + true + valgrind + + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + + 2 + + Scribble + Scribble2 + Qt4ProjectManager.Qt4RunConfiguration:C:/Users/jonas/OneDrive/Documents/GitHub/intelliphoto/IntelliPhoto/Scribble/Scribble.pro + + 3768 + false + true + true + false + false + true + + C:/Users/jonas/OneDrive/Desktop/build-Scribble-Desktop_Qt_5_12_5_MinGW_64_bit-Debug + + 1 + + + + ProjectExplorer.Project.TargetCount + 1 + + + ProjectExplorer.Project.Updater.FileVersion + 22 + + + Version + 22 + + diff --git a/IntelliPhoto/Painting/icon.ico b/IntelliPhoto/Painting/icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..f21cd00571b5f184b1f67b96c000c8f894fff44b GIT binary patch literal 51620 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 literal 0 HcmV?d00001 diff --git a/IntelliPhoto/Painting/main.cpp b/IntelliPhoto/Painting/main.cpp new file mode 100644 index 0000000..6ada0cb --- /dev/null +++ b/IntelliPhoto/Painting/main.cpp @@ -0,0 +1,20 @@ +#include "GUI/IntelliPhotoGui.h" +#include +#include + +int main(int argc, char *argv[]) +{ + // The main application + QApplication app(argc, argv); + + //some nice ass looking comment + // Create and open the main window + IntelliPhotoGui window; + window.show(); + + return app.exec(); +} + + + + diff --git a/IntelliPhoto/Painting/widget.ui b/IntelliPhoto/Painting/widget.ui new file mode 100644 index 0000000..b90248d --- /dev/null +++ b/IntelliPhoto/Painting/widget.ui @@ -0,0 +1,19 @@ + + + Widget + + + + 0 + 0 + 800 + 600 + + + + Widget + + + + +