CustusX  15.4.0-beta
An IGT application
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
cxDynamicMainWindowWidgets.cpp
Go to the documentation of this file.
2 #include <QDockWidget>
3 #include <QMainWindow>
4 #include <QScrollArea>
5 #include <QToolBar>
6 #include <QMenu>
7 #include <iostream>
8 #include "cxLogger.h"
9 #include "cxStateService.h"
10 
11 namespace cx
12 {
13 
15  mMainWindow(mainWindow)
16 {
17 
18 }
19 
20 QDockWidget* DynamicMainWindowWidgets::addAsDockWidget(QWidget* widget, QString groupname, QObject* owningPlugin)
21 {
22  QDockWidget* dockWidget = this->createDockWidget(widget);
23  mMainWindow->addDockWidget(Qt::LeftDockWidgetArea, dockWidget);
24 
25  this->tabifyWidget(dockWidget);
26 
27  DynamicWidget item;
28  item.mWidget = dockWidget;
29  dockWidget->setVisible(false); // default visibility
30 
31  item.mGroup = groupname;
32  item.mName = widget->windowTitle();
33  mMainWindow->restoreDockWidget(dockWidget); // restore if added after construction
34 
35  item.mOwningService = owningPlugin;
36 
37  connect(dockWidget->toggleViewAction(), &QAction::triggered, this, &DynamicMainWindowWidgets::onWidgetActionTriggered);
38 
39  mItems.push_back(item);
40  return dockWidget;
41 }
42 
43 void DynamicMainWindowWidgets::registerToolBar(QToolBar* toolbar, QString groupname)
44 {
45  DynamicWidget item;
46  item.mWidget = toolbar;
47  item.mGroup = groupname;
48  item.mName = toolbar->windowTitle();
49  mItems.push_back(item);
50 
51  mMainWindow->addToolBar(toolbar);
52  // this avoids overpopulation of gui at startup, and is the same functionality as for dockwidgets.
53  // also gives correct size of mainwindow at startup.
54  toolbar->hide();
55 }
56 
57 QDockWidget* DynamicMainWindowWidgets::createDockWidget(QWidget* widget)
58 {
59  QScrollArea* scroller = this->addVerticalScroller(widget);
60  QDockWidget* dockWidget = new QDockWidget(widget->windowTitle(), mMainWindow);
61  connect(widget, &QWidget::windowTitleChanged, this, &DynamicMainWindowWidgets::onConsoleWindowTitleChanged);
62  dockWidget->setObjectName(widget->objectName() + "DockWidget");
63  dockWidget->setFocusPolicy(Qt::StrongFocus); // we really want to focus on the embedded widget, see focusInsideDockWidget()
64  dockWidget->setWidget(scroller);
65  return dockWidget;
66 }
67 
69 {
70  for (unsigned i=0; i<mItems.size(); ++i)
71  {
72  DynamicWidget item = mItems[i];
73 
74  if (item.mName != name)
75  {
76  continue;
77  }
78 
79  QDockWidget* dockWidget = dynamic_cast<QDockWidget*>(item.mWidget);
80  if (!dockWidget)
81  continue;
82 
83  dockWidget->show();
84  dockWidget->raise();
85  }
86 }
87 
89 {
90  this->hideAll();
91  mMainWindow->restoreState(desktop.mMainWindowState);
92 
93  for (unsigned i=0; i<desktop.mPresets.size(); ++i)
94  this->restorePreset(desktop.mPresets[i]);
95 }
96 
97 void DynamicMainWindowWidgets::restorePreset(const Desktop::Preset& preset)
98 {
99  QToolBar* tb = mMainWindow->findChild<QToolBar*>(preset.name);
100  if (tb)
101  {
102  mMainWindow->removeToolBar(tb);
103  mMainWindow->addToolBar(Qt::TopToolBarArea, tb);
104  tb->show();
105  return;
106  }
107 
108  QDockWidget* dw = mMainWindow->findChild<QDockWidget*>(preset.name+"DockWidget");
109  if (dw)
110  {
111  dw->show();
112  if (preset.tabbed)
113  {
114  QDockWidget* first = this->getFirstDockWidget(Qt::DockWidgetArea(preset.position));
115  if (first)
116  mMainWindow->tabifyDockWidget(first, dw);
117  else
118  mMainWindow->addDockWidget(Qt::DockWidgetArea(preset.position), dw);
119  }
120  else
121  {
122  mMainWindow->addDockWidget(Qt::DockWidgetArea(preset.position), dw);
123  }
124  return;
125  }
126 
127  CX_LOG_WARNING() << QString("Attempted to restore a nonexitent preset widget: [%1]").arg(preset.name);
128 }
129 
130 void DynamicMainWindowWidgets::onWidgetActionTriggered(bool checked)
131 {
132  QAction* action = dynamic_cast<QAction*>(sender());
133  if (!action)
134  return;
135  QWidget* widget = dynamic_cast<QWidget*>(action->parent());
136  if (!widget)
137  return;
138 
139  // if dockwidgets is tabbed, this ensures that the widget is shown instead
140  // of merely showing the tab.
141  if (checked)
142  widget->raise();
143 }
144 
146 {
147  for (unsigned i=0; i<mItems.size(); )
148  {
149  DynamicWidget item = mItems[i];
150 
151  if (item.mOwningService != service)
152  {
153  ++i;
154  continue;
155  }
156  else
157  {
158  mItems.erase(mItems.begin()+i);
159 
160  QDockWidget* dockWidget = dynamic_cast<QDockWidget*>(item.mWidget);
161  if (dockWidget)
162  mMainWindow->removeDockWidget(dockWidget);
163  }
164  }
165 }
166 
167 void DynamicMainWindowWidgets::onConsoleWindowTitleChanged(const QString & title)
168 {
169  QWidget* widget = dynamic_cast<QWidget*>(sender());
170 
171  for (int i=0; i<3; ++i)
172  {
173  if (!widget)
174  return;
175  QDockWidget* dockWidget = dynamic_cast<QDockWidget*>(widget);
176  if (dockWidget)
177  {
178  dockWidget->setWindowTitle(title);
179  return;
180  }
181  widget = widget->parentWidget();
182  }
183 }
184 
185 QScrollArea* DynamicMainWindowWidgets::addVerticalScroller(QWidget *widget)
186 {
187  QScrollArea* scroller = new QScrollArea(NULL);
188  scroller->setWidget(widget);
189  widget->setParent(scroller);
190  scroller->setWidgetResizable(true);
191  scroller->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
192  QSizePolicy policy = scroller->sizePolicy();
193  policy.setHorizontalPolicy(QSizePolicy::Minimum);
194  scroller->setSizePolicy(policy);
195  return scroller;
196 }
197 
198 void DynamicMainWindowWidgets::tabifyWidget(QDockWidget* dockWidget)
199 {
200  QDockWidget* widget = this->getFirstDockWidget(Qt::LeftDockWidgetArea);
201 
202  if (widget)
203  mMainWindow->tabifyDockWidget(widget, dockWidget);
204 }
205 
206 QDockWidget* DynamicMainWindowWidgets::getFirstDockWidget(Qt::DockWidgetArea area)
207 {
208  for (unsigned i=0; i<mItems.size(); ++i)
209  {
210  QDockWidget* widget = dynamic_cast<QDockWidget*>(mItems[i].mWidget);
211  if (!widget)
212  continue;
213  if (mMainWindow->dockWidgetArea(widget) == Qt::LeftDockWidgetArea)
214  return widget;
215  }
216  return NULL;
217 }
218 
220 {
221  for (unsigned i=0; i<mItems.size(); ++i)
222  {
223  mItems[i].mWidget->hide();
224 
225 // QDockWidget* widget = dynamic_cast<QDockWidget*>(mItems[i].mWidget);
226 // if (!widget)
227 // continue;
228 
229 // widget->hide();
230  }
231 
232  // hide toolbars are disabled.... why?
233  // for (std::set<QToolBar*>::iterator i=mToolbars.begin(); i!=mToolbars.end(); ++i)
234  // (*i)->hide();
235  // for (std::set<QToolBar*>::iterator i=mToolbars.begin(); i!=mToolbars.end(); ++i)
236  // this->removeToolBar(*i);
237  // for (std::set<QToolBar*>::iterator i=mToolbars.begin(); i!=mToolbars.end(); ++i)
238  // this->addToolBar(*i);
239 }
240 
241 void DynamicMainWindowWidgets::addToWidgetGroupMap(ActionGroupMap& groups, QAction* action, QString groupname)
242 {
243  // QAction* action = new QAction();
244 
245  action->setMenuRole(QAction::NoRole);
246 
247  if (!groups.count(groupname))
248  {
249  QActionGroup* group = new QActionGroup(this);
250  group->setExclusive(false);
251  groups[groupname] = group;
252 
253  QAction* heading = new QAction(groupname, this);
254  heading->setDisabled(true);
255  groups[groupname]->addAction(heading);
256  }
257 
258  groups[groupname]->addAction(action);
259 }
260 
262 {
263  // temp attempt: split menu into two parts: widgets and toolbars. - fix
264 
265  QMenu* popupMenu = new QMenu;
266 
267  ActionGroupMap groups;
268  ActionGroupMap tgroups;
269  for (unsigned i=0; i<mItems.size(); ++i)
270  {
271  QDockWidget* widget = dynamic_cast<QDockWidget*>(mItems[i].mWidget);
272  if (widget)
273  this->addToWidgetGroupMap(groups, widget->toggleViewAction(), mItems[i].mGroup);
274  QToolBar* toolbar = dynamic_cast<QToolBar*>(mItems[i].mWidget);
275  if (toolbar)
276  this->addToWidgetGroupMap(tgroups, toolbar->toggleViewAction(), mItems[i].mGroup);
277  }
278 
279  QMenu* widgets = popupMenu->addMenu("Widgets");
280 
281  for(std::map<QString, QActionGroup*>::iterator it = groups.begin(); it != groups.end(); ++it)
282  {
283  widgets->addSeparator();
284  widgets->addActions(it->second->actions());
285  }
286 
287  QMenu* toolbars = popupMenu->addMenu("Toolbars");
288 
289  for(std::map<QString, QActionGroup*>::iterator it = tgroups.begin(); it != tgroups.end(); ++it)
290  {
291  toolbars->addSeparator();
292  toolbars->addActions(it->second->actions());
293  }
294 
295  return popupMenu;
296 }
297 
298 //void DockWidgets::toggleDebug(QAction* action, bool checked)
299 //{
300 // for (std::set<QDockWidget*>::iterator iter = mDockWidgets.begin(); iter != mDockWidgets.end(); ++iter)
301 // {
302 // if (action == (*iter)->toggleViewAction())
303 // {
304 // if (!checked)
305 // (*iter)->hide();
306 // }
307 // }
308 //}
309 
310 } // namespace cx
std::vector< Preset > mPresets
void registerToolBar(QToolBar *toolbar, QString groupname="Toolbars")
DynamicMainWindowWidgets(QMainWindow *mainWindow)
void restoreFrom(const Desktop &desktop)
QByteArray mMainWindowState
Data class for CustusX desktop.
#define CX_LOG_WARNING
Definition: cxLogger.h:112
QDockWidget * addAsDockWidget(QWidget *widget, QString groupname, QObject *owningPlugin=NULL)