mirror of
https://github.com/qelectrotech/qelectrotech-source-mirror.git
synced 2026-10-01 23:54:13 +02:00
f3a31c291f
The two width-resize handles added in #591 were free scene items, moved
with setPos() from inside DynamicElementTextItem::paint(). Moving an item
while the view is painting is outside what QGraphicsView's partial
repaint tracks: the handle was drawn only where the current repaint band
overlapped it, and its old position was not reliably cleared. Moving or
zooming a selected element left green slivers on the folio (#1002).
Since 29d16c333 the handles show on every text of a selected element,
so any ordinary element move triggered it.
Make the handles children of the text instead. Qt then moves and
repaints them together with the element, in local coordinates, and
their position only needs updating when the text's size changes, which
documentSizeChanged reports (text, font, width, undo of a resize).
This also takes paint() out of the handle logic entirely.
Reproduced on Linux (Xvfb), so the issue is not Windows-specific.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
207 lines
7.5 KiB
C++
207 lines
7.5 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 DYNAMICELEMENTTEXTITEM_H
|
|
#define DYNAMICELEMENTTEXTITEM_H
|
|
|
|
#include "../properties/xrefproperties.h"
|
|
#include "diagramtextitem.h"
|
|
#include "element.h"
|
|
|
|
#include <QPointer>
|
|
#include <QUuid>
|
|
|
|
class Element;
|
|
class Conductor;
|
|
class ElementTextItemGroup;
|
|
class CrossRefItem;
|
|
class QetGraphicsHandlerItem;
|
|
|
|
/**
|
|
@brief The DynamicElementTextItem class
|
|
This class provide a simple text field of element who can be added or removed directly from the diagram editor.
|
|
This text is created to compensate a big lack of the ElementTextItem : ElementTextItem can't be added or removed directly in the diagram editor
|
|
|
|
*/
|
|
class DynamicElementTextItem : public DiagramTextItem
|
|
{
|
|
friend class DynamicTextItemDelegate;
|
|
friend class CompositeTextEditDialog;
|
|
friend class Element;
|
|
|
|
Q_OBJECT
|
|
|
|
Q_PROPERTY(QString text READ text WRITE setText NOTIFY textChanged)
|
|
Q_PROPERTY(TextFrom textFrom READ textFrom WRITE setTextFrom NOTIFY textFromChanged)
|
|
Q_PROPERTY(QString infoName READ infoName WRITE setInfoName NOTIFY infoNameChanged)
|
|
Q_PROPERTY(QString compositeText READ compositeText WRITE setCompositeText NOTIFY compositeTextChanged)
|
|
Q_PROPERTY(bool frame READ frame WRITE setFrame NOTIFY frameChanged)
|
|
Q_PROPERTY(qreal textWidth READ textWidth WRITE setTextWidth NOTIFY textWidthChanged)
|
|
Q_PROPERTY(bool keepVisualRotation READ keepVisualRotation WRITE setKeepVisualRotation NOTIFY keepVisualRotationChanged)
|
|
Q_PROPERTY(bool rotationPointCenter READ rotationPointCenter WRITE setRotationPointCenter NOTIFY rotationPointCenterChanged)
|
|
public:
|
|
|
|
enum TextFrom {
|
|
UserText,
|
|
ElementInfo,
|
|
CompositeText
|
|
};
|
|
Q_ENUM (TextFrom)
|
|
enum {Type = UserType + 1010};
|
|
int type() const override {return Type;}
|
|
|
|
signals:
|
|
void textChanged(QString text);
|
|
void textFromChanged(DynamicElementTextItem::TextFrom text_from);
|
|
void infoNameChanged(QString info);
|
|
void compositeTextChanged(QString text);
|
|
void frameChanged(bool frame);
|
|
void plainTextChanged();
|
|
void textWidthChanged(qreal width);
|
|
void keepVisualRotationChanged(bool keep);
|
|
void rotationPointCenterChanged(bool center);
|
|
|
|
public:
|
|
DynamicElementTextItem(Element *parent_element);
|
|
~DynamicElementTextItem() override;
|
|
static QMetaEnum textFromMetaEnum();
|
|
private:
|
|
DynamicElementTextItem ();
|
|
DynamicElementTextItem(const DynamicElementTextItem &);
|
|
|
|
public:
|
|
QDomElement toXml(QDomDocument &dom_doc) const override;
|
|
void fromXml(const QDomElement &dom_elmt) override;
|
|
|
|
Element *parentElement() const;
|
|
/// PDF export: slave cross-reference text item ("(folio-pos)") and its master target.
|
|
QGraphicsTextItem *slaveXrefItem() const { return m_slave_Xref_item; }
|
|
/// DXF export: the master-side cross-reference item (the table/cross
|
|
/// drawn next to a report/master element), if this text item has one.
|
|
CrossRefItem *masterXrefItem() const { return m_Xref_item; }
|
|
Element *masterElement() const;
|
|
ElementTextItemGroup *parentGroup() const;
|
|
Element *elementUseForInfo() const;
|
|
void refreshLabelConnection();
|
|
|
|
DynamicElementTextItem::TextFrom textFrom() const;
|
|
void setTextFrom (DynamicElementTextItem::TextFrom text_from);
|
|
QString text() const;
|
|
void setText(const QString &text);
|
|
static QString xmlTagName() {return QString("dynamic_elmt_text");}
|
|
void setInfoName(const QString &info_name);
|
|
QString infoName() const;
|
|
void setCompositeText(const QString &text);
|
|
QString compositeText() const;
|
|
void setFrame(const bool frame);
|
|
bool frame() const;
|
|
QUuid uuid() const;
|
|
void updateXref();
|
|
void setPlainText(const QString &text);
|
|
void setTextWidth(qreal width);
|
|
void setXref_item(Qt::AlignmentFlag m_exHrefPos, int slave_offset = 0);
|
|
|
|
void setKeepVisualRotation(bool set);
|
|
bool keepVisualRotation() const;
|
|
|
|
void setRotationPointCenter(bool set);
|
|
bool rotationPointCenter() const;
|
|
|
|
//Called by Element::itemChange() when the PARENT's selection
|
|
//changes, so the parent can keep each of its texts' resize
|
|
//handles in sync with its own selection state. Public for that;
|
|
//see the .cpp for why it exists.
|
|
void refreshResizeHandlesVisibility();
|
|
|
|
protected:
|
|
void mousePressEvent(QGraphicsSceneMouseEvent *event) override;
|
|
void mouseMoveEvent(QGraphicsSceneMouseEvent *event) override;
|
|
void mouseReleaseEvent(QGraphicsSceneMouseEvent *event) override;
|
|
void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event) override;
|
|
void hoverEnterEvent(QGraphicsSceneHoverEvent *event) override;
|
|
void hoverLeaveEvent(QGraphicsSceneHoverEvent *event) override;
|
|
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override;
|
|
QVariant itemChange(GraphicsItemChange change, const QVariant &value) override;
|
|
bool sceneEventFilter(QGraphicsItem *watched, QEvent *event) override;
|
|
|
|
private:
|
|
void elementInfoChanged();
|
|
void masterChanged();
|
|
void reportChanged();
|
|
void reportFormulaChanged();
|
|
void setConnectionForReportFormula(const QString &formula);
|
|
void removeConnectionForReportFormula(const QString &formula);
|
|
void setupFormulaConnection();
|
|
void clearFormulaConnection();
|
|
void updateReportFormulaConnection();
|
|
void updateReportText();
|
|
void updateLabel();
|
|
void conductorWasAdded(Conductor *conductor);
|
|
void conductorWasRemoved(Conductor *conductor);
|
|
void setPotentialConductor();
|
|
void conductorPropertiesChanged();
|
|
QString reportReplacedCompositeText() const;
|
|
void zoomToLinkedElement();
|
|
void parentElementRotationChanged();
|
|
void thisRotationChanged();
|
|
void addResizeHandles();
|
|
void removeResizeHandles();
|
|
void updateResizeHandlesPos();
|
|
void handlerMousePressEvent(QetGraphicsHandlerItem *handle, QGraphicsSceneMouseEvent *event);
|
|
void handlerMouseMoveEvent(QetGraphicsHandlerItem *handle, QGraphicsSceneMouseEvent *event);
|
|
void handlerMouseReleaseEvent(QetGraphicsHandlerItem *handle, QGraphicsSceneMouseEvent *event);
|
|
|
|
private:
|
|
QPointer <Element>
|
|
m_parent_element,
|
|
m_master_element,
|
|
m_other_report;
|
|
QPointer <Conductor> m_watched_conductor;
|
|
QString
|
|
m_text,
|
|
m_info_name,
|
|
m_composite_text,
|
|
m_report_formula,
|
|
m_F_str;
|
|
DynamicElementTextItem::TextFrom m_text_from = UserText;
|
|
QUuid m_uuid;
|
|
QMetaObject::Connection m_report_formula_con;
|
|
QList<QMetaObject::Connection>
|
|
m_formula_connection,
|
|
m_update_slave_Xref_connection;
|
|
QColor m_user_color;
|
|
bool
|
|
m_frame = false,
|
|
m_first_scene_change = true;
|
|
CrossRefItem *m_Xref_item = nullptr;
|
|
QGraphicsTextItem *m_slave_Xref_item = nullptr;
|
|
qreal m_text_width = -1;
|
|
QPointF m_initial_position;
|
|
bool m_keep_visual_rotation = true;
|
|
bool m_rotation_point_center = false;
|
|
qreal m_visual_rotation_ref = 0;
|
|
bool m_move_parent = true;
|
|
QetGraphicsHandlerItem *m_left_resize_handle = nullptr;
|
|
QetGraphicsHandlerItem *m_right_resize_handle = nullptr;
|
|
qreal m_resize_original_width = -1;
|
|
qreal m_resize_baseline_width = -1;
|
|
qreal m_resize_start_local_x = 0;
|
|
QMetaObject::Connection m_resize_handles_con;
|
|
};
|
|
|
|
#endif // DYNAMICELEMENTTEXTITEM_H
|