HAL
standard_graphics_module.cpp
Go to the documentation of this file.
2 
5 #include "gui/gui_globals.h"
8 
9 #include <QFont>
10 #include <QFontMetricsF>
11 #include <QImage>
12 #include <QPainter>
13 #include <QPen>
14 #include <QStyle>
15 #include <QStyleOptionGraphicsItem>
16 
17 namespace hal
18 {
19  static const qreal sBaseline = 1;
20 
21  qreal StandardGraphicsModule::sAlpha;
22 
23  QPen StandardGraphicsModule::sPen;
24 
26 
27  QFont StandardGraphicsModule::sTextFont[3];
28  QFont StandardGraphicsModule::sPinFont;
29 
30  qreal StandardGraphicsModule::sTextFontHeight[3] = {0, 0, 0};
31 
32  qreal StandardGraphicsModule::sColorBarHeight = 30;
33 
34  qreal StandardGraphicsModule::sPinInnerHorizontalSpacing = 12;
35  qreal StandardGraphicsModule::sPinOuterHorizontalSpacing = 2.4;
36 
37  qreal StandardGraphicsModule::sPinInnerVerticalSpacing = 1.2;
38  qreal StandardGraphicsModule::sPinOuterVerticalSpacing = 0.6;
39  qreal StandardGraphicsModule::sPinUpperVerticalSpacing = 0.6;
40  qreal StandardGraphicsModule::sPinLowerVerticalSpacing = 1.8;
41 
42  qreal StandardGraphicsModule::sPinFontHeight;
43  qreal StandardGraphicsModule::sPinFontAscent;
44  qreal StandardGraphicsModule::sPinFontDescent;
45  qreal StandardGraphicsModule::sPinFontBaseline;
46 
47  qreal StandardGraphicsModule::sInnerNameTypeSpacing = 1.2;
48  qreal StandardGraphicsModule::sOuterNameTypeSpacing = 3;
49 
50  const int StandardGraphicsModule::sIconPadding = 3;
51  const QSize StandardGraphicsModule::sIconSize(sColorBarHeight - 2 * sIconPadding, sColorBarHeight - 2 * sIconPadding);
52  QPixmap* StandardGraphicsModule::sIconInstance = nullptr;
53 
54  const QPixmap& StandardGraphicsModule::iconPixmap()
55  {
56  if (!sIconInstance)
57  sIconInstance = new QPixmap(QPixmap::fromImage(QImage(":/icons/sel_module").scaled(sIconSize)));
58  return *sIconInstance;
59  }
60 
62  {
63  sPen.setCosmetic(true);
65 
67 
68  QFont font = QFont("Iosevka");
69  font.setPixelSize(graph_widget_constants::sFontSize);
70 
71  for (int iline = 0; iline < 3; iline++)
72  {
73  sTextFont[iline] = font;
74  QFontMetricsF fmf(font);
75  sTextFontHeight[iline] = fmf.height();
76  }
77 
78  sPinFont = font;
79 
80  QFontMetricsF pin_fm(sPinFont);
81  sPinFontHeight = pin_fm.height();
82  sPinFontAscent = pin_fm.ascent();
83  sPinFontDescent = pin_fm.descent();
84  sPinFontBaseline = 1;
85 
86  sSelectionColor = QColor(240, 173, 0);
87  sHighlightColor = QColor(40, 200, 240);
88  }
89 
91  {
92  if (sLod <= graph_widget_constants::sGateMaxLod)
93  sAlpha = 1 - (sLod - graph_widget_constants::sGateMinLod) / (graph_widget_constants::sGateMaxLod - graph_widget_constants::sGateMinLod);
94  else
95  sAlpha = 0;
96  }
97 
99  {
100  format(adjust_size_to_grid);
101  }
102 
104  {
105  Q_UNUSED(widget);
106 
107  if (sLod < graph_widget_constants::sGateMinLod)
108  {
109  painter->fillRect(QRectF(0, 0, mWidth, mHeight), penColor(option->state));
110  return;
111  }
112  else
113  {
114  // draw box and icon
115  painter->fillRect(QRectF(0, 0, mWidth, sColorBarHeight), mColor);
116  painter->fillRect(QRectF(0, sColorBarHeight, mWidth, mHeight - sColorBarHeight), GraphicsQssAdapter::instance()->nodeBackgroundColor());
117  // QRectF iconRect(sIconPadding,sIconPadding,sIconSize.width(),sIconSize.height());
118  // painter->fillRect(iconRect,Qt::black);
119  // painter->drawPixmap(QPoint(sIconPadding,sIconPadding), iconPixmap());
120 
121  // draw center text
122  sPen.setColor(penColor(option->state, sTextColor));
123  painter->setPen(sPen);
124 
125  for (int iline = 0; iline < 3; iline++)
126  {
127  if (mNodeText[iline].isEmpty())
128  continue;
129  painter->setFont(sTextFont[iline]);
130  painter->drawText(mTextPosition[iline], mNodeText[iline]);
131  }
132 
134  int subFocusIndex = static_cast<int>(gSelectionRelay->subfocusIndex());
135 
136  painter->setFont(sPinFont);
137  QPointF text_pos(sPinOuterHorizontalSpacing, sColorBarHeight + sPinUpperVerticalSpacing + sPinFontAscent + sBaseline);
138 
139  for (int i = 0; i < mInputPins.size(); ++i)
140  {
141  if (moduleHasFocus)
142  if (gSelectionRelay->subfocus() == SelectionRelay::Subfocus::Left && i == subFocusIndex)
143  sPen.setColor(selectionColor());
144  else
145  sPen.setColor(sTextColor);
146  else
147  sPen.setColor(penColor(option->state, sTextColor));
148  painter->setPen(sPen);
149  painter->drawText(text_pos, mInputPins.at(i).name);
150  text_pos.setY(text_pos.y() + sPinFontHeight + sPinInnerVerticalSpacing);
151  }
152 
153  for (int i = 0; i < mOutputPins.size(); ++i)
154  {
155  if (moduleHasFocus)
156  if (gSelectionRelay->subfocus() == SelectionRelay::Subfocus::Right && i == subFocusIndex)
157  sPen.setColor(selectionColor());
158  else
159  sPen.setColor(sTextColor);
160  else
161  sPen.setColor(penColor(option->state, sTextColor));
162  painter->setPen(sPen);
163  painter->drawText(mOutputPinPositions.at(i), mOutputPins.at(i).name);
164  }
165 
166  if (sLod < graph_widget_constants::sGateMaxLod)
167  {
168  QColor fade = mColor;
169  fade.setAlphaF(sAlpha);
170  painter->fillRect(QRectF(0, sColorBarHeight, mWidth, mHeight - sColorBarHeight), fade);
171  }
172 
173  if (option->state & QStyle::State_Selected)
174  {
175  sPen.setColor(selectionColor());
176  sPen.setCosmetic(true);
177  painter->setPen(sPen);
178  sPen.setCosmetic(false);
179  bool original_antialiasing_value = painter->renderHints().testFlag(QPainter::Antialiasing);
180  painter->setRenderHint(QPainter::Antialiasing, true);
181  painter->setBrush(QBrush());
182  painter->drawRect(boundingRect());
183  //painter->drawRect(boundingRect().marginsAdded(QMarginsF(0.5, 0.5, 0.5, 0.5)));
184  painter->setRenderHint(QPainter::Antialiasing, original_antialiasing_value);
185  }
186  else
187  {
188  QColor gcol = groupingColor();
189  if (gcol.isValid())
190  {
191  QPen grPen(gcol);
192  painter->drawRect(boundingRect());
193  }
194  }
195  }
196  }
197 
199  {
200  Q_UNUSED(pin_type)
201 
202  int index = 0;
203 
204  for (; index < mInputPins.size(); ++index)
205  if (mInputPins.at(index).mNetId == mNetId)
206  break;
207 
208  assert(index < mInputPins.size());
209 
210  return endpointPositionByIndex(index,true);
211  }
212 
214  {
215  Q_UNUSED(pin_type)
216 
217  int index = 0;
218 
219  for (; index < mOutputPins.size(); ++index)
220  if (mOutputPins.at(index).mNetId == mNetId)
221  break;
222 
223  assert(index < mOutputPins.size());
224 
225  return endpointPositionByIndex(index,false);
226  }
227 
229  {
230  return (sPinFontHeight + sPinInnerVerticalSpacing);
231  }
232 
234  {
235  return (sColorBarHeight + sPinUpperVerticalSpacing + sPinFontHeight / 2);
236  }
237 
239  {
240  qreal y = yTopPinDistance() + index * yEndpointDistance();
241  return mapToScene(QPointF(isInput ? 0 : mWidth, y));
242  }
243 
244  void StandardGraphicsModule::format(const bool& adjust_size_to_grid)
245  {
246  qreal textWidth[3] = {0, 0, 0};
247  for (int iline = 0; iline < 3; iline++)
248  {
249  QFontMetricsF fmf(sTextFont[iline]);
250  textWidth[iline] = fmf.width(mNodeText[iline]);
251  }
252 
253  QFontMetricsF pin_fm(sPinFont);
254  qreal max_pin_width = 0;
255 
256  for (const ModulePin& input_pin : mInputPins)
257  {
258  qreal width = pin_fm.width(input_pin.name);
259  if (width > max_pin_width)
260  max_pin_width = width;
261  }
262 
263  for (const ModulePin& output_pin : mOutputPins)
264  {
265  qreal width = pin_fm.width(output_pin.name);
266  if (width > max_pin_width)
267  max_pin_width = width;
268  }
269 
270  qreal total_input_pin_height = 0;
271 
272  if (!mInputPins.isEmpty())
273  total_input_pin_height = mInputPins.size() * sPinFontHeight + (mInputPins.size() - 1) * sPinInnerVerticalSpacing + sPinUpperVerticalSpacing + sPinLowerVerticalSpacing;
274 
275  qreal total_output_pin_height = 0;
276 
277  if (!mOutputPins.isEmpty())
278  total_output_pin_height =
279  mOutputPins.size() * sPinFontHeight + (mOutputPins.size() - 1) * sPinInnerVerticalSpacing + sPinUpperVerticalSpacing + sPinLowerVerticalSpacing;
280 
281  qreal max_pin_height = std::max(total_input_pin_height, total_output_pin_height);
282  qreal min_body_height = sInnerNameTypeSpacing + 2 * sOuterNameTypeSpacing;
283  qreal maxTextWidth = 0;
284  for (int iline = 0; iline < 3; iline++)
285  {
286  if (iline != 2 || !mNodeText[iline].isEmpty())
287  min_body_height += sTextFontHeight[iline];
288  if (maxTextWidth < textWidth[iline])
289  maxTextWidth = textWidth[iline];
290  }
291 
292  mWidth = max_pin_width * 2 + sPinInnerHorizontalSpacing * 2 + sPinOuterHorizontalSpacing * 2 + maxTextWidth;
293  mHeight = std::max(max_pin_height, min_body_height) + sColorBarHeight;
294 
295  if (adjust_size_to_grid)
296  {
297  int floored_width = static_cast<int>(mWidth);
298  int quotient = floored_width / graph_widget_constants::sGridSize;
299 
300  if (mWidth > quotient * graph_widget_constants::sGridSize)
301  mWidth = (quotient + 1) * graph_widget_constants::sGridSize;
302 
303  int floored_height = static_cast<int>(mHeight);
304  quotient = floored_height / graph_widget_constants::sGridSize;
305 
306  if (mHeight > quotient * graph_widget_constants::sGridSize)
307  mHeight = (quotient + 1) * graph_widget_constants::sGridSize;
308  }
309 
310  qreal ytext = std::max(mHeight / 2 - sTextFontHeight[0] * 3 / 2 - sInnerNameTypeSpacing / 2, sColorBarHeight + sOuterNameTypeSpacing);
311 
312  for (int iline = 0; iline < 3; iline++)
313  {
314  ytext += sTextFontHeight[iline];
315  mTextPosition[iline].setX(mWidth / 2 - textWidth[iline] / 2);
316  mTextPosition[iline].setY(ytext);
317  ytext += sInnerNameTypeSpacing / 2;
318  }
319 
320  qreal y = sColorBarHeight + sPinUpperVerticalSpacing + sPinFontAscent + sBaseline;
321 
322  for (const ModulePin& output_pin : mOutputPins)
323  {
324  qreal x = mWidth - (pin_fm.size(0, output_pin.name).rwidth() + sPinOuterHorizontalSpacing);
325  mOutputPinPositions.append(QPointF(x, y));
326  y += (sPinFontHeight + sPinInnerVerticalSpacing);
327  }
328  }
329 } // namespace hal
static QColor sSelectionColor
Definition: graphics_item.h:98
QColor selectionColor() const
static QColor sHighlightColor
QColor penColor(QStyle::State state, const QColor &colorHint=QColor()) const
QColor groupingColor() const
static qreal sLod
Definition: graphics_item.h:93
Abstract base class for modules.
QVector< ModulePin > mOutputPins
QVector< ModulePin > mInputPins
virtual QRectF boundingRect() const override
QString mNodeText[3]
qreal width() const
static GraphicsQssAdapter * instance()
ItemType focusType() const
Subfocus subfocus() const
u32 subfocusIndex() const
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget=nullptr) override
QPointF getOutputScenePosition(const u32 mNetId, const QString &pin_type) const override
float yEndpointDistance() const override
QPointF endpointPositionByIndex(int index, bool isInput) const override
QPointF getInputScenePosition(const u32 mNetId, const QString &pin_type) const override
StandardGraphicsModule(Module *m, bool adjust_size_to_grid=true)
SelectionRelay * gSelectionRelay
Definition: plugin_gui.cpp:83
quint32 u32
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
bool isValid() const const
void setAlphaF(qreal alpha)
void setPixelSize(int pixelSize)
qreal ascent() const const
qreal descent() const const
qreal height() const const
QPointF mapToScene(const QPointF &point) const const
qreal x() const const
qreal y() const const
void drawRect(const QRectF &rectangle)
void drawText(const QPointF &position, const QString &text)
void fillRect(const QRectF &rectangle, const QBrush &brush)
QPainter::RenderHints renderHints() const const
void setBrush(const QBrush &brush)
void setFont(const QFont &font)
void setPen(const QColor &color)
void setRenderHint(QPainter::RenderHint hint, bool on)
void setColor(const QColor &color)
void setCosmetic(bool cosmetic)
void setJoinStyle(Qt::PenJoinStyle style)
QPixmap fromImage(const QImage &image, Qt::ImageConversionFlags flags)
void setX(qreal x)
void setY(qreal y)
qreal y() const const
MiterJoin
void append(const T &value)
const T & at(int i) const const