diff --git a/GUI/coregui/CMakeLists.txt b/GUI/coregui/CMakeLists.txt index 4dbc223dd345ad40afc727404e6d20fea9a4df1b..80bbab772c89f775d5b80039c168a5adc15882ea 100644 --- a/GUI/coregui/CMakeLists.txt +++ b/GUI/coregui/CMakeLists.txt @@ -33,6 +33,7 @@ set(include_dirs ${CMAKE_CURRENT_SOURCE_DIR}/Views/SimulationWidgets ${CMAKE_CURRENT_SOURCE_DIR}/Views/FitWidgets ${CMAKE_CURRENT_SOURCE_DIR}/Views/PropertyEditor + ${CMAKE_CURRENT_SOURCE_DIR}/Views/MaskWidgets ) include_directories(${include_dirs}) @@ -50,6 +51,7 @@ file(GLOB source_files "Views/SimulationWidgets/*.cpp" "Views/FitWidgets/*.cpp" "Views/PropertyEditor/*.cpp" + "Views/MaskWidgets/*.cpp" ) set(source_widgetbox @@ -74,6 +76,7 @@ file(GLOB include_files "Views/SimulationWidgets/*.h" "Views/FitWidgets/*.h" "Views/PropertyEditor/*.h" + "Views/MaskWidgets/*.h" ) set(include_widgetbox diff --git a/GUI/coregui/Models/EllipseItem.cpp b/GUI/coregui/Models/EllipseItem.cpp new file mode 100644 index 0000000000000000000000000000000000000000..52cf52762b21ffba305c9cec462be8545b9955f7 --- /dev/null +++ b/GUI/coregui/Models/EllipseItem.cpp @@ -0,0 +1,21 @@ +#include "EllipseItem.h" + +const QString EllipseItem::P_POSX = "X position"; +const QString EllipseItem::P_POSY = "Y position"; +const QString EllipseItem::P_WIDTH = "Width"; +const QString EllipseItem::P_HEIGHT = "Height"; +const QString EllipseItem::P_COLOR = "Color"; +const QString EllipseItem::P_ANGLE = "Angle"; + +EllipseItem::EllipseItem(ParameterizedItem *parent) + : ParameterizedItem(Constants::EllipseType, parent) +{ + setItemName(Constants::EllipseType); + registerProperty(P_POSX, 0.0); + registerProperty(P_POSY, 0.0); + registerProperty(P_WIDTH, 0.0); + registerProperty(P_HEIGHT, 0.0); + registerProperty(P_COLOR, 0); + registerProperty(P_ANGLE, 0.0); +} + diff --git a/GUI/coregui/Models/EllipseItem.h b/GUI/coregui/Models/EllipseItem.h new file mode 100644 index 0000000000000000000000000000000000000000..652fe90daa761fa769367a6191e6bdfdd74e64e3 --- /dev/null +++ b/GUI/coregui/Models/EllipseItem.h @@ -0,0 +1,22 @@ +#ifndef ELLIPSEITEM_H +#define ELLIPSEITEM_H + +#include "ParameterizedItem.h" + +class EllipseItem : public ParameterizedItem +{ + Q_OBJECT + +public: + static const QString P_POSX; + static const QString P_POSY; + static const QString P_WIDTH; + static const QString P_HEIGHT; + static const QString P_COLOR; + static const QString P_ANGLE; + + explicit EllipseItem(ParameterizedItem *parent=0); + ~EllipseItem(){} +}; + +#endif diff --git a/GUI/coregui/Models/ItemFactory.cpp b/GUI/coregui/Models/ItemFactory.cpp index 0e1ea1ee77c21a6afdadac3f84288596e988d641..3ec97d55134c66b7b6a670d7a08fd4dc57d8e632 100644 --- a/GUI/coregui/Models/ItemFactory.cpp +++ b/GUI/coregui/Models/ItemFactory.cpp @@ -45,6 +45,10 @@ #include "BeamDistributionItem.h" #include "BeamWavelengthItem.h" #include "BeamAngleItems.h" +#include "RectangleItem.h" +#include "EllipseItem.h" +#include "PolygonItem.h" +#include "PointItem.h" #include <QDebug> namespace { @@ -147,6 +151,11 @@ ItemFactory::ItemMap_t initializeItemMap() { result[Constants::ResolutionFunctionNoneType] = &createInstance<ResolutionFunctionNoneItem>; result[Constants::ResolutionFunction2DGaussianType] = &createInstance<ResolutionFunction2DGaussianItem>; + result[Constants::RectangleType] = &createInstance<RectangleItem>; + result[Constants::EllipseType] = &createInstance<EllipseItem>; + result[Constants::PolygonType] = &createInstance<PolygonItem>; + result[Constants::PointType] = &createInstance<PointItem>; + return result; } } @@ -180,7 +189,7 @@ ParameterizedItem *ItemFactory::createItem(const QString &model_name, if(parent) { parent->insertChildItem(-1, result); } - + qDebug() << " result:" << result; return result; } diff --git a/GUI/coregui/Models/MaskModel.cpp b/GUI/coregui/Models/MaskModel.cpp new file mode 100644 index 0000000000000000000000000000000000000000..981a428bbc86086b5399a970aab80fe1e738569c --- /dev/null +++ b/GUI/coregui/Models/MaskModel.cpp @@ -0,0 +1,7 @@ +#include "MaskModel.h" + +MaskModel::MaskModel(QObject *parent) + : SessionModel(SessionXML::MaskModelTag, parent) +{ + +} diff --git a/GUI/coregui/Models/MaskModel.h b/GUI/coregui/Models/MaskModel.h new file mode 100644 index 0000000000000000000000000000000000000000..930cdb85f50777d16c255ccf0d244ad0b9259402 --- /dev/null +++ b/GUI/coregui/Models/MaskModel.h @@ -0,0 +1,16 @@ +#ifndef MASKMODEL_H +#define MASKMODEL_H + +#include "SessionModel.h" + +class BA_CORE_API_ MaskModel : public SessionModel +{ + Q_OBJECT + +public: + explicit MaskModel(QObject *parent = 0); + ~MaskModel(){} + +}; + +#endif diff --git a/GUI/coregui/Models/PointItem.cpp b/GUI/coregui/Models/PointItem.cpp new file mode 100644 index 0000000000000000000000000000000000000000..d850484bd9664779b0165c9913252d678b8871b2 --- /dev/null +++ b/GUI/coregui/Models/PointItem.cpp @@ -0,0 +1,32 @@ +#include "PointItem.h" + +const QString PointItem::P_POSX = "X position"; +const QString PointItem::P_POSY = "Y positon"; + +PointItem::PointItem(ParameterizedItem *parent) + : ParameterizedItem(Constants::PointType, parent) +{ + setItemName(Constants::PointType); + registerProperty(P_POSX, 0.0); + registerProperty(P_POSY, 0.0); +} + +qreal PointItem::getXPos() +{ + return getRegisteredProperty(P_POSX).toReal(); +} + +qreal PointItem::getYPos() +{ + return getRegisteredProperty(P_POSY).toReal(); +} + +void PointItem::setXPos(qreal xPos) +{ + setRegisteredProperty(P_POSX, xPos); +} + +void PointItem::setYPos(qreal yPos) +{ + setRegisteredProperty(P_POSY, yPos); +} diff --git a/GUI/coregui/Models/PointItem.h b/GUI/coregui/Models/PointItem.h new file mode 100644 index 0000000000000000000000000000000000000000..43fa03134c6030cc5e6a01ba36d6e133eac4a529 --- /dev/null +++ b/GUI/coregui/Models/PointItem.h @@ -0,0 +1,25 @@ +#ifndef POINTITEM_H +#define POINTITEM_H + +#include "ParameterizedItem.h" + +class PointItem : public ParameterizedItem +{ + Q_OBJECT + +public: + static const QString P_POSX; + static const QString P_POSY; + + explicit PointItem(ParameterizedItem *parent = 0); + ~PointItem() + { + } + + qreal getXPos(); + qreal getYPos(); + void setXPos(qreal xPos); + void setYPos(qreal yPos); +}; + +#endif diff --git a/GUI/coregui/Models/PolygonItem.cpp b/GUI/coregui/Models/PolygonItem.cpp new file mode 100644 index 0000000000000000000000000000000000000000..b8b4aaa8ef114311b0b4e3928c0f869a0fa2b478 --- /dev/null +++ b/GUI/coregui/Models/PolygonItem.cpp @@ -0,0 +1,14 @@ +#include "PolygonItem.h" + +const QString PolygonItem::P_COLOR = "Color"; +const QString PolygonItem::P_DRAWINGMODE = "Drawing Mode"; + +PolygonItem::PolygonItem(ParameterizedItem *parent) + : ParameterizedItem(Constants::PolygonType, parent) +{ + setItemName(Constants::PolygonType); + registerProperty(P_COLOR, 0); + registerProperty(P_DRAWINGMODE, false); + + addToValidChildren(Constants::PointType); +} diff --git a/GUI/coregui/Models/PolygonItem.h b/GUI/coregui/Models/PolygonItem.h new file mode 100644 index 0000000000000000000000000000000000000000..9bdb4216321481cd5d3562758556bc302cb62d86 --- /dev/null +++ b/GUI/coregui/Models/PolygonItem.h @@ -0,0 +1,18 @@ +#ifndef POLYGONITEM_H +#define POLYGONITEM_H + +#include "ParameterizedItem.h" + +class PolygonItem : public ParameterizedItem +{ + Q_OBJECT + +public: + static const QString P_COLOR; + static const QString P_DRAWINGMODE; + + explicit PolygonItem(ParameterizedItem *parent=0); + ~PolygonItem(){} +}; + +#endif diff --git a/GUI/coregui/Models/RectangleItem.cpp b/GUI/coregui/Models/RectangleItem.cpp new file mode 100644 index 0000000000000000000000000000000000000000..6a5d9706336b69bbfc6ea5a7fe99c9ddd1d59bc3 --- /dev/null +++ b/GUI/coregui/Models/RectangleItem.cpp @@ -0,0 +1,20 @@ +#include "RectangleItem.h" + +const QString RectangleItem::P_POSX = "X position"; +const QString RectangleItem::P_POSY = "Y position"; +const QString RectangleItem::P_WIDTH = "Width"; +const QString RectangleItem::P_HEIGHT = "Height"; +const QString RectangleItem::P_COLOR = "Color"; +const QString RectangleItem::P_ANGLE = "Angle"; + +RectangleItem::RectangleItem(ParameterizedItem *parent) + : ParameterizedItem(Constants::RectangleType, parent) +{ + setItemName(Constants::RectangleType); + registerProperty(P_POSX, 0.0); + registerProperty(P_POSY, 0.0); + registerProperty(P_WIDTH, 0.0); + registerProperty(P_HEIGHT, 0.0); + registerProperty(P_COLOR, 0); + registerProperty(P_ANGLE, 0.0); +} diff --git a/GUI/coregui/Models/RectangleItem.h b/GUI/coregui/Models/RectangleItem.h new file mode 100644 index 0000000000000000000000000000000000000000..55bea55c6a71de07740eed1df3c91d96d5801568 --- /dev/null +++ b/GUI/coregui/Models/RectangleItem.h @@ -0,0 +1,22 @@ +#ifndef RECTANGLEITEM_H +#define RECTANGLEITEM_H + +#include "ParameterizedItem.h" + +class RectangleItem : public ParameterizedItem +{ + Q_OBJECT + +public: + static const QString P_POSX; + static const QString P_POSY; + static const QString P_WIDTH; + static const QString P_HEIGHT; + static const QString P_COLOR; + static const QString P_ANGLE; + + explicit RectangleItem(ParameterizedItem *parent=0); + ~RectangleItem(){} +}; + +#endif diff --git a/GUI/coregui/Models/SessionModel.h b/GUI/coregui/Models/SessionModel.h index 6d093a6534e3170631b511b2ad9c70092617e619..20b9386f301ade721fc2589f047f8a1e7f7ad615 100644 --- a/GUI/coregui/Models/SessionModel.h +++ b/GUI/coregui/Models/SessionModel.h @@ -31,6 +31,7 @@ const QString SampleModelTag("SampleModel"); const QString MaterialModelTag("MaterialModel"); const QString FitModelTag("FitModel"); const QString JobModelTag("JobModel"); +const QString MaskModelTag("MaskModel"); const QString ModelNameAttribute("Name"); const QString ItemTag("Item"); diff --git a/GUI/coregui/Models/item_constants.h b/GUI/coregui/Models/item_constants.h index 11b01f4d51f7d823ca5743c52db0b692d97f1b37..03320f99eebbe4a60f49e58fa687b8da8bfc864a 100644 --- a/GUI/coregui/Models/item_constants.h +++ b/GUI/coregui/Models/item_constants.h @@ -120,6 +120,11 @@ const ModelType BeamInclinationAngleType = "BeamInclinationAngle"; const ModelType ResolutionFunctionNoneType = "ResolutionFunctionNone"; const ModelType ResolutionFunction2DGaussianType = "ResolutionFunction2DGaussian"; +const ModelType RectangleType = "Rectangle"; +const ModelType EllipseType = "Ellipse"; +const ModelType PolygonType = "Polygon"; +const ModelType PointType = "Point"; + // --- Groups ------------------------------------------------------------------ const ModelType FormFactorGroup = "Form Factor"; diff --git a/GUI/coregui/Views/InfoWidgets/DistributionEditor.cpp b/GUI/coregui/Views/InfoWidgets/DistributionEditor.cpp index bd82187f45d09c01a136a1edd06b88971f8e69d5..e8aabe8c014abc78983f98efbcf0af3e42b8075d 100644 --- a/GUI/coregui/Views/InfoWidgets/DistributionEditor.cpp +++ b/GUI/coregui/Views/InfoWidgets/DistributionEditor.cpp @@ -95,3 +95,4 @@ void DistributionEditor::setNameOfEditor(QString name) m_box->setTitle(name); m_plotwidget->setXAxisName(name); } + diff --git a/GUI/coregui/Views/InfoWidgets/DistributionEditor.h b/GUI/coregui/Views/InfoWidgets/DistributionEditor.h index 54d113bd40748024609600335fdd430bf2c93860..e7aeffa6e0d49c47f3afb348822c2ed10bfc2c29 100644 --- a/GUI/coregui/Views/InfoWidgets/DistributionEditor.h +++ b/GUI/coregui/Views/InfoWidgets/DistributionEditor.h @@ -17,6 +17,7 @@ #define DISTRIBUTIONEDITOR_H #include <QWidget> +#include "qcustomplot.h" class QGroupBox; class DistributionWidget; diff --git a/GUI/coregui/Views/InfoWidgets/DistributionWidget.cpp b/GUI/coregui/Views/InfoWidgets/DistributionWidget.cpp index 034b6f6e6493ee37cf18171ef65b8587e48cb5a5..c222cb0373f14d49975f1fb0a27eceabd0d06575 100644 --- a/GUI/coregui/Views/InfoWidgets/DistributionWidget.cpp +++ b/GUI/coregui/Views/InfoWidgets/DistributionWidget.cpp @@ -61,6 +61,8 @@ DistributionWidget::DistributionWidget(QWidget *parent) setStyleSheet("background-color:white;"); connect(m_plot, SIGNAL(mousePress(QMouseEvent *)), this, SLOT(onMousePress(QMouseEvent *))); + connect(m_plot, SIGNAL(mouseRelease(QMouseEvent*)), this, SLOT(onMouseRelease(QMouseEvent*))); + connect(m_plot, SIGNAL(mouseRelease(QMouseEvent*)), this, SLOT(onMouseRelease(QMouseEvent*))); } void DistributionWidget::setItem(DistributionItem *item) @@ -253,6 +255,7 @@ void DistributionWidget::onMousePress(QMouseEvent *event) menu.exec(point); } } + void DistributionWidget::resetView() { m_plot->xAxis->setRange(*m_xRange); @@ -283,3 +286,4 @@ void DistributionWidget::resizeEvent(QResizeEvent *event) m_warningSign->setPosition(pos.x(), pos.y()); } } + diff --git a/GUI/coregui/Views/InfoWidgets/DistributionWidget.h b/GUI/coregui/Views/InfoWidgets/DistributionWidget.h index e40e364e57c2745cd0f623e77668393fb3edb4f8..80ff1f54b72b18cbaefe5bc85a42012c0d5f8c12 100644 --- a/GUI/coregui/Views/InfoWidgets/DistributionWidget.h +++ b/GUI/coregui/Views/InfoWidgets/DistributionWidget.h @@ -18,6 +18,7 @@ #include <QWidget> #include "WarningSignWidget.h" +#include "qcustomplot.h" class ParameterizedItem; class AwesomePropertyEditor; @@ -34,7 +35,9 @@ class DistributionWidget : public QWidget public: DistributionWidget(QWidget *parent = 0); - virtual ~DistributionWidget() {} + virtual ~DistributionWidget() + { + } void setItem(DistributionItem *item); void plotItem(); double getWidthOfBars(double min, double max, int samples); @@ -42,7 +45,6 @@ public: int getMaxYPosition(int y); void setXAxisName(QString xAxisName); QPoint getPositionForWarningSign(); - QString generateCodeSnippet(); public slots: void onMouseMove(QMouseEvent *event); @@ -51,7 +53,7 @@ public slots: protected: void resizeEvent(QResizeEvent *event); private slots: - void onPropertyChanged(); + void onPropertyChanged(); void resetView(); private: diff --git a/GUI/coregui/Views/MaskToolBar.cpp b/GUI/coregui/Views/MaskToolBar.cpp new file mode 100644 index 0000000000000000000000000000000000000000..43dea403ceeb404500d25133c407d3621d8f0338 --- /dev/null +++ b/GUI/coregui/Views/MaskToolBar.cpp @@ -0,0 +1,157 @@ +#include "MaskToolBar.h" +#include <QToolBar> +#include <QToolButton> +#include <QVBoxLayout> +#include <QFrame> +#include <QSplitter> +#include <QListView> +#include <QButtonGroup> +#include <QDebug> + + + +MaskToolBar::MaskToolBar(QWidget *parent) +{ + this->setParent(parent); + this->setIconSize(QSize(25,25)); + + + // selection mode + m_selectionButton = new QToolButton(this); + m_selectionButton->setIcon(QIcon(":/images/mouseCursor.png")); + m_selectionButton->setCheckable(true); + m_selectionButton->setToolTip(QString("Selection Mode")); + connect(m_selectionButton, SIGNAL(pressed()), this, SLOT(onChangeToSelectionMode())); + + // pan mode + m_panButton = new QToolButton(this); + m_panButton->setIcon(QIcon(":/SampleDesigner/images/toolbar_hand.png")); + m_panButton->setCheckable(true); + m_panButton->setToolTip(QString("Pan Mode")); + connect(m_panButton, SIGNAL(toggled(bool)), this, SLOT(onPanMode(bool))); + + // rectangle + m_rectangleButton = new QToolButton(this); + m_rectangleButton->setIcon(QIcon(":/images/rectangle.png")); + m_rectangleButton->setCheckable(true); + m_rectangleButton->setToolTip(QString("Create rectangles and squares")); + connect(m_rectangleButton, SIGNAL(pressed()), this, SLOT(onRectangleButtonPressed())); + + // ellipse + m_ellipseButton = new QToolButton(this); + m_ellipseButton->setCheckable(true); + m_ellipseButton->setToolTip(QString("Create ellipses and circles")); + m_ellipseButton->setIcon(QIcon(":/images/ellipse.png")); + connect(m_ellipseButton, SIGNAL(pressed()), this, SLOT(onEllipseButtonPressed())); + + // polygon + + m_polygonButton = new QToolButton(this); + m_polygonButton->setCheckable(true); + m_polygonButton->setToolTip(QString("Create Polygons")); + m_polygonButton->setIcon(QIcon(":/images/polygon.png")); + connect(m_polygonButton, SIGNAL(pressed()), this, SLOT(onPolygonButtonPressed())); + + // bring to front + m_bringToFrontButton = new QToolButton(this); + m_bringToFrontButton->setToolTip(QString("Bring selected item to the front")); + m_bringToFrontButton->setIcon(QIcon(":/images/bringToFront.png")); + connect(m_bringToFrontButton, SIGNAL(clicked()), this, SLOT(onBringToFrontClicked())); + + // send to back + m_sendToBackButton = new QToolButton(this); + m_sendToBackButton->setToolTip(QString("Send selected item to the back")); + m_sendToBackButton->setIcon(QIcon(":/images/sendToBack.png")); + connect(m_sendToBackButton, SIGNAL(clicked()), this, SLOT(onSendToBackClicked())); + + // include + m_includeButton = new QToolButton(this); + m_includeButton->setCheckable(true); + m_includeButton->setToolTip(QString("Including area")); + m_includeButton->setIcon(QIcon(":/images/include.png")); + connect(m_includeButton, SIGNAL(clicked()), this, SLOT(onIncludeClicked())); + + // exclude + m_excludeButton = new QToolButton(this); + m_excludeButton->setCheckable(true); + m_excludeButton->setToolTip(QString("Excluding area")); + m_excludeButton->setIcon(QIcon(":/images/exclude.png")); + connect(m_excludeButton, SIGNAL(clicked()), this, SLOT(onExcludeClicked())); + + QButtonGroup *drawingGroup = new QButtonGroup(this); + drawingGroup->addButton(m_rectangleButton); + drawingGroup->addButton(m_ellipseButton); + drawingGroup->addButton(m_polygonButton); + drawingGroup->addButton(m_panButton); + drawingGroup->addButton(m_selectionButton); + + QButtonGroup *ColorGroup = new QButtonGroup(this); + ColorGroup->addButton(m_includeButton); + ColorGroup->addButton(m_excludeButton); + + + this->addWidget(m_selectionButton); + this->addWidget(m_panButton); + this->addSeparator(); + this->addWidget(m_rectangleButton); + this->addWidget(m_ellipseButton); + this->addWidget(m_polygonButton); + this->addSeparator(); + this->addWidget(m_includeButton); + this->addWidget(m_excludeButton); + this->addSeparator(); + this->addWidget(m_bringToFrontButton); + this->addWidget(m_sendToBackButton); + + +} + +void MaskToolBar::onChangeToSelectionMode() +{ + emit changeToSelectionMode(); +} + +void MaskToolBar::selectSelectionMode() +{ + m_selectionButton->click(); +} + +void MaskToolBar::onPanMode(bool isActive) +{ + emit panMode(isActive); +} + +void MaskToolBar::onRectangleButtonPressed() +{ + emit rectangleButtonPressed(); +} + +void MaskToolBar::onEllipseButtonPressed() +{ + emit ellipseButtonPressed(); +} + +void MaskToolBar::onPolygonButtonPressed() +{ + emit polygonButtonPressed(); +} + +void MaskToolBar::onBringToFrontClicked() +{ + emit bringToFrontClicked(); +} + +void MaskToolBar::onSendToBackClicked() +{ + emit sendToBackClicked(); +} + +void MaskToolBar::onIncludeClicked() +{ + emit includeClicked(); +} + +void MaskToolBar::onExcludeClicked() +{ + emit excludeClicked(); +} diff --git a/GUI/coregui/Views/MaskToolBar.h b/GUI/coregui/Views/MaskToolBar.h new file mode 100644 index 0000000000000000000000000000000000000000..2d2029fac8b4bd4edb2ebd841c6db8a944f6e4c4 --- /dev/null +++ b/GUI/coregui/Views/MaskToolBar.h @@ -0,0 +1,88 @@ +#ifndef MASKTOOLBAR_H +#define MASKTOOLBAR_H + +#include <QToolBar> +class QToolButton; + +class MaskToolBar : public QToolBar +{ + Q_OBJECT +public: + MaskToolBar(QWidget *parent = 0); + virtual ~MaskToolBar() + { + } + +signals: + //! signal is emitted when rectangle button pressed + void rectangleButtonPressed(); + + //! signal is emitted when ellipse button pressed + void ellipseButtonPressed(); + + //! signal is emitted when polygon button pressed + void polygonButtonPressed(); + + //! signal is emitted when selection button pressed + void changeToSelectionMode(); + + //! signal is emitted when pan button pressed + void panMode(bool); + + //! signal is emitted when bring to front button pressed + void bringToFrontClicked(); + + //! signal is emitted when send to back button pressed + void sendToBackClicked(); + + //! signal is emitted when include button pressed + void includeClicked(); + + //! signal is emitted when exclude button pressed + void excludeClicked(); + +private slots: + //! emits signal when rectangle button pressed + void onRectangleButtonPressed(); + + //! emits signal when selection button pressed + void onChangeToSelectionMode(); + + //! from scene if item is drawn + //! This works if emit isDrawn is uncommented in MaskGraphicsScene + void selectSelectionMode(); + + //! emits signal when pan button pressed + void onPanMode(bool isActive); + + //! emits signal when ellipse button pressed + void onEllipseButtonPressed(); + + //! emits signal when polygon button pressed + void onPolygonButtonPressed(); + + //! emits signal when bring to front button pressed + void onBringToFrontClicked(); + + //! emits signal when send to back button pressed + void onSendToBackClicked(); + + //! emits signal when include button pressed + void onIncludeClicked(); + + //! emits signal when exclude button pressed + void onExcludeClicked(); + +private: + QToolButton *m_selectionButton; //!< selection button + QToolButton *m_panButton; //!<pan button + QToolButton *m_rectangleButton; //!< rectangle button + QToolButton *m_ellipseButton; //!< ellipse button + QToolButton *m_polygonButton; //!< polygon button + QToolButton *m_bringToFrontButton; //!< bring to front button + QToolButton *m_sendToBackButton; //!< send to back button + QToolButton *m_includeButton; //!< include button + QToolButton *m_excludeButton; //!< exclude button +}; + +#endif diff --git a/GUI/coregui/Views/MaskWidgets/EllipseView.cpp b/GUI/coregui/Views/MaskWidgets/EllipseView.cpp new file mode 100644 index 0000000000000000000000000000000000000000..087d42e0819e2b3bed2f09c8bd944b473352cc5b --- /dev/null +++ b/GUI/coregui/Views/MaskWidgets/EllipseView.cpp @@ -0,0 +1,394 @@ +#include "EllipseView.h" +#include "EllipseItem.h" +#include "ParameterizedItem.h" +#include "RotationArrow.h" +#include "ResizeArrow.h" +#include <cmath> +#include <QPainter> +#include <QGraphicsSceneMouseEvent> +#include <QCursor> +#include <QDebug> + +static const qreal widthAndHeight = 5; +static const qreal OffsetPosition = 2.5; + +EllipseView::EllipseView() : m_diagonalOpposedPoint(new QPointF) +{ + setFlag(QGraphicsItem::ItemIsSelectable); + setFlag(QGraphicsItem::ItemIsMovable); + setAcceptHoverEvents(true); + connect(this, SIGNAL(xChanged()), this, SLOT(onChangedX())); + connect(this, SIGNAL(yChanged()), this, SLOT(onChangedY())); +} + +void EllipseView::paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *) +{ + + // paint ellipse + painter->setRenderHints(QPainter::Antialiasing); + this->prepareGeometryChange(); + + QBrush brush; + brush.setStyle(Qt::SolidPattern); + if (m_item->getRegisteredProperty(EllipseItem::P_COLOR).toBool() == 0) { + brush.setColor(DesignerHelper::getDefaultColor("Transparant red")); + painter->setPen(brush.color().darker()); + painter->setBrush(brush); + painter->drawEllipse(m_item->getRegisteredProperty(EllipseItem::P_POSX).toReal(), + m_item->getRegisteredProperty(EllipseItem::P_POSY).toReal(), + m_item->getRegisteredProperty(EllipseItem::P_WIDTH).toReal(), + m_item->getRegisteredProperty(EllipseItem::P_HEIGHT).toReal()); + } else { + brush.setColor(DesignerHelper::getDefaultColor("Transparant blue")); + painter->setPen(brush.color().darker()); + painter->setBrush(brush); + painter->drawEllipse(m_item->getRegisteredProperty(EllipseItem::P_POSX).toReal(), + m_item->getRegisteredProperty(EllipseItem::P_POSY).toReal(), + m_item->getRegisteredProperty(EllipseItem::P_WIDTH).toReal(), + m_item->getRegisteredProperty(EllipseItem::P_HEIGHT).toReal()); + } + + // paint rectangles on corners if this item is selected + if (this->isSelected()) { + painter->setBrush(painter->pen().color()); + painter->drawRect(getTopLeftCorner()); + painter->drawRect(getBottomLeftCorner()); + painter->drawRect(getTopRightCorner()); + painter->drawRect(getBottomRightCorner()); + } + updateArrows(); +} + +QRectF EllipseView::boundingRect() const +{ + return QRectF(m_item->getRegisteredProperty(EllipseItem::P_POSX).toReal() - 5, + m_item->getRegisteredProperty(EllipseItem::P_POSY).toReal() - 5, + m_item->getRegisteredProperty(EllipseItem::P_WIDTH).toReal() + 10, + m_item->getRegisteredProperty(EllipseItem::P_HEIGHT).toReal() + 10); +} + +void EllipseView::setDiagonalOpposedPoint() +{ + if (m_corner == TOPLEFT) { + m_diagonalOpposedPoint->setX(getBottomRightCorner().x()); + m_diagonalOpposedPoint->setY(getBottomRightCorner().x()); + } else if (m_corner == TOPRIGHT) { + m_diagonalOpposedPoint->setX(getBottomLeftCorner().x()); + m_diagonalOpposedPoint->setY(getBottomLeftCorner().y()); + } else if (m_corner == BOTTOMLEFT) { + m_diagonalOpposedPoint->setX(getTopRightCorner().x()); + m_diagonalOpposedPoint->setY(getTopRightCorner().y()); + } else if (m_corner == BOTTOMRIGHT) { + m_diagonalOpposedPoint->setX(getTopLeftCorner().x()); + m_diagonalOpposedPoint->setY(getTopLeftCorner().y()); + } +} + +void EllipseView::calculateResize(QGraphicsSceneMouseEvent *event) +{ + qreal xmin = std::min(event->pos().x(),m_diagonalOpposedPoint->x()); + qreal xmax = std::max(event->pos().x(),m_diagonalOpposedPoint->x()); + qreal ymin = std::min(event->pos().y(),m_diagonalOpposedPoint->y()); + qreal ymax = std::max(event->pos().y(),m_diagonalOpposedPoint->y()); + + m_item->setRegisteredProperty(EllipseItem::P_WIDTH, xmax - xmin); + m_item->setRegisteredProperty(EllipseItem::P_HEIGHT, ymax - ymin); + + m_item->setRegisteredProperty(EllipseItem::P_POSX, xmin); + m_item->setRegisteredProperty(EllipseItem::P_POSY, ymin); +} + +qreal EllipseView::getRotationAngle(QGraphicsSceneMouseEvent *event) +{ + QPointF middlePoint + = mapToScene(m_item->getRegisteredProperty(EllipseItem::P_POSX).toReal() + + m_item->getRegisteredProperty(EllipseItem::P_WIDTH).toReal() / 2, + m_item->getRegisteredProperty(EllipseItem::P_POSY).toReal() + + m_item->getRegisteredProperty(EllipseItem::P_HEIGHT).toReal() / 2); + qreal lengthOfHypotenuse + = sqrt(pow(m_item->getRegisteredProperty(EllipseItem::P_WIDTH).toReal() / 2, 2) + + pow(m_item->getRegisteredProperty(EllipseItem::P_HEIGHT).toReal() / 2, 2)); + qreal offsetAngle = acos((m_item->getRegisteredProperty(EllipseItem::P_WIDTH).toReal() / 2) + / lengthOfHypotenuse) * 180 / M_PI; + qreal radians = atan((event->scenePos().y() - middlePoint.y()) + / (event->scenePos().x() - middlePoint.x())); + + if (m_corner == TOPLEFT) { + m_item->setRegisteredProperty(EllipseItem::P_ANGLE, radians * 180 / M_PI - offsetAngle); + return radians * 180 / M_PI - offsetAngle; + + } else if (m_corner == TOPRIGHT) { + m_item->setRegisteredProperty(EllipseItem::P_ANGLE, radians * 180 / M_PI + offsetAngle - 180); + return radians * 180 / M_PI + offsetAngle - 180; + + } else if (m_corner == BOTTOMLEFT) { + m_item->setRegisteredProperty(EllipseItem::P_ANGLE, radians * 180 / M_PI + offsetAngle - 180); + return radians * 180 / M_PI + offsetAngle - 180; + + } else if (m_corner == BOTTOMRIGHT) { + m_item->setRegisteredProperty(EllipseItem::P_ANGLE, radians * 180 / M_PI - offsetAngle); + return radians * 180 / M_PI - offsetAngle; + } + return 0.0; +} + +void EllipseView::mousePressEvent(QGraphicsSceneMouseEvent *event) +{ + this->setFlag(QGraphicsItem::ItemIsMovable, false); + + if (event->button() == Qt::LeftButton) { + setSelectedCorner(event->pos()); + + if (m_corner == NONE) { + this->setFlag(QGraphicsItem::ItemIsMovable, true); + QGraphicsItem::mousePressEvent(event); + } + else { + setDiagonalOpposedPoint(); + } + } +} + +void EllipseView::mouseMoveEvent(QGraphicsSceneMouseEvent *event) +{ + if(m_corner == NONE) { + m_block_mode = true; + } + + // check which mode is active and process with the active mode + if (m_mode == RESIZE && m_corner != NONE) { + calculateResize(event); + } else if (m_corner != NONE && m_mode == ROTATION) { + QTransform transform; + transform.translate(m_item->getRegisteredProperty(EllipseItem::P_POSX).toReal() + + m_item->getRegisteredProperty(EllipseItem::P_WIDTH).toReal() * 0.5, + m_item->getRegisteredProperty(EllipseItem::P_POSY).toReal() + + m_item->getRegisteredProperty(EllipseItem::P_HEIGHT).toReal() * 0.5); + transform.rotate(getRotationAngle(event)); + transform.translate(-(m_item->getRegisteredProperty(EllipseItem::P_POSX).toReal() + + m_item->getRegisteredProperty(EllipseItem::P_WIDTH).toReal() * 0.5), + -(m_item->getRegisteredProperty(EllipseItem::P_POSY).toReal() + + m_item->getRegisteredProperty(EllipseItem::P_HEIGHT).toReal() * 0.5)); + setTransform(transform); +// process as usual + } else { + this->setFlag(QGraphicsItem::ItemIsMovable, true); + QGraphicsItem::mouseMoveEvent(event); + } +} + +void EllipseView::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) +{ + if(!m_block_mode) { + if ((m_mode == RESIZE)) { + m_mode = ROTATION; + } else if ((m_mode == ROTATION)) { + m_mode = RESIZE; + } + } + m_block_mode = false; + m_corner = NONE; + setCursor(Qt::ArrowCursor); + QGraphicsItem::mouseReleaseEvent(event); +} + +void EllipseView::hoverMoveEvent(QGraphicsSceneHoverEvent *event) +{ + setSelectedCorner(event->pos()); + m_corner = NONE; +} + +void EllipseView::setInclude() +{ + m_item->setRegisteredProperty(EllipseItem::P_COLOR, 0); +} + +void EllipseView::setExclude() +{ + m_item->setRegisteredProperty(EllipseItem::P_COLOR, 1); +} + +QRectF EllipseView::getTopLeftCorner() +{ + return QRectF(m_item->getRegisteredProperty(EllipseItem::P_POSX).toReal() - OffsetPosition, + m_item->getRegisteredProperty(EllipseItem::P_POSY).toReal() - OffsetPosition, + widthAndHeight, widthAndHeight); +} + +QRectF EllipseView::getTopRightCorner() +{ + return QRectF(m_item->getRegisteredProperty(EllipseItem::P_POSX).toReal() + + m_item->getRegisteredProperty(EllipseItem::P_WIDTH).toReal() - OffsetPosition, + m_item->getRegisteredProperty(EllipseItem::P_POSY).toReal() - OffsetPosition, + widthAndHeight, widthAndHeight); +} + +QRectF EllipseView::getBottomLeftCorner() +{ + return QRectF(m_item->getRegisteredProperty(EllipseItem::P_POSX).toReal() - OffsetPosition, + m_item->getRegisteredProperty(EllipseItem::P_POSY).toReal() + + m_item->getRegisteredProperty(EllipseItem::P_HEIGHT).toReal() - OffsetPosition, + widthAndHeight, widthAndHeight); +} + +QRectF EllipseView::getBottomRightCorner() +{ + return QRectF(m_item->getRegisteredProperty(EllipseItem::P_POSX).toReal() + + m_item->getRegisteredProperty(EllipseItem::P_WIDTH).toReal() - OffsetPosition, + m_item->getRegisteredProperty(EllipseItem::P_POSY).toReal() + + m_item->getRegisteredProperty(EllipseItem::P_HEIGHT).toReal() - OffsetPosition, + widthAndHeight, widthAndHeight); +} + +void EllipseView::setParameterizedItem(ParameterizedItem *item) +{ + m_item = item; + setRotation(m_item->getRegisteredProperty(EllipseItem::P_ANGLE).toReal()); + connect(m_item, SIGNAL(propertyChanged(const QString &)), this, + SLOT(onPropertyChange(const QString &))); + initializeArrows(); +} + +void EllipseView::onChangedX() +{ + m_block_mode = true; +} + +void EllipseView::onChangedY() +{ + m_block_mode = true; +} + +void EllipseView::onPropertyChange(const QString &propertyName) +{ + if(propertyName == EllipseItem::P_POSX) { + m_block_mode = true; + } + else if(propertyName == EllipseItem::P_POSY) { + m_block_mode = true; + } + else if(propertyName == EllipseItem::P_ANGLE) { + QTransform transform; + transform.translate(m_item->getRegisteredProperty(EllipseItem::P_POSX).toReal() + + m_item->getRegisteredProperty(EllipseItem::P_WIDTH).toReal() * 0.5, + m_item->getRegisteredProperty(EllipseItem::P_POSY).toReal() + + m_item->getRegisteredProperty(EllipseItem::P_HEIGHT).toReal() * 0.5); + transform.rotate(m_item->getRegisteredProperty(EllipseItem::P_ANGLE).toReal()); + transform.translate(-(m_item->getRegisteredProperty(EllipseItem::P_POSX).toReal() + + m_item->getRegisteredProperty(EllipseItem::P_WIDTH).toReal() * 0.5), + -(m_item->getRegisteredProperty(EllipseItem::P_POSY).toReal() + + m_item->getRegisteredProperty(EllipseItem::P_HEIGHT).toReal() * 0.5)); + setTransform(transform); + } + +} + +ParameterizedItem *EllipseView::getParameterizedItem() +{ + return m_item; +} + +void EllipseView::setSelectedCorner(QPointF currentMousePosition) +{ + if (getTopLeftCorner().contains(currentMousePosition)) { + qDebug() << "TOPLEFT"; + m_corner = TOPLEFT; + if(m_mode == RESIZE) + setCursor(Qt::SizeFDiagCursor); + } else if (getTopRightCorner().contains(currentMousePosition)) { + qDebug() << "TOPRIGHT"; + m_corner = TOPRIGHT; + if(m_mode == RESIZE) + setCursor(Qt::SizeBDiagCursor); + } else if (getBottomLeftCorner().contains(currentMousePosition)) { + qDebug() << "BOTTOMLEFT"; + m_corner = BOTTOMLEFT; + if(m_mode == RESIZE) + setCursor(Qt::SizeBDiagCursor); + } else if (getBottomRightCorner().contains(currentMousePosition)) { + qDebug() << "BOTTOMRIGHT"; + m_corner = BOTTOMRIGHT; + if(m_mode == RESIZE) + setCursor(Qt::SizeFDiagCursor); + } else { + m_corner = NONE; + setCursor(QCursor()); + } + + if (m_mode == ROTATION && m_corner != NONE) { + setCursor(QCursor(QPixmap(":/images/rotationArrow.png"))); + } +} + +void EllipseView::updateArrows() +{ + // 0 - 3 are rotation arrows + childItems()[0]->setPos(getTopLeftCorner().x(), getTopLeftCorner().y()); + childItems()[1]->setPos(getTopRightCorner().x(), getTopRightCorner().y()); + childItems()[2]->setPos(getBottomLeftCorner().x(), getBottomLeftCorner().y()); + childItems()[3]->setPos(getBottomRightCorner().x(), getBottomRightCorner().y()); + + // 4 - 7 are resize arrows + childItems()[4]->setPos(getTopLeftCorner().x(), getTopLeftCorner().y()); + childItems()[5]->setPos(getTopRightCorner().x(), getTopRightCorner().y()); + childItems()[6]->setPos(getBottomLeftCorner().x(), getBottomLeftCorner().y()); + childItems()[7]->setPos(getBottomRightCorner().x(), getBottomRightCorner().y()); + + + if(isSelected() == false) { + for(int i = 0; i < childItems().length(); ++i) { + childItems()[i]->setVisible(false); + } + + } + else if(m_mode == RESIZE) { + for(int i = 0; i < childItems().length(); ++i) { + if(i < 4) { + childItems()[i]->setVisible(false); + } + else { + childItems()[i]->setVisible(true); + } + } + } else if(m_mode == ROTATION) { + for(int i = 0; i < childItems().length(); ++i) { + if(i < 4) { + childItems()[i]->setVisible(true); + } + else { + childItems()[i]->setVisible(false); + } + } + } +} + +void EllipseView::initializeArrows() +{ + RotationArrow *topLeftRotationArrow = new RotationArrow(this); + RotationArrow *topRightRotationArrow = new RotationArrow(this); + RotationArrow *bottomLeftRotationArrow = new RotationArrow(this); + RotationArrow *bottomRightRotationArrow = new RotationArrow(this); + + ResizeArrow *topLeftResizeArrow = new ResizeArrow(this); + ResizeArrow *topRightResizeArrow = new ResizeArrow(this); + ResizeArrow *bottomLeftResizeArrow = new ResizeArrow(this); + ResizeArrow *bottomRightResizeArrow = new ResizeArrow(this); + + topRightRotationArrow->setRotation(90); + bottomLeftRotationArrow->setRotation(270); + bottomRightRotationArrow->setRotation(180); + + topRightResizeArrow->setRotation(90); + bottomLeftResizeArrow->setRotation(270); + bottomRightResizeArrow->setRotation(180); + + topRightRotationArrow->setVisible(false); + topLeftRotationArrow->setVisible(false); + bottomLeftRotationArrow->setVisible(false); + bottomRightRotationArrow->setVisible(false); + + topRightResizeArrow->setVisible(false); + topLeftResizeArrow->setVisible(false); + bottomLeftResizeArrow->setVisible(false); + bottomRightResizeArrow->setVisible(false); +} diff --git a/GUI/coregui/Views/MaskWidgets/EllipseView.h b/GUI/coregui/Views/MaskWidgets/EllipseView.h new file mode 100644 index 0000000000000000000000000000000000000000..4c1cdf970e784baa98f548f172d027767f53a3c1 --- /dev/null +++ b/GUI/coregui/Views/MaskWidgets/EllipseView.h @@ -0,0 +1,126 @@ +#ifndef ELLIPSEVIEW_H +#define ELLIPSEVIEW_H + +#include "IView.h" + +class EllipseItem; +class QGraphicsSceneMouseEvent; +class QPainter; +class QPointF; + +class EllipseView : public IView +{ + Q_OBJECT + +public: + EllipseView(); + + //! describes the corners + enum Corner { NONE, TOPLEFT, TOPRIGHT, BOTTOMLEFT, BOTTOMRIGHT }; + + //! current active mode + enum Mode { ROTATION, RESIZE }; + + //! Type of this item + enum { Type = UserType + 2 }; + + //! boundingbox of this item + QRectF boundingRect() const; + + //! returns the type of this item + //! @return number of type + int type() const + { + return Type; + } + + //! ellipse including an area and it's color is changing to red + void setInclude(); + + //! ellipse is excluding an area and it's color is changing to blue + void setExclude(); + + //! get current ellipse item + //! @return ellipse item as parameterized item + void setParameterizedItem(ParameterizedItem *item); + + //! get current ellipse item + //! @return ellipse item as parameterized item + ParameterizedItem *getParameterizedItem(); + +public slots: + //! called when x-value changed + void onChangedX(); + + //! called when x-value changed + void onChangedY(); + + //! called when property of ellipse changed + void onPropertyChange(const QString &propertyName); + +protected: + //! paintEvent paints ellipse and corners + void paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *); + + //! manages mouse press events + //! @param event from scene + void mousePressEvent(QGraphicsSceneMouseEvent *event); + + //! manages mouse move events + //! @param event from scene + void mouseMoveEvent(QGraphicsSceneMouseEvent *event); + + //! manages hover events + //! @param event from scene + void mouseReleaseEvent(QGraphicsSceneMouseEvent *event); + + //! manages hover events + //! @param event from scene + void hoverMoveEvent(QGraphicsSceneHoverEvent *event); + +private: + ParameterizedItem *m_item; //!< ellipse item + Corner m_corner; //!< enum with all corners + Mode m_mode; //!< current active mode + bool m_block_mode; //!< blocking modes + QPointF *m_diagonalOpposedPoint; //!< diagonally opposite point from current selected corner + + //! calculates angle for rotation + //! @return angle between selected corner and mouse + //! @param event to receive current mouse position + qreal getRotationAngle(QGraphicsSceneMouseEvent *event); + + //! calculates resized ellipse + //! @param event to receive current mouse position + void calculateResize(QGraphicsSceneMouseEvent *event); + + //! updates all arrows; + void updateArrows(); + + //! initialize all arrows + void initializeArrows(); + + //! verfies clicked corner + //! @param current mouse position + void setSelectedCorner(QPointF currentMousePosition); + + //! set diagonally opposite point from current selected corner + void setDiagonalOpposedPoint(); + + //! returns corner of rectangle + //! @return top left corner + QRectF getTopLeftCorner(); + + //! returns corner of rectangle + //! @return top left corner + QRectF getTopRightCorner(); + + //! returns corner of rectangle + //! @return top left corner + QRectF getBottomLeftCorner(); + + //! returns corner of rectangle + //! @return top left corner + QRectF getBottomRightCorner(); +}; +#endif diff --git a/GUI/coregui/Views/MaskWidgets/GraphicsProxyWidget.cpp b/GUI/coregui/Views/MaskWidgets/GraphicsProxyWidget.cpp new file mode 100644 index 0000000000000000000000000000000000000000..a48711e6ab3b56c7c9a1d03058bd71a338401a57 --- /dev/null +++ b/GUI/coregui/Views/MaskWidgets/GraphicsProxyWidget.cpp @@ -0,0 +1,20 @@ +#include "GraphicsProxyWidget.h" + + + +void GraphicsProxyWidget::mousePressEvent(QGraphicsSceneMouseEvent *event) +{ + QGraphicsProxyWidget::mousePressEvent(event); + event->accept(); +} + +void GraphicsProxyWidget::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) +{ + QGraphicsProxyWidget::mouseReleaseEvent(event); +} + + +void GraphicsProxyWidget::mouseMoveEvent(QGraphicsSceneMouseEvent *event) +{ + QGraphicsProxyWidget::mouseMoveEvent(event); +} diff --git a/GUI/coregui/Views/MaskWidgets/GraphicsProxyWidget.h b/GUI/coregui/Views/MaskWidgets/GraphicsProxyWidget.h new file mode 100644 index 0000000000000000000000000000000000000000..4aa8579fd56a59ddaec062e0ed7e098b966a8c5c --- /dev/null +++ b/GUI/coregui/Views/MaskWidgets/GraphicsProxyWidget.h @@ -0,0 +1,33 @@ +#include "DistributionEditor.h" + +#ifndef GRAPHICSITEM_H +#define GRAPHICSITEM_H + +class GraphicsProxyWidget : public QGraphicsProxyWidget +{ +public: + //! Type of this item + enum { Type = UserType + 4 }; + + //! returns the type of this item + //! @return number of type + int type() const + { + return Type; + } + +protected: + //! manages mouse press events + //! @param event from scene + void mousePressEvent(QGraphicsSceneMouseEvent *event); + + //! manages mouse move events + //! @param event from scene + void mouseMoveEvent(QGraphicsSceneMouseEvent *event); + + //! manages mouse release events + //! @param event from scene + void mouseReleaseEvent(QGraphicsSceneMouseEvent *event); +}; + +#endif diff --git a/GUI/coregui/Views/MaskWidgets/MaskEditor.cpp b/GUI/coregui/Views/MaskWidgets/MaskEditor.cpp new file mode 100644 index 0000000000000000000000000000000000000000..78d28a5240c56e733e3b8dfded26912b75d7b53b --- /dev/null +++ b/GUI/coregui/Views/MaskWidgets/MaskEditor.cpp @@ -0,0 +1,209 @@ +#include <QDebug> +#include <ColorMapPlot.h> +#include <QPointF> +#include "GraphicsProxyWidget.h" +#include "ColorMapPlot.h" +#include "IntensityDataItem.h" +#include "SimulationRegistry.h" +#include "MaskGraphicsScene.h" +#include "MaskGraphicsView.h" +#include "MaskEditor.h" +#include "MaskToolBar.h" +#include "RectangleView.h" +#include "EllipseView.h" +#include "PolygonView.h" +#include "MaskModel.h" +#include "SampleBuilderFactory.h" + + +const qreal widthOfScene = 2000; +const qreal heightOfScene = 2000; + + +MaskEditor::MaskEditor(QWidget *parent) + : QWidget(parent) + , m_scene(new MaskGraphicsScene(this)) + , m_view(new MaskGraphicsView(m_scene, this)) + , m_proxyWidget(new GraphicsProxyWidget) + , m_listView(new QListView(this)) + , m_toolBar(new MaskToolBar) + , m_deleteAction(new QAction("Delete", this)) +{ + this->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); + setMouseTracking(true); + m_view->setMouseTracking(true); + m_view->setRenderHint(QPainter::HighQualityAntialiasing); + m_view->setRenderHint(QPainter::TextAntialiasing); + m_scene->sceneRect().setWidth(widthOfScene); + m_scene->setSceneRect(0,0,widthOfScene, heightOfScene); + m_listView->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Expanding); + m_listView->setContextMenuPolicy(Qt::ActionsContextMenu); + m_listView->addAction(m_deleteAction); + m_listView->setSelectionMode(QAbstractItemView::ExtendedSelection); + + init_connections(); + + QGridLayout *mainLayout = new QGridLayout; + mainLayout->addWidget(m_toolBar,0,0,1,0); + mainLayout->setSpacing(0); + mainLayout->addWidget(m_view, 1,0); + mainLayout->addWidget(m_listView, 1,1); + setLayout(mainLayout); + +} + +void MaskEditor::init_connections() +{ + connect(m_toolBar, SIGNAL(changeToSelectionMode()), this, SLOT(changeToSelectionMode())); + connect(m_scene, SIGNAL(itemIsDrawn()), this, SLOT(changeToSelectionMode())); + connect(m_scene, SIGNAL(itemIsDrawn()), m_toolBar, SLOT(selectSelectionMode())); + connect(m_toolBar, SIGNAL(panMode(bool)), this, SLOT(panMode(bool))); + connect(m_toolBar, SIGNAL(rectangleButtonPressed()), this, SLOT(rectangleButtonPressed())); + connect(m_toolBar, SIGNAL(ellipseButtonPressed()), SLOT(ellipseButtonPressed())); + connect(m_toolBar, SIGNAL(polygonButtonPressed()), this, SLOT(polygonButtonPressed())); + connect(m_toolBar, SIGNAL(bringToFrontClicked()), this, SLOT(bringToFrontClicked())); + connect(m_toolBar, SIGNAL(sendToBackClicked()), this, SLOT(sendToBackClicked())); + connect(m_toolBar, SIGNAL(includeClicked()), this, SLOT(includeClicked())); + connect(m_toolBar, SIGNAL(excludeClicked()), this , SLOT(excludeClicked())); + connect(this, SIGNAL(deleteSelectedItems()), m_scene, SLOT(deleteSelectedItems())); + connect(m_deleteAction, SIGNAL(triggered(bool)), m_scene, SLOT(deleteSelectedItems())); + connect(m_view, SIGNAL(deleteSelectedItems()), m_scene, SLOT(deleteSelectedItems())); +} + +void MaskEditor::keyPressEvent(QKeyEvent *event) +{ + switch (event->key()) { + case Qt::Key_Delete: + emit deleteSelectedItems(); + break; + default: + QWidget::keyPressEvent(event); + break; + }; +} + +void MaskEditor::rectangleButtonPressed() +{ + m_scene->setDrawing(MaskGraphicsScene::RECTANGLE); +} + +void MaskEditor::ellipseButtonPressed() +{ + m_scene->setDrawing(MaskGraphicsScene::ELLIPSE); +} + +void MaskEditor::polygonButtonPressed() +{ + m_scene->setDrawing(MaskGraphicsScene::POLYGON); +} + +void MaskEditor::panMode(bool active) +{ + if(active) { + m_view->setDragMode(QGraphicsView::ScrollHandDrag); + m_view->setInteractive(false); + } + else { + m_view->setDragMode(QGraphicsView::NoDrag); + m_view->setInteractive(true); + } +} + +void MaskEditor::deleteSelectedItem() +{ + QList<QGraphicsItem*> selectedItems = m_view->scene()->selectedItems(); + for(int i = 0; i < selectedItems.length(); ++i) { + m_scene->removeItem(selectedItems[i]); + } + +} + +void MaskEditor::bringToFrontClicked() +{ + m_scene->onBringToFront(); + +} + +void MaskEditor::sendToBackClicked() +{ + m_scene->onSendToBack(); +} + +void MaskEditor::includeClicked() +{ + QList<QGraphicsItem*> selectedItems = m_view->scene()->selectedItems(); + for(int i = 0; i < selectedItems.length(); ++i) { + if(RectangleView::Type == selectedItems[i]->type()) { + qgraphicsitem_cast<RectangleView* >(selectedItems[i])->setInclude(); + } + else if(EllipseView::Type == selectedItems[i]->type()) { + qgraphicsitem_cast<EllipseView* >(selectedItems[i])->setInclude(); + } + else if(PolygonView::Type == selectedItems[i]->type()) { + qgraphicsitem_cast<PolygonView* >(selectedItems[i])->setInclude(); + } + } +} + +void MaskEditor::excludeClicked() +{ + QList<QGraphicsItem*> selectedItems = m_view->scene()->selectedItems(); + for(int i = 0; i < selectedItems.length(); ++i) { + if(RectangleView::Type == selectedItems[i]->type()) { + qgraphicsitem_cast<RectangleView * >(selectedItems[i])->setExclude(); + } + else if(EllipseView::Type == selectedItems[i]->type()) { + qgraphicsitem_cast<EllipseView* >(selectedItems[i])->setExclude(); + } + else if(PolygonView::Type == selectedItems[i]->type()) { + qgraphicsitem_cast<PolygonView* >(selectedItems[i])->setExclude(); + } + } +} + +void MaskEditor::changeToSelectionMode() +{ + m_scene->setDrawing(MaskGraphicsScene::NONE); +} + +void MaskEditor::changeToDrawingMode() +{ + m_view->setDragMode(QGraphicsView::NoDrag); + m_view->setInteractive(true); +} + +void MaskEditor::setModel(MaskModel *maskModel) +{ + m_listView->setModel(maskModel); + m_scene->setModel(maskModel); + m_scene->setSelectionModel(m_listView->selectionModel()); + +// SimulationRegistry sim_registry; +// Simulation *sim = sim_registry.createSimulation("BasicGISAS"); +// SampleBuilderFactory sampleFactory; +// SampleBuilder_t builder = sampleFactory.createBuilder("CylindersAndPrismsBuilder"); +// sim->setSampleBuilder(builder); + +// sim->runSimulation(); +// qDebug() << sim->getIntensityData() << sim->getIntensityData()->totalSum(); + +// IntensityDataItem *dataItem = new IntensityDataItem; +// dataItem->setOutputData(sim->getIntensityData()); + +// ColorMapPlot *colorMapPlot = new ColorMapPlot; +// colorMapPlot->setItem(dataItem); + +// m_proxyWidget->setWidget(colorMapPlot); + + m_proxyWidget->setPos(m_scene->sceneRect().topLeft()); + m_proxyWidget->resize(m_scene->width(), m_scene->height()); + m_scene->addItem(m_proxyWidget); +} + +void MaskEditor::onItemIsDrawn() +{ + emit itemIsDrawn(); +} + + + diff --git a/GUI/coregui/Views/MaskWidgets/MaskEditor.h b/GUI/coregui/Views/MaskWidgets/MaskEditor.h new file mode 100644 index 0000000000000000000000000000000000000000..49b2dd8119ef2a9cdbdef11eac156e49f0f68df7 --- /dev/null +++ b/GUI/coregui/Views/MaskWidgets/MaskEditor.h @@ -0,0 +1,86 @@ +#ifndef MASKEDITOR_H +#define MASKEDITOR_H + +class MaskGraphicsView; +class MaskGraphicsScene; +class GraphicsProxyWidget; +class MaskModel; +class MaskToolBar; +class QListView; +class QVBoxLayout; +class QAction; + +class MaskEditor : public QWidget +{ + Q_OBJECT +public: + MaskEditor(QWidget *parent = 0); + + virtual ~MaskEditor() + { + } + + //! set Model + //! param mask model that caries model for masking + void setModel(MaskModel *maskModel); + +private slots: + + //! creates a rectangle on button press event + void rectangleButtonPressed(); + + //! creates a ellipse on button press event + void ellipseButtonPressed(); + + //! creates a polygon on button press event + void polygonButtonPressed(); + + //! switch on pan mode + void panMode(bool active); + + //! delete selected item + void deleteSelectedItem(); + + //! bring current selected item to the top + void bringToFrontClicked(); + + //! send current selected item to the bottom + void sendToBackClicked(); + + //! create include item + void includeClicked(); + + //! create exclude item + void excludeClicked(); + + //! change from drawing mode to selection mode + void changeToSelectionMode(); + + //!change from selection mode to drawing mode + void changeToDrawingMode(); + + //!change back to selecton mode if item is drawn + void onItemIsDrawn(); + +private: + MaskGraphicsScene *m_scene; //!< scene contains all items + MaskGraphicsView *m_view; //!< view renders all items and show them item in the scene on display + GraphicsProxyWidget *m_proxyWidget; //!< color map (detector) + QListView *m_listView; //!< list wiht currently created items as a list + MaskToolBar *m_toolBar; //!< tool bar + QAction *m_deleteAction; //!< delete action for the list view + void init_connections(); //!< initialie all connections between scene, view and toolbar + +signals: + //! emittes this signal to toolbar if item is drawn + void itemIsDrawn(); + + //! signal is emitted when someone want to delete item + void deleteSelectedItems(); + +protected: + //! event that manages key press events + void keyPressEvent(QKeyEvent *event); +}; + +#endif diff --git a/GUI/coregui/Views/MaskWidgets/MaskGraphicsScene.cpp b/GUI/coregui/Views/MaskWidgets/MaskGraphicsScene.cpp new file mode 100644 index 0000000000000000000000000000000000000000..8604318575bb0e29857b4124c503a950bb13b601 --- /dev/null +++ b/GUI/coregui/Views/MaskWidgets/MaskGraphicsScene.cpp @@ -0,0 +1,497 @@ +#include "MaskGraphicsScene.h" +#include "RectangleItem.h" +#include "RectangleView.h" +#include "EllipseItem.h" +#include "PolygonItem.h" +#include "PointItem.h" +#include "MaskModel.h" +#include "SampleViewFactory.h" +#include <QItemSelection> +#include <cmath> +#include <sstream> +#include <QGraphicsSceneMouseEvent> +#include <QDebug> +#include <QTreeView> +#include <QPainter> +#include <QGraphicsProxyWidget> + +MaskGraphicsScene::MaskGraphicsScene(QObject *parent) + : QGraphicsScene(parent) + , m_maskModel(0) + , m_currentItem(0) + , m_currentMousePosition(QPointF(0, 0)) + , m_lastAddedPoint(QPointF(0, 0)) + , m_block_selection(false) + , m_numberOfRectangles(0) + , m_numberOfEllipses(0) + , m_numberOfPolygons(0) +{ +// setSceneRect(QRectF(-800, 0, 1600, 1600)); + m_drawingMode = NONE; +} + +void MaskGraphicsScene::setDrawing(DrawingMode drawingMode) +{ + m_drawingMode = drawingMode; +} + +void MaskGraphicsScene::mousePressEvent(QGraphicsSceneMouseEvent *event) +{ + if(event->button() == Qt::LeftButton) { + if (m_drawingMode == RECTANGLE) { + m_currentItem = m_maskModel->insertNewItem(Constants::RectangleType); + setItemName(m_currentItem); + } else if (m_drawingMode == ELLIPSE) { + m_currentItem = m_maskModel->insertNewItem(Constants::EllipseType); + setItemName(m_currentItem); + } else if (m_drawingMode == POLYGON) { + if (!m_currentItem) { + m_currentItem = m_maskModel->insertNewItem(Constants::PolygonType); + m_currentItem->setRegisteredProperty(PolygonItem::P_DRAWINGMODE, true); + setItemName(m_currentItem); + } + if (numberOfPoints() > 2 && firstPointContainsMouseClick(event)) { + m_currentItem->setRegisteredProperty(PolygonItem::P_DRAWINGMODE, false); + m_maskModel->moveParameterizedItem(m_currentItem, 0, 0); + m_currentItem = 0; + m_drawingMode = NONE; + emit itemIsDrawn(); + } + else if(m_currentItem) { + ParameterizedItem *pointItem = m_maskModel->insertNewItem(Constants::PointType, + m_maskModel->indexOfItem(m_currentItem)); + pointItem->setRegisteredProperty(PointItem::P_POSX, event->scenePos().x()); + pointItem->setRegisteredProperty(PointItem::P_POSY, event->scenePos().y()); + } + } + else { + QGraphicsScene::mousePressEvent(event); + } + } + m_lastAddedPoint = event->buttonDownScenePos(Qt::LeftButton); + m_currentPoint = event->buttonDownScenePos(Qt::LeftButton); +} + +void MaskGraphicsScene::mouseMoveEvent(QGraphicsSceneMouseEvent *event) +{ + if (m_drawingMode == RECTANGLE && m_currentItem) { + drawingDirection(event); + } else if (m_drawingMode == ELLIPSE && m_currentItem) { + drawingDirection(event); + } + else { + QGraphicsScene::mouseMoveEvent(event); + } + m_currentMousePosition = event->scenePos(); +} + +void MaskGraphicsScene::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) +{ + bool drawingToSmall = false; + if (m_drawingMode == RECTANGLE && m_currentItem) { + if (std::abs(m_currentItem->getRegisteredProperty(RectangleItem::P_WIDTH).toReal()) <= 10 && + std::abs(m_currentItem->getRegisteredProperty(RectangleItem::P_HEIGHT).toReal()) <= 10){ + QModelIndex index = m_maskModel->indexOfItem(m_currentItem); + m_maskModel->removeRows(index.row(), 1, index.parent()); + m_numberOfRectangles--; + drawingToSmall = true; + } + } else if (m_drawingMode == ELLIPSE && m_currentItem) { + if (std::abs(m_currentItem->getRegisteredProperty(EllipseItem::P_WIDTH).toReal()) <= 10 && + std::abs(m_currentItem->getRegisteredProperty(EllipseItem::P_HEIGHT).toReal()) <= 10) { + QModelIndex index = m_maskModel->indexOfItem(m_currentItem); + m_maskModel->removeRows(index.row(), 1, index.parent()); + m_numberOfEllipses--; + drawingToSmall = true; + } + } + + if (m_drawingMode == RECTANGLE || m_drawingMode == ELLIPSE) { + if(!drawingToSmall && m_currentItem) { + m_maskModel->moveParameterizedItem(m_currentItem, 0, 0); + // uncomment this if you want to change to selection mode after drawing an item. +// emit itemIsDrawn(); + } + m_currentItem = 0; + } + QGraphicsScene::mouseReleaseEvent(event); +} + +void MaskGraphicsScene::drawForeground(QPainter *painter, const QRectF & /* rect */) +{ + if (m_drawingMode == POLYGON && m_currentItem) { + if(numberOfPoints() == 0) { + m_lastAddedPoint = m_currentMousePosition; + } + painter->setPen(QPen(Qt::black, 1, Qt::DashLine)); + painter->drawLine(QLineF(m_lastAddedPoint, m_currentMousePosition)); + invalidate(); + } + else { + m_lastAddedPoint = m_currentMousePosition; + } + +} + +void MaskGraphicsScene::updateViews(const QModelIndex &parentIndex) +{ + Q_ASSERT(m_maskModel); + + for (int i_row = 0; i_row < m_maskModel->rowCount(parentIndex); ++i_row) { + QModelIndex itemIndex = m_maskModel->index(i_row, 0, parentIndex); + + if (ParameterizedItem *item = m_maskModel->itemForIndex(itemIndex)) { + addViewForItem(item); + } + } +} + +IView *MaskGraphicsScene::addViewForItem(ParameterizedItem *item) +{ + qDebug() << "GraphicsScene::addViewForItem() ->" << item->modelType() << item; + Q_ASSERT(item); + + IView *view = m_ItemToView[item]; + if (!view) { + qDebug() << " GraphicsScene::addViewForItem() -> Creating view for item" + << item->modelType(); + view = SampleViewFactory::createSampleView(item->modelType()); + if (view) { + m_ItemToView[item] = view; + view->setParameterizedItem(item); + addItem(view); + return view; + } + } else { + qDebug() << " GraphicsScene::addViewForItem() -> View for item exists." + << item->modelType(); + } + return view; +} + +void MaskGraphicsScene::updateScene() +{ + if(this->items().size() > 0) { + m_colorMap = this->items().at(0); + updateViews(); + setZValues(); + addItem(m_colorMap); + } + else { + updateViews(); + setZValues(); + } +} + +void MaskGraphicsScene::resetScene() +{ + qDebug() << "GraphicsScene::resetScene()"; + clear(); + m_ItemToView.clear(); +} + +void MaskGraphicsScene::setSelectionModel(QItemSelectionModel *selectionModel) +{ + m_selectionModel = selectionModel; + + connect(m_selectionModel, SIGNAL(selectionChanged(QItemSelection, QItemSelection)), this, + SLOT(onSessionSelectionChanged(QItemSelection, QItemSelection))); +} + +void MaskGraphicsScene::setModel(MaskModel *maskModel) +{ + if(m_maskModel) { + disconnect(this, SIGNAL(selectionChanged()), this, SLOT(onSceneSelectionChanged())); + disconnect(m_maskModel, SIGNAL(modelAboutToBeReset()), this, SLOT(resetScene())); + disconnect(m_maskModel, SIGNAL(rowsInserted(QModelIndex, int, int)), this, + SLOT(onRowsInserted(QModelIndex, int, int))); + disconnect(m_maskModel, SIGNAL(rowsAboutToBeRemoved(QModelIndex, int, int)), this, + SLOT(onRowsAboutToBeRemoved(QModelIndex, int, int))); + disconnect(m_maskModel, SIGNAL(rowsRemoved(QModelIndex, int, int)), this, + SLOT(onRowsRemoved(QModelIndex, int, int))); + disconnect(m_maskModel, SIGNAL(modelReset()), this, SLOT(updateScene())); + } + + m_maskModel = maskModel; + + connect(this, SIGNAL(selectionChanged()), this, SLOT(onSceneSelectionChanged())); + connect(m_maskModel, SIGNAL(modelAboutToBeReset()), this, SLOT(resetScene())); + connect(m_maskModel, SIGNAL(rowsInserted(QModelIndex, int, int)), this, + SLOT(onRowsInserted(QModelIndex, int, int))); + connect(m_maskModel, SIGNAL(rowsAboutToBeRemoved(QModelIndex, int, int)), this, + SLOT(onRowsAboutToBeRemoved(QModelIndex, int, int))); + connect(m_maskModel, SIGNAL(rowsRemoved(QModelIndex, int, int)), this, + SLOT(onRowsRemoved(QModelIndex, int, int))); + connect(m_maskModel, SIGNAL(modelReset()), this, SLOT(updateScene())); + + resetScene(); + updateScene(); +} + +void MaskGraphicsScene::onSessionSelectionChanged(const QItemSelection &, const QItemSelection &) +{ + if (m_block_selection) + return; + + qDebug() << "GraphicsScene::SelectionChanged()"; + m_block_selection = true; + + for (QMap<ParameterizedItem *, IView *>::iterator it = m_ItemToView.begin(); + it != m_ItemToView.end(); ++it) { + QModelIndex index = m_maskModel->indexOfItem(it.key()); + if (index.isValid()) { + if (m_selectionModel->isSelected(index)) { + it.value()->setSelected(true); + } else { + it.value()->setSelected(false); + } + } + } + + m_block_selection = false; +} + +void MaskGraphicsScene::onRowsAboutToBeRemoved(const QModelIndex &parent, int first, int last) +{ + m_block_selection = true; + qDebug() << "GraphicsScene::onRowsAboutToBeRemoved()" << parent << first << last; + for (int irow = first; irow <= last; ++irow) { + QModelIndex itemIndex = m_maskModel->index(irow, 0, parent); + deleteViews(itemIndex); // deleting all child items + } + m_block_selection = false; +} + +void MaskGraphicsScene::deleteViews(const QModelIndex &parentIndex) +{ + qDebug() << "GraphicsScene::deleteViews()" << parentIndex; + + for (int i_row = 0; i_row < m_maskModel->rowCount(parentIndex); ++i_row) { + QModelIndex itemIndex = m_maskModel->index(i_row, 0, parentIndex); + + if (ParameterizedItem *item = m_maskModel->itemForIndex(itemIndex)) { + + removeItemViewFromScene(item); + + } else { + qDebug() << "not a parameterized graphics item"; + } + deleteViews(itemIndex); + } + removeItemViewFromScene(m_maskModel->itemForIndex(parentIndex)); // deleting parent item +} + +//! removes view from scene corresponding to given item +void MaskGraphicsScene::removeItemViewFromScene(ParameterizedItem *item) +{ + qDebug() << "GraphicsScene::removeItemFromScene()" << item->modelType(); + for (QMap<ParameterizedItem *, IView *>::iterator it = m_ItemToView.begin(); + it != m_ItemToView.end(); ++it) { + if (it.key() == item) { + IView *view = it.value(); + view->setSelected(false); + m_ItemToView.erase(it); + emit view->aboutToBeDeleted(); + delete view; + update(); + break; + } + } +} + +void MaskGraphicsScene::onRowsRemoved(const QModelIndex &/* parent */, int /* first */, int /* last */) +{ + updateScene(); +} + +void MaskGraphicsScene::deleteSelectedItems() +{ + qDebug() << "GraphicsScene::deleteSelectedItems() 1.1" << selectedItems().size(); + + QModelIndexList indexes = m_selectionModel->selectedIndexes(); + + // deleting selected items on model side, corresponding views will be deleted automatically + // Since we don't know the order of items, we need this + + while(indexes.size()) { + m_maskModel->removeRows(indexes.back().row(), 1, indexes.back().parent()); + indexes = m_selectionModel->selectedIndexes(); + } +} + +//! propagate selection from scene to model +void MaskGraphicsScene::onSceneSelectionChanged() +{ + qDebug() << "GraphicsScene::onSceneSelectionChanged() 1.1"; + if (m_block_selection) + return; + + m_block_selection = true; + + m_selectionModel->clearSelection(); + QList<QGraphicsItem *> selected = selectedItems(); + for (int i = 0; i < selected.size(); ++i) { + IView *view = dynamic_cast<IView *>(selected[i]); + if (view) { + ParameterizedItem *sampleItem = view->getParameterizedItem(); + QModelIndex itemIndex = m_maskModel->indexOfItem(sampleItem); + Q_ASSERT(itemIndex.isValid()); + if (!m_selectionModel->isSelected(itemIndex)) + m_selectionModel->select(itemIndex, QItemSelectionModel::Select); + // break; // selection of only one item will be propagated to the model + } + } + + m_block_selection = false; +} + +void MaskGraphicsScene::onRowsInserted(const QModelIndex & /* parent */, int /* first */, int /* last */) +{ + updateScene(); +} + +void MaskGraphicsScene::setItemName(ParameterizedItem *item) +{ + int numberOfItems(0); + QString name; + QMap<ParameterizedItem *, IView *>::iterator it; + for(it = m_ItemToView.begin(); it != m_ItemToView.end(); ++it) { + if(item->modelType() == it.key()->modelType()) { + numberOfItems ++; + } + } + if(item->modelType() == "Rectangle") { + if(numberOfItems <= m_numberOfRectangles) { + m_numberOfRectangles ++; + } + else { + m_numberOfRectangles = numberOfItems; + } + name = item->itemName().append(QString("%1")).arg(m_numberOfRectangles); + } + else if(item->modelType() == "Ellipse") { + if(numberOfItems <= m_numberOfEllipses) { + m_numberOfEllipses ++; + } + else { + m_numberOfEllipses = numberOfItems; + } + name = item->itemName().append(QString("%1")).arg(m_numberOfEllipses); + } + else if(item->modelType() == "Polygon") { + if(numberOfItems <= m_numberOfPolygons) { + m_numberOfPolygons++; + } + else { + m_numberOfPolygons = numberOfItems; + } + name = item->itemName().append(QString("%1")).arg(m_numberOfPolygons); + } + item->setItemName(name); +} + +int MaskGraphicsScene::numberOfPoints() +{ + if(m_drawingMode == POLYGON) { + int items = m_currentItem->childItems().length(); + return items; + } + return 0; +} + +bool MaskGraphicsScene::firstPointContainsMouseClick(QGraphicsSceneMouseEvent *event) +{ + QRectF firstPoint( + m_currentItem->childItems()[0]->getRegisteredProperty(PointItem::P_POSX).toReal() - 2.5, + m_currentItem->childItems()[0]->getRegisteredProperty(PointItem::P_POSY).toReal() - 2.5, + 5, 5); + + if(firstPoint.contains(event->scenePos())) { + ParameterizedItem *pointItem = m_maskModel->insertNewItem(Constants::PointType, + m_maskModel->indexOfItem(m_currentItem)); + pointItem->setRegisteredProperty(PointItem::P_POSX, firstPoint.center().x()); + pointItem->setRegisteredProperty(PointItem::P_POSY, firstPoint.center().y()); + return true; + } + + else { + return false; + } +} + +void MaskGraphicsScene::onBringToFront() +{ + QModelIndexList indexes = m_selectionModel->selectedIndexes(); + + for(int i = 0; i < indexes.size(); i++) { + ParameterizedItem *item = m_maskModel->itemForIndex(indexes.at(i)); + int row = indexes.at(i).row() -1; + + if(m_maskModel->rowCount(QModelIndex()) == 0) { + return; + } + else { + qreal x = m_ItemToView[item]->pos().x(); + qreal y = m_ItemToView[item]->pos().y(); + m_maskModel->moveParameterizedItem(item, 0, row); + + QModelIndex movedItemIndex = m_maskModel->index(row,0,QModelIndex()); + ParameterizedItem *movedItem = m_maskModel->itemForIndex(movedItemIndex); + m_ItemToView[movedItem]->setPos(x,y); + } + } +} + +void MaskGraphicsScene::onSendToBack() +{ + QModelIndexList indexes = m_selectionModel->selectedIndexes(); + qDebug() << "MaskGraphicsScene::onSendToBack()" << indexes.size(); + for(int i = 0; i < indexes.size(); i++) { + ParameterizedItem *item = m_maskModel->itemForIndex(indexes.at(i)); + int row = indexes.at(i).row() + 2; + + if(indexes.at(i).row() == m_maskModel->rowCount(QModelIndex()) -1 ) { + return; + } + else { + qreal x = m_ItemToView[item]->pos().x(); + qreal y = m_ItemToView[item]->pos().y(); + m_maskModel->moveParameterizedItem(item, 0, row); + + QModelIndex movedItemIndex = m_maskModel->index(row -1 ,0,QModelIndex()); + ParameterizedItem *movedItem = m_maskModel->itemForIndex(movedItemIndex); + m_ItemToView[movedItem]->setPos(x,y); + } + + } +} + +void MaskGraphicsScene::setZValues() +{ + for(int i = 0; i < m_maskModel->rowCount(QModelIndex()); i++) { + QModelIndex indexes = m_maskModel->index(i, 0, QModelIndex()); + ParameterizedItem *item = m_maskModel->itemForIndex(indexes); + m_ItemToView[item]->setZValue(m_maskModel->rowCount(QModelIndex()) - indexes.row() + 1); + } +} + +void MaskGraphicsScene::drawingDirection(QGraphicsSceneMouseEvent *event) +{ + qreal xmin = std::min(event->scenePos().x(),m_currentPoint.x()); + qreal xmax = std::max(event->scenePos().x(),m_currentPoint.x()); + qreal ymin = std::min(event->scenePos().y(),m_currentPoint.y()); + qreal ymax = std::max(event->scenePos().y(),m_currentPoint.y()); + + m_currentItem->setRegisteredProperty("Width", xmax - xmin); + m_currentItem->setRegisteredProperty("Height", ymax - ymin); + + m_currentItem->setRegisteredProperty("X position", xmin); + m_currentItem->setRegisteredProperty("Y position", ymin); + + +} + + + + + diff --git a/GUI/coregui/Views/MaskWidgets/MaskGraphicsScene.h b/GUI/coregui/Views/MaskWidgets/MaskGraphicsScene.h new file mode 100644 index 0000000000000000000000000000000000000000..f030e15834230c1f4e078b38c23f5287a3bf0e06 --- /dev/null +++ b/GUI/coregui/Views/MaskWidgets/MaskGraphicsScene.h @@ -0,0 +1,147 @@ +#ifndef MASKGRAPHICSSCENE_H +#define MASKGRAPHICSSCENE_H + +#include <QGraphicsScene> +#include <QItemSelection> +#include <QModelIndex> + +class RectangleItem; +class MaskModel; +class ParameterizedItem; +class QListView; +class QTreeView; +class QItemSelectionModel; +class IView; +class QSelectionModel; +class QGraphicsItem; +class QGraphicsSceneMouseEvent; + +class MaskGraphicsScene : public QGraphicsScene +{ + Q_OBJECT + +public: + MaskGraphicsScene(QObject *parent = 0); + + //! describes items that are currently being drawn + enum DrawingMode { NONE, RECTANGLE, ELLIPSE, POLYGON }; + + //! set drawing mode + //! @param drawingMode item that shoulb be drawn + void setDrawing(DrawingMode drawingMode); + + //! set selection Model + //! @param selectionModel includes the selected item from the list view + void setSelectionModel(QItemSelectionModel *selectionModel); + + //! set mask model + //! @param maskModel contains all models for masking + void setModel(MaskModel *maskModel); + + //! takes current selected item and put it one row upwards + void onBringToFront(); + + //! takes current selected item and put it one row below + void onSendToBack(); + +public slots: + //! delete current selected items + void deleteSelectedItems(); + + //! removes all items and views + //! @param parent + //! @param first child item + //! @param last child item + void onRowsAboutToBeRemoved(const QModelIndex &parent, int first, int last); + + //! selects selected items from list view on the graphics view + void onSessionSelectionChanged(const QItemSelection &, const QItemSelection &); + + //! updates scene + void onRowsRemoved(const QModelIndex &, int, int); + + //! updates scene + void onRowsInserted(const QModelIndex &, int, int); + + //! selects selected items from graphics view on the list view + void onSceneSelectionChanged(); + + //! resets scene by clearing scene + void resetScene(); + + //! updates views, sets z-values and adds color map + void updateScene(); + +signals: + //! emits signal that current item is drawn (only working if it is uncommented) + void itemIsDrawn(); + +protected: + //! manages mouse press events + //! @param event contains current mouse press + void mousePressEvent(QGraphicsSceneMouseEvent *event); + + //! manages mouse move events + //! @param event contains current mouse move + void mouseMoveEvent(QGraphicsSceneMouseEvent *event); + + //! manages mouse release events + //! @param event contains current mouse release + void mouseReleaseEvent(QGraphicsSceneMouseEvent *event); + + //! draws dashed line when polygon is drawn + //! @param painter to draw dashed line + void drawForeground(QPainter *painter, const QRectF &); + +private: + MaskModel *m_maskModel; //!< model that contains all mask items + QItemSelectionModel *m_selectionModel; //!< model that contains all selected items + QMap<ParameterizedItem *, IView *> + m_ItemToView; //!< map that contains all items as key and all views as value + DrawingMode m_drawingMode; //!< current drawing mode + ParameterizedItem *m_currentItem; //!<current item being drawn + QPointF m_currentMousePosition; //!< current mouse position + QPointF m_lastAddedPoint; //!< last added point to a polygon + bool m_block_selection; //!< blocks selection of items + QPointF m_currentPoint; //!< describes the current point of polygon + QGraphicsItem *m_colorMap; //!< color map (detector) + int m_numberOfRectangles; //!< number of rectangles were ever drawn + int m_numberOfEllipses; //!< number of ellipses were ever drawn + int m_numberOfPolygons; //!< number of polygon were ever drawn + + //! number of points from polygon + //! @returns the number of points in polygon else 0 + int numberOfPoints(); + + //! sets name to current item + //! @param item currently drawn item + void setItemName(ParameterizedItem *item); + + //! delete views + //! @param parentIndex parameter for parent idex + void deleteViews(const QModelIndex &parentIndex); + + //! removes item view from scene + //! @param item to remove + void removeItemViewFromScene(ParameterizedItem *item); + + //! updating views + void updateViews(const QModelIndex &parentIndex = QModelIndex()); + + //! adds view for item + //! @param item parameter that gets a view + IView *addViewForItem(ParameterizedItem *item); + + //! verifies if first point contains the current mouse press + //! @param current mouse event + //! @returns true if first point contains mouse click else false + bool firstPointContainsMouseClick(QGraphicsSceneMouseEvent *event); + + //! sets z-values from views + void setZValues(); + + //! verifies drawing direction + //! @param event to get current direction + void drawingDirection(QGraphicsSceneMouseEvent *event); +}; +#endif diff --git a/GUI/coregui/Views/MaskWidgets/MaskGraphicsView.cpp b/GUI/coregui/Views/MaskWidgets/MaskGraphicsView.cpp new file mode 100644 index 0000000000000000000000000000000000000000..85f14507cd91721c91b83862ae1fbe99c4212f45 --- /dev/null +++ b/GUI/coregui/Views/MaskWidgets/MaskGraphicsView.cpp @@ -0,0 +1,83 @@ +#include "MaskGraphicsView.h" +#include "GraphicsProxyWidget.h" +#include "MaskGraphicsScene.h" + + +MaskGraphicsView::MaskGraphicsView(QGraphicsScene *scene, QWidget *parent) + : QGraphicsView(scene, parent) +{ +} + + +void MaskGraphicsView::wheelEvent(QWheelEvent *event) +{ + // hold control button + if(controlButtonIsPressed(event)) { + centerOn(mapToScene(event->pos())); + + // Scale the view / do the zoom + const double scaleFactor = 1.15; + + if(event->delta() > 0) { + // Zoom in + this->scale(scaleFactor, scaleFactor); + + } else { + // Zooming out + if(horizontalScrollBar()->isVisible() || verticalScrollBar()->isVisible()) + this->scale(1.0 / scaleFactor, 1.0 / scaleFactor); + } + } +// else if(eventPosIsOnColorMap(event)) { +// this->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); +// this->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); +// QGraphicsView::wheelEvent(event); +// } + else { + QGraphicsView::wheelEvent(event); + } +} +void MaskGraphicsView::keyPressEvent(QKeyEvent *event) +{ + switch (event->key()) { + case Qt::Key_Delete: + emit deleteSelectedItems(); + break; + case Qt::Key_Space: + if (!event->isAutoRepeat()) + panMode(true); + break; + default: + QWidget::keyPressEvent(event); + break; + } +} +void MaskGraphicsView::keyReleaseEvent(QKeyEvent *event) +{ + switch (event->key()) { + case Qt::Key_Space: + if (!event->isAutoRepeat()) + panMode(false); + break; + default: + QWidget::keyReleaseEvent(event); + break; + } +} + + +bool MaskGraphicsView::controlButtonIsPressed(QWheelEvent *event) +{ + if(event->modifiers().testFlag(Qt::ControlModifier)){ + return true; + } + return false; +} + +bool MaskGraphicsView::eventPosIsOnColorMap(QWheelEvent *event) +{ + if(this->scene()->items()[0]->boundingRect().contains(event->pos())) { + return true; + } + return false; +} diff --git a/GUI/coregui/Views/MaskWidgets/MaskGraphicsView.h b/GUI/coregui/Views/MaskWidgets/MaskGraphicsView.h new file mode 100644 index 0000000000000000000000000000000000000000..86d5a62527ae681b955b701c493643aebe0e765a --- /dev/null +++ b/GUI/coregui/Views/MaskWidgets/MaskGraphicsView.h @@ -0,0 +1,50 @@ +#ifndef MASKGRAPHICSVIEW_H +#define MASKGRAPHICSVIEW_H + +#include <QGraphicsView> + +class MaskGraphicsView : public QGraphicsView +{ +Q_OBJECT +public: + MaskGraphicsView(QGraphicsScene *scene, QWidget *parent = 0); + +protected: + //! manages mouse wheel events + //! @param event contain current mouse wheel event + void wheelEvent(QWheelEvent* event); + + //! zoom to a specific position + //! @param factor to be zoomed in or out + //! @param centerPoint the point where to zoom in or out + void zoom(qreal factor, QPointF centerPoint); + + //! manages key release events + //! @param event contains current release button + void keyReleaseEvent(QKeyEvent *event); + + //! manages key press events + //! @param event contains current clicked button + void keyPressEvent(QKeyEvent *event); + +private: + //! check if control button is pressed to zoom on view + //! @param event contains current pressed button + //! @returns true if controll button pressed else false + bool controlButtonIsPressed(QWheelEvent *event); + + //! check if color map is clicked to zoom on the color map + //! @param event contains current pressed button + //! @returns true if position of the event is about color map else false + bool eventPosIsOnColorMap(QWheelEvent *event); + +signals: + + //! emitted if space button is pressed + void panMode(bool active); + + //! emitted if delete button is pressed + void deleteSelectedItems(); + +}; +#endif diff --git a/GUI/coregui/Views/MaskWidgets/PolygonView.cpp b/GUI/coregui/Views/MaskWidgets/PolygonView.cpp new file mode 100644 index 0000000000000000000000000000000000000000..21171d3e6ffd06cbe429f8f3d8c5d6e2610faf18 --- /dev/null +++ b/GUI/coregui/Views/MaskWidgets/PolygonView.cpp @@ -0,0 +1,212 @@ +#include "PolygonView.h" +#include "ParameterizedItem.h" +#include "PolygonItem.h" +#include "PointItem.h" +#include <cmath> +#include <QDebug> +#include <QPainter> +#include <QCursor> +#include <QGraphicsSceneMouseEvent> + +PolygonView::PolygonView() + : m_changeCornerMode(false), m_indexOfCurrentSelectedPoint(0), m_mouseIsOverFirstPoint(false) + +{ + this->setFlag(QGraphicsItem::ItemIsSelectable); + this->cursor().setShape(Qt::ClosedHandCursor); + this->setAcceptHoverEvents(true); +} + +void PolygonView::paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *) +{ + QPen pen; + prepareGeometryChange(); + painter->setRenderHints(QPainter::Antialiasing); + QList<ParameterizedItem *> points = m_item->childItems(); + QPolygon polygon; + + // draws polygon + for (int i = 0; i < points.length(); ++i) { + polygon << QPoint(points[i]->getRegisteredProperty(PointItem::P_POSX).toReal(), + points[i]->getRegisteredProperty(PointItem::P_POSY).toReal()); + } + painter->drawPolyline(polygon); + + // fills polygon with a color + if (getFirstPoint().center().x() == polygon[polygon.length() - 1].x() + && getFirstPoint().center().y() == polygon[polygon.length() - 1].y() + && points.length() >= 2) { + + QPainterPath path; + QBrush transRed(DesignerHelper::getDefaultColor("Transparant red")); + QBrush transBlue(DesignerHelper::getDefaultColor("Transparant blue")); + path.moveTo(polygon[0].x(),polygon[0].y()); + for (int i = 1; i < polygon.length(); ++i) { + path.lineTo(polygon[i].x(), polygon[i].y()); + } + painter->setPen(Qt::NoPen); + if (m_item->getRegisteredProperty(PolygonItem::P_COLOR).toInt() == 0) { + painter->fillPath(path, transRed); + } else { + painter->fillPath(path, transBlue); + } + } + + if (points.length() >= 1 + && m_item->getRegisteredProperty(PolygonItem::P_DRAWINGMODE).toBool()) { + pen.setWidth(1); + if (m_mouseIsOverFirstPoint) { + painter->fillRect(getFirstPoint(), Qt::red); + } else { + painter->drawRect(getFirstPoint()); + } + } + // draw all points if item is finised with drawing and is selected + if (!m_item->getRegisteredProperty(PolygonItem::P_DRAWINGMODE).toBool() && isSelected()) { + pen.setWidth(5); + painter->setPen(pen); + for (int i = 0; i < points.length() - 1; ++i) { + painter->drawPoint( + QPointF(polygon[i].x(), polygon[i].y())); + } + painter->setPen(QPen()); + } +} + +QRectF PolygonView::boundingRect() const +{ + if (m_item->childItems().length() >= 1) { + return calculateBoundingRectangle(); + } else { + return QRectF(0, 0, 20, 20); + } +} + +bool PolygonView::isCornerClicked(QGraphicsSceneMouseEvent *event) +{ + QList<ParameterizedItem *> points = m_item->childItems(); + for (int i = 0; i < points.length() - 1; ++i) { + QRectF rectangle( + points[i]->getRegisteredProperty(PointItem::P_POSX).toReal() - 2.5, + points[i]->getRegisteredProperty(PointItem::P_POSY).toReal() - 2.5, 5, 5); + if (rectangle.contains(event->pos())) { + if (i != points.length() - 1 && i != 0) { + m_indexOfCurrentSelectedPoint = i; + } else { + m_indexOfCurrentSelectedPoint = 0; + } + m_changeCornerMode = true; + this->setFlag(QGraphicsItem::ItemIsMovable, false); + return true; + } + } + return false; +} + +QRectF PolygonView::calculateBoundingRectangle() const +{ + QList<ParameterizedItem *> points = m_item->childItems(); + qreal smallestXValue = points[0]->getRegisteredProperty(PointItem::P_POSX).toReal(); + qreal biggestXValue = points[0]->getRegisteredProperty(PointItem::P_POSX).toReal(); + qreal smallestYValue = points[0]->getRegisteredProperty(PointItem::P_POSY).toReal(); + qreal biggestYValue = points[0]->getRegisteredProperty(PointItem::P_POSY).toReal(); + + + for (int i = 1; i < points.length(); ++i) { + smallestXValue = std::min(smallestXValue, points[i]->getRegisteredProperty(PointItem::P_POSX).toReal()); + biggestXValue = std::max(biggestXValue, points[i]->getRegisteredProperty(PointItem::P_POSX).toReal()); + smallestYValue = std::min(smallestYValue, points[i]->getRegisteredProperty(PointItem::P_POSY).toReal()); + biggestYValue = std::max(biggestYValue, points[i]->getRegisteredProperty(PointItem::P_POSY).toReal()); + } + return QRectF(QPointF(smallestXValue - 20, smallestYValue - 20), + QPointF(biggestXValue + 20, biggestYValue + 20)); +} + +void PolygonView::mousePressEvent(QGraphicsSceneMouseEvent *event) +{ + if (isCornerClicked(event)) { + m_changeCornerMode = true; + } else if (event->button() == Qt::RightButton) { + m_item->setRegisteredProperty(PolygonItem::P_DRAWINGMODE, false); + } else { + this->setFlag(QGraphicsItem::ItemIsMovable, true); + QGraphicsItem::mousePressEvent(event); + } +} + +void PolygonView::mouseMoveEvent(QGraphicsSceneMouseEvent *event) +{ + if (m_changeCornerMode) { + QList<ParameterizedItem *> points = m_item->childItems(); + setCursor(Qt::CrossCursor); + if (m_indexOfCurrentSelectedPoint == 0) { + points[m_indexOfCurrentSelectedPoint]->setRegisteredProperty(PointItem::P_POSX, event->pos().x()); + points[m_indexOfCurrentSelectedPoint]->setRegisteredProperty(PointItem::P_POSY, event->pos().y()); + points[points.length() - 1]->setRegisteredProperty(PointItem::P_POSX, event->pos().x()); + points[points.length() - 1]->setRegisteredProperty(PointItem::P_POSY, event->pos().y()); + } else { + points[m_indexOfCurrentSelectedPoint]->setRegisteredProperty(PointItem::P_POSX, event->pos().x()); + points[m_indexOfCurrentSelectedPoint]->setRegisteredProperty(PointItem::P_POSY, event->pos().y()); + } + } else if (!m_item->getRegisteredProperty(PolygonItem::P_DRAWINGMODE).toBool()) { + this->setFlag(QGraphicsItem::ItemIsMovable, true); + QGraphicsItem::mouseMoveEvent(event); + } +} + +void PolygonView::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) +{ + this->setFlag(QGraphicsItem::ItemIsMovable, true); + m_changeCornerMode = false; + setCursor(Qt::ArrowCursor); + QGraphicsItem::mouseReleaseEvent(event); +} + +void PolygonView::hoverMoveEvent(QGraphicsSceneHoverEvent *event) +{ + if(getFirstPoint().contains(event->pos())) { + m_mouseIsOverFirstPoint = true; + } + else { + m_mouseIsOverFirstPoint = false; + } + QGraphicsItem::hoverMoveEvent(event); +} + +void PolygonView::setInclude() +{ + m_item->setRegisteredProperty(PolygonItem::P_COLOR, 0); +} + +QRectF PolygonView::getFirstPoint() const +{ + QList<ParameterizedItem *> points = m_item->childItems(); + return QRectF(points[0]->getRegisteredProperty(PointItem::P_POSX).toReal() - 2.5, + points[0]->getRegisteredProperty(PointItem::P_POSY).toReal() - 2.5, 5, 5); +} + +QPointF PolygonView::getLastPoint() const +{ + QList<ParameterizedItem *> points = m_item->childItems(); + int indexOfLastPoint = points.length() - 1; + return QPointF(points[indexOfLastPoint]->getRegisteredProperty(PointItem::P_POSX).toReal(), + points[indexOfLastPoint]->getRegisteredProperty(PointItem::P_POSY).toReal()); +} + +ParameterizedItem *PolygonView::getParameterizedItem() +{ + return m_item; +} + +void PolygonView::setParameterizedItem(ParameterizedItem *item) +{ + m_item = item; + disconnect(this, SIGNAL(xChanged()), this, SLOT(onChangedX())); + disconnect(this, SIGNAL(yChanged()), this, SLOT(onChangedY())); + connect(m_item, SIGNAL(propertyChanged(QString)), this, SLOT(onPropertyChange(QString))); +} + +void PolygonView::setExclude() +{ + m_item->setRegisteredProperty(PolygonItem::P_COLOR, 1); +} diff --git a/GUI/coregui/Views/MaskWidgets/PolygonView.h b/GUI/coregui/Views/MaskWidgets/PolygonView.h new file mode 100644 index 0000000000000000000000000000000000000000..a3a1837f8e343c83802e323c9085b308f230bea2 --- /dev/null +++ b/GUI/coregui/Views/MaskWidgets/PolygonView.h @@ -0,0 +1,85 @@ +#ifndef POLYGONVIEW_H +#define POLYGONVIEW_H + +#include "IView.h" + +class PolygonItem; +class QPainter; +class QGraphicsSceneMouseEvent; + +class PolygonView : public IView +{ + Q_OBJECT + +public: + PolygonView(); + + //! Type of this item + enum { Type = UserType + 3 }; + + //! boundingbox of this item + QRectF boundingRect() const; + + //! returns the type of this item + //! @return number of type + int type() const + { + return Type; + } + + //! polygon including an area and it's color is changing to red + void setExclude(); + + //! polygon is excluding an area and it's color is changing to blue + void setInclude(); + + //! get current polygon item + //! @return polygon item as parameterized item + ParameterizedItem *getParameterizedItem(); + + //! get current polygon item + //! @return polygon item as parameterized item + void setParameterizedItem(ParameterizedItem *item); + +protected: + //! manages mouse press events + //! @param event from scene + void mousePressEvent(QGraphicsSceneMouseEvent *event); + + //! manages mouse move events + //! @param event from scene + void mouseMoveEvent(QGraphicsSceneMouseEvent *event); + + //! manages hover events + //! @param event from scene + void mouseReleaseEvent(QGraphicsSceneMouseEvent *event); + + //! manages hover events + //! @param event from scene + void hoverMoveEvent(QGraphicsSceneHoverEvent *event); + +private: + bool m_changeCornerMode; //!< shows if someone is going to change the points from polygon + int m_indexOfCurrentSelectedPoint; //!< index from current current selected point + bool m_mouseIsOverFirstPoint; //!< shows if mouse is over the first point + ParameterizedItem *m_item; //!< polygon item + + //! first point as rectangle + //! @return first point + QRectF getFirstPoint() const; + + //! last point from polygon + //! @return last added point + QPointF getLastPoint() const; + + //! verifies if any of the points from polygon is clicked + //! @return true if a point is selected else false + bool isCornerClicked(QGraphicsSceneMouseEvent *event); + + //! calculates the bounding box of the polygon by looking for the smallest and biggest values. + QRectF calculateBoundingRectangle() const; + + //! paints polygon + void paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *); +}; +#endif diff --git a/GUI/coregui/Views/MaskWidgets/RectangleView.cpp b/GUI/coregui/Views/MaskWidgets/RectangleView.cpp new file mode 100644 index 0000000000000000000000000000000000000000..1fc260bb1e17863192164ec37645d50f3121dd05 --- /dev/null +++ b/GUI/coregui/Views/MaskWidgets/RectangleView.cpp @@ -0,0 +1,405 @@ +#include "RectangleView.h" +#include "RectangleItem.h" +#include "ParameterizedItem.h" +#include "DesignerHelper.h" +#include "RotationArrow.h" +#include "ResizeArrow.h" +#include <QPainterPath> +#include <QPainter> +#include <QGraphicsSceneMouseEvent> +#include <QDebug> +#include <cmath> +#include <QCursor> + +static const qreal widthAndHeight = 5; +static const qreal OffsetPosition = 2.5; + + +RectangleView::RectangleView() : + m_diagonalOpposedPoint(new QPointF) +{ + setFlag(QGraphicsItem::ItemIsSelectable); + setFlag(QGraphicsItem::ItemIsMovable); + setAcceptHoverEvents(true); + connect(this, SIGNAL(xChanged()), this, SLOT(onChangedX())); + connect(this, SIGNAL(yChanged()), this, SLOT(onChangedY())); +} + +void RectangleView::paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *) +{ + // paint rectangle + painter->setRenderHints(QPainter::Antialiasing); + prepareGeometryChange(); + + QRectF rectangle(m_item->getRegisteredProperty(RectangleItem::P_POSX).toReal(), + m_item->getRegisteredProperty(RectangleItem::P_POSY).toReal(), + m_item->getRegisteredProperty(RectangleItem::P_WIDTH).toReal(), + m_item->getRegisteredProperty(RectangleItem::P_HEIGHT).toReal()); + QBrush brush; + brush.setStyle(Qt::SolidPattern); + + // change color + if (m_item->getRegisteredProperty(RectangleItem::P_COLOR).toInt() == 0) { + brush.setColor(DesignerHelper::getDefaultColor("Transparant red")); + painter->setPen(brush.color().darker()); + painter->setBrush(brush); + painter->drawRect(rectangle); + + } else { + brush.setColor(DesignerHelper::getDefaultColor("Transparant blue")); + painter->setPen(brush.color().darker()); + painter->setBrush(brush); + painter->drawRect(rectangle); + } + + // paint rectangles on corners if this item is selected + if (this->isSelected()) { + painter->setBrush(painter->pen().color()); + painter->drawRect(getTopLeftCorner()); + painter->drawRect(getBottomLeftCorner()); + painter->drawRect(getTopRightCorner()); + painter->drawRect(getBottomRightCorner()); + } + + updateArrows(); +} + +QRectF RectangleView::boundingRect() const +{ + return QRectF(m_item->getRegisteredProperty(RectangleItem::P_POSX).toReal() -5, + m_item->getRegisteredProperty(RectangleItem::P_POSY).toReal() -5, + m_item->getRegisteredProperty(RectangleItem::P_WIDTH).toReal() + 10, + m_item->getRegisteredProperty(RectangleItem::P_HEIGHT).toReal() + 10); +} + +void RectangleView::setDiagonalOpposedPoint() +{ + if (m_corner == TOPLEFT) { + m_diagonalOpposedPoint->setX(getBottomRightCorner().x()); + m_diagonalOpposedPoint->setY(getBottomRightCorner().x()); + } else if (m_corner == TOPRIGHT) { + m_diagonalOpposedPoint->setX(getBottomLeftCorner().x()); + m_diagonalOpposedPoint->setY(getBottomLeftCorner().y()); + } else if (m_corner == BOTTOMLEFT) { + m_diagonalOpposedPoint->setX(getTopRightCorner().x()); + m_diagonalOpposedPoint->setY(getTopRightCorner().y()); + } else if (m_corner == BOTTOMRIGHT) { + m_diagonalOpposedPoint->setX(getTopLeftCorner().x()); + m_diagonalOpposedPoint->setY(getTopLeftCorner().y()); + } +} + +void RectangleView::calculateResize(QGraphicsSceneMouseEvent *event) +{ + qreal xmin = std::min(event->pos().x(),m_diagonalOpposedPoint->x()); + qreal xmax = std::max(event->pos().x(),m_diagonalOpposedPoint->x()); + qreal ymin = std::min(event->pos().y(),m_diagonalOpposedPoint->y()); + qreal ymax = std::max(event->pos().y(),m_diagonalOpposedPoint->y()); + + m_item->setRegisteredProperty(RectangleItem::P_WIDTH, xmax - xmin); + m_item->setRegisteredProperty(RectangleItem::P_HEIGHT, ymax - ymin); + + m_item->setRegisteredProperty(RectangleItem::P_POSX, xmin); + m_item->setRegisteredProperty(RectangleItem::P_POSY, ymin); +} + +qreal RectangleView::getRotationAngle(QGraphicsSceneMouseEvent *event) +{ + QPointF middlePoint + = mapToScene(m_item->getRegisteredProperty(RectangleItem::P_POSX).toReal() + + m_item->getRegisteredProperty(RectangleItem::P_WIDTH).toReal() / 2, + m_item->getRegisteredProperty(RectangleItem::P_POSY).toReal() + + m_item->getRegisteredProperty(RectangleItem::P_HEIGHT).toReal() / 2); + qreal lengthOfHypotenuse + = sqrt(pow(m_item->getRegisteredProperty(RectangleItem::P_WIDTH).toReal() / 2, 2) + + pow(m_item->getRegisteredProperty(RectangleItem::P_HEIGHT).toReal() / 2, 2)); + qreal offsetAngle = acos((m_item->getRegisteredProperty(RectangleItem::P_WIDTH).toReal() / 2) + / lengthOfHypotenuse) * 180 / M_PI; + qreal radians = atan((event->scenePos().y() - middlePoint.y()) + / (event->scenePos().x() - middlePoint.x())); + + if (m_corner == TOPLEFT) { + m_item->setRegisteredProperty(RectangleItem::P_ANGLE, radians * 180 / M_PI - offsetAngle); + return radians * 180 / M_PI - offsetAngle; + + } else if (m_corner == TOPRIGHT) { + m_item->setRegisteredProperty(RectangleItem::P_ANGLE, radians * 180 / M_PI + offsetAngle - 180); + return radians * 180 / M_PI + offsetAngle - 180; + + } else if (m_corner == BOTTOMLEFT) { + m_item->setRegisteredProperty(RectangleItem::P_ANGLE, radians * 180 / M_PI + offsetAngle - 180); + return radians * 180 / M_PI + offsetAngle - 180; + + } else if (m_corner == BOTTOMRIGHT) { + m_item->setRegisteredProperty(RectangleItem::P_ANGLE, radians * 180 / M_PI - offsetAngle); + return radians * 180 / M_PI - offsetAngle; + } + return 0.0; +} + +void RectangleView::mousePressEvent(QGraphicsSceneMouseEvent *event) +{ + this->setFlag(QGraphicsItem::ItemIsMovable, false); + + if (event->button() == Qt::LeftButton) { + setSelectedCorner(event->pos()); + + if (m_corner == NONE) { + this->setFlag(QGraphicsItem::ItemIsMovable, true); + m_block_mode = false; + QGraphicsItem::mousePressEvent(event); + } + else { + setDiagonalOpposedPoint(); + } + } + +} + +void RectangleView::mouseMoveEvent(QGraphicsSceneMouseEvent *event) +{ + // check which mode is active and process with the active mode + if (m_mode == RESIZE && m_corner != NONE) { + calculateResize(event); + m_block_mode = true; + } else if (m_corner != NONE && m_mode == ROTATION) { + QTransform transform; + transform.translate(m_item->getRegisteredProperty(RectangleItem::P_POSX).toReal() + + m_item->getRegisteredProperty(RectangleItem::P_WIDTH).toReal() * 0.5, + m_item->getRegisteredProperty(RectangleItem::P_POSY).toReal() + + m_item->getRegisteredProperty(RectangleItem::P_HEIGHT).toReal() * 0.5); + transform.rotate(getRotationAngle(event)); + transform.translate(-(m_item->getRegisteredProperty(RectangleItem::P_POSX).toReal() + + m_item->getRegisteredProperty(RectangleItem::P_WIDTH).toReal() * 0.5), + -(m_item->getRegisteredProperty(RectangleItem::P_POSY).toReal() + + m_item->getRegisteredProperty(RectangleItem::P_HEIGHT).toReal() * 0.5)); + setTransform(transform); + m_block_mode = true; + +// process as usual + } else { + this->setFlag(QGraphicsItem::ItemIsMovable, true); + m_block_mode = false; + QGraphicsItem::mouseMoveEvent(event); + } +} + +void RectangleView::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) +{ + if(!m_block_mode && m_corner == NONE) { + if ((m_mode == RESIZE)) { + m_mode = ROTATION; + } else if ((m_mode == ROTATION)) { + m_mode = RESIZE; + } + } + m_block_mode = false; + m_corner = NONE; + setCursor(Qt::ArrowCursor); + QGraphicsItem::mouseReleaseEvent(event); +} + +void RectangleView::hoverMoveEvent(QGraphicsSceneHoverEvent *event) +{ + setSelectedCorner(event->pos()); + m_corner = NONE; +} + +void RectangleView::setInclude() +{ + m_item->setRegisteredProperty(RectangleItem::P_COLOR, 0); +} + +void RectangleView::setExclude() +{ + m_item->setRegisteredProperty(RectangleItem::P_COLOR, 1); +} + + +QRectF RectangleView::getTopLeftCorner() +{ + return QRectF(m_item->getRegisteredProperty(RectangleItem::P_POSX).toReal() - OffsetPosition, + m_item->getRegisteredProperty(RectangleItem::P_POSY).toReal() - OffsetPosition, + widthAndHeight, widthAndHeight); +} + +QRectF RectangleView::getTopRightCorner() +{ + return QRectF(m_item->getRegisteredProperty(RectangleItem::P_POSX).toReal() + + m_item->getRegisteredProperty(RectangleItem::P_WIDTH).toReal() - OffsetPosition, + m_item->getRegisteredProperty(RectangleItem::P_POSY).toReal() - OffsetPosition, + widthAndHeight, widthAndHeight); +} + +QRectF RectangleView::getBottomLeftCorner() +{ + return QRectF(m_item->getRegisteredProperty(RectangleItem::P_POSX).toReal() - OffsetPosition, + m_item->getRegisteredProperty(RectangleItem::P_POSY).toReal() + + m_item->getRegisteredProperty(RectangleItem::P_HEIGHT).toReal() - OffsetPosition, + widthAndHeight, widthAndHeight); +} + +QRectF RectangleView::getBottomRightCorner() +{ + return QRectF(m_item->getRegisteredProperty(RectangleItem::P_POSX).toReal() + + m_item->getRegisteredProperty(RectangleItem::P_WIDTH).toReal() - OffsetPosition, + m_item->getRegisteredProperty(RectangleItem::P_POSY).toReal() + + m_item->getRegisteredProperty(RectangleItem::P_HEIGHT).toReal() - OffsetPosition, + widthAndHeight, widthAndHeight); +} + +void RectangleView::setParameterizedItem(ParameterizedItem *item) +{ + m_item = item; + setRotation(m_item->getRegisteredProperty(RectangleItem::P_ANGLE).toReal()); + connect(m_item, SIGNAL(propertyChanged(const QString &)), this, + SLOT(onPropertyChange(const QString &))); + initializeArrows(); +} + +void RectangleView::onChangedX() +{ + m_block_mode = true; +} + +void RectangleView::onChangedY() +{ + m_block_mode = true; +} + +void RectangleView::onPropertyChange(const QString &propertyName) +{ + if(propertyName == RectangleItem::P_POSX) { + m_block_mode = true; + } + else if(propertyName == RectangleItem::P_POSY) { + m_block_mode = true; + } + else if(propertyName == RectangleItem::P_ANGLE) { + QTransform transform; + transform.translate(m_item->getRegisteredProperty(RectangleItem::P_POSX).toReal() + + m_item->getRegisteredProperty(RectangleItem::P_WIDTH).toReal() * 0.5, + m_item->getRegisteredProperty(RectangleItem::P_POSY).toReal() + + m_item->getRegisteredProperty(RectangleItem::P_HEIGHT).toReal() * 0.5); + transform.rotate(m_item->getRegisteredProperty(RectangleItem::P_ANGLE).toReal()); + transform.translate(-(m_item->getRegisteredProperty(RectangleItem::P_POSX).toReal() + + m_item->getRegisteredProperty(RectangleItem::P_WIDTH).toReal() * 0.5), + -(m_item->getRegisteredProperty(RectangleItem::P_POSY).toReal() + + m_item->getRegisteredProperty(RectangleItem::P_HEIGHT).toReal() * 0.5)); + setTransform(transform); + } +} + +ParameterizedItem *RectangleView::getParameterizedItem() +{ + return m_item; +} + +void RectangleView::setSelectedCorner(QPointF currentMousePosition) +{ + if (getTopLeftCorner().contains(currentMousePosition)) { + qDebug() << "TOPLEFT"; + m_corner = TOPLEFT; + if(m_mode == RESIZE) + setCursor(Qt::SizeFDiagCursor); + } else if (getTopRightCorner().contains(currentMousePosition)) { + qDebug() << "TOPRIGHT"; + m_corner = TOPRIGHT; + if(m_mode == RESIZE) + setCursor(Qt::SizeBDiagCursor); + } else if (getBottomLeftCorner().contains(currentMousePosition)) { + qDebug() << "BOTTOMLEFT"; + m_corner = BOTTOMLEFT; + if(m_mode == RESIZE) + setCursor(Qt::SizeBDiagCursor); + } else if (getBottomRightCorner().contains(currentMousePosition)) { + qDebug() << "BOTTOMRIGHT"; + m_corner = BOTTOMRIGHT; + if(m_mode == RESIZE) + setCursor(Qt::SizeFDiagCursor); + } else { + m_corner = NONE; + setCursor(QCursor()); + } + + if (m_mode == ROTATION && m_corner != NONE) { + setCursor(QCursor(QPixmap(":/images/rotationArrow.png"))); + } +} + +void RectangleView::updateArrows() +{ + // 0 - 3 are rotation arrows + childItems()[0]->setPos(getTopLeftCorner().x(), getTopLeftCorner().y()); + childItems()[1]->setPos(getTopRightCorner().x(), getTopRightCorner().y()); + childItems()[2]->setPos(getBottomLeftCorner().x(), getBottomLeftCorner().y()); + childItems()[3]->setPos(getBottomRightCorner().x(), getBottomRightCorner().y()); + + // 4 - 7 are resize arrows + childItems()[4]->setPos(getTopLeftCorner().x(), getTopLeftCorner().y()); + childItems()[5]->setPos(getTopRightCorner().x(), getTopRightCorner().y()); + childItems()[6]->setPos(getBottomLeftCorner().x(), getBottomLeftCorner().y()); + childItems()[7]->setPos(getBottomRightCorner().x(), getBottomRightCorner().y()); + + + if(isSelected() == false) { + for(int i = 0; i < childItems().length(); ++i) { + childItems()[i]->setVisible(false); + } + + } + else if(m_mode == RESIZE) { + for(int i = 0; i < childItems().length(); ++i) { + if(i < 4) { + childItems()[i]->setVisible(false); + } + else { + childItems()[i]->setVisible(true); + } + } + } else if(m_mode == ROTATION) { + for(int i = 0; i < childItems().length(); ++i) { + if(i < 4) { + childItems()[i]->setVisible(true); + } + else { + childItems()[i]->setVisible(false); + } + } + } +} + +void RectangleView::initializeArrows() +{ + RotationArrow *topLeftRotationArrow = new RotationArrow(this); + RotationArrow *topRightRotationArrow = new RotationArrow(this); + RotationArrow *bottomLeftRotationArrow = new RotationArrow(this); + RotationArrow *bottomRightRotationArrow = new RotationArrow(this); + + ResizeArrow *topLeftResizeArrow = new ResizeArrow(this); + ResizeArrow *topRightResizeArrow = new ResizeArrow(this); + ResizeArrow *bottomLeftResizeArrow = new ResizeArrow(this); + ResizeArrow *bottomRightResizeArrow = new ResizeArrow(this); + + + topRightRotationArrow->setRotation(90); + bottomLeftRotationArrow->setRotation(270); + bottomRightRotationArrow->setRotation(180); + + topRightResizeArrow->setRotation(90); + bottomLeftResizeArrow->setRotation(270); + bottomRightResizeArrow->setRotation(180); + + topRightRotationArrow->setVisible(false); + topLeftRotationArrow->setVisible(false); + bottomLeftRotationArrow->setVisible(false); + bottomRightRotationArrow->setVisible(false); + + topRightResizeArrow->setVisible(false); + topLeftResizeArrow->setVisible(false); + bottomLeftResizeArrow->setVisible(false); + bottomRightResizeArrow->setVisible(false); +} + + + diff --git a/GUI/coregui/Views/MaskWidgets/RectangleView.h b/GUI/coregui/Views/MaskWidgets/RectangleView.h new file mode 100644 index 0000000000000000000000000000000000000000..fdb662d2c57849259c4f8aa3e89715bbd3828ac5 --- /dev/null +++ b/GUI/coregui/Views/MaskWidgets/RectangleView.h @@ -0,0 +1,129 @@ +#ifndef RECTANGLEVIEW_H +#define RECTANGLEVIEW_H + +#include "IView.h" + +class QPainter; +class ParameterizedItem; +class QGraphicsSceneMouseEvent; +class QPointF; + +class RectangleView : public IView +{ + Q_OBJECT + +public: + RectangleView(); + + //! describes the corners + enum Corner { NONE, TOPLEFT, TOPRIGHT, BOTTOMLEFT, BOTTOMRIGHT }; + + //! current active mode + enum Mode { ROTATION, RESIZE }; + + //! Type of this item + enum { Type = UserType + 1 }; + + //! boundingbox of this item + QRectF boundingRect() const; + + //! returns the type of this item + //! @return number of type + int type() const + { + return Type; + } + + //! rectangle is including an area and it's color is changing to red + void setInclude(); + + //! rectangle is excluding an area and it's color is changing to blue + void setExclude(); + + //! get current rectangle item + //! @return rectangle item as parameterized item + ParameterizedItem *getParameterizedItem(); + + //! set rectangle item + //! @param rectangle item to be drawn + void setParameterizedItem(ParameterizedItem *item); + +public slots: + //! called when x-value changed + void onChangedX(); + + //! called when x-value changed + void onChangedY(); + + //! called when property of rectangle changed + void onPropertyChange(const QString &propertyName); + +protected: + //! paintEvent paints Rectangle and corners + void paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *); + + //! manages mouse press events + //! @param event from scene + void mousePressEvent(QGraphicsSceneMouseEvent *event); + + //! manages mouse move events + //! @param event from scene + void mouseMoveEvent(QGraphicsSceneMouseEvent *event); + + //! manages mouse release events + //! @param event from scene + void mouseReleaseEvent(QGraphicsSceneMouseEvent *event); + + //! manages hover events + //! @param event from scene + void hoverMoveEvent(QGraphicsSceneHoverEvent *event); + +private: + ParameterizedItem *m_item; //!< rectangle item + Corner m_corner; //!< enum with all corners + Mode m_mode; //!< current active mode + bool m_block_mode; //!< blocking modes from changing + QPointF *m_diagonalOpposedPoint; //!< diagonally opposite point from current selected corner + + //! set diagonally opposite point from current selected corner + void setDiagonalOpposedPoint(); + + //! @return diagonally opposite point from current selected corner + QPointF getDiagonalOpposedPoint(); + + //! calculates resized rectangle + //! @param event to receive current mouse position + void calculateResize(QGraphicsSceneMouseEvent *event); + + //! calculates angle for rotation + //! @return angle between selected corner and mouse + //! @param event to receive current mouse position + qreal getRotationAngle(QGraphicsSceneMouseEvent *event); + + //! verfies clicked corner + //! @param current mouse position + void setSelectedCorner(QPointF currentMousePosition); + + //! updates all arrows; + void updateArrows(); + + //! initialize all arrows + void initializeArrows(); + + //! returns corner of rectangle + //! @return top left corner + QRectF getTopLeftCorner(); + + //! returns corner of rectangle + //! @return top right corner + QRectF getTopRightCorner(); + + //! returns corner of rectangle + //! @return bottom left corner + QRectF getBottomLeftCorner(); + + //! returns corner of rectangle + //! @return bottom right corner + QRectF getBottomRightCorner(); +}; +#endif diff --git a/GUI/coregui/Views/MaskWidgets/ResizeArrow.cpp b/GUI/coregui/Views/MaskWidgets/ResizeArrow.cpp new file mode 100644 index 0000000000000000000000000000000000000000..45d89d9a5a4b57df62b06be0dc88ed3eb6cbf840 --- /dev/null +++ b/GUI/coregui/Views/MaskWidgets/ResizeArrow.cpp @@ -0,0 +1,42 @@ +#include "ResizeArrow.h" +#include <QPainter> + + +ResizeArrow::ResizeArrow(QGraphicsItem *parent) +{ + this->setParentItem(parent); +} + +QRectF ResizeArrow::boundingRect() const +{ + return QRect(-25,-25,20,20); +} + + +void ResizeArrow::paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *) +{ + painter->setRenderHints(QPainter::Antialiasing); + prepareGeometryChange(); + + QPainterPath upperArrowHead; + upperArrowHead.moveTo(-20, -20); + upperArrowHead.lineTo(-17.5, -12.5); + upperArrowHead.lineTo(-12.5, -17.5); + upperArrowHead.lineTo(-20, -20); + painter->fillPath(upperArrowHead, Qt::black); + + QPainterPath lowerArrowHead; + lowerArrowHead.moveTo(-7.5, -7.5); + lowerArrowHead.lineTo(-10, -15); + lowerArrowHead.lineTo(-15, -10); + lowerArrowHead.lineTo(-7.5, -7.5); + painter->fillPath(lowerArrowHead, Qt::black); + + QPen pen; + pen.setWidth(2); + painter->setPen(pen); + painter->drawLine(QPointF(-17.5, -17.5), QPointF(-10,-10)); + + + +} diff --git a/GUI/coregui/Views/MaskWidgets/ResizeArrow.h b/GUI/coregui/Views/MaskWidgets/ResizeArrow.h new file mode 100644 index 0000000000000000000000000000000000000000..42bb2bab4325674b800923d1d3ceee54a0b6c5db --- /dev/null +++ b/GUI/coregui/Views/MaskWidgets/ResizeArrow.h @@ -0,0 +1,22 @@ +#ifndef RESIZEARROW_H +#define RESIZEARROW_H + +#include <QGraphicsItem> + +class ResizeArrow : public QGraphicsItem +{ +public: + ResizeArrow(QGraphicsItem *parent = 0); + + //! bounding box of rectangle + QRectF boundingRect() const; + +protected: + //! paintEvent paints Rectangle and corners + void paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *); +}; + + + + +#endif diff --git a/GUI/coregui/Views/MaskWidgets/RotationArrow.cpp b/GUI/coregui/Views/MaskWidgets/RotationArrow.cpp new file mode 100644 index 0000000000000000000000000000000000000000..f0317755df4747203e0390efebf794d80059999e --- /dev/null +++ b/GUI/coregui/Views/MaskWidgets/RotationArrow.cpp @@ -0,0 +1,44 @@ +#include "RotationArrow.h" +#include <QPainter> + + +RotationArrow::RotationArrow(QGraphicsItem *parent) +{ + this->setParentItem(parent); +} + +QRectF RotationArrow::boundingRect() const +{ + return QRect(-25,-25,15,15); +} + + +void RotationArrow::paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *) +{ + painter->setRenderHints(QPainter::Antialiasing); + prepareGeometryChange(); + QPen pen; + + QPainterPath lineBetweenArrowHeads; + lineBetweenArrowHeads.arcMoveTo(-20,-20,10,10,90); + lineBetweenArrowHeads.arcTo(-20,-20,10,10,90, 90); + pen.setWidth(2); + painter->setPen(pen); + painter->drawPath(lineBetweenArrowHeads); + pen.setWidth(1); + painter->setPen(pen); + + + QPainterPath upperArrowHead; + upperArrowHead.moveTo(-15, -25); + upperArrowHead.lineTo(-15, -15); + upperArrowHead.lineTo(-10, -20); + painter->fillPath(upperArrowHead, Qt::black); + + QPainterPath lowerArrowHead; + lowerArrowHead.moveTo(-25, -15); + lowerArrowHead.lineTo(-15, -15); + lowerArrowHead.lineTo(-20, -10); + painter->fillPath(lowerArrowHead, Qt::black); + +} diff --git a/GUI/coregui/Views/MaskWidgets/RotationArrow.h b/GUI/coregui/Views/MaskWidgets/RotationArrow.h new file mode 100644 index 0000000000000000000000000000000000000000..1b62dd4790de5bc208b899d26c4ba7cfebd9fe62 --- /dev/null +++ b/GUI/coregui/Views/MaskWidgets/RotationArrow.h @@ -0,0 +1,22 @@ +#ifndef ROTATIONARROW_H +#define ROTATIONARROW_H + +#include <QGraphicsItem> + +class RotationArrow : public QGraphicsItem +{ +public: + RotationArrow(QGraphicsItem *parent = 0); + + //! bounding box of rectangle + QRectF boundingRect() const; + +protected: + //! paintEvent paints Rectangle and corners + void paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *); +}; + + + + +#endif diff --git a/GUI/coregui/Views/Rectangle.cpp b/GUI/coregui/Views/Rectangle.cpp new file mode 100644 index 0000000000000000000000000000000000000000..58acf5497eeee189200a8c20e605ece43d40de09 --- /dev/null +++ b/GUI/coregui/Views/Rectangle.cpp @@ -0,0 +1,272 @@ + +#include "Rectangle.h" +#include <iostream> +#include <cmath> + +Rectangle::Rectangle(qreal posX, qreal posY, qreal width, qreal heigth) + : m_posX(posX), m_posY(posY), m_width(width), m_heigth(heigth), + m_topLeftCorner(QRectF (m_posX - 5, m_posY - 5, 10, 10)), + m_bottomLeftCorner(QRectF (m_posX + m_width - 5, m_posY - 5, 10, 10)), + m_topRightCorner(QRectF (m_posX + m_width - 5, m_posY - 5, 10, 10)), + m_bottomRightCorner(QRectF (m_posX + m_width - 5, m_posY + m_heigth - 5, 10, 10)), + m_resizeMode(false), m_rotationMode(false) +{ + this->setFlag(QGraphicsItem::ItemIsSelectable); + this->setFlag(QGraphicsItem::ItemIsMovable); +} + +void Rectangle::paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *) +{ + + // paint rectangle + painter->setRenderHints(QPainter::Antialiasing); + this->prepareGeometryChange(); + if(m_color == INCLUDE) { + QBrush transRed(QColor(0xFF, 0, 0, 0x80)); + painter->fillRect(m_posX, m_posY, m_width, m_heigth,transRed); + } + else { + QBrush transBlue(QColor(0, 0, 0xFF, 0x80)); + painter->fillRect(m_posX, m_posY, m_width, m_heigth,transBlue); + } + + // paint corner rectangles only if this item is selected + if (this->isSelected()) { + + // set values for corners + m_topLeftCorner.setRect(m_posX - 5, m_posY - 5, 10, 10); + m_bottomLeftCorner.setRect(m_posX - 5, m_posY + m_heigth - 5, 10, 10); + m_topRightCorner.setRect(m_posX + m_width - 5, m_posY - 5, 10, 10); + m_bottomRightCorner.setRect(m_posX + m_width - 5, m_posY + m_heigth - 5, 10, 10); + + painter->setBrush(Qt::green); + painter->drawRect(m_topLeftCorner); + painter->drawRect(m_topRightCorner); + painter->drawRect(m_bottomLeftCorner); + painter->drawRect(m_bottomRightCorner); + } +} + +QRectF Rectangle::boundingRect() const +{ + return QRectF(m_posX - 10, m_posY - 10, m_width + 20, m_heigth + 20); +} + +void Rectangle::checkResizeRules(QGraphicsSceneMouseEvent *event) +{ + if (m_corner == TOPLEFT) { + if (m_posX + m_width <= event->pos().x()) { + m_corner = TOPRIGHT; + setCursor(Qt::SizeBDiagCursor); + + } else if (m_posY + m_heigth <= event->pos().y()) { + m_corner = BOTTOMLEFT; + setCursor(Qt::SizeBDiagCursor); + } + } else if (m_corner == TOPRIGHT) { + if (event->pos().x() <= m_posX) { + m_corner = TOPLEFT; + setCursor(Qt::SizeFDiagCursor); + + } else if (m_posY + m_heigth <= event->pos().y()) { + m_corner = BOTTOMRIGHT; + setCursor(Qt::SizeFDiagCursor); + } + } else if (m_corner == BOTTOMLEFT) { + if (m_posX + m_width <= event->pos().x()) { + m_corner = BOTTOMRIGHT; + setCursor(Qt::SizeFDiagCursor); + + } else if (event->pos().y() <= m_posY) { + m_corner = TOPLEFT; + setCursor(Qt::SizeFDiagCursor); + } + } else if (m_corner == BOTTOMRIGHT) { + if (event->pos().x() <= m_posX) { + m_corner = BOTTOMLEFT; + setCursor(Qt::SizeBDiagCursor); + + } else if (event->pos().y() <= m_posY) { + m_corner = TOPRIGHT; + setCursor(Qt::SizeBDiagCursor); + } + } +} + +void Rectangle::calculateResize(QGraphicsSceneMouseEvent *event) +{ + this->setFlag(QGraphicsItem::ItemIsMovable, false); + checkResizeRules(event); + + if (m_corner == TOPLEFT) { + m_width = m_posX + m_width - event->pos().x(); + m_heigth = m_posY + m_heigth - event->pos().y(); + m_posX = event->pos().x(); + m_posY = event->pos().y(); + + } else if (m_corner == BOTTOMLEFT) { + m_width = m_posX + m_width - event->pos().x(); + m_heigth = event->pos().y() - m_posY; + m_posX = event->pos().x(); + + } else if (m_corner == TOPRIGHT) { + m_width = event->pos().x() - m_posX; + m_heigth = m_posY + m_heigth - event->pos().y(); + m_posY = event->pos().y(); + } + + else if (m_corner == BOTTOMRIGHT) { + m_width = event->pos().x() - m_posX; + m_heigth = event->pos().y() - m_posY; + } +} + +qreal Rectangle::calculateRotation(QGraphicsSceneMouseEvent *event) +{ + qreal lengthOfHypotenuse = sqrt(pow(m_width / 2, 2) + pow(m_heigth / 2, 2)); + qreal offsetAngle = acos((m_width / 2) / lengthOfHypotenuse) * 180 / M_PI; + qreal radians = atan( + (event->scenePos().y() - this->mapToScene(m_posX + m_width / 2, m_posY + m_heigth / 2).y()) + / (event->scenePos().x() + - this->mapToScene(m_posX + m_width / 2, m_posY + m_heigth / 2).x())); + + if (m_corner == TOPLEFT) { + return radians * 180 / M_PI - offsetAngle; + + } else if (m_corner == TOPRIGHT) { + return radians * 180 / M_PI + offsetAngle - 180; + + } else if (m_corner == BOTTOMLEFT) { + return radians * 180 / M_PI + offsetAngle - 180; + + } else if (m_corner == BOTTOMRIGHT) { + return radians * 180 / M_PI - offsetAngle; + } + return 0; +} + +void Rectangle::setWidth(qreal width) +{ + m_width = width; +} + +void Rectangle::setHeigth(qreal heigth) +{ + m_heigth = heigth; +} + +void Rectangle::mousePressEvent(QGraphicsSceneMouseEvent *event) +{ + this->setFlag(QGraphicsItem::ItemIsMovable, false); + + //if one of the corners is clicked then go in to resize Mode + if (event->button() == Qt::LeftButton && m_topLeftCorner.contains(event->pos())) { + m_resizeMode = true; + m_corner = TOPLEFT; + setCursor(Qt::SizeFDiagCursor); + + } else if (event->button() == Qt::LeftButton && m_bottomLeftCorner.contains(event->pos())) { + m_resizeMode = true; + m_corner = BOTTOMLEFT; + setCursor(Qt::SizeBDiagCursor); + + } else if (event->button() == Qt::LeftButton && m_topRightCorner.contains(event->pos())) { + m_resizeMode = true; + m_corner = TOPRIGHT; + setCursor(Qt::SizeBDiagCursor); + } + + else if (event->button() == Qt::LeftButton && m_bottomRightCorner.contains(event->pos())) { + m_resizeMode = true; + m_corner = BOTTOMRIGHT; + setCursor(Qt::SizeFDiagCursor); + + // process as usual + } else { + this->setFlag(QGraphicsItem::ItemIsMovable, true); + QGraphicsItem::mousePressEvent(event); + } +} + +void Rectangle::mouseMoveEvent(QGraphicsSceneMouseEvent *event) +{ + //check which mode is active and process with the active mode + if (m_corner != NONE && m_resizeMode) { + calculateResize(event); + + } else if (m_corner != NONE && m_rotationMode) { + QTransform transform; + transform.translate(m_posX + m_width * 0.5, m_posY + m_heigth * 0.5); + transform.rotate(calculateRotation(event)); + transform.translate(-(m_posX + m_width * 0.5), -(m_posY + m_heigth * 0.5)); + setTransform(transform); + + // process as usual + } else { + this->setFlag(QGraphicsItem::ItemIsMovable, true); + QGraphicsItem::mouseMoveEvent(event); + } +} + +void Rectangle::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) +{ + // set all modes off, change cursor and process as usual + this->setFlag(QGraphicsItem::ItemIsMovable, true); + m_resizeMode = false; + m_rotationMode = false; + setCursor(Qt::ArrowCursor); + QGraphicsItem::mouseReleaseEvent(event); +} + +void Rectangle::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event) +{ + //activate rotation mode + if (event->button() == Qt::LeftButton && m_topLeftCorner.contains(event->pos())) { + m_resizeMode = false; + m_rotationMode = true; + m_corner = TOPLEFT; + this->setFlag(QGraphicsItem::ItemIsMovable, false); + setCursor(Qt::ClosedHandCursor); + + } else if (event->button() == Qt::LeftButton && m_bottomLeftCorner.contains(event->pos())) { + m_resizeMode = false; + m_rotationMode = true; + m_corner = BOTTOMLEFT; + this->setFlag(QGraphicsItem::ItemIsMovable, false); + setCursor(Qt::ClosedHandCursor); + + } else if (event->button() == Qt::LeftButton && m_topRightCorner.contains(event->pos())) { + m_resizeMode = false; + m_rotationMode = true; + m_corner = TOPRIGHT; + this->setFlag(QGraphicsItem::ItemIsMovable, false); + setCursor(Qt::ClosedHandCursor); + } + + else if (event->button() == Qt::LeftButton && m_bottomRightCorner.contains(event->pos())) { + m_resizeMode = false; + m_rotationMode = true; + m_corner = BOTTOMRIGHT; + this->setFlag(QGraphicsItem::ItemIsMovable, false); + setCursor(Qt::ClosedHandCursor); + + } else { + m_resizeMode = false; + m_rotationMode = false; + this->setFlag(QGraphicsItem::ItemIsMovable, true); + QGraphicsItem::mouseDoubleClickEvent(event); + } +} + +void Rectangle::setInclude() +{ + m_color = INCLUDE; + update(); +} + +void Rectangle::setExclude() +{ + m_color = EXCLUDE; + update(); +} + diff --git a/GUI/coregui/Views/Rectangle.h b/GUI/coregui/Views/Rectangle.h new file mode 100644 index 0000000000000000000000000000000000000000..c1e2111711e436f779037406a32bb921c6ad2eab --- /dev/null +++ b/GUI/coregui/Views/Rectangle.h @@ -0,0 +1,73 @@ + +#include <QWidget> +#include <QGraphicsProxyWidget> +#include <QGraphicsItem> +#include <QGraphicsScene> +#include "DistributionEditor.h" +#include <QGraphicsView> +#include <QPainterPath> + +#ifndef RECTANGLE_H +#define RECTANGLE_H + +class Rectangle : public QGraphicsItem +{ + +public: + //! describes corner + enum Corner { NONE, TOPLEFT, TOPRIGHT, BOTTOMLEFT, BOTTOMRIGHT }; + enum {Type = UserType + 1}; + enum Color {INCLUDE, EXCLUDE}; + + //! create Rectangle + //! @param posX x position in scene + //! @param posY y position in scene + //! @param width of rectangle + //! @param heigth of rectangle + Rectangle(qreal posX, qreal poxY, qreal width, qreal heigth); + + //! bounding box of rectangle + QRectF boundingRect() const; + + //! check if resize rules are correct + //! @param event mouse event to check if resizes correct + void checkResizeRules(QGraphicsSceneMouseEvent *event); + + //! calculates resized rectangle + //! @param event mouse event to set new coordinates + void calculateResize(QGraphicsSceneMouseEvent *event); + + //! calculates rotated rectangle + //! @param event mouse event to set new coordinates + //! @return degree of rotation + qreal calculateRotation(QGraphicsSceneMouseEvent *event); + + int type() const {return Type;} + + void setHeigth(qreal heigth); + void setWidth(qreal width); + void setInclude(); + void setExclude(); +protected: + //! paintEvent paints Rectangle and corners + void paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *); + void mousePressEvent(QGraphicsSceneMouseEvent *event); + void mouseMoveEvent(QGraphicsSceneMouseEvent *event); + void mouseReleaseEvent(QGraphicsSceneMouseEvent *event); + void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event); + +private: + qreal m_posX; //!< x position of rectangle + qreal m_posY; //!< y position of rectangle + qreal m_width; //!< width of rectangle + qreal m_heigth; //!< height of rectangle + QRectF m_topLeftCorner; //!< rectangle in the top left corner + QRectF m_bottomLeftCorner; //!< rectangle in the bottom left corner + QRectF m_topRightCorner; //!< rectangle in the top right corner + QRectF m_bottomRightCorner; //!< rectangle in the bottom right corner + bool m_resizeMode; //!< activates resize mode + bool m_rotationMode; //!< activiates rotation mode + Corner m_corner; //!< enum with all corners + Color m_color; //!< current color +}; +#endif diff --git a/GUI/coregui/Views/SampleDesigner/DesignerHelper.cpp b/GUI/coregui/Views/SampleDesigner/DesignerHelper.cpp index e1c9ff94b56eaf231283ed53d81d0a164027d8bd..2abaf275af2bebe33a33481a4d887abdb8bed67a 100644 --- a/GUI/coregui/Views/SampleDesigner/DesignerHelper.cpp +++ b/GUI/coregui/Views/SampleDesigner/DesignerHelper.cpp @@ -185,7 +185,14 @@ QColor DesignerHelper::getDefaultColor(const QString &name) return QColor(210, 223, 237); } else if (name.startsWith("InterferenceFunction")) { return QColor(255, 236, 139); - } else { + } + else if(name == "Transparant red") { + return QColor(0xFF, 0, 0, 0x80); + } + else if(name == "Transparant blue") { + return QColor(0, 0, 0xFF, 0x80); + } + else { return QColor(Qt::lightGray); } } diff --git a/GUI/coregui/Views/SampleDesigner/SampleViewFactory.cpp b/GUI/coregui/Views/SampleDesigner/SampleViewFactory.cpp index 37f83912107f2ba812ca358ecd74912760a458aa..1b7da53d783434bbbb01a8143b72d7f52c19ac14 100644 --- a/GUI/coregui/Views/SampleDesigner/SampleViewFactory.cpp +++ b/GUI/coregui/Views/SampleDesigner/SampleViewFactory.cpp @@ -25,6 +25,9 @@ #include "ParticleDistributionView.h" #include "InterferenceFunctionViews.h" #include "GUIHelpers.h" +#include "RectangleView.h" +#include "EllipseView.h" +#include "PolygonView.h" #include <QDebug> @@ -39,7 +42,8 @@ QStringList SampleViewFactory::m_valid_item_names = QStringList() << Constants::ParticleDistributionType << Constants::InterferenceFunctionRadialParaCrystalType << Constants::InterferenceFunction2DParaCrystalType - << Constants::InterferenceFunction2DLatticeType; + << Constants::InterferenceFunction2DLatticeType + << Constants::RectangleType; bool SampleViewFactory::isValidItemName(const QString &name) @@ -87,6 +91,15 @@ IView *SampleViewFactory::createSampleView(const QString &name) else if (name==Constants::InterferenceFunction2DLatticeType) { return new InterferenceFunction2DLatticeView(); } + else if(name==Constants::RectangleType) { + return new RectangleView(); + } + else if(name==Constants::EllipseType) { + return new EllipseView(); + } + else if(name==Constants::PolygonType) { + return new PolygonView(); + } else { //qDebug() << "SampleViewFactory::createSampleView() -> Error! Can't create a view for" << name; throw GUIHelpers::Error("SampleViewFactory::createSampleView() -> Error! Can't create a view for " + name); diff --git a/GUI/coregui/Views/TestView.cpp b/GUI/coregui/Views/TestView.cpp index 7c7e6944cbf8f45000e685cc7d9e1347292074b6..d44d0553ff875d30017bd56765939d4c46d08b0f 100644 --- a/GUI/coregui/Views/TestView.cpp +++ b/GUI/coregui/Views/TestView.cpp @@ -13,6 +13,7 @@ // // ************************************************************************** // + #include "TestView.h" #include "TestItem.h" #include "LayerItem.h" @@ -24,62 +25,93 @@ #include <QDebug> #include "DistributionEditor.h" #include "qgroupbox.h" +#include "MaskEditor.h" +#include "MaskModel.h" +#include "RectangleItem.h" +#include "Rectangle.h" + TestView::TestView(QWidget *parent) : QWidget(parent) - , m_item(0) +// , m_item(0) { - setMinimumSize(128, 128); - setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); + setMouseTracking(true); -// BeamWavelengthItem *item = new BeamWavelengthItem; -// DistributionEditor *distributionEditor = new DistributionEditor; -// distributionEditor->setItem(item); -// m_propertyEditor = new AwesomePropertyEditor(this); +// QGraphicsScene *scene = new QGraphicsScene; +// QGraphicsPolygonItem *polygonItem = new QGraphicsPolygonItem( +// QPolygonF(QVector<QPointF>() << QPointF(10, 10) << QPointF(0, 90) << QPointF(40, 70) +// << QPointF(80, 110) << QPointF(70, 20)),0); +// polygonItem->setPen(QPen(Qt::darkGreen)); +// polygonItem->setBrush(Qt::transparent); +// this->setScene(scene); +// scene->itemsBoundingRect(); - // main layout - QVBoxLayout *mainLayout = new QVBoxLayout; +// DistributionEditor *editor = new DistributionEditor; +// editor->setItem(new BeamWavelengthItem); +// editor->resize(800,600); +// GraphicsProxyWidget *widget = new GraphicsProxyWidget; +// widget->setWidget(editor); +// scene->addItem(widget); -// mainLayout->addWidget(m_propertyEditor); -// mainLayout->addWidget(distributionEditor); - setLayout(mainLayout); -} +// Rectangle *rectangle = new Rectangle(0,0,200,200); +// scene->addItem(rectangle); +// rectangle->setFlag(QGraphicsItem::ItemIsMovable); + + +// polygonItem->setFlag(QGraphicsItem::ItemIsMovable); +// Ellipse *ellipse = new Ellipse(0,0,100,50); +// scene->addItem(ellipse); +// ellipse->setFlag(QGraphicsItem::ItemIsMovable); -//TestView::TestView(QWidget *parent) -// : QWidget(parent) -//{ -// setMinimumSize(128, 128); -// setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); + MaskModel *maskModel = new MaskModel; +// ParameterizedItem *rectangle1 = maskModel->insertNewItem(Constants::RectangleType); +// rectangle1->setRegisteredProperty(RectangleItem::P_WIDTH, 100.0); +// rectangle1->setRegisteredProperty(RectangleItem::P_HEIGHT, 200.0); +// rectangle1->setItemName("rect1"); +// ParameterizedItem *rectangle2 = maskModel->insertNewItem(Constants::RectangleType); +// rectangle2->setRegisteredProperty(RectangleItem::P_WIDTH, 120.0); +// rectangle2->setRegisteredProperty(RectangleItem::P_HEIGHT, 220.0); +// rectangle2->setItemName("rect2"); +// ParameterizedItem *rectangle3 = maskModel->insertNewItem(Constants::RectangleType); +// rectangle3->setRegisteredProperty(RectangleItem::P_WIDTH, 120.0); +// rectangle3->setRegisteredProperty(RectangleItem::P_HEIGHT, 220.0); +// rectangle3->setItemName("rect3"); -// QGroupBox *groupBox = new QGroupBox("Beam Parameters"); -// QVBoxLayout *groupLayout = new QVBoxLayout; -// groupBox->setLayout(groupLayout); -// // whole content is represented as grid layout -// QGridLayout *gridLayout = new QGridLayout; +// QModelIndex itemIndex = maskModel->index(1, 0, QModelIndex()); +// ParameterizedItem *item = maskModel->itemForIndex(itemIndex); +// maskModel->moveParameterizedItem(item, 0, 3); -// AwesomePropertyEditor *editor1 = new AwesomePropertyEditor(this); -// editor1->setMinimumSize(256, 256); -// AwesomePropertyEditor *editor2 = new AwesomePropertyEditor(this, AwesomePropertyEditor::BROWSER_GROUPBOX_TYPE); +// for (int i_row = 0; i_row < maskModel->rowCount(QModelIndex()); ++i_row) { +// QModelIndex itemIndex = maskModel->index(i_row, 0, QModelIndex()); -// TestItem *item1 = new TestItem; -// LayerItem *layer = new LayerItem(); -// editor1->addItemProperty(layer, LayerItem::P_THICKNESS, "MyGroup"); -// editor1->addItemProperties(item1, "MyGroup"); +// if (ParameterizedItem *item = maskModel->itemForIndex(itemIndex)) { -//// editor2->addItemProperty(layer, LayerItem::P_THICKNESS, "MyGroup"); -// editor2->addItemProperties(item1, QString(), AwesomePropertyEditor::INSERT_AFTER); +// qDebug() << i_row << item->itemName(); +// } -// gridLayout->addWidget(editor1, 0, 0); -// gridLayout->addWidget(editor2, 0, 1); -// groupLayout->addLayout(gridLayout); +// Q_ASSERT(0); -// // main layout -// QVBoxLayout *mainLayout = new QVBoxLayout; -// mainLayout->addWidget(groupBox); -// setLayout(mainLayout); +// ParameterizedItem *polygon = maskModel->insertNewItem(Constants::PolygonType); +// maskModel->insertNewItem(Constants::PointType, maskModel->indexOfItem(polygon)); +// maskModel->save("masks.xml"); -//} +// Q_ASSERT(0); + + MaskEditor *maskEditor = new MaskEditor; + maskEditor->setModel(maskModel); + + QVBoxLayout *mainLayout = new QVBoxLayout; + this->setLayout(mainLayout); +// Rectangle *rectangle = new Rectangle(300,300,100,100); +// QGraphicsScene *scene = new QGraphicsScene(); +// scene->addItem(rectangle); +// QGraphicsView *view = new QGraphicsView; +// view->setScene(scene); +// scene->setSceneRect(view->rect()); + mainLayout->addWidget(maskEditor); + +} diff --git a/GUI/coregui/Views/TestView.h b/GUI/coregui/Views/TestView.h index c41b21b3ab6a716112933820b524c9592fded765..6f3d112cdca7a5e38b82adecaa903444efc22dcc 100644 --- a/GUI/coregui/Views/TestView.h +++ b/GUI/coregui/Views/TestView.h @@ -12,12 +12,17 @@ //! @authors C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke // // ************************************************************************** // +#include <QWidget> +#include <QGraphicsProxyWidget> +#include <QGraphicsItem> +#include <QGraphicsScene> +#include "DistributionEditor.h" +#include <QGraphicsView> +#include <QPainterPath> #ifndef TESTVIEW_H #define TESTVIEW_H -#include <QWidget> - class ParameterizedItem; class AwesomePropertyEditor; @@ -25,18 +30,20 @@ class TestView : public QWidget { Q_OBJECT public: - TestView(QWidget *parent = 0); - virtual ~TestView() {} + virtual ~TestView() + { + } void setItem(ParameterizedItem *item); void plotItem(ParameterizedItem *item); private slots: -// void onPropertyChanged(const QString &property_name); -// void onSubItemChanged(const QString &property_name); -// void onSubItemPropertyChanged(const QString &property_group, const QString &property_name); + // void onPropertyChanged(const QString &property_name); + // void onSubItemChanged(const QString &property_name); + // void onSubItemPropertyChanged(const QString &property_group, const QString + // &property_name); private: AwesomePropertyEditor *m_propertyEditor; diff --git a/GUI/coregui/coregui.qrc b/GUI/coregui/coregui.qrc index 655ea71a887c4dc537e765910ece01a2cdd406de..d57ffd30914008b637557dd9a2929d3e2b83fa2d 100644 --- a/GUI/coregui/coregui.qrc +++ b/GUI/coregui/coregui.qrc @@ -49,5 +49,15 @@ <file>images/warning.png</file> <file>images/magnifier.png</file> <file>images/warning_64x64.png</file> + <file>images/rotationArrow.png</file> + <file>images/rectangle.png</file> + <file>images/mouseCursor.png</file> + <file>images/ellipse.png</file> + <file>images/polygon.png</file> + <file>images/bringToFront.png</file> + <file>images/sendToBack.png</file> + <file>images/include.png</file> + <file>images/exclude.png</file> + <file>images/jTxpL5ELc.png</file> </qresource> </RCC> diff --git a/GUI/coregui/images/bringToFront.png b/GUI/coregui/images/bringToFront.png new file mode 100644 index 0000000000000000000000000000000000000000..41a42cb5f65f28fdf7748cc09157fc046da93436 Binary files /dev/null and b/GUI/coregui/images/bringToFront.png differ diff --git a/GUI/coregui/images/ellipse.png b/GUI/coregui/images/ellipse.png new file mode 100644 index 0000000000000000000000000000000000000000..eb66ea086aba79c62dadd45d4632a45b8d70b926 Binary files /dev/null and b/GUI/coregui/images/ellipse.png differ diff --git a/GUI/coregui/images/exclude.png b/GUI/coregui/images/exclude.png new file mode 100644 index 0000000000000000000000000000000000000000..67d87b22b24ca85dadb1af211d85401891398512 Binary files /dev/null and b/GUI/coregui/images/exclude.png differ diff --git a/GUI/coregui/images/image3191.png b/GUI/coregui/images/image3191.png new file mode 100644 index 0000000000000000000000000000000000000000..4c2ac1ca7dcb29e4ba84927aac4e28f9058cbb2e Binary files /dev/null and b/GUI/coregui/images/image3191.png differ diff --git a/GUI/coregui/images/include.png b/GUI/coregui/images/include.png new file mode 100644 index 0000000000000000000000000000000000000000..53496abe2a50c3e755189f9b5d5e2302c2c0cc00 Binary files /dev/null and b/GUI/coregui/images/include.png differ diff --git a/GUI/coregui/images/jTxpL5ELc.png b/GUI/coregui/images/jTxpL5ELc.png new file mode 100644 index 0000000000000000000000000000000000000000..d48e9b70ea471a6fa246c4c27f7e05e446e51e12 Binary files /dev/null and b/GUI/coregui/images/jTxpL5ELc.png differ diff --git a/GUI/coregui/images/mouseCursor.png b/GUI/coregui/images/mouseCursor.png new file mode 100644 index 0000000000000000000000000000000000000000..c2f9a7fdcf75e551a74624415c506aa3d7458290 Binary files /dev/null and b/GUI/coregui/images/mouseCursor.png differ diff --git a/GUI/coregui/images/polygon.png b/GUI/coregui/images/polygon.png new file mode 100644 index 0000000000000000000000000000000000000000..4e0cf1c62a48d7fad904af801cde75579c48bfc6 Binary files /dev/null and b/GUI/coregui/images/polygon.png differ diff --git a/GUI/coregui/images/rectangle.png b/GUI/coregui/images/rectangle.png new file mode 100644 index 0000000000000000000000000000000000000000..8b8feab36f82677a4a8b9c4544fac2c475d4f551 Binary files /dev/null and b/GUI/coregui/images/rectangle.png differ diff --git a/GUI/coregui/images/rotationArrow.png b/GUI/coregui/images/rotationArrow.png new file mode 100644 index 0000000000000000000000000000000000000000..6500741ebaac49ee22035dcbb7999994ed628018 Binary files /dev/null and b/GUI/coregui/images/rotationArrow.png differ diff --git a/GUI/coregui/images/sendToBack.png b/GUI/coregui/images/sendToBack.png new file mode 100644 index 0000000000000000000000000000000000000000..60b7ff0924cf8d3b1bef635d9fd8892acecbadd8 Binary files /dev/null and b/GUI/coregui/images/sendToBack.png differ diff --git a/GUI/coregui/images/sf.tar.gz.png b/GUI/coregui/images/sf.tar.gz.png new file mode 100644 index 0000000000000000000000000000000000000000..8e04c25731c7aaa666bad963041c7af6c9c752e1 Binary files /dev/null and b/GUI/coregui/images/sf.tar.gz.png differ