Salome HOME
28db1de97dd13948b96f4b5847a386859df9ec6f
[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     myIsConsoleDocked(false)
23 {
24   setWindowTitle(tr("New Geom"));
25   createMainMenu();
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*)));
31
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()));
36   
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()));
40   
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()));
44
45   aAction = new QAction(aMdiArea);
46   aAction->setSeparator(true);
47   aMdiArea->addAction(aAction);
48
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*)));
54 }
55
56 XGUI_MainWindow::~XGUI_MainWindow(void)
57 {
58 }
59
60 //******************************************************
61 QMdiArea* XGUI_MainWindow::mdiArea() const
62 {
63   return static_cast<QMdiArea*>(centralWidget());
64 }
65
66 //******************************************************
67 void XGUI_MainWindow::showPythonConsole()
68 {
69   // TODO: Check why PyConsole can not be created
70   //if (!myPythonConsole) {
71   //  myPythonConsole = new PyConsole_EnhConsole(this, new PyConsole_EnhInterp());
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 |
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);
105 }
106
107 void XGUI_MainWindow::undockPythonConsole()
108 {
109   if (!myPythonConsole)
110     return;
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
114   if(aDock) {
115     aDock->hide();
116     aDock->setWidget(NULL);
117     aDock->deleteLater();
118   }
119   myMenuBar->insertConsole(myPythonConsole);
120 }
121
122 //******************************************************
123 void XGUI_MainWindow::createSubWindow()
124 {
125   viewer()->createView();
126 }
127
128 //******************************************************
129 void XGUI_MainWindow::cascadeWindows()
130 {
131   QMdiArea* aMdiArea = static_cast<QMdiArea*>(centralWidget());
132   QList<QMdiSubWindow*> aWindows = aMdiArea->subWindowList();
133   
134   QSize aSize = aMdiArea->size();
135   QRect aRect = aMdiArea->geometry();
136   const int aOffset = 30;
137   int i = 0, j = 0;
138   int x, y;
139   int w = aSize.width() / 2;
140   int h = aSize.height() / 2;
141   QMdiSubWindow* aLastWnd;
142   foreach(QMdiSubWindow* aWnd, aWindows) {
143     aWnd->showNormal();
144     aWnd->raise();
145     x = aOffset * i;
146     if ((x + w) > aSize.width()) {
147       x = 0;
148       i = 0;
149     }
150     y = aOffset * j;
151     if ((y + h) > aSize.height()) {
152       y = 0;
153       j = 0;
154     }
155     aWnd->setGeometry(QStyle::visualRect(aWnd->layoutDirection(), aRect, 
156       QRect(x, y, w, h)));
157     i++;
158     j++;
159     viewer()->onWindowActivated(aWnd);
160     aLastWnd = aWnd;
161     QApplication::processEvents();
162   }
163   aLastWnd->setFocus();
164 }
165
166 void XGUI_MainWindow::onViewCreated(XGUI_ViewWindow* theWindow)
167 {
168   QWidget* aSubWindow = theWindow->parentWidget();
169   QWidget* aMDIWidget = centralWidget();
170
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);
175
176   QList<QAction*> aActions = aMDIWidget->actions();
177   foreach(QAction* aAct, aActions) {
178     if (aAct->isCheckable())
179       aAct->setChecked(false);
180   }
181   aAction->setChecked(true);
182 }
183
184 void XGUI_MainWindow::onDeleteView(XGUI_ViewWindow* theWindow)
185 {
186   QWidget* aSubWindow = theWindow->parentWidget();
187   QString aTitle = aSubWindow->windowTitle();
188   QWidget* aMDIWidget = centralWidget();
189   QList<QAction*> aActions = aMDIWidget->actions();
190
191   QAction* aDelAct = 0;
192   foreach(QAction* aAct, aActions) {
193     if (aAct->text() == aTitle) {
194       aDelAct = aAct;
195       break;
196     }
197   }
198   aMDIWidget->removeAction(aDelAct);
199 }
200
201 void XGUI_MainWindow::activateView()
202 {
203   QAction* aAction = static_cast<QAction*>(sender());
204   QString aWndTitle = aAction->text();
205   QMdiArea* aMdiArea = static_cast<QMdiArea*>(centralWidget());
206
207   QList<QMdiSubWindow*> aWndList = aMdiArea->subWindowList();
208   QMdiSubWindow* aTargetView = 0;
209   foreach(QMdiSubWindow* aWnd, aWndList) {
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     if (aAct->isCheckable())
231       aAct->setChecked(aAct->text() == aWndTitle);
232   }
233 }
234
235 void XGUI_MainWindow::closeEvent(QCloseEvent * event)
236 {
237   emit exitKeySequence();
238   event->ignore();
239 }
240
241 void XGUI_MainWindow::createMainMenu()
242 {
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);
250 }
251
252 CloseEventWatcher::CloseEventWatcher(QObject* theParent)
253     : QObject(theParent)
254 {}
255
256 bool CloseEventWatcher::eventFilter(QObject *obj, QEvent *event) {
257   if (event->type() == QEvent::Close) {
258     emit widgetClosed();
259     event->ignore();
260     return true;
261   } else {
262     // standard event processing
263     return QObject::eventFilter(obj, event);
264   }
265 }
266