HAL
groupings_of_item_widget.cpp
Go to the documentation of this file.
3 #include "gui/gui_globals.h"
8 #include <QHeaderView>
9 #include <QtWidgets/QMenu>
10 #include <QApplication>
11 #include <QClipboard>
15 #include <QColorDialog>
16 
17 namespace hal {
19  mGroupingsOfItemModel(new GroupingsOfItemModel(this))
20  {
21 
22  this->setModel(mGroupingsOfItemModel);
26  this->setContextMenuPolicy(Qt::ContextMenuPolicy::CustomContextMenu);
28  this->verticalHeader()->setVisible(false);
31  updateAppearance();
32  adjustTableSizes();
33 
34  connect(this, &QTableView::customContextMenuRequested, this, &GroupingsOfItemWidget::handleContextMenuRequest);
35  connect(mGroupingsOfItemModel, &GroupingsOfItemModel::layoutChanged, this, &GroupingsOfItemWidget::handleLayoutChanged);
36  }
37 
39  {
40  return mGroupingsOfItemModel;
41  }
42 
44  {
45  if(gate == nullptr){
46  return;
47  }
48  mCurrentObjectType = ItemType::Gate;
49  mCurrentObjectId = gate->get_id();
50  mGroupingsOfItemModel->setGate(gate);
51  updateAppearance();
52  adjustTableSizes();
53  }
54 
56  {
57  if(net == nullptr){
58  return;
59  }
60  mCurrentObjectType = ItemType::Net;
61  mCurrentObjectId = net->get_id();
62  mGroupingsOfItemModel->setNet(net);
63  updateAppearance();
64  adjustTableSizes();
65  }
66 
68  {
69  if(module == nullptr){
70  return;
71  }
72  mCurrentObjectType = ItemType::Module;
73  mCurrentObjectId = module->get_id();
74  mGroupingsOfItemModel->setModule(module);
75  updateAppearance();
76  adjustTableSizes();
77  }
78 
79 
80  void GroupingsOfItemWidget::resizeEvent(QResizeEvent *event)
81  {
83  adjustTableSizes();
84  }
85 
86  void GroupingsOfItemWidget::handleContextMenuRequest(const QPoint &pos)
87  {
88  QModelIndex idx = indexAt(pos);
89  // A pure data container can't be accessed via python
90  if(!idx.isValid()){
91  return;
92  }
93 
94  GroupingTableEntry e = mGroupingsOfItemModel->getGroupingEntryAtRow(idx.row());
95  QMenu menu;
96  menu.setTitle(QString("%1 (%2)").arg(e.name(), e.id()));
97 
98 
99  /*====================================
100  Plaintext to Clipboard
101  ====================================*/
102  QString toClipboardText = e.name();
103  menu.addAction(
104  "Grouping name to clipboard",
105  [toClipboardText]()
106  {
107  QApplication::clipboard()->setText( toClipboardText );
108  }
109  );
110 
111  toClipboardText = QString::number(e.id());
112  menu.addAction(
113  "Grouping ID to clipboard",
114  [toClipboardText]()
115  {
116  QApplication::clipboard()->setText( toClipboardText );
117  }
118  );
119 
120 
121  menu.addSection("Misc");
122 
123  menu.addAction("Change grouping name", [this, e](){changeNameTriggered(e);});
124  menu.addAction("Change grouping color", [this, e](){changeColorTriggered(e);});
125 
126  /*====================================
127  Remove item from grouping
128  ====================================*/
129  if (mCurrentObjectType != ItemType::None && mCurrentObjectId > 0){
130  QSet<u32> rmMods;
131  QSet<u32> rmGates;
132  QSet<u32> rmNets;
133  QString actionText;
134  if(mCurrentObjectType == ItemType::Gate){
135  actionText = "Remove gate from grouping";
136  rmGates.insert(mCurrentObjectId);
137  }
138 
139  else if(mCurrentObjectType == ItemType::Module){
140  actionText = "Remove module from grouping";
141  rmMods.insert(mCurrentObjectId);
142  }
143 
144  else if(mCurrentObjectType == ItemType::Net){
145  actionText = "Remove net from grouping";
146  rmNets.insert(mCurrentObjectId);
147  }
148 
149  menu.addAction(
150  actionText,
151  [e,rmMods,rmGates,rmNets]()
152  {
153  ActionRemoveItemsFromObject* rmItemAction = new ActionRemoveItemsFromObject(rmMods,rmGates,rmNets);
154  rmItemAction->setObject(UserActionObject(e.id(), UserActionObjectType::Grouping));
155  rmItemAction->setObjectLock(true);
156  rmItemAction->exec();
157  }
158  );
159  }
160 
161 
162  /*====================================
163  Python to Clipboard
164  ====================================*/
165  menu.addSection("Python");
166  QString pythonCode = PyCodeProvider::pyCodeGrouping(e.id());
167  menu.addAction(
168  QIcon(":/icons/python"),
169  "Get grouping",
170  [pythonCode]()
171  {
172  QApplication::clipboard()->setText( pythonCode );
173  }
174  );
175 
176  // Grouping List (TODO: When multiple groupings are supported...)
177 
178  menu.move(dynamic_cast<QWidget*>(sender())->mapToGlobal(pos));
179  menu.exec();
180 
181  }
182 
183  void GroupingsOfItemWidget::handleLayoutChanged(const QList<QPersistentModelIndex> &parents, QAbstractItemModel::LayoutChangeHint hint)
184  {
185  Q_UNUSED(parents);
186  Q_UNUSED(hint);
187  updateAppearance();
188  adjustTableSizes();
189  }
190 
191  void GroupingsOfItemWidget::updateAppearance()
192  {
193  int n = mGroupingsOfItemModel->rowCount();
194  notifyNewTitle(n);
195  if(n < 1){
196  this->horizontalHeader()->setVisible(false);
197  }
198  else{
199  this->horizontalHeader()->setVisible(true);
200  }
201  }
202 
203  void GroupingsOfItemWidget::adjustTableSizes()
204  {
207 
208  // Config Height
209  int h = horizontalHeader()->height() + 4;
210  for (int i = 0; i < mGroupingsOfItemModel->rowCount(); i++)
211  h += rowHeight(i);
212 
213  setMaximumHeight(h);
214  setMinimumHeight(h);
215  }
216 
217  void GroupingsOfItemWidget::notifyNewTitle(int elementCount)
218  {
219  if(elementCount < 1){
220  Q_EMIT updateText(mFrameTitleNoItem);
221  }
222  else if(elementCount == 1){
223  Q_EMIT updateText(mFrameTitleSingleItem);
224  }
225  else { // elementCount > 1
226  Q_EMIT updateText(mFrameTitleMultipleItems.arg(elementCount));
227  }
228  }
229 
230  void GroupingsOfItemWidget::changeNameTriggered(GroupingTableEntry entry)
231  {
232  auto grpModel = gContentManager->getGroupingManagerWidget()->getModel();
233  InputDialog ipd;
234  ipd.setWindowTitle("Rename Grouping");
235  ipd.setInfoText("Please select a new unique name for the grouping.");
236  QString oldName = entry.name();
237  grpModel->setAboutToRename(oldName);
238  ipd.setInputText(oldName);
239  ipd.addValidator(grpModel);
240 
241  if (ipd.exec() == QDialog::Accepted)
242  {
243  QString newName = ipd.textValue();
244  if (newName != oldName)
245  {
246  ActionRenameObject* act = new ActionRenameObject(newName);
247  act->setObject(UserActionObject(entry.id(), UserActionObjectType::Grouping));
248  act->exec();
249  }
250  }
251  grpModel->setAboutToRename(QString());
252  }
253 
254  void GroupingsOfItemWidget::changeColorTriggered(GroupingTableEntry entry)
255  {
256  QColor color = entry.color();
257  color = QColorDialog::getColor(color, this, "Select color for grouping " + entry.name());
258  if(color.isValid())
259  {
260  ActionSetObjectColor* act = new ActionSetObjectColor(color);
261  act->setObject(UserActionObject(entry.id(), UserActionObjectType::Grouping));
262  act->exec();
263  }
264  }
265 
266 
267 } // namespace hal
GroupingManagerWidget * getGroupingManagerWidget()
Definition: gate.h:58
u32 get_id() const
Definition: gate.cpp:95
Displays a colored box for the GroupingManagerWidget.
GroupingTableModel * getModel() const
A TableModel to store all Groupings that contain a specified Gate, Net or Module.
int rowCount(const QModelIndex &parent=QModelIndex()) const override
GroupingTableEntry getGroupingEntryAtRow(int row) const
GroupingsOfItemWidget(QWidget *parent=nullptr)
GroupingsOfItemModel * getModel()
void updateText(const QString &text)
u32 get_id() const
Definition: module.cpp:82
Definition: net.h:58
static QString pyCodeGrouping(u32 groupingId)
const Module * module(const Gate *g, const NodeBoxes &boxes)
ContentManager * gContentManager
Definition: plugin_gui.cpp:78
n
Definition: test.py:6
Net * net
void layoutChanged(const QList< QPersistentModelIndex > &parents, QAbstractItemModel::LayoutChangeHint hint)
virtual bool event(QEvent *event) override
virtual void resizeEvent(QResizeEvent *event) override
void setSelectionBehavior(QAbstractItemView::SelectionBehavior behavior)
void setSelectionMode(QAbstractItemView::SelectionMode mode)
void setItemDelegateForColumn(int column, QAbstractItemDelegate *delegate)
void setText(const QString &text, QClipboard::Mode mode)
bool isValid() const const
QColor getColor(const QColor &initial, QWidget *parent, const QString &title, QColorDialog::ColorDialogOptions options)
void setFrameStyle(int style)
QClipboard * clipboard()
void setSectionResizeMode(QHeaderView::ResizeMode mode)
virtual void setVisible(bool v) override
QAction * addAction(const QString &text)
QAction * addSection(const QString &text)
QAction * exec()
void setTitle(const QString &title)
bool isValid() const const
int row() const const
Q_EMITQ_EMIT
QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
QObject * sender() const const
QSet::iterator insert(const T &value)
QString arg(qlonglong a, int fieldWidth, int base, QChar fillChar) const const
QString number(int n, int base)
QHeaderView * horizontalHeader() const const
virtual QModelIndex indexAt(const QPoint &pos) const const override
void resizeColumnsToContents()
int rowHeight(int row) const const
virtual void setModel(QAbstractItemModel *model) override
QHeaderView * verticalHeader() const const
void setContextMenuPolicy(Qt::ContextMenuPolicy policy)
void customContextMenuRequested(const QPoint &pos)
void setFocusPolicy(Qt::FocusPolicy policy)
QPoint mapToGlobal(const QPoint &pos) const const
void setMaximumHeight(int maxh)
void setMinimumHeight(int minh)
void move(int x, int y)
void setSizePolicy(QSizePolicy)