HAL
standard_graphics_gate.cpp
Go to the documentation of this file.
2 
4 
12 #include "gui/gui_globals.h"
13 
14 #include <QFont>
15 #include <QFontMetricsF>
16 #include <QPainter>
17 #include <QPen>
18 #include <QStyle>
19 #include <QStyleOptionGraphicsItem>
20 
21 namespace hal{
22 static const qreal sBaseline = 1;
23 
24 qreal StandardGraphicsGate::sAlpha;
25 
26 QPen StandardGraphicsGate::sPen;
27 
29 
30 QFont StandardGraphicsGate::sTextFont[2];
31 QFont StandardGraphicsGate::sPinFont;
32 
33 qreal StandardGraphicsGate::sTextFontHeight[2];
34 
35 qreal StandardGraphicsGate::sColorBarHeight = 30;
36 
37 qreal StandardGraphicsGate::sPinInnerHorizontalSpacing = 12;
38 qreal StandardGraphicsGate::sPinOuterHorizontalSpacing = 2.4;
39 
40 qreal StandardGraphicsGate::sPinInnerVerticalSpacing = 1.2;
41 qreal StandardGraphicsGate::sPinOuterVerticalSpacing = 0.6;
42 qreal StandardGraphicsGate::sPinUpperVerticalSpacing = 2;
43 qreal StandardGraphicsGate::sPinLowerVerticalSpacing = 1.8;
44 
45 qreal StandardGraphicsGate::sPinFontHeight;
46 qreal StandardGraphicsGate::sPinFontAscent;
47 qreal StandardGraphicsGate::sPinFontDescent;
48 qreal StandardGraphicsGate::sPinFontBaseline;
49 
50 qreal StandardGraphicsGate::sInnerNameTypeSpacing = 1.2;
51 qreal StandardGraphicsGate::sOuterNameTypeSpacing = 3;
52 
53 qreal StandardGraphicsGate::sFirstPinY;
54 qreal StandardGraphicsGate::sPinYStride;
55 
56 const int StandardGraphicsGate::sIconPadding = 3;
57 const QSize StandardGraphicsGate::sIconSize(sColorBarHeight - 2 * sIconPadding,
58  sColorBarHeight - 2 * sIconPadding);
59 QPixmap* StandardGraphicsGate::sIconInstance = nullptr;
60 
61 const QPixmap& StandardGraphicsGate::iconPixmap()
62 {
63  if (!sIconInstance) sIconInstance
64  = new QPixmap(QPixmap::fromImage(QImage(":/icons/sel_gate").scaled(sIconSize)));
65  return *sIconInstance;
66 }
67 
68 
70 {
71  sPen.setCosmetic(true);
73 
75 
76  QFont font = QFont("Iosevka");
77  font.setPixelSize(graph_widget_constants::sFontSize);
78 
79  for (int iline=0; iline<2; iline++)
80  {
81  sTextFont[iline] = font;
82  QFontMetricsF fmf(font);
83  sTextFontHeight[iline] = fmf.height();
84  }
85 
86  sPinFont = font;
87  QFontMetricsF pin_fm(sPinFont);
88  sPinFontHeight = pin_fm.height();
89  sPinFontAscent = pin_fm.ascent();
90  sPinFontDescent = pin_fm.descent();
91  sPinFontBaseline = 1;
92 
93  sFirstPinY = sColorBarHeight + sPinUpperVerticalSpacing + sPinFontHeight;
94  sPinYStride = sPinFontHeight + sPinInnerVerticalSpacing;
95 }
96 
98 {
99  if (sLod <= graph_widget_constants::sGateMaxLod)
100  sAlpha = 1 - (sLod - graph_widget_constants::sGateMinLod) / (graph_widget_constants::sGateMaxLod - graph_widget_constants::sGateMinLod);
101  else
102  sAlpha = 0;
103 }
104 
105 StandardGraphicsGate::StandardGraphicsGate(Gate* g, const bool adjust_size_to_grid) : GraphicsGate(g)
106 {
107  format(adjust_size_to_grid);
108 }
109 
111 {
112  Q_UNUSED(widget);
113 
114  if (sLod < graph_widget_constants::sGateMinLod)
115  {
116  painter->fillRect(QRectF(0, 0, mWidth, mHeight), penColor(option->state));
117  return;
118  }
119  else
120  {
121  QList<u32> inpNets = inputNets();
122  QList<u32> outNets = outputNets();
123 
124  painter->fillRect(QRectF(0, 0, mWidth, sColorBarHeight), mColor);
125  painter->fillRect(QRectF(0, sColorBarHeight, mWidth, mHeight - sColorBarHeight), GraphicsQssAdapter::instance()->nodeBackgroundColor());
126 // QRectF iconRect(sIconPadding,sIconPadding,sIconSize.width(),sIconSize.height());
127 // painter->fillRect(iconRect,Qt::black);
128 // painter->drawPixmap(QPoint(sIconPadding,sIconPadding), iconPixmap());
129 
130  sPen.setColor(penColor(option->state,sTextColor));
131  painter->setPen(sPen);
132 
133  for (int iline=0; iline<2; iline++)
134  {
135  painter->setFont(sTextFont[iline]);
136  painter->drawText(mTextPosition[iline], mNodeText[iline]);
137  }
138 
139  bool gateHasFocus =
141  && gSelectionRelay->focusId() == mId;
142  int subFocusIndex = static_cast<int>(gSelectionRelay->subfocusIndex());
143 
144  painter->setFont(sPinFont);
145  sPen.setColor(sTextColor);
146  painter->setPen(sPen);
147 
148  int yFirstTextline = sColorBarHeight + sPinUpperVerticalSpacing + sPinFontAscent + sBaseline;
149 
150  for (int i = 0; i < mInputPins.size(); ++i)
151  {
152  Q_ASSERT(i < inpNets.size());
153  u32 inpNetId = inpNets.at(i);
154  int yText = yFirstTextline + i * (sPinFontHeight + sPinInnerVerticalSpacing);
155 
156  if (gateHasFocus)
158  && i == subFocusIndex)
159  sPen.setColor(selectionColor());
160  else
161  sPen.setColor(sTextColor);
162  else
163  {
164  QColor pinTextColor = penColor(option->state,sTextColor);
165  if (inpNetId)
166  {
168  {
170  if (pinBackground.isValid())
171  {
172  float wbox = mInputPinTextWidth.at(i) > sPinFontHeight ? mInputPinTextWidth.at(i) : sPinFontHeight;
173  QBrush lastBrush = painter->brush();
174  painter->setBrush(pinBackground);
175  painter->setPen(QPen(pinBackground,0));
176  painter->drawRoundRect(sPinOuterHorizontalSpacing,yText-sPinFontAscent,wbox,sPinFontHeight,35,35);
177  painter->setBrush(lastBrush);
178  pinTextColor = legibleColor(pinBackground);
179  }
180  }
181  }
182  sPen.setColor(pinTextColor);
183  }
184  painter->setPen(sPen);
185  painter->drawText(QPointF(sPinOuterHorizontalSpacing,yText), mInputPins.at(i));
186  }
187 
188  for (int i = 0; i < mOutputPins.size(); ++i)
189  {
190  Q_ASSERT(i < outNets.size());
191  u32 outNetId = outNets.at(i);
192  int yText = yFirstTextline + i * (sPinFontHeight + sPinInnerVerticalSpacing);
193  if (gateHasFocus)
195  && i == subFocusIndex)
196  sPen.setColor(selectionColor());
197  else
198  sPen.setColor(sTextColor);
199  else
200  {
201  QColor pinTextColor = penColor(option->state,sTextColor);
202  if (outNetId)
203  {
205  {
207  if (pinBackground.isValid())
208  {
209  QBrush lastBrush = painter->brush();
210  painter->setBrush(pinBackground);
211  painter->setPen(QPen(pinBackground,0));
212  float wbox = sPinFontHeight;
213  float xbox = mWidth - sPinOuterHorizontalSpacing - sPinFontHeight;
214  if (mOutputPinTextWidth.at(i) > wbox)
215  {
216  xbox -= (mOutputPinTextWidth.at(i) - wbox);
217  wbox = mOutputPinTextWidth.at(i);
218  }
219  painter->drawRoundRect(xbox,yText-sPinFontAscent,wbox,sPinFontHeight,35,35);
220  painter->setBrush(lastBrush);
221  pinTextColor = legibleColor(pinBackground);
222  }
223  }
224  }
225  sPen.setColor(pinTextColor);
226  }
227  painter->setPen(sPen);
228  painter->drawText(QPointF(mWidth - sPinOuterHorizontalSpacing - mOutputPinTextWidth.at(i), yText), mOutputPins.at(i));
229  }
230 
231  if (sLod < graph_widget_constants::sGateMaxLod)
232  {
233  QColor fade = mColor;
234  fade.setAlphaF(sAlpha);
235  painter->fillRect(QRectF(0, sColorBarHeight, mWidth, mHeight - sColorBarHeight), fade);
236  }
237 
238  if (option->state & QStyle::State_Selected)
239  {
240  sPen.setColor(selectionColor());
241  sPen.setCosmetic(true);
242  painter->setPen(sPen);
243  sPen.setCosmetic(false);
244  bool original_antialiasing_value = painter->renderHints().testFlag(QPainter::Antialiasing);
245  painter->setRenderHint(QPainter::Antialiasing, true);
246  painter->setBrush(QBrush());
247  painter->drawRect(boundingRect());
248  //painter->drawRect(boundingRect().marginsAdded(QMarginsF(0.5, 0.5, 0.5, 0.5)));
249  painter->setRenderHint(QPainter::Antialiasing, original_antialiasing_value);
250  }
251  else
252  {
253  QColor gcol = groupingColor();
254  if (gcol.isValid())
255  {
256  QPen grPen(gcol);
257  painter->setPen(grPen);
258  painter->drawRect(boundingRect());
259  }
260  }
261  }
262 }
263 
264 QColor StandardGraphicsGate::legibleColor(const QColor& bgColor)
265 {
266  // brightness of color according to YUV color scheme
267  const static float kr = 0.229;
268  const static float kb = 0.114;
269  float y = kr*bgColor.red() + (1-kr-kb)*bgColor.green() + kb*bgColor.blue();
270 
271  if (y > 127.5) return QColor(Qt::black);
272  return QColor(Qt::white);
273 }
274 
276 {
277  Q_UNUSED(mNetId)
278 
279  int index = mInputPins.indexOf(pin_type);
280  assert(index != -1);
281 
282  return endpointPositionByIndex(index,true);
283 }
284 
286 {
287  Q_UNUSED(mNetId)
288 
289  int index = mOutputPins.indexOf(pin_type);
290  assert(index != -1);
291 
292  return endpointPositionByIndex(index,false);
293 }
294 
296 {
297  return (sPinFontHeight + sPinInnerVerticalSpacing);
298 }
299 
301 {
302  return (sColorBarHeight + sPinUpperVerticalSpacing + sPinFontHeight / 2);
303 }
304 
306 {
307  qreal y = yTopPinDistance() + index * yEndpointDistance();
308  return mapToScene(QPointF(isInput ? 0 : mWidth, y));
309 }
310 
311 void StandardGraphicsGate::format(const bool& adjust_size_to_grid)
312 {
313  qreal textWidth[2];
314  for (int iline=0; iline<2; iline++)
315  {
316  QFontMetricsF fmf(sTextFont[iline]);
317  textWidth[iline] = fmf.width(mNodeText[iline]);
318  }
319 
320  QFontMetricsF pin_fm(sPinFont);
321  qreal max_pin_width = 0;
322 
323  for (const QString& input_pin : mInputPins)
324  {
325  qreal width = pin_fm.width(input_pin);
326  if (width > max_pin_width)
327  max_pin_width = width;
328  }
329 
330  for (const QString& output_pin : mOutputPins)
331  {
332  qreal width = pin_fm.width(output_pin);
333  if (width > max_pin_width)
334  max_pin_width = width;
335  }
336 
337  qreal total_input_pin_height = 0;
338 
339  if (!mInputPins.isEmpty())
340  total_input_pin_height = mInputPins.size() * sPinFontHeight +
341  (mInputPins.size() - 1) * sPinInnerVerticalSpacing +
342  sPinUpperVerticalSpacing + sPinLowerVerticalSpacing;
343 
344  qreal total_output_pin_height = 0;
345 
346  if (!mOutputPins.isEmpty())
347  total_output_pin_height = mOutputPins.size() * sPinFontHeight +
348  (mOutputPins.size() - 1) * sPinInnerVerticalSpacing +
349  sPinUpperVerticalSpacing + sPinLowerVerticalSpacing;
350 
351  qreal max_pin_height = std::max(total_input_pin_height, total_output_pin_height);
352  qreal min_body_height = sInnerNameTypeSpacing + 2 * sOuterNameTypeSpacing;
353 
354  qreal maxTextWidth = 0;
355  for (int iline=0; iline<2; iline++)
356  {
357  min_body_height += sTextFontHeight[iline];
358  if (maxTextWidth < textWidth[iline]) maxTextWidth = textWidth[iline];
359  }
360 
361 
362  mWidth = max_pin_width * 2 + sPinInnerHorizontalSpacing * 2 + sPinOuterHorizontalSpacing * 2 + maxTextWidth;
363  mHeight = std::max(max_pin_height, min_body_height) + sColorBarHeight;
364 
365  if (adjust_size_to_grid)
366  {
367  int floored_width = static_cast<int>(mWidth);
368  int quotient = floored_width / graph_widget_constants::sGridSize;
369 
370  if (mWidth > quotient * graph_widget_constants::sGridSize)
371  mWidth = (quotient + 1) * graph_widget_constants::sGridSize;
372 
373  int floored_height = static_cast<int>(mHeight);
374  quotient = floored_height / graph_widget_constants::sGridSize;
375 
376  if (mHeight > quotient * graph_widget_constants::sGridSize)
377  mHeight = (quotient + 1) * graph_widget_constants::sGridSize;
378  }
379 
380  mTextPosition[0].setX(mWidth / 2 - textWidth[0] / 2);
381  mTextPosition[0].setY(std::max(mHeight / 2 - sTextFontHeight[0] / 2 - sInnerNameTypeSpacing / 2,
382  sColorBarHeight + sOuterNameTypeSpacing + sTextFontHeight[0]));
383 
384  mTextPosition[1].setX(mWidth / 2 - textWidth[1] / 2);
385  mTextPosition[1].setY(mTextPosition[0].y() + sTextFontHeight[1] + sInnerNameTypeSpacing / 2);
386 
387  qreal y = sColorBarHeight + sPinUpperVerticalSpacing + sPinFontAscent + sBaseline;
388 
389  for (const QString& input_pin : mInputPins)
390  mInputPinTextWidth.append(pin_fm.size(0, input_pin).rwidth());
391 
392  for (const QString& output_pin : mOutputPins)
393  mOutputPinTextWidth.append(pin_fm.size(0, output_pin).rwidth());
394 }
395 }
GroupingManagerWidget * getGroupingManagerWidget()
Definition: gate.h:58
static SettingsItemCheckbox * sSettingNetGroupingToPins
Abstract base class for gates.
Definition: graphics_gate.h:48
QVector< QString > mOutputPins
Definition: graphics_gate.h:77
QVector< QString > mInputPins
Definition: graphics_gate.h:72
QColor selectionColor() const
QColor penColor(QStyle::State state, const QColor &colorHint=QColor()) const
QColor groupingColor() const
static qreal sLod
Definition: graphics_item.h:93
virtual QRectF boundingRect() const override
QList< u32 > inputNets() const
QString mNodeText[3]
qreal width() const
QList< u32 > outputNets() const
static GraphicsQssAdapter * instance()
GroupingTableModel * getModel() const
QColor colorForItem(ItemType itemType, u32 itemId) const
ItemType focusType() const
Subfocus subfocus() const
u32 subfocusIndex() const
virtual QVariant value() const override
float yTopPinDistance() const override
QPointF getOutputScenePosition(const u32 mNetId, const QString &pin_type) const override
float yEndpointDistance() const override
QPointF getInputScenePosition(const u32 mNetId, const QString &pin_type) const override
StandardGraphicsGate(Gate *g, const bool adjust_size_to_grid=true)
QPointF endpointPositionByIndex(int index, bool isInput) const override
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget=nullptr) override
ContentManager * gContentManager
Definition: plugin_gui.cpp:78
GraphContextManager * gGraphContextManager
Definition: plugin_gui.cpp:85
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
int blue() const const
int green() const const
bool isValid() const const
int red() 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 y() const const
const T & at(int i) const const
int size() const const
void drawRoundRect(const QRectF &r, int xRnd, int yRnd)
const QBrush & brush() 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)
MiterJoin
bool toBool() const const
void append(const T &value)
const T & at(int i) const const
int indexOf(const T &value, int from) const const
bool isEmpty() const const
int size() const const