mirror of
https://github.com/qelectrotech/qelectrotech-source-mirror.git
synced 2026-04-15 04:49:58 +02:00
Minor change : Change behavior of shape creation in diagram editor, to be same has element editor
git-svn-id: svn+ssh://svn.tuxfamily.org/svnroot/qet/qet/trunk@3580 bfdf4180-ca20-0410-9c96-a3a8aa849046
This commit is contained in:
@@ -34,13 +34,17 @@ DVEventAddShape::DVEventAddShape(DiagramView *dv, QetShapeItem::ShapeType shape_
|
|||||||
m_shape_item (nullptr),
|
m_shape_item (nullptr),
|
||||||
m_help_horiz (nullptr),
|
m_help_horiz (nullptr),
|
||||||
m_help_verti (nullptr)
|
m_help_verti (nullptr)
|
||||||
{}
|
{
|
||||||
|
m_dv -> setContextMenuPolicy(Qt::NoContextMenu);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief DVEventAddShape::~DVEventAddShape
|
* @brief DVEventAddShape::~DVEventAddShape
|
||||||
*/
|
*/
|
||||||
DVEventAddShape::~DVEventAddShape() {
|
DVEventAddShape::~DVEventAddShape()
|
||||||
if (m_running || m_abort) {
|
{
|
||||||
|
if (m_running || m_abort)
|
||||||
|
{
|
||||||
m_diagram -> removeItem(m_shape_item);
|
m_diagram -> removeItem(m_shape_item);
|
||||||
delete m_shape_item;
|
delete m_shape_item;
|
||||||
}
|
}
|
||||||
@@ -55,48 +59,42 @@ DVEventAddShape::~DVEventAddShape() {
|
|||||||
* @param event : event of mouse press
|
* @param event : event of mouse press
|
||||||
* @return : true if this event is managed, otherwise false
|
* @return : true if this event is managed, otherwise false
|
||||||
*/
|
*/
|
||||||
bool DVEventAddShape::mousePressEvent(QMouseEvent *event) {
|
bool DVEventAddShape::mousePressEvent(QMouseEvent *event)
|
||||||
|
{
|
||||||
if (!m_dv->isInteractive() && m_diagram->isReadOnly()) return false;
|
if (!m_dv->isInteractive() && m_diagram->isReadOnly()) return false;
|
||||||
|
|
||||||
QPointF pos = m_dv->mapToScene(event->pos());
|
QPointF pos = m_dv->mapToScene(event->pos());
|
||||||
|
|
||||||
//@m_running false => shape isn't created yet, we create a new shape
|
//Action for left mouse click
|
||||||
if (m_running == false && event -> button() == Qt::LeftButton) {
|
if (event -> button() == Qt::LeftButton)
|
||||||
m_shape_item = new QetShapeItem(pos, pos, m_shape_type);
|
{
|
||||||
m_dv -> setContextMenuPolicy (Qt::NoContextMenu);
|
//Create shape item
|
||||||
m_diagram -> addItem (m_shape_item);
|
if (!m_shape_item)
|
||||||
m_running = true;
|
{
|
||||||
|
m_shape_item = new QetShapeItem(pos, pos, m_shape_type);
|
||||||
|
m_diagram -> addItem (m_shape_item);
|
||||||
|
m_running = true;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
//If current item isn't a polyline, add it with an undo command
|
||||||
|
if (m_shape_type != QetShapeItem::Polyline)
|
||||||
|
{
|
||||||
|
m_shape_item -> setP2 (pos);
|
||||||
|
m_diagram -> undoStack().push (new AddItemCommand<QetShapeItem *> (m_shape_item, m_diagram));
|
||||||
|
m_shape_item = nullptr; //< set to nullptr for create new shape at next left clic
|
||||||
|
}
|
||||||
|
//Else add a new point to polyline
|
||||||
|
else
|
||||||
|
{
|
||||||
|
m_shape_item -> setNextPoint (pos);
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
//At this point m_shape_item must be created
|
if (event -> button() == Qt::RightButton)
|
||||||
if (!m_shape_item) return false;
|
|
||||||
|
|
||||||
// Next left click finish all shape item except the polyline
|
|
||||||
if (m_shape_type != QetShapeItem::Polyline && event->button() == Qt::LeftButton) {
|
|
||||||
m_shape_item -> setP2 (pos);
|
|
||||||
m_diagram -> undoStack().push (new AddItemCommand<QetShapeItem *> (m_shape_item, m_diagram));
|
|
||||||
m_dv -> setContextMenuPolicy(Qt::DefaultContextMenu);
|
|
||||||
m_running = false;
|
|
||||||
return true;
|
return true;
|
||||||
}
|
|
||||||
|
|
||||||
// Next left click create new segment for polyline
|
|
||||||
if (m_shape_type == QetShapeItem::Polyline && event -> button() == Qt::LeftButton) {
|
|
||||||
m_shape_item -> setNextPoint (Diagram::snapToGrid(pos)); //< this point is ok for pos
|
|
||||||
m_shape_item -> setNextPoint (Diagram::snapToGrid(pos)); //< Add new point for next segment. the pos of this point
|
|
||||||
//< can be changed by calling QetShapItem::setP2()
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// If shape item is polyline and click is right button, the shape item is finish
|
|
||||||
// m_running is set to false at the release of right button.
|
|
||||||
if (m_shape_type == QetShapeItem::Polyline && event -> button() == Qt::RightButton) {
|
|
||||||
m_shape_item -> setP2 (pos);
|
|
||||||
m_diagram -> undoStack().push (new AddItemCommand<QetShapeItem *> (m_shape_item, m_diagram));
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -107,13 +105,17 @@ bool DVEventAddShape::mousePressEvent(QMouseEvent *event) {
|
|||||||
* @param event : event of mouse move
|
* @param event : event of mouse move
|
||||||
* @return : true if this event is managed, otherwise false
|
* @return : true if this event is managed, otherwise false
|
||||||
*/
|
*/
|
||||||
bool DVEventAddShape::mouseMoveEvent(QMouseEvent *event) {
|
bool DVEventAddShape::mouseMoveEvent(QMouseEvent *event)
|
||||||
|
{
|
||||||
updateHelpCross(event->pos());
|
updateHelpCross(event->pos());
|
||||||
if (!m_running) return false;
|
if (!m_running) return false;
|
||||||
if (m_shape_item && event -> buttons() == Qt::NoButton) {
|
|
||||||
|
if (m_shape_item && event -> buttons() == Qt::NoButton)
|
||||||
|
{
|
||||||
m_shape_item -> setP2 (m_dv -> mapToScene (event -> pos()));
|
m_shape_item -> setP2 (m_dv -> mapToScene (event -> pos()));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -123,14 +125,53 @@ bool DVEventAddShape::mouseMoveEvent(QMouseEvent *event) {
|
|||||||
* @param event : event of mouse release
|
* @param event : event of mouse release
|
||||||
* @return : true if this event is managed, otherwise false
|
* @return : true if this event is managed, otherwise false
|
||||||
*/
|
*/
|
||||||
bool DVEventAddShape::mouseReleaseEvent(QMouseEvent *event) {
|
bool DVEventAddShape::mouseReleaseEvent(QMouseEvent *event)
|
||||||
//When the shape is polyline, we set default context menu to diagram view
|
{
|
||||||
//only when the right button is released
|
if (event -> button() == Qt::RightButton)
|
||||||
if (m_shape_type == QetShapeItem::Polyline && event -> button() == Qt::RightButton ) {
|
{
|
||||||
m_dv -> setContextMenuPolicy(Qt::DefaultContextMenu);
|
//If shape is created, we manage right click
|
||||||
|
if (m_shape_item)
|
||||||
|
{
|
||||||
|
//Shape is a polyline and have three points or more we just remove the last point
|
||||||
|
if (m_shape_type == QetShapeItem::Polyline && (m_shape_item -> pointsCount() >= 3) )
|
||||||
|
{
|
||||||
|
m_shape_item -> removePoints();
|
||||||
|
m_shape_item -> setP2(m_dv -> mapToScene (event -> pos())); //Set the new last point under the cursor
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
//For other case, we remove item from scene
|
||||||
|
m_diagram -> removeItem(m_shape_item);
|
||||||
|
delete m_shape_item;
|
||||||
|
m_shape_item = nullptr;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Else (no shape), we set to false the running status
|
||||||
|
//for indicate to the owner of this event that everything is done
|
||||||
m_running = false;
|
m_running = false;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief DVEventAddShape::mouseDoubleClickEvent
|
||||||
|
* @param event
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
bool DVEventAddShape::mouseDoubleClickEvent(QMouseEvent *event)
|
||||||
|
{
|
||||||
|
//If current item is a polyline, add it with an undo command
|
||||||
|
if (m_shape_item && m_shape_type == QetShapeItem::Polyline && event -> button() == Qt::LeftButton)
|
||||||
|
{
|
||||||
|
m_shape_item -> setP2 (m_dv -> mapToScene (event -> pos()));
|
||||||
|
m_diagram -> undoStack().push (new AddItemCommand<QetShapeItem *> (m_shape_item, m_diagram));
|
||||||
|
m_shape_item = nullptr; //< set to nullptr for create new shape at next left clic
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -139,21 +180,27 @@ bool DVEventAddShape::mouseReleaseEvent(QMouseEvent *event) {
|
|||||||
* Create and update the position of the cross to help user for draw new shape
|
* Create and update the position of the cross to help user for draw new shape
|
||||||
* @param event
|
* @param event
|
||||||
*/
|
*/
|
||||||
void DVEventAddShape::updateHelpCross(const QPoint &p) {
|
void DVEventAddShape::updateHelpCross(const QPoint &p)
|
||||||
//If line isn't created yet, we create it.
|
{
|
||||||
if (!m_help_horiz || !m_help_verti) {
|
//If line isn't created yet, we create it.
|
||||||
|
if (!m_help_horiz || !m_help_verti)
|
||||||
|
{
|
||||||
QPen pen;
|
QPen pen;
|
||||||
pen.setWidthF(0.4);
|
pen.setWidthF(0.4);
|
||||||
pen.setCosmetic(true);
|
pen.setCosmetic(true);
|
||||||
pen.setColor(Qt::darkGray);
|
pen.setColor(Qt::darkGray);
|
||||||
//Add +5 for each line, because the topleft of diagram isn't draw at position (0:0) but (5:5)
|
|
||||||
if (!m_help_horiz) {
|
//Add +5 for each line, because the topleft of diagram isn't draw at position (0:0) but (5:5)
|
||||||
|
if (!m_help_horiz)
|
||||||
|
{
|
||||||
m_help_horiz = new QGraphicsLineItem(m_diagram -> border_and_titleblock.rowsHeaderWidth() + 5, 0,
|
m_help_horiz = new QGraphicsLineItem(m_diagram -> border_and_titleblock.rowsHeaderWidth() + 5, 0,
|
||||||
m_diagram -> border_and_titleblock.diagramWidth() + 5, 0,
|
m_diagram -> border_and_titleblock.diagramWidth() + 5, 0,
|
||||||
0, m_diagram);
|
0, m_diagram);
|
||||||
m_help_horiz->setPen(pen);
|
m_help_horiz->setPen(pen);
|
||||||
}
|
}
|
||||||
if (!m_help_verti) {
|
|
||||||
|
if (!m_help_verti)
|
||||||
|
{
|
||||||
m_help_verti = new QGraphicsLineItem(0, m_diagram -> border_and_titleblock.columnsHeaderHeight() + 5,
|
m_help_verti = new QGraphicsLineItem(0, m_diagram -> border_and_titleblock.columnsHeaderHeight() + 5,
|
||||||
0, m_diagram -> border_and_titleblock.diagramHeight() + 5,
|
0, m_diagram -> border_and_titleblock.diagramHeight() + 5,
|
||||||
0, m_diagram);
|
0, m_diagram);
|
||||||
@@ -161,7 +208,7 @@ void DVEventAddShape::updateHelpCross(const QPoint &p) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//Update the position of the cross
|
//Update the position of the cross
|
||||||
QPointF point = Diagram::snapToGrid(m_dv->mapToScene(p));
|
QPointF point = Diagram::snapToGrid(m_dv->mapToScene(p));
|
||||||
|
|
||||||
m_help_horiz->setY(point.y());
|
m_help_horiz->setY(point.y());
|
||||||
|
|||||||
@@ -28,17 +28,18 @@ class DVEventAddShape : public DVEventInterface
|
|||||||
public:
|
public:
|
||||||
DVEventAddShape(DiagramView *dv, QetShapeItem::ShapeType shape_type);
|
DVEventAddShape(DiagramView *dv, QetShapeItem::ShapeType shape_type);
|
||||||
virtual ~DVEventAddShape ();
|
virtual ~DVEventAddShape ();
|
||||||
virtual bool mousePressEvent (QMouseEvent *event);
|
virtual bool mousePressEvent (QMouseEvent *event);
|
||||||
virtual bool mouseMoveEvent (QMouseEvent *event);
|
virtual bool mouseMoveEvent (QMouseEvent *event);
|
||||||
virtual bool mouseReleaseEvent (QMouseEvent *event);
|
virtual bool mouseReleaseEvent (QMouseEvent *event);
|
||||||
|
virtual bool mouseDoubleClickEvent (QMouseEvent *event);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void updateHelpCross (const QPoint &p);
|
void updateHelpCross (const QPoint &p);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
QetShapeItem::ShapeType m_shape_type;
|
QetShapeItem::ShapeType m_shape_type;
|
||||||
QetShapeItem *m_shape_item;
|
QetShapeItem *m_shape_item;
|
||||||
QGraphicsLineItem *m_help_horiz, *m_help_verti;
|
QGraphicsLineItem *m_help_horiz, *m_help_verti;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // DVEVENTADDSHAPE_H
|
#endif // DVEVENTADDSHAPE_H
|
||||||
|
|||||||
@@ -93,6 +93,15 @@ void QetShapeItem::setP2(QPointF P2) {
|
|||||||
setTransformOriginPoint(boundingRect().center());
|
setTransformOriginPoint(boundingRect().center());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief QetShapeItem::pointCount
|
||||||
|
* @return the number of point in the polygon
|
||||||
|
*/
|
||||||
|
int QetShapeItem::pointsCount() const
|
||||||
|
{
|
||||||
|
return m_polygon.size();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief QetShapeItem::setNextPoint
|
* @brief QetShapeItem::setNextPoint
|
||||||
* Add a new point to the curent polygon
|
* Add a new point to the curent polygon
|
||||||
@@ -104,6 +113,29 @@ void QetShapeItem::setNextPoint(QPointF P) {
|
|||||||
setTransformOriginPoint(boundingRect().center());
|
setTransformOriginPoint(boundingRect().center());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief QetShapeItem::removePoints
|
||||||
|
* Number of point to remove on the polygon
|
||||||
|
* If @number is superior to number of polygon points-2,
|
||||||
|
* all points of polygon will be removed except the first two (minimum point for the polygon);
|
||||||
|
*/
|
||||||
|
void QetShapeItem::removePoints(int number)
|
||||||
|
{
|
||||||
|
if (pointsCount() == 2 || number < 1) return;
|
||||||
|
if ((pointsCount()-2) < number)
|
||||||
|
number = pointsCount() - 2;
|
||||||
|
|
||||||
|
int i = 0;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
i++;
|
||||||
|
prepareGeometryChange();
|
||||||
|
m_polygon.pop_back();
|
||||||
|
setTransformOriginPoint(boundingRect().center());
|
||||||
|
|
||||||
|
} while (i < number);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief QetShapeItem::boundingRect
|
* @brief QetShapeItem::boundingRect
|
||||||
* @return the bounding rect of this item
|
* @return the bounding rect of this item
|
||||||
|
|||||||
@@ -60,8 +60,12 @@ class QetShapeItem : public QetGraphicsItem
|
|||||||
virtual void editProperty();
|
virtual void editProperty();
|
||||||
virtual QString name() const;
|
virtual QString name() const;
|
||||||
|
|
||||||
void setP2 (QPointF P2);
|
void setP2 (QPointF P2);
|
||||||
|
|
||||||
|
//Methods available for polygon shape
|
||||||
|
int pointsCount () const;
|
||||||
void setNextPoint (QPointF P);
|
void setNextPoint (QPointF P);
|
||||||
|
void removePoints (int number = 1);
|
||||||
|
|
||||||
QRectF boundingRect() const;
|
QRectF boundingRect() const;
|
||||||
QPainterPath shape() const;
|
QPainterPath shape() const;
|
||||||
|
|||||||
Reference in New Issue
Block a user