25 #include <QApplication>
26 #include <QColorDialog>
27 #include <QHeaderView>
30 #include <QResizeEvent>
33 #include <QStringList>
34 #include <QVBoxLayout>
35 #include <unordered_set>
41 mRenameAction(new
QAction(this)), mColorSelectAction(new
QAction(this)), mDeleteAction(new
QAction(this)), mToSelectionAction(new
QAction(this)), mTableAction(new
QAction(this))
58 mToSelectionAction->
setToolTip(
"To selection");
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");
68 mTableAction->
setText(
"Show content");
75 mColorSerializer.
restore(mGroupingTableModel);
81 mGroupingTableView->
setModel(mProxyModel);
89 mGroupingTableView->
sortByColumn(0, Qt::SortOrder::AscendingOrder);
142 QIcon GroupingManagerWidget::toolboxIcon()
const
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++)
154 img.setPixelColor(
x,
y, col);
160 void GroupingManagerWidget::handleCreateGroupingClicked()
166 void GroupingManagerWidget::handleColorSelectClicked()
180 ActionSetObjectColor* act =
new ActionSetObjectColor(color);
186 void GroupingManagerWidget::handleToolboxClicked()
189 QAction* toolPredecessor =
new Action(
"Predecessor tree to new grouping");
192 QAction* toolSuccessor =
new Action(
"Successor tree to new grouping");
195 QAction* toolPreStep =
new Action(
"Groupings by predecessor distance");
198 QAction* toolSucStep =
new Action(
"Groupings by successor distance");
204 void GroupingManagerWidget::handleDoubleClicked(
const QModelIndex& index)
207 handleShowContentClicked();
209 handleColorSelectClicked();
212 GroupingManagerWidget::ToolboxNode::ToolboxNode(Endpoint* ep,
const ToolboxModuleHash* tmh)
216 Gate*
g = ep->get_gate();
217 if (tmh && tmh->mHash.contains(
g))
229 switch (mNode.type())
242 GroupingManagerWidget::ToolboxNode::ToolboxNode(
const GraphicsItem* item)
244 switch (item->itemType())
259 std::vector<Net*> GroupingManagerWidget::ToolboxNode::inputNets()
const
261 switch (mNode.type())
270 return std::vector<Net*>();
273 std::vector<Net*> GroupingManagerWidget::ToolboxNode::outputNets()
const
275 switch (mNode.type())
284 return std::vector<Net*>();
287 GroupingManagerWidget::ToolboxModuleHash::ToolboxModuleHash(
const Node& nd)
289 Module* parentModule =
nullptr;
302 for (Module* sm : parentModule->get_submodules())
303 for (Gate*
g : sm->get_gates(
nullptr,
true))
322 tbn = ToolboxNode(item);
323 ToolboxModuleHash tmh(tbn.mNode);
328 handledBox.
insert(tbn.mNode);
329 for (
int loop = 0; !maxDepth || loop < maxDepth; loop++)
334 for (
Net*
n : todoNet)
340 for (
Endpoint* ep : (succ ?
n->get_destinations() :
n->get_sources()))
342 ToolboxNode nextNode(ep, &tmh);
343 if (handledBox.
contains(nextNode.mNode))
345 handledBox.
insert(nextNode.mNode);
346 switch (nextNode.mNode.type())
349 mods.
insert(nextNode.mNode.id());
352 gats.
insert(nextNode.mNode.id());
384 tbn = ToolboxNode(item);
385 ToolboxModuleHash tmh(tbn.mNode);
391 handledNode.
insert(tbn.mNode);
392 for (
int iround = 1; iround <= maxDepth; iround++)
399 for (
Net*
n : thisDst)
405 for (
Endpoint* ep : succ ?
n->get_destinations() :
n->get_sources())
407 ToolboxNode nextNode(ep, &tmh);
408 if (handledNode.
contains(nextNode.mNode))
410 handledNode.
insert(nextNode.mNode);
411 switch (nextNode.mNode.type())
414 mods.
insert(nextNode.mNode.id());
417 gats.
insert(nextNode.mNode.id());
456 for (
const u32 id : modules)
465 groupingMap[group][0].
insert(
id);
467 for (
const u32 id : gates)
476 groupingMap[group][1].
insert(
id);
478 for (
const u32 id : nets)
484 if(!groupingMap.contains(group))
487 groupingMap[group][2].insert(
id);
489 if (groupingMap.isEmpty())
return;
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);
501 void GroupingManagerWidget::handleToSelectionClicked()
503 QModelIndex currentIndex = mProxyModel->mapToSource(mGroupingTableView->currentIndex());
506 Grouping* grp = getCurrentGrouping().grouping();
509 for (Module* m : grp->get_modules())
511 for (Gate*
g : grp->get_gates())
513 for (Net*
n : grp->get_nets())
518 void GroupingManagerWidget::handleRenameGroupingClicked()
520 QModelIndex currentIndex = mProxyModel->mapToSource(mGroupingTableView->currentIndex());
525 ipd.setWindowTitle(
"Rename Grouping");
526 ipd.setInfoText(
"Please select a new unique name for the grouping.");
527 int irow = currentIndex.
row();
529 mGroupingTableModel->setAboutToRename(oldName);
530 ipd.setInputText(oldName);
531 ipd.addValidator(mGroupingTableModel);
535 QString newName = ipd.textValue();
536 if (newName != oldName)
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));
544 mGroupingTableModel->setAboutToRename(
QString());
547 void GroupingManagerWidget::handleShowContentClicked()
549 QModelIndex currentIndex = mProxyModel->mapToSource(mGroupingTableView->currentIndex());
553 int irow = currentIndex.
row();
554 GroupingTableEntry gte = mGroupingTableModel->groupingAt(irow);
557 u32 grpId = gte.id();
558 QColor grpColor = gte.color();
564 QLabel colorRectangle(&dialog);
565 colorRectangle.setText(
QString());
566 colorRectangle.setStyleSheet(
"background-color: " + grpColor.
name());
567 colorRectangle.setFixedSize(25, 25);
568 colorRectangle.setAutoFillBackground(
true);
571 SelectionTreeView selectionTreeView(&dialog,
true);
572 SelectionTreeProxyModel selectionTreeProxyModel(&dialog);
573 ModuleModel moduleModel(&dialog);
574 selectionTreeProxyModel.setSourceModel(&moduleModel);
575 selectionTreeView.setModel(&selectionTreeProxyModel);
577 selectionTreeView.populate(
true, grpId);
585 hlay.addWidget(&colorRectangle);
586 layout.addLayout(&hlay);
587 layout.addWidget(&selectionTreeView);
588 layout.addWidget(&closeButton);
593 void GroupingManagerWidget::handleDeleteGroupingClicked()
595 if (sender() != mDeleteAction &&
596 !hasFocus() && !mGroupingTableView->hasFocus())
return;
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));
607 void GroupingManagerWidget::handleContextMenuRequest(
const QPoint& point)
609 const QModelIndex clicked_index = mGroupingTableView->indexAt(point);
613 context_menu.
addAction(mNewGroupingAction);
618 context_menu.
addAction(mColorSelectAction);
619 context_menu.
addAction(mToSelectionAction);
624 context_menu.
exec(mGroupingTableView->viewport()->mapToGlobal(point));
627 GroupingTableEntry GroupingManagerWidget::getCurrentGrouping()
629 QModelIndex modelIndex = mProxyModel->mapToSource(mGroupingTableView->currentIndex());
631 return mGroupingTableModel->groupingAt(modelIndex.
row());
634 void GroupingManagerWidget::setupToolbar(
Toolbar* toolbar)
643 mSearchAction->
setEnabled(mGroupingTableModel->rowCount() > 0);
646 void GroupingManagerWidget::setToolbarButtonsEnabled(
bool enable)
648 mRenameAction->setEnabled(
enable);
649 mColorSelectAction->setEnabled(
enable);
650 mToSelectionAction->setEnabled(
enable);
651 mDeleteAction->setEnabled(
enable);
652 mTableAction->setEnabled(
enable);
655 void GroupingManagerWidget::handleNewEntryAdded(
const QModelIndex& modelIndexName)
659 QModelIndex proxyIndex = mProxyModel->mapFromSource(modelIndexName);
662 mGroupingTableView->setCurrentIndex(proxyIndex);
663 handleCurrentChanged(proxyIndex);
666 void GroupingManagerWidget::handleLastEntryDeleted()
668 if (mProxyModel->rowCount())
671 mGroupingTableView->setCurrentIndex(inx);
672 handleCurrentChanged(inx);
675 handleCurrentChanged();
682 bool enable = mGroupingTableModel->rowCount() > 0 && current.
isValid();
683 QAction* entryBasedAction[] = {mRenameAction, mColorSelectAction, mDeleteAction, mToSelectionAction, mTableAction,
nullptr};
686 iconPath << mRenameGroupingIconPath << mColorSelectIconPath << mDeleteIconPath << mToSelectionIconPath << mTableIconPath;
687 iconStyle << mRenameGroupingIconStyle << mColorSelectIconStyle << mDeleteIconStyle << mToSelectionIconStyle << mTableIconStyle;
689 for (
int iacc = 0; entryBasedAction[iacc]; iacc++)
694 enableSearchbar(mGroupingTableModel->rowCount() > 0);
697 void GroupingManagerWidget::toggleSearchbar()
699 if (!mSearchAction->isEnabled())
702 if (mSearchbar->isHidden())
705 mSearchbar->setFocus();
714 void GroupingManagerWidget::filter(
const QString& text)
719 mProxyModel->setFilterRegularExpression(*regex);
720 QString output =
"Groupings widget regular expression '" + text +
"' entered.";
725 void GroupingManagerWidget::updateSearchIcon()
727 if (mSearchbar->filterApplied() && mSearchbar->isVisible())
733 void GroupingManagerWidget::enableSearchbar(
bool enable)
735 QString iconStyle =
enable ? mSearchIconStyle : mDisabledIconStyle;
737 if (!
enable && mSearchbar->isVisible())
742 mSearchAction->setEnabled(
enable);
745 QString GroupingManagerWidget::disabledIconStyle()
const
747 return mDisabledIconStyle;
750 QString GroupingManagerWidget::newGroupingIconPath()
const
752 return mNewGroupingIconPath;
755 QString GroupingManagerWidget::newGroupingIconStyle()
const
757 return mNewGroupingIconStyle;
760 QString GroupingManagerWidget::toolboxIconPath()
const
762 return mToolboxIconPath;
765 QString GroupingManagerWidget::toolboxIconStyle()
const
767 return mToolboxIconStyle;
770 QString GroupingManagerWidget::renameGroupingIconPath()
const
772 return mRenameGroupingIconPath;
775 QString GroupingManagerWidget::renameGroupingIconStyle()
const
777 return mRenameGroupingIconStyle;
780 QString GroupingManagerWidget::deleteIconPath()
const
782 return mDeleteIconPath;
785 QString GroupingManagerWidget::deleteIconStyle()
const
787 return mDeleteIconStyle;
790 QString GroupingManagerWidget::colorSelectIconPath()
const
792 return mColorSelectIconPath;
795 QString GroupingManagerWidget::colorSelectIconStyle()
const
797 return mColorSelectIconStyle;
800 QString GroupingManagerWidget::toSelectionIconPath()
const
802 return mToSelectionIconPath;
805 QString GroupingManagerWidget::toSelectionIconStyle()
const
807 return mToSelectionIconStyle;
810 void GroupingManagerWidget::setDisabledIconStyle(
const QString& style)
812 mDisabledIconStyle = style;
815 void GroupingManagerWidget::setNewGroupingIconPath(
const QString& path)
817 mNewGroupingIconPath = path;
820 void GroupingManagerWidget::setNewGroupingIconStyle(
const QString& style)
822 mNewGroupingIconStyle = style;
825 void GroupingManagerWidget::setToolboxIconPath(
const QString& path)
827 mToolboxIconPath = path;
830 void GroupingManagerWidget::setToolboxIconStyle(
const QString& style)
832 mToolboxIconStyle = style;
835 void GroupingManagerWidget::setRenameGroupingIconPath(
const QString& path)
837 mRenameGroupingIconPath = path;
840 void GroupingManagerWidget::setRenameGroupingIconStyle(
const QString& style)
842 mRenameGroupingIconStyle = style;
845 void GroupingManagerWidget::setDeleteIconPath(
const QString& path)
847 mDeleteIconPath = path;
850 void GroupingManagerWidget::setDeleteIconStyle(
const QString& style)
852 mDeleteIconStyle = style;
855 void GroupingManagerWidget::setColorSelectIconPath(
const QString& path)
857 mColorSelectIconPath = path;
860 void GroupingManagerWidget::setColorSelectIconStyle(
const QString& style)
862 mColorSelectIconStyle = style;
865 void GroupingManagerWidget::setToSelectionIconPath(
const QString& path)
867 mToSelectionIconPath = path;
870 void GroupingManagerWidget::setToSelectionIconStyle(
const QString& style)
872 mToSelectionIconStyle = style;
875 QString GroupingManagerWidget::searchIconPath()
const
877 return mSearchIconPath;
880 QString GroupingManagerWidget::searchIconStyle()
const
882 return mSearchIconStyle;
885 QString GroupingManagerWidget::searchActiveIconStyle()
const
887 return mSearchActiveIconStyle;
890 QString GroupingManagerWidget::tableIconPath()
const
892 return mTableIconPath;
895 QString GroupingManagerWidget::tableIconStyle()
const
897 return mTableIconStyle;
900 void GroupingManagerWidget::setSearchIconPath(
const QString& path)
902 mSearchIconPath = path;
905 void GroupingManagerWidget::setSearchIconStyle(
const QString& style)
907 mSearchIconStyle = style;
910 void GroupingManagerWidget::setSearchActiveIconStyle(
const QString& style)
912 mSearchActiveIconStyle = style;
915 void GroupingManagerWidget::setTableIconPath(
const QString& path)
917 mTableIconPath = path;
920 void GroupingManagerWidget::setTableIconStyle(
const QString& style)
922 mTableIconStyle = style;
925 void GroupingManagerWidget::handleDeleteShortcutOnFocusChanged(
QWidget* oldWidget,
QWidget* newWidget)
927 if(!newWidget)
return;
928 if(newWidget->
parent() ==
this)
930 mShortCutDeleteItem->setEnabled(
true);
935 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())
CORE_API 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