HAL
groupings_of_item_model.cpp
Go to the documentation of this file.
4 #include "gui/gui_globals.h"
5 
6 #include <algorithm>
7 #include <QApplication>
8 
9 namespace hal {
10 
12  : QAbstractTableModel(parent)
13  {
14  mGroupings.clear();
15  mItemId = 0;
16 
17  // Event Connects
18  connect(gNetlistRelay, &NetlistRelay::groupingRemoved, this, &GroupingsOfItemModel::handleGroupingRemoved);
19  connect(gNetlistRelay, &NetlistRelay::groupingNameChanged, this, &GroupingsOfItemModel::handleGroupingNameChanged);
20  connect(gNetlistRelay, &NetlistRelay::groupingGateAssigned, this, &GroupingsOfItemModel::handleGroupingGateAssigned);
21  connect(gNetlistRelay, &NetlistRelay::groupingGateRemoved, this, &GroupingsOfItemModel::handleGroupingGateRemoved);
22  connect(gNetlistRelay, &NetlistRelay::groupingNetAssigned, this, &GroupingsOfItemModel::handleGroupingNetAssigned);
23  connect(gNetlistRelay, &NetlistRelay::groupingNetRemoved, this, &GroupingsOfItemModel::handleGroupingNetRemoved);
24  connect(gNetlistRelay, &NetlistRelay::groupingModuleAssigned, this, &GroupingsOfItemModel::handleGroupingModuleAssigned);
25  connect(gNetlistRelay, &NetlistRelay::groupingModuleRemoved, this, &GroupingsOfItemModel::handleGroupingModuleRemoved);
26  connect(gContentManager->getGroupingManagerWidget()->getModel(), &GroupingTableModel::groupingColorChanged, this, &GroupingsOfItemModel::handleGroupingColorChanged);
27  }
28 
30  {
31  Q_UNUSED(parent)
32  return 3;
33  }
34 
36  {
37  Q_UNUSED(parent)
38  return mGroupings.size();
39  }
40 
41  QVariant GroupingsOfItemModel::headerData(int section, Qt::Orientation orientation, int role) const
42  {
43  if(role != Qt::DisplayRole)
44  return QVariant();
45 
46  if(orientation == Qt::Horizontal)
47  {
48  switch(section)
49  {
50  case 0: return "Grouping Name";
51  case 1: return "ID";
52  case 2: return "Color";
53  default: break;
54  }
55  return QVariant();
56  }
57 
58  return section + 1;
59  }
60 
61  QVariant GroupingsOfItemModel::data(const QModelIndex &index, int role) const
62  {
63  if (!index.isValid()) return QVariant();
64  const GroupingTableEntry& gte = mGroupings.at(index.row());
65 
66  switch (role) {
67  case Qt::BackgroundRole:
68  if (index.column()==2) return gte.color();
69  return QVariant();
70  case Qt::DisplayRole:
71  switch (index.column()) {
72  case 0:
73  return gte.name();
74  case 1:
75  return gte.id();
76  }
77  default:
78  break;
79  }
80  return QVariant();
81  }
82 
83  bool GroupingsOfItemModel::setData(const QModelIndex &index, const QVariant &value, int role)
84  {
85  Q_UNUSED(index)
86  Q_UNUSED(value)
87  Q_UNUSED(role)
88  return false;
89  }
90 
92  {
93  if(gate == nullptr) return;
94  mItemId = gate->get_id();
95  mItemType = ItemType::Gate;
96 
97  QList<GroupingTableEntry> newGroupingList;
98  // Temporary until items can be in multiple groupings
99  Grouping* grp = gate->get_grouping();
100  if(grp != nullptr){
101  newGroupingList.append(GroupingTableEntry(grp));
102  }
104  mGroupings = newGroupingList;
105  layoutChanged();
106  }
107 
109  {
110  if(module == nullptr) return;
111  mItemId = module->get_id();
112  mItemType = ItemType::Module;
113 
114  QList<GroupingTableEntry> newGroupingList;
115  // Temporary until items can be in multiple groupings
116  Grouping* grp = module->get_grouping();
117  if(grp != nullptr){
118  newGroupingList.append(GroupingTableEntry(grp));
119  }
121  mGroupings = newGroupingList;
122  layoutChanged();
123  }
124 
126  {
127  if(net == nullptr) return;
128  mItemId = net->get_id();
129  mItemType = ItemType::Net;
130 
131  QList<GroupingTableEntry> newGroupingList;
132  // Temporary until items can be in multiple groupings
133  Grouping* grp = net->get_grouping();
134  if(grp != nullptr){
135  newGroupingList.append(GroupingTableEntry(grp));
136  }
138  mGroupings = newGroupingList;
139  layoutChanged();
140  }
141 
143  {
144  mItemId = 0;
145  mItemType = ItemType::None;
146 
147  QList<GroupingTableEntry> newGroupingList;
148  for(Grouping* grp : groupingList)
149  {
150  if(grp == nullptr)
151  continue;
152  newGroupingList.append(GroupingTableEntry(grp));
154  mGroupings = newGroupingList;
155  layoutChanged();
156  }
157  }
158 
159  bool GroupingsOfItemModel::removeRows(int row, int count, const QModelIndex &parent)
160  {
161  Q_UNUSED(parent)
162  if((row + count) > mGroupings.size() || row < 0 || count < 1){
163  return false;
164  }
166  mGroupings.erase(mGroupings.begin() + row, mGroupings.begin() + (row + count));
167  layoutChanged();
168  return true;
169  }
170 
171  // ================================================
172  // Event Handler
173  // ================================================
174 
175 
176 
177  void GroupingsOfItemModel::handleGroupingRemoved(Grouping* grp)
178  {
179  int idx = getIndexOfGrouping(grp);
180  if(idx < 0)
181  return;
182  removeRow(idx);
183  }
184 
185  void GroupingsOfItemModel::handleGroupingNameChanged(Grouping* grp)
186  {
187  int idx = getIndexOfGrouping(grp);
188  if(idx < 0)
189  return;
190  mGroupings[idx].setName(QString::fromStdString(grp->get_name()));
191  dataChanged(index(idx,0),index(idx,0));
192  }
193 
194  // These 'assigned' handler functions are temporary since there is no support for multiple groupings per item (yet).
195 
196  void GroupingsOfItemModel::handleGroupingGateAssigned(Grouping* grp, u32 id)
197  {
198  Q_UNUSED(grp)
199  if(mItemType == ItemType::Gate && mItemId == id)
200  {
202  }
203  }
204 
205  void GroupingsOfItemModel::handleGroupingGateRemoved(Grouping* grp, u32 id)
206  {
207  Q_UNUSED(grp)
208  if(mItemType == ItemType::Gate && mItemId == id)
209  {
210  int idx = getIndexOfGrouping(grp);
211  if(idx < 0)
212  return;
213  removeRow(idx);
214  }
215  }
216 
217  void GroupingsOfItemModel::handleGroupingNetAssigned(Grouping* grp, u32 id)
218  {
219  Q_UNUSED(grp);
220  if(mItemType == ItemType::Net && mItemId == id)
221  {
223  }
224  }
225 
226  void GroupingsOfItemModel::handleGroupingNetRemoved(Grouping* grp, u32 id)
227  {
228  if(mItemType == ItemType::Net && mItemId == id)
229  {
230  int idx = getIndexOfGrouping(grp);
231  if(idx < 0)
232  return;
233  removeRow(idx);
234  }
235  }
236 
237  void GroupingsOfItemModel::handleGroupingModuleAssigned(Grouping* grp, u32 id)
238  {
239  Q_UNUSED(grp)
240  if(mItemType == ItemType::Module && mItemId == id)
241  {
243  }
244  }
245 
246  void GroupingsOfItemModel::handleGroupingModuleRemoved(Grouping* grp, u32 id)
247  {
248  if(mItemType == ItemType::Module && mItemId == id)
249  {
250  int idx = getIndexOfGrouping(grp);
251  if(idx < 0)
252  return;
253  removeRow(idx);
254  }
255  }
256 
257  void GroupingsOfItemModel::handleGroupingColorChanged(Grouping* grp)
258  {
259  int idx = getIndexOfGrouping(grp);
260  if(idx < 0)
261  return;
262  mGroupings[idx].setColor(gContentManager->getGroupingManagerWidget()->getModel()->colorForGrouping(grp));
263  dataChanged(index(idx,2),index(idx,2));
264  }
265 
266 
267  int GroupingsOfItemModel::getIndexOfGrouping(Grouping* grp) const
268  {
269  auto res = std::find_if(mGroupings.begin(), mGroupings.end(),
270  [grp](GroupingTableEntry grpEntry)
271  {
272  return grpEntry.grouping() == grp;
273  });
274  if(res != mGroupings.end()){
275  return (res-mGroupings.begin());
276  }
277  else{
278  return -1;
279  }
280  }
281 
282 
283 } // namespace hal
GroupingManagerWidget * getGroupingManagerWidget()
Definition: gate.h:58
Grouping * get_grouping() const
Definition: gate.cpp:204
u32 get_id() const
Definition: gate.cpp:95
GroupingTableModel * getModel() const
An entry within a GroupingTableModel.
QString name() const
QColor color() const
u32 id() const
QColor colorForGrouping(Grouping *grouping) const
void groupingColorChanged(Grouping *grp)
QVariant headerData(int section, Qt::Orientation orientation, int role) const override
int rowCount(const QModelIndex &parent=QModelIndex()) const override
bool removeRows(int row, int count, const QModelIndex &parent=QModelIndex()) override
int columnCount(const QModelIndex &parent=QModelIndex()) const override
QVariant data(const QModelIndex &index, int role) const override
void setGroupings(QList< Grouping * > groupingList)
bool setData(const QModelIndex &index, const QVariant &value, int role=Qt::EditRole) override
GroupingsOfItemModel(QObject *parent=nullptr)
Grouping * get_grouping() const
Definition: module.cpp:120
u32 get_id() const
Definition: module.cpp:82
Definition: net.h:58
Gate * get_gate_by_id(const u32 gate_id) const
Definition: netlist.cpp:193
Module * get_module_by_id(u32 module_id) const
Definition: netlist.cpp:613
Net * get_net_by_id(u32 net_id) const
Definition: netlist.cpp:353
void groupingGateAssigned(Grouping *grp, u32 id) const
void groupingModuleAssigned(Grouping *grp, u32 id) const
void groupingModuleRemoved(Grouping *grp, u32 id) const
void groupingRemoved(Grouping *grp) const
void groupingNetAssigned(Grouping *grp, u32 id) const
void groupingNameChanged(Grouping *grp) const
void groupingNetRemoved(Grouping *grp, u32 id) const
void groupingGateRemoved(Grouping *grp, u32 id) const
const Module * module(const Gate *g, const NodeBoxes &boxes)
ContentManager * gContentManager
Definition: plugin_gui.cpp:78
Netlist * gNetlist
Definition: plugin_gui.cpp:80
NetlistRelay * gNetlistRelay
Definition: plugin_gui.cpp:81
quint32 u32
Net * net
void dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight, const QVector< int > &roles)
void layoutAboutToBeChanged(const QList< QPersistentModelIndex > &parents, QAbstractItemModel::LayoutChangeHint hint)
void layoutChanged(const QList< QPersistentModelIndex > &parents, QAbstractItemModel::LayoutChangeHint hint)
bool removeRow(int row, const QModelIndex &parent)
virtual QModelIndex index(int row, int column, const QModelIndex &parent) const const override
void append(const T &value)
int column() const const
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 * parent() const const
QString fromStdString(const std::string &str)
DisplayRole
Orientation