HAL  v4.5.0-254-g8f9f6a423
The Hardware Analyzer - a comprehensive reverse engineering and manipulation framework for gate-level netlists.
data_table_widget.cpp
Go to the documentation of this file.
4 #include <QHeaderView>
5 #include <QtWidgets/QMenu>
6 #include <QApplication>
7 #include <QClipboard>
8 #include <QFormLayout>
9 #include <QDialogButtonBox>
10 #include <QLineEdit>
11 
12 namespace hal
13 {
14 
16  : QDialog(parent)
17  {
18  QFormLayout* layout = new QFormLayout(this);
19  const QString label[] = {"Category:", "Key:", "Type:", "Value:"};
20  for (int i=0; i<4; i++)
21  {
22  mLineEdit[i] = new QLineEdit(this);
23  if (entry)
25  layout->addRow(label[i],mLineEdit[i]);
26  }
30  layout->addWidget(dbb);
31  }
32 
34  {
35  return DataTableEntry(mLineEdit[0]->text(), mLineEdit[1]->text(), mLineEdit[2]->text(), mLineEdit[3]->text());
36  }
37 
39  mDataTableModel(new DataTableModel(this))
40  {
41  mCurrentContainer = nullptr;
42 
43  this->setModel(mDataTableModel);
47  this->setContextMenuPolicy(Qt::ContextMenuPolicy::CustomContextMenu);
49  this->verticalHeader()->setVisible(false);
50  this->horizontalHeader()->setVisible(true);
53 
54  connect(this, &QTableView::customContextMenuRequested, this, &DataTableWidget::handleContextMenuRequest);
55  }
56 
58  {
59  return mDataTableModel;
60  }
61 
63  {
64  if(gate == nullptr){
65  return;
66  }
67  mCurrentContainer = dynamic_cast<DataContainer*>(gate);
68  mDataTableModel->updateData(gate->get_data_map());
69  mCurrentObject = UserActionObject(gate->get_id(), UserActionObjectType::Gate);
71  adjustTableSizes();
72  }
73 
75  {
76  if(net == nullptr){
77  return;
78  }
79  mCurrentContainer = dynamic_cast<DataContainer*>(net);
80  mDataTableModel->updateData(net->get_data_map());
81  mCurrentObject = UserActionObject(net->get_id(), UserActionObjectType::Net);
83  adjustTableSizes();
84  }
85 
87  {
88  if(module == nullptr){
89  return;
90  }
91  mDataTableModel->updateData(module->get_data_map());
92  mCurrentContainer = dynamic_cast<DataContainer*>(module);
95  adjustTableSizes();
96  }
97 
98 
99  void DataTableWidget::resizeEvent(QResizeEvent *event)
100  {
102  adjustTableSizes();
103  }
104 
105  void DataTableWidget::handleContextMenuRequest(const QPoint &pos)
106  {
107  QModelIndex idx = indexAt(pos);
108  // A pure data container can't be accessed via python
109  if(!idx.isValid() || mCurrentObject.type() == UserActionObjectType::None){
110  return;
111  }
112 
113  DataTableEntry entry = mDataTableModel->getEntryAtRow(idx.row());
114  QMenu menu;
115  QAction* act;
116  menu.addAction("Category to clipboard", [entry](){QApplication::clipboard()->setText(entry.category);});
117  menu.addAction("Key to clipboard", [entry](){QApplication::clipboard()->setText(entry.key);});
118  menu.addAction("Type to clipboard", [entry](){QApplication::clipboard()->setText(entry.dataType);});
119  menu.addAction("Value to clipboard", [entry](){QApplication::clipboard()->setText(entry.value);});
120 
121  menu.addSection("ChangeSection");
122  menu.addAction("Add data entry", [this](){contextAction(ActionSetObjectData::CreateAction);});
123  act = menu.addAction("Change current data entry", [this](){contextAction(ActionSetObjectData::ModifyAction);});
124  act->setEnabled(currentIndex().isValid());
125  act = menu.addAction("Delete current data entry", [this](){contextAction(ActionSetObjectData::DeleteAction);});
126  act->setEnabled(currentIndex().isValid());
127 
128  QString pyCode = "";
129  switch(mCurrentObject.type())
130  {
131  case UserActionObjectType::Gate: pyCode = PyCodeProvider::pyCodeGateData(mCurrentObject.id(), entry.category, entry.key); break;
132  case UserActionObjectType::Net: pyCode = PyCodeProvider::pyCodeNetData(mCurrentObject.id(), entry.category, entry.key); break;
133  case UserActionObjectType::Module: pyCode = PyCodeProvider::pyCodeModuleData(mCurrentObject.id(), entry.category, entry.key); break;
134  default: break;
135  }
136  menu.addSection("Python");
137  menu.addAction(QIcon(":/icons/python"), "Get data entry", [pyCode](){QApplication::clipboard()->setText(pyCode);});
138 
139  menu.move(dynamic_cast<QWidget*>(sender())->mapToGlobal(pos));
140  menu.exec();
141  }
142 
143  void DataTableWidget::adjustTableSizes()
144  {
147  //this->horizontalHeader()->setStretchLastSection(true);
148  this->setWordWrap(true);
149  this->resizeRowsToContents();
150 
151  /*
152  // Configure the widget height
153  int h = horizontalHeader()->height();
154  for (int i = 0; i < mDataTableModel->rowCount(); i++)
155  h += rowHeight(i);
156 
157  setMaximumHeight(h);
158  setMinimumHeight(h);
159  */
160  }
161 
162  void DataTableWidget::contextAction(ActionSetObjectData::ActionType actionType)
163  {
164  DataTableEntry oldEntry;
165 
166  if(actionType != ActionSetObjectData::CreateAction) // current (=old) entry is requested for all actions except create
167  {
168  if (!mCurrentContainer) return;
169  QModelIndex idx = currentIndex(); //could also be a parameter to be extra cautious (or the dataentry)
170  oldEntry = mDataTableModel->getEntryAtRow(idx.row());
171  }
172 
173  ActionSetObjectData* act = nullptr;
174 
175  if (actionType == ActionSetObjectData::DeleteAction)
176  {
177  act = new ActionSetObjectData(ActionSetObjectData::DeleteAction, oldEntry);
178  }
179  else
180  {
181  DataEntryDialog ded(&oldEntry);
182  if (ded.exec() != QDialog::Accepted) return;
183 
184  DataTableEntry newEntry = ded.getEntry();
185  act = new ActionSetObjectData(actionType, newEntry);
186  act->setObject(mCurrentObject); //check if not none?
187 
188  // if category or key gets changed it is treated as "MoveAction" internally (delete old + create new)
189  if (actionType == ActionSetObjectData::ModifyAction &&
190  ((oldEntry.category != newEntry.category) || (oldEntry.key != newEntry.key)))
191  {
192  act->setChangeKeyAndOrCategory(oldEntry.category, oldEntry.key);
193  }
194 
195  }
196 
197  act->setObject(mCurrentObject); //check if not none?
198  act->exec();
199 
200  mDataTableModel->updateData(mCurrentContainer->get_data_map());
201  clearSelection();
202  adjustTableSizes();
203  }
204 
205 } // namespace hal
const std::map< std::tuple< std::string, std::string >, std::tuple< std::string, std::string > > & get_data_map() const
DataEntryDialog(const DataTableEntry *entry=nullptr, QWidget *parent=nullptr)
DataTableEntry getEntry() const
PropertyType
QString getPropertyValueByPropType(PropertyType ptype) const
A model to display the data of a DataContainer.
void updateData(const std::map< std::tuple< std::string, std::string >, std::tuple< std::string, std::string >> &dc)
DataTableEntry getEntryAtRow(int row) const
DataTableWidget(QWidget *parent=nullptr)
void setGate(Gate *gate)
void setModule(Module *module)
DataTableModel * getModel()
Definition: gate.h:59
u32 get_id() const
Definition: gate.cpp:132
u32 get_id() const
Definition: module.cpp:83
Definition: net.h:58
static QString pyCodeGateData(u32 gateId, QString category, QString key)
static QString pyCodeNetData(u32 netId, QString category, QString key)
static QString pyCodeModuleData(u32 moduleId, QString category, QString key)
The UserActionObject class represents a single object used in UserAction.
UserActionObjectType::ObjectType type() const
const Module * module(const Gate *g, const NodeBoxes &boxes)
Definition: defines.h:45
Net * net
QModelIndex currentIndex() const const
virtual bool event(QEvent *event) override
virtual void resizeEvent(QResizeEvent *event) override
void setSelectionBehavior(QAbstractItemView::SelectionBehavior behavior)
void setSelectionMode(QAbstractItemView::SelectionMode mode)
void setVerticalScrollBarPolicy(Qt::ScrollBarPolicy)
void setEnabled(bool)
void setText(const QString &text, QClipboard::Mode mode)
virtual void accept()
virtual void reject()
void setFrameStyle(int style)
QClipboard * clipboard()
void setSectionResizeMode(QHeaderView::ResizeMode mode)
virtual void setVisible(bool v) override
void addWidget(QWidget *w)
void setText(const QString &)
QAction * addAction(const QString &text)
QAction * addSection(const QString &text)
QAction * exec()
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 * sender() const const
Horizontal
ScrollBarAsNeeded
QHeaderView * horizontalHeader() const const
virtual QModelIndex indexAt(const QPoint &pos) const const override
void resizeColumnsToContents()
void resizeRowsToContents()
virtual void setModel(QAbstractItemModel *model) override
QHeaderView * verticalHeader() const const
void setWordWrap(bool on)
void setContextMenuPolicy(Qt::ContextMenuPolicy policy)
void customContextMenuRequested(const QPoint &pos)
void setFocusPolicy(Qt::FocusPolicy policy)
QLayout * layout() const const
QPoint mapToGlobal(const QPoint &pos) const const
void move(int x, int y)
void setSizePolicy(QSizePolicy)