26 #include <QApplication>
27 #include <QColorDialog>
28 #include <QHeaderView>
31 #include <QResizeEvent>
34 #include <QStringList>
35 #include <QVBoxLayout>
36 #include <unordered_set>
42 mRenameAction(new
QAction(this)), mColorSelectAction(new
QAction(this)), mDeleteAction(new
QAction(this)), mToSelectionAction(new
QAction(this)), mTableAction(new
QAction(this))
59 mToSelectionAction->
setToolTip(
"To selection");
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");
69 mTableAction->
setText(
"Show content");
76 mColorSerializer.
restore(mGroupingTableModel);
82 mGroupingTableView->
setModel(mProxyModel);
90 mGroupingTableView->
sortByColumn(0, Qt::SortOrder::AscendingOrder);
143 QIcon GroupingManagerWidget::toolboxIcon()
const
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++)
155 img.setPixelColor(
x,
y, col);
161 void GroupingManagerWidget::handleCreateGroupingClicked()
167 void GroupingManagerWidget::handleColorSelectClicked()
181 ActionSetObjectColor* act =
new ActionSetObjectColor(color);
187 void GroupingManagerWidget::handleToolboxClicked()
190 QAction* toolPredecessor =
new Action(
"Predecessor tree to new grouping");
193 QAction* toolSuccessor =
new Action(
"Successor tree to new grouping");
196 QAction* toolPreStep =
new Action(
"Groupings by predecessor distance");
199 QAction* toolSucStep =
new Action(
"Groupings by successor distance");
207 if (
index.column() == 0)
208 handleShowContentClicked();
209 if (
index.column() == 2)
210 handleColorSelectClicked();
213 GroupingManagerWidget::ToolboxNode::ToolboxNode(Endpoint* ep,
const ToolboxModuleHash* tmh)
217 Gate* g = ep->get_gate();
218 if (tmh && tmh->mHash.contains(g))
219 mNode = Node(tmh->mHash.value(g)->get_id(),
Node::Module);
230 switch (mNode.type())
243 GroupingManagerWidget::ToolboxNode::ToolboxNode(
const GraphicsItem* item)
245 switch (item->itemType())
260 std::vector<Net*> GroupingManagerWidget::ToolboxNode::inputNets()
const
262 switch (mNode.type())
271 return std::vector<Net*>();
274 std::vector<Net*> GroupingManagerWidget::ToolboxNode::outputNets()
const
276 switch (mNode.type())
285 return std::vector<Net*>();
288 GroupingManagerWidget::ToolboxModuleHash::ToolboxModuleHash(
const Node& nd)
290 Module* parentModule =
nullptr;
303 for (Module* sm : parentModule->get_submodules())
304 for (Gate* g : sm->get_gates(
nullptr,
true))
323 tbn = ToolboxNode(item);
324 ToolboxModuleHash tmh(tbn.mNode);
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++)
335 for (
Net* n : todoNet)
341 for (
Endpoint* ep : (succ ? n->get_destinations() : n->get_sources()))
343 ToolboxNode nextNode(ep, &tmh);
344 if (handledBox.
contains(nextNode.mNode))
346 handledBox.
insert(nextNode.mNode);
347 switch (nextNode.mNode.type())
350 mods.
insert(nextNode.mNode.id());
353 gats.
insert(nextNode.mNode.id());
358 nextRound.
append(QtCompat::stdVectorToVector<Net*>(succ ? nextNode.outputNets() : nextNode.inputNets()));
385 tbn = ToolboxNode(item);
386 ToolboxModuleHash tmh(tbn.mNode);
391 nextDst.
append(QtCompat::stdVectorToVector<Net*>(succ ? tbn.outputNets() : tbn.inputNets()));
392 handledNode.
insert(tbn.mNode);
393 for (
int iround = 1; iround <= maxDepth; iround++)
400 for (
Net* n : thisDst)
406 for (
Endpoint* ep : succ ? n->get_destinations() : n->get_sources())
408 ToolboxNode nextNode(ep, &tmh);
409 if (handledNode.
contains(nextNode.mNode))
411 handledNode.
insert(nextNode.mNode);
412 switch (nextNode.mNode.type())
415 mods.
insert(nextNode.mNode.id());
418 gats.
insert(nextNode.mNode.id());
423 nextDst.
append(QtCompat::stdVectorToVector<Net*>(succ ? nextNode.outputNets() : nextNode.inputNets()));
457 for (
const u32 id : modules)
466 groupingMap[group][0].
insert(
id);
468 for (
const u32 id : gates)
477 groupingMap[group][1].
insert(
id);
479 for (
const u32 id : nets)
485 if(!groupingMap.contains(group))
488 groupingMap[group][2].insert(
id);
490 if (groupingMap.isEmpty())
return;
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);
502 void GroupingManagerWidget::handleToSelectionClicked()
504 QModelIndex currentIndex = mProxyModel->mapToSource(mGroupingTableView->currentIndex());
507 Grouping* grp = getCurrentGrouping().grouping();
510 for (Module* m : grp->get_modules())
512 for (Gate* g : grp->get_gates())
514 for (Net* n : grp->get_nets())
519 void GroupingManagerWidget::handleRenameGroupingClicked()
521 QModelIndex currentIndex = mProxyModel->mapToSource(mGroupingTableView->currentIndex());
526 ipd.setWindowTitle(
"Rename Grouping");
527 ipd.setInfoText(
"Please select a new unique name for the grouping.");
528 int irow = currentIndex.
row();
530 mGroupingTableModel->setAboutToRename(oldName);
531 ipd.setInputText(oldName);
532 ipd.addValidator(mGroupingTableModel);
536 QString newName = ipd.textValue();
537 if (newName != oldName)
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));
545 mGroupingTableModel->setAboutToRename(
QString());
548 void GroupingManagerWidget::handleShowContentClicked()
550 QModelIndex currentIndex = mProxyModel->mapToSource(mGroupingTableView->currentIndex());
554 int irow = currentIndex.
row();
555 GroupingTableEntry gte = mGroupingTableModel->groupingAt(irow);
558 u32 grpId = gte.id();
559 QColor grpColor = gte.color();
565 QLabel colorRectangle(&dialog);
566 colorRectangle.setText(
QString());
567 colorRectangle.setStyleSheet(
"background-color: " + grpColor.
name());
568 colorRectangle.setFixedSize(25, 25);
569 colorRectangle.setAutoFillBackground(
true);
572 SelectionTreeView selectionTreeView(&dialog,
true);
573 SelectionTreeProxyModel selectionTreeProxyModel(&dialog);
574 ModuleModel moduleModel(&dialog);
575 selectionTreeProxyModel.setSourceModel(&moduleModel);
576 selectionTreeView.setModel(&selectionTreeProxyModel);
578 selectionTreeView.populate(
true, grpId);
586 hlay.addWidget(&colorRectangle);
587 layout.addLayout(&hlay);
588 layout.addWidget(&selectionTreeView);
589 layout.addWidget(&closeButton);
594 void GroupingManagerWidget::handleDeleteGroupingClicked()
596 if (sender() != mDeleteAction &&
597 !hasFocus() && !mGroupingTableView->hasFocus())
return;
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));
608 void GroupingManagerWidget::handleContextMenuRequest(
const QPoint& point)
610 const QModelIndex clicked_index = mGroupingTableView->indexAt(point);
614 context_menu.
addAction(mNewGroupingAction);
619 context_menu.
addAction(mColorSelectAction);
620 context_menu.
addAction(mToSelectionAction);
625 context_menu.
exec(mGroupingTableView->viewport()->mapToGlobal(point));
628 GroupingTableEntry GroupingManagerWidget::getCurrentGrouping()
630 QModelIndex modelIndex = mProxyModel->mapToSource(mGroupingTableView->currentIndex());
632 return mGroupingTableModel->groupingAt(modelIndex.
row());
635 void GroupingManagerWidget::setupToolbar(
Toolbar* toolbar)
644 mSearchAction->
setEnabled(mGroupingTableModel->rowCount() > 0);
647 void GroupingManagerWidget::setToolbarButtonsEnabled(
bool enable)
649 mRenameAction->setEnabled(
enable);
650 mColorSelectAction->setEnabled(
enable);
651 mToSelectionAction->setEnabled(
enable);
652 mDeleteAction->setEnabled(
enable);
653 mTableAction->setEnabled(
enable);
656 void GroupingManagerWidget::handleNewEntryAdded(
const QModelIndex& modelIndexName)
660 QModelIndex proxyIndex = mProxyModel->mapFromSource(modelIndexName);
663 mGroupingTableView->setCurrentIndex(proxyIndex);
664 handleCurrentChanged(proxyIndex);
667 void GroupingManagerWidget::handleLastEntryDeleted()
669 if (mProxyModel->rowCount())
672 mGroupingTableView->setCurrentIndex(inx);
673 handleCurrentChanged(inx);
676 handleCurrentChanged();
683 bool enable = mGroupingTableModel->rowCount() > 0 && current.
isValid();
684 QAction* entryBasedAction[] = {mRenameAction, mColorSelectAction, mDeleteAction, mToSelectionAction, mTableAction,
nullptr};
687 iconPath << mRenameGroupingIconPath << mColorSelectIconPath << mDeleteIconPath << mToSelectionIconPath << mTableIconPath;
688 iconStyle << mRenameGroupingIconStyle << mColorSelectIconStyle << mDeleteIconStyle << mToSelectionIconStyle << mTableIconStyle;
690 for (
int iacc = 0; entryBasedAction[iacc]; iacc++)
695 enableSearchbar(mGroupingTableModel->rowCount() > 0);
698 void GroupingManagerWidget::toggleSearchbar()
700 if (!mSearchAction->isEnabled())
703 if (mSearchbar->isHidden())
706 mSearchbar->setFocus();
715 void GroupingManagerWidget::filter(
const QString& text)
720 mProxyModel->setFilterRegularExpression(*regex);
721 QString output =
"Groupings widget regular expression '" + text +
"' entered.";
726 void GroupingManagerWidget::updateSearchIcon()
728 if (mSearchbar->filterApplied() && mSearchbar->isVisible())
734 void GroupingManagerWidget::enableSearchbar(
bool enable)
736 QString iconStyle =
enable ? mSearchIconStyle : mDisabledIconStyle;
738 if (!
enable && mSearchbar->isVisible())
743 mSearchAction->setEnabled(
enable);
746 QString GroupingManagerWidget::disabledIconStyle()
const
748 return mDisabledIconStyle;
751 QString GroupingManagerWidget::newGroupingIconPath()
const
753 return mNewGroupingIconPath;
756 QString GroupingManagerWidget::newGroupingIconStyle()
const
758 return mNewGroupingIconStyle;
761 QString GroupingManagerWidget::toolboxIconPath()
const
763 return mToolboxIconPath;
766 QString GroupingManagerWidget::toolboxIconStyle()
const
768 return mToolboxIconStyle;
771 QString GroupingManagerWidget::renameGroupingIconPath()
const
773 return mRenameGroupingIconPath;
776 QString GroupingManagerWidget::renameGroupingIconStyle()
const
778 return mRenameGroupingIconStyle;
781 QString GroupingManagerWidget::deleteIconPath()
const
783 return mDeleteIconPath;
786 QString GroupingManagerWidget::deleteIconStyle()
const
788 return mDeleteIconStyle;
791 QString GroupingManagerWidget::colorSelectIconPath()
const
793 return mColorSelectIconPath;
796 QString GroupingManagerWidget::colorSelectIconStyle()
const
798 return mColorSelectIconStyle;
801 QString GroupingManagerWidget::toSelectionIconPath()
const
803 return mToSelectionIconPath;
806 QString GroupingManagerWidget::toSelectionIconStyle()
const
808 return mToSelectionIconStyle;
811 void GroupingManagerWidget::setDisabledIconStyle(
const QString& style)
813 mDisabledIconStyle = style;
816 void GroupingManagerWidget::setNewGroupingIconPath(
const QString& path)
818 mNewGroupingIconPath = path;
821 void GroupingManagerWidget::setNewGroupingIconStyle(
const QString& style)
823 mNewGroupingIconStyle = style;
826 void GroupingManagerWidget::setToolboxIconPath(
const QString& path)
828 mToolboxIconPath = path;
831 void GroupingManagerWidget::setToolboxIconStyle(
const QString& style)
833 mToolboxIconStyle = style;
836 void GroupingManagerWidget::setRenameGroupingIconPath(
const QString& path)
838 mRenameGroupingIconPath = path;
841 void GroupingManagerWidget::setRenameGroupingIconStyle(
const QString& style)
843 mRenameGroupingIconStyle = style;
846 void GroupingManagerWidget::setDeleteIconPath(
const QString& path)
848 mDeleteIconPath = path;
851 void GroupingManagerWidget::setDeleteIconStyle(
const QString& style)
853 mDeleteIconStyle = style;
856 void GroupingManagerWidget::setColorSelectIconPath(
const QString& path)
858 mColorSelectIconPath = path;
861 void GroupingManagerWidget::setColorSelectIconStyle(
const QString& style)
863 mColorSelectIconStyle = style;
866 void GroupingManagerWidget::setToSelectionIconPath(
const QString& path)
868 mToSelectionIconPath = path;
871 void GroupingManagerWidget::setToSelectionIconStyle(
const QString& style)
873 mToSelectionIconStyle = style;
876 QString GroupingManagerWidget::searchIconPath()
const
878 return mSearchIconPath;
881 QString GroupingManagerWidget::searchIconStyle()
const
883 return mSearchIconStyle;
886 QString GroupingManagerWidget::searchActiveIconStyle()
const
888 return mSearchActiveIconStyle;
891 QString GroupingManagerWidget::tableIconPath()
const
893 return mTableIconPath;
896 QString GroupingManagerWidget::tableIconStyle()
const
898 return mTableIconStyle;
901 void GroupingManagerWidget::setSearchIconPath(
const QString& path)
903 mSearchIconPath = path;
906 void GroupingManagerWidget::setSearchIconStyle(
const QString& style)
908 mSearchIconStyle = style;
911 void GroupingManagerWidget::setSearchActiveIconStyle(
const QString& style)
913 mSearchActiveIconStyle = style;
916 void GroupingManagerWidget::setTableIconPath(
const QString& path)
918 mTableIconPath = path;
921 void GroupingManagerWidget::setTableIconStyle(
const QString& style)
923 mTableIconStyle = style;
926 void GroupingManagerWidget::handleDeleteShortcutOnFocusChanged(
QWidget* oldWidget,
QWidget* newWidget)
928 if(!newWidget)
return;
929 if(newWidget->
parent() ==
this)
931 mShortCutDeleteItem->setEnabled(
true);
936 mShortCutDeleteItem->setEnabled(
false);
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
const std::vector< Net * > & get_fan_in_nets() const
const std::string & get_name() const
Grouping * get_grouping() const
Module * get_module() const
const std::vector< Net * > & get_fan_out_nets() const
Superclass for all graphic items used ins the GraphicsScene. It contains information about the underl...
Displays a colored box for the GroupingManagerWidget.
void restore(GroupingTableModel *gtm)
bool isNewGrouping() const
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
std::string get_name() const
Grouping * get_grouping() const
const std::unordered_set< Net * > & get_input_nets() const
const std::unordered_set< Net * > & get_output_nets() const
Grouping * get_grouping() const
Gate * get_gate_by_id(const u32 gate_id) const
Module * get_module_by_id(u32 module_id) const
Net * get_net_by_id(u32 net_id) const
virtual QList< QString > getColumnNames()
A QFrame with a QLineEdit that can be used to input a substring to search for.
void setColumnNames(QList< QString > list)
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)
void addAction(UserAction *act)
void setUseCreatedObject()
virtual void setObject(const UserActionObject &obj)
The UserActionObject class represents a single object used in UserAction.
#define log_info(channel,...)
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())
std::vector< T > to_vector(const Container< T, Args... > &container)
SelectionRelay * gSelectionRelay
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 setIcon(const QIcon &icon)
void setText(const QString &text)
void triggered(bool checked)
void focusChanged(QWidget *old, QWidget *now)
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)
void currentChanged(const QModelIndex ¤t, 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)
bool isValid() 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 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)
QString fromStdString(const std::string &str)
void sortByColumn(int column)
virtual void setModel(QAbstractItemModel *model) override
void setSortingEnabled(bool enable)
int toInt(bool *ok) const const
QString toString() const const
void append(const T &value)
bool isEmpty() const const