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