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