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 // TODO: Check why PyConsole can not be created
70 //if (!myPythonConsole) {
71 // myPythonConsole = new PyConsole_EnhConsole(this, new PyConsole_EnhInterp());
72 // undockPythonConsole();
74 //myPythonConsole->parentWidget()->show();
77 //******************************************************
78 void XGUI_MainWindow::hidePythonConsole()
81 myPythonConsole->parentWidget()->hide();
84 //******************************************************
85 void XGUI_MainWindow::dockPythonConsole()
89 myMenuBar->removeConsole();
90 QDockWidget* aDock = new QDockWidget(this);
91 aDock->setFeatures(QDockWidget::AllDockWidgetFeatures |
92 QDockWidget::DockWidgetVerticalTitleBar);
93 aDock->setAllowedAreas(Qt::LeftDockWidgetArea |
94 Qt::RightDockWidgetArea |
95 Qt::BottomDockWidgetArea);
96 aDock->setMinimumHeight(0);
97 aDock->setWindowTitle("Console");
98 aDock->setWidget(myPythonConsole);
99 addDockWidget(Qt::BottomDockWidgetArea, aDock);
100 // Undock python console if widget is closed...
101 CloseEventWatcher* aWatcher = new CloseEventWatcher(aDock);
102 connect(aWatcher, SIGNAL(widgetClosed()),
103 this, SLOT(undockPythonConsole()));
104 aDock->installEventFilter(aWatcher);
107 void XGUI_MainWindow::undockPythonConsole()
109 if (!myPythonConsole)
111 QDockWidget* aDock = qobject_cast<QDockWidget*>(myPythonConsole->parentWidget());
112 //When the application starts console will be displayed as
113 //a wokbench tab, so there is no dock yet
116 aDock->setWidget(NULL);
117 aDock->deleteLater();
119 myMenuBar->insertConsole(myPythonConsole);
122 //******************************************************
123 void XGUI_MainWindow::createSubWindow()
125 viewer()->createView();
128 //******************************************************
129 void XGUI_MainWindow::cascadeWindows()
131 QMdiArea* aMdiArea = static_cast<QMdiArea*>(centralWidget());
132 QList<QMdiSubWindow*> aWindows = aMdiArea->subWindowList();
134 QSize aSize = aMdiArea->size();
135 QRect aRect = aMdiArea->geometry();
136 const int aOffset = 30;
139 int w = aSize.width() / 2;
140 int h = aSize.height() / 2;
141 QMdiSubWindow* aLastWnd;
142 foreach(QMdiSubWindow* aWnd, aWindows) {
146 if ((x + w) > aSize.width()) {
151 if ((y + h) > aSize.height()) {
155 aWnd->setGeometry(QStyle::visualRect(aWnd->layoutDirection(), aRect,
159 viewer()->onWindowActivated(aWnd);
161 QApplication::processEvents();
163 aLastWnd->setFocus();
166 void XGUI_MainWindow::onViewCreated(XGUI_ViewWindow* theWindow)
168 QWidget* aSubWindow = theWindow->parentWidget();
169 QWidget* aMDIWidget = centralWidget();
171 QAction* aAction = new QAction(aSubWindow->windowTitle(), aMDIWidget);
172 aAction->setCheckable(true);
173 connect(aAction, SIGNAL(triggered(bool)), this, SLOT(activateView()));
174 aMDIWidget->addAction(aAction);
176 QList<QAction*> aActions = aMDIWidget->actions();
177 foreach(QAction* aAct, aActions) {
178 if (aAct->isCheckable())
179 aAct->setChecked(false);
181 aAction->setChecked(true);
184 void XGUI_MainWindow::onDeleteView(XGUI_ViewWindow* theWindow)
186 QWidget* aSubWindow = theWindow->parentWidget();
187 QString aTitle = aSubWindow->windowTitle();
188 QWidget* aMDIWidget = centralWidget();
189 QList<QAction*> aActions = aMDIWidget->actions();
191 QAction* aDelAct = 0;
192 foreach(QAction* aAct, aActions) {
193 if (aAct->text() == aTitle) {
198 aMDIWidget->removeAction(aDelAct);
201 void XGUI_MainWindow::activateView()
203 QAction* aAction = static_cast<QAction*>(sender());
204 QString aWndTitle = aAction->text();
205 QMdiArea* aMdiArea = static_cast<QMdiArea*>(centralWidget());
207 QList<QMdiSubWindow*> aWndList = aMdiArea->subWindowList();
208 QMdiSubWindow* aTargetView = 0;
209 foreach(QMdiSubWindow* aWnd, aWndList) {
210 if (aWnd->windowTitle() == aWndTitle) {
212 aWnd->activateWindow();
217 QApplication::processEvents();
219 QTimer::singleShot(20, aTargetView, SLOT(setFocus()));
222 void XGUI_MainWindow::onViewActivated(QMdiSubWindow* theSubWnd)
226 QMdiArea* aMdiArea = static_cast<QMdiArea*>(centralWidget());
227 QString aWndTitle = theSubWnd->windowTitle();
228 QList<QAction*> aActionList = aMdiArea->actions();
229 foreach(QAction* aAct, aActionList) {
230 if (aAct->isCheckable())
231 aAct->setChecked(aAct->text() == aWndTitle);
235 void XGUI_MainWindow::closeEvent(QCloseEvent * event)
237 emit exitKeySequence();
241 void XGUI_MainWindow::createMainMenu()
243 myMenuBar = new XGUI_MainMenu(this);
244 QDockWidget* aMenuDock = new QDockWidget(this);
245 aMenuDock->setWidget(myMenuBar);
246 aMenuDock->setAllowedAreas(Qt::TopDockWidgetArea);
247 aMenuDock->setFeatures(QDockWidget::DockWidgetVerticalTitleBar);
248 aMenuDock->setWindowTitle(tr("General"));
249 addDockWidget(Qt::TopDockWidgetArea, aMenuDock);
252 CloseEventWatcher::CloseEventWatcher(QObject* theParent)
256 bool CloseEventWatcher::eventFilter(QObject *obj, QEvent *event) {
257 if (event->type() == QEvent::Close) {
262 // standard event processing
263 return QObject::eventFilter(obj, event);