HAL
module_dialog.cpp
Go to the documentation of this file.
3 #include "gui/gui_globals.h"
13 #include "hal_core/utilities/log.h"
14 
15 #include <QDialogButtonBox>
16 #include <QGridLayout>
17 #include <QPushButton>
18 #include <QTabWidget>
19 #include <QTableView>
20 #include <QTreeView>
21 #include <QMessageBox>
22 #include <QApplication>
23 
24 namespace hal {
25  ModuleDialog::ModuleDialog(const QSet<u32>& excludeIds, const QString &title, bool omitCreateNew, ModuleSelectReceiver* receiver, QWidget* parent)
26  : QDialog(parent),
27  mSelectedId(0),
28  mExcludeIds(excludeIds),
29  mLastUsed(nullptr),
30  mSearchbar(new Searchbar(this)),
31  mNewModule(false),
32  mReceiver(receiver),
33  mPickerModeActivated(false),
34  mWindowTitle(title)
35  {
36  setWindowTitle(mWindowTitle + " …");
37  QGridLayout* layout = new QGridLayout(this);
38 
39  mButtonPick = new QPushButton("Pick module from graph", this);
40  if (mReceiver)
41  connect(mButtonPick, &QPushButton::pressed, this, &ModuleDialog::handlePickFromGraph);
42  else
43  mButtonPick->setDisabled(true);
44 
45 
46  QPushButton* butSearch = new QPushButton("Search", this);
47  connect(butSearch, &QPushButton::pressed, this, &ModuleDialog::handleToggleSearchbar);
48 
49  if (omitCreateNew)
50  {
51  layout->addWidget(mButtonPick, 0, 0);
52  layout->addWidget(butSearch, 0, 1);
53  }
54  else {
55  QPushButton* butNew = new QPushButton("Create new module", this);
56  connect(butNew, &QPushButton::pressed, this, &ModuleDialog::handleCreateNewModule);
57  layout->addWidget(butNew, 0, 0);
58  layout->addWidget(mButtonPick, 0, 1);
59  layout->addWidget(butSearch, 0, 2);
60  }
61 
62 
63 
64  layout->addWidget(mSearchbar, 1, 0, 1, 3);
65  mTabWidget = new QTabWidget(this);
66  mTreeView = new QTreeView(mTabWidget);
67  mTabWidget->addTab(mTreeView, "Module tree");
68 
69  mTableView = new ModuleSelectView(false, mSearchbar, &mExcludeIds, mTabWidget);
70 
72  mTabWidget->addTab(mTableView, "Module list");
73 
74  if (!ModuleSelectHistory::instance()->isEmpty())
75  {
76  mLastUsed = new ModuleSelectView(true, mSearchbar, &mExcludeIds, mTabWidget);
77  if (mLastUsed->model()->rowCount())
78  {
80  mTabWidget->addTab(mLastUsed, "Recent selection");
81  }
82  else
83  {
84  delete mLastUsed;
85  mLastUsed = nullptr;
86  }
87 
88  }
89 
90  layout->addWidget(mTabWidget, 2, 0, 1, 3);
91 
92  mModuleTreeProxyModel = new ModuleProxyModel(this);
93  mModuleTreeProxyModel->setFilterKeyColumn(-1);
94  mModuleTreeProxyModel->setDynamicSortFilter(true);
95  mModuleTreeProxyModel->setSourceModel(gContentManager->getModuleWidget()->getModuleModel());
96  mTreeView->setModel(mModuleTreeProxyModel);
97  mTreeView->expandAll();
98 
100  layout->addWidget(mButtonBox, 3, 0, 1, 3, Qt::AlignHCenter);
101 
102  mToggleSearchbar = new QAction(this);
103  mToggleSearchbar->setShortcut(QKeySequence(ContentManager::sSettingSearch->value().toString()));
104  addAction(mToggleSearchbar);
105 
106  mTabWidget->setCurrentIndex(0);
107  enableButtons();
108  mSearchbar->hide();
109 
110  //get column names for searchbar
111  if(mTabWidget->currentWidget() == mTreeView)
112  mSearchbar->setColumnNames(mModuleTreeProxyModel->getColumnNames());
113  else
114  mSearchbar->setColumnNames(static_cast<ModuleSelectProxy*>(mTableView->model())->getColumnNames());
115 
116  connect(mTabWidget, &QTabWidget::currentChanged, this, &ModuleDialog::handleCurrentTabChanged);
117  connect(mToggleSearchbar, &QAction::triggered, this, &ModuleDialog::handleToggleSearchbar);
118 // TODO textEdited connect(mSearchbar, &Searchbar::textEdited, this, &ModuleDialog::filter);
120  connect(mButtonBox, &QDialogButtonBox::accepted, this, &QDialog::accept);
121  connect(mButtonBox, &QDialogButtonBox::rejected, this, &QDialog::reject);
122  connect(mTreeView, &QTreeView::doubleClicked, this, &ModuleDialog::handleTreeDoubleClick);
123  connect(mTreeView->selectionModel(), &QItemSelectionModel::selectionChanged, this, &ModuleDialog::handleTreeSelectionChanged);
124 
125  connect(mSearchbar, &Searchbar::triggerNewSearch, mModuleTreeProxyModel, &ModuleProxyModel::startSearch);
126  connect(mSearchbar, &Searchbar::triggerNewSearch, static_cast<ModuleSelectProxy*>(mTableView->model()), &ModuleSelectProxy::startSearch);
127  }
128 
129  void ModuleDialog::enableButtons()
130  {
131  mButtonBox->button(QDialogButtonBox::Ok)->setEnabled(mSelectedId>0);
132  mButtonPick->setEnabled(mTableView->model()->rowCount()>0);
133  QString target = "…";
134  if (mSelectedId>0)
135  {
136  Module* m = gNetlist->get_module_by_id(mSelectedId);
137  if (m) target = QString("%1[%2]").arg(QString::fromStdString(m->get_name())).arg(mSelectedId);
138  }
139  setWindowTitle(mWindowTitle + " " + target);
140  }
141 
142  u32 ModuleDialog::treeModuleId(const QModelIndex& index)
143  {
144  ModuleModel* treeModel = static_cast<ModuleModel*>(mModuleTreeProxyModel->sourceModel());
145  Q_ASSERT(treeModel);
146  QModelIndex sourceIndex = mModuleTreeProxyModel->mapToSource(index);
147  if (!sourceIndex.isValid()) return 0;
148  ModuleItem* item = treeModel->getItem(sourceIndex);
149  if (!item) return 0;
150  return item->id();
151  }
152 
153  void ModuleDialog::handleTreeSelectionChanged(const QItemSelection &selected, const QItemSelection &deselected)
154  {
155  Q_UNUSED(deselected);
156  auto sel = selected.indexes();
157  if (sel.empty())
158  handleTableSelection(0, false);
159  else
160  handleTableSelection(treeModuleId(sel.at(0)), false);
161  }
162 
163  void ModuleDialog::handleTreeDoubleClick(const QModelIndex& index)
164  {
165  u32 moduleId = treeModuleId(index);
166  handleTableSelection(moduleId, true);
167  }
168 
169  void ModuleDialog::handleTableSelection(u32 id, bool doubleClick)
170  {
171  mSelectedId = mSelectExclude.isAccepted(id) ? id : 0;
172  enableButtons();
173  if (mSelectedId && doubleClick) accept();
174  }
175 
177  {
178  if (!mods.empty())
179  {
180  u32 moduleId = *mods.constBegin();
181  Module* firstAccepted = gNetlist->get_module_by_id(moduleId);
182  Q_ASSERT(firstAccepted);
183  if (QMessageBox::question(qApp->activeWindow(),
184  "Confirm:",
185  QString("Ok to move %1 into module '%2'[%3]").arg(mSelectExclude.selectionToString()).arg(QString::fromStdString(firstAccepted->get_name())).arg(moduleId),
187  == QMessageBox::Ok)
188  {
189  ActionAddItemsToObject* act = new ActionAddItemsToObject(mSelectExclude.modules(), mSelectExclude.gates());
191  act->exec();
193  gSelectionRelay->addModule(moduleId);
197 
198  ModuleSelectHistory::instance()->add(moduleId);
199  }
200  }
201  deleteLater();
202  }
203 
204  void ModuleDialog::handlePickFromGraph()
205  {
206  Q_ASSERT(mReceiver);
207  new ModuleSelectPicker(mReceiver);
208  mPickerModeActivated = true;
209  reject(); // wait for picker, no selection done in dialog
210  }
211 
213  {
214  ModuleSelectHistory::instance()->add(mSelectedId);
215  QDialog::accept();
216  }
217 
218  void ModuleDialog::handleCreateNewModule()
219  {
220  mNewModule = true;
221  QDialog::accept();
222  }
223 
224  void ModuleDialog::handleToggleSearchbar()
225  {
226  if (mSearchbar->isHidden())
227  {
228  mSearchbar->show();
229  mSearchbar->setFocus();
230  }
231  else
232  {
233  mSearchbar->hide();
234  setFocus();
235  }
236  }
237 
238  void ModuleDialog::handleCurrentTabChanged(int index)
239  {
240  Q_UNUSED(index);
241  //set columnNames for searchbar
242  if(mTabWidget->currentWidget() == mTreeView)
243  mSearchbar->setColumnNames(mModuleTreeProxyModel->getColumnNames());
244  else
245  mSearchbar->setColumnNames(static_cast<ModuleSelectProxy*>(mTableView->model())->getColumnNames());
246  mTreeView->clearSelection();
247  mTableView->clearSelection();
248  mSearchbar->clear();
249  if (mLastUsed) mLastUsed->clearSelection();
250  }
251 
253  {
254  mToggleSearchbar->setShortcut(seq);
255  }
256 }
257 
Adds an item to a module or grouping.
void handleModulesPicked(const QSet< u32 > &mods) override
GraphTabWidget * getGraphTabWidget()
Get hal's graph tab widget.
static SettingsItemKeybind * sSettingSearch
ModuleWidget * getModuleWidget()
void keybindToggleSearchbar(const QKeySequence &seq)
void handleTableSelection(u32 id, bool doubleClick)
ModuleDialog(const QSet< u32 > &excludeIds={}, const QString &title=QString("Select module"), bool omitCreateNew=false, ModuleSelectReceiver *receiver=nullptr, QWidget *parent=nullptr)
void accept() override
std::string get_name() const
Definition: module.cpp:87
Enables filtering in the ModuleModel.
void startSearch(QString text, int options) override
QSet< u32 > modules() const
QString selectionToString() const
selectionToString function is used to generate selection as text for message box
bool isAccepted(u32 modId) const
QSet< u32 > gates() const
static ModuleSelectHistory * instance()
The ModuleSelectPicker class instance gets spawned to pick module from graph.
The ModuleSelectProxy class allows sorting and filtering of module tables.
void startSearch(QString text, int options) override
The ModuleSelectView class is the table widget for module selection.
void moduleSelected(u32 modId, bool doubleClick)
ModuleModel * getModuleModel() const
Module * get_module_by_id(u32 module_id) const
Definition: netlist.cpp:613
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 setFocus(ItemType ftype, u32 fid, Subfocus sfoc=Subfocus::None, u32 sfinx=0)
void relaySelectionChanged(void *sender)
void keySequenceChanged(QKeySequence value)
virtual void setObject(const UserActionObject &obj)
Definition: user_action.cpp:32
The UserActionObject class represents a single object used in UserAction.
ContentManager * gContentManager
Definition: plugin_gui.cpp:78
SelectionRelay * gSelectionRelay
Definition: plugin_gui.cpp:83
Netlist * gNetlist
Definition: plugin_gui.cpp:80
quint32 u32
i32 id
virtual int rowCount(const QModelIndex &parent) const const=0
void doubleClicked(const QModelIndex &index)
QAbstractItemModel * model() const const
QItemSelectionModel * selectionModel() const const
void setShortcut(const QKeySequence &shortcut)
void triggered(bool checked)
virtual void accept()
virtual void reject()
QPushButton * button(QDialogButtonBox::StandardButton which) const const
QModelIndexList indexes() const const
void selectionChanged(const QItemSelection &selected, const QItemSelection &deselected)
void addWidget(QWidget *w)
QMessageBox::StandardButton question(QWidget *parent, const QString &title, const QString &text, QMessageBox::StandardButtons buttons, QMessageBox::StandardButton defaultButton)
bool isValid() const const
QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
void deleteLater()
QSet::const_iterator constBegin() const const
bool empty() const const
void setDynamicSortFilter(bool enable)
void setFilterKeyColumn(int column)
virtual QModelIndex mapToSource(const QModelIndex &proxyIndex) const const override
virtual void setSourceModel(QAbstractItemModel *sourceModel) override
QString arg(qlonglong a, int fieldWidth, int base, QChar fillChar) const const
QString fromStdString(const std::string &str)
AlignHCenter
int addTab(QWidget *page, const QString &label)
void currentChanged(int index)
void setCurrentIndex(int index)
QWidget * currentWidget() const const
void expandAll()
virtual void setModel(QAbstractItemModel *model) override
void addAction(QAction *action)
void setEnabled(bool)
void hide()
bool isHidden() const const
QLayout * layout() const const
void setDisabled(bool disable)
void setFocus()
void show()
void setWindowTitle(const QString &)