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),
23 setWindowTitle(tr("New Geom"));
25 QMdiArea* aMdiArea = new QMdiArea(this);
26 aMdiArea->setContextMenuPolicy(Qt::ActionsContextMenu);
27 setCentralWidget(aMdiArea);
28 connect(aMdiArea, SIGNAL(subWindowActivated(QMdiSubWindow*)), this,
29 SLOT(onViewActivated(QMdiSubWindow*)));
31 // Create actions of MDI area
32 QAction* aAction = new QAction(QIcon(":pictures/new_view.png"), tr("Create Window"), aMdiArea);
33 aMdiArea->addAction(aAction);
34 connect(aAction, SIGNAL(triggered(bool)), this, SLOT(createSubWindow()));
36 aAction = new QAction(QIcon(":pictures/tile_views.png"), tr("Tile"), aMdiArea);
37 aMdiArea->addAction(aAction);
38 connect(aAction, SIGNAL(triggered(bool)), aMdiArea, SLOT(tileSubWindows()));
40 aAction = new QAction(QIcon(":pictures/cascade_views.png"), tr("Cascade"), aMdiArea);
41 aMdiArea->addAction(aAction);
42 connect(aAction, SIGNAL(triggered(bool)), this, SLOT(cascadeWindows()));
44 aAction = new QAction(aMdiArea);
45 aAction->setSeparator(true);
46 aMdiArea->addAction(aAction);
48 myViewer = new XGUI_Viewer(this);
49 connect(myViewer, SIGNAL(viewCreated(XGUI_ViewWindow*)), this,
50 SLOT(onViewCreated(XGUI_ViewWindow*)));
51 connect(myViewer, SIGNAL(deleteView(XGUI_ViewWindow*)), this,
52 SLOT(onDeleteView(XGUI_ViewWindow*)));
55 XGUI_MainWindow::~XGUI_MainWindow(void)
59 //******************************************************
60 QMdiArea* XGUI_MainWindow::mdiArea() const
62 return static_cast<QMdiArea*>(centralWidget());
65 //******************************************************
66 void XGUI_MainWindow::showPythonConsole()
68 // TODO: Check why PyConsole can not be created
69 if (!myPythonConsole) {
70 myPythonConsole = new PyConsole_EnhConsole(this, new PyConsole_EnhInterp());
71 myPythonConsole->setObjectName("PythonConsole");
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 | QDockWidget::DockWidgetVerticalTitleBar);
92 aDock->setAllowedAreas(
93 Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea | Qt::BottomDockWidgetArea);
94 aDock->setMinimumHeight(0);
95 aDock->setWindowTitle("Console");
96 aDock->setWidget(myPythonConsole);
97 addDockWidget(Qt::BottomDockWidgetArea, aDock);
98 // Undock python console if widget is closed...
99 CloseEventWatcher* aWatcher = new CloseEventWatcher(aDock);
100 connect(aWatcher, SIGNAL(widgetClosed()), this, SLOT(undockPythonConsole()));
101 aDock->installEventFilter(aWatcher);
104 void XGUI_MainWindow::undockPythonConsole()
106 if (!myPythonConsole)
108 QDockWidget* aDock = qobject_cast<QDockWidget*>(myPythonConsole->parentWidget());
109 //When the application starts console will be displayed as
110 //a wokbench tab, so there is no dock yet
113 aDock->setWidget(NULL);
114 aDock->deleteLater();
116 myMenuBar->insertConsole(myPythonConsole);
119 //******************************************************
120 void XGUI_MainWindow::createSubWindow()
122 viewer()->createView();
125 //******************************************************
126 void XGUI_MainWindow::cascadeWindows()
128 QMdiArea* aMdiArea = static_cast<QMdiArea*>(centralWidget());
129 QList<QMdiSubWindow*> aWindows = aMdiArea->subWindowList();
131 QSize aSize = aMdiArea->size();
132 QRect aRect = aMdiArea->geometry();
133 const int aOffset = 30;
136 int w = aSize.width() / 2;
137 int h = aSize.height() / 2;
138 QMdiSubWindow* aLastWnd;
139 foreach(QMdiSubWindow* aWnd, aWindows)
144 if ((x + w) > aSize.width()) {
149 if ((y + h) > aSize.height()) {
153 aWnd->setGeometry(QStyle::visualRect(aWnd->layoutDirection(), aRect, QRect(x, y, w, h)));
156 viewer()->onWindowActivated(aWnd);
158 QApplication::processEvents();
160 aLastWnd->setFocus();
163 void XGUI_MainWindow::onViewCreated(XGUI_ViewWindow* theWindow)
165 QWidget* aSubWindow = theWindow->parentWidget();
166 QWidget* aMDIWidget = centralWidget();
168 QAction* aAction = new QAction(aSubWindow->windowTitle(), aMDIWidget);
169 aAction->setCheckable(true);
170 connect(aAction, SIGNAL(triggered(bool)), this, SLOT(activateView()));
171 aMDIWidget->addAction(aAction);
173 QList<QAction*> aActions = aMDIWidget->actions();
174 foreach(QAction* aAct, aActions)
176 if (aAct->isCheckable())
177 aAct->setChecked(false);
179 aAction->setChecked(true);
182 void XGUI_MainWindow::onDeleteView(XGUI_ViewWindow* theWindow)
184 QWidget* aSubWindow = theWindow->parentWidget();
185 QString aTitle = aSubWindow->windowTitle();
186 QWidget* aMDIWidget = centralWidget();
187 QList<QAction*> aActions = aMDIWidget->actions();
189 QAction* aDelAct = 0;
190 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)
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)
231 if (aAct->isCheckable())
232 aAct->setChecked(aAct->text() == aWndTitle);
236 void XGUI_MainWindow::closeEvent(QCloseEvent * event)
238 emit exitKeySequence();
242 void XGUI_MainWindow::createMainMenu()
244 myMenuBar = new XGUI_MainMenu(this);
245 QDockWidget* aMenuDock = new QDockWidget(this);
246 aMenuDock->setWidget(myMenuBar);
247 aMenuDock->setAllowedAreas(Qt::TopDockWidgetArea);
248 aMenuDock->setFeatures(QDockWidget::DockWidgetVerticalTitleBar);
249 aMenuDock->setWindowTitle(tr("General"));
250 addDockWidget(Qt::TopDockWidgetArea, aMenuDock);
253 CloseEventWatcher::CloseEventWatcher(QObject* theParent)
258 bool CloseEventWatcher::eventFilter(QObject *obj, QEvent *event)
260 if (event->type() == QEvent::Close) {
265 // standard event processing
266 return QObject::eventFilter(obj, event);