mirror of
https://github.com/qelectrotech/qelectrotech-source-mirror.git
synced 2026-09-28 04:54:13 +02:00
825a1a594d
Mirror (M) and Flip (F) in the element editor reflected the selected parts across the element origin: every part's mirror() and flip() negated the scene x or y coordinate. A part drawn to the right of the origin landed the same distance to the left, so the selection jumped to the other side of the canvas instead of turning around. MirrorElementsCommand and FlipElementsCommand now compute the united scene bounding rectangle of the selected items and reflect across the vertical or horizontal line through its center. The center is snapped to the nearest half of the diagram grid, so points that were on the grid stay on the grid after the reflection. Terminals in particular keep their grid alignment. Each part's mirror() and flip() takes the axis coordinate as a parameter with a default of 0, so the previous behavior remains available to any other caller. The command stores the axis when it is created and undo reapplies the same reflection, which is its own inverse, so the existing undo path is unchanged. Parts covered: PartArc, PartDynamicTextField, PartEllipse, PartLine, PartPolygon, PartRectangle, PartTerminal, PartText. Fixes #812
117 lines
4.1 KiB
C++
117 lines
4.1 KiB
C++
/*
|
|
Copyright 2006-2026 The QElectroTech Team
|
|
This file is part of QElectroTech.
|
|
|
|
QElectroTech is free software: you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation, either version 2 of the License, or
|
|
(at your option) any later version.
|
|
|
|
QElectroTech is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with QElectroTech. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
#ifndef PART_TEXT_H
|
|
#define PART_TEXT_H
|
|
#include "../../qetapp.h"
|
|
#include "customelementpart.h"
|
|
|
|
#include <QtWidgets>
|
|
|
|
class TextEditor;
|
|
class ElementPrimitiveDecorator;
|
|
/**
|
|
This class represents an static text primitive which may be used to compose
|
|
the drawing of an electrical element within the element editor.
|
|
*/
|
|
class PartText : public QGraphicsTextItem, public CustomElementPart {
|
|
Q_OBJECT
|
|
Q_PROPERTY(qreal real_size READ realSize WRITE setRealSize)
|
|
Q_PROPERTY(QColor color READ defaultTextColor WRITE setDefaultTextColor NOTIFY colorChanged)
|
|
Q_PROPERTY(QString text READ toPlainText WRITE setPlainText NOTIFY plainTextChanged)
|
|
Q_PROPERTY(QFont font READ font WRITE setFont NOTIFY fontChanged)
|
|
Q_PROPERTY(Qt::Alignment alignment READ alignment WRITE setAlignment NOTIFY alignmentChanged)
|
|
|
|
signals:
|
|
void fontChanged(const QFont &font);
|
|
void colorChanged(const QColor &color);
|
|
void plainTextChanged(const QString &text);
|
|
void alignmentChanged(Qt::Alignment alignment);
|
|
|
|
// constructors, destructor
|
|
public:
|
|
PartText(QETElementEditor *, QGraphicsItem * = nullptr);
|
|
~PartText() override;
|
|
|
|
private:
|
|
PartText(const PartText &);
|
|
|
|
// methods
|
|
public:
|
|
enum { Type = UserType + 1107 };
|
|
/**
|
|
Enable the use of qgraphicsitem_cast to safely cast a QGraphicsItem into a
|
|
PartText.
|
|
@return the QGraphicsItem type
|
|
*/
|
|
int type() const override { return Type; }
|
|
QString name() const override { return(QObject::tr("texte", "element part name")); }
|
|
QString xmlName() const override { return(QString("text")); }
|
|
void fromXml(const QDomElement &) override;
|
|
const QDomElement toXml(QDomDocument &) const override;
|
|
void setRotation(qreal angle);
|
|
void mirror(qreal axis_x = 0);
|
|
void flip(qreal axis_y = 0);
|
|
bool isUseless() const override;
|
|
QRectF sceneGeometricRect() const override;
|
|
void startUserTransformation(const QRectF &) override;
|
|
void handleUserTransformation(const QRectF &, const QRectF &) override;
|
|
|
|
void setProperty(const char *name, const QVariant &value) override {QGraphicsTextItem::setProperty(name, value);}
|
|
QVariant property(const char *name) const override {return QGraphicsTextItem::property(name);}
|
|
|
|
qreal realSize() const {return real_font_size_;}
|
|
void setRealSize(qreal rs) {real_font_size_ = rs;}
|
|
void setDefaultTextColor(const QColor &color);
|
|
void setPlainText(const QString &text);
|
|
void setFont(const QFont &font);
|
|
void setAlignment(const Qt::Alignment &alignment);
|
|
Qt::Alignment alignment() const {return m_alignment;}
|
|
|
|
public slots:
|
|
void adjustItemPosition(int = 0);
|
|
void setEditable(bool);
|
|
void startEdition();
|
|
void endEdition();
|
|
|
|
protected:
|
|
void mouseMoveEvent(QGraphicsSceneMouseEvent *event) override;
|
|
void mousePressEvent(QGraphicsSceneMouseEvent *event) override;
|
|
void mouseReleaseEvent(QGraphicsSceneMouseEvent *event) override;
|
|
void focusInEvent(QFocusEvent *) override;
|
|
void focusOutEvent(QFocusEvent *) override;
|
|
void keyPressEvent(QKeyEvent *) override;
|
|
void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *) override;
|
|
QVariant itemChange(GraphicsItemChange, const QVariant &) override;
|
|
QRectF boundingRect() const override;
|
|
|
|
private:
|
|
QPointF margin() const;
|
|
void applyLineAlignment();
|
|
void prepareAlignment();
|
|
void finishAlignment();
|
|
QString previous_text;
|
|
qreal real_font_size_;
|
|
QPointF saved_point_;
|
|
qreal saved_font_size_;
|
|
QGraphicsItem *decorator_;
|
|
QPointF m_origin_pos;
|
|
Qt::Alignment m_alignment = (Qt::AlignTop | Qt::AlignLeft);
|
|
QRectF m_alignment_rect;
|
|
};
|
|
#endif
|