Salome HOME
Merge branch 'master' of newgeom:newgeom
[modules/shaper.git] / src / XGUI / XGUI_MainWindow.cpp
index 2a88182d297b691cdbf4d21b0c754fdd53be60a2..7fc26f0bfb5f8fb38556a89734e28a7b2f32cdec 100644 (file)
@@ -1,56 +1,57 @@
 #include "XGUI_MainWindow.h"
+#include "XGUI_Constants.h"
 #include "XGUI_MainMenu.h"
 #include "XGUI_ViewWindow.h"
+#include "XGUI_Viewer.h"
+#include "XGUI_ObjectsBrowser.h"
+
+#include <PyConsole_Console.h>
+#include <PyConsole_EnhInterp.h>
 
 #include <QMdiArea>
-#include <QTreeWidget>
+#include <QMdiSubWindow>
+#include <QAction>
 #include <QDockWidget>
-#include <QTextEdit>
-#include <QLabel>
-#include <QToolBar>
-#include <QToolButton>
-#include <QTreeWidgetItem>
-#include <QLayout>
-#include <QLineEdit>
-#include <QGroupBox>
-#include <QFormLayout>
-#include <QDoubleSpinBox>
-#include <QPushButton>
-#include <QScrollArea>
-#include <QComboBox>
-
-XGUI_MainWindow::XGUI_MainWindow(QWidget* parent) :
-    QMainWindow(parent), myObjectBrowser(0)
-{
-    myMenuBar = new XGUI_MainMenu(this);
-
-    QDockWidget* aDoc = new QDockWidget(this);
-    aDoc->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);
-    aDoc->setWindowTitle(tr("OBJECT_BROWSER_TITLE"));
-    myObjectBrowser = new QTreeWidget(aDoc);
-    myObjectBrowser->setColumnCount(1);
-    myObjectBrowser->setHeaderHidden(true);
-    aDoc->setWidget(myObjectBrowser);
-    addDockWidget(Qt::LeftDockWidgetArea, aDoc);
-    //aDoc->hide();
-
-    aDoc = new QDockWidget(this);
-    aDoc->setFeatures(QDockWidget::AllDockWidgetFeatures | QDockWidget::DockWidgetVerticalTitleBar);
-    aDoc->setMinimumHeight(0);
-    aDoc->setWindowTitle("Console");
-    QTextEdit* aTextEdt = new QTextEdit(aDoc);
-    aTextEdt->setText(">>>");
-    aDoc->setWidget(aTextEdt);
-    aTextEdt->setMinimumHeight(0);
-    addDockWidget(Qt::BottomDockWidgetArea, aDoc);
-
-    QMdiArea* aMdiArea = new QMdiArea(this);
-    setCentralWidget(aMdiArea);
-
-    aMdiArea->addSubWindow(new XGUI_ViewWindow(), Qt::FramelessWindowHint);
-
-    fillObjectBrowser();
-    addPropertyPanel();
+#include <QApplication>
+#include <QTimer>
+#include <QCloseEvent>
+
+
+XGUI_MainWindow::XGUI_MainWindow(QWidget* parent)
+    : QMainWindow(parent),
+      myPythonConsole(0), myIsModified(false)
+{
+  myTitle = tr("New Geom");
+  updateTitle();
+  createMainMenu();
+  QMdiArea* aMdiArea = new QMdiArea(this);
+  aMdiArea->setContextMenuPolicy(Qt::ActionsContextMenu);
+  setCentralWidget(aMdiArea);
+  connect(aMdiArea, SIGNAL(subWindowActivated(QMdiSubWindow*)), this,
+          SLOT(onViewActivated(QMdiSubWindow*)));
+
+  // Create actions of MDI area
+  QAction* aAction = new QAction(QIcon(":pictures/new_view.png"), tr("Create Window"), aMdiArea);
+  aMdiArea->addAction(aAction);
+  connect(aAction, SIGNAL(triggered(bool)), this, SLOT(createSubWindow()));
+
+  aAction = new QAction(QIcon(":pictures/tile_views.png"), tr("Tile"), aMdiArea);
+  aMdiArea->addAction(aAction);
+  connect(aAction, SIGNAL(triggered(bool)), aMdiArea, SLOT(tileSubWindows()));
+
+  aAction = new QAction(QIcon(":pictures/cascade_views.png"), tr("Cascade"), aMdiArea);
+  aMdiArea->addAction(aAction);
+  connect(aAction, SIGNAL(triggered(bool)), this, SLOT(cascadeWindows()));
+
+  aAction = new QAction(aMdiArea);
+  aAction->setSeparator(true);
+  aMdiArea->addAction(aAction);
+
+  myViewer = new XGUI_Viewer(this);
+  connect(myViewer, SIGNAL(viewCreated(XGUI_ViewWindow*)), this,
+          SLOT(onViewCreated(XGUI_ViewWindow*)));
+  connect(myViewer, SIGNAL(deleteView(XGUI_ViewWindow*)), this,
+          SLOT(onDeleteView(XGUI_ViewWindow*)));
 }
 
 XGUI_MainWindow::~XGUI_MainWindow(void)
@@ -58,143 +59,238 @@ XGUI_MainWindow::~XGUI_MainWindow(void)
 }
 
 //******************************************************
-void XGUI_MainWindow::showObjectBrowser()
+QMdiArea* XGUI_MainWindow::mdiArea() const
+{
+  return static_cast<QMdiArea*>(centralWidget());
+}
+
+//******************************************************
+void XGUI_MainWindow::showPythonConsole()
+{
+  // TODO: Check why PyConsole can not be created
+  if (!myPythonConsole) {
+    myPythonConsole = new PyConsole_EnhConsole(this, new PyConsole_EnhInterp());
+    myPythonConsole->setObjectName("PythonConsole");
+    undockPythonConsole();
+  }
+  myPythonConsole->parentWidget()->show();
+}
+
+//******************************************************
+void XGUI_MainWindow::hidePythonConsole()
+{
+  if (myPythonConsole)
+    myPythonConsole->parentWidget()->hide();
+}
+
+//******************************************************
+void XGUI_MainWindow::dockPythonConsole()
 {
-    myObjectBrowser->parentWidget()->show();
+  if (!myPythonConsole)
+    return;
+  myMenuBar->removeConsole();
+  QDockWidget* aDock = new QDockWidget(this);
+  aDock->setFeatures(QDockWidget::AllDockWidgetFeatures | QDockWidget::DockWidgetVerticalTitleBar);
+  aDock->setAllowedAreas(
+      Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea | Qt::BottomDockWidgetArea);
+  aDock->setMinimumHeight(0);
+  aDock->setWindowTitle("Console");
+  aDock->setWidget(myPythonConsole);
+  addDockWidget(Qt::BottomDockWidgetArea, aDock);
+  // Undock python console if widget is closed...
+  CloseEventWatcher* aWatcher = new CloseEventWatcher(aDock);
+  connect(aWatcher, SIGNAL(widgetClosed()), this, SLOT(undockPythonConsole()));
+  aDock->installEventFilter(aWatcher);
+}
+
+void XGUI_MainWindow::undockPythonConsole()
+{
+  if (!myPythonConsole)
+    return;
+  QDockWidget* aDock = qobject_cast<QDockWidget*>(myPythonConsole->parentWidget());
+  //When the application starts console will be displayed as
+  //a wokbench tab, so there is no dock yet
+  if (aDock) {
+    aDock->hide();
+    aDock->setWidget(NULL);
+    aDock->deleteLater();
+  }
+  myMenuBar->insertConsole(myPythonConsole);
 }
 
 //******************************************************
-void XGUI_MainWindow::hideObjectBrowser()
+void XGUI_MainWindow::createSubWindow()
 {
-    myObjectBrowser->parentWidget()->hide();
+  viewer()->createView();
 }
 
 //******************************************************
-void XGUI_MainWindow::fillObjectBrowser()
-{
-    QStringList aNames;
-    aNames << "Parameters" << "Constructions";
-    aNames << "Part 1" << "Part 2" << "Part 3";
-    aNames << "Properties";
-
-    QStringList aIcons;
-    aIcons << ":pictures/params_folder.png";
-    aIcons << ":pictures/constr_folder.png";
-    aIcons << ":pictures/part_ico.png";
-    aIcons << ":pictures/part_ico.png";
-    aIcons << ":pictures/part_ico.png";
-    aIcons << ":pictures/properties.png";
-
-    QList<QTreeWidgetItem*> aItems;
-    foreach(QString aName, aNames) {
-        QTreeWidgetItem* aItem = new QTreeWidgetItem(myObjectBrowser);
-        aItem->setText(0, aName);
-        aItems.append(aItem);
+void XGUI_MainWindow::cascadeWindows()
+{
+  QMdiArea* aMdiArea = static_cast<QMdiArea*>(centralWidget());
+  QList<QMdiSubWindow*> aWindows = aMdiArea->subWindowList();
+
+  QSize aSize = aMdiArea->size();
+  QRect aRect = aMdiArea->geometry();
+  const int aOffset = 30;
+  int i = 0, j = 0;
+  int x, y;
+  int w = aSize.width() / 2;
+  int h = aSize.height() / 2;
+  QMdiSubWindow* aLastWnd;
+  foreach(QMdiSubWindow* aWnd, aWindows)
+  {
+    aWnd->showNormal();
+    aWnd->raise();
+    x = aOffset * i;
+    if ((x + w) > aSize.width()) {
+      x = 0;
+      i = 0;
     }
-    for(int i = 0; i < aItems.length(); i++) {
-        aItems[i]->setIcon(0, QIcon(aIcons[i]));
+    y = aOffset * j;
+    if ((y + h) > aSize.height()) {
+      y = 0;
+      j = 0;
     }
-    myObjectBrowser->addTopLevelItems(aItems);
-
-    for (int i = 2; i < 5; i++) {
-        QTreeWidgetItem* aItem = new QTreeWidgetItem(aItems[i]);
-        aItem->setText(0, "Parameters");
-        aItem->setIcon(0, QIcon(":pictures/params_folder.png"));
+    aWnd->setGeometry(QStyle::visualRect(aWnd->layoutDirection(), aRect, QRect(x, y, w, h)));
+    i++;
+    j++;
+    viewer()->onWindowActivated(aWnd);
+    aLastWnd = aWnd;
+    QApplication::processEvents();
+  }
+  aLastWnd->setFocus();
+}
 
-        aItem = new QTreeWidgetItem(aItems[i]);
-        aItem->setText(0, "Construction");
-        aItem->setIcon(0, QIcon(":pictures/constr_folder.png"));
+void XGUI_MainWindow::onViewCreated(XGUI_ViewWindow* theWindow)
+{
+  QWidget* aSubWindow = theWindow->parentWidget();
+  QWidget* aMDIWidget = centralWidget();
+
+  QAction* aAction = new QAction(aSubWindow->windowTitle(), aMDIWidget);
+  aAction->setCheckable(true);
+  connect(aAction, SIGNAL(triggered(bool)), this, SLOT(activateView()));
+  aMDIWidget->addAction(aAction);
+
+  QList<QAction*> aActions = aMDIWidget->actions();
+  foreach(QAction* aAct, aActions)
+  {
+    if (aAct->isCheckable())
+      aAct->setChecked(false);
+  }
+  aAction->setChecked(true);
+}
 
-        aItem = new QTreeWidgetItem(aItems[i]);
-        aItem->setText(0, "Bodies");
-        aItem->setIcon(0, QIcon(":pictures/part_ico.png"));
+void XGUI_MainWindow::onDeleteView(XGUI_ViewWindow* theWindow)
+{
+  QWidget* aSubWindow = theWindow->parentWidget();
+  QString aTitle = aSubWindow->windowTitle();
+  QWidget* aMDIWidget = centralWidget();
+  QList<QAction*> aActions = aMDIWidget->actions();
+
+  QAction* aDelAct = 0;
+  foreach(QAction* aAct, aActions)
+  {
+    if (aAct->text() == aTitle) {
+      aDelAct = aAct;
+      break;
+    }
+  }
+  aMDIWidget->removeAction(aDelAct);
+}
 
-        aItem = new QTreeWidgetItem(aItems[i]);
-        aItem->setText(0, "Features");
-        aItem->setIcon(0, QIcon(":pictures/features.png"));
+void XGUI_MainWindow::activateView()
+{
+  QAction* aAction = static_cast<QAction*>(sender());
+  QString aWndTitle = aAction->text();
+  QMdiArea* aMdiArea = static_cast<QMdiArea*>(centralWidget());
+
+  QList<QMdiSubWindow*> aWndList = aMdiArea->subWindowList();
+  QMdiSubWindow* aTargetView = 0;
+  foreach(QMdiSubWindow* aWnd, aWndList)
+  {
+    if (aWnd->windowTitle() == aWndTitle) {
+      aWnd->raise();
+      aWnd->activateWindow();
+      aTargetView = aWnd;
+      break;
     }
+  }
+  QApplication::processEvents();
+  if (aTargetView)
+    QTimer::singleShot(20, aTargetView, SLOT(setFocus()));
+}
+
+void XGUI_MainWindow::onViewActivated(QMdiSubWindow* theSubWnd)
+{
+  if (!theSubWnd)
+    return;
+  QMdiArea* aMdiArea = static_cast<QMdiArea*>(centralWidget());
+  QString aWndTitle = theSubWnd->windowTitle();
+  QList<QAction*> aActionList = aMdiArea->actions();
+  foreach(QAction* aAct, aActionList)
+  {
+    if (aAct->isCheckable())
+      aAct->setChecked(aAct->text() == aWndTitle);
+  }
+}
+
+void XGUI_MainWindow::closeEvent(QCloseEvent * event)
+{
+  emit exitKeySequence();
+  event->ignore();
+}
+
+void XGUI_MainWindow::createMainMenu()
+{
+  myMenuBar = new XGUI_MainMenu(this);
+  QDockWidget* aMenuDock = new QDockWidget(this);
+  aMenuDock->setWidget(myMenuBar);
+  aMenuDock->setAllowedAreas(Qt::TopDockWidgetArea);
+  aMenuDock->setFeatures(QDockWidget::DockWidgetVerticalTitleBar);
+  aMenuDock->setWindowTitle(tr("General"));
+  addDockWidget(Qt::TopDockWidgetArea, aMenuDock);
+}
+
+
+void XGUI_MainWindow::updateTitle()
+{
+  QString aTitle = myTitle;
+  if (!myCurrentDir.isNull())
+    aTitle += " - " + myCurrentDir;
+  if (myIsModified)
+    aTitle += "*";
+  setWindowTitle(aTitle);
 }
 
+void XGUI_MainWindow::setCurrentDir(const QString& theDir, bool toUpdate)
+{
+  myCurrentDir = theDir;
+  if (toUpdate)
+    updateTitle();
+}
+
+void XGUI_MainWindow::setModifiedState(bool isModified, bool toUpdate)
+{
+  myIsModified = isModified;
+  if (toUpdate)
+    updateTitle();
+}
+
+CloseEventWatcher::CloseEventWatcher(QObject* theParent)
+    : QObject(theParent)
+{
+}
+
+bool CloseEventWatcher::eventFilter(QObject *obj, QEvent *event)
+{
+  if (event->type() == QEvent::Close) {
+    emit widgetClosed();
+    event->ignore();
+    return true;
+  } else {
+    // standard event processing
+    return QObject::eventFilter(obj, event);
+  }
+}
 
-void XGUI_MainWindow::addPropertyPanel()
-{
-    QDockWidget* aPropPanel = new QDockWidget(this);
-    aPropPanel->setWindowTitle("Point");
-
-    QWidget* aContent = new QWidget(aPropPanel);
-    QVBoxLayout* aMainLay = new QVBoxLayout(aContent);
-    aMainLay->setContentsMargins(3,3,3,3);
-    aPropPanel->setWidget(aContent);
-
-    /*QWidget* aNameWgt = new QWidget(aContent);
-    QHBoxLayout* aNameLay = new QHBoxLayout(aNameWgt);
-    aNameLay->setContentsMargins(0,0,0,0);
-    aMainLay->addWidget(aNameWgt);
-
-    aNameLay->addWidget(new QLabel("Name", aNameWgt));
-    aNameLay->addWidget(new QLineEdit(aNameWgt));*/
-
-    QComboBox* aCombo = new QComboBox(aContent);
-    aCombo->addItem("By coordinates");
-    aMainLay->addWidget(aCombo);
-
-    QWidget* aGrpBox1 = new QWidget(aContent);
-    //aGrpBox1->setFlat(true);
-    QFormLayout* aFrmLay = new QFormLayout(aGrpBox1);
-    aFrmLay->setContentsMargins(0, 6, 0, 0);
-    aMainLay->addWidget(aGrpBox1);
-
-
-    QLabel* aLbl = new QLabel(aGrpBox1);
-    aLbl->setPixmap(QPixmap(":pictures/x_point.png"));
-    aFrmLay->addRow(aLbl, new QDoubleSpinBox(aGrpBox1));
-
-    aLbl = new QLabel(aGrpBox1);
-    aLbl->setPixmap(QPixmap(":pictures/y_point.png"));
-    aFrmLay->addRow(aLbl, new QDoubleSpinBox(aGrpBox1));
-
-    aLbl = new QLabel(aGrpBox1);
-    aLbl->setPixmap(QPixmap(":pictures/z_point.png"));
-    aFrmLay->addRow(aLbl, new QDoubleSpinBox(aGrpBox1));
-    
-
-/*    aGrpBox1 = new QGroupBox("Normal vector", aContent);
-    aGrpBox1->setFlat(true);
-    aFrmLay = new QFormLayout(aGrpBox1);
-    aFrmLay->setContentsMargins(0, 6, 0, 0);
-    aMainLay->addWidget(aGrpBox1);
-
-    aLbl = new QLabel(aGrpBox1);
-    aLbl->setPixmap(QPixmap(":pictures/x_size.png"));
-    aFrmLay->addRow(aLbl, new QDoubleSpinBox(aGrpBox1));
-
-    aLbl = new QLabel(aGrpBox1);
-    aLbl->setPixmap(QPixmap(":pictures/y_size.png"));
-    aFrmLay->addRow(aLbl, new QDoubleSpinBox(aGrpBox1));
-
-    aLbl = new QLabel(aGrpBox1);
-    aLbl->setPixmap(QPixmap(":pictures/z_size.png"));
-    aFrmLay->addRow(aLbl, new QDoubleSpinBox(aGrpBox1));*/
-    
-    aMainLay->addStretch(1);
-
-    QFrame* aFrm = new QFrame(aContent);
-    aFrm->setFrameStyle(QFrame::Sunken);
-    aFrm->setFrameShape(QFrame::Panel);
-    QHBoxLayout* aBtnLay = new QHBoxLayout(aFrm);
-    aBtnLay->setContentsMargins(0, 0, 0, 0);
-    aMainLay->addWidget(aFrm);
-
-    QPushButton* aBtn = new QPushButton(QIcon(":pictures/button_help.png"), "", aFrm);
-    aBtn->setFlat(true);
-    aBtnLay->addWidget(aBtn);
-    aBtnLay->addStretch(1);
-    aBtn = new QPushButton(QIcon(":pictures/button_ok.png"), "", aFrm);
-    aBtn->setFlat(true);
-    aBtnLay->addWidget(aBtn);
-    aBtn = new QPushButton(QIcon(":pictures/button_cancel.png"), "", aFrm);
-    aBtn->setFlat(true);
-    aBtnLay->addWidget(aBtn);
-
-    addDockWidget(Qt::RightDockWidgetArea, aPropPanel);
-}
\ No newline at end of file