HAL
graph_tab_widget.cpp
Go to the documentation of this file.
2 
11 
12 #include "gui/gui_globals.h"
13 
14 #include <QTabWidget>
15 #include <QVBoxLayout>
16 #include <QShortcut>
17 #include <QKeySequence>
18 #include <QCursor>
19 #include <QPixmap>
20 
21 namespace hal
22 {
23  SettingsItemDropdown* GraphTabWidget::sSettingGridType;
24  SettingsItemDropdown* GraphTabWidget::sSettingDragModifier;
25  SettingsItemDropdown* GraphTabWidget::sSettingPanModifier;
26 
27  SettingsItemKeybind* GraphTabWidget::sSettingZoomIn;
28  SettingsItemKeybind* GraphTabWidget::sSettingZoomOut;
29  SettingsItemKeybind* GraphTabWidget::sSettingFoldModule;
30  SettingsItemKeybind* GraphTabWidget::sSettingUnfoldModule;
31  SettingsItemKeybind* GraphTabWidget::sSettingRemoveNode;
32 
33  bool GraphTabWidget::sSettingsInitialized = initSettings();
34 
35  bool GraphTabWidget::initSettings()
36  {
37  sSettingGridType = new SettingsItemDropdown(
38  "Background Grid",
39  "graph_view/grid_type",
40  GraphicsScene::GridType::None,
41  "Appearance:Graph View",
42  "Specifies the grid pattern in the background of the Graph View scene"
43  );
44  sSettingGridType->setValueNames<GraphicsScene::GridType>();
45 
46  sSettingDragModifier = new SettingsItemDropdown(
47  "Move/Swap Modifier",
48  "graph_view/drag_mode_modifier",
49  KeyboardModifier::Alt,
50  "Graph View",
51  "Specifies the key which can be pressed to switch the position of two Module/Gates in the Graph View while dragging."
52  );
53  sSettingDragModifier->setValueNames<KeyboardModifier>();
54 
55  sSettingPanModifier = new SettingsItemDropdown(
56  "Pan Scene Modifier",
57  "graph_view/move_modifier",
58  KeyboardModifier::Shift,
59  "Graph View",
60  "Specifies the key which can be pressed to pan the scene in the Graph View while left clicking."
61  );
62  sSettingPanModifier->setValueNames<KeyboardModifier>();
63 
64  sSettingZoomIn = new SettingsItemKeybind(
65  "Graph View Zoom In",
66  "keybinds/graph_view_zoom_in",
67  QKeySequence("Ctrl++"),
68  "Keybindings:Graph",
69  "Keybind for zooming in in the Graph View."
70  );
71 
72  sSettingZoomOut = new SettingsItemKeybind(
73  "Graph View Zoom Out",
74  "keybinds/graph_view_zoom_out",
75  QKeySequence("Ctrl+-"),
76  "Keybindings:Graph",
77  "Keybind for zooming out in the Graph View."
78  );
79 
80  sSettingFoldModule = new SettingsItemKeybind(
81  "Fold Parent Module",
82  "keybinds/fold_module",
83  QKeySequence("Ctrl+9"),
84  "Keybindings:Graph",
85  "Keybind to fold the parent module of selected node in current view."
86  );
87 
88  sSettingUnfoldModule = new SettingsItemKeybind(
89  "Unfold Module",
90  "keybinds/unfold_module",
91  QKeySequence("Ctrl+8"),
92  "Keybindings:Graph",
93  "Keybind to unfold the selected module."
94  );
95 
96  sSettingRemoveNode = new SettingsItemKeybind(
97  "Remove Node from View",
98  "keybinds/remove_node",
99  QKeySequence("Ctrl+Del"),
100  "Keybindings:Graph",
101  "Keybind to remove the selected node from view."
102  );
103 
104  return true;
105  }
106 
107  GraphTabWidget::GraphTabWidget(QWidget* parent) : ContentWidget("Graph-Views", parent),
108  mTabWidget(new QTabWidget()), mLayout(new QVBoxLayout()), mZoomFactor(1.2),
109  mSelectCursor(Select)
110  {
111  mContentLayout->addWidget(mTabWidget);
112  mTabWidget->setTabsClosable(true);
113  mTabWidget->setMovable(true);
115 
123 
124 
125  //cant use the qt enum Qt::KeyboardModifer, therefore a map as santas little helper
127  mKeyModifierMap.insert(KeyboardModifier::Alt, Qt::KeyboardModifier::AltModifier);
128  mKeyModifierMap.insert(KeyboardModifier::Ctrl, Qt::KeyboardModifier::ControlModifier);
129  mKeyModifierMap.insert(KeyboardModifier::Shift, Qt::KeyboardModifier::ShiftModifier);
130  }
131 
133  {
134  QShortcut* zoomInShortcut = new QShortcut(sSettingZoomIn->value().toString(), this);
135  QShortcut* zoomOutShortcut = new QShortcut(sSettingZoomOut->value().toString(), this);
136  QShortcut* foldModuleShortcut = new QShortcut(sSettingFoldModule->value().toString(), this);
137  QShortcut* unfoldModuleShortcut = new QShortcut(sSettingUnfoldModule->value().toString(), this);
138  QShortcut* removeNodeShortcut = new QShortcut(sSettingRemoveNode->value().toString(), this);
139 
140  connect(zoomInShortcut, &QShortcut::activated, this, &GraphTabWidget::handleZoomInShortcut);
141  connect(zoomOutShortcut, &QShortcut::activated, this, &GraphTabWidget::handleZoomOutShortcut);
142  connect(foldModuleShortcut, &QShortcut::activated, this, &GraphTabWidget::handleFoldModuleShortcut);
143  connect(unfoldModuleShortcut, &QShortcut::activated, this, &GraphTabWidget::handleUnfoldModuleShortcut);
144  connect(removeNodeShortcut, &QShortcut::activated, this, &GraphTabWidget::handleRemoveNodeShortcut);
145 
146  connect(sSettingZoomIn, &SettingsItemKeybind::keySequenceChanged, zoomInShortcut, &QShortcut::setKey);
147  connect(sSettingZoomOut, &SettingsItemKeybind::keySequenceChanged, zoomOutShortcut, &QShortcut::setKey);
148  connect(sSettingFoldModule, &SettingsItemKeybind::keySequenceChanged, foldModuleShortcut, &QShortcut::setKey);
149  connect(sSettingUnfoldModule, &SettingsItemKeybind::keySequenceChanged, unfoldModuleShortcut, &QShortcut::setKey);
150  connect(sSettingRemoveNode, &SettingsItemKeybind::keySequenceChanged, removeNodeShortcut, &QShortcut::setKey);
151 
152  QList<QShortcut*> list;
153  list.append(zoomInShortcut);
154  list.append(zoomOutShortcut);
155  list.append(foldModuleShortcut);
156  list.append(unfoldModuleShortcut);
157  list.append(removeNodeShortcut);
158 
159  return list;
160  }
161 
163  {
164  int tab_index = mTabWidget->addTab(tab, name);
165  return tab_index;
166  }
167 
169  {
170  auto w = dynamic_cast<GraphWidget*>(mTabWidget->widget(index));
171  if (w)
172  {
173  auto ctx = w->getContext();
175  }
176  }
177 
179  {
180  GraphWidget* currentGraphWidget = dynamic_cast<GraphWidget*>(mTabWidget->currentWidget());
181  if(currentGraphWidget)
182  currentGraphWidget->ensureSelectionVisible();
183  }
184 
186  {
187  mTabWidget->removeTab(index);
188 
189  //right way to do it??
190  //GraphWidget* graph_wid = dynamic_cast<GraphWidget*>(mTabWidget->widget(index));
191  //GraphContext* dyn_con = gGraphContextManager->get_context_by_name(mTabWidget->tabText(index));
192  //dyn_con->unsubscribe(graph_wid);
193  }
194 
196  {
197  auto index = getContextTabIndex(context);
198  if (index != -1)
199  {
200  mTabWidget->setCurrentIndex(index);
201  mTabWidget->widget(index)->setFocus();
202  return;
203  }
204 
205  addGraphWidgetTab(context);
206  }
207 
209  {
210  addGraphWidgetTab(context);
211  }
212 
214  {
215  mTabWidget->setTabText(getContextTabIndex(context), context->name());
216  }
217 
219  {
220  handleTabCloseRequested(getContextTabIndex(context));
221  }
222 
224  {
225  GraphWidget* currentGraphWidget = dynamic_cast<GraphWidget*>(mTabWidget->currentWidget());
226  if(currentGraphWidget)
227  currentGraphWidget->focusGate(gateId);
228  }
229 
231  {
232  GraphWidget* currentGraphWidget = dynamic_cast<GraphWidget*>(mTabWidget->currentWidget());
233  if(currentGraphWidget)
234  currentGraphWidget->focusNet(netId);
235  }
236 
238  {
239  GraphWidget* currentGraphWidget = dynamic_cast<GraphWidget*>(mTabWidget->currentWidget());
240  if(currentGraphWidget)
241  currentGraphWidget->focusModule(moduleId);
242  }
243 
244  void GraphTabWidget::addGraphWidgetTab(GraphContext* context)
245  {
246  GraphWidget* new_graph_widget = new GraphWidget(context);
247 
248  new_graph_widget->view()->setGridType((GraphicsScene::GridType(sSettingGridType->value().toInt())));
249  new_graph_widget->view()->setDragModifier(mKeyModifierMap.value((KeyboardModifier)sSettingDragModifier->value().toInt()));
250  new_graph_widget->view()->setPanModifier(mKeyModifierMap.value((KeyboardModifier)sSettingPanModifier->value().toInt()));
251 
252  connect(sSettingGridType, &SettingsItemDropdown::intChanged, new_graph_widget, [new_graph_widget](int value){
253  new_graph_widget->view()->setGridType((GraphicsScene::GridType(value)));
254  });
255 
256  connect(sSettingDragModifier, &SettingsItemDropdown::intChanged, new_graph_widget, [new_graph_widget, this](int value){
257  new_graph_widget->view()->setDragModifier(mKeyModifierMap.value((KeyboardModifier)value));
258  });
259 
260  connect(sSettingPanModifier, &SettingsItemDropdown::intChanged, new_graph_widget, [new_graph_widget, this](int value){
261  new_graph_widget->view()->setPanModifier(mKeyModifierMap.value((KeyboardModifier)value));
262  });
263 
264  //mContextWidgetMap.insert(context, new_graph_widget);
265 
266  int tab_index = addTab(new_graph_widget, context->name());
267  mTabWidget->setCurrentIndex(tab_index);
268  mTabWidget->widget(tab_index)->setFocus();
269  context->scheduleSceneUpdate();
270  }
271 
272  void GraphTabWidget::handleZoomInShortcut()
273  {
274  GraphWidget* w = dynamic_cast<GraphWidget*>(mTabWidget->currentWidget());
275  if(w)
276  w->view()->viewportCenterZoom(mZoomFactor);
277  }
278 
279  void GraphTabWidget::handleZoomOutShortcut()
280  {
281  GraphWidget* w = dynamic_cast<GraphWidget*>(mTabWidget->currentWidget());
282  if(w)
283  w->view()->viewportCenterZoom(1.0 / mZoomFactor);
284 
285  }
286 
287  void GraphTabWidget::handleFoldModuleShortcut()
288  {
289  GraphWidget* currentGraphWidget = dynamic_cast<GraphWidget*>(mTabWidget->currentWidget());
290  if (!currentGraphWidget) return;
291  currentGraphWidget->view()->handleFoldModuleShortcut();
292  }
293 
294  void GraphTabWidget::handleUnfoldModuleShortcut()
295  {
296  GraphWidget* currentGraphWidget = dynamic_cast<GraphWidget*>(mTabWidget->currentWidget());
297  if (!currentGraphWidget) return;
298  currentGraphWidget->view()->handleUnfoldModuleShortcut();
299  }
300 
301  void GraphTabWidget::handleRemoveNodeShortcut()
302  {
303  GraphWidget* currentGraphWidget = dynamic_cast<GraphWidget*>(mTabWidget->currentWidget());
304  if (!currentGraphWidget) return;
305  currentGraphWidget->view()->handleRemoveFromView();
306  }
307 
309  {
310  for (int i = 0; i < mTabWidget->count(); i++)
311  {
312  if (auto p = dynamic_cast<GraphWidget*>(mTabWidget->widget(i)))
313  {
314  if (p->getContext() == ctx)
315  {
316  if (i == mTabWidget->currentIndex())
317  return 2;
318  return 1;
319  }
320  }
321  }
322  return 0;
323  }
324 
325  int GraphTabWidget::getContextTabIndex(const GraphContext* context) const
326  {
327  for (int i = 0; i < mTabWidget->count(); i++)
328  {
329  if (auto p = dynamic_cast<GraphWidget*>(mTabWidget->widget(i)))
330  {
331  if (p->getContext() == context)
332  {
333  return i;
334  }
335  }
336  }
337  return -1;
338  }
339 
341  {
342  int index = mTabWidget->tabBar()->tabAt(pos);
343 
344  if (index == -1)
345  return;
346 
347  QMenu contextMenu("Context menu", this);
348 
349  contextMenu.addAction("Close", [this, index](){
351  });
352 
353  contextMenu.addSeparator();
354 
355  contextMenu.addAction("Close all", [this](){
357  });
358 
359  contextMenu.addAction("Close all others", [this, index](){
360  handleCloseTabsToRight(index);
361  handleCloseTabsToLeft(index);
362  });
363 
364  contextMenu.addAction("Close all right", [this, index](){
365  handleCloseTabsToRight(index);
366  });
367 
368  contextMenu.addAction("Close all left", [this, index](){
369  handleCloseTabsToLeft(index);
370  });
371 
372  contextMenu.exec(mapToGlobal(pos));
373 
374  }
375 
377  {
378  // Close last tab until tab at index is the last tab
379  while (index != mTabWidget->count()-1)
380  handleTabCloseRequested(mTabWidget->count()-1);
381  }
382 
384  {
385  // Close first tab until tab at index is the first tab
386  while (index != 0)
387  {
389  index-=1;
390  }
391  }
392 
394  {
395  int count = mTabWidget->count();
396  for (int i = 0; i < count; i++)
397  {
399  }
400  }
401 
403  {
404  mSelectCursor = (GraphCursor) icurs;
405  int n = mTabWidget->count();
406  if (mSelectCursor == Select)
407  {
408  for (int i=0; i<n; i++)
409  mTabWidget->widget(i)->unsetCursor();
410  }
411  else
412  {
413  QCursor gcurs(mSelectCursor == PickModule
414  ? QPixmap(":/icons/module_cursor","PNG")
415  : QPixmap(":/icons/gate_cursor","PNG"));
416  for (int i=0; i<n; i++)
417  mTabWidget->widget(i)->setCursor(gcurs);
418  }
419  }
420 
421  void GraphTabWidget::emitTerminatePicker() const
422  {
424  }
425 }
ContextManagerWidget * getContextManagerWidget()
Abstract class for Widgets within HAL's ContentArea.
QVBoxLayout * mContentLayout
void selectViewContext(GraphContext *context)
Logical container for modules, gates, and nets.
Definition: graph_context.h:55
QString name() const
void contextRenamed(GraphContext *context)
void contextCreated(GraphContext *context)
void deletingContext(GraphContext *context)
void setGridType(GraphicsScene::GridType gridType)
void setPanModifier(Qt::KeyboardModifier panModifier)
void setDragModifier(Qt::KeyboardModifier dragModifier)
void handleGateFocus(u32 gateId)
void handleTabCloseRequested(int index)
void handleCustomContextMenuRequested(const QPoint &pos)
void handleCloseTabsToRight(int index)
virtual QList< QShortcut * > createShortcuts() override
int visibleStatus(const GraphContext *ctx) const
void handleContextRemoved(GraphContext *context)
void setSelectCursor(int icurs)
void handleCloseTabsToLeft(int index)
void handleNetFocus(u32 netId)
void showContext(GraphContext *context)
int addTab(QWidget *tab, QString tab_name="default")
void handleContextCreated(GraphContext *context)
GraphTabWidget(QWidget *parent=nullptr)
void handleModuleFocus(u32 moduleId)
void handleTabChanged(int index)
void triggerTerminatePicker() const
void handleContextRenamed(GraphContext *context)
Wraps a GraphContext and a GraphGraphicsView.
Definition: graph_widget.h:55
void ensureSelectionVisible()
GraphContext * getContext() const
void focusGate(u32 gateId)
void focusModule(u32 moduleId)
GraphGraphicsView * view()
void focusNet(u32 netId)
void navigationRequested()
virtual QVariant value() const override
void intChanged(int value)
void keySequenceChanged(QKeySequence value)
virtual QVariant value() const override
ContentManager * gContentManager
Definition: plugin_gui.cpp:78
GraphContextManager * gGraphContextManager
Definition: plugin_gui.cpp:85
GuiApi * gGuiApi
Definition: plugin_gui.cpp:86
n
Definition: test.py:6
quint32 u32
std::string name
void addWidget(QWidget *widget, int stretch, Qt::Alignment alignment)
void append(const T &value)
QMap::iterator insert(const Key &key, const T &value)
const T value(const Key &key, const T &defaultValue) const const
QAction * addAction(const QString &text)
QAction * addSeparator()
QAction * exec()
Q_EMITQ_EMIT
QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
void activated()
void setKey(const QKeySequence &key)
CustomContextMenu
int tabAt(const QPoint &position) const const
int addTab(QWidget *page, const QString &label)
void currentChanged(int index)
void setCurrentIndex(int index)
QWidget * currentWidget() const const
void setMovable(bool movable)
void removeTab(int index)
void setTabText(int index, const QString &label)
QTabBar * tabBar() const const
void tabCloseRequested(int index)
void setTabsClosable(bool closeable)
QWidget * widget(int index) const const
int toInt(bool *ok) const const
QString toString() const const
void setContextMenuPolicy(Qt::ContextMenuPolicy policy)
void unsetCursor()
void customContextMenuRequested(const QPoint &pos)
QPoint mapToGlobal(const QPoint &pos) const const
void setFocus()