erlu/src/items/BlockItem.h
Gregory Bednov 53afa3f728 новый файл: CMakeLists.txt
новый файл:    shell.nix
	новый файл:    src/MainWindow.cpp
	новый файл:    src/MainWindow.h
	новый файл:    src/items/ArrowItem.cpp
	новый файл:    src/items/ArrowItem.h
	новый файл:    src/items/BlockItem.cpp
	новый файл:    src/items/BlockItem.h
	новый файл:    src/items/DiagramScene.cpp
	новый файл:    src/items/DiagramScene.h
	новый файл:    src/items/JunctionItem.cpp
	новый файл:    src/items/JunctionItem.h
	новый файл:    src/main.cpp
	изменено:      src/items/ArrowItem.cpp
	изменено:      src/items/ArrowItem.h
	изменено:      src/items/BlockItem.h
	изменено:      src/items/DiagramScene.cpp
	изменено:      src/items/DiagramScene.h
2026-02-23 00:21:10 +03:00

45 lines
1.2 KiB
C++

#pragma once
#include <QGraphicsObject>
#include <QSet>
class ArrowItem;
class BlockItem final : public QGraphicsObject {
Q_OBJECT
public:
enum class Port { Input, Control, Output, Mechanism };
enum { Type = UserType + 1 };
explicit BlockItem(QString title = "Function", QGraphicsItem* parent = nullptr, int id = -1);
QRectF boundingRect() const override;
void paint(QPainter* p, const QStyleOptionGraphicsItem*, QWidget*) override;
int type() const override { return Type; }
QString title() const { return m_title; }
void setTitle(const QString& t);
int id() const { return m_id; }
void setId(int id) { m_id = id; }
QPointF portScenePos(Port p) const;
bool hitTestPort(const QPointF& scenePos, Port* outPort, QPointF* outLocalPos = nullptr, qreal radiusPx = 10.0) const;
void addArrow(ArrowItem* a);
void removeArrow(ArrowItem* a);
signals:
void geometryChanged();
protected:
QVariant itemChange(GraphicsItemChange change, const QVariant& value) override;
void mouseDoubleClickEvent(QGraphicsSceneMouseEvent* e) override;
private:
QString m_title;
QRectF m_rect; // local rect
int m_id;
QSet<ArrowItem*> m_arrows;
QPointF portLocalPos(Port p) const;
QPair<QPointF, QPointF> portSegment(Port p) const;
};