HAL
labeled_separated_net.cpp
Go to the documentation of this file.
2 
4 
5 #include <QPainter>
6 #include <QPen>
7 #include <QStyleOptionGraphicsItem>
8 
9 namespace hal
10 {
11  static const qreal sBaseline = 1;
12 
13  qreal LabeledSeparatedNet::sWireLength;
14  qreal LabeledSeparatedNet::sTextOffset;
15 
16  QFont LabeledSeparatedNet::sFont;
17  qreal LabeledSeparatedNet::sFontHeight;
18  qreal LabeledSeparatedNet::sFontAscend;
19 
21  {
22  sWireLength = 20;
23  sTextOffset = 2.4;
24 
25  sFont = QFont("Iosevka");
26  sFont.setPixelSize(12);
27  QFontMetricsF fm(sFont);
28  sFontHeight = fm.height();
29  sFontAscend = fm.ascent();
30  }
31 
33  mText(text)
34  {
35  int ipos = mText.lastIndexOf('/');
36  if (ipos >= 0)
37  mText = mText.mid(ipos+1);
38  QFontMetricsF fm(sFont);
39  mTextWidth = fm.width(mText);
40  }
41 
43  {
44  Q_UNUSED(widget);
45 
46  if (sLod < graph_widget_constants::sEparatedNetMinLod)
47  return;
48 
49  QColor color = penColor(option->state);
50  color.setAlphaF(sAlpha);
51 
52  sPen.setColor(color);
53  painter->setPen(sPen);
54  painter->setFont(sFont);
55 
56  if (mFillIcon)
57  {
60  painter->setBrush(sBrush); // ???
61  }
62 
63  for (const QPointF& position : mInputPositions)
64  {
65  if (mFillIcon)
66  painter->fillRect(QRectF(position.x() - sWireLength - sTextOffset - mTextWidth, position.y() - sFontHeight / 2, mTextWidth, sFontHeight), sBrush);
67 
68  QPointF point(position.x() - sWireLength, position.y());
69  painter->drawLine(position, point);
70  point.setX(point.x() - sTextOffset - mTextWidth);
71  point.setY(point.y() + sBaseline + sFontAscend - sFontHeight / 2);
72  painter->drawText(point, mText);
73  }
74 
75  for (const QPointF& position : mOutputPositions)
76  {
77  if (mFillIcon)
78  painter->fillRect(QRectF(position.x() + sWireLength + sTextOffset, position.y() - sFontHeight / 2, mTextWidth, sFontHeight), sBrush);
79 
80  QPointF point(position.x() + sWireLength, position.y());
81  painter->drawLine(position, point);
82  point.setX(point.x() + sTextOffset);
83  point.setY(point.y() + sBaseline + sFontAscend - sFontHeight / 2);
84  painter->drawText(point, mText);
85  }
86 
88  painter->setBrush(sBrush);
89 
90  #ifdef HAL_DEBUG_GUI_GRAPH_WIDGET
92  painter->setPen(sPen);
93  painter->drawPath(mShape);
94  #endif
95  }
96 
97  void LabeledSeparatedNet::addInput(const QPointF& scene_position)
98  {
99  const QPointF mapped_position = mapFromScene(scene_position);
100  mInputPositions.append(mapped_position);
101 
102  const qreal half_of_shape_width = sShapeWidth / 2;
103  const qreal half_of_font_height = sFontHeight / 2;
104 
105  QPointF point(mapped_position.x() - sWireLength - half_of_shape_width, mapped_position.y() - half_of_shape_width);
106 
107  mShape.moveTo(point);
108  point.setX(point.x() + sWireLength + sShapeWidth);
109  mShape.lineTo(point);
110  point.setY(point.y() + sShapeWidth);
111  mShape.lineTo(point);
112  point.setX(point.x() - sWireLength - sShapeWidth);
113  mShape.lineTo(point);
115 
116  point.setX(mapped_position.x() - sWireLength - sTextOffset - mTextWidth); // - half_of_shape_width
117  point.setY(mapped_position.y() - half_of_font_height); // - half_of_shape_width
118 
119  mShape.moveTo(point);
120  point.setX(point.x() + mTextWidth); // + sShapeWidth
121  mShape.lineTo(point);
122  point.setY(point.y() + sFontHeight); // + sShapeWidth
123  mShape.lineTo(point);
124  point.setX(point.x() - mTextWidth); // - sShapeWidth
125  mShape.lineTo(point);
127  }
128 
129  void LabeledSeparatedNet::addOutput(const QPointF& scene_position)
130  {
131  const QPointF mapped_position = mapFromScene(scene_position);
132  mOutputPositions.append(mapped_position);
133 
134  const qreal half_of_shape_width = sShapeWidth / 2;
135  const qreal half_of_font_height = sFontHeight / 2;
136 
137  QPointF point(mapped_position.x() - half_of_shape_width, mapped_position.y() - half_of_shape_width);
138 
139  mShape.moveTo(point);
140  point.setX(point.x() + sWireLength + sShapeWidth);
141  mShape.lineTo(point);
142  point.setY(point.y() + sShapeWidth);
143  mShape.lineTo(point);
144  point.setX(point.x() - sWireLength - sShapeWidth);
145  mShape.lineTo(point);
147 
148  point.setX(mapped_position.x() + sWireLength + sTextOffset); // - half_of_shape_width
149  point.setY(mapped_position.y() - half_of_font_height); // - half_of_shape_width
150 
151  mShape.moveTo(point);
152  point.setX(point.x() + mTextWidth); // + sShapeWidth
153  mShape.lineTo(point);
154  point.setY(point.y() + sFontHeight); // + sShapeWidth
155  mShape.lineTo(point);
156  point.setX(point.x() - mTextWidth); // - sShapeWidth
157  mShape.lineTo(point);
159  }
160 
162  {
163  return sWireLength + sTextOffset + mTextWidth;
164  }
165 
167  {
168  return sWireLength + sTextOffset + mTextWidth;
169  }
170 }
QColor penColor(QStyle::State state, const QColor &colorHint=QColor()) const
static qreal sLod
Definition: graphics_item.h:93
QPainterPath mShape
Definition: graphics_net.h:101
static QPen sPen
Definition: graphics_net.h:97
static QBrush sBrush
Definition: graphics_net.h:98
static qreal sShapeWidth
Definition: graphics_net.h:95
Qt::BrushStyle mBrushStyle
Definition: graphics_net.h:107
void addOutput(const QPointF &scene_position) override
qreal outputWidth() const override
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override
LabeledSeparatedNet(Net *n, const QString &text)
qreal inputWidth() const override
void addInput(const QPointF &scene_position) override
Definition: net.h:58
Abstract base class for separated nets (e.g. ArrowSeparatedNet)
QVector< QPointF > mInputPositions
QVector< QPointF > mOutputPositions
n
Definition: test.py:6
option(PL_GUI "PL_GUI" ON) if(PL_GUI OR BUILD_ALL_PLUGINS) cmake_minimum_required(VERSION 3.1.0) if(APPLE AND CMAKE_HOST_APPLE AND NOT Qt5_DIR) set(Qt5_DIR "/usr/local/opt/qt@5/lib/cmake") endif(APPLE AND CMAKE_HOST_APPLE AND NOT Qt5_DIR) find_package(Qt5 COMPONENTS Core REQUIRED) find_package(Qt5 COMPONENTS Widgets REQUIRED) if(Qt5Widgets_FOUND) message(VERBOSE "Qt5Widgets_INCLUDE_DIRS
Definition: CMakeLists.txt:1
void setColor(const QColor &color)
void setStyle(Qt::BrushStyle style)
void setAlphaF(qreal alpha)
void setPixelSize(int pixelSize)
qreal width(const QString &text) const const
qreal ascent() const const
qreal height() const const
QPointF mapFromScene(const QPointF &point) const const
void drawLine(const QLineF &line)
void drawPath(const QPainterPath &path)
void drawText(const QPointF &position, const QString &text)
void fillRect(const QRectF &rectangle, const QBrush &brush)
void setBrush(const QBrush &brush)
void setFont(const QFont &font)
void setPen(const QColor &color)
void closeSubpath()
void lineTo(const QPointF &endPoint)
void moveTo(const QPointF &point)
void setColor(const QColor &color)
void setX(qreal x)
void setY(qreal y)
qreal x() const const
qreal y() const const
int lastIndexOf(QChar ch, int from, Qt::CaseSensitivity cs) const const
QString mid(int position, int n) const const
void append(const T &value)