1 #include "XGUI_MainWindow.h"
2 #include "XGUI_Constants.h"
3 #include "XGUI_MainMenu.h"
4 #include "XGUI_ViewWindow.h"
5 #include "XGUI_Viewer.h"
6 #include "XGUI_ObjectsBrowser.h"
8 #include <PyConsole_Console.h>
9 #include <PyConsole_EnhInterp.h>
12 #include <QMdiSubWindow>
14 #include <QDockWidget>
15 #include <QApplication>
17 #include <QCloseEvent>
19 XGUI_MainWindow::XGUI_MainWindow(QWidget* parent)
20 : QMainWindow(parent),
22 myIsConsoleDocked(false)
24 setWindowTitle(tr("New Geom"));
26 QMdiArea* aMdiArea = new QMdiArea(this);
27 aMdiArea->setContextMenuPolicy(Qt::ActionsContextMenu);
28 setCentralWidget(aMdiArea);
29 connect(aMdiArea, SIGNAL(subWindowActivated(QMdiSubWindow*)),
30 this, SLOT(onViewActivated(QMdiSubWindow*)));
32 // Create actions of MDI area
33 QAction* aAction = new QAction(QIcon(":pictures/new_view.png"), tr("Create Window"), aMdiArea);
34 aMdiArea->addAction(aAction);
35 connect(aAction, SIGNAL(triggered(bool)), this, SLOT(createSubWindow()));
37 aAction = new QAction(QIcon(":pictures/tile_views.png"), tr("Tile"), aMdiArea);
38 aMdiArea->addAction(aAction);
39 connect(aAction, SIGNAL(triggered(bool)), aMdiArea, SLOT(tileSubWindows()));
41 aAction = new QAction(QIcon(":pictures/cascade_views.png"), tr("Cascade"), aMdiArea);
42 aMdiArea->addAction(aAction);
43 connect(aAction, SIGNAL(triggered(bool)), this, SLOT(cascadeWindows()));
45 aAction = new QAction(aMdiArea);
46 aAction->setSeparator(true);
47 aMdiArea->addAction(aAction);
49 myViewer = new XGUI_Viewer(this);
50 connect(myViewer, SIGNAL(viewCreated(XGUI_ViewWindow*)),
51 this, SLOT(onViewCreated(XGUI_ViewWindow*)));
52 connect(myViewer, SIGNAL(deleteView(XGUI_ViewWindow*)),
53 this, SLOT(onDeleteView(XGUI_ViewWindow*)));
56 XGUI_MainWindow::~XGUI_MainWindow(void)
60 //******************************************************
61 QMdiArea* XGUI_MainWindow::mdiArea() const
63 return static_cast<QMdiArea*>(centralWidget());
66 //******************************************************
67 void XGUI_MainWindow::showPythonConsole()
69 if (!myPythonConsole) {
70 myPythonConsole = new PyConsole_EnhConsole(this, new PyConsole_EnhInterp());
71 undockPythonConsole();
73 myPythonConsole->parentWidget()->show();
76 //******************************************************
77 void XGUI_MainWindow::hidePythonConsole()
80 myPythonConsole->parentWidget()->hide();
83 //******************************************************
84 void XGUI_MainWindow::dockPythonConsole()
88 myMenuBar->removeConsole();
89 QDockWidget* aDock = new QDockWidget(this);
90 aDock->setFeatures(QDockWidget::AllDockWidgetFeatures |
91 QDockWidget::DockWidgetVerticalTitleBar);
92 aDock->setAllowedAreas(Qt::LeftDockWidgetArea |
93 Qt::RightDockWidgetArea |
94 Qt::BottomDockWidgetArea);
95 aDock->setMinimumHeight(0);
96 aDock->setWindowTitle("Console");
97 aDock->setWidget(myPythonConsole);
98 addDockWidget(Qt::BottomDockWidgetArea, aDock);
99 // Undock python console if widget is closed...
100 CloseEventWatcher* aWatcher = new CloseEventWatcher(aDock);
101 connect(aWatcher, SIGNAL(widgetClosed()),
102 this, SLOT(undockPythonConsole()));
103 aDock->installEventFilter(aWatcher);
106 void XGUI_MainWindow::undockPythonConsole()
108 if (!myPythonConsole)
110 QDockWidget* aDock = qobject_cast<QDockWidget*>(myPythonConsole->parentWidget());
111 //When the application starts console will be displayed as
112 //a wokbench tab, so there is no dock yet
115 aDock->setWidget(NULL);
116 aDock->deleteLater();
118 myMenuBar->insertConsole(myPythonConsole);
121 //******************************************************
122 void XGUI_MainWindow::createSubWindow()
124 viewer()->createView();
127 //******************************************************
128 void XGUI_MainWindow::cascadeWindows()
130 QMdiArea* aMdiArea = static_cast<QMdiArea*>(centralWidget());
131 QList<QMdiSubWindow*> aWindows = aMdiArea->subWindowList();
133 QSize aSize = aMdiArea->size();
134 QRect aRect = aMdiArea->geometry();
135 const int aOffset = 30;
138 int w = aSize.width() / 2;
139 int h = aSize.height() / 2;
140 QMdiSubWindow* aLastWnd;
141 foreach(QMdiSubWindow* aWnd, aWindows) {
145 if ((x + w) > aSize.width()) {
150 if ((y + h) > aSize.height()) {
154 aWnd->setGeometry(QStyle::visualRect(aWnd->layoutDirection(), aRect,
158 viewer()->onWindowActivated(aWnd);
160 QApplication::processEvents();
162 aLastWnd->setFocus();
165 void XGUI_MainWindow::onViewCreated(XGUI_ViewWindow* theWindow)
167 QWidget* aSubWindow = theWindow->parentWidget();
168 QWidget* aMDIWidget = centralWidget();
170 QAction* aAction = new QAction(aSubWindow->windowTitle(), aMDIWidget);
171 aAction->setCheckable(true);
172 connect(aAction, SIGNAL(triggered(bool)), this, SLOT(activateView()));
173 aMDIWidget->addAction(aAction);
175 QList<QAction*> aActions = aMDIWidget->actions();
176 foreach(QAction* aAct, aActions) {
177 if (aAct->isCheckable())
178 aAct->setChecked(false);
180 aAction->setChecked(true);
183 void XGUI_MainWindow::onDeleteView(XGUI_ViewWindow* theWindow)
185 QWidget* aSubWindow = theWindow->parentWidget();
186 QString aTitle = aSubWindow->windowTitle();
187 QWidget* aMDIWidget = centralWidget();
188 QList<QAction*> aActions = aMDIWidget->actions();
190 QAction* aDelAct = 0;
191 foreach(QAction* aAct, aActions) {
192 if (aAct->text() == aTitle) {
197 aMDIWidget->removeAction(aDelAct);
200 void XGUI_MainWindow::activateView()
202 QAction* aAction = static_cast<QAction*>(sender());
203 QString aWndTitle = aAction->text();
204 QMdiArea* aMdiArea = static_cast<QMdiArea*>(centralWidget());
206 QList<QMdiSubWindow*> aWndList = aMdiArea->subWindowList();
207 QMdiSubWindow* aTargetView = 0;
208 foreach(QMdiSubWindow* aWnd, aWndList) {
209 if (aWnd->windowTitle() == aWndTitle) {
211 aWnd->activateWindow();
216 QApplication::processEvents();
218 QTimer::singleShot(20, aTargetView, SLOT(setFocus()));
221 void XGUI_MainWindow::onViewActivated(QMdiSubWindow* theSubWnd)
225 QMdiArea* aMdiArea = static_cast<QMdiArea*>(centralWidget());
226 QString aWndTitle = theSubWnd->windowTitle();
227 QList<QAction*> aActionList = aMdiArea->actions();
228 foreach(QAction* aAct, aActionList) {
229 if (aAct->isCheckable())
230 aAct->setChecked(aAct->text() == aWndTitle);
234 void XGUI_MainWindow::closeEvent(QCloseEvent * event)
236 emit exitKeySequence();
240 void XGUI_MainWindow::createMainMenu()
242 myMenuBar = new XGUI_MainMenu(this);
243 QDockWidget* aMenuDock = new QDockWidget(this);
244 aMenuDock->setWidget(myMenuBar);
245 aMenuDock->setAllowedAreas(Qt::TopDockWidgetArea);
246 aMenuDock->setFeatures(QDockWidget::DockWidgetVerticalTitleBar);
247 aMenuDock->setWindowTitle(tr("General"));
248 addDockWidget(Qt::TopDockWidgetArea, aMenuDock);
251 CloseEventWatcher::CloseEventWatcher(QObject* theParent)
255 bool CloseEventWatcher::eventFilter(QObject *obj, QEvent *event) {
256 if (event->type() == QEvent::Close) {
261 // standard event processing
262 return QObject::eventFilter(obj, event);