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