From 0045375f6c789087a9633471938ceae470198060 Mon Sep 17 00:00:00 2001 From: Jan Schuffenhauer Date: Fri, 20 Dec 2019 08:21:23 +0100 Subject: [PATCH 01/44] Fixed bug / changed pi like the pi could get removed if mucke wants to --- src/IntelliHelper/IntelliHelper.cpp | 6 ++++-- src/IntelliPhoto.pro | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/IntelliHelper/IntelliHelper.cpp b/src/IntelliHelper/IntelliHelper.cpp index 944d0c6..d9aa439 100644 --- a/src/IntelliHelper/IntelliHelper.cpp +++ b/src/IntelliHelper/IntelliHelper.cpp @@ -3,6 +3,8 @@ #include #include +#define pi 3.14159265359 + std::vector IntelliHelper::calculateTriangles(std::vector polyPoints){ // helper for managing the triangle vertices and their state @@ -46,7 +48,7 @@ std::vector IntelliHelper::calculateTriangles(std::vector poly // return if the vertex is a tip auto isTip = [](float angle){ - return static_cast(angle)<(M_PI/2.); + return static_cast(angle)<(pi/2.); }; std::vector Vertices; @@ -88,7 +90,7 @@ std::vector IntelliHelper::calculateTriangles(std::vector poly } // update post und prev index - post = post-1; + post = getPrev(post, Vertices.size()); prev = prev Date: Fri, 20 Dec 2019 08:56:15 +0100 Subject: [PATCH 02/44] Update IntelliHelper.cpp --- src/IntelliHelper/IntelliHelper.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/IntelliHelper/IntelliHelper.cpp b/src/IntelliHelper/IntelliHelper.cpp index 944d0c6..0fad4ca 100644 --- a/src/IntelliHelper/IntelliHelper.cpp +++ b/src/IntelliHelper/IntelliHelper.cpp @@ -2,6 +2,7 @@ #include #include #include +#define PI_HALF 1.57079632679489661923 std::vector IntelliHelper::calculateTriangles(std::vector polyPoints){ @@ -46,7 +47,7 @@ std::vector IntelliHelper::calculateTriangles(std::vector poly // return if the vertex is a tip auto isTip = [](float angle){ - return static_cast(angle)<(M_PI/2.); + return static_cast(angle)<(PI_HALF); }; std::vector Vertices; From 0411c49534d77539afbf4056e64231d61c2456a9 Mon Sep 17 00:00:00 2001 From: Conrad Date: Fri, 20 Dec 2019 09:03:26 +0100 Subject: [PATCH 03/44] Refractored misspelled variable --- src/Tool/IntelliToolRectangle.cpp | 14 +++++++------- src/Tool/IntelliToolRectangle.h | 8 ++++---- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/Tool/IntelliToolRectangle.cpp b/src/Tool/IntelliToolRectangle.cpp index e5f0cdd..d2cc49a 100644 --- a/src/Tool/IntelliToolRectangle.cpp +++ b/src/Tool/IntelliToolRectangle.cpp @@ -12,12 +12,12 @@ IntelliToolRectangle::~IntelliToolRectangle(){ } -void IntelliToolRectangle::drawRectangle(QPoint otherCornor){ - int xMin = std::min(originCornor.x(), otherCornor.x()); - int xMax = std::max(originCornor.x(), otherCornor.x()); +void IntelliToolRectangle::drawRectangle(QPoint otherCorner){ + int xMin = std::min(originCorner.x(), otherCorner.x()); + int xMax = std::max(originCorner.x(), otherCorner.x()); - int yMin = std::min(originCornor.y(), otherCornor.y()); - int yMax = std::max(originCornor.y(), otherCornor.y()); + int yMin = std::min(originCorner.y(), otherCorner.y()); + int yMax = std::max(originCorner.y(), otherCorner.y()); QColor clr = colorPicker->getSecondColor(); clr.setAlpha(alphaInner); @@ -40,8 +40,8 @@ void IntelliToolRectangle::onMouseRightReleased(int x, int y){ void IntelliToolRectangle::onMouseLeftPressed(int x, int y){ IntelliTool::onMouseLeftPressed(x,y); - this->originCornor=QPoint(x,y); - drawRectangle(originCornor); + this->originCorner=QPoint(x,y); + drawRectangle(originCorner); Canvas->image->calculateVisiblity(); } diff --git a/src/Tool/IntelliToolRectangle.h b/src/Tool/IntelliToolRectangle.h index afd0030..e9db958 100644 --- a/src/Tool/IntelliToolRectangle.h +++ b/src/Tool/IntelliToolRectangle.h @@ -11,14 +11,14 @@ class IntelliToolRectangle : public IntelliTool { /*! * \brief A function that implements a rectagle drawing algorithm. - * \param otherCornor - The second corner point of the rectangle. + * \param othercorner - The second corner point of the rectangle. */ -void drawRectangle(QPoint otherCornor); +void drawRectangle(QPoint otherCorner); /*! - * \brief originCornor - The first corner point of the rectangle. + * \brief origincorner - The first corner point of the rectangle. */ -QPoint originCornor; +QPoint originCorner; /*! * \brief alphaInner- Represents the alpha value of the inside. */ From ab8590c4fe16a7c5d0baefcda7ddc2d20fb34448 Mon Sep 17 00:00:00 2001 From: Conrad Date: Fri, 20 Dec 2019 09:15:02 +0100 Subject: [PATCH 04/44] Refractored fileName to more intuitive filePath --- src/Image/IntelliImage.cpp | 4 ++-- src/Image/IntelliImage.h | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Image/IntelliImage.cpp b/src/Image/IntelliImage.cpp index 059fe4c..4254f63 100644 --- a/src/Image/IntelliImage.cpp +++ b/src/Image/IntelliImage.cpp @@ -11,12 +11,12 @@ IntelliImage::~IntelliImage(){ } -bool IntelliImage::loadImage(const QString &fileName){ +bool IntelliImage::loadImage(const QString &filePath){ // Holds the image QImage loadedImage; // If the image wasn't loaded leave this function - if (!loadedImage.load(fileName)) + if (!loadedImage.load(filePath)) return false; // scaled Image to size of Layer diff --git a/src/Image/IntelliImage.h b/src/Image/IntelliImage.h index 12f965b..1dce011 100644 --- a/src/Image/IntelliImage.h +++ b/src/Image/IntelliImage.h @@ -116,10 +116,10 @@ virtual std::vector getPolygonData(){ /*! * \brief A function that loads and sclaes an image to the fitting dimensions. - * \param fileName - The path+name of the image which to loaded. + * \param filePath - The path+name of the image which to loaded. * \return True if the image could be loaded, false otherwise. */ -virtual bool loadImage(const QString &fileName); +virtual bool loadImage(const QString &filePath); /*! * \brief A function that returns the pixelcolor at a certain point From 52292ebfe7615df8b268062084d0b22d69680528 Mon Sep 17 00:00:00 2001 From: Conrad Date: Fri, 20 Dec 2019 09:50:30 +0100 Subject: [PATCH 05/44] Refractoring Update 1 - Refractored switchColor to slotSwapColor - Corrected spelling mistake in variable name (weight-->width) - Unified variable names --- src/GUI/IntelliPhotoGui.cpp | 12 ++-- src/GUI/IntelliPhotoGui.h | 4 +- src/Image/IntelliImage.h | 6 +- src/Image/IntelliRasterImage.h | 4 +- src/Image/IntelliShapedImage.h | 4 +- src/IntelliHelper/IntelliColorPicker.cpp | 2 +- .../IntelliColorPicker.h.autosave | 64 +++++++++++++++++++ src/Layer/PaintingArea.cpp | 34 +++++----- src/Layer/PaintingArea.h | 21 +++--- src/Tool/IntelliTool.cpp | 2 +- 10 files changed, 109 insertions(+), 44 deletions(-) create mode 100644 src/IntelliHelper/IntelliColorPicker.h.autosave diff --git a/src/GUI/IntelliPhotoGui.cpp b/src/GUI/IntelliPhotoGui.cpp index 063f4b7..a2b0206 100644 --- a/src/GUI/IntelliPhotoGui.cpp +++ b/src/GUI/IntelliPhotoGui.cpp @@ -206,8 +206,8 @@ void IntelliPhotoGui::slotSetSecondColor(){ paintingArea->colorPickerSetSecondColor(); } -void IntelliPhotoGui::slotSwitchColor(){ - paintingArea->colorPickerSwitchColor(); +void IntelliPhotoGui::slotSwapColor(){ + paintingArea->colorPickerSwapColors(); } void IntelliPhotoGui::slotCreatePenTool(){ @@ -328,9 +328,9 @@ void IntelliPhotoGui::createActions(){ actionColorPickerSecondColor = new QAction(tr("&Secondary"), this); connect(actionColorPickerSecondColor, SIGNAL(triggered()), this, SLOT(slotSetSecondColor())); - actionColorSwitch = new QAction(tr("&Switch"), this); - actionColorSwitch->setShortcut(QKeySequence(Qt::CTRL + Qt::SHIFT + Qt::Key_S)); - connect(actionColorSwitch, SIGNAL(triggered()), this, SLOT(slotSwitchColor())); + actionColorSwap = new QAction(tr("&Switch"), this); + actionColorSwap->setShortcut(QKeySequence(Qt::CTRL + Qt::SHIFT + Qt::Key_S)); + connect(actionColorSwap, SIGNAL(triggered()), this, SLOT(slotSwapColor())); //Create Tool actions down here actionCreatePlainTool = new QAction(tr("&Plain"), this); @@ -398,7 +398,7 @@ void IntelliPhotoGui::createMenus(){ colorMenu = new QMenu(tr("&Color"), this); colorMenu->addAction(actionColorPickerFirstColor); colorMenu->addAction(actionColorPickerSecondColor); - colorMenu->addAction(actionColorSwitch); + colorMenu->addAction(actionColorSwap); //Attach all Tool Options toolMenu = new QMenu(tr("&Tools"), this); diff --git a/src/GUI/IntelliPhotoGui.h b/src/GUI/IntelliPhotoGui.h index e6acca9..e76485c 100644 --- a/src/GUI/IntelliPhotoGui.h +++ b/src/GUI/IntelliPhotoGui.h @@ -55,7 +55,7 @@ void slotMoveLayerDown(); // color Picker slots here void slotSetFirstColor(); void slotSetSecondColor(); -void slotSwitchColor(); +void slotSwapColor(); // tool slots here void slotCreatePenTool(); @@ -103,7 +103,7 @@ QAction*actionExit; // color Picker actions QAction*actionColorPickerFirstColor; QAction*actionColorPickerSecondColor; -QAction*actionColorSwitch; +QAction*actionColorSwap; // tool actions QAction*actionCreatePenTool; diff --git a/src/Image/IntelliImage.h b/src/Image/IntelliImage.h index 1dce011..be99c1d 100644 --- a/src/Image/IntelliImage.h +++ b/src/Image/IntelliImage.h @@ -33,10 +33,10 @@ QImage imageData; public: /*! * \brief The Construcor of the IntelliImage. Given the Image dimensions. - * \param weight - The weight of the Image. + * \param width - The width of the Image. * \param height - The height of the Image. */ -IntelliImage(int weight, int height); +IntelliImage(int width, int height); /*! * \brief An Abstract Destructor. @@ -91,7 +91,7 @@ virtual QImage getDisplayable(int alpha=255) = 0; /*! * \brief A function that copys all that returns a [allocated] Image - * \return A [allocated] Image with all the properties of the instance. + * \return An [allocated] image with all the properties of the instance. */ virtual IntelliImage* getDeepCopy() = 0; diff --git a/src/Image/IntelliRasterImage.h b/src/Image/IntelliRasterImage.h index 5a3de15..0879abb 100644 --- a/src/Image/IntelliRasterImage.h +++ b/src/Image/IntelliRasterImage.h @@ -16,10 +16,10 @@ virtual void calculateVisiblity() override; public: /*! * \brief The Construcor of the IntelliRasterImage. Given the Image dimensions. - * \param weight - The weight of the Image. + * \param width - The width of the Image. * \param height - The height of the Image. */ -IntelliRasterImage(int weight, int height); +IntelliRasterImage(int width, int height); /*! * \brief An Destructor. diff --git a/src/Image/IntelliShapedImage.h b/src/Image/IntelliShapedImage.h index fbdd22e..5d1288d 100644 --- a/src/Image/IntelliShapedImage.h +++ b/src/Image/IntelliShapedImage.h @@ -29,10 +29,10 @@ std::vector polygonData; public: /*! * \brief The Construcor of the IntelliShapedImage. Given the Image dimensions. - * \param weight - The weight of the Image. + * \param width - The width of the Image. * \param height - The height of the Image. */ -IntelliShapedImage(int weight, int height); +IntelliShapedImage(int width, int height); /*! * \brief An Destructor. diff --git a/src/IntelliHelper/IntelliColorPicker.cpp b/src/IntelliHelper/IntelliColorPicker.cpp index 534a8e5..104039b 100644 --- a/src/IntelliHelper/IntelliColorPicker.cpp +++ b/src/IntelliHelper/IntelliColorPicker.cpp @@ -9,7 +9,7 @@ IntelliColorPicker::~IntelliColorPicker(){ } -void IntelliColorPicker::switchColors(){ +void IntelliColorPicker::swapColors(){ std::swap(firstColor, secondColor); } diff --git a/src/IntelliHelper/IntelliColorPicker.h.autosave b/src/IntelliHelper/IntelliColorPicker.h.autosave new file mode 100644 index 0000000..4ea686b --- /dev/null +++ b/src/IntelliHelper/IntelliColorPicker.h.autosave @@ -0,0 +1,64 @@ +#ifndef INTELLITOOLSETCOLORTOOL_H +#define INTELLITOOLSETCOLORTOOL_H + +#include "QColor" +#include "QPoint" +#include "QColorDialog" + +/*! + * \brief The IntelliColorPicker manages the selected colors for one whole project. + */ +class IntelliColorPicker { +public: +/*! + * \brief IntelliColorPicker constructor, setting 2 preset colors, be careful, theese color may change in production. + */ +IntelliColorPicker(); + +/*! + * \brief IntelliColorPicker destructor clears up his used memory, if there is some. + */ +virtual ~IntelliColorPicker(); + +/*! + * \brief A function switching primary and secondary color. + */ +void swapColors(); + +/*! + * \brief A function to read the primary selected color. + * \return Returns the primary color. + */ +QColor getFirstColor(); + +/*! + * \brief A function to read the secondary selected color. + * \return Returns the secondary color. + */ +QColor getSecondColor(); + +/*! + * \brief A function to set the primary color. + * \param Color - The color to be set as primary. + */ +void setFirstColor(QColor Color); + +/*! + * \brief A function to set the secondary color. + * \param Color - The color to be set as secondary. + */ +void setSecondColor(QColor Color); + +private: +/*! + * \brief The primary color. + */ +QColor firstColor; + +/*! + * \brief The secondary color. + */ +QColor secondColor; +}; + +#endif // INTELLITOOLSETCOLORTOOL_H diff --git a/src/Layer/PaintingArea.cpp b/src/Layer/PaintingArea.cpp index 4a18918..cb65271 100644 --- a/src/Layer/PaintingArea.cpp +++ b/src/Layer/PaintingArea.cpp @@ -21,7 +21,7 @@ PaintingArea::PaintingArea(int maxWidth, int maxHeight, QWidget*parent) : QWidget(parent){ this->Tool = nullptr; - this->setUp(maxWidth, maxHeight); + this->setLayerDimensions(maxWidth, maxHeight); this->addLayer(200,200,0,0,ImageType::Shaped_Image); layerBundle[0].image->drawPlain(QColor(0,0,255,255)); std::vector polygon; @@ -42,7 +42,7 @@ PaintingArea::~PaintingArea(){ delete Tool; } -void PaintingArea::setUp(int maxWidth, int maxHeight){ +void PaintingArea::setLayerDimensions(int maxWidth, int maxHeight){ //set standart parameter this->maxWidth = maxWidth; this->maxHeight = maxHeight; @@ -99,35 +99,35 @@ void PaintingArea::setAlphaOfLayer(int index, int alpha){ } // Used to load the image and place it in the widget -bool PaintingArea::open(const QString &fileName){ +bool PaintingArea::open(const QString &filePath){ if(this->activeLayer==-1) { return false; } IntelliImage* active = layerBundle[static_cast(activeLayer)].image; - bool open = active->loadImage(fileName); + bool open = active->loadImage(filePath); active->calculateVisiblity(); update(); return open; } // Save the current image -bool PaintingArea::save(const QString &fileName, const char*fileFormat){ +bool PaintingArea::save(const QString &filePath, const char*fileFormat){ if(layerBundle.size()==0) { return false; } - this->assembleLayers(true); + this->drawLayers(true); if(!strcmp(fileFormat,"PNG")) { QImage visibleImage = Canvas->convertToFormat(QImage::Format_Indexed8); fileFormat = "png"; - if (visibleImage.save(fileName, fileFormat)) { + if (visibleImage.save(filePath, fileFormat)) { return true; } else { return false; } } - if (Canvas->save(fileName, fileFormat)) { + if (Canvas->save(filePath, fileFormat)) { return true; } else { return false; @@ -151,9 +151,9 @@ void PaintingArea::movePositionActive(int x, int y){ void PaintingArea::moveActiveLayer(int idx){ if(idx==1) { - this->activateUpperLayer(); + this->selectLayerUp(); }else if(idx==-1) { - this->activateLowerLayer(); + this->selectLayerDown(); } } @@ -173,8 +173,8 @@ void PaintingArea::colorPickerSetSecondColor(){ this->colorPicker.setSecondColor(clr); } -void PaintingArea::colorPickerSwitchColor(){ - this->colorPicker.switchColors(); +void PaintingArea::colorPickerSwapColors(){ + this->colorPicker.swapColors(); } void PaintingArea::createPenTool(){ @@ -273,7 +273,7 @@ void PaintingArea::wheelEvent(QWheelEvent*event){ // The QPaintEvent is sent to widgets that need to // update themselves void PaintingArea::paintEvent(QPaintEvent*event){ - this->assembleLayers(); + this->drawLayers(); QPainter painter(this); QRect dirtyRec = event->rect(); @@ -288,25 +288,25 @@ void PaintingArea::resizeEvent(QResizeEvent*event){ update(); } -void PaintingArea::resizeImage(QImage*image_res, const QSize &newSize){ +void PaintingArea::resizeLayer(QImage*image_res, const QSize &newSize){ //TODO implement } -void PaintingArea::activateUpperLayer(){ +void PaintingArea::selectLayerUp(){ if(activeLayer!=-1 && activeLayer0) { std::swap(layerBundle[activeLayer], layerBundle[activeLayer-1]); activeLayer--; } } -void PaintingArea::assembleLayers(bool forSaving){ +void PaintingArea::drawLayers(bool forSaving){ if(forSaving) { Canvas->fill(Qt::GlobalColor::transparent); }else{ diff --git a/src/Layer/PaintingArea.h b/src/Layer/PaintingArea.h index 591f693..27812b1 100644 --- a/src/Layer/PaintingArea.h +++ b/src/Layer/PaintingArea.h @@ -61,14 +61,14 @@ public: * \param fileName - Path and filename which are used to determine where the to-be-opened file is stored * \return Returns a boolean variable whether the file was successfully opened or not */ - bool open(const QString &fileName); + bool open(const QString &filePath); /*! * \brief The save method is used for exporting the current project as one picture * \param fileName * \param fileFormat * \return Returns a boolean variable, true if the file was saved successfully, false if not */ - bool save(const QString &fileName, const char *fileFormat); + bool save(const QString &filePath, const char *fileFormat); /*! * \brief The addLayer adds a layer to the current project/ painting area @@ -90,7 +90,7 @@ public: * \param type - Defining the ImageType of the new layer * \return Returns the id of the layer position */ - int addLayerAt(int idx, int width, int height, int widthOffset=0, int heightOffset=0, ImageType type = ImageType::Raster_Image); + int addLayerAt(int width, int height, int widthOffset=0, int heightOffset=0, ImageType type = ImageType::Raster_Image, int idx); /*! * \brief The deleteLayer method removes a layer at a given index * \param index - The index of the layer to be removed @@ -139,7 +139,7 @@ public: /*! * \brief The colorPickerSwitchColor swaps the primary color with the secondary drawing color */ - void colorPickerSwitchColor(); + void colorPickerSwapColors(); // Create tools void createPenTool(); @@ -187,9 +187,9 @@ protected: void resizeEvent(QResizeEvent *event) override; private: - void setUp(int maxWidth, int maxHeight); - void activateUpperLayer(); - void activateLowerLayer(); + void setLayerDimensions(int maxWidth, int maxHeight); + void selectLayerUp(); + void selectLayerDown(); QImage* Canvas; int maxWidth; @@ -201,12 +201,13 @@ private: std::vector layerBundle; int activeLayer=-1; - void assembleLayers(bool forSaving=false); + void drawLayers(bool forSaving=false); - void resizeImage(QImage *image_res, const QSize &newSize); + void resizeLayer(QImage *image_res, const QSize &newSize); // Helper for Tool - void createTempLayerAfter(int idx); + // TODO: Always create this layer on top and return the id here! + void createTempTopLayer(int idx); }; #endif diff --git a/src/Tool/IntelliTool.cpp b/src/Tool/IntelliTool.cpp index e83fef9..5fdd6d2 100644 --- a/src/Tool/IntelliTool.cpp +++ b/src/Tool/IntelliTool.cpp @@ -48,7 +48,7 @@ void IntelliTool::onWheelScrolled(int value){ } void IntelliTool::createToolLayer(){ - Area->createTempLayerAfter(Area->activeLayer); + Area->createTempTopLayer(Area->activeLayer); this->Active=&Area->layerBundle[Area->activeLayer]; this->Canvas=&Area->layerBundle[Area->activeLayer+1]; } From 7a604c805a495041e2b755131501e658ca975373 Mon Sep 17 00:00:00 2001 From: Mienek Date: Fri, 20 Dec 2019 10:02:56 +0100 Subject: [PATCH 06/44] some fixes only unused Variable and shadowing left --- src/IntelliHelper/IntelliHelper.cpp | 2 +- src/Layer/PaintingArea.cpp | 32 ++++++++++++++--------------- src/Tool/IntelliTool.cpp | 4 ++-- src/Tool/IntelliTool.h | 2 +- src/Tool/IntelliToolCircle.cpp | 14 ++++++------- src/Tool/IntelliToolLine.cpp | 2 +- src/Tool/IntelliToolPolygon.cpp | 8 ++++---- 7 files changed, 32 insertions(+), 32 deletions(-) diff --git a/src/IntelliHelper/IntelliHelper.cpp b/src/IntelliHelper/IntelliHelper.cpp index 0fad4ca..0a8dfb9 100644 --- a/src/IntelliHelper/IntelliHelper.cpp +++ b/src/IntelliHelper/IntelliHelper.cpp @@ -20,7 +20,7 @@ std::vector IntelliHelper::calculateTriangles(std::vector poly QPoint BP(point.x()-post.x(), point.y()-post.y()); float topSclar = AP.x()*BP.x()+AP.y()*BP.y(); - float absolute = sqrt(pow(AP.x(),2.)+pow(AP.y(),2.))*sqrt(pow(BP.x(),2.)+pow(BP.y(),2.)); + float absolute = static_cast(sqrt(pow(AP.x(),2.)+pow(AP.y(),2.))*sqrt(pow(BP.x(),2.)+pow(BP.y(),2.))); return acos(topSclar/absolute); }; diff --git a/src/Layer/PaintingArea.cpp b/src/Layer/PaintingArea.cpp index 4a18918..c27622b 100644 --- a/src/Layer/PaintingArea.cpp +++ b/src/Layer/PaintingArea.cpp @@ -212,11 +212,11 @@ void PaintingArea::createFloodFillTool(){ } int PaintingArea::getWidthOfActive(){ - return this->layerBundle[activeLayer].width; + return this->layerBundle[static_cast(activeLayer)].width; } int PaintingArea::getHeightOfActive(){ - return this->layerBundle[activeLayer].height; + return this->layerBundle[static_cast(activeLayer)].height; } // If a mouse button is pressed check if it was the @@ -225,8 +225,8 @@ int PaintingArea::getHeightOfActive(){ void PaintingArea::mousePressEvent(QMouseEvent*event){ if(Tool == nullptr) return; - int x = event->x()-layerBundle[activeLayer].widthOffset; - int y = event->y()-layerBundle[activeLayer].heightOffset; + int x = event->x()-layerBundle[static_cast(activeLayer)].widthOffset; + int y = event->y()-layerBundle[static_cast(activeLayer)].heightOffset; if(event->button() == Qt::LeftButton) { Tool->onMouseLeftPressed(x, y); }else if(event->button() == Qt::RightButton) { @@ -241,8 +241,8 @@ void PaintingArea::mousePressEvent(QMouseEvent*event){ void PaintingArea::mouseMoveEvent(QMouseEvent*event){ if(Tool == nullptr) return; - int x = event->x()-layerBundle[activeLayer].widthOffset; - int y = event->y()-layerBundle[activeLayer].heightOffset; + int x = event->x()-layerBundle[static_cast(activeLayer)].widthOffset; + int y = event->y()-layerBundle[static_cast(activeLayer)].heightOffset; Tool->onMouseMoved(x, y); update(); } @@ -251,8 +251,8 @@ void PaintingArea::mouseMoveEvent(QMouseEvent*event){ void PaintingArea::mouseReleaseEvent(QMouseEvent*event){ if(Tool == nullptr) return; - int x = event->x()-layerBundle[activeLayer].widthOffset; - int y = event->y()-layerBundle[activeLayer].heightOffset; + int x = event->x()-layerBundle[static_cast(activeLayer)].widthOffset; + int y = event->y()-layerBundle[static_cast(activeLayer)].heightOffset; if(event->button() == Qt::LeftButton) { Tool->onMouseLeftReleased(x, y); }else if(event->button() == Qt::RightButton) { @@ -293,15 +293,15 @@ void PaintingArea::resizeImage(QImage*image_res, const QSize &newSize){ } void PaintingArea::activateUpperLayer(){ - if(activeLayer!=-1 && activeLayer(activeLayer)(activeLayer)], layerBundle[static_cast(activeLayer+1)]); activeLayer++; } } void PaintingArea::activateLowerLayer(){ if(activeLayer!=-1 && activeLayer>0) { - std::swap(layerBundle[activeLayer], layerBundle[activeLayer-1]); + std::swap(layerBundle[static_cast(activeLayer)], layerBundle[static_cast(activeLayer-1)]); activeLayer--; } } @@ -345,11 +345,11 @@ void PaintingArea::createTempLayerAfter(int idx){ if(idx>=0) { LayerObject newLayer; newLayer.alpha = 255; - newLayer.height = layerBundle[idx].height; - newLayer.width = layerBundle[idx].width; - newLayer.heightOffset = layerBundle[idx].heightOffset; - newLayer.widthOffset = layerBundle[idx].widthOffset; - newLayer.image = layerBundle[idx].image->getDeepCopy(); + newLayer.height = layerBundle[static_cast(idx)].height; + newLayer.width = layerBundle[static_cast(idx)].width; + newLayer.heightOffset = layerBundle[static_cast(idx)].heightOffset; + newLayer.widthOffset = layerBundle[static_cast(idx)].widthOffset; + newLayer.image = layerBundle[static_cast(idx)].image->getDeepCopy(); layerBundle.insert(layerBundle.begin()+idx+1,newLayer); } } diff --git a/src/Tool/IntelliTool.cpp b/src/Tool/IntelliTool.cpp index e83fef9..a4edf01 100644 --- a/src/Tool/IntelliTool.cpp +++ b/src/Tool/IntelliTool.cpp @@ -49,8 +49,8 @@ void IntelliTool::onWheelScrolled(int value){ void IntelliTool::createToolLayer(){ Area->createTempLayerAfter(Area->activeLayer); - this->Active=&Area->layerBundle[Area->activeLayer]; - this->Canvas=&Area->layerBundle[Area->activeLayer+1]; + this->Active=&Area->layerBundle[static_cast(Area->activeLayer)]; + this->Canvas=&Area->layerBundle[static_cast(Area->activeLayer+1)]; } void IntelliTool::mergeToolLayer(){ diff --git a/src/Tool/IntelliTool.h b/src/Tool/IntelliTool.h index 3903edb..b1d1910 100644 --- a/src/Tool/IntelliTool.h +++ b/src/Tool/IntelliTool.h @@ -4,7 +4,7 @@ #include "IntelliHelper/IntelliColorPicker.h" #include -class LayerObject; +struct LayerObject; class PaintingArea; /*! diff --git a/src/Tool/IntelliToolCircle.cpp b/src/Tool/IntelliToolCircle.cpp index c602f53..be7cf06 100644 --- a/src/Tool/IntelliToolCircle.cpp +++ b/src/Tool/IntelliToolCircle.cpp @@ -22,18 +22,18 @@ void IntelliToolCircle::drawCyrcle(int radius){ yMax = Middle.y()+radius; // x = x0+-sqrt(r2-(y-y0)2) for(int i=yMin; i<=yMax; i++) { - xMin = Middle.x()-sqrt(pow(radius,2)-pow(i-Middle.y(),2)); - xMax = Middle.x()+sqrt(pow(radius,2)-pow(i-Middle.y(),2)); + xMin = static_cast(Middle.x()-sqrt(pow(radius,2)-pow(i-Middle.y(),2))); + xMax = static_cast(Middle.x()+sqrt(pow(radius,2)-pow(i-Middle.y(),2))); this->Canvas->image->drawLine(QPoint(xMin,i), QPoint(xMax,i),inner,1); } //TODO implement circle drawing algorithm bresenham - radius = radius +(this->edgeWidth/2.)-1.; + radius = static_cast(radius +(this->edgeWidth/2.)-1.); yMin = (Middle.y()-radius); yMax = (Middle.y()+radius); for(int i=yMin; i<=yMax; i++) { - xMin = Middle.x()-sqrt(pow(radius,2)-pow(i-Middle.y(),2)); - xMax = Middle.x()+sqrt(pow(radius,2)-pow(i-Middle.y(),2)); + xMin = static_cast(Middle.x()-sqrt(pow(radius,2)-pow(i-Middle.y(),2))); + xMax = static_cast(Middle.x()+sqrt(pow(radius,2)-pow(i-Middle.y(),2))); this->Canvas->image->drawPoint(QPoint(xMin,i), colorPicker->getFirstColor(),edgeWidth); this->Canvas->image->drawPoint(QPoint(xMax,i), colorPicker->getFirstColor(),edgeWidth); } @@ -41,8 +41,8 @@ void IntelliToolCircle::drawCyrcle(int radius){ xMin = (Middle.x()-radius); xMax = (Middle.x()+radius); for(int i=xMin; i<=xMax; i++) { - int yMin = Middle.y()-sqrt(pow(radius,2)-pow(i-Middle.x(),2)); - int yMax = Middle.y()+sqrt(pow(radius,2)-pow(i-Middle.x(),2)); + int yMin = static_cast(Middle.y()-sqrt(pow(radius,2)-pow(i-Middle.x(),2))); + int yMax = static_cast(Middle.y()+sqrt(pow(radius,2)-pow(i-Middle.x(),2))); this->Canvas->image->drawPoint(QPoint(i, yMin), colorPicker->getFirstColor(),edgeWidth); this->Canvas->image->drawPoint(QPoint(i, yMax), colorPicker->getFirstColor(),edgeWidth); } diff --git a/src/Tool/IntelliToolLine.cpp b/src/Tool/IntelliToolLine.cpp index 39c07a4..50cbc66 100644 --- a/src/Tool/IntelliToolLine.cpp +++ b/src/Tool/IntelliToolLine.cpp @@ -52,7 +52,7 @@ void IntelliToolLine::onMouseMoved(int x, int y){ case LineStyle::DOTTED_LINE: QPoint p1 =start.x() <= next.x() ? start : next; QPoint p2 =start.x() < next.x() ? next : start; - int m = (float)(p2.y()-p1.y())/(float)(p2.x()-p1.x())+0.5f; + int m = static_cast((p2.y()-p1.y())/(p2.x()-p1.x())+0.5f); int c = start.y()-start.x()*m; break; diff --git a/src/Tool/IntelliToolPolygon.cpp b/src/Tool/IntelliToolPolygon.cpp index 4d95ee3..5a254cb 100644 --- a/src/Tool/IntelliToolPolygon.cpp +++ b/src/Tool/IntelliToolPolygon.cpp @@ -7,7 +7,7 @@ IntelliToolPolygon::IntelliToolPolygon(PaintingArea* Area, IntelliColorPicker* colorPicker) : IntelliTool(Area, colorPicker){ this->alphaInner = QInputDialog::getInt(nullptr,"Inner Alpha Value", "Value:", 0,0,255,1); - lineWidth = QInputDialog::getInt(nullptr,"Line Width Input", "Width",1,1,50,1);; + lineWidth = QInputDialog::getInt(nullptr,"Line Width Input", "Width",1,1,50,1); PointIsNearStart = false; isDrawing = false; } @@ -63,9 +63,9 @@ void IntelliToolPolygon::onMouseLeftReleased(int x, int y){ } } } - for(int i=0; iCanvas->image->drawLine(QPointList[i], QPointList[next], colorPicker->getFirstColor(), lineWidth); + 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); } QPointList.clear(); IntelliTool::onMouseLeftReleased(x,y); From d81afbb8ee686e9d7b6c69642f39406761ff7620 Mon Sep 17 00:00:00 2001 From: Conrad Date: Fri, 20 Dec 2019 10:05:57 +0100 Subject: [PATCH 07/44] Refractoring Update 2 - Adjusted variable names to naming conventions - Concluded header files --- src/IntelliHelper/IntelliColorPicker.h | 2 +- .../IntelliColorPicker.h.autosave | 64 ------------------- src/Layer/PaintingArea.cpp | 2 +- src/Layer/PaintingArea.h | 2 +- src/Tool/IntelliTool.cpp | 24 +++---- src/Tool/IntelliTool.h | 4 +- src/Tool/IntelliToolCircle.cpp | 58 ++++++++--------- src/Tool/IntelliToolCircle.h | 8 +-- src/Tool/IntelliToolFloodFill.cpp | 10 +-- src/Tool/IntelliToolLine.cpp | 14 ++-- src/Tool/IntelliToolLine.h | 2 +- src/Tool/IntelliToolPen.cpp | 10 +-- src/Tool/IntelliToolPen.h | 2 +- src/Tool/IntelliToolPolygon.cpp | 18 +++--- src/Tool/IntelliToolPolygon.h | 4 +- src/Tool/IntelliToolRectangle.cpp | 22 +++---- src/Tool/IntelliToolRectangle.h | 4 +- 17 files changed, 93 insertions(+), 157 deletions(-) delete mode 100644 src/IntelliHelper/IntelliColorPicker.h.autosave diff --git a/src/IntelliHelper/IntelliColorPicker.h b/src/IntelliHelper/IntelliColorPicker.h index 817511d..4ea686b 100644 --- a/src/IntelliHelper/IntelliColorPicker.h +++ b/src/IntelliHelper/IntelliColorPicker.h @@ -23,7 +23,7 @@ virtual ~IntelliColorPicker(); /*! * \brief A function switching primary and secondary color. */ -void switchColors(); +void swapColors(); /*! * \brief A function to read the primary selected color. diff --git a/src/IntelliHelper/IntelliColorPicker.h.autosave b/src/IntelliHelper/IntelliColorPicker.h.autosave deleted file mode 100644 index 4ea686b..0000000 --- a/src/IntelliHelper/IntelliColorPicker.h.autosave +++ /dev/null @@ -1,64 +0,0 @@ -#ifndef INTELLITOOLSETCOLORTOOL_H -#define INTELLITOOLSETCOLORTOOL_H - -#include "QColor" -#include "QPoint" -#include "QColorDialog" - -/*! - * \brief The IntelliColorPicker manages the selected colors for one whole project. - */ -class IntelliColorPicker { -public: -/*! - * \brief IntelliColorPicker constructor, setting 2 preset colors, be careful, theese color may change in production. - */ -IntelliColorPicker(); - -/*! - * \brief IntelliColorPicker destructor clears up his used memory, if there is some. - */ -virtual ~IntelliColorPicker(); - -/*! - * \brief A function switching primary and secondary color. - */ -void swapColors(); - -/*! - * \brief A function to read the primary selected color. - * \return Returns the primary color. - */ -QColor getFirstColor(); - -/*! - * \brief A function to read the secondary selected color. - * \return Returns the secondary color. - */ -QColor getSecondColor(); - -/*! - * \brief A function to set the primary color. - * \param Color - The color to be set as primary. - */ -void setFirstColor(QColor Color); - -/*! - * \brief A function to set the secondary color. - * \param Color - The color to be set as secondary. - */ -void setSecondColor(QColor Color); - -private: -/*! - * \brief The primary color. - */ -QColor firstColor; - -/*! - * \brief The secondary color. - */ -QColor secondColor; -}; - -#endif // INTELLITOOLSETCOLORTOOL_H diff --git a/src/Layer/PaintingArea.cpp b/src/Layer/PaintingArea.cpp index cb65271..d6bc34e 100644 --- a/src/Layer/PaintingArea.cpp +++ b/src/Layer/PaintingArea.cpp @@ -341,7 +341,7 @@ void PaintingArea::drawLayers(bool forSaving){ } } -void PaintingArea::createTempLayerAfter(int idx){ +void PaintingArea::createTempTopLayer(int idx){ if(idx>=0) { LayerObject newLayer; newLayer.alpha = 255; diff --git a/src/Layer/PaintingArea.h b/src/Layer/PaintingArea.h index 27812b1..e271a8c 100644 --- a/src/Layer/PaintingArea.h +++ b/src/Layer/PaintingArea.h @@ -90,7 +90,7 @@ public: * \param type - Defining the ImageType of the new layer * \return Returns the id of the layer position */ - int addLayerAt(int width, int height, int widthOffset=0, int heightOffset=0, ImageType type = ImageType::Raster_Image, int idx); + int addLayerAt(int idx, int width, int height, int widthOffset=0, int heightOffset=0, ImageType type = ImageType::Raster_Image); /*! * \brief The deleteLayer method removes a layer at a given index * \param index - The index of the layer to be removed diff --git a/src/Tool/IntelliTool.cpp b/src/Tool/IntelliTool.cpp index 5fdd6d2..e61ff42 100644 --- a/src/Tool/IntelliTool.cpp +++ b/src/Tool/IntelliTool.cpp @@ -12,8 +12,8 @@ IntelliTool::~IntelliTool(){ } void IntelliTool::onMouseRightPressed(int x, int y){ - if(drawing) { - drawing=false; + if(isDrawing) { + isDrawing=false; this->deleteToolLayer(); } } @@ -23,23 +23,23 @@ void IntelliTool::onMouseRightReleased(int x, int y){ } void IntelliTool::onMouseLeftPressed(int x, int y){ - this->drawing=true; + this->isDrawing=true; //create drawing layer this->createToolLayer(); Canvas->image->calculateVisiblity(); } void IntelliTool::onMouseLeftReleased(int x, int y){ - if(drawing) { - drawing=false; + if(isDrawing) { + isDrawing=false; this->mergeToolLayer(); this->deleteToolLayer(); - Active->image->calculateVisiblity(); + activeLayer->image->calculateVisiblity(); } } void IntelliTool::onMouseMoved(int x, int y){ - if(drawing) + if(isDrawing) Canvas->image->calculateVisiblity(); } @@ -49,16 +49,16 @@ void IntelliTool::onWheelScrolled(int value){ void IntelliTool::createToolLayer(){ Area->createTempTopLayer(Area->activeLayer); - this->Active=&Area->layerBundle[Area->activeLayer]; + this->activeLayer=&Area->layerBundle[Area->activeLayer]; this->Canvas=&Area->layerBundle[Area->activeLayer+1]; } void IntelliTool::mergeToolLayer(){ QColor clr_0; QColor clr_1; - for(int y=0; yheight; y++) { - for(int x=0; xwidth; x++) { - clr_0=Active->image->imageData.pixelColor(x,y); + for(int y=0; yheight; y++) { + for(int x=0; xwidth; x++) { + clr_0=activeLayer->image->imageData.pixelColor(x,y); clr_1=Canvas->image->imageData.pixelColor(x,y); float t = static_cast(clr_1.alpha())/255.f; int r =static_cast(static_cast(clr_1.red())*(t)+static_cast(clr_0.red())*(1.f-t)+0.5f); @@ -70,7 +70,7 @@ void IntelliTool::mergeToolLayer(){ clr_0.setBlue(b); clr_0.setAlpha(a); - Active->image->imageData.setPixelColor(x, y, clr_0); + activeLayer->image->imageData.setPixelColor(x, y, clr_0); } } } diff --git a/src/Tool/IntelliTool.h b/src/Tool/IntelliTool.h index 3903edb..1a23b97 100644 --- a/src/Tool/IntelliTool.h +++ b/src/Tool/IntelliTool.h @@ -40,7 +40,7 @@ IntelliColorPicker* colorPicker; /*! * \brief A pointer to the underlying active Layer, do not work on this. This is used for data grabbing or previews. */ -LayerObject* Active; +LayerObject* activeLayer; /*! * \brief A pointer to the drawing canvas of the tool, work on this. @@ -50,7 +50,7 @@ LayerObject* Canvas; /*! * \brief A flag checking if the user is currently drawing or not. */ -bool drawing = false; +bool isDrawing = false; public: /*! diff --git a/src/Tool/IntelliToolCircle.cpp b/src/Tool/IntelliToolCircle.cpp index c602f53..84f8bcb 100644 --- a/src/Tool/IntelliToolCircle.cpp +++ b/src/Tool/IntelliToolCircle.cpp @@ -5,46 +5,46 @@ IntelliToolCircle::IntelliToolCircle(PaintingArea* Area, IntelliColorPicker* colorPicker) : IntelliTool(Area, colorPicker){ - this->alphaInner = QInputDialog::getInt(nullptr,"Inner Alpha Value", "Value:", 0,0,255,1); - this->edgeWidth = QInputDialog::getInt(nullptr,"Outer edge width", "Value:", 0,1,255,1); + 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(){ } -void IntelliToolCircle::drawCyrcle(int radius){ +void IntelliToolCircle::drawCircle(int radius){ int outer = radius+20; QColor inner = this->colorPicker->getSecondColor(); - inner.setAlpha(alphaInner); + inner.setAlpha(innerAlpha); int yMin, yMax, xMin, xMax; - yMin = Middle.y()-radius; - yMax = Middle.y()+radius; + yMin = centerPoint.y()-radius; + yMax = centerPoint.y()+radius; // x = x0+-sqrt(r2-(y-y0)2) for(int i=yMin; i<=yMax; i++) { - xMin = Middle.x()-sqrt(pow(radius,2)-pow(i-Middle.y(),2)); - xMax = Middle.x()+sqrt(pow(radius,2)-pow(i-Middle.y(),2)); + xMin = centerPoint.x()-sqrt(pow(radius,2)-pow(i-centerPoint.y(),2)); + xMax = centerPoint.x()+sqrt(pow(radius,2)-pow(i-centerPoint.y(),2)); this->Canvas->image->drawLine(QPoint(xMin,i), QPoint(xMax,i),inner,1); } //TODO implement circle drawing algorithm bresenham - radius = radius +(this->edgeWidth/2.)-1.; - yMin = (Middle.y()-radius); - yMax = (Middle.y()+radius); + radius = radius +(this->borderWidth/2.)-1.; + yMin = (centerPoint.y()-radius); + yMax = (centerPoint.y()+radius); for(int i=yMin; i<=yMax; i++) { - xMin = Middle.x()-sqrt(pow(radius,2)-pow(i-Middle.y(),2)); - xMax = Middle.x()+sqrt(pow(radius,2)-pow(i-Middle.y(),2)); - this->Canvas->image->drawPoint(QPoint(xMin,i), colorPicker->getFirstColor(),edgeWidth); - this->Canvas->image->drawPoint(QPoint(xMax,i), colorPicker->getFirstColor(),edgeWidth); + xMin = centerPoint.x()-sqrt(pow(radius,2)-pow(i-centerPoint.y(),2)); + xMax = 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); } - xMin = (Middle.x()-radius); - xMax = (Middle.x()+radius); + xMin = (centerPoint.x()-radius); + xMax = (centerPoint.x()+radius); for(int i=xMin; i<=xMax; i++) { - int yMin = Middle.y()-sqrt(pow(radius,2)-pow(i-Middle.x(),2)); - int yMax = Middle.y()+sqrt(pow(radius,2)-pow(i-Middle.x(),2)); - this->Canvas->image->drawPoint(QPoint(i, yMin), colorPicker->getFirstColor(),edgeWidth); - this->Canvas->image->drawPoint(QPoint(i, yMax), colorPicker->getFirstColor(),edgeWidth); + int yMin = centerPoint.y()-sqrt(pow(radius,2)-pow(i-centerPoint.x(),2)); + int yMax = 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); } } @@ -58,9 +58,9 @@ void IntelliToolCircle::onMouseRightReleased(int x, int y){ void IntelliToolCircle::onMouseLeftPressed(int x, int y){ IntelliTool::onMouseLeftPressed(x,y); - this->Middle=QPoint(x,y); + this->centerPoint=QPoint(x,y); int radius = 1; - drawCyrcle(radius); + drawCircle(radius); Canvas->image->calculateVisiblity(); } @@ -70,18 +70,18 @@ void IntelliToolCircle::onMouseLeftReleased(int x, int y){ void IntelliToolCircle::onWheelScrolled(int value){ IntelliTool::onWheelScrolled(value); - this->edgeWidth+=value; - if(this->edgeWidth<=0) { - this->edgeWidth=1; + this->borderWidth+=value; + if(this->borderWidth<=0) { + this->borderWidth=1; } } void IntelliToolCircle::onMouseMoved(int x, int y){ - if(this->drawing) { + if(this->isDrawing) { this->Canvas->image->drawPlain(Qt::transparent); QPoint next(x,y); - int radius = static_cast(sqrt(pow((Middle.x()-x),2)+pow((Middle.y()-y),2))); - drawCyrcle(radius); + int radius = static_cast(sqrt(pow((centerPoint.x()-x),2)+pow((centerPoint.y()-y),2))); + drawCircle(radius); } IntelliTool::onMouseMoved(x,y); } diff --git a/src/Tool/IntelliToolCircle.h b/src/Tool/IntelliToolCircle.h index a748950..94f34e1 100644 --- a/src/Tool/IntelliToolCircle.h +++ b/src/Tool/IntelliToolCircle.h @@ -12,22 +12,22 @@ class IntelliToolCircle : public IntelliTool { * \brief A function that implements a circle drawing algorithm. * \param radius - The radius of the circle. */ -void drawCyrcle(int radius); +void drawCircle(int radius); /*! * \brief The center of the circle. */ -QPoint Middle; +QPoint centerPoint; /*! * \brief The alpha value of the inner circle. */ -int alphaInner; +int innerAlpha; /*! * \brief The width of the outer circle edge. */ -int edgeWidth; +int borderWidth; public: /*! * \brief A constructor setting the general paintingArea and colorPicker. And reading in the inner alpha and edgeWidth. diff --git a/src/Tool/IntelliToolFloodFill.cpp b/src/Tool/IntelliToolFloodFill.cpp index 1c4fcac..d0dcc34 100644 --- a/src/Tool/IntelliToolFloodFill.cpp +++ b/src/Tool/IntelliToolFloodFill.cpp @@ -31,7 +31,7 @@ void IntelliToolFloodFill::onMouseLeftPressed(int x, int y){ std::queue Q; Q.push(start); - QColor oldColor = this->Active->image->getPixelColor(start); + QColor oldColor = this->activeLayer->image->getPixelColor(start); QColor newColor = this->colorPicker->getFirstColor(); Canvas->image->drawPixel(start,newColor); @@ -44,19 +44,19 @@ void IntelliToolFloodFill::onMouseLeftPressed(int x, int y){ right = QPoint(Current.x()+1,Current.y() ); top = QPoint(Current.x(),Current.y()-1); down = QPoint(Current.x(),Current.y()+1); - if((right.x() < Canvas->width) && (Canvas->image->getPixelColor(right) != newColor) && (Active->image->getPixelColor(right) == oldColor)) { + if((right.x() < Canvas->width) && (Canvas->image->getPixelColor(right) != newColor) && (activeLayer->image->getPixelColor(right) == oldColor)) { Canvas->image->drawPixel(right,newColor); Q.push(right); } - if((left.x() >= 0) && (Canvas->image->getPixelColor(left) != newColor) && (Active->image->getPixelColor(left) == oldColor)) { + if((left.x() >= 0) && (Canvas->image->getPixelColor(left) != newColor) && (activeLayer->image->getPixelColor(left) == oldColor)) { Canvas->image->drawPixel(left,newColor); Q.push(left); } - if((top.y() >= 0) && (Canvas->image->getPixelColor(top) != newColor) && (Active->image->getPixelColor(top) == oldColor)) { + if((top.y() >= 0) && (Canvas->image->getPixelColor(top) != newColor) && (activeLayer->image->getPixelColor(top) == oldColor)) { Canvas->image->drawPixel(top,newColor); Q.push(top); } - if((down.y() < Canvas->height) && (Canvas->image->getPixelColor(down) != newColor) && (Active->image->getPixelColor(down) == oldColor)) { + if((down.y() < Canvas->height) && (Canvas->image->getPixelColor(down) != newColor) && (activeLayer->image->getPixelColor(down) == oldColor)) { Canvas->image->drawPixel(down,newColor); Q.push(down); } diff --git a/src/Tool/IntelliToolLine.cpp b/src/Tool/IntelliToolLine.cpp index 39c07a4..26636e4 100644 --- a/src/Tool/IntelliToolLine.cpp +++ b/src/Tool/IntelliToolLine.cpp @@ -24,8 +24,8 @@ void IntelliToolLine::onMouseRightReleased(int x, int y){ void IntelliToolLine::onMouseLeftPressed(int x, int y){ IntelliTool::onMouseLeftPressed(x,y); - this->start=QPoint(x,y); - this->Canvas->image->drawPoint(start, colorPicker->getFirstColor(),lineWidth); + this->lineStartingPoint=QPoint(x,y); + this->Canvas->image->drawPoint(lineStartingPoint, colorPicker->getFirstColor(),lineWidth); Canvas->image->calculateVisiblity(); } @@ -42,18 +42,18 @@ void IntelliToolLine::onWheelScrolled(int value){ } void IntelliToolLine::onMouseMoved(int x, int y){ - if(this->drawing) { + if(this->isDrawing) { this->Canvas->image->drawPlain(Qt::transparent); QPoint next(x,y); switch(lineStyle) { case LineStyle::SOLID_LINE: - this->Canvas->image->drawLine(start,next,colorPicker->getFirstColor(),lineWidth); + this->Canvas->image->drawLine(lineStartingPoint,next,colorPicker->getFirstColor(),lineWidth); break; case LineStyle::DOTTED_LINE: - QPoint p1 =start.x() <= next.x() ? start : next; - QPoint p2 =start.x() < next.x() ? next : start; + QPoint p1 =lineStartingPoint.x() <= next.x() ? lineStartingPoint : next; + QPoint p2 =lineStartingPoint.x() < next.x() ? next : lineStartingPoint; int m = (float)(p2.y()-p1.y())/(float)(p2.x()-p1.x())+0.5f; - int c = start.y()-start.x()*m; + int c = lineStartingPoint.y()-lineStartingPoint.x()*m; break; } diff --git a/src/Tool/IntelliToolLine.h b/src/Tool/IntelliToolLine.h index 3463092..c134c34 100644 --- a/src/Tool/IntelliToolLine.h +++ b/src/Tool/IntelliToolLine.h @@ -19,7 +19,7 @@ class IntelliToolLine : public IntelliTool { /*! * \brief The starting point of the line. */ -QPoint start; +QPoint lineStartingPoint; /*! * \brief The width of the line to draw. diff --git a/src/Tool/IntelliToolPen.cpp b/src/Tool/IntelliToolPen.cpp index 7b12270..30ff5fe 100644 --- a/src/Tool/IntelliToolPen.cpp +++ b/src/Tool/IntelliToolPen.cpp @@ -23,8 +23,8 @@ void IntelliToolPen::onMouseRightReleased(int x, int y){ void IntelliToolPen::onMouseLeftPressed(int x, int y){ IntelliTool::onMouseLeftPressed(x,y); - this->point=QPoint(x,y); - this->Canvas->image->drawPixel(point, colorPicker->getFirstColor()); + this->previousPoint=QPoint(x,y); + this->Canvas->image->drawPixel(previousPoint, colorPicker->getFirstColor()); Canvas->image->calculateVisiblity(); } @@ -33,10 +33,10 @@ void IntelliToolPen::onMouseLeftReleased(int x, int y){ } void IntelliToolPen::onMouseMoved(int x, int y){ - if(this->drawing) { + if(this->isDrawing) { QPoint newPoint(x,y); - this->Canvas->image->drawLine(this->point, newPoint, colorPicker->getFirstColor(), penWidth); - this->point=newPoint; + this->Canvas->image->drawLine(this->previousPoint, newPoint, colorPicker->getFirstColor(), penWidth); + this->previousPoint=newPoint; } IntelliTool::onMouseMoved(x,y); } diff --git a/src/Tool/IntelliToolPen.h b/src/Tool/IntelliToolPen.h index 22694f7..1a8985e 100644 --- a/src/Tool/IntelliToolPen.h +++ b/src/Tool/IntelliToolPen.h @@ -15,7 +15,7 @@ int penWidth; /*! * \brief point - Represents the previous point to help drawing a line. */ -QPoint point; +QPoint previousPoint; public: /*! * \brief A constructor setting the general paintingArea and colorPicker. Reading the penWidth. diff --git a/src/Tool/IntelliToolPolygon.cpp b/src/Tool/IntelliToolPolygon.cpp index 4d95ee3..02444ad 100644 --- a/src/Tool/IntelliToolPolygon.cpp +++ b/src/Tool/IntelliToolPolygon.cpp @@ -6,9 +6,9 @@ IntelliToolPolygon::IntelliToolPolygon(PaintingArea* Area, IntelliColorPicker* colorPicker) : IntelliTool(Area, colorPicker){ - this->alphaInner = QInputDialog::getInt(nullptr,"Inner Alpha Value", "Value:", 0,0,255,1); + this->innerAlpha = QInputDialog::getInt(nullptr,"Inner Alpha Value", "Value:", 0,0,255,1); lineWidth = QInputDialog::getInt(nullptr,"Line Width Input", "Width",1,1,50,1);; - PointIsNearStart = false; + isPointNearStart = false; isDrawing = false; } @@ -28,7 +28,7 @@ void IntelliToolPolygon::onMouseLeftPressed(int x, int y){ this->Canvas->image->calculateVisiblity(); } else if(isDrawing && isNearStart(x,y,QPointList.front())) { - PointIsNearStart = true; + isPointNearStart = true; this->Canvas->image->drawLine(QPointList.back(), QPointList.front(), colorPicker->getFirstColor(), lineWidth); this->Canvas->image->calculateVisiblity(); } @@ -42,21 +42,21 @@ void IntelliToolPolygon::onMouseLeftPressed(int x, int y){ void IntelliToolPolygon::onMouseRightPressed(int x, int y){ isDrawing = false; - PointIsNearStart = false; + isPointNearStart = false; QPointList.clear(); IntelliTool::onMouseRightPressed(x,y); } void IntelliToolPolygon::onMouseLeftReleased(int x, int y){ - if(PointIsNearStart && QPointList.size() > 1) { - PointIsNearStart = false; + if(isPointNearStart && QPointList.size() > 1) { + isPointNearStart = false; isDrawing = false; std::vector Triangles = IntelliHelper::calculateTriangles(QPointList); QPoint Point; QColor colorTwo(colorPicker->getSecondColor()); - colorTwo.setAlpha(alphaInner); - for(int i = 0; i < Active->width; i++) { - for(int j = 0; j < Active->height; j++) { + colorTwo.setAlpha(innerAlpha); + 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)) { this->Canvas->image->drawPixel(Point, colorTwo); diff --git a/src/Tool/IntelliToolPolygon.h b/src/Tool/IntelliToolPolygon.h index 1d7228d..297173f 100644 --- a/src/Tool/IntelliToolPolygon.h +++ b/src/Tool/IntelliToolPolygon.h @@ -32,12 +32,12 @@ bool isDrawing; /*! * \brief PointIsNearStart true, when last click near startpoint, else false. */ -bool PointIsNearStart; +bool isPointNearStart; /*! * \brief The alpha value of the inner circle. */ -int alphaInner; +int innerAlpha; /*! * \brief QPointList list of all points of the polygon. diff --git a/src/Tool/IntelliToolRectangle.cpp b/src/Tool/IntelliToolRectangle.cpp index d2cc49a..8a429fa 100644 --- a/src/Tool/IntelliToolRectangle.cpp +++ b/src/Tool/IntelliToolRectangle.cpp @@ -4,8 +4,8 @@ IntelliToolRectangle::IntelliToolRectangle(PaintingArea* Area, IntelliColorPicker* colorPicker) : IntelliTool(Area, colorPicker){ - this->alphaInner = QInputDialog::getInt(nullptr,"Inner Alpha Value", "Value:", 0,0,255,1); - this->edgeWidth = QInputDialog::getInt(nullptr,"Outer edge width", "Value:", 0,1,255,1); + 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(){ @@ -20,14 +20,14 @@ void IntelliToolRectangle::drawRectangle(QPoint otherCorner){ int yMax = std::max(originCorner.y(), otherCorner.y()); QColor clr = colorPicker->getSecondColor(); - clr.setAlpha(alphaInner); + clr.setAlpha(innerAlpha); 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(), edgeWidth); - this->Canvas->image->drawLine(QPoint(xMin, yMin),QPoint(xMax, yMin), this->colorPicker->getFirstColor(), edgeWidth); - this->Canvas->image->drawLine(QPoint(xMax, yMax),QPoint(xMin, yMax), this->colorPicker->getFirstColor(), edgeWidth); - this->Canvas->image->drawLine(QPoint(xMax, yMax),QPoint(xMax, yMin), this->colorPicker->getFirstColor(), edgeWidth); + 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); } void IntelliToolRectangle::onMouseRightPressed(int x, int y){ @@ -50,7 +50,7 @@ void IntelliToolRectangle::onMouseLeftReleased(int x, int y){ } void IntelliToolRectangle::onMouseMoved(int x, int y){ - if(this->drawing) { + if(this->isDrawing) { this->Canvas->image->drawPlain(Qt::transparent); QPoint next(x,y); drawRectangle(next); @@ -60,8 +60,8 @@ void IntelliToolRectangle::onMouseMoved(int x, int y){ void IntelliToolRectangle::onWheelScrolled(int value){ IntelliTool::onWheelScrolled(value); - this->edgeWidth+=value; - if(this->edgeWidth<=0) { - this->edgeWidth=1; + this->borderWidth+=value; + if(this->borderWidth<=0) { + this->borderWidth=1; } } diff --git a/src/Tool/IntelliToolRectangle.h b/src/Tool/IntelliToolRectangle.h index e9db958..31d9edd 100644 --- a/src/Tool/IntelliToolRectangle.h +++ b/src/Tool/IntelliToolRectangle.h @@ -22,11 +22,11 @@ QPoint originCorner; /*! * \brief alphaInner- Represents the alpha value of the inside. */ -int alphaInner; +int innerAlpha; /*! * \brief edgeWidth - The width of the rectangle edges. */ -int edgeWidth; +int borderWidth; public: /*! * \brief A constructor setting the general paintingArea and colorPicker. And reading in the alphaInner and edgeWidth. From 8efe6836bfe2a9accca9f7258086f3d18a6baf46 Mon Sep 17 00:00:00 2001 From: Conrad Date: Fri, 20 Dec 2019 10:42:49 +0100 Subject: [PATCH 08/44] Reworked some method names --- src/GUI/IntelliPhotoGui.cpp | 4 ++-- src/Layer/PaintingArea.cpp | 6 +++--- src/Layer/PaintingArea.h | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/GUI/IntelliPhotoGui.cpp b/src/GUI/IntelliPhotoGui.cpp index a2b0206..b265400 100644 --- a/src/GUI/IntelliPhotoGui.cpp +++ b/src/GUI/IntelliPhotoGui.cpp @@ -120,7 +120,7 @@ void IntelliPhotoGui::slotSetActiveAlpha(){ 255,0, 255, 1, &ok2); if (ok1&&ok2) { - paintingArea->setAlphaOfLayer(layer,alpha); + paintingArea->setLayerAlpha(layer,alpha); } } @@ -194,7 +194,7 @@ void IntelliPhotoGui::slotSetActiveLayer(){ -1,0,255,1, &ok1); if (ok1) { - paintingArea->setLayerToActive(layer); + paintingArea->setLayerActive(layer); } } diff --git a/src/Layer/PaintingArea.cpp b/src/Layer/PaintingArea.cpp index 29f1908..f4f92f9 100644 --- a/src/Layer/PaintingArea.cpp +++ b/src/Layer/PaintingArea.cpp @@ -86,13 +86,13 @@ void PaintingArea::slotDeleteActiveLayer(){ } } -void PaintingArea::setLayerToActive(int index){ +void PaintingArea::setLayerActive(int index){ if(index>=0&&index(layerBundle.size())) { this->activeLayer=index; } } -void PaintingArea::setAlphaOfLayer(int index, int alpha){ +void PaintingArea::setLayerAlpha(int index, int alpha){ if(index>=0&&index(layerBundle.size())) { layerBundle[static_cast(index)].alpha=alpha; } @@ -159,7 +159,7 @@ void PaintingArea::moveActiveLayer(int idx){ void PaintingArea::slotActivateLayer(int a){ if(a>=0 && a < static_cast(layerBundle.size())) { - this->setLayerToActive(a); + this->setLayerActive(a); } } diff --git a/src/Layer/PaintingArea.h b/src/Layer/PaintingArea.h index e271a8c..05267c8 100644 --- a/src/Layer/PaintingArea.h +++ b/src/Layer/PaintingArea.h @@ -100,13 +100,13 @@ public: * \brief The setLayerToActive method marks a specific layer as active * \param index - Index of the layer to be active */ - void setLayerToActive(int index); + void setLayerActive(int index); /*! * \brief The setAlphaOfLayer method sets the alpha value of a specific layer * \param index - Index of the layer where the change should be applied * \param alpha - New alpha value of the layer */ - void setAlphaOfLayer(int index, int alpha); + void setLayerAlpha(int index, int alpha); /*! * \brief The floodFill method fills a the active layer with a given color * \param r - Red value of the color the layer should be filled with From a832295d7fcf9883996aa56e64f9fe72b37af81f Mon Sep 17 00:00:00 2001 From: Conrad Date: Mon, 6 Jan 2020 19:36:44 +0100 Subject: [PATCH 09/44] Added UML Diagram @Jan --- docs/UML.uxf | 531 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 531 insertions(+) create mode 100644 docs/UML.uxf diff --git a/docs/UML.uxf b/docs/UML.uxf new file mode 100644 index 0000000..10a958b --- /dev/null +++ b/docs/UML.uxf @@ -0,0 +1,531 @@ + + + 10 + + UMLClass + + 2080 + 180 + 320 + 180 + + /*IntelliImage*/ +-- +#imageData: QImage +-- +#resizeImage(image, newSize): void ++drawPixel(p1, color): void ++drawLine(p1, p2, color, penWidth): void ++drawPlain(color): void +/+getDisplayable(displaySize, alpha): QImage/ ++loadImage(fileName): Boolean ++getPixelColor(point): QColor +... + + + + UMLClass + + 2090 + 490 + 310 + 80 + + *IntelliRasterImage* +-- +-- +#calculateVisibility(): void ++getDisplayable(displaySize, alpha): QImage +... + + + + UMLClass + + 2080 + 770 + 320 + 150 + + *IntelliShapedImage* +-- +-triangles: vector<Triangle> +#polygonData: vector<QPoint> +-- +-calculateVisibility(): void ++getDisplayable(displaySize, alpha): QImage ++getPolygonData(): vector<QPoint> ++setPolygon(polygonData): void +... + + + + UMLClass + + 240 + 180 + 290 + 230 + + /*IntelliTool*/ +-- +#Area: PaintingArea +#colorPicker: IntelliColorPicker +#Active: LayerObject +#Canvas: LayerObject +#drawing: Boolean +-- +/+onMouseRightPressed(x,y): void/ +/+onMouseLeftPressed(x,y): void/ +/+onMouseRightReleased(x,y): void/ +/+onMousLeftReleased(x,y): void/ +/+onWheelScrolled(value): void/ +/+onMouseMoved(x,y): void/ +... + + + + Relation + + 2170 + 350 + 30 + 160 + + lt=<<- + 10.0;10.0;10.0;140.0 + + + Relation + + 2170 + 560 + 30 + 230 + + lt=<<- + 10.0;10.0;10.0;210.0 + + + UMLClass + + 1300 + 290 + 240 + 80 + + <<Enumeration>> +*ImageType* +-- + RASTERIMAGE + SHAPEDIMAGE + + + + UMLClass + + 0 + 1030 + 250 + 150 + + *IntelliToolFloodFill* +-- +-- ++onMouseRightPressed(x,y): void ++onMouseLeftPressed(x,y): void ++onMouseRightReleased(x,y): void ++onMousLeftReleased(x,y): void ++onWheelScrolled(value): void ++onMouseMoved(x,y): void +... + + + + UMLClass + + 0 + 570 + 250 + 150 + + *IntelliToolPlain* +-- +-- ++onMouseRightPressed(x,y): void ++onMouseLeftPressed(x,y): void ++onMouseRightReleased(x,y): void ++onMousLeftReleased(x,y): void ++onWheelScrolled(value): void ++onMouseMoved(x,y): void +... + + + + UMLClass + + 880 + 570 + 240 + 180 + + *IntelliToolPen* +-- +-penWidth: Integer +-point: QPoint +-- ++onMouseRightPressed(x,y): void ++onMouseLeftPressed(x,y): void ++onMouseRightReleased(x,y): void ++onMousLeftReleased(x,y): void ++onWheelScrolled(value): void ++onMouseMoved(x,y): void +... + + + + UMLClass + + 880 + 1050 + 250 + 180 + + *IntelliToolRectangle* +-- +-alphaInner: Integer +-edgeWidth: Integer +-- ++onMouseRightPressed(x,y): void ++onMouseLeftPressed(x,y): void ++onMouseRightReleased(x,y): void ++onMousLeftReleased(x,y): void ++onWheelScrolled(value): void ++onMouseMoved(x,y): void +... + + + + UMLClass + + 880 + 790 + 240 + 200 + + *IntelliToolLine* +-- +-start: QPoint +-lineWidth: Integer +-lineStyle: LineStyle +-- ++onMouseRightPressed(x,y): void ++onMouseLeftPressed(x,y): void ++onMouseRightReleased(x,y): void ++onMousLeftReleased(x,y): void ++onWheelScrolled(value): void ++onMouseMoved(x,y): void +... + + + + UMLClass + + 350 + 760 + 250 + 210 + + *IntelliToolPolygon* +-- +-lineWidth: Integer +-iDrawing: Boolean +-PointIsNearStart: Boolean +-alphaInner: Integer +-- ++onMouseRightPressed(x,y): void ++onMouseLeftPressed(x,y): void ++onMouseRightReleased(x,y): void ++onMousLeftReleased(x,y): void ++onWheelScrolled(value): void ++onMouseMoved(x,y): void +... + + + + Relation + + 500 + 400 + 400 + 190 + + lt=<<- + 10.0;10.0;380.0;170.0 + + + Relation + + 240 + 400 + 100 + 650 + + lt=<<- + 80.0;10.0;10.0;630.0 + + + Relation + + 110 + 400 + 160 + 190 + + lt=<<- + 140.0;10.0;10.0;170.0 + + + Relation + + 370 + 400 + 540 + 670 + + lt=<<- + 10.0;10.0;520.0;650.0 + + + Relation + + 420 + 400 + 480 + 410 + + lt=<<- + 10.0;10.0;460.0;390.0 + + + Relation + + 340 + 400 + 140 + 380 + + lt=<<- + 10.0;10.0;120.0;360.0 + + + UMLClass + + 0 + 770 + 250 + 200 + + *IntelliToolCircle* +-- +-Middle: QPoint +-alphaInner: Integer +-edgeWidth: Integer +-- ++onMouseRightPressed(x,y): void ++onMouseLeftPressed(x,y): void ++onMouseRightReleased(x,y): void ++onMousLeftReleased(x,y): void ++onWheelScrolled(value): void ++onMouseMoved(x,y): void +... + + + + Relation + + 240 + 400 + 80 + 390 + + lt=<<- + 60.0;10.0;10.0;370.0 + + + UMLClass + + 1790 + 180 + 280 + 410 + + *PaintingArea* +-- +-Canvas: QImage +-maxWidth: Integer +-maxHeigth: Integer +-Tool: IntelliTool +-colorPicker: IntelliColorPicker +-layerBundle: vector<LayerObject> +-activeLayer: Integer +-- ++open(fileName): Boolean ++save(fileName, fileFormat): void ++addLayer(width, heigth, widthOffset, +heigthOffset, ImageType): Integer ++addLayerAt(idx, width, heigth, widthOffset, +heigthOffset, ImageType): Integer ++deleteLayer(index): void ++setLayerToActive(index): void ++movePositionActive(x,y): void ++moveActiveLayer(idx): void ++setAlphaOfLayer(index, alpha): void ++floodFill(r,g,b,a): void ++getWidthOfActive(): Integer ++getHeigthOfActive(): Integer +-- + Also overrides every Inputevent and + creates every Tool. + +group=1 + + + + UMLClass + + 1550 + 180 + 230 + 150 + + <<dataType>> +*LayerObject* +-- ++image: IntelliImage ++width: Integer ++heigth: Integer ++widthOffset: Integer ++heigthOffset: Integer ++alpha: Integer +-- + + + + UMLClass + + 690 + 180 + 320 + 90 + + /*IntelliHelper*/ +-- +-- ++isInTriangle(tri, P): Boolean ++calculateTriangles(polyPoints): vector<Triangle> ++isInPolygon(triangles, point): Boolean + + + + UMLClass + + 1300 + 180 + 240 + 80 + + <<Enumeration>> +*LineStyle* +-- + SOLID + DOTTED + + + + UMLClass + + 1040 + 180 + 250 + 150 + + /*IntelliColorPicker*/ +-- +-firstColor: QColor +-secondColor: QColor +-- ++switchColors(): void ++setFirstColor(Color): void ++setSecondColor(Color): void ++getFirstColor(): QColor ++getSecondColor(): QColor + + + + UMLClass + + 1550 + 340 + 230 + 100 + + <<dataType>> +*Triangle* +-- ++A: QPoint ++B: QPoint ++C: QPoint +-- + + + + UMLClass + + 1550 + 450 + 230 + 70 + + <<dataType>> +*QImage* +-- +-- +-- + Handles the ImageData + + + + UMLClass + + 1550 + 530 + 230 + 70 + + <<dataType>> +*QPoint* +-- +-- +-- + Handles points with x,y,z. + + + + UMLClass + + 1550 + 620 + 230 + 90 + + <<dataType>> +*vector<T>* +-- +-- +-- + Is a Vector of witch contains + data with equal type as type T. + + + From 28b8d92d72eddc7476c1fe8a73634a7ecf61d024 Mon Sep 17 00:00:00 2001 From: AshBastian Date: Tue, 7 Jan 2020 15:23:14 +0100 Subject: [PATCH 10/44] BugFixes --- src/GUI/IntelliPhotoGui.cpp | 8 ++++---- src/Layer/PaintingArea.cpp | 32 +++++++++++++++++++++++++++++-- src/Layer/PaintingArea.h | 1 + src/Tool/IntelliTool.cpp | 8 ++++++++ src/Tool/IntelliTool.h | 15 +++++++++++++++ src/Tool/IntelliToolCircle.cpp | 3 ++- src/Tool/IntelliToolFloodFill.cpp | 3 ++- src/Tool/IntelliToolLine.cpp | 3 ++- src/Tool/IntelliToolPen.cpp | 3 ++- src/Tool/IntelliToolPen.h | 1 + src/Tool/IntelliToolPlain.cpp | 3 ++- src/Tool/IntelliToolPolygon.cpp | 23 ++++++++++++++++------ src/Tool/IntelliToolRectangle.cpp | 3 ++- 13 files changed, 88 insertions(+), 18 deletions(-) diff --git a/src/GUI/IntelliPhotoGui.cpp b/src/GUI/IntelliPhotoGui.cpp index b265400..6901c10 100644 --- a/src/GUI/IntelliPhotoGui.cpp +++ b/src/GUI/IntelliPhotoGui.cpp @@ -402,13 +402,13 @@ void IntelliPhotoGui::createMenus(){ //Attach all Tool Options toolMenu = new QMenu(tr("&Tools"), this); + toolMenu->addAction(actionCreateCircleTool); + toolMenu->addAction(actionCreateFloodFillTool); + toolMenu->addAction(actionCreateLineTool); toolMenu->addAction(actionCreatePenTool); toolMenu->addAction(actionCreatePlainTool); - toolMenu->addAction(actionCreateLineTool); + toolMenu->addAction(actionCreatePolygonTool); toolMenu->addAction(actionCreateRectangleTool); - toolMenu->addAction(actionCreateCircleTool); - toolMenu->addAction(actionCreatePolygonTool); - toolMenu->addAction(actionCreateFloodFillTool); toolMenu->addSeparator(); toolMenu->addMenu(colorMenu); diff --git a/src/Layer/PaintingArea.cpp b/src/Layer/PaintingArea.cpp index f4f92f9..4bf1c77 100644 --- a/src/Layer/PaintingArea.cpp +++ b/src/Layer/PaintingArea.cpp @@ -20,7 +20,7 @@ PaintingArea::PaintingArea(int maxWidth, int maxHeight, QWidget*parent) : QWidget(parent){ - this->Tool = nullptr; + this->Tool = nullptr; this->setLayerDimensions(maxWidth, maxHeight); this->addLayer(200,200,0,0,ImageType::Shaped_Image); layerBundle[0].image->drawPlain(QColor(0,0,255,255)); @@ -145,11 +145,21 @@ void PaintingArea::floodFill(int r, int g, int b, int a){ } void PaintingArea::movePositionActive(int x, int y){ - layerBundle[static_cast(activeLayer)].widthOffset += x; + if(Tool->getIsDrawing()){ + IntelliTool* temp = copyActiveTool(); + delete this->Tool; + this->Tool = temp; + } + layerBundle[static_cast(activeLayer)].widthOffset += x; layerBundle[static_cast(activeLayer)].heightOffset += y; } void PaintingArea::moveActiveLayer(int idx){ + if(Tool->getIsDrawing()){ + IntelliTool* temp = copyActiveTool(); + delete this->Tool; + this->Tool = temp; + } if(idx==1) { this->selectLayerUp(); }else if(idx==-1) { @@ -158,6 +168,11 @@ void PaintingArea::moveActiveLayer(int idx){ } void PaintingArea::slotActivateLayer(int a){ + if(Tool->getIsDrawing()){ + IntelliTool* temp = copyActiveTool(); + delete this->Tool; + this->Tool = temp; + } if(a>=0 && a < static_cast(layerBundle.size())) { this->setLayerActive(a); } @@ -353,3 +368,16 @@ void PaintingArea::createTempTopLayer(int idx){ layerBundle.insert(layerBundle.begin()+idx+1,newLayer); } } + +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); + default: return nullptr; + } +} diff --git a/src/Layer/PaintingArea.h b/src/Layer/PaintingArea.h index 05267c8..9719ac0 100644 --- a/src/Layer/PaintingArea.h +++ b/src/Layer/PaintingArea.h @@ -190,6 +190,7 @@ private: void setLayerDimensions(int maxWidth, int maxHeight); void selectLayerUp(); void selectLayerDown(); + IntelliTool* copyActiveTool(); QImage* Canvas; int maxWidth; diff --git a/src/Tool/IntelliTool.cpp b/src/Tool/IntelliTool.cpp index b20c4d1..671a50f 100644 --- a/src/Tool/IntelliTool.cpp +++ b/src/Tool/IntelliTool.cpp @@ -79,3 +79,11 @@ void IntelliTool::deleteToolLayer(){ Area->deleteLayer(Area->activeLayer+1); this->Canvas=nullptr; } + +IntelliTool::Tooltype IntelliTool::getTooltype(){ + return ActiveType; +} + +bool IntelliTool::getIsDrawing(){ + return isDrawing; +} diff --git a/src/Tool/IntelliTool.h b/src/Tool/IntelliTool.h index 26b89be..b7d86a5 100644 --- a/src/Tool/IntelliTool.h +++ b/src/Tool/IntelliTool.h @@ -11,6 +11,16 @@ class PaintingArea; * \brief An abstract class that manages the basic events, like mouse clicks or scrolls events. */ class IntelliTool { +public: + enum class Tooltype{ + CIRCLE, + FLOODFILL, + LINE, + PEN, + PLAIN, + POLYGON, + RECTANGLE + }; private: /*! * \brief A function that creates a layer to draw on. @@ -32,6 +42,8 @@ protected: */ PaintingArea* Area; +Tooltype ActiveType; + /*! * \brief A pointer to the IntelliColorPicker of the PaintingArea to interact with, and get the colors. */ @@ -106,6 +118,9 @@ virtual void onWheelScrolled(int value); */ virtual void onMouseMoved(int x, int y); +Tooltype getTooltype(); + +bool getIsDrawing(); }; #endif diff --git a/src/Tool/IntelliToolCircle.cpp b/src/Tool/IntelliToolCircle.cpp index 33a5016..67a7e16 100644 --- a/src/Tool/IntelliToolCircle.cpp +++ b/src/Tool/IntelliToolCircle.cpp @@ -7,10 +7,11 @@ IntelliToolCircle::IntelliToolCircle(PaintingArea* Area, IntelliColorPicker* col : 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); + this->ActiveType = Tooltype::CIRCLE; } IntelliToolCircle::~IntelliToolCircle(){ - + IntelliTool::onMouseRightPressed(0,0); } void IntelliToolCircle::drawCircle(int radius){ diff --git a/src/Tool/IntelliToolFloodFill.cpp b/src/Tool/IntelliToolFloodFill.cpp index d0dcc34..c91b961 100644 --- a/src/Tool/IntelliToolFloodFill.cpp +++ b/src/Tool/IntelliToolFloodFill.cpp @@ -7,10 +7,11 @@ IntelliToolFloodFill::IntelliToolFloodFill(PaintingArea* Area, IntelliColorPicker* colorPicker) : IntelliTool(Area, colorPicker){ + this->ActiveType = Tooltype::FLOODFILL; } IntelliToolFloodFill::~IntelliToolFloodFill(){ - + IntelliTool::onMouseRightPressed(0,0); } void IntelliToolFloodFill::onMouseRightPressed(int x, int y){ diff --git a/src/Tool/IntelliToolLine.cpp b/src/Tool/IntelliToolLine.cpp index 71f67c0..e91af5d 100644 --- a/src/Tool/IntelliToolLine.cpp +++ b/src/Tool/IntelliToolLine.cpp @@ -6,12 +6,13 @@ IntelliToolLine::IntelliToolLine(PaintingArea* Area, IntelliColorPicker* colorPicker) : IntelliTool(Area, colorPicker){ this->lineWidth = QInputDialog::getInt(nullptr,"Line Width Input", "Width",1,1,50,1); + this->ActiveType = Tooltype::LINE; //create checkbox or scroll dialog to get line style this->lineStyle = LineStyle::SOLID_LINE; } IntelliToolLine::~IntelliToolLine(){ - + IntelliTool::onMouseRightPressed(0,0); } void IntelliToolLine::onMouseRightPressed(int x, int y){ diff --git a/src/Tool/IntelliToolPen.cpp b/src/Tool/IntelliToolPen.cpp index 30ff5fe..3b9eb09 100644 --- a/src/Tool/IntelliToolPen.cpp +++ b/src/Tool/IntelliToolPen.cpp @@ -7,10 +7,11 @@ IntelliToolPen::IntelliToolPen(PaintingArea* Area, IntelliColorPicker* colorPicker) : IntelliTool(Area, colorPicker){ this->penWidth = QInputDialog::getInt(nullptr, "Pen width", "Width:", 1,0, 50, 1); + this->ActiveType = Tooltype::PEN; } IntelliToolPen::~IntelliToolPen(){ - + IntelliTool::onMouseRightPressed(0,0); } void IntelliToolPen::onMouseRightPressed(int x, int y){ diff --git a/src/Tool/IntelliToolPen.h b/src/Tool/IntelliToolPen.h index 1a8985e..32d540a 100644 --- a/src/Tool/IntelliToolPen.h +++ b/src/Tool/IntelliToolPen.h @@ -4,6 +4,7 @@ #include "IntelliTool.h" #include "QColor" #include "QPoint" + /*! * \brief The IntelliToolPen class represents a tool to draw a line. */ diff --git a/src/Tool/IntelliToolPlain.cpp b/src/Tool/IntelliToolPlain.cpp index 092c3c8..f89e01c 100644 --- a/src/Tool/IntelliToolPlain.cpp +++ b/src/Tool/IntelliToolPlain.cpp @@ -4,10 +4,11 @@ IntelliToolPlainTool::IntelliToolPlainTool(PaintingArea* Area, IntelliColorPicker* colorPicker) : IntelliTool(Area, colorPicker){ + this->ActiveType = Tooltype::PLAIN; } IntelliToolPlainTool::~IntelliToolPlainTool(){ - + IntelliTool::onMouseRightPressed(0,0); } void IntelliToolPlainTool::onMouseLeftPressed(int x, int y){ diff --git a/src/Tool/IntelliToolPolygon.cpp b/src/Tool/IntelliToolPolygon.cpp index e834126..97f0784 100644 --- a/src/Tool/IntelliToolPolygon.cpp +++ b/src/Tool/IntelliToolPolygon.cpp @@ -7,13 +7,16 @@ IntelliToolPolygon::IntelliToolPolygon(PaintingArea* Area, IntelliColorPicker* colorPicker) : IntelliTool(Area, colorPicker){ this->innerAlpha = QInputDialog::getInt(nullptr,"Inner Alpha Value", "Value:", 0,0,255,1); - lineWidth = QInputDialog::getInt(nullptr,"Line Width Input", "Width",1,1,50,1); + lineWidth = QInputDialog::getInt(nullptr,"Line Width Input", "Width",1,1,50,1); isPointNearStart = false; isDrawing = false; + this->ActiveType = Tooltype::POLYGON; } IntelliToolPolygon::~IntelliToolPolygon(){ - + if(isDrawing){ + IntelliTool::onMouseRightPressed(0,0); + } } void IntelliToolPolygon::onMouseLeftPressed(int x, int y){ @@ -28,9 +31,17 @@ void IntelliToolPolygon::onMouseLeftPressed(int x, int y){ this->Canvas->image->calculateVisiblity(); } else if(isDrawing && isNearStart(x,y,QPointList.front())) { - isPointNearStart = true; - this->Canvas->image->drawLine(QPointList.back(), QPointList.front(), colorPicker->getFirstColor(), lineWidth); - this->Canvas->image->calculateVisiblity(); + if(QPointList.size() > 2){ + isPointNearStart = true; + this->Canvas->image->drawLine(QPointList.back(), QPointList.front(), colorPicker->getFirstColor(), lineWidth); + this->Canvas->image->calculateVisiblity(); + } + else{ + isDrawing = false; + QPointList.clear(); + IntelliTool::onMouseRightPressed(x,y); + } + } else if(isDrawing) { QPoint drawingPoint(x,y); @@ -48,7 +59,7 @@ void IntelliToolPolygon::onMouseRightPressed(int x, int y){ } void IntelliToolPolygon::onMouseLeftReleased(int x, int y){ - if(isPointNearStart && QPointList.size() > 1) { + if(isPointNearStart) { isPointNearStart = false; isDrawing = false; std::vector Triangles = IntelliHelper::calculateTriangles(QPointList); diff --git a/src/Tool/IntelliToolRectangle.cpp b/src/Tool/IntelliToolRectangle.cpp index 8a429fa..36f9ba5 100644 --- a/src/Tool/IntelliToolRectangle.cpp +++ b/src/Tool/IntelliToolRectangle.cpp @@ -6,10 +6,11 @@ IntelliToolRectangle::IntelliToolRectangle(PaintingArea* Area, IntelliColorPicke : 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); + this->ActiveType = Tooltype::RECTANGLE; } IntelliToolRectangle::~IntelliToolRectangle(){ - + IntelliTool::onMouseRightPressed(0,0); } void IntelliToolRectangle::drawRectangle(QPoint otherCorner){ From 2aa49f1b791f2e89b20680c1e33c2beb3b4861b0 Mon Sep 17 00:00:00 2001 From: AshBastian Date: Tue, 7 Jan 2020 15:35:04 +0100 Subject: [PATCH 11/44] Update IntelliToolPolygon.cpp --- src/Tool/IntelliToolPolygon.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Tool/IntelliToolPolygon.cpp b/src/Tool/IntelliToolPolygon.cpp index 97f0784..da61406 100644 --- a/src/Tool/IntelliToolPolygon.cpp +++ b/src/Tool/IntelliToolPolygon.cpp @@ -6,8 +6,8 @@ IntelliToolPolygon::IntelliToolPolygon(PaintingArea* Area, IntelliColorPicker* colorPicker) : IntelliTool(Area, colorPicker){ - this->innerAlpha = QInputDialog::getInt(nullptr,"Inner Alpha Value", "Value:", 0,0,255,1); - lineWidth = QInputDialog::getInt(nullptr,"Line Width Input", "Width",1,1,50,1); + 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); isPointNearStart = false; isDrawing = false; this->ActiveType = Tooltype::POLYGON; From c06a4aa87e09b81a3447f0e1620e233ddc141257 Mon Sep 17 00:00:00 2001 From: AshBastian Date: Tue, 7 Jan 2020 16:03:54 +0100 Subject: [PATCH 12/44] Absturz behoben Bei Mausraddrehen kam es zu Absturz, wenn Tool nullptr, weil Zugriff auf Tool --- src/Layer/PaintingArea.cpp | 12 +++++++----- src/Tool/IntelliToolPolygon.cpp | 4 ++-- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/src/Layer/PaintingArea.cpp b/src/Layer/PaintingArea.cpp index 4bf1c77..638fe99 100644 --- a/src/Layer/PaintingArea.cpp +++ b/src/Layer/PaintingArea.cpp @@ -277,11 +277,13 @@ void PaintingArea::mouseReleaseEvent(QMouseEvent*event){ } void PaintingArea::wheelEvent(QWheelEvent*event){ - QPoint numDegrees = event->angleDelta() / 8; - if(!numDegrees.isNull()) { - QPoint numSteps = numDegrees / 15; - Tool->onWheelScrolled(numSteps.y()* -1); - } + if(this->Tool != nullptr){ + QPoint numDegrees = event->angleDelta() / 8; + if(!numDegrees.isNull()) { + QPoint numSteps = numDegrees / 15; + Tool->onWheelScrolled(numSteps.y()* -1); + } + } } // QPainter provides functions to draw on the widget diff --git a/src/Tool/IntelliToolPolygon.cpp b/src/Tool/IntelliToolPolygon.cpp index da61406..a4a6685 100644 --- a/src/Tool/IntelliToolPolygon.cpp +++ b/src/Tool/IntelliToolPolygon.cpp @@ -5,7 +5,7 @@ #include IntelliToolPolygon::IntelliToolPolygon(PaintingArea* Area, IntelliColorPicker* colorPicker) - : IntelliTool(Area, 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); isPointNearStart = false; @@ -107,7 +107,7 @@ bool IntelliToolPolygon::isNearStart(int x, int y, QPoint Startpoint){ bool isNear = false; int StartX = Startpoint.x(); int StartY = Startpoint.y(); - int valueToNear = 10; + int valueToNear = 5; for(int i = StartX - valueToNear; i < StartX + valueToNear; i++) { for(int j = StartY - valueToNear; j < StartY + valueToNear; j++) { From e540bd64f26d33169a31d778c236f8fe6dfdccf6 Mon Sep 17 00:00:00 2001 From: AshBastian Date: Tue, 7 Jan 2020 17:39:52 +0100 Subject: [PATCH 13/44] Polygon Fixes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Polygon kann jetzt im Shaped-Image nicht außerhalb des Polygons gestartet werden --- src/Image/IntelliImage.cpp | 1 + src/Image/IntelliImage.h | 27 ++++++++++++++++++++------- src/Image/IntelliRasterImage.cpp | 3 ++- src/Image/IntelliShapedImage.cpp | 2 ++ src/Image/IntelliShapedImage.h | 1 - src/Layer/PaintingArea.cpp | 18 +++++++++++++----- src/Layer/PaintingArea.h | 8 ++++++-- src/Tool/IntelliTool.cpp | 4 ++-- src/Tool/IntelliToolPen.cpp | 2 +- src/Tool/IntelliToolPolygon.cpp | 17 +++++++++++++++-- src/Tool/IntelliToolPolygon.h | 5 +++++ 11 files changed, 67 insertions(+), 21 deletions(-) diff --git a/src/Image/IntelliImage.cpp b/src/Image/IntelliImage.cpp index 4254f63..0a4b919 100644 --- a/src/Image/IntelliImage.cpp +++ b/src/Image/IntelliImage.cpp @@ -5,6 +5,7 @@ IntelliImage::IntelliImage(int weight, int height) : imageData(QSize(weight, height), QImage::Format_ARGB32){ imageData.fill(QColor(255,255,255,255)); + } IntelliImage::~IntelliImage(){ diff --git a/src/Image/IntelliImage.h b/src/Image/IntelliImage.h index be99c1d..04315c3 100644 --- a/src/Image/IntelliImage.h +++ b/src/Image/IntelliImage.h @@ -8,13 +8,7 @@ #include #include -/*! - * \brief The Types, which an Image can be. - */ -enum class ImageType { - Raster_Image, - Shaped_Image -}; +#include "IntelliHelper/IntelliHelper.h" class IntelliTool; @@ -23,6 +17,16 @@ class IntelliTool; */ class IntelliImage { friend IntelliTool; +public: + +/*! + * \brief The Types, which an Image can be. + */ +enum class ImageType { + Raster_Image, + Shaped_Image +}; + protected: void resizeImage(QImage*image, const QSize &newSize); @@ -30,6 +34,11 @@ void resizeImage(QImage*image, const QSize &newSize); * \brief The underlying image data. */ QImage imageData; + +/*! + * \brief The Type, an Image is. + */ +ImageType TypeOfImage; public: /*! * \brief The Construcor of the IntelliImage. Given the Image dimensions. @@ -114,6 +123,10 @@ virtual std::vector getPolygonData(){ return std::vector(); } +virtual ImageType getTypeOfImage(){ + return TypeOfImage; +} + /*! * \brief A function that loads and sclaes an image to the fitting dimensions. * \param filePath - The path+name of the image which to loaded. diff --git a/src/Image/IntelliRasterImage.cpp b/src/Image/IntelliRasterImage.cpp index c7b3d48..8e8f918 100644 --- a/src/Image/IntelliRasterImage.cpp +++ b/src/Image/IntelliRasterImage.cpp @@ -5,7 +5,7 @@ IntelliRasterImage::IntelliRasterImage(int weight, int height) : IntelliImage(weight, height){ - + TypeOfImage = IntelliImage::ImageType::Raster_Image; } IntelliRasterImage::~IntelliRasterImage(){ @@ -15,6 +15,7 @@ IntelliRasterImage::~IntelliRasterImage(){ IntelliImage* IntelliRasterImage::getDeepCopy(){ IntelliRasterImage* raster = new IntelliRasterImage(imageData.width(), imageData.height()); raster->imageData.fill(Qt::transparent); + raster->TypeOfImage = IntelliImage::ImageType::Raster_Image; return raster; } diff --git a/src/Image/IntelliShapedImage.cpp b/src/Image/IntelliShapedImage.cpp index cd2457f..b61cb23 100644 --- a/src/Image/IntelliShapedImage.cpp +++ b/src/Image/IntelliShapedImage.cpp @@ -6,6 +6,7 @@ IntelliShapedImage::IntelliShapedImage(int weight, int height) : IntelliRasterImage(weight, height){ + TypeOfImage = IntelliImage::ImageType::Shaped_Image; } IntelliShapedImage::~IntelliShapedImage(){ @@ -20,6 +21,7 @@ IntelliImage* IntelliShapedImage::getDeepCopy(){ IntelliShapedImage* shaped = new IntelliShapedImage(imageData.width(), imageData.height()); shaped->setPolygon(this->polygonData); shaped->imageData.fill(Qt::transparent); + shaped->TypeOfImage = IntelliImage::ImageType::Shaped_Image; return shaped; } diff --git a/src/Image/IntelliShapedImage.h b/src/Image/IntelliShapedImage.h index 5d1288d..0140aa8 100644 --- a/src/Image/IntelliShapedImage.h +++ b/src/Image/IntelliShapedImage.h @@ -3,7 +3,6 @@ #include "Image/IntelliRasterImage.h" #include -#include "IntelliHelper/IntelliHelper.h" /*! * \brief The IntelliShapedImage manages a Shapedimage. diff --git a/src/Layer/PaintingArea.cpp b/src/Layer/PaintingArea.cpp index 638fe99..82380ec 100644 --- a/src/Layer/PaintingArea.cpp +++ b/src/Layer/PaintingArea.cpp @@ -22,7 +22,7 @@ PaintingArea::PaintingArea(int maxWidth, int maxHeight, QWidget*parent) : QWidget(parent){ this->Tool = nullptr; this->setLayerDimensions(maxWidth, maxHeight); - this->addLayer(200,200,0,0,ImageType::Shaped_Image); + this->addLayer(200,200,0,0,IntelliImage::ImageType::Shaped_Image); layerBundle[0].image->drawPlain(QColor(0,0,255,255)); std::vector polygon; polygon.push_back(QPoint(100,000)); @@ -31,7 +31,7 @@ PaintingArea::PaintingArea(int maxWidth, int maxHeight, QWidget*parent) polygon.push_back(QPoint(000,100)); layerBundle[0].image->setPolygon(polygon); - this->addLayer(200,200,150,150); + this->addLayer(200,200,150,150,IntelliImage::ImageType::Raster_Image); layerBundle[1].image->drawPlain(QColor(0,255,0,255)); layerBundle[1].alpha=200; @@ -53,15 +53,15 @@ void PaintingArea::setLayerDimensions(int maxWidth, int maxHeight){ } -int PaintingArea::addLayer(int width, int height, int widthOffset, int heightOffset, ImageType type){ +int PaintingArea::addLayer(int width, int height, int widthOffset, int heightOffset, IntelliImage::ImageType type){ LayerObject newLayer; newLayer.width = width; newLayer.height = height; newLayer.widthOffset = widthOffset; newLayer.heightOffset = heightOffset; - if(type==ImageType::Raster_Image) { + if(type==IntelliImage::ImageType::Raster_Image) { newLayer.image = new IntelliRasterImage(width,height); - }else if(type==ImageType::Shaped_Image) { + }else if(type==IntelliImage::ImageType::Shaped_Image) { newLayer.image = new IntelliShapedImage(width, height); } newLayer.alpha = 255; @@ -234,6 +234,14 @@ int PaintingArea::getHeightOfActive(){ return this->layerBundle[static_cast(activeLayer)].height; } +IntelliImage::ImageType PaintingArea::getTypeOfImageRealLayer(){ + return this->layerBundle[static_cast(activeLayer)].image->getTypeOfImage(); +} + +std::vector PaintingArea::getPolygonDataOfRealLayer(){ + return this->layerBundle[static_cast(activeLayer)].image->getPolygonData(); +} + // If a mouse button is pressed check if it was the // left button and if so store the current position // Set that we are currently drawing diff --git a/src/Layer/PaintingArea.h b/src/Layer/PaintingArea.h index 9719ac0..81e4af2 100644 --- a/src/Layer/PaintingArea.h +++ b/src/Layer/PaintingArea.h @@ -79,7 +79,7 @@ public: * \param type - Defining the ImageType of the new layer * \return Returns the number of layers in the project */ - int addLayer(int width, int height, int widthOffset=0, int heightOffset=0, ImageType type = ImageType::Raster_Image); + int addLayer(int width, int height, int widthOffset=0, int heightOffset=0, IntelliImage::ImageType type = IntelliImage::ImageType::Raster_Image); /*! * \brief The addLayerAt adds a layer to the current project/ painting area at a specific position in the layer stack * \param idx - ID of the position the new layer should be added @@ -90,7 +90,7 @@ public: * \param type - Defining the ImageType of the new layer * \return Returns the id of the layer position */ - int addLayerAt(int idx, int width, int height, int widthOffset=0, int heightOffset=0, ImageType type = ImageType::Raster_Image); + int addLayerAt(int idx, int width, int height, int widthOffset=0, int heightOffset=0, IntelliImage::ImageType type = IntelliImage::ImageType::Raster_Image); /*! * \brief The deleteLayer method removes a layer at a given index * \param index - The index of the layer to be removed @@ -161,6 +161,10 @@ public: */ int getHeightOfActive(); + IntelliImage::ImageType getTypeOfImageRealLayer(); + + std::vector getPolygonDataOfRealLayer(); + public slots: // Events to handle /*! diff --git a/src/Tool/IntelliTool.cpp b/src/Tool/IntelliTool.cpp index 671a50f..fce3ff5 100644 --- a/src/Tool/IntelliTool.cpp +++ b/src/Tool/IntelliTool.cpp @@ -49,8 +49,8 @@ void IntelliTool::onWheelScrolled(int value){ void IntelliTool::createToolLayer(){ Area->createTempTopLayer(Area->activeLayer); - this->activeLayer=&Area->layerBundle[static_cast(Area->activeLayer)]; - this->Canvas=&Area->layerBundle[static_cast(Area->activeLayer+1)]; + this->activeLayer=&Area->layerBundle[static_cast(Area->activeLayer)]; + this->Canvas=&Area->layerBundle[static_cast(Area->activeLayer+1)]; } void IntelliTool::mergeToolLayer(){ diff --git a/src/Tool/IntelliToolPen.cpp b/src/Tool/IntelliToolPen.cpp index 3b9eb09..90146e0 100644 --- a/src/Tool/IntelliToolPen.cpp +++ b/src/Tool/IntelliToolPen.cpp @@ -25,7 +25,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->drawPixel(previousPoint, colorPicker->getFirstColor()); + this->Canvas->image->drawPoint(previousPoint, colorPicker->getFirstColor(), penWidth); Canvas->image->calculateVisiblity(); } diff --git a/src/Tool/IntelliToolPolygon.cpp b/src/Tool/IntelliToolPolygon.cpp index a4a6685..4eb3eb7 100644 --- a/src/Tool/IntelliToolPolygon.cpp +++ b/src/Tool/IntelliToolPolygon.cpp @@ -1,8 +1,8 @@ #include "IntelliToolPolygon.h" #include "Layer/PaintingArea.h" -#include #include #include +#include IntelliToolPolygon::IntelliToolPolygon(PaintingArea* Area, IntelliColorPicker* colorPicker) : IntelliTool(Area, colorPicker){ @@ -10,6 +10,7 @@ IntelliToolPolygon::IntelliToolPolygon(PaintingArea* Area, IntelliColorPicker* c lineWidth = QInputDialog::getInt(nullptr,"Line Width Input", "Width",5,1,10,1); isPointNearStart = false; isDrawing = false; + isInside = false; this->ActiveType = Tooltype::POLYGON; } @@ -20,7 +21,16 @@ IntelliToolPolygon::~IntelliToolPolygon(){ } void IntelliToolPolygon::onMouseLeftPressed(int x, int y){ - if(!isDrawing && x > 0 && y > 0 && xgetWidthOfActive() && ygetHeightOfActive()) { + if(!isDrawing && Area->getTypeOfImageRealLayer() == IntelliImage::ImageType::Shaped_Image && x > 0 && y > 0 && xgetWidthOfActive() && ygetHeightOfActive()){ + std::vector Triangles = IntelliHelper::calculateTriangles(Area->getPolygonDataOfRealLayer()); + QPoint Point(x,y); + isInside = IntelliHelper::isInPolygon(Triangles,Point); + } + else if(!isDrawing && Area->getTypeOfImageRealLayer() == IntelliImage::ImageType::Raster_Image && x > 0 && y > 0 && xgetWidthOfActive() && ygetHeightOfActive()){ + isInside = true; + } + + if(isInside && !isDrawing) { IntelliTool::onMouseLeftPressed(x,y); QPoint drawingPoint = QPoint(x,y); @@ -37,6 +47,7 @@ void IntelliToolPolygon::onMouseLeftPressed(int x, int y){ this->Canvas->image->calculateVisiblity(); } else{ + isInside = false; isDrawing = false; QPointList.clear(); IntelliTool::onMouseRightPressed(x,y); @@ -52,6 +63,7 @@ void IntelliToolPolygon::onMouseLeftPressed(int x, int y){ } void IntelliToolPolygon::onMouseRightPressed(int x, int y){ + isInside = false; isDrawing = false; isPointNearStart = false; QPointList.clear(); @@ -60,6 +72,7 @@ void IntelliToolPolygon::onMouseRightPressed(int x, int y){ void IntelliToolPolygon::onMouseLeftReleased(int x, int y){ if(isPointNearStart) { + isInside = false; isPointNearStart = false; isDrawing = false; std::vector Triangles = IntelliHelper::calculateTriangles(QPointList); diff --git a/src/Tool/IntelliToolPolygon.h b/src/Tool/IntelliToolPolygon.h index 297173f..baa68eb 100644 --- a/src/Tool/IntelliToolPolygon.h +++ b/src/Tool/IntelliToolPolygon.h @@ -29,6 +29,11 @@ int lineWidth; */ bool isDrawing; +/*! + * \brief isInside Checks if Point is inside Image + */ +bool isInside; + /*! * \brief PointIsNearStart true, when last click near startpoint, else false. */ From bc718a95d6f2740482ddc6a99f3cd9b7b8ce260e Mon Sep 17 00:00:00 2001 From: Jan Schuffenhauer Date: Wed, 8 Jan 2020 15:31:09 +0100 Subject: [PATCH 14/44] changed misstypo --- docs/UML.uxf | 122 +++++++++++++++++++++++++-------------------------- 1 file changed, 61 insertions(+), 61 deletions(-) diff --git a/docs/UML.uxf b/docs/UML.uxf index 10a958b..01eb3ce 100644 --- a/docs/UML.uxf +++ b/docs/UML.uxf @@ -4,8 +4,8 @@ UMLClass - 2080 - 180 + 2220 + 90 320 180 @@ -26,8 +26,8 @@ UMLClass - 2090 - 490 + 2230 + 400 310 80 @@ -42,8 +42,8 @@ UMLClass - 2080 - 770 + 2220 + 680 320 150 @@ -62,8 +62,8 @@ UMLClass - 240 - 180 + 380 + 90 290 230 @@ -87,8 +87,8 @@ Relation - 2170 - 350 + 2310 + 260 30 160 @@ -98,8 +98,8 @@ Relation - 2170 - 560 + 2310 + 470 30 230 @@ -109,8 +109,8 @@ UMLClass - 1300 - 290 + 1440 + 200 240 80 @@ -124,8 +124,8 @@ UMLClass - 0 - 1030 + 140 + 940 250 150 @@ -144,8 +144,8 @@ UMLClass - 0 - 570 + 140 + 480 250 150 @@ -164,8 +164,8 @@ UMLClass - 880 - 570 + 1020 + 480 240 180 @@ -186,8 +186,8 @@ UMLClass - 880 - 1050 + 1020 + 960 250 180 @@ -208,8 +208,8 @@ UMLClass - 880 - 790 + 1020 + 700 240 200 @@ -231,15 +231,15 @@ UMLClass - 350 - 760 + 490 + 670 250 210 *IntelliToolPolygon* -- -lineWidth: Integer --iDrawing: Boolean +-isDrawing: Boolean -PointIsNearStart: Boolean -alphaInner: Integer -- @@ -255,8 +255,8 @@ Relation - 500 - 400 + 640 + 310 400 190 @@ -266,8 +266,8 @@ Relation - 240 - 400 + 380 + 310 100 650 @@ -277,8 +277,8 @@ Relation - 110 - 400 + 250 + 310 160 190 @@ -288,8 +288,8 @@ Relation - 370 - 400 + 510 + 310 540 670 @@ -299,8 +299,8 @@ Relation - 420 - 400 + 560 + 310 480 410 @@ -310,8 +310,8 @@ Relation - 340 - 400 + 480 + 310 140 380 @@ -321,8 +321,8 @@ UMLClass - 0 - 770 + 140 + 680 250 200 @@ -344,8 +344,8 @@ Relation - 240 - 400 + 380 + 310 80 390 @@ -355,8 +355,8 @@ UMLClass - 1790 - 180 + 1930 + 90 280 410 @@ -394,8 +394,8 @@ group=1 UMLClass - 1550 - 180 + 1690 + 90 230 150 @@ -414,8 +414,8 @@ group=1 UMLClass - 690 - 180 + 830 + 90 320 90 @@ -430,8 +430,8 @@ group=1 UMLClass - 1300 - 180 + 1440 + 90 240 80 @@ -445,8 +445,8 @@ group=1 UMLClass - 1040 - 180 + 1180 + 90 250 150 @@ -465,8 +465,8 @@ group=1 UMLClass - 1550 - 340 + 1690 + 250 230 100 @@ -482,8 +482,8 @@ group=1 UMLClass - 1550 - 450 + 1690 + 360 230 70 @@ -498,8 +498,8 @@ group=1 UMLClass - 1550 - 530 + 1690 + 440 230 70 @@ -514,8 +514,8 @@ group=1 UMLClass - 1550 - 620 + 1690 + 530 230 90 From 52a72c05c5708d69e10ad04807e317bbacaad539 Mon Sep 17 00:00:00 2001 From: AshBastian Date: Wed, 8 Jan 2020 15:47:16 +0100 Subject: [PATCH 15/44] ToolSettings --- src/Image/IntelliImage.h | 2 +- src/Image/IntelliShapedImage.cpp | 6 ++-- src/IntelliHelper/IntelliToolsettings.cpp | 19 +++++++++++++ src/IntelliHelper/IntelliToolsettings.h | 24 ++++++++++++++++ ...lliHelper.cpp => IntelliTriangulation.cpp} | 8 +++--- ...IntelliHelper.h => IntelliTriangulation.h} | 12 ++++---- src/IntelliPhoto.pro | 6 ++-- src/Layer/PaintingArea.cpp | 28 +++++++++---------- src/Layer/PaintingArea.h | 1 + src/Tool/IntelliTool.cpp | 3 +- src/Tool/IntelliTool.h | 5 +++- src/Tool/IntelliToolCircle.cpp | 4 +-- src/Tool/IntelliToolCircle.h | 2 +- src/Tool/IntelliToolFloodFill.cpp | 4 +-- src/Tool/IntelliToolFloodFill.h | 2 +- src/Tool/IntelliToolLine.cpp | 12 ++++---- src/Tool/IntelliToolLine.h | 15 +--------- src/Tool/IntelliToolPen.cpp | 4 +-- src/Tool/IntelliToolPen.h | 2 +- src/Tool/IntelliToolPlain.cpp | 4 +-- src/Tool/IntelliToolPlain.h | 2 +- src/Tool/IntelliToolPolygon.cpp | 12 ++++---- src/Tool/IntelliToolPolygon.h | 4 +-- src/Tool/IntelliToolRectangle.cpp | 4 +-- src/Tool/IntelliToolRectangle.h | 2 +- src/main.cpp | 1 - 26 files changed, 111 insertions(+), 77 deletions(-) create mode 100644 src/IntelliHelper/IntelliToolsettings.cpp create mode 100644 src/IntelliHelper/IntelliToolsettings.h rename src/IntelliHelper/{IntelliHelper.cpp => IntelliTriangulation.cpp} (94%) rename src/IntelliHelper/{IntelliHelper.h => IntelliTriangulation.h} (87%) diff --git a/src/Image/IntelliImage.h b/src/Image/IntelliImage.h index 04315c3..43cc69a 100644 --- a/src/Image/IntelliImage.h +++ b/src/Image/IntelliImage.h @@ -8,7 +8,7 @@ #include #include -#include "IntelliHelper/IntelliHelper.h" +#include "IntelliHelper/IntelliTriangulation.h" class IntelliTool; 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/IntelliToolsettings.cpp b/src/IntelliHelper/IntelliToolsettings.cpp new file mode 100644 index 0000000..1685aed --- /dev/null +++ b/src/IntelliHelper/IntelliToolsettings.cpp @@ -0,0 +1,19 @@ +#include "IntelliToolsettings.h" + +IntelliToolsettings::IntelliToolsettings() +{ + lineWidth = 1; + innerAlpha = 255; +} + +int IntelliToolsettings::getLineWidth(){ + return lineWidth; +} + +int IntelliToolsettings::getInnerAlpha(){ + return 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..200a5f3 --- /dev/null +++ b/src/IntelliHelper/IntelliToolsettings.h @@ -0,0 +1,24 @@ +#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(); + int getLineWidth(); + int getInnerAlpha(); + 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..9b8d9c0 100644 --- a/src/IntelliPhoto.pro +++ b/src/IntelliPhoto.pro @@ -21,7 +21,8 @@ SOURCES += \ Image/IntelliRasterImage.cpp \ Image/IntelliShapedImage.cpp \ IntelliHelper/IntelliColorPicker.cpp \ - IntelliHelper/IntelliHelper.cpp \ + IntelliHelper/IntelliToolsettings.cpp \ + IntelliHelper/IntelliTriangulation.cpp \ Layer/PaintingArea.cpp \ Tool/IntelliTool.cpp \ Tool/IntelliToolCircle.cpp \ @@ -39,7 +40,8 @@ HEADERS += \ Image/IntelliRasterImage.h \ Image/IntelliShapedImage.h \ IntelliHelper/IntelliColorPicker.h \ - IntelliHelper/IntelliHelper.h \ + IntelliHelper/IntelliToolsettings.h \ + IntelliHelper/IntelliTriangulation.h \ Layer/PaintingArea.h \ Tool/IntelliTool.h \ Tool/IntelliToolCircle.h \ diff --git a/src/Layer/PaintingArea.cpp b/src/Layer/PaintingArea.cpp index 82380ec..44da7aa 100644 --- a/src/Layer/PaintingArea.cpp +++ b/src/Layer/PaintingArea.cpp @@ -194,36 +194,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 +381,13 @@ 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; } } diff --git a/src/Layer/PaintingArea.h b/src/Layer/PaintingArea.h index 81e4af2..4d0f99b 100644 --- a/src/Layer/PaintingArea.h +++ b/src/Layer/PaintingArea.h @@ -202,6 +202,7 @@ private: IntelliTool* Tool; IntelliColorPicker colorPicker; + IntelliToolsettings Toolsettings; std::vector layerBundle; int activeLayer=-1; diff --git a/src/Tool/IntelliTool.cpp b/src/Tool/IntelliTool.cpp index fce3ff5..8a1cbbb 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; } 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..3ff93b3 100644 --- a/src/Tool/IntelliToolCircle.cpp +++ b/src/Tool/IntelliToolCircle.cpp @@ -3,8 +3,8 @@ #include "QInputDialog" #include -IntelliToolCircle::IntelliToolCircle(PaintingArea* Area, IntelliColorPicker* colorPicker) - : IntelliTool(Area, colorPicker){ +IntelliToolCircle::IntelliToolCircle(PaintingArea* Area, IntelliColorPicker* colorPicker, IntelliToolsettings* Toolsettings) + : IntelliTool(Area, colorPicker, Toolsettings){ 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); this->ActiveType = Tooltype::CIRCLE; diff --git a/src/Tool/IntelliToolCircle.h b/src/Tool/IntelliToolCircle.h index 94f34e1..a774f1b 100644 --- a/src/Tool/IntelliToolCircle.h +++ b/src/Tool/IntelliToolCircle.h @@ -34,7 +34,7 @@ public: * \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..ceac201 100644 --- a/src/Tool/IntelliToolLine.cpp +++ b/src/Tool/IntelliToolLine.cpp @@ -3,12 +3,10 @@ #include "QColorDialog" #include "QInputDialog" -IntelliToolLine::IntelliToolLine(PaintingArea* Area, IntelliColorPicker* colorPicker) - : IntelliTool(Area, colorPicker){ +IntelliToolLine::IntelliToolLine(PaintingArea* Area, IntelliColorPicker* colorPicker, IntelliToolsettings* Toolsettings) + : IntelliTool(Area, colorPicker, Toolsettings){ this->lineWidth = QInputDialog::getInt(nullptr,"Line Width Input", "Width",1,1,50,1); this->ActiveType = Tooltype::LINE; - //create checkbox or scroll dialog to get line style - this->lineStyle = LineStyle::SOLID_LINE; } IntelliToolLine::~IntelliToolLine(){ @@ -46,11 +44,11 @@ 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: + switch(Toolsettings->getLinestyle()) { + case IntelliToolsettings::LineStyle::SOLID_LINE: this->Canvas->image->drawLine(lineStartingPoint,next,colorPicker->getFirstColor(),lineWidth); 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..f40178a 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. */ @@ -25,11 +17,6 @@ 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 +24,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..811984f 100644 --- a/src/Tool/IntelliToolPen.cpp +++ b/src/Tool/IntelliToolPen.cpp @@ -4,8 +4,8 @@ #include "QColorDialog" #include "QInputDialog" -IntelliToolPen::IntelliToolPen(PaintingArea* Area, IntelliColorPicker* colorPicker) - : IntelliTool(Area, colorPicker){ +IntelliToolPen::IntelliToolPen(PaintingArea* Area, IntelliColorPicker* colorPicker, IntelliToolsettings* Toolsettings) + : IntelliTool(Area, colorPicker, Toolsettings){ this->penWidth = QInputDialog::getInt(nullptr, "Pen width", "Width:", 1,0, 50, 1); this->ActiveType = Tooltype::PEN; } diff --git a/src/Tool/IntelliToolPen.h b/src/Tool/IntelliToolPen.h index 32d540a..b55ffa1 100644 --- a/src/Tool/IntelliToolPen.h +++ b/src/Tool/IntelliToolPen.h @@ -23,7 +23,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..ca8eced 100644 --- a/src/Tool/IntelliToolPolygon.cpp +++ b/src/Tool/IntelliToolPolygon.cpp @@ -4,8 +4,8 @@ #include #include -IntelliToolPolygon::IntelliToolPolygon(PaintingArea* Area, IntelliColorPicker* colorPicker) - : IntelliTool(Area, colorPicker){ +IntelliToolPolygon::IntelliToolPolygon(PaintingArea* Area, IntelliColorPicker* colorPicker, IntelliToolsettings* Toolsettings) + : IntelliTool(Area, colorPicker, Toolsettings){ 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); isPointNearStart = false; @@ -22,9 +22,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; @@ -75,14 +75,14 @@ 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); 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); } } diff --git a/src/Tool/IntelliToolPolygon.h b/src/Tool/IntelliToolPolygon.h index baa68eb..c6a5641 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 /*! @@ -54,7 +54,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..2bb1133 100644 --- a/src/Tool/IntelliToolRectangle.cpp +++ b/src/Tool/IntelliToolRectangle.cpp @@ -2,8 +2,8 @@ #include "Layer/PaintingArea.h" #include "QInputDialog" -IntelliToolRectangle::IntelliToolRectangle(PaintingArea* Area, IntelliColorPicker* colorPicker) - : IntelliTool(Area, colorPicker){ +IntelliToolRectangle::IntelliToolRectangle(PaintingArea* Area, IntelliColorPicker* colorPicker, IntelliToolsettings* Toolsettings) + : IntelliTool(Area, colorPicker, Toolsettings){ 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); this->ActiveType = Tooltype::RECTANGLE; diff --git a/src/Tool/IntelliToolRectangle.h b/src/Tool/IntelliToolRectangle.h index 31d9edd..41f36f5 100644 --- a/src/Tool/IntelliToolRectangle.h +++ b/src/Tool/IntelliToolRectangle.h @@ -33,7 +33,7 @@ public: * \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/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[]){ From 6d4a4e52b5900d4c1a9ae0e54f2f53bc9e236445 Mon Sep 17 00:00:00 2001 From: AshBastian Date: Wed, 8 Jan 2020 15:53:51 +0100 Subject: [PATCH 16/44] Destructor --- src/IntelliHelper/IntelliToolsettings.cpp | 5 +++++ src/IntelliHelper/IntelliToolsettings.h | 1 + 2 files changed, 6 insertions(+) diff --git a/src/IntelliHelper/IntelliToolsettings.cpp b/src/IntelliHelper/IntelliToolsettings.cpp index 1685aed..9c8254d 100644 --- a/src/IntelliHelper/IntelliToolsettings.cpp +++ b/src/IntelliHelper/IntelliToolsettings.cpp @@ -4,6 +4,11 @@ IntelliToolsettings::IntelliToolsettings() { lineWidth = 1; innerAlpha = 255; + Linestyle = LineStyle::SOLID_LINE; +} + +IntelliToolsettings::~IntelliToolsettings(){ + } int IntelliToolsettings::getLineWidth(){ diff --git a/src/IntelliHelper/IntelliToolsettings.h b/src/IntelliHelper/IntelliToolsettings.h index 200a5f3..f8618f1 100644 --- a/src/IntelliHelper/IntelliToolsettings.h +++ b/src/IntelliHelper/IntelliToolsettings.h @@ -11,6 +11,7 @@ public: DOTTED_LINE }; IntelliToolsettings(); + virtual ~IntelliToolsettings(); int getLineWidth(); int getInnerAlpha(); LineStyle getLinestyle(); From c321a181b1c60dd73b1966347724c259a21f640c Mon Sep 17 00:00:00 2001 From: AshBastian Date: Wed, 8 Jan 2020 16:41:56 +0100 Subject: [PATCH 17/44] Linenverwaltung --- src/GUI/IntelliPhotoGui.cpp | 4 ++- src/GUI/IntelliPhotoGui.h | 4 ++- src/IntelliHelper/IntelliToolsettings.cpp | 31 ++++++++++++++++++++++- src/IntelliHelper/IntelliToolsettings.h | 4 +++ src/Tool/IntelliToolCircle.cpp | 19 +++++--------- src/Tool/IntelliToolCircle.h | 9 ------- src/Tool/IntelliToolLine.cpp | 10 +++----- src/Tool/IntelliToolLine.h | 4 --- src/Tool/IntelliToolPen.cpp | 10 +++----- src/Tool/IntelliToolPen.h | 4 --- src/Tool/IntelliToolPolygon.cpp | 19 +++++--------- src/Tool/IntelliToolPolygon.h | 10 -------- src/Tool/IntelliToolRectangle.cpp | 17 +++++-------- src/Tool/IntelliToolRectangle.h | 8 ------ 14 files changed, 65 insertions(+), 88 deletions(-) diff --git a/src/GUI/IntelliPhotoGui.cpp b/src/GUI/IntelliPhotoGui.cpp index 6901c10..f605ad3 100644 --- a/src/GUI/IntelliPhotoGui.cpp +++ b/src/GUI/IntelliPhotoGui.cpp @@ -436,9 +436,11 @@ void IntelliPhotoGui::createGui(){ // create Gui elements paintingArea = new PaintingArea(); + Push // set gui elements - mainLayout->addWidget(paintingArea); + mainLayout->addWidget(paintingArea,1,1,10,10); + mainLayout->addWiget(); } void IntelliPhotoGui::setIntelliStyle(){ diff --git a/src/GUI/IntelliPhotoGui.h b/src/GUI/IntelliPhotoGui.h index e76485c..6d478be 100644 --- a/src/GUI/IntelliPhotoGui.h +++ b/src/GUI/IntelliPhotoGui.h @@ -86,6 +86,8 @@ bool saveFile(const QByteArray &fileFormat); // What we'll draw on PaintingArea* paintingArea; +QPushButton* PushButton; + // The menu widgets QMenu*saveAsMenu; QMenu*fileMenu; @@ -135,7 +137,7 @@ QList actionSaveAs; // main GUI elements QWidget* centralGuiWidget; -QGridLayout*mainLayout; +QGridLayout* mainLayout; }; #endif diff --git a/src/IntelliHelper/IntelliToolsettings.cpp b/src/IntelliHelper/IntelliToolsettings.cpp index 9c8254d..6f95d1c 100644 --- a/src/IntelliHelper/IntelliToolsettings.cpp +++ b/src/IntelliHelper/IntelliToolsettings.cpp @@ -1,4 +1,5 @@ #include "IntelliToolsettings.h" +#include IntelliToolsettings::IntelliToolsettings() { @@ -15,8 +16,36 @@ 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 innerAlpha; + 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(){ diff --git a/src/IntelliHelper/IntelliToolsettings.h b/src/IntelliHelper/IntelliToolsettings.h index f8618f1..3907bb1 100644 --- a/src/IntelliHelper/IntelliToolsettings.h +++ b/src/IntelliHelper/IntelliToolsettings.h @@ -13,7 +13,11 @@ public: IntelliToolsettings(); virtual ~IntelliToolsettings(); int getLineWidth(); + void setLineWidth(); + void setLineWidth(int LineWidth); int getInnerAlpha(); + void setInnerAlpha(); + void setInnerAlpha(int innerAlpha); LineStyle getLinestyle(); private: diff --git a/src/Tool/IntelliToolCircle.cpp b/src/Tool/IntelliToolCircle.cpp index 3ff93b3..6d22618 100644 --- a/src/Tool/IntelliToolCircle.cpp +++ b/src/Tool/IntelliToolCircle.cpp @@ -5,8 +5,6 @@ IntelliToolCircle::IntelliToolCircle(PaintingArea* Area, IntelliColorPicker* colorPicker, IntelliToolsettings* Toolsettings) : IntelliTool(Area, colorPicker, Toolsettings){ - 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); 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 a774f1b..d75665d 100644 --- a/src/Tool/IntelliToolCircle.h +++ b/src/Tool/IntelliToolCircle.h @@ -19,15 +19,6 @@ 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. diff --git a/src/Tool/IntelliToolLine.cpp b/src/Tool/IntelliToolLine.cpp index ceac201..0ccd9a1 100644 --- a/src/Tool/IntelliToolLine.cpp +++ b/src/Tool/IntelliToolLine.cpp @@ -5,7 +5,6 @@ IntelliToolLine::IntelliToolLine(PaintingArea* Area, IntelliColorPicker* colorPicker, IntelliToolsettings* Toolsettings) : IntelliTool(Area, colorPicker, Toolsettings){ - this->lineWidth = QInputDialog::getInt(nullptr,"Line Width Input", "Width",1,1,50,1); this->ActiveType = Tooltype::LINE; } @@ -24,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(); } @@ -34,10 +33,7 @@ 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){ @@ -46,7 +42,7 @@ void IntelliToolLine::onMouseMoved(int x, int y){ QPoint next(x,y); switch(Toolsettings->getLinestyle()) { case IntelliToolsettings::LineStyle::SOLID_LINE: - this->Canvas->image->drawLine(lineStartingPoint,next,colorPicker->getFirstColor(),lineWidth); + this->Canvas->image->drawLine(lineStartingPoint,next,colorPicker->getFirstColor(),Toolsettings->getLineWidth()); break; case IntelliToolsettings::LineStyle::DOTTED_LINE: QPoint p1 =lineStartingPoint.x() <= next.x() ? lineStartingPoint : next; diff --git a/src/Tool/IntelliToolLine.h b/src/Tool/IntelliToolLine.h index f40178a..1bae946 100644 --- a/src/Tool/IntelliToolLine.h +++ b/src/Tool/IntelliToolLine.h @@ -13,10 +13,6 @@ class IntelliToolLine : public IntelliTool { */ QPoint lineStartingPoint; -/*! - * \brief The width of the line to draw. - */ -int lineWidth; public: /*! diff --git a/src/Tool/IntelliToolPen.cpp b/src/Tool/IntelliToolPen.cpp index 811984f..61af1c4 100644 --- a/src/Tool/IntelliToolPen.cpp +++ b/src/Tool/IntelliToolPen.cpp @@ -6,7 +6,6 @@ IntelliToolPen::IntelliToolPen(PaintingArea* Area, IntelliColorPicker* colorPicker, IntelliToolsettings* Toolsettings) : IntelliTool(Area, colorPicker, Toolsettings){ - this->penWidth = QInputDialog::getInt(nullptr, "Pen width", "Width:", 1,0, 50, 1); 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 b55ffa1..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. */ diff --git a/src/Tool/IntelliToolPolygon.cpp b/src/Tool/IntelliToolPolygon.cpp index ca8eced..28dfd31 100644 --- a/src/Tool/IntelliToolPolygon.cpp +++ b/src/Tool/IntelliToolPolygon.cpp @@ -6,8 +6,6 @@ IntelliToolPolygon::IntelliToolPolygon(PaintingArea* Area, IntelliColorPicker* colorPicker, IntelliToolsettings* Toolsettings) : IntelliTool(Area, colorPicker, Toolsettings){ - 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); isPointNearStart = false; isDrawing = false; isInside = false; @@ -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(); } } @@ -78,7 +76,7 @@ void IntelliToolPolygon::onMouseLeftReleased(int x, int y){ 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); @@ -89,7 +87,7 @@ void IntelliToolPolygon::onMouseLeftReleased(int x, int y){ } 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 c6a5641..920a556 100644 --- a/src/Tool/IntelliToolPolygon.h +++ b/src/Tool/IntelliToolPolygon.h @@ -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. */ diff --git a/src/Tool/IntelliToolRectangle.cpp b/src/Tool/IntelliToolRectangle.cpp index 2bb1133..e92eb10 100644 --- a/src/Tool/IntelliToolRectangle.cpp +++ b/src/Tool/IntelliToolRectangle.cpp @@ -4,8 +4,6 @@ IntelliToolRectangle::IntelliToolRectangle(PaintingArea* Area, IntelliColorPicker* colorPicker, IntelliToolsettings* Toolsettings) : IntelliTool(Area, colorPicker, Toolsettings){ - 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); 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 41f36f5..041e860 100644 --- a/src/Tool/IntelliToolRectangle.h +++ b/src/Tool/IntelliToolRectangle.h @@ -19,14 +19,6 @@ 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. From 42f91ca7192151934185c53ede778d2277e5a0b0 Mon Sep 17 00:00:00 2001 From: AshBastian Date: Wed, 8 Jan 2020 18:26:50 +0100 Subject: [PATCH 18/44] Bilder --- src/icons/icon.bmp | Bin 0 -> 1048714 bytes src/icons/icon.icns | Bin 0 -> 107524 bytes src/icons/icon.png | Bin 0 -> 51672 bytes 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/icons/icon.bmp create mode 100644 src/icons/icon.icns create mode 100644 src/icons/icon.png diff --git a/src/icons/icon.bmp b/src/icons/icon.bmp new file mode 100644 index 0000000000000000000000000000000000000000..06dda14b8ee390ee906d0fda4af6888433c288cc GIT binary patch literal 1048714 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%0A|m6ncL^zaEjILZL5?@$ul(&W}Q@sA`;Ec`qvv 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 literal 0 HcmV?d00001 diff --git a/src/icons/icon.icns b/src/icons/icon.icns new file mode 100644 index 0000000000000000000000000000000000000000..791b4ae867c9dc3b5e1db96cb29479cfb9a21ba8 GIT binary patch literal 107524 zcmZs?W3Vth%rD+eZm|1iM+k@EjZi~m$KOA8Yx z005x>;C~DP4*oxL0N{=7ZJYrA7b5)E6B(PBngM|PuMP+R4DdfA|HDB4yAJq&?Ekql z{*(Vx1Yr6f?fO`Ps>f~%` zZ%4pL$H~Az$M~lN0P~+GKmbq>5CFhG9ROqj0SO6(|0n(F0-yl?|5}0mf33j(Uuy!u z{~Q-!QTKmaB=3b@A}XMteL9{UGhBqYw5g^1fMX7L5UV7(fJ@G0bWqC`)#X{UO875` zN{*b@g-JIkjiJ6wAZ^}WBw^sh*OJl9cFW^mQZs4lK#^wPd01CnfjD-72G~pjJx#kdMcy7@=? zo;BsOT{e9&L#EnFeXnqIn;?#uPZpQ;k%duB%thr5CSSkkm37rpj?(0d3W&Qh9qsQzt3}s^yL)=lsC^m{yCI4&f+pdtQ!@ z78i0!3G#2XnFI}WlDNqo@xbh9xXO_jXjQGr5b-p6AlgIUX;w}JI@kRJ;6&jJ#yoL~ z$h7YcHz7+_%9^oz9B6qKzBisly^4BC?9sT_#%WL&lw^71Ulivp$c-3D%VX$#v?PpD zGj?(o+O1nyFT@KN1GF!mOJPIdcYSKvgY-n>$s++x*>#N<9EC&_q!QdHUULbf~Ntm-8F zFi_(NJy}u<=PE0d{xC|FOfrcPuV(p}_=L^uCj{$_6;x)C@7WxrVvDuTDowD1b@Qd6xu@;&h3deHch-JdF%%fFG88_a*A@u+~nWm{F_kQ7Yz% zbdW&W;YS(8Ni|T;d?fDAH@BM*^PYqT42@KnUtIwT$I!5qXoA8ZliuPnoLw>QJNsPa z$Epc=xhTQcms{_9$(+N+e6mr^W+wuO1*ZBod}!PhK!J8KG9Kvh9Q$)}1M=ucb;2qf zQ<9l6sty1jek?+P7Svt$Gv9~LBj0Ri;%FzVJ}ilhFUR9cq!z4J(7}xH=@_z3o{Pwy zPK{RV{++c`x`Dh@c!{KWTs$jT^|M#5Wp$@{WdMEBA&t$rx|z+2Cic zTLnh9=CHsm;)L#8aD@nf{P&BZk(49QyjeG=@_k8P4DU)hKPT!%WzjpcuaN5Drw1)5 z*@)FP1J3@(?j}afF{MG>{9@4a5I3ZHK|t0Fc@!|r-S`D+0A9Ts%EWTNd|qxC?_`O+ z`gs@FJ>x>GD3XuA5>MFivq={Cp3FGdvH9p1pGd6|O(uuED^Y;UmXW1nwm+TWl0L=F z>H3`9NVy+kB6n@g>^eVBg$~S`=8Nsh6YpX_0L_YQ9n#f*pV2&2c2E++Uw1x zBc*_ca4paux6JUpQ>|QO_xrn={I=+7hbSQx*`r1BLShi&KW8ebTa#6N-=nQIIyJmK9CO5V}GfZMw0oa`@+HRkQBl2?e4cSbO^L1M;=EK#^G-V|@08O8Ow$4Qz4^h-?``9I zS0%d00nQNx!~=zCWGfQ7QM|5Z;qoFG9P_5*8zl2AUS-lq1_V9Z-4P+_5@*FKb||4Y z_#FS*i~+I6$9{Hv&Nr>6Hoaz+X6vhKGIr|0YGIoO;8q%P{wha54Zp08=f_QzgBx!% zCg}$dzw21(gKLNpuGW4fMFqRsA!~C8(n;xR$O-BNEN+l?8OUP?1T!#!hD$y9 zA3j=l1RbR^&mcH&U=05QO}l_g-2R7B0?X}jciF}G$w!V50DM}kEI`S7cq~r-L46tZ zoL3)1^m+mW2@&$CXxN^v@*@(_uq!1z0C z$}AmUf3p_G;3=atMx4-0I*6%R;N%>0a97_mM1NgXYS{=w(!#c=8GhP4Gr#n%GmCJr zKBqr7Sx9^Pgu^aVMEUmarl}VrEXRSmUZSb{H_h_k$j%(@;xc2IB1;&Ws~f~$C1oH{ zY4A$TH2E2+l%C^mKTRL+&+$V5Z+^+_*FTm%OY#R$$cMZ6k@l#RH8x0x=Ac#v^h{OE z4$?pJd7%W>n%2|^wa2aQ`^1gAbpkTjl1@G1OF|Wre?wH?1Y1-<1+zCsq!kKoh6-G3 z-{e|?8v{ykp+CuMB<+S`bE37ea&0kDH z1RE>?@rF;!ON>KTi#oj3Fk(U;%E zW-T)CMugdrDoOS4rx{9!Mj8QlMsDH}uFRr)a`Wc?2*5kq8RvtB_86R~n~TUlCjLb& zjZB6RQrmf7%YPL2S;bzb8=kO=hwIRbY;k1KjxP$SX=YGG^6%MaW+yzAhP$=$L7bvX63;y zKu7r+2&Rb%lp_?%K1ZKc*K+=(|`sas>Ki*yR@xvtw!u{D%WDJ(p zZU0;vkqBs6Cn@d@)P5y@1Z3;oWk2(*30>Seg-QpjVgL!?J~*5u-}UCyt_a9|YgvU> zG_8Z9B&GZ5o<-M6|K(!DRHE0JaB*kux-!5JASw{f$X=i+1hOZYXyLS0d6Mzax9+*H zqD=tpjEztX8hR%UPQvMMGVD%DdZRq7Xvxl9qD6|lR1xdVC|sjkzI0f7M_9v=y5v(s!3fqz0? z2mF3P7$i6B&j8@qpHDH{lmF8oojJ_a0EYfh_|!;WgxrQi0TdxV=Cw=%-sva zt@T5_Hgx0W2ZdL67?!w|P<2%D`SeypODUkf6{TlEr$7z%P8>Fw9`8StB%j&s)BX$6 z=Os)M3e4kTe6m-DhacP2)Bg1{=)Pc%cx=HG!TZ^oR*sFBEUzL)TU?f-DMsVwZnIk5M_oNE&V8pIq@wS@AksaQ`4Y5eN;NA~2?iLR(EH$dA z-1=O~`Ayt^P#h~vEem;=2T!5Z)8XKrk5RXhekGD1`C(Gz#{-91``Rh*CRPYp_&x$M z0y?*edqFfZzzNRNvPd*lA}_4m6qKW7Tof<+GrkI2QU;D#oJW)qktFlz!|tmZ?PJTa zbkjFd%g*wva_rA=f0DF)Us-x};Zi}iFNdV&a8H1s_pqj@3u|Sr=uUFV5R$q! za2zIEH6)XEQ6)W?`(us&ql2vxsLTUPh#-AIw~&n~u)BTrzef?{+tz%zyE1E=a@JH5 zQ;5deA~Ht?GM*D}PaSzmHy_O7tE%M^Rn_TH%aaY?yN4`(HGe8l;)UJ7x0EAMX^uQ& z(;}}pY4!fSJ+OM+W6Tpt`W%#*>9lf#jhpoQQB-Vloagv20JS zrF`;Q`xklJ5!5>xti;u5znnisz||7ePY24@$SCs>*ai|%OMHN9k?&%tz6V1khy0PmCcno?rTy^yfITx3Y_#q*aKBE6nq5_S&*Y z6{PuV!8z1`r#~SLBLkB)jomUUFt1nBGLtCGQM%y7G+zr8LlMf>QE#)8i>Ywi8f~+} zS519!PVWSr&>3{+ZagfhyB$ybE>#fNR-PP!1ARj*sW{c;#F9)U#&%MNj%@^;o@&LqM#OJzfIYhR4((H-Ek&P$Z$&o3 zC5JLJk_@2bFh($!8Xi!ssa&luSBxRaiun^LFauUNMh4x6v?!5$4iNmWpxINAeDP@o zjxg|L<6c>!!5~n7TN9@-I~LG16Eho8bnFztNAiT;Y?oktYN?857ik!tf9_)M7(jE5 z5?U#%r41n6JIO@8!a%_L%-@Y&;NQ%&F2*oey1`~x8fW)F)3BebKspoxP_7|YUUS+C zJa@#RPWCAc&wa`xj9bU>@FGbDT+;L~Zt2q8?DMF>ks!4GW>q~#{TT+^`j!c5xPz6t??qjRL>l*KPKyTun%;;#X8o*LA@mOA zE1o{YJND#tldX>-v?_Q5_aDgm9=h}4Rr_=Y0fTYer~XM&64;&5mW@*@9Q1=?bQ3<_ zxl=GQaRLu6YE}nJTfdz;R0@W*T)tTMq~ zlQa*TI{gz0!!4R{nPBiJv?5YDqGd_=wIJ~1q<1}-#Vj$}isXO;#}>4jTNVQBsm7j7h6pIZP~GC#6R z(!lbRKQ>tfSGshNQnSOuCp1MO*`5okdL`1= zV8?D?w^ZC;Q~o*4U2>-J7vq6eVGu5&4Z){ET;KwxBVvla^BiV;x1e9FhXVh2WVzay zo6tb_`0K09@JsK{0S7~u>r9y=1i}L+e*tfK@A(dI47?}(eJ_3D`G?BSf-}2y_1zfe zSi8PfH!MOPVt?aHvdf>nkbmF<6$xusT{b(ucJphj%cQ9`@)vE%wHe7t}&Et}lgd>V&`0oa(lXcIT>8JMStgdBKQrxjVgMU8eh*{w<-?O@iztuL0#fK;D!K5}cxU_6GRvK5gzy;?VfCttvXKaBNeaBuaN-fq$ zuL@?%#FCS0;ClpVSYOwJ^3>J8X{sCmedf~p>2$Q?+kKWn#pyr{fY7|8&7O0v=C9+o2ajM0G2><~oykUlNN zvZ0r80@0d}kVlG^;n?TQz25i#z#t|1$;_c*J*^T8s>tgTOjaV{Th<%~3tFkTB6x-o zn5*oWu6P`f7vWG9<-_a1OB2&0t*A+xRg*qZb`>3tHzV00bNWx^)|&k}lyD$HeM=@k zJ>3w0ZgR*dI1=EXG3f~1_r)z=YOiNMXR86tb2fTFV0uY-wK_PVMhpg9X9)}O&8W8J z5k%L;Df_x1ga&Oqgpo)Tzg?TLWCC*(AY7Iz?!zW8Obmps3;*q_yF2!&&t#gP7|y@N74Ltj{}?f- ziLnxyDEgq6SE@{=GhE2tb}pI4CHr`9d((18oKm#cSN}nP|FJZvYFs6a@RIO#n8f#) zKP1E$>`JDhte2_(;7&oabRGJ8Fm21Z=F6dA2i8fjh>2Pwg7iyltRt>vh^C1F+zQXU zm+8-M;bb_~8zcvVJH^yG?q|(ZHXb0UdOxznkNERQMch~Z+?4S7>9T?H!Nn^411v17 z!-;i+Fis=A!5nJak})MM=bk-+X?!|WGuXC=+v)C48}Z|6PAYhe#_=2sDAVZ14|k2n zmCrWJovc1C!M=s+m4EFrqy$N({c+Z=ddfLzchxa5!X9_N zus9v?Be5bSmE)JJW6i4A{NpytucbkD@%eJ>GEdpke3tQu2?#GF;pe-Gw1Z0v(ZW~m zUPORZNxB|}%Z#LRb@8LV(HXbB1RstB@z2n@p+v&fXL(HwuOVO&9jzsuA0v8c;z$#F z)$XjgJZiQMZ#9+nl)Q=L(RF4O#FQM@a(nE4lpN@I=5Xp?hH&u<&jPVplrCbAlydYG z9|S7o@%Ejx2?Px#*1|XyuPYd3WGp3R!Yn;jM|b@>>yujpEIOaYt*p7#!`% zTM{dCCvzNWMtr8|jbkQo`_YT_5$NDn3Y1YqH9TPLISotH+S|*ElOGl)KPws-gwxQm zTP)TK+TL=LR7b2EnSF?KgH|f(d`Oe?1;F0+C=>$WsKT`~s~ZYX2<1D@;0YA;gOhGd z8XI0dR?GgC3J4$3QZIV31i6zbW$@w9`D(QR6X?KHKfSH(gEqcSrx43LHv<3T%|p{; zA8aSY<5Mwp9YT(e5jN-3FKs}YN(Qq%-8pUkp_pfYpTN^*`7`At=K72)ZIIuV4cGzl zaetVeP}w^WjY^h9#MS|b^0r(a6yoBKuq51NPAjzlc8V9P_|7Ex9s*4DKpGMzdT)jlO6;ZB z3^FR^iznl>dr1Q!4U>324#}1cLM~@94_IgsOOQh-%Ff0bage7l`n)U+Z_n3FazPY> zJ<;2FVGXIYLw2c)BOI^-0vBsXUPkt9?(50^lV))tKst|bh8|b%Pscs%LeAZF@6441 zF9yo!I!Rds%F>?`)+;bc(q4Zj#*;NKMQMTZw9!8i*Hjp+5N0)ad2U>Y=}=J=sGAO1 zjMHip$!8nm6rmF@YU@NC`%v|yoa4+=T?)pf<$Z-dMd3^KoGln^cbpa}3wS5b(XtI4 z49BDz8i+cdbtBWe+e0R39l200>^zc=*mIyLLBafvNdVyv?sbCJ@j+0mfUn?&B;)MN zkL}iA%TWAMv9}K4wz}}bli0k55M$R@>>e>V_VWi1B-)@q_A9Xtn7bQvC2{yxR1!0E zpY^FwL+|~bp=gYtBH)q6t3x!ZqZvo%+U7NvJAvMN;QqjwF&^X_U&f;M)OePk=Su&RC7weGiR2#y zvM14bLy2SwJTwY^>H3HH=(%Nrvn0a*bil$-Y#lqIn;(-&wJp2tbVPXm^qSGpf6G``pp7IHrXqCFtVQ@xz{+u6V*?Z#AGy@0OZg zNVNxgD4Q&OScv>X<|P}O6L!M`{aiE(z?U4IaA>bY7lGmI&jwZCFn=rDb^uBb%H*6&M*S9@Qfw`=A|f@w z7N)3D%nq>0LP?pbW=sDRO-@^5m&=gsA7*b5R3W@Q-9-Uwfr+bCk|~yw_huDkqEP!?&yuJ}uP!qgg zQHd~9lwiIzgmMO9>fdXI!;QzvJb7)xU0(bkdsBR*^6w|fXRx%kY>yhnJKX4n=PW{!`9dXKpd(o`-atK6I0` z!IRZGtCJ|{X%POxHG@V?SClsydT_;qXt;_8zK;F#yWOc)d5+h-MgLC?vFNWC8__lv;{z4o(YUiI?YmcbOVCDBqB^P#G4uyjn( zI~4mIDpOmb!=X*eDi-!CG&ngN3O^?GMN+%bp&{Teq^0a1#h2EJKcMBtebVT#sh&8H ztzYvZJvCPC6Pwz~3f%EpWZLOnb_qn-pDGj-Du-b?6lCSBkHcWZa{uM0eco%?waD&i zNCk~DpbjB_I;z&K!1KPHgYZL%ED$<}r=v$P8*z1EQ=b{zuF&7rsVUEt9*(S9 zaBMTy{kif^xN+Y>sT~lyZ$d^zWXyOfY(vFsVd!b~Z>>1(!guYjiHA4tb265Em7VM6X0F=iH%5t1hKO&{91`ApS=-Wgyf+zSFCN|w zO~;iOq~SDO6r@)6&?!UCpH6k2`b^&UhQg+W(w zsNO8@y1Wnt`_;v(SE_64;iznmgXy|@wC<7%1K=r+bbnpw(?rQ&%(YeodsXU}YsQOS zkf3^SfOFE#i(khg03uGJ#4M{D+Vd%!py+dzDJw!-iN)C!h@@4pROWR!%!nlD8mlPs zw-lWDp?NEQ?6ectIT=j-w0u)>Qx2KN-2K*(e|EpLZgQLMYs2sSN{e>wo6o74$t)-C z`%lf}B9=I#1?>5R4nxF!*7(Tzk0{7g=2y=0{3o}zRjY^>*XS}-{s7fLJ!?YMoc|mz zie={202Tvh9+yFs^f!zjwBws-r(q8gdmGGKreIxI?p?JcGcMkH{DmeEEQQ)2#lmk= z5|hk1_a3nER>nF|9~90m_xApXE*av8pOyE?# zT&|zuYi6vK3CF8%G%j0V`aGfz$uY~2IcBj_h%B{)JnMiDm1`s4OJIsNCSp4smUc24 z-+yhQaB0!m7xpC*Z#`MYP7B0!nqcTx)7LfR)Mx{$unZUPr%bH?+K zhG2`QO)RYP7ZfkebEtf0%B2;cZN21 z5u%3P0f;4d{DF9$PtmLG*k|x)$rodwGe#lJXYJOLR z)J9WILLVC~F}eXMC$* za!KTMb=>3v$9VZnz9!=niK38*lXmY2p~noHUe?%2g)JcfN$OmUsV`Ij@;Bov994Jd zdX9)UlX;)+aXV)lq{aX}KxhLWM#Qf9w(AGic;gQHi;~HHjZ#&Mlx5+*Sy}Cyw#@KM zWVT+h{a2dA5HR#+f0>GsMNNqP$D!f*N=1SL_2_Z`)mm}_W;Ioi@G_1;_9Y>xeK^v` z2Ch5vlR=I%nnRDK<|*rKiC>*QHF$c|G875>aMx*&hFM}Y$En039De!zR3i5UNVi}tBT(#8vSOFQ1j)Hioai9r@~4ri>i?zmzs|kqM8hB z;lcjxhB|+-(Lw*v+|Y5Mcql)JjFLE0O@O}l%);zz`c>E{Uu5pjg6>&NIfh~=jZJEX zE*za1!qYq#Ja%hlpD|w8V6plXlxQQn!a(+yGrOp-*T)7M31x(LCGaMMd9w{ZaRl8& zEq|AaH>+gHJ0*uz(L+XfaOU>{@Z2b*Id%NON0i$f4jW9!p9BwM=EJ+-etDfG&Ff2* zaI^+BG^iNd`joeu0q0K`An#;&S808I755+RbL?RHr)QiqS=XBmwyX&fpMnZsTT>L) zM*3_Pu&$%#-KmomRt!0cyW5kkNiVBo;M*xuUP(i`W8BO!^}4uriw24^0MvHgheylK zLAkudXEon9q?#VIJKOf<^d}p1z5`Ms-Go%%AD?K~KcZBiu!d_IQW(cAeqm_4aF69XfW~kBhgpM7Mca=7 zZadi8DzJ+DJl!6!mMqm+=|kUgjKLLqfEtB8)s`vk70`Vt<@jTjWCiV@fm^Y1CdU}Nu3eC*eI6brw=`KXun` zPc-U2>!Hj)Kb=ro{56R{)(uuo*>`VOu7mLw{VMBt>h+t^Ls<0h2&G1_hs;kf6_ z6g8Nzk=&e#?xnq&_DO9R-kMi;NpF0ezrD**rJFBMffTwR_L~4E2)^A z(I`DXV})@hDXH=<=x_+7_zOXk0U;Y{I67 z@O#e7M|K9w#k~9ssa@*Dn^Ufe9^iD?T$-=MN_fv+-y)LpEkCOu)&LeL1$GqB8f^`O znf33I&3X+u7FoZWqT=1{KU<(l39MN|?t=)ze8KsVGJmHS%0m(f?OcXL& zPtzSyrY=p$9h`v}OAF3%tOxoZIt$uXXV1MIpozwkza(}PTtiM%g>%__Pry!8Mw)H8 zHV&#-66_NvBgL%@gK7nyBYH$@h>gBk>7K*6&0bAb?>4VjT_vTlz<~V*PPyd-dDSvH zxPT1iAZ@pnTA0bU^XAl^zgNw=%OvGg;(`!(aAcrEJ2F=5nadN;^&f;d+>bYIMHFA~ z&sYF9^guqaFh{VgNJp2NZLEkew9AcrZ&q??1PU%XUM@{ebikk10&thYk+RKyd;EG2 z(kTe`kq>kz^o&kVD1<%53s<~+vJT0fb=U=3W#8;^POkb(WfdycOtI1?QYF&_QdY0_ zEq~DooiN-~L+w^@cz5IETcX_!0yMJ~!>dV1#iL526c&b=`4FwT3SC2A!^Ot67;m+c zn4~0?r-x%woz$(o_}By)Oez7+*4e2i3wpwsE}P^1H<{RSGN4Ubu3Q2#>g5`}Q}w%f zL=0rH&;SVWzBxcZ`+0V+JzujRu{w;1W3MfFf(*>Z`HV6hX)sS(r2%sHrQ=Jcrl``h z>#o%XfsEEA{TKHBaiBA7t?}MwlLdISAP_f57(riyj|PPP>29DBUY3=n{9$p|Ic0J7 z5@^|TTg?M}NO$_(VwA-pPzNUtxKWdoXKU+gU^^JqPBN+P-cE@@F*%7ekb{EN)thQWfg-9bTiVMqxs40zn6QP|lR+vB`R zSvc|eP+_-U&0M@PB1B~~+s^Z@n{^tLVu{Z_1R+Uk60*p=`d$+|AXkT=&o}R;ehUdzX3<3}{=& ztOpqUtCH?PBrw_*ybfH(Kl{->=8vXEETTht5d_kzu7*owe$R-zW|^V0OBvVn)?nRx z$r>nA7TX)zcFsfqwiWK|*L@$`nvTv;_NyQq2K=c|lly6wyx6TB< zh{APGAIYJyF3R#90UU&XT{PTy-TE^Uion8OYFDs8b7Q5Xh4`zshU-!rptk0tx#u8z z#jFt?rHYg|WGWIyOVj002Yy6c&?MT{C|$m#Ro1HjNaXK_FBxODqjJD>3{8<9CtLj{ zCS<|bIziq$dMY=b9QUP-C34_`5})q^?{E*ldeCDH@%hw7ag0cA1Ngm^q_bU)Fv}y0 z29**R8op23$PYLcH#1>1!oR-XwXEOjFoym|#_~r?LM!h&=&8gYkx^t4Rby9tb)&2{ z!?Jo&8A4-I3t57GMdVlRZ_S$o!|vno&G6|xgqv&kWlkCOp1aFdH0;`=!9{w&?nYg= z%S2AvB2;)LVvS8Dt0>VI$IBSF2=1>L1;wl&v^=or2*+Jzh^c4%B`}!JT!f?tP%Xc) z9xMWgv?v;TeWdBxbYo55bN7``o9=F*P4wXZVqmyYT`p=#pDlRSe(Z}(_!POKC6Mod zQ+vH&Rj``!Ie4>E{=;ZNhCbZlsB$(H{Vefz1inbt; zLAlkSE2JQ*7LT4v?a;;^*VL6DS?8Rp0JTeUt6NIm%Eopan8-qrdp}CNUI85*6L2_$ z{Ak?sDa!&bZe0J5VYEi)&!PhdC7$cWh}v}Nm}LWUio=N(`fg#rM5QriQ_It--lfaX zq5a&7R#h=d5ZKaDLw=1CLU>0W6;Vcxl5RyHd@sKs^y6)fpI;#0Dxheo?Oo1ZhL`o` zOflXhF&+(zsiQQBDaJ5}QB{$^oMGid)q=QWsbLZ(y1vBNp5REk1{m3=1jRyJ^Ap5t zUnjKloHB}J(Q2K<&I;8Wrg%q>;Lj&1d9+d_PDkf{VFB_U{NUs9otJeBoiTm^N`%Zb zp4U_CnO^URbWPegVKX-w@90+aEPI7d)p2(Ij4J3k18!^Z0GXidJItMK|9}(2aHpV7 zV7Wrd+DyG1Q}6c{nvnkw0B$4V*i2Ua^=~s>nhBW#4{FR=rtDDr!s&bsb47a-o3a&nHByYTmFS#*V#s`lJlblTnb|Pu1G~7fkqhKoY%TW zIuu|BIFohS7^keq;qqgz-afn^{Rlo#xQbiIpV8Pm;w5AXJX7;})T4IIP;FzjgzjxU; zvWabyM-FZ6l#`9=A&95;xf3`*g#z7%Myx9ogy;{g5DtDITPI(saPopCBR^n1{?Xh# z0dx&MEjKOMC{$N{@g*0tOp{sL%T>fUuQdhVrmIEEF$hqDsc-urwfYC=tKqK$upepm zDq@A3kK>z?kLSpWdvA_R!BiNgOT;Hj7SFZJ0YD@BScuyxI=(2mrvQp`E-9QjuUe>0 zvto&%99mU=CTS1AEvywO&XgYLZt$9cIz^RUwCe1@DF$X_Ip2_Xjf?qfYm$85ky^@& z0Ic3ANC#}(9bfI|e^;k*`G*GJWi=_AvR`ml8|8a+*FJChqxk)nqEvH zrkw_Xa{twX$|m`)BGZYXI8QX>z5`EnnOYH@`U^nSVK>`cHAFnBwE{Teec-GmG;T;{ zZNaFh+gwheX`{pDf&BOEvgIW-w~)PhO@FVO>wzptwX9?T`BYP;M7)bcV3nwC#Viu) zy;hGd7LZ=XD)m8c8C$js=8aP9AZ&ur|xWV7` zkH@FkM0I)3l18+c=vqVDIk0n0oo-UDwtTM-+g{IzP0NrSqa_?&;f}7uU(Zaur29NX znfzA@#BSjogzGw5!>O}&6dg=UMoniV?}6MKi$+BVo(807EJU?hhqRDrmuPcQzz$kz z)xm@5-d6aa&PMO|Wz&F;bPw==hkM?3P!Df};fO4vzoM3PV`tM~R0B#A`e+xPor;xhgVQg9 zo=g1jzzTU)&IiM`T2^soq!zXqhv3j}vX4%Eh(}F~B?uvjp>5l2%*S5;Ay-zZt^>_Ex>77PY~**v5d{X9^7AL!0*)tTCWk^P zv{lsCZ&fsD(1Ts_k5+$V#v&L&iyq)&B7P?edi}NrL^694)$>Uc80%?w6ByXBtLD!P zu0ab5ohP-cp?^syXR(mXGnVmi+<)INC$bALn}@nbNk`Jd|I*8=75eVY!o8+AFu@3kwKn#rHYLZK~e zTX5QgJv_mDoO$Vc;fbQ{^P(mQ&T7%8us5U^G_Hyb`Y|R98UB=CCMq`h^{zqe^R2Do#{Wih>A4dd6eJ)-C(6M0FuN==y0+ zR4>x*ry)EPhCTUKY|^wGZQc@|&Q0i-t@McwEXYO=*D1GrRpBW^W0Zlc$S?*QKn9&_ zR()!;0h*-B_Bi}b=IXyY`yjv>MVk>rDm~p@z-<+tT#zvgqR+UUX~2Yg)t`53`1kYhOZL#cZt;kI^dh16*GvTX|4Wd zeVtDHLsdq^j!c?KujnFm9^9n#aZWVj1dS@`#WSF=Je-0I7dK|dy;-(Wg~dDIVL17K z$nIRF=tEAaa9hPEsF^m5VEy7eIWh{r{`IY@GjCEk#wUlUBMOeUGo#QHKS5oD8e89n zgon%G8SYRnHnfODNfK6Q3PQ0?Oe`YbfCx@dUcY7}B`= zKOqHdqq?)7Gy>60ip8iu3=!P9Y2KMEP@8-JmtyQrI0RU!MwI<{MHiubxATK1*+nt;km)o9h zH~^U8mEBI}{FS&`#m}SQApQ}K3-XjgvsI+9`~Fn>&0Mnqu-HqM9zt5_Q^_G;%_yP- zbZid;UKX0)GGS#Jlp>LTKfzN2YYuo3oL864#yhqYY?1cSWpD+qW>i)*p&rn zwdH#R80{>@!1sHeyPW|}m(2wD7zHz*cITah5j0DRJfYu;_u75mB;z2zeTE zN@rn~L|3~q_$MUBjK{M(`rC)*C$-eRb7Eoi89-0ST@!EP=i-#foYM^yS7*$_u1+TR z0;~0sLlq&&;NR366!oEQea75e!W}?iHlAzUMZlxW;YC6TVD`PaHrXK8Qp(-Fj4QyD z)?S{`78^`b!Wp}UywTH1vp;8kd4S7a_4bjt%wC{KIU+_4 z1_DGHF7)2So~yoIs5+g?m;?O#E6%}MhDiy1SrZ7d9TyId~uh4;hTn*Vrj)S5W786BKtzTVW#o#3)_AFVB+ z3-8k7iZ+CI+?X`0*bL5fE;HNh(|DqM*aU8IZ7F^&+yih~%#DRD$~KTvo5kzwLN*B< ztBkjvV=|8xj5Rt&Y6nCc2}?<+7)r2pDWW(d+G!};ECAVIOJ}Q{?4DN*ijySYtDG)2%`_tC9OfOUD5kGWabu&YOoQ?oq0yyrWWyO@xC!%DeJIJ=f)(^Yz z(MWC;v9jAnkT=Q93vKY+GEIClY$Kqo-`g5%I84>RL*<63!&V;;)3kGi4y><~_wqHE z?=Ru}d{qL@Oy>$lnlLcsFy&8knMzcKj`wa5Q#RAF$=ay{z((I$(dA5-m7GxQowBg- zm@w6%P2VsZ2d*yQVxSO43u(qi(N52qObj)nWD>0Mnt7#`ZYvtir!EorQ-yhq(glMv8VVx>#hdKE zs?S#=!Ser8$IbBoUWEmBAyr};ZeBfQ8fy_1(wxox7lO3O?Mjr9^WQ(I(?jUt)`BoA zbTU=)*Z3Li(B3~`Y|^=COrZha`qf$E$Wqdp3iR>W># zrTsMc+$pEF_uuwx<2&#uvs;B^#DmCD;x~p0BZGTtfDp%s#cT+jBzVNKRM;@hs)cf=oUlTT5LTF|$SiL3tTLq{xLS+UM zqi4E5igg1{`)%@44>u{#p~va5IC<9O(eEw?tnD7h3Hh}T^g|aXh{aDjOor4pb?)}g z)*9B`wo*VGokr{sbEI|?h(H2#N;+Trp<0&KoT-L9vRSK?^F!rd=Kj8_kzGt0yh+D$ zhrl&IO0se33R5D!ARSJ~g6Fz9v#*bPg^{}D?3}5jnNyMP zr`FQp6G6}DU}~WM3rj$>zckMDrk+hR!xKSX?Uj=aAHJyQdj8q+5lx};#nw|)yN0>0 zwd1o$QM+0_S7<~7V0}2y_FS|GRNm6rD0eh8yebC5uK8H_xYcsWcVdYCOS3S#MwiaX zj_tZQpS0vkb->(9556lWVfz9c%1Q1gUFq0xd)ZHPNiP2K+`^VmqLm$sop0n2SZUUT(ST+0r5 z1I9>8+4CpjVxF=fE+T7Oga2IifxFgM={Zp!wG`Yp1zKv(T>FBZmi!C6Hey;-dJGY^l*G7kd2S2b_>pPXcb`sjg9g zn)$!z0j!oqAzbjjsqcTZOIrZY!h5yZ3LMnyHOg1qqU%pO$lqnBk=Ip)lD^w# z#}HV6GZh)@WCzh(;ocfe*KqAtUZ8Mx@$eZ8taSHRN6w;(Wm%o=^SLYa$Yg+_tu2v| z>MbJ#h>6+>8p!E?95BYqikK~KwbUpRto5tz@BaGSO%QQzk7KfKQEs>#5+0s;Gz97< z*g0#WY`Go^7`*4i<}`P`?jO&v=b%v-(|=|e^Wf`M<)`hxDVSPQ-sgZy2c%muF{O3JWt zM6BH4aDW-lenhJ{>^cnd-nLJCBNix3A-vh1*m-nNDf_Qwi{5HU@is_2(bI~%8P{76 z0eyq05KU5{&4Fd>(`GKOTp0s0^Vid3gY^4ICn3q?@0=S>!NWgCPRK2SBc$3IVl!-- z+jp;&DFjG8ZPD{LLT96VwV9sSf}&xav1~z$(|(THQwq<(RW=$yl7eHzHW92Em1oFpI(-S=E)f z$3Ju=oY(I`PFx@TONb%jqkDJ`%iKS&*uF}7VgrX0)Zg(LCd8%=;G==-aeEE8jPh>5 zt6fl<=I3N%iPbDm9SSS~Rs<2Ud;Hf!8LqCz>iJv|6rkFEVzCX!zbI#_hJ$6I~CnT_Vo;QP&p z3e}VX$oPHe_6FB-|0ZCnTyB1;8~-^7dOoH3nkKXa_`{2@ke2Tj%mGLGE1U!$dP0eR z3FxF@z-pUd~B&>XXVvW%^^k z$ay2z9NO`HxDg^s?Khq7D&^<%%1ANkW_2DMW(ke$%!0Ae4zI=fi53-$4H~|kn3Nz8 ze5a7q7zv*m*|Xdi=1bAT6}N1K%-{$o(0HDOF^yTDPqc=FYa&{rB2K^Ao=tM~h88^yp`Gef-xfyUXr?~t^yl#pkK zj|~11)xjUQje4pz6za>iHI%kz>cgKD`2&tnv)ttAkR19La1$gq@#k;ejXgG%E^_8Q z!{s`B3}t=}VbvHw7~mX!?V_Ep`^a59wuHquq}Z$*BE~LitI#F>kR9s9LFJP-K=`>M zz?|dtBiwLVL6Vc7-HVaxWK03?p@06c=Z%IhMbZl6Q4YDe)Dda7vS)VY^mRcEB|6H! zGEHoA8$?ibA?C;~ob4I{#!<*L?yauWAKPX@-*HC8A;5hAH@b^XQZ@#fice;GcdqF? z(Cx~!vlQ>Y|2S`ps393q3t!^usE~Iyvx_-g)C#r*D{}q!{y+$hfb!jA*|4{ra#EXP z{6X>5`0lXXS_NB7cL@M+E(S$i>iJV4k{_%aJ$LSY7qOb@V~3OqbD*hc1->kA7`u7+ z1r0VQZ*#q#gP3tI*-D=5gUC2$icviEOp9*vRpfRj{|XE^$gcoR5~ zGMcm&ZUk@l7k}=ce|MrB+CXYrYvU^r{~291A6p>wp33SGJsi8~4!jeE9N*n${UQ&T znwlNHiP5i_7Jz`%BDgoLoDq=L%`SUYOCQ)xG7EAQ(`RxhmEAcZxU9>ahR6&(6}9@^VGYd3LnhYJy*TRWgh%~Y1L=E{VQ zzkmQ5kjt2sjQSmd7v-HsA z>Y16d&0q8`X7myBBsFLEw+#!h%ruXwL$~}yPJ0Jb!l>AJ*kKm3;FH6A_PuSsk5n|x z5SfeBLx)m^Qh{KOIH~Gw*D}e8N|Qb0>BCUS8qu{Q!;o&!PAGnCNVD%ea>`F6t|-Xj zJCj#*KSWFlzUkApV_Hv7DcFO?h)RWu{F50fzIl^TI#>mQ?EUd0^NjG@PW7!dWXUup zpMl^{%6*LPur`NlWS7`EAtL5xsuNl?f&?9qBmFx&f5z~1d$8_v!^1jL6zc^8GLF+v z+BA!3b8&EeAkEO4=%Q@xH6Dc!3{l`^G7$rfp%2DV$^|SqT~0Je(6Rf}^ce=cBEo|} zM}XfxhqdvuLMXacuZ^xy=*LM24JfgKYb)TekdZnJtLhv5I(>}b_TwOUX*%Y4M*J#B z@87qBQX=#_LrX1tkhPBu$%$kUiZW(H@!Kz=nt5$UOjYBDWmE8Qiyr?q(oZ+_h)XGoj`1gX6DH2eNr`?FsMC>*4FmRhUt89c@ikQB?sK*8&t)C zTYWhxS-1Zmcr?dRPR5T@g=k{3GK%IG8jpP1T96um`s9EQ z;J~dEX~Q+_!$HvUu2GK1*S`I?{#Q9kNcxTVc~+-CV`yp1b-iZlY@np`dri7b+M`Dl zSmQL9IO86Tg~&%GrPKw=A*YubHyuh_{G)$HpD!gNMBFJNW_DY`eD2?_u}wA0Qs`)6 zeL2ek@m3MYrKS~E{NOYSsP-9#iKufuNO^jww)uX+t+^z#OBl35t@pQf5dkx!U-h;R zGp0bjaY(C5IoKdpRUTKNbv)KMlgDT2lg#?O9*ekfl8?Ue&sMkC(%6>7@e)ISPF=6v zVxt_-Un8YmF;=sK=UaMrvSQyFc0h+OKdmG2U8VeYA@@GkE~z z#%wJxl%?8;IK=#GE;>AUt>$iz1||<9zE|~4-@-ht;>d&f*iWD~x}VovO0zxTQ$8ON76MtspQ(c=A^kcbXB&S@jK|O?zw;K&m?r%R)X($7B4x zmY~B|M?sWnJ1ycAP3I=yMqmc#nQ;4aYk^@IP zdd>w#6!eTsEslP~(LclfhP8!PzbQ#Ju2!H0*Wtndvys^pnW`)Pz>_mRZgLK&b|cL$ z_xRy|iae2GQ7^%*j8XG_ZD<+EoP1^5T|`25HQuycV6bq}n~Jt|vWvp5!Fi=hb#`Lw zHZ(M;CU0>jAGe+f9nT+HoYD-Uc6SKc$mT67@ed1|st&5h*$EHLbe@C{U6X|`5u;E* z$YC-Hsw&{vkC|QFvh#O~NWUIENlCGP`%b5s) z1?uISspKTkb?5CoV&i~>6#2(9_;y)9%k>QUUtrTMl6?HCP=Omy4%jzH^3BgKHskg? z{sU>#%-6XWxuLqU+sz_iYpPRmV2_I=^JT)iV&|f~tU4kjeY>xRO2^ODc!x7fb{q+m418 zc~&&>l@-j^-97RHT9-2Lt+l}w%z^Yza2lom0U+6{)fnaUPZ-b?-;jYS6=|0=ZhlmBV9!VrwUl68p3MmfeAPMUr)WRw*GSQ7&ylqt+pgA?;45Y zYtN~hIfsd1DuB2-=EDh@a4pFUU&;svtkn^QtB9R{ zCxBx!4{a~%BxrWC;sH>z&7HrO)>E*-Mm9gorG}BW&NDC~y3nA5v zn!R`9_!nHTWtt>uB^6{7y)2vP(41Ez0ZH}s^KDke8MenUEgmMA;bR?~=WM`5URA!N z{$>*vvEuY4jMwCyZafHKBK0CvzA4DYa-#-R*y-ce7zC(MC`_Xt6_WApMr+a zYX4qQp4l9amJI=ttCl3*JK*WTd7tvom*w{LPy9Ux@3*H5?del5x2Lb+-~IOVg?+s% z;`@4r{vL$?VbXW-=^X0#3bRkMt`y2LAgQd5U;(p7LQ}?(08)U16xFFCZR}eCP>!h8Ey{?Nw{7uia$}C(V0OS?EGbJ1nbL{% z`AU6W)1Xy@oft8h=121xdT(u|tT;!~6;ryw$*TKE4^#!Vn%_{XSSwC|H93w1twjG+{VV{b_T)7f?)oGE-C zc)Uqvy~f$$(H!lILW)|C85mPgcju-(WA&htcX=f2ZhC+&Jd3L#m;ZZ2G`|=cQocNn z5449flRwn`OP&7!t$zQ07`lC8Zs1A3j(z1_L|M)neNqoS!f((I^P$mDc_#-#eK&k$ zK8c(dp>&3n)SoOEEBlJ-tY#VBK$n3pW`xkrN)> zB<8!+*WcCjLb?+D^>76K$<^8Od+-)?tZ@B&QJ~k2pfl>_$-Pd^%S)EG|FOXJ}&9I(8kT}h1vaUf$K6shcEOPW3DunuQXeo zZuqq%2;k%W=&zKEn|(Vz_%65k5$iUhrbrW$jVEOjK`<8VuMg6 zhxMTspC35{^7n6!yO`K<<4=QQgkuEq^r#lHRnr7wb&cF2^{3Sbo`0WHX-huG4`q-G zh8$;G{q}8=Z?m#@@>GDj$9;~A+u-4lon@PXs|$s-S0Tvnc3r^PU@AcT0lX9-k5}3B zjftKm)`2bmGlv8g_Wr4O7kE%lDU7T9eJr(w(SESMSIwC_HYZ)kh2-|yY%4N+afN<6|KO}X@|Mx z*x`NEX+)8vIkcv$8-CwH{DkiOK>)}RoRhEG!r&lA+*=rvv8i-j#H3Q%$Edy>V0!-# zmtPt-UX?KKFIyBL>|kI&M5KntG17g&(`Lg?i99K3dke2c+Axy552Z9?m?`FhQIc^% zNhe75nU_6QxS)l>9)Eg?F~G-)qj}bryN(K?tcBIis>E-KQBlrY9(D~Bk~B*1gd~$q zQm*zxNVa_&lTWjamA@tLf9`u(^wu4}c7dZ3^F%pa-ivIMQrb7-M1t(6bInHe@d|C& zCBmM4Lq8agk^1*XU~*sk1=2u(v3u0Ge;FOJV!q!mEKCzVJ|Nd7uyj09@M&J z7_ksg6%trbV!r8#RZ1-=zaURpfH#N^mAfb>Po_DUx@g)bN+ani-P}Vn=!Yb4lmgTz z9cf5%*(V227*bGACicvgpf&h@nXI8-TDX*MTL6@OL9udd;NzBQ1MY{XBwOF8ls@2g z(6F?m;PR{?Z&(0A8sOXl$3tuj!?PA=;ZQ*o@hu?vqyA<{eQ1ovyjs#wr|wwRj9|8* z+3(tl3l|O#0~y1Fylibi0HUUIfUeL-wuV6b@!}= zu=IGJGPZ~a~|uz=4J&>uS&1u zEMofwDp2UmkIpq(>@o2afZUTwY8MZMnG>`vB3NH$P+V#PNN(VPKbp2;LO+A6rlhR^ zG-@-UN40Ak2#E0S9yoYO(|a^9mpC)I?JoX;$F>UB+5Gq!; z9eMjDr>uf$MRX`}D5R4~zzdSqHC74p_;1bwuhwVxM(#iy?ZMI_I0#X;KX-#-Awod| z;|%HCt!3chzF?{s#6{LQ)?N#&YZjh@Gyg|Sl^mBSj>6%A_Ae5(Rx0Ke13n(-X;BV8 zGr|88o+hOZ27*~1TS^om=IaX8}bSuy#Ac9y)MD$1O|W}Oe=dK&OEuK z$(vPBAYZ5@qP47_sD(@hh=kn*#LaE8s>F zChSOgw@w-o>Mr-cvrTwy=W@h1C96YXPE5{)VmQtTdA>Hd18A4CDkM3yu|VKQ@q%Dp zNE&a-;3XkX%%l?4>R6YKMBvpJy8#%4Wu^p&9I1fB-BT+iBK7{kic$GLPeuPtnbSMs z<7Vh{8GyLS5k7D%Q*V$8wrMCglR+cMZqUi`R3dcJCsBk%j-Fu@c#r2w?mLLe3X86i zBr|3n1@dxJ=Tv+l2|X+|)-Tx)!%e#KFR9qY!Eg^L>JD5lqD&374>Kv z;BOee>kL*g7kSHfz(&mzj3IkH0Dwo`9FQC{fnWsjat9BFvES?!TS>4wW|ygRLl5Gv zL$j4d3l&@~6%E1w#MIAEf*!{;BY1oExp7TXEZcrJ;l0GqDGdsj?6HoRHP@u_1YeCS zGOP%fm{j6#_gmUIXM+DH{ZJOJfnackYBIl4=!U+Fzsns6+(g+#=Un)ay*tJLe5!Iv z+vH4#q)zn-pzY(;sbvSD%p&uVKdr)8Vy-3JMYxw7t;tD%`$QYE|NScPOWZBM9*|o3>!N`dbWi2BG~i6fPS%9vFTK{vE=|C}@yfUB!IPDW5-NhLBw;DXH+?!h0m5_a;)Uqr*yihFRmXREuH2kGZ8*1AKzD=>eRo zT!9`Yt_li-c|%2=GetiKWlupcuPh%(Auj4J_)Hf=0%ShfdUf3U{ra<$mAJA+yJflV z39mfL4tq4)47M2wITyp_c1;;%GiHxC4J`xa#W+>@6f#z{0_STU;(o4X2X|Q#4yYL^ zEE&QDwL?3lWxQZ!<3aRPV;9f&pdx9dMg%j5yZ4dxgeTr$oxo8h!khT8@^w=kYSt+M zd&>arFI8S=0qCp4bA~(T-&PRtO`PAYFQLX026}qp&U387ng2}bHDb_x%a|pKBr8c+ z7+ik#luHJ-YVRBrb?~!z?3S|KiDeHP@gemlE1%o7M8t$pG517J;=P5Kh~P;sW80}? zKnO)BVI{0Y+C~-na+F8eTd;xF4H}=PU~>tbeZj7PFi9^r97~4YJ+g-Rm0(M-S&m8Z z^g*F_RY%h&9i|b`ZRUPq-mNeuV56etxS4O1u5#14mFe>nlij=yvZGXc$X=TUYes4F zff{)aK>CTfo1^+C+Y#wSGA;oEUvCgZOdNEB#_0=&P`w}D3qdBZ%vt5RmLjBy_*Iox zwo|GNVwG4E=Z z9*RFp)kkG|tBUa>*UdhgvKxD1f@@_>q==H-;--{c_TP{PWQ(&X1_F=TO-AClP3Hrh zn?)}0;g%_xm;~;@>Nd%Tv#zcLTwtpedM_~yYc|0X`Ky@V)xDkiE3N#ApffZl?Y=R; zwtyQS3>Xq2kXiDceF~656+IUF2VR|x;L;qUlnmHvaK>NLQ1g41MDr(IZy%U zM@9D?!SJ;%bIs$T#PKDARe&SKmPG6;VjBGQ#) z+=Gj4vN;4r;miR!bODDk=WV#}+!B#x)L^@BJ9t3hR1bf^*H?RQyqZ_volg)Q>>{p{ zF3svjrA-w%fAU=Ev9-PXn1JPLjl=krSdDUuiCEB|l@gs|tbv_vem!3EQLawt(hA5s zgIGlgCA%llP%G}y@j#^aT?{qB&;MUQjDV|PjQv_M1s*|%`AFLO_kuAhO+mI%Qd~qp zk2OJi#Om&Zs-ova&cd-pt&nL4ezhjpDvu*<6-#-{#1qtf`NU4{d}8}d*i%`QKaWKX z!UFE4dHudjUzv?MFZTP&UmMb#M{5E_8qdo`{g_v=wm%ZT5S%CBI#-^|7JP}Menf9rVNO!g>uA3H=_!k8uF4o3z@1) zt+$t*NZY0uv&1t;7HIa{-by9Aj{E-fQSI83sYsWelA~T0Ek3N)N$C#!fspFL+lMp; zf(f_xkTpF(0qxVlxtM0a*&&6068ggPIWP*+3z-|p-DyjoLRxb+v3J2v6-KgB97Pky zk3NTZAdb6Bzhn>yF?mhXh{)JCem}?X@kF`zVcN%ee7uf%DOCQ{+A$9bDU{ICU7PNp zh%REa7~F&I|3G!p3R#=h93JbTA%j=tWJTs>P=E&JN6?dQ94hh zD?n}!mYy1@jZ1f`y!2gy>l_P~aJcGWwuZ;sFV`uNG~@a>N*`dFTL%n+yvMwBONTkz z_XXPid#!ll6)z3uBY~%U*X|DyL(yu8m)jDipg|2R$oRst$;#aYKeB<*P=to;%e%ie zkDXi0lovsV`RKt9+vY?999&L@QyCG6~8vxLqI z{}@sWPhl*q-aux3T5w0>cV@Vd$)Z3IkSt z%cZa+>OBJ)=p>hMx8)+HE*Uqf@uWwh<+#4o`%wR4ttmy+k0@D&in- z!z765I|%{@Wo>|_E<~xF_F;aRIV^H1ff`PmXr4L;rd&Gg>$jN;8aB`~=6iS__j;PNV~$>1snKwWEj( zGL2V~a`q2z>}b58B~54zg;`3WZZ=nTusZJ|qRn!kk_3c!LE?EEu3M#pG*7D0 z=DiwXzzS8fcw{l>usjnHWJh)skQzo_87{_j>8S}ZrO+X~Xj_@KoICpzQe75L7=RH8 zUeMDMFfbr;L44JxjJrS~b{pA<{NUaU4-RyI@!nOB zvd#{=VFn3!d5zA#N!weT;;dodYsbf5@p!b9;-xhvQ>55MTgs8j-eO_#WvX>429kc3 zTuQM_u*!W!-1VhFl}#mBxxYm#u8aZ<B%IBqE%F-RgGbpCGLwba2ep$v0adhPSAf z;b1GI;9-^o4U1=Lpmgy11|{3f^sDSTb%2ita^N;whRA(WkfNJ;t6nFsPrQ^=AhS@` zgsyaaju%#QO6cXs?grPb#}Gi$@|X1vTrpph^ek+q6z)_m&FkBwKjW~V*s7(r?gt^q z&5|KdqZBRp`aUy%Hk$OQ^r?ht4wV#LT=t$fu~s&0Z!kG*r$Tt$6UG6daDg=7EoB#0 zVm0j_p&)Jy(5j-K77ml?l7*EKs$(Yf?TAx2 z9SVe#WGPvNAed_-XJNp#eVcWiKI*2%6&P58+al80O_(BmwRJze?!^vQ!GFUE@sC^_ zMUTycuwU7)ZdQ}Lomk}D-?1dBXv%%jMnTb+B--`au<(_?&qU3HJDYuAl&DS2aVdHB zvB8x0PI(a$_PWo0>TguxEe!=UW0tS=bGQ{%J(Z!g1EqXGGLHPMEZc>cff62^!?BM#j@B?)X)0=oTArQXxs&W^Eu7LDieRL8#TBjBNTIPF-=mfSqwx{6E<26oyD@9y z_61>TNgy0M0eZoj#_E$g*bj-o%nw&FJVj^!QSE~^cegIG#`g&Hvl?f-!G9>y=v5%s zA}v}!GnT(B>bvh@C(GV(^^!&Xg2qY=g=r{!wUv^*gI)u&pdc4J`P)AdA4%t9Dzq{$ zC!&C92szM;sfCY|nYz@uI%f@X-;Q+$g>nq>Mqbi`&mOaIVeVaP zU_?`g$;)}X22o5O8iHBzuUWXl zT9<0D1Nd9k6IvNRw7|u2*u8(Guy%91OXwto4)aRsTPIRk#F&e=U>UHR8%jujvlmE4 zSXSt3YDeS>@G35*tJ`dLZnD)3W}G2hBzf{N74h~h7#_nfNFH~wxng9My$VgFHVQa6 z5<~wC3vK@iZtb7xzJQkhg97Bb#32cFvy}S(rK^&BAXmxpU5GL z-+wZ=DFhO|mi1LnDvVZ%Ph0E>?0~)Eiu-pKTrc|XbcJ)cuBlr)mJxjjjQ!%&r(&Z~k#6}SO2q`Xb*#fx z85@mwlh^DhGciiCn_{U_4$jvySf+^;vEt+z%78whD|(Nu__XUS&U=<_wSY+e@$jV1SK4y-VGRv|fP!MmdQVXI4fL_s;t@=Gd6 zK~g^9?2tZWyzi(OFAJa`-~`^Ql3APW+@r4b%P53dk9aN2Edx+ft#iEbUl2fs3`xo! zZNF}sLm3Ye4@Io@3|_oZM@7oPMbTpW-Toc>vt_A`t;+xgRE+B|*60C*o6iqWc{`Vr zS}g}f>EpSDrQ-!~O+*~mb3x7rj2XwF5%Ve0#GHVA)%FX1@-SVk%j1V%m&5x^$>H$o zX#)_{Y`6gC-Ae~PF{5QmYy|&+0__DbtisERYv%*cC6%6hl~-?$h;sNq{yjzysa25`Rljvg) z6Z>h!CAOkzH0>HYS<`-CQm^Kc)O}XE2wH<&s=sVWbAK}4)sT_P(^0JOb?=@(F+N$A zHw6F{Z$$J9l16j>k1QObCOEo*#B`Xg3N820JJh$DN4-2=TKgi^diz;OKFs?vO-#R= zDV(CXy%|B0R~JY1A$q%^U)A}16H2z<{ZvCXm2bG@$zf7&H@r`Y$k|wNWN)IqiJWLx zJ4<+s!_0VYj>E|`Il0f1WBc2y?k9#r#GUN5T_~eBpQvlQ^^31OkrHXVeXEX1wx@vyce75!3$dCIHZ}^5F zJC97RRZ@s-)VUBK7FCtT2;=FDEKOMH!~Y|uf4s317r3whDNK(rU%|8$`Kl?jlYIn_ zfF&x+rjbobJPXdp?JXuev07_!RG&TzVZVQG^Lbp5N#m7gnn&QMi%t(CHG+B&^-Cwl zp2lE7p8r^Jy5|;z2Ua-W_960HQD;TAh(|X8tYiUb@e4XGKTwq&bv5NTT`|BuYEfDj z=kU<);oN`l?qm3Bj(-gY{vEad2XQ~cRWbZD5BPTp{5zTc8gTCl3B~Wu+P1k)F>;=0*6Fn_SCBr+aD@JRDa9_W7u zz_a@?{FOUk$d+L7))1h653L#~e*Z79vLKA1$j>W1Pfh8#_6vfUY8TX{T!o`A0PTp! zwhsRkyW)6#T_*tbfqrz4c(^zzD=p&9{MhQU1y*}`3{{_xd^rY@=u@L{N|GiQaM^8G ztMY7=K%&$rXTdZEo(A!5?@mZr;)4C7fsxBKQZ>Ntp)ieI+vg}XuJ%D(yIrMidQxv^*rKS_Wfb}d3Q?f|_n(vfW3wI_>e98^kN%z8Kwdq#POTON9hU-S z$>rcx9>1^&z|AexuC3FPX(E}_iBKQebWHWbMhEw^0=KXA?v4*izb^6#fL2GrSlhIG z$Nwv-u-@n6rd1$A&0hmzmzFYh1Mi6_GvR5p#xEJZS)gd9JY*mv6Pp}Y?=K8V{e?mp zBn01j_fKa!xYGWY5n>1XQrr|W*EOg`Mrs;(ILQquJB)pu|528{FwGKH-NJ(fiIl^# ztB&OZ*Rgxl?GOgNp$Icr&JfC-#n4)wtNOyt`}2=-4YaQYK%m_d7OO%B@8iu}VVx(B zC?!K%qmGo4ha;{GqFB9#Y-!w6t}`~ec!G&^t^gCH-_S8a-vRCYK3DVC#fFb<4qj-70ey!vQL1^-NM(85?u zhU>8eOD5rN4!EvPsKC3y3i8vI6yQIsXV{k?u#or#LV#SQph1O$YAdm9yL8y0YT|N6 zkEDzPA)Qlas%%%tF?Kishb??E*GsDvEzWE50s8m*Gg&J0h443uJ#32-JC}uq{)lgB ze#+t!)tgir*H}891Z0$qwhTq;Yq&nSJvP8J7A&+T2`-^F@erz{xh?Fn>Ie@y+BgE_ za>ffIUe3{V0y)KS50=LNITiV%4FuK`*K?7qNV4Ru<{%%;zTBwK*<7 zGjat3Ic-6lx1-gLPwXQ1Og0oYLLipI%_+Ab?0OQ10isNq3w~A-E;YhoVtU$TJHC=L zfgYSf+&RZS?3B83#;00RI<9MOY4%M%c_LBdX>TXMgUxF3(s(sEuHn4`VH6V7EK7uT zFy{GztHZnbdcvI`>CHdLcKtR*%l!nh#Y_Cyt#K0nJq{yblg{-1BB~qFpRvYAs5yoC zIJaSmlw1!Y^zWD#bs1EV58wd48x?(t&i;1K{d_(0HoRTSE)HEkQd_!zc| z9TlQW)?(yKjE%;4e|MbOi>w}%Qp8{-b>6*geng-TfJ{e4t?4>NyEshk@rxwK0*Ra% z3>)@eVYSe-QTnyy^b>N;oz$=f?{muP2WD1X#yS}n0DMzs`vNaoG|HcyVHIWzRi{=o zNO2dg5C?}Y@NGi29t3~+bSZ$_*Px|@rNFtMBP5@py2dH*YjFmQ7Xc{Y{&DpF`E_^$ z=i(-L2aFlUGea|x89Y_$!P`qQa(5jT@Kbe5#tVot%_;1qJ24ity2;u~YX!QlVUYy$ z$g&Exce}q3=Gees23G-6$7F#r%Lka#D#aC~(CN0JqugxCYb*Hw|7s%OR|a z56_POUEAHm9e9*$LoW@1YGQnzSyOO<%Ski*GrX-dCB4#M3<4mSPnK7Wav|RS!-F%; zdV%iVChxoj_E!ubQ8^KNL2nu%ptoE^=-A(+&x331;#e}s_AIZ^9>cO2o7D1A&GC}oyTHA(!5w424QE}nd0ZGKd1Q?X1OtF(#*WfFDKT2v zi*sKEY*rWo&rI(-&2{Wjkwv%gLyRPjj9HGIr=MssN@gehXtiK<7VS`U@%)c`c!i%@ zUi#XFjJxx_eVXAk4K;Ey0!CHhkJeloj2ou$BKXYI)fnIoFr@g`@Jn<@r-hXb3)4hh z&Y1ep$SkdTKUxEB;5K<;Sor`arRvK#^HJU6rh@QwXcBFThi_RCLtZKfO56A2ib203 zn^C`Es6y2Z)@|%^fC>$ih0|+eyAI2<#*g*sNk@6Mn(q{74#N%IP&`KHL@wkAt!n-hLAYz1N{y% z%XYCcL9nJ5=*i*l95O?vdZukrJ-h!mU5#x&3ULSC{)C}mkxvHl)1OXTs;IvZ3{k*- zWu=l4=PUx?y}=!TL!^9=_Ph&quVP@XI;UcL+PS>P3_#b9Of!n<6NA>bkkV*&680sW>_6@?G&CGJVERmWi2Zd{hR|PN9cEOn*Q_1j1ENLT*iVfi4x^JdXZbEVV zV@R8nCnM;<{1OIKcW`FvmY+*B6rv5u)ZP-U^Q>f#>kfPBL%3mt>a{p3tyG68StEuj zRPivcu_vcjoJElbM8907jWqv5zYb|aidmpwu3gQc#i|*rm?Q+ME!1l3!xLCl+3rC+ z-Ay1NNAU_WG&FrNh{jv-dL1&`Ax@%4H~S?iCjM0&VG9HDnWPBL)IOMYZAV_sb2D=T z`wvWGvMFX80TJ$aU{Ct?X}I^n9BNY8WK&Q6j7S$S!SBRyb<&qQCGxfWd8(k--FWmb zQPY!SDdik4(QX|NoV$iP5m0Bhc_tZ(VkxIc9`^*-dBA*WRyc3D(LAWQkq8?-q=kIz z(dBW1v5nQ_rj&AZYP86FMC9DE_}Z^hF(sFG)gp@WC$VzyGZ_fE0KuA}qXgIcX= z6)lEpF2P?R3t8FKwZZ1(A%q|NKxYv}!t;?9#gNyGG}aP$mgs&&kL-(JhP_HHK&1YW z#tCIYdRMHbFw~EGoYc)2X;Tz5*hnQbw3oDy$Mz4wQqw6|q&uj0LSIuGuHCpsgg~hd zd7EdJ>4Q+M*xEr>#T@`t`bUBeOJla3Djel_J(>B59=C7RP0L8^H_8?#rw9;%x= zOwc|ZtV=$5A^E0K(UG&QNv|%5J-a4Pw&uW;SoEE;wQu*3t+cj78gDT@|6X)7UZy+| zsx1*WoqSU~Vz_zdEPfjQKn}MEY^|M&r3EhUyN(WDfY^CSJSe?jUV|~F21m2Da#;)DBB~Ib&USy$|swoL`Ak9oxXgLhA z2vhG=ydLdtBg;J-1!-`<_@k}_en%A~)?=YYt^G`Q9fF+JZgpNvM&@SW06jp$zhK&@ zk(Zt86}BS}IgwS3c3ivKjV5W|0)IdVP&Jcz5hKr2}hOjlO|9flA)GS0D^@WcUh^*UzgEg zKTzSqQ3z8r(m>Sn$NWx|z8|lp9LeLj$61^cbQ({GExEWq1goR5+&axz9ZKK#1_Ss# zh%fSX?6a>28g$$8N^X|#gBkn}P7=k^X$F`6&=8UC5-uZ!78h_gzBE&bcH+S{mQI@A zF&qPH#31Zj-h~7U16U*EL?4q(o*okuafwaV9^i$Zkg`uN{Z7~uy16>6PuznGc7(HD znS7iVF@aP4NZ)}^GGc(P2f2O7`f;C0n_;VU zEgwHkp40LT=LB!dfM4I-$`9w9n`us~Hv`g@xB5S&{gD3vTI5_WPG69r&UcaGMO;8` zka**Zkh}sY+te)nT3iq`uXUCNCcsd*bigs@+IM=H8M^&D#|j|2A0-C+TJ+mQc$X4& z6c^o9nH}}XW_XsN0y{r2y+=UpV4?poEv9m^exfCwDXA9AqarBs zDzdcu5wiYx4Wb4)zl$W!TrVuQ>Bo)8J-gD?vo zeIWEV`w1;isv1aeiZVj+4=pJo=RV1Pit`z|6bx1+CK*#YY1!lQ#SM$4+$*{0!d98D z3@v1~y>Pb-^s<#)M+P4OW^!nfu_PR2Mr8S%8-}3JPxoM+$(^0De0ScO060PDV1fl+ z2hc0yQK*wHCU!WJQ+ySkteSNMCy!qp`SVpL(Tth*VNzo zB!6jvItvoVo=$S~dz!W6iAY$|sg|Kt$yBg-3DzOQDTq0sNS$Tpe;3y{HH3Dk$`ADGP7{ z>nkf%&_JpqtP7tf0#jSNjZ=yG7u?xsz4kq{mW9tM7@(IxN77}cj zS^sue0x7$|yFcdq3kxSea-C{vzpPLKl)9*MpvZ#V!8=2F^sv}J;*F2@_?I%fJ z&88ng_5V--I)4repgw@jWCU+)K&;EjuOrfwj<~MklvJk=R-7|Ger9e2{&pEcQJCa& zVTRjdJ7j!EZVdrcAmR(<89NJ)1EPAiAj@6QL);bY7q&TBk>K+vVGVMh-qUepABbm}QR(xV)rgOU0^)q}?vPMe=ard(oAhS@g9T<{XY!4h{0g-5{W zfz+5EMP$w0G=Y51J1lj!?TO^{BaAygLWu|oVpt{Po3n1Kv!%?B^4;rM(9)d>>s9_m z+WLQL9s}wGBCRovLKeil4hUYCv9iw*c80;&WSgoC^>mm||0WS$nvyYN+F+zQA5sBZ z1&+lc#F#Y9)(n0*Ww5kZ*-1IDqi=P7G65`BA4BD7+;}GtFT7|A_ZLMz1af}Jk~O)m z@C4()$lnp_f*txaZ}WMsvV-AolhL%6gxsEf=Zo@LbzAyb zyiuc_YK(!*4F+RnL&T2QbUuif@Y3?JHA`l{?-%2$rBKl`6ss3DE2ODMJ%&sC%}ek* zw=0`|%n6j;x9I07b0`d9R-)pO#*#L>Ji;wty=8}d_Bm+FbfELPIA=hYckoH-+-ms? zrFawW5Ao#?`<9}l01}5TYV2|ar5S(4--uo@n_b130z<=O?7msF5B&!FPuHeJhyHEr z*O557_=74An13waJ6d(q=j~&KJ00!( zv(khtRXr)|h=Pj`86F9IE{M}9zJnYeY1`rfrA2S1G63ULTM?In15S{v+qk9oseYI! zUnYZ^6;O?4R*n25IguNJJ8XVeYv^)MMF_Xy|3lc1s`BLR+YhnnH=cXjN_X{SUOZ+} zH9P-#tkxsr*x%&&S8N8eansDbF*1mn`N|`{5F*ADu^I!|pm&>@_Wx+6zgc{-81_4H zHXmiSW!0^GDu-K;3SpD4N6~~N8~61G8Rf=O_uunE3@8S~HdHe3A^FTo#uI zgHD=HNkz+Nw{p2$LGW-+i+B|23FbN(F>I_`I>NO!Lzlw*HY%~{jNm^|>w#M(tNe5CThZQOZtI%-H zrlkS!ho?sYL8G_pgV#VKBqc~6sIml46v0=1v|TxXo`v7 zLC)!K?{SV_N5$}C&7-X5WKfNWJN@dF@<$^q2ByZb{&KeAv0Sl4MKLg( z95!Xp4)k;0)s9%A2RxK|n3tu^emx8Lt9iyOQjcO^nn*8T23;TI)rPcu8FOrR${?Ae5i|Ps}f51 zJlu>CIai5>kSbic!gx}%Xgj4A+JRYoXb8IHO#fWt>_~~laz_NoNxAbHm9pyUZ6TO- z-EV#lW1;cp63DY~i4sDJo_$3|_p_2j)<15(w`tje$jp$a|A3+Ce=|+5aZqukYd6;#>AI$?_ zd2Y(J(0_qp2Mq93)?l_fmaZxLk-TF=^3w2{U2S!R16GOBJVzbRBW=Hx@fu%>#k|>< z==w7ZD~6XkDu@0MMt*Kje(Hq6ZFQSmhQ#hU=k29E*uar!K0t1KC?Mfq=nCu6_4`ZR zjHos9-^4Mz1SL*Sf^g%Hx+ob)FFlM&XJsbOcZ4YzCw)rFtUt_BE>mTAHWBkme%CmT zg#xKJJz<`MdT`LmdT2bm#)LFA%lzM`*x1&%Ue?{1P4h8^OdT3)RTYFZ2~r&BfJ-q0 zOyP4KXbZ4LHP%!vYrBEbjHGzppF~o|bvQ6rH!%zoz4d#f^C=HDh*?>6VDi_UKz^#-FmW zKFk$-bw-;_kLe=mR!p0vht4I>0$7=WQD@=Jqf zO4|=NKitE5Yi-&BB- zfVo#EM@D?GpBA-y#!mMKQMa1UM;2t|4XK7i;qp9t?<2A&kLFsR6J0yGyvyd_EcFi; zAY$}O0O&7|azTD_i#%Jc(U|#Qc{T^epw^W2f^_<@Fy~B9SaXcFnR;d^qgt?6F+ini z8Os4=r(c}3KE ziqtrEjm?Fl1C9#wV7fl##}c%4G+fu_gOp$&cX({27qC1f3Ek>{U73~ql(dTC8t9PS z@MIpveGam*T(W`DwF9@wfU$AZU4iqu)N{8L$4(a*Hv2|@RsQ!chhqrp%Nv26W`7cSZj7m)v}tDDrXQ?K5*&1(-=Git zBG(8)^>t8{Nv!3yZQ3-C9K}C*#l_Ld&S6&Jt@lqVB+ma30Fg75g9e-(cDwmmvYBHm+ zH|vwK;WO>sz<-kMg?VVG*-HnEAwm0!k7N_^>GqU=KDIBzwCnJA%k3Ke9asMcW*@=7 zFTjKO^?UsLRQ_z>_ylS&)B+qH=TXL+6*0>KInZ`Huls|xm;3W)6McAmAwzJ@sZo7@ z;$4N5jGN2juvJtUf*c)X8&o}V;nSa)H5)t>rN0hM*!z}{;LC?5PX=pd(A&i( z>sjT0P^U)zmZ!V&oZqlq)9Z57m1FAZ%?{2y&3j`xvzVfRGWyK!VNOxCM-L_ohN&@C zCBBZetMTw@TFYH<=)&rV*rL#CKBfqk^pW;=!j1}QUmg-ix}}z?94#r*5p`8_xH7Db z{5}lftvn;-{rEN1zzO+hktNc~mrZ6Jz^iD)CE_RroKmQ|)yPj1p!yc4u0h3>9>phC zHH-&cjlntL3G$tZQ_s>I@QnljRdcgYm(2M1R=<&OJ2@&^R&zYJ=e}9D%xEE`2$X{dG7Ljm{~Xw8 z_*6DAZ2f?fF(&#p3KP}=D-c-Qyu$DCdsFTCwc8aXn9QU>ZsG7!AXKxQq)8R+jY323*tJl~%Bh!eKq6i0a7y-n4TZb9c2 z7kxZtxG6uf?v&gsNr+oU=!EW%W!R972YwVVZLlI2HAENQ+|WYmbN+94M*c04iaE*u z5qTnsnuLrB6v`*6v=+N#ZGuCv{9Yutv;^l{y4dppQz` z7G?UHbnuQu@I_7#ro}ycKNe1?sanJK7Lh22Rs|Wm+RP7xeG(9{^-WPj?Tcf@kM&l6=(~qmSN)dZ>*#UbR$?P5SRu2IvuAZUzv#r`j8qfzag?AlouAv5HRpP^-`m z+sMd=p@65BS*MHiE=hxBICdvrC71*qMc@tFVe_usfyrCS!EluRTRGR~=OYZL*E-$* z3);k`KpWBX`$J7I7w#Tkg)Xn8flA>Mk-sXt%Y-B*Jb(_K?!D&=^JGObC8tC|#Z4dc z-|jzU4&1qJCuJA*E6dOY%LvsZER1nZrF2v)w)X01W2lto0in87@I&#{1!m@KJx{ZC zKQnM6hgr)r@o5k>Tf$Sh{SL?y>arl>y>slOnq`ywEPkw^XtAELv1hyQ@PhR4aTfSD zu!!t&HfwG~T*l61RX_sjZ3*%XObV!aZirf_{>!oBmxj1(0L?@Brz=^id&~51<{nm> z8`xHV>C|FW01fsiMhWl`zeP0jU5b0ioPP|Ka1fSbjjxTW1@Ii_MtZLDOIzI916FpW ziZ{@Y1Y}>=CALTDsid9})r9O5Qy05S@SS@fci$_cQb(bSIdQzjN^3PJx8{GM`L^KI zKJgM^cGmdSBkyk+RP&dOU>48@%3OHu)<$>y(RcU+U4g|>i7olM3{tl_mx(inEcj^7 zl5S}u+EA(LU-$Sj79FcLAjV;?{UvT05R*oclgA1EC4&xr1INt1dmgloO8^^J*Gd?I zA`6B`-o!ae0?5K+*zs@sATI|h6t#R?XM8g+DPj6H@~1BEF;D=8=hPdQ9daUF#E=pl z{aMb^&6+Li!i@Cd(qpvR#Kx4&{XM0b_xQiElLK%H_X9z`M%OfSs-bWyNOGu_X${BJFr;8N6w) zH7F2N{cH72RO^>yxiZ)1BO761D48U$$TmK!sjpQ6xRBvjV(I7F^a%!C!hPuY&Af9| zU+5IP)d|T6CPUg=Um&-A)nbKG?C7StkX_nK16rX7Q}4NtG}Bef-eGf``n11hv+!CD z=`)RW1>)tQ_r(3{wCNScIL@UzsaZN+w3B9mJ$XLO*Ii4v-^}0383y4P^g*P-9)XuP zMlj&{?q*|zhtinVOaH)Yj6?o_*KM)uNk!?J5OWxB{i zHfW;H$z+W)rnr3%TvQh)??#{4i8!}VWSSs$R_FY?F&xk8&+w^ipEc8v<^NU2mAFp+ z369S_Zy!op?Fw?q>+Yj{N};pr5yr6~M0o)+RNB;E+M{nl_I7ax?9p<~P33#d`pNBW z;S&Q!In^>-eTtb4#ikkG^DNYBxIelErAXhz5$JpIPqJ@wr&WPKQKu9Y1PZ?m@PnJc z!9ron7*V?{yjBxMD?3E{{M`?SCb(6=5$Y&ekm2$E1V2+bYw_xA*E8jfppT1M47xPe z?+AAFG%#i@QVw)&M(q*tFN^Ssqo{oWyKy-+n=lrqq*68+zS}083P6O@@iy(BH*TDT z3^uAKsj>4~oI6^@awLK-itV6kvNjF8H$4qZ_ULXFd0oi<@k0U%FMS6D~ zl&XJMw_~~1Aw6eOH)q?bn2|QuxsD4^)8?ggD_U8KPOJNIIDdvW#g>XagVpUOm*Pw~ zPEk3nn?%seTAb2$kwe%W=w9OTnHa1w3cARV#%4YI?bQ-Hwf4Ds^rYZDUnxdpdNhlt zvEDA{xplKcJe2hOzE&$5RXLWBIricr90C5g1+qa!%RtXs)z7Gk_N7r%ofYz-YPP)> zcctR4N2L_JNACDUOae{(Q7^2ffC1%PRN+UAtY5q*l0{dv+|EqjGgIIYEYDxz8a!?2 z0|N=004hxD_gaeB)m(CIMw zBFGM}c67oB2AI3V?p>LxTv}PI*Ug@c-{4AaOpR3&>JI8W=kCmW_Sa+T^aLN2?D78qXU+&X^y3wE(0YG^9yuZ5e9i8v^r*TM|0cN>CK@(MmijyNv{}>W zb<}30-nL`L<4WUy=jA;0lkVK@wr|k9napW_c0Ion&7ok1+bnCzYcboN1U81{cBUP` zr7(4}_$b?nmIDA^qM=P-GHbY#zV0HeaBfYJxu#O&obxPsQgD1laAhmy;N z2Iy9-4{-PaabA<}CHaghqe6t7+#yQ3ylkH$&=`)ZRL6lp27mF7QFcs~vFR-`N4cYi zldv-!{<@w)nx;?Q4?~rEr%vau%Hdg=2VWiN8NC;E?auJWU!A^wSm2+5!!{&Mon$~#O-BjZNB z)&EkKyKsd^nlGy*P@Jtj|2tpZCxA7n3t$#Jpi-7d+N&}9(DWP^OD~X1iKPy1Ok4H% z2gy%&8?g|@%lC<{V*f~D&yZEImX>8Z!j;pbd7^nPt|r4v06wU7=bOOmip1W9kFp&x zuO=LETGL1^MJ6Kg24{2&>$FQ(QoYBsBsB$JzK8G`F2~PctY!vCNnB&JAIz@?oO-X6(d<+n3~7Pa4@b%h2~=LtJ1U6V!oHP!!pP=$134o_RnW{ zVb+BMs^i9IamaUNV%rF~%FdCzz?@J{Y|vb#pmGU%mbVYA2i>@G^~ z+#tHD4xm!C0s3EI@RHsLw0N}EQUa(i7Ds1n%i=ipjgc0$s!_^QL~KpGrq|`a>azue zE2TMo-T!twm|KiErxJEcD`^w2;-ONpG_Xj-k&Hk;&}Dy!N@_4r!Sllec-n2`F4EA( z|A%3G*-Lg6OT?6NARmqgpm|(X%v9~Uz&{#zBfqUC`&=_p>}rAw>R9XF(5O)CXB+nb!2G1qy8R6HoCe!s*r#BWdOI8{7pX#F`8#g` zw-S9`2-|NEy)yoesM%h!cn))NFf!GemBhPKb20Vw%vkE=4vXn_cAw`R7dfrhI4{ZH znF>S&I6XgyJ~MyyGo)QScVA8&5}5aDjxRE5FXIF~P3!luWcYCQ44!Ez7vS6yp-^HQ=Yy7-+qjAjP_8eho01)_PXo z5B`_(8W@pvgQ5Tf6dgA0G~@8ViPEqb?CP2y35yi%`xX*-x~QnlXhG> z+3syFRx;uGBsaL^ibcE3O;X)%60AVK(UafG^)7!eOF@1SA@L;MrC?DU!}nS0XLjM^ zAvI)|@$hN?FqSS@5F#*UGU7Utj2_N>WpmC7HPQNLwn$|lQD+j|!(oXFo!fP6QJ;QR1O|%95>_2+(@ZnsBbsj9BX6zI-8ec%hqqM zQ*)=gG*FA6&0xtTZZgY?S!Pkn{IomXDv=d{TdvOiKB^ZbvIZx&s%%P~S1(|d=Y@8u zhd2ZZM7?k)2SF=RCCg^O5W2`=d*xK&Jo5Wk0?56CNa3c-zkt|-BVIghblU$#f&Y2f ztf6mbyNY9?3T{zK=@A)5Nywb~-8A5-$26 zy`|Rk;bH)VNcJQgx`c@i_<7Q&B10xO7!YYU>DD6jVqQukXP#o+p~fl&oaZOm5kOFJ zcntD0E_e&>Qsa)TK&6&tf6o8k~t_10Q<`*JHRHw;y1(LU>Fh5>Jcj**v z&Us#d{Ixje)q{6d8+A#}FA`WbxK2qRSmP`QEbp`FCnEZq#HEVmEru@8=?Ff5Gzqt3 zPdfFxidn?9w1T0mCm5$q-TyRM-rjw5hjdB4CoSj}%CdvmCP+tDepMnopw2|COoEB+ z2oMd?6WJXK!X?I>3EM~*D%<#gOnk`c3yvtPgoMBj>09j(aUPoRla2*jmKmc_!0AyA zttz?s(EK7MwD9AMHeLW6D)0J$l6xCs1ElNFcK?6uEE+viL2!DMO^(=0fBLNlw3)z^ zUe{Hd^rPsHwDIw$#(6#0h8V7FK(c`OklTW+>B;G?o$Q=ChY^5f!VrB~V}<;n6yrOQ zk~~qzD(Q!vRHJHPo!vOuvGrVg_<+`=mua~hLvQQw==1sZrTqHQzYVO{;m}R^c1!&F z(EfX6pU#zCk5azNnaZpzQX^?=}y;j{ACxr!SlkxEF3^#>d``w0Dzu`bb zq{o}mjOsS8XwJ2{Iuc;tr5%zO@))=!VE$@^d9Rs*dFRLKZ#2&j}L zlrI!YbASQfB6aTd#?Z1~UGt06hC(S~O<^YJ#7nV)S@Fw10r?#O_xt@f zmx-Mv_fxdWMlFymh|awA)o7D3hAd)5Ju8* z!;KR)^>xRIwV7W?<=Bwd|0m3I^0CW_bYWSk6}#M^6&f&Hw8!s! z7eFfuv$D1aoSYI4MR)I%JR`&GBjDeB!gM8>$*o@NbHj)92{7#MHbTVmg}dG7$*@x= z7A%%I>Y}za z`T2Vgich4KRot6OJpLHq_(Rk`^gAK=1t_=@zxa1j&x~Rd0F)4Viaw(UV-imkRssdJ z9;G^8uy(1~Wc%3}O9V>j3&;IE65r}p;}54gU{x*j6g%u?czefuuhbq~24oMsy}|V- zI1*kJyNX*KNYp9`&1a|66gASdmqssV%i<>@fhLyUPj!y_@6KhG`Lq$4x=~-bx|Wny zC+2UxCPMC+roC4%emPqh^>>oBNfFU3#{{Wuy7`;;D}z=7#sNwF0T_j5c^bR;P}g*I zTCc-ZL*#gtZ<{-N`z${TeEia%7Hx--tPW13**%6`$6@hXf`;!2Hqi7c_QEwC3=K&U zFhzcqG_{7#DlkBI&BRXaO52l*0_xNc1cIJUi|a;kvkK-3nwklc4*!0C^Ba(t_}T(` z(xkc}o^3Epzjb}HX*(WSYEx+1P=R%R-O)^3kf4ml+`onJC;Q*{u zum2yzY+yy(PHh#4gvpHr6f)IUnczhjZ-6Ej+!+q|GqU7})wWw^n`}zJ)eRGoaQ3a< z;cAZ=QSLNzbP1->oE0d5vh6LG^!Oo}-k%q<{=|{s|6v2D{e=ws3B4xNc>4h4lR*=% zDgSz0z$_cquffzc8$!Au0Ye9(1Q_Yf_`I^?e)izVNOXe~pRv9QOrk9f^2+^n61LiA z=KU;nle{j2j8~mF_psFVHu0B#E$0_fF!R$=`5a_}H)Wq4VDNj({TjvD- zCs97wmwsgp$ymt>L;Gf7Ww^V-f=7H_j_qo}j%#B{Oe@G~-ORFg!U@CKnUHr(9M|j* zoB2wq$wBlIKKnWR{H~N;riwpYW=OMVDcyDuBYSZ_3y=FZb#_I2iO8cQ2om;aBv+2f z_YhIm8=VwwfLA#wxm$PQ=K1$BO1H)yS04XGEYzPFWNT0+o*mEjre*FqWtbpoM@55h z1P#AvMlLIb8%Nk0*M>9&rx1p1(-1iSRv#|Nt$L7i)uin)CY2~G{@UM9Eo}rS&i?TG z;q}2@)cUcpPNYv;aN$R(jZ5#YAgMu=_yJ;H+uRe3#u?$C-1jKnB&v72P6?rhSr2fx zz4R|CwpbZ3Ptfa@-wR#MWt8Rr9RDmJ3#iP);g!+P!jgaJ#J2vC$hk2OLx3KhgT0A! zCLld~+IPE_YNi6Vk zl&5ijl8)l#STa5!gFK&v*?RWwV3sr)lpE%ZITzadCP0MYCLe_@jeP77Q(z6WhMEuC zTV5URk6wVRke~Byh{vuZ?yriM7tfL{snNd|{&cXQIk@jXq{p-5Bq;aTx_h~EDKVrg&l`dn9VX(zGjrjCsSAaCjaixiQ2;rCra5)&TyX6nBh$bg zkNVD&Y3cTg*N^d9B`D@vO=|j?63-D zj(Y!I?|fK|_K1A=>_X|g$7w20{h)kAGi{Yq9RcW1@G=D^scVlkpRLq(3KfZqzLa-r zRKJtwqOSDPduz<^kHW91q%P^Ep?2yPwN8W11TrzBaoCQO3z;GVC9kAl)w&d~sV8oI z*&#uvn6z)hJiH-6hHb*y%j@W@ii2g+@fewy8OgaBAGT=E|73@LLJ)$93&+ ze!Xnx_Q3_E7h7Z9AgA}X@}L5PHnj@jIK@Rjo4}VPWkPt(e4Adoq+(QGgtIx}8KGS+ z$9mCfPrL#_L&t2FJq*K zEm6}7*KlXxZX@k61?|op>m{ald5R7Q9VlACg?`O zCJSEx4>Uo|q&;yXWn8wjrqBE2h;{q9AlZ+E0>f883e*@TVCGUAR8Ehen1A=fbe4TY zZS)_YfcVI2#BJ8e^#E5sMJxP}7MyzZAHcT{fTF6p=}oIUDoMc3zt5CtzO%K{nDbsF zKT}IOP%30%B!#%LvyX9wI_s5sQ- z;4H9uhO`pXTF52mL{irKi5OL{0fSuPXA+gMge&=vaoXD22_55q$EOh$YGwqu;|#VW z3Pv14ybom)vP6)vG;VmVt-zj)K~_m_^n8#PMjlO)j!7$EWP~?}aWf#^c@;fOOdxe$q$t zSxA;Yr_x;VLwu9a*ry@^3#=Pw9-8RG^(|3YsPEM)xV_2A%%r3~+zHYE7SjvaJz4~d zg%Rfi^7;JVX~LQo#J*ug*S8g|g%`sg(tD1cy_)I8#Ja+RWXfgmtRo^TaHw{XR>C%R zJy(aXSV64zXqGNKeG3$)kR&3)_Bb>#*%Hi7WG-D=T-r52U91fYDxygRbx+<5jpsn| z#dtaIS4s_PptuU6UJ2GRN2_tL=nXSv9ztA$kP1Nramik!2iF)>w)C=DtRd|xFxsam z?Qc@;8gp6+h`kS_*lm}ZH+^x9soRrb^rt;uVF6Y4<~ZCq^6G8}>G0g#s1f#AvTO{R z0b2pZ_dHNxs&xw-SNI(L9-Q(x@2ch`2`4`5qsN~RR?w*d^@WzqOXIO=iVEu>JHwfR zjQyFOrocFxvUb*her*XikodMn&Sox2=-TnOOR^coQUm}+GhGF7{&p!W-v+xS`8p3^ z3}2223BbdO(+a-5tXuMs!#jkLKx)%#h^w{~lcfM_-&+-I&|Ve)f43sbRU)mloFLeHD^^cy zI^s0cY>vdw*_k-Ldfaa)U(SAfxxJv@z;_6bY0Ol7>s4Ni;Rc|MTcyY`?&8;3TOomh z-HocfFqez6LLqo+VxQgCkjxG+H*jtuH=Qy`*X$x^{Xd@g1PEv->?v1E{#==Rm``_{xbqpxhzVpW4V`@gR0%NC9 z#Wf{O;FD*_yaKss%assp)=nP|XB3G%l`d5kl!oECaFUheUekQeQ6 z1eRL#VA~Xi4u2@6v2#cZqCyVBN-=nsr$<|?hpu_lR0IAuERq#iWCu~Tj#G$c$bm}k zljBntB-CCG>tOnO?)|GobCN|Rg_MuI`)H+cd>W@Uuexb7x#LPM&%XOXx5`)PGM?fWYK3( zl0T|KzE{nSm*5R4RZCz}-}jo*18^}ss-uvOJ5AzAo-Y1S`Y*~o!jv%(F3%);tH1qN zXwQwjc_d4i^9IjH_Q-`FtDa4~>PJmz)B%Cw=Nt!rFIq2})HD{Z$9}jFCA@^%9bdrS zy3fkOzP~A2Z|5=&b@rG5kaab*+Jwpq4(N}6Sckk1_A8iYSp2^_X@XlS=!y#-21jpL zfZ``wr|o6W{eT(rUQWbG?=r{`)s~MVq;*hZ`VyJyY(u5|l9+N-g@^O;-rXpdrS9mc zG)<^Ci^ePeYJ%FW)j96G-<&l`%%JexHJ~i2CgKwp+Y3h{H| z23az&1Dh##44=YpqKD{@&2>uAh6Qqb53v6cT=w7HH<1b-u~Xq=FZ8vgYMcsUB%HX^ z_01jU#mHD@08HT;JYLcDDN!+t$LOgJCH`WtDeA!pq6R|9SgrFMm-^$O)F78EFx{ zL?l!xhAh=NhzmAe6xgBW}J6Fd97>aZQDD&%iZ;fFFy}lPd^iuB? zL>T;HdrQDvC-`E`7sl7!;)N*#)7iLtX@c`-WvHQGTF{8aVS26ZQc>m*X^1vQVbEyY zSJ>(p@c461yDX=j03Q&^Py!cgHVe3h2NF8?>CuogD~#u*O5fay5fBeIvj-0zuHVvP ziC6sB=WT$5@}}`M?O0O(E;fcjyF%?LQf%RS!tRH@3Al_H!VMY;KZR^vz><_W@Be$; zDZy6=WcYA(ztY}a?#!6_@4+-}27Epqlm9j5e`fyb;J*T>iAR&Hz*gTym%h~Q#^U$2 zDUUU4J_aK5?A6@3Af%hz*3K1LOT#IEdWibvUp2@)D9`ssasscce!(m{WsLF4-2)Rzm}dtTnuq7^u-;Zc8Jyl%xD z#pt2!Gu8_N7Dj7g7yiUIl#>$ESx8F$4bOjxTw{0i(l42Fkbt6Wrni|c z7i6i#t?+gC5)Mr&q%gkJbbx7>tCzjHAhx%)P^8=QjqX%sBbNwTdB=x=b#1=VXx*gsT z1ypG0>o7@*;*IRAPo(~>>ypq?u>ZBXQ(hczkyYTSyMhPv{6<2|0C$^MpyT_ zLqj#~=<6;YZ0$}$9K<;`Kr@#$O!_?QWVQWe1%ieBlrJYl?u(m<-w9YqwOHH|IGq~k z)X;n}sBC1<t>=os>Wb z#q+W`oj8yGP+W1;dWh$&e_I-kr^`x@_yr8)K7TQ;l>LmH0%!kn4vd7rrU2fIHZ?R_ zCy4MV`iIF5R9^RY#aQ@U6fR%(xzm9g5|2WIP#RRaM|Eb{yLi4v_|VckL}Ff^)i}+*{+;Y2mRy+sX9xSqH6gVv zq1`P|FH0r9TSwNr3wx;Ek~?Dw>}u$=Y8D}<^wcvh|0Nc9-6(tNefXxpawInwadIW- zx9+wBVBviKPsgkEiaI2`qJCGvMBhbar~+R-1^e90u(;$KxU&&$=5avx_)C8Y z7f$Cbl>c&Uk7Z&&NorLBKnOmZudD!UPS0_p7dQ<9=;eCj_>igF~rX!`u~FX_Gv#e5q-ek6~j$%3W}`pm44 zxFDARK&ru@Ck2(rG5K*J0+xfn>=A2jx-%G>FQ&BH_hj)Fs~b#I+w$=0HZ~ZP_Rx1x zPL?PAM~nn}l1B19Vw$Zm)skfKx|F&m^|=^9U5oLG-|bcCfstkp9@fh35;j_H_EhDB zF7$~__U-0x<|<^{ z`n~Nn2@wJ0%&bSo)(6G8aVk@!b-n)Iy+GAN&3$;U%fNzbVL1&DC}6sX3LG@1*<4wwHhaXjjZXOQT&-KSO3=GW_o2c~)&I7rx^o5$g~4|8zfQb>skhh=PD zbBj1PU{rJboRqT69HjPTFp!#Acv0VIT$cDK+#y&Mw9DAy$3Ju6U$=Om3PGUKD%7uP zRUlu7bXloE+?q@@rk_@j?<@_Ha#fFO*(q9p#dQBQSbn&u3-G8pq(b{zYn5Ce_@q_J zj|uOU9Ut16s9Q=xl}aKN9rLvwY~O0M?(Il+2k$CS9)Lp&<{2My&kb}N-5^?WcHS8G zFMwkQS5aY8nnMe$(6zrY+|4L=*_n<3eAjkb@%4T}@jlqzYuDpD@=Rv-B48GG*%0g4 z#smU%idrbx84C!7)7#BFbSOH*>_gw-mhw=UktYyf!>2Q~i!Ix`kHb>+;ck)zP&Jmf zdGxEKJomcJdv2{dyl7yOHf>DAa zJ8f)E6@-)M<1BWSRtMfxMC5NW@Wxi#Hlm0JrI}2uC)^vzYS)&V;_#;Wy?oa^y8QDX z2{+a6@ScEAk<_@pQFPUxdgv>DOX!(b-(sV#;g!UXSPrfBGjeZOt!}RuV##@1V3S7@ zl9(czuoq|bH8T|?0iPuLeSJEF#{HK(`o;ew1T^1Yc& zZ4`0E;sOtm%nl>o@dUiP9MzcdfrBGQHfS1#Q?OJ87Q)?Xl@s!%5}9Je$Z@XgdG+wq z`iqOiEJ&&`sd~vG3ml{N9&7>shXLX_o+(C+PVb^tB_Re~o}1Tg4kSpG-Exq1OV=}J z!4@&x=wG;?Z}fe|;Z^v6oOxMlIC|ez!)oMF-(P5o_t+WLY+x54R44)ZwL>EQ7wW?o zE+OV3hu({9Z88j5uWuzSPb_OOqlMhs^vXI7y_(DiaM-Z^r33DwJ@55r+MbdkEd6J5 zd{O^$x#>!pHd@39b0M61cq&~#kJe0@8t~SDA!1GKV?1!N_^HmkR@%0hDj%6Q?P#M{Z^u*fiXiV+b09ZfVMVv% z4$>fzRhH+|3$FAlZAElk^d;(J)|`$6`b1)(tS2-u=uN41d=%AQEVu~n^(ZXJIQFE5 z_Sq(fl?xDs-#SqjM&D@fjSrHXq#2&=CRUt~g4o~D#O||;ROo9d;u0EbX%#=~*oP)` z{gxM+26OK@8Qvh@abcI+iUjp z7vFC4Uv0yENZ+?xe}f5UwL zLfyWkyXw>*;imW6v&s8YKW?&j;jiD%pugK#e%=wQ}jY5zmB3) zTC{$)|52E!Ys*0XS)b>^`!6_r;c1{EUY!gm-0uc?jK*L7Xi0Of8c36L8IY=`c$6+n z4CcWdSX9t#qa@}ol>u0$d1{(#2kzwTM*KHWSeVK5VXoLZLaB%3L_k=%hZ|aJLfu}{ z3JY_4s*M|dm;g{Clzy9{yk$-f_#ut-@w{Udl({IdtKLsP*Qs$xB0zIxEqjM8TUoGi zJ*huR2bQLTHW}81)g9!_oNCn@0q5SnCylRKn7Y+3f1B$k-2ta4^6v(ds#uzG{Hpk! zpLL$~_^#pgd^DoZ;IivkzZem8IC%m5s+SW|g72blTSd$v?T|Jv1^-(%bG5Pg3H=oi zh(s+NMb2F&@;IIoTyp{r(5uMO7B{q+_gTmkKT`mMXByOs@8PXtJd&alDfn`Cshj6& zCh|BF%7Ib;0C+SdsiMlQkq_~**Zm+}iO7B*N!;;hUDqhGK@3Z=^1#BLGt#XSbD6Kd zE%HUCvw3PsDk9-{ntlIzqp=Ij-kCUZvDaD}_cgk_+1oxhPXfh&R2LNpVqfT$VatF8 zb_FMaE^GaU%=dy;{jdDa?|6AQ)2}o(fOa9KjA5_sEInfUx@2`XX6C>ZwkfD#M^!rd zSmV&8OWR_D>0TmW>w#ie2r!kRN0-{01lv4)n2HAse+75@G@}-|PZoc-A>6{~XYcW6 z0;^6bLafixIN%;h3n;w5p0?4(s)Tg729n=^A!3ZB&Vqg^;O^LzHOP!E zL8<#h28W#WC_+-<`N@650>(``P&hYUDyV{#Bc??gj%9cq&@@0%BjG)@1jvSOob!pp zMpJ^xqRnvmgTxui%84&`J^La@ZzA-bn&#gL_$t zp`lo2mDfICt6yezk~J(FHeO2IfY==iQsP0;5OY=MRNBokFA2wAmWE#S5eNr z>b%vJUH$14^?jA>v(o6bOPwFe3xUSll2L$xIJIvGM;F-lsEK;>*{%xibj&a<5yRO1 zzL$?u$3=z`q#@<05W10#Uf{1I7Z|xB%P~i4ApSF}CHzbQKpoztj3^ z!w4i{h<^n|PNNW!Rs8(;rT}BVLXQ5|PQqYTL$vxCH(JpO_~l;fU+q~}xq{lv!Jpr? zv+F#bB{Oh;c3{+X9cmVPN+IQ+D1>$IGIq>*6B4fyB@2=qIkyqp`b<0-503 zezFfBe6O*w?p~NvIhy}mnRE{<+Ai^+ckO}rN4cezAHijcb{-D;rJ1=f_n^8ZNm8ZF~b}ufUU*T7Ks5M{kn#%8Z&>qq|*TwXLhb{tAaW+U_%<|B@80DOSVPR#}bOp zDZpeqMP;}Vb#D2L?yUxy6as}(Z|(?d37t669Br*c^pFXVwo1Lu*-dSz=+likZN5!( zF<9W}CFYb@tgKmoEWt;9Xyrvjgmhyo5D?(r8k!eBAnu?sk>yk3%OD8s2Idf5{Ra!o zU*Ni?b7pF-ZO(A@=P`V}_Hu)fsd;6&odYig-}y9h<@m}HHW&9Bd>}*Uf(Lon^J z-uxcqyX2ey2^!v`nfoaLgc=i`?sA2}Z=^=$onpc!e?^z{Vc?kmE{Pd?Ope9K;ksOY z`6$AUToxmNP1q(p^P@ifV1j|TxKvD@CBz@LbhR}iE)t6c!N;#^GRC2ml0>FD0PdVI zT`Zeq(mRpFhsK#vuXmMz=oFO8lus1Lx9tqDMDY#`!_2ga$R5%`wQS_T1v+?Z^8ky8?9+}|8_Di z1CPxy53C`l)}598y*0YeoE>p9uZFfi&=j@=m`KrgTVedM45gB5=e*kE{<_ds9A@%3 z3BAOJAYysOA2Z4qn}@68jVCorsjOSd(8p`y>MY&}($!}s^XVjaZmOzx`fPLC#FGnH zJZizCw-txf0eqYqgm$7IBhn7{V2^hhjJ>D6j8#4K9 zbrBcYk>)e~Qv7FRmyn*}971+H?njK$?wpBKX|~nAq=$6O=^&pY2O?4mTaeO=`=^n^ zc?)FW3tH#Ct>v^VBgDR3)hR;uJ@b(mAsehx=^%y6F#dq|XThvMhkB)9MRn#J>lhO> z^-?dqnK1&mb3O|n-6aA`A9s@F31Q&}&aeJ=l9h2ZVZ#fEfo2A>(wZ{pNUIa}$mz2s zp+II~`dsrSr2K3)DE#Lg;C6<6>BfB}*mK;7mKoTMrpn6KoyamZoW(Hf8gwTVV$5PooEG-APAKhX zv8*9JWqG$5Q696g=BLkAD{YZ&Pc+wKA2;I(7Y3ue_7wvQ^hx@;`~PAuz|C$yHckCk z%4<^OW6fj`B6i4DZs`lF`Ave>h0SE10*O9@!cn55#edmVxjP^p0%%0 zwcTO|m|pQWzJ@~*B@M-034=yFi?rNz&#nrK3@>2NP)S6qQIUoJ(~JW z6OvR2tQP<#7kD`&nU56O?wvAnC?CKnIn*Ve5i4cs&OX;Qa-4 zDh9xNGXed2W1IB*^x#WO5o5e5ES&x*EQ*BaO1(ZCk)R!eGTKUQL^XZt1-D2MjJ?Q^o@~h4 z==3x#8pXK`LC&}~9afT_Jt4yAl&B3<2KcA?79%aS!Y%89>Z2F#_HmtFn-wJUWmb^p zJPe}zc1QX_mH62Aa`1_G$LVK0XxP*sP09Rg>tBzG`KPF8lyP)Q<}f`D1Kcdbp&N;o z-P5bMkih)iP{g|5$XA1)8H7#gz+-$YHRzcz>){az*#s0hafqZ@pUg@SW61w|_*SL9 zU#Ho|EBs(JJTrD*#1VRgGUeL|kS{p`A}2R5=-t2Ia`#*U56sMmIa9^bXQBGGXutYoYku}+zKi4q zCiv`MH+u6UTPuKf-8mUwq?y0)5GaPk*<5J%rW;T(;(GPKV?x?zwCk5UZ=MwSa?IyIU#;nbanW-Je{{aXRxNEb$ycGAPEVut zk!uyX)QUO|a$L(+kn-jwwAB?hSH|z9>*o8u_BFyPt-1TBRuY{{QU}W0gLBz(`ymWXWvh4`+54tcx8-_p{P{{ts)axZ_a zm%843lfdZJY-3c|Suu~!pPE_CuqHYZjqz-WHXHc0A`df3CbELz<4{RwGTRc6{{g9| z%R)%`T_rQu7J^((6Ua`AIpXD+d*CZfvN1Ci1Yt&vTZ|H=tG51}^$^Eb zg#~_S`UdPHPS-OG6;DtXjjJ6^Z=x-_65E6*e*7WEM0{o}V8neu1?S&7%8@*sLwr?g z=hp@7=|2mOP0$w$PFdpiJMil2)t&^GMT(_tv16L~us)mfJ+wa?;Wx?exQ+J-Q#@5| zlzEH5h?Gu18S>yTVbzzf9!$hYAZXE7BHg^KkpgCMMA!zFtd@iuZL`;6q36kz!pKo? z$~gP@D+gu{v6S6+Rpn>y#TZDv3TR-arnb#FIV@mF>$vivmX5`0?BD-<&5tLaYu<^J zwImdr{>s@ZhOu3IBZqAniveMs%O{}Yp?Fg`8VC{IFM{IK+K{mSAynW6d%t)`#vjp= zEvOCPoi;luk`Fe-Ld&$ac}dX>MO0^8>|KG;*$9z{<&lf%zVc@XWho+!)6>hE%JZ_&T=p*)rgEfX(%z; zuGDS#zme-UP#dlR1#c>O%_Rcc9_<#O(Ln6b3_@9QDPgKR<2T6Ry_bTMzqPTm0=LgKBy9@)0&Sejs@sgR>(Dex0N+nn%>*6L%fa=La+ z_t`46`*f?c>9qfJxS2yIBd5$e7H1$`Sz0zIl$4V(S^D^TI-U}HfK(~O*Ce&#wf}Js zDm7%b+|35jI;J${$BNp>WC~L$O97Hx#MVQxbH(~dljzxZI}6VDh6jByh%r$F<>Q- z{p0Gka;Obx5%uj0ExdUa?2t;yQi9y_HuZz`5@GWP@e9*Uqc6lX0nMk;1RRvP)e1OB zjBtW}u1yS$i`$a(szob@W*_q;41v*gHMQfBPQKPf>DVe2n<%=~l))V^6Paj)Xmx=t zbV@d2_NfohJdTiws=B=*+-l8y!9PnyFccI*T^1iGL1HPf?94@6ACoA!KOXSR8Fq_bw zNu0VgnIEj(98q02WnmA3DCl&%!CQn4;Z!6P;aHGH-5VeOXPoHW>N$j-Bg$GgaPC=G z)asI`eY~4=qA|j*9Pa=xyz&90$rOnbMJfSr#>1h#+y@Ddw)m{IqPNd-Fv|s4xn+C8 zXZ_D?lIQ7B{it<&se%2D>pdyvKv%AkH_II9Nb2YQ^XkyFa#%6~)nTjsZ-zEU*Q@$& z$CN!CBe;weOhzQ>r&!wkU2}9M?L zo21KOupLMwh2O9l*$FmE8)gWDa5}|)N0yH~JIj^K29|H<{XpX(5Q)@qczA?pV8^>y zH$+kkGIjACnxZl%Z?q+2!9eAzsH%KGfi0o3YiUBpjuG{5{H4I*u=}c58cCb}2WFzzhQ1RI(=r8{u3@<`oB3lJ^%Na01i@U#@tb2Z zin^09gC;}u0F9iA^0@;S6BbtKeE()bsW~3a1@D?H=+D}OszTrA)847yY$KD_WS=Dx zGeVm!#9Nt%*(klic&7qN*r4w2A6WCt6!0hQU>G6uK#H4tXHfT(EYH+u z%oN!*gA$Qr2bVq%xnXU+j9-sY?4?KyYZkmQPI=F)pJGoxT1dTGwY$>RxH_i={qP2( z1dG0^3JO5qR2c~&i-F0na+HLSQYN@D%4XxY#`3OPHPm-#8RBk5W88A0w&q4iJ@&@p zmdh})D2yEZV30vI>0T1%@i|cZgc(J!KA1VB|8 z&c6Gz37>Cli$g|`6`wjiJU2X|kLemq$Z22%T5tl3*UdC1 zY-M}tL-Bq5^mpiH0vk_wi*~b~pV`~_F~n=l^eF`)7({~IltNUf-XLs4sGGnnOo5BP zJ_K~%L5aAkUV~Zn$|tf)8%SQILw}7?#m1Na> zor-wf-PL&YVD|JJ@!La1@esKlTdhR$u2t-tW`|uoqqhi>FF0bcmV_+e+H2o*O%!5n z@}zmI-*Tc3OEj&MX7>P6qSS?|%ETJ{WRk_d0LNEhpaN++ukI?N`F2_s&|4zHrj4El za$ry(2w;q|1edTU|)_H5D`{wNYr33Z8vg zPX-~_s1s^{A3Zuv^cv3B7-jDpY9a&y5)QJ2_D_6JZg+t4@hf(8>S0jWFX+e@!DfyP zWD+x{&i6}x$`nMqNS7u`D9*QlG0z)#j^egnF9-v~NANkxy7)Sd5sP*jULjWr2?>=Qw(T*_C~cg?lIa>`%{c0yP(9e(R_#!@ zfbu4=eRQO>8rCQp%{AyV5+ZT&!OXxe_3R&atb^geHVL@%99KR#vec8MK{M?UWBsZ0 zslpO#QTYMhhGl>GF#@Z@DqS57TAMtAyaaAqOC)Gn#uF=}6`*}M##{7Z8Uf)(vwn%x z!2qi&c0lB}`Qo_TF!1PDe=wW~oUucv@XFo5L)gt3wi-R*ebttcJF%#S>ixRDrCX&f zrl|bi>Y%~rvjfwtCOJ={>0dU6Yh{REmUU;EZ6@;E7Zxm|l-9c|$PB!Jk3PE;B#OH9 z8}ERXw&Vnj@CDYL*X&DlpSn>6m(*lDg=8ItnT&gfsYSDpEBL()*{V4{wX|l$CN=z| z2qyw`eDp))f6zC>ov6kM_dfqTLBuQ;?7igW_ z_76C#>k^?QJQfYB`7_$@gx1{o6Br@I5m~(j#p8LX z^KZ_(@ga8`eukOPT( zAMGc3EsXOpzaR7Z93I#idNpy@Unf~%ll`OOu!m%qFc}N}SKkAh&r$NMSWd5!>0)Zm+i7}QpRMV}`kS>Jf~HIhK3eWD{jP*Ucp-S+ z(Fq7NmMEZ?GuA2PpLakQZk0B-7g-C|7DGi^kOLu(A{%C<*2byhGn$2c3bKLyfwTuX zL?F{F!|C;y2$8C7Vds`?pIvLlBaiqf2B?xTWp#33C8&Ea<%qR24y6%b6-!(i zKN~xBO57cz_MvKh#ZliB2PD9-uS5TGUqWI1B~Kb&W)~X27k;IL*qRDm+y;5ZpCz?# zyS!Am4-$^=w5EX{ll1l`g*UBu=nbbl!|*s|%R6%#?d(OpI>`H%v66Z4`7z=2j-Cb^ zH`6j6dr`hUVSuB#L0+h1Ly4Ft7VHzY(R@RsQYAcNct}>I=Z%uibFT!Nuk<;h@Uub! zCb905HCdcs{M8!A#9g<+X)}i_d9k31s}RNWVO)=fY!27%i5e2y7tndS9D*}sIsGC) zjqN)A=*M%`&N#08VYzm_Av#Kzam#zd_^DaQ2nw8z!BnOAOoUBnT*pb8E@{i|^*pPU zD0Hq6XmP+?-T-+OIfg;4*Fp*E{+J_fWonwbwp;e85@$t$ZOil|JZkw$Miv%0PshIW zR$0(~h^UpwN;^DIvD};(EYRNQXf~HV-EK7l{!M;Rd365*vG>DDgQVqs>+J6`ESNN> zcHtc$Aj62{&|tTP58He#jPCsy%4x}^$iI~2fblpolPlnGVRdt5)StC4+QX!6u7y>}*78VF zh1gbAtR`rBvXdlR??cB0SkjnOifM_F zS{c=6mTs2J4qO1l5#03sJu>K0bP;pVB4t76&D=1-rUJ9E_qj+)^XfZEzV2ATIzUl_ zSy2?si8MSBAcdf}WxH*6?B%>6J(B@dz8*3Z+5LU_6>!0`cdH7Y_LF~JQsvT_G1nS{ zI`|QQr&{VmDvQa>(lloX=x@caw=zq`>_qJIPN1N%{PZDssmsi{w)rv!me~}=RqN&Q z@Wv%VJu}q>6qQacshSLtBl!0wOk}r2WL)j!@$QiSA?{m2r4g&`XBur=#>}{?xRHjgOn5okd$^az{k;2BSQO zePUqpRXoAb2;@}m+NV?`j^1pQlv)&r5ELSMSs+Eg-qE==iTg(?RrO`SzY+6VLFH~F zz6oGA^usT^A+q^&PxWwI=f$wQZgkl*z zO=?;+>+4O!7ZJ{Tpfzq~#P15q={{hXI154BJ=~W+V)8W%myvPW=!E+e(EN_(sgDjl zMLHMkYGrYs8oKs}PKyS}wft4xdf`m7lS{^`alCGUo0Q7akvp?jwx7gmdI!O)(Vl%W z1de#&u`VT{>j=58B|VeW0(M9wT#9ThQyf2=vB}Or@sHtyYS#eN0g*?*{R zp=bs(4;NZ~>Iq_TIjp|hqu}|)VIC{Xa~s!_D(_hXZ}2Hn??KAik{0dBMK;R4&+1Vf z`2C3_h4ZEHr?Q-Aw~#2nm_}zyJ17&R@Yzq8SU^g{CwTjfF2SpC=1|~9Uc3JEfU5cB zS9iaJ<*TmT5I=wS2%(ELB15xXI@DIWQ6Bh!Z%c9-%ZNQF0$b_P_49OZhe#nA0n-@v z^(rQo(z+I`=};22V}$q@6YN>FB!B93I&qwH!okRs+6!3twAVX+X9F@??r!h}IhB<* zJ3J~W8R@gh>3xfC&RcWj4SEwOc~vE+Lq;ilw4-#SD}=ne;v2(r8!U9nLpmxvtX0jD ze$80(oE{~K%&|Gj$?{Ol+CX5L$TJiP)4qktLrB;;=9a4@3E^141{L}@?h6KOhltVT zPU+C>@w}yO!65`4@(#2vzOj}Yu3V&x-RKMsN8?g?0sR3Zfv~?chWwHPhi> zjxn7dm23yO)^K@YQUQYd(-|>d%{`Ac((U|_8%MQI>AW}KR%*C@%4aF%$as9`Dgar5 zt3FsXmDa^@anM~GqhuRpJ5RqjLWge zYl85#O;7$HQX)-jcnoToqc$)YY(3pKxz z2X#76yQ#N1GuD%`rfHH;)s{bjR}S|qXa$s8P$?J!SX?t=Np@#!-E51~DQi*&_~ zxkvynxXbaA=qR}ExNk!&4)zAxkIq*{6yJ+7P%T3wNatpy7ooOoN2gZF^Gp^;sh`aa zOS40dlDlPa0AsRG#ARRjOv?ur!rfV*h0KR~fB!B>ReZ$M`Z>i0$z1ZtHb=s+`*$MN zveyQ|ZwSqDLoFF$kN7S8W;_B2g)>p<-$yg7wx;giE#=YBlgh{5z(LXUdea5YQB54N zXt`my`?ABK%2))S{1Ggz1Iiv!TR883Mk&3C2|YNBq|36w8*-||664=Z@n*atmO>v^ z3%iqK*4}l~?eJEs(fE@MCkD@%N&Wy^#3WwETOpnr(!`HK`N=w4AE$wth$~cvYkvlf z4S~)kPE3B|nej>X01``fNMjtreW23e-^dOVLRz(@CoB9FW}kHTF-v7QwS&cGaaEHM z#jEOJ=A`da#~Y7t7Ca4T-d&ZyU5>bn_bM~$P`Uv3&(xa$gA_LC6yqlEm*J zaZpnu=57TONg;?0%LyoPq=C8(48akuh2kX_^x#t)ln4fMhJ*ridKac55F}r?H3qBA zW-%2GOkzLcY0y5h{bg;`svglSZ5zqlY~nY25mTh*F{X1t#iIEuZ-iA`;p)SYlayHg1j=e`q1%5bzqYl_{kH;XjVGKYP}4#Y>9hMJ**K7 zYwFJwtO!(mCIp#_EI(R7J>C?pzlHupygu%9bnehsr)0q`^)$qe9wrP5MI);dORW=G zehqQimnUfDLji{tuWKh^3bE^8qb(fY8Cah9W-O5e2hPy_Bp1)PkaPST%$ZF4O(yqBwz9}9}+w`%>4qx=z`uHnx;-}f@7em%Y?9@@h zUCh3eeUakNUJkp9!w`u_V@PjcITE{@DnxV(kGg`{4+5!nz||Cgy*Sv%@ZEFJAl@&z zI}>Nxz!tWih$`dg+tI;U1K@0Fm%B}|n6UetjXc9SP^LA_4coCCS{ zU=LjA4ic{74-Ps!BEMGm4R&DEluXDm$zpw&^gsw2FrmQ=zxlUEDJI!|+7cYEx)o5C z0W`Op$(q<(3)7Pt_lE2({Y?x5Y<+Tr<~t(?4|}qlYSEa1L`JY5u<;&8%-Mw zC#K_Cu4{`&Jeh4jI|7r6djMAQ%ic+WV)qGalo6EJ0N9lYWv6krGC!z0HO4vrL}DcE zr5}I7Jw#A|Y=lZV-w8|v?w#!o)9{gG>g|I}h%gJRgCiRHK4rL^nI(HUBivEV4<4XkerBkhD{XG2PM~^jGuM3hIz>NWL zJ2nygfTL3SjHn`n1BQ-fk8x!%M^uD5jLydkzG3^EbFaQ3MmaKj!|0*@^|RCwlC!Bc z($sDu`&y%LmnnhZQ#BXd)U2r^+?w%LR#2{mMaZG!>*W{$Tp97*pgJLyQD zU3a(M1Tdwx@WK}BN}NmUBe*N&1<7Az7iXZrmkH*hl~QA6t($nY=KaFGluX#mzdJKp zB=-&Ia_xui5ktwf0gWh!@iRA2sp6$T2>sVFM6TPRpBA|?c36O+=g~nrFPGH8-yljD z=W33WE!@hm(ojiFyE8sy371kH^@NmTtuaweadWG?jIo_PiGjbegN!Cisnum_+Rm7vaWSt0QcY-n2jDD`!>dB5oE40tWG zn@$4F0oqCjJt$Rg>xSMr9XsQ%*A3bmMY@}wPC?Vy>%OQWD~32-7Ko=PuKPvxb$T*VcG^ScY4(@ty9WCQj%((GqyLUfghEX-&IIQOgCLr?zsBA zm|b_J$EWUO!MTZv9=5_zpcm6N(bvLpw@q4p9MzoG`E<_fV5UTsmr=V+hqZ}KNP2ILlY9qQU`fC&_zF8esCANQ~spyHNV+`#Eqr(&3E7>(#4hJ-h1cK>91mP z4eccyR>6V;?>$oz@W+(5@Ia9{J9l2dpR0+dunWPe>~4%gLmjk9s#))|C1T&mBmvKG zAjT+fZj6hb`8GV*SD|Slr%nv35YC5Rf;_WdUCV`pj+3Qp6x1tmpMUdkGv8pRN;&xn z=_myzuzwat5_jf2nWP(M|35TcR9Ad~M$HwclVS>)6K@GSZ0-JgWC06gS9HbU69jp( zB>4#BQoCq9v#}Vlho9u#{@(m3Kmm>tbtf*KQUWb0r!~bzn`jz&=UX8y=St;``0ob9 zS?0416?JfOiXz?`GJ^tS$TNbTf_kM&PD`*hc+_ML9|0G=#o*GyFz@*YgYtPs@Q~&b zzMt%i%)WJZu)Y@00hO#VD6pkKnvODAuTk4Wp)5o)e3{eN3f^D1`Amnyo3zKAS&3hA zncPIfYbA?9QGB=mf9n`Neu@0wARO=7V;vdv0md<;SGz0t?;BJORsxs!oWS7C^LgC` zZDdyU_vRo9>}6+EG&;M#PRKn92m`K{iR4ilWiIoHM&<(O@3qWeH+-mAJGF-_**M zXkn(hV@X5q^2vg*TR)x$dCJ57Av6jtJ#+}DHFez?fpriLI5D~^-@(w-aqO-H%ruPR zjH5zSQY+*)18@qUUA6TPnKwA5?=_U1RdCJZ@mn58FDbT@e5h5xfKx4Q8R?Jkf6_!L zS(g7Ffu7ksVlh;MWIjt{ELe5?=lax4R$Y^#3Bx^OS9B?rd!_|Mnl12D)w}tz!Q;t8 zzfUS5jeZsg7?b{5&(bnmW`pPSnaJ@qgn4-(oS zupKddPqC;q)5VG#?J4LRtoAgX5Zz7l3eJ4cBm~l#6T1bE+Cy^Z96a1GJwZ&Z_XlJ= z6|s*-Pzq@*ZPF{3YVcjsj5~GzJQofWnQ`*j(>gS*+pi9)WFCUBz?^3v2VAhft++(& zBNhHIeFuU89Ht&I^L4VHtoA~r@2|u@>7F@O70@8s-`3Qah{Rbfc+mHhxc?Jl{do-l z+R^Qr`MzT4hbTXkNrQ`jhEs#*u=TLP(~cBbsJluYcG>*=qwxfH}x`%BIC% zOm?Dw(4KaMH<+kA4Hp+Ch(FB)6Ff~Ab+H$drP@Ej1gP0E_{iJ7w3g%8I7Gvth;=pjsTK;+=v>o$HkZNvdQe*3FrE&!h7g13|~1+*^~ z+3rM$ulci7Y|^L37iJ2;G-?N?$YLvIgcrv~2YtuEAYCbBMvZ%h)m?`mvW5+Po102T~^9D(3iweQQ$Kqa4EH zVLI4mDuFc;%wCt;b)L(bzQ;b&Rn^t250k^k*c?TbTKF|a4uY?h?D@!~^h!X{@Yyt%m&f~|77cJ5m!D1VVatZC*l#*8^9wj0K(k}U)(xQYLJd;2 z#$^t2U|%>AVeS|?9J7|=mngF?{}7E_IVtyP-u?t|FH6hNvDU9cUYm-yUc4CX+=kvf&Vo;GHX%t* z21JzaJw`7UvuNBggb64l_-y{j{z!1iv3=6n}g@yPo!iJcR?Y&A=UGWck6k98iFiV(zn`&X7GgkkvQ$#%aJj zk$H&BgrXJaUIJg!Z}OmilKf*)kk8^YvO;Abd}@r#eeng#t_gF$1;}= z)I}4;^3{K9lM<>Y1pdUL20TMB+pY_Q0^XmK0H*K~pLt4yIA*HpT6pkuk_dyC-#s{J z)C=RaTDvT^$Y~l!Gd(1L_Sm7n?AkO}`~9TI4r09JL$kkEC>PIsGsNib>aVVO5WXG$ zPk?*zr8ErIUu%4da?mdfpdMv2<~jrX^h5-gcmiZz>(6=w+=Dcm7!4gQxG-MdNKq@! z!aTVJ{%7&HjJG=yh zM{)}oMi-w5(xpkyjuhVT7(Gr&Q)#XOK-`WwooI_XCxOjuhah zG)KXP8$I2ry(a9zvze`S!GYLqdVJ;@H^|vK&JYKVvKMXYnZTfpZD@>7VAA4g&%u?> zTO$+@V;K(}(txp?voUL))L<5F%FtG;DA$mE?wqJRk=CL(4ea>_oRVuMw93$Er?2Jv zN=Du#1Qr2x?@EB1PRcuf6a#%uP=?%f!9|c9k3n^;Sz=y>8LQctAM`J$;kU7KnLAJtj`Q!QTk{HgQZBuuMi-moiB+kb8BZw^WgtPK}tyS zg*S9DX~p%Vi@r$aIn>ZL`3DmcS|}p_QkRFl9g5fU<6KTTQ@LfZE7jngzuTuJAXl7S z2U{zs?=R0mwrU%%%2Nwv4!pAXbr_7xZ}6wQP<~>bsx0Uw8pM(@2k2lazp6+BXkK)c%@~dJjfMjYO>;}M> zASRTMy^mDp6&`CsU?bmWDtrOm=1-&4QEB*)gudTx*4-6V^{T0G7k4F(RY%d61d|-n zA-uvP*RfVhNa5f%ZnNOi6&JjXSJVsjEOCnXtG4U@lMZ~fXoe^`2>9yJan<9UbCSve zmtH7&U#^z%qytyu6^)l_Pjb-H)!51Q@zJ4w_ml{+FRwe$Kg%jX4^X@XRfik9#FHZH z?US^D8?+vZj`9_Cd3gzIGcfAndOObeMj)wA(h;HZn^v6nJKKM0|2WJEjUDb|Z7AD^ z#YZy#q&>>8oy6TS587X270UgRQasX>+A6pB;{d;*#)fW$gKc zOULP6vnr>iOe?XmQHy}aFCqcu^Vs5R+Ha8#=*c7Hn=wACW$K^GtzJ{y9SLIibTkhV7d{M|SarK-YMZ42Lg#Z(6*d@0AIYpCHTo zktjq^JPo7vn&)W;WwpY$mkQTAYTdtx99YIFYDk&=-wR3;HA6>D`cptPaJn(|!WM1= zq~g^Y@k0Bv5oNiir@ZQnF_&Sp%5+h07}C^Dt}_0C*+qQwt?f+DWTmN~Vp{OKc_lZ`-RCYyr04wl8 z;^%;@z(HMsv6Tc%uO2?)CqaJW)?dCGM}wH@C=LVjwt?#|(`pHwn!tLoQqdsj1I$g7 zKIL*5^0i@q5>N{F+Z9z2w7b$k{n|)7llqY)bR!#HW7{ zW6<38E{|fT3-b&d`!kxEx_S>d9Si@~qsqOz?kV3e!?fUepD z@M=$U*ZwU3RcHu73z?+NdXY&sTFSR=9XpB3iU9~-Dyp;Tza$PuurM>1p6&$R4^hTP zj0u&VLDvHQ^bV`%-ZHF`yDU!liK`Xp;h52J;!XfI(+5DD{q5AAzc3sC@Hr+^CVLa)+~w6jSpSkNyFJas&(4}9P2 z#j8{%gA#+de))l=PbT~Oh;AweaLY7c*n4b^YOde|7X(;@I-nytzfS7+G|tvB!7_0u z#v-Mh5p889ADoY-7M#nq1ovQ>NArR&bE~^*Aa_F|S@avY8lq)gzoZ9cVU=g7aA|Gh zmgUd-PyjU3H_CD0oTD_{v9l;<-fmO3n3QGhShW2@%SI<54qVwz#2WMJvAe&;!^PaA zUV&rL*20ydA~>zcsVCY8i@Zvm!HDn!8Mnvt(fw7SmvjeD1~!- zi4M=-`x8Zz8Y&!w5u=!iZ?7%ykFpjOAxixO%Y0YZyTe!@Ogyd1s-Y@9#Wm$qNI$6T zw8J;nVO{$Y;X=D!f;Wi|KH>G^3(P`$&;iCyeioVoe@z8l)A*3c#h$`8wjF!&%>5r1 zm5zhLN-b;O+4a$=4odWmNze7@0CLSv_;5L7IF^_;u#ob>sO!ZHyi$M;GNybHcy-Od z3XI|>3H3%Q#{gtDYgzSJ>3~K_mr273!O~F8jy$Q+p#|+(X~b{eE1cU}0(HOP33iLwSfxo=5%`S>@K5)+IXy0)olF^;{8 z$1eYFWKaRhMc)CCZ|mH{&FplO%tIh;cp$-cp@XsYDnOmHf*~gMY!i2WhM)#sU>sse zotKP5xib#t&h0F8c!)RK{wy@kVMMd@P@g13D>x;r(hn;im>go@}c!AbVsEmBbnJM+~-uBmL07>IC+tcd|Virj{(xh3;%$MtX1H7MZlMr^LIVKRlOd81Nh#ixsKFq{g; zmJBV%Nu&8?BIzMHvUe35r^)ky9ww6O5+&{+udyO8V=Kd56g^QRFjtLFpVMg+sl?;^ z1!K~VP7kfmEug|vOc56__PAgwd|-Z@_Xn97(%#69i9bZ}N!|!9zBVm9-`spOVcTZT z_6R#gEVz~uSN^=7f77i%V3H(=lt_j2#Z|Rg3P@64~0PCvNN=%i@F$sET-wYr0k!L3-I92 zIbRS!j3%pDLZKY<^2KX%*u8e?>CkcZ@ZGoWit{vD1cQq5hVumD5>AQ7M&$)#C6;D*M_2zvv56d*OA7)6J|JbnK%v^^fZ7>$4t{TcU>qTXEh4jAD;vAXxbLxwJhZq6G| zt%1Fk^fJG!o{9xdZ9r^pKoC0QnD|Rr&AQ)523lHob60;(cjb$~$Yk`WAJ#Awn#5@G zLgiIWVoFWI^mGo)b&IUJ5N&&hoUDwEGMG2sL#T>FFQrAZ=csAQ&tkMg&Y5LP8q$-! z)Ay?Yv2C^%$q|vc0g!apAX$|E`!nToS*P|K~G&zV(GWC_hm(YxVU~J_|pyV+Y99nm&Sdw%YV2i z_R|Yh-(J*xvzNau#!}ykoNtTz{Rz~!B7az&e%RN3xS-~@Tl>?!pWp7X-(K)%yGy?< z67a&NX4u-VeI&a{Jwh09b)S9H+zV258vt#g$gsxYdwfV{#X*#!S2MIXy65^85WjoO zylufy8oOLNRGO5mKvoVHFYh~r=5G-dCMuj`t{R;wJLcmig{T&k0h8cRs#{I zooCnqve8}1#!q2_=>!877EJsM1?!@N@~W6(pi1fiRRX24C>N0tHA5keZ+<8=!kGiL zos7+H5tpehCko|1H8@R0ry8q(?w0f?jFzv8iGUug)+E=}Kx5()^CJKMhYE)>u4O-fP#s(KZ{`|_ zD`)aoU%qki9k<$rC^>+Z001Qf!_T zlOqrCTJW%?kwpgAB$VZq_N;cRqur<^V^Q#MA!%nq z@W%}!Li2e^Ln4QKbj#_CsH4ic-YGVvA;p4V5@fb0gJ!%LKx-v+a{;KPJtz9ZUJGB( z``sdPjnlT!3b!cee`Q43<_}XKQB>W=U4?B{`2?@%{!7z zBSBn}PX}Bj-%#>l7fO_sfglM4x@RVN<|3EbT9@u}&Xhai_pi~vM}!*1Xa?t!Oqj!R zwkr8aRj+Fv8bsJ;syjo$;8Tmf=9+9amiql#^O)!roZ&MzvbY^M2}Xb=@+1LFfaT|2 zBO2PE9=A!?D^`MUz_|NOeg=`Vy00L4XqBkB2)MM1TD$rnv<$v>3gDT9CXu-wyaW4d4k+Z1iNhbWLg3 z-6brnfqlv!kJAIRO8Yit*yHbE4E?Vw8c;@2500Hk9-pTDNuqW(fvPrc1M9GO1g~{H z2lFds0^w_Pe%7D2%KLCgD)L+19NgBwDkk6A*k6L}OMh^a$uB$~48*rEyHO$`gL$?% zII-c_T;?GGs0M+^YA^OR?6%iRNl5*X5}YCUBV7Vh-kZI+m`PKFYqO4moqBTS_KWG>sJOBcV871#2KmI>>kyAR>z}b9 zSUKO=zF2nZ@Iu19w{uvVqF|O3(c;zl*2W83%US(7E0+Rjpx62&Ya4ocrQW$t#{lrP z{U;DKEWBVv_#gzN+=UUZJE0s|K>sm)+&2_gs_s8_8}i_Kl1WJ+Dc_}MTf^-v&W&2v zvSG@ek3;D>BY_6kdB`90=04%7gZTZA$7cS!;tH8X02k;~z{k$tbMO({Y9uF?WnS)# z#srl8Uyu}1tO@#5uSS1F2gg={G|1OC7RtA#s{ zq)g-n6aQ;sPbY!RUcJFgc_1^e#TgWbz_`A!n+Fp6T&r z#$?F~-ty!q0YZ2A;TtqrqD$yYxo=kRfcpQ(IqO>7dA7+vavJ1q!YZj#?LkxWKL%@k z|KRi?t|Omm$Q})A?m9l%)VqeKDS9Xct4D}I;F{Z&w`5Rbnxt5T8%#Ys+x!gI zhiE3q?%?~4&5+j9_j@UtXT~(9{qFo*V4O~n|9nm@NvR0PQ6b1u<;=Jms{(y?v`J9Z z&zW8-Bxi23f-bYu78lWdiQm>}mr|(^{goBr5aK&KBtegzcZTNFo9}k1F!-lxhYXdU zGmYwt+Ba&N&$f8*z}L8GfL6&JjnbR-ucJ(!!fUZykv%ImzjhG6IJH_LgFQ@rr-Xn* z@Ly$>iOX}TN%5)ux!_CM!P^{?<1=dqn{DdRZW2)X1zoA?WO>w1pDZ%qiprs@c?lH_ zq?n4bh8j~O6ZI>^J|cC`&jOjICE)tQtVm(sK;IvWG7NH}g!R22#bcybhMZ|z-EH`k zH1Y~9)UgOERMax{ZGR!K*yL(>s2S@ykV1?q;94BoOEfpH)p~Y4#~6a!8Vh@ci`e)d zCWX%PK&9NJ+q@mQg^Y`B-6X0-2@sn9*#wF{5kK||1k!2oa2`5{1?sIyc}D^!jCO8r z@;MP#%;MF9tsGU2tKvZ8S^yWfM%#hS*Ee(URt7o>q%jeUd>^!kNF^&uMYE#{gA9~<) zC<9pc1#mzQ)(+DYETid*(Pnnd$IgCDN5*|oX;8#$B)(rKnnD&0#o4j))Zy+mB*)?u zkFdS*{ISPpeC%a{D!cEv#{m|>c}}y7DT}47ZKokgWG%oM6vg?J@^Or7ub_%OMuWM(v}AtCqaomjgMfkZA@S@4$N8yU>^tsfsw?Gmz@OhAb{QH|nsgw!LweiFK8w!p zK#PADnmWb~GBY*3g_Q*4=@;T&MVG%3vfArvN0UE&aOKR#x>G5_JavvjSnC?Ec)R3XBhP33s3fpNEvmEE@{F-WlGf@7W35i zC5U_+THby8U780-GJ}(UOP84rmE-Y`*UasI8GZv%mHlyrk8)g9G$nPqb4IS(qskd} zM`EY~rPM34J#!Mf_lIv>^=#%Eeyq;g5H+b^?fB~vpv?QJ4;*c)J}#l}WCmO@>P*3rZ9(%6O?O>}xj>RcSA3d}_-&Xy zJt7JEWq6c!4{Z90q#Cm*9aWzXd-KQvYYNr&?dl>r%4KlW+0}R?**P*ix!^8@{+;+D zc}Hw&0N?eABSc1p|B|r9>vpR$<~ZUn6>RjqZV0nJWQXq&r4Z?;!f|Hoq%rYKNHtx$ z%MCs6lu+ZkbGnquJzY!Zdi&?}>K70uX9|_4je*XAYbtQ~q&d`x4OR7z?M zv*o-O?Cqz(_G8kCTS7lLL}F(QXM|4_g}JzPq3t7JOeWy={gYGGFzjl(7a1eDgJ0^w zU}~P`@b1{@$%})vkC4rOnm80R7sROH$^+q<@1iv zq2+s$6{aZt<&$HGmHVhF;ba(3#wgT65_NIfG<_SbtSu47D95iql48X)usH5FKQl?( zg5WXS&2KdO-<~{5_(KSuWkP;v7A<@KfcUs6f1dPAF1KP--JU;>0_%GG?2imXT1cQ* z1}(~hh~$!yC&y8Q--~1tx{}yQHNGHA?SN>c>3CcfGt@J;;pR$>!;Y&HU2E`#3WUZU^00I}%RJyjfL7M_e8qQD~!T?E0pKfB-9Zpi=!_xs=PL!&RLvFST%={y4Z zkVo&!r%D*0l)AEjpj-|`>*1Rs=)3Oh^a^ocwAkGJ{sd`EjyHUK?MW2@y3SIZLdyaAde z<$<2FDo=Z8sNz(DRi-Qc8C1bu4Eh!QQB`ZVRsT|lf$&@I+WP^@NyGWXiSq&XP#x@K zC+GOz_aV9vfXaO4c}GyFE2gW5FIUyR0+gSZ()N7L7o{kp0i~V-!aWKb!}2S_IQ{sf zE8eoNo)u!q&jP2y<4+cp;|2l=LYe=`K;tEFXapC{t;DB`*UEwfL=pWNzNeS~eNkoL z?*K4f=3I2nrr998lHDEgm>+k%plBlPIxZLz&^KYcNNUP9K`XeR6n}-x=Yyq+JuoC2PxIpE}<~v-IT&rU+l=MQ9=5+9Y+}!ZP&xVY53@4$9Le zYM3_!3B5CsT}cVQ&dB1<{X~K?JC1zGbUuEUW}$L*rV*wsaFu*g*l~&TK&7nfV>mnA z&@>C`=l=9T*ts!vcAN0{!JF2|@mE}8I0)q;(m`=#wx4N$?aZ7wB3cIxB{rW`#ra=y{X*fm|+G_{a~r+qiI)E!*1ov6(BIm)UepL4@F^ zu+wRPfrnALP55R&urq+U{Rt4ZK6uw9U}IaiN%c!#-)gI&T+G&xZf0_6fu^?E#p9#L2hg>Jj-mEzK8Ri_&Kk8N>z!n zijFMw->6iprNj2t^3rLDTd5fb>SlLr7p#nOWqPW7KZbE^FC9qVHKPf-j;GhxY=hiSJ?4 z3_SCeDh}a+@>uvGXJ{FwZ4ELWBZ;+K_l)gm>@;0YfUp6Q!t3*_-7cO;t zc95rHAAYoMwko*V3UhYA|L|*+Y4POY{~1}X>LUhD<~}BdPik~c_yM|wb&XEylnf7N zfdw_i9Wv_&-LkaoIa!+CAOxP5o|;=wuU^}w3B3Msecd()e++OMAgsXWBrQ^>m^kgP zhrPSL#DU-{B*e9n8ugW|(gG&Q9*EMa9dH}cr8D`m6wWjCH;5W#QttddJlj&9K)oyt zd&U!|8%?!C>&;K^q3baN-2|49+RahA0R7U$;VJBCIq_wj0^sWm{{#j(`dm@f@ivac zk3W-m@DD+^h4dYP@My_XHm2q4NbceWluzMpP)dbQw49A@;>6AdJig+_)=sR`S__rK zg$QNHA)byrsjr;e<&z6koBdg=N|I-jE_=1@g>6*y z!nm7Oz$o<&1S{BP8qiw;0TuorDS*4$2=Knwx441m#-DX*0e&Lk>*A7Wltc)0##YT=Ut%y2<-Nu%D_7>y zEO|$q2y6FMd&!Y2vm+oy2!KnUa+4>(qgA>H%1m|#a5^0QVSUHgB|l3MbRDQ1Dn5o> z_#B=qSZsxK=s>5h@;y0hDJpsIHDDBBeD z`2Rg~@HQ|#TOHT*$u$j&lx^GC>U`fPpCU>okfSXAYify8iOBJKK+9b06YjmS_W2WkUrYAH2mZg;0>6=q- z{ANQQbaT$@%r&n%+Gzj3G^x_iUIGOw3n6ul2m}0JmXzjJ$wzHI6ggcsHvDBYi|-n$ zj^~3NNjHvQjPuuA>_6-o>LD81kH}u0-KdBBr;^lu{xk~Vz zq_HfijC#hprAtwfE>z{6`AvYP&zZt90&oF1*caXi0uUmhjs&aplHz^5&hIS&R{aj6N z7%)4o>;BmEx?d7Lhf&0vxmj9CX5-iu!Ks(XRBtJm3iVnJ{f(U3j=V};CF}%k3*tKm zt>d0oodNOyM`meoesok)Zf}b{s-ia6CQ0tUMLe010a2s5cJhe^2|Z^tbz{P%C78Yw zrq&U>9*C3w0OQ-&tm5D1{cOR5--D~yoosDS!Y8wCCOQxSGI*_280m(8l1i7gy@LpB zSU_vj@Fqf7{k8v~zDnb$6KSoo2F4wSjwbr%mvVk@$`R2`VT0TbvynrMVld=uY zinsLp&Sx5c{xfhQ)Ay3E_1Diigk#%8r2F0C>ywY*y&-xi_nimb$P2Jb^tDqo?5hqo zC;`yGB5`8P8W1S!#sAGw&~1VXER2tq!Su{z!^7Sb1-pFkk59aQ_(HJtX}!b5!kZ3_ zadOlb#9#Bxhv-%;-6A@q~+%6t_EV9N`LFt{iW+?t9VAS=C(`3Il zp&sfqfzl~gq%q~3uC{P!(4d4DVj9!>gjag$pwi(rDf)ks{g*><813de^Re1Y#-ojM zaPe=xmq7)NZj}wHVL`wWH~{*v9OS6<7rUY})+XEGv!)6*%UMmQ5!c+3hSKI=4i*CzNx80Ql}DrEvQJbZNp^ zBYsU1=Z}zHEF(TY_#Ckg=trs2ZQO|0vW0POU=C{nt|_U{`Xc#rg**R+RP%jQ81r#> z3U)=n1vS1p&5j)1`85kDTv?Ov-1DMBz-^8j^|nTKt|Nl}D?gMXUf9bR7}ub{Ux69H z_*ps&wu;0%f$;2v{;jCEI|@T1c8_UqtP1_R6?!a8$pv*A#rz-eUa-*Y%Pi8o-QDrV zaI*6W0AYmHrP%dP^3+w#eOWn~Zc%VZv6_GYzAqMlQO z2Wpy){_&<7Ga ztLf^mk_gmW(B?F%{e1AyQF;BT+VYWNTb_bLLQCvqK62in?7D(JfBr356Y%qJ<;9Fl zb)nPQ9R6n|mTOeUX)A%ufk!L8cj15B(t>I@NxmeoqSoi+mu*ZYV1yGBpw8loXn;eo z`)txnDHbnwF(}esRalwpS8e_auy}Kx(ftas_?t1i1ptHDoLbAST)vHa4m`#E)qd{FZa~12u`3y;{0eKWC>#eNm!L_8n z4TMkfs5ZjV`>N2uwQA1W$=c)$5eSUYf!?Fbus1v|-)?@_3 zvxrFvY|i7W`&1bEyp}pvNd&T#6XvLJCqq6mWKN!zyX8$>Ba*EAUdLd#J$99crf>Zi zt2#Y=%e}lzUmY#73){aBSW^{ok0^r3kLO!HCLF_!EGjnz>+X^d?(r4gyYHg? zc}}c6eQIJZXGXPPrr4Wrl+^ri=({=i>VliAG>vB^okou+-NaYiTS9a{$>wKr{2|-7 zy||`ZMNhfDRC2e(+m7|4&5|BTN`AwVKTGlXbkI6wTaKt?j=C>UY6Fz7sr<>5No1`P z*QK8U2y*<8d=w5FDCU$p%6} zi_L}>^QtH}KikWUTi-uU|r`7;t=Wlpa>3!^be4UL-sqPq9x{^_rRpC}d^~mHWrNBzWNTEL;@% zMsWKGjSCchAn!xmnO7iVEXMVtzXDmzbJ^>^rF$4eoK#wzSDW4uyMK>py^b*(T%fj_ zg|*CZ$V)o{*Xa{uo)ct2%(Q!7sjWaOcHj4}&Pn72+$j2={q zc?#;^YklG|%@{|XL1W6zL}%R_h(it^rAXMsLcTZw{}tj!k=^c2O_k3O(P}VVuO87_ z?ROjod>K3lOpr>u?K5i4Nkhc0>p$~DbB_2G=_}?6<+1Fm{sU#s#5Jinx~y$Ayfgp; zZN$dr+>CRWRfp%kwH}CR7INv;k+cn7&UTt@oboIn^zVqas?&BZ7C8e2IHh}sUNC)_fdHaU5rqFV==_KX<<021Bl#NxHsVCs(iHWCv;0AGkR~ZU$jVKS#2NjUvtH2HckzoHZ zi~|l40j7Gd>{MgRw}4qhLR7xLYLG}5Ek(6jp5Eb|!FIW5UkJX#*;3nm7@emm^B`w= z;1VqFqoLEM+}n0)b1T}xp5<=MIm9mMs~fZV(hu3uwAF3}(Yc3d6Y%-sF z6c7(kbF&HfF+Q3Uv*{stm!SaP&$4HSEw+cT3kDvq zln|Eq^WhkS77aOz##q92tIdkOiq$wGX&?QZXtPxk@rTnNbDQ}D!MY?|n1SJh)u>G; zDqo+v8;=Bz!$Pm95sXZwVnNAGqxHY@;J5SGgVJgpL`nxRhaP5G;Ly=s{v!s2MV>T3 zx5jI(^0VS`V}b2PivD$=$P0brW;Oz(63xDCi^(;M#I7pUSHcav)t8=f3X7e{@qeFb z0)1<1*WMgU)Y8@nksEEa*Z+tn6UjH_A1RPe~lPjOL-IX^_!9~@k zeZ+~FBe#N4HkB2*9h|%eAKKc z?pWwR%%!6+>nnzkjqYYYMl11u|8K(Hm>Nqcn4I*?=9bdjQf zM2}wmTIAU$YOl40fh_EIUZJnZk}sciRI;z&3Td!8pjptFU}y=Wc_Zb-jY?!fG3OTK zg!M8IgQeRMk|4D~j*TFbCO$Mnc|F;v#z%3vIesOs2?DP%V!r5m7t-S~h@hyr2Hv+72T$b;QhM>7qQ_%c~lG*6de2{9jN#-&*fcVd*NN zN@^pejxm5K^;{=Kjb6jaBZJYl_viorg;Uk4{egO^JK!h2Hd0q3*Ra_StOz7mf9mpd zfWB)2*u=s?Cgq(n8fOZ}kPs0UxkHZWEAO0FMU!gbs3Yiv{|gUjZ&A1QjgW;{eVw8nY4pu0oNNCKwIC@wmUtz*?*3H zCxH^ieLN^z^nKpDcphKFBZeY1+pJ>kMGOeOE(^kUPw89cktv@_b9LiMz_xswGAw*( z9p*|Q=}Z<$y-+eZ18!IH=K$WJ!1k0+{Hodmd0{g^0}^ekoN>SNj|dAUOd;-wWCJQy zXCI-y(%KvKm_o-qnIQaWASv63>eiR85O4fE?UjJu`GYS=3FFf}i@bud&z`J@Dt~=W zC6c)|_7^-97D#hQyIc*c=MnyZc%57flbCTyEwA;1CdmvO%kO499ag(8tUC=PAoK*9 zjmOqt^AA)V7ri;*!C#;M&3eb;T?7!S6pfiXIs((=FF=+&sj|!xeH1^jRq9t)uHTpN z5Q$%3KSqG@16_KVxVTE{w}95P!<(-0A7N!gOTwUOP?e8rmV3S7qfb25^qRF(R3`j( zM3!hVdflWg;*jojgXgt-nd0fWYtC7~{*%MaWSu2yL22Ub#s9Dbxa`XD?2h03vGi~i zN_)uK59c`!B&iBl2NSKu&-&=cAKZFFG1yTY5P7}5q0X)ATs6u83c0&}SHQ`X^~j5P zy!8;RFm=ntp%Eef%Xe)*0R`;K>oK3IqrwJCJjbseT;>4pn&AD0R-z@ti3Po;O=&`Mi2g zz4z*4ydT2}$rFGWK9xJisA#8-{NaLX3h!z2F%5%UT99CJQ09^SkgaG$G7uzfnVsx) zqI_v+kYCj-^G1^^gIRaDC=Oa45r&yI=O_3e z(`#Bj_C_Ja9n}T<{_143nX$*prPumFq+4q$xD#lB8EWS4y}0o0Bjj@TaSdaD|PZ=ur83 zT3TU(U^x3*b-~A!g7yzZKHH43GqH6mDV=qWw>G%lA-v{l!??ikctQxQC!4Cw<4+6^%o4--r|DgFDz^ zl}{`)IJViSyvVXXEyftne$ZgTFm<$))PiY5^X3FK8VI(<62Iw<)uasi%jmqjm6;u^ zK(GetQZghRdIAw&c+;$cFpRaewP>Jy43m%Yok8HS;Hpt7{@R=0H~PBs%%eYVFI4)* z1lR}sI2z!~`6!vREJF<<(BwG}=lldi!7N}@62O~fsK^ayu7YUgryDQx0fv!@fEmM0 zmoG4vY7RHuL5qy%V+$WBP6W|BOnq>pH9azB^sHMT%GGd67Z)^(nRa6&e`kZ5g%DoD zk+ZLTP2eoSuQct-T^OIc7fr;u`v_4m49TV&-_S{Noj%!sCNP-K_uKnbwrtk@^=mRg zdA+8uyD*V7F3vO{4bX2}KuW*D=GYuR58SI@m5omSx*z}+s3iue>mYW%6Ll}Nk)1GH zBeSdD!2DVidRQP_Go{-T;l5ydwEin(rK3Wl{kv=Hr7ogztLvRseM|*nqAvO?qF|kB z@Z^d5Ho~#|?TlJBX|gK-lD3Zd!=dcDoJcwlfjsuRxH3tyAOv*-lE)^Q&=#Qpta_dx z$U4Q7`m*BaeishqpmZ>k5L%SksJ8)~9=PLRu-}O&>IMUwFMM;@r%8&9^vpz(Blbq~ z9NeK!Hh0rafG3T#!hQlaToP;aCDh{c1%hvF<fLb(s0WhQ8YF#FLjrPPjVD%qFKL zc1}v5v-{>({^Ib3Vd$a>Vsk{rJP;cHUKh~w=%41GtZIc~Je@B-Co~woYGK=j72J&w zmqJ=G|CAvPp)N7Aa|6OFIH z_naqWeKc?QVI3v^@(CZlw;1|~T0LiI^~qG7+FU4QqNeeuUG|xo(SKweMcjQ7*f@AU zsmnqJ(A8i1-$MThO0Fb6^6Jvzhb~|ajfmsHOtWWb{hy!RQlI0>?I@}|5y={!pg9bz zA28d_^yNW##hLid zk8?Ye*JUgNt7;m>_Echi6M*`B=3(sNvGz}b8&w?30yyf!0EIgUZTv*8e~BkJ{Bjy!Ft$wmXi5igRogEghHS8_nw>5wv!HB*>}|#+p79mYLETIl-%csUH7I$1p%8lF zr7?`#5zUGCzOo;(reunGvxRF|{Fdku+s{|6KDA532q#HbvjFW$| zYV_y5Zo}1mzh$NK1)T)d#6?1_8h4 z^<-*HgKNv!#I~xSy}MF(=pCi=`Sf{oH~7vf>@jRfamRG{i?SLu%J1Eza{Id-7##0H ziWK4JHEi7PrHq4-eU`VG{gI*m%I*ng4;&|;^hdfz+O@(yv9h0-6QdC4=ZDVabu3&~ zpj$?p>L^uIPi|HQ*}k(?64|SVh+&sGG1~dN*Xg+rk%R)|Gl%(|kiL2|Fs(6|FA2bA zVGo-L(!werokOGvaPCOI;lWceJr2kAZPv<+M97L$LWwtu@Bzc(n5@S#Te7Q?``3B( zH>0e`Fgp8HH`)xB$(F~>83&)Rv+t&fmd7dX?0F@fa0H!mA*fW9p&EdrgFnN9_=hdI zOlXt$p{c$aNL}C~yJk&cb0)8v=1Ts+DvaLL&P}Z^1%sYFdR+O5j4%_qoY{A_7TBT0=f= zj?6ufN+!@GHN3thQlBjJiQSpK%Pw2sNS`m)eJ6Wsts77{-}+ft_=7RqDhL`rUofIU z`_D_p8OEOv1EwiCktDWfsNwrJRT+FIf5yHx5{;VEY;XPHJC(WVwfPNJR4fn@EelPfVewuH8US&14-o)!NZKUqT zlUC{c?_92YtcUrC>Aei^D3vb`qZ8(b9yTfgzOM8n4Us%EF98aziAwcRNR^r%&bel8 zW?*h;!{R5_DyaecK(j@ydb2QLN}2*Tf)rg*;1_+3yVDVOEmOe@sM&TeIT{$5l;u@e zsLS0k#Kev#)=@u|m^6C*$HXt4DY ze?SeQ#J?^GBh6oH2ZX4mh3AYGH{gdq#95=>aaD=;3edNpP{Z#kE?jVkPOO&$p8vpb z6y=@uiBN>%=;G>aCHbBV9YNKNwBP0Q+J1W9cON>nV}bhyz^(ix7a>w{er!2u9m2H2 z3dxjfnz!2UPs14;5&i@uhnYE>k#1>M5RCY$ciPq0J*k(gf4e@{1LnEPqzK3P%&i(* zpf9wy9gh=CbhA@$H|J^w*=zmzpmBr|{;)V2gee;tXIMZ~#E#cb^d!)xDLk7BbTso`smizN0_X6MhONxb ze@`P^?=`^*!w*lFdna;i!OKl->Z{3_xY>$mm2?u5>LWQ82G&>Zm&g2HzncC~__&JT zv~NtU#;rN5|6$6+8k}|KQPqD}0K?XYU#rE>U1}?@sr{WbDgi9X0CIVZdc`+#K~A7;^DB^6gM|%qa?Pd~(Jd1w|0R z@HnG2F5+Kd{imX~=Y_1iej)K>7XEuq$jf6%-&Q8BCzI)^0iT2CEghe`9}_&<&?}2r z=)`&OStbEJj zrRCic{WrnF!G|x4k!!z?*vQKE8L%;U?Sx<3O+4h>&5R>Y$4s@~iQAfUW&-0_l{AqD zmNyCZLzgL|uVelXgz#Y5KV4mpV=)j!OAP4AUg~*j2rV9@T`je{LZ#87&xRV!T)uN& zO{)(^gld+3m-LiE1*6_^C6(20a*Q;*ct%%IswJRa$I%R{zXD zNd5jo)^C;nP|F`K)BkYc-~C$tyMF!QD*XLM^$moXeXISuOI*L@`h9tSxD5aOx&6CE z`#0^s`%C3_oBtpeGy6gM_a~VCz@N{>*Zp~QKkQ{cEXbeSs6Ssi{jgr~B{;x;mNl{+ zGPOv_5sro0M&cU6p*&;m@wl%Uk^^NTTi1XmSLe^^jfj^u(Ul9@nOMtX+U@N{$937F zGbAIA{>CNCqlxDtk2*8Ke`Qp^GQ5W?ZP|}bk_&v!86&Bd!W~u#rVJvS@|?K|@UZ4n z#Ef1x0@`1akR!+T2;Bjo?{>3uYH!(TQWaBjQE8(AHq>C(fhaZ<6E`(ES2Y5T+AGDX z5`~d`S{=)yzQT!H`i4GLLCsHUJo>noZG0+DWm!0I6%5^#89XY{>I^odQ}_i6*~VST zvQ0H8f?_nObvdsz57n^JPV2G!#v)KJBNR1=E&XoIF4ip z%L|Wi++eMMf`go{&!SGlYslk4y}-rkN4hsfaOOw`%;iH6#Yu8?a|jn7+xp>Wf&gMZ z5Mpls*Y>%wD3T^W?}U~iI8TZ%!fmj8()T6o(D{CZy@1x4Zg8kk>X3OSU5am?+b@{N zHM7gty!Y>f2zZV)QN9Z31Ca*?18s!Cq-b-Sx?(Rvaxt5em+Q9 ziQ}*Jzaf{}5zudDJ+$8grNRh1W~-2@JXMVpD2Jdk7&rH0vON%>Nk#${0B&la&l|TrnY)o;F-;X&p)SHoU#o#I>YruE#r{$)40BD1A|(! z_&o82DP3-6l@>&i7rRRc^)*tz>13oYY*n}crD>a9<7|0hzYb2l(WmYy4Ozb3md~(* z28*Vq^6pYZy%I$TdVe=I@`QJ8zZgJPciQ%iw&@)NmqXMVvlE%I_6_kg!X^#$5{M5Y&@N6BGsk-an!>1gwfcN~_K z;WYwJ_O#XX(9ai4BATIJNCUnvz^PLZ!rjd{$$%Iy8D9BMO9AS1u!86aQW*X(06jp$ zze;CL{HeN!qd4+`UB+~}RD&wDum<|;yn!JyDr#Q9+#0ZvJ?E-h2_)CuH`9U{xvxTa z@p*NiFJ*VvE_H45FHne9u>8yP(VL1^0~P~EZf(Y`p6zriQpF?-ZRU){*>^($20a`*VRb1@a7?dm~r_f5U ziG9vhoz~^R{7|Jr@duD%+yTGHbobmJt_YgOvrnOhdZP zpOtF{?+hUUFL-XT1o5Z`IpKzb`tWe*;*64ZQ-VWTDM!UG}Mt$Qfm^e?SK-Tw&abRJSlv zMQr&8WeJzK1LnB0Q)oh9Xn&dq?h_fX%Txh)3k8t^I=96~1bU*haOELmoBj7VIlOYR z6@PKcGJ|#$UnXUKfs+o4TMW#e@UKyp)~tJXKIuC(AMj8^uuWm1tST{|je=DYVi~6& zxpd#6R9Eck1u4(Jb)K9~f#f5KyDL=OnsD3Ggd|g{?iNFylO}z7uRcuGm^lYKub81} z2XW3?kIK5Dfr(*4Lr)|H?q194l<)xpVY?oJIQ*^?iW1zuU~8YWQQUiTO>ssp?a`aB z0;E2Oi4+AQS9asFOmoPEWa~(DP&v20FY$;rI@`u=4-$6aIHWjl zmpqgeTGItcA(HR3MY^*1Wd)|Wh$mih?=2k~;)u#p&|6>cSN+mhFjn zJX#{&HT!kmrTsZxlL-YP&`(>EUnZD(jnpq3GBYPmi3qd|zg=D61JK~b9D1dt|% z&8{o{bMWhVBcov|RxIL06Wi=5rqt0a?5zm+Qe>r0B&J&yLYY(p7ws#6upfQNbgu$? z@!^%5?uO(bJ?ixV*Q;d>H#$oW=oT!+6K){uryGy|86XtO+uBT2dc9e`>BYt~y0BQ} z;W}41daCT>nx=XwEZ~)GUGaC6iyz5-XA||>$g66$-Cgz8v$uR;9ofR5{w4y;0zQh% z87q8o)bfb%a?*qo_3Rj}bAQC7+4a`!%$ux$<%0a_=xM>B_%Zg5q?pH?87X^3Mp$-- zPn|$N_W;6>0hQUAI$cj<2{9jd?GSgiD_Nlz6~nge6fcx&{JoBoiAHcWhQBe0G%`-3 z2SOD>cM<~q+;WB}OCsH})=^kq7f*~VZ|6!IY476q>CDYu@_w{(!K&k&R#5i_evODLTU<->sG#vm^;NAAA^eMOE6x5*hKODnyB zeq)MUSpqJvZ<)5z&tL1h@r9OZ+i!H@C?oMY%RW35%24i5jGc=F6z0VJmmr(*` zoy>aiOTWtgJsDwSa5-uTBT%+fh-VGp!pCR!Lyo@ki3YRH9i)FGP$#CX@G05nGT~nY z1|~*bEysB^Lja)gHo5!PL$^gp!85auraWfN?E(fI7g+oh@^Os*MP=|yBtb*~2W?I{)6d%` z2v<7q2rF$A ze?niYcuF=*Y8T1*sxmjse9{_lVAdvM?X|7({5wAY8KcYK!_F>`&^6M6fylLXlxeKb zu)O|4m0fZaBkh2FRbAuRghUa^^_JQOT%cz1BW*5$?~H1&%fd8vj`lWj>%bS_<6LqQ zt^jaap4Q|hw0{LRv43nqc;*aE8AhY?@x}24MUT-?Bc!V909!0g=gI{Fiy)jlO zM_eCez4HPSc50aN1cGxWvlEzQvz);HR%=``zqA#^T7<^TciXG6JtODFap-YU9M6JKyD;EbgW-|imRCm?oV&7x0SUZj(O=J?67W8&3OCn}T&DXy6e!=(yW8=Jk zYBIi54sC9r|1RA|m+{8uJwELdj?%H-;A|H+rQo26S!yWzl2ZDjTl5Xh09}7=ak7+o zw__i2XE@kFjt+Z+{oY&KM0xxi)u7T(EeE;;N3o%G=`$b|60Sh?BM(;`vGinYXk+S} zi^VyqW1=p&$)9`sOJHB2m%l##ZX%SK>rSujsaP6e#duqZ4CnR z(u3)Mr;|&!6PGFu57J>1Z3;QRRn+N~gU>#8O1|jMt#^l40;`{R>jpzi4tymnYpGC$G#2E_>V83@!?XRByYr%*6}i_GZIM$nynf$j=aFK|GZ0GkOC2jGb&)VRp$GrC7gD3Q$l76O;gUiQxma)lxiFUCXnsyM- z9RoxJUq}KqxE_k++}icPMD%Tr0`j6_`3r<$Fg9%UAt?R)A2$@h(Q?#fxiE6H8?@*< z6;&39qmdprO5i~Kfp-y1Zv=yEN3+hr{qq#Ur1qLJ^u6j%WL-EZy~VLZ3JD-lw8b84 zpogJYq8p70DRW>|=4w?F98v7hp$W8`Hd`U!7Gp@PS)fg-yJ6XEw40`+8x--?K{Z}C z0k+Tpcr!Abqo`R_Wp%Pz4G%;HG@>p2`c#2suC5u|1H(F*{kEFFOWqUvie1dopjya} zt(bWrt1eIfd~7K3>Jub_zpk+%Z6WeUz^Vz>ZIUSo9I3#~;>mcIpnQr!T;4v$+q+`_ zBIKDH+(}mv>TR-JJzIEVAmI50;VR6>w0Np{MV~S4Kj5sa9DdgfVJ7G|96dT6i#Ml~erDMA6 zjEP~#Dau(;sVUas)CVWKAsHP@PB%gnFabGI#Gn}bjjVN(!RTqA^Ug)nr>hdL0!;Ln z-!t1K?*#;CEw|Snm3@Goq+NR9C!)Op5 z$UYpipyePf7P(`NHQweM`5T6&;C3+oMX))m_*P~4U9TXvC-%O>VqOz%M>hE}@Sh4n zvrffP1?E3S4?V#Ez0M~*A`M1}GNUwXe#7pO=L?l9?4>GZpYnQT&pobm(Nh}gm@C@by&)`855P`ya=@w&8hMOkT}Fuoiw{b*~! zA$BN<1nA*jxgkkkzoN6-_^AE8c>H*L%Rg)ehy>qROC*27yF%9whRizH2pagK86Is` z^c!L7xpCc_BR>16=ilXmKwKgXH#Z>1MN5FGfP=?#73-~5`D9FzpyV6c_P^~SO-_?W zk|7{mI{n+@q7uUc>;(W1AGs_;Ou~2zUBMHdefRW|;vbB{)A?M!i11eL$cmlz$`Z#F z)R-1I=4^kwc`Ax2ud@4ACW+*(wYqb{pDuGbkG_%?QBXavmq~|L+c{AB9MY=+^;cJ| z{L~iRcBemkL@@NPMEga83Wi6|IQa{3JC+$y5}F6LA>Gl@n;e7GGt08_WdUca=O@Cm zL7k=HIw!%9-5~l3UIugj9nlY*KplSsCzEqUkSRns)vIEDzo6?hx4g7z_Id!^C47Xd zd9m;BQ+yP&nYd+jndQmj^at>{y$^YvB%5YcfZ*N9j2F;;@qCzAQCuDS{2&dIPUtJ>jZA1g`*Rr%3kr})=D@W)%HF42Nxt4`}${qT|`so-3xMS7p1 zafTeG;*?&W%gHHH8Nb?!3`<(vgC4{O^zc91rTBuVHdysZ-ty=)pF;m&x#yFvpEmTHL}NzW zS@L(hb_1Nb%O>NvJzn!;Q6kG|@eP^Zfj7ga2E3X0!1`B1utu16)kgw2AtrH-`rLlV zgNgj(y3u@11^^g+h~E);N-#_1z?`S2CQxVLd0}ypG-y4-jp?U2L#FrQPSDw0)T(K+ zI9bk8ul)EC(z}Fx7x3nfrPp8$*`#&tpO9?{wnfawn%^my^Ix|-a?wBMCWj7w`rI}m zH#Xy7&ssL_&(-hVP;E+kF)WsIWd()W$REVup&i{zxmQ^|Rh}LY11%YXA}Nf9qfKV! zEyZ%Ct;KB106n3oO9;8iVjtw<-*|uUZP5aQ`xDjeWVDHunO6?e2(jvZr~1q$3#y-M z)3$;xel}Z6|3F&(+|TE{9F=W_?HP@b7ecP@VB9uE%DX?xQA&Vc7Jb*pPEKMH$`j2W=2nXiFgU2`w=v%?PWZaGbs5H!bagVOhG=j)j) zU|_7hnS3&#g%$$S2Cw(#C*^!_k_{pl-NwMAk7kcAW(?JS8zO*8ey^c00C|SZhxLTK zZ^d%!h0j4|hbLC^XMn)QVfFn$)bwuYzP-@us|l}w7HQA@Z{12??`upzu30na^hX!< zxN0$Ik+%D)^6+!)qv?Hp6d>v-*W)9 z5?T=hOj|L-rrL|c5a9}6TjJ`=mZDb?tRh|;P`;eXoM9`-q>zxsu~NUqGl=1BK=l^n z`o11CXQ?yet8e2Hp*EW-xo1K}AsArD|d5xQYuFzaEYyOVbZ(2Art#{6MrCFB* z?DXapHk>7-(uB4X4hY74#RNjWZ*V(a0Xp|lr=AS6_YCW0`0(v(4j2S#*4y43N=4Li zYYghGT`a^_zd|Yar1N_a&6TnD3KPJC-*1a>0&Q@I+r!(~bx%mRq{s@QlnrtZ;tpk| z;!^#=4Fc-$>01>rV#0QKUxfK)bWA1dCkOR5;ys<3xFVZIps1xzsZaLR)7KFYdF6UR zF^KWmpe!Xy(#y6JcBCkVs-@<@bUEW(T(w+ihKR%0i+~qU*;$>f;(CQYJ=c6NGPdgp z&8~AEPsln=CidBvn+jeDoeu0>d;snx>D5TxNY2?LAuR{uFJ1he$s2#d^cmg_tA#_G z+h5)t6fcWqu6^K(Kv8&&7KXUJX*poLA`r=7B99slv{AYEk8c_yR{2E+6xJ_7>_lMQ zq131>f*BrKl7puAI262*3_Xb=q&Ms_lY+2V|54MVFu5mG?z9WDa5U?(7Rvm(>;b;Q z&mt3S+RSV(2=AL@SGq>X>Tnrob{7QfRJXvH^xcGsQesXui?qz|8vuks7mz!WzUPLq!+PnYLQ_sBl~}g5-2PbToh#y@c4yy3l-Rj z7UB?;04To;@d$M_j)gPer{YVOZXAWek;+n=Aa@{-mFGWj=(!Od0H34QG{+oXW`OMA;#%OQyTY`K`)X(3VU1w{>H& zE={jZ6eHCxA$T<>m!bCXdrlz*nhL8jI&#+{p=8V`vm|c~;Ocx1)W`lrsRhKD+1?i6DPNwIOodOaln0I@9ZAsy zKXk7`w#~uSb<~!Ru=8o4HnM*yq=dSJYlxfF#sPn?*uRLN-zN z;poLutZvzHmAPuBSugK*58g+-9f(v6 zb}J%@m!I-?{)r|K=nk^sa&_`P0$`49@#&n*%=Th3!sG?ymEm z3bXY~gV;Vko|F*{EW$=qz<3cmL~bmG4xM^^j+o@{;4oBoHpOEEjY{>x+Ik@5B-ZcQ z-w-0&ijJG%b8uL~u{a$WEbprtX2WInn8WaqEh3&XnqdRG* z9z|tlYe2#^fh=R2$-%(sr=ByG0CLB;lADwpLvNXGXD1&ap+g6IPm}j-=@Lnu-~9&H zF7Fi?=Pxp1(>yPgTWm2e0f(en`L)#DWdkTuB;6P^Dmojgh}2lQp5xE4$0ac6=Di!W zIs8h+J8wsu6^lu@JQr;9x4gN{liU0bS;{cuXE8GBKh3UXGxgUTM@o0&nVR%eX6~QF zZ=s*~K|}20i7**|4I;Av;g-@p(|xn}V#V#k^-Y@zwp9M~{N7|~s~A+3P7o=$OveQ; z+e6X2ow7ow(9Vi->VQ|$Tf>e}o%q2v9>g5xoSJCw>4yOZq6Nf{90LmM)vg8;O3>wjQ z4qIE&dZrU0n&#g_0*N^Z9>2izz6|=iS279ZlyK$_LaR?b@-4_ws!HsN?z^tA$GI9y z(^36+Pwk4dX9J}t9+#vH^#5`k-RL$>5%By0lh8wYO&$r25WfVpuGBPV@>1sTCL%sjV6mW`i#PzPHm&RF;?u=v0^#}xeixw?b zLrA)XO-ONm)$qz)z4ESEIFnnMR|@>ZZPhpyD5$Su@s_>)xW>KfhWb{Q2JnP5ym9zC zkIrkC1iGPRF{x}@Jt7y!A1*PU$jSp!Ka6wmBARmZd`+~5V|Be*v`S!}uW<_0JGYrf zz_l$o$E6+yq0@#{vDV_4)Zxs>cy0fG^pH>ZAjMm`{}rRIz=8-)Otg5?KZz_7oXMW0 z1Ii;E9{*-=<=jc;_phgHl*uNYou517s#4J-s|X#bkOj}i598{e3)8*5^*bpUo5Q%+ z^MEUue=UDXCST8*2JtY)fleH-wBc+k9cgYYT0WE+_6FA2fwD|c;4O5n5bQu4Q-`?u zeR=zWZHlG;WrwG$u8OtjCS}N{>=}ELRWyQ zo0H;Td73h9&D_S87kt70b4~FR!7lp~^-Mb0TCu?=MFIHpZQGSbssVV}kEY$0&Y_t8 zp8BPJsI*9JBdiyiO3dsS%u*4&-CefulikLe7Tz15N%Qpm- zlrDAV7X0qftyw^vt$iuq(uVp_Jpz=}lo*g!g+!S!xvt5RqrVFE1(nZBo621!@ywd~ znvohX^}AkM=I!B~!c9Y~6mGDDU`}Z6R|KBtm-``rE;2k$`lgtF@X#tSe~c>1|9|`h z-O*NYge{C{duFg}mC`8s%&DHR+=blmL`7>jo+*IVRhOpqyth}v#3fCvXGH?z( zC;qHbqJx~AL8m6OAya0Ey>5Qtkf>0w_g6Sjh2-cT9T~S5NwpukAjK`) zKkm}oW6NurA6hzde`lP zI7vlLISY zSC%M_mUafAbJp=KRsl0<2Sbm)5M@wD}hM*!UgDNaQ0|O{$Y2F|A8lSZYK|D26P2w0? z)2HzQHpPO7?`)`z2b3)!GH(m(y7nI|!#wz81mlLWX5|S^GWpJ8Kb;clG)UE&0o;{Eabh zVbH^FpEu|(Z!qT={vE2$QP_(0_4gq|C#QPL-xij(du9*gRkDsYwZ3rxSv6-05`*HX zZatMgoUaFGK9TBE$IY)2-ewXDvCFqPQbC^HQ94T*Vn{N9!E_)b6BGR2Z>~6xzfj)G z5L(ddu`fq~Z&Y*;+zj{v{X)V8N;8}<-LxRrZ59<~Gq15ch6XCF+UpX1QVe2Kb8)*0 zgQ3)uD%;X#P5_q-^>Ugpaio%uH$-<-oOjtYhFi%TDp}jVyaScXshOwvt+>lo!c*44 zdt^Dq;SQB%=sdaGzY36v?EfHivxx!;6UaD6=XXPur#LblfVq3aEmvz+Vm<8pvuv#; z*_S}ez`Q8ji}SGs=v@^9dl1zp2j|TN>VfCN5PGITUD)f*NL->|*}wPj8SnGDzaiFL z%x(MX(hq%|X3?|�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 literal 0 HcmV?d00001 diff --git a/src/icons/icon.png b/src/icons/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..2829667e2495893296a508749777657d9ed1ba0a GIT binary patch literal 51672 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%0DKO#)6zyJuz>=So>9YB7@alx_($Cql|E<^89 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 z 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 iw}tXR@6!&k{;1~&y&L!E>!m&hAn Date: Wed, 8 Jan 2020 19:01:05 +0100 Subject: [PATCH 19/44] [W.I.P.] Added a FasterRenderOption Still completly buggy. and it crashes imediatly after input --- src/Image/IntelliImage.cpp | 39 ++++++++++++++++----- src/Image/IntelliImage.h | 17 ++++++++- src/Image/IntelliRasterImage.cpp | 13 +++++-- src/Image/IntelliRasterImage.h | 3 +- src/Image/IntelliShapedImage.cpp | 25 ++++++++++--- src/Image/IntelliShapedImage.h | 3 +- src/IntelliHelper/IntelliRenderSettings.cpp | 10 ++++++ src/IntelliHelper/IntelliRenderSettings.h | 20 +++++++++++ src/IntelliPhoto.pro | 2 ++ src/Layer/PaintingArea.cpp | 11 ++++-- src/Layer/PaintingArea.h | 4 ++- src/Tool/IntelliTool.cpp | 6 ++++ 12 files changed, 131 insertions(+), 22 deletions(-) create mode 100644 src/IntelliHelper/IntelliRenderSettings.cpp create mode 100644 src/IntelliHelper/IntelliRenderSettings.h diff --git a/src/Image/IntelliImage.cpp b/src/Image/IntelliImage.cpp index 0a4b919..5e5e62d 100644 --- a/src/Image/IntelliImage.cpp +++ b/src/Image/IntelliImage.cpp @@ -2,9 +2,10 @@ #include #include -IntelliImage::IntelliImage(int weight, int height) - : imageData(QSize(weight, height), QImage::Format_ARGB32){ +IntelliImage::IntelliImage(int width, int height, bool fastRendererOn) + : imageData(QSize(width, height), fastRendererOn ? QImage::Format_Indexed8 : QImage::Format_ARGB32){ imageData.fill(QColor(255,255,255,255)); + this->fastRenderer = fastRendererOn; } @@ -23,7 +24,7 @@ bool IntelliImage::loadImage(const QString &filePath){ // scaled Image to size of Layer loadedImage = loadedImage.scaled(imageData.size(),Qt::IgnoreAspectRatio); - imageData = loadedImage.convertToFormat(QImage::Format_ARGB32); + imageData = loadedImage.convertToFormat(fastRenderer ? QImage::Format_Indexed8 : QImage::Format_ARGB32); return true; } @@ -33,17 +34,21 @@ void IntelliImage::resizeImage(QImage*image, const QSize &newSize){ return; // Create a new image to display and fill it with white - QImage newImage(newSize, QImage::Format_ARGB32); + 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; + updateRendererSetting(fastRenderer); } void IntelliImage::drawPixel(const QPoint &p1, const QColor& color){ - // Used to draw on the widget + if(fastRenderer){ + this->imageData = this->imageData.convertToFormat(QImage::Format_ARGB32); + } + // Used to draw on the widget QPainter painter(&imageData); // Set the current settings for the pen @@ -51,20 +56,28 @@ void IntelliImage::drawPixel(const QPoint &p1, const QColor& color){ // Draw a line from the last registered point to the current painter.drawPoint(p1); + updateRendererSetting(fastRenderer); } void IntelliImage::drawPoint(const QPoint &p1, const QColor& color, const int& penWidth){ - // Used to draw on the widget + if(fastRenderer){ + this->imageData = this->imageData.convertToFormat(QImage::Format_ARGB32); + } + // 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.drawPoint(p1); + updateRendererSetting(fastRenderer); } void IntelliImage::drawLine(const QPoint &p1, const QPoint& p2, const QColor& color, const int& penWidth){ - // Used to draw on the widget + if(fastRenderer){ + this->imageData = this->imageData.convertToFormat(QImage::Format_ARGB32); + } + // Used to draw on the widget QPainter painter(&imageData); // Set the current settings for the pen @@ -72,12 +85,22 @@ void IntelliImage::drawLine(const QPoint &p1, const QPoint& p2, const QColor& co // Draw a line from the last registered point to the current painter.drawLine(p1, p2); + updateRendererSetting(fastRenderer); } void IntelliImage::drawPlain(const QColor& color){ - imageData.fill(color); + if(fastRenderer){ + this->imageData = this->imageData.convertToFormat(QImage::Format_ARGB32); + } + imageData.fill(color); + updateRendererSetting(fastRenderer); } QColor IntelliImage::getPixelColor(QPoint& point){ return imageData.pixelColor(point); } + +void IntelliImage::updateRendererSetting(bool fastRendererOn){ + this->fastRenderer = fastRendererOn; + this->imageData = this->imageData.convertToFormat(fastRenderer ? QImage::Format_Indexed8 : QImage::Format_ARGB32); +} diff --git a/src/Image/IntelliImage.h b/src/Image/IntelliImage.h index 04315c3..454a704 100644 --- a/src/Image/IntelliImage.h +++ b/src/Image/IntelliImage.h @@ -9,6 +9,7 @@ #include #include "IntelliHelper/IntelliHelper.h" +#include "IntelliHelper/IntelliRenderSettings.h" class IntelliTool; @@ -39,13 +40,20 @@ QImage imageData; * \brief The Type, an Image is. */ ImageType TypeOfImage; + +/*! + * \brief fastRenderer is the flag that represents the usage of 8bit pictures. + */ +bool fastRenderer; + public: /*! * \brief The Construcor of the IntelliImage. Given the Image dimensions. * \param width - The width of the Image. * \param height - The height of the Image. + * \param fastRendererOn - Represents the flag for 8bit picture handelling. */ -IntelliImage(int width, int height); +IntelliImage(int width, int height, bool fastRendererOn); /*! * \brief An Abstract Destructor. @@ -140,6 +148,13 @@ virtual bool loadImage(const QString &filePath); * \return The color of the Pixel as QColor. */ virtual QColor getPixelColor(QPoint& point); + +/*! + * \brief updateRendererSetting updates the existing image format to the new format. + * \param fastRendererOn flag for the 8bit image handeling. + */ +virtual void updateRendererSetting(bool fastRendererOn); + }; #endif diff --git a/src/Image/IntelliRasterImage.cpp b/src/Image/IntelliRasterImage.cpp index 8e8f918..7e97e55 100644 --- a/src/Image/IntelliRasterImage.cpp +++ b/src/Image/IntelliRasterImage.cpp @@ -3,9 +3,10 @@ #include #include -IntelliRasterImage::IntelliRasterImage(int weight, int height) - : IntelliImage(weight, height){ +IntelliRasterImage::IntelliRasterImage(int width, int height, bool fastRendererOn) + : IntelliImage(width, height, fastRendererOn){ TypeOfImage = IntelliImage::ImageType::Raster_Image; + this->fastRenderer = fastRendererOn; } IntelliRasterImage::~IntelliRasterImage(){ @@ -13,7 +14,7 @@ IntelliRasterImage::~IntelliRasterImage(){ } IntelliImage* IntelliRasterImage::getDeepCopy(){ - IntelliRasterImage* raster = new IntelliRasterImage(imageData.width(), imageData.height()); + IntelliRasterImage* raster = new IntelliRasterImage(imageData.width(), imageData.height(), false); raster->imageData.fill(Qt::transparent); raster->TypeOfImage = IntelliImage::ImageType::Raster_Image; return raster; @@ -29,6 +30,9 @@ QImage IntelliRasterImage::getDisplayable(int alpha){ QImage IntelliRasterImage::getDisplayable(const QSize& displaySize, int alpha){ QImage copy = imageData; + if(fastRenderer){ + copy = copy.convertToFormat(QImage::Format_ARGB32); + } for(int y = 0; y #include -IntelliShapedImage::IntelliShapedImage(int weight, int height) - : IntelliRasterImage(weight, height){ +IntelliShapedImage::IntelliShapedImage(int width, int height, bool fastRendererOn) + : IntelliRasterImage(width, height, fastRendererOn){ TypeOfImage = IntelliImage::ImageType::Shaped_Image; + this->fastRenderer = fastRendererOn; } IntelliShapedImage::~IntelliShapedImage(){ @@ -18,7 +19,7 @@ QImage IntelliShapedImage::getDisplayable(int alpha){ } IntelliImage* IntelliShapedImage::getDeepCopy(){ - IntelliShapedImage* shaped = new IntelliShapedImage(imageData.width(), imageData.height()); + IntelliShapedImage* shaped = new IntelliShapedImage(imageData.width(), imageData.height(), false); shaped->setPolygon(this->polygonData); shaped->imageData.fill(Qt::transparent); shaped->TypeOfImage = IntelliImage::ImageType::Shaped_Image; @@ -26,7 +27,11 @@ IntelliImage* IntelliShapedImage::getDeepCopy(){ } void IntelliShapedImage::calculateVisiblity(){ - if(polygonData.size()<=2) { + if(fastRenderer){ + this->imageData = imageData.convertToFormat(QImage::Format_ARGB32); + } + + if(polygonData.size()<=2) { QColor clr; for(int y=0; yimageData = this->imageData.convertToFormat(QImage::Format_Indexed8); + } return; } QColor clr; @@ -51,10 +59,16 @@ void IntelliShapedImage::calculateVisiblity(){ imageData.setPixelColor(x,y,clr); } } + if(fastRenderer){ + this->imageData = this->imageData.convertToFormat(QImage::Format_Indexed8); + } } QImage IntelliShapedImage::getDisplayable(const QSize& displaySize, int alpha){ QImage copy = imageData; + if(fastRenderer){ + copy = copy.convertToFormat(QImage::Format_ARGB32); + } for(int y = 0; yTool = nullptr; + this->renderSettings = IntelliRenderSettings(); this->setLayerDimensions(maxWidth, maxHeight); this->addLayer(200,200,0,0,IntelliImage::ImageType::Shaped_Image); layerBundle[0].image->drawPlain(QColor(0,0,255,255)); @@ -36,6 +37,7 @@ PaintingArea::PaintingArea(int maxWidth, int maxHeight, QWidget*parent) layerBundle[1].alpha=200; activeLayer=0; + } PaintingArea::~PaintingArea(){ @@ -46,7 +48,7 @@ void PaintingArea::setLayerDimensions(int maxWidth, int maxHeight){ //set standart parameter this->maxWidth = maxWidth; this->maxHeight = maxHeight; - Canvas = new QImage(maxWidth,maxHeight, QImage::Format_ARGB32); + Canvas = new QImage(maxWidth,maxHeight, QImage::Format_ARGB32); // Roots the widget to the top left even if resized setAttribute(Qt::WA_StaticContents); @@ -60,9 +62,9 @@ int PaintingArea::addLayer(int width, int height, int widthOffset, int heightOff newLayer.widthOffset = widthOffset; newLayer.heightOffset = heightOffset; if(type==IntelliImage::ImageType::Raster_Image) { - newLayer.image = new IntelliRasterImage(width,height); + newLayer.image = new IntelliRasterImage(width,height,renderSettings.getFastRenderer()); }else if(type==IntelliImage::ImageType::Shaped_Image) { - newLayer.image = new IntelliShapedImage(width, height); + newLayer.image = new IntelliShapedImage(width, height, renderSettings.getFastRenderer()); } newLayer.alpha = 255; this->layerBundle.push_back(newLayer); @@ -340,6 +342,9 @@ void PaintingArea::drawLayers(bool forSaving){ for(size_t i=0; igetDisplayable(layer.alpha); + if(renderSettings.getFastRenderer()){ + cpy = cpy.convertToFormat(QImage::Format_ARGB32); + } QColor clr_0; QColor clr_1; for(int y=0; y layerBundle; int activeLayer=-1; diff --git a/src/Tool/IntelliTool.cpp b/src/Tool/IntelliTool.cpp index fce3ff5..43d0c31 100644 --- a/src/Tool/IntelliTool.cpp +++ b/src/Tool/IntelliTool.cpp @@ -56,6 +56,9 @@ void IntelliTool::createToolLayer(){ void IntelliTool::mergeToolLayer(){ QColor clr_0; QColor clr_1; + if(Area->renderSettings.getFastRenderer()){ + activeLayer->image->imageData.convertToFormat(QImage::Format_ARGB32); + } for(int y=0; yheight; y++) { for(int x=0; xwidth; x++) { clr_0=activeLayer->image->imageData.pixelColor(x,y); @@ -73,6 +76,9 @@ void IntelliTool::mergeToolLayer(){ activeLayer->image->imageData.setPixelColor(x, y, clr_0); } } + if(Area->renderSettings.getFastRenderer()){ + activeLayer->image->imageData.convertToFormat(QImage::Format_Indexed8); + } } void IntelliTool::deleteToolLayer(){ From 78272a57903034c23d667429e314ca138631e832 Mon Sep 17 00:00:00 2001 From: Jan Schuffenhauer Date: Wed, 8 Jan 2020 19:40:35 +0100 Subject: [PATCH 20/44] now working 100% :D Fixed a bug where a not activatet tool caused trouble. --- src/Image/IntelliImage.cpp | 26 +++++++++++++++++------ src/IntelliHelper/IntelliRenderSettings.h | 2 +- src/Layer/PaintingArea.cpp | 24 +++++++++++++-------- src/Tool/IntelliTool.cpp | 4 ++-- 4 files changed, 38 insertions(+), 18 deletions(-) diff --git a/src/Image/IntelliImage.cpp b/src/Image/IntelliImage.cpp index 5e5e62d..9c65bd5 100644 --- a/src/Image/IntelliImage.cpp +++ b/src/Image/IntelliImage.cpp @@ -41,7 +41,9 @@ void IntelliImage::resizeImage(QImage*image, const QSize &newSize){ QPainter painter(&newImage); painter.drawImage(QPoint(0, 0), *image); *image = newImage; - updateRendererSetting(fastRenderer); + if(fastRenderer){ + this->imageData = this->imageData.convertToFormat(QImage::Format_Indexed8); + } } void IntelliImage::drawPixel(const QPoint &p1, const QColor& color){ @@ -56,7 +58,9 @@ void IntelliImage::drawPixel(const QPoint &p1, const QColor& color){ // Draw a line from the last registered point to the current painter.drawPoint(p1); - updateRendererSetting(fastRenderer); + if(fastRenderer){ + this->imageData = this->imageData.convertToFormat(QImage::Format_Indexed8); + } } void IntelliImage::drawPoint(const QPoint &p1, const QColor& color, const int& penWidth){ @@ -70,7 +74,9 @@ void IntelliImage::drawPoint(const QPoint &p1, const QColor& color, const int& p painter.setPen(QPen(color, penWidth, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin)); // Draw a line from the last registered point to the current painter.drawPoint(p1); - updateRendererSetting(fastRenderer); + if(fastRenderer){ + this->imageData = this->imageData.convertToFormat(QImage::Format_Indexed8); + } } void IntelliImage::drawLine(const QPoint &p1, const QPoint& p2, const QColor& color, const int& penWidth){ @@ -85,7 +91,9 @@ void IntelliImage::drawLine(const QPoint &p1, const QPoint& p2, const QColor& co // Draw a line from the last registered point to the current painter.drawLine(p1, p2); - updateRendererSetting(fastRenderer); + if(fastRenderer){ + this->imageData = this->imageData.convertToFormat(QImage::Format_Indexed8); + } } void IntelliImage::drawPlain(const QColor& color){ @@ -93,11 +101,17 @@ void IntelliImage::drawPlain(const QColor& color){ this->imageData = this->imageData.convertToFormat(QImage::Format_ARGB32); } imageData.fill(color); - updateRendererSetting(fastRenderer); + if(fastRenderer){ + this->imageData = this->imageData.convertToFormat(QImage::Format_Indexed8); + } } QColor IntelliImage::getPixelColor(QPoint& point){ - return imageData.pixelColor(point); + if(fastRenderer){ + QImage copy = this->imageData.convertToFormat(QImage::Format_ARGB32); + return copy.pixelColor(point); + } + return imageData.pixelColor(point); } void IntelliImage::updateRendererSetting(bool fastRendererOn){ diff --git a/src/IntelliHelper/IntelliRenderSettings.h b/src/IntelliHelper/IntelliRenderSettings.h index b7ee8a0..5763bb0 100644 --- a/src/IntelliHelper/IntelliRenderSettings.h +++ b/src/IntelliHelper/IntelliRenderSettings.h @@ -14,7 +14,7 @@ public: bool getFastRenderer(); private: - bool fastRenderer = false; + bool fastRenderer = true; }; #endif // INTELLIRENDERSETTINGS_H diff --git a/src/Layer/PaintingArea.cpp b/src/Layer/PaintingArea.cpp index f859001..e5a8a19 100644 --- a/src/Layer/PaintingArea.cpp +++ b/src/Layer/PaintingArea.cpp @@ -147,21 +147,25 @@ 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; } void PaintingArea::moveActiveLayer(int idx){ - 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(idx==1) { this->selectLayerUp(); }else if(idx==-1) { @@ -170,11 +174,13 @@ void PaintingArea::moveActiveLayer(int idx){ } void PaintingArea::slotActivateLayer(int a){ + 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); } diff --git a/src/Tool/IntelliTool.cpp b/src/Tool/IntelliTool.cpp index 43d0c31..88d2e07 100644 --- a/src/Tool/IntelliTool.cpp +++ b/src/Tool/IntelliTool.cpp @@ -57,7 +57,7 @@ void IntelliTool::mergeToolLayer(){ QColor clr_0; QColor clr_1; if(Area->renderSettings.getFastRenderer()){ - activeLayer->image->imageData.convertToFormat(QImage::Format_ARGB32); + activeLayer->image->imageData = activeLayer->image->imageData.convertToFormat(QImage::Format_ARGB32); } for(int y=0; yheight; y++) { for(int x=0; xwidth; x++) { @@ -77,7 +77,7 @@ void IntelliTool::mergeToolLayer(){ } } if(Area->renderSettings.getFastRenderer()){ - activeLayer->image->imageData.convertToFormat(QImage::Format_Indexed8); + activeLayer->image->imageData = activeLayer->image->imageData.convertToFormat(QImage::Format_Indexed8); } } From a99ad09e8cc67fc8771c28e1881e746487d6427a Mon Sep 17 00:00:00 2001 From: AshBastian Date: Wed, 8 Jan 2020 19:55:34 +0100 Subject: [PATCH 21/44] Dummy Gui --- src/Bilder.qrc | 5 ++ src/GUI/IntelliPhotoGui.cpp | 93 ++++++++++++++++++++++++++++++++++--- src/GUI/IntelliPhotoGui.h | 23 ++++++++- src/IntelliPhoto.pro | 3 ++ src/Layer/PaintingArea.h | 3 +- 5 files changed, 118 insertions(+), 9 deletions(-) create mode 100644 src/Bilder.qrc diff --git a/src/Bilder.qrc b/src/Bilder.qrc new file mode 100644 index 0000000..f755a3d --- /dev/null +++ b/src/Bilder.qrc @@ -0,0 +1,5 @@ + + + icons/icon.png + + diff --git a/src/GUI/IntelliPhotoGui.cpp b/src/GUI/IntelliPhotoGui.cpp index f605ad3..a686e5f 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 @@ -245,6 +242,11 @@ void IntelliPhotoGui::slotAboutDialog(){ tr("

IntelliPhotoPretty basic editor.

")); } +void IntelliPhotoGui::slotEnterPressed(){ + QString string = EditLineWidth->text(); + paintingArea->Toolsettings.setLineWidth(string.toInt()); +} + // Define menu actions that call functions void IntelliPhotoGui::createActions(){ // Get a list of the supported file formats @@ -361,6 +363,9 @@ 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())); + + actionPressEnter = new QAction(); + connect(EditLineWidth, SIGNAL(returnPressed()), this, SLOT(slotEnterPressed())); } // Create the menubar @@ -436,11 +441,81 @@ void IntelliPhotoGui::createGui(){ // create Gui elements paintingArea = new PaintingArea(); - Push + + QPixmap p(":/Icons/Buttons/icons/icon.png"); + + CircleButton = new QPushButton(); + CircleButton->setFixedSize(Buttonsize); + CircleButton->setIcon(p); + CircleButton->setIconSize(Buttonsize); + + FloodFillButton = new QPushButton(); + FloodFillButton->setFixedSize(Buttonsize); + FloodFillButton->setIcon(p); + FloodFillButton->setIconSize(Buttonsize); + + LineButton = new QPushButton(); + LineButton->setFixedSize(Buttonsize); + LineButton->setIcon(p); + LineButton->setIconSize(Buttonsize); + + PenButton = new QPushButton(); + PenButton->setFixedSize(Buttonsize); + PenButton->setIcon(p); + PenButton->setIconSize(Buttonsize); + + PlainButton = new QPushButton(); + PlainButton->setFixedSize(Buttonsize); + PlainButton->setIcon(p); + PlainButton->setIconSize(Buttonsize); + + PolygonButton = new QPushButton(); + PolygonButton->setFixedSize(Buttonsize); + PolygonButton->setIcon(p); + PolygonButton->setIconSize(Buttonsize); + + RectangleButton = new QPushButton(); + RectangleButton->setFixedSize(Buttonsize); + RectangleButton->setIcon(p); + RectangleButton->setIconSize(Buttonsize); + + WidthLine = new QLabel(); + WidthLine->setText("Width"); + WidthLine->setFixedSize(QSize(100,20)); + + EditLineWidth = new QLineEdit(); + EditLineWidth->setFixedSize(QSize(50,20)); + EditLineWidth->setText("5"); + ValidatorLineWidth = new QIntValidator(); + ValidatorLineWidth->setTop(50); + ValidatorLineWidth->setBottom(1); + EditLineWidth->setValidator(ValidatorLineWidth); + + innerAlphaLine = new QLabel(); + innerAlphaLine->setText("Inner Alpha"); + innerAlphaLine->setFixedSize(QSize(100,20)); + + EditLineInnerAlpha = new QLineEdit(); + EditLineInnerAlpha->setFixedSize(QSize(50,20)); + EditLineInnerAlpha->setText("255"); + ValidatorInnerAlpha = new QIntValidator(); + ValidatorInnerAlpha->setTop(255); + ValidatorInnerAlpha->setBottom(0); + EditLineInnerAlpha->setValidator(ValidatorInnerAlpha); // set gui elements - mainLayout->addWidget(paintingArea,1,1,10,10); - mainLayout->addWiget(); + mainLayout->addWidget(paintingArea,1,1,20,1); + mainLayout->addWidget(CircleButton,1,2,1,1); + mainLayout->addWidget(FloodFillButton,2,2,1,1); + mainLayout->addWidget(LineButton,3,2,1,1); + mainLayout->addWidget(PenButton,4,2,1,1); + mainLayout->addWidget(PlainButton,5,2,1,1); + mainLayout->addWidget(PolygonButton,6,2,1,1); + mainLayout->addWidget(RectangleButton,7,2,1,1); + mainLayout->addWidget(WidthLine,8,2,1,1); + mainLayout->addWidget(EditLineWidth,9,2,1,1); + mainLayout->addWidget(innerAlphaLine,10,2,1,1); + mainLayout->addWidget(EditLineInnerAlpha,11,2,1,1); } void IntelliPhotoGui::setIntelliStyle(){ @@ -499,3 +574,7 @@ bool IntelliPhotoGui::saveFile(const QByteArray &fileFormat){ return paintingArea->save(fileName, fileFormat.constData()); } } + +void IntelliPhotoGui::setDefaultToolValue(){ + slotEnterPressed(); +} diff --git a/src/GUI/IntelliPhotoGui.h b/src/GUI/IntelliPhotoGui.h index 6d478be..0cb9173 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 @@ -69,6 +71,8 @@ void slotCreateFloodFillTool(); // slots for dialogs void slotAboutDialog(); +void slotEnterPressed(); + private: // Will tie user actions to functions void createActions(); @@ -83,10 +87,25 @@ bool maybeSave(); // Opens the Save dialog and saves bool saveFile(const QByteArray &fileFormat); +void setDefaultToolValue(); + // What we'll draw on PaintingArea* paintingArea; -QPushButton* PushButton; +const QSize Buttonsize = QSize(50,50); +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; // The menu widgets QMenu*saveAsMenu; @@ -116,6 +135,8 @@ QAction*actionCreateCircleTool; QAction*actionCreatePolygonTool; QAction*actionCreateFloodFillTool; +QAction*actionPressEnter; + // dialog actions QAction*actionAboutDialog; QAction*actionAboutQtDialog; diff --git a/src/IntelliPhoto.pro b/src/IntelliPhoto.pro index 9b8d9c0..65bbd9f 100644 --- a/src/IntelliPhoto.pro +++ b/src/IntelliPhoto.pro @@ -65,3 +65,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.h b/src/Layer/PaintingArea.h index 4d0f99b..8b65d5b 100644 --- a/src/Layer/PaintingArea.h +++ b/src/Layer/PaintingArea.h @@ -165,6 +165,8 @@ public: std::vector getPolygonDataOfRealLayer(); + IntelliToolsettings Toolsettings; + public slots: // Events to handle /*! @@ -202,7 +204,6 @@ private: IntelliTool* Tool; IntelliColorPicker colorPicker; - IntelliToolsettings Toolsettings; std::vector layerBundle; int activeLayer=-1; From 7ed8e858afee28d6a7771f9b10da069b7be3646b Mon Sep 17 00:00:00 2001 From: Jan Schuffenhauer Date: Wed, 8 Jan 2020 19:56:56 +0100 Subject: [PATCH 22/44] Now everything is Indexe 8 :astonished: Job done. --- src/Image/IntelliImage.cpp | 8 +++++++- src/Layer/PaintingArea.cpp | 22 +++++++++++++++------- 2 files changed, 22 insertions(+), 8 deletions(-) diff --git a/src/Image/IntelliImage.cpp b/src/Image/IntelliImage.cpp index 9c65bd5..4c1b01d 100644 --- a/src/Image/IntelliImage.cpp +++ b/src/Image/IntelliImage.cpp @@ -4,7 +4,13 @@ IntelliImage::IntelliImage(int width, int height, bool fastRendererOn) : imageData(QSize(width, height), fastRendererOn ? QImage::Format_Indexed8 : QImage::Format_ARGB32){ - imageData.fill(QColor(255,255,255,255)); + if(fastRendererOn){ + imageData = imageData.convertToFormat(QImage::Format_ARGB32); + } + imageData.fill(QColor(255,255,255,255)); + if(fastRendererOn){ + imageData = imageData.convertToFormat(QImage::Format_Indexed8); + } this->fastRenderer = fastRendererOn; } diff --git a/src/Layer/PaintingArea.cpp b/src/Layer/PaintingArea.cpp index e5a8a19..7388487 100644 --- a/src/Layer/PaintingArea.cpp +++ b/src/Layer/PaintingArea.cpp @@ -48,7 +48,8 @@ void PaintingArea::setLayerDimensions(int maxWidth, int maxHeight){ //set standart parameter this->maxWidth = maxWidth; this->maxHeight = maxHeight; - Canvas = new QImage(maxWidth,maxHeight, QImage::Format_ARGB32); + if(renderSettings.getFastRenderer()) Canvas = new QImage(maxWidth,maxHeight, QImage::Format_Indexed8); + else Canvas = new QImage(maxWidth,maxHeight, QImage::Format_ARGB32); // Roots the widget to the top left even if resized setAttribute(Qt::WA_StaticContents); @@ -66,7 +67,10 @@ int PaintingArea::addLayer(int width, int height, int widthOffset, int heightOff }else if(type==IntelliImage::ImageType::Shaped_Image) { newLayer.image = new IntelliShapedImage(width, height, renderSettings.getFastRenderer()); } - newLayer.alpha = 255; + + newLayer.alpha = 255; + + this->layerBundle.push_back(newLayer); return static_cast(layerBundle.size())-1; } @@ -120,7 +124,7 @@ bool PaintingArea::save(const QString &filePath, const char*fileFormat){ this->drawLayers(true); if(!strcmp(fileFormat,"PNG")) { - QImage visibleImage = Canvas->convertToFormat(QImage::Format_Indexed8); + QImage visibleImage = Canvas->convertToFormat(QImage::Format_Indexed8); fileFormat = "png"; if (visibleImage.save(filePath, fileFormat)) { return true; @@ -310,7 +314,7 @@ void PaintingArea::paintEvent(QPaintEvent*event){ QPainter painter(this); QRect dirtyRec = event->rect(); - painter.drawImage(dirtyRec, *Canvas, dirtyRec); + painter.drawImage(dirtyRec, *Canvas, dirtyRec); update(); } @@ -341,15 +345,16 @@ void PaintingArea::selectLayerDown(){ void PaintingArea::drawLayers(bool forSaving){ if(forSaving) { - Canvas->fill(Qt::GlobalColor::transparent); + Canvas->fill(Qt::GlobalColor::transparent); }else{ - Canvas->fill(Qt::GlobalColor::black); + Canvas->fill(Qt::GlobalColor::black); } for(size_t i=0; igetDisplayable(layer.alpha); if(renderSettings.getFastRenderer()){ cpy = cpy.convertToFormat(QImage::Format_ARGB32); + *Canvas = Canvas->convertToFormat(QImage::Format_ARGB32); } QColor clr_0; QColor clr_1; @@ -359,7 +364,7 @@ void PaintingArea::drawLayers(bool forSaving){ for(int x=0; x=maxWidth) break; - clr_0=Canvas->pixelColor(layer.widthOffset+x, layer.heightOffset+y); + clr_0=Canvas->pixelColor(layer.widthOffset+x, layer.heightOffset+y); clr_1=cpy.pixelColor(x,y); float t = static_cast(clr_1.alpha())/255.f; int r =static_cast(static_cast(clr_1.red())*(t)+static_cast(clr_0.red())*(1.f-t)+0.5f); @@ -375,6 +380,9 @@ void PaintingArea::drawLayers(bool forSaving){ } } } + if(renderSettings.getFastRenderer()){ + *Canvas = Canvas->convertToFormat(QImage::Format_Indexed8); + } } void PaintingArea::createTempTopLayer(int idx){ From 540e23aadf9439dfecbb7d5e2914bbecc14a3be2 Mon Sep 17 00:00:00 2001 From: AshBastian Date: Wed, 8 Jan 2020 21:07:32 +0100 Subject: [PATCH 23/44] asdjzh fhg fgghdvbsjasjaffg --- src/Bilder.qrc | 7 ++ src/GUI/IntelliPhotoGui.cpp | 90 ++++++++++++++-- src/GUI/IntelliPhotoGui.h | 7 +- src/Layer/PaintingArea.h | 2 +- src/icons/circle-tool.svg | 94 ++++++++++++++++ src/icons/eraser-tool.svg | 109 +++++++++++++++++++ src/icons/flood-fill-tool.svg | 194 ++++++++++++++++++++++++++++++++++ src/icons/icon.bmp | Bin 1048714 -> 0 bytes src/icons/icon.icns | Bin 107524 -> 0 bytes src/icons/magic-wand-tool.svg | 169 +++++++++++++++++++++++++++++ src/icons/pen-tool.svg | 105 ++++++++++++++++++ src/icons/polygon-tool.svg | 117 ++++++++++++++++++++ src/icons/rectangle-tool.svg | 101 ++++++++++++++++++ src/mainwindow.ui | 31 +++++- 14 files changed, 1014 insertions(+), 12 deletions(-) create mode 100644 src/icons/circle-tool.svg create mode 100644 src/icons/eraser-tool.svg create mode 100644 src/icons/flood-fill-tool.svg delete mode 100644 src/icons/icon.bmp delete mode 100644 src/icons/icon.icns create mode 100644 src/icons/magic-wand-tool.svg create mode 100644 src/icons/pen-tool.svg create mode 100644 src/icons/polygon-tool.svg create mode 100644 src/icons/rectangle-tool.svg diff --git a/src/Bilder.qrc b/src/Bilder.qrc index f755a3d..df17641 100644 --- a/src/Bilder.qrc +++ b/src/Bilder.qrc @@ -1,5 +1,12 @@ 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 diff --git a/src/GUI/IntelliPhotoGui.cpp b/src/GUI/IntelliPhotoGui.cpp index a686e5f..fa34f28 100644 --- a/src/GUI/IntelliPhotoGui.cpp +++ b/src/GUI/IntelliPhotoGui.cpp @@ -208,30 +208,37 @@ void IntelliPhotoGui::slotSwapColor(){ } 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(); } @@ -244,7 +251,25 @@ void IntelliPhotoGui::slotAboutDialog(){ 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 @@ -336,24 +361,32 @@ void IntelliPhotoGui::createActions(){ //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() @@ -364,8 +397,29 @@ void IntelliPhotoGui::createActions(){ actionAboutQtDialog = new QAction(tr("About &Qt"), this); connect(actionAboutQtDialog, SIGNAL(triggered()), qApp, SLOT(aboutQt())); - actionPressEnter = new QAction(); 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 @@ -442,67 +496,86 @@ void IntelliPhotoGui::createGui(){ // create Gui elements paintingArea = new PaintingArea(); - QPixmap p(":/Icons/Buttons/icons/icon.png"); - + 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(QSize(100,20)); + WidthLine->setFixedSize(QSize(55,20)); EditLineWidth = new QLineEdit(); EditLineWidth->setFixedSize(QSize(50,20)); EditLineWidth->setText("5"); ValidatorLineWidth = new QIntValidator(); - ValidatorLineWidth->setTop(50); + ValidatorLineWidth->setTop(99); ValidatorLineWidth->setBottom(1); EditLineWidth->setValidator(ValidatorLineWidth); innerAlphaLine = new QLabel(); innerAlphaLine->setText("Inner Alpha"); - innerAlphaLine->setFixedSize(QSize(100,20)); + innerAlphaLine->setFixedSize(QSize(55,20)); EditLineInnerAlpha = new QLineEdit(); EditLineInnerAlpha->setFixedSize(QSize(50,20)); EditLineInnerAlpha->setText("255"); ValidatorInnerAlpha = new QIntValidator(); - ValidatorInnerAlpha->setTop(255); + ValidatorInnerAlpha->setTop(999); ValidatorInnerAlpha->setBottom(0); EditLineInnerAlpha->setValidator(ValidatorInnerAlpha); + Farbe1 = new QLabel(); + Farbe1->setText(""); + QPalette Palette; + Palette.setColor(QPalette::Background,QColor(0,0,0));//paintingArea->colorPicker.getFirstColor()); + Farbe1->setPalette(Palette); + Farbe1->setFixedSize(QSize(20,20)); + // set gui elements mainLayout->addWidget(paintingArea,1,1,20,1); mainLayout->addWidget(CircleButton,1,2,1,1); @@ -516,6 +589,7 @@ void IntelliPhotoGui::createGui(){ mainLayout->addWidget(EditLineWidth,9,2,1,1); mainLayout->addWidget(innerAlphaLine,10,2,1,1); mainLayout->addWidget(EditLineInnerAlpha,11,2,1,1); + mainLayout->addWidget(Farbe1,12,2,1,1); } void IntelliPhotoGui::setIntelliStyle(){ diff --git a/src/GUI/IntelliPhotoGui.h b/src/GUI/IntelliPhotoGui.h index 0cb9173..e993982 100644 --- a/src/GUI/IntelliPhotoGui.h +++ b/src/GUI/IntelliPhotoGui.h @@ -73,6 +73,8 @@ void slotAboutDialog(); void slotEnterPressed(); +void slotResetTools(); + private: // Will tie user actions to functions void createActions(); @@ -93,6 +95,7 @@ void setDefaultToolValue(); PaintingArea* paintingArea; const QSize Buttonsize = QSize(50,50); +QPixmap p; QPushButton* CircleButton; QPushButton* FloodFillButton; QPushButton* LineButton; @@ -107,6 +110,8 @@ QLineEdit* EditLineInnerAlpha; QIntValidator* ValidatorLineWidth; QIntValidator* ValidatorInnerAlpha; +QLabel* Farbe1; + // The menu widgets QMenu*saveAsMenu; QMenu*fileMenu; @@ -135,8 +140,6 @@ QAction*actionCreateCircleTool; QAction*actionCreatePolygonTool; QAction*actionCreateFloodFillTool; -QAction*actionPressEnter; - // dialog actions QAction*actionAboutDialog; QAction*actionAboutQtDialog; diff --git a/src/Layer/PaintingArea.h b/src/Layer/PaintingArea.h index 8b65d5b..cf218e4 100644 --- a/src/Layer/PaintingArea.h +++ b/src/Layer/PaintingArea.h @@ -166,6 +166,7 @@ public: std::vector getPolygonDataOfRealLayer(); IntelliToolsettings Toolsettings; + IntelliColorPicker colorPicker; public slots: // Events to handle @@ -203,7 +204,6 @@ private: int maxHeight; IntelliTool* Tool; - IntelliColorPicker colorPicker; std::vector layerBundle; int activeLayer=-1; 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.bmp b/src/icons/icon.bmp deleted file mode 100644 index 06dda14b8ee390ee906d0fda4af6888433c288cc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1048714 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%0A|m6ncL^zaEjILZL5?@$ul(&W}Q@sA`;Ec`qvv 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 diff --git a/src/icons/icon.icns b/src/icons/icon.icns deleted file mode 100644 index 791b4ae867c9dc3b5e1db96cb29479cfb9a21ba8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 107524 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
I{)6d%` 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�}}d!Ro(vqpKyL!cds#sa@C1RXLl$Ro8cWY|GiEy^o0n8S3yU zPpY~)m;DZ}$RH2H1=!e>oGB-gd&e6O^C^hKeS^T4bx|91`fUG9nbfsZkRfjPRypeR z7zPt$HZKw~ZXBB)&BsW%-i$^gHLjd2(cS!RD8^5NwqLz0YaHaPc`u}9dMlz*#NEo0 zMgVlw!&GA%QUEGo`2nI1JEn$2xfk`UYb6d@<7oCQYVMR3#-3hKjR^>nl%iYFsC}Bq zw1hQrHb~bShY85wifApnz~Eq_h$2}+4$?#^*!NS?S3*sFJn5=}|9|!AljWCeb|TR< zH#X_@SBnJ_gUw}58Go)t5%i5c;(5E2WmI@MMJP4ew@+uPB#9R_UY!$~DhCVK8NPFR zL~Z~Sx=UC7m%S5LoUNlwl}r)L(5R9ychhTKf{q5^wCN>VR<(!3*#NcXz+l;zhwyWRx^_ z9$(^4dx1{<;%kK1$6bMCA$-rBZ~`$Q#uq$TIV?YWT~5#mPqb>i;yy3F*H^l(anjSVVgaGv)aCIskW1q?R_VmK-|@Q5cF0GPN2p=u88aG@US zGGW{DY1vca<}?hRh>jq zECk`yD&?f2e4`Jbn{0w`Dn0hhNkQOmxw&MkUXfZa1ZPe$6p#t=HE0|)_-vu(3pis= z-uM+mIj=QaYnhgq*t%KRP|Th71q*LNFzUT7*8vX)ISAA0t+JL{_5uY-5<hUdA<_QA`A~kww_pixwaiQAW+U(kRf`|@8+J`nGg#RV(XP`@3~8T4o83I2hF3? zAA4g&rNoFaDFZ5u`fgqa-pXr73(i5AT8|{Iv@0+JuTbA+vviU>ZHe`N(gA)zx5(#5r5)%Z)tJ~n|%PosDKgqax;_$DIiws&gA<0#E`+DiU54{r? zsDGi)R25mh{Wn(Oi9YN^3w(eYsNLhnJ7F~iTgZyU+L=u|X+AcT91vJ@pFjRd@|(9` zl^eha6sRe+E4S0?%^YQ(3P?Tj*Da&EUF>qwlI99cC{=+X8Q?skW|5&r$^1Jfu;9-} z8|Y&TJ=+PZPemhnb$(W6D^;sBs}y*5a4D-W%i(MqC}vM^hpWDHBGd`$7<`zN)6Bmo zAYr=09VFv&fJUf`P$^p{WD;_wWL{9$Yn=?2Nzae!-$Itx&g@E1{|P%_pRYtydy=_? zF*2Dl`v)RbJM#2IrkASLCk~SyStM;j4+fyfX92iFtNM%s*lYs-Z8l(_k9+!MFpmmU zDqBiF&?VJy{aeJ$$tCU})W~Kk5k^)-%dveHm^|rYhqq;)d}RAIBG5q?u(Pf{+4A0q zPK~+9Q4&T!o?yh4OGb(#2LZEAdQ`T;i{qsUM59#P^L?!s+p@j(>%Z{nBKvD!;i^Bw zLcfPWfAHK-;Mc!xv-@-#_;lC&IxqdU-|b@M`&&P5yLa2IH`~zP?WTWjgkNpp{5NO* z8<+eYzu|e`ZSDLzX#O1x-)+%-tQ@bke*1M-Uv8*>4f(#>clc;O@VS46=l9{Yv+Z!- z!q>jrs{A@n{(S~tZI6Ab;Pi$TR(7#<^>U%RcmYd1oNH5XWg<0mKx;%rgpioEtz_UH zNGB>uoi?Fp+BF&7#2~UJGb+i^izO&zJ?_8sF z*NrXdnHP_#=}lV6K({t+m1OZ#7pfYA@v)Cc@Cc0z0{3_4ws_D_7!?Vn2xb!JPW_%Al)od2-e?g7x`$9wmUB5 zJX~6LHYB)|Xk;sc{&a393a+{8*`9QG&Csz|s-%rMqc)B^kN4{d1ZYWIW7N;7Ggp6I z@-suf&4Fm0SeQr+xYOvIAAj>B8dq4@C>adO z6}s>B@ZS7rN=E15SQk{Us*Bs&)Q_(d%2%B5Iq~-3{oA`b5IMc0+oPrp4*{4-$gHE3 zAn$)$MyTu|kxs$AfBjC=?sTu1CR}s;q8{<+k7y1}+BRe=5M19z5{hBV{<5IGVBHcz zaB$(%!+Z~GY}r_79=K(S21xd7N@Kf*K{~Nna)^>ipi$mz9PC-Wm8Ka`I+t!AIR9jR zlB$Sr#=@z*bcOo2TLIHRM6tF1NnK5J(_4qKI)1);;9jx>%RXG!!{=Bb0HbFb1xpew zi-BT_V#?^c08q&aa?}>FcJHe*{1PLTjWP`_`2Es|*w+SB440(!bSC(5RFfn)5(b`# z$$#VBw5e|6dI=#-Z4_aDAGQ3}i^NHb#*CA9AHNyyELHV&?Tr+#KaAcnt#1MEVQ>4G zO8yqiydIx*Dvm}Ie*+)D^jGFXOfJf;v7>1(vAof4DMsF8h$LY=&H$)kIJnN=F#A~8@rFh)@KrHOv&aVGX_mEb_ z917oaqM#MxAx_1&;|j-l^VE734rW$=K7|I|C@0a7nPNpW!pPsC2s(JIdj!>#IQ%6u zILuvTg45(XCXKgo;n5zFK92X|08ejL!+$$|jp6;yB2+$!o>@I6PpUUE zM&3ANtLJ57;0*H_BI+8ls@}~niP*qWjrJO6UrWrUedSnct_GeV1iL=DTRR$%>W1W< z3m;@b(DrY4t_CRgZZZEgs&H3O)Qq$_#+O~7RCp?hhFhvUW*>!QqPpf`-^fdbkEoy| z+vM6GZSZM20Qb+t*7Np%Da@^&d51Hka{#NYSGZoPWkQA85xDWo-T7at z6j2ZDj~?f~_diO~gvhN|d0G<+mOzwkrqhvo8|n@n&1>;aW;Sx%NZ8;U2iB~F_W(xa zaxi!xfy|;;IDPy1Zb3SP15SLSojXey99DB(na53aV(KX`GF|oMiZ(1iIyl zUmqzb)|WxUF+)q;Y;Nu10| z*1Y!C&{Ycoe_n(|{BLV!?GPk}1OYCFrf|kB^VGCj<0wUUkKa_JJ^^R9-1?Inm4Te# zzsOHWhIq%#J7}81SS>F(6~R_hekW9mE702`1N0`EHpN&IsDjR_ml^xDe%*0VG#T6p zKRs%Pyx}IGbey-OiBFp5Bmi4j|<0MFZhW}Kx$T-VaKDJfgVd2*LqLntU^zR!u#tD;73tW z1=<#*$i7ioh{mvz?d)qzWb{z`7r{6YzAvIBh-y%L0(erQTyeffHSco@gkTYBN0^sH zD`m#ms_lcJh>J5{w%8uK5q_@WdQJ*kYB0d2L@)w5-G3J|Sq={)JE_qY{D>SEdb|VV zs#>^auU9iW4tFzzW=~XZ~d-($alGP9JB% zsf@;InHOfX&68}iX5jGL#RSTI5z0lhMZh|Y(+x{*3|lA@d{vbdcDSc{?ELT+TNI_~ z5w8HNr6#*psQo*dIs?C%N{SP2Com-bwmq7LS1iFHkK$mG8i;N}Kx z_~&tazde9EM1qYHs(n&rI&5_!1dS>wy_8r&$Z|GNThA#=Ie0%!depmALG^xcDlEZ6p0e?=0L#p3%hgLa~i(FOEelxABf;3)j>qI#e$&q(|p;mT+Cuh%5#(g|0O~@o_x|j_di+ zIqG_C7(nMnC98{9F#N0s&%LC0SZn7+RWl&|V=h%^T1wHAwf|T(8VyR}%e-0`{=1Xl zQ#EZ1OmeD`{Hndo9FpVQj?X_NQZVEqJnY6m%Kgg9#dN%6e5SnH{)P4@Eb|CSS9@zS zu<))l*2@%e2$z?uYPX$Ofqw?G%uX`%NrnKta_jT>SpQa0s~!vq_O@4?ZUx(@H=_hz z$1T}Y)}^^c4Y>e-O%DuQHk^Idz;%;1K^!L#lziJ)`doafo@&B=a_;-b+bW?@PYRWk zhlwLxppzl=a=;-oykehs5;Q`XI~a?IFg&x6i`JZjkW`wl^44~FUNM#qSdfDKJkP9g zrA+NPeWHWEaQNw{7ImIip~6f1(lVkDWi~xhV|n1K^3WjZBi`jVjhlB>Qu8G{X^}+; zpy)T8V4k_g;9@YDgh0%yBzpBT>&_l|L$UVF(D$y&vbzgVyc(G8Nf*R)k1me@m}SCT zJc$6n9+~Y~2#S~Wmq(xAUaZ179X~05G7%xMPXz)M`z&oKt)dfFqItRn zDj&ov%lWiR3$14{o%+k=rF@s2@Ykt>+!f}dk;Mv)WUHqjq%5!GW#R$ zt7rXFq$c;LLZ~uQ-P3?4Mq)QZfI#Z(ruAwXlLCgY*GVsG#r#x${lP1<0c8ZwSkYuM z_}a?+VjM*ZHUB&u58TjhK*I6&=_cw`vTfttilb@)pvvQF?`z%SMg|Nm529g~ohih9 z-i1U}N{lr&TzT=dI#9M2$d%n#E^TmbUdYX6GK&mHPXm|hB?k?i_J^8+zRe$(lLhZuxA^3^B_?ViVa zF-XDsX?}M>02>EiUYMiO5y!>7_>{d&s$(AER_iWfq7oA?5mOlv7ysH>Y^ zty?iOle|62|2TCWLk45iT-%h*ZP5t|^x0eU?36evoCjj`n>=c#Me{bknN5>c+$&!hnY$rJLFZr61dpQBVF}djbJ3GQ~cpoOe@yiP~sN1 zSARP_?dYWacL8`Z2phsscZ^Z_^7p3@O8KX z0|*qsI4|K?3GiER<(TZjh!NJyfB$p2vz&`MTw|Vpible#RSzrqSAxQ>2OXzzjP1Zr z`@>ZJkG6hNE_CTg0FN9^kNMD=5j*^=Uy|Hs0m)b7$uB)1aJJ%+J#Yp*{}JpyquOgl zC&Y-bEF?QEXL5buc|5F&Nr1@g*#Zx~(jiQCoJw0ZHm= zMDmD%u2BAao72m7@s=u^j>te%PmGPHT=>laB;LH|p5$NeP3KVak`M>$R9+PlehyDW z%acvVzof+z4Rd)WsZoqB&Y`sJ-Mg!YYHhBQ2fWH+StC{rs;FFE ziu}^Kr5)JDC03uDy4w7Qi3u8vYrH`c>?OHbFO(2+8$b{<*ogxQM^e#a z;X(AIP5q=AohyzR2sO_ka2@$3sDqO2%a<3yFmEWjJRa+ZMhSpRek&Mq-DU(Mrd5}CvL z7y$2g0p%me$fg~I$GkbO!NA^R39P>%MoWVR+yns)9Q}@Q#&lF5cB^ys^BCyNX<7GJ zRf8M&h^MDC(F?i~DL?2KkvnEp*hbOgiLC;)f%u*7?4wB|RTT~nMf(m>w0Mk8Wfi3R zjufQ&9^zJE99}@%(z~G!n-w-+s~ZQO8g+$W9mDDGu>dr|BWIN)J1O)Ee(Qnmbvd&! ze%7{M|1-YIJDX)@M<#)6Nkmx=WK3}DdY<&!l%VzO%j0HH?AI?k zLB4uXR463NO%GtxasV#(>M#zB@FLih=LYD2zw9YT&(Rdz0kBf7tvz9)j_0^@5bwK- zT;KehA{1u!8idf(B_MqRKshm5nv(H2)i`ATnR4eNsCdpdIx{a7w4S)27*v2 zeo%86jSAVGHHEQHQ9v{&(unoy={Mn|kQ@(r%dT7`^WM_78Ji98ht``pLjg5*sxfS) zT|$3>;0v)|5kPRxPh4bRqBVht5L@osh_vA$+Zhs|Y(*GXmE|8zvdDYI%{x@oDiFq{M_GoKT{i@#Ie&mjci@7x;Z8z8@F_q zXiaknJz53%vXw(ivFlPN&DRz$Fy0O=q>L^F8KN@k$#ZS|fz#uYj#QF!L^Jc)(vcM^ zW)WuYDgPlR8pt8H$?cOe4Pt^1uS;nFWR~4pubJb|3swkr*Ns)`&oEcPeKhr75gb0; zbK>?pGm%=Ks?vq$Rg=WlKP%%jQt=a*I_aKb>}jWEU2yj)E>JVcOTcq%o|C`F91r<_ zIMdUhQZ~t=V`FAdY}FW73>d^XCY5SAw2@WN8NaOO-G;J1oFkdH(}T;6yz%Lq+%28@ zDariQSsgEp3{2$&8?2^-Ufd>-Scer541i)W5kEUScDA-{CmVIMNT3I7$~LDU<0C#0b~ z3W9Q;wyI4Zx_|2ClgJ9oT(>o3tmlI6h=M!|+^)IlT-$*UU9P9(gB2_MdoXf75nxyT*w;%X@I(r8pHF~k#IMm;4 ze?M8$3F9DQSDlCqi7uJj5l%ipZE>W@_u&_-3fp>l|0-kQO;nF5mY$4DL<-*wt46Iq z`!1_g3~_#d=v5A$H9&7_@0%71VByhuC?{!RjiO@$2$u{QKa9j?%)K$G(b#dpIVQb7 zj7d|=p71+LUV9$ecR+-!t&e1o)>h-_Bq|%eZ0$kKi-H6!^GY&PKGv+mzW*71IoJfL ze%hDCECbzO?;*K^0v1U(UhOd>*>nr^TVfH`zBgrV>kNTV8|V-(w51VwhEIsCk_?@Y zceQkr+)M2h%7m)+tv|4Ji+u&-T=md=yEh888dME=RPl&(pNtZ5$O(ef-!mqk&0{`D z?4b^;NGptCiw`V@&N8GrE90QHOsHz0IBqsPbU7V_FqQZDpG;49(Z zf)mC=q&=i~(2=DNc{mNY7Z(EFQ$LM;7saKltp(~|s?U&`O9mSWvx$v!rf9-2;~0@Z zU+%C_6&HfgCvI5?n%8*;dK97+R614jqv#0mt0EzjdT0;efx7Yaco#diR)j%5R@W)j ziE~%njH7aD31f(W&sn#u_nJ7u{o^RD%w?qJJBG#W>rJMq7_fAek~4DvPFn%CQDAUS zgW*Y0nu{>5lD%sWFryC!$gl@<-z^P=e({rDG{2xg5|_{%%Fn2J-Xo|IG?i1&_<0Lo z(>~Y6y7%c`7Hy5Hh5<=yMU>wg2fB=(D&@<{2J}D!2|-gE#tDnB5k$3!#|pf0id6&CY+oA_u);~KGxhFtaekJ4T#MG zc0Euws6Rx9^aCfP8VsMHPm#9WC-fagekXUphM2En7(^F9e1l`(1-LI_4p2(F)~LRQ zXtwPQ(t&Y`&W5a$!zLf0Qx2m4NQg?AcL>{PP(HbkqlMRFQ=AN`U+)@mv|Qa;&S30# zvC?fICTTo9=;fkHt!7U`J>U-}Rt&N$Qxk$! zD;}ekvm6BtE4g%^ITljlA?-f-cJbqVX>02xGpZr~T!<+D8Thd6JV3vuL81KrLbj`q zvX1BAau&gTlW9b-@>MkLbaCDFqS}3FNxf%|z$7qk1Qvhj7vXH#B?op_J1KnR0I)l> zo(Ca1OV&upOy6DGe%IEnYfA67t!q^``UqSh_=)Ec@KJ|q1`_kPMxt4G+^-!FVj0=n zg0^)|>&FS^zlaq;YhB91Tm5Ht^TcFP6Fh;4`-=%AaSBbyR@@*v9*yp|rH<9m++wv5^zlEZn^>dAOqick4EH3`>0-MRfve%wS+5g)(Q%Ohc@ls7wwy}=<%J&kI6>5C^^2cQ zi%@p;v0cXaC+NRnQ=_F4;e6=SNGe2iNo!bnL0Bmx61Ijfp&jVLZT+)DJO2}_NrJvN z#Dd5N?1c;i3mla_6Dr(eOHl7eGg+VWS{7(0*26lI8zdC8(npkfIubd@tCXT)ptMTL zQiHWzmY*caE4Gg)!LAu?$>=kAE0LGvt600#EkEJKcYox(p^H_tbD58Mo6oH5o;7_4 zDV5Fjw8Ziz6#{eCa;6J`Ku(#W?{7ggmN!OQRTbbf=Rt;;KHqd<)^ePc4KlSlaWIuf zL^bl+Dkgt|VGB5c5vVv{((6T1Ky_I;_+Bi65{g?`>+bXt=4_}H+Lk@{_DB$n{u<5+ z=xe)7Nybq}h>iEi3Z0CC;@zyAO_sJhN3VViCc4a*L!S-ml4x%1%f)C1yITFl4UND; z+CD$x0`_Q;3WL#q8#;Q4Cx|S~o8ce+XF30wr;cM1nYmOqMxh3P5nHlE0PD2J4p+;t7gO{KJ<@TT?<$ z6v{EEP~4QSmZqkEe>W6TNS=gdBjEYWFLmsOb?>PPP1#5zfAEjf3MSA5c(_}i8TX1u5Mb4W5|L0f*rmC=u$ z(Y6q?D(Pm%!2g89hK9`#T+H3W-sXa?VY|i(3rj51mAK=30flUIZi=i1?yuL&o&P5g z&e*G)7J*1BY*DU?z!{Lx1bfz>E?H{2^FST`kKz*GSnM9%t(!a##d9~!JDb5EQ@Gb% z4wnUVy?3OhbH3*`pwQIX8J0l;P3LMTj-Gwv=Vskf@jAlaZ9&+EVv& zmFim#%P3exPWn3v6u=U2P;n9M(~)pGTBU);cbH_K8;OG^{&nc9(KGEo=H2XdUP)dl zRw`QOl@jb*lJsKNexc=o0xp~9_wclT zK_-ZyEaxLJ7m8M#NKit0$+j=MPn@NSlroCjHr#0AkzR$wze-No z0mZ8zl+>jP-GOvfH5Q2HTNbWr3};=L-JAyid#n1JypDBl)8-fbp?gFlA9M=CmBKUs-*hny^rUa?c*ef6gO9m=C!So9E$m5V3#BYSx$tT zUo}-4B(`NQ*%T!(Ndnw6p=j3tvl~ty%x4VIsJR(vc;iKW@{QH@ax^ao>0Ob;J)ZaT z!-ds9TKarjc3f&t)mTJ$wx61}g2V@b-LA#giO8XEURHme^+?fM?wJ)>{(P79E$l>{ zyZ8ayCmA6&Bb;Q}V8u3Lrlq07y$YY!B5NZ-K%dbwFZcrH#~cE9Mi)_Izx?1sAPVF| z-jDkm&SlbI&XVCrJ>$D^rJJIf+S!CB>elVx!FHPxXUqM)mhy3GjqEZQBQJ~y7Omc| zqyGy5@4<_u=8*zhR^J-*!CM6M?zKF@N4d{HoYYa@w zO{;_Z&x7FHn@9+$x3JWf1s2c>R&jd;!>;{)x6WR8z6wLelD9cc7Xl6Zd*!`A&r;Cu z9G4-XQ*|mqHd}K)q&9q7V>9Y}d?o)LLE4wQnniv;TJ9=W)vRC5R5jX(KD{9b)}n@& zeI4jbH-x?Rz;3Upo`Vrtnh_J@-y@-#n0KTQ_8v(5UIQGEanpZc2*$uaAt)=SMd6Jp zO`R>nIR2w}IS?p?7Q6%sya{S%Fb{Q(qX+lpnGlhQP6jQ*8}&}d%X$QKPC?s@Z+>yS z3|sFo#K@W8QVV;FKQP|!fPF+tMTQZxG%VW}HvN}1JXFJhn~RqD?v+WuA#d`_+nImk zS(-*qK-0<1*t!E}y*2#1EVNLc$7iow?*-ju*>^k!=<BkW+DcAR-36Lf$tpq7xeHV1wkwfMJU0v><@n@&J;kPo86r^^Uexlb|0K<2Z z>{AjFWr{_H%j^+}B^_`)e7<4!-|?r^e=1_=Gq>AH?@ZpLBDzE@Y)F<-)WbE*H^mgq z^4ify6Y>dCFDN4IHL2G_@Nbk15=R5^^iRrE$pz`(h7r(JVa8Kw49CaFaLJ}py9PT7c2_Q9 zx$p11BmHV4QnqNS((2Yvihq_wMt$pR+%@=s5ni_Nh>hxqEKh_B_mZ=9=U`aR?ZmY3b< zbKvO$#^Gnuc3%%+jbkqidD6N=o96gzY($SnCVeJma(K$Rmm^VA@{0s)0kGbG=-(TT zmWf4_t3vT2olZZ~!WqQFbFvyX+En}6c@z{%4w@epgJtf*YcIMZ8_>s`% z=>pR%37?V<3NcjjPHG3;-p?LiONp=#bTZ|OaQEtGHzzgHdy7s%{-6E6mSQ&PIHbkx zY}uj|x#i};dM7D2?$lm`$03bapCcs+5}DWSn;kUO;m7fCNB8$JlOxY9TJ$OZS~YLv zj%315w}G5%_ZIFrNj<)4lsjFC#p6JMnd6tYnu^?Za{B%VeeAk2F?HxtZ$hP03c5F@ z&GpCJ%FGVI@81sH;g&J&fvtO9Ys71SommE2alK2@qD~?i(erA&vzBMnvKb*&D&WMn z3UFUjUzpj@JX_-ao@Yi)A`3x5h~(13T^H{wV<_{Q5tv)K-M3CZ&hpG#R!;@pMQ*m$ zJ}3co7_UrCv8f0W3a;wqF-8YQhzN`qOM@lb2;x^v$TMLJXpf0QR%|P7bDL2IH?OtZ zs^4Q?C03uqbh>6fq-BYn3ULjj5JW;GdSgp`t}YJa*NHdeY7m4Yvi}2;W`j>jyW}?m z87)-NiW7ch1<1EK;MkYg067y?dVKuwOYE{q2Eyix! zW_br3U$3{MzmYd%J@fHK?_`Vs z1=MpwO-(ios%}Zf=M7EoC2A;Om8mLK)dx{?9TpQg<6y$e1~34R-q8O$Vun*KEW(=mgL&; zavuqE(@{7OvE(&b6CycUJPGEdvt0x_#oCEaY#3u%XgpL=(gc_Z!hL+La8;3kY`xqM zRsRDwtZv&(g3g?8oZAl*32GgpJOHPFQg-faw%2uA`nasS-hs&ZS8>+35r{${zrxHwT z;!|E1wCr%>dFF%`$^K(1B$I`qDHADvh0o?!$3dq=w3r@j7MWujRek2Ma%QPU6{L_E z@N;gLht$a9u6i)&+Zdse7K0FSbDcOB5$w{6ta zx(8PTKRqkIFPb8B%xl|+G}1ufJXd8Ru*iOtv&6rsSGgl4Zm^9gm>s@gd6hBZ-0i6e zCj1*$DSRxYR{ppihsbs$zC1;9ni`jFZy#}_K4#eq;mbO%!J79JDN~SU-wx*Y<%)`vXT4iDt zy#He8&Pzg{7gI2&I16aOmdlgVWVzi2@-1p1>si9q>c%s3C_}a#!Ty$IhFor6py-qE z32Qu(N~R`*LxenW3fc^MvR0>K`CfTrgTc|5=<`tRix3!U-0C(Z;n!N7ppojd|4=A_ z+nOPe5cbG(<~|&AZqH;3I~7#WKo^a77o(YFOUp`4N<$Y_#N&A<8nc1ph|-G=e`lwi zTWKyLrPm2QQz7cUvYBhb!yFxW>pqD4tO8dt7;56SY7diepl*d=h~ucMpz2oKZa2Kn zSS1y;gHA!^kOH789*la(&>n1>9)Dvov<|4w{~r3t#mOV@(};tD+m zxe8lSHb4xN#h72sj~n?*LTs7zkFsM0_^t=K{i|3{Bcwl6AAdVIfg_8$C{j&;&`)w= zxLco_0GgX=G|17__}rad!bl2%l&1UcLGu1g+Mx`9n)CD`mg5RiC@yhS*v1i%(3k{1 zlTKQT%VK&smfVW5&Yc~vHzF)?sH5Tsmu_YcETRsm#w8_?=xf5^yE6yTky7!`ip;Vn zBej=Hjf;R5?aKo}B>z+M0?y~^oqudfuk(wjNzl#4f!LlRJs4G0GYNe6^(G0671ga$ z(@$uh?yf@BI2J2PYKj29h30!^>zkS(1%uAF<`t5p{u?+{W4n8`&h#+N_UjG|BLYBo znr1CQG{o&`b6N{xpoANs(TWf1+yk2qB;LoEhjETJ_aKrV`Gwb{**hR|j)Fv$?`DYXg#nKl;{KE`yq~Ff^^?Z9MJ(1-HX&8BQK_Pg1kCr z{P;qb<0b6poBN>RO7+@I9q)V<3s$}z9Wcx+p#opU{vMtx5g+v{GK~U_nTS3i2{nmd z%y977cg2y$Y*|E_|0U&43ek-BMx|MEk&ExTkmP2X@d0S=;BQ7!@=FmE|8FiH{*c)Y zJh`%6(PH1joG8>L|MC%p=T!9D$7%XM8L(0~agUm)sP_~=O>AC!l!crHWorzf?P29SCf4FVgIPK= z6xDW}t*0IO%Cm5?Bd@QLRtNp`RkP2{ytzNHz^e+P?(j=vLkp?=P=lyx$wo{+vrdgU z_GIrgr|U>UQ=wAwGs7xa15(N^X(12y;i91Hi0ix9N}OQEF$rx|dm4}JYNG#B8sryk zzKuG%%jHz7crWGWfVHY#+Nx2HTK@f+98~cNvvmXG6pvQvYEY2ouASDr9kioJ-b4dSnWF6YXRfsA*2oT*^-!fnJ z(Kg6bh%6AV5<3WMhtG`(D1v2@7WrR93~#qxLCt|*;q*r1TF!@IQ4kaE_U7T9{}z6e z1wH~9Ixm>qh|pjLk(5{%^i~(=JTAP83cwuT%X-qQt!B=8O2J1S$MmFA{`7%)$f^r-VF$bVlLkt_=OBir2IoY^~wg z3KtoDk}Ga3cJ#yFZiT}zW7w`xf;7*`m7Wl~U{Fr0^tMmXO5%Tx^pBU*pVUvdW+Wgv zvC*HH=$HNW!60Td0%F2Vo@rx@B&fosUgO}%%UOalPfqp*4vC~qzYOp?+FO8$?jj9e zYL{^cxg_bFSkZ45E}#+UzFprifpR5KA9w3lzNjxMqO|gW1F`0au`Kqhc)J-CB~+snPRU6D$MQn)(sl#%9- zAktKi{fA>oh@pK$OUAK0I1)GI$A`PxmZOb5rJV}j-RCAT7Xuy*;f<>em9TUJgGs_! z5(`Gp5g%9Em8|DHQ|ad04`v}wzt}9Ed`;_)w>43Qqs47;%)K+&rR7!W&~lAj@Ve<= z8Ler$b(H#d@|OEU>*)Gm35yvfy|gJ5KrS}WEzBK~(k(H#BzB$Yojh_$1Cy>oaQ_kY z8=ss+MW42N^?M|&G*=sXeMg>VVZN+P?v@cS8g2^7S_QDsqJG7_s>)+Ehl9JFz?Q6= z!O0iu%6pQ~S7fAmkx76>9|URRr3wZ5YBpQ8Xo);_`Xlt&S?oSQDeu(ay+m7T#eQ$3 z;+lzbjyK6~BFq}j_2Kn7=rb09wdylQzt}B`kd(}6O)6ExVP&m_p4e*-17(_X!-Fkl z5(FoPVG7id(k0FLliIv2Vg+>&mNE|?;w%rR&5${&{3jTUb*}?(pzD&$D9;ttMrsM~ zy+qzjVx%s&%P-Sy+g01ND$5Th@{T1E$@z>`aYsq!Vs;o`D!+Pu6+&qZZtm{wVLbX`ajlXol28Fq7KmbQp2bcEf5e{ce87n}bDWQ`*9-v3-wh z99@J1<;6jY`dFiV255;>otLIc*l9(CwmTx}YWQ ze9--zlrnShB2~cJ^%@6WyNcy~FS^>lD-8DSdH zx7*I294*Zvw=J2ji~+=eOVUmW1Ho6me8K$Ey|@ zWr~m!Eb*^N1$;nMq}1xc^ftu5jbM84YMzx?9O?#E0YJTvK_7=H6!_sylZ_QGN2HZv zu8An)CUFmm4k&{Lu_fG3csZfM<5{y5Z7mp?8R8u}xXj8jzo(2+Q{l2aQJx5YL|k<_ z^^PdLo{gt%WUmb3ouJS?uF;F4TILceHoIQ(~x*M7exAa6w&D?r&IerM@%?SIae@almoBwNU z|6kC4Vf2M-kqE)q4dy%{oA&sKTV`G@0aV6)R`PfCPUx{rZ86UAbQpBe} zo?H}DcApcu7ZEK_%iu>yIl4}vQmtM^0uKGwe zi_~kasmuZS48dn-p2qehUU>7+kV%YpHFMRgR_OgU7KtYlkbRDYY8$_iWzniDw)KUB0fhU0O@mdhI44xu|3b@O^+{-NQSu2Kbz<#zeuOY qe|)<9P0_(Z``r<(r(1+}OqFX{`gN0+v{IT^wFSx2_GKyCeE-?Otpe@< 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/mainwindow.ui b/src/mainwindow.ui index 433b697..0bbafd4 100644 --- a/src/mainwindow.ui +++ b/src/mainwindow.ui @@ -16,7 +16,36 @@ true - + + + + + 120 + 100 + 256 + 192 + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + From 8b1fd5c3f09865a131bb727c6e6845cc5a10bb03 Mon Sep 17 00:00:00 2001 From: AshBastian Date: Thu, 9 Jan 2020 00:52:17 +0100 Subject: [PATCH 24/44] Fixes --- src/Image/IntelliImage.h | 3 --- src/IntelliPhoto.pro | 7 ------- src/Layer/PaintingArea.h | 3 --- 3 files changed, 13 deletions(-) diff --git a/src/Image/IntelliImage.h b/src/Image/IntelliImage.h index c5928c0..b3626ab 100644 --- a/src/Image/IntelliImage.h +++ b/src/Image/IntelliImage.h @@ -8,11 +8,8 @@ #include #include -<<<<<<< src/Image/IntelliImage.h #include "IntelliHelper/IntelliRenderSettings.h" -======= #include "IntelliHelper/IntelliTriangulation.h" ->>>>>>> src/Image/IntelliImage.h class IntelliTool; diff --git a/src/IntelliPhoto.pro b/src/IntelliPhoto.pro index c3cafc6..13b6975 100644 --- a/src/IntelliPhoto.pro +++ b/src/IntelliPhoto.pro @@ -21,12 +21,9 @@ SOURCES += \ Image/IntelliRasterImage.cpp \ Image/IntelliShapedImage.cpp \ IntelliHelper/IntelliColorPicker.cpp \ -<<<<<<< src/IntelliPhoto.pro IntelliHelper/IntelliRenderSettings.cpp \ -======= IntelliHelper/IntelliToolsettings.cpp \ IntelliHelper/IntelliTriangulation.cpp \ ->>>>>>> src/IntelliPhoto.pro Layer/PaintingArea.cpp \ Tool/IntelliTool.cpp \ Tool/IntelliToolCircle.cpp \ @@ -44,13 +41,9 @@ HEADERS += \ Image/IntelliRasterImage.h \ Image/IntelliShapedImage.h \ IntelliHelper/IntelliColorPicker.h \ -<<<<<<< src/IntelliPhoto.pro - IntelliHelper/IntelliHelper.h \ IntelliHelper/IntelliRenderSettings.h \ -======= IntelliHelper/IntelliToolsettings.h \ IntelliHelper/IntelliTriangulation.h \ ->>>>>>> src/IntelliPhoto.pro Layer/PaintingArea.h \ Tool/IntelliTool.h \ Tool/IntelliToolCircle.h \ diff --git a/src/Layer/PaintingArea.h b/src/Layer/PaintingArea.h index 4f41b9d..b277158 100644 --- a/src/Layer/PaintingArea.h +++ b/src/Layer/PaintingArea.h @@ -204,10 +204,7 @@ private: int maxWidth; int maxHeight; -<<<<<<< src/Layer/PaintingArea.h IntelliRenderSettings renderSettings; -======= ->>>>>>> src/Layer/PaintingArea.h IntelliTool* Tool; std::vector layerBundle; From 46a69024d374ae0d9aacfee00f6f82ffdd5d30c7 Mon Sep 17 00:00:00 2001 From: AshBastian Date: Thu, 9 Jan 2020 00:58:03 +0100 Subject: [PATCH 25/44] Fix --- src/Bilder.qrc | 1 + src/GUI/IntelliPhotoGui.cpp | 84 ++++++++++++++++++++++--------- src/GUI/IntelliPhotoGui.h | 8 ++- src/Image/IntelliImage.cpp | 63 ++++------------------- src/Image/IntelliImage.h | 17 +------ src/Image/IntelliRasterImage.cpp | 13 ++--- src/Image/IntelliRasterImage.h | 3 +- src/Image/IntelliShapedImage.cpp | 25 ++------- src/Image/IntelliShapedImage.h | 3 +- src/IntelliPhoto.pro | 2 - src/Layer/PaintingArea.cpp | 59 ++++++++-------------- src/Layer/PaintingArea.h | 4 +- src/Tool/IntelliTool.cpp | 6 --- src/icons/Wechselpfeile.png | Bin 0 -> 7700 bytes src/mainwindow.ui | 31 +----------- 15 files changed, 111 insertions(+), 208 deletions(-) create mode 100644 src/icons/Wechselpfeile.png diff --git a/src/Bilder.qrc b/src/Bilder.qrc index df17641..3e190f4 100644 --- a/src/Bilder.qrc +++ b/src/Bilder.qrc @@ -8,5 +8,6 @@ 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 fa34f28..d11563d 100644 --- a/src/GUI/IntelliPhotoGui.cpp +++ b/src/GUI/IntelliPhotoGui.cpp @@ -97,8 +97,11 @@ void IntelliPhotoGui::slotDeleteLayer(){ tr("Number:"), 1,0, 500, 1, &ok); // Create New Layer - if (ok) + if (ok){ paintingArea->deleteLayer(layerNumber); + QString string = QString("Active Layer: %1").arg(paintingArea->getNumberOfActiveLayer()); + ActiveLayerLine->setText(string); + } } void IntelliPhotoGui::slotSetActiveAlpha(){ @@ -192,19 +195,29 @@ void IntelliPhotoGui::slotSetActiveLayer(){ if (ok1) { paintingArea->setLayerActive(layer); + QString string = QString("Active Layer: %1").arg(paintingArea->getNumberOfActiveLayer()); + ActiveLayerLine->setText(string); } } void IntelliPhotoGui::slotSetFirstColor(){ paintingArea->colorPickerSetFirstColor(); + QString string = QString("background-color: %1").arg(paintingArea->colorPicker.getFirstColor().name()); + FirstColorButton->setStyleSheet(string); } void IntelliPhotoGui::slotSetSecondColor(){ paintingArea->colorPickerSetSecondColor(); + QString string = QString("background-color: %1").arg(paintingArea->colorPicker.getSecondColor().name()); + SecondColorButton->setStyleSheet(string); } void IntelliPhotoGui::slotSwapColor(){ paintingArea->colorPickerSwapColors(); + 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); } void IntelliPhotoGui::slotCreatePenTool(){ @@ -351,13 +364,16 @@ 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); @@ -547,10 +563,10 @@ void IntelliPhotoGui::createGui(){ WidthLine = new QLabel(); WidthLine->setText("Width"); - WidthLine->setFixedSize(QSize(55,20)); + WidthLine->setFixedSize(Buttonsize.width(),Buttonsize.height()/3); EditLineWidth = new QLineEdit(); - EditLineWidth->setFixedSize(QSize(50,20)); + EditLineWidth->setFixedSize(Buttonsize.width(),Buttonsize.height()/3); EditLineWidth->setText("5"); ValidatorLineWidth = new QIntValidator(); ValidatorLineWidth->setTop(99); @@ -559,46 +575,64 @@ void IntelliPhotoGui::createGui(){ innerAlphaLine = new QLabel(); innerAlphaLine->setText("Inner Alpha"); - innerAlphaLine->setFixedSize(QSize(55,20)); + innerAlphaLine->setFixedSize(Buttonsize.width(),Buttonsize.height()/3); EditLineInnerAlpha = new QLineEdit(); - EditLineInnerAlpha->setFixedSize(QSize(50,20)); + EditLineInnerAlpha->setFixedSize(Buttonsize.width(),Buttonsize.height()/3); EditLineInnerAlpha->setText("255"); ValidatorInnerAlpha = new QIntValidator(); ValidatorInnerAlpha->setTop(999); ValidatorInnerAlpha->setBottom(0); EditLineInnerAlpha->setValidator(ValidatorInnerAlpha); - Farbe1 = new QLabel(); - Farbe1->setText(""); - QPalette Palette; - Palette.setColor(QPalette::Background,QColor(0,0,0));//paintingArea->colorPicker.getFirstColor()); - Farbe1->setPalette(Palette); - Farbe1->setFixedSize(QSize(20,20)); + 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); // set gui elements + mainLayout->addWidget(paintingArea,1,1,20,1); - mainLayout->addWidget(CircleButton,1,2,1,1); - mainLayout->addWidget(FloodFillButton,2,2,1,1); - mainLayout->addWidget(LineButton,3,2,1,1); - mainLayout->addWidget(PenButton,4,2,1,1); - mainLayout->addWidget(PlainButton,5,2,1,1); - mainLayout->addWidget(PolygonButton,6,2,1,1); - mainLayout->addWidget(RectangleButton,7,2,1,1); - mainLayout->addWidget(WidthLine,8,2,1,1); - mainLayout->addWidget(EditLineWidth,9,2,1,1); - mainLayout->addWidget(innerAlphaLine,10,2,1,1); - mainLayout->addWidget(EditLineInnerAlpha,11,2,1,1); - mainLayout->addWidget(Farbe1,12,2,1,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); } 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(){ diff --git a/src/GUI/IntelliPhotoGui.h b/src/GUI/IntelliPhotoGui.h index e993982..4985534 100644 --- a/src/GUI/IntelliPhotoGui.h +++ b/src/GUI/IntelliPhotoGui.h @@ -94,7 +94,7 @@ void setDefaultToolValue(); // What we'll draw on PaintingArea* paintingArea; -const QSize Buttonsize = QSize(50,50); +const QSize Buttonsize = QSize(70,70); QPixmap p; QPushButton* CircleButton; QPushButton* FloodFillButton; @@ -110,7 +110,11 @@ QLineEdit* EditLineInnerAlpha; QIntValidator* ValidatorLineWidth; QIntValidator* ValidatorInnerAlpha; -QLabel* Farbe1; +QPushButton* FirstColorButton; +QPushButton* SecondColorButton; +QPushButton* SwitchColorButton; + +QLabel* ActiveLayerLine; // The menu widgets QMenu*saveAsMenu; diff --git a/src/Image/IntelliImage.cpp b/src/Image/IntelliImage.cpp index 4c1b01d..0a4b919 100644 --- a/src/Image/IntelliImage.cpp +++ b/src/Image/IntelliImage.cpp @@ -2,16 +2,9 @@ #include #include -IntelliImage::IntelliImage(int width, int height, bool fastRendererOn) - : imageData(QSize(width, height), fastRendererOn ? QImage::Format_Indexed8 : QImage::Format_ARGB32){ - if(fastRendererOn){ - imageData = imageData.convertToFormat(QImage::Format_ARGB32); - } - imageData.fill(QColor(255,255,255,255)); - if(fastRendererOn){ - imageData = imageData.convertToFormat(QImage::Format_Indexed8); - } - this->fastRenderer = fastRendererOn; +IntelliImage::IntelliImage(int weight, int height) + : imageData(QSize(weight, height), QImage::Format_ARGB32){ + imageData.fill(QColor(255,255,255,255)); } @@ -30,7 +23,7 @@ bool IntelliImage::loadImage(const QString &filePath){ // scaled Image to size of Layer loadedImage = loadedImage.scaled(imageData.size(),Qt::IgnoreAspectRatio); - imageData = loadedImage.convertToFormat(fastRenderer ? QImage::Format_Indexed8 : QImage::Format_ARGB32); + imageData = loadedImage.convertToFormat(QImage::Format_ARGB32); return true; } @@ -40,23 +33,17 @@ void IntelliImage::resizeImage(QImage*image, const QSize &newSize){ return; // Create a new image to display and fill it with white - QImage newImage(newSize, QImage::Format_ARGB32); + 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; - if(fastRenderer){ - this->imageData = this->imageData.convertToFormat(QImage::Format_Indexed8); - } } void IntelliImage::drawPixel(const QPoint &p1, const QColor& color){ - if(fastRenderer){ - this->imageData = this->imageData.convertToFormat(QImage::Format_ARGB32); - } - // Used to draw on the widget + // Used to draw on the widget QPainter painter(&imageData); // Set the current settings for the pen @@ -64,32 +51,20 @@ void IntelliImage::drawPixel(const QPoint &p1, const QColor& color){ // Draw a line from the last registered point to the current painter.drawPoint(p1); - if(fastRenderer){ - this->imageData = this->imageData.convertToFormat(QImage::Format_Indexed8); - } } void IntelliImage::drawPoint(const QPoint &p1, const QColor& color, const int& penWidth){ - if(fastRenderer){ - this->imageData = this->imageData.convertToFormat(QImage::Format_ARGB32); - } - // Used to draw on the widget + // 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.drawPoint(p1); - if(fastRenderer){ - this->imageData = this->imageData.convertToFormat(QImage::Format_Indexed8); - } } void IntelliImage::drawLine(const QPoint &p1, const QPoint& p2, const QColor& color, const int& penWidth){ - if(fastRenderer){ - this->imageData = this->imageData.convertToFormat(QImage::Format_ARGB32); - } - // Used to draw on the widget + // Used to draw on the widget QPainter painter(&imageData); // Set the current settings for the pen @@ -97,30 +72,12 @@ void IntelliImage::drawLine(const QPoint &p1, const QPoint& p2, const QColor& co // Draw a line from the last registered point to the current painter.drawLine(p1, p2); - if(fastRenderer){ - this->imageData = this->imageData.convertToFormat(QImage::Format_Indexed8); - } } void IntelliImage::drawPlain(const QColor& color){ - if(fastRenderer){ - this->imageData = this->imageData.convertToFormat(QImage::Format_ARGB32); - } - imageData.fill(color); - if(fastRenderer){ - this->imageData = this->imageData.convertToFormat(QImage::Format_Indexed8); - } + imageData.fill(color); } QColor IntelliImage::getPixelColor(QPoint& point){ - if(fastRenderer){ - QImage copy = this->imageData.convertToFormat(QImage::Format_ARGB32); - return copy.pixelColor(point); - } - return imageData.pixelColor(point); -} - -void IntelliImage::updateRendererSetting(bool fastRendererOn){ - this->fastRenderer = fastRendererOn; - this->imageData = this->imageData.convertToFormat(fastRenderer ? QImage::Format_Indexed8 : QImage::Format_ARGB32); + return imageData.pixelColor(point); } diff --git a/src/Image/IntelliImage.h b/src/Image/IntelliImage.h index b3626ab..43cc69a 100644 --- a/src/Image/IntelliImage.h +++ b/src/Image/IntelliImage.h @@ -8,7 +8,6 @@ #include #include -#include "IntelliHelper/IntelliRenderSettings.h" #include "IntelliHelper/IntelliTriangulation.h" class IntelliTool; @@ -40,20 +39,13 @@ QImage imageData; * \brief The Type, an Image is. */ ImageType TypeOfImage; - -/*! - * \brief fastRenderer is the flag that represents the usage of 8bit pictures. - */ -bool fastRenderer; - public: /*! * \brief The Construcor of the IntelliImage. Given the Image dimensions. * \param width - The width of the Image. * \param height - The height of the Image. - * \param fastRendererOn - Represents the flag for 8bit picture handelling. */ -IntelliImage(int width, int height, bool fastRendererOn); +IntelliImage(int width, int height); /*! * \brief An Abstract Destructor. @@ -148,13 +140,6 @@ virtual bool loadImage(const QString &filePath); * \return The color of the Pixel as QColor. */ virtual QColor getPixelColor(QPoint& point); - -/*! - * \brief updateRendererSetting updates the existing image format to the new format. - * \param fastRendererOn flag for the 8bit image handeling. - */ -virtual void updateRendererSetting(bool fastRendererOn); - }; #endif diff --git a/src/Image/IntelliRasterImage.cpp b/src/Image/IntelliRasterImage.cpp index 7e97e55..8e8f918 100644 --- a/src/Image/IntelliRasterImage.cpp +++ b/src/Image/IntelliRasterImage.cpp @@ -3,10 +3,9 @@ #include #include -IntelliRasterImage::IntelliRasterImage(int width, int height, bool fastRendererOn) - : IntelliImage(width, height, fastRendererOn){ +IntelliRasterImage::IntelliRasterImage(int weight, int height) + : IntelliImage(weight, height){ TypeOfImage = IntelliImage::ImageType::Raster_Image; - this->fastRenderer = fastRendererOn; } IntelliRasterImage::~IntelliRasterImage(){ @@ -14,7 +13,7 @@ IntelliRasterImage::~IntelliRasterImage(){ } IntelliImage* IntelliRasterImage::getDeepCopy(){ - IntelliRasterImage* raster = new IntelliRasterImage(imageData.width(), imageData.height(), false); + IntelliRasterImage* raster = new IntelliRasterImage(imageData.width(), imageData.height()); raster->imageData.fill(Qt::transparent); raster->TypeOfImage = IntelliImage::ImageType::Raster_Image; return raster; @@ -30,9 +29,6 @@ QImage IntelliRasterImage::getDisplayable(int alpha){ QImage IntelliRasterImage::getDisplayable(const QSize& displaySize, int alpha){ QImage copy = imageData; - if(fastRenderer){ - copy = copy.convertToFormat(QImage::Format_ARGB32); - } for(int y = 0; y #include -IntelliShapedImage::IntelliShapedImage(int width, int height, bool fastRendererOn) - : IntelliRasterImage(width, height, fastRendererOn){ +IntelliShapedImage::IntelliShapedImage(int weight, int height) + : IntelliRasterImage(weight, height){ TypeOfImage = IntelliImage::ImageType::Shaped_Image; - this->fastRenderer = fastRendererOn; } IntelliShapedImage::~IntelliShapedImage(){ @@ -19,7 +18,7 @@ QImage IntelliShapedImage::getDisplayable(int alpha){ } IntelliImage* IntelliShapedImage::getDeepCopy(){ - IntelliShapedImage* shaped = new IntelliShapedImage(imageData.width(), imageData.height(), false); + IntelliShapedImage* shaped = new IntelliShapedImage(imageData.width(), imageData.height()); shaped->setPolygon(this->polygonData); shaped->imageData.fill(Qt::transparent); shaped->TypeOfImage = IntelliImage::ImageType::Shaped_Image; @@ -27,11 +26,7 @@ IntelliImage* IntelliShapedImage::getDeepCopy(){ } void IntelliShapedImage::calculateVisiblity(){ - if(fastRenderer){ - this->imageData = imageData.convertToFormat(QImage::Format_ARGB32); - } - - if(polygonData.size()<=2) { + if(polygonData.size()<=2) { QColor clr; for(int y=0; yimageData = this->imageData.convertToFormat(QImage::Format_Indexed8); - } return; } QColor clr; @@ -59,16 +51,10 @@ void IntelliShapedImage::calculateVisiblity(){ imageData.setPixelColor(x,y,clr); } } - if(fastRenderer){ - this->imageData = this->imageData.convertToFormat(QImage::Format_Indexed8); - } } QImage IntelliShapedImage::getDisplayable(const QSize& displaySize, int alpha){ QImage copy = imageData; - if(fastRenderer){ - copy = copy.convertToFormat(QImage::Format_ARGB32); - } for(int y = 0; yTool = nullptr; - this->renderSettings = IntelliRenderSettings(); this->setLayerDimensions(maxWidth, maxHeight); this->addLayer(200,200,0,0,IntelliImage::ImageType::Shaped_Image); layerBundle[0].image->drawPlain(QColor(0,0,255,255)); @@ -37,7 +36,6 @@ PaintingArea::PaintingArea(int maxWidth, int maxHeight, QWidget*parent) layerBundle[1].alpha=200; activeLayer=0; - } PaintingArea::~PaintingArea(){ @@ -48,8 +46,7 @@ void PaintingArea::setLayerDimensions(int maxWidth, int maxHeight){ //set standart parameter this->maxWidth = maxWidth; this->maxHeight = maxHeight; - if(renderSettings.getFastRenderer()) Canvas = new QImage(maxWidth,maxHeight, QImage::Format_Indexed8); - else Canvas = new QImage(maxWidth,maxHeight, QImage::Format_ARGB32); + Canvas = new QImage(maxWidth,maxHeight, QImage::Format_ARGB32); // Roots the widget to the top left even if resized setAttribute(Qt::WA_StaticContents); @@ -63,14 +60,11 @@ int PaintingArea::addLayer(int width, int height, int widthOffset, int heightOff newLayer.widthOffset = widthOffset; newLayer.heightOffset = heightOffset; if(type==IntelliImage::ImageType::Raster_Image) { - newLayer.image = new IntelliRasterImage(width,height,renderSettings.getFastRenderer()); + newLayer.image = new IntelliRasterImage(width,height); }else if(type==IntelliImage::ImageType::Shaped_Image) { - newLayer.image = new IntelliShapedImage(width, height, renderSettings.getFastRenderer()); + newLayer.image = new IntelliShapedImage(width, height); } - - newLayer.alpha = 255; - - + newLayer.alpha = 255; this->layerBundle.push_back(newLayer); return static_cast(layerBundle.size())-1; } @@ -124,7 +118,7 @@ bool PaintingArea::save(const QString &filePath, const char*fileFormat){ this->drawLayers(true); if(!strcmp(fileFormat,"PNG")) { - QImage visibleImage = Canvas->convertToFormat(QImage::Format_Indexed8); + QImage visibleImage = Canvas->convertToFormat(QImage::Format_Indexed8); fileFormat = "png"; if (visibleImage.save(filePath, fileFormat)) { return true; @@ -151,25 +145,21 @@ void PaintingArea::floodFill(int r, int g, int b, int a){ } void PaintingArea::movePositionActive(int x, int y){ - if(Tool!=nullptr){ - if(Tool->getIsDrawing()){ - IntelliTool* temp = copyActiveTool(); - delete this->Tool; - this->Tool = temp; - } + if(Tool->getIsDrawing()){ + IntelliTool* temp = copyActiveTool(); + delete this->Tool; + this->Tool = temp; } layerBundle[static_cast(activeLayer)].widthOffset += x; layerBundle[static_cast(activeLayer)].heightOffset += y; } void PaintingArea::moveActiveLayer(int idx){ - if(Tool!=nullptr){ - if(Tool->getIsDrawing()){ - IntelliTool* temp = copyActiveTool(); - delete this->Tool; - this->Tool = temp; - } - } + if(Tool->getIsDrawing()){ + IntelliTool* temp = copyActiveTool(); + delete this->Tool; + this->Tool = temp; + } if(idx==1) { this->selectLayerUp(); }else if(idx==-1) { @@ -178,13 +168,11 @@ void PaintingArea::moveActiveLayer(int idx){ } void PaintingArea::slotActivateLayer(int a){ - 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); } @@ -314,7 +302,7 @@ void PaintingArea::paintEvent(QPaintEvent*event){ QPainter painter(this); QRect dirtyRec = event->rect(); - painter.drawImage(dirtyRec, *Canvas, dirtyRec); + painter.drawImage(dirtyRec, *Canvas, dirtyRec); update(); } @@ -345,17 +333,13 @@ void PaintingArea::selectLayerDown(){ void PaintingArea::drawLayers(bool forSaving){ if(forSaving) { - Canvas->fill(Qt::GlobalColor::transparent); + Canvas->fill(Qt::GlobalColor::transparent); }else{ - Canvas->fill(Qt::GlobalColor::black); + Canvas->fill(Qt::GlobalColor::black); } for(size_t i=0; igetDisplayable(layer.alpha); - if(renderSettings.getFastRenderer()){ - cpy = cpy.convertToFormat(QImage::Format_ARGB32); - *Canvas = Canvas->convertToFormat(QImage::Format_ARGB32); - } QColor clr_0; QColor clr_1; for(int y=0; y=maxWidth) break; - clr_0=Canvas->pixelColor(layer.widthOffset+x, layer.heightOffset+y); + clr_0=Canvas->pixelColor(layer.widthOffset+x, layer.heightOffset+y); clr_1=cpy.pixelColor(x,y); float t = static_cast(clr_1.alpha())/255.f; int r =static_cast(static_cast(clr_1.red())*(t)+static_cast(clr_0.red())*(1.f-t)+0.5f); @@ -380,9 +364,6 @@ void PaintingArea::drawLayers(bool forSaving){ } } } - if(renderSettings.getFastRenderer()){ - *Canvas = Canvas->convertToFormat(QImage::Format_Indexed8); - } } void PaintingArea::createTempTopLayer(int idx){ @@ -410,3 +391,7 @@ IntelliTool* PaintingArea::copyActiveTool(){ default: return nullptr; } } + +int PaintingArea::getNumberOfActiveLayer(){ + return activeLayer; +} diff --git a/src/Layer/PaintingArea.h b/src/Layer/PaintingArea.h index b277158..5b98820 100644 --- a/src/Layer/PaintingArea.h +++ b/src/Layer/PaintingArea.h @@ -12,7 +12,6 @@ #include "Image/IntelliShapedImage.h" #include "Tool/IntelliTool.h" #include "IntelliHelper/IntelliColorPicker.h" -#include "IntelliHelper/IntelliRenderSettings.h" /*! * \brief The LayerObject struct holds all the information needed to construct a layer @@ -166,6 +165,8 @@ public: std::vector getPolygonDataOfRealLayer(); + int getNumberOfActiveLayer(); + IntelliToolsettings Toolsettings; IntelliColorPicker colorPicker; @@ -204,7 +205,6 @@ private: int maxWidth; int maxHeight; - IntelliRenderSettings renderSettings; IntelliTool* Tool; std::vector layerBundle; diff --git a/src/Tool/IntelliTool.cpp b/src/Tool/IntelliTool.cpp index 695dc37..8a1cbbb 100644 --- a/src/Tool/IntelliTool.cpp +++ b/src/Tool/IntelliTool.cpp @@ -57,9 +57,6 @@ void IntelliTool::createToolLayer(){ void IntelliTool::mergeToolLayer(){ QColor clr_0; QColor clr_1; - if(Area->renderSettings.getFastRenderer()){ - activeLayer->image->imageData = activeLayer->image->imageData.convertToFormat(QImage::Format_ARGB32); - } for(int y=0; yheight; y++) { for(int x=0; xwidth; x++) { clr_0=activeLayer->image->imageData.pixelColor(x,y); @@ -77,9 +74,6 @@ void IntelliTool::mergeToolLayer(){ activeLayer->image->imageData.setPixelColor(x, y, clr_0); } } - if(Area->renderSettings.getFastRenderer()){ - activeLayer->image->imageData = activeLayer->image->imageData.convertToFormat(QImage::Format_Indexed8); - } } void IntelliTool::deleteToolLayer(){ diff --git a/src/icons/Wechselpfeile.png b/src/icons/Wechselpfeile.png new file mode 100644 index 0000000000000000000000000000000000000000..505fcdd9fec67d71205724e38d35627b4ea16f32 GIT binary patch literal 7700 zcmeHMXIN8Nw+<*u7ZnvjGz38y4JjlfM3CMFLJ1ulHRU9PmXJa~L8J)?B2C3Y8Kv0} zP@32PrFRfSMNv^e1RVj9LFAsGpECE(o$t=`-0$CnCnS6CcfD(!_pG(g+E3!_Z7pOZ z6(u1Mh>Vq`DGB_ffp4_<3h@6$?7`dMhX|KsVGJp3+cXLemNSfqMi5BxF{#gFF>oxw zwshx0AX=)zw@6T~K_CPo6|&#SjYlF2pll9{&h!PKykIr}1%jA#2qfsyt#qFhRh(?p z!le9x@HvB(Cs;+G zWPbSX2Sbr}4kGs~yZ`a@Ab(yzIf@~=p!o3UeDM(Db)V$$HTd5Bm$J%>_RM7U4dbM5 zo>fliapOo}18h3`JP7YRr!K6)l}2Z-s|rQ5_ZdF>B6#Pi>T|?1A}F!ZMWfy4z2wZp z%KAHn@`(;_u8}&9v`yNLysP-~+sk7v6Hl$fjJ}9<3D$?i{Qh!aTh4&Y$lS8o!}hcI zg{l1w28C7aNqe5`YTeyb-?F!`eq{Kh{vC&FeY%g@`r9YWfAX!osWbhwDYQPc`yBs{ zbCAoPewH5)>oX1dR6fda=xBV zw*4r*&1Ljl*P)C>k+)xU#tVdHzwzXYH6RjcOabp4YX^Y7W{@ zV<9ROu~YY#i-_!v7_yJJin^gF8tx0hxb07q-&PcL_Iyc0x~b%#y;w`Dz`LTnZc|pX zoQfe$)Apx_yp4yBlhnh!y@xs)QXJbVhfaG=1j}o>kaK$|351J1PF#3tugd}DLMv-{ zd6&1(mGVyN1_hkpO>z0tIRzVnLh$?XY8h$^9>_bzIK?mPA9m}6yE9)oyZquejm2El z;9oYoq%%$ke3;W^yYpSin19u~0LxORpK(rKMg$Rn3 z+F99kNxkA)Bu{-a4yJjuG6`QfdLzzaU*o8=pmD3SqPWG|wf#kGlQf*=J^zCH1reDk zn4LNP>pHe?KvK~xiRjj z_+XD}H4KRGUk^L+=~_d?HNoIxKAbux#N^_mIxlb~tneBf{LmVlNxkDl6|33H{h{r1*5vOF4zjUbTbW1GNq~LStTW z5Rvb*h2Pqx=`yK4;MQ+TJi}2o(RB&5r?YdPq#|KU&cX=`I ztcfm{$V<~zAq18%x~^|;%w@=sTKTcQ?>06r!1-y?o1$vAWQ{$|JRnvnGT3l$y2sYJ z@2A}T5BL$X7k_Ebi9Wk|aq3!IN9A!^Jd&%P zxamZR!JA`Gq6cgrosYI(Gt_ILwbkjedXh?ShidLsYwKnH>LTgqi{{Rnp1Eriaa~d} zJEvnr?0l-a=E!rCt0PH~+M+m21+8Tujuc_ouXNx|5z_sp(#B@nE9`j4KzKklLSEr% zF>K2=$Ln$)p14StvId&jGh?xH`T@&>=(~EfR5FQ?Zaagfe8*lj7abaJ|M_0(mj`8aflamD-4v*V^Bt5VSK-%;-eD7d zkDZ@|gT#eOFW9x_t!c!UjRn#j+Y>EFG5NpAZ+|)dysD+s!^UaZi$ev;H7it+216cu z&30BlPU`S%HF^EhNsm#r9%EwbF8e{_o0lhZ3R?Q`v9AjmJMT1I%fQp?#pS~`EQHqd z`65L{Vpds>*X}@oNlC|^KPoVqKX0_UTkVHt&{Yaf75x$pu{osSFJ%f{e`%Fqa9T_PF;Mpx9OH@X(HU{=&hV+Lxt_<&!z&k7DFE^v|@M94NT^U zMBPe^q$OYXxVza*N<(UL_oge2NhNcJ(;Aqrtc@2|1xmeW>=`&%QIy0De1|h=3nqq7 zje3)ubS#hzLbuIo^HU|!3MdiNhpSTft%=M{iLMd-8sV6Ib#~cbO0QLYY`~=`Mjke; zew$5e#rP^^7A?GyRcf2RHCwAQzm;DC4SZiAP_QD2?R0wXe-@kV%1!-AO1#J+26`xD z)AfyR9jUIZFB=4`u`eRr&tY4{DYAA(B+`k1(#<)_cH!4$cquiHU&wl3akmPYxA#iG zk09$|O7@Sos6J|!xvs%XEmnJB|64%+*0nm9hl;jKd-++LX&ueBTUC0dSS;1SMn12y zB$QoN93b@sF;7K6ME!XvXLqH|*Y{*J5*D73GmhDbIWfrCgE9 z*|;X;ZR32~$YUerjxb~FdxP{e3_J1uRkK}ChYG1Vcd<^t3zD>}dz(h<`$KQoU$IL( z>Ajk(>grn~IqH4+!9H~j1(vsD^AxGmtMlnR{1wpcU3&T^bh+yt z$wKY>e!k*Xt> z<5O>Cn6r#KG1px-hZe1C_B@mD>^JU7vGhxFCWO6pHOjsp3QlJn5J>KgrM~cF_CaMa z^zPZBfT02h70ax^(}E+NJAicAnT?@F$%?m?;`NB1ZuinM%dKVEtEC3Yt#?gDA>&<2 ze1Cn`Uu`mQ&|(@zPL5MfFg|&?{M3Tfn-92GBPW;j+lfCK2ouTIi4^7bk6D7vIr&ff za3-5a753r!an&++ko?E-sCF@#6nlk zp#Y~0%(-RW05%Th8aC+8i+zO?2^K+W$alULy{!R(ta4(4O}`t_hCpTcX_09x3ZNC_ z#|EQ-K=cfP*kq~?z=Ki%2Gd_3_O9v<49cYG!(6dMB#~_bcrh*aa{$NvwocUjK2%*A z%wU(KUJwB!@B?^cXpo<;KbH`s4_o9VfZv7F2pDt`!t>FGxe@K5CM*sB#b{x)kZ`jg zW*{22OA@Nbq0tE>Q}b^W;7A|l#pAIF2!uc&&=P2Cu{aC_N>^7GfkY$FXgG*~bA$bP zOqM@X$VsNK_&j|W3|xnPBNqy576eXyb08cq(sOw85NIS44@aWmXkElodvKLV{BG^f{iY(QCnAWw zJbNKX0GGw*Pyw?*z@MkO)G6DS&t2-1&jo~2i*ftX=m;>VMbArZEUbw3-))34GMIks zMGGN%DUwG0j$`vVzKa+d6#@7HeqbP6kQwy{JZS&j;7>1Sk$h1of+>s27qVEH>cfNq z5NIqalSWwl3TR_dXexyUr(x0Ba15COz$s`H1x}>{cru`?L!sknOQ@{;xjeEz6%bN^ zzJ$V#!vs^C?7K87Ar%dz z!sF-w7>+jR9*cxybdVIdE}o8pBPl2fhN_Li({!um}cd z!b97VsWU4_$%=LU~=?g3H<+WJU^h{S&TS50gK~f$FZY$161B$^ZXh3I}-`q zrMNs!u+_i0sQ-r3`6Nyu`mF5b$;Mbt~~@E=mQ3E|xEWOckoA595*pfv-sk z>iBhu>P7Zv0N_6Ptw{bg&-{~o)gj|?I5fDi&{4X0I0lEK!O3L0E}W)=!D3K!JdLcQ zy?BGavvXN=o`B2&j2K`Qf%h4#p~d?Q)%ccXnt#L#yZ~ViA<;-U5=>rQCnS=9)FGg8 zu&;L;s)rEnjQ_e?J>lL#BodbDp(os12v)*`bL6wxzD$7gN1gtaH~$N6iT$@6{deX| zVPCCHSnOc1SiN|50{_2s|0lq&3^q(E;Lm0KRp?70Uu9YH00CqEItMy|`-ARV zmIw>!Klu8Veg8oZAoV{^{+7P~$n}q0e@lVC1^y?y{*mi%De$+z|76$yn_QAVj>>>P z*!Ky*gYfj{gD&79dIiPW!W6O~{L8+Tp9;>bSL}@A z+x-&~qa5$m%bzFr zt#YvMnawUZ23d|;L2?PNIP!C=L$%fe>2;pD+hnjgYjSo_(-V?*06{UD^8r(#sz;qt zZ%suHcXJPZiD8VK#u2`(i`iUuC=9a=7E~(0J8#OWoBzyXuL1tzW_i^SwjE- literal 0 HcmV?d00001 diff --git a/src/mainwindow.ui b/src/mainwindow.ui index 0bbafd4..433b697 100644 --- a/src/mainwindow.ui +++ b/src/mainwindow.ui @@ -16,36 +16,7 @@ true - - - - - 120 - 100 - 256 - 192 - - - - - - 0 - 0 - 0 - - - - - - - 0 - 0 - 0 - - - - - + From 73500db1712160cdd1640e00ad0371f69c9a0a5b Mon Sep 17 00:00:00 2001 From: AshBastian Date: Thu, 9 Jan 2020 01:07:25 +0100 Subject: [PATCH 26/44] Sorry falscher Merge --- src/Image/IntelliImage.h | 3 --- src/IntelliPhoto.pro | 7 ------- src/Layer/PaintingArea.h | 3 --- 3 files changed, 13 deletions(-) diff --git a/src/Image/IntelliImage.h b/src/Image/IntelliImage.h index c5928c0..b3626ab 100644 --- a/src/Image/IntelliImage.h +++ b/src/Image/IntelliImage.h @@ -8,11 +8,8 @@ #include #include -<<<<<<< src/Image/IntelliImage.h #include "IntelliHelper/IntelliRenderSettings.h" -======= #include "IntelliHelper/IntelliTriangulation.h" ->>>>>>> src/Image/IntelliImage.h class IntelliTool; diff --git a/src/IntelliPhoto.pro b/src/IntelliPhoto.pro index c3cafc6..13b6975 100644 --- a/src/IntelliPhoto.pro +++ b/src/IntelliPhoto.pro @@ -21,12 +21,9 @@ SOURCES += \ Image/IntelliRasterImage.cpp \ Image/IntelliShapedImage.cpp \ IntelliHelper/IntelliColorPicker.cpp \ -<<<<<<< src/IntelliPhoto.pro IntelliHelper/IntelliRenderSettings.cpp \ -======= IntelliHelper/IntelliToolsettings.cpp \ IntelliHelper/IntelliTriangulation.cpp \ ->>>>>>> src/IntelliPhoto.pro Layer/PaintingArea.cpp \ Tool/IntelliTool.cpp \ Tool/IntelliToolCircle.cpp \ @@ -44,13 +41,9 @@ HEADERS += \ Image/IntelliRasterImage.h \ Image/IntelliShapedImage.h \ IntelliHelper/IntelliColorPicker.h \ -<<<<<<< src/IntelliPhoto.pro - IntelliHelper/IntelliHelper.h \ IntelliHelper/IntelliRenderSettings.h \ -======= IntelliHelper/IntelliToolsettings.h \ IntelliHelper/IntelliTriangulation.h \ ->>>>>>> src/IntelliPhoto.pro Layer/PaintingArea.h \ Tool/IntelliTool.h \ Tool/IntelliToolCircle.h \ diff --git a/src/Layer/PaintingArea.h b/src/Layer/PaintingArea.h index 4f41b9d..b277158 100644 --- a/src/Layer/PaintingArea.h +++ b/src/Layer/PaintingArea.h @@ -204,10 +204,7 @@ private: int maxWidth; int maxHeight; -<<<<<<< src/Layer/PaintingArea.h IntelliRenderSettings renderSettings; -======= ->>>>>>> src/Layer/PaintingArea.h IntelliTool* Tool; std::vector layerBundle; From 6fdda34d682bd8a9c33bca6721c6d638cb1dd4aa Mon Sep 17 00:00:00 2001 From: AshBastian Date: Thu, 9 Jan 2020 02:43:43 +0100 Subject: [PATCH 27/44] Gui Endprodukt --- src/GUI/IntelliPhotoGui.cpp | 45 +++++++++++++++++++++++++------------ src/GUI/IntelliPhotoGui.h | 3 +++ src/Image/IntelliImage.cpp | 4 ++++ src/Image/IntelliImage.h | 2 ++ src/Layer/PaintingArea.cpp | 29 +++++++++++++++--------- src/Layer/PaintingArea.h | 5 +++++ src/Tool/IntelliTool.cpp | 1 + 7 files changed, 65 insertions(+), 24 deletions(-) diff --git a/src/GUI/IntelliPhotoGui.cpp b/src/GUI/IntelliPhotoGui.cpp index d11563d..6fb1e81 100644 --- a/src/GUI/IntelliPhotoGui.cpp +++ b/src/GUI/IntelliPhotoGui.cpp @@ -81,7 +81,7 @@ void IntelliPhotoGui::slotCreateNewLayer(){ if (ok1&&ok2) { int layer = paintingArea->addLayer(width,height,0,0); - paintingArea->slotActivateLayer(layer); + UpdateGui(); } } @@ -95,12 +95,11 @@ 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){ paintingArea->deleteLayer(layerNumber); - QString string = QString("Active Layer: %1").arg(paintingArea->getNumberOfActiveLayer()); - ActiveLayerLine->setText(string); + UpdateGui(); } } @@ -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,29 +196,23 @@ void IntelliPhotoGui::slotSetActiveLayer(){ if (ok1) { paintingArea->setLayerActive(layer); - QString string = QString("Active Layer: %1").arg(paintingArea->getNumberOfActiveLayer()); - ActiveLayerLine->setText(string); + UpdateGui(); } } void IntelliPhotoGui::slotSetFirstColor(){ paintingArea->colorPickerSetFirstColor(); - QString string = QString("background-color: %1").arg(paintingArea->colorPicker.getFirstColor().name()); - FirstColorButton->setStyleSheet(string); + UpdateGui(); } void IntelliPhotoGui::slotSetSecondColor(){ paintingArea->colorPickerSetSecondColor(); - QString string = QString("background-color: %1").arg(paintingArea->colorPicker.getSecondColor().name()); - SecondColorButton->setStyleSheet(string); + UpdateGui(); } void IntelliPhotoGui::slotSwapColor(){ paintingArea->colorPickerSwapColors(); - 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); + UpdateGui(); } void IntelliPhotoGui::slotCreatePenTool(){ @@ -511,6 +506,7 @@ void IntelliPhotoGui::createGui(){ // create Gui elements paintingArea = new PaintingArea(); + paintingArea->DumpyGui = this; p = QPixmap(":/Icons/Buttons/icons/circle-tool.svg"); CircleButton = new QPushButton(); @@ -602,6 +598,13 @@ void IntelliPhotoGui::createGui(){ 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,1,1,20,1); @@ -620,6 +623,7 @@ void IntelliPhotoGui::createGui(){ 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(){ @@ -686,3 +690,16 @@ bool IntelliPhotoGui::saveFile(const QByteArray &fileFormat){ 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 4985534..3b478b6 100644 --- a/src/GUI/IntelliPhotoGui.h +++ b/src/GUI/IntelliPhotoGui.h @@ -32,6 +32,8 @@ public: */ IntelliPhotoGui(); +void UpdateGui(); + protected: // Function used to close an event void closeEvent(QCloseEvent*event) override; @@ -115,6 +117,7 @@ QPushButton* SecondColorButton; QPushButton* SwitchColorButton; QLabel* ActiveLayerLine; +QPushButton* ActiveLayerImageButton; // The menu widgets QMenu*saveAsMenu; 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 ee14476..06edc4b 100644 --- a/src/Image/IntelliImage.h +++ b/src/Image/IntelliImage.h @@ -141,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/Layer/PaintingArea.cpp b/src/Layer/PaintingArea.cpp index 9740b9a..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); @@ -395,3 +400,7 @@ IntelliTool* PaintingArea::copyActiveTool(){ 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 d095bc8..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 @@ -167,6 +169,8 @@ public: int getNumberOfActiveLayer(); + IntelliImage* getImageOfActiveLayer(); + IntelliToolsettings Toolsettings; IntelliColorPicker colorPicker; @@ -207,6 +211,7 @@ private: IntelliRenderSettings renderSettings; IntelliTool* Tool; + IntelliPhotoGui* DumpyGui; std::vector layerBundle; int activeLayer=-1; diff --git a/src/Tool/IntelliTool.cpp b/src/Tool/IntelliTool.cpp index 8a1cbbb..e75abdb 100644 --- a/src/Tool/IntelliTool.cpp +++ b/src/Tool/IntelliTool.cpp @@ -74,6 +74,7 @@ void IntelliTool::mergeToolLayer(){ activeLayer->image->imageData.setPixelColor(x, y, clr_0); } } + Area->DumpyGui->UpdateGui(); } void IntelliTool::deleteToolLayer(){ From 326f9c8948511ed07d102c4d0f0200b9e6b18af5 Mon Sep 17 00:00:00 2001 From: Conrad Date: Thu, 9 Jan 2020 10:12:38 +0100 Subject: [PATCH 28/44] Unified Index Variable Name --- src/IntelliHelper/IntelliTriangulation.cpp | 32 +++++++++++----------- src/Layer/PaintingArea.cpp | 22 +++++++-------- src/Layer/PaintingArea.h | 20 +++++++------- 3 files changed, 37 insertions(+), 37 deletions(-) diff --git a/src/IntelliHelper/IntelliTriangulation.cpp b/src/IntelliHelper/IntelliTriangulation.cpp index 55ddd9a..42f44d9 100644 --- a/src/IntelliHelper/IntelliTriangulation.cpp +++ b/src/IntelliHelper/IntelliTriangulation.cpp @@ -9,7 +9,7 @@ std::vector IntelliTriangulation::calculateTriangles(std::vector IntelliTriangulation::calculateTriangles(std::vector=0 ? (index-1) : (length-1); + // get the vertex idx bevor idx in relation to the container length + auto getPrev = [](int idx, int length){ + return (idx-1)>=0 ? (idx-1) : (length-1); }; - // get the vertex Index after index in relation to the container lenght - auto getPost = [](int index, int length){ - return (index+1)%length; + // get the vertex idx after idx in relation to the container lenght + auto getPost = [](int idx, int length){ + return (idx+1)%length; }; // return if the vertex is a tip @@ -59,7 +59,7 @@ std::vector IntelliTriangulation::calculateTriangles(std::vector(polyPoints.size())); helper.vertex = polyPoints[static_cast(i)]; - helper.index = i; + helper.idx = i; helper.interiorAngle = calculateInner(polyPoints[static_cast(i)], polyPoints[static_cast(prev)], @@ -72,24 +72,24 @@ std::vector IntelliTriangulation::calculateTriangles(std::vector(Vertices.size())); - int post = getPost(smallest.index, static_cast(Vertices.size())); + int prev = getPrev(smallest.idx, static_cast(Vertices.size())); + int post = getPost(smallest.idx, static_cast(Vertices.size())); // set triangle and push it tri.A = Vertices[static_cast(prev)].vertex; - tri.B = Vertices[static_cast(smallest.index)].vertex; + tri.B = Vertices[static_cast(smallest.idx)].vertex; tri.C = Vertices[static_cast(post)].vertex; Triangles.push_back(tri); // update Vertice array - Vertices.erase(Vertices.begin()+smallest.index); - for(size_t i=static_cast(smallest.index); i(smallest.idx); i(Vertices.size())); diff --git a/src/Layer/PaintingArea.cpp b/src/Layer/PaintingArea.cpp index 0550c0d..bd52fab 100644 --- a/src/Layer/PaintingArea.cpp +++ b/src/Layer/PaintingArea.cpp @@ -71,10 +71,10 @@ int PaintingArea::addLayer(int width, int height, int widthOffset, int heightOff } -void PaintingArea::deleteLayer(int index){ - if(index(layerBundle.size())) { - this->layerBundle.erase(layerBundle.begin()+index); - if(activeLayer>=index && activeLayer != 0) { +void PaintingArea::deleteLayer(int idx){ + if(idx(layerBundle.size())) { + this->layerBundle.erase(layerBundle.begin()+idx); + if(activeLayer>=idx && activeLayer != 0) { activeLayer--; } } @@ -87,15 +87,15 @@ void PaintingArea::slotDeleteActiveLayer(){ } } -void PaintingArea::setLayerActive(int index){ - if(index>=0&&index(layerBundle.size())) { - this->activeLayer=index; +void PaintingArea::setLayerActive(int idx){ + if(idx>=0&&idx(layerBundle.size())) { + this->activeLayer=idx; } } -void PaintingArea::setLayerAlpha(int index, int alpha){ - if(index>=0&&index(layerBundle.size())) { - layerBundle[static_cast(index)].alpha=alpha; +void PaintingArea::setLayerAlpha(int idx, int alpha){ + if(idx>=0&&idx(layerBundle.size())) { + layerBundle[static_cast(idx)].alpha=alpha; } } @@ -119,7 +119,7 @@ bool PaintingArea::save(const QString &filePath, const char*fileFormat){ this->drawLayers(true); if(!strcmp(fileFormat,"PNG")) { - QImage visibleImage = Canvas->convertToFormat(QImage::Format_Indexed8); + QImage visibleImage = Canvas->convertToFormat(QImage::Format_idxed8); fileFormat = "png"; if (visibleImage.save(filePath, fileFormat)) { return true; diff --git a/src/Layer/PaintingArea.h b/src/Layer/PaintingArea.h index 10d9ce2..c996145 100644 --- a/src/Layer/PaintingArea.h +++ b/src/Layer/PaintingArea.h @@ -84,7 +84,7 @@ public: int addLayer(int width, int height, int widthOffset=0, int heightOffset=0, IntelliImage::ImageType type = IntelliImage::ImageType::Raster_Image); /*! * \brief The addLayerAt adds a layer to the current project/ painting area at a specific position in the layer stack - * \param idx - ID of the position the new layer should be added + * \param idx - Index of the position the new layer should be added * \param width - Width of the layer in pixles * \param height - Height of the layer in pixles * \param widthOffset - Offset of the layer measured to the left border of the painting area in pixles @@ -94,21 +94,21 @@ public: */ int addLayerAt(int idx, int width, int height, int widthOffset=0, int heightOffset=0, IntelliImage::ImageType type = IntelliImage::ImageType::Raster_Image); /*! - * \brief The deleteLayer method removes a layer at a given index - * \param index - The index of the layer to be removed + * \brief The deleteLayer method removes a layer at a given idx + * \param idx - The index of the layer to be removed */ - void deleteLayer(int index); + void deleteLayer(int idx); /*! * \brief The setLayerToActive method marks a specific layer as active - * \param index - Index of the layer to be active + * \param idx - The index of the layer to be active */ - void setLayerActive(int index); + void setLayerActive(int idx); /*! * \brief The setAlphaOfLayer method sets the alpha value of a specific layer - * \param index - Index of the layer where the change should be applied + * \param idx - The index of the layer where the change should be applied * \param alpha - New alpha value of the layer */ - void setLayerAlpha(int index, int alpha); + void setLayerAlpha(int idx, int alpha); /*! * \brief The floodFill method fills a the active layer with a given color * \param r - Red value of the color the layer should be filled with @@ -125,7 +125,7 @@ public: void movePositionActive(int x, int y); /*! * \brief The moveActiveLayer moves the active layer to a specific position in the layer stack - * \param idx - The id of the new position the layer should be in + * \param idx - The index of the new position the layer should be in */ void moveActiveLayer(int idx); @@ -178,7 +178,7 @@ public slots: // Events to handle /*! * \brief The slotActivateLayer method handles the event of selecting one layer as active - * \param a - Index of the layer to be active + * \param a - idx of the layer to be active */ void slotActivateLayer(int a); /*! From 37b8642497ba1d924c70ca91b4a3acdb4d912d0c Mon Sep 17 00:00:00 2001 From: Conrad Date: Thu, 9 Jan 2020 10:13:58 +0100 Subject: [PATCH 29/44] Fixed a bug where the index variable rename went wrong --- src/Layer/PaintingArea.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Layer/PaintingArea.cpp b/src/Layer/PaintingArea.cpp index bd52fab..e1113b2 100644 --- a/src/Layer/PaintingArea.cpp +++ b/src/Layer/PaintingArea.cpp @@ -119,7 +119,7 @@ bool PaintingArea::save(const QString &filePath, const char*fileFormat){ this->drawLayers(true); if(!strcmp(fileFormat,"PNG")) { - QImage visibleImage = Canvas->convertToFormat(QImage::Format_idxed8); + QImage visibleImage = Canvas->convertToFormat(QImage::Format_Indexed8); fileFormat = "png"; if (visibleImage.save(filePath, fileFormat)) { return true; From ee64fa69970f0036c5dcae50c19cef837f61582f Mon Sep 17 00:00:00 2001 From: Conrad Date: Thu, 9 Jan 2020 10:15:02 +0100 Subject: [PATCH 30/44] Unified ENUM Names --- src/Image/IntelliImage.h | 4 ++-- src/Image/IntelliRasterImage.cpp | 4 ++-- src/Image/IntelliShapedImage.cpp | 4 ++-- src/Layer/PaintingArea.cpp | 8 ++++---- src/Layer/PaintingArea.h | 4 ++-- src/Tool/IntelliToolPolygon.cpp | 4 ++-- 6 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/Image/IntelliImage.h b/src/Image/IntelliImage.h index 06edc4b..4d527cf 100644 --- a/src/Image/IntelliImage.h +++ b/src/Image/IntelliImage.h @@ -24,8 +24,8 @@ public: * \brief The Types, which an Image can be. */ enum class ImageType { - Raster_Image, - Shaped_Image + RASTERIMAGE, + SHAPEDIMAGE }; protected: diff --git a/src/Image/IntelliRasterImage.cpp b/src/Image/IntelliRasterImage.cpp index 8e8f918..cf141bd 100644 --- a/src/Image/IntelliRasterImage.cpp +++ b/src/Image/IntelliRasterImage.cpp @@ -5,7 +5,7 @@ IntelliRasterImage::IntelliRasterImage(int weight, int height) : IntelliImage(weight, height){ - TypeOfImage = IntelliImage::ImageType::Raster_Image; + TypeOfImage = IntelliImage::ImageType::RASTERIMAGE; } IntelliRasterImage::~IntelliRasterImage(){ @@ -15,7 +15,7 @@ IntelliRasterImage::~IntelliRasterImage(){ IntelliImage* IntelliRasterImage::getDeepCopy(){ IntelliRasterImage* raster = new IntelliRasterImage(imageData.width(), imageData.height()); raster->imageData.fill(Qt::transparent); - raster->TypeOfImage = IntelliImage::ImageType::Raster_Image; + raster->TypeOfImage = IntelliImage::ImageType::RASTERIMAGE; return raster; } diff --git a/src/Image/IntelliShapedImage.cpp b/src/Image/IntelliShapedImage.cpp index 3bf94d5..4fd7502 100644 --- a/src/Image/IntelliShapedImage.cpp +++ b/src/Image/IntelliShapedImage.cpp @@ -6,7 +6,7 @@ IntelliShapedImage::IntelliShapedImage(int weight, int height) : IntelliRasterImage(weight, height){ - TypeOfImage = IntelliImage::ImageType::Shaped_Image; + TypeOfImage = IntelliImage::ImageType::SHAPEDIMAGE; } IntelliShapedImage::~IntelliShapedImage(){ @@ -21,7 +21,7 @@ IntelliImage* IntelliShapedImage::getDeepCopy(){ IntelliShapedImage* shaped = new IntelliShapedImage(imageData.width(), imageData.height()); shaped->setPolygon(this->polygonData); shaped->imageData.fill(Qt::transparent); - shaped->TypeOfImage = IntelliImage::ImageType::Shaped_Image; + shaped->TypeOfImage = IntelliImage::ImageType::SHAPEDIMAGE; return shaped; } diff --git a/src/Layer/PaintingArea.cpp b/src/Layer/PaintingArea.cpp index e1113b2..6daf7c1 100644 --- a/src/Layer/PaintingArea.cpp +++ b/src/Layer/PaintingArea.cpp @@ -22,7 +22,7 @@ PaintingArea::PaintingArea(int maxWidth, int maxHeight, QWidget*parent) : QWidget(parent){ this->Tool = nullptr; this->setLayerDimensions(maxWidth, maxHeight); - this->addLayer(200,200,0,0,IntelliImage::ImageType::Shaped_Image); + this->addLayer(200,200,0,0,IntelliImage::ImageType::SHAPEDIMAGE); layerBundle[0].image->drawPlain(QColor(0,0,255,255)); std::vector polygon; polygon.push_back(QPoint(100,000)); @@ -31,7 +31,7 @@ PaintingArea::PaintingArea(int maxWidth, int maxHeight, QWidget*parent) polygon.push_back(QPoint(000,100)); layerBundle[0].image->setPolygon(polygon); - this->addLayer(200,200,150,150,IntelliImage::ImageType::Raster_Image); + this->addLayer(200,200,150,150,IntelliImage::ImageType::RASTERIMAGE); layerBundle[1].image->drawPlain(QColor(0,255,0,255)); layerBundle[1].alpha=200; @@ -59,9 +59,9 @@ int PaintingArea::addLayer(int width, int height, int widthOffset, int heightOff newLayer.height = height; newLayer.widthOffset = widthOffset; newLayer.heightOffset = heightOffset; - if(type==IntelliImage::ImageType::Raster_Image) { + if(type==IntelliImage::ImageType::RASTERIMAGE) { newLayer.image = new IntelliRasterImage(width,height); - }else if(type==IntelliImage::ImageType::Shaped_Image) { + }else if(type==IntelliImage::ImageType::SHAPEDIMAGE) { newLayer.image = new IntelliShapedImage(width, height); } newLayer.alpha = 255; diff --git a/src/Layer/PaintingArea.h b/src/Layer/PaintingArea.h index c996145..31b3916 100644 --- a/src/Layer/PaintingArea.h +++ b/src/Layer/PaintingArea.h @@ -81,7 +81,7 @@ public: * \param type - Defining the ImageType of the new layer * \return Returns the number of layers in the project */ - int addLayer(int width, int height, int widthOffset=0, int heightOffset=0, IntelliImage::ImageType type = IntelliImage::ImageType::Raster_Image); + int addLayer(int width, int height, int widthOffset=0, int heightOffset=0, IntelliImage::ImageType type = IntelliImage::ImageType::RASTERIMAGE); /*! * \brief The addLayerAt adds a layer to the current project/ painting area at a specific position in the layer stack * \param idx - Index of the position the new layer should be added @@ -92,7 +92,7 @@ public: * \param type - Defining the ImageType of the new layer * \return Returns the id of the layer position */ - int addLayerAt(int idx, int width, int height, int widthOffset=0, int heightOffset=0, IntelliImage::ImageType type = IntelliImage::ImageType::Raster_Image); + int addLayerAt(int idx, int width, int height, int widthOffset=0, int heightOffset=0, IntelliImage::ImageType type = IntelliImage::ImageType::RASTERIMAGE); /*! * \brief The deleteLayer method removes a layer at a given idx * \param idx - The index of the layer to be removed diff --git a/src/Tool/IntelliToolPolygon.cpp b/src/Tool/IntelliToolPolygon.cpp index 28dfd31..ae8b55e 100644 --- a/src/Tool/IntelliToolPolygon.cpp +++ b/src/Tool/IntelliToolPolygon.cpp @@ -19,12 +19,12 @@ IntelliToolPolygon::~IntelliToolPolygon(){ } void IntelliToolPolygon::onMouseLeftPressed(int x, int y){ - if(!isDrawing && Area->getTypeOfImageRealLayer() == IntelliImage::ImageType::Shaped_Image && x > 0 && y > 0 && xgetWidthOfActive() && ygetHeightOfActive()){ + if(!isDrawing && Area->getTypeOfImageRealLayer() == IntelliImage::ImageType::SHAPEDIMAGE && x > 0 && y > 0 && xgetWidthOfActive() && ygetHeightOfActive()){ std::vector Triangles = IntelliTriangulation::calculateTriangles(Area->getPolygonDataOfRealLayer()); QPoint Point(x,y); isInside = IntelliTriangulation::isInPolygon(Triangles,Point); } - else if(!isDrawing && Area->getTypeOfImageRealLayer() == IntelliImage::ImageType::Raster_Image && x > 0 && y > 0 && xgetWidthOfActive() && ygetHeightOfActive()){ + else if(!isDrawing && Area->getTypeOfImageRealLayer() == IntelliImage::ImageType::RASTERIMAGE && x > 0 && y > 0 && xgetWidthOfActive() && ygetHeightOfActive()){ isInside = true; } From d4313e29a050df13140457a97bede8c4ea6eb722 Mon Sep 17 00:00:00 2001 From: Conrad Date: Thu, 9 Jan 2020 10:18:28 +0100 Subject: [PATCH 31/44] Ran Uncrustify Again --- src/GUI/IntelliPhotoGui.cpp | 362 ++++++++++---------- src/Image/IntelliImage.cpp | 4 +- src/Image/IntelliImage.h | 6 +- src/Image/IntelliRasterImage.cpp | 4 +- src/Image/IntelliShapedImage.cpp | 4 +- src/IntelliHelper/IntelliRenderSettings.cpp | 2 +- src/IntelliHelper/IntelliRenderSettings.h | 14 +- src/IntelliHelper/IntelliToolsettings.cpp | 44 +-- src/IntelliHelper/IntelliToolsettings.h | 38 +- src/IntelliHelper/IntelliTriangulation.cpp | 8 +- src/IntelliHelper/IntelliTriangulation.h | 6 +- src/Layer/PaintingArea.cpp | 158 ++++----- src/Tool/IntelliTool.cpp | 12 +- src/Tool/IntelliTool.h | 18 +- src/Tool/IntelliToolCircle.cpp | 32 +- src/Tool/IntelliToolFloodFill.cpp | 6 +- src/Tool/IntelliToolLine.cpp | 20 +- src/Tool/IntelliToolPen.cpp | 12 +- src/Tool/IntelliToolPlain.cpp | 6 +- src/Tool/IntelliToolPolygon.cpp | 74 ++-- src/Tool/IntelliToolRectangle.cpp | 26 +- 21 files changed, 428 insertions(+), 428 deletions(-) diff --git a/src/GUI/IntelliPhotoGui.cpp b/src/GUI/IntelliPhotoGui.cpp index 6fb1e81..283f7fb 100644 --- a/src/GUI/IntelliPhotoGui.cpp +++ b/src/GUI/IntelliPhotoGui.cpp @@ -16,7 +16,7 @@ IntelliPhotoGui::IntelliPhotoGui(){ // Size the app resize(600,600); showMaximized(); - setDefaultToolValue(); + setDefaultToolValue(); } // User tried to close the app @@ -81,7 +81,7 @@ void IntelliPhotoGui::slotCreateNewLayer(){ if (ok1&&ok2) { int layer = paintingArea->addLayer(width,height,0,0); - UpdateGui(); + UpdateGui(); } } @@ -95,12 +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:"), - paintingArea->getNumberOfActiveLayer(),0, 500, 1, &ok); + paintingArea->getNumberOfActiveLayer(),0, 500, 1, &ok); // Create New Layer - if (ok){ + if (ok) { paintingArea->deleteLayer(layerNumber); - UpdateGui(); - } + UpdateGui(); + } } void IntelliPhotoGui::slotSetActiveAlpha(){ @@ -120,7 +120,7 @@ void IntelliPhotoGui::slotSetActiveAlpha(){ if (ok1&&ok2) { paintingArea->setLayerAlpha(layer,alpha); - UpdateGui(); + UpdateGui(); } } @@ -179,7 +179,7 @@ void IntelliPhotoGui::slotClearActiveLayer(){ if (ok1&&ok2&&ok3&&ok4) { paintingArea->floodFill(red, green, blue, alpha); - UpdateGui(); + UpdateGui(); } } @@ -196,57 +196,57 @@ void IntelliPhotoGui::slotSetActiveLayer(){ if (ok1) { paintingArea->setLayerActive(layer); - UpdateGui(); + UpdateGui(); } } void IntelliPhotoGui::slotSetFirstColor(){ paintingArea->colorPickerSetFirstColor(); - UpdateGui(); + UpdateGui(); } void IntelliPhotoGui::slotSetSecondColor(){ paintingArea->colorPickerSetSecondColor(); - UpdateGui(); + UpdateGui(); } void IntelliPhotoGui::slotSwapColor(){ paintingArea->colorPickerSwapColors(); - UpdateGui(); + UpdateGui(); } void IntelliPhotoGui::slotCreatePenTool(){ - PenButton->setChecked(true); + PenButton->setChecked(true); paintingArea->createPenTool(); } void IntelliPhotoGui::slotCreatePlainTool(){ - PlainButton->setChecked(true); + PlainButton->setChecked(true); paintingArea->createPlainTool(); } void IntelliPhotoGui::slotCreateLineTool(){ - LineButton->setChecked(true); + LineButton->setChecked(true); paintingArea->createLineTool(); } void IntelliPhotoGui::slotCreateRectangleTool(){ - RectangleButton->setChecked(true); + RectangleButton->setChecked(true); paintingArea->createRectangleTool(); } void IntelliPhotoGui::slotCreateCircleTool(){ - CircleButton->setChecked(true); + CircleButton->setChecked(true); paintingArea->createCircleTool(); } void IntelliPhotoGui::slotCreatePolygonTool(){ - PolygonButton->setChecked(true); + PolygonButton->setChecked(true); paintingArea->createPolygonTool(); } void IntelliPhotoGui::slotCreateFloodFillTool(){ - FloodFillButton->setChecked(true); + FloodFillButton->setChecked(true); paintingArea->createFloodFillTool(); } @@ -258,26 +258,26 @@ void IntelliPhotoGui::slotAboutDialog(){ } 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()); + 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); + 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 @@ -359,45 +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())); + 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())); + 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())); + 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(slotResetTools())); connect(actionCreatePlainTool, SIGNAL(triggered()), this, SLOT(slotCreatePlainTool())); actionCreatePenTool = new QAction(tr("&Pen"),this); - connect(actionCreatePenTool, SIGNAL(triggered()), this, SLOT(slotResetTools())); - 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(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(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(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(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(slotResetTools())); connect(actionCreateFloodFillTool, SIGNAL(triggered()), this, SLOT(slotCreateFloodFillTool())); // Create about action and tie to IntelliPhotoGui::about() @@ -408,29 +408,29 @@ void IntelliPhotoGui::createActions(){ 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(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(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(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(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(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(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(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())); + connect(RectangleButton,SIGNAL(pressed()), this, SLOT(slotResetTools())); + connect(RectangleButton, SIGNAL(clicked()), this, SLOT(slotCreateRectangleTool())); } // Create the menubar @@ -472,12 +472,12 @@ void IntelliPhotoGui::createMenus(){ //Attach all Tool Options toolMenu = new QMenu(tr("&Tools"), this); - toolMenu->addAction(actionCreateCircleTool); - toolMenu->addAction(actionCreateFloodFillTool); - toolMenu->addAction(actionCreateLineTool); + toolMenu->addAction(actionCreateCircleTool); + toolMenu->addAction(actionCreateFloodFillTool); + toolMenu->addAction(actionCreateLineTool); toolMenu->addAction(actionCreatePenTool); toolMenu->addAction(actionCreatePlainTool); - toolMenu->addAction(actionCreatePolygonTool); + toolMenu->addAction(actionCreatePolygonTool); toolMenu->addAction(actionCreateRectangleTool); toolMenu->addSeparator(); toolMenu->addMenu(colorMenu); @@ -506,137 +506,137 @@ void IntelliPhotoGui::createGui(){ // create Gui elements paintingArea = new PaintingArea(); - paintingArea->DumpyGui = this; + 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/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/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/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/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/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/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); + 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); + 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); + 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); + 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); + 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); + FirstColorButton = new QPushButton(); + FirstColorButton->setFixedSize(Buttonsize/2); - SecondColorButton = new QPushButton(); - SecondColorButton->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)); + 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); + 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()); + p = p.fromImage(paintingArea->getImageOfActiveLayer()->getImageData()); - ActiveLayerImageButton = new QPushButton(); - ActiveLayerImageButton->setFixedSize(Buttonsize); - ActiveLayerImageButton->setIcon(p); - ActiveLayerImageButton->setIconSize(Buttonsize); + ActiveLayerImageButton = new QPushButton(); + ActiveLayerImageButton->setFixedSize(Buttonsize); + ActiveLayerImageButton->setIcon(p); + ActiveLayerImageButton->setIconSize(Buttonsize); // set gui elements - 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); + 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); + 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(){ @@ -688,18 +688,18 @@ bool IntelliPhotoGui::saveFile(const QByteArray &fileFormat){ } void IntelliPhotoGui::setDefaultToolValue(){ - slotEnterPressed(); + 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); + 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); + 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/Image/IntelliImage.cpp b/src/Image/IntelliImage.cpp index 48deb91..c7edd6b 100644 --- a/src/Image/IntelliImage.cpp +++ b/src/Image/IntelliImage.cpp @@ -17,7 +17,7 @@ bool IntelliImage::loadImage(const QString &filePath){ QImage loadedImage; // If the image wasn't loaded leave this function - if (!loadedImage.load(filePath)) + if (!loadedImage.load(filePath)) return false; // scaled Image to size of Layer @@ -83,5 +83,5 @@ QColor IntelliImage::getPixelColor(QPoint& point){ } QImage IntelliImage::getImageData(){ - return imageData; + return imageData; } diff --git a/src/Image/IntelliImage.h b/src/Image/IntelliImage.h index 4d527cf..c8b26cc 100644 --- a/src/Image/IntelliImage.h +++ b/src/Image/IntelliImage.h @@ -24,8 +24,8 @@ public: * \brief The Types, which an Image can be. */ enum class ImageType { - RASTERIMAGE, - SHAPEDIMAGE + RASTERIMAGE, + SHAPEDIMAGE }; protected: @@ -125,7 +125,7 @@ virtual std::vector getPolygonData(){ } virtual ImageType getTypeOfImage(){ - return TypeOfImage; + return TypeOfImage; } /*! diff --git a/src/Image/IntelliRasterImage.cpp b/src/Image/IntelliRasterImage.cpp index cf141bd..ad0f935 100644 --- a/src/Image/IntelliRasterImage.cpp +++ b/src/Image/IntelliRasterImage.cpp @@ -5,7 +5,7 @@ IntelliRasterImage::IntelliRasterImage(int weight, int height) : IntelliImage(weight, height){ - TypeOfImage = IntelliImage::ImageType::RASTERIMAGE; + TypeOfImage = IntelliImage::ImageType::RASTERIMAGE; } IntelliRasterImage::~IntelliRasterImage(){ @@ -15,7 +15,7 @@ IntelliRasterImage::~IntelliRasterImage(){ IntelliImage* IntelliRasterImage::getDeepCopy(){ IntelliRasterImage* raster = new IntelliRasterImage(imageData.width(), imageData.height()); raster->imageData.fill(Qt::transparent); - raster->TypeOfImage = IntelliImage::ImageType::RASTERIMAGE; + raster->TypeOfImage = IntelliImage::ImageType::RASTERIMAGE; return raster; } diff --git a/src/Image/IntelliShapedImage.cpp b/src/Image/IntelliShapedImage.cpp index 4fd7502..e5ddf4e 100644 --- a/src/Image/IntelliShapedImage.cpp +++ b/src/Image/IntelliShapedImage.cpp @@ -6,7 +6,7 @@ IntelliShapedImage::IntelliShapedImage(int weight, int height) : IntelliRasterImage(weight, height){ - TypeOfImage = IntelliImage::ImageType::SHAPEDIMAGE; + TypeOfImage = IntelliImage::ImageType::SHAPEDIMAGE; } IntelliShapedImage::~IntelliShapedImage(){ @@ -21,7 +21,7 @@ IntelliImage* IntelliShapedImage::getDeepCopy(){ IntelliShapedImage* shaped = new IntelliShapedImage(imageData.width(), imageData.height()); shaped->setPolygon(this->polygonData); shaped->imageData.fill(Qt::transparent); - shaped->TypeOfImage = IntelliImage::ImageType::SHAPEDIMAGE; + shaped->TypeOfImage = IntelliImage::ImageType::SHAPEDIMAGE; return shaped; } diff --git a/src/IntelliHelper/IntelliRenderSettings.cpp b/src/IntelliHelper/IntelliRenderSettings.cpp index 5673a2a..3424bb6 100644 --- a/src/IntelliHelper/IntelliRenderSettings.cpp +++ b/src/IntelliHelper/IntelliRenderSettings.cpp @@ -6,5 +6,5 @@ IntelliRenderSettings::IntelliRenderSettings() } bool IntelliRenderSettings::getFastRenderer(){ - return fastRenderer; + return fastRenderer; } diff --git a/src/IntelliHelper/IntelliRenderSettings.h b/src/IntelliHelper/IntelliRenderSettings.h index 5763bb0..e932435 100644 --- a/src/IntelliHelper/IntelliRenderSettings.h +++ b/src/IntelliHelper/IntelliRenderSettings.h @@ -5,16 +5,16 @@ class IntelliRenderSettings { public: - IntelliRenderSettings(); +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(); +/*! + * \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; +bool fastRenderer = true; }; #endif // INTELLIRENDERSETTINGS_H diff --git a/src/IntelliHelper/IntelliToolsettings.cpp b/src/IntelliHelper/IntelliToolsettings.cpp index 6f95d1c..7a4219c 100644 --- a/src/IntelliHelper/IntelliToolsettings.cpp +++ b/src/IntelliHelper/IntelliToolsettings.cpp @@ -3,9 +3,9 @@ IntelliToolsettings::IntelliToolsettings() { - lineWidth = 1; - innerAlpha = 255; - Linestyle = LineStyle::SOLID_LINE; + lineWidth = 1; + innerAlpha = 255; + Linestyle = LineStyle::SOLID_LINE; } IntelliToolsettings::~IntelliToolsettings(){ @@ -13,41 +13,41 @@ IntelliToolsettings::~IntelliToolsettings(){ } int IntelliToolsettings::getLineWidth(){ - return lineWidth; + return lineWidth; } void IntelliToolsettings::setLineWidth(){ - lineWidth = QInputDialog::getInt(nullptr,"Line Width Input", "Width",1,1,50,1); + 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; + if(LineWidth < 1) { + LineWidth = 1; + } + else if(LineWidth > 50) { + LineWidth = 50; + } + lineWidth = LineWidth; } int IntelliToolsettings::getInnerAlpha(){ - return this->innerAlpha; + return this->innerAlpha; } void IntelliToolsettings::setInnerAlpha(){ - this->innerAlpha = QInputDialog::getInt(nullptr,"Inner Aplha Input", "Value",0,0,255,1); + 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; + if(innerAlpha < 0) { + innerAlpha = 0; + } + else if(innerAlpha > 255) { + innerAlpha = 255; + } + this->innerAlpha = innerAlpha; } IntelliToolsettings::LineStyle IntelliToolsettings::getLinestyle(){ - return Linestyle; + return Linestyle; } diff --git a/src/IntelliHelper/IntelliToolsettings.h b/src/IntelliHelper/IntelliToolsettings.h index 3907bb1..1a63bbc 100644 --- a/src/IntelliHelper/IntelliToolsettings.h +++ b/src/IntelliHelper/IntelliToolsettings.h @@ -3,27 +3,27 @@ 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(); +/*! + * \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; +int lineWidth; +int innerAlpha; +LineStyle Linestyle; }; #endif // INTELLITOOLSETTINGS_H diff --git a/src/IntelliHelper/IntelliTriangulation.cpp b/src/IntelliHelper/IntelliTriangulation.cpp index 42f44d9..d46288a 100644 --- a/src/IntelliHelper/IntelliTriangulation.cpp +++ b/src/IntelliHelper/IntelliTriangulation.cpp @@ -19,7 +19,7 @@ std::vector IntelliTriangulation::calculateTriangles(std::vector(sqrt(pow(AP.x(),2.)+pow(AP.y(),2.))*sqrt(pow(BP.x(),2.)+pow(BP.y(),2.))); + float absolute = static_cast(sqrt(pow(AP.x(),2.)+pow(AP.y(),2.))*sqrt(pow(BP.x(),2.)+pow(BP.y(),2.))); return acos(topSclar/absolute); }; @@ -46,7 +46,7 @@ std::vector IntelliTriangulation::calculateTriangles(std::vector(angle)<(pi/2.); + return static_cast(angle)<(pi/2.); }; std::vector Vertices; @@ -88,7 +88,7 @@ std::vector IntelliTriangulation::calculateTriangles(std::vector IntelliTriangulation::calculateTriangles(std::vector &triangles, QPoint &point){ for(auto triangle : triangles) { - if(IntelliTriangulation::isInTriangle(triangle, point)) { + if(IntelliTriangulation::isInTriangle(triangle, point)) { return true; } } diff --git a/src/IntelliHelper/IntelliTriangulation.h b/src/IntelliHelper/IntelliTriangulation.h index cbc6024..21ebfa3 100644 --- a/src/IntelliHelper/IntelliTriangulation.h +++ b/src/IntelliHelper/IntelliTriangulation.h @@ -34,9 +34,9 @@ inline bool isInTriangle(Triangle& tri, QPoint& P){ float val1, val2, val3; bool neg, pos; - val1 = IntelliTriangulation::sign(P,tri.A,tri.B); - val2 = IntelliTriangulation::sign(P,tri.B,tri.C); - val3 = IntelliTriangulation::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/Layer/PaintingArea.cpp b/src/Layer/PaintingArea.cpp index 6daf7c1..e55cc33 100644 --- a/src/Layer/PaintingArea.cpp +++ b/src/Layer/PaintingArea.cpp @@ -20,9 +20,9 @@ PaintingArea::PaintingArea(int maxWidth, int maxHeight, QWidget*parent) : QWidget(parent){ - this->Tool = nullptr; - this->setLayerDimensions(maxWidth, maxHeight); - this->addLayer(200,200,0,0,IntelliImage::ImageType::SHAPEDIMAGE); + this->Tool = nullptr; + this->setLayerDimensions(maxWidth, maxHeight); + this->addLayer(200,200,0,0,IntelliImage::ImageType::SHAPEDIMAGE); layerBundle[0].image->drawPlain(QColor(0,0,255,255)); std::vector polygon; polygon.push_back(QPoint(100,000)); @@ -31,7 +31,7 @@ PaintingArea::PaintingArea(int maxWidth, int maxHeight, QWidget*parent) polygon.push_back(QPoint(000,100)); layerBundle[0].image->setPolygon(polygon); - this->addLayer(200,200,150,150,IntelliImage::ImageType::RASTERIMAGE); + this->addLayer(200,200,150,150,IntelliImage::ImageType::RASTERIMAGE); layerBundle[1].image->drawPlain(QColor(0,255,0,255)); layerBundle[1].alpha=200; @@ -59,22 +59,22 @@ int PaintingArea::addLayer(int width, int height, int widthOffset, int heightOff newLayer.height = height; newLayer.widthOffset = widthOffset; newLayer.heightOffset = heightOffset; - if(type==IntelliImage::ImageType::RASTERIMAGE) { + if(type==IntelliImage::ImageType::RASTERIMAGE) { newLayer.image = new IntelliRasterImage(width,height); - }else if(type==IntelliImage::ImageType::SHAPEDIMAGE) { + }else if(type==IntelliImage::ImageType::SHAPEDIMAGE) { newLayer.image = new IntelliShapedImage(width, height); } newLayer.alpha = 255; this->layerBundle.push_back(newLayer); - activeLayer = static_cast(layerBundle.size())-1; - return activeLayer; + activeLayer = static_cast(layerBundle.size())-1; + return activeLayer; } void PaintingArea::deleteLayer(int idx){ if(idx(layerBundle.size())) { this->layerBundle.erase(layerBundle.begin()+idx); - if(activeLayer>=idx && activeLayer != 0) { + if(activeLayer>=idx && activeLayer != 0) { activeLayer--; } } @@ -105,7 +105,7 @@ bool PaintingArea::open(const QString &filePath){ return false; } IntelliImage* active = layerBundle[static_cast(activeLayer)].image; - bool open = active->loadImage(filePath); + bool open = active->loadImage(filePath); active->calculateVisiblity(); update(); return open; @@ -116,19 +116,19 @@ bool PaintingArea::save(const QString &filePath, const char*fileFormat){ if(layerBundle.size()==0) { return false; } - this->drawLayers(true); + this->drawLayers(true); if(!strcmp(fileFormat,"PNG")) { - QImage visibleImage = Canvas->convertToFormat(QImage::Format_Indexed8); + QImage visibleImage = Canvas->convertToFormat(QImage::Format_Indexed8); fileFormat = "png"; - if (visibleImage.save(filePath, fileFormat)) { + if (visibleImage.save(filePath, fileFormat)) { return true; } else { return false; } } - if (Canvas->save(filePath, fileFormat)) { + if (Canvas->save(filePath, fileFormat)) { return true; } else { return false; @@ -146,23 +146,23 @@ void PaintingArea::floodFill(int r, int g, int b, int a){ } void PaintingArea::movePositionActive(int x, int y){ - if(Tool!=nullptr){ - if(Tool->getIsDrawing()){ - IntelliTool* temp = copyActiveTool(); - delete this->Tool; - this->Tool = temp; - } - } - layerBundle[static_cast(activeLayer)].widthOffset += x; + 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; } void PaintingArea::moveActiveLayer(int idx){ - if(Tool->getIsDrawing()){ - IntelliTool* temp = copyActiveTool(); - delete this->Tool; - this->Tool = temp; - } + if(Tool->getIsDrawing()) { + IntelliTool* temp = copyActiveTool(); + delete this->Tool; + this->Tool = temp; + } if(idx==1) { this->selectLayerUp(); }else if(idx==-1) { @@ -171,13 +171,13 @@ void PaintingArea::moveActiveLayer(int idx){ } void PaintingArea::slotActivateLayer(int a){ - if(Tool != nullptr){ - 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); } @@ -199,52 +199,52 @@ void PaintingArea::colorPickerSwapColors(){ void PaintingArea::createPenTool(){ delete this->Tool; - Tool = new IntelliToolPen(this, &colorPicker, &Toolsettings); + Tool = new IntelliToolPen(this, &colorPicker, &Toolsettings); } void PaintingArea::createPlainTool(){ delete this->Tool; - Tool = new IntelliToolPlainTool(this, &colorPicker, &Toolsettings); + Tool = new IntelliToolPlainTool(this, &colorPicker, &Toolsettings); } void PaintingArea::createLineTool(){ delete this->Tool; - Tool = new IntelliToolLine(this, &colorPicker, &Toolsettings); + Tool = new IntelliToolLine(this, &colorPicker, &Toolsettings); } void PaintingArea::createRectangleTool(){ delete this->Tool; - Tool = new IntelliToolRectangle(this, &colorPicker, &Toolsettings); + Tool = new IntelliToolRectangle(this, &colorPicker, &Toolsettings); } void PaintingArea::createCircleTool(){ delete this->Tool; - Tool = new IntelliToolCircle(this, &colorPicker, &Toolsettings); + Tool = new IntelliToolCircle(this, &colorPicker, &Toolsettings); } void PaintingArea::createPolygonTool(){ delete this->Tool; - Tool = new IntelliToolPolygon(this, &colorPicker, &Toolsettings); + Tool = new IntelliToolPolygon(this, &colorPicker, &Toolsettings); } void PaintingArea::createFloodFillTool(){ delete this->Tool; - Tool = new IntelliToolFloodFill(this, &colorPicker, &Toolsettings); + Tool = new IntelliToolFloodFill(this, &colorPicker, &Toolsettings); } int PaintingArea::getWidthOfActive(){ - return this->layerBundle[static_cast(activeLayer)].width; + return this->layerBundle[static_cast(activeLayer)].width; } int PaintingArea::getHeightOfActive(){ - return this->layerBundle[static_cast(activeLayer)].height; + return this->layerBundle[static_cast(activeLayer)].height; } IntelliImage::ImageType PaintingArea::getTypeOfImageRealLayer(){ - return this->layerBundle[static_cast(activeLayer)].image->getTypeOfImage(); + return this->layerBundle[static_cast(activeLayer)].image->getTypeOfImage(); } std::vector PaintingArea::getPolygonDataOfRealLayer(){ - return this->layerBundle[static_cast(activeLayer)].image->getPolygonData(); + return this->layerBundle[static_cast(activeLayer)].image->getPolygonData(); } // If a mouse button is pressed check if it was the @@ -253,8 +253,8 @@ std::vector PaintingArea::getPolygonDataOfRealLayer(){ void PaintingArea::mousePressEvent(QMouseEvent*event){ if(Tool == nullptr) return; - int x = event->x()-layerBundle[static_cast(activeLayer)].widthOffset; - int y = event->y()-layerBundle[static_cast(activeLayer)].heightOffset; + int x = event->x()-layerBundle[static_cast(activeLayer)].widthOffset; + int y = event->y()-layerBundle[static_cast(activeLayer)].heightOffset; if(event->button() == Qt::LeftButton) { Tool->onMouseLeftPressed(x, y); }else if(event->button() == Qt::RightButton) { @@ -269,8 +269,8 @@ void PaintingArea::mousePressEvent(QMouseEvent*event){ void PaintingArea::mouseMoveEvent(QMouseEvent*event){ if(Tool == nullptr) return; - int x = event->x()-layerBundle[static_cast(activeLayer)].widthOffset; - int y = event->y()-layerBundle[static_cast(activeLayer)].heightOffset; + int x = event->x()-layerBundle[static_cast(activeLayer)].widthOffset; + int y = event->y()-layerBundle[static_cast(activeLayer)].heightOffset; Tool->onMouseMoved(x, y); update(); } @@ -279,8 +279,8 @@ void PaintingArea::mouseMoveEvent(QMouseEvent*event){ void PaintingArea::mouseReleaseEvent(QMouseEvent*event){ if(Tool == nullptr) return; - int x = event->x()-layerBundle[static_cast(activeLayer)].widthOffset; - int y = event->y()-layerBundle[static_cast(activeLayer)].heightOffset; + int x = event->x()-layerBundle[static_cast(activeLayer)].widthOffset; + int y = event->y()-layerBundle[static_cast(activeLayer)].heightOffset; if(event->button() == Qt::LeftButton) { Tool->onMouseLeftReleased(x, y); }else if(event->button() == Qt::RightButton) { @@ -290,20 +290,20 @@ void PaintingArea::mouseReleaseEvent(QMouseEvent*event){ } void PaintingArea::wheelEvent(QWheelEvent*event){ - if(this->Tool != nullptr){ - QPoint numDegrees = event->angleDelta() / 8; - if(!numDegrees.isNull()) { - QPoint numSteps = numDegrees / 15; - Tool->onWheelScrolled(numSteps.y()* -1); - } - } + if(this->Tool != nullptr) { + QPoint numDegrees = event->angleDelta() / 8; + if(!numDegrees.isNull()) { + QPoint numSteps = numDegrees / 15; + Tool->onWheelScrolled(numSteps.y()* -1); + } + } } // 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->drawLayers(); + this->drawLayers(); QPainter painter(this); QRect dirtyRec = event->rect(); @@ -323,15 +323,15 @@ void PaintingArea::resizeLayer(QImage*image_res, const QSize &newSize){ } void PaintingArea::selectLayerUp(){ - if(activeLayer!=-1 && static_cast(activeLayer)(activeLayer)], layerBundle[static_cast(activeLayer+1)]); + if(activeLayer!=-1 && static_cast(activeLayer)(activeLayer)], layerBundle[static_cast(activeLayer+1)]); activeLayer++; } } void PaintingArea::selectLayerDown(){ if(activeLayer!=-1 && activeLayer>0) { - std::swap(layerBundle[static_cast(activeLayer)], layerBundle[static_cast(activeLayer-1)]); + std::swap(layerBundle[static_cast(activeLayer)], layerBundle[static_cast(activeLayer-1)]); activeLayer--; } } @@ -375,32 +375,32 @@ void PaintingArea::createTempTopLayer(int idx){ if(idx>=0) { LayerObject newLayer; newLayer.alpha = 255; - newLayer.height = layerBundle[static_cast(idx)].height; - newLayer.width = layerBundle[static_cast(idx)].width; - newLayer.heightOffset = layerBundle[static_cast(idx)].heightOffset; - newLayer.widthOffset = layerBundle[static_cast(idx)].widthOffset; - newLayer.image = layerBundle[static_cast(idx)].image->getDeepCopy(); + newLayer.height = layerBundle[static_cast(idx)].height; + newLayer.width = layerBundle[static_cast(idx)].width; + newLayer.heightOffset = layerBundle[static_cast(idx)].heightOffset; + newLayer.widthOffset = layerBundle[static_cast(idx)].widthOffset; + newLayer.image = layerBundle[static_cast(idx)].image->getDeepCopy(); layerBundle.insert(layerBundle.begin()+idx+1,newLayer); } } IntelliTool* PaintingArea::copyActiveTool(){ - switch(Tool->getTooltype()){ - 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; - } + switch(Tool->getTooltype()) { + 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; + return activeLayer; } IntelliImage* PaintingArea::getImageOfActiveLayer(){ - return layerBundle[activeLayer].image; + return layerBundle[activeLayer].image; } diff --git a/src/Tool/IntelliTool.cpp b/src/Tool/IntelliTool.cpp index e75abdb..91979e3 100644 --- a/src/Tool/IntelliTool.cpp +++ b/src/Tool/IntelliTool.cpp @@ -4,7 +4,7 @@ IntelliTool::IntelliTool(PaintingArea* Area, IntelliColorPicker* colorPicker, IntelliToolsettings* Toolsettings){ this->Area=Area; this->colorPicker=colorPicker; - this->Toolsettings=Toolsettings; + this->Toolsettings=Toolsettings; } @@ -50,8 +50,8 @@ void IntelliTool::onWheelScrolled(int value){ void IntelliTool::createToolLayer(){ Area->createTempTopLayer(Area->activeLayer); - this->activeLayer=&Area->layerBundle[static_cast(Area->activeLayer)]; - this->Canvas=&Area->layerBundle[static_cast(Area->activeLayer+1)]; + this->activeLayer=&Area->layerBundle[static_cast(Area->activeLayer)]; + this->Canvas=&Area->layerBundle[static_cast(Area->activeLayer+1)]; } void IntelliTool::mergeToolLayer(){ @@ -74,7 +74,7 @@ void IntelliTool::mergeToolLayer(){ activeLayer->image->imageData.setPixelColor(x, y, clr_0); } } - Area->DumpyGui->UpdateGui(); + Area->DumpyGui->UpdateGui(); } void IntelliTool::deleteToolLayer(){ @@ -83,9 +83,9 @@ void IntelliTool::deleteToolLayer(){ } IntelliTool::Tooltype IntelliTool::getTooltype(){ - return ActiveType; + return ActiveType; } bool IntelliTool::getIsDrawing(){ - return isDrawing; + return isDrawing; } diff --git a/src/Tool/IntelliTool.h b/src/Tool/IntelliTool.h index ab4028a..4353018 100644 --- a/src/Tool/IntelliTool.h +++ b/src/Tool/IntelliTool.h @@ -13,15 +13,15 @@ class PaintingArea; */ class IntelliTool { public: - enum class Tooltype{ - CIRCLE, - FLOODFILL, - LINE, - PEN, - PLAIN, - POLYGON, - RECTANGLE - }; +enum class Tooltype { + CIRCLE, + FLOODFILL, + LINE, + PEN, + PLAIN, + POLYGON, + RECTANGLE +}; private: /*! * \brief A function that creates a layer to draw on. diff --git a/src/Tool/IntelliToolCircle.cpp b/src/Tool/IntelliToolCircle.cpp index 6d22618..b8e9d59 100644 --- a/src/Tool/IntelliToolCircle.cpp +++ b/src/Tool/IntelliToolCircle.cpp @@ -4,46 +4,46 @@ #include IntelliToolCircle::IntelliToolCircle(PaintingArea* Area, IntelliColorPicker* colorPicker, IntelliToolsettings* Toolsettings) - : IntelliTool(Area, colorPicker, Toolsettings){ - this->ActiveType = Tooltype::CIRCLE; + : IntelliTool(Area, colorPicker, Toolsettings){ + this->ActiveType = Tooltype::CIRCLE; } IntelliToolCircle::~IntelliToolCircle(){ - IntelliTool::onMouseRightPressed(0,0); + IntelliTool::onMouseRightPressed(0,0); } void IntelliToolCircle::drawCircle(int radius){ int outer = radius+20; QColor inner = this->colorPicker->getSecondColor(); - inner.setAlpha(Toolsettings->getInnerAlpha()); + inner.setAlpha(Toolsettings->getInnerAlpha()); int yMin, yMax, xMin, xMax; yMin = centerPoint.y()-radius; yMax = centerPoint.y()+radius; // x = x0+-sqrt(r2-(y-y0)2) 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))); + 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->drawLine(QPoint(xMin,i), QPoint(xMax,i),inner,1); } //TODO implement circle drawing algorithm bresenham - radius = static_cast(radius +(Toolsettings->getLineWidth()/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(),Toolsettings->getLineWidth()); - this->Canvas->image->drawPoint(QPoint(xMax,i), colorPicker->getFirstColor(),Toolsettings->getLineWidth()); + 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(),Toolsettings->getLineWidth()); + this->Canvas->image->drawPoint(QPoint(xMax,i), colorPicker->getFirstColor(),Toolsettings->getLineWidth()); } xMin = (centerPoint.x()-radius); xMax = (centerPoint.x()+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(),Toolsettings->getLineWidth()); - this->Canvas->image->drawPoint(QPoint(i, yMax), colorPicker->getFirstColor(),Toolsettings->getLineWidth()); + 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(),Toolsettings->getLineWidth()); + this->Canvas->image->drawPoint(QPoint(i, yMax), colorPicker->getFirstColor(),Toolsettings->getLineWidth()); } } @@ -69,7 +69,7 @@ void IntelliToolCircle::onMouseLeftReleased(int x, int y){ void IntelliToolCircle::onWheelScrolled(int value){ IntelliTool::onWheelScrolled(value); - Toolsettings->setLineWidth(Toolsettings->getLineWidth()+value); + Toolsettings->setLineWidth(Toolsettings->getLineWidth()+value); } void IntelliToolCircle::onMouseMoved(int x, int y){ diff --git a/src/Tool/IntelliToolFloodFill.cpp b/src/Tool/IntelliToolFloodFill.cpp index ed14009..cb135f8 100644 --- a/src/Tool/IntelliToolFloodFill.cpp +++ b/src/Tool/IntelliToolFloodFill.cpp @@ -6,12 +6,12 @@ #include IntelliToolFloodFill::IntelliToolFloodFill(PaintingArea* Area, IntelliColorPicker* colorPicker, IntelliToolsettings* Toolsettings) - : IntelliTool(Area, colorPicker, Toolsettings){ - this->ActiveType = Tooltype::FLOODFILL; + : IntelliTool(Area, colorPicker, Toolsettings){ + this->ActiveType = Tooltype::FLOODFILL; } IntelliToolFloodFill::~IntelliToolFloodFill(){ - IntelliTool::onMouseRightPressed(0,0); + IntelliTool::onMouseRightPressed(0,0); } void IntelliToolFloodFill::onMouseRightPressed(int x, int y){ diff --git a/src/Tool/IntelliToolLine.cpp b/src/Tool/IntelliToolLine.cpp index 0ccd9a1..97daa85 100644 --- a/src/Tool/IntelliToolLine.cpp +++ b/src/Tool/IntelliToolLine.cpp @@ -4,12 +4,12 @@ #include "QInputDialog" IntelliToolLine::IntelliToolLine(PaintingArea* Area, IntelliColorPicker* colorPicker, IntelliToolsettings* Toolsettings) - : IntelliTool(Area, colorPicker, Toolsettings){ - this->ActiveType = Tooltype::LINE; + : IntelliTool(Area, colorPicker, Toolsettings){ + this->ActiveType = Tooltype::LINE; } IntelliToolLine::~IntelliToolLine(){ - IntelliTool::onMouseRightPressed(0,0); + IntelliTool::onMouseRightPressed(0,0); } void IntelliToolLine::onMouseRightPressed(int x, int y){ @@ -23,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(),Toolsettings->getLineWidth()); + this->Canvas->image->drawPoint(lineStartingPoint, colorPicker->getFirstColor(),Toolsettings->getLineWidth()); Canvas->image->calculateVisiblity(); } @@ -33,21 +33,21 @@ void IntelliToolLine::onMouseLeftReleased(int x, int y){ void IntelliToolLine::onWheelScrolled(int value){ IntelliTool::onWheelScrolled(value); - Toolsettings->setLineWidth(Toolsettings->getLineWidth()+value); + 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(Toolsettings->getLinestyle()) { - case IntelliToolsettings::LineStyle::SOLID_LINE: - this->Canvas->image->drawLine(lineStartingPoint,next,colorPicker->getFirstColor(),Toolsettings->getLineWidth()); + switch(Toolsettings->getLinestyle()) { + case IntelliToolsettings::LineStyle::SOLID_LINE: + this->Canvas->image->drawLine(lineStartingPoint,next,colorPicker->getFirstColor(),Toolsettings->getLineWidth()); break; - case IntelliToolsettings::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); + int m = static_cast(static_cast(p2.y()-p1.y())/static_cast(p2.x()-p1.x())+0.5f); int c = lineStartingPoint.y()-lineStartingPoint.x()*m; break; diff --git a/src/Tool/IntelliToolPen.cpp b/src/Tool/IntelliToolPen.cpp index 61af1c4..70f2dc3 100644 --- a/src/Tool/IntelliToolPen.cpp +++ b/src/Tool/IntelliToolPen.cpp @@ -5,12 +5,12 @@ #include "QInputDialog" IntelliToolPen::IntelliToolPen(PaintingArea* Area, IntelliColorPicker* colorPicker, IntelliToolsettings* Toolsettings) - : IntelliTool(Area, colorPicker, Toolsettings){ - this->ActiveType = Tooltype::PEN; + : IntelliTool(Area, colorPicker, Toolsettings){ + this->ActiveType = Tooltype::PEN; } IntelliToolPen::~IntelliToolPen(){ - IntelliTool::onMouseRightPressed(0,0); + IntelliTool::onMouseRightPressed(0,0); } void IntelliToolPen::onMouseRightPressed(int x, int y){ @@ -24,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(), Toolsettings->getLineWidth()); + this->Canvas->image->drawPoint(previousPoint, colorPicker->getFirstColor(), Toolsettings->getLineWidth()); Canvas->image->calculateVisiblity(); } @@ -35,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(), Toolsettings->getLineWidth()); + this->Canvas->image->drawLine(this->previousPoint, newPoint, colorPicker->getFirstColor(), Toolsettings->getLineWidth()); this->previousPoint=newPoint; } IntelliTool::onMouseMoved(x,y); @@ -43,5 +43,5 @@ void IntelliToolPen::onMouseMoved(int x, int y){ void IntelliToolPen::onWheelScrolled(int value){ IntelliTool::onWheelScrolled(value); - Toolsettings->setLineWidth(Toolsettings->getLineWidth()+value); + Toolsettings->setLineWidth(Toolsettings->getLineWidth()+value); } diff --git a/src/Tool/IntelliToolPlain.cpp b/src/Tool/IntelliToolPlain.cpp index 51984a2..13bce09 100644 --- a/src/Tool/IntelliToolPlain.cpp +++ b/src/Tool/IntelliToolPlain.cpp @@ -3,12 +3,12 @@ #include "QColorDialog" IntelliToolPlainTool::IntelliToolPlainTool(PaintingArea* Area, IntelliColorPicker* colorPicker, IntelliToolsettings* Toolsettings) - : IntelliTool(Area, colorPicker, Toolsettings){ - this->ActiveType = Tooltype::PLAIN; + : IntelliTool(Area, colorPicker, Toolsettings){ + this->ActiveType = Tooltype::PLAIN; } IntelliToolPlainTool::~IntelliToolPlainTool(){ - IntelliTool::onMouseRightPressed(0,0); + IntelliTool::onMouseRightPressed(0,0); } void IntelliToolPlainTool::onMouseLeftPressed(int x, int y){ diff --git a/src/Tool/IntelliToolPolygon.cpp b/src/Tool/IntelliToolPolygon.cpp index ae8b55e..452c2bc 100644 --- a/src/Tool/IntelliToolPolygon.cpp +++ b/src/Tool/IntelliToolPolygon.cpp @@ -5,63 +5,63 @@ #include IntelliToolPolygon::IntelliToolPolygon(PaintingArea* Area, IntelliColorPicker* colorPicker, IntelliToolsettings* Toolsettings) - : IntelliTool(Area, colorPicker, Toolsettings){ + : IntelliTool(Area, colorPicker, Toolsettings){ isPointNearStart = false; isDrawing = false; - isInside = false; - this->ActiveType = Tooltype::POLYGON; + isInside = false; + this->ActiveType = Tooltype::POLYGON; } IntelliToolPolygon::~IntelliToolPolygon(){ - if(isDrawing){ - IntelliTool::onMouseRightPressed(0,0); - } + if(isDrawing) { + IntelliTool::onMouseRightPressed(0,0); + } } void IntelliToolPolygon::onMouseLeftPressed(int x, int y){ - if(!isDrawing && Area->getTypeOfImageRealLayer() == IntelliImage::ImageType::SHAPEDIMAGE && x > 0 && y > 0 && xgetWidthOfActive() && ygetHeightOfActive()){ - std::vector Triangles = IntelliTriangulation::calculateTriangles(Area->getPolygonDataOfRealLayer()); - QPoint Point(x,y); - isInside = IntelliTriangulation::isInPolygon(Triangles,Point); - } - else if(!isDrawing && Area->getTypeOfImageRealLayer() == IntelliImage::ImageType::RASTERIMAGE && x > 0 && y > 0 && xgetWidthOfActive() && ygetHeightOfActive()){ - isInside = true; - } + if(!isDrawing && Area->getTypeOfImageRealLayer() == IntelliImage::ImageType::SHAPEDIMAGE && x > 0 && y > 0 && xgetWidthOfActive() && ygetHeightOfActive()) { + std::vector Triangles = IntelliTriangulation::calculateTriangles(Area->getPolygonDataOfRealLayer()); + QPoint Point(x,y); + isInside = IntelliTriangulation::isInPolygon(Triangles,Point); + } + else if(!isDrawing && Area->getTypeOfImageRealLayer() == IntelliImage::ImageType::RASTERIMAGE && x > 0 && y > 0 && xgetWidthOfActive() && ygetHeightOfActive()) { + isInside = true; + } - if(isInside && !isDrawing) { + if(isInside && !isDrawing) { IntelliTool::onMouseLeftPressed(x,y); QPoint drawingPoint = QPoint(x,y); isDrawing = true; QPointList.push_back(drawingPoint); - this->Canvas->image->drawPoint(QPointList.back(), colorPicker->getFirstColor(), Toolsettings->getLineWidth()); + 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(), Toolsettings->getLineWidth()); - this->Canvas->image->calculateVisiblity(); - } - else{ - isInside = false; - isDrawing = false; - QPointList.clear(); - IntelliTool::onMouseRightPressed(x,y); - } + if(QPointList.size() > 2) { + isPointNearStart = true; + this->Canvas->image->drawLine(QPointList.back(), QPointList.front(), colorPicker->getFirstColor(), Toolsettings->getLineWidth()); + this->Canvas->image->calculateVisiblity(); + } + else{ + isInside = false; + isDrawing = false; + QPointList.clear(); + IntelliTool::onMouseRightPressed(x,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(), Toolsettings->getLineWidth()); + this->Canvas->image->drawLine(QPointList[QPointList.size() - 2], QPointList[QPointList.size() - 1], colorPicker->getFirstColor(), Toolsettings->getLineWidth()); this->Canvas->image->calculateVisiblity(); } } void IntelliToolPolygon::onMouseRightPressed(int x, int y){ - isInside = false; + isInside = false; isDrawing = false; isPointNearStart = false; QPointList.clear(); @@ -69,14 +69,14 @@ void IntelliToolPolygon::onMouseRightPressed(int x, int y){ } void IntelliToolPolygon::onMouseLeftReleased(int x, int y){ - if(isPointNearStart) { - isInside = false; + if(isPointNearStart) { + isInside = false; isPointNearStart = false; isDrawing = false; std::vector Triangles = IntelliTriangulation::calculateTriangles(QPointList); QPoint Point; QColor colorTwo(colorPicker->getSecondColor()); - colorTwo.setAlpha(Toolsettings->getInnerAlpha()); + colorTwo.setAlpha(Toolsettings->getInnerAlpha()); for(int i = 0; i < activeLayer->width; i++) { for(int j = 0; j < activeLayer->height; j++) { Point = QPoint(i,j); @@ -85,9 +85,9 @@ void IntelliToolPolygon::onMouseLeftReleased(int x, int y){ } } } - 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(), Toolsettings->getLineWidth()); + 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(), Toolsettings->getLineWidth()); } QPointList.clear(); IntelliTool::onMouseLeftReleased(x,y); @@ -101,7 +101,7 @@ void IntelliToolPolygon::onMouseRightReleased(int x, int y){ void IntelliToolPolygon::onWheelScrolled(int value){ IntelliTool::onWheelScrolled(value); if(!isDrawing) { - Toolsettings->setLineWidth(Toolsettings->getLineWidth() + value); + Toolsettings->setLineWidth(Toolsettings->getLineWidth() + value); } } @@ -113,7 +113,7 @@ bool IntelliToolPolygon::isNearStart(int x, int y, QPoint Startpoint){ bool isNear = false; int StartX = Startpoint.x(); int StartY = Startpoint.y(); - int valueToNear = 5; + int valueToNear = 5; for(int i = StartX - valueToNear; i < StartX + valueToNear; i++) { for(int j = StartY - valueToNear; j < StartY + valueToNear; j++) { diff --git a/src/Tool/IntelliToolRectangle.cpp b/src/Tool/IntelliToolRectangle.cpp index e92eb10..29fa038 100644 --- a/src/Tool/IntelliToolRectangle.cpp +++ b/src/Tool/IntelliToolRectangle.cpp @@ -3,30 +3,30 @@ #include "QInputDialog" IntelliToolRectangle::IntelliToolRectangle(PaintingArea* Area, IntelliColorPicker* colorPicker, IntelliToolsettings* Toolsettings) - : IntelliTool(Area, colorPicker, Toolsettings){ - this->ActiveType = Tooltype::RECTANGLE; + : IntelliTool(Area, colorPicker, Toolsettings){ + this->ActiveType = Tooltype::RECTANGLE; } IntelliToolRectangle::~IntelliToolRectangle(){ - IntelliTool::onMouseRightPressed(0,0); + IntelliTool::onMouseRightPressed(0,0); } void IntelliToolRectangle::drawRectangle(QPoint otherCorner){ - int xMin = std::min(originCorner.x(), otherCorner.x()); - int xMax = std::max(originCorner.x(), otherCorner.x()); + int xMin = std::min(originCorner.x(), otherCorner.x()); + int xMax = std::max(originCorner.x(), otherCorner.x()); - int yMin = std::min(originCorner.y(), otherCorner.y()); - int yMax = std::max(originCorner.y(), otherCorner.y()); + int yMin = std::min(originCorner.y(), otherCorner.y()); + int yMax = std::max(originCorner.y(), otherCorner.y()); QColor clr = colorPicker->getSecondColor(); - clr.setAlpha(Toolsettings->getInnerAlpha()); + 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(), 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()); + 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){ @@ -59,5 +59,5 @@ void IntelliToolRectangle::onMouseMoved(int x, int y){ void IntelliToolRectangle::onWheelScrolled(int value){ IntelliTool::onWheelScrolled(value); - Toolsettings->setLineWidth(Toolsettings->getLineWidth()+value); + Toolsettings->setLineWidth(Toolsettings->getLineWidth()+value); } From 37e2d62a706677edfbd762c06bc1857f052d45ad Mon Sep 17 00:00:00 2001 From: Conrad Date: Thu, 9 Jan 2020 10:19:15 +0100 Subject: [PATCH 32/44] Added cppcheck errors --- cppcheck_errors.txt | 95 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100644 cppcheck_errors.txt diff --git a/cppcheck_errors.txt b/cppcheck_errors.txt new file mode 100644 index 0000000..dbbc1f3 --- /dev/null +++ b/cppcheck_errors.txt @@ -0,0 +1,95 @@ +src/GUI/IntelliPhotoGui.cpp:83:15: style: Variable 'layer' is assigned a value that is never used. [unreadVariable] + int layer = paintingArea->addLayer(width,height,0,0); + ^ +src/IntelliHelper/IntelliColorPicker.cpp:4:3: performance: Variable 'firstColor' is assigned in constructor body. Consider performing initialization in initialization list. [useInitializationList] + firstColor = {255,0,0,255}; + ^ +src/IntelliHelper/IntelliColorPicker.cpp:5:3: performance: Variable 'secondColor' is assigned in constructor body. Consider performing initialization in initialization list. [useInitializationList] + secondColor = {0,255,255,255}; + ^ +src/IntelliHelper/IntelliTriangulation.cpp:116:63: style: Parameter 'triangles' can be declared with const [constParameter] +bool IntelliTriangulation::isInPolygon(std::vector &triangles, QPoint &point){ + ^ +src/Layer/PaintingArea.cpp:333:22: style: Redundant condition: If 'activeLayer > 0', the comparison 'activeLayer != -1' is always true. [redundantCondition] + if(activeLayer!=-1 && activeLayer>0) { + ^ +src/Tool/IntelliTool.cpp:4:14: warning: Member variable 'IntelliTool::ActiveType' is not initialized in the constructor. [uninitMemberVar] +IntelliTool::IntelliTool(PaintingArea* Area, IntelliColorPicker* colorPicker, IntelliToolsettings* Toolsettings){ + ^ +src/Tool/IntelliTool.cpp:4:14: warning: Member variable 'IntelliTool::activeLayer' is not initialized in the constructor. [uninitMemberVar] +IntelliTool::IntelliTool(PaintingArea* Area, IntelliColorPicker* colorPicker, IntelliToolsettings* Toolsettings){ + ^ +src/Tool/IntelliTool.cpp:4:14: warning: Member variable 'IntelliTool::Canvas' is not initialized in the constructor. [uninitMemberVar] +IntelliTool::IntelliTool(PaintingArea* Area, IntelliColorPicker* colorPicker, IntelliToolsettings* Toolsettings){ + ^ +src/Tool/IntelliToolCircle.cpp:43:9: style: Local variable 'yMin' shadows outer variable [shadowVariable] + int yMin = static_cast(centerPoint.y()-sqrt(pow(radius,2)-pow(i-centerPoint.x(),2))); + ^ +src/Tool/IntelliToolCircle.cpp:19:7: note: Shadowed declaration + int yMin, yMax, xMin, xMax; + ^ +src/Tool/IntelliToolCircle.cpp:43:9: note: Shadow variable + int yMin = static_cast(centerPoint.y()-sqrt(pow(radius,2)-pow(i-centerPoint.x(),2))); + ^ +src/Tool/IntelliToolCircle.cpp:44:9: style: Local variable 'yMax' shadows outer variable [shadowVariable] + int yMax = static_cast(centerPoint.y()+sqrt(pow(radius,2)-pow(i-centerPoint.x(),2))); + ^ +src/Tool/IntelliToolCircle.cpp:19:13: note: Shadowed declaration + int yMin, yMax, xMin, xMax; + ^ +src/Tool/IntelliToolCircle.cpp:44:9: note: Shadow variable + int yMax = static_cast(centerPoint.y()+sqrt(pow(radius,2)-pow(i-centerPoint.x(),2))); + ^ +src/Tool/IntelliToolCircle.cpp:16:13: style: Variable 'outer' is assigned a value that is never used. [unreadVariable] + int outer = radius+20; + ^ +src/Tool/IntelliToolLine.cpp:51:13: style: Variable 'c' is assigned a value that is never used. [unreadVariable] + int c = lineStartingPoint.y()-lineStartingPoint.x()*m; + ^ +src/Tool/IntelliToolPolygon.h:25:6: warning: The class 'IntelliToolPolygon' defines member variable with name 'isDrawing' also defined in its parent class 'IntelliTool'. [duplInheritedMember] +bool isDrawing; + ^ +src/Tool/IntelliTool.h:68:6: note: Parent variable 'IntelliTool::isDrawing' +bool isDrawing = false; + ^ +src/Tool/IntelliToolPolygon.h:25:6: note: Derived variable 'IntelliToolPolygon::isDrawing' +bool isDrawing; + ^ +src/GUI/IntelliPhotoGui.cpp:23:0: style: The function 'closeEvent' is never used. [unusedFunction] + +^ +src/IntelliHelper/IntelliRenderSettings.cpp:8:0: style: The function 'getFastRenderer' is never used. [unusedFunction] + +^ +src/Layer/PaintingArea.cpp:269:0: style: The function 'mouseMoveEvent' is never used. [unusedFunction] + +^ +src/Layer/PaintingArea.cpp:253:0: style: The function 'mousePressEvent' is never used. [unusedFunction] + +^ +src/Layer/PaintingArea.cpp:279:0: style: The function 'mouseReleaseEvent' is never used. [unusedFunction] + +^ +src/Layer/PaintingArea.cpp:305:0: style: The function 'paintEvent' is never used. [unusedFunction] + +^ +src/Layer/PaintingArea.cpp:316:0: style: The function 'resizeEvent' is never used. [unusedFunction] + +^ +src/Layer/PaintingArea.cpp:321:0: style: The function 'resizeLayer' is never used. [unusedFunction] + +^ +src/Layer/PaintingArea.cpp:173:0: style: The function 'slotActivateLayer' is never used. [unusedFunction] + +^ +src/GUI/IntelliPhotoGui.cpp:157:0: style: The function 'slotClearActiveLayer' is never used. [unusedFunction] + +^ +src/Layer/PaintingArea.cpp:83:0: style: The function 'slotDeleteActiveLayer' is never used. [unusedFunction] + +^ +src/Layer/PaintingArea.cpp:292:0: style: The function 'wheelEvent' is never used. [unusedFunction] + +^ +nofile:0:0: information: Cppcheck cannot find all the include files (use --check-config for details) [missingInclude] + From 67b623a63adcbbee53b0d27239acb28adeab5fda Mon Sep 17 00:00:00 2001 From: Jan Schuffenhauer Date: Thu, 9 Jan 2020 10:35:01 +0100 Subject: [PATCH 33/44] bring the fastrenderer back again... hihihi --- src/Image/IntelliImage.cpp | 65 ++++++++++++++++++++++++++------ src/Image/IntelliImage.h | 23 +++++++++-- src/Image/IntelliRasterImage.cpp | 13 +++++-- src/Image/IntelliRasterImage.h | 3 +- src/Image/IntelliShapedImage.cpp | 29 +++++++++++--- src/Image/IntelliShapedImage.h | 3 +- src/Layer/PaintingArea.cpp | 14 ++++--- 7 files changed, 119 insertions(+), 31 deletions(-) diff --git a/src/Image/IntelliImage.cpp b/src/Image/IntelliImage.cpp index 48deb91..ef14700 100644 --- a/src/Image/IntelliImage.cpp +++ b/src/Image/IntelliImage.cpp @@ -2,9 +2,16 @@ #include #include -IntelliImage::IntelliImage(int weight, int height) - : imageData(QSize(weight, height), QImage::Format_ARGB32){ - imageData.fill(QColor(255,255,255,255)); +IntelliImage::IntelliImage(int width, int height, bool fastRendererOn) + : imageData(QSize(width, height), fastRendererOn ? QImage::Format_Indexed8 : QImage::Format_ARGB32){ + if(fastRendererOn){ + imageData = imageData.convertToFormat(QImage::Format_ARGB32); + } + imageData.fill(QColor(255,255,255,255)); + if(fastRendererOn){ + imageData = imageData.convertToFormat(QImage::Format_Indexed8); + } + this->fastRenderer = fastRendererOn; } @@ -23,7 +30,7 @@ bool IntelliImage::loadImage(const QString &filePath){ // scaled Image to size of Layer loadedImage = loadedImage.scaled(imageData.size(),Qt::IgnoreAspectRatio); - imageData = loadedImage.convertToFormat(QImage::Format_ARGB32); + imageData = loadedImage.convertToFormat(fastRenderer ? QImage::Format_Indexed8 : QImage::Format_ARGB32); return true; } @@ -33,17 +40,23 @@ void IntelliImage::resizeImage(QImage*image, const QSize &newSize){ return; // Create a new image to display and fill it with white - QImage newImage(newSize, QImage::Format_ARGB32); + 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; + if(fastRenderer){ + this->imageData = this->imageData.convertToFormat(QImage::Format_Indexed8); + } } void IntelliImage::drawPixel(const QPoint &p1, const QColor& color){ - // Used to draw on the widget + if(fastRenderer){ + this->imageData = this->imageData.convertToFormat(QImage::Format_ARGB32); + } + // Used to draw on the widget QPainter painter(&imageData); // Set the current settings for the pen @@ -51,20 +64,32 @@ void IntelliImage::drawPixel(const QPoint &p1, const QColor& color){ // Draw a line from the last registered point to the current painter.drawPoint(p1); + if(fastRenderer){ + this->imageData = this->imageData.convertToFormat(QImage::Format_Indexed8); + } } void IntelliImage::drawPoint(const QPoint &p1, const QColor& color, const int& penWidth){ - // Used to draw on the widget + if(fastRenderer){ + this->imageData = this->imageData.convertToFormat(QImage::Format_ARGB32); + } + // 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.drawPoint(p1); + if(fastRenderer){ + this->imageData = this->imageData.convertToFormat(QImage::Format_Indexed8); + } } void IntelliImage::drawLine(const QPoint &p1, const QPoint& p2, const QColor& color, const int& penWidth){ - // Used to draw on the widget + if(fastRenderer){ + this->imageData = this->imageData.convertToFormat(QImage::Format_ARGB32); + } + // Used to draw on the widget QPainter painter(&imageData); // Set the current settings for the pen @@ -72,16 +97,34 @@ void IntelliImage::drawLine(const QPoint &p1, const QPoint& p2, const QColor& co // Draw a line from the last registered point to the current painter.drawLine(p1, p2); + if(fastRenderer){ + this->imageData = this->imageData.convertToFormat(QImage::Format_Indexed8); + } } void IntelliImage::drawPlain(const QColor& color){ - imageData.fill(color); + if(fastRenderer){ + this->imageData = this->imageData.convertToFormat(QImage::Format_ARGB32); + } + imageData.fill(color); + if(fastRenderer){ + this->imageData = this->imageData.convertToFormat(QImage::Format_Indexed8); + } } QColor IntelliImage::getPixelColor(QPoint& point){ - return imageData.pixelColor(point); + if(fastRenderer){ + QImage copy = this->imageData.convertToFormat(QImage::Format_ARGB32); + return copy.pixelColor(point); + } + return imageData.pixelColor(point); } QImage IntelliImage::getImageData(){ - return imageData; + return this->imageData; +} + +void IntelliImage::updateRendererSetting(bool fastRendererOn){ + this->fastRenderer = fastRendererOn; + this->imageData = this->imageData.convertToFormat(fastRenderer ? QImage::Format_Indexed8 : QImage::Format_ARGB32); } diff --git a/src/Image/IntelliImage.h b/src/Image/IntelliImage.h index 06edc4b..ff7608d 100644 --- a/src/Image/IntelliImage.h +++ b/src/Image/IntelliImage.h @@ -8,8 +8,8 @@ #include #include -#include "IntelliHelper/IntelliRenderSettings.h" #include "IntelliHelper/IntelliTriangulation.h" +#include "IntelliHelper/IntelliRenderSettings.h" class IntelliTool; @@ -40,13 +40,20 @@ QImage imageData; * \brief The Type, an Image is. */ ImageType TypeOfImage; + +/*! + * \brief fastRenderer is the flag that represents the usage of 8bit pictures. + */ +bool fastRenderer; + public: /*! * \brief The Construcor of the IntelliImage. Given the Image dimensions. * \param width - The width of the Image. * \param height - The height of the Image. + * \param fastRendererOn - Represents the flag for 8bit picture handelling. */ -IntelliImage(int width, int height); +IntelliImage(int width, int height, bool fastRendererOn); /*! * \brief An Abstract Destructor. @@ -142,7 +149,17 @@ virtual bool loadImage(const QString &filePath); */ virtual QColor getPixelColor(QPoint& point); -QImage getImageData(); +/*! + * \brief updateRendererSetting updates the existing image format to the new format. + * \param fastRendererOn flag for the 8bit image handeling. + */ +virtual void updateRendererSetting(bool fastRendererOn); + +/*! + * \brief getImageData returns the data of the current image. + */ +virtual QImage getImageData(); + }; #endif diff --git a/src/Image/IntelliRasterImage.cpp b/src/Image/IntelliRasterImage.cpp index 8e8f918..7e97e55 100644 --- a/src/Image/IntelliRasterImage.cpp +++ b/src/Image/IntelliRasterImage.cpp @@ -3,9 +3,10 @@ #include #include -IntelliRasterImage::IntelliRasterImage(int weight, int height) - : IntelliImage(weight, height){ +IntelliRasterImage::IntelliRasterImage(int width, int height, bool fastRendererOn) + : IntelliImage(width, height, fastRendererOn){ TypeOfImage = IntelliImage::ImageType::Raster_Image; + this->fastRenderer = fastRendererOn; } IntelliRasterImage::~IntelliRasterImage(){ @@ -13,7 +14,7 @@ IntelliRasterImage::~IntelliRasterImage(){ } IntelliImage* IntelliRasterImage::getDeepCopy(){ - IntelliRasterImage* raster = new IntelliRasterImage(imageData.width(), imageData.height()); + IntelliRasterImage* raster = new IntelliRasterImage(imageData.width(), imageData.height(), false); raster->imageData.fill(Qt::transparent); raster->TypeOfImage = IntelliImage::ImageType::Raster_Image; return raster; @@ -29,6 +30,9 @@ QImage IntelliRasterImage::getDisplayable(int alpha){ QImage IntelliRasterImage::getDisplayable(const QSize& displaySize, int alpha){ QImage copy = imageData; + if(fastRenderer){ + copy = copy.convertToFormat(QImage::Format_ARGB32); + } for(int y = 0; y #include -IntelliShapedImage::IntelliShapedImage(int weight, int height) - : IntelliRasterImage(weight, height){ +IntelliShapedImage::IntelliShapedImage(int width, int height, bool fastRendererOn) + : IntelliRasterImage(width, height, fastRendererOn){ TypeOfImage = IntelliImage::ImageType::Shaped_Image; + this->fastRenderer = fastRendererOn; } IntelliShapedImage::~IntelliShapedImage(){ @@ -18,7 +19,7 @@ QImage IntelliShapedImage::getDisplayable(int alpha){ } IntelliImage* IntelliShapedImage::getDeepCopy(){ - IntelliShapedImage* shaped = new IntelliShapedImage(imageData.width(), imageData.height()); + IntelliShapedImage* shaped = new IntelliShapedImage(imageData.width(), imageData.height(), false); shaped->setPolygon(this->polygonData); shaped->imageData.fill(Qt::transparent); shaped->TypeOfImage = IntelliImage::ImageType::Shaped_Image; @@ -26,7 +27,11 @@ IntelliImage* IntelliShapedImage::getDeepCopy(){ } void IntelliShapedImage::calculateVisiblity(){ - if(polygonData.size()<=2) { + if(fastRenderer){ + this->imageData = imageData.convertToFormat(QImage::Format_ARGB32); + } + + if(polygonData.size()<=2) { QColor clr; for(int y=0; yimageData = this->imageData.convertToFormat(QImage::Format_Indexed8); + } return; } QColor clr; @@ -42,7 +50,7 @@ void IntelliShapedImage::calculateVisiblity(){ for(int x=0; ximageData = this->imageData.convertToFormat(QImage::Format_Indexed8); + } } QImage IntelliShapedImage::getDisplayable(const QSize& displaySize, int alpha){ QImage copy = imageData; + if(fastRenderer){ + copy = copy.convertToFormat(QImage::Format_ARGB32); + } for(int y = 0; y& polygonData){ for(auto element:polygonData) { this->polygonData.push_back(QPoint(element.x(), element.y())); } - triangles = IntelliTriangulation::calculateTriangles(polygonData); + triangles = IntelliTriangulation::calculateTriangles(polygonData); } calculateVisiblity(); return; diff --git a/src/Image/IntelliShapedImage.h b/src/Image/IntelliShapedImage.h index 0140aa8..220ad75 100644 --- a/src/Image/IntelliShapedImage.h +++ b/src/Image/IntelliShapedImage.h @@ -30,8 +30,9 @@ public: * \brief The Construcor of the IntelliShapedImage. Given the Image dimensions. * \param width - The width of the Image. * \param height - The height of the Image. + * \param fastRendererOn - Represents the flag for 8bit picture handelling. */ -IntelliShapedImage(int width, int height); +IntelliShapedImage(int width, int height, bool fastRendererOn); /*! * \brief An Destructor. diff --git a/src/Layer/PaintingArea.cpp b/src/Layer/PaintingArea.cpp index 0550c0d..5e47d00 100644 --- a/src/Layer/PaintingArea.cpp +++ b/src/Layer/PaintingArea.cpp @@ -60,9 +60,9 @@ int PaintingArea::addLayer(int width, int height, int widthOffset, int heightOff newLayer.widthOffset = widthOffset; newLayer.heightOffset = heightOffset; if(type==IntelliImage::ImageType::Raster_Image) { - newLayer.image = new IntelliRasterImage(width,height); + newLayer.image = new IntelliRasterImage(width,height,renderSettings.getFastRenderer()); }else if(type==IntelliImage::ImageType::Shaped_Image) { - newLayer.image = new IntelliShapedImage(width, height); + newLayer.image = new IntelliShapedImage(width, height, renderSettings.getFastRenderer()); } newLayer.alpha = 255; this->layerBundle.push_back(newLayer); @@ -158,10 +158,12 @@ void PaintingArea::movePositionActive(int x, int y){ } void PaintingArea::moveActiveLayer(int idx){ - 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(idx==1) { this->selectLayerUp(); From e3b2968f4d0e3501c424f10952289cd45af53fba Mon Sep 17 00:00:00 2001 From: Jan Schuffenhauer Date: Thu, 9 Jan 2020 10:45:54 +0100 Subject: [PATCH 34/44] Fixed Image ENUMs ty --- src/Image/IntelliRasterImage.cpp | 2 +- src/Image/IntelliRasterImage.h | 4 ++-- src/Image/IntelliShapedImage.cpp | 2 +- src/Layer/PaintingArea.cpp | 6 +++--- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/Image/IntelliRasterImage.cpp b/src/Image/IntelliRasterImage.cpp index 717702b..4bd0891 100644 --- a/src/Image/IntelliRasterImage.cpp +++ b/src/Image/IntelliRasterImage.cpp @@ -5,7 +5,7 @@ IntelliRasterImage::IntelliRasterImage(int width, int height, bool fastRendererOn) : IntelliImage(width, height, fastRendererOn){ - TypeOfImage = IntelliImage::ImageType::Raster_Image; + TypeOfImage = IntelliImage::ImageType::RASTERIMAGE; this->fastRenderer = fastRendererOn; } diff --git a/src/Image/IntelliRasterImage.h b/src/Image/IntelliRasterImage.h index 1f7156f..f589843 100644 --- a/src/Image/IntelliRasterImage.h +++ b/src/Image/IntelliRasterImage.h @@ -4,13 +4,13 @@ #include "Image/IntelliImage.h" /*! - * \brief The IntelliRasterImage manages a Rasterimage. + * \brief The IntelliRasterImage manages a RASTERIMAGE. */ class IntelliRasterImage : public IntelliImage { friend IntelliTool; protected: /*! - * \brief A function that calculates the visibility of the image if a polygon is given. [does nothing in Rasterimage] + * \brief A function that calculates the visibility of the image if a polygon is given. [does nothing in RASTERIMAGE] */ virtual void calculateVisiblity() override; public: diff --git a/src/Image/IntelliShapedImage.cpp b/src/Image/IntelliShapedImage.cpp index 15fa543..74e8994 100644 --- a/src/Image/IntelliShapedImage.cpp +++ b/src/Image/IntelliShapedImage.cpp @@ -6,7 +6,7 @@ IntelliShapedImage::IntelliShapedImage(int width, int height, bool fastRendererOn) : IntelliRasterImage(width, height, fastRendererOn){ - TypeOfImage = IntelliImage::ImageType::Shaped_Image; + TypeOfImage = IntelliImage::ImageType::SHAPEDIMAGE; this->fastRenderer = fastRendererOn; } diff --git a/src/Layer/PaintingArea.cpp b/src/Layer/PaintingArea.cpp index d2be570..2258376 100644 --- a/src/Layer/PaintingArea.cpp +++ b/src/Layer/PaintingArea.cpp @@ -31,7 +31,7 @@ PaintingArea::PaintingArea(int maxWidth, int maxHeight, QWidget*parent) polygon.push_back(QPoint(000,100)); layerBundle[0].image->setPolygon(polygon); - this->addLayer(200,200,150,150,IntelliImage::ImageType::RASTERIMAGE); + this->addLayer(200,200,150,150,IntelliImage::ImageType::RASTERIMAGE); layerBundle[1].image->drawPlain(QColor(0,255,0,255)); layerBundle[1].alpha=200; @@ -59,9 +59,9 @@ int PaintingArea::addLayer(int width, int height, int widthOffset, int heightOff newLayer.height = height; newLayer.widthOffset = widthOffset; newLayer.heightOffset = heightOffset; - if(type==IntelliImage::ImageType::Raster_Image) { + if(type==IntelliImage::ImageType::RASTERIMAGE) { newLayer.image = new IntelliRasterImage(width,height,renderSettings.getFastRenderer()); - }else if(type==IntelliImage::ImageType::Shaped_Image) { + }else if(type==IntelliImage::ImageType::SHAPEDIMAGE) { newLayer.image = new IntelliShapedImage(width, height, renderSettings.getFastRenderer()); } newLayer.alpha = 255; From 624eb0fde6b1ffd19139ca85111f8106ceec8efd Mon Sep 17 00:00:00 2001 From: Conrad Date: Thu, 9 Jan 2020 11:35:36 +0100 Subject: [PATCH 35/44] Uncrustify all .cpp files --- src/Image/IntelliImage.cpp | 100 +++++++++++++++---------------- src/Image/IntelliRasterImage.cpp | 20 +++---- src/Image/IntelliShapedImage.cpp | 44 +++++++------- src/Layer/PaintingArea.cpp | 24 ++++---- 4 files changed, 94 insertions(+), 94 deletions(-) diff --git a/src/Image/IntelliImage.cpp b/src/Image/IntelliImage.cpp index 4e97513..576a93d 100644 --- a/src/Image/IntelliImage.cpp +++ b/src/Image/IntelliImage.cpp @@ -3,15 +3,15 @@ #include IntelliImage::IntelliImage(int width, int height, bool fastRendererOn) - : imageData(QSize(width, height), fastRendererOn ? QImage::Format_Indexed8 : QImage::Format_ARGB32){ - if(fastRendererOn){ - imageData = imageData.convertToFormat(QImage::Format_ARGB32); - } - imageData.fill(QColor(255,255,255,255)); - if(fastRendererOn){ - imageData = imageData.convertToFormat(QImage::Format_Indexed8); - } - this->fastRenderer = fastRendererOn; + : imageData(QSize(width, height), fastRendererOn ? QImage::Format_Indexed8 : QImage::Format_ARGB32){ + if(fastRendererOn) { + imageData = imageData.convertToFormat(QImage::Format_ARGB32); + } + imageData.fill(QColor(255,255,255,255)); + if(fastRendererOn) { + imageData = imageData.convertToFormat(QImage::Format_Indexed8); + } + this->fastRenderer = fastRendererOn; } @@ -30,7 +30,7 @@ bool IntelliImage::loadImage(const QString &filePath){ // scaled Image to size of Layer loadedImage = loadedImage.scaled(imageData.size(),Qt::IgnoreAspectRatio); - imageData = loadedImage.convertToFormat(fastRenderer ? QImage::Format_Indexed8 : QImage::Format_ARGB32); + imageData = loadedImage.convertToFormat(fastRenderer ? QImage::Format_Indexed8 : QImage::Format_ARGB32); return true; } @@ -40,23 +40,23 @@ void IntelliImage::resizeImage(QImage*image, const QSize &newSize){ return; // Create a new image to display and fill it with white - QImage newImage(newSize, QImage::Format_ARGB32); + 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; - if(fastRenderer){ - this->imageData = this->imageData.convertToFormat(QImage::Format_Indexed8); - } + if(fastRenderer) { + this->imageData = this->imageData.convertToFormat(QImage::Format_Indexed8); + } } void IntelliImage::drawPixel(const QPoint &p1, const QColor& color){ - if(fastRenderer){ - this->imageData = this->imageData.convertToFormat(QImage::Format_ARGB32); - } - // Used to draw on the widget + if(fastRenderer) { + this->imageData = this->imageData.convertToFormat(QImage::Format_ARGB32); + } + // Used to draw on the widget QPainter painter(&imageData); // Set the current settings for the pen @@ -64,32 +64,32 @@ void IntelliImage::drawPixel(const QPoint &p1, const QColor& color){ // Draw a line from the last registered point to the current painter.drawPoint(p1); - if(fastRenderer){ - this->imageData = this->imageData.convertToFormat(QImage::Format_Indexed8); - } + if(fastRenderer) { + this->imageData = this->imageData.convertToFormat(QImage::Format_Indexed8); + } } void IntelliImage::drawPoint(const QPoint &p1, const QColor& color, const int& penWidth){ - if(fastRenderer){ - this->imageData = this->imageData.convertToFormat(QImage::Format_ARGB32); - } - // Used to draw on the widget + if(fastRenderer) { + this->imageData = this->imageData.convertToFormat(QImage::Format_ARGB32); + } + // 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.drawPoint(p1); - if(fastRenderer){ - this->imageData = this->imageData.convertToFormat(QImage::Format_Indexed8); - } + if(fastRenderer) { + this->imageData = this->imageData.convertToFormat(QImage::Format_Indexed8); + } } void IntelliImage::drawLine(const QPoint &p1, const QPoint& p2, const QColor& color, const int& penWidth){ - if(fastRenderer){ - this->imageData = this->imageData.convertToFormat(QImage::Format_ARGB32); - } - // Used to draw on the widget + if(fastRenderer) { + this->imageData = this->imageData.convertToFormat(QImage::Format_ARGB32); + } + // Used to draw on the widget QPainter painter(&imageData); // Set the current settings for the pen @@ -97,34 +97,34 @@ void IntelliImage::drawLine(const QPoint &p1, const QPoint& p2, const QColor& co // Draw a line from the last registered point to the current painter.drawLine(p1, p2); - if(fastRenderer){ - this->imageData = this->imageData.convertToFormat(QImage::Format_Indexed8); - } + if(fastRenderer) { + this->imageData = this->imageData.convertToFormat(QImage::Format_Indexed8); + } } void IntelliImage::drawPlain(const QColor& color){ - if(fastRenderer){ - this->imageData = this->imageData.convertToFormat(QImage::Format_ARGB32); - } - imageData.fill(color); - if(fastRenderer){ - this->imageData = this->imageData.convertToFormat(QImage::Format_Indexed8); - } + if(fastRenderer) { + this->imageData = this->imageData.convertToFormat(QImage::Format_ARGB32); + } + imageData.fill(color); + if(fastRenderer) { + this->imageData = this->imageData.convertToFormat(QImage::Format_Indexed8); + } } QColor IntelliImage::getPixelColor(QPoint& point){ - if(fastRenderer){ - QImage copy = this->imageData.convertToFormat(QImage::Format_ARGB32); - return copy.pixelColor(point); - } - return imageData.pixelColor(point); + if(fastRenderer) { + QImage copy = this->imageData.convertToFormat(QImage::Format_ARGB32); + return copy.pixelColor(point); + } + return imageData.pixelColor(point); } QImage IntelliImage::getImageData(){ - return this->imageData; + return this->imageData; } void IntelliImage::updateRendererSetting(bool fastRendererOn){ - this->fastRenderer = fastRendererOn; - this->imageData = this->imageData.convertToFormat(fastRenderer ? QImage::Format_Indexed8 : QImage::Format_ARGB32); + this->fastRenderer = fastRendererOn; + this->imageData = this->imageData.convertToFormat(fastRenderer ? QImage::Format_Indexed8 : QImage::Format_ARGB32); } diff --git a/src/Image/IntelliRasterImage.cpp b/src/Image/IntelliRasterImage.cpp index 4bd0891..0d28e5d 100644 --- a/src/Image/IntelliRasterImage.cpp +++ b/src/Image/IntelliRasterImage.cpp @@ -4,9 +4,9 @@ #include IntelliRasterImage::IntelliRasterImage(int width, int height, bool fastRendererOn) - : IntelliImage(width, height, fastRendererOn){ - TypeOfImage = IntelliImage::ImageType::RASTERIMAGE; - this->fastRenderer = fastRendererOn; + : IntelliImage(width, height, fastRendererOn){ + TypeOfImage = IntelliImage::ImageType::RASTERIMAGE; + this->fastRenderer = fastRendererOn; } IntelliRasterImage::~IntelliRasterImage(){ @@ -14,7 +14,7 @@ IntelliRasterImage::~IntelliRasterImage(){ } IntelliImage* IntelliRasterImage::getDeepCopy(){ - IntelliRasterImage* raster = new IntelliRasterImage(imageData.width(), imageData.height(), false); + IntelliRasterImage* raster = new IntelliRasterImage(imageData.width(), imageData.height(), false); raster->imageData.fill(Qt::transparent); raster->TypeOfImage = IntelliImage::ImageType::RASTERIMAGE; return raster; @@ -30,9 +30,9 @@ QImage IntelliRasterImage::getDisplayable(int alpha){ QImage IntelliRasterImage::getDisplayable(const QSize& displaySize, int alpha){ QImage copy = imageData; - if(fastRenderer){ - copy = copy.convertToFormat(QImage::Format_ARGB32); - } + if(fastRenderer) { + copy = copy.convertToFormat(QImage::Format_ARGB32); + } for(int y = 0; y IntelliShapedImage::IntelliShapedImage(int width, int height, bool fastRendererOn) - : IntelliRasterImage(width, height, fastRendererOn){ - TypeOfImage = IntelliImage::ImageType::SHAPEDIMAGE; - this->fastRenderer = fastRendererOn; + : IntelliRasterImage(width, height, fastRendererOn){ + TypeOfImage = IntelliImage::ImageType::SHAPEDIMAGE; + this->fastRenderer = fastRendererOn; } IntelliShapedImage::~IntelliShapedImage(){ @@ -19,7 +19,7 @@ QImage IntelliShapedImage::getDisplayable(int alpha){ } IntelliImage* IntelliShapedImage::getDeepCopy(){ - IntelliShapedImage* shaped = new IntelliShapedImage(imageData.width(), imageData.height(), false); + IntelliShapedImage* shaped = new IntelliShapedImage(imageData.width(), imageData.height(), false); shaped->setPolygon(this->polygonData); shaped->imageData.fill(Qt::transparent); shaped->TypeOfImage = IntelliImage::ImageType::SHAPEDIMAGE; @@ -27,11 +27,11 @@ IntelliImage* IntelliShapedImage::getDeepCopy(){ } void IntelliShapedImage::calculateVisiblity(){ - if(fastRenderer){ - this->imageData = imageData.convertToFormat(QImage::Format_ARGB32); - } + if(fastRenderer) { + this->imageData = imageData.convertToFormat(QImage::Format_ARGB32); + } - if(polygonData.size()<=2) { + if(polygonData.size()<=2) { QColor clr; for(int y=0; yimageData = this->imageData.convertToFormat(QImage::Format_Indexed8); - } + if(fastRenderer) { + this->imageData = this->imageData.convertToFormat(QImage::Format_Indexed8); + } return; } QColor clr; @@ -50,7 +50,7 @@ void IntelliShapedImage::calculateVisiblity(){ for(int x=0; ximageData = this->imageData.convertToFormat(QImage::Format_Indexed8); - } + if(fastRenderer) { + this->imageData = this->imageData.convertToFormat(QImage::Format_Indexed8); + } } QImage IntelliShapedImage::getDisplayable(const QSize& displaySize, int alpha){ QImage copy = imageData; - if(fastRenderer){ - copy = copy.convertToFormat(QImage::Format_ARGB32); - } + if(fastRenderer) { + copy = copy.convertToFormat(QImage::Format_ARGB32); + } for(int y = 0; y& polygonData){ for(auto element:polygonData) { this->polygonData.push_back(QPoint(element.x(), element.y())); } - triangles = IntelliTriangulation::calculateTriangles(polygonData); + triangles = IntelliTriangulation::calculateTriangles(polygonData); } calculateVisiblity(); return; diff --git a/src/Layer/PaintingArea.cpp b/src/Layer/PaintingArea.cpp index 2258376..7dd3e01 100644 --- a/src/Layer/PaintingArea.cpp +++ b/src/Layer/PaintingArea.cpp @@ -31,7 +31,7 @@ PaintingArea::PaintingArea(int maxWidth, int maxHeight, QWidget*parent) polygon.push_back(QPoint(000,100)); layerBundle[0].image->setPolygon(polygon); - this->addLayer(200,200,150,150,IntelliImage::ImageType::RASTERIMAGE); + this->addLayer(200,200,150,150,IntelliImage::ImageType::RASTERIMAGE); layerBundle[1].image->drawPlain(QColor(0,255,0,255)); layerBundle[1].alpha=200; @@ -59,10 +59,10 @@ int PaintingArea::addLayer(int width, int height, int widthOffset, int heightOff newLayer.height = height; newLayer.widthOffset = widthOffset; newLayer.heightOffset = heightOffset; - if(type==IntelliImage::ImageType::RASTERIMAGE) { - newLayer.image = new IntelliRasterImage(width,height,renderSettings.getFastRenderer()); - }else if(type==IntelliImage::ImageType::SHAPEDIMAGE) { - newLayer.image = new IntelliShapedImage(width, height, renderSettings.getFastRenderer()); + if(type==IntelliImage::ImageType::RASTERIMAGE) { + newLayer.image = new IntelliRasterImage(width,height,renderSettings.getFastRenderer()); + }else if(type==IntelliImage::ImageType::SHAPEDIMAGE) { + newLayer.image = new IntelliShapedImage(width, height, renderSettings.getFastRenderer()); } newLayer.alpha = 255; this->layerBundle.push_back(newLayer); @@ -158,13 +158,13 @@ void PaintingArea::movePositionActive(int x, int y){ } void PaintingArea::moveActiveLayer(int idx){ - if(Tool != nullptr){ - 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(idx==1) { this->selectLayerUp(); }else if(idx==-1) { From 14e4d50541584d8ef7b55abd2432c11453795ddc Mon Sep 17 00:00:00 2001 From: Conrad Date: Thu, 9 Jan 2020 11:36:10 +0100 Subject: [PATCH 36/44] Update cppcheck errors --- cppcheck_errors.txt | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/cppcheck_errors.txt b/cppcheck_errors.txt index dbbc1f3..edc41a2 100644 --- a/cppcheck_errors.txt +++ b/cppcheck_errors.txt @@ -10,7 +10,7 @@ src/IntelliHelper/IntelliColorPicker.cpp:5:3: performance: Variable 'secondColor src/IntelliHelper/IntelliTriangulation.cpp:116:63: style: Parameter 'triangles' can be declared with const [constParameter] bool IntelliTriangulation::isInPolygon(std::vector &triangles, QPoint &point){ ^ -src/Layer/PaintingArea.cpp:333:22: style: Redundant condition: If 'activeLayer > 0', the comparison 'activeLayer != -1' is always true. [redundantCondition] +src/Layer/PaintingArea.cpp:335:22: style: Redundant condition: If 'activeLayer > 0', the comparison 'activeLayer != -1' is always true. [redundantCondition] if(activeLayer!=-1 && activeLayer>0) { ^ src/Tool/IntelliTool.cpp:4:14: warning: Member variable 'IntelliTool::ActiveType' is not initialized in the constructor. [uninitMemberVar] @@ -58,28 +58,25 @@ bool isDrawing; src/GUI/IntelliPhotoGui.cpp:23:0: style: The function 'closeEvent' is never used. [unusedFunction] ^ -src/IntelliHelper/IntelliRenderSettings.cpp:8:0: style: The function 'getFastRenderer' is never used. [unusedFunction] +src/Layer/PaintingArea.cpp:271:0: style: The function 'mouseMoveEvent' is never used. [unusedFunction] ^ -src/Layer/PaintingArea.cpp:269:0: style: The function 'mouseMoveEvent' is never used. [unusedFunction] +src/Layer/PaintingArea.cpp:255:0: style: The function 'mousePressEvent' is never used. [unusedFunction] ^ -src/Layer/PaintingArea.cpp:253:0: style: The function 'mousePressEvent' is never used. [unusedFunction] +src/Layer/PaintingArea.cpp:281:0: style: The function 'mouseReleaseEvent' is never used. [unusedFunction] ^ -src/Layer/PaintingArea.cpp:279:0: style: The function 'mouseReleaseEvent' is never used. [unusedFunction] +src/Layer/PaintingArea.cpp:307:0: style: The function 'paintEvent' is never used. [unusedFunction] ^ -src/Layer/PaintingArea.cpp:305:0: style: The function 'paintEvent' is never used. [unusedFunction] +src/Layer/PaintingArea.cpp:318:0: style: The function 'resizeEvent' is never used. [unusedFunction] ^ -src/Layer/PaintingArea.cpp:316:0: style: The function 'resizeEvent' is never used. [unusedFunction] +src/Layer/PaintingArea.cpp:323:0: style: The function 'resizeLayer' is never used. [unusedFunction] ^ -src/Layer/PaintingArea.cpp:321:0: style: The function 'resizeLayer' is never used. [unusedFunction] - -^ -src/Layer/PaintingArea.cpp:173:0: style: The function 'slotActivateLayer' is never used. [unusedFunction] +src/Layer/PaintingArea.cpp:175:0: style: The function 'slotActivateLayer' is never used. [unusedFunction] ^ src/GUI/IntelliPhotoGui.cpp:157:0: style: The function 'slotClearActiveLayer' is never used. [unusedFunction] @@ -88,7 +85,7 @@ src/GUI/IntelliPhotoGui.cpp:157:0: style: The function 'slotClearActiveLayer' is src/Layer/PaintingArea.cpp:83:0: style: The function 'slotDeleteActiveLayer' is never used. [unusedFunction] ^ -src/Layer/PaintingArea.cpp:292:0: style: The function 'wheelEvent' is never used. [unusedFunction] +src/Layer/PaintingArea.cpp:294:0: style: The function 'wheelEvent' is never used. [unusedFunction] ^ nofile:0:0: information: Cppcheck cannot find all the include files (use --check-config for details) [missingInclude] From 124dfd7931f7a4fccc1bf52c2c8829179ff14e1e Mon Sep 17 00:00:00 2001 From: Conrad Date: Thu, 9 Jan 2020 11:44:26 +0100 Subject: [PATCH 37/44] Uncrustified header files --- src/Layer/PaintingArea.h | 334 +++++++++++++++++++-------------------- 1 file changed, 167 insertions(+), 167 deletions(-) diff --git a/src/Layer/PaintingArea.h b/src/Layer/PaintingArea.h index 31b3916..7bb1ee6 100644 --- a/src/Layer/PaintingArea.h +++ b/src/Layer/PaintingArea.h @@ -22,13 +22,13 @@ * \param widthOffset - Stores the number of pixles from the left side of the painting area * \param heightOffset - Stores the number of pixles from the top of the painting area */ -struct LayerObject{ - IntelliImage* image; - int width; - int height; - int widthOffset; - int heightOffset; - int alpha=255; +struct LayerObject { + IntelliImage* image; + int width; + int height; + int widthOffset; + int heightOffset; + int alpha=255; }; /*! @@ -36,193 +36,193 @@ struct LayerObject{ */ class PaintingArea : public QWidget { - // Declares our class as a QObject which is the base class - // for all Qt objects - // QObjects handle events - Q_OBJECT - friend IntelliTool; - friend IntelliPhotoGui; +// Declares our class as a QObject which is the base class +// for all Qt objects +// QObjects handle events +Q_OBJECT +friend IntelliTool; +friend IntelliPhotoGui; public: - /*! - * \brief PaintingArea is the constructor of the PaintingArea class, which initiates the working environment - * \param maxWidth - The maximum amount of pixles that are inside painting area from left to right (default=600px) - * \param maxHeight - The maximum amount of pixles that are inside painting area from top to bottom (default=600px) - * \param parent - The parent window of the main window (default=nullptr) - */ - PaintingArea(int maxWidth=600, int maxHeight=600, QWidget *parent = nullptr); +/*! + * \brief PaintingArea is the constructor of the PaintingArea class, which initiates the working environment + * \param maxWidth - The maximum amount of pixles that are inside painting area from left to right (default=600px) + * \param maxHeight - The maximum amount of pixles that are inside painting area from top to bottom (default=600px) + * \param parent - The parent window of the main window (default=nullptr) + */ +PaintingArea(int maxWidth=600, int maxHeight=600, QWidget*parent = nullptr); - /*! - * \brief This deconstructor is used to clear up the memory and remove the currently active window - */ - ~PaintingArea() override; +/*! + * \brief This deconstructor is used to clear up the memory and remove the currently active window + */ +~PaintingArea() override; - // Handles all events +// Handles all events - /*! - * \brief The open method is used for loading a picture into the current layer - * \param fileName - Path and filename which are used to determine where the to-be-opened file is stored - * \return Returns a boolean variable whether the file was successfully opened or not - */ - bool open(const QString &filePath); - /*! - * \brief The save method is used for exporting the current project as one picture - * \param fileName - * \param fileFormat - * \return Returns a boolean variable, true if the file was saved successfully, false if not - */ - bool save(const QString &filePath, const char *fileFormat); +/*! + * \brief The open method is used for loading a picture into the current layer + * \param fileName - Path and filename which are used to determine where the to-be-opened file is stored + * \return Returns a boolean variable whether the file was successfully opened or not + */ +bool open(const QString &filePath); +/*! + * \brief The save method is used for exporting the current project as one picture + * \param fileName + * \param fileFormat + * \return Returns a boolean variable, true if the file was saved successfully, false if not + */ +bool save(const QString &filePath, const char*fileFormat); - /*! - * \brief The addLayer adds a layer to the current project/ painting area - * \param width - Width of the layer in pixles - * \param height - Height of the layer in pixles - * \param widthOffset - Offset of the layer measured to the left border of the painting area in pixles - * \param heightOffset - Offset of the layer measured to the top border of the painting area in pixles - * \param type - Defining the ImageType of the new layer - * \return Returns the number of layers in the project - */ - int addLayer(int width, int height, int widthOffset=0, int heightOffset=0, IntelliImage::ImageType type = IntelliImage::ImageType::RASTERIMAGE); - /*! - * \brief The addLayerAt adds a layer to the current project/ painting area at a specific position in the layer stack - * \param idx - Index of the position the new layer should be added - * \param width - Width of the layer in pixles - * \param height - Height of the layer in pixles - * \param widthOffset - Offset of the layer measured to the left border of the painting area in pixles - * \param heightOffset - Offset of the layer measured to the top border of the painting area in pixles - * \param type - Defining the ImageType of the new layer - * \return Returns the id of the layer position - */ - int addLayerAt(int idx, int width, int height, int widthOffset=0, int heightOffset=0, IntelliImage::ImageType type = IntelliImage::ImageType::RASTERIMAGE); - /*! - * \brief The deleteLayer method removes a layer at a given idx - * \param idx - The index of the layer to be removed - */ - void deleteLayer(int idx); - /*! - * \brief The setLayerToActive method marks a specific layer as active - * \param idx - The index of the layer to be active - */ - void setLayerActive(int idx); - /*! - * \brief The setAlphaOfLayer method sets the alpha value of a specific layer - * \param idx - The index of the layer where the change should be applied - * \param alpha - New alpha value of the layer - */ - void setLayerAlpha(int idx, int alpha); - /*! - * \brief The floodFill method fills a the active layer with a given color - * \param r - Red value of the color the layer should be filled with - * \param g - Green value of the color the layer should be filled with - * \param b - Blue value of the color the layer should be filled with - * \param a - Alpha value of the color the layer should be filled with - */ - void floodFill(int r, int g, int b, int a); - /*! - * \brief The movePositionActive method moves the active layer to certain position - * \param x - The x value the new center of the layer should be at - * \param y - The y value the new center of the layer should be at - */ - void movePositionActive(int x, int y); - /*! - * \brief The moveActiveLayer moves the active layer to a specific position in the layer stack - * \param idx - The index of the new position the layer should be in - */ - void moveActiveLayer(int idx); +/*! + * \brief The addLayer adds a layer to the current project/ painting area + * \param width - Width of the layer in pixles + * \param height - Height of the layer in pixles + * \param widthOffset - Offset of the layer measured to the left border of the painting area in pixles + * \param heightOffset - Offset of the layer measured to the top border of the painting area in pixles + * \param type - Defining the ImageType of the new layer + * \return Returns the number of layers in the project + */ +int addLayer(int width, int height, int widthOffset=0, int heightOffset=0, IntelliImage::ImageType type = IntelliImage::ImageType::RASTERIMAGE); +/*! + * \brief The addLayerAt adds a layer to the current project/ painting area at a specific position in the layer stack + * \param idx - Index of the position the new layer should be added + * \param width - Width of the layer in pixles + * \param height - Height of the layer in pixles + * \param widthOffset - Offset of the layer measured to the left border of the painting area in pixles + * \param heightOffset - Offset of the layer measured to the top border of the painting area in pixles + * \param type - Defining the ImageType of the new layer + * \return Returns the id of the layer position + */ +int addLayerAt(int idx, int width, int height, int widthOffset=0, int heightOffset=0, IntelliImage::ImageType type = IntelliImage::ImageType::RASTERIMAGE); +/*! + * \brief The deleteLayer method removes a layer at a given idx + * \param idx - The index of the layer to be removed + */ +void deleteLayer(int idx); +/*! + * \brief The setLayerToActive method marks a specific layer as active + * \param idx - The index of the layer to be active + */ +void setLayerActive(int idx); +/*! + * \brief The setAlphaOfLayer method sets the alpha value of a specific layer + * \param idx - The index of the layer where the change should be applied + * \param alpha - New alpha value of the layer + */ +void setLayerAlpha(int idx, int alpha); +/*! + * \brief The floodFill method fills a the active layer with a given color + * \param r - Red value of the color the layer should be filled with + * \param g - Green value of the color the layer should be filled with + * \param b - Blue value of the color the layer should be filled with + * \param a - Alpha value of the color the layer should be filled with + */ +void floodFill(int r, int g, int b, int a); +/*! + * \brief The movePositionActive method moves the active layer to certain position + * \param x - The x value the new center of the layer should be at + * \param y - The y value the new center of the layer should be at + */ +void movePositionActive(int x, int y); +/*! + * \brief The moveActiveLayer moves the active layer to a specific position in the layer stack + * \param idx - The index of the new position the layer should be in + */ +void moveActiveLayer(int idx); - //change properties of colorPicker - /*! - * \brief The colorPickerSetFirstColor calls the QTColorPicker to determine the primary drawing color - */ - void colorPickerSetFirstColor(); - /*! - * \brief The colorPickerSetSecondColor calls the QTColorPicker to determine the secondary drawing color - */ - void colorPickerSetSecondColor(); - /*! - * \brief The colorPickerSwitchColor swaps the primary color with the secondary drawing color - */ - void colorPickerSwapColors(); +//change properties of colorPicker +/*! + * \brief The colorPickerSetFirstColor calls the QTColorPicker to determine the primary drawing color + */ +void colorPickerSetFirstColor(); +/*! + * \brief The colorPickerSetSecondColor calls the QTColorPicker to determine the secondary drawing color + */ +void colorPickerSetSecondColor(); +/*! + * \brief The colorPickerSwitchColor swaps the primary color with the secondary drawing color + */ +void colorPickerSwapColors(); - // Create tools - void createPenTool(); - void createPlainTool(); - void createLineTool(); - void createRectangleTool(); - void createCircleTool(); - void createPolygonTool(); - void createFloodFillTool(); +// Create tools +void createPenTool(); +void createPlainTool(); +void createLineTool(); +void createRectangleTool(); +void createCircleTool(); +void createPolygonTool(); +void createFloodFillTool(); - /*! - * \brief The getWidthOfActive gets the horizontal dimensions of the active layer - * \return Returns the horizontal pixle count of the active layer - */ - int getWidthOfActive(); - /*! - * \brief The getHeightOfActive gets the vertical dimensions of the active layer - * \return Returns the vertical pixle count of the active layer - */ - int getHeightOfActive(); +/*! + * \brief The getWidthOfActive gets the horizontal dimensions of the active layer + * \return Returns the horizontal pixle count of the active layer + */ +int getWidthOfActive(); +/*! + * \brief The getHeightOfActive gets the vertical dimensions of the active layer + * \return Returns the vertical pixle count of the active layer + */ +int getHeightOfActive(); - IntelliImage::ImageType getTypeOfImageRealLayer(); +IntelliImage::ImageType getTypeOfImageRealLayer(); - std::vector getPolygonDataOfRealLayer(); +std::vector getPolygonDataOfRealLayer(); - int getNumberOfActiveLayer(); +int getNumberOfActiveLayer(); - IntelliImage* getImageOfActiveLayer(); +IntelliImage* getImageOfActiveLayer(); - IntelliToolsettings Toolsettings; - IntelliColorPicker colorPicker; +IntelliToolsettings Toolsettings; +IntelliColorPicker colorPicker; public slots: - // Events to handle - /*! - * \brief The slotActivateLayer method handles the event of selecting one layer as active - * \param a - idx of the layer to be active - */ - void slotActivateLayer(int a); - /*! - * \brief The slotDeleteActiveLayer method handles the deletion of the active layer - */ - void slotDeleteActiveLayer(); +// Events to handle +/*! + * \brief The slotActivateLayer method handles the event of selecting one layer as active + * \param a - idx of the layer to be active + */ +void slotActivateLayer(int a); +/*! + * \brief The slotDeleteActiveLayer method handles the deletion of the active layer + */ +void slotDeleteActiveLayer(); protected: - void mousePressEvent(QMouseEvent *event) override; - void mouseMoveEvent(QMouseEvent *event) override; - void mouseReleaseEvent(QMouseEvent *event) override; +void mousePressEvent(QMouseEvent*event) override; +void mouseMoveEvent(QMouseEvent*event) override; +void mouseReleaseEvent(QMouseEvent*event) override; - void wheelEvent(QWheelEvent *event) override; - // Updates the painting area where we are painting - void paintEvent(QPaintEvent *event) override; +void wheelEvent(QWheelEvent*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; +// Makes sure the area we are drawing on remains +// as large as the widget +void resizeEvent(QResizeEvent*event) override; private: - void setLayerDimensions(int maxWidth, int maxHeight); - void selectLayerUp(); - void selectLayerDown(); - IntelliTool* copyActiveTool(); +void setLayerDimensions(int maxWidth, int maxHeight); +void selectLayerUp(); +void selectLayerDown(); +IntelliTool* copyActiveTool(); - QImage* Canvas; - int maxWidth; - int maxHeight; +QImage* Canvas; +int maxWidth; +int maxHeight; - IntelliRenderSettings renderSettings; - IntelliTool* Tool; - IntelliPhotoGui* DumpyGui; +IntelliRenderSettings renderSettings; +IntelliTool* Tool; +IntelliPhotoGui* DumpyGui; - std::vector layerBundle; - int activeLayer=-1; +std::vector layerBundle; +int activeLayer=-1; - void drawLayers(bool forSaving=false); +void drawLayers(bool forSaving=false); - void resizeLayer(QImage *image_res, const QSize &newSize); +void resizeLayer(QImage*image_res, const QSize &newSize); - // Helper for Tool - // TODO: Always create this layer on top and return the id here! - void createTempTopLayer(int idx); +// Helper for Tool +// TODO: Always create this layer on top and return the id here! +void createTempTopLayer(int idx); }; #endif From fb65be47f91e6820a760ef0da1b123a81e4b4644 Mon Sep 17 00:00:00 2001 From: Conrad Date: Thu, 9 Jan 2020 11:54:53 +0100 Subject: [PATCH 38/44] Updated docs --- docs/html/_intelli_color_picker_8h.html | 10 - .../html/_intelli_color_picker_8h_source.html | 4 +- ...li_helper_2_intelli_color_picker_8cpp.html | 5 - ...er_2_intelli_color_picker_8cpp_source.html | 4 +- docs/html/_intelli_image_8cpp.html | 5 - docs/html/_intelli_image_8cpp__incl.dot | 10 +- docs/html/_intelli_image_8cpp_source.html | 215 ++-- docs/html/_intelli_image_8h.html | 54 +- docs/html/_intelli_image_8h__incl.dot | 6 + docs/html/_intelli_image_8h_source.html | 146 ++- docs/html/_intelli_photo_gui_8cpp.html | 9 +- docs/html/_intelli_photo_gui_8cpp__incl.dot | 65 +- docs/html/_intelli_photo_gui_8cpp_source.html | 1103 ++++++++++------- docs/html/_intelli_photo_gui_8h.html | 14 +- .../html/_intelli_photo_gui_8h__dep__incl.dot | 23 +- docs/html/_intelli_photo_gui_8h__incl.dot | 18 +- docs/html/_intelli_photo_gui_8h_source.html | 296 +++-- docs/html/_intelli_raster_image_8cpp.html | 5 - .../html/_intelli_raster_image_8cpp__incl.dot | 16 +- .../_intelli_raster_image_8cpp_source.html | 107 +- docs/html/_intelli_raster_image_8h.html | 12 +- docs/html/_intelli_raster_image_8h__incl.dot | 6 + .../html/_intelli_raster_image_8h_source.html | 46 +- docs/html/_intelli_render_settings_8cpp.html | 108 ++ .../_intelli_render_settings_8cpp__incl.dot | 9 + .../_intelli_render_settings_8cpp_source.html | 118 ++ docs/html/_intelli_render_settings_8h.html | 115 ++ ..._intelli_render_settings_8h__dep__incl.dot | 47 + .../_intelli_render_settings_8h_source.html | 124 ++ docs/html/_intelli_shaped_image_8cpp.html | 7 +- .../html/_intelli_shaped_image_8cpp__incl.dot | 16 +- .../_intelli_shaped_image_8cpp_source.html | 190 +-- docs/html/_intelli_shaped_image_8h.html | 11 - docs/html/_intelli_shaped_image_8h__incl.dot | 8 +- .../html/_intelli_shaped_image_8h_source.html | 46 +- docs/html/_intelli_tool_8cpp.html | 5 - docs/html/_intelli_tool_8cpp__incl.dot | 89 +- docs/html/_intelli_tool_8cpp_source.html | 205 +-- docs/html/_intelli_tool_8h.html | 11 +- docs/html/_intelli_tool_8h__incl.dot | 4 +- docs/html/_intelli_tool_8h_source.html | 148 ++- docs/html/_intelli_tool_circle_8cpp.html | 5 - docs/html/_intelli_tool_circle_8cpp__incl.dot | 97 +- .../_intelli_tool_circle_8cpp_source.html | 213 ++-- docs/html/_intelli_tool_circle_8h.html | 10 - docs/html/_intelli_tool_circle_8h__incl.dot | 4 +- docs/html/_intelli_tool_circle_8h_source.html | 71 +- docs/html/_intelli_tool_flood_fill_8cpp.html | 5 - .../_intelli_tool_flood_fill_8cpp__incl.dot | 101 +- .../_intelli_tool_flood_fill_8cpp_source.html | 196 +-- docs/html/_intelli_tool_flood_fill_8h.html | 10 - .../_intelli_tool_flood_fill_8h__incl.dot | 4 +- .../_intelli_tool_flood_fill_8h_source.html | 28 +- docs/html/_intelli_tool_line_8cpp.html | 5 - docs/html/_intelli_tool_line_8cpp__incl.dot | 93 +- docs/html/_intelli_tool_line_8cpp_source.html | 164 +-- docs/html/_intelli_tool_line_8h.html | 52 +- docs/html/_intelli_tool_line_8h__incl.dot | 4 +- docs/html/_intelli_tool_line_8h_source.html | 85 +- docs/html/_intelli_tool_pen_8cpp.html | 5 - docs/html/_intelli_tool_pen_8cpp__incl.dot | 97 +- docs/html/_intelli_tool_pen_8cpp_source.html | 61 +- docs/html/_intelli_tool_pen_8h.html | 10 - docs/html/_intelli_tool_pen_8h__incl.dot | 4 +- docs/html/_intelli_tool_pen_8h_source.html | 56 +- docs/html/_intelli_tool_plain_8cpp.html | 5 - docs/html/_intelli_tool_plain_8cpp__incl.dot | 89 +- .../html/_intelli_tool_plain_8cpp_source.html | 110 +- docs/html/_intelli_tool_plain_8h.html | 10 - docs/html/_intelli_tool_plain_8h__incl.dot | 4 +- docs/html/_intelli_tool_plain_8h_source.html | 28 +- docs/html/_intelli_tool_polygon_8cpp.html | 7 +- .../html/_intelli_tool_polygon_8cpp__incl.dot | 105 +- .../_intelli_tool_polygon_8cpp_source.html | 279 +++-- docs/html/_intelli_tool_polygon_8h.html | 12 +- docs/html/_intelli_tool_polygon_8h__incl.dot | 12 +- .../html/_intelli_tool_polygon_8h_source.html | 78 +- docs/html/_intelli_tool_rectangle_8cpp.html | 5 - .../_intelli_tool_rectangle_8cpp__incl.dot | 93 +- .../_intelli_tool_rectangle_8cpp_source.html | 173 +-- docs/html/_intelli_tool_rectangle_8h.html | 10 - .../html/_intelli_tool_rectangle_8h__incl.dot | 4 +- .../_intelli_tool_rectangle_8h_source.html | 66 +- docs/html/_intelli_toolsettings_8cpp.html | 109 ++ .../html/_intelli_toolsettings_8cpp__incl.dot | 11 + .../_intelli_toolsettings_8cpp_source.html | 168 +++ docs/html/_intelli_toolsettings_8h.html | 115 ++ .../_intelli_toolsettings_8h__dep__incl.dot | 62 + .../html/_intelli_toolsettings_8h_source.html | 142 +++ docs/html/_intelli_triangulation_8cpp.html | 136 ++ docs/html/_intelli_triangulation_8cpp.js | 4 + .../_intelli_triangulation_8cpp__incl.dot | 19 + .../_intelli_triangulation_8cpp_source.html | 237 ++++ docs/html/_intelli_triangulation_8h.html | 140 +++ docs/html/_intelli_triangulation_8h.js | 8 + .../_intelli_triangulation_8h__dep__incl.dot | 52 + docs/html/_intelli_triangulation_8h__incl.dot | 11 + .../_intelli_triangulation_8h_source.html | 150 +++ docs/html/_painting_area_8cpp.html | 5 - docs/html/_painting_area_8cpp__incl.dot | 142 ++- docs/html/_painting_area_8cpp_source.html | 758 ++++++----- docs/html/_painting_area_8h.html | 11 +- docs/html/_painting_area_8h__incl.dot | 79 +- docs/html/_painting_area_8h_source.html | 298 +++-- .../_tool_2_intelli_color_picker_8cpp.html | 5 - ...ol_2_intelli_color_picker_8cpp_source.html | 4 +- docs/html/annotated.html | 28 +- docs/html/annotated_dup.js | 2 + .../class_intelli_color_picker-members.html | 2 +- docs/html/class_intelli_color_picker.html | 37 +- docs/html/class_intelli_color_picker.js | 2 +- ...568fbf5dc783f06284b7031ffe9415_icgraph.dot | 2 + ...2eb27b928fe9388b9398b0556303b7_icgraph.dot | 6 +- ...499265ae28ce1b54be88222e74292e_icgraph.dot | 10 + docs/html/class_intelli_image-members.html | 18 +- docs/html/class_intelli_image.html | 305 ++++- docs/html/class_intelli_image.js | 15 +- docs/html/class_intelli_image.png | Bin 0 -> 754 bytes .../class_intelli_image__inherit__graph.dot | 2 +- ...787f1b333b59401643936ebb3dcfe1_icgraph.dot | 4 +- ...e622810dc2bc756054bb5769becb06_icgraph.dot | 6 +- ...6fbe380ffe0e073a8cd760f8285fe3_icgraph.dot | 10 + ...31800aba38c96074bbe9bb6e341d4e_icgraph.dot | 10 + ...bced93f4744fad81b7f141b21f4ab2_icgraph.dot | 24 +- ...c859f5c409e37051edfd9e9fbca056_icgraph.dot | 4 +- .../html/class_intelli_photo_gui-members.html | 1 + docs/html/class_intelli_photo_gui.html | 37 +- docs/html/class_intelli_photo_gui.js | 3 +- docs/html/class_intelli_photo_gui.png | Bin 0 -> 471 bytes ...dbef8d4688227aa9455aea52db00bf4_cgraph.dot | 18 + .../class_intelli_raster_image-members.html | 20 +- docs/html/class_intelli_raster_image.html | 111 +- docs/html/class_intelli_raster_image.js | 2 +- docs/html/class_intelli_raster_image.png | Bin 0 -> 747 bytes ...lass_intelli_raster_image__coll__graph.dot | 2 +- ...s_intelli_raster_image__inherit__graph.dot | 2 +- ...f901301b106504de3c27308ade897dc_cgraph.dot | 2 +- ...79b571372296f1922af818ba003413_icgraph.dot | 10 + ...class_intelli_render_settings-members.html | 109 ++ docs/html/class_intelli_render_settings.html | 169 +++ docs/html/class_intelli_render_settings.js | 5 + ...74e7d7ed3a2e944883dddbe8bbf5e8_icgraph.dot | 12 + .../class_intelli_shaped_image-members.html | 22 +- docs/html/class_intelli_shaped_image.html | 119 +- docs/html/class_intelli_shaped_image.js | 2 +- docs/html/class_intelli_shaped_image.png | Bin 0 -> 742 bytes ...lass_intelli_shaped_image__coll__graph.dot | 2 +- ...s_intelli_shaped_image__inherit__graph.dot | 2 +- ...b69d75de7a3b85032482982f249458e_cgraph.dot | 2 +- ...e612a1fa52d7f878b34a7a7022d8e9_icgraph.dot | 10 + ...d0b31e0fa771104399d1f5ff39a0337_cgraph.dot | 4 +- docs/html/class_intelli_tool-members.html | 31 +- docs/html/class_intelli_tool.html | 288 +++-- docs/html/class_intelli_tool.js | 19 +- docs/html/class_intelli_tool.png | Bin 0 -> 1396 bytes docs/html/class_intelli_tool__coll__graph.dot | 14 +- ...20fad2e26315d5c4d96dbc95d1dceb_icgraph.dot | 14 + ...189b00307c6d7e89f28198f54404b0_icgraph.dot | 6 +- ...6aa68ac5f3c2ca02319e5ef3f0c966_icgraph.dot | 30 +- ...b7ef1dde96b94a0ce450a25ae1778c_icgraph.dot | 8 +- ...ccfd4460255ccb866f336406a33574_icgraph.dot | 6 +- ...6a2575c16c8a33cb2a5197f8d8cc5b_icgraph.dot | 8 +- ...0e20414cd8855a2f9b103fb6408639_icgraph.dot | 6 +- .../class_intelli_tool_circle-members.html | 35 +- docs/html/class_intelli_tool_circle.html | 114 +- docs/html/class_intelli_tool_circle.js | 2 +- docs/html/class_intelli_tool_circle.png | Bin 0 -> 425 bytes ...class_intelli_tool_circle__coll__graph.dot | 14 +- ...a03b65b95d7b5d72e6a92c95f068954_cgraph.dot | 10 + ...2d9b0fb6695c184c4cb507a5fb75506_cgraph.dot | 6 +- ...class_intelli_tool_flood_fill-members.html | 35 +- docs/html/class_intelli_tool_flood_fill.html | 114 +- docs/html/class_intelli_tool_flood_fill.js | 2 +- docs/html/class_intelli_tool_flood_fill.png | Bin 0 -> 418 bytes ...s_intelli_tool_flood_fill__coll__graph.dot | 14 +- ...3b1bd8be0cbb32cdf61a9597ec849ba_cgraph.dot | 10 + .../html/class_intelli_tool_line-members.html | 35 +- docs/html/class_intelli_tool_line.html | 116 +- docs/html/class_intelli_tool_line.js | 2 +- docs/html/class_intelli_tool_line.png | Bin 0 -> 386 bytes .../class_intelli_tool_line__coll__graph.dot | 14 +- ...55d676a5f98311217eb095be4759846_cgraph.dot | 6 +- ...f1d686e1ec43f41b5186ccfd806b125_cgraph.dot | 6 +- ...c6324ef0778823fe7e35aef8ae37f9b_cgraph.dot | 10 +- ...b600b0f4e9225ebce2937c2b7abb4c2_cgraph.dot | 10 + docs/html/class_intelli_tool_pen-members.html | 35 +- docs/html/class_intelli_tool_pen.html | 102 +- docs/html/class_intelli_tool_pen.js | 2 +- docs/html/class_intelli_tool_pen.png | Bin 0 -> 376 bytes .../class_intelli_tool_pen__coll__graph.dot | 14 +- ...8d1d636497b630647ce0c4d652737c2_cgraph.dot | 8 +- ...ff40aef6d38eb55af31a19322429205_cgraph.dot | 8 +- ...77a025515d0fed6954556fe2b444818_cgraph.dot | 10 + ...e3626ddff440ab125f4a2465c45427a_cgraph.dot | 6 +- ...class_intelli_tool_plain_tool-members.html | 35 +- docs/html/class_intelli_tool_plain_tool.html | 114 +- docs/html/class_intelli_tool_plain_tool.js | 2 +- docs/html/class_intelli_tool_plain_tool.png | Bin 0 -> 435 bytes ...s_intelli_tool_plain_tool__coll__graph.dot | 14 +- ...1fe568be05c075814d67440472bb658_cgraph.dot | 10 + .../class_intelli_tool_polygon-members.html | 18 +- docs/html/class_intelli_tool_polygon.html | 112 +- docs/html/class_intelli_tool_polygon.js | 2 +- docs/html/class_intelli_tool_polygon.png | Bin 0 -> 456 bytes ...lass_intelli_tool_polygon__coll__graph.dot | 14 +- ...87cbf2254010989df6106a357471499_cgraph.dot | 10 + ...e1473ff408ae2e11cf6a43f6f575f21_cgraph.dot | 24 +- ...13103300c9f023d64d9eec5ac05dd17_cgraph.dot | 6 +- ...5d3b741be6d0647a9cdc9da2cb8bc3d_cgraph.dot | 32 +- .../class_intelli_tool_rectangle-members.html | 35 +- docs/html/class_intelli_tool_rectangle.html | 114 +- docs/html/class_intelli_tool_rectangle.js | 2 +- docs/html/class_intelli_tool_rectangle.png | Bin 0 -> 469 bytes ...ss_intelli_tool_rectangle__coll__graph.dot | 14 +- ...45c53a56e859f970e59f5036e221e0c_cgraph.dot | 6 +- ...dc1463e726a21255e6297241dc71fb1_cgraph.dot | 10 + .../class_intelli_toolsettings-members.html | 117 ++ docs/html/class_intelli_toolsettings.html | 362 ++++++ docs/html/class_intelli_toolsettings.js | 16 + ...eb193b25e0665516244c61c5e65aa6_icgraph.dot | 10 + ...528dd3bad8f39ba19fa6b12a4e415a_icgraph.dot | 30 + ...6ce2054ec4bcba7629dc2b514b6b5c_icgraph.dot | 10 + ...6d37de6ee94b433d53fe3e598cc9fa_icgraph.dot | 18 + docs/html/class_painting_area-members.html | 66 +- docs/html/class_painting_area.html | 418 ++++--- docs/html/class_painting_area.js | 24 +- docs/html/class_painting_area.png | Bin 0 -> 448 bytes .../html/class_painting_area__coll__graph.dot | 4 + ...280454ebb80db7feba2fd621513353_icgraph.dot | 10 + ...fa0ec23e78cc59f28c823584c721460_cgraph.dot | 4 +- ...5ee91b26b1c58be6d833f279d81597_icgraph.dot | 10 + ...e9207612cef104d39013564696fe989_cgraph.dot | 10 + ...9207612cef104d39013564696fe989_icgraph.dot | 10 + ...1ac281e0de263208d4a3b9de74258ec_cgraph.dot | 4 +- ...eb059829f27e8cdb3a54c5cd3d12c9_icgraph.dot | 10 + ...e21fd031ee1c04f92e042e86be0a90_icgraph.dot | 10 + ...8c7e759aa8375a56129791645f46ea5_cgraph.dot | 12 + ...76f58aad03b4dcd47611b6a4b9abb4_icgraph.dot | 10 + ...6d089f4357b22d9a9906fd4771de3e7_cgraph.dot | 10 + ...b11ad35d07e9081203d8217d2c0855_icgraph.dot | 10 + ...ff4563d006fda491469bd41778d07eb_cgraph.dot | 10 + ...05f6893fb44bfcb34018573a609cd1a_cgraph.dot | 10 + ...2b27dfd09573c224d2ae1958d3bead_icgraph.dot | 10 + docs/html/classes.html | 38 +- docs/html/dir_000003_000004.html | 2 +- docs/html/dir_000005_000004.html | 2 +- docs/html/dir_000006_000002.html | 101 ++ .../dir_544f9dcb748f922e4bb3be2540380bf2.html | 5 - .../dir_544f9dcb748f922e4bb3be2540380bf2.js | 4 +- ...r_544f9dcb748f922e4bb3be2540380bf2_dep.dot | 2 +- .../dir_5dabb14988a75c922e285f444641a133.html | 5 - ...r_5dabb14988a75c922e285f444641a133_dep.dot | 1 + .../dir_83a4347d11f2ba6343d546ab133722d2.html | 5 - ...r_83a4347d11f2ba6343d546ab133722d2_dep.dot | 6 +- .../dir_8db5f55022e7670536cbc9a6a1d6f01c.html | 5 - .../dir_941490de56ac122cf77df9922cbcc750.html | 5 - .../dir_941490de56ac122cf77df9922cbcc750.js | 4 +- ...r_941490de56ac122cf77df9922cbcc750_dep.dot | 2 +- .../dir_e6d96184223881d115efa44ca0dfa844.html | 5 - ...r_e6d96184223881d115efa44ca0dfa844_dep.dot | 7 +- .../dir_f50aa5156fe016a259583c412dbf440c.html | 12 +- .../dir_f50aa5156fe016a259583c412dbf440c.js | 12 +- docs/html/files.html | 8 +- docs/html/functions.html | 150 ++- docs/html/functions_enum.html | 111 ++ docs/html/functions_func.html | 113 +- docs/html/functions_vars.html | 22 +- docs/html/globals.html | 9 +- docs/html/globals_defs.html | 105 ++ docs/html/hierarchy.html | 36 +- docs/html/hierarchy.js | 2 + docs/html/inherit_graph_1.dot | 2 +- docs/html/inherit_graph_3.dot | 16 +- docs/html/inherit_graph_4.dot | 16 +- docs/html/inherit_graph_5.dot | 4 +- docs/html/inherit_graph_6.dot | 2 +- docs/html/inherit_graph_7.dot | 10 + docs/html/inherit_graph_8.dot | 8 + docs/html/inherits.html | 12 +- docs/html/main_8cpp.html | 8 +- docs/html/main_8cpp__incl.dot | 31 +- docs/html/main_8cpp_source.html | 30 +- docs/html/menudata.js | 10 +- .../html/namespace_intelli_triangulation.html | 296 +++++ ...0621e2d8708fe2e8966d7d79b64e186_cgraph.dot | 12 + ...621e2d8708fe2e8966d7d79b64e186_icgraph.dot | 12 + ...150fee67fd41a451bd2592f10e00197_cgraph.dot | 10 + ...50fee67fd41a451bd2592f10e00197_icgraph.dot | 14 + ...af1ed598e868b25e9e06d580da32e5_icgraph.dot | 16 + ...af549a7faff35a74c1265b290ea0ca_icgraph.dot | 16 + docs/html/namespacemembers.html | 8 +- docs/html/namespacemembers_func.html | 8 +- docs/html/namespaces.html | 2 +- docs/html/namespaces_dup.js | 2 +- docs/html/navtreedata.js | 7 +- docs/html/navtreeindex0.js | 346 +++--- docs/html/navtreeindex1.js | 69 +- docs/html/search/all_0.js | 11 +- docs/html/search/all_1.js | 2 +- docs/html/search/all_10.js | 16 +- docs/html/search/all_11.html | 30 + docs/html/search/all_11.js | 17 + docs/html/search/all_2.js | 33 +- docs/html/search/all_3.js | 13 +- docs/html/search/all_4.js | 3 +- docs/html/search/all_5.js | 28 +- docs/html/search/all_6.js | 4 +- docs/html/search/all_7.js | 101 +- docs/html/search/all_8.js | 7 +- docs/html/search/all_9.js | 14 +- docs/html/search/all_a.js | 14 +- docs/html/search/all_b.js | 14 +- docs/html/search/all_c.js | 7 +- docs/html/search/all_d.js | 26 +- docs/html/search/all_e.js | 5 +- docs/html/search/all_f.js | 5 +- docs/html/search/classes_0.js | 28 +- docs/html/search/classes_1.js | 2 +- docs/html/search/classes_2.js | 2 +- docs/html/search/classes_3.js | 2 +- docs/html/search/defines_0.html | 30 + docs/html/search/defines_0.js | 4 + docs/html/search/enums_0.js | 2 +- docs/html/search/enums_1.js | 2 +- docs/html/search/enums_2.html | 30 + docs/html/search/enums_2.js | 4 + docs/html/search/enumvalues_0.js | 2 +- docs/html/search/enumvalues_1.js | 2 +- docs/html/search/enumvalues_2.js | 3 +- docs/html/search/enumvalues_3.html | 30 + docs/html/search/enumvalues_3.js | 4 + docs/html/search/enumvalues_4.html | 30 + docs/html/search/enumvalues_4.js | 6 + docs/html/search/enumvalues_5.html | 30 + docs/html/search/enumvalues_5.js | 5 + docs/html/search/enumvalues_6.html | 30 + docs/html/search/enumvalues_6.js | 5 + docs/html/search/files_0.js | 60 +- docs/html/search/files_1.js | 2 +- docs/html/search/files_2.js | 4 +- docs/html/search/functions_0.js | 4 +- docs/html/search/functions_1.js | 26 +- docs/html/search/functions_2.js | 10 +- docs/html/search/functions_3.js | 2 +- docs/html/search/functions_4.js | 28 +- docs/html/search/functions_5.js | 32 +- docs/html/search/functions_6.js | 2 +- docs/html/search/functions_7.js | 12 +- docs/html/search/functions_8.js | 14 +- docs/html/search/functions_9.js | 4 +- docs/html/search/functions_a.js | 4 +- docs/html/search/functions_b.js | 22 +- docs/html/search/functions_c.js | 3 +- docs/html/search/functions_d.js | 14 +- docs/html/search/functions_e.html | 30 + docs/html/search/functions_e.js | 17 + docs/html/search/namespaces_0.js | 2 +- docs/html/search/searchdata.js | 17 +- docs/html/search/variables_0.js | 9 +- docs/html/search/variables_1.js | 2 +- docs/html/search/variables_2.js | 6 +- docs/html/search/variables_3.js | 2 +- docs/html/search/variables_4.js | 4 +- docs/html/search/variables_5.js | 5 +- docs/html/search/variables_6.js | 2 +- docs/html/search/variables_7.js | 4 +- docs/html/search/variables_8.html | 30 + docs/html/search/variables_8.js | 5 + docs/html/struct_layer_object.html | 19 +- docs/html/struct_triangle.html | 12 +- 370 files changed, 10420 insertions(+), 5026 deletions(-) create mode 100644 docs/html/_intelli_render_settings_8cpp.html create mode 100644 docs/html/_intelli_render_settings_8cpp__incl.dot create mode 100644 docs/html/_intelli_render_settings_8cpp_source.html create mode 100644 docs/html/_intelli_render_settings_8h.html create mode 100644 docs/html/_intelli_render_settings_8h__dep__incl.dot create mode 100644 docs/html/_intelli_render_settings_8h_source.html create mode 100644 docs/html/_intelli_toolsettings_8cpp.html create mode 100644 docs/html/_intelli_toolsettings_8cpp__incl.dot create mode 100644 docs/html/_intelli_toolsettings_8cpp_source.html create mode 100644 docs/html/_intelli_toolsettings_8h.html create mode 100644 docs/html/_intelli_toolsettings_8h__dep__incl.dot create mode 100644 docs/html/_intelli_toolsettings_8h_source.html create mode 100644 docs/html/_intelli_triangulation_8cpp.html create mode 100644 docs/html/_intelli_triangulation_8cpp.js create mode 100644 docs/html/_intelli_triangulation_8cpp__incl.dot create mode 100644 docs/html/_intelli_triangulation_8cpp_source.html create mode 100644 docs/html/_intelli_triangulation_8h.html create mode 100644 docs/html/_intelli_triangulation_8h.js create mode 100644 docs/html/_intelli_triangulation_8h__dep__incl.dot create mode 100644 docs/html/_intelli_triangulation_8h__incl.dot create mode 100644 docs/html/_intelli_triangulation_8h_source.html create mode 100644 docs/html/class_intelli_color_picker_aec499265ae28ce1b54be88222e74292e_icgraph.dot create mode 100644 docs/html/class_intelli_image.png create mode 100644 docs/html/class_intelli_image_ad66fbe380ffe0e073a8cd760f8285fe3_icgraph.dot create mode 100644 docs/html/class_intelli_image_ae231800aba38c96074bbe9bb6e341d4e_icgraph.dot create mode 100644 docs/html/class_intelli_photo_gui.png create mode 100644 docs/html/class_intelli_photo_gui_a1dbef8d4688227aa9455aea52db00bf4_cgraph.dot create mode 100644 docs/html/class_intelli_raster_image.png create mode 100644 docs/html/class_intelli_raster_image_ae779b571372296f1922af818ba003413_icgraph.dot create mode 100644 docs/html/class_intelli_render_settings-members.html create mode 100644 docs/html/class_intelli_render_settings.html create mode 100644 docs/html/class_intelli_render_settings.js create mode 100644 docs/html/class_intelli_render_settings_a5a74e7d7ed3a2e944883dddbe8bbf5e8_icgraph.dot create mode 100644 docs/html/class_intelli_shaped_image.png create mode 100644 docs/html/class_intelli_shaped_image_ae2e612a1fa52d7f878b34a7a7022d8e9_icgraph.dot create mode 100644 docs/html/class_intelli_tool.png create mode 100644 docs/html/class_intelli_tool_a0020fad2e26315d5c4d96dbc95d1dceb_icgraph.dot create mode 100644 docs/html/class_intelli_tool_circle.png create mode 100644 docs/html/class_intelli_tool_circle_a7a03b65b95d7b5d72e6a92c95f068954_cgraph.dot create mode 100644 docs/html/class_intelli_tool_flood_fill.png create mode 100644 docs/html/class_intelli_tool_flood_fill_a83b1bd8be0cbb32cdf61a9597ec849ba_cgraph.dot create mode 100644 docs/html/class_intelli_tool_line.png create mode 100644 docs/html/class_intelli_tool_line_acb600b0f4e9225ebce2937c2b7abb4c2_cgraph.dot create mode 100644 docs/html/class_intelli_tool_pen.png create mode 100644 docs/html/class_intelli_tool_pen_ac77a025515d0fed6954556fe2b444818_cgraph.dot create mode 100644 docs/html/class_intelli_tool_plain_tool.png create mode 100644 docs/html/class_intelli_tool_plain_tool_a91fe568be05c075814d67440472bb658_cgraph.dot create mode 100644 docs/html/class_intelli_tool_polygon.png create mode 100644 docs/html/class_intelli_tool_polygon_a087cbf2254010989df6106a357471499_cgraph.dot create mode 100644 docs/html/class_intelli_tool_rectangle.png create mode 100644 docs/html/class_intelli_tool_rectangle_a7dc1463e726a21255e6297241dc71fb1_cgraph.dot create mode 100644 docs/html/class_intelli_toolsettings-members.html create mode 100644 docs/html/class_intelli_toolsettings.html create mode 100644 docs/html/class_intelli_toolsettings.js create mode 100644 docs/html/class_intelli_toolsettings_a5beb193b25e0665516244c61c5e65aa6_icgraph.dot create mode 100644 docs/html/class_intelli_toolsettings_a68528dd3bad8f39ba19fa6b12a4e415a_icgraph.dot create mode 100644 docs/html/class_intelli_toolsettings_a7d6ce2054ec4bcba7629dc2b514b6b5c_icgraph.dot create mode 100644 docs/html/class_intelli_toolsettings_a906d37de6ee94b433d53fe3e598cc9fa_icgraph.dot create mode 100644 docs/html/class_painting_area.png create mode 100644 docs/html/class_painting_area_a24280454ebb80db7feba2fd621513353_icgraph.dot create mode 100644 docs/html/class_painting_area_a675ee91b26b1c58be6d833f279d81597_icgraph.dot create mode 100644 docs/html/class_painting_area_a6e9207612cef104d39013564696fe989_cgraph.dot create mode 100644 docs/html/class_painting_area_a6e9207612cef104d39013564696fe989_icgraph.dot create mode 100644 docs/html/class_painting_area_a79eb059829f27e8cdb3a54c5cd3d12c9_icgraph.dot create mode 100644 docs/html/class_painting_area_a7ae21fd031ee1c04f92e042e86be0a90_icgraph.dot create mode 100644 docs/html/class_painting_area_a88c7e759aa8375a56129791645f46ea5_cgraph.dot create mode 100644 docs/html/class_painting_area_ac576f58aad03b4dcd47611b6a4b9abb4_icgraph.dot create mode 100644 docs/html/class_painting_area_ac6d089f4357b22d9a9906fd4771de3e7_cgraph.dot create mode 100644 docs/html/class_painting_area_acab11ad35d07e9081203d8217d2c0855_icgraph.dot create mode 100644 docs/html/class_painting_area_acff4563d006fda491469bd41778d07eb_cgraph.dot create mode 100644 docs/html/class_painting_area_ae05f6893fb44bfcb34018573a609cd1a_cgraph.dot create mode 100644 docs/html/class_painting_area_ae92b27dfd09573c224d2ae1958d3bead_icgraph.dot create mode 100644 docs/html/dir_000006_000002.html create mode 100644 docs/html/functions_enum.html create mode 100644 docs/html/globals_defs.html create mode 100644 docs/html/inherit_graph_7.dot create mode 100644 docs/html/inherit_graph_8.dot create mode 100644 docs/html/namespace_intelli_triangulation.html create mode 100644 docs/html/namespace_intelli_triangulation_a00621e2d8708fe2e8966d7d79b64e186_cgraph.dot create mode 100644 docs/html/namespace_intelli_triangulation_a00621e2d8708fe2e8966d7d79b64e186_icgraph.dot create mode 100644 docs/html/namespace_intelli_triangulation_ac150fee67fd41a451bd2592f10e00197_cgraph.dot create mode 100644 docs/html/namespace_intelli_triangulation_ac150fee67fd41a451bd2592f10e00197_icgraph.dot create mode 100644 docs/html/namespace_intelli_triangulation_acdaf1ed598e868b25e9e06d580da32e5_icgraph.dot create mode 100644 docs/html/namespace_intelli_triangulation_af9af549a7faff35a74c1265b290ea0ca_icgraph.dot create mode 100644 docs/html/search/all_11.html create mode 100644 docs/html/search/all_11.js create mode 100644 docs/html/search/defines_0.html create mode 100644 docs/html/search/defines_0.js create mode 100644 docs/html/search/enums_2.html create mode 100644 docs/html/search/enums_2.js create mode 100644 docs/html/search/enumvalues_3.html create mode 100644 docs/html/search/enumvalues_3.js create mode 100644 docs/html/search/enumvalues_4.html create mode 100644 docs/html/search/enumvalues_4.js create mode 100644 docs/html/search/enumvalues_5.html create mode 100644 docs/html/search/enumvalues_5.js create mode 100644 docs/html/search/enumvalues_6.html create mode 100644 docs/html/search/enumvalues_6.js create mode 100644 docs/html/search/functions_e.html create mode 100644 docs/html/search/functions_e.js create mode 100644 docs/html/search/variables_8.html create mode 100644 docs/html/search/variables_8.js diff --git a/docs/html/_intelli_color_picker_8h.html b/docs/html/_intelli_color_picker_8h.html index b04a431..47b8e92 100644 --- a/docs/html/_intelli_color_picker_8h.html +++ b/docs/html/_intelli_color_picker_8h.html @@ -95,16 +95,6 @@ $(document).ready(function(){initNavTree('_intelli_color_picker_8h.html','');});
#include "QColor"
#include "QPoint"
#include "QColorDialog"
-
-Include dependency graph for IntelliColorPicker.h:
-
-
-
-
-This graph shows which files directly or indirectly include this file:
-
-
-
diff --git a/docs/html/_intelli_color_picker_8h_source.html b/docs/html/_intelli_color_picker_8h_source.html index c7df48e..5efb6e4 100644 --- a/docs/html/_intelli_color_picker_8h_source.html +++ b/docs/html/_intelli_color_picker_8h_source.html @@ -103,7 +103,7 @@ $(document).ready(function(){initNavTree('_intelli_color_picker_8h_source.html',
17 
21 virtual ~IntelliColorPicker();
22 
-
26 void switchColors();
+
26 void swapColors();
27 
32 QColor getFirstColor();
33 
@@ -125,10 +125,10 @@ $(document).ready(function(){initNavTree('_intelli_color_picker_8h_source.html',
virtual ~IntelliColorPicker()
IntelliColorPicker destructor clears up his used memory, if there is some.
void setSecondColor(QColor Color)
A function to set the secondary color.
QColor getSecondColor()
A function to read the secondary selected color.
-
void switchColors()
A function switching primary and secondary color.
void setFirstColor(QColor Color)
A function to set the primary color.
QColor getFirstColor()
A function to read the primary selected color.
The IntelliColorPicker manages the selected colors for one whole project.
+
void swapColors()
A function switching primary and secondary color.
IntelliColorPicker()
IntelliColorPicker constructor, setting 2 preset colors, be careful, theese color may change in produ...
-Include dependency graph for IntelliColorPicker.cpp:
-
-
-

Go to the source code of this file.

diff --git a/docs/html/_intelli_helper_2_intelli_color_picker_8cpp_source.html b/docs/html/_intelli_helper_2_intelli_color_picker_8cpp_source.html index 0476d7b..3625595 100644 --- a/docs/html/_intelli_helper_2_intelli_color_picker_8cpp_source.html +++ b/docs/html/_intelli_helper_2_intelli_color_picker_8cpp_source.html @@ -101,7 +101,7 @@ $(document).ready(function(){initNavTree('_intelli_helper_2_intelli_color_picker
9 
10 }
11 
- +
13  std::swap(firstColor, secondColor);
14 }
15 
@@ -125,10 +125,10 @@ $(document).ready(function(){initNavTree('_intelli_helper_2_intelli_color_picker
virtual ~IntelliColorPicker()
IntelliColorPicker destructor clears up his used memory, if there is some.
void setSecondColor(QColor Color)
A function to set the secondary color.
QColor getSecondColor()
A function to read the secondary selected color.
-
void switchColors()
A function switching primary and secondary color.
void setFirstColor(QColor Color)
A function to set the primary color.
QColor getFirstColor()
A function to read the primary selected color.
+
void swapColors()
A function switching primary and secondary color.
IntelliColorPicker()
IntelliColorPicker constructor, setting 2 preset colors, be careful, theese color may change in produ...
diff --git a/docs/html/_intelli_image_8cpp__incl.dot b/docs/html/_intelli_image_8cpp__incl.dot index d9789c3..e551c27 100644 --- a/docs/html/_intelli_image_8cpp__incl.dot +++ b/docs/html/_intelli_image_8cpp__incl.dot @@ -18,7 +18,13 @@ digraph "intelliphoto/src/Image/IntelliImage.cpp" Node7 [label="QWidget",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; Node2 -> Node8 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; Node8 [label="vector",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; + Node2 -> Node9 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node9 [label="IntelliHelper/IntelliTriangulation.h",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_triangulation_8h.html",tooltip=" "]; + Node9 -> Node4 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node9 -> Node8 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node2 -> Node10 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node10 [label="IntelliHelper/IntelliRender\lSettings.h",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_render_settings_8h.html",tooltip=" "]; Node1 -> Node6 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node1 -> Node9 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node9 [label="QPainter",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; + Node1 -> Node11 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node11 [label="QPainter",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; } diff --git a/docs/html/_intelli_image_8cpp_source.html b/docs/html/_intelli_image_8cpp_source.html index b12334b..abbb094 100644 --- a/docs/html/_intelli_image_8cpp_source.html +++ b/docs/html/_intelli_image_8cpp_source.html @@ -94,97 +94,148 @@ $(document).ready(function(){initNavTree('_intelli_image_8cpp_source.html','');}
2 #include <QSize>
3 #include <QPainter>
4 
-
5 IntelliImage::IntelliImage(int weight, int height)
-
6  : imageData(QSize(weight, height), QImage::Format_ARGB32){
-
7  imageData.fill(QColor(255,255,255,255));
-
8 }
-
9 
- -
11 
-
12 }
-
13 
-
14 bool IntelliImage::loadImage(const QString &fileName){
-
15  // Holds the image
-
16  QImage loadedImage;
+
5 IntelliImage::IntelliImage(int width, int height, bool fastRendererOn)
+
6  : imageData(QSize(width, height), fastRendererOn ? QImage::Format_Indexed8 : QImage::Format_ARGB32){
+
7  if(fastRendererOn) {
+
8  imageData = imageData.convertToFormat(QImage::Format_ARGB32);
+
9  }
+
10  imageData.fill(QColor(255,255,255,255));
+
11  if(fastRendererOn) {
+
12  imageData = imageData.convertToFormat(QImage::Format_Indexed8);
+
13  }
+
14  this->fastRenderer = fastRendererOn;
+
15 
+
16 }
17 
-
18  // If the image wasn't loaded leave this function
-
19  if (!loadedImage.load(fileName))
-
20  return false;
+ +
19 
+
20 }
21 
-
22  // scaled Image to size of Layer
-
23  loadedImage = loadedImage.scaled(imageData.size(),Qt::IgnoreAspectRatio);
-
24 
-
25  imageData = loadedImage.convertToFormat(QImage::Format_ARGB32);
-
26  return true;
-
27 }
-
28 
-
29 void IntelliImage::resizeImage(QImage*image, const QSize &newSize){
-
30  // Check if we need to redraw the image
-
31  if (image->size() == newSize)
-
32  return;
-
33 
-
34  // Create a new image to display and fill it with white
-
35  QImage newImage(newSize, QImage::Format_ARGB32);
-
36  newImage.fill(qRgb(255, 255, 255));
-
37 
-
38  // Draw the image
-
39  QPainter painter(&newImage);
-
40  painter.drawImage(QPoint(0, 0), *image);
-
41  *image = newImage;
-
42 }
-
43 
-
44 void IntelliImage::drawPixel(const QPoint &p1, const QColor& color){
-
45  // Used to draw on the widget
-
46  QPainter painter(&imageData);
-
47 
-
48  // Set the current settings for the pen
-
49  painter.setPen(QPen(color, 1, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin));
-
50 
-
51  // Draw a line from the last registered point to the current
-
52  painter.drawPoint(p1);
+
22 bool IntelliImage::loadImage(const QString &filePath){
+
23  // Holds the image
+
24  QImage loadedImage;
+
25 
+
26  // If the image wasn't loaded leave this function
+
27  if (!loadedImage.load(filePath))
+
28  return false;
+
29 
+
30  // scaled Image to size of Layer
+
31  loadedImage = loadedImage.scaled(imageData.size(),Qt::IgnoreAspectRatio);
+
32 
+
33  imageData = loadedImage.convertToFormat(fastRenderer ? QImage::Format_Indexed8 : QImage::Format_ARGB32);
+
34  return true;
+
35 }
+
36 
+
37 void IntelliImage::resizeImage(QImage*image, const QSize &newSize){
+
38  // Check if we need to redraw the image
+
39  if (image->size() == newSize)
+
40  return;
+
41 
+
42  // Create a new image to display and fill it with white
+
43  QImage newImage(newSize, QImage::Format_ARGB32);
+
44  newImage.fill(qRgb(255, 255, 255));
+
45 
+
46  // Draw the image
+
47  QPainter painter(&newImage);
+
48  painter.drawImage(QPoint(0, 0), *image);
+
49  *image = newImage;
+
50  if(fastRenderer) {
+
51  this->imageData = this->imageData.convertToFormat(QImage::Format_Indexed8);
+
52  }
53 }
54 
-
55 void IntelliImage::drawPoint(const QPoint &p1, const QColor& color, const int& penWidth){
-
56  // Used to draw on the widget
-
57  QPainter painter(&imageData);
-
58 
-
59  // Set the current settings for the pen
-
60  painter.setPen(QPen(color, penWidth, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin));
-
61  // Draw a line from the last registered point to the current
-
62  painter.drawPoint(p1);
-
63 }
+
55 void IntelliImage::drawPixel(const QPoint &p1, const QColor& color){
+
56  if(fastRenderer) {
+
57  this->imageData = this->imageData.convertToFormat(QImage::Format_ARGB32);
+
58  }
+
59  // Used to draw on the widget
+
60  QPainter painter(&imageData);
+
61 
+
62  // Set the current settings for the pen
+
63  painter.setPen(QPen(color, 1, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin));
64 
-
65 void IntelliImage::drawLine(const QPoint &p1, const QPoint& p2, const QColor& color, const int& penWidth){
-
66  // Used to draw on the widget
-
67  QPainter painter(&imageData);
-
68 
-
69  // Set the current settings for the pen
-
70  painter.setPen(QPen(color, penWidth, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin));
+
65  // Draw a line from the last registered point to the current
+
66  painter.drawPoint(p1);
+
67  if(fastRenderer) {
+
68  this->imageData = this->imageData.convertToFormat(QImage::Format_Indexed8);
+
69  }
+
70 }
71 
-
72  // Draw a line from the last registered point to the current
-
73  painter.drawLine(p1, p2);
-
74 }
-
75 
-
76 void IntelliImage::drawPlain(const QColor& color){
-
77  imageData.fill(color);
-
78 }
-
79 
-
80 QColor IntelliImage::getPixelColor(QPoint& point){
-
81  return imageData.pixelColor(point);
-
82 }
+
72 void IntelliImage::drawPoint(const QPoint &p1, const QColor& color, const int& penWidth){
+
73  if(fastRenderer) {
+
74  this->imageData = this->imageData.convertToFormat(QImage::Format_ARGB32);
+
75  }
+
76  // Used to draw on the widget
+
77  QPainter painter(&imageData);
+
78 
+
79  // Set the current settings for the pen
+
80  painter.setPen(QPen(color, penWidth, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin));
+
81  // Draw a line from the last registered point to the current
+
82  painter.drawPoint(p1);
+
83  if(fastRenderer) {
+
84  this->imageData = this->imageData.convertToFormat(QImage::Format_Indexed8);
+
85  }
+
86 }
+
87 
+
88 void IntelliImage::drawLine(const QPoint &p1, const QPoint& p2, const QColor& color, const int& penWidth){
+
89  if(fastRenderer) {
+
90  this->imageData = this->imageData.convertToFormat(QImage::Format_ARGB32);
+
91  }
+
92  // Used to draw on the widget
+
93  QPainter painter(&imageData);
+
94 
+
95  // Set the current settings for the pen
+
96  painter.setPen(QPen(color, penWidth, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin));
+
97 
+
98  // Draw a line from the last registered point to the current
+
99  painter.drawLine(p1, p2);
+
100  if(fastRenderer) {
+
101  this->imageData = this->imageData.convertToFormat(QImage::Format_Indexed8);
+
102  }
+
103 }
+
104 
+
105 void IntelliImage::drawPlain(const QColor& color){
+
106  if(fastRenderer) {
+
107  this->imageData = this->imageData.convertToFormat(QImage::Format_ARGB32);
+
108  }
+
109  imageData.fill(color);
+
110  if(fastRenderer) {
+
111  this->imageData = this->imageData.convertToFormat(QImage::Format_Indexed8);
+
112  }
+
113 }
+
114 
+
115 QColor IntelliImage::getPixelColor(QPoint& point){
+
116  if(fastRenderer) {
+
117  QImage copy = this->imageData.convertToFormat(QImage::Format_ARGB32);
+
118  return copy.pixelColor(point);
+
119  }
+
120  return imageData.pixelColor(point);
+
121 }
+
122 
+ +
124  return this->imageData;
+
125 }
+
126 
+
127 void IntelliImage::updateRendererSetting(bool fastRendererOn){
+
128  this->fastRenderer = fastRendererOn;
+
129  this->imageData = this->imageData.convertToFormat(fastRenderer ? QImage::Format_Indexed8 : QImage::Format_ARGB32);
+
130 }
-
virtual void drawLine(const QPoint &p1, const QPoint &p2, const QColor &color, const int &penWidth)
A function that draws A Line between two given Points in a given color.
+
virtual void drawLine(const QPoint &p1, const QPoint &p2, const QColor &color, const int &penWidth)
A function that draws A Line between two given Points in a given color.
-
virtual ~IntelliImage()=0
An Abstract Destructor.
-
virtual void drawPixel(const QPoint &p1, const QColor &color)
A funtcion used to draw a pixel on the Image with the given Color.
-
virtual bool loadImage(const QString &fileName)
A function that loads and sclaes an image to the fitting dimensions.
-
virtual void drawPoint(const QPoint &p1, const QColor &color, const int &penWidth)
A.
-
IntelliImage(int weight, int height)
The Construcor of the IntelliImage. Given the Image dimensions.
Definition: IntelliImage.cpp:5
-
void resizeImage(QImage *image, const QSize &newSize)
-
virtual QColor getPixelColor(QPoint &point)
A function that returns the pixelcolor at a certain point.
-
QImage imageData
The underlying image data.
Definition: IntelliImage.h:32
-
virtual void drawPlain(const QColor &color)
A function that clears the whole image in a given Color.
+
virtual ~IntelliImage()=0
An Abstract Destructor.
+
virtual void drawPixel(const QPoint &p1, const QColor &color)
A funtcion used to draw a pixel on the Image with the given Color.
+
IntelliImage(int width, int height, bool fastRendererOn)
The Construcor of the IntelliImage. Given the Image dimensions.
Definition: IntelliImage.cpp:5
+
virtual void drawPoint(const QPoint &p1, const QColor &color, const int &penWidth)
A.
+
virtual void updateRendererSetting(bool fastRendererOn)
updateRendererSetting updates the existing image format to the new format.
+
virtual QImage getImageData()
getImageData returns the data of the current image.
+
void resizeImage(QImage *image, const QSize &newSize)
+
virtual QColor getPixelColor(QPoint &point)
A function that returns the pixelcolor at a certain point.
+
bool fastRenderer
fastRenderer is the flag that represents the usage of 8bit pictures.
Definition: IntelliImage.h:47
+
QImage imageData
The underlying image data.
Definition: IntelliImage.h:37
+
virtual bool loadImage(const QString &filePath)
A function that loads and sclaes an image to the fitting dimensions.
+
virtual void drawPlain(const QColor &color)
A function that clears the whole image in a given Color.
@@ -99,16 +98,8 @@ $(document).ready(function(){initNavTree('_intelli_image_8h.html','');}); #include <QSize>
#include <QWidget>
#include <vector>
-
-Include dependency graph for IntelliImage.h:
-
-
-
-
-This graph shows which files directly or indirectly include this file:
-
-
-
+#include "IntelliHelper/IntelliTriangulation.h"
+#include "IntelliHelper/IntelliRenderSettings.h"

Go to the source code of this file.

@@ -117,46 +108,7 @@ Classes -
class  IntelliImage
 An abstract class which manages the basic IntelliImage operations. More...
 
- - - -

-Enumerations

enum  ImageType { ImageType::Raster_Image, -ImageType::Shaped_Image - }
 The Types, which an Image can be. More...
 
-

Enumeration Type Documentation

- -

◆ ImageType

- -
-
- - - - - -
- - - - -
enum ImageType
-
-strong
-
- -

The Types, which an Image can be.

- - - -
Enumerator
Raster_Image 
Shaped_Image 
- -

Definition at line 14 of file IntelliImage.h.

- -
-
diff --git a/docs/html/_intelli_image_8h__incl.dot b/docs/html/_intelli_image_8h__incl.dot index df22951..39d5fcc 100644 --- a/docs/html/_intelli_image_8h__incl.dot +++ b/docs/html/_intelli_image_8h__incl.dot @@ -16,4 +16,10 @@ digraph "intelliphoto/src/Image/IntelliImage.h" Node6 [label="QWidget",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; Node1 -> Node7 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; Node7 [label="vector",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; + Node1 -> Node8 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node8 [label="IntelliHelper/IntelliTriangulation.h",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_triangulation_8h.html",tooltip=" "]; + Node8 -> Node3 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node8 -> Node7 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node1 -> Node9 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node9 [label="IntelliHelper/IntelliRender\lSettings.h",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_render_settings_8h.html",tooltip=" "]; } diff --git a/docs/html/_intelli_image_8h_source.html b/docs/html/_intelli_image_8h_source.html index 45206cb..ebcec11 100644 --- a/docs/html/_intelli_image_8h_source.html +++ b/docs/html/_intelli_image_8h_source.html @@ -100,74 +100,100 @@ $(document).ready(function(){initNavTree('_intelli_image_8h_source.html','');});
8 #include <QWidget>
9 #include <vector>
10 
-
14 enum class ImageType {
- - -
17 };
-
18 
-
19 class IntelliTool;
-
20 
-
24 class IntelliImage {
-
25 friend IntelliTool;
-
26 protected:
-
27 void resizeImage(QImage*image, const QSize &newSize);
-
28 
-
32 QImage imageData;
-
33 public:
-
39 IntelliImage(int weight, int height);
-
40 
-
44 virtual ~IntelliImage() = 0;
-
45 
-
46 
-
52 virtual void drawPixel(const QPoint &p1, const QColor& color);
-
53 
-
61 virtual void drawLine(const QPoint &p1, const QPoint& p2, const QColor& color, const int& penWidth);
+ + +
13 
+
14 class IntelliTool;
+
15 
+
19 class IntelliImage {
+
20 friend IntelliTool;
+
21 public:
+
22 
+
26 enum class ImageType {
+ + +
29 };
+
30 
+
31 protected:
+
32 void resizeImage(QImage*image, const QSize &newSize);
+
33 
+
37 QImage imageData;
+
38 
+ +
43 
+ +
48 
+
49 public:
+
56 IntelliImage(int width, int height, bool fastRendererOn);
+
57 
+
61 virtual ~IntelliImage() = 0;
62 
-
69 virtual void drawPoint(const QPoint &p1, const QColor& color, const int& penWidth);
+
63 
+
69 virtual void drawPixel(const QPoint &p1, const QColor& color);
70 
-
75 virtual void drawPlain(const QColor& color);
-
76 
-
83 virtual QImage getDisplayable(const QSize& displaySize, int alpha) = 0;
-
84 
-
90 virtual QImage getDisplayable(int alpha=255) = 0;
-
91 
-
96 virtual IntelliImage* getDeepCopy() = 0;
-
97 
-
101 virtual void calculateVisiblity() = 0;
-
102 
-
107 virtual void setPolygon(const std::vector<QPoint>& polygonData) = 0;
+
78 virtual void drawLine(const QPoint &p1, const QPoint& p2, const QColor& color, const int& penWidth);
+
79 
+
86 virtual void drawPoint(const QPoint &p1, const QColor& color, const int& penWidth);
+
87 
+
92 virtual void drawPlain(const QColor& color);
+
93 
+
100 virtual QImage getDisplayable(const QSize& displaySize, int alpha) = 0;
+
101 
+
107 virtual QImage getDisplayable(int alpha=255) = 0;
108 
-
113 virtual std::vector<QPoint> getPolygonData(){
-
114  return std::vector<QPoint>();
-
115 }
-
116 
-
122 virtual bool loadImage(const QString &fileName);
-
123 
-
129 virtual QColor getPixelColor(QPoint& point);
-
130 };
-
131 
-
132 #endif
+
113 virtual IntelliImage* getDeepCopy() = 0;
+
114 
+
118 virtual void calculateVisiblity() = 0;
+
119 
+
124 virtual void setPolygon(const std::vector<QPoint>& polygonData) = 0;
+
125 
+
130 virtual std::vector<QPoint> getPolygonData(){
+
131  return std::vector<QPoint>();
+
132 }
+
133 
+ +
135  return TypeOfImage;
+
136 }
+
137 
+
143 virtual bool loadImage(const QString &filePath);
+
144 
+
150 virtual QColor getPixelColor(QPoint& point);
+
151 
+
156 virtual void updateRendererSetting(bool fastRendererOn);
+
157 
+
161 virtual QImage getImageData();
+
162 
+
163 };
+
164 
+
165 #endif
-
ImageType
The Types, which an Image can be.
Definition: IntelliImage.h:14
-
virtual void drawLine(const QPoint &p1, const QPoint &p2, const QColor &color, const int &penWidth)
A function that draws A Line between two given Points in a given color.
-
virtual ~IntelliImage()=0
An Abstract Destructor.
-
virtual void drawPixel(const QPoint &p1, const QColor &color)
A funtcion used to draw a pixel on the Image with the given Color.
-
virtual bool loadImage(const QString &fileName)
A function that loads and sclaes an image to the fitting dimensions.
+
virtual void drawLine(const QPoint &p1, const QPoint &p2, const QColor &color, const int &penWidth)
A function that draws A Line between two given Points in a given color.
+
virtual ~IntelliImage()=0
An Abstract Destructor.
+ +
virtual void drawPixel(const QPoint &p1, const QColor &color)
A funtcion used to draw a pixel on the Image with the given Color.
virtual QImage getDisplayable(const QSize &displaySize, int alpha)=0
A function returning the displayable ImageData in a requested transparence and size.
- -
virtual std::vector< QPoint > getPolygonData()
A function that returns the Polygondata if existent.
Definition: IntelliImage.h:113
-
virtual void drawPoint(const QPoint &p1, const QColor &color, const int &penWidth)
A.
-
IntelliImage(int weight, int height)
The Construcor of the IntelliImage. Given the Image dimensions.
Definition: IntelliImage.cpp:5
-
An abstract class that manages the basic events, like mouse clicks or scrolls events.
Definition: IntelliTool.h:13
- -
void resizeImage(QImage *image, const QSize &newSize)
-
virtual QColor getPixelColor(QPoint &point)
A function that returns the pixelcolor at a certain point.
-
QImage imageData
The underlying image data.
Definition: IntelliImage.h:32
-
An abstract class which manages the basic IntelliImage operations.
Definition: IntelliImage.h:24
+
virtual ImageType getTypeOfImage()
Definition: IntelliImage.h:134
+
virtual std::vector< QPoint > getPolygonData()
A function that returns the Polygondata if existent.
Definition: IntelliImage.h:130
+
IntelliImage(int width, int height, bool fastRendererOn)
The Construcor of the IntelliImage. Given the Image dimensions.
Definition: IntelliImage.cpp:5
+
virtual void drawPoint(const QPoint &p1, const QColor &color, const int &penWidth)
A.
+
virtual void updateRendererSetting(bool fastRendererOn)
updateRendererSetting updates the existing image format to the new format.
+
An abstract class that manages the basic events, like mouse clicks or scrolls events.
Definition: IntelliTool.h:14
+ +
virtual QImage getImageData()
getImageData returns the data of the current image.
+
void resizeImage(QImage *image, const QSize &newSize)
+
ImageType TypeOfImage
The Type, an Image is.
Definition: IntelliImage.h:42
+
virtual QColor getPixelColor(QPoint &point)
A function that returns the pixelcolor at a certain point.
+
bool fastRenderer
fastRenderer is the flag that represents the usage of 8bit pictures.
Definition: IntelliImage.h:47
+ +
QImage imageData
The underlying image data.
Definition: IntelliImage.h:37
+
virtual bool loadImage(const QString &filePath)
A function that loads and sclaes an image to the fitting dimensions.
+
An abstract class which manages the basic IntelliImage operations.
Definition: IntelliImage.h:19
virtual IntelliImage * getDeepCopy()=0
A function that copys all that returns a [allocated] Image.
virtual void calculateVisiblity()=0
An abstract function that calculates the visiblity of the Image data if needed.
-
virtual void drawPlain(const QColor &color)
A function that clears the whole image in a given Color.
+ +
ImageType
The Types, which an Image can be.
Definition: IntelliImage.h:26
+
virtual void drawPlain(const QColor &color)
A function that clears the whole image in a given Color.
virtual void setPolygon(const std::vector< QPoint > &polygonData)=0
An abstract function that sets the data of the visible Polygon, if needed.
-
#include <QtWidgets>
-#include <QPixmap>
-#include "IntelliPhotoGui.h"
+
#include "IntelliPhotoGui.h"
#include "Layer/PaintingArea.h"
-
-Include dependency graph for IntelliPhotoGui.cpp:
-
-
-

Go to the source code of this file.

diff --git a/docs/html/_intelli_photo_gui_8cpp__incl.dot b/docs/html/_intelli_photo_gui_8cpp__incl.dot index 872329a..8c50d72 100644 --- a/docs/html/_intelli_photo_gui_8cpp__incl.dot +++ b/docs/html/_intelli_photo_gui_8cpp__incl.dot @@ -5,24 +5,24 @@ digraph "intelliphoto/src/GUI/IntelliPhotoGui.cpp" node [fontname="Helvetica",fontsize="10",shape=record]; Node1 [label="intelliphoto/src/GUI\l/IntelliPhotoGui.cpp",height=0.2,width=0.4,color="black", fillcolor="grey75", style="filled", fontcolor="black",tooltip=" "]; Node1 -> Node2 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node2 [label="QtWidgets",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; - Node1 -> Node3 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node3 [label="QPixmap",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; - Node1 -> Node4 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node4 [label="IntelliPhotoGui.h",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_photo_gui_8h.html",tooltip=" "]; - Node4 -> Node5 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node2 [label="IntelliPhotoGui.h",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_photo_gui_8h.html",tooltip=" "]; + Node2 -> Node3 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node3 [label="QtWidgets",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; + Node2 -> Node4 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node4 [label="QPixmap",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; + Node2 -> Node5 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; Node5 [label="QList",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; - Node4 -> Node6 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node2 -> Node6 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; Node6 [label="QMainWindow",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; - Node4 -> Node7 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node2 -> Node7 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; Node7 [label="QGridLayout",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; - Node4 -> Node8 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node2 -> Node8 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; Node8 [label="QPushButton",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; - Node4 -> Node9 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node2 -> Node9 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; Node9 [label="QTextEdit",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; - Node4 -> Node10 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node2 -> Node10 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; Node10 [label="QLabel",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; - Node4 -> Node11 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node2 -> Node11 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; Node11 [label="QLineEdit",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; Node1 -> Node12 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; Node12 [label="Layer/PaintingArea.h",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_painting_area_8h.html",tooltip=" "]; @@ -35,6 +35,7 @@ digraph "intelliphoto/src/GUI/IntelliPhotoGui.cpp" Node12 -> Node16 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; Node16 [label="QWidget",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; Node12 -> Node5 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node12 -> Node2 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; Node12 -> Node17 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; Node17 [label="Image/IntelliImage.h",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_image_8h.html",tooltip=" "]; Node17 -> Node14 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; @@ -45,25 +46,29 @@ digraph "intelliphoto/src/GUI/IntelliPhotoGui.cpp" Node17 -> Node16 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; Node17 -> Node19 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; Node19 [label="vector",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; - Node12 -> Node20 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node20 [label="Image/IntelliRasterImage.h",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_raster_image_8h.html",tooltip=" "]; - Node20 -> Node17 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node12 -> Node21 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node21 [label="Image/IntelliShapedImage.h",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_shaped_image_8h.html",tooltip=" "]; - Node21 -> Node20 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node21 -> Node19 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node21 -> Node22 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node22 [label="IntelliHelper/IntelliHelper.h",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_helper_8h.html",tooltip=" "]; - Node22 -> Node15 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node22 -> Node19 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node17 -> Node20 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node20 [label="IntelliHelper/IntelliTriangulation.h",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_triangulation_8h.html",tooltip=" "]; + Node20 -> Node15 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node20 -> Node19 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node17 -> Node21 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node21 [label="IntelliHelper/IntelliRender\lSettings.h",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_render_settings_8h.html",tooltip=" "]; + Node12 -> Node22 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node22 [label="Image/IntelliRasterImage.h",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_raster_image_8h.html",tooltip=" "]; + Node22 -> Node17 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; Node12 -> Node23 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node23 [label="Tool/IntelliTool.h",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_tool_8h.html",tooltip=" "]; - Node23 -> Node24 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node24 [label="IntelliHelper/IntelliColor\lPicker.h",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_color_picker_8h.html",tooltip=" "]; - Node24 -> Node13 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node24 -> Node15 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node24 -> Node25 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node25 [label="QColorDialog",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; + Node23 [label="Image/IntelliShapedImage.h",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_shaped_image_8h.html",tooltip=" "]; + Node23 -> Node22 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; Node23 -> Node19 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; Node12 -> Node24 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node24 [label="Tool/IntelliTool.h",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_tool_8h.html",tooltip=" "]; + Node24 -> Node25 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node25 [label="IntelliHelper/IntelliColor\lPicker.h",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_color_picker_8h.html",tooltip=" "]; + Node25 -> Node13 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node25 -> Node15 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node25 -> Node26 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node26 [label="QColorDialog",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; + Node24 -> Node27 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node27 [label="IntelliHelper/IntelliToolsettings.h",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_toolsettings_8h.html",tooltip=" "]; + Node24 -> Node19 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node12 -> Node25 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; } diff --git a/docs/html/_intelli_photo_gui_8cpp_source.html b/docs/html/_intelli_photo_gui_8cpp_source.html index cd9f204..fab2947 100644 --- a/docs/html/_intelli_photo_gui_8cpp_source.html +++ b/docs/html/_intelli_photo_gui_8cpp_source.html @@ -92,127 +92,127 @@ $(document).ready(function(){initNavTree('_intelli_photo_gui_8cpp_source.html','
Go to the documentation of this file.
1 // ---------- IntelliPhotoGui.cpp ----------
2 
-
3 #include <QtWidgets>
-
4 #include <QPixmap>
+
3 #include "IntelliPhotoGui.h"
+
4 #include "Layer/PaintingArea.h"
5 
-
6 #include "IntelliPhotoGui.h"
-
7 #include "Layer/PaintingArea.h"
-
8 
-
9 // IntelliPhotoGui constructor
- -
11  // create Gui elements and lay them out
-
12  createGui();
-
13  // Create actions
-
14  createActions();
-
15  // create Menus
-
16  createMenus();
-
17  // set style of the gui
-
18  setIntelliStyle();
-
19  // Size the app
-
20  resize(600,600);
-
21  showMaximized();
-
22 
-
23 }
-
24 
-
25 // User tried to close the app
-
26 void IntelliPhotoGui::closeEvent(QCloseEvent*event){
-
27  // If they try to close maybeSave() returns true
-
28  // if no changes have been made and the app closes
-
29  if (maybeSave()) {
-
30  event->accept();
-
31  } else {
-
32  // If there have been changes ignore the event
-
33  event->ignore();
-
34  }
-
35 }
-
36 
-
37 // Check if the current image has been changed and then
-
38 // open a dialog to open a file
-
39 void IntelliPhotoGui::slotOpen(){
-
40  // Check if changes have been made since last save
-
41  // maybeSave() returns true if no changes have been made
-
42  if (maybeSave()) {
-
43 
-
44  // Get the file to open from a dialog
-
45  // tr sets the window title to Open File
-
46  // QDir opens the current dirctory
-
47  QString fileName = QFileDialog::getOpenFileName(this,
-
48  tr("Open File"), QDir::currentPath(), nullptr, nullptr, QFileDialog::DontUseNativeDialog);
-
49 
-
50  // If we have a file name load the image and place
-
51  // it in the paintingArea
-
52  if (!fileName.isEmpty())
-
53  paintingArea->open(fileName);
-
54  }
-
55 }
-
56 
-
57 // Called when the user clicks Save As in the menu
-
58 void IntelliPhotoGui::slotSave(){
-
59  // A QAction represents the action of the user clicking
-
60  QAction*action = qobject_cast<QAction*>(sender());
+
6 // IntelliPhotoGui constructor
+ +
8  // create Gui elements and lay them out
+
9  createGui();
+
10  // Create actions
+
11  createActions();
+
12  // create Menus
+
13  createMenus();
+
14  // set style of the gui
+
15  setIntelliStyle();
+
16  // Size the app
+
17  resize(600,600);
+
18  showMaximized();
+
19  setDefaultToolValue();
+
20 }
+
21 
+
22 // User tried to close the app
+
23 void IntelliPhotoGui::closeEvent(QCloseEvent*event){
+
24  // If they try to close maybeSave() returns true
+
25  // if no changes have been made and the app closes
+
26  if (maybeSave()) {
+
27  event->accept();
+
28  } else {
+
29  // If there have been changes ignore the event
+
30  event->ignore();
+
31  }
+
32 }
+
33 
+
34 // Check if the current image has been changed and then
+
35 // open a dialog to open a file
+
36 void IntelliPhotoGui::slotOpen(){
+
37  // Check if changes have been made since last save
+
38  // maybeSave() returns true if no changes have been made
+
39  if (maybeSave()) {
+
40 
+
41  // Get the file to open from a dialog
+
42  // tr sets the window title to Open File
+
43  // QDir opens the current dirctory
+
44  QString fileName = QFileDialog::getOpenFileName(this,
+
45  tr("Open File"), QDir::currentPath(), nullptr, nullptr, QFileDialog::DontUseNativeDialog);
+
46 
+
47  // If we have a file name load the image and place
+
48  // it in the paintingArea
+
49  if (!fileName.isEmpty())
+
50  paintingArea->open(fileName);
+
51  }
+
52 }
+
53 
+
54 // Called when the user clicks Save As in the menu
+
55 void IntelliPhotoGui::slotSave(){
+
56  // A QAction represents the action of the user clicking
+
57  QAction*action = qobject_cast<QAction*>(sender());
+
58 
+
59  // Stores the array of bytes of the users data
+
60  QByteArray fileFormat = action->data().toByteArray();
61 
-
62  // Stores the array of bytes of the users data
-
63  QByteArray fileFormat = action->data().toByteArray();
-
64 
-
65  // Pass it to be saved
-
66  saveFile(fileFormat);
-
67 }
-
68 
-
69 // Opens a dialog that allows the user to create a New Layer
-
70 void IntelliPhotoGui::slotCreateNewLayer(){
-
71  // Stores button value
-
72  bool ok1, ok2;
-
73 
-
74  // "New Layer" is the title of the window
-
75  // the next tr is the text to display
-
76  // Define the standard Value, min, max, step and ok button
-
77  int width = QInputDialog::getInt(this, tr("New Layer"),
-
78  tr("Width:"),
-
79  200,1, 500, 1, &ok1);
-
80  int height = QInputDialog::getInt(this, tr("New Layer"),
-
81  tr("Height:"),
-
82  200,1, 500, 1, &ok2);
-
83  // Create New Layer
-
84  if (ok1&&ok2)
-
85  {
-
86  int layer = paintingArea->addLayer(width,height,0,0);
-
87  paintingArea->slotActivateLayer(layer);
-
88  }
-
89 }
-
90 
-
91 // Opens a dialog that allows the user to delete a Layer
-
92 void IntelliPhotoGui::slotDeleteLayer(){
-
93  // Stores button value
-
94  bool ok;
-
95 
-
96  // "delete Layer" is the title of the window
-
97  // the next tr is the text to display
-
98  // Define the standard Value, min, max, step and ok button
-
99  int layerNumber = QInputDialog::getInt(this, tr("delete Layer"),
-
100  tr("Number:"),
-
101  1,0, 500, 1, &ok);
-
102  // Create New Layer
-
103  if (ok)
-
104  paintingArea->deleteLayer(layerNumber);
-
105 }
-
106 
-
107 void IntelliPhotoGui::slotSetActiveAlpha(){
-
108  // Stores button value
-
109  bool ok1, ok2;
-
110 
-
111  // "Layer to set on" is the title of the window
-
112  // the next tr is the text to display
-
113  // Define the standard Value, min, max, step and ok button
-
114  int layer = QInputDialog::getInt(this, tr("Layer to set on"),
-
115  tr("Layer:"),
-
116  -1,-1,100,1, &ok1);
-
117  // "New Alpha" is the title of the window
-
118  int alpha = QInputDialog::getInt(this, tr("New Alpha"),
-
119  tr("Alpha:"),
-
120  255,0, 255, 1, &ok2);
-
121  if (ok1&&ok2)
-
122  {
-
123  paintingArea->setAlphaOfLayer(layer,alpha);
+
62  // Pass it to be saved
+
63  saveFile(fileFormat);
+
64 }
+
65 
+
66 // Opens a dialog that allows the user to create a New Layer
+
67 void IntelliPhotoGui::slotCreateNewLayer(){
+
68  // Stores button value
+
69  bool ok1, ok2;
+
70 
+
71  // "New Layer" is the title of the window
+
72  // the next tr is the text to display
+
73  // Define the standard Value, min, max, step and ok button
+
74  int width = QInputDialog::getInt(this, tr("New Layer"),
+
75  tr("Width:"),
+
76  200,1, 500, 1, &ok1);
+
77  int height = QInputDialog::getInt(this, tr("New Layer"),
+
78  tr("Height:"),
+
79  200,1, 500, 1, &ok2);
+
80  // Create New Layer
+
81  if (ok1&&ok2)
+
82  {
+
83  int layer = paintingArea->addLayer(width,height,0,0);
+
84  UpdateGui();
+
85  }
+
86 }
+
87 
+
88 // Opens a dialog that allows the user to delete a Layer
+
89 void IntelliPhotoGui::slotDeleteLayer(){
+
90  // Stores button value
+
91  bool ok;
+
92 
+
93  // "delete Layer" is the title of the window
+
94  // the next tr is the text to display
+
95  // Define the standard Value, min, max, step and ok button
+
96  int layerNumber = QInputDialog::getInt(this, tr("delete Layer"),
+
97  tr("Number:"),
+
98  paintingArea->getNumberOfActiveLayer(),0, 500, 1, &ok);
+
99  // Create New Layer
+
100  if (ok) {
+
101  paintingArea->deleteLayer(layerNumber);
+
102  UpdateGui();
+
103  }
+
104 }
+
105 
+
106 void IntelliPhotoGui::slotSetActiveAlpha(){
+
107  // Stores button value
+
108  bool ok1, ok2;
+
109 
+
110  // "Layer to set on" is the title of the window
+
111  // the next tr is the text to display
+
112  // Define the standard Value, min, max, step and ok button
+
113  int layer = QInputDialog::getInt(this, tr("Layer to set on"),
+
114  tr("Layer:"),
+
115  -1,-1,100,1, &ok1);
+
116  // "New Alpha" is the title of the window
+
117  int alpha = QInputDialog::getInt(this, tr("New Alpha"),
+
118  tr("Alpha:"),
+
119  255,0, 255, 1, &ok2);
+
120  if (ok1&&ok2)
+
121  {
+
122  paintingArea->setLayerAlpha(layer,alpha);
+
123  UpdateGui();
124  }
125 }
126 
@@ -271,351 +271,566 @@ $(document).ready(function(){initNavTree('_intelli_photo_gui_8cpp_source.html','
179  if (ok1&&ok2&&ok3&&ok4)
180  {
181  paintingArea->floodFill(red, green, blue, alpha);
-
182  }
-
183 }
-
184 
-
185 void IntelliPhotoGui::slotSetActiveLayer(){
-
186  // Stores button value
-
187  bool ok1;
-
188 
-
189  // "Layer to set on" is the title of the window
-
190  // the next tr is the text to display
-
191  // Define the standard Value, min, max, step and ok button
-
192  int layer = QInputDialog::getInt(this, tr("Layer to set on"),
-
193  tr("Layer:"),
-
194  -1,0,255,1, &ok1);
-
195  if (ok1)
-
196  {
-
197  paintingArea->setLayerToActive(layer);
-
198  }
-
199 }
-
200 
-
201 void IntelliPhotoGui::slotSetFirstColor(){
-
202  paintingArea->colorPickerSetFirstColor();
-
203 }
-
204 
-
205 void IntelliPhotoGui::slotSetSecondColor(){
-
206  paintingArea->colorPickerSetSecondColor();
-
207 }
-
208 
-
209 void IntelliPhotoGui::slotSwitchColor(){
-
210  paintingArea->colorPickerSwitchColor();
+
182  UpdateGui();
+
183  }
+
184 }
+
185 
+
186 void IntelliPhotoGui::slotSetActiveLayer(){
+
187  // Stores button value
+
188  bool ok1;
+
189 
+
190  // "Layer to set on" is the title of the window
+
191  // the next tr is the text to display
+
192  // Define the standard Value, min, max, step and ok button
+
193  int layer = QInputDialog::getInt(this, tr("Layer to set on"),
+
194  tr("Layer:"),
+
195  -1,0,255,1, &ok1);
+
196  if (ok1)
+
197  {
+
198  paintingArea->setLayerActive(layer);
+
199  UpdateGui();
+
200  }
+
201 }
+
202 
+
203 void IntelliPhotoGui::slotSetFirstColor(){
+
204  paintingArea->colorPickerSetFirstColor();
+
205  UpdateGui();
+
206 }
+
207 
+
208 void IntelliPhotoGui::slotSetSecondColor(){
+
209  paintingArea->colorPickerSetSecondColor();
+
210  UpdateGui();
211 }
212 
-
213 void IntelliPhotoGui::slotCreatePenTool(){
-
214  paintingArea->createPenTool();
-
215 }
-
216 
-
217 void IntelliPhotoGui::slotCreatePlainTool(){
-
218  paintingArea->createPlainTool();
-
219 }
-
220 
-
221 void IntelliPhotoGui::slotCreateLineTool(){
-
222  paintingArea->createLineTool();
-
223 }
-
224 
-
225 void IntelliPhotoGui::slotCreateRectangleTool(){
-
226  paintingArea->createRectangleTool();
-
227 }
-
228 
-
229 void IntelliPhotoGui::slotCreateCircleTool(){
-
230  paintingArea->createCircleTool();
+
213 void IntelliPhotoGui::slotSwapColor(){
+
214  paintingArea->colorPickerSwapColors();
+
215  UpdateGui();
+
216 }
+
217 
+
218 void IntelliPhotoGui::slotCreatePenTool(){
+
219  PenButton->setChecked(true);
+
220  paintingArea->createPenTool();
+
221 }
+
222 
+
223 void IntelliPhotoGui::slotCreatePlainTool(){
+
224  PlainButton->setChecked(true);
+
225  paintingArea->createPlainTool();
+
226 }
+
227 
+
228 void IntelliPhotoGui::slotCreateLineTool(){
+
229  LineButton->setChecked(true);
+
230  paintingArea->createLineTool();
231 }
232 
-
233 void IntelliPhotoGui::slotCreatePolygonTool(){
-
234  paintingArea->createPolygonTool();
-
235 }
-
236 
-
237 void IntelliPhotoGui::slotCreateFloodFillTool(){
-
238  paintingArea->createFloodFillTool();
-
239 }
-
240 
-
241 // Open an about dialog
-
242 void IntelliPhotoGui::slotAboutDialog(){
-
243  // Window title and text to display
-
244  QMessageBox::about(this, tr("About Painting"),
-
245  tr("<p><b>IntelliPhoto</b>Pretty basic editor.</p>"));
+
233 void IntelliPhotoGui::slotCreateRectangleTool(){
+
234  RectangleButton->setChecked(true);
+
235  paintingArea->createRectangleTool();
+
236 }
+
237 
+
238 void IntelliPhotoGui::slotCreateCircleTool(){
+
239  CircleButton->setChecked(true);
+
240  paintingArea->createCircleTool();
+
241 }
+
242 
+
243 void IntelliPhotoGui::slotCreatePolygonTool(){
+
244  PolygonButton->setChecked(true);
+
245  paintingArea->createPolygonTool();
246 }
247 
-
248 // Define menu actions that call functions
-
249 void IntelliPhotoGui::createActions(){
-
250  // Get a list of the supported file formats
-
251  // QImageWriter is used to write images to files
-
252  foreach (QByteArray format, QImageWriter::supportedImageFormats()) {
-
253  QString text = tr("%1...").arg(QString(format).toUpper());
-
254 
-
255  // Create an action for each file format
-
256  QAction*action = new QAction(text, this);
-
257 
-
258  // Set an action for each file format
-
259  action->setData(format);
-
260 
-
261  // When clicked call IntelliPhotoGui::save()
-
262  connect(action, SIGNAL(triggered()), this, SLOT(slotSave()));
-
263 
-
264  // Attach each file format option menu item to Save As
-
265  actionSaveAs.append(action);
-
266  }
-
267 
-
268  //set exporter to actions
-
269  QAction*pngSaveAction = new QAction("PNG-8", this);
-
270  pngSaveAction->setData("PNG");
-
271  // When clicked call IntelliPhotoGui::save()
-
272  connect(pngSaveAction, SIGNAL(triggered()), this, SLOT(slotSave()));
-
273  // Attach each PNG in save Menu
-
274  actionSaveAs.append(pngSaveAction);
-
275 
-
276  // Create exit action and tie to IntelliPhotoGui::close()
-
277  actionExit = new QAction(tr("&Exit"), this);
-
278  actionExit->setShortcuts(QKeySequence::Quit);
-
279  connect(actionExit, SIGNAL(triggered()), this, SLOT(close()));
-
280 
-
281  actionOpen = new QAction(tr("&Open"), this);
-
282  actionOpen->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_O));
-
283  connect(actionOpen, SIGNAL(triggered()), this, SLOT(slotOpen()));
-
284 
-
285  // Create New Layer action and tie to IntelliPhotoGui::newLayer()
-
286  actionCreateNewLayer = new QAction(tr("&New Layer..."), this);
-
287  actionCreateNewLayer->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_N));
-
288  connect(actionCreateNewLayer, SIGNAL(triggered()), this, SLOT(slotCreateNewLayer()));
+
248 void IntelliPhotoGui::slotCreateFloodFillTool(){
+
249  FloodFillButton->setChecked(true);
+
250  paintingArea->createFloodFillTool();
+
251 }
+
252 
+
253 // Open an about dialog
+
254 void IntelliPhotoGui::slotAboutDialog(){
+
255  // Window title and text to display
+
256  QMessageBox::about(this, tr("About Painting"),
+
257  tr("<p><b>IntelliPhoto</b>Pretty basic editor.</p>"));
+
258 }
+
259 
+
260 void IntelliPhotoGui::slotEnterPressed(){
+
261  QString string = EditLineWidth->text();
+
262  if(string.toInt() > 50) {
+
263  EditLineWidth->setText("50");
+
264  }
+
265  paintingArea->Toolsettings.setLineWidth(string.toInt());
+
266  string = EditLineInnerAlpha->text();
+
267  if(string.toInt() > 255) {
+
268  EditLineInnerAlpha->setText("255");
+
269  }
+
270  paintingArea->Toolsettings.setInnerAlpha(string.toInt());
+
271 }
+
272 
+
273 void IntelliPhotoGui::slotResetTools(){
+
274  CircleButton->setChecked(false);
+
275  FloodFillButton->setChecked(false);
+
276  LineButton->setChecked(false);
+
277  PenButton->setChecked(false);
+
278  PlainButton->setChecked(false);
+
279  PolygonButton->setChecked(false);
+
280  RectangleButton->setChecked(false);
+
281 }
+
282 
+
283 // Define menu actions that call functions
+
284 void IntelliPhotoGui::createActions(){
+
285  // Get a list of the supported file formats
+
286  // QImageWriter is used to write images to files
+
287  foreach (QByteArray format, QImageWriter::supportedImageFormats()) {
+
288  QString text = tr("%1...").arg(QString(format).toUpper());
289 
-
290  // Delete New Layer action and tie to IntelliPhotoGui::deleteLayer()
-
291  actionDeleteLayer = new QAction(tr("&Delete Layer..."), this);
-
292  connect(actionDeleteLayer, SIGNAL(triggered()), this, SLOT(slotDeleteLayer()));
-
293 
-
294  actionSetActiveLayer = new QAction(tr("&set Active"), this);
-
295  connect(actionSetActiveLayer, SIGNAL(triggered()), this, SLOT(slotSetActiveLayer()));
-
296 
-
297  actionSetActiveAlpha = new QAction(tr("&set Alpha"), this);
-
298  connect(actionSetActiveAlpha, SIGNAL(triggered()), this, SLOT(slotSetActiveAlpha()));
-
299 
-
300  actionMovePositionUp = new QAction(tr("&move Up"), this);
-
301  actionMovePositionUp->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_Up));
-
302  connect(actionMovePositionUp, SIGNAL(triggered()), this, SLOT(slotPositionMoveUp()));
-
303 
-
304  actionMovePositionDown = new QAction(tr("&move Down"), this);
-
305  actionMovePositionDown->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_Down));
-
306  connect(actionMovePositionDown, SIGNAL(triggered()), this, SLOT(slotPositionMoveDown()));
-
307 
-
308  actionMovePositionLeft = new QAction(tr("&move Left"), this);
-
309  actionMovePositionLeft->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_Left));
-
310  connect(actionMovePositionLeft, SIGNAL(triggered()), this, SLOT(slotPositionMoveLeft()));
-
311 
-
312  actionMovePositionRight = new QAction(tr("&move Right"), this);
-
313  actionMovePositionRight->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_Right));
-
314  connect(actionMovePositionRight, SIGNAL(triggered()), this, SLOT(slotPositionMoveRight()));
+
290  // Create an action for each file format
+
291  QAction*action = new QAction(text, this);
+
292 
+
293  // Set an action for each file format
+
294  action->setData(format);
+
295 
+
296  // When clicked call IntelliPhotoGui::save()
+
297  connect(action, SIGNAL(triggered()), this, SLOT(slotSave()));
+
298 
+
299  // Attach each file format option menu item to Save As
+
300  actionSaveAs.append(action);
+
301  }
+
302 
+
303  //set exporter to actions
+
304  QAction*pngSaveAction = new QAction("PNG-8", this);
+
305  pngSaveAction->setData("PNG");
+
306  // When clicked call IntelliPhotoGui::save()
+
307  connect(pngSaveAction, SIGNAL(triggered()), this, SLOT(slotSave()));
+
308  // Attach each PNG in save Menu
+
309  actionSaveAs.append(pngSaveAction);
+
310 
+
311  // Create exit action and tie to IntelliPhotoGui::close()
+
312  actionExit = new QAction(tr("&Exit"), this);
+
313  actionExit->setShortcuts(QKeySequence::Quit);
+
314  connect(actionExit, SIGNAL(triggered()), this, SLOT(close()));
315 
-
316  actionMoveLayerUp = new QAction(tr("&move Layer Up"), this);
-
317  actionMoveLayerUp->setShortcut(QKeySequence(Qt::CTRL + Qt::ALT + Qt::Key_Up));
-
318  connect(actionMoveLayerUp, SIGNAL(triggered()), this, SLOT(slotMoveLayerUp()));
+
316  actionOpen = new QAction(tr("&Open"), this);
+
317  actionOpen->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_O));
+
318  connect(actionOpen, SIGNAL(triggered()), this, SLOT(slotOpen()));
319 
-
320  actionMoveLayerDown= new QAction(tr("&move Layer Down"), this);
-
321  actionMoveLayerDown->setShortcut(QKeySequence(Qt::CTRL + Qt::ALT + Qt::Key_Down));
-
322  connect(actionMoveLayerDown, SIGNAL(triggered()), this, SLOT(slotMoveLayerDown()));
-
323 
-
324  //Create Color Actions here
-
325  actionColorPickerFirstColor = new QAction(tr("&Main"), this);
-
326  connect(actionColorPickerFirstColor, SIGNAL(triggered()), this, SLOT(slotSetFirstColor()));
-
327 
-
328  actionColorPickerSecondColor = new QAction(tr("&Secondary"), this);
-
329  connect(actionColorPickerSecondColor, SIGNAL(triggered()), this, SLOT(slotSetSecondColor()));
-
330 
-
331  actionColorSwitch = new QAction(tr("&Switch"), this);
-
332  actionColorSwitch->setShortcut(QKeySequence(Qt::CTRL + Qt::SHIFT + Qt::Key_S));
-
333  connect(actionColorSwitch, SIGNAL(triggered()), this, SLOT(slotSwitchColor()));
+
320  // Create New Layer action and tie to IntelliPhotoGui::newLayer()
+
321  actionCreateNewLayer = new QAction(tr("&New Layer..."), this);
+
322  actionCreateNewLayer->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_N));
+
323  connect(actionCreateNewLayer, SIGNAL(triggered()), this, SLOT(slotCreateNewLayer()));
+
324 
+
325  // Delete New Layer action and tie to IntelliPhotoGui::deleteLayer()
+
326  actionDeleteLayer = new QAction(tr("&Delete Layer..."), this);
+
327  connect(actionDeleteLayer, SIGNAL(triggered()), this, SLOT(slotDeleteLayer()));
+
328 
+
329  actionSetActiveLayer = new QAction(tr("&set Active"), this);
+
330  connect(actionSetActiveLayer, SIGNAL(triggered()), this, SLOT(slotSetActiveLayer()));
+
331 
+
332  actionSetActiveAlpha = new QAction(tr("&set Alpha"), this);
+
333  connect(actionSetActiveAlpha, SIGNAL(triggered()), this, SLOT(slotSetActiveAlpha()));
334 
-
335  //Create Tool actions down here
-
336  actionCreatePlainTool = new QAction(tr("&Plain"), this);
-
337  connect(actionCreatePlainTool, SIGNAL(triggered()), this, SLOT(slotCreatePlainTool()));
+
335  actionMovePositionUp = new QAction(tr("&move Up"), this);
+
336  actionMovePositionUp->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_Up));
+
337  connect(actionMovePositionUp, SIGNAL(triggered()), this, SLOT(slotPositionMoveUp()));
338 
-
339  actionCreatePenTool = new QAction(tr("&Pen"),this);
-
340  connect(actionCreatePenTool, SIGNAL(triggered()), this, SLOT(slotCreatePenTool()));
-
341 
-
342  actionCreateLineTool = new QAction(tr("&Line"), this);
-
343  connect(actionCreateLineTool, SIGNAL(triggered()), this, SLOT(slotCreateLineTool()));
-
344 
-
345  actionCreateCircleTool = new QAction(tr("&Circle"), this);
-
346  connect(actionCreateCircleTool, SIGNAL(triggered()), this, SLOT(slotCreateCircleTool()));
-
347 
-
348  actionCreateRectangleTool = new QAction(tr("&Rectangle"), this);
-
349  connect(actionCreateRectangleTool, SIGNAL(triggered()), this, SLOT(slotCreateRectangleTool()));
+
339  actionMovePositionDown = new QAction(tr("&move Down"), this);
+
340  actionMovePositionDown->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_Down));
+
341  connect(actionMovePositionDown, SIGNAL(triggered()), this, SLOT(slotPositionMoveDown()));
+
342 
+
343  actionMovePositionLeft = new QAction(tr("&move Left"), this);
+
344  actionMovePositionLeft->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_Left));
+
345  connect(actionMovePositionLeft, SIGNAL(triggered()), this, SLOT(slotPositionMoveLeft()));
+
346 
+
347  actionMovePositionRight = new QAction(tr("&move Right"), this);
+
348  actionMovePositionRight->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_Right));
+
349  connect(actionMovePositionRight, SIGNAL(triggered()), this, SLOT(slotPositionMoveRight()));
350 
-
351  actionCreatePolygonTool = new QAction(tr("&Polygon"), this);
-
352  connect(actionCreatePolygonTool, SIGNAL(triggered()), this, SLOT(slotCreatePolygonTool()));
-
353 
-
354  actionCreateFloodFillTool = new QAction(tr("&FloodFill"), this);
-
355  connect(actionCreateFloodFillTool, SIGNAL(triggered()), this, SLOT(slotCreateFloodFillTool()));
-
356 
-
357  // Create about action and tie to IntelliPhotoGui::about()
-
358  actionAboutDialog = new QAction(tr("&About"), this);
-
359  connect(actionAboutDialog, SIGNAL(triggered()), this, SLOT(slotAboutDialog()));
-
360 
-
361  // Create about Qt action and tie to IntelliPhotoGui::aboutQt()
-
362  actionAboutQtDialog = new QAction(tr("About &Qt"), this);
-
363  connect(actionAboutQtDialog, SIGNAL(triggered()), qApp, SLOT(aboutQt()));
-
364 }
-
365 
-
366 // Create the menubar
-
367 void IntelliPhotoGui::createMenus(){
-
368  // Create Save As option and the list of file types
-
369  saveAsMenu = new QMenu(tr("&Save As"), this);
-
370  foreach (QAction *action, actionSaveAs)
-
371  saveAsMenu->addAction(action);
+
351  actionMoveLayerUp = new QAction(tr("&move Layer Up"), this);
+
352  actionMoveLayerUp->setShortcut(QKeySequence(Qt::CTRL + Qt::ALT + Qt::Key_Up));
+
353  connect(actionMoveLayerUp, SIGNAL(triggered()), this, SLOT(slotMoveLayerUp()));
+
354 
+
355  actionMoveLayerDown= new QAction(tr("&move Layer Down"), this);
+
356  actionMoveLayerDown->setShortcut(QKeySequence(Qt::CTRL + Qt::ALT + Qt::Key_Down));
+
357  connect(actionMoveLayerDown, SIGNAL(triggered()), this, SLOT(slotMoveLayerDown()));
+
358 
+
359  //Create Color Actions here
+
360  actionColorPickerFirstColor = new QAction(tr("&Main"), this);
+
361  connect(actionColorPickerFirstColor, SIGNAL(triggered()), this, SLOT(slotSetFirstColor()));
+
362  connect(FirstColorButton, SIGNAL(clicked()), this, SLOT(slotSetFirstColor()));
+
363 
+
364  actionColorPickerSecondColor = new QAction(tr("&Secondary"), this);
+
365  connect(actionColorPickerSecondColor, SIGNAL(triggered()), this, SLOT(slotSetSecondColor()));
+
366  connect(SecondColorButton, SIGNAL(clicked()), this, SLOT(slotSetSecondColor()));
+
367 
+
368  actionColorSwap = new QAction(tr("&Switch"), this);
+
369  actionColorSwap->setShortcut(QKeySequence(Qt::CTRL + Qt::SHIFT + Qt::Key_S));
+
370  connect(actionColorSwap, SIGNAL(triggered()), this, SLOT(slotSwapColor()));
+
371  connect(SwitchColorButton, SIGNAL(clicked()), this, SLOT(slotSwapColor()));
372 
-
373 
-
374  // Attach all actions to File
-
375  fileMenu = new QMenu(tr("&File"), this);
-
376  fileMenu->addAction(actionOpen);
-
377  fileMenu->addMenu(saveAsMenu);
-
378  fileMenu->addSeparator();
-
379  fileMenu->addAction(actionExit);
-
380 
-
381  // Attach all actions to Options
-
382  optionMenu = new QMenu(tr("&Options"), this);
-
383  optionMenu->addAction(actionSetActiveLayer);
-
384  optionMenu->addAction(actionSetActiveAlpha);
-
385  optionMenu->addAction(actionMovePositionUp);
-
386  optionMenu->addAction(actionMovePositionDown);
-
387  optionMenu->addAction(actionMovePositionLeft);
-
388  optionMenu->addAction(actionMovePositionRight);
-
389  optionMenu->addAction(actionMoveLayerUp);
-
390  optionMenu->addAction(actionMoveLayerDown);
-
391 
-
392  // Attach all actions to Layer
-
393  layerMenu = new QMenu(tr("&Layer"), this);
-
394  layerMenu->addAction(actionCreateNewLayer);
-
395  layerMenu->addAction(actionDeleteLayer);
-
396 
-
397  //Attach all Color Options
-
398  colorMenu = new QMenu(tr("&Color"), this);
-
399  colorMenu->addAction(actionColorPickerFirstColor);
-
400  colorMenu->addAction(actionColorPickerSecondColor);
-
401  colorMenu->addAction(actionColorSwitch);
+
373  //Create Tool actions down here
+
374  actionCreatePlainTool = new QAction(tr("&Plain"), this);
+
375  connect(actionCreatePlainTool, SIGNAL(triggered()), this, SLOT(slotResetTools()));
+
376  connect(actionCreatePlainTool, SIGNAL(triggered()), this, SLOT(slotCreatePlainTool()));
+
377 
+
378 
+
379  actionCreatePenTool = new QAction(tr("&Pen"),this);
+
380  connect(actionCreatePenTool, SIGNAL(triggered()), this, SLOT(slotResetTools()));
+
381  connect(actionCreatePenTool, SIGNAL(triggered()), this, SLOT(slotCreatePenTool()));
+
382 
+
383  actionCreateLineTool = new QAction(tr("&Line"), this);
+
384  connect(actionCreateLineTool, SIGNAL(triggered()), this, SLOT(slotResetTools()));
+
385  connect(actionCreateLineTool, SIGNAL(triggered()), this, SLOT(slotCreateLineTool()));
+
386 
+
387  actionCreateCircleTool = new QAction(tr("&Circle"), this);
+
388  connect(actionCreateCircleTool, SIGNAL(triggered()), this, SLOT(slotResetTools()));
+
389  connect(actionCreateCircleTool, SIGNAL(triggered()), this, SLOT(slotCreateCircleTool()));
+
390 
+
391  actionCreateRectangleTool = new QAction(tr("&Rectangle"), this);
+
392  connect(actionCreateRectangleTool, SIGNAL(triggered()), this, SLOT(slotResetTools()));
+
393  connect(actionCreateRectangleTool, SIGNAL(triggered()), this, SLOT(slotCreateRectangleTool()));
+
394 
+
395  actionCreatePolygonTool = new QAction(tr("&Polygon"), this);
+
396  connect(actionCreatePolygonTool, SIGNAL(triggered()), this, SLOT(slotResetTools()));
+
397  connect(actionCreatePolygonTool, SIGNAL(triggered()), this, SLOT(slotCreatePolygonTool()));
+
398 
+
399  actionCreateFloodFillTool = new QAction(tr("&FloodFill"), this);
+
400  connect(actionCreateFloodFillTool, SIGNAL(triggered()), this, SLOT(slotResetTools()));
+
401  connect(actionCreateFloodFillTool, SIGNAL(triggered()), this, SLOT(slotCreateFloodFillTool()));
402 
-
403  //Attach all Tool Options
-
404  toolMenu = new QMenu(tr("&Tools"), this);
-
405  toolMenu->addAction(actionCreatePenTool);
-
406  toolMenu->addAction(actionCreatePlainTool);
-
407  toolMenu->addAction(actionCreateLineTool);
-
408  toolMenu->addAction(actionCreateRectangleTool);
-
409  toolMenu->addAction(actionCreateCircleTool);
-
410  toolMenu->addAction(actionCreatePolygonTool);
-
411  toolMenu->addAction(actionCreateFloodFillTool);
-
412  toolMenu->addSeparator();
-
413  toolMenu->addMenu(colorMenu);
-
414 
-
415  // Attach all actions to Help
-
416  helpMenu = new QMenu(tr("&Help"), this);
-
417  helpMenu->addAction(actionAboutDialog);
-
418  helpMenu->addAction(actionAboutQtDialog);
+
403  // Create about action and tie to IntelliPhotoGui::about()
+
404  actionAboutDialog = new QAction(tr("&About"), this);
+
405  connect(actionAboutDialog, SIGNAL(triggered()), this, SLOT(slotAboutDialog()));
+
406 
+
407  // Create about Qt action and tie to IntelliPhotoGui::aboutQt()
+
408  actionAboutQtDialog = new QAction(tr("About &Qt"), this);
+
409  connect(actionAboutQtDialog, SIGNAL(triggered()), qApp, SLOT(aboutQt()));
+
410 
+
411  connect(EditLineWidth, SIGNAL(returnPressed()), this, SLOT(slotEnterPressed()));
+
412  connect(EditLineInnerAlpha, SIGNAL(returnPressed()), this, SLOT(slotEnterPressed()));
+
413 
+
414  connect(CircleButton,SIGNAL(pressed()), this, SLOT(slotResetTools()));
+
415  connect(CircleButton, SIGNAL(clicked()), this, SLOT(slotCreateCircleTool()));
+
416 
+
417  connect(FloodFillButton,SIGNAL(pressed()), this, SLOT(slotResetTools()));
+
418  connect(FloodFillButton, SIGNAL(clicked()), this, SLOT(slotCreateFloodFillTool()));
419 
-
420  // Add menu items to the menubar
-
421  menuBar()->addMenu(fileMenu);
-
422  menuBar()->addMenu(optionMenu);
-
423  menuBar()->addMenu(layerMenu);
-
424  menuBar()->addMenu(toolMenu);
-
425  menuBar()->addMenu(helpMenu);
-
426 }
-
427 
-
428 void IntelliPhotoGui::createGui(){
-
429  // create a central widget to work on
-
430  centralGuiWidget = new QWidget(this);
-
431  setCentralWidget(centralGuiWidget);
-
432 
-
433  // create the grid for the layout
-
434  mainLayout = new QGridLayout(centralGuiWidget);
-
435  centralGuiWidget->setLayout(mainLayout);
-
436 
-
437  // create Gui elements
-
438  paintingArea = new PaintingArea();
-
439 
-
440  // set gui elements
-
441  mainLayout->addWidget(paintingArea);
-
442 }
+
420  connect(LineButton,SIGNAL(pressed()), this, SLOT(slotResetTools()));
+
421  connect(LineButton, SIGNAL(clicked()), this, SLOT(slotCreateLineTool()));
+
422 
+
423  connect(PenButton,SIGNAL(pressed()), this, SLOT(slotResetTools()));
+
424  connect(PenButton, SIGNAL(clicked()), this, SLOT(slotCreatePenTool()));
+
425 
+
426  connect(PlainButton,SIGNAL(pressed()), this, SLOT(slotResetTools()));
+
427  connect(PlainButton, SIGNAL(clicked()), this, SLOT(slotCreatePlainTool()));
+
428 
+
429  connect(PolygonButton,SIGNAL(pressed()), this, SLOT(slotResetTools()));
+
430  connect(PolygonButton, SIGNAL(clicked()), this, SLOT(slotCreatePolygonTool()));
+
431 
+
432  connect(RectangleButton,SIGNAL(pressed()), this, SLOT(slotResetTools()));
+
433  connect(RectangleButton, SIGNAL(clicked()), this, SLOT(slotCreateRectangleTool()));
+
434 }
+
435 
+
436 // Create the menubar
+
437 void IntelliPhotoGui::createMenus(){
+
438  // Create Save As option and the list of file types
+
439  saveAsMenu = new QMenu(tr("&Save As"), this);
+
440  foreach (QAction *action, actionSaveAs)
+
441  saveAsMenu->addAction(action);
+
442 
443 
-
444 void IntelliPhotoGui::setIntelliStyle(){
-
445  // Set the title
-
446  setWindowTitle("IntelliPhoto Prototype");
-
447  // Set style sheet
-
448  this->setStyleSheet("background-color:rgb(64,64,64)");
-
449  this->centralGuiWidget->setStyleSheet("color:rgb(255,255,255)");
-
450  this->menuBar()->setStyleSheet("color:rgb(255,255,255)");
-
451 }
-
452 
-
453 bool IntelliPhotoGui::maybeSave(){
-
454  // Check for changes since last save
-
455 
-
456  // TODO insert variable for modified status here to make an save exit message
-
457  if (false) {
-
458  QMessageBox::StandardButton ret;
-
459 
-
460  // Painting is the title of the window
-
461  // Add text and the buttons
-
462  ret = QMessageBox::warning(this, tr("Painting"),
-
463  tr("The image has been modified.\n"
-
464  "Do you want to save your changes?"),
-
465  QMessageBox::Save | QMessageBox::Discard
-
466  | QMessageBox::Cancel);
-
467 
-
468  // If save button clicked call for file to be saved
-
469  if (ret == QMessageBox::Save) {
-
470  return saveFile("png");
-
471 
-
472  // If cancel do nothing
-
473  } else if (ret == QMessageBox::Cancel) {
-
474  return false;
-
475  }
-
476  }
-
477  return true;
-
478 }
-
479 
-
480 bool IntelliPhotoGui::saveFile(const QByteArray &fileFormat){
-
481  // Define path, name and default file type
-
482  QString initialPath = QDir::currentPath() + "/untitled." + fileFormat;
-
483 
-
484  // Get selected file from dialog
-
485  // Add the proper file formats and extensions
-
486  QString fileName = QFileDialog::getSaveFileName(this, tr("Save As"),
-
487  initialPath,
-
488  tr("%1 Files (*.%2);;All Files (*)")
-
489  .arg(QString::fromLatin1(fileFormat.toUpper()))
-
490  .arg(QString::fromLatin1(fileFormat)), nullptr, QFileDialog::DontUseNativeDialog);
-
491 
-
492  // If no file do nothing
-
493  if (fileName.isEmpty()) {
-
494  return false;
-
495  } else {
-
496  // Call for the file to be saved
-
497  return paintingArea->save(fileName, fileFormat.constData());
-
498  }
-
499 }
+
444  // Attach all actions to File
+
445  fileMenu = new QMenu(tr("&File"), this);
+
446  fileMenu->addAction(actionOpen);
+
447  fileMenu->addMenu(saveAsMenu);
+
448  fileMenu->addSeparator();
+
449  fileMenu->addAction(actionExit);
+
450 
+
451  // Attach all actions to Options
+
452  optionMenu = new QMenu(tr("&Options"), this);
+
453  optionMenu->addAction(actionSetActiveLayer);
+
454  optionMenu->addAction(actionSetActiveAlpha);
+
455  optionMenu->addAction(actionMovePositionUp);
+
456  optionMenu->addAction(actionMovePositionDown);
+
457  optionMenu->addAction(actionMovePositionLeft);
+
458  optionMenu->addAction(actionMovePositionRight);
+
459  optionMenu->addAction(actionMoveLayerUp);
+
460  optionMenu->addAction(actionMoveLayerDown);
+
461 
+
462  // Attach all actions to Layer
+
463  layerMenu = new QMenu(tr("&Layer"), this);
+
464  layerMenu->addAction(actionCreateNewLayer);
+
465  layerMenu->addAction(actionDeleteLayer);
+
466 
+
467  //Attach all Color Options
+
468  colorMenu = new QMenu(tr("&Color"), this);
+
469  colorMenu->addAction(actionColorPickerFirstColor);
+
470  colorMenu->addAction(actionColorPickerSecondColor);
+
471  colorMenu->addAction(actionColorSwap);
+
472 
+
473  //Attach all Tool Options
+
474  toolMenu = new QMenu(tr("&Tools"), this);
+
475  toolMenu->addAction(actionCreateCircleTool);
+
476  toolMenu->addAction(actionCreateFloodFillTool);
+
477  toolMenu->addAction(actionCreateLineTool);
+
478  toolMenu->addAction(actionCreatePenTool);
+
479  toolMenu->addAction(actionCreatePlainTool);
+
480  toolMenu->addAction(actionCreatePolygonTool);
+
481  toolMenu->addAction(actionCreateRectangleTool);
+
482  toolMenu->addSeparator();
+
483  toolMenu->addMenu(colorMenu);
+
484 
+
485  // Attach all actions to Help
+
486  helpMenu = new QMenu(tr("&Help"), this);
+
487  helpMenu->addAction(actionAboutDialog);
+
488  helpMenu->addAction(actionAboutQtDialog);
+
489 
+
490  // Add menu items to the menubar
+
491  menuBar()->addMenu(fileMenu);
+
492  menuBar()->addMenu(optionMenu);
+
493  menuBar()->addMenu(layerMenu);
+
494  menuBar()->addMenu(toolMenu);
+
495  menuBar()->addMenu(helpMenu);
+
496 }
+
497 
+
498 void IntelliPhotoGui::createGui(){
+
499  // create a central widget to work on
+
500  centralGuiWidget = new QWidget(this);
+
501  setCentralWidget(centralGuiWidget);
+
502 
+
503  // create the grid for the layout
+
504  mainLayout = new QGridLayout(centralGuiWidget);
+
505  centralGuiWidget->setLayout(mainLayout);
+
506 
+
507  // create Gui elements
+
508  paintingArea = new PaintingArea();
+
509  paintingArea->DumpyGui = this;
+
510 
+
511  p = QPixmap(":/Icons/Buttons/icons/circle-tool.svg");
+
512  CircleButton = new QPushButton();
+
513  CircleButton->setFixedSize(Buttonsize);
+
514  CircleButton->setIcon(p);
+
515  CircleButton->setIconSize(Buttonsize);
+
516  CircleButton->setCheckable(true);
+
517 
+
518  p = QPixmap(":/Icons/Buttons/icons/flood-fill-tool.svg");
+
519  FloodFillButton = new QPushButton();
+
520  FloodFillButton->setFixedSize(Buttonsize);
+
521  FloodFillButton->setIcon(p);
+
522  FloodFillButton->setIconSize(Buttonsize);
+
523  FloodFillButton->setCheckable(true);
+
524 
+
525  p = QPixmap(":/Icons/Buttons/icons/icon.png");
+
526  LineButton = new QPushButton();
+
527  LineButton->setFixedSize(Buttonsize);
+
528  LineButton->setIcon(p);
+
529  LineButton->setIconSize(Buttonsize);
+
530  LineButton->setCheckable(true);
+
531 
+
532  p = QPixmap(":/Icons/Buttons/icons/pen-tool.svg");
+
533  PenButton = new QPushButton();
+
534  PenButton->setFixedSize(Buttonsize);
+
535  PenButton->setIcon(p);
+
536  PenButton->setIconSize(Buttonsize);
+
537  PenButton->setCheckable(true);
+
538 
+
539  p = QPixmap(":/Icons/Buttons/icons/icon.png");
+
540  PlainButton = new QPushButton();
+
541  PlainButton->setFixedSize(Buttonsize);
+
542  PlainButton->setIcon(p);
+
543  PlainButton->setIconSize(Buttonsize);
+
544  PlainButton->setCheckable(true);
+
545 
+
546  p = QPixmap(":/Icons/Buttons/icons/polygon-tool.svg");
+
547  PolygonButton = new QPushButton();
+
548  PolygonButton->setFixedSize(Buttonsize);
+
549  PolygonButton->setIcon(p);
+
550  PolygonButton->setIconSize(Buttonsize);
+
551  PolygonButton->setCheckable(true);
+
552 
+
553  p = QPixmap(":/Icons/Buttons/icons/rectangle-tool.svg");
+
554  RectangleButton = new QPushButton();
+
555  RectangleButton->setFixedSize(Buttonsize);
+
556  RectangleButton->setIcon(p);
+
557  RectangleButton->setIconSize(Buttonsize);
+
558  RectangleButton->setCheckable(true);
+
559 
+
560  WidthLine = new QLabel();
+
561  WidthLine->setText("Width");
+
562  WidthLine->setFixedSize(Buttonsize.width(),Buttonsize.height()/3);
+
563 
+
564  EditLineWidth = new QLineEdit();
+
565  EditLineWidth->setFixedSize(Buttonsize.width(),Buttonsize.height()/3);
+
566  EditLineWidth->setText("5");
+
567  ValidatorLineWidth = new QIntValidator();
+
568  ValidatorLineWidth->setTop(99);
+
569  ValidatorLineWidth->setBottom(1);
+
570  EditLineWidth->setValidator(ValidatorLineWidth);
+
571 
+
572  innerAlphaLine = new QLabel();
+
573  innerAlphaLine->setText("Inner Alpha");
+
574  innerAlphaLine->setFixedSize(Buttonsize.width(),Buttonsize.height()/3);
+
575 
+
576  EditLineInnerAlpha = new QLineEdit();
+
577  EditLineInnerAlpha->setFixedSize(Buttonsize.width(),Buttonsize.height()/3);
+
578  EditLineInnerAlpha->setText("255");
+
579  ValidatorInnerAlpha = new QIntValidator();
+
580  ValidatorInnerAlpha->setTop(999);
+
581  ValidatorInnerAlpha->setBottom(0);
+
582  EditLineInnerAlpha->setValidator(ValidatorInnerAlpha);
+
583 
+
584  FirstColorButton = new QPushButton();
+
585  FirstColorButton->setFixedSize(Buttonsize/2);
+
586 
+
587  SecondColorButton = new QPushButton();
+
588  SecondColorButton->setFixedSize(Buttonsize/2);
+
589 
+
590  p = QPixmap(":/Icons/Buttons/icons/Wechselpfeile.png");
+
591  SwitchColorButton = new QPushButton();
+
592  SwitchColorButton->setFixedSize(Buttonsize.width(),Buttonsize.height()/2);
+
593  SwitchColorButton->setIcon(p);
+
594  SwitchColorButton->setIconSize(QSize(Buttonsize.width(),Buttonsize.height()/2));
+
595 
+
596  ActiveLayerLine = new QLabel();
+
597  QString string = QString("Active Layer: %1").arg(paintingArea->getNumberOfActiveLayer());
+
598  ActiveLayerLine->setText(string);
+
599  ActiveLayerLine->setFixedSize(Buttonsize.width()+10,Buttonsize.height()/3);
+
600 
+
601  p = p.fromImage(paintingArea->getImageOfActiveLayer()->getImageData());
+
602 
+
603  ActiveLayerImageButton = new QPushButton();
+
604  ActiveLayerImageButton->setFixedSize(Buttonsize);
+
605  ActiveLayerImageButton->setIcon(p);
+
606  ActiveLayerImageButton->setIconSize(Buttonsize);
+
607 
+
608  // set gui elements
+
609 
+
610  mainLayout->addWidget(paintingArea,1,1,20,1);
+
611  mainLayout->addWidget(CircleButton,1,2,1,2);
+
612  mainLayout->addWidget(FloodFillButton,2,2,1,2);
+
613  mainLayout->addWidget(LineButton,3,2,1,2);
+
614  mainLayout->addWidget(PenButton,4,2,1,2);
+
615  mainLayout->addWidget(PlainButton,5,2,1,2);
+
616  mainLayout->addWidget(PolygonButton,6,2,1,2);
+
617  mainLayout->addWidget(RectangleButton,7,2,1,2);
+
618  mainLayout->addWidget(WidthLine,8,2,1,2);
+
619  mainLayout->addWidget(EditLineWidth,9,2,1,2);
+
620  mainLayout->addWidget(innerAlphaLine,10,2,1,2);
+
621  mainLayout->addWidget(EditLineInnerAlpha,11,2,1,2);
+
622  mainLayout->addWidget(FirstColorButton,12,2,1,1);
+
623  mainLayout->addWidget(SecondColorButton,12,3,1,1);
+
624  mainLayout->addWidget(SwitchColorButton,13,2,1,2);
+
625  mainLayout->addWidget(ActiveLayerLine,14,2,1,2);
+
626  mainLayout->addWidget(ActiveLayerImageButton,15,2,1,2);
+
627 }
+
628 
+
629 void IntelliPhotoGui::setIntelliStyle(){
+
630  // Set the title
+
631  setWindowTitle("IntelliPhoto Prototype");
+
632  // Set style sheet
+
633  this->setStyleSheet("background-color:rgb(64,64,64)");
+
634  this->centralGuiWidget->setStyleSheet("color:rgb(255,255,255)");
+
635  this->menuBar()->setStyleSheet("color:rgb(255,255,255)");
+
636  QString string = QString("background-color: %1").arg(paintingArea->colorPicker.getFirstColor().name());
+
637  FirstColorButton->setStyleSheet(string);
+
638  string = QString("background-color: %1").arg(paintingArea->colorPicker.getSecondColor().name());
+
639  SecondColorButton->setStyleSheet(string);
+
640 }
+
641 
+
642 bool IntelliPhotoGui::maybeSave(){
+
643  // Check for changes since last save
+
644 
+
645  // TODO insert variable for modified status here to make an save exit message
+
646  if (false) {
+
647  QMessageBox::StandardButton ret;
+
648 
+
649  // Painting is the title of the window
+
650  // Add text and the buttons
+
651  ret = QMessageBox::warning(this, tr("Painting"),
+
652  tr("The image has been modified.\n"
+
653  "Do you want to save your changes?"),
+
654  QMessageBox::Save | QMessageBox::Discard
+
655  | QMessageBox::Cancel);
+
656 
+
657  // If save button clicked call for file to be saved
+
658  if (ret == QMessageBox::Save) {
+
659  return saveFile("png");
+
660 
+
661  // If cancel do nothing
+
662  } else if (ret == QMessageBox::Cancel) {
+
663  return false;
+
664  }
+
665  }
+
666  return true;
+
667 }
+
668 
+
669 bool IntelliPhotoGui::saveFile(const QByteArray &fileFormat){
+
670  // Define path, name and default file type
+
671  QString initialPath = QDir::currentPath() + "/untitled." + fileFormat;
+
672 
+
673  // Get selected file from dialog
+
674  // Add the proper file formats and extensions
+
675  QString fileName = QFileDialog::getSaveFileName(this, tr("Save As"),
+
676  initialPath,
+
677  tr("%1 Files (*.%2);;All Files (*)")
+
678  .arg(QString::fromLatin1(fileFormat.toUpper()))
+
679  .arg(QString::fromLatin1(fileFormat)), nullptr, QFileDialog::DontUseNativeDialog);
+
680 
+
681  // If no file do nothing
+
682  if (fileName.isEmpty()) {
+
683  return false;
+
684  } else {
+
685  // Call for the file to be saved
+
686  return paintingArea->save(fileName, fileFormat.constData());
+
687  }
+
688 }
+
689 
+
690 void IntelliPhotoGui::setDefaultToolValue(){
+
691  slotEnterPressed();
+
692 }
+
693 
+ +
695  QString string = QString("Active Layer: %1").arg(paintingArea->getNumberOfActiveLayer());
+
696  ActiveLayerLine->setText(string);
+
697  p = p.fromImage(paintingArea->getImageOfActiveLayer()->getImageData());
+
698  ActiveLayerImageButton->setIcon(p);
+
699  ActiveLayerImageButton->setIconSize(Buttonsize);
+
700 
+
701  string = QString("background-color: %1").arg(paintingArea->colorPicker.getFirstColor().name());
+
702  FirstColorButton->setStyleSheet(string);
+
703  string = QString("background-color: %1").arg(paintingArea->colorPicker.getSecondColor().name());
+
704  SecondColorButton->setStyleSheet(string);
+
705 }
-
void createCircleTool()
-
int addLayer(int width, int height, int widthOffset=0, int heightOffset=0, ImageType type=ImageType::Raster_Image)
The addLayer adds a layer to the current project/ painting area.
-
void createRectangleTool()
-
bool open(const QString &fileName)
The open method is used for loading a picture into the current layer.
-
void setLayerToActive(int index)
The setLayerToActive method marks a specific layer as active.
-
void floodFill(int r, int g, int b, int a)
The floodFill method fills a the active layer with a given color.
-
bool save(const QString &fileName, const char *fileFormat)
The save method is used for exporting the current project as one picture.
-
void createPlainTool()
-
IntelliPhotoGui()
The IntelliPhotoGui method is the constructor and is used to create a new instance of the main progra...
-
The PaintingArea class manages the methods and stores information about the current painting area,...
Definition: PaintingArea.h:36
-
void deleteLayer(int index)
The deleteLayer method removes a layer at a given index.
-
void createPenTool()
-
void createLineTool()
-
void colorPickerSetSecondColor()
The colorPickerSetSecondColor calls the QTColorPicker to determine the secondary drawing color.
-
void colorPickerSetFirstColor()
The colorPickerSetFirstColor calls the QTColorPicker to determine the primary drawing color.
-
void colorPickerSwitchColor()
The colorPickerSwitchColor swaps the primary color with the secondary drawing color.
+
void createCircleTool()
+
IntelliImage * getImageOfActiveLayer()
+
void createRectangleTool()
+ +
bool save(const QString &filePath, const char *fileFormat)
The save method is used for exporting the current project as one picture.
+
void setLayerAlpha(int idx, int alpha)
The setAlphaOfLayer method sets the alpha value of a specific layer.
+
void setLayerActive(int idx)
The setLayerToActive method marks a specific layer as active.
+
void floodFill(int r, int g, int b, int a)
The floodFill method fills a the active layer with a given color.
+
QColor getSecondColor()
A function to read the secondary selected color.
+
void deleteLayer(int idx)
The deleteLayer method removes a layer at a given idx.
+
void createPlainTool()
+
IntelliPhotoGui()
The IntelliPhotoGui method is the constructor and is used to create a new instance of the main progra...
+
The PaintingArea class manages the methods and stores information about the current painting area,...
Definition: PaintingArea.h:37
+
void createPenTool()
+
void createLineTool()
+
void colorPickerSetSecondColor()
The colorPickerSetSecondColor calls the QTColorPicker to determine the secondary drawing color.
+
void colorPickerSetFirstColor()
The colorPickerSetFirstColor calls the QTColorPicker to determine the primary drawing color.
-
void closeEvent(QCloseEvent *event) override
-
void createPolygonTool()
-
void moveActiveLayer(int idx)
The moveActiveLayer moves the active layer to a specific position in the layer stack.
+
int getNumberOfActiveLayer()
+
void closeEvent(QCloseEvent *event) override
+
virtual QImage getImageData()
getImageData returns the data of the current image.
+
bool open(const QString &filePath)
The open method is used for loading a picture into the current layer.
+
void createPolygonTool()
+
void moveActiveLayer(int idx)
The moveActiveLayer moves the active layer to a specific position in the layer stack.
+
IntelliColorPicker colorPicker
Definition: PaintingArea.h:175
-
void createFloodFillTool()
-
void slotActivateLayer(int a)
The slotActivateLayer method handles the event of selecting one layer as active.
-
void setAlphaOfLayer(int index, int alpha)
The setAlphaOfLayer method sets the alpha value of a specific layer.
-
void movePositionActive(int x, int y)
The movePositionActive method moves the active layer to certain position.
+
QColor getFirstColor()
A function to read the primary selected color.
+
void createFloodFillTool()
+ +
IntelliToolsettings Toolsettings
Definition: PaintingArea.h:174
+
void colorPickerSwapColors()
The colorPickerSwitchColor swaps the primary color with the secondary drawing color.
+
void movePositionActive(int x, int y)
The movePositionActive method moves the active layer to certain position.
+ +
int addLayer(int width, int height, int widthOffset=0, int heightOffset=0, IntelliImage::ImageType type=IntelliImage::ImageType::RASTERIMAGE)
The addLayer adds a layer to the current project/ painting area.
-
#include <QList>
+
#include <QtWidgets>
+#include <QPixmap>
+#include <QList>
#include <QMainWindow>
#include <QGridLayout>
#include <QPushButton>
#include <QTextEdit>
#include <QLabel>
#include <QLineEdit>
-
-Include dependency graph for IntelliPhotoGui.h:
-
-
-
-
-This graph shows which files directly or indirectly include this file:
-
-
-

Go to the source code of this file.

diff --git a/docs/html/_intelli_photo_gui_8h__dep__incl.dot b/docs/html/_intelli_photo_gui_8h__dep__incl.dot index 981de5d..2dae499 100644 --- a/docs/html/_intelli_photo_gui_8h__dep__incl.dot +++ b/docs/html/_intelli_photo_gui_8h__dep__incl.dot @@ -7,5 +7,26 @@ digraph "intelliphoto/src/GUI/IntelliPhotoGui.h" Node1 -> Node2 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; Node2 [label="intelliphoto/src/GUI\l/IntelliPhotoGui.cpp",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_photo_gui_8cpp.html",tooltip=" "]; Node1 -> Node3 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node3 [label="intelliphoto/src/main.cpp",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$main_8cpp.html",tooltip=" "]; + Node3 [label="intelliphoto/src/Layer\l/PaintingArea.h",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_painting_area_8h.html",tooltip=" "]; + Node3 -> Node2 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node3 -> Node4 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node4 [label="intelliphoto/src/Layer\l/PaintingArea.cpp",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_painting_area_8cpp.html",tooltip=" "]; + Node3 -> Node5 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node5 [label="intelliphoto/src/Tool\l/IntelliTool.cpp",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_tool_8cpp.html",tooltip=" "]; + Node3 -> Node6 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node6 [label="intelliphoto/src/Tool\l/IntelliToolCircle.cpp",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_tool_circle_8cpp.html",tooltip=" "]; + Node3 -> Node7 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node7 [label="intelliphoto/src/Tool\l/IntelliToolFloodFill.cpp",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_tool_flood_fill_8cpp.html",tooltip=" "]; + Node3 -> Node8 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node8 [label="intelliphoto/src/Tool\l/IntelliToolLine.cpp",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_tool_line_8cpp.html",tooltip=" "]; + Node3 -> Node9 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node9 [label="intelliphoto/src/Tool\l/IntelliToolPen.cpp",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_tool_pen_8cpp.html",tooltip=" "]; + Node3 -> Node10 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node10 [label="intelliphoto/src/Tool\l/IntelliToolPlain.cpp",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_tool_plain_8cpp.html",tooltip=" "]; + Node3 -> Node11 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node11 [label="intelliphoto/src/Tool\l/IntelliToolPolygon.cpp",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_tool_polygon_8cpp.html",tooltip=" "]; + Node3 -> Node12 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node12 [label="intelliphoto/src/Tool\l/IntelliToolRectangle.cpp",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_tool_rectangle_8cpp.html",tooltip=" "]; + Node1 -> Node13 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node13 [label="intelliphoto/src/main.cpp",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$main_8cpp.html",tooltip=" "]; } diff --git a/docs/html/_intelli_photo_gui_8h__incl.dot b/docs/html/_intelli_photo_gui_8h__incl.dot index 12ec3a9..127439f 100644 --- a/docs/html/_intelli_photo_gui_8h__incl.dot +++ b/docs/html/_intelli_photo_gui_8h__incl.dot @@ -5,17 +5,21 @@ digraph "intelliphoto/src/GUI/IntelliPhotoGui.h" node [fontname="Helvetica",fontsize="10",shape=record]; Node1 [label="intelliphoto/src/GUI\l/IntelliPhotoGui.h",height=0.2,width=0.4,color="black", fillcolor="grey75", style="filled", fontcolor="black",tooltip=" "]; Node1 -> Node2 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node2 [label="QList",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; + Node2 [label="QtWidgets",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; Node1 -> Node3 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node3 [label="QMainWindow",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; + Node3 [label="QPixmap",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; Node1 -> Node4 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node4 [label="QGridLayout",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; + Node4 [label="QList",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; Node1 -> Node5 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node5 [label="QPushButton",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; + Node5 [label="QMainWindow",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; Node1 -> Node6 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node6 [label="QTextEdit",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; + Node6 [label="QGridLayout",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; Node1 -> Node7 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node7 [label="QLabel",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; + Node7 [label="QPushButton",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; Node1 -> Node8 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node8 [label="QLineEdit",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; + Node8 [label="QTextEdit",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; + Node1 -> Node9 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node9 [label="QLabel",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; + Node1 -> Node10 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node10 [label="QLineEdit",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; } diff --git a/docs/html/_intelli_photo_gui_8h_source.html b/docs/html/_intelli_photo_gui_8h_source.html index 73cc16d..2646100 100644 --- a/docs/html/_intelli_photo_gui_8h_source.html +++ b/docs/html/_intelli_photo_gui_8h_source.html @@ -93,146 +93,180 @@ $(document).ready(function(){initNavTree('_intelli_photo_gui_8h_source.html','') Go to the documentation of this file.
1 #ifndef IntelliPhotoGui_H
2 #define IntelliPhotoGui_H
3 
-
4 #include <QList>
-
5 #include <QMainWindow>
-
6 #include <QGridLayout>
-
7 #include <QPushButton>
-
8 #include <QTextEdit>
-
9 #include <QLabel>
-
10 #include <QLineEdit>
-
11 
-
12 // PaintingArea used to paint the image
-
13 class PaintingArea;
-
14 
-
15 class IntelliTool;
+
4 #include <QtWidgets>
+
5 #include <QPixmap>
+
6 #include <QList>
+
7 #include <QMainWindow>
+
8 #include <QGridLayout>
+
9 #include <QPushButton>
+
10 #include <QTextEdit>
+
11 #include <QLabel>
+
12 #include <QLineEdit>
+
13 
+
14 // PaintingArea used to paint the image
+
15 class PaintingArea;
16 
-
17 class IntelliColorPicker;
+
17 class IntelliTool;
18 
-
22 class IntelliPhotoGui : public QMainWindow {
-
23 // Declares our class as a QObject which is the base class
-
24 // for all Qt objects
-
25 // QObjects handle events
-
26 Q_OBJECT
-
27 public:
- -
32 
-
33 protected:
-
34 // Function used to close an event
-
35 void closeEvent(QCloseEvent*event) override;
+
19 class IntelliColorPicker;
+
20 
+
24 class IntelliPhotoGui : public QMainWindow {
+
25 // Declares our class as a QObject which is the base class
+
26 // for all Qt objects
+
27 // QObjects handle events
+
28 Q_OBJECT
+
29 public:
+ +
34 
+
35 void UpdateGui();
36 
-
37 private slots:
-
38 // meta slots here (need further )
-
39 void slotOpen();
-
40 void slotSave();
-
41 
-
42 // layer slots here
-
43 void slotCreateNewLayer();
-
44 void slotDeleteLayer();
-
45 void slotClearActiveLayer();
-
46 void slotSetActiveLayer();
-
47 void slotSetActiveAlpha();
-
48 void slotPositionMoveUp();
-
49 void slotPositionMoveDown();
-
50 void slotPositionMoveLeft();
-
51 void slotPositionMoveRight();
-
52 void slotMoveLayerUp();
-
53 void slotMoveLayerDown();
-
54 
-
55 // color Picker slots here
-
56 void slotSetFirstColor();
-
57 void slotSetSecondColor();
-
58 void slotSwitchColor();
-
59 
-
60 // tool slots here
-
61 void slotCreatePenTool();
-
62 void slotCreatePlainTool();
-
63 void slotCreateLineTool();
-
64 void slotCreateRectangleTool();
-
65 void slotCreateCircleTool();
-
66 void slotCreatePolygonTool();
-
67 void slotCreateFloodFillTool();
-
68 
-
69 // slots for dialogs
-
70 void slotAboutDialog();
-
71 
-
72 private:
-
73 // Will tie user actions to functions
-
74 void createActions();
-
75 void createMenus();
-
76 // setup GUI elements
-
77 void createGui();
-
78 // set style of the GUI
-
79 void setIntelliStyle();
-
80 
-
81 // Will check if changes have occurred since last save
-
82 bool maybeSave();
-
83 // Opens the Save dialog and saves
-
84 bool saveFile(const QByteArray &fileFormat);
-
85 
-
86 // What we'll draw on
-
87 PaintingArea* paintingArea;
+
37 protected:
+
38 // Function used to close an event
+
39 void closeEvent(QCloseEvent*event) override;
+
40 
+
41 private slots:
+
42 // meta slots here (need further )
+
43 void slotOpen();
+
44 void slotSave();
+
45 
+
46 // layer slots here
+
47 void slotCreateNewLayer();
+
48 void slotDeleteLayer();
+
49 void slotClearActiveLayer();
+
50 void slotSetActiveLayer();
+
51 void slotSetActiveAlpha();
+
52 void slotPositionMoveUp();
+
53 void slotPositionMoveDown();
+
54 void slotPositionMoveLeft();
+
55 void slotPositionMoveRight();
+
56 void slotMoveLayerUp();
+
57 void slotMoveLayerDown();
+
58 
+
59 // color Picker slots here
+
60 void slotSetFirstColor();
+
61 void slotSetSecondColor();
+
62 void slotSwapColor();
+
63 
+
64 // tool slots here
+
65 void slotCreatePenTool();
+
66 void slotCreatePlainTool();
+
67 void slotCreateLineTool();
+
68 void slotCreateRectangleTool();
+
69 void slotCreateCircleTool();
+
70 void slotCreatePolygonTool();
+
71 void slotCreateFloodFillTool();
+
72 
+
73 // slots for dialogs
+
74 void slotAboutDialog();
+
75 
+
76 void slotEnterPressed();
+
77 
+
78 void slotResetTools();
+
79 
+
80 private:
+
81 // Will tie user actions to functions
+
82 void createActions();
+
83 void createMenus();
+
84 // setup GUI elements
+
85 void createGui();
+
86 // set style of the GUI
+
87 void setIntelliStyle();
88 
-
89 // The menu widgets
-
90 QMenu*saveAsMenu;
-
91 QMenu*fileMenu;
-
92 QMenu*optionMenu;
-
93 QMenu*layerMenu;
-
94 QMenu*colorMenu;
-
95 QMenu*toolMenu;
-
96 QMenu*helpMenu;
-
97 
-
98 // All the actions that can occur
-
99 // meta image actions (need further modularisation)
-
100 QAction*actionOpen;
-
101 QAction*actionExit;
-
102 
-
103 // color Picker actions
-
104 QAction*actionColorPickerFirstColor;
-
105 QAction*actionColorPickerSecondColor;
-
106 QAction*actionColorSwitch;
-
107 
-
108 // tool actions
-
109 QAction*actionCreatePenTool;
-
110 QAction*actionCreatePlainTool;
-
111 QAction*actionCreateLineTool;
-
112 QAction*actionCreateRectangleTool;
-
113 QAction*actionCreateCircleTool;
-
114 QAction*actionCreatePolygonTool;
-
115 QAction*actionCreateFloodFillTool;
-
116 
-
117 // dialog actions
-
118 QAction*actionAboutDialog;
-
119 QAction*actionAboutQtDialog;
-
120 
-
121 // layer change actions
-
122 QAction*actionCreateNewLayer;
-
123 QAction*actionDeleteLayer;
-
124 QAction* actionSetActiveLayer;
-
125 QAction* actionSetActiveAlpha;
-
126 QAction* actionMovePositionUp;
-
127 QAction* actionMovePositionDown;
-
128 QAction* actionMovePositionLeft;
-
129 QAction* actionMovePositionRight;
-
130 QAction* actionMoveLayerUp;
-
131 QAction* actionMoveLayerDown;
-
132 
-
133 // Actions tied to specific file formats
-
134 QList<QAction*> actionSaveAs;
+
89 // Will check if changes have occurred since last save
+
90 bool maybeSave();
+
91 // Opens the Save dialog and saves
+
92 bool saveFile(const QByteArray &fileFormat);
+
93 
+
94 void setDefaultToolValue();
+
95 
+
96 // What we'll draw on
+
97 PaintingArea* paintingArea;
+
98 
+
99 const QSize Buttonsize = QSize(70,70);
+
100 QPixmap p;
+
101 QPushButton* CircleButton;
+
102 QPushButton* FloodFillButton;
+
103 QPushButton* LineButton;
+
104 QPushButton* PenButton;
+
105 QPushButton* PlainButton;
+
106 QPushButton* PolygonButton;
+
107 QPushButton* RectangleButton;
+
108 QLabel* WidthLine;
+
109 QLabel* innerAlphaLine;
+
110 QLineEdit* EditLineWidth;
+
111 QLineEdit* EditLineInnerAlpha;
+
112 QIntValidator* ValidatorLineWidth;
+
113 QIntValidator* ValidatorInnerAlpha;
+
114 
+
115 QPushButton* FirstColorButton;
+
116 QPushButton* SecondColorButton;
+
117 QPushButton* SwitchColorButton;
+
118 
+
119 QLabel* ActiveLayerLine;
+
120 QPushButton* ActiveLayerImageButton;
+
121 
+
122 // The menu widgets
+
123 QMenu*saveAsMenu;
+
124 QMenu*fileMenu;
+
125 QMenu*optionMenu;
+
126 QMenu*layerMenu;
+
127 QMenu*colorMenu;
+
128 QMenu*toolMenu;
+
129 QMenu*helpMenu;
+
130 
+
131 // All the actions that can occur
+
132 // meta image actions (need further modularisation)
+
133 QAction*actionOpen;
+
134 QAction*actionExit;
135 
-
136 // main GUI elements
-
137 QWidget* centralGuiWidget;
-
138 QGridLayout*mainLayout;
-
139 };
+
136 // color Picker actions
+
137 QAction*actionColorPickerFirstColor;
+
138 QAction*actionColorPickerSecondColor;
+
139 QAction*actionColorSwap;
140 
-
141 #endif
+
141 // tool actions
+
142 QAction*actionCreatePenTool;
+
143 QAction*actionCreatePlainTool;
+
144 QAction*actionCreateLineTool;
+
145 QAction*actionCreateRectangleTool;
+
146 QAction*actionCreateCircleTool;
+
147 QAction*actionCreatePolygonTool;
+
148 QAction*actionCreateFloodFillTool;
+
149 
+
150 // dialog actions
+
151 QAction*actionAboutDialog;
+
152 QAction*actionAboutQtDialog;
+
153 
+
154 // layer change actions
+
155 QAction*actionCreateNewLayer;
+
156 QAction*actionDeleteLayer;
+
157 QAction* actionSetActiveLayer;
+
158 QAction* actionSetActiveAlpha;
+
159 QAction* actionMovePositionUp;
+
160 QAction* actionMovePositionDown;
+
161 QAction* actionMovePositionLeft;
+
162 QAction* actionMovePositionRight;
+
163 QAction* actionMoveLayerUp;
+
164 QAction* actionMoveLayerDown;
+
165 
+
166 // Actions tied to specific file formats
+
167 QList<QAction*> actionSaveAs;
+
168 
+
169 // main GUI elements
+
170 QWidget* centralGuiWidget;
+
171 QGridLayout* mainLayout;
+
172 };
+
173 
+
174 #endif
-
The IntelliPhotoGui class handles the graphical user interface for the intelliPhoto program.
-
IntelliPhotoGui()
The IntelliPhotoGui method is the constructor and is used to create a new instance of the main progra...
-
The PaintingArea class manages the methods and stores information about the current painting area,...
Definition: PaintingArea.h:36
-
An abstract class that manages the basic events, like mouse clicks or scrolls events.
Definition: IntelliTool.h:13
-
void closeEvent(QCloseEvent *event) override
+
The IntelliPhotoGui class handles the graphical user interface for the intelliPhoto program.
+
IntelliPhotoGui()
The IntelliPhotoGui method is the constructor and is used to create a new instance of the main progra...
+
The PaintingArea class manages the methods and stores information about the current painting area,...
Definition: PaintingArea.h:37
+
An abstract class that manages the basic events, like mouse clicks or scrolls events.
Definition: IntelliTool.h:14
+
void closeEvent(QCloseEvent *event) override
The IntelliColorPicker manages the selected colors for one whole project.
+
-Include dependency graph for IntelliRasterImage.cpp:
-
-
-

Go to the source code of this file.

diff --git a/docs/html/_intelli_raster_image_8cpp__incl.dot b/docs/html/_intelli_raster_image_8cpp__incl.dot index c093728..ca2ddaa 100644 --- a/docs/html/_intelli_raster_image_8cpp__incl.dot +++ b/docs/html/_intelli_raster_image_8cpp__incl.dot @@ -20,10 +20,16 @@ digraph "intelliphoto/src/Image/IntelliRasterImage.cpp" Node8 [label="QWidget",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; Node3 -> Node9 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; Node9 [label="vector",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; - Node1 -> Node10 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node10 [label="QPainter",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; - Node1 -> Node11 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node11 [label="QRect",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; + Node3 -> Node10 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node10 [label="IntelliHelper/IntelliTriangulation.h",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_triangulation_8h.html",tooltip=" "]; + Node10 -> Node5 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node10 -> Node9 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node3 -> Node11 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node11 [label="IntelliHelper/IntelliRender\lSettings.h",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_render_settings_8h.html",tooltip=" "]; Node1 -> Node12 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node12 [label="QDebug",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; + Node12 [label="QPainter",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; + Node1 -> Node13 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node13 [label="QRect",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; + Node1 -> Node14 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node14 [label="QDebug",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; } diff --git a/docs/html/_intelli_raster_image_8cpp_source.html b/docs/html/_intelli_raster_image_8cpp_source.html index 44473a2..0ce5b69 100644 --- a/docs/html/_intelli_raster_image_8cpp_source.html +++ b/docs/html/_intelli_raster_image_8cpp_source.html @@ -95,57 +95,68 @@ $(document).ready(function(){initNavTree('_intelli_raster_image_8cpp_source.html
3 #include <QRect>
4 #include <QDebug>
5 
- -
7  : IntelliImage(weight, height){
-
8 
-
9 }
-
10 
- -
12 
-
13 }
-
14 
- -
16  IntelliRasterImage* raster = new IntelliRasterImage(imageData.width(), imageData.height());
-
17  raster->imageData.fill(Qt::transparent);
-
18  return raster;
-
19 }
-
20 
- -
22  // not used in raster image
-
23 }
-
24 
- -
26  return getDisplayable(imageData.size(), alpha);
-
27 }
-
28 
-
29 QImage IntelliRasterImage::getDisplayable(const QSize& displaySize, int alpha){
-
30  QImage copy = imageData;
-
31  for(int y = 0; y<copy.height(); y++) {
-
32  for(int x = 0; x<copy.width(); x++) {
-
33  QColor clr = copy.pixelColor(x,y);
-
34  clr.setAlpha(std::min(alpha, clr.alpha()));
-
35  copy.setPixelColor(x,y, clr);
-
36  }
-
37  }
-
38  return copy.scaled(displaySize,Qt::IgnoreAspectRatio);
-
39 }
-
40 
-
41 void IntelliRasterImage::setPolygon(const std::vector<QPoint>& polygonData){
-
42  qDebug() << "Raster Image has no polygon data " << polygonData.size() <<"\n";
-
43  return;
-
44 }
+
6 IntelliRasterImage::IntelliRasterImage(int width, int height, bool fastRendererOn)
+
7  : IntelliImage(width, height, fastRendererOn){
+ +
9  this->fastRenderer = fastRendererOn;
+
10 }
+
11 
+ +
13 
+
14 }
+
15 
+ +
17  IntelliRasterImage* raster = new IntelliRasterImage(imageData.width(), imageData.height(), false);
+
18  raster->imageData.fill(Qt::transparent);
+ +
20  return raster;
+
21 }
+
22 
+ +
24  // not used in raster image
+
25 }
+
26 
+ +
28  return getDisplayable(imageData.size(), alpha);
+
29 }
+
30 
+
31 QImage IntelliRasterImage::getDisplayable(const QSize& displaySize, int alpha){
+
32  QImage copy = imageData;
+
33  if(fastRenderer) {
+
34  copy = copy.convertToFormat(QImage::Format_ARGB32);
+
35  }
+
36  for(int y = 0; y<copy.height(); y++) {
+
37  for(int x = 0; x<copy.width(); x++) {
+
38  QColor clr = copy.pixelColor(x,y);
+
39  clr.setAlpha(std::min(alpha, clr.alpha()));
+
40  copy.setPixelColor(x,y, clr);
+
41  }
+
42  }
+
43  if(fastRenderer) {
+
44  copy = copy.convertToFormat(QImage::Format_Indexed8);
+
45  }
+
46  return copy.scaled(displaySize,Qt::IgnoreAspectRatio);
+
47 }
+
48 
+
49 void IntelliRasterImage::setPolygon(const std::vector<QPoint>& polygonData){
+
50  qDebug() << "Raster Image has no polygon data " << polygonData.size() <<"\n";
+
51  return;
+
52 }
-
virtual ~IntelliRasterImage() override
An Destructor.
+
virtual ~IntelliRasterImage() override
An Destructor.
+
IntelliRasterImage(int width, int height, bool fastRendererOn)
The Construcor of the IntelliRasterImage. Given the Image dimensions.
-
virtual QImage getDisplayable(const QSize &displaySize, int alpha) override
A function returning the displayable ImageData in a requested transparence and size.
-
QImage imageData
The underlying image data.
Definition: IntelliImage.h:32
-
An abstract class which manages the basic IntelliImage operations.
Definition: IntelliImage.h:24
-
virtual IntelliImage * getDeepCopy() override
A function that copys all that returns a [allocated] Image.
-
virtual void calculateVisiblity() override
A function that calculates the visibility of the image if a polygon is given. [does nothing in Raster...
-
virtual void setPolygon(const std::vector< QPoint > &polygonData) override
An abstract function that sets the data of the visible Polygon, if needed.
-
IntelliRasterImage(int weight, int height)
The Construcor of the IntelliRasterImage. Given the Image dimensions.
-
The IntelliRasterImage manages a Rasterimage.
+
virtual QImage getDisplayable(const QSize &displaySize, int alpha) override
A function returning the displayable ImageData in a requested transparence and size.
+
ImageType TypeOfImage
The Type, an Image is.
Definition: IntelliImage.h:42
+
bool fastRenderer
fastRenderer is the flag that represents the usage of 8bit pictures.
Definition: IntelliImage.h:47
+ +
QImage imageData
The underlying image data.
Definition: IntelliImage.h:37
+
An abstract class which manages the basic IntelliImage operations.
Definition: IntelliImage.h:19
+
virtual IntelliImage * getDeepCopy() override
A function that copys all that returns a [allocated] Image.
+
virtual void calculateVisiblity() override
A function that calculates the visibility of the image if a polygon is given. [does nothing in RASTER...
+
virtual void setPolygon(const std::vector< QPoint > &polygonData) override
An abstract function that sets the data of the visible Polygon, if needed.
+
The IntelliRasterImage manages a RASTERIMAGE.
-Include dependency graph for IntelliRasterImage.h:
-
-
-
-
-This graph shows which files directly or indirectly include this file:
-
-
-

Go to the source code of this file.

- +

Classes

class  IntelliRasterImage
 The IntelliRasterImage manages a Rasterimage. More...
 The IntelliRasterImage manages a RASTERIMAGE. More...
 
diff --git a/docs/html/_intelli_raster_image_8h__incl.dot b/docs/html/_intelli_raster_image_8h__incl.dot index 41ae445..4bb933b 100644 --- a/docs/html/_intelli_raster_image_8h__incl.dot +++ b/docs/html/_intelli_raster_image_8h__incl.dot @@ -18,4 +18,10 @@ digraph "intelliphoto/src/Image/IntelliRasterImage.h" Node7 [label="QWidget",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; Node2 -> Node8 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; Node8 [label="vector",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; + Node2 -> Node9 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node9 [label="IntelliHelper/IntelliTriangulation.h",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_triangulation_8h.html",tooltip=" "]; + Node9 -> Node4 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node9 -> Node8 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node2 -> Node10 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node10 [label="IntelliHelper/IntelliRender\lSettings.h",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_render_settings_8h.html",tooltip=" "]; } diff --git a/docs/html/_intelli_raster_image_8h_source.html b/docs/html/_intelli_raster_image_8h_source.html index 974c110..768a7de 100644 --- a/docs/html/_intelli_raster_image_8h_source.html +++ b/docs/html/_intelli_raster_image_8h_source.html @@ -100,32 +100,32 @@ $(document).ready(function(){initNavTree('_intelli_raster_image_8h_source.html',
11 protected:
15 virtual void calculateVisiblity() override;
16 public:
-
22 IntelliRasterImage(int weight, int height);
-
23 
-
27 virtual ~IntelliRasterImage() override;
-
28 
-
35 virtual QImage getDisplayable(const QSize& displaySize,int alpha) override;
-
36 
-
42 virtual QImage getDisplayable(int alpha=255) override;
-
43 
-
48 virtual IntelliImage* getDeepCopy() override;
-
49 
-
54 virtual void setPolygon(const std::vector<QPoint>& polygonData) override;
-
55 };
-
56 
-
57 #endif
+
23 IntelliRasterImage(int width, int height, bool fastRendererOn);
+
24 
+
28 virtual ~IntelliRasterImage() override;
+
29 
+
36 virtual QImage getDisplayable(const QSize& displaySize,int alpha) override;
+
37 
+
43 virtual QImage getDisplayable(int alpha=255) override;
+
44 
+
49 virtual IntelliImage* getDeepCopy() override;
+
50 
+
55 virtual void setPolygon(const std::vector<QPoint>& polygonData) override;
+
56 };
+
57 
+
58 #endif
-
virtual ~IntelliRasterImage() override
An Destructor.
-
An abstract class that manages the basic events, like mouse clicks or scrolls events.
Definition: IntelliTool.h:13
-
virtual QImage getDisplayable(const QSize &displaySize, int alpha) override
A function returning the displayable ImageData in a requested transparence and size.
-
An abstract class which manages the basic IntelliImage operations.
Definition: IntelliImage.h:24
-
virtual IntelliImage * getDeepCopy() override
A function that copys all that returns a [allocated] Image.
-
virtual void calculateVisiblity() override
A function that calculates the visibility of the image if a polygon is given. [does nothing in Raster...
-
virtual void setPolygon(const std::vector< QPoint > &polygonData) override
An abstract function that sets the data of the visible Polygon, if needed.
-
IntelliRasterImage(int weight, int height)
The Construcor of the IntelliRasterImage. Given the Image dimensions.
-
The IntelliRasterImage manages a Rasterimage.
+
virtual ~IntelliRasterImage() override
An Destructor.
+
IntelliRasterImage(int width, int height, bool fastRendererOn)
The Construcor of the IntelliRasterImage. Given the Image dimensions.
+
An abstract class that manages the basic events, like mouse clicks or scrolls events.
Definition: IntelliTool.h:14
+
virtual QImage getDisplayable(const QSize &displaySize, int alpha) override
A function returning the displayable ImageData in a requested transparence and size.
+
An abstract class which manages the basic IntelliImage operations.
Definition: IntelliImage.h:19
+
virtual IntelliImage * getDeepCopy() override
A function that copys all that returns a [allocated] Image.
+
virtual void calculateVisiblity() override
A function that calculates the visibility of the image if a polygon is given. [does nothing in RASTER...
+
virtual void setPolygon(const std::vector< QPoint > &polygonData) override
An abstract function that sets the data of the visible Polygon, if needed.
+
The IntelliRasterImage manages a RASTERIMAGE.
#include "Image/IntelliShapedImage.h"
-#include "IntelliHelper/IntelliHelper.h"
+#include "IntelliHelper/IntelliTriangulation.h"
#include <QPainter>
#include <QRect>
#include <QDebug>
-
-Include dependency graph for IntelliShapedImage.cpp:
-
-
-

Go to the source code of this file.

diff --git a/docs/html/_intelli_shaped_image_8cpp__incl.dot b/docs/html/_intelli_shaped_image_8cpp__incl.dot index 63a34cc..094d457 100644 --- a/docs/html/_intelli_shaped_image_8cpp__incl.dot +++ b/docs/html/_intelli_shaped_image_8cpp__incl.dot @@ -22,16 +22,18 @@ digraph "intelliphoto/src/Image/IntelliShapedImage.cpp" Node9 [label="QWidget",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; Node4 -> Node10 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; Node10 [label="vector",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; - Node2 -> Node10 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node2 -> Node11 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node11 [label="IntelliHelper/IntelliHelper.h",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_helper_8h.html",tooltip=" "]; + Node4 -> Node11 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node11 [label="IntelliHelper/IntelliTriangulation.h",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_triangulation_8h.html",tooltip=" "]; Node11 -> Node6 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; Node11 -> Node10 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node4 -> Node12 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node12 [label="IntelliHelper/IntelliRender\lSettings.h",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_render_settings_8h.html",tooltip=" "]; + Node2 -> Node10 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; Node1 -> Node11 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node1 -> Node12 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node12 [label="QPainter",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; Node1 -> Node13 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node13 [label="QRect",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; + Node13 [label="QPainter",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; Node1 -> Node14 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node14 [label="QDebug",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; + Node14 [label="QRect",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; + Node1 -> Node15 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node15 [label="QDebug",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; } diff --git a/docs/html/_intelli_shaped_image_8cpp_source.html b/docs/html/_intelli_shaped_image_8cpp_source.html index d464d5f..7e34b9c 100644 --- a/docs/html/_intelli_shaped_image_8cpp_source.html +++ b/docs/html/_intelli_shaped_image_8cpp_source.html @@ -91,99 +91,121 @@ $(document).ready(function(){initNavTree('_intelli_shaped_image_8cpp_source.html
Go to the documentation of this file.
- +
3 #include <QPainter>
4 #include <QRect>
5 #include <QDebug>
6 
- -
8  : IntelliRasterImage(weight, height){
-
9 }
-
10 
- +
7 IntelliShapedImage::IntelliShapedImage(int width, int height, bool fastRendererOn)
+
8  : IntelliRasterImage(width, height, fastRendererOn){
+ +
10  this->fastRenderer = fastRendererOn;
+
11 }
12 
-
13 }
+
14 
- -
16  return getDisplayable(imageData.size(),alpha);
-
17 }
-
18 
- -
20  IntelliShapedImage* shaped = new IntelliShapedImage(imageData.width(), imageData.height());
-
21  shaped->setPolygon(this->polygonData);
-
22  shaped->imageData.fill(Qt::transparent);
-
23  return shaped;
-
24 }
-
25 
-
26 void IntelliShapedImage::calculateVisiblity(){
-
27  if(polygonData.size()<=2) {
-
28  QColor clr;
-
29  for(int y=0; y<imageData.height(); y++) {
-
30  for(int x=0; x<imageData.width(); x++) {
-
31  clr = imageData.pixel(x,y);
-
32  clr.setAlpha(255);
-
33  imageData.setPixelColor(x,y,clr);
-
34  }
-
35  }
-
36  return;
-
37  }
-
38  QColor clr;
-
39  for(int y=0; y<imageData.height(); y++) {
-
40  for(int x=0; x<imageData.width(); x++) {
-
41  QPoint ptr(x,y);
-
42  clr = imageData.pixelColor(x,y);
-
43  bool isInPolygon = IntelliHelper::isInPolygon(triangles, ptr);
-
44  if(isInPolygon) {
-
45  clr.setAlpha(std::min(255, clr.alpha()));
-
46  }else{
-
47  clr.setAlpha(0);
-
48  }
-
49  imageData.setPixelColor(x,y,clr);
-
50  }
-
51  }
-
52 }
-
53 
-
54 QImage IntelliShapedImage::getDisplayable(const QSize& displaySize, int alpha){
-
55  QImage copy = imageData;
-
56  for(int y = 0; y<copy.height(); y++) {
-
57  for(int x = 0; x<copy.width(); x++) {
-
58  QColor clr = copy.pixelColor(x,y);
-
59  clr.setAlpha(std::min(alpha,clr.alpha()));
-
60  copy.setPixelColor(x,y, clr);
-
61  }
-
62  }
-
63  return copy.scaled(displaySize,Qt::IgnoreAspectRatio);
-
64 }
-
65 
-
66 void IntelliShapedImage::setPolygon(const std::vector<QPoint>& polygonData){
-
67  if(polygonData.size()<3) {
-
68  this->polygonData.clear();
-
69  }else{
-
70  this->polygonData.clear();
-
71  for(auto element:polygonData) {
-
72  this->polygonData.push_back(QPoint(element.x(), element.y()));
-
73  }
- -
75  }
-
76  calculateVisiblity();
-
77  return;
-
78 }
+
15 }
+
16 
+ +
18  return getDisplayable(imageData.size(),alpha);
+
19 }
+
20 
+ +
22  IntelliShapedImage* shaped = new IntelliShapedImage(imageData.width(), imageData.height(), false);
+
23  shaped->setPolygon(this->polygonData);
+
24  shaped->imageData.fill(Qt::transparent);
+ +
26  return shaped;
+
27 }
+
28 
+
29 void IntelliShapedImage::calculateVisiblity(){
+
30  if(fastRenderer) {
+
31  this->imageData = imageData.convertToFormat(QImage::Format_ARGB32);
+
32  }
+
33 
+
34  if(polygonData.size()<=2) {
+
35  QColor clr;
+
36  for(int y=0; y<imageData.height(); y++) {
+
37  for(int x=0; x<imageData.width(); x++) {
+
38  clr = imageData.pixel(x,y);
+
39  clr.setAlpha(255);
+
40  imageData.setPixelColor(x,y,clr);
+
41  }
+
42  }
+
43  if(fastRenderer) {
+
44  this->imageData = this->imageData.convertToFormat(QImage::Format_Indexed8);
+
45  }
+
46  return;
+
47  }
+
48  QColor clr;
+
49  for(int y=0; y<imageData.height(); y++) {
+
50  for(int x=0; x<imageData.width(); x++) {
+
51  QPoint ptr(x,y);
+
52  clr = imageData.pixelColor(x,y);
+
53  bool isInPolygon = IntelliTriangulation::isInPolygon(triangles, ptr);
+
54  if(isInPolygon) {
+
55  clr.setAlpha(std::min(255, clr.alpha()));
+
56  }else{
+
57  clr.setAlpha(0);
+
58  }
+
59  imageData.setPixelColor(x,y,clr);
+
60  }
+
61  }
+
62  if(fastRenderer) {
+
63  this->imageData = this->imageData.convertToFormat(QImage::Format_Indexed8);
+
64  }
+
65 }
+
66 
+
67 QImage IntelliShapedImage::getDisplayable(const QSize& displaySize, int alpha){
+
68  QImage copy = imageData;
+
69  if(fastRenderer) {
+
70  copy = copy.convertToFormat(QImage::Format_ARGB32);
+
71  }
+
72  for(int y = 0; y<copy.height(); y++) {
+
73  for(int x = 0; x<copy.width(); x++) {
+
74  QColor clr = copy.pixelColor(x,y);
+
75  clr.setAlpha(std::min(alpha,clr.alpha()));
+
76  copy.setPixelColor(x,y, clr);
+
77  }
+
78  }
+
79  if(fastRenderer) {
+
80  copy = copy.convertToFormat(QImage::Format_Indexed8);
+
81  }
+
82  return copy.scaled(displaySize,Qt::IgnoreAspectRatio);
+
83 }
+
84 
+
85 void IntelliShapedImage::setPolygon(const std::vector<QPoint>& polygonData){
+
86  if(polygonData.size()<3) {
+
87  this->polygonData.clear();
+
88  }else{
+
89  this->polygonData.clear();
+
90  for(auto element:polygonData) {
+
91  this->polygonData.push_back(QPoint(element.x(), element.y()));
+
92  }
+ +
94  }
+
95  calculateVisiblity();
+
96  return;
+
97 }
-
virtual QImage getDisplayable(const QSize &displaySize, int alpha=255) override
A function returning the displayable ImageData in a requested transparence and size.
+
virtual QImage getDisplayable(const QSize &displaySize, int alpha=255) override
A function returning the displayable ImageData in a requested transparence and size.
- -
The IntelliShapedImage manages a Shapedimage.
-
virtual IntelliImage * getDeepCopy() override
A function that copys all that returns a [allocated] Image.
-
bool isInPolygon(std::vector< Triangle > &triangles, QPoint &point)
A function to check if a point lies in a polygon by checking its spanning triangles.
-
std::vector< Triangle > calculateTriangles(std::vector< QPoint > polyPoints)
A function to split a polygon in its spanning traingles by using Meisters Theorem of graph theory by ...
-
QImage imageData
The underlying image data.
Definition: IntelliImage.h:32
-
An abstract class which manages the basic IntelliImage operations.
Definition: IntelliImage.h:24
-
std::vector< QPoint > polygonData
The Vertices of The Polygon. Needs to be a planar Polygon.
-
IntelliShapedImage(int weight, int height)
The Construcor of the IntelliShapedImage. Given the Image dimensions.
-
virtual ~IntelliShapedImage() override
An Destructor.
-
The IntelliRasterImage manages a Rasterimage.
-
virtual void setPolygon(const std::vector< QPoint > &polygonData) override
A function that sets the data of the visible Polygon.
+
std::vector< Triangle > calculateTriangles(std::vector< QPoint > polyPoints)
A function to split a polygon in its spanning traingles by using Meisters Theorem of graph theory by ...
+
The IntelliShapedImage manages a Shapedimage.
+
virtual IntelliImage * getDeepCopy() override
A function that copys all that returns a [allocated] Image.
+ +
bool isInPolygon(std::vector< Triangle > &triangles, QPoint &point)
A function to check if a point lies in a polygon by checking its spanning triangles.
+
ImageType TypeOfImage
The Type, an Image is.
Definition: IntelliImage.h:42
+
bool fastRenderer
fastRenderer is the flag that represents the usage of 8bit pictures.
Definition: IntelliImage.h:47
+
QImage imageData
The underlying image data.
Definition: IntelliImage.h:37
+
An abstract class which manages the basic IntelliImage operations.
Definition: IntelliImage.h:19
+
std::vector< QPoint > polygonData
The Vertices of The Polygon. Needs to be a planar Polygon.
+
IntelliShapedImage(int width, int height, bool fastRendererOn)
The Construcor of the IntelliShapedImage. Given the Image dimensions.
+
virtual ~IntelliShapedImage() override
An Destructor.
+
The IntelliRasterImage manages a RASTERIMAGE.
+ +
virtual void setPolygon(const std::vector< QPoint > &polygonData) override
A function that sets the data of the visible Polygon.
diff --git a/docs/html/_intelli_tool_line_8h__incl.dot b/docs/html/_intelli_tool_line_8h__incl.dot index 14a5999..1cc4f4d 100644 --- a/docs/html/_intelli_tool_line_8h__incl.dot +++ b/docs/html/_intelli_tool_line_8h__incl.dot @@ -15,6 +15,8 @@ digraph "intelliphoto/src/Tool/IntelliToolLine.h" Node3 -> Node6 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; Node6 [label="QColorDialog",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; Node2 -> Node7 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node7 [label="vector",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; + Node7 [label="IntelliHelper/IntelliToolsettings.h",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_toolsettings_8h.html",tooltip=" "]; + Node2 -> Node8 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node8 [label="vector",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; Node1 -> Node5 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; } diff --git a/docs/html/_intelli_tool_line_8h_source.html b/docs/html/_intelli_tool_line_8h_source.html index 4a95c19..7217625 100644 --- a/docs/html/_intelli_tool_line_8h_source.html +++ b/docs/html/_intelli_tool_line_8h_source.html @@ -96,57 +96,48 @@ $(document).ready(function(){initNavTree('_intelli_tool_line_8h_source.html','')
4 
5 #include "QPoint"
6 
-
10 enum class LineStyle {
-
11  SOLID_LINE,
- -
13 };
-
14 
-
18 class IntelliToolLine : public IntelliTool {
-
22 QPoint start;
-
23 
-
27 int lineWidth;
-
28 
-
32 LineStyle lineStyle;
-
33 public:
-
34 
- -
41 
-
45 virtual ~IntelliToolLine() override;
-
46 
-
52 virtual void onMouseRightPressed(int x, int y) override;
-
53 
-
59 virtual void onMouseRightReleased(int x, int y) override;
-
60 
-
66 virtual void onMouseLeftPressed(int x, int y) override;
-
67 
-
73 virtual void onMouseLeftReleased(int x, int y) override;
-
74 
-
79 virtual void onWheelScrolled(int value) override;
-
80 
-
86 virtual void onMouseMoved(int x, int y) override;
-
87 };
-
88 
-
89 #endif // INTELLITOOLLINE_H
+
10 class IntelliToolLine : public IntelliTool {
+
14 QPoint lineStartingPoint;
+
15 
+
16 public:
+
17 
+ +
24 
+
28 virtual ~IntelliToolLine() override;
+
29 
+
35 virtual void onMouseRightPressed(int x, int y) override;
+
36 
+
42 virtual void onMouseRightReleased(int x, int y) override;
+
43 
+
49 virtual void onMouseLeftPressed(int x, int y) override;
+
50 
+
56 virtual void onMouseLeftReleased(int x, int y) override;
+
57 
+
62 virtual void onWheelScrolled(int value) override;
+
63 
+
69 virtual void onMouseMoved(int x, int y) override;
+
70 };
+
71 
+
72 #endif // INTELLITOOLLINE_H
-
IntelliColorPicker * colorPicker
A pointer to the IntelliColorPicker of the PaintingArea to interact with, and get the colors.
Definition: IntelliTool.h:38
- +
IntelliColorPicker * colorPicker
A pointer to the IntelliColorPicker of the PaintingArea to interact with, and get the colors.
Definition: IntelliTool.h:51
-
LineStyle
The LineStyle enum classifing all ways of drawing a line.
-
virtual void onMouseMoved(int x, int y) override
A function managing the mouse moved event. Drawing a Line from the startpoint to the current mouse po...
-
virtual void onWheelScrolled(int value) override
A function managing the scroll event. Changing the lineWidth relative to value.
-
virtual void onMouseRightReleased(int x, int y) override
A function managing the right click released of a mouse.
-
PaintingArea * Area
A pointer to the general PaintingArea to interact with.
Definition: IntelliTool.h:33
-
IntelliToolLine(PaintingArea *Area, IntelliColorPicker *colorPicker)
A constructor setting the general paintingArea and colorPicker. And reading in the lineWidth and line...
- -
The PaintingArea class manages the methods and stores information about the current painting area,...
Definition: PaintingArea.h:36
-
virtual ~IntelliToolLine() override
An abstract Destructor.
-
virtual void onMouseLeftReleased(int x, int y) override
A function managing the left click released of a mouse.
-
virtual void onMouseRightPressed(int x, int y) override
A function managing the right click pressed of a mouse. Clearing the canvas.
-
An abstract class that manages the basic events, like mouse clicks or scrolls events.
Definition: IntelliTool.h:13
+
IntelliToolsettings * Toolsettings
Definition: IntelliTool.h:53
+
IntelliToolLine(PaintingArea *Area, IntelliColorPicker *colorPicker, IntelliToolsettings *Toolsettings)
A constructor setting the general paintingArea and colorPicker. And reading in the lineWidth and line...
+
virtual void onMouseMoved(int x, int y) override
A function managing the mouse moved event. Drawing a Line from the startpoint to the current mouse po...
+
virtual void onWheelScrolled(int value) override
A function managing the scroll event. Changing the lineWidth relative to value.
+
virtual void onMouseRightReleased(int x, int y) override
A function managing the right click released of a mouse.
+
PaintingArea * Area
A pointer to the general PaintingArea to interact with.
Definition: IntelliTool.h:44
+
The PaintingArea class manages the methods and stores information about the current painting area,...
Definition: PaintingArea.h:37
+
virtual ~IntelliToolLine() override
An abstract Destructor.
+
virtual void onMouseLeftReleased(int x, int y) override
A function managing the left click released of a mouse.
+
virtual void onMouseRightPressed(int x, int y) override
A function managing the right click pressed of a mouse. Clearing the canvas.
+
An abstract class that manages the basic events, like mouse clicks or scrolls events.
Definition: IntelliTool.h:14
The IntelliColorPicker manages the selected colors for one whole project.
-
virtual void onMouseLeftPressed(int x, int y) override
A function managing the left click pressed of a mouse. Sets the starting point of the line.
-
The IntelliToolFloodFill class represents a tool to draw a line.
+
virtual void onMouseLeftPressed(int x, int y) override
A function managing the left click pressed of a mouse. Sets the starting point of the line.
+ +
The IntelliToolFloodFill class represents a tool to draw a line.
-Include dependency graph for IntelliToolPen.cpp:
-
-
-

Go to the source code of this file.

diff --git a/docs/html/_intelli_tool_pen_8cpp__incl.dot b/docs/html/_intelli_tool_pen_8cpp__incl.dot index 5ddb347..3c494b2 100644 --- a/docs/html/_intelli_tool_pen_8cpp__incl.dot +++ b/docs/html/_intelli_tool_pen_8cpp__incl.dot @@ -17,44 +17,67 @@ digraph "intelliphoto/src/Tool/IntelliToolPen.cpp" Node4 -> Node7 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; Node7 [label="QColorDialog",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; Node3 -> Node8 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node8 [label="vector",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; + Node8 [label="IntelliHelper/IntelliToolsettings.h",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_toolsettings_8h.html",tooltip=" "]; + Node3 -> Node9 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node9 [label="vector",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; Node2 -> Node5 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; Node2 -> Node6 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node1 -> Node9 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node9 [label="Layer/PaintingArea.h",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_painting_area_8h.html",tooltip=" "]; - Node9 -> Node5 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node9 -> Node10 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node10 [label="QImage",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; - Node9 -> Node6 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node9 -> Node11 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node11 [label="QWidget",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; - Node9 -> Node12 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node12 [label="QList",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; - Node9 -> Node13 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node13 [label="Image/IntelliImage.h",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_image_8h.html",tooltip=" "]; - Node13 -> Node10 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node13 -> Node6 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node13 -> Node5 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node13 -> Node14 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node14 [label="QSize",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; - Node13 -> Node11 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node13 -> Node8 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node9 -> Node15 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node15 [label="Image/IntelliRasterImage.h",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_raster_image_8h.html",tooltip=" "]; - Node15 -> Node13 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node9 -> Node16 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node16 [label="Image/IntelliShapedImage.h",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_shaped_image_8h.html",tooltip=" "]; - Node16 -> Node15 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node16 -> Node8 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node16 -> Node17 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node17 [label="IntelliHelper/IntelliHelper.h",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_helper_8h.html",tooltip=" "]; - Node17 -> Node6 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node17 -> Node8 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node9 -> Node3 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node9 -> Node4 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node1 -> Node18 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node18 [label="QDebug",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; + Node1 -> Node10 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node10 [label="Layer/PaintingArea.h",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_painting_area_8h.html",tooltip=" "]; + Node10 -> Node5 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node10 -> Node11 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node11 [label="QImage",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; + Node10 -> Node6 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node10 -> Node12 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node12 [label="QWidget",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; + Node10 -> Node13 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node13 [label="QList",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; + Node10 -> Node14 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node14 [label="GUI/IntelliPhotoGui.h",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_photo_gui_8h.html",tooltip=" "]; + Node14 -> Node15 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node15 [label="QtWidgets",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; + Node14 -> Node16 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node16 [label="QPixmap",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; + Node14 -> Node13 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node14 -> Node17 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node17 [label="QMainWindow",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; + Node14 -> Node18 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node18 [label="QGridLayout",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; + Node14 -> Node19 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node19 [label="QPushButton",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; + Node14 -> Node20 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node20 [label="QTextEdit",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; + Node14 -> Node21 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node21 [label="QLabel",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; + Node14 -> Node22 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node22 [label="QLineEdit",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; + Node10 -> Node23 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node23 [label="Image/IntelliImage.h",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_image_8h.html",tooltip=" "]; + Node23 -> Node11 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node23 -> Node6 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node23 -> Node5 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node23 -> Node24 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node24 [label="QSize",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; + Node23 -> Node12 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node23 -> Node9 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node23 -> Node25 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node25 [label="IntelliHelper/IntelliTriangulation.h",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_triangulation_8h.html",tooltip=" "]; + Node25 -> Node6 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node25 -> Node9 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node23 -> Node26 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node26 [label="IntelliHelper/IntelliRender\lSettings.h",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_render_settings_8h.html",tooltip=" "]; + Node10 -> Node27 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node27 [label="Image/IntelliRasterImage.h",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_raster_image_8h.html",tooltip=" "]; + Node27 -> Node23 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node10 -> Node28 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node28 [label="Image/IntelliShapedImage.h",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_shaped_image_8h.html",tooltip=" "]; + Node28 -> Node27 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node28 -> Node9 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node10 -> Node3 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node10 -> Node4 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node1 -> Node29 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node29 [label="QDebug",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; Node1 -> Node7 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node1 -> Node19 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node19 [label="QInputDialog",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; + Node1 -> Node30 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node30 [label="QInputDialog",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; } diff --git a/docs/html/_intelli_tool_pen_8cpp_source.html b/docs/html/_intelli_tool_pen_8cpp_source.html index cdeaa43..c75e60f 100644 --- a/docs/html/_intelli_tool_pen_8cpp_source.html +++ b/docs/html/_intelli_tool_pen_8cpp_source.html @@ -96,13 +96,13 @@ $(document).ready(function(){initNavTree('_intelli_tool_pen_8cpp_source.html',''
4 #include "QColorDialog"
5 #include "QInputDialog"
6 
- -
8  : IntelliTool(Area, colorPicker){
-
9  this->penWidth = QInputDialog::getInt(nullptr, "Pen width", "Width:", 1,0, 50, 1);
+ +
8  : IntelliTool(Area, colorPicker, Toolsettings){
+
10 }
11 
-
13 
+
14 }
15 
@@ -115,8 +115,8 @@ $(document).ready(function(){initNavTree('_intelli_tool_pen_8cpp_source.html',''
23 
-
26  this->point=QPoint(x,y);
-
27  this->Canvas->image->drawPixel(point, colorPicker->getFirstColor());
+
26  this->previousPoint=QPoint(x,y);
+
29 }
30 
@@ -125,50 +125,53 @@ $(document).ready(function(){initNavTree('_intelli_tool_pen_8cpp_source.html',''
33 }
34 
35 void IntelliToolPen::onMouseMoved(int x, int y){
-
36  if(this->drawing) {
+
36  if(this->isDrawing) {
37  QPoint newPoint(x,y);
-
38  this->Canvas->image->drawLine(this->point, newPoint, colorPicker->getFirstColor(), penWidth);
-
39  this->point=newPoint;
+
38  this->Canvas->image->drawLine(this->previousPoint, newPoint, colorPicker->getFirstColor(), Toolsettings->getLineWidth());
+
39  this->previousPoint=newPoint;
40  }
42 }
43 
-
46  this->penWidth+=value;
-
47  if(this->penWidth<=0) {
-
48  this->penWidth=1;
-
49  }
-
50 }
+ +
47 }
-
virtual void onMouseRightPressed(int x, int y)
A function managing the right click Pressed of a Mouse. Constructing the Canvas to draw on....
Definition: IntelliTool.cpp:14
-
virtual void onMouseLeftReleased(int x, int y)
A function managing the left click Released of a Mouse. Call this in child classes!
Definition: IntelliTool.cpp:32
-
IntelliColorPicker * colorPicker
A pointer to the IntelliColorPicker of the PaintingArea to interact with, and get the colors.
Definition: IntelliTool.h:38
-
virtual void drawLine(const QPoint &p1, const QPoint &p2, const QColor &color, const int &penWidth)
A function that draws A Line between two given Points in a given color.
-
virtual void onMouseLeftPressed(int x, int y)
A function managing the left click Pressed of a Mouse. Resetting the current draw....
Definition: IntelliTool.cpp:25
+ +
virtual void onMouseRightPressed(int x, int y)
A function managing the right click Pressed of a Mouse. Constructing the Canvas to draw on....
Definition: IntelliTool.cpp:15
+
virtual void onMouseLeftReleased(int x, int y)
A function managing the left click Released of a Mouse. Call this in child classes!
Definition: IntelliTool.cpp:33
+
IntelliColorPicker * colorPicker
A pointer to the IntelliColorPicker of the PaintingArea to interact with, and get the colors.
Definition: IntelliTool.h:51
+
virtual void drawLine(const QPoint &p1, const QPoint &p2, const QColor &color, const int &penWidth)
A function that draws A Line between two given Points in a given color.
+
virtual void onMouseLeftPressed(int x, int y)
A function managing the left click Pressed of a Mouse. Resetting the current draw....
Definition: IntelliTool.cpp:26
+
IntelliToolsettings * Toolsettings
Definition: IntelliTool.h:53
+
virtual ~IntelliToolPen() override
A Destructor.
-
virtual void drawPixel(const QPoint &p1, const QColor &color)
A funtcion used to draw a pixel on the Image with the given Color.
virtual void onMouseMoved(int x, int y) override
A function managing the mouse moved event. To draw the line.
virtual void onMouseRightPressed(int x, int y) override
A function managing the right click pressed of a mouse. Resetting the current draw.
virtual void onMouseRightReleased(int x, int y) override
A function managing the right click released of a mouse.
-
The PaintingArea class manages the methods and stores information about the current painting area,...
Definition: PaintingArea.h:36
-
virtual void onMouseRightReleased(int x, int y)
A function managing the right click Released of a Mouse. Merging the Canvas to Active....
Definition: IntelliTool.cpp:21
-
LayerObject * Canvas
A pointer to the drawing canvas of the tool, work on this.
Definition: IntelliTool.h:48
+
The PaintingArea class manages the methods and stores information about the current painting area,...
Definition: PaintingArea.h:37
+
bool isDrawing
A flag checking if the user is currently drawing or not.
Definition: IntelliTool.h:68
+
virtual void drawPoint(const QPoint &p1, const QColor &color, const int &penWidth)
A.
+
virtual void onMouseRightReleased(int x, int y)
A function managing the right click Released of a Mouse. Merging the Canvas to Active....
Definition: IntelliTool.cpp:22
+
LayerObject * Canvas
A pointer to the drawing canvas of the tool, work on this.
Definition: IntelliTool.h:63
virtual void onWheelScrolled(int value) override
A function managing the scroll event. Changing penWidth relativ to value.
-
bool drawing
A flag checking if the user is currently drawing or not.
Definition: IntelliTool.h:53
-
An abstract class that manages the basic events, like mouse clicks or scrolls events.
Definition: IntelliTool.h:13
+
An abstract class that manages the basic events, like mouse clicks or scrolls events.
Definition: IntelliTool.h:14
virtual void onMouseLeftReleased(int x, int y) override
A function managing the left click released of a mouse. Merging the drawing to the active layer.
QColor getFirstColor()
A function to read the primary selected color.
+
IntelliToolPen(PaintingArea *Area, IntelliColorPicker *colorPicker, IntelliToolsettings *Toolsettings)
A constructor setting the general paintingArea and colorPicker. Reading the penWidth.
+
Tooltype ActiveType
Definition: IntelliTool.h:46
The IntelliColorPicker manages the selected colors for one whole project.
-
IntelliImage * image
Definition: PaintingArea.h:25
+
IntelliImage * image
Definition: PaintingArea.h:26
+ -
virtual void onMouseMoved(int x, int y)
A function managing the mouse moved event. Call this in child classes!
Definition: IntelliTool.cpp:41
+
virtual void onMouseMoved(int x, int y)
A function managing the mouse moved event. Call this in child classes!
Definition: IntelliTool.cpp:42
virtual void onMouseLeftPressed(int x, int y) override
A function managing the left click pressed of a mouse. Starting the drawing procedure.
virtual void calculateVisiblity()=0
An abstract function that calculates the visiblity of the Image data if needed.
-
virtual void onWheelScrolled(int value)
A function managing the scroll event. A positive value means scrolling outwards. Call this in child c...
Definition: IntelliTool.cpp:46
-
IntelliToolPen(PaintingArea *Area, IntelliColorPicker *colorPicker)
A constructor setting the general paintingArea and colorPicker. Reading the penWidth.
+
virtual void onWheelScrolled(int value)
A function managing the scroll event. A positive value means scrolling outwards. Call this in child c...
Definition: IntelliTool.cpp:47
+ + + + + + + + + +
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
IntelliToolsettings.cpp File Reference
+
+
+
#include "IntelliToolsettings.h"
+#include <QInputDialog>
+
+

Go to the source code of this file.

+
+
+ + + + diff --git a/docs/html/_intelli_toolsettings_8cpp__incl.dot b/docs/html/_intelli_toolsettings_8cpp__incl.dot new file mode 100644 index 0000000..9458335 --- /dev/null +++ b/docs/html/_intelli_toolsettings_8cpp__incl.dot @@ -0,0 +1,11 @@ +digraph "intelliphoto/src/IntelliHelper/IntelliToolsettings.cpp" +{ + // LATEX_PDF_SIZE + edge [fontname="Helvetica",fontsize="10",labelfontname="Helvetica",labelfontsize="10"]; + node [fontname="Helvetica",fontsize="10",shape=record]; + Node1 [label="intelliphoto/src/Intelli\lHelper/IntelliToolsettings.cpp",height=0.2,width=0.4,color="black", fillcolor="grey75", style="filled", fontcolor="black",tooltip=" "]; + Node1 -> Node2 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node2 [label="IntelliToolsettings.h",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_toolsettings_8h.html",tooltip=" "]; + Node1 -> Node3 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node3 [label="QInputDialog",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; +} diff --git a/docs/html/_intelli_toolsettings_8cpp_source.html b/docs/html/_intelli_toolsettings_8cpp_source.html new file mode 100644 index 0000000..7591999 --- /dev/null +++ b/docs/html/_intelli_toolsettings_8cpp_source.html @@ -0,0 +1,168 @@ + + + + + + + +IntelliPhoto: intelliphoto/src/IntelliHelper/IntelliToolsettings.cpp Source File + + + + + + + + + + + + + + +
+
+ + + + + + +
+
IntelliPhoto +  0.5 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
IntelliToolsettings.cpp
+
+
+Go to the documentation of this file.
1 #include "IntelliToolsettings.h"
+
2 #include <QInputDialog>
+
3 
+ +
5 {
+
6  lineWidth = 1;
+
7  innerAlpha = 255;
+
8  Linestyle = LineStyle::SOLID_LINE;
+
9 }
+
10 
+ +
12 
+
13 }
+
14 
+ +
16  return lineWidth;
+
17 }
+
18 
+ +
20  lineWidth = QInputDialog::getInt(nullptr,"Line Width Input", "Width",1,1,50,1);
+
21 }
+
22 
+ +
24  if(LineWidth < 1) {
+
25  LineWidth = 1;
+
26  }
+
27  else if(LineWidth > 50) {
+
28  LineWidth = 50;
+
29  }
+
30  lineWidth = LineWidth;
+
31 }
+
32 
+ +
34  return this->innerAlpha;
+
35 }
+
36 
+ +
38  this->innerAlpha = QInputDialog::getInt(nullptr,"Inner Aplha Input", "Value",0,0,255,1);
+
39 }
+
40 
+ +
42  if(innerAlpha < 0) {
+
43  innerAlpha = 0;
+
44  }
+
45  else if(innerAlpha > 255) {
+
46  innerAlpha = 255;
+
47  }
+
48  this->innerAlpha = innerAlpha;
+
49 }
+
50 
+ +
52  return Linestyle;
+
53 }
+
+
+ + + + +
LineStyle
The LineStyle enum classifing all ways of drawing a line.
+ + + + + + + + + diff --git a/docs/html/_intelli_toolsettings_8h.html b/docs/html/_intelli_toolsettings_8h.html new file mode 100644 index 0000000..b77d91d --- /dev/null +++ b/docs/html/_intelli_toolsettings_8h.html @@ -0,0 +1,115 @@ + + + + + + + +IntelliPhoto: intelliphoto/src/IntelliHelper/IntelliToolsettings.h File Reference + + + + + + + + + + + + + + +
+
+ + + + + + +
+
IntelliPhoto +  0.5 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
IntelliToolsettings.h File Reference
+
+ +
+ + + + diff --git a/docs/html/_intelli_toolsettings_8h__dep__incl.dot b/docs/html/_intelli_toolsettings_8h__dep__incl.dot new file mode 100644 index 0000000..e71a1a5 --- /dev/null +++ b/docs/html/_intelli_toolsettings_8h__dep__incl.dot @@ -0,0 +1,62 @@ +digraph "intelliphoto/src/IntelliHelper/IntelliToolsettings.h" +{ + // LATEX_PDF_SIZE + edge [fontname="Helvetica",fontsize="10",labelfontname="Helvetica",labelfontsize="10"]; + node [fontname="Helvetica",fontsize="10",shape=record]; + Node1 [label="intelliphoto/src/Intelli\lHelper/IntelliToolsettings.h",height=0.2,width=0.4,color="black", fillcolor="grey75", style="filled", fontcolor="black",tooltip=" "]; + Node1 -> Node2 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node2 [label="intelliphoto/src/Intelli\lHelper/IntelliToolsettings.cpp",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_toolsettings_8cpp.html",tooltip=" "]; + Node1 -> Node3 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node3 [label="intelliphoto/src/Tool\l/IntelliTool.h",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_tool_8h.html",tooltip=" "]; + Node3 -> Node4 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node4 [label="intelliphoto/src/Layer\l/PaintingArea.h",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_painting_area_8h.html",tooltip=" "]; + Node4 -> Node5 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node5 [label="intelliphoto/src/GUI\l/IntelliPhotoGui.cpp",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_photo_gui_8cpp.html",tooltip=" "]; + Node4 -> Node6 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node6 [label="intelliphoto/src/Layer\l/PaintingArea.cpp",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_painting_area_8cpp.html",tooltip=" "]; + Node4 -> Node7 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node7 [label="intelliphoto/src/Tool\l/IntelliTool.cpp",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_tool_8cpp.html",tooltip=" "]; + Node4 -> Node8 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node8 [label="intelliphoto/src/Tool\l/IntelliToolCircle.cpp",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_tool_circle_8cpp.html",tooltip=" "]; + Node4 -> Node9 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node9 [label="intelliphoto/src/Tool\l/IntelliToolFloodFill.cpp",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_tool_flood_fill_8cpp.html",tooltip=" "]; + Node4 -> Node10 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node10 [label="intelliphoto/src/Tool\l/IntelliToolLine.cpp",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_tool_line_8cpp.html",tooltip=" "]; + Node4 -> Node11 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node11 [label="intelliphoto/src/Tool\l/IntelliToolPen.cpp",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_tool_pen_8cpp.html",tooltip=" "]; + Node4 -> Node12 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node12 [label="intelliphoto/src/Tool\l/IntelliToolPlain.cpp",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_tool_plain_8cpp.html",tooltip=" "]; + Node4 -> Node13 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node13 [label="intelliphoto/src/Tool\l/IntelliToolPolygon.cpp",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_tool_polygon_8cpp.html",tooltip=" "]; + Node4 -> Node14 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node14 [label="intelliphoto/src/Tool\l/IntelliToolRectangle.cpp",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_tool_rectangle_8cpp.html",tooltip=" "]; + Node3 -> Node7 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node3 -> Node15 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node15 [label="intelliphoto/src/Tool\l/IntelliToolCircle.h",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_tool_circle_8h.html",tooltip=" "]; + Node15 -> Node6 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node15 -> Node8 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node3 -> Node16 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node16 [label="intelliphoto/src/Tool\l/IntelliToolFloodFill.h",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_tool_flood_fill_8h.html",tooltip=" "]; + Node16 -> Node6 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node16 -> Node9 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node3 -> Node17 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node17 [label="intelliphoto/src/Tool\l/IntelliToolLine.h",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_tool_line_8h.html",tooltip=" "]; + Node17 -> Node6 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node17 -> Node10 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node3 -> Node18 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node18 [label="intelliphoto/src/Tool\l/IntelliToolPen.h",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_tool_pen_8h.html",tooltip=" "]; + Node18 -> Node6 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node18 -> Node11 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node3 -> Node19 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node19 [label="intelliphoto/src/Tool\l/IntelliToolPlain.h",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_tool_plain_8h.html",tooltip=" "]; + Node19 -> Node6 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node19 -> Node12 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node3 -> Node20 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node20 [label="intelliphoto/src/Tool\l/IntelliToolPolygon.h",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_tool_polygon_8h.html",tooltip=" "]; + Node20 -> Node6 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node20 -> Node13 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node3 -> Node21 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node21 [label="intelliphoto/src/Tool\l/IntelliToolRectangle.h",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_tool_rectangle_8h.html",tooltip=" "]; + Node21 -> Node6 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node21 -> Node14 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; +} diff --git a/docs/html/_intelli_toolsettings_8h_source.html b/docs/html/_intelli_toolsettings_8h_source.html new file mode 100644 index 0000000..c419423 --- /dev/null +++ b/docs/html/_intelli_toolsettings_8h_source.html @@ -0,0 +1,142 @@ + + + + + + + +IntelliPhoto: intelliphoto/src/IntelliHelper/IntelliToolsettings.h Source File + + + + + + + + + + + + + + +
+
+ + + + + + +
+
IntelliPhoto +  0.5 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
IntelliToolsettings.h
+
+
+Go to the documentation of this file.
1 #ifndef INTELLITOOLSETTINGS_H
+
2 #define INTELLITOOLSETTINGS_H
+
3 
+ +
5 public:
+
9 enum class LineStyle {
+
10  SOLID_LINE,
+ +
12 };
+ +
14 virtual ~IntelliToolsettings();
+
15 int getLineWidth();
+
16 void setLineWidth();
+
17 void setLineWidth(int LineWidth);
+
18 int getInnerAlpha();
+
19 void setInnerAlpha();
+
20 void setInnerAlpha(int innerAlpha);
+ +
22 
+
23 private:
+
24 int lineWidth;
+
25 int innerAlpha;
+
26 LineStyle Linestyle;
+
27 };
+
28 
+
29 #endif // INTELLITOOLSETTINGS_H
+
+
+ + + +
LineStyle
The LineStyle enum classifing all ways of drawing a line.
+ + + + + + + + + + + diff --git a/docs/html/_intelli_triangulation_8cpp.html b/docs/html/_intelli_triangulation_8cpp.html new file mode 100644 index 0000000..7ef82bf --- /dev/null +++ b/docs/html/_intelli_triangulation_8cpp.html @@ -0,0 +1,136 @@ + + + + + + + +IntelliPhoto: intelliphoto/src/IntelliHelper/IntelliTriangulation.cpp File Reference + + + + + + + + + + + + + + +
+
+ + + + + + +
+
IntelliPhoto +  0.5 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
IntelliTriangulation.cpp File Reference
+
+
+
#include "IntelliTriangulation.h"
+#include <algorithm>
+#include <queue>
+#include <cmath>
+
+

Go to the source code of this file.

+ + + + +

+Macros

#define pi   3.1415926535897932384626433832795
 
+

Macro Definition Documentation

+ +

◆ pi

+ +
+
+ + + + +
#define pi   3.1415926535897932384626433832795
+
+ +

Definition at line 5 of file IntelliTriangulation.cpp.

+ +
+
+
+
+ + + + diff --git a/docs/html/_intelli_triangulation_8cpp.js b/docs/html/_intelli_triangulation_8cpp.js new file mode 100644 index 0000000..f187ea4 --- /dev/null +++ b/docs/html/_intelli_triangulation_8cpp.js @@ -0,0 +1,4 @@ +var _intelli_triangulation_8cpp = +[ + [ "pi", "_intelli_triangulation_8cpp.html#a1daf785e3f68d293c7caa1c756d5cb74", null ] +]; \ No newline at end of file diff --git a/docs/html/_intelli_triangulation_8cpp__incl.dot b/docs/html/_intelli_triangulation_8cpp__incl.dot new file mode 100644 index 0000000..d4ea95e --- /dev/null +++ b/docs/html/_intelli_triangulation_8cpp__incl.dot @@ -0,0 +1,19 @@ +digraph "intelliphoto/src/IntelliHelper/IntelliTriangulation.cpp" +{ + // LATEX_PDF_SIZE + edge [fontname="Helvetica",fontsize="10",labelfontname="Helvetica",labelfontsize="10"]; + node [fontname="Helvetica",fontsize="10",shape=record]; + Node1 [label="intelliphoto/src/Intelli\lHelper/IntelliTriangulation.cpp",height=0.2,width=0.4,color="black", fillcolor="grey75", style="filled", fontcolor="black",tooltip=" "]; + Node1 -> Node2 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node2 [label="IntelliTriangulation.h",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_triangulation_8h.html",tooltip=" "]; + Node2 -> Node3 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node3 [label="QPoint",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; + Node2 -> Node4 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node4 [label="vector",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; + Node1 -> Node5 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node5 [label="algorithm",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; + Node1 -> Node6 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node6 [label="queue",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; + Node1 -> Node7 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node7 [label="cmath",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; +} diff --git a/docs/html/_intelli_triangulation_8cpp_source.html b/docs/html/_intelli_triangulation_8cpp_source.html new file mode 100644 index 0000000..8fc95e8 --- /dev/null +++ b/docs/html/_intelli_triangulation_8cpp_source.html @@ -0,0 +1,237 @@ + + + + + + + +IntelliPhoto: intelliphoto/src/IntelliHelper/IntelliTriangulation.cpp Source File + + + + + + + + + + + + + + +
+
+ + + + + + +
+
IntelliPhoto +  0.5 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
IntelliTriangulation.cpp
+
+
+Go to the documentation of this file.
1 #include "IntelliTriangulation.h"
+
2 #include <algorithm>
+
3 #include <queue>
+
4 #include <cmath>
+
5 #define pi 3.1415926535897932384626433832795
+
6 
+
7 std::vector<Triangle> IntelliTriangulation::calculateTriangles(std::vector<QPoint> polyPoints){
+
8  // helper for managing the triangle vertices and their state
+
9  struct TriangleHelper {
+
10  QPoint vertex;
+
11  float interiorAngle;
+
12  int idx;
+
13  bool isTip;
+
14  };
+
15 
+
16  // calculates the inner angle of 'point'
+
17  auto calculateInner = [](QPoint& point, QPoint& prev, QPoint& post){
+
18  QPoint AP(point.x()-prev.x(), point.y()-prev.y());
+
19  QPoint BP(point.x()-post.x(), point.y()-post.y());
+
20 
+
21  float topSclar = AP.x()*BP.x()+AP.y()*BP.y();
+
22  float absolute = static_cast<float>(sqrt(pow(AP.x(),2.)+pow(AP.y(),2.))*sqrt(pow(BP.x(),2.)+pow(BP.y(),2.)));
+
23  return acos(topSclar/absolute);
+
24  };
+
25 
+
26  // gets the first element of vec for which element.isTip == true holds
+
27  auto getTip= [](const std::vector<TriangleHelper>& vec){
+
28  size_t min = 0;
+
29  for(size_t i=0; i<vec.size(); i++) {
+
30  if(vec[i].interiorAngle<vec[min].interiorAngle) {
+
31  min = i;
+
32  }
+
33  }
+
34  return vec[min];
+
35  };
+
36 
+
37  // get the vertex idx bevor idx in relation to the container length
+
38  auto getPrev = [](int idx, int length){
+
39  return (idx-1)>=0 ? (idx-1) : (length-1);
+
40  };
+
41 
+
42  // get the vertex idx after idx in relation to the container lenght
+
43  auto getPost = [](int idx, int length){
+
44  return (idx+1)%length;
+
45  };
+
46 
+
47  // return if the vertex is a tip
+
48  auto isTip = [](float angle){
+
49  return static_cast<double>(angle)<(pi/2.);
+
50  };
+
51 
+
52  std::vector<TriangleHelper> Vertices;
+
53  std::vector<Triangle> Triangles;
+
54 
+
55  // set up all vertices and calculate intirior angle
+
56  for(int i=0; i<static_cast<int>(polyPoints.size()); i++) {
+
57  TriangleHelper helper;
+
58  int prev = getPrev(i, static_cast<int>(polyPoints.size()));
+
59  int post = getPost(i, static_cast<int>(polyPoints.size()));
+
60 
+
61  helper.vertex = polyPoints[static_cast<size_t>(i)];
+
62  helper.idx = i;
+
63 
+
64  helper.interiorAngle = calculateInner(polyPoints[static_cast<size_t>(i)],
+
65  polyPoints[static_cast<size_t>(prev)],
+
66  polyPoints[static_cast<size_t>(post)]);
+
67  helper.isTip = isTip(helper.interiorAngle);
+
68  Vertices.push_back(helper);
+
69  }
+
70 
+
71  // search triangles based on the intirior angles of each vertey
+
72  while(Triangles.size() != polyPoints.size()-2) {
+
73  Triangle tri;
+
74  TriangleHelper smallest = getTip(Vertices);
+
75  int prev = getPrev(smallest.idx, static_cast<int>(Vertices.size()));
+
76  int post = getPost(smallest.idx, static_cast<int>(Vertices.size()));
+
77 
+
78  // set triangle and push it
+
79  tri.A = Vertices[static_cast<size_t>(prev)].vertex;
+
80  tri.B = Vertices[static_cast<size_t>(smallest.idx)].vertex;
+
81  tri.C = Vertices[static_cast<size_t>(post)].vertex;
+
82  Triangles.push_back(tri);
+
83 
+
84  // update Vertice array
+
85  Vertices.erase(Vertices.begin()+smallest.idx);
+
86  for(size_t i=static_cast<size_t>(smallest.idx); i<Vertices.size(); i++) {
+
87  Vertices[i].idx-=1;
+
88  }
+
89 
+
90  // update post und prev idx
+
91  post = getPrev(post, Vertices.size());
+
92  prev = prev<smallest.idx ? prev : (prev-1);
+
93 
+
94  // calcultae neighboors of prev and post to calculate new interior angles
+
95  int prevOfPrev = getPrev(prev, static_cast<int>(Vertices.size()));
+
96  int postOfPrev = getPost(prev, static_cast<int>(Vertices.size()));
+
97 
+
98  int prevOfPost = getPrev(post, static_cast<int>(Vertices.size()));
+
99  int postOfPost = getPost(post, static_cast<int>(Vertices.size()));
+
100 
+
101  // update vertices with interior angles
+
102  // updtae prev
+
103  Vertices[static_cast<size_t>(prev)].interiorAngle = calculateInner(Vertices[static_cast<size_t>(prev)].vertex,
+
104  Vertices[static_cast<size_t>(prevOfPrev)].vertex,
+
105  Vertices[static_cast<size_t>(postOfPrev)].vertex);
+
106  Vertices[static_cast<size_t>(prev)].isTip = isTip(Vertices[static_cast<size_t>(prev)].interiorAngle);
+
107  // update post
+
108  Vertices[static_cast<size_t>(post)].interiorAngle = calculateInner(Vertices[static_cast<size_t>(post)].vertex,
+
109  Vertices[static_cast<size_t>(prevOfPost)].vertex,
+
110  Vertices[static_cast<size_t>(postOfPost)].vertex);
+
111  Vertices[static_cast<size_t>(post)].isTip = isTip(Vertices[static_cast<size_t>(post)].interiorAngle);
+
112  }
+
113  return Triangles;
+
114 }
+
115 
+
116 bool IntelliTriangulation::isInPolygon(std::vector<Triangle> &triangles, QPoint &point){
+
117  for(auto triangle : triangles) {
+
118  if(IntelliTriangulation::isInTriangle(triangle, point)) {
+
119  return true;
+
120  }
+
121  }
+
122  return false;
+
123 }
+
+
+
bool isInTriangle(Triangle &tri, QPoint &P)
A function to check if a given point is in a triangle.
+
std::vector< Triangle > calculateTriangles(std::vector< QPoint > polyPoints)
A function to split a polygon in its spanning traingles by using Meisters Theorem of graph theory by ...
+ +
#define pi
+ +
The Triangle struct holds the 3 vertices of a triangle.
+
bool isInPolygon(std::vector< Triangle > &triangles, QPoint &point)
A function to check if a point lies in a polygon by checking its spanning triangles.
+ + + + + + diff --git a/docs/html/_intelli_triangulation_8h.html b/docs/html/_intelli_triangulation_8h.html new file mode 100644 index 0000000..ea5eb14 --- /dev/null +++ b/docs/html/_intelli_triangulation_8h.html @@ -0,0 +1,140 @@ + + + + + + + +IntelliPhoto: intelliphoto/src/IntelliHelper/IntelliTriangulation.h File Reference + + + + + + + + + + + + + + +
+
+ + + + + + +
+
IntelliPhoto +  0.5 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
IntelliTriangulation.h File Reference
+
+
+
#include <QPoint>
+#include <vector>
+
+

Go to the source code of this file.

+ + + + + +

+Classes

struct  Triangle
 The Triangle struct holds the 3 vertices of a triangle. More...
 
+ + + +

+Namespaces

 IntelliTriangulation
 
+ + + + + + + + + + + + + +

+Functions

float IntelliTriangulation::sign (QPoint &p1, QPoint &p2, QPoint &p3)
 A function to get the 2*area of a traingle, using its determinat. More...
 
bool IntelliTriangulation::isInTriangle (Triangle &tri, QPoint &P)
 A function to check if a given point is in a triangle. More...
 
std::vector< TriangleIntelliTriangulation::calculateTriangles (std::vector< QPoint > polyPoints)
 A function to split a polygon in its spanning traingles by using Meisters Theorem of graph theory by clipping ears of a planar graph. More...
 
bool IntelliTriangulation::isInPolygon (std::vector< Triangle > &triangles, QPoint &point)
 A function to check if a point lies in a polygon by checking its spanning triangles. More...
 
+
+
+ + + + diff --git a/docs/html/_intelli_triangulation_8h.js b/docs/html/_intelli_triangulation_8h.js new file mode 100644 index 0000000..0384860 --- /dev/null +++ b/docs/html/_intelli_triangulation_8h.js @@ -0,0 +1,8 @@ +var _intelli_triangulation_8h = +[ + [ "Triangle", "struct_triangle.html", "struct_triangle" ], + [ "calculateTriangles", "_intelli_triangulation_8h.html#acdaf1ed598e868b25e9e06d580da32e5", null ], + [ "isInPolygon", "_intelli_triangulation_8h.html#a00621e2d8708fe2e8966d7d79b64e186", null ], + [ "isInTriangle", "_intelli_triangulation_8h.html#ac150fee67fd41a451bd2592f10e00197", null ], + [ "sign", "_intelli_triangulation_8h.html#af9af549a7faff35a74c1265b290ea0ca", null ] +]; \ No newline at end of file diff --git a/docs/html/_intelli_triangulation_8h__dep__incl.dot b/docs/html/_intelli_triangulation_8h__dep__incl.dot new file mode 100644 index 0000000..00b4148 --- /dev/null +++ b/docs/html/_intelli_triangulation_8h__dep__incl.dot @@ -0,0 +1,52 @@ +digraph "intelliphoto/src/IntelliHelper/IntelliTriangulation.h" +{ + // LATEX_PDF_SIZE + edge [fontname="Helvetica",fontsize="10",labelfontname="Helvetica",labelfontsize="10"]; + node [fontname="Helvetica",fontsize="10",shape=record]; + Node1 [label="intelliphoto/src/Intelli\lHelper/IntelliTriangulation.h",height=0.2,width=0.4,color="black", fillcolor="grey75", style="filled", fontcolor="black",tooltip=" "]; + Node1 -> Node2 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node2 [label="intelliphoto/src/Image\l/IntelliImage.h",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_image_8h.html",tooltip=" "]; + Node2 -> Node3 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node3 [label="intelliphoto/src/Image\l/IntelliImage.cpp",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_image_8cpp.html",tooltip=" "]; + Node2 -> Node4 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node4 [label="intelliphoto/src/Image\l/IntelliRasterImage.h",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_raster_image_8h.html",tooltip=" "]; + Node4 -> Node5 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node5 [label="intelliphoto/src/Image\l/IntelliRasterImage.cpp",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_raster_image_8cpp.html",tooltip=" "]; + Node4 -> Node6 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node6 [label="intelliphoto/src/Image\l/IntelliShapedImage.h",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_shaped_image_8h.html",tooltip=" "]; + Node6 -> Node7 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node7 [label="intelliphoto/src/Image\l/IntelliShapedImage.cpp",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_shaped_image_8cpp.html",tooltip=" "]; + Node6 -> Node8 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node8 [label="intelliphoto/src/Layer\l/PaintingArea.h",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_painting_area_8h.html",tooltip=" "]; + Node8 -> Node9 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node9 [label="intelliphoto/src/GUI\l/IntelliPhotoGui.cpp",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_photo_gui_8cpp.html",tooltip=" "]; + Node8 -> Node10 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node10 [label="intelliphoto/src/Layer\l/PaintingArea.cpp",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_painting_area_8cpp.html",tooltip=" "]; + Node8 -> Node11 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node11 [label="intelliphoto/src/Tool\l/IntelliTool.cpp",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_tool_8cpp.html",tooltip=" "]; + Node8 -> Node12 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node12 [label="intelliphoto/src/Tool\l/IntelliToolCircle.cpp",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_tool_circle_8cpp.html",tooltip=" "]; + Node8 -> Node13 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node13 [label="intelliphoto/src/Tool\l/IntelliToolFloodFill.cpp",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_tool_flood_fill_8cpp.html",tooltip=" "]; + Node8 -> Node14 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node14 [label="intelliphoto/src/Tool\l/IntelliToolLine.cpp",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_tool_line_8cpp.html",tooltip=" "]; + Node8 -> Node15 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node15 [label="intelliphoto/src/Tool\l/IntelliToolPen.cpp",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_tool_pen_8cpp.html",tooltip=" "]; + Node8 -> Node16 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node16 [label="intelliphoto/src/Tool\l/IntelliToolPlain.cpp",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_tool_plain_8cpp.html",tooltip=" "]; + Node8 -> Node17 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node17 [label="intelliphoto/src/Tool\l/IntelliToolPolygon.cpp",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_tool_polygon_8cpp.html",tooltip=" "]; + Node8 -> Node18 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node18 [label="intelliphoto/src/Tool\l/IntelliToolRectangle.cpp",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_tool_rectangle_8cpp.html",tooltip=" "]; + Node6 -> Node10 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node4 -> Node8 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node4 -> Node10 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node2 -> Node8 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node1 -> Node7 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node1 -> Node19 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node19 [label="intelliphoto/src/Intelli\lHelper/IntelliTriangulation.cpp",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_triangulation_8cpp.html",tooltip=" "]; + Node1 -> Node20 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node20 [label="intelliphoto/src/Tool\l/IntelliToolPolygon.h",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_tool_polygon_8h.html",tooltip=" "]; + Node20 -> Node10 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node20 -> Node17 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; +} diff --git a/docs/html/_intelli_triangulation_8h__incl.dot b/docs/html/_intelli_triangulation_8h__incl.dot new file mode 100644 index 0000000..123f428 --- /dev/null +++ b/docs/html/_intelli_triangulation_8h__incl.dot @@ -0,0 +1,11 @@ +digraph "intelliphoto/src/IntelliHelper/IntelliTriangulation.h" +{ + // LATEX_PDF_SIZE + edge [fontname="Helvetica",fontsize="10",labelfontname="Helvetica",labelfontsize="10"]; + node [fontname="Helvetica",fontsize="10",shape=record]; + Node1 [label="intelliphoto/src/Intelli\lHelper/IntelliTriangulation.h",height=0.2,width=0.4,color="black", fillcolor="grey75", style="filled", fontcolor="black",tooltip=" "]; + Node1 -> Node2 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node2 [label="QPoint",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; + Node1 -> Node3 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node3 [label="vector",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; +} diff --git a/docs/html/_intelli_triangulation_8h_source.html b/docs/html/_intelli_triangulation_8h_source.html new file mode 100644 index 0000000..d485a01 --- /dev/null +++ b/docs/html/_intelli_triangulation_8h_source.html @@ -0,0 +1,150 @@ + + + + + + + +IntelliPhoto: intelliphoto/src/IntelliHelper/IntelliTriangulation.h Source File + + + + + + + + + + + + + + +
+
+ + + + + + +
+
IntelliPhoto +  0.5 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
IntelliTriangulation.h
+
+
+Go to the documentation of this file.
1 #ifndef INTELLITRIANGULATION_H
+
2 #define INTELLITRIANGULATION_H
+
3 
+
4 #include <QPoint>
+
5 #include <vector>
+
6 
+
10 struct Triangle {
+
11  QPoint A,B,C;
+
12 };
+
13 
+ +
15 
+
23 inline float sign(QPoint& p1, QPoint& p2, QPoint& p3){
+
24  return (p1.x()-p3.x())*(p2.y()-p3.y())-(p2.x()-p3.x())*(p1.y()-p3.y());
+
25 }
+
26 
+
33 inline bool isInTriangle(Triangle& tri, QPoint& P){
+
34  float val1, val2, val3;
+
35  bool neg, pos;
+
36 
+
37  val1 = IntelliTriangulation::sign(P,tri.A,tri.B);
+
38  val2 = IntelliTriangulation::sign(P,tri.B,tri.C);
+
39  val3 = IntelliTriangulation::sign(P,tri.C,tri.A);
+
40 
+
41  neg = (val1<0.f) || (val2<0.f) || (val3<0.f);
+
42  pos = (val1>0.f) || (val2>0.f) || (val3>0.f);
+
43 
+
44  return !(neg && pos);
+
45 }
+
46 
+
52 std::vector<Triangle> calculateTriangles(std::vector<QPoint> polyPoints);
+
53 
+
60 bool isInPolygon(std::vector<Triangle> &triangles, QPoint &point);
+
61 }
+
62 
+
63 #endif
+
+
+
bool isInTriangle(Triangle &tri, QPoint &P)
A function to check if a given point is in a triangle.
+
float sign(QPoint &p1, QPoint &p2, QPoint &p3)
A function to get the 2*area of a traingle, using its determinat.
+
std::vector< Triangle > calculateTriangles(std::vector< QPoint > polyPoints)
A function to split a polygon in its spanning traingles by using Meisters Theorem of graph theory by ...
+ + +
The Triangle struct holds the 3 vertices of a triangle.
+
bool isInPolygon(std::vector< Triangle > &triangles, QPoint &point)
A function to check if a point lies in a polygon by checking its spanning triangles.
+ + + + + + diff --git a/docs/html/_painting_area_8cpp.html b/docs/html/_painting_area_8cpp.html index 416bf72..8207a1c 100644 --- a/docs/html/_painting_area_8cpp.html +++ b/docs/html/_painting_area_8cpp.html @@ -105,11 +105,6 @@ $(document).ready(function(){initNavTree('_painting_area_8cpp.html','');}); #include "Tool/IntelliToolRectangle.h"
#include "Tool/IntelliToolFloodFill.h"
#include "Tool/IntelliToolPolygon.h"
-
-Include dependency graph for PaintingArea.cpp:
-
-
-

Go to the source code of this file.

diff --git a/docs/html/_painting_area_8cpp__incl.dot b/docs/html/_painting_area_8cpp__incl.dot index 74163ef..dfa6149 100644 --- a/docs/html/_painting_area_8cpp__incl.dot +++ b/docs/html/_painting_area_8cpp__incl.dot @@ -26,68 +26,90 @@ digraph "intelliphoto/src/Layer/PaintingArea.cpp" Node7 -> Node11 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; Node11 [label="QList",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; Node7 -> Node12 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node12 [label="Image/IntelliImage.h",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_image_8h.html",tooltip=" "]; - Node12 -> Node9 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node12 -> Node5 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node12 -> Node8 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node12 [label="GUI/IntelliPhotoGui.h",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_photo_gui_8h.html",tooltip=" "]; + Node12 -> Node4 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; Node12 -> Node13 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node13 [label="QSize",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; - Node12 -> Node10 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node12 -> Node3 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node7 -> Node14 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node14 [label="Image/IntelliRasterImage.h",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_raster_image_8h.html",tooltip=" "]; - Node14 -> Node12 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node7 -> Node15 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node15 [label="Image/IntelliShapedImage.h",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_shaped_image_8h.html",tooltip=" "]; - Node15 -> Node14 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node15 -> Node3 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node15 -> Node16 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node16 [label="IntelliHelper/IntelliHelper.h",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_helper_8h.html",tooltip=" "]; - Node16 -> Node5 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node16 -> Node3 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node7 -> Node17 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node17 [label="Tool/IntelliTool.h",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_tool_8h.html",tooltip=" "]; - Node17 -> Node18 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node18 [label="IntelliHelper/IntelliColor\lPicker.h",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_color_picker_8h.html",tooltip=" "]; - Node18 -> Node8 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node18 -> Node5 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node18 -> Node19 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node19 [label="QColorDialog",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; - Node17 -> Node3 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node7 -> Node18 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node1 -> Node14 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node1 -> Node15 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node1 -> Node20 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node20 [label="Tool/IntelliToolPen.h",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_tool_pen_8h.html",tooltip=" "]; - Node20 -> Node17 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node20 -> Node8 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node13 [label="QPixmap",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; + Node12 -> Node11 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node12 -> Node14 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node14 [label="QMainWindow",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; + Node12 -> Node15 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node15 [label="QGridLayout",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; + Node12 -> Node16 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node16 [label="QPushButton",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; + Node12 -> Node17 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node17 [label="QTextEdit",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; + Node12 -> Node18 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node18 [label="QLabel",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; + Node12 -> Node19 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node19 [label="QLineEdit",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; + Node7 -> Node20 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node20 [label="Image/IntelliImage.h",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_image_8h.html",tooltip=" "]; + Node20 -> Node9 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; Node20 -> Node5 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node1 -> Node21 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node21 [label="Tool/IntelliToolPlain.h",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_tool_plain_8h.html",tooltip=" "]; - Node21 -> Node17 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node21 -> Node8 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node1 -> Node22 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node22 [label="Tool/IntelliToolLine.h",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_tool_line_8h.html",tooltip=" "]; - Node22 -> Node17 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node20 -> Node8 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node20 -> Node21 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node21 [label="QSize",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; + Node20 -> Node10 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node20 -> Node3 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node20 -> Node22 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node22 [label="IntelliHelper/IntelliTriangulation.h",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_triangulation_8h.html",tooltip=" "]; Node22 -> Node5 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node1 -> Node23 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node23 [label="Tool/IntelliToolCircle.h",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_tool_circle_8h.html",tooltip=" "]; - Node23 -> Node17 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node23 -> Node8 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node23 -> Node5 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node1 -> Node24 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node24 [label="Tool/IntelliToolRectangle.h",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_tool_rectangle_8h.html",tooltip=" "]; - Node24 -> Node17 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node24 -> Node8 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node24 -> Node5 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node1 -> Node25 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node25 [label="Tool/IntelliToolFloodFill.h",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_tool_flood_fill_8h.html",tooltip=" "]; - Node25 -> Node17 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node25 -> Node8 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node1 -> Node26 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node26 [label="Tool/IntelliToolPolygon.h",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_tool_polygon_8h.html",tooltip=" "]; - Node26 -> Node17 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node26 -> Node16 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node22 -> Node3 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node20 -> Node23 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node23 [label="IntelliHelper/IntelliRender\lSettings.h",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_render_settings_8h.html",tooltip=" "]; + Node7 -> Node24 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node24 [label="Image/IntelliRasterImage.h",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_raster_image_8h.html",tooltip=" "]; + Node24 -> Node20 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node7 -> Node25 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node25 [label="Image/IntelliShapedImage.h",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_shaped_image_8h.html",tooltip=" "]; + Node25 -> Node24 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node25 -> Node3 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node7 -> Node26 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node26 [label="Tool/IntelliTool.h",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_tool_8h.html",tooltip=" "]; + Node26 -> Node27 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node27 [label="IntelliHelper/IntelliColor\lPicker.h",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_color_picker_8h.html",tooltip=" "]; + Node27 -> Node8 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node27 -> Node5 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node27 -> Node28 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node28 [label="QColorDialog",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; + Node26 -> Node29 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node29 [label="IntelliHelper/IntelliToolsettings.h",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_toolsettings_8h.html",tooltip=" "]; Node26 -> Node3 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node26 -> Node5 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node7 -> Node27 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node1 -> Node24 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node1 -> Node25 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node1 -> Node30 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node30 [label="Tool/IntelliToolPen.h",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_tool_pen_8h.html",tooltip=" "]; + Node30 -> Node26 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node30 -> Node8 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node30 -> Node5 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node1 -> Node31 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node31 [label="Tool/IntelliToolPlain.h",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_tool_plain_8h.html",tooltip=" "]; + Node31 -> Node26 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node31 -> Node8 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node1 -> Node32 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node32 [label="Tool/IntelliToolLine.h",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_tool_line_8h.html",tooltip=" "]; + Node32 -> Node26 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node32 -> Node5 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node1 -> Node33 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node33 [label="Tool/IntelliToolCircle.h",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_tool_circle_8h.html",tooltip=" "]; + Node33 -> Node26 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node33 -> Node8 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node33 -> Node5 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node1 -> Node34 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node34 [label="Tool/IntelliToolRectangle.h",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_tool_rectangle_8h.html",tooltip=" "]; + Node34 -> Node26 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node34 -> Node8 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node34 -> Node5 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node1 -> Node35 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node35 [label="Tool/IntelliToolFloodFill.h",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_tool_flood_fill_8h.html",tooltip=" "]; + Node35 -> Node26 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node35 -> Node8 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node1 -> Node36 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node36 [label="Tool/IntelliToolPolygon.h",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_tool_polygon_8h.html",tooltip=" "]; + Node36 -> Node26 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node36 -> Node22 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node36 -> Node3 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node36 -> Node5 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; } diff --git a/docs/html/_painting_area_8cpp_source.html b/docs/html/_painting_area_8cpp_source.html index 780fcb6..08331a1 100644 --- a/docs/html/_painting_area_8cpp_source.html +++ b/docs/html/_painting_area_8cpp_source.html @@ -113,8 +113,8 @@ $(document).ready(function(){initNavTree('_painting_area_8cpp_source.html','');}
21 PaintingArea::PaintingArea(int maxWidth, int maxHeight, QWidget*parent)
22  : QWidget(parent){
23  this->Tool = nullptr;
-
24  this->setUp(maxWidth, maxHeight);
-
25  this->addLayer(200,200,0,0,ImageType::Shaped_Image);
+
24  this->setLayerDimensions(maxWidth, maxHeight);
+
26  layerBundle[0].image->drawPlain(QColor(0,0,255,255));
27  std::vector<QPoint> polygon;
28  polygon.push_back(QPoint(100,000));
@@ -123,7 +123,7 @@ $(document).ready(function(){initNavTree('_painting_area_8cpp_source.html','');}
31  polygon.push_back(QPoint(000,100));
32  layerBundle[0].image->setPolygon(polygon);
33 
-
34  this->addLayer(200,200,150,150);
+
34  this->addLayer(200,200,150,150,IntelliImage::ImageType::RASTERIMAGE);
35  layerBundle[1].image->drawPlain(QColor(0,255,0,255));
36  layerBundle[1].alpha=200;
37 
@@ -134,7 +134,7 @@ $(document).ready(function(){initNavTree('_painting_area_8cpp_source.html','');}
42  delete Tool;
43 }
44 
-
45 void PaintingArea::setUp(int maxWidth, int maxHeight){
+
45 void PaintingArea::setLayerDimensions(int maxWidth, int maxHeight){
46  //set standart parameter
47  this->maxWidth = maxWidth;
48  this->maxHeight = maxHeight;
@@ -145,384 +145,454 @@ $(document).ready(function(){initNavTree('_painting_area_8cpp_source.html','');}
53 
54 }
55 
-
56 int PaintingArea::addLayer(int width, int height, int widthOffset, int heightOffset, ImageType type){
+
56 int PaintingArea::addLayer(int width, int height, int widthOffset, int heightOffset, IntelliImage::ImageType type){
57  LayerObject newLayer;
58  newLayer.width = width;
59  newLayer.height = height;
60  newLayer.widthOffset = widthOffset;
61  newLayer.heightOffset = heightOffset;
-
62  if(type==ImageType::Raster_Image) {
-
63  newLayer.image = new IntelliRasterImage(width,height);
-
64  }else if(type==ImageType::Shaped_Image) {
-
65  newLayer.image = new IntelliShapedImage(width, height);
+ +
63  newLayer.image = new IntelliRasterImage(width,height,renderSettings.getFastRenderer());
+
64  }else if(type==IntelliImage::ImageType::SHAPEDIMAGE) {
+
65  newLayer.image = new IntelliShapedImage(width, height, renderSettings.getFastRenderer());
66  }
67  newLayer.alpha = 255;
68  this->layerBundle.push_back(newLayer);
-
69  return static_cast<int>(layerBundle.size())-1;
-
70 }
-
71 
+
69  activeLayer = static_cast<int>(layerBundle.size())-1;
+
70  return activeLayer;
+
71 }
72 
-
73 void PaintingArea::deleteLayer(int index){
-
74  if(index<static_cast<int>(layerBundle.size())) {
-
75  this->layerBundle.erase(layerBundle.begin()+index);
-
76  if(activeLayer>=index) {
-
77  activeLayer--;
-
78  }
-
79  }
-
80 }
-
81 
- -
83  if(activeLayer>=0 && activeLayer < static_cast<int>(layerBundle.size())) {
-
84  this->layerBundle.erase(layerBundle.begin()+activeLayer);
-
85  activeLayer--;
-
86  }
-
87 }
-
88 
- -
90  if(index>=0&&index<static_cast<int>(layerBundle.size())) {
-
91  this->activeLayer=index;
-
92  }
-
93 }
-
94 
-
95 void PaintingArea::setAlphaOfLayer(int index, int alpha){
-
96  if(index>=0&&index<static_cast<int>(layerBundle.size())) {
-
97  layerBundle[static_cast<size_t>(index)].alpha=alpha;
-
98  }
-
99 }
-
100 
-
101 // Used to load the image and place it in the widget
-
102 bool PaintingArea::open(const QString &fileName){
-
103  if(this->activeLayer==-1) {
-
104  return false;
-
105  }
-
106  IntelliImage* active = layerBundle[static_cast<size_t>(activeLayer)].image;
-
107  bool open = active->loadImage(fileName);
-
108  active->calculateVisiblity();
-
109  update();
-
110  return open;
-
111 }
-
112 
-
113 // Save the current image
-
114 bool PaintingArea::save(const QString &fileName, const char*fileFormat){
-
115  if(layerBundle.size()==0) {
-
116  return false;
-
117  }
-
118  this->assembleLayers(true);
-
119 
-
120  if(!strcmp(fileFormat,"PNG")) {
-
121  QImage visibleImage = Canvas->convertToFormat(QImage::Format_Indexed8);
-
122  fileFormat = "png";
-
123  if (visibleImage.save(fileName, fileFormat)) {
-
124  return true;
-
125  } else {
-
126  return false;
-
127  }
-
128  }
-
129 
-
130  if (Canvas->save(fileName, fileFormat)) {
-
131  return true;
-
132  } else {
-
133  return false;
-
134  }
-
135 }
-
136 
-
137 // Color the image area with white
-
138 void PaintingArea::floodFill(int r, int g, int b, int a){
-
139  if(this->activeLayer==-1) {
-
140  return;
-
141  }
-
142  IntelliImage* active = layerBundle[static_cast<size_t>(activeLayer)].image;
-
143  active->drawPlain(QColor(r, g, b, a));
-
144  update();
-
145 }
-
146 
- -
148  layerBundle[static_cast<size_t>(activeLayer)].widthOffset += x;
-
149  layerBundle[static_cast<size_t>(activeLayer)].heightOffset += y;
-
150 }
-
151 
- -
153  if(idx==1) {
-
154  this->activateUpperLayer();
-
155  }else if(idx==-1) {
-
156  this->activateLowerLayer();
-
157  }
+
73 
+ +
75  if(idx<static_cast<int>(layerBundle.size())) {
+
76  this->layerBundle.erase(layerBundle.begin()+idx);
+
77  if(activeLayer>=idx && activeLayer != 0) {
+
78  activeLayer--;
+
79  }
+
80  }
+
81 }
+
82 
+ +
84  if(activeLayer>=0 && activeLayer < static_cast<int>(layerBundle.size())) {
+
85  this->layerBundle.erase(layerBundle.begin()+activeLayer);
+
86  activeLayer--;
+
87  }
+
88 }
+
89 
+ +
91  if(idx>=0&&idx<static_cast<int>(layerBundle.size())) {
+
92  this->activeLayer=idx;
+
93  }
+
94 }
+
95 
+
96 void PaintingArea::setLayerAlpha(int idx, int alpha){
+
97  if(idx>=0&&idx<static_cast<int>(layerBundle.size())) {
+
98  layerBundle[static_cast<size_t>(idx)].alpha=alpha;
+
99  }
+
100 }
+
101 
+
102 // Used to load the image and place it in the widget
+
103 bool PaintingArea::open(const QString &filePath){
+
104  if(this->activeLayer==-1) {
+
105  return false;
+
106  }
+
107  IntelliImage* active = layerBundle[static_cast<size_t>(activeLayer)].image;
+
108  bool open = active->loadImage(filePath);
+
109  active->calculateVisiblity();
+
110  update();
+
111  return open;
+
112 }
+
113 
+
114 // Save the current image
+
115 bool PaintingArea::save(const QString &filePath, const char*fileFormat){
+
116  if(layerBundle.size()==0) {
+
117  return false;
+
118  }
+
119  this->drawLayers(true);
+
120 
+
121  if(!strcmp(fileFormat,"PNG")) {
+
122  QImage visibleImage = Canvas->convertToFormat(QImage::Format_Indexed8);
+
123  fileFormat = "png";
+
124  if (visibleImage.save(filePath, fileFormat)) {
+
125  return true;
+
126  } else {
+
127  return false;
+
128  }
+
129  }
+
130 
+
131  if (Canvas->save(filePath, fileFormat)) {
+
132  return true;
+
133  } else {
+
134  return false;
+
135  }
+
136 }
+
137 
+
138 // Color the image area with white
+
139 void PaintingArea::floodFill(int r, int g, int b, int a){
+
140  if(this->activeLayer==-1) {
+
141  return;
+
142  }
+
143  IntelliImage* active = layerBundle[static_cast<size_t>(activeLayer)].image;
+
144  active->drawPlain(QColor(r, g, b, a));
+
145  update();
+
146 }
+
147 
+ +
149  if(Tool!=nullptr) {
+
150  if(Tool->getIsDrawing()) {
+
151  IntelliTool* temp = copyActiveTool();
+
152  delete this->Tool;
+
153  this->Tool = temp;
+
154  }
+
155  }
+
156  layerBundle[static_cast<size_t>(activeLayer)].widthOffset += x;
+
157  layerBundle[static_cast<size_t>(activeLayer)].heightOffset += y;
158 }
159 
- -
161  if(a>=0 && a < static_cast<int>(layerBundle.size())) {
-
162  this->setLayerToActive(a);
-
163  }
-
164 }
-
165 
- -
167  QColor clr = QColorDialog::getColor(colorPicker.getFirstColor(), nullptr, "Main Color", QColorDialog::DontUseNativeDialog);
-
168  this->colorPicker.setFirstColor(clr);
-
169 }
-
170 
- -
172  QColor clr = QColorDialog::getColor(colorPicker.getSecondColor(), nullptr, "Secondary Color", QColorDialog::DontUseNativeDialog);
-
173  this->colorPicker.setSecondColor(clr);
-
174 }
-
175 
- -
177  this->colorPicker.switchColors();
-
178 }
-
179 
- -
181  delete this->Tool;
-
182  Tool = new IntelliToolPen(this, &colorPicker);
-
183 }
-
184 
- -
186  delete this->Tool;
-
187  Tool = new IntelliToolPlainTool(this, &colorPicker);
-
188 }
-
189 
- -
191  delete this->Tool;
-
192  Tool = new IntelliToolLine(this, &colorPicker);
-
193 }
-
194 
- -
196  delete this->Tool;
-
197  Tool = new IntelliToolRectangle(this, &colorPicker);
-
198 }
-
199 
- -
201  delete this->Tool;
-
202  Tool = new IntelliToolCircle(this, &colorPicker);
-
203 }
- -
205  delete this->Tool;
-
206  Tool = new IntelliToolPolygon(this, &colorPicker);
-
207 }
-
208 
- -
210  delete this->Tool;
-
211  Tool = new IntelliToolFloodFill(this, &colorPicker);
-
212 }
-
213 
- -
215  return this->layerBundle[activeLayer].width;
-
216 }
-
217 
- -
219  return this->layerBundle[activeLayer].height;
+ +
161  if(Tool != nullptr) {
+
162  if(Tool->getIsDrawing()) {
+
163  IntelliTool* temp = copyActiveTool();
+
164  delete this->Tool;
+
165  this->Tool = temp;
+
166  }
+
167  }
+
168  if(idx==1) {
+
169  this->selectLayerUp();
+
170  }else if(idx==-1) {
+
171  this->selectLayerDown();
+
172  }
+
173 }
+
174 
+ +
176  if(Tool != nullptr) {
+
177  if(Tool->getIsDrawing()) {
+
178  IntelliTool* temp = copyActiveTool();
+
179  delete this->Tool;
+
180  this->Tool = temp;
+
181  }
+
182  }
+
183  if(a>=0 && a < static_cast<int>(layerBundle.size())) {
+
184  this->setLayerActive(a);
+
185  }
+
186 }
+
187 
+ +
189  QColor clr = QColorDialog::getColor(colorPicker.getFirstColor(), nullptr, "Main Color", QColorDialog::DontUseNativeDialog);
+
190  this->colorPicker.setFirstColor(clr);
+
191 }
+
192 
+ +
194  QColor clr = QColorDialog::getColor(colorPicker.getSecondColor(), nullptr, "Secondary Color", QColorDialog::DontUseNativeDialog);
+
195  this->colorPicker.setSecondColor(clr);
+
196 }
+
197 
+ +
199  this->colorPicker.swapColors();
+
200 }
+
201 
+ +
203  delete this->Tool;
+
204  Tool = new IntelliToolPen(this, &colorPicker, &Toolsettings);
+
205 }
+
206 
+ +
208  delete this->Tool;
+
209  Tool = new IntelliToolPlainTool(this, &colorPicker, &Toolsettings);
+
210 }
+
211 
+ +
213  delete this->Tool;
+
214  Tool = new IntelliToolLine(this, &colorPicker, &Toolsettings);
+
215 }
+
216 
+ +
218  delete this->Tool;
+
219  Tool = new IntelliToolRectangle(this, &colorPicker, &Toolsettings);
220 }
221 
-
222 // If a mouse button is pressed check if it was the
-
223 // left button and if so store the current position
-
224 // Set that we are currently drawing
-
225 void PaintingArea::mousePressEvent(QMouseEvent*event){
-
226  if(Tool == nullptr)
-
227  return;
-
228  int x = event->x()-layerBundle[activeLayer].widthOffset;
-
229  int y = event->y()-layerBundle[activeLayer].heightOffset;
-
230  if(event->button() == Qt::LeftButton) {
-
231  Tool->onMouseLeftPressed(x, y);
-
232  }else if(event->button() == Qt::RightButton) {
-
233  Tool->onMouseRightPressed(x, y);
-
234  }
-
235  update();
-
236 }
-
237 
-
238 // When the mouse moves if the left button is clicked
-
239 // we call the drawline function which draws a line
-
240 // from the last position to the current
-
241 void PaintingArea::mouseMoveEvent(QMouseEvent*event){
-
242  if(Tool == nullptr)
-
243  return;
-
244  int x = event->x()-layerBundle[activeLayer].widthOffset;
-
245  int y = event->y()-layerBundle[activeLayer].heightOffset;
-
246  Tool->onMouseMoved(x, y);
-
247  update();
-
248 }
-
249 
-
250 // If the button is released we set variables to stop drawing
-
251 void PaintingArea::mouseReleaseEvent(QMouseEvent*event){
-
252  if(Tool == nullptr)
-
253  return;
-
254  int x = event->x()-layerBundle[activeLayer].widthOffset;
-
255  int y = event->y()-layerBundle[activeLayer].heightOffset;
-
256  if(event->button() == Qt::LeftButton) {
-
257  Tool->onMouseLeftReleased(x, y);
-
258  }else if(event->button() == Qt::RightButton) {
-
259  Tool->onMouseRightReleased(x, y);
-
260  }
-
261  update();
-
262 }
-
263 
-
264 void PaintingArea::wheelEvent(QWheelEvent*event){
-
265  QPoint numDegrees = event->angleDelta() / 8;
-
266  if(!numDegrees.isNull()) {
-
267  QPoint numSteps = numDegrees / 15;
-
268  Tool->onWheelScrolled(numSteps.y()* -1);
-
269  }
-
270 }
-
271 
-
272 // QPainter provides functions to draw on the widget
-
273 // The QPaintEvent is sent to widgets that need to
-
274 // update themselves
-
275 void PaintingArea::paintEvent(QPaintEvent*event){
-
276  this->assembleLayers();
-
277 
-
278  QPainter painter(this);
-
279  QRect dirtyRec = event->rect();
-
280  painter.drawImage(dirtyRec, *Canvas, dirtyRec);
-
281  update();
-
282 }
-
283 
-
284 // Resize the image to slightly larger then the main window
-
285 // to cut down on the need to resize the image
-
286 void PaintingArea::resizeEvent(QResizeEvent*event){
-
287  //TODO wait till tool works
-
288  update();
-
289 }
-
290 
-
291 void PaintingArea::resizeImage(QImage*image_res, const QSize &newSize){
-
292  //TODO implement
-
293 }
-
294 
-
295 void PaintingArea::activateUpperLayer(){
-
296  if(activeLayer!=-1 && activeLayer<layerBundle.size()-1) {
-
297  std::swap(layerBundle[activeLayer], layerBundle[activeLayer+1]);
-
298  activeLayer++;
-
299  }
-
300 }
-
301 
-
302 void PaintingArea::activateLowerLayer(){
-
303  if(activeLayer!=-1 && activeLayer>0) {
-
304  std::swap(layerBundle[activeLayer], layerBundle[activeLayer-1]);
-
305  activeLayer--;
-
306  }
-
307 }
-
308 
-
309 void PaintingArea::assembleLayers(bool forSaving){
-
310  if(forSaving) {
-
311  Canvas->fill(Qt::GlobalColor::transparent);
-
312  }else{
-
313  Canvas->fill(Qt::GlobalColor::black);
-
314  }
-
315  for(size_t i=0; i<layerBundle.size(); i++) {
-
316  LayerObject layer = layerBundle[i];
-
317  QImage cpy = layer.image->getDisplayable(layer.alpha);
-
318  QColor clr_0;
-
319  QColor clr_1;
-
320  for(int y=0; y<layer.height; y++) {
-
321  if(layer.heightOffset+y<0) continue;
-
322  if(layer.heightOffset+y>=maxHeight) break;
-
323  for(int x=0; x<layer.width; x++) {
-
324  if(layer.widthOffset+x<0) continue;
-
325  if(layer.widthOffset+x>=maxWidth) break;
-
326  clr_0=Canvas->pixelColor(layer.widthOffset+x, layer.heightOffset+y);
-
327  clr_1=cpy.pixelColor(x,y);
-
328  float t = static_cast<float>(clr_1.alpha())/255.f;
-
329  int r =static_cast<int>(static_cast<float>(clr_1.red())*(t)+static_cast<float>(clr_0.red())*(1.f-t)+0.5f);
-
330  int g =static_cast<int>(static_cast<float>(clr_1.green())*(t)+static_cast<float>(clr_0.green())*(1.f-t)+0.5f);
-
331  int b =static_cast<int>(static_cast<float>(clr_1.blue())*(t)+static_cast<float>(clr_0.blue()*(1.f-t))+0.5f);
-
332  int a =std::min(clr_0.alpha()+clr_1.alpha(), 255);
-
333  clr_0.setRed(r);
-
334  clr_0.setGreen(g);
-
335  clr_0.setBlue(b);
-
336  clr_0.setAlpha(a);
-
337 
-
338  Canvas->setPixelColor(layer.widthOffset+x, layer.heightOffset+y, clr_0);
-
339  }
-
340  }
-
341  }
-
342 }
-
343 
-
344 void PaintingArea::createTempLayerAfter(int idx){
-
345  if(idx>=0) {
-
346  LayerObject newLayer;
-
347  newLayer.alpha = 255;
-
348  newLayer.height = layerBundle[idx].height;
-
349  newLayer.width = layerBundle[idx].width;
-
350  newLayer.heightOffset = layerBundle[idx].heightOffset;
-
351  newLayer.widthOffset = layerBundle[idx].widthOffset;
-
352  newLayer.image = layerBundle[idx].image->getDeepCopy();
-
353  layerBundle.insert(layerBundle.begin()+idx+1,newLayer);
-
354  }
-
355 }
+ +
223  delete this->Tool;
+
224  Tool = new IntelliToolCircle(this, &colorPicker, &Toolsettings);
+
225 }
+ +
227  delete this->Tool;
+
228  Tool = new IntelliToolPolygon(this, &colorPicker, &Toolsettings);
+
229 }
+
230 
+ +
232  delete this->Tool;
+
233  Tool = new IntelliToolFloodFill(this, &colorPicker, &Toolsettings);
+
234 }
+
235 
+ +
237  return this->layerBundle[static_cast<unsigned long long>(activeLayer)].width;
+
238 }
+
239 
+ +
241  return this->layerBundle[static_cast<unsigned long long>(activeLayer)].height;
+
242 }
+
243 
+ +
245  return this->layerBundle[static_cast<unsigned long long>(activeLayer)].image->getTypeOfImage();
+
246 }
+
247 
+ +
249  return this->layerBundle[static_cast<unsigned long long>(activeLayer)].image->getPolygonData();
+
250 }
+
251 
+
252 // If a mouse button is pressed check if it was the
+
253 // left button and if so store the current position
+
254 // Set that we are currently drawing
+
255 void PaintingArea::mousePressEvent(QMouseEvent*event){
+
256  if(Tool == nullptr)
+
257  return;
+
258  int x = event->x()-layerBundle[static_cast<unsigned long long>(activeLayer)].widthOffset;
+
259  int y = event->y()-layerBundle[static_cast<unsigned long long>(activeLayer)].heightOffset;
+
260  if(event->button() == Qt::LeftButton) {
+
261  Tool->onMouseLeftPressed(x, y);
+
262  }else if(event->button() == Qt::RightButton) {
+
263  Tool->onMouseRightPressed(x, y);
+
264  }
+
265  update();
+
266 }
+
267 
+
268 // When the mouse moves if the left button is clicked
+
269 // we call the drawline function which draws a line
+
270 // from the last position to the current
+
271 void PaintingArea::mouseMoveEvent(QMouseEvent*event){
+
272  if(Tool == nullptr)
+
273  return;
+
274  int x = event->x()-layerBundle[static_cast<unsigned long long>(activeLayer)].widthOffset;
+
275  int y = event->y()-layerBundle[static_cast<unsigned long long>(activeLayer)].heightOffset;
+
276  Tool->onMouseMoved(x, y);
+
277  update();
+
278 }
+
279 
+
280 // If the button is released we set variables to stop drawing
+
281 void PaintingArea::mouseReleaseEvent(QMouseEvent*event){
+
282  if(Tool == nullptr)
+
283  return;
+
284  int x = event->x()-layerBundle[static_cast<unsigned long long>(activeLayer)].widthOffset;
+
285  int y = event->y()-layerBundle[static_cast<unsigned long long>(activeLayer)].heightOffset;
+
286  if(event->button() == Qt::LeftButton) {
+
287  Tool->onMouseLeftReleased(x, y);
+
288  }else if(event->button() == Qt::RightButton) {
+
289  Tool->onMouseRightReleased(x, y);
+
290  }
+
291  update();
+
292 }
+
293 
+
294 void PaintingArea::wheelEvent(QWheelEvent*event){
+
295  if(this->Tool != nullptr) {
+
296  QPoint numDegrees = event->angleDelta() / 8;
+
297  if(!numDegrees.isNull()) {
+
298  QPoint numSteps = numDegrees / 15;
+
299  Tool->onWheelScrolled(numSteps.y()* -1);
+
300  }
+
301  }
+
302 }
+
303 
+
304 // QPainter provides functions to draw on the widget
+
305 // The QPaintEvent is sent to widgets that need to
+
306 // update themselves
+
307 void PaintingArea::paintEvent(QPaintEvent*event){
+
308  this->drawLayers();
+
309 
+
310  QPainter painter(this);
+
311  QRect dirtyRec = event->rect();
+
312  painter.drawImage(dirtyRec, *Canvas, dirtyRec);
+
313  update();
+
314 }
+
315 
+
316 // Resize the image to slightly larger then the main window
+
317 // to cut down on the need to resize the image
+
318 void PaintingArea::resizeEvent(QResizeEvent*event){
+
319  //TODO wait till tool works
+
320  update();
+
321 }
+
322 
+
323 void PaintingArea::resizeLayer(QImage*image_res, const QSize &newSize){
+
324  //TODO implement
+
325 }
+
326 
+
327 void PaintingArea::selectLayerUp(){
+
328  if(activeLayer!=-1 && static_cast<unsigned long long>(activeLayer)<layerBundle.size()-1) {
+
329  std::swap(layerBundle[static_cast<unsigned long long>(activeLayer)], layerBundle[static_cast<unsigned long long>(activeLayer+1)]);
+
330  activeLayer++;
+
331  }
+
332 }
+
333 
+
334 void PaintingArea::selectLayerDown(){
+
335  if(activeLayer!=-1 && activeLayer>0) {
+
336  std::swap(layerBundle[static_cast<unsigned long long>(activeLayer)], layerBundle[static_cast<unsigned long long>(activeLayer-1)]);
+
337  activeLayer--;
+
338  }
+
339 }
+
340 
+
341 void PaintingArea::drawLayers(bool forSaving){
+
342  if(forSaving) {
+
343  Canvas->fill(Qt::GlobalColor::transparent);
+
344  }else{
+
345  Canvas->fill(Qt::GlobalColor::black);
+
346  }
+
347  for(size_t i=0; i<layerBundle.size(); i++) {
+
348  LayerObject layer = layerBundle[i];
+
349  QImage cpy = layer.image->getDisplayable(layer.alpha);
+
350  QColor clr_0;
+
351  QColor clr_1;
+
352  for(int y=0; y<layer.height; y++) {
+
353  if(layer.heightOffset+y<0) continue;
+
354  if(layer.heightOffset+y>=maxHeight) break;
+
355  for(int x=0; x<layer.width; x++) {
+
356  if(layer.widthOffset+x<0) continue;
+
357  if(layer.widthOffset+x>=maxWidth) break;
+
358  clr_0=Canvas->pixelColor(layer.widthOffset+x, layer.heightOffset+y);
+
359  clr_1=cpy.pixelColor(x,y);
+
360  float t = static_cast<float>(clr_1.alpha())/255.f;
+
361  int r =static_cast<int>(static_cast<float>(clr_1.red())*(t)+static_cast<float>(clr_0.red())*(1.f-t)+0.5f);
+
362  int g =static_cast<int>(static_cast<float>(clr_1.green())*(t)+static_cast<float>(clr_0.green())*(1.f-t)+0.5f);
+
363  int b =static_cast<int>(static_cast<float>(clr_1.blue())*(t)+static_cast<float>(clr_0.blue()*(1.f-t))+0.5f);
+
364  int a =std::min(clr_0.alpha()+clr_1.alpha(), 255);
+
365  clr_0.setRed(r);
+
366  clr_0.setGreen(g);
+
367  clr_0.setBlue(b);
+
368  clr_0.setAlpha(a);
+
369 
+
370  Canvas->setPixelColor(layer.widthOffset+x, layer.heightOffset+y, clr_0);
+
371  }
+
372  }
+
373  }
+
374 }
+
375 
+
376 void PaintingArea::createTempTopLayer(int idx){
+
377  if(idx>=0) {
+
378  LayerObject newLayer;
+
379  newLayer.alpha = 255;
+
380  newLayer.height = layerBundle[static_cast<unsigned long long>(idx)].height;
+
381  newLayer.width = layerBundle[static_cast<unsigned long long>(idx)].width;
+
382  newLayer.heightOffset = layerBundle[static_cast<unsigned long long>(idx)].heightOffset;
+
383  newLayer.widthOffset = layerBundle[static_cast<unsigned long long>(idx)].widthOffset;
+
384  newLayer.image = layerBundle[static_cast<unsigned long long>(idx)].image->getDeepCopy();
+
385  layerBundle.insert(layerBundle.begin()+idx+1,newLayer);
+
386  }
+
387 }
+
388 
+
389 IntelliTool* PaintingArea::copyActiveTool(){
+
390  switch(Tool->getTooltype()) {
+ + + + + + + +
398  default: return nullptr;
+
399  }
+
400 }
+
401 
+ +
403  return activeLayer;
+
404 }
+
405 
+ +
407  return layerBundle[activeLayer].image;
+
408 }
-
int getWidthOfActive()
The getWidthOfActive gets the horizontal dimensions of the active layer.
-
void createCircleTool()
-
virtual void onMouseRightPressed(int x, int y)
A function managing the right click Pressed of a Mouse. Constructing the Canvas to draw on....
Definition: IntelliTool.cpp:14
-
virtual void onMouseLeftReleased(int x, int y)
A function managing the left click Released of a Mouse. Call this in child classes!
Definition: IntelliTool.cpp:32
-
ImageType
The Types, which an Image can be.
Definition: IntelliImage.h:14
-
int addLayer(int width, int height, int widthOffset=0, int heightOffset=0, ImageType type=ImageType::Raster_Image)
The addLayer adds a layer to the current project/ painting area.
-
void mouseReleaseEvent(QMouseEvent *event) override
-
void createRectangleTool()
+
int getWidthOfActive()
The getWidthOfActive gets the horizontal dimensions of the active layer.
+ +
void createCircleTool()
+
virtual void onMouseRightPressed(int x, int y)
A function managing the right click Pressed of a Mouse. Constructing the Canvas to draw on....
Definition: IntelliTool.cpp:15
+
virtual void onMouseLeftReleased(int x, int y)
A function managing the left click Released of a Mouse. Call this in child classes!
Definition: IntelliTool.cpp:33
+
IntelliImage * getImageOfActiveLayer()
+
void mouseReleaseEvent(QMouseEvent *event) override
+
void createRectangleTool()
-
virtual void onMouseLeftPressed(int x, int y)
A function managing the left click Pressed of a Mouse. Resetting the current draw....
Definition: IntelliTool.cpp:25
+
virtual void onMouseLeftPressed(int x, int y)
A function managing the left click Pressed of a Mouse. Resetting the current draw....
Definition: IntelliTool.cpp:26
-
bool open(const QString &fileName)
The open method is used for loading a picture into the current layer.
- -
virtual bool loadImage(const QString &fileName)
A function that loads and sclaes an image to the fitting dimensions.
-
void setLayerToActive(int index)
The setLayerToActive method marks a specific layer as active.
-
void floodFill(int r, int g, int b, int a)
The floodFill method fills a the active layer with a given color.
+
bool save(const QString &filePath, const char *fileFormat)
The save method is used for exporting the current project as one picture.
+
void setLayerAlpha(int idx, int alpha)
The setAlphaOfLayer method sets the alpha value of a specific layer.
+ +
void setLayerActive(int idx)
The setLayerToActive method marks a specific layer as active.
+ +
void floodFill(int r, int g, int b, int a)
The floodFill method fills a the active layer with a given color.
The IntelliToolPlainTool class represents a tool to fill the whole canvas with one color.
void setSecondColor(QColor Color)
A function to set the secondary color.
-
The IntelliShapedImage manages a Shapedimage.
+
The IntelliShapedImage manages a Shapedimage.
QColor getSecondColor()
A function to read the secondary selected color.
-
int heightOffset
Definition: PaintingArea.h:29
-
bool save(const QString &fileName, const char *fileFormat)
The save method is used for exporting the current project as one picture.
-
int getHeightOfActive()
The getHeightOfActive gets the vertical dimensions of the active layer.
-
void switchColors()
A function switching primary and secondary color.
+
int heightOffset
Definition: PaintingArea.h:30
+
void deleteLayer(int idx)
The deleteLayer method removes a layer at a given idx.
+
int getHeightOfActive()
The getHeightOfActive gets the vertical dimensions of the active layer.
virtual QImage getDisplayable(const QSize &displaySize, int alpha)=0
A function returning the displayable ImageData in a requested transparence and size.
-
void createPlainTool()
-
void wheelEvent(QWheelEvent *event) override
-
The LayerObject struct holds all the information needed to construct a layer.
Definition: PaintingArea.h:24
-
void deleteLayer(int index)
The deleteLayer method removes a layer at a given index.
-
void createPenTool()
+
void createPlainTool()
+
void wheelEvent(QWheelEvent *event) override
+
bool getFastRenderer()
The getfastRenderer gets the value of the flag for the fastRenderer setting.
+
The LayerObject struct holds all the information needed to construct a layer.
Definition: PaintingArea.h:25
+
void createPenTool()
-
void mousePressEvent(QMouseEvent *event) override
- +
void mousePressEvent(QMouseEvent *event) override
- +
The IntelliToolRectangle class represents a tool to draw a rectangle.
-
void createLineTool()
+
void createLineTool()
-
The IntelliToolPen class represents a tool to draw a line.
-
void colorPickerSetSecondColor()
The colorPickerSetSecondColor calls the QTColorPicker to determine the secondary drawing color.
-
virtual void onMouseRightReleased(int x, int y)
A function managing the right click Released of a Mouse. Merging the Canvas to Active....
Definition: IntelliTool.cpp:21
-
void colorPickerSetFirstColor()
The colorPickerSetFirstColor calls the QTColorPicker to determine the primary drawing color.
-
void colorPickerSwitchColor()
The colorPickerSwitchColor swaps the primary color with the secondary drawing color.
- +
The IntelliToolPen class represents a tool to draw a line.
+
void colorPickerSetSecondColor()
The colorPickerSetSecondColor calls the QTColorPicker to determine the secondary drawing color.
+
virtual void onMouseRightReleased(int x, int y)
A function managing the right click Released of a Mouse. Merging the Canvas to Active....
Definition: IntelliTool.cpp:22
+
void colorPickerSetFirstColor()
The colorPickerSetFirstColor calls the QTColorPicker to determine the primary drawing color.
+ + +
Tooltype getTooltype()
Definition: IntelliTool.cpp:85
+
IntelliImage::ImageType getTypeOfImageRealLayer()
+
~PaintingArea() override
This deconstructor is used to clear up the memory and remove the currently active window.
-
void mouseMoveEvent(QMouseEvent *event) override
+
void mouseMoveEvent(QMouseEvent *event) override
+
int getNumberOfActiveLayer()
void setFirstColor(QColor Color)
A function to set the primary color.
-
void slotDeleteActiveLayer()
The slotDeleteActiveLayer method handles the deletion of the active layer.
- -
void createPolygonTool()
-
void moveActiveLayer(int idx)
The moveActiveLayer moves the active layer to a specific position in the layer stack.
+
An abstract class that manages the basic events, like mouse clicks or scrolls events.
Definition: IntelliTool.h:14
+ +
void slotDeleteActiveLayer()
The slotDeleteActiveLayer method handles the deletion of the active layer.
+
bool open(const QString &filePath)
The open method is used for loading a picture into the current layer.
+
void createPolygonTool()
+
void moveActiveLayer(int idx)
The moveActiveLayer moves the active layer to a specific position in the layer stack.
+
IntelliColorPicker colorPicker
Definition: PaintingArea.h:175
PaintingArea(int maxWidth=600, int maxHeight=600, QWidget *parent=nullptr)
PaintingArea is the constructor of the PaintingArea class, which initiates the working environment.
+
bool getIsDrawing()
Definition: IntelliTool.cpp:89
QColor getFirstColor()
A function to read the primary selected color.
- -
void createFloodFillTool()
-
void slotActivateLayer(int a)
The slotActivateLayer method handles the event of selecting one layer as active.
-
void paintEvent(QPaintEvent *event) override
-
void setAlphaOfLayer(int index, int alpha)
The setAlphaOfLayer method sets the alpha value of a specific layer.
-
IntelliImage * image
Definition: PaintingArea.h:25
-
void resizeEvent(QResizeEvent *event) override
+ +
void createFloodFillTool()
+
void slotActivateLayer(int a)
The slotActivateLayer method handles the event of selecting one layer as active.
+
void paintEvent(QPaintEvent *event) override
+ + +
IntelliImage * image
Definition: PaintingArea.h:26
+
virtual bool loadImage(const QString &filePath)
A function that loads and sclaes an image to the fitting dimensions.
+
std::vector< QPoint > getPolygonDataOfRealLayer()
+
IntelliToolsettings Toolsettings
Definition: PaintingArea.h:174
+
void resizeEvent(QResizeEvent *event) override
+ +
void swapColors()
A function switching primary and secondary color.
The IntelliToolFloodFill class represents a tool to flood FIll a certian area.
+
void colorPickerSwapColors()
The colorPickerSwitchColor swaps the primary color with the secondary drawing color.
The IntelliToolCircle class represents a tool to draw a circle.
-
void movePositionActive(int x, int y)
The movePositionActive method moves the active layer to certain position.
-
An abstract class which manages the basic IntelliImage operations.
Definition: IntelliImage.h:24
-
virtual void onMouseMoved(int x, int y)
A function managing the mouse moved event. Call this in child classes!
Definition: IntelliTool.cpp:41
+
void movePositionActive(int x, int y)
The movePositionActive method moves the active layer to certain position.
+
An abstract class which manages the basic IntelliImage operations.
Definition: IntelliImage.h:19
+
virtual void onMouseMoved(int x, int y)
A function managing the mouse moved event. Call this in child classes!
Definition: IntelliTool.cpp:42
The IntelliToolPolygon managed the Drawing of Polygonforms.
virtual void calculateVisiblity()=0
An abstract function that calculates the visiblity of the Image data if needed.
-
virtual void onWheelScrolled(int value)
A function managing the scroll event. A positive value means scrolling outwards. Call this in child c...
Definition: IntelliTool.cpp:46
-
The IntelliRasterImage manages a Rasterimage.
+
virtual void onWheelScrolled(int value)
A function managing the scroll event. A positive value means scrolling outwards. Call this in child c...
Definition: IntelliTool.cpp:47
+
The IntelliRasterImage manages a RASTERIMAGE.
-
virtual void drawPlain(const QColor &color)
A function that clears the whole image in a given Color.
-
The IntelliToolFloodFill class represents a tool to draw a line.
+
int addLayer(int width, int height, int widthOffset=0, int heightOffset=0, IntelliImage::ImageType type=IntelliImage::ImageType::RASTERIMAGE)
The addLayer adds a layer to the current project/ painting area.
+
ImageType
The Types, which an Image can be.
Definition: IntelliImage.h:26
+
virtual void drawPlain(const QColor &color)
A function that clears the whole image in a given Color.
+ +
The IntelliToolFloodFill class represents a tool to draw a line.
-Include dependency graph for PaintingArea.h:
-
-
-
-
-This graph shows which files directly or indirectly include this file:
-
-
-

Go to the source code of this file.

diff --git a/docs/html/_painting_area_8h__incl.dot b/docs/html/_painting_area_8h__incl.dot index 8afac13..40d5420 100644 --- a/docs/html/_painting_area_8h__incl.dot +++ b/docs/html/_painting_area_8h__incl.dot @@ -15,34 +15,57 @@ digraph "intelliphoto/src/Layer/PaintingArea.h" Node1 -> Node6 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; Node6 [label="QList",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; Node1 -> Node7 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node7 [label="Image/IntelliImage.h",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_image_8h.html",tooltip=" "]; - Node7 -> Node3 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node7 -> Node4 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node7 -> Node2 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node7 [label="GUI/IntelliPhotoGui.h",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_photo_gui_8h.html",tooltip=" "]; Node7 -> Node8 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node8 [label="QSize",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; - Node7 -> Node5 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node8 [label="QtWidgets",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; Node7 -> Node9 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node9 [label="vector",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; - Node1 -> Node10 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node10 [label="Image/IntelliRasterImage.h",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_raster_image_8h.html",tooltip=" "]; - Node10 -> Node7 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node1 -> Node11 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node11 [label="Image/IntelliShapedImage.h",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_shaped_image_8h.html",tooltip=" "]; - Node11 -> Node10 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node11 -> Node9 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node11 -> Node12 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node12 [label="IntelliHelper/IntelliHelper.h",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_helper_8h.html",tooltip=" "]; - Node12 -> Node4 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node12 -> Node9 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node1 -> Node13 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node13 [label="Tool/IntelliTool.h",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_tool_8h.html",tooltip=" "]; - Node13 -> Node14 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node14 [label="IntelliHelper/IntelliColor\lPicker.h",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_color_picker_8h.html",tooltip=" "]; - Node14 -> Node2 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node14 -> Node4 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node14 -> Node15 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node15 [label="QColorDialog",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; - Node13 -> Node9 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node1 -> Node14 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node9 [label="QPixmap",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; + Node7 -> Node6 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node7 -> Node10 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node10 [label="QMainWindow",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; + Node7 -> Node11 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node11 [label="QGridLayout",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; + Node7 -> Node12 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node12 [label="QPushButton",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; + Node7 -> Node13 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node13 [label="QTextEdit",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; + Node7 -> Node14 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node14 [label="QLabel",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; + Node7 -> Node15 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node15 [label="QLineEdit",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; + Node1 -> Node16 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node16 [label="Image/IntelliImage.h",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_image_8h.html",tooltip=" "]; + Node16 -> Node3 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node16 -> Node4 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node16 -> Node2 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node16 -> Node17 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node17 [label="QSize",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; + Node16 -> Node5 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node16 -> Node18 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node18 [label="vector",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; + Node16 -> Node19 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node19 [label="IntelliHelper/IntelliTriangulation.h",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_triangulation_8h.html",tooltip=" "]; + Node19 -> Node4 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node19 -> Node18 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node16 -> Node20 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node20 [label="IntelliHelper/IntelliRender\lSettings.h",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_render_settings_8h.html",tooltip=" "]; + Node1 -> Node21 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node21 [label="Image/IntelliRasterImage.h",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_raster_image_8h.html",tooltip=" "]; + Node21 -> Node16 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node1 -> Node22 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node22 [label="Image/IntelliShapedImage.h",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_shaped_image_8h.html",tooltip=" "]; + Node22 -> Node21 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node22 -> Node18 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node1 -> Node23 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node23 [label="Tool/IntelliTool.h",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_tool_8h.html",tooltip=" "]; + Node23 -> Node24 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node24 [label="IntelliHelper/IntelliColor\lPicker.h",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_color_picker_8h.html",tooltip=" "]; + Node24 -> Node2 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node24 -> Node4 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node24 -> Node25 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node25 [label="QColorDialog",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; + Node23 -> Node26 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node26 [label="IntelliHelper/IntelliToolsettings.h",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_toolsettings_8h.html",tooltip=" "]; + Node23 -> Node18 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node1 -> Node24 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; } diff --git a/docs/html/_painting_area_8h_source.html b/docs/html/_painting_area_8h_source.html index 21a5b94..bddb4f6 100644 --- a/docs/html/_painting_area_8h_source.html +++ b/docs/html/_painting_area_8h_source.html @@ -99,158 +99,184 @@ $(document).ready(function(){initNavTree('_painting_area_8h_source.html','');});
7 #include <QPoint>
8 #include <QWidget>
9 #include <QList>
-
10 #include "Image/IntelliImage.h"
- - -
13 #include "Tool/IntelliTool.h"
- -
15 
-
24 struct LayerObject{
- -
26  int width;
-
27  int height;
- - -
30  int alpha=255;
-
31 };
-
32 
-
36 class PaintingArea : public QWidget
-
37 {
-
38  // Declares our class as a QObject which is the base class
-
39  // for all Qt objects
-
40  // QObjects handle events
-
41  Q_OBJECT
-
42  friend IntelliTool;
-
43 public:
-
50  PaintingArea(int maxWidth=600, int maxHeight=600, QWidget *parent = nullptr);
-
51 
-
55  ~PaintingArea() override;
-
56 
-
57  // Handles all events
+
10 #include "GUI/IntelliPhotoGui.h"
+
11 #include "Image/IntelliImage.h"
+ + +
14 #include "Tool/IntelliTool.h"
+ +
16 
+
25 struct LayerObject {
+ +
27  int width;
+
28  int height;
+ + +
31  int alpha=255;
+
32 };
+
33 
+
37 class PaintingArea : public QWidget
+
38 {
+
39 // Declares our class as a QObject which is the base class
+
40 // for all Qt objects
+
41 // QObjects handle events
+
42 Q_OBJECT
+
43 friend IntelliTool;
+
44 friend IntelliPhotoGui;
+
45 public:
+
52 PaintingArea(int maxWidth=600, int maxHeight=600, QWidget*parent = nullptr);
+
53 
+
57 ~PaintingArea() override;
58 
-
64  bool open(const QString &fileName);
-
71  bool save(const QString &fileName, const char *fileFormat);
-
72 
-
82  int addLayer(int width, int height, int widthOffset=0, int heightOffset=0, ImageType type = ImageType::Raster_Image);
-
93  int addLayerAt(int idx, int width, int height, int widthOffset=0, int heightOffset=0, ImageType type = ImageType::Raster_Image);
-
98  void deleteLayer(int index);
-
103  void setLayerToActive(int index);
-
109  void setAlphaOfLayer(int index, int alpha);
-
117  void floodFill(int r, int g, int b, int a);
-
123  void movePositionActive(int x, int y);
-
128  void moveActiveLayer(int idx);
-
129 
-
130  //change properties of colorPicker
- - -
142  void colorPickerSwitchColor();
-
143 
-
144  // Create tools
-
145  void createPenTool();
-
146  void createPlainTool();
-
147  void createLineTool();
-
148  void createRectangleTool();
-
149  void createCircleTool();
-
150  void createPolygonTool();
-
151  void createFloodFillTool();
-
152 
-
157  int getWidthOfActive();
-
162  int getHeightOfActive();
-
163 
-
164 public slots:
-
165  // Events to handle
-
170  void slotActivateLayer(int a);
-
174  void slotDeleteActiveLayer();
-
175 
-
176 protected:
-
177  void mousePressEvent(QMouseEvent *event) override;
-
178  void mouseMoveEvent(QMouseEvent *event) override;
-
179  void mouseReleaseEvent(QMouseEvent *event) override;
-
180 
-
181  void wheelEvent(QWheelEvent *event) override;
-
182  // Updates the painting area where we are painting
-
183  void paintEvent(QPaintEvent *event) override;
-
184 
-
185  // Makes sure the area we are drawing on remains
-
186  // as large as the widget
-
187  void resizeEvent(QResizeEvent *event) override;
+
59 // Handles all events
+
60 
+
66 bool open(const QString &filePath);
+
73 bool save(const QString &filePath, const char*fileFormat);
+
74 
+
84 int addLayer(int width, int height, int widthOffset=0, int heightOffset=0, IntelliImage::ImageType type = IntelliImage::ImageType::RASTERIMAGE);
+
95 int addLayerAt(int idx, int width, int height, int widthOffset=0, int heightOffset=0, IntelliImage::ImageType type = IntelliImage::ImageType::RASTERIMAGE);
+
100 void deleteLayer(int idx);
+
105 void setLayerActive(int idx);
+
111 void setLayerAlpha(int idx, int alpha);
+
119 void floodFill(int r, int g, int b, int a);
+
125 void movePositionActive(int x, int y);
+
130 void moveActiveLayer(int idx);
+
131 
+
132 //change properties of colorPicker
+ + +
144 void colorPickerSwapColors();
+
145 
+
146 // Create tools
+
147 void createPenTool();
+
148 void createPlainTool();
+
149 void createLineTool();
+
150 void createRectangleTool();
+
151 void createCircleTool();
+
152 void createPolygonTool();
+
153 void createFloodFillTool();
+
154 
+
159 int getWidthOfActive();
+
164 int getHeightOfActive();
+
165 
+ +
167 
+
168 std::vector<QPoint> getPolygonDataOfRealLayer();
+
169 
+ +
171 
+ +
173 
+ + +
176 
+
177 public slots:
+
178 // Events to handle
+
183 void slotActivateLayer(int a);
+
187 void slotDeleteActiveLayer();
188 
-
189 private:
-
190  void setUp(int maxWidth, int maxHeight);
-
191  void activateUpperLayer();
-
192  void activateLowerLayer();
+
189 protected:
+
190 void mousePressEvent(QMouseEvent*event) override;
+
191 void mouseMoveEvent(QMouseEvent*event) override;
+
192 void mouseReleaseEvent(QMouseEvent*event) override;
193 
-
194  QImage* Canvas;
-
195  int maxWidth;
-
196  int maxHeight;
+
194 void wheelEvent(QWheelEvent*event) override;
+
195 // Updates the painting area where we are painting
+
196 void paintEvent(QPaintEvent*event) override;
197 
-
198  IntelliTool* Tool;
-
199  IntelliColorPicker colorPicker;
-
200 
-
201  std::vector<LayerObject> layerBundle;
-
202  int activeLayer=-1;
-
203 
-
204  void assembleLayers(bool forSaving=false);
-
205 
-
206  void resizeImage(QImage *image_res, const QSize &newSize);
+
198 // Makes sure the area we are drawing on remains
+
199 // as large as the widget
+
200 void resizeEvent(QResizeEvent*event) override;
+
201 
+
202 private:
+
203 void setLayerDimensions(int maxWidth, int maxHeight);
+
204 void selectLayerUp();
+
205 void selectLayerDown();
+
206 IntelliTool* copyActiveTool();
207 
-
208  // Helper for Tool
-
209  void createTempLayerAfter(int idx);
-
210 };
+
208 QImage* Canvas;
+
209 int maxWidth;
+
210 int maxHeight;
211 
-
212 #endif
+
212 IntelliRenderSettings renderSettings;
+
213 IntelliTool* Tool;
+
214 IntelliPhotoGui* DumpyGui;
+
215 
+
216 std::vector<LayerObject> layerBundle;
+
217 int activeLayer=-1;
+
218 
+
219 void drawLayers(bool forSaving=false);
+
220 
+
221 void resizeLayer(QImage*image_res, const QSize &newSize);
+
222 
+
223 // Helper for Tool
+
224 // TODO: Always create this layer on top and return the id here!
+
225 void createTempTopLayer(int idx);
+
226 };
+
227 
+
228 #endif
-
int getWidthOfActive()
The getWidthOfActive gets the horizontal dimensions of the active layer.
-
void createCircleTool()
-
ImageType
The Types, which an Image can be.
Definition: IntelliImage.h:14
-
int addLayer(int width, int height, int widthOffset=0, int heightOffset=0, ImageType type=ImageType::Raster_Image)
The addLayer adds a layer to the current project/ painting area.
-
void mouseReleaseEvent(QMouseEvent *event) override
-
void createRectangleTool()
+
int getWidthOfActive()
The getWidthOfActive gets the horizontal dimensions of the active layer.
+
void createCircleTool()
+
IntelliImage * getImageOfActiveLayer()
+
void mouseReleaseEvent(QMouseEvent *event) override
+
void createRectangleTool()
-
bool open(const QString &fileName)
The open method is used for loading a picture into the current layer.
- -
void setLayerToActive(int index)
The setLayerToActive method marks a specific layer as active.
-
void floodFill(int r, int g, int b, int a)
The floodFill method fills a the active layer with a given color.
-
int heightOffset
Definition: PaintingArea.h:29
-
bool save(const QString &fileName, const char *fileFormat)
The save method is used for exporting the current project as one picture.
-
int getHeightOfActive()
The getHeightOfActive gets the vertical dimensions of the active layer.
-
void createPlainTool()
-
void wheelEvent(QWheelEvent *event) override
-
The PaintingArea class manages the methods and stores information about the current painting area,...
Definition: PaintingArea.h:36
-
The LayerObject struct holds all the information needed to construct a layer.
Definition: PaintingArea.h:24
-
void deleteLayer(int index)
The deleteLayer method removes a layer at a given index.
-
void createPenTool()
-
void mousePressEvent(QMouseEvent *event) override
- +
bool save(const QString &filePath, const char *fileFormat)
The save method is used for exporting the current project as one picture.
+
void setLayerAlpha(int idx, int alpha)
The setAlphaOfLayer method sets the alpha value of a specific layer.
+ +
void setLayerActive(int idx)
The setLayerToActive method marks a specific layer as active.
+ +
The IntelliPhotoGui class handles the graphical user interface for the intelliPhoto program.
+
void floodFill(int r, int g, int b, int a)
The floodFill method fills a the active layer with a given color.
+
int heightOffset
Definition: PaintingArea.h:30
+
void deleteLayer(int idx)
The deleteLayer method removes a layer at a given idx.
+
int getHeightOfActive()
The getHeightOfActive gets the vertical dimensions of the active layer.
+
void createPlainTool()
+
void wheelEvent(QWheelEvent *event) override
+
The PaintingArea class manages the methods and stores information about the current painting area,...
Definition: PaintingArea.h:37
+
The LayerObject struct holds all the information needed to construct a layer.
Definition: PaintingArea.h:25
+
void createPenTool()
+
void mousePressEvent(QMouseEvent *event) override
- -
void createLineTool()
-
void colorPickerSetSecondColor()
The colorPickerSetSecondColor calls the QTColorPicker to determine the secondary drawing color.
-
void colorPickerSetFirstColor()
The colorPickerSetFirstColor calls the QTColorPicker to determine the primary drawing color.
-
void colorPickerSwitchColor()
The colorPickerSwitchColor swaps the primary color with the secondary drawing color.
+ +
void createLineTool()
+
void colorPickerSetSecondColor()
The colorPickerSetSecondColor calls the QTColorPicker to determine the secondary drawing color.
+
void colorPickerSetFirstColor()
The colorPickerSetFirstColor calls the QTColorPicker to determine the primary drawing color.
+
int addLayerAt(int idx, int width, int height, int widthOffset=0, int heightOffset=0, IntelliImage::ImageType type=IntelliImage::ImageType::RASTERIMAGE)
The addLayerAt adds a layer to the current project/ painting area at a specific position in the layer...
- +
IntelliImage::ImageType getTypeOfImageRealLayer()
+
~PaintingArea() override
This deconstructor is used to clear up the memory and remove the currently active window.
-
void mouseMoveEvent(QMouseEvent *event) override
-
An abstract class that manages the basic events, like mouse clicks or scrolls events.
Definition: IntelliTool.h:13
-
void slotDeleteActiveLayer()
The slotDeleteActiveLayer method handles the deletion of the active layer.
-
void createPolygonTool()
-
int addLayerAt(int idx, int width, int height, int widthOffset=0, int heightOffset=0, ImageType type=ImageType::Raster_Image)
The addLayerAt adds a layer to the current project/ painting area at a specific position in the layer...
-
void moveActiveLayer(int idx)
The moveActiveLayer moves the active layer to a specific position in the layer stack.
+
void mouseMoveEvent(QMouseEvent *event) override
+ +
int getNumberOfActiveLayer()
+
An abstract class that manages the basic events, like mouse clicks or scrolls events.
Definition: IntelliTool.h:14
+
void slotDeleteActiveLayer()
The slotDeleteActiveLayer method handles the deletion of the active layer.
+
bool open(const QString &filePath)
The open method is used for loading a picture into the current layer.
+
void createPolygonTool()
+
void moveActiveLayer(int idx)
The moveActiveLayer moves the active layer to a specific position in the layer stack.
+
IntelliColorPicker colorPicker
Definition: PaintingArea.h:175
PaintingArea(int maxWidth=600, int maxHeight=600, QWidget *parent=nullptr)
PaintingArea is the constructor of the PaintingArea class, which initiates the working environment.
- -
void createFloodFillTool()
-
void slotActivateLayer(int a)
The slotActivateLayer method handles the event of selecting one layer as active.
+ +
void createFloodFillTool()
+
void slotActivateLayer(int a)
The slotActivateLayer method handles the event of selecting one layer as active.
The IntelliColorPicker manages the selected colors for one whole project.
-
void paintEvent(QPaintEvent *event) override
-
void setAlphaOfLayer(int index, int alpha)
The setAlphaOfLayer method sets the alpha value of a specific layer.
-
IntelliImage * image
Definition: PaintingArea.h:25
-
void resizeEvent(QResizeEvent *event) override
-
void movePositionActive(int x, int y)
The movePositionActive method moves the active layer to certain position.
-
An abstract class which manages the basic IntelliImage operations.
Definition: IntelliImage.h:24
+
void paintEvent(QPaintEvent *event) override
+ +
IntelliImage * image
Definition: PaintingArea.h:26
+
std::vector< QPoint > getPolygonDataOfRealLayer()
+
IntelliToolsettings Toolsettings
Definition: PaintingArea.h:174
+
void resizeEvent(QResizeEvent *event) override
+
void colorPickerSwapColors()
The colorPickerSwitchColor swaps the primary color with the secondary drawing color.
+
void movePositionActive(int x, int y)
The movePositionActive method moves the active layer to certain position.
+
An abstract class which manages the basic IntelliImage operations.
Definition: IntelliImage.h:19
+ +
int addLayer(int width, int height, int widthOffset=0, int heightOffset=0, IntelliImage::ImageType type=IntelliImage::ImageType::RASTERIMAGE)
The addLayer adds a layer to the current project/ painting area.
+
ImageType
The Types, which an Image can be.
Definition: IntelliImage.h:26
virtual ~IntelliColorPicker()
IntelliColorPicker destructor clears up his used memory, if there is some.
QColor getSecondColor()
A function to read the secondary selected color.
-
The PaintingArea class manages the methods and stores information about the current painting area,...
Definition: PaintingArea.h:36
+
The PaintingArea class manages the methods and stores information about the current painting area,...
Definition: PaintingArea.h:37
-
An abstract class that manages the basic events, like mouse clicks or scrolls events.
Definition: IntelliTool.h:13
+
An abstract class that manages the basic events, like mouse clicks or scrolls events.
Definition: IntelliTool.h:14
QColor getFirstColor()
A function to read the primary selected color.
IntelliColorPicker()
IntelliColorPicker constructor, setting 2 preset colors, be careful, theese color may change in produ...
diff --git a/docs/html/annotated.html b/docs/html/annotated.html index 817bc92..ab6e5e8 100644 --- a/docs/html/annotated.html +++ b/docs/html/annotated.html @@ -95,19 +95,21 @@ $(document).ready(function(){initNavTree('annotated.html','');}); - - - - - - - - - - - - - + + + + + + + + + + + + + + +
 CIntelliColorPickerThe IntelliColorPicker manages the selected colors for one whole project
 CIntelliImageAn abstract class which manages the basic IntelliImage operations
 CIntelliPhotoGuiHandles the graphical user interface for the intelliPhoto program
 CIntelliRasterImageThe IntelliRasterImage manages a Rasterimage
 CIntelliShapedImageThe IntelliShapedImage manages a Shapedimage
 CIntelliToolAn abstract class that manages the basic events, like mouse clicks or scrolls events
 CIntelliToolCircleTool to draw a circle
 CIntelliToolFloodFillTool to flood FIll a certian area
 CIntelliToolLineThe IntelliToolFloodFill class represents a tool to draw a line
 CIntelliToolPenTool to draw a line
 CIntelliToolPlainToolTool to fill the whole canvas with one color
 CIntelliToolPolygonThe IntelliToolPolygon managed the Drawing of Polygonforms
 CIntelliToolRectangleTool to draw a rectangle
 CLayerObjectThe LayerObject struct holds all the information needed to construct a layer
 CPaintingAreaManages the methods and stores information about the current painting area, which is the currently opened project
 CTriangleThe Triangle struct holds the 3 vertices of a triangle
 CIntelliRasterImageThe IntelliRasterImage manages a RASTERIMAGE
 CIntelliRenderSettings
 CIntelliShapedImageThe IntelliShapedImage manages a Shapedimage
 CIntelliToolAn abstract class that manages the basic events, like mouse clicks or scrolls events
 CIntelliToolCircleTool to draw a circle
 CIntelliToolFloodFillTool to flood FIll a certian area
 CIntelliToolLineThe IntelliToolFloodFill class represents a tool to draw a line
 CIntelliToolPenTool to draw a line
 CIntelliToolPlainToolTool to fill the whole canvas with one color
 CIntelliToolPolygonThe IntelliToolPolygon managed the Drawing of Polygonforms
 CIntelliToolRectangleTool to draw a rectangle
 CIntelliToolsettings
 CLayerObjectThe LayerObject struct holds all the information needed to construct a layer
 CPaintingAreaManages the methods and stores information about the current painting area, which is the currently opened project
 CTriangleThe Triangle struct holds the 3 vertices of a triangle
diff --git a/docs/html/annotated_dup.js b/docs/html/annotated_dup.js index a58b9a8..091e80a 100644 --- a/docs/html/annotated_dup.js +++ b/docs/html/annotated_dup.js @@ -4,6 +4,7 @@ var annotated_dup = [ "IntelliImage", "class_intelli_image.html", "class_intelli_image" ], [ "IntelliPhotoGui", "class_intelli_photo_gui.html", "class_intelli_photo_gui" ], [ "IntelliRasterImage", "class_intelli_raster_image.html", "class_intelli_raster_image" ], + [ "IntelliRenderSettings", "class_intelli_render_settings.html", "class_intelli_render_settings" ], [ "IntelliShapedImage", "class_intelli_shaped_image.html", "class_intelli_shaped_image" ], [ "IntelliTool", "class_intelli_tool.html", "class_intelli_tool" ], [ "IntelliToolCircle", "class_intelli_tool_circle.html", "class_intelli_tool_circle" ], @@ -13,6 +14,7 @@ var annotated_dup = [ "IntelliToolPlainTool", "class_intelli_tool_plain_tool.html", "class_intelli_tool_plain_tool" ], [ "IntelliToolPolygon", "class_intelli_tool_polygon.html", "class_intelli_tool_polygon" ], [ "IntelliToolRectangle", "class_intelli_tool_rectangle.html", "class_intelli_tool_rectangle" ], + [ "IntelliToolsettings", "class_intelli_toolsettings.html", "class_intelli_toolsettings" ], [ "LayerObject", "struct_layer_object.html", "struct_layer_object" ], [ "PaintingArea", "class_painting_area.html", "class_painting_area" ], [ "Triangle", "struct_triangle.html", "struct_triangle" ] diff --git a/docs/html/class_intelli_color_picker-members.html b/docs/html/class_intelli_color_picker-members.html index 3548ba9..8b26608 100644 --- a/docs/html/class_intelli_color_picker-members.html +++ b/docs/html/class_intelli_color_picker-members.html @@ -98,7 +98,7 @@ $(document).ready(function(){initNavTree('class_intelli_color_picker.html','');} IntelliColorPicker()IntelliColorPicker setFirstColor(QColor Color)IntelliColorPicker setSecondColor(QColor Color)IntelliColorPicker - switchColors()IntelliColorPicker + swapColors()IntelliColorPicker ~IntelliColorPicker()IntelliColorPickervirtual diff --git a/docs/html/class_intelli_color_picker.html b/docs/html/class_intelli_color_picker.html index 087b636..6d692e6 100644 --- a/docs/html/class_intelli_color_picker.html +++ b/docs/html/class_intelli_color_picker.html @@ -107,9 +107,9 @@ Public Member Functions virtual ~IntelliColorPicker ()  IntelliColorPicker destructor clears up his used memory, if there is some. More...
  -void switchColors () - A function switching primary and secondary color. More...
-  +void swapColors () + A function switching primary and secondary color. More...
+  QColor getFirstColor ()  A function to read the primary selected color. More...
  @@ -198,11 +198,6 @@ Public Member Functions
Returns
Returns the primary color.

Definition at line 16 of file IntelliColorPicker.cpp.

-
-Here is the caller graph for this function:
-
-
-
@@ -225,11 +220,6 @@ Here is the caller graph for this function:
Returns
Returns the secondary color.

Definition at line 20 of file IntelliColorPicker.cpp.

-
-Here is the caller graph for this function:
-
-
-
@@ -258,11 +248,6 @@ Here is the caller graph for this function:

Definition at line 24 of file IntelliColorPicker.cpp.

-
-Here is the caller graph for this function:
-
-
-
@@ -291,22 +276,17 @@ Here is the caller graph for this function:

Definition at line 28 of file IntelliColorPicker.cpp.

-
-Here is the caller graph for this function:
-
-
-
- -

◆ switchColors()

+ +

◆ swapColors()

- + @@ -317,11 +297,6 @@ Here is the caller graph for this function:

A function switching primary and secondary color.

Definition at line 12 of file IntelliColorPicker.cpp.

-
-Here is the caller graph for this function:
-
-
-
diff --git a/docs/html/class_intelli_color_picker.js b/docs/html/class_intelli_color_picker.js index efec690..4d29d13 100644 --- a/docs/html/class_intelli_color_picker.js +++ b/docs/html/class_intelli_color_picker.js @@ -6,5 +6,5 @@ var class_intelli_color_picker = [ "getSecondColor", "class_intelli_color_picker.html#a55568fbf5dc783f06284b7031ffe9415", null ], [ "setFirstColor", "class_intelli_color_picker.html#a7e2ddbbbfbed383f06b24e5bf6b27ae8", null ], [ "setSecondColor", "class_intelli_color_picker.html#a86bf4a940e4a0e465e30cbdf28748931", null ], - [ "switchColors", "class_intelli_color_picker.html#a437a6f20bf2fc0a4cbaf4c030c2a26d9", null ] + [ "swapColors", "class_intelli_color_picker.html#aec499265ae28ce1b54be88222e74292e", null ] ]; \ No newline at end of file diff --git a/docs/html/class_intelli_color_picker_a55568fbf5dc783f06284b7031ffe9415_icgraph.dot b/docs/html/class_intelli_color_picker_a55568fbf5dc783f06284b7031ffe9415_icgraph.dot index 7857846..41eed46 100644 --- a/docs/html/class_intelli_color_picker_a55568fbf5dc783f06284b7031ffe9415_icgraph.dot +++ b/docs/html/class_intelli_color_picker_a55568fbf5dc783f06284b7031ffe9415_icgraph.dot @@ -9,4 +9,6 @@ digraph "IntelliColorPicker::getSecondColor" Node2 [label="PaintingArea::colorPicker\lSetSecondColor",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_painting_area.html#ae261acaaa346610dfed489dbac17e789",tooltip="The colorPickerSetSecondColor calls the QTColorPicker to determine the secondary drawing color."]; Node1 -> Node3 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; Node3 [label="IntelliToolPolygon\l::onMouseLeftReleased",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_polygon.html#a4e1473ff408ae2e11cf6a43f6f575f21",tooltip="A function managing the left click released of a mouse. Merging the fill to the active layer."]; + Node1 -> Node4 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node4 [label="IntelliPhotoGui::UpdateGui",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_photo_gui.html#a1dbef8d4688227aa9455aea52db00bf4",tooltip=" "]; } diff --git a/docs/html/class_intelli_color_picker_aae2eb27b928fe9388b9398b0556303b7_icgraph.dot b/docs/html/class_intelli_color_picker_aae2eb27b928fe9388b9398b0556303b7_icgraph.dot index 26e1cc5..ae35542 100644 --- a/docs/html/class_intelli_color_picker_aae2eb27b928fe9388b9398b0556303b7_icgraph.dot +++ b/docs/html/class_intelli_color_picker_aae2eb27b928fe9388b9398b0556303b7_icgraph.dot @@ -14,13 +14,15 @@ digraph "IntelliColorPicker::getFirstColor" Node1 -> Node5 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; Node5 [label="IntelliToolPen::onMouseLeft\lPressed",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_pen.html#a8ff40aef6d38eb55af31a19322429205",tooltip="A function managing the left click pressed of a mouse. Starting the drawing procedure."]; Node1 -> Node6 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node6 [label="IntelliToolPolygon\l::onMouseLeftPressed",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_polygon.html#ad5d3b741be6d0647a9cdc9da2cb8bc3d",tooltip="A function managing the left click pressed of a mouse. Setting polygon points."]; + Node6 [label="IntelliToolLine::onMouse\lLeftPressed",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_line.html#a155d676a5f98311217eb095be4759846",tooltip="A function managing the left click pressed of a mouse. Sets the starting point of the line."]; Node1 -> Node7 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node7 [label="IntelliToolLine::onMouse\lLeftPressed",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_line.html#a155d676a5f98311217eb095be4759846",tooltip="A function managing the left click pressed of a mouse. Sets the starting point of the line."]; + Node7 [label="IntelliToolPolygon\l::onMouseLeftPressed",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_polygon.html#ad5d3b741be6d0647a9cdc9da2cb8bc3d",tooltip="A function managing the left click pressed of a mouse. Setting polygon points."]; Node1 -> Node8 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; Node8 [label="IntelliToolPolygon\l::onMouseLeftReleased",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_polygon.html#a4e1473ff408ae2e11cf6a43f6f575f21",tooltip="A function managing the left click released of a mouse. Merging the fill to the active layer."]; Node1 -> Node9 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; Node9 [label="IntelliToolPen::onMouseMoved",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_pen.html#a58d1d636497b630647ce0c4d652737c2",tooltip="A function managing the mouse moved event. To draw the line."]; Node1 -> Node10 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; Node10 [label="IntelliToolLine::onMouse\lMoved",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_line.html#abc6324ef0778823fe7e35aef8ae37f9b",tooltip="A function managing the mouse moved event. Drawing a Line from the startpoint to the current mouse po..."]; + Node1 -> Node11 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node11 [label="IntelliPhotoGui::UpdateGui",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_photo_gui.html#a1dbef8d4688227aa9455aea52db00bf4",tooltip=" "]; } diff --git a/docs/html/class_intelli_color_picker_aec499265ae28ce1b54be88222e74292e_icgraph.dot b/docs/html/class_intelli_color_picker_aec499265ae28ce1b54be88222e74292e_icgraph.dot new file mode 100644 index 0000000..a6c880e --- /dev/null +++ b/docs/html/class_intelli_color_picker_aec499265ae28ce1b54be88222e74292e_icgraph.dot @@ -0,0 +1,10 @@ +digraph "IntelliColorPicker::swapColors" +{ + // LATEX_PDF_SIZE + edge [fontname="Helvetica",fontsize="10",labelfontname="Helvetica",labelfontsize="10"]; + node [fontname="Helvetica",fontsize="10",shape=record]; + rankdir="RL"; + Node1 [label="IntelliColorPicker\l::swapColors",height=0.2,width=0.4,color="black", fillcolor="grey75", style="filled", fontcolor="black",tooltip="A function switching primary and secondary color."]; + Node1 -> Node2 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node2 [label="PaintingArea::colorPicker\lSwapColors",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_painting_area.html#acff4563d006fda491469bd41778d07eb",tooltip="The colorPickerSwitchColor swaps the primary color with the secondary drawing color."]; +} diff --git a/docs/html/class_intelli_image-members.html b/docs/html/class_intelli_image-members.html index 1381841..0b2d551 100644 --- a/docs/html/class_intelli_image-members.html +++ b/docs/html/class_intelli_image-members.html @@ -98,16 +98,22 @@ $(document).ready(function(){initNavTree('class_intelli_image.html','');}); - - - + + + + + - - - + + + + + + +
void IntelliColorPicker::switchColors void IntelliColorPicker::swapColors ( )
drawPixel(const QPoint &p1, const QColor &color)IntelliImagevirtual
drawPlain(const QColor &color)IntelliImagevirtual
drawPoint(const QPoint &p1, const QColor &color, const int &penWidth)IntelliImagevirtual
getDeepCopy()=0IntelliImagepure virtual
getDisplayable(const QSize &displaySize, int alpha)=0IntelliImagepure virtual
getDisplayable(int alpha=255)=0IntelliImagepure virtual
fastRendererIntelliImageprotected
getDeepCopy()=0IntelliImagepure virtual
getDisplayable(const QSize &displaySize, int alpha)=0IntelliImagepure virtual
getDisplayable(int alpha=255)=0IntelliImagepure virtual
getImageData()IntelliImagevirtual
getPixelColor(QPoint &point)IntelliImagevirtual
getPolygonData()IntelliImageinlinevirtual
imageDataIntelliImageprotected
IntelliImage(int weight, int height)IntelliImage
loadImage(const QString &fileName)IntelliImagevirtual
getTypeOfImage()IntelliImageinlinevirtual
imageDataIntelliImageprotected
ImageType enum nameIntelliImage
IntelliImage(int width, int height, bool fastRendererOn)IntelliImage
loadImage(const QString &filePath)IntelliImagevirtual
resizeImage(QImage *image, const QSize &newSize)IntelliImageprotected
setPolygon(const std::vector< QPoint > &polygonData)=0IntelliImagepure virtual
TypeOfImageIntelliImageprotected
updateRendererSetting(bool fastRendererOn)IntelliImagevirtual
~IntelliImage()=0IntelliImagepure virtual
diff --git a/docs/html/class_intelli_image.html b/docs/html/class_intelli_image.html index db8463b..2a1ec63 100644 --- a/docs/html/class_intelli_image.html +++ b/docs/html/class_intelli_image.html @@ -87,6 +87,7 @@ $(document).ready(function(){initNavTree('class_intelli_image.html','');});
+Public Types | Public Member Functions | Protected Member Functions | Protected Attributes | @@ -103,14 +104,27 @@ $(document).ready(function(){initNavTree('class_intelli_image.html','');});
Inheritance diagram for IntelliImage:
-
Inheritance graph
-
[legend]
+
+ + +IntelliRasterImage +IntelliShapedImage + +
+ + + + +

+Public Types

enum  ImageType { ImageType::RASTERIMAGE, +ImageType::SHAPEDIMAGE + }
 The Types, which an Image can be. More...
 
- - - + + + @@ -144,12 +158,20 @@ Public Member Functions - - - + + + + + + + + + + +

Public Member Functions

 IntelliImage (int weight, int height)
 The Construcor of the IntelliImage. Given the Image dimensions. More...
 
 IntelliImage (int width, int height, bool fastRendererOn)
 The Construcor of the IntelliImage. Given the Image dimensions. More...
 
virtual ~IntelliImage ()=0
 An Abstract Destructor. More...
 
virtual std::vector< QPoint > getPolygonData ()
 A function that returns the Polygondata if existent. More...
 
virtual bool loadImage (const QString &fileName)
 A function that loads and sclaes an image to the fitting dimensions. More...
 
virtual ImageType getTypeOfImage ()
 
virtual bool loadImage (const QString &filePath)
 A function that loads and sclaes an image to the fitting dimensions. More...
 
virtual QColor getPixelColor (QPoint &point)
 A function that returns the pixelcolor at a certain point. More...
 
virtual void updateRendererSetting (bool fastRendererOn)
 updateRendererSetting updates the existing image format to the new format. More...
 
virtual QImage getImageData ()
 getImageData returns the data of the current image. More...
 
@@ -161,14 +183,51 @@ Protected Attributes + + + + + +

Protected Member Functions

QImage imageData
 The underlying image data. More...
 
ImageType TypeOfImage
 The Type, an Image is. More...
 
bool fastRenderer
 fastRenderer is the flag that represents the usage of 8bit pictures. More...
 

Detailed Description

An abstract class which manages the basic IntelliImage operations.

-

Definition at line 24 of file IntelliImage.h.

-

Constructor & Destructor Documentation

- -

◆ IntelliImage()

+

Definition at line 19 of file IntelliImage.h.

+

Member Enumeration Documentation

+ +

◆ ImageType

+ +
+
+ + + + + +
+ + + + +
enum IntelliImage::ImageType
+
+strong
+
+ +

The Types, which an Image can be.

+ + + +
Enumerator
RASTERIMAGE 
SHAPEDIMAGE 
+ +

Definition at line 26 of file IntelliImage.h.

+ +
+
+

Constructor & Destructor Documentation

+ +

◆ IntelliImage()

@@ -177,13 +236,19 @@ Protected Attributes IntelliImage::IntelliImage ( int  - weight, + width, int  - height  + height, + + + + + bool  + fastRendererOn  @@ -196,8 +261,9 @@ Protected Attributes

The Construcor of the IntelliImage. Given the Image dimensions.

Parameters
- + +
weight- The weight of the Image.
width- The width of the Image.
height- The height of the Image.
fastRendererOn- Represents the flag for 8bit picture handelling.
@@ -231,7 +297,7 @@ Protected Attributes

An Abstract Destructor.

-

Definition at line 10 of file IntelliImage.cpp.

+

Definition at line 18 of file IntelliImage.cpp.

@@ -262,11 +328,6 @@ Protected Attributes

An abstract function that calculates the visiblity of the Image data if needed.

Implemented in IntelliRasterImage.

-
-Here is the caller graph for this function:
-
-
-
@@ -327,12 +388,7 @@ Here is the caller graph for this function: -

Definition at line 65 of file IntelliImage.cpp.

-
-Here is the caller graph for this function:
-
-
-
+

Definition at line 88 of file IntelliImage.cpp.

@@ -379,12 +435,7 @@ Here is the caller graph for this function: -

Definition at line 44 of file IntelliImage.cpp.

-
-Here is the caller graph for this function:
-
-
-
+

Definition at line 55 of file IntelliImage.cpp.

@@ -420,12 +471,7 @@ Here is the caller graph for this function: -

Definition at line 76 of file IntelliImage.cpp.

-
-Here is the caller graph for this function:
-
-
-
+

Definition at line 105 of file IntelliImage.cpp.

@@ -479,12 +525,7 @@ Here is the caller graph for this function: -

Definition at line 55 of file IntelliImage.cpp.

-
-Here is the caller graph for this function:
-
-
-
+

Definition at line 72 of file IntelliImage.cpp.

@@ -512,7 +553,7 @@ Here is the caller graph for this function:

A function that copys all that returns a [allocated] Image.

-
Returns
A [allocated] Image with all the properties of the instance.
+
Returns
An [allocated] image with all the properties of the instance.

Implemented in IntelliShapedImage, and IntelliRasterImage.

@@ -601,6 +642,35 @@ Here is the caller graph for this function:

Implemented in IntelliShapedImage, and IntelliRasterImage.

+ + + +

◆ getImageData()

+ +
+
+ + + + + +
+ + + + + + + +
QImage IntelliImage::getImageData ()
+
+virtual
+
+ +

getImageData returns the data of the current image.

+ +

Definition at line 123 of file IntelliImage.cpp.

+
@@ -636,12 +706,7 @@ Here is the caller graph for this function:
Returns
The color of the Pixel as QColor.
-

Definition at line 80 of file IntelliImage.cpp.

-
-Here is the caller graph for this function:
-
-
-
+

Definition at line 115 of file IntelliImage.cpp.

@@ -673,12 +738,39 @@ Here is the caller graph for this function:

Reimplemented in IntelliShapedImage.

-

Definition at line 113 of file IntelliImage.h.

+

Definition at line 130 of file IntelliImage.h.

- -

◆ loadImage()

+ +

◆ getTypeOfImage()

+ +
+
+ + + + + +
+ + + + + + + +
virtual ImageType IntelliImage::getTypeOfImage ()
+
+inlinevirtual
+
+ +

Definition at line 134 of file IntelliImage.h.

+ +
+
+ +

◆ loadImage()

@@ -690,7 +782,7 @@ Here is the caller graph for this function:
bool IntelliImage::loadImage ( const QString &  - fileName) + filePath) @@ -704,18 +796,13 @@ Here is the caller graph for this function:

A function that loads and sclaes an image to the fitting dimensions.

Parameters
- +
fileName- The path+name of the image which to loaded.
filePath- The path+name of the image which to loaded.
Returns
True if the image could be loaded, false otherwise.
-

Definition at line 14 of file IntelliImage.cpp.

-
-Here is the caller graph for this function:
-
-
-
+

Definition at line 22 of file IntelliImage.cpp.

@@ -753,7 +840,7 @@ Here is the caller graph for this function:
-

Definition at line 29 of file IntelliImage.cpp.

+

Definition at line 37 of file IntelliImage.cpp.

@@ -791,9 +878,71 @@ Here is the caller graph for this function:

Implemented in IntelliShapedImage, and IntelliRasterImage.

+ + + +

◆ updateRendererSetting()

+ +
+
+ + + + + +
+ + + + + + + + +
void IntelliImage::updateRendererSetting (bool fastRendererOn)
+
+virtual
+
+ +

updateRendererSetting updates the existing image format to the new format.

+
Parameters
+ + +
fastRendererOnflag for the 8bit image handeling.
+
+
+ +

Definition at line 127 of file IntelliImage.cpp.

+

Member Data Documentation

+ +

◆ fastRenderer

+ +
+
+ + + + + +
+ + + + +
bool IntelliImage::fastRenderer
+
+protected
+
+ +

fastRenderer is the flag that represents the usage of 8bit pictures.

+ +

Definition at line 47 of file IntelliImage.h.

+ +
+

◆ imageData

@@ -816,7 +965,33 @@ Here is the caller graph for this function:

The underlying image data.

-

Definition at line 32 of file IntelliImage.h.

+

Definition at line 37 of file IntelliImage.h.

+ + + + +

◆ TypeOfImage

+ +
+
+ + + + + +
+ + + + +
ImageType IntelliImage::TypeOfImage
+
+protected
+
+ +

The Type, an Image is.

+ +

Definition at line 42 of file IntelliImage.h.

diff --git a/docs/html/class_intelli_image.js b/docs/html/class_intelli_image.js index 2f5a6ea..05ac417 100644 --- a/docs/html/class_intelli_image.js +++ b/docs/html/class_intelli_image.js @@ -1,6 +1,10 @@ var class_intelli_image = [ - [ "IntelliImage", "class_intelli_image.html#a47084f1cb668ea0242ab95162cf9e902", null ], + [ "ImageType", "class_intelli_image.html#a5274ce9fcdcb2659c148e7ff916b680e", [ + [ "RASTERIMAGE", "class_intelli_image.html#a5274ce9fcdcb2659c148e7ff916b680eadd5823fd73c42c0154fa2abbd70283b9", null ], + [ "SHAPEDIMAGE", "class_intelli_image.html#a5274ce9fcdcb2659c148e7ff916b680eac065b60ec4cf443808263527bdc0df37", null ] + ] ], + [ "IntelliImage", "class_intelli_image.html#a2c6632ff35ee0a7094a8a289eb3a8652", null ], [ "~IntelliImage", "class_intelli_image.html#ac398bfa9ddd3185508a1e36ee15d80cc", null ], [ "calculateVisiblity", "class_intelli_image.html#aebbced93f4744fad81b7f141b21f4ab2", null ], [ "drawLine", "class_intelli_image.html#af8eddbd9aa54c8d37590d1d4bf8dce31", null ], @@ -10,10 +14,15 @@ var class_intelli_image = [ "getDeepCopy", "class_intelli_image.html#af6381067bdf565669f856bb589008ae9", null ], [ "getDisplayable", "class_intelli_image.html#a21c7e65b59a26db45aac3880133ef21d", null ], [ "getDisplayable", "class_intelli_image.html#a9d4daf3c48c64695105689f61c21bae0", null ], + [ "getImageData", "class_intelli_image.html#ad66fbe380ffe0e073a8cd760f8285fe3", null ], [ "getPixelColor", "class_intelli_image.html#a4576ebb6d863321c816293d7b7f9fd3f", null ], [ "getPolygonData", "class_intelli_image.html#aaf9f3e8db8666850024bee9aad9966ba", null ], - [ "loadImage", "class_intelli_image.html#aec0e9c8184d89dee33fd9adefbd2f8aa", null ], + [ "getTypeOfImage", "class_intelli_image.html#af6b09c8d1d6b54a7e8a4e7286f3e503f", null ], + [ "loadImage", "class_intelli_image.html#ae231800aba38c96074bbe9bb6e341d4e", null ], [ "resizeImage", "class_intelli_image.html#a177403ab9585d4ba31984a644c54d310", null ], [ "setPolygon", "class_intelli_image.html#aa4b3f4631bd972456917275afb9fd309", null ], - [ "imageData", "class_intelli_image.html#a2431be82e9e85dd34b62a7f7cba053c2", null ] + [ "updateRendererSetting", "class_intelli_image.html#ae4dbaefabce4ec5bec37f5b95e2f62e2", null ], + [ "fastRenderer", "class_intelli_image.html#adade0f6990152f09d953067a51511b9c", null ], + [ "imageData", "class_intelli_image.html#a2431be82e9e85dd34b62a7f7cba053c2", null ], + [ "TypeOfImage", "class_intelli_image.html#ac460f75e1fa7e44b00a65e7fddac5b80", null ] ]; \ No newline at end of file diff --git a/docs/html/class_intelli_image.png b/docs/html/class_intelli_image.png new file mode 100644 index 0000000000000000000000000000000000000000..757436dc2418859a9075c9bef727b6cdec02fd10 GIT binary patch literal 754 zcmeAS@N?(olHy`uVBq!ia0vp^r9j-l!3-qdT?_F9QW60^A+G=b{|AY@dpCRboC!b{ z7#}!rfUoz!Qy`b4B*-tA0jLNBuAT}pVqjou^mK6ysbG9N_u-}03Op|SvnB8UpSVBF z(a~}3_5*V@byv5t@Nr)JchvIvEN=D-5zSly!T*&@H>>Wy#`eL*f8|Mm1Ma()?31~7 z{cDqQULt?@+qc%gb!;2ftXt{nCaaQrFF5OV6+`9Sj;}pZ@&%7R*}nRtb$DXt=ECAQ zpm43k>&P81c^9nEPu+2Cr&yN7sRE7l_3IKF{7cjKz7Nt5j#j_6`byt_nFh9BhO3It zZ52DsH=_gy~D>ybC;hq3))B;9c!ymU{IQFJGJ1&0qQa`@EOp9Q#(s zo2+*5)$r?zF06?()7em{eDUp?S#tBUCszHB(a*ZE+okR%Px~jUwTYgq7CugnnZ3(9cXfpE z`->m_)jdnUCWjbrzQ$Csf^)&nT>;BivTx)5%KEn9t@GcNQgR^;tE562X5qluGiTaf zPD%UbGegDn+5)d2-_m8fN;Q6NHQ9Mx-O%$=;JxTcex=P)ZFxFBTVBN}o=yDOJ!jjq zxz9dcmHB>e?gQCnD$_394i@&h_0e$ov*yoL(d84O4t={E(H(NWS4}N$r={wC;a5Sn zzrU;#4ljPCvwTVF-*d^fE!9G?D=gIC-n#g{u8sT3rJZThcAopNvF-75(~!r1bgvYc z=uQdW*QWZ?`EHfT=6$*=j&F~e9I^dMU%i!Q)&lv(vu19+CeOc3e@|Ue%06HMW$<+M Kb6Mw<&;$TbhH%CJ literal 0 HcmV?d00001 diff --git a/docs/html/class_intelli_image__inherit__graph.dot b/docs/html/class_intelli_image__inherit__graph.dot index 229af0f..54f1a50 100644 --- a/docs/html/class_intelli_image__inherit__graph.dot +++ b/docs/html/class_intelli_image__inherit__graph.dot @@ -5,7 +5,7 @@ digraph "IntelliImage" node [fontname="Helvetica",fontsize="10",shape=record]; Node1 [label="IntelliImage",height=0.2,width=0.4,color="black", fillcolor="grey75", style="filled", fontcolor="black",tooltip="An abstract class which manages the basic IntelliImage operations."]; Node1 -> Node2 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node2 [label="IntelliRasterImage",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_raster_image.html",tooltip="The IntelliRasterImage manages a Rasterimage."]; + Node2 [label="IntelliRasterImage",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_raster_image.html",tooltip="The IntelliRasterImage manages a RASTERIMAGE."]; Node2 -> Node3 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; Node3 [label="IntelliShapedImage",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_shaped_image.html",tooltip="The IntelliShapedImage manages a Shapedimage."]; } diff --git a/docs/html/class_intelli_image_a2e787f1b333b59401643936ebb3dcfe1_icgraph.dot b/docs/html/class_intelli_image_a2e787f1b333b59401643936ebb3dcfe1_icgraph.dot index 40e51a4..e10d367 100644 --- a/docs/html/class_intelli_image_a2e787f1b333b59401643936ebb3dcfe1_icgraph.dot +++ b/docs/html/class_intelli_image_a2e787f1b333b59401643936ebb3dcfe1_icgraph.dot @@ -6,7 +6,9 @@ digraph "IntelliImage::drawPoint" rankdir="RL"; Node1 [label="IntelliImage::drawPoint",height=0.2,width=0.4,color="black", fillcolor="grey75", style="filled", fontcolor="black",tooltip="A."]; Node1 -> Node2 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node2 [label="IntelliToolPolygon\l::onMouseLeftPressed",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_polygon.html#ad5d3b741be6d0647a9cdc9da2cb8bc3d",tooltip="A function managing the left click pressed of a mouse. Setting polygon points."]; + Node2 [label="IntelliToolPen::onMouseLeft\lPressed",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_pen.html#a8ff40aef6d38eb55af31a19322429205",tooltip="A function managing the left click pressed of a mouse. Starting the drawing procedure."]; Node1 -> Node3 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; Node3 [label="IntelliToolLine::onMouse\lLeftPressed",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_line.html#a155d676a5f98311217eb095be4759846",tooltip="A function managing the left click pressed of a mouse. Sets the starting point of the line."]; + Node1 -> Node4 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node4 [label="IntelliToolPolygon\l::onMouseLeftPressed",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_polygon.html#ad5d3b741be6d0647a9cdc9da2cb8bc3d",tooltip="A function managing the left click pressed of a mouse. Setting polygon points."]; } diff --git a/docs/html/class_intelli_image_a6be622810dc2bc756054bb5769becb06_icgraph.dot b/docs/html/class_intelli_image_a6be622810dc2bc756054bb5769becb06_icgraph.dot index ac57cc0..976550d 100644 --- a/docs/html/class_intelli_image_a6be622810dc2bc756054bb5769becb06_icgraph.dot +++ b/docs/html/class_intelli_image_a6be622810dc2bc756054bb5769becb06_icgraph.dot @@ -10,9 +10,9 @@ digraph "IntelliImage::drawPlain" Node1 -> Node3 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; Node3 [label="IntelliToolPlainTool\l::onMouseLeftPressed",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_plain_tool.html#ab786dd5fa80af863246013d43c4b7ac9",tooltip="A function managing the left click pressed of a mouse. Filling the whole canvas."]; Node1 -> Node4 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node4 [label="IntelliToolRectangle\l::onMouseMoved",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_rectangle.html#a4b5931071e21eb6949ffe357315e408b",tooltip="A function managing the mouse moved event.Drawing a rectangle to currrent mouse position."]; + Node4 [label="IntelliToolLine::onMouse\lMoved",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_line.html#abc6324ef0778823fe7e35aef8ae37f9b",tooltip="A function managing the mouse moved event. Drawing a Line from the startpoint to the current mouse po..."]; Node1 -> Node5 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node5 [label="IntelliToolCircle::\lonMouseMoved",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_circle.html#a90ee58c5390a86afc75c14ca79b91d7b",tooltip="A function managing the mouse moved event. Draws a circle with radius of eulerian norm of mouse posit..."]; + Node5 [label="IntelliToolRectangle\l::onMouseMoved",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_rectangle.html#a4b5931071e21eb6949ffe357315e408b",tooltip="A function managing the mouse moved event.Drawing a rectangle to currrent mouse position."]; Node1 -> Node6 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node6 [label="IntelliToolLine::onMouse\lMoved",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_line.html#abc6324ef0778823fe7e35aef8ae37f9b",tooltip="A function managing the mouse moved event. Drawing a Line from the startpoint to the current mouse po..."]; + Node6 [label="IntelliToolCircle::\lonMouseMoved",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_circle.html#a90ee58c5390a86afc75c14ca79b91d7b",tooltip="A function managing the mouse moved event. Draws a circle with radius of eulerian norm of mouse posit..."]; } diff --git a/docs/html/class_intelli_image_ad66fbe380ffe0e073a8cd760f8285fe3_icgraph.dot b/docs/html/class_intelli_image_ad66fbe380ffe0e073a8cd760f8285fe3_icgraph.dot new file mode 100644 index 0000000..211f7b5 --- /dev/null +++ b/docs/html/class_intelli_image_ad66fbe380ffe0e073a8cd760f8285fe3_icgraph.dot @@ -0,0 +1,10 @@ +digraph "IntelliImage::getImageData" +{ + // LATEX_PDF_SIZE + edge [fontname="Helvetica",fontsize="10",labelfontname="Helvetica",labelfontsize="10"]; + node [fontname="Helvetica",fontsize="10",shape=record]; + rankdir="RL"; + Node1 [label="IntelliImage::getImageData",height=0.2,width=0.4,color="black", fillcolor="grey75", style="filled", fontcolor="black",tooltip="getImageData returns the data of the current image."]; + Node1 -> Node2 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node2 [label="IntelliPhotoGui::UpdateGui",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_photo_gui.html#a1dbef8d4688227aa9455aea52db00bf4",tooltip=" "]; +} diff --git a/docs/html/class_intelli_image_ae231800aba38c96074bbe9bb6e341d4e_icgraph.dot b/docs/html/class_intelli_image_ae231800aba38c96074bbe9bb6e341d4e_icgraph.dot new file mode 100644 index 0000000..001acf9 --- /dev/null +++ b/docs/html/class_intelli_image_ae231800aba38c96074bbe9bb6e341d4e_icgraph.dot @@ -0,0 +1,10 @@ +digraph "IntelliImage::loadImage" +{ + // LATEX_PDF_SIZE + edge [fontname="Helvetica",fontsize="10",labelfontname="Helvetica",labelfontsize="10"]; + node [fontname="Helvetica",fontsize="10",shape=record]; + rankdir="RL"; + Node1 [label="IntelliImage::loadImage",height=0.2,width=0.4,color="black", fillcolor="grey75", style="filled", fontcolor="black",tooltip="A function that loads and sclaes an image to the fitting dimensions."]; + Node1 -> Node2 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node2 [label="PaintingArea::open",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_painting_area.html#a88c7e759aa8375a56129791645f46ea5",tooltip="The open method is used for loading a picture into the current layer."]; +} diff --git a/docs/html/class_intelli_image_aebbced93f4744fad81b7f141b21f4ab2_icgraph.dot b/docs/html/class_intelli_image_aebbced93f4744fad81b7f141b21f4ab2_icgraph.dot index 8765154..386f3b5 100644 --- a/docs/html/class_intelli_image_aebbced93f4744fad81b7f141b21f4ab2_icgraph.dot +++ b/docs/html/class_intelli_image_aebbced93f4744fad81b7f141b21f4ab2_icgraph.dot @@ -12,13 +12,13 @@ digraph "IntelliImage::calculateVisiblity" Node1 -> Node4 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; Node4 [label="IntelliToolPen::onMouseLeft\lPressed",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_pen.html#a8ff40aef6d38eb55af31a19322429205",tooltip="A function managing the left click pressed of a mouse. Starting the drawing procedure."]; Node1 -> Node5 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node5 [label="IntelliToolRectangle\l::onMouseLeftPressed",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_rectangle.html#ae03c307ccf66cbe3fd59e3657712368d",tooltip="A function managing the left click pressed of a mouse. Setting the originCorner and draws a rectangle..."]; + Node5 [label="IntelliToolLine::onMouse\lLeftPressed",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_line.html#a155d676a5f98311217eb095be4759846",tooltip="A function managing the left click pressed of a mouse. Sets the starting point of the line."]; Node1 -> Node6 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node6 [label="IntelliToolPolygon\l::onMouseLeftPressed",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_polygon.html#ad5d3b741be6d0647a9cdc9da2cb8bc3d",tooltip="A function managing the left click pressed of a mouse. Setting polygon points."]; + Node6 [label="IntelliToolRectangle\l::onMouseLeftPressed",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_rectangle.html#ae03c307ccf66cbe3fd59e3657712368d",tooltip="A function managing the left click pressed of a mouse. Setting the originCorner and draws a rectangle..."]; Node1 -> Node7 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; Node7 [label="IntelliToolCircle::\lonMouseLeftPressed",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_circle.html#ae883b8ae833c78a8867e626c600f9639",tooltip="A function managing the left click pressed of a mouse. Sets the middle point of the cricle."]; Node1 -> Node8 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node8 [label="IntelliToolLine::onMouse\lLeftPressed",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_line.html#a155d676a5f98311217eb095be4759846",tooltip="A function managing the left click pressed of a mouse. Sets the starting point of the line."]; + Node8 [label="IntelliToolPolygon\l::onMouseLeftPressed",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_polygon.html#ad5d3b741be6d0647a9cdc9da2cb8bc3d",tooltip="A function managing the left click pressed of a mouse. Setting polygon points."]; Node1 -> Node9 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; Node9 [label="IntelliTool::onMouseLeft\lPressed",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool.html#a34b7ef1dde96b94a0ce450a25ae1778c",tooltip="A function managing the left click Pressed of a Mouse. Resetting the current draw...."]; Node9 -> Node10 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; @@ -27,8 +27,8 @@ digraph "IntelliImage::calculateVisiblity" Node9 -> Node3 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; Node9 -> Node4 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; Node9 -> Node5 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node9 -> Node7 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; Node9 -> Node6 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node9 -> Node7 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; Node9 -> Node8 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; Node1 -> Node11 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; Node11 [label="IntelliTool::onMouseLeft\lReleased",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool.html#a906a2575c16c8a33cb2a5197f8d8cc5b",tooltip="A function managing the left click Released of a Mouse. Call this in child classes!"]; @@ -41,13 +41,13 @@ digraph "IntelliImage::calculateVisiblity" Node11 -> Node15 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; Node15 [label="IntelliToolPen::onMouseLeft\lReleased",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_pen.html#abda7a22b9766fa4ad254324a53cab94d",tooltip="A function managing the left click released of a mouse. Merging the drawing to the active layer."]; Node11 -> Node16 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node16 [label="IntelliToolRectangle\l::onMouseLeftReleased",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_rectangle.html#a94460e3ff1c19e80bde922c55f53cc43",tooltip="A function managing the left click released of a mouse. Merging the draw to the active layer."]; + Node16 [label="IntelliToolLine::onMouse\lLeftReleased",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_line.html#ac93f76ff20a1c111a403b298bab02482",tooltip="A function managing the left click released of a mouse."]; Node11 -> Node17 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node17 [label="IntelliToolCircle::\lonMouseLeftReleased",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_circle.html#ad8e438ec997c57262b5efc2db4cee1a3",tooltip="A function managing the left click released of a mouse."]; + Node17 [label="IntelliToolRectangle\l::onMouseLeftReleased",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_rectangle.html#a94460e3ff1c19e80bde922c55f53cc43",tooltip="A function managing the left click released of a mouse. Merging the draw to the active layer."]; Node11 -> Node18 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node18 [label="IntelliToolPolygon\l::onMouseLeftReleased",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_polygon.html#a4e1473ff408ae2e11cf6a43f6f575f21",tooltip="A function managing the left click released of a mouse. Merging the fill to the active layer."]; + Node18 [label="IntelliToolCircle::\lonMouseLeftReleased",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_circle.html#ad8e438ec997c57262b5efc2db4cee1a3",tooltip="A function managing the left click released of a mouse."]; Node11 -> Node19 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node19 [label="IntelliToolLine::onMouse\lLeftReleased",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_line.html#ac93f76ff20a1c111a403b298bab02482",tooltip="A function managing the left click released of a mouse."]; + Node19 [label="IntelliToolPolygon\l::onMouseLeftReleased",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_polygon.html#a4e1473ff408ae2e11cf6a43f6f575f21",tooltip="A function managing the left click released of a mouse. Merging the fill to the active layer."]; Node1 -> Node20 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; Node20 [label="IntelliTool::onMouseMoved",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool.html#ac10e20414cd8855a2f9b103fb6408639",tooltip="A function managing the mouse moved event. Call this in child classes!"]; Node20 -> Node21 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; @@ -59,13 +59,13 @@ digraph "IntelliImage::calculateVisiblity" Node20 -> Node24 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; Node24 [label="IntelliToolPen::onMouseMoved",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_pen.html#a58d1d636497b630647ce0c4d652737c2",tooltip="A function managing the mouse moved event. To draw the line."]; Node20 -> Node25 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node25 [label="IntelliToolRectangle\l::onMouseMoved",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_rectangle.html#a4b5931071e21eb6949ffe357315e408b",tooltip="A function managing the mouse moved event.Drawing a rectangle to currrent mouse position."]; + Node25 [label="IntelliToolLine::onMouse\lMoved",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_line.html#abc6324ef0778823fe7e35aef8ae37f9b",tooltip="A function managing the mouse moved event. Drawing a Line from the startpoint to the current mouse po..."]; Node20 -> Node26 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node26 [label="IntelliToolCircle::\lonMouseMoved",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_circle.html#a90ee58c5390a86afc75c14ca79b91d7b",tooltip="A function managing the mouse moved event. Draws a circle with radius of eulerian norm of mouse posit..."]; + Node26 [label="IntelliToolRectangle\l::onMouseMoved",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_rectangle.html#a4b5931071e21eb6949ffe357315e408b",tooltip="A function managing the mouse moved event.Drawing a rectangle to currrent mouse position."]; Node20 -> Node27 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node27 [label="IntelliToolLine::onMouse\lMoved",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_line.html#abc6324ef0778823fe7e35aef8ae37f9b",tooltip="A function managing the mouse moved event. Drawing a Line from the startpoint to the current mouse po..."]; + Node27 [label="IntelliToolCircle::\lonMouseMoved",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_circle.html#a90ee58c5390a86afc75c14ca79b91d7b",tooltip="A function managing the mouse moved event. Draws a circle with radius of eulerian norm of mouse posit..."]; Node20 -> Node28 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; Node28 [label="IntelliToolPolygon\l::onMouseMoved",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_polygon.html#a0e3a1135f04c73c159137ae219a38922",tooltip="A function managing the mouse moved event."]; Node1 -> Node29 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node29 [label="PaintingArea::open",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_painting_area.html#a1f597740b4d7b4bc2e24c51f8cb0b6eb",tooltip="The open method is used for loading a picture into the current layer."]; + Node29 [label="PaintingArea::open",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_painting_area.html#a88c7e759aa8375a56129791645f46ea5",tooltip="The open method is used for loading a picture into the current layer."]; } diff --git a/docs/html/class_intelli_image_af3c859f5c409e37051edfd9e9fbca056_icgraph.dot b/docs/html/class_intelli_image_af3c859f5c409e37051edfd9e9fbca056_icgraph.dot index 09a88c6..6aecc8a 100644 --- a/docs/html/class_intelli_image_af3c859f5c409e37051edfd9e9fbca056_icgraph.dot +++ b/docs/html/class_intelli_image_af3c859f5c409e37051edfd9e9fbca056_icgraph.dot @@ -8,7 +8,5 @@ digraph "IntelliImage::drawPixel" Node1 -> Node2 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; Node2 [label="IntelliToolFloodFill\l::onMouseLeftPressed",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_flood_fill.html#ac85e3cb6233508ff9612833a8d9e3961",tooltip="A function managing the left click pressed of a mouse. Sets the point to flood fill around and does t..."]; Node1 -> Node3 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node3 [label="IntelliToolPen::onMouseLeft\lPressed",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_pen.html#a8ff40aef6d38eb55af31a19322429205",tooltip="A function managing the left click pressed of a mouse. Starting the drawing procedure."]; - Node1 -> Node4 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node4 [label="IntelliToolPolygon\l::onMouseLeftReleased",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_polygon.html#a4e1473ff408ae2e11cf6a43f6f575f21",tooltip="A function managing the left click released of a mouse. Merging the fill to the active layer."]; + Node3 [label="IntelliToolPolygon\l::onMouseLeftReleased",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_polygon.html#a4e1473ff408ae2e11cf6a43f6f575f21",tooltip="A function managing the left click released of a mouse. Merging the fill to the active layer."]; } diff --git a/docs/html/class_intelli_photo_gui-members.html b/docs/html/class_intelli_photo_gui-members.html index bbb5fa7..a0aab34 100644 --- a/docs/html/class_intelli_photo_gui-members.html +++ b/docs/html/class_intelli_photo_gui-members.html @@ -95,6 +95,7 @@ $(document).ready(function(){initNavTree('class_intelli_photo_gui.html','');}); +
closeEvent(QCloseEvent *event) overrideIntelliPhotoGuiprotected
IntelliPhotoGui()IntelliPhotoGui
UpdateGui()IntelliPhotoGui
diff --git a/docs/html/class_intelli_photo_gui.html b/docs/html/class_intelli_photo_gui.html index 1ea221b..5fdc6aa 100644 --- a/docs/html/class_intelli_photo_gui.html +++ b/docs/html/class_intelli_photo_gui.html @@ -102,19 +102,17 @@ $(document).ready(function(){initNavTree('class_intelli_photo_gui.html','');});
Inheritance diagram for IntelliPhotoGui:
-
Inheritance graph
-
[legend]
-
-Collaboration diagram for IntelliPhotoGui:
-
-
Collaboration graph
-
[legend]
+
+ +
+ +

Public Member Functions

 IntelliPhotoGui ()
 The IntelliPhotoGui method is the constructor and is used to create a new instance of the main program window. More...
 
void UpdateGui ()
 
@@ -124,7 +122,7 @@ Protected Member Functions

Detailed Description

The IntelliPhotoGui class handles the graphical user interface for the intelliPhoto program.

-

Definition at line 22 of file IntelliPhotoGui.h.

+

Definition at line 24 of file IntelliPhotoGui.h.

Constructor & Destructor Documentation

◆ IntelliPhotoGui()

@@ -143,7 +141,7 @@ Protected Member Functions

The IntelliPhotoGui method is the constructor and is used to create a new instance of the main program window.

-

Definition at line 10 of file IntelliPhotoGui.cpp.

+

Definition at line 7 of file IntelliPhotoGui.cpp.

@@ -172,7 +170,26 @@ Protected Member Functions

Protected Member Functions

-

Definition at line 26 of file IntelliPhotoGui.cpp.

+

Definition at line 23 of file IntelliPhotoGui.cpp.

+ +
+ + +

◆ UpdateGui()

+ +
+
+ + + + + + + +
void IntelliPhotoGui::UpdateGui ()
+
+ +

Definition at line 694 of file IntelliPhotoGui.cpp.

diff --git a/docs/html/class_intelli_photo_gui.js b/docs/html/class_intelli_photo_gui.js index 2c41940..da7c4b8 100644 --- a/docs/html/class_intelli_photo_gui.js +++ b/docs/html/class_intelli_photo_gui.js @@ -1,5 +1,6 @@ var class_intelli_photo_gui = [ [ "IntelliPhotoGui", "class_intelli_photo_gui.html#ad2aaec3c1517a9aaa461b54e341b97e0", null ], - [ "closeEvent", "class_intelli_photo_gui.html#a2cf48070236ae8b35245e7f30482ef13", null ] + [ "closeEvent", "class_intelli_photo_gui.html#a2cf48070236ae8b35245e7f30482ef13", null ], + [ "UpdateGui", "class_intelli_photo_gui.html#a1dbef8d4688227aa9455aea52db00bf4", null ] ]; \ No newline at end of file diff --git a/docs/html/class_intelli_photo_gui.png b/docs/html/class_intelli_photo_gui.png new file mode 100644 index 0000000000000000000000000000000000000000..762c3403eb098b14817c1908ef65a0c35fa1775a GIT binary patch literal 471 zcmeAS@N?(olHy`uVBq!ia0vp^aX=iv!3-pqvl;0CDTx4|5ZC|z{{xxt-o2YWd(H$P z3ycpOIKbC?;3<&HQ4-`A%m7pb0#{Fk7%?y~rg^$JhEy=VoqMzIumOiFzy8Dj|0`}) zFsqwLYKBPlhUR@}>fhM=tEavvKG95c%Ogo?`!go>q4Ji=9(n)qfc+P z$?{dlc;Z5PV;{C}{!z5R_WCuWo7WG1-_HJ<<=ltTsw3BIb+7a7dU^lB?~cgOy1eN( zd#4vx7~ec}yK(-3@;4ufzpWE|5Y6QH^v9#!t@Gu#IxpWf|M0hk++K*A}t3 zP}2*CRex6eX=Ufw@`0gIOitm# zA!e4SiUtR6et{SD4_#e8wJ@Y)K4fI7<+a~dxHhX=^oFKE literal 0 HcmV?d00001 diff --git a/docs/html/class_intelli_photo_gui_a1dbef8d4688227aa9455aea52db00bf4_cgraph.dot b/docs/html/class_intelli_photo_gui_a1dbef8d4688227aa9455aea52db00bf4_cgraph.dot new file mode 100644 index 0000000..d1638a7 --- /dev/null +++ b/docs/html/class_intelli_photo_gui_a1dbef8d4688227aa9455aea52db00bf4_cgraph.dot @@ -0,0 +1,18 @@ +digraph "IntelliPhotoGui::UpdateGui" +{ + // LATEX_PDF_SIZE + edge [fontname="Helvetica",fontsize="10",labelfontname="Helvetica",labelfontsize="10"]; + node [fontname="Helvetica",fontsize="10",shape=record]; + rankdir="LR"; + Node1 [label="IntelliPhotoGui::UpdateGui",height=0.2,width=0.4,color="black", fillcolor="grey75", style="filled", fontcolor="black",tooltip=" "]; + Node1 -> Node2 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node2 [label="IntelliColorPicker\l::getFirstColor",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_color_picker.html#aae2eb27b928fe9388b9398b0556303b7",tooltip="A function to read the primary selected color."]; + Node1 -> Node3 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node3 [label="IntelliImage::getImageData",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_image.html#ad66fbe380ffe0e073a8cd760f8285fe3",tooltip="getImageData returns the data of the current image."]; + Node1 -> Node4 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node4 [label="PaintingArea::getImageOf\lActiveLayer",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_painting_area.html#acab11ad35d07e9081203d8217d2c0855",tooltip=" "]; + Node1 -> Node5 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node5 [label="PaintingArea::getNumberOf\lActiveLayer",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_painting_area.html#a24280454ebb80db7feba2fd621513353",tooltip=" "]; + Node1 -> Node6 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node6 [label="IntelliColorPicker\l::getSecondColor",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_color_picker.html#a55568fbf5dc783f06284b7031ffe9415",tooltip="A function to read the secondary selected color."]; +} diff --git a/docs/html/class_intelli_raster_image-members.html b/docs/html/class_intelli_raster_image-members.html index b029ead..b492ded 100644 --- a/docs/html/class_intelli_raster_image-members.html +++ b/docs/html/class_intelli_raster_image-members.html @@ -98,17 +98,23 @@ $(document).ready(function(){initNavTree('class_intelli_raster_image.html','');} drawPixel(const QPoint &p1, const QColor &color)IntelliImagevirtual drawPlain(const QColor &color)IntelliImagevirtual drawPoint(const QPoint &p1, const QColor &color, const int &penWidth)IntelliImagevirtual - getDeepCopy() overrideIntelliRasterImagevirtual - getDisplayable(const QSize &displaySize, int alpha) overrideIntelliRasterImagevirtual - getDisplayable(int alpha=255) overrideIntelliRasterImagevirtual + fastRendererIntelliImageprotected + getDeepCopy() overrideIntelliRasterImagevirtual + getDisplayable(const QSize &displaySize, int alpha) overrideIntelliRasterImagevirtual + getDisplayable(int alpha=255) overrideIntelliRasterImagevirtual + getImageData()IntelliImagevirtual getPixelColor(QPoint &point)IntelliImagevirtual getPolygonData()IntelliImageinlinevirtual - imageDataIntelliImageprotected - IntelliImage(int weight, int height)IntelliImage - IntelliRasterImage(int weight, int height)IntelliRasterImage - loadImage(const QString &fileName)IntelliImagevirtual + getTypeOfImage()IntelliImageinlinevirtual + imageDataIntelliImageprotected + ImageType enum nameIntelliImage + IntelliImage(int width, int height, bool fastRendererOn)IntelliImage + IntelliRasterImage(int width, int height, bool fastRendererOn)IntelliRasterImage + loadImage(const QString &filePath)IntelliImagevirtual resizeImage(QImage *image, const QSize &newSize)IntelliImageprotected setPolygon(const std::vector< QPoint > &polygonData) overrideIntelliRasterImagevirtual + TypeOfImageIntelliImageprotected + updateRendererSetting(bool fastRendererOn)IntelliImagevirtual ~IntelliImage()=0IntelliImagepure virtual ~IntelliRasterImage() overrideIntelliRasterImagevirtual diff --git a/docs/html/class_intelli_raster_image.html b/docs/html/class_intelli_raster_image.html index 010eecb..cacb3a5 100644 --- a/docs/html/class_intelli_raster_image.html +++ b/docs/html/class_intelli_raster_image.html @@ -95,26 +95,26 @@ $(document).ready(function(){initNavTree('class_intelli_raster_image.html','');}
-

The IntelliRasterImage manages a Rasterimage. +

The IntelliRasterImage manages a RASTERIMAGE. More...

#include <IntelliRasterImage.h>

Inheritance diagram for IntelliRasterImage:
-
Inheritance graph
-
[legend]
-
-Collaboration diagram for IntelliRasterImage:
-
-
Collaboration graph
-
[legend]
+
+ + +IntelliImage +IntelliShapedImage + +
- - - + + + @@ -131,9 +131,9 @@ Public Member Functions - - - + + + @@ -152,17 +152,25 @@ Public Member Functions - - - + + + + + + + + + + +

Public Member Functions

 IntelliRasterImage (int weight, int height)
 The Construcor of the IntelliRasterImage. Given the Image dimensions. More...
 
 IntelliRasterImage (int width, int height, bool fastRendererOn)
 The Construcor of the IntelliRasterImage. Given the Image dimensions. More...
 
virtual ~IntelliRasterImage () override
 An Destructor. More...
 
 An abstract function that sets the data of the visible Polygon, if needed. More...
 
- Public Member Functions inherited from IntelliImage
 IntelliImage (int weight, int height)
 The Construcor of the IntelliImage. Given the Image dimensions. More...
 
 IntelliImage (int width, int height, bool fastRendererOn)
 The Construcor of the IntelliImage. Given the Image dimensions. More...
 
virtual ~IntelliImage ()=0
 An Abstract Destructor. More...
 
virtual std::vector< QPoint > getPolygonData ()
 A function that returns the Polygondata if existent. More...
 
virtual bool loadImage (const QString &fileName)
 A function that loads and sclaes an image to the fitting dimensions. More...
 
virtual ImageType getTypeOfImage ()
 
virtual bool loadImage (const QString &filePath)
 A function that loads and sclaes an image to the fitting dimensions. More...
 
virtual QColor getPixelColor (QPoint &point)
 A function that returns the pixelcolor at a certain point. More...
 
virtual void updateRendererSetting (bool fastRendererOn)
 updateRendererSetting updates the existing image format to the new format. More...
 
virtual QImage getImageData ()
 getImageData returns the data of the current image. More...
 
- + @@ -170,18 +178,30 @@ Protected Member Functions

Protected Member Functions

virtual void calculateVisiblity () override
 A function that calculates the visibility of the image if a polygon is given. [does nothing in Rasterimage]. More...
 A function that calculates the visibility of the image if a polygon is given. [does nothing in RASTERIMAGE]. More...
 
- Protected Member Functions inherited from IntelliImage
void resizeImage (QImage *image, const QSize &newSize)
+ + + + + + + + + +

Additional Inherited Members

- Public Types inherited from IntelliImage
enum  ImageType { ImageType::RASTERIMAGE, +ImageType::SHAPEDIMAGE + }
 The Types, which an Image can be. More...
 
- Protected Attributes inherited from IntelliImage
QImage imageData
 The underlying image data. More...
 
ImageType TypeOfImage
 The Type, an Image is. More...
 
bool fastRenderer
 fastRenderer is the flag that represents the usage of 8bit pictures. More...
 

Detailed Description

-

The IntelliRasterImage manages a Rasterimage.

+

The IntelliRasterImage manages a RASTERIMAGE.

Definition at line 9 of file IntelliRasterImage.h.

Constructor & Destructor Documentation

- -

◆ IntelliRasterImage()

+ +

◆ IntelliRasterImage()

@@ -190,13 +210,19 @@ Additional Inherited Members IntelliRasterImage::IntelliRasterImage ( int  - weight, + width, int  - height  + height, + + + + + bool  + fastRendererOn  @@ -206,21 +232,17 @@ Additional Inherited Members
-

The Construcor of the IntelliRasterImage. Given the Image dimensions.

+

The Construcor of the IntelliRasterImage. Given the Image dimensions.

Parameters
- + +
weight- The weight of the Image.
width- The width of the Image.
height- The height of the Image.
fastRendererOn- Represents the flag for 8bit picture handelling.

Definition at line 6 of file IntelliRasterImage.cpp.

-
-Here is the caller graph for this function:
-
-
-
@@ -249,7 +271,7 @@ Here is the caller graph for this function:

An Destructor.

-

Definition at line 11 of file IntelliRasterImage.cpp.

+

Definition at line 12 of file IntelliRasterImage.cpp.

@@ -277,11 +299,11 @@ Here is the caller graph for this function:
-

A function that calculates the visibility of the image if a polygon is given. [does nothing in Rasterimage].

+

A function that calculates the visibility of the image if a polygon is given. [does nothing in RASTERIMAGE].

Implements IntelliImage.

-

Definition at line 21 of file IntelliRasterImage.cpp.

+

Definition at line 23 of file IntelliRasterImage.cpp.

@@ -315,12 +337,7 @@ Here is the caller graph for this function:

Reimplemented in IntelliShapedImage.

-

Definition at line 15 of file IntelliRasterImage.cpp.

-
-Here is the call graph for this function:
-
-
-
+

Definition at line 16 of file IntelliRasterImage.cpp.

@@ -372,12 +389,7 @@ Here is the call graph for this function:

Reimplemented in IntelliShapedImage.

-

Definition at line 29 of file IntelliRasterImage.cpp.

-
-Here is the caller graph for this function:
-
-
-
+

Definition at line 31 of file IntelliRasterImage.cpp.

@@ -418,12 +430,7 @@ Here is the caller graph for this function:

Reimplemented in IntelliShapedImage.

-

Definition at line 25 of file IntelliRasterImage.cpp.

-
-Here is the call graph for this function:
-
-
-
+

Definition at line 27 of file IntelliRasterImage.cpp.

@@ -463,7 +470,7 @@ Here is the call graph for this function:

Reimplemented in IntelliShapedImage.

-

Definition at line 41 of file IntelliRasterImage.cpp.

+

Definition at line 49 of file IntelliRasterImage.cpp.

diff --git a/docs/html/class_intelli_raster_image.js b/docs/html/class_intelli_raster_image.js index 10b0061..6de583e 100644 --- a/docs/html/class_intelli_raster_image.js +++ b/docs/html/class_intelli_raster_image.js @@ -1,6 +1,6 @@ var class_intelli_raster_image = [ - [ "IntelliRasterImage", "class_intelli_raster_image.html#aad9b561fe499a4da3c6ef98971aa3468", null ], + [ "IntelliRasterImage", "class_intelli_raster_image.html#ae779b571372296f1922af818ba003413", null ], [ "~IntelliRasterImage", "class_intelli_raster_image.html#a844a2b58c43f7e01f2ca116286371bc8", null ], [ "calculateVisiblity", "class_intelli_raster_image.html#a87cf2d360c129d64a5db0db85818eb60", null ], [ "getDeepCopy", "class_intelli_raster_image.html#a8f901301b106504de3c27308ade897dc", null ], diff --git a/docs/html/class_intelli_raster_image.png b/docs/html/class_intelli_raster_image.png new file mode 100644 index 0000000000000000000000000000000000000000..c56da4b1cac502c8f9a0e0f1b610ef4727d6edf6 GIT binary patch literal 747 zcmeAS@N?(olHy`uVBq!ia0vp^r9j-l!3-qdT?_F9QW60^A+G=b{|AY@dpCRboC!b{ z7#}!rfUoz!Qy`b4B*-tA0jLNBuAT}pVqjpZ@^o}_IIHGB=jrb&-uI_i&Sp1% zzEst-vR2}CJJ56*2 z=TU`iN&h#kiBEXwQa3SN^O};W)pd)vja43J@@7_FX)Wr=l#592E-zlt_H$;GO|NPB zy4&l7_Xj;&Jb!amRn0orSAUE5u6TG=_0#FJ8`H06@-kn!Ffm~EF7Mpc5yt-)KlWu0 z2)B1LHO|&;XrIL}Yc+T2tg3|F0r403ZrEL!zv`hQ>xxxCyb?R!F|GKV?d2zPiqE%9 zUIO%;=c<+GLbzj3-c8zcU0rh0lEq>9o>o_RSH0i0@rm%Ny-u?ZN9h~oZnHZ3H_;+* zuk^j!{+@0%+5Wy7naRDDvUV2j^EWh?9Lcxu-Rcp$^Wu>s+UCojlsm<)N}qqvz>sJ8 zIV06+U#)N=lT-up7ZRfcU8`~Z~zZ(AdkM5NMle5#q_qD0M zbiP|l+CyD%vvD7*y?#q_FqQF&j!U0_HWw_OqmRxu6{1-oD!M< D+%0bc literal 0 HcmV?d00001 diff --git a/docs/html/class_intelli_raster_image__coll__graph.dot b/docs/html/class_intelli_raster_image__coll__graph.dot index 2a1af2b..7a7f252 100644 --- a/docs/html/class_intelli_raster_image__coll__graph.dot +++ b/docs/html/class_intelli_raster_image__coll__graph.dot @@ -3,7 +3,7 @@ digraph "IntelliRasterImage" // LATEX_PDF_SIZE edge [fontname="Helvetica",fontsize="10",labelfontname="Helvetica",labelfontsize="10"]; node [fontname="Helvetica",fontsize="10",shape=record]; - Node1 [label="IntelliRasterImage",height=0.2,width=0.4,color="black", fillcolor="grey75", style="filled", fontcolor="black",tooltip="The IntelliRasterImage manages a Rasterimage."]; + Node1 [label="IntelliRasterImage",height=0.2,width=0.4,color="black", fillcolor="grey75", style="filled", fontcolor="black",tooltip="The IntelliRasterImage manages a RASTERIMAGE."]; Node2 -> Node1 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; Node2 [label="IntelliImage",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_image.html",tooltip="An abstract class which manages the basic IntelliImage operations."]; } diff --git a/docs/html/class_intelli_raster_image__inherit__graph.dot b/docs/html/class_intelli_raster_image__inherit__graph.dot index c758aae..f2bc33b 100644 --- a/docs/html/class_intelli_raster_image__inherit__graph.dot +++ b/docs/html/class_intelli_raster_image__inherit__graph.dot @@ -3,7 +3,7 @@ digraph "IntelliRasterImage" // LATEX_PDF_SIZE edge [fontname="Helvetica",fontsize="10",labelfontname="Helvetica",labelfontsize="10"]; node [fontname="Helvetica",fontsize="10",shape=record]; - Node1 [label="IntelliRasterImage",height=0.2,width=0.4,color="black", fillcolor="grey75", style="filled", fontcolor="black",tooltip="The IntelliRasterImage manages a Rasterimage."]; + Node1 [label="IntelliRasterImage",height=0.2,width=0.4,color="black", fillcolor="grey75", style="filled", fontcolor="black",tooltip="The IntelliRasterImage manages a RASTERIMAGE."]; Node2 -> Node1 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; Node2 [label="IntelliImage",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_image.html",tooltip="An abstract class which manages the basic IntelliImage operations."]; Node1 -> Node3 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; diff --git a/docs/html/class_intelli_raster_image_a8f901301b106504de3c27308ade897dc_cgraph.dot b/docs/html/class_intelli_raster_image_a8f901301b106504de3c27308ade897dc_cgraph.dot index 72001d8..1dd7f4f 100644 --- a/docs/html/class_intelli_raster_image_a8f901301b106504de3c27308ade897dc_cgraph.dot +++ b/docs/html/class_intelli_raster_image_a8f901301b106504de3c27308ade897dc_cgraph.dot @@ -6,5 +6,5 @@ digraph "IntelliRasterImage::getDeepCopy" rankdir="LR"; Node1 [label="IntelliRasterImage\l::getDeepCopy",height=0.2,width=0.4,color="black", fillcolor="grey75", style="filled", fontcolor="black",tooltip="A function that copys all that returns a [allocated] Image."]; Node1 -> Node2 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node2 [label="IntelliRasterImage\l::IntelliRasterImage",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_raster_image.html#aad9b561fe499a4da3c6ef98971aa3468",tooltip="The Construcor of the IntelliRasterImage. Given the Image dimensions."]; + Node2 [label="IntelliRasterImage\l::IntelliRasterImage",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_raster_image.html#ae779b571372296f1922af818ba003413",tooltip="The Construcor of the IntelliRasterImage. Given the Image dimensions."]; } diff --git a/docs/html/class_intelli_raster_image_ae779b571372296f1922af818ba003413_icgraph.dot b/docs/html/class_intelli_raster_image_ae779b571372296f1922af818ba003413_icgraph.dot new file mode 100644 index 0000000..0fdfdea --- /dev/null +++ b/docs/html/class_intelli_raster_image_ae779b571372296f1922af818ba003413_icgraph.dot @@ -0,0 +1,10 @@ +digraph "IntelliRasterImage::IntelliRasterImage" +{ + // LATEX_PDF_SIZE + edge [fontname="Helvetica",fontsize="10",labelfontname="Helvetica",labelfontsize="10"]; + node [fontname="Helvetica",fontsize="10",shape=record]; + rankdir="RL"; + Node1 [label="IntelliRasterImage\l::IntelliRasterImage",height=0.2,width=0.4,color="black", fillcolor="grey75", style="filled", fontcolor="black",tooltip="The Construcor of the IntelliRasterImage. Given the Image dimensions."]; + Node1 -> Node2 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node2 [label="IntelliRasterImage\l::getDeepCopy",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_raster_image.html#a8f901301b106504de3c27308ade897dc",tooltip="A function that copys all that returns a [allocated] Image."]; +} diff --git a/docs/html/class_intelli_render_settings-members.html b/docs/html/class_intelli_render_settings-members.html new file mode 100644 index 0000000..5702f49 --- /dev/null +++ b/docs/html/class_intelli_render_settings-members.html @@ -0,0 +1,109 @@ + + + + + + + +IntelliPhoto: Member List + + + + + + + + + + + + + + +
+
+ + + + + + +
+
IntelliPhoto +  0.5 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
IntelliRenderSettings Member List
+
+
+ +

This is the complete list of members for IntelliRenderSettings, including all inherited members.

+ + + +
getFastRenderer()IntelliRenderSettings
IntelliRenderSettings()IntelliRenderSettings
+
+ + + + diff --git a/docs/html/class_intelli_render_settings.html b/docs/html/class_intelli_render_settings.html new file mode 100644 index 0000000..06a03e7 --- /dev/null +++ b/docs/html/class_intelli_render_settings.html @@ -0,0 +1,169 @@ + + + + + + + +IntelliPhoto: IntelliRenderSettings Class Reference + + + + + + + + + + + + + + +
+
+ + + + + + +
+
IntelliPhoto +  0.5 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
IntelliRenderSettings Class Reference
+
+
+ +

#include <IntelliRenderSettings.h>

+ + + + + + + +

+Public Member Functions

 IntelliRenderSettings ()
 
bool getFastRenderer ()
 The getfastRenderer gets the value of the flag for the fastRenderer setting. More...
 
+

Detailed Description

+
+

Definition at line 5 of file IntelliRenderSettings.h.

+

Constructor & Destructor Documentation

+ +

◆ IntelliRenderSettings()

+ +
+
+ + + + + + + +
IntelliRenderSettings::IntelliRenderSettings ()
+
+ +

Definition at line 3 of file IntelliRenderSettings.cpp.

+ +
+
+

Member Function Documentation

+ +

◆ getFastRenderer()

+ +
+
+ + + + + + + +
bool IntelliRenderSettings::getFastRenderer ()
+
+ +

The getfastRenderer gets the value of the flag for the fastRenderer setting.

+
Returns
Returns true if fastRenderer is active else false
+ +

Definition at line 8 of file IntelliRenderSettings.cpp.

+ +
+
+
The documentation for this class was generated from the following files: +
+
+ + + + diff --git a/docs/html/class_intelli_render_settings.js b/docs/html/class_intelli_render_settings.js new file mode 100644 index 0000000..0a6c973 --- /dev/null +++ b/docs/html/class_intelli_render_settings.js @@ -0,0 +1,5 @@ +var class_intelli_render_settings = +[ + [ "IntelliRenderSettings", "class_intelli_render_settings.html#a4a01de6e5e8e516a7eae51d6f1f66529", null ], + [ "getFastRenderer", "class_intelli_render_settings.html#a5a74e7d7ed3a2e944883dddbe8bbf5e8", null ] +]; \ No newline at end of file diff --git a/docs/html/class_intelli_render_settings_a5a74e7d7ed3a2e944883dddbe8bbf5e8_icgraph.dot b/docs/html/class_intelli_render_settings_a5a74e7d7ed3a2e944883dddbe8bbf5e8_icgraph.dot new file mode 100644 index 0000000..f413d45 --- /dev/null +++ b/docs/html/class_intelli_render_settings_a5a74e7d7ed3a2e944883dddbe8bbf5e8_icgraph.dot @@ -0,0 +1,12 @@ +digraph "IntelliRenderSettings::getFastRenderer" +{ + // LATEX_PDF_SIZE + edge [fontname="Helvetica",fontsize="10",labelfontname="Helvetica",labelfontsize="10"]; + node [fontname="Helvetica",fontsize="10",shape=record]; + rankdir="RL"; + Node1 [label="IntelliRenderSettings\l::getFastRenderer",height=0.2,width=0.4,color="black", fillcolor="grey75", style="filled", fontcolor="black",tooltip="The getfastRenderer gets the value of the flag for the fastRenderer setting."]; + Node1 -> Node2 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node2 [label="PaintingArea::addLayer",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_painting_area.html#a6e9207612cef104d39013564696fe989",tooltip="The addLayer adds a layer to the current project/ painting area."]; + Node2 -> Node3 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node3 [label="PaintingArea::PaintingArea",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_painting_area.html#a4fa0ec23e78cc59f28c823584c721460",tooltip="PaintingArea is the constructor of the PaintingArea class, which initiates the working environment."]; +} diff --git a/docs/html/class_intelli_shaped_image-members.html b/docs/html/class_intelli_shaped_image-members.html index b2a018f..05f9fec 100644 --- a/docs/html/class_intelli_shaped_image-members.html +++ b/docs/html/class_intelli_shaped_image-members.html @@ -97,19 +97,25 @@ $(document).ready(function(){initNavTree('class_intelli_shaped_image.html','');} drawPixel(const QPoint &p1, const QColor &color)IntelliImagevirtual drawPlain(const QColor &color)IntelliImagevirtual drawPoint(const QPoint &p1, const QColor &color, const int &penWidth)IntelliImagevirtual - getDeepCopy() overrideIntelliShapedImagevirtual - getDisplayable(const QSize &displaySize, int alpha=255) overrideIntelliShapedImagevirtual - getDisplayable(int alpha=255) overrideIntelliShapedImagevirtual + fastRendererIntelliImageprotected + getDeepCopy() overrideIntelliShapedImagevirtual + getDisplayable(const QSize &displaySize, int alpha=255) overrideIntelliShapedImagevirtual + getDisplayable(int alpha=255) overrideIntelliShapedImagevirtual + getImageData()IntelliImagevirtual getPixelColor(QPoint &point)IntelliImagevirtual getPolygonData() overrideIntelliShapedImageinlinevirtual - imageDataIntelliImageprotected - IntelliImage(int weight, int height)IntelliImage - IntelliRasterImage(int weight, int height)IntelliRasterImage - IntelliShapedImage(int weight, int height)IntelliShapedImage - loadImage(const QString &fileName)IntelliImagevirtual + getTypeOfImage()IntelliImageinlinevirtual + imageDataIntelliImageprotected + ImageType enum nameIntelliImage + IntelliImage(int width, int height, bool fastRendererOn)IntelliImage + IntelliRasterImage(int width, int height, bool fastRendererOn)IntelliRasterImage + IntelliShapedImage(int width, int height, bool fastRendererOn)IntelliShapedImage + loadImage(const QString &filePath)IntelliImagevirtual polygonDataIntelliShapedImageprotected resizeImage(QImage *image, const QSize &newSize)IntelliImageprotected setPolygon(const std::vector< QPoint > &polygonData) overrideIntelliShapedImagevirtual + TypeOfImageIntelliImageprotected + updateRendererSetting(bool fastRendererOn)IntelliImagevirtual ~IntelliImage()=0IntelliImagepure virtual ~IntelliRasterImage() overrideIntelliRasterImagevirtual ~IntelliShapedImage() overrideIntelliShapedImagevirtual diff --git a/docs/html/class_intelli_shaped_image.html b/docs/html/class_intelli_shaped_image.html index 6fed452..ce5eda4 100644 --- a/docs/html/class_intelli_shaped_image.html +++ b/docs/html/class_intelli_shaped_image.html @@ -102,19 +102,19 @@ $(document).ready(function(){initNavTree('class_intelli_shaped_image.html','');}
Inheritance diagram for IntelliShapedImage:
-
Inheritance graph
-
[legend]
-
-Collaboration diagram for IntelliShapedImage:
-
-
Collaboration graph
-
[legend]
+
+ + +IntelliRasterImage +IntelliImage + +
- - - + + + @@ -134,16 +134,16 @@ Public Member Functions - - - + + + - - - + + + @@ -159,12 +159,20 @@ Public Member Functions - - - + + + + + + + + + + +

Public Member Functions

 IntelliShapedImage (int weight, int height)
 The Construcor of the IntelliShapedImage. Given the Image dimensions. More...
 
 IntelliShapedImage (int width, int height, bool fastRendererOn)
 The Construcor of the IntelliShapedImage. Given the Image dimensions. More...
 
virtual ~IntelliShapedImage () override
 An Destructor. More...
 
 A function that sets the data of the visible Polygon. More...
 
- Public Member Functions inherited from IntelliRasterImage
 IntelliRasterImage (int weight, int height)
 The Construcor of the IntelliRasterImage. Given the Image dimensions. More...
 
 IntelliRasterImage (int width, int height, bool fastRendererOn)
 The Construcor of the IntelliRasterImage. Given the Image dimensions. More...
 
virtual ~IntelliRasterImage () override
 An Destructor. More...
 
- Public Member Functions inherited from IntelliImage
 IntelliImage (int weight, int height)
 The Construcor of the IntelliImage. Given the Image dimensions. More...
 
 IntelliImage (int width, int height, bool fastRendererOn)
 The Construcor of the IntelliImage. Given the Image dimensions. More...
 
virtual ~IntelliImage ()=0
 An Abstract Destructor. More...
 
virtual void drawPlain (const QColor &color)
 A function that clears the whole image in a given Color. More...
 
virtual bool loadImage (const QString &fileName)
 A function that loads and sclaes an image to the fitting dimensions. More...
 
virtual ImageType getTypeOfImage ()
 
virtual bool loadImage (const QString &filePath)
 A function that loads and sclaes an image to the fitting dimensions. More...
 
virtual QColor getPixelColor (QPoint &point)
 A function that returns the pixelcolor at a certain point. More...
 
virtual void updateRendererSetting (bool fastRendererOn)
 updateRendererSetting updates the existing image format to the new format. More...
 
virtual QImage getImageData ()
 getImageData returns the data of the current image. More...
 
@@ -175,9 +183,21 @@ Protected Attributes + + + + + +

Protected Attributes

QImage imageData
 The underlying image data. More...
 
ImageType TypeOfImage
 The Type, an Image is. More...
 
bool fastRenderer
 fastRenderer is the flag that represents the usage of 8bit pictures. More...
 
+ + + + @@ -185,10 +205,10 @@ Additional Inherited Members

Detailed Description

The IntelliShapedImage manages a Shapedimage.

-

Definition at line 11 of file IntelliShapedImage.h.

+

Definition at line 10 of file IntelliShapedImage.h.

Constructor & Destructor Documentation

- -

◆ IntelliShapedImage()

+ +

◆ IntelliShapedImage()

@@ -197,13 +217,19 @@ Additional Inherited Members
- + - + + + + + + + @@ -216,18 +242,14 @@ Additional Inherited Members

The Construcor of the IntelliShapedImage. Given the Image dimensions.

Parameters

Additional Inherited Members

- Public Types inherited from IntelliImage
enum  ImageType { ImageType::RASTERIMAGE, +ImageType::SHAPEDIMAGE + }
 The Types, which an Image can be. More...
 
- Protected Member Functions inherited from IntelliImage
void resizeImage (QImage *image, const QSize &newSize)
 
IntelliShapedImage::IntelliShapedImage ( int weight, width,
int height height,
bool fastRendererOn 
- + +
weight- The weight of the Image.
width- The width of the Image.
height- The height of the Image.
fastRendererOn- Represents the flag for 8bit picture handelling.

Definition at line 7 of file IntelliShapedImage.cpp.

-
-Here is the caller graph for this function:
-
-
-
@@ -256,7 +278,7 @@ Here is the caller graph for this function:

An Destructor.

-

Definition at line 11 of file IntelliShapedImage.cpp.

+

Definition at line 13 of file IntelliShapedImage.cpp.

@@ -289,12 +311,7 @@ Here is the caller graph for this function:

Reimplemented from IntelliRasterImage.

-

Definition at line 19 of file IntelliShapedImage.cpp.

-
-Here is the call graph for this function:
-
-
-
+

Definition at line 21 of file IntelliShapedImage.cpp.

@@ -344,12 +361,7 @@ Here is the call graph for this function:

Reimplemented from IntelliRasterImage.

-

Definition at line 54 of file IntelliShapedImage.cpp.

-
-Here is the caller graph for this function:
-
-
-
+

Definition at line 67 of file IntelliShapedImage.cpp.

@@ -388,12 +400,7 @@ Here is the caller graph for this function:

Reimplemented from IntelliRasterImage.

-

Definition at line 15 of file IntelliShapedImage.cpp.

-
-Here is the call graph for this function:
-
-
-
+

Definition at line 17 of file IntelliShapedImage.cpp.

@@ -463,17 +470,7 @@ Here is the call graph for this function:

Reimplemented from IntelliRasterImage.

-

Definition at line 66 of file IntelliShapedImage.cpp.

-
-Here is the call graph for this function:
-
-
-
-
-Here is the caller graph for this function:
-
-
-
+

Definition at line 85 of file IntelliShapedImage.cpp.

@@ -500,7 +497,7 @@ Here is the caller graph for this function:

The Vertices of The Polygon. Needs to be a planar Polygon.

-

Definition at line 28 of file IntelliShapedImage.h.

+

Definition at line 27 of file IntelliShapedImage.h.

diff --git a/docs/html/class_intelli_shaped_image.js b/docs/html/class_intelli_shaped_image.js index dead858..c8654d6 100644 --- a/docs/html/class_intelli_shaped_image.js +++ b/docs/html/class_intelli_shaped_image.js @@ -1,6 +1,6 @@ var class_intelli_shaped_image = [ - [ "IntelliShapedImage", "class_intelli_shaped_image.html#a0f834c3f255baeb50c98ef335a6d0ea9", null ], + [ "IntelliShapedImage", "class_intelli_shaped_image.html#ae2e612a1fa52d7f878b34a7a7022d8e9", null ], [ "~IntelliShapedImage", "class_intelli_shaped_image.html#a43d63d8a814852d377ee2030658fbab9", null ], [ "getDeepCopy", "class_intelli_shaped_image.html#aed0b31e0fa771104399d1f5ff39a0337", null ], [ "getDisplayable", "class_intelli_shaped_image.html#a68cf374247c16f07fd84d50e4cd05630", null ], diff --git a/docs/html/class_intelli_shaped_image.png b/docs/html/class_intelli_shaped_image.png new file mode 100644 index 0000000000000000000000000000000000000000..d255aa9989cccd4740e2bbcd09f96ece1469bd74 GIT binary patch literal 742 zcmeAS@N?(olHy`uVBq!ia0vp^r9j-l!3-qdT?_F9QW60^A+G=b{|AY@dpCRboC!b{ z7#}!rfUoz!Qy`b4B*-tA0jLNBuAT}pVqjn@^>lFzsbG9N_w}XK3OugjvnB8UpSZuu z(a|B-ztQ;emYX3e8$3F`>ffurA6w!1N@uZGkoVvIknnxCd?(pmTz=)rG?l$eqgPFy zeS7c3;G9JM*Einm{;|f^Q|r~dSt(aMJ9VqQj`z(|nfg`Xns!#rfzH$4SA2FaQjKQg zf4)`SGj*@z>(Cu9`&B}}F6G&7b=`~CU6SwV*Yl=2p6_3sO#T!5DmUx)k*euY)z3YG z*#Amgt$tt4{lM9m;jU?mm9O#!=N0-d7~V*{^1r$vka5d!8MHejX z;kppy#+sqInCZ^x>i4_3^*!gNhInSJ{0MS>&OZ;YHzmr_)0a$|7kGH>=S}g8c7^+R z$3!bHKYT5X`{xt$^LNBJ_U(>0S?%Pj;n%gcsy^0CXG4+F{u8UkvZqST&7SjZ?kv@3 zTh182@;aFm#kTFnqq`|rYU>t?=_l*XeZBGZk@eGlzIeWBmYv;ot*<|K-n;VQnb1#B zW0_O0H?^s*Z2fe6hw0ZTx8gR6{d0fotL~ZmH96${-uJo<{HBa0*9Bgg^d8__xNiaT zhU69Yp@)I~&|1v2WlA7p6s9)|^qkS)>}a@P6{}zJ1hMlh=0Yy zYt5?m3-_&iUY1`VBev%{Z_eSu{C6zx4OAsL_ZpinTryYpS&2pQz4~vmOO)Al`nG!A z-Es2BiPa{{pOrhtu6{n}UhN~hIaZH7*1RZ}%@%v-TC(tw%p9HX)$<;5Z7o~Zn)=Ro z&h>&nd)l&M_Dz-QTh{tX>$<^#*;VOjuWmQb`oFrg^Q*_&y)PN8UL0R>&hmP6{lV=9 Vb8Z)uUI8Xb22WQ%mvv4FO#rQFW&{8L literal 0 HcmV?d00001 diff --git a/docs/html/class_intelli_shaped_image__coll__graph.dot b/docs/html/class_intelli_shaped_image__coll__graph.dot index 580bcac..1c59a61 100644 --- a/docs/html/class_intelli_shaped_image__coll__graph.dot +++ b/docs/html/class_intelli_shaped_image__coll__graph.dot @@ -5,7 +5,7 @@ digraph "IntelliShapedImage" node [fontname="Helvetica",fontsize="10",shape=record]; Node1 [label="IntelliShapedImage",height=0.2,width=0.4,color="black", fillcolor="grey75", style="filled", fontcolor="black",tooltip="The IntelliShapedImage manages a Shapedimage."]; Node2 -> Node1 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node2 [label="IntelliRasterImage",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_raster_image.html",tooltip="The IntelliRasterImage manages a Rasterimage."]; + Node2 [label="IntelliRasterImage",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_raster_image.html",tooltip="The IntelliRasterImage manages a RASTERIMAGE."]; Node3 -> Node2 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; Node3 [label="IntelliImage",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_image.html",tooltip="An abstract class which manages the basic IntelliImage operations."]; } diff --git a/docs/html/class_intelli_shaped_image__inherit__graph.dot b/docs/html/class_intelli_shaped_image__inherit__graph.dot index 580bcac..1c59a61 100644 --- a/docs/html/class_intelli_shaped_image__inherit__graph.dot +++ b/docs/html/class_intelli_shaped_image__inherit__graph.dot @@ -5,7 +5,7 @@ digraph "IntelliShapedImage" node [fontname="Helvetica",fontsize="10",shape=record]; Node1 [label="IntelliShapedImage",height=0.2,width=0.4,color="black", fillcolor="grey75", style="filled", fontcolor="black",tooltip="The IntelliShapedImage manages a Shapedimage."]; Node2 -> Node1 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node2 [label="IntelliRasterImage",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_raster_image.html",tooltip="The IntelliRasterImage manages a Rasterimage."]; + Node2 [label="IntelliRasterImage",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_raster_image.html",tooltip="The IntelliRasterImage manages a RASTERIMAGE."]; Node3 -> Node2 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; Node3 [label="IntelliImage",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_image.html",tooltip="An abstract class which manages the basic IntelliImage operations."]; } diff --git a/docs/html/class_intelli_shaped_image_a4b69d75de7a3b85032482982f249458e_cgraph.dot b/docs/html/class_intelli_shaped_image_a4b69d75de7a3b85032482982f249458e_cgraph.dot index 2523308..55bb17d 100644 --- a/docs/html/class_intelli_shaped_image_a4b69d75de7a3b85032482982f249458e_cgraph.dot +++ b/docs/html/class_intelli_shaped_image_a4b69d75de7a3b85032482982f249458e_cgraph.dot @@ -6,5 +6,5 @@ digraph "IntelliShapedImage::setPolygon" rankdir="LR"; Node1 [label="IntelliShapedImage\l::setPolygon",height=0.2,width=0.4,color="black", fillcolor="grey75", style="filled", fontcolor="black",tooltip="A function that sets the data of the visible Polygon."]; Node1 -> Node2 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node2 [label="IntelliHelper::calculate\lTriangles",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$namespace_intelli_helper.html#a214dc3624ba4562a03dc922e3dd7b617",tooltip="A function to split a polygon in its spanning traingles by using Meisters Theorem of graph theory by ..."]; + Node2 [label="IntelliTriangulation\l::calculateTriangles",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$namespace_intelli_triangulation.html#acdaf1ed598e868b25e9e06d580da32e5",tooltip="A function to split a polygon in its spanning traingles by using Meisters Theorem of graph theory by ..."]; } diff --git a/docs/html/class_intelli_shaped_image_ae2e612a1fa52d7f878b34a7a7022d8e9_icgraph.dot b/docs/html/class_intelli_shaped_image_ae2e612a1fa52d7f878b34a7a7022d8e9_icgraph.dot new file mode 100644 index 0000000..8d5448d --- /dev/null +++ b/docs/html/class_intelli_shaped_image_ae2e612a1fa52d7f878b34a7a7022d8e9_icgraph.dot @@ -0,0 +1,10 @@ +digraph "IntelliShapedImage::IntelliShapedImage" +{ + // LATEX_PDF_SIZE + edge [fontname="Helvetica",fontsize="10",labelfontname="Helvetica",labelfontsize="10"]; + node [fontname="Helvetica",fontsize="10",shape=record]; + rankdir="RL"; + Node1 [label="IntelliShapedImage\l::IntelliShapedImage",height=0.2,width=0.4,color="black", fillcolor="grey75", style="filled", fontcolor="black",tooltip="The Construcor of the IntelliShapedImage. Given the Image dimensions."]; + Node1 -> Node2 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node2 [label="IntelliShapedImage\l::getDeepCopy",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_shaped_image.html#aed0b31e0fa771104399d1f5ff39a0337",tooltip="A function that copys all that returns a [allocated] Image."]; +} diff --git a/docs/html/class_intelli_shaped_image_aed0b31e0fa771104399d1f5ff39a0337_cgraph.dot b/docs/html/class_intelli_shaped_image_aed0b31e0fa771104399d1f5ff39a0337_cgraph.dot index 37121ac..62314e1 100644 --- a/docs/html/class_intelli_shaped_image_aed0b31e0fa771104399d1f5ff39a0337_cgraph.dot +++ b/docs/html/class_intelli_shaped_image_aed0b31e0fa771104399d1f5ff39a0337_cgraph.dot @@ -6,9 +6,9 @@ digraph "IntelliShapedImage::getDeepCopy" rankdir="LR"; Node1 [label="IntelliShapedImage\l::getDeepCopy",height=0.2,width=0.4,color="black", fillcolor="grey75", style="filled", fontcolor="black",tooltip="A function that copys all that returns a [allocated] Image."]; Node1 -> Node2 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node2 [label="IntelliShapedImage\l::IntelliShapedImage",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_shaped_image.html#a0f834c3f255baeb50c98ef335a6d0ea9",tooltip="The Construcor of the IntelliShapedImage. Given the Image dimensions."]; + Node2 [label="IntelliShapedImage\l::IntelliShapedImage",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_shaped_image.html#ae2e612a1fa52d7f878b34a7a7022d8e9",tooltip="The Construcor of the IntelliShapedImage. Given the Image dimensions."]; Node1 -> Node3 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; Node3 [label="IntelliShapedImage\l::setPolygon",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_shaped_image.html#a4b69d75de7a3b85032482982f249458e",tooltip="A function that sets the data of the visible Polygon."]; Node3 -> Node4 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node4 [label="IntelliHelper::calculate\lTriangles",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$namespace_intelli_helper.html#a214dc3624ba4562a03dc922e3dd7b617",tooltip="A function to split a polygon in its spanning traingles by using Meisters Theorem of graph theory by ..."]; + Node4 [label="IntelliTriangulation\l::calculateTriangles",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$namespace_intelli_triangulation.html#acdaf1ed598e868b25e9e06d580da32e5",tooltip="A function to split a polygon in its spanning traingles by using Meisters Theorem of graph theory by ..."]; } diff --git a/docs/html/class_intelli_tool-members.html b/docs/html/class_intelli_tool-members.html index 8072345..c8b42e9 100644 --- a/docs/html/class_intelli_tool-members.html +++ b/docs/html/class_intelli_tool-members.html @@ -93,19 +93,24 @@ $(document).ready(function(){initNavTree('class_intelli_tool.html','');});

This is the complete list of members for IntelliTool, including all inherited members.

- - - - - - - - - - - - - + + + + + + + + + + + + + + + + + +
ActiveIntelliToolprotected
AreaIntelliToolprotected
CanvasIntelliToolprotected
colorPickerIntelliToolprotected
drawingIntelliToolprotected
IntelliTool(PaintingArea *Area, IntelliColorPicker *colorPicker)IntelliTool
onMouseLeftPressed(int x, int y)IntelliToolvirtual
onMouseLeftReleased(int x, int y)IntelliToolvirtual
onMouseMoved(int x, int y)IntelliToolvirtual
onMouseRightPressed(int x, int y)IntelliToolvirtual
onMouseRightReleased(int x, int y)IntelliToolvirtual
onWheelScrolled(int value)IntelliToolvirtual
~IntelliTool()=0IntelliToolpure virtual
activeLayerIntelliToolprotected
ActiveTypeIntelliToolprotected
AreaIntelliToolprotected
CanvasIntelliToolprotected
colorPickerIntelliToolprotected
getIsDrawing()IntelliTool
getTooltype()IntelliTool
IntelliTool(PaintingArea *Area, IntelliColorPicker *colorPicker, IntelliToolsettings *Toolsettings)IntelliTool
isDrawingIntelliToolprotected
onMouseLeftPressed(int x, int y)IntelliToolvirtual
onMouseLeftReleased(int x, int y)IntelliToolvirtual
onMouseMoved(int x, int y)IntelliToolvirtual
onMouseRightPressed(int x, int y)IntelliToolvirtual
onMouseRightReleased(int x, int y)IntelliToolvirtual
onWheelScrolled(int value)IntelliToolvirtual
ToolsettingsIntelliToolprotected
Tooltype enum nameIntelliTool
~IntelliTool()=0IntelliToolpure virtual
diff --git a/docs/html/class_intelli_tool.html b/docs/html/class_intelli_tool.html index a5f8194..58e4dd1 100644 --- a/docs/html/class_intelli_tool.html +++ b/docs/html/class_intelli_tool.html @@ -87,6 +87,7 @@ $(document).ready(function(){initNavTree('class_intelli_tool.html','');});
@@ -102,19 +103,39 @@ $(document).ready(function(){initNavTree('class_intelli_tool.html','');});
Inheritance diagram for IntelliTool:
-
Inheritance graph
-
[legend]
-
-Collaboration diagram for IntelliTool:
-
-
Collaboration graph
-
[legend]
+
+ + +IntelliToolCircle +IntelliToolFloodFill +IntelliToolLine +IntelliToolPen +IntelliToolPlainTool +IntelliToolPolygon +IntelliToolRectangle + +
+ + + +

+Public Types

enum  Tooltype {
+  Tooltype::CIRCLE, +Tooltype::FLOODFILL, +Tooltype::LINE, +Tooltype::PEN, +
+  Tooltype::PLAIN, +Tooltype::POLYGON, +Tooltype::RECTANGLE +
+ }
 
- - - + + + @@ -136,32 +157,74 @@ Public Member Functions + + + +

Public Member Functions

 IntelliTool (PaintingArea *Area, IntelliColorPicker *colorPicker)
 A constructor setting the general Painting Area and colorPicker. More...
 
 IntelliTool (PaintingArea *Area, IntelliColorPicker *colorPicker, IntelliToolsettings *Toolsettings)
 A constructor setting the general Painting Area and colorPicker. More...
 
virtual ~IntelliTool ()=0
 An abstract Destructor. More...
 
virtual void onMouseMoved (int x, int y)
 A function managing the mouse moved event. Call this in child classes! More...
 
Tooltype getTooltype ()
 
bool getIsDrawing ()
 
+ + - - - + + + + + - - - + + +

Protected Attributes

PaintingAreaArea
 A pointer to the general PaintingArea to interact with. More...
 
Tooltype ActiveType
 
IntelliColorPickercolorPicker
 A pointer to the IntelliColorPicker of the PaintingArea to interact with, and get the colors. More...
 
LayerObjectActive
 A pointer to the underlying active Layer, do not work on this. This is used for data grabbing or previews. More...
 
IntelliToolsettingsToolsettings
 
LayerObjectactiveLayer
 A pointer to the underlying active Layer, do not work on this. This is used for data grabbing or previews. More...
 
LayerObjectCanvas
 A pointer to the drawing canvas of the tool, work on this. More...
 
bool drawing = false
 A flag checking if the user is currently drawing or not. More...
 
bool isDrawing = false
 A flag checking if the user is currently drawing or not. More...
 

Detailed Description

An abstract class that manages the basic events, like mouse clicks or scrolls events.

-

Definition at line 13 of file IntelliTool.h.

-

Constructor & Destructor Documentation

- -

◆ IntelliTool()

+

Definition at line 14 of file IntelliTool.h.

+

Member Enumeration Documentation

+ +

◆ Tooltype

+ +
+
+ + + + + +
+ + + + +
enum IntelliTool::Tooltype
+
+strong
+
+ + + + + + + + +
Enumerator
CIRCLE 
FLOODFILL 
LINE 
PEN 
PLAIN 
POLYGON 
RECTANGLE 
+ +

Definition at line 16 of file IntelliTool.h.

+ +
+
+

Constructor & Destructor Documentation

+ +

◆ IntelliTool()

@@ -176,7 +239,13 @@ Protected Attributes IntelliColorPicker *  - colorPicker  + colorPicker, + + + + + IntelliToolsettings *  + Toolsettings  @@ -224,11 +293,49 @@ Protected Attributes

An abstract Destructor.

-

Definition at line 10 of file IntelliTool.cpp.

+

Definition at line 11 of file IntelliTool.cpp.

Member Function Documentation

+ +

◆ getIsDrawing()

+ +
+
+ + + + + + + +
bool IntelliTool::getIsDrawing ()
+
+ +

Definition at line 89 of file IntelliTool.cpp.

+ +
+
+ +

◆ getTooltype()

+ +
+
+ + + + + + + +
IntelliTool::Tooltype IntelliTool::getTooltype ()
+
+ +

Definition at line 85 of file IntelliTool.cpp.

+ +
+

◆ onMouseLeftPressed()

@@ -272,19 +379,9 @@ Protected Attributes -

Reimplemented in IntelliToolLine, IntelliToolCircle, IntelliToolPolygon, IntelliToolRectangle, IntelliToolPen, IntelliToolFloodFill, and IntelliToolPlainTool.

+

Reimplemented in IntelliToolPolygon, IntelliToolCircle, IntelliToolRectangle, IntelliToolLine, IntelliToolPen, IntelliToolFloodFill, and IntelliToolPlainTool.

-

Definition at line 25 of file IntelliTool.cpp.

-
-Here is the call graph for this function:
-
-
-
-
-Here is the caller graph for this function:
-
-
-
+

Definition at line 26 of file IntelliTool.cpp.

@@ -331,19 +428,9 @@ Here is the caller graph for this function: -

Reimplemented in IntelliToolLine, IntelliToolCircle, IntelliToolPolygon, IntelliToolRectangle, IntelliToolPen, IntelliToolFloodFill, and IntelliToolPlainTool.

+

Reimplemented in IntelliToolPolygon, IntelliToolCircle, IntelliToolRectangle, IntelliToolLine, IntelliToolPen, IntelliToolFloodFill, and IntelliToolPlainTool.

-

Definition at line 32 of file IntelliTool.cpp.

-
-Here is the call graph for this function:
-
-
-
-
-Here is the caller graph for this function:
-
-
-
+

Definition at line 33 of file IntelliTool.cpp.

@@ -390,19 +477,9 @@ Here is the caller graph for this function: -

Reimplemented in IntelliToolPolygon, IntelliToolLine, IntelliToolCircle, IntelliToolRectangle, IntelliToolPen, IntelliToolFloodFill, and IntelliToolPlainTool.

+

Reimplemented in IntelliToolPolygon, IntelliToolCircle, IntelliToolRectangle, IntelliToolLine, IntelliToolPen, IntelliToolFloodFill, and IntelliToolPlainTool.

-

Definition at line 41 of file IntelliTool.cpp.

-
-Here is the call graph for this function:
-
-
-
-
-Here is the caller graph for this function:
-
-
-
+

Definition at line 42 of file IntelliTool.cpp.

@@ -449,14 +526,9 @@ Here is the caller graph for this function: -

Reimplemented in IntelliToolPolygon, IntelliToolLine, IntelliToolCircle, IntelliToolRectangle, IntelliToolPen, IntelliToolFloodFill, and IntelliToolPlainTool.

+

Reimplemented in IntelliToolPolygon, IntelliToolCircle, IntelliToolRectangle, IntelliToolLine, IntelliToolPen, IntelliToolFloodFill, and IntelliToolPlainTool.

-

Definition at line 14 of file IntelliTool.cpp.

-
-Here is the caller graph for this function:
-
-
-
+

Definition at line 15 of file IntelliTool.cpp.

@@ -503,14 +575,9 @@ Here is the caller graph for this function: -

Reimplemented in IntelliToolPolygon, IntelliToolLine, IntelliToolCircle, IntelliToolRectangle, IntelliToolPen, IntelliToolFloodFill, and IntelliToolPlainTool.

+

Reimplemented in IntelliToolPolygon, IntelliToolCircle, IntelliToolRectangle, IntelliToolLine, IntelliToolPen, IntelliToolFloodFill, and IntelliToolPlainTool.

-

Definition at line 21 of file IntelliTool.cpp.

-
-Here is the caller graph for this function:
-
-
-
+

Definition at line 22 of file IntelliTool.cpp.

@@ -546,20 +613,15 @@ Here is the caller graph for this function: -

Reimplemented in IntelliToolPolygon, IntelliToolLine, IntelliToolCircle, IntelliToolRectangle, IntelliToolPen, IntelliToolFloodFill, and IntelliToolPlainTool.

+

Reimplemented in IntelliToolPolygon, IntelliToolCircle, IntelliToolRectangle, IntelliToolLine, IntelliToolPen, IntelliToolFloodFill, and IntelliToolPlainTool.

-

Definition at line 46 of file IntelliTool.cpp.

-
-Here is the caller graph for this function:
-
-
-
+

Definition at line 47 of file IntelliTool.cpp.

Member Data Documentation

- -

◆ Active

+ +

◆ activeLayer

@@ -568,7 +630,7 @@ Here is the caller graph for this function:
- +
LayerObject* IntelliTool::ActiveLayerObject* IntelliTool::activeLayer
@@ -580,7 +642,31 @@ Here is the caller graph for this function:

A pointer to the underlying active Layer, do not work on this. This is used for data grabbing or previews.

-

Definition at line 43 of file IntelliTool.h.

+

Definition at line 58 of file IntelliTool.h.

+ + + + +

◆ ActiveType

+ +
+
+ + + + + +
+ + + + +
Tooltype IntelliTool::ActiveType
+
+protected
+
+ +

Definition at line 46 of file IntelliTool.h.

@@ -606,7 +692,7 @@ Here is the caller graph for this function:

A pointer to the general PaintingArea to interact with.

-

Definition at line 33 of file IntelliTool.h.

+

Definition at line 44 of file IntelliTool.h.

@@ -632,7 +718,7 @@ Here is the caller graph for this function:

A pointer to the drawing canvas of the tool, work on this.

-

Definition at line 48 of file IntelliTool.h.

+

Definition at line 63 of file IntelliTool.h.

@@ -658,12 +744,12 @@ Here is the caller graph for this function:

A pointer to the IntelliColorPicker of the PaintingArea to interact with, and get the colors.

-

Definition at line 38 of file IntelliTool.h.

+

Definition at line 51 of file IntelliTool.h.

- -

◆ drawing

+ +

◆ isDrawing

@@ -672,7 +758,7 @@ Here is the caller graph for this function:
- +
bool IntelliTool::drawing = falsebool IntelliTool::isDrawing = false
@@ -684,6 +770,30 @@ Here is the caller graph for this function:

A flag checking if the user is currently drawing or not.

+

Definition at line 68 of file IntelliTool.h.

+ + + + +

◆ Toolsettings

+ +
+
+ + + + + +
+ + + + +
IntelliToolsettings* IntelliTool::Toolsettings
+
+protected
+
+

Definition at line 53 of file IntelliTool.h.

diff --git a/docs/html/class_intelli_tool.js b/docs/html/class_intelli_tool.js index 66bfe15..bbfbb28 100644 --- a/docs/html/class_intelli_tool.js +++ b/docs/html/class_intelli_tool.js @@ -1,16 +1,29 @@ var class_intelli_tool = [ - [ "IntelliTool", "class_intelli_tool.html#a346dd55d489fced38e7bb46f9168af91", null ], + [ "Tooltype", "class_intelli_tool.html#a3fbd2584566b3cefcf3c070ae0b69d8f", [ + [ "CIRCLE", "class_intelli_tool.html#a3fbd2584566b3cefcf3c070ae0b69d8fa0af50777920c1401ab975cab64c4d491", null ], + [ "FLOODFILL", "class_intelli_tool.html#a3fbd2584566b3cefcf3c070ae0b69d8fa526904ea67131c56718f9882518b5d93", null ], + [ "LINE", "class_intelli_tool.html#a3fbd2584566b3cefcf3c070ae0b69d8fa17b8ef2c330f1430e00c9de5469fc7e7", null ], + [ "PEN", "class_intelli_tool.html#a3fbd2584566b3cefcf3c070ae0b69d8fad3fa1aa45b9fe56e1fc1b558d8ed6678", null ], + [ "PLAIN", "class_intelli_tool.html#a3fbd2584566b3cefcf3c070ae0b69d8faf62eb0bf5e5c72e80983fbbac1cb70e5", null ], + [ "POLYGON", "class_intelli_tool.html#a3fbd2584566b3cefcf3c070ae0b69d8faecdc92bf56d960b73b02ee40125758bc", null ], + [ "RECTANGLE", "class_intelli_tool.html#a3fbd2584566b3cefcf3c070ae0b69d8fa8e8e58fe94ab307a826e087028a7c01a", null ] + ] ], + [ "IntelliTool", "class_intelli_tool.html#a08ef094271ce6248b42f888472463526", null ], [ "~IntelliTool", "class_intelli_tool.html#a57fb1b27d364c9e3696eb928b75fa9f2", null ], + [ "getIsDrawing", "class_intelli_tool.html#a0020fad2e26315d5c4d96dbc95d1dceb", null ], + [ "getTooltype", "class_intelli_tool.html#aae2a11c5bae4973ed827c60e0c1352b1", null ], [ "onMouseLeftPressed", "class_intelli_tool.html#a34b7ef1dde96b94a0ce450a25ae1778c", null ], [ "onMouseLeftReleased", "class_intelli_tool.html#a906a2575c16c8a33cb2a5197f8d8cc5b", null ], [ "onMouseMoved", "class_intelli_tool.html#ac10e20414cd8855a2f9b103fb6408639", null ], [ "onMouseRightPressed", "class_intelli_tool.html#a1e6aa68ac5f3c2ca02319e5ef3f0c966", null ], [ "onMouseRightReleased", "class_intelli_tool.html#a16189b00307c6d7e89f28198f54404b0", null ], [ "onWheelScrolled", "class_intelli_tool.html#a4dccfd4460255ccb866f336406a33574", null ], - [ "Active", "class_intelli_tool.html#a13512e95d21a9934ecb36d73b118c25f", null ], + [ "activeLayer", "class_intelli_tool.html#aedccdad01b2bc6ec84fad3582251ff5d", null ], + [ "ActiveType", "class_intelli_tool.html#a631388999f36013628e13b9de87a6f7b", null ], [ "Area", "class_intelli_tool.html#ab4c2698a0f9f25fb6639ec760d2d0289", null ], [ "Canvas", "class_intelli_tool.html#a144d469cc03584f501194529a1b53c77", null ], [ "colorPicker", "class_intelli_tool.html#ae2e0ac394611a361ab4ef2fe55c03fef", null ], - [ "drawing", "class_intelli_tool.html#af256de16e9825922d20a23d11617b51b", null ] + [ "isDrawing", "class_intelli_tool.html#a555aa8a74992327f740dd69b3bb0ccca", null ], + [ "Toolsettings", "class_intelli_tool.html#a55f6b45b416b7d790fa8bc09603bf67f", null ] ]; \ No newline at end of file diff --git a/docs/html/class_intelli_tool.png b/docs/html/class_intelli_tool.png new file mode 100644 index 0000000000000000000000000000000000000000..c7ba7c67b5332d9d4118f314e90957fd1cf36cc1 GIT binary patch literal 1396 zcmZ`(X;4#F6ixs&ff1Pug9dc)Y6{;+rE-uK<_ob#P?X6|{s zy^&!{ZCBc2Fqoy3UF7{3j5QzNy*O)da%K3n;N!G6{6MJLYz9!P)d~bfc>vAthK2_F zoQ7d=#ij0#q+)=RWj%j-U<(Gbz?wq-^1xZF=H>WR!FGJ8yffmLLGzV8Cs@|267b<) zq*cX~Q?i%zpRQI(@x{KPZgtNB9Dc28m`vkf+~D8~m`6N5er-^of@p*LD_4xeT1_3x za?BNmn+)tC*fl#h!Z!bdB2OUWa2WgG< zcJe+oqD3S%(#$pfu3t+ScGbPNk+H2Qg!J}pDSAQTW>PwY6vukvIQ1nn4Vr+t;z~cv@Zv^~}BSpgWxPj_AamH|=~eTDLUd57~5 z8-;dTsaMWH z4ux~-g}H+IH#w+8+=;f>48+I+-u0fmWmBOXm{r(AgUgRl>9T$K4vPzB6*srh=}kHC zntN~0oL5rm{>9o9xXlOYgkzH=t!TUiS-E;6P3HIRVUz4wvES*NReJM?L zetAu^2jtsfsv;!&I(e(Y7~1p4IzT7FlPFw{7%9u-uDpqf`^f16DLw1j=iu3!41~Lz z-avJJg7vURqj^VTVz)4|m1NS8+K%%qBOqNLJSN0}L7|$#D2WR{!rzdtE4XNg8|U=h m=0hJgF9~q~1C+6kW5zJuYMFUMvkSp55<>}%B;O4_^20yY7NI== literal 0 HcmV?d00001 diff --git a/docs/html/class_intelli_tool__coll__graph.dot b/docs/html/class_intelli_tool__coll__graph.dot index 39aefd0..67bf4ac 100644 --- a/docs/html/class_intelli_tool__coll__graph.dot +++ b/docs/html/class_intelli_tool__coll__graph.dot @@ -8,10 +8,14 @@ digraph "IntelliTool" Node2 [label="PaintingArea",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_painting_area.html",tooltip="The PaintingArea class manages the methods and stores information about the current painting area,..."]; Node3 -> Node2 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; Node3 [label="QWidget",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; - Node4 -> Node1 [dir="back",color="darkorchid3",fontsize="10",style="dashed",label=" colorPicker" ,fontname="Helvetica"]; + Node4 -> Node2 [dir="back",color="darkorchid3",fontsize="10",style="dashed",label=" colorPicker" ,fontname="Helvetica"]; Node4 [label="IntelliColorPicker",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_color_picker.html",tooltip="The IntelliColorPicker manages the selected colors for one whole project."]; - Node5 -> Node1 [dir="back",color="darkorchid3",fontsize="10",style="dashed",label=" Canvas\nActive" ,fontname="Helvetica"]; - Node5 [label="LayerObject",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$struct_layer_object.html",tooltip="The LayerObject struct holds all the information needed to construct a layer."]; - Node6 -> Node5 [dir="back",color="darkorchid3",fontsize="10",style="dashed",label=" image" ,fontname="Helvetica"]; - Node6 [label="IntelliImage",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_image.html",tooltip="An abstract class which manages the basic IntelliImage operations."]; + Node5 -> Node2 [dir="back",color="darkorchid3",fontsize="10",style="dashed",label=" Toolsettings" ,fontname="Helvetica"]; + Node5 [label="IntelliToolsettings",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_toolsettings.html",tooltip=" "]; + Node5 -> Node1 [dir="back",color="darkorchid3",fontsize="10",style="dashed",label=" Toolsettings" ,fontname="Helvetica"]; + Node4 -> Node1 [dir="back",color="darkorchid3",fontsize="10",style="dashed",label=" colorPicker" ,fontname="Helvetica"]; + Node6 -> Node1 [dir="back",color="darkorchid3",fontsize="10",style="dashed",label=" Canvas\nactiveLayer" ,fontname="Helvetica"]; + Node6 [label="LayerObject",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$struct_layer_object.html",tooltip="The LayerObject struct holds all the information needed to construct a layer."]; + Node7 -> Node6 [dir="back",color="darkorchid3",fontsize="10",style="dashed",label=" image" ,fontname="Helvetica"]; + Node7 [label="IntelliImage",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_image.html",tooltip="An abstract class which manages the basic IntelliImage operations."]; } diff --git a/docs/html/class_intelli_tool_a0020fad2e26315d5c4d96dbc95d1dceb_icgraph.dot b/docs/html/class_intelli_tool_a0020fad2e26315d5c4d96dbc95d1dceb_icgraph.dot new file mode 100644 index 0000000..5e6ffe0 --- /dev/null +++ b/docs/html/class_intelli_tool_a0020fad2e26315d5c4d96dbc95d1dceb_icgraph.dot @@ -0,0 +1,14 @@ +digraph "IntelliTool::getIsDrawing" +{ + // LATEX_PDF_SIZE + edge [fontname="Helvetica",fontsize="10",labelfontname="Helvetica",labelfontsize="10"]; + node [fontname="Helvetica",fontsize="10",shape=record]; + rankdir="RL"; + Node1 [label="IntelliTool::getIsDrawing",height=0.2,width=0.4,color="black", fillcolor="grey75", style="filled", fontcolor="black",tooltip=" "]; + Node1 -> Node2 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node2 [label="PaintingArea::moveActive\lLayer",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_painting_area.html#ae05f6893fb44bfcb34018573a609cd1a",tooltip="The moveActiveLayer moves the active layer to a specific position in the layer stack."]; + Node1 -> Node3 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node3 [label="PaintingArea::movePosition\lActive",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_painting_area.html#ac6d089f4357b22d9a9906fd4771de3e7",tooltip="The movePositionActive method moves the active layer to certain position."]; + Node1 -> Node4 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node4 [label="PaintingArea::slotActivate\lLayer",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_painting_area.html#a71ac281e0de263208d4a3b9de74258ec",tooltip="The slotActivateLayer method handles the event of selecting one layer as active."]; +} diff --git a/docs/html/class_intelli_tool_a16189b00307c6d7e89f28198f54404b0_icgraph.dot b/docs/html/class_intelli_tool_a16189b00307c6d7e89f28198f54404b0_icgraph.dot index f5999ab..db4d50f 100644 --- a/docs/html/class_intelli_tool_a16189b00307c6d7e89f28198f54404b0_icgraph.dot +++ b/docs/html/class_intelli_tool_a16189b00307c6d7e89f28198f54404b0_icgraph.dot @@ -14,11 +14,11 @@ digraph "IntelliTool::onMouseRightReleased" Node1 -> Node5 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; Node5 [label="IntelliToolPen::onMouseRight\lReleased",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_pen.html#abf8562e8cd2da586afdf4d47b3a4ff13",tooltip="A function managing the right click released of a mouse."]; Node1 -> Node6 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node6 [label="IntelliToolRectangle\l::onMouseRightReleased",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_rectangle.html#ad43f653256a6516b9398f82054be0d7f",tooltip="A function managing the right click released of a mouse."]; + Node6 [label="IntelliToolLine::onMouse\lRightReleased",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_line.html#a6214918cba5753f89d97de4559a2b9b2",tooltip="A function managing the right click released of a mouse."]; Node1 -> Node7 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node7 [label="IntelliToolCircle::\lonMouseRightReleased",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_circle.html#aca07540f2f7ccb3d2c0b84890c1afc4c",tooltip="A function managing the right click released of a mouse."]; + Node7 [label="IntelliToolRectangle\l::onMouseRightReleased",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_rectangle.html#ad43f653256a6516b9398f82054be0d7f",tooltip="A function managing the right click released of a mouse."]; Node1 -> Node8 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node8 [label="IntelliToolLine::onMouse\lRightReleased",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_line.html#a6214918cba5753f89d97de4559a2b9b2",tooltip="A function managing the right click released of a mouse."]; + Node8 [label="IntelliToolCircle::\lonMouseRightReleased",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_circle.html#aca07540f2f7ccb3d2c0b84890c1afc4c",tooltip="A function managing the right click released of a mouse."]; Node1 -> Node9 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; Node9 [label="IntelliToolPolygon\l::onMouseRightReleased",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_polygon.html#a47cad87cd02b128b02dc929713bd1d1b",tooltip="A function managing the right click released of a mouse."]; } diff --git a/docs/html/class_intelli_tool_a1e6aa68ac5f3c2ca02319e5ef3f0c966_icgraph.dot b/docs/html/class_intelli_tool_a1e6aa68ac5f3c2ca02319e5ef3f0c966_icgraph.dot index d2bf790..a6e1859 100644 --- a/docs/html/class_intelli_tool_a1e6aa68ac5f3c2ca02319e5ef3f0c966_icgraph.dot +++ b/docs/html/class_intelli_tool_a1e6aa68ac5f3c2ca02319e5ef3f0c966_icgraph.dot @@ -8,17 +8,33 @@ digraph "IntelliTool::onMouseRightPressed" Node1 -> Node2 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; Node2 [label="PaintingArea::mousePress\lEvent",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_painting_area.html#abfe445f8d9b70ae42bfeda874127dd15",tooltip=" "]; Node1 -> Node3 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node3 [label="IntelliToolPlainTool\l::onMouseRightPressed",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_plain_tool.html#acb0c46e16d2c09370a2244a936de38b1",tooltip="A function managing the right click pressed of a mouse. Resetting the current fill."]; + Node3 [label="IntelliToolPolygon\l::onMouseLeftPressed",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_polygon.html#ad5d3b741be6d0647a9cdc9da2cb8bc3d",tooltip="A function managing the left click pressed of a mouse. Setting polygon points."]; Node1 -> Node4 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node4 [label="IntelliToolFloodFill\l::onMouseRightPressed",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_flood_fill.html#ada0f7154d119102410a55038763a17e4",tooltip="A function managing the right click pressed of a mouse. Clearing the canvas."]; + Node4 [label="IntelliToolPlainTool\l::onMouseRightPressed",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_plain_tool.html#acb0c46e16d2c09370a2244a936de38b1",tooltip="A function managing the right click pressed of a mouse. Resetting the current fill."]; Node1 -> Node5 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node5 [label="IntelliToolPen::onMouseRight\lPressed",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_pen.html#a1751e3864a0d36ef42ca55021cae73ce",tooltip="A function managing the right click pressed of a mouse. Resetting the current draw."]; + Node5 [label="IntelliToolFloodFill\l::onMouseRightPressed",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_flood_fill.html#ada0f7154d119102410a55038763a17e4",tooltip="A function managing the right click pressed of a mouse. Clearing the canvas."]; Node1 -> Node6 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node6 [label="IntelliToolRectangle\l::onMouseRightPressed",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_rectangle.html#a480c6804a4963c5a1c3f7ef84b63c1a8",tooltip="A function managing the right click pressed of a mouse.Resetting the current draw."]; + Node6 [label="IntelliToolPen::onMouseRight\lPressed",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_pen.html#a1751e3864a0d36ef42ca55021cae73ce",tooltip="A function managing the right click pressed of a mouse. Resetting the current draw."]; Node1 -> Node7 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node7 [label="IntelliToolCircle::\lonMouseRightPressed",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_circle.html#a29d7b9ed4960e6fe1f31ff620363e429",tooltip="A function managing the right click pressed of a mouse. Clearing the canvas layer."]; + Node7 [label="IntelliToolLine::onMouse\lRightPressed",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_line.html#a6cce59f3017936214b10b47252a898a3",tooltip="A function managing the right click pressed of a mouse. Clearing the canvas."]; Node1 -> Node8 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node8 [label="IntelliToolLine::onMouse\lRightPressed",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_line.html#a6cce59f3017936214b10b47252a898a3",tooltip="A function managing the right click pressed of a mouse. Clearing the canvas."]; + Node8 [label="IntelliToolRectangle\l::onMouseRightPressed",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_rectangle.html#a480c6804a4963c5a1c3f7ef84b63c1a8",tooltip="A function managing the right click pressed of a mouse.Resetting the current draw."]; Node1 -> Node9 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node9 [label="IntelliToolPolygon\l::onMouseRightPressed",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_polygon.html#aa36b012b48311c36e7cd6771a5081427",tooltip="A function managing the right click pressed of a mouse. Resetting the current fill."]; + Node9 [label="IntelliToolCircle::\lonMouseRightPressed",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_circle.html#a29d7b9ed4960e6fe1f31ff620363e429",tooltip="A function managing the right click pressed of a mouse. Clearing the canvas layer."]; + Node1 -> Node10 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node10 [label="IntelliToolPolygon\l::onMouseRightPressed",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_polygon.html#aa36b012b48311c36e7cd6771a5081427",tooltip="A function managing the right click pressed of a mouse. Resetting the current fill."]; + Node1 -> Node11 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node11 [label="IntelliToolCircle::\l~IntelliToolCircle",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_circle.html#a7a03b65b95d7b5d72e6a92c95f068954",tooltip="A Destructor."]; + Node1 -> Node12 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node12 [label="IntelliToolFloodFill\l::~IntelliToolFloodFill",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_flood_fill.html#a83b1bd8be0cbb32cdf61a9597ec849ba",tooltip="A Destructor."]; + Node1 -> Node13 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node13 [label="IntelliToolLine::~Intelli\lToolLine",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_line.html#acb600b0f4e9225ebce2937c2b7abb4c2",tooltip="An abstract Destructor."]; + Node1 -> Node14 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node14 [label="IntelliToolPen::~Intelli\lToolPen",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_pen.html#ac77a025515d0fed6954556fe2b444818",tooltip="A Destructor."]; + Node1 -> Node15 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node15 [label="IntelliToolPlainTool\l::~IntelliToolPlainTool",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_plain_tool.html#a91fe568be05c075814d67440472bb658",tooltip="A Destructor."]; + Node1 -> Node16 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node16 [label="IntelliToolPolygon\l::~IntelliToolPolygon",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_polygon.html#a087cbf2254010989df6106a357471499",tooltip="A Destructor."]; + Node1 -> Node17 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node17 [label="IntelliToolRectangle\l::~IntelliToolRectangle",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_rectangle.html#a7dc1463e726a21255e6297241dc71fb1",tooltip="A Destructor."]; } diff --git a/docs/html/class_intelli_tool_a34b7ef1dde96b94a0ce450a25ae1778c_icgraph.dot b/docs/html/class_intelli_tool_a34b7ef1dde96b94a0ce450a25ae1778c_icgraph.dot index 2c9eec4..eb66746 100644 --- a/docs/html/class_intelli_tool_a34b7ef1dde96b94a0ce450a25ae1778c_icgraph.dot +++ b/docs/html/class_intelli_tool_a34b7ef1dde96b94a0ce450a25ae1778c_icgraph.dot @@ -14,11 +14,11 @@ digraph "IntelliTool::onMouseLeftPressed" Node1 -> Node5 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; Node5 [label="IntelliToolPen::onMouseLeft\lPressed",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_pen.html#a8ff40aef6d38eb55af31a19322429205",tooltip="A function managing the left click pressed of a mouse. Starting the drawing procedure."]; Node1 -> Node6 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node6 [label="IntelliToolRectangle\l::onMouseLeftPressed",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_rectangle.html#ae03c307ccf66cbe3fd59e3657712368d",tooltip="A function managing the left click pressed of a mouse. Setting the originCorner and draws a rectangle..."]; + Node6 [label="IntelliToolLine::onMouse\lLeftPressed",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_line.html#a155d676a5f98311217eb095be4759846",tooltip="A function managing the left click pressed of a mouse. Sets the starting point of the line."]; Node1 -> Node7 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node7 [label="IntelliToolCircle::\lonMouseLeftPressed",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_circle.html#ae883b8ae833c78a8867e626c600f9639",tooltip="A function managing the left click pressed of a mouse. Sets the middle point of the cricle."]; + Node7 [label="IntelliToolRectangle\l::onMouseLeftPressed",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_rectangle.html#ae03c307ccf66cbe3fd59e3657712368d",tooltip="A function managing the left click pressed of a mouse. Setting the originCorner and draws a rectangle..."]; Node1 -> Node8 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node8 [label="IntelliToolPolygon\l::onMouseLeftPressed",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_polygon.html#ad5d3b741be6d0647a9cdc9da2cb8bc3d",tooltip="A function managing the left click pressed of a mouse. Setting polygon points."]; + Node8 [label="IntelliToolCircle::\lonMouseLeftPressed",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_circle.html#ae883b8ae833c78a8867e626c600f9639",tooltip="A function managing the left click pressed of a mouse. Sets the middle point of the cricle."]; Node1 -> Node9 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node9 [label="IntelliToolLine::onMouse\lLeftPressed",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_line.html#a155d676a5f98311217eb095be4759846",tooltip="A function managing the left click pressed of a mouse. Sets the starting point of the line."]; + Node9 [label="IntelliToolPolygon\l::onMouseLeftPressed",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_polygon.html#ad5d3b741be6d0647a9cdc9da2cb8bc3d",tooltip="A function managing the left click pressed of a mouse. Setting polygon points."]; } diff --git a/docs/html/class_intelli_tool_a4dccfd4460255ccb866f336406a33574_icgraph.dot b/docs/html/class_intelli_tool_a4dccfd4460255ccb866f336406a33574_icgraph.dot index 5120fd4..313d57e 100644 --- a/docs/html/class_intelli_tool_a4dccfd4460255ccb866f336406a33574_icgraph.dot +++ b/docs/html/class_intelli_tool_a4dccfd4460255ccb866f336406a33574_icgraph.dot @@ -12,11 +12,11 @@ digraph "IntelliTool::onWheelScrolled" Node1 -> Node4 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; Node4 [label="IntelliToolPen::onWheelScrolled",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_pen.html#afe3626ddff440ab125f4a2465c45427a",tooltip="A function managing the scroll event. Changing penWidth relativ to value."]; Node1 -> Node5 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node5 [label="IntelliToolRectangle\l::onWheelScrolled",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_rectangle.html#a445c53a56e859f970e59f5036e221e0c",tooltip="A function managing the scroll event.Changing edgeWidth relativ to value."]; + Node5 [label="IntelliToolLine::onWheel\lScrolled",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_line.html#aaf1d686e1ec43f41b5186ccfd806b125",tooltip="A function managing the scroll event. Changing the lineWidth relative to value."]; Node1 -> Node6 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node6 [label="IntelliToolCircle::\lonWheelScrolled",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_circle.html#ae2d9b0fb6695c184c4cb507a5fb75506",tooltip="A function managing the scroll event. Changing the edge Width relative to value."]; + Node6 [label="IntelliToolRectangle\l::onWheelScrolled",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_rectangle.html#a445c53a56e859f970e59f5036e221e0c",tooltip="A function managing the scroll event.Changing edgeWidth relativ to value."]; Node1 -> Node7 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node7 [label="IntelliToolLine::onWheel\lScrolled",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_line.html#aaf1d686e1ec43f41b5186ccfd806b125",tooltip="A function managing the scroll event. Changing the lineWidth relative to value."]; + Node7 [label="IntelliToolCircle::\lonWheelScrolled",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_circle.html#ae2d9b0fb6695c184c4cb507a5fb75506",tooltip="A function managing the scroll event. Changing the edge Width relative to value."]; Node1 -> Node8 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; Node8 [label="IntelliToolPolygon\l::onWheelScrolled",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_polygon.html#a713103300c9f023d64d9eec5ac05dd17",tooltip="A function managing the scroll event. CHanging the lineWidth relative to value."]; Node1 -> Node9 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; diff --git a/docs/html/class_intelli_tool_a906a2575c16c8a33cb2a5197f8d8cc5b_icgraph.dot b/docs/html/class_intelli_tool_a906a2575c16c8a33cb2a5197f8d8cc5b_icgraph.dot index a8fd3c5..e2cce2e 100644 --- a/docs/html/class_intelli_tool_a906a2575c16c8a33cb2a5197f8d8cc5b_icgraph.dot +++ b/docs/html/class_intelli_tool_a906a2575c16c8a33cb2a5197f8d8cc5b_icgraph.dot @@ -14,11 +14,11 @@ digraph "IntelliTool::onMouseLeftReleased" Node1 -> Node5 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; Node5 [label="IntelliToolPen::onMouseLeft\lReleased",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_pen.html#abda7a22b9766fa4ad254324a53cab94d",tooltip="A function managing the left click released of a mouse. Merging the drawing to the active layer."]; Node1 -> Node6 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node6 [label="IntelliToolRectangle\l::onMouseLeftReleased",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_rectangle.html#a94460e3ff1c19e80bde922c55f53cc43",tooltip="A function managing the left click released of a mouse. Merging the draw to the active layer."]; + Node6 [label="IntelliToolLine::onMouse\lLeftReleased",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_line.html#ac93f76ff20a1c111a403b298bab02482",tooltip="A function managing the left click released of a mouse."]; Node1 -> Node7 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node7 [label="IntelliToolCircle::\lonMouseLeftReleased",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_circle.html#ad8e438ec997c57262b5efc2db4cee1a3",tooltip="A function managing the left click released of a mouse."]; + Node7 [label="IntelliToolRectangle\l::onMouseLeftReleased",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_rectangle.html#a94460e3ff1c19e80bde922c55f53cc43",tooltip="A function managing the left click released of a mouse. Merging the draw to the active layer."]; Node1 -> Node8 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node8 [label="IntelliToolPolygon\l::onMouseLeftReleased",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_polygon.html#a4e1473ff408ae2e11cf6a43f6f575f21",tooltip="A function managing the left click released of a mouse. Merging the fill to the active layer."]; + Node8 [label="IntelliToolCircle::\lonMouseLeftReleased",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_circle.html#ad8e438ec997c57262b5efc2db4cee1a3",tooltip="A function managing the left click released of a mouse."]; Node1 -> Node9 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node9 [label="IntelliToolLine::onMouse\lLeftReleased",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_line.html#ac93f76ff20a1c111a403b298bab02482",tooltip="A function managing the left click released of a mouse."]; + Node9 [label="IntelliToolPolygon\l::onMouseLeftReleased",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_polygon.html#a4e1473ff408ae2e11cf6a43f6f575f21",tooltip="A function managing the left click released of a mouse. Merging the fill to the active layer."]; } diff --git a/docs/html/class_intelli_tool_ac10e20414cd8855a2f9b103fb6408639_icgraph.dot b/docs/html/class_intelli_tool_ac10e20414cd8855a2f9b103fb6408639_icgraph.dot index 965ae9b..fd39439 100644 --- a/docs/html/class_intelli_tool_ac10e20414cd8855a2f9b103fb6408639_icgraph.dot +++ b/docs/html/class_intelli_tool_ac10e20414cd8855a2f9b103fb6408639_icgraph.dot @@ -14,11 +14,11 @@ digraph "IntelliTool::onMouseMoved" Node1 -> Node5 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; Node5 [label="IntelliToolPen::onMouseMoved",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_pen.html#a58d1d636497b630647ce0c4d652737c2",tooltip="A function managing the mouse moved event. To draw the line."]; Node1 -> Node6 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node6 [label="IntelliToolRectangle\l::onMouseMoved",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_rectangle.html#a4b5931071e21eb6949ffe357315e408b",tooltip="A function managing the mouse moved event.Drawing a rectangle to currrent mouse position."]; + Node6 [label="IntelliToolLine::onMouse\lMoved",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_line.html#abc6324ef0778823fe7e35aef8ae37f9b",tooltip="A function managing the mouse moved event. Drawing a Line from the startpoint to the current mouse po..."]; Node1 -> Node7 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node7 [label="IntelliToolCircle::\lonMouseMoved",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_circle.html#a90ee58c5390a86afc75c14ca79b91d7b",tooltip="A function managing the mouse moved event. Draws a circle with radius of eulerian norm of mouse posit..."]; + Node7 [label="IntelliToolRectangle\l::onMouseMoved",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_rectangle.html#a4b5931071e21eb6949ffe357315e408b",tooltip="A function managing the mouse moved event.Drawing a rectangle to currrent mouse position."]; Node1 -> Node8 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node8 [label="IntelliToolLine::onMouse\lMoved",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_line.html#abc6324ef0778823fe7e35aef8ae37f9b",tooltip="A function managing the mouse moved event. Drawing a Line from the startpoint to the current mouse po..."]; + Node8 [label="IntelliToolCircle::\lonMouseMoved",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_circle.html#a90ee58c5390a86afc75c14ca79b91d7b",tooltip="A function managing the mouse moved event. Draws a circle with radius of eulerian norm of mouse posit..."]; Node1 -> Node9 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; Node9 [label="IntelliToolPolygon\l::onMouseMoved",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_polygon.html#a0e3a1135f04c73c159137ae219a38922",tooltip="A function managing the mouse moved event."]; } diff --git a/docs/html/class_intelli_tool_circle-members.html b/docs/html/class_intelli_tool_circle-members.html index b783ca6..5e0d837 100644 --- a/docs/html/class_intelli_tool_circle-members.html +++ b/docs/html/class_intelli_tool_circle-members.html @@ -93,21 +93,26 @@ $(document).ready(function(){initNavTree('class_intelli_tool_circle.html','');})

This is the complete list of members for IntelliToolCircle, including all inherited members.

- - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + +
ActiveIntelliToolprotected
AreaIntelliToolprotected
CanvasIntelliToolprotected
colorPickerIntelliToolprotected
drawingIntelliToolprotected
IntelliTool(PaintingArea *Area, IntelliColorPicker *colorPicker)IntelliTool
IntelliToolCircle(PaintingArea *Area, IntelliColorPicker *colorPicker)IntelliToolCircle
onMouseLeftPressed(int x, int y) overrideIntelliToolCirclevirtual
onMouseLeftReleased(int x, int y) overrideIntelliToolCirclevirtual
onMouseMoved(int x, int y) overrideIntelliToolCirclevirtual
onMouseRightPressed(int x, int y) overrideIntelliToolCirclevirtual
onMouseRightReleased(int x, int y) overrideIntelliToolCirclevirtual
onWheelScrolled(int value) overrideIntelliToolCirclevirtual
~IntelliTool()=0IntelliToolpure virtual
~IntelliToolCircle() overrideIntelliToolCirclevirtual
activeLayerIntelliToolprotected
ActiveTypeIntelliToolprotected
AreaIntelliToolprotected
CanvasIntelliToolprotected
colorPickerIntelliToolprotected
getIsDrawing()IntelliTool
getTooltype()IntelliTool
IntelliTool(PaintingArea *Area, IntelliColorPicker *colorPicker, IntelliToolsettings *Toolsettings)IntelliTool
IntelliToolCircle(PaintingArea *Area, IntelliColorPicker *colorPicker, IntelliToolsettings *Toolsettings)IntelliToolCircle
isDrawingIntelliToolprotected
onMouseLeftPressed(int x, int y) overrideIntelliToolCirclevirtual
onMouseLeftReleased(int x, int y) overrideIntelliToolCirclevirtual
onMouseMoved(int x, int y) overrideIntelliToolCirclevirtual
onMouseRightPressed(int x, int y) overrideIntelliToolCirclevirtual
onMouseRightReleased(int x, int y) overrideIntelliToolCirclevirtual
onWheelScrolled(int value) overrideIntelliToolCirclevirtual
ToolsettingsIntelliToolprotected
Tooltype enum nameIntelliTool
~IntelliTool()=0IntelliToolpure virtual
~IntelliToolCircle() overrideIntelliToolCirclevirtual
diff --git a/docs/html/class_intelli_tool_circle.html b/docs/html/class_intelli_tool_circle.html index 9462b65..e6ce048 100644 --- a/docs/html/class_intelli_tool_circle.html +++ b/docs/html/class_intelli_tool_circle.html @@ -101,19 +101,18 @@ $(document).ready(function(){initNavTree('class_intelli_tool_circle.html','');})
Inheritance diagram for IntelliToolCircle:
-
Inheritance graph
-
[legend]
-
-Collaboration diagram for IntelliToolCircle:
-
-
Collaboration graph
-
[legend]
+
+ + +IntelliTool + +
- - - + + + @@ -136,39 +135,60 @@ Public Member Functions - - - + + + + + + +

Public Member Functions

 IntelliToolCircle (PaintingArea *Area, IntelliColorPicker *colorPicker)
 A constructor setting the general paintingArea and colorPicker. And reading in the inner alpha and edgeWidth. More...
 
 IntelliToolCircle (PaintingArea *Area, IntelliColorPicker *colorPicker, IntelliToolsettings *Toolsettings)
 A constructor setting the general paintingArea and colorPicker. And reading in the inner alpha and edgeWidth. More...
 
virtual ~IntelliToolCircle () override
 A Destructor. More...
 
 A function managing the mouse moved event. Draws a circle with radius of eulerian norm of mouse position and the middle point. More...
 
- Public Member Functions inherited from IntelliTool
 IntelliTool (PaintingArea *Area, IntelliColorPicker *colorPicker)
 A constructor setting the general Painting Area and colorPicker. More...
 
 IntelliTool (PaintingArea *Area, IntelliColorPicker *colorPicker, IntelliToolsettings *Toolsettings)
 A constructor setting the general Painting Area and colorPicker. More...
 
virtual ~IntelliTool ()=0
 An abstract Destructor. More...
 
Tooltype getTooltype ()
 
bool getIsDrawing ()
 
+ + + + + - - - + + + + + - - - + + +

Additional Inherited Members

- Public Types inherited from IntelliTool
enum  Tooltype {
+  Tooltype::CIRCLE, +Tooltype::FLOODFILL, +Tooltype::LINE, +Tooltype::PEN, +
+  Tooltype::PLAIN, +Tooltype::POLYGON, +Tooltype::RECTANGLE +
+ }
 
- Protected Attributes inherited from IntelliTool
PaintingAreaArea
 A pointer to the general PaintingArea to interact with. More...
 
Tooltype ActiveType
 
IntelliColorPickercolorPicker
 A pointer to the IntelliColorPicker of the PaintingArea to interact with, and get the colors. More...
 
LayerObjectActive
 A pointer to the underlying active Layer, do not work on this. This is used for data grabbing or previews. More...
 
IntelliToolsettingsToolsettings
 
LayerObjectactiveLayer
 A pointer to the underlying active Layer, do not work on this. This is used for data grabbing or previews. More...
 
LayerObjectCanvas
 A pointer to the drawing canvas of the tool, work on this. More...
 
bool drawing = false
 A flag checking if the user is currently drawing or not. More...
 
bool isDrawing = false
 A flag checking if the user is currently drawing or not. More...
 

Detailed Description

The IntelliToolCircle class represents a tool to draw a circle.

Definition at line 10 of file IntelliToolCircle.h.

Constructor & Destructor Documentation

- -

◆ IntelliToolCircle()

+ +

◆ IntelliToolCircle()

@@ -183,7 +203,13 @@ Additional Inherited Members IntelliColorPicker *  - colorPicker  + colorPicker, + + + + + IntelliToolsettings *  + Toolsettings  @@ -231,7 +257,7 @@ Additional Inherited Members

A Destructor.

-

Definition at line 12 of file IntelliToolCircle.cpp.

+

Definition at line 11 of file IntelliToolCircle.cpp.

@@ -281,12 +307,7 @@ Additional Inherited Members

Reimplemented from IntelliTool.

-

Definition at line 59 of file IntelliToolCircle.cpp.

-
-Here is the call graph for this function:
-
-
-
+

Definition at line 58 of file IntelliToolCircle.cpp.

@@ -335,12 +356,7 @@ Here is the call graph for this function:

Reimplemented from IntelliTool.

-

Definition at line 67 of file IntelliToolCircle.cpp.

-
-Here is the call graph for this function:
-
-
-
+

Definition at line 66 of file IntelliToolCircle.cpp.

@@ -389,12 +405,7 @@ Here is the call graph for this function:

Reimplemented from IntelliTool.

-

Definition at line 79 of file IntelliToolCircle.cpp.

-
-Here is the call graph for this function:
-
-
-
+

Definition at line 75 of file IntelliToolCircle.cpp.

@@ -443,12 +454,7 @@ Here is the call graph for this function:

Reimplemented from IntelliTool.

-

Definition at line 51 of file IntelliToolCircle.cpp.

-
-Here is the call graph for this function:
-
-
-
+

Definition at line 50 of file IntelliToolCircle.cpp.

@@ -497,12 +503,7 @@ Here is the call graph for this function:

Reimplemented from IntelliTool.

-

Definition at line 55 of file IntelliToolCircle.cpp.

-
-Here is the call graph for this function:
-
-
-
+

Definition at line 54 of file IntelliToolCircle.cpp.

@@ -540,12 +541,7 @@ Here is the call graph for this function:

Reimplemented from IntelliTool.

-

Definition at line 71 of file IntelliToolCircle.cpp.

-
-Here is the call graph for this function:
-
-
-
+

Definition at line 70 of file IntelliToolCircle.cpp.

diff --git a/docs/html/class_intelli_tool_circle.js b/docs/html/class_intelli_tool_circle.js index bf59fab..b0989fb 100644 --- a/docs/html/class_intelli_tool_circle.js +++ b/docs/html/class_intelli_tool_circle.js @@ -1,6 +1,6 @@ var class_intelli_tool_circle = [ - [ "IntelliToolCircle", "class_intelli_tool_circle.html#a9b185b9d327f8602d0b7f667b8d1d32a", null ], + [ "IntelliToolCircle", "class_intelli_tool_circle.html#a835327842fb71cb6a505e260ac5b69c8", null ], [ "~IntelliToolCircle", "class_intelli_tool_circle.html#a7a03b65b95d7b5d72e6a92c95f068954", null ], [ "onMouseLeftPressed", "class_intelli_tool_circle.html#ae883b8ae833c78a8867e626c600f9639", null ], [ "onMouseLeftReleased", "class_intelli_tool_circle.html#ad8e438ec997c57262b5efc2db4cee1a3", null ], diff --git a/docs/html/class_intelli_tool_circle.png b/docs/html/class_intelli_tool_circle.png new file mode 100644 index 0000000000000000000000000000000000000000..f828daa358dc34d70800f86622c538ad1619e1e9 GIT binary patch literal 425 zcmeAS@N?(olHy`uVBq!ia0vp^$v_;y!3-p=xUH7}DTx4|5ZC|z{{xxt-o2YWd(H$P z3ycpOIKbC?;3<&HQ4-`A%m7pb0#{Fk7%?y~T6nrRhEy=Vo%=BFumTTTKmW@2|4(F3 zzS7u}ch1N-xA^G7rfz+{clB9oO(j;Tv`*sl{Pb~ipV7Z(I0{*n4#Yt4F93^j_AWll704%xb z%x?X<)qMWGob0sC!f*Q2iiJ0w*gaus-s>IDGB#Vuybg^kdK3F;SKq Node3 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; Node4 [label="QWidget",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; - Node5 -> Node2 [dir="back",color="darkorchid3",fontsize="10",style="dashed",label=" colorPicker" ,fontname="Helvetica"]; + Node5 -> Node3 [dir="back",color="darkorchid3",fontsize="10",style="dashed",label=" colorPicker" ,fontname="Helvetica"]; Node5 [label="IntelliColorPicker",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_color_picker.html",tooltip="The IntelliColorPicker manages the selected colors for one whole project."]; - Node6 -> Node2 [dir="back",color="darkorchid3",fontsize="10",style="dashed",label=" Canvas\nActive" ,fontname="Helvetica"]; - Node6 [label="LayerObject",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$struct_layer_object.html",tooltip="The LayerObject struct holds all the information needed to construct a layer."]; - Node7 -> Node6 [dir="back",color="darkorchid3",fontsize="10",style="dashed",label=" image" ,fontname="Helvetica"]; - Node7 [label="IntelliImage",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_image.html",tooltip="An abstract class which manages the basic IntelliImage operations."]; + Node6 -> Node3 [dir="back",color="darkorchid3",fontsize="10",style="dashed",label=" Toolsettings" ,fontname="Helvetica"]; + Node6 [label="IntelliToolsettings",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_toolsettings.html",tooltip=" "]; + Node6 -> Node2 [dir="back",color="darkorchid3",fontsize="10",style="dashed",label=" Toolsettings" ,fontname="Helvetica"]; + Node5 -> Node2 [dir="back",color="darkorchid3",fontsize="10",style="dashed",label=" colorPicker" ,fontname="Helvetica"]; + Node7 -> Node2 [dir="back",color="darkorchid3",fontsize="10",style="dashed",label=" Canvas\nactiveLayer" ,fontname="Helvetica"]; + Node7 [label="LayerObject",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$struct_layer_object.html",tooltip="The LayerObject struct holds all the information needed to construct a layer."]; + Node8 -> Node7 [dir="back",color="darkorchid3",fontsize="10",style="dashed",label=" image" ,fontname="Helvetica"]; + Node8 [label="IntelliImage",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_image.html",tooltip="An abstract class which manages the basic IntelliImage operations."]; } diff --git a/docs/html/class_intelli_tool_circle_a7a03b65b95d7b5d72e6a92c95f068954_cgraph.dot b/docs/html/class_intelli_tool_circle_a7a03b65b95d7b5d72e6a92c95f068954_cgraph.dot new file mode 100644 index 0000000..3edbae4 --- /dev/null +++ b/docs/html/class_intelli_tool_circle_a7a03b65b95d7b5d72e6a92c95f068954_cgraph.dot @@ -0,0 +1,10 @@ +digraph "IntelliToolCircle::~IntelliToolCircle" +{ + // LATEX_PDF_SIZE + edge [fontname="Helvetica",fontsize="10",labelfontname="Helvetica",labelfontsize="10"]; + node [fontname="Helvetica",fontsize="10",shape=record]; + rankdir="LR"; + Node1 [label="IntelliToolCircle::\l~IntelliToolCircle",height=0.2,width=0.4,color="black", fillcolor="grey75", style="filled", fontcolor="black",tooltip="A Destructor."]; + Node1 -> Node2 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node2 [label="IntelliTool::onMouseRight\lPressed",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool.html#a1e6aa68ac5f3c2ca02319e5ef3f0c966",tooltip="A function managing the right click Pressed of a Mouse. Constructing the Canvas to draw on...."]; +} diff --git a/docs/html/class_intelli_tool_circle_ae2d9b0fb6695c184c4cb507a5fb75506_cgraph.dot b/docs/html/class_intelli_tool_circle_ae2d9b0fb6695c184c4cb507a5fb75506_cgraph.dot index b82aca3..784caf2 100644 --- a/docs/html/class_intelli_tool_circle_ae2d9b0fb6695c184c4cb507a5fb75506_cgraph.dot +++ b/docs/html/class_intelli_tool_circle_ae2d9b0fb6695c184c4cb507a5fb75506_cgraph.dot @@ -6,5 +6,9 @@ digraph "IntelliToolCircle::onWheelScrolled" rankdir="LR"; Node1 [label="IntelliToolCircle::\lonWheelScrolled",height=0.2,width=0.4,color="black", fillcolor="grey75", style="filled", fontcolor="black",tooltip="A function managing the scroll event. Changing the edge Width relative to value."]; Node1 -> Node2 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node2 [label="IntelliTool::onWheelScrolled",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool.html#a4dccfd4460255ccb866f336406a33574",tooltip="A function managing the scroll event. A positive value means scrolling outwards. Call this in child c..."]; + Node2 [label="IntelliToolsettings\l::getLineWidth",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_toolsettings.html#a68528dd3bad8f39ba19fa6b12a4e415a",tooltip=" "]; + Node1 -> Node3 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node3 [label="IntelliTool::onWheelScrolled",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool.html#a4dccfd4460255ccb866f336406a33574",tooltip="A function managing the scroll event. A positive value means scrolling outwards. Call this in child c..."]; + Node1 -> Node4 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node4 [label="IntelliToolsettings\l::setLineWidth",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_toolsettings.html#a906d37de6ee94b433d53fe3e598cc9fa",tooltip=" "]; } diff --git a/docs/html/class_intelli_tool_flood_fill-members.html b/docs/html/class_intelli_tool_flood_fill-members.html index a3929a0..468a95e 100644 --- a/docs/html/class_intelli_tool_flood_fill-members.html +++ b/docs/html/class_intelli_tool_flood_fill-members.html @@ -93,21 +93,26 @@ $(document).ready(function(){initNavTree('class_intelli_tool_flood_fill.html',''

This is the complete list of members for IntelliToolFloodFill, including all inherited members.

- - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + +
ActiveIntelliToolprotected
AreaIntelliToolprotected
CanvasIntelliToolprotected
colorPickerIntelliToolprotected
drawingIntelliToolprotected
IntelliTool(PaintingArea *Area, IntelliColorPicker *colorPicker)IntelliTool
IntelliToolFloodFill(PaintingArea *Area, IntelliColorPicker *colorPicker)IntelliToolFloodFill
onMouseLeftPressed(int x, int y) overrideIntelliToolFloodFillvirtual
onMouseLeftReleased(int x, int y) overrideIntelliToolFloodFillvirtual
onMouseMoved(int x, int y) overrideIntelliToolFloodFillvirtual
onMouseRightPressed(int x, int y) overrideIntelliToolFloodFillvirtual
onMouseRightReleased(int x, int y) overrideIntelliToolFloodFillvirtual
onWheelScrolled(int value) overrideIntelliToolFloodFillvirtual
~IntelliTool()=0IntelliToolpure virtual
~IntelliToolFloodFill() overrideIntelliToolFloodFillvirtual
activeLayerIntelliToolprotected
ActiveTypeIntelliToolprotected
AreaIntelliToolprotected
CanvasIntelliToolprotected
colorPickerIntelliToolprotected
getIsDrawing()IntelliTool
getTooltype()IntelliTool
IntelliTool(PaintingArea *Area, IntelliColorPicker *colorPicker, IntelliToolsettings *Toolsettings)IntelliTool
IntelliToolFloodFill(PaintingArea *Area, IntelliColorPicker *colorPicker, IntelliToolsettings *Toolsettings)IntelliToolFloodFill
isDrawingIntelliToolprotected
onMouseLeftPressed(int x, int y) overrideIntelliToolFloodFillvirtual
onMouseLeftReleased(int x, int y) overrideIntelliToolFloodFillvirtual
onMouseMoved(int x, int y) overrideIntelliToolFloodFillvirtual
onMouseRightPressed(int x, int y) overrideIntelliToolFloodFillvirtual
onMouseRightReleased(int x, int y) overrideIntelliToolFloodFillvirtual
onWheelScrolled(int value) overrideIntelliToolFloodFillvirtual
ToolsettingsIntelliToolprotected
Tooltype enum nameIntelliTool
~IntelliTool()=0IntelliToolpure virtual
~IntelliToolFloodFill() overrideIntelliToolFloodFillvirtual
diff --git a/docs/html/class_intelli_tool_flood_fill.html b/docs/html/class_intelli_tool_flood_fill.html index b2f7ad6..ad0beb0 100644 --- a/docs/html/class_intelli_tool_flood_fill.html +++ b/docs/html/class_intelli_tool_flood_fill.html @@ -101,19 +101,18 @@ $(document).ready(function(){initNavTree('class_intelli_tool_flood_fill.html',''
Inheritance diagram for IntelliToolFloodFill:
-
Inheritance graph
-
[legend]
-
-Collaboration diagram for IntelliToolFloodFill:
-
-
Collaboration graph
-
[legend]
+
+ + +IntelliTool + +
- - - + + + @@ -136,39 +135,60 @@ Public Member Functions - - - + + + + + + +

Public Member Functions

 IntelliToolFloodFill (PaintingArea *Area, IntelliColorPicker *colorPicker)
 A constructor setting the general paintingArea and colorPicker. More...
 
 IntelliToolFloodFill (PaintingArea *Area, IntelliColorPicker *colorPicker, IntelliToolsettings *Toolsettings)
 A constructor setting the general paintingArea and colorPicker. More...
 
virtual ~IntelliToolFloodFill () override
 A Destructor. More...
 
 A function managing the mouse moved event. More...
 
- Public Member Functions inherited from IntelliTool
 IntelliTool (PaintingArea *Area, IntelliColorPicker *colorPicker)
 A constructor setting the general Painting Area and colorPicker. More...
 
 IntelliTool (PaintingArea *Area, IntelliColorPicker *colorPicker, IntelliToolsettings *Toolsettings)
 A constructor setting the general Painting Area and colorPicker. More...
 
virtual ~IntelliTool ()=0
 An abstract Destructor. More...
 
Tooltype getTooltype ()
 
bool getIsDrawing ()
 
+ + + + + - - - + + + + + - - - + + +

Additional Inherited Members

- Public Types inherited from IntelliTool
enum  Tooltype {
+  Tooltype::CIRCLE, +Tooltype::FLOODFILL, +Tooltype::LINE, +Tooltype::PEN, +
+  Tooltype::PLAIN, +Tooltype::POLYGON, +Tooltype::RECTANGLE +
+ }
 
- Protected Attributes inherited from IntelliTool
PaintingAreaArea
 A pointer to the general PaintingArea to interact with. More...
 
Tooltype ActiveType
 
IntelliColorPickercolorPicker
 A pointer to the IntelliColorPicker of the PaintingArea to interact with, and get the colors. More...
 
LayerObjectActive
 A pointer to the underlying active Layer, do not work on this. This is used for data grabbing or previews. More...
 
IntelliToolsettingsToolsettings
 
LayerObjectactiveLayer
 A pointer to the underlying active Layer, do not work on this. This is used for data grabbing or previews. More...
 
LayerObjectCanvas
 A pointer to the drawing canvas of the tool, work on this. More...
 
bool drawing = false
 A flag checking if the user is currently drawing or not. More...
 
bool isDrawing = false
 A flag checking if the user is currently drawing or not. More...
 

Detailed Description

The IntelliToolFloodFill class represents a tool to flood FIll a certian area.

Definition at line 10 of file IntelliToolFloodFill.h.

Constructor & Destructor Documentation

- -

◆ IntelliToolFloodFill()

+ +

◆ IntelliToolFloodFill()

@@ -183,7 +203,13 @@ Additional Inherited Members IntelliColorPicker *  - colorPicker  + colorPicker, + + + + + IntelliToolsettings *  + Toolsettings  @@ -231,7 +257,7 @@ Additional Inherited Members

A Destructor.

-

Definition at line 12 of file IntelliToolFloodFill.cpp.

+

Definition at line 13 of file IntelliToolFloodFill.cpp.

@@ -281,12 +307,7 @@ Additional Inherited Members

Reimplemented from IntelliTool.

-

Definition at line 24 of file IntelliToolFloodFill.cpp.

-
-Here is the call graph for this function:
-
-
-
+

Definition at line 25 of file IntelliToolFloodFill.cpp.

@@ -335,12 +356,7 @@ Here is the call graph for this function:

Reimplemented from IntelliTool.

-

Definition at line 68 of file IntelliToolFloodFill.cpp.

-
-Here is the call graph for this function:
-
-
-
+

Definition at line 69 of file IntelliToolFloodFill.cpp.

@@ -389,12 +405,7 @@ Here is the call graph for this function:

Reimplemented from IntelliTool.

-

Definition at line 77 of file IntelliToolFloodFill.cpp.

-
-Here is the call graph for this function:
-
-
-
+

Definition at line 78 of file IntelliToolFloodFill.cpp.

@@ -443,12 +454,7 @@ Here is the call graph for this function:

Reimplemented from IntelliTool.

-

Definition at line 16 of file IntelliToolFloodFill.cpp.

-
-Here is the call graph for this function:
-
-
-
+

Definition at line 17 of file IntelliToolFloodFill.cpp.

@@ -497,12 +503,7 @@ Here is the call graph for this function:

Reimplemented from IntelliTool.

-

Definition at line 20 of file IntelliToolFloodFill.cpp.

-
-Here is the call graph for this function:
-
-
-
+

Definition at line 21 of file IntelliToolFloodFill.cpp.

@@ -540,12 +541,7 @@ Here is the call graph for this function:

Reimplemented from IntelliTool.

-

Definition at line 72 of file IntelliToolFloodFill.cpp.

-
-Here is the call graph for this function:
-
-
-
+

Definition at line 73 of file IntelliToolFloodFill.cpp.

diff --git a/docs/html/class_intelli_tool_flood_fill.js b/docs/html/class_intelli_tool_flood_fill.js index b410d56..d215069 100644 --- a/docs/html/class_intelli_tool_flood_fill.js +++ b/docs/html/class_intelli_tool_flood_fill.js @@ -1,6 +1,6 @@ var class_intelli_tool_flood_fill = [ - [ "IntelliToolFloodFill", "class_intelli_tool_flood_fill.html#a83b51838da304e274bf866cf2fd5407a", null ], + [ "IntelliToolFloodFill", "class_intelli_tool_flood_fill.html#a0b283b1b0135ff909a7199be9da9c076", null ], [ "~IntelliToolFloodFill", "class_intelli_tool_flood_fill.html#a83b1bd8be0cbb32cdf61a9597ec849ba", null ], [ "onMouseLeftPressed", "class_intelli_tool_flood_fill.html#ac85e3cb6233508ff9612833a8d9e3961", null ], [ "onMouseLeftReleased", "class_intelli_tool_flood_fill.html#a7438ef96c6c36068bce76e2364e8594c", null ], diff --git a/docs/html/class_intelli_tool_flood_fill.png b/docs/html/class_intelli_tool_flood_fill.png new file mode 100644 index 0000000000000000000000000000000000000000..8b73510271b339de448d1323dcbe053db2279c62 GIT binary patch literal 418 zcmeAS@N?(olHy`uVBq!ia0vp^ML-t<74`jZ3_ipy=ITL^^ zFg|eL0AKHcr$8=8NswPK15gnNTs;+H#K6F4=;`7ZQo;CkE_dD$1s>M+_9?&RE6wK% z?eWyQwQlaJ(jyC6#0@1Z7`9%M;trjp;{i0Tpnub~C}+kWa>5QeA5Ud+l^@fde=OrU@2UEt Node3 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; Node4 [label="QWidget",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; - Node5 -> Node2 [dir="back",color="darkorchid3",fontsize="10",style="dashed",label=" colorPicker" ,fontname="Helvetica"]; + Node5 -> Node3 [dir="back",color="darkorchid3",fontsize="10",style="dashed",label=" colorPicker" ,fontname="Helvetica"]; Node5 [label="IntelliColorPicker",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_color_picker.html",tooltip="The IntelliColorPicker manages the selected colors for one whole project."]; - Node6 -> Node2 [dir="back",color="darkorchid3",fontsize="10",style="dashed",label=" Canvas\nActive" ,fontname="Helvetica"]; - Node6 [label="LayerObject",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$struct_layer_object.html",tooltip="The LayerObject struct holds all the information needed to construct a layer."]; - Node7 -> Node6 [dir="back",color="darkorchid3",fontsize="10",style="dashed",label=" image" ,fontname="Helvetica"]; - Node7 [label="IntelliImage",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_image.html",tooltip="An abstract class which manages the basic IntelliImage operations."]; + Node6 -> Node3 [dir="back",color="darkorchid3",fontsize="10",style="dashed",label=" Toolsettings" ,fontname="Helvetica"]; + Node6 [label="IntelliToolsettings",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_toolsettings.html",tooltip=" "]; + Node6 -> Node2 [dir="back",color="darkorchid3",fontsize="10",style="dashed",label=" Toolsettings" ,fontname="Helvetica"]; + Node5 -> Node2 [dir="back",color="darkorchid3",fontsize="10",style="dashed",label=" colorPicker" ,fontname="Helvetica"]; + Node7 -> Node2 [dir="back",color="darkorchid3",fontsize="10",style="dashed",label=" Canvas\nactiveLayer" ,fontname="Helvetica"]; + Node7 [label="LayerObject",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$struct_layer_object.html",tooltip="The LayerObject struct holds all the information needed to construct a layer."]; + Node8 -> Node7 [dir="back",color="darkorchid3",fontsize="10",style="dashed",label=" image" ,fontname="Helvetica"]; + Node8 [label="IntelliImage",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_image.html",tooltip="An abstract class which manages the basic IntelliImage operations."]; } diff --git a/docs/html/class_intelli_tool_flood_fill_a83b1bd8be0cbb32cdf61a9597ec849ba_cgraph.dot b/docs/html/class_intelli_tool_flood_fill_a83b1bd8be0cbb32cdf61a9597ec849ba_cgraph.dot new file mode 100644 index 0000000..ec5fca4 --- /dev/null +++ b/docs/html/class_intelli_tool_flood_fill_a83b1bd8be0cbb32cdf61a9597ec849ba_cgraph.dot @@ -0,0 +1,10 @@ +digraph "IntelliToolFloodFill::~IntelliToolFloodFill" +{ + // LATEX_PDF_SIZE + edge [fontname="Helvetica",fontsize="10",labelfontname="Helvetica",labelfontsize="10"]; + node [fontname="Helvetica",fontsize="10",shape=record]; + rankdir="LR"; + Node1 [label="IntelliToolFloodFill\l::~IntelliToolFloodFill",height=0.2,width=0.4,color="black", fillcolor="grey75", style="filled", fontcolor="black",tooltip="A Destructor."]; + Node1 -> Node2 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node2 [label="IntelliTool::onMouseRight\lPressed",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool.html#a1e6aa68ac5f3c2ca02319e5ef3f0c966",tooltip="A function managing the right click Pressed of a Mouse. Constructing the Canvas to draw on...."]; +} diff --git a/docs/html/class_intelli_tool_line-members.html b/docs/html/class_intelli_tool_line-members.html index af26209..096960c 100644 --- a/docs/html/class_intelli_tool_line-members.html +++ b/docs/html/class_intelli_tool_line-members.html @@ -93,21 +93,26 @@ $(document).ready(function(){initNavTree('class_intelli_tool_line.html','');});

This is the complete list of members for IntelliToolLine, including all inherited members.

- - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + +
ActiveIntelliToolprotected
AreaIntelliToolprotected
CanvasIntelliToolprotected
colorPickerIntelliToolprotected
drawingIntelliToolprotected
IntelliTool(PaintingArea *Area, IntelliColorPicker *colorPicker)IntelliTool
IntelliToolLine(PaintingArea *Area, IntelliColorPicker *colorPicker)IntelliToolLine
onMouseLeftPressed(int x, int y) overrideIntelliToolLinevirtual
onMouseLeftReleased(int x, int y) overrideIntelliToolLinevirtual
onMouseMoved(int x, int y) overrideIntelliToolLinevirtual
onMouseRightPressed(int x, int y) overrideIntelliToolLinevirtual
onMouseRightReleased(int x, int y) overrideIntelliToolLinevirtual
onWheelScrolled(int value) overrideIntelliToolLinevirtual
~IntelliTool()=0IntelliToolpure virtual
~IntelliToolLine() overrideIntelliToolLinevirtual
activeLayerIntelliToolprotected
ActiveTypeIntelliToolprotected
AreaIntelliToolprotected
CanvasIntelliToolprotected
colorPickerIntelliToolprotected
getIsDrawing()IntelliTool
getTooltype()IntelliTool
IntelliTool(PaintingArea *Area, IntelliColorPicker *colorPicker, IntelliToolsettings *Toolsettings)IntelliTool
IntelliToolLine(PaintingArea *Area, IntelliColorPicker *colorPicker, IntelliToolsettings *Toolsettings)IntelliToolLine
isDrawingIntelliToolprotected
onMouseLeftPressed(int x, int y) overrideIntelliToolLinevirtual
onMouseLeftReleased(int x, int y) overrideIntelliToolLinevirtual
onMouseMoved(int x, int y) overrideIntelliToolLinevirtual
onMouseRightPressed(int x, int y) overrideIntelliToolLinevirtual
onMouseRightReleased(int x, int y) overrideIntelliToolLinevirtual
onWheelScrolled(int value) overrideIntelliToolLinevirtual
ToolsettingsIntelliToolprotected
Tooltype enum nameIntelliTool
~IntelliTool()=0IntelliToolpure virtual
~IntelliToolLine() overrideIntelliToolLinevirtual
diff --git a/docs/html/class_intelli_tool_line.html b/docs/html/class_intelli_tool_line.html index 6f85211..1b7d28a 100644 --- a/docs/html/class_intelli_tool_line.html +++ b/docs/html/class_intelli_tool_line.html @@ -101,19 +101,18 @@ $(document).ready(function(){initNavTree('class_intelli_tool_line.html','');});
Inheritance diagram for IntelliToolLine:
-
Inheritance graph
-
[legend]
-
-Collaboration diagram for IntelliToolLine:
-
-
Collaboration graph
-
[legend]
+
+ + +IntelliTool + +
- - - + + + @@ -136,39 +135,60 @@ Public Member Functions - - - + + + + + + +

Public Member Functions

 IntelliToolLine (PaintingArea *Area, IntelliColorPicker *colorPicker)
 A constructor setting the general paintingArea and colorPicker. And reading in the lineWidth and lineStyle. More...
 
 IntelliToolLine (PaintingArea *Area, IntelliColorPicker *colorPicker, IntelliToolsettings *Toolsettings)
 A constructor setting the general paintingArea and colorPicker. And reading in the lineWidth and lineStyle. More...
 
virtual ~IntelliToolLine () override
 An abstract Destructor. More...
 
 A function managing the mouse moved event. Drawing a Line from the startpoint to the current mouse position. More...
 
- Public Member Functions inherited from IntelliTool
 IntelliTool (PaintingArea *Area, IntelliColorPicker *colorPicker)
 A constructor setting the general Painting Area and colorPicker. More...
 
 IntelliTool (PaintingArea *Area, IntelliColorPicker *colorPicker, IntelliToolsettings *Toolsettings)
 A constructor setting the general Painting Area and colorPicker. More...
 
virtual ~IntelliTool ()=0
 An abstract Destructor. More...
 
Tooltype getTooltype ()
 
bool getIsDrawing ()
 
+ + + + + - - - + + + + + - - - + + +

Additional Inherited Members

- Public Types inherited from IntelliTool
enum  Tooltype {
+  Tooltype::CIRCLE, +Tooltype::FLOODFILL, +Tooltype::LINE, +Tooltype::PEN, +
+  Tooltype::PLAIN, +Tooltype::POLYGON, +Tooltype::RECTANGLE +
+ }
 
- Protected Attributes inherited from IntelliTool
PaintingAreaArea
 A pointer to the general PaintingArea to interact with. More...
 
Tooltype ActiveType
 
IntelliColorPickercolorPicker
 A pointer to the IntelliColorPicker of the PaintingArea to interact with, and get the colors. More...
 
LayerObjectActive
 A pointer to the underlying active Layer, do not work on this. This is used for data grabbing or previews. More...
 
IntelliToolsettingsToolsettings
 
LayerObjectactiveLayer
 A pointer to the underlying active Layer, do not work on this. This is used for data grabbing or previews. More...
 
LayerObjectCanvas
 A pointer to the drawing canvas of the tool, work on this. More...
 
bool drawing = false
 A flag checking if the user is currently drawing or not. More...
 
bool isDrawing = false
 A flag checking if the user is currently drawing or not. More...
 

Detailed Description

The IntelliToolFloodFill class represents a tool to draw a line.

-

Definition at line 18 of file IntelliToolLine.h.

+

Definition at line 10 of file IntelliToolLine.h.

Constructor & Destructor Documentation

- -

◆ IntelliToolLine()

+ +

◆ IntelliToolLine()

@@ -183,7 +203,13 @@ Additional Inherited Members IntelliColorPicker *  - colorPicker  + colorPicker, + + + + + IntelliToolsettings *  + Toolsettings  @@ -231,7 +257,7 @@ Additional Inherited Members

An abstract Destructor.

-

Definition at line 13 of file IntelliToolLine.cpp.

+

Definition at line 11 of file IntelliToolLine.cpp.

@@ -281,12 +307,7 @@ Additional Inherited Members

Reimplemented from IntelliTool.

-

Definition at line 25 of file IntelliToolLine.cpp.

-
-Here is the call graph for this function:
-
-
-
+

Definition at line 23 of file IntelliToolLine.cpp.

@@ -335,12 +356,7 @@ Here is the call graph for this function:

Reimplemented from IntelliTool.

-

Definition at line 32 of file IntelliToolLine.cpp.

-
-Here is the call graph for this function:
-
-
-
+

Definition at line 30 of file IntelliToolLine.cpp.

@@ -389,12 +405,7 @@ Here is the call graph for this function:

Reimplemented from IntelliTool.

-

Definition at line 44 of file IntelliToolLine.cpp.

-
-Here is the call graph for this function:
-
-
-
+

Definition at line 39 of file IntelliToolLine.cpp.

@@ -443,12 +454,7 @@ Here is the call graph for this function:

Reimplemented from IntelliTool.

-

Definition at line 17 of file IntelliToolLine.cpp.

-
-Here is the call graph for this function:
-
-
-
+

Definition at line 15 of file IntelliToolLine.cpp.

@@ -497,12 +503,7 @@ Here is the call graph for this function:

Reimplemented from IntelliTool.

-

Definition at line 21 of file IntelliToolLine.cpp.

-
-Here is the call graph for this function:
-
-
-
+

Definition at line 19 of file IntelliToolLine.cpp.

@@ -540,12 +541,7 @@ Here is the call graph for this function:

Reimplemented from IntelliTool.

-

Definition at line 36 of file IntelliToolLine.cpp.

-
-Here is the call graph for this function:
-
-
-
+

Definition at line 34 of file IntelliToolLine.cpp.

diff --git a/docs/html/class_intelli_tool_line.js b/docs/html/class_intelli_tool_line.js index 30bab7f..08808b7 100644 --- a/docs/html/class_intelli_tool_line.js +++ b/docs/html/class_intelli_tool_line.js @@ -1,6 +1,6 @@ var class_intelli_tool_line = [ - [ "IntelliToolLine", "class_intelli_tool_line.html#a9b2d4bcd69409a21f6080edfea4ae2a2", null ], + [ "IntelliToolLine", "class_intelli_tool_line.html#a111e83e0f0fec7d4ff773ba9f235e4dc", null ], [ "~IntelliToolLine", "class_intelli_tool_line.html#acb600b0f4e9225ebce2937c2b7abb4c2", null ], [ "onMouseLeftPressed", "class_intelli_tool_line.html#a155d676a5f98311217eb095be4759846", null ], [ "onMouseLeftReleased", "class_intelli_tool_line.html#ac93f76ff20a1c111a403b298bab02482", null ], diff --git a/docs/html/class_intelli_tool_line.png b/docs/html/class_intelli_tool_line.png new file mode 100644 index 0000000000000000000000000000000000000000..94372dec6dea2b4f1484b13ef582e6641ee74c28 GIT binary patch literal 386 zcmeAS@N?(olHy`uVBq!ia0vp^kw6^4!3-o_Z)t`CDTx4|5ZC|z{{xxt-o2YWd(H$P z3ycpOIKbC?;3<&HQ4-`A%m7pb0#{Fk7%?y~3VOOYhEy=Vy~~?-$bhHq;q`4-e#=W{ z>^k!D&Pv%Ce@~o<*KDyd_2g@q8R=yZdbMTBpXN;vlU%$I!2@9i# z$I1L@$C;Py-fCwiU2xUyx#aaHi%;f>B*^RA&x$_(z3ioJd1dyUe!t@1`rnGCtCgKN zSM0od=VR~xchsM}e9OHv_lEhCjhBzxvcIlb_q>38bNJ&!H$SYt_UUI1!yXfmm8zj) cf+tV#&hZmo(`2W+3K(Dvp00i_>zopr04x--ssI20 literal 0 HcmV?d00001 diff --git a/docs/html/class_intelli_tool_line__coll__graph.dot b/docs/html/class_intelli_tool_line__coll__graph.dot index be334ec..9b3338a 100644 --- a/docs/html/class_intelli_tool_line__coll__graph.dot +++ b/docs/html/class_intelli_tool_line__coll__graph.dot @@ -10,10 +10,14 @@ digraph "IntelliToolLine" Node3 [label="PaintingArea",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_painting_area.html",tooltip="The PaintingArea class manages the methods and stores information about the current painting area,..."]; Node4 -> Node3 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; Node4 [label="QWidget",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; - Node5 -> Node2 [dir="back",color="darkorchid3",fontsize="10",style="dashed",label=" colorPicker" ,fontname="Helvetica"]; + Node5 -> Node3 [dir="back",color="darkorchid3",fontsize="10",style="dashed",label=" colorPicker" ,fontname="Helvetica"]; Node5 [label="IntelliColorPicker",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_color_picker.html",tooltip="The IntelliColorPicker manages the selected colors for one whole project."]; - Node6 -> Node2 [dir="back",color="darkorchid3",fontsize="10",style="dashed",label=" Canvas\nActive" ,fontname="Helvetica"]; - Node6 [label="LayerObject",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$struct_layer_object.html",tooltip="The LayerObject struct holds all the information needed to construct a layer."]; - Node7 -> Node6 [dir="back",color="darkorchid3",fontsize="10",style="dashed",label=" image" ,fontname="Helvetica"]; - Node7 [label="IntelliImage",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_image.html",tooltip="An abstract class which manages the basic IntelliImage operations."]; + Node6 -> Node3 [dir="back",color="darkorchid3",fontsize="10",style="dashed",label=" Toolsettings" ,fontname="Helvetica"]; + Node6 [label="IntelliToolsettings",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_toolsettings.html",tooltip=" "]; + Node6 -> Node2 [dir="back",color="darkorchid3",fontsize="10",style="dashed",label=" Toolsettings" ,fontname="Helvetica"]; + Node5 -> Node2 [dir="back",color="darkorchid3",fontsize="10",style="dashed",label=" colorPicker" ,fontname="Helvetica"]; + Node7 -> Node2 [dir="back",color="darkorchid3",fontsize="10",style="dashed",label=" Canvas\nactiveLayer" ,fontname="Helvetica"]; + Node7 [label="LayerObject",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$struct_layer_object.html",tooltip="The LayerObject struct holds all the information needed to construct a layer."]; + Node8 -> Node7 [dir="back",color="darkorchid3",fontsize="10",style="dashed",label=" image" ,fontname="Helvetica"]; + Node8 [label="IntelliImage",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_image.html",tooltip="An abstract class which manages the basic IntelliImage operations."]; } diff --git a/docs/html/class_intelli_tool_line_a155d676a5f98311217eb095be4759846_cgraph.dot b/docs/html/class_intelli_tool_line_a155d676a5f98311217eb095be4759846_cgraph.dot index 58d157e..68183ee 100644 --- a/docs/html/class_intelli_tool_line_a155d676a5f98311217eb095be4759846_cgraph.dot +++ b/docs/html/class_intelli_tool_line_a155d676a5f98311217eb095be4759846_cgraph.dot @@ -12,6 +12,8 @@ digraph "IntelliToolLine::onMouseLeftPressed" Node1 -> Node4 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; Node4 [label="IntelliColorPicker\l::getFirstColor",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_color_picker.html#aae2eb27b928fe9388b9398b0556303b7",tooltip="A function to read the primary selected color."]; Node1 -> Node5 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node5 [label="IntelliTool::onMouseLeft\lPressed",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool.html#a34b7ef1dde96b94a0ce450a25ae1778c",tooltip="A function managing the left click Pressed of a Mouse. Resetting the current draw...."]; - Node5 -> Node2 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node5 [label="IntelliToolsettings\l::getLineWidth",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_toolsettings.html#a68528dd3bad8f39ba19fa6b12a4e415a",tooltip=" "]; + Node1 -> Node6 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node6 [label="IntelliTool::onMouseLeft\lPressed",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool.html#a34b7ef1dde96b94a0ce450a25ae1778c",tooltip="A function managing the left click Pressed of a Mouse. Resetting the current draw...."]; + Node6 -> Node2 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; } diff --git a/docs/html/class_intelli_tool_line_aaf1d686e1ec43f41b5186ccfd806b125_cgraph.dot b/docs/html/class_intelli_tool_line_aaf1d686e1ec43f41b5186ccfd806b125_cgraph.dot index 4946e13..b42b674 100644 --- a/docs/html/class_intelli_tool_line_aaf1d686e1ec43f41b5186ccfd806b125_cgraph.dot +++ b/docs/html/class_intelli_tool_line_aaf1d686e1ec43f41b5186ccfd806b125_cgraph.dot @@ -6,5 +6,9 @@ digraph "IntelliToolLine::onWheelScrolled" rankdir="LR"; Node1 [label="IntelliToolLine::onWheel\lScrolled",height=0.2,width=0.4,color="black", fillcolor="grey75", style="filled", fontcolor="black",tooltip="A function managing the scroll event. Changing the lineWidth relative to value."]; Node1 -> Node2 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node2 [label="IntelliTool::onWheelScrolled",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool.html#a4dccfd4460255ccb866f336406a33574",tooltip="A function managing the scroll event. A positive value means scrolling outwards. Call this in child c..."]; + Node2 [label="IntelliToolsettings\l::getLineWidth",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_toolsettings.html#a68528dd3bad8f39ba19fa6b12a4e415a",tooltip=" "]; + Node1 -> Node3 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node3 [label="IntelliTool::onWheelScrolled",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool.html#a4dccfd4460255ccb866f336406a33574",tooltip="A function managing the scroll event. A positive value means scrolling outwards. Call this in child c..."]; + Node1 -> Node4 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node4 [label="IntelliToolsettings\l::setLineWidth",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_toolsettings.html#a906d37de6ee94b433d53fe3e598cc9fa",tooltip=" "]; } diff --git a/docs/html/class_intelli_tool_line_abc6324ef0778823fe7e35aef8ae37f9b_cgraph.dot b/docs/html/class_intelli_tool_line_abc6324ef0778823fe7e35aef8ae37f9b_cgraph.dot index aaf6ac9..00952dc 100644 --- a/docs/html/class_intelli_tool_line_abc6324ef0778823fe7e35aef8ae37f9b_cgraph.dot +++ b/docs/html/class_intelli_tool_line_abc6324ef0778823fe7e35aef8ae37f9b_cgraph.dot @@ -12,7 +12,11 @@ digraph "IntelliToolLine::onMouseMoved" Node1 -> Node4 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; Node4 [label="IntelliColorPicker\l::getFirstColor",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_color_picker.html#aae2eb27b928fe9388b9398b0556303b7",tooltip="A function to read the primary selected color."]; Node1 -> Node5 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node5 [label="IntelliTool::onMouseMoved",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool.html#ac10e20414cd8855a2f9b103fb6408639",tooltip="A function managing the mouse moved event. Call this in child classes!"]; - Node5 -> Node6 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node6 [label="IntelliImage::calculateVisiblity",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_image.html#aebbced93f4744fad81b7f141b21f4ab2",tooltip="An abstract function that calculates the visiblity of the Image data if needed."]; + Node5 [label="IntelliToolsettings\l::getLinestyle",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_toolsettings.html#a5beb193b25e0665516244c61c5e65aa6",tooltip=" "]; + Node1 -> Node6 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node6 [label="IntelliToolsettings\l::getLineWidth",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_toolsettings.html#a68528dd3bad8f39ba19fa6b12a4e415a",tooltip=" "]; + Node1 -> Node7 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node7 [label="IntelliTool::onMouseMoved",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool.html#ac10e20414cd8855a2f9b103fb6408639",tooltip="A function managing the mouse moved event. Call this in child classes!"]; + Node7 -> Node8 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node8 [label="IntelliImage::calculateVisiblity",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_image.html#aebbced93f4744fad81b7f141b21f4ab2",tooltip="An abstract function that calculates the visiblity of the Image data if needed."]; } diff --git a/docs/html/class_intelli_tool_line_acb600b0f4e9225ebce2937c2b7abb4c2_cgraph.dot b/docs/html/class_intelli_tool_line_acb600b0f4e9225ebce2937c2b7abb4c2_cgraph.dot new file mode 100644 index 0000000..e06bd53 --- /dev/null +++ b/docs/html/class_intelli_tool_line_acb600b0f4e9225ebce2937c2b7abb4c2_cgraph.dot @@ -0,0 +1,10 @@ +digraph "IntelliToolLine::~IntelliToolLine" +{ + // LATEX_PDF_SIZE + edge [fontname="Helvetica",fontsize="10",labelfontname="Helvetica",labelfontsize="10"]; + node [fontname="Helvetica",fontsize="10",shape=record]; + rankdir="LR"; + Node1 [label="IntelliToolLine::~Intelli\lToolLine",height=0.2,width=0.4,color="black", fillcolor="grey75", style="filled", fontcolor="black",tooltip="An abstract Destructor."]; + Node1 -> Node2 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node2 [label="IntelliTool::onMouseRight\lPressed",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool.html#a1e6aa68ac5f3c2ca02319e5ef3f0c966",tooltip="A function managing the right click Pressed of a Mouse. Constructing the Canvas to draw on...."]; +} diff --git a/docs/html/class_intelli_tool_pen-members.html b/docs/html/class_intelli_tool_pen-members.html index 1f749b0..f97cedc 100644 --- a/docs/html/class_intelli_tool_pen-members.html +++ b/docs/html/class_intelli_tool_pen-members.html @@ -93,21 +93,26 @@ $(document).ready(function(){initNavTree('class_intelli_tool_pen.html','');});

This is the complete list of members for IntelliToolPen, including all inherited members.

- - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + +
ActiveIntelliToolprotected
AreaIntelliToolprotected
CanvasIntelliToolprotected
colorPickerIntelliToolprotected
drawingIntelliToolprotected
IntelliTool(PaintingArea *Area, IntelliColorPicker *colorPicker)IntelliTool
IntelliToolPen(PaintingArea *Area, IntelliColorPicker *colorPicker)IntelliToolPen
onMouseLeftPressed(int x, int y) overrideIntelliToolPenvirtual
onMouseLeftReleased(int x, int y) overrideIntelliToolPenvirtual
onMouseMoved(int x, int y) overrideIntelliToolPenvirtual
onMouseRightPressed(int x, int y) overrideIntelliToolPenvirtual
onMouseRightReleased(int x, int y) overrideIntelliToolPenvirtual
onWheelScrolled(int value) overrideIntelliToolPenvirtual
~IntelliTool()=0IntelliToolpure virtual
~IntelliToolPen() overrideIntelliToolPenvirtual
activeLayerIntelliToolprotected
ActiveTypeIntelliToolprotected
AreaIntelliToolprotected
CanvasIntelliToolprotected
colorPickerIntelliToolprotected
getIsDrawing()IntelliTool
getTooltype()IntelliTool
IntelliTool(PaintingArea *Area, IntelliColorPicker *colorPicker, IntelliToolsettings *Toolsettings)IntelliTool
IntelliToolPen(PaintingArea *Area, IntelliColorPicker *colorPicker, IntelliToolsettings *Toolsettings)IntelliToolPen
isDrawingIntelliToolprotected
onMouseLeftPressed(int x, int y) overrideIntelliToolPenvirtual
onMouseLeftReleased(int x, int y) overrideIntelliToolPenvirtual
onMouseMoved(int x, int y) overrideIntelliToolPenvirtual
onMouseRightPressed(int x, int y) overrideIntelliToolPenvirtual
onMouseRightReleased(int x, int y) overrideIntelliToolPenvirtual
onWheelScrolled(int value) overrideIntelliToolPenvirtual
ToolsettingsIntelliToolprotected
Tooltype enum nameIntelliTool
~IntelliTool()=0IntelliToolpure virtual
~IntelliToolPen() overrideIntelliToolPenvirtual
diff --git a/docs/html/class_intelli_tool_pen.html b/docs/html/class_intelli_tool_pen.html index 70b6112..910bfe0 100644 --- a/docs/html/class_intelli_tool_pen.html +++ b/docs/html/class_intelli_tool_pen.html @@ -101,19 +101,18 @@ $(document).ready(function(){initNavTree('class_intelli_tool_pen.html','');});
Inheritance diagram for IntelliToolPen:
-
Inheritance graph
-
[legend]
-
-Collaboration diagram for IntelliToolPen:
-
-
Collaboration graph
-
[legend]
+
+ + +IntelliTool + +
- - - + + + @@ -136,39 +135,60 @@ Public Member Functions - - - + + + + + + +

Public Member Functions

 IntelliToolPen (PaintingArea *Area, IntelliColorPicker *colorPicker)
 A constructor setting the general paintingArea and colorPicker. Reading the penWidth. More...
 
 IntelliToolPen (PaintingArea *Area, IntelliColorPicker *colorPicker, IntelliToolsettings *Toolsettings)
 A constructor setting the general paintingArea and colorPicker. Reading the penWidth. More...
 
virtual ~IntelliToolPen () override
 A Destructor. More...
 
 A function managing the mouse moved event. To draw the line. More...
 
- Public Member Functions inherited from IntelliTool
 IntelliTool (PaintingArea *Area, IntelliColorPicker *colorPicker)
 A constructor setting the general Painting Area and colorPicker. More...
 
 IntelliTool (PaintingArea *Area, IntelliColorPicker *colorPicker, IntelliToolsettings *Toolsettings)
 A constructor setting the general Painting Area and colorPicker. More...
 
virtual ~IntelliTool ()=0
 An abstract Destructor. More...
 
Tooltype getTooltype ()
 
bool getIsDrawing ()
 
+ + + + + - - - + + + + + - - - + + +

Additional Inherited Members

- Public Types inherited from IntelliTool
enum  Tooltype {
+  Tooltype::CIRCLE, +Tooltype::FLOODFILL, +Tooltype::LINE, +Tooltype::PEN, +
+  Tooltype::PLAIN, +Tooltype::POLYGON, +Tooltype::RECTANGLE +
+ }
 
- Protected Attributes inherited from IntelliTool
PaintingAreaArea
 A pointer to the general PaintingArea to interact with. More...
 
Tooltype ActiveType
 
IntelliColorPickercolorPicker
 A pointer to the IntelliColorPicker of the PaintingArea to interact with, and get the colors. More...
 
LayerObjectActive
 A pointer to the underlying active Layer, do not work on this. This is used for data grabbing or previews. More...
 
IntelliToolsettingsToolsettings
 
LayerObjectactiveLayer
 A pointer to the underlying active Layer, do not work on this. This is used for data grabbing or previews. More...
 
LayerObjectCanvas
 A pointer to the drawing canvas of the tool, work on this. More...
 
bool drawing = false
 A flag checking if the user is currently drawing or not. More...
 
bool isDrawing = false
 A flag checking if the user is currently drawing or not. More...
 

Detailed Description

The IntelliToolPen class represents a tool to draw a line.

-

Definition at line 10 of file IntelliToolPen.h.

+

Definition at line 11 of file IntelliToolPen.h.

Constructor & Destructor Documentation

- -

◆ IntelliToolPen()

+ +

◆ IntelliToolPen()

@@ -183,7 +203,13 @@ Additional Inherited Members IntelliColorPicker *  - colorPicker  + colorPicker, + + + + + IntelliToolsettings *  + Toolsettings  @@ -282,11 +308,6 @@ Additional Inherited Members

Reimplemented from IntelliTool.

Definition at line 24 of file IntelliToolPen.cpp.

-
-Here is the call graph for this function:
-
-
-
@@ -336,11 +357,6 @@ Here is the call graph for this function:

Reimplemented from IntelliTool.

Definition at line 31 of file IntelliToolPen.cpp.

-
-Here is the call graph for this function:
-
-
-
@@ -390,11 +406,6 @@ Here is the call graph for this function:

Reimplemented from IntelliTool.

Definition at line 35 of file IntelliToolPen.cpp.

-
-Here is the call graph for this function:
-
-
-
@@ -444,11 +455,6 @@ Here is the call graph for this function:

Reimplemented from IntelliTool.

Definition at line 16 of file IntelliToolPen.cpp.

-
-Here is the call graph for this function:
-
-
-
@@ -498,11 +504,6 @@ Here is the call graph for this function:

Reimplemented from IntelliTool.

Definition at line 20 of file IntelliToolPen.cpp.

-
-Here is the call graph for this function:
-
-
-
@@ -541,11 +542,6 @@ Here is the call graph for this function:

Reimplemented from IntelliTool.

Definition at line 44 of file IntelliToolPen.cpp.

-
-Here is the call graph for this function:
-
-
-
diff --git a/docs/html/class_intelli_tool_pen.js b/docs/html/class_intelli_tool_pen.js index 011662d..19b29f0 100644 --- a/docs/html/class_intelli_tool_pen.js +++ b/docs/html/class_intelli_tool_pen.js @@ -1,6 +1,6 @@ var class_intelli_tool_pen = [ - [ "IntelliToolPen", "class_intelli_tool_pen.html#a889891b3ae7cdefb881aed2e7fff9b47", null ], + [ "IntelliToolPen", "class_intelli_tool_pen.html#a9f885143d6bb7adda3dcd3707d59e14d", null ], [ "~IntelliToolPen", "class_intelli_tool_pen.html#ac77a025515d0fed6954556fe2b444818", null ], [ "onMouseLeftPressed", "class_intelli_tool_pen.html#a8ff40aef6d38eb55af31a19322429205", null ], [ "onMouseLeftReleased", "class_intelli_tool_pen.html#abda7a22b9766fa4ad254324a53cab94d", null ], diff --git a/docs/html/class_intelli_tool_pen.png b/docs/html/class_intelli_tool_pen.png new file mode 100644 index 0000000000000000000000000000000000000000..6de00273919a8514135ac4a3ed6ae32428ad6224 GIT binary patch literal 376 zcmeAS@N?(olHy`uVBq!ia0vp^;XoX~!3-p$g(aT>DTx4|5ZC|z{{xxt-o2YWd(H$P z3ycpOIKbC?;3<&HQ4-`A%m7pb0#{Fk7%?y~vU|EXhEy=Vz59^wkOB|OgY4OF{>n$1 zF9=9IrKBpAt#NKqd|uBFX(c5-*2J`VaSzv(udFZS@zPJrJO23j>UW$*@7^7Jx7lx2 z_(Ykg@R>Vh)7M$Ct-U$)FPq1n_RL@VPJ#GNC8f{Y3~t%X z4DCfl+t0F>6}?}>{pRVvJCz*fF$|?G(s?@=5`YT-A5&E-(hy+qSr61R)ja&TM!$rE z@wcUZ)i-K0?ADe&ymq%)R`S!5%CE;QV|UM5cIo1mW1+_vT+KDv9b)yBE%)B(ynFGx zKOFMCFMm4vAGcdfwcNekUvtmdnY{bGNBn&AOPiex1{)9YmQVC{G1;H@?1!*( Node3 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; Node4 [label="QWidget",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; - Node5 -> Node2 [dir="back",color="darkorchid3",fontsize="10",style="dashed",label=" colorPicker" ,fontname="Helvetica"]; + Node5 -> Node3 [dir="back",color="darkorchid3",fontsize="10",style="dashed",label=" colorPicker" ,fontname="Helvetica"]; Node5 [label="IntelliColorPicker",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_color_picker.html",tooltip="The IntelliColorPicker manages the selected colors for one whole project."]; - Node6 -> Node2 [dir="back",color="darkorchid3",fontsize="10",style="dashed",label=" Canvas\nActive" ,fontname="Helvetica"]; - Node6 [label="LayerObject",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$struct_layer_object.html",tooltip="The LayerObject struct holds all the information needed to construct a layer."]; - Node7 -> Node6 [dir="back",color="darkorchid3",fontsize="10",style="dashed",label=" image" ,fontname="Helvetica"]; - Node7 [label="IntelliImage",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_image.html",tooltip="An abstract class which manages the basic IntelliImage operations."]; + Node6 -> Node3 [dir="back",color="darkorchid3",fontsize="10",style="dashed",label=" Toolsettings" ,fontname="Helvetica"]; + Node6 [label="IntelliToolsettings",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_toolsettings.html",tooltip=" "]; + Node6 -> Node2 [dir="back",color="darkorchid3",fontsize="10",style="dashed",label=" Toolsettings" ,fontname="Helvetica"]; + Node5 -> Node2 [dir="back",color="darkorchid3",fontsize="10",style="dashed",label=" colorPicker" ,fontname="Helvetica"]; + Node7 -> Node2 [dir="back",color="darkorchid3",fontsize="10",style="dashed",label=" Canvas\nactiveLayer" ,fontname="Helvetica"]; + Node7 [label="LayerObject",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$struct_layer_object.html",tooltip="The LayerObject struct holds all the information needed to construct a layer."]; + Node8 -> Node7 [dir="back",color="darkorchid3",fontsize="10",style="dashed",label=" image" ,fontname="Helvetica"]; + Node8 [label="IntelliImage",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_image.html",tooltip="An abstract class which manages the basic IntelliImage operations."]; } diff --git a/docs/html/class_intelli_tool_pen_a58d1d636497b630647ce0c4d652737c2_cgraph.dot b/docs/html/class_intelli_tool_pen_a58d1d636497b630647ce0c4d652737c2_cgraph.dot index 4451173..91f55e9 100644 --- a/docs/html/class_intelli_tool_pen_a58d1d636497b630647ce0c4d652737c2_cgraph.dot +++ b/docs/html/class_intelli_tool_pen_a58d1d636497b630647ce0c4d652737c2_cgraph.dot @@ -10,7 +10,9 @@ digraph "IntelliToolPen::onMouseMoved" Node1 -> Node3 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; Node3 [label="IntelliColorPicker\l::getFirstColor",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_color_picker.html#aae2eb27b928fe9388b9398b0556303b7",tooltip="A function to read the primary selected color."]; Node1 -> Node4 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node4 [label="IntelliTool::onMouseMoved",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool.html#ac10e20414cd8855a2f9b103fb6408639",tooltip="A function managing the mouse moved event. Call this in child classes!"]; - Node4 -> Node5 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node5 [label="IntelliImage::calculateVisiblity",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_image.html#aebbced93f4744fad81b7f141b21f4ab2",tooltip="An abstract function that calculates the visiblity of the Image data if needed."]; + Node4 [label="IntelliToolsettings\l::getLineWidth",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_toolsettings.html#a68528dd3bad8f39ba19fa6b12a4e415a",tooltip=" "]; + Node1 -> Node5 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node5 [label="IntelliTool::onMouseMoved",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool.html#ac10e20414cd8855a2f9b103fb6408639",tooltip="A function managing the mouse moved event. Call this in child classes!"]; + Node5 -> Node6 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node6 [label="IntelliImage::calculateVisiblity",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_image.html#aebbced93f4744fad81b7f141b21f4ab2",tooltip="An abstract function that calculates the visiblity of the Image data if needed."]; } diff --git a/docs/html/class_intelli_tool_pen_a8ff40aef6d38eb55af31a19322429205_cgraph.dot b/docs/html/class_intelli_tool_pen_a8ff40aef6d38eb55af31a19322429205_cgraph.dot index bcb3d63..cd8772b 100644 --- a/docs/html/class_intelli_tool_pen_a8ff40aef6d38eb55af31a19322429205_cgraph.dot +++ b/docs/html/class_intelli_tool_pen_a8ff40aef6d38eb55af31a19322429205_cgraph.dot @@ -8,10 +8,12 @@ digraph "IntelliToolPen::onMouseLeftPressed" Node1 -> Node2 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; Node2 [label="IntelliImage::calculateVisiblity",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_image.html#aebbced93f4744fad81b7f141b21f4ab2",tooltip="An abstract function that calculates the visiblity of the Image data if needed."]; Node1 -> Node3 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node3 [label="IntelliImage::drawPixel",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_image.html#af3c859f5c409e37051edfd9e9fbca056",tooltip="A funtcion used to draw a pixel on the Image with the given Color."]; + Node3 [label="IntelliImage::drawPoint",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_image.html#a2e787f1b333b59401643936ebb3dcfe1",tooltip="A."]; Node1 -> Node4 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; Node4 [label="IntelliColorPicker\l::getFirstColor",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_color_picker.html#aae2eb27b928fe9388b9398b0556303b7",tooltip="A function to read the primary selected color."]; Node1 -> Node5 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node5 [label="IntelliTool::onMouseLeft\lPressed",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool.html#a34b7ef1dde96b94a0ce450a25ae1778c",tooltip="A function managing the left click Pressed of a Mouse. Resetting the current draw...."]; - Node5 -> Node2 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node5 [label="IntelliToolsettings\l::getLineWidth",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_toolsettings.html#a68528dd3bad8f39ba19fa6b12a4e415a",tooltip=" "]; + Node1 -> Node6 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node6 [label="IntelliTool::onMouseLeft\lPressed",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool.html#a34b7ef1dde96b94a0ce450a25ae1778c",tooltip="A function managing the left click Pressed of a Mouse. Resetting the current draw...."]; + Node6 -> Node2 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; } diff --git a/docs/html/class_intelli_tool_pen_ac77a025515d0fed6954556fe2b444818_cgraph.dot b/docs/html/class_intelli_tool_pen_ac77a025515d0fed6954556fe2b444818_cgraph.dot new file mode 100644 index 0000000..56f030a --- /dev/null +++ b/docs/html/class_intelli_tool_pen_ac77a025515d0fed6954556fe2b444818_cgraph.dot @@ -0,0 +1,10 @@ +digraph "IntelliToolPen::~IntelliToolPen" +{ + // LATEX_PDF_SIZE + edge [fontname="Helvetica",fontsize="10",labelfontname="Helvetica",labelfontsize="10"]; + node [fontname="Helvetica",fontsize="10",shape=record]; + rankdir="LR"; + Node1 [label="IntelliToolPen::~Intelli\lToolPen",height=0.2,width=0.4,color="black", fillcolor="grey75", style="filled", fontcolor="black",tooltip="A Destructor."]; + Node1 -> Node2 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node2 [label="IntelliTool::onMouseRight\lPressed",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool.html#a1e6aa68ac5f3c2ca02319e5ef3f0c966",tooltip="A function managing the right click Pressed of a Mouse. Constructing the Canvas to draw on...."]; +} diff --git a/docs/html/class_intelli_tool_pen_afe3626ddff440ab125f4a2465c45427a_cgraph.dot b/docs/html/class_intelli_tool_pen_afe3626ddff440ab125f4a2465c45427a_cgraph.dot index 44ced84..70fa525 100644 --- a/docs/html/class_intelli_tool_pen_afe3626ddff440ab125f4a2465c45427a_cgraph.dot +++ b/docs/html/class_intelli_tool_pen_afe3626ddff440ab125f4a2465c45427a_cgraph.dot @@ -6,5 +6,9 @@ digraph "IntelliToolPen::onWheelScrolled" rankdir="LR"; Node1 [label="IntelliToolPen::onWheelScrolled",height=0.2,width=0.4,color="black", fillcolor="grey75", style="filled", fontcolor="black",tooltip="A function managing the scroll event. Changing penWidth relativ to value."]; Node1 -> Node2 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node2 [label="IntelliTool::onWheelScrolled",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool.html#a4dccfd4460255ccb866f336406a33574",tooltip="A function managing the scroll event. A positive value means scrolling outwards. Call this in child c..."]; + Node2 [label="IntelliToolsettings\l::getLineWidth",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_toolsettings.html#a68528dd3bad8f39ba19fa6b12a4e415a",tooltip=" "]; + Node1 -> Node3 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node3 [label="IntelliTool::onWheelScrolled",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool.html#a4dccfd4460255ccb866f336406a33574",tooltip="A function managing the scroll event. A positive value means scrolling outwards. Call this in child c..."]; + Node1 -> Node4 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node4 [label="IntelliToolsettings\l::setLineWidth",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_toolsettings.html#a906d37de6ee94b433d53fe3e598cc9fa",tooltip=" "]; } diff --git a/docs/html/class_intelli_tool_plain_tool-members.html b/docs/html/class_intelli_tool_plain_tool-members.html index 7ef7717..cc21cb3 100644 --- a/docs/html/class_intelli_tool_plain_tool-members.html +++ b/docs/html/class_intelli_tool_plain_tool-members.html @@ -93,21 +93,26 @@ $(document).ready(function(){initNavTree('class_intelli_tool_plain_tool.html',''

This is the complete list of members for IntelliToolPlainTool, including all inherited members.

- - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + +
ActiveIntelliToolprotected
AreaIntelliToolprotected
CanvasIntelliToolprotected
colorPickerIntelliToolprotected
drawingIntelliToolprotected
IntelliTool(PaintingArea *Area, IntelliColorPicker *colorPicker)IntelliTool
IntelliToolPlainTool(PaintingArea *Area, IntelliColorPicker *colorPicker)IntelliToolPlainTool
onMouseLeftPressed(int x, int y) overrideIntelliToolPlainToolvirtual
onMouseLeftReleased(int x, int y) overrideIntelliToolPlainToolvirtual
onMouseMoved(int x, int y) overrideIntelliToolPlainToolvirtual
onMouseRightPressed(int x, int y) overrideIntelliToolPlainToolvirtual
onMouseRightReleased(int x, int y) overrideIntelliToolPlainToolvirtual
onWheelScrolled(int value) overrideIntelliToolPlainToolvirtual
~IntelliTool()=0IntelliToolpure virtual
~IntelliToolPlainTool() overrideIntelliToolPlainToolvirtual
activeLayerIntelliToolprotected
ActiveTypeIntelliToolprotected
AreaIntelliToolprotected
CanvasIntelliToolprotected
colorPickerIntelliToolprotected
getIsDrawing()IntelliTool
getTooltype()IntelliTool
IntelliTool(PaintingArea *Area, IntelliColorPicker *colorPicker, IntelliToolsettings *Toolsettings)IntelliTool
IntelliToolPlainTool(PaintingArea *Area, IntelliColorPicker *colorPicker, IntelliToolsettings *Toolsettings)IntelliToolPlainTool
isDrawingIntelliToolprotected
onMouseLeftPressed(int x, int y) overrideIntelliToolPlainToolvirtual
onMouseLeftReleased(int x, int y) overrideIntelliToolPlainToolvirtual
onMouseMoved(int x, int y) overrideIntelliToolPlainToolvirtual
onMouseRightPressed(int x, int y) overrideIntelliToolPlainToolvirtual
onMouseRightReleased(int x, int y) overrideIntelliToolPlainToolvirtual
onWheelScrolled(int value) overrideIntelliToolPlainToolvirtual
ToolsettingsIntelliToolprotected
Tooltype enum nameIntelliTool
~IntelliTool()=0IntelliToolpure virtual
~IntelliToolPlainTool() overrideIntelliToolPlainToolvirtual
diff --git a/docs/html/class_intelli_tool_plain_tool.html b/docs/html/class_intelli_tool_plain_tool.html index 4de1bac..7cda6a5 100644 --- a/docs/html/class_intelli_tool_plain_tool.html +++ b/docs/html/class_intelli_tool_plain_tool.html @@ -101,19 +101,18 @@ $(document).ready(function(){initNavTree('class_intelli_tool_plain_tool.html',''
Inheritance diagram for IntelliToolPlainTool:
-
Inheritance graph
-
[legend]
-
-Collaboration diagram for IntelliToolPlainTool:
-
-
Collaboration graph
-
[legend]
+
+ + +IntelliTool + +
- - - + + + @@ -136,39 +135,60 @@ Public Member Functions - - - + + + + + + +

Public Member Functions

 IntelliToolPlainTool (PaintingArea *Area, IntelliColorPicker *colorPicker)
 A constructor setting the general paintingArea and colorPicker. More...
 
 IntelliToolPlainTool (PaintingArea *Area, IntelliColorPicker *colorPicker, IntelliToolsettings *Toolsettings)
 A constructor setting the general paintingArea and colorPicker. More...
 
virtual ~IntelliToolPlainTool () override
 A Destructor. More...
 
 A function managing the mouse moved event. More...
 
- Public Member Functions inherited from IntelliTool
 IntelliTool (PaintingArea *Area, IntelliColorPicker *colorPicker)
 A constructor setting the general Painting Area and colorPicker. More...
 
 IntelliTool (PaintingArea *Area, IntelliColorPicker *colorPicker, IntelliToolsettings *Toolsettings)
 A constructor setting the general Painting Area and colorPicker. More...
 
virtual ~IntelliTool ()=0
 An abstract Destructor. More...
 
Tooltype getTooltype ()
 
bool getIsDrawing ()
 
+ + + + + - - - + + + + + - - - + + +

Additional Inherited Members

- Public Types inherited from IntelliTool
enum  Tooltype {
+  Tooltype::CIRCLE, +Tooltype::FLOODFILL, +Tooltype::LINE, +Tooltype::PEN, +
+  Tooltype::PLAIN, +Tooltype::POLYGON, +Tooltype::RECTANGLE +
+ }
 
- Protected Attributes inherited from IntelliTool
PaintingAreaArea
 A pointer to the general PaintingArea to interact with. More...
 
Tooltype ActiveType
 
IntelliColorPickercolorPicker
 A pointer to the IntelliColorPicker of the PaintingArea to interact with, and get the colors. More...
 
LayerObjectActive
 A pointer to the underlying active Layer, do not work on this. This is used for data grabbing or previews. More...
 
IntelliToolsettingsToolsettings
 
LayerObjectactiveLayer
 A pointer to the underlying active Layer, do not work on this. This is used for data grabbing or previews. More...
 
LayerObjectCanvas
 A pointer to the drawing canvas of the tool, work on this. More...
 
bool drawing = false
 A flag checking if the user is currently drawing or not. More...
 
bool isDrawing = false
 A flag checking if the user is currently drawing or not. More...
 

Detailed Description

The IntelliToolPlainTool class represents a tool to fill the whole canvas with one color.

Definition at line 9 of file IntelliToolPlain.h.

Constructor & Destructor Documentation

- -

◆ IntelliToolPlainTool()

+ +

◆ IntelliToolPlainTool()

@@ -183,7 +203,13 @@ Additional Inherited Members IntelliColorPicker *  - colorPicker  + colorPicker, + + + + + IntelliToolsettings *  + Toolsettings  @@ -231,7 +257,7 @@ Additional Inherited Members

A Destructor.

-

Definition at line 9 of file IntelliToolPlain.cpp.

+

Definition at line 10 of file IntelliToolPlain.cpp.

@@ -281,12 +307,7 @@ Additional Inherited Members

Reimplemented from IntelliTool.

-

Definition at line 13 of file IntelliToolPlain.cpp.

-
-Here is the call graph for this function:
-
-
-
+

Definition at line 14 of file IntelliToolPlain.cpp.

@@ -335,12 +356,7 @@ Here is the call graph for this function:

Reimplemented from IntelliTool.

-

Definition at line 19 of file IntelliToolPlain.cpp.

-
-Here is the call graph for this function:
-
-
-
+

Definition at line 20 of file IntelliToolPlain.cpp.

@@ -389,12 +405,7 @@ Here is the call graph for this function:

Reimplemented from IntelliTool.

-

Definition at line 31 of file IntelliToolPlain.cpp.

-
-Here is the call graph for this function:
-
-
-
+

Definition at line 32 of file IntelliToolPlain.cpp.

@@ -443,12 +454,7 @@ Here is the call graph for this function:

Reimplemented from IntelliTool.

-

Definition at line 23 of file IntelliToolPlain.cpp.

-
-Here is the call graph for this function:
-
-
-
+

Definition at line 24 of file IntelliToolPlain.cpp.

@@ -497,12 +503,7 @@ Here is the call graph for this function:

Reimplemented from IntelliTool.

-

Definition at line 27 of file IntelliToolPlain.cpp.

-
-Here is the call graph for this function:
-
-
-
+

Definition at line 28 of file IntelliToolPlain.cpp.

@@ -540,12 +541,7 @@ Here is the call graph for this function:

Reimplemented from IntelliTool.

-

Definition at line 35 of file IntelliToolPlain.cpp.

-
-Here is the call graph for this function:
-
-
-
+

Definition at line 36 of file IntelliToolPlain.cpp.

diff --git a/docs/html/class_intelli_tool_plain_tool.js b/docs/html/class_intelli_tool_plain_tool.js index a3b2395..4fd627b 100644 --- a/docs/html/class_intelli_tool_plain_tool.js +++ b/docs/html/class_intelli_tool_plain_tool.js @@ -1,6 +1,6 @@ var class_intelli_tool_plain_tool = [ - [ "IntelliToolPlainTool", "class_intelli_tool_plain_tool.html#a0ff0b9f7b78b763683076e4417236859", null ], + [ "IntelliToolPlainTool", "class_intelli_tool_plain_tool.html#a816bcd6aea046994420969bed8b139d2", null ], [ "~IntelliToolPlainTool", "class_intelli_tool_plain_tool.html#a91fe568be05c075814d67440472bb658", null ], [ "onMouseLeftPressed", "class_intelli_tool_plain_tool.html#ab786dd5fa80af863246013d43c4b7ac9", null ], [ "onMouseLeftReleased", "class_intelli_tool_plain_tool.html#ac23f5d0f07e42fd7c2ea3fc1347da400", null ], diff --git a/docs/html/class_intelli_tool_plain_tool.png b/docs/html/class_intelli_tool_plain_tool.png new file mode 100644 index 0000000000000000000000000000000000000000..098101431e0ed4a6f68560d929ef795ef2b52ac9 GIT binary patch literal 435 zcmeAS@N?(olHy`uVBq!ia0vp^r9d3O!3-n?cAw$~QW60^A+G=b{|7SPy?Zx%_M8bo z78oBmaDcD(z*8WXqa?^Lm;tB=1g@S6F=Aj~bnisMvx` z658%HN%ig;!(%t38fNn_oPC)j+a`BQ@7nY&&D;9F#(&)q&FE98-JqJsy5Y!LhG{!Q z4+w2%ig*;p;C+YdgRNrA1sNuXBLGkCiCxvX Node3 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; Node4 [label="QWidget",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; - Node5 -> Node2 [dir="back",color="darkorchid3",fontsize="10",style="dashed",label=" colorPicker" ,fontname="Helvetica"]; + Node5 -> Node3 [dir="back",color="darkorchid3",fontsize="10",style="dashed",label=" colorPicker" ,fontname="Helvetica"]; Node5 [label="IntelliColorPicker",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_color_picker.html",tooltip="The IntelliColorPicker manages the selected colors for one whole project."]; - Node6 -> Node2 [dir="back",color="darkorchid3",fontsize="10",style="dashed",label=" Canvas\nActive" ,fontname="Helvetica"]; - Node6 [label="LayerObject",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$struct_layer_object.html",tooltip="The LayerObject struct holds all the information needed to construct a layer."]; - Node7 -> Node6 [dir="back",color="darkorchid3",fontsize="10",style="dashed",label=" image" ,fontname="Helvetica"]; - Node7 [label="IntelliImage",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_image.html",tooltip="An abstract class which manages the basic IntelliImage operations."]; + Node6 -> Node3 [dir="back",color="darkorchid3",fontsize="10",style="dashed",label=" Toolsettings" ,fontname="Helvetica"]; + Node6 [label="IntelliToolsettings",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_toolsettings.html",tooltip=" "]; + Node6 -> Node2 [dir="back",color="darkorchid3",fontsize="10",style="dashed",label=" Toolsettings" ,fontname="Helvetica"]; + Node5 -> Node2 [dir="back",color="darkorchid3",fontsize="10",style="dashed",label=" colorPicker" ,fontname="Helvetica"]; + Node7 -> Node2 [dir="back",color="darkorchid3",fontsize="10",style="dashed",label=" Canvas\nactiveLayer" ,fontname="Helvetica"]; + Node7 [label="LayerObject",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$struct_layer_object.html",tooltip="The LayerObject struct holds all the information needed to construct a layer."]; + Node8 -> Node7 [dir="back",color="darkorchid3",fontsize="10",style="dashed",label=" image" ,fontname="Helvetica"]; + Node8 [label="IntelliImage",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_image.html",tooltip="An abstract class which manages the basic IntelliImage operations."]; } diff --git a/docs/html/class_intelli_tool_plain_tool_a91fe568be05c075814d67440472bb658_cgraph.dot b/docs/html/class_intelli_tool_plain_tool_a91fe568be05c075814d67440472bb658_cgraph.dot new file mode 100644 index 0000000..3f08fe6 --- /dev/null +++ b/docs/html/class_intelli_tool_plain_tool_a91fe568be05c075814d67440472bb658_cgraph.dot @@ -0,0 +1,10 @@ +digraph "IntelliToolPlainTool::~IntelliToolPlainTool" +{ + // LATEX_PDF_SIZE + edge [fontname="Helvetica",fontsize="10",labelfontname="Helvetica",labelfontsize="10"]; + node [fontname="Helvetica",fontsize="10",shape=record]; + rankdir="LR"; + Node1 [label="IntelliToolPlainTool\l::~IntelliToolPlainTool",height=0.2,width=0.4,color="black", fillcolor="grey75", style="filled", fontcolor="black",tooltip="A Destructor."]; + Node1 -> Node2 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node2 [label="IntelliTool::onMouseRight\lPressed",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool.html#a1e6aa68ac5f3c2ca02319e5ef3f0c966",tooltip="A function managing the right click Pressed of a Mouse. Constructing the Canvas to draw on...."]; +} diff --git a/docs/html/class_intelli_tool_polygon-members.html b/docs/html/class_intelli_tool_polygon-members.html index 975fc52..4d69fcd 100644 --- a/docs/html/class_intelli_tool_polygon-members.html +++ b/docs/html/class_intelli_tool_polygon-members.html @@ -93,19 +93,23 @@ $(document).ready(function(){initNavTree('class_intelli_tool_polygon.html','');}

This is the complete list of members for IntelliToolPolygon, including all inherited members.

- - - - - - - + + + + + + + + + + +
ActiveIntelliToolprotected
AreaIntelliToolprotected
CanvasIntelliToolprotected
colorPickerIntelliToolprotected
drawingIntelliToolprotected
IntelliTool(PaintingArea *Area, IntelliColorPicker *colorPicker)IntelliTool
IntelliToolPolygon(PaintingArea *Area, IntelliColorPicker *colorPicker)IntelliToolPolygon
activeLayerIntelliToolprotected
ActiveTypeIntelliToolprotected
AreaIntelliToolprotected
CanvasIntelliToolprotected
colorPickerIntelliToolprotected
getIsDrawing()IntelliTool
getTooltype()IntelliTool
IntelliTool(PaintingArea *Area, IntelliColorPicker *colorPicker, IntelliToolsettings *Toolsettings)IntelliTool
IntelliToolPolygon(PaintingArea *Area, IntelliColorPicker *colorPicker, IntelliToolsettings *Toolsettings)IntelliToolPolygon
onMouseLeftPressed(int x, int y) overrideIntelliToolPolygonvirtual
onMouseLeftReleased(int x, int y) overrideIntelliToolPolygonvirtual
onMouseMoved(int x, int y) overrideIntelliToolPolygonvirtual
onMouseRightPressed(int x, int y) overrideIntelliToolPolygonvirtual
onMouseRightReleased(int x, int y) overrideIntelliToolPolygonvirtual
onWheelScrolled(int value) overrideIntelliToolPolygonvirtual
ToolsettingsIntelliToolprotected
Tooltype enum nameIntelliTool
~IntelliTool()=0IntelliToolpure virtual
~IntelliToolPolygon() overrideIntelliToolPolygon
diff --git a/docs/html/class_intelli_tool_polygon.html b/docs/html/class_intelli_tool_polygon.html index f9de686..fcc8109 100644 --- a/docs/html/class_intelli_tool_polygon.html +++ b/docs/html/class_intelli_tool_polygon.html @@ -101,19 +101,18 @@ $(document).ready(function(){initNavTree('class_intelli_tool_polygon.html','');}
Inheritance diagram for IntelliToolPolygon:
-
Inheritance graph
-
[legend]
-
-Collaboration diagram for IntelliToolPolygon:
-
-
Collaboration graph
-
[legend]
+
+ + +IntelliTool + +
- - - + + + @@ -136,39 +135,60 @@ Public Member Functions - - - + + + + + + +

Public Member Functions

 IntelliToolPolygon (PaintingArea *Area, IntelliColorPicker *colorPicker)
 A constructor setting the general paintingArea and colorPicker. More...
 
 IntelliToolPolygon (PaintingArea *Area, IntelliColorPicker *colorPicker, IntelliToolsettings *Toolsettings)
 A constructor setting the general paintingArea and colorPicker. More...
 
 ~IntelliToolPolygon () override
 A Destructor. More...
 
 A function managing the mouse moved event. More...
 
- Public Member Functions inherited from IntelliTool
 IntelliTool (PaintingArea *Area, IntelliColorPicker *colorPicker)
 A constructor setting the general Painting Area and colorPicker. More...
 
 IntelliTool (PaintingArea *Area, IntelliColorPicker *colorPicker, IntelliToolsettings *Toolsettings)
 A constructor setting the general Painting Area and colorPicker. More...
 
virtual ~IntelliTool ()=0
 An abstract Destructor. More...
 
Tooltype getTooltype ()
 
bool getIsDrawing ()
 
+ + + + + - - - + + + + + - - - + + +

Additional Inherited Members

- Public Types inherited from IntelliTool
enum  Tooltype {
+  Tooltype::CIRCLE, +Tooltype::FLOODFILL, +Tooltype::LINE, +Tooltype::PEN, +
+  Tooltype::PLAIN, +Tooltype::POLYGON, +Tooltype::RECTANGLE +
+ }
 
- Protected Attributes inherited from IntelliTool
PaintingAreaArea
 A pointer to the general PaintingArea to interact with. More...
 
Tooltype ActiveType
 
IntelliColorPickercolorPicker
 A pointer to the IntelliColorPicker of the PaintingArea to interact with, and get the colors. More...
 
LayerObjectActive
 A pointer to the underlying active Layer, do not work on this. This is used for data grabbing or previews. More...
 
IntelliToolsettingsToolsettings
 
LayerObjectactiveLayer
 A pointer to the underlying active Layer, do not work on this. This is used for data grabbing or previews. More...
 
LayerObjectCanvas
 A pointer to the drawing canvas of the tool, work on this. More...
 
bool drawing = false
 A flag checking if the user is currently drawing or not. More...
 
bool isDrawing = false
 A flag checking if the user is currently drawing or not. More...
 

Detailed Description

The IntelliToolPolygon managed the Drawing of Polygonforms.

Definition at line 11 of file IntelliToolPolygon.h.

Constructor & Destructor Documentation

- -

◆ IntelliToolPolygon()

+ +

◆ IntelliToolPolygon()

@@ -183,7 +203,13 @@ Additional Inherited Members IntelliColorPicker *  - colorPicker  + colorPicker, + + + + + IntelliToolsettings *  + Toolsettings  @@ -281,12 +307,7 @@ Additional Inherited Members

Reimplemented from IntelliTool.

-

Definition at line 19 of file IntelliToolPolygon.cpp.

-
-Here is the call graph for this function:
-
-
-
+

Definition at line 21 of file IntelliToolPolygon.cpp.

@@ -335,12 +356,7 @@ Here is the call graph for this function:

Reimplemented from IntelliTool.

-

Definition at line 50 of file IntelliToolPolygon.cpp.

-
-Here is the call graph for this function:
-
-
-
+

Definition at line 71 of file IntelliToolPolygon.cpp.

@@ -389,12 +405,7 @@ Here is the call graph for this function:

Reimplemented from IntelliTool.

-

Definition at line 91 of file IntelliToolPolygon.cpp.

-
-Here is the call graph for this function:
-
-
-
+

Definition at line 108 of file IntelliToolPolygon.cpp.

@@ -443,12 +454,7 @@ Here is the call graph for this function:

Reimplemented from IntelliTool.

-

Definition at line 43 of file IntelliToolPolygon.cpp.

-
-Here is the call graph for this function:
-
-
-
+

Definition at line 63 of file IntelliToolPolygon.cpp.

@@ -497,12 +503,7 @@ Here is the call graph for this function:

Reimplemented from IntelliTool.

-

Definition at line 75 of file IntelliToolPolygon.cpp.

-
-Here is the call graph for this function:
-
-
-
+

Definition at line 97 of file IntelliToolPolygon.cpp.

@@ -540,12 +541,7 @@ Here is the call graph for this function:

Reimplemented from IntelliTool.

-

Definition at line 79 of file IntelliToolPolygon.cpp.

-
-Here is the call graph for this function:
-
-
-
+

Definition at line 101 of file IntelliToolPolygon.cpp.

diff --git a/docs/html/class_intelli_tool_polygon.js b/docs/html/class_intelli_tool_polygon.js index b8a0c43..fc4c508 100644 --- a/docs/html/class_intelli_tool_polygon.js +++ b/docs/html/class_intelli_tool_polygon.js @@ -1,6 +1,6 @@ var class_intelli_tool_polygon = [ - [ "IntelliToolPolygon", "class_intelli_tool_polygon.html#ae6e5f07fdf88d12029410a032dc4921d", null ], + [ "IntelliToolPolygon", "class_intelli_tool_polygon.html#a3c39299dfffa5b8a45e72a4c0b48b32c", null ], [ "~IntelliToolPolygon", "class_intelli_tool_polygon.html#a087cbf2254010989df6106a357471499", null ], [ "onMouseLeftPressed", "class_intelli_tool_polygon.html#ad5d3b741be6d0647a9cdc9da2cb8bc3d", null ], [ "onMouseLeftReleased", "class_intelli_tool_polygon.html#a4e1473ff408ae2e11cf6a43f6f575f21", null ], diff --git a/docs/html/class_intelli_tool_polygon.png b/docs/html/class_intelli_tool_polygon.png new file mode 100644 index 0000000000000000000000000000000000000000..15b5f937beefe91ac6b422b20f0d976e84d74e64 GIT binary patch literal 456 zcmV;(0XP1MP)B;Nm#2Q(xxEvR&sJ26kW&^oIxZY=mqt+fV1m83AzCrN(%HDB4j zx{tE_Nt(y=y`*Uz_q|H~Yu~Mq>)fYaUr*kO?5mRWf<3;T-^hk$&V9!wbmL3z!5G0fdu<5msnx2@2U$GM*F_LKhp=` zNcsT$NFRV7=>za1eE@!>55SM~0r-(VfDKA1B@hZg80iD><22vUnydSGv=%Up+ma3M z*!m9Nt5lEGttSCCnSHlH?t5-iudkOY5SIkxb0000 Node3 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; Node4 [label="QWidget",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; - Node5 -> Node2 [dir="back",color="darkorchid3",fontsize="10",style="dashed",label=" colorPicker" ,fontname="Helvetica"]; + Node5 -> Node3 [dir="back",color="darkorchid3",fontsize="10",style="dashed",label=" colorPicker" ,fontname="Helvetica"]; Node5 [label="IntelliColorPicker",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_color_picker.html",tooltip="The IntelliColorPicker manages the selected colors for one whole project."]; - Node6 -> Node2 [dir="back",color="darkorchid3",fontsize="10",style="dashed",label=" Canvas\nActive" ,fontname="Helvetica"]; - Node6 [label="LayerObject",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$struct_layer_object.html",tooltip="The LayerObject struct holds all the information needed to construct a layer."]; - Node7 -> Node6 [dir="back",color="darkorchid3",fontsize="10",style="dashed",label=" image" ,fontname="Helvetica"]; - Node7 [label="IntelliImage",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_image.html",tooltip="An abstract class which manages the basic IntelliImage operations."]; + Node6 -> Node3 [dir="back",color="darkorchid3",fontsize="10",style="dashed",label=" Toolsettings" ,fontname="Helvetica"]; + Node6 [label="IntelliToolsettings",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_toolsettings.html",tooltip=" "]; + Node6 -> Node2 [dir="back",color="darkorchid3",fontsize="10",style="dashed",label=" Toolsettings" ,fontname="Helvetica"]; + Node5 -> Node2 [dir="back",color="darkorchid3",fontsize="10",style="dashed",label=" colorPicker" ,fontname="Helvetica"]; + Node7 -> Node2 [dir="back",color="darkorchid3",fontsize="10",style="dashed",label=" Canvas\nactiveLayer" ,fontname="Helvetica"]; + Node7 [label="LayerObject",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$struct_layer_object.html",tooltip="The LayerObject struct holds all the information needed to construct a layer."]; + Node8 -> Node7 [dir="back",color="darkorchid3",fontsize="10",style="dashed",label=" image" ,fontname="Helvetica"]; + Node8 [label="IntelliImage",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_image.html",tooltip="An abstract class which manages the basic IntelliImage operations."]; } diff --git a/docs/html/class_intelli_tool_polygon_a087cbf2254010989df6106a357471499_cgraph.dot b/docs/html/class_intelli_tool_polygon_a087cbf2254010989df6106a357471499_cgraph.dot new file mode 100644 index 0000000..04ae44e --- /dev/null +++ b/docs/html/class_intelli_tool_polygon_a087cbf2254010989df6106a357471499_cgraph.dot @@ -0,0 +1,10 @@ +digraph "IntelliToolPolygon::~IntelliToolPolygon" +{ + // LATEX_PDF_SIZE + edge [fontname="Helvetica",fontsize="10",labelfontname="Helvetica",labelfontsize="10"]; + node [fontname="Helvetica",fontsize="10",shape=record]; + rankdir="LR"; + Node1 [label="IntelliToolPolygon\l::~IntelliToolPolygon",height=0.2,width=0.4,color="black", fillcolor="grey75", style="filled", fontcolor="black",tooltip="A Destructor."]; + Node1 -> Node2 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node2 [label="IntelliTool::onMouseRight\lPressed",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool.html#a1e6aa68ac5f3c2ca02319e5ef3f0c966",tooltip="A function managing the right click Pressed of a Mouse. Constructing the Canvas to draw on...."]; +} diff --git a/docs/html/class_intelli_tool_polygon_a4e1473ff408ae2e11cf6a43f6f575f21_cgraph.dot b/docs/html/class_intelli_tool_polygon_a4e1473ff408ae2e11cf6a43f6f575f21_cgraph.dot index f8717dc..798ebb4 100644 --- a/docs/html/class_intelli_tool_polygon_a4e1473ff408ae2e11cf6a43f6f575f21_cgraph.dot +++ b/docs/html/class_intelli_tool_polygon_a4e1473ff408ae2e11cf6a43f6f575f21_cgraph.dot @@ -6,7 +6,7 @@ digraph "IntelliToolPolygon::onMouseLeftReleased" rankdir="LR"; Node1 [label="IntelliToolPolygon\l::onMouseLeftReleased",height=0.2,width=0.4,color="black", fillcolor="grey75", style="filled", fontcolor="black",tooltip="A function managing the left click released of a mouse. Merging the fill to the active layer."]; Node1 -> Node2 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node2 [label="IntelliHelper::calculate\lTriangles",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$namespace_intelli_helper.html#a214dc3624ba4562a03dc922e3dd7b617",tooltip="A function to split a polygon in its spanning traingles by using Meisters Theorem of graph theory by ..."]; + Node2 [label="IntelliTriangulation\l::calculateTriangles",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$namespace_intelli_triangulation.html#acdaf1ed598e868b25e9e06d580da32e5",tooltip="A function to split a polygon in its spanning traingles by using Meisters Theorem of graph theory by ..."]; Node1 -> Node3 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; Node3 [label="IntelliImage::drawLine",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_image.html#af8eddbd9aa54c8d37590d1d4bf8dce31",tooltip="A function that draws A Line between two given Points in a given color."]; Node1 -> Node4 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; @@ -14,15 +14,19 @@ digraph "IntelliToolPolygon::onMouseLeftReleased" Node1 -> Node5 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; Node5 [label="IntelliColorPicker\l::getFirstColor",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_color_picker.html#aae2eb27b928fe9388b9398b0556303b7",tooltip="A function to read the primary selected color."]; Node1 -> Node6 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node6 [label="IntelliColorPicker\l::getSecondColor",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_color_picker.html#a55568fbf5dc783f06284b7031ffe9415",tooltip="A function to read the secondary selected color."]; + Node6 [label="IntelliToolsettings\l::getInnerAlpha",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_toolsettings.html#a7d6ce2054ec4bcba7629dc2b514b6b5c",tooltip=" "]; Node1 -> Node7 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node7 [label="IntelliHelper::isInPolygon",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$namespace_intelli_helper.html#a44d516b3e619e2a743e9c98dd75cf901",tooltip="A function to check if a point lies in a polygon by checking its spanning triangles."]; - Node7 -> Node8 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node8 [label="IntelliHelper::isInTriangle",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$namespace_intelli_helper.html#a9fcfe72f00e870be4a8ab9f2e17483c9",tooltip="A function to check if a given point is in a triangle."]; - Node8 -> Node9 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node9 [label="IntelliHelper::sign",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$namespace_intelli_helper.html#afdd9fe78cc5d21b59642910220768149",tooltip="A function to get the 2*area of a traingle, using its determinat."]; - Node1 -> Node10 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node10 [label="IntelliTool::onMouseLeft\lReleased",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool.html#a906a2575c16c8a33cb2a5197f8d8cc5b",tooltip="A function managing the left click Released of a Mouse. Call this in child classes!"]; + Node7 [label="IntelliToolsettings\l::getLineWidth",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_toolsettings.html#a68528dd3bad8f39ba19fa6b12a4e415a",tooltip=" "]; + Node1 -> Node8 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node8 [label="IntelliColorPicker\l::getSecondColor",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_color_picker.html#a55568fbf5dc783f06284b7031ffe9415",tooltip="A function to read the secondary selected color."]; + Node1 -> Node9 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node9 [label="IntelliTriangulation\l::isInPolygon",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$namespace_intelli_triangulation.html#a00621e2d8708fe2e8966d7d79b64e186",tooltip="A function to check if a point lies in a polygon by checking its spanning triangles."]; + Node9 -> Node10 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node10 [label="IntelliTriangulation\l::isInTriangle",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$namespace_intelli_triangulation.html#ac150fee67fd41a451bd2592f10e00197",tooltip="A function to check if a given point is in a triangle."]; Node10 -> Node11 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node11 [label="IntelliImage::calculateVisiblity",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_image.html#aebbced93f4744fad81b7f141b21f4ab2",tooltip="An abstract function that calculates the visiblity of the Image data if needed."]; + Node11 [label="IntelliTriangulation\l::sign",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$namespace_intelli_triangulation.html#af9af549a7faff35a74c1265b290ea0ca",tooltip="A function to get the 2*area of a traingle, using its determinat."]; + Node1 -> Node12 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node12 [label="IntelliTool::onMouseLeft\lReleased",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool.html#a906a2575c16c8a33cb2a5197f8d8cc5b",tooltip="A function managing the left click Released of a Mouse. Call this in child classes!"]; + Node12 -> Node13 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node13 [label="IntelliImage::calculateVisiblity",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_image.html#aebbced93f4744fad81b7f141b21f4ab2",tooltip="An abstract function that calculates the visiblity of the Image data if needed."]; } diff --git a/docs/html/class_intelli_tool_polygon_a713103300c9f023d64d9eec5ac05dd17_cgraph.dot b/docs/html/class_intelli_tool_polygon_a713103300c9f023d64d9eec5ac05dd17_cgraph.dot index ecdef01..a022779 100644 --- a/docs/html/class_intelli_tool_polygon_a713103300c9f023d64d9eec5ac05dd17_cgraph.dot +++ b/docs/html/class_intelli_tool_polygon_a713103300c9f023d64d9eec5ac05dd17_cgraph.dot @@ -6,5 +6,9 @@ digraph "IntelliToolPolygon::onWheelScrolled" rankdir="LR"; Node1 [label="IntelliToolPolygon\l::onWheelScrolled",height=0.2,width=0.4,color="black", fillcolor="grey75", style="filled", fontcolor="black",tooltip="A function managing the scroll event. CHanging the lineWidth relative to value."]; Node1 -> Node2 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node2 [label="IntelliTool::onWheelScrolled",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool.html#a4dccfd4460255ccb866f336406a33574",tooltip="A function managing the scroll event. A positive value means scrolling outwards. Call this in child c..."]; + Node2 [label="IntelliToolsettings\l::getLineWidth",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_toolsettings.html#a68528dd3bad8f39ba19fa6b12a4e415a",tooltip=" "]; + Node1 -> Node3 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node3 [label="IntelliTool::onWheelScrolled",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool.html#a4dccfd4460255ccb866f336406a33574",tooltip="A function managing the scroll event. A positive value means scrolling outwards. Call this in child c..."]; + Node1 -> Node4 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node4 [label="IntelliToolsettings\l::setLineWidth",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_toolsettings.html#a906d37de6ee94b433d53fe3e598cc9fa",tooltip=" "]; } diff --git a/docs/html/class_intelli_tool_polygon_ad5d3b741be6d0647a9cdc9da2cb8bc3d_cgraph.dot b/docs/html/class_intelli_tool_polygon_ad5d3b741be6d0647a9cdc9da2cb8bc3d_cgraph.dot index 20f9501..2b521ba 100644 --- a/docs/html/class_intelli_tool_polygon_ad5d3b741be6d0647a9cdc9da2cb8bc3d_cgraph.dot +++ b/docs/html/class_intelli_tool_polygon_ad5d3b741be6d0647a9cdc9da2cb8bc3d_cgraph.dot @@ -6,14 +6,34 @@ digraph "IntelliToolPolygon::onMouseLeftPressed" rankdir="LR"; Node1 [label="IntelliToolPolygon\l::onMouseLeftPressed",height=0.2,width=0.4,color="black", fillcolor="grey75", style="filled", fontcolor="black",tooltip="A function managing the left click pressed of a mouse. Setting polygon points."]; Node1 -> Node2 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node2 [label="IntelliImage::calculateVisiblity",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_image.html#aebbced93f4744fad81b7f141b21f4ab2",tooltip="An abstract function that calculates the visiblity of the Image data if needed."]; + Node2 [label="IntelliTriangulation\l::calculateTriangles",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$namespace_intelli_triangulation.html#acdaf1ed598e868b25e9e06d580da32e5",tooltip="A function to split a polygon in its spanning traingles by using Meisters Theorem of graph theory by ..."]; Node1 -> Node3 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node3 [label="IntelliImage::drawLine",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_image.html#af8eddbd9aa54c8d37590d1d4bf8dce31",tooltip="A function that draws A Line between two given Points in a given color."]; + Node3 [label="IntelliImage::calculateVisiblity",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_image.html#aebbced93f4744fad81b7f141b21f4ab2",tooltip="An abstract function that calculates the visiblity of the Image data if needed."]; Node1 -> Node4 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node4 [label="IntelliImage::drawPoint",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_image.html#a2e787f1b333b59401643936ebb3dcfe1",tooltip="A."]; + Node4 [label="IntelliImage::drawLine",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_image.html#af8eddbd9aa54c8d37590d1d4bf8dce31",tooltip="A function that draws A Line between two given Points in a given color."]; Node1 -> Node5 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node5 [label="IntelliColorPicker\l::getFirstColor",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_color_picker.html#aae2eb27b928fe9388b9398b0556303b7",tooltip="A function to read the primary selected color."]; + Node5 [label="IntelliImage::drawPoint",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_image.html#a2e787f1b333b59401643936ebb3dcfe1",tooltip="A."]; Node1 -> Node6 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node6 [label="IntelliTool::onMouseLeft\lPressed",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool.html#a34b7ef1dde96b94a0ce450a25ae1778c",tooltip="A function managing the left click Pressed of a Mouse. Resetting the current draw...."]; - Node6 -> Node2 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node6 [label="IntelliColorPicker\l::getFirstColor",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_color_picker.html#aae2eb27b928fe9388b9398b0556303b7",tooltip="A function to read the primary selected color."]; + Node1 -> Node7 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node7 [label="PaintingArea::getHeightOf\lActive",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_painting_area.html#ac576f58aad03b4dcd47611b6a4b9abb4",tooltip="The getHeightOfActive gets the vertical dimensions of the active layer."]; + Node1 -> Node8 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node8 [label="IntelliToolsettings\l::getLineWidth",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_toolsettings.html#a68528dd3bad8f39ba19fa6b12a4e415a",tooltip=" "]; + Node1 -> Node9 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node9 [label="PaintingArea::getPolygon\lDataOfRealLayer",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_painting_area.html#a7ae21fd031ee1c04f92e042e86be0a90",tooltip=" "]; + Node1 -> Node10 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node10 [label="PaintingArea::getTypeOfImage\lRealLayer",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_painting_area.html#ae92b27dfd09573c224d2ae1958d3bead",tooltip=" "]; + Node1 -> Node11 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node11 [label="PaintingArea::getWidthOf\lActive",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_painting_area.html#a675ee91b26b1c58be6d833f279d81597",tooltip="The getWidthOfActive gets the horizontal dimensions of the active layer."]; + Node1 -> Node12 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node12 [label="IntelliTriangulation\l::isInPolygon",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$namespace_intelli_triangulation.html#a00621e2d8708fe2e8966d7d79b64e186",tooltip="A function to check if a point lies in a polygon by checking its spanning triangles."]; + Node12 -> Node13 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node13 [label="IntelliTriangulation\l::isInTriangle",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$namespace_intelli_triangulation.html#ac150fee67fd41a451bd2592f10e00197",tooltip="A function to check if a given point is in a triangle."]; + Node13 -> Node14 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node14 [label="IntelliTriangulation\l::sign",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$namespace_intelli_triangulation.html#af9af549a7faff35a74c1265b290ea0ca",tooltip="A function to get the 2*area of a traingle, using its determinat."]; + Node1 -> Node15 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node15 [label="IntelliTool::onMouseLeft\lPressed",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool.html#a34b7ef1dde96b94a0ce450a25ae1778c",tooltip="A function managing the left click Pressed of a Mouse. Resetting the current draw...."]; + Node15 -> Node3 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node1 -> Node16 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node16 [label="IntelliTool::onMouseRight\lPressed",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool.html#a1e6aa68ac5f3c2ca02319e5ef3f0c966",tooltip="A function managing the right click Pressed of a Mouse. Constructing the Canvas to draw on...."]; } diff --git a/docs/html/class_intelli_tool_rectangle-members.html b/docs/html/class_intelli_tool_rectangle-members.html index b532908..0a06328 100644 --- a/docs/html/class_intelli_tool_rectangle-members.html +++ b/docs/html/class_intelli_tool_rectangle-members.html @@ -93,21 +93,26 @@ $(document).ready(function(){initNavTree('class_intelli_tool_rectangle.html','')

This is the complete list of members for IntelliToolRectangle, including all inherited members.

- - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + +
ActiveIntelliToolprotected
AreaIntelliToolprotected
CanvasIntelliToolprotected
colorPickerIntelliToolprotected
drawingIntelliToolprotected
IntelliTool(PaintingArea *Area, IntelliColorPicker *colorPicker)IntelliTool
IntelliToolRectangle(PaintingArea *Area, IntelliColorPicker *colorPicker)IntelliToolRectangle
onMouseLeftPressed(int x, int y) overrideIntelliToolRectanglevirtual
onMouseLeftReleased(int x, int y) overrideIntelliToolRectanglevirtual
onMouseMoved(int x, int y) overrideIntelliToolRectanglevirtual
onMouseRightPressed(int x, int y) overrideIntelliToolRectanglevirtual
onMouseRightReleased(int x, int y) overrideIntelliToolRectanglevirtual
onWheelScrolled(int value) overrideIntelliToolRectanglevirtual
~IntelliTool()=0IntelliToolpure virtual
~IntelliToolRectangle() overrideIntelliToolRectanglevirtual
activeLayerIntelliToolprotected
ActiveTypeIntelliToolprotected
AreaIntelliToolprotected
CanvasIntelliToolprotected
colorPickerIntelliToolprotected
getIsDrawing()IntelliTool
getTooltype()IntelliTool
IntelliTool(PaintingArea *Area, IntelliColorPicker *colorPicker, IntelliToolsettings *Toolsettings)IntelliTool
IntelliToolRectangle(PaintingArea *Area, IntelliColorPicker *colorPicker, IntelliToolsettings *Toolsettings)IntelliToolRectangle
isDrawingIntelliToolprotected
onMouseLeftPressed(int x, int y) overrideIntelliToolRectanglevirtual
onMouseLeftReleased(int x, int y) overrideIntelliToolRectanglevirtual
onMouseMoved(int x, int y) overrideIntelliToolRectanglevirtual
onMouseRightPressed(int x, int y) overrideIntelliToolRectanglevirtual
onMouseRightReleased(int x, int y) overrideIntelliToolRectanglevirtual
onWheelScrolled(int value) overrideIntelliToolRectanglevirtual
ToolsettingsIntelliToolprotected
Tooltype enum nameIntelliTool
~IntelliTool()=0IntelliToolpure virtual
~IntelliToolRectangle() overrideIntelliToolRectanglevirtual
diff --git a/docs/html/class_intelli_tool_rectangle.html b/docs/html/class_intelli_tool_rectangle.html index 1b57256..17ad363 100644 --- a/docs/html/class_intelli_tool_rectangle.html +++ b/docs/html/class_intelli_tool_rectangle.html @@ -101,19 +101,18 @@ $(document).ready(function(){initNavTree('class_intelli_tool_rectangle.html','')
Inheritance diagram for IntelliToolRectangle:
-
Inheritance graph
-
[legend]
-
-Collaboration diagram for IntelliToolRectangle:
-
-
Collaboration graph
-
[legend]
+
+ + +IntelliTool + +
- - - + + + @@ -136,39 +135,60 @@ Public Member Functions - - - + + + + + + +

Public Member Functions

 IntelliToolRectangle (PaintingArea *Area, IntelliColorPicker *colorPicker)
 A constructor setting the general paintingArea and colorPicker. And reading in the alphaInner and edgeWidth. More...
 
 IntelliToolRectangle (PaintingArea *Area, IntelliColorPicker *colorPicker, IntelliToolsettings *Toolsettings)
 A constructor setting the general paintingArea and colorPicker. And reading in the alphaInner and edgeWidth. More...
 
virtual ~IntelliToolRectangle () override
 A Destructor. More...
 
 A function managing the mouse moved event.Drawing a rectangle to currrent mouse position. More...
 
- Public Member Functions inherited from IntelliTool
 IntelliTool (PaintingArea *Area, IntelliColorPicker *colorPicker)
 A constructor setting the general Painting Area and colorPicker. More...
 
 IntelliTool (PaintingArea *Area, IntelliColorPicker *colorPicker, IntelliToolsettings *Toolsettings)
 A constructor setting the general Painting Area and colorPicker. More...
 
virtual ~IntelliTool ()=0
 An abstract Destructor. More...
 
Tooltype getTooltype ()
 
bool getIsDrawing ()
 
+ + + + + - - - + + + + + - - - + + +

Additional Inherited Members

- Public Types inherited from IntelliTool
enum  Tooltype {
+  Tooltype::CIRCLE, +Tooltype::FLOODFILL, +Tooltype::LINE, +Tooltype::PEN, +
+  Tooltype::PLAIN, +Tooltype::POLYGON, +Tooltype::RECTANGLE +
+ }
 
- Protected Attributes inherited from IntelliTool
PaintingAreaArea
 A pointer to the general PaintingArea to interact with. More...
 
Tooltype ActiveType
 
IntelliColorPickercolorPicker
 A pointer to the IntelliColorPicker of the PaintingArea to interact with, and get the colors. More...
 
LayerObjectActive
 A pointer to the underlying active Layer, do not work on this. This is used for data grabbing or previews. More...
 
IntelliToolsettingsToolsettings
 
LayerObjectactiveLayer
 A pointer to the underlying active Layer, do not work on this. This is used for data grabbing or previews. More...
 
LayerObjectCanvas
 A pointer to the drawing canvas of the tool, work on this. More...
 
bool drawing = false
 A flag checking if the user is currently drawing or not. More...
 
bool isDrawing = false
 A flag checking if the user is currently drawing or not. More...
 

Detailed Description

The IntelliToolRectangle class represents a tool to draw a rectangle.

Definition at line 11 of file IntelliToolRectangle.h.

Constructor & Destructor Documentation

- -

◆ IntelliToolRectangle()

+ +

◆ IntelliToolRectangle()

@@ -183,7 +203,13 @@ Additional Inherited Members IntelliColorPicker *  - colorPicker  + colorPicker, + + + + + IntelliToolsettings *  + Toolsettings  @@ -231,7 +257,7 @@ Additional Inherited Members

A Destructor.

-

Definition at line 11 of file IntelliToolRectangle.cpp.

+

Definition at line 10 of file IntelliToolRectangle.cpp.

@@ -281,12 +307,7 @@ Additional Inherited Members

Reimplemented from IntelliTool.

-

Definition at line 41 of file IntelliToolRectangle.cpp.

-
-Here is the call graph for this function:
-
-
-
+

Definition at line 40 of file IntelliToolRectangle.cpp.

@@ -335,12 +356,7 @@ Here is the call graph for this function:

Reimplemented from IntelliTool.

-

Definition at line 48 of file IntelliToolRectangle.cpp.

-
-Here is the call graph for this function:
-
-
-
+

Definition at line 47 of file IntelliToolRectangle.cpp.

@@ -389,12 +405,7 @@ Here is the call graph for this function:

Reimplemented from IntelliTool.

-

Definition at line 52 of file IntelliToolRectangle.cpp.

-
-Here is the call graph for this function:
-
-
-
+

Definition at line 51 of file IntelliToolRectangle.cpp.

@@ -443,12 +454,7 @@ Here is the call graph for this function:

Reimplemented from IntelliTool.

-

Definition at line 33 of file IntelliToolRectangle.cpp.

-
-Here is the call graph for this function:
-
-
-
+

Definition at line 32 of file IntelliToolRectangle.cpp.

@@ -497,12 +503,7 @@ Here is the call graph for this function:

Reimplemented from IntelliTool.

-

Definition at line 37 of file IntelliToolRectangle.cpp.

-
-Here is the call graph for this function:
-
-
-
+

Definition at line 36 of file IntelliToolRectangle.cpp.

@@ -540,12 +541,7 @@ Here is the call graph for this function:

Reimplemented from IntelliTool.

-

Definition at line 61 of file IntelliToolRectangle.cpp.

-
-Here is the call graph for this function:
-
-
-
+

Definition at line 60 of file IntelliToolRectangle.cpp.

diff --git a/docs/html/class_intelli_tool_rectangle.js b/docs/html/class_intelli_tool_rectangle.js index 591c3aa..70a65ee 100644 --- a/docs/html/class_intelli_tool_rectangle.js +++ b/docs/html/class_intelli_tool_rectangle.js @@ -1,6 +1,6 @@ var class_intelli_tool_rectangle = [ - [ "IntelliToolRectangle", "class_intelli_tool_rectangle.html#aa9823939a8b8924520a2943cf6335c11", null ], + [ "IntelliToolRectangle", "class_intelli_tool_rectangle.html#ada06457247d5b173888a9a520b31ec5c", null ], [ "~IntelliToolRectangle", "class_intelli_tool_rectangle.html#a7dc1463e726a21255e6297241dc71fb1", null ], [ "onMouseLeftPressed", "class_intelli_tool_rectangle.html#ae03c307ccf66cbe3fd59e3657712368d", null ], [ "onMouseLeftReleased", "class_intelli_tool_rectangle.html#a94460e3ff1c19e80bde922c55f53cc43", null ], diff --git a/docs/html/class_intelli_tool_rectangle.png b/docs/html/class_intelli_tool_rectangle.png new file mode 100644 index 0000000000000000000000000000000000000000..898198eb1bf369530ee1a92de09dd2b94990f683 GIT binary patch literal 469 zcmeAS@N?(olHy`uVBq!ia0vp^l|UT8!3-q1+O=ANlth3}i0l9V|AEYR@7~RxJ!b-t z1;z&s9N_Cc@D#}9C<*clW&kPzfvcxNj2IXgQ#@T9Ln;{G&b>IP$$-bzKR^A?fB$=| zUYT1r?AX+~`Pj>~H?GL!Nqw9;r?^Zoa*~Wlisz6vx>Z@TBM%iT|G z&$K={dFOk~@>e^Px;{!xU7|c!Ej+0G?upw)(R`k_E>@n;cZicZb@KCrIsXf{_Etwv z(hHxUdeX~rnu_+$NyX=GIy3CQ#(Tgu@5$}6+;83fu~{$tdqV!^ZAUhP;0cUtL{b>E zStSp6IkIgCf^#28E}b%|+k=6R%cx=My@ow^9m-Anw@Nmq`7AtGG@BvAZGT>g!dVAMlvt2&93%ob1Tfcj|ROu71R~w{vKK!~cal!c;YwfG*X2qP_ zsq6TATe&;?6V=C>=a;sn)(8Jntjs=Hd%n5YZq2uiH|;*MUj6rSj`ZgARezK6ud{f+ z+qCKaZHD@l2iMgTe~ HDWM4fAf(*k literal 0 HcmV?d00001 diff --git a/docs/html/class_intelli_tool_rectangle__coll__graph.dot b/docs/html/class_intelli_tool_rectangle__coll__graph.dot index 7695fd2..fcf24b8 100644 --- a/docs/html/class_intelli_tool_rectangle__coll__graph.dot +++ b/docs/html/class_intelli_tool_rectangle__coll__graph.dot @@ -10,10 +10,14 @@ digraph "IntelliToolRectangle" Node3 [label="PaintingArea",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_painting_area.html",tooltip="The PaintingArea class manages the methods and stores information about the current painting area,..."]; Node4 -> Node3 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; Node4 [label="QWidget",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; - Node5 -> Node2 [dir="back",color="darkorchid3",fontsize="10",style="dashed",label=" colorPicker" ,fontname="Helvetica"]; + Node5 -> Node3 [dir="back",color="darkorchid3",fontsize="10",style="dashed",label=" colorPicker" ,fontname="Helvetica"]; Node5 [label="IntelliColorPicker",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_color_picker.html",tooltip="The IntelliColorPicker manages the selected colors for one whole project."]; - Node6 -> Node2 [dir="back",color="darkorchid3",fontsize="10",style="dashed",label=" Canvas\nActive" ,fontname="Helvetica"]; - Node6 [label="LayerObject",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$struct_layer_object.html",tooltip="The LayerObject struct holds all the information needed to construct a layer."]; - Node7 -> Node6 [dir="back",color="darkorchid3",fontsize="10",style="dashed",label=" image" ,fontname="Helvetica"]; - Node7 [label="IntelliImage",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_image.html",tooltip="An abstract class which manages the basic IntelliImage operations."]; + Node6 -> Node3 [dir="back",color="darkorchid3",fontsize="10",style="dashed",label=" Toolsettings" ,fontname="Helvetica"]; + Node6 [label="IntelliToolsettings",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_toolsettings.html",tooltip=" "]; + Node6 -> Node2 [dir="back",color="darkorchid3",fontsize="10",style="dashed",label=" Toolsettings" ,fontname="Helvetica"]; + Node5 -> Node2 [dir="back",color="darkorchid3",fontsize="10",style="dashed",label=" colorPicker" ,fontname="Helvetica"]; + Node7 -> Node2 [dir="back",color="darkorchid3",fontsize="10",style="dashed",label=" Canvas\nactiveLayer" ,fontname="Helvetica"]; + Node7 [label="LayerObject",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$struct_layer_object.html",tooltip="The LayerObject struct holds all the information needed to construct a layer."]; + Node8 -> Node7 [dir="back",color="darkorchid3",fontsize="10",style="dashed",label=" image" ,fontname="Helvetica"]; + Node8 [label="IntelliImage",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_image.html",tooltip="An abstract class which manages the basic IntelliImage operations."]; } diff --git a/docs/html/class_intelli_tool_rectangle_a445c53a56e859f970e59f5036e221e0c_cgraph.dot b/docs/html/class_intelli_tool_rectangle_a445c53a56e859f970e59f5036e221e0c_cgraph.dot index 9af030b..d2c20a9 100644 --- a/docs/html/class_intelli_tool_rectangle_a445c53a56e859f970e59f5036e221e0c_cgraph.dot +++ b/docs/html/class_intelli_tool_rectangle_a445c53a56e859f970e59f5036e221e0c_cgraph.dot @@ -6,5 +6,9 @@ digraph "IntelliToolRectangle::onWheelScrolled" rankdir="LR"; Node1 [label="IntelliToolRectangle\l::onWheelScrolled",height=0.2,width=0.4,color="black", fillcolor="grey75", style="filled", fontcolor="black",tooltip="A function managing the scroll event.Changing edgeWidth relativ to value."]; Node1 -> Node2 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node2 [label="IntelliTool::onWheelScrolled",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool.html#a4dccfd4460255ccb866f336406a33574",tooltip="A function managing the scroll event. A positive value means scrolling outwards. Call this in child c..."]; + Node2 [label="IntelliToolsettings\l::getLineWidth",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_toolsettings.html#a68528dd3bad8f39ba19fa6b12a4e415a",tooltip=" "]; + Node1 -> Node3 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node3 [label="IntelliTool::onWheelScrolled",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool.html#a4dccfd4460255ccb866f336406a33574",tooltip="A function managing the scroll event. A positive value means scrolling outwards. Call this in child c..."]; + Node1 -> Node4 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node4 [label="IntelliToolsettings\l::setLineWidth",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_toolsettings.html#a906d37de6ee94b433d53fe3e598cc9fa",tooltip=" "]; } diff --git a/docs/html/class_intelli_tool_rectangle_a7dc1463e726a21255e6297241dc71fb1_cgraph.dot b/docs/html/class_intelli_tool_rectangle_a7dc1463e726a21255e6297241dc71fb1_cgraph.dot new file mode 100644 index 0000000..25dbf94 --- /dev/null +++ b/docs/html/class_intelli_tool_rectangle_a7dc1463e726a21255e6297241dc71fb1_cgraph.dot @@ -0,0 +1,10 @@ +digraph "IntelliToolRectangle::~IntelliToolRectangle" +{ + // LATEX_PDF_SIZE + edge [fontname="Helvetica",fontsize="10",labelfontname="Helvetica",labelfontsize="10"]; + node [fontname="Helvetica",fontsize="10",shape=record]; + rankdir="LR"; + Node1 [label="IntelliToolRectangle\l::~IntelliToolRectangle",height=0.2,width=0.4,color="black", fillcolor="grey75", style="filled", fontcolor="black",tooltip="A Destructor."]; + Node1 -> Node2 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node2 [label="IntelliTool::onMouseRight\lPressed",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool.html#a1e6aa68ac5f3c2ca02319e5ef3f0c966",tooltip="A function managing the right click Pressed of a Mouse. Constructing the Canvas to draw on...."]; +} diff --git a/docs/html/class_intelli_toolsettings-members.html b/docs/html/class_intelli_toolsettings-members.html new file mode 100644 index 0000000..9a5cc60 --- /dev/null +++ b/docs/html/class_intelli_toolsettings-members.html @@ -0,0 +1,117 @@ + + + + + + + +IntelliPhoto: Member List + + + + + + + + + + + + + + +
+
+ + + + + + +
+
IntelliPhoto +  0.5 +
+
+
+ + + + + + + +
+
+ +
+
+
+ + + + + + diff --git a/docs/html/class_intelli_toolsettings.html b/docs/html/class_intelli_toolsettings.html new file mode 100644 index 0000000..20551b6 --- /dev/null +++ b/docs/html/class_intelli_toolsettings.html @@ -0,0 +1,362 @@ + + + + + + + +IntelliPhoto: IntelliToolsettings Class Reference + + + + + + + + + + + + + + +
+
+ + + + + + +
+
IntelliPhoto +  0.5 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
IntelliToolsettings Class Reference
+
+
+ +

#include <IntelliToolsettings.h>

+ + + + + +

+Public Types

enum  LineStyle { LineStyle::SOLID_LINE, +LineStyle::DOTTED_LINE + }
 The LineStyle enum classifing all ways of drawing a line. More...
 
+ + + + + + + + + + + + + + + + + + + +

+Public Member Functions

 IntelliToolsettings ()
 
virtual ~IntelliToolsettings ()
 
int getLineWidth ()
 
void setLineWidth ()
 
void setLineWidth (int LineWidth)
 
int getInnerAlpha ()
 
void setInnerAlpha ()
 
void setInnerAlpha (int innerAlpha)
 
LineStyle getLinestyle ()
 
+

Detailed Description

+
+

Definition at line 4 of file IntelliToolsettings.h.

+

Member Enumeration Documentation

+ +

◆ LineStyle

+ +
+
+ + + + + +
+ + + + +
enum IntelliToolsettings::LineStyle
+
+strong
+
+ +

The LineStyle enum classifing all ways of drawing a line.

+ + + +
Enumerator
SOLID_LINE 
DOTTED_LINE 
+ +

Definition at line 9 of file IntelliToolsettings.h.

+ +
+
+

Constructor & Destructor Documentation

+ +

◆ IntelliToolsettings()

+ +
+
+ + + + + + + +
IntelliToolsettings::IntelliToolsettings ()
+
+ +

Definition at line 4 of file IntelliToolsettings.cpp.

+ +
+
+ +

◆ ~IntelliToolsettings()

+ +
+
+ + + + + +
+ + + + + + + +
IntelliToolsettings::~IntelliToolsettings ()
+
+virtual
+
+ +

Definition at line 11 of file IntelliToolsettings.cpp.

+ +
+
+

Member Function Documentation

+ +

◆ getInnerAlpha()

+ +
+
+ + + + + + + +
int IntelliToolsettings::getInnerAlpha ()
+
+ +

Definition at line 33 of file IntelliToolsettings.cpp.

+ +
+
+ +

◆ getLinestyle()

+ +
+
+ + + + + + + +
IntelliToolsettings::LineStyle IntelliToolsettings::getLinestyle ()
+
+ +

Definition at line 51 of file IntelliToolsettings.cpp.

+ +
+
+ +

◆ getLineWidth()

+ +
+
+ + + + + + + +
int IntelliToolsettings::getLineWidth ()
+
+ +

Definition at line 15 of file IntelliToolsettings.cpp.

+ +
+
+ +

◆ setInnerAlpha() [1/2]

+ +
+
+ + + + + + + +
void IntelliToolsettings::setInnerAlpha ()
+
+ +

Definition at line 37 of file IntelliToolsettings.cpp.

+ +
+
+ +

◆ setInnerAlpha() [2/2]

+ +
+
+ + + + + + + + +
void IntelliToolsettings::setInnerAlpha (int innerAlpha)
+
+ +

Definition at line 41 of file IntelliToolsettings.cpp.

+ +
+
+ +

◆ setLineWidth() [1/2]

+ +
+
+ + + + + + + +
void IntelliToolsettings::setLineWidth ()
+
+ +

Definition at line 19 of file IntelliToolsettings.cpp.

+ +
+
+ +

◆ setLineWidth() [2/2]

+ +
+
+ + + + + + + + +
void IntelliToolsettings::setLineWidth (int LineWidth)
+
+ +

Definition at line 23 of file IntelliToolsettings.cpp.

+ +
+
+
The documentation for this class was generated from the following files: +
+
+ + + + diff --git a/docs/html/class_intelli_toolsettings.js b/docs/html/class_intelli_toolsettings.js new file mode 100644 index 0000000..e80469a --- /dev/null +++ b/docs/html/class_intelli_toolsettings.js @@ -0,0 +1,16 @@ +var class_intelli_toolsettings = +[ + [ "LineStyle", "class_intelli_toolsettings.html#a687dacd0e15b92dda5626b1b44b86089", [ + [ "SOLID_LINE", "class_intelli_toolsettings.html#a687dacd0e15b92dda5626b1b44b86089ae45e1e6b2e6dde14829d057a4ef44199", null ], + [ "DOTTED_LINE", "class_intelli_toolsettings.html#a687dacd0e15b92dda5626b1b44b86089a7660f396543c877e45d443f99d02bd0e", null ] + ] ], + [ "IntelliToolsettings", "class_intelli_toolsettings.html#a5560602964ab95380967d63ab7ec6e69", null ], + [ "~IntelliToolsettings", "class_intelli_toolsettings.html#a927e50594a459c952d06acd34c0eff56", null ], + [ "getInnerAlpha", "class_intelli_toolsettings.html#a7d6ce2054ec4bcba7629dc2b514b6b5c", null ], + [ "getLinestyle", "class_intelli_toolsettings.html#a5beb193b25e0665516244c61c5e65aa6", null ], + [ "getLineWidth", "class_intelli_toolsettings.html#a68528dd3bad8f39ba19fa6b12a4e415a", null ], + [ "setInnerAlpha", "class_intelli_toolsettings.html#a32f165c89190e40caf96abb916e6c876", null ], + [ "setInnerAlpha", "class_intelli_toolsettings.html#a9a61f3de61efeba2287f8b32941f4271", null ], + [ "setLineWidth", "class_intelli_toolsettings.html#a906d37de6ee94b433d53fe3e598cc9fa", null ], + [ "setLineWidth", "class_intelli_toolsettings.html#a73fa94c85c6c2fdc1a33975a33304a6f", null ] +]; \ No newline at end of file diff --git a/docs/html/class_intelli_toolsettings_a5beb193b25e0665516244c61c5e65aa6_icgraph.dot b/docs/html/class_intelli_toolsettings_a5beb193b25e0665516244c61c5e65aa6_icgraph.dot new file mode 100644 index 0000000..3ee4cb6 --- /dev/null +++ b/docs/html/class_intelli_toolsettings_a5beb193b25e0665516244c61c5e65aa6_icgraph.dot @@ -0,0 +1,10 @@ +digraph "IntelliToolsettings::getLinestyle" +{ + // LATEX_PDF_SIZE + edge [fontname="Helvetica",fontsize="10",labelfontname="Helvetica",labelfontsize="10"]; + node [fontname="Helvetica",fontsize="10",shape=record]; + rankdir="RL"; + Node1 [label="IntelliToolsettings\l::getLinestyle",height=0.2,width=0.4,color="black", fillcolor="grey75", style="filled", fontcolor="black",tooltip=" "]; + Node1 -> Node2 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node2 [label="IntelliToolLine::onMouse\lMoved",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_line.html#abc6324ef0778823fe7e35aef8ae37f9b",tooltip="A function managing the mouse moved event. Drawing a Line from the startpoint to the current mouse po..."]; +} diff --git a/docs/html/class_intelli_toolsettings_a68528dd3bad8f39ba19fa6b12a4e415a_icgraph.dot b/docs/html/class_intelli_toolsettings_a68528dd3bad8f39ba19fa6b12a4e415a_icgraph.dot new file mode 100644 index 0000000..c709ae3 --- /dev/null +++ b/docs/html/class_intelli_toolsettings_a68528dd3bad8f39ba19fa6b12a4e415a_icgraph.dot @@ -0,0 +1,30 @@ +digraph "IntelliToolsettings::getLineWidth" +{ + // LATEX_PDF_SIZE + edge [fontname="Helvetica",fontsize="10",labelfontname="Helvetica",labelfontsize="10"]; + node [fontname="Helvetica",fontsize="10",shape=record]; + rankdir="RL"; + Node1 [label="IntelliToolsettings\l::getLineWidth",height=0.2,width=0.4,color="black", fillcolor="grey75", style="filled", fontcolor="black",tooltip=" "]; + Node1 -> Node2 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node2 [label="IntelliToolPen::onMouseLeft\lPressed",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_pen.html#a8ff40aef6d38eb55af31a19322429205",tooltip="A function managing the left click pressed of a mouse. Starting the drawing procedure."]; + Node1 -> Node3 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node3 [label="IntelliToolLine::onMouse\lLeftPressed",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_line.html#a155d676a5f98311217eb095be4759846",tooltip="A function managing the left click pressed of a mouse. Sets the starting point of the line."]; + Node1 -> Node4 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node4 [label="IntelliToolPolygon\l::onMouseLeftPressed",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_polygon.html#ad5d3b741be6d0647a9cdc9da2cb8bc3d",tooltip="A function managing the left click pressed of a mouse. Setting polygon points."]; + Node1 -> Node5 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node5 [label="IntelliToolPolygon\l::onMouseLeftReleased",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_polygon.html#a4e1473ff408ae2e11cf6a43f6f575f21",tooltip="A function managing the left click released of a mouse. Merging the fill to the active layer."]; + Node1 -> Node6 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node6 [label="IntelliToolPen::onMouseMoved",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_pen.html#a58d1d636497b630647ce0c4d652737c2",tooltip="A function managing the mouse moved event. To draw the line."]; + Node1 -> Node7 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node7 [label="IntelliToolLine::onMouse\lMoved",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_line.html#abc6324ef0778823fe7e35aef8ae37f9b",tooltip="A function managing the mouse moved event. Drawing a Line from the startpoint to the current mouse po..."]; + Node1 -> Node8 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node8 [label="IntelliToolPen::onWheelScrolled",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_pen.html#afe3626ddff440ab125f4a2465c45427a",tooltip="A function managing the scroll event. Changing penWidth relativ to value."]; + Node1 -> Node9 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node9 [label="IntelliToolLine::onWheel\lScrolled",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_line.html#aaf1d686e1ec43f41b5186ccfd806b125",tooltip="A function managing the scroll event. Changing the lineWidth relative to value."]; + Node1 -> Node10 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node10 [label="IntelliToolRectangle\l::onWheelScrolled",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_rectangle.html#a445c53a56e859f970e59f5036e221e0c",tooltip="A function managing the scroll event.Changing edgeWidth relativ to value."]; + Node1 -> Node11 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node11 [label="IntelliToolCircle::\lonWheelScrolled",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_circle.html#ae2d9b0fb6695c184c4cb507a5fb75506",tooltip="A function managing the scroll event. Changing the edge Width relative to value."]; + Node1 -> Node12 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node12 [label="IntelliToolPolygon\l::onWheelScrolled",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_polygon.html#a713103300c9f023d64d9eec5ac05dd17",tooltip="A function managing the scroll event. CHanging the lineWidth relative to value."]; +} diff --git a/docs/html/class_intelli_toolsettings_a7d6ce2054ec4bcba7629dc2b514b6b5c_icgraph.dot b/docs/html/class_intelli_toolsettings_a7d6ce2054ec4bcba7629dc2b514b6b5c_icgraph.dot new file mode 100644 index 0000000..72567ea --- /dev/null +++ b/docs/html/class_intelli_toolsettings_a7d6ce2054ec4bcba7629dc2b514b6b5c_icgraph.dot @@ -0,0 +1,10 @@ +digraph "IntelliToolsettings::getInnerAlpha" +{ + // LATEX_PDF_SIZE + edge [fontname="Helvetica",fontsize="10",labelfontname="Helvetica",labelfontsize="10"]; + node [fontname="Helvetica",fontsize="10",shape=record]; + rankdir="RL"; + Node1 [label="IntelliToolsettings\l::getInnerAlpha",height=0.2,width=0.4,color="black", fillcolor="grey75", style="filled", fontcolor="black",tooltip=" "]; + Node1 -> Node2 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node2 [label="IntelliToolPolygon\l::onMouseLeftReleased",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_polygon.html#a4e1473ff408ae2e11cf6a43f6f575f21",tooltip="A function managing the left click released of a mouse. Merging the fill to the active layer."]; +} diff --git a/docs/html/class_intelli_toolsettings_a906d37de6ee94b433d53fe3e598cc9fa_icgraph.dot b/docs/html/class_intelli_toolsettings_a906d37de6ee94b433d53fe3e598cc9fa_icgraph.dot new file mode 100644 index 0000000..57e6e14 --- /dev/null +++ b/docs/html/class_intelli_toolsettings_a906d37de6ee94b433d53fe3e598cc9fa_icgraph.dot @@ -0,0 +1,18 @@ +digraph "IntelliToolsettings::setLineWidth" +{ + // LATEX_PDF_SIZE + edge [fontname="Helvetica",fontsize="10",labelfontname="Helvetica",labelfontsize="10"]; + node [fontname="Helvetica",fontsize="10",shape=record]; + rankdir="RL"; + Node1 [label="IntelliToolsettings\l::setLineWidth",height=0.2,width=0.4,color="black", fillcolor="grey75", style="filled", fontcolor="black",tooltip=" "]; + Node1 -> Node2 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node2 [label="IntelliToolPen::onWheelScrolled",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_pen.html#afe3626ddff440ab125f4a2465c45427a",tooltip="A function managing the scroll event. Changing penWidth relativ to value."]; + Node1 -> Node3 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node3 [label="IntelliToolLine::onWheel\lScrolled",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_line.html#aaf1d686e1ec43f41b5186ccfd806b125",tooltip="A function managing the scroll event. Changing the lineWidth relative to value."]; + Node1 -> Node4 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node4 [label="IntelliToolRectangle\l::onWheelScrolled",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_rectangle.html#a445c53a56e859f970e59f5036e221e0c",tooltip="A function managing the scroll event.Changing edgeWidth relativ to value."]; + Node1 -> Node5 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node5 [label="IntelliToolCircle::\lonWheelScrolled",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_circle.html#ae2d9b0fb6695c184c4cb507a5fb75506",tooltip="A function managing the scroll event. Changing the edge Width relative to value."]; + Node1 -> Node6 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node6 [label="IntelliToolPolygon\l::onWheelScrolled",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_polygon.html#a713103300c9f023d64d9eec5ac05dd17",tooltip="A function managing the scroll event. CHanging the lineWidth relative to value."]; +} diff --git a/docs/html/class_painting_area-members.html b/docs/html/class_painting_area-members.html index c5dd00b..8f97d2d 100644 --- a/docs/html/class_painting_area-members.html +++ b/docs/html/class_painting_area-members.html @@ -93,36 +93,42 @@ $(document).ready(function(){initNavTree('class_painting_area.html','');});

This is the complete list of members for PaintingArea, including all inherited members.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
addLayer(int width, int height, int widthOffset=0, int heightOffset=0, ImageType type=ImageType::Raster_Image)PaintingArea
addLayerAt(int idx, int width, int height, int widthOffset=0, int heightOffset=0, ImageType type=ImageType::Raster_Image)PaintingArea
colorPickerSetFirstColor()PaintingArea
colorPickerSetSecondColor()PaintingArea
colorPickerSwitchColor()PaintingArea
createCircleTool()PaintingArea
createFloodFillTool()PaintingArea
createLineTool()PaintingArea
createPenTool()PaintingArea
createPlainTool()PaintingArea
createPolygonTool()PaintingArea
createRectangleTool()PaintingArea
deleteLayer(int index)PaintingArea
floodFill(int r, int g, int b, int a)PaintingArea
getHeightOfActive()PaintingArea
getWidthOfActive()PaintingArea
mouseMoveEvent(QMouseEvent *event) overridePaintingAreaprotected
mousePressEvent(QMouseEvent *event) overridePaintingAreaprotected
mouseReleaseEvent(QMouseEvent *event) overridePaintingAreaprotected
moveActiveLayer(int idx)PaintingArea
movePositionActive(int x, int y)PaintingArea
open(const QString &fileName)PaintingArea
paintEvent(QPaintEvent *event) overridePaintingAreaprotected
PaintingArea(int maxWidth=600, int maxHeight=600, QWidget *parent=nullptr)PaintingArea
resizeEvent(QResizeEvent *event) overridePaintingAreaprotected
save(const QString &fileName, const char *fileFormat)PaintingArea
setAlphaOfLayer(int index, int alpha)PaintingArea
setLayerToActive(int index)PaintingArea
slotActivateLayer(int a)PaintingAreaslot
slotDeleteActiveLayer()PaintingAreaslot
addLayer(int width, int height, int widthOffset=0, int heightOffset=0, IntelliImage::ImageType type=IntelliImage::ImageType::RASTERIMAGE)PaintingArea
addLayerAt(int idx, int width, int height, int widthOffset=0, int heightOffset=0, IntelliImage::ImageType type=IntelliImage::ImageType::RASTERIMAGE)PaintingArea
colorPickerPaintingArea
colorPickerSetFirstColor()PaintingArea
colorPickerSetSecondColor()PaintingArea
colorPickerSwapColors()PaintingArea
createCircleTool()PaintingArea
createFloodFillTool()PaintingArea
createLineTool()PaintingArea
createPenTool()PaintingArea
createPlainTool()PaintingArea
createPolygonTool()PaintingArea
createRectangleTool()PaintingArea
deleteLayer(int idx)PaintingArea
floodFill(int r, int g, int b, int a)PaintingArea
getHeightOfActive()PaintingArea
getImageOfActiveLayer()PaintingArea
getNumberOfActiveLayer()PaintingArea
getPolygonDataOfRealLayer()PaintingArea
getTypeOfImageRealLayer()PaintingArea
getWidthOfActive()PaintingArea
mouseMoveEvent(QMouseEvent *event) overridePaintingAreaprotected
mousePressEvent(QMouseEvent *event) overridePaintingAreaprotected
mouseReleaseEvent(QMouseEvent *event) overridePaintingAreaprotected
moveActiveLayer(int idx)PaintingArea
movePositionActive(int x, int y)PaintingArea
open(const QString &filePath)PaintingArea
paintEvent(QPaintEvent *event) overridePaintingAreaprotected
PaintingArea(int maxWidth=600, int maxHeight=600, QWidget *parent=nullptr)PaintingArea
resizeEvent(QResizeEvent *event) overridePaintingAreaprotected
save(const QString &filePath, const char *fileFormat)PaintingArea
setLayerActive(int idx)PaintingArea
setLayerAlpha(int idx, int alpha)PaintingArea
slotActivateLayer(int a)PaintingAreaslot
slotDeleteActiveLayer()PaintingAreaslot
ToolsettingsPaintingArea
wheelEvent(QWheelEvent *event) overridePaintingAreaprotected
~PaintingArea() overridePaintingArea
diff --git a/docs/html/class_painting_area.html b/docs/html/class_painting_area.html index 312e51c..05e80b3 100644 --- a/docs/html/class_painting_area.html +++ b/docs/html/class_painting_area.html @@ -89,6 +89,7 @@ $(document).ready(function(){initNavTree('class_painting_area.html','');});
@@ -103,13 +104,9 @@ $(document).ready(function(){initNavTree('class_painting_area.html','');});
Inheritance diagram for PaintingArea:
-
Inheritance graph
-
[legend]
-
-Collaboration diagram for PaintingArea:
-
-
Collaboration graph
-
[legend]
+
+ +
@@ -128,27 +125,27 @@ Public Member Functions - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + @@ -164,9 +161,9 @@ Public Member Functions - - - + + + @@ -187,6 +184,21 @@ Public Member Functions + + + + + + + + +

Public Slots

 ~PaintingArea () override
 This deconstructor is used to clear up the memory and remove the currently active window. More...
 
bool open (const QString &fileName)
 The open method is used for loading a picture into the current layer. More...
 
bool save (const QString &fileName, const char *fileFormat)
 The save method is used for exporting the current project as one picture. More...
 
int addLayer (int width, int height, int widthOffset=0, int heightOffset=0, ImageType type=ImageType::Raster_Image)
 The addLayer adds a layer to the current project/ painting area. More...
 
int addLayerAt (int idx, int width, int height, int widthOffset=0, int heightOffset=0, ImageType type=ImageType::Raster_Image)
 The addLayerAt adds a layer to the current project/ painting area at a specific position in the layer stack. More...
 
void deleteLayer (int index)
 The deleteLayer method removes a layer at a given index. More...
 
void setLayerToActive (int index)
 The setLayerToActive method marks a specific layer as active. More...
 
void setAlphaOfLayer (int index, int alpha)
 The setAlphaOfLayer method sets the alpha value of a specific layer. More...
 
bool open (const QString &filePath)
 The open method is used for loading a picture into the current layer. More...
 
bool save (const QString &filePath, const char *fileFormat)
 The save method is used for exporting the current project as one picture. More...
 
int addLayer (int width, int height, int widthOffset=0, int heightOffset=0, IntelliImage::ImageType type=IntelliImage::ImageType::RASTERIMAGE)
 The addLayer adds a layer to the current project/ painting area. More...
 
int addLayerAt (int idx, int width, int height, int widthOffset=0, int heightOffset=0, IntelliImage::ImageType type=IntelliImage::ImageType::RASTERIMAGE)
 The addLayerAt adds a layer to the current project/ painting area at a specific position in the layer stack. More...
 
void deleteLayer (int idx)
 The deleteLayer method removes a layer at a given idx. More...
 
void setLayerActive (int idx)
 The setLayerToActive method marks a specific layer as active. More...
 
void setLayerAlpha (int idx, int alpha)
 The setAlphaOfLayer method sets the alpha value of a specific layer. More...
 
void floodFill (int r, int g, int b, int a)
 The floodFill method fills a the active layer with a given color. More...
 
void colorPickerSetSecondColor ()
 The colorPickerSetSecondColor calls the QTColorPicker to determine the secondary drawing color. More...
 
void colorPickerSwitchColor ()
 The colorPickerSwitchColor swaps the primary color with the secondary drawing color. More...
 
void colorPickerSwapColors ()
 The colorPickerSwitchColor swaps the primary color with the secondary drawing color. More...
 
void createPenTool ()
 
void createPlainTool ()
int getHeightOfActive ()
 The getHeightOfActive gets the vertical dimensions of the active layer. More...
 
IntelliImage::ImageType getTypeOfImageRealLayer ()
 
std::vector< QPoint > getPolygonDataOfRealLayer ()
 
int getNumberOfActiveLayer ()
 
IntelliImagegetImageOfActiveLayer ()
 
+ + + + +

+Public Attributes

IntelliToolsettings Toolsettings
 
IntelliColorPicker colorPicker
 
@@ -206,7 +218,7 @@ Protected Member Functions

Detailed Description

The PaintingArea class manages the methods and stores information about the current painting area, which is the currently opened project.

-

Definition at line 36 of file PaintingArea.h.

+

Definition at line 37 of file PaintingArea.h.

Constructor & Destructor Documentation

◆ PaintingArea()

@@ -251,11 +263,6 @@ Protected Member Functions

Definition at line 21 of file PaintingArea.cpp.

-
-Here is the call graph for this function:
-
-
-
@@ -289,8 +296,8 @@ Here is the call graph for this function:

Member Function Documentation

- -

◆ addLayer()

+ +

◆ addLayer()

@@ -322,8 +329,8 @@ Here is the call graph for this function:
- - + + @@ -347,16 +354,11 @@ Here is the call graph for this function:
Returns
Returns the number of layers in the project

Definition at line 56 of file PaintingArea.cpp.

-
-Here is the caller graph for this function:
-
-
-
- -

◆ addLayerAt()

+ +

◆ addLayerAt()

@@ -394,8 +396,8 @@ Here is the caller graph for this function:
- - + + @@ -408,7 +410,7 @@ Here is the caller graph for this function:

The addLayerAt adds a layer to the current project/ painting area at a specific position in the layer stack.

Parameters

Protected Member Functions

ImageType type = ImageType::Raster_Image IntelliImage::ImageType type = IntelliImage::ImageType::RASTERIMAGE 
ImageType type = ImageType::Raster_Image IntelliImage::ImageType type = IntelliImage::ImageType::RASTERIMAGE 
- + @@ -438,12 +440,7 @@ Here is the caller graph for this function:

The colorPickerSetFirstColor calls the QTColorPicker to determine the primary drawing color.

-

Definition at line 166 of file PaintingArea.cpp.

-
-Here is the call graph for this function:
-
-
-
+

Definition at line 188 of file PaintingArea.cpp.

@@ -464,23 +461,18 @@ Here is the call graph for this function:

The colorPickerSetSecondColor calls the QTColorPicker to determine the secondary drawing color.

-

Definition at line 171 of file PaintingArea.cpp.

-
-Here is the call graph for this function:
-
-
-
+

Definition at line 193 of file PaintingArea.cpp.

- -

◆ colorPickerSwitchColor()

+ +

◆ colorPickerSwapColors()

idx- ID of the position the new layer should be added
idx- Index of the position the new layer should be added
width- Width of the layer in pixles
height- Height of the layer in pixles
widthOffset- Offset of the layer measured to the left border of the painting area in pixles
- + @@ -490,12 +482,7 @@ Here is the call graph for this function:

The colorPickerSwitchColor swaps the primary color with the secondary drawing color.

-

Definition at line 176 of file PaintingArea.cpp.

-
-Here is the call graph for this function:
-
-
-
+

Definition at line 198 of file PaintingArea.cpp.

@@ -514,7 +501,7 @@ Here is the call graph for this function:
void PaintingArea::colorPickerSwitchColor void PaintingArea::colorPickerSwapColors ( )
-

Definition at line 200 of file PaintingArea.cpp.

+

Definition at line 222 of file PaintingArea.cpp.

@@ -533,7 +520,7 @@ Here is the call graph for this function:
-

Definition at line 209 of file PaintingArea.cpp.

+

Definition at line 231 of file PaintingArea.cpp.

@@ -552,7 +539,7 @@ Here is the call graph for this function:
-

Definition at line 190 of file PaintingArea.cpp.

+

Definition at line 212 of file PaintingArea.cpp.

@@ -571,7 +558,7 @@ Here is the call graph for this function:
-

Definition at line 180 of file PaintingArea.cpp.

+

Definition at line 202 of file PaintingArea.cpp.

@@ -590,7 +577,7 @@ Here is the call graph for this function:
-

Definition at line 185 of file PaintingArea.cpp.

+

Definition at line 207 of file PaintingArea.cpp.

@@ -609,7 +596,7 @@ Here is the call graph for this function:
-

Definition at line 204 of file PaintingArea.cpp.

+

Definition at line 226 of file PaintingArea.cpp.

@@ -628,12 +615,12 @@ Here is the call graph for this function:
-

Definition at line 195 of file PaintingArea.cpp.

+

Definition at line 217 of file PaintingArea.cpp.

- -

◆ deleteLayer()

+ +

◆ deleteLayer()

@@ -642,21 +629,21 @@ Here is the call graph for this function:
void PaintingArea::deleteLayer ( int  - index) + idx)
-

The deleteLayer method removes a layer at a given index.

+

The deleteLayer method removes a layer at a given idx.

Parameters
- +
index- The index of the layer to be removed
idx- The index of the layer to be removed
-

Definition at line 73 of file PaintingArea.cpp.

+

Definition at line 74 of file PaintingArea.cpp.

@@ -709,12 +696,7 @@ Here is the call graph for this function: -

Definition at line 138 of file PaintingArea.cpp.

-
-Here is the call graph for this function:
-
-
-
+

Definition at line 139 of file PaintingArea.cpp.

@@ -736,7 +718,83 @@ Here is the call graph for this function:

The getHeightOfActive gets the vertical dimensions of the active layer.

Returns
Returns the vertical pixle count of the active layer
-

Definition at line 218 of file PaintingArea.cpp.

+

Definition at line 240 of file PaintingArea.cpp.

+ + + + +

◆ getImageOfActiveLayer()

+ +
+
+ + + + + + + +
IntelliImage * PaintingArea::getImageOfActiveLayer ()
+
+ +

Definition at line 406 of file PaintingArea.cpp.

+ +
+
+ +

◆ getNumberOfActiveLayer()

+ +
+
+ + + + + + + +
int PaintingArea::getNumberOfActiveLayer ()
+
+ +

Definition at line 402 of file PaintingArea.cpp.

+ +
+
+ +

◆ getPolygonDataOfRealLayer()

+ +
+
+ + + + + + + +
std::vector< QPoint > PaintingArea::getPolygonDataOfRealLayer ()
+
+ +

Definition at line 248 of file PaintingArea.cpp.

+ +
+
+ +

◆ getTypeOfImageRealLayer()

+ +
+
+ + + + + + + +
IntelliImage::ImageType PaintingArea::getTypeOfImageRealLayer ()
+
+ +

Definition at line 244 of file PaintingArea.cpp.

@@ -758,7 +816,7 @@ Here is the call graph for this function:

The getWidthOfActive gets the horizontal dimensions of the active layer.

Returns
Returns the horizontal pixle count of the active layer
-

Definition at line 214 of file PaintingArea.cpp.

+

Definition at line 236 of file PaintingArea.cpp.

@@ -786,12 +844,7 @@ Here is the call graph for this function:
-

Definition at line 241 of file PaintingArea.cpp.

-
-Here is the call graph for this function:
-
-
-
+

Definition at line 271 of file PaintingArea.cpp.

@@ -819,12 +872,7 @@ Here is the call graph for this function:
-

Definition at line 225 of file PaintingArea.cpp.

-
-Here is the call graph for this function:
-
-
-
+

Definition at line 255 of file PaintingArea.cpp.

@@ -852,12 +900,7 @@ Here is the call graph for this function:
-

Definition at line 251 of file PaintingArea.cpp.

-
-Here is the call graph for this function:
-
-
-
+

Definition at line 281 of file PaintingArea.cpp.

@@ -880,12 +923,12 @@ Here is the call graph for this function:

The moveActiveLayer moves the active layer to a specific position in the layer stack.

Parameters
- +
idx- The id of the new position the layer should be in
idx- The index of the new position the layer should be in
-

Definition at line 152 of file PaintingArea.cpp.

+

Definition at line 160 of file PaintingArea.cpp.

@@ -924,12 +967,12 @@ Here is the call graph for this function: -

Definition at line 147 of file PaintingArea.cpp.

+

Definition at line 148 of file PaintingArea.cpp.

- -

◆ open()

+ +

◆ open()

@@ -938,7 +981,7 @@ Here is the call graph for this function:
bool PaintingArea::open ( const QString &  - fileName) + filePath) @@ -953,12 +996,7 @@ Here is the call graph for this function:
Returns
Returns a boolean variable whether the file was successfully opened or not
-

Definition at line 102 of file PaintingArea.cpp.

-
-Here is the call graph for this function:
-
-
-
+

Definition at line 103 of file PaintingArea.cpp.

@@ -986,7 +1024,7 @@ Here is the call graph for this function:
-

Definition at line 275 of file PaintingArea.cpp.

+

Definition at line 307 of file PaintingArea.cpp.

@@ -1014,12 +1052,12 @@ Here is the call graph for this function:
-

Definition at line 286 of file PaintingArea.cpp.

+

Definition at line 318 of file PaintingArea.cpp.

- -

◆ save()

+ +

◆ save()

@@ -1028,7 +1066,7 @@ Here is the call graph for this function:
bool PaintingArea::save ( const QString &  - fileName, + filePath, @@ -1054,21 +1092,49 @@ Here is the call graph for this function:
Returns
Returns a boolean variable, true if the file was saved successfully, false if not
-

Definition at line 114 of file PaintingArea.cpp.

+

Definition at line 115 of file PaintingArea.cpp.

- -

◆ setAlphaOfLayer()

+ +

◆ setLayerActive()

- + - + + + +
void PaintingArea::setAlphaOfLayer void PaintingArea::setLayerActive ( int index, idx)
+
+ +

The setLayerToActive method marks a specific layer as active.

+
Parameters
+ + +
idx- The index of the layer to be active
+
+
+ +

Definition at line 90 of file PaintingArea.cpp.

+ +
+
+ +

◆ setLayerAlpha()

+ +
+
+ + + + + + @@ -1087,46 +1153,13 @@ Here is the call graph for this function:

The setAlphaOfLayer method sets the alpha value of a specific layer.

Parameters
void PaintingArea::setLayerAlpha (int idx,
- +
index- Index of the layer where the change should be applied
idx- The index of the layer where the change should be applied
alpha- New alpha value of the layer
-

Definition at line 95 of file PaintingArea.cpp.

- -
-
- -

◆ setLayerToActive()

- -
-
- - - - - - - - -
void PaintingArea::setLayerToActive (int index)
-
- -

The setLayerToActive method marks a specific layer as active.

-
Parameters
- - -
index- Index of the layer to be active
-
-
- -

Definition at line 89 of file PaintingArea.cpp.

-
-Here is the caller graph for this function:
-
-
-
+

Definition at line 96 of file PaintingArea.cpp.

@@ -1157,17 +1190,12 @@ Here is the caller graph for this function:

The slotActivateLayer method handles the event of selecting one layer as active.

Parameters
- +
a- Index of the layer to be active
a- idx of the layer to be active
-

Definition at line 160 of file PaintingArea.cpp.

-
-Here is the call graph for this function:
-
-
-
+

Definition at line 175 of file PaintingArea.cpp.

@@ -1196,7 +1224,7 @@ Here is the call graph for this function:

The slotDeleteActiveLayer method handles the deletion of the active layer.

-

Definition at line 82 of file PaintingArea.cpp.

+

Definition at line 83 of file PaintingArea.cpp.

@@ -1224,12 +1252,40 @@ Here is the call graph for this function:
-

Definition at line 264 of file PaintingArea.cpp.

-
-Here is the call graph for this function:
-
-
+

Definition at line 294 of file PaintingArea.cpp.

+
+
+

Member Data Documentation

+ +

◆ colorPicker

+ +
+
+ + + + +
IntelliColorPicker PaintingArea::colorPicker
+
+ +

Definition at line 175 of file PaintingArea.h.

+ +
+
+ +

◆ Toolsettings

+ +
+
+ + + + +
IntelliToolsettings PaintingArea::Toolsettings
+
+ +

Definition at line 174 of file PaintingArea.h.

diff --git a/docs/html/class_painting_area.js b/docs/html/class_painting_area.js index 8a0e1aa..a9d5037 100644 --- a/docs/html/class_painting_area.js +++ b/docs/html/class_painting_area.js @@ -2,11 +2,11 @@ var class_painting_area = [ [ "PaintingArea", "class_painting_area.html#a4fa0ec23e78cc59f28c823584c721460", null ], [ "~PaintingArea", "class_painting_area.html#aa32adc113f77031945f73e33051931e8", null ], - [ "addLayer", "class_painting_area.html#a39ad76e1319659bfa38eee88ef33d395", null ], - [ "addLayerAt", "class_painting_area.html#ae756003b49aead863b49616ea7a44cc0", null ], + [ "addLayer", "class_painting_area.html#a6e9207612cef104d39013564696fe989", null ], + [ "addLayerAt", "class_painting_area.html#ab4a0b3a497ea8821a045ad12c34bd980", null ], [ "colorPickerSetFirstColor", "class_painting_area.html#a4735d4cf1dc58a9096d904e74c39c4df", null ], [ "colorPickerSetSecondColor", "class_painting_area.html#ae261acaaa346610dfed489dbac17e789", null ], - [ "colorPickerSwitchColor", "class_painting_area.html#a66115307ff4a99cd7ca16423c5c8ecfb", null ], + [ "colorPickerSwapColors", "class_painting_area.html#acff4563d006fda491469bd41778d07eb", null ], [ "createCircleTool", "class_painting_area.html#a2d9f4b3585f7dd1acb11f432ca503466", null ], [ "createFloodFillTool", "class_painting_area.html#a0b22e18069b524f3e75857d203baf256", null ], [ "createLineTool", "class_painting_area.html#a240c33a7875addac86080cdfb0db036a", null ], @@ -14,22 +14,28 @@ var class_painting_area = [ "createPlainTool", "class_painting_area.html#a3de83443d2d5cf460ff48d0602070938", null ], [ "createPolygonTool", "class_painting_area.html#a13c2f94644bea9c2d3123d0b7898f34b", null ], [ "createRectangleTool", "class_painting_area.html#a5b04ce62ce024e307f54e0281f7ae4bd", null ], - [ "deleteLayer", "class_painting_area.html#a6efad6f8ea060674b157b42b431cd173", null ], + [ "deleteLayer", "class_painting_area.html#a2382ebf8c31dee36cb714f34a18b71e4", null ], [ "floodFill", "class_painting_area.html#aeb5eb394b979ea90f2be9849fdda1774", null ], [ "getHeightOfActive", "class_painting_area.html#ac576f58aad03b4dcd47611b6a4b9abb4", null ], + [ "getImageOfActiveLayer", "class_painting_area.html#acab11ad35d07e9081203d8217d2c0855", null ], + [ "getNumberOfActiveLayer", "class_painting_area.html#a24280454ebb80db7feba2fd621513353", null ], + [ "getPolygonDataOfRealLayer", "class_painting_area.html#a7ae21fd031ee1c04f92e042e86be0a90", null ], + [ "getTypeOfImageRealLayer", "class_painting_area.html#ae92b27dfd09573c224d2ae1958d3bead", null ], [ "getWidthOfActive", "class_painting_area.html#a675ee91b26b1c58be6d833f279d81597", null ], [ "mouseMoveEvent", "class_painting_area.html#aa22e274b6094a9619f196cd7b49526b5", null ], [ "mousePressEvent", "class_painting_area.html#abfe445f8d9b70ae42bfeda874127dd15", null ], [ "mouseReleaseEvent", "class_painting_area.html#a35b5df914acb608cc29717659793359c", null ], [ "moveActiveLayer", "class_painting_area.html#ae05f6893fb44bfcb34018573a609cd1a", null ], [ "movePositionActive", "class_painting_area.html#ac6d089f4357b22d9a9906fd4771de3e7", null ], - [ "open", "class_painting_area.html#a1f597740b4d7b4bc2e24c51f8cb0b6eb", null ], + [ "open", "class_painting_area.html#a88c7e759aa8375a56129791645f46ea5", null ], [ "paintEvent", "class_painting_area.html#a4a8138b9508ee4ec87a7fca9160368a7", null ], [ "resizeEvent", "class_painting_area.html#ab57e8ccda60fff7187463a90e65c5335", null ], - [ "save", "class_painting_area.html#a612176cc9d629d22fd3fe1a746cce564", null ], - [ "setAlphaOfLayer", "class_painting_area.html#aec59be20f1c27135700754882dd6383d", null ], - [ "setLayerToActive", "class_painting_area.html#a1d6d86c25efdce9fe9031a9cd01c74c8", null ], + [ "save", "class_painting_area.html#aa2463d4f403224086acab02903ae407e", null ], + [ "setLayerActive", "class_painting_area.html#a79eb059829f27e8cdb3a54c5cd3d12c9", null ], + [ "setLayerAlpha", "class_painting_area.html#a6c7e0865e684ae1089ee283b4399d055", null ], [ "slotActivateLayer", "class_painting_area.html#a71ac281e0de263208d4a3b9de74258ec", null ], [ "slotDeleteActiveLayer", "class_painting_area.html#a1ff0b9c1227531943c9cec2c546fae5e", null ], - [ "wheelEvent", "class_painting_area.html#a632848d99f44d33d7da2618fbc6775a4", null ] + [ "wheelEvent", "class_painting_area.html#a632848d99f44d33d7da2618fbc6775a4", null ], + [ "colorPicker", "class_painting_area.html#a132535c4e16052c1472cf1b9f3e096ed", null ], + [ "Toolsettings", "class_painting_area.html#abc2f798744f1dc805a651731eb1692ea", null ] ]; \ No newline at end of file diff --git a/docs/html/class_painting_area.png b/docs/html/class_painting_area.png new file mode 100644 index 0000000000000000000000000000000000000000..19583251a5f849efdcf1dbad380c8ad8c68a05be GIT binary patch literal 448 zcmV;x0YCnUP);c41?{L=KeR{>4cU5=^qO#brlU3q(i@g4i_jQGFUeoKD8#A)P8EVReAj^py<}ex+oDb?Sh(cW>j=$XGA2oYpVV#c-4tW(GID5+A&p+ z^qE&><+D06*---x^%wh^>b3Fe)xh@!B2u*8yLFz`LoKg`h)At2uWseXm+-|@k{m4n zxTysIhHDCSS!Q6TP(RQK*g4c!)j&{#8q}Z$HK;-Tw^WiGE)W0)E2xvHdUWQw8F?>0 zHIu1FQ~mVwHMUf>{B^jFQt@f9hTBZd(?7TWwl_7@9jQzwNHbDKk& Node1 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; Node2 [label="QWidget",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; + Node3 -> Node1 [dir="back",color="darkorchid3",fontsize="10",style="dashed",label=" colorPicker" ,fontname="Helvetica"]; + Node3 [label="IntelliColorPicker",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_color_picker.html",tooltip="The IntelliColorPicker manages the selected colors for one whole project."]; + Node4 -> Node1 [dir="back",color="darkorchid3",fontsize="10",style="dashed",label=" Toolsettings" ,fontname="Helvetica"]; + Node4 [label="IntelliToolsettings",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_toolsettings.html",tooltip=" "]; } diff --git a/docs/html/class_painting_area_a24280454ebb80db7feba2fd621513353_icgraph.dot b/docs/html/class_painting_area_a24280454ebb80db7feba2fd621513353_icgraph.dot new file mode 100644 index 0000000..1dcbf8a --- /dev/null +++ b/docs/html/class_painting_area_a24280454ebb80db7feba2fd621513353_icgraph.dot @@ -0,0 +1,10 @@ +digraph "PaintingArea::getNumberOfActiveLayer" +{ + // LATEX_PDF_SIZE + edge [fontname="Helvetica",fontsize="10",labelfontname="Helvetica",labelfontsize="10"]; + node [fontname="Helvetica",fontsize="10",shape=record]; + rankdir="RL"; + Node1 [label="PaintingArea::getNumberOf\lActiveLayer",height=0.2,width=0.4,color="black", fillcolor="grey75", style="filled", fontcolor="black",tooltip=" "]; + Node1 -> Node2 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node2 [label="IntelliPhotoGui::UpdateGui",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_photo_gui.html#a1dbef8d4688227aa9455aea52db00bf4",tooltip=" "]; +} diff --git a/docs/html/class_painting_area_a4fa0ec23e78cc59f28c823584c721460_cgraph.dot b/docs/html/class_painting_area_a4fa0ec23e78cc59f28c823584c721460_cgraph.dot index 2e73c54..c255ea7 100644 --- a/docs/html/class_painting_area_a4fa0ec23e78cc59f28c823584c721460_cgraph.dot +++ b/docs/html/class_painting_area_a4fa0ec23e78cc59f28c823584c721460_cgraph.dot @@ -6,5 +6,7 @@ digraph "PaintingArea::PaintingArea" rankdir="LR"; Node1 [label="PaintingArea::PaintingArea",height=0.2,width=0.4,color="black", fillcolor="grey75", style="filled", fontcolor="black",tooltip="PaintingArea is the constructor of the PaintingArea class, which initiates the working environment."]; Node1 -> Node2 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node2 [label="PaintingArea::addLayer",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_painting_area.html#a39ad76e1319659bfa38eee88ef33d395",tooltip="The addLayer adds a layer to the current project/ painting area."]; + Node2 [label="PaintingArea::addLayer",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_painting_area.html#a6e9207612cef104d39013564696fe989",tooltip="The addLayer adds a layer to the current project/ painting area."]; + Node2 -> Node3 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node3 [label="IntelliRenderSettings\l::getFastRenderer",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_render_settings.html#a5a74e7d7ed3a2e944883dddbe8bbf5e8",tooltip="The getfastRenderer gets the value of the flag for the fastRenderer setting."]; } diff --git a/docs/html/class_painting_area_a675ee91b26b1c58be6d833f279d81597_icgraph.dot b/docs/html/class_painting_area_a675ee91b26b1c58be6d833f279d81597_icgraph.dot new file mode 100644 index 0000000..c5ccaaa --- /dev/null +++ b/docs/html/class_painting_area_a675ee91b26b1c58be6d833f279d81597_icgraph.dot @@ -0,0 +1,10 @@ +digraph "PaintingArea::getWidthOfActive" +{ + // LATEX_PDF_SIZE + edge [fontname="Helvetica",fontsize="10",labelfontname="Helvetica",labelfontsize="10"]; + node [fontname="Helvetica",fontsize="10",shape=record]; + rankdir="RL"; + Node1 [label="PaintingArea::getWidthOf\lActive",height=0.2,width=0.4,color="black", fillcolor="grey75", style="filled", fontcolor="black",tooltip="The getWidthOfActive gets the horizontal dimensions of the active layer."]; + Node1 -> Node2 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node2 [label="IntelliToolPolygon\l::onMouseLeftPressed",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_polygon.html#ad5d3b741be6d0647a9cdc9da2cb8bc3d",tooltip="A function managing the left click pressed of a mouse. Setting polygon points."]; +} diff --git a/docs/html/class_painting_area_a6e9207612cef104d39013564696fe989_cgraph.dot b/docs/html/class_painting_area_a6e9207612cef104d39013564696fe989_cgraph.dot new file mode 100644 index 0000000..bfa4706 --- /dev/null +++ b/docs/html/class_painting_area_a6e9207612cef104d39013564696fe989_cgraph.dot @@ -0,0 +1,10 @@ +digraph "PaintingArea::addLayer" +{ + // LATEX_PDF_SIZE + edge [fontname="Helvetica",fontsize="10",labelfontname="Helvetica",labelfontsize="10"]; + node [fontname="Helvetica",fontsize="10",shape=record]; + rankdir="LR"; + Node1 [label="PaintingArea::addLayer",height=0.2,width=0.4,color="black", fillcolor="grey75", style="filled", fontcolor="black",tooltip="The addLayer adds a layer to the current project/ painting area."]; + Node1 -> Node2 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node2 [label="IntelliRenderSettings\l::getFastRenderer",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_render_settings.html#a5a74e7d7ed3a2e944883dddbe8bbf5e8",tooltip="The getfastRenderer gets the value of the flag for the fastRenderer setting."]; +} diff --git a/docs/html/class_painting_area_a6e9207612cef104d39013564696fe989_icgraph.dot b/docs/html/class_painting_area_a6e9207612cef104d39013564696fe989_icgraph.dot new file mode 100644 index 0000000..5bc9f21 --- /dev/null +++ b/docs/html/class_painting_area_a6e9207612cef104d39013564696fe989_icgraph.dot @@ -0,0 +1,10 @@ +digraph "PaintingArea::addLayer" +{ + // LATEX_PDF_SIZE + edge [fontname="Helvetica",fontsize="10",labelfontname="Helvetica",labelfontsize="10"]; + node [fontname="Helvetica",fontsize="10",shape=record]; + rankdir="RL"; + Node1 [label="PaintingArea::addLayer",height=0.2,width=0.4,color="black", fillcolor="grey75", style="filled", fontcolor="black",tooltip="The addLayer adds a layer to the current project/ painting area."]; + Node1 -> Node2 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node2 [label="PaintingArea::PaintingArea",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_painting_area.html#a4fa0ec23e78cc59f28c823584c721460",tooltip="PaintingArea is the constructor of the PaintingArea class, which initiates the working environment."]; +} diff --git a/docs/html/class_painting_area_a71ac281e0de263208d4a3b9de74258ec_cgraph.dot b/docs/html/class_painting_area_a71ac281e0de263208d4a3b9de74258ec_cgraph.dot index ebfbcb4..09a5ca7 100644 --- a/docs/html/class_painting_area_a71ac281e0de263208d4a3b9de74258ec_cgraph.dot +++ b/docs/html/class_painting_area_a71ac281e0de263208d4a3b9de74258ec_cgraph.dot @@ -6,5 +6,7 @@ digraph "PaintingArea::slotActivateLayer" rankdir="LR"; Node1 [label="PaintingArea::slotActivate\lLayer",height=0.2,width=0.4,color="black", fillcolor="grey75", style="filled", fontcolor="black",tooltip="The slotActivateLayer method handles the event of selecting one layer as active."]; Node1 -> Node2 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node2 [label="PaintingArea::setLayerTo\lActive",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_painting_area.html#a1d6d86c25efdce9fe9031a9cd01c74c8",tooltip="The setLayerToActive method marks a specific layer as active."]; + Node2 [label="IntelliTool::getIsDrawing",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool.html#a0020fad2e26315d5c4d96dbc95d1dceb",tooltip=" "]; + Node1 -> Node3 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node3 [label="PaintingArea::setLayerActive",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_painting_area.html#a79eb059829f27e8cdb3a54c5cd3d12c9",tooltip="The setLayerToActive method marks a specific layer as active."]; } diff --git a/docs/html/class_painting_area_a79eb059829f27e8cdb3a54c5cd3d12c9_icgraph.dot b/docs/html/class_painting_area_a79eb059829f27e8cdb3a54c5cd3d12c9_icgraph.dot new file mode 100644 index 0000000..26280ee --- /dev/null +++ b/docs/html/class_painting_area_a79eb059829f27e8cdb3a54c5cd3d12c9_icgraph.dot @@ -0,0 +1,10 @@ +digraph "PaintingArea::setLayerActive" +{ + // LATEX_PDF_SIZE + edge [fontname="Helvetica",fontsize="10",labelfontname="Helvetica",labelfontsize="10"]; + node [fontname="Helvetica",fontsize="10",shape=record]; + rankdir="RL"; + Node1 [label="PaintingArea::setLayerActive",height=0.2,width=0.4,color="black", fillcolor="grey75", style="filled", fontcolor="black",tooltip="The setLayerToActive method marks a specific layer as active."]; + Node1 -> Node2 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node2 [label="PaintingArea::slotActivate\lLayer",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_painting_area.html#a71ac281e0de263208d4a3b9de74258ec",tooltip="The slotActivateLayer method handles the event of selecting one layer as active."]; +} diff --git a/docs/html/class_painting_area_a7ae21fd031ee1c04f92e042e86be0a90_icgraph.dot b/docs/html/class_painting_area_a7ae21fd031ee1c04f92e042e86be0a90_icgraph.dot new file mode 100644 index 0000000..267b794 --- /dev/null +++ b/docs/html/class_painting_area_a7ae21fd031ee1c04f92e042e86be0a90_icgraph.dot @@ -0,0 +1,10 @@ +digraph "PaintingArea::getPolygonDataOfRealLayer" +{ + // LATEX_PDF_SIZE + edge [fontname="Helvetica",fontsize="10",labelfontname="Helvetica",labelfontsize="10"]; + node [fontname="Helvetica",fontsize="10",shape=record]; + rankdir="RL"; + Node1 [label="PaintingArea::getPolygon\lDataOfRealLayer",height=0.2,width=0.4,color="black", fillcolor="grey75", style="filled", fontcolor="black",tooltip=" "]; + Node1 -> Node2 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node2 [label="IntelliToolPolygon\l::onMouseLeftPressed",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_polygon.html#ad5d3b741be6d0647a9cdc9da2cb8bc3d",tooltip="A function managing the left click pressed of a mouse. Setting polygon points."]; +} diff --git a/docs/html/class_painting_area_a88c7e759aa8375a56129791645f46ea5_cgraph.dot b/docs/html/class_painting_area_a88c7e759aa8375a56129791645f46ea5_cgraph.dot new file mode 100644 index 0000000..4323961 --- /dev/null +++ b/docs/html/class_painting_area_a88c7e759aa8375a56129791645f46ea5_cgraph.dot @@ -0,0 +1,12 @@ +digraph "PaintingArea::open" +{ + // LATEX_PDF_SIZE + edge [fontname="Helvetica",fontsize="10",labelfontname="Helvetica",labelfontsize="10"]; + node [fontname="Helvetica",fontsize="10",shape=record]; + rankdir="LR"; + Node1 [label="PaintingArea::open",height=0.2,width=0.4,color="black", fillcolor="grey75", style="filled", fontcolor="black",tooltip="The open method is used for loading a picture into the current layer."]; + Node1 -> Node2 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node2 [label="IntelliImage::calculateVisiblity",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_image.html#aebbced93f4744fad81b7f141b21f4ab2",tooltip="An abstract function that calculates the visiblity of the Image data if needed."]; + Node1 -> Node3 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node3 [label="IntelliImage::loadImage",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_image.html#ae231800aba38c96074bbe9bb6e341d4e",tooltip="A function that loads and sclaes an image to the fitting dimensions."]; +} diff --git a/docs/html/class_painting_area_ac576f58aad03b4dcd47611b6a4b9abb4_icgraph.dot b/docs/html/class_painting_area_ac576f58aad03b4dcd47611b6a4b9abb4_icgraph.dot new file mode 100644 index 0000000..36587d6 --- /dev/null +++ b/docs/html/class_painting_area_ac576f58aad03b4dcd47611b6a4b9abb4_icgraph.dot @@ -0,0 +1,10 @@ +digraph "PaintingArea::getHeightOfActive" +{ + // LATEX_PDF_SIZE + edge [fontname="Helvetica",fontsize="10",labelfontname="Helvetica",labelfontsize="10"]; + node [fontname="Helvetica",fontsize="10",shape=record]; + rankdir="RL"; + Node1 [label="PaintingArea::getHeightOf\lActive",height=0.2,width=0.4,color="black", fillcolor="grey75", style="filled", fontcolor="black",tooltip="The getHeightOfActive gets the vertical dimensions of the active layer."]; + Node1 -> Node2 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node2 [label="IntelliToolPolygon\l::onMouseLeftPressed",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_polygon.html#ad5d3b741be6d0647a9cdc9da2cb8bc3d",tooltip="A function managing the left click pressed of a mouse. Setting polygon points."]; +} diff --git a/docs/html/class_painting_area_ac6d089f4357b22d9a9906fd4771de3e7_cgraph.dot b/docs/html/class_painting_area_ac6d089f4357b22d9a9906fd4771de3e7_cgraph.dot new file mode 100644 index 0000000..45a831c --- /dev/null +++ b/docs/html/class_painting_area_ac6d089f4357b22d9a9906fd4771de3e7_cgraph.dot @@ -0,0 +1,10 @@ +digraph "PaintingArea::movePositionActive" +{ + // LATEX_PDF_SIZE + edge [fontname="Helvetica",fontsize="10",labelfontname="Helvetica",labelfontsize="10"]; + node [fontname="Helvetica",fontsize="10",shape=record]; + rankdir="LR"; + Node1 [label="PaintingArea::movePosition\lActive",height=0.2,width=0.4,color="black", fillcolor="grey75", style="filled", fontcolor="black",tooltip="The movePositionActive method moves the active layer to certain position."]; + Node1 -> Node2 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node2 [label="IntelliTool::getIsDrawing",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool.html#a0020fad2e26315d5c4d96dbc95d1dceb",tooltip=" "]; +} diff --git a/docs/html/class_painting_area_acab11ad35d07e9081203d8217d2c0855_icgraph.dot b/docs/html/class_painting_area_acab11ad35d07e9081203d8217d2c0855_icgraph.dot new file mode 100644 index 0000000..bfcef17 --- /dev/null +++ b/docs/html/class_painting_area_acab11ad35d07e9081203d8217d2c0855_icgraph.dot @@ -0,0 +1,10 @@ +digraph "PaintingArea::getImageOfActiveLayer" +{ + // LATEX_PDF_SIZE + edge [fontname="Helvetica",fontsize="10",labelfontname="Helvetica",labelfontsize="10"]; + node [fontname="Helvetica",fontsize="10",shape=record]; + rankdir="RL"; + Node1 [label="PaintingArea::getImageOf\lActiveLayer",height=0.2,width=0.4,color="black", fillcolor="grey75", style="filled", fontcolor="black",tooltip=" "]; + Node1 -> Node2 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node2 [label="IntelliPhotoGui::UpdateGui",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_photo_gui.html#a1dbef8d4688227aa9455aea52db00bf4",tooltip=" "]; +} diff --git a/docs/html/class_painting_area_acff4563d006fda491469bd41778d07eb_cgraph.dot b/docs/html/class_painting_area_acff4563d006fda491469bd41778d07eb_cgraph.dot new file mode 100644 index 0000000..90a05ac --- /dev/null +++ b/docs/html/class_painting_area_acff4563d006fda491469bd41778d07eb_cgraph.dot @@ -0,0 +1,10 @@ +digraph "PaintingArea::colorPickerSwapColors" +{ + // LATEX_PDF_SIZE + edge [fontname="Helvetica",fontsize="10",labelfontname="Helvetica",labelfontsize="10"]; + node [fontname="Helvetica",fontsize="10",shape=record]; + rankdir="LR"; + Node1 [label="PaintingArea::colorPicker\lSwapColors",height=0.2,width=0.4,color="black", fillcolor="grey75", style="filled", fontcolor="black",tooltip="The colorPickerSwitchColor swaps the primary color with the secondary drawing color."]; + Node1 -> Node2 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node2 [label="IntelliColorPicker\l::swapColors",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_color_picker.html#aec499265ae28ce1b54be88222e74292e",tooltip="A function switching primary and secondary color."]; +} diff --git a/docs/html/class_painting_area_ae05f6893fb44bfcb34018573a609cd1a_cgraph.dot b/docs/html/class_painting_area_ae05f6893fb44bfcb34018573a609cd1a_cgraph.dot new file mode 100644 index 0000000..d874bcc --- /dev/null +++ b/docs/html/class_painting_area_ae05f6893fb44bfcb34018573a609cd1a_cgraph.dot @@ -0,0 +1,10 @@ +digraph "PaintingArea::moveActiveLayer" +{ + // LATEX_PDF_SIZE + edge [fontname="Helvetica",fontsize="10",labelfontname="Helvetica",labelfontsize="10"]; + node [fontname="Helvetica",fontsize="10",shape=record]; + rankdir="LR"; + Node1 [label="PaintingArea::moveActive\lLayer",height=0.2,width=0.4,color="black", fillcolor="grey75", style="filled", fontcolor="black",tooltip="The moveActiveLayer moves the active layer to a specific position in the layer stack."]; + Node1 -> Node2 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node2 [label="IntelliTool::getIsDrawing",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool.html#a0020fad2e26315d5c4d96dbc95d1dceb",tooltip=" "]; +} diff --git a/docs/html/class_painting_area_ae92b27dfd09573c224d2ae1958d3bead_icgraph.dot b/docs/html/class_painting_area_ae92b27dfd09573c224d2ae1958d3bead_icgraph.dot new file mode 100644 index 0000000..affd678 --- /dev/null +++ b/docs/html/class_painting_area_ae92b27dfd09573c224d2ae1958d3bead_icgraph.dot @@ -0,0 +1,10 @@ +digraph "PaintingArea::getTypeOfImageRealLayer" +{ + // LATEX_PDF_SIZE + edge [fontname="Helvetica",fontsize="10",labelfontname="Helvetica",labelfontsize="10"]; + node [fontname="Helvetica",fontsize="10",shape=record]; + rankdir="RL"; + Node1 [label="PaintingArea::getTypeOfImage\lRealLayer",height=0.2,width=0.4,color="black", fillcolor="grey75", style="filled", fontcolor="black",tooltip=" "]; + Node1 -> Node2 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node2 [label="IntelliToolPolygon\l::onMouseLeftPressed",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_polygon.html#ad5d3b741be6d0647a9cdc9da2cb8bc3d",tooltip="A function managing the left click pressed of a mouse. Setting polygon points."]; +} diff --git a/docs/html/classes.html b/docs/html/classes.html index 6b48435..df8459d 100644 --- a/docs/html/classes.html +++ b/docs/html/classes.html @@ -94,34 +94,38 @@ $(document).ready(function(){initNavTree('classes.html','');}); - - - - - - + - + + + + + - - - - + + + - - + - + - + + + + + + +
  i  
IntelliRasterImage   IntelliToolLine   
  l  
-
  t  
-
IntelliShapedImage   IntelliRenderSettings    IntelliToolPen   
  p  
+
IntelliShapedImage   IntelliToolPlainTool   
IntelliColorPicker    IntelliTool   IntelliToolPlainTool   LayerObject   Triangle   
IntelliToolPolygon   PaintingArea   
IntelliImage    IntelliToolCircle   IntelliToolPolygon   
  p  
+
IntelliToolRectangle   
  t  
IntelliPhotoGui    IntelliToolFloodFill   IntelliToolRectangle   IntelliToolsettings   
PaintingArea   
IntelliRasterImage   IntelliToolLine   
  l  
+
Triangle   
LayerObject   
i | l | p | t
diff --git a/docs/html/dir_000003_000004.html b/docs/html/dir_000003_000004.html index e873f5c..5e8a2ec 100644 --- a/docs/html/dir_000003_000004.html +++ b/docs/html/dir_000003_000004.html @@ -86,7 +86,7 @@ $(document).ready(function(){initNavTree('dir_544f9dcb748f922e4bb3be2540380bf2.h
-

Image → IntelliHelper Relation

File in intelliphoto/src/ImageIncludes file in intelliphoto/src/IntelliHelper
IntelliShapedImage.cppIntelliHelper.h
IntelliShapedImage.hIntelliHelper.h
+

Image → IntelliHelper Relation

File in intelliphoto/src/ImageIncludes file in intelliphoto/src/IntelliHelper
IntelliImage.hIntelliRenderSettings.h
IntelliImage.hIntelliTriangulation.h
IntelliShapedImage.cppIntelliTriangulation.h
-

Tool → IntelliHelper Relation

File in intelliphoto/src/ToolIncludes file in intelliphoto/src/IntelliHelper
IntelliColorPicker.cppIntelliColorPicker.h
IntelliTool.hIntelliColorPicker.h
IntelliToolPolygon.hIntelliHelper.h
+

Tool → IntelliHelper Relation

File in intelliphoto/src/ToolIncludes file in intelliphoto/src/IntelliHelper
IntelliColorPicker.cppIntelliColorPicker.h
IntelliTool.hIntelliColorPicker.h
IntelliTool.hIntelliToolsettings.h
IntelliToolPolygon.hIntelliTriangulation.h
-
-Directory dependency graph for Image:
-
-
intelliphoto/src/Image
-
diff --git a/docs/html/dir_544f9dcb748f922e4bb3be2540380bf2.js b/docs/html/dir_544f9dcb748f922e4bb3be2540380bf2.js index a3d97dc..ee724b4 100644 --- a/docs/html/dir_544f9dcb748f922e4bb3be2540380bf2.js +++ b/docs/html/dir_544f9dcb748f922e4bb3be2540380bf2.js @@ -1,7 +1,9 @@ var dir_544f9dcb748f922e4bb3be2540380bf2 = [ [ "IntelliImage.cpp", "_intelli_image_8cpp.html", null ], - [ "IntelliImage.h", "_intelli_image_8h.html", "_intelli_image_8h" ], + [ "IntelliImage.h", "_intelli_image_8h.html", [ + [ "IntelliImage", "class_intelli_image.html", "class_intelli_image" ] + ] ], [ "IntelliRasterImage.cpp", "_intelli_raster_image_8cpp.html", null ], [ "IntelliRasterImage.h", "_intelli_raster_image_8h.html", [ [ "IntelliRasterImage", "class_intelli_raster_image.html", "class_intelli_raster_image" ] diff --git a/docs/html/dir_544f9dcb748f922e4bb3be2540380bf2_dep.dot b/docs/html/dir_544f9dcb748f922e4bb3be2540380bf2_dep.dot index b32b5f7..0a903f5 100644 --- a/docs/html/dir_544f9dcb748f922e4bb3be2540380bf2_dep.dot +++ b/docs/html/dir_544f9dcb748f922e4bb3be2540380bf2_dep.dot @@ -7,5 +7,5 @@ digraph "intelliphoto/src/Image" { dir_544f9dcb748f922e4bb3be2540380bf2 [shape=box, label="Image", style="filled", fillcolor="#eeeeff", pencolor="black", URL="dir_544f9dcb748f922e4bb3be2540380bf2.html"]; } dir_f50aa5156fe016a259583c412dbf440c [shape=box label="IntelliHelper" URL="dir_f50aa5156fe016a259583c412dbf440c.html"]; - dir_544f9dcb748f922e4bb3be2540380bf2->dir_f50aa5156fe016a259583c412dbf440c [headlabel="2", labeldistance=1.5 headhref="dir_000003_000004.html"]; + dir_544f9dcb748f922e4bb3be2540380bf2->dir_f50aa5156fe016a259583c412dbf440c [headlabel="3", labeldistance=1.5 headhref="dir_000003_000004.html"]; } diff --git a/docs/html/dir_5dabb14988a75c922e285f444641a133.html b/docs/html/dir_5dabb14988a75c922e285f444641a133.html index aef6509..84c5623 100644 --- a/docs/html/dir_5dabb14988a75c922e285f444641a133.html +++ b/docs/html/dir_5dabb14988a75c922e285f444641a133.html @@ -90,11 +90,6 @@ $(document).ready(function(){initNavTree('dir_5dabb14988a75c922e285f444641a133.h
GUI Directory Reference
-
-Directory dependency graph for GUI:
-
-
intelliphoto/src/GUI
-

Files

diff --git a/docs/html/dir_5dabb14988a75c922e285f444641a133_dep.dot b/docs/html/dir_5dabb14988a75c922e285f444641a133_dep.dot index d4cfd7f..0ccb450 100644 --- a/docs/html/dir_5dabb14988a75c922e285f444641a133_dep.dot +++ b/docs/html/dir_5dabb14988a75c922e285f444641a133_dep.dot @@ -7,5 +7,6 @@ digraph "intelliphoto/src/GUI" { dir_5dabb14988a75c922e285f444641a133 [shape=box, label="GUI", style="filled", fillcolor="#eeeeff", pencolor="black", URL="dir_5dabb14988a75c922e285f444641a133.html"]; } dir_e6d96184223881d115efa44ca0dfa844 [shape=box label="Layer" URL="dir_e6d96184223881d115efa44ca0dfa844.html"]; + dir_e6d96184223881d115efa44ca0dfa844->dir_5dabb14988a75c922e285f444641a133 [headlabel="1", labeldistance=1.5 headhref="dir_000006_000002.html"]; dir_5dabb14988a75c922e285f444641a133->dir_e6d96184223881d115efa44ca0dfa844 [headlabel="1", labeldistance=1.5 headhref="dir_000002_000006.html"]; } diff --git a/docs/html/dir_83a4347d11f2ba6343d546ab133722d2.html b/docs/html/dir_83a4347d11f2ba6343d546ab133722d2.html index 25ae04d..eaac0f5 100644 --- a/docs/html/dir_83a4347d11f2ba6343d546ab133722d2.html +++ b/docs/html/dir_83a4347d11f2ba6343d546ab133722d2.html @@ -90,11 +90,6 @@ $(document).ready(function(){initNavTree('dir_83a4347d11f2ba6343d546ab133722d2.h
src Directory Reference
-
-Directory dependency graph for src:
-
-
intelliphoto/src
-

Files

diff --git a/docs/html/dir_83a4347d11f2ba6343d546ab133722d2_dep.dot b/docs/html/dir_83a4347d11f2ba6343d546ab133722d2_dep.dot index d03004d..86cdd37 100644 --- a/docs/html/dir_83a4347d11f2ba6343d546ab133722d2_dep.dot +++ b/docs/html/dir_83a4347d11f2ba6343d546ab133722d2_dep.dot @@ -14,12 +14,12 @@ digraph "intelliphoto/src" { dir_941490de56ac122cf77df9922cbcc750 [shape=box label="Tool" color="black" fillcolor="white" style="filled" URL="dir_941490de56ac122cf77df9922cbcc750.html"]; } } - dir_544f9dcb748f922e4bb3be2540380bf2->dir_f50aa5156fe016a259583c412dbf440c [headlabel="2", labeldistance=1.5 headhref="dir_000003_000004.html"]; + dir_544f9dcb748f922e4bb3be2540380bf2->dir_f50aa5156fe016a259583c412dbf440c [headlabel="3", labeldistance=1.5 headhref="dir_000003_000004.html"]; dir_e6d96184223881d115efa44ca0dfa844->dir_544f9dcb748f922e4bb3be2540380bf2 [headlabel="5", labeldistance=1.5 headhref="dir_000006_000003.html"]; dir_e6d96184223881d115efa44ca0dfa844->dir_f50aa5156fe016a259583c412dbf440c [headlabel="1", labeldistance=1.5 headhref="dir_000006_000004.html"]; + dir_e6d96184223881d115efa44ca0dfa844->dir_5dabb14988a75c922e285f444641a133 [headlabel="1", labeldistance=1.5 headhref="dir_000006_000002.html"]; dir_e6d96184223881d115efa44ca0dfa844->dir_941490de56ac122cf77df9922cbcc750 [headlabel="8", labeldistance=1.5 headhref="dir_000006_000005.html"]; dir_5dabb14988a75c922e285f444641a133->dir_e6d96184223881d115efa44ca0dfa844 [headlabel="1", labeldistance=1.5 headhref="dir_000002_000006.html"]; - dir_83a4347d11f2ba6343d546ab133722d2->dir_5dabb14988a75c922e285f444641a133 [headlabel="1", labeldistance=1.5 headhref="dir_000001_000002.html"]; dir_941490de56ac122cf77df9922cbcc750->dir_e6d96184223881d115efa44ca0dfa844 [headlabel="8", labeldistance=1.5 headhref="dir_000005_000006.html"]; - dir_941490de56ac122cf77df9922cbcc750->dir_f50aa5156fe016a259583c412dbf440c [headlabel="3", labeldistance=1.5 headhref="dir_000005_000004.html"]; + dir_941490de56ac122cf77df9922cbcc750->dir_f50aa5156fe016a259583c412dbf440c [headlabel="4", labeldistance=1.5 headhref="dir_000005_000004.html"]; } diff --git a/docs/html/dir_8db5f55022e7670536cbc9a6a1d6f01c.html b/docs/html/dir_8db5f55022e7670536cbc9a6a1d6f01c.html index d5a13c5..feccf2d 100644 --- a/docs/html/dir_8db5f55022e7670536cbc9a6a1d6f01c.html +++ b/docs/html/dir_8db5f55022e7670536cbc9a6a1d6f01c.html @@ -90,11 +90,6 @@ $(document).ready(function(){initNavTree('dir_8db5f55022e7670536cbc9a6a1d6f01c.h
intelliphoto Directory Reference
-
-Directory dependency graph for intelliphoto:
-
-
intelliphoto
-

Directories

diff --git a/docs/html/dir_941490de56ac122cf77df9922cbcc750.html b/docs/html/dir_941490de56ac122cf77df9922cbcc750.html index f8d19cd..5ea229b 100644 --- a/docs/html/dir_941490de56ac122cf77df9922cbcc750.html +++ b/docs/html/dir_941490de56ac122cf77df9922cbcc750.html @@ -90,11 +90,6 @@ $(document).ready(function(){initNavTree('dir_941490de56ac122cf77df9922cbcc750.h
Tool Directory Reference
-
-Directory dependency graph for Tool:
-
-
intelliphoto/src/Tool
-

Directories

diff --git a/docs/html/dir_941490de56ac122cf77df9922cbcc750.js b/docs/html/dir_941490de56ac122cf77df9922cbcc750.js index 3600677..763beb5 100644 --- a/docs/html/dir_941490de56ac122cf77df9922cbcc750.js +++ b/docs/html/dir_941490de56ac122cf77df9922cbcc750.js @@ -14,7 +14,9 @@ var dir_941490de56ac122cf77df9922cbcc750 = [ "IntelliToolFloodFill", "class_intelli_tool_flood_fill.html", "class_intelli_tool_flood_fill" ] ] ], [ "IntelliToolLine.cpp", "_intelli_tool_line_8cpp.html", null ], - [ "IntelliToolLine.h", "_intelli_tool_line_8h.html", "_intelli_tool_line_8h" ], + [ "IntelliToolLine.h", "_intelli_tool_line_8h.html", [ + [ "IntelliToolLine", "class_intelli_tool_line.html", "class_intelli_tool_line" ] + ] ], [ "IntelliToolPen.cpp", "_intelli_tool_pen_8cpp.html", null ], [ "IntelliToolPen.h", "_intelli_tool_pen_8h.html", [ [ "IntelliToolPen", "class_intelli_tool_pen.html", "class_intelli_tool_pen" ] diff --git a/docs/html/dir_941490de56ac122cf77df9922cbcc750_dep.dot b/docs/html/dir_941490de56ac122cf77df9922cbcc750_dep.dot index b5345d4..e1afe26 100644 --- a/docs/html/dir_941490de56ac122cf77df9922cbcc750_dep.dot +++ b/docs/html/dir_941490de56ac122cf77df9922cbcc750_dep.dot @@ -11,5 +11,5 @@ digraph "intelliphoto/src/Tool" { dir_e6d96184223881d115efa44ca0dfa844->dir_f50aa5156fe016a259583c412dbf440c [headlabel="1", labeldistance=1.5 headhref="dir_000006_000004.html"]; dir_e6d96184223881d115efa44ca0dfa844->dir_941490de56ac122cf77df9922cbcc750 [headlabel="8", labeldistance=1.5 headhref="dir_000006_000005.html"]; dir_941490de56ac122cf77df9922cbcc750->dir_e6d96184223881d115efa44ca0dfa844 [headlabel="8", labeldistance=1.5 headhref="dir_000005_000006.html"]; - dir_941490de56ac122cf77df9922cbcc750->dir_f50aa5156fe016a259583c412dbf440c [headlabel="3", labeldistance=1.5 headhref="dir_000005_000004.html"]; + dir_941490de56ac122cf77df9922cbcc750->dir_f50aa5156fe016a259583c412dbf440c [headlabel="4", labeldistance=1.5 headhref="dir_000005_000004.html"]; } diff --git a/docs/html/dir_e6d96184223881d115efa44ca0dfa844.html b/docs/html/dir_e6d96184223881d115efa44ca0dfa844.html index 8c9cebb..67d4961 100644 --- a/docs/html/dir_e6d96184223881d115efa44ca0dfa844.html +++ b/docs/html/dir_e6d96184223881d115efa44ca0dfa844.html @@ -90,11 +90,6 @@ $(document).ready(function(){initNavTree('dir_e6d96184223881d115efa44ca0dfa844.h
Layer Directory Reference
-
-Directory dependency graph for Layer:
-
-
intelliphoto/src/Layer
-

Files

diff --git a/docs/html/dir_e6d96184223881d115efa44ca0dfa844_dep.dot b/docs/html/dir_e6d96184223881d115efa44ca0dfa844_dep.dot index 2340c84..1043121 100644 --- a/docs/html/dir_e6d96184223881d115efa44ca0dfa844_dep.dot +++ b/docs/html/dir_e6d96184223881d115efa44ca0dfa844_dep.dot @@ -8,11 +8,14 @@ digraph "intelliphoto/src/Layer" { } dir_544f9dcb748f922e4bb3be2540380bf2 [shape=box label="Image" URL="dir_544f9dcb748f922e4bb3be2540380bf2.html"]; dir_f50aa5156fe016a259583c412dbf440c [shape=box label="IntelliHelper" URL="dir_f50aa5156fe016a259583c412dbf440c.html"]; + dir_5dabb14988a75c922e285f444641a133 [shape=box label="GUI" URL="dir_5dabb14988a75c922e285f444641a133.html"]; dir_941490de56ac122cf77df9922cbcc750 [shape=box label="Tool" URL="dir_941490de56ac122cf77df9922cbcc750.html"]; - dir_544f9dcb748f922e4bb3be2540380bf2->dir_f50aa5156fe016a259583c412dbf440c [headlabel="2", labeldistance=1.5 headhref="dir_000003_000004.html"]; + dir_544f9dcb748f922e4bb3be2540380bf2->dir_f50aa5156fe016a259583c412dbf440c [headlabel="3", labeldistance=1.5 headhref="dir_000003_000004.html"]; dir_e6d96184223881d115efa44ca0dfa844->dir_544f9dcb748f922e4bb3be2540380bf2 [headlabel="5", labeldistance=1.5 headhref="dir_000006_000003.html"]; dir_e6d96184223881d115efa44ca0dfa844->dir_f50aa5156fe016a259583c412dbf440c [headlabel="1", labeldistance=1.5 headhref="dir_000006_000004.html"]; + dir_e6d96184223881d115efa44ca0dfa844->dir_5dabb14988a75c922e285f444641a133 [headlabel="1", labeldistance=1.5 headhref="dir_000006_000002.html"]; dir_e6d96184223881d115efa44ca0dfa844->dir_941490de56ac122cf77df9922cbcc750 [headlabel="8", labeldistance=1.5 headhref="dir_000006_000005.html"]; + dir_5dabb14988a75c922e285f444641a133->dir_e6d96184223881d115efa44ca0dfa844 [headlabel="1", labeldistance=1.5 headhref="dir_000002_000006.html"]; dir_941490de56ac122cf77df9922cbcc750->dir_e6d96184223881d115efa44ca0dfa844 [headlabel="8", labeldistance=1.5 headhref="dir_000005_000006.html"]; - dir_941490de56ac122cf77df9922cbcc750->dir_f50aa5156fe016a259583c412dbf440c [headlabel="3", labeldistance=1.5 headhref="dir_000005_000004.html"]; + dir_941490de56ac122cf77df9922cbcc750->dir_f50aa5156fe016a259583c412dbf440c [headlabel="4", labeldistance=1.5 headhref="dir_000005_000004.html"]; } diff --git a/docs/html/dir_f50aa5156fe016a259583c412dbf440c.html b/docs/html/dir_f50aa5156fe016a259583c412dbf440c.html index d052bde..a4a3593 100644 --- a/docs/html/dir_f50aa5156fe016a259583c412dbf440c.html +++ b/docs/html/dir_f50aa5156fe016a259583c412dbf440c.html @@ -97,9 +97,17 @@ Files - + - + + + + + + + + +

Files

 
file  IntelliColorPicker.h [code]
 
file  IntelliHelper.cpp [code]
file  IntelliRenderSettings.cpp [code]
 
file  IntelliHelper.h [code]
file  IntelliRenderSettings.h [code]
 
file  IntelliToolsettings.cpp [code]
 
file  IntelliToolsettings.h [code]
 
file  IntelliTriangulation.cpp [code]
 
file  IntelliTriangulation.h [code]
 
diff --git a/docs/html/dir_f50aa5156fe016a259583c412dbf440c.js b/docs/html/dir_f50aa5156fe016a259583c412dbf440c.js index b119077..55b1bfe 100644 --- a/docs/html/dir_f50aa5156fe016a259583c412dbf440c.js +++ b/docs/html/dir_f50aa5156fe016a259583c412dbf440c.js @@ -4,6 +4,14 @@ var dir_f50aa5156fe016a259583c412dbf440c = [ "IntelliColorPicker.h", "_intelli_color_picker_8h.html", [ [ "IntelliColorPicker", "class_intelli_color_picker.html", "class_intelli_color_picker" ] ] ], - [ "IntelliHelper.cpp", "_intelli_helper_8cpp.html", null ], - [ "IntelliHelper.h", "_intelli_helper_8h.html", "_intelli_helper_8h" ] + [ "IntelliRenderSettings.cpp", "_intelli_render_settings_8cpp.html", null ], + [ "IntelliRenderSettings.h", "_intelli_render_settings_8h.html", [ + [ "IntelliRenderSettings", "class_intelli_render_settings.html", "class_intelli_render_settings" ] + ] ], + [ "IntelliToolsettings.cpp", "_intelli_toolsettings_8cpp.html", null ], + [ "IntelliToolsettings.h", "_intelli_toolsettings_8h.html", [ + [ "IntelliToolsettings", "class_intelli_toolsettings.html", "class_intelli_toolsettings" ] + ] ], + [ "IntelliTriangulation.cpp", "_intelli_triangulation_8cpp.html", "_intelli_triangulation_8cpp" ], + [ "IntelliTriangulation.h", "_intelli_triangulation_8h.html", "_intelli_triangulation_8h" ] ]; \ No newline at end of file diff --git a/docs/html/files.html b/docs/html/files.html index a909a2f..db7d3ea 100644 --- a/docs/html/files.html +++ b/docs/html/files.html @@ -107,8 +107,12 @@ $(document).ready(function(){initNavTree('files.html','');});   IntelliHelper  IntelliColorPicker.cpp  IntelliColorPicker.h - IntelliHelper.cpp - IntelliHelper.h + IntelliRenderSettings.cpp + IntelliRenderSettings.h + IntelliToolsettings.cpp + IntelliToolsettings.h + IntelliTriangulation.cpp + IntelliTriangulation.h   Layer  PaintingArea.cpp  PaintingArea.h diff --git a/docs/html/functions.html b/docs/html/functions.html index e4f084f..8e9a72d 100644 --- a/docs/html/functions.html +++ b/docs/html/functions.html @@ -92,14 +92,17 @@ $(document).ready(function(){initNavTree('functions.html','');});
  • A : Triangle
  • -
  • Active -: IntelliTool +
  • activeLayer +: IntelliTool +
  • +
  • ActiveType +: IntelliTool
  • addLayer() -: PaintingArea +: PaintingArea
  • addLayerAt() -: PaintingArea +: PaintingArea
  • alpha : LayerObject @@ -133,6 +136,7 @@ $(document).ready(function(){initNavTree('functions.html','');});
  • colorPicker : IntelliTool +, PaintingArea
  • colorPickerSetFirstColor() : PaintingArea @@ -140,8 +144,8 @@ $(document).ready(function(){initNavTree('functions.html','');});
  • colorPickerSetSecondColor() : PaintingArea
  • -
  • colorPickerSwitchColor() -: PaintingArea +
  • colorPickerSwapColors() +: PaintingArea
  • createCircleTool() : PaintingArea @@ -169,10 +173,7 @@ $(document).ready(function(){initNavTree('functions.html','');});

    - d -

    @@ -406,16 +461,22 @@ $(document).ready(function(){initNavTree('functions.html','');});

    - s -

    + + +

    - t -

    + + +

    - u -

    @@ -487,6 +572,9 @@ $(document).ready(function(){initNavTree('functions.html','');});
  • ~IntelliToolRectangle() : IntelliToolRectangle
  • +
  • ~IntelliToolsettings() +: IntelliToolsettings +
  • ~PaintingArea() : PaintingArea
  • diff --git a/docs/html/functions_enum.html b/docs/html/functions_enum.html new file mode 100644 index 0000000..d123832 --- /dev/null +++ b/docs/html/functions_enum.html @@ -0,0 +1,111 @@ + + + + + + + +IntelliPhoto: Class Members - Enumerations + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    IntelliPhoto +  0.5 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    + + + + diff --git a/docs/html/functions_func.html b/docs/html/functions_func.html index 2dc3470..c039c3d 100644 --- a/docs/html/functions_func.html +++ b/docs/html/functions_func.html @@ -90,10 +90,10 @@ $(document).ready(function(){initNavTree('functions_func.html','');});

    - a -

    @@ -112,8 +112,8 @@ $(document).ready(function(){initNavTree('functions_func.html','');});
  • colorPickerSetSecondColor() : PaintingArea
  • -
  • colorPickerSwitchColor() -: PaintingArea +
  • colorPickerSwapColors() +: PaintingArea
  • createCircleTool() : PaintingArea @@ -141,7 +141,7 @@ $(document).ready(function(){initNavTree('functions_func.html','');});

    - d -

    - l -

    @@ -329,7 +371,7 @@ $(document).ready(function(){initNavTree('functions_func.html','');}); , IntelliToolRectangle
  • open() -: PaintingArea +: PaintingArea
  • @@ -356,16 +398,22 @@ $(document).ready(function(){initNavTree('functions_func.html','');});

    - s -

    + + +

    - u -

    @@ -431,6 +489,9 @@ $(document).ready(function(){initNavTree('functions_func.html','');});
  • ~IntelliToolRectangle() : IntelliToolRectangle
  • +
  • ~IntelliToolsettings() +: IntelliToolsettings +
  • ~PaintingArea() : PaintingArea
  • diff --git a/docs/html/functions_vars.html b/docs/html/functions_vars.html index f3acbbc..af7dcfb 100644 --- a/docs/html/functions_vars.html +++ b/docs/html/functions_vars.html @@ -90,8 +90,11 @@ $(document).ready(function(){initNavTree('functions_vars.html','');});
  • A : Triangle
  • -
  • Active -: IntelliTool +
  • activeLayer +: IntelliTool +
  • +
  • ActiveType +: IntelliTool
  • alpha : LayerObject @@ -110,9 +113,10 @@ $(document).ready(function(){initNavTree('functions_vars.html','');});
  • colorPicker : IntelliTool +, PaintingArea
  • -
  • drawing -: IntelliTool +
  • fastRenderer +: IntelliImage
  • height : LayerObject @@ -126,9 +130,19 @@ $(document).ready(function(){initNavTree('functions_vars.html','');});
  • imageData : IntelliImage
  • +
  • isDrawing +: IntelliTool +
  • polygonData : IntelliShapedImage
  • +
  • Toolsettings +: IntelliTool +, PaintingArea +
  • +
  • TypeOfImage +: IntelliImage +
  • width : LayerObject
  • diff --git a/docs/html/globals.html b/docs/html/globals.html index 72b8b1c..e94d00d 100644 --- a/docs/html/globals.html +++ b/docs/html/globals.html @@ -87,15 +87,12 @@ $(document).ready(function(){initNavTree('globals.html','');});
    Here is a list of all file members with links to the files they belong to:
    diff --git a/docs/html/globals_defs.html b/docs/html/globals_defs.html new file mode 100644 index 0000000..46fcdba --- /dev/null +++ b/docs/html/globals_defs.html @@ -0,0 +1,105 @@ + + + + + + + +IntelliPhoto: File Members + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    IntelliPhoto +  0.5 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    + + + + diff --git a/docs/html/hierarchy.html b/docs/html/hierarchy.html index dc9a917..3e7ceb0 100644 --- a/docs/html/hierarchy.html +++ b/docs/html/hierarchy.html @@ -90,28 +90,28 @@ $(document).ready(function(){initNavTree('hierarchy.html','');});
    Class Hierarchy
    -
    -

    Go to the graphical class hierarchy

    -This inheritance list is sorted roughly, but not completely, alphabetically:
    +
    This inheritance list is sorted roughly, but not completely, alphabetically:
    [detail level 123]
    - + - - - - - - - - - - - - - - + + + + + + + + + + + + + + + +
     CIntelliColorPickerThe IntelliColorPicker manages the selected colors for one whole project
     CIntelliImageAn abstract class which manages the basic IntelliImage operations
     CIntelliRasterImageThe IntelliRasterImage manages a Rasterimage
     CIntelliRasterImageThe IntelliRasterImage manages a RASTERIMAGE
     CIntelliShapedImageThe IntelliShapedImage manages a Shapedimage
     CIntelliToolAn abstract class that manages the basic events, like mouse clicks or scrolls events
     CIntelliToolCircleTool to draw a circle
     CIntelliToolFloodFillTool to flood FIll a certian area
     CIntelliToolLineThe IntelliToolFloodFill class represents a tool to draw a line
     CIntelliToolPenTool to draw a line
     CIntelliToolPlainToolTool to fill the whole canvas with one color
     CIntelliToolPolygonThe IntelliToolPolygon managed the Drawing of Polygonforms
     CIntelliToolRectangleTool to draw a rectangle
     CLayerObjectThe LayerObject struct holds all the information needed to construct a layer
     CQMainWindow
     CIntelliPhotoGuiHandles the graphical user interface for the intelliPhoto program
     CQWidget
     CPaintingAreaManages the methods and stores information about the current painting area, which is the currently opened project
     CTriangleThe Triangle struct holds the 3 vertices of a triangle
     CIntelliRenderSettings
     CIntelliToolAn abstract class that manages the basic events, like mouse clicks or scrolls events
     CIntelliToolCircleTool to draw a circle
     CIntelliToolFloodFillTool to flood FIll a certian area
     CIntelliToolLineThe IntelliToolFloodFill class represents a tool to draw a line
     CIntelliToolPenTool to draw a line
     CIntelliToolPlainToolTool to fill the whole canvas with one color
     CIntelliToolPolygonThe IntelliToolPolygon managed the Drawing of Polygonforms
     CIntelliToolRectangleTool to draw a rectangle
     CIntelliToolsettings
     CLayerObjectThe LayerObject struct holds all the information needed to construct a layer
     CQMainWindow
     CIntelliPhotoGuiHandles the graphical user interface for the intelliPhoto program
     CQWidget
     CPaintingAreaManages the methods and stores information about the current painting area, which is the currently opened project
     CTriangleThe Triangle struct holds the 3 vertices of a triangle
    diff --git a/docs/html/hierarchy.js b/docs/html/hierarchy.js index edc99b7..5b4a232 100644 --- a/docs/html/hierarchy.js +++ b/docs/html/hierarchy.js @@ -6,6 +6,7 @@ var hierarchy = [ "IntelliShapedImage", "class_intelli_shaped_image.html", null ] ] ] ] ], + [ "IntelliRenderSettings", "class_intelli_render_settings.html", null ], [ "IntelliTool", "class_intelli_tool.html", [ [ "IntelliToolCircle", "class_intelli_tool_circle.html", null ], [ "IntelliToolFloodFill", "class_intelli_tool_flood_fill.html", null ], @@ -15,6 +16,7 @@ var hierarchy = [ "IntelliToolPolygon", "class_intelli_tool_polygon.html", null ], [ "IntelliToolRectangle", "class_intelli_tool_rectangle.html", null ] ] ], + [ "IntelliToolsettings", "class_intelli_toolsettings.html", null ], [ "LayerObject", "struct_layer_object.html", null ], [ "QMainWindow", null, [ [ "IntelliPhotoGui", "class_intelli_photo_gui.html", null ] diff --git a/docs/html/inherit_graph_1.dot b/docs/html/inherit_graph_1.dot index 8e9fe2c..6670cd8 100644 --- a/docs/html/inherit_graph_1.dot +++ b/docs/html/inherit_graph_1.dot @@ -6,7 +6,7 @@ digraph "Graphical Class Hierarchy" rankdir="LR"; Node0 [label="IntelliImage",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_image.html",tooltip="An abstract class which manages the basic IntelliImage operations."]; Node0 -> Node1 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node1 [label="IntelliRasterImage",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_raster_image.html",tooltip="The IntelliRasterImage manages a Rasterimage."]; + Node1 [label="IntelliRasterImage",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_raster_image.html",tooltip="The IntelliRasterImage manages a RASTERIMAGE."]; Node1 -> Node2 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; Node2 [label="IntelliShapedImage",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_shaped_image.html",tooltip="The IntelliShapedImage manages a Shapedimage."]; } diff --git a/docs/html/inherit_graph_3.dot b/docs/html/inherit_graph_3.dot index ec45d17..407b5bc 100644 --- a/docs/html/inherit_graph_3.dot +++ b/docs/html/inherit_graph_3.dot @@ -4,19 +4,5 @@ digraph "Graphical Class Hierarchy" edge [fontname="Helvetica",fontsize="10",labelfontname="Helvetica",labelfontsize="10"]; node [fontname="Helvetica",fontsize="10",shape=record]; rankdir="LR"; - Node0 [label="IntelliTool",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool.html",tooltip="An abstract class that manages the basic events, like mouse clicks or scrolls events."]; - Node0 -> Node1 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node1 [label="IntelliToolCircle",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_circle.html",tooltip="The IntelliToolCircle class represents a tool to draw a circle."]; - Node0 -> Node2 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node2 [label="IntelliToolFloodFill",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_flood_fill.html",tooltip="The IntelliToolFloodFill class represents a tool to flood FIll a certian area."]; - Node0 -> Node3 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node3 [label="IntelliToolLine",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_line.html",tooltip="The IntelliToolFloodFill class represents a tool to draw a line."]; - Node0 -> Node4 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node4 [label="IntelliToolPen",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_pen.html",tooltip="The IntelliToolPen class represents a tool to draw a line."]; - Node0 -> Node5 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node5 [label="IntelliToolPlainTool",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_plain_tool.html",tooltip="The IntelliToolPlainTool class represents a tool to fill the whole canvas with one color."]; - Node0 -> Node6 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node6 [label="IntelliToolPolygon",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_polygon.html",tooltip="The IntelliToolPolygon managed the Drawing of Polygonforms."]; - Node0 -> Node7 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node7 [label="IntelliToolRectangle",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_rectangle.html",tooltip="The IntelliToolRectangle class represents a tool to draw a rectangle."]; + Node0 [label="IntelliRenderSettings",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_render_settings.html",tooltip=" "]; } diff --git a/docs/html/inherit_graph_4.dot b/docs/html/inherit_graph_4.dot index cb85543..ec45d17 100644 --- a/docs/html/inherit_graph_4.dot +++ b/docs/html/inherit_graph_4.dot @@ -4,5 +4,19 @@ digraph "Graphical Class Hierarchy" edge [fontname="Helvetica",fontsize="10",labelfontname="Helvetica",labelfontsize="10"]; node [fontname="Helvetica",fontsize="10",shape=record]; rankdir="LR"; - Node0 [label="LayerObject",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$struct_layer_object.html",tooltip="The LayerObject struct holds all the information needed to construct a layer."]; + Node0 [label="IntelliTool",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool.html",tooltip="An abstract class that manages the basic events, like mouse clicks or scrolls events."]; + Node0 -> Node1 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node1 [label="IntelliToolCircle",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_circle.html",tooltip="The IntelliToolCircle class represents a tool to draw a circle."]; + Node0 -> Node2 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node2 [label="IntelliToolFloodFill",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_flood_fill.html",tooltip="The IntelliToolFloodFill class represents a tool to flood FIll a certian area."]; + Node0 -> Node3 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node3 [label="IntelliToolLine",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_line.html",tooltip="The IntelliToolFloodFill class represents a tool to draw a line."]; + Node0 -> Node4 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node4 [label="IntelliToolPen",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_pen.html",tooltip="The IntelliToolPen class represents a tool to draw a line."]; + Node0 -> Node5 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node5 [label="IntelliToolPlainTool",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_plain_tool.html",tooltip="The IntelliToolPlainTool class represents a tool to fill the whole canvas with one color."]; + Node0 -> Node6 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node6 [label="IntelliToolPolygon",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_polygon.html",tooltip="The IntelliToolPolygon managed the Drawing of Polygonforms."]; + Node0 -> Node7 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node7 [label="IntelliToolRectangle",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_tool_rectangle.html",tooltip="The IntelliToolRectangle class represents a tool to draw a rectangle."]; } diff --git a/docs/html/inherit_graph_5.dot b/docs/html/inherit_graph_5.dot index 88ed036..5dc8cc6 100644 --- a/docs/html/inherit_graph_5.dot +++ b/docs/html/inherit_graph_5.dot @@ -4,7 +4,5 @@ digraph "Graphical Class Hierarchy" edge [fontname="Helvetica",fontsize="10",labelfontname="Helvetica",labelfontsize="10"]; node [fontname="Helvetica",fontsize="10",shape=record]; rankdir="LR"; - Node2 [label="QWidget",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; - Node2 -> Node0 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node0 [label="PaintingArea",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_painting_area.html",tooltip="The PaintingArea class manages the methods and stores information about the current painting area,..."]; + Node0 [label="IntelliToolsettings",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_intelli_toolsettings.html",tooltip=" "]; } diff --git a/docs/html/inherit_graph_6.dot b/docs/html/inherit_graph_6.dot index 98844bc..cb85543 100644 --- a/docs/html/inherit_graph_6.dot +++ b/docs/html/inherit_graph_6.dot @@ -4,5 +4,5 @@ digraph "Graphical Class Hierarchy" edge [fontname="Helvetica",fontsize="10",labelfontname="Helvetica",labelfontsize="10"]; node [fontname="Helvetica",fontsize="10",shape=record]; rankdir="LR"; - Node0 [label="Triangle",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$struct_triangle.html",tooltip="The Triangle struct holds the 3 vertices of a triangle."]; + Node0 [label="LayerObject",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$struct_layer_object.html",tooltip="The LayerObject struct holds all the information needed to construct a layer."]; } diff --git a/docs/html/inherit_graph_7.dot b/docs/html/inherit_graph_7.dot new file mode 100644 index 0000000..88ed036 --- /dev/null +++ b/docs/html/inherit_graph_7.dot @@ -0,0 +1,10 @@ +digraph "Graphical Class Hierarchy" +{ + // LATEX_PDF_SIZE + edge [fontname="Helvetica",fontsize="10",labelfontname="Helvetica",labelfontsize="10"]; + node [fontname="Helvetica",fontsize="10",shape=record]; + rankdir="LR"; + Node2 [label="QWidget",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; + Node2 -> Node0 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node0 [label="PaintingArea",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$class_painting_area.html",tooltip="The PaintingArea class manages the methods and stores information about the current painting area,..."]; +} diff --git a/docs/html/inherit_graph_8.dot b/docs/html/inherit_graph_8.dot new file mode 100644 index 0000000..98844bc --- /dev/null +++ b/docs/html/inherit_graph_8.dot @@ -0,0 +1,8 @@ +digraph "Graphical Class Hierarchy" +{ + // LATEX_PDF_SIZE + edge [fontname="Helvetica",fontsize="10",labelfontname="Helvetica",labelfontsize="10"]; + node [fontname="Helvetica",fontsize="10",shape=record]; + rankdir="LR"; + Node0 [label="Triangle",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$struct_triangle.html",tooltip="The Triangle struct holds the 3 vertices of a triangle."]; +} diff --git a/docs/html/inherits.html b/docs/html/inherits.html index 7e22006..2b1da7e 100644 --- a/docs/html/inherits.html +++ b/docs/html/inherits.html @@ -99,13 +99,17 @@ $(document).ready(function(){initNavTree('hierarchy.html','');}); - + - + - + - + + + + +
    diff --git a/docs/html/main_8cpp.html b/docs/html/main_8cpp.html index 0bddc79..6ef81a6 100644 --- a/docs/html/main_8cpp.html +++ b/docs/html/main_8cpp.html @@ -95,13 +95,7 @@ $(document).ready(function(){initNavTree('main_8cpp.html','');});
    #include "GUI/IntelliPhotoGui.h"
    #include <QApplication>
    #include <QDebug>
    -#include "IntelliHelper/IntelliHelper.h"
    #include <vector>
    -
    -Include dependency graph for main.cpp:
    -
    -
    -

    Go to the source code of this file.

    @@ -137,7 +131,7 @@ Functions
    -

    Definition at line 7 of file main.cpp.

    +

    Definition at line 6 of file main.cpp.

    diff --git a/docs/html/main_8cpp__incl.dot b/docs/html/main_8cpp__incl.dot index e6c725f..18ed033 100644 --- a/docs/html/main_8cpp__incl.dot +++ b/docs/html/main_8cpp__incl.dot @@ -7,28 +7,27 @@ digraph "intelliphoto/src/main.cpp" Node1 -> Node2 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; Node2 [label="GUI/IntelliPhotoGui.h",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_photo_gui_8h.html",tooltip=" "]; Node2 -> Node3 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node3 [label="QList",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; + Node3 [label="QtWidgets",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; Node2 -> Node4 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node4 [label="QMainWindow",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; + Node4 [label="QPixmap",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; Node2 -> Node5 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node5 [label="QGridLayout",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; + Node5 [label="QList",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; Node2 -> Node6 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node6 [label="QPushButton",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; + Node6 [label="QMainWindow",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; Node2 -> Node7 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node7 [label="QTextEdit",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; + Node7 [label="QGridLayout",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; Node2 -> Node8 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node8 [label="QLabel",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; + Node8 [label="QPushButton",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; Node2 -> Node9 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node9 [label="QLineEdit",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; - Node1 -> Node10 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node10 [label="QApplication",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; - Node1 -> Node11 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node11 [label="QDebug",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; + Node9 [label="QTextEdit",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; + Node2 -> Node10 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node10 [label="QLabel",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; + Node2 -> Node11 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node11 [label="QLineEdit",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; Node1 -> Node12 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node12 [label="IntelliHelper/IntelliHelper.h",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$_intelli_helper_8h.html",tooltip=" "]; - Node12 -> Node13 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node13 [label="QPoint",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; - Node12 -> Node14 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node14 [label="vector",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; + Node12 [label="QApplication",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; + Node1 -> Node13 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node13 [label="QDebug",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; Node1 -> Node14 [color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node14 [label="vector",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; } diff --git a/docs/html/main_8cpp_source.html b/docs/html/main_8cpp_source.html index 0a1d9f3..3a4e0a2 100644 --- a/docs/html/main_8cpp_source.html +++ b/docs/html/main_8cpp_source.html @@ -93,25 +93,23 @@ $(document).ready(function(){initNavTree('main_8cpp_source.html','');}); Go to the documentation of this file.
    1 #include "GUI/IntelliPhotoGui.h"
    2 #include <QApplication>
    3 #include <QDebug>
    - -
    5 #include <vector>
    -
    6 
    -
    7 int main(int argc, char*argv[]){
    -
    8  // The main application
    -
    9  QApplication app(argc, argv);
    -
    10 
    -
    11  // Create and open the main window
    -
    12  IntelliPhotoGui window;
    -
    13  window.show();
    -
    14 
    -
    15  return app.exec();
    -
    16 }
    +
    4 #include <vector>
    +
    5 
    +
    6 int main(int argc, char*argv[]){
    +
    7  // The main application
    +
    8  QApplication app(argc, argv);
    +
    9 
    +
    10  // Create and open the main window
    +
    11  IntelliPhotoGui window;
    +
    12  window.show();
    +
    13 
    +
    14  return app.exec();
    +
    15 }
    -
    The IntelliPhotoGui class handles the graphical user interface for the intelliPhoto program.
    - +
    The IntelliPhotoGui class handles the graphical user interface for the intelliPhoto program.
    -
    int main(int argc, char *argv[])
    Definition: main.cpp:7
    +
    int main(int argc, char *argv[])
    Definition: main.cpp:6
    -

    Definition at line 30 of file PaintingArea.h.

    +

    Definition at line 31 of file PaintingArea.h.

    @@ -162,7 +157,7 @@ Public Attributes
    -

    Definition at line 27 of file PaintingArea.h.

    +

    Definition at line 28 of file PaintingArea.h.

    @@ -178,7 +173,7 @@ Public Attributes
    -

    Definition at line 29 of file PaintingArea.h.

    +

    Definition at line 30 of file PaintingArea.h.

    @@ -194,7 +189,7 @@ Public Attributes
    -

    Definition at line 25 of file PaintingArea.h.

    +

    Definition at line 26 of file PaintingArea.h.

    @@ -210,7 +205,7 @@ Public Attributes
    -

    Definition at line 26 of file PaintingArea.h.

    +

    Definition at line 27 of file PaintingArea.h.

    @@ -226,7 +221,7 @@ Public Attributes
    -

    Definition at line 28 of file PaintingArea.h.

    +

    Definition at line 29 of file PaintingArea.h.

    diff --git a/docs/html/struct_triangle.html b/docs/html/struct_triangle.html index f0e832d..038a78d 100644 --- a/docs/html/struct_triangle.html +++ b/docs/html/struct_triangle.html @@ -97,7 +97,7 @@ $(document).ready(function(){initNavTree('struct_triangle.html','');});

    The Triangle struct holds the 3 vertices of a triangle. More...

    -

    #include <IntelliHelper.h>

    +

    #include <IntelliTriangulation.h>

    @@ -111,7 +111,7 @@ Public Attributes

    Detailed Description

    The Triangle struct holds the 3 vertices of a triangle.

    -

    Definition at line 10 of file IntelliHelper.h.

    +

    Definition at line 10 of file IntelliTriangulation.h.

    Member Data Documentation

    ◆ A

    @@ -125,7 +125,7 @@ Public Attributes

    Public Attributes

    -

    Definition at line 11 of file IntelliHelper.h.

    +

    Definition at line 11 of file IntelliTriangulation.h.

    @@ -141,7 +141,7 @@ Public Attributes
    -

    Definition at line 11 of file IntelliHelper.h.

    +

    Definition at line 11 of file IntelliTriangulation.h.

    @@ -157,12 +157,12 @@ Public Attributes
    -

    Definition at line 11 of file IntelliHelper.h.

    +

    Definition at line 11 of file IntelliTriangulation.h.


    The documentation for this struct was generated from the following file: From 711c394f098eee0dc5254cbf13ae9753d23aa7a3 Mon Sep 17 00:00:00 2001 From: Paul Norberger Date: Thu, 9 Jan 2020 12:10:03 +0100 Subject: [PATCH 39/44] Adding tool icons --- docs/Icons/circle-tool.svg | 94 ++++++++++++++++ docs/Icons/eraser-tool.svg | 109 ++++++++++++++++++ docs/Icons/flood-fill-tool.svg | 194 +++++++++++++++++++++++++++++++++ docs/Icons/line-tool.svg | 99 +++++++++++++++++ docs/Icons/magic-wand-tool.svg | 169 ++++++++++++++++++++++++++++ docs/Icons/pen-tool.svg | 105 ++++++++++++++++++ docs/Icons/polygon-tool.svg | 117 ++++++++++++++++++++ docs/Icons/rectangle-tool.svg | 101 +++++++++++++++++ 8 files changed, 988 insertions(+) create mode 100644 docs/Icons/circle-tool.svg create mode 100644 docs/Icons/eraser-tool.svg create mode 100644 docs/Icons/flood-fill-tool.svg create mode 100644 docs/Icons/line-tool.svg create mode 100644 docs/Icons/magic-wand-tool.svg create mode 100644 docs/Icons/pen-tool.svg create mode 100644 docs/Icons/polygon-tool.svg create mode 100644 docs/Icons/rectangle-tool.svg diff --git a/docs/Icons/circle-tool.svg b/docs/Icons/circle-tool.svg new file mode 100644 index 0000000..a6cc0e4 --- /dev/null +++ b/docs/Icons/circle-tool.svg @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + diff --git a/docs/Icons/eraser-tool.svg b/docs/Icons/eraser-tool.svg new file mode 100644 index 0000000..cdc518d --- /dev/null +++ b/docs/Icons/eraser-tool.svg @@ -0,0 +1,109 @@ + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + diff --git a/docs/Icons/flood-fill-tool.svg b/docs/Icons/flood-fill-tool.svg new file mode 100644 index 0000000..980bb7a --- /dev/null +++ b/docs/Icons/flood-fill-tool.svg @@ -0,0 +1,194 @@ + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + diff --git a/docs/Icons/line-tool.svg b/docs/Icons/line-tool.svg new file mode 100644 index 0000000..e26bb7b --- /dev/null +++ b/docs/Icons/line-tool.svg @@ -0,0 +1,99 @@ + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/docs/Icons/magic-wand-tool.svg b/docs/Icons/magic-wand-tool.svg new file mode 100644 index 0000000..71f019d --- /dev/null +++ b/docs/Icons/magic-wand-tool.svg @@ -0,0 +1,169 @@ + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + diff --git a/docs/Icons/pen-tool.svg b/docs/Icons/pen-tool.svg new file mode 100644 index 0000000..5dd9782 --- /dev/null +++ b/docs/Icons/pen-tool.svg @@ -0,0 +1,105 @@ + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/docs/Icons/polygon-tool.svg b/docs/Icons/polygon-tool.svg new file mode 100644 index 0000000..7602729 --- /dev/null +++ b/docs/Icons/polygon-tool.svg @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + diff --git a/docs/Icons/rectangle-tool.svg b/docs/Icons/rectangle-tool.svg new file mode 100644 index 0000000..3056a02 --- /dev/null +++ b/docs/Icons/rectangle-tool.svg @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + From d9b0d53afdd41ec55ab27b7e2a7add0305074987 Mon Sep 17 00:00:00 2001 From: Paul Norberger Date: Thu, 9 Jan 2020 12:11:57 +0100 Subject: [PATCH 40/44] Adding initial todo list --- docs/ToDo/todo.html | 633 ++++++++++++++++++++++++++++++++++++++++++++ docs/ToDo/todo.org | 123 +++++++++ docs/ToDo/todo.pdf | Bin 0 -> 136207 bytes 3 files changed, 756 insertions(+) create mode 100644 docs/ToDo/todo.html create mode 100644 docs/ToDo/todo.org create mode 100644 docs/ToDo/todo.pdf diff --git a/docs/ToDo/todo.html b/docs/ToDo/todo.html new file mode 100644 index 0000000..9ff0d54 --- /dev/null +++ b/docs/ToDo/todo.html @@ -0,0 +1,633 @@ + + + + + + + +Todo-Liste für Intelliphoto + + + + + + + + + + + + +
    +

    Todo-Liste für Intelliphoto

    +
    +

    1 TODO Dokumentation [2/8]

    +
    +
    +
    +

    1.1 TODO CRC-Karten

    +
    +
      +
    • 8/10 CRC-Karten sind fertig.
    • +
    • 2 CRC-Karten werden noch benötigt. [Zuständig: Paul]
    • +
    +
    +
    +
    +

    1.2 DONE UML-Diagramm

    +
    +
    +
    +
    +

    1.3 TODO User-Manual

    +
    +
      +
    • Usermanual für Version 0.31 liegt vor.
    • +
    • Nach Userinterfaceupdate: Usermanual muss aktualisiert werden.
    • +
    +
    +
    +
    +

    1.4 TODO Use-Case-Diagramme

    +
    +
      +
    • 1/2 Use-Case-Diagramme sind vorhanden.
    • +
    • 1 Use-Case-Diagramm wird noch benötigt.
    • +
    • 1 Use-Case-Diagramm muss evtl. aktualisiert werden.
    • +
    +
    +
    +
    +

    1.5 TODO Sequenzdiagramme

    +
    +
      +
    • 1/2 Sequenzdiagramme sind vorhanden.
    • +
    • 1 Sequenzdiagramm wird noch benötigt. [Zuständig: Seb]
    • +
    • 1 Sequenzdiagramm muss aktualisiert werden. [Zuständig: Seb]
    • +
    +
    +
    +
    +

    1.6 TODO Zustandsdiagramme

    +
    +
      +
    • 1/2 Zustandsdiagramme sind vorhanden.
    • +
    • 1 Sequenzdiagramm wird noch benötigt. [Zuständig: Seb]
    • +
    • 1 Sequenzdiagramm muss aktualisiert werden. [Zuständig: Seb]
    • +
    +
    +
    +
    +

    1.7 DONE Selbstgenierende Dokumentation

    +
    +
    +
    +
    +

    1.8 TODO Volere Snow Cards [0/2]

    +
    +
    +
    +

    1.8.1 Nicht-funktionale Anforderungen

    +
    +
      +
    • 1/2 Volere Snow Cards sind vorhanden.
    • +
    • 1 Volere Snow Card wird noch benötigt. [Zuständig: Paul]
    • +
    • 1 Volere Snow Card muss evtl. aktualisiert werden. [Zuständig: Paul]
    • +
    +
    +
    +
    +

    1.8.2 Funktionale Anforderungen

    +
    +
      +
    • 1/2 Volere Snow Cards sind vorhanden.
    • +
    • 1 Volere Snow Card wird noch benötigt. [Zuständig: Paul]
    • +
    • 1 Volere Snow Card muss evtl. aktualisiert werden. [Zuständig: Paul]
    • +
    +
    +
    +
    +
    +

    1.9 TODO Referenzmaschine(n) bestimmen und Specs dokumentieren

    +
    +
    +
    +

    2 TODO Allgemeine Features [0/1]

    +
    +
    +
    +

    2.1 TODO Das Polygon fürs ShapedImage setzbar machen

    +
    +
    +
    +

    3 TODO User Interface [0/4]

    +
    +
    +
    +

    3.1 TODO Icons für alle Tools

    +
    +
    +

    3.2 TODO Interfacegrundstruktur erstellen

    +
    +
    +

    3.3 TODO Verknüpfung der Tools im Code mit den Buttons

    +
    +
    +

    3.4 TODO Eigenschaften der Tools im Fenster statt im Popup einstellbar machen

    +
    +
    +
    +

    4 TODO Refactoring [2/2]

    +
    +
    +
    +

    4.1 DONE Alle öffentlichen Klassen durchkommentieren

    +
    +
    +
    +
    +

    4.2 DONE Toolklassenstruktur verbessern

    +
    +
    +
    +
    +
    +

    5 TODO Tools [0/8]

    +
    +
    +
    +

    5.1 TODO PenTool [2/5]

    +
    +
    +
    +

    5.1.1 DONE Icon

    +
    +
    +
    +
    +

    5.1.2 DONE Funktionalität

    +
    +
    +
    +
    +

    5.1.3 TODO Implementierung in Interface

    +
    +
    +

    5.1.4 TODO Zeitbestimmung auf Referenzmaschine

    +
    +
    +

    5.1.5 TODO Unittests

    +
    +
      +
    • [Zuständig: Mucke]
    • +
    +
    +
    +
    +
    +

    5.2 TODO EraserTool [2/5]

    +
    +
    +
    +

    5.2.1 DONE Icon

    +
    +
    +
    +
    +

    5.2.2 DONE Funktionalität

    +
    +
    +
    +
    +

    5.2.3 TODO Implementierung in Interface

    +
    +
    +

    5.2.4 TODO Zeitbestimmung auf Referenzmaschine

    +
    +
    +

    5.2.5 TODO Unittests

    +
    +
      +
    • [Zuständig: Mucke]
    • +
    +
    +
    +
    +
    +

    5.3 TODO FloodFillTool [2/5]

    +
    +
    +
    +

    5.3.1 DONE Icon

    +
    +
    +
    +
    +

    5.3.2 DONE Funktionalität

    +
    +
    +
    +
    +

    5.3.3 TODO Implementierung in Interface

    +
    +
    +

    5.3.4 TODO Zeitbestimmung auf Referenzmaschine

    +
    +
    +

    5.3.5 TODO Unittests

    +
    +
      +
    • [Zuständig: Mucke]
    • +
    +
    +
    +
    +
    +

    5.4 TODO PolygonTool [2/5]

    +
    +
    +
    +

    5.4.1 DONE Icon

    +
    +
    +
    +
    +

    5.4.2 DONE Funktionalität

    +
    +
    +
    +
    +

    5.4.3 TODO Implementierung in Interface

    +
    +
    +

    5.4.4 TODO Zeitbestimmung auf Referenzmaschine

    +
    +
    +

    5.4.5 TODO Unittests

    +
    +
      +
    • [Zuständig: Mucke]
    • +
    +
    +
    +
    +
    +

    5.5 TODO CircleTool [2/5]

    +
    +
    +
    +

    5.5.1 DONE Icon

    +
    +
    +
    +
    +

    5.5.2 DONE Funktionalität

    +
    +
    +
    +
    +

    5.5.3 TODO Implementierung in Interface

    +
    +
    +

    5.5.4 TODO Zeitbestimmung auf Referenzmaschine

    +
    +
    +

    5.5.5 TODO Unittests

    +
    +
      +
    • [Zuständig: Mucke]
    • +
    +
    +
    +
    +
    +

    5.6 TODO RectangleTool [2/5]

    +
    +
    +
    +

    5.6.1 DONE Icon

    +
    +
    +
    +
    +

    5.6.2 DONE Funktionalität

    +
    +
    +
    +
    +

    5.6.3 TODO Implementierung in Interface

    +
    +
    +

    5.6.4 TODO Zeitbestimmung auf Referenzmaschine

    +
    +
    +

    5.6.5 TODO Unittests

    +
    +
      +
    • [Zuständig: Mucke]
    • +
    +
    +
    +
    +
    +

    5.7 TODO PlainTool [2/5]

    +
    +
    +
    +

    5.7.1 DONE Icon

    +
    +
    +
    +
    +

    5.7.2 DONE Funktionalität

    +
    +
    +
    +
    +

    5.7.3 TODO Implementierung in Interface

    +
    +
    +

    5.7.4 TODO Zeitbestimmung auf Referenzmaschine

    +
    +
    +

    5.7.5 TODO Unittests

    +
    +
      +
    • [Zuständig: Mucke]
    • +
    +
    +
    +
    +
    +

    5.8 TODO LineTool [1/5]

    +
    +
    +
    +

    5.8.1 TODO Icon

    +
    +
    +

    5.8.2 DONE Funktionalität

    +
    +
    +
    +
    +

    5.8.3 TODO Implementierung in Interface

    +
    +
    +

    5.8.4 TODO Zeitbestimmung auf Referenzmaschine

    +
    +
    +

    5.8.5 TODO Unittests

    +
    +
      +
    • [Zuständig: Mucke]
    • +
    +
    +
    +
    +
    +
    +

    6 TODO Extras [0/1]

    +
    +
    +
    +

    6.1 TODO 3D-Modelle laden und anzeigen / Tools implementieren

    +
    +
    +
    +
    +

    Author: Paul Norberger

    +

    Created: 2020-01-08 Mi 22:22

    +

    Validate

    +
    + + diff --git a/docs/ToDo/todo.org b/docs/ToDo/todo.org new file mode 100644 index 0000000..28278e7 --- /dev/null +++ b/docs/ToDo/todo.org @@ -0,0 +1,123 @@ +#+TITLE: Todo-Liste für Intelliphoto +#+AUTHOR: Paul Norberger +#+SETUPFILE: https://fniessen.github.io/org-html-themes/setup/theme-readtheorg.setup +#+OPTIONS: toc:nil +* TODO Dokumentation [2/8] +** TODO CRC-Karten +- 8/10 CRC-Karten sind fertig. +- 2 CRC-Karten werden noch benötigt. [Zuständig: Paul] +** DONE UML-Diagramm + CLOSED: [2020-01-08 Mi 21:50] +** TODO User-Manual +- Usermanual für Version 0.31 liegt vor. +- Nach Userinterfaceupdate: Usermanual muss aktualisiert werden. +** TODO Use-Case-Diagramme +- 1/2 Use-Case-Diagramme sind vorhanden. +- 1 Use-Case-Diagramm wird noch benötigt. +- 1 Use-Case-Diagramm muss evtl. aktualisiert werden. +** TODO Sequenzdiagramme +- 1/2 Sequenzdiagramme sind vorhanden. +- 1 Sequenzdiagramm wird noch benötigt. [Zuständig: Seb] +- 1 Sequenzdiagramm muss aktualisiert werden. [Zuständig: Seb] +** TODO Zustandsdiagramme +- 1/2 Zustandsdiagramme sind vorhanden. +- 1 Sequenzdiagramm wird noch benötigt. [Zuständig: Seb] +- 1 Sequenzdiagramm muss aktualisiert werden. [Zuständig: Seb] +** DONE Selbstgenierende Dokumentation + CLOSED: [2020-01-08 Mi 21:57] +** TODO Volere Snow Cards [0/2] +*** Nicht-funktionale Anforderungen +- 1/2 Volere Snow Cards sind vorhanden. +- 1 Volere Snow Card wird noch benötigt. [Zuständig: Paul] +- 1 Volere Snow Card muss evtl. aktualisiert werden. [Zuständig: Paul] +*** Funktionale Anforderungen +- 1/2 Volere Snow Cards sind vorhanden. +- 1 Volere Snow Card wird noch benötigt. [Zuständig: Paul] +- 1 Volere Snow Card muss evtl. aktualisiert werden. [Zuständig: Paul] +** TODO Referenzmaschine(n) bestimmen und Specs dokumentieren +* TODO Allgemeine Features [0/1] +** TODO Das Polygon fürs ShapedImage setzbar machen +* TODO User Interface [0/4] +** TODO Icons für alle Tools +** TODO Interfacegrundstruktur erstellen +** TODO Verknüpfung der Tools im Code mit den Buttons +** TODO Eigenschaften der Tools im Fenster statt im Popup einstellbar machen +* TODO Refactoring [2/2] +** DONE Alle öffentlichen Klassen durchkommentieren + CLOSED: [2020-01-08 Mi 21:47] +** DONE Toolklassenstruktur verbessern + CLOSED: [2020-01-08 Mi 21:58] +* TODO Tools [0/8] +** TODO PenTool [2/5] +*** DONE Icon + CLOSED: [2020-01-08 Mi 19:54] +*** DONE Funktionalität + CLOSED: [2020-01-08 Mi 19:54] +*** TODO Implementierung in Interface +*** TODO Zeitbestimmung auf Referenzmaschine +*** TODO Unittests +- [Zuständig: Mucke] +** TODO EraserTool [2/5] +*** DONE Icon + CLOSED: [2020-01-08 Mi 19:54] +*** DONE Funktionalität + CLOSED: [2020-01-08 Mi 19:54] +*** TODO Implementierung in Interface +*** TODO Zeitbestimmung auf Referenzmaschine +*** TODO Unittests +- [Zuständig: Mucke] +** TODO FloodFillTool [2/5] +*** DONE Icon + CLOSED: [2020-01-08 Mi 19:54] +*** DONE Funktionalität + CLOSED: [2020-01-08 Mi 19:54] +*** TODO Implementierung in Interface +*** TODO Zeitbestimmung auf Referenzmaschine +*** TODO Unittests +- [Zuständig: Mucke] +** TODO PolygonTool [2/5] +*** DONE Icon + CLOSED: [2020-01-08 Mi 19:54] +*** DONE Funktionalität + CLOSED: [2020-01-08 Mi 19:54] +*** TODO Implementierung in Interface +*** TODO Zeitbestimmung auf Referenzmaschine +*** TODO Unittests +- [Zuständig: Mucke] +** TODO CircleTool [2/5] +*** DONE Icon + CLOSED: [2020-01-08 Mi 19:54] +*** DONE Funktionalität + CLOSED: [2020-01-08 Mi 19:54] +*** TODO Implementierung in Interface +*** TODO Zeitbestimmung auf Referenzmaschine +*** TODO Unittests +- [Zuständig: Mucke] +** TODO RectangleTool [2/5] +*** DONE Icon + CLOSED: [2020-01-08 Mi 19:54] +*** DONE Funktionalität + CLOSED: [2020-01-08 Mi 19:54] +*** TODO Implementierung in Interface +*** TODO Zeitbestimmung auf Referenzmaschine +*** TODO Unittests +- [Zuständig: Mucke] +** TODO PlainTool [2/5] +*** DONE Icon + CLOSED: [2020-01-08 Mi 19:54] +*** DONE Funktionalität + CLOSED: [2020-01-08 Mi 19:54] +*** TODO Implementierung in Interface +*** TODO Zeitbestimmung auf Referenzmaschine +*** TODO Unittests +- [Zuständig: Mucke] +** TODO LineTool [1/5] +*** TODO Icon +*** DONE Funktionalität + CLOSED: [2020-01-08 Mi 19:54] +*** TODO Implementierung in Interface +*** TODO Zeitbestimmung auf Referenzmaschine +*** TODO Unittests +- [Zuständig: Mucke] +* TODO Extras [0/1] +** TODO 3D-Modelle laden und anzeigen / Tools implementieren diff --git a/docs/ToDo/todo.pdf b/docs/ToDo/todo.pdf new file mode 100644 index 0000000000000000000000000000000000000000..cb9001f12c129c560cf5f4fb4d115610a20bd56f GIT binary patch literal 136207 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 z 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 dH6H Date: Thu, 9 Jan 2020 13:59:22 +0100 Subject: [PATCH 41/44] Updatet ui fixed bugs, improved performance, just everything Autors: @DerAnonymos @AshBastian @Sonaion --- src/Bilder.qrc | 5 +- src/GUI/IntelliPhotoGui.cpp | 90 ++++++--- src/GUI/IntelliPhotoGui.h | 11 +- src/Image/IntelliImage.cpp | 55 ++++-- src/Image/IntelliImage.h | 12 +- src/Image/IntelliRasterImage.cpp | 6 +- src/Image/IntelliShapedImage.cpp | 12 +- src/IntelliHelper/IntelliRenderSettings.cpp | 8 +- src/IntelliHelper/IntelliRenderSettings.h | 9 +- src/Layer/PaintingArea.cpp | 65 +++++-- src/Layer/PaintingArea.h | 11 +- src/Tool/IntelliTool.cpp | 30 +-- src/Tool/IntelliTool.h | 3 +- src/Tool/IntelliToolCircle.cpp | 10 +- src/icons/flood-fill-tool.svg | 197 +++++++++----------- src/icons/line-tool.svg | 99 ++++++++++ src/icons/magic-wand-tool.svg | 169 ----------------- src/icons/plain-tool.svg | 194 +++++++++++++++++++ 18 files changed, 605 insertions(+), 381 deletions(-) create mode 100644 src/icons/line-tool.svg delete mode 100644 src/icons/magic-wand-tool.svg create mode 100644 src/icons/plain-tool.svg diff --git a/src/Bilder.qrc b/src/Bilder.qrc index 3e190f4..01e8468 100644 --- a/src/Bilder.qrc +++ b/src/Bilder.qrc @@ -3,11 +3,12 @@ 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 + icons/line-tool.svg + icons/flood-fill-tool.svg + icons/plain-tool.svg diff --git a/src/GUI/IntelliPhotoGui.cpp b/src/GUI/IntelliPhotoGui.cpp index 283f7fb..d427e5f 100644 --- a/src/GUI/IntelliPhotoGui.cpp +++ b/src/GUI/IntelliPhotoGui.cpp @@ -95,10 +95,10 @@ void IntelliPhotoGui::slotDeleteLayer(){ // Define the standard Value, min, max, step and ok button int layerNumber = QInputDialog::getInt(this, tr("delete Layer"), tr("Number:"), - paintingArea->getNumberOfActiveLayer(),0, 500, 1, &ok); + paintingArea->getNumberOfActiveLayer()+1,1, 501, 1, &ok); // Create New Layer if (ok) { - paintingArea->deleteLayer(layerNumber); + paintingArea->deleteLayer(layerNumber-1); UpdateGui(); } } @@ -200,6 +200,16 @@ void IntelliPhotoGui::slotSetActiveLayer(){ } } +void IntelliPhotoGui::slotUpdateRenderSettingsOn(){ + paintingArea->setRenderSettings(true); + UpdateGui(); +} + +void IntelliPhotoGui::slotUpdateRenderSettingsOff(){ + paintingArea->setRenderSettings(false); + UpdateGui(); +} + void IntelliPhotoGui::slotSetFirstColor(){ paintingArea->colorPickerSetFirstColor(); UpdateGui(); @@ -356,6 +366,13 @@ void IntelliPhotoGui::createActions(){ actionMoveLayerDown->setShortcut(QKeySequence(Qt::CTRL + Qt::ALT + Qt::Key_Down)); connect(actionMoveLayerDown, SIGNAL(triggered()), this, SLOT(slotMoveLayerDown())); + //Create Update RenderSettings Actions here + actionUpdateRenderSettingsOn = new QAction(tr("&On"), this); + connect(actionUpdateRenderSettingsOn, SIGNAL(triggered()),this, SLOT(slotUpdateRenderSettingsOn())); + + actionUpdateRenderSettingsOff = new QAction(tr("&Off"), this); + connect(actionUpdateRenderSettingsOff, SIGNAL(triggered()),this, SLOT(slotUpdateRenderSettingsOff())); + //Create Color Actions here actionColorPickerFirstColor = new QAction(tr("&Main"), this); connect(actionColorPickerFirstColor, SIGNAL(triggered()), this, SLOT(slotSetFirstColor())); @@ -448,6 +465,11 @@ void IntelliPhotoGui::createMenus(){ fileMenu->addSeparator(); fileMenu->addAction(actionExit); + //Attach all actions to Render Settings + renderMenu = new QMenu(tr("&Fast Renderer"), this); + renderMenu->addAction(actionUpdateRenderSettingsOn); + renderMenu->addAction(actionUpdateRenderSettingsOff); + // Attach all actions to Options optionMenu = new QMenu(tr("&Options"), this); optionMenu->addAction(actionSetActiveLayer); @@ -458,6 +480,8 @@ void IntelliPhotoGui::createMenus(){ optionMenu->addAction(actionMovePositionRight); optionMenu->addAction(actionMoveLayerUp); optionMenu->addAction(actionMoveLayerDown); + optionMenu->addSeparator(); + optionMenu->addMenu(renderMenu); // Attach all actions to Layer layerMenu = new QMenu(tr("&Layer"), this); @@ -506,54 +530,54 @@ void IntelliPhotoGui::createGui(){ // create Gui elements paintingArea = new PaintingArea(); - paintingArea->DumpyGui = this; + paintingArea->DummyGui = this; - p = QPixmap(":/Icons/Buttons/icons/circle-tool.svg"); + preview = QPixmap(":/Icons/Buttons/icons/circle-tool.svg"); CircleButton = new QPushButton(); CircleButton->setFixedSize(Buttonsize); - CircleButton->setIcon(p); + CircleButton->setIcon(preview); CircleButton->setIconSize(Buttonsize); CircleButton->setCheckable(true); - p = QPixmap(":/Icons/Buttons/icons/flood-fill-tool.svg"); + preview = QPixmap(":/Icons/Buttons/icons/flood-fill-tool.svg"); FloodFillButton = new QPushButton(); FloodFillButton->setFixedSize(Buttonsize); - FloodFillButton->setIcon(p); + FloodFillButton->setIcon(preview); FloodFillButton->setIconSize(Buttonsize); FloodFillButton->setCheckable(true); - p = QPixmap(":/Icons/Buttons/icons/icon.png"); + preview = QPixmap(":/Icons/Buttons/icons/line-tool.svg"); LineButton = new QPushButton(); LineButton->setFixedSize(Buttonsize); - LineButton->setIcon(p); + LineButton->setIcon(preview); LineButton->setIconSize(Buttonsize); LineButton->setCheckable(true); - p = QPixmap(":/Icons/Buttons/icons/pen-tool.svg"); + preview = QPixmap(":/Icons/Buttons/icons/pen-tool.svg"); PenButton = new QPushButton(); PenButton->setFixedSize(Buttonsize); - PenButton->setIcon(p); + PenButton->setIcon(preview); PenButton->setIconSize(Buttonsize); PenButton->setCheckable(true); - p = QPixmap(":/Icons/Buttons/icons/icon.png"); + preview = QPixmap(":/Icons/Buttons/icons/plain-tool.svg"); PlainButton = new QPushButton(); PlainButton->setFixedSize(Buttonsize); - PlainButton->setIcon(p); + PlainButton->setIcon(preview); PlainButton->setIconSize(Buttonsize); PlainButton->setCheckable(true); - p = QPixmap(":/Icons/Buttons/icons/polygon-tool.svg"); + preview = QPixmap(":/Icons/Buttons/icons/polygon-tool.svg"); PolygonButton = new QPushButton(); PolygonButton->setFixedSize(Buttonsize); - PolygonButton->setIcon(p); + PolygonButton->setIcon(preview); PolygonButton->setIconSize(Buttonsize); PolygonButton->setCheckable(true); - p = QPixmap(":/Icons/Buttons/icons/rectangle-tool.svg"); + preview = QPixmap(":/Icons/Buttons/icons/rectangle-tool.svg"); RectangleButton = new QPushButton(); RectangleButton->setFixedSize(Buttonsize); - RectangleButton->setIcon(p); + RectangleButton->setIcon(preview); RectangleButton->setIconSize(Buttonsize); RectangleButton->setCheckable(true); @@ -587,22 +611,30 @@ void IntelliPhotoGui::createGui(){ SecondColorButton = new QPushButton(); SecondColorButton->setFixedSize(Buttonsize/2); - p = QPixmap(":/Icons/Buttons/icons/Wechselpfeile.png"); + preview = QPixmap(":/Icons/Buttons/icons/Wechselpfeile.png"); SwitchColorButton = new QPushButton(); SwitchColorButton->setFixedSize(Buttonsize.width(),Buttonsize.height()/2); - SwitchColorButton->setIcon(p); + SwitchColorButton->setIcon(preview); SwitchColorButton->setIconSize(QSize(Buttonsize.width(),Buttonsize.height()/2)); ActiveLayerLine = new QLabel(); - QString string = QString("Active Layer: %1").arg(paintingArea->getNumberOfActiveLayer()); + QString string = QString("Active Layer: %1").arg(paintingArea->getNumberOfActiveLayer() + 1); ActiveLayerLine->setText(string); ActiveLayerLine->setFixedSize(Buttonsize.width()+10,Buttonsize.height()/3); - p = p.fromImage(paintingArea->getImageOfActiveLayer()->getImageData()); + IntelliImage* activePicture = paintingArea->getImageOfActiveLayer(); + if(activePicture){ + preview = preview.fromImage(activePicture->getImageData()); + }else{ + QImage tmp(1,1,QImage::Format_ARGB32); + tmp.fill(Qt::transparent); + preview = preview.fromImage(tmp); + } + ActiveLayerImageButton = new QPushButton(); ActiveLayerImageButton->setFixedSize(Buttonsize); - ActiveLayerImageButton->setIcon(p); + ActiveLayerImageButton->setIcon(preview); ActiveLayerImageButton->setIconSize(Buttonsize); // set gui elements @@ -692,10 +724,18 @@ void IntelliPhotoGui::setDefaultToolValue(){ } void IntelliPhotoGui::UpdateGui(){ - QString string = QString("Active Layer: %1").arg(paintingArea->getNumberOfActiveLayer()); + QString string = QString("Active Layer: %1").arg(paintingArea->getNumberOfActiveLayer() + 1); ActiveLayerLine->setText(string); - p = p.fromImage(paintingArea->getImageOfActiveLayer()->getImageData()); - ActiveLayerImageButton->setIcon(p); + + IntelliImage* activePicture = paintingArea->getImageOfActiveLayer(); + if(activePicture){ + preview = preview.fromImage(activePicture->getImageData()); + }else{ + QImage tmp(1,1,QImage::Format_ARGB32); + tmp.fill(Qt::transparent); + preview = preview.fromImage(tmp); + } + ActiveLayerImageButton->setIcon(preview); ActiveLayerImageButton->setIconSize(Buttonsize); string = QString("background-color: %1").arg(paintingArea->colorPicker.getFirstColor().name()); diff --git a/src/GUI/IntelliPhotoGui.h b/src/GUI/IntelliPhotoGui.h index 3b478b6..6611b47 100644 --- a/src/GUI/IntelliPhotoGui.h +++ b/src/GUI/IntelliPhotoGui.h @@ -56,6 +56,10 @@ void slotPositionMoveRight(); void slotMoveLayerUp(); void slotMoveLayerDown(); +//Rendersetting slots here +void slotUpdateRenderSettingsOn(); +void slotUpdateRenderSettingsOff(); + // color Picker slots here void slotSetFirstColor(); void slotSetSecondColor(); @@ -97,7 +101,7 @@ void setDefaultToolValue(); PaintingArea* paintingArea; const QSize Buttonsize = QSize(70,70); -QPixmap p; +QPixmap preview; QPushButton* CircleButton; QPushButton* FloodFillButton; QPushButton* LineButton; @@ -122,6 +126,7 @@ QPushButton* ActiveLayerImageButton; // The menu widgets QMenu*saveAsMenu; QMenu*fileMenu; +QMenu*renderMenu; QMenu*optionMenu; QMenu*layerMenu; QMenu*colorMenu; @@ -133,6 +138,10 @@ QMenu*helpMenu; QAction*actionOpen; QAction*actionExit; +//Rendersetting actions +QAction*actionUpdateRenderSettingsOn; +QAction*actionUpdateRenderSettingsOff; + // color Picker actions QAction*actionColorPickerFirstColor; QAction*actionColorPickerSecondColor; diff --git a/src/Image/IntelliImage.cpp b/src/Image/IntelliImage.cpp index 4e97513..d1388b6 100644 --- a/src/Image/IntelliImage.cpp +++ b/src/Image/IntelliImage.cpp @@ -11,7 +11,7 @@ IntelliImage::IntelliImage(int width, int height, bool fastRendererOn) if(fastRendererOn){ imageData = imageData.convertToFormat(QImage::Format_Indexed8); } - this->fastRenderer = fastRendererOn; + this->fastRenderering = fastRendererOn; } @@ -30,7 +30,7 @@ bool IntelliImage::loadImage(const QString &filePath){ // scaled Image to size of Layer loadedImage = loadedImage.scaled(imageData.size(),Qt::IgnoreAspectRatio); - imageData = loadedImage.convertToFormat(fastRenderer ? QImage::Format_Indexed8 : QImage::Format_ARGB32); + imageData = loadedImage.convertToFormat(fastRenderering ? QImage::Format_Indexed8 : QImage::Format_ARGB32); return true; } @@ -46,14 +46,16 @@ void IntelliImage::resizeImage(QImage*image, const QSize &newSize){ // Draw the image QPainter painter(&newImage); painter.drawImage(QPoint(0, 0), *image); - *image = newImage; - if(fastRenderer){ - this->imageData = this->imageData.convertToFormat(QImage::Format_Indexed8); + if(fastRenderering){ + *image = newImage.convertToFormat(QImage::Format_Indexed8); + } + else{ + *image = newImage; } } void IntelliImage::drawPixel(const QPoint &p1, const QColor& color){ - if(fastRenderer){ + if(fastRenderering){ this->imageData = this->imageData.convertToFormat(QImage::Format_ARGB32); } // Used to draw on the widget @@ -64,13 +66,13 @@ void IntelliImage::drawPixel(const QPoint &p1, const QColor& color){ // Draw a line from the last registered point to the current painter.drawPoint(p1); - if(fastRenderer){ + if(fastRenderering){ this->imageData = this->imageData.convertToFormat(QImage::Format_Indexed8); } } void IntelliImage::drawPoint(const QPoint &p1, const QColor& color, const int& penWidth){ - if(fastRenderer){ + if(fastRenderering){ this->imageData = this->imageData.convertToFormat(QImage::Format_ARGB32); } // Used to draw on the widget @@ -80,13 +82,13 @@ void IntelliImage::drawPoint(const QPoint &p1, const QColor& color, const int& p painter.setPen(QPen(color, penWidth, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin)); // Draw a line from the last registered point to the current painter.drawPoint(p1); - if(fastRenderer){ + if(fastRenderering){ this->imageData = this->imageData.convertToFormat(QImage::Format_Indexed8); } } void IntelliImage::drawLine(const QPoint &p1, const QPoint& p2, const QColor& color, const int& penWidth){ - if(fastRenderer){ + if(fastRenderering){ this->imageData = this->imageData.convertToFormat(QImage::Format_ARGB32); } // Used to draw on the widget @@ -97,23 +99,23 @@ void IntelliImage::drawLine(const QPoint &p1, const QPoint& p2, const QColor& co // Draw a line from the last registered point to the current painter.drawLine(p1, p2); - if(fastRenderer){ + if(fastRenderering){ this->imageData = this->imageData.convertToFormat(QImage::Format_Indexed8); } } void IntelliImage::drawPlain(const QColor& color){ - if(fastRenderer){ + if(fastRenderering){ this->imageData = this->imageData.convertToFormat(QImage::Format_ARGB32); } imageData.fill(color); - if(fastRenderer){ + if(fastRenderering){ this->imageData = this->imageData.convertToFormat(QImage::Format_Indexed8); } } QColor IntelliImage::getPixelColor(QPoint& point){ - if(fastRenderer){ + if(fastRenderering){ QImage copy = this->imageData.convertToFormat(QImage::Format_ARGB32); return copy.pixelColor(point); } @@ -121,10 +123,29 @@ QColor IntelliImage::getPixelColor(QPoint& point){ } QImage IntelliImage::getImageData(){ - return this->imageData; + QImage copy = imageData; + if(fastRenderering){ + copy = copy.convertToFormat(QImage::Format_ARGB32); + } + return copy; +} + +void IntelliImage::setImageData(const QImage& newData){ + imageData = newData; + if(fastRenderering){ + this->imageData = imageData.convertToFormat(QImage::Format_Indexed8); + } + else { + this->imageData = imageData.convertToFormat(QImage::Format_ARGB32); + } } void IntelliImage::updateRendererSetting(bool fastRendererOn){ - this->fastRenderer = fastRendererOn; - this->imageData = this->imageData.convertToFormat(fastRenderer ? QImage::Format_Indexed8 : QImage::Format_ARGB32); + this->fastRenderering = fastRendererOn; + if(fastRenderering){ + this->imageData = imageData.convertToFormat(QImage::Format_Indexed8); + } + else { + this->imageData = imageData.convertToFormat(QImage::Format_ARGB32); + } } diff --git a/src/Image/IntelliImage.h b/src/Image/IntelliImage.h index 8926990..185063d 100644 --- a/src/Image/IntelliImage.h +++ b/src/Image/IntelliImage.h @@ -42,9 +42,9 @@ QImage imageData; ImageType TypeOfImage; /*! - * \brief fastRenderer is the flag that represents the usage of 8bit pictures. + * \brief fastRendering is the flag that represents the usage of 8bit pictures. */ -bool fastRenderer; +bool fastRenderering; public: /*! @@ -156,10 +156,16 @@ virtual QColor getPixelColor(QPoint& point); virtual void updateRendererSetting(bool fastRendererOn); /*! - * \brief getImageData returns the data of the current image. + * \brief getImageData returns the data of the current image (Note: It will allways return a ARGB32bit QImage!). */ virtual QImage getImageData(); +/*! + * \brief setImageData overwrites the old imageData the new imageData. + * \param newData - represents the new imageData + */ +virtual void setImageData(const QImage& newData); + }; #endif diff --git a/src/Image/IntelliRasterImage.cpp b/src/Image/IntelliRasterImage.cpp index 4bd0891..c2ea6f9 100644 --- a/src/Image/IntelliRasterImage.cpp +++ b/src/Image/IntelliRasterImage.cpp @@ -6,7 +6,7 @@ IntelliRasterImage::IntelliRasterImage(int width, int height, bool fastRendererOn) : IntelliImage(width, height, fastRendererOn){ TypeOfImage = IntelliImage::ImageType::RASTERIMAGE; - this->fastRenderer = fastRendererOn; + this->fastRenderering = fastRendererOn; } IntelliRasterImage::~IntelliRasterImage(){ @@ -30,7 +30,7 @@ QImage IntelliRasterImage::getDisplayable(int alpha){ QImage IntelliRasterImage::getDisplayable(const QSize& displaySize, int alpha){ QImage copy = imageData; - if(fastRenderer){ + if(fastRenderering){ copy = copy.convertToFormat(QImage::Format_ARGB32); } for(int y = 0; yfastRenderer = fastRendererOn; + this->fastRenderering = fastRendererOn; } IntelliShapedImage::~IntelliShapedImage(){ @@ -27,7 +27,7 @@ IntelliImage* IntelliShapedImage::getDeepCopy(){ } void IntelliShapedImage::calculateVisiblity(){ - if(fastRenderer){ + if(fastRenderering){ this->imageData = imageData.convertToFormat(QImage::Format_ARGB32); } @@ -40,7 +40,7 @@ void IntelliShapedImage::calculateVisiblity(){ imageData.setPixelColor(x,y,clr); } } - if(fastRenderer){ + if(fastRenderering){ this->imageData = this->imageData.convertToFormat(QImage::Format_Indexed8); } return; @@ -59,14 +59,14 @@ void IntelliShapedImage::calculateVisiblity(){ imageData.setPixelColor(x,y,clr); } } - if(fastRenderer){ + if(fastRenderering){ this->imageData = this->imageData.convertToFormat(QImage::Format_Indexed8); } } QImage IntelliShapedImage::getDisplayable(const QSize& displaySize, int alpha){ QImage copy = imageData; - if(fastRenderer){ + if(fastRenderering){ copy = copy.convertToFormat(QImage::Format_ARGB32); } for(int y = 0; yfastRenderering = Updatedsetting; +} + +bool IntelliRenderSettings::isFastRenderering(){ + return fastRenderering; } diff --git a/src/IntelliHelper/IntelliRenderSettings.h b/src/IntelliHelper/IntelliRenderSettings.h index e932435..a0be040 100644 --- a/src/IntelliHelper/IntelliRenderSettings.h +++ b/src/IntelliHelper/IntelliRenderSettings.h @@ -7,14 +7,19 @@ class IntelliRenderSettings public: IntelliRenderSettings(); +/*! + * \brief setFastRendering sets fastRendering to Updatedsetting. + * \param Updatedsetting - Represents the new value for the Fast Rendering Flag. + */ +void setFastRendering(bool Updatedsetting); /*! * \brief The getfastRenderer gets the value of the flag for the fastRenderer setting. * \return Returns true if fastRenderer is active else false */ -bool getFastRenderer(); +bool isFastRenderering(); private: -bool fastRenderer = true; +bool fastRenderering = true; }; #endif // INTELLIRENDERSETTINGS_H diff --git a/src/Layer/PaintingArea.cpp b/src/Layer/PaintingArea.cpp index 2258376..4921cc1 100644 --- a/src/Layer/PaintingArea.cpp +++ b/src/Layer/PaintingArea.cpp @@ -21,27 +21,36 @@ PaintingArea::PaintingArea(int maxWidth, int maxHeight, QWidget*parent) : QWidget(parent){ this->Tool = nullptr; - this->setLayerDimensions(maxWidth, maxHeight); - this->addLayer(200,200,0,0,IntelliImage::ImageType::SHAPEDIMAGE); - layerBundle[0].image->drawPlain(QColor(0,0,255,255)); - std::vector polygon; - polygon.push_back(QPoint(100,000)); - polygon.push_back(QPoint(200,100)); - polygon.push_back(QPoint(100,200)); - polygon.push_back(QPoint(000,100)); - layerBundle[0].image->setPolygon(polygon); + this->setLayerDimensions(maxWidth, maxHeight); + //this->addLayer(200,200,0,0,IntelliImage::ImageType::SHAPEDIMAGE); + //layerBundle[0].image->drawPlain(QColor(0,0,255,255)); + //std::vector polygon; + //polygon.push_back(QPoint(100,000)); + //polygon.push_back(QPoint(200,100)); + //polygon.push_back(QPoint(100,200)); + //polygon.push_back(QPoint(000,100)); + //layerBundle[0].image->setPolygon(polygon); + // + //this->addLayer(200,200,150,150,IntelliImage::ImageType::RASTERIMAGE); + //layerBundle[1].image->drawPlain(QColor(0,255,0,255)); + //layerBundle[1].alpha=200; - this->addLayer(200,200,150,150,IntelliImage::ImageType::RASTERIMAGE); - layerBundle[1].image->drawPlain(QColor(0,255,0,255)); - layerBundle[1].alpha=200; - - activeLayer=0; + activeLayer=-1; } PaintingArea::~PaintingArea(){ delete Tool; } +void PaintingArea::setRenderSettings(bool isFastRenderingOn){ + if(isFastRenderingOn != renderSettings.isFastRenderering()){ + renderSettings.setFastRendering(isFastRenderingOn); + for(auto& layer : layerBundle){ + layer.image->updateRendererSetting(isFastRenderingOn); + } + } +} + void PaintingArea::setLayerDimensions(int maxWidth, int maxHeight){ //set standart parameter this->maxWidth = maxWidth; @@ -60,9 +69,9 @@ int PaintingArea::addLayer(int width, int height, int widthOffset, int heightOff newLayer.widthOffset = widthOffset; newLayer.heightOffset = heightOffset; if(type==IntelliImage::ImageType::RASTERIMAGE) { - newLayer.image = new IntelliRasterImage(width,height,renderSettings.getFastRenderer()); + newLayer.image = new IntelliRasterImage(width,height,renderSettings.isFastRenderering()); }else if(type==IntelliImage::ImageType::SHAPEDIMAGE) { - newLayer.image = new IntelliShapedImage(width, height, renderSettings.getFastRenderer()); + newLayer.image = new IntelliShapedImage(width, height, renderSettings.isFastRenderering()); } newLayer.alpha = 255; this->layerBundle.push_back(newLayer); @@ -74,9 +83,12 @@ int PaintingArea::addLayer(int width, int height, int widthOffset, int heightOff void PaintingArea::deleteLayer(int idx){ if(idx(layerBundle.size())) { this->layerBundle.erase(layerBundle.begin()+idx); - if(activeLayer>=idx && activeLayer != 0) { + if(activeLayer>=idx) { activeLayer--; } + if(activeLayer < 0 && layerBundle.size()){ + activeLayer=0; + } } } @@ -253,6 +265,8 @@ std::vector PaintingArea::getPolygonDataOfRealLayer(){ // left button and if so store the current position // Set that we are currently drawing void PaintingArea::mousePressEvent(QMouseEvent*event){ + if(this->activeLayer < 0) + return; if(Tool == nullptr) return; int x = event->x()-layerBundle[static_cast(activeLayer)].widthOffset; @@ -269,6 +283,8 @@ void PaintingArea::mousePressEvent(QMouseEvent*event){ // we call the drawline function which draws a line // from the last position to the current void PaintingArea::mouseMoveEvent(QMouseEvent*event){ + if(this->activeLayer < 0) + return; if(Tool == nullptr) return; int x = event->x()-layerBundle[static_cast(activeLayer)].widthOffset; @@ -279,7 +295,9 @@ void PaintingArea::mouseMoveEvent(QMouseEvent*event){ // If the button is released we set variables to stop drawing void PaintingArea::mouseReleaseEvent(QMouseEvent*event){ - if(Tool == nullptr) + if(this->activeLayer < 0) + return; + if(Tool == nullptr) return; int x = event->x()-layerBundle[static_cast(activeLayer)].widthOffset; int y = event->y()-layerBundle[static_cast(activeLayer)].heightOffset; @@ -292,7 +310,9 @@ void PaintingArea::mouseReleaseEvent(QMouseEvent*event){ } void PaintingArea::wheelEvent(QWheelEvent*event){ - if(this->Tool != nullptr) { + if(this->activeLayer < 0) + return; + if(this->Tool != nullptr) { QPoint numDegrees = event->angleDelta() / 8; if(!numDegrees.isNull()) { QPoint numSteps = numDegrees / 15; @@ -373,7 +393,7 @@ void PaintingArea::drawLayers(bool forSaving){ } } -void PaintingArea::createTempTopLayer(int idx){ +bool PaintingArea::createTempTopLayer(int idx){ if(idx>=0) { LayerObject newLayer; newLayer.alpha = 255; @@ -383,7 +403,9 @@ void PaintingArea::createTempTopLayer(int idx){ newLayer.widthOffset = layerBundle[static_cast(idx)].widthOffset; newLayer.image = layerBundle[static_cast(idx)].image->getDeepCopy(); layerBundle.insert(layerBundle.begin()+idx+1,newLayer); + return true; } + return false; } IntelliTool* PaintingArea::copyActiveTool(){ @@ -404,5 +426,8 @@ int PaintingArea::getNumberOfActiveLayer(){ } IntelliImage* PaintingArea::getImageOfActiveLayer(){ + if(activeLayer<0){ + return nullptr; + } return layerBundle[activeLayer].image; } diff --git a/src/Layer/PaintingArea.h b/src/Layer/PaintingArea.h index 31b3916..655a69e 100644 --- a/src/Layer/PaintingArea.h +++ b/src/Layer/PaintingArea.h @@ -58,6 +58,12 @@ public: // Handles all events + /*! + * \brief setRenderSettings updates all Images to the new Rendersetting. + * \param isFastRenderingOn is the new given flag for the FastRenderer. + */ + void setRenderSettings(bool isFastRenderingOn); + /*! * \brief The open method is used for loading a picture into the current layer * \param fileName - Path and filename which are used to determine where the to-be-opened file is stored @@ -211,7 +217,7 @@ private: IntelliRenderSettings renderSettings; IntelliTool* Tool; - IntelliPhotoGui* DumpyGui; + IntelliPhotoGui* DummyGui; std::vector layerBundle; int activeLayer=-1; @@ -221,8 +227,7 @@ private: void resizeLayer(QImage *image_res, const QSize &newSize); // Helper for Tool - // TODO: Always create this layer on top and return the id here! - void createTempTopLayer(int idx); + bool createTempTopLayer(int idx); }; #endif diff --git a/src/Tool/IntelliTool.cpp b/src/Tool/IntelliTool.cpp index 91979e3..2dd2272 100644 --- a/src/Tool/IntelliTool.cpp +++ b/src/Tool/IntelliTool.cpp @@ -24,10 +24,10 @@ void IntelliTool::onMouseRightReleased(int x, int y){ } void IntelliTool::onMouseLeftPressed(int x, int y){ - this->isDrawing=true; - //create drawing layer - this->createToolLayer(); - Canvas->image->calculateVisiblity(); + this->isDrawing=this->createToolLayer(); + if(isDrawing){ + Canvas->image->calculateVisiblity(); + } } void IntelliTool::onMouseLeftReleased(int x, int y){ @@ -48,18 +48,23 @@ void IntelliTool::onWheelScrolled(int value){ //if needed for future general tasks implement in here } -void IntelliTool::createToolLayer(){ - Area->createTempTopLayer(Area->activeLayer); - this->activeLayer=&Area->layerBundle[static_cast(Area->activeLayer)]; - this->Canvas=&Area->layerBundle[static_cast(Area->activeLayer+1)]; +bool IntelliTool::createToolLayer(){ + if(Area->createTempTopLayer(Area->activeLayer)){ + this->activeLayer=&Area->layerBundle[static_cast(Area->activeLayer)]; + this->Canvas=&Area->layerBundle[static_cast(Area->activeLayer+1)]; + return true; + } + return false; } void IntelliTool::mergeToolLayer(){ QColor clr_0; QColor clr_1; + QImage updatedImage = activeLayer->image->getImageData(); + for(int y=0; yheight; y++) { - for(int x=0; xwidth; x++) { - clr_0=activeLayer->image->imageData.pixelColor(x,y); + for(int x=0; xwidth; x++) { + clr_0=updatedImage.pixelColor(x,y); clr_1=Canvas->image->imageData.pixelColor(x,y); float t = static_cast(clr_1.alpha())/255.f; int r =static_cast(static_cast(clr_1.red())*(t)+static_cast(clr_0.red())*(1.f-t)+0.5f); @@ -71,10 +76,11 @@ void IntelliTool::mergeToolLayer(){ clr_0.setBlue(b); clr_0.setAlpha(a); - activeLayer->image->imageData.setPixelColor(x, y, clr_0); + updatedImage.setPixelColor(x, y, clr_0); } } - Area->DumpyGui->UpdateGui(); + activeLayer->image->setImageData(updatedImage); + Area->DummyGui->UpdateGui(); } void IntelliTool::deleteToolLayer(){ diff --git a/src/Tool/IntelliTool.h b/src/Tool/IntelliTool.h index 4353018..56404aa 100644 --- a/src/Tool/IntelliTool.h +++ b/src/Tool/IntelliTool.h @@ -25,8 +25,9 @@ enum class Tooltype { private: /*! * \brief A function that creates a layer to draw on. + * \return Returns if a layer could be created */ -void createToolLayer(); +bool createToolLayer(); /*! * \brief A function that merges the drawing- and the active- layer. diff --git a/src/Tool/IntelliToolCircle.cpp b/src/Tool/IntelliToolCircle.cpp index b8e9d59..eba6736 100644 --- a/src/Tool/IntelliToolCircle.cpp +++ b/src/Tool/IntelliToolCircle.cpp @@ -57,10 +57,12 @@ void IntelliToolCircle::onMouseRightReleased(int x, int y){ void IntelliToolCircle::onMouseLeftPressed(int x, int y){ IntelliTool::onMouseLeftPressed(x,y); - this->centerPoint=QPoint(x,y); - int radius = 1; - drawCircle(radius); - Canvas->image->calculateVisiblity(); + if(this->isDrawing){ + this->centerPoint=QPoint(x,y); + int radius = 1; + drawCircle(radius); + Canvas->image->calculateVisiblity(); + } } void IntelliToolCircle::onMouseLeftReleased(int x, int y){ diff --git a/src/icons/flood-fill-tool.svg b/src/icons/flood-fill-tool.svg index 980bb7a..71f019d 100644 --- a/src/icons/flood-fill-tool.svg +++ b/src/icons/flood-fill-tool.svg @@ -15,22 +15,10 @@ viewBox="0 0 67.733332 67.733335" version="1.1" id="svg8" - sodipodi:docname="flood-fill-tool.svg" + sodipodi:docname="magic-wand-tool.svg" inkscape:version="0.92.4 (5da689c313, 2019-01-14)"> - - - - @@ -52,15 +40,6 @@ x2="-13.131983" y2="106.49742" gradientUnits="userSpaceOnUse" /> - - - - - - - - - - - + + + + + + + + diff --git a/src/icons/line-tool.svg b/src/icons/line-tool.svg new file mode 100644 index 0000000..e26bb7b --- /dev/null +++ b/src/icons/line-tool.svg @@ -0,0 +1,99 @@ + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/src/icons/magic-wand-tool.svg b/src/icons/magic-wand-tool.svg deleted file mode 100644 index 71f019d..0000000 --- a/src/icons/magic-wand-tool.svg +++ /dev/null @@ -1,169 +0,0 @@ - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - diff --git a/src/icons/plain-tool.svg b/src/icons/plain-tool.svg new file mode 100644 index 0000000..980bb7a --- /dev/null +++ b/src/icons/plain-tool.svg @@ -0,0 +1,194 @@ + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + From 37ba19d79245fe88facb55093de3415f1396e021 Mon Sep 17 00:00:00 2001 From: Jan Schuffenhauer Date: Thu, 9 Jan 2020 14:48:24 +0100 Subject: [PATCH 42/44] Menuerweiterung --- src/GUI/IntelliPhotoGui.cpp | 105 +++++++++++++++++++++++------------- src/GUI/IntelliPhotoGui.h | 8 +++ 2 files changed, 77 insertions(+), 36 deletions(-) diff --git a/src/GUI/IntelliPhotoGui.cpp b/src/GUI/IntelliPhotoGui.cpp index d427e5f..8379d58 100644 --- a/src/GUI/IntelliPhotoGui.cpp +++ b/src/GUI/IntelliPhotoGui.cpp @@ -290,6 +290,16 @@ void IntelliPhotoGui::slotResetTools(){ RectangleButton->setChecked(false); } +void IntelliPhotoGui::slotSetWidth(){ + paintingArea->Toolsettings.setLineWidth(); + EditLineWidth->setText(QString("%1").arg(paintingArea->Toolsettings.getLineWidth())); +} + +void IntelliPhotoGui::slotSetInnerAlpha(){ + paintingArea->Toolsettings.setInnerAlpha(); + EditLineInnerAlpha->setText(QString("%1").arg(paintingArea->Toolsettings.getInnerAlpha())); +} + // Define menu actions that call functions void IntelliPhotoGui::createActions(){ // Get a list of the supported file formats @@ -448,6 +458,12 @@ void IntelliPhotoGui::createActions(){ connect(RectangleButton,SIGNAL(pressed()), this, SLOT(slotResetTools())); connect(RectangleButton, SIGNAL(clicked()), this, SLOT(slotCreateRectangleTool())); + + actionSetWidth = new QAction(tr("&Set Width"),this); + connect(actionSetWidth, SIGNAL(triggered()), this, SLOT(slotSetWidth())); + + actionSetInnerAlpha = new QAction(tr("&Set Inner Alpha"),this); + connect(actionSetInnerAlpha, SIGNAL(triggered()), this, SLOT(slotSetInnerAlpha())); } // Create the menubar @@ -470,42 +486,57 @@ void IntelliPhotoGui::createMenus(){ renderMenu->addAction(actionUpdateRenderSettingsOn); renderMenu->addAction(actionUpdateRenderSettingsOff); + // Attach all actions to Layer + layerMenu = new QMenu(tr("&Layer"), this); + layerMenu->addAction(actionCreateNewLayer); + layerMenu->addSeparator(); + layerMenu->addAction(actionSetActiveAlpha); + layerMenu->addAction(actionSetActiveLayer); + layerMenu->addSeparator(); + layerMenu->addAction(actionMovePositionUp); + layerMenu->addAction(actionMovePositionDown); + layerMenu->addAction(actionMovePositionLeft); + layerMenu->addAction(actionMovePositionRight); + layerMenu->addAction(actionMoveLayerUp); + layerMenu->addAction(actionMoveLayerDown); + layerMenu->addSeparator(); + layerMenu->addAction(actionDeleteLayer); + + //Attach all Color Options + colorMenu = new QMenu(tr("&Color"), this); + colorMenu->addAction(actionColorPickerFirstColor); + colorMenu->addAction(actionColorPickerSecondColor); + colorMenu->addAction(actionColorSwap); + + //Attach all Tool Creation Actions + toolCreationMenu = new QMenu(tr("&Drawingtools"), this); + toolCreationMenu->addAction(actionCreateCircleTool); + toolCreationMenu->addAction(actionCreateFloodFillTool); + toolCreationMenu->addAction(actionCreateLineTool); + toolCreationMenu->addAction(actionCreatePenTool); + toolCreationMenu->addAction(actionCreatePlainTool); + toolCreationMenu->addAction(actionCreatePolygonTool); + toolCreationMenu->addAction(actionCreateRectangleTool); + + //Attach all Tool Setting Actions + toolSettingsMenu = new QMenu(tr("&Toolsettings"), this); + toolSettingsMenu->addAction(actionSetWidth); + toolSettingsMenu->addAction(actionSetInnerAlpha); + + //Attach all Tool Options + toolMenu = new QMenu(tr("&Tools"), this); + toolMenu->addMenu(toolCreationMenu); + toolMenu->addMenu(toolSettingsMenu); + toolMenu->addSeparator(); + toolMenu->addMenu(colorMenu); + // Attach all actions to Options optionMenu = new QMenu(tr("&Options"), this); - optionMenu->addAction(actionSetActiveLayer); - optionMenu->addAction(actionSetActiveAlpha); - optionMenu->addAction(actionMovePositionUp); - optionMenu->addAction(actionMovePositionDown); - optionMenu->addAction(actionMovePositionLeft); - optionMenu->addAction(actionMovePositionRight); - optionMenu->addAction(actionMoveLayerUp); - optionMenu->addAction(actionMoveLayerDown); + optionMenu->addMenu(layerMenu); + optionMenu->addMenu(toolMenu); optionMenu->addSeparator(); optionMenu->addMenu(renderMenu); - // Attach all actions to Layer - layerMenu = new QMenu(tr("&Layer"), this); - layerMenu->addAction(actionCreateNewLayer); - layerMenu->addAction(actionDeleteLayer); - - //Attach all Color Options - colorMenu = new QMenu(tr("&Color"), this); - colorMenu->addAction(actionColorPickerFirstColor); - colorMenu->addAction(actionColorPickerSecondColor); - colorMenu->addAction(actionColorSwap); - - //Attach all Tool Options - toolMenu = new QMenu(tr("&Tools"), this); - toolMenu->addAction(actionCreateCircleTool); - toolMenu->addAction(actionCreateFloodFillTool); - toolMenu->addAction(actionCreateLineTool); - toolMenu->addAction(actionCreatePenTool); - toolMenu->addAction(actionCreatePlainTool); - toolMenu->addAction(actionCreatePolygonTool); - toolMenu->addAction(actionCreateRectangleTool); - toolMenu->addSeparator(); - toolMenu->addMenu(colorMenu); - // Attach all actions to Help helpMenu = new QMenu(tr("&Help"), this); helpMenu->addAction(actionAboutDialog); @@ -514,8 +545,6 @@ void IntelliPhotoGui::createMenus(){ // Add menu items to the menubar menuBar()->addMenu(fileMenu); menuBar()->addMenu(optionMenu); - menuBar()->addMenu(layerMenu); - menuBar()->addMenu(toolMenu); menuBar()->addMenu(helpMenu); } @@ -661,10 +690,14 @@ void IntelliPhotoGui::createGui(){ void IntelliPhotoGui::setIntelliStyle(){ // Set the title setWindowTitle("IntelliPhoto Prototype"); + QStyle* Style = new QProxyStyle(); // 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)"); + this->setStyleSheet("background-color:rgb(64,64,64)"); + this->centralGuiWidget->setStyleSheet("color:rgb(255,255,255)"); + this->menuBar()->setStyleSheet("color:rgb(255,255,255)"); + this->fileMenu->setStyle(Style); + this->optionMenu->setStyle(Style); + this->helpMenu->setStyle(Style); QString string = QString("background-color: %1").arg(paintingArea->colorPicker.getFirstColor().name()); FirstColorButton->setStyleSheet(string); string = QString("background-color: %1").arg(paintingArea->colorPicker.getSecondColor().name()); diff --git a/src/GUI/IntelliPhotoGui.h b/src/GUI/IntelliPhotoGui.h index 6611b47..a882ef8 100644 --- a/src/GUI/IntelliPhotoGui.h +++ b/src/GUI/IntelliPhotoGui.h @@ -79,6 +79,9 @@ void slotAboutDialog(); void slotEnterPressed(); +void slotSetWidth(); +void slotSetInnerAlpha(); + void slotResetTools(); private: @@ -130,6 +133,8 @@ QMenu*renderMenu; QMenu*optionMenu; QMenu*layerMenu; QMenu*colorMenu; +QMenu*toolCreationMenu; +QMenu*toolSettingsMenu; QMenu*toolMenu; QMenu*helpMenu; @@ -175,6 +180,9 @@ QAction* actionMoveLayerDown; // Actions tied to specific file formats QList actionSaveAs; +QAction* actionSetWidth; +QAction* actionSetInnerAlpha; + // main GUI elements QWidget* centralGuiWidget; QGridLayout* mainLayout; From f96f8aabc4b670dc38e332b83a7149eb7c4fb5a1 Mon Sep 17 00:00:00 2001 From: Jan Schuffenhauer Date: Thu, 9 Jan 2020 15:29:42 +0100 Subject: [PATCH 43/44] Update IntelliPhotoGui.cpp --- src/GUI/IntelliPhotoGui.cpp | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/src/GUI/IntelliPhotoGui.cpp b/src/GUI/IntelliPhotoGui.cpp index 8379d58..da25ef1 100644 --- a/src/GUI/IntelliPhotoGui.cpp +++ b/src/GUI/IntelliPhotoGui.cpp @@ -660,11 +660,11 @@ void IntelliPhotoGui::createGui(){ preview = preview.fromImage(tmp); } - ActiveLayerImageButton = new QPushButton(); ActiveLayerImageButton->setFixedSize(Buttonsize); ActiveLayerImageButton->setIcon(preview); ActiveLayerImageButton->setIconSize(Buttonsize); + ActiveLayerImageButton->setEnabled(false); // set gui elements @@ -690,14 +690,24 @@ void IntelliPhotoGui::createGui(){ void IntelliPhotoGui::setIntelliStyle(){ // Set the title setWindowTitle("IntelliPhoto Prototype"); - QStyle* Style = new QProxyStyle(); + QPalette Palette; + Palette.setBrush(QPalette::HighlightedText, QColor(200, 10, 10)); + Palette.setBrush(QPalette::ButtonText, QColor(255, 255, 255)); // 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)"); - this->fileMenu->setStyle(Style); - this->optionMenu->setStyle(Style); - this->helpMenu->setStyle(Style); + this->menuBar()->setPalette(Palette); + this->fileMenu->setPalette(Palette); + this->saveAsMenu->setPalette(Palette); + this->optionMenu->setPalette(Palette); + this->helpMenu->setPalette(Palette); + this->renderMenu->setPalette(Palette); + this->toolMenu->setPalette(Palette); + this->layerMenu->setPalette(Palette); + this->colorMenu->setPalette(Palette); + this->toolCreationMenu->setPalette(Palette); + this->toolSettingsMenu->setPalette(Palette); + QString string = QString("background-color: %1").arg(paintingArea->colorPicker.getFirstColor().name()); FirstColorButton->setStyleSheet(string); string = QString("background-color: %1").arg(paintingArea->colorPicker.getSecondColor().name()); From d54e1f37004b9d3a8106e9382f0c2b52da48bb37 Mon Sep 17 00:00:00 2001 From: Jan Schuffenhauer Date: Thu, 9 Jan 2020 17:07:27 +0100 Subject: [PATCH 44/44] Added more Hotkeys + edited ColorPalette TY all for watching --- src/GUI/IntelliPhotoGui.cpp | 34 ++++++++++++++++++++++++++-------- 1 file changed, 26 insertions(+), 8 deletions(-) diff --git a/src/GUI/IntelliPhotoGui.cpp b/src/GUI/IntelliPhotoGui.cpp index da25ef1..d73a730 100644 --- a/src/GUI/IntelliPhotoGui.cpp +++ b/src/GUI/IntelliPhotoGui.cpp @@ -112,14 +112,14 @@ void IntelliPhotoGui::slotSetActiveAlpha(){ // Define the standard Value, min, max, step and ok button int layer = QInputDialog::getInt(this, tr("Layer to set on"), tr("Layer:"), - -1,-1,100,1, &ok1); + 1,1,500,1, &ok1); // "New Alpha" is the title of the window int alpha = QInputDialog::getInt(this, tr("New Alpha"), tr("Alpha:"), 255,0, 255, 1, &ok2); if (ok1&&ok2) { - paintingArea->setLayerAlpha(layer,alpha); + paintingArea->setLayerAlpha(layer-1,alpha); UpdateGui(); } } @@ -192,10 +192,10 @@ void IntelliPhotoGui::slotSetActiveLayer(){ // Define the standard Value, min, max, step and ok button int layer = QInputDialog::getInt(this, tr("Layer to set on"), tr("Layer:"), - -1,0,255,1, &ok1); + 1,1,500,1, &ok1); if (ok1) { - paintingArea->setLayerActive(layer); + paintingArea->setLayerActive(layer-1); UpdateGui(); } } @@ -264,7 +264,7 @@ void IntelliPhotoGui::slotCreateFloodFillTool(){ void IntelliPhotoGui::slotAboutDialog(){ // Window title and text to display QMessageBox::about(this, tr("About Painting"), - tr("

    IntelliPhotoPretty basic editor.

    ")); + tr("

    IntelliPhoto - A Pretty basic editor.


    Developed by Team 7.")); } void IntelliPhotoGui::slotEnterPressed(){ @@ -327,6 +327,7 @@ void IntelliPhotoGui::createActions(){ connect(pngSaveAction, SIGNAL(triggered()), this, SLOT(slotSave())); // Attach each PNG in save Menu actionSaveAs.append(pngSaveAction); + pngSaveAction->setShortcut(QKeySequence(Qt::CTRL + Qt::SHIFT + Qt::Key_S)); // Create exit action and tie to IntelliPhotoGui::close() actionExit = new QAction(tr("&Exit"), this); @@ -344,12 +345,15 @@ void IntelliPhotoGui::createActions(){ // Delete New Layer action and tie to IntelliPhotoGui::deleteLayer() actionDeleteLayer = new QAction(tr("&Delete Layer..."), this); + actionDeleteLayer->setShortcut(QKeySequence(Qt::CTRL + Qt::ALT + Qt::Key_D)); connect(actionDeleteLayer, SIGNAL(triggered()), this, SLOT(slotDeleteLayer())); actionSetActiveLayer = new QAction(tr("&set Active"), this); + actionSetActiveLayer->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_A)); connect(actionSetActiveLayer, SIGNAL(triggered()), this, SLOT(slotSetActiveLayer())); - actionSetActiveAlpha = new QAction(tr("&set Alpha"), this); + actionSetActiveAlpha = new QAction(tr("&set Alpha"), this); + actionSetActiveAlpha->setShortcut(QKeySequence(Qt::CTRL + Qt::ALT + Qt::Key_A)); connect(actionSetActiveAlpha, SIGNAL(triggered()), this, SLOT(slotSetActiveAlpha())); actionMovePositionUp = new QAction(tr("&move Up"), this); @@ -378,61 +382,74 @@ void IntelliPhotoGui::createActions(){ //Create Update RenderSettings Actions here actionUpdateRenderSettingsOn = new QAction(tr("&On"), this); + actionUpdateRenderSettingsOn->setShortcut(QKeySequence(Qt::ALT +Qt::SHIFT + +Qt::Key_A)); connect(actionUpdateRenderSettingsOn, SIGNAL(triggered()),this, SLOT(slotUpdateRenderSettingsOn())); actionUpdateRenderSettingsOff = new QAction(tr("&Off"), this); + actionUpdateRenderSettingsOff->setShortcut(QKeySequence(Qt::ALT +Qt::SHIFT + +Qt::Key_D)); connect(actionUpdateRenderSettingsOff, SIGNAL(triggered()),this, SLOT(slotUpdateRenderSettingsOff())); //Create Color Actions here actionColorPickerFirstColor = new QAction(tr("&Main"), this); + actionColorPickerFirstColor->setShortcut(QKeySequence(Qt::ALT + Qt::Key_N)); connect(actionColorPickerFirstColor, SIGNAL(triggered()), this, SLOT(slotSetFirstColor())); connect(FirstColorButton, SIGNAL(clicked()), this, SLOT(slotSetFirstColor())); actionColorPickerSecondColor = new QAction(tr("&Secondary"), this); + actionColorPickerSecondColor->setShortcut(QKeySequence(Qt::ALT + Qt::Key_M)); 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)); + actionColorSwap->setShortcut(QKeySequence(Qt::CTRL + Qt::ALT + 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); + actionCreatePlainTool->setShortcut(QKeySequence(Qt::CTRL + Qt::ALT + Qt::SHIFT +Qt::Key_P)); connect(actionCreatePlainTool, SIGNAL(triggered()), this, SLOT(slotResetTools())); connect(actionCreatePlainTool, SIGNAL(triggered()), this, SLOT(slotCreatePlainTool())); actionCreatePenTool = new QAction(tr("&Pen"),this); + actionCreatePenTool->setShortcut(QKeySequence(Qt::CTRL + Qt::ALT + Qt::SHIFT +Qt::Key_S)); connect(actionCreatePenTool, SIGNAL(triggered()), this, SLOT(slotResetTools())); connect(actionCreatePenTool, SIGNAL(triggered()), this, SLOT(slotCreatePenTool())); actionCreateLineTool = new QAction(tr("&Line"), this); + actionCreateLineTool->setShortcut(QKeySequence(Qt::CTRL + Qt::ALT + Qt::SHIFT +Qt::Key_L)); connect(actionCreateLineTool, SIGNAL(triggered()), this, SLOT(slotResetTools())); connect(actionCreateLineTool, SIGNAL(triggered()), this, SLOT(slotCreateLineTool())); actionCreateCircleTool = new QAction(tr("&Circle"), this); + actionCreateCircleTool->setShortcut(QKeySequence(Qt::CTRL + Qt::ALT + Qt::SHIFT +Qt::Key_C)); connect(actionCreateCircleTool, SIGNAL(triggered()), this, SLOT(slotResetTools())); connect(actionCreateCircleTool, SIGNAL(triggered()), this, SLOT(slotCreateCircleTool())); actionCreateRectangleTool = new QAction(tr("&Rectangle"), this); + actionCreateRectangleTool->setShortcut(QKeySequence(Qt::CTRL + Qt::ALT + Qt::SHIFT +Qt::Key_R)); connect(actionCreateRectangleTool, SIGNAL(triggered()), this, SLOT(slotResetTools())); connect(actionCreateRectangleTool, SIGNAL(triggered()), this, SLOT(slotCreateRectangleTool())); actionCreatePolygonTool = new QAction(tr("&Polygon"), this); + actionCreatePolygonTool->setShortcut(QKeySequence(Qt::CTRL + Qt::ALT + Qt::SHIFT +Qt::Key_V)); connect(actionCreatePolygonTool, SIGNAL(triggered()), this, SLOT(slotResetTools())); connect(actionCreatePolygonTool, SIGNAL(triggered()), this, SLOT(slotCreatePolygonTool())); actionCreateFloodFillTool = new QAction(tr("&FloodFill"), this); + actionCreateFloodFillTool->setShortcut(QKeySequence(Qt::CTRL + Qt::ALT + Qt::SHIFT +Qt::Key_F)); connect(actionCreateFloodFillTool, SIGNAL(triggered()), this, SLOT(slotResetTools())); connect(actionCreateFloodFillTool, SIGNAL(triggered()), this, SLOT(slotCreateFloodFillTool())); // Create about action and tie to IntelliPhotoGui::about() actionAboutDialog = new QAction(tr("&About"), this); + actionAboutDialog->setShortcut(Qt::Key_F2); connect(actionAboutDialog, SIGNAL(triggered()), this, SLOT(slotAboutDialog())); // Create about Qt action and tie to IntelliPhotoGui::aboutQt() actionAboutQtDialog = new QAction(tr("About &Qt"), this); + actionAboutQtDialog->setShortcut(Qt::Key_F3); connect(actionAboutQtDialog, SIGNAL(triggered()), qApp, SLOT(aboutQt())); connect(EditLineWidth, SIGNAL(returnPressed()), this, SLOT(slotEnterPressed())); @@ -460,9 +477,11 @@ void IntelliPhotoGui::createActions(){ connect(RectangleButton, SIGNAL(clicked()), this, SLOT(slotCreateRectangleTool())); actionSetWidth = new QAction(tr("&Set Width"),this); + actionSetWidth->setShortcut(QKeySequence(Qt::ALT + Qt::Key_W)); connect(actionSetWidth, SIGNAL(triggered()), this, SLOT(slotSetWidth())); actionSetInnerAlpha = new QAction(tr("&Set Inner Alpha"),this); + actionSetInnerAlpha->setShortcut(QKeySequence(Qt::ALT + Qt::Key_A)); connect(actionSetInnerAlpha, SIGNAL(triggered()), this, SLOT(slotSetInnerAlpha())); } @@ -664,7 +683,6 @@ void IntelliPhotoGui::createGui(){ ActiveLayerImageButton->setFixedSize(Buttonsize); ActiveLayerImageButton->setIcon(preview); ActiveLayerImageButton->setIconSize(Buttonsize); - ActiveLayerImageButton->setEnabled(false); // set gui elements

    Go to the source code of this file.