HAL
data_table_widget.cpp
Go to the documentation of this file.
2 #include "gui/gui_globals.h"
6 #include <QHeaderView>
7 #include <QtWidgets/QMenu>
8 #include <QApplication>
9 #include <QClipboard>
10 
11 namespace hal
12 {
13 
15  mDataTableModel(new DataTableModel(this))
16  {
17  mCurrentContainer = nullptr;
18 
19  this->setModel(mDataTableModel);
22  this->setContextMenuPolicy(Qt::ContextMenuPolicy::CustomContextMenu);
24  this->verticalHeader()->setVisible(false);
25  this->horizontalHeader()->setVisible(true);
28 
29  connect(this, &QTableView::customContextMenuRequested, this, &DataTableWidget::handleContextMenuRequest);
30  }
31 
33  {
34  return mDataTableModel;
35  }
36 
38  {
39  if(gate == nullptr){
40  return;
41  }
42  mCurrentContainer = dynamic_cast<DataContainer*>(gate);
43  mDataTableModel->updateData(gate->get_data_map());
44  mCurrentObject = UserActionObject(gate->get_id(), UserActionObjectType::Gate);
46  adjustTableSizes();
47  }
48 
50  {
51  if(net == nullptr){
52  return;
53  }
54  mCurrentContainer = dynamic_cast<DataContainer*>(net);
55  mDataTableModel->updateData(net->get_data_map());
56  mCurrentObject = UserActionObject(net->get_id(), UserActionObjectType::Net);
58  adjustTableSizes();
59  }
60 
62  {
63  if(module == nullptr){
64  return;
65  }
66  mDataTableModel->updateData(module->get_data_map());
67  mCurrentContainer = dynamic_cast<DataContainer*>(module);
70  adjustTableSizes();
71  }
72 
73 
74  void DataTableWidget::resizeEvent(QResizeEvent *event)
75  {
77  adjustTableSizes();
78  }
79 
80  void DataTableWidget::handleContextMenuRequest(const QPoint &pos)
81  {
82  QModelIndex idx = indexAt(pos);
83  // A pure data container can't be accessed via python
84  if(!idx.isValid() || mCurrentObject.type() == UserActionObjectType::None){
85  return;
86  }
87 
88  DataTableModel::DataEntry entry = mDataTableModel->getEntryAtRow(idx.row());
89  QMenu menu;
90  menu.addAction("Category to clipboard", [entry](){QApplication::clipboard()->setText(entry.category);});
91  menu.addAction("Key to clipboard", [entry](){QApplication::clipboard()->setText(entry.key);});
92  menu.addAction("Type to clipboard", [entry](){QApplication::clipboard()->setText(entry.dataType);});
93  menu.addAction("Value to clipboard", [entry](){QApplication::clipboard()->setText(entry.value);});
94 
95  menu.addSection("ChangeSection");
96  menu.addAction("Change category", [this](){changePropertyRequested(DataTableModel::propertyType::category);});
97  menu.addAction("Change key", [this](){changePropertyRequested(DataTableModel::propertyType::key);});
98  menu.addAction("Change type", [this](){changePropertyRequested(DataTableModel::propertyType::type);});
99  menu.addAction("Change value", [this](){changePropertyRequested(DataTableModel::propertyType::value);});
100 
101  QString pyCode = "";
102  switch(mCurrentObject.type())
103  {
104  case UserActionObjectType::Gate: pyCode = PyCodeProvider::pyCodeGateData(mCurrentObject.id(), entry.category, entry.key); break;
105  case UserActionObjectType::Net: pyCode = PyCodeProvider::pyCodeNetData(mCurrentObject.id(), entry.category, entry.key); break;
106  case UserActionObjectType::Module: pyCode = PyCodeProvider::pyCodeModuleData(mCurrentObject.id(), entry.category, entry.key); break;
107  default: break;
108  }
109  menu.addSection("Python");
110  menu.addAction(QIcon(":/icons/python"), "Get data entry", [pyCode](){QApplication::clipboard()->setText(pyCode);});
111 
112  menu.move(dynamic_cast<QWidget*>(sender())->mapToGlobal(pos));
113  menu.exec();
114  }
115 
116  void DataTableWidget::adjustTableSizes()
117  {
120  //this->horizontalHeader()->setStretchLastSection(true);
121  this->setWordWrap(true);
122  this->resizeRowsToContents();
123 
124  /*
125  // Configure the widget height
126  int h = horizontalHeader()->height();
127  for (int i = 0; i < mDataTableModel->rowCount(); i++)
128  h += rowHeight(i);
129 
130  setMaximumHeight(h);
131  setMinimumHeight(h);
132  */
133  }
134 
135  void DataTableWidget::changePropertyRequested(DataTableModel::propertyType prop)
136  {
137  if(!mCurrentContainer)
138  return;
139  const QString propertyString[] = {"category", "key", "type", "value"};
140  QModelIndex idx = currentIndex(); //could also be a parameter to be extra cautious (or the dataentry)
141  DataTableModel::DataEntry entry = mDataTableModel->getEntryAtRow(idx.row());
142  InputDialog ipd("Change " + propertyString[(int)prop], "Choose new value for the " + propertyString[(int)prop] + " field.", entry.getPropertyValueByPropType(prop));
143  if(ipd.exec() == QDialog::Accepted)
144  {
145  QString oldValues[] = {entry.category, entry.key, entry.dataType, entry.value};
146  QString newValues[] = {entry.category, entry.key, entry.dataType, entry.value};
147  newValues[(int)prop] = ipd.textValue();
148  ActionSetObjectData* act = new ActionSetObjectData(newValues[0], newValues[1], newValues[2], newValues[3]);
149  act->setObject(mCurrentObject); //check if not none?
150  if(prop == DataTableModel::propertyType::category || prop == DataTableModel::propertyType::key)
151  act->setChangeKeyAndOrCategory(oldValues[0], oldValues[1]);
152  act->exec();
153 
154  mDataTableModel->updateData(mCurrentContainer->get_data_map());
155  clearSelection();
156  adjustTableSizes();
157  }
158  }
159 
160 
161 } // namespace hal
const std::map< std::tuple< std::string, std::string >, std::tuple< std::string, std::string > > & get_data_map() const
A model to display the data of a DataContainer.
DataEntry getEntryAtRow(int row) const
void updateData(const std::map< std::tuple< std::string, std::string >, std::tuple< std::string, std::string >> &dc)
DataTableWidget(QWidget *parent=nullptr)
void setGate(Gate *gate)
void setModule(Module *module)
DataTableModel * getModel()
Definition: gate.h:58
u32 get_id() const
Definition: gate.cpp:95
u32 get_id() const
Definition: module.cpp:82
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)
PinType type
Net * net
QModelIndex currentIndex() const const
virtual bool event(QEvent *event) override
virtual void resizeEvent(QResizeEvent *event) override
void setSelectionMode(QAbstractItemView::SelectionMode mode)
void setVerticalScrollBarPolicy(Qt::ScrollBarPolicy)
void setText(const QString &text, QClipboard::Mode mode)
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()
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
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)
QPoint mapToGlobal(const QPoint &pos) const const
void move(int x, int y)
void setSizePolicy(QSizePolicy)