HAL  v4.5.0-133-g64838ea8d
The Hardware Analyzer - a comprehensive reverse engineering and manipulation framework for gate-level netlists.
grouping_manager_widget.cpp
Go to the documentation of this file.
2 
3 #include "gui/action/action.h"
7 #include "gui/gui_def.h"
8 #include "gui/gui_globals.h"
13 #include "gui/toolbar/toolbar.h"
21 #include "hal_core/utilities/log.h"
24 
25 #include <QAction>
26 #include <QApplication>
27 #include <QColorDialog>
28 #include <QHeaderView>
29 #include <QImage>
30 #include <QMenu>
31 #include <QResizeEvent>
32 #include <QShortcut>
33 #include <QSize>
34 #include <QStringList>
35 #include <QVBoxLayout>
36 #include <unordered_set>
37 
38 namespace hal
39 {
41  : ContentWidget("Groupings", parent), mProxyModel(new GroupingProxyModel(this)), mSearchbar(new Searchbar(this)), mNewGroupingAction(new QAction(this)),
42  mRenameAction(new QAction(this)), mColorSelectAction(new QAction(this)), mDeleteAction(new QAction(this)), mToSelectionAction(new QAction(this)), mTableAction(new QAction(this))
43  {
44  //needed to load the properties
46 
47  mNewGroupingAction->setIcon(gui_utility::getStyledSvgIcon(mNewGroupingIconStyle, mNewGroupingIconPath));
48  mRenameAction->setIcon(gui_utility::getStyledSvgIcon(mRenameGroupingIconStyle, mRenameGroupingIconPath));
49  mDeleteAction->setIcon(gui_utility::getStyledSvgIcon(mDeleteIconStyle, mDeleteIconPath));
50  mColorSelectAction->setIcon(gui_utility::getStyledSvgIcon(mColorSelectIconStyle, mColorSelectIconPath));
51  mToSelectionAction->setIcon(gui_utility::getStyledSvgIcon(mToSelectionIconStyle, mToSelectionIconPath));
52  mSearchAction->setIcon(gui_utility::getStyledSvgIcon(mSearchIconStyle, mSearchIconPath));
53  mTableAction->setIcon(gui_utility::getStyledSvgIcon(mTableIconStyle, mTableIconPath));
54 
55  mNewGroupingAction->setToolTip("New");
56  mRenameAction->setToolTip("Rename");
57  mColorSelectAction->setToolTip("Color");
58  mDeleteAction->setToolTip("Delete");
59  mToSelectionAction->setToolTip("To selection");
60  mSearchAction->setToolTip("Search");
61  mTableAction->setToolTip("Show content");
62 
63  mNewGroupingAction->setText("Create new grouping");
64  mRenameAction->setText("Rename grouping");
65  mColorSelectAction->setText("Select color for grouping");
66  mDeleteAction->setText("Delete grouping");
67  mToSelectionAction->setText("Add grouping to selection");
68  mSearchAction->setText("Search");
69  mTableAction->setText("Show content");
70 
71  //mOpenAction->setEnabled(false);
72  //mRenameAction->setEnabled(false);
73  //mDeleteAction->setEnabled(false);
74 
75  mGroupingTableModel = new GroupingTableModel(false, this);
76  mColorSerializer.restore(mGroupingTableModel);
77 
78  mProxyModel->setSourceModel(mGroupingTableModel);
79  mProxyModel->setSortRole(Qt::UserRole);
80 
81  mGroupingTableView = new QTableView(this);
82  mGroupingTableView->setModel(mProxyModel);
84  mGroupingTableView->setSelectionMode(QAbstractItemView::SingleSelection); // ERROR ???
85  mGroupingTableView->setContextMenuPolicy(Qt::ContextMenuPolicy::CustomContextMenu);
86  mGroupingTableView->verticalHeader()->hide();
88  mGroupingTableView->setItemDelegateForColumn(2, new GroupingColorDelegate(mGroupingTableView));
89  mGroupingTableView->setSortingEnabled(true);
90  mGroupingTableView->sortByColumn(0, Qt::SortOrder::AscendingOrder);
91 
96  QFont font = mGroupingTableView->horizontalHeader()->font();
97  font.setBold(true);
98  mGroupingTableView->horizontalHeader()->setFont(font);
99  mContentLayout->addWidget(mGroupingTableView);
100  mContentLayout->addWidget(mSearchbar);
101 
102  mSearchbar->hide();
103  mSearchbar->setColumnNames(mProxyModel->getColumnNames());
104 
105  connect(mSearchbar, &Searchbar::triggerNewSearch, this, &GroupingManagerWidget::updateSearchIcon);
107 
108  connect(mNewGroupingAction, &QAction::triggered, this, &GroupingManagerWidget::handleCreateGroupingClicked);
109  connect(mRenameAction, &QAction::triggered, this, &GroupingManagerWidget::handleRenameGroupingClicked);
110  connect(mColorSelectAction, &QAction::triggered, this, &GroupingManagerWidget::handleColorSelectClicked);
111  connect(mToSelectionAction, &QAction::triggered, this, &GroupingManagerWidget::handleToSelectionClicked);
112  connect(mDeleteAction, &QAction::triggered, this, &GroupingManagerWidget::handleDeleteGroupingClicked);
113  connect(mSearchAction, &QAction::triggered, this, &GroupingManagerWidget::toggleSearchbar);
114  connect(mTableAction, &QAction::triggered, this, &GroupingManagerWidget::handleShowContentClicked);
115 
116  connect(mGroupingTableView, &QTableView::customContextMenuRequested, this, &GroupingManagerWidget::handleContextMenuRequest);
120  connect(mGroupingTableView, &QTableView::doubleClicked, this, &GroupingManagerWidget::handleDoubleClicked);
122 
123  mShortCutDeleteItem = new QShortcut(ContentManager::sSettingDeleteItem->value().toString(), this);
124  mShortCutDeleteItem->setEnabled(false);
125 
127  connect(mShortCutDeleteItem, &QShortcut::activated, this, &GroupingManagerWidget::handleDeleteGroupingClicked);
128 
129  connect(qApp, &QApplication::focusChanged, this, &GroupingManagerWidget::handleDeleteShortcutOnFocusChanged);
130  }
131 
133  {
136 
137  QList<QShortcut*> list;
138  list.append(mSearchShortcut);
139 
140  return list;
141  }
142 
143  QIcon GroupingManagerWidget::toolboxIcon() const
144  {
145  QIcon retval(":/icons/toolbox");
146  QImage img(":/icons/toolbox");
147  for (int x = 0; x < img.width(); x++)
148  for (int y = 0; y < img.width(); y++)
149  {
150  int h, s, v;
151  QColor col = img.pixelColor(x, y);
152  col.getHsv(&h, &s, &v);
153  v /= 3;
154  col.setHsv(h, s, v);
155  img.setPixelColor(x, y, col);
156  }
157  retval.addPixmap(QPixmap::fromImage(img), QIcon::Disabled);
158  return retval;
159  }
160 
161  void GroupingManagerWidget::handleCreateGroupingClicked()
162  {
163  ActionCreateObject* act = new ActionCreateObject(UserActionObjectType::Grouping);
164  act->exec();
165  }
166 
167  void GroupingManagerWidget::handleColorSelectClicked()
168  {
169  QModelIndex currentIndex = mProxyModel->mapToSource(mGroupingTableView->currentIndex());
170  if (!currentIndex.isValid())
171  return;
172  QModelIndex nameIndex = mGroupingTableModel->index(currentIndex.row(), 0);
173  QString name = mGroupingTableModel->data(nameIndex, Qt::DisplayRole).toString();
174  QModelIndex idIndex = mGroupingTableModel->index(currentIndex.row(), 1);
175  u32 id = mGroupingTableModel->data(idIndex, Qt::DisplayRole).toInt();
176  QModelIndex modelIndex = mGroupingTableModel->index(currentIndex.row(), 2);
177  QColor color = mGroupingTableModel->data(modelIndex, Qt::BackgroundRole).value<QColor>();
178  color = QColorDialog::getColor(color, this, "Select color for grouping " + name);
179  if (color.isValid())
180  {
181  ActionSetObjectColor* act = new ActionSetObjectColor(color);
182  act->setObject(UserActionObject(id, UserActionObjectType::Grouping));
183  act->exec();
184  }
185  }
186 
187  void GroupingManagerWidget::handleToolboxClicked()
188  {
189  QMenu* toolboxMenu = new QMenu(this);
190  QAction* toolPredecessor = new Action("Predecessor tree to new grouping");
192  toolboxMenu->addAction(toolPredecessor);
193  QAction* toolSuccessor = new Action("Successor tree to new grouping");
195  toolboxMenu->addAction(toolSuccessor);
196  QAction* toolPreStep = new Action("Groupings by predecessor distance");
197  toolboxMenu->addAction(toolPreStep);
199  QAction* toolSucStep = new Action("Groupings by successor distance");
200  toolboxMenu->addAction(toolSucStep);
202  toolboxMenu->exec(mapToGlobal(pos() + QPoint(100, -25)));
203  }
204 
205  void GroupingManagerWidget::handleDoubleClicked(const QModelIndex& index)
206  {
207  if (index.column() == 0)
208  handleShowContentClicked();
209  if (index.column() == 2)
210  handleColorSelectClicked();
211  }
212 
213  GroupingManagerWidget::ToolboxNode::ToolboxNode(Endpoint* ep, const ToolboxModuleHash* tmh)
214  {
215  if (ep)
216  {
217  Gate* g = ep->get_gate();
218  if (tmh && tmh->mHash.contains(g))
219  mNode = Node(tmh->mHash.value(g)->get_id(), Node::Module);
220  else
221  mNode = Node(g->get_id(), Node::Gate);
222  }
223  else
224  {
226  mNode = Node(gSelectionRelay->selectedModulesList().at(0), Node::Module);
227  else
228  mNode = Node(gSelectionRelay->selectedGatesList().at(0), Node::Gate);
229  }
230  switch (mNode.type())
231  {
232  case Node::Module:
233  mName = QString::fromStdString(gNetlist->get_module_by_id(mNode.id())->get_name());
234  break;
235  case Node::Gate:
236  mName = QString::fromStdString(gNetlist->get_gate_by_id(mNode.id())->get_name());
237  break;
238  default:
239  return;
240  }
241  }
242 
243  GroupingManagerWidget::ToolboxNode::ToolboxNode(const GraphicsItem* item)
244  {
245  switch (item->itemType())
246  {
247  case ItemType::Module:
248  mNode = Node(item->id(), Node::Module);
249  mName = QString::fromStdString(gNetlist->get_module_by_id(mNode.id())->get_name());
250  break;
251  case ItemType::Gate:
252  mNode = Node(item->id(), Node::Gate);
253  mName = QString::fromStdString(gNetlist->get_gate_by_id(mNode.id())->get_name());
254  break;
255  default:
256  break;
257  }
258  }
259 
260  std::vector<Net*> GroupingManagerWidget::ToolboxNode::inputNets() const
261  {
262  switch (mNode.type())
263  {
264  case Node::Module:
266  case Node::Gate:
267  return gNetlist->get_gate_by_id(mNode.id())->get_fan_in_nets();
268  default:
269  break;
270  }
271  return std::vector<Net*>();
272  }
273 
274  std::vector<Net*> GroupingManagerWidget::ToolboxNode::outputNets() const
275  {
276  switch (mNode.type())
277  {
278  case Node::Module:
280  case Node::Gate:
281  return gNetlist->get_gate_by_id(mNode.id())->get_fan_out_nets();
282  default:
283  break;
284  }
285  return std::vector<Net*>();
286  }
287 
288  GroupingManagerWidget::ToolboxModuleHash::ToolboxModuleHash(const Node& nd)
289  {
290  Module* parentModule = nullptr;
291  switch (nd.type())
292  {
293  case Node::Module:
294  parentModule = gNetlist->get_module_by_id(nd.id())->get_parent_module();
295  break;
296  case Node::Gate:
297  parentModule = gNetlist->get_gate_by_id(nd.id())->get_module();
298  default:
299  break;
300  }
301  if (!parentModule)
302  return;
303  for (Module* sm : parentModule->get_submodules())
304  for (Gate* g : sm->get_gates(nullptr, true))
305  mHash[g] = sm;
306  }
307 
309  {
310  newGroupingSuccOrPred(0, false, nullptr);
311  }
312 
314  {
315  newGroupingSuccOrPred(0, true, nullptr);
316  }
317 
318  void GroupingManagerWidget::newGroupingSuccOrPred(int maxDepth, bool succ, const GraphicsItem* item)
319  {
320  QSet<u32> mods, gats, nets;
321  ToolboxNode tbn;
322  if (item)
323  tbn = ToolboxNode(item);
324  ToolboxModuleHash tmh(tbn.mNode);
325  QVector<Net*> todoNet;
326  QSet<Node> handledBox;
327  QSet<Net*> handledNet;
328  todoNet.append(QtCompat::stdVectorToVector<Net*>(succ ? tbn.outputNets() : tbn.inputNets()));
329  handledBox.insert(tbn.mNode);
330  for (int loop = 0; !maxDepth || loop < maxDepth; loop++)
331  {
332  if (todoNet.isEmpty())
333  break;
334  QVector<Net*> nextRound;
335  for (Net* n : todoNet)
336  {
337  if (handledNet.contains(n))
338  continue;
339  handledNet.insert(n);
340  nets.insert(n->get_id());
341  for (Endpoint* ep : (succ ? n->get_destinations() : n->get_sources()))
342  {
343  ToolboxNode nextNode(ep, &tmh);
344  if (handledBox.contains(nextNode.mNode))
345  continue;
346  handledBox.insert(nextNode.mNode);
347  switch (nextNode.mNode.type())
348  {
349  case Node::Module:
350  mods.insert(nextNode.mNode.id());
351  break;
352  case Node::Gate:
353  gats.insert(nextNode.mNode.id());
354  break;
355  default:
356  continue;
357  }
358  nextRound.append(QtCompat::stdVectorToVector<Net*>(succ ? nextNode.outputNets() : nextNode.inputNets()));
359  }
360  }
361  todoNet = nextRound;
362  }
363 
365  act->setUseCreatedObject();
366  act->addAction(new ActionCreateObject(UserActionObjectType::Grouping, tbn.mName + (succ ? " successor" : " predecessor")));
367  act->addAction(new ActionAddItemsToObject(mods, gats, nets));
368  act->exec();
369  }
370 
372  {
373  newGroupingByDistance(3, false, nullptr);
374  }
375 
377  {
378  newGroupingByDistance(3, true, nullptr);
379  }
380 
381  void GroupingManagerWidget::newGroupingByDistance(int maxDepth, bool succ, const GraphicsItem* item)
382  {
383  ToolboxNode tbn;
384  if (item)
385  tbn = ToolboxNode(item);
386  ToolboxModuleHash tmh(tbn.mNode);
387  QVector<Net*> thisDst;
388  QVector<Net*> nextDst;
389  QSet<Node> handledNode;
390  QSet<Net*> handledNet;
391  nextDst.append(QtCompat::stdVectorToVector<Net*>(succ ? tbn.outputNets() : tbn.inputNets()));
392  handledNode.insert(tbn.mNode);
393  for (int iround = 1; iround <= maxDepth; iround++)
394  {
395  if (nextDst.isEmpty())
396  break;
397  thisDst = nextDst;
398  nextDst.clear();
399  QSet<u32> mods, gats, nets;
400  for (Net* n : thisDst)
401  {
402  if (handledNet.contains(n))
403  continue;
404  handledNet.insert(n);
405  nets.insert(n->get_id());
406  for (Endpoint* ep : succ ? n->get_destinations() : n->get_sources())
407  {
408  ToolboxNode nextNode(ep, &tmh);
409  if (handledNode.contains(nextNode.mNode))
410  continue;
411  handledNode.insert(nextNode.mNode);
412  switch (nextNode.mNode.type())
413  {
414  case Node::Module:
415  mods.insert(nextNode.mNode.id());
416  break;
417  case Node::Gate:
418  gats.insert(nextNode.mNode.id());
419  break;
420  default:
421  continue;
422  }
423  nextDst.append(QtCompat::stdVectorToVector<Net*>(succ ? nextNode.outputNets() : nextNode.inputNets()));
424  }
425  }
426  if (!mods.isEmpty() || !nets.isEmpty() || !gats.isEmpty())
427  {
429  act->setUseCreatedObject();
430  act->addAction(new ActionCreateObject(UserActionObjectType::Grouping, QString("%1 step to %2").arg(iround).arg(tbn.mName)));
431  act->addAction(new ActionAddItemsToObject(mods, gats, nets));
432  act->exec();
433  }
434  }
435  }
436 
438  {
439  GroupingDialog gd;
440  if (gd.exec() != QDialog::Accepted) return;
441 
442  UserActionCompound* compound = new UserActionCompound;
443  if (gd.isNewGrouping())
444  {
446  compound->setUseCreatedObject();
447  }
448  ActionAddItemsToObject* act = new ActionAddItemsToObject(modules, gates, nets);
450  compound->addAction(act);
451  compound->exec();
452  }
453 
454  void GroupingManagerWidget::removeElementsFromGrouping(const QSet<u32>& modules, const QSet<u32>& gates, const QSet<u32>& nets)
455  {
456  QMap<Grouping*, std::array<QSet<u32>,3>> groupingMap;
457  for (const u32 id : modules)
458  {
460  if (!module) continue;
461  Grouping* group = module->get_grouping();
462  if(!group) continue;
463  if(!groupingMap.contains(group))
464  groupingMap.insert(group, {QSet<u32>({id}),QSet<u32>(),QSet<u32>()});
465  else
466  groupingMap[group][0].insert(id);
467  }
468  for (const u32 id : gates)
469  {
470  Gate* gate = gNetlist->get_gate_by_id(id);
471  if (!gate) continue;
472  Grouping* group = gate->get_grouping();
473  if(!group) continue;
474  if(!groupingMap.contains(group))
475  groupingMap.insert(group, {QSet<u32>(),QSet<u32>({id}),QSet<u32>()});
476  else
477  groupingMap[group][1].insert(id);
478  }
479  for (const u32 id : nets)
480  {
481  Net* net = gNetlist->get_net_by_id(id);
482  if (!net) continue;
483  Grouping* group = net->get_grouping();
484  if(!group) continue;
485  if(!groupingMap.contains(group))
486  groupingMap.insert(group, {QSet<u32>(),QSet<u32>(),QSet<u32>({id})});
487  else
488  groupingMap[group][2].insert(id);
489  }
490  if (groupingMap.isEmpty()) return;
491 
492  UserActionCompound* compound = new UserActionCompound;
493  for (auto it = groupingMap.keyValueBegin(); it != groupingMap.keyValueEnd(); ++it){
494  auto elements = it->second;
495  ActionRemoveItemsFromObject* act = new ActionRemoveItemsFromObject(elements[0],elements[1],elements[2]);
496  act->setObject(UserActionObject(it->first->get_id(), UserActionObjectType::Grouping));
497  compound->addAction(act);
498  }
499  compound->exec();
500  }
501 
502  void GroupingManagerWidget::handleToSelectionClicked()
503  {
504  QModelIndex currentIndex = mProxyModel->mapToSource(mGroupingTableView->currentIndex());
505  if (!currentIndex.isValid())
506  return;
507  Grouping* grp = getCurrentGrouping().grouping();
508  if (!grp)
509  return;
510  for (Module* m : grp->get_modules())
511  gSelectionRelay->addModule(m->get_id());
512  for (Gate* g : grp->get_gates())
513  gSelectionRelay->addGate(g->get_id());
514  for (Net* n : grp->get_nets())
515  gSelectionRelay->addNet(n->get_id());
517  }
518 
519  void GroupingManagerWidget::handleRenameGroupingClicked()
520  {
521  QModelIndex currentIndex = mProxyModel->mapToSource(mGroupingTableView->currentIndex());
522  if (!currentIndex.isValid())
523  return;
524 
525  InputDialog ipd;
526  ipd.setWindowTitle("Rename Grouping");
527  ipd.setInfoText("Please select a new unique name for the grouping.");
528  int irow = currentIndex.row();
529  QString oldName = mGroupingTableModel->data(mGroupingTableModel->index(irow, 0), Qt::DisplayRole).toString();
530  mGroupingTableModel->setAboutToRename(oldName);
531  ipd.setInputText(oldName);
532  ipd.addValidator(mGroupingTableModel);
533 
534  if (ipd.exec() == QDialog::Accepted)
535  {
536  QString newName = ipd.textValue();
537  if (newName != oldName)
538  {
539  ActionRenameObject* act = new ActionRenameObject(newName);
540  u32 grpId = mGroupingTableModel->data(mGroupingTableModel->index(irow, 1), Qt::DisplayRole).toInt();
541  act->setObject(UserActionObject(grpId, UserActionObjectType::Grouping));
542  act->exec();
543  }
544  }
545  mGroupingTableModel->setAboutToRename(QString());
546  }
547 
548  void GroupingManagerWidget::handleShowContentClicked()
549  {
550  QModelIndex currentIndex = mProxyModel->mapToSource(mGroupingTableView->currentIndex());
551  if (!currentIndex.isValid())
552  return;
553 
554  int irow = currentIndex.row();
555  GroupingTableEntry gte = mGroupingTableModel->groupingAt(irow);
556 
557  QString grpName = gte.name();
558  u32 grpId = gte.id();
559  QColor grpColor = gte.color();
560 
561  QDialog dialog;
562  dialog.setWindowTitle(QString("Content of %1 (ID: %2)").arg(grpName).arg(grpId));
563 
564  // Create color rectangle
565  QLabel colorRectangle(&dialog);
566  colorRectangle.setText(QString()); // Empty text to visualize grouping color
567  colorRectangle.setStyleSheet("background-color: " + grpColor.name());
568  colorRectangle.setFixedSize(25, 25); // Adapt size of grouping color
569  colorRectangle.setAutoFillBackground(true);
570 
571  // Replace InputDialog with SelectionTreeView
572  SelectionTreeView selectionTreeView(&dialog, true);
573  SelectionTreeProxyModel selectionTreeProxyModel(&dialog);
574  ModuleModel moduleModel(&dialog); // Need to fully initialise SelectionTreeView with a model
575  selectionTreeProxyModel.setSourceModel(&moduleModel);
576  selectionTreeView.setModel(&selectionTreeProxyModel);
577 
578  selectionTreeView.populate(true, grpId);
579 
580  QPushButton closeButton("Close",&dialog);// = new QPushButton("Close", &dialog);
581  connect(&closeButton, &QPushButton::clicked, [&dialog](){ dialog.close(); });
582 
583  QVBoxLayout layout(&dialog);
584  QHBoxLayout hlay(&dialog);
585  hlay.addStretch();
586  hlay.addWidget(&colorRectangle);
587  layout.addLayout(&hlay);
588  layout.addWidget(&selectionTreeView);
589  layout.addWidget(&closeButton);
590 
591  dialog.exec();
592  }
593 
594  void GroupingManagerWidget::handleDeleteGroupingClicked()
595  {
596  if (sender() != mDeleteAction &&
597  !hasFocus() && !mGroupingTableView->hasFocus()) return;
598 
599  QModelIndex current = mGroupingTableView->currentIndex();
600  if (!current.isValid()) return;
601  int irow = mProxyModel->mapToSource(mGroupingTableView->currentIndex()).row();
602  u32 grpId = mGroupingTableModel->groupingAt(irow).id();
603  ActionDeleteObject* act = new ActionDeleteObject;
604  act->setObject(UserActionObject(grpId, UserActionObjectType::Grouping));
605  act->exec();
606  }
607 
608  void GroupingManagerWidget::handleContextMenuRequest(const QPoint& point)
609  {
610  const QModelIndex clicked_index = mGroupingTableView->indexAt(point);
611 
612  QMenu context_menu;
613 
614  context_menu.addAction(mNewGroupingAction);
615 
616  if (clicked_index.isValid())
617  {
618  context_menu.addAction(mRenameAction);
619  context_menu.addAction(mColorSelectAction);
620  context_menu.addAction(mToSelectionAction);
621  context_menu.addAction(mDeleteAction);
622  context_menu.addAction(mTableAction);
623  }
624 
625  context_menu.exec(mGroupingTableView->viewport()->mapToGlobal(point));
626  }
627 
628  GroupingTableEntry GroupingManagerWidget::getCurrentGrouping()
629  {
630  QModelIndex modelIndex = mProxyModel->mapToSource(mGroupingTableView->currentIndex());
631 
632  return mGroupingTableModel->groupingAt(modelIndex.row());
633  }
634 
635  void GroupingManagerWidget::setupToolbar(Toolbar* toolbar)
636  {
637  toolbar->addAction(mNewGroupingAction);
638  toolbar->addAction(mRenameAction);
639  toolbar->addAction(mColorSelectAction);
640  toolbar->addAction(mToSelectionAction);
641  toolbar->addAction(mDeleteAction);
642  toolbar->addAction(mSearchAction);
643  toolbar->addAction(mTableAction);
644  mSearchAction->setEnabled(mGroupingTableModel->rowCount() > 0);
645  }
646 
647  void GroupingManagerWidget::setToolbarButtonsEnabled(bool enable)
648  {
649  mRenameAction->setEnabled(enable);
650  mColorSelectAction->setEnabled(enable);
651  mToSelectionAction->setEnabled(enable);
652  mDeleteAction->setEnabled(enable);
653  mTableAction->setEnabled(enable);
654  }
655 
656  void GroupingManagerWidget::handleNewEntryAdded(const QModelIndex& modelIndexName)
657  {
658  if (!modelIndexName.isValid())
659  return;
660  QModelIndex proxyIndex = mProxyModel->mapFromSource(modelIndexName);
661  if (!proxyIndex.isValid())
662  return;
663  mGroupingTableView->setCurrentIndex(proxyIndex);
664  handleCurrentChanged(proxyIndex);
665  }
666 
667  void GroupingManagerWidget::handleLastEntryDeleted()
668  {
669  if (mProxyModel->rowCount())
670  {
671  QModelIndex inx = mProxyModel->index(0, 0);
672  mGroupingTableView->setCurrentIndex(inx);
673  handleCurrentChanged(inx);
674  }
675  else
676  handleCurrentChanged();
677  }
678 
679  void GroupingManagerWidget::handleCurrentChanged(const QModelIndex& current, const QModelIndex& previous)
680  {
681  Q_UNUSED(previous);
682 
683  bool enable = mGroupingTableModel->rowCount() > 0 && current.isValid();
684  QAction* entryBasedAction[] = {mRenameAction, mColorSelectAction, mDeleteAction, mToSelectionAction, mTableAction, nullptr};
685 
686  QStringList iconPath, iconStyle;
687  iconPath << mRenameGroupingIconPath << mColorSelectIconPath << mDeleteIconPath << mToSelectionIconPath << mTableIconPath;
688  iconStyle << mRenameGroupingIconStyle << mColorSelectIconStyle << mDeleteIconStyle << mToSelectionIconStyle << mTableIconStyle;
689 
690  for (int iacc = 0; entryBasedAction[iacc]; iacc++)
691  {
692  entryBasedAction[iacc]->setEnabled(enable);
693  entryBasedAction[iacc]->setIcon(gui_utility::getStyledSvgIcon(enable ? iconStyle.at(iacc) : disabledIconStyle(), iconPath.at(iacc)));
694  }
695  enableSearchbar(mGroupingTableModel->rowCount() > 0);
696  }
697 
698  void GroupingManagerWidget::toggleSearchbar()
699  {
700  if (!mSearchAction->isEnabled())
701  return;
702 
703  if (mSearchbar->isHidden())
704  {
705  mSearchbar->show();
706  mSearchbar->setFocus();
707  }
708  else
709  {
710  mSearchbar->hide();
711  setFocus();
712  }
713  }
714 
715  void GroupingManagerWidget::filter(const QString& text)
716  {
717  QRegularExpression* regex = new QRegularExpression(text);
718  if (regex->isValid())
719  {
720  mProxyModel->setFilterRegularExpression(*regex);
721  QString output = "Groupings widget regular expression '" + text + "' entered.";
722  log_info("user", output.toStdString());
723  }
724  }
725 
726  void GroupingManagerWidget::updateSearchIcon()
727  {
728  if (mSearchbar->filterApplied() && mSearchbar->isVisible())
729  mSearchAction->setIcon(gui_utility::getStyledSvgIcon(mSearchActiveIconStyle, mSearchIconPath));
730  else
731  mSearchAction->setIcon(gui_utility::getStyledSvgIcon(mSearchIconStyle, mSearchIconPath));
732  }
733 
734  void GroupingManagerWidget::enableSearchbar(bool enable)
735  {
736  QString iconStyle = enable ? mSearchIconStyle : mDisabledIconStyle;
737  mSearchAction->setIcon(gui_utility::getStyledSvgIcon(iconStyle, mSearchIconPath));
738  if (!enable && mSearchbar->isVisible())
739  {
740  mSearchbar->hide();
741  setFocus();
742  }
743  mSearchAction->setEnabled(enable);
744  }
745 
746  QString GroupingManagerWidget::disabledIconStyle() const
747  {
748  return mDisabledIconStyle;
749  }
750 
751  QString GroupingManagerWidget::newGroupingIconPath() const
752  {
753  return mNewGroupingIconPath;
754  }
755 
756  QString GroupingManagerWidget::newGroupingIconStyle() const
757  {
758  return mNewGroupingIconStyle;
759  }
760 
761  QString GroupingManagerWidget::toolboxIconPath() const
762  {
763  return mToolboxIconPath;
764  }
765 
766  QString GroupingManagerWidget::toolboxIconStyle() const
767  {
768  return mToolboxIconStyle;
769  }
770 
771  QString GroupingManagerWidget::renameGroupingIconPath() const
772  {
773  return mRenameGroupingIconPath;
774  }
775 
776  QString GroupingManagerWidget::renameGroupingIconStyle() const
777  {
778  return mRenameGroupingIconStyle;
779  }
780 
781  QString GroupingManagerWidget::deleteIconPath() const
782  {
783  return mDeleteIconPath;
784  }
785 
786  QString GroupingManagerWidget::deleteIconStyle() const
787  {
788  return mDeleteIconStyle;
789  }
790 
791  QString GroupingManagerWidget::colorSelectIconPath() const
792  {
793  return mColorSelectIconPath;
794  }
795 
796  QString GroupingManagerWidget::colorSelectIconStyle() const
797  {
798  return mColorSelectIconStyle;
799  }
800 
801  QString GroupingManagerWidget::toSelectionIconPath() const
802  {
803  return mToSelectionIconPath;
804  }
805 
806  QString GroupingManagerWidget::toSelectionIconStyle() const
807  {
808  return mToSelectionIconStyle;
809  }
810 
811  void GroupingManagerWidget::setDisabledIconStyle(const QString& style)
812  {
813  mDisabledIconStyle = style;
814  }
815 
816  void GroupingManagerWidget::setNewGroupingIconPath(const QString& path)
817  {
818  mNewGroupingIconPath = path;
819  }
820 
821  void GroupingManagerWidget::setNewGroupingIconStyle(const QString& style)
822  {
823  mNewGroupingIconStyle = style;
824  }
825 
826  void GroupingManagerWidget::setToolboxIconPath(const QString& path)
827  {
828  mToolboxIconPath = path;
829  }
830 
831  void GroupingManagerWidget::setToolboxIconStyle(const QString& style)
832  {
833  mToolboxIconStyle = style;
834  }
835 
836  void GroupingManagerWidget::setRenameGroupingIconPath(const QString& path)
837  {
838  mRenameGroupingIconPath = path;
839  }
840 
841  void GroupingManagerWidget::setRenameGroupingIconStyle(const QString& style)
842  {
843  mRenameGroupingIconStyle = style;
844  }
845 
846  void GroupingManagerWidget::setDeleteIconPath(const QString& path)
847  {
848  mDeleteIconPath = path;
849  }
850 
851  void GroupingManagerWidget::setDeleteIconStyle(const QString& style)
852  {
853  mDeleteIconStyle = style;
854  }
855 
856  void GroupingManagerWidget::setColorSelectIconPath(const QString& path)
857  {
858  mColorSelectIconPath = path;
859  }
860 
861  void GroupingManagerWidget::setColorSelectIconStyle(const QString& style)
862  {
863  mColorSelectIconStyle = style;
864  }
865 
866  void GroupingManagerWidget::setToSelectionIconPath(const QString& path)
867  {
868  mToSelectionIconPath = path;
869  }
870 
871  void GroupingManagerWidget::setToSelectionIconStyle(const QString& style)
872  {
873  mToSelectionIconStyle = style;
874  }
875 
876  QString GroupingManagerWidget::searchIconPath() const
877  {
878  return mSearchIconPath;
879  }
880 
881  QString GroupingManagerWidget::searchIconStyle() const
882  {
883  return mSearchIconStyle;
884  }
885 
886  QString GroupingManagerWidget::searchActiveIconStyle() const
887  {
888  return mSearchActiveIconStyle;
889  }
890 
891  QString GroupingManagerWidget::tableIconPath() const
892  {
893  return mTableIconPath;
894  }
895 
896  QString GroupingManagerWidget::tableIconStyle() const
897  {
898  return mTableIconStyle;
899  }
900 
901  void GroupingManagerWidget::setSearchIconPath(const QString& path)
902  {
903  mSearchIconPath = path;
904  }
905 
906  void GroupingManagerWidget::setSearchIconStyle(const QString& style)
907  {
908  mSearchIconStyle = style;
909  }
910 
911  void GroupingManagerWidget::setSearchActiveIconStyle(const QString& style)
912  {
913  mSearchActiveIconStyle = style;
914  }
915 
916  void GroupingManagerWidget::setTableIconPath(const QString& path)
917  {
918  mTableIconPath = path;
919  }
920 
921  void GroupingManagerWidget::setTableIconStyle(const QString& style)
922  {
923  mTableIconStyle = style;
924  }
925 
926  void GroupingManagerWidget::handleDeleteShortcutOnFocusChanged(QWidget* oldWidget, QWidget* newWidget)
927  {
928  if(!newWidget) return;
929  if(newWidget->parent() == this)
930  {
931  mShortCutDeleteItem->setEnabled(true);
932  return;
933  }
934  else
935  {
936  mShortCutDeleteItem->setEnabled(false);
937  return;
938  }
939  }
940 } // namespace hal
Adds an item to a module or grouping.
static SettingsItemKeybind * sSettingDeleteItem
Abstract class for Widgets within HAL's ContentArea.
QKeySequence mSearchKeysequence
QString name() const
QShortcut * mSearchShortcut
QVBoxLayout * mContentLayout
Definition: gate.h:58
const std::vector< Net * > & get_fan_in_nets() const
Definition: gate.cpp:591
const std::string & get_name() const
Definition: gate.cpp:105
Grouping * get_grouping() const
Definition: gate.cpp:204
Module * get_module() const
Definition: gate.cpp:174
const std::vector< Net * > & get_fan_out_nets() const
Definition: gate.cpp:735
Superclass for all graphic items used ins the GraphicsScene. It contains information about the underl...
Definition: graphics_item.h:44
Displays a colored box for the GroupingManagerWidget.
void restore(GroupingTableModel *gtm)
bool isNewGrouping() const
GroupingManagerWidget(QWidget *parent=nullptr)
virtual QList< QShortcut * > createShortcuts() override
void newGroupingSuccOrPred(int maxDepth, bool succ, const GraphicsItem *item)
void handleCurrentChanged(const QModelIndex &current=QModelIndex(), const QModelIndex &previous=QModelIndex())
void handleNewEntryAdded(const QModelIndex &modelIndex)
void newGroupingByDistance(int maxDepth, bool succ, const GraphicsItem *item)
void assignElementsToGroupingDialog(const QSet< u32 > &modules=QSet< u32 >(), const QSet< u32 > &gates=QSet< u32 >(), const QSet< u32 > &nets=QSet< u32 >())
void removeElementsFromGrouping(const QSet< u32 > &modules=QSet< u32 >(), const QSet< u32 > &gates=QSet< u32 >(), const QSet< u32 > &nets=QSet< u32 >())
Helper model to make filtering available.
void startSearch(QString text, int options) override
Table that holds information about all groupings.
QVariant data(const QModelIndex &index, int role) const override
void newEntryAdded(QModelIndex &index)
Module * get_parent_module() const
Definition: module.cpp:126
std::string get_name() const
Definition: module.cpp:88
Grouping * get_grouping() const
Definition: module.cpp:121
const std::unordered_set< Net * > & get_input_nets() const
Definition: module.cpp:549
const std::unordered_set< Net * > & get_output_nets() const
Definition: module.cpp:554
Definition: net.h:58
Grouping * get_grouping() const
Definition: net.cpp:117
Gate * get_gate_by_id(const u32 gate_id) const
Definition: netlist.cpp:195
Module * get_module_by_id(u32 module_id) const
Definition: netlist.cpp:615
Net * get_net_by_id(u32 net_id) const
Definition: netlist.cpp:355
@ Module
Definition: gui_def.h:63
@ Gate
Definition: gui_def.h:63
virtual QList< QString > getColumnNames()
A QFrame with a QLineEdit that can be used to input a substring to search for.
Definition: searchbar.h:48
void setColumnNames(QList< QString > list)
Definition: searchbar.cpp:130
void triggerNewSearch(const QString &text, int searchOptions)
void relaySelectionChanged(void *sender)
QList< u32 > selectedModulesList() const
int numberSelectedModules() const
QList< u32 > selectedGatesList() const
void keySequenceChanged(QKeySequence value)
Toolbar for all ContentFrames and ContentWidgets.
Definition: toolbar.h:39
void addAction(UserAction *act)
virtual void setObject(const UserActionObject &obj)
Definition: user_action.cpp:32
The UserActionObject class represents a single object used in UserAction.
uint32_t u32
Definition: defines.h:41
#define log_info(channel,...)
Definition: log.h:70
const Module * module(const Gate *g, const NodeBoxes &boxes)
QIcon getStyledSvgIcon(const QString &from_to_colors_enabled, const QString &svg_path, QString from_to_colors_disabled=QString())
Definition: graphics.cpp:60
std::vector< T > to_vector(const Container< T, Args... > &container)
Definition: utils.h:559
Definition: defines.h:45
SelectionRelay * gSelectionRelay
Definition: plugin_gui.cpp:84
Netlist * gNetlist
Definition: gui_globals.h:69
Net * net
void clicked(bool checked)
QModelIndex currentIndex() const const
void doubleClicked(const QModelIndex &index)
void setSelectionBehavior(QAbstractItemView::SelectionBehavior behavior)
void setSelectionMode(QAbstractItemView::SelectionMode mode)
QItemSelectionModel * selectionModel() const const
void setItemDelegateForColumn(int column, QAbstractItemDelegate *delegate)
virtual QModelIndex index(int row, int column, const QModelIndex &parent) const const override
void setEnabled(bool)
void setIcon(const QIcon &icon)
void setText(const QString &text)
void setToolTip(const QString &tip)
void trigger()
void triggered(bool checked)
void focusChanged(QWidget *old, QWidget *now)
void addWidget(QWidget *widget, int stretch, Qt::Alignment alignment)
void getHsv(int *h, int *s, int *v, int *a) const const
bool isValid() const const
QString name() const const
void setHsv(int h, int s, int v, int a)
QColor getColor(const QColor &initial, QWidget *parent, const QString &title, QColorDialog::ColorDialogOptions options)
virtual int exec()
void setDefaultAlignment(Qt::Alignment alignment)
void setSectionResizeMode(QHeaderView::ResizeMode mode)
void currentChanged(const QModelIndex &current, const QModelIndex &previous)
void append(const T &value)
const T & at(int i) const const
bool contains(const Key &key) const const
QMap::iterator insert(const Key &key, const T &value)
QAction * addAction(const QString &text)
QAction * exec()
bool isValid() const const
int row() const const
QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
QObject * parent() const const
QPixmap fromImage(const QImage &image, Qt::ImageConversionFlags flags)
bool isValid() const const
bool contains(const T &value) const const
QSet::iterator insert(const T &value)
bool isEmpty() const const
void activated()
void setEnabled(bool enable)
void setKey(const QKeySequence &key)
virtual QModelIndex mapToSource(const QModelIndex &proxyIndex) const const override
virtual void setSourceModel(QAbstractItemModel *sourceModel) override
void setSortRole(int role)
QChar * data()
QString fromStdString(const std::string &str)
AlignHCenter
UserRole
void sortByColumn(int column)
QHeaderView * horizontalHeader() const const
virtual void setModel(QAbstractItemModel *model) override
void setSortingEnabled(bool enable)
QHeaderView * verticalHeader() const const
QAction * addAction(const QString &text)
int toInt(bool *ok) const const
QString toString() const const
T value() const const
void append(const T &value)
void clear()
bool isEmpty() const const
bool close()
void setContextMenuPolicy(Qt::ContextMenuPolicy policy)
void customContextMenuRequested(const QPoint &pos)
void ensurePolished() const const
void hide()
QPoint mapToGlobal(const QPoint &pos) const const
void setSizePolicy(QSizePolicy)
void setWindowTitle(const QString &)