Salome HOME
Sources formated according to the codeing standards
[modules/shaper.git] / src / XGUI / XGUI_MainWindow.cpp
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"
7
8 #include <PyConsole_Console.h>
9 #include <PyConsole_EnhInterp.h>
10
11 #include <QMdiArea>
12 #include <QMdiSubWindow>
13 #include <QAction>
14 #include <QDockWidget>
15 #include <QApplication>
16 #include <QTimer>
17 #include <QCloseEvent>
18
19 XGUI_MainWindow::XGUI_MainWindow(QWidget* parent)
20     : QMainWindow(parent),
21       myPythonConsole(0)
22 {
23   setWindowTitle(tr("New Geom"));
24   createMainMenu();
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*)));
30
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()));
35
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()));
39
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()));
43
44   aAction = new QAction(aMdiArea);
45   aAction->setSeparator(true);
46   aMdiArea->addAction(aAction);
47
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*)));
53 }
54
55 XGUI_MainWindow::~XGUI_MainWindow(void)
56 {
57 }
58
59 //******************************************************
60 QMdiArea* XGUI_MainWindow::mdiArea() const
61 {
62   return static_cast<QMdiArea*>(centralWidget());
63 }
64
65 //******************************************************
66 void XGUI_MainWindow::showPythonConsole()
67 {
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();
73   }
74   myPythonConsole->parentWidget()->show();
75 }
76
77 //******************************************************
78 void XGUI_MainWindow::hidePythonConsole()
79 {
80   if (myPythonConsole)
81     myPythonConsole->parentWidget()->hide();
82 }
83
84 //******************************************************
85 void XGUI_MainWindow::dockPythonConsole()
86 {
87   if (!myPythonConsole)
88     return;
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);
102 }
103
104 void XGUI_MainWindow::undockPythonConsole()
105 {
106   if (!myPythonConsole)
107     return;
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
111   if (aDock) {
112     aDock->hide();
113     aDock->setWidget(NULL);
114     aDock->deleteLater();
115   }
116   myMenuBar->insertConsole(myPythonConsole);
117 }
118
119 //******************************************************
120 void XGUI_MainWindow::createSubWindow()
121 {
122   viewer()->createView();
123 }
124
125 //******************************************************
126 void XGUI_MainWindow::cascadeWindows()
127 {
128   QMdiArea* aMdiArea = static_cast<QMdiArea*>(centralWidget());
129   QList<QMdiSubWindow*> aWindows = aMdiArea->subWindowList();
130
131   QSize aSize = aMdiArea->size();
132   QRect aRect = aMdiArea->geometry();
133   const int aOffset = 30;
134   int i = 0, j = 0;
135   int x, y;
136   int w = aSize.width() / 2;
137   int h = aSize.height() / 2;
138   QMdiSubWindow* aLastWnd;
139   foreach(QMdiSubWindow* aWnd, aWindows)
140   {
141     aWnd->showNormal();
142     aWnd->raise();
143     x = aOffset * i;
144     if ((x + w) > aSize.width()) {
145       x = 0;
146       i = 0;
147     }
148     y = aOffset * j;
149     if ((y + h) > aSize.height()) {
150       y = 0;
151       j = 0;
152     }
153     aWnd->setGeometry(QStyle::visualRect(aWnd->layoutDirection(), aRect, QRect(x, y, w, h)));
154     i++;
155     j++;
156     viewer()->onWindowActivated(aWnd);
157     aLastWnd = aWnd;
158     QApplication::processEvents();
159   }
160   aLastWnd->setFocus();
161 }
162
163 void XGUI_MainWindow::onViewCreated(XGUI_ViewWindow* theWindow)
164 {
165   QWidget* aSubWindow = theWindow->parentWidget();
166   QWidget* aMDIWidget = centralWidget();
167
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);
172
173   QList<QAction*> aActions = aMDIWidget->actions();
174   foreach(QAction* aAct, aActions)
175   {
176     if (aAct->isCheckable())
177       aAct->setChecked(false);
178   }
179   aAction->setChecked(true);
180 }
181
182 void XGUI_MainWindow::onDeleteView(XGUI_ViewWindow* theWindow)
183 {
184   QWidget* aSubWindow = theWindow->parentWidget();
185   QString aTitle = aSubWindow->windowTitle();
186   QWidget* aMDIWidget = centralWidget();
187   QList<QAction*> aActions = aMDIWidget->actions();
188
189   QAction* aDelAct = 0;
190   foreach(QAction* aAct, aActions)
191   {
192     if (aAct->text() == aTitle) {
193       aDelAct = aAct;
194       break;
195     }
196   }
197   aMDIWidget->removeAction(aDelAct);
198 }
199
200 void XGUI_MainWindow::activateView()
201 {
202   QAction* aAction = static_cast<QAction*>(sender());
203   QString aWndTitle = aAction->text();
204   QMdiArea* aMdiArea = static_cast<QMdiArea*>(centralWidget());
205
206   QList<QMdiSubWindow*> aWndList = aMdiArea->subWindowList();
207   QMdiSubWindow* aTargetView = 0;
208   foreach(QMdiSubWindow* aWnd, aWndList)
209   {
210     if (aWnd->windowTitle() == aWndTitle) {
211       aWnd->raise();
212       aWnd->activateWindow();
213       aTargetView = aWnd;
214       break;
215     }
216   }
217   QApplication::processEvents();
218   if (aTargetView)
219     QTimer::singleShot(20, aTargetView, SLOT(setFocus()));
220 }
221
222 void XGUI_MainWindow::onViewActivated(QMdiSubWindow* theSubWnd)
223 {
224   if (!theSubWnd)
225     return;
226   QMdiArea* aMdiArea = static_cast<QMdiArea*>(centralWidget());
227   QString aWndTitle = theSubWnd->windowTitle();
228   QList<QAction*> aActionList = aMdiArea->actions();
229   foreach(QAction* aAct, aActionList)
230   {
231     if (aAct->isCheckable())
232       aAct->setChecked(aAct->text() == aWndTitle);
233   }
234 }
235
236 void XGUI_MainWindow::closeEvent(QCloseEvent * event)
237 {
238   emit exitKeySequence();
239   event->ignore();
240 }
241
242 void XGUI_MainWindow::createMainMenu()
243 {
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);
251 }
252
253 CloseEventWatcher::CloseEventWatcher(QObject* theParent)
254     : QObject(theParent)
255 {
256 }
257
258 bool CloseEventWatcher::eventFilter(QObject *obj, QEvent *event)
259 {
260   if (event->type() == QEvent::Close) {
261     emit widgetClosed();
262     event->ignore();
263     return true;
264   } else {
265     // standard event processing
266     return QObject::eventFilter(obj, event);
267   }
268 }
269